Sprite *ComposerEngine::addSprite(uint16 id, uint16 animId, uint16 zorder, const Common::Point &pos) { Sprite sprite; bool foundSprite = false; // re-use old sprite, if any (the BMAP for this id might well have // changed in the meantime, but the scripts depend on that!) for (Common::List<Sprite>::iterator i = _sprites.begin(); i != _sprites.end(); i++) { if (i->_id != id) continue; if (getGameType() == GType_ComposerV1) { if (i->_animId != animId) continue; } else if (i->_animId && animId && (i->_animId != animId)) continue; dirtySprite(*i); // if the zordering is identical, modify it in-place if (i->_zorder == zorder) { i->_animId = animId; i->_pos = pos; dirtySprite(*i); return &(*i); } // otherwise, take a copy and remove it from the list sprite = *i; foundSprite = true; _sprites.erase(i); break; } sprite._animId = animId; sprite._zorder = zorder; sprite._pos = pos; if (!foundSprite) { sprite._id = id; if (!initSprite(sprite)) { debug(1, "ignoring addSprite on invalid sprite %d", id); return NULL; } } dirtySprite(sprite); for (Common::List<Sprite>::iterator i = _sprites.begin(); i != _sprites.end(); i++) { if (sprite._zorder <= i->_zorder) continue; // insert *before* this sprite _sprites.insert(i, sprite); --i; return &(*i); } _sprites.push_back(sprite); return &_sprites.back(); }
void ComposerEngine::setBackground(uint16 id) { for (Common::List<Sprite>::iterator i = _sprites.begin(); i != _sprites.end(); i++) { if (i->_id) continue; dirtySprite(*i); i->_surface.free(); i->_id = id; if (!initSprite(*i)) error("failed to set background %d", id); dirtySprite(*i); i->_id = 0; return; } Sprite *background = addSprite(id, 0, 0xffff, Common::Point()); if (background) background->_id = 0; }
void ComposerEngine::removeSprite(uint16 id, uint16 animId) { for (Common::List<Sprite>::iterator i = _sprites.begin(); i != _sprites.end(); i++) { if (!i->_id || (id && i->_id != id)) continue; if (i->_animId && animId && (i->_animId != animId)) continue; dirtySprite(*i); i->_surface.free(); i = _sprites.reverse_erase(i); if (id) break; } }