From 5b82b260ab22edd6c6edb17cde5598ab48aae40d Mon Sep 17 00:00:00 2001 From: Raimon Zamora Date: Mon, 18 May 2026 09:04:04 +0200 Subject: [PATCH] - [NEW] F1, F2 i F3 per al zoom i fullscreen - [NEW] [tools/scredit.lua] C per a borrar pantalla en el caracter seleccionar, F per a flood fill --- ascii.cpp | 82 +++++++++++++++++++++++++---------------------- lua.cpp | 2 +- tools/scredit.lua | 53 ++++++++++++++++++++++++++++++ 3 files changed, 97 insertions(+), 40 deletions(-) diff --git a/ascii.cpp b/ascii.cpp index 11b10aa..430a883 100644 --- a/ascii.cpp +++ b/ascii.cpp @@ -53,6 +53,7 @@ SDL_Window *mini_win; SDL_Renderer *mini_ren; SDL_Texture *mini_bak = NULL; uint8_t window_zoom = 2; +bool window_fullscreen = false; uint16_t window_width = BASE_WINDOW_WIDTH * window_zoom; uint16_t window_height = BASE_WINDOW_HEIGHT * window_zoom; uint16_t window_hborder = (window_width - screen_width*8*window_zoom) / 2; @@ -212,27 +213,55 @@ void romcpy() { void debug_set_prompt(); -void applyZoom(SDL_Window* win, int zoom, int baseW, int baseH) +void applyZoom(int zoom) { + if (zoom < 1) return; + + const SDL_DisplayMode *dm = SDL_GetDesktopDisplayMode(SDL_GetPrimaryDisplay()); + if ( (BASE_WINDOW_WIDTH*zoom > dm->w) || (BASE_WINDOW_HEIGHT*zoom > dm->h) ) return; + + window_zoom = zoom; + // 1. Tamaño actual int oldW, oldH; - SDL_GetWindowSize(win, &oldW, &oldH); + SDL_GetWindowSize(mini_win, &oldW, &oldH); // 2. Posición actual int oldX, oldY; - SDL_GetWindowPosition(win, &oldX, &oldY); + SDL_GetWindowPosition(mini_win, &oldX, &oldY); // 3. Nuevo tamaño - int newW = baseW * zoom; - int newH = baseH * zoom; + window_width = BASE_WINDOW_WIDTH * window_zoom; + window_height = BASE_WINDOW_HEIGHT * window_zoom; + window_hborder = (window_width - screen_width*8*window_zoom) / 2; + window_vborder = (window_height - screen_height*8*window_zoom) / 2; // 4. Calcular nueva posición para mantener el centro - int newX = SDL_max(0, oldX - (newW - oldW) / 2); - int newY = SDL_max(0, oldY - (newH - oldH) / 2); + int newX = SDL_max(0, oldX - (window_width - oldW) / 2); + int newY = SDL_max(0, oldY - (window_height - oldH) / 2); // 5. Aplicar - SDL_SetWindowSize(win, newW, newH); - SDL_SetWindowPosition(win, newX, newY); + SDL_SetWindowSize(mini_win, window_width, window_height); + SDL_SetWindowPosition(mini_win, newX, newY); +} + +void applyFullScreen() { + if (window_fullscreen) { + window_fullscreen = false; + SDL_SetWindowFullscreen(mini_win, window_fullscreen); + applyZoom(window_zoom); + } else { + window_fullscreen = true; + const SDL_DisplayMode *dm = SDL_GetDesktopDisplayMode(SDL_GetPrimaryDisplay()); + int max_w_zoom = dm->w / (screen_width*8); + int max_h_zoom = dm->h / (screen_height*8); + int max_window_zoom = SDL_min(max_w_zoom, max_h_zoom); + window_width = dm->w; + window_height = dm->h; + window_hborder = (window_width - screen_width*8*max_window_zoom) / 2; + window_vborder = (window_height - screen_height*8*max_window_zoom) / 2; + SDL_SetWindowFullscreen(mini_win, window_fullscreen); + } } int main(int argc,char*argv[]) { @@ -292,36 +321,11 @@ int main(int argc,char*argv[]) { } if (mini_eve.type == SDL_EVENT_KEY_DOWN) { if (mini_eve.key.scancode == SDL_SCANCODE_F1) { - if (window_zoom>1) { - window_zoom--; - window_width = BASE_WINDOW_WIDTH * window_zoom; - window_height = BASE_WINDOW_HEIGHT * window_zoom; - window_hborder = (window_width - screen_width*8*window_zoom) / 2; - window_vborder = (window_height - screen_height*8*window_zoom) / 2; - - applyZoom(mini_win, window_zoom, BASE_WINDOW_WIDTH, BASE_WINDOW_HEIGHT); - } + applyZoom(window_zoom-1); } else if (mini_eve.key.scancode == SDL_SCANCODE_F2) { - const SDL_DisplayMode *dm = SDL_GetDesktopDisplayMode(SDL_GetPrimaryDisplay()); - if ( (BASE_WINDOW_WIDTH*(window_zoom+1) <= dm->w) && (BASE_WINDOW_HEIGHT*(window_zoom+1) <= dm->h) ) { - window_zoom++; - window_width = BASE_WINDOW_WIDTH * window_zoom; - window_height = BASE_WINDOW_HEIGHT * window_zoom; - window_hborder = (window_width - screen_width*8*window_zoom) / 2; - window_vborder = (window_height - screen_height*8*window_zoom) / 2; - applyZoom(mini_win, window_zoom, BASE_WINDOW_WIDTH, BASE_WINDOW_HEIGHT); - } + applyZoom(window_zoom+1); } else if (mini_eve.key.scancode == SDL_SCANCODE_F3) { - const SDL_DisplayMode *dm = SDL_GetDesktopDisplayMode(SDL_GetPrimaryDisplay()); - int max_w_zoom = dm->w / (screen_width*8); - int max_h_zoom = dm->h / (screen_height*8); - int max_window_zoom = SDL_min(max_w_zoom, max_h_zoom); - window_width = BASE_WINDOW_WIDTH * max_window_zoom; - window_height = BASE_WINDOW_HEIGHT * max_window_zoom; - window_hborder = (window_width - screen_width*8*window_zoom) / 2; - window_vborder = (window_height - screen_height*8*window_zoom) / 2; - applyZoom(mini_win, max_window_zoom, BASE_WINDOW_WIDTH, BASE_WINDOW_HEIGHT); - + applyFullScreen(); } else if ((mini_eve.key.scancode == SDL_SCANCODE_ESCAPE) && (mini_eve.key.mod & SDL_KMOD_LCTRL) ) { if (lua_is_playing()) { lua_pause(); @@ -355,8 +359,8 @@ int main(int argc,char*argv[]) { float mx, my; mouse_buttons = SDL_GetMouseState(&mx, &my); if (mx>=window_hborder && my>=window_vborder && mx<(window_width-window_hborder) && my<(window_height-window_vborder)) { - mouse_x = (mx-window_hborder) / ((window_width-window_hborder)/screen_width); - mouse_y = (my-window_vborder) / ((window_height-window_vborder)/screen_height); + mouse_x = (mx-window_hborder) / ((window_width-window_hborder*2)/screen_width); + mouse_y = (my-window_vborder) / ((window_height-window_vborder*2)/screen_height); } if (lua_is_playing()) { diff --git a/lua.cpp b/lua.cpp index cc67e8a..5a57bde 100644 --- a/lua.cpp +++ b/lua.cpp @@ -437,7 +437,7 @@ const char boot[] = "ink(1) print('G A M E',8,16)" "ink(4) print('S Y S T E M',20,16)" "ink(7) print('mini',9,8)" - "ink(8) print('v0.7.8',34,29)" + "ink(8) print('v0.7.9',34,29)" "w=time() " "end " "function update()" diff --git a/tools/scredit.lua b/tools/scredit.lua index 4692c15..5714b76 100644 --- a/tools/scredit.lua +++ b/tools/scredit.lua @@ -69,6 +69,50 @@ function update_picker() end end +local W, H = 40, 30 + +function flood_fill(x, y) + -- índice inicial + local idx0 = x + y * W + local target_chr = map[idx0] + local target_col = col[idx0] + + -- Si ya está pintado con lo que queremos, no hacemos nada + if target_chr == sel_chr and target_col == sel_col then + return + end + + -- Pila para DFS iterativo + local stack = {} + local sp = 1 + stack[sp] = {x = x, y = y} + + while sp > 0 do + local p = stack[sp] + sp = sp - 1 + + local px, py = p.x, p.y + + -- Comprobación de límites + if px >= 0 and px < W and py >= 0 and py < H then + local idx = px + py * W + + -- ¿Coincide con el color original? + if map[idx] == target_chr and col[idx] == target_col then + -- Pintar + map[idx] = sel_chr + col[idx] = sel_col + + -- Añadir vecinos + sp = sp + 1; stack[sp] = {x = px+1, y = py} + sp = sp + 1; stack[sp] = {x = px-1, y = py} + sp = sp + 1; stack[sp] = {x = px, y = py+1} + sp = sp + 1; stack[sp] = {x = px, y = py-1} + end + end + end +end + function draw_map() for i=0,1199 do poke(i, map[i]) @@ -107,5 +151,14 @@ function draw_map() col[i] = peek(1200+i) end + elseif btn(KEY_C) then + for y=0,29 do + for x=0,39 do + map[x+y*40] = sel_chr + col[x+y*40] = sel_col + end + end + elseif btn(KEY_F) then + flood_fill(mousex(),mousey()) end end