The player can pick what type of character they want to be, each having different stats. Instead of having the agility/movement stat control how many squares you can move each turn, I have it control how many turns you must wait to perform an action. Each turn can be classified as either a WAIT or an ACTION turn. WAIT frames just decrement the actors counter and return. ACTION turns can be whatever.
Originally, I had it perform one actor's turn per frame. This made the player input response lag. It would only register on NEW presses when the player was on an ACTION turn, causing a lot of NEW presses to become considered OLD by the time the player's ACTION turn came around.
I then had it execute as many turns each frame as it takes to get to the first ACTION turn for any actor. This greatly reduced the dropped input, but not completely. I'm assuming some sort of buffering would be needed. You can't buffer everything, otherwise pressing a direction would cause the player to shoot across the screen until it hit something solid. Maybe only start buffering after all buttons have been released? Maybe the entire thing is flawed. I thought about running turns until a player ACTION turn is hit, but the processing *could* take multiple frames, and would mess up the sprite0 hit.
Here's a diagram breaking down the problem. The numbers inside {} show the value of the counter after that turn is executed, ACTION denotes that the actor does something (like moving or attacking), and the "_state" denotes state changes within the actor itself.
note: All actors start in wait_state. When a player ACTION turn hits, the turn counter is not updated until the player actually does something. It will not skip the player.
Code: Select all
=====Frame[00]=====
00: player {init=5} enemy1 {init=3} enemy2 {init=1}
01: player {dec=4} enemy1 {dec=2} enemy2 {dec=0:action_state}
02: player {dec=3} enemy1 {dec=1} enemy2 {reset=1:ACTION:wait_state}
=====Frame[01]=====
03: player {dec=2} enemy1 {dec=0:action_state} enemy2 {dec=0:action_state}
04: player {dec=1} enemy1 {reset=3:ACTION:wait_state}
=====Frame[02]=====
05: enemy2 {reset=1:ACTION:wait_state}
=====Frame[03]=====
06: player {dec=0:action_state} enemy1 {dec=2} enemy2 {dec=0:action_state}
07: player {reset=5:ACTION:wait_state}
=====Frame[04]=====
08: enemy1 {dec=1} enemy2 {reset=1:ACTION:wait_state}
=====Frame[05]=====
09: player {dec=4} enemy1 {dec=0:action_state} enemy2 {dec=0:action_state}
10: player {dec=3} enemy1 {reset=3:ACTION:wait_state}
=====Frame[06]=====
11: enemy2 {reset=1:ACTION:wait_state}
=====Frame[07]=====
12: player {dec=2} enemy1 {dec=2} enemy2 {dec=0:action_state}
13: player {dec=1} enemy1 {dec=1} enemy2 {reset=1:ACTION:wait_state}
=====Frame[08]=====
14: player {dec=0:action_state} enemy1 {dec=0:action_state} enemy2 {dec=0:action_state}
=====Frame[09]=====
15: player {reset=5:ACTION:wait_state}
=====Frame[10]=====
16: enemy1 {reset=3:ACTION:wait_state}
=====Frame[11]=====
17: enemy2 {reset=1:ACTION:wait_state}
*can be