diff --git a/code/modules/admin/verbs/buildmode.dm b/code/modules/admin/verbs/buildmode.dm
index 767f30e1380..d06bd7e61c8 100644
--- a/code/modules/admin/verbs/buildmode.dm
+++ b/code/modules/admin/verbs/buildmode.dm
@@ -1,3 +1,10 @@
+#define BASIC_BUILDMODE 1
+#define ADV_BUILDMODE 2
+#define VAR_BUILDMODE 3
+#define THROW_BUILDMODE 4
+#define AREA_BUILDMODE 5
+#define NUM_BUILDMODES 5
+
/proc/togglebuildmode(mob/M as mob in player_list)
set name = "Toggle Build Mode"
set category = "Special Verbs"
@@ -35,7 +42,7 @@
M.client.screen += D
H.cl = M.client
-/obj/effect/bmode//Cleaning up the tree a bit
+/obj/effect/bmode //Cleaning up the tree a bit
density = 1
anchored = 1
layer = 20
@@ -68,7 +75,7 @@
/obj/effect/bmode/buildhelp/Click()
switch(master.cl.buildmode)
- if(1)
+ if(BASIC_BUILDMODE)
usr << "\blue ***********************************************************"
usr << "\blue Left Mouse Button = Construct / Upgrade"
usr << "\blue Right Mouse Button = Deconstruct / Delete / Downgrade"
@@ -78,7 +85,7 @@
usr << "\blue Use the button in the upper left corner to"
usr << "\blue change the direction of built objects."
usr << "\blue ***********************************************************"
- if(2)
+ if(ADV_BUILDMODE)
usr << "\blue ***********************************************************"
usr << "\blue Right Mouse Button on buildmode button = Set object type"
usr << "\blue Left Mouse Button on turf/obj = Place objects"
@@ -87,17 +94,23 @@
usr << "\blue Use the button in the upper left corner to"
usr << "\blue change the direction of built objects."
usr << "\blue ***********************************************************"
- if(3)
+ if(VAR_BUILDMODE)
usr << "\blue ***********************************************************"
usr << "\blue Right Mouse Button on buildmode button = Select var(type) & value"
usr << "\blue Left Mouse Button on turf/obj/mob = Set var(type) & value"
usr << "\blue Right Mouse Button on turf/obj/mob = Reset var's value"
usr << "\blue ***********************************************************"
- if(4)
+ if(THROW_BUILDMODE)
usr << "\blue ***********************************************************"
usr << "\blue Left Mouse Button on turf/obj/mob = Select"
usr << "\blue Right Mouse Button on turf/obj/mob = Throw"
usr << "\blue ***********************************************************"
+ if(AREA_BUILDMODE)
+ usr << "\blue ***********************************************************"
+ usr << "\blue Left Mouse Button on turf/obj/mob = Select corner"
+ usr << "\blue Right Mouse Button on buildmode button = Select generator"
+ usr << "\blue ***********************************************************"
+
return 1
/obj/effect/bmode/buildquit
@@ -117,6 +130,13 @@
var/obj/effect/bmode/buildmode/buildmode = null
var/obj/effect/bmode/buildquit/buildquit = null
var/atom/movable/throw_atom = null
+ var/turf/cornerA = null
+ var/turf/cornerB = null
+ var/generator_path = null
+
+/obj/effect/bmode/buildholder/proc/Reset()//Reset temporary variables
+ cornerA = null
+ cornerB = null
/obj/effect/bmode/buildmode
icon_state = "buildmode1"
@@ -129,25 +149,15 @@
var/list/pa = params2list(params)
if(pa.Find("left"))
- switch(master.cl.buildmode)
- if(1)
- master.cl.buildmode = 2
- src.icon_state = "buildmode2"
- if(2)
- master.cl.buildmode = 3
- src.icon_state = "buildmode3"
- if(3)
- master.cl.buildmode = 4
- src.icon_state = "buildmode4"
- if(4)
- master.cl.buildmode = 1
- src.icon_state = "buildmode1"
+ master.cl.buildmode = (master.cl.buildmode % NUM_BUILDMODES) +1
+ master.Reset()
+ src.icon_state = "buildmode[master.cl.buildmode]"
else if(pa.Find("right"))
switch(master.cl.buildmode)
- if(1)
+ if(BASIC_BUILDMODE)
return 1
- if(2)
+ if(ADV_BUILDMODE)
objholder = text2path(input(usr,"Enter typepath:" ,"Typepath","/obj/structure/closet"))
if(!ispath(objholder))
objholder = /obj/structure/closet
@@ -155,7 +165,7 @@
else
if(ispath(objholder,/mob) && !check_rights(R_DEBUG,0))
objholder = /obj/structure/closet
- if(3)
+ if(VAR_BUILDMODE)
var/list/locked = list("vars", "key", "ckey", "client", "firemut", "ishulk", "telekinesis", "xray", "virus", "viruses", "cuffed", "ka", "last_eaten", "urine")
master.buildmode.varholder = input(usr,"Enter variable name:" ,"Name", "name")
@@ -174,6 +184,16 @@
master.buildmode.valueholder = input(usr,"Enter variable value:" ,"Value") as obj in world
if("turf-reference")
master.buildmode.valueholder = input(usr,"Enter variable value:" ,"Value") as turf in world
+ if(AREA_BUILDMODE)
+ var/list/gen_paths = typesof(/datum/mapGenerator) - /datum/mapGenerator
+
+ var/type = input(usr,"Select Generator Type","Type") as null|anything in gen_paths
+ if(!type) return
+
+ master.generator_path = type
+ master.cornerA = null
+ master.cornerB = null
+
return 1
@@ -186,8 +206,11 @@
if(!holder) return
var/list/pa = params2list(params)
+ if(istype(object,/obj/effect/bmode))
+ return
+
switch(buildmode)
- if(1)
+ if(BASIC_BUILDMODE)
if(istype(object,/turf) && pa.Find("left") && !pa.Find("alt") && !pa.Find("ctrl") )
var/turf/T = object
if(istype(object,/turf/space))
@@ -233,7 +256,7 @@
var/obj/structure/window/reinforced/WIN = new/obj/structure/window/reinforced(get_turf(object))
WIN.dir = NORTHWEST
log_admin("Build Mode: [key_name(usr)] built a window at ([object.x],[object.y],[object.z])")
- if(2)
+ if(ADV_BUILDMODE)
if(pa.Find("left"))
if(ispath(holder.buildmode.objholder,/turf))
var/turf/T = get_turf(object)
@@ -248,7 +271,7 @@
log_admin("Build Mode: [key_name(usr)] deleted [object] at ([object.x],[object.y],[object.z])")
qdel(object)
- if(3)
+ if(VAR_BUILDMODE)
if(pa.Find("left")) //I cant believe this shit actually compiles.
if(object.vars.Find(holder.buildmode.varholder))
log_admin("Build Mode: [key_name(usr)] modified [object.name]'s [holder.buildmode.varholder] to [holder.buildmode.valueholder]")
@@ -262,7 +285,7 @@
else
usr << "[initial(object.name)] does not have a var called '[holder.buildmode.varholder]'"
- if(4)
+ if(THROW_BUILDMODE)
if(pa.Find("left"))
if(isturf(object))
return
@@ -271,4 +294,35 @@
if(holder.throw_atom)
holder.throw_atom.throw_at(object, 10, 1)
log_admin("Build Mode: [key_name(usr)] threw [holder.throw_atom] at [object] ([object.x],[object.y],[object.z])")
-
+ if(AREA_BUILDMODE)
+ if(!holder.cornerA)
+ holder.cornerA = get_turf(object)
+ return
+ if(holder.cornerA && !holder.cornerB)
+ holder.cornerB = get_turf(object)
+
+ if(pa.Find("left")) //rectangular
+ if(holder.cornerA && holder.cornerB)
+ if(!holder.generator_path)
+ usr << "Select generator type first."
+ var/datum/mapGenerator/G = new holder.generator_path
+ G.defineRegion(holder.cornerA,holder.cornerB,1)
+ G.generate()
+ holder.cornerA = null
+ holder.cornerB = null
+ return
+ /* Something wrong with this, will check later
+ if(pa.Find("right")) // circular
+ if(holder.cornerA && holder.cornerB)
+ if(!holder.generator_path)
+ usr << "Select generator type first."
+ var/datum/mapGenerator/G = new holder.generator_path
+ G.defineCircularRegion(holder.cornerA,holder.cornerB,1)
+ G.generate()
+ holder.cornerA = null
+ holder.cornerB = null
+ return
+ */
+ //Something wrong - Reset
+ holder.cornerA = null
+ holder.cornerB = null
\ No newline at end of file
diff --git a/code/modules/procedural mapping/mapGeneratorModules/helpers.dm b/code/modules/procedural mapping/mapGeneratorModules/helpers.dm
new file mode 100644
index 00000000000..bad449a9e8f
--- /dev/null
+++ b/code/modules/procedural mapping/mapGeneratorModules/helpers.dm
@@ -0,0 +1,44 @@
+//Helper Modules
+
+
+// Helper to repressurize the area in case it was run in space
+/datum/mapGeneratorModule/bottomLayer/repressurize
+ spawnableAtoms = list()
+ spawnableTurfs = list()
+
+/datum/mapGeneratorModule/bottomLayer/repressurize/generate()
+ if(!mother)
+ return
+ var/list/map = mother.map
+ for(var/turf/simulated/T in map)
+ SSair.remove_from_active(T)
+ for(var/turf/simulated/T in map)
+ if(T.air)
+ T.air.oxygen = T.oxygen
+ T.air.nitrogen = T.nitrogen
+ T.air.carbon_dioxide = T.carbon_dioxide
+ T.air.toxins = T.toxins
+ T.air.temperature = T.temperature
+ SSair.add_to_active(T)
+
+//Only places atoms/turfs on area borders
+/datum/mapGeneratorModule/border
+ clusterCheckFlags = CLUSTER_CHECK_NONE
+
+/datum/mapGeneratorModule/border/generate()
+ if(!mother)
+ return
+ var/list/map = mother.map
+ for(var/turf/T in map)
+ if(is_border(T))
+ place(T)
+
+/datum/mapGeneratorModule/border/proc/is_border(var/turf/T)
+ for(var/direction in list(SOUTH,EAST,WEST,NORTH))
+ if (get_step(T,direction) in mother.map)
+ continue
+ return 1
+ return 0
+
+/datum/mapGenerator/repressurize
+ modules = list(/datum/mapGeneratorModule/bottomLayer/repressurize)
\ No newline at end of file
diff --git a/code/modules/procedural mapping/mapGenerators/asteroid.dm b/code/modules/procedural mapping/mapGenerators/asteroid.dm
new file mode 100644
index 00000000000..4dc002aa56a
--- /dev/null
+++ b/code/modules/procedural mapping/mapGenerators/asteroid.dm
@@ -0,0 +1,45 @@
+//Asteroid turfs
+/datum/mapGeneratorModule/bottomLayer/asteroidTurfs
+ spawnableTurfs = list(/turf/simulated/floor/plating/asteroid = 100)
+
+/datum/mapGeneratorModule/bottomLayer/asteroidWalls
+ spawnableTurfs = list(/turf/simulated/mineral = 100)
+
+//Border walls
+/datum/mapGeneratorModule/border/asteroidWalls
+ spawnableAtoms = list()
+ spawnableTurfs = list(/turf/simulated/mineral = 100)
+
+//Random walls
+/datum/mapGeneratorModule/splatterLayer/asteroidWalls
+ clusterCheckFlags = CLUSTER_CHECK_NONE
+ spawnableAtoms = list()
+ spawnableTurfs = list(/turf/simulated/mineral = 30)
+
+//Monsters
+/datum/mapGeneratorModule/splatterLayer/asteroidMonsters
+ spawnableTurfs = list()
+ spawnableAtoms = list(/mob/living/simple_animal/hostile/asteroid/basilisk = 10, \
+ /mob/living/simple_animal/hostile/asteroid/hivelord = 10, \
+ /mob/living/simple_animal/hostile/asteroid/goliath = 10)
+
+
+// GENERATORS
+
+/datum/mapGenerator/asteroid/hollow
+ modules = list(/datum/mapGeneratorModule/bottomLayer/asteroidTurfs, \
+ /datum/mapGeneratorModule/border/asteroidWalls)
+
+/datum/mapGenerator/asteroid/hollow/random
+ modules = list(/datum/mapGeneratorModule/bottomLayer/asteroidTurfs, \
+ /datum/mapGeneratorModule/border/asteroidWalls, \
+ /datum/mapGeneratorModule/splatterLayer/asteroidWalls)
+
+/datum/mapGenerator/asteroid/hollow/random/monsters
+ modules = list(/datum/mapGeneratorModule/bottomLayer/asteroidTurfs, \
+ /datum/mapGeneratorModule/border/asteroidWalls, \
+ /datum/mapGeneratorModule/splatterLayer/asteroidWalls, \
+ /datum/mapGeneratorModule/splatterLayer/asteroidMonsters)
+
+/datum/mapGenerator/asteroid/filled
+ modules = list(/datum/mapGeneratorModule/bottomLayer/asteroidWalls)
\ No newline at end of file
diff --git a/code/modules/procedural mapping/mapGenerators/shuttle.dm b/code/modules/procedural mapping/mapGenerators/shuttle.dm
new file mode 100644
index 00000000000..7197b127d48
--- /dev/null
+++ b/code/modules/procedural mapping/mapGenerators/shuttle.dm
@@ -0,0 +1,15 @@
+/datum/mapGeneratorModule/bottomLayer/shuttleFloor
+ spawnableTurfs = list(/turf/simulated/floor/plasteel/shuttle = 100)
+
+/datum/mapGeneratorModule/border/shuttleWalls
+ spawnableAtoms = list()
+ spawnableTurfs = list(/turf/simulated/wall/shuttle = 100)
+// Generators
+
+/datum/mapGenerator/shuttle/full
+ modules = list(/datum/mapGeneratorModule/bottomLayer/shuttleFloor, \
+ /datum/mapGeneratorModule/border/shuttleWalls,\
+ /datum/mapGeneratorModule/bottomLayer/repressurize)
+
+/datum/mapGenerator/shuttle/floor
+ modules = list(/datum/mapGeneratorModule/bottomLayer/shuttleFloor)
diff --git a/code/modules/procedural mapping/mapGenerators/syndicate.dm b/code/modules/procedural mapping/mapGenerators/syndicate.dm
new file mode 100644
index 00000000000..e48fe718d00
--- /dev/null
+++ b/code/modules/procedural mapping/mapGenerators/syndicate.dm
@@ -0,0 +1,52 @@
+// Modules
+
+/turf/simulated/floor/plasteel/shuttle/red/syndicate
+ name = "floor" //Not Brig Floor
+
+/datum/mapGeneratorModule/bottomLayer/syndieFloor
+ spawnableTurfs = list(/turf/simulated/floor/plasteel/shuttle/red/syndicate = 100)
+
+/datum/mapGeneratorModule/border/syndieWalls
+ spawnableAtoms = list()
+ spawnableTurfs = list(/turf/simulated/wall/r_wall = 100)
+
+
+/datum/mapGeneratorModule/syndieFurniture
+ clusterCheckFlags = CLUSTER_CHECK_ALL
+ spawnableTurfs = list()
+ spawnableAtoms = list(/obj/structure/table = 20,/obj/structure/stool/bed/chair = 15,/obj/structure/stool = 10, \
+ /obj/structure/computerframe = 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)
\ No newline at end of file
diff --git a/icons/misc/buildmode.dmi b/icons/misc/buildmode.dmi
index a885e76d549..089427111f2 100644
Binary files a/icons/misc/buildmode.dmi and b/icons/misc/buildmode.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 42c59cb7caa..fd68e5c52f8 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1332,8 +1332,12 @@
#include "code\modules\procedural mapping\mapGenerator.dm"
#include "code\modules\procedural mapping\mapGeneratorModule.dm"
#include "code\modules\procedural mapping\mapGeneratorReadme.dm"
+#include "code\modules\procedural mapping\mapGeneratorModules\helpers.dm"
#include "code\modules\procedural mapping\mapGeneratorModules\nature.dm"
+#include "code\modules\procedural mapping\mapGenerators\asteroid.dm"
#include "code\modules\procedural mapping\mapGenerators\nature.dm"
+#include "code\modules\procedural mapping\mapGenerators\shuttle.dm"
+#include "code\modules\procedural mapping\mapGenerators\syndicate.dm"
#include "code\modules\projectiles\ammunition.dm"
#include "code\modules\projectiles\firing.dm"
#include "code\modules\projectiles\gun.dm"