From f13aa201e88906b5f81ae577c49b40d18c7707e5 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Fri, 16 Dec 2022 18:04:43 -0800 Subject: [PATCH] adds standard turfmakers (#4835) Co-authored-by: VM_USER --- citadel.dme | 2 +- code/__DEFINES/MC.dm | 4 +- code/__DEFINES/_flags/turf_flags.dm | 4 +- code/__DEFINES/atmospherics/atmospheres.dm | 8 ++- code/__DEFINES/turfs/turfmakers.dm | 2 - code/__DEFINES/turfs/type_generation.dm | 11 +++ code/controllers/master.dm | 19 ++++- code/controllers/subsystem.dm | 29 ++++++-- code/controllers/subsystem/air.dm | 72 +++++++++++++++---- .../subsystem/emergency_shuttle.dm | 2 +- code/controllers/subsystem/events.dm | 2 +- code/controllers/subsystem/garbage.dm | 2 +- .../subsystem/mapping/obfuscation.dm | 2 +- code/controllers/subsystem/overlays.dm | 2 +- .../subsystem/processing/chemistry.dm | 2 +- code/controllers/subsystem/tgui.dm | 2 +- code/controllers/subsystem/timer.dm | 2 +- code/game/area/area.dm | 42 +++++++---- code/game/turfs/change_turf.dm | 2 +- code/game/turfs/turf.dm | 28 ++++++-- .../atmospherics/atmosphere/_atmosphere.dm | 3 +- .../atmospherics/environmental/public.dm | 2 +- .../atmospherics/gasmixtures/gas_mixture.dm | 32 ++++----- maps/~map_system/maps.dm | 1 + 24 files changed, 198 insertions(+), 79 deletions(-) delete mode 100644 code/__DEFINES/turfs/turfmakers.dm create mode 100644 code/__DEFINES/turfs/type_generation.dm diff --git a/citadel.dme b/citadel.dme index 9391e86a73a..d1f0fff9911 100644 --- a/citadel.dme +++ b/citadel.dme @@ -236,7 +236,7 @@ #include "code\__DEFINES\tools\misc.dm" #include "code\__DEFINES\tools\procs.dm" #include "code\__DEFINES\turfs\change_turf.dm" -#include "code\__DEFINES\turfs\turfmakers.dm" +#include "code\__DEFINES\turfs\type_generation.dm" #include "code\__HELPERS\_auxtools_api.dm" #include "code\__HELPERS\_global_objects.dm" #include "code\__HELPERS\_lists_tg.dm" diff --git a/code/__DEFINES/MC.dm b/code/__DEFINES/MC.dm index 752d4cb1d26..96e8aa29279 100644 --- a/code/__DEFINES/MC.dm +++ b/code/__DEFINES/MC.dm @@ -17,7 +17,7 @@ #define MC_AVG_FAST_UP_SLOW_DOWN(average, current) (average > current ? MC_AVERAGE_SLOW(average, current) : MC_AVERAGE_FAST(average, current)) #define MC_AVG_SLOW_UP_FAST_DOWN(average, current) (average < current ? MC_AVERAGE_SLOW(average, current) : MC_AVERAGE_FAST(average, current)) -#define NEW_SS_GLOBAL(varname) if(varname != src){if(istype(varname)){Recover();qdel(varname);}varname = src;} +#define NEW_SS_GLOBAL(varname) if(varname != src){if(istype(varname)){PreInit(TRUE);Preload(TRUE);Recover();qdel(varname);}varname = src;} #define START_PROCESSING(Processor, Datum) if (!(Datum.datum_flags & DF_ISPROCESSING)) {Datum.datum_flags |= DF_ISPROCESSING;Processor.processing += Datum} #define STOP_PROCESSING(Processor, Datum) Datum.datum_flags &= ~DF_ISPROCESSING;Processor.processing -= Datum @@ -88,14 +88,12 @@ DEFINE_BITFIELD(subsystem_flags, list( #define SUBSYSTEM_DEF(X) GLOBAL_REAL(SS##X, /datum/controller/subsystem/##X);\ /datum/controller/subsystem/##X/New(){\ NEW_SS_GLOBAL(SS##X);\ - PreInit();\ }\ /datum/controller/subsystem/##X #define PROCESSING_SUBSYSTEM_DEF(X) GLOBAL_REAL(SS##X, /datum/controller/subsystem/processing/##X);\ /datum/controller/subsystem/processing/##X/New(){\ NEW_SS_GLOBAL(SS##X);\ - PreInit();\ }\ /datum/controller/subsystem/processing/##X diff --git a/code/__DEFINES/_flags/turf_flags.dm b/code/__DEFINES/_flags/turf_flags.dm index c4d24c84e8e..7f9cd6e8fa0 100644 --- a/code/__DEFINES/_flags/turf_flags.dm +++ b/code/__DEFINES/_flags/turf_flags.dm @@ -10,7 +10,6 @@ /// queued for ZAS rebuild #define TURF_ZONE_REBUILD_QUEUED (1<<5) - ///CITMAIN TURF FLAGS - Completely unused /* /// If a turf can be made dirty at roundstart. This is also used in areas. @@ -26,6 +25,9 @@ DEFINE_BITFIELD(turf_flags, list( BITFIELD(NO_JAUNT), BITFIELD(UNUSED_RESERVATION_TURF), + BITFIELD(TURF_PLANET_QUEUED), + BITFIELD(TURF_PLANET_REGISTERED), + BITFIELD(TURF_ZONE_REBUILD_QUEUED), )) // /turf/z_flags diff --git a/code/__DEFINES/atmospherics/atmospheres.dm b/code/__DEFINES/atmospherics/atmospheres.dm index 75ca4ce8a4e..041f991a7cd 100644 --- a/code/__DEFINES/atmospherics/atmospheres.dm +++ b/code/__DEFINES/atmospherics/atmospheres.dm @@ -1,7 +1,9 @@ // Atmosphere IDs -/// SPECIAL ATMOSPHERE ID THAT FORCES ATMOS TO BE WHATEVER IS DEFINED AS A ZTRAIT, DEFAULTING TO SPACE. -#define ATMOSPHERE_ID_USE_ZTRAIT "USE_ZTRAIT" +//? abstract ids +#define ATMOSPHERE_USE_OUTDOORS "!OUTDOORS" +#define ATMOSPHERE_USE_INDOORS "!INDOORS" +#define ATMOSPHERE_USE_AREA "!AREA" // Tethermap /// Virgo 2 planetary atmosphere ID @@ -17,7 +19,7 @@ /// Frozen World Atmos ID #define ATMOSPHERE_ID_FROZEN /datum/atmosphere/planet/classp /// Mining Planet PlanetAtmos IDs -#define ATMOSPHERE_ID_MININGPLANET /datum/atmosphere/planet/classg +#define ATMOSPHERE_ID_MININGPLANET /datum/atmosphere/planet/classg /// Triumph Planet Atmos ID (If needed) #define ATMOSPHERE_ID_TRIUMPH /datum/atmosphere/planet/virgo3b diff --git a/code/__DEFINES/turfs/turfmakers.dm b/code/__DEFINES/turfs/turfmakers.dm deleted file mode 100644 index 6131e63dfc3..00000000000 --- a/code/__DEFINES/turfs/turfmakers.dm +++ /dev/null @@ -1,2 +0,0 @@ -/// Makes a generic, outdoors planetary turf that uses atmos from a ztrait. -#define CREATE_TURF_PLANETARY_OUTDOORS(path) path/generated/planetary/outdoors=TRUE;path/generated/planetary/initial_gas_mix=ATMOSPHERE_ID_USE_ZTRAIT;path/generated/planetary/allow_gas_overlays=FALSE diff --git a/code/__DEFINES/turfs/type_generation.dm b/code/__DEFINES/turfs/type_generation.dm new file mode 100644 index 00000000000..d884b7c6e0e --- /dev/null +++ b/code/__DEFINES/turfs/type_generation.dm @@ -0,0 +1,11 @@ + +#define CREATE_STANDARD_TURFS(type) \ +##type/indoors; \ +##type/indoors/outdoors = FALSE; \ +##type/indoors/initial_gas_mix = ATMOSPHERE_USE_INDOORS; \ +##type/outdoors/outdoors = TRUE; \ +##type/outdoors/initial_gas_mix = ATMOSPHERE_USE_OUTDOORS; \ +##type/default/outdoors = null; \ +##type/default/initial_gas_mix = ATMOSPHERE_USE_AREA; \ +##type/overhang/outdoors = FALSE; \ +##type/overhand/initial_gas_mix = ATMOSPHERE_USE_OUTDOORS; diff --git a/code/controllers/master.dm b/code/controllers/master.dm index 0dbdf1d8117..fe493387352 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -11,7 +11,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new //THIS IS THE INIT ORDER -//Master -> SSPreInit -> GLOB -> world -> config -> SSInit -> Failsafe +//Master -> SSPreInit -> GLOB -> SSSetup() -> world -> config -> SSInit -> Failsafe //GOT IT MEMORIZED? /datum/controller/master @@ -72,6 +72,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new random_seed = (TEST_RUN_PARAMETER in world.params) ? 29051994 : rand(1, 1e9) rand_seed(random_seed) + // 2. create subsystems var/list/_subsystems = list() subsystems = _subsystems if (Master != src) @@ -82,12 +83,26 @@ GLOBAL_REAL(Master, /datum/controller/master) = new var/list/subsytem_types = subtypesof(/datum/controller/subsystem) tim_sort(subsytem_types, /proc/cmp_subsystem_init) for(var/I in subsytem_types) - _subsystems += new I + var/datum/controller/subsystem/S = new I + _subsystems += S Master = src + // 2. call PreInit() on all subsystems + // we iterate on _subsystems because if we Recover(), we don't make any subsystems into _subsystems, + // as we instead have the old subsystems added to our normal subsystems list. + for(var/datum/controller/subsystem/S in _subsystems) + S.PreInit(FALSE) + + // 3. set up globals if(!GLOB) new /datum/controller/global_vars + // 4. call Preload() on all subsystems + // we iterate on _subsystems because if we Recover(), we don't make any subsystems into _subsystems, + // as we instead have the old subsystems added to our normal subsystems list. + for(var/datum/controller/subsystem/S in _subsystems) + S.Preload(FALSE) + /datum/controller/master/Destroy() ..() // Tell qdel() to Del() this object. diff --git a/code/controllers/subsystem.dm b/code/controllers/subsystem.dm index 8eb9d1dc0aa..75327deece5 100644 --- a/code/controllers/subsystem.dm +++ b/code/controllers/subsystem.dm @@ -92,10 +92,30 @@ //Do not override ///datum/controller/subsystem/New() -// Used to initialize the subsystem BEFORE the map has loaded -// Called AFTER Recover if that is called -// Prefer to use Initialize if possible -/datum/controller/subsystem/proc/PreInit() +/** + * Called before global vars are initialized + * Called before Recover() + * + * ! Warning: Old subsystem won't be cleaned up yet if recovering, + * ! be sure to reference us normally and not with SSname. pattern, + * ! unless you are doing it on purpose. + * + * ? Prefer Initialize() where possible, don't put anything laggy in here please. + */ +/datum/controller/subsystem/proc/PreInit(recovering) + return + +/** + * Called after global vars are initialized + * Called before Recover() + * + * ! Warning: Old subsystem won't be cleaned up yet if recovering, + * ! be sure to reference us normally and not with SSname. pattern, + * ! unless you are doing it on purpose. + * + * ? Prefer Initialize() where possible, don't put anything laggy in here please. + */ +/datum/controller/subsystem/proc/Preload(recovering) return /// This is used so the mc knows when the subsystem sleeps. do not override. @@ -272,6 +292,7 @@ //usually called via datum/controller/subsystem/New() when replacing a subsystem (i.e. due to a recurring crash) //should attempt to salvage what it can from the old instance of subsystem /datum/controller/subsystem/Recover() + return /datum/controller/subsystem/vv_edit_var(var_name, var_value) switch (var_name) diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm index 18d394865bb..c1c195b3eef 100644 --- a/code/controllers/subsystem/air.dm +++ b/code/controllers/subsystem/air.dm @@ -17,6 +17,8 @@ SUBSYSTEM_DEF(air) /// Associative id = datum list of generated /datum/atmosphere's. var/list/generated_atmospheres + /// cached lists of unpacked gas-strings + var/list/cached_strings var/cost_turfs = 0 var/cost_edges = 0 @@ -33,9 +35,21 @@ SUBSYSTEM_DEF(air) // This is used to tell Travis WHERE the edges are. var/list/startup_active_edge_log = list() -/datum/controller/subsystem/air/PreInit() +/datum/controller/subsystem/air/PreInit(recovering) air_master = src +/datum/controller/subsystem/air/Preload(recovering) + cached_strings = list() + generate_atmospheres() + +/datum/controller/subsystem/air/Recover() + // Preload() already generated stock ones + if(islist(SSair?.generated_atmospheres)) + for(var/id in SSair.generated_atmospheres) + if(generated_atmospheres[id]) + continue + generated_atmospheres[id] = SSair.generated_atmospheres[id] + /datum/controller/subsystem/air/Initialize(timeofday) #ifndef FASTBOOT_DISABLE_ZONES report_progress("Processing Geometry...") @@ -294,6 +308,8 @@ SUBSYSTEM_DEF(air) * Initializes all subtypes of /datum/atmosphere and indexes them by key. */ /datum/controller/subsystem/air/proc/generate_atmospheres() + // todo: pretty world init progress reporter for everyone + report_progress("SSair: Generating atmospheres...") generated_atmospheres = list() for(var/T in subtypesof(/datum/atmosphere)) var/datum/atmosphere/A = T @@ -303,18 +319,48 @@ SUBSYSTEM_DEF(air) generated_atmospheres[A.id] = A /** - * Preprocess a gas string, replacing it with a specific atmosphere's if necessary. - */ -/datum/controller/subsystem/air/proc/preprocess_gas_string(gas_string, turf/T) - if(!generated_atmospheres) - generate_atmospheres() - if(gas_string == ATMOSPHERE_ID_USE_ZTRAIT) - gas_string = SSmapping.level_trait(T.z, ZTRAIT_DEFAULT_ATMOS) || GAS_STRING_VACUUM - gas_string = "[gas_string]" - if(!generated_atmospheres[gas_string]) - return gas_string - var/datum/atmosphere/mix = generated_atmospheres[gas_string] - return mix.gas_string + * parses a gas string + * returns list(gas list, temp) + * + * @params + * - gas_string - gas string + * - turf_context - turf location + */ +/datum/controller/subsystem/air/proc/_parse_gas_string(gas_string, turf/turf_context) + // 1. check if area + if(gas_string == ATMOSPHERE_USE_AREA) + var/area/A = turf_context.loc + gas_string = A.initial_gas_mix + // 2. check if it's special and should look up the level's defaults + switch(gas_string) + if(ATMOSPHERE_USE_INDOORS) + gas_string = GAS_STRING_STP + if(ATMOSPHERE_USE_OUTDOORS) + gas_string = SSmapping.level_trait(turf_context.z, ZTRAIT_DEFAULT_ATMOS) || GAS_STRING_VACUUM + // 3: process atmosphere + if(generated_atmospheres[gas_string]) + var/datum/atmosphere/A = generated_atmospheres[gas_string] + gas_string = A.gas_string + . = cached_strings[gas_string] + if(.) + return + return (cached_strings[gas_string] = unpack_gas_string(gas_string)) + +/datum/controller/subsystem/air/proc/unpack_gas_string(gas_string) + var/list/built = new /list(2) + var/list/unpacked = params2list(gas_string) + var/list/gases = list() + built[2] = text2num(unpacked["TEMP"]) // null allowed + unpacked -= "TEMP" + // convert id to path + // todo: remove when we convert gas to ids and not paths why did we ever make it paths aough + for(var/i in 1 to length(unpacked)) + var/id = unpacked[i] + var/amount = text2num(unpacked[id]) + var/path = GLOB.meta_gas_id_lookup[id] + gases[path] = amount + built[1] = gases + return built #undef SSAIR_TURFS #undef SSAIR_EDGES diff --git a/code/controllers/subsystem/emergency_shuttle.dm b/code/controllers/subsystem/emergency_shuttle.dm index cb6a9561235..b0281a37a2c 100644 --- a/code/controllers/subsystem/emergency_shuttle.dm +++ b/code/controllers/subsystem/emergency_shuttle.dm @@ -20,7 +20,7 @@ SUBSYSTEM_DEF(emergencyshuttle) var/datum/legacy_announcement/priority/emergency_shuttle_called = new(0, new_sound = sound('sound/AI/shuttlecalled.ogg')) var/datum/legacy_announcement/priority/emergency_shuttle_recalled = new(0, new_sound = sound('sound/AI/shuttlerecalled.ogg')) -/datum/controller/subsystem/emergencyshuttle/PreInit() +/datum/controller/subsystem/emergencyshuttle/PreInit(recovering) escape_pods = list() /datum/controller/subsystem/emergencyshuttle/fire() diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm index be10dfb040c..26ebc6b3ac6 100644 --- a/code/controllers/subsystem/events.dm +++ b/code/controllers/subsystem/events.dm @@ -16,7 +16,7 @@ SUBSYSTEM_DEF(events) var/datum/event_meta/new_event = new -/datum/controller/subsystem/events/PreInit() +/datum/controller/subsystem/events/PreInit(recovering) // unfortunately, character setup server startup hooks fire before /Initialize so :/ // SScharactersetup but not shit when :) InitializeHolidays(force = TRUE) diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index 9d315624890..4f5a148d17e 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -29,7 +29,7 @@ SUBSYSTEM_DEF(garbage) #endif -/datum/controller/subsystem/garbage/PreInit() +/datum/controller/subsystem/garbage/PreInit(recovering) queues = new(GC_QUEUE_COUNT) pass_counts = new(GC_QUEUE_COUNT) fail_counts = new(GC_QUEUE_COUNT) diff --git a/code/controllers/subsystem/mapping/obfuscation.dm b/code/controllers/subsystem/mapping/obfuscation.dm index f6080ab817c..3cdea674efa 100644 --- a/code/controllers/subsystem/mapping/obfuscation.dm +++ b/code/controllers/subsystem/mapping/obfuscation.dm @@ -7,7 +7,7 @@ /// "secret" key var/obfuscation_secret -/datum/controller/subsystem/mapping/PreInit() +/datum/controller/subsystem/mapping/PreInit(recovering) . = ..() if(!obfuscation_secret) obfuscation_secret = md5(GUID()) diff --git a/code/controllers/subsystem/overlays.dm b/code/controllers/subsystem/overlays.dm index 1e911549285..45c0c117ffe 100644 --- a/code/controllers/subsystem/overlays.dm +++ b/code/controllers/subsystem/overlays.dm @@ -8,7 +8,7 @@ SUBSYSTEM_DEF(overlays) var/list/queue // Queue of atoms needing overlay compiling (TODO-VERIFY!) var/list/stats -/datum/controller/subsystem/overlays/PreInit() +/datum/controller/subsystem/overlays/PreInit(recovering) queue = list() stats = list() diff --git a/code/controllers/subsystem/processing/chemistry.dm b/code/controllers/subsystem/processing/chemistry.dm index 9a10c3c2f83..7cc072d8505 100644 --- a/code/controllers/subsystem/processing/chemistry.dm +++ b/code/controllers/subsystem/processing/chemistry.dm @@ -12,7 +12,7 @@ PROCESSING_SUBSYSTEM_DEF(chemistry) chemical_reagents = SSchemistry.chemical_reagents // honestly hate that we have to do this but some things INITIALIZE_IMMEDIATE so uh fuck me I guess! -/datum/controller/subsystem/processing/chemistry/PreInit() +/datum/controller/subsystem/processing/chemistry/PreInit(recovering) initialize_chemical_reactions() initialize_chemical_reagents() return ..() diff --git a/code/controllers/subsystem/tgui.dm b/code/controllers/subsystem/tgui.dm index 4e8f0b84976..6013064d9c2 100644 --- a/code/controllers/subsystem/tgui.dm +++ b/code/controllers/subsystem/tgui.dm @@ -26,7 +26,7 @@ SUBSYSTEM_DEF(tgui) /// The HTML base used for all UIs. var/basehtml -/datum/controller/subsystem/tgui/PreInit() +/datum/controller/subsystem/tgui/PreInit(recovering) basehtml = file2text('tgui/public/tgui.html') // Inject inline polyfills var/polyfill = file2text('tgui/public/tgui-polyfill.min.js') diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm index 33e16550148..911649f912e 100644 --- a/code/controllers/subsystem/timer.dm +++ b/code/controllers/subsystem/timer.dm @@ -61,7 +61,7 @@ SUBSYSTEM_DEF(timer) var/log_all_loop_flagged = FALSE #endif -/datum/controller/subsystem/timer/PreInit() +/datum/controller/subsystem/timer/PreInit(recovering) bucket_list.len = BUCKET_LEN head_offset = world.time bucket_resolution = world.tick_lag diff --git a/code/game/area/area.dm b/code/game/area/area.dm index 66835f030fc..f0ad3676a25 100644 --- a/code/game/area/area.dm +++ b/code/game/area/area.dm @@ -4,20 +4,38 @@ * A grouping of tiles into a logical space, mostly used by map editors */ /area - /// area flags - var/area_flags = NONE - - var/fire = null - var/atmos = 1 - var/atmosalm = 0 - var/poweralm = 1 - var/party = null level = null name = "Unknown" icon = 'icons/turf/areas.dmi' icon_state = "unknown" plane = ABOVE_LIGHTING_PLANE //In case we color them - mouse_opacity = 0 + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + + //! intrinsics + /// area flags + var/area_flags = NONE + /// stores the next uid to use + var/global/global_uid = 0 + /// our uid + var/uid + /** + * If false, loading multiple maps with this area type will create multiple instances. + * This is not a flag because you probably should not be touching this at runtime! + */ + var/unique = TRUE + + //! defaults + /// outdoors by default? + var/initial_outdoors = FALSE + /// default initial gas mix + var/initial_gas_mix = GAS_STRING_STP + + //! unsorted + var/fire = null + var/atmos = 1 + var/atmosalm = 0 + var/poweralm = 1 + var/party = null var/lightswitch = 1 var/eject = null @@ -55,7 +73,6 @@ var/has_gravity = TRUE var/obj/machinery/power/apc/apc = null - var/no_air = null // var/list/lights // list of all lights on this area var/list/all_doors = null //Added by Strumpetplaya - Alarm Change - Contains a list of doors adjacent to this area var/list/all_arfgs = null //Similar, but a list of all arfgs adjacent to this area @@ -66,11 +83,6 @@ var/list/forced_ambience = null /// Used to decide what kind of reverb the area makes sound have var/sound_env = STANDARD_STATION - var/global/global_uid = 0 - var/uid - - /// If false, loading multiple maps with this area type will create multiple instances. - var/unique = TRUE /// Color on minimaps, if it's null (which is default) it makes one at random. var/minimap_color diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index 25967906201..f888ba661d3 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -206,7 +206,7 @@ GLOBAL_LIST_INIT(multiz_hole_baseturfs, typecacheof(list( // reset air if(!air) air = new /datum/gas_mixture(CELL_VOLUME) - air.parse_gas_string(initial_gas_mix) + air.parse_gas_string(initial_gas_mix, src) /// Take off the top layer turf and replace it with the next baseturf down /turf/proc/ScrapeAway(amount=1, flags) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 0232d9ec904..7ee13a43a67 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -11,10 +11,26 @@ var/holy = 0 - // Atmospherics / ZAS Environmental - /// Initial air contents, as a specially formatted gas string. + //! atmospherics + /** + * the gas we start out as + * can be: + * - a gas string (will be parsed) + * - an atmosphere id (use defines please) + */ var/initial_gas_mix = GAS_STRING_TURF_DEFAULT - // End + //! outdoors + /** + * are we considered outdoors for things like weather effects? + * todo: single var doing this is inefficient & bad, flags maybe? + * todo: we aren't going to touch this for a while tbh + * + * possible values: + * TRUE - as it implies + * FALSE - as it implies + * null - use area default + */ + var/outdoors = FALSE // Properties for airtight tiles (/wall) var/thermal_conductivity = 0.05 @@ -62,9 +78,6 @@ var/list/footstep_sounds = null - // Outdoors var determines if the game should consider the turf to be 'outdoors', which controls certain things such as weather effects. - var/outdoors = FALSE - /// If true, most forms of teleporting to or from this turf tile will fail. var/block_tele = FALSE /// Used for things like RCDs (and maybe lattices/floor tiles in the future), to see if a floor should replace it. @@ -124,6 +137,9 @@ if(movement_cost && pathweight == 1) // This updates pathweight automatically. pathweight = movement_cost + if(isnull(outdoors)) + outdoors = A.initial_outdoors + return INITIALIZE_HINT_NORMAL /turf/Destroy(force) diff --git a/code/modules/atmospherics/atmosphere/_atmosphere.dm b/code/modules/atmospherics/atmosphere/_atmosphere.dm index de786291f48..abcbc650df5 100644 --- a/code/modules/atmospherics/atmosphere/_atmosphere.dm +++ b/code/modules/atmospherics/atmosphere/_atmosphere.dm @@ -6,6 +6,7 @@ var/gas_string /// Unique ID. MUST be different for every atmosphere! Defaults to typepath. var/id + // todo: allow id to be set but still allow typepath lookup /// A list of gases to always have. Associative gas datum typepath:mols var/list/base_gases @@ -30,7 +31,7 @@ /datum/atmosphere/New() if(!id) - id = "[type]" + id = type generate_gas_string() /datum/atmosphere/proc/generate_gas_string() diff --git a/code/modules/atmospherics/environmental/public.dm b/code/modules/atmospherics/environmental/public.dm index ea9915fa9bd..ec8171bb6a2 100644 --- a/code/modules/atmospherics/environmental/public.dm +++ b/code/modules/atmospherics/environmental/public.dm @@ -23,7 +23,7 @@ */ /turf/proc/spawn_air(gas_string) var/datum/gas_mixture/G = new - G.parse_gas_string(gas_string) + G.parse_gas_string(gas_string, src) assume_air(G) /** diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index cd0e350bf99..09234524b49 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -413,7 +413,7 @@ * Sets our gas/temperature equal to a turf's initial gas mix. */ /datum/gas_mixture/proc/copy_from_turf(turf/model) - parse_gas_string(model.initial_gas_mix) + parse_gas_string(model.initial_gas_mix, model) //acounts for changes in temperature var/turf/model_parent = model.parent_type @@ -464,24 +464,20 @@ // todo: sort above //! Gas Strings - /** * Copies from a specially formatted gas string, taking on its gas values as our own as well as their temperature. + * if the gas string does not specify temperature, it'll remain unchanged. + * + * @params + * - gas_string - gas string, atmosphere, etc + * - turf_context - required for the special atmospheres to look up what zlevel it is */ -/datum/gas_mixture/proc/parse_gas_string(gas_string) - gas_string = SSair.preprocess_gas_string(gas_string) - var/list/gases = src.gas - var/list/gas = params2list(gas_string) - if(gas["TEMP"]) - temperature = text2num(gas["TEMP"]) - gas -= "TEMP" - gases.Cut() - for(var/id in gas) - var/path = id - if(!ispath(path)) - path = gas_id2path(path) //a lot of these strings can't have embedded expressions (especially for mappers), so support for IDs needs to stick around - gases[path] = text2num(gas[id]) - //archive() +/datum/gas_mixture/proc/parse_gas_string(gas_string, turf/turf_context) + var/list/parsed = SSair._parse_gas_string(gas_string, turf_context) + gas = parsed[1] + gas = gas.Copy() // why? because we don't want to fuck with cached list. + if(parsed[2]) + temperature = parsed[2] update_values() return TRUE @@ -578,7 +574,7 @@ // update update_values() other.update_values() - + // if empty if(!total_moles) return compare(other) @@ -643,7 +639,7 @@ // update update_values() - + if(!total_moles) return compare_virtual(gases, src.volume, temperature) diff --git a/maps/~map_system/maps.dm b/maps/~map_system/maps.dm index 1b4debd169b..b644dea06c9 100644 --- a/maps/~map_system/maps.dm +++ b/maps/~map_system/maps.dm @@ -262,6 +262,7 @@ var/list/all_maps = list() var/name // Friendly name of the zlevel var/flags = 0 // Bitflag of which *_levels lists this z should be put into. var/turf/base_turf = /turf/space // Type path of the base turf for this z + var/transit_chance = 0 // Percentile chance this z will be chosen for map-edge space transit. // Holomaps