diff --git a/include/dungeon/renderer.h b/include/dungeon/renderer.h index 21377c3..3a9fc19 100644 --- a/include/dungeon/renderer.h +++ b/include/dungeon/renderer.h @@ -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); diff --git a/src/dungeon/dungeon.c b/src/dungeon/dungeon.c index 9c4f6b9..7d4cc67 100644 --- a/src/dungeon/dungeon.c +++ b/src/dungeon/dungeon.c @@ -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); diff --git a/src/dungeon/renderer.c b/src/dungeon/renderer.c index 3a7ae36..df1d4b3 100644 --- a/src/dungeon/renderer.c +++ b/src/dungeon/renderer.c @@ -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);