static void
generator_add_digger_test(void)
{
    struct dungeon *dungeon = dungeon_alloc();
    
    struct dungeon_options *dungeon_options = dungeon_options_alloc_default();
    struct generator *generator = generator_alloc(dungeon, global_rnd, dungeon_options, NULL, NULL);
    assert(0 == generator->diggers_count);
    
    struct digger *digger1 = generator_add_digger(generator,
                                                  point_make(1, 1, 1),
                                                  direction_north);
    assert(1 == generator->diggers_count);
    
    generator_delete_digger(generator, digger1);
    assert(0 == generator->diggers_count);

    digger1 = generator_add_digger(generator,
                                   point_make(1, 1, 1),
                                   direction_north);
    assert(1 == generator->diggers_count);

    struct digger *digger2 = generator_add_digger(generator,
                                                  point_make(2, 2, 2),
                                                  direction_north);
    assert(2 == generator->diggers_count);
    
    struct digger *digger3 = generator_add_digger(generator,
                                                  point_make(3, 3, 3),
                                                  direction_north);
    assert(3 == generator->diggers_count);
    
    generator_delete_digger(generator, digger2);
    assert(2 == generator->diggers_count);
    assert(digger1 == generator->diggers[0]);
    assert(digger3 == generator->diggers[1]);
    
    generator_delete_digger(generator, digger1);
    assert(1 == generator->diggers_count);
    assert(digger3 == generator->diggers[0]);
    
    generator_free(generator);
    dungeon_options_free(dungeon_options);
    dungeon_free(dungeon);
}
Esempio n. 2
0
static void
check_wall_for_secret_door(struct generator *generator,
                           struct point point,
                           enum direction direction)
{
    struct tile *inside_tile = generator_tile_at(generator, point);
    struct tile *outside_tile = generator_tile_at(generator,
                                                  point_move(point, 1, direction));
    switch (direction) {
        case direction_north:
            if (wall_type_solid != outside_tile->walls.south) return;
            break;
        case direction_south:
            if (wall_type_solid != inside_tile->walls.south) return;
            break;
        case direction_east:
            if (wall_type_solid != outside_tile->walls.west) return;
            break;
        case direction_west:
            if (wall_type_solid != inside_tile->walls.west) return;
            break;
        default:
            fail("Unrecognized direction %i", direction);
            break;
    }
    
    int score = roll("1d4", generator->rnd);
    if (score == 1) {
        if (tile_type_empty == outside_tile->type) {
            generator_set_wall(generator,
                               inside_tile->point,
                               direction,
                               wall_type_secret_door);
        } else {
            struct digger *door_digger = generator_add_digger(generator,
                                                              point_move(point, 1, direction),
                                                              direction);
            if (!space_beyond_door(door_digger, wall_type_secret_door, false)) {
                generator_delete_digger(generator, door_digger);
            }
        }
    }
}