Feast 2.0!
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 
 

121 lignes
5.5 KiB

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