combat.fnl 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. (fn get+hit [e] ;TODO use equipment too
  2. (var n 0)
  3. (if (and e.weapon e.weapon.+hit)
  4. (set n (+ n e.weapon.+hit))) n)
  5. (fn get+dam [e] ;TODO use equipment too
  6. (var n (or e.+dam 0))
  7. (if (and e.weapon e.weapon.+dam)
  8. (set n (+ n e.weapon.+dam))) n)
  9. (fn get+ac [e]
  10. (var n 0)
  11. (set n (+ n (or e.ac 0)))
  12. (when e.equip
  13. (each [k v (pairs e.equip)]
  14. (if (and v v.ac) (set n (+ v.ac)))
  15. (if (and v v.+ac) (set n (+ v.+ac))))) n)
  16. (fn get+dodge [e]
  17. (var n 0)
  18. (when e.equip
  19. (each [k v (pairs e.equip)]
  20. (if (and v v.+dodge) (set n (+ v.+dodge))))) n)
  21. (fn calc-hit [e target]
  22. (let [lvlmod (math.min 48
  23. (math.max -48
  24. (* 3 (- e.level target.level))))] ;entity level affects hit chance up to a point
  25. (trace "calc-hit")
  26. (trace lvlmod)
  27. (trace (get+hit e))
  28. (if (chance (+ 50 lvlmod (* (get+hit e) 3)))
  29. ;target can have up to 60% dodge chance if hit succeeded
  30. (if (chance (* (get+dodge target) 2)) false true)
  31. false)))
  32. (fn reduce-damage [dam ac]
  33. ;ac can range from 0 to 40
  34. (var n (math.floor (* dam (- 1 (/ ac 100)))))
  35. (if (= n 0) 1 n))
  36. (fn calc-damage [e target]
  37. ;roll damage for an entities successful hit
  38. (var base (roll e.attack))
  39. (if e.weapon
  40. (set base (roll e.weapon.weapon)))
  41. (set base (+ base (get+dam e)))
  42. (set base (reduce-damage base (get+ac target))) base)
  43. (fn evaluate-entity [e]
  44. (trace (tableprint e))
  45. ;gives a "score" which we can use for other things
  46. (var score (* e.maxhp 0.25))
  47. (trace score)
  48. ;mainly based on damage possibility
  49. (set score (+ score (* (. e.attack 1) (. e.attack 2))))
  50. (trace score)
  51. ;factor in ai
  52. (set score (* score (get {:wander 0.5 :confused 1 :hunt 1.5} e.ai 1)))
  53. (trace score)
  54. ;general bonus scalar from level
  55. (set score (* score (+ 1 (* e.level 0.3))))
  56. (trace score)
  57. score)
  58. (fn exp-next [n] ;how much experience to get next level
  59. (or (. [12 32 70 120 300 1200 3200] n) (* n (* n 0.3) 1000)))
  60. (fn exp-value [e]
  61. (evaluate-entity e))
  62. (fn item-value [o]
  63. (var score (* 6 o.level))
  64. (set score (* score (^ (inc (or o.+hit 0)) 1.7)))
  65. (set score (* score (^ (inc (or o.+dam 0)) 1.7)))
  66. (set score (* score (^ (inc (or o.+ac 0)) 1.7)))
  67. (set score (* score (^ (inc (or o.+dodge 0)) 1.6)))
  68. (set score (+ score (* o.level 4)))
  69. (set score (+ score (or o.jack 0)))
  70. score)
  71. (fn item-print [o v]
  72. (when o
  73. ;prints a colorized detailed item name
  74. (let [name (or o.name "???")]
  75. (print name v.x v.y (or o.color 14))
  76. (var w (# name))
  77. (if o.weapon
  78. (let [dice (.. " (" (. o.weapon 1) "d" (. o.weapon 2) ")")]
  79. (print dice (+ v.x (* w 6)) v.y)
  80. (set w (+ w (# dice)))))
  81. (if o.wear
  82. (let [ac (.. " " o.ac " ")]
  83. (print ac (+ v.x (* w 6)) v.y)
  84. (set w (+ w (# ac)))))
  85. (when o.+ac
  86. (print (.. " +" o.+ac) (+ v.x (* w 5)) v.y 8)
  87. (set w (+ w (# (.. " + " o.+ac)))))
  88. (when o.+dodge
  89. (print (.. " dg+" o.+dodge) (+ v.x (* w 5)) v.y 5)
  90. (set w (+ w (# (.. " dg+ " o.+dodge)))))
  91. (when o.+hit
  92. (print (.. " +" o.+hit) (+ v.x (* w 5)) v.y 13)
  93. (set w (+ w (# (.. " + " o.+hit)))))
  94. (when o.+dam
  95. (print (.. " +" o.+dam) (+ v.x (* w 5)) v.y 6)
  96. (set w (+ w (# (.. " + " o.+dam)))))
  97. )))