void LevelDatabaseUploadThread::finish() { EditorUserInterface* editor = mGame->getUIManager()->getUI<EditorUserInterface>(); if(!editor) return; if(errorNumber == 0) { // The server responds with the DBID of the level we just uploaded mGame->setLevelDatabaseId(atoi(responseBody.c_str())); editor->saveLevel(false, false); // Write databaseId to the level file done(editor, "Uploaded successfully", true); } else if(errorNumber == 1) { done(editor, "Error connecting to server", false); } else if(errorNumber == 2) { editor->showUploadErrorMessage(responseCode, responseBody); stringstream message; message << "Error " << responseCode << ": " << endl << responseBody << endl; logprintf(LogConsumer::LogError, "%s", message.str().c_str()); done(editor, "Error uploading... see Console or Log", false); } else { done(editor, "Unknown error", false); } }
// Runs as we're exiting the menu void GameParamUserInterface::onEscape() { EditorUserInterface *ui = getUIManager()->getUI<EditorUserInterface>(); string newFilename = getMenuItem(1)->getValue(); bool filenameChanged = mLevelFilename != newFilename; if(filenameChanged) ui->setLevelFileName(newFilename); GameType *gameType = getUIManager()->getUI<EditorUserInterface>()->getLevel()->getGameType(); const Vector<string> *keys = gameType->getGameParameterMenuKeys(); for(S32 i = 0; i < keys->size(); i++) { MenuItemMap::iterator iter = mMenuItemMap.find(keys->get(i)); MenuItem *menuItem = iter->second.get(); gameType->saveMenuItem(menuItem, keys->get(i)); } if(anythingChanged() || filenameChanged) { EditorUserInterface *ui = getUIManager()->getUI<EditorUserInterface>(); // TODO -->Save undo state here!!! ui->validateLevel(); } // Now back to our previously scheduled program... (which will be the editor, of course) getUIManager()->reactivatePrevUI(); }
LevelDatabaseUploadThread::LevelDatabaseUploadThread(ClientGame* game) { mGame = game; errorNumber = 0; EditorUserInterface* editor = mGame->getUIManager()->getUI<EditorUserInterface>(); editor->lockQuit("CAN'T QUIT WHILE UPLOADING"); if(mGame->getLevelDatabaseId()) editor->queueSetLingeringMessage("Updating Level in Pleiades [[SPINNER]]"); else editor->queueSetLingeringMessage("Uploading New Level to Pleiades [[SPINNER]]"); string fileData; readFile(joindir(mGame->getSettings()->getFolderManager()->getScreenshotDir(), UploadScreenshotFilename + string(".png")), fileData); username = mGame->getPlayerName(); user_password = mGame->getPlayerPassword(); content = editor->getLevelText(); screenshot = UploadScreenshotFilename + string(".png"); screenshot2 = fileData; string levelgenFilename; levelgenFilename = mGame->getScriptName(); if(levelgenFilename != "") readFile(mGame->getSettings()->getFolderManager()->findLevelGenScript(levelgenFilename), levelgen); uploadrequest = HttpRequest::LevelDatabaseBaseUrl + UploadRequest; }
// This one is a little more involved, as we will be simulating an entire editor session, including level testing TEST(ObjectCleanupTests, TestEditorObjectManagement) { GameSettingsPtr settings = GameSettingsPtr(new GameSettings()); settings->setSetting(IniKey::Nickname, string("Alfonso")); // Set this to bypass startup screen settings->getFolderManager()->setLevelDir("levels"); // Need something for hosting to work settings->updatePlayerName("Alfonso"); Address addr; ClientGame *clientGame = new ClientGame(addr, settings, new UIManager()); // ClientGame destructor will clean up UIManager GameManager::addClientGame(clientGame); UIManager *uiMgr = clientGame->getUIManager(); uiMgr->activate<MainMenuUserInterface>(); ASSERT_TRUE(uiMgr->isCurrentUI<MainMenuUserInterface>()); // Cheat a little; go directly to editor uiMgr->getUI<EditorUserInterface>()->setLevelFileName("xyzzy"); // Reset this so we get the level entry screen uiMgr->activate<EditorUserInterface>(); ASSERT_TRUE(uiMgr->isCurrentUI<EditorUserInterface>()); EditorUserInterface *editor = uiMgr->getUI<EditorUserInterface>(); ///// Test basic object deletion, undo system not activated SafePtr<TestItem> testItem = new TestItem(); // To track deletion... see "Basics" test above ASSERT_FALSE(testItem.isNull()) << "Just created this!"; editor->addToEditor(testItem.getPointer()); editor->deleteItem(0, false); // Low level method doesn't save undo state; object should be deleted ASSERT_TRUE(testItem.isNull()) << "Obj should be gone!"; ///// Check deleting object with undo system -- do things get deleted as expected? testItem = new TestItem(); ASSERT_FALSE(testItem.isNull()) << "Just created this -- shouldn't be gone yet!"; editor->addToEditor(testItem.getPointer()); testItem->setSelected(true); ASSERT_EQ(1, editor->getLevel()->findObjects_fast()->size()) << "Started with one object"; editor->handleKeyPress(KEY_Z, "Del"); // Triggers deleteSelection(false) ASSERT_TRUE(testItem.isNull()) << "Obj should be gone!"; ASSERT_EQ(0, editor->getLevel()->findObjects_fast()->size()) << "All objects deleted... none should be present"; editor->handleKeyPress(KEY_Z, editor->getEditorBindingString(BINDING_UNDO_ACTION)); // Undo ASSERT_EQ(1, editor->getLevel()->findObjects_fast()->size()) << "Undeleted one object"; ASSERT_FALSE(testItem.isValid()); testItem = dynamic_cast<TestItem *>(editor->getLevel()->findObjects_fast()->get(0)); ASSERT_TRUE(testItem.isValid()); editor->handleKeyPress(KEY_Z, editor->getEditorBindingString(BINDING_REDO_ACTION)); ASSERT_EQ(0, editor->getLevel()->findObjects_fast()->size()) << "Redid delete... none should be present"; ASSERT_FALSE(testItem.isValid()); ///// Test level Level *level = editor->getLevel(); // Keep track of the level we were editing editor->testLevelStart(); ASSERT_TRUE(uiMgr->isCurrentUI<EditorUserInterface>()) << "Still in editor"; ASSERT_TRUE(editor->getLevel()->getGameType()) << "Have valid GameType"; GameType *gt = editor->getLevel()->getGameType(); GameManager::getServerGame()->loadNextLevelInfo(); ASSERT_EQ(GameManager::DoneLoadingLevels, GameManager::getHostingModePhase()) << "Only loading one level here..."; ASSERT_TRUE(GameManager::hostGame()) << "Failure to host game!"; ASSERT_TRUE(uiMgr->isCurrentUI<GameUserInterface>()) << "In game UI"; GameManager::localClientQuits(GameManager::getClientGames()->get(0)); ASSERT_TRUE(uiMgr->isCurrentUI<EditorUserInterface>()) << "Back to the editor"; ASSERT_EQ(editor, uiMgr->getCurrentUI()) << "Expect same object"; ASSERT_EQ(level, editor->getLevel()) << "Level should not have changed"; ASSERT_TRUE(editor->getLevel()->getGameType()) << "Expect valid GameType"; ASSERT_EQ(gt, editor->getLevel()->getGameType()) << "GameType should not have changed"; }
TEST(EditorTest, findSnapVertexTest) { GamePair pair; ClientGame *clientGame = pair.getClient(0); ASSERT_TRUE(clientGame) << "Shouldn't be NULL here..."; EditorUserInterface *editorUi = clientGame->getUIManager()->getUI<EditorUserInterface>(); editorUi->setLevel(boost::shared_ptr<Level>(new Level())); ASSERT_EQ(0, editorUi->getLevel()->getObjectCount()); // Confirm level starts empty // 5 vertex wall in stair-step pattern, with middle vertex on 0,0 editorUi->getLevel()->parseLevelLine("BarrierMaker 10 -100 -100 0 -100 0 0 100 0 100 100", "NoFile"); ASSERT_EQ(1, editorUi->getLevel()->getObjectCount()); // Confirm object was added properly // Mark first 3 vertices as being selected WallItem *wall = static_cast<WallItem *>(editorUi->getLevel()->getObjectByIndex(0)); wall->aselectVert(0); wall->aselectVert(1); wall->aselectVert(2); ASSERT_TRUE(wall->vertSelected(0)); ASSERT_TRUE(wall->vertSelected(1)); ASSERT_TRUE(wall->vertSelected(2)); ASSERT_FALSE(wall->vertSelected(3)); ASSERT_FALSE(wall->vertSelected(4)); editorUi->mMousePos.set(3,3); // In canvas coords; near vertex 2 editorUi->findSnapVertex(); EXPECT_EQ(2, editorUi->mSnapVertexIndex); editorUi->mMousePos.set(95,105); // Near vertex 4, which is not selected --> closest selected is 2 editorUi->findSnapVertex(); EXPECT_EQ(2, editorUi->mSnapVertexIndex); editorUi->mMousePos.set(-88,-106); // Near vertex 0, which is selected editorUi->findSnapVertex(); EXPECT_EQ(0, editorUi->mSnapVertexIndex); wall->unselectVert(0); ASSERT_FALSE(wall->vertSelected(0)); ASSERT_TRUE(wall->vertSelected(1)); ASSERT_TRUE(wall->vertSelected(2)); ASSERT_FALSE(wall->vertSelected(3)); ASSERT_FALSE(wall->vertSelected(4)); editorUi->mMousePos.set(-88, -106); // Near vertex 0, which is not selected --> closest selected is 1 editorUi->findSnapVertex(); EXPECT_EQ(1, editorUi->mSnapVertexIndex); editorUi->mMousePos.set(3, 3); // In canvas coords; near vertex 2 editorUi->findSnapVertex(); EXPECT_EQ(2, editorUi->mSnapVertexIndex); // Cleanup delete newClientGame(); }