jak-project/goal_src/jak2/pc/statistics.gc
Tyler Wilding 5eeaffcde0
scripts: new linter script to detect goal_src files with trailing whitespace (#3387)
Removes trailing whitespace from goal_src files, eventually the
formatter will do this as well but it's not ready yet so this is a
decent interim solution.

A competent text editor will also do this / flag it for you.
2024-02-24 14:27:56 -05:00

131 lines
4.6 KiB
Common Lisp

;;-*-Lisp-*-
(in-package goal)
#|
Code for the statistics tracker.
|#
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; debug functions
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun-debug pu->string (out (pu penetrate))
(bit-enum->string penetrate pu out)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; functions
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defmacro pu? (pu &rest flags)
`(logtest? ,pu (penetrate ,@flags))
)
(defmacro pu-all? (pu &rest flags)
`(logtesta? ,pu (penetrate ,@flags))
)
(define-extern bot type)
(define-extern crimson-guard type)
(define-extern turret type)
(defun pu&attacker->kill-source ((pu penetrate) (attacker process))
"returns the appropriate kill source based on penetrate-using and attacker"
(cond
((not attacker)
(format #t "got null attacker~%")
(kill-stats-source unknown))
((type? attacker turret)
(kill-stats-source turret))
((type? attacker target)
(case pu
(((penetrate spin touch)) (if (focus-test? (the target attacker) indax) (kill-stats-source indax-spin) (kill-stats-source spin)))
(((penetrate flop touch)) (kill-stats-source flop))
(((penetrate uppercut touch)) (kill-stats-source uppercut))
(((penetrate punch touch)) (if (focus-test? (the target attacker) indax) (kill-stats-source indax-punch) (kill-stats-source punch)))
(((penetrate mech-punch mech punch touch)) (kill-stats-source mech))
(((penetrate mech-bonk bonk touch)) (kill-stats-source mech-bonk))
(((penetrate board spin touch)) (kill-stats-source board-trick))
(((penetrate board touch)) (kill-stats-source board))
(((penetrate dark-skin spin touch) (penetrate dark-giant dark-skin spin touch)) (kill-stats-source darkjak-spin))
(((penetrate dark-skin flop touch) (penetrate dark-giant dark-skin flop touch)) (kill-stats-source darkjak-flop))
(((penetrate dark-skin uppercut touch) (penetrate dark-giant dark-skin uppercut touch)) (kill-stats-source darkjak-uppercut))
(((penetrate dark-punch dark-skin punch touch) (penetrate dark-giant dark-punch dark-skin punch touch)) (kill-stats-source darkjak-punch))
(((penetrate dark-bomb dark-skin touch) (penetrate dark-giant dark-bomb dark-skin touch))
(case (-> attacker state)
((target-darkjak-bomb0) (kill-stats-source darkjak-bomb0))
((target-darkjak-bomb1) (kill-stats-source darkjak-bomb1))
(else (kill-stats-source unknown))))
(((penetrate dark-skin touch) (penetrate dark-giant dark-skin touch)) (kill-stats-source unknown))
(((penetrate jak-yellow-shot generic-attack)) (kill-stats-source gun-yellow))
(((penetrate jak-red-shot generic-attack)) (kill-stats-source gun-red))
(((penetrate jak-blue-shot generic-attack)) (kill-stats-source gun-blue))
(((penetrate generic-attack)) (kill-stats-source gun-dark))
(else
(format #t "unhandled target penetrate-using #x~x for kill-source~%" pu)
(kill-stats-source unknown)))
)
((is-metalhead? attacker) (kill-stats-source metalhead))
((type? attacker sig) (kill-stats-source sig))
((type? attacker ashelin) (kill-stats-source ashelin))
((type? attacker mog) (kill-stats-source mog)) ;; note that mog and grim are subtypes of jinx
((type? attacker grim) (kill-stats-source grim))
((type? attacker jinx) (kill-stats-source jinx))
((type? attacker bot) (kill-stats-source bot))
((type? attacker crimson-guard) (kill-stats-source guard))
((type? attacker enemy) (kill-stats-source enemy))
(else
(format #t "unknown attacker ~A~%" attacker)
(kill-stats-source unknown))
)
)
(defun add-to-kill-stats ((enemy enemy) (attack enemy-attack-info))
"adds a kill to the statistics tracker"
;; (format #t "enemy ~A killed (incoming ~e sec ago)~%" (-> enemy name) (- (-> PP clock old-frame-counter) (-> attack attack-time)))
;; (format #t "~Tattacker: ~A~%" (handle->process (-> attack attacker-handle)))
;; (format #t "~Tpu: ")
;; (pu->string #t (-> attack penetrate-using))
;; (format #t "~%")
(let ((enemy-name (remap-enemy-type-name (-> enemy type)))
(source (pu&attacker->kill-source (-> attack penetrate-using) (handle->process (-> attack attacker-handle)))))
(when *debug-segment*
(format #t "STATS : enemy ~S(~S) killed by ~S~%" enemy-name (-> enemy type symbol) (kill-source->string source)))
(if (or (!= source (kill-stats-source unknown)) (-> *statistics* kill-stats allow-unknown?))
(increment (-> *statistics* kill-stats) enemy-name source))
)
)
(defun reset-kill-stats ()
(initialize (-> *statistics* kill-stats)))