Feast 2.0!
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 
 
 

201 行
6.5 KiB

  1. import { Creature } from "../creature"
  2. import { Damage, DamageType, ConstantDamageFormula, Vigor, Side, CompositionAction } from '../combat'
  3. import { MalePronouns, ImproperNoun, ProperNoun, ObjectPronouns, FemalePronouns, TheyPronouns, Verb } from '../language'
  4. import { VoreType, Stomach, Bowels, Cock, Balls, anyVore, Slit, Womb, biconnectContainers, Hand } from '../vore'
  5. import { AttackAction, TransferAction, FeedAction, DevourAction } from '../combat/actions'
  6. import { StatusConsequence, LogConsequence, DamageConsequence, ArbitraryConsequence } from '../combat/consequences'
  7. import { SizeEffect, DamageTypeResistanceEffect, 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 Cock(this, 0.25, new ConstantDamageFormula(new Damage(
  38. { amount: 10, type: DamageType.Crush, target: Vigor.Health },
  39. { amount: 50, type: DamageType.Crush, target: Vigor.Stamina },
  40. { amount: 150, type: DamageType.Dominance, target: Vigor.Resolve }
  41. )))
  42. cock.digestLine = (user, target, args) => {
  43. return new LogLine(`${user.name.capital.possessive} ${args.container.name} throbs as it abruptly absorbs ${target.name.objective}, transforming ${target.name.objective} into more of ${user.pronouns.possessive} meaty shaft.`)
  44. }
  45. cock.actions.push(
  46. new CompositionAction(
  47. "Clench",
  48. "Try to crush the life from your cock-snack",
  49. {
  50. conditions: [
  51. new ContainsCondition(cock)
  52. ],
  53. tests: [
  54. new ChanceTest(
  55. 0.5,
  56. (user, target) => new LogLine(
  57. `${user.name.capital.possessive} cock clenches hard around ${target.name.objective}, but ${target.pronouns.subjective} ${target.name.conjugate(new Verb("avoid"))} being crushed.`
  58. )
  59. )
  60. ],
  61. consequences: [
  62. new LogConsequence(
  63. (user, target) => new LogLine(
  64. `${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.`
  65. )
  66. ),
  67. new StatusConsequence(
  68. () => new InstantKillEffect()
  69. ),
  70. new ArbitraryConsequence(
  71. (user, target) => cock.tick(0)
  72. )
  73. ]
  74. }
  75. )
  76. )
  77. const balls = new Balls(this, 0.25, new ConstantDamageFormula(new Damage(
  78. { amount: 50, type: DamageType.Acid, target: Vigor.Health },
  79. { amount: 25, type: DamageType.Crush, target: Vigor.Stamina },
  80. { amount: 50, type: DamageType.Dominance, target: Vigor.Resolve }
  81. )), cock)
  82. this.containers.push(balls)
  83. this.containers.push(cock)
  84. biconnectContainers(cock, balls)
  85. cock.onDigest = (prey) => nilLog
  86. const shrinkAction = new CompositionAction(
  87. "Shrink",
  88. "Zap!",
  89. {
  90. conditions: [
  91. new TogetherCondition()
  92. ],
  93. consequences: [
  94. new LogConsequence(
  95. (user, target) => new LogLine(`ZAP!`)
  96. ),
  97. new StatusConsequence(
  98. () => new SizeEffect(0.1)
  99. )
  100. ]
  101. }
  102. )
  103. this.actions.push(
  104. shrinkAction
  105. )
  106. this.otherActions.push(
  107. shrinkAction
  108. )
  109. const crushAction = new CompositionAction(
  110. "Crush",
  111. "Crush them like a bug underfoot",
  112. {
  113. conditions: [
  114. new TogetherCondition(),
  115. new MassRatioCondition(10)
  116. ],
  117. consequences: [
  118. new LogConsequence(
  119. (user, target) => new LogLine(
  120. `${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.`
  121. )
  122. ),
  123. new StatusConsequence(
  124. () => new InstantKillEffect()
  125. )
  126. ]
  127. }
  128. )
  129. this.actions.push(
  130. crushAction
  131. )
  132. this.otherActions.push(
  133. crushAction
  134. )
  135. const hand = new Hand(this, 0.25)
  136. this.otherContainers.push(
  137. hand
  138. )
  139. this.actions.push(
  140. new CompositionAction(
  141. "Devour",
  142. "Pop your prey into your mouth",
  143. {
  144. conditions: [
  145. new ContainsCondition(hand)
  146. ],
  147. consequences: [
  148. new ArbitraryConsequence(
  149. (user, target) => stomach.consume(target)
  150. )
  151. ]
  152. }
  153. )
  154. )
  155. this.actions.push(
  156. new CompositionAction(
  157. "Grip",
  158. "Squeeze your prey like a grape",
  159. {
  160. conditions: [
  161. new ContainsCondition(hand)
  162. ],
  163. consequences: [
  164. new LogConsequence(
  165. (user, target) => new LogLine(
  166. `${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.`
  167. )
  168. ),
  169. new StatusConsequence(
  170. () => new InstantKillEffect()
  171. )
  172. ]
  173. }
  174. )
  175. )
  176. }
  177. }