diff --git a/aurorastation.dme b/aurorastation.dme index 297599441b0..6225f16ea0b 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -100,6 +100,7 @@ #include "code\__DEFINES\ruin_tags.dm" #include "code\__DEFINES\rust_g.dm" #include "code\__DEFINES\rust_g_debug.dm" +#include "code\__DEFINES\rust_g_overrides.dm" #include "code\__DEFINES\ship_weapons.dm" #include "code\__DEFINES\shuttle.dm" #include "code\__DEFINES\singletons.dm" @@ -134,6 +135,7 @@ #include "code\__DEFINES\dcs\signals.dm" #include "code\__DEFINES\dcs\signals\signals_datum.dm" #include "code\__DEFINES\dcs\signals\signals_global.dm" +#include "code\__DEFINES\dcs\signals\signals_lore_radio.dm" #include "code\__DEFINES\dcs\signals\signals_record.dm" #include "code\__DEFINES\dcs\signals\signals_spatial_grid.dm" #include "code\__DEFINES\dcs\signals\signals_subsystem.dm" @@ -165,6 +167,7 @@ #include "code\__HELPERS\overlay.dm" #include "code\__HELPERS\overmap.dm" #include "code\__HELPERS\qdel.dm" +#include "code\__HELPERS\ref.dm" #include "code\__HELPERS\sanitize_values.dm" #include "code\__HELPERS\shell.dm" #include "code\__HELPERS\smart_token_bucket.dm" @@ -1012,6 +1015,7 @@ #include "code\game\objects\items\ipc_overloaders.dm" #include "code\game\objects\items\items_icon.dm" #include "code\game\objects\items\knitting.dm" +#include "code\game\objects\items\lore_radio.dm" #include "code\game\objects\items\paintkit.dm" #include "code\game\objects\items\recharger_backpack.dm" #include "code\game\objects\items\shooting_range.dm" @@ -1608,11 +1612,11 @@ #include "code\modules\background\religion\unathi.dm" #include "code\modules\background\religion\vaurca.dm" #include "code\modules\background\space_sectors\badlands.dm" -#include "code\modules\background\space_sectors\coalition.dm" #include "code\modules\background\space_sectors\generic_sectors.dm" #include "code\modules\background\space_sectors\space_sector.dm" #include "code\modules\background\space_sectors\tauceti.dm" #include "code\modules\background\space_sectors\void.dm" +#include "code\modules\background\space_sectors\coalition\coalition.dm" #include "code\modules\balloon_alert\balloon_alert.dm" #include "code\modules\battlemonsters\datum_core.dm" #include "code\modules\battlemonsters\datum_elements.dm" @@ -1877,6 +1881,7 @@ #include "code\modules\clothing\under\accessories\lockets.dm" #include "code\modules\clothing\under\accessories\medal.dm" #include "code\modules\clothing\under\accessories\necklace.dm" +#include "code\modules\clothing\under\accessories\religious.dm" #include "code\modules\clothing\under\accessories\shirts.dm" #include "code\modules\clothing\under\accessories\storage.dm" #include "code\modules\clothing\under\accessories\temperature.dm" @@ -2864,7 +2869,8 @@ #include "code\modules\overmap\exoplanets\decor\flora\jungle.dm" #include "code\modules\overmap\exoplanets\decor\flora\konyang.dm" #include "code\modules\overmap\exoplanets\decor\flora\marsh.dm" -#include "code\modules\overmap\exoplanets\decor\flora\potted.dm" +#include "code\modules\overmap\exoplanets\decor\flora\potted_big.dm" +#include "code\modules\overmap\exoplanets\decor\flora\potted_small.dm" #include "code\modules\overmap\exoplanets\decor\flora\snow.dm" #include "code\modules\overmap\exoplanets\decor\objs\clearing.dm" #include "code\modules\overmap\exoplanets\decor\objs\monolith.dm" @@ -3466,6 +3472,7 @@ #include "code\modules\tgui\states\deep_inventory.dm" #include "code\modules\tgui\states\default.dm" #include "code\modules\tgui\states\hands.dm" +#include "code\modules\tgui\states\heavy_vehicle.dm" #include "code\modules\tgui\states\human_adjacent.dm" #include "code\modules\tgui\states\human_adjacent_loc.dm" #include "code\modules\tgui\states\inventory.dm" @@ -3546,6 +3553,7 @@ #include "code\unit_tests\species_tests.dm" #include "code\unit_tests\sql_tests.dm" #include "code\unit_tests\ss_test.dm" +#include "code\unit_tests\stairs_type.dm" #include "code\unit_tests\subsystem_init.dm" #include "code\unit_tests\timer_sanity.dm" #include "code\unit_tests\unit_test.dm" diff --git a/code/__DEFINES/_flags.dm b/code/__DEFINES/_flags.dm index 66b392d7753..cdcaaf21c3d 100644 --- a/code/__DEFINES/_flags.dm +++ b/code/__DEFINES/_flags.dm @@ -3,5 +3,8 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768)) +// for /datum/var/datum_flags +#define DF_USE_TAG (1<<0) + ///Whether /atom/Initialize() has already run for the object #define INITIALIZED_1 (1<<5) diff --git a/code/__DEFINES/dcs/signals/signals_lore_radio.dm b/code/__DEFINES/dcs/signals/signals_lore_radio.dm new file mode 100644 index 00000000000..bb2b5670b81 --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_lore_radio.dm @@ -0,0 +1,4 @@ +// Signals related to lore radios, also known as analog radios +// Sent from space_sector.dm + +#define COMSIG_GLOB_LORE_RADIO_BROADCAST "!lore_radio_broadcast" diff --git a/code/__DEFINES/global.dm b/code/__DEFINES/global.dm index 4f3c913b040..9443eda8f86 100644 --- a/code/__DEFINES/global.dm +++ b/code/__DEFINES/global.dm @@ -65,6 +65,8 @@ GLOBAL_LIST_EMPTY(reg_dna) GLOBAL_DATUM(newplayer_start, /turf) +GLOBAL_DATUM(lobby_mobs_location, /turf) + //Spawnpoints. GLOBAL_LIST_EMPTY(latejoin) GLOBAL_LIST_EMPTY(latejoin_gateway) diff --git a/code/__DEFINES/jobs.dm b/code/__DEFINES/jobs.dm index 5daa3c63ab8..4ae3cf33702 100644 --- a/code/__DEFINES/jobs.dm +++ b/code/__DEFINES/jobs.dm @@ -8,7 +8,6 @@ #define CONSULAR_ROLE /datum/job/consular #define JOURNALIST_ROLE /datum/job/journalist #define CHAPLAIN_ROLE /datum/job/chaplain -#define ASSISTANT_ROLE /datum/job/assistant //Event Roles //Used for generic department jobs for off-ship events @@ -48,4 +47,4 @@ #define ZENG_ROLES list(SCIENCE_ROLES, MEDICAL_ROLES, CIVILIAN_ROLES, REPRESENTATIVE_ROLE) #define HEPH_ROLES list(OPERATIONS_ROLES, ENGINEERING_ROLES, CIVILIAN_ROLES, REPRESENTATIVE_ROLE) #define ORION_ROLES list(OPERATIONS_ROLES, CIVILIAN_ROLES, REPRESENTATIVE_ROLE, SERVICE_ROLES) -#define INDEP_ROLES list(NON_CREW_CIVILIAN_ROLES, CONSULAR_ROLE, CHAPLAIN_ROLE, OFF_DUTY_CREW_MEMBER_ROLE, JOURNALIST_ROLE, ASSISTANT_ROLE) +#define INDEP_ROLES list(NON_CREW_CIVILIAN_ROLES, CONSULAR_ROLE, CHAPLAIN_ROLE, OFF_DUTY_CREW_MEMBER_ROLE, JOURNALIST_ROLE) diff --git a/code/__DEFINES/rust_g_overrides.dm b/code/__DEFINES/rust_g_overrides.dm new file mode 100644 index 00000000000..57de7d96acd --- /dev/null +++ b/code/__DEFINES/rust_g_overrides.dm @@ -0,0 +1,3 @@ +// RUSTG_OVERRIDE_BUILTINS is not used since the file APIs don't work well over Linux. +#define url_encode(text) rustg_url_encode("[text]") +#define url_decode(text) rustg_url_decode("[text]") diff --git a/code/__DEFINES/subsystem-priority.dm b/code/__DEFINES/subsystem-priority.dm index 25690cfd3aa..1e7ac02b016 100644 --- a/code/__DEFINES/subsystem-priority.dm +++ b/code/__DEFINES/subsystem-priority.dm @@ -4,37 +4,13 @@ THAT ARE PRESENT THERE */ -#define SS_INIT_PERSISTENT_CONFIG 26 -#define SS_INIT_MISC_FIRST 25 -#define SS_INIT_SEEDS 24 // Plant controller setup. -#define SS_INIT_MAPLOAD 22 // DMM parsing and load. Unless you know what you're doing, make sure this remains first. -#define SS_INIT_JOBS 21 -#define SS_INIT_MAPFINALIZE 20 // Asteroid generation. -#define SS_INIT_PARALLAX 19 // Parallax image cache generation. Must run before ghosts are able to join -#define SS_INIT_ATOMS 17 // World initialization. Will trigger lighting updates. Observers can join after this loads. -#define SS_INIT_ASSETS 16 // Assets subsystem setup. -#define SS_INIT_POWER 15 // Initial powernet build. -#define SS_INIT_ECONOMY 14 // Cargo needs economy set up #define SS_INIT_CARGO 13 // Random warehouse generation. Runs after SSatoms because it assumes objects are initialized when it runs. #define SS_INIT_PIPENET 12 // Initial pipenet build. -#define SS_INIT_MACHINERY 11 // Machinery prune and powernet build. -#define SS_INIT_AIR 10 // Air setup and pre-bake. #define SS_INIT_NIGHT 9 // Nightmode controller. Will trigger lighting updates. -#define SS_INIT_SMOOTHING 8 // Object icon smoothing. Creates overlays. -#define SS_INIT_ICON_UPDATE 7 // Icon update queue flush. Should run before overlays. #define SS_INIT_AO 6 // Wall AO neighbour build. -#define SS_INIT_OVERLAY 5 // Overlay flush. -#define SS_INIT_AWAY_MAPS 4 // Note: away maps (ruins, exoplanets, ...) must initialize before ghost roles in order for their spawnpoints to work. -#define SS_INIT_GHOSTROLES 3 // Ghost roles must initialize before SS_INIT_MISC due to some roles (matriarch drones) relying on the assumption that this SS is initialized. -#define SS_INIT_MISC 2 // Subsystems without an explicitly set initialization order start here. #define SS_INIT_SUNLIGHT 1 // Sunlight setup. Creates lots of lighting & SSzcopy updates. -#define SS_INIT_LIGHTING 0 // Generation of lighting overlays and pre-bake. May cause openturf updates, should initialize before SSzcopy. -#define SS_INIT_ZCOPY -1 // Z-mimic flush. Should run after SSoverlay & SSicon_smooth so it copies the smoothed sprites. #define SS_INIT_XENOARCH -2 // Xenoarch is this far below because it can infinite loop if placed in SS_INIT_MISC as it was before, due to some subsystems spawning stuff there. #define SS_INIT_HOLOMAP -4 // Minimap subsystem. Should be initialized after all maps, away sites, ships, planets, etc. -#define SS_INIT_LOBBY -5 // Lobby timer starts here. The lobby timer won't actually start going down until the MC starts ticking, so you probably want this last -#define SS_INIT_PING -6 // Pinger for the clients -#define SS_INIT_CHAT -7 // To ensure chat remains smooth during init. // Something to remember when setting priorities: SS_TICKER runs before Normal, which runs before SS_BACKGROUND. // Each group has its own priority bracket. @@ -58,14 +34,11 @@ #define SS_PRIORITY_TICKER 100 // Gameticker. //#define FIRE_PRIORITY_DEFAULT 50 // This is defined somewhere else. #define SS_PRIORITY_MOB 40 // Mob Life(). -#define SS_PRIORITY_ASSET 40 // Asset loading subsystem - not to be confused with SSassets. #define SS_PRIORITY_AIR 40 // ZAS processing. -#define SS_PRIORITY_CHAT 30 // Chat #define SS_PRIORITY_STATPANELS 25 // Statpanels. #define SS_PRIORITY_LIGHTING 25 // Queued lighting engine updates. #define SS_PRIORITY_MACHINERY 25 // Machinery + powernet ticks. #define SS_PRIORITY_NANOUI 25 // UI updates. -#define SS_PRIORITY_VOTE 20 #define SS_PRIORITY_ELECTRONICS 20 // Integrated Electronics processing. #define SS_PRIORITY_CALAMITY 20 // Singularity, Tesla, Nar'sie, blob, etc. #define SS_PRIORITY_EVENT 20 @@ -77,7 +50,6 @@ #define SS_PRIORITY_CHEMISTRY 10 // Multi-tick chemical reactions. #define SS_PRIORITY_SHUTTLE 10 // Shuttle movement. #define SS_PRIORITY_AIRFLOW 10 // Handles object movement due to ZAS airflow. -#define SS_PRIORITY_PING 10 #define SS_PRIORITY_ZCOPY 10 // Z-mimic icon generation/updates. #define SS_PRIORITY_ARRIVALS 10 // Centcomm arrivals shuttle auto-launch. Usually asleep. diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 97b58df60e5..05dcce4f866 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -196,18 +196,47 @@ // Subsystems shutdown in the reverse of the order they initialize in // The numbers just define the ordering, they are meaningless otherwise. +#define INIT_ORDER_PERSISTENT_CONFIGURATION 101 //Aurora snowflake conflg handling #define INIT_ORDER_PROFILER 101 #define INIT_ORDER_GARBAGE 99 +#define INIT_ORDER_DISCORD 78 +#define INIT_ORDER_JOBS 65 // Must init before atoms, to set up properly the dynamic job lists. +#define INIT_ORDER_TICKER 55 +#define INIT_ORDER_SEEDS 52 // More aurora snowflake, needs to load before the atoms init as it generates images for seeds that are used +#define INIT_ORDER_MISC_FIRST 51 //Another aurora snowflake system? Who would have guessed... Anyways, need to load before mapping or global HUDs are not ready when atoms request them +#define INIT_ORDER_MAPPING 50 //This is the ATLAS subsystem +#define INIT_ORDER_PARALLAX 49 // Parallax image cache generation. Must run before ghosts are able to join. Another aurora snowflake code, run after mapping or it runtimes +#define INIT_ORDER_EARLY_ASSETS 48 #define INIT_ORDER_SPATIAL_GRID 43 +#define INIT_ORDER_ECONOMY 40 +#define INIT_ORDER_MAPFINALIZE 31 //Asteroid generation, another aurora snowflake, must run before the atoms init +#define INIT_ORDER_ATOMS 30 +#define INIT_ORDER_MACHINES 20 +#define INIT_ORDER_DEFAULT 0 +#define INIT_ORDER_AIR -1 +#define INIT_ORDER_AWAY_MAPS -2 //Loading away sites and exoplanets, should start after air, must initialize before ghost roles in order for their spawnpoints to work +#define INIT_ORDER_GHOSTROLES -2.1 //Ghost roles must initialize before SS_INIT_MISC due to some roles (matriarch drones) relying on the assumption that this SS is initialized. +#define INIT_ORDER_MISC -2.2 //Aurora snowflake, Subsystems without an explicitly set initialization order start here #define INIT_ORDER_CODEX -3 // Codex subsystem. Should be initialized after chemistry and cooking recipes. +#define INIT_ORDER_VOTE -4 +#define INIT_ORDER_ASSETS -5 +#define INIT_ORDER_ICON_UPDATE -5.5 //Yet another aurora snowflake, Icon update queue flush. Should run before overlays, probably before smoothing the icon too +#define INIT_ORDER_ICON_SMOOTHING -6 +#define INIT_ORDER_OVERLAY -7 +#define INIT_ORDER_LIGHTING -20 +#define INIT_ORDER_ZCOPY -21 //Aurora snowflake, Z-mimic flush. Should run after SSoverlay & SSicon_smooth so it copies the smoothed sprites. #define INIT_ORDER_STATPANELS -97 +#define INIT_ORDER_CHAT -100 //Should be last to ensure chat remains smooth during init. // Subsystem fire priority, from lowest to highest priority // If the subsystem isn't listed here it's either DEFAULT or PROCESS (if it's a processing subsystem child) +#define FIRE_PRIORITY_PING 10 #define FIRE_PRIORITY_GARBAGE 15 +#define FIRE_PRIORITY_ASSETS 20 #define FIRE_PRIORITY_DEFAULT 50 #define FIRE_PRIORITY_STATPANEL 390 +#define FIRE_PRIORITY_CHAT 400 /* AURORA SHIT */ diff --git a/code/__HELPERS/ref.dm b/code/__HELPERS/ref.dm new file mode 100644 index 00000000000..365df03dc88 --- /dev/null +++ b/code/__HELPERS/ref.dm @@ -0,0 +1,15 @@ +/** + * \ref behaviour got changed in 512 so this is necesary to replicate old behaviour. + * If it ever becomes necesary to get a more performant REF(), this lies here in wait + * #define REF(thing) (thing && isdatum(thing) && (thing:datum_flags & DF_USE_TAG) && thing:tag ? "[thing:tag]" : text_ref(thing)) +**/ +/proc/REF(input) + if(isdatum(input)) + var/datum/thing = input + if(thing.datum_flags & DF_USE_TAG) + if(!thing.tag) + stack_trace("A ref was requested of an object with DF_USE_TAG set but no tag: [thing]") + thing.datum_flags &= ~DF_USE_TAG + else + return "\[[url_encode(thing.tag)]\]" + return text_ref(input) diff --git a/code/_onclick/hud/borer_hud.dm b/code/_onclick/hud/borer_hud.dm index 94dacd194e4..3ed2796680c 100644 --- a/code/_onclick/hud/borer_hud.dm +++ b/code/_onclick/hud/borer_hud.dm @@ -1,4 +1,4 @@ -/mob/living/simple_animal/borer/instantiate_hud(var/datum/hud/HUD) +/mob/living/simple_animal/borer/instantiate_hud(datum/hud/HUD) HUD.borer_hud() /datum/hud/proc/borer_hud() diff --git a/code/_onclick/hud/captive_brain_hud.dm b/code/_onclick/hud/captive_brain_hud.dm index 1f8922d74ce..60148589c21 100644 --- a/code/_onclick/hud/captive_brain_hud.dm +++ b/code/_onclick/hud/captive_brain_hud.dm @@ -1,4 +1,4 @@ -/mob/living/captive_brain/instantiate_hud(var/datum/hud/HUD) +/mob/living/captive_brain/instantiate_hud(datum/hud/HUD) HUD.captive_brain_hud() /datum/hud/proc/captive_brain_hud() diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 64a20ad5629..1a2fc6eff37 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -119,12 +119,23 @@ var/list/global_huds */ /datum/hud + ///The mob that possesses the HUD var/mob/mymob - var/hud_shown = 1 //Used for the HUD toggle (F12) - var/inventory_shown = 1 //the inventory - var/show_intent_icons = 0 - var/hotkey_ui_hidden = 0 //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons) + ///Boolean, if the HUD is shown, used for the HUD toggle (F12) + var/hud_shown = TRUE + + ///Boolean, if the inventory is shows + var/inventory_shown = TRUE + + ///Boolean, if the intent icons are shown + var/show_intent_icons = FALSE + + ///Boolean, this is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons) + var/hotkey_ui_hidden = FALSE + + ///Boolean, if the action buttons are hidden + var/action_buttons_hidden = FALSE var/obj/screen/lingchemdisplay var/obj/screen/instability_display //Technomancer. @@ -141,7 +152,6 @@ var/list/global_huds var/list/obj/screen/hotkeybuttons var/obj/screen/movable/action_button/hide_toggle/hide_actions_toggle - var/action_buttons_hidden = 0 /datum/hud/New(mob/owner) mymob = owner @@ -169,7 +179,9 @@ var/list/global_huds . = ..() /datum/hud/proc/hidden_inventory_update() - if(!mymob) return + if(!mymob) + return + if(ishuman(mymob)) var/mob/living/carbon/human/H = mymob for(var/gear_slot in H.species.hud.gear) @@ -289,16 +301,30 @@ var/list/global_huds H.r_store.screen_loc = null +/** + * Instantiate an HUD to the current mob that own is + */ /datum/hud/proc/instantiate() - if(!ismob(mymob)) return 0 - if(!mymob.client) return 0 + SHOULD_NOT_SLEEP(TRUE) + SHOULD_CALL_PARENT(FALSE) + + if(!ismob(mymob)) + stack_trace("HUD instantiation called on an HUD without a mob!") + return FALSE + + if(!(mymob.client)) + return FALSE + var/ui_style = ui_style2icon(mymob.client.prefs.UI_style) var/ui_color = mymob.client.prefs.UI_style_color var/ui_alpha = mymob.client.prefs.UI_style_alpha mymob.instantiate_hud(src, ui_style, ui_color, ui_alpha) -/mob/proc/instantiate_hud(var/datum/hud/HUD, var/ui_style, var/ui_color, var/ui_alpha) +/mob/proc/instantiate_hud(datum/hud/HUD, ui_style, ui_color, ui_alpha) + SHOULD_NOT_SLEEP(TRUE) + SHOULD_CALL_PARENT(FALSE) + return //Triggered when F12 is pressed (Unless someone changed something in the DMF) @@ -307,16 +333,19 @@ var/list/global_huds set hidden = 1 if(!hud_used) - to_chat(usr, "This mob type does not use a HUD.") + to_chat(usr, SPAN_WARNING("This mob type does not use a HUD.")) return if(!ishuman(src)) - to_chat(usr, "Inventory hiding is currently only supported for human mobs, sorry.") + to_chat(usr, SPAN_WARNING("Inventory hiding is currently only supported for human mobs.")) + return + + if(!client) return - if(!client) return if(client.view != world.view) return + if(hud_used.hud_shown) hud_used.hud_shown = 0 if(src.hud_used.adding) diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index fc2bea2a221..864a28e0b63 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/human/instantiate_hud(var/datum/hud/HUD, var/ui_style, var/ui_color, var/ui_alpha) +/mob/living/carbon/human/instantiate_hud(datum/hud/HUD, ui_style, ui_color, ui_alpha) HUD.human_hud(ui_style, ui_color, ui_alpha, src) /datum/hud/proc/human_hud(var/ui_style='icons/mob/screen/white.dmi', var/ui_color = "#ffffff", var/ui_alpha = 255, var/mob/living/carbon/human/target) diff --git a/code/_onclick/hud/morph.dm b/code/_onclick/hud/morph.dm index 5575d74e6be..61203779f2a 100644 --- a/code/_onclick/hud/morph.dm +++ b/code/_onclick/hud/morph.dm @@ -1,4 +1,4 @@ -/mob/living/simple_animal/hostile/morph/instantiate_hud(var/datum/hud/HUD) +/mob/living/simple_animal/hostile/morph/instantiate_hud(datum/hud/HUD) HUD.morph_hud() /datum/hud/proc/morph_hud() diff --git a/code/_onclick/hud/nymph_hud.dm b/code/_onclick/hud/nymph_hud.dm index a45dd59e4a7..d2c97f00fc1 100644 --- a/code/_onclick/hud/nymph_hud.dm +++ b/code/_onclick/hud/nymph_hud.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/alien/instantiate_hud(var/datum/hud/HUD) +/mob/living/carbon/alien/instantiate_hud(datum/hud/HUD) HUD.nymph_hud() /datum/hud/proc/nymph_hud() diff --git a/code/_onclick/hud/other_mobs.dm b/code/_onclick/hud/other_mobs.dm index 78f53f47d43..ec8eb462ef6 100644 --- a/code/_onclick/hud/other_mobs.dm +++ b/code/_onclick/hud/other_mobs.dm @@ -2,16 +2,16 @@ /datum/hud/proc/unplayer_hud() return -/mob/abstract/observer/instantiate_hud(var/datum/hud/HUD) +/mob/abstract/observer/instantiate_hud(datum/hud/HUD) HUD.ghost_hud() /datum/hud/proc/ghost_hud() return -/mob/living/carbon/brain/instantiate_hud(var/datum/hud/HUD) +/mob/living/carbon/brain/instantiate_hud(datum/hud/HUD) return -/mob/living/silicon/ai/instantiate_hud(var/datum/hud/HUD) +/mob/living/silicon/ai/instantiate_hud(datum/hud/HUD) HUD.ai_hud() /datum/hud/proc/blob_hud(ui_style = 'icons/mob/screen/midnight.dmi') @@ -32,7 +32,7 @@ mymob.client.screen += list(blobpwrdisplay, blobhealthdisplay) -/mob/living/carbon/slime/instantiate_hud(var/datum/hud/HUD) +/mob/living/carbon/slime/instantiate_hud(datum/hud/HUD) HUD.slime_hud() /datum/hud/proc/slime_hud(ui_style = 'icons/mob/screen/midnight.dmi') @@ -103,7 +103,7 @@ return -/mob/living/simple_animal/construct/instantiate_hud(var/datum/hud/HUD) +/mob/living/simple_animal/construct/instantiate_hud(datum/hud/HUD) HUD.construct_hud() /datum/hud/proc/construct_hud() diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index e2883576e04..c3eb5d39cba 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -1,6 +1,6 @@ var/obj/screen/robot_inventory -/mob/living/silicon/robot/instantiate_hud(var/datum/hud/HUD) +/mob/living/silicon/robot/instantiate_hud(datum/hud/HUD) HUD.robot_hud() /datum/hud/proc/robot_hud() diff --git a/code/controllers/master/subsystem.dm b/code/controllers/master/subsystem.dm index e51ab044d81..81251ef06ca 100644 --- a/code/controllers/master/subsystem.dm +++ b/code/controllers/master/subsystem.dm @@ -7,7 +7,7 @@ name = "fire coderbus" /// Order of initialization. Higher numbers are initialized first, lower numbers later. Use or create defines such as [INIT_ORDER_DEFAULT] so we can see the order in one file. - var/init_order = SS_INIT_MISC + var/init_order = INIT_ORDER_DEFAULT /// Time to wait (in deciseconds) between each call to fire(). Must be a positive integer. var/wait = 20 diff --git a/code/controllers/subsystems/air.dm b/code/controllers/subsystems/air.dm index a362f2b6720..402b1e8371e 100644 --- a/code/controllers/subsystems/air.dm +++ b/code/controllers/subsystems/air.dm @@ -64,7 +64,7 @@ Class Procs: SUBSYSTEM_DEF(air) name = "Air" priority = SS_PRIORITY_AIR - init_order = SS_INIT_AIR + init_order = INIT_ORDER_AIR flags = SS_POST_FIRE_TIMING runlevels = RUNLEVELS_PLAYING diff --git a/code/controllers/subsystems/alarm.dm b/code/controllers/subsystems/alarm.dm index 5c510f64c57..fc267e44357 100644 --- a/code/controllers/subsystems/alarm.dm +++ b/code/controllers/subsystems/alarm.dm @@ -6,7 +6,7 @@ SUBSYSTEM_DEF(alarm) name = "Alarms" - init_order = SS_INIT_MISC_FIRST + init_order = INIT_ORDER_MISC_FIRST priority = SS_PRIORITY_ALARMS runlevels = RUNLEVELS_PLAYING diff --git a/code/controllers/subsystems/asset_loading.dm b/code/controllers/subsystems/asset_loading.dm index dc7e1ba3734..2d2939de4b2 100644 --- a/code/controllers/subsystems/asset_loading.dm +++ b/code/controllers/subsystems/asset_loading.dm @@ -3,7 +3,7 @@ /// So this just serves to remove the requirement to load assets fully during init SUBSYSTEM_DEF(asset_loading) name = "Asset Loading" - priority = SS_PRIORITY_ASSET + priority = FIRE_PRIORITY_ASSETS flags = SS_NO_INIT runlevels = RUNLEVEL_LOBBY|RUNLEVELS_DEFAULT var/list/datum/asset/generate_queue = list() diff --git a/code/controllers/subsystems/assets.dm b/code/controllers/subsystems/assets.dm index d8f6095a339..70c49640a90 100644 --- a/code/controllers/subsystems/assets.dm +++ b/code/controllers/subsystems/assets.dm @@ -1,27 +1,27 @@ SUBSYSTEM_DEF(assets) name = "Assets" - init_order = SS_INIT_ASSETS + init_order = INIT_ORDER_ASSETS flags = SS_NO_FIRE - runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY var/list/datum/asset_cache_item/cache = list() var/list/preload = list() var/datum/asset_transport/transport = new() -/datum/controller/subsystem/assets/Initialize() +/datum/controller/subsystem/assets/OnConfigLoad() var/newtransporttype = /datum/asset_transport switch (GLOB.config.asset_transport) if ("webroot") newtransporttype = /datum/asset_transport/webroot if (newtransporttype == transport.type) - return SS_INIT_SUCCESS + return var/datum/asset_transport/newtransport = new newtransporttype () if (newtransport.validate_config()) transport = newtransport - transport.Load() + +/datum/controller/subsystem/assets/Initialize() for(var/type in typesof(/datum/asset)) var/datum/asset/A = type if (type != initial(A._abstract)) diff --git a/code/controllers/subsystems/battle_monsters.dm b/code/controllers/subsystems/battle_monsters.dm index a8494b2860c..a9914ecae16 100644 --- a/code/controllers/subsystems/battle_monsters.dm +++ b/code/controllers/subsystems/battle_monsters.dm @@ -6,7 +6,7 @@ SUBSYSTEM_DEF(battle_monsters) name = "Battle Monsters" - init_order = SS_INIT_MISC_FIRST + init_order = INIT_ORDER_MISC_FIRST flags = SS_NO_FIRE var/list/monster_elements diff --git a/code/controllers/subsystems/chat.dm b/code/controllers/subsystems/chat.dm index f4219b98b1d..d76ce698d6f 100644 --- a/code/controllers/subsystems/chat.dm +++ b/code/controllers/subsystems/chat.dm @@ -9,8 +9,8 @@ SUBSYSTEM_DEF(chat) name = "Chat" flags = SS_TICKER | SS_NO_INIT wait = 1 - priority = SS_PRIORITY_CHAT - init_order = SS_INIT_CHAT + priority = FIRE_PRIORITY_CHAT + init_order = INIT_ORDER_CHAT var/list/payload_by_client = list() diff --git a/code/controllers/subsystems/chemistry.dm b/code/controllers/subsystems/chemistry.dm index 4b347f09563..3dbcb08ff52 100644 --- a/code/controllers/subsystems/chemistry.dm +++ b/code/controllers/subsystems/chemistry.dm @@ -1,7 +1,7 @@ SUBSYSTEM_DEF(chemistry) name = "Chemistry" priority = SS_PRIORITY_CHEMISTRY - init_order = SS_INIT_MISC_FIRST + init_order = INIT_ORDER_MISC_FIRST runlevels = RUNLEVELS_PLAYING init_stage = INITSTAGE_EARLY diff --git a/code/controllers/subsystems/discord.dm b/code/controllers/subsystems/discord.dm index fe31ee3654b..2190767bc8f 100644 --- a/code/controllers/subsystems/discord.dm +++ b/code/controllers/subsystems/discord.dm @@ -16,7 +16,7 @@ SUBSYSTEM_DEF(discord) name = "Discord" - init_order = SS_INIT_MISC_FIRST + init_order = INIT_ORDER_DISCORD flags = SS_NO_FIRE | SS_NO_DISPLAY var/list/channels_to_group = list() // Group flag -> list of channel datums map. diff --git a/code/controllers/subsystems/documents.dm b/code/controllers/subsystems/documents.dm index da497a10ed9..18892849291 100644 --- a/code/controllers/subsystems/documents.dm +++ b/code/controllers/subsystems/documents.dm @@ -2,7 +2,7 @@ SUBSYSTEM_DEF(docs) name = "Documents" wait = 30 SECONDS flags = SS_NO_FIRE - init_order = SS_INIT_MISC_FIRST + init_order = INIT_ORDER_MISC_FIRST var/total_docs = 0 var/list/docs = list() diff --git a/code/controllers/subsystems/economy.dm b/code/controllers/subsystems/economy.dm index 627af979c19..2b49f579e95 100644 --- a/code/controllers/subsystems/economy.dm +++ b/code/controllers/subsystems/economy.dm @@ -2,7 +2,7 @@ SUBSYSTEM_DEF(economy) name = "Economy" wait = 30 SECONDS flags = SS_NO_FIRE - init_order = SS_INIT_ECONOMY + init_order = INIT_ORDER_ECONOMY var/datum/money_account/station_account var/list/department_accounts = list() var/list/all_money_accounts = list() diff --git a/code/controllers/subsystems/fail2topic.dm b/code/controllers/subsystems/fail2topic.dm index 32d13282bde..e1e0f9769fb 100644 --- a/code/controllers/subsystems/fail2topic.dm +++ b/code/controllers/subsystems/fail2topic.dm @@ -1,6 +1,6 @@ SUBSYSTEM_DEF(fail2topic) name = "Fail2Topic" - init_order = SS_INIT_MISC_FIRST + init_order = INIT_ORDER_MISC_FIRST flags = SS_BACKGROUND runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY | RUNLEVEL_INIT diff --git a/code/controllers/subsystems/ghostroles.dm b/code/controllers/subsystems/ghostroles.dm index 793d6b7d2cf..9af6bde3f65 100644 --- a/code/controllers/subsystems/ghostroles.dm +++ b/code/controllers/subsystems/ghostroles.dm @@ -1,7 +1,7 @@ SUBSYSTEM_DEF(ghostroles) name = "Ghost Roles" flags = SS_NO_FIRE - init_order = SS_INIT_GHOSTROLES + init_order = INIT_ORDER_GHOSTROLES var/list/spawnpoints = list() //List of the available spawnpoints by spawnpoint type // -> type 1 -> spawnpoint 1 @@ -100,7 +100,7 @@ SUBSYSTEM_DEF(ghostroles) return get_turf(P) /datum/controller/subsystem/ghostroles/ui_state(mob/user) - return always_state + return GLOB.always_state /datum/controller/subsystem/ghostroles/ui_status(mob/user, datum/ui_state/state) return UI_INTERACTIVE diff --git a/code/controllers/subsystems/icon_cache.dm b/code/controllers/subsystems/icon_cache.dm index 8fc73db376f..e2289dcb4e2 100644 --- a/code/controllers/subsystems/icon_cache.dm +++ b/code/controllers/subsystems/icon_cache.dm @@ -1,7 +1,7 @@ SUBSYSTEM_DEF(icon_cache) name = "Icon Cache" flags = SS_NO_FIRE - init_order = SS_INIT_MISC_FIRST + init_order = INIT_ORDER_MISC_FIRST // Cached bloody overlays, key is object type. var/list/bloody_cache = list() diff --git a/code/controllers/subsystems/icon_smooth.dm b/code/controllers/subsystems/icon_smooth.dm index 43e2e3fc689..e548dba08cc 100644 --- a/code/controllers/subsystems/icon_smooth.dm +++ b/code/controllers/subsystems/icon_smooth.dm @@ -17,7 +17,7 @@ SUBSYSTEM_DEF(icon_smooth) name = "Icon Smoothing" - init_order = SS_INIT_SMOOTHING + init_order = INIT_ORDER_ICON_SMOOTHING wait = 1 priority = SS_PRIORITY_SMOOTHING flags = SS_TICKER diff --git a/code/controllers/subsystems/icon_updates.dm b/code/controllers/subsystems/icon_updates.dm index 8af3dbced20..6bc56161f48 100644 --- a/code/controllers/subsystems/icon_updates.dm +++ b/code/controllers/subsystems/icon_updates.dm @@ -3,7 +3,7 @@ SUBSYSTEM_DEF(icon_update) wait = 1 // ticks flags = SS_TICKER priority = SS_PRIORITY_ICON_UPDATE - init_order = SS_INIT_ICON_UPDATE + init_order = INIT_ORDER_ICON_UPDATE /** * Associative list of atoms -> callback params diff --git a/code/controllers/subsystems/initialization/atlas.dm b/code/controllers/subsystems/initialization/atlas.dm index 2e29c597a83..ae14bc986a3 100644 --- a/code/controllers/subsystems/initialization/atlas.dm +++ b/code/controllers/subsystems/initialization/atlas.dm @@ -3,7 +3,7 @@ SUBSYSTEM_DEF(atlas) name = "Atlas" flags = SS_NO_FIRE - init_order = SS_INIT_MAPLOAD + init_order = INIT_ORDER_MAPPING init_stage = INITSTAGE_EARLY // Whatever map is currently loaded. Null until SSatlas Initialize() starts. @@ -210,6 +210,8 @@ SUBSYSTEM_DEF(atlas) else current_sector = selected_sector + current_sector.setup_current_sector() + return SS_INIT_SUCCESS /datum/controller/subsystem/atlas/proc/load_map_directory(directory, overwrite_default_z = FALSE) diff --git a/code/controllers/subsystems/initialization/atoms.dm b/code/controllers/subsystems/initialization/atoms.dm index 7ac876a252d..a3f8a0c2b45 100644 --- a/code/controllers/subsystems/initialization/atoms.dm +++ b/code/controllers/subsystems/initialization/atoms.dm @@ -1,7 +1,7 @@ #define SUBSYSTEM_INIT_SOURCE "subsystem init" SUBSYSTEM_DEF(atoms) name = "Atoms" - init_order = SS_INIT_ATOMS + init_order = INIT_ORDER_ATOMS flags = SS_NO_FIRE /// A stack of list(source, desired initialized state) diff --git a/code/controllers/subsystems/initialization/map_finalization.dm b/code/controllers/subsystems/initialization/map_finalization.dm index c5c854ac138..619921acabf 100644 --- a/code/controllers/subsystems/initialization/map_finalization.dm +++ b/code/controllers/subsystems/initialization/map_finalization.dm @@ -3,7 +3,7 @@ SUBSYSTEM_DEF(finalize) name = "Map Finalization" flags = SS_NO_FIRE | SS_NO_DISPLAY - init_order = SS_INIT_MAPFINALIZE + init_order = INIT_ORDER_MAPFINALIZE var/dmm_suite/maploader var/datum/away_mission/selected_mission diff --git a/code/controllers/subsystems/initialization/misc_early.dm b/code/controllers/subsystems/initialization/misc_early.dm index 37b524e67be..84af95b973a 100644 --- a/code/controllers/subsystems/initialization/misc_early.dm +++ b/code/controllers/subsystems/initialization/misc_early.dm @@ -3,7 +3,7 @@ SUBSYSTEM_DEF(misc_early) name = "Early Miscellaneous Init" - init_order = SS_INIT_MISC_FIRST + init_order = INIT_ORDER_MISC_FIRST flags = SS_NO_FIRE | SS_NO_DISPLAY /datum/controller/subsystem/misc_early/Initialize(timeofday) diff --git a/code/controllers/subsystems/initialization/misc_late.dm b/code/controllers/subsystems/initialization/misc_late.dm index 3c4f51ff763..12e1a4fc810 100644 --- a/code/controllers/subsystems/initialization/misc_late.dm +++ b/code/controllers/subsystems/initialization/misc_late.dm @@ -2,7 +2,7 @@ SUBSYSTEM_DEF(misc_late) name = "Late Miscellaneous Init" - init_order = SS_INIT_MISC + init_order = INIT_ORDER_MISC flags = SS_NO_FIRE | SS_NO_DISPLAY /// this is a list of things that fire when late misc init is called diff --git a/code/controllers/subsystems/initialization/persistent_configuration.dm b/code/controllers/subsystems/initialization/persistent_configuration.dm index b331bab012a..7a9068690ac 100644 --- a/code/controllers/subsystems/initialization/persistent_configuration.dm +++ b/code/controllers/subsystems/initialization/persistent_configuration.dm @@ -1,6 +1,7 @@ SUBSYSTEM_DEF(persistent_configuration) name = "Persistent Configuration" - init_order = SS_INIT_PERSISTENT_CONFIG + init_order = INIT_ORDER_PERSISTENT_CONFIGURATION + init_stage = INITSTAGE_EARLY flags = SS_NO_FIRE // Config options go here. Make sure to give them sane default values! diff --git a/code/controllers/subsystems/ipintel.dm b/code/controllers/subsystems/ipintel.dm index 480f9931370..47b88153f48 100644 --- a/code/controllers/subsystems/ipintel.dm +++ b/code/controllers/subsystems/ipintel.dm @@ -1,6 +1,6 @@ SUBSYSTEM_DEF(ipintel) name = "XKeyScore" - init_order = SS_INIT_MISC_FIRST + init_order = INIT_ORDER_MISC_FIRST flags = SS_NO_FIRE var/enabled = FALSE //disable at round start to avoid checking reconnects var/throttle = 0 diff --git a/code/controllers/subsystems/job.dm b/code/controllers/subsystems/job.dm index a746e1b7d94..0676e7a3438 100644 --- a/code/controllers/subsystems/job.dm +++ b/code/controllers/subsystems/job.dm @@ -4,7 +4,7 @@ SUBSYSTEM_DEF(jobs) // Subsystem stuff. name = "Jobs" flags = SS_NO_FIRE - init_order = SS_INIT_JOBS + init_order = INIT_ORDER_JOBS // Vars. var/list/datum/job/occupations = list() diff --git a/code/controllers/subsystems/lighting.dm b/code/controllers/subsystems/lighting.dm index 42b462d64a6..f8aa2f73890 100644 --- a/code/controllers/subsystems/lighting.dm +++ b/code/controllers/subsystems/lighting.dm @@ -7,7 +7,7 @@ SUBSYSTEM_DEF(lighting) runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY priority = SS_PRIORITY_LIGHTING - init_order = SS_INIT_LIGHTING + init_order = INIT_ORDER_LIGHTING var/total_lighting_overlays = 0 var/total_lighting_sources = 0 diff --git a/code/controllers/subsystems/machinery.dm b/code/controllers/subsystems/machinery.dm index 9342f1c53ed..9ec5eeb53f8 100644 --- a/code/controllers/subsystems/machinery.dm +++ b/code/controllers/subsystems/machinery.dm @@ -36,7 +36,7 @@ if(Datum.isprocessing) {\ SUBSYSTEM_DEF(machinery) name = "Machinery" priority = SS_PRIORITY_MACHINERY - init_order = SS_INIT_MACHINERY + init_order = INIT_ORDER_MACHINES flags = SS_POST_FIRE_TIMING wait = 2 SECONDS diff --git a/code/controllers/subsystems/mapping.dm b/code/controllers/subsystems/mapping.dm index 3caae18e45f..9a87b21fcf9 100644 --- a/code/controllers/subsystems/mapping.dm +++ b/code/controllers/subsystems/mapping.dm @@ -1,6 +1,6 @@ SUBSYSTEM_DEF(mapping) name = "Mapping" - init_order = SS_INIT_AWAY_MAPS + init_order = INIT_ORDER_AWAY_MAPS flags = SS_NO_FIRE var/list/map_templates = list() diff --git a/code/controllers/subsystems/materials.dm b/code/controllers/subsystems/materials.dm index b4dc080ec32..aa6aabd1271 100644 --- a/code/controllers/subsystems/materials.dm +++ b/code/controllers/subsystems/materials.dm @@ -1,6 +1,6 @@ SUBSYSTEM_DEF(materials) name = "Materials" - init_order = SS_INIT_MISC_FIRST + init_order = INIT_ORDER_MISC_FIRST flags = SS_NO_FIRE var/list/materials diff --git a/code/controllers/subsystems/mob.dm b/code/controllers/subsystems/mob.dm index 6a1e50e7a1e..8b016fcbb29 100644 --- a/code/controllers/subsystems/mob.dm +++ b/code/controllers/subsystems/mob.dm @@ -1,6 +1,6 @@ SUBSYSTEM_DEF(mobs) name = "Mobs - Life" - init_order = SS_INIT_MISC // doesn't really matter when we init + init_order = INIT_ORDER_MISC // doesn't really matter when we init priority = SS_PRIORITY_MOB runlevels = RUNLEVELS_PLAYING diff --git a/code/controllers/subsystems/overlays.dm b/code/controllers/subsystems/overlays.dm index e7f605e0832..760861a1860 100644 --- a/code/controllers/subsystems/overlays.dm +++ b/code/controllers/subsystems/overlays.dm @@ -4,7 +4,7 @@ SUBSYSTEM_DEF(overlays) runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY wait = 1 priority = SS_PRIORITY_OVERLAY - init_order = SS_INIT_OVERLAY + init_order = INIT_ORDER_OVERLAY var/list/processing = list() diff --git a/code/controllers/subsystems/pai.dm b/code/controllers/subsystems/pai.dm index add006fd254..94ddfc25182 100644 --- a/code/controllers/subsystems/pai.dm +++ b/code/controllers/subsystems/pai.dm @@ -1,6 +1,6 @@ SUBSYSTEM_DEF(pai) name = "pAI" - init_order = SS_INIT_MISC_FIRST + init_order = INIT_ORDER_MISC_FIRST flags = SS_NO_FIRE | SS_NO_INIT var/list/pai_software_by_key @@ -22,7 +22,7 @@ SUBSYSTEM_DEF(pai) default_pai_software = SSpai.default_pai_software /datum/controller/subsystem/pai/ui_state(mob/user) - return always_state + return GLOB.always_state /datum/controller/subsystem/pai/ui_status(mob/user, datum/ui_state/state) return UI_INTERACTIVE diff --git a/code/controllers/subsystems/ping.dm b/code/controllers/subsystems/ping.dm index c4c3b56fd55..73db9940f2d 100644 --- a/code/controllers/subsystems/ping.dm +++ b/code/controllers/subsystems/ping.dm @@ -1,12 +1,10 @@ SUBSYSTEM_DEF(ping) name = "Ping" - priority = SS_PRIORITY_PING - init_order = SS_INIT_PING + priority = FIRE_PRIORITY_PING + init_stage = INITSTAGE_EARLY wait = 4 SECONDS flags = SS_NO_INIT - runlevels = RUNLEVEL_INIT | RUNLEVEL_LOBBY | RUNLEVEL_SETUP | RUNLEVEL_GAME | RUNLEVEL_POSTGAME - init_stage = INITSTAGE_EARLY - + runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT var/list/currentrun = list() /datum/controller/subsystem/ping/stat_entry(msg) diff --git a/code/controllers/subsystems/plants.dm b/code/controllers/subsystems/plants.dm index 286fdb2e7ab..5642d2b221a 100644 --- a/code/controllers/subsystems/plants.dm +++ b/code/controllers/subsystems/plants.dm @@ -2,7 +2,7 @@ SUBSYSTEM_DEF(plants) name = "Seeds & Plants" flags = 0 // Override parent's flags. wait = 75 - init_order = SS_INIT_SEEDS + init_order = INIT_ORDER_SEEDS priority = SS_PRIORITY_PLANTS runlevels = RUNLEVELS_PLAYING diff --git a/code/controllers/subsystems/processing/dcs.dm b/code/controllers/subsystems/processing/dcs.dm index 0b4f2ef4d12..51cb8b0c4ae 100644 --- a/code/controllers/subsystems/processing/dcs.dm +++ b/code/controllers/subsystems/processing/dcs.dm @@ -22,8 +22,6 @@ PROCESSING_SUBSYSTEM_DEF(dcs) return . = elements_by_type[element_id] = new eletype -///Temporary compatibility to not rewrite the proc, it is being ported already in another PR -#define REF(k) ref(##k) /**** * Generates an id for bespoke elements when given the argument list * Generating the id here is a bit complex because we need to support named arguments @@ -66,4 +64,3 @@ PROCESSING_SUBSYSTEM_DEF(dcs) named_arguments = sortList(named_arguments) fullid += named_arguments return list2params(fullid) -#undef REF diff --git a/code/controllers/subsystems/processing/electronics.dm b/code/controllers/subsystems/processing/electronics.dm index 629d1f7394d..c09b0704d05 100644 --- a/code/controllers/subsystems/processing/electronics.dm +++ b/code/controllers/subsystems/processing/electronics.dm @@ -6,7 +6,7 @@ PROCESSING_SUBSYSTEM_DEF(electronics) wait = 2 SECONDS priority = SS_PRIORITY_ELECTRONICS flags = SS_KEEP_TIMING - init_order = SS_INIT_MISC_FIRST + init_order = INIT_ORDER_MISC_FIRST var/list/all_integrated_circuits = list() var/list/printer_recipe_list = list() diff --git a/code/controllers/subsystems/processing/ntsl2.dm b/code/controllers/subsystems/processing/ntsl2.dm index a9f17ae11d5..7516c1d5e52 100644 --- a/code/controllers/subsystems/processing/ntsl2.dm +++ b/code/controllers/subsystems/processing/ntsl2.dm @@ -4,7 +4,7 @@ NTSL2 deamon management subsystem, responsible for handling events from deamon a PROCESSING_SUBSYSTEM_DEF(ntsl2) name = "NTSL2" flags = 0 - init_order = SS_INIT_MISC + init_order = INIT_ORDER_MISC // priority = SS_PRIORITY_PROCESSING var/connected = FALSE var/list/programs = list() diff --git a/code/controllers/subsystems/processing/shuttle.dm b/code/controllers/subsystems/processing/shuttle.dm index 65c879ed724..52f2d16ba84 100644 --- a/code/controllers/subsystems/processing/shuttle.dm +++ b/code/controllers/subsystems/processing/shuttle.dm @@ -2,7 +2,7 @@ SUBSYSTEM_DEF(shuttle) name = "Shuttle" wait = 2 SECONDS priority = SS_PRIORITY_SHUTTLE - init_order = SS_INIT_MISC //Should be initialized after all maploading is over and atoms are initialized, to ensure that landmarks have been initialized. + init_order = INIT_ORDER_MISC //Should be initialized after all maploading is over and atoms are initialized, to ensure that landmarks have been initialized. var/overmap_halted = FALSE //Whether ships can move on the overmap; used for adminbus. var/list/ships = list() //List of all ships. diff --git a/code/controllers/subsystems/records.dm b/code/controllers/subsystems/records.dm index 3a646e60559..cc0c6ac53b8 100644 --- a/code/controllers/subsystems/records.dm +++ b/code/controllers/subsystems/records.dm @@ -188,7 +188,7 @@ SUBSYSTEM_DEF(records) update_static_data_for_all_viewers() /datum/controller/subsystem/records/ui_state(mob/user) - return always_state + return GLOB.always_state /datum/controller/subsystem/records/ui_status(mob/user, datum/ui_state/state) return (isnewplayer(user) || isobserver(user) || issilicon(user)) ? UI_INTERACTIVE : UI_CLOSE diff --git a/code/controllers/subsystems/skybox.dm b/code/controllers/subsystems/skybox.dm index 53380d2f025..16c5c7e6e1e 100644 --- a/code/controllers/subsystems/skybox.dm +++ b/code/controllers/subsystems/skybox.dm @@ -1,6 +1,6 @@ SUBSYSTEM_DEF(skybox) name = "Space skybox" - init_order = SS_INIT_PARALLAX + init_order = INIT_ORDER_PARALLAX flags = SS_NO_FIRE var/background_color var/skybox_icon = 'icons/skybox/skybox.dmi' //Path to our background. Lets us use anything we damn well please. Skyboxes need to be 736x736 diff --git a/code/controllers/subsystems/statpanel.dm b/code/controllers/subsystems/statpanel.dm index 5dfe51087fb..49d9827488c 100644 --- a/code/controllers/subsystems/statpanel.dm +++ b/code/controllers/subsystems/statpanel.dm @@ -125,7 +125,7 @@ SUBSYSTEM_DEF(statpanels) /datum/controller/subsystem/statpanels/proc/set_SDQL2_tab(client/target) var/list/sdql2A = list() - sdql2A[++sdql2A.len] = list("", "Access Global SDQL2 List", ref(GLOB.sdql2_vv_statobj)) + sdql2A[++sdql2A.len] = list("", "Access Global SDQL2 List", REF(GLOB.sdql2_vv_statobj)) var/list/sdql2B = list() for(var/datum/sdql2_query/query as anything in GLOB.sdql2_queries) sdql2B = query.generate_stat() @@ -219,7 +219,7 @@ SUBSYSTEM_DEF(statpanels) continue // We already have it. Success! if(existing_image) - turf_items[++turf_items.len] = list("[turf_item.name]", ref(turf_item), existing_image) + turf_items[++turf_items.len] = list("[turf_item.name]", REF(turf_item), existing_image) continue // Now, we're gonna queue image generation out of those refs to_make += turf_item diff --git a/code/controllers/subsystems/stickyban.dm b/code/controllers/subsystems/stickyban.dm index 71ded5ce28e..82388bc0291 100644 --- a/code/controllers/subsystems/stickyban.dm +++ b/code/controllers/subsystems/stickyban.dm @@ -1,6 +1,6 @@ SUBSYSTEM_DEF(stickyban) name = "PRISM" - init_order = SS_INIT_MISC_FIRST + init_order = INIT_ORDER_MISC_FIRST flags = SS_NO_FIRE var/list/cache = list() diff --git a/code/controllers/subsystems/ticker.dm b/code/controllers/subsystems/ticker.dm index 170b868d1be..74966e91c06 100644 --- a/code/controllers/subsystems/ticker.dm +++ b/code/controllers/subsystems/ticker.dm @@ -12,7 +12,7 @@ var/datum/controller/subsystem/ticker/SSticker priority = SS_PRIORITY_TICKER runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY - init_order = SS_INIT_LOBBY + init_order = INIT_ORDER_TICKER wait = 1 SECOND @@ -49,11 +49,11 @@ var/datum/controller/subsystem/ticker/SSticker //Now we have a general cinematic centrally held within the gameticker....far more efficient! var/obj/screen/cinematic = null - var/list/possible_lobby_tracks = list( - 'sound/music/space.ogg', - 'sound/music/traitor.ogg', - 'sound/music/title2.ogg', - 'sound/music/clouds.s3m' + var/list/default_lobby_tracks = list( + 'sound/music/lobby/space.ogg', + 'sound/music/lobby/traitor.ogg', + 'sound/music/lobby/title2.ogg', + 'sound/music/lobby/clouds.s3m' ) var/lobby_ready = FALSE @@ -417,8 +417,11 @@ var/datum/controller/subsystem/ticker/SSticker /datum/controller/subsystem/ticker/proc/pregame() set waitfor = FALSE sleep(1) // Sleep so the MC has a chance to update its init time. - if (!login_music) - login_music = pick(possible_lobby_tracks) + if(!login_music) + if(SSatlas.current_sector && SSatlas.current_sector.lobby_tracks) + login_music = pick(SSatlas.current_sector.lobby_tracks) + else + login_music = pick(default_lobby_tracks) if (is_revote) pregame_timeleft = LOBBY_TIME diff --git a/code/controllers/subsystems/virtual_reality.dm b/code/controllers/subsystems/virtual_reality.dm index 3d67be494d9..33dd447bbba 100644 --- a/code/controllers/subsystems/virtual_reality.dm +++ b/code/controllers/subsystems/virtual_reality.dm @@ -1,6 +1,6 @@ SUBSYSTEM_DEF(virtualreality) name = "Virtual Reality" - init_order = SS_INIT_MISC_FIRST + init_order = INIT_ORDER_MISC_FIRST flags = SS_NO_FIRE // MECHA diff --git a/code/controllers/subsystems/vote.dm b/code/controllers/subsystems/vote.dm index 2aeab72dde9..321b0828285 100644 --- a/code/controllers/subsystems/vote.dm +++ b/code/controllers/subsystems/vote.dm @@ -1,9 +1,9 @@ SUBSYSTEM_DEF(vote) name = "Voting" wait = 1 SECOND - flags = SS_KEEP_TIMING | SS_KEEP_TIMING - runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY - priority = SS_PRIORITY_VOTE + flags = SS_KEEP_TIMING + init_order = INIT_ORDER_VOTE + runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT var/next_transfer_time @@ -326,7 +326,7 @@ SUBSYSTEM_DEF(vote) ) /datum/controller/subsystem/vote/ui_state(mob/user) - return always_state + return GLOB.always_state /datum/controller/subsystem/vote/ui_status(mob/user, datum/ui_state/state) return UI_INTERACTIVE diff --git a/code/controllers/subsystems/zcopy.dm b/code/controllers/subsystems/zcopy.dm index b2e242fceb4..3670eea3209 100644 --- a/code/controllers/subsystems/zcopy.dm +++ b/code/controllers/subsystems/zcopy.dm @@ -1,7 +1,7 @@ SUBSYSTEM_DEF(zcopy) name = "Z-Copy" wait = 1 - init_order = SS_INIT_ZCOPY + init_order = INIT_ORDER_ZCOPY priority = SS_PRIORITY_ZCOPY runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY diff --git a/code/datums/components/local_network.dm b/code/datums/components/local_network.dm index 94514ad7c37..fdce8aa8a49 100644 --- a/code/datums/components/local_network.dm +++ b/code/datums/components/local_network.dm @@ -54,7 +54,7 @@ /datum/component/local_network_member/proc/get_new_tag(mob/user) var/new_ident = input(user, "Enter a new ident tag.", "[parent]", id_tag) as null|text - if(new_ident && parent && user.Adjacent(parent) && CanInteract(user, physical_state)) + if(new_ident && parent && user.Adjacent(parent) && CanInteract(user, GLOB.physical_state)) return set_tag(user, new_ident) // diff --git a/code/datums/datum.dm b/code/datums/datum.dm index eb0e9e9a28e..9b63cd80c89 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -24,6 +24,9 @@ /// Set to true when a signal has been registered var/signal_enabled = FALSE + /// Datum level flags + var/datum_flags = NONE + /// A weak reference to another datum var/datum/weakref/weak_reference @@ -48,6 +51,7 @@ //SHOULD_NOT_SLEEP(TRUE) //Soon my friend, soon... tag = null + datum_flags &= ~DF_USE_TAG //In case something tries to REF us weak_reference = null //ensure prompt GCing of weakref. if(active_timers) @@ -138,6 +142,12 @@ vars[var_name] = var_value return TRUE +///Generate a tag for this /datum, if it implements one +///Should be called as early as possible, best would be in New, to avoid weakref mistargets +///Really just don't use this, you don't need it, global lists will do just fine MOST of the time +///We really only use it for mobs to make id'ing people easier +/datum/proc/GenerateTag() + datum_flags |= DF_USE_TAG /// Return text from this proc to provide extra context to hard deletes that happen to it /// Optional, you should use this for cases where replication is difficult and extra context is required diff --git a/code/datums/late_choices.dm b/code/datums/late_choices.dm index d50ef425d1f..6c23f9bf353 100755 --- a/code/datums/late_choices.dm +++ b/code/datums/late_choices.dm @@ -17,7 +17,7 @@ return ..() /datum/late_choices/ui_state(mob/user) - return new_player_state + return GLOB.new_player_state /datum/late_choices/ui_status(mob/user, datum/ui_state/state) return isnewplayer(user) ? UI_INTERACTIVE : UI_CLOSE diff --git a/code/datums/tgui_module.dm b/code/datums/tgui_module.dm index 4c0cc44fda0..88afcf8c18e 100644 --- a/code/datums/tgui_module.dm +++ b/code/datums/tgui_module.dm @@ -1,11 +1,11 @@ /datum/tgui_module/ui_state(mob/user) - return always_state + return GLOB.always_state /datum/tgui_module/ui_status(mob/user, datum/ui_state/state) return UI_INTERACTIVE /datum/tgui_module/moderator/ui_state(mob/user) - return moderator_state + return GLOB.moderator_state /datum/tgui_module/admin/ui_state(mob/user) - return admin_state + return GLOB.admin_state diff --git a/code/datums/uplink/uplink_items.dm b/code/datums/uplink/uplink_items.dm index 5f462db5363..ea058a20189 100644 --- a/code/datums/uplink/uplink_items.dm +++ b/code/datums/uplink/uplink_items.dm @@ -54,7 +54,7 @@ var/datum/uplink/uplink if(!can_buy_telecrystals && !can_buy_bluecrystals) return - if(U.CanUseTopic(user, inventory_state) != STATUS_INTERACTIVE) + if(U.CanUseTopic(user, GLOB.inventory_state) != STATUS_INTERACTIVE) return var/goods = get_goods(U, get_turf(user), user, extra_args) diff --git a/code/datums/weakrefs.dm b/code/datums/weakrefs.dm index 911623ff4c2..490d3bfbfeb 100644 --- a/code/datums/weakrefs.dm +++ b/code/datums/weakrefs.dm @@ -56,7 +56,7 @@ var/reference /datum/weakref/New(datum/thing) - reference = text_ref(thing) + reference = REF(thing) /datum/weakref/Destroy(force) var/datum/target = resolve() diff --git a/code/datums/wires/wires.dm b/code/datums/wires/wires.dm index d447f453943..f0724be4383 100644 --- a/code/datums/wires/wires.dm +++ b/code/datums/wires/wires.dm @@ -277,7 +277,7 @@ var/global/list/wire_name_directory = list() return UI_CLOSE /datum/wires/ui_state(mob/user) - return physical_state + return GLOB.physical_state /datum/wires/ui_interact(mob/user, datum/tgui/ui) diff --git a/code/game/antagonist/antagonist_print.dm b/code/game/antagonist/antagonist_print.dm index 28f82c1735e..cf3eb9a962e 100644 --- a/code/game/antagonist/antagonist_print.dm +++ b/code/game/antagonist/antagonist_print.dm @@ -74,7 +74,7 @@ // they are either imprisoned, or handcuffed in an area that can't be considered a hideout text += "apprehended" else if(isNotStationLevel(M.z)) - text += "fled the station" + text += "fled the [SSatlas.current_map.station_type]" else text += "survived" if(M.stat == UNCONSCIOUS) diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 37b3e2ab123..8111b3f4a83 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -639,7 +639,7 @@ pixel_x = 10; ui_interact(user) wires.interact(user) -/obj/machinery/alarm/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1, var/master_ui = null, var/datum/ui_state/state = default_state) +/obj/machinery/alarm/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1, var/master_ui = null, var/datum/ui_state/state = GLOB.default_state) var/data = list() var/remote_connection = 0 var/remote_access = 0 diff --git a/code/game/machinery/autolathe/autolathe.dm b/code/game/machinery/autolathe/autolathe.dm index 103e78babb4..6305db6669c 100644 --- a/code/game/machinery/autolathe/autolathe.dm +++ b/code/game/machinery/autolathe/autolathe.dm @@ -43,15 +43,6 @@ /obj/item/stock_parts/console_screen ) -/obj/machinery/autolathe/mounted - name = "\improper mounted autolathe" - density = FALSE - anchored = FALSE - idle_power_usage = FALSE - active_power_usage = FALSE - interact_offline = TRUE - does_flick = FALSE - /obj/machinery/autolathe/Initialize() ..() wires = new(src) @@ -381,6 +372,18 @@ user.remove_from_mob(O) qdel(O) +/obj/machinery/autolathe/mounted + name = "\improper mounted autolathe" + density = FALSE + anchored = FALSE + idle_power_usage = FALSE + active_power_usage = FALSE + interact_offline = TRUE + does_flick = FALSE + +/obj/machinery/autolathe/mounted/ui_state(mob/user) + return GLOB.heavy_vehicle_state + /// Queue items are needed so that the queue knows exactly what it's doing. /datum/autolathe_queue_item /// The recipe singleton. We need to know exactly what we're making. diff --git a/code/game/machinery/body_scanner.dm b/code/game/machinery/body_scanner.dm index 504b7975ef8..06db8086692 100644 --- a/code/game/machinery/body_scanner.dm +++ b/code/game/machinery/body_scanner.dm @@ -878,7 +878,7 @@ return ..() /obj/machinery/body_scanconsole/embedded/ui_state(mob/user) - return human_adjacent_loc_state + return GLOB.human_adjacent_loc_state /obj/machinery/body_scanconsole/embedded/get_connected() if(monitor_console) diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index 4a67b86f8a3..36ce7323ae2 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -159,7 +159,7 @@ ..() queue_icon_update() -/obj/machinery/firealarm/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/ui_state/state = default_state) +/obj/machinery/firealarm/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/ui_state/state = GLOB.default_state) var/data[0] data["alertLevel"] = get_security_level() data["time"] = src.time @@ -294,7 +294,7 @@ Just a object used in constructing fire alarms A.partyreset() return -/obj/machinery/firealarm/partyalarm/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/ui_state/state = default_state) +/obj/machinery/firealarm/partyalarm/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/ui_state/state = GLOB.default_state) var/data[0] data["alertLevel"] = get_security_level() data["time"] = src.time diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm index 63f4fdd88a6..e6b0e77c0eb 100644 --- a/code/game/machinery/jukebox.dm +++ b/code/game/machinery/jukebox.dm @@ -24,13 +24,13 @@ var/datum/track/current_track var/list/datum/track/tracks = list( new/datum/track("Beyond", 'sound/music/ambispace.ogg'), - new/datum/track("Clouds of Fire", 'sound/music/clouds.s3m'), - new/datum/track("D`Bert", 'sound/music/title2.ogg'), + new/datum/track("Clouds of Fire", 'sound/music/lobby/clouds.s3m'), + new/datum/track("D`Bert", 'sound/music/lobby/title2.ogg'), new/datum/track("D`Fort", 'sound/music/song_game.ogg'), new/datum/track("Floating", 'sound/music/main.ogg'), - new/datum/track("Endless Space", 'sound/music/space.ogg'), + new/datum/track("Endless Space", 'sound/music/lobby/space.ogg'), new/datum/track("Scratch", 'sound/music/title1.ogg'), - new/datum/track("Suspenseful", 'sound/music/traitor.ogg'), + new/datum/track("Suspenseful", 'sound/music/lobby/traitor.ogg'), new/datum/track("Thunderdome", 'sound/music/THUNDERDOME.ogg'), new/datum/track("Velvet Rose", 'sound/music/velvet_rose.ogg') ) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 11bab113388..efad76f1966 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -145,6 +145,7 @@ src.ads_list += text2list(src.product_ads, ";") add_screen_overlay() + build_products() build_inventory() power_change() @@ -168,6 +169,15 @@ add_overlay(screen_overlays["[icon_state]-[deny ? "deny" : "screen"]"]) reset_light() +/** + * Build src.products + * + * To be overriden if building the products list is dynamic at runtime or needs any complex logic + */ +/obj/machinery/vending/proc/build_products() + SHOULD_NOT_SLEEP(TRUE) + return + /** * Build src.product_records from the products lists * @@ -719,6 +729,7 @@ var/vending_usr_dir = get_dir(src, user) var/obj/vended = new R.product_path(get_step(src, vending_usr_dir)) + vended_product_post(vended) if(Adjacent(user)) user.put_in_hands(vended) src.status_message = "" @@ -735,6 +746,12 @@ if(1) use_power_oneoff(RC.reagents.set_temperature(heating_temperature)) +/// To be overriden if vended out products need any post-processing, setting its vars. +/// Called by `vend_product`. +/// `vended` is the item that is being vended out. +/obj/machinery/vending/proc/vended_product_post(var/obj/vended) + return + /obj/machinery/vending/proc/stock(var/datum/data/vending_product/R, var/mob/user) to_chat(user, "You insert \the [R.product_name] in the product receptor.") diff --git a/code/game/machinery/vending_types.dm b/code/game/machinery/vending_types.dm index d54374d1f7e..b2a473ea9f0 100644 --- a/code/game/machinery/vending_types.dm +++ b/code/game/machinery/vending_types.dm @@ -1638,3 +1638,50 @@ /obj/item/reagent_containers/food/drinks/bottle/wine = 50, /obj/item/reagent_containers/food/drinks/bottle/champagne = 100 ) + +/obj/machinery/vending/rental_bikes + name = "\improper Rental Bikes self-service vendor" + desc = "Rent-a-bike, for a day!" + icon_state = "rent-a-bike" + icon_vend = "rent-a-bike-vend" + vend_id = "rent-a-bike" + products = list( + /obj/item/key/bike/moped = 0, // filled from the key data lists + /obj/item/key/bike/sport = 0, + ) + prices = list( + /obj/item/key/bike/moped = 50, + /obj/item/key/bike/sport = 200, + ) + restock_items = FALSE + random_itemcount = FALSE + light_color = COLOR_BABY_BLUE + + /// List of strings. + /// Vended out keys will be filled with these key data (== bike reg plates) strings. + /// Also based on this list is filled the products assoc list. + var/list/key_data_mopeds = list() + + /// Same as the list for mopeds, except for sports bikes. + var/list/key_data_sports = list() + +/obj/machinery/vending/rental_bikes/build_products() + products[/obj/item/key/bike/moped] = length(key_data_mopeds) + products[/obj/item/key/bike/sport] = length(key_data_sports) + +/obj/machinery/vending/rental_bikes/vended_product_post(var/obj/vended) + var/obj/item/key/key = vended + if(!istype(key)) + return + + // expires the next day + var/rental_expiry = "[GLOB.game_year]-[time2text(world.realtime + 1 DAY, "MM-DD")] [worldtime2text()]" + key.desc += " Property of Idris Incorporated. Rental expires on [rental_expiry]. Return fully charged." + + if(key_data_mopeds && istype(key, /obj/item/key/bike/moped)) + key.key_data = key_data_mopeds[1] + key_data_mopeds.Cut(1,2) + else if(key_data_sports && istype(key, /obj/item/key/bike/sport)) + key.key_data = key_data_sports[1] + key_data_sports.Cut(1,2) + diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index fe94701c8e9..92663795bee 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -108,6 +108,26 @@ return 1 +/obj/effect/landmark/lobby_mobs_location + name = "lobby_mobs_location" + anchored = TRUE + invisibility = 101 + +INITIALIZE_IMMEDIATE(/obj/effect/landmark/lobby_mobs_location) + +/obj/effect/landmark/lobby_mobs_location/Initialize() + ..() + + if(GLOB.lobby_mobs_location) + crash_with("There must be one, and only one, /obj/effect/landmark/lobby_mobs_location effect in any single server session!") + + else + GLOB.lobby_mobs_location = get_turf(src) + ASSERT(istype(GLOB.lobby_mobs_location, /turf)) + + return INITIALIZE_HINT_QDEL + + //Costume spawner landmarks /obj/effect/landmark/costume/New() //costume spawner, selects a random subclass and disappears diff --git a/code/game/objects/items/devices/lighting/hull_beacon.dm b/code/game/objects/items/devices/lighting/hull_beacon.dm index b9b76ebb733..8561bf3a1ce 100644 --- a/code/game/objects/items/devices/lighting/hull_beacon.dm +++ b/code/game/objects/items/devices/lighting/hull_beacon.dm @@ -9,14 +9,14 @@ /obj/item/hullbeacon/red name = "red hull beacon" - desc = "A light-emitting red hull beacon." - icon_state = "beacon_green_on" + desc = "A red, light-emitting hull beacon." + icon_state = "beacon_red_on" light_color = LIGHT_COLOR_RED light_range = 3 /obj/item/hullbeacon/green name = "green hull beacon" - desc = "A light-emitting green hull beacon." - icon_state = "beacon_red_on" + desc = "A green, light-emitting hull beacon." + icon_state = "beacon_green_on" light_color = LIGHT_COLOR_GREEN light_range = 3 diff --git a/code/game/objects/items/devices/tvcamera.dm b/code/game/objects/items/devices/tvcamera.dm index f52ab445e50..b08bd5e55f5 100644 --- a/code/game/objects/items/devices/tvcamera.dm +++ b/code/game/objects/items/devices/tvcamera.dm @@ -42,7 +42,7 @@ popup.set_content(jointext(dat,null)) popup.open() -/obj/item/device/tvcamera/Topic(bred, href_list, state = physical_state) +/obj/item/device/tvcamera/Topic(bred, href_list, state = GLOB.physical_state) if(..()) return 1 if(href_list["channel"]) diff --git a/code/game/objects/items/lore_radio.dm b/code/game/objects/items/lore_radio.dm new file mode 100644 index 00000000000..4857b308be4 --- /dev/null +++ b/code/game/objects/items/lore_radio.dm @@ -0,0 +1,64 @@ +/obj/item/lore_radio + name = "analog radio" + desc = "A portable radio capable of receiving radio waves from nearby space systems." + icon = 'icons/obj/radio.dmi' + icon_state = "radio" + w_class = ITEMSIZE_SMALL + + var/receiving = FALSE + var/current_station = null + var/starts_on = FALSE //so you can map it and have it broadcast without anyone turning it on + +/obj/item/lore_radio/Initialize() + . = ..() + if(!current_station && SSatlas.current_sector?.lore_radio_stations) + current_station = pick(SSatlas.current_sector.lore_radio_stations) + if(starts_on) + toggle_receiving() + RegisterSignal(SSdcs, COMSIG_GLOB_LORE_RADIO_BROADCAST, PROC_REF(relay_lore_radio)) + +/obj/item/lore_radio/examine(var/mob/user) + . = ..() + to_chat(user, SPAN_NOTICE("\The [src] is turned [receiving ? "on" : "off"].")) + if(current_station) + to_chat(user, SPAN_NOTICE("\The [src] is listening to \the [current_station] radio station.")) + +/obj/item/lore_radio/attack_self(var/mob/user) + if(SSatlas.current_sector?.lore_radio_stations) + var/picked_station = tgui_input_list(user, "Select the radio frequency.", "Radio Station Selection", SSatlas.current_sector.lore_radio_stations, current_station) + if(picked_station) + current_station = picked_station + if(!receiving) + toggle_receiving(user) + else + audible_message("[src] only emits white noise...") + +/obj/item/lore_radio/AltClick(var/mob/user) + toggle_receiving(user) + +/obj/item/lore_radio/proc/toggle_receiving(var/mob/user) + if(!receiving) + receiving = TRUE + if(user) + user.visible_message("[user] flicks \the [src] on.", SPAN_NOTICE("You flick \the [src] on."), range = 3) + else + receiving = FALSE + if(user) + user.visible_message("[user] flicks \the [src] off.", SPAN_NOTICE("You flick \the [src] off."), range = 3) + +/obj/item/lore_radio/proc/relay_lore_radio(var/datum/source, var/radio_station, var/radio_message) + SIGNAL_HANDLER + + if(!receiving || radio_station != current_station) + return + + var/displayed_message = radio_message ? "[src.name] transmits, \"[radio_message]\"" : "[src] only emits white noise..." + audible_message(displayed_message) + if(radio_message) + var/list/hearers = get_hearers_in_view(7, src) + var/list/clients_in_hearers = list() + for(var/mob/mob in hearers) + if(mob.client) + clients_in_hearers += mob.client + if(length(clients_in_hearers)) + INVOKE_ASYNC(src, TYPE_PROC_REF(/atom/movable, animate_chat), radio_message, null, FALSE, clients_in_hearers, 2 SECONDS) diff --git a/code/game/objects/items/weapons/storage/wallets.dm b/code/game/objects/items/weapons/storage/wallets.dm index 364c4ce8d9f..80244475256 100644 --- a/code/game/objects/items/weapons/storage/wallets.dm +++ b/code/game/objects/items/weapons/storage/wallets.dm @@ -38,7 +38,9 @@ /obj/item/storage/business_card_holder, /obj/item/sample, /obj/item/key, - /obj/item/sign/painting_frame + /obj/item/sign/painting_frame, + /obj/item/clothing/accessory/dominia/tic/retired, + /obj/item/clothing/accessory/dominia/tic/retired/caladius ) slot_flags = SLOT_ID build_from_parts = TRUE diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index bfb33490395..52a8887900f 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -36,7 +36,7 @@ STOP_PROCESSING(SSprocessing, src) return ..() -/obj/Topic(href, href_list, var/datum/ui_state/state = default_state) +/obj/Topic(href, href_list, var/datum/ui_state/state = GLOB.default_state) if(..()) return 1 diff --git a/code/game/objects/random/misc.dm b/code/game/objects/random/misc.dm index 31d3e8a326f..f5d33e6a945 100644 --- a/code/game/objects/random/misc.dm +++ b/code/game/objects/random/misc.dm @@ -431,9 +431,9 @@ return /obj/item/tank/emergency_oxygen/double /obj/random/pottedplant - name = "random potted plant" + name = "random potted plant, big" desc = "Spawns a random potted plant." - icon = 'icons/obj/plants.dmi' + icon = 'icons/obj/pottedplants_big.dmi' icon_state = "plant-26" spawn_nothing_percentage = 1 @@ -453,3 +453,25 @@ if(P in unwanted || ((P in rare) && prob(50))) P = null . = new P(loc) + +/obj/random/pottedplant_small + name = "random potted plant, small" + desc = "Spawns a random potted plant." + icon = 'icons/obj/pottedplants_small.dmi' + icon_state = "plant-01" + spawn_nothing_percentage = 1 + +/obj/random/pottedplant_small/spawn_item() + var/obj/item/flora/pottedplant_small/P = null + var/list/unwanted = list( + /obj/item/flora/pottedplant_small, // don't want parent base obj + /obj/item/flora/pottedplant_small/empty + ) + var/list/rare = list( + /obj/item/flora/pottedplant_small/dead + ) + while(!P) + P = pick(typesof(/obj/item/flora/pottedplant_small)) + if(P in unwanted || ((P in rare) && prob(50))) + P = null + . = new P(loc) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm index fa9aa96a153..dee9c85f3c4 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm @@ -95,10 +95,15 @@ new /obj/item/reagent_containers/food/condiment/sugar(src) /obj/structure/closet/secure_closet/freezer/kois + name = "freezer" + desc = "A freezer, painted in a sickly yellow, with a biohazard sign on the door." + icon_state = "freezer_kois" + +/obj/structure/closet/secure_closet/freezer/kois/spores name = "k'ois freezer" - desc = "A freezer with k'ois inside. Don't eat this unless you're a Vaurca!" + desc = "A freezer with k'ois inside. Painted in a sickly yellow, with a biohazard sign on the door." -/obj/structure/closet/secure_closet/freezer/kois/fill() +/obj/structure/closet/secure_closet/freezer/kois/spores/fill() ..() for(var/i = 0, i < 8, i++) new /obj/item/reagent_containers/food/snacks/grown/kois(src) diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index edb6b2228be..608eeb63cfe 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -345,15 +345,29 @@ newgas.temperature = target_temp return newgas -/obj/structure/closet/crate/freezer/rations //For use in the escape shuttle +/obj/structure/closet/crate/freezer/rations name = "emergency rations" - desc = "A crate of emergency rations and some bottles of water." + desc = "A crate of emergency rations and bottles of water." /obj/structure/closet/crate/freezer/rations/fill() for(var/i=1,i<=6,i++) new /obj/random/mre(src) new /obj/item/reagent_containers/food/drinks/waterbottle(src) +/obj/structure/closet/crate/freezer/kois + name = "freezer" + desc = "A freezer, painted in a sickly yellow, with a biohazard sign on the side." + icon_state = "freezer_kois" + +/obj/structure/closet/crate/freezer/kois/rations + name = "emergency k'ois rations" + desc = "A crate of emergency k'ois rations and bottles of water. Painted in a sickly yellow, with a biohazard sign on the side." + +/obj/structure/closet/crate/freezer/kois/rations/fill() + for(var/i=1,i<=6,i++) + new /obj/item/storage/box/fancy/mre/menu12(src) + new /obj/item/reagent_containers/food/drinks/waterbottle(src) + /obj/structure/closet/crate/bin name = "large bin" desc = "A large bin." diff --git a/code/game/objects/structures/flags_banners.dm b/code/game/objects/structures/flags_banners.dm index 8dd09bc8aee..33d16ab4976 100644 --- a/code/game/objects/structures/flags_banners.dm +++ b/code/game/objects/structures/flags_banners.dm @@ -3111,3 +3111,41 @@ /obj/structure/sign/flag/scarab/large/west/Initialize(mapload) . = ..(mapload, WEST) + +// Callisto + +/obj/item/flag/callisto + name = "\improper Callistean flag" + desc = "The flag of the Commonwealth of Callisto, the gateway to Sol and its largest port." + flag_path = "callisto" + flag_structure = /obj/structure/sign/flag/callisto + +/obj/structure/sign/flag/callisto + name = "\improper Callistean flag" + desc = "The flag of the Commonwealth of Callisto, the gateway to Sol and its largest port." + flag_path = "callisto" + icon_state = "callisto" + flag_item = /obj/item/flag/callisto + +/obj/item/flag/callisto/l + name = "large Callistean flag" + flag_size = TRUE + flag_structure = /obj/structure/sign/flag/callisto/large + +/obj/structure/sign/flag/callisto/large + icon_state = "callisto_l" + flag_path = "callisto" + flag_size = TRUE + flag_item = /obj/item/flag/callisto/l + +/obj/structure/sign/flag/callisto/large/north/Initialize(mapload) + . = ..(mapload, NORTH) + +/obj/structure/sign/flag/callisto/large/south/Initialize(mapload) + . = ..(mapload, SOUTH) + +/obj/structure/sign/flag/callisto/large/east/Initialize(mapload) + . = ..(mapload, EAST) + +/obj/structure/sign/flag/callisto/large/west/Initialize(mapload) + . = ..(mapload, WEST) diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index cadd924a155..13d3ed83bf9 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -42,7 +42,7 @@ if(ishuman(user)) var/mob/living/carbon/human/H = user - H.change_appearance(APPEARANCE_ALL_HAIR, H, FALSE, ui_state = default_state, state_object = src) + H.change_appearance(APPEARANCE_ALL_HAIR, H, FALSE, ui_state = GLOB.default_state, state_object = src) /obj/structure/mirror/proc/shatter() if(shattered) return @@ -185,4 +185,4 @@ if(ishuman(user)) var/mob/living/carbon/human/H = user - H.change_appearance(APPEARANCE_HAIR, H, FALSE, ui_state = default_state, state_object = src) + H.change_appearance(APPEARANCE_HAIR, H, FALSE, ui_state = GLOB.default_state, state_object = src) diff --git a/code/game/objects/structures/under_wardrobe.dm b/code/game/objects/structures/under_wardrobe.dm index 1242d9f9361..2ddde93d74f 100644 --- a/code/game/objects/structures/under_wardrobe.dm +++ b/code/game/objects/structures/under_wardrobe.dm @@ -72,7 +72,7 @@ if(!UWC) return var/datum/category_item/underwear/selected_underwear = tgui_input_list(H, "Choose your underwear.", "Choose Underwear", UWC.items, H.all_underwear[UWC.name]) - if(selected_underwear && CanUseTopic(H, default_state)) + if(selected_underwear && CanUseTopic(H, GLOB.default_state)) H.all_underwear[UWC.name] = selected_underwear H.hide_underwear[UWC.name] = FALSE . = TRUE diff --git a/code/game/objects/structures/urban.dm b/code/game/objects/structures/urban.dm index 959111ca8fd..b1483185de9 100644 --- a/code/game/objects/structures/urban.dm +++ b/code/game/objects/structures/urban.dm @@ -68,22 +68,54 @@ desc = "This sign indicates this crossing street is called [street_name]." /obj/structure/stairs/urban + abstract_type = /obj/structure/stairs/urban icon = 'icons/obj/structure/urban/ledges.dmi' icon_state = "stairs-single" layer = 2.01 opacity = 1 +/obj/structure/stairs/urban/right + dir = EAST + bound_width = 64 + bound_x = -32 + +/obj/structure/stairs/urban/left + dir = WEST + bound_width = 64 + +/obj/structure/stairs/urban/north + dir = NORTH + bound_height = 64 + bound_y = -32 + +/obj/structure/stairs/urban/south + dir = SOUTH + bound_height = 64 + /obj/structure/stairs/urban/road_ramp name = "inclined asphalt ramp" desc = "A solid asphalt ramp to allow your vehicle to traverse inclines with ease." icon_state = "road-ramp-center" layer = 2.02 + abstract_type = /obj/structure/stairs/urban/road_ramp /obj/structure/stairs/urban/road_ramp/right - icon_state = "road-ramp-right" + dir = EAST + bound_width = 64 + bound_x = -32 /obj/structure/stairs/urban/road_ramp/left - icon_state = "road-ramp-left" + dir = WEST + bound_width = 64 + +/obj/structure/stairs/urban/road_ramp/north + dir = NORTH + bound_height = 64 + bound_y = -32 + +/obj/structure/stairs/urban/road_ramp/south + dir = SOUTH + bound_height = 64 /obj/structure/closet/crate/bin/urban name = "tall garbage can" diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index 0fd90a94623..2ec0fe0f6cc 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -54,7 +54,7 @@ msg = process_chat_markup(msg, list("*")) for(var/client/target in GLOB.clients) - if(target.prefs.toggles & CHAT_OOC) + if(target.prefs?.toggles & CHAT_OOC) var/display_name = src.key if(holder) if(holder.fakekey) diff --git a/code/modules/acting/acting_items.dm b/code/modules/acting/acting_items.dm index 73c1aa4c408..0e059213996 100644 --- a/code/modules/acting/acting_items.dm +++ b/code/modules/acting/acting_items.dm @@ -28,7 +28,7 @@ if(!istype(H)) return - H.change_appearance(APPEARANCE_ALL, H, TRUE, H.generate_valid_species(), null, ui_state = default_state, state_object = src, update_id = TRUE) + H.change_appearance(APPEARANCE_ALL, H, TRUE, H.generate_valid_species(), null, ui_state = GLOB.default_state, state_object = src, update_id = TRUE) var/getName = sanitizeName(sanitize_readd_odd_symbols(sanitize(input(H, "Would you like to change your name to something else?", "Name change") as null|text))) if(getName) H.real_name = getName diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 7c8c0c554a3..c7b34dd7754 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -493,6 +493,8 @@ var/list/admin_verbs_cciaa = list( ) /client/proc/add_admin_verbs() + SHOULD_NOT_SLEEP(TRUE) + if(holder) add_verb(src, admin_verbs_default) if(holder.rights & R_BUILDMODE) add_verb(src, /client/proc/togglebuildmodeself) diff --git a/code/modules/admin/verbs/SDQL_2.dm b/code/modules/admin/verbs/SDQL_2.dm index 8b82ee6a6ab..cb59138ccf5 100644 --- a/code/modules/admin/verbs/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL_2.dm @@ -431,8 +431,8 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/sdql2_vv_all, new(null L[++L.len] = list("[id] ", "[delete_click.update("DELETE QUERY | STATE : [text_state()] | ALL/ELIG/FIN \ [islist(obj_count_all)? length(obj_count_all) : (isnull(obj_count_all)? "0" : obj_count_all)]/\ [islist(obj_count_eligible)? length(obj_count_eligible) : (isnull(obj_count_eligible)? "0" : obj_count_eligible)]/\ - [islist(obj_count_finished)? length(obj_count_finished) : (isnull(obj_count_finished)? "0" : obj_count_finished)] - [get_query_text()]")]", ref(delete_click)) - L[++L.len] = list(" ", "[action_click.update("[SDQL2_IS_RUNNING? "HALT" : "RUN"]")]", ref(action_click)) + [islist(obj_count_finished)? length(obj_count_finished) : (isnull(obj_count_finished)? "0" : obj_count_finished)] - [get_query_text()]")]", REF(delete_click)) + L[++L.len] = list(" ", "[action_click.update("[SDQL2_IS_RUNNING? "HALT" : "RUN"]")]", REF(action_click)) return L /datum/sdql2_query/proc/delete_click() @@ -696,7 +696,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/sdql2_vv_all, new(null obj_count_finished = select_refs for(var/i in found) SDQL_print(i, text_list, print_nulls) - select_refs[ref(i)] = TRUE + select_refs[REF(i)] = TRUE SDQL2_TICK_CHECK SDQL2_HALT_CHECK select_text = text_list @@ -717,7 +717,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/sdql2_vv_all, new(null /datum/sdql2_query/proc/SDQL_print(object, list/text_list, print_nulls = TRUE) if(isdatum(object)) - text_list += "[ref(object)] : [object]" + text_list += "[REF(object)] : [object]" if(istype(object, /atom)) var/atom/A = object var/turf/T = A.loc diff --git a/code/modules/admin/verbs/warning.dm b/code/modules/admin/verbs/warning.dm index 498cc1316b1..64b8023ccb5 100644 --- a/code/modules/admin/verbs/warning.dm +++ b/code/modules/admin/verbs/warning.dm @@ -272,10 +272,12 @@ return data -/* +/** * A proc used to gather if someone has Unacknowledged Warnings */ /client/proc/fetch_unacked_warning_count() + SHOULD_NOT_SLEEP(TRUE) + if (!GLOB.dbcon) return if (!establish_db_connection(GLOB.dbcon)) diff --git a/code/modules/awaymissions/bluespaceartillery.dm b/code/modules/awaymissions/bluespaceartillery.dm index 994750cbcd0..4b874d77175 100644 --- a/code/modules/awaymissions/bluespaceartillery.dm +++ b/code/modules/awaymissions/bluespaceartillery.dm @@ -23,7 +23,7 @@ onclose(user, "scroll") return -/obj/machinery/computer/artillerycontrol/Topic(href, href_list, var/datum/ui_state/state = default_state) +/obj/machinery/computer/artillerycontrol/Topic(href, href_list, var/datum/ui_state/state = GLOB.default_state) if(..()) return 1 diff --git a/code/modules/background/space_sectors/coalition.dm b/code/modules/background/space_sectors/coalition/coalition.dm similarity index 92% rename from code/modules/background/space_sectors/coalition.dm rename to code/modules/background/space_sectors/coalition/coalition.dm index 6b6f2490b86..aa38b388cd5 100644 --- a/code/modules/background/space_sectors/coalition.dm +++ b/code/modules/background/space_sectors/coalition/coalition.dm @@ -72,3 +72,18 @@ sector_welcome_message = 'sound/AI/welcome_konyang.ogg' sector_hud_menu = 'icons/misc/hudmenu/konyang_hud.dmi' sector_hud_arrow = "menu_arrow" + + lobby_tracks = list( + 'sound/music/lobby/konyang/konyang-1.ogg', + 'sound/music/lobby/konyang/konyang-2.ogg', + 'sound/music/lobby/konyang/konyang-3.ogg', + 'sound/music/lobby/konyang/konyang-4.ogg' + ) + + lore_radio_stations = list( + "73.2 Navy Broadcasting Service" = "config/lore_radio/konyang/73.2_Navy_Broadcasting_Service.txt", + "122 Great Blue Dot" = "config/lore_radio/konyang//122_Great_Blue_Dot.txt", + "75.4 PBA" = "config/lore_radio/konyang/75.4_PBA.txt", + "77.7 SoulFM" = "config/lore_radio/konyang/77.7_SoulFM.txt", + "78.1 RealFM" = "config/lore_radio/konyang/78.1_RealFM.txt" + ) diff --git a/code/modules/background/space_sectors/space_sector.dm b/code/modules/background/space_sectors/space_sector.dm index 5c926d64876..4d73ca10019 100644 --- a/code/modules/background/space_sectors/space_sector.dm +++ b/code/modules/background/space_sectors/space_sector.dm @@ -1,3 +1,7 @@ +#define RADIO_BROADCASTS "broadcasts" +#define RADIO_NEXT_BROADCAST "next_broadcast" +#define RADIO_BROADCAST_INDEX "broadcast_index" + /datum/space_sector var/name var/description @@ -12,6 +16,10 @@ "iac" = 1, "zsc" = 1, "vfc" = 1, "bis" = 1, "xmg" = 1, "npi" = 1) //how much the space sector afffects how expensive is ordering from that cargo supplier var/skybox_icon = "ceti" + /// An associated list of lore radio stations formatted like so: list("station name" = "path_to_broadcast.txt") + /// This gets converted into a formatted list after initialization like so: list(RADIO_BROADCASTS = list("stuff"), RADIO_NEXT_BROADCAST = world.time, RADIO_BROADCAST_INDEX = the entry in the list that will be broadcasted) + var/list/lore_radio_stations = null //what radio stations can be heard by the lore radio item here + var/list/sector_lobby_art = null //if this is set, it will override the map lobby icons var/sector_lobby_transitions = null //if this is set, it will override the map lobby transition var/sector_welcome_message = null ///if this is set, it will override welcome audio message @@ -19,6 +27,9 @@ var/sector_hud_menu_sound = null //if this is set, it will override the hud menu click sound var/sector_hud_arrow = null //if this is set, it will use an overlay instead of the animation that makes the button bigger + /// Lobby music overrides. + var/list/lobby_tracks + //vars used by the meteor random event var/list/meteors_minor = list( @@ -110,6 +121,60 @@ /obj/effect/meteor/supermatter=1\ ) +/// When SSAtlas chooses us as the current sector, this function is called, which will set us up to start processing +/datum/space_sector/proc/setup_current_sector() + SHOULD_CALL_PARENT(TRUE) + + // For now, i've put processing to only happen if the sector has a radio station + // but if, in the future, you add more stuff for the processor to handle, feel free to move it out of the if block + if(length(lore_radio_stations)) + for(var/station in lore_radio_stations) + var/list/station_broadcasts = file2list(lore_radio_stations[station]) + + var/text_broadcast_index = 1 + for(var/broadcast in station_broadcasts) + // Italics Regex + var/regex/italics_regex = regex("/(.*?)/") + broadcast = replacetext(broadcast, italics_regex, "$1") + + // Random Note Regex + var/randomnote = pick("\u2669", "\u266A", "\u266B") + broadcast = replacetext(broadcast, "\[RANDOMNOTE\]", randomnote) + + station_broadcasts[text_broadcast_index] = broadcast + text_broadcast_index++ + + var/broadcast_length = length(station_broadcasts) + lore_radio_stations[station] = list( + RADIO_BROADCASTS = station_broadcasts, + RADIO_NEXT_BROADCAST = 0, // start ASAP + RADIO_BROADCAST_INDEX = rand(1, broadcast_length) // start randomly in the broadcast so it isn't in the same sequence every time + ) + + START_PROCESSING(SSprocessing, src) + +/datum/space_sector/Destroy(force) + STOP_PROCESSING(SSprocessing, src) + return ..() + +/datum/space_sector/process(seconds_per_tick) + for(var/station in lore_radio_stations) + var/list/broadcast_info = lore_radio_stations[station] + if(world.time < broadcast_info[RADIO_NEXT_BROADCAST]) + continue + + var/broadcast_index = broadcast_info[RADIO_BROADCAST_INDEX] + var/broadcast_message = broadcast_info[RADIO_BROADCASTS][broadcast_index] + + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_LORE_RADIO_BROADCAST, station, broadcast_message) + + if(broadcast_index == length(broadcast_info[RADIO_BROADCASTS])) + broadcast_info[RADIO_BROADCAST_INDEX] = 1 + broadcast_info[RADIO_NEXT_BROADCAST] = world.time + 30 SECONDS // give it a bit of a breather if we've exhausted all the messages + else + broadcast_info[RADIO_BROADCAST_INDEX]++ + broadcast_info[RADIO_NEXT_BROADCAST] = world.time + (rand(6, 10) SECONDS) // otherwise, throw in a randomish delay (considering we're on SSprocessing, it'll uusssuaaalllyyy be about 2 seconds at minimum) + /datum/space_sector/proc/get_chat_description() return "
Current Sector: [name]!
[description]
" @@ -127,3 +192,10 @@ if(name in away_site.sectors) away_sites += away_site return away_sites + +/datum/space_sector/proc/lore_radio_message(/obj/item/R, chosen_station) //used for the lore radio in lore_radio.dm. + return + +#undef RADIO_BROADCASTS +#undef RADIO_NEXT_BROADCAST +#undef RADIO_BROADCAST_INDEX diff --git a/code/modules/balloon_alert/balloon_alert.dm b/code/modules/balloon_alert/balloon_alert.dm index 9d5172951dc..02150772e53 100644 --- a/code/modules/balloon_alert/balloon_alert.dm +++ b/code/modules/balloon_alert/balloon_alert.dm @@ -20,7 +20,7 @@ var/list/hearers = UNLINT(get_hearers_in_view(vision_distance, src)) hearers -= ignored_mobs - for(var/mob/hearer as anything in hearers - src) + for(var/mob/hearer in hearers - src) if(hearer.is_blind()) continue balloon_alert(hearer, message) diff --git a/code/modules/cargo/bounties/chef.dm b/code/modules/cargo/bounties/chef.dm index 03524b5f76e..e1ca9260569 100644 --- a/code/modules/cargo/bounties/chef.dm +++ b/code/modules/cargo/bounties/chef.dm @@ -234,7 +234,9 @@ /obj/item/reagent_containers/food/snacks/sliceable/grilled_carp, /obj/item/reagent_containers/food/snacks/sliceable/sushi_roll, /obj/item/reagent_containers/food/snacks/stuffed_meatball, - /obj/item/reagent_containers/food/snacks/chilied_eggs) + /obj/item/reagent_containers/food/snacks/chilied_eggs, + /obj/item/reagent_containers/food/snacks/sliceable/eyebowl, + /obj/item/reagent_containers/food/snacks/hatchbowl) /datum/bounty/item/chef/tajara name = "Adhomai Delicacies" diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 86bdd3ebd68..68dabd008b4 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -398,23 +398,32 @@ var/list/localhost_addresses = list( src.InitPrefs() mob.LateLogin() - /// This spawn is the only thing keeping the stat panels and chat working. By removing this spawn, there will be black screens when loading the game. - /// It seems to be affected by the order of statpanel init: if it happens before send_resources(), then the statpanels won't load, but the game won't - /// blackscreen. - spawn(0) - // Initialize stat panel - stat_panel.initialize( - inline_html = file("html/statbrowser.html"), - inline_js = file("html/statbrowser.js"), - inline_css = file("html/statbrowser.css"), - ) - addtimer(CALLBACK(src, PROC_REF(check_panel_loaded)), 30 SECONDS) + // Initialize stat panel + stat_panel.initialize( + inline_html = file("html/statbrowser.html"), + inline_js = file("html/statbrowser.js"), + inline_css = file("html/statbrowser.css"), + ) + addtimer(CALLBACK(src, PROC_REF(check_panel_loaded)), 30 SECONDS) // Initialize tgui panel tgui_panel.initialize() + tgui_say.initialize() + // Forcibly enable hardware-accelerated graphics, as we need them for the lighting overlays. + winset(src, null, "command=\".configure graphics-hwmode on\"") + + send_resources() + + if(!winexists(src, "asset_cache_browser")) // The client is using a custom skin, tell them. + to_chat(src, SPAN_WARNING("Unable to access asset cache browser, if you are using a custom skin file, please allow DS to download the updated version, if you are not, then make a bug report. This is not a critical issue but can cause issues with resource downloading, as it is impossible to know when extra resources arrived to you.")) + + Master.UpdateTickRate() + /client/proc/InitPrefs() + SHOULD_NOT_SLEEP(TRUE) + //preferences datum - also holds some persistant data for the client (because we may as well keep these datums to a minimum) prefs = preferences_datums[ckey] if(!prefs) @@ -432,7 +441,9 @@ var/list/localhost_addresses = list( toggle_fullscreen(TRUE) /client/proc/InitClient() - to_chat(src, "If the title screen is black, resources are still downloading. Please be patient until the title screen appears.") + SHOULD_NOT_SLEEP(TRUE) + + to_chat_immediate(src, SPAN_ALERT("If the title screen is black, resources are still downloading. Please be patient until the title screen appears.")) var/local_connection = (GLOB.config.auto_local_admin && !GLOB.config.use_forumuser_api && (isnull(address) || localhost_addresses[address])) // Automatic admin rights for people connecting locally. @@ -450,13 +461,13 @@ var/list/localhost_addresses = list( log_client_to_db() if (byond_version < GLOB.config.client_error_version) - to_chat(src, "Your version of BYOND is too old!") - to_chat(src, GLOB.config.client_error_message) - to_chat(src, "Your version: [byond_version].") - to_chat(src, "Required version: [GLOB.config.client_error_version] or later.") - to_chat(src, "Visit http://www.byond.com/download/ to get the latest version of BYOND.") + to_chat_immediate(src, "Your version of BYOND is too old!") + to_chat_immediate(src, GLOB.config.client_error_message) + to_chat_immediate(src, "Your version: [byond_version].") + to_chat_immediate(src, "Required version: [GLOB.config.client_error_version] or later.") + to_chat_immediate(src, "Visit http://www.byond.com/download/ to get the latest version of BYOND.") if (holder) - to_chat(src, "Admins get a free pass. However, please update your BYOND as soon as possible. Certain things may cause crashes if you play with your present version.") + to_chat_immediate(src, "Admins get a free pass. However, please update your BYOND as soon as possible. Certain things may cause crashes if you play with your present version.") else log_access("Failed Login: [key] [computer_id] [address] - Outdated BYOND major version: [byond_version].") del(src) @@ -467,7 +478,7 @@ var/list/localhost_addresses = list( if (GLOB.config.access_deny_new_players && player_age == -1) log_access("Failed Login: [key] [computer_id] [address] - New player attempting connection during panic bunker.", ckey = ckey) message_admins("Failed Login: [key] [computer_id] [address] - New player attempting connection during panic bunker.") - to_chat(src, "Apologies, but the server is currently not accepting connections from never before seen players.") + to_chat_immediate(src, "Apologies, but the server is currently not accepting connections from never before seen players.") del(src) return 0 @@ -475,7 +486,7 @@ var/list/localhost_addresses = list( if (GLOB.config.access_deny_new_accounts != -1 && account_age != -1 && account_age <= GLOB.config.access_deny_new_accounts) log_access("Failed Login: [key] [computer_id] [address] - Account too young to play. [account_age] days.", ckey = ckey) message_admins("Failed Login: [key] [computer_id] [address] - Account too young to play. [account_age] days.") - to_chat(src, "Apologies, but the server is currently not accepting connections from BYOND accounts this young.") + to_chat_immediate(src, "Apologies, but the server is currently not accepting connections from BYOND accounts this young.") del(src) return 0 @@ -485,11 +496,6 @@ var/list/localhost_addresses = list( if(holder) add_admin_verbs() - // Forcibly enable hardware-accelerated graphics, as we need them for the lighting overlays. - winset(src, null, "command=\".configure graphics-hwmode on\"") - - send_resources() - check_ip_intel() fetch_unacked_warning_count() @@ -500,14 +506,30 @@ var/list/localhost_addresses = list( //DISCONNECT// ////////////// /client/Del() + if(!gc_destroyed) + gc_destroyed = world.time + if (!QDELING(src)) + stack_trace("Client does not purport to be QDELING, this is going to cause bugs in other places!") + + Destroy() + return ..() + +/client/Destroy(force) GLOB.ticket_panels -= src - if(holder) - holder.owner = null GLOB.staff -= src GLOB.directory -= ckey GLOB.clients -= src - return ..() + if(holder) + holder.owner = null + GLOB.staff -= src + SSping.currentrun -= src + + QDEL_NULL(tooltips) + + Master.UpdateTickRate() + ..() //Even though we're going to be hard deleted there are still some things that want to know the destroy is happening + return QDEL_HINT_HARDDEL_NOW // here because it's similar to below @@ -526,6 +548,8 @@ var/list/localhost_addresses = list( return -1 /client/proc/log_client_to_db() + set waitfor = FALSE + if (IsGuestKey(src.key)) return diff --git a/code/modules/client/preference_setup/loadout/gear_tweaks.dm b/code/modules/client/preference_setup/loadout/gear_tweaks.dm index 2381e06b6f9..7df536d4f4c 100644 --- a/code/modules/client/preference_setup/loadout/gear_tweaks.dm +++ b/code/modules/client/preference_setup/loadout/gear_tweaks.dm @@ -234,7 +234,9 @@ Reagents adjustment . = valid_reagents[pick(valid_reagents)] else . = valid_reagents[metadata] - I.reagents.add_reagent(., REAGENTS_FREE_SPACE(I.reagents)) + + if(!isnull(.)) + I.reagents.add_reagent(., REAGENTS_FREE_SPACE(I.reagents)) /* Custom Name diff --git a/code/modules/client/preference_setup/loadout/items/augments.dm b/code/modules/client/preference_setup/loadout/items/augments.dm index 9a965f93a28..43a5e146e5d 100644 --- a/code/modules/client/preference_setup/loadout/items/augments.dm +++ b/code/modules/client/preference_setup/loadout/items/augments.dm @@ -247,3 +247,11 @@ allowed_roles = list("Physician", "Surgeon", "Chief Medical Officer", "Pharmacist", "First Responder", "Psychiatrist", "Medical Intern", "Corporate Liaison", "Research Director","Scientist", "Xenobiologist", "Xenobotanist", "Xenoarchaeologist", "Lab Assistant", "Assistant", "Off-Duty Crew Member", "Captain", "Medical Personnel", "Science Personnel") cost = 3 +/datum/gear/augment/phalanx_plate + display_name = "phalanx facial plate" + description = "This modular face plate accommodates a wide array of cybernetic augmentations, enabling seamless integration with Phalanx's transhumanist doctrine. Enhanced sensory overlays and HUDs offer Phalanx members superior situational awareness and promote a sense of hive-thinking." + path = /obj/item/organ/internal/augment/eye_sensors/phalanx + whitelisted = list(SPECIES_HUMAN, SPECIES_HUMAN_OFFWORLD, SPECIES_VAURCA_WORKER, SPECIES_VAURCA_WARRIOR, SPECIES_VAURCA_BULWARK, SPECIES_TAJARA, SPECIES_TAJARA_ZHAN, SPECIES_TAJARA_MSAI, SPECIES_SKRELL, SPECIES_SKRELL_AXIORI) + allowed_roles = list("Physician", "Surgeon", "Chief Medical Officer", "Pharmacist", "First Responder", "Psychiatrist", "Medical Intern", "Medical Personnel", "Security Officer", "Head of Security", "Warden", "Security Cadet", "Investigator", "Security Personnel", "Corporate Liaison", "Assistant", "Off-Duty Crew Member", "Captain") + faction = "Private Military Contracting Group" + cost = 1 diff --git a/code/modules/client/preference_setup/loadout/items/eyes.dm b/code/modules/client/preference_setup/loadout/items/eyes.dm index b9402ab1389..7d89be2732b 100644 --- a/code/modules/client/preference_setup/loadout/items/eyes.dm +++ b/code/modules/client/preference_setup/loadout/items/eyes.dm @@ -12,7 +12,7 @@ /datum/gear/eyes/glasses display_name = "glasses selection" - description = "A selection of glasses." + description = "A selection of prescription glasses." path = /obj/item/clothing/glasses/regular /datum/gear/eyes/glasses/New() @@ -23,8 +23,10 @@ glasses["glasses, circle"] = /obj/item/clothing/glasses/regular/circle glasses["glasses, jamjar"] = /obj/item/clothing/glasses/regular/jamjar glasses["glasses, monocle"] = /obj/item/clothing/glasses/monocle - glasses["glasses, safety"] = /obj/item/clothing/glasses/safety - glasses["glasses, safety (prescription)"] = /obj/item/clothing/glasses/safety/prescription + glasses["glasses, safety"] = /obj/item/clothing/glasses/safety/prescription + glasses["glasses, pince-nez"] = /obj/item/clothing/glasses/regular/pincenez + glasses["glasses, panto"] = /obj/item/clothing/glasses/regular/panto + glasses["contact lenses"] = /obj/item/clothing/glasses/regular/contacts gear_tweaks += new /datum/gear_tweak/path(glasses) /datum/gear/eyes/fakesunglasses @@ -87,6 +89,8 @@ medhud["HUDpatch, medical"] = /obj/item/clothing/glasses/eyepatch/hud/medical medhud["prescription HUD, medical"] = /obj/item/clothing/glasses/hud/health/prescription medhud["visor sunglasses, medical"] = /obj/item/clothing/glasses/hud/health/aviator/visor + medhud["pincenez, medical"] = /obj/item/clothing/glasses/hud/health/aviator/pincenez + medhud["panto, medical"] = /obj/item/clothing/glasses/hud/health/aviator/panto gear_tweaks += new /datum/gear_tweak/path(medhud) /datum/gear/eyes/sechuds @@ -105,6 +109,8 @@ sechud["HUDpatch, security"] = /obj/item/clothing/glasses/eyepatch/hud/security sechud["prescription HUD, security"] = /obj/item/clothing/glasses/hud/security/prescription sechud["visor sunglasses, security"] = /obj/item/clothing/glasses/sunglasses/sechud/aviator/visor + sechud["pincenez, security"] = /obj/item/clothing/glasses/sunglasses/sechud/aviator/pincenez + sechud["panto, security"] = /obj/item/clothing/glasses/sunglasses/sechud/aviator/panto gear_tweaks += new /datum/gear_tweak/path(sechud) /datum/gear/eyes/hudpatch diff --git a/code/modules/client/preference_setup/loadout/items/general.dm b/code/modules/client/preference_setup/loadout/items/general.dm index cf26f4c2973..631dbc7c758 100644 --- a/code/modules/client/preference_setup/loadout/items/general.dm +++ b/code/modules/client/preference_setup/loadout/items/general.dm @@ -247,6 +247,7 @@ banners["banner, Svarog"] = /obj/item/flag/svarog banners["banner, Empyrean"] = /obj/item/flag/empyrean banners["banner, Traditinalist Coalition"] = /obj/item/flag/traditionalist + banners["banner, Callisto"] = /obj/item/flag/callisto gear_tweaks += new /datum/gear_tweak/path(banners) /datum/gear/standard @@ -331,6 +332,7 @@ flags["flag, Svarog"] = /obj/item/flag/svarog/l flags["flag, Empyrean"] = /obj/item/flag/empyrean/l flags["flag, Traditionalist Coalition"] = /obj/item/flag/traditionalist/l + flags["flag, Callisto"] = /obj/item/flag/callisto/l gear_tweaks += new /datum/gear_tweak/path(flags) /datum/gear/towel @@ -424,3 +426,7 @@ instruments["violin"] = /obj/item/device/synthesized_instrument/violin instruments["Omnitrumpet"] = /obj/item/device/synthesized_instrument/trumpet gear_tweaks += new /datum/gear_tweak/path(instruments) + +/datum/gear/lore_radio + display_name = "analog radio" + path = /obj/item/lore_radio diff --git a/code/modules/client/preference_setup/loadout/items/religion.dm b/code/modules/client/preference_setup/loadout/items/religion.dm index 0b2e6ddad13..5c9bec30f8d 100644 --- a/code/modules/client/preference_setup/loadout/items/religion.dm +++ b/code/modules/client/preference_setup/loadout/items/religion.dm @@ -69,6 +69,11 @@ path = /obj/item/clothing/accessory/rosary slot = slot_tie +/datum/gear/religion/scapular + display_name = "scapular" + path = /obj/item/clothing/accessory/scapular + slot = slot_tie + /datum/gear/religion/crucifix display_name = "crucifix selection" description = "A selection of different crucifixes, commonly associated with Christianity." diff --git a/code/modules/client/preference_setup/loadout/items/xeno/tajara.dm b/code/modules/client/preference_setup/loadout/items/xeno/tajara.dm index 921db40c2ce..29c4d167147 100644 --- a/code/modules/client/preference_setup/loadout/items/xeno/tajara.dm +++ b/code/modules/client/preference_setup/loadout/items/xeno/tajara.dm @@ -116,7 +116,7 @@ display_name = "PRA medical coat" path = /obj/item/clothing/suit/storage/toggle/labcoat/tajaran whitelisted = list(SPECIES_TAJARA, SPECIES_TAJARA_ZHAN, SPECIES_TAJARA_MSAI) - allowed_roles = list("Chief Medical Officer", "Physician", "Surgeon", "Chemist", "First Responder", "Medical Intern", "Medical Personnel") + allowed_roles = list("Chief Medical Officer", "Physician", "Surgeon", "Pharmacist", "First Responder", "Medical Intern", "Medical Personnel") sort_category = "Xenowear - Tajara" /datum/gear/suit/tajaran_surgeon diff --git a/code/modules/client/preference_setup/loadout/items/xeno/unathi.dm b/code/modules/client/preference_setup/loadout/items/xeno/unathi.dm index 998910b4d92..613266fa929 100644 --- a/code/modules/client/preference_setup/loadout/items/xeno/unathi.dm +++ b/code/modules/client/preference_setup/loadout/items/xeno/unathi.dm @@ -230,7 +230,7 @@ culture_restriction = list(/singleton/origin_item/culture/autakh) sort_category = "Xenowear - Unathi" cost = 2 - allowed_roles = list("Chief Medical Officer", "Physician", "Surgeon", "First Responder", "Medical Intern", "Psychiatrist", "Chemist", "Medical Personnel") + allowed_roles = list("Chief Medical Officer", "Physician", "Surgeon", "First Responder", "Medical Intern", "Psychiatrist", "Pharmacist", "Medical Personnel") flags = GEAR_NO_SELECTION /datum/gear/augment/autakh_security diff --git a/code/modules/client/preference_setup/loadout/items/xeno/vaurca.dm b/code/modules/client/preference_setup/loadout/items/xeno/vaurca.dm index a69846d5604..c9538eac121 100644 --- a/code/modules/client/preference_setup/loadout/items/xeno/vaurca.dm +++ b/code/modules/client/preference_setup/loadout/items/xeno/vaurca.dm @@ -283,7 +283,7 @@ path = /obj/item/organ/external/hand/right/vaurca/medical whitelisted = list(SPECIES_VAURCA_WARRIOR, SPECIES_VAURCA_WORKER) sort_category = "Xenowear - Vaurca" - allowed_roles = list("Physician", "Surgeon", "First Responder", "Medical Intern", "Psychiatrist", "Chemist", "Medical Personnel") + allowed_roles = list("Physician", "Surgeon", "First Responder", "Medical Intern", "Psychiatrist", "Pharmacist", "Medical Personnel") flags = GEAR_NO_SELECTION /datum/gear/augment/vaurcamag diff --git a/code/modules/clothing/factions/dominia.dm b/code/modules/clothing/factions/dominia.dm index 70752785a27..6a2f80181bf 100644 --- a/code/modules/clothing/factions/dominia.dm +++ b/code/modules/clothing/factions/dominia.dm @@ -684,6 +684,9 @@ name = "retired tribunal investigator card" desc = "A silver-gilded card given to those who have since retired from the Tribunal Investigations Constabulary, otherwise known as TIC. \ This card holds a sleek grey coloration strip, denoting the owner as having been a standard investigator." + desc_extended = "The day-to-day work of investigating religious crimes and violations falls upon the shoulders of the people who fill the \ + ranks of the Tribunal Investigation Constabulary. These investigators often collaborate with and work alongside the nominally secular \ + His Imperial Majesty's Constable Service (HIMCS), the Empire's main policing agency." icon_state = "tic_card_ret" item_state = "tic_card_ret" @@ -691,6 +694,9 @@ name = "retired tribunal investigator card" desc = "A silver-gilded card given to those who have since retired from the Tribunal Investigations Constabulary, otherwise known as TIC. \ This card holds a color strip of House Caladius, denoting the owner as a priest of the Tribunal." + desc_extended = "The day-to-day work of investigating religious crimes and violations falls upon the shoulders of the people who fill the \ + ranks of the Tribunal Investigation Constabulary. These investigators often collaborate with and work alongside the nominally secular \ + His Imperial Majesty's Constable Service (HIMCS), the Empire's main policing agency." icon_state = "tic_card_ret_alt" item_state = "tic_card_ret_alt" diff --git a/code/modules/clothing/factions/einstein.dm b/code/modules/clothing/factions/einstein.dm index 26746386549..af2236f452a 100644 --- a/code/modules/clothing/factions/einstein.dm +++ b/code/modules/clothing/factions/einstein.dm @@ -5,3 +5,16 @@ icon_state = "einstein" item_state = "einstein" contained_sprite = TRUE + +/obj/item/clothing/under/rank/einstein/synthetic + name = "einstein synthetic utility uniform" + desc = "A standardized uniform worn by Einstein Engines Synthetics in non-public-facing roles. \ + The acronym \"EES\" is emblazoned on the chest and upper back." + desc_extended = "Light as air, electrically insulated, and specially fitted to ensure surgical, microelectronic, or \ + what-have-you precision, this expensive multipurpose synthetic worker's outfit feels like wearing a breeze! \ + Synthetics intended to be seen by outsiders to the corporation are likely to wear more conventional clothing instead." + icon = 'icons/clothing/under/uniforms/einstein.dmi' + icon_state = "ees_utility" + item_state = "ees_utility" + siemens_coefficient = 0.75 + permeability_coefficient = 0.75 diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 0e7e34e7f7e..b663c79581e 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -201,6 +201,18 @@ BLIND // can't see anything icon_state = "visor_medhud" item_state = "visor_medhud" +/obj/item/clothing/glasses/hud/health/aviator/pincenez + name = "medical HUD pincenez" + desc = "Modified pincenez glasses with a toggled health HUD. Comes with bonus prescription overlay." + icon_state = "pincenez_med" + item_state = "pincenez_med" + +/obj/item/clothing/glasses/hud/health/aviator/panto + name = "medical HUD panto" + desc = "Modified panto glasses with a toggled health HUD. Comes with bonus prescription overlay." + icon_state = "panto_med" + item_state = "panto_med" + /obj/item/clothing/glasses/science name = "science goggles" desc = "Used to protect your eyes against harmful chemicals!" @@ -480,13 +492,6 @@ BLIND // can't see anything icon_state = "eyepatch_white" item_state = "eyepatch_white" -/obj/item/clothing/glasses/monocle - name = "monocle" - desc = "Such a dapper eyepiece!" - icon_state = "monocle" - item_state = "monocle" - body_parts_covered = 0 - /obj/item/clothing/glasses/material name = "optical material scanner" desc = "Very confusing glasses." @@ -533,6 +538,7 @@ BLIND // can't see anything playsound(src.loc, 'sound/weapons/blade_open.ogg', 50, 1) var/obj/item/clothing/glasses/hud/health/prescription/P = new /obj/item/clothing/glasses/hud/health/prescription(user.loc) P.glasses_type = src.type + P.color = src.color user.put_in_hands(P) qdel(src) if(istype(attacking_item, /obj/item/clothing/glasses/hud/security)) @@ -542,6 +548,7 @@ BLIND // can't see anything playsound(src.loc, 'sound/weapons/blade_open.ogg', 50, 1) var/obj/item/clothing/glasses/hud/security/prescription/P = new /obj/item/clothing/glasses/hud/security/prescription(user.loc) P.glasses_type = src.type + P.color = src.color user.put_in_hands(P) qdel(src) @@ -563,25 +570,58 @@ BLIND // can't see anything desc = "Made by Uncool. Co." icon_state = "hipster_glasses" item_state = "hipster_glasses" + build_from_parts = TRUE + worn_overlay = "lens" /obj/item/clothing/glasses/threedglasses - desc = "A long time ago, people used these glasses to makes images from screens threedimensional." + desc = "A long time ago, people used these glasses to makes images from screens three-dimensional." name = "3D glasses" icon_state = "3d" item_state = "3d" body_parts_covered = 0 + build_from_parts = TRUE + worn_overlay = "lens" /obj/item/clothing/glasses/regular/jamjar name = "jamjar glasses" desc = "Also known as Virginity Protectors." icon_state = "jamjar_glasses" item_state = "jamjar_glasses" + build_from_parts = TRUE + worn_overlay = "lens" /obj/item/clothing/glasses/regular/circle name = "circle glasses" desc = "Why would you wear something so controversial yet so brave?" icon_state = "circle_glasses" item_state = "circle_glasses" + build_from_parts = TRUE + worn_overlay = "lens" + +/obj/item/clothing/glasses/regular/contacts + name = "contact lenses" + desc = "The benefits of sight without the troubles of glasses! Just don't drop them." + icon_state = "contacts" + item_state = "contacts" + +/obj/item/clothing/glasses/regular/pincenez + name = "pince-nez glasses" + desc = "Popularized in the 19th century by French people, evil scientists, and dead people in bathtubs." + icon_state = "pincenez" + item_state = "pincenez" + +/obj/item/clothing/glasses/regular/panto + name = "panto glasses" + desc = "So iconic. So generic. The monobloc chair of the glasses world." + icon_state = "panto" + item_state = "panto" + +/obj/item/clothing/glasses/monocle + name = "monocle" + desc = "Such a dapper eyepiece!" + icon_state = "monocle" + item_state = "monocle" + body_parts_covered = 0 /obj/item/clothing/glasses/aug/glasses name = "corrective lenses" @@ -592,6 +632,8 @@ BLIND // can't see anything body_parts_covered = 0 canremove = FALSE +// Sunglasses + /obj/item/clothing/glasses/sunglasses name = "sunglasses" desc = "Strangely ancient technology used to help provide rudimentary eye cover." @@ -961,6 +1003,18 @@ BLIND // can't see anything icon_state = "visor_sec" item_state = "visor_sec" +/obj/item/clothing/glasses/sunglasses/sechud/aviator/pincenez + name = "security HUD pincenez" + desc = "NanoTrasen security pincenez glasses that can be switched between HUD and flash protection modes. They come with a built-in prescription overlay." + icon_state = "pincenez_sec" + item_state = "pincenez_sec" + +/obj/item/clothing/glasses/sunglasses/sechud/aviator/panto + name = "security HUD panto" + desc = "NanoTrasen security panto glasses that can be switched between HUD and flash protection modes. They come with a built-in prescription overlay." + icon_state = "panto_sec" + item_state = "panto_sec" + /obj/item/clothing/glasses/thermal name = "optical thermal scanner" desc = "Thermals in the shape of glasses." diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index fd64b5a3876..c96d1257d4a 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -64,6 +64,7 @@ to_chat(user, SPAN_NOTICE("You detach a set of medical HUDs from your glasses.")) playsound(src.loc, 'sound/weapons/blade_close.ogg', 50, 1) var/obj/item/clothing/glasses/regular/R = new glasses_type(user.loc) + R.color = src.color user.put_in_hands(R) var/obj/item/clothing/glasses/hud/health/H = new /obj/item/clothing/glasses/hud/health(user.loc) user.put_in_hands(H) @@ -119,6 +120,7 @@ to_chat(user, SPAN_NOTICE("You detach a set of security HUDs from your glasses.")) playsound(src.loc, 'sound/weapons/blade_close.ogg', 50, 1) var/obj/item/clothing/glasses/regular/R = new glasses_type(user.loc) + R.color = src.color user.put_in_hands(R) var/obj/item/clothing/glasses/hud/security/S = new /obj/item/clothing/glasses/hud/security(user.loc) user.put_in_hands(S) diff --git a/code/modules/clothing/spacesuits/rig/modules/computer.dm b/code/modules/clothing/spacesuits/rig/modules/computer.dm index 966fe31c21b..2f1496f8682 100644 --- a/code/modules/clothing/spacesuits/rig/modules/computer.dm +++ b/code/modules/clothing/spacesuits/rig/modules/computer.dm @@ -23,7 +23,7 @@ to_chat(usr, SPAN_WARNING("Your module is not installed in a hardsuit.")) return - module.holder.ui_interact(usr, nano_state = contained_state) + module.holder.ui_interact(usr, nano_state = GLOB.contained_state) /mob var/get_rig_stats = 0 diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index 028166cb990..6b5798ffb2e 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -489,7 +489,7 @@ cell.use(cost*10) return 1 -/obj/item/rig/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/nano_state = inventory_state) +/obj/item/rig/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/nano_state = GLOB.inventory_state) if(!user) return diff --git a/code/modules/clothing/suits/modular_armor.dm b/code/modules/clothing/suits/modular_armor.dm index cb7f39c8c25..12fd5c72038 100644 --- a/code/modules/clothing/suits/modular_armor.dm +++ b/code/modules/clothing/suits/modular_armor.dm @@ -534,8 +534,7 @@ /obj/item/clothing/accessory/flagpatch/europa name = "europa flagpatch" - desc = "A flagpatch representing Europa. It is a common tradition that no one can place the origin of to make these patches out of waterproof fabric then carry \ - them on a dive before displaying them on one's clothes in order to gain good luck." + desc = "A flagpatch representing Europa. It is a common tradition, which nobody really knows the origin of, to make these patches out of waterproof fabric then carry them on a dive, before displaying them on one's own clothes in order to gain good luck." icon_state = "flagpatch_europa" item_state = "flagpatch_europa" diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index 62e339c751d..4792557d707 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -307,71 +307,6 @@ stet.mode_switch(usr) -//Religious items -/obj/item/clothing/accessory/rosary - name = "rosary" - desc = "A form of prayer psalter used in the Catholic Church, with a string of beads attached to it." - icon = 'icons/obj/clothing/chaplain.dmi' - icon_state = "rosary" - overlay_state = "rosary" - flippable = 1 - - slot_flags = SLOT_BELT | SLOT_TIE - - drop_sound = 'sound/items/drop/accessory.ogg' - pickup_sound = 'sound/items/pickup/accessory.ogg' - -/obj/item/clothing/accessory/crucifix - name = "crucifix" - desc = "A small cross on a piece of string. Commonly associated with the Christian faith, it is a main symbol of this religion." - icon = 'icons/clothing/accessories/crucifix.dmi' - contained_sprite = TRUE - -/obj/item/clothing/accessory/crucifix/gold - name = "gold crucifix" - desc = "A small, gold cross on a piece of string. Commonly associated with the Christian faith, it is a main symbol of this religion." - icon_state = "golden_crucifix" - item_state = "golden_crucifix" - -/obj/item/clothing/accessory/crucifix/gold/saint_peter - name = "gold Saint Peter crucifix" - desc = "A small, gold cross on a piece of string. Being inverted and thus upside down marks it as the cross of Saint Peter, a historic Christian symbol \ - which has been re-purposed as a satanic symbol since the 21st century as well." - icon_state = "golden_crucifix_ud" - item_state = "golden_crucifix_ud" - -/obj/item/clothing/accessory/crucifix/silver - name = "silver crucifix" - desc = "A small, silver cross on a piece of string. Commonly associated with the Christian faith, it is a main symbol of this religion." - icon_state = "silver_crucifix" - item_state = "silver_crucifix" - -/obj/item/clothing/accessory/crucifix/silver/saint_peter - name = "silver Saint Peter crucifix" - desc = "A small, silver cross on a piece of string. Being inverted and thus upside down marks it as the cross of Saint Peter, a historic Christian symbol \ - which has been re-purposed as a satanic symbol since the 21st century as well." - icon_state = "silver_crucifix_ud" - item_state = "silver_crucifix_ud" - -/obj/item/clothing/accessory/assunzione - name = "luceian amulet" - desc = "A common symbol of the Luceian faith abroad, this amulet featuring the religion's all-seeing eye and eight-pointed crest \ - seems to be made of real gold and gemstones. While not as critical to faithful abroad as a warding sphere, it is considered good form \ - to ensure one's amulet is well-maintained." - icon = 'icons/clothing/accessories/assunzione_amulet.dmi' - item_state = "assunzione_amulet" - icon_state = "assunzione_amulet" - contained_sprite = TRUE - -/obj/item/clothing/accessory/tallit - name = "tallit" - desc = "A tallit is a fringed garment worn as a prayer shawl by religious Jews. \ - The tallit has special twined and knotted fringes known as tzitzit attached to its four corners." - icon = 'icons/clothing/accessories/Tallit.dmi' - item_state = "tallit" - icon_state = "tallit" - contained_sprite = TRUE - /obj/item/clothing/accessory/suspenders name = "suspenders" desc = "They suspend the illusion of the mime's play." diff --git a/code/modules/clothing/under/accessories/religious.dm b/code/modules/clothing/under/accessories/religious.dm new file mode 100644 index 00000000000..868e054b7dd --- /dev/null +++ b/code/modules/clothing/under/accessories/religious.dm @@ -0,0 +1,76 @@ +//Religious items +/obj/item/clothing/accessory/rosary + name = "rosary" + desc = "A form of prayer psalter used in the Catholic Church, with a string of beads attached to it." + icon = 'icons/obj/clothing/accessory/religious.dmi' + icon_state = "rosary" + overlay_state = "rosary" + flippable = 1 + + slot_flags = SLOT_BELT | SLOT_TIE + + drop_sound = 'sound/items/drop/accessory.ogg' + pickup_sound = 'sound/items/pickup/accessory.ogg' + +/obj/item/clothing/accessory/crucifix + name = "crucifix" + desc = "A small cross on a piece of string. Commonly associated with the Christian faith, it is a main symbol of this religion." + icon = 'icons/obj/clothing/accessory/religious.dmi' + contained_sprite = TRUE + drop_sound = 'sound/items/drop/accessory.ogg' + pickup_sound = 'sound/items/pickup/accessory.ogg' + +/obj/item/clothing/accessory/crucifix/gold + name = "gold crucifix" + desc = "A small, gold cross on a piece of string. Commonly associated with the Christian faith, it is a main symbol of this religion." + icon_state = "golden_crucifix" + item_state = "golden_crucifix" + +/obj/item/clothing/accessory/crucifix/gold/saint_peter + name = "gold Saint Peter crucifix" + desc = "A small, gold cross on a piece of string. Being inverted and thus upside down marks it as the cross of Saint Peter, a historic Christian symbol \ + which has been re-purposed as a satanic symbol since the 21st century as well." + icon_state = "golden_crucifix_ud" + item_state = "golden_crucifix_ud" + +/obj/item/clothing/accessory/crucifix/silver + name = "silver crucifix" + desc = "A small, silver cross on a piece of string. Commonly associated with the Christian faith, it is a main symbol of this religion." + icon_state = "silver_crucifix" + item_state = "silver_crucifix" + +/obj/item/clothing/accessory/crucifix/silver/saint_peter + name = "silver Saint Peter crucifix" + desc = "A small, silver cross on a piece of string. Being inverted and thus upside down marks it as the cross of Saint Peter, a historic Christian symbol \ + which has been re-purposed as a satanic symbol since the 21st century as well." + icon_state = "silver_crucifix_ud" + item_state = "silver_crucifix_ud" + +/obj/item/clothing/accessory/scapular + name = "scapular" + desc = "A Christian garment suspended from the shoulders. As an object of popular piety, \ + it serves to remind the wearers of their commitment to live a Christian life." + icon = 'icons/obj/clothing/accessory/religious.dmi' + icon_state = "scapular" + item_state = "scapular" + +/obj/item/clothing/accessory/assunzione + name = "luceian amulet" + desc = "A common symbol of the Luceian faith abroad, this amulet featuring the religion's all-seeing eye and eight-pointed crest \ + seems to be made of real gold and gemstones. While not as critical to faithful abroad as a warding sphere, it is considered good form \ + to ensure one's amulet is well-maintained." + icon = 'icons/obj/clothing/accessory/religious.dmi' + item_state = "assunzione_amulet" + icon_state = "assunzione_amulet" + contained_sprite = TRUE + drop_sound = 'sound/items/drop/accessory.ogg' + pickup_sound = 'sound/items/pickup/accessory.ogg' + +/obj/item/clothing/accessory/tallit + name = "tallit" + desc = "A tallit is a fringed garment worn as a prayer shawl by religious Jews. \ + The tallit has special twined and knotted fringes known as tzitzit attached to its four corners." + icon = 'icons/obj/clothing/accessory/religious.dmi' + item_state = "tallit" + icon_state = "tallit" + contained_sprite = TRUE diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm index f72917bc519..876b11f30e8 100644 --- a/code/modules/clothing/under/jobs/civilian.dm +++ b/code/modules/clothing/under/jobs/civilian.dm @@ -93,6 +93,13 @@ icon_state = "orion_liaison" item_state = "orion_liaison" +/obj/item/clothing/under/rank/liaison/einstein + name = "einstein corporate liaison uniform" + desc_extended = "If you're seeing this outfit in an SCC facility, something somewhere has gone terribly, terribly wrong." + icon = 'icons/clothing/under/uniforms/einstein.dmi' + icon_state = "ee_liaison" + item_state = "ee_liaison" + // Janitor /obj/item/clothing/under/rank/janitor name = "janitor's jumpsuit" @@ -275,6 +282,14 @@ icon_state = "orion_machinist" item_state = "orion_machinist" +/obj/item/clothing/under/rank/machinist/einstein + name = "einstein machinist's jumpsuit" + desc_extended = "Usually, but not necessarily worn by Einstein's Terranaeus Diagnostics subsidiary. Subsidiary or not, \ + whoever wears this uniform probably knows a lot about putting guns and cameras on robots." + icon = 'icons/clothing/under/uniforms/einstein.dmi' + icon_state = "ee_machinist" + item_state = "ee_machinist" + /obj/item/clothing/under/rank/captain/hephaestus name = "hephaestus captain's jumpsuit" desc = "It's a green-and-orange jumpsuit with some gold markings denoting the rank of \"Captain\" used by Hephaestus Industries." @@ -284,3 +299,12 @@ item_state = "heph_captain" worn_state = "heph_captain" contained_sprite = TRUE + +/obj/item/clothing/under/rank/captain/einstein + name = "einstein captain's jumpsuit" + desc = "It's a grey-green jumpsuit with some gold markings denoting the rank of \"Captain\" used by Einstein Engines." + desc_extended = "Any similarities to the captain's jumpsuits worn in the SCC are purely coincidental. Honest!" + icon = 'icons/clothing/under/uniforms/einstein.dmi' + icon_state = "ee_captain" + item_state = "ee_captain" + contained_sprite = TRUE diff --git a/code/modules/clothing/under/jobs/engineering.dm b/code/modules/clothing/under/jobs/engineering.dm index 9decbeaabd5..21143cfdf76 100644 --- a/code/modules/clothing/under/jobs/engineering.dm +++ b/code/modules/clothing/under/jobs/engineering.dm @@ -48,6 +48,15 @@ icon_state = "zav_engineer" item_state = "zav_engineer" +/obj/item/clothing/under/rank/engineer/einstein + name = "einstein engineer's jumpsuit" + desc = "It's a grey-green high visibility jumpsuit worn by engineers. It has minor radiation shielding." + desc_extended = "Usually, but not necessarily worn by Einstein's Taipei Engineering Industrial subsidiary. Subsidiary or not, \ + whoever wears this uniform probably knows a lot about the latest warp drives." + icon = 'icons/clothing/under/uniforms/einstein.dmi' + icon_state = "ee_engineer" + item_state = "ee_engineer" + /obj/item/clothing/under/rank/engineer/apprentice name = "engineering apprentice's jumpsuit" desc = "It's a noticeably cheaper high visibility jumpsuit worn by engineering apprentices. It has minor radiation shielding." diff --git a/code/modules/clothing/under/jobs/medsci.dm b/code/modules/clothing/under/jobs/medsci.dm index 1e3c6374b74..9a591eeae56 100644 --- a/code/modules/clothing/under/jobs/medsci.dm +++ b/code/modules/clothing/under/jobs/medsci.dm @@ -33,6 +33,14 @@ icon_state = "zav_scientist" item_state = "zav_scientist" +/obj/item/clothing/under/rank/scientist/einstein + name = "einstein scientist's jumpsuit" + desc_extended = "Doing away with the hideous purple of the SCC's science uniforms in favor of yet more dull greens, \ + Einstein Engines' science uniforms push new frontiers of style just as their wearers push everything else." + icon = 'icons/clothing/under/uniforms/einstein.dmi' + icon_state = "ee_scientist" + item_state = "ee_scientist" + // Xenobotanist /obj/item/clothing/under/rank/scientist/botany diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm index 55a45334223..9a3f7bdb96b 100644 --- a/code/modules/clothing/under/jobs/security.dm +++ b/code/modules/clothing/under/jobs/security.dm @@ -108,6 +108,14 @@ item_state = "heph_security" contained_sprite = TRUE +/obj/item/clothing/under/rank/security/einstein + name = "einstein security officer's uniform" + desc_extended = "Even the Chainlink's hated enemy puts their security officers in drab officewear. Rumors that these are woven \ + from Skrellian supermaterials are likely false." + icon = 'icons/clothing/under/uniforms/einstein.dmi' + icon_state = "ee_officer" + item_state = "ee_officer" + /obj/item/clothing/under/rank/warden name = "warden's uniform" desc = "It's made of a slightly sturdier material than standard jumpsuits, to allow for more robust protection." diff --git a/code/modules/cooking/recipes/cultural/recipes_human.dm b/code/modules/cooking/recipes/cultural/recipes_human.dm index 6bede37d2c2..c958f420e5a 100644 --- a/code/modules/cooking/recipes/cultural/recipes_human.dm +++ b/code/modules/cooking/recipes/cultural/recipes_human.dm @@ -337,3 +337,12 @@ reagents = list(/singleton/reagent/nutriment/protein/egg = 6, /singleton/reagent/drink/ice = 5, /singleton/reagent/drink/milk/cream = 5, /singleton/reagent/sugar = 10) result = /obj/item/reagent_containers/food/snacks/sliceable/lady_lulaine reagent_mix = RECIPE_REAGENT_REPLACE //Simplify and replace + +/singleton/recipe/pazillo + appliance = OVEN + fruit = list ("tomato" = 1 , "chickpeas" = 1, "onion" = 1) + items = list( + /obj/item/reagent_containers/food/snacks/sliceable/flatdough + ) + result = /obj/item/reagent_containers/food/snacks/pazillo + reagent_mix = RECIPE_REAGENT_REPLACE //Simplify and replace so it's not full of juice diff --git a/code/modules/cooking/recipes/cultural/recipes_unathi.dm b/code/modules/cooking/recipes/cultural/recipes_unathi.dm index 3f8b93c5cc8..0753a09113d 100644 --- a/code/modules/cooking/recipes/cultural/recipes_unathi.dm +++ b/code/modules/cooking/recipes/cultural/recipes_unathi.dm @@ -177,3 +177,13 @@ /obj/item/reagent_containers/food/snacks/egg ) result = /obj/item/reagent_containers/food/snacks/aghrasshcake + +/singleton/recipe/eyebowl + appliance = SAUCEPAN | POT + fruit = list("aghrassh nut" = 1, "tomato" = 1) + reagents = list(/singleton/reagent/blackpepper = 2, /singleton/reagent/nutriment/protein/egg = 6) + items = list( + /obj/item/reagent_containers/food/snacks/meat + ) + result = /obj/item/reagent_containers/food/snacks/sliceable/eyebowl + reagent_mix = RECIPE_REAGENT_REPLACE diff --git a/code/modules/cooking/recipes/recipes_baked.dm b/code/modules/cooking/recipes/recipes_baked.dm index f3525f4b168..ea6edb8a276 100644 --- a/code/modules/cooking/recipes/recipes_baked.dm +++ b/code/modules/cooking/recipes/recipes_baked.dm @@ -66,3 +66,33 @@ appliance = OVEN items = list(/obj/item/reagent_containers/food/snacks/donkpocket/takoyaki) result = /obj/item/reagent_containers/food/snacks/donkpocket/takoyaki/warm + +/singleton/recipe/meat_lasagna_tray + appliance = OVEN + fruit = list("tomato" = 3) + items = list( + /obj/item/reagent_containers/food/snacks/sliceable/flatdough, + /obj/item/reagent_containers/food/snacks/sliceable/flatdough, + /obj/item/reagent_containers/food/snacks/sliceable/flatdough, + /obj/item/reagent_containers/food/snacks/meat, + /obj/item/reagent_containers/food/snacks/meat, + /obj/item/reagent_containers/food/snacks/cheesewedge, + /obj/item/reagent_containers/food/snacks/cheesewedge, + /obj/item/reagent_containers/food/snacks/cheesewedge + ) + result = /obj/item/reagent_containers/food/snacks/sliceable/meat_lasagna_tray + reagent_mix = RECIPE_REAGENT_REPLACE //Replacing the ingredients and filling in a bit extra for simplicity's sake + +/singleton/recipe/veggie_lasagna_tray + appliance = OVEN + fruit = list("tomato" = 3, "eggplant" = 1, "onion" = 1, "mushroom" = 2) + items = list( + /obj/item/reagent_containers/food/snacks/sliceable/flatdough, + /obj/item/reagent_containers/food/snacks/sliceable/flatdough, + /obj/item/reagent_containers/food/snacks/sliceable/flatdough, + /obj/item/reagent_containers/food/snacks/cheesewedge, + /obj/item/reagent_containers/food/snacks/cheesewedge, + /obj/item/reagent_containers/food/snacks/cheesewedge + ) + result = /obj/item/reagent_containers/food/snacks/sliceable/veggie_lasagna_tray + reagent_mix = RECIPE_REAGENT_REPLACE //Replacing the ingredients and filling in a bit extra for simplicity's sake diff --git a/code/modules/cooking/recipes/recipes_breads.dm b/code/modules/cooking/recipes/recipes_breads.dm index 07bf88fb1dd..034f5c55646 100644 --- a/code/modules/cooking/recipes/recipes_breads.dm +++ b/code/modules/cooking/recipes/recipes_breads.dm @@ -234,13 +234,13 @@ ) result = /obj/item/reagent_containers/food/snacks/pbtoast -/singleton/recipe/NTellabread +/singleton/recipe/ntella_bread appliance = MIX reagents = list(/singleton/reagent/nutriment/choconutspread = 5) items = list( /obj/item/reagent_containers/food/snacks/breadslice ) - result = /obj/item/reagent_containers/food/snacks/NTellabread + result = /obj/item/reagent_containers/food/snacks/ntella_bread /singleton/recipe/slimetoast appliance = SKILLET diff --git a/code/modules/cooking/recipes/recipes_meat.dm b/code/modules/cooking/recipes/recipes_meat.dm index 44cabb4530c..46ae244a29a 100644 --- a/code/modules/cooking/recipes/recipes_meat.dm +++ b/code/modules/cooking/recipes/recipes_meat.dm @@ -102,18 +102,6 @@ result = /obj/item/reagent_containers/food/snacks/nugget result_quantity = 4 -/singleton/recipe/lasagna - appliance = OVEN - fruit = list("tomato" = 2, "eggplant" = 1) - items = list( - /obj/item/reagent_containers/food/snacks/sliceable/flatdough, - /obj/item/reagent_containers/food/snacks/sliceable/flatdough, - /obj/item/reagent_containers/food/snacks/meat, - /obj/item/reagent_containers/food/snacks/meat - ) - result = /obj/item/reagent_containers/food/snacks/lasagna - reagent_mix = RECIPE_REAGENT_REPLACE - /singleton/recipe/donerkebab fruit = list("tomato" = 1, "cabbage" = 1) reagents = list(/singleton/reagent/sodiumchloride = 1, /singleton/reagent/spacespice = 1) diff --git a/code/modules/cooking/recipes/recipes_pastries.dm b/code/modules/cooking/recipes/recipes_pastries.dm index 049d6ca657a..5ed98b3a524 100644 --- a/code/modules/cooking/recipes/recipes_pastries.dm +++ b/code/modules/cooking/recipes/recipes_pastries.dm @@ -29,14 +29,18 @@ /singleton/recipe/pancakes appliance = SKILLET + reagents = list(/singleton/reagent/sugar = 5) items = list( /obj/item/reagent_containers/food/snacks/sliceable/flatdough - ) + ) result = /obj/item/reagent_containers/food/snacks/pancakes - result_quantity = 1 -/singleton/recipe/pancakes/berry +/singleton/recipe/pancakes/berry //alternate way to get berry pancakes if you want to use actual berries and not syrup. fruit = list("berries" = 1) + reagents = list(/singleton/reagent/sugar = 5) + items = list( + /obj/item/reagent_containers/food/snacks/sliceable/flatdough + ) result = /obj/item/reagent_containers/food/snacks/pancakes/berry ////////////////////////////////////////////WAFFLES//////////////////////////////////////////// @@ -198,7 +202,7 @@ fruit = list("apple" = 2) result = /obj/item/reagent_containers/food/snacks/sliceable/cake/apple -/singleton/recipe/cake/NTellacheesecake +/singleton/recipe/cake/ntella_cheesecake reagents = list(/singleton/reagent/drink/milk = 5, /singleton/reagent/nutriment/choconutspread = 15, /singleton/reagent/sugar = 10) items = list( /obj/item/reagent_containers/food/snacks/cheesewedge, @@ -209,7 +213,12 @@ /obj/item/reagent_containers/food/snacks/cookiesnack, /obj/item/reagent_containers/food/snacks/cookiesnack //Oreo cookies aren't a thing in the game yet but if/when they're made, please replace this with them! ) - result = /obj/item/reagent_containers/food/snacks/sliceable/cake/NTellacheesecake + result = /obj/item/reagent_containers/food/snacks/sliceable/cake/ntella_cheesecake + +/singleton/recipe/cake/starcake + fruit = list("orange" = 1) + reagents = list(/singleton/reagent/nutriment/flour = 10, /singleton/reagent/sugar = 15, /singleton/reagent/nutriment/coco = 10, /singleton/reagent/drink/milk/cream = 5, /singleton/reagent/nutriment/protein/egg = 6) + result = /obj/item/reagent_containers/food/snacks/sliceable/cake/starcake //Predesigned pies //======================= diff --git a/code/modules/effects/map_effects/window_spawner.dm b/code/modules/effects/map_effects/window_spawner.dm index f303a818ee5..049bf4a1345 100644 --- a/code/modules/effects/map_effects/window_spawner.dm +++ b/code/modules/effects/map_effects/window_spawner.dm @@ -13,6 +13,7 @@ var/spawn_grille = FALSE // For electrified windows. var/spawn_firedoor = FALSE var/activated + atmos_canpass = CANPASS_NEVER /obj/effect/map_effect/window_spawner/CanPass() // Stops ZAS expanding zones past us, the windows will block the zone anyway. return FALSE diff --git a/code/modules/ghostroles/spawnpoint/spawnpoint.dm b/code/modules/ghostroles/spawnpoint/spawnpoint.dm index dda4b375883..4cac828db12 100644 --- a/code/modules/ghostroles/spawnpoint/spawnpoint.dm +++ b/code/modules/ghostroles/spawnpoint/spawnpoint.dm @@ -91,7 +91,7 @@ return data /obj/effect/ghostspawpoint/ui_state(mob/user) - return observer_state + return GLOB.observer_state /obj/effect/ghostspawpoint/ui_status(mob/user, datum/ui_state/state) return UI_INTERACTIVE diff --git a/code/modules/heavy_vehicle/mech_interaction.dm b/code/modules/heavy_vehicle/mech_interaction.dm index c8b4f707e68..6192d774b1a 100644 --- a/code/modules/heavy_vehicle/mech_interaction.dm +++ b/code/modules/heavy_vehicle/mech_interaction.dm @@ -425,7 +425,7 @@ if(MC && MC.brute_damage) damaged_parts += MC var/obj/item/mech_component/to_fix = tgui_input_list(user, "Which component would you like to fix?", "Fix Component", damaged_parts) - if(CanInteract(user, physical_state) && !QDELETED(to_fix) && (to_fix in src) && to_fix.brute_damage) + if(CanInteract(user, GLOB.physical_state) && !QDELETED(to_fix) && (to_fix in src) && to_fix.brute_damage) to_fix.repair_brute_generic(attacking_item, user) return else if(attacking_item.iscoil()) @@ -436,7 +436,7 @@ if(MC && MC.burn_damage) damaged_parts += MC var/obj/item/mech_component/to_fix = tgui_input_list(user, "Which component would you like to fix?", "Fix Component", damaged_parts) - if(CanInteract(user, physical_state) && !QDELETED(to_fix) && (to_fix in src) && to_fix.burn_damage) + if(CanInteract(user, GLOB.physical_state) && !QDELETED(to_fix) && (to_fix in src) && to_fix.burn_damage) to_fix.repair_burn_generic(attacking_item, user) return else if(attacking_item.iscrowbar()) diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm index 3c9f811ae87..f0713a60d85 100644 --- a/code/modules/integrated_electronics/core/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -70,7 +70,7 @@ return implant /obj/item/device/electronic_assembly/proc/check_interactivity(mob/user) - if(!CanInteract(user, physical_state)) + if(!CanInteract(user, GLOB.physical_state)) return 0 return 1 diff --git a/code/modules/integrated_electronics/core/device.dm b/code/modules/integrated_electronics/core/device.dm index b96a3815d57..2b3c6ee55d6 100644 --- a/code/modules/integrated_electronics/core/device.dm +++ b/code/modules/integrated_electronics/core/device.dm @@ -99,6 +99,6 @@ . = ..() /obj/item/device/electronic_assembly/device/check_interactivity(mob/user) - if(!CanInteract(user, state = deep_inventory_state)) + if(!CanInteract(user, state = GLOB.deep_inventory_state)) return 0 return 1 diff --git a/code/modules/integrated_electronics/core/integrated_circuit.dm b/code/modules/integrated_electronics/core/integrated_circuit.dm index 00386526209..3edf6478e2b 100644 --- a/code/modules/integrated_electronics/core/integrated_circuit.dm +++ b/code/modules/integrated_electronics/core/integrated_circuit.dm @@ -63,7 +63,7 @@ a creative player the means to solve many problems. Circuits are held inside an /obj/item/integrated_circuit/proc/check_interactivity(mob/user) if(assembly) return assembly.check_interactivity(user) - else if(!CanInteract(user, physical_state)) + else if(!CanInteract(user, GLOB.physical_state)) return 0 return 1 @@ -180,7 +180,7 @@ a creative player the means to solve many problems. Circuits are held inside an B.set_content(HTML.Join()) B.open() -/obj/item/integrated_circuit/Topic(href, href_list, state = always_state) +/obj/item/integrated_circuit/Topic(href, href_list, state = GLOB.always_state) if(!check_interactivity(usr)) return if (assembly && !assembly.opened) diff --git a/code/modules/integrated_electronics/core/special_pins/list_pin.dm b/code/modules/integrated_electronics/core/special_pins/list_pin.dm index a7610df5edd..c4f9f67a145 100644 --- a/code/modules/integrated_electronics/core/special_pins/list_pin.dm +++ b/code/modules/integrated_electronics/core/special_pins/list_pin.dm @@ -132,7 +132,7 @@ /datum/integrated_io/list/display_pin_type() return IC_FORMAT_LIST -/datum/integrated_io/list/Topic(href, href_list, state = always_state) +/datum/integrated_io/list/Topic(href, href_list, state = GLOB.always_state) if(!holder.check_interactivity(usr)) return if(..()) diff --git a/code/modules/integrated_electronics/core/tools.dm b/code/modules/integrated_electronics/core/tools.dm index c40567e7d25..32d2f9b4b33 100644 --- a/code/modules/integrated_electronics/core/tools.dm +++ b/code/modules/integrated_electronics/core/tools.dm @@ -117,7 +117,7 @@ /obj/item/device/integrated_electronics/debugger/attack_self(mob/user) var/type_to_use = input("Please choose a type to use.","[src] type setting") as null|anything in list("string","number","ref", "null") - if(!CanInteract(user, physical_state)) + if(!CanInteract(user, GLOB.physical_state)) return var/new_data = null @@ -125,13 +125,13 @@ if("string") accepting_refs = 0 new_data = sanitize(input("Now type in a string.","[src] string writing") as null|text, MAX_MESSAGE_LEN, 1, 0, 1) - if(istext(new_data) && CanInteract(user, physical_state)) + if(istext(new_data) && CanInteract(user, GLOB.physical_state)) data_to_write = new_data to_chat(user, "You set \the [src]'s memory to \"[new_data]\".") if("number") accepting_refs = 0 new_data = input("Now type in a number.","[src] number writing") as null|num - if(isnum(new_data) && CanInteract(user, physical_state)) + if(isnum(new_data) && CanInteract(user, GLOB.physical_state)) data_to_write = new_data to_chat(user, "You set \the [src]'s memory to [new_data].") if("ref") diff --git a/code/modules/integrated_electronics/subtypes/memory.dm b/code/modules/integrated_electronics/subtypes/memory.dm index a21d459f10b..086505bf726 100644 --- a/code/modules/integrated_electronics/subtypes/memory.dm +++ b/code/modules/integrated_electronics/subtypes/memory.dm @@ -91,7 +91,7 @@ /obj/item/integrated_circuit/memory/constant/attack_self(mob/user) var/datum/integrated_io/O = outputs[1] var/type_to_use = input("Please choose a type to use.","[src] type setting") as null|anything in list("string","number","ref", "null") - if(!CanInteract(user, physical_state)) + if(!CanInteract(user, GLOB.physical_state)) return var/new_data = null @@ -99,13 +99,13 @@ if("string") accepting_refs = 0 new_data = sanitize(input("Now type in a string.","[src] string writing") as null|text, MAX_MESSAGE_LEN, 1, 0, 1) - if(istext(new_data) && CanInteract(user, physical_state)) + if(istext(new_data) && CanInteract(user, GLOB.physical_state)) data = new_data to_chat(user, "You set \the [src]'s memory to [O.display_data(data)].") if("number") accepting_refs = 0 new_data = input("Now type in a number.","[src] number writing") as null|num - if(isnum(new_data) && CanInteract(user, physical_state)) + if(isnum(new_data) && CanInteract(user, GLOB.physical_state)) data = new_data to_chat(user, "You set \the [src]'s memory to [O.display_data(data)].") if("ref") diff --git a/code/modules/item_worth/reagents.dm b/code/modules/item_worth/reagents.dm index fec650bc5e3..b8580501ef4 100644 --- a/code/modules/item_worth/reagents.dm +++ b/code/modules/item_worth/reagents.dm @@ -135,7 +135,7 @@ /singleton/reagent/drink/milkshake value = 0.12 -/singleton/reagent/drink/NTellamilkshake +/singleton/reagent/drink/ntella_milkshake value = 0.14 /singleton/reagent/drink/shake_caramel @@ -168,7 +168,7 @@ /singleton/reagent/drink/shake_choco_mint value = 0.13 -/singleton/reagent/drink/NTellahotchocolate +/singleton/reagent/drink/ntella_hot_chocolate value = 0.13 /singleton/reagent/drink/rewriter diff --git a/code/modules/lock/key.dm b/code/modules/lock/key.dm index dc995534396..d0360ce6239 100644 --- a/code/modules/lock/key.dm +++ b/code/modules/lock/key.dm @@ -28,3 +28,36 @@ to_chat(user, "\The [src] crumbles in your hands!") qdel(src) return ..() + +/obj/item/key/bike + name = "bike key" + desc = "Used to start a bike." + icon_state = "key_tag_gray" + +/obj/item/key/bike/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) + . = ..() + if(distance <= 1) + . += "\The [src] has a small tag attached to it, written on it is '[key_data]'." + +/obj/item/key/bike/sport + name = "sports bike key" + desc = "Used to start a sporty, fast bike." + icon_state = "key_tag_red" + +/obj/item/key/bike/sport/Initialize(mapload, ...) + . = ..() + icon_state = pick("key_tag_red", "key_tag_blue") + +/obj/item/key/bike/moped + name = "moped key" + desc = "Used to start a cheap moped bike." + icon_state = "key_tag_green" + +/obj/item/key/bike/moped/Initialize(mapload, ...) + . = ..() + icon_state = pick("key_tag_gray", "key_tag_green", "key_tag_purple") + +/obj/item/key/bike/police + name = "police bike key" + desc = "Used to start a police bike." + icon_state = "key_tag_police" diff --git a/code/modules/mining/machine_stacking.dm b/code/modules/mining/machine_stacking.dm index 36042c0a8f3..8a6f8e72e4d 100644 --- a/code/modules/mining/machine_stacking.dm +++ b/code/modules/mining/machine_stacking.dm @@ -63,7 +63,7 @@ add_fingerprint(user) ui_interact(user) -/obj/machinery/mineral/stacking_unit_console/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1, datum/ui_state/state = default_state) +/obj/machinery/mineral/stacking_unit_console/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1, datum/ui_state/state = GLOB.default_state) if(!setup_machine(user)) return diff --git a/code/modules/mob/abstract/new_player/login.dm b/code/modules/mob/abstract/new_player/login.dm index 81727ed2686..e357ce8d237 100644 --- a/code/modules/mob/abstract/new_player/login.dm +++ b/code/modules/mob/abstract/new_player/login.dm @@ -13,10 +13,8 @@ mind.active = 1 mind.current = src - loc = null - my_client = client - set_sight(sight|SEE_TURFS) + set_sight(BLIND) GLOB.player_list |= src client.playtitlemusic() diff --git a/code/modules/mob/abstract/new_player/menu.dm b/code/modules/mob/abstract/new_player/menu.dm index d26c90929e3..5eba562c651 100644 --- a/code/modules/mob/abstract/new_player/menu.dm +++ b/code/modules/mob/abstract/new_player/menu.dm @@ -1,7 +1,7 @@ //MENU SYSTEM BY BIGRAGE, some awful code, some awful design, all as you love //Code edits/additions by AshtonFox /mob/abstract/new_player/instantiate_hud(datum/hud/HUD, ui_style, ui_color, ui_alpha) - HUD.new_player_hud(ui_style, ui_color, ui_alpha) HUD.mymob = src + HUD.new_player_hud(ui_style, ui_color, ui_alpha) /datum/hud/new_player hud_shown = TRUE @@ -9,6 +9,8 @@ hotkey_ui_hidden = FALSE /datum/hud/proc/new_player_hud(var/ui_style='icons/mob/screen/white.dmi', var/ui_color = "#fffffe", var/ui_alpha = 255) + SHOULD_NOT_SLEEP(TRUE) + adding = list() var/obj/screen/using @@ -107,7 +109,9 @@ return /obj/screen/new_player/title/proc/Update() - if(QDELING(src)) + SHOULD_NOT_SLEEP(TRUE) + + if(QDELETED(src)) return if(!SSatlas.current_map.lobby_transitions && SSatlas.current_sector.sector_lobby_transitions) @@ -119,17 +123,13 @@ lobby_index = 1 animate(src, alpha = 0, time = 1 SECOND) animate(alpha = 255, icon_state = SSatlas.current_map.lobby_screens[lobby_index], time = 1 SECOND) - if(!MC_RUNNING()) - spawn(SSatlas.current_map.lobby_transitions) - Update() - else - refresh_timer_id = addtimer(CALLBACK(src, PROC_REF(Update)), SSatlas.current_map.lobby_transitions, TIMER_UNIQUE | TIMER_CLIENT_TIME | TIMER_OVERRIDE | TIMER_STOPPABLE) + refresh_timer_id = addtimer(CALLBACK(src, PROC_REF(Update)), SSatlas.current_map.lobby_transitions, TIMER_UNIQUE | TIMER_CLIENT_TIME | TIMER_OVERRIDE | TIMER_STOPPABLE) /obj/screen/new_player/selection var/click_sound = 'sound/effects/menu_click.ogg' var/hud_arrow -/obj/screen/new_player/selection/New(var/datum/hud/H) +/obj/screen/new_player/selection/New(datum/hud/H) color = null hud = H ..() @@ -138,6 +138,10 @@ . = ..() set_sector_things() +/obj/screen/new_player/selection/Destroy(force) + hud = null + . = ..() + /obj/screen/new_player/selection/set_sector_things() . = ..() if(SSatlas.current_sector.sector_hud_menu_sound) diff --git a/code/modules/mob/abstract/new_player/new_player.dm b/code/modules/mob/abstract/new_player/new_player.dm index 134502266d8..3aec41f6baf 100644 --- a/code/modules/mob/abstract/new_player/new_player.dm +++ b/code/modules/mob/abstract/new_player/new_player.dm @@ -19,9 +19,23 @@ INITIALIZE_IMMEDIATE(/mob/abstract/new_player) -/mob/abstract/new_player/Initialize() +/mob/abstract/new_player/Initialize(mapload) . = ..() GLOB.dead_mob_list -= src + attempt_moving_new_player_on_marker_turf() + +/mob/abstract/new_player/proc/attempt_moving_new_player_on_marker_turf() + //If it's set, move the new_player mob to it, otherwise reschedule to check in a bit + if(istype(GLOB.lobby_mobs_location)) + src.forceMove(GLOB.lobby_mobs_location) + + else + //Atoms loading have finished supposedly, there should be a marker down for this, if not found throw a stack trace + if(SSATOMS_IS_PROBABLY_DONE) + stack_trace("The map is supposedly loaded, but GLOB.lobby_mobs_location is not set, unable to move the lobby mob!") + return + + addtimer(CALLBACK(src, PROC_REF(attempt_moving_new_player_on_marker_turf)), 5 SECONDS) /mob/abstract/new_player/Destroy() QDEL_NULL(late_choices_ui) diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index 56181dfb83c..2cb3ecb48b8 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -75,7 +75,7 @@ /obj/item/device/mmi/digital/posibrain/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) . = ..() - . += "*---------*\nThis is [icon2html(src, user)] \a [src]!\n[desc]\n" + . += "This is [icon2html(src, user)] \a [src]!\n[desc]\n" . += "" if(brainmob?.key) @@ -89,7 +89,7 @@ . += "It appears to be completely inactive.\n" else . += "It appears to be completely inactive.\n" - . += "*---------*" + . += "" /obj/item/device/mmi/digital/posibrain/ready_for_use(var/mob/user) if(!brainmob) diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm index 8c989abfd8f..6601dd59404 100644 --- a/code/modules/mob/living/carbon/human/appearance.dm +++ b/code/modules/mob/living/carbon/human/appearance.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/human/proc/change_appearance(var/flags = APPEARANCE_ALL_HAIR, var/mob/user = src, var/check_species_whitelist = TRUE, var/list/species_whitelist = list(), var/list/species_blacklist = list(), var/list/culture_restriction = list(), var/list/origin_restriction = list(), var/datum/ui_state/ui_state = always_state, var/datum/state_object = src, var/update_id = FALSE) +/mob/living/carbon/human/proc/change_appearance(var/flags = APPEARANCE_ALL_HAIR, var/mob/user = src, var/check_species_whitelist = TRUE, var/list/species_whitelist = list(), var/list/species_blacklist = list(), var/list/culture_restriction = list(), var/list/origin_restriction = list(), var/datum/ui_state/ui_state = GLOB.always_state, var/datum/state_object = src, var/update_id = FALSE) var/datum/tgui_module/appearance_changer/AC = new /datum/tgui_module/appearance_changer(src, check_species_whitelist, species_whitelist, species_blacklist, culture_restriction, origin_restriction, ui_state, state_object, update_id) AC.flags = flags AC.ui_interact(user) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index f2c86cc63ca..43ae14af504 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -48,7 +48,7 @@ var/skipears = skipitems & HIDEEARS var/skipwrists = skipitems & HIDEWRISTS - var/list/msg = list("*---------*\nThis is ") + var/list/msg = list("This is ") if(icon) msg += icon2html(icon, user) @@ -390,7 +390,7 @@ if(print_flavor_text()) msg += "[print_flavor_text()]\n" - msg += "*---------*" + msg += "" if(src in GLOB.intent_listener) msg += SPAN_NOTICE("\n[get_pronoun("He")] looks like [get_pronoun("he")] [get_pronoun("is")] listening intently to [get_pronoun("his")] surroundings.") @@ -400,9 +400,9 @@ var/obj/item/grab/G = get_active_hand() msg += SPAN_ALERT(FONT_LARGE("\n[get_pronoun("He")] is biting [G.affecting]'[G.affecting.get_pronoun("end")] neck!")) - if (pose) - if( findtext(pose,".",length(pose)) == 0 && findtext(pose,"!",length(pose)) == 0 && findtext(pose,"?",length(pose)) == 0 ) - pose = addtext(pose,".") //Makes sure all emotes end with a period. + if(pose) + if(findtext(pose, ".", length(pose)) == 0 && findtext(pose, "!", length(pose)) == 0 && findtext(pose, "?", length(pose)) == 0) + pose = addtext(pose, ".") // Makes sure all emotes end with punctuation. msg += "\n[get_pronoun("He")] [pose]" . += msg.Join() diff --git a/code/modules/mob/living/carbon/slime/examine.dm b/code/modules/mob/living/carbon/slime/examine.dm index a540822261f..d0aa55ac98b 100644 --- a/code/modules/mob/living/carbon/slime/examine.dm +++ b/code/modules/mob/living/carbon/slime/examine.dm @@ -18,5 +18,3 @@ . += SPAN_WARNING("It is glowing brightly with high levels of electrical activity.\n") if(10) . += SPAN_DANGER("It is radiating with massive levels of electrical activity!\n") - - . += "*---------*" diff --git a/code/modules/mob/living/carbon/slime/slime.dm b/code/modules/mob/living/carbon/slime/slime.dm index 32dcae10246..ae1b8fa7fd8 100644 --- a/code/modules/mob/living/carbon/slime/slime.dm +++ b/code/modules/mob/living/carbon/slime/slime.dm @@ -1,5 +1,6 @@ /mob/living/carbon/slime name = "baby slime" + desc = "A slime." icon = 'icons/mob/npc/slimes.dmi' icon_state = "grey baby slime" pass_flags = PASSTABLE diff --git a/code/modules/mob/living/silicon/ai/examine.dm b/code/modules/mob/living/silicon/ai/examine.dm index c7a6ab6b2c8..89e00f60592 100644 --- a/code/modules/mob/living/silicon/ai/examine.dm +++ b/code/modules/mob/living/silicon/ai/examine.dm @@ -25,10 +25,11 @@ if (src.stat == UNCONSCIOUS) . += "It is non-responsive and displaying the text: \"RUNTIME: Sensory Overload, stack 26/3\"." . += "" - . += "*---------*" + if(hardware && (hardware.owner == src)) . += "
" . += hardware.get_examine_desc() + . += user.examine_laws(src) /mob/proc/examine_laws(var/mob/living/silicon/S) diff --git a/code/modules/mob/living/silicon/pai/examine.dm b/code/modules/mob/living/silicon/pai/examine.dm index 8930ccfca53..860d7bdf46c 100644 --- a/code/modules/mob/living/silicon/pai/examine.dm +++ b/code/modules/mob/living/silicon/pai/examine.dm @@ -8,12 +8,11 @@ . += "\nIt doesn't seem to be responding." if(DEAD) . += "\nIt looks completely unsalvageable." - . += "\n*---------*" if(print_flavor_text()) . += "\n[print_flavor_text()]\n" - if (pose) - if(findtext(pose,".",length(pose)) == 0 && findtext(pose,"!",length(pose)) == 0 && findtext(pose,"?",length(pose)) == 0 ) - pose = addtext(pose,".") //Makes sure all emotes end with a period. + if(pose) + if(findtext(pose, ".", length(pose)) == 0 && findtext(pose, "!", length(pose)) == 0 && findtext(pose, "?", length(pose)) == 0) + pose = addtext(pose, ".") // Makes sure all emotes end with punctuation. . += "\nIt [pose]" diff --git a/code/modules/mob/living/silicon/robot/drone/drone_console.dm b/code/modules/mob/living/silicon/robot/drone/drone_console.dm index 02d43856d7a..3f0144fe4e3 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_console.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_console.dm @@ -66,7 +66,7 @@ if(A.station_area) call_area_names += A.name //Probably should consider using another list, but this one will do. - var/t_area = input(usr, "Select the area to ping.", "Set Target Area") as null|anything in call_area_names + var/t_area = tgui_input_list(usr, "Select the area to ping.", "Set Target Area", call_area_names) if(!t_area) return diff --git a/code/modules/mob/living/silicon/robot/examine.dm b/code/modules/mob/living/silicon/robot/examine.dm index f3f635b727f..60a71f5aa5a 100644 --- a/code/modules/mob/living/silicon/robot/examine.dm +++ b/code/modules/mob/living/silicon/robot/examine.dm @@ -33,13 +33,13 @@ . += "It doesn't seem to be responding." if(DEAD) . += "It looks completely unsalvageable." - . += "*---------*" if(print_flavor_text()) . += "\n[print_flavor_text()]\n" if(pose) - if(findtext(pose, ".", length(pose)) == 0 && findtext(pose, "!", length(pose)) == 0 && findtext(pose, "?", length(pose)) == 0 ) - pose = addtext(pose, ".") //Makes sure all emotes end with a period. + if(findtext(pose, ".", length(pose)) == 0 && findtext(pose, "!", length(pose)) == 0 && findtext(pose, "?", length(pose)) == 0) + pose = addtext(pose, ".") // Makes sure all emotes end with punctuation. . += "\nIt [pose]" + . += user.examine_laws(src) diff --git a/code/modules/mob/living/silicon/robot/items/robot_parts.dm b/code/modules/mob/living/silicon/robot/items/robot_parts.dm index bb82d292e1f..8fbb9980801 100644 --- a/code/modules/mob/living/silicon/robot/items/robot_parts.dm +++ b/code/modules/mob/living/silicon/robot/items/robot_parts.dm @@ -270,7 +270,7 @@ new_shell.name = new_shell.real_name var/obj/item/organ/internal/mmi_holder/posibrain/P = new_shell.internal_organs_by_name[BP_BRAIN] P.setup_brain() - new_shell.change_appearance(APPEARANCE_ALL_HAIR | APPEARANCE_SKIN | APPEARANCE_EYE_COLOR, new_shell) + new_shell.change_appearance(APPEARANCE_PLASTICSURGERY, new_shell) qdel(src) return diff --git a/code/modules/mob/living/simple_animal/hostile/ipc_zombie.dm b/code/modules/mob/living/simple_animal/hostile/ipc_zombie.dm index 5cd3fcd5ee0..7d2d6e4fa84 100644 --- a/code/modules/mob/living/simple_animal/hostile/ipc_zombie.dm +++ b/code/modules/mob/living/simple_animal/hostile/ipc_zombie.dm @@ -7,9 +7,9 @@ blood_type = COLOR_OIL health = 100 maxHealth = 100 - melee_damage_lower = 20 + melee_damage_lower = 15 melee_damage_upper = 20 - armor_penetration = 40 + armor_penetration = 20 attack_sound = 'sound/weapons/smash.ogg' attacktext = "smashed" faction = "hivebot" diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/konyang.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/konyang.dm index 07145a70be3..9b985db8fd8 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/konyang.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/konyang.dm @@ -14,8 +14,8 @@ mob_size = 12 organ_names = list("torso", "left wing", "right wing", "head") - maxHealth = 150 - health = 150 + maxHealth = 300 + health = 300 melee_damage_lower = 20 melee_damage_upper = 30 diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index f78a2967969..1a9f6f3475f 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -54,6 +54,7 @@ * ckey. */ /mob/proc/LateLogin() + SHOULD_NOT_SLEEP(TRUE) SHOULD_CALL_PARENT(TRUE) SEND_SIGNAL(src, COMSIG_MOB_LOGIN) @@ -103,7 +104,5 @@ // Check code/modules/admin/verbs/antag-ooc.dm for definition client.add_aooc_if_necessary() - if(client) + if(client && !istype(src, /mob/abstract/new_player)) //Do not update the skybox if it's a new player mob, they don't see it anyways and it can runtime client.update_skybox(TRUE) - - addtimer(CALLBACK(client, TYPE_PROC_REF(/client, check_panel_loaded)), 30 SECONDS) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index fd513013e21..0ad321e8077 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -45,6 +45,10 @@ return ..() +/mob/New() + // This needs to happen IMMEDIATELY. I'm sorry :( + GenerateTag() + return ..() /mob/proc/remove_screen_obj_references() flash = null @@ -87,6 +91,15 @@ become_hearing_sensitive() +/** + * Generate the tag for this mob + * + * This is simply "mob_"+ a global incrementing counter that goes up for every mob + */ +/mob/GenerateTag() + . = ..() + tag = "mob_[next_mob_id++]" + /mob/verb/say_wrapper() set name = ".Say" set hidden = TRUE diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 871a8a8b743..888091644a8 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -5,6 +5,7 @@ movable_flags = MOVABLE_FLAG_PROXMOVE sight = DEFAULT_SIGHT var/datum/mind/mind + var/static/next_mob_id = 0 // we never want to hide a turf because it's not lit // We can rely on the lighting plane to handle that for us diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index 72abe2ea6e8..0344e48135c 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -143,20 +143,38 @@ return null -//parses the language code (e.g. :j) from text, such as that supplied to say. -//returns the language object only if the code corresponds to a language that src can speak, otherwise null. -/mob/proc/parse_language(var/message) +/** + * Parses the language code (e.g. :j) from text, such as that supplied to say + * + * Returns a `/datum/language` only if the code corresponds to a language that src can speak, otherwise `null` + * + * * message - A string, the message to parse + */ +/mob/proc/parse_language(message) + SHOULD_NOT_SLEEP(TRUE) + SHOULD_BE_PURE(TRUE) + RETURN_TYPE(/datum/language) + var/prefix = copytext(message,1,2) if(length(message) >= 1 && prefix == "!") return GLOB.all_languages[LANGUAGE_NOISE] + //Check that the message is at least 2 characters long and is there's a prefix starting it if(length(message) >= 2 && is_language_prefix(prefix)) + + //Get the first 2 letters after the prefix (position 2 and 3) var/language_prefix = lowertext(copytext(message, 2, 4)) + + //Try to grab a language associated with said prefix var/datum/language/L = GLOB.language_keys[language_prefix] - if(!L || !can_speak(L)) + + //If we didn't find a language, or we found one we cannot speak, try with a single letter identification + if(!istype(L) || (istype(L) && !can_speak(L))) language_prefix = lowertext(copytext(message, 2, 3)) L = GLOB.language_keys[language_prefix] + + //Check if we can speak the language, otherwise return null if(can_speak(L)) return L - - return null + else + return null diff --git a/code/modules/modular_computers/hardware/portable_hard_drive_presets.dm b/code/modules/modular_computers/hardware/portable_hard_drive_presets.dm index 445b2b8da70..ada04cc625f 100644 --- a/code/modules/modular_computers/hardware/portable_hard_drive_presets.dm +++ b/code/modules/modular_computers/hardware/portable_hard_drive_presets.dm @@ -29,15 +29,16 @@ if(_program == null) qdel(src) //Delete itself if no program is set return - var/datum/computer_file/program/PRG = GLOB.ntnet_global.find_ntnet_file_by_name(_program) - if(!PRG) + var/datum/computer_file/program/program = GLOB.ntnet_global.find_ntnet_file_by_name(_program) + if(!program) qdel(src) //Delete itself it no matching program is found return - max_capacity = PRG.size // Set the capacity of the backup disk to the capacity of the program - store_file(PRG) + var/datum/computer_file/program/program_cloned = program.clone(FALSE, "Compless") + max_capacity = program_cloned.size // Set the capacity of the backup disk to the capacity of the program + store_file(program_cloned) read_only = TRUE - desc = "A read-only backup storage crystal containing a backup of the following software: [PRG.filedesc]" - name = "[PRG.filedesc] backup crystal" + desc = "A read-only backup storage crystal containing a backup of the following software: [program_cloned.filedesc]" + name = "[program_cloned.filedesc] backup crystal" /obj/structure/closet/crate/software_backup desc = "A crate containing a backup of all the NT Software available." diff --git a/code/modules/multiz/structures.dm b/code/modules/multiz/structures.dm index b88f852cad5..540dd76f7f1 100644 --- a/code/modules/multiz/structures.dm +++ b/code/modules/multiz/structures.dm @@ -201,7 +201,27 @@ /obj/structure/ladder/away //a ladder that just looks like it's going down icon_state = "ladderawaydown" -/// Note that stairs facing left/right may need the stairs_lower structure if they're not placed against walls. +/** + * #Stairs + * + * Stairs allow you to traverse up and down between Z-levels + * + * They _MUST_ follow this bound rules: + * + * -If facing NORTH: `bound_height` to 64 and `bound_y` to -32 + * + * -If facing SOUTH: `bound_height` to 64 + * + * -If facing EAST: `bound_width` to 64 and `bound_x` to -32 + * + * -If facing WEST: `bound_width` to 64 + * + * No other bounds should be set on them except the ones described above + * + * A subtype must be defined, and those bounds set in code. DO NOT SET IT ON THE MAP ITSELF! + * + * Note that stairs facing left/right may need the stairs_lower structure if they're not placed against walls + */ /obj/structure/stairs name = "stairs" desc = "Stairs leading to another floor. Not too useful if the gravity goes out." @@ -298,9 +318,6 @@ dir = WEST bound_width = 64 -/obj/structure/stairs/flat - icon_state = "stairs_flat" - /// Snowflake railing object for 64x64 stairs. /obj/structure/stairs_railing name = "railing" diff --git a/code/modules/nano/modules/human_appearance.dm b/code/modules/nano/modules/human_appearance.dm index 57f696513f6..4910c76de05 100644 --- a/code/modules/nano/modules/human_appearance.dm +++ b/code/modules/nano/modules/human_appearance.dm @@ -28,7 +28,7 @@ var/list/culture_restrictions = list() var/list/origin_restrictions = list() -/datum/tgui_module/appearance_changer/New(var/mob/living/carbon/human/H, var/check_species_whitelist = 1, var/list/species_whitelist = list(), var/list/species_blacklist = list(), var/list/culture_restriction = list(), var/list/origin_restriction = list(), var/datum/ui_state/set_ui_state = always_state, var/datum/set_state_object = null, var/update_id) +/datum/tgui_module/appearance_changer/New(var/mob/living/carbon/human/H, var/check_species_whitelist = 1, var/list/species_whitelist = list(), var/list/species_blacklist = list(), var/list/culture_restriction = list(), var/list/origin_restriction = list(), var/datum/ui_state/set_ui_state = GLOB.always_state, var/datum/set_state_object = null, var/update_id) ..() ui_state = set_ui_state state_object = set_state_object diff --git a/code/modules/nano/modules/nano_module.dm b/code/modules/nano/modules/nano_module.dm index 8488e24a6d0..00f7bb7d590 100644 --- a/code/modules/nano/modules/nano_module.dm +++ b/code/modules/nano/modules/nano_module.dm @@ -12,7 +12,7 @@ /datum/nano_module/ui_host() return host ? host.ui_host() : src -/datum/nano_module/proc/can_still_topic(var/datum/ui_state/state = default_state) +/datum/nano_module/proc/can_still_topic(var/datum/ui_state/state = GLOB.default_state) return CanUseTopic(usr, state) == STATUS_INTERACTIVE /datum/nano_module/proc/check_eye(var/mob/user) diff --git a/code/modules/nano/nanoexternal.dm b/code/modules/nano/nanoexternal.dm index 678c3811a6f..dc15f0dcd54 100644 --- a/code/modules/nano/nanoexternal.dm +++ b/code/modules/nano/nanoexternal.dm @@ -33,7 +33,7 @@ * @param ui /datum/nanoui This parameter is passed by the nanoui process() proc when updating an open ui * @param force_open boolean Force the UI to (re)open, even if it's already open */ -/datum/proc/nanoui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/nanoui/master_ui = null, var/datum/ui_state/state = default_state) +/datum/proc/nanoui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/nanoui/master_ui = null, var/datum/ui_state/state = GLOB.default_state) return // Used by the Nano UI Manager (/datum/SSnanoui) to track UIs opened by this mob diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm index 9289843e82f..6950ca06aee 100644 --- a/code/modules/nano/nanoui.dm +++ b/code/modules/nano/nanoui.dm @@ -71,7 +71,7 @@ nanoui is used to open and update nano browser uis * * @return /nanoui new nanoui object */ -/datum/nanoui/New(nuser, nsrc_object, nui_key, ntemplate_filename, ntitle = 0, nwidth = 0, nheight = 0, var/atom/nref = null, var/datum/nanoui/master_ui = null, var/datum/ui_state/state = default_state) +/datum/nanoui/New(nuser, nsrc_object, nui_key, ntemplate_filename, ntitle = 0, nwidth = 0, nheight = 0, var/atom/nref = null, var/datum/nanoui/master_ui = null, var/datum/ui_state/state = GLOB.default_state) user = nuser src_object = nsrc_object ui_key = nui_key diff --git a/code/modules/organs/subtypes/augment.dm b/code/modules/organs/subtypes/augment.dm index 009964f1d2c..1bceecd87e2 100644 --- a/code/modules/organs/subtypes/augment.dm +++ b/code/modules/organs/subtypes/augment.dm @@ -120,7 +120,19 @@ M.item_flags |= ITEM_FLAG_NO_MOVE owner.equip_to_slot(M, aug_slot) var/obj/item/organ/O = owner.organs_by_name[parent_organ] - owner.visible_message(SPAN_NOTICE("\The [M] slides out of \the [owner]'s [O.name]."), SPAN_NOTICE("You deploy \the [M]!")) + + //If we didn't found the organ, it might be a sub-organ, search for it + if(!O) + for(var/external_organ_key in owner.organs_by_name) + var/obj/item/organ/external/external_organ = owner.organs_by_name[external_organ_key] + for(var/obj/item/organ/internal/internal_organ in external_organ.internal_organs) + if(internal_organ.organ_tag == parent_organ) + O = internal_organ + break + + //If we have found it, print the message, otherwise don't bother, it would just runtime + if(O) + owner.visible_message(SPAN_NOTICE("\The [M] slides out of \the [owner]'s [O.name]."), SPAN_NOTICE("You deploy \the [M]!")) /obj/item/organ/internal/augment/tool/combitool name = "retractable combitool" @@ -774,3 +786,52 @@ action_button_name = "Deploy Glare Dampeners" organ_tag = BP_AUG_GLARE_DAMPENER augment_type = /obj/item/clothing/glasses/aug/welding + +/obj/item/organ/internal/augment/eye_sensors/phalanx + name = "phalanx facial plate" + desc = "This modular face plate accommodates a wide array of cybernetic augmentations, enabling seamless integration with Phalanx's transhumanist doctrine. \ + Enhanced sensory overlays and HUDs offer Phalanx members superior situational awareness and promote a sense of hive-thinking." + icon_state = "vaurca_plate" + action_button_name = "Toggle HUD" + action_button_icon = "vaurca_plate" + on_mob_icon = 'icons/mob/human_races/augments_external.dmi' + sprite_sheets = list( + BODYTYPE_VAURCA_BULWARK = 'icons/mob/species/bulwark/augments_external.dmi', + BODYTYPE_VAURCA = 'icons/mob/species/vaurca/augments_external.dmi' + ) +/obj/item/organ/internal/augment/eye_sensors/phalanx/attack_self(var/mob/user) + . = ..() + + if(selected_hud == "disabled") + selected_hud = SEC_HUDTYPE + to_chat(user, "You activate \the [src] security HUD.") + return + if(selected_hud == SEC_HUDTYPE) + selected_hud = MED_HUDTYPE + to_chat(user, "You activate \the [src] medical HUD.") + return + if(selected_hud == MED_HUDTYPE) + selected_hud = "disabled" + to_chat(user, "You deactivate \the [src].") + return + +/obj/item/organ/internal/augment/eye_sensors/phalanx/process() + ..() + + switch(selected_hud) + if(SEC_HUDTYPE) + req_access = list(ACCESS_SECURITY) + if(allowed(owner)) + active_hud = "security" + process_sec_hud(owner, 1) + else + active_hud = "disabled" + if(MED_HUDTYPE) + req_access = list(ACCESS_MEDICAL) + if(allowed(owner)) + active_hud = "medical" + process_med_hud(owner, 1) + else + active_hud = "disabled" + else + active_hud = "disabled" diff --git a/code/modules/overmap/exoplanets/decor/flora/potted.dm b/code/modules/overmap/exoplanets/decor/flora/potted_big.dm similarity index 95% rename from code/modules/overmap/exoplanets/decor/flora/potted.dm rename to code/modules/overmap/exoplanets/decor/flora/potted_big.dm index 1b867695e27..41dff8e762f 100644 --- a/code/modules/overmap/exoplanets/decor/flora/potted.dm +++ b/code/modules/overmap/exoplanets/decor/flora/potted_big.dm @@ -1,7 +1,7 @@ /obj/structure/flora/pottedplant name = "potted plant" desc = "A potted plant." - icon = 'icons/obj/plants.dmi' + icon = 'icons/obj/pottedplants_big.dmi' icon_state = "plant-26" anchored = FALSE density = FALSE @@ -71,6 +71,28 @@ return 1 return ..() +// ------------------------------------ dead/empty + +/obj/structure/flora/pottedplant/dead + name = "dead potted plant" + desc = "A dead potted plant." + icon_state = "plant-dead" + dead = TRUE + +/obj/structure/flora/pottedplant/dead2 + name = "dead potted plant" + desc = "A dead potted plant." + icon_state = "plant-dead-2" + dead = TRUE + +/obj/structure/flora/pottedplant/empty + name = "empty plant pot" + desc = "An empty plant pot." + icon_state = "plant-empty" + dead = TRUE + +// ------------------------------------ actual plants + /obj/structure/flora/pottedplant/applebush name = "decorative potted plant" desc = "This is a decorative shrub. It's been trimmed into the shape of an apple." @@ -81,9 +103,9 @@ desc = "This is an ordinary looking fern. It has some big leaves." icon_state = "plant-01" -/obj/structure/flora/pottedplant/fern - name = "potted fern" - desc = "This is an ordinary looking fern. It looks like it could do with some water." +/obj/structure/flora/pottedplant/tree + name = "potted tree" + desc = "This is a small tree. It has hard bark and lots of tiny leaves." icon_state = "plant-02" /obj/structure/flora/pottedplant/overgrown @@ -118,7 +140,7 @@ /obj/structure/flora/pottedplant/unusual name = "unusual potted plant" - desc = "A fleshy cave dwelling plant with huge nodules for flowers. It's bulbous ends emit a soft blue light." + desc = "A fleshy cave dwelling plant with huge nodules for flowers. Its bulbous ends emit a soft blue light." icon_state = "plant-09" /obj/structure/flora/pottedplant/unusual/Initialize() @@ -151,7 +173,7 @@ icon_state = "plant-14" /obj/structure/flora/pottedplant/bouquet - name = "tiny potted bouquet" + name = "small potted bouquet" desc = "A pitiful pot of assorted small flora. Some look familiar." icon_state = "plant-15" @@ -177,7 +199,7 @@ /obj/structure/flora/pottedplant/subterranean name = "subterranean potted plant-fungus" - desc = "A bioluminescent subterranean half-plant half-fungus hybrid, it's bulbous ends glow faintly. Said to come from Sedantis I." + desc = "A bioluminescent subterranean half-plant half-fungus hybrid, its bulbous ends glow faintly. Said to come from Sedantis I." icon_state = "plant-20" /obj/structure/flora/pottedplant/subterranean/Initialize() @@ -265,21 +287,3 @@ Scientists assure, the blinking \"eye\" is simply just a form of heat regulation, \ and other than that, this plant is same as any other greenery." icon_state = "plant-36" - -/obj/structure/flora/pottedplant/dead - name = "dead potted plant" - desc = "A dead potted plant." - icon_state = "plant-dead" - dead = TRUE - -/obj/structure/flora/pottedplant/dead2 - name = "dead potted plant" - desc = "A dead potted plant." - icon_state = "plant-dead-2" - dead = TRUE - -/obj/structure/flora/pottedplant/empty - name = "empty plant pot" - desc = "An empty plant pot." - icon_state = "plant_empty" - dead = TRUE diff --git a/code/modules/overmap/exoplanets/decor/flora/potted_small.dm b/code/modules/overmap/exoplanets/decor/flora/potted_small.dm new file mode 100644 index 00000000000..b8dcaa7bbba --- /dev/null +++ b/code/modules/overmap/exoplanets/decor/flora/potted_small.dm @@ -0,0 +1,189 @@ +/obj/item/flora/pottedplant_small + name = "potted plant" + desc = "A potted plant." + icon = 'icons/obj/pottedplants_small.dmi' + icon_state = "plant-01" + anchored = FALSE + density = FALSE + var/dead = FALSE + +/obj/item/flora/pottedplant_small/proc/death() + if(!dead) + icon_state = "plant-dead" + name = "dead [name]" + desc = "A dead potted plant." + dead = TRUE + +//No complex interactions, just make them fragile +/obj/item/flora/pottedplant_small/ex_act(var/severity = 2.0) + death() + return ..() + +/obj/item/flora/pottedplant_small/fire_act() + death() + return ..() + +/obj/item/flora/pottedplant_small/bullet_act(var/obj/item/projectile/Proj) + if (prob(Proj.damage*2)) + death() + return 1 + return ..() + +// ------------------------------------ dead/empty + +/obj/item/flora/pottedplant_small/dead + name = "dead potted plant" + desc = "A dead potted plant." + icon_state = "plant-dead" + dead = TRUE + +/obj/item/flora/pottedplant_small/empty + name = "empty plant pot" + desc = "An empty plant pot." + icon_state = "plant-empty" + dead = TRUE + +// ------------------------------------ actual plants + +/obj/item/flora/pottedplant_small/sapling + name = "potted sapling" + desc = "Tree sampling, living in a tiny pot. It will grow into a big tree some day." + icon_state = "plant-01" + +/obj/item/flora/pottedplant_small/fern + name = "small potted fern" + desc = "This is an ordinary looking fern. It has one big leaf." + icon_state = "plant-02" + +/obj/item/flora/pottedplant_small/tree + name = "miniature potted tree" + desc = "This is a tiny tree. It has hard bark and some tiny leaves." + icon_state = "plant-03" + +/obj/item/flora/pottedplant_small/bamboo + name = "potted bamboo" + desc = "This is a tiny bamboo shoot. The top looks like it's been cut short." + icon_state = "plant-04" + +/obj/item/flora/pottedplant_small/smallbush + name = "small potted bush" + desc = "This is a small bush. The two big leaves stick upwards in an odd fashion." + icon_state = "plant-05" + +/obj/item/flora/pottedplant_small/thinbush + name = "thin potted bush" + desc = "This is a thin bush. It appears to be flowering." + icon_state = "plant-06" + +/obj/item/flora/pottedplant_small/mysterious + name = "reedy potted bulb" + desc = "A reedy plant mostly used for decoration in Skrell homes, admired for its luxuriant stalks. Touching its one bulb causes it to shrink." + icon_state = "plant-07" + +/obj/item/flora/pottedplant_small/unusual + name = "unusual potted plant" + desc = "A fleshy cave dwelling plant with one small flower nodule. Its bulbous end emits a soft blue light." + icon_state = "plant-08" + +/obj/item/flora/pottedplant_small/unusual/Initialize() + . = ..() + set_light(l_range = 2, l_power = 2, l_color = "#007fff") + +/obj/item/flora/pottedplant_small/smallcactus + name = "miniature potted cactus" + desc = "A scrubby cactus adapted to the Moghes deserts." + icon_state = "plant-09" + +/obj/item/flora/pottedplant_small/tall + name = "small potted plant" + desc = "A hardy succulent adapted to the Moghes deserts. Tiny pores line its surface." + icon_state = "plant-10" + +/obj/item/flora/pottedplant_small/smelly + name = "smelly potted plant" + desc = "That's a big flower. It reeks of rotten eggs." + icon_state = "plant-11" + +/obj/item/flora/pottedplant_small/bouquet + name = "tiny potted bouquet" + desc = "A pitiful pot of just three tiny flowers." + icon_state = "plant-12" + +/obj/item/flora/pottedplant_small/shoot + name = "small potted shoot" + desc = "This is a tiny shoot. It still needs time to grow." + icon_state = "plant-13" + +/obj/item/flora/pottedplant_small/orchid + name = "sweet potted orchid" + desc = "An orchid plant, as beautiful as it is delicate. Sweet smelling flower is supported by spindly stems." + icon_state = "plant-14" + +/obj/item/flora/pottedplant_small/crystal + name = "crystalline potted plant" + desc = "A ropey, aquatic plant. Odd crystal formations grow on the end." + icon_state = "plant-15" + +/obj/item/flora/pottedplant_small/subterranean + name = "subterranean potted plant-fungus" + desc = "A bioluminescent subterranean half-plant half-fungus hybrid, its bulbous ends glow faintly. Said to come from Sedantis I." + icon_state = "plant-16" + +/obj/item/flora/pottedplant_small/subterranean/Initialize() + . = ..() + set_light(l_range = 1, l_power = 0.5, l_color = "#ff6633") + +/obj/item/flora/pottedplant_small/stoutbush + name = "stout potted bush" + desc = "This is a miniature stout bush. Its leaves point up and outwards." + icon_state = "plant-17" + +/obj/item/flora/pottedplant_small/drooping + name = "drooping potted plant" + desc = "This is a tiny plant. It has just one drooping leaf, making it look like it's wilted." + icon_state = "plant-18" + +/obj/item/flora/pottedplant_small/tropical + name = "tropical potted plant" + desc = "This is some kind of tropical plant. It is very young, and hasn't begun to flower yet." + icon_state = "plant-19" + +/obj/item/flora/pottedplant_small/flower + name = "potted flower" + desc = "A small potted flower. It appears to be healthy and growing strong." + icon_state = "plant-20" + +/obj/item/flora/pottedplant_small/bulrush + name = "small potted grass" + desc = "A bulrush, wetland grass-like plant. This one is tiny, and does not have any flowers." + icon_state = "plant-21" + +/obj/item/flora/pottedplant_small/rose + name = "thorny potted rose" + desc = "A flowering rose. It has sharp thorns on its stems." + icon_state = "plant-22" + +/obj/item/flora/pottedplant_small/whitetulip + name = "potted tulip" + desc = "A potted plant, with one large white flower bud." + icon_state = "plant-23" + +/obj/item/flora/pottedplant_small/woodyshrub + name = "woody potted shrub" + desc = "A woody shrub." + icon_state = "plant-24" + +/obj/item/flora/pottedplant_small/woodyshrubdying + name = "dying woody potted shrub" + desc = "A woody shrub. Seems to be in need of watering." + icon_state = "plant-25" + +/obj/item/flora/pottedplant_small/woodyshrubbloom + name = "blooming woody potted shrub" + desc = "A woody shrub. This one seems to be in bloom." + icon_state = "plant-26" + +/obj/item/flora/pottedplant_small/bluefern + name = "blueish potted fern" + desc = "A miniature fern, with one big dark blue leaf." + icon_state = "plant-27" diff --git a/code/modules/overmap/ships/computers/engine_control.dm b/code/modules/overmap/ships/computers/engine_control.dm index b8b2bf0087f..8755c1de513 100644 --- a/code/modules/overmap/ships/computers/engine_control.dm +++ b/code/modules/overmap/ships/computers/engine_control.dm @@ -77,7 +77,7 @@ if(href_list["set_global_limit"]) var/newlim = tgui_input_number(usr, "Input the new thrust limit.", "Thrust Limit", connected.thrust_limit*100, 100, 0) - if(!CanInteract(usr, physical_state)) + if(!CanInteract(usr, GLOB.physical_state)) return TOPIC_NOACTION connected.thrust_limit = Clamp(newlim/100, 0, 1) for(var/datum/ship_engine/E in connected.engines) @@ -94,7 +94,7 @@ if(href_list["set_limit"]) var/datum/ship_engine/E = locate(href_list["engine"]) var/newlim = tgui_input_number(usr, "Input the new thrust limit.", "Thrust Limit", E.get_thrust_limit(), 100, 0) - if(!CanInteract(usr, physical_state)) + if(!CanInteract(usr, GLOB.physical_state)) return var/limit = Clamp(newlim/100, 0, 1) if(istype(E)) diff --git a/code/modules/overmap/ships/computers/helm.dm b/code/modules/overmap/ships/computers/helm.dm index 67299ce97ac..864b450de2d 100644 --- a/code/modules/overmap/ships/computers/helm.dm +++ b/code/modules/overmap/ships/computers/helm.dm @@ -194,7 +194,7 @@ if(action == "add") var/datum/computer_file/data/waypoint/R = new() var/sec_name = input("Input naviation entry name", "New navigation entry", "Sector #[known_sectors.len]") as text - if(!CanInteract(usr, physical_state)) + if(!CanInteract(usr, GLOB.physical_state)) return FALSE if(!sec_name) sec_name = "Sector #[known_sectors.len]" @@ -208,10 +208,10 @@ R.fields["y"] = connected.y if("new") var/newx = input("Input new entry x coordinate", "Coordinate input", connected.x) as num - if(!CanInteract(usr, physical_state)) + if(!CanInteract(usr, GLOB.physical_state)) return TRUE var/newy = input("Input new entry y coordinate", "Coordinate input", connected.y) as num - if(!CanInteract(usr, physical_state)) + if(!CanInteract(usr, GLOB.physical_state)) return FALSE R.fields["x"] = Clamp(newx, 1, world.maxx) R.fields["y"] = Clamp(newy, 1, world.maxy) @@ -225,14 +225,14 @@ if (action == "setx") var/newx = input("Input new destination x coordinate", "Coordinate input", dx) as num|null - if(!CanInteract(usr, physical_state)) + if(!CanInteract(usr, GLOB.physical_state)) return if (newx) dx = Clamp(newx, 1, world.maxx) if (action == "sety") var/newy = input("Input new destination y coordinate", "Coordinate input", dy) as num|null - if(!CanInteract(usr, physical_state)) + if(!CanInteract(usr, GLOB.physical_state)) return if (newy) dy = Clamp(newy, 1, world.maxy) diff --git a/code/modules/overmap/ships/computers/sensors.dm b/code/modules/overmap/ships/computers/sensors.dm index 32fc4888ba6..742030871cf 100644 --- a/code/modules/overmap/ships/computers/sensors.dm +++ b/code/modules/overmap/ships/computers/sensors.dm @@ -256,14 +256,14 @@ if(sensors) if (action == "range") var/nrange = tgui_input_number("Set new sensors range", "Sensor range", sensors.range, sensors.max_range, 1) - if(!CanInteract(usr, default_state)) + if(!CanInteract(usr, GLOB.default_state)) return FALSE if (nrange) sensors.set_desired_range(Clamp(nrange, 1, sensors.max_range)) return TRUE if(action == "range_choice") var/nrange = text2num(params["range_choice"]) - if(!CanInteract(usr, default_state)) + if(!CanInteract(usr, GLOB.default_state)) return FALSE if(nrange) sensors.set_desired_range(Clamp(nrange, 1, sensors.max_range)) diff --git a/code/modules/overmap/ships/computers/shuttle.dm b/code/modules/overmap/ships/computers/shuttle.dm index c5aa86131eb..ec6a5cb04f5 100644 --- a/code/modules/overmap/ships/computers/shuttle.dm +++ b/code/modules/overmap/ships/computers/shuttle.dm @@ -59,7 +59,7 @@ D = tgui_input_list(usr, "Choose shuttle destination.", "Shuttle Destination", possible_d) else to_chat(usr, SPAN_WARNING("No valid landing sites in range.")) - if(CanInteract(user, physical_state) && (D in possible_d)) + if(CanInteract(user, GLOB.physical_state) && (D in possible_d)) shuttle.set_destination(possible_d[D]) return TRUE diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index 10f0c8490fe..30f572e589b 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -49,7 +49,6 @@ icon = 'icons/obj/guns/shotgun.dmi' icon_state = "shotgun" item_state = "shotgun" - accuracy = 0 max_shells = 4 w_class = ITEMSIZE_LARGE force = 10 diff --git a/code/modules/psionics/interface/ui_hub.dm b/code/modules/psionics/interface/ui_hub.dm index 0230c934f1a..467ebfb79c7 100644 --- a/code/modules/psionics/interface/ui_hub.dm +++ b/code/modules/psionics/interface/ui_hub.dm @@ -43,7 +43,7 @@ ui.open() /obj/screen/psi/hub/ui_state(mob/user) - return conscious_state + return GLOB.conscious_state /obj/screen/psi/hub/ui_status(mob/user, datum/ui_state/state) return UI_INTERACTIVE diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm index 8e2535f3b02..075ca58c1a3 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm @@ -2191,7 +2191,7 @@ description = "A simple syrup that tastes strongly of mint." color = "#539830" taste_description = "mint" - + taste_mult = 5 glass_icon_state = "mint_syrupglass" glass_name = "glass of mint syrup" glass_desc = "Pure mint syrup. Prepare your tastebuds." @@ -2465,7 +2465,7 @@ glass_name = "mug of apple cider juice" glass_desc = "It's just spiced up apple juice. Sometimes the barista can't work miracles." -/singleton/reagent/drink/NTellamilkshake +/singleton/reagent/drink/ntella_milkshake name = "NTella Milkshake" description = "An intensely sweet chocolatey concoction with whipped cream on top." color = "#6d4124" @@ -2586,7 +2586,7 @@ glass_desc = "For everyone who liked to eat their toothpaste as a kid and never grew out of it." glass_center_of_mass = list("x"=16, "y"=7) -/singleton/reagent/drink/NTellahotchocolate +/singleton/reagent/drink/ntella_hot_chocolate name = "NTella Hot Chocolate" description = "It's like a cup of hot chocolate except... More everything." color = "#63432e" @@ -5814,6 +5814,7 @@ color = "#542a0c" glass_name = "chocolate syrup" glass_desc = "Thick chocolate syrup used to flavor drinks." + taste_mult = 5 /singleton/reagent/drink/syrup_caramel name = "Caramel Syrup" @@ -5822,6 +5823,7 @@ color = "#85461e" glass_name = "caramel syrup" glass_desc = "Thick caramel syrup used to flavor drinks." + taste_mult = 5 /singleton/reagent/drink/syrup_vanilla name = "Vanilla Syrup" @@ -5830,6 +5832,7 @@ color = "#f3e5ab" glass_name = "vanilla syrup" glass_desc = "Thick vanilla syrup used to flavor drinks." + taste_mult = 5 /singleton/reagent/drink/syrup_pumpkin name = "Pumpkin Spice Syrup" @@ -5838,6 +5841,8 @@ color = "#d88b4c" glass_name = "pumpkin spice syrup" glass_desc = "Thick spiced pumpkin syrup used to flavor drinks." + taste_mult = 5 + //berry /singleton/reagent/drink/syrup_berry name = "Berry Syrup" @@ -5846,6 +5851,8 @@ color = "#c00726" glass_name = "berry syrup" glass_desc = "Thick berry syrup used to flavor drinks." + taste_mult = 5 + //strawberry /singleton/reagent/drink/syrup_strawberry name = "Strawberry Syrup" @@ -5854,6 +5861,8 @@ color = "#b40000" glass_name = "strawberry syrup" glass_desc = "Thick strawberry syrup used to flavor drinks." + taste_mult = 5 + //blueberry /singleton/reagent/drink/syrup_blueberry name = "Blueberry Syrup" @@ -5862,6 +5871,8 @@ color = "#0a0094" glass_name = "blueberry syrup" glass_desc = "Thick blueberry syrup used to flavor drinks." + taste_mult = 5 + //rasp /singleton/reagent/drink/syrup_raspberry name = "Raspberry Syrup" @@ -5870,6 +5881,8 @@ color = "#ad0042" glass_name = "raspberry syrup" glass_desc = "Thick raspberry syrup used to flavor drinks." + taste_mult = 5 + //black rasp /singleton/reagent/drink/syrup_blackraspberry name = "Black Raspberry Syrup" @@ -5878,6 +5891,8 @@ color = "#1b1618" glass_name = "black raspberry syrup" glass_desc = "Thick black raspberry syrup used to flavor drinks." + taste_mult = 5 + //blue rasp /singleton/reagent/drink/syrup_blueraspberry name = "Blue Raspberry Syrup" @@ -5886,6 +5901,8 @@ color = "#21154d" glass_name = "blue raspberry syrup" glass_desc = "Thick blue raspberry syrup used to flavor drinks." + taste_mult = 5 + //glow /singleton/reagent/drink/syrup_glowberry name = "Glowberry Syrup" @@ -5894,6 +5911,8 @@ color = "#f3e5ab" glass_name = "glowberry syrup" glass_desc = "Thick glowberry syrup used to flavor drinks." + taste_mult = 5 + //poison /singleton/reagent/drink/syrup_poisonberry name = "Poison Berry Syrup" @@ -5902,6 +5921,8 @@ color = "#f3e5ab" glass_name = "poison berry syrup" glass_desc = "Thick poison berry syrup used to flavor drinks." + taste_mult = 5 + //death /singleton/reagent/drink/syrup_deathberry name = "Death Berry Syrup" @@ -5910,6 +5931,8 @@ color = "#f3e5ab" glass_name = "death berry syrup" glass_desc = "Thick death berry syrup used to flavor drinks." + taste_mult = 5 + //ylpha /singleton/reagent/drink/syrup_ylphaberry name = "Ylpha Berry Syrup" @@ -5918,6 +5941,8 @@ color = "#790042" glass_name = "ylpha berry syrup" glass_desc = "Thick ylpha berry syrup used to flavor drinks." + taste_mult = 5 + //dirt /singleton/reagent/drink/syrup_dirtberry name = "Dirt Berry Syrup" @@ -5926,7 +5951,7 @@ color = "#85572c" glass_name = "dirt berry syrup" glass_desc = "Thick dirt berry syrup used to flavor drinks." - + taste_mult = 5 /singleton/reagent/drink/syrup_simple name = "Simple Syrup" @@ -5947,6 +5972,7 @@ reagent_state = LIQUID description = "A caramel-based sauce. Now you're caramel dancin'." taste_description = "toasty sweet cream" + taste_mult = 2 /singleton/reagent/diona_powder name = "Dionae Powder" diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index 9a45a6ec12d..fe70060af87 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -3041,10 +3041,10 @@ catalysts = list(/singleton/reagent/enzyme = 5) result_amount = 1 -/datum/chemical_reaction/drink/NTellashake +/datum/chemical_reaction/drink/ntella_shake name = "NTella milkshake" id = "NTellamilkshake" - result = /singleton/reagent/drink/NTellamilkshake + result = /singleton/reagent/drink/ntella_milkshake required_reagents = list(/singleton/reagent/drink/milkshake = 5, /singleton/reagent/nutriment/choconutspread = 1) result_amount = 6 @@ -3118,10 +3118,10 @@ required_reagents = list(/singleton/reagent/drink/milkshake = 5, /singleton/reagent/drink/mintsyrup = 1) result_amount = 6 -/datum/chemical_reaction/drink/NTellahotchocolate +/datum/chemical_reaction/drink/ntella_hot_chocolate name = "NTella hot chocolate" id = "NTellahotchocolate" - result = /singleton/reagent/drink/NTellahotchocolate + result = /singleton/reagent/drink/ntella_hot_chocolate required_reagents = list(/singleton/reagent/drink/milk = 1, /singleton/reagent/nutriment/choconutspread = 1, /singleton/reagent/drink/milk/cream = 1) result_amount = 3 diff --git a/code/modules/reagents/reagent_containers/food/cans.dm b/code/modules/reagents/reagent_containers/food/cans.dm index 8e8f2e19107..5ca3f1e9c47 100644 --- a/code/modules/reagents/reagent_containers/food/cans.dm +++ b/code/modules/reagents/reagent_containers/food/cans.dm @@ -242,6 +242,7 @@ name = "comet cola can" desc = "Getmore's most popular line of soda. A generic cola, otherwise." icon_state = "cola" + item_state = "cola" center_of_mass = list("x"=16, "y"=10) reagents_to_add = list(/singleton/reagent/drink/space_cola = 30) @@ -249,6 +250,7 @@ name = "stellar jolt can" desc = "For those who have a need for caffeine stronger than would be sensible." icon_state = "space_mountain_wind" + item_state = "space_mountain_wind" center_of_mass = list("x"=16, "y"=10) reagents_to_add = list(/singleton/reagent/drink/spacemountainwind = 30) @@ -257,6 +259,7 @@ name = "getmore energy can" desc = "An extremely ill-advised combination of excessive caffeine and alcohol. Getmore's most controversial product to date!" icon_state = "thirteen_loko" + icon_state = "thirteen_loko" center_of_mass = list("x"=16, "y"=10) reagents_to_add = list(/singleton/reagent/alcohol/thirteenloko = 30) @@ -265,6 +268,7 @@ name = "getmore root-cola can" desc = "A canned mixture of Comet Cola and Getmore Root Beer. More popular than one would expect." icon_state = "dr_gibb" + item_state = "dr_gibb" center_of_mass = list("x"=16, "y"=10) reagents_to_add = list(/singleton/reagent/drink/dr_gibb = 30) @@ -273,6 +277,7 @@ name = "orange starshine can" desc = "A sugary-sweet citrus soda." icon_state = "starkist" + item_state = "starkist" center_of_mass = list("x"=16, "y"=10) reagents_to_add = list(/singleton/reagent/drink/brownstar = 30) @@ -289,6 +294,7 @@ name = "\improper Lemon-Lime" desc = "Generic lemon-lime soda." icon_state = "lemon-lime" + item_state = "lemon-lime" center_of_mass = list("x"=16, "y"=10) reagents_to_add = list(/singleton/reagent/drink/lemon_lime = 30) @@ -297,6 +303,7 @@ name = "\improper Silversun Wave iced tea" desc = "Marketed as a favorite amongst parched Silversun beachgoers, there's actually more sugar in this than there is tea." icon_state = "ice_tea_can" + item_state = "ice_tea_can" center_of_mass = list("x"=16, "y"=10) reagents_to_add = list(/singleton/reagent/drink/icetea = 30) @@ -305,6 +312,7 @@ name = "\improper Grapel juice" desc = "500 pages of rules of how to appropriately enter into a combat with this juice!" icon_state = "grapesoda" + item_state = "grapesoda" center_of_mass = list("x"=16, "y"=10) reagents_to_add = list(/singleton/reagent/drink/grapejuice = 30) @@ -313,6 +321,7 @@ name = "\improper T-Borg's tonic water" desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away." icon_state = "tonic" + item_state = "tonic" center_of_mass = list("x"=16, "y"=10) reagents_to_add = list(/singleton/reagent/drink/tonic = 50) @@ -321,6 +330,7 @@ name = "soda water" desc = "A can of soda water. Still water's more refreshing cousin." icon_state = "sodawater" + item_state = "sodawater" center_of_mass = list("x"=16, "y"=10) reagents_to_add = list(/singleton/reagent/drink/sodawater = 50) @@ -329,6 +339,7 @@ name = "\improper Phoron Punch!" desc = "A radical looking can of " + SPAN_WARNING("Phoron Punch!") + " Phoron poisoning has never been more extreme! " + SPAN_DANGER("WARNING: Phoron is toxic to non-Vaurca. Consuming this product might lead to death.") icon_state = "phoron_punch" + item_state = "phoron_punch" center_of_mass = list("x"=16, "y"=8) can_size_overrides = list("x" = 1) reagents_to_add = list(/singleton/reagent/kois/clean = 10, /singleton/reagent/toxin/phoron = 5) @@ -337,6 +348,7 @@ name = "getmore root beer can" desc = "A classic Earth drink, made from various roots." icon_state = "root_beer" + item_state = "root_beer" center_of_mass = list("x"=16, "y"=10) reagents_to_add = list(/singleton/reagent/drink/root_beer = 30) @@ -353,60 +365,70 @@ name = "\improper Zo'ra Soda Cherry" desc = "A can of cherry flavoured Zo'ra Soda energy drink, with V'krexi additives. All good energy drinks come in cherry." icon_state = "zoracherry" + item_state = "zoracherry" reagents_to_add = list(/singleton/reagent/drink/zorasoda/cherry = 30) /obj/item/reagent_containers/food/drinks/cans/zorasoda/phoron name = "\improper Zo'ra Soda Phoron Passion" desc = "A can of grape flavoured Zo'ra Soda energy drink, with V'krexi additives. Tastes nothing like phoron according to Unbound vaurca taste testers." icon_state = "phoronpassion" + item_state = "phoronpassion" reagents_to_add = list(/singleton/reagent/drink/zorasoda/phoron = 30) /obj/item/reagent_containers/food/drinks/cans/zorasoda/klax name = "\improper K'laxan Energy Crush" desc = "A can of nitrogen-infused creamy orange zest flavoured Zo'ra Soda energy drink, with V'krexi additives. The smooth taste is engineered to near perfection." icon_state = "klaxancrush" + item_state = "klaxancrush" reagents_to_add = list(/singleton/reagent/drink/zorasoda/klax = 30) /obj/item/reagent_containers/food/drinks/cans/zorasoda/cthur name = "\improper C'thur Rockin' Raspberry" desc = "A can of \"blue raspberry\" flavoured Zo'ra Soda energy drink, with V'krexi additives. Tastes like a more flowery and aromatic raspberry." icon_state = "cthurberry" + item_state = "cthurberry" reagents_to_add = list(/singleton/reagent/drink/zorasoda/cthur = 30) /obj/item/reagent_containers/food/drinks/cans/zorasoda/venomgrass name = "\improper Zo'ra Sour Venom Grass" desc = "A can of sour \"venom grass\" flavoured Zo'ra Soda energy drink, with V'krexi additives. Tastes like a cloud of angry stinging acidic bees." icon_state = "sourvenomgrass" + item_state = "sourvenomgrass" reagents_to_add = list(/singleton/reagent/drink/zorasoda/venomgrass = 30) /obj/item/reagent_containers/food/drinks/cans/zorasoda/hozm // "Contraband" name = "\improper High Octane Zorane Might" desc = "A can of mint flavoured Zo'ra Soda energy drink, with a lot of V'krexi additives. Tastes like impaling the roof of your mouth with a freezing cold spear laced with angry bees and road salt.
" + SPAN_DANGER(" WARNING: Not for the faint hearted!") icon_state = "hozm" + item_state = "hozm" reagents_to_add = list(/singleton/reagent/drink/zorasoda/hozm = 30) /obj/item/reagent_containers/food/drinks/cans/zorasoda/kois name = "\improper Zo'ra Soda K'ois Twist" desc = "A can of K'ois-imitation flavoured Zo'ra Soda energy drink, with V'krexi additives. Contains no K'ois, contrary to what the name may imply." icon_state = "koistwist" + item_state = "koistwist" reagents_to_add = list(/singleton/reagent/drink/zorasoda/kois = 30) /obj/item/reagent_containers/food/drinks/cans/zorasoda/drone name = "\improper Vaurca Drone Fuel" desc = "A can of industrial fluid flavoured Zo'ra Soda energy drink, with V'krexi additives, meant for Vaurca.
" + SPAN_DANGER(" WARNING: Known to induce vomiting in all species except vaurcae and dionae!") icon_state = "dronefuel" + item_state = "dronefuel" reagents_to_add = list(/singleton/reagent/drink/zorasoda/drone = 30) /obj/item/reagent_containers/food/drinks/cans/zorasoda/jelly name = "\improper Royal Vaurca Jelly" desc = "A can of..." + SPAN_ITALIC(" sludge?") + " It smells kind of pleasant either way. Royal jelly is a nutritious concentrated substance commonly created by Caretaker Vaurca in order to feed larvae. It is known to have a stimulating effect in most, if not all, species." icon_state = "royaljelly" + item_state = "royaljelly" reagents_to_add = list(/singleton/reagent/drink/zorasoda/jelly = 30) /obj/item/reagent_containers/food/drinks/cans/adhomai_milk name = "fermented fatshouters milk" desc = "A can of fermented fatshouters milk, imported from Adhomai." icon_state = "milk_can" + item_state = "milk_can" center_of_mass = list("x"=16, "y"=10) desc_extended = "Fermend fatshouters milk is a drink that originated among the nomadic populations of Rhazar'Hrujmagh, and it has spread to the rest of Adhomai." @@ -416,6 +438,7 @@ name = "\improper Hakhma Milk" desc = "A can of Hakhma beetle milk, sourced from Scarab and Drifter communities." icon_state = "beetlemilk" + item_state = "beetlemilk" center_of_mass = list("x"=17, "y"=10) reagents_to_add = list(/singleton/reagent/drink/milk/beetle = 30) can_size_overrides = list("x" = 1, "y" = -2) @@ -424,6 +447,7 @@ name = "Cooling Breeze" desc = "The most refreshing thing you can find on the market, based on a Skrell medicinal plant. No salt or sugar." icon_state = "dyncan" + item_state = "dyncan" center_of_mass = list("x"=16, "y"=10) reagents_to_add = list(/singleton/reagent/drink/dynjuice/cold = 30) @@ -431,6 +455,7 @@ name = "\improper Three Towns Cider" desc = "A cider made on the west coast of the Moghresian Sea, this is simply one of many brands made in a region known for its craft local butanol, shipped throughout the Wasteland." icon_state = "three_towns_cider" + item_state = "three_towns_cider" center_of_mass = list("x"=16, "y"=10) reagents_to_add = list(/singleton/reagent/alcohol/butanol/threetownscider = 30) @@ -441,6 +466,7 @@ colonists, it was introduced to Adhomai by the Army Expeditionary Force and transformed into a carbonated drink. The beverage is popular with factory workers and university \ students because of its stimulant effect." icon_state = "hrozamal_soda" + item_state = "hrozamal_soda" center_of_mass = list("x"=16, "y"=10) reagents_to_add = list(/singleton/reagent/drink/hrozamal_soda = 30) @@ -449,6 +475,7 @@ name = "diet cola can" desc = "Comet Cola! Now in diet!" icon_state = "diet_cola" + item_state = "diet_cola" center_of_mass = list("x"=16, "y"=10) reagents_to_add = list(/singleton/reagent/drink/diet_cola = 30) @@ -457,6 +484,7 @@ desc = "Made from the NEW Xanu Prime peaches." desc_extended = "The rehabilitating environment of Xanu has allowed for small-scale agriculture to bloom. Xanu Rush! Is the number one Coalition soda, despite its dull taste." icon_state = "xanu_rush" + item_state = "xanu_rush" center_of_mass = list("x"=16, "y"=10) reagents_to_add = list(/singleton/reagent/drink/peach_soda = 30) @@ -465,6 +493,7 @@ desc = "Contains only water, malt and hops. Not really as high-quality as the label says, but it's still popular. This particular line of beer is made by Getmore on New Gibson, specifically in the Ovanstad of \ Virklund in a massive beer brewery complex. It quickly became the most consumed kind of beer across the Republic of Biesel and has since been in stock in practically every bar across the nation." icon_state = "space_beer" + item_state = "space_beer" center_of_mass = list("x"=16, "y"=10) reagents_to_add = list(/singleton/reagent/alcohol/beer = 40) @@ -472,20 +501,24 @@ name = "\improper Ebisu Super Dry" desc = "Konyang's favourite rice beer brand, 200 years running." icon_state = "ebisu" + item_state = "ebisu" reagents_to_add = list(/singleton/reagent/alcohol/rice_beer = 40) /obj/item/reagent_containers/food/drinks/cans/beer/rice/shimauma name = "\improper Shimauma Ichiban" desc = "Konyang's most middling rice beer brand. Not as popular as Ebisu, but it's comfortable in second place." icon_state = "shimauma" + item_state = "shimauma" /obj/item/reagent_containers/food/drinks/cans/beer/rice/moonlabor name = "\improper Moonlabor Malt's" desc = "Konyang's underdog rice beer brand. Popular amongst New Hai Phongers, for reasons unknown." icon_state = "moonlabor" + item_state = "moonlabor" /obj/item/reagent_containers/food/drinks/cans/melon_soda name = "Kansumi Melon Soda" desc = "Konyang's favourite melon soda, now available in can form!" icon_state = "melon_soda" + item_state = "melon_soda" reagents_to_add = list(/singleton/reagent/drink/melon_soda = 30) diff --git a/code/modules/reagents/reagent_containers/food/snacks/baked.dm b/code/modules/reagents/reagent_containers/food/snacks/baked.dm index af0846a6023..6b0c5c8dc64 100644 --- a/code/modules/reagents/reagent_containers/food/snacks/baked.dm +++ b/code/modules/reagents/reagent_containers/food/snacks/baked.dm @@ -131,3 +131,69 @@ reagents_to_add = list(/singleton/reagent/nutriment = 6, /singleton/reagent/drugs/psilocybin = 6) reagent_data = list(/singleton/reagent/nutriment = list("mushroom" = 6)) bitesize = 3 + +/obj/item/reagent_containers/food/snacks/sliceable/meat_lasagna_tray + name = "meat lasagna tray" + desc = "Who doesn't love a hot, meaty, cheesy lasagna? Don't worry, there's enough in this tray for everyone! Assuming 'everyone' is 6 people and nobody wants seconds." + icon = 'icons/obj/item/reagent_containers/food/baked.dmi' + icon_state = "lasagnatray_meat" + slice_path = /obj/item/reagent_containers/food/snacks/lasagna_meat_slice + slices_num = 6 + trash = /obj/item/trash/grease + drop_sound = /singleton/sound_category/tray_hit_sound + center_of_mass = list("x"=16, "y"=17) + filling_color = "#e08b2a" + reagents_to_add = list(/singleton/reagent/nutriment = 24, /singleton/reagent/nutriment/protein = 24, /singleton/reagent/nutriment/protein/cheese = 12) + reagent_data = list(/singleton/reagent/nutriment = list("pasta" = 4, "tomato" = 2)) + bitesize = 6 + +/obj/item/reagent_containers/food/snacks/lasagna_meat_slice + name = "meat lasagna" + desc = "Not Adhomian food, yet... Very popular among Tajarans on Mondays for some reason." + icon = 'icons/obj/item/reagent_containers/food/baked.dmi' + icon_state = "lasagna_meat" + trash = /obj/item/trash/plate + filling_color = "#e08b2a" + bitesize = 2 + center_of_mass = list("x"=16, "y"=12) + +/obj/item/reagent_containers/food/snacks/lasagna_meat_slice/update_icon() + var/percent_lasagna_meat_slice = round((reagents.total_volume / 10) * 100) + switch(percent_lasagna_meat_slice) + if(0 to 50) + icon_state = "lasagna_meat_half" + if(51 to INFINITY) + icon_state = "lasagna_meat" + +/obj/item/reagent_containers/food/snacks/sliceable/veggie_lasagna_tray + name = "veggie lasagna tray" + desc = "Cheesy, delicious, and vegetarian! Don't worry, there's enough in this tray for everyone! Assuming 'everyone' is 6 people and nobody wants seconds." + icon = 'icons/obj/item/reagent_containers/food/baked.dmi' + icon_state = "lasagnatray_veg" + slice_path = /obj/item/reagent_containers/food/snacks/lasagna_veggie_slice + slices_num = 6 + trash = /obj/item/trash/grease + drop_sound = /singleton/sound_category/tray_hit_sound + center_of_mass = list("x"=16, "y"=17) + filling_color = "#e08b2a" + reagents_to_add = list(/singleton/reagent/nutriment = 48, /singleton/reagent/nutriment/protein/cheese = 12) + reagent_data = list(/singleton/reagent/nutriment = list("pasta" = 4, "tomato" = 2, "mushrooms" = 2)) + bitesize = 6 + +/obj/item/reagent_containers/food/snacks/lasagna_veggie_slice + name = "veggie lasagna" + desc = "Layers of pasta, sauce, veggies and mushrooms carefully stacked on each other into an apartment block of deliciousness." + icon = 'icons/obj/item/reagent_containers/food/baked.dmi' + icon_state = "lasagna_veg" + trash = /obj/item/trash/plate + filling_color = "#e08b2a" + bitesize = 3 + center_of_mass = list("x"=16, "y"=12) + +/obj/item/reagent_containers/food/snacks/lasagna_veggie_slice/update_icon() + var/percent_lasagna_veggie_slice = round((reagents.total_volume / 10) * 100) + switch(percent_lasagna_veggie_slice) + if(0 to 50) + icon_state = "lasagna_veg_half" + if(51 to INFINITY) + icon_state = "lasagna_veg" diff --git a/code/modules/reagents/reagent_containers/food/snacks/breads.dm b/code/modules/reagents/reagent_containers/food/snacks/breads.dm index 265a1337c5e..191750a79b0 100644 --- a/code/modules/reagents/reagent_containers/food/snacks/breads.dm +++ b/code/modules/reagents/reagent_containers/food/snacks/breads.dm @@ -395,7 +395,7 @@ reagent_data = list(/singleton/reagent/nutriment = list("toasted bread" = 2)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/NTellabread +/obj/item/reagent_containers/food/snacks/ntella_bread name = "NTella bread slice" desc = "A slice of bread covered with delicious chocolate-hazelnut spread." icon = 'icons/obj/item/reagent_containers/food/bread.dmi' diff --git a/code/modules/reagents/reagent_containers/food/snacks/cultural/human.dm b/code/modules/reagents/reagent_containers/food/snacks/cultural/human.dm index f46ba79abe2..6f22b0de2f3 100644 --- a/code/modules/reagents/reagent_containers/food/snacks/cultural/human.dm +++ b/code/modules/reagents/reagent_containers/food/snacks/cultural/human.dm @@ -618,3 +618,23 @@ icon_state = "ladylulaine_slice" filling_color = "#dbddff" trash = /obj/item/trash/plate + +/obj/item/reagent_containers/food/snacks/pazillo + name = "pazillo" + desc = "A simple handheld pastry that originates from Assunzione, this is a calzone filled with a mixture of ground chickpeas, onions and tomatoes mixed together. It is sometimes served with olive oil, artichoke spread, or garlic sauce, but can also be eaten on it's own. It's tradtionally considered street food, but can occasionally be found in proper restaurants." + icon = 'icons/obj/item/reagent_containers/food/cultural/human.dmi' + icon_state = "pazillo" + filling_color = "#5c802e" + reagents_to_add = list(/singleton/reagent/nutriment/ = 8) + bitesize = 2 + reagent_data = list(/singleton/reagent/nutriment = list("dough" = 5, "chickpeas" = 3, "onion" = 3, "tomato" = 3)) + +/obj/item/reagent_containers/food/snacks/pazillo/update_icon() + var/percent_pazillo = round((reagents.total_volume / 8) * 100) + switch(percent_pazillo) + if(0 to 50) + icon_state = "pazillo_small" + if(51 to 95) + icon_state = "pazillo_bitten" + if(96 to INFINITY) + icon_state = "pazillo" diff --git a/code/modules/reagents/reagent_containers/food/snacks/cultural/unathi.dm b/code/modules/reagents/reagent_containers/food/snacks/cultural/unathi.dm index 5d65136b493..e01349eff66 100644 --- a/code/modules/reagents/reagent_containers/food/snacks/cultural/unathi.dm +++ b/code/modules/reagents/reagent_containers/food/snacks/cultural/unathi.dm @@ -190,3 +190,29 @@ reagents_to_add = list(/singleton/reagent/nutriment = 3, /singleton/reagent/nutriment/protein = 8, /singleton/reagent/nutriment/coco = 3, /singleton/reagent/blackpepper = 3) reagent_data = list(/singleton/reagent/nutriment = list("aghrassh nuts" = 3, "mealy paste" = 3)) bitesize = 5 + +/obj/item/reagent_containers/food/snacks/sliceable/eyebowl + name = "eyebowl" + desc = "A zesty stew of ground meat, Moghesian tomato pulp, and ground agghrash nut mixed together and topped with two egg yolks staring back at you like eyes. It can be made with different kinds of meat, and seasoned with either hot sauce or blood. This is a large serving, typically reserved for hungry Unathi, miners, or other folks who have to get by on one big meal to last them a whole day." + icon = 'icons/obj/item/reagent_containers/food/cultural/unathi.dmi' + icon_state = "eyebowl" + trash = /obj/item/trash/custard_bowl + reagents_to_add = list(/singleton/reagent/nutriment = 3, /singleton/reagent/nutriment/protein = 12, /singleton/reagent/blackpepper = 2) + reagent_data = list(/singleton/reagent/nutriment = list("aghrassh nuts" = 3, "zesty tomatoes" = 5)) + bitesize = 5 + drop_sound = 'sound/items/drop/glass.ogg' + pickup_sound = 'sound/items/pickup/glass.ogg' + slice_path = /obj/item/reagent_containers/food/snacks/hatchbowl + slices_num = 2 + filling_color = "#771504" + +/obj/item/reagent_containers/food/snacks/hatchbowl + name = "hatchbowl" + desc = "Short for 'hatchling eyebowl', this zesty stew of ground meat, Moghesian tomato pulp, and ground agghrash nut topped with an egg yolk is a smaller serving of the eyebowl. It is usually eaten by smaller Unathi, non-Unathi species, or by grown Unathi who just aren't all that hungry. The dish spread throughout the spur and is often enjoyed by other species as well. It can be made with different kinds of meat, and seasoned with either hot sauce or blood." + icon = 'icons/obj/item/reagent_containers/food/cultural/unathi.dmi' + icon_state = "eyebowl_small" + trash = /obj/item/trash/custard_bowl + bitesize = 3 + drop_sound = 'sound/items/drop/glass.ogg' + pickup_sound = 'sound/items/pickup/glass.ogg' + diff --git a/code/modules/reagents/reagent_containers/food/snacks/meat.dm b/code/modules/reagents/reagent_containers/food/snacks/meat.dm index 32805676d63..d5b6c2f4212 100644 --- a/code/modules/reagents/reagent_containers/food/snacks/meat.dm +++ b/code/modules/reagents/reagent_containers/food/snacks/meat.dm @@ -367,20 +367,6 @@ reagents.trans_to(sashimi, transfer_amt) qdel(src) -/obj/item/reagent_containers/food/snacks/lasagna - name = "lasagna" - desc = "Favorite of cats." - icon = 'icons/obj/item/reagent_containers/food/meat.dmi' - icon_state = "lasagna" - trash = /obj/item/trash/grease - drop_sound = /singleton/sound_category/tray_hit_sound - center_of_mass = list("x"=16, "y"=17) - filling_color = "#EDF291" - - reagents_to_add = list(/singleton/reagent/nutriment = 12, /singleton/reagent/nutriment/protein = 12) - reagent_data = list(/singleton/reagent/nutriment = list("pasta" = 4, "tomato" = 2)) - bitesize = 6 - /obj/item/reagent_containers/food/snacks/donerkebab name = "doner kebab" desc = "A delicious sandwich-like food from ancient Earth. The meat is typically cooked on a vertical rotisserie." diff --git a/code/modules/reagents/reagent_containers/food/snacks/pastries.dm b/code/modules/reagents/reagent_containers/food/snacks/pastries.dm index e03650674a5..810957b0825 100644 --- a/code/modules/reagents/reagent_containers/food/snacks/pastries.dm +++ b/code/modules/reagents/reagent_containers/food/snacks/pastries.dm @@ -28,20 +28,63 @@ /obj/item/reagent_containers/food/snacks/pancakes name = "pancakes" + gender = PLURAL desc = "Pancakes, delicious." icon = 'icons/obj/item/reagent_containers/food/pastries.dmi' icon_state = "pancakes" trash = /obj/item/trash/plate reagents_to_add = list(/singleton/reagent/nutriment = 8) reagent_data = list(/singleton/reagent/nutriment = list("pancake" = 8)) - bitesize = 2 - filling_color = "#EDF291" + bitesize = 3 + filling_color = "#facf7e" + +///makes pancakes change their look and name, flavor and description when you add syrup to them instead of having to have them each be an entirely separate food item that has to be made by the cook. This also means ingredient contents carry over if you turn one type of pancake into another. +/obj/item/reagent_containers/food/snacks/pancakes/on_reagent_change() + if(reagents.has_reagent(/singleton/reagent/drink/syrup_chocolate)) + name = "chocolate pancakes" + desc = "Delicious pancakes covered in chocolate syrup." + icon_state = "pancakes_chocolate" + + if(reagents.has_reagent(/singleton/reagent/drink/syrup_berry)) + name = "berry pancakes" + desc = "Delicious pancakes covered in berry syrup." + icon_state = "pancakes_berry" + + if(reagents.has_reagent(/singleton/reagent/drink/syrup_strawberry)) + name = "strawberry pancakes" + desc = "Delicious pancakes covered in strawberry syrup." + icon_state = "pancakes_strawberry" + + if(reagents.has_reagent(/singleton/reagent/drink/syrup_caramel)) + name = "caramel pancakes" + desc = "Delicious pancakes covered in caramel syrup." + icon_state = "pancakes_caramel" + + if(reagents.has_reagent(/singleton/reagent/drink/syrup_vanilla)) + name = "vanilla pancakes" + desc = "Delicious pancakes covered in vanilla syrup." + icon_state = "pancakes_vanilla" + + if(reagents.has_reagent(/singleton/reagent/drink/syrup_pumpkin)) + name = "pumpkin spice pancakes" + desc = "A delicious autumn breakfast." + icon_state = "pancakes_pumpkin" + + if(reagents.has_reagent(/singleton/reagent/drink/syrup_ylphaberry)) + name = "ylpha berry pancakes" + desc = "Overwhelmingly sweet with a side of tangy, a delicious way to wake up!" + icon_state = "pancakes_ylpha" + + if(reagents.has_any_reagent(list(/singleton/reagent/nutriment/ketchup, /singleton/reagent/nutriment/mayonnaise, /singleton/reagent/antidexafen, /singleton/reagent/carbon))) //Because scrubbers and quirky people exist. + name = "ruined pancakes" + desc = "Why? Who hurt you?" + icon_state = "pancakes_ruined" /obj/item/reagent_containers/food/snacks/pancakes/berry name = "berry pancakes" desc = "Pancakes with berries, delicious." icon = 'icons/obj/item/reagent_containers/food/pastries.dmi' - icon_state = "berry_pancakes" + icon_state = "pancakes_berry" ////////////////////////////////////////////WAFFLES//////////////////////////////////////////// @@ -413,19 +456,19 @@ reagents_to_add = list(/singleton/reagent/nutriment = 3) reagent_data = list(/singleton/reagent/nutriment = list("cake" = 5, "sweetness" = 5, "apple" = 5)) -/obj/item/reagent_containers/food/snacks/sliceable/cake/NTellacheesecake +/obj/item/reagent_containers/food/snacks/sliceable/cake/ntella_cheesecake name = "NTella cheesecake" desc = "An elaborate layer cheesecake made with chocolate hazelnut spread. You gain calories just by looking at it for too long." icon = 'icons/obj/item/reagent_containers/food/pastries.dmi' icon_state = "NTellacheesecake" - slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/NTellacheesecake_slice + slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/ntella_cheesecake_slice slices_num = 5 filling_color = "#331c03" center_of_mass = list("x"=16, "y"=10) reagents_to_add = list(/singleton/reagent/nutriment = 20) reagent_data = list(/singleton/reagent/nutriment = list("hazelnut chocolate" = 15, "creamy cheese" = 10, "crunchy cookie base" = 5)) -/obj/item/reagent_containers/food/snacks/cakeslice/NTellacheesecake_slice +/obj/item/reagent_containers/food/snacks/cakeslice/ntella_cheesecake_slice name = "NTella cheesecake slice" desc = "A slice of cake marrying the chocolate taste of NTella with the creamy smoothness of cheesecake, all on a cookie crumble base." icon = 'icons/obj/item/reagent_containers/food/pastries.dmi' @@ -435,6 +478,28 @@ bitesize = 2 center_of_mass = list("x"=16, "y"=14) +/obj/item/reagent_containers/food/snacks/sliceable/cake/starcake // + name = "starcake" + desc = "This pound cake mixes citrus fruits with cocoa, and has a layer of creamy glaze on top. It's dense and relatively simple to make. You can find it in various coffee shops and bakeries around the spur, but for some uknown reason, in the weeping stars system it has become somewhat associated with funerals over the years." + icon = 'icons/obj/item/reagent_containers/food/pastries.dmi' + icon_state = "starcake" + slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/starcake + slices_num = 6 + filling_color = "#f0b97b" + center_of_mass = list("x"=16, "y"=10) + reagents_to_add = list(/singleton/reagent/nutriment = 15, /singleton/reagent/nutriment/glucose = 3) + reagent_data = list(/singleton/reagent/nutriment = list("cake" = 10, "cocoa" = 10, "orange" = 15)) + +/obj/item/reagent_containers/food/snacks/cakeslice/starcake + name = "orange cake slice" + desc = "A thin slice of pound cake that mixes citrus fruits with cocoa, and has a layer of creamy glaze on top. Enjoyed with a side of coffee or tea all over the spur, in the weeping stars system it is also frequently served in funerals for some reason." + icon = 'icons/obj/item/reagent_containers/food/pastries.dmi' + icon_state = "starcake_slice" + trash = /obj/item/trash/plate + filling_color = "#f0b97b" + bitesize = 2 + center_of_mass = list("x"=16, "y"=14) + //Predesigned pies //======================= /obj/item/reagent_containers/food/snacks/berryclafoutis diff --git a/code/modules/surgery/facial_surgery.dm b/code/modules/surgery/facial_surgery.dm index c33e24e3eb2..456d6383288 100644 --- a/code/modules/surgery/facial_surgery.dm +++ b/code/modules/surgery/facial_surgery.dm @@ -81,7 +81,7 @@ target.dna.real_name = getName if(target.mind) target.mind.name = target.name - target.change_appearance(APPEARANCE_PLASTICSURGERY, user, TRUE, ui_state = default_state, state_object = target) + target.change_appearance(APPEARANCE_PLASTICSURGERY, user, TRUE, ui_state = GLOB.default_state, state_object = target) target.op_stage.face = FACE_ALTERED @@ -229,7 +229,7 @@ target.dna.real_name = getName if(target.mind) target.mind.name = target.name - target.change_appearance(APPEARANCE_PLASTICSURGERY, user, TRUE, ui_state = default_state, state_object = target) + target.change_appearance(APPEARANCE_PLASTICSURGERY, user, TRUE, ui_state = GLOB.default_state, state_object = target) target.op_stage.face = FACE_ALTERED diff --git a/code/modules/synthesized_instruments/real_instruments.dm b/code/modules/synthesized_instruments/real_instruments.dm index 9e52907b365..49c726800c1 100644 --- a/code/modules/synthesized_instruments/real_instruments.dm +++ b/code/modules/synthesized_instruments/real_instruments.dm @@ -45,12 +45,12 @@ var/t = "" do t = html_encode(input(usr, "Please paste the entire song, formatted:", text("[]", owner.name), t) as message) - if(!CanInteractWith(usr, owner, physical_state)) + if(!CanInteractWith(usr, owner, GLOB.physical_state)) return if(length(t) >= 2*src.maximum_lines*src.maximum_line_length) var/cont = input(usr, "Your message is too long! Would you like to continue editing it?", "", "yes") in list("yes", "no") - if(!CanInteractWith(usr, owner, physical_state)) + if(!CanInteractWith(usr, owner, GLOB.physical_state)) return if(cont == "no") break @@ -98,7 +98,7 @@ src.player.song.sustain_timer = max(min(player.song.sustain_timer+value, musical_config.longest_sustain_timer), 1) if ("soft_coeff") var/new_coeff = input(usr, "from [musical_config.gentlest_drop] to [musical_config.steepest_drop]") as num - if(!CanInteractWith(usr, owner, physical_state)) + if(!CanInteractWith(usr, owner, GLOB.physical_state)) return new_coeff = round(min(max(new_coeff, musical_config.gentlest_drop), musical_config.steepest_drop), 0.001) src.player.song.soft_coeff = new_coeff @@ -112,7 +112,7 @@ categories |= instrument.category var/category = input(usr, "Choose a category") as null|anything in categories - if(!CanInteractWith(usr, owner, physical_state)) + if(!CanInteractWith(usr, owner, GLOB.physical_state)) return var/list/instruments_available = list() for (var/key in as_list) @@ -121,7 +121,7 @@ instruments_available += key var/new_instrument = input(usr, "Choose an instrument") as null|anything in instruments_available - if(!CanInteractWith(usr, owner, physical_state)) + if(!CanInteractWith(usr, owner, GLOB.physical_state)) return if (new_instrument) src.player.song.instrument_data = instruments[new_instrument] diff --git a/code/modules/tgui/external.dm b/code/modules/tgui/external.dm index 04715ec05d0..48235d976f5 100644 --- a/code/modules/tgui/external.dm +++ b/code/modules/tgui/external.dm @@ -119,7 +119,7 @@ * This is a proc over a var for memory reasons */ /datum/proc/ui_state(mob/user) - return default_state + return GLOB.default_state /** * global diff --git a/code/modules/tgui/states.dm b/code/modules/tgui/states.dm index 051d78fa863..de537ef90e3 100644 --- a/code/modules/tgui/states.dm +++ b/code/modules/tgui/states.dm @@ -119,7 +119,7 @@ return ..() /// NanoUI compat, remove when done -/datum/proc/CanUseTopic(mob/user, datum/ui_state/state = default_state) +/datum/proc/CanUseTopic(mob/user, datum/ui_state/state = GLOB.default_state) var/datum/src_object = ui_host() return state.can_use_topic(src_object, user) diff --git a/code/modules/tgui/states/admin.dm b/code/modules/tgui/states/admin.dm index f43213ffdc2..7eeefe02812 100644 --- a/code/modules/tgui/states/admin.dm +++ b/code/modules/tgui/states/admin.dm @@ -9,11 +9,11 @@ * Checks that the user has the correlating rights. */ -/var/global/datum/ui_state/admin_state/admin_state = new(R_ADMIN) -/var/global/datum/ui_state/admin_state/moderator_state = new(R_MOD) -/var/global/datum/ui_state/admin_state/debug_state = new(R_DEBUG) -/var/global/datum/ui_state/admin_state/fun_state = new(R_FUN) -/var/global/datum/ui_state/admin_state/staff_state = new() +GLOBAL_DATUM_INIT(admin_state, /datum/ui_state/admin_state, new(R_ADMIN)) +GLOBAL_DATUM_INIT(moderator_state, /datum/ui_state/admin_state, new(R_MOD)) +GLOBAL_DATUM_INIT(debug_state, /datum/ui_state/admin_state, new(R_DEBUG)) +GLOBAL_DATUM_INIT(fun_state, /datum/ui_state/admin_state, new(R_FUN)) +GLOBAL_DATUM_INIT(staff_state, /datum/ui_state/admin_state, new) /datum/ui_state/admin_state var/rights_to_check = null diff --git a/code/modules/tgui/states/always.dm b/code/modules/tgui/states/always.dm index 6a6cd6d75e9..2406dbb2b9b 100644 --- a/code/modules/tgui/states/always.dm +++ b/code/modules/tgui/states/always.dm @@ -9,7 +9,7 @@ * Always grants the user UI_INTERACTIVE. Period. */ -var/global/datum/ui_state/always_state/always_state = new() +GLOBAL_DATUM_INIT(always_state, /datum/ui_state/always_state, new) /datum/ui_state/always_state/can_use_topic(src_object, mob/user) return UI_INTERACTIVE diff --git a/code/modules/tgui/states/conscious.dm b/code/modules/tgui/states/conscious.dm index ba1f621b527..8e35a97da32 100644 --- a/code/modules/tgui/states/conscious.dm +++ b/code/modules/tgui/states/conscious.dm @@ -9,7 +9,7 @@ * Only checks if the user is conscious. */ -var/global/datum/ui_state/conscious_state/conscious_state = new +GLOBAL_DATUM_INIT(conscious_state, /datum/ui_state/conscious_state, new) /datum/ui_state/conscious_state/can_use_topic(src_object, mob/user) if(user.stat == CONSCIOUS) diff --git a/code/modules/tgui/states/contained.dm b/code/modules/tgui/states/contained.dm index 5af1c93bd94..d84bbc0ebe3 100644 --- a/code/modules/tgui/states/contained.dm +++ b/code/modules/tgui/states/contained.dm @@ -9,7 +9,7 @@ * Checks that the user is inside the src_object. */ -var/global/datum/ui_state/contained_state/contained_state = new +GLOBAL_DATUM_INIT(contained_state, /datum/ui_state/contained_state, new) /datum/ui_state/contained_state/can_use_topic(atom/src_object, mob/user) if(!src_object.contains(user)) diff --git a/code/modules/tgui/states/deep_inventory.dm b/code/modules/tgui/states/deep_inventory.dm index 6291b663a69..a7351a0d2d9 100644 --- a/code/modules/tgui/states/deep_inventory.dm +++ b/code/modules/tgui/states/deep_inventory.dm @@ -10,7 +10,7 @@ * (backpack, box, toolbox, etc) inventory. */ -var/global/datum/ui_state/deep_inventory_state/deep_inventory_state = new +GLOBAL_DATUM_INIT(deep_inventory_state, /datum/ui_state/deep_inventory_state, new) /datum/ui_state/deep_inventory_state/can_use_topic(src_object, mob/user) if(!user.contains(src_object)) diff --git a/code/modules/tgui/states/default.dm b/code/modules/tgui/states/default.dm index 45209cb3e6a..d40a2e6b91b 100644 --- a/code/modules/tgui/states/default.dm +++ b/code/modules/tgui/states/default.dm @@ -10,7 +10,7 @@ * and view for robots. */ -var/global/datum/ui_state/default/default_state = new +GLOBAL_DATUM_INIT(default_state, /datum/ui_state/default, new) /datum/ui_state/default/can_use_topic(src_object, mob/user) return user.default_can_use_topic(src_object) // Call the individual mob-overridden procs. diff --git a/code/modules/tgui/states/hands.dm b/code/modules/tgui/states/hands.dm index 188a313f394..3ea6bb0b981 100644 --- a/code/modules/tgui/states/hands.dm +++ b/code/modules/tgui/states/hands.dm @@ -9,7 +9,7 @@ * Checks that the src_object is in the user's hands. */ -var/global/datum/ui_state/hands_state/hands_state = new +GLOBAL_DATUM_INIT(hands_state, /datum/ui_state/hands_state, new) /datum/ui_state/hands_state/can_use_topic(src_object, mob/user) . = user.shared_ui_interaction(src_object) diff --git a/code/modules/tgui/states/heavy_vehicle.dm b/code/modules/tgui/states/heavy_vehicle.dm new file mode 100644 index 00000000000..fc8fe8f27bc --- /dev/null +++ b/code/modules/tgui/states/heavy_vehicle.dm @@ -0,0 +1,24 @@ +/*! + * Copyright (c) 2020 Aleksej Komarov + * SPDX-License-Identifier: MIT + */ + +/** + * tgui state: heavy_vehicle + * + * Checks that the user is inside a mech, that the mech is powered and is the right one. + * + */ + +GLOBAL_DATUM_INIT(heavy_vehicle_state, /datum/ui_state/heavy_vehicle, new) + +/datum/ui_state/heavy_vehicle/can_use_topic(src_object, mob/user) + . = user.shared_ui_interaction(src_object) + + if(!istype(src_object, /obj/item/mecha_equipment)) + return + var/obj/item/mecha_equipment/mecha_equip = src_object + if(ismech(user.loc)) + var/mob/living/heavy_vehicle/mech = user.loc + if(mecha_equip.owner == mech && mech.power == MECH_POWER_ON) + return UI_INTERACTIVE diff --git a/code/modules/tgui/states/human_adjacent.dm b/code/modules/tgui/states/human_adjacent.dm index ba316758b99..b9208f96cd6 100644 --- a/code/modules/tgui/states/human_adjacent.dm +++ b/code/modules/tgui/states/human_adjacent.dm @@ -10,7 +10,7 @@ * human adjacent user. */ -var/global/datum/ui_state/human_adjacent_state/human_adjacent_state = new +GLOBAL_DATUM_INIT(human_adjacent_state, /datum/ui_state/human_adjacent_state, new) /datum/ui_state/human_adjacent_state/can_use_topic(src_object, mob/user) . = user.default_can_use_topic(src_object) diff --git a/code/modules/tgui/states/human_adjacent_loc.dm b/code/modules/tgui/states/human_adjacent_loc.dm index bb93882458e..a2d1d9299f4 100644 --- a/code/modules/tgui/states/human_adjacent_loc.dm +++ b/code/modules/tgui/states/human_adjacent_loc.dm @@ -5,7 +5,7 @@ * human adjacent user. */ -var/global/datum/ui_state/human_adjacent_loc_state/human_adjacent_loc_state = new +GLOBAL_DATUM_INIT(human_adjacent_loc_state, /datum/ui_state/human_adjacent_loc_state, new) /datum/ui_state/human_adjacent_loc_state/can_use_topic(src_object, mob/user) var/turf/src_object_turf = get_turf(src_object) diff --git a/code/modules/tgui/states/inventory.dm b/code/modules/tgui/states/inventory.dm index 43ff41ce6fe..4bc121b278a 100644 --- a/code/modules/tgui/states/inventory.dm +++ b/code/modules/tgui/states/inventory.dm @@ -10,7 +10,7 @@ * (hand, ear, pocket, belt, etc) inventory. */ -var/global/datum/ui_state/inventory_state/inventory_state = new +GLOBAL_DATUM_INIT(inventory_state, /datum/ui_state/inventory_state, new) /datum/ui_state/inventory_state/can_use_topic(src_object, mob/user) if(!(src_object in user)) diff --git a/code/modules/tgui/states/never.dm b/code/modules/tgui/states/never.dm index 21e19e38da0..dc081960b08 100644 --- a/code/modules/tgui/states/never.dm +++ b/code/modules/tgui/states/never.dm @@ -6,10 +6,10 @@ /** * tgui state: never_state * - * Always closes the UI, no matter what. See the ui_state in religious_tool.dm to see an example + * Always closes the UI, no matter what. */ -var/global/datum/ui_state/never_state/never_state = new +GLOBAL_DATUM_INIT(never_state, /datum/ui_state/never_state, new) /datum/ui_state/never_state/can_use_topic(src_object, mob/user) return UI_CLOSE diff --git a/code/modules/tgui/states/new_player.dm b/code/modules/tgui/states/new_player.dm index 252dad4e7e8..cd33bcfcfae 100644 --- a/code/modules/tgui/states/new_player.dm +++ b/code/modules/tgui/states/new_player.dm @@ -4,7 +4,7 @@ * Checks that the user is a /mob/dead/new_player */ -var/global/datum/ui_state/new_player_state/new_player_state = new +GLOBAL_DATUM_INIT(new_player_state, /datum/ui_state/new_player_state, new) /datum/ui_state/new_player_state/can_use_topic(src_object, mob/user) return isnewplayer(user) ? UI_INTERACTIVE : UI_CLOSE diff --git a/code/modules/tgui/states/not_incapacitated.dm b/code/modules/tgui/states/not_incapacitated.dm index e8fa10131b0..49ba2460151 100644 --- a/code/modules/tgui/states/not_incapacitated.dm +++ b/code/modules/tgui/states/not_incapacitated.dm @@ -9,7 +9,7 @@ * Checks that the user isn't incapacitated */ -var/global/datum/ui_state/not_incapacitated_state/not_incapacitated_state = new +GLOBAL_DATUM_INIT(not_incapacitated_state, /datum/ui_state/not_incapacitated_state, new) /** * tgui state: not_incapacitated_turf_state diff --git a/code/modules/tgui/states/notcontained.dm b/code/modules/tgui/states/notcontained.dm index 1fa2361a696..018e0fa0304 100644 --- a/code/modules/tgui/states/notcontained.dm +++ b/code/modules/tgui/states/notcontained.dm @@ -10,7 +10,7 @@ * default checks. */ -var/global/datum/ui_state/notcontained_state/notcontained_state = new +GLOBAL_DATUM_INIT(notcontained_state, /datum/ui_state/notcontained_state, new) /datum/ui_state/notcontained_state/can_use_topic(atom/src_object, mob/user) . = user.shared_ui_interaction(src_object) diff --git a/code/modules/tgui/states/observer.dm b/code/modules/tgui/states/observer.dm index 6a5801ff1cf..4081fd7dc21 100644 --- a/code/modules/tgui/states/observer.dm +++ b/code/modules/tgui/states/observer.dm @@ -9,7 +9,7 @@ * Checks that the user is an observer/ghost. */ -var/global/datum/ui_state/observer_state/observer_state = new +GLOBAL_DATUM_INIT(observer_state, /datum/ui_state/observer_state, new) /datum/ui_state/observer_state/can_use_topic(src_object, mob/user) if(isobserver(user)) diff --git a/code/modules/tgui/states/physical.dm b/code/modules/tgui/states/physical.dm index d835be480c0..216b39281d1 100644 --- a/code/modules/tgui/states/physical.dm +++ b/code/modules/tgui/states/physical.dm @@ -9,7 +9,7 @@ * Short-circuits the default state to only check physical distance. */ -var/global/datum/ui_state/physical/physical_state = new +GLOBAL_DATUM_INIT(physical_state, /datum/ui_state/physical, new) /datum/ui_state/physical/can_use_topic(src_object, mob/user) . = user.shared_ui_interaction(src_object) diff --git a/code/modules/tgui/states/reverse_contained.dm b/code/modules/tgui/states/reverse_contained.dm index 2f1eb5789a1..a6d1034a789 100644 --- a/code/modules/tgui/states/reverse_contained.dm +++ b/code/modules/tgui/states/reverse_contained.dm @@ -10,7 +10,7 @@ * Checks if src_object is inside of user. */ -var/global/datum/ui_state/reverse_contained_state/reverse_contained_state = new +GLOBAL_DATUM_INIT(reverse_contained_state, /datum/ui_state/reverse_contained_state, new) /datum/ui_state/reverse_contained_state/can_use_topic(atom/src_object, mob/user) if(!user.contains(src_object)) diff --git a/code/modules/tgui/states/self.dm b/code/modules/tgui/states/self.dm index 970ac4221a9..f7cef3f6005 100644 --- a/code/modules/tgui/states/self.dm +++ b/code/modules/tgui/states/self.dm @@ -9,7 +9,7 @@ * Only checks that the user and src_object are the same. */ -var/global/datum/ui_state/self_state/self_state = new +GLOBAL_DATUM_INIT(self_state, /datum/ui_state/self_state, new) /datum/ui_state/self_state/can_use_topic(src_object, mob/user) if(src_object != user) diff --git a/code/modules/tgui/states/zlevel.dm b/code/modules/tgui/states/zlevel.dm index 3fb81d3b725..f1a2282b3c2 100644 --- a/code/modules/tgui/states/zlevel.dm +++ b/code/modules/tgui/states/zlevel.dm @@ -9,7 +9,7 @@ * Only checks that the Z-level of the user and src_object are the same. */ -var/global/datum/ui_state/z_state/z_state = new +GLOBAL_DATUM_INIT(z_state, /datum/ui_state/z_state, new) /datum/ui_state/z_state/can_use_topic(src_object, mob/user) var/turf/turf_obj = get_turf(src_object) diff --git a/code/modules/tgui/tgui.dm b/code/modules/tgui/tgui.dm index 213bbde9e34..a1d234cce5a 100644 --- a/code/modules/tgui/tgui.dm +++ b/code/modules/tgui/tgui.dm @@ -60,7 +60,7 @@ src_object = src_object) src.user = user src.src_object = src_object - src.window_key = "[text_ref(src_object)]-main" + src.window_key = "[REF(src_object)]-main" src.interface = interface if(title) src.title = title diff --git a/code/modules/tgui_input/alert.dm b/code/modules/tgui_input/alert.dm index 030f3abd7cb..01c1375ac60 100644 --- a/code/modules/tgui_input/alert.dm +++ b/code/modules/tgui_input/alert.dm @@ -94,7 +94,7 @@ closed = TRUE /datum/tgui_alert/ui_state(mob/user) - return always_state + return GLOB.always_state /datum/tgui_alert/ui_static_data(mob/user) var/list/data = list() diff --git a/code/modules/tgui_input/list.dm b/code/modules/tgui_input/list.dm index fb53698ce02..405a815a414 100644 --- a/code/modules/tgui_input/list.dm +++ b/code/modules/tgui_input/list.dm @@ -103,7 +103,7 @@ closed = TRUE /datum/tgui_list_input/ui_state(mob/user) - return always_state + return GLOB.always_state /datum/tgui_list_input/ui_static_data(mob/user) var/list/data = list() diff --git a/code/modules/tgui_input/number.dm b/code/modules/tgui_input/number.dm index f3bb7cc42cb..988d344112b 100644 --- a/code/modules/tgui_input/number.dm +++ b/code/modules/tgui_input/number.dm @@ -108,7 +108,7 @@ closed = TRUE /datum/tgui_input_number/ui_state(mob/user) - return always_state + return GLOB.always_state /datum/tgui_input_number/ui_static_data(mob/user) var/list/data = list() diff --git a/code/modules/tgui_input/text.dm b/code/modules/tgui_input/text.dm index 3336b5f84d4..32021830c2c 100644 --- a/code/modules/tgui_input/text.dm +++ b/code/modules/tgui_input/text.dm @@ -106,7 +106,7 @@ closed = TRUE /datum/tgui_input_text/ui_state(mob/user) - return always_state + return GLOB.always_state /datum/tgui_input_text/ui_static_data(mob/user) var/list/data = list() diff --git a/code/modules/tgui_panel/tgui_panel.dm b/code/modules/tgui_panel/tgui_panel.dm index 244c59d0192..f5372fb822b 100644 --- a/code/modules/tgui_panel/tgui_panel.dm +++ b/code/modules/tgui_panel/tgui_panel.dm @@ -60,7 +60,7 @@ */ /datum/tgui_panel/proc/on_initialize_timed_out() // Currently does nothing but sending a message to old chat. - to_target(client, "Failed to load fancy chat, click HERE to attempt to reload it.") + to_target(client, "Failed to load fancy chat, click HERE to attempt to reload it.") /** * private diff --git a/code/modules/vehicles/bike.dm b/code/modules/vehicles/bike.dm index e1281c211e9..f2f7d8c4c4a 100644 --- a/code/modules/vehicles/bike.dm +++ b/code/modules/vehicles/bike.dm @@ -1,11 +1,14 @@ /obj/vehicle/bike name = "space-bike" desc = "Space wheelies! Woo!" - desc_info = "Click-drag yourself onto the bike to climb onto it.
\ + desc_info = "\ + - Click-drag yourself onto the bike to climb onto it.
\ - Click-drag it onto yourself to access its mounted storage.
\ - CTRL-click the bike to toggle the engine.
\ + - Click the bike with a key to put it in, and click the bike with empty hand to take it out. The bike won't run without a key.
\ - ALT-click to toggle the kickstand which prevents movement by driving and dragging.
\ - - Click the resist button or type \"resist\" in the command bar at the bottom of your screen to get off the bike." + - Click the resist button or type \"resist\" in the command bar at the bottom of your screen to get off the bike.
\ + " icon = 'icons/obj/vehicle/bike.dmi' icon_state = "bike_off" dir = SOUTH @@ -30,6 +33,25 @@ var/kickstand = TRUE var/can_hover = TRUE + /// Registration plate string of the vehicle, visible on examine, + /// to distingush different vehicles of the same type from each other. + /// Also used to check if the key is for this vehicle. + /// If null, it is randomly generated on init. + var/registration_plate = null + /// Key type accepted in vehicle ignition. + var/key_type = /obj/item/key/bike + /// Actual key object in the vehicle ignition, or null if no key in ignition. + /// To actually start the vehicle, key data needs to match with the registration plate string. + var/obj/item/key/key = null + /// If TRUE, vehicle spawns with the key that matches its registration plate string. + /// If FALSE, the key needs to be mapped/spawned somewhere outside of the vehicle, + /// otherwise it will be an unusable prop. + var/spawns_with_key = TRUE + +/obj/vehicle/bike/Destroy() + QDEL_NULL(key) + return ..() + /obj/vehicle/bike/setup_vehicle() ..() ion = new ion_type(src) @@ -38,6 +60,23 @@ icon_state = "[bike_icon]_off" if(storage_type) storage_compartment = new storage_type(src) + if(!registration_plate) + generate_registration_plate() + if(spawns_with_key) + key = new key_type(src) + key.key_data = registration_plate + +/obj/vehicle/bike/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) + . = ..() + if(distance <= 4) + . += "\The [src] has a small registration plate on the back, '[registration_plate]'." + if(key) + . += "\The [src] has \a [key] in." + else + . += "\The [src] does not have a key in." + +/obj/vehicle/bike/proc/generate_registration_plate() + registration_plate = "[rand(100,999)]-[rand(1000,9999)]" /obj/vehicle/bike/CtrlClick(var/mob/user) if(Adjacent(user) && anchored) @@ -50,9 +89,17 @@ return if(!on) - turn_on() - src.visible_message("\The [src] rumbles to life.", "You hear something rumble deeply.") - playsound(src, 'sound/machines/vehicles/bike_start.ogg', 100, 1) + if(!key) + to_chat(user, SPAN_WARNING("You cannot turn \the [src] on, without a key.")) + return + + if((key.key_data != registration_plate)) + user.visible_message("\The [user] turns \a [key] in the ignition of \the [src].", "You turn \a [key] in the ignition of \the [src], but it lets out a sharp buzz.") + else + user.visible_message("\The [user] turns \a [key] in the ignition of \the [src].", "You turn \a [key] in the ignition of \the [src], and it beeps happily.") + turn_on() + src.visible_message("\The [src] rumbles to life.", "You hear something rumble deeply.") + playsound(src, 'sound/machines/vehicles/bike_start.ogg', 100, 1) else turn_off() src.visible_message("\The [src] putters before turning off.", "You hear something putter slowly.") @@ -83,7 +130,6 @@ var/mob/M = pulledby M.stop_pulling() - kickstand = !kickstand anchored = (kickstand || on) @@ -105,9 +151,12 @@ return /obj/vehicle/bike/attack_hand(var/mob/user as mob) - if(user == load) - unload(load) - to_chat(user, "You unbuckle yourself from \the [src]") + if(key) + to_chat(user, "You take \the [key] out of \the [src]") + user.put_in_hands(key) + key = null + if(on) + toggle_engine(user) else if(user != load && load) user.visible_message ("[user] starts to unbuckle [load] from \the [src]!") if(do_after(user, 8 SECONDS, src)) @@ -115,6 +164,20 @@ to_chat(user, "You unbuckle [load] from \the [src]") to_chat(load, "You were unbuckled from \the [src] by [user]") +/obj/vehicle/bike/attackby(obj/item/attacking_item, mob/user) + if(istype(attacking_item, /obj/item/key)) + if(!key) + if(istype(attacking_item, key_type)) + user.drop_from_inventory(attacking_item, src) + key = attacking_item + to_chat(user, SPAN_NOTICE("You put \the [attacking_item] in \the [src].")) + update_icon() + else + to_chat(user, SPAN_NOTICE("You try to put \the [attacking_item] in \the [src], but it does not fit.")) + else + to_chat(user, SPAN_NOTICE("\The [src] already has a key in it.")) + ..() + /obj/vehicle/bike/relaymove(mob/user, direction) if(user != load || !on || user.incapacitated()) return @@ -373,6 +436,10 @@ space_speed = 0 protection_percent = 10 can_hover = FALSE + key_type = /obj/item/key/bike/sport + +/obj/vehicle/bike/motor/generate_registration_plate() + registration_plate = "[rand(10,99)]S-[rand(1000,9999)]" /obj/vehicle/bike/motor/blue icon_state = "bluesport_on" @@ -391,19 +458,31 @@ desc = "A two-wheeled vehicle meant for easy riding. This comes in stark white colors with flashy lights, indicating it is the law. It has the insignias of Konyang's police force." icon_state = "konyangpolice_on" bike_icon = "konyangpolice" + key_type = /obj/item/key/bike/police + +/obj/vehicle/bike/motor/police_konyang/generate_registration_plate() + registration_plate = "[rand(10,99)]P-[rand(1000,9999)]" /obj/vehicle/bike/motor/moped name = "moped" desc = "A cheap, two-wheeled motorized bicycle." icon_state = "greenmoped_on" bike_icon = "greenmoped" - land_speed = 2//slower than a sport bike but will still get you around big maps + land_speed = 2 // slower than a sport bike but will still get you around big maps + key_type = /obj/item/key/bike/moped + +/obj/vehicle/bike/motor/moped/generate_registration_plate() + registration_plate = "[rand(10,99)]M-[rand(1000,9999)]" /obj/vehicle/bike/motor/moped/police_konyang name = "police moped" desc = "A cheap, two-wheeled motorized bicycle. This comes in stark white colors with flashy lights, indicating it is the law. It has the insignias of Konyang's police force." icon_state = "konyangpolicemoped_on" bike_icon = "konyangpolicemoped" + key_type = /obj/item/key/bike/police + +/obj/vehicle/bike/motor/moped/police_konyang/generate_registration_plate() + registration_plate = "[rand(10,99)]P-[rand(1000,9999)]" /obj/vehicle/bike/motor/moped/red icon_state = "redmoped_on" diff --git a/code/modules/vehicles/droppod.dm b/code/modules/vehicles/droppod.dm index 832f66ef418..c8450272326 100644 --- a/code/modules/vehicles/droppod.dm +++ b/code/modules/vehicles/droppod.dm @@ -170,7 +170,7 @@ ui.open() /obj/vehicle/droppod/ui_state(mob/user) - return always_state + return GLOB.always_state /obj/vehicle/droppod/ui_data(mob/user) var/list/data = list() diff --git a/code/unit_tests/map_tests.dm b/code/unit_tests/map_tests.dm index 58357d6e1e1..b14fafc5dc4 100644 --- a/code/unit_tests/map_tests.dm +++ b/code/unit_tests/map_tests.dm @@ -341,5 +341,36 @@ return 1 +/datum/unit_test/map_test/stairs_mapped + name = "MAP: Stairs" + +/datum/unit_test/map_test/stairs_mapped/start_test() + var/test_status = UNIT_TEST_PASSED + + //Loop through all the stairs in the map + for(var/obj/structure/stairs/a_stair in world) + + //See if there is any other stair in the same turf + for(var/obj/structure/stairs/possibly_another_stair in get_turf(a_stair)) + if(a_stair != possibly_another_stair) + test_status = TEST_FAIL("Duplicate stairs located in [a_stair.x]X - [a_stair.y]Y - [a_stair.z]Z! \ + Only one stair should exist inside a turf.") + + if(is_abstract(a_stair)) + test_status = TEST_FAIL("The stairs located in [a_stair.x]X - [a_stair.y]Y - [a_stair.z]Z are of an abstract type ([a_stair.type]) that should never be mapped!") + + //Check that noone changed the bounds in the map editor + if(a_stair.bound_height != initial(a_stair.bound_height) || a_stair.bound_width != initial(a_stair.bound_width) || \ + a_stair.bound_x != initial(a_stair.bound_x) || a_stair.bound_y != initial(a_stair.bound_y)) + + test_status = TEST_FAIL("The stairs at [a_stair.x]X - [a_stair.y]Y - [a_stair.z]Z have map-defined bounds!") + + if(test_status == UNIT_TEST_PASSED) + TEST_PASS("All the mapped stairs are valid.") + else + TEST_FAIL("Some mapped stairs are invalid!") + + return test_status + #undef SUCCESS #undef FAILURE diff --git a/code/unit_tests/ss_test.dm b/code/unit_tests/ss_test.dm index 90440b8e010..2f7412b417b 100644 --- a/code/unit_tests/ss_test.dm +++ b/code/unit_tests/ss_test.dm @@ -14,7 +14,7 @@ SUBSYSTEM_DEF(unit_tests_config) name = "Unit Test Config" - init_order = SS_INIT_PERSISTENT_CONFIG + init_order = INIT_ORDER_PERSISTENT_CONFIGURATION flags = SS_NO_FIRE var/datum/unit_test/UT // Logging/output, use this to log things from outside where a specific unit_test is defined @@ -129,7 +129,7 @@ SUBSYSTEM_DEF(unit_tests) for(var/thing in subtypesof(/datum/unit_test) - typecacheof(SSatlas.current_map.excluded_test_types)) var/datum/unit_test/D = new thing - if(findtext(D.name, "template")) + if(findtext(D.name, "template") || is_abstract(D)) qdel(D) continue diff --git a/code/unit_tests/stairs_type.dm b/code/unit_tests/stairs_type.dm new file mode 100644 index 00000000000..346aefd7157 --- /dev/null +++ b/code/unit_tests/stairs_type.dm @@ -0,0 +1,33 @@ +/datum/unit_test/stairs_type + name = "Test stairs types" + groups = list("generic") + priority = 1 + +/datum/unit_test/stairs_type/start_test() + var/test_status = UNIT_TEST_PASSED + + for(var/obj/structure/stairs/stair_type as anything in subtypesof(/obj/structure/stairs)) + //No need for abstract stairs to respect this really + if(is_abstract(stair_type)) + continue + + //The bounds have to be set based on the direction of the stairs, that must be set in code for sanity + switch(initial(stair_type.dir)) + + if(NORTH) + if((initial(stair_type.bound_height) != 64) || (initial(stair_type.bound_y) != -32)) + test_status = TEST_FAIL("The stairs type [stair_type.type] does not have the bounds set correctly!") + + if(SOUTH) + if((initial(stair_type.bound_height) != 64) || (initial(stair_type.bound_y) != 0)) + test_status = TEST_FAIL("The stairs type [stair_type.type] does not have the bounds set correctly!") + + if(EAST) + if((initial(stair_type.bound_width) != 64) || (initial(stair_type.bound_x) != -32)) + test_status = TEST_FAIL("The stairs type [stair_type.type] does not have the bounds set correctly!") + + if(WEST) + if((initial(stair_type.bound_width) != 64) || (initial(stair_type.bound_x) != 0)) + test_status = TEST_FAIL("The stairs type [stair_type.type] does not have the bounds set correctly!") + + return test_status diff --git a/code/unit_tests/unit_test.dm b/code/unit_tests/unit_test.dm index 9df9f8f4e91..e84c2418cfd 100644 --- a/code/unit_tests/unit_test.dm +++ b/code/unit_tests/unit_test.dm @@ -42,6 +42,7 @@ var/ascii_reset = "[ascii_esc]\[0m" // Templates aren't intended to be ran but just serve as a way to create child objects of it with inheritable tests for quick test creation. /datum/unit_test + abstract_type = /datum/unit_test var/name = "template - should not be ran." var/disabled = 0 // If we want to keep a unit test in the codebase but not run it for some reason. var/async = 0 // If the check can be left to do it's own thing, you must define a check_result() proc if you use this. diff --git a/config/example/lore_radio/konyang/122_Great_Blue_Dot.txt b/config/example/lore_radio/konyang/122_Great_Blue_Dot.txt new file mode 100644 index 00000000000..4171aa1626c --- /dev/null +++ b/config/example/lore_radio/konyang/122_Great_Blue_Dot.txt @@ -0,0 +1,51 @@ +/..hkk#ht../ +/...bzzbbt.../ +/Khhkhhhkh...khhh#t.../ +/...gh#hhk....kt.../ +/Khhkhhht.../ +/..khkbzzzzz-t.../ +/Bzzzt-bzzt.../ +/...khhbzzzt.../ +/....khk#khhh.../ +/...khh..ping../ +/...khhbeware..khhht.../ +/..khhk#hhwaspskhhh-ht../ +/Khhkh$hhkh...khh#$ht.../ +/...ghhhk....kt.../ +/Khhk#hhht.../ +/..khkb$zzzzz-t.../ +/Bzzzt-bzzt.../ +/...hkkhh...khhlook upkhh-hht.../ +/..hkkht../ +/...bzzbbt.../ +/Khhkh$#hhkh...khh$ht.../ +/...khhk-...khhno-timekhh.../ +/..hkkht../ +/...bzzbbt.../ +/Khh#khhhkh...khhh#t.../ +/Bzzzt-bzzt.../ +/...khh*&^zt.../ +/....kh#kkhhh.../ +/...kh2h..ping../ +/...the hive.../ +/...bzz$z$#zt.../ +/...lookup.../ +/..khht.../ +/..khkb$zzzzz-t.../ +/Bzzzt-bzzt.../ +/...khhbzzzt.../ +/....khkkhhh.../ +/...khh..ping../ +/...khhbeware..khhht.../ +/..khhkh$#hwaspsk#hhh-ht../ +/Khhkhhhkh...khhht.../ +/...ghhhk....kt.../ +/Khhkhhht.../ +/..khkb#zzzzz-t.../ +/Bzzzt-bzzt.../ +/...khh..p#ing../ +/...the hive.../ +/...kh#hhtime is nowkhhg$htt.../ +/...khhtkht.../ +/..khhjoin us../ +/..khh$khhjoin us now.../ diff --git a/config/example/lore_radio/konyang/73.2_Navy_Broadcasting_Service.txt b/config/example/lore_radio/konyang/73.2_Navy_Broadcasting_Service.txt new file mode 100644 index 00000000000..d5ea85fa020 --- /dev/null +++ b/config/example/lore_radio/konyang/73.2_Navy_Broadcasting_Service.txt @@ -0,0 +1,100 @@ +This is the Navy Broadcasting Service, at 73.2 MHz. +Now follows today's Shipping Forecast issued by the Meteorological Office. +North Sea, strong southerly winds, seven to eight Beaufort, good visibility. +/Hzzt-..bbrr...ghhk../ +Dongsan Bay, mild westerly winds, three Beaufort, good visibility. +Boryeong Straits, strong westerly winds, six to seven Beaufort, average visibility. +Sanggyongpyong station shows stormy weather in the region. +Finki Sea, average winds, south-westerly, four Beaufort. Poor visibility. +Kuanhai Bay, calm winds, easterly, good visibility. +/Bzzt-.../ +Changsan Archipelago, strong northerly winds, eight to nine Beaufort. +Yamada Straits, storm, southerly, eleven Beaufort. +Mikkelsen Sea, moderate winds, south-southeasterly, five to six Beaufort. +Wishing all Konyanger Mariners safety and luck. +/Hhkkkhhzzt.../ +Daiyuan Sea, calm, excellent visibility. +Kamazuki Straits, mild winds, northerly. +This was the Shipping Forecast for our nation's high seas, as issued by the Meteorological Office. +The Navy Broadcasting Service would like to remind our listeners to stay safe. +/Hzzt-..bbrr...ghhk../ +Stay safe, stay indoors. Follow all instructions issued by the National Disaster Authority. +For Positronic Citizens: Remain indoors, solid materials weaken the viral signal. +Avoid usage of public chargers. +Run regular diagnostics checks. +If you experience symptoms, report your location to the KRC emergency number and seek immediate assistance. +Time is of the essence. If assistance is unavailable, try the following to prevent yourself from harming others: +Lock yourself indoors. +Strap yourself down or to a chair. +If applicable: switch off locomotive functions. +Do not be afraid: You will be retrieved and repaired. +For everyone else: report locations of suspicious or infected behavior to the KRC emergency number. +Do not attempt to restrain, attack or otherwise interfere with rampant Positronics. +/Hkk..hkkk.../ +Assist any Positronics with barricading their home or strapping them safely. +Keep in mind: Positronic friends and family members will not be able to recognise you if they are infected. Do not try to talk, reason or plead with them. +The Konyang Robotics Corporation emergency number is 500-100-500. +This is the Navy Broadcasting Service, at 73.2 MHz. +/Hrrrhhkt.../ +You are now listening to the news. +The secretive positronic collectivity "Purpose" has sparked great interest in the scientific community. +Requests for a visit on board one of their vessels have been turned down. +While appearing technologically superior to any known race in the Spur, there are assurances of peace and cooperation with our nation. +Contact with Purpose was first made in 2460, by a corporate vessel in Tau Ceti. +Links between Purpose and the Aoyama Vaults speculated, though unconfirmed. +/Hkkkhhzzt.../ +KRC statistics report over ten hundred thousand daily cases. Ten thousand positronics per day making full recoveries. +KRC crisis center network expanding in Shuzu, New Busan, Kangdong, Bupyeong, Onan, Mizukami, Yunfu. +The 55th, 106th and 74th infantry divisions were ordered to deploy to enforce quarantine regulations in New Hong Kong. +Positronic service members confined in barracks pending KRC assessment throughout the Army and Navy. +/...khhbzzzt.../ +Konyang Aerospace Forces to intensify patrols in the Haneunim system to crack down on piracy and smuggling. +Foreign and Coalition countries have dispatched messages of support for our nation. +/Bzzt-.../ +Prime Minister Myeong Myung-Dae has said that Konyang is not in need of external material assistance at this time. +The Suwon Stock Exchange has entered a temporary pause of services in light of the viral outbreak. Finance Ministry urges calm. +/Hkk..hkkk.../ +Severe storms hit the New Kowloon sea wall. Damages reported, but repairs are underway. +In her address to the Yi Sun-sin Naval Academy, admiral Kim Ha-neul urged the new lieutenants to rise up to the difficult current circumstances. +Konyang Army medical personnel have completed training in confronting the new virus. +/Hrrrhhkt.../ +The Stellar Corporate Conglomerate's vessel Horizon has arrived in Haneunim to assist in combatting the virus. +Chaos in Boryeong City's Han district, as five infected attack vehicles stopped in traffic. Two deaths, three injuries. +Remote areas of Konyang in additional danger due to distances and lack of supplies, says police. +Retired Commissioner General of Police Li Jincai recalled to service in advisory role. +This is the Navy Broadcasting Service, at 73.2 MHz. +/Khhrrr...khhrrt../ +The Meteorological Office has released the 2465-66 seasonal cycle. +The cycle is based upon Qixi's orbital projections and meteorological projections. +Wet Season, starting November 17th, 2465, ending July 29th, 2466. +Flooding period, December 1st to January 27th, 2466. +/Hzzt-..bbrr...ghhk../ +High Tide period, January 28th to March 21st. +Highest Tide period, March 22nd to April 29th. +Ebbing High Tide period, April 30th to June 2nd. +Ebbing Flooding period, June 3rd to July 28th. +Dry Season, Ebbing period, July 29th to September 5th. +Low Tide period, September 6th to November 13th, 2466. +Projected highest average wave height during HT period, eight plus minus one meters. +/Hkk..hkkk.../ +This is the Navy Broadcasting Service, at 73.2 MHz. +Stay safe, stay indoors. +A one million credit donation to the Navy Rapid Rescue Force by the PACHROM corporation was warmly welcomed by the Chief of Staff. +A plan was released to provide funding for the renovation of 60 ambulance mechs. +Army and National Police vow to "uproot lawlessness" in the bandit-infested Boryeong coasts in 2466. +Foreign workers in KRC or other presently critical posts "will not be forgotten", says Prime Minister. +/Hzzt-..bbrr...ghhk../ +Suwon Detention Center No.1 evacuated of its Positronic inmates due to fears of rampancy. +Army Signal Corps to install additional protective infrastructure around Point Verdant districts. +/Bzzt-.../ +Warmest wishes from all the staff at the Navy Broadcasting Service. +Dam and hydroelectric station weather review. +Kichi Islands, very strong rain, eight Celcius to twelve Celcius. +Xinhe Islands, strong rain, nine Celcius to fourteen Celcius. +Dongsan Bay, strong rain, five Celcius to ten Celcius. +Sinpo Station, rain, seven Celcius to ten Celcius. +Hoko Station, very strong rain, five Celcius to eight Celcius. +/Hzzt-..bbrr...ghhk../ +Qinghe Station, very strong rain, two Celcius to five Celcius. Storm warning. +Wishing all sea station workers safety and luck. +/Hkk..hkkk.../ diff --git a/config/example/lore_radio/konyang/75.4_PBA.txt b/config/example/lore_radio/konyang/75.4_PBA.txt new file mode 100644 index 00000000000..2a1bee941f5 --- /dev/null +++ b/config/example/lore_radio/konyang/75.4_PBA.txt @@ -0,0 +1,100 @@ +This is the Public Broadcasting Agency, the voice of Konyang, broadcasting from Suwon. +/A solemn jingle used by the PBA./ +You are now listening to the Public Broadcasting Agency, live from Suwon. +/The national anthem of Konyang./ +This is a message from the Ministry of Health and Positronic Affairs. Emergency measures for Positronic persons in effect. +Stay indoors, remain calm, run regular diagnostics. +….Suwon City, curfew 6 PM to 8 AM. Quarantine in Aoyama City, New Hong Kong City, Boryeong City… +And now, the news. A state-of-the-art KRC mobile hospital has opened in New Busan, servicing patients exclusively affected by the virus. One thousand personnel inbound. +Heated debates in Parliament over the inclusion of Positronic MPs in sessions. “Let them holocall” replied Shimazu. +Bank of Konyang investigation into new national currency instructed to continue despite outbreak. Idris Incorporated approached. +/Bzzt-.../ +Bust of Shishi completed and revealed in Unity Square to mark the tenth year since the Positronic’s death, the first recorded murder-hate crime. +Tau Ceti embassy’s Positronic staff evacuated, replacements expected. +/A solemn jingle used by the PBA./ +This is the Public Broadcasting Agency, broadcasting from Suwon at 75.4 MHz. +Tired? We've all been there, what about a change? BAM! energy supplements! Available at pharmacies. +Mishi Sauces. Turn that bland moss gourmet with Mishi Sauces. New Salted Fish flavor out now. +Speed… comfort… safety. Langenfeld. +Stop running away from your luck! One in ten wins at the National Lottery! Grand Prize ten million credits! +Ballet Theater of Boryeong. Plutonian Ballet-Traditional dances. Guest star Yuri Fyodorovich. Tickets out. +/A solemn jingle used by the PBA./ +/Hrr-hrr...khhr.../ +This is the Public Broadcasting Agency, broadcasting from Suwon at 75.4 MHz. Orbital broadcasting for the Haneunim system available. +Talking Truths, keeping you company every Thursday. +This is a message from the Ministry of Environmental Affairs and Response to Calamities. +Rampancy outbreak emergency guidelines. If you come across an infected Positronic person, alert the authorities immediately. +Do not approach suspicious Positronic persons. Symptoms include a catatonic posture and off-tune audio responses. +Do not drive long distances without supplies. +Do not go into the jungles. +The virus shuts down major cognitive functions, significantly increasing battery life. Always remain vigilant. +/A solemn jingle used by the PBA./ +Hayiaaaa! It's so hot! What are we supposed to do?! BreezePunch! The cold beverage to the rescue! +When Mister Xianma needed new neck oscillators, his KRC appointment had him wait two months. At Jogo Clinics, he was serviced the same day. +Grandma's moss broth has never been tastier, she uses Gwok SpiceCubes! +Choson Ferries, safe global sea journeys. Choson Ferries. +Ajax insulation, for a house against the rain! +Feeling drained? Go for a walk. Suwon parks society. +And now, Poetry Corner. From the Public Broadcasting Agency. +/A short piece of traditional Konyanger instrumental music./ +Rainy season… +The choking clouds… +Feeling of hope… +Warmth of a thousand suns… +/Two clicks./ +An eye for an eye… +Maw of the monster… +Retribution, the killer of life… +/Three clicks./ +/Hzzt-..bbrr...ghhk../ +When pain is all you feel… +Remember this… +A mother's embrace… +/Four clicks./ +This was Poetry Corner. +/A solemn jingle used by the PBA./ +Hello and welcome everyone to Frank Conversations, this is your host Woo-Chung. +Today we will be taking calls from our audience, on the subject of the outbreak. +/Phone dial tone.../ +Hello? Can you hear us? +/Yes? Hello./ +Hi, welcome on air. Do you have a story you would wish to share? +/Yes, actually.. I was wondering if anyone has seen my friend? IPC, about two meters tall, industrial./ +What is your friend's name? +/He always called himself Daehak. He disappeared last week-/ +Where did they disappear from? +/Saitama island, he works at the dam there, they don't know where he went after the shift./ +It seems time's up for this call. I'm certain all PBA listeners will do our best. +If anyone knows anything, please contact the police, or this station directly. +Let's move to our next caller. +/Phone dial tone.../ +Hello? You are on air. +/Hi, PBA?/ +Yes indeed, you are on air. +/Great. Do you guys have any idea how I am supposed to go to work?/ +What is the problem? +/Hhhkhhh-.../ +/The quarantine is the problem. I have to commute an hour to go to work. And now even that is impossible./ +Are you calling from Suwon? They are telling me there should be designated lanes where traffic is allowed. +/Yeah, but they are all clogged up. And my boss won't let us work from home./ +They might have to. All major non-retail businesses must have that option. +/I don't get it, I'm not even an IPC, why can't they make a lane for humans only?/ +The roadblocks are for everyone's safety. I am sure the police are doing their best. +/Well their best is not enough./ +Anyways, that is all the time we had for that call. +We will see you next time on Frank Conversations, broadcast live on PBA. +/A solemn jingle used by the PBA./ +This is the Public Broadcasting Agency, broadcasting from Suwon at 75.4 MHz. +Ah, gee, car broke down again? Express Service, call now at 866-941-008. +Fall all things house, Chipo Furniture has your back! +Casino Hamki. Combine Luck and Luxury into an unforgetful experience. 21+ admittance only. +Fresh Fish, only at Otomo Fisheries. The best in Aoyama. +Jumbo Entertainment presents the new pAI-powered talking squid! +/Hrrr..bzzt-/ +Take a break, Milto's Chocolates. +Snacking time? What better than GWOK! Moist Chips? +At RealLife Insurances, you feel safe. +Get on the road with BigScooters! +Shibata Motors new Kawono X5, unparalleled speed, unrivaled quality. +/Hkk..hkkk.../ +Bullseye Records Suwon top 10 albums are now available! diff --git a/config/example/lore_radio/konyang/77.7_SoulFM.txt b/config/example/lore_radio/konyang/77.7_SoulFM.txt new file mode 100644 index 00000000000..6f1898add25 --- /dev/null +++ b/config/example/lore_radio/konyang/77.7_SoulFM.txt @@ -0,0 +1,100 @@ +77.7 Soul FM, the number one music station on the GLOBE! +[RANDOMNOTE] Feeling aliiiive! Soul FM... [RANDOMNOTE] +What is up everyone, our warmest greetings to our listeners from 77.7 Soul FM, live from Shinzhen, New Hong Kong. +Now enough talk, let's get the mood up with some classics... +[RANDOMNOTE] I want to see you smile through the storm, a hole in my heart, only filled by you~ [RANDOMNOTE] +[RANDOMNOTE] Dance through the night, up in the clouds, your name spelled in the stars. [RANDOMNOTE] +[RANDOMNOTE] My eyes long to see you, your touch in my hair, the warmth from your embrace! [RANDOMNOTE] +[RANDOMNOTE] A fiery presence, larger than life, you make me feel like only we matter. [RANDOMNOTE] +77.7 Soul FM. +[RANDOMNOTE] Boom boom boom, listen to this, my heartbeat on fire. [RANDOMNOTE] +[RANDOMNOTE] Alive as ever, an object of desire. [RANDOMNOTE] +[RANDOMNOTE] Through thick and thin, situations so dire. [RANDOMNOTE] +[RANDOMNOTE] It's all so crazy I'm about to go haywire... [RANDOMNOTE] +[RANDOMNOTE] I've told you a million times, I need a life! [RANDOMNOTE] +/Hbbbrhht../ +[RANDOMNOTE] A life with you and me in it. [RANDOMNOTE] +That was "Heartbeat" by Gracie Kim. And now, for our Top Ten... +[RANDOMNOTE] Shape... the future... [RANDOMNOTE] +[RANDOMNOTE] Believe... in the future... [RANDOMNOTE] +[RANDOMNOTE] Beep-ep-ob. Beep-beep-peb-beep-bep-ob. [RANDOMNOTE] +[RANDOMNOTE] Run up... to the future... [RANDOMNOTE] +[RANDOMNOTE] Live in... to the future... [RANDOMNOTE] +77.7 Soooooul FM! +And don't forget, dear listeners, our daily competition ends in an hour! +Call us at 522-059-900 to join our participation pool, for 5 credits per call. +[RANDOMNOTE] I like it, I like it! [RANDOMNOTE] +[RANDOMNOTE] Turn on the holoscreen! [RANDOMNOTE] +[RANDOMNOTE] A million ways to see our life- [RANDOMNOTE] +[RANDOMNOTE] Fifty million light-years wide [RANDOMNOTE] +[RANDOMNOTE] I like it, I like it! [RANDOMNOTE] +[RANDOMNOTE] Turn on the volume! [RANDOMNOTE] +[RANDOMNOTE] Ask me what that is, that is our bright starred future! [RANDOMNOTE] +[RANDOMNOTE] I like it, I like it! [RANDOMNOTE] +[RANDOMNOTE] Do you like it? [RANDOMNOTE] +That was "Turn on the Holoscreen", by Million-Six. +/Bzzt../ +Hephaestus Industries. The anvil upon which the world is built. +Ayaa, you burnt the rice! Don't worry, we'll go to UP! Burger! By Gwok Foods. +Fever, aches, food poisoning? Why miss out on life? HydroMol Relief. +My father always told me to prepare. KNN National Insurance. +[RANDOMNOTE] Uh-ah, woohoo, hee-he.. we need some help over here! [RANDOMNOTE] +[RANDOMNOTE] I want to hold your hand, feeling like- [RANDOMNOTE] +[RANDOMNOTE] Playing like a whole band, spending like- [RANDOMNOTE] +[RANDOMNOTE] Much over a whole grand, shouting like- [RANDOMNOTE] +[RANDOMNOTE] Animals that don't bite, over here! [RANDOMNOTE] +[RANDOMNOTE] Could use some help, picking up myself. [RANDOMNOTE] +[RANDOMNOTE] The burdens of the world- [RANDOMNOTE] +[RANDOMNOTE] Humming to myself- [RANDOMNOTE] +[RANDOMNOTE] A tune worth a lot more. [RANDOMNOTE] +/Bzztht../ +Sooooul FM! +Soul FM, 77.7. +/Hhhkht.../ +Piercing your minds from Shinzen, New Hong Kong! +Hey everyone, I hope you're all safe during these crazy times. +Thoughts and prayers for all our brothers and sisters facing the virus. +Nasty thing, but it will be over soon. +Got some news, the SCCV Horizon might be listening. They carried the cure over! +If you are, thanks, SCCV Horizon. We owe you guys. +For all you crewmembers in the sky above, this one's for you! +[RANDOMNOTE] Ladies and gentlemen... [RANDOMNOTE] +[RANDOMNOTE] We've got all this and more in store-store-ore! [RANDOMNOTE] +[RANDOMNOTE] Piercing the skies, fearless. [RANDOMNOTE] +[RANDOMNOTE] Smashing through bluespace, still. [RANDOMNOTE] +[RANDOMNOTE] Our hearts on target, our minds on the task. [RANDOMNOTE] +[RANDOMNOTE] Dashing through bluespace, sailors of the void. [RANDOMNOTE] +[RANDOMNOTE] Charting the unknown, with danger to our own. [RANDOMNOTE] +[RANDOMNOTE] We are pioneers, sailors of the void. [RANDOMNOTE] +/Brrr-hhkkt../ +Bullseye Records Suwon top 10 albums are now available! +Take a break, Milto's Chocolates. +Fall all things house, Chipo Furniture has your back! +Think you can handle it? KANMAN escape rooms, now available in 20 places. +Fresh Fish, only at Otomo Fisheries. The best in Aoyama. +Konyang Can! Gwok Coffee. +I feel like I can dance again! +[RANDOMNOTE] Dance-dance, dance like you're 20 [RANDOMNOTE] +[RANDOMNOTE] Feel the rhythm, feel the vibe [RANDOMNOTE] +[RANDOMNOTE] Dance-dance, dance like it don't matter [RANDOMNOTE] +[RANDOMNOTE] All around you lights, underneath the dancefloor [RANDOMNOTE] +[RANDOMNOTE] Dance-dance, dance like you mean it! [RANDOMNOTE] +[RANDOMNOTE] Keep it up, don't stop [RANDOMNOTE] +[RANDOMNOTE] Don't stop till I tell you to stop! [RANDOMNOTE] +[RANDOMNOTE] A dancing plaaaague! [RANDOMNOTE] +This was Dance, by 24/7! +Sooooul FM! The soul of music +77.7 Soul FM! +Feeling unproductive? Himel Vitamins. Extra energy, extra productivity. +Coming hot with the new Poplar Mastiff-6, compact power for the city streets. +/Hrrrkt.../ +Speak up Trombones, now from 899.99. +[RANDOMNOTE] Fly me to Qixi [RANDOMNOTE] +[RANDOMNOTE] Let me see the stars [RANDOMNOTE] +[RANDOMNOTE] Felt like a butterfly [RANDOMNOTE] +[RANDOMNOTE] The weight of the planet [RANDOMNOTE] +[RANDOMNOTE] Makes me feel like a bulldozer [RANDOMNOTE] +[RANDOMNOTE] Trying to catch a butterfly- [RANDOMNOTE] +Soooul FM! 77.7. +Einstein Engines, Lead by our history, leading our future. +/Hrrrrkt./ diff --git a/config/example/lore_radio/konyang/78.1_RealFM.txt b/config/example/lore_radio/konyang/78.1_RealFM.txt new file mode 100644 index 00000000000..accd630e95c --- /dev/null +++ b/config/example/lore_radio/konyang/78.1_RealFM.txt @@ -0,0 +1,100 @@ +78.1 RealFM. Speaking only truths. +I'm Bo Hoon, you're listening to Real Talk on RealFM. +I gotta tell you folks, things are looking worse day after day. +They're going to tell you that the so called hivebot virus were aliens. +Yeah we've heard that story before. But what the hell even /are/ these things? +Now they're finally trying to slowly unveil The Machine, and they dubbed it what, "Purpose"? +I was the one talking about that here TWO YEARS AGO. But NOBODY listened. +Now look where we're at. MILLIONS are getting mind controlled DAILY. +Oh but they won't admit it. The stats the police gives out are a fraud. +THE MACHINE is behind all this. Listen to me. Remember the Glorsh files I uncovered. +The Skrell have planned this virus out to take out our labor force. Humiliate us for embracing IPCs. +ONLY ON REAL FM WILL YOU HEAR THIS. +They got us all figured out. We've walked right into their trap. The Prime Minister is an untagged shell, mind controlled by the Machine. +And NOBODY CARES. NOBODY is doing ANYTHING. Not the courts, not the army, NOBODY. +Now our cities are quarantined and the Skrell laugh. +This Deluge guy that they made? Yeah, the Skrell control him too. With this virus, they tell him to do what he does. +Why? To RUIN the REPUTATION of IPCs, so that humanity can stop making them. +They're trying to make us think they're dangerous. +But the real danger is them. Hivebots? Those little ancient drones? +They're trying to tell us it's a totally new thing. But it's Glorsh-era technology. I know it, I've seen it. +We'll be back after an ad break. STAY TUNED, THERE'S A LOT MORE COMING. +/Hhkkt./ +Luxury taste with EYE. The top Brandy marque on Konyang. +Pack big, pack hard. Show them who's boss with ARMLIFE Hunting Rifles. +/Brrrtbr../ +AlterPaste Nanopaste allows you and your loved ones anonymous and at-home repairs! +Tsunamis and floods are no joke on Konyang. With BunkerDown Tech products, you too can purchase your own underground evacuation facility. +BunkerDown Tech Survive Deluxe now provides more worth for half the price. Antibiotics pack included. +/Hhhkhh../ +I'm Bo Hoon, we're back at Real Talk. +I'd like to personally thank BunkerDown Tech for sponsoring our broadcast since the day we started. +There isn't many out there willing to bear the truth these days. +Anyway, since I've gotten some messages regarding what I said before about the virus. +There's sheep out there that still think this is just a "phase" or whatever. +They're dipshits. Yeah I said it, and I'll eat the fine I don't care! +That's the only way you can describe someone this stupid. THE WORLD IS FALLING APART, WAKE UP. +There's TANKS on the streets, Government House in Suwon is protected by MECHS. +Real Army stuff. The Navy is shutting down the shipping lanes. They want to paralize EVERYTHING. +I'm telling you, life after this won't be the same. We'll all be looking over our shoulder. +That's what they're trying to do with this. The Machine has come at us with full force. +I have a friend, he said he saw an old lady getting her face TORN APART by a G2. It's nuts out there. +And now they're sending the... what was it called again? The Horizon? To save us. +They are controlled by NANOTRASEN, WAKE UP. +With Skrell made technology to "save us" from the virus. I'm telling you, the Electronic Countermeasures Device will fry our brains. +They won't target IPCs anymore. They will target our brains with human-sensitive radiowaves. +They want to destabilize our country. EXACTLY like they did to Sol. +Did you ever wonder how a literal GIANT like Sol fell apart? +Ever wonder who stands to benefit from the breakup of Humanity like that? +Yeah, the Skrell. Bingo. And all their corporate puppets. +I'm telling you guys, Einstein is the only one fighting them. That's why they treat them like outcasts. +The Phoenixport purchase for example. Their phoney courts ripped it off Einstein's hands. +/Hkkhhhht..../ +Alex Mason made a phonecall, and bam, Tau Ceti fell on its knees before him and Trasen. +Of course our government didn't do anything. They were obviously too busy getting scammed by the PM. +So was our entire nation, and now it is too late. +You know what, the guys in the coasts of north Boryeong, I get them now. +I used to think they're scum and pirates and all that. +But they're actually the most free out of all of us. +You're listening in at 78.1 RealFM, keeping it real and until after the break! +/Hhkmmkt../ +ARMLIFE wet season gear are now out. Seek our new boot collection. +Escape to VYSOKA with Getaway! The practical shuttleline. +Legal Optics offers professional legal services to citizens of all backgrounds. +AlterPaste Nanopaste allows you and your loved ones anonymous and at-home repairs! +Pack big, pack hard. Show them who's boss with ARMLIFE Hunting Rifles. +/Hrrhhhkt./ +Don't think twice, Gear up at ARMLIFE! +Alright, we're back. I'm Bo Hoon, and something big just came in. +I was informed by my associates... that the new AlkaSerum is out. +You know what AlkaSerum is? I'll tell you. It's ESSENTIAL that's what it is. +It's a cream made out of alkalines and meshed up metals, backed up by real science. +It's designed to stop any interfering signals from reaching the positronic. +Simply take some in your fingers, and apply it over the IPC's head. +Trust me when I say this, it REDUCES the chances of infection by EIGHTY PERCENT. +And it's not me, again, it's real science. The tests speak for themselves. +And for this broadcast, whoever calls within the next TWENTY MINUTES can get AlkaSerum for ONLY 79.99. +CALL 988-043-100 NOW to get your AlkaSerum. Man, the price is GOOD! +Because we here at Real FM don't put a price on safety. +We're not like others, we fight back against The Machine and those that want to tear down our SOCIETY. +Call now at 988-043-100. That is 988-043-100. +/Hhhrkkhtzt..../ +And remember. If you see these hivebots, shoot them down where they are. +Nothing better than some ARMLIFE firepower in these trying times. +Folks. We got to keep safe. +The ministry will tell you to keep your distance and stuff like that. Nah, that doesn't work. +Me? I barricade my windows. Wooden planks and a layer of tinfoil behind it. +It stops all electromagnetic radiation from even getting close. +I honestly think it's time everyone woke up and banded together over this. +We have to protect our loved ones and ourselves from the virus. +To hell with all the politicians, this is real war. +They want to TEAR US APART. We won't let them. No Sir. +/Khkhh..hrtt.../ +You heard that? +Thought I heard something. Weird. +Stay tuned. +Pack big, pack hard. Show them who's boss with ARMLIFE Hunting Rifles. +Escape to VYSOKA with Getaway! The practical shuttleline. +Luxury taste with EYE. The top Brandy marque on Konyang. +Tsunamis and floods are no joke on Konyang. With BunkerDown Tech products, you too can purchase your own underground evacuation facility. +Don't think twice, Gear up at ARMLIFE! diff --git a/html/changelog.html b/html/changelog.html index 1f6b0ec817e..e5c6ced12f4 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -35,6 +35,164 @@ -->
+

24 February 2024

+

Alberyk, Geeves updated:

+ +

MattAtlas (Code), TheLancer (Sound) updated:

+ + +

23 February 2024

+

DreamySkrell updated:

+ +

Lavillastrangiato updated:

+ +

RustingWithYou updated:

+ +

Sniblet updated:

+ +

Snowy1237 updated:

+ + +

22 February 2024

+

Ben10083 updated:

+ +

DreamySkrell updated:

+ +

Lavillastrangiato updated:

+ +

shimmeristaken updated:

+ + +

21 February 2024

+

DreamySkrell updated:

+ +

FluffyGhost updated:

+ +

RustingWithYou updated:

+ +

SleepyGemmy updated:

+ +

Snowy1237 updated:

+ +

shimmeristaken updated:

+ + +

20 February 2024

+

DreamySkrell updated:

+ +

FluffyGhost updated:

+ +

Lavillastrangiato updated:

+ +

MattAtlas updated:

+ +

Wowzewow (Wezzy), Desven updated:

+ + +

19 February 2024

+

SleepyGemmy updated:

+ +

kyres1 updated:

+ + +

18 February 2024

+

FluffyGhost updated:

+ +

Lavillastrangiato updated:

+ +

RustingWithYou updated:

+ +

SleepyGemmy updated:

+ +

17 February 2024

Furrycactus updated: