Snowmap Salvage Project PR#10 again. The map. (#21067)

* snowbase nospace

* Ports Drcelts cellular automata

* Requested changes - Tested, works.

* animals

* THE WOLVES
This commit is contained in:
MadmanMartian
2018-12-27 14:19:38 +00:00
committed by jknpj
parent 9d918c2281
commit 07e9faf220
12 changed files with 16281 additions and 21 deletions

View File

@@ -130,3 +130,86 @@ proc/get_cardinal_dir(atom/A, atom/B)
dirs += turn(dir, -45*steps)
steps--
return dirs
// smoothing dirs - now you can tell the difference between a tile being surrounded by north and west and a tile being surrounded by northwest.
// used for 3x3/diagonal smoothers - not suitable for cardinal smoothing.
// because for some reason it seems that north and south and east and west byond variables are actually capped to 15 when adding other flags, we need to redefine those too.
#define SMOOTHING_NORTH 1
#define SMOOTHING_SOUTH 2
#define SMOOTHING_EAST 4
#define SMOOTHING_WEST 8
#define SMOOTHING_NORTHWEST 16
#define SMOOTHING_NORTHEAST 32
#define SMOOTHING_SOUTHEAST 64
#define SMOOTHING_SOUTHWEST 128
#define SMOOTHING_ALLNORTH SMOOTHING_NORTHWEST|SMOOTHING_NORTH|SMOOTHING_NORTHEAST // 16 + 1 + 32 = 49
#define SMOOTHING_ALLEAST SMOOTHING_SOUTHEAST|SMOOTHING_EAST|SMOOTHING_NORTHEAST // 64 + 4 + 32 = 100
#define SMOOTHING_ALLWEST SMOOTHING_SOUTHWEST|SMOOTHING_WEST|SMOOTHING_NORTHWEST // 128 + 8 + 16 = 152
#define SMOOTHING_ALLSOUTH SMOOTHING_SOUTHWEST|SMOOTHING_SOUTH|SMOOTHING_SOUTHEAST // 128 + 2 + 64 = 194
#define SMOOTHING_ALLDIRS 255
// L curves - x is our object, # is smoothable, . is not
/*
###
#X. northwest - SMOOTHING_ALLNORTH|SMOOTHING_ALLWEST
#..
###
.X# northeast - SMOOTHING_ALLNORTH|SMOOTHING_ALLEAST
..#
#..
#X. southwest - SMOOTHING_ALLSOUTH|SMOOTHING_ALLWEST
###
..#
.X# southeast SMOOTHING_ALLSOUTH|SMOOTHING_ALLEAST
###
*/
#define SMOOTHING_L_CURVE_NORTHWEST SMOOTHING_ALLNORTH|SMOOTHING_ALLWEST
#define SMOOTHING_L_CURVE_NORTHEAST SMOOTHING_ALLNORTH|SMOOTHING_ALLEAST
#define SMOOTHING_L_CURVE_SOUTHWEST SMOOTHING_ALLSOUTH|SMOOTHING_ALLWEST
#define SMOOTHING_L_CURVE_SOUTHEAST SMOOTHING_ALLSOUTH|SMOOTHING_ALLEAST
#define SMOOTHING_L_CURVES SMOOTHING_L_CURVE_NORTHWEST,SMOOTHING_L_CURVE_NORTHEAST,SMOOTHING_L_CURVE_SOUTHWEST,SMOOTHING_L_CURVE_SOUTHEAST
/proc/dir_to_smoothingdir(var/dir)
switch(dir)
if(NORTHEAST)
return SMOOTHING_NORTHEAST
if(SOUTHEAST)
return SMOOTHING_SOUTHEAST
if(SOUTHWEST)
return SMOOTHING_SOUTHWEST
if(NORTHWEST)
return SMOOTHING_NORTHWEST
return dir
/proc/smoothingdir_to_dir(var/dir)
switch(dir)
if(SMOOTHING_NORTHEAST,SMOOTHING_L_CURVE_NORTHEAST)
return NORTHEAST
if(SMOOTHING_SOUTHEAST,SMOOTHING_L_CURVE_SOUTHEAST)
return SOUTHEAST
if(SMOOTHING_SOUTHWEST,SMOOTHING_L_CURVE_SOUTHWEST)
return SOUTHWEST
if(SMOOTHING_NORTHWEST,SMOOTHING_L_CURVE_NORTHWEST)
return NORTHWEST
if(SMOOTHING_NORTH)
return NORTH
if(SMOOTHING_SOUTH)
return SOUTH
if(SMOOTHING_EAST)
return EAST
if(SMOOTHING_WEST)
return WEST
return dir

