void MainWindow::on_actionGotoLeftTop_triggered() { qApp->setActiveWindow(this); int WinType = activeChildWindow(); if(WinType==1) { LevelEdit* edit = activeLvlEditWin(); if(!edit) return; int SectionId = edit->LvlData.CurSection; int xb = edit->LvlData.sections[SectionId].size_left; int yb = edit->LvlData.sections[SectionId].size_top; edit->goTo(xb, yb, false, QPoint(-10, -10)); } }
void MainWindow::on_actionGotoTopRight_triggered() { qApp->setActiveWindow(this); int WinType = activeChildWindow(); if(WinType==1) { LevelEdit* edit = activeLvlEditWin(); if(!edit) return; int SectionId = edit->LvlData.CurSection; int xb = edit->LvlData.sections[SectionId].size_right - edit->scene->_viewPort->viewport()->width() + 10; int yb = edit->LvlData.sections[SectionId].size_top; edit->goTo(xb, yb, false, QPoint(10, -10)); } }
void MainWindow::on_actionGotoLeftBottom_triggered() { if (activeChildWindow()==1) { LevelEdit* edit = activeLvlEditWin(); if(!edit) return; int SectionId = edit->LvlData.CurSection; int xb = edit->LvlData.sections[SectionId].size_left; int yb = edit->LvlData.sections[SectionId].size_bottom - edit->scene->_viewPort->viewport()->height() + 10; edit->goTo(xb, yb, false, QPoint(-10, 10)); } else if (activeChildWindow()==3) { WorldEdit *e=activeWldEditWin(); if(e) e->ResetPosition(); } }
void MainWindow::on_actionNewLevel_triggered() { //Check if data configs are valid if( configs.check() ) { WriteToLog(QtCriticalMsg, QString("Error! *.INI configs not loaded")); QMessageBox::warning(this, tr("Configuration is loaded with errors"), tr("Cannot create level file:\nConfiguration package loaded with errors.").arg(ConfStatus::configPath)); //Show configuration status window on_actionCurConfig_triggered(); return; } LevelEdit *child = createLvlChild(); if(child->newFile(configs, GlobalSettings::LvlOpts)) { child->show(); child->updateGeometry(); child->ResetPosition(); updateMenus(true); SetCurrentLevelSection(0); on_actionSelect_triggered(); dock_LvlWarpProps->init(); dock_LvlLayers->setLayersBox(); if(GlobalSettings::autoPlayMusic) ui->actionPlayMusic->setChecked(true); LvlMusPlay::musicForceReset=true; //reset musics on_actionPlayMusic_triggered(ui->actionPlayMusic->isChecked()); } else { child->show(); if(activeChildWindow()==1) activeLvlEditWin()->LvlData.modified = false; ui->centralWidget->activeSubWindow()->close(); } }
bool MainWindow::getCurrentSceneCoordinates(qreal &x, qreal &y) { if(activeChildWindow() == 1) { LevelEdit* edit = activeLvlEditWin(); if(!edit) return false; QPointF coor = edit->getGraphicsView()->mapToScene(0,0); x = coor.x(); y = coor.y(); return true; } else if(activeChildWindow() == 3) { WorldEdit* edit = activeWldEditWin(); if(!edit) return false; QPointF coor = edit->getGraphicsView()->mapToScene(0,0); x = coor.x(); y = coor.y(); return true; } return false; }
void MainWindow::OpenFile(QString FilePath, bool addToRecentList) { if(m_isFileReloading) return; m_isFileReloading = true; BoolReseter rst(&m_isFileReloading); Q_UNUSED(rst); if(!m_isAppInited) return; qApp->setActiveWindow(this); //Check if data configs are valid if( configs.check() ) { LogCritical(QString("Error! *.INI configs not loaded")); QMessageBox::warning(this, tr("Configuration is loaded with errors"), tr("Cannot open file:\n" "Configuration package loaded with errors.") .arg(ConfStatus::configPath)); //Show configuration status window on_actionCurConfig_triggered(); return; } QMdiSubWindow *newSubWin = NULL; QMdiSubWindow *existing = findOpenedFileWin(FilePath); if (existing) { ui->centralWidget->setActiveSubWindow(existing); return; } QFile file(FilePath); if (!file.open(QIODevice::ReadOnly)) { QMessageBox::critical(this, tr("File open error"), tr("Can't open the file: %1").arg(file.errorString()), QMessageBox::Ok); return; } QFileInfo in_1(FilePath); GlobalSettings::openPath = in_1.absoluteDir().absolutePath(); if((in_1.suffix().toLower() == "lvl")||(in_1.suffix().toLower() == "lvlx")) { LevelData FileData; LogDebug("> parsing level file format"); if( !FileFormats::OpenLevelFile(FilePath, FileData) ) { formatErrorMsgBox(FilePath, FileData.meta.ERROR_info, FileData.meta.ERROR_linenum, FileData.meta.ERROR_linedata); return; } LogDebug("File was read!"); FileData.meta.filename = util::getBaseFilename(in_1.fileName()); FileData.meta.path = in_1.absoluteDir().absolutePath(); FileData.playmusic = GlobalSettings::autoPlayMusic; file.close(); LogDebug("Creating of sub-window"); LevelEdit *child = createLvlChild(&newSubWin); if ( child->loadFile(FilePath, FileData, configs, GlobalSettings::LvlOpts) ) { child->show(); updateMenus(newSubWin, true); child->updateGeometry(); child->ResetPosition(); dock_LvlItemBox->setLvlItemBoxes(false, false); statusBar()->showMessage(tr("Level file loaded"), 2000); SetCurrentLevelSection(0); dock_LvlWarpProps->init(); dock_LvlLayers->setLayersBox(); if(GlobalSettings::autoPlayMusic) ui->actionPlayMusic->setChecked(true); on_actionPlayMusic_triggered(ui->actionPlayMusic->isChecked()); } else { LogDebug(">>File loading aborted"); //child->show(); child->LvlData.meta.modified = false; newSubWin->close(); LogDebug(">>Windows closed"); } } else if((in_1.suffix().toLower() == "wld")||(in_1.suffix().toLower() == "wldx")) { WorldData FileData; if( !FileFormats::OpenWorldFile( FilePath, FileData ) ) { formatErrorMsgBox(FilePath, FileData.meta.ERROR_info, FileData.meta.ERROR_linenum, FileData.meta.ERROR_linedata); return; } file.close(); WorldEdit *child = createWldChild(&newSubWin); if ( child->loadFile(FilePath, FileData, configs, GlobalSettings::LvlOpts) ) { child->show(); updateMenus(newSubWin, true); child->updateGeometry(); child->ResetPosition(); dock_WldItemBox->setWldItemBoxes(false, false); dock_WldSettingsBox->setCurrentWorldSettings(); if(FileData.HubStyledWorld) { dock_WldSettingsBox->setVisible(true); dock_WldSettingsBox->raise(); } statusBar()->showMessage(tr("World map file loaded"), 2000); } else { LogDebug(">>File loading aborted"); child->close(); newSubWin->close(); LogDebug(">>Windows closed"); } } else if(in_1.suffix().toLower() == "txt") { NPCConfigFile FileData; if( !FileFormats::ReadNpcTXTFileF(FilePath, FileData) ) { QMessageBox::critical(this, QObject::tr("File open error"), tr("Can't read the file"), QMessageBox::Ok); return; } if( !FileData.unknownLines.isEmpty() ) { QMessageBox::warning(this, QObject::tr("Unknown values are presented"), QObject::tr("Your file have an unknown values which will be removed\n" " when you will save file") + QString("\n====================================\n" "%1").arg(FileData.unknownLines), QMessageBox::Ok); } NpcEdit *child = createNPCChild(&newSubWin); if (child->loadFile(FilePath, FileData)) { statusBar()->showMessage(tr("NPC Config loaded"), 2000); child->show(); updateMenus(newSubWin, true); } else { child->close(); newSubWin->close(); } } else if(in_1.suffix().toLower() == "sav") { GamesaveData FileData; QString statistics; if(!FileFormats::ReadSMBX64SavFileF( FilePath, FileData)) { formatErrorMsgBox( FilePath, FileData.meta.ERROR_info, FileData.meta.ERROR_linenum, FileData.meta.ERROR_linedata ); return; } statistics+= QString("SMBX Game Save file version %1\n\n").arg(FileData.meta.RecentFormatVersion); if(FileData.gameCompleted) statistics+= " ====This game was completed====\n\n"; statistics+= QString("Lives: %1, Coins:%2, ").arg(FileData.lives).arg(FileData.coins); statistics+= QString("Total stars: %1, Gotten stars: %2\n") .arg(FileData.totalStars) .arg(FileData.gottenStars.size()); statistics+= QString("Position X=%1, Y=%2\n") .arg(FileData.worldPosX) .arg(FileData.worldPosY); if(FileData.musicID>0) { long item=configs.getMusWldI(FileData.musicID); if(item>=0) { statistics+= QString("Current music: %1\n\n").arg(configs.main_music_wld[item].name); } } statistics += "\n===========Players:============\n"; for(int i=0; i<FileData.characterStates.size();i++) { if(i<configs.main_characters.size()) statistics += QString("%1:\n").arg(configs.main_characters[i].name); else statistics += QString("<unknown character>:\n"); statistics += QString("Health: %1, ").arg(FileData.characterStates[i].health); statistics += QString("Power-UP: %1, ").arg(FileData.characterStates[i].state); switch(FileData.characterStates[i].mountType) { case 0: break; case 1: statistics += QString("Mounted vehicle: Shoe - "); switch(FileData.characterStates[i].mountID) { case 1: statistics += QString("Kuribo's (green)");break; case 2: statistics += QString("Podoboo's (red)");break; case 3: statistics += QString("Lakitu's (blue)");break; default: statistics += QString("of God Power :D");break; } break; case 3: statistics += QString("Mounted vehicle: Yoshi");break; default: statistics += QString("Mounted vehicle: <unknown>");break; } if( (FileData.characterStates[i].itemID>0) && configs.main_npc.contains(FileData.characterStates[i].itemID) ) { statistics += QString("%2Has item: %1") .arg(configs.main_npc[FileData.characterStates[i].itemID].setup.name) .arg(FileData.characterStates[i].mountType > 0 ? ", ":""); } if(i<FileData.characterStates.size()-1) statistics += "\n----------------------------\n"; } statistics += "\n=========================\n"; if( !FileData.meta.ReadFileValid ) return; QMessageBox::information(this, tr("Game save statistics"), statistics, QMessageBox::Ok); } else { QMessageBox::warning(this, tr("Bad file"), tr("This file have unknown extension"), QMessageBox::Ok); return; } // Add to recent fileList if(addToRecentList){ AddToRecentFiles(FilePath); SyncRecentFiles(); } }
//Reload opened file data void MainWindow::on_actionReload_triggered() { if(_is_reloading) return; _is_reloading=true; BoolReseter rst(&_is_reloading); Q_UNUSED(rst); QString filePath; QRect wnGeom; if (activeChildWindow()==1) { LevelData FileData; filePath = activeLvlEditWin()->curFile; if(activeLvlEditWin()->isUntitled) { QMessageBox::warning(this, tr("File not saved"), tr("File doesn't saved on disk."), QMessageBox::Ok); return; } if (!QFileInfo(filePath).exists() ) { QMessageBox::critical(this, tr("File open error"), tr("Can't open the file.\nFile not exist."), QMessageBox::Ok); return; } if(activeLvlEditWin()->LvlData.modified) { QMessageBox::StandardButton ret = QMessageBox::question(this, tr("Reload file and custom stuff"), tr("Do you want to save before reload stuff?"), QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel); if((ret==QMessageBox::Cancel)||(ret==0)) return; else if(ret==QMessageBox::Yes) save(); } //Open level file FileData = FileFormats::OpenLevelFile(filePath); if( !FileData.ReadFileValid ){ statusBar()->showMessage(tr("Reloading error"), 2000); return;} FileData.playmusic = GlobalSettings::autoPlayMusic; activeLvlEditWin()->LvlData.modified = false; QFile file(filePath+".meta"); if(QFileInfo(filePath+".meta").exists()) { if (file.open(QIODevice::ReadOnly)) { QString metaRaw; QTextStream meta(&file); meta.setCodec("UTF-8"); metaRaw = meta.readAll(); if(FileData.metaData.script) { delete FileData.metaData.script; FileData.metaData.script = NULL; } FileData.metaData = FileFormats::ReadNonSMBX64MetaData(metaRaw, filePath+".meta"); } else { QMessageBox::critical(this, tr("File open error"), tr("Can't open the file."), QMessageBox::Ok); } } //Remember last section ID and positions! int lastSection=0; QMap<int, QPair<long, long> > sectionPoss; lastSection = activeLvlEditWin()->LvlData.CurSection; SetCurrentLevelSection(lastSection);//Need to remember position of current section for(int i=0; i<activeLvlEditWin()->LvlData.sections.size(); i++) { LevelSection sct = activeLvlEditWin()->LvlData.sections[i]; sectionPoss[sct.id]=QPair<long, long >(sct.PositionX, sct.PositionY); } activeLvlEditWin()->close();//Close old widget without closing of sub-window //Get pointer to current sub-window QMdiSubWindow *window = ui->centralWidget->activeSubWindow(); //Get geometry of current subwindow wnGeom = ui->centralWidget->activeSubWindow()->geometry(); //delete window->widget(); LevelEdit *chLvlWin = new LevelEdit(window); connect(chLvlWin, SIGNAL(forceReload()), this, SLOT(on_actionReload_triggered())); window->setWidget(chLvlWin); GraphicsWorkspace* gr = static_cast<GraphicsWorkspace *>(chLvlWin->getGraphicsView()); connect(gr, SIGNAL(zoomValueChanged(QString)), zoom, SLOT(setText(QString))); //ui->centralWidget->activeSubWindow()->close(); LevelEdit *child = chLvlWin;//createLvlChild(); LvlMusPlay::setNoMusic(); setMusic(false); if ((bool) (child->loadFile(filePath, FileData, configs, GlobalSettings::LvlOpts))) { child->show(); ui->centralWidget->activeSubWindow()->setGeometry(wnGeom); child->updateGeometry(); child->ResetPosition(); statusBar()->showMessage(tr("Level file reloaded"), 2000); LvlMusPlay::musicForceReset=true; //reset musics updateMenus(true); child->setFocus(); //Restore saved section positions for(int i=0; i<child->LvlData.sections.size(); i++) { if(sectionPoss.contains(child->LvlData.sections[i].id)) { child->LvlData.sections[i].PositionX=sectionPoss[child->LvlData.sections[i].id].first; child->LvlData.sections[i].PositionY=sectionPoss[child->LvlData.sections[i].id].second; } } SetCurrentLevelSection(lastSection); if(GlobalSettings::autoPlayMusic) ui->actionPlayMusic->setChecked(true); } else { WriteToLog(QtDebugMsg, ">>File loading aborted"); child->show(); WriteToLog(QtDebugMsg, ">>Window showed"); if(activeChildWindow()==1) activeLvlEditWin()->LvlData.modified = false; WriteToLog(QtDebugMsg, ">>Option set"); ui->centralWidget->activeSubWindow()->close(); WriteToLog(QtDebugMsg, ">>Windows closed"); } } else if (activeChildWindow()==2) { filePath = activeNpcEditWin()->curFile; QFile fileIn(filePath); if(activeNpcEditWin()->isUntitled) { QMessageBox::warning(this, tr("File not saved"), tr("File doesn't saved on disk."), QMessageBox::Ok); return; } if(activeNpcEditWin()->isModyfied) { QMessageBox::StandardButton ret = QMessageBox::question(this, tr("Reload file and custom stuff"), tr("Do you want to save before reload stuff?"), QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel); if((ret==QMessageBox::Cancel)||(ret==0)) return; else if(ret==QMessageBox::Yes) save(); } if (!fileIn.open(QIODevice::ReadOnly)) { QMessageBox::critical(this, tr("File open error"), tr("Can't open the file."), QMessageBox::Ok); return; } NPCConfigFile FileData = FileFormats::ReadNpcTXTFile(fileIn); if( !FileData.ReadFileValid ) return; wnGeom = ui->centralWidget->activeSubWindow()->geometry(); activeNpcEditWin()->isModyfied = false; activeNpcEditWin()->close(); //NpcEdit *child = createNPCChild(); QMdiSubWindow *npcWindow = ui->centralWidget->activeSubWindow(); NpcEdit *child = new NpcEdit(&configs, npcWindow); npcWindow->setWidget(child); if (child->loadFile(filePath, FileData)) { statusBar()->showMessage(tr("NPC Config reloaded"), 2000); child->show(); ui->centralWidget->activeSubWindow()->setGeometry(wnGeom); updateMenus(true); } else { child->close(); npcWindow->close(); } } else if (activeChildWindow()==3) { WorldData FileData; filePath = activeWldEditWin()->curFile; if(activeWldEditWin()->isUntitled) { QMessageBox::warning(this, tr("File not saved"), tr("File doesn't saved on disk."), QMessageBox::Ok); return; } if (!QFileInfo(filePath).exists() ) { QMessageBox::critical(this, tr("File open error"), tr("Can't open the file.\nFile not exist."), QMessageBox::Ok); return; } if(activeWldEditWin()->WldData.modified){ QMessageBox::StandardButton ret = QMessageBox::question(this, tr("Reload file and custom stuff"), tr("Do you want to save before reload stuff?"), QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel); if((ret==QMessageBox::Cancel)||(ret==0)) return; else if(ret==QMessageBox::Yes) save(); } FileData = FileFormats::OpenWorldFile(filePath); if( !FileData.ReadFileValid ){ statusBar()->showMessage(tr("Reloading error"), 2000); return;} FileData.filename = QFileInfo(filePath).baseName(); FileData.path = QFileInfo(filePath).absoluteDir().absolutePath(); FileData.playmusic = GlobalSettings::autoPlayMusic; activeWldEditWin()->WldData.modified = false; QFile file(filePath+".meta"); if(QFileInfo(filePath+".meta").exists()) { if (file.open(QIODevice::ReadOnly)) { QString metaRaw; QTextStream meta(&file); meta.setCodec("UTF-8"); metaRaw = meta.readAll(); FileData.metaData = FileFormats::ReadNonSMBX64MetaData(metaRaw, filePath+".meta"); } else { QMessageBox::critical(this, tr("File open error"), tr("Can't open the file."), QMessageBox::Ok); } } wnGeom = ui->centralWidget->activeSubWindow()->geometry(); QMdiSubWindow *worldWindow = ui->centralWidget->activeSubWindow(); long posX = activeWldEditWin()->scene->_viewPort->horizontalScrollBar()->value(); long posY = activeWldEditWin()->scene->_viewPort->verticalScrollBar()->value(); activeWldEditWin()->close(); WorldEdit *child = new WorldEdit(worldWindow); connect(child, SIGNAL(forceReload()), this, SLOT(on_actionReload_triggered())); worldWindow->setWidget(child); GraphicsWorkspace* gr = static_cast<GraphicsWorkspace *>(child->getGraphicsView()); connect(gr, SIGNAL(zoomValueChanged(QString)), zoom, SLOT(setText(QString))); if ( (bool)(child->loadFile(filePath, FileData, configs, GlobalSettings::LvlOpts)) ) { child->show(); ui->centralWidget->activeSubWindow()->setGeometry(wnGeom); child->updateGeometry(); child->ResetPosition(); updateMenus(true); dock_WldSettingsBox->setCurrentWorldSettings(); if(FileData.HubStyledWorld) { dock_WldSettingsBox->setVisible(true); dock_WldSettingsBox->raise(); } child->scene->_viewPort->horizontalScrollBar()->setValue(posX); child->scene->_viewPort->verticalScrollBar()->setValue(posY); statusBar()->showMessage(tr("World map file loaded"), 2000); } else { WriteToLog(QtDebugMsg, ">>File loading aborted"); child->show(); WriteToLog(QtDebugMsg, ">>Window showed"); if(activeChildWindow()==3) activeWldEditWin()->WldData.modified = false; WriteToLog(QtDebugMsg, ">>Option set"); ui->centralWidget->activeSubWindow()->close(); WriteToLog(QtDebugMsg, ">>Windows closed"); } } dock_LvlItemBox->clearFilter(); }
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); } } }
void MainWindow::OpenFile(QString FilePath, bool addToRecentList) { if(_is_reloading) return; _is_reloading=true; BoolReseter rst(&_is_reloading); Q_UNUSED(rst); if(!continueLoad) return; qApp->setActiveWindow(this); //Check if data configs are valid if( configs.check() ) { WriteToLog(QtCriticalMsg, QString("Error! *.INI configs not loaded")); QMessageBox::warning(this, tr("Configuration is loaded with errors"), tr("Cannot open file:\nConfiguration package loaded with errors.").arg(ConfStatus::configPath)); //Show configuration status window on_actionCurConfig_triggered(); return; } QMdiSubWindow *existing = findOpenedFileWin(FilePath); if (existing) { ui->centralWidget->setActiveSubWindow(existing); return; } QFile file(FilePath); if (!file.open(QIODevice::ReadOnly)) { QMessageBox::critical(this, tr("File open error"), tr("Can't open the file."), QMessageBox::Ok); return; } QFileInfo in_1(FilePath); GlobalSettings::openPath = in_1.absoluteDir().absolutePath(); if((in_1.suffix().toLower() == "lvl")||(in_1.suffix().toLower() == "lvlx")) { LevelData FileData; WriteToLog(QtDebugMsg, "> parsing level file format"); FileData = FileFormats::OpenLevelFile(FilePath); if( !FileData.ReadFileValid ) return; WriteToLog(QtDebugMsg, "File was read!"); FileData.filename = in_1.baseName(); FileData.path = in_1.absoluteDir().absolutePath(); FileData.playmusic = GlobalSettings::autoPlayMusic; file.close(); WriteToLog(QtDebugMsg, "> Opem meta-file"); file.setFileName(FilePath+".meta"); if(QFileInfo(FilePath+".meta").exists()) { WriteToLog(QtDebugMsg, "> meta-file found, open them!"); if (file.open(QIODevice::ReadOnly)) { QString metaRaw; QTextStream meta(&file); meta.setCodec("UTF-8"); metaRaw = meta.readAll(); if(FileData.metaData.script != NULL) { delete FileData.metaData.script; FileData.metaData.script = NULL; } FileData.metaData = FileFormats::ReadNonSMBX64MetaData(metaRaw, FilePath+".meta"); WriteToLog(QtDebugMsg, "Meta-File was read!"); } else { QMessageBox::critical(this, tr("File open error"), tr("Can't open the file."), QMessageBox::Ok); } } WriteToLog(QtDebugMsg, "Creating of sub-window"); LevelEdit *child = createLvlChild(); if ( (bool)(child->loadFile(FilePath, FileData, configs, GlobalSettings::LvlOpts)) ) { child->show(); child->updateGeometry(); child->ResetPosition(); statusBar()->showMessage(tr("Level file loaded"), 2000); updateMenus(true); SetCurrentLevelSection(0); dock_LvlWarpProps->init(); dock_LvlLayers->setLayersBox(); if(GlobalSettings::autoPlayMusic) ui->actionPlayMusic->setChecked(true); on_actionPlayMusic_triggered(ui->actionPlayMusic->isChecked()); } else { WriteToLog(QtDebugMsg, ">>File loading aborted"); child->show(); if(activeChildWindow()==1) activeLvlEditWin()->LvlData.modified = false; ui->centralWidget->activeSubWindow()->close(); WriteToLog(QtDebugMsg, ">>Windows closed"); } } else if((in_1.suffix().toLower() == "wld")||(in_1.suffix().toLower() == "wldx")) { WorldData FileData; FileData= FileFormats::OpenWorldFile(FilePath); if( !FileData.ReadFileValid ) return; file.close(); file.setFileName(FilePath+".meta"); if(QFileInfo(FilePath+".meta").exists()) { if (file.open(QIODevice::ReadOnly)) { QString metaRaw; QTextStream meta(&file); meta.setCodec("UTF-8"); metaRaw = meta.readAll(); FileData.metaData = FileFormats::ReadNonSMBX64MetaData(metaRaw, FilePath+".meta"); } else { QMessageBox::critical(this, tr("File open error"), tr("Can't open the file."), QMessageBox::Ok); } } WorldEdit *child = createWldChild(); if ( (bool)(child->loadFile(FilePath, FileData, configs, GlobalSettings::LvlOpts)) ) { child->show(); child->updateGeometry(); child->ResetPosition(); updateMenus(true); dock_WldSettingsBox->setCurrentWorldSettings(); if(FileData.HubStyledWorld) { dock_WldSettingsBox->setVisible(true); dock_WldSettingsBox->raise(); } statusBar()->showMessage(tr("World map file loaded"), 2000); } else { child->close(); } //QMessageBox::information(this, tr("Dummy"), //tr("Sorry, the World Maps support is not inplemented in this version."), //QMessageBox::Ok); } else if(in_1.suffix().toLower() == "txt") { NPCConfigFile FileData = FileFormats::ReadNpcTXTFile(file); if( !FileData.ReadFileValid ) return; NpcEdit *child = createNPCChild(); if (child->loadFile(FilePath, FileData)) { statusBar()->showMessage(tr("NPC Config loaded"), 2000); child->show(); updateMenus(true); } else { child->close(); } } else if(in_1.suffix().toLower() == "sav") { GamesaveData FileData; QTextStream in(&file); //Read File in.setAutoDetectUnicode(true); in.setLocale(QLocale::system()); in.setCodec(QTextCodec::codecForLocale()); QString statistics; FileData = FileFormats::ReadSMBX64SavFile( in.readAll(), file.fileName() ); statistics+= QString("SMBX Game Save file version %1\n\n").arg(FileData.version); if(FileData.gameCompleted) statistics+= " ====This game was completed====\n\n"; statistics+= QString("Lives: %1, Coins:%2, ").arg(FileData.lives).arg(FileData.coins); statistics+= QString("Total stars: %1, Gotten stars: %2\n") .arg(FileData.totalStars) .arg(FileData.gottenStars.size()); statistics+= QString("Position X=%1, Y=%2\n") .arg(FileData.worldPosX) .arg(FileData.worldPosY); if(FileData.musicID>0) { long item=configs.getMusWldI(FileData.musicID); if(item>=0) { statistics+= QString("Current music: %1\n\n").arg(configs.main_music_wld[item].name); } } statistics += "\n===========Players:============\n"; for(int i=0; i<FileData.characterStates.size();i++) { if(i<configs.characters.size()) statistics += QString("%1:\n").arg(configs.characters[i].name); else statistics += QString("<unknown character>:\n"); statistics += QString("Health: %1, ").arg(FileData.characterStates[i].health); statistics += QString("Power-UP: %1, ").arg(FileData.characterStates[i].state); switch(FileData.characterStates[i].mountType) { case 0: break; case 1: statistics += QString("Mounted transport: Shoe - "); switch(FileData.characterStates[i].mountID) { case 1: statistics += QString("Kuribo's (green)");break; case 2: statistics += QString("Podoboo's (red)");break; case 3: statistics += QString("Lakitu's (blue)");break; default: statistics += QString("of God Power :D");break; } break; case 3: statistics += QString("Mounted transport: Yoshi");break; default: statistics += QString("Mounted transport: <unknown>");break; } if(FileData.characterStates[i].itemID>0) { int item= configs.getNpcI(FileData.characterStates[i].itemID); if(item>=0) { statistics += QString("%2Has item: %1").arg(configs.main_npc[item].name) .arg(FileData.characterStates[i].mountType>0?", ":""); } } if(i<FileData.characterStates.size()-1) statistics += "\n----------------------------\n"; } statistics += "\n=========================\n"; if( !FileData.ReadFileValid ) return; QMessageBox::information(this, tr("Game save statistics"), statistics, QMessageBox::Ok); } else { QMessageBox::warning(this, tr("Bad file"), tr("This file have unknown extension"), QMessageBox::Ok); return; } // Add to recent fileList if(addToRecentList){ AddToRecentFiles(FilePath); SyncRecentFiles(); } }
void MainWindow::on_actionCDATA_clear_unused_triggered() { //QMessageBox::information(this, "Dummy", "This feature comming soon!", QMessageBox::Ok); if(activeChildWindow() == WND_Level) { QStringList filesForRemove; LevelEdit *box = activeLvlEditWin(); if(!box) return; if(!box->sceneCreated) return; if(box->isUntitled()) { QMessageBox::warning(this, tr("File not saved"), tr("File doesn't saved on disk."), QMessageBox::Ok); return; } LvlScene *s = box->scene; QString levelDirectory(box->LvlData.meta.path); QString levelCustomDirectory(box->LvlData.meta.path + "/" + box->LvlData.meta.filename); QDir levelCustomDirectory_dir(levelCustomDirectory); filesForRemove.append(levelCustomDirectory_dir.entryList(QDir::AllEntries | QDir::NoDotAndDotDot)); qDebug() << levelCustomDirectory << "Total custom files" << filesForRemove.size(); QRegExp reg; reg.setPatternSyntax(QRegExp::Wildcard); reg.setCaseSensitivity(Qt::CaseInsensitive); QList<unsigned long > npcContainers; npcContainers << 91; npcContainers << 96; npcContainers << 283; npcContainers << 284; //SMBX64 entries QStringList whiteList; whiteList << "lunadll.txt"; //LunaDLL stuff whiteList << "lunadll.lua"; whiteList << "*.tileset.ini"; //PGE Tilesets whiteList << "effect-*.gif"; //All SMBX64 effects whiteList << "effect-*.png"; whiteList << "mario-*.gif"; //All SMBX64 playable characters whiteList << "peach-*.gif"; whiteList << "toad-*.gif"; whiteList << "luigi-*.gif"; whiteList << "link-*.gif"; whiteList << "yoshit-*.gif"; whiteList << "yoshib-*.gif"; whiteList << "mario-*.png"; whiteList << "peach-*.png"; whiteList << "toad-*.png"; whiteList << "luigi-*.png"; whiteList << "link-*.png"; whiteList << "yoshit-*.png"; whiteList << "yoshib-*.png"; QString npcFile = "npc-%1.png|npc-%1.gif|npc-%1.txt|npc-%1m.txt"; typedef QPair<unsigned long, QStringList > bossNPC; QList<bossNPC > bossNPCs; bossNPCs << bossNPC(15, npcFile.arg(16).split('|')); //boom-boom bossNPCs << bossNPC(39, npcFile.arg(41).split('|')); //Birdo bossNPCs << bossNPC(39, npcFile.arg(40).split('|')); //giant coopa bossNPCs << bossNPC(72, npcFile.arg(73).split('|')); //green parakoopa 1 bossNPCs << bossNPC(76, npcFile.arg(4).split('|')); bossNPCs << bossNPC(76, npcFile.arg(5).split('|')); bossNPCs << bossNPC(4, npcFile.arg(5).split('|')); //green parakoopa 2 bossNPCs << bossNPC(176, npcFile.arg(173).split('|')); bossNPCs << bossNPC(176, npcFile.arg(172).split('|')); bossNPCs << bossNPC(173, npcFile.arg(172).split('|')); //red parakoopa 1 bossNPCs << bossNPC(161, npcFile.arg(6).split('|')); bossNPCs << bossNPC(161, npcFile.arg(7).split('|')); bossNPCs << bossNPC(6, npcFile.arg(7).split('|')); //red parakoopa 2 bossNPCs << bossNPC(177, npcFile.arg(175).split('|')); bossNPCs << bossNPC(177, npcFile.arg(174).split('|')); bossNPCs << bossNPC(175, npcFile.arg(174).split('|')); //Blue parakoopa 3 bossNPCs << bossNPC(111, npcFile.arg(115).split('|')); bossNPCs << bossNPC(111, npcFile.arg(55).split('|')); bossNPCs << bossNPC(111, npcFile.arg(119).split('|')); bossNPCs << bossNPC(123, npcFile.arg(111).split('|')); bossNPCs << bossNPC(123, npcFile.arg(115).split('|')); bossNPCs << bossNPC(123, npcFile.arg(55).split('|')); bossNPCs << bossNPC(123, npcFile.arg(119).split('|')); //Red parakoopa 3 bossNPCs << bossNPC(110, npcFile.arg(118).split('|')); bossNPCs << bossNPC(110, npcFile.arg(114).split('|')); bossNPCs << bossNPC(122, npcFile.arg(110).split('|')); bossNPCs << bossNPC(123, npcFile.arg(118).split('|')); bossNPCs << bossNPC(123, npcFile.arg(114).split('|')); //Green parakoopa 3 bossNPCs << bossNPC(109, npcFile.arg(113).split('|')); //shell bossNPCs << bossNPC(109, npcFile.arg(117).split('|')); //beach bossNPCs << bossNPC(121, npcFile.arg(109).split('|')); //koopa bossNPCs << bossNPC(121, npcFile.arg(113).split('|')); //shell bossNPCs << bossNPC(121, npcFile.arg(117).split('|')); //beach //Yellow parakoopa 3 bossNPCs << bossNPC(112, npcFile.arg(116).split('|')); //shell bossNPCs << bossNPC(112, npcFile.arg(120).split('|')); //beach bossNPCs << bossNPC(124, npcFile.arg(112).split('|')); //koopa bossNPCs << bossNPC(124, npcFile.arg(116).split('|')); //shell bossNPCs << bossNPC(124, npcFile.arg(120).split('|')); //beach bossNPCs << bossNPC(124, npcFile.arg(194).split('|')); bossNPCs << bossNPC(112, npcFile.arg(194).split('|')); bossNPCs << bossNPC(116, npcFile.arg(194).split('|')); //rainbow shell bossNPCs << bossNPC(194, npcFile.arg(195).split('|')); //Parakoopas bossNPCs << bossNPC(243, npcFile.arg(242).split('|')); bossNPCs << bossNPC(244, npcFile.arg(1).split('|')); bossNPCs << bossNPC(3, npcFile.arg(2).split('|')); //random vegetable bossNPCs << bossNPC(147, npcFile.arg(146).split('|')); bossNPCs << bossNPC(147, npcFile.arg(140).split('|')); bossNPCs << bossNPC(147, npcFile.arg(142).split('|')); bossNPCs << bossNPC(147, npcFile.arg(92).split('|')); bossNPCs << bossNPC(147, npcFile.arg(139).split('|')); bossNPCs << bossNPC(147, npcFile.arg(141).split('|')); bossNPCs << bossNPC(147, npcFile.arg(143).split('|')); bossNPCs << bossNPC(147, npcFile.arg(144).split('|')); bossNPCs << bossNPC(147, npcFile.arg(145).split('|')); //random powerup bossNPCs << bossNPC(287, npcFile.arg(9).split('|')); bossNPCs << bossNPC(287, npcFile.arg(184).split('|')); bossNPCs << bossNPC(287, npcFile.arg(185).split('|')); bossNPCs << bossNPC(287, npcFile.arg(14).split('|')); bossNPCs << bossNPC(287, npcFile.arg(182).split('|')); bossNPCs << bossNPC(287, npcFile.arg(183).split('|')); bossNPCs << bossNPC(287, npcFile.arg(34).split('|')); bossNPCs << bossNPC(287, npcFile.arg(170).split('|')); bossNPCs << bossNPC(287, npcFile.arg(264).split('|')); bossNPCs << bossNPC(287, npcFile.arg(277).split('|')); //bill blasters bossNPCs << bossNPC(21, npcFile.arg(17).split('|')); bossNPCs << bossNPC(22, npcFile.arg(17).split('|')); //Toothy bossNPCs << bossNPC(49, npcFile.arg(50).split('|')); //Small Lakitu bossNPCs << bossNPC(47, npcFile.arg(48).split('|')); //Spiny bossNPCs << bossNPC(286, npcFile.arg(285).split('|')); //Rex bossNPCs << bossNPC(162, npcFile.arg(163).split('|')); //Magic potion bossNPCs << bossNPC(288, npcFile.arg(289).split('|')); //vined heads bossNPCs << bossNPC(226, npcFile.arg(213).split('|')); bossNPCs << bossNPC(225, npcFile.arg(214).split('|')); bossNPCs << bossNPC(227, npcFile.arg(224).split('|')); //Add into white SMBX64 dependencied of exists ID for(int q = 0; q < box->LvlData.npc.size(); q++) { bool isConainer = false; foreach(unsigned long x, npcContainers) { if(box->LvlData.npc[q].id == x) { qDebug() << "container! " << box->LvlData.npc[q].contents; isConainer = true; break; } } unsigned long npcID = (isConainer ? box->LvlData.npc[q].contents : box->LvlData.npc[q].id); for(int r = 0; r < bossNPCs.size(); r++) { if(npcID == bossNPCs[r].first) { whiteList.append(bossNPCs[r].second); bossNPCs.removeAt(r); r = -1; //reset loot to 0 } } if(bossNPCs.isEmpty()) break; } //into included into blocks for(int q = 0; q < box->LvlData.blocks.size(); q++) { for(int r = 0; r < bossNPCs.size(); r++) if(box->LvlData.blocks[q].npc_id == (signed)bossNPCs[r].first) { whiteList << bossNPCs[r].second; bossNPCs.removeAt(r); r = -1; //reset loot to 0 } if(bossNPCs.isEmpty()) break; } //SMBX64 system items whiteList << npcFile.arg(10).split('|'); //coin whiteList << npcFile.arg(40).split('|'); //bullets whiteList << npcFile.arg(85).split('|'); whiteList << npcFile.arg(87).split('|'); whiteList << npcFile.arg(159).split('|'); whiteList << npcFile.arg(13).split('|'); whiteList << npcFile.arg(30).split('|'); whiteList << npcFile.arg(171).split('|'); whiteList << npcFile.arg(263).split('|'); whiteList << npcFile.arg(237).split('|'); whiteList << npcFile.arg(265).split('|'); whiteList << npcFile.arg(269).split('|'); whiteList << npcFile.arg(368).split('|'); whiteList << npcFile.arg(266).split('|'); whiteList << npcFile.arg(282).split('|'); whiteList << npcFile.arg(281).split('|'); whiteList << npcFile.arg(191).split('|'); whiteList << npcFile.arg(210).split('|'); whiteList << npcFile.arg(133).split('|'); whiteList << npcFile.arg(292).split('|'); whiteList << npcFile.arg(50).split('|'); whiteList << npcFile.arg(246).split('|'); whiteList << npcFile.arg(276).split('|'); whiteList << npcFile.arg(202).split('|'); whiteList << npcFile.arg(108).split('|'); //shoes whiteList << npcFile.arg(35).split('|'); whiteList << npcFile.arg(191).split('|'); whiteList << npcFile.arg(193).split('|'); //Yoshis whiteList << npcFile.arg(95).split('|'); whiteList << npcFile.arg(98).split('|'); whiteList << npcFile.arg(99).split('|'); whiteList << npcFile.arg(100).split('|'); whiteList << npcFile.arg(148).split('|'); whiteList << npcFile.arg(149).split('|'); whiteList << npcFile.arg(150).split('|'); whiteList << npcFile.arg(228).split('|'); whiteList << "background-98.gif"; //door lock whiteList << "background-98m.gif"; whiteList << "background-160.gif"; //star lock whiteList << "background-160m.gif"; whiteList << "background-98.png"; //door lock whiteList << "background-98m.png"; whiteList << "background-160.png"; //star lock whiteList << "background-160m.png"; for(int i = 0; i < filesForRemove.size(); i++) { bool removed = false; if(QFileInfo(levelCustomDirectory + "/" + filesForRemove[i]).isDir()) { filesForRemove.removeAt(i); i--; continue; } else foreach(QString f, whiteList) { reg.setPattern(f); if(reg.exactMatch(filesForRemove[i])) { filesForRemove.removeAt(i); i--; removed = true; break; } } if(!removed) filesForRemove[i] = levelCustomDirectory + "/" + filesForRemove[i]; }
void CrashHandler::attemptCrashsave() { QDir crashSave; crashSave.setCurrent(AppPathManager::userAppDir()); /* * For case if crash happened while ... attempt to load crashed files! * This avoids looping crashes because backup files are causing crash too! */ if(crashSave.exists("__crashsave")) { LogCriticalNC("We are detected that crash has been occouped on attempt to load or initialize backup files. Backup directory has been renamed into \"__crashsave_danger\"."); LogCriticalNC("Please attach all files in that directory and, if possible, additional contents (custom images, sounds, musics, configs and scripts) while reporting this crash."); QDir dupeDir(AppPathManager::userAppDir() + "/__crashsave_danger"); if(dupeDir.exists()) dupeDir.removeRecursively(); crashSave.rename("__crashsave", "__crashsave_danger"); return; } crashSave.mkdir("__crashsave"); crashSave.cd("__crashsave"); int untitledCounter = 0; MainWindow *mw = MainWinConnect::pMainWin; if(!mw) return; QList<QMdiSubWindow *> listOfAllSubWindows = mw->allEditWins(); for(QMdiSubWindow *subWin : listOfAllSubWindows) { if(mw->activeChildWindow(subWin) == MainWindow::WND_Level) { LevelEdit *lvledit = mw->activeLvlEditWin(subWin); if(!lvledit) continue; QString fName = lvledit->currentFile(); if(lvledit->isUntitled()) fName = QString("Untitled_Crash") + QString::number(untitledCounter++) + QString(".lvlx"); else fName = fName.section("/", -1) + QString(".lvlx"); LevelData &lvl = lvledit->LvlData; lvl.metaData.crash.used = true; lvl.metaData.crash.untitled = lvl.meta.untitled; lvl.metaData.crash.modifyed = lvl.meta.modified; lvl.metaData.crash.strictModeSMBX64 = lvl.meta.smbx64strict; lvl.metaData.crash.fmtID = lvl.meta.RecentFormat; lvl.metaData.crash.fmtVer = lvl.meta.RecentFormatVersion; lvl.metaData.crash.filename = lvl.meta.filename; lvl.metaData.crash.path = lvl.meta.path; lvl.metaData.crash.fullPath = lvledit->curFile; //Forcely save data into PGE-X format lvl.meta.RecentFormat = LevelData::PGEX; lvledit->saveFile(crashSave.absoluteFilePath(fName), false); } else if(mw->activeChildWindow(subWin) == MainWindow::WND_NpcTxt) { NpcEdit *npcedit = mw->activeNpcEditWin(subWin); if(!npcedit) continue; QString fName = npcedit->currentFile(); if(npcedit->isUntitled()) fName = QString("Untitled_Crash") + QString::number(untitledCounter++) + QString(".txt"); else fName = fName.section("/", -1); npcedit->saveFile(crashSave.absoluteFilePath(fName), false); } else if(mw->activeChildWindow(subWin) == MainWindow::WND_World) { WorldEdit *worldedit = mw->activeWldEditWin(subWin); if(!worldedit) continue; QString fName = worldedit->currentFile(); if(worldedit->isUntitled()) fName = QString("Untitled_Crash") + QString::number(untitledCounter++) + QString(".wldx"); else fName = fName.section("/", -1) + QString(".wldx"); WorldData &wld = worldedit->WldData; wld.metaData.crash.used = true; wld.metaData.crash.untitled = wld.meta.untitled; wld.metaData.crash.modifyed = wld.meta.modified; wld.metaData.crash.strictModeSMBX64 = wld.meta.smbx64strict; wld.metaData.crash.fmtID = wld.meta.RecentFormat; wld.metaData.crash.fmtVer = wld.meta.RecentFormatVersion; wld.metaData.crash.filename = wld.meta.filename; wld.metaData.crash.path = wld.meta.path; wld.metaData.crash.fullPath = worldedit->curFile; //Forcely save data into PGE-X format wld.meta.RecentFormat = WorldData::PGEX; worldedit->saveFile(crashSave.absoluteFilePath(fName), false); } } }
//Reload opened file data void MainWindow::on_actionReload_triggered() { if(m_isFileReloading) return; m_isFileReloading = true; BoolReseter rst(&m_isFileReloading); Q_UNUSED(rst); QString filePath; QRect wnGeom; int activeWindow = activeChildWindow(LastActiveSubWindow); if(activeWindow == WND_Level) { LevelEdit *lvlEdit = activeLvlEditWin(LastActiveSubWindow); LevelData FileData; filePath = lvlEdit->curFile; if(lvlEdit->isUntitled) { QMessageBox::warning(this, tr("File not saved"), tr("File doesn't saved on disk."), QMessageBox::Ok); return; } if(!QFileInfo(filePath).exists()) { QMessageBox::critical(this, tr("File open error"), tr("Can't open the file!\nFile not exist."), QMessageBox::Ok); return; } if(lvlEdit->LvlData.meta.modified) { QMessageBox::StandardButton ret = QMessageBox::question(this, tr("Reload file and custom stuff"), tr("Do you want to save before reload stuff?"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel); if((ret == QMessageBox::Cancel) || (ret == 0)) return; else if(ret == QMessageBox::Yes) save(); } //Open level file if(!FileFormats::OpenLevelFile(filePath, FileData)) { formatErrorMsgBox(filePath, FileData.meta.ERROR_info, FileData.meta.ERROR_linenum, FileData.meta.ERROR_linedata); statusBar()->showMessage(tr("Reloading error"), 2000); return; } FileData.playmusic = GlobalSettings::autoPlayMusic; lvlEdit->LvlData.meta.modified = false; //Remember last section ID and positions! int lastSection = 0; QHash<int, QPair<long, long> > sectionPoss; lastSection = lvlEdit->LvlData.CurSection; SetCurrentLevelSection(lastSection); //Need to remember position of current section for(int i = 0; i < lvlEdit->LvlData.sections.size(); i++) { LevelSection sct = lvlEdit->LvlData.sections[i]; sectionPoss[sct.id] = QPair<long, long >(sct.PositionX, sct.PositionY); } long posX = lvlEdit->scene->m_viewPort->horizontalScrollBar()->value(); long posY = lvlEdit->scene->m_viewPort->verticalScrollBar()->value(); lvlEdit->close();//Close old widget without closing of sub-window //Get geometry of current subwindow wnGeom = LastActiveSubWindow->geometry(); //delete window->widget(); LevelEdit *chLvlWin = new LevelEdit(this, LastActiveSubWindow); connect(chLvlWin, SIGNAL(forceReload()), this, SLOT(on_actionReload_triggered())); LastActiveSubWindow->setWidget(chLvlWin); GraphicsWorkspace *gr = static_cast<GraphicsWorkspace *>(chLvlWin->getGraphicsView()); connect(gr, SIGNAL(zoomValueChanged(QString)), zoom, SLOT(setText(QString))); //LastActiveSubWindow->close(); LevelEdit *child = chLvlWin;//createLvlChild(); LvlMusPlay::setNoMusic(); setMusic(); if(static_cast<bool>(child->loadFile(filePath, FileData, configs, GlobalSettings::LvlOpts))) { child->show(); LastActiveSubWindow->setGeometry(wnGeom); child->updateGeometry(); child->ResetPosition(); statusBar()->showMessage(tr("Level file reloaded"), 2000); LvlMusPlay::musicForceReset = true; //reset musics updateMenus(LastActiveSubWindow, true); child->setFocus(); //Restore saved section positions for(int i = 0; i < child->LvlData.sections.size(); i++) { if(sectionPoss.contains(child->LvlData.sections[i].id)) { QPair<long, long> &sct = sectionPoss[child->LvlData.sections[i].id]; child->LvlData.sections[i].PositionX = sct.first; child->LvlData.sections[i].PositionY = sct.second; } } SetCurrentLevelSection(lastSection); child->scene->m_viewPort->horizontalScrollBar()->setValue(static_cast<int>(posX)); child->scene->m_viewPort->verticalScrollBar()->setValue(static_cast<int>(posY)); if(GlobalSettings::autoPlayMusic) ui->actionPlayMusic->setChecked(true); child->showCustomStuffWarnings(); } else { LogDebug(">>File loading aborted"); LogDebug(">>Window showed"); child->LvlData.meta.modified = false; LogDebug(">>Option set"); LastActiveSubWindow->close(); LogDebug(">>Windows closed"); } } else if(activeWindow == WND_NpcTxt) { NpcEdit *npcEdit = activeNpcEditWin(LastActiveSubWindow); filePath = npcEdit->curFile; if(npcEdit->isUntitled) { QMessageBox::warning(this, tr("File not saved"), tr("File doesn't saved on disk."), QMessageBox::Ok); return; } if(npcEdit->isModyfied) { QMessageBox::StandardButton ret = QMessageBox::question(this, tr("Reload file and custom stuff"), tr("Do you want to save before reload stuff?"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel); if((ret == QMessageBox::Cancel) || (ret == 0)) return; else if(ret == QMessageBox::Yes) save(); } // if (!fileIn.open(QIODevice::ReadOnly)) { // QMessageBox::critical(this, tr("File open error"), // tr("Can't open the file!"), QMessageBox::Ok); // return; // } NPCConfigFile FileData; if(!FileFormats::ReadNpcTXTFileF(filePath, FileData)) { QMessageBox::critical(this, QObject::tr("File open error"), tr("Can't read the file"), QMessageBox::Ok); return; } wnGeom = LastActiveSubWindow->geometry(); npcEdit->isModyfied = false; npcEdit->close(); //NpcEdit *child = createNPCChild(); //QMdiSubWindow *npcWindow = LastActiveSubWindow; NpcEdit *child = new NpcEdit(&configs, LastActiveSubWindow); LastActiveSubWindow->setWidget(child); if(child->loadFile(filePath, FileData)) { statusBar()->showMessage(tr("NPC Config reloaded"), 2000); child->show(); LastActiveSubWindow->setGeometry(wnGeom); updateMenus(LastActiveSubWindow, true); } else { child->close(); LastActiveSubWindow->close(); } } else if(activeWindow == WND_World) { WorldEdit *wldEdit = activeWldEditWin(LastActiveSubWindow); WorldData FileData; filePath = wldEdit->curFile; if(wldEdit->isUntitled) { QMessageBox::warning(this, tr("File not saved"), tr("File doesn't saved on disk."), QMessageBox::Ok); return; } if(!QFileInfo(filePath).exists()) { QMessageBox::critical(this, tr("File open error"), tr("Can't open the file!\nFile not exist."), QMessageBox::Ok); return; } if(wldEdit->WldData.meta.modified) { QMessageBox::StandardButton ret = QMessageBox::question(this, tr("Reload file and custom stuff"), tr("Do you want to save before reload stuff?"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel); if((ret == QMessageBox::Cancel) || (ret == 0)) return; else if(ret == QMessageBox::Yes) save(); } if(!FileFormats::OpenWorldFile(filePath, FileData)) { formatErrorMsgBox(filePath, FileData.meta.ERROR_info, FileData.meta.ERROR_linenum, FileData.meta.ERROR_linedata); statusBar()->showMessage(tr("Reloading error"), 2000); return; } QFileInfo finfo(filePath); FileData.meta.filename = util::getBaseFilename(finfo.fileName()); FileData.meta.path = finfo.absoluteDir().absolutePath(); FileData.playmusic = GlobalSettings::autoPlayMusic; wldEdit->WldData.meta.modified = false; wnGeom = LastActiveSubWindow->geometry(); QMdiSubWindow *worldWindow = LastActiveSubWindow; long posX = wldEdit->scene->m_viewPort->horizontalScrollBar()->value(); long posY = wldEdit->scene->m_viewPort->verticalScrollBar()->value(); wldEdit->close(); WorldEdit *child = new WorldEdit(this, worldWindow); connect(child, &WorldEdit::forceReload, this, &MainWindow::on_actionReload_triggered); worldWindow->setWidget(child); GraphicsWorkspace *gr = static_cast<GraphicsWorkspace *>(child->getGraphicsView()); connect(gr, SIGNAL(zoomValueChanged(QString)), zoom, SLOT(setText(QString))); if(bool(child->loadFile(filePath, FileData, configs, GlobalSettings::LvlOpts))) { child->show(); LastActiveSubWindow->setGeometry(wnGeom); child->updateGeometry(); child->ResetPosition(); updateMenus(LastActiveSubWindow, true); dock_WldSettingsBox->setCurrentWorldSettings(); if(FileData.HubStyledWorld) { dock_WldSettingsBox->setVisible(true); dock_WldSettingsBox->raise(); } child->scene->m_viewPort->horizontalScrollBar()->setValue(static_cast<int>(posX)); child->scene->m_viewPort->verticalScrollBar()->setValue(static_cast<int>(posY)); statusBar()->showMessage(tr("World map file loaded"), 2000); child->showCustomStuffWarnings(); } else { LogDebug(">>File loading aborted"); //child->show(); LogDebug(">>Window showed"); child->WldData.meta.modified = false; LogDebug(">>Option set"); LastActiveSubWindow->close(); LogDebug(">>Windows closed"); } } dock_LvlItemBox->clearFilter(); }
/*! * \brief Starts level testing in PGE Engine without interprocess communication (File saving is needed) */ void MainWindow::on_action_doSafeTest_triggered() { pge_engine_alphatestingNotify(this); QString command = ApplicationPath + QStringLiteral("/") + PGE_ENGINE_EXE; QMutexLocker mlocker(&engine_mutex); Q_UNUSED(mlocker); if(!findEngine(this, command)) return; if(engine_proc.state() == QProcess::Running) { if(QMessageBox::warning(this, tr("Engine already runned"), tr("Engine is already testing another level.\n" "Do you want to abort current testing process?"), QMessageBox::Abort | QMessageBox::Cancel) == QMessageBox::Abort) { engine_proc.terminate(); engine_proc.close(); } return; } QStringList args; args << "--debug"; args << "--config=\"" + configs.config_dir + "\""; SETTINGS_TestSettings t = GlobalSettings::testing; args << QString("--num-players=%1").arg(t.numOfPlayers); args << QString("--p1c=%1").arg(t.p1_char); args << QString("--p1s=%1").arg(t.p1_state); args << QString("--p2c=%1").arg(t.p2_char); args << QString("--p2s=%1").arg(t.p2_state); if(t.xtra_chuck) args << "--debug-chucknorris"; if(t.xtra_god) args << "--debug-pagan-god"; if(t.xtra_flyup) args << "--debug-superman"; if(t.xtra_worldfreedom) args << "--debug-worldfreedom"; if(t.xtra_physdebug) args << "--debug-physics"; if(t.xtra_debug) args << "--debug-print=yes"; else args << "--debug-print=no"; if(activeChildWindow() == WND_Level) { LevelEdit *le = activeLvlEditWin(); if(le->isUntitled()) { QMessageBox::warning(this, tr("Save file first"), tr("To run testing of saved file, please save them into disk first!\n" "You can run testing without saving of file if you will use \"Run testing\" menu item."), QMessageBox::Ok); return; } args << le->curFile; } else if(activeChildWindow() == WND_World) { WorldEdit *we = activeWldEditWin(); if(we->isUntitled()) { QMessageBox::warning(this, tr("Save file first"), tr("To run testing of saved file, please save them into disk first!\n" "You can run testing without saving of file if you will use \"Run testing\" menu item."), QMessageBox::Ok); return; } args << we->curFile; } engine_proc.start(command, args); if(engine_proc.waitForStarted()) { //Stop music playback in the PGE Editor! stopMusicForTesting(); } }
/*! * \brief Starts level testing in PGE Engine with interprocess communication (File saving is not needed) */ void MainWindow::on_action_doTest_triggered() { pge_engine_alphatestingNotify(this); QString command; QMutexLocker mlocker(&engine_mutex); Q_UNUSED(mlocker); if(!findEngine(this, command)) return; if(engine_proc.state() == QProcess::Running) { if(QMessageBox::warning(this, tr("Engine already runned"), tr("Engine is already testing another level.\n" "Do you want to abort current testing process?"), QMessageBox::Abort | QMessageBox::Cancel) == QMessageBox::Abort) { engine_proc.terminate(); engine_proc.close(); } return; } if(activeChildWindow() == WND_Level) { IntEngine::init(&engine_proc); //if(activeLvlEditWin()->isUntitled) return; LevelEdit *edit = activeLvlEditWin(); if(!edit) return; QStringList args; args << "--debug"; args << "--config=\"" + configs.config_dir + "\""; args << "--interprocessing";//activeLvlEditWin()->curFile; SETTINGS_TestSettings t = GlobalSettings::testing; args << QString("--num-players=%1").arg(t.numOfPlayers); args << QString("--p1c=%1").arg(t.p1_char); args << QString("--p1s=%1").arg(t.p1_state); args << QString("--p2c=%1").arg(t.p2_char); args << QString("--p2s=%1").arg(t.p2_state); if(t.xtra_chuck) args << "--debug-chucknorris"; if(t.xtra_god) args << "--debug-pagan-god"; if(t.xtra_flyup) args << "--debug-superman"; if(t.xtra_worldfreedom) args << "--debug-worldfreedom"; if(t.xtra_physdebug) args << "--debug-physics"; if(t.xtra_debug) args << "--debug-print=yes"; else args << "--debug-print=no"; edit->prepareLevelFile(edit->LvlData); IntEngine::setTestLvlBuffer(edit->LvlData); qDebug() << "Executing engine..." << command; engine_proc.start(command, args); if(engine_proc.waitForStarted()) { qDebug() << "Started"; //Stop music playback in the PGE Editor! stopMusicForTesting(); } else qWarning() << "Failed to start PGE Engine!" << command << "with args" << args; } else return; }