void CBotIf :: RestoreState(CBotStack* &pj, BOOL bMain) { if ( !bMain ) return; CBotStack* pile = pj->RestoreStack(this); // ajoute un élément à la pile if ( pile == NULL ) return; // selon la reprise, on peut être dans l'un des 2 états if( pile->GivState() == 0 ) { // évalue la condition m_Condition->RestoreState(pile, bMain); // interrompu ici ! return; } // second état, évalue les instructions associées // le résultat de la condition est sur la pile if ( pile->GivVal() == TRUE ) // condition était vraie ? { if ( m_Block != NULL ) // bloc peut être absent m_Block->RestoreState(pile, bMain); // interrompu ici ! } else { if ( m_BlockElse != NULL ) // s'il existe un bloc alternatif m_BlockElse->RestoreState(pile, bMain); // interrompu ici ! } }
BOOL CBotIf :: Execute(CBotStack* &pj) { CBotStack* pile = pj->AddStack(this); // ajoute un élément à la pile // ou le retrouve en cas de reprise // if ( pile == EOX ) return TRUE; if ( pile->IfStep() ) return FALSE; // selon la reprise, on peut être dans l'un des 2 états if( pile->GivState() == 0 ) { // évalue la condition if ( !m_Condition->Execute(pile) ) return FALSE; // interrompu ici ? // termine s'il y a une erreur if ( !pile->IsOk() ) { return pj->Return(pile); // transmet le résultat et libère la pile } // passe dans le second état if (!pile->SetState(1)) return FALSE; // prêt pour la suite } // second état, évalue les instructions associées // le résultat de la condition est sur la pile if ( pile->GivVal() == TRUE ) // condition était vraie ? { if ( m_Block != NULL && // bloc peut être absent !m_Block->Execute(pile) ) return FALSE; // interrompu ici ? } else { if ( m_BlockElse != NULL && // s'il existe un bloc alternatif !m_BlockElse->Execute(pile) ) return FALSE; // interrompu ici } // transmet le résultat et libère la pile return pj->Return(pile); }