Esempio n. 1
0
 @Override
 public boolean usable(Combat c, Character target) {
   return !target.hasStatus(Stsflag.knotted)
       && getSelf().canAct()
       && (c.getStance().en == Stance.facesitting
           || (c.getStance().inserted() && c.getStance().dom(getSelf())));
 }
Esempio n. 2
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;
  }
Esempio n. 3
0
  @Override
  public boolean resolve(Combat c, Character target) {
    int m = 10 + Global.random(8);
    boolean facesitting = c.getStance().enumerate() == Stance.facesitting;
    if (getSelf().has(Trait.silvertongue)) {
      m += 4;
    }
    if (isVaginal(c)) {
      m += 4;
      if (target.human()) {
        c.write(getSelf(), receive(c, m, Result.intercourse, target));
      } else if (getSelf().human()) {
        c.write(getSelf(), deal(c, m, Result.intercourse, target));
      }
      target.body.pleasure(
          getSelf(), getSelf().body.getRandom("pussy"), target.body.getRandom("c**k"), m, c);
    } else if (facesitting) {
      if (target.human()) {
        c.write(getSelf(), receive(c, m, Result.reverse, target));
      } else if (getSelf().human()) {
        c.write(getSelf(), deal(c, m, Result.reverse, target));
      }
      target.body.pleasure(
          getSelf(), getSelf().body.getRandom("mouth"), target.body.getRandom("c**k"), m, c);
      target.buildMojo(c, 10);
    } else if (c.getStance().mobile(target) && target.roll(this, c, accuracy(c))) {
      if (getSelf().has(Trait.silvertongue)) {
        if (target.human()) {
          c.write(getSelf(), receive(c, m, Result.special, target));
        } else if (getSelf().human()) {
          c.write(getSelf(), deal(c, m, Result.special, target));
        }
      } else {
        if (target.human()) {
          c.write(getSelf(), receive(c, m, Result.normal, target));
        } else if (getSelf().human()) {
          c.write(getSelf(), deal(c, m, Result.normal, target));
        }
      }

      BodyPart mouth = getSelf().body.getRandom("mouth");
      BodyPart c**k = target.body.getRandom("c**k");
      target.body.pleasure(getSelf(), mouth, c**k, m, c);
      if (mouth.isErogenous()) {
        getSelf().body.pleasure(getSelf(), c**k, mouth, m, c);
      }

      if (ReverseMount.class.isInstance(c.getStance())) {
        c.setStance(new SixNine(getSelf(), target));
      }
    } else {
      if (getSelf().human()) {
        c.write(deal(c, 0, Result.miss, target));
      } else if (target.human()) {
        c.write(receive(c, 0, Result.miss, target));
      }
      return false;
    }
    return true;
  }
Esempio n. 4
0
  @Override
  public boolean usable(Combat c, Character target) {

    return c.getStance().mobile(getSelf())
        && c.getStance().mobile(target)
        && c.getStance().prone(target)
        && getSelf().canAct();
  }
Esempio n. 5
0
 @Override
 public boolean usable(Combat c, Character target) {
   return (getSelf().has(Item.D***o) || getSelf().has(Item.Dildo2))
       && getSelf().canAct()
       && target.hasPussy()
       && c.getStance().reachBottom(getSelf())
       && target.crotchAvailable()
       && !c.getStance().vaginallyPenetrated(target);
 }
Esempio n. 6
0
 @Override
 public boolean usable(Combat c, Character target) {
   return !c.getStance().prone(getSelf())
       && c.getStance().prone(target)
       && c.getStance().feet(getSelf())
       && getSelf().canAct()
       && !getSelf().has(Trait.softheart)
       && !c.getStance().inserted(target);
 }
Esempio n. 7
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());
 }
Esempio n. 8
0
 @Override
 public boolean usable(Combat c, Character target) {
   boolean canUse =
       (c.getStance().enumerate() == Stance.facesitting && getSelf().canRespond())
           || getSelf().canAct();
   return (target.crotchAvailable()
           && target.hasDick()
           && c.getStance().oral(getSelf())
           && c.getStance().front(getSelf())
           && canUse
           && !c.getStance().inserted(target))
       || (getSelf().canRespond() && isVaginal(c));
 }
Esempio n. 9
0
 @Override
 public Combat clone() throws CloneNotSupportedException {
   Combat c = (Combat) super.clone();
   c.p1 = p1.clone();
   c.p2 = p2.clone();
   c.p1.finishClone(c.p2);
   c.p2.finishClone(c.p1);
   c.p1Data = (CombatantData) p1Data.clone();
   c.p2Data = (CombatantData) p2Data.clone();
   c.stance = getStance().clone();
   c.state = state;
   if (c.getStance().top == p1) {
     c.getStance().top = c.p1;
   }
   if (c.getStance().top == p2) {
     c.getStance().top = c.p2;
   }
   if (c.getStance().bottom == p1) {
     c.getStance().bottom = c.p1;
   }
   if (c.getStance().bottom == p2) {
     c.getStance().bottom = c.p2;
   }
   return c;
 }
Esempio n. 10
0
 @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;
 }
Esempio n. 11
0
 @Override
 public boolean usable(Combat c, Character target) {
   return getSelf().canRespond()
       && c.getStance().penetratedBy(c, getSelf(), target)
       && c.getStance().havingSexNoStrapped(c)
       && target.hasDick();
 }
