@Override public boolean resolve(Combat c, Character target) { if (getSelf().human()) { c.write(getSelf(), deal(c, 0, Result.normal, target)); } else if (target.human()) { c.write(getSelf(), receive(c, 0, Result.normal, target)); } double m = (6 + Global.random(4) + getSelf().body.getHotness(getSelf(), target)) * Math.min(2, 1 + getSelf().getExposure()); if (target.has(Trait.imagination)) { m += 4; target.tempt(c, getSelf(), (int) Math.round(m)); if (Global.random(4) >= 1) { target.add(c, new Shamed(target)); } } else { target.tempt(c, getSelf(), (int) Math.round(m)); if (Global.random(4) >= 2) { target.add(c, new Shamed(target)); } } target.emote(Emotion.angry, 30); target.emote(Emotion.nervous, 15); getSelf().emote(Emotion.dominant, 20); target.loseMojo(c, 5); return true; }
public void checkStanceStatus(Character c, Position oldStance, Position newStance) { if ((oldStance.prone(c) || !oldStance.mobile(c)) && !newStance.prone(c) && newStance.mobile(c)) { c.add(this, new Braced(c)); c.add(this, new Wary(c, 3)); } else if (!oldStance.mobile(c) && newStance.mobile(c)) { c.add(this, new Wary(c, 3)); } }
public void checkStamina(Character p) { if (p.getStamina().isEmpty() && !p.is(Stsflag.stunned)) { p.add(this, new Winded(p)); if (!getStance().prone(p)) { Character other; if (p == p1) { other = p2; } else { other = p1; } if (getStance().inserted() && getStance().dom(other)) { if (p.human()) { write("Your legs give out, but " + other.name() + " holds you up."); } else { write( p.name() + " slumps in your arms, but you support her to keep her from collapsing."); } } else { setStance(new StandingOver(other, p)); if (p.human()) { write("You don't have the strength to stay on your feet. You slump to the floor."); } else { write(p.name() + " drops to the floor, exhausted."); } } p.loseWillpower(this, Math.min(p.getWillpower().max() / 8, 15), true); } } }
@Override public boolean resolve(Combat c, Character target) { BodyPart selfO = getSelfOrgan(c); BodyPart targetO = getTargetOrgan(c, target); Result result; if (c.getStance().inserted(target)) { result = Result.reverse; } else if (c.getStance().en == Stance.anal) { result = Result.anal; } else { result = Result.normal; } writeOutput(c, result, target); int[] m = getDamage(c, target); assert (m.length >= 2); if (m[0] != 0) target.body.pleasure(getSelf(), selfO, targetO, m[0], c, this); if (m[1] != 0) getSelf().body.pleasure(target, targetO, selfO, m[1], 0, c, false, this); if (selfO.isType("ass") && Global.random(100) < 2 + getSelf().get(Attribute.Fetish)) { target.add(c, new BodyFetish(target, getSelf(), "ass", .25)); } return true; }
@Override public boolean resolve(Combat c, Character target) { double m = Global.random(6, 13); if (getSelf().has(Trait.disciplinarian)) { boolean shamed = Global.random(10) >= 5 || !target.is(Stsflag.shamed) && getSelf().canSpend(5); if (shamed) { getSelf().spendMojo(c, 5); } writeOutput(c, Result.special, target); if (shamed) { target.add(c, new Shamed(target)); target.emote(Emotion.angry, 10); target.emote(Emotion.nervous, 15); } if (target.has(Trait.achilles)) { m += 10; } else { m += 5; } } else { writeOutput(c, Result.normal, target); } target.pain(c, (int) getSelf().modifyDamage(DamageType.physical, target, m)); target.emote(Emotion.angry, 25); target.emote(Emotion.nervous, 15); target.loseMojo(c, 10); return true; }
@Override public void add(Combat c, Status status) { super.add(c, status); if (stunned()) { c.write( this, Global.format( "With {self:name-possessive} link to the fight weakened, {self:subject-action:disappears|disappears}..", this, this)); c.removePet(this); } }
@Override public boolean resolve(Combat c, Character target) { if (target.roll(getSelf(), c, accuracy(c, target))) { int strength = Math.min(20, 10 + getSelf().get(Attribute.Dark) / 4); boolean vaginal = c.getStance().anallyPenetrated(c, c.getOpponent(getSelf())); boolean shamed = false; if (!vaginal && Global.random(4) == 2) { target.add(c, new Shamed(target)); shamed = true; } if (target.human()) { if (vaginal) { c.write(getSelf(), receive(c, 0, Result.intercourse, target)); } else if (c.getStance().inserted(target)) { c.write(getSelf(), receive(c, 0, Result.special, target)); } else if (c.getStance().dom(target)) { c.write(getSelf(), receive(c, 0, Result.critical, target)); } else if (c.getStance().behind(getSelf())) { c.write(getSelf(), receive(c, 0, Result.strong, target)); } else { c.write(getSelf(), receive(c, 0, Result.normal, target)); } if (shamed) { c.write( getSelf(), "The shame of having your ass violated by " + getSelf().name() + " has destroyed your confidence."); } } else if (getSelf().human()) { if (vaginal) { c.write(getSelf(), deal(c, 0, Result.intercourse, target)); } if (c.getStance().inserted(target)) { c.write(getSelf(), deal(c, 0, Result.special, target)); } else if (c.getStance().dom(target)) { c.write(getSelf(), deal(c, 0, Result.critical, target)); } else if (c.getStance().behind(getSelf())) { c.write(getSelf(), deal(c, 0, Result.strong, target)); } else { c.write(getSelf(), deal(c, 0, Result.normal, target)); } if (shamed) { c.write( getSelf(), "The shame of having her ass violated by you has destroyed " + target.getName() + "'s confidence."); } } if (c.getStance().havingSex(c)) { if (vaginal) { target.body.pleasure( getSelf(), getSelf().body.getRandom("tail"), target.body.getRandom("pussy"), strength, c, this); target.add(c, new TailFucked(target, getSelf(), "pussy")); } else { target.body.pleasure( getSelf(), getSelf().body.getRandom("tail"), target.body.getRandom("ass"), strength, c, this); target.add(c, new TailFucked(target, getSelf(), "ass")); } } target.pain( c, getSelf(), (int) getSelf().modifyDamage(DamageType.physical, target, strength / 2)); target.emote(Emotion.nervous, 10); target.emote(Emotion.desperate, 10); getSelf().emote(Emotion.confident, 15); getSelf().emote(Emotion.dominant, 25); if (Global.random(100) < 5 + 2 * getSelf().get(Attribute.Fetish)) { target.add(c, new BodyFetish(target, getSelf(), "tail", .25)); } } else { if (target.human()) { c.write(getSelf(), receive(c, 0, Result.miss, target)); } else { c.write(getSelf(), deal(c, 0, Result.miss, target)); } return false; } return true; }
@Override public boolean resolve(Combat c, Character target) { if (isActive(target)) { if (getSelf().human()) { c.write( getSelf(), "Deciding she's had enough for now, you let your c**k return to its regular shape, once again permitting movement."); } else if (c.shouldPrintReceive(target)) { String part = c.getStance().insertedPartFor(target).describe(target); c.write( getSelf(), String.format( "%s the intense pressure in %s %s " + "recede as %s allows %s knot to deflate.", target.subjectAction("feel"), target.possessivePronoun(), part, getSelf().subject(), getSelf().possessivePronoun())); } target.removeStatus(Stsflag.knotted); } else { if (getSelf().human()) { c.write( getSelf(), "You'd like to stay inside " + target.name() + " for a bit, so you " + (c.getStance().canthrust(getSelf()) ? "thrust" : "buck up") + " as deep inside of her as you can and send a mental command to the base of your c**k, where your" + " knot soon swells up, locking you inside,"); } else if (c.shouldPrintReceive(target)) { String firstPart; if (c.getStance().dom(getSelf())) { firstPart = String.format( "%s bottoms out inside of %s, and something quickly feels off%s.", getSelf().subject(), target.nameDirectObject(), c.isBeingObserved() ? " to " + target.directObject() : ""); } else { firstPart = String.format( "%s pulls %s all the way onto %s c**k." + "As soon as %s pelvis touches %s, something starts happening.", getSelf().subject(), target.nameDirectObject(), getSelf().possessivePronoun(), getSelf().possessivePronoun(), (target.human() || target.useFemalePronouns()) ? target.possessivePronoun() + "s" : "s"); } c.write( getSelf(), String.format( "%s A ball swells up at the base of %s dick," + " growing to the size of a small apple. %s not" + " getting <i>that</i> out of %s any time soon...", firstPart, getSelf().nameOrPossessivePronoun(), Global.capitalizeFirstLetter(target.subjectAction("are", "is")), target.reflectivePronoun())); } target.add(c, new Knotted(target, getSelf(), c.getStance().anallyPenetrated(target))); } return true; }
@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; }