#include "japi/draw.h" #include "japi/game.h" #include "japi/font.h" #include "menu.h" #include "toolbar.h" #include "treeview.h" #include "propertygrid.h" #include "tilemap.h" #include "yamal.hpp" #include #include #include #include "misc.h" namespace fs = std::filesystem; bool loop(); std::map rooms; yamal root; std::string current_room = ""; void loadRoom(std::string room_file) { int filesize; char *f = file::getFileBuffer(std::string("room/"+room_file+".yaml").c_str(), filesize, true); root.deserialize(std::string(f)); current_room = room_file; free(f); uint16_t tiles[32*16]; int i=0; for(auto row : root["tilemap"].vec_data) { for (auto t : row.vec_data) { tiles[i] = t.asInt(); i++; } } tilemap::set(tiles); tilemap::setBackground(misc::getColorByName(root["room"]["bgColor"])); tilemap::setBorder(misc::getColorByName(root["room"]["border"])); } void game::init() { draw::init("DILEMMAKER v0.1", 800, 600); game::setState(loop); font::load("font/8bithud"); draw::cls(0xffff0000); tilemap::init(); std::vector room_names; for (const auto& entry : fs::directory_iterator("./data/room")) { if (entry.is_regular_file() && entry.path().extension() == ".yaml") { room_names.emplace_back(entry.path().stem().string()); } } std::sort(room_names.begin(), room_names.end(), [](const fs::path& a, const fs::path& b) { return a.filename().string() < b.filename().string(); }); for (auto& entry : room_names) { loadRoom(entry); std::string peiv = root["room"]["name"]; rooms[entry] = root["room"]["name"]; } } bool loop() { menu::start(); if (menu::option("FILE")) { menu::popup::start(); menu::popup::option("New..."); menu::popup::option("Load..."); menu::popup::option("Save..."); menu::popup::end(); } if (menu::option("EDIT")) { menu::popup::start(); menu::popup::end(); } if (menu::option("SELECTION")) { menu::popup::start(); menu::popup::end(); } if (menu::option("VIEW")) { menu::popup::start(); menu::popup::end(); } if (menu::end()) { draw::render(); return true; } toolbar::start(); treeview::start(); for (auto p : rooms) { const char *r = p.first.c_str(); //std::string room_label = r + if (treeview::option(std::string(p.first + ": " + p.second).c_str(), 0)) { if (current_room != r) { loadRoom(r); } else { auto& enemies = root["enemies"].vec_data; if (!enemies.empty()) treeview::option("ENEMIES:", 1); for (auto& enemy : enemies) { treeview::option(enemy["animation"].value.c_str(), 2); } auto& items = root["items"].vec_data; if (!items.empty()) treeview::option("ITEMS:", 1); char tmp[5]; for (int i=0; i -1) { if (treeview::getSelected(2) == -1) { propertygrid::sectionProperty("ROOM:"); if (propertygrid::stringProperty("NAME", root["room"]["name"])) root["room"]["name"] = propertygrid::getStringPropertyResult(); propertygrid::stringProperty("BGCOLOR", root["room"]["bgColor"]); propertygrid::stringProperty("BORDER", root["room"]["border"]); propertygrid::stringProperty("TILESET", root["room"]["tileSetFile"]); propertygrid::stringProperty("ITEMCOL1", root["room"]["itemColor1"]); propertygrid::stringProperty("ITEMCOL2", root["room"]["itemColor2"]); propertygrid::stringProperty("CONVEYOR", root["room"]["conveyorBelt"]); propertygrid::sectionProperty("CONNECTIONS:"); propertygrid::stringProperty("UP", root["room"]["connections"]["up" ].value=="null"?"null":root["room"]["connections"]["up"].value.substr(0,2)+": "+rooms[root["room"]["connections"]["up"].value.substr(0,2)]); propertygrid::stringProperty("DOWN", root["room"]["connections"]["down" ].value=="null"?"null":root["room"]["connections"]["down"].value.substr(0,2)+": "+rooms[root["room"]["connections"]["down"].value.substr(0,2)]); propertygrid::stringProperty("LEFT", root["room"]["connections"]["left" ].value=="null"?"null":root["room"]["connections"]["left"].value.substr(0,2)+": "+rooms[root["room"]["connections"]["left"].value.substr(0,2)]); propertygrid::stringProperty("RIGHT", root["room"]["connections"]["right"].value=="null"?"null":root["room"]["connections"]["right"].value.substr(0,2)+": "+rooms[root["room"]["connections"]["right"].value.substr(0,2)]); } else { const int num_enemies = root["enemies"].vec_data.size(); if (treeview::getSelected(2) < num_enemies) { auto& enemy = root["enemies"][treeview::getSelected(2)]; propertygrid::sectionProperty("ENEMY:"); propertygrid::stringProperty("ANIMATION", enemy["animation"]); propertygrid::stringProperty("POSITION", enemy["position"]["x"].value+", "+enemy["position"]["y"].value); propertygrid::stringProperty("VELOCITY", enemy["velocity"]["x"].value+", "+enemy["velocity"]["y"].value); propertygrid::stringProperty("COLOR", enemy["color"]); propertygrid::sectionProperty("BOUNDARIES:"); propertygrid::stringProperty("START", enemy["boundaries"]["position1"]["x"].value+", "+enemy["boundaries"]["position1"]["y"].value); propertygrid::stringProperty("END", enemy["boundaries"]["position2"]["x"].value+", "+enemy["boundaries"]["position2"]["y"].value); } else { auto& item = root["items"][treeview::getSelected(2)-num_enemies]; propertygrid::sectionProperty("ITEM:"); propertygrid::stringProperty("TILESET", item["tileSetFile"]); propertygrid::stringProperty("TILE", item["tile"]); propertygrid::stringProperty("POSITION", item["position"]["x"].value+", "+item["position"]["y"].value); propertygrid::stringProperty("COUNTER", item["counter"]); } } } propertygrid::end(); /*x1 += 6; x2 = x1 + font::len("FILE")+6; font::print("FILE", x1, 5); x1=x2; font::print("EDIT", x, 5); x+= font::len("EDIT")+12; font::print("SELECTION", x, 5); x+= font::len("SELECTION")+12; font::print("VIEW", x, 5); x+= font::len("VIEW")+12;*/ draw::render(); if (input::keyPressed(SDL_SCANCODE_F1)) draw::setZoom(draw::getZoom()-0.1f); if (input::keyPressed(SDL_SCANCODE_F2)) draw::setZoom(draw::getZoom()+0.1f); return true; }