예제 #1
0
 @Override
 public double priority(Character c) {
   return (c.has(Trait.tight) ? 1 : 0)
       + (c.has(Trait.holecontrol) ? 1 : 0)
       + (c.has(Trait.oiledass) ? 1 : 0)
       + (c.has(Trait.autonomousAss) ? 4 : 0);
 }
예제 #2
0
 @Override
 public double getPleasure(Character self, BodyPart target) {
   double pleasureMod = super.getPleasure(self, target);
   pleasureMod += self.has(Trait.analTraining1) ? .5 : 0;
   pleasureMod += self.has(Trait.analTraining2) ? .7 : 0;
   pleasureMod += self.has(Trait.analTraining3) ? .7 : 0;
   return pleasureMod;
 }
예제 #3
0
 public int dc(Character attacker) {
   if (attacker != null
       && attacker.has(Trait.bramaster)
       && layer == 0
       && slots.contains(ClothingSlot.top)) {
     return dc / 2;
   }
   if (attacker != null
       && attacker.has(Trait.pantymaster)
       && layer == 0
       && slots.contains(ClothingSlot.bottom)) {
     return dc / 2;
   }
   return dc;
 }
예제 #4
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;
 }
예제 #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
 public void intervene(Character intruder, Character assist) {
   Character target;
   if (p1 == assist) {
     target = p2;
   } else {
     target = p1;
   }
   if (target.resist3p(this, intruder, assist)) {
     target.gainXP(20 + target.lvlBonus(intruder));
     intruder.gainXP(10 + intruder.lvlBonus(target));
     intruder.getArousal().empty();
     if (intruder.has(Trait.insatiable)) {
       intruder.getArousal().restore((int) (intruder.getArousal().max() * 0.2D));
     }
     target.undress(this);
     intruder.defeated(target);
     intruder.defeated(assist);
   } else {
     intruder.intervene3p(this, target, assist);
     assist.victory3p(this, target, intruder);
     phase = 2;
     if (!(p1.human() || p2.human() || intruder.human())) {
       end();
     } else if (intruder.human()) {
       Global.gui().watchCombat(this);
     }
   }
   updateMessage();
 }
예제 #7
0
 @Override
 public String getFluids(Character c) {
   if (c.has(Trait.oiledass)) {
     return "oils";
   } else {
     return "";
   }
 }
예제 #8
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());
 }
예제 #9
0
 @Override
 public double applyReceiveBonuses(
     Character self, Character opponent, BodyPart target, double damage, Combat c) {
   double bonus = 0;
   if (opponent.has(Trait.asshandler) || opponent.has(Trait.anatomyknowledge)) {
     c.write(
         opponent,
         Global.format(
             "{other:NAME-POSSESSIVE} expert handling of {self:name-possessive} ass causes {self:subject} to shudder uncontrollably.",
             self,
             opponent));
     if (opponent.has(Trait.asshandler)) {
       bonus += 5;
     }
     if (opponent.has(Trait.anatomyknowledge)) {
       bonus += 5;
     }
   }
   return bonus;
 }
예제 #10
0
 @Override
 public void tickHolding(Combat c, Character self, Character opponent, BodyPart otherOrgan) {
   if (self.has(Trait.autonomousAss)) {
     c.write(
         self,
         Global.format(
             "{self:NAME-POSSESSIVE} "
                 + fullDescribe(self)
                 + " churns against {other:name-possessive} c**k, "
                 + "seemingly with a mind of its own. {self:POSSESSIVE} internal muscles feel like a hot fleshy hand inside her asshole, jerking {other:possessive} shaft.",
             self,
             opponent));
     opponent.body.pleasure(self, this, otherOrgan, 10, c);
   }
 }
예제 #11
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;
 }
예제 #12
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;
 }
예제 #13
0
 private boolean checkCounter(Character attacker, Character target, Skill skill) {
   return !target.has(Trait.submissive)
       && getStance().mobile(target)
       && target.counterChance(this, attacker, skill) > Global.random(100);
 }