View File

@@ -30,4 +30,12 @@ var/datum/subsystem/map/SSmap
for(var/i = 0, i < max_secret_rooms, i++)
make_mining_asteroid_secret()
log_startup_progress("Calling post on zLevels, letting them know they can do zlevel specific stuff...")
var/watch_prim = start_watch()
for(var/datum/zLevel/z in map.zLevels)
log_startup_progress("Generating zLevel [z.z].")
var/watch = start_watch()
z.post_mapload()
log_startup_progress("Finished with zLevel [z.z] in [stop_watch(watch)]s.")
log_startup_progress("Finished calling post on zLevels in [stop_watch(watch_prim)]s.")
..()

View File

@@ -0,0 +1,212 @@
/*taken shamelessly from:
http://www.roguebasin.com/index.php?title=Cellular_Automata_Method_for_Generating_Random_Cave-Like_Levels#C.23_Code
adapted in dreammaker for /vg/ snowmap
how it works: it performs it on a list five times and then applies the list to the surroundings - setbaseturf isn't cheap enough to call five times to do this the "proper" way
the wall is the turf you want to start with (#)
the floor is the turf you want to have generate in (.)
Procedurally generated so no two levels are (likely) exactly the same.
Relatively simple concept, and implementation.
A natural, cave-like map to add variety, uniqueness or an alternative to room-based dungeons.
(we're using it for lakes now though, seems to transfer fairly fluidly (ha puns) to that.)
here is an example of what it might look like:
############################################################
###....####################################.....############
##......######################..#########.........##########
##......#####################....#######...........####.####
##......###################.........................##...###
##......##################..........................###...##
#........##############.............................###...##
#........#############...............................#....##
##.......##############..................................###
##.......###..############..............................####
##.......##....############.............................####
#..............############...###........................###
#...............###########..#####...............##.......##
#................#################...............##.......##
##.....#####..........###########....#..........###.......##
##....#######...........########....###.........####......##
##....#######............######....####........#####......##
##....#######.............####....#####.......#####......###
#......######..............###....####........####......####
#.......######.............###...####.........###.......####
#........#####.............###..####.....................###
##........####..............#...####.....................###
#####......##...................####.....................###
######...........................##.....................####
######..................................................####
######.........###.....................####.............####
######......#########.................######............####
#######....#############.......##############.....###..#####
##############################################..############
############################################################
*/
#define CA_PERMAWALL 2
#define CA_WALL 1
#define CA_FLOOR 0
/obj/structure/radial_gen/cellular_automata
name = "cellular automata"
var/turf/ca_wall
var/turf/ca_floor
var/mapgrid_width = 40
var/mapgrid_height = 21
var/percent_area_walls = 45
var/iterations = 5
var/watch
var/mapgrid_scale = 1
var/list/list_of_turfs = list()
var/list/mapgrid
var/could_not_place = 0
/obj/structure/radial_gen/cellular_automata/Destroy()
..()
mapgrid.Cut()
list_of_turfs.Cut()
/obj/structure/radial_gen/cellular_automata/deploy_generator(var/turf/bottomleft)
init_mapgrid() // first generates a random map
for(var/i = 1 to iterations)
make_caverns(i)
could_not_place = check_mapgrid(bottomleft)
if(!could_not_place)
apply_mapgrid_to_turfs(bottomleft)
/obj/structure/radial_gen/cellular_automata/proc/init_mapgrid()
if(!mapgrid)
mapgrid = new/list(mapgrid_width,mapgrid_height)
else if(could_not_place)
could_not_place = 0
return
for(var/row = 1 to mapgrid_height)
for(var/column = 1 to mapgrid_width)
if(column == 1)
mapgrid[column][row] = CA_PERMAWALL
else if(row == 1)
mapgrid[column][row] = CA_PERMAWALL
else if(column == mapgrid_width)
mapgrid[column][row] = CA_PERMAWALL
else if(row == mapgrid_height)
mapgrid[column][row] = CA_PERMAWALL
else // otherwise, fill the walls a random percent of the time
var/random_number = rand(1,100)
if(random_number < percent_area_walls)
mapgrid[column][row] = CA_WALL
else
mapgrid[column][row] = CA_FLOOR
/obj/structure/radial_gen/cellular_automata/proc/make_caverns(var/iteration)
for(var/row = 1 to mapgrid_height)
for(var/column = 1 to mapgrid_width)
mapgrid[column][row] = place_wall_logic(column,row,iteration)
/obj/structure/radial_gen/cellular_automata/proc/place_wall_logic(var/column,var/row,var/iteration)
var/num_walls = get_adjacent_walls(column,row)
switch(mapgrid[column][row])
if(CA_PERMAWALL)
return CA_PERMAWALL
if(CA_WALL)
if(num_walls >= 4)
return CA_WALL
if(CA_FLOOR)
if(num_walls >= 5)
return CA_WALL
return CA_FLOOR
/obj/structure/radial_gen/cellular_automata/proc/get_adjacent_walls(var/column,var/row,var/n = 1)
if(mapgrid[column][row] == CA_PERMAWALL)
return
var/wallcounter = 0
for(var/iy = max(1,row-n) to (row+n))
for(var/ix = (column-n) to (column+n))
if(ix > 0 && ix < mapgrid_width)
if(!(ix == column && iy == row) && iy > 0 && iy < mapgrid_height)
if(mapgrid[ix][iy])
wallcounter++
return wallcounter
/obj/structure/radial_gen/cellular_automata/proc/check_mapgrid(var/turf/bottomleft)
for(var/row = 1 to mapgrid_height)
for(var/column = 1 to mapgrid_width)
if(!(mapgrid[column][row])) // it's a floor
for(var/scale_row = 1 to mapgrid_scale)
for(var/scale_column = 1 to mapgrid_scale)
var/turf/T = locate((bottomleft.x-1)+(column * mapgrid_scale)+scale_column,(bottomleft.y-1)+(row * mapgrid_scale) + scale_row,bottomleft.z)
if(!istype(T,ca_wall))
return TRUE
/obj/structure/radial_gen/cellular_automata/proc/apply_mapgrid_to_turfs(var/turf/bottomleft)
for(var/row = 1 to mapgrid_height)
for(var/column = 1 to mapgrid_width)
if(!(mapgrid[column][row])) // it's a floor
for(var/scale_row = 1 to mapgrid_scale)
for(var/scale_column = 1 to mapgrid_scale)
var/turf/T = locate((bottomleft.x-1)+(column * mapgrid_scale)+scale_column,(bottomleft.y-1)+(row * mapgrid_scale) + scale_row,bottomleft.z)
makefloor(T)
/obj/structure/radial_gen/cellular_automata/proc/makefloor(var/turf/T)
T.clear_contents(list(type))
return T.ChangeTurf(ca_floor)
/obj/structure/radial_gen/cellular_automata/ice
name = "glacier lake"
ca_wall = /turf/unsimulated/floor/snow
mapgrid_width = 10
mapgrid_height = 5
mapgrid_scale = 2
/obj/structure/radial_gen/cellular_automata/ice/makefloor(var/turf/unsimulated/floor/snow/T)
if(T && T.snowballs)
T.clear_contents(list(type))
var/obj/glacier/G = new /obj/glacier(T,icon_update_later = 1)
list_of_turfs += G
/obj/structure/radial_gen/cellular_automata/ice/apply_mapgrid_to_turfs(var/turf/bottomleft)
..()
for(var/obj/glacier/G in list_of_turfs)
G.relativewall()
/*
/obj/structure/radial_gen/cellular_automata/spider_cave
name = "spider cave"
ca_wall = /turf/unsimulated/mineral/random/underground
ca_floor = /turf/unsimulated/floor/asteroid/underground
percent_area_walls = 40
iterations = 5
/obj/structure/radial_gen/cellular_automata/spider_cave/makefloor(var/turf/T)
T.clear_contents(list(type))
T.ChangeTurf(ca_floor)
var/random = rand(1,1000)
switch(random)
if(1 to 4)
var/spider = pick(/mob/living/simple_animal/hostile/giant_spider, /mob/living/simple_animal/hostile/giant_spider/hunter, /mob/living/simple_animal/hostile/giant_spider/nurse)
new spider(T)
if(5)
new /mob/living/simple_animal/hostile/giant_spider/nurse/queen_spider(T)
if(6 to 9)
new /obj/effect/landmark/corpse/miner/rig(T)
if(10 to 12)
new /obj/effect/landmark/corpse/civilian(T)
if(13)
new /obj/effect/landmark/corpse/syndicatecommando(T) // if you add loot to it, they will come.
/obj/structure/radial_gen/cellular_automata/spider_cave/place_wall_logic(var/column,var/row,var/iteration)
if(iteration == 3)
var/num_walls = get_adjacent_walls(mapgrid,column,row,n = 2)
if(num_walls <= 2)
return CA_WALL
return ..()
/obj/structure/radial_gen/cellular_automata/spider_cave/apply_mapgrid_to_turfs(var/turf/bottomleft)
..()
for(var/turf/T in list_of_turfs)
T.update_icon()
*/

