- [NEW] Generació i pintat del mapa de totes les habitacions

This commit is contained in:
2025-11-01 14:02:37 +01:00
parent 94cc7d9242
commit ed1ee498f8
3 changed files with 103 additions and 8 deletions

View File

@@ -8,7 +8,7 @@ bool loop();
void game::init() void game::init()
{ {
draw::init("DILEMMAKER v0.1", 320, 240, 3, false); draw::init("DILEMMAKER v0.1", 640, 480, 1, false);
game::setState(loop); game::setState(loop);
enemies::load(); enemies::load();
rooms::load(); rooms::load();
@@ -17,8 +17,8 @@ void game::init()
bool loop() bool loop()
{ {
draw::setViewport(32, 24, 256, 128); draw::cls(0);
rooms::draw(); rooms::drawFullMap();
draw::render(); draw::render();
return true; return true;
} }

View File

@@ -17,6 +17,7 @@ namespace rooms
int num_total_rooms = 0; int num_total_rooms = 0;
std::string current_room = ""; std::string current_room = "";
std::map<std::string, room_t> rooms; std::map<std::string, room_t> rooms;
int full_map_x = 0, full_map_y = 0;
static const char *paletteMap[] = { static const char *paletteMap[] = {
"black", "bright_black", "blue", "bright_blue", "black", "bright_black", "blue", "bright_blue",
@@ -51,13 +52,13 @@ namespace rooms
} else if (key == "tileSetFile") { } else if (key == "tileSetFile") {
room.tileSetFile = images::getImage("tilesets/"+value); room.tileSetFile = images::getImage("tilesets/"+value);
} else if (key == "roomUp") { } else if (key == "roomUp") {
room.roomUp = value; room.roomUp = value.substr(0, value.find_last_of('.'));;
} else if (key == "roomDown") { } else if (key == "roomDown") {
room.roomDown = value; room.roomDown = value.substr(0, value.find_last_of('.'));;
} else if (key == "roomLeft") { } else if (key == "roomLeft") {
room.roomLeft = value; room.roomLeft = value.substr(0, value.find_last_of('.'));;
} else if (key == "roomRight") { } else if (key == "roomRight") {
room.roomRight = value; room.roomRight = value.substr(0, value.find_last_of('.'));;
} else if (key == "itemColor1") { } else if (key == "itemColor1") {
room.itemColor1 = colorToNum(value); room.itemColor1 = colorToNum(value);
} else if (key == "itemColor2") { } else if (key == "itemColor2") {
@@ -65,7 +66,7 @@ namespace rooms
} }
} else if (section == "enemy") { } else if (section == "enemy") {
if (key == "animation") { 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") { } else if (key == "x") {
room.enemies.back().x = std::stoi(value); room.enemies.back().x = std::stoi(value);
} else if (key == "y") { } 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; ty<tiles->h/8; ty++) {
for (int tx=0; tx<tiles->w/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<std::string, bool> 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() void load()
{ {
// Get all room files // Get all room files
@@ -216,12 +273,17 @@ namespace rooms
std::cout << "Processing " << path.filename() << '\n'; std::cout << "Processing " << path.filename() << '\n';
loadRoom(path); loadRoom(path);
loadTiles(path); loadTiles(path);
generateThumbnail(path);
} }
} catch (const fs::filesystem_error& e) { } catch (const fs::filesystem_error& e) {
std::cerr << "Filesystem error: " << e.what() << '\n'; std::cerr << "Filesystem error: " << e.what() << '\n';
} }
visited.clear();
detectFullMapOffset("01", 0, 0);
full_map_x++;
full_map_y++;
/*for (auto &item : rooms) /*for (auto &item : rooms)
{ {
room_t &room = item.second; room_t &room = item.second;
@@ -238,6 +300,11 @@ namespace rooms
void draw() void draw()
{ {
room_t &room = rooms["02"]; room_t &room = rooms["02"];
draw::cls(room.border);
draw::setViewport(32, 24, 256, 128);
draw::cls(room.bgColor);
draw::setSource(room.tileSetFile); draw::setSource(room.tileSetFile);
for (int y=0; y<16; ++y) { 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::draw(enemy.x*8, enemy.y*8, anim.frame_width, anim.frame_height, tile*anim.frame_width, 0);
draw::restorecol(1); 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);
} }
} }
}

View File

@@ -62,8 +62,12 @@ namespace rooms
std::vector<enemy_t> enemies; std::vector<enemy_t> enemies;
std::vector<item_t> items; std::vector<item_t> items;
uint16_t tiles[32][16]; uint16_t tiles[32][16];
draw::surface *thumbnail {nullptr};
int map_x {0};
int map_y {0};
}; };
void load(); void load();
void draw(); void draw();
void drawFullMap();
} }