예제 #14
0
  public void doVictory(Character victor, Character loser) {
    if (loser.hasDick() && victor.has(Trait.succubus)) {
      victor.gain(Item.s***n, 3);
      if (loser.human()) {
        write(
            victor,
            "<br><b>As she leaves, you see all your scattered s***n ooze out and gather into a orb in "
                + victor.nameOrPossessivePronoun()
                + " hands. "
                + "She casually drops your seed in some empty vials that appeared out of nowhere</b>");
      } else if (victor.human()) {
        write(
            victor,
            "<br><b>"
                + loser.nameOrPossessivePronoun()
                + " scattered s***n lazily oozes into a few magically conjured flasks. "
                + "To speed up the process, you milk "
                + loser.possessivePronoun()
                + " out of the last drops "
                + loser.subject()
                + " had to offer. Yum, you just got some leftovers.</b>");
      }
    } else if (loser.hasDick()
        && (victor.human() || victor.has(Trait.madscientist))
        && victor.has(Item.EmptyBottle, 1)) {
      // for now only the player and mara collects s***n
      write(
          victor,
          Global.format(
              "<br><b>{self:SUBJECT-ACTION:manage|manages} to collect some of {other:name-possessive} scattered s***n in an empty bottle</b>",
              victor,
              loser));
      victor.consume(Item.EmptyBottle, 1, false);
      victor.gain(Item.s***n, 1);
    }
    if (checkBottleCollection(victor, loser, PussyPart.divine)) {
      write(
          victor,
          Global.format(
              "<br><b>{other:SUBJECT-ACTION:shoot|shoots} {self:name-do} a dirty look as {self:subject-action:move|moves} to collect some of {other:name-possessive} divine pussy juices in an empty bottle</b>",
              victor,
              loser));
      victor.consume(Item.EmptyBottle, 1, false);
      victor.gain(Item.HolyWater, 1);
    }
    if (checkBottleCollection(victor, loser, PussyPart.succubus)) {
      write(
          victor,
          Global.format(
              "<br><b>{other:SUBJECT-ACTION:shoot|shoots} {self:name-do} a dirty look as {self:subject-action:move|moves} to collect some of {other:name-possessive} demonic pussy juices in an empty bottle</b>",
              victor,
              loser));
      victor.consume(Item.EmptyBottle, 1, false);
      victor.gain(Item.ExtremeAphrodisiac, 1);
    }
    if (checkBottleCollection(victor, loser, PussyPart.plant)) {
      write(
          victor,
          Global.format(
              "<br><b>{other:SUBJECT-ACTION:shoot|shoots} {self:name-do} a dirty look as {self:subject-action:move|moves} to collect some of {other:possessive} nectar in an empty bottle</b>",
              victor,
              loser));
      victor.consume(Item.EmptyBottle, 1, false);
      victor.gain(Item.nectar, 3);
    }
    if (checkBottleCollection(victor, loser, PussyPart.cybernetic)) {
      write(
          victor,
          Global.format(
              "<br><b>{other:SUBJECT-ACTION:shoot|shoots} {self:name-do} a dirty look as {self:subject-action:move|moves} to collect some of {other:possessive} artificial lubricant in an empty bottle</b>",
              victor,
              loser));
      victor.consume(Item.EmptyBottle, 1, false);
      victor.gain(Item.LubricatingOils, 1);
    }
    if (checkBottleCollection(victor, loser, PussyPart.arcane)) {
      write(
          victor,
          Global.format(
              "<br><b>{other:SUBJECT-ACTION:shoot|shoots} {self:name-do} a dirty look as {self:subject-action:move|moves} to collect some of the floating mana wisps ejected from {other:possessive} o****m in an empty bottle</b>",
              victor,
              loser));
      victor.consume(Item.EmptyBottle, 1, false);
      victor.gain(Item.RawAether, 1);
    }
    if (checkBottleCollection(victor, loser, PussyPart.feral)) {
      write(
          victor,
          Global.format(
              "<br><b>{other:SUBJECT-ACTION:shoot|shoots} {self:name-do} a dirty look as {self:subject-action:move|moves} to collect some of {other:possessive} musky juices in an empty bottle</b>",
              victor,
              loser));
      victor.consume(Item.EmptyBottle, 1, false);
      victor.gain(Item.FeralMusk, 1);
    }
    if (checkBottleCollection(victor, loser, PussyPart.gooey)) {
      write(
          victor,
          Global.format(
              "<br><b>{other:SUBJECT-ACTION:shoot|shoots} {self:name-do} a dirty look as {self:subject-action:move|moves} to collect some of {other:possessive} goo in an empty bottle</b>",
              victor,
              loser));
      victor.consume(Item.EmptyBottle, 1, false);
      victor.gain(Item.BioGel, 1);
    }
    if (loser.human()) {
      write("<br>Ashamed at your loss, you resolve to win next time.");
      write("<br><b>Gained 1 Willpower</b>.");
      loser.getWillpower().gain(1);
    }
    victor.getWillpower().fill();
    loser.getWillpower().fill();

    if (Global.checkFlag(Flag.FTC) && loser.has(Item.Flag)) {
      write(
          victor,
          Global.format(
              "<br><b>{self:SUBJECT-ACTION:take|takes} the " + "Flag from {other:subject}!</b>",
              victor,
              loser));
      loser.remove(Item.Flag);
      victor.gain(Item.Flag);
    }
  }
예제 #15
0
 private boolean checkBottleCollection(Character victor, Character loser, PussyPart mod) {
   return victor.has(Item.EmptyBottle, 1)
       && loser.body.get("pussy").stream().anyMatch(part -> part.getMod() == mod);
 }
예제 #16
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;
 }
예제 #17
0
 @Override
 public boolean requirements(Combat c, Character user, Character target) {
   return user.get(Attribute.Seduction) >= 26 || user.has(Trait.tight);
 }
예제 #18
0
 @Override
 public boolean isReady(Character c) {
   return c.has(Trait.oiledass) || c.is(Stsflag.oiled);
 }
예제 #19
0
 @Override
 public void pickup(Character owner) {
   if (!owner.has(this)) {
     owner.gain(this);
   }
 }
예제 #20
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);
 }
예제 #21
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;
  }
예제 #22
0
 @Override
 public boolean requirements(Combat c, Character user, Character target) {
   return user.get(Attribute.Power) >= 16 && !user.has(Trait.softheart);
 }
예제 #23
0
 @Override
 public boolean requirements(Combat c, Character user, Character target) {
   return user.get(Attribute.Seduction) >= 10 && !user.has(Trait.temptress);
 }