View File

@@ -29,10 +29,8 @@
var/list/expected_turfs = list() //Will return if turf type is different from any in the list, good to avoid generator collision with other terrain features
/obj/structure/radial_gen/New()
..()
deploy_generator()
deploy_generator(get_turf(src))
qdel(src) //This is exclusively used to generate other things, delete it once we're done
//Uses modular code structure, so you can define different behaviour
@@ -80,7 +78,7 @@
if(gen_clear_tiles) //We attempt to clear the tile's contents. Hopefully this does not fail, because we won't dabble on it
T.clear_contents(list(type))
var/picked = perform_pick("soft", T)
var/picked = perform_pick("hard", T)
perform_spawn("hard", T, picked)
@@ -194,7 +192,8 @@
gen_types_movable_hard = list(/obj/structure/flora/tree/pine = 100, \
/obj/structure/flora/bush = 100, \
/obj/structure/flora/rock/pile/snow = 200, \
/obj/structure/flora/grass/white = 1000)
/obj/structure/flora/grass/white = 1000,
/mob/living/simple_animal/hostile/bear = 120)
//A much more dense forest, with a lot more trees
/obj/structure/radial_gen/movable/snow_nature/snow_forest/dense
@@ -212,7 +211,8 @@
gen_types_movable_hard = list(/obj/structure/flora/tree/pine = 250, \
/obj/structure/flora/bush = 100, \
/obj/structure/flora/rock/pile/snow = 200, \
/obj/structure/flora/grass/white = 1000)
/obj/structure/flora/grass/white = 1000,
/mob/living/simple_animal/hostile/bear = 120)
//A larger thin forest, falls offs slowly at first and after a 15 tile radii down to 0 % chance after 30
@@ -244,7 +244,8 @@
gen_types_movable_hard = list(/obj/structure/flora/tree/pine = 250, \
/obj/structure/flora/bush = 100, \
/obj/structure/flora/rock/pile/snow = 200, \
/obj/structure/flora/grass/white = 1000)
/obj/structure/flora/grass/white = 1000,
/mob/living/simple_animal/hostile/bear = 250)
//A patch of snowy grass, with some rocks and bushes thrown in
/obj/structure/radial_gen/movable/snow_nature/snow_grass
@@ -268,7 +269,9 @@
//Ditto above, but only in hard radius. Obviously, if you want it to spawn in both, add to both lists. OBVIOUSLY
gen_types_movable_hard = list(/obj/structure/flora/rock/pile/snow = 50, \
/obj/structure/flora/bush = 200, \
/obj/structure/flora/grass/white = 1000)
/obj/structure/flora/grass/white = 1000,
/obj/abstract/map/spawner/mobs/deer = 80,
/obj/abstract/map/spawner/mobs/wolf = 40)
//A large patch of snowy grass, with some rocks and bushes thrown in
/obj/structure/radial_gen/movable/snow_nature/snow_grass/large

