@Override public double priority(Character c) { return (c.has(Trait.tight) ? 1 : 0) + (c.has(Trait.holecontrol) ? 1 : 0) + (c.has(Trait.oiledass) ? 1 : 0) + (c.has(Trait.autonomousAss) ? 4 : 0); }
@Override public double getPleasure(Character self, BodyPart target) { double pleasureMod = super.getPleasure(self, target); pleasureMod += self.has(Trait.analTraining1) ? .5 : 0; pleasureMod += self.has(Trait.analTraining2) ? .7 : 0; pleasureMod += self.has(Trait.analTraining3) ? .7 : 0; return pleasureMod; }
public int dc(Character attacker) { if (attacker != null && attacker.has(Trait.bramaster) && layer == 0 && slots.contains(ClothingSlot.top)) { return dc / 2; } if (attacker != null && attacker.has(Trait.pantymaster) && layer == 0 && slots.contains(ClothingSlot.bottom)) { return dc / 2; } return dc; }
@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 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; }
public void intervene(Character intruder, Character assist) { Character target; if (p1 == assist) { target = p2; } else { target = p1; } if (target.resist3p(this, intruder, assist)) { target.gainXP(20 + target.lvlBonus(intruder)); intruder.gainXP(10 + intruder.lvlBonus(target)); intruder.getArousal().empty(); if (intruder.has(Trait.insatiable)) { intruder.getArousal().restore((int) (intruder.getArousal().max() * 0.2D)); } target.undress(this); intruder.defeated(target); intruder.defeated(assist); } else { intruder.intervene3p(this, target, assist); assist.victory3p(this, target, intruder); phase = 2; if (!(p1.human() || p2.human() || intruder.human())) { end(); } else if (intruder.human()) { Global.gui().watchCombat(this); } } updateMessage(); }
@Override public String getFluids(Character c) { if (c.has(Trait.oiledass)) { return "oils"; } else { return ""; } }
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 double applyReceiveBonuses( Character self, Character opponent, BodyPart target, double damage, Combat c) { double bonus = 0; if (opponent.has(Trait.asshandler) || opponent.has(Trait.anatomyknowledge)) { c.write( opponent, Global.format( "{other:NAME-POSSESSIVE} expert handling of {self:name-possessive} ass causes {self:subject} to shudder uncontrollably.", self, opponent)); if (opponent.has(Trait.asshandler)) { bonus += 5; } if (opponent.has(Trait.anatomyknowledge)) { bonus += 5; } } return bonus; }
@Override public void tickHolding(Combat c, Character self, Character opponent, BodyPart otherOrgan) { if (self.has(Trait.autonomousAss)) { c.write( self, Global.format( "{self:NAME-POSSESSIVE} " + fullDescribe(self) + " churns against {other:name-possessive} c**k, " + "seemingly with a mind of its own. {self:POSSESSIVE} internal muscles feel like a hot fleshy hand inside her asshole, jerking {other:possessive} shaft.", self, opponent)); opponent.body.pleasure(self, this, otherOrgan, 10, c); } }
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 boolean resolve(Combat c, Character target) { if (target.has(Trait.brassballs)) { if (getSelf().has(Trait.heeldrop) && target.crotchAvailable() && target.hasBalls()) { if (getSelf().human()) { c.write(getSelf(), deal(c, 0, Result.strong, target)); } else if (target.human()) { c.write(getSelf(), receive(c, 0, Result.strong, target)); if (Global.random(5) >= 1) { c.write(getSelf(), getSelf().bbLiner(c)); } } target.pain( c, 15 - (int) Math.round( (5 + Global.random(5)) * target.getOutfit().getExposure(ClothingSlot.bottom))); } else { if (getSelf().human()) { c.write(getSelf(), deal(c, 0, Result.weak2, target)); } else if (target.human()) { c.write(getSelf(), receive(c, 0, Result.weak2, target)); } } } else if (getSelf().has(Trait.heeldrop) && target.crotchAvailable()) { 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)); if (Global.random(5) >= 1) { c.write(getSelf(), getSelf().bbLiner(c)); } } if (target.has(Trait.achilles)) { target.pain(c, 20); } target.pain( c, 30 - (int) Math.round( (10 + Global.random(10)) * target.getOutfit().getExposure(ClothingSlot.bottom))); } else if (target.has(ClothingTrait.armored)) { if (getSelf().human()) { c.write(getSelf(), deal(c, 0, Result.weak, target)); } else if (target.human()) { c.write(getSelf(), receive(c, 0, Result.weak, target)); } target.pain( c, 5 - (int) Math.round( (2 + Global.random(3)) * target.getOutfit().getExposure(ClothingSlot.bottom))); } 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)); if (Global.random(5) >= 1) { c.write(getSelf(), getSelf().bbLiner(c)); } } if (target.has(Trait.achilles)) { target.pain(c, 20); } target.pain( c, 20 - (int) Math.round( (10 + Global.random(10)) * target.getOutfit().getExposure(ClothingSlot.bottom))); } target.emote(Emotion.angry, 25); return true; }
private boolean checkCounter(Character attacker, Character target, Skill skill) { return !target.has(Trait.submissive) && getStance().mobile(target) && target.counterChance(this, attacker, skill) > Global.random(100); }
public void doVictory(Character victor, Character loser) { if (loser.hasDick() && victor.has(Trait.succubus)) { victor.gain(Item.s***n, 3); if (loser.human()) { write( victor, "<br><b>As she leaves, you see all your scattered s***n ooze out and gather into a orb in " + victor.nameOrPossessivePronoun() + " hands. " + "She casually drops your seed in some empty vials that appeared out of nowhere</b>"); } else if (victor.human()) { write( victor, "<br><b>" + loser.nameOrPossessivePronoun() + " scattered s***n lazily oozes into a few magically conjured flasks. " + "To speed up the process, you milk " + loser.possessivePronoun() + " out of the last drops " + loser.subject() + " had to offer. Yum, you just got some leftovers.</b>"); } } else if (loser.hasDick() && (victor.human() || victor.has(Trait.madscientist)) && victor.has(Item.EmptyBottle, 1)) { // for now only the player and mara collects s***n write( victor, Global.format( "<br><b>{self:SUBJECT-ACTION:manage|manages} to collect some of {other:name-possessive} scattered s***n in an empty bottle</b>", victor, loser)); victor.consume(Item.EmptyBottle, 1, false); victor.gain(Item.s***n, 1); } if (checkBottleCollection(victor, loser, PussyPart.divine)) { write( victor, Global.format( "<br><b>{other:SUBJECT-ACTION:shoot|shoots} {self:name-do} a dirty look as {self:subject-action:move|moves} to collect some of {other:name-possessive} divine pussy juices in an empty bottle</b>", victor, loser)); victor.consume(Item.EmptyBottle, 1, false); victor.gain(Item.HolyWater, 1); } if (checkBottleCollection(victor, loser, PussyPart.succubus)) { write( victor, Global.format( "<br><b>{other:SUBJECT-ACTION:shoot|shoots} {self:name-do} a dirty look as {self:subject-action:move|moves} to collect some of {other:name-possessive} demonic pussy juices in an empty bottle</b>", victor, loser)); victor.consume(Item.EmptyBottle, 1, false); victor.gain(Item.ExtremeAphrodisiac, 1); } if (checkBottleCollection(victor, loser, PussyPart.plant)) { write( victor, Global.format( "<br><b>{other:SUBJECT-ACTION:shoot|shoots} {self:name-do} a dirty look as {self:subject-action:move|moves} to collect some of {other:possessive} nectar in an empty bottle</b>", victor, loser)); victor.consume(Item.EmptyBottle, 1, false); victor.gain(Item.nectar, 3); } if (checkBottleCollection(victor, loser, PussyPart.cybernetic)) { write( victor, Global.format( "<br><b>{other:SUBJECT-ACTION:shoot|shoots} {self:name-do} a dirty look as {self:subject-action:move|moves} to collect some of {other:possessive} artificial lubricant in an empty bottle</b>", victor, loser)); victor.consume(Item.EmptyBottle, 1, false); victor.gain(Item.LubricatingOils, 1); } if (checkBottleCollection(victor, loser, PussyPart.arcane)) { write( victor, Global.format( "<br><b>{other:SUBJECT-ACTION:shoot|shoots} {self:name-do} a dirty look as {self:subject-action:move|moves} to collect some of the floating mana wisps ejected from {other:possessive} o****m in an empty bottle</b>", victor, loser)); victor.consume(Item.EmptyBottle, 1, false); victor.gain(Item.RawAether, 1); } if (checkBottleCollection(victor, loser, PussyPart.feral)) { write( victor, Global.format( "<br><b>{other:SUBJECT-ACTION:shoot|shoots} {self:name-do} a dirty look as {self:subject-action:move|moves} to collect some of {other:possessive} musky juices in an empty bottle</b>", victor, loser)); victor.consume(Item.EmptyBottle, 1, false); victor.gain(Item.FeralMusk, 1); } if (checkBottleCollection(victor, loser, PussyPart.gooey)) { write( victor, Global.format( "<br><b>{other:SUBJECT-ACTION:shoot|shoots} {self:name-do} a dirty look as {self:subject-action:move|moves} to collect some of {other:possessive} goo in an empty bottle</b>", victor, loser)); victor.consume(Item.EmptyBottle, 1, false); victor.gain(Item.BioGel, 1); } if (loser.human()) { write("<br>Ashamed at your loss, you resolve to win next time."); write("<br><b>Gained 1 Willpower</b>."); loser.getWillpower().gain(1); } victor.getWillpower().fill(); loser.getWillpower().fill(); if (Global.checkFlag(Flag.FTC) && loser.has(Item.Flag)) { write( victor, Global.format( "<br><b>{self:SUBJECT-ACTION:take|takes} the " + "Flag from {other:subject}!</b>", victor, loser)); loser.remove(Item.Flag); victor.gain(Item.Flag); } }
private boolean checkBottleCollection(Character victor, Character loser, PussyPart mod) { return victor.has(Item.EmptyBottle, 1) && loser.body.get("pussy").stream().anyMatch(part -> part.getMod() == mod); }
@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 requirements(Combat c, Character user, Character target) { return user.get(Attribute.Seduction) >= 26 || user.has(Trait.tight); }
@Override public boolean isReady(Character c) { return c.has(Trait.oiledass) || c.is(Stsflag.oiled); }
@Override public void pickup(Character owner) { if (!owner.has(this)) { owner.gain(this); } }
public static boolean hasRequirements(Character user) { return user.get(Attribute.Seduction) >= 24 && !user.has(Trait.direct) && !user.has(Trait.shy) && !user.has(Trait.temptress); }
@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; }
@Override public boolean requirements(Combat c, Character user, Character target) { return user.get(Attribute.Power) >= 16 && !user.has(Trait.softheart); }
@Override public boolean requirements(Combat c, Character user, Character target) { return user.get(Attribute.Seduction) >= 10 && !user.has(Trait.temptress); }