DrawDungeon2: Use special event marker for boss floors

This commit is contained in:
kichikuou
2025-07-14 16:51:59 +09:00
parent 5ed05ba685
commit 3c7634522a
3 changed files with 39 additions and 4 deletions
+1 -1
View File
@@ -26,7 +26,7 @@ struct dtx;
struct polyobj;
struct dungeon_renderer;
struct dungeon_renderer *dungeon_renderer_create(enum draw_dungeon_version version, struct dtx *dtx, GLuint *event_textures, int nr_event_textures, struct polyobj *po);
struct dungeon_renderer *dungeon_renderer_create(enum draw_dungeon_version version, int num, struct dtx *dtx, GLuint *event_textures, int nr_event_textures, struct polyobj *po);
void dungeon_renderer_free(struct dungeon_renderer *r);
void dungeon_renderer_render(struct dungeon_renderer *r, struct dgn_cell **cells, int nr_cells, mat4 view_transform, mat4 proj_transform);
void dungeon_renderer_enable_event_markers(struct dungeon_renderer *r, bool enable);
+1 -1
View File
@@ -231,7 +231,7 @@ bool dungeon_load(struct dungeon_context *ctx, int num)
if (!event_textures)
return false;
ctx->renderer = dungeon_renderer_create(ctx->version, ctx->dtx, event_textures, nr_event_textures, polyobj);
ctx->renderer = dungeon_renderer_create(ctx->version, num, ctx->dtx, event_textures, nr_event_textures, polyobj);
if (polyobj)
polyobj_free(polyobj);
+37 -2
View File
@@ -44,6 +44,7 @@ enum floor_marker {
R6_RED_OCTAGRAM = 63,
// Dungeons & Dolls
DD_MAGIC_CIRCLE = 40,
DD_RED_OCTAGRAM = 41,
DD_WHITE_OCTAGRAM = 42,
// GALZOO Island
GZ_MAGIC_CIRCLE = 0,
@@ -67,6 +68,12 @@ static const struct marker_info dolls_marker_info[] = {
{0},
};
static const struct marker_info dolls_boss_marker_info[] = {
{11, 43, 3, DD_WHITE_OCTAGRAM}, // treasure chest
{17, 20, 20, DD_RED_OCTAGRAM}, // boss
{0},
};
static const struct marker_info galzoo_marker_info[] = {
{11, 1, 0, GZ_MAGIC_CIRCLE}, // item
{12, 2, 0, GZ_MAGIC_CIRCLE}, // enemy
@@ -350,7 +357,29 @@ static void init_polyobjs(struct dungeon_renderer *r, struct polyobj *po)
}
}
struct dungeon_renderer *dungeon_renderer_create(enum draw_dungeon_version version, struct dtx *dtx, GLuint *event_textures, int nr_event_textures, struct polyobj *po)
static bool is_dolls_boss_floor(int num)
{
switch (num) {
case 20:
case 40:
case 60:
case 80:
case 100:
case 120:
case 140:
case 150:
case 160:
case 180:
case 200:
case 300:
case 500:
return true;
default:
return false;
}
}
struct dungeon_renderer *dungeon_renderer_create(enum draw_dungeon_version version, int num, struct dtx *dtx, GLuint *event_textures, int nr_event_textures, struct polyobj *po)
{
struct dungeon_renderer *r = xcalloc(1, sizeof(struct dungeon_renderer));
@@ -382,9 +411,15 @@ struct dungeon_renderer *dungeon_renderer_create(enum draw_dungeon_version versi
r->event_textures = event_textures;
r->nr_event_textures = nr_event_textures;
r->marker_table = marker_tables[version];
r->draw_event_markers = true;
if (version == DRAW_DUNGEON_2 && is_dolls_boss_floor(num)) {
// Use special marker table for Dungeons & Dolls boss floor
r->marker_table = dolls_boss_marker_info;
} else {
r->marker_table = marker_tables[version];
}
if (po)
init_polyobjs(r, po);