void MainWindow::on_actionClear_NPC_garbadge_triggered() { if(activeChildWindow() != WND_Level) return; LevelEdit *box = activeLvlEditWin(); if(!box) return; if(!box->sceneCreated) return; QList<LevelNPC> _fine_npcs; QList<LevelNPC> _found_garbage; for(int i = 0; i < box->LvlData.npc.size(); i++) { LevelNPC npc = box->LvlData.npc[i]; bool fine = true; for(int j = 0; j < _fine_npcs.size(); j++) { if(npc.id != _fine_npcs[j].id) continue; if(npc.x != _fine_npcs[j].x) continue; if(npc.y != _fine_npcs[j].y) continue; if(npc.layer != _fine_npcs[j].layer) continue; if(npc.generator != _fine_npcs[j].generator) continue; if(npc.msg != _fine_npcs[j].msg) continue; if(npc.event_activate != _fine_npcs[j].event_activate) continue; if(npc.event_die != _fine_npcs[j].event_die) continue; if(npc.event_talk != _fine_npcs[j].event_talk) continue; if(npc.event_emptylayer != _fine_npcs[j].event_emptylayer) continue; fine = false; _found_garbage.push_back(npc); break; } if(fine) _fine_npcs.push_back(npc); } if(_found_garbage.isEmpty()) QMessageBox::information(this, tr("NPC garbage clean-up"), tr("Everything is fine, level has no NPC garbage!"), QMessageBox::Ok); else { QMessageBox::StandardButton x = QMessageBox::question(this, tr("NPC garbage clean-up"), tr("Found %1 junk NPC's. Do you want to remove them?\nPress \"Help\" to show info about the junk NPCs we found.").arg(_found_garbage.size()), QMessageBox::Yes | QMessageBox::No | QMessageBox::Help); if((x != QMessageBox::Yes) && (x != QMessageBox::Help)) return; bool help = (x == QMessageBox::Help); LvlScene *sc = box->scene; sc->clearSelection(); LvlScene::PGE_ItemList items = sc->items(); LevelData removedItems; QPointF jumpTo; for(int i = 0; i < items.size(); i++) { if(items[i]->data(ITEM_TYPE).toString() == "NPC") { ItemNPC *npc = qgraphicsitem_cast<ItemNPC *>(items[i]); if(!npc) continue; for(int j = 0; j < _found_garbage.size(); j++) { if(npc->m_data.meta.array_id == _found_garbage[j].meta.array_id) { if(help) //Select & jump { npc->setSelected(true); jumpTo = npc->scenePos(); } else //Delete actual NPC { removedItems.npc.push_back(npc->m_data); npc->removeFromArray(); delete npc; } break; } } } } if(!help) { if(!removedItems.npc.isEmpty()) sc->m_history->addRemove(removedItems); QMessageBox::information(this, tr("NPC garbage clean-up"), tr("NPC garbabe has been removed!\nThis operation can be undone with Ctrl+Z or Edit/Undo action."), QMessageBox::Ok); } else { box->goTo(jumpTo.x(), jumpTo.y(), true, QPoint(0, 0), true); } } }