@Override public boolean usable(Combat c, Character target) { return !target.hasStatus(Stsflag.knotted) && getSelf().canAct() && (c.getStance().en == Stance.facesitting || (c.getStance().inserted() && c.getStance().dom(getSelf()))); }
@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) { int m = 10 + Global.random(8); boolean facesitting = c.getStance().enumerate() == Stance.facesitting; if (getSelf().has(Trait.silvertongue)) { m += 4; } if (isVaginal(c)) { m += 4; if (target.human()) { c.write(getSelf(), receive(c, m, Result.intercourse, target)); } else if (getSelf().human()) { c.write(getSelf(), deal(c, m, Result.intercourse, target)); } target.body.pleasure( getSelf(), getSelf().body.getRandom("pussy"), target.body.getRandom("c**k"), m, c); } else if (facesitting) { if (target.human()) { c.write(getSelf(), receive(c, m, Result.reverse, target)); } else if (getSelf().human()) { c.write(getSelf(), deal(c, m, Result.reverse, target)); } target.body.pleasure( getSelf(), getSelf().body.getRandom("mouth"), target.body.getRandom("c**k"), m, c); target.buildMojo(c, 10); } else if (c.getStance().mobile(target) && target.roll(this, c, accuracy(c))) { if (getSelf().has(Trait.silvertongue)) { if (target.human()) { c.write(getSelf(), receive(c, m, Result.special, target)); } else if (getSelf().human()) { c.write(getSelf(), deal(c, m, Result.special, target)); } } else { if (target.human()) { c.write(getSelf(), receive(c, m, Result.normal, target)); } else if (getSelf().human()) { c.write(getSelf(), deal(c, m, Result.normal, target)); } } BodyPart mouth = getSelf().body.getRandom("mouth"); BodyPart c**k = target.body.getRandom("c**k"); target.body.pleasure(getSelf(), mouth, c**k, m, c); if (mouth.isErogenous()) { getSelf().body.pleasure(getSelf(), c**k, mouth, m, c); } if (ReverseMount.class.isInstance(c.getStance())) { c.setStance(new SixNine(getSelf(), target)); } } else { if (getSelf().human()) { c.write(deal(c, 0, Result.miss, target)); } else if (target.human()) { c.write(receive(c, 0, Result.miss, target)); } return false; } return true; }
@Override public boolean usable(Combat c, Character target) { return c.getStance().mobile(getSelf()) && c.getStance().mobile(target) && c.getStance().prone(target) && getSelf().canAct(); }
@Override public boolean usable(Combat c, Character target) { return (getSelf().has(Item.D***o) || getSelf().has(Item.Dildo2)) && getSelf().canAct() && target.hasPussy() && c.getStance().reachBottom(getSelf()) && target.crotchAvailable() && !c.getStance().vaginallyPenetrated(target); }
@Override public boolean usable(Combat c, Character target) { return !c.getStance().prone(getSelf()) && c.getStance().prone(target) && c.getStance().feet(getSelf()) && getSelf().canAct() && !getSelf().has(Trait.softheart) && !c.getStance().inserted(target); }
public static boolean isUsable(Combat c, Character self, Character target) { return self.stripDifficulty(target) == 0 && !self.has(Trait.strapped) && self.canAct() && c.getStance().mobile(self) && !self.mostlyNude() && !c.getStance().prone(self) && c.getStance().front(self) && (!self.breastsAvailable() || !self.crotchAvailable()); }
@Override public boolean usable(Combat c, Character target) { boolean canUse = (c.getStance().enumerate() == Stance.facesitting && getSelf().canRespond()) || getSelf().canAct(); return (target.crotchAvailable() && target.hasDick() && c.getStance().oral(getSelf()) && c.getStance().front(getSelf()) && canUse && !c.getStance().inserted(target)) || (getSelf().canRespond() && isVaginal(c)); }
@Override public Combat clone() throws CloneNotSupportedException { Combat c = (Combat) super.clone(); c.p1 = p1.clone(); c.p2 = p2.clone(); c.p1.finishClone(c.p2); c.p2.finishClone(c.p1); c.p1Data = (CombatantData) p1Data.clone(); c.p2Data = (CombatantData) p2Data.clone(); c.stance = getStance().clone(); c.state = state; if (c.getStance().top == p1) { c.getStance().top = c.p1; } if (c.getStance().top == p2) { c.getStance().top = c.p2; } if (c.getStance().bottom == p1) { c.getStance().bottom = c.p1; } if (c.getStance().bottom == p2) { c.getStance().bottom = c.p2; } return c; }
@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 getSelf().canRespond() && c.getStance().penetratedBy(c, getSelf(), target) && c.getStance().havingSexNoStrapped(c) && target.hasDick(); }
@Override public boolean usable(Combat c, Character target) { return target.mostlyNude() && !c.getStance().sub(getSelf()) && getSelf().canAct() && !getSelf().has(Trait.shy); }
@Override public String describe(Combat c) { if (c.getStance().anallyPenetrated(c, c.getOpponent(getSelf()))) { return "F**k your opponent with your tail"; } return "Shove your tail up your opponent's ass."; }
@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 String getLabel(Combat c) { if (c.getStance().anallyPenetrated(c, c.getOpponent(getSelf()))) { return "Tail F**k"; } else { return "Tail Peg"; } }
@Override public Tactics type(Combat c) { if (c.getStance().vaginallyPenetrated(getSelf()) && getSelf().has(Trait.vaginaltongue)) { return Tactics.f*****g; } else { return Tactics.pleasure; } }
@Override public boolean usable(Combat c, Character target) { return getSelf().getArousal().get() >= 30 && getSelf().canAct() && target.crotchAvailable() && c.getStance().en != Stance.standing && c.getStance().en != Stance.standingover; }
@Override public int getMojoBuilt(Combat c) { if (isVaginal(c)) { return 10; } else if (c.getStance().enumerate() == Stance.facesitting) { return 0; } else { return 5; } }
@Override public String deal(Combat c, int damage, Result modifier, Character target) { if (c.getStance().en == Stance.anal) { return Global.format( "{self:SUBJECT-ACTION:rhythmically squeeze|rhythmically squeezes} {self:possessive} {self:body-part:ass} around {other:possessive} dick, milking {other:direct-object} for all that {self:pronoun-action:are|is} worth.", getSelf(), target); } else { return Global.format( "{self:SUBJECT-ACTION:give|gives} {other:direct-object} a seductive wink and suddenly {self:possessive} {self:body-part:pussy} squeezes around {other:possessive} {other:body-part:c**k} as though it's trying to milk {other:direct-object}.", getSelf(), target); } }
@Override public float priorityMod(Combat c) { float priority = 0; if (c.getStance().penetratedBy(getSelf(), c.getOther(getSelf()))) { priority += 1.0f; } if (getSelf().has(Trait.silvertongue)) { priority += 1; } if (getSelf().has(Trait.experttongue)) { priority += 1; } return priority; }
@Override public String deal(Combat c, int damage, Result modifier, Character target) { if (modifier == Result.reverse) { return "You rise up and let " + target.nameOrPossessivePronoun() + " girl-c**k slip out of your " + (c.getStance().en == Stance.anal ? "ass." : "pussy"); } else if (modifier == Result.anal) { return "You pull your dick completely out of " + target.name() + "'s ass."; } else if (modifier == Result.normal) { return "You pull completely out of " + target.name() + "'s pussy, causing her to let out a disappointed little whimper."; } else { return "You pull yourself off " + target.name() + "'s face, causing her to gasp lungfuls of the new fresh air offer to her."; } }
@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 boolean resolve(Combat c, Character target) { Result result = Result.normal; if (c.getStance().inserted(getSelf())) { if (c.getStance().en == Stance.anal) result = Result.anal; } else if (c.getStance().inserted(target)) { result = Result.reverse; } else { result = Result.special; } if (c.getStance().en == Stance.anal) { if (getSelf().human()) { c.write(getSelf(), deal(c, 0, result, target)); } else if (target.human()) { c.write(getSelf(), receive(c, 0, result, target)); } c.setStance(c.getStance().insertRandom()); } else if (result == Result.special) { if (getSelf().human()) { c.write(getSelf(), deal(c, 0, result, target)); } else if (target.human()) { c.write(getSelf(), receive(c, 0, result, target)); } c.setStance(new StandingOver(getSelf(), target)); } else { if (getSelf().hasStatus(Stsflag.leglocked) || getSelf().hasStatus(Stsflag.armlocked) || (target.has(Trait.tight) && c.getStance().inserted(getSelf()))) { boolean escaped = getSelf() .check(Attribute.Power, 10 - getSelf().escape(c) + target.get(Attribute.Power)); if (escaped) { if (getSelf().human()) { c.write(getSelf(), deal(c, 0, result, target)); } else if (target.human()) { c.write(getSelf(), receive(c, 0, result, target)); } } else { if (getSelf().hasStatus(Stsflag.leglocked)) { BodyPart part = c.getStance().anallyPenetrated(getSelf()) ? target.body.getRandom("ass") : target.body.getRandomPussy(); String partString = part.describe(target); if (getSelf().human()) c.write( getSelf(), "You try to pull out of " + target.name() + "'s " + partString + ", but her legs immediately tighten against your waist, holding you inside her. The mere friction from her action sends a shiver down your spine."); else c.write( getSelf(), "She tries to pull out of " + target.nameOrPossessivePronoun() + " " + partString + ", but your legs immediately pull her back in, holding you inside her."); } else if (getSelf().hasStatus(Stsflag.armlocked)) { if (getSelf().human()) c.write( getSelf(), "You try to pull yourself off of " + target.name() + ", but she merely pulls you back on top of her, surrounding you in her embrace."); else c.write( getSelf(), "She tries to pull herself off of " + target.name() + ", but with a gentle pull of your hands, she collapses back on top of you."); } else if (target.has(Trait.tight) && c.getStance().inserted(getSelf())) { BodyPart part = c.getStance().anallyPenetrated(target) ? target.body.getRandom("ass") : target.body.getRandomPussy(); String partString = part.describe(target); if (getSelf().human()) c.write( getSelf(), "You try to pull yourself out of " + target.name() + "'s " + partString + ", but she clamps down hard on your c**k while smiling at you. You almost cum from the sensation, and quickly abandon ideas about your escape."); else c.write( getSelf(), "She tries to pull herself out of " + target.nameOrPossessivePronoun() + " " + partString + ", but you clamp down hard on her c**k, and prevent her from pulling out."); } int m = 8; if (c.getStance().inserted(getSelf())) { BodyPart part = c.getStance().anallyPenetrated(target) ? target.body.getRandom("ass") : target.body.getRandomPussy(); String partString = part.describe(target); getSelf().body.pleasure(target, part, getSelf().body.getRandomInsertable(), m, c); } getSelf().struggle(); return false; } } else if (getSelf().hasStatus(Stsflag.cockbound)) { CockBound s = (CockBound) getSelf().getStatus(Stsflag.cockbound); c.write( getSelf(), "You try to pull out of " + target.name() + "'s " + target.body.getRandomPussy() + ", but " + s.binding + " instantly reacts and pulls your dick back in."); int m = 8; getSelf() .body .pleasure( target, target.body.getRandom("pussy"), getSelf().body.getRandom("c**k"), m, c); return false; } else if (getSelf().human()) { c.write(getSelf(), deal(c, 0, result, target)); } else if (target.human()) { c.write(getSelf(), receive(c, 0, result, target)); } c.setStance(c.getStance().insertRandom()); } return true; }
@Override public boolean usable(Combat c, Character target) { return getSelf().canAct() && !c.getStance().sub(getSelf()) && getSelf().getArousal().percent() >= 70; }
@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; }
public boolean isVaginal(Combat c) { return c.getStance().vaginallyPenetratedBy(getSelf(), c.getOther(getSelf())) && !c.getOther(getSelf()).has(Trait.strapped) && getSelf().has(Trait.vaginaltongue); }
@Override public boolean usable(Combat c, Character target) { return getSelf().canAct() && !c.getStance().sub(getSelf()) && !getSelf().is(Stsflag.form); }
@Override public boolean usable(Combat c, Character target) { return c.getStance().reachTop(getSelf()) && target.hasBreasts() && getSelf().canAct(); }
@Override public int accuracy(Combat c) { return c.getStance().en == Stance.neutral ? 70 : 100; }
public int accuracy(Combat c, Character target) { return (c.getStance().havingSex(c) ? 100 : 60); }