#include static os_int_t FindNextState(gai_fsm_t* self, os_list_t* transitions, void* ud){ os_list_node_t * p_node = 0; for(p_node = transitions->next; p_node!=transitions; p_node= p_node->next){ gai_fsm_transition_t* p_transition = os_list_member_of(p_node, gai_fsm_transition_t, node); if(p_transition->evaluator(self, p_transition, ud)){ return p_transition->to_state_id; } } return -1; } void gai_fsm_update(gai_fsm_t* self, void* userdata){ if(!self->current_state_p){ return; } gai_action_status_t status = gai_fsm_status(self); if(status==kGaiActionStatus_Running){ gai_action_Update(&self->current_state_p->action, userdata); }else if(status==kGaiActionStatus_Terminated){ os_int_t to_state_id = FindNextState(self, &self->current_state_p->transition_list, userdata); gai_fsm_state_t* p_next_state = gai_fsm_find_state(self, to_state_id); if(p_next_state){ gai_action_Cleanup(&self->current_state_p->action); self->current_state_p = p_next_state; gai_action_Initialize(&self->current_state_p->action); } } }