View File

@@ -11,13 +11,12 @@
dynamic_lighting = 0
luminosity = 1
plane = PLATING_PLANE
var/snowballs = 0
var/snowballs = TRUE
var/global/list/icon_state_to_appearance = list()
/turf/unsimulated/floor/snow/New()
..()
icon_state = "snow[rand(0, 6)]"
if(icon_state_to_appearance[icon_state])
appearance = icon_state_to_appearance[icon_state]
else
@@ -28,13 +27,15 @@
overlays += snowfx1
overlays += snowfx2
icon_state_to_appearance[icon_state] = appearance
if(snowballs)
icon_state = "snow[rand(0, 6)]"
snowballs = rand(5, 10) //Used to be (30, 50). A quick way to overload the server with atom instances.
/turf/unsimulated/floor/snow/attackby(obj/item/weapon/W as obj, mob/user as mob)
..()
if(isshovel(W))
if(snowballs && isshovel(W))
user.visible_message("<span class='notice'>[user] starts digging out some snow with \the [W].</span>", \
"<span class='notice'>You start digging out some snow with \the [W].</span>")
user.delayNextAttack(20)
@@ -45,6 +46,7 @@
/turf/unsimulated/floor/snow/attack_hand(mob/user as mob)
if(snowballs)
//Reach down and make a snowball
user.visible_message("<span class='notice'>[user] reaches down and starts forming a snowball.</span>", \
"<span class='notice'>You reach down and start forming a snowball.</span>")
@@ -106,3 +108,74 @@
/turf/unsimulated/floor/snow/permafrost
icon_state = "permafrost_full"
snowballs = FALSE
/obj/glacier
name = "glacier"
desc = "A frozen lake, kept solid by temperatures way below freezing."
icon = 'icons/turf/ice.dmi'
icon_state = "ice1"
anchored = 1
density = 0
plane = PLATING_PLANE
var/isedge
var/hole = 0
/obj/glacier/canSmoothWith()
return list(/obj/glacier)
/obj/glacier/New(var/icon_update_later = 0)
var/turf/unsimulated/floor/snow/T = loc
if(!istype(T))
qdel(src)
return
..()
T.snowballs = -1
if(icon_update_later)
relativewall()
relativewall_neighbours()
/obj/glacier/relativewall()
overlays.Cut()
var/junction = 0
isedge = 0
var/edgenum = 0
var/edgesnum = 0
for(var/direction in alldirs)
var/turf/adj_tile = get_step(src, direction)
var/obj/glacier/adj_glacier = locate(/obj/glacier) in adj_tile
if(adj_glacier)
junction |= dir_to_smoothingdir(direction)
if(adj_glacier.isedge && direction in cardinal)
edgenum |= direction
edgesnum = adj_glacier.isedge
if(junction == SMOOTHING_ALLDIRS) // you win the not-having-to-smooth-lotterys
icon_state = "ice[rand(1,6)]"
else
switch(junction)
if(SMOOTHING_L_CURVES)
isedge = junction
relativewall_neighbours()
icon_state = "junction[junction]"
if(edgenum && !isedge)
icon_state = "edge[edgenum]-[edgesnum]"
if(hole)
overlays += image(icon,"hole_overlay")
/obj/glacier/relativewall_neighbours()
..()
for(var/direction in diagonal)
var/turf/adj_tile = get_step(src, direction)
if(isSmoothableNeighbor(adj_tile))
adj_tile.relativewall()
for(var/atom/A in adj_tile)
if(isSmoothableNeighbor(A))
A.relativewall()
/obj/glacier/attackby(var/obj/item/W, mob/user)
if(!hole && prob(W.force*5))
to_chat(user,"<span class='notice'>You smash a hole in the ice with \the [W].</span>") // todo: better
hole = TRUE
relativewall()
..()

