Пример #1
0
 @Override
 public boolean resolve(Combat c, Character target) {
   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));
   }
   double m =
       (6 + Global.random(4) + getSelf().body.getHotness(getSelf(), target))
           * Math.min(2, 1 + getSelf().getExposure());
   if (target.has(Trait.imagination)) {
     m += 4;
     target.tempt(c, getSelf(), (int) Math.round(m));
     if (Global.random(4) >= 1) {
       target.add(c, new Shamed(target));
     }
   } else {
     target.tempt(c, getSelf(), (int) Math.round(m));
     if (Global.random(4) >= 2) {
       target.add(c, new Shamed(target));
     }
   }
   target.emote(Emotion.angry, 30);
   target.emote(Emotion.nervous, 15);
   getSelf().emote(Emotion.dominant, 20);
   target.loseMojo(c, 5);
   return true;
 }
Пример #2
0
 public void checkStanceStatus(Character c, Position oldStance, Position newStance) {
   if ((oldStance.prone(c) || !oldStance.mobile(c))
       && !newStance.prone(c)
       && newStance.mobile(c)) {
     c.add(this, new Braced(c));
     c.add(this, new Wary(c, 3));
   } else if (!oldStance.mobile(c) && newStance.mobile(c)) {
     c.add(this, new Wary(c, 3));
   }
 }
Пример #3
0
 public void checkStamina(Character p) {
   if (p.getStamina().isEmpty() && !p.is(Stsflag.stunned)) {
     p.add(this, new Winded(p));
     if (!getStance().prone(p)) {
       Character other;
       if (p == p1) {
         other = p2;
       } else {
         other = p1;
       }
       if (getStance().inserted() && getStance().dom(other)) {
         if (p.human()) {
           write("Your legs give out, but " + other.name() + " holds you up.");
         } else {
           write(
               p.name()
                   + " slumps in your arms, but you support her to keep her from collapsing.");
         }
       } else {
         setStance(new StandingOver(other, p));
         if (p.human()) {
           write("You don't have the strength to stay on your feet. You slump to the floor.");
         } else {
           write(p.name() + " drops to the floor, exhausted.");
         }
       }
       p.loseWillpower(this, Math.min(p.getWillpower().max() / 8, 15), true);
     }
   }
 }
Пример #4
0
  @Override
  public boolean resolve(Combat c, Character target) {
    BodyPart selfO = getSelfOrgan(c);
    BodyPart targetO = getTargetOrgan(c, target);
    Result result;
    if (c.getStance().inserted(target)) {
      result = Result.reverse;
    } else if (c.getStance().en == Stance.anal) {
      result = Result.anal;
    } else {
      result = Result.normal;
    }

    writeOutput(c, result, target);

    int[] m = getDamage(c, target);
    assert (m.length >= 2);

    if (m[0] != 0) target.body.pleasure(getSelf(), selfO, targetO, m[0], c, this);
    if (m[1] != 0) getSelf().body.pleasure(target, targetO, selfO, m[1], 0, c, false, this);
    if (selfO.isType("ass") && Global.random(100) < 2 + getSelf().get(Attribute.Fetish)) {
      target.add(c, new BodyFetish(target, getSelf(), "ass", .25));
    }
    return true;
  }
Пример #5
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;
  }
Пример #6
0
 @Override
 public void add(Combat c, Status status) {
   super.add(c, status);
   if (stunned()) {
     c.write(
         this,
         Global.format(
             "With {self:name-possessive} link to the fight weakened, {self:subject-action:disappears|disappears}..",
             this,
             this));
     c.removePet(this);
   }
 }
Пример #7
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;
 }
Пример #8
0
 @Override
 public boolean resolve(Combat c, Character target) {
   if (isActive(target)) {
     if (getSelf().human()) {
       c.write(
           getSelf(),
           "Deciding she's had enough for now, you let your c**k return to its regular shape, once again permitting movement.");
     } else if (c.shouldPrintReceive(target)) {
       String part = c.getStance().insertedPartFor(target).describe(target);
       c.write(
           getSelf(),
           String.format(
               "%s the intense pressure in %s %s " + "recede as %s allows %s knot to deflate.",
               target.subjectAction("feel"),
               target.possessivePronoun(),
               part,
               getSelf().subject(),
               getSelf().possessivePronoun()));
     }
     target.removeStatus(Stsflag.knotted);
   } else {
     if (getSelf().human()) {
       c.write(
           getSelf(),
           "You'd like to stay inside "
               + target.name()
               + " for a bit, so you "
               + (c.getStance().canthrust(getSelf()) ? "thrust" : "buck up")
               + " as deep inside of her as you can and send a mental command to the base of your c**k, where your"
               + " knot soon swells up, locking you inside,");
     } else if (c.shouldPrintReceive(target)) {
       String firstPart;
       if (c.getStance().dom(getSelf())) {
         firstPart =
             String.format(
                 "%s bottoms out inside of %s, and something quickly feels off%s.",
                 getSelf().subject(),
                 target.nameDirectObject(),
                 c.isBeingObserved() ? " to " + target.directObject() : "");
       } else {
         firstPart =
             String.format(
                 "%s pulls %s all the way onto %s c**k."
                     + "As soon as %s pelvis touches %s, something starts happening.",
                 getSelf().subject(),
                 target.nameDirectObject(),
                 getSelf().possessivePronoun(),
                 getSelf().possessivePronoun(),
                 (target.human() || target.useFemalePronouns())
                     ? target.possessivePronoun() + "s"
                     : "s");
       }
       c.write(
           getSelf(),
           String.format(
               "%s A ball swells up at the base of %s dick,"
                   + " growing to the size of a small apple. %s not"
                   + " getting <i>that</i> out of %s any time soon...",
               firstPart,
               getSelf().nameOrPossessivePronoun(),
               Global.capitalizeFirstLetter(target.subjectAction("are", "is")),
               target.reflectivePronoun()));
     }
     target.add(c, new Knotted(target, getSelf(), c.getStance().anallyPenetrated(target)));
   }
   return true;
 }
Пример #9
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;
  }