From eb84010b942c7bc481be46234760a983291417b0 Mon Sep 17 00:00:00 2001 From: Linus Probert Date: Tue, 7 Oct 2025 23:03:49 +0200 Subject: [PATCH 1/3] Adds large map view It's now possible to press TAB/"Right stick" to display a larger version of the map on top of the play area. This is the same as the minimap. Just larger for easier viewing. --- assets/Extras/Controller.png | Bin 1930 -> 2006 bytes data/maproombuilder.lua | 4 +-- src/gui.c | 64 ++++++++++++++++++++++++++++------- src/gui.h | 9 +++++ src/input.c | 5 ++- src/input.h | 1 + src/main.c | 9 ++++- src/texture.h | 4 +-- src/tooltip.c | 2 ++ src/tooltip_manager.c | 2 ++ 10 files changed, 82 insertions(+), 18 deletions(-) diff --git a/assets/Extras/Controller.png b/assets/Extras/Controller.png index d40f97a6d7c8b929ce923951315e34fa25a52fda..7c6f256f42104904c75f8e851fec6f1e25618467 100644 GIT binary patch delta 1993 zcmV;)2R8VM57rNmBYyw^b5ch_0Itp)=>Px+kV!;ARCt{2oIPk8Nf?IT5jL2Bi`WUd zGp-^x2?!SsYVIxsYyu$=b2^ZboD>0rn>2x|t~gwTyE4r+0Yi!;78abs9VCHpDU#CQ z!U!&nHdP25iQ*z)3@+vh?W|^I=bN3~)sHvU3yY=IJoEkRH-ED`tCbnd;>3PN?9VK( z@92PkO`GxMc9bI=046ScHhy^ccFKuw9+^KZjFWyVyhHTNun(LJTvsO%q2y74>+%y3 z;;F!O`H2YeRN%Up^d~1^=im`kh-^;@{_yP-ek`mhh`i5ltMDTD!Z`5TYRPC;?DyL$ zy!?h~TeYnA$A6_iIZ#?|tJ{zzmA{iJJo?LRRLUh~!*Uz#=#k&}V^+t5$C)r$TBT5Em1Ck+0y@-~Tvu zzIbB^uYcIK!r$3Az~=U$6Th}Hfj>4*DSZ3jB|eN_b>e4^USj&xRfXs4>%fBtPCVAv z!8&c3QUTOZaBZUxg}7~8hJv+?%TUnTD3`*Ed?mUAKtK8ce`n*siPw&Pz_$#YNGw`&5%)Qze&$8T`}(8;QLNIq~PCOo<$LG=HLfk-T$cU+d6#~)rI*` zKYz@WJv~?|crm7Q{`sXV*x>uhz72LdlmLp?k33ZgCSDF+Z!bO*`#sMyuLfT{D&X3! zCW^R;>5Gq@kGw90A*w=`DcDcnai^Su?3NUqJK6yC}V!NI~?RT#fAA`4C*}48S}QXH}U7+ zymxk-vR~c*h^^CSF{icHCq}_Lodx7M!KD)P3D8x&sIr~iJyaLwji*7Ajo>_5DVLlb zC@##4TV%(UH_a8|bD38rL6-@}*5)|zJG*zaPLV8S#L0L+_(3WM!+BF2HMw;3?8%G^ugk`p6vw`c z1e2@P8;2Q!pH3h^_vf6O(&VG0)5M!HFY}_0Bx`!vhbTU>0;pA#4p70ntl}tM55iRXwqX#(Q>#NHy$+C_ zPs__1hA$(HG}1^TjdX(5uYU(5s6GbufP}Ms<0CRDp4SihG4(+_<~~&WEDEwXLROEh z9}7Da`(rMUu6#ZZ&+~Z9l2n|elHY2zjKJJn_u0>0+7EppmJZH=Yez18DrtE$5RdgV_$I?5J$|#2a$X^*_2QI0Si|^ zTxV@c(wEM-&IeHyDDSgYKvL=Rz@U}Xeouw~>)vY$CN%2k_p-taJ{awb*YZAj2r$p{ zA|2P|a8>8*yKG+v5Wxr=bz?U@`#B@ACwZyiclR#%HJv{nCL$g0x4A~qp=&N52 z+l;$9k(M8*loc5)rQ51-Kg4=gP|42=Q6?0?L;U`LdLGv9s#ok`0N zQ^6RnluLO3;Xfy6cIKS%r>iOWp(%70h#eQhAk%W#R>Cg#;sbtb`%ge!)~30a-xui>U|mc5 zpIH+m^Lhn1@InKZoB*EB=R^Nspw(&x0TdVJZ9y1$SrPnD6grjJg4o&JbNXH`1wU|| b_|xG3a+PRPVc2X300000NkvXXu0mjf4&c%c delta 1916 zcmV-?2ZQ+54~h?vBYy``Nkl+Z zFYdh?^Wr!6?H5bK@mD9`!+T~a11BBV5eC8t9_6@>C=dppa$H9g2!l^Ku7gP*1wr<9 z9uOHK>r7xJ&^DXr_ zU`Xljg=(b?j(^b0TD@TeL7)Iz>(94Pt(27m^DW%l{IOl9odrhfkDUL4TD=js_};rQ zR4ZjXYpyAE1Yb`5=6-0foCT%f(4n86G?aRR@03IWD%F zPeOAaC=EAIi*)MF`=C~DpoTVoy>91|0jSj*shy^f#(#N%FbLV42ST1et=<5LAdms5 zYJH|gM390=`;cpPfqpI+%0kx$!@u5TJEH8{G*W^C`thr{42|8zD z|5ZxYG|tLOYQEsmvp~*Kt2dOXkQxWXVuH`{1-$;_PcPwfH?H6{d#dp7tnOm%>7EyV zd0_;&=;bOo)BvJ{@<3&{ciz4c@Moz-10zSjCNzqRW(7HF*>^SS3(AX?ul1OTW&M2_2d z3ZDu@V3Pj|1BA*HbYj+XrX2=j^lR=c{mVbX_X8~VWyFjs6v{nv+fa2wruMC0| zkq~4AFOU3q9`z*?M)ZV#>h5)%d;0+!n_H>*+gH@-dU5BIB1iCzy}-3wO|<^GX(*-2 zZFq664vz0JGZQp!E68c6X5L%+5^5eSc8r17V+crM-=R?(GL}!zulXJD;$A@-(Kj z`ue~q_+GPsJSO;Lf<6HHq8nMZvAKoCnQ7}ZXwwnTqt!~;+kn}bX>p6}(DH3#g}5&B zl|j&FfN|A1O#F?_E#t89m8GzLBb0&`{ao{{n;}Y&bZ6MP8Oam>*xwIe)k-hi}_krLPYV}59Gf}Bmt2dYr zpMo#Hm-?M=i0DQD{YmRy48#=TX@5|pgiH|MMM{fvTgtik`gsyx*OykmUf-p^0EDSv zNKAmt$unPB2>A>qt~z<-#{ozaMO)px@{OhNVQZmY^NpyU$X<*}|k)iWlb~tZ{q&3_IpMQ-J#S@$? zcIY}OJDdUN#=2ibKCLX7lf@2QCuK+GTVlRjP%83C+u1Z(c5xJ6cfywXu5OUTr*?-x#&v*fe5ZUF2Vu(q0}L?0 z00SIj^y&o(N=Cn4knq-TeSbx!gZK4gIW`%@YwicCUwKKY!}s;Q5zzx&xu{l>FF$^e@oHo-}OjEqmEBgv*t^bhHz1P66N z9023m{&{L@N-Zoz8q}Irl`Tp3`lFN3t4389N+OE zDFfv)X9i@2J`VI7S@n0N3$XURrg%W3TECkaX0gGlUwoI#wt$()?x=KJbcpM{{!nah5%r4;!IqSc@+@ zgE0#vy=dU^ 1 or QUICK_MODE)) or CURRENT_LEVEL > 3) and random(8) == 1 then - directions = { "LEFT", "RIGHT", "UP", "DOWN" } + local directions = { "LEFT", "RIGHT", "UP", "DOWN" } room.modifier.type = "WINDY" room.modifier.arg = directions[random(#directions)] end @@ -466,7 +466,7 @@ function module.is_tile_avilable(room, rx, ry) end function module.create_empty_room() - room = { + local room = { exits = {}, active = false, goal = false, diff --git a/src/gui.c b/src/gui.c index aef2a1a3..da58e020 100644 --- a/src/gui.c +++ b/src/gui.c @@ -26,14 +26,15 @@ #include "SDL3/SDL_blendmode.h" #include "SDL3/SDL_pixels.h" #include "SDL3/SDL_render.h" +#include "SDL3/SDL_surface.h" #include "defines.h" +#include "map_room_modifiers.h" #include "roommatrix.h" #include "texture.h" #include "util.h" #include "map.h" #include "texturecache.h" #include "gui_util.h" -#include "tooltip.h" #define DEFAULT_LOG { NULL, LOG_LINES_COUNT, 0, 200 } #define DEFAULT_EVENT_MESSAGES { NULL, 5, 0, 200 } @@ -201,12 +202,13 @@ init_sprites(Gui *gui, Camera *cam) minimap->textures[0] = texture; minimap->destroyTextures = true; minimap->pos = (Position) { 0, 4 }; - minimap->dim = (Dimension) { RIGHT_GUI_WIDTH, MINIMAP_GUI_HEIGHT }; + minimap->dim = (Dimension) { RIGHT_GUI_WIDTH, MINIMAP_GUI_HEIGHT - 8 }; minimap->fixed = true; texture_create_blank(texture, SDL_TEXTUREACCESS_TARGET, cam->renderer); texture_set_blend_mode(texture, SDL_BLENDMODE_BLEND); + texture_set_scale_mode(texture, SDL_SCALEMODE_NEAREST); gui->miniMap = minimap; @@ -494,7 +496,7 @@ gui_update_minimap(Gui *gui, Camera *cam, RoomMatrix *rm) } else if (space->wall || SPACE_IS_OCCUPIED(space)) { c.r = 200; c.g = 200; c.b = 200; } else if (space->tile == NULL) { - c.r = 0; c.g = 0; c.b = 0; + c.a = SDL_ALPHA_TRANSPARENT; } else if (SPACE_IS_WALKABLE(space)) { c.r = 94; c.g = 77; c.b = 179; } else { @@ -503,19 +505,34 @@ gui_update_minimap(Gui *gui, Camera *cam, RoomMatrix *rm) SDL_SetRenderDrawColor(cam->renderer, c.r, c.g, c.b, c.a); SDL_RenderPoint(cam->renderer, x, y); + } } - SDL_SetRenderTarget(cam->renderer, NULL); -} + if (rm->modifier->type != RMOD_TYPE_NONE) { + const SDL_FRect mod_box = { + (float) rm->roomPos.x * MAP_ROOM_WIDTH, + (float) rm->roomPos.y * MAP_ROOM_HEIGHT, + (float) MAP_ROOM_WIDTH, + (float) MAP_ROOM_HEIGHT, + }; + switch (rm->modifier->type) { + case RMOD_TYPE_WINDY: + SDL_SetRenderDrawColor(cam->renderer, 0, 0, 255, 100); + break; + case RMOD_TYPE_FIRE: + SDL_SetRenderDrawColor(cam->renderer, 255, 0, 0, 100); + break; + case RMOD_TYPE_CRUMBLING: + SDL_SetRenderDrawColor(cam->renderer, 247, 151, 67, 100); + break; + default: + assert(false); + + } + SDL_RenderFillRect(cam->renderer, &mod_box); + } -void -gui_reset(Gui *gui, Camera *cam) -{ - // Clear the minimap - SDL_SetRenderTarget(cam->renderer, gui->miniMap->textures[0]->texture); - SDL_SetRenderDrawColor(cam->renderer, 0, 0, 0, SDL_ALPHA_TRANSPARENT); - SDL_RenderClear(cam->renderer); SDL_SetRenderTarget(cam->renderer, NULL); } @@ -532,6 +549,29 @@ gui_render_minimap(Gui *gui, Camera *cam, RoomMatrix *rm) SDL_RenderRect(cam->renderer, &r); } +void +gui_render_minimap_overlay(Gui *gui, Camera *cam) +{ + static SDL_Rect target_box = { + 50, 50, GAME_VIEW_WIDTH - 100, GAME_VIEW_HEIGHT - 100 + }; + + Texture *texture = gui->miniMap->textures[0]; + texture_set_alpha(texture, 200); + texture_render_clip_ex(texture, &target_box, NULL, 0.0, NULL, SDL_FLIP_NONE, cam); + texture_set_alpha(texture, SDL_ALPHA_OPAQUE); +} + +void +gui_reset(Gui *gui, Camera *cam) +{ + // Clear the minimap + SDL_SetRenderTarget(cam->renderer, gui->miniMap->textures[0]->texture); + SDL_SetRenderDrawColor(cam->renderer, 0, 0, 0, SDL_ALPHA_TRANSPARENT); + SDL_RenderClear(cam->renderer); + SDL_SetRenderTarget(cam->renderer, NULL); +} + void gui_log(const char *fmt, ...) { diff --git a/src/gui.h b/src/gui.h index ddc16f4d..86a544b3 100644 --- a/src/gui.h +++ b/src/gui.h @@ -95,6 +95,15 @@ gui_reset(Gui *gui, Camera *cam); void gui_render_minimap(Gui *gui, Camera *cam, RoomMatrix *rm); +/** + * \brief Render the large minimap overlay + * \param[in] gui The gui + * \param[in] cam The camera + * \param[in] rm The room matrix + */ +void +gui_render_minimap_overlay(Gui *gui, Camera *cam); + void gui_render_log(Gui*, Camera*); diff --git a/src/input.c b/src/input.c index d9e529da..b124136e 100644 --- a/src/input.c +++ b/src/input.c @@ -84,6 +84,8 @@ get_event_key(SDL_Event *event) key = KEY_ENTER; break; case SDLK_SPACE: key = KEY_SPACE; break; + case SDLK_TAB: + key = KEY_TAB; break; default: key = 0; break; } @@ -117,8 +119,9 @@ get_event_button(SDL_Event *event) key = KEY_ENTER; break; case SDL_GAMEPAD_BUTTON_BACK : key = KEY_ESC; break; - case SDL_GAMEPAD_BUTTON_LEFT_STICK : case SDL_GAMEPAD_BUTTON_RIGHT_STICK : + key = KEY_TAB; break; + case SDL_GAMEPAD_BUTTON_LEFT_STICK : key = KEY_SPACE; break; default: key = 0; break; diff --git a/src/input.h b/src/input.h index eec925cc..1997cc6b 100644 --- a/src/input.h +++ b/src/input.h @@ -39,6 +39,7 @@ #define KEY_ESC 0x4000 #define KEY_ENTER 0x8000 #define KEY_SPACE 0x10000 +#define KEY_TAB 0x20000 #define KEY_CTRL_M 0x1 #define KEY_CTRL_S 0x2 diff --git a/src/main.c b/src/main.c index 3af4a30d..89ddc5fc 100644 --- a/src/main.c +++ b/src/main.c @@ -117,6 +117,7 @@ static bool is_player_dead(void); static void initGamepads(void); static SDL_Surface *window_icon = NULL; +static bool gShowMap = false; static bool initSDL(void) @@ -807,6 +808,9 @@ handle_main_input(void) } handle_settings_input(); + if (input_key_is_pressed(&input, KEY_TAB)) { + gShowMap = !gShowMap; + } } static bool @@ -907,7 +911,7 @@ check_next_level(void) } } -static void +static inline void populateUpdateData(UpdateData *data, float deltatime) { data->player = gPlayer; @@ -1071,6 +1075,9 @@ run_game_render(void) SDL_SetRenderViewport(gRenderer, &mainViewport); particle_engine_render_global(gCamera); + if (gShowMap) { + gui_render_minimap_overlay(gGui, gCamera); + } gui_render_tooltip(gGui, gCamera); if (gGameState == IN_GAME_MENU) { diff --git a/src/texture.h b/src/texture.h index a6cb94f7..086d5eef 100644 --- a/src/texture.h +++ b/src/texture.h @@ -95,8 +95,8 @@ void texture_render_clip(Texture*, SDL_Rect*, SDL_Rect*, Camera*); void -texture_render_clip_ex(Texture*, SDL_Rect*, SDL_Rect*, double angle, SDL_Point*, - SDL_FlipMode, Camera*); +texture_render_clip_ex(Texture *texture, SDL_Rect *dest, SDL_Rect *src, double angle, SDL_Point *rotation_point, + SDL_FlipMode flip, Camera *camera); void texture_destroy(Texture *texture); diff --git a/src/tooltip.c b/src/tooltip.c index 9057bc77..bf3f9b3b 100644 --- a/src/tooltip.c +++ b/src/tooltip.c @@ -47,6 +47,8 @@ render_button_texture_for(const char *text, Position pos, Camera *cam, GamepadTy clip = CONTROLLER_OPT(32, controller_type); } else if (strcmp(text, "ENTER") == 0) { clip = CONTROLLER_OPT(0, controller_type); + } else if (strcmp(text, "TAB") == 0) { + clip = CLIP16(32, 80); } else if (strcmp(text, "SPACE") == 0) { clip = CLIP16(0, 80); } else { diff --git a/src/tooltip_manager.c b/src/tooltip_manager.c index 0d0dc94b..0fe57967 100644 --- a/src/tooltip_manager.c +++ b/src/tooltip_manager.c @@ -79,6 +79,8 @@ static char *how_to_play_tooltip[] = { "", " TOGGLE FULLSCREEN: CTRL + F", "", "", + " TOGGLE MAP: ", "TAB", "", + "", " TOGGLE MENU: ", "ESC", "", "", " Your stats and inventory are listed in the right panel", "", From df58ef6277cbf16a2881b3c03b16a6c71293ae6a Mon Sep 17 00:00:00 2001 From: Linus Probert Date: Tue, 7 Oct 2025 23:20:19 +0200 Subject: [PATCH 2/3] Alignment fix and review fixes --- src/gui.c | 4 ++-- src/gui.h | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/gui.c b/src/gui.c index da58e020..7a0398ad 100644 --- a/src/gui.c +++ b/src/gui.c @@ -197,7 +197,7 @@ init_sprites(Gui *gui, Camera *cam) Texture *texture = texture_create(); texture->dim = (Dimension) { RIGHT_GUI_WIDTH, - MINIMAP_GUI_HEIGHT + MINIMAP_GUI_HEIGHT - 8 }; minimap->textures[0] = texture; minimap->destroyTextures = true; @@ -509,7 +509,7 @@ gui_update_minimap(Gui *gui, Camera *cam, RoomMatrix *rm) } } - if (rm->modifier->type != RMOD_TYPE_NONE) { + if (rm->modifier && rm->modifier->type != RMOD_TYPE_NONE) { const SDL_FRect mod_box = { (float) rm->roomPos.x * MAP_ROOM_WIDTH, (float) rm->roomPos.y * MAP_ROOM_HEIGHT, diff --git a/src/gui.h b/src/gui.h index 86a544b3..c2422597 100644 --- a/src/gui.h +++ b/src/gui.h @@ -99,7 +99,6 @@ gui_render_minimap(Gui *gui, Camera *cam, RoomMatrix *rm); * \brief Render the large minimap overlay * \param[in] gui The gui * \param[in] cam The camera - * \param[in] rm The room matrix */ void gui_render_minimap_overlay(Gui *gui, Camera *cam); From becfb6ed1605f6e28c089d241a01deaddb8ab912 Mon Sep 17 00:00:00 2001 From: Linus Probert Date: Tue, 7 Oct 2025 23:32:27 +0200 Subject: [PATCH 3/3] Fix nit-picks --- src/texture.c | 26 +++++++++++++------------- src/texture.h | 4 ++-- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/texture.c b/src/texture.c index b51b0e11..ff7d7041 100644 --- a/src/texture.c +++ b/src/texture.c @@ -283,8 +283,8 @@ texture_render_clip(Texture *texture, SDL_Rect *box, SDL_Rect *clip, Camera *cam } void -texture_render_clip_ex(Texture *texture, SDL_Rect *box, SDL_Rect *clip, double angle, SDL_Point *point, - SDL_FlipMode flipType, Camera *cam) +texture_render_clip_ex(Texture *texture, SDL_Rect *dst, SDL_Rect *src, double angle, SDL_Point *rotation_point, + SDL_FlipMode flip_mode, Camera *cam) { if (!texture->texture) return; @@ -294,22 +294,22 @@ texture_render_clip_ex(Texture *texture, SDL_Rect *box, SDL_Rect *clip, double a SDL_FRect fclip; SDL_FPoint fpoint; - if (box) - SDL_RectToFRect(box, &fbox); - if (clip) - SDL_RectToFRect(clip, &fclip); - if (point) { - fpoint.x = (float) point->x; - fpoint.y = (float) point->y; + if (dst) + SDL_RectToFRect(dst, &fbox); + if (src) + SDL_RectToFRect(src, &fclip); + if (rotation_point) { + fpoint.x = (float) rotation_point->x; + fpoint.y = (float) rotation_point->y; } SDL_RenderTextureRotated(cam->renderer, texture->texture, - clip ? &fclip : NULL, - box ? &fbox : NULL, + src ? &fclip : NULL, + dst ? &fbox : NULL, angle, - point ? &fpoint : NULL, - flipType); + rotation_point ? &fpoint : NULL, + flip_mode); texture->lastAccess = SDL_GetTicks(); } diff --git a/src/texture.h b/src/texture.h index 086d5eef..0a2ab37f 100644 --- a/src/texture.h +++ b/src/texture.h @@ -95,8 +95,8 @@ void texture_render_clip(Texture*, SDL_Rect*, SDL_Rect*, Camera*); void -texture_render_clip_ex(Texture *texture, SDL_Rect *dest, SDL_Rect *src, double angle, SDL_Point *rotation_point, - SDL_FlipMode flip, Camera *camera); +texture_render_clip_ex(Texture *texture, SDL_Rect *dst, SDL_Rect *src, double angle, SDL_Point *rotation_point, + SDL_FlipMode flip_mode, Camera *cam); void texture_destroy(Texture *texture);