diff --git a/mario/CMakeLists.txt b/mario/CMakeLists.txt index 28a3742..b34540e 100644 --- a/mario/CMakeLists.txt +++ b/mario/CMakeLists.txt @@ -100,6 +100,7 @@ target_sources(editor PRIVATE scenes/yes_no_scene.cpp PRIVATE scenes/ok_scene.cpp PRIVATE scenes/load_scene.cpp + PRIVATE scenes/text_scene.cpp ) target_compile_definitions(editor PUBLIC EDITOR) diff --git a/mario/blocks/mushroomblock.cpp b/mario/blocks/mushroomblock.cpp index 2e60b40..bdd0e22 100644 --- a/mario/blocks/mushroomblock.cpp +++ b/mario/blocks/mushroomblock.cpp @@ -41,10 +41,13 @@ void MushroomBlock::setParent(MarioBlock *parent) { } void MushroomBlock::handleVisitor(SDLPP::Visitor &visitor) { + auto &m_visitor = dynamic_cast(visitor); + if (m_visitor.getDeath()) { + destroy(); + } if (!_started_movement) { return; } - auto &m_visitor = dynamic_cast(visitor); setOnGround(m_visitor.isOnGround()); if (isOnGround()) { setPos(getPos().getX(), m_visitor.getGroundY() - BLOCK_SIZE); @@ -53,9 +56,6 @@ void MushroomBlock::handleVisitor(SDLPP::Visitor &visitor) { setPos(m_visitor.getValidXPos(), getPos().getY()); setMovement(-getMovement().getX(), getMovement().getY()); } - if (m_visitor.getDeath()) { - destroy(); - } } void MushroomBlock::setFireFlower(bool fire_flower) { diff --git a/mario/filesystem/unix/filesystem.cpp b/mario/filesystem/unix/filesystem.cpp index 74b63df..fb4a7a8 100644 --- a/mario/filesystem/unix/filesystem.cpp +++ b/mario/filesystem/unix/filesystem.cpp @@ -65,8 +65,6 @@ bool FSLib::isDirectory(const string &path) { } bool FSLib::rename(const string &file_a, const string &file_b) { - // TODO log - std::cout << file_a << " -> " << file_b << std::endl; return ::rename(file_a.c_str(), file_b.c_str()) == 0; } diff --git a/mario/main.cpp b/mario/main.cpp index e7775ee..71276a8 100644 --- a/mario/main.cpp +++ b/mario/main.cpp @@ -385,7 +385,6 @@ SceneStruct mainGameScene(const std::string &level_path) { } void setTeleportLevelMain(const std::string &level) { - std::cout << "Setting: " << level << std::endl; _teleport_level = level; } diff --git a/mario/maploader.cpp b/mario/maploader.cpp index 4e4ed84..bd1afec 100644 --- a/mario/maploader.cpp +++ b/mario/maploader.cpp @@ -2,6 +2,7 @@ #include "../sdlpp/sdlpp_rectrenderer.hpp" #include #include +#include #include "mario.hpp" #include "sprites.hpp" #include "blocks.hpp" diff --git a/mario/mario.cpp b/mario/mario.cpp index 1b53778..6ce206f 100644 --- a/mario/mario.cpp +++ b/mario/mario.cpp @@ -132,10 +132,10 @@ void Mario::handleVisitor(SDLPP::Visitor &visitor) { if (m_visitor.hasMushroom()) { setBig(); } - if (m_visitor.hasTeleport() && isCrouching()) { - std::cout << "TELEPORTING" << std::endl; + if (m_visitor.hasTeleport() && ( + (m_visitor.teleportBottom() && isCrouching()) || (!m_visitor.teleportBottom() && walkingRight()) + )) { setTeleportLevelMain(m_visitor.getTeleportLevel()); - std::cout << "Setted" << std::endl; } if (m_visitor.levelEnd() && controllable) { if (std::abs(getPos().getX() - m_visitor.getEndPos().getX()) < @@ -261,6 +261,7 @@ void Mario::setBig() { } else { setBigFlag(); setSize({ BLOCK_SIZE, 2 * BLOCK_SIZE }); + setPos(getPos() - SDLPP::Vec2D(0, BLOCK_SIZE)); } setBaseRect(isJumping() ? (hasFire() ? MARIO_JUMP_FIRE_SRC : MARIO_JUMP_BIG_SRC) @@ -272,7 +273,6 @@ void Mario::setBig() { change_dir_src = hasFire() ? &MARIO_CHANGE_DIR_FIRE_SRC : &MARIO_CHANGE_DIR_BIG_SRC; jump_src = hasFire() ? &MARIO_JUMP_FIRE_SRC : &MARIO_JUMP_BIG_SRC; walk_anim = hasFire() ? &MARIO_WALK_FIRE_ANIM : &MARIO_WALK_BIG_ANIM; - setPos(getPos() - SDLPP::Vec2D(0, BLOCK_SIZE)); } void Mario::unsetBig() { diff --git a/mario/scenes/editor_main.cpp b/mario/scenes/editor_main.cpp index 5bce1aa..f2d7f8f 100644 --- a/mario/scenes/editor_main.cpp +++ b/mario/scenes/editor_main.cpp @@ -52,6 +52,8 @@ bool quit_editor = false; const std::string levelsDir = "levels"; bool map_changed = false; +MapObject *current_obj = nullptr; +std::shared_ptr current_modifier = nullptr; struct ToolType { enum Value { @@ -148,14 +150,12 @@ bool getFlag(uint64_t flag) { } 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); @@ -511,7 +511,6 @@ void updateWorld() { void handleKeyUp(SDL_Keycode key, SDLPP::Scene &scene) { switch (key) { case SDLK_ESCAPE: - std::cout << "Eskape" << std::endl; game_scenes.push_back(mainMenuScene); break; case SDLK_a: @@ -681,6 +680,17 @@ MapObject &getSelectedObject() { return global_vars.objects[pos.getX()][pos.getY()]; } +void setObjTeleport(const std::string &level) { + if(current_obj == nullptr) { + return; + } + if(level.empty()) { + current_modifier->destroy(); + return; + } + current_obj->setModifier(TELEPORT_MODIFIER_ID, level); +} + void placeTool(SDLPP::Scene &scene) { std::lock_guard lock(render_mutex); map_changed = true; @@ -767,8 +777,9 @@ void placeTool(SDLPP::Scene &scene) { new_obj->setData(global_vars.current_tool->getData()); if(new_obj->getId() == TELEPORT_MODIFIER_ID) { // TODO input - new_obj->setTeleportLevel("test2.marmap"); - obj.setModifier(global_vars.current_tool->getId(), "test2.marmap"); + current_obj = &obj; + current_modifier = new_obj; + game_scenes.push_back(createTextScene(scene.getRendererShared(), setObjTeleport)); } new_obj->getCollisions()[0]->setId(EDITOR_TERRAIN_ID); // TODO createModifierBlock @@ -783,6 +794,7 @@ void placeTool(SDLPP::Scene &scene) { } } +// TODO move to a functions file, used in text_scene.cpp as well bool controlOrCommandPressed() { return SDL_GetModState() & KMOD_CTRL || SDL_GetModState() & KMOD_GUI; } diff --git a/mario/scenes/editor_scenes.hpp b/mario/scenes/editor_scenes.hpp index 5702260..bf9f67c 100644 --- a/mario/scenes/editor_scenes.hpp +++ b/mario/scenes/editor_scenes.hpp @@ -19,4 +19,8 @@ createEditorMainMenuScene(std::shared_ptr &renderer, SceneStruct createEditorFileChoiceScene(std::shared_ptr &renderer); +SceneStruct +createTextScene(std::shared_ptr renderer, + std::function finalizer); + #endif \ No newline at end of file diff --git a/mario/scenes/text_scene.cpp b/mario/scenes/text_scene.cpp new file mode 100644 index 0000000..4622474 --- /dev/null +++ b/mario/scenes/text_scene.cpp @@ -0,0 +1,216 @@ +#include "SDL2/SDL_keycode.h" +#include "editor_scenes.hpp" +#include "../../sdlpp/sdlpp.hpp" +#include "../../sdlpp/sdlpp_mouse.hpp" +#include "../global_vars.hpp" +#include "../objectids.hpp" +#include "../editor_visitor.hpp" + +bool __update_scenes_text_dialog = false; +bool __quit_scenes_text_dialog = false; +bool __started_text_dialog = false; +bool __update_text = false; +uint64_t __cur_button_index_text_dialog = -1; +uint64_t __cur_button_index_text_dialog_down = -1; +std::vector> __buttons_text_dialog{}; +std::shared_ptr __mouse_text_dialog{}; +std::shared_ptr __level_name_object{}; +std::string __level_name_text = "LEVEL NAME"; + +std::function __text_dialog_finalizer; + +void __quitTextDialog() { + __quit_scenes_text_dialog = true; +} + +void __quitCallback_TextDialog(void * /*UNUSED*/, Button * /*UNUSED*/) { + __quitTextDialog(); +} + +void __handleKeyUp_TextDialog(SDL_Keycode key, SDLPP::Scene & /*UNUSED*/) { + switch (key) { + case SDLK_ESCAPE: + __level_name_text = ""; + // fallthrough + case SDLK_RETURN: + __quitTextDialog(); + break; + default: + break; + } +} + +std::shared_ptr +createSceneTextDialog(std::shared_ptr &renderer) { + auto scene = std::make_shared(renderer); + auto bg = std::make_shared(0, 0, 10, 10, renderer, + "#00000088", true); + bg->setPermanent(); + bg->setId(1); + scene->addObject(bg); + __mouse_text_dialog = + std::make_shared(0.01, 0.01, 0, 0, renderer); + __mouse_text_dialog->setMinWidth(1); + __mouse_text_dialog->setMinHeight(1); + __mouse_text_dialog->setAlignment(SDLPP::OBJ_CENTER, SDLPP::OBJ_CENTER); + __mouse_text_dialog->setId(EDITOR_MOUSE_ID); + __mouse_text_dialog->setColiderColor("#00FF00"); + __mouse_text_dialog->addCollision(SDLPP::RectColider({ 0, 0 }, { 1, 1 })); + scene->addObject(__mouse_text_dialog); + + ButtonConfig default_button_theme{}; + default_button_theme.bg_color = "#FFFFFF88"; + default_button_theme.bg_color_highlight = "#FFFFFFBB"; + default_button_theme.bg_color_disabled = "#AAAAAA88"; + default_button_theme.font_color = "#000000"; + default_button_theme.font_color_highlight = "#000000"; + default_button_theme.font_color_disabled = "#555555"; + default_button_theme.font_outline_color = "#FFFFFF88"; + default_button_theme.font_outline_color_highlight = "#FFFFFFAA"; + default_button_theme.font_outline_color_disabled = "#787878"; + default_button_theme.outline = 0.1; + // buttons + __buttons_text_dialog.emplace_back(std::make_shared