@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; }
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()); }
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) { int m = 4 + Global.random(4); Result result = Result.normal; if (target.roll(this, c, accuracy(c))) { if (target.breastsAvailable()) { m += 4; result = Result.strong; } else if (target.outfit.getTopOfSlot(ClothingSlot.top).getLayer() <= 1 && getSelf().has(Trait.dexterous)) { m += 4; result = Result.special; } } else { writeOutput(c, Result.miss, target); return false; } target.body.pleasure( getSelf(), getSelf().body.getRandom("hands"), target.body.getRandom("breasts"), m, c, this); writeOutput(c, result, target); return true; }
@Override public boolean usable(Combat c, Character target) { return c.getStance().reachTop(getSelf()) && !target.breastsAvailable() && getSelf().canAct(); }