Example #1
0
  @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;
  }
Example #2
0
 @Override
 public boolean resolve(Combat c, Character target) {
   if (target.roll(getSelf(), c, accuracy(c, target))) {
     int strength = Math.min(20, 10 + getSelf().get(Attribute.Dark) / 4);
     boolean vaginal = c.getStance().anallyPenetrated(c, c.getOpponent(getSelf()));
     boolean shamed = false;
     if (!vaginal && Global.random(4) == 2) {
       target.add(c, new Shamed(target));
       shamed = true;
     }
     if (target.human()) {
       if (vaginal) {
         c.write(getSelf(), receive(c, 0, Result.intercourse, target));
       } else if (c.getStance().inserted(target)) {
         c.write(getSelf(), receive(c, 0, Result.special, target));
       } else if (c.getStance().dom(target)) {
         c.write(getSelf(), receive(c, 0, Result.critical, target));
       } else if (c.getStance().behind(getSelf())) {
         c.write(getSelf(), receive(c, 0, Result.strong, target));
       } else {
         c.write(getSelf(), receive(c, 0, Result.normal, target));
       }
       if (shamed) {
         c.write(
             getSelf(),
             "The shame of having your ass violated by "
                 + getSelf().name()
                 + " has destroyed your confidence.");
       }
     } else if (getSelf().human()) {
       if (vaginal) {
         c.write(getSelf(), deal(c, 0, Result.intercourse, target));
       }
       if (c.getStance().inserted(target)) {
         c.write(getSelf(), deal(c, 0, Result.special, target));
       } else if (c.getStance().dom(target)) {
         c.write(getSelf(), deal(c, 0, Result.critical, target));
       } else if (c.getStance().behind(getSelf())) {
         c.write(getSelf(), deal(c, 0, Result.strong, target));
       } else {
         c.write(getSelf(), deal(c, 0, Result.normal, target));
       }
       if (shamed) {
         c.write(
             getSelf(),
             "The shame of having her ass violated by you has destroyed "
                 + target.getName()
                 + "'s confidence.");
       }
     }
     if (c.getStance().havingSex(c)) {
       if (vaginal) {
         target.body.pleasure(
             getSelf(),
             getSelf().body.getRandom("tail"),
             target.body.getRandom("pussy"),
             strength,
             c,
             this);
         target.add(c, new TailFucked(target, getSelf(), "pussy"));
       } else {
         target.body.pleasure(
             getSelf(),
             getSelf().body.getRandom("tail"),
             target.body.getRandom("ass"),
             strength,
             c,
             this);
         target.add(c, new TailFucked(target, getSelf(), "ass"));
       }
     }
     target.pain(
         c, getSelf(), (int) getSelf().modifyDamage(DamageType.physical, target, strength / 2));
     target.emote(Emotion.nervous, 10);
     target.emote(Emotion.desperate, 10);
     getSelf().emote(Emotion.confident, 15);
     getSelf().emote(Emotion.dominant, 25);
     if (Global.random(100) < 5 + 2 * getSelf().get(Attribute.Fetish)) {
       target.add(c, new BodyFetish(target, getSelf(), "tail", .25));
     }
   } else {
     if (target.human()) {
       c.write(getSelf(), receive(c, 0, Result.miss, target));
     } else {
       c.write(getSelf(), deal(c, 0, Result.miss, target));
     }
     return false;
   }
   return true;
 }
Example #3
0
 @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;
 }
Example #4
0
  @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;
  }