mirror of
https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13.git
synced 2025-12-11 18:33:36 +00:00
initial commit - cross reference with 5th port - obviously has compile errors
This commit is contained in:
146
code/modules/procedural_mapping/mapGeneratorModule.dm
Normal file
146
code/modules/procedural_mapping/mapGeneratorModule.dm
Normal file
@@ -0,0 +1,146 @@
|
||||
|
||||
/datum/mapGeneratorModule
|
||||
var/datum/mapGenerator/mother = null
|
||||
var/list/spawnableAtoms = list()
|
||||
var/list/spawnableTurfs = list()
|
||||
var/clusterMax = 5
|
||||
var/clusterMin = 1
|
||||
var/clusterCheckFlags = CLUSTER_CHECK_SAME_ATOMS
|
||||
var/allowAtomsOnSpace = FALSE
|
||||
|
||||
|
||||
//Syncs the module up with it's mother
|
||||
/datum/mapGeneratorModule/proc/sync(datum/mapGenerator/mum)
|
||||
mother = null
|
||||
if(mum)
|
||||
mother = mum
|
||||
|
||||
|
||||
//Generates it's spawnable atoms and turfs
|
||||
/datum/mapGeneratorModule/proc/generate()
|
||||
if(!mother)
|
||||
return
|
||||
var/list/map = mother.map
|
||||
for(var/turf/T in map)
|
||||
place(T)
|
||||
|
||||
|
||||
//Place a spawnable atom or turf on this turf
|
||||
/datum/mapGeneratorModule/proc/place(turf/T)
|
||||
if(!T)
|
||||
return 0
|
||||
|
||||
var/clustering = 0
|
||||
var/skipLoopIteration = FALSE
|
||||
|
||||
//Turfs don't care whether atoms can be placed here
|
||||
for(var/turfPath in spawnableTurfs)
|
||||
|
||||
//Clustering!
|
||||
if(clusterMax && clusterMin)
|
||||
|
||||
//You're the same as me? I hate you I'm going home
|
||||
if(clusterCheckFlags & CLUSTER_CHECK_SAME_TURFS)
|
||||
clustering = rand(clusterMin,clusterMax)
|
||||
for(var/turf/F in RANGE_TURFS(clustering,T))
|
||||
if(istype(F,turfPath))
|
||||
skipLoopIteration = TRUE
|
||||
break
|
||||
if(skipLoopIteration)
|
||||
skipLoopIteration = FALSE
|
||||
continue
|
||||
|
||||
//You're DIFFERENT to me? I hate you I'm going home
|
||||
if(clusterCheckFlags & CLUSTER_CHECK_DIFFERENT_TURFS)
|
||||
clustering = rand(clusterMin,clusterMax)
|
||||
for(var/turf/F in RANGE_TURFS(clustering,T))
|
||||
if(!(istype(F,turfPath)))
|
||||
skipLoopIteration = TRUE
|
||||
break
|
||||
if(skipLoopIteration)
|
||||
skipLoopIteration = FALSE
|
||||
continue
|
||||
|
||||
//Success!
|
||||
if(prob(spawnableTurfs[turfPath]))
|
||||
T.ChangeTurf(turfPath)
|
||||
|
||||
|
||||
//Atoms DO care whether atoms can be placed here
|
||||
if(checkPlaceAtom(T))
|
||||
|
||||
for(var/atomPath in spawnableAtoms)
|
||||
|
||||
//Clustering!
|
||||
if(clusterMax && clusterMin)
|
||||
|
||||
//You're the same as me? I hate you I'm going home
|
||||
if(clusterCheckFlags & CLUSTER_CHECK_SAME_ATOMS)
|
||||
clustering = rand(clusterMin, clusterMax)
|
||||
for(var/atom/movable/M in range(clustering,T))
|
||||
if(istype(M,atomPath))
|
||||
skipLoopIteration = TRUE
|
||||
break
|
||||
if(skipLoopIteration)
|
||||
skipLoopIteration = FALSE
|
||||
continue
|
||||
|
||||
//You're DIFFERENT from me? I hate you I'm going home
|
||||
if(clusterCheckFlags & CLUSTER_CHECK_DIFFERENT_ATOMS)
|
||||
clustering = rand(clusterMin, clusterMax)
|
||||
for(var/atom/movable/M in range(clustering,T))
|
||||
if(!(istype(M,atomPath)))
|
||||
skipLoopIteration = TRUE
|
||||
break
|
||||
if(skipLoopIteration)
|
||||
skipLoopIteration = FALSE
|
||||
continue
|
||||
|
||||
//Success!
|
||||
if(prob(spawnableAtoms[atomPath]))
|
||||
new atomPath(T)
|
||||
|
||||
. = 1
|
||||
|
||||
|
||||
//Checks and Rejects dense turfs
|
||||
/datum/mapGeneratorModule/proc/checkPlaceAtom(turf/T)
|
||||
. = 1
|
||||
if(!T)
|
||||
return 0
|
||||
if(T.density)
|
||||
. = 0
|
||||
for(var/atom/A in T)
|
||||
if(A.density)
|
||||
. = 0
|
||||
break
|
||||
if(!allowAtomsOnSpace && (istype(T,/turf/open/space)))
|
||||
. = 0
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// PREMADE BASE TEMPLATES //
|
||||
// Appropriate settings for usable types //
|
||||
// Not usable types themselves, use them as parent types //
|
||||
// Seriously, don't use these on their own, just parents //
|
||||
///////////////////////////////////////////////////////////
|
||||
//The /atom and /turf examples are just so these compile, replace those with your typepaths in your subtypes.
|
||||
|
||||
//Settings appropriate for a turf that covers the entire map region, eg a fill colour on a bottom layer in a graphics program.
|
||||
//Should only have one of these in your mapGenerator unless you want to waste CPU
|
||||
/datum/mapGeneratorModule/bottomLayer
|
||||
clusterCheckFlags = CLUSTER_CHECK_NONE
|
||||
spawnableAtoms = list()//Recommended: No atoms.
|
||||
spawnableTurfs = list(/turf = 100)
|
||||
|
||||
//Settings appropriate for turfs/atoms that cover SOME of the map region, sometimes referred to as a splatter layer.
|
||||
/datum/mapGeneratorModule/splatterLayer
|
||||
clusterCheckFlags = CLUSTER_CHECK_ALL
|
||||
spawnableAtoms = list(/atom = 30)
|
||||
spawnableTurfs = list(/turf = 30)
|
||||
|
||||
//Settings appropriate for turfs/atoms that cover a lot of the map region, eg a dense forest.
|
||||
/datum/mapGeneratorModule/denseLayer
|
||||
clusterCheckFlags = CLUSTER_CHECK_NONE
|
||||
spawnableAtoms = list(/atom = 75)
|
||||
spawnableTurfs = list(/turf = 75)
|
||||
Reference in New Issue
Block a user