View File

@@ -819,6 +819,7 @@
chance = 5
to_spawn = list(/mob/living/simple_animal/hostile/humanoid/russian/ranged)
/obj/abstract/map/spawner/space/vox/trader/spacesuit // for the vox outpost trader closets to spawn a random hardsuit. Each hardsuit has the same stats which are ofcourse very poor armor.
name = "trader spacesuit spawner"
icon_state = "space_supply"
@@ -893,6 +894,13 @@
/mob/living/simple_animal/hostile/wolf/alpha,
/mob/living/simple_animal/hostile/wolf/alpha,
)
/obj/abstract/map/spawner/mobs/deer
name = "deer spawner"
icon_state = "mob_deer"
amount = 5
to_spawn = list(/mob/living/simple_animal/hostile/deer)
/obj/abstract/map/spawner/mobs/humanoid/wiz
name = "wizard spawner"
icon_state = "mob_wiz"

View File

@@ -34,7 +34,7 @@
/turf/unsimulated/mineral/snow
icon_state = "snow_rock"
base_icon_state = "snow_rock"
mined_type = /turf/unsimulated/floor/snow
mined_type = /turf/unsimulated/floor/snow/permafrost
overlay_state = "snow_rock_overlay"
/turf/unsimulated/mineral/snow/New()
@@ -795,6 +795,12 @@ turf/unsimulated/mineral/ChangeTurf(var/turf/N, var/tell_universe=1, var/force_l
. = ..()
/turf/unsimulated/mineral/random/snow
icon_state = "snow_rock"
base_icon_state = "snow_rock"
mined_type = /turf/unsimulated/floor/snow/permafrost
overlay_state = "snow_rock_overlay"
/turf/unsimulated/mineral/random/high_chance
icon_state = "rock(high)"
mineralChance = 25
@@ -822,6 +828,13 @@ turf/unsimulated/mineral/ChangeTurf(var/turf/N, var/tell_universe=1, var/force_l
*/
)
/turf/unsimulated/mineral/random/high_chance/snow
icon_state = "snow_rock"
base_icon_state = "snow_rock"
mined_type = /turf/unsimulated/floor/snow/permafrost
overlay_state = "snow_rock_overlay"
/turf/unsimulated/mineral/random/high_chance_clown
icon_state = "rock(clown)"
mineralChance = 40
@@ -851,6 +864,13 @@ turf/unsimulated/mineral/ChangeTurf(var/turf/N, var/tell_universe=1, var/force_l
"Phazon" = 10
)
/turf/unsimulated/mineral/random/high_chance_clown/snow
icon_state = "snow_rock"
base_icon_state = "snow_rock"
mined_type = /turf/unsimulated/floor/snow/permafrost
overlay_state = "snow_rock_overlay"
/turf/unsimulated/mineral/random/Destroy()
return

BIN
icons/turf/ice.dmi Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

View File

@@ -145,6 +145,9 @@ var/global/list/accessable_z_levels = list()
var/base_turf //Our base turf, what shows under the station when destroyed. Defaults to space because it's fukken Space Station 13
var/z //Number of the z-level (the z coordinate)
/datum/zLevel/proc/post_mapload()
return
////////////////////////////////
/datum/zLevel/station
@@ -152,6 +155,7 @@ var/global/list/accessable_z_levels = list()
name = "station"
movementChance = ZLEVEL_BASE_CHANCE * ZLEVEL_STATION_MODIFIER
/datum/zLevel/centcomm
name = "centcomm"
@@ -176,6 +180,28 @@ var/global/list/accessable_z_levels = list()
movementJammed = 1
base_turf = /turf/unsimulated/beach/sand
/datum/zLevel/snow
name = "snow"
base_turf = /turf/unsimulated/floor/snow
movementChance = ZLEVEL_BASE_CHANCE * ZLEVEL_SPACE_MODIFIER
/datum/zLevel/snow/post_mapload()
var/lake_density = rand(2,8)
for(var/i = 0 to lake_density)
var/turf/T = locate(rand(1, world.maxx),rand(1, world.maxy), z)
if(!istype(T, base_turf))
continue
var/generator = pick(typesof(/obj/structure/radial_gen/cellular_automata/ice))
new generator(T)
var/tree_density = rand(25,45)
for(var/i = 0 to tree_density)
var/turf/T = locate(rand(1,world.maxx),rand(1, world.maxy), z)
if(!istype(T, base_turf))
continue
var/generator = pick(typesof(/obj/structure/radial_gen/movable/snow_nature/snow_forest) + typesof(/obj/structure/radial_gen/movable/snow_nature/snow_grass))
new generator(T)
// Debug ///////////////////////////////////////////////////////
/*

47
maps/tgstation-snow.dm Normal file
View File

@@ -0,0 +1,47 @@
#ifndef MAP_OVERRIDE
//**************************************************************
// Map Datum -- Snowfort Station
// Literally just box station (as of 16/12/2018), but with the base turf being snow
//**************************************************************
/datum/map/active
nameShort = "snowfort"
nameLong = "Snowfort Station"
map_dir = "snowstation"
tDomeX = 128
tDomeY = 58
tDomeZ = 2
zLevels = list(
/datum/zLevel/snow{
name = "station"
movementChance = ZLEVEL_BASE_CHANCE * ZLEVEL_STATION_MODIFIER
},
/datum/zLevel/centcomm,
/datum/zLevel/snow{
name = "CrashedSat" ;
},
/datum/zLevel/snow{
name = "derelict" ;
},
/datum/zLevel/snow,
/datum/zLevel/snow{
name = "spacePirateShip" ;
},
)
enabled_jobs = list(/datum/job/trader)
load_map_elements = list(
/datum/map_element/dungeon/holodeck
)
holomap_offset_x = list(0,0,0,86,4,0,0,)
holomap_offset_y = list(0,0,0,94,10,0,0,)
center_x = 226
center_y = 254
only_spawn_map_exclusive_vaults = TRUE
////////////////////////////////////////////////////////////////
#include "tgstation-snow.dmm"
#endif

15779
maps/tgstation-snow.dmm Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1057,6 +1057,7 @@
#include "code\game\objects\structures\stool_bed_chair_nest\chairs.dm"
#include "code\game\objects\structures\stool_bed_chair_nest\guillotine.dm"
#include "code\game\objects\structures\stool_bed_chair_nest\stools.dm"
#include "code\game\objects\structures\universal_generators\cellular_automata.dm"
#include "code\game\objects\structures\universal_generators\radial_generator.dm"
#include "code\game\objects\structures\vehicles\adminbus.dm"
#include "code\game\objects\structures\vehicles\adminbus_powers.dm"