From 6cae666c76cdf10f6cc96849f8e7a452f832723c Mon Sep 17 00:00:00 2001 From: AllyTally Date: Thu, 9 Mar 2023 13:10:58 -0400 Subject: [PATCH] Clean up scripts in the editor Scripts used a weird "hook" system, where script names were extracted into their own list. This was completely unneeded, so it has been replaced with using the script.customscripts vector directly. The script editor has been cleaned up, so the cursor's Y position is relative to the entire script, rather than what's just displaying on the screen currently. This simplifies a lot of code, and I don't know why it was done the other way in the first place. The script selector and script editor cursors have been sped up, since both lists can be massive, and waiting 6 frames per line is extremely slow and boring. This is still slow and boring, but we don't have proper input repetition yet. --- desktop_version/src/CustomLevels.cpp | 4 - desktop_version/src/Editor.cpp | 582 ++++++++++++--------------- desktop_version/src/Editor.h | 50 ++- desktop_version/src/Render.cpp | 2 +- desktop_version/src/RenderFixed.cpp | 6 +- 5 files changed, 287 insertions(+), 357 deletions(-) diff --git a/desktop_version/src/CustomLevels.cpp b/desktop_version/src/CustomLevels.cpp index 4fc48772..d046b58d 100644 --- a/desktop_version/src/CustomLevels.cpp +++ b/desktop_version/src/CustomLevels.cpp @@ -1424,10 +1424,6 @@ next: } } -#ifndef NO_EDITOR - ed.gethooks(); -#endif - loc::loadtext_custom(_path.c_str()); font::load_custom(level_font_name.c_str()); diff --git a/desktop_version/src/Editor.cpp b/desktop_version/src/Editor.cpp index 93757ef2..8e7c61b7 100644 --- a/desktop_version/src/Editor.cpp +++ b/desktop_version/src/Editor.cpp @@ -26,6 +26,8 @@ #include "VFormat.h" #include "Vlogging.h" +#define SCRIPT_LINE_PADDING 6 + editorclass::editorclass(void) { reset(); @@ -54,30 +56,29 @@ void editorclass::reset(void) current_tool = EditorTool_WALLS; roomnamehide = 0; - zmod = false; - xmod = false; - cmod = false; - vmod = false; - hmod = false; - bmod = false; - spacemod = false; - shiftmenu = false; + z_modifier = false; + x_modifier = false; + c_modifier = false; + v_modifier = false; + h_modifier = false; + b_modifier = false; + toolbox_open = false; + help_open = false; shiftkey = false; saveandquit = false; note = ""; note_timer = 0; old_note_timer = 0; - deletekeyheld = false; + backspace_held = false; current_text_mode = TEXT_NONE; - warpent = -1; + warp_token_entity = -1; - textent = 0; + text_entity = 0; scripttexttype = 0; - drawmode = 0; - dmtile = 0; - dmtileeditor = 0; + direct_mode_tile = 0; + direct_mode_drawer = 0; entcol = 0; tilex = 0; @@ -96,26 +97,24 @@ void editorclass::reset(void) SDL_zeroa(kludgewarpdir); - hooklist.clear(); + script_buffer.clear(); - sb.clear(); + clear_script_buffer(); - clearscriptbuffer(); - - sbx = 0; - sby = 0; - pagey = 0; + script_cursor_x = 0; + script_cursor_y = 0; + script_offset = 0; lines_visible = 25; - sbscript = "null"; + current_script = "null"; - hookmenupage = 0; - hookmenu = 0; + script_list_offset = 0; + selected_script = 0; - returneditoralpha = 0; - oldreturneditoralpha = 0; + return_message_timer = 0; + old_return_message_timer = 0; ghosts.clear(); - currentghosts = 0; + current_ghosts = 0; loaded_filepath = ""; @@ -137,117 +136,94 @@ void editorclass::register_tool(EditorTools tool, const char* name, const char* tool_requires_shift[tool] = shift; } -void editorclass::gethooks(void) +void editorclass::load_script_in_editor(const std::string& name) { - // Scan through the script and create a hooks list based on it - hooklist.clear(); + // Load script t into the script editor + clear_script_buffer(); + for (size_t i = 0; i < script.customscripts.size(); i++) { - Script& script_ = script.customscripts[i]; - - hooklist.push_back(script_.name); - } -} - -void editorclass::loadhookineditor(const std::string& t) -{ - //Find hook t in the scriptclass, then load it into the editor - clearscriptbuffer(); - - for(size_t i = 0; i < script.customscripts.size(); i++) - { - Script& script_ = script.customscripts[i]; - - if(script_.name == t) + if (script.customscripts[i].name == name) { - sb = script_.contents; + script_buffer = script.customscripts[i].contents; break; } } - if(sb.empty()) + if (script_buffer.empty()) { - //Always have one line or we'll have problems - sb.resize(1); + // Always have one line or we'll have problems + script_buffer.resize(1); } } -void editorclass::addhooktoscript(const std::string& t) +void editorclass::remove_script(const std::string& name) { - //Adds hook+the scriptbuffer to the end of the scriptclass - removehookfromscript(t); + for (size_t i = 0; i < script.customscripts.size(); i++) + { + if (script.customscripts[i].name == name) + { + script.customscripts.erase(script.customscripts.begin() + i); + break; + } + } +} + +void editorclass::create_script(const std::string& name, const std::vector& contents) +{ + // Add a script. If there's an old one, delete it. + + remove_script(name); + Script script_; - script_.name = t; - script_.contents = sb; + script_.name = name; + script_.contents = contents; + script.customscripts.push_back(script_); } -void editorclass::removehookfromscript(const std::string& t) +void editorclass::create_script(const std::string& name) { - /* Find hook t in the scriptclass, then removes it (and any other code with it) - * When this loop reaches the end, it wraps to SIZE_MAX; SIZE_MAX + 1 is 0 */ - size_t i; - for (i = script.customscripts.size() - 1; i + 1 > 0; --i) + // Add an empty script. + + Script script_; + script_.name = name; + script_.contents.resize(1); + + script.customscripts.push_back(script_); +} + +bool editorclass::script_exists(const std::string& name) +{ + for (size_t i = 0; i < script.customscripts.size(); i++) { - if (script.customscripts[i].name == t) + if (script.customscripts[i].name == name) { - script.customscripts.erase(script.customscripts.begin() + i); + return true; } } -} - -void editorclass::removehook(const std::string& t) -{ - //Check the hooklist for the hook t. If it's there, remove it from here and the script - size_t i; - removehookfromscript(t); - /* When this loop reaches the end, it wraps to SIZE_MAX; SIZE_MAX + 1 is 0 */ - for (i = hooklist.size() - 1; i + 1 > 0; --i) - { - if (hooklist[i] == t) - { - hooklist.erase(hooklist.begin() + i); - } - } -} - -void editorclass::addhook(const std::string& t) -{ - //Add an empty function to the list in both editor and script - removehook(t); - hooklist.push_back(t); - addhooktoscript(t); -} - -bool editorclass::checkhook(const std::string& t) -{ - //returns true if hook t already is in the list - for(size_t i=0; i 1) + if ((int) script_buffer.size() > 1) { - sb.erase(sb.begin() + t); + script_buffer.erase(script_buffer.begin() + t); } } -void editorclass::insertline(int t) +void editorclass::insert_line(int t) { //insert a blank line into script at line t - sb.insert(sb.begin() + t, ""); + script_buffer.insert(script_buffer.begin() + t, ""); } static void editormenurender(int tr, int tg, int tb) @@ -794,7 +770,7 @@ static void draw_entities(void) } // Need to also check warp point destinations - if (entity->t == 13 && ed.warpent != i) + if (entity->t == 13 && ed.warp_token_entity != i) { // Is the destination in this room? if (entity->p1 / 40 == ed.levx && entity->p2 / 30 == ed.levy) @@ -832,7 +808,7 @@ static void draw_ghosts(void) graphics.clear(0, 0, 0, 0); for (int i = 0; i < (int) ed.ghosts.size(); i++) { - if (i <= ed.currentghosts) { // We don't want all of them to show up at once :) + if (i <= ed.current_ghosts) { // We don't want all of them to show up at once :) if (ed.ghosts[i].rx != ed.levx || ed.ghosts[i].ry != ed.levy) continue; SDL_Color ct = ed.ghosts[i].realcol; @@ -934,12 +910,12 @@ static void draw_cursor(void) case EditorTool_WALLS: case EditorTool_BACKING: // Modifiers! - if (ed.bmod) graphics.draw_rect(x, 0, 8, 240, blue); // Vertical - else if (ed.hmod) graphics.draw_rect(0, y, 320, 8, blue); // Horizontal - else if (ed.vmod) graphics.draw_rect(x - 32, y - 32, 24 + 48, 24 + 48, blue); // 9x9 - else if (ed.cmod) graphics.draw_rect(x - 24, y - 24, 24 + 32, 24 + 32, blue); // 7x7 - else if (ed.xmod) graphics.draw_rect(x - 16, y - 16, 24 + 16, 24 + 16, blue); // 5x5 - else if (ed.zmod) graphics.draw_rect(x - 8, y - 8, 24, 24, blue); // 3x3 + if (ed.b_modifier) graphics.draw_rect(x, 0, 8, 240, blue); // Vertical + else if (ed.h_modifier) graphics.draw_rect(0, y, 320, 8, blue); // Horizontal + else if (ed.v_modifier) graphics.draw_rect(x - 32, y - 32, 24 + 48, 24 + 48, blue); // 9x9 + else if (ed.c_modifier) graphics.draw_rect(x - 24, y - 24, 24 + 32, 24 + 32, blue); // 7x7 + else if (ed.x_modifier) graphics.draw_rect(x - 16, y - 16, 24 + 16, 24 + 16, blue); // 5x5 + else if (ed.z_modifier) graphics.draw_rect(x - 8, y - 8, 24, 24, blue); // 3x3 SDL_FALLTHROUGH; case EditorTool_SPIKES: case EditorTool_GRAVITY_LINES: @@ -987,15 +963,15 @@ static void draw_tile_drawer(int tileset) // Tile drawer for direct mode int t2 = 0; - if (ed.dmtileeditor > 0) + if (ed.direct_mode_drawer > 0) { - if (ed.dmtileeditor <= 4) + if (ed.direct_mode_drawer <= 4) { - t2 = graphics.lerp((4 - ed.dmtileeditor + 1) * 12, (4 - ed.dmtileeditor) * 12); + t2 = graphics.lerp((4 - ed.direct_mode_drawer + 1) * 12, (4 - ed.direct_mode_drawer) * 12); } // Draw five lines of the editor - const int temp = ed.dmtile - (ed.dmtile % 40) - 80; + const int temp = ed.direct_mode_tile - (ed.direct_mode_tile % 40) - 80; graphics.fill_rect(0, -t2, 320, 40, graphics.getRGB(0, 0, 0)); graphics.fill_rect(0, -t2 + 40, 320, 2, graphics.getRGB(255, 255, 255)); @@ -1025,25 +1001,25 @@ static void draw_tile_drawer(int tileset) } // Highlight our little block - graphics.draw_rect(((ed.dmtile % 40) * 8) - 2, 16 - t2 - 2, 12, 12, graphics.getRGB(255 - help.glow, 196, 196)); - graphics.draw_rect(((ed.dmtile % 40) * 8) - 1, 16 - t2 - 1, 10, 10, graphics.getRGB(0, 0, 0)); + graphics.draw_rect(((ed.direct_mode_tile % 40) * 8) - 2, 16 - t2 - 2, 12, 12, graphics.getRGB(255 - help.glow, 196, 196)); + graphics.draw_rect(((ed.direct_mode_tile % 40) * 8) - 1, 16 - t2 - 1, 10, 10, graphics.getRGB(0, 0, 0)); } - if (ed.dmtileeditor > 0 && t2 <= 30) + if (ed.direct_mode_drawer > 0 && t2 <= 30) { short labellen = 2 + font::len(0, loc::gettext("Tile:")); font::print(PR_BOR, 2, 45 - t2, loc::gettext("Tile:"), 196, 196, 255 - help.glow); - font::print(PR_BOR, labellen + 16, 45 - t2, help.String(ed.dmtile), 196, 196, 255 - help.glow); + font::print(PR_BOR, labellen + 16, 45 - t2, help.String(ed.direct_mode_tile), 196, 196, 255 - help.glow); graphics.fill_rect(labellen + 2, 44 - t2, 10, 10, graphics.getRGB(255 - help.glow, 196, 196)); graphics.fill_rect(labellen + 3, 45 - t2, 8, 8, graphics.getRGB(0, 0, 0)); if (tileset == 0) { - graphics.drawtile(labellen + 3, 45 - t2, ed.dmtile); + graphics.drawtile(labellen + 3, 45 - t2, ed.direct_mode_tile); } else { - graphics.drawtile2(labellen + 3, 45 - t2, ed.dmtile); + graphics.drawtile2(labellen + 3, 45 - t2, ed.direct_mode_tile); } } else @@ -1052,17 +1028,17 @@ static void draw_tile_drawer(int tileset) int y = 2 + font::height(0); y = SDL_max(y, 12); font::print(PR_BOR, 2, y, loc::gettext("Tile:"), 196, 196, 255 - help.glow); - font::print(PR_BOR, labellen + 16, y, help.String(ed.dmtile), 196, 196, 255 - help.glow); + font::print(PR_BOR, labellen + 16, y, help.String(ed.direct_mode_tile), 196, 196, 255 - help.glow); graphics.fill_rect(labellen + 2, y - 1, 10, 10, graphics.getRGB(255 - help.glow, 196, 196)); graphics.fill_rect(labellen + 3, y, 8, 8, graphics.getRGB(0, 0, 0)); if (tileset == 0) { - graphics.drawtile(labellen + 3, 12, ed.dmtile); + graphics.drawtile(labellen + 3, 12, ed.direct_mode_tile); } else { - graphics.drawtile2(labellen + 3, 12, ed.dmtile); + graphics.drawtile2(labellen + 3, 12, ed.direct_mode_tile); } } } @@ -1214,7 +1190,7 @@ static void draw_main_ui(void) char coords[8]; SDL_snprintf(coords, sizeof(coords), "(%d,%d)", ed.levx + 1, ed.levy + 1); - if (ed.spacemod) + if (ed.toolbox_open) { draw_toolbox(coords); } @@ -1248,7 +1224,7 @@ static void draw_main_ui(void) } } - if (ed.shiftmenu) + if (ed.help_open) { const char* shiftmenuoptions[] = { loc::gettext("F1: Change Tileset"), @@ -1457,15 +1433,15 @@ void editorrender(void) font::print(PR_CEN, -1, 28, loc::gettext("**** VVVVVV SCRIPT EDITOR ****"), 123, 111, 218); font::print(PR_CEN, -1, 44, loc::gettext("PRESS ESC TO RETURN TO MENU"), 123, 111, 218); - if (!ed.hooklist.empty()) + if (!script.customscripts.empty()) { for (int i = 0; i < 9; i++) { - if (ed.hookmenupage + i < (int)ed.hooklist.size()) + if (ed.script_list_offset + i < (int)script.customscripts.size()) { - if (ed.hookmenupage + i == ed.hookmenu) + if (ed.script_list_offset + i == ed.selected_script) { - std::string text_upper(loc::toupper(ed.hooklist[(ed.hooklist.size() - 1) - (ed.hookmenupage + i)])); + std::string text_upper(loc::toupper(script.customscripts[(script.customscripts.size() - 1) - (ed.script_list_offset + i)].name)); char buffer[SCREEN_WIDTH_CHARS + 1]; vformat_buf(buffer, sizeof(buffer), loc::get_langmeta()->menu_select.c_str(), "label:str", text_upper.c_str()); @@ -1473,7 +1449,7 @@ void editorrender(void) } else { - font::print(PR_CEN, -1, 68 + (i * 16), ed.hooklist[(ed.hooklist.size() - 1) - (ed.hookmenupage + i)], 123, 111, 218); + font::print(PR_CEN, -1, 68 + (i * 16), script.customscripts[(script.customscripts.size() - 1) - (ed.script_list_offset + i)].name, 123, 111, 218); } } } @@ -1493,7 +1469,7 @@ void editorrender(void) namebuffer, sizeof(namebuffer), loc::gettext("CURRENT SCRIPT: {name}"), "name:str", - ed.sbscript.c_str() + ed.current_script.c_str() ); font::print(PR_CEN, -1, 228, namebuffer, 123, 111, 218); @@ -1501,16 +1477,16 @@ void editorrender(void) int font_height = font::height(PR_FONT_LEVEL); for (int i = 0; i < ed.lines_visible; i++) { - if (i + ed.pagey < (int) ed.sb.size()) + if (i + ed.script_offset < (int) ed.script_buffer.size()) { - font::print(PR_FONT_LEVEL | PR_CJK_LOW, 16, 20 + (i * font_height), ed.sb[i + ed.pagey], 123, 111, 218); + font::print(PR_FONT_LEVEL | PR_CJK_LOW, 16, 20 + (i * font_height), ed.script_buffer[i + ed.script_offset], 123, 111, 218); } } // Draw cursor if (ed.entframe < 2) { - font::print(PR_FONT_LEVEL | PR_CJK_LOW, 16 + font::len(PR_FONT_LEVEL, ed.sb[ed.pagey + ed.sby].c_str()), 20 + (ed.sby * font_height), "_", 123, 111, 218); + font::print(PR_FONT_LEVEL | PR_CJK_LOW, 16 + font::len(PR_FONT_LEVEL, ed.script_buffer[ed.script_cursor_y].c_str()), 20 + ((ed.script_cursor_y - ed.script_offset) * font_height), "_", 123, 111, 218); } } break; @@ -1548,8 +1524,8 @@ void editorrenderfixed(void) const RoomProperty* const room = cl.getroomprop(ed.levx, ed.levy); graphics.updatetitlecolours(); - game.customcol=cl.getlevelcol(room->tileset, room->tilecol)+1; - ed.entcol=cl.getenemycol(game.customcol); + game.customcol = cl.getlevelcol(room->tileset, room->tilecol) + 1; + ed.entcol = cl.getenemycol(game.customcol); ed.entcolreal = graphics.getcol(ed.entcol); @@ -1557,23 +1533,23 @@ void editorrenderfixed(void) { for (size_t i = 0; i < ed.ghosts.size(); i++) { - GhostInfo& ghost = ed.ghosts[i]; + GhostInfo* ghost = &ed.ghosts[i]; - if ((int) i > ed.currentghosts || ghost.rx != ed.levx || ghost.ry != ed.levy) + if ((int) i > ed.current_ghosts || ghost->rx != ed.levx || ghost->ry != ed.levy) { continue; } - ghost.realcol = graphics.getcol(ghost.col); + ghost->realcol = graphics.getcol(ghost->col); } - ed.currentghosts++; - if (ed.zmod) + ed.current_ghosts++; + if (ed.z_modifier) { - ed.currentghosts++; + ed.current_ghosts++; } - ed.currentghosts = SDL_min(ed.currentghosts, ed.ghosts.size()); + ed.current_ghosts = SDL_min(ed.current_ghosts, ed.ghosts.size()); } switch (ed.state) @@ -1606,14 +1582,14 @@ void editorrenderfixed(void) if (cl.getroomprop(ed.levx, ed.levy)->directmode == 1) { - if (ed.dmtileeditor > 0) + if (ed.direct_mode_drawer > 0) { - ed.dmtileeditor--; + ed.direct_mode_drawer--; } } else { - ed.dmtileeditor = 0; + ed.direct_mode_drawer = 0; } if (cl.getroomprop(ed.levx, ed.levy)->roomname != "") @@ -1652,7 +1628,7 @@ static void input_submitted(void) *ed.current_text_ptr = key.keybuffer; - ed.shiftmenu = false; + ed.help_open = false; ed.shiftkey = false; bool reset_text_mode = true; @@ -1737,10 +1713,10 @@ static void input_submitted(void) break; } case TEXT_SCRIPT: - ed.clearscriptbuffer(); - if (!ed.checkhook(key.keybuffer)) + ed.clear_script_buffer(); + if (!ed.script_exists(key.keybuffer)) { - ed.addhook(key.keybuffer); + ed.create_script(key.keybuffer); } break; case TEXT_TITLE: @@ -1867,7 +1843,7 @@ void editorclass::handle_tile_placement(const int tile) { int range = 1; - if (bmod) + if (b_modifier) { // Vertical line for (int i = 0; i < 30; i++) @@ -1876,7 +1852,7 @@ void editorclass::handle_tile_placement(const int tile) } return; } - else if (hmod) + else if (h_modifier) { // Horizontal line for (int i = 0; i < 40; i++) @@ -1885,19 +1861,19 @@ void editorclass::handle_tile_placement(const int tile) } return; } - else if (vmod) + else if (v_modifier) { range = 4; } - else if (cmod) + else if (c_modifier) { range = 3; } - else if (xmod) + else if (x_modifier) { range = 2; } - else if (zmod) + else if (z_modifier) { range = 1; } @@ -1987,7 +1963,7 @@ void editorclass::entity_clicked(const int index) case 17: // Roomtext get_input_line(TEXT_ROOMTEXT, loc::gettext("Enter roomtext:"), &entity->scriptname); - textent = index; + text_entity = index; break; case 18: // Terminals @@ -2000,7 +1976,7 @@ void editorclass::entity_clicked(const int index) case 19: // Script Boxes (and terminals) get_input_line(TEXT_SCRIPT, loc::gettext("Enter script name:"), &entity->scriptname); - textent = index; + text_entity = index; break; } } @@ -2024,7 +2000,7 @@ void editorclass::tool_place() if (cl.getroomprop(levx, levy)->directmode >= 1) { - tile = dmtile; + tile = direct_mode_tile; } else if (current_tool == EditorTool_WALLS) { @@ -2078,15 +2054,15 @@ void editorclass::tool_place() break; case EditorTool_ROOMTEXT: lclickdelay = 1; - textent = customentities.size(); + text_entity = customentities.size(); add_entity(tilex + (levx * 40), tiley + (levy * 30), 17); - get_input_line(TEXT_ROOMTEXT, loc::gettext("Enter roomtext:"), &(customentities[textent].scriptname)); + get_input_line(TEXT_ROOMTEXT, loc::gettext("Enter roomtext:"), &(customentities[text_entity].scriptname)); break; case EditorTool_TERMINALS: lclickdelay = 1; - textent = customentities.size(); + text_entity = customentities.size(); add_entity(tilex + (levx * 40), tiley + (levy * 30), 18, 0); - get_input_line(TEXT_SCRIPT, loc::gettext("Enter script name:"), &(customentities[textent].scriptname)); + get_input_line(TEXT_SCRIPT, loc::gettext("Enter script name:"), &(customentities[text_entity].scriptname)); break; case EditorTool_SCRIPTS: substate = EditorSubState_DRAW_BOX; @@ -2098,7 +2074,7 @@ void editorclass::tool_place() break; case EditorTool_WARP_TOKENS: substate = EditorSubState_DRAW_WARPTOKEN; - warpent = customentities.size(); + warp_token_entity = customentities.size(); add_entity(tilex + (levx * 40), tiley + (levy * 30), 13); lclickdelay = 1; break; @@ -2252,14 +2228,15 @@ static void editormenuactionpress(void) ed.state = EditorState_SCRIPTS; ed.substate = EditorSubState_MAIN; - ed.clearscriptbuffer(); - key.keybuffer=""; - ed.hookmenupage=0; - ed.hookmenu=0; + ed.clear_script_buffer(); + key.keybuffer = ""; + ed.script_list_offset = 0; + ed.selected_script = 0; - ed.sby=0; - ed.sbx=0, ed.pagey=0; - ed.lines_visible = 200/font::height(PR_FONT_LEVEL); + ed.script_cursor_y = 0; + ed.script_cursor_x = 0; + ed.script_offset = 0; + ed.lines_visible = 200 / font::height(PR_FONT_LEVEL); break; case 2: music.playef(11); @@ -2433,7 +2410,7 @@ static void start_at_checkpoint(void) } else { - ed.currentghosts = 0; + ed.current_ghosts = 0; int tx = customentities[testeditor].x / 40; int ty = customentities[testeditor].y / 30; @@ -2466,8 +2443,8 @@ static void start_at_checkpoint(void) } music.haltdasmusik(); - ed.returneditoralpha = 1000; // Let's start it higher than 255 since it gets clamped - ed.oldreturneditoralpha = 1000; + ed.return_message_timer = 1000; // Let's start it higher than 255 since it gets clamped + ed.old_return_message_timer = 1000; script.startgamemode(Start_EDITORPLAYTESTING); } } @@ -2481,7 +2458,7 @@ static void handle_draw_input() if (shift_down && !ed.shiftkey) { ed.shiftkey = true; - ed.shiftmenu = !ed.shiftmenu; + ed.help_open = !ed.help_open; } else if (!shift_down) { @@ -2591,12 +2568,12 @@ static void handle_draw_input() game.mapheld = true; } - ed.hmod = key.keymap[SDLK_h]; - ed.vmod = key.keymap[SDLK_v]; - ed.bmod = key.keymap[SDLK_b]; - ed.cmod = key.keymap[SDLK_c]; - ed.xmod = key.keymap[SDLK_x]; - ed.zmod = key.keymap[SDLK_z]; + ed.h_modifier = key.keymap[SDLK_h]; + ed.v_modifier = key.keymap[SDLK_v]; + ed.b_modifier = key.keymap[SDLK_b]; + ed.c_modifier = key.keymap[SDLK_c]; + ed.x_modifier = key.keymap[SDLK_x]; + ed.z_modifier = key.keymap[SDLK_z]; if (key.keymap[SDLK_COMMA]) { @@ -2611,7 +2588,7 @@ static void handle_draw_input() if (key.keymap[SDLK_SPACE]) { - ed.spacemod = !ed.spacemod; + ed.toolbox_open = !ed.toolbox_open; ed.keydelay = 6; } } @@ -2735,7 +2712,7 @@ void editorinput(void) if (ctrl_down) { // Holding ctrl, show the direct mode tile drawer - ed.dmtileeditor = 10; + ed.direct_mode_drawer = 10; } if (ed.keydelay > 0) @@ -2762,12 +2739,12 @@ void editorinput(void) const int numtiles = (int)(texturewidth / 8) * (textureheight / 8); - if (left_pressed) ed.dmtile--; - if (right_pressed) ed.dmtile++; - if (up_pressed) ed.dmtile -= 40; - if (down_pressed) ed.dmtile += 40; + if (left_pressed) ed.direct_mode_tile--; + if (right_pressed) ed.direct_mode_tile++; + if (up_pressed) ed.direct_mode_tile -= 40; + if (down_pressed) ed.direct_mode_tile += 40; - ed.dmtile = POS_MOD(ed.dmtile, numtiles); + ed.direct_mode_tile = POS_MOD(ed.direct_mode_tile, numtiles); } else if (shift_down) { @@ -2829,7 +2806,7 @@ void editorinput(void) if (key.middlebutton) { - ed.dmtile = cl.gettile(ed.levx, ed.levy, ed.tilex, ed.tiley); + ed.direct_mode_tile = cl.gettile(ed.levx, ed.levy, ed.tilex, ed.tiley); } if (enter_pressed) @@ -2871,11 +2848,11 @@ void editorinput(void) switch (ed.box_type) { case BoxType_SCRIPT: - ed.textent = customentities.size(); + ed.text_entity = customentities.size(); ed.add_entity((left / 8) + (ed.levx * 40), (top / 8) + (ed.levy * 30), 19, (right - left) / 8, (bottom - top) / 8); - ed.get_input_line(TEXT_SCRIPT, loc::gettext("Enter script name:"), &(customentities[ed.textent].scriptname)); + ed.get_input_line(TEXT_SCRIPT, loc::gettext("Enter script name:"), &(customentities[ed.text_entity].scriptname)); break; case BoxType_ENEMY: cl.setroomenemyx1(ed.levx, ed.levy, left); @@ -2913,8 +2890,8 @@ void editorinput(void) { // Cancel warp token placement ed.substate = EditorSubState_MAIN; - ed.remove_entity(ed.warpent); - ed.warpent = -1; + ed.remove_entity(ed.warp_token_entity); + ed.warp_token_entity = -1; } // Allow the user to change rooms while placing a warp token @@ -2947,12 +2924,12 @@ void editorinput(void) { if (ed.free(ed.tilex, ed.tiley) == 0) { - customentities[ed.warpent].p1 = ed.tilex + (ed.levx * 40); - customentities[ed.warpent].p2 = ed.tiley + (ed.levy * 30); + customentities[ed.warp_token_entity].p1 = ed.tilex + (ed.levx * 40); + customentities[ed.warp_token_entity].p2 = ed.tiley + (ed.levy * 30); ed.substate = EditorSubState_MAIN; - ed.warpent = -1; + ed.warp_token_entity = -1; ed.lclickdelay = 1; } } @@ -2975,13 +2952,13 @@ void editorinput(void) *ed.current_text_ptr = ed.old_entity_text; if (ed.old_entity_text == "") { - ed.remove_entity(ed.textent); + ed.remove_entity(ed.text_entity); } } ed.current_text_mode = TEXT_NONE; - ed.shiftmenu = false; + ed.help_open = false; ed.substate = EditorSubState_MAIN; } @@ -3114,38 +3091,38 @@ void editorinput(void) if (up_pressed && ed.keydelay <= 0) { - ed.keydelay = 6; - ed.hookmenu--; + ed.keydelay = 3; + ed.selected_script--; } if (down_pressed && ed.keydelay <= 0) { - ed.keydelay = 6; - ed.hookmenu++; + ed.keydelay = 3; + ed.selected_script++; } - ed.hookmenu = SDL_clamp(ed.hookmenu, 0, (int)ed.hooklist.size() - 1); + ed.selected_script = SDL_clamp(ed.selected_script, 0, (int) script.customscripts.size() - 1); - if (ed.hookmenu < ed.hookmenupage) + if (ed.selected_script < ed.script_list_offset) { - ed.hookmenupage = ed.hookmenu; + ed.script_list_offset = ed.selected_script; } - if (ed.hookmenu >= ed.hookmenupage + 9) + if (ed.selected_script >= ed.script_list_offset + 9) { - ed.hookmenupage = ed.hookmenu + 8; + ed.script_list_offset = ed.selected_script - 8; } if (!key.keymap[SDLK_BACKSPACE]) { - ed.deletekeyheld = false; + ed.backspace_held = false; } - if (key.keymap[SDLK_BACKSPACE] && !ed.deletekeyheld && !ed.hooklist.empty()) + if (key.keymap[SDLK_BACKSPACE] && !ed.backspace_held && !script.customscripts.empty()) { - ed.deletekeyheld = true; + ed.backspace_held = true; music.playef(2); - ed.removehook(ed.hooklist[(ed.hooklist.size() - 1) - ed.hookmenu]); + ed.remove_script(script.customscripts[(script.customscripts.size() - 1) - ed.selected_script].name); } if (!game.press_action && !game.press_left && !game.press_right && !up_pressed && !down_pressed && !key.isDown(27)) @@ -3160,26 +3137,21 @@ void editorinput(void) game.jumpheld = true; } - if ((game.press_action || game.press_map) && !ed.hooklist.empty()) + if ((game.press_action || game.press_map) && !script.customscripts.empty()) { game.mapheld = true; ed.substate = EditorSubState_SCRIPTS_EDIT; key.enabletextentry(); key.keybuffer = ""; ed.current_text_ptr = &(key.keybuffer); - ed.sbscript = ed.hooklist[(ed.hooklist.size() - 1) - ed.hookmenu]; - ed.loadhookineditor(ed.sbscript); + ed.current_script = script.customscripts[(script.customscripts.size() - 1) - ed.selected_script].name; + ed.load_script_in_editor(ed.current_script); - ed.sby = ed.sb.size() - 1; - ed.pagey = 0; - while (ed.sby >= ed.lines_visible - 5) - { - ed.pagey++; - ed.sby--; - } + ed.script_cursor_y = ed.script_buffer.size() - 1; + ed.script_offset = SDL_max(ed.script_cursor_y - (ed.lines_visible - SCRIPT_LINE_PADDING), 0); - key.keybuffer = ed.sb[ed.pagey + ed.sby]; - ed.sbx = UTF8_total_codepoints(ed.sb[ed.pagey + ed.sby].c_str()); + key.keybuffer = ed.script_buffer[ed.script_cursor_y]; + ed.script_cursor_x = UTF8_total_codepoints(ed.script_buffer[ed.script_cursor_y].c_str()); music.playef(11); } @@ -3194,47 +3166,26 @@ void editorinput(void) music.playef(11); ed.substate = EditorSubState_MAIN; - // Alright, now readd the script. - ed.addhook(ed.sbscript); + // Alright, now re-add the script. + ed.create_script(ed.current_script, ed.script_buffer); } if (ed.keydelay > 0) ed.keydelay--; if (up_pressed && ed.keydelay <= 0) { - ed.keydelay = 6; - ed.sby--; - if (ed.sby <= 5) - { - if (ed.pagey > 0) - { - ed.pagey--; - ed.sby++; - } - else - { - if (ed.sby < 0) - { - ed.sby = 0; - } - } - } - key.keybuffer = ed.sb[ed.pagey + ed.sby]; + ed.keydelay = 3; + ed.script_cursor_y = SDL_max(0, ed.script_cursor_y - 1); + + key.keybuffer = ed.script_buffer[ed.script_cursor_y]; } if (down_pressed && ed.keydelay <= 0) { - ed.keydelay = 6; - if (ed.sby + ed.pagey < (int)ed.sb.size() - 1) - { - ed.sby++; - if (ed.sby >= ed.lines_visible - 5) - { - ed.pagey++; - ed.sby--; - } - } - key.keybuffer = ed.sb[ed.pagey + ed.sby]; + ed.keydelay = 3; + ed.script_cursor_y = SDL_min((int)ed.script_buffer.size() - 1, ed.script_cursor_y + 1); + + key.keybuffer = ed.script_buffer[ed.script_cursor_y]; } if (key.linealreadyemptykludge) @@ -3243,24 +3194,12 @@ void editorinput(void) key.linealreadyemptykludge = false; } - if (key.pressedbackspace && ed.sb[ed.pagey + ed.sby] == "" && ed.keydelay <= 0) + if (key.pressedbackspace && ed.script_buffer[ed.script_cursor_y] == "" && ed.keydelay <= 0) { //Remove this line completely - ed.removeline(ed.pagey + ed.sby); - ed.sby--; - if (ed.sby <= 5) - { - if (ed.pagey > 0) - { - ed.pagey--; - ed.sby++; - } - else - { - if (ed.sby < 0) ed.sby = 0; - } - } - key.keybuffer = ed.sb[ed.pagey + ed.sby]; + ed.remove_line(ed.script_cursor_y); + ed.script_cursor_y = SDL_max(0, ed.script_cursor_y - 1); + key.keybuffer = ed.script_buffer[ed.script_cursor_y]; ed.keydelay = 6; } @@ -3274,37 +3213,40 @@ void editorinput(void) } }} - ed.sb[ed.pagey + ed.sby] = key.keybuffer; - ed.sbx = UTF8_total_codepoints(ed.sb[ed.pagey + ed.sby].c_str()); + ed.script_buffer[ed.script_cursor_y] = key.keybuffer; + ed.script_cursor_x = UTF8_total_codepoints(ed.script_buffer[ed.script_cursor_y].c_str()); if (enter_pressed) { //Continue to next line - if (ed.sby + ed.pagey >= (int)ed.sb.size()) //we're on the last line + if (ed.script_cursor_y >= (int)ed.script_buffer.size()) //we're on the last line { - ed.sby++; - if (ed.sby >= ed.lines_visible - 5) - { - ed.pagey++; - ed.sby--; - } - key.keybuffer = ed.sb[ed.pagey + ed.sby]; - ed.sbx = UTF8_total_codepoints(ed.sb[ed.pagey + ed.sby].c_str()); + ed.script_cursor_y++; + + key.keybuffer = ed.script_buffer[ed.script_cursor_y]; + ed.script_cursor_x = UTF8_total_codepoints(ed.script_buffer[ed.script_cursor_y].c_str()); } else { //We're not, insert a line instead - ed.sby++; - if (ed.sby >= ed.lines_visible - 5) - { - ed.pagey++; - ed.sby--; - } - ed.insertline(ed.sby + ed.pagey); + ed.script_cursor_y++; + + ed.insert_line(ed.script_cursor_y); key.keybuffer = ""; - ed.sbx = 0; + ed.script_cursor_x = 0; } } + + if (ed.script_cursor_y < ed.script_offset + SCRIPT_LINE_PADDING) + { + ed.script_offset = SDL_max(0, ed.script_cursor_y - SCRIPT_LINE_PADDING); + } + + if (ed.script_cursor_y > ed.script_offset + ed.lines_visible - SCRIPT_LINE_PADDING) + { + ed.script_offset = SDL_min((int) ed.script_buffer.size() - ed.lines_visible + SCRIPT_LINE_PADDING, ed.script_cursor_y - ed.lines_visible + SCRIPT_LINE_PADDING); + } + break; } } @@ -3561,40 +3503,40 @@ void editorclass::set_tile(int x, int y, int t) updatetiles = true; } -int editorclass::autotiling_base( int x, int y ) +int editorclass::autotiling_base(int x, int y) { //Return the base tile for the given tileset and colour const RoomProperty* const room = cl.getroomprop(x, y); - if(room->tileset==0) //Space Station + if (room->tileset == 0) //Space Station { - if(room->tilecol>=22) + if (room->tilecol >= 22) { - return 483 + ((room->tilecol-22)*3); + return 483 + ((room->tilecol - 22) * 3); } - else if(room->tilecol>=11) + else if (room->tilecol >= 11) { - return 283 + ((room->tilecol-11)*3); + return 283 + ((room->tilecol - 11) * 3); } else { - return 83 + (room->tilecol*3); + return 83 + (room->tilecol * 3); } } - else if(room->tileset==1) //Outside + else if (room->tileset == 1) //Outside { - return 480 + (room->tilecol*3); + return 480 + (room->tilecol * 3); } - else if(room->tileset==2) //Lab + else if (room->tileset == 2) //Lab { - return 280 + (room->tilecol*3); + return 280 + (room->tilecol * 3); } - else if(room->tileset==3) //Warp Zone/Intermission + else if (room->tileset == 3) //Warp Zone/Intermission { - return 80 + (room->tilecol*3); + return 80 + (room->tilecol * 3); } - else if(room->tileset==4) //SHIP + else if (room->tileset == 4) //SHIP { - return 101 + (room->tilecol*3); + return 101 + (room->tilecol * 3); } return 0; } @@ -3603,10 +3545,10 @@ int editorclass::autotiling_background_base( int x, int y ) { //Return the base tile for the background of the given tileset and colour const RoomProperty* const room = cl.getroomprop(x, y); - if(room->tileset==0) //Space Station + if (room->tileset == 0) //Space Station { //Pick depending on tilecol - switch(room->tilecol) + switch (room->tilecol) { case 0: case 5: @@ -3664,21 +3606,21 @@ int editorclass::autotiling_background_base( int x, int y ) } } - else if(room->tileset==1) //outside + else if (room->tileset == 1) //outside { - return 680 + (room->tilecol*3); + return 680 + (room->tilecol * 3); } - else if(room->tileset==2) //Lab + else if (room->tileset == 2) //Lab { return 0; } - else if(room->tileset==3) //Warp Zone/Intermission + else if (room->tileset == 3) //Warp Zone/Intermission { - return 120 + (room->tilecol*3); + return 120 + (room->tilecol * 3); } - else if(room->tileset==4) //SHIP + else if (room->tileset == 4) //SHIP { - return 741 + (room->tilecol*3); + return 741 + (room->tilecol * 3); } return 0; } @@ -3761,9 +3703,9 @@ int editorclass::backfree( int x, int y ) x = SDL_clamp(x, 0, 39); y = SDL_clamp(y, 0, 29); - if(x>=0 && y>=0 && x<40 && y<30) + if (x >= 0 && y >= 0 && x < 40 && y < 30) { - if(cl.gettile(levx, levy, x, y)==0) + if (cl.gettile(levx, levy, x, y) == 0) { return 0; } @@ -3773,11 +3715,7 @@ int editorclass::backfree( int x, int y ) bool editorclass::lines_can_pass(int x, int y) { - //Returns 0 if tile is not a block or spike, 1 otherwise - if (x == -1) return free(0, y); - if (y == -1) return free(x, 0); - if (x == 40) return free(39, y); - if (y == 30) return free(x, 29); + // Returns 0 if tile is not a block or spike, 1 otherwise if (x >= 0 && y >= 0 && x < 40 && y < 30) { @@ -3793,17 +3731,17 @@ int editorclass::free( int x, int y ) x = SDL_clamp(x, 0, 39); y = SDL_clamp(y, 0, 29); - if(cl.gettile(levx, levy, x, y)==0) + if (cl.gettile(levx, levy, x, y) == 0) { return 0; } else { - if(cl.gettile(levx, levy, x, y)>=2 && cl.gettile(levx, levy, x, y)<80) + if (cl.gettile(levx, levy, x, y) >= 2 && cl.gettile(levx, levy, x, y) < 80) { return 0; } - if(cl.gettile(levx, levy, x, y)>=680) + if (cl.gettile(levx, levy, x, y) >= 680) { return 0; } diff --git a/desktop_version/src/Editor.h b/desktop_version/src/Editor.h index de1bc75e..9322aad4 100644 --- a/desktop_version/src/Editor.h +++ b/desktop_version/src/Editor.h @@ -195,7 +195,6 @@ public: std::string filename; std::string loaded_filepath; - int drawmode; int tilex, tiley; int keydelay, lclickdelay; bool savekey, loadkey; @@ -211,50 +210,47 @@ public: union { int desc; // Which description row we're changing - int textent; // Entity ID for text prompt + int text_entity; // Entity ID for text prompt }; - bool xmod, zmod, cmod, vmod, bmod, hmod, spacemod; + bool x_modifier, z_modifier, c_modifier, v_modifier, b_modifier, h_modifier, toolbox_open; int roomnamehide; bool saveandquit; - bool shiftmenu, shiftkey; + bool help_open, shiftkey; bool settingskey; - int warpent; + int warp_token_entity; bool updatetiles, changeroom; - bool deletekeyheld; + bool backspace_held; //Script editor stuff - void removeline(int t); - void insertline(int t); + void remove_line(int t); + void insert_line(int t); - std::vector sb; - std::string sbscript; - int sbx, sby; - int pagey; + std::vector script_buffer; + std::string current_script; + int script_cursor_x, script_cursor_y; + int script_offset; int lines_visible; //Functions for interfacing with the script: - void addhook(const std::string& t); - void removehook(const std::string& t); - void addhooktoscript(const std::string& t); - void removehookfromscript(const std::string& t); - void loadhookineditor(const std::string& t); - void clearscriptbuffer(void); - void gethooks(void); - bool checkhook(const std::string& t); - std::vector hooklist; + void create_script(const std::string& name, const std::vector& contents); + void create_script(const std::string& name); + void remove_script(const std::string& name); + void load_script_in_editor(const std::string& name); + void clear_script_buffer(void); + bool script_exists(const std::string& name); - int hookmenupage, hookmenu; + int script_list_offset, selected_script; //Direct Mode variables - int dmtile; - int dmtileeditor; + int direct_mode_tile; + int direct_mode_drawer; - int returneditoralpha; - int oldreturneditoralpha; + int return_message_timer; + int old_return_message_timer; std::vector ghosts; - int currentghosts; + int current_ghosts; }; void editorrender(void); diff --git a/desktop_version/src/Render.cpp b/desktop_version/src/Render.cpp index b5902212..251d490a 100644 --- a/desktop_version/src/Render.cpp +++ b/desktop_version/src/Render.cpp @@ -1954,7 +1954,7 @@ void gamerender(void) #if !defined(NO_CUSTOM_LEVELS) && !defined(NO_EDITOR) if(map.custommode && !map.custommodeforreal && !game.advancetext){ //Return to level editor - int alpha = graphics.lerp(ed.oldreturneditoralpha, ed.returneditoralpha); + int alpha = graphics.lerp(ed.old_return_message_timer, ed.return_message_timer); if (alpha > 100) { diff --git a/desktop_version/src/RenderFixed.cpp b/desktop_version/src/RenderFixed.cpp index a4c605e5..9fb7c090 100644 --- a/desktop_version/src/RenderFixed.cpp +++ b/desktop_version/src/RenderFixed.cpp @@ -117,10 +117,10 @@ void gamerenderfixed(void) map.updateroomnames(); #if !defined(NO_CUSTOM_LEVELS) && !defined(NO_EDITOR) - ed.oldreturneditoralpha = ed.returneditoralpha; - if (map.custommode && !map.custommodeforreal && ed.returneditoralpha > 0) + ed.old_return_message_timer = ed.return_message_timer; + if (map.custommode && !map.custommodeforreal && ed.return_message_timer > 0) { - ed.returneditoralpha -= 15; + ed.return_message_timer -= 15; } // Editor ghosts!