Feast 2.0!
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 
 
 

128 líneas
5.6 KiB

  1. import { Creature } from "../creature"
  2. import { Stat, Damage, DamageType, Vigor, ConstantDamageFormula, Side, Action } from '../combat'
  3. import { ProperNoun, TheyPronouns, ImproperNoun, FemalePronouns, Verb, PairLineArgs } from '../language'
  4. import { VoreType, Stomach, InnerStomach, VoreContainer } from '../vore'
  5. import { LogLine, LogLines, LogEntry, FAElem, ImgElem } from '../interface'
  6. import { AttackAction, TransferAction, FeedAction } from '../combat/actions'
  7. import { InstantKillEffect } from '../combat/effects'
  8. import * as Words from '../words'
  9. import { ContainedByCondition, ContainsCondition } from '../combat/conditions'
  10. class BellyCrushAction extends AttackAction {
  11. constructor (_damage: Damage) {
  12. super({
  13. calc (user) { return _damage.scale(user.voreStats.Bulk / 25) },
  14. describe (user) { return new LogLine('Deal ', _damage.scale(user.voreStats.Bulk / 25).renderShort(), ` with your ${user.voreStats.Bulk} `, new FAElem('fas fa-weight-hanging')) },
  15. explain (user) { return new LogLine('Deal ', _damage.scale(user.voreStats.Bulk / 25).renderShort(), ` with your ${user.voreStats.Bulk} `, new FAElem('fas fa-weight-hanging')) }
  16. })
  17. this.name = 'Belly Crush'
  18. this.desc = 'Use your weight!'
  19. }
  20. describe (user: Creature, target: Creature): LogEntry {
  21. return new LogLine(`Crush ${target.name} under your gut. `, this.damage.describe(user, target))
  22. }
  23. successLine: PairLineArgs<Creature, { damage: Damage }> = (user, target, args) => new LogLines(new LogLine(
  24. `${user.name.capital} ${user.name.conjugate(new Verb('crush', 'crushes'))} on ${target.name.objective} with ${user.pronouns.possessive} belly for `,
  25. target.effectiveDamage(args.damage).renderShort()
  26. ), new ImgElem('./media/cafat/images/belly-crush.webp'))
  27. }
  28. class BelchAction extends AttackAction {
  29. constructor (damage: Damage) {
  30. super(new ConstantDamageFormula(damage))
  31. this.name = 'Belch'
  32. this.desc = 'Drain your foe\'s stats with a solid BELCH'
  33. }
  34. successLine: PairLineArgs<Creature, { damage: Damage }> = (user, target, args) => new LogLines(
  35. new LogLine(
  36. `${user.name.capital} ${user.name.conjugate(new Verb('belch', 'belches'))} on ${target.name.objective} for `,
  37. target.effectiveDamage(args.damage).renderShort()
  38. ),
  39. new ImgElem('./media/cafat/images/belch.webp')
  40. )
  41. }
  42. class CrushAction extends Action {
  43. constructor (private container: VoreContainer) {
  44. super(
  45. "Crush",
  46. "Crush 'em!",
  47. [
  48. new ContainsCondition(container)
  49. ]
  50. )
  51. this.desc = "Crush somebody in your gut"
  52. }
  53. describe (user: Creature, target: Creature): LogEntry {
  54. return new LogLine(`Crush ${target.name} in your ${this.container.name} for massive, unavoidable damage.`)
  55. }
  56. execute (user: Creature, target: Creature): LogEntry {
  57. return new LogLines(this.line(user, target, { container: this.container }), target.applyEffect(new InstantKillEffect()))
  58. }
  59. line: PairLineArgs<Creature, { container: VoreContainer }> = (user, target, args) => new LogLine(
  60. `${user.name.capital.possessive} ${args.container.name} ${Words.Brutally} ${user.name.conjugate(new Verb('crush', 'crushes'))} ${target.name.objective}; ${user.pronouns.subjective} ${user.pronouns.conjugate(new Verb('belch', 'belches'))} as ${user.pronouns.possessive} gut lets out a fatal CRUNCH `,
  61. new ImgElem('./media/cafat/images/crunch.webp')
  62. )
  63. }
  64. export class Cafat extends Creature {
  65. constructor () {
  66. super(new ProperNoun('Cafat'), new ImproperNoun('taur', 'taurs'), [TheyPronouns, FemalePronouns][Math.floor(Math.random() * 2)], {
  67. [Stat.Toughness]: 30,
  68. [Stat.Power]: 30,
  69. [Stat.Speed]: 15,
  70. [Stat.Willpower]: 25,
  71. [Stat.Charm]: 20
  72. }, new Set([VoreType.Oral, VoreType.Anal]), new Set([VoreType.Oral, VoreType.Anal]), 150)
  73. this.side = Side.Monsters
  74. const stomach = new Stomach(this, 1, new ConstantDamageFormula(new Damage(
  75. { amount: 20, type: DamageType.Acid, target: Vigor.Health },
  76. { amount: 10, type: DamageType.Crush, target: Vigor.Stamina },
  77. { amount: 10, type: DamageType.Dominance, target: Vigor.Resolve }
  78. )))
  79. stomach.name = new ImproperNoun("upper stomach", "upper stomachs").all
  80. this.containers.push(stomach)
  81. const lowerStomach = new InnerStomach(this, 1.5, new ConstantDamageFormula(new Damage(
  82. { amount: 40, type: DamageType.Acid, target: Vigor.Health },
  83. { amount: 20, type: DamageType.Crush, target: Vigor.Stamina },
  84. { amount: 20, type: DamageType.Dominance, target: Vigor.Resolve }
  85. )), stomach)
  86. lowerStomach.name = new ImproperNoun("lower stomach", "lower stomachs").all
  87. const crush = new CrushAction(lowerStomach)
  88. lowerStomach.actions.push(crush)
  89. this.containers.push(lowerStomach)
  90. const transfer = new TransferAction(stomach, lowerStomach)
  91. transfer.verb = new Verb('gulp')
  92. this.actions.push(transfer)
  93. this.actions.push(new TransferAction(lowerStomach, stomach))
  94. this.actions.push(new AttackAction(new ConstantDamageFormula(new Damage({ amount: 40, type: DamageType.Crush, target: Vigor.Health }))))
  95. this.actions.push(new BellyCrushAction(new Damage({ amount: 10, type: DamageType.Crush, target: Vigor.Health }, { amount: 10, type: DamageType.Dominance, target: Vigor.Resolve })))
  96. this.actions.push(new BelchAction(new Damage(
  97. { amount: 10, target: Stat.Toughness, type: DamageType.Acid },
  98. { amount: 10, target: Stat.Power, type: DamageType.Acid },
  99. { amount: 10, target: Stat.Speed, type: DamageType.Acid },
  100. { amount: 10, target: Stat.Willpower, type: DamageType.Acid },
  101. { amount: 10, target: Stat.Charm, type: DamageType.Acid }
  102. )))
  103. this.otherActions.push(new FeedAction(stomach))
  104. }
  105. }