void MotionMaster::Mutate(MovementGenerator *m, MovementSlot slot) { if (MovementGenerator *curr = Impl[slot]) { bool wasAtTop = (i_top == slot); Impl[slot] = NULL; // in case a new one is generated in this slot during directdelete removeEmptyTops(); if (wasAtTop && (m_cleanFlag & MMCF_UPDATE)) DelayedDelete(curr); else DirectDelete(curr); } if (i_top < slot) { i_top = slot; } Impl[slot] = m; if (i_top > slot) needInit[slot] = true; else { needInit[slot] = false; m->Initialize(*i_owner); } }
void MotionMaster::DelayedClean() { while (size() > 1) { MovementGenerator *curr = top(); pop(); removeEmptyTops(); if (curr) DelayedDelete(curr); } }
MotionMaster::~MotionMaster() { // clear ALL movement generators (including default) while (!empty()) { MovementGenerator *curr = top(); pop(); removeEmptyTops(); if (curr) DirectDelete(curr); } }
void MotionMaster::DelayedExpire() { if (size() > 1) { MovementGenerator *curr = top(); pop(); removeEmptyTops(); DelayedDelete(curr); } while (!top()) --i_top; }
void MotionMaster::DirectClean(bool reset) { while (size() > 1) { MovementGenerator *curr = top(); pop(); removeEmptyTops(); if (curr) DirectDelete(curr); } if (needInitTop()) InitTop(); else if (reset) top()->Reset(*i_owner); }
void MotionMaster::DirectExpire(bool reset) { if (size() > 1) { MovementGenerator *curr = top(); pop(); removeEmptyTops(); DirectDelete(curr); } while (!top()) --i_top; if (empty()) Initialize(); else if (needInitTop()) InitTop(); else if (reset) top()->Reset(*i_owner); }