As for the stuck monsters, I see you're doing the chase+thrust trick for smooth movement:
Code: Select all
See:
NARA A 20;
NARA A 0 A_BabyMetal;
NARA AAAAAABBBBBBCCCCCC 1
{
A_Chase();
A_Recoil(-0.4);
}
NARA D 0 A_BabyMetal;
NARA DDDDDDEEEEEEFFFFFF 1
{
A_Chase();
A_Recoil(-0.4);
}
Goto See + 1;
Hideous Destructor uses something similar and monsters also get stuck, though I don't remember how I mitigate it besides making all the hitboxes really skinny...
EDIT: Naturally it's awfully complicated-looking and overengineered in principle.
Basically it does this:
0. If its current position is bad, just call A_Wander and skip all the other stuff.
1. Call A_Chase with the monster's usual speed.
2. Check if a valid move resulted thereby.
3. Warp the monster back to its original position.
4. If the chase call had resulted in a valid move, thrust the actor in that direction again, in an amount roughly equivalent to what the A_Chase would do if we assumed certain things about the see state.
Something involving CheckMove should be doable but that just ends up making things *way* more complicated since the A_Chase does your collision/ledge avoidance checks for you.
(And on that note... this method you're using with the really small speeds really increases the risk that a monster gets stuck, because it's only checking the area 0.1 units ahead of it.)