Feast 2.0!
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 

203 行
6.5 KiB

  1. import { Creature } from "../creature"
  2. import { Damage, DamageType, ConstantDamageFormula, Vigor, Side, CompositionAction } from '../combat'
  3. import { MalePronouns, ImproperNoun, ProperNoun, Verb } from '../language'
  4. import { VoreType, Stomach, Bowels, Cock, Balls, biconnectContainers, Hand } from '../vore'
  5. import { TransferAction, FeedAction } from '../combat/actions'
  6. import { StatusConsequence, LogConsequence, ArbitraryConsequence } from '../combat/consequences'
  7. import { SizeEffect, InstantKillEffect } from '../combat/effects'
  8. import { LogLine, nilLog } from '../interface'
  9. import { TogetherCondition, MassRatioCondition, ContainsCondition } from '../combat/conditions'
  10. import { ChanceTest } from '../combat/tests'
  11. export class Geta extends Creature {
  12. constructor () {
  13. super(
  14. new ProperNoun('Geta'),
  15. new ImproperNoun('fox', 'foxes'),
  16. MalePronouns,
  17. { Toughness: 10, Power: 10, Reflexes: 30, Agility: 30, Willpower: 15, Charm: 40 },
  18. new Set([VoreType.Oral, VoreType.Anal, VoreType.Cock]),
  19. new Set([VoreType.Oral, VoreType.Anal, VoreType.Cock]),
  20. 40
  21. )
  22. this.side = Side.Monsters
  23. const stomach = new Stomach(this, 0.25, new ConstantDamageFormula(new Damage(
  24. { amount: 100, type: DamageType.Acid, target: Vigor.Health },
  25. { amount: 40, type: DamageType.Crush, target: Vigor.Stamina },
  26. { amount: 80, type: DamageType.Dominance, target: Vigor.Resolve }
  27. )))
  28. this.containers.push(stomach)
  29. const bowels = new Bowels(this, 0.25, new ConstantDamageFormula(new Damage(
  30. { amount: 30, type: DamageType.Crush, target: Vigor.Health },
  31. { amount: 90, type: DamageType.Crush, target: Vigor.Stamina },
  32. { amount: 120, type: DamageType.Dominance, target: Vigor.Resolve }
  33. )))
  34. this.containers.push(bowels)
  35. this.actions.push(new TransferAction(bowels, stomach))
  36. this.otherActions.push(new FeedAction(stomach))
  37. const cock = new class extends Cock {
  38. digestLine (user: Creature, target: Creature) {
  39. 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.`)
  40. }
  41. }(this, 0.25, new ConstantDamageFormula(new Damage(
  42. { amount: 10, type: DamageType.Crush, target: Vigor.Health },
  43. { amount: 50, type: DamageType.Crush, target: Vigor.Stamina },
  44. { amount: 150, type: DamageType.Dominance, target: Vigor.Resolve }
  45. )))
  46. cock.actions.push(
  47. new CompositionAction(
  48. "Clench",
  49. "Try to crush the life from your cock-snack",
  50. {
  51. conditions: [
  52. new ContainsCondition(cock)
  53. ],
  54. tests: [
  55. new ChanceTest(
  56. 0.5,
  57. (user, target) => new LogLine(
  58. `${user.name.capital.possessive} cock clenches hard around ${target.name.objective}, but ${target.pronouns.subjective} ${target.name.conjugate(new Verb("avoid"))} being crushed.`
  59. )
  60. )
  61. ],
  62. consequences: [
  63. new LogConsequence(
  64. (user, target) => new LogLine(
  65. `${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.`
  66. )
  67. ),
  68. new StatusConsequence(
  69. () => new InstantKillEffect()
  70. ),
  71. new ArbitraryConsequence(
  72. () => cock.tick(0),
  73. () => nilLog
  74. )
  75. ]
  76. }
  77. )
  78. )
  79. const balls = new Balls(this, 0.25, new ConstantDamageFormula(new Damage(
  80. { amount: 50, type: DamageType.Acid, target: Vigor.Health },
  81. { amount: 25, type: DamageType.Crush, target: Vigor.Stamina },
  82. { amount: 50, type: DamageType.Dominance, target: Vigor.Resolve }
  83. )), cock)
  84. this.containers.push(balls)
  85. this.containers.push(cock)
  86. biconnectContainers(cock, balls)
  87. cock.onDigest = () => nilLog
  88. const shrinkAction = new CompositionAction(
  89. "Shrink",
  90. "Zap!",
  91. {
  92. conditions: [
  93. new TogetherCondition()
  94. ],
  95. consequences: [
  96. new LogConsequence(
  97. () => new LogLine(`ZAP!`)
  98. ),
  99. new StatusConsequence(
  100. () => new SizeEffect(0.1)
  101. )
  102. ]
  103. }
  104. )
  105. this.actions.push(
  106. shrinkAction
  107. )
  108. this.otherActions.push(
  109. shrinkAction
  110. )
  111. const crushAction = new CompositionAction(
  112. "Crush",
  113. "Crush them like a bug underfoot",
  114. {
  115. conditions: [
  116. new TogetherCondition(),
  117. new MassRatioCondition(10)
  118. ],
  119. consequences: [
  120. new LogConsequence(
  121. (user, target) => new LogLine(
  122. `${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.`
  123. )
  124. ),
  125. new StatusConsequence(
  126. () => new InstantKillEffect()
  127. )
  128. ]
  129. }
  130. )
  131. this.actions.push(
  132. crushAction
  133. )
  134. this.otherActions.push(
  135. crushAction
  136. )
  137. const hand = new Hand(this, 0.25)
  138. this.otherContainers.push(
  139. hand
  140. )
  141. this.actions.push(
  142. new CompositionAction(
  143. "Devour",
  144. "Pop your prey into your mouth",
  145. {
  146. conditions: [
  147. new ContainsCondition(hand)
  148. ],
  149. consequences: [
  150. new ArbitraryConsequence(
  151. (user, target) => stomach.consume(target),
  152. () => new LogLine(`Devours the target.`)
  153. )
  154. ]
  155. }
  156. )
  157. )
  158. this.actions.push(
  159. new CompositionAction(
  160. "Grip",
  161. "Squeeze your prey like a grape",
  162. {
  163. conditions: [
  164. new ContainsCondition(hand)
  165. ],
  166. consequences: [
  167. new LogConsequence(
  168. (user, target) => new LogLine(
  169. `${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.`
  170. )
  171. ),
  172. new StatusConsequence(
  173. () => new InstantKillEffect()
  174. )
  175. ]
  176. }
  177. )
  178. )
  179. }
  180. }