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 receive(Combat c, int damage, Result modifier, Character target) { String m = ""; if (modifier == Result.miss) { m += getSelf().name() + " tries to suck your c**k, but you pull your hips back to avoid her."; } else if (modifier == Result.special) { m += getSelf().name() + "'s soft lips and talented tongue work over your dick, drawing out dangerously irresistible pleasure with each touch."; } else if (modifier == Result.intercourse) { m += getSelf().name() + "'s pussy lips suddenly quiver and you feel a long sinuous object wrap around your c**k. You realize she's controlling her vaginal tongue to blow you with her pussy! " + "Her lower tongue runs up and down your shaft causing you to shudder with arousal."; } else if (modifier == Result.reverse) { m += "Faced with your dick sitting squarely in front of her face, " + getSelf().name() + " obediently tongues your c**k in defeat."; } else if (target.getArousal().get() < 15) { m += getSelf().name() + " takes your soft penis into her mouth and sucks on it until it hardens"; } else if (target.getArousal().percent() >= 90) { m += getSelf().name() + " laps up the precum leaking from your c**k and takes the entire length into her mouth, sucking relentlessly"; } else { int r = Global.random(4); if (r == 0) { m += getSelf().name() + " runs her tongue up the length of your dick, sending a jolt of pleasure up your spine. She slowly wraps her lips around your dick and sucks."; } else if (r == 1) { m += getSelf().name() + " sucks on the head of your c**k while her hand strokes the shaft."; } else if (r == 2) { m += getSelf().name() + " licks her way down to the base of your c**k and gently sucks on your balls."; } else { m += getSelf().name() + " runs her tongue around the glans of your penis and teases your urethra."; } } if (modifier != Result.miss && getSelf().body.getRandom("mouth").isErogenous()) { m += "<br>Unfortunately for her, as " + getSelf().subject() + " mouth f***s " + target.possessivePronoun() + " c**k " + getSelf().nameOrPossessivePronoun() + " sensitive modified mouth pussy sends spasms of pleasure into " + getSelf().reflectivePronoun() + " too."; } return m; }
@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 String deal(Combat c, int damage, Result modifier, Character target) { String m = ""; if (modifier == Result.miss) { m = "You try to take " + target.name() + "'s penis into your mouth, but she manages to pull away."; } if (target.getArousal().get() < 15) { m = "You suck on " + target.name() + " flaccid little penis until it grows into an intimidating large erection."; } else if (target.getArousal().percent() >= 90) { m = target.name() + "'s girl-c**k seems ready to burst, so you suck on it strongly and attack the glans with your tongue fiercely."; } else if (modifier == Result.special) { m = "You put your skilled tongue to good use tormenting and teasing her unnatural member."; } else if (modifier == Result.reverse) { m = "With " + target.name() + " sitting over your face, you have no choice but to try to suck her off."; } else { m = "You feel a bit odd, faced with " + target.name() + "'s rigid c**k, but as you lick and suck on it, you discover the taste is quite palatable. Besides, " + "making " + target.name() + " squirm and moan in pleasure is well worth it."; } if (modifier != Result.miss && getSelf().body.getRandom("mouth").isErogenous()) { m += "<br>Unfortunately for you, your sensitive modified mouth pussy sends spasms of pleasure into you too as you mouth f**k " + target.possessivePronoun() + " c**k."; } return m; }
@Override public boolean resolve(Combat c, Character target) { int type = Global.centeredrandom(2, getSelf().get(Attribute.Dark) / 20.0f, 2); if (this.getSelf().human()) { c.write(getSelf(), deal(c, type, Result.normal, target)); } else if (target.human()) { c.write(getSelf(), receive(c, type, Result.normal, target)); } switch (type) { case 0: getSelf().arouse(getSelf().getArousal().max(), c); break; case 1: int stolen = stealXP(target); if (stolen > 0) { getSelf().add(c, new Satiated(target, stolen, 0)); if (getSelf().human()) c.write("You have absorbed " + stolen + " XP from " + target.name() + "!\n"); else c.write(getSelf().name() + " has absorbed " + stolen + " XP from you!\n"); } break; case 2: int xpStolen = 95 + (5 * (target.getLevel())); getSelf().add(c, new Satiated(target, xpStolen, 0)); c.write(target.dong()); if (getSelf().human()) c.write( "You have stolen a level from " + target.name() + "'s levels and absorbed it as " + xpStolen + " XP!\n"); else c.write( getSelf().name() + " has stolen a level from you and absorbed it as " + xpStolen + " XP!\n"); getSelf().gainXP(xpStolen); target.tempt(c, getSelf(), target.getArousal().max()); break; default: break; } return type != 0; }
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(); }