From 936a155262fb28cee75b567af5990e6a91b2f24b Mon Sep 17 00:00:00 2001 From: Jason Jones Date: Mon, 16 Dec 2019 20:27:38 -0900 Subject: [PATCH] Retire procedurally generated houses and basements (#36075) --- data/json/obsolete_terrains.json | 6 +- .../overmap/multitile_city_buildings.json | 2 +- .../overmap_terrain_residential.json | 18 +- src/mapgen_functions.cpp | 950 ------------------ src/mapgen_functions.h | 10 - src/savegame.cpp | 8 + 6 files changed, 15 insertions(+), 979 deletions(-) diff --git a/data/json/obsolete_terrains.json b/data/json/obsolete_terrains.json index 6efe843d24515..02b8fb9278261 100644 --- a/data/json/obsolete_terrains.json +++ b/data/json/obsolete_terrains.json @@ -269,7 +269,11 @@ "dairy_farm_SW", "dairy_farm_SE", "megastore", - "megastore_entrance" + "megastore_entrance", + "house_base_north", + "house_base_south", + "house_base_east", + "house_base_west" ] } ] diff --git a/data/json/overmap/multitile_city_buildings.json b/data/json/overmap/multitile_city_buildings.json index d3f3460264f36..bdabbc119972f 100644 --- a/data/json/overmap/multitile_city_buildings.json +++ b/data/json/overmap/multitile_city_buildings.json @@ -3,7 +3,7 @@ "type": "city_building", "id": "house_base", "locations": [ "land", "swamp" ], - "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "house_base_north" }, { "point": [ 0, 0, -1 ], "overmap": "basement" } ] + "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "house_north" }, { "point": [ 0, 0, -1 ], "overmap": "basement" } ] }, { "type": "city_building", diff --git a/data/json/overmap/overmap_terrain/overmap_terrain_residential.json b/data/json/overmap/overmap_terrain/overmap_terrain_residential.json index bc6579c6778c7..b8729e2b59088 100644 --- a/data/json/overmap/overmap_terrain/overmap_terrain_residential.json +++ b/data/json/overmap/overmap_terrain/overmap_terrain_residential.json @@ -11,8 +11,7 @@ { "type": "overmap_terrain", "id": "basement", - "copy-from": "generic_city_house_basement", - "mapgen": [ { "method": "builtin", "name": "basement_junk" }, { "method": "builtin", "name": "basement_spiders" } ] + "copy-from": "generic_city_house_basement" }, { "type": "overmap_terrain", @@ -34,11 +33,6 @@ "see_cost": 2, "extras": "build", "mondensity": 2, - "mapgen": [ - { "method": "builtin", "name": "house_generic_boxy" }, - { "method": "builtin", "name": "house_generic_big_livingroom" }, - { "method": "builtin", "name": "house_generic_center_hallway" } - ], "flags": [ "SIDEWALK", "GENERIC_LOOT" ] }, { @@ -50,16 +44,6 @@ "see_cost": 2, "flags": [ "SIDEWALK", "GENERIC_LOOT" ] }, - { - "type": "overmap_terrain", - "id": "house_base", - "copy-from": "house", - "mapgen": [ - { "method": "builtin", "name": "house_generic_boxy" }, - { "method": "builtin", "name": "house_generic_big_livingroom" }, - { "method": "builtin", "name": "house_generic_center_hallway" } - ] - }, { "type": "overmap_terrain", "id": "duplex", diff --git a/src/mapgen_functions.cpp b/src/mapgen_functions.cpp index 7a59435eca528..bcaed432731bf 100644 --- a/src/mapgen_functions.cpp +++ b/src/mapgen_functions.cpp @@ -118,13 +118,7 @@ building_gen_pointer get_mapgen_cfunction( const std::string &ident ) { "river_straight", &mapgen_river_straight }, { "river_curved", &mapgen_river_curved }, { "parking_lot", &mapgen_parking_lot }, - { "house_generic_boxy", &mapgen_generic_house_boxy }, - { "house_generic_big_livingroom", &mapgen_generic_house_big_livingroom }, - { "house_generic_center_hallway", &mapgen_generic_house_center_hallway }, { "spider_pit", mapgen_spider_pit }, - { "basement_generic_layout", &mapgen_basement_generic_layout }, // empty, not bound - { "basement_junk", &mapgen_basement_junk }, - { "basement_spiders", &mapgen_basement_spiders }, { "cave", &mapgen_cave }, { "cave_rat", &mapgen_cave_rat }, { "cavern", &mapgen_cavern }, @@ -1911,950 +1905,6 @@ void mapgen_parking_lot( mapgendata &dat ) } } -void house_room( room_type type, int x1, int y1, int x2, int y2, mapgendata &dat ) -{ - map *const m = &dat.m; - int pos_x1 = 0; - int pos_y1 = 0; - - if( type == room_backyard ) { //processing it separately - m->furn_set( point( x1 + 2, y1 ), f_chair ); - m->furn_set( point( x1 + 2, y1 + 1 ), f_table ); - for( int i = x1; i <= x2; i++ ) { - for( int j = y1; j <= y2; j++ ) { - if( ( i == x1 ) || ( i == x2 || ( j == y2 ) ) ) { - m->ter_set( point( i, j ), t_fence ); - } else { - m->ter_set( point( i, j ), t_grass ); - if( one_in( 35 ) && !m->has_furn( point( i, j ) ) ) { - m->ter_set( point( i, j ), t_tree_young ); - } else if( one_in( 35 ) && !m->has_furn( point( i, j ) ) ) { - m->ter_set( point( i, j ), t_tree ); - } else if( one_in( 25 ) ) { - m->ter_set( point( i, j ), t_dirt ); - } - } - } - } - m->ter_set( point( ( x1 + x2 ) / 2, y2 ), t_fencegate_c ); - return; - } - - for( int i = x1; i <= x2; i++ ) { - for( int j = y1; j <= y2; j++ ) { - if( dat.is_groundcover( m->ter( point( i, j ) ) ) || - //m->ter(i, j) == t_grass || m->ter(i, j) == t_dirt || - m->ter( point( i, j ) ) == t_floor ) { - if( j == y1 || j == y2 ) { - m->ter_set( point( i, j ), t_wall ); - } else if( i == x1 || i == x2 ) { - m->ter_set( point( i, j ), t_wall ); - } else { - m->ter_set( point( i, j ), t_floor ); - } - } - } - } - for( int i = y1 + 1; i <= y2 - 1; i++ ) { - m->ter_set( point( x1, i ), t_wall ); - m->ter_set( point( x2, i ), t_wall ); - } - - items_location placed = "none"; - int chance = 0; - int rn = 0; - switch( type ) { - case room_study: - placed = "livingroom"; - chance = 40; - break; - case room_living: - placed = "livingroom"; - chance = 83; - //choose random wall - switch( rng( 1, 4 ) ) { //some bookshelves - case 1: - pos_x1 = x1 + 2; - pos_y1 = y1 + 1; - m->furn_set( point( x1 + 2, y2 - 1 ), f_desk ); - while( pos_x1 < x2 ) { - pos_x1 += 1; - if( m->ter( point( pos_x1, pos_y1 ) ) == t_wall ) { - break; - } - m->furn_set( point( pos_x1, pos_y1 ), f_bookcase ); - pos_x1 += 1; - if( m->ter( point( pos_x1, pos_y1 ) ) == t_wall ) { - break; - } - m->furn_set( point( pos_x1, pos_y1 ), f_bookcase ); - pos_x1 += 2; - } - break; - case 2: - pos_x1 = x2 - 2; - pos_y1 = y1 + 1; - m->furn_set( point( x1 + 2, y2 - 1 ), f_desk ); - while( pos_x1 > x1 ) { - pos_x1 -= 1; - if( m->ter( point( pos_x1, pos_y1 ) ) == t_wall ) { - break; - } - m->furn_set( point( pos_x1, pos_y1 ), f_bookcase ); - pos_x1 -= 1; - if( m->ter( point( pos_x1, pos_y1 ) ) == t_wall ) { - break; - } - m->furn_set( point( pos_x1, pos_y1 ), f_bookcase ); - pos_x1 -= 2; - } - break; - case 3: - pos_x1 = x1 + 2; - pos_y1 = y2 - 1; - m->furn_set( point( x1 + 2, y2 - 1 ), f_desk ); - while( pos_x1 < x2 ) { - pos_x1 += 1; - if( m->ter( point( pos_x1, pos_y1 ) ) == t_wall ) { - break; - } - m->furn_set( point( pos_x1, pos_y1 ), f_bookcase ); - pos_x1 += 1; - if( m->ter( point( pos_x1, pos_y1 ) ) == t_wall ) { - break; - } - m->furn_set( point( pos_x1, pos_y1 ), f_bookcase ); - pos_x1 += 2; - } - break; - case 4: - pos_x1 = x2 - 2; - pos_y1 = y2 - 1; - m->furn_set( point( x1 + 2, y2 - 1 ), f_desk ); - while( pos_x1 > x1 ) { - pos_x1 -= 1; - if( m->ter( point( pos_x1, pos_y1 ) ) == t_wall ) { - break; - } - m->furn_set( point( pos_x1, pos_y1 ), f_bookcase ); - pos_x1 -= 1; - if( m->ter( point( pos_x1, pos_y1 ) ) == t_wall ) { - break; - } - m->furn_set( point( pos_x1, pos_y1 ), f_bookcase ); - pos_x1 -= 2; - } - break; - } - - break; - case room_kitchen: { - placed = "kitchen"; - chance = 75; - m->place_items( "cleaning", 58, point( x1 + 1, y1 + 1 ), point( x2 - 1, y2 - 2 ), false, - dat.when() ); - m->place_items( "home_hw", 40, point( x1 + 1, y1 + 1 ), point( x2 - 1, y2 - 2 ), false, - dat.when() ); - int oven_x = -1; - int oven_y = -1; - int cupboard_x = -1; - int cupboard_y = -1; - - switch( rng( 1, 4 ) ) { //fridge, sink, oven and some cupboards near them - case 1: - m->furn_set( point( x1 + 2, y1 + 1 ), f_fridge ); - m->place_items( "fridge", 82, point( x1 + 2, y1 + 1 ), point( x1 + 2, y1 + 1 ), false, dat.when() ); - m->furn_set( point( x1 + 1, y1 + 1 ), f_sink ); - if( x1 + 4 < x2 ) { - oven_x = x1 + 3; - cupboard_x = x1 + 4; - oven_y = cupboard_y = y1 + 1; - } - - break; - case 2: - m->furn_set( point( x2 - 2, y1 + 1 ), f_fridge ); - m->place_items( "fridge", 82, point( x2 - 2, y1 + 1 ), point( x2 - 2, y1 + 1 ), false, dat.when() ); - m->furn_set( point( x2 - 1, y1 + 1 ), f_sink ); - if( x2 - 4 > x1 ) { - oven_x = x2 - 3; - cupboard_x = x2 - 4; - oven_y = cupboard_y = y1 + 1; - } - break; - case 3: - m->furn_set( point( x1 + 2, y2 - 1 ), f_fridge ); - m->place_items( "fridge", 82, point( x1 + 2, y2 - 1 ), point( x1 + 2, y2 - 1 ), false, dat.when() ); - m->furn_set( point( x1 + 1, y2 - 1 ), f_sink ); - if( x1 + 4 < x2 ) { - oven_x = x1 + 3; - cupboard_x = x1 + 4; - oven_y = cupboard_y = y2 - 1; - } - break; - case 4: - m->furn_set( point( x2 - 2, y2 - 1 ), f_fridge ); - m->place_items( "fridge", 82, point( x2 - 2, y2 - 1 ), point( x2 - 2, y2 - 1 ), false, dat.when() ); - m->furn_set( point( x2 - 1, y2 - 1 ), f_sink ); - if( x2 - 4 > x1 ) { - oven_x = x2 - 3; - cupboard_x = x2 - 4; - oven_y = cupboard_y = y2 - 1; - } - break; - } - - // oven and it's contents - if( oven_x != -1 && oven_y != -1 ) { - m->furn_set( point( oven_x, oven_y ), f_oven ); - m->place_items( "oven", 70, point( oven_x, oven_y ), point( oven_x, oven_y ), false, - dat.when() ); - } - - // cupboard and it's contents - if( cupboard_x != -1 && cupboard_y != -1 ) { - m->furn_set( point( cupboard_x, cupboard_y ), f_cupboard ); - m->place_items( "cleaning", 30, point( cupboard_x, cupboard_y ), point( cupboard_x, cupboard_y ), - false, dat.when() ); - m->place_items( "home_hw", 30, point( cupboard_x, cupboard_y ), point( cupboard_x, cupboard_y ), - false, dat.when() ); - m->place_items( "cannedfood", 30, point( cupboard_x, cupboard_y ), point( cupboard_x, cupboard_y ), - false, dat.when() ); - m->place_items( "pasta", 30, point( cupboard_x, cupboard_y ), point( cupboard_x, cupboard_y ), - false, dat.when() ); - } - - if( one_in( 2 ) ) { //dining table in the kitchen - square_furn( m, f_table, static_cast( ( x1 + x2 ) / 2 ) - 1, - static_cast( ( y1 + y2 ) / 2 ) - 1, - static_cast( ( x1 + x2 ) / 2 ), - static_cast( ( y1 + y2 ) / 2 ) ); - m->place_items( "dining", 20, point( static_cast( ( x1 + x2 ) / 2 ) - 1, - static_cast( ( y1 + y2 ) / 2 ) - 1 ), - point( ( x1 + x2 ) / 2, static_cast( ( y1 + y2 ) / 2 ) ), false, dat.when() ); - } - if( one_in( 2 ) ) { - for( int i = 0; i <= 2; i++ ) { - pos_x1 = rng( x1 + 2, x2 - 2 ); - pos_y1 = rng( y1 + 1, y2 - 1 ); - if( m->ter( point( pos_x1, pos_y1 ) ) == t_floor && - !( m->furn( point( pos_x1, pos_y1 ) ) == f_cupboard || - m->furn( point( pos_x1, pos_y1 ) ) == f_oven || m->furn( point( pos_x1, pos_y1 ) ) == f_sink || - m->furn( point( pos_x1, pos_y1 ) ) == f_fridge ) ) { - m->furn_set( point( pos_x1, pos_y1 ), f_chair ); - } - } - } - - } - break; - case room_bedroom: - placed = "bedroom"; - chance = 78; - if( one_in( 14 ) ) { - m->place_items( "homeguns", 58, point( x1 + 1, y1 + 1 ), point( x2 - 1, y2 - 1 ), false, - dat.when() ); - } - if( one_in( 10 ) ) { - m->place_items( "home_hw", 40, point( x1 + 1, y1 + 1 ), point( x2 - 1, y2 - 1 ), false, - dat.when() ); - } - switch( rng( 1, 5 ) ) { - case 1: - m->furn_set( point( x1 + 1, y1 + 2 ), f_bed ); - m->furn_set( point( x1 + 1, y1 + 3 ), f_bed ); - m->place_items( "bed", 60, point( x1 + 1, y1 + 2 ), point( x1 + 1, y1 + 2 ), false, dat.when() ); - m->place_items( "bed", 60, point( x1 + 1, y1 + 3 ), point( x1 + 1, y1 + 3 ), false, dat.when() ); - break; - case 2: - m->furn_set( point( x1 + 2, y2 - 1 ), f_bed ); - m->furn_set( point( x1 + 3, y2 - 1 ), f_bed ); - m->place_items( "bed", 60, point( x1 + 2, y2 - 1 ), point( x1 + 2, y2 - 1 ), false, dat.when() ); - m->place_items( "bed", 60, point( x1 + 2, y2 - 1 ), point( x1 + 2, y2 - 1 ), false, dat.when() ); - break; - case 3: - m->furn_set( point( x2 - 1, y2 - 3 ), f_bed ); - m->furn_set( point( x2 - 1, y2 - 2 ), f_bed ); - m->place_items( "bed", 60, point( x2 - 1, y2 - 3 ), point( x2 - 1, y2 - 3 ), false, dat.when() ); - m->place_items( "bed", 60, point( x2 - 1, y2 - 2 ), point( x2 - 1, y2 - 2 ), false, dat.when() ); - break; - case 4: - m->furn_set( point( x2 - 3, y1 + 1 ), f_bed ); - m->furn_set( point( x2 - 2, y1 + 1 ), f_bed ); - m->place_items( "bed", 60, point( x2 - 3, y1 + 1 ), point( x2 - 3, y1 + 1 ), false, dat.when() ); - m->place_items( "bed", 60, point( x2 - 2, y1 + 1 ), point( x2 - 2, y1 + 1 ), false, dat.when() ); - break; - case 5: - m->furn_set( point( ( x1 + x2 ) / 2, y2 - 1 ), f_bed ); - m->furn_set( point( static_cast( ( x1 + x2 ) / 2 ) + 1, y2 - 1 ), f_bed ); - m->furn_set( point( ( x1 + x2 ) / 2, y2 - 2 ), f_bed ); - m->furn_set( point( static_cast( ( x1 + x2 ) / 2 ) + 1, y2 - 2 ), f_bed ); - m->place_items( "bed", 60, point( ( x1 + x2 ) / 2, y2 - 1 ), - point( ( x1 + x2 ) / 2, y2 - 1 ), false, - dat.when() ); - m->place_items( "bed", 60, point( static_cast( ( x1 + x2 ) / 2 ) + 1, y2 - 1 ), - point( static_cast( ( x1 + x2 ) / 2 ) + 1, y2 - 1 ), - false, dat.when() ); - m->place_items( "bed", 60, point( ( x1 + x2 ) / 2, y2 - 2 ), - point( ( x1 + x2 ) / 2, y2 - 2 ), false, - dat.when() ); - m->place_items( "bed", 60, point( static_cast( ( x1 + x2 ) / 2 ) + 1, y2 - 2 ), - point( static_cast( ( x1 + x2 ) / 2 ) + 1, y2 - 2 ), - false, dat.when() ); - break; - } - switch( rng( 1, 4 ) ) { - case 1: - m->furn_set( point( x1 + 2, y1 + 1 ), f_dresser ); - m->place_items( "dresser", 80, point( x1 + 2, y1 + 1 ), point( x1 + 2, y1 + 1 ), false, - dat.when() ); - break; - case 2: - m->furn_set( point( x2 - 2, y2 - 1 ), f_dresser ); - m->place_items( "dresser", 80, point( x2 - 2, y2 - 1 ), point( x2 - 2, y2 - 1 ), false, - dat.when() ); - break; - case 3: - rn = static_cast( ( x1 + x2 ) / 2 ); - m->furn_set( point( rn, y1 + 1 ), f_dresser ); - m->place_items( "dresser", 80, point( rn, y1 + 1 ), point( rn, y1 + 1 ), false, dat.when() ); - break; - case 4: - rn = static_cast( ( y1 + y2 ) / 2 ); - m->furn_set( point( x1 + 1, rn ), f_dresser ); - m->place_items( "dresser", 80, point( x1 + 1, rn ), point( x1 + 1, rn ), false, dat.when() ); - break; - } - break; - case room_bathroom: - m->place_toilet( point( x2 - 1, y2 - 1 ) ); - m->place_items( "harddrugs", 18, point( x1 + 1, y1 + 1 ), point( x2 - 1, y2 - 2 ), false, - dat.when() ); - m->place_items( "cleaning", 48, point( x1 + 1, y1 + 1 ), point( x2 - 1, y2 - 2 ), false, - dat.when() ); - placed = "softdrugs"; - chance = 72; - m->furn_set( point( x2 - 1, y2 - 2 ), f_bathtub ); - if( one_in( 3 ) && !( m->ter( point( x2 - 1, y2 - 3 ) ) == t_wall ) ) { - m->furn_set( point( x2 - 1, y2 - 3 ), f_bathtub ); - } - if( !( ( m->furn( point( x1 + 1, y2 - 2 ) ) == f_toilet ) || - ( m->furn( point( x1 + 1, y2 - 2 ) ) == f_bathtub ) ) ) { - m->furn_set( point( x1 + 1, y2 - 2 ), f_sink ); - } - if( one_in( 4 ) ) { - for( int x = x1 + 1; x <= x2 - 1; x++ ) { - for( int y = y1 + 1; y <= y2 - 1; y++ ) { - m->ter_set( point( x, y ), t_linoleum_white ); - } - } - } else if( one_in( 4 ) ) { - for( int x = x1 + 1; x <= x2 - 1; x++ ) { - for( int y = y1 + 1; y <= y2 - 1; y++ ) { - m->ter_set( point( x, y ), t_linoleum_gray ); - } - } - } - break; - default: - break; - } - m->place_items( placed, chance, point( x1 + 1, y1 + 1 ), point( x2 - 1, y2 - 1 ), false, - dat.when() ); -} - -void mapgen_generic_house_boxy( mapgendata &dat ) -{ - mapgen_generic_house( dat, 1 ); -} - -void mapgen_generic_house_big_livingroom( mapgendata &dat ) -{ - mapgen_generic_house( dat, 2 ); -} - -void mapgen_generic_house_center_hallway( mapgendata &dat ) -{ - mapgen_generic_house( dat, 3 ); -} - -void mapgen_generic_house( mapgendata &dat, int variant ) -{ - map *const m = &dat.m; - int rn = 0; - int lw = 0; - int rw = 0; - int mw = 0; - int tw = 0; - int bw = 0; - int cw = 0; - int actual_house_height = 0; - int bw_old = 0; - - // West external wall - lw = rng( 0, 4 ); - // Middle wall between bedroom & kitchen/bath - // NOLINTNEXTLINE(clang-analyzer-deadcode.DeadStores) - mw = lw + rng( 7, 10 ); - // East external wall - rw = SEEX * 2 - rng( 1, 5 ); - // North external wall - tw = rng( 1, 6 ); - // South external wall - bw = SEEX * 2 - rng( 2, 5 ); - // Middle wall between living room & kitchen/bed - // NOLINTNEXTLINE(clang-analyzer-deadcode.DeadStores) - cw = tw + rng( 4, 7 ); - //reserving some space for backyard. Actual south external wall. - actual_house_height = bw - rng( 4, 6 ); - bw_old = bw; - - for( int i = 0; i < SEEX * 2; i++ ) { - for( int j = 0; j < SEEY * 2; j++ ) { - if( i > lw && i < rw && j > tw && j < bw ) { - m->ter_set( point( i, j ), t_floor ); - } else { - m->ter_set( point( i, j ), dat.groundcover() ); - } - //placing north and south walls - if( i >= lw && i <= rw && ( j == tw || j == bw ) ) { - m->ter_set( point( i, j ), t_wall ); - } - //placing west (lw) and east walls - if( ( i == lw || i == rw ) && j > tw && j < bw /*actual_house_height*/ ) { - m->ter_set( point( i, j ), t_wall ); - } - } - } - switch( variant ) { - case 1: - // Quadrants, essentially - mw = rng( lw + 5, rw - 5 ); - cw = tw + rng( 4, 7 ); - house_room( room_living, mw, tw, rw, cw, dat ); - house_room( room_kitchen, lw, tw, mw, cw, dat ); - m->ter_set( point( mw, rng( tw + 2, cw - 2 ) ), ( one_in( 3 ) ? t_door_c : t_floor ) ); - rn = rng( lw + 1, mw - 2 ); - m->ter_set( point( rn, tw ), t_window_domestic ); - m->ter_set( point( rn + 1, tw ), t_window_domestic ); - rn = rng( mw + 1, rw - 2 ); - m->ter_set( point( rn, tw ), t_window_domestic ); - m->ter_set( point( rn + 1, tw ), t_window_domestic ); - // Bottom part mw - rn = rng( lw + 3, rw - 3 ); - if( rn <= lw + 5 ) { - // Bedroom on right, bathroom on left - house_room( room_bedroom, rn, cw, rw, bw, dat ); - - // Put door between bedroom and living - m->ter_set( point( rng( rw - 1, rn > mw ? rn + 1 : mw + 1 ), cw ), t_door_c ); - - if( bw - cw >= 10 && rn - lw >= 6 ) { - // All fits, placing bathroom and 2nd bedroom - house_room( room_bathroom, lw, bw - 5, rn, bw, dat ); - house_room( room_bedroom, lw, cw, rn, bw - 5, dat ); - - // Put door between bathroom and bedroom - m->ter_set( point( rn, rng( bw - 4, bw - 1 ) ), t_door_c ); - - if( one_in( 3 ) ) { - // Put door between 2nd bedroom and 1st bedroom - m->ter_set( point( rn, rng( cw + 1, bw - 6 ) ), t_door_c ); - } else { - // ...Otherwise, between 2nd bedroom and kitchen - m->ter_set( point( rng( lw + 1, rn > mw ? mw - 1 : rn - 1 ), cw ), t_door_c ); - } - } else if( bw - cw > 4 ) { - // Too big for a bathroom, not big enough for 2nd bedroom - // Make it a bathroom anyway, but give the excess space back to - // the kitchen. - house_room( room_bathroom, lw, bw - 4, rn, bw, dat ); - for( int i = lw + 1; i < mw && i < rn; i++ ) { - m->ter_set( point( i, cw ), t_floor ); - } - - // Put door between excess space and bathroom - m->ter_set( point( rng( lw + 1, rn - 1 ), bw - 4 ), t_door_c ); - - // Put door between excess space and bedroom - m->ter_set( point( rn, rng( cw + 1, bw - 5 ) ), t_door_c ); - } else { - // Small enough to be a bathroom; make it one. - house_room( room_bathroom, lw, cw, rn, bw, dat ); - - if( one_in( 5 ) ) { - // Put door between bathroom and kitchen with low chance - m->ter_set( point( rng( lw + 1, rn > mw ? mw - 1 : rn - 1 ), cw ), t_door_c ); - } else { - // ...Otherwise, between bathroom and bedroom - m->ter_set( point( rn, rng( cw + 1, bw - 1 ) ), t_door_c ); - } - } - // Point on bedroom wall, for window - rn = rng( rn + 2, rw - 2 ); - } else { - // Bedroom on left, bathroom on right - house_room( room_bedroom, lw, cw, rn, bw, dat ); - - // Put door between bedroom and kitchen - m->ter_set( point( rng( lw + 1, rn > mw ? mw - 1 : rn - 1 ), cw ), t_door_c ); - - if( bw - cw >= 10 && rw - rn >= 6 ) { - // All fits, placing bathroom and 2nd bedroom - house_room( room_bathroom, rn, bw - 5, rw, bw, dat ); - house_room( room_bedroom, rn, cw, rw, bw - 5, dat ); - - // Put door between bathroom and bedroom - m->ter_set( point( rn, rng( bw - 4, bw - 1 ) ), t_door_c ); - - if( one_in( 3 ) ) { - // Put door between 2nd bedroom and 1st bedroom - m->ter_set( point( rn, rng( cw + 1, bw - 6 ) ), t_door_c ); - } else { - // ...Otherwise, between 2nd bedroom and living - m->ter_set( point( rng( rw - 1, rn > mw ? rn + 1 : mw + 1 ), cw ), t_door_c ); - } - } else if( bw - cw > 4 ) { - // Too big for a bathroom, not big enough for 2nd bedroom - // Make it a bathroom anyway, but give the excess space back to - // the living. - house_room( room_bathroom, rn, bw - 4, rw, bw, dat ); - for( int i = rw - 1; i > rn && i > mw; i-- ) { - m->ter_set( point( i, cw ), t_floor ); - } - - // Put door between excess space and bathroom - m->ter_set( point( rng( rw - 1, rn + 1 ), bw - 4 ), t_door_c ); - - // Put door between excess space and bedroom - m->ter_set( point( rn, rng( cw + 1, bw - 5 ) ), t_door_c ); - } else { - // Small enough to be a bathroom; make it one. - house_room( room_bathroom, rn, cw, rw, bw, dat ); - - if( one_in( 5 ) ) { - // Put door between bathroom and living with low chance - m->ter_set( point( rng( rw - 1, rn > mw ? rn + 1 : mw + 1 ), cw ), t_door_c ); - } else { - // ...Otherwise, between bathroom and bedroom - m->ter_set( point( rn, rng( cw + 1, bw - 1 ) ), t_door_c ); - } - } - // Point on bedroom wall, for window - rn = rng( lw + 2, rn - 2 ); - } - m->ter_set( point( rn, bw ), t_window_domestic ); - m->ter_set( point( rn + 1, bw ), t_window_domestic ); - if( !one_in( 3 ) && rw < SEEX * 2 - 1 ) { // Potential side windows - rn = rng( tw + 2, bw - 6 ); - m->ter_set( point( rw, rn ), t_window_domestic ); - m->ter_set( point( rw, rn + 4 ), t_window_domestic ); - } - if( !one_in( 3 ) && lw > 0 ) { // Potential side windows - rn = rng( tw + 2, bw - 6 ); - m->ter_set( point( lw, rn ), t_window_domestic ); - m->ter_set( point( lw, rn + 4 ), t_window_domestic ); - } - if( one_in( 2 ) ) { // Placement of the main door - m->ter_set( point( rng( lw + 2, mw - 1 ), tw ), - ( one_in( 6 ) ? ( one_in( 6 ) ? t_door_c : t_door_c_peep ) : ( one_in( - 6 ) ? t_door_locked : t_door_locked_peep ) ) ); - if( one_in( 5 ) ) { // Placement of side door - m->ter_set( point( rw, rng( tw + 2, cw - 2 ) ), ( one_in( 6 ) ? t_door_c : t_door_locked ) ); - } - } else { - m->ter_set( point( rng( mw + 1, rw - 2 ), tw ), - ( one_in( 6 ) ? ( one_in( 6 ) ? t_door_c : t_door_c_peep ) : ( one_in( - 6 ) ? t_door_locked : t_door_locked_peep ) ) ); - if( one_in( 5 ) ) { - m->ter_set( point( lw, rng( tw + 2, cw - 2 ) ), ( one_in( 6 ) ? t_door_c : t_door_locked ) ); - } - } - break; - - case 2: - // Old-style; simple; - //Modified by Jovan in 28 Aug 2013 - //Long narrow living room in front, big kitchen and HUGE bedroom - bw = SEEX * 2 - 2; - cw = tw + rng( 3, 6 ); - mw = rng( lw + 7, rw - 4 ); - //int actual_house_height=bw-rng(4,6); - //in some rare cases some rooms (especially kitchen and living room) may get rather small - if( ( tw <= 3 ) && ( abs( ( actual_house_height - 3 ) - cw ) >= 3 ) ) { - //everything is fine - house_room( room_backyard, lw, actual_house_height + 1, rw, bw, dat ); - //door from bedroom to backyard - m->ter_set( point( ( lw + mw ) / 2, actual_house_height ), t_door_c ); - } else { //using old layout - actual_house_height = bw_old; - } - // Plop down the rooms - house_room( room_living, lw, tw, rw, cw, dat ); - house_room( room_kitchen, mw, cw, rw, actual_house_height - 3, dat ); - //making bedroom smaller - house_room( room_bedroom, lw, cw, mw, actual_house_height, dat ); - house_room( room_bathroom, mw, actual_house_height - 3, rw, actual_house_height, dat ); - - // Space between kitchen & living room: - rn = rng( mw + 1, rw - 3 ); - m->ter_set( point( rn, cw ), t_floor ); - m->ter_set( point( rn + 1, cw ), t_floor ); - // Front windows - rn = rng( 2, 5 ); - m->ter_set( point( lw + rn, tw ), t_window_domestic ); - m->ter_set( point( lw + rn + 1, tw ), t_window_domestic ); - m->ter_set( point( rw - rn, tw ), t_window_domestic ); - m->ter_set( point( rw - rn + 1, tw ), t_window_domestic ); - // Front door - m->ter_set( point( rng( lw + 4, rw - 4 ), tw ), ( one_in( 6 ) ? t_door_c : t_door_locked ) ); - if( one_in( 3 ) ) { // Kitchen windows - rn = rng( cw + 1, actual_house_height - 5 ); - m->ter_set( point( rw, rn ), t_window_domestic ); - m->ter_set( point( rw, rn + 1 ), t_window_domestic ); - } - if( one_in( 3 ) ) { // Bedroom windows - rn = rng( cw + 1, actual_house_height - 2 ); - m->ter_set( point( lw, rn ), t_window_domestic ); - m->ter_set( point( lw, rn + 1 ), t_window_domestic ); - } - // Door to bedroom - if( one_in( 4 ) ) { - m->ter_set( point( rng( lw + 1, mw - 1 ), cw ), t_door_c ); - } else { - m->ter_set( point( mw, rng( cw + 3, actual_house_height - 4 ) ), t_door_c ); - } - // Door to bathroom - if( one_in( 4 ) ) { - m->ter_set( point( mw, actual_house_height - 1 ), t_door_c ); - } else { - m->ter_set( point( rng( mw + 2, rw - 2 ), actual_house_height - 3 ), t_door_c ); - } - // Back windows - rn = rng( lw + 1, mw - 2 ); - m->ter_set( point( rn, actual_house_height ), t_window_domestic ); - m->ter_set( point( rn + 1, actual_house_height ), t_window_domestic ); - rn = rng( mw + 1, rw - 1 ); - m->ter_set( point( rn, actual_house_height ), t_window_domestic ); - break; - - case 3: - // Long center hallway, kitchen, living room and office - mw = static_cast( ( lw + rw ) / 2 ); - cw = bw - rng( 5, 7 ); - // Hallway doors and windows - m->ter_set( point( mw, tw ), ( one_in( 6 ) ? t_door_c : t_door_locked ) ); - if( one_in( 4 ) ) { - m->ter_set( point( mw - 1, tw ), t_window_domestic ); - m->ter_set( point( mw + 1, tw ), t_window_domestic ); - } - for( int i = tw + 1; i < cw; i++ ) { // Hallway walls - m->ter_set( point( mw - 2, i ), t_wall ); - m->ter_set( point( mw + 2, i ), t_wall ); - } - if( one_in( 2 ) ) { // Front rooms are kitchen or living room - house_room( room_living, lw, tw, mw - 2, cw, dat ); - house_room( room_kitchen, mw + 2, tw, rw, cw, dat ); - } else { - house_room( room_kitchen, lw, tw, mw - 2, cw, dat ); - house_room( room_living, mw + 2, tw, rw, cw, dat ); - } - // Front windows - rn = rng( lw + 1, mw - 4 ); - m->ter_set( point( rn, tw ), t_window_domestic ); - m->ter_set( point( rn + 1, tw ), t_window_domestic ); - rn = rng( mw + 3, rw - 2 ); - m->ter_set( point( rn, tw ), t_window_domestic ); - m->ter_set( point( rn + 1, tw ), t_window_domestic ); - if( one_in( 3 ) && lw > 0 ) { // Side windows? - rn = rng( tw + 1, cw - 2 ); - m->ter_set( point( lw, rn ), t_window_domestic ); - m->ter_set( point( lw, rn + 1 ), t_window_domestic ); - } - if( one_in( 3 ) && rw < SEEX * 2 - 1 ) { // Side windows? - rn = rng( tw + 1, cw - 2 ); - m->ter_set( point( rw, rn ), t_window_domestic ); - m->ter_set( point( rw, rn + 1 ), t_window_domestic ); - } - if( one_in( 2 ) ) { // Bottom rooms are bedroom or bathroom - //bathroom to the left (eastern wall), study to the right - //house_room(m, room_bedroom, lw, cw, rw - 3, bw, dat); - house_room( room_bedroom, mw - 2, cw, rw - 3, bw, dat ); - house_room( room_bathroom, rw - 3, cw, rw, bw, dat ); - house_room( room_study, lw, cw, mw - 2, bw, dat ); - //===Study Room Furniture== - m->ter_set( point( mw - 2, ( bw + cw ) / 2 ), t_door_o ); - m->furn_set( point( lw + 1, cw + 1 ), f_chair ); - m->furn_set( point( lw + 1, cw + 2 ), f_table ); - m->ter_set( point( lw + 1, cw + 3 ), t_console_broken ); - m->furn_set( point( lw + 3, bw - 1 ), f_bookcase ); - m->place_items( "magazines", 30, point( lw + 3, bw - 1 ), point( lw + 3, bw - 1 ), false, - dat.when() ); - m->place_items( "novels", 40, point( lw + 3, bw - 1 ), point( lw + 3, bw - 1 ), false, - dat.when() ); - m->place_items( "alcohol", 20, point( lw + 3, bw - 1 ), point( lw + 3, bw - 1 ), false, - dat.when() ); - m->place_items( "manuals", 30, point( lw + 3, bw - 1 ), point( lw + 3, bw - 1 ), false, - dat.when() ); - //========================= - m->ter_set( point( rng( lw + 2, mw - 3 ), cw ), t_door_c ); - if( one_in( 4 ) ) { - m->ter_set( point( rng( rw - 2, rw - 1 ), cw ), t_door_c ); - } else { - m->ter_set( point( rw - 3, rng( cw + 2, bw - 2 ) ), t_door_c ); - } - //bedroom windows - rn = rng( mw, rw - 5 ); - m->ter_set( point( rn, bw ), t_window_domestic ); - m->ter_set( point( rn + 1, bw ), t_window_domestic ); - //study window - m->ter_set( point( rng( lw + 2, mw - 3 ), bw ), t_window_domestic ); - - if( one_in( 4 ) ) { - m->ter_set( point( rng( rw - 2, rw - 1 ), bw ), t_window_domestic ); - } else { - m->ter( point( rw, rng( cw + 1, bw - 1 ) ) ); - } - } else { //bathroom to the right - house_room( room_bathroom, lw, cw, lw + 3, bw, dat ); - //house_room(m, room_bedroom, lw + 3, cw, rw, bw, dat); - house_room( room_bedroom, lw + 3, cw, mw + 2, bw, dat ); - house_room( room_study, mw + 2, cw, rw, bw, dat ); - //===Study Room Furniture== - m->ter_set( point( mw + 2, ( bw + cw ) / 2 ), t_door_c ); - m->furn_set( point( rw - 1, cw + 1 ), f_chair ); - m->furn_set( point( rw - 1, cw + 2 ), f_table ); - m->ter_set( point( rw - 1, cw + 3 ), t_console_broken ); - m->furn_set( point( rw - 3, bw - 1 ), f_bookcase ); - m->place_items( "magazines", 40, point( rw - 3, bw - 1 ), point( rw - 3, bw - 1 ), false, - dat.when() ); - m->place_items( "novels", 40, point( rw - 3, bw - 1 ), point( rw - 3, bw - 1 ), false, - dat.when() ); - m->place_items( "alcohol", 20, point( rw - 3, bw - 1 ), point( rw - 3, bw - 1 ), false, - dat.when() ); - m->place_items( "manuals", 20, point( rw - 3, bw - 1 ), point( rw - 3, bw - 1 ), false, - dat.when() ); - //========================= - - if( one_in( 4 ) ) { - m->ter_set( point( rng( lw + 1, lw + 2 ), cw ), t_door_c ); - } else { - m->ter_set( point( lw + 3, rng( cw + 2, bw - 2 ) ), t_door_c ); - } - //bedroom windows - rn = rng( lw + 4, mw ); - m->ter_set( point( rn, bw ), t_window_domestic ); - m->ter_set( point( rn + 1, bw ), t_window_domestic ); - //study window - m->ter_set( point( rng( mw + 3, rw - 1 ), bw ), t_window_domestic ); - if( one_in( 4 ) ) { - m->ter_set( point( rng( lw + 1, lw + 2 ), bw ), t_window_domestic ); - } else { - m->ter( point( lw, rng( cw + 1, bw - 1 ) ) ); - } - } - // Doors off the sides of the hallway - m->ter_set( point( mw - 2, rng( tw + 3, cw - 3 ) ), t_door_c ); - m->ter_set( point( mw + 2, rng( tw + 3, cw - 3 ) ), t_door_c ); - m->ter_set( point( mw, cw ), t_door_c ); - break; - } - // Done with the various house structures - - ////// - if( rng( 2, 7 ) < tw ) { - // Big front yard has a chance for a fence - for( int i = lw; i <= rw; i++ ) { - m->ter_set( point( i, 0 ), t_fence ); - } - for( int i = 1; i < tw; i++ ) { - m->ter_set( point( lw, i ), t_fence ); - } - int hole = rng( SEEX - 3, SEEX + 2 ); - m->ter_set( point( hole, 0 ), t_dirt ); - m->ter_set( point( hole + 1, 0 ), t_dirt ); - if( one_in( tw ) ) { - m->ter_set( point( hole - 1, 1 ), t_tree_young ); - m->ter_set( point( hole + 2, 1 ), t_tree_young ); - } - } - - place_stairs( dat ); - - // Just boring old zombies - m->place_spawns( mongroup_id( "GROUP_ZOMBIE" ), 2, point_zero, point( SEEX * 2 - 1, SEEX * 2 - 1 ), - dat.monster_density() ); - - m->rotate( static_cast( dat.terrain_type()->get_dir() ) ); -} - -/////////////////////////////////////////////////////////// -void mapgen_basement_generic_layout( mapgendata &dat ) -{ - map *const m = &dat.m; - const ter_id t_rock_smooth( "t_rock_smooth" ); - const int up = 0; - const int left = 0; - const int down = SEEY * 2 - 5; - const int right = SEEX * 2 - 1; - square( m, t_rock, left, down, right, SEEY * 2 - 1 ); - square( m, t_rock_floor, 1, 1, right - 1, down - 1 ); - line( m, t_rock_smooth, left, up, right, up ); - line( m, t_rock_smooth, left, down, right, down ); - line( m, t_rock_smooth, left, up, left, down ); - line( m, t_rock_smooth, right, up, right, down ); - m->ter_set( point( SEEX - 1, down - 1 ), t_stairs_up ); - m->ter_set( point( SEEX, down - 1 ), t_stairs_up ); - line( m, t_rock_smooth, SEEX - 2, down - 1, SEEX - 2, down - 3 ); - line( m, t_rock_smooth, SEEX + 1, down - 1, SEEX + 1, down - 3 ); - line( m, t_door_locked, SEEX - 1, down - 3, SEEX, down - 3 ); - - // Rotate randomly, now that other basements are more generic - m->rotate( rng( 0, 3 ) ); -} - -namespace furn_space -{ -static bool clear( const map &m, const tripoint &from, const tripoint &to ) -{ - for( const auto &p : m.points_in_rectangle( from, to ) ) { - if( m.ter( p ).obj().movecost == 0 ) { - return false; - } - } - - return true; -} - -static point best_expand( const map &m, const tripoint &from, int maxx, int maxy ) -{ - if( clear( m, from, from + point( maxx, maxy ) ) ) { - // Common case - return point( maxx, maxy ); - } - - // Brute force all the combinations for the one with biggest area - int best_area = 0; - point best; - for( int x = 0; x <= maxx; x++ ) { - for( int y = 0; y <= maxy; y++ ) { - int area = x * y; - if( area <= best_area ) { - continue; - } - - if( clear( m, from, from + point( x, y ) ) ) { - best_area = area; - best = point( x, y ); - } - } - } - - return best; -} -} // namespace furn_space - -void mapgen_basement_junk( mapgendata &dat ) -{ - map *const m = &dat.m; - // Junk! - mapgen_basement_generic_layout( dat ); - //makes a square of randomly thrown around furniture and places stuff. - const int z = m->get_abs_sub().z; - for( const auto &p : m->points_in_rectangle( tripoint( 1, 1, z ), tripoint( 22, 22, z ) ) ) { - if( m->ter( p ).obj().movecost == 0 ) { - // Wall, skip - continue; - } - - if( one_in( 1600 ) ) { - m->furn_set( p, furn_str_id( "f_gun_safe_el" ) ); - m->place_items( "basement_op_guns", 96, p.xy(), p.xy(), false, dat.when() ); - m->place_items( "ammo", 90, p.xy(), p.xy(), false, dat.when() ); - } - if( one_in( 20 ) ) { - int rn = rng( 1, 8 ); - if( rn == 1 ) { - m->furn_set( p, f_dresser ); - m->place_items( "dresser", 30, p.xy(), p.xy(), false, dat.when() ); - m->place_items( "trash_forest", 60, p.xy(), p.xy(), false, dat.when() ); - } else if( rn == 2 ) { - m->furn_set( p, f_chair ); - } else if( rn == 3 ) { - m->furn_set( p, f_cupboard ); - m->place_items( "trash", 60, p.xy(), p.xy(), false, dat.when() ); - m->place_items( "dining", 40, p.xy(), p.xy(), false, dat.when() ); - } else if( rn == 4 ) { - tripoint rs = p + furn_space::best_expand( *m, p, rng( 0, 4 ), 0 ); - square_furn( m, f_bookcase, p.x, p.y, rs.x, rs.y ); - m->place_items( "novels", 60, p.xy(), rs.xy(), false, dat.when() ); - m->place_items( "magazines", 20, p.xy(), rs.xy(), false, dat.when() ); - } else if( rn == 5 ) { - tripoint rs = p + furn_space::best_expand( *m, p, 0, rng( 0, 4 ) ); - square_furn( m, f_bookcase, p.x, p.y, rs.x, rs.y ); - m->place_items( "novels", 60, p.xy(), rs.xy(), false, dat.when() ); - m->place_items( "magazines", 20, p.xy(), rs.xy(), false, dat.when() ); - } else if( rn == 6 ) { - tripoint rs = p + furn_space::best_expand( *m, p, rng( 0, 2 ), 0 ); - square_furn( m, f_locker, p.x, p.y, rs.x, rs.y ); - m->place_items( "trash", 60, p.xy(), rs.xy(), false, dat.when() ); - m->place_items( "home_hw", 20, p.xy(), rs.xy(), false, dat.when() ); - } else if( rn == 7 ) { - tripoint rs = p + furn_space::best_expand( *m, p, 0, rng( 0, 2 ) ); - square_furn( m, f_locker, p.x, p.y, rs.x, rs.y ); - m->place_items( "trash", 60, p.xy(), rs.xy(), false, dat.when() ); - m->place_items( "home_hw", 20, p.xy(), rs.xy(), false, dat.when() ); - } else { - tripoint rs = p + furn_space::best_expand( *m, p, rng( 0, 2 ), rng( 0, 2 ) ); - square_furn( m, f_table, p.x, p.y, rs.x, rs.y ); - } - } - } - - m->place_items( "bedroom", 60, point_south_east, point( SEEX * 2 - 2, SEEY * 2 - 2 ), false, - dat.when() ); - m->place_items( "home_hw", 80, point_south_east, point( SEEX * 2 - 2, SEEY * 2 - 2 ), false, - dat.when() ); - m->place_items( "homeguns", 10, point_south_east, point( SEEX * 2 - 2, SEEY * 2 - 2 ), false, - dat.when() ); - // Chance of zombies in the basement - m->place_spawns( mongroup_id( "GROUP_ZOMBIE" ), 2, point_south_east, point( SEEX * 2 - 2, - SEEY * 2 - 2 ), dat.monster_density() ); -} - -void mapgen_basement_spiders( mapgendata &dat ) -{ - map *const m = &dat.m; - // Oh no! A spider nest! - mapgen_basement_junk( dat ); - auto spider_type = mon_spider_widow_giant; - auto egg_type = f_egg_sackbw; - if( one_in( 2 ) ) { - spider_type = mon_spider_cellar_giant; - egg_type = f_egg_sackcs; - } - for( int i = 1; i < 22; i++ ) { - for( int j = 1; j < 22; j++ ) { - if( m->ter( point( i, j ) ).obj().movecost == 0 ) { - // Wall, skip - continue; - } - - if( !one_in( 3 ) ) { - madd_field( m, i, j, fd_web, rng( 1, 3 ) ); - } - if( one_in( 30 ) && m->passable( point( i, j ) ) ) { - m->furn_set( point( i, j ), egg_type ); - //hope you like'em spiders - m->add_spawn( spider_type, rng( 1, 2 ), point( i, j ) ); - m->remove_field( { i, j, m->get_abs_sub().z }, fd_web ); - } - } - } - m->place_items( "rare", 70, point_south_east, point( SEEX * 2 - 1, SEEY * 2 - 5 ), false, - dat.when() ); -} - void mapgen_cave( mapgendata &dat ) { map *const m = &dat.m; diff --git a/src/mapgen_functions.h b/src/mapgen_functions.h index 20d526c73476a..fb2994bac3233 100644 --- a/src/mapgen_functions.h +++ b/src/mapgen_functions.h @@ -43,9 +43,6 @@ void mapgen_forest_trail_tee( mapgendata &dat ); void mapgen_forest_trail_four_way( mapgendata &dat ); void mapgen_hive( mapgendata &dat ); void mapgen_spider_pit( mapgendata &dat ); -void mapgen_fungal_bloom( mapgendata &dat ); -void mapgen_fungal_tower( mapgendata &dat ); -void mapgen_fungal_flowers( mapgendata &dat ); void mapgen_river_center( mapgendata &dat ); void mapgen_road( mapgendata &dat ); void mapgen_bridge( mapgendata &dat ); @@ -56,13 +53,6 @@ void mapgen_river_curved_not( mapgendata &dat ); void mapgen_river_straight( mapgendata &dat ); void mapgen_river_curved( mapgendata &dat ); void mapgen_parking_lot( mapgendata &dat ); -void mapgen_generic_house( mapgendata &dat, int variant ); // not mapped -void mapgen_generic_house_boxy( mapgendata &dat ); -void mapgen_generic_house_big_livingroom( mapgendata &dat ); -void mapgen_generic_house_center_hallway( mapgendata &dat ); -void mapgen_basement_generic_layout( mapgendata &dat ); -void mapgen_basement_junk( mapgendata &dat ); -void mapgen_basement_spiders( mapgendata &dat ); void mapgen_cave( mapgendata &dat ); void mapgen_cave_rat( mapgendata &dat ); void mapgen_cavern( mapgendata &dat ); diff --git a/src/savegame.cpp b/src/savegame.cpp index 6aaa00943c8f7..d2083f5c9bd4e 100644 --- a/src/savegame.cpp +++ b/src/savegame.cpp @@ -786,6 +786,14 @@ void overmap::convert_terrain( const std::unordered_map & } else { debugmsg( "Malformed Megastore" ); } + } else if( old == "house_base_north" ) { + ter_set( pos, oter_id( "house_north" ) ); + } else if( old == "house_base_south" ) { + ter_set( pos, oter_id( "house_south" ) ); + } else if( old == "house_base_east" ) { + ter_set( pos, oter_id( "house_east" ) ); + } else if( old == "house_base_west" ) { + ter_set( pos, oter_id( "house_west" ) ); } for( const auto &conv : nearby ) {