32 lines
1.2 KiB
C
32 lines
1.2 KiB
C
#include <gai_fsm.h>
|
|||
|
|
|
||
|
|
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);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|