static char * alloc_stairs_description(int level, enum area_type area_type) { char const *direction = area_type_stairs_down == area_type ? "down" : "up"; char *description = str_alloc_formatted("stairs %s to ", direction); realloc_append_level_description(&description, level); return description; }
void treasure_map_generate(struct treasure_map *treasure_map, struct rnd *rnd) { enum treasure_map_type treasure_map_type; int score = roll("1d100", rnd); if (score <= 5) { treasure_map_type = treasure_map_type_false_map; treasure_map->is_false = true; /* TODO: generate description of false treasure */ } else if (score <= 70) { treasure_map_type = treasure_map_type_map_to_monetary_treasure; generate_monetary_treasure(&treasure_map->treasure, rnd); } else if (score <= 90) { treasure_map_type = treasure_map_type_map_to_magic_treasure; generate_magic_treasure(&treasure_map->treasure, rnd); } else { treasure_map_type = treasure_map_type_map_to_combined_hoard; generate_combined_hoard(&treasure_map->treasure, rnd); } int miles; score = roll("1d100", rnd); if (score <= 20) { miles = 0; } else if (score <= 60) { miles = roll("1d4", rnd) + 4; } else if (score <= 90) { miles = roll("1d4", rnd) * 10; } else { miles = roll("1d10", rnd) * 50; } enum direction direction = direction_random(rnd); if (miles) { char const *disposition; score = roll("1d100", rnd); if (score <= 10) { disposition = "buried and unguarded"; } else if (score <= 20) { disposition = "hidden in water"; } else if (score <= 70) { disposition = "guarded in a lair"; } else if (score <= 80) { disposition = "somewhere in a ruins"; } else if (score <= 90) { disposition = "in a burial crypt"; } else { disposition = "secreted in a town"; } char *description = treasure_alloc_description(&treasure_map->treasure); treasure_map->true_description = str_alloc_formatted("%smap to %s of %s %i miles to the %s, %s", (treasure_map->is_false ? "false " : ""), treasure_map_types[treasure_map_type], description, miles, direction_name(direction), disposition); free_or_die(description); } else { char *description = treasure_alloc_description(&treasure_map->treasure); treasure_map->true_description = str_alloc_formatted("%smap to %s of %s in nearby labyrinth to the %s", (treasure_map->is_false ? "false " : ""), treasure_map_types[treasure_map_type], description, direction_name(direction)); free_or_die(description); } }