mirror of
https://github.com/open-goal/jak-project
synced 2026-08-18 05:48:28 -04:00
c3cc91c9ba
Was investigating https://github.com/open-goal/jak-project/issues/3012 and found out it's no longer an issue, fixed at some point. Updated the method name, it actually looks like quite a few methods were nicely named / documented in jak 3, so i might automate backporting that documentation (likely a bunch that can go all the way back to jak 1 as well). Closes #3012
482 lines
16 KiB
Common Lisp
482 lines
16 KiB
Common Lisp
;;-*-Lisp-*-
|
|
(in-package goal)
|
|
|
|
;; name: enemy-h.gc
|
|
;; name in dgo: enemy-h
|
|
;; dgos: GAME
|
|
|
|
;; +++enemy-aware
|
|
(defenum enemy-aware
|
|
:type uint64
|
|
(unaware 0)
|
|
(aware1 1)
|
|
(aware2 2)
|
|
(hostile 3)
|
|
(flee 4)
|
|
)
|
|
;; ---enemy-aware
|
|
|
|
|
|
;; +++enemy-flag
|
|
(defenum enemy-flag
|
|
:type uint64
|
|
:bitfield #t
|
|
(look-at-focus 0)
|
|
(look-at-move-dest 1)
|
|
(vulnerable 2)
|
|
(vulnerable-backup 3)
|
|
(dangerous-backup 4)
|
|
(notice 5)
|
|
(alert 6)
|
|
(auto-reset-penetrate 7)
|
|
(victory 8)
|
|
(cam-attack-mode 9)
|
|
(use-notice-distance 10)
|
|
(attackable 11)
|
|
(attackable-backup 12)
|
|
(actor-pause-backup 13)
|
|
(enable-on-notice 14)
|
|
(enable-on-active 15)
|
|
(enable-on-hostile 16)
|
|
(dislike-combo 17)
|
|
(directed 18)
|
|
(directed-ready 19)
|
|
(chase-startup 20)
|
|
(lock-focus 21)
|
|
(multi-focus 22)
|
|
(use-trigger 23)
|
|
(trackable 24)
|
|
(trackable-backup 25)
|
|
(spawn-gem 26)
|
|
(check-water 27)
|
|
(check-water-backup 28)
|
|
(checking-water 29)
|
|
(drawn-mirrored 30)
|
|
(called-dying 31)
|
|
(no-initial-move-to-ground 32)
|
|
(jump-check-blocked 33)
|
|
(death-start 34)
|
|
(auto-death-phase-out 35)
|
|
(has-gem 36)
|
|
;; these seem to be an extension of the flags for nav-enemy.
|
|
(ef37 37)
|
|
(ef38 38)
|
|
(ef39 39)
|
|
(ef40 40)
|
|
(ef41 41)
|
|
(ef42 42)
|
|
(ef43 43)
|
|
(ef44 44)
|
|
)
|
|
;; ---enemy-flag
|
|
|
|
|
|
;; +++enemy-jump-flags
|
|
(defenum enemy-jump-flags
|
|
:bitfield #t
|
|
:type uint8
|
|
(ejf0 0)
|
|
(ejf1 1)
|
|
(ejf2 2)
|
|
(ejf3 3)
|
|
(ejf4 4)
|
|
(ejf5 5)
|
|
(ejf6 6)
|
|
(ejf7 7)
|
|
)
|
|
|
|
(defenum jump-stage
|
|
:type int32
|
|
(init 0)
|
|
(winding-up 1)
|
|
(takeoff 2)
|
|
(in-air 3)
|
|
(touchdown 4)
|
|
(landing 5)
|
|
)
|
|
;; ---enemy-jump-flags
|
|
|
|
|
|
(declare-type enemy process-focusable)
|
|
(define-extern *shockwave-knock-scalar* curve2d-fast)
|
|
|
|
;; DECOMP BEGINS
|
|
|
|
(deftype enemy-focus (focus)
|
|
((aware enemy-aware)
|
|
(flags enemy-flag)
|
|
)
|
|
(:methods
|
|
(focus-on! (_type_ process-focusable enemy) symbol :replace)
|
|
(focus-on-with-awareness! (_type_ process-focusable enemy-aware) symbol)
|
|
)
|
|
)
|
|
|
|
|
|
(deftype enemy-info (basic)
|
|
((fact-defaults fact-info-enemy-defaults)
|
|
(use-die-falling symbol)
|
|
(use-victory symbol)
|
|
(use-jump-blocked symbol)
|
|
(debug-draw-neck symbol)
|
|
(jump-debug-draw symbol)
|
|
(move-to-ground symbol)
|
|
(hover-if-no-ground symbol)
|
|
(idle-anim-script (inline-array idle-control-frame))
|
|
(idle-anim int32)
|
|
(notice-anim int32)
|
|
(hostile-anim int32)
|
|
(hit-anim int32)
|
|
(knocked-anim int32)
|
|
(knocked-land-anim int32)
|
|
(die-anim int32)
|
|
(die-falling-anim int32)
|
|
(victory-anim int32)
|
|
(jump-wind-up-anim int32)
|
|
(jump-in-air-anim int32)
|
|
(jump-land-anim int32)
|
|
(neck-joint int32)
|
|
(look-at-joint int32)
|
|
(bullseye-joint int32)
|
|
(sound-hit sound-name)
|
|
(sound-die sound-name)
|
|
(notice-distance meters)
|
|
(notice-distance-delta meters)
|
|
(proximity-notice-distance meters)
|
|
(default-hit-points float)
|
|
(gnd-collide-with collide-spec)
|
|
(overlaps-others-collide-with-filter collide-spec)
|
|
(penetrate-flinch penetrate)
|
|
(penetrate-knocked penetrate)
|
|
(movement-gravity meters)
|
|
(friction float)
|
|
(slip-factor float)
|
|
(attack-shove-back meters)
|
|
(attack-shove-up meters)
|
|
(attack-mode symbol)
|
|
(attack-damage int32)
|
|
(recover-gnd-collide-with collide-spec)
|
|
(knocked-can-land-timeout time-frame)
|
|
(knocked-recover-timeout time-frame)
|
|
(ragdoll-blend-out-time time-frame)
|
|
(ragdoll-rotate-velocity-mult float)
|
|
(jump-height-min meters)
|
|
(jump-height-factor float)
|
|
(knocked-seek-ry-clamp float)
|
|
(knocked-soft-vxz-lo meters)
|
|
(knocked-soft-vxz-hi meters)
|
|
(knocked-soft-vy-lo meters)
|
|
(knocked-soft-vy-hi meters)
|
|
(knocked-medium-vxz-lo meters)
|
|
(knocked-medium-vxz-hi meters)
|
|
(knocked-medium-vy-lo meters)
|
|
(knocked-medium-vy-hi meters)
|
|
(knocked-hard-vxz-lo meters)
|
|
(knocked-hard-vxz-hi meters)
|
|
(knocked-hard-vy-lo meters)
|
|
(knocked-hard-vy-hi meters)
|
|
(knocked-huge-vxz-lo meters)
|
|
(knocked-huge-vxz-hi meters)
|
|
(knocked-huge-vy-lo meters)
|
|
(knocked-huge-vy-hi meters)
|
|
(knocked-yellow-vxz-lo meters)
|
|
(knocked-yellow-vxz-hi meters)
|
|
(knocked-yellow-vy-lo meters)
|
|
(knocked-yellow-vy-hi meters)
|
|
(knocked-red-vxz-lo meters)
|
|
(knocked-red-vxz-hi meters)
|
|
(knocked-red-vy-lo meters)
|
|
(knocked-red-vy-hi meters)
|
|
(knocked-blue-vxz-lo meters)
|
|
(knocked-blue-vxz-hi meters)
|
|
(knocked-blue-vy-lo meters)
|
|
(knocked-blue-vy-hi meters)
|
|
(ragdoll-info ragdoll-setup)
|
|
(shadow-size meters)
|
|
(shadow-max-y meters)
|
|
(shadow-min-y meters)
|
|
(shadow-locus-dist meters)
|
|
(gem-joint int32)
|
|
(gem-seg uint32)
|
|
(gem-no-seg uint32)
|
|
(gem-offset sphere :inline)
|
|
(knocked-off symbol)
|
|
)
|
|
(:methods
|
|
(copy-enemy-info! (_type_ _type_) none)
|
|
)
|
|
)
|
|
|
|
|
|
(deftype enemy-knocked-info (structure)
|
|
((anim-speed float)
|
|
(on-surface-count int32)
|
|
(move-count int32)
|
|
(land-can-land-time time-frame)
|
|
)
|
|
)
|
|
|
|
|
|
(deftype enemy-jump-info (structure)
|
|
((flags enemy-jump-flags)
|
|
(anim-speed float)
|
|
(hang-time time-frame)
|
|
(start-pos vector :inline)
|
|
(dest-pos vector :inline)
|
|
(traj trajectory :inline)
|
|
)
|
|
)
|
|
|
|
|
|
(deftype enemy-init-by-other-params (structure)
|
|
((trans vector :inline)
|
|
(quat quaternion :inline)
|
|
(entity entity)
|
|
(directed? symbol)
|
|
(no-initial-move-to-ground? symbol)
|
|
(art-level symbol)
|
|
)
|
|
)
|
|
|
|
|
|
(deftype enemy-attack-info (structure)
|
|
((attack-id uint32)
|
|
(knocked-type knocked-type)
|
|
(blue-juggle-count uint8)
|
|
(attacker-handle handle)
|
|
(attack-time time-frame)
|
|
(penetrate-using penetrate)
|
|
(attacker-pos vector :inline)
|
|
(attack-direction vector :inline)
|
|
(attack-position vector :inline)
|
|
(intensity float)
|
|
)
|
|
)
|
|
|
|
|
|
(deftype enemy-best-focus (structure)
|
|
((proc process)
|
|
(rating float)
|
|
(aware enemy-aware)
|
|
)
|
|
)
|
|
|
|
|
|
(deftype enemy (process-focusable)
|
|
((fact fact-info-enemy :override)
|
|
(root collide-shape-moving :override)
|
|
(enemy-flags enemy-flag)
|
|
(enemy-info enemy-info)
|
|
(hit-points float)
|
|
(gnd-collide-with collide-spec)
|
|
(attack-id uint32)
|
|
(persistent-attack-id uint32)
|
|
(water-max-height float)
|
|
(water-surface-height float)
|
|
(desired-angle degrees)
|
|
(jump-why uint64)
|
|
(penetrated-by-all penetrate)
|
|
(penetrate-flinch penetrate)
|
|
(penetrate-knocked penetrate)
|
|
(ragdoll-proc handle)
|
|
(reaction-time time-frame)
|
|
(notice-time time-frame)
|
|
(state-timeout time-frame)
|
|
(auto-reset-penetrate-time time-frame)
|
|
(hit-focus-time time-frame)
|
|
(last-draw-time time-frame)
|
|
(starting-time time-frame)
|
|
(fated-time time-frame)
|
|
(focus-pos vector :inline)
|
|
(event-param-point vector :inline)
|
|
(jump-dest vector :inline :overlay-at event-param-point)
|
|
(focus enemy-focus :inline)
|
|
(incoming enemy-attack-info :inline)
|
|
(actor-group (pointer actor-group))
|
|
(actor-group-count int32)
|
|
(neck joint-mod)
|
|
(on-notice pair)
|
|
(on-active pair)
|
|
(on-hostile pair)
|
|
(on-death pair)
|
|
(idle-anim-player idle-control :inline)
|
|
(rand-gen symbol)
|
|
)
|
|
(:state-methods
|
|
dormant
|
|
dormant-aware
|
|
hit
|
|
knocked
|
|
knocked-recover
|
|
idle
|
|
active
|
|
notice
|
|
flee
|
|
stare
|
|
hostile
|
|
victory
|
|
die
|
|
die-falling
|
|
die-fast
|
|
directed
|
|
jump
|
|
jump-blocked
|
|
ambush-delay
|
|
ambush
|
|
view-anims
|
|
gun-dark-2-stretch
|
|
)
|
|
(:methods
|
|
(update-collision-action (_type_ int) none)
|
|
(adjust-transv-under-water! (_type_ vector) float)
|
|
(damage-enemy-from-attack! (_type_ object event-message-block) float)
|
|
(reset-penetrate-later! (_type_) none)
|
|
(get-knockback-dir! (_type_ vector) vector)
|
|
(get-knockback-angle (_type_) degrees)
|
|
(knocked-handler (_type_ vector) object)
|
|
(can-focus-on? (_type_ process-focusable) object)
|
|
(check-water (_type_) object)
|
|
(enemy-common-post (_type_) none)
|
|
(impact-velocity-to-hit-points (_type_ float) float)
|
|
(attack-direction-from-impact-vel (_type_ vector vector float) vector)
|
|
(get-damage-from-attack (_type_ object event-message-block) float)
|
|
(apply-incoming-hitpoint-mods (_type_ float) float)
|
|
(get-awareness-of-proc (_type_ process-focusable enemy-best-focus) enemy-aware)
|
|
(msg-for-incoming-attack (_type_ process event-message-block float) symbol)
|
|
(get-penetrated-by (_type_) penetrate)
|
|
(coin-flip? (_type_) symbol)
|
|
(modify-awareness (_type_ enemy-aware) enemy-aware)
|
|
(focus-on-attacker! (_type_) none)
|
|
(set-focus! (_type_ process-focusable enemy-aware) none)
|
|
(go-dormant (_type_) object)
|
|
(go-dormant-aware (_type_) object)
|
|
(go-idle (_type_) object)
|
|
(go-ambush (_type_) object)
|
|
(go-stare (_type_) object)
|
|
(go-stare2 (_type_) object)
|
|
(go-directed (_type_) object)
|
|
(go-hostile (_type_) object)
|
|
(go-flee (_type_) object)
|
|
(go-state-for-focused (_type_) object)
|
|
(go-die (_type_) object)
|
|
(event-handler (_type_ process int symbol event-message-block) object :behavior enemy)
|
|
(enemy-touch-handler (_type_ process event-message-block) object)
|
|
(enemy-touched-handler (_type_ process event-message-block) object)
|
|
(knocked-anim (_type_ enemy-knocked-info) symbol)
|
|
(knocked-land-anim (_type_ enemy-knocked-info) symbol)
|
|
(knocked-anim-handler (_type_ int enemy-knocked-info) symbol)
|
|
(done-being-knocked? (_type_ enemy-knocked-info) symbol)
|
|
(invalid-height? (_type_) symbol)
|
|
(copy-ragdoll-orientation-to-root (_type_ ragdoll-proc) none)
|
|
(check-jump-blocked? (_type_ enemy-jump-info) object)
|
|
(init-jump-info! (_type_ enemy-jump-info) none)
|
|
(setup-jump-trajectory! (_type_ enemy-jump-info) none)
|
|
(move-to-gspot! (_type_) float)
|
|
(landed-jump-yet? (_type_ enemy-jump-info) symbol)
|
|
(jump-in-air-anim (_type_ enemy-jump-info) symbol)
|
|
(jump-land-anim (_type_ enemy-jump-info) symbol)
|
|
(jump-wind-up-anim (_type_ enemy-jump-info) symbol)
|
|
(jump-anim-handler (_type_ jump-stage enemy-jump-info) symbol)
|
|
(move-along-ballistic-trajectory-for-jump (_type_ jump-stage enemy-jump-info) none)
|
|
(adjust-heading-for-jump (_type_ jump-stage enemy-jump-info) none)
|
|
(go-next-state-auto (_type_) object)
|
|
(heading-matches-direction? (_type_ vector float) symbol)
|
|
(pointing-toward? (_type_ vector float) symbol)
|
|
(pointing-toward-focus? (_type_ float symbol) symbol)
|
|
(find-best-focus (_type_) process)
|
|
(can-become-hostile-to? (_type_ process-focusable vector) symbol)
|
|
(should-flee-from? (_type_ process-focusable) symbol)
|
|
(out-of-bounds? (_type_) symbol)
|
|
(send-attack-from-tshape (_type_ process touching-shapes-entry uint) symbol)
|
|
(on-attack (_type_ process-focusable) none)
|
|
(handle-incoming-attack! (_type_ process-drawable event-message-block penetrate attack-info touching-shapes-entry) none)
|
|
(get-focus! (_type_) process-focusable)
|
|
(find-and-damage-attackers (_type_ process-focusable event-message-block) int)
|
|
(set-look-at-mode! (_type_ int) none)
|
|
(stop-look-at! (_type_) none)
|
|
(apply-friction (_type_) none)
|
|
(set-enemy-info! (_type_ enemy-info) none)
|
|
(setup-enemy! (_type_ enemy-info) none)
|
|
(init-enemy-collision! (_type_) none)
|
|
(init-enemy! (_type_) none)
|
|
(go-fallback-init (_type_) object)
|
|
(allow-ragdoll? (_type_) symbol)
|
|
(disable-ragdoll (_type_) none)
|
|
(ragdoll-settled? (_type_) object)
|
|
(ragdoll-spawn! (_type_ symbol symbol) vector)
|
|
(deactivate-ragdoll! (_type_) none)
|
|
(rnd-float (_type_) float)
|
|
(rnd-float-range (_type_ float float) float)
|
|
(rnd-int (_type_ int) int)
|
|
(rnd-int-excluding-masked (_type_ int int) int)
|
|
(rnd-time-frame (_type_ time-frame time-frame) time-frame)
|
|
(rnd-chance? (_type_ float) symbol)
|
|
(rnd-chance-for-idle? (_type_ float) symbol)
|
|
(enemy-method-135 (_type_) none)
|
|
(find-ground-and-set-pat! (_type_ collide-query collide-spec float float float process) pat-surface)
|
|
(enemy-above-ground? (_type_ collide-query vector collide-spec float float float) symbol)
|
|
(move-to-ground (_type_ meters meters symbol collide-spec) symbol)
|
|
(move-above-ground! (_type_ vector move-above-ground-params) none)
|
|
(update-focus (_type_) process)
|
|
(check-awareness-trigger (_type_ float) symbol)
|
|
(penetrate->knocked-type (_type_ penetrate) knocked-type)
|
|
(on-dying (_type_) none)
|
|
(falling? (_type_) symbol)
|
|
(find-offending-pfoc (_type_ process attack-info) process-focusable)
|
|
(play-damage-or-death-sound (_type_ int) sound-id)
|
|
(clear-stale-victory (_type_) none)
|
|
(go-gun-dark-2-stretch (_type_) object)
|
|
(have-more-than-10-joints? (_type_) object)
|
|
(can-be-nuked? (_type_) symbol)
|
|
(should-move-to-ground? (_type_) symbol)
|
|
(gem-chance (_type_) float)
|
|
(get-gem-pool-idx (_type_) int)
|
|
(mark-as-dead (_type_) none)
|
|
)
|
|
)
|
|
|
|
|
|
(deftype anim-info (structure)
|
|
((anim-index int32)
|
|
(travel-speed meters)
|
|
)
|
|
)
|
|
|
|
|
|
(defmethod focus-on! ((this enemy-focus) (arg0 process-focusable) (arg1 enemy))
|
|
"Make this enemy focus on the process-focusable. If already focused, update awareness."
|
|
(let* ((t9-0 (method-of-type focus focus-on!))
|
|
(s3-0 (t9-0 this arg0))
|
|
)
|
|
(when (not s3-0)
|
|
(logclear! (-> this flags) (enemy-flag look-at-focus))
|
|
(set! (-> this aware) (modify-awareness arg1 (get-awareness-of-proc arg1 arg0 (the-as enemy-best-focus #f))))
|
|
)
|
|
s3-0
|
|
)
|
|
)
|
|
|
|
(defmethod focus-on-with-awareness! ((this enemy-focus) (arg0 process-focusable) (arg1 enemy-aware))
|
|
"Focus on the process-focusable, updating the aware."
|
|
(let* ((t9-0 (method-of-type focus focus-on!))
|
|
(v0-0 (t9-0 this arg0))
|
|
)
|
|
(set! (-> this aware) arg1)
|
|
(if (not v0-0)
|
|
(logclear! (-> this flags) (enemy-flag look-at-focus))
|
|
)
|
|
v0-0
|
|
)
|
|
)
|
|
|
|
;; WARN: Return type mismatch enemy-flag vs none.
|
|
(defmethod clear-focused ((this enemy-focus))
|
|
"Reset the focus' handle."
|
|
(let ((t9-0 (method-of-type focus clear-focused)))
|
|
(t9-0 this)
|
|
)
|
|
(set! (-> this aware) (enemy-aware unaware))
|
|
(logclear! (-> this flags) (enemy-flag look-at-focus))
|
|
(none)
|
|
)
|