Editor: warn if map isn't saved when quitting
This commit is contained in:
@@ -15,6 +15,7 @@
|
||||
#include <SDL2/SDL_keycode.h>
|
||||
#include <array>
|
||||
#include "../filesystem.hpp"
|
||||
#include "shared_scenes.hpp"
|
||||
|
||||
#ifdef _WIN32
|
||||
#include "../sdlpp/SDL2/SDL2_framerate.h"
|
||||
@@ -28,7 +29,8 @@
|
||||
#define MAP_WIDTH 24
|
||||
#define MAP_HEIGHT 16
|
||||
|
||||
#define QUIT_FLAG 0x00000001
|
||||
bool quit_editor = false;
|
||||
|
||||
#define UPDATE_FLAG 0x00000002
|
||||
#define MAP_LEFT_ENABLED_FLAG 0x00000004
|
||||
#define MAP_RIGHT_ENABLED_FLAG 0x00000008
|
||||
@@ -49,6 +51,7 @@
|
||||
#define OVERWORLD_WIDTH 2
|
||||
|
||||
const std::string levelsDir = "levels";
|
||||
bool map_changed = false;
|
||||
|
||||
struct ToolType {
|
||||
enum Value {
|
||||
@@ -148,9 +151,12 @@ void saveMapCallback(void * /*UNUSED*/, Button * /*UNUSED*/) {
|
||||
std::cout << "SAVING" << std::endl;
|
||||
saveMap(levelsDir + FSLib::dir_divisor + level_name_text + ".marmap",
|
||||
global_vars.objects);
|
||||
map_changed = false;
|
||||
game_scenes.pop_back();
|
||||
}
|
||||
void loadMapDialogCallback(const std::string &level_name) {
|
||||
std::cout << "LOADING" << std::endl;
|
||||
map_changed = false;
|
||||
level_name_text = level_name.substr(0, level_name.length() - 7);
|
||||
setFlag(LOAD_MAP_FLAG);
|
||||
setFlag(TEXT_UPDATE_FLAG);
|
||||
@@ -531,7 +537,6 @@ void handleKeyUp(SDL_Keycode key, SDLPP::Scene &scene) {
|
||||
switch (key) {
|
||||
case SDLK_ESCAPE:
|
||||
std::cout << "Eskape" << std::endl;
|
||||
// setFlag(QUIT_FLAG);
|
||||
game_scenes.push_back(mainMenuScene);
|
||||
break;
|
||||
case SDLK_a:
|
||||
@@ -703,6 +708,7 @@ MapObject &getSelectedObject() {
|
||||
|
||||
void placeTool(SDLPP::Scene &scene) {
|
||||
std::lock_guard<std::mutex> lock(render_mutex);
|
||||
map_changed = true;
|
||||
|
||||
ToolVisitor visitor;
|
||||
visitor.setSourceType(global_vars.current_world_type);
|
||||
@@ -806,7 +812,7 @@ void pollEvents(std::shared_ptr<SDLPP::Scene> &scene) {
|
||||
while (SDLPP::getSDLEvent(event)) {
|
||||
switch (event.type) {
|
||||
case SDL_QUIT:
|
||||
setFlag(QUIT_FLAG);
|
||||
quit_editor = true;
|
||||
break;
|
||||
case SDL_KEYUP:
|
||||
if (!getFlag(TEXT_INPUT_FLAG) && !controlOrCommandPressed()) {
|
||||
@@ -824,15 +830,18 @@ void pollEvents(std::shared_ptr<SDLPP::Scene> &scene) {
|
||||
!level_name_text.empty()) {
|
||||
level_name_text.pop_back();
|
||||
setFlag(TEXT_UPDATE_FLAG);
|
||||
} else if (event.key.keysym.sym == SDLK_c && controlOrCommandPressed()) {
|
||||
} else if (event.key.keysym.sym == SDLK_c &&
|
||||
controlOrCommandPressed()) {
|
||||
// handle copy
|
||||
SDL_SetClipboardText(level_name_text.c_str());
|
||||
} else if (event.key.keysym.sym == SDLK_v && controlOrCommandPressed()) {
|
||||
} else if (event.key.keysym.sym == SDLK_v &&
|
||||
controlOrCommandPressed()) {
|
||||
// handle paste
|
||||
level_name_text += SDL_GetClipboardText();
|
||||
setFlag(TEXT_UPDATE_FLAG);
|
||||
}
|
||||
} else if (event.key.keysym.sym == SDLK_s && controlOrCommandPressed()) {
|
||||
} else if (event.key.keysym.sym == SDLK_s &&
|
||||
controlOrCommandPressed()) {
|
||||
saveMapCallback(nullptr, nullptr);
|
||||
}
|
||||
break;
|
||||
@@ -1057,10 +1066,11 @@ void openMapEditor(std::shared_ptr<SDLPP::Scene> &scene,
|
||||
} else {
|
||||
loadMap(scene, global_vars.mario, filename, global_vars.objects, true,
|
||||
MAP_WIDTH);
|
||||
for(int i = 0; i < global_vars.objects.size(); i++) {
|
||||
for(int j = 0; j < 16; j++) {
|
||||
if(global_vars.objects[i][j].hasCharacter() && global_vars.objects[i][j].getCharacterId() == MARIO_ID) {
|
||||
global_vars.mario_pos = {i,j};
|
||||
for (int i = 0; i < global_vars.objects.size(); i++) {
|
||||
for (int j = 0; j < 16; j++) {
|
||||
if (global_vars.objects[i][j].hasCharacter() &&
|
||||
global_vars.objects[i][j].getCharacterId() == MARIO_ID) {
|
||||
global_vars.mario_pos = { i, j };
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1342,8 +1352,21 @@ createEditorMainScene(std::shared_ptr<SDLPP::Renderer> &renderer) {
|
||||
return scene;
|
||||
}
|
||||
|
||||
void quitEditor(bool actually_quit) {
|
||||
g_quit = actually_quit;
|
||||
}
|
||||
|
||||
void editorAdditionalRender(std::shared_ptr<SDLPP::Scene> &scene) {
|
||||
g_quit = getFlag(QUIT_FLAG);
|
||||
if (quit_editor) {
|
||||
if (map_changed) {
|
||||
game_scenes.push_back(createYesNoScene(
|
||||
scene->getRendererShared(),
|
||||
"Map hasn't been saved. Actually quit?", quitEditor));
|
||||
quit_editor = false;
|
||||
} else {
|
||||
quitEditor(true);
|
||||
}
|
||||
}
|
||||
for (auto &button : global_vars.buttons) {
|
||||
button->update();
|
||||
}
|
||||
@@ -1377,7 +1400,7 @@ SceneStruct createEditorScene(std::shared_ptr<SDLPP::Renderer> &renderer) {
|
||||
ret.additionalRender = editorAdditionalRender;
|
||||
editorScene = ret.scene;
|
||||
|
||||
mainMenuScene = createEditorMainMenuScene(renderer);
|
||||
mainMenuScene = createEditorMainMenuScene(renderer, &quit_editor);
|
||||
// fileChoiceScene = createEditorFileChoiceScene(renderer);
|
||||
return ret;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user