Feast 2.0!
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

96 line
2.5 KiB

  1. import { Consequence, DamageFormula, Condition, StatusEffect } from '../combat'
  2. import { Creature } from '../creature'
  3. import { LogEntry, LogLines, LogLine } from '../interface'
  4. import { Verb, PairLine } from '../language'
  5. /**
  6. * Takes a function, and thus can do anything.
  7. */
  8. export class ArbitraryConsequence extends Consequence {
  9. constructor (public apply: (user: Creature, target: Creature) => LogEntry, conditions: Condition[] = []) {
  10. super(conditions)
  11. }
  12. describeSolo (user: Creature): LogEntry {
  13. return new LogLine(`It does...something`)
  14. }
  15. describePair (user: Creature): LogEntry {
  16. return new LogLine(`It does...something`)
  17. }
  18. }
  19. /**
  20. * Renders some text.
  21. */
  22. export class LogConsequence extends Consequence {
  23. constructor (private line: PairLine<Creature>, conditions: Condition[] = []) {
  24. super(conditions)
  25. }
  26. apply (user: Creature, target: Creature): LogEntry {
  27. return this.line(user, target)
  28. }
  29. }
  30. /**
  31. * Deals damage.
  32. */
  33. export class DamageConsequence extends Consequence {
  34. constructor (private damageFormula: DamageFormula, conditions: Condition[] = []) {
  35. super(conditions)
  36. }
  37. apply (user: Creature, target: Creature): LogEntry {
  38. const damage = this.damageFormula.calc(user, target)
  39. return new LogLines(
  40. new LogLine(`${target.name.capital} ${target.name.conjugate(new Verb('take'))} `, damage.renderShort(), ` damage!`),
  41. target.takeDamage(damage)
  42. )
  43. }
  44. describePair (user: Creature, target: Creature): LogEntry {
  45. return new LogLine(
  46. this.damageFormula.describe(user, target)
  47. )
  48. }
  49. }
  50. /**
  51. * Same as [[DamageConsequence]], but it has healing text
  52. */
  53. export class HealingConsequence extends Consequence {
  54. constructor (private damageFormula: DamageFormula, conditions: Condition[] = []) {
  55. super(conditions)
  56. }
  57. apply (user: Creature, target: Creature): LogEntry {
  58. const damage = this.damageFormula.calc(user, target)
  59. return new LogLines(
  60. new LogLine(`${target.name.capital} ${target.name.conjugate(new Verb('heal'))} `, damage.renderShort(), `!`),
  61. target.takeDamage(damage)
  62. )
  63. }
  64. describePair (user: Creature, target: Creature): LogEntry {
  65. return new LogLine(
  66. `Heals for `,
  67. this.damageFormula.describe(user, target)
  68. )
  69. }
  70. }
  71. /**
  72. * Applies a status effect
  73. */
  74. export class StatusConsequence extends Consequence {
  75. constructor (private statusMaker: () => StatusEffect, conditions: Condition[] = []) {
  76. super(conditions)
  77. }
  78. apply (user: Creature, target: Creature): LogEntry {
  79. return target.applyEffect(this.statusMaker())
  80. }
  81. }