From ed1ee498f81c8cb3a3196ee2fc6749267115d59d Mon Sep 17 00:00:00 2001 From: Raimon Zamora Date: Sat, 1 Nov 2025 14:02:37 +0100 Subject: [PATCH] =?UTF-8?q?-=20[NEW]=20Generaci=C3=B3=20i=20pintat=20del?= =?UTF-8?q?=20mapa=20de=20totes=20les=20habitacions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/main.cpp | 6 +-- source/rooms.cpp | 101 ++++++++++++++++++++++++++++++++++++++++++++--- source/rooms.h | 4 ++ 3 files changed, 103 insertions(+), 8 deletions(-) diff --git a/source/main.cpp b/source/main.cpp index a1e770e..65b192b 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -8,7 +8,7 @@ bool loop(); void game::init() { - draw::init("DILEMMAKER v0.1", 320, 240, 3, false); + draw::init("DILEMMAKER v0.1", 640, 480, 1, false); game::setState(loop); enemies::load(); rooms::load(); @@ -17,8 +17,8 @@ void game::init() bool loop() { - draw::setViewport(32, 24, 256, 128); - rooms::draw(); + draw::cls(0); + rooms::drawFullMap(); draw::render(); return true; } diff --git a/source/rooms.cpp b/source/rooms.cpp index 33da6eb..d9b312e 100644 --- a/source/rooms.cpp +++ b/source/rooms.cpp @@ -17,6 +17,7 @@ namespace rooms int num_total_rooms = 0; std::string current_room = ""; std::map rooms; + int full_map_x = 0, full_map_y = 0; static const char *paletteMap[] = { "black", "bright_black", "blue", "bright_blue", @@ -51,13 +52,13 @@ namespace rooms } else if (key == "tileSetFile") { room.tileSetFile = images::getImage("tilesets/"+value); } else if (key == "roomUp") { - room.roomUp = value; + room.roomUp = value.substr(0, value.find_last_of('.'));; } else if (key == "roomDown") { - room.roomDown = value; + room.roomDown = value.substr(0, value.find_last_of('.'));; } else if (key == "roomLeft") { - room.roomLeft = value; + room.roomLeft = value.substr(0, value.find_last_of('.'));; } else if (key == "roomRight") { - room.roomRight = value; + room.roomRight = value.substr(0, value.find_last_of('.'));; } else if (key == "itemColor1") { room.itemColor1 = colorToNum(value); } else if (key == "itemColor2") { @@ -65,7 +66,7 @@ namespace rooms } } else if (section == "enemy") { if (key == "animation") { - room.enemies.back().animation = value.substr(0, value.find_last_of('.'));; + room.enemies.back().animation = value.substr(0, value.find_last_of('.')); } else if (key == "x") { room.enemies.back().x = std::stoi(value); } else if (key == "y") { @@ -197,6 +198,62 @@ namespace rooms } } + void generateThumbnail(fs::path filename) + { + std::string room_name = filename.stem().string(); + room_t &room = rooms[room_name]; + + // Primer generem un pixel per a cada tile del gif de tiles + draw::surface *tiles = room.tileSetFile; + uint8_t pixels[tiles->w/8][tiles->h/8]; + for (int ty=0; tyh/8; ty++) { + for (int tx=0; txw/8; tx++) { + uint8_t count[16] {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; + for (int y=0;y<8;++y) + for (int x=0;x<8;x++) { + count[tiles->pixels[(x+tx*8)+(y+ty*8)*tiles->w]]++; + } + uint8_t max_count=0; + uint8_t max_index=0; + for (int i=0; i<16; ++i) if (count[i] > max_count) {max_count=count[i]; max_index=i;} + pixels[tx][ty] = max_index; + } + } + + room.thumbnail = draw::createSurface(32,16); + for (int y=0; y<16; ++y) { + for (int x=0; x<32; ++x) { + uint16_t tile = room.tiles[x][y]; + if (tile>0) { + tile--; + room.thumbnail->pixels[x+y*32] = pixels[tile%24][tile/24]; + } else { + room.thumbnail->pixels[x+y*32] = room.bgColor; + } + } + } + } + + std::map visited; + + void detectFullMapOffset(std::string room_name, int x, int y) + { + if (visited.find(room_name)!= visited.end()) return; + printf("Visiting '%s'...\n", room_name.c_str()); + visited[room_name] = true; + + if (full_map_x < x) full_map_x = x; + if (full_map_y < y) full_map_y = y; + + room_t &room = rooms[room_name]; + room.map_x = x; + room.map_y = y; + if (room.roomUp != "0") detectFullMapOffset(room.roomUp, x, y+1); + if (room.roomLeft != "0") detectFullMapOffset(room.roomLeft, x+1, y); + if (room.roomDown != "0") detectFullMapOffset(room.roomDown, x, y-1); + if (room.roomRight != "0") detectFullMapOffset(room.roomRight, x-1, y); + } + void load() { // Get all room files @@ -216,12 +273,17 @@ namespace rooms std::cout << "Processing " << path.filename() << '\n'; loadRoom(path); loadTiles(path); + generateThumbnail(path); } } catch (const fs::filesystem_error& e) { std::cerr << "Filesystem error: " << e.what() << '\n'; } + visited.clear(); + detectFullMapOffset("01", 0, 0); + full_map_x++; + full_map_y++; /*for (auto &item : rooms) { room_t &room = item.second; @@ -238,6 +300,11 @@ namespace rooms void draw() { room_t &room = rooms["02"]; + + draw::cls(room.border); + draw::setViewport(32, 24, 256, 128); + draw::cls(room.bgColor); + draw::setSource(room.tileSetFile); for (int y=0; y<16; ++y) { @@ -259,5 +326,29 @@ namespace rooms draw::draw(enemy.x*8, enemy.y*8, anim.frame_width, anim.frame_height, tile*anim.frame_width, 0); draw::restorecol(1); } + + draw::resetViewport(); + + draw::setSource(room.thumbnail); + draw::draw(); } + + void drawFullMap() + { + for (auto &item : rooms) + { + auto room = item.second; + int x = ((full_map_x-room.map_x)*38)-1; + int y = ((full_map_y-room.map_y)*22)-1; + draw::resetViewport(); + draw::color(COLOR_WHITE); + draw::rect(x, y, 34, 18); + draw::setSource(room.thumbnail); + draw::draw(x+1, y+1, 32, 16, 0, 0); + if (room.roomUp != "0") draw::fillrect(x+15, y-4, 4, 4); + //if (room.roomDown != "0") draw::fillrect(x+15, y+16, 4, 4); + if (room.roomLeft != "0") draw::fillrect(x-4, y+7, 4, 4); + } + } + } diff --git a/source/rooms.h b/source/rooms.h index 234eee8..f233d7b 100644 --- a/source/rooms.h +++ b/source/rooms.h @@ -62,8 +62,12 @@ namespace rooms std::vector enemies; std::vector items; uint16_t tiles[32][16]; + draw::surface *thumbnail {nullptr}; + int map_x {0}; + int map_y {0}; }; void load(); void draw(); + void drawFullMap(); }