Example #1
0
 @Override
 public boolean requirements(Combat c, Character user, Character target) {
   Collection<BodyPart> tails = user.body.get("tail");
   boolean hasFuckableTail = tails.stream().anyMatch(p -> p.isType("tail") && p != TailPart.cat);
   return hasFuckableTail
       && (user.get(Attribute.Dark) >= 1 || user.get(Attribute.Seduction) >= 20);
 }
Example #2
0
 @Override
 public boolean resolve(Combat c, Character target) {
   if (target.roll(this, c, accuracy(c))) {
     if (getSelf().has(Item.Dildo2)) {
       if (getSelf().human()) {
         c.write(getSelf(), deal(c, 0, Result.upgrade, target));
       } else if (target.human()) {
         c.write(getSelf(), receive(c, 0, Result.upgrade, target));
       }
       int m = 5 + Global.random(15) + target.get(Attribute.Perception);
       target.body.pleasure(getSelf(), null, target.body.getRandom("pussy"), m, c);
     } 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));
       }
       int m = Global.random(10) + target.get(Attribute.Perception);
       target.body.pleasure(getSelf(), null, target.body.getRandom("pussy"), m, c);
     }
   } else {
     if (getSelf().human()) {
       c.write(getSelf(), deal(c, 0, Result.miss, target));
     } else if (target.human()) {
       c.write(getSelf(), receive(c, 0, Result.miss, target));
     }
     return false;
   }
   return true;
 }
Example #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;
 }
Example #4
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();
  }
Example #5
0
 @Override
 public boolean resolve(Combat c, Character target) {
   Result result = Result.normal;
   if (c.getStance().inserted(getSelf())) {
     if (c.getStance().en == Stance.anal) result = Result.anal;
   } else if (c.getStance().inserted(target)) {
     result = Result.reverse;
   } else {
     result = Result.special;
   }
   if (c.getStance().en == Stance.anal) {
     if (getSelf().human()) {
       c.write(getSelf(), deal(c, 0, result, target));
     } else if (target.human()) {
       c.write(getSelf(), receive(c, 0, result, target));
     }
     c.setStance(c.getStance().insertRandom());
   } else if (result == Result.special) {
     if (getSelf().human()) {
       c.write(getSelf(), deal(c, 0, result, target));
     } else if (target.human()) {
       c.write(getSelf(), receive(c, 0, result, target));
     }
     c.setStance(new StandingOver(getSelf(), target));
   } else {
     if (getSelf().hasStatus(Stsflag.leglocked)
         || getSelf().hasStatus(Stsflag.armlocked)
         || (target.has(Trait.tight) && c.getStance().inserted(getSelf()))) {
       boolean escaped =
           getSelf()
               .check(Attribute.Power, 10 - getSelf().escape(c) + target.get(Attribute.Power));
       if (escaped) {
         if (getSelf().human()) {
           c.write(getSelf(), deal(c, 0, result, target));
         } else if (target.human()) {
           c.write(getSelf(), receive(c, 0, result, target));
         }
       } else {
         if (getSelf().hasStatus(Stsflag.leglocked)) {
           BodyPart part =
               c.getStance().anallyPenetrated(getSelf())
                   ? target.body.getRandom("ass")
                   : target.body.getRandomPussy();
           String partString = part.describe(target);
           if (getSelf().human())
             c.write(
                 getSelf(),
                 "You try to pull out of "
                     + target.name()
                     + "'s "
                     + partString
                     + ", but her legs immediately tighten against your waist, holding you inside her. The mere friction from her action sends a shiver down your spine.");
           else
             c.write(
                 getSelf(),
                 "She tries to pull out of "
                     + target.nameOrPossessivePronoun()
                     + " "
                     + partString
                     + ", but your legs immediately pull her back in, holding you inside her.");
         } else if (getSelf().hasStatus(Stsflag.armlocked)) {
           if (getSelf().human())
             c.write(
                 getSelf(),
                 "You try to pull yourself off of "
                     + target.name()
                     + ", but she merely pulls you back on top of her, surrounding you in her embrace.");
           else
             c.write(
                 getSelf(),
                 "She tries to pull herself off of "
                     + target.name()
                     + ", but with a gentle pull of your hands, she collapses back on top of you.");
         } else if (target.has(Trait.tight) && c.getStance().inserted(getSelf())) {
           BodyPart part =
               c.getStance().anallyPenetrated(target)
                   ? target.body.getRandom("ass")
                   : target.body.getRandomPussy();
           String partString = part.describe(target);
           if (getSelf().human())
             c.write(
                 getSelf(),
                 "You try to pull yourself out of "
                     + target.name()
                     + "'s "
                     + partString
                     + ", but she clamps down hard on your c**k while smiling at you. You almost cum from the sensation, and quickly abandon ideas about your escape.");
           else
             c.write(
                 getSelf(),
                 "She tries to pull herself out of "
                     + target.nameOrPossessivePronoun()
                     + " "
                     + partString
                     + ", but you clamp down hard on her c**k, and prevent her from pulling out.");
         }
         int m = 8;
         if (c.getStance().inserted(getSelf())) {
           BodyPart part =
               c.getStance().anallyPenetrated(target)
                   ? target.body.getRandom("ass")
                   : target.body.getRandomPussy();
           String partString = part.describe(target);
           getSelf().body.pleasure(target, part, getSelf().body.getRandomInsertable(), m, c);
         }
         getSelf().struggle();
         return false;
       }
     } else if (getSelf().hasStatus(Stsflag.cockbound)) {
       CockBound s = (CockBound) getSelf().getStatus(Stsflag.cockbound);
       c.write(
           getSelf(),
           "You try to pull out of "
               + target.name()
               + "'s "
               + target.body.getRandomPussy()
               + ", but "
               + s.binding
               + " instantly reacts and pulls your dick back in.");
       int m = 8;
       getSelf()
           .body
           .pleasure(
               target, target.body.getRandom("pussy"), getSelf().body.getRandom("c**k"), m, c);
       return false;
     } else if (getSelf().human()) {
       c.write(getSelf(), deal(c, 0, result, target));
     } else if (target.human()) {
       c.write(getSelf(), receive(c, 0, result, target));
     }
     c.setStance(c.getStance().insertRandom());
   }
   return true;
 }
Example #6
0
 @Override
 public boolean requirements(Combat c, Character user, Character target) {
   return user.get(Attribute.Seduction) >= 26 || user.has(Trait.tight);
 }
Example #7
0
 @Override
 public boolean requirements(Combat c, Character user, Character target) {
   return user.get(Attribute.Ki) >= 12;
 }
Example #8
0
 @Override
 public boolean requirements(Combat c, Character user, Character target) {
   return user.get(Attribute.Seduction) >= 10 && !user.has(Trait.temptress);
 }
Example #9
0
 public static Position similarInstance(Character top, Character bottom) {
   if (top.get(Attribute.Power) > 25 && Global.random(2) == 0) {
     return new UpsideDownFemdom(top, bottom);
   }
   return new Cowgirl(top, bottom);
 }
Example #10
0
 @Override
 public boolean requirements(Combat c, Character user, Character target) {
   return user.get(Attribute.Power) >= 16 && !user.has(Trait.softheart);
 }
Example #11
0
 public static boolean hasRequirements(Character user) {
   return user.get(Attribute.Seduction) >= 24
       && !user.has(Trait.direct)
       && !user.has(Trait.shy)
       && !user.has(Trait.temptress);
 }
Example #12
0
 @Override
 public boolean requirements(Combat c, Character user, Character target) {
   return user.get(Attribute.Seduction) >= 8;
 }
Example #13
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;
  }