Feast 2.0!
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 
 

134 строки
6.5 KiB

  1. import { Creature, POV, Entity } from '../entity'
  2. import { Stat, Damage, DamageType, TransferAction, Vigor, StatTest, FeedAction, DigestAction, EatenAction, AttackAction } from '../combat'
  3. import { ProperNoun, TheyPronouns, ImproperNoun, POVPair, FemalePronouns, POVPairArgs } from '../language'
  4. import { VoreType, Stomach, InnerStomach, Container, Bowels } from '../vore'
  5. import { LogLine, LogLines, LogEntry, FAElem, CompositeLog, ImgElem } from '../interface'
  6. import { Wolf } from '../creatures'
  7. class BellyCrushAction extends AttackAction {
  8. successLines = new POVPairArgs<Entity, Entity, { damage: Damage }>([
  9. [[POV.First, POV.Third], (user, target, args) => new CompositeLog(new LogLine(
  10. `You crush on ${target.name} with your belly for `,
  11. args.damage.renderShort()
  12. ), new ImgElem('./media/cafat/images/belly-crush.webp'))],
  13. [[POV.Third, POV.First], (user, target, args) => new CompositeLog(new LogLine(
  14. `${user.name.capital} crushes on you with ${user.pronouns.possessive} belly for `,
  15. args.damage.renderShort()
  16. ), new ImgElem('./media/cafat/images/belly-crush.webp'))],
  17. [[POV.Third, POV.Third], (user, target, args) => new CompositeLog(new LogLine(
  18. `${user.name.capital} crushes on ${target.name} with ${user.pronouns.possessive} belly for `,
  19. args.damage.renderShort()
  20. ), new ImgElem('./media/cafat/images/belly-crush.webp'))]
  21. ])
  22. constructor (private _damage: Damage) {
  23. super(_damage)
  24. this.name = 'Belly Crush'
  25. }
  26. execute (user: Creature, target: Creature): LogEntry {
  27. this.damage = this._damage.scale(user.bulk / 25 + 1)
  28. return super.execute(user, target)
  29. }
  30. }
  31. class BelchAction extends AttackAction {
  32. successLines = new POVPairArgs<Entity, Entity, { damage: Damage }>([
  33. [[POV.First, POV.Third], (user, target, args) => new CompositeLog(new LogLine(
  34. `You belch on ${target.name} for `,
  35. args.damage.renderShort()
  36. ), new ImgElem('./media/cafat/images/belch.webp'))],
  37. [[POV.Third, POV.First], (user, target, args) => new CompositeLog(new LogLine(
  38. `${user.name.capital} belches on you for `,
  39. args.damage.renderShort()
  40. ), new ImgElem('./media/cafat/images/belch.webp'))],
  41. [[POV.Third, POV.Third], (user, target, args) => new CompositeLog(new LogLine(
  42. `${user.name.capital} belches on ${target.name} for `,
  43. args.damage.renderShort()
  44. ), new ImgElem('./media/cafat/images/belch.webp'))]
  45. ])
  46. constructor (damage: Damage) {
  47. super(damage)
  48. this.name = 'Belch'
  49. }
  50. }
  51. class CrushAction extends EatenAction {
  52. lines: POVPair<Entity, Entity> = new POVPair([
  53. [[POV.First, POV.Third], (user, target) => new LogLine(`You crush ${target.name} `, new FAElem('fas fa-skull'))],
  54. [[POV.Third, POV.First], (user, target) => new CompositeLog(new LogLine(`${user.name.capital} crushes you; ${user.pronouns.subjective} belches as ${user.pronouns.possessive} gut lets out a fatal CRUNCH `, new FAElem('fas fa-skull')), new ImgElem('./media/cafat/images/crunch.webp'))],
  55. [[POV.Third, POV.Third], (user, target) => new LogLine(`${user.name.capital} crushes ${target.name}; ${user.pronouns.subjective} belches as ${user.pronouns.possessive} gut lets out a fatal CRUNCH `, new FAElem('fas fa-skull'))]
  56. ])
  57. private damage: Damage = new Damage(
  58. { amount: 99, type: DamageType.Crush, target: Vigor.Health }
  59. )
  60. constructor (container: Container) {
  61. super(container, "Crush", "Crush 'em!")
  62. }
  63. execute (user: Creature, target: Creature): LogEntry {
  64. target.takeDamage(this.damage)
  65. return this.lines.run(user, target)
  66. }
  67. }
  68. export class Cafat extends Creature {
  69. constructor () {
  70. super(new ProperNoun('Cafat'), [TheyPronouns, FemalePronouns][Math.floor(Math.random() * 2)], { [Stat.STR]: 30, [Stat.DEX]: 15, [Stat.CON]: 25 }, new Set([VoreType.Oral, VoreType.Anal]), new Set([VoreType.Oral, VoreType.Anal]), 150)
  71. this.vigors.Health = 200
  72. this.maxVigors.Health = 200
  73. this.vigors.Stamina = 250
  74. this.maxVigors.Stamina = 250
  75. this.vigors.Willpower = 150
  76. this.maxVigors.Willpower = 150
  77. const stomach = new Stomach(this, 100, new Damage(
  78. { amount: 20, type: DamageType.Acid, target: Vigor.Health },
  79. { amount: 10, type: DamageType.Crush, target: Vigor.Stamina },
  80. { amount: 10, type: DamageType.Dominance, target: Vigor.Willpower }
  81. ))
  82. stomach.name = new ImproperNoun("upper stomach", "upper stomachs").all
  83. this.containers.push(stomach)
  84. const lowerStomach = new InnerStomach(this, 100, new Damage(
  85. { amount: 40, type: DamageType.Acid, target: Vigor.Health },
  86. { amount: 20, type: DamageType.Crush, target: Vigor.Stamina },
  87. { amount: 20, type: DamageType.Dominance, target: Vigor.Willpower }
  88. ), stomach)
  89. lowerStomach.name = new ImproperNoun("lower stomach", "lower stomachs").all
  90. stomach.consumeLines = new POVPair([
  91. [[POV.First, POV.Third], (user, target) => new LogLines(`You devour ${target.name}`)],
  92. [[POV.Third, POV.First], (user, target) => new CompositeLog(new LogLines(`${user.name.capital} devours you`), new ImgElem('./media/cafat/images/stomach.webp'))],
  93. [[POV.Third, POV.Third], (user, target) => new LogLines(`${user.name.capital} munches ${target.name.capital}`)]
  94. ])
  95. const crush = new CrushAction(lowerStomach)
  96. lowerStomach.actions.push(crush)
  97. this.containers.push(lowerStomach)
  98. const transfer = new TransferAction(stomach, lowerStomach)
  99. transfer.lines = new POVPairArgs([
  100. [[POV.First, POV.Third], (user, target, args) => new LogLine(`You squeeze ${target.name} from your ${args.from.name} to your ${args.to.name}`)],
  101. [[POV.Third, POV.First], (user, target, args) => new CompositeLog(new LogLine(`You're squeezed from ${user.name}'s ${args.from.name} to ${user.pronouns.possessive} ${args.to.name}`), new ImgElem('./media/cafat/images/lower-stomach.webp'))],
  102. [[POV.Third, POV.Third], (user, target, args) => new LogLine(`${user.name} squeezes ${target.name} from ${user.pronouns.possessive} ${args.from.name} to ${user.pronouns.possessive} ${args.to.name}`)]
  103. ])
  104. this.actions.push(transfer)
  105. this.actions.push(new TransferAction(lowerStomach, stomach))
  106. this.actions.push(new AttackAction(new Damage({ amount: 40, type: DamageType.Crush, target: Vigor.Health })))
  107. this.actions.push(new BellyCrushAction(new Damage({ amount: 10, type: DamageType.Crush, target: Vigor.Health }, { amount: 10, type: DamageType.Dominance, target: Vigor.Willpower })))
  108. this.actions.push(new BelchAction(new Damage(
  109. { amount: 100, target: Vigor.Willpower, type: DamageType.Acid }
  110. )))
  111. this.otherActions.push(new FeedAction(stomach))
  112. }
  113. }