Exemple #1
0
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);
    }
}