Esempio n. 12
0
 @Override
 public boolean usable(Combat c, Character target) {
   return target.mostlyNude()
       && !c.getStance().sub(getSelf())
       && getSelf().canAct()
       && !getSelf().has(Trait.shy);
 }
Esempio n. 13
0
 @Override
 public String describe(Combat c) {
   if (c.getStance().anallyPenetrated(c, c.getOpponent(getSelf()))) {
     return "F**k your opponent with your tail";
   }
   return "Shove your tail up your opponent's ass.";
 }
Esempio n. 14
0
 @Override
 public boolean usable(Combat c, Character target) {
   return (this.getSelf().canAct())
       && (c.getStance().canthrust(getSelf()))
       && (c.getStance().havingSexNoStrapped())
       && getSelf().getLevel() < 100
       && getSelf().getLevel() < target.getLevel();
 }
Esempio n. 15
0
 @Override
 public String getLabel(Combat c) {
   if (c.getStance().anallyPenetrated(c, c.getOpponent(getSelf()))) {
     return "Tail F**k";
   } else {
     return "Tail Peg";
   }
 }
Esempio n. 16
0
 @Override
 public Tactics type(Combat c) {
   if (c.getStance().vaginallyPenetrated(getSelf()) && getSelf().has(Trait.vaginaltongue)) {
     return Tactics.f*****g;
   } else {
     return Tactics.pleasure;
   }
 }
Esempio n. 17
0
 @Override
 public boolean usable(Combat c, Character target) {
   return getSelf().getArousal().get() >= 30
       && getSelf().canAct()
       && target.crotchAvailable()
       && c.getStance().en != Stance.standing
       && c.getStance().en != Stance.standingover;
 }
Esempio n. 18
0
 @Override
 public int getMojoBuilt(Combat c) {
   if (isVaginal(c)) {
     return 10;
   } else if (c.getStance().enumerate() == Stance.facesitting) {
     return 0;
   } else {
     return 5;
   }
 }
Esempio n. 19
0
 @Override
 public String deal(Combat c, int damage, Result modifier, Character target) {
   if (c.getStance().en == Stance.anal) {
     return Global.format(
         "{self:SUBJECT-ACTION:rhythmically squeeze|rhythmically squeezes} {self:possessive} {self:body-part:ass} around {other:possessive} dick, milking {other:direct-object} for all that {self:pronoun-action:are|is} worth.",
         getSelf(),
         target);
   } else {
     return Global.format(
         "{self:SUBJECT-ACTION:give|gives} {other:direct-object} a seductive wink and suddenly {self:possessive} {self:body-part:pussy} squeezes around {other:possessive} {other:body-part:c**k} as though it's trying to milk {other:direct-object}.",
         getSelf(),
         target);
   }
 }
Esempio n. 20
0
 @Override
 public float priorityMod(Combat c) {
   float priority = 0;
   if (c.getStance().penetratedBy(getSelf(), c.getOther(getSelf()))) {
     priority += 1.0f;
   }
   if (getSelf().has(Trait.silvertongue)) {
     priority += 1;
   }
   if (getSelf().has(Trait.experttongue)) {
     priority += 1;
   }
   return priority;
 }
Esempio n. 21
0
 @Override
 public String deal(Combat c, int damage, Result modifier, Character target) {
   if (modifier == Result.reverse) {
     return "You rise up and let "
         + target.nameOrPossessivePronoun()
         + " girl-c**k slip out of your "
         + (c.getStance().en == Stance.anal ? "ass." : "pussy");
   } else if (modifier == Result.anal) {
     return "You pull your dick completely out of " + target.name() + "'s ass.";
   } else if (modifier == Result.normal) {
     return "You pull completely out of "
         + target.name()
         + "'s pussy, causing her to let out a disappointed little whimper.";
   } else {
     return "You pull yourself off "
         + target.name()
         + "'s face, causing her to gasp lungfuls of the new fresh air offer to her.";
   }
 }
Esempio n. 22
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;
 }
Esempio n. 23
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;
 }
Esempio n. 24
0
 @Override
 public boolean usable(Combat c, Character target) {
   return getSelf().canAct()
       && !c.getStance().sub(getSelf())
       && getSelf().getArousal().percent() >= 70;
 }
Esempio n. 25
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;
 }
Esempio n. 26
0
 public boolean isVaginal(Combat c) {
   return c.getStance().vaginallyPenetratedBy(getSelf(), c.getOther(getSelf()))
       && !c.getOther(getSelf()).has(Trait.strapped)
       && getSelf().has(Trait.vaginaltongue);
 }
Esempio n. 27
0
 @Override
 public boolean usable(Combat c, Character target) {
   return getSelf().canAct() && !c.getStance().sub(getSelf()) && !getSelf().is(Stsflag.form);
 }
Esempio n. 28
0
 @Override
 public boolean usable(Combat c, Character target) {
   return c.getStance().reachTop(getSelf()) && target.hasBreasts() && getSelf().canAct();
 }
Esempio n. 29
0
 @Override
 public int accuracy(Combat c) {
   return c.getStance().en == Stance.neutral ? 70 : 100;
 }
Esempio n. 30
0
 public int accuracy(Combat c, Character target) {
   return (c.getStance().havingSex(c) ? 100 : 60);
 }