From fa513b80eccdbaae445586f5bdb3e7b21384c14c Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Sun, 27 Apr 2025 01:24:08 +0200 Subject: [PATCH] ru:: better floodfill --- rogueviz/ru/ru.cpp | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/rogueviz/ru/ru.cpp b/rogueviz/ru/ru.cpp index 347bc9a9..8d052dd2 100644 --- a/rogueviz/ru/ru.cpp +++ b/rogueviz/ru/ru.cpp @@ -42,14 +42,25 @@ bool last_mkey = false; extern int mousepx, mousepy; -void floodfill(int x, int y) { +int lev = 0; +void floodfill(int x, int y, int src, int tgt) { + dynamicval d(lev, lev+1); + println(hlog, lev, ": ", tie(x, y)); if(x < 0 || y < 0 || x >= room_x || y >= room_y) return; - if(current_room->block_at[y][x] != 0) return; - current_room->place_block_full(x, y, 8 * sel); - floodfill(x+1, y); - floodfill(x-1, y); - floodfill(x, y+1); - floodfill(x, y-1); + if(y > room_y - b_margin && tgt) return; + if(current_room->block_at[y][x] != src) return; + current_room->place_block_full(x, y, tgt); + floodfill(x+1, y, src, tgt); + floodfill(x-1, y, src, tgt); + floodfill(x, y+1, src, tgt); + floodfill(x, y-1, src, tgt); + } + +void floodfill_pick(int x, int y) { + if(x < 0 || y < 0 || x >= room_x || y >= room_y) return; + auto cur = current_room->block_at[y][x]; + if(cur != 8*sel) floodfill(x, y, cur, 8 * sel); + else floodfill(x, y, 8 * sel, 0); } bool last_keystate[KEYSTATES], cur_keystate[KEYSTATES]; @@ -79,7 +90,7 @@ void editmap_frame() { } dialog::display(); }); - if(keypressed('f')) floodfill(mousepx / block_x, mousepy / block_y); + if(keypressed('f')) floodfill_pick(mousepx / block_x, mousepy / block_y); if(keypressed('t')) { m.where_x = mousepx; m.where_y = mousepy; m.vel_x = 0; m.vel_y = 0; } }