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();
    }
}
Exemple #4
0
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;
}
Exemple #6
0
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();
    }
}
Exemple #7
0
//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);
        }
    }
}
Exemple #9
0
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);
        }
    }
}
Exemple #12
0
//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;
}