diff --git a/desktop_version/lang/en/strings.xml b/desktop_version/lang/en/strings.xml
index e05e6986..fbc202cf 100644
--- a/desktop_version/lang/en/strings.xml
+++ b/desktop_version/lang/en/strings.xml
@@ -432,6 +432,7 @@
+
diff --git a/desktop_version/src/Input.cpp b/desktop_version/src/Input.cpp
index dcb29828..64ea78ca 100644
--- a/desktop_version/src/Input.cpp
+++ b/desktop_version/src/Input.cpp
@@ -2437,18 +2437,18 @@ void gameinput(void)
}
}
- level_debugger::input();
- if (level_debugger::is_pausing())
- {
- return;
- }
-
game.press_map = false;
if (key.isDown(KEYBOARD_ENTER) || key.isDown(SDLK_KP_ENTER) || key.isDown(game.controllerButton_map) )
{
game.press_map = true;
}
+ level_debugger::input();
+ if (level_debugger::is_pausing())
+ {
+ return;
+ }
+
if (game.advancetext)
{
if (game.pausescript)
diff --git a/desktop_version/src/LevelDebugger.cpp b/desktop_version/src/LevelDebugger.cpp
index b8f902b8..13ab70e9 100644
--- a/desktop_version/src/LevelDebugger.cpp
+++ b/desktop_version/src/LevelDebugger.cpp
@@ -24,6 +24,8 @@ namespace level_debugger
int grabber_offset_x = 0;
int grabber_offset_y = 0;
+ bool right_mouse_held = false;
+
bool is_pausing(void)
{
return active && should_pause;
@@ -71,6 +73,16 @@ namespace level_debugger
return;
}
+ if ((game.press_map || key.isDown(27)) && !game.mapheld)
+ {
+ /* If we press enter, allow the rest of the code in Input.cpp to fire
+ * Intended to return to the editor, but it's fine if it activates
+ * something instead */
+
+ active = false;
+ return;
+ }
+
if (key.isDown(SDLK_TAB))
{
if (!tab_held)
@@ -124,6 +136,24 @@ namespace level_debugger
held_entity = -1;
held_block = -1;
}
+
+ if (key.rightbutton)
+ {
+ if (mouse_within(&bounding_box))
+ {
+ if (!right_mouse_held)
+ {
+ right_mouse_held = true;
+ obj.entities[i].state = obj.entities[i].onentity;
+ obj.entities[i].statedelay = -1;
+ }
+ break;
+ }
+ }
+ else
+ {
+ right_mouse_held = false;
+ }
}
if (held_entity == -1)
@@ -190,13 +220,18 @@ namespace level_debugger
}
}
- void render_info(int y, const char* text, const char* value)
+ void render_info(int y, const char* text, std::string value)
{
char buffer[SCREEN_WIDTH_CHARS + 1];
- vformat_buf(buffer, sizeof(buffer), text, "value:str", value);
+ vformat_buf(buffer, sizeof(buffer), text, "value:str", value.c_str());
font::print(PR_BOR | PR_FONT_8X8, 5, 32 + (10 * y), buffer, 220 - (help.glow), 220 - (help.glow), 255 - (help.glow / 2));
}
+ void render_info(int y, const char* text)
+ {
+ font::print(PR_BOR | PR_FONT_8X8, 5, 32 + (10 * y), text, 220 - (help.glow), 220 - (help.glow), 255 - (help.glow / 2));
+ }
+
void render(void)
{
if (!active)
@@ -260,43 +295,79 @@ namespace level_debugger
if (hovered_entity)
{
entclass* entity = &obj.entities[hovered];
- render_info(line++, "Index: {value}", help.String(hovered).c_str());
- render_info(line++, "X: {value}", help.String(entity->xp).c_str());
- render_info(line++, "Y: {value}", help.String(entity->yp).c_str());
- render_info(line++, "Width: {value}", help.String(entity->w).c_str());
- render_info(line++, "Height: {value}", help.String(entity->h).c_str());
+ render_info(line++, "Index: {value}", help.String(hovered));
+ render_info(line++, "X: {value}", help.String(entity->xp));
+ render_info(line++, "Y: {value}", help.String(entity->yp));
+ render_info(line++, "Width: {value}", help.String(entity->w));
+ render_info(line++, "Height: {value}", help.String(entity->h));
line++;
- render_info(line++, "Rule: {value}", help.String(entity->rule).c_str());
- render_info(line++, "Type: {value}", help.String(entity->type).c_str());
- render_info(line++, "Behave: {value}", help.String(entity->behave).c_str());
- render_info(line++, "Para: {value}", help.String(entity->para).c_str());
+ render_info(line++, "Rule: {value}", help.String(entity->rule));
+ render_info(line++, "Type: {value}", help.String(entity->type));
+ render_info(line++, "Behave: {value}", help.String(entity->behave));
+ render_info(line++, "Para: {value}", help.String(entity->para));
+ render_info(line++, "State: {value}", help.String(entity->state));
line++;
- render_info(line++, "Tile: {value}", help.String(entity->tile).c_str());
- render_info(line++, "Draw Frame: {value}", help.String(entity->drawframe).c_str());
- render_info(line++, "Size: {value}", help.String(entity->size).c_str());
- render_info(line++, "Direction: {value}", help.String(entity->dir).c_str());
+ render_info(line++, "Tile: {value}", help.String(entity->tile));
+ render_info(line++, "Draw Frame: {value}", help.String(entity->drawframe));
+ render_info(line++, "Size: {value}", help.String(entity->size));
+ render_info(line++, "Direction: {value}", help.String(entity->dir));
+
+ line++;
+
+ // Mostly contains duplicates, but for ease of use
+ switch (entity->type)
+ {
+ case 0:
+ // Player
+ render_info(line++, "Gravity: {value}", help.String(game.gravitycontrol));
+ render_info(line++, "Checkpoint: {value}", help.String(game.savepoint));
+ break;
+ case 1:
+ // Moving platforms and enemies
+ render_info(line++, "Speed: {value}", help.String(entity->para));
+ render_info(line++, "Movement type: {value}", help.String(entity->behave));
+ break;
+ case 7:
+ // Trinkets
+ render_info(line++, "ID: {value}", help.String(entity->para));
+ break;
+ case 8:
+ // Checkpoints
+ render_info(line++, "ID: {value}", help.String(entity->para));
+ render_info(line++, "Active: {value}", game.savepoint == entity->para ? "True" : "False");
+ break;
+ case 9:
+ // Horizontal gravity lines
+ render_info(line++, "Horizontal");
+ break;
+ case 10:
+ // Vertical gravity lines
+ render_info(line++, "Vertical");
+ break;
+ }
+
graphics.draw_rect(hover_box.x, hover_box.y, hover_box.w, hover_box.h, graphics.getRGB(32, 255 - help.glow, 255 - help.glow));
}
else
{
blockclass* block = &obj.blocks[hovered];
- render_info(line++, "Index: {value}", help.String(hovered).c_str());
- render_info(line++, "X: {value}", help.String(block->rect.x).c_str());
- render_info(line++, "Y: {value}", help.String(block->rect.y).c_str());
- render_info(line++, "Width: {value}", help.String(block->rect.w).c_str());
- render_info(line++, "Height: {value}", help.String(block->rect.h).c_str());
+ render_info(line++, "Index: {value}", help.String(hovered));
+ render_info(line++, "X: {value}", help.String(block->rect.x));
+ render_info(line++, "Y: {value}", help.String(block->rect.y));
+ render_info(line++, "Width: {value}", help.String(block->rect.w));
+ render_info(line++, "Height: {value}", help.String(block->rect.h));
line++;
if (block->type == TRIGGER || block->type == ACTIVITY)
{
- render_info(line++, "Script: {value}", block->script.c_str());
- render_info(line++, "State: {value}", help.String(block->trigger).c_str());
+ render_info(line++, "Script: {value}", block->script);
+ render_info(line++, "State: {value}", help.String(block->trigger));
}
else if (block->type == DIRECTIONAL)
{
- render_info(line++, "Direction: {value}", help.String(block->trigger).c_str());
+ render_info(line++, "Direction: {value}", help.String(block->trigger));
}
graphics.draw_rect(hover_box.x, hover_box.y, hover_box.w, hover_box.h, graphics.getRGB(255 - help.glow, 32, 32));