@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;
 }
Exemple #2
0
 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());
 }
Exemple #3
0
 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();
 }