For the complete documentation index, see llms.txt. This page is also available as Markdown.

State machines

Use enums for named states and one transition owner:

state-machine.gpc
enum {
    STATE_IDLE,
    STATE_ARMED,
    STATE_ACTIVE,
    STATE_COOLDOWN
};

int state;

main {
    switch(state) {
        case STATE_IDLE: {
            if(event_press(PS5_CROSS)) state = STATE_ARMED;
            break;
        }
        case STATE_ARMED: {
            if(get_ival(PS5_R2)) state = STATE_ACTIVE;
            if(event_press(PS5_CIRCLE)) state = STATE_IDLE;
            break;
        }
        case STATE_ACTIVE: {
            if(!get_ival(PS5_R2)) state = STATE_COOLDOWN;
            break;
        }
        case STATE_COOLDOWN: {
            if(get_ptime(PS5_R2) > 250) state = STATE_IDLE;
            break;
        }
        default: {
            state = STATE_IDLE;
            break;
        }
    }
}

Avoid several independent if blocks that can all transition the same state in one cycle. Define precedence for simultaneous events.

Last updated