#ifndef ACTIONS_H #define ACTIONS_H #include #include #include enum A_TYPE { A_PLACE, A_MOVE }; typedef uint32_t action_t; #define TYPE_SHIFT 24 #define LOC_SHIFT 16 #define DATA0_SHIFT 8 #define GET_TYPE(a) (enum A_TYPE)((a)>>TYPE_SHIFT) #define GET_LOC(a) (int8_t)(((a)>>LOC_SHIFT) & 0xFF) #define GET_DATA0(a) (uint8_t)(((a)>>DATA0_SHIFT) & 0xFF) #define GET_DATA1(a) (uint8_t)((a) & 0xFF) typedef struct action_node_s { struct action_node_s *next; action_t action; } action_node_t; typedef struct action_list_s { struct action_node_s *head, *tail; uint32_t length; } action_list_t; extern int8_t move_deltas[4]; void action_list_init(void); void action_list_free(action_list_t *list); action_list_t *action_list_generate(void); int action_move_to_front(const action_t action, action_list_t *list); void action_take(const action_t action); void action_undo(const action_t action); void action_to_ptn(const action_t action, char* out_ptn); #endif