mirror of
https://github.com/vgstation-coders/vgstation13.git
synced 2025-12-10 10:21:11 +00:00
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:
@@ -130,3 +130,86 @@ proc/get_cardinal_dir(atom/A, atom/B)
|
|||||||
dirs += turn(dir, -45*steps)
|
dirs += turn(dir, -45*steps)
|
||||||
steps--
|
steps--
|
||||||
return dirs
|
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
|
||||||
|
|||||||
@@ -30,4 +30,12 @@ var/datum/subsystem/map/SSmap
|
|||||||
for(var/i = 0, i < max_secret_rooms, i++)
|
for(var/i = 0, i < max_secret_rooms, i++)
|
||||||
make_mining_asteroid_secret()
|
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.")
|
||||||
..()
|
..()
|
||||||
|
|||||||
@@ -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()
|
||||||
|
*/
|
||||||
@@ -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
|
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()
|
/obj/structure/radial_gen/New()
|
||||||
|
|
||||||
..()
|
..()
|
||||||
|
deploy_generator(get_turf(src))
|
||||||
deploy_generator()
|
|
||||||
qdel(src) //This is exclusively used to generate other things, delete it once we're done
|
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
|
//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
|
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))
|
T.clear_contents(list(type))
|
||||||
|
|
||||||
var/picked = perform_pick("soft", T)
|
var/picked = perform_pick("hard", T)
|
||||||
|
|
||||||
perform_spawn("hard", T, picked)
|
perform_spawn("hard", T, picked)
|
||||||
|
|
||||||
@@ -194,7 +192,8 @@
|
|||||||
gen_types_movable_hard = list(/obj/structure/flora/tree/pine = 100, \
|
gen_types_movable_hard = list(/obj/structure/flora/tree/pine = 100, \
|
||||||
/obj/structure/flora/bush = 100, \
|
/obj/structure/flora/bush = 100, \
|
||||||
/obj/structure/flora/rock/pile/snow = 200, \
|
/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
|
//A much more dense forest, with a lot more trees
|
||||||
/obj/structure/radial_gen/movable/snow_nature/snow_forest/dense
|
/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, \
|
gen_types_movable_hard = list(/obj/structure/flora/tree/pine = 250, \
|
||||||
/obj/structure/flora/bush = 100, \
|
/obj/structure/flora/bush = 100, \
|
||||||
/obj/structure/flora/rock/pile/snow = 200, \
|
/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
|
//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, \
|
gen_types_movable_hard = list(/obj/structure/flora/tree/pine = 250, \
|
||||||
/obj/structure/flora/bush = 100, \
|
/obj/structure/flora/bush = 100, \
|
||||||
/obj/structure/flora/rock/pile/snow = 200, \
|
/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
|
//A patch of snowy grass, with some rocks and bushes thrown in
|
||||||
/obj/structure/radial_gen/movable/snow_nature/snow_grass
|
/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
|
//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, \
|
gen_types_movable_hard = list(/obj/structure/flora/rock/pile/snow = 50, \
|
||||||
/obj/structure/flora/bush = 200, \
|
/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
|
//A large patch of snowy grass, with some rocks and bushes thrown in
|
||||||
/obj/structure/radial_gen/movable/snow_nature/snow_grass/large
|
/obj/structure/radial_gen/movable/snow_nature/snow_grass/large
|
||||||
|
|||||||
@@ -11,13 +11,12 @@
|
|||||||
dynamic_lighting = 0
|
dynamic_lighting = 0
|
||||||
luminosity = 1
|
luminosity = 1
|
||||||
plane = PLATING_PLANE
|
plane = PLATING_PLANE
|
||||||
var/snowballs = 0
|
var/snowballs = TRUE
|
||||||
var/global/list/icon_state_to_appearance = list()
|
var/global/list/icon_state_to_appearance = list()
|
||||||
|
|
||||||
/turf/unsimulated/floor/snow/New()
|
/turf/unsimulated/floor/snow/New()
|
||||||
|
|
||||||
..()
|
..()
|
||||||
icon_state = "snow[rand(0, 6)]"
|
|
||||||
if(icon_state_to_appearance[icon_state])
|
if(icon_state_to_appearance[icon_state])
|
||||||
appearance = icon_state_to_appearance[icon_state]
|
appearance = icon_state_to_appearance[icon_state]
|
||||||
else
|
else
|
||||||
@@ -28,13 +27,15 @@
|
|||||||
overlays += snowfx1
|
overlays += snowfx1
|
||||||
overlays += snowfx2
|
overlays += snowfx2
|
||||||
icon_state_to_appearance[icon_state] = appearance
|
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.
|
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)
|
/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>", \
|
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>")
|
"<span class='notice'>You start digging out some snow with \the [W].</span>")
|
||||||
user.delayNextAttack(20)
|
user.delayNextAttack(20)
|
||||||
@@ -45,6 +46,7 @@
|
|||||||
|
|
||||||
/turf/unsimulated/floor/snow/attack_hand(mob/user as mob)
|
/turf/unsimulated/floor/snow/attack_hand(mob/user as mob)
|
||||||
|
|
||||||
|
if(snowballs)
|
||||||
//Reach down and make a snowball
|
//Reach down and make a snowball
|
||||||
user.visible_message("<span class='notice'>[user] reaches down and starts forming a snowball.</span>", \
|
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>")
|
"<span class='notice'>You reach down and start forming a snowball.</span>")
|
||||||
@@ -106,3 +108,74 @@
|
|||||||
|
|
||||||
/turf/unsimulated/floor/snow/permafrost
|
/turf/unsimulated/floor/snow/permafrost
|
||||||
icon_state = "permafrost_full"
|
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()
|
||||||
|
..()
|
||||||
@@ -819,6 +819,7 @@
|
|||||||
chance = 5
|
chance = 5
|
||||||
to_spawn = list(/mob/living/simple_animal/hostile/humanoid/russian/ranged)
|
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.
|
/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"
|
name = "trader spacesuit spawner"
|
||||||
icon_state = "space_supply"
|
icon_state = "space_supply"
|
||||||
@@ -893,6 +894,13 @@
|
|||||||
/mob/living/simple_animal/hostile/wolf/alpha,
|
/mob/living/simple_animal/hostile/wolf/alpha,
|
||||||
/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
|
/obj/abstract/map/spawner/mobs/humanoid/wiz
|
||||||
name = "wizard spawner"
|
name = "wizard spawner"
|
||||||
icon_state = "mob_wiz"
|
icon_state = "mob_wiz"
|
||||||
|
|||||||
@@ -34,7 +34,7 @@
|
|||||||
/turf/unsimulated/mineral/snow
|
/turf/unsimulated/mineral/snow
|
||||||
icon_state = "snow_rock"
|
icon_state = "snow_rock"
|
||||||
base_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"
|
overlay_state = "snow_rock_overlay"
|
||||||
|
|
||||||
/turf/unsimulated/mineral/snow/New()
|
/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
|
/turf/unsimulated/mineral/random/high_chance
|
||||||
icon_state = "rock(high)"
|
icon_state = "rock(high)"
|
||||||
mineralChance = 25
|
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
|
/turf/unsimulated/mineral/random/high_chance_clown
|
||||||
icon_state = "rock(clown)"
|
icon_state = "rock(clown)"
|
||||||
mineralChance = 40
|
mineralChance = 40
|
||||||
@@ -851,6 +864,13 @@ turf/unsimulated/mineral/ChangeTurf(var/turf/N, var/tell_universe=1, var/force_l
|
|||||||
"Phazon" = 10
|
"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()
|
/turf/unsimulated/mineral/random/Destroy()
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
BIN
icons/turf/ice.dmi
Normal file
BIN
icons/turf/ice.dmi
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 71 KiB |
26
maps/_map.dm
26
maps/_map.dm
@@ -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/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)
|
var/z //Number of the z-level (the z coordinate)
|
||||||
|
|
||||||
|
/datum/zLevel/proc/post_mapload()
|
||||||
|
return
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
/datum/zLevel/station
|
/datum/zLevel/station
|
||||||
@@ -152,6 +155,7 @@ var/global/list/accessable_z_levels = list()
|
|||||||
name = "station"
|
name = "station"
|
||||||
movementChance = ZLEVEL_BASE_CHANCE * ZLEVEL_STATION_MODIFIER
|
movementChance = ZLEVEL_BASE_CHANCE * ZLEVEL_STATION_MODIFIER
|
||||||
|
|
||||||
|
|
||||||
/datum/zLevel/centcomm
|
/datum/zLevel/centcomm
|
||||||
|
|
||||||
name = "centcomm"
|
name = "centcomm"
|
||||||
@@ -176,6 +180,28 @@ var/global/list/accessable_z_levels = list()
|
|||||||
movementJammed = 1
|
movementJammed = 1
|
||||||
base_turf = /turf/unsimulated/beach/sand
|
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 ///////////////////////////////////////////////////////
|
// Debug ///////////////////////////////////////////////////////
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
47
maps/tgstation-snow.dm
Normal file
47
maps/tgstation-snow.dm
Normal 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
15779
maps/tgstation-snow.dmm
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1057,6 +1057,7 @@
|
|||||||
#include "code\game\objects\structures\stool_bed_chair_nest\chairs.dm"
|
#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\guillotine.dm"
|
||||||
#include "code\game\objects\structures\stool_bed_chair_nest\stools.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\universal_generators\radial_generator.dm"
|
||||||
#include "code\game\objects\structures\vehicles\adminbus.dm"
|
#include "code\game\objects\structures\vehicles\adminbus.dm"
|
||||||
#include "code\game\objects\structures\vehicles\adminbus_powers.dm"
|
#include "code\game\objects\structures\vehicles\adminbus_powers.dm"
|
||||||
|
|||||||
Reference in New Issue
Block a user