mirror of
https://github.com/fulpstation/fulpstation.git
synced 2025-12-10 18:11:47 +00:00
* a very calming act when the world is too much, too fast * i'm tired but i have to be efficient, infinite * lick your lips at the sight of me a fantasy made reality
146 lines
4.1 KiB
Plaintext
146 lines
4.1 KiB
Plaintext
|
|
/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 && (isspaceturf(T)))
|
|
. = 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) |