This should be possible. I am able to freeze all the enemies and NPCs in FE7
FE7 routine 08019BA0: write AI-controlled unit movement range to 03000448 area
Parameter: r0 = pointer to unit struct
call routine 080187D4 to get movement cost pointer
call routine 08019CE0 to write movement costs to 030043F0 area
write 03000448 to 030041E0 (used by routine 08019D00)
gather parameters for routine 08019D00
4A. r0 = unit x position
4B. r1 = unit y position
4C. r2 = move (class base move + unit move bonus)
4D. r3 = deployment number
call routine 08019D00 which handles all the complicated movement mapping stuff
At 08019BC8 change D2 18 to 00 22 (mov r2, #0x0)
Now none of the AI-controlled units should be able to move
Edit:
FE8’s AI movement routine at 0801A38C
At 0801A3B4 change D2 18 to 00 22 (mov r2, #0x0)
Now all FE8 enemies and NPCs are frozen
Huh. Obviously freezing all enemy units isn’t desirable but you could make movement costs infinite for units with freeze and that would sidestep a whole lot of movement checks. You’d only have to touch display, which I’ve already done.
Oh, that was just a demonstration of how changing that parameter would prevent AI movement. You are supposed to cram in a status condition check before setting movement to zero.
But that doesn’t matter, because your movement cost thing is a much better idea. It affects both player and AI, and will show move range as zero when you press A on the enemy/NPC map sprite.