@Override public boolean requirements(Combat c, Character user, Character target) { Collection<BodyPart> tails = user.body.get("tail"); boolean hasFuckableTail = tails.stream().anyMatch(p -> p.isType("tail") && p != TailPart.cat); return hasFuckableTail && (user.get(Attribute.Dark) >= 1 || user.get(Attribute.Seduction) >= 20); }
@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; }
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; }
public void turn() { if (p1.checkLoss() && p2.checkLoss()) { state = eval(); p1.evalChallenges(this, null); p2.evalChallenges(this, null); p2.draw(this, state); phase = 2; updateMessage(); winner = Optional.of(Global.noneCharacter()); if (!(p1.human() || p2.human())) { end(); } return; } if (p1.checkLoss()) { state = eval(); p1.evalChallenges(this, p2); p2.evalChallenges(this, p2); p2.victory(this, state); doVictory(p2, p1); winner = Optional.of(p2); phase = 2; updateMessage(); if (!(p1.human() || p2.human())) { end(); } return; } if (p2.checkLoss()) { state = eval(); p1.evalChallenges(this, p1); p2.evalChallenges(this, p1); p1.victory(this, state); doVictory(p1, p2); winner = Optional.of(p1); phase = 2; updateMessage(); if (!(p1.human() || p2.human())) { end(); } return; } if (!p1.human() && !p2.human() && timer > 15) { if (p1.getArousal().get() > p2.getArousal().get()) { state = eval(); if (Global.isDebugOn(DebugFlags.DEBUG_SCENE)) { System.out.println(p2.name() + " victory over " + p1.name()); } p2.victory(this, state); doVictory(p2, p1); phase = 2; updateMessage(); if (!(p1.human() || p2.human())) { end(); } return; } else if (p1.getArousal().get() < p2.getArousal().get()) { state = eval(); if (Global.isDebugOn(DebugFlags.DEBUG_SCENE)) { System.out.println(p1.name() + " victory over " + p2.name()); } p1.victory(this, state); doVictory(p1, p2); phase = 2; updateMessage(); if (!(p2.human() || p1.human())) { end(); } return; } else { state = eval(); if (Global.isDebugOn(DebugFlags.DEBUG_SCENE)) { System.out.println(p2.name() + " draw with " + p1.name()); } p2.draw(this, state); phase = 2; updateMessage(); if (!(p1.human() || p2.human())) { end(); } return; } } Character player; Character other; if (p1.human()) { player = p1; other = p2; } else { player = p2; other = p1; } phase = 1; p1.regen(this); p2.regen(this); message = other.describe(player.get(Attribute.Perception), this) + "<p>" + Global.capitalizeFirstLetter(getStance().describe()) + "<p>" + player.describe(other.get(Attribute.Perception), this) + "<p>"; if ((p1.human() || p2.human()) && !Global.checkFlag(Flag.noimage)) { Global.gui().clearImage(); Global.gui().displayImage(imagePath, images.get(imagePath)); } p1act = null; p2act = null; p1.act(this); if (Global.random(3) == 0 && (p1.human() || p2.human())) { NPC commenter = (NPC) getOther(Global.getPlayer()); Optional<String> comment = commenter.getComment(this); if (comment.isPresent()) { write( commenter, "<i>\"" + Global.format(comment.get(), commenter, Global.getPlayer()) + "\"</i>"); } } updateAndClearMessage(); }
@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 requirements(Combat c, Character user, Character target) { return user.get(Attribute.Ki) >= 12; }
@Override public boolean requirements(Combat c, Character user, Character target) { return user.get(Attribute.Seduction) >= 10 && !user.has(Trait.temptress); }
public static Position similarInstance(Character top, Character bottom) { if (top.get(Attribute.Power) > 25 && Global.random(2) == 0) { return new UpsideDownFemdom(top, bottom); } return new Cowgirl(top, bottom); }
@Override public boolean requirements(Combat c, Character user, Character target) { return user.get(Attribute.Power) >= 16 && !user.has(Trait.softheart); }
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 boolean requirements(Combat c, Character user, Character target) { return user.get(Attribute.Seduction) >= 8; }
@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; }