Feast 2.0!
25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 
 
 
 

192 satır
5.9 KiB

  1. import { Creature } from "../creature"
  2. import { Damage, DamageType, ConstantDamageFormula, Vigor, Side, GroupAction, FractionDamageFormula, DamageFormula, UniformRandomDamageFormula, CompositionAction, StatusEffect } from '../combat'
  3. import { MalePronouns, ImproperNoun, Verb, ProperNoun, ToBe, SoloLineArgs } from '../language'
  4. import { VoreType, NormalContainer, Vore, InnerVoreContainer, Container } from '../vore'
  5. import { TransferAction } from '../combat/actions'
  6. import { LogEntry, LogLine, LogLines } from '../interface'
  7. import { ContainerFullCondition, CapableCondition, EnemyCondition, TogetherCondition } from '../combat/conditions'
  8. import { UntouchableEffect, DazzlingEffect, StunEffect } from '../combat/effects'
  9. import { DamageConsequence, StatusConsequence, LogConsequence } from '../combat/consequences'
  10. class GoldeneyeCrop extends NormalContainer {
  11. consumeVerb: Verb = new Verb('swallow')
  12. releaseVerb: Verb = new Verb('free')
  13. struggleVerb: Verb = new Verb('struggle', 'struggles', 'struggling', 'struggled')
  14. constructor (owner: Vore) {
  15. super(
  16. new ImproperNoun('crop').all,
  17. owner,
  18. new Set([VoreType.Oral]),
  19. 300
  20. )
  21. }
  22. }
  23. class Taunt extends GroupAction {
  24. damage: DamageFormula = new UniformRandomDamageFormula(
  25. new Damage(
  26. { amount: 50, target: Vigor.Resolve, type: DamageType.Dominance }
  27. ),
  28. 0.5
  29. )
  30. constructor () {
  31. super(
  32. "Taunt",
  33. "Demoralize your enemies",
  34. [
  35. new EnemyCondition(),
  36. new CapableCondition()
  37. ]
  38. )
  39. }
  40. describeGroup (user: Creature, targets: Creature[]): LogEntry {
  41. return new LogLine(`Demoralize your foes`)
  42. }
  43. execute (user: Creature, target: Creature): LogEntry {
  44. return target.takeDamage(this.damage.calc(user, target))
  45. }
  46. describe (user: Creature, target: Creature): LogEntry {
  47. return new LogLine(`Demoralize your foes`)
  48. }
  49. }
  50. class Flaunt extends GroupAction {
  51. constructor (public container: Container) {
  52. super(
  53. "Flaunt " + container.name,
  54. "Show off your " + container.name,
  55. [new ContainerFullCondition(container), new CapableCondition(), new EnemyCondition(), new TogetherCondition()]
  56. )
  57. }
  58. groupLine: SoloLineArgs<Creature, { container: Container }> = (user, args) => new LogLine(
  59. `${user.name.capital} ${user.name.conjugate(new Verb('show'))} off ${user.pronouns.possessive} squirming ${args.container.name}, ${user.pronouns.possessive} doomed prey writhing beneath ${user.pronouns.possessive} pelt.`
  60. )
  61. describeGroup (user: Creature, targets: Creature[]): LogEntry {
  62. return new LogLine(`Flaunt your bulging ${this.container.name} for all your foes to see`)
  63. }
  64. execute (user: Creature, target: Creature): LogEntry {
  65. const fracDamage = new FractionDamageFormula([
  66. { fraction: 0.25, target: Vigor.Resolve, type: DamageType.Dominance }
  67. ])
  68. const flatDamage = new ConstantDamageFormula(
  69. new Damage(
  70. { amount: 50, target: Vigor.Resolve, type: DamageType.Dominance }
  71. )
  72. )
  73. const damage = fracDamage.calc(user, target).combine(flatDamage.calc(user, target))
  74. return new LogLines(
  75. new LogLine(`${target.name.capital} ${target.name.conjugate(new ToBe())} shaken for `, damage.renderShort(), '.'),
  76. target.takeDamage(damage)
  77. )
  78. }
  79. executeGroup (user: Creature, targets: Array<Creature>): LogEntry {
  80. return new LogLines(...[this.groupLine(user, { container: this.container })].concat(targets.map(target => this.execute(user, target))))
  81. }
  82. describe (user: Creature, target: Creature): LogEntry {
  83. return new LogLine(`Flaunt your bulging gut for all your foes to see`)
  84. }
  85. }
  86. class GoldeneyeStomach extends InnerVoreContainer {
  87. consumeVerb: Verb = new Verb('swallow')
  88. releaseVerb: Verb = new Verb('free')
  89. struggleVerb: Verb = new Verb('struggle', 'struggles', 'struggling', 'struggled')
  90. constructor (owner: Vore, crop: GoldeneyeCrop) {
  91. super(
  92. new ImproperNoun('stomach').all,
  93. owner,
  94. new Set([VoreType.Oral]),
  95. 900,
  96. new Damage(
  97. { amount: 1000, target: Vigor.Health, type: DamageType.Acid }
  98. ),
  99. crop
  100. )
  101. }
  102. }
  103. export class Goldeneye extends Creature {
  104. constructor () {
  105. super(
  106. new ProperNoun("Goldeneye"),
  107. new ImproperNoun('gryphon', 'gryphons'),
  108. MalePronouns,
  109. { Toughness: 200, Power: 200, Speed: 200, Willpower: 200, Charm: 200 },
  110. new Set(),
  111. new Set([VoreType.Oral]),
  112. 2000
  113. )
  114. this.title = "Not really a gryphon"
  115. this.desc = "Not really survivable, either."
  116. this.side = Side.Monsters
  117. this.applyEffect(new DazzlingEffect([
  118. new EnemyCondition(),
  119. new TogetherCondition()
  120. ]))
  121. const crop = new GoldeneyeCrop(this)
  122. const stomach = new GoldeneyeStomach(this, crop)
  123. this.containers.push(stomach)
  124. this.otherContainers.push(crop)
  125. this.actions.push(
  126. new TransferAction(
  127. crop,
  128. stomach
  129. )
  130. )
  131. this.groupActions.push(new Flaunt(crop))
  132. this.groupActions.push(new Flaunt(stomach))
  133. this.groupActions.push(new Taunt())
  134. this.actions.push(new CompositionAction(
  135. "Stomp",
  136. "Big step",
  137. {
  138. conditions: [
  139. new TogetherCondition(),
  140. new EnemyCondition()
  141. ],
  142. consequences: [
  143. new LogConsequence(
  144. (user, target) => new LogLine(
  145. `${user.name.capital} ${user.name.conjugate(new Verb('stomp'))} on ${target.name.objective} with crushing force!`
  146. )
  147. ),
  148. new DamageConsequence(
  149. new FractionDamageFormula([
  150. { fraction: 0.75, target: Vigor.Health, type: DamageType.Pure }
  151. ])
  152. ),
  153. new DamageConsequence(
  154. new ConstantDamageFormula(
  155. new Damage(
  156. { amount: 50, target: Vigor.Health, type: DamageType.Crush }
  157. )
  158. )
  159. ),
  160. new StatusConsequence(
  161. () => new StunEffect(3)
  162. )
  163. ]
  164. }
  165. ))
  166. }
  167. }