bool ModifyBuildingAction::doRedo() { bool bRetVal = true; OBJ_INFO_PTR_LIST::EIterator iter2 = buildingPtrs.Begin(); OBJ_APPEAR_LIST::EIterator iter3 = buildingAppearanceCopies.Begin(); OBJ_ID_LIST::EIterator iter4 = buildingIDs.Begin(); for ( OBJ_INFO_PTR_LIST::EIterator iter = buildingCopyPtrs.Begin(); !iter.IsDone(); iter++) { //EditorObject *pBuilding = (*iter2); EditorObject *pBuilding = EditorObjectMgr::instance()->getObjectAtLocation((*iter4).x, (*iter4).y); if (pBuilding) { EditorObject *pBuildingSwap = (*iter)->Clone(); ObjectAppearance AppearanceSwap = (*iter3); (*iter)->CastAndCopy(*pBuilding); (*iter3) = (*(pBuilding->appearance())); (*pBuilding).CastAndCopy(*pBuildingSwap); (*(pBuilding->appearance())) = AppearanceSwap; delete pBuildingSwap; { /*this is just to make sure the visuals are up-to-date*/ bool d = pBuilding->getDamage(); pBuilding->setDamage(!d); pBuilding->setDamage(d); } long row, column; pBuilding->getCells(row, column); EditorObjectMgr::instance()->moveBuilding(pBuilding, row, column); (*iter4).x = pBuilding->getPosition().x; (*iter4).y = pBuilding->getPosition().y; } else { gosASSERT(false); } iter2++; iter3++; iter4++; } return bRetVal; }
void ModifyBuildingAction::addBuildingInfo(EditorObject& info) { if ((0 < buildingPtrs.Count()) && (OBJ_INFO_PTR_LIST::INVALID_ITERATOR != buildingPtrs.Find(&info))) { return; } // if we made it here, it isn't in there already EditorObject *pInfoCopy = info.Clone(); buildingCopyPtrs.Append( pInfoCopy ); buildingAppearanceCopies.Append(*(info.appearance())); buildingPtrs.Append( &info ); CObjectID id; id.x = info.getPosition().x; id.y = info.getPosition().y; buildingIDs.Append(id); }