123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- (fn get+hit [e] ;TODO use equipment too
- (var n 0)
- (if (and e.weapon e.weapon.+hit)
- (set n (+ n e.weapon.+hit))) n)
- (fn get+dam [e] ;TODO use equipment too
- (var n (or e.+dam 0))
- (if (and e.weapon e.weapon.+dam)
- (set n (+ n e.weapon.+dam))) n)
- (fn get+ac [e]
- (var n 0)
- (set n (+ n (or e.ac 0)))
- (when e.equip
- (each [k v (pairs e.equip)]
- (if (and v v.ac) (set n (+ v.ac)))
- (if (and v v.+ac) (set n (+ v.+ac))))) n)
- (fn get+dodge [e]
- (var n 0)
- (when e.equip
- (each [k v (pairs e.equip)]
- (if (and v v.+dodge) (set n (+ v.+dodge))))) n)
- (fn calc-hit [e target]
- (let [lvlmod (math.min 48
- (math.max -48
- (* 3 (- e.level target.level))))] ;entity level affects hit chance up to a point
- (trace "calc-hit")
- (trace lvlmod)
- (trace (get+hit e))
- (if (chance (+ 50 lvlmod (* (get+hit e) 3)))
- ;target can have up to 60% dodge chance if hit succeeded
- (if (chance (* (get+dodge target) 2)) false true)
- false)))
- (fn reduce-damage [dam ac]
- ;ac can range from 0 to 40
- (var n (math.floor (* dam (- 1 (/ ac 100)))))
- (if (= n 0) 1 n))
- (fn calc-damage [e target]
- ;roll damage for an entities successful hit
- (var base (roll e.attack))
- (if e.weapon
- (set base (roll e.weapon.weapon)))
- (set base (+ base (get+dam e)))
- (set base (reduce-damage base (get+ac target))) base)
- (fn evaluate-entity [e]
- (trace (tableprint e))
- ;gives a "score" which we can use for other things
- (var score (* e.maxhp 0.25))
- (trace score)
- ;mainly based on damage possibility
- (set score (+ score (* (. e.attack 1) (. e.attack 2))))
- (trace score)
- ;factor in ai
- (set score (* score (get {:wander 0.5 :confused 1 :hunt 1.5} e.ai 1)))
- (trace score)
- ;general bonus scalar from level
- (set score (* score (+ 1 (* e.level 0.3))))
- (trace score)
- score)
- (fn exp-next [n] ;how much experience to get next level
- (or (. [12 32 70 120 300 1200 3200] n) (* n (* n 0.3) 1000)))
- (fn exp-value [e]
- (evaluate-entity e))
- (fn item-value [o]
- (var score (* 6 o.level))
- (set score (* score (^ (inc (or o.+hit 0)) 1.7)))
- (set score (* score (^ (inc (or o.+dam 0)) 1.7)))
- (set score (* score (^ (inc (or o.+ac 0)) 1.7)))
- (set score (* score (^ (inc (or o.+dodge 0)) 1.6)))
- (set score (+ score (* o.level 4)))
- (set score (+ score (or o.jack 0)))
- score)
- (fn item-print [o v]
- (when o
- ;prints a colorized detailed item name
- (let [name (or o.name "???")]
- (print name v.x v.y (or o.color 14))
- (var w (# name))
- (if o.weapon
- (let [dice (.. " (" (. o.weapon 1) "d" (. o.weapon 2) ")")]
- (print dice (+ v.x (* w 6)) v.y)
- (set w (+ w (# dice)))))
- (if o.wear
- (let [ac (.. " " o.ac " ")]
- (print ac (+ v.x (* w 6)) v.y)
- (set w (+ w (# ac)))))
- (when o.+ac
- (print (.. " +" o.+ac) (+ v.x (* w 5)) v.y 8)
- (set w (+ w (# (.. " + " o.+ac)))))
- (when o.+dodge
- (print (.. " dg+" o.+dodge) (+ v.x (* w 5)) v.y 5)
- (set w (+ w (# (.. " dg+ " o.+dodge)))))
- (when o.+hit
- (print (.. " +" o.+hit) (+ v.x (* w 5)) v.y 13)
- (set w (+ w (# (.. " + " o.+hit)))))
- (when o.+dam
- (print (.. " +" o.+dam) (+ v.x (* w 5)) v.y 6)
- (set w (+ w (# (.. " + " o.+dam)))))
- )))
|