@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 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 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; }
@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 !target.hasStatus(Stsflag.knotted) && getSelf().canAct() && (c.getStance().en == Stance.facesitting || (c.getStance().inserted() && c.getStance().dom(getSelf()))); }
@Override public String getLabel(Combat c) { if (c.getStance().anallyPenetrated(c, c.getOpponent(getSelf()))) { return "Tail F**k"; } else { return "Tail Peg"; } }
@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 !c.getStance().prone(getSelf()) && c.getStance().prone(target) && c.getStance().feet(getSelf()) && getSelf().canAct() && !getSelf().has(Trait.softheart) && !c.getStance().inserted(target); }
@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); }
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 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)); } c.setStance(new Mount(getSelf(), target)); return true; }
@Override public boolean resolve(Combat c, Character target) { if (getSelf().human()) { c.write(getSelf(), deal(c, 0, Result.setup, target)); } else { c.write(getSelf(), receive(c, 0, Result.setup, target)); } getSelf().add(c, new CounterStatus(getSelf(), this, description, duration)); return true; }
@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)); } getSelf().weaken(c, 20 + getSelf().get(Attribute.Dark)); getSelf().calm(c, getSelf().getArousal().max() / 3 + 20 + getSelf().get(Attribute.Dark)); 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 (getSelf().human()) { c.write(getSelf(), deal(c, 0, Result.normal, target)); } else if (target.human()) { c.write(getSelf(), receive(c, 0, Result.normal, getSelf())); } getSelf().heal(c, Math.max(20, getSelf().getStamina().max() / 2)); getSelf().buildMojo(c, 20 + Global.random(10)); getSelf().consume(Item.EnergyDrink, 1); return true; }
@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 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 getLabel(Combat c) { if (isActive(c.getOther(getSelf()))) { return "Deflate Knot"; } return "Inflate Knot"; }
@Override public boolean usable(Combat c, Character target) { return target.mostlyNude() && !c.getStance().sub(getSelf()) && getSelf().canAct() && !getSelf().has(Trait.shy); }
@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 String describe(Combat c) { if (!affected.human()) { return String.format( "%s inhumanly beautiful.", c.getOpponent(affected).subjectAction("look", "looks")); } return ""; }
@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 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 protected void resolveOrgasm( Combat c, Character opponent, BodyPart selfPart, BodyPart opponentPart, int times, int totalTimes) { super.resolveOrgasm(c, opponent, selfPart, opponentPart, times, totalTimes); c.write( this, Global.format( "The force of {self:name-possessive} o****m destroys {self:possessive} anchor to the fight and {self:pronoun} disappears.", this, opponent)); c.removePet(this); }
@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 resolve(Combat c, Character target) { if (getSelf().human()) { c.write(getSelf(), deal(c, 0, Result.normal, target)); } else if (c.shouldPrintReceive(target)) { if (target.human() && target.is(Stsflag.blinded)) printBlinded(c); else c.write(getSelf(), receive(c, 0, Result.normal, target)); } if (!target.is(Stsflag.blinded)) { int m = 15 + Global.random(5); target.tempt(c, getSelf(), m); getSelf().add(c, new Alluring(getSelf(), 5)); } target.emote(Emotion.horny, 30); getSelf().undress(c); getSelf().emote(Emotion.confident, 15); getSelf().emote(Emotion.dominant, 15); return true; }
@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 boolean resolve(Combat c, Character target) { if (target.roll(this, c, accuracy(c))) { if (getSelf().has(Item.Dildo2)) { if (getSelf().human()) { c.write(getSelf(), deal(c, 0, Result.upgrade, target)); } else if (target.human()) { c.write(getSelf(), receive(c, 0, Result.upgrade, target)); } int m = 5 + Global.random(15) + target.get(Attribute.Perception); target.body.pleasure(getSelf(), null, target.body.getRandom("pussy"), m, c); } else { 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)); } int m = Global.random(10) + target.get(Attribute.Perception); target.body.pleasure(getSelf(), null, target.body.getRandom("pussy"), m, c); } } else { if (getSelf().human()) { c.write(getSelf(), deal(c, 0, Result.miss, target)); } else if (target.human()) { c.write(getSelf(), receive(c, 0, Result.miss, target)); } return false; } return true; }
@Override public boolean resolve(Combat c, Character target) { if (target.roll(this, c, accuracy(c))) { if (getSelf().get(Attribute.Dark) >= 1) { if (getSelf().human()) { c.write(getSelf(), deal(c, 0, Result.special, target)); } else if (target.human()) { c.write(getSelf(), receive(c, 0, Result.special, target)); } int m = 10 + Math.min(20, getSelf().get(Attribute.Dark) / 2); target.drain(c, getSelf(), m); } else { 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)); } } int m = 1 + Global.random(8); target.body.pleasure( getSelf(), getSelf().body.getRandom("mouth"), target.body.getRandom("skin"), m, c); } else { if (getSelf().human()) { c.write(getSelf(), deal(c, 0, Result.miss, target)); } else if (target.human()) { c.write(getSelf(), receive(c, 0, Result.miss, target)); } return false; } return true; }
@Override public Position reverse(Combat c, boolean writeMessage) { if (writeMessage) { c.write( bottom, Global.format( "{self:SUBJECT-ACTION:pinch|pinches} {other:possessive} clitoris with {self:possessive} hands as {other:subject-action:try|tries} to ride {self:direct-object}. " + "While {other:subject-action:yelp|yelps} with surprise, {self:subject-action:take|takes} the chance to swing around into a dominant missionary position.", bottom, top)); } return new Missionary(bottom, top); }