1 and 1.5. Your parallel keeps reading Z and X while an S attack runs in its handler, so nothing stops them from starting on top of it. I’d wrap the shield, the S trigger, and the Form 4, 6 and 8 basics in a check on both switches, so none of them can start while anything else is running:
◆If: MOVEMENT ATTACK is OFF
◆If: ATTACKING is OFF
(your shield, unchanged)
◆End
◆End
Same two checks around each of the others. That relies on every S attack turning MOVEMENT ATTACK OFF as its very last line, after everything it waits on, so the Form 2 freeze holds until the fade is done. The normal punch gets its own version in 10 so it can still be mashed.
2 and 3. I’m wondering if these are the same thing. The enemy page runs top to bottom, so if an enemy is partway through a Wait in your attack logic when a hit arrives, the hit check further down doesn’t run until that finishes, and the knockback starts late. That would explain it being inconsistent, since it depends on what each enemy happened to be doing. Is there a Wait command, or a Set Movement Route on This Event with Wait ticked, anywhere in the attack logic at the top of the page? A screenshot of that part would help, it’s the one piece of the page I haven’t seen.
On the blocking idea, the knockback routes have Skip If Cannot Move on, so another enemy in the way makes it stop short rather than wait. For 2 I’d also check that Form 4’s branch in the enemy has the two snap lines and the Set Event Location above its route like the punch does. Without them, a hit that lands mid step waits for that step to finish first, which is the same pause the punch had before the snap went in.
- If ATTACKING goes ON and the collision gets placed before the charge up, it’s live but invisible while the hop or step back plays, so an enemy on that tile takes the hit before the blast shows. I’d move both down to right above the blast route, so the collision just follows you during the charge up:
◆Control Variables: #0197 ATTACK TYPE = 5
(your Move Power line, unchanged)
(your charge up, unchanged)
◆Control Variables: AtkX = Map X of Player
◆Control Variables: AtkY = Map Y of Player
◆Control Variables: AtkDir = Direction of Player
(your four AtkDir branches, unchanged)
◆Control Switches: #0181 ATTACKING = ON
◆Set Movement Route: Attack collision (Skip, Wait)
(your blast route, unchanged)
◆Control Switches: #0181 ATTACKING = OFF
◆Control Switches: #0182 MOVEMENT ATTACK = OFF
If the charge up is RecoilGo turning ON, the parallel doesn’t wait for it on its own, so a Wait for however long the hop or step takes goes right after it. If the order already looks like this, a screenshot of Form 1’s S block would help.
- Is Through still ticked on whatever’s doing the wandering? An event without Through gets blocked by every other event no matter its priority. Priority only changes whether it bumps into the player. So Move at Random keeps picking directions that aren’t blocked, which would look like it’s avoiding them. Also, is it the real Attack collision wandering or a copy from the spawner? The enemies only check the real one, so a copy would never hit anything.
- Enemies only re arm when ATTACKING goes OFF, and the trap holds it ON the whole time it’s down, so each one gets hit once. What I’d do is number the hits. A Hit Count variable goes up whenever an attack wants to hit again, and each enemy remembers the last number it got hit by in SV: Last Hit. ATTACKING going OFF still re arms everything like before, so the attacks that already work don’t change.
For the trap, the new block at the top re arms an enemy whenever it’s off the trap’s tile, so walking back on hits again. It needs the trap to have its own ATTACK TYPE number, so if it’s sharing one with another attack, give it a new one and copy that attack’s branch for it.
This is the whole hit section with Hit Count in, plus the knockback change for 11. SV: Last Hit is a new self variable, Hit Count is a normal one, and Self Switch B isn’t used anymore, so that letter’s free again. Parts in parentheses are unchanged:
◆If: ATTACKING is ON
◆If: ATTACK TYPE = (your trap's type)
◆Control Variables: #0192 SV: AtkCol X = Map X of Attack collision
◆Control Variables: #0193 SV: AtkCol Y = Map Y of Attack collision
◆Control Variables: #0194 SV: My X = Map X of This Event
◆Control Variables: #0195 SV: My Y = Map Y of This Event
◆If: SV: AtkCol X ≠ SV: My X
◆Control Variables: #0XXX SV: Last Hit = -1
◆End
◆If: SV: AtkCol Y ≠ SV: My Y
◆Control Variables: #0XXX SV: Last Hit = -1
◆End
◆End
◆If: SV: Last Hit ≠ Hit Count
◆Control Variables: #0192 SV: AtkCol X = Map X of Attack collision
◆Control Variables: #0193 SV: AtkCol Y = Map Y of Attack collision
(your ATTACK TYPE = 2 position block, unchanged)
◆Control Variables: #0194 SV: My X = Map X of This Event
◆Control Variables: #0195 SV: My Y = Map Y of This Event
(your five damage lines, unchanged)
◆If: ATTACK TYPE = 4
◆Control Variables: #0189 SV: This event HP -= SV: Damage
◆Play SE: Blow1 (90, 150, 0)
◆Set Movement Route: This Event
: Blend Mode: Additive
: Wait: 30 frames
: Blend Mode: Normal
◆Control Variables: #0XXX SV: Last Hit = Hit Count
◆End
◆If: SV: AtkCol X = SV: My X
◆If: SV: AtkCol Y = SV: My Y
◆If: ATTACK TYPE = 0
◆Common Event: DAMAGE SFX
◆Common Event: SCREENSHAKE SMALL
◆Control Variables: #0189 SV: This event HP -= SV: Damage
◆Control Variables: #0194 SV: My X = Math.round(this.character(0)._realX)
◆Control Variables: #0195 SV: My Y = Math.round(this.character(0)._realY)
◆Set Event Location: This Event, ({SV: My X},{SV: My Y})
◆Script: this.character(0).setDirection(10 - $gameMap.event(XX).direction());
◆Set Movement Route: This Event (Skip, Wait)
: Speed: 6
: 1 Step Backward
: 1 Step Backward
: Speed: 4
◆End
◆If: ATTACK TYPE = 1
◆Control Variables: #0194 SV: My X = Math.round(this.character(0)._realX)
◆Control Variables: #0195 SV: My Y = Math.round(this.character(0)._realY)
◆Set Event Location: This Event, ({SV: My X},{SV: My Y})
◆Script: this.character(0).setDirection(10 - $gameMap.event(XX).direction());
◆Set Movement Route: This Event (Skip, Wait)
: Blend Mode: Normal
: Speed: 5
: SE: Blow5 (80, 100, 0)
: 1 Step Backward
: Speed: 4
: Wait: 5 frames
: Blend Mode: Normal
◆End
(your ATTACK TYPE = 2 branch, unchanged)
(your ATTACK TYPE = 3 branch, unchanged)
(your ATTACK TYPE = 5 branch, unchanged)
(your trap's branch, unchanged)
◆If: ATTACK TYPE ≠ 1
◆If: ATTACK TYPE ≠ 3
◆Control Variables: #0XXX SV: Last Hit = Hit Count
◆End
◆End
◆End
◆End
◆End
: Else
◆Control Variables: #0XXX SV: Last Hit = -1
◆End
- No, with Hit Count in, the triple blast just needs one line between blasts:
(blast 1, unchanged)
◆Control Variables: #0XXX Hit Count += 1
(blast 2, unchanged)
◆Control Variables: #0XXX Hit Count += 1
(blast 3, unchanged)
Turning ATTACKING off in between would re arm the enemies too, but the collision’s follow logic would grab it for that frame.
- Form 8’s basic goes inside the same two checks from 1, so a second press while it’s running gets ignored. If it still hangs after that, I’m wondering if there’s a Set Movement Route on the Player with Wait ticked inside it. TurnInPlace only lets Player routes from a parallel move along while an arrow is held, which would match it clearing when you press one. If that route is just there as a pause, a plain Wait command does the same job without touching the Player.
- Is there something behind the enemy when it gets stuck, like a wall or another enemy? The bounce has Skip If Cannot Move on, so with no room it stays on the shield tile, and since the shield checks again every pass, it keeps getting bounced in place. What would you want to happen when there’s no room behind it? Take damage, slide to the side, or just stay pinned until the shield drops?
- The punch route has Wait on, so the parallel sits there until the swing is done and never sees the next press. Taking the Wait off and handing ATTACKING OFF to a timer, the same shape as your ActionTimer, frees it up. Each press also bumps Hit Count, so every swing can land. This goes at the top of the parallel with your other timers:
◆If: Punch Timer > 0
◆Control Variables: #0XXX Punch Timer -= 1
◆If: Punch Timer = 0
◆Control Switches: #0181 ATTACKING = OFF
◆End
◆End
And the punch, inside whatever form check it sits in now:
◆If: MOVEMENT ATTACK is OFF
◆If: Script: Input.isTriggered("ok") && (!$gameSwitches.value(181) || $gameVariables.value(XXX) > 0)
◆Control Switches: #0181 ATTACKING = ON
◆Control Variables: #0197 ATTACK TYPE = 0
(your Move Power line, unchanged)
◆Control Variables: #0XXX Hit Count += 1
◆Play SE: Blow1
◆Control Variables: AtkX = Map X of Player
◆Control Variables: AtkY = Map Y of Player
◆Control Variables: AtkDir = Direction of Player
◆If: AtkDir = 2
◆Set Event Location: Attack collision, ({AtkX},{AtkY}), Down
◆End
◆If: AtkDir = 4
◆Set Event Location: Attack collision, ({AtkX},{AtkY}), Left
◆End
◆If: AtkDir = 6
◆Set Event Location: Attack collision, ({AtkX},{AtkY}), Right
◆End
◆If: AtkDir = 8
◆Set Event Location: Attack collision, ({AtkX},{AtkY}), Up
◆End
◆Set Movement Route: Attack collision (Skip)
(your punch route, unchanged)
◆Control Variables: #0XXX Punch Timer = 15
◆End
◆End
The Script reads as Z pressed, and either nothing is running or the only thing running is a punch. XXX in it is Punch Timer’s variable ID. 15 is a guess at how long your punch route takes. It needs to be a little longer than the route so the Transparent ON at the end runs before ATTACKING turns OFF, so raise it if the collision ever stays visible after a punch. If Transparent ON is in a separate route after the punch right now, move it to the end of this one.
- I think it’s the Turn toward Player in the knockback. It picks up or down whenever the enemy is as far above or below you as it is left or right, so on a left or right swing, an enemy that walks into the side of the collision can get pushed up or down instead. The hit section in 6 swaps it in the punch and shield branches for a Script line that turns the enemy to face back along the hit, so Step Backward carries it the way the collision was moving. 10 minus a direction is its opposite, and XX is the Attack collision’s event ID.