[MIRROR] Admin "Reload Station" Map Generator - Reloads specified block to roundstart. also buildmode area mapgens have names instead of paths on a list. (#2172)

* Admin "Reload Station" Map Generator - Reloads specified block to roundstart. also buildmode area mapgens have names instead of paths on a list.

* clean up + manual sync
This commit is contained in:
CitadelStationBot
2017-08-02 06:28:08 -05:00
committed by Poojawa
parent 4b3d878e1d
commit f62fc85f0d
12 changed files with 204 additions and 77 deletions
+11 -3
View File
@@ -194,11 +194,14 @@
valueholder = input(user,"Enter variable value:" ,"Value") as turf in world
if(AREA_BUILDMODE)
var/list/gen_paths = subtypesof(/datum/mapGenerator)
var/type = input(user,"Select Generator Type","Type") as null|anything in gen_paths
var/list/options = list()
for(var/path in gen_paths)
var/datum/mapGenerator/MP = path
options[initial(MP.buildmode_name)] = path
var/type = input(user,"Select Generator Type","Type") as null|anything in options
if(!type) return
generator_path = type
generator_path = options[type]
cornerA = null
cornerB = null
@@ -342,7 +345,12 @@
if(cornerA && cornerB)
if(!generator_path)
to_chat(user, "<span class='warning'>Select generator type first.</span>")
return
var/datum/mapGenerator/G = new generator_path
if(istype(G, /datum/mapGenerator/repair/reload_station_map))
if(GLOB.reloading_map)
to_chat(user, "<span class='boldwarning'>You are already reloading an area! Please wait for it to fully finish loading before trying to load another!</span>")
return
G.defineRegion(cornerA,cornerB,1)
G.generate()
cornerA = null
+22 -10
View File
@@ -29,21 +29,21 @@ GLOBAL_DATUM_INIT(_preloader, /dmm_suite/preloader, new)
* 2) Read the map line by line, parsing the result (using parse_grid)
*
*/
/dmm_suite/load_map(dmm_file as file, x_offset as num, y_offset as num, z_offset as num, cropMap as num, measureOnly as num, no_changeturf as num)
/dmm_suite/load_map(dmm_file as file, x_offset as num, y_offset as num, z_offset as num, cropMap as num, measureOnly as num, no_changeturf as num, lower_crop_x as num, lower_crop_y as num, upper_crop_x as num, upper_crop_y as num)
//How I wish for RAII
Master.StartLoadingMap()
space_key = null
#ifdef TESTING
turfsSkipped = 0
#endif
. = load_map_impl(dmm_file, x_offset, y_offset, z_offset, cropMap, measureOnly, no_changeturf)
. = load_map_impl(dmm_file, x_offset, y_offset, z_offset, cropMap, measureOnly, no_changeturf, lower_crop_x, upper_crop_x, lower_crop_y, upper_crop_y)
#ifdef TESTING
if(turfsSkipped)
testing("Skipped loading [turfsSkipped] default turfs")
#endif
Master.StopLoadingMap()
/dmm_suite/proc/load_map_impl(dmm_file, x_offset, y_offset, z_offset, cropMap, measureOnly, no_changeturf)
/dmm_suite/proc/load_map_impl(dmm_file, x_offset, y_offset, z_offset, cropMap, measureOnly, no_changeturf, x_lower = -INFINITY, x_upper = INFINITY, y_lower = -INFINITY, y_upper = INFINITY)
var/tfile = dmm_file//the map file we're creating
if(isfile(tfile))
tfile = file2text(tfile)
@@ -60,6 +60,7 @@ GLOBAL_DATUM_INIT(_preloader, /dmm_suite/preloader, new)
var/key_len = 0
var/stored_index = 1
while(dmmRegex.Find(tfile, stored_index))
stored_index = dmmRegex.next
@@ -81,7 +82,12 @@ GLOBAL_DATUM_INIT(_preloader, /dmm_suite/preloader, new)
if(!key_len)
throw EXCEPTION("Coords before model definition in DMM")
var/xcrdStart = text2num(dmmRegex.group[3]) + x_offset - 1
var/curr_x = text2num(dmmRegex.group[3])
if(curr_x < x_lower || curr_x > x_upper)
continue
var/xcrdStart = curr_x + x_offset - 1
//position of the currently processed square
var/xcrd
var/ycrd = text2num(dmmRegex.group[4]) + y_offset - 1
@@ -96,7 +102,7 @@ GLOBAL_DATUM_INIT(_preloader, /dmm_suite/preloader, new)
if(!no_changeturf)
WARNING("Z-level expansion occurred without no_changeturf set, this may cause problems when /turf/AfterChange is called")
bounds[MAP_MINX] = min(bounds[MAP_MINX], xcrdStart)
bounds[MAP_MINX] = min(bounds[MAP_MINX], Clamp(xcrdStart, x_lower, x_upper))
bounds[MAP_MINZ] = min(bounds[MAP_MINZ], zcrd)
bounds[MAP_MAXZ] = max(bounds[MAP_MAXZ], zcrd)
@@ -113,15 +119,15 @@ GLOBAL_DATUM_INIT(_preloader, /dmm_suite/preloader, new)
if(gridLines.len && gridLines[gridLines.len] == "")
gridLines.Cut(gridLines.len) // Remove only one blank line at the end.
bounds[MAP_MINY] = min(bounds[MAP_MINY], ycrd)
bounds[MAP_MINY] = min(bounds[MAP_MINY], Clamp(ycrd, y_lower, y_upper))
ycrd += gridLines.len - 1 // Start at the top and work down
if(!cropMap && ycrd > world.maxy)
if(!measureOnly)
world.maxy = ycrd // Expand Y here. X is expanded in the loop below
bounds[MAP_MAXY] = max(bounds[MAP_MAXY], ycrd)
bounds[MAP_MAXY] = max(bounds[MAP_MAXY], Clamp(ycrd, y_lower, y_upper))
else
bounds[MAP_MAXY] = max(bounds[MAP_MAXY], min(ycrd, world.maxy))
bounds[MAP_MAXY] = max(bounds[MAP_MAXY], Clamp(min(ycrd, world.maxy), y_lower, y_upper))
var/maxx = xcrdStart
if(measureOnly)
@@ -129,9 +135,15 @@ GLOBAL_DATUM_INIT(_preloader, /dmm_suite/preloader, new)
maxx = max(maxx, xcrdStart + length(line) / key_len - 1)
else
for(var/line in gridLines)
if((ycrd - y_offset + 1) < y_lower || (ycrd - y_offset + 1) > y_upper) //Reverse operation and check if it is out of bounds of cropping.
--ycrd
continue
if(ycrd <= world.maxy && ycrd >= 1)
xcrd = xcrdStart
for(var/tpos = 1 to length(line) - key_len + 1 step key_len)
if((xcrd - x_offset + 1) < x_lower || (xcrd - x_offset + 1) > x_upper) //Same as above.
++xcrd
continue //X cropping.
if(xcrd > world.maxx)
if(cropMap)
break
@@ -154,7 +166,7 @@ GLOBAL_DATUM_INIT(_preloader, /dmm_suite/preloader, new)
++xcrd
--ycrd
bounds[MAP_MAXX] = max(bounds[MAP_MAXX], cropMap ? min(maxx, world.maxx) : maxx)
bounds[MAP_MAXX] = Clamp(max(bounds[MAP_MAXX], cropMap ? min(maxx, world.maxx) : maxx), x_lower, x_upper)
CHECK_TICK
@@ -343,7 +355,7 @@ GLOBAL_DATUM_INIT(_preloader, /dmm_suite/preloader, new)
/dmm_suite/proc/create_atom(path, crds)
set waitfor = FALSE
. = new path (crds)
//text trimming (both directions) helper proc
//optionally removes quotes before and after the text (for variable name)
/dmm_suite/proc/trim_text(what as text,trim_quotes=0)
@@ -17,7 +17,6 @@
//All
#define CLUSTER_CHECK_ALL 30 //Don't let anything cluster, like, at all
/datum/mapGenerator
//Map information
@@ -26,8 +25,12 @@
//mapGeneratorModule information
var/list/modules = list()
var/buildmode_name = "Undocumented"
/datum/mapGenerator/New()
..()
if(buildmode_name == "Undocumented")
buildmode_name = copytext("[type]", 20) // / d a t u m / m a p g e n e r a t o r / = 20 characters.
initialiseModules()
//Defines the region the map represents, sets map
@@ -20,13 +20,25 @@
/datum/mapGeneratorModule/bottomLayer/massdelete
spawnableAtoms = list()
spawnableTurfs = list()
var/deletemobs = TRUE
var/deleteturfs = TRUE
/datum/mapGeneratorModule/bottomLayer/massdelete/generate()
if(!mother)
return
for(var/V in mother.map)
var/turf/T = V
T.empty()
T.empty(deleteturfs? null : T.type, delmobs = deletemobs, forceop = TRUE)
/datum/mapGeneratorModule/bottomLayer/massdelete/no_delete_mobs
deletemobs = FALSE
/datum/mapGeneratorModule/bottomLayer/massdelete/leave_turfs
deleteturfs = FALSE
/datum/mapGeneratorModule/bottomLayer/massdelete/regeneration_delete
deletemobs = FALSE
deleteturfs = FALSE
//Only places atoms/turfs on area borders
/datum/mapGeneratorModule/border
@@ -29,17 +29,21 @@
/datum/mapGenerator/asteroid/hollow
modules = list(/datum/mapGeneratorModule/bottomLayer/asteroidTurfs, \
/datum/mapGeneratorModule/border/asteroidWalls)
buildmode_name = "Pattern: Asteroid Room \[AIRLESS!\]"
/datum/mapGenerator/asteroid/hollow/random
modules = list(/datum/mapGeneratorModule/bottomLayer/asteroidTurfs, \
/datum/mapGeneratorModule/border/asteroidWalls, \
/datum/mapGeneratorModule/splatterLayer/asteroidWalls)
buildmode_name = "Pattern: Asteroid Room: Splatter Walls \[AIRLESS!\]"
/datum/mapGenerator/asteroid/hollow/random/monsters
modules = list(/datum/mapGeneratorModule/bottomLayer/asteroidTurfs, \
/datum/mapGeneratorModule/border/asteroidWalls, \
/datum/mapGeneratorModule/splatterLayer/asteroidWalls, \
/datum/mapGeneratorModule/splatterLayer/asteroidMonsters)
buildmode_name = "Pattern: Asteroid Room: Splatter Walls + Monsters \[AIRLESS!\]"
/datum/mapGenerator/asteroid/filled
modules = list(/datum/mapGeneratorModule/bottomLayer/asteroidWalls)
modules = list(/datum/mapGeneratorModule/bottomLayer/asteroidWalls)
buildmode_name = "Block: Asteroid Walls"
@@ -4,28 +4,30 @@
/datum/mapGeneratorModule/border/cultWalls
spawnableTurfs = list(/turf/closed/wall/mineral/cult = 100)
/datum/mapGeneratorModule/bottomLayer/clockFloor
spawnableTurfs = list(/turf/open/floor/clockwork = 100)
/datum/mapGeneratorModule/border/clockWalls
spawnableTurfs = list(/turf/closed/wall/clockwork = 100)
/datum/mapGenerator/cult //walls and floor only
modules = list(/datum/mapGeneratorModule/bottomLayer/cultFloor, \
modules = list(/datum/mapGeneratorModule/bottomLayer/cultFloor, \
/datum/mapGeneratorModule/border/cultWalls, \
/datum/mapGeneratorModule/bottomLayer/repressurize)
buildmode_name = "Pattern: Cult Room"
/datum/mapGenerator/clock //walls and floor only
modules = list(/datum/mapGeneratorModule/bottomLayer/clockFloor, \
modules = list(/datum/mapGeneratorModule/bottomLayer/clockFloor, \
/datum/mapGeneratorModule/border/clockWalls, \
/datum/mapGeneratorModule/bottomLayer/repressurize)
buildmode_name = "Pattern: Clockwork Room"
/datum/mapGenerator/cult/floor //floors only
modules = list(/datum/mapGeneratorModule/bottomLayer/cultFloor, \
modules = list(/datum/mapGeneratorModule/bottomLayer/cultFloor, \
/datum/mapGeneratorModule/bottomLayer/repressurize)
buildmode_name = "Block: Cult Floor"
/datum/mapGenerator/clock/floor //floor only
modules = list(/datum/mapGeneratorModule/bottomLayer/clockFloor, \
/datum/mapGeneratorModule/bottomLayer/repressurize)
modules = list(/datum/mapGeneratorModule/bottomLayer/clockFloor, \
/datum/mapGeneratorModule/bottomLayer/repressurize)
buildmode_name = "Block: Clockwork Floor"
@@ -5,6 +5,7 @@
var/max_x = 0
var/max_y = 0
modules = list(/datum/mapGeneratorModule/river)
buildmode_name = "Pattern: Lava Rivers"
/datum/mapGenerator/lavaland/defineRegion(turf/Start, turf/End, replace = 0)
start_z = Start.z
@@ -22,9 +22,12 @@
/datum/mapGenerator/lavaland/ground_only
modules = list(/datum/mapGeneratorModule/bottomLayer/lavaland_default)
buildmode_name = "Block: Lavaland Floor"
/datum/mapGenerator/lavaland/dense_ores
modules = list(/datum/mapGeneratorModule/bottomLayer/lavaland_mineral/dense)
buildmode_name = "Block: Lavaland Ores: Dense"
/datum/mapGenerator/lavaland/normal_ores
modules = list(/datum/mapGeneratorModule/bottomLayer/lavaland_mineral)
buildmode_name = "Block: Lavaland Ores"
@@ -8,4 +8,4 @@
/datum/mapGeneratorModule/randBushes, \
/datum/mapGeneratorModule/randRocks, \
/datum/mapGeneratorModule/denseLayer/grassTufts)
buildmode_name = "Pattern: Nature"
@@ -16,16 +16,92 @@
spawnableTurfs = list(/turf/closed/wall = 100)
allowAtomsOnSpace = TRUE
/datum/mapGeneratorModule/reload_station_map/generate()
if(!istype(mother, /datum/mapGenerator/repair/reload_station_map))
return
var/datum/mapGenerator/repair/reload_station_map/mother1 = mother
if(mother1.z != ZLEVEL_STATION)
return //This is only for reloading station blocks!
GLOB.reloading_map = TRUE
var/static/dmm_suite/reloader = new
var/list/bounds = reloader.load_map(file(SSmapping.config.GetFullMapPath()),measureOnly = FALSE, no_changeturf = FALSE,x_offset = 0, y_offset = 0, z_offset = ZLEVEL_STATION, cropMap=TRUE, lower_crop_x = mother1.x_low, lower_crop_y = mother1.y_low, upper_crop_x = mother1.x_high, upper_crop_y = mother1.y_high)
var/list/obj/machinery/atmospherics/atmos_machines = list()
var/list/obj/structure/cable/cables = list()
var/list/atom/atoms = list()
repopulate_sorted_areas()
for(var/L in block(locate(bounds[MAP_MINX], bounds[MAP_MINY], bounds[MAP_MINZ]),
locate(bounds[MAP_MAXX], bounds[MAP_MAXY], bounds[MAP_MAXZ])))
set waitfor = FALSE
var/turf/B = L
atoms += B
for(var/A in B)
atoms += A
if(istype(A,/obj/structure/cable))
cables += A
continue
if(istype(A,/obj/machinery/atmospherics))
atmos_machines += A
SSatoms.InitializeAtoms(atoms)
SSmachines.setup_template_powernets(cables)
SSair.setup_template_machinery(atmos_machines)
GLOB.reloading_map = FALSE
/datum/mapGenerator/repair
modules = list(/datum/mapGeneratorModule/bottomLayer/repairFloorPlasteel,
/datum/mapGeneratorModule/bottomLayer/repressurize)
buildmode_name = "Repair: Floor"
/datum/mapGenerator/repair/delete_walls
modules = list(/datum/mapGeneratorModule/bottomLayer/repairFloorPlasteel/flatten,
/datum/mapGeneratorModule/bottomLayer/repressurize)
buildmode_name = "Repair: Floor: Flatten Walls"
/datum/mapGenerator/repair/enclose_room
modules = list(/datum/mapGeneratorModule/bottomLayer/repairFloorPlasteel/flatten,
/datum/mapGeneratorModule/border/normalWalls,
/datum/mapGeneratorModule/bottomLayer/repressurize)
buildmode_name = "Repair: Generate Aired Room"
/datum/mapGenerator/repair/reload_station_map
modules = list(/datum/mapGeneratorModule/bottomLayer/massdelete/no_delete_mobs)
var/x_low = 0
var/x_high = 0
var/y_low = 0
var/y_high = 0
var/z = 0
var/cleanload = FALSE
var/datum/mapGeneratorModule/reload_station_map/loader
buildmode_name = "Repair: Reload Block \[DO NOT USE\]"
/datum/mapGenerator/repair/reload_station_map/clean
buildmode_name = "Repair: Reload Block - Mass Delete"
cleanload = TRUE
/datum/mapGenerator/repair/reload_station_map/clean/in_place
modules = list(/datum/mapGeneratorModule/bottomLayer/massdelete/regeneration_delete)
buildmode_name = "Repair: Reload Block - Mass Delete - In Place"
/datum/mapGenerator/repair/reload_station_map/defineRegion(turf/start, turf/end)
. = ..()
if(start.z != ZLEVEL_STATION || end.z != ZLEVEL_STATION)
return
x_low = min(start.x, end.x)
y_low = min(start.y, end.y)
x_high = max(start.x, end.x)
y_high = max(start.y, end.y)
z = ZLEVEL_STATION
GLOBAL_VAR_INIT(reloading_map, FALSE)
/datum/mapGenerator/repair/reload_station_map/generate(clean = cleanload)
if(!loader)
loader = new
if(cleanload)
..() //Trigger mass deletion.
modules |= loader
syncModules()
loader.generate()
@@ -7,9 +7,11 @@
// Generators
/datum/mapGenerator/shuttle/full
modules = list(/datum/mapGeneratorModule/bottomLayer/shuttleFloor, \
modules = list(/datum/mapGeneratorModule/bottomLayer/shuttleFloor, \
/datum/mapGeneratorModule/border/shuttleWalls,\
/datum/mapGeneratorModule/bottomLayer/repressurize)
buildmode_name = "Pattern: Shuttle Room"
/datum/mapGenerator/shuttle/floor
modules = list(/datum/mapGeneratorModule/bottomLayer/shuttleFloor)
buildmode_name = "Block: Shuttle Floor"
@@ -1,52 +1,56 @@
// Modules
/turf/open/floor/plasteel/shuttle/red/syndicate
name = "floor" //Not Brig Floor
/datum/mapGeneratorModule/bottomLayer/syndieFloor
spawnableTurfs = list(/turf/open/floor/plasteel/shuttle/red/syndicate = 100)
/datum/mapGeneratorModule/border/syndieWalls
spawnableAtoms = list()
spawnableTurfs = list(/turf/closed/wall/r_wall = 100)
/datum/mapGeneratorModule/syndieFurniture
clusterCheckFlags = CLUSTER_CHECK_ALL
spawnableTurfs = list()
spawnableAtoms = list(/obj/structure/table = 20, /obj/structure/chair = 15, /obj/structure/chair/stool = 10,
/obj/structure/frame/computer = 15, /obj/item/weapon/storage/toolbox/syndicate = 15,
/obj/structure/closet/syndicate = 25, /obj/machinery/suit_storage_unit/syndicate = 15)
/datum/mapGeneratorModule/splatterLayer/syndieMobs
spawnableAtoms = list(/mob/living/simple_animal/hostile/syndicate = 30, \
/mob/living/simple_animal/hostile/syndicate/melee = 20, \
/mob/living/simple_animal/hostile/syndicate/ranged = 20, \
/mob/living/simple_animal/hostile/viscerator = 30)
spawnableTurfs = list()
// Generators
/datum/mapGenerator/syndicate/empty //walls and floor only
modules = list(/datum/mapGeneratorModule/bottomLayer/syndieFloor, \
/datum/mapGeneratorModule/border/syndieWalls,\
/datum/mapGeneratorModule/bottomLayer/repressurize)
/datum/mapGenerator/syndicate/mobsonly
modules = list(/datum/mapGeneratorModule/bottomLayer/syndieFloor, \
/datum/mapGeneratorModule/border/syndieWalls,\
/datum/mapGeneratorModule/splatterLayer/syndieMobs, \
/datum/mapGeneratorModule/bottomLayer/repressurize)
/datum/mapGenerator/syndicate/furniture
modules = list(/datum/mapGeneratorModule/bottomLayer/syndieFloor, \
/datum/mapGeneratorModule/border/syndieWalls,\
/datum/mapGeneratorModule/syndieFurniture, \
/datum/mapGeneratorModule/bottomLayer/repressurize)
/datum/mapGenerator/syndicate/full
modules = list(/datum/mapGeneratorModule/bottomLayer/syndieFloor, \
/datum/mapGeneratorModule/border/syndieWalls,\
/datum/mapGeneratorModule/syndieFurniture, \
/datum/mapGeneratorModule/splatterLayer/syndieMobs, \
/datum/mapGeneratorModule/bottomLayer/repressurize)
// Modules
/turf/open/floor/plasteel/shuttle/red/syndicate
name = "floor" //Not Brig Floor
/datum/mapGeneratorModule/bottomLayer/syndieFloor
spawnableTurfs = list(/turf/open/floor/plasteel/shuttle/red/syndicate = 100)
/datum/mapGeneratorModule/border/syndieWalls
spawnableAtoms = list()
spawnableTurfs = list(/turf/closed/wall/r_wall = 100)
/datum/mapGeneratorModule/syndieFurniture
clusterCheckFlags = CLUSTER_CHECK_ALL
spawnableTurfs = list()
spawnableAtoms = list(/obj/structure/table = 20,/obj/structure/chair = 15,/obj/structure/chair/stool = 10, \
/obj/structure/frame/computer = 15, /obj/item/weapon/storage/toolbox/syndicate = 15 ,\
/obj/structure/closet/syndicate = 25, /obj/machinery/suit_storage_unit/syndicate = 15)
/datum/mapGeneratorModule/splatterLayer/syndieMobs
spawnableAtoms = list(/mob/living/simple_animal/hostile/syndicate = 30, \
/mob/living/simple_animal/hostile/syndicate/melee = 20, \
/mob/living/simple_animal/hostile/syndicate/ranged = 20, \
/mob/living/simple_animal/hostile/viscerator = 30)
spawnableTurfs = list()
// Generators
/datum/mapGenerator/syndicate/empty //walls and floor only
modules = list(/datum/mapGeneratorModule/bottomLayer/syndieFloor, \
/datum/mapGeneratorModule/border/syndieWalls,\
/datum/mapGeneratorModule/bottomLayer/repressurize)
buildmode_name = "Pattern: Shuttle Room: Syndicate"
/datum/mapGenerator/syndicate/mobsonly
modules = list(/datum/mapGeneratorModule/bottomLayer/syndieFloor, \
/datum/mapGeneratorModule/border/syndieWalls,\
/datum/mapGeneratorModule/splatterLayer/syndieMobs, \
/datum/mapGeneratorModule/bottomLayer/repressurize)
buildmode_name = "Pattern: Shuttle Room: Syndicate: Mobs"
/datum/mapGenerator/syndicate/furniture
modules = list(/datum/mapGeneratorModule/bottomLayer/syndieFloor, \
/datum/mapGeneratorModule/border/syndieWalls,\
/datum/mapGeneratorModule/syndieFurniture, \
/datum/mapGeneratorModule/bottomLayer/repressurize)
buildmode_name = "Pattern: Shuttle Room: Syndicate: Furniture"
/datum/mapGenerator/syndicate/full
modules = list(/datum/mapGeneratorModule/bottomLayer/syndieFloor, \
/datum/mapGeneratorModule/border/syndieWalls,\
/datum/mapGeneratorModule/syndieFurniture, \
/datum/mapGeneratorModule/splatterLayer/syndieMobs, \
/datum/mapGeneratorModule/bottomLayer/repressurize)
buildmode_name = "Pattern: Shuttle Room: Syndicate: All"