|
- import { Creature } from "../creature"
- import { Damage, DamageType, ConstantDamageFormula, Vigor, Side, CompositionAction } from '../combat'
- import { MalePronouns, ImproperNoun, ProperNoun, Verb } from '../language'
- import { VoreType, Stomach, Bowels, Cock, Balls, biconnectContainers, Hand } from '../vore'
- import { TransferAction, FeedAction } from '../combat/actions'
- import { StatusConsequence, LogConsequence, ArbitraryConsequence } from '../combat/consequences'
- import { SizeEffect, InstantKillEffect } from '../combat/effects'
- import { LogLine, nilLog } from '../interface'
- import { TogetherCondition, MassRatioCondition, ContainsCondition } from '../combat/conditions'
- import { ChanceTest } from '../combat/tests'
-
- export class Geta extends Creature {
- constructor () {
- super(
- new ProperNoun('Geta'),
- new ImproperNoun('fox', 'foxes'),
- MalePronouns,
- { Toughness: 10, Power: 10, Reflexes: 30, Agility: 30, Willpower: 15, Charm: 40 },
- new Set([VoreType.Oral, VoreType.Anal, VoreType.Cock]),
- new Set([VoreType.Oral, VoreType.Anal, VoreType.Cock]),
- 40
- )
-
- this.side = Side.Monsters
-
- const stomach = new Stomach(this, 0.25, new ConstantDamageFormula(new Damage(
- { amount: 100, type: DamageType.Acid, target: Vigor.Health },
- { amount: 40, type: DamageType.Crush, target: Vigor.Stamina },
- { amount: 80, type: DamageType.Dominance, target: Vigor.Resolve }
- )))
- this.containers.push(stomach)
-
- const bowels = new Bowels(this, 0.25, new ConstantDamageFormula(new Damage(
- { amount: 30, type: DamageType.Crush, target: Vigor.Health },
- { amount: 90, type: DamageType.Crush, target: Vigor.Stamina },
- { amount: 120, type: DamageType.Dominance, target: Vigor.Resolve }
- )))
-
- this.containers.push(bowels)
-
- this.actions.push(new TransferAction(bowels, stomach))
-
- this.otherActions.push(new FeedAction(stomach))
-
- const cock = new class extends Cock {
- digestLine (user: Creature, target: Creature) {
- return new LogLine(`${user.name.capital.possessive} ${this.name} throbs as it abruptly absorbs ${target.name.objective}, transforming ${target.name.objective} into more of ${user.pronouns.possessive} meaty shaft.`)
- }
- }(this, 0.25, new ConstantDamageFormula(new Damage(
- { amount: 10, type: DamageType.Crush, target: Vigor.Health },
- { amount: 50, type: DamageType.Crush, target: Vigor.Stamina },
- { amount: 150, type: DamageType.Dominance, target: Vigor.Resolve }
- )))
-
- cock.actions.push(
- new CompositionAction(
- "Clench",
- "Try to crush the life from your cock-snack",
- {
- conditions: [
- new ContainsCondition(cock)
- ],
- tests: [
- new ChanceTest(
- 0.5,
- (user, target) => new LogLine(
- `${user.name.capital.possessive} cock clenches hard around ${target.name.objective}, but ${target.pronouns.subjective} ${target.name.conjugate(new Verb("avoid"))} being crushed.`
- )
- )
- ],
- consequences: [
- new LogConsequence(
- (user, target) => new LogLine(
- `${user.name.capital} ${user.name.conjugate(new Verb('let'))} out a lustful moan as ${user.pronouns.subjective} crushes the life from ${target.name.possessive} body with a flex of ${user.pronouns.possessive} shaft.`
- )
- ),
- new StatusConsequence(
- () => new InstantKillEffect()
- ),
- new ArbitraryConsequence(
- () => cock.tick(0),
- () => nilLog
- )
- ]
- }
- )
- )
-
- const balls = new Balls(this, 0.25, new ConstantDamageFormula(new Damage(
- { amount: 50, type: DamageType.Acid, target: Vigor.Health },
- { amount: 25, type: DamageType.Crush, target: Vigor.Stamina },
- { amount: 50, type: DamageType.Dominance, target: Vigor.Resolve }
- )), cock)
-
- this.containers.push(balls)
- this.containers.push(cock)
-
- biconnectContainers(cock, balls)
-
- cock.onDigest = () => nilLog
-
- const shrinkAction = new CompositionAction(
- "Shrink",
- "Zap!",
- {
- conditions: [
- new TogetherCondition()
- ],
- consequences: [
- new LogConsequence(
- () => new LogLine(`ZAP!`)
- ),
- new StatusConsequence(
- () => new SizeEffect(0.1)
- )
- ]
- }
- )
- this.actions.push(
- shrinkAction
- )
-
- this.otherActions.push(
- shrinkAction
- )
-
- const crushAction = new CompositionAction(
- "Crush",
- "Crush them like a bug underfoot",
- {
- conditions: [
- new TogetherCondition(),
- new MassRatioCondition(10)
- ],
- consequences: [
- new LogConsequence(
- (user, target) => new LogLine(
- `${user.name.capital} ${user.name.conjugate(new Verb("raise"))} ${user.pronouns.possessive} paw over ${target.name.objective}, stomping down hard and crushing the life from ${user.pronouns.possessive} prey with a sickening CRUNCH.`
- )
- ),
- new StatusConsequence(
- () => new InstantKillEffect()
- )
- ]
- }
- )
-
- this.actions.push(
- crushAction
- )
-
- this.otherActions.push(
- crushAction
- )
-
- const hand = new Hand(this, 0.25)
-
- this.otherContainers.push(
- hand
- )
-
- this.actions.push(
- new CompositionAction(
- "Devour",
- "Pop your prey into your mouth",
- {
- conditions: [
- new ContainsCondition(hand)
- ],
- consequences: [
- new ArbitraryConsequence(
- (user, target) => stomach.consume(target),
- () => new LogLine(`Devours the target.`)
- )
- ]
- }
- )
- )
-
- this.actions.push(
- new CompositionAction(
- "Grip",
- "Squeeze your prey like a grape",
- {
- conditions: [
- new ContainsCondition(hand)
- ],
- consequences: [
- new LogConsequence(
- (user, target) => new LogLine(
- `${user.name.capital} ${user.name.conjugate(new Verb("crush", "crushes"))} ${target.name.objective} in ${user.pronouns.possessive} merciless grip, breaking bones and pulping ${user.pronouns.possessive} victim with ease.`
- )
- ),
- new StatusConsequence(
- () => new InstantKillEffect()
- )
- ]
- }
- )
- )
- }
- }
|