@Override public boolean resolve(Combat c, Character target) { int difficulty = target.getOutfit().getTopOfSlot(ClothingSlot.top).dc() + target.getLevel() + (target.getStamina().percent() / 5 - target.getArousal().percent()) / 4 - (!target.canAct() || c.getStance().sub(target) ? 20 : 0); if (getSelf().check(Attribute.Cunning, difficulty) || !target.canAct()) { stripped = target.strip(ClothingSlot.top, c); boolean doubled = false; if (getSelf().get(Attribute.Cunning) >= 30 && !target.breastsAvailable() && getSelf().check(Attribute.Cunning, difficulty) || !target.canAct()) { extra = target.strip(ClothingSlot.top, c); doubled = true; writeOutput(c, Result.critical, target); } else { writeOutput(c, Result.normal, target); } if (getSelf().human() && target.mostlyNude()) { c.write(target, target.nakedLiner(c, target)); } target.emote(Emotion.nervous, doubled ? 20 : 10); } else { stripped = target.outfit.getTopOfSlot(ClothingSlot.top); writeOutput(c, Result.miss, target); target.weaken( c, (int) getSelf().modifyDamage(DamageType.physical, target, Global.random(8, 16))); return false; } return true; }
@Override public boolean usable(Combat c, Character target) { return (this.getSelf().canAct()) && (c.getStance().canthrust(getSelf())) && (c.getStance().havingSexNoStrapped()) && getSelf().getLevel() < 100 && getSelf().getLevel() < target.getLevel(); }
@Override public boolean resolve(Combat c, Character target) { int type = Global.centeredrandom(2, getSelf().get(Attribute.Dark) / 20.0f, 2); if (this.getSelf().human()) { c.write(getSelf(), deal(c, type, Result.normal, target)); } else if (target.human()) { c.write(getSelf(), receive(c, type, Result.normal, target)); } switch (type) { case 0: getSelf().arouse(getSelf().getArousal().max(), c); break; case 1: int stolen = stealXP(target); if (stolen > 0) { getSelf().add(c, new Satiated(target, stolen, 0)); if (getSelf().human()) c.write("You have absorbed " + stolen + " XP from " + target.name() + "!\n"); else c.write(getSelf().name() + " has absorbed " + stolen + " XP from you!\n"); } break; case 2: int xpStolen = 95 + (5 * (target.getLevel())); getSelf().add(c, new Satiated(target, xpStolen, 0)); c.write(target.dong()); if (getSelf().human()) c.write( "You have stolen a level from " + target.name() + "'s levels and absorbed it as " + xpStolen + " XP!\n"); else c.write( getSelf().name() + " has stolen a level from you and absorbed it as " + xpStolen + " XP!\n"); getSelf().gainXP(xpStolen); target.tempt(c, getSelf(), target.getArousal().max()); break; default: break; } return type != 0; }
private Skill checkWorship(Character self, Character other, Skill def) { if (other.has(Trait.objectOfWorship) && (other.breastsAvailable() || other.crotchAvailable())) { int chance = Math.min(20, Math.max(5, other.get(Attribute.Divinity) + 10 - self.getLevel())); if (Global.random(100) < chance) { List<Skill> avail = new ArrayList<Skill>(Arrays.asList(worshipSkills)); Collections.shuffle(avail); while (!avail.isEmpty()) { Skill skill = avail.remove(avail.size() - 1).copy(self); if (Skill.skillIsUsable(this, skill, other)) { write( other, Global.format( "<b>{other:NAME-POSSESSIVE} divine aura forces {self:subject} to forget what {self:pronoun} {self:action:were|was} doing and crawl to {other:direct-object} on {self:possessive} knees.</b>", self, other)); return skill; } } } } return def; }
@Override public double applyBonuses( Character self, Character opponent, BodyPart target, double damage, Combat c) { double bonus = 0; if (self.has(Trait.oiledass) && c.getStance().anallyPenetratedBy(c, self, opponent)) { c.write( self, Global.format( "{self:NAME-POSSESSIVE} naturally oiled asshole swallows {other:name-possessive} c**k with ease.", self, opponent)); bonus += 5; } if ((self.has(Trait.tight) || self.has(Trait.holecontrol)) && c.getStance().anallyPenetrated(c, self)) { String desc = ""; if (self.has(Trait.tight)) { desc += "powerful "; } if (self.has(Trait.holecontrol)) { desc += "well-trained "; } c.write( self, Global.format( "{self:SUBJECT-ACTION:use|uses} {self:possessive} " + desc + "sphincter muscles to milk {other:name-possessive} c**k, adding to the pleasure.", self, opponent)); bonus += self.has(Trait.tight) && self.has(Trait.holecontrol) ? 10 : 5; if (self.has(Trait.tight)) { opponent.pain(c, self, Math.min(30, self.get(Attribute.Power))); } } if (self.has(Trait.drainingass) && !opponent.has(Trait.strapped) && c.getStance().anallyPenetratedBy(c, self, opponent)) { if (Global.random(3) == 0) { c.write( self, Global.format( "{self:name-possessive} ass seems to <i>inhale</i>, drawing" + " great gouts of {other:name-possessive} strength from {other:possessive}" + " body.", self, opponent)); opponent.drain(c, self, self.getLevel()); opponent.add(c, new Abuff(opponent, Attribute.Power, -3, 10)); self.add(c, new Abuff(self, Attribute.Power, 3, 10)); } else { c.write( self, Global.format( "The feel of {self:name-possessive} ass around" + " {other:name-possessive} {other:body-part:c**k} drains" + " {other:direct-object} of {other:possessive} energy.", self, opponent)); opponent.drain(c, self, self.getLevel() / 2); } } return bonus; }