From 92956bc258ecd44a409e3337b5aeca0f0efdbd9f Mon Sep 17 00:00:00 2001 From: Heroman Date: Sat, 30 Mar 2019 07:56:33 +1000 Subject: [PATCH 001/141] Added sizechanging module and size pref respect for borgs --- .../objects/items/robot/robot_upgrades_vr.dm | 18 ++++++++++++++++++ code/modules/mob/transform_procs.dm | 2 ++ code/modules/research/designs_vr.dm | 10 ++++++++++ 3 files changed, 30 insertions(+) diff --git a/code/game/objects/items/robot/robot_upgrades_vr.dm b/code/game/objects/items/robot/robot_upgrades_vr.dm index 6f92178f09..a3c7709944 100644 --- a/code/game/objects/items/robot/robot_upgrades_vr.dm +++ b/code/game/objects/items/robot/robot_upgrades_vr.dm @@ -9,3 +9,21 @@ return 1 else return 0 + +//Robot resizing module + +/obj/item/borg/upgrade/sizeshift + name = "robot size alteration module" + desc = "Using technology similar to one used in sizeguns, allows cyborgs to adjust their own size as neccesary." + icon_state = "cyborg_upgrade2" + item_state = "cyborg_upgrade" + require_module = 1 + +/obj/item/borg/upgrade/sizeshift/action(var/mob/living/silicon/robot/R) + if(..()) return 0 + + if(/mob/living/proc/set_size in R.verbs) + return 0 + + R.verbs += /mob/living/proc/set_size + return 1 \ No newline at end of file diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 945ffd53be..c1d0f9de64 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -182,6 +182,8 @@ var/datum/preferences/B = O.client.prefs for(var/language in B.alternate_languages) O.add_language(language) + O.resize(B.size_multiplier, animate = FALSE) //VOREStation Addition: add size prefs to borgs + O.fuzzy = B.fuzzy //VOREStation Addition: add size prefs to borgs callHook("borgify", list(O)) O.Namepick() diff --git a/code/modules/research/designs_vr.dm b/code/modules/research/designs_vr.dm index 94fbb9ce09..518c77a504 100644 --- a/code/modules/research/designs_vr.dm +++ b/code/modules/research/designs_vr.dm @@ -316,3 +316,13 @@ id = "rigmod_orescanner" build_path = /obj/item/rig_module/device/orescanner sort_string = "HCAAI" + +//Prosfab stuff for borgs and such + +/datum/design/item/robot_upgrade/sizeshift + name = "Size Alteration Module" + desc = "Used to allow robot to freely alter their size." + id = "borg_sizeshift_module" + req_tech = list(TECH_BLUESPACE = 3, TECH_MATERIAL = 3, TECH_POWER = 2) + materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 4000) + build_path = /obj/item/borg/upgrade/sizeshift \ No newline at end of file From c1d356fe8bdc7128a0c654dbefd44e8b679837df Mon Sep 17 00:00:00 2001 From: Heroman3003 <31296024+Heroman3003@users.noreply.github.com> Date: Mon, 1 Apr 2019 12:28:02 +1000 Subject: [PATCH 002/141] Added a remains option to digesty vore --- code/__defines/belly_modes_vr.dm | 6 +- code/__defines/mobs_vr.dm | 5 + code/_helpers/global_lists_vr.dm | 21 +++ .../carbon/human/species/station/monkey_vr.dm | 8 +- code/modules/vore/eating/belly_obj_vr.dm | 2 +- code/modules/vore/eating/bellymodes_vr.dm | 2 + code/modules/vore/eating/digest_act_vr.dm | 2 + code/modules/vore/eating/leave_remains_vr.dm | 156 ++++++++++++++++++ code/modules/vore/eating/living_vr.dm | 4 + code/modules/vore/eating/vore_vr.dm | 13 +- code/modules/vore/eating/vorepanel_vr.dm | 19 +++ icons/obj/bones_vr.dmi | Bin 0 -> 700 bytes vorestation.dme | 1 + 13 files changed, 227 insertions(+), 12 deletions(-) create mode 100644 code/modules/vore/eating/leave_remains_vr.dm create mode 100644 icons/obj/bones_vr.dmi diff --git a/code/__defines/belly_modes_vr.dm b/code/__defines/belly_modes_vr.dm index cd444abc18..c65a87d6c8 100644 --- a/code/__defines/belly_modes_vr.dm +++ b/code/__defines/belly_modes_vr.dm @@ -29,9 +29,9 @@ #define DM_TRANSFORM_FEMALE_EGG "Transform (Female) (EGG)" //Addon mode flags -#define DM_FLAG_NUMBING 0x1 -#define DM_FLAG_STRIPPING 0x2 -//#define DM_FLAG_ITEMWEAK 0x4 +#define DM_FLAG_NUMBING 0x1 +#define DM_FLAG_STRIPPING 0x2 +#define DM_FLAG_LEAVEREMAINS 0x4 //Item related modes #define IM_HOLD "Hold" diff --git a/code/__defines/mobs_vr.dm b/code/__defines/mobs_vr.dm index 0a2e49d907..fadd802c84 100644 --- a/code/__defines/mobs_vr.dm +++ b/code/__defines/mobs_vr.dm @@ -30,3 +30,8 @@ #define SPECIES_ZORREN_FLAT "Flatland Zorren" #define SPECIES_ZORREN_HIGH "Highlander Zorren" #define SPECIES_CUSTOM "Custom Species" + +#define SPECIES_MONKEY_AKULA "Sobaka" +#define SPECIES_MONKEY_NEVREAN "Sparra" +#define SPECIES_MONKEY_SERGAL "Saru" +#define SPECIES_MONKEY_VULPKANIN "Wolpin" diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm index f5b8f8afd8..cf19a476a8 100644 --- a/code/_helpers/global_lists_vr.dm +++ b/code/_helpers/global_lists_vr.dm @@ -394,6 +394,27 @@ var/global/list/contamination_colors = list("green", "beige", "pink") +//For the mechanic of leaving remains. Ones listed below are basically ones that got no bones. +var/global/list/remainless_species = list(SPECIES_PROMETHEAN, + SPECIES_DIONA, + SPECIES_ALRAUNE, + SPECIES_PROTEAN, + SPECIES_MONKEY, //Exclude all monkey subtypes, to prevent abuse of it. They aren't, + SPECIES_MONKEY_TAJ, //set to have remains anyway, but making double sure, + SPECIES_MONKEY_SKRELL, + SPECIES_MONKEY_UNATHI, + SPECIES_MONKEY_AKULA, + SPECIES_MONKEY_NEVREAN, + SPECIES_MONKEY_SERGAL, + SPECIES_MONKEY_VULPKANIN, + SPECIES_XENO, //Same for xenos, + SPECIES_XENO_DRONE, + SPECIES_XENO_HUNTER, + SPECIES_XENO_SENTINEL, + SPECIES_XENO_QUEEN, + SPECIES_SHADOW, + SPECIES_GOLEM) //Some special species that may or may not be ever used in event too + /hook/startup/proc/init_vore_datum_ref_lists() var/paths diff --git a/code/modules/mob/living/carbon/human/species/station/monkey_vr.dm b/code/modules/mob/living/carbon/human/species/station/monkey_vr.dm index f56faa515a..f8a783b162 100644 --- a/code/modules/mob/living/carbon/human/species/station/monkey_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/monkey_vr.dm @@ -1,5 +1,5 @@ /datum/species/monkey/shark - name = "Sobaka" + name = SPECIES_MONKEY_AKULA name_plural = "Sobaka" icobase = 'icons/mob/human_races/monkeys/r_sobaka_vr.dmi' deform = 'icons/mob/human_races/monkeys/r_sobaka_vr.dmi' @@ -8,7 +8,7 @@ default_language = "Skrellian" //Closest we have. /datum/species/monkey/sergal - name = "Saru" + name = SPECIES_MONKEY_SERGAL greater_form = "Sergal" icobase = 'icons/mob/human_races/monkeys/r_sergaling_vr.dmi' deform = 'icons/mob/human_races/monkeys/r_sergaling_vr.dmi' @@ -16,7 +16,7 @@ default_language = LANGUAGE_SAGARU /datum/species/monkey/sparra - name = "Sparra" + name = SPECIES_MONKEY_NEVREAN name_plural = "Sparra" greater_form = "Nevrean" tail = null @@ -41,7 +41,7 @@ */ /datum/species/monkey/vulpkanin - name = "Wolpin" + name = SPECIES_MONKEY_VULPKANIN name_plural = "Wolpin" icobase = 'icons/mob/human_races/monkeys/r_wolpin.dmi' diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm index dba128e7e0..6547aacd23 100644 --- a/code/modules/vore/eating/belly_obj_vr.dm +++ b/code/modules/vore/eating/belly_obj_vr.dm @@ -38,7 +38,7 @@ //Actual full digest modes var/tmp/static/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_ABSORB,DM_DRAIN,DM_UNABSORB,DM_HEAL,DM_SHRINK,DM_GROW,DM_SIZE_STEAL) //Digest mode addon flags - var/tmp/static/list/mode_flag_list = list("Numbing" = DM_FLAG_NUMBING, "Stripping" = DM_FLAG_STRIPPING) + var/tmp/static/list/mode_flag_list = list("Numbing" = DM_FLAG_NUMBING, "Stripping" = DM_FLAG_STRIPPING, "Leave Remains" = DM_FLAG_LEAVEREMAINS) //Transformation modes var/tmp/static/list/transform_modes = list(DM_TRANSFORM_MALE,DM_TRANSFORM_FEMALE,DM_TRANSFORM_KEEP_GENDER,DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR,DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG,DM_TRANSFORM_REPLICA,DM_TRANSFORM_REPLICA_EGG,DM_TRANSFORM_KEEP_GENDER_EGG,DM_TRANSFORM_MALE_EGG,DM_TRANSFORM_FEMALE_EGG, DM_EGG) //Item related modes diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm index 61b2914828..886ca5830c 100644 --- a/code/modules/vore/eating/bellymodes_vr.dm +++ b/code/modules/vore/eating/bellymodes_vr.dm @@ -138,6 +138,8 @@ to_chat(M,"" + digest_alert_prey + "") play_sound = pick(death_sounds) + if((mode_flags & DM_FLAG_LEAVEREMAINS) && M.digest_leave_remains) + handle_remains_leaving(M) digestion_death(M) owner.update_icons() if(compensation > 0) diff --git a/code/modules/vore/eating/digest_act_vr.dm b/code/modules/vore/eating/digest_act_vr.dm index 2467f5aaa2..5799d39979 100644 --- a/code/modules/vore/eating/digest_act_vr.dm +++ b/code/modules/vore/eating/digest_act_vr.dm @@ -60,6 +60,8 @@ return FALSE //Sorta important to not digest your own beacons. /obj/item/organ/internal/brain/slime/digest_act(var/atom/movable/item_storage = null) return FALSE //so prometheans can be recovered +/obj/item/weapon/digestion_remains/digest_act(var/atom/movable/item_storage = null) + return FALSE //Don't digest stuff we intentionally made ///////////// // Some special treatment diff --git a/code/modules/vore/eating/leave_remains_vr.dm b/code/modules/vore/eating/leave_remains_vr.dm new file mode 100644 index 0000000000..79c315ff8e --- /dev/null +++ b/code/modules/vore/eating/leave_remains_vr.dm @@ -0,0 +1,156 @@ +/obj/belly/proc/handle_remains_leaving(var/mob/living/M) + + if(istype(M,/mob/living/carbon/human)) //Are we even humanoid? + var/mob/living/carbon/human/H = M + + if((H.species.name in remainless_species) || H.isSynthetic()) //Don't leave anything if there is nothing to leave + return + + else + var/bones_amount = rand(2,3) //some random variety in amount of bones left + + if(prob(20)) //ribcage surviving whole is some luck + new /obj/item/weapon/digestion_remains/ribcage(src) + bones_amount-- + + while(bones_amount) //throw in the rest + new /obj/item/weapon/digestion_remains(src) + bones_amount-- + + var/skull_amount = 1 + switch(H.species.name) //oh boy here we go, finding us a right skull + if(SPECIES_HUMAN) + new /obj/item/weapon/digestion_remains/skull(src) + skull_amount-- + if(SPECIES_TAJ) + new /obj/item/weapon/digestion_remains/skull/tajaran(src) + skull_amount-- + if(SPECIES_UNATHI) + new /obj/item/weapon/digestion_remains/skull/unathi(src) + skull_amount-- + if(SPECIES_SKRELL) + new /obj/item/weapon/digestion_remains/skull/skrell(src) + skull_amount-- + if(SPECIES_VASILISSAN) + new /obj/item/weapon/digestion_remains/skull/vasilissan(src) + skull_amount-- + if(SPECIES_AKULA) + new /obj/item/weapon/digestion_remains/skull/akula(src) + skull_amount-- + if(SPECIES_RAPALA) + new /obj/item/weapon/digestion_remains/skull/rapala(src) + skull_amount-- + if(SPECIES_VULPKANIN) + new /obj/item/weapon/digestion_remains/skull/vulpkanin(src) + skull_amount-- + if(SPECIES_SERGAL) + new /obj/item/weapon/digestion_remains/skull/sergal(src) + skull_amount-- + if(SPECIES_ZORREN_FLAT || SPECIES_ZORREN_HIGH) + new /obj/item/weapon/digestion_remains/skull/zorren(src) + skull_amount-- + if(SPECIES_NEVREAN) + new /obj/item/weapon/digestion_remains/skull/nevrean(src) + skull_amount-- + if(SPECIES_TESHARI) + new /obj/item/weapon/digestion_remains/skull/teshari(src) + skull_amount-- + if(SPECIES_VOX) + new /obj/item/weapon/digestion_remains/skull/vox(src) + skull_amount-- + if(SPECIES_XENOHYBRID) + new /obj/item/weapon/digestion_remains/skull/xenohybrid(src) + skull_amount-- + if(skull_amount && H.species.selects_bodytype) //We still haven't found correct skull... + if(H.species.base_species == SPECIES_HUMAN) + new /obj/item/weapon/digestion_remains/skull/unknown(src) + else + new /obj/item/weapon/digestion_remains/skull/unknown/anthro(src) + else if(skull_amount) //Something entirely different... + new /obj/item/weapon/digestion_remains/skull/unknown(src) + else + return + +/obj/item/weapon/digestion_remains + name = "bone" + desc = "A bleached bone. It's very non-descript and its hard to tell what species or part of the body it came from." + icon = 'icons/obj/bones_vr.dmi' + icon_state = "generic" + force = 0 + throwforce = 0 + item_state = "bone" + w_class = ITEMSIZE_SMALL + +/obj/item/weapon/digestion_remains/attack_self(mob/user) + if(user.a_intent == I_HURT) + to_chat(user,"As you squeeze the [name], it crumbles into dust and falls apart into nothing!") + qdel(src) + +/obj/item/weapon/digestion_remains/ribcage + name = "ribcage" + desc = "A bleached ribcage. It's very white and definitely has seen better times. Hard to tell what it belonged to." + icon_state = "ribcage" + +/obj/item/weapon/digestion_remains/skull + name = "skull" + desc = "A bleached skull. It looks very weakened. Seems like it belonged to a human." + icon_state = "skull" + +/obj/item/weapon/digestion_remains/skull/tajaran + desc = "A bleached skull. It looks very weakened. Seems like it belonged to a tajara." + icon_state = "skull_taj" + +/obj/item/weapon/digestion_remains/skull/unathi + desc = "A bleached skull. It looks very weakened. Seems like it belonged to an unathi." + icon_state = "skull_unathi" + +/obj/item/weapon/digestion_remains/skull/skrell + desc = "A bleached skull. It looks very weakened. Seems like it belonged to a skrell." + icon_state = "skull" + +/obj/item/weapon/digestion_remains/skull/vasilissan + desc = "A bleached skull. It looks very weakened. Seems like it belonged to a vasilissan." + icon_state = "skull" + +/obj/item/weapon/digestion_remains/skull/akula + desc = "A bleached skull. It looks very weakened. Seems like it belonged to an akula." + icon_state = "skull_unathi" + +/obj/item/weapon/digestion_remains/skull/rapala + desc = "A bleached skull. It looks very weakened. Seems like it belonged to a rapala." + icon_state = "skull" + +/obj/item/weapon/digestion_remains/skull/vulpkanin + desc = "A bleached skull. It looks very weakened. Seems like it belonged to a vulpkanin." + icon_state = "skull_taj" + +/obj/item/weapon/digestion_remains/skull/sergal + desc = "A bleached skull. It looks very weakened. Seems like it belonged to a sergal." + icon_state = "skull_taj" + +/obj/item/weapon/digestion_remains/skull/zorren + desc = "A bleached skull. It looks very weakened. Seems like it belonged to a zorren." + icon_state = "skull_taj" + +/obj/item/weapon/digestion_remains/skull/nevrean + desc = "A bleached skull. It looks very weakened. Seems like it belonged to a nevrean." + icon_state = "skull_taj" + +/obj/item/weapon/digestion_remains/skull/teshari + desc = "A bleached skull. It looks very weakened. Seems like it belonged to a teshari." + icon_state = "skull_taj" + +/obj/item/weapon/digestion_remains/skull/vox + desc = "A bleached skull. It looks very weakened. Seems like it belonged to a vox." + icon_state = "skull_taj" + +/obj/item/weapon/digestion_remains/skull/unknown + desc = "A bleached skull. It looks very weakened. You can't quite tell what species it belonged to." + icon_state = "skull" + +/obj/item/weapon/digestion_remains/skull/unknown/anthro + icon_state = "skull_taj" + +/obj/item/weapon/digestion_remains/skull/xenohybrid + desc = "A bleached skull. It looks very weakened. Seems like it belonged to something with prolonged head." + icon_state = "skull_xenohybrid" \ No newline at end of file diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm index 26c03300a2..036dbf777d 100644 --- a/code/modules/vore/eating/living_vr.dm +++ b/code/modules/vore/eating/living_vr.dm @@ -1,6 +1,7 @@ ///////////////////// Mob Living ///////////////////// /mob/living var/digestable = 1 // Can the mob be digested inside a belly? + var/digest_leave_remains = 0 // Will this mob leave bones/skull/etc after the melty demise? var/allowmobvore = 1 // Will simplemobs attempt to eat the mob? var/showvoreprefs = 1 // Determines if the mechanical vore preferences button will be displayed on the mob or not. var/obj/belly/vore_selected // Default to no vore capability. @@ -195,6 +196,7 @@ var/datum/vore_preferences/P = client.prefs_vr P.digestable = src.digestable + P.digest_leave_remains = src.digest_leave_remains P.allowmobvore = src.allowmobvore P.vore_taste = src.vore_taste P.can_be_drop_prey = src.can_be_drop_prey @@ -220,6 +222,7 @@ var/datum/vore_preferences/P = client.prefs_vr digestable = P.digestable + digest_leave_remains = P.digest_leave_remains allowmobvore = P.allowmobvore vore_taste = P.vore_taste can_be_drop_prey = P.can_be_drop_prey @@ -664,6 +667,7 @@ CRASH("display_voreprefs() was called without an associated user.") var/dispvoreprefs = "[src]'s vore preferences


" dispvoreprefs += "Digestable: [digestable ? "Enabled" : "Disabled"]
" + dispvoreprefs += "Leaves Remains: [digest_leave_remains ? "Enabled" : "Disabled"]
" dispvoreprefs += "Mob Vore: [allowmobvore ? "Enabled" : "Disabled"]
" dispvoreprefs += "Drop-nom prey: [can_be_drop_prey ? "Enabled" : "Disabled"]
" dispvoreprefs += "Drop-nom pred: [can_be_drop_pred ? "Enabled" : "Disabled"]
" diff --git a/code/modules/vore/eating/vore_vr.dm b/code/modules/vore/eating/vore_vr.dm index a3b5fec4a5..f89462f23c 100644 --- a/code/modules/vore/eating/vore_vr.dm +++ b/code/modules/vore/eating/vore_vr.dm @@ -42,6 +42,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE /datum/vore_preferences //Actual preferences var/digestable = TRUE + var/digest_leave_remains = FALSE var/allowmobvore = TRUE var/list/belly_prefs = list() var/vore_taste = "nothing in particular" @@ -92,9 +93,9 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE return 0 //Need to know what character to load! slot = client.prefs.default_slot - + load_path(client_ckey,slot) - + if(!path) return 0 //Path couldn't be set? if(!fexists(path)) //Never saved before save_vore() //Make the file first @@ -108,6 +109,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE json_from_file = patch_version(json_from_file,version) digestable = json_from_file["digestable"] + digest_leave_remains = json_from_file["digest_leave_remains"] allowmobvore = json_from_file["allowmobvore"] vore_taste = json_from_file["vore_taste"] can_be_drop_prey = json_from_file["can_be_drop_prey"] @@ -117,6 +119,8 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE //Quick sanitize if(isnull(digestable)) digestable = TRUE + if(isnull(digest_leave_remains)) + digest_leave_remains = FALSE if(isnull(allowmobvore)) allowmobvore = TRUE if(isnull(can_be_drop_prey)) @@ -130,11 +134,12 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE /datum/vore_preferences/proc/save_vore() if(!path) return 0 - + var/version = 1 //For "good times" use in the future var/list/settings_list = list( "version" = version, "digestable" = digestable, + "digest_leave_remains" = digest_leave_remains, "allowmobvore" = allowmobvore, "vore_taste" = vore_taste, "can_be_drop_prey" = can_be_drop_prey, @@ -147,7 +152,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE if(!json_to_file) log_debug("Saving: [path] failed jsonencode") return 0 - + //Write it out #ifdef RUST_G call(RUST_G, "file_write")(json_to_file, path) diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm index 1f97cc338b..7de18033ab 100644 --- a/code/modules/vore/eating/vorepanel_vr.dm +++ b/code/modules/vore/eating/vorepanel_vr.dm @@ -298,6 +298,12 @@ if(0) dat += "Toggle Digestable" + switch(user.digest_leave_remains) + if(1) + dat += "Toggle Leaving Remains" + if(0) + dat += "Toggle Leaving Remains" + switch(user.allowmobvore) if(1) dat += "Toggle Mob Vore" @@ -837,6 +843,19 @@ if(user.client.prefs_vr) user.client.prefs_vr.digestable = user.digestable + if(href_list["toggledlm"]) + var/choice = alert(user, "This button allows preds to have your remains be left in their belly after you are digested. This will only happen if pred sets their belly to do so. Remains consist of skeletal parts. Currently you are [user.digest_leave_remains? "" : "not"] leaving remains.", "", "Allow Post-digestion Remains", "Cancel", "Disallow Post-digestion Remains") + switch(choice) + if("Cancel") + return 0 + if("Allow Post-digestion Remains") + user.digest_leave_remains = TRUE + if("Disallow Post-digestion Remains") + user.digest_leave_remains = FALSE + + if(user.client.prefs_vr) + user.client.prefs_vr.digest_leave_remains = user.digest_leave_remains + if(href_list["togglemv"]) var/choice = alert(user, "This button is for those who don't like being eaten by mobs. Messages admins when changed, so don't try to use it for mechanical benefit. Set it once and save it. Mobs are currently: [user.allowmobvore ? "Allowed to eat" : "Prevented from eating"] you.", "", "Allow Mob Predation", "Cancel", "Prevent Mob Predation") switch(choice) diff --git a/icons/obj/bones_vr.dmi b/icons/obj/bones_vr.dmi new file mode 100644 index 0000000000000000000000000000000000000000..ad384a69073ddd4c0d69c1863df3ec42d6f96abc GIT binary patch literal 700 zcmV;t0z>_YP)fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM z;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3K9+JvA@2C^K1!i!&v&s2C_>$i#mdB2|{=C6;7l5~;W%H7`G-GN~vt1(yb81y?^8 zaBu+tSwLEtAW86(0004-NkldWZ zW;fcfs0)S3jg~HMs4Q-!xUsu1`(uPb`0f%)8r|%h?z`{3``+E~4j{rW5DP1yG#o!q z%OUwyr5J)A10Fvq9b%ng0lDC{N-+Pp(c1D$99TPBL)~Og<`cd9vs9`TQfcO@klnQn z>rQg5Z_ft;9Ika9XS;UFvWAkO=5DQ0!Wkt+1v#3z)4c-#I_sK4o}dYfkuL~X6IW`3 zF;XGu3~eyB_7B)d>cEjB$k=mNxPcB5C{-!0r@d!fb_GWpT-_={?fdUCMG}x|FhNEK z^5Fz3RSuH`v|Aws5h6tRGdRwZxRE;wXBl8+UQTw4`R8m3lE3us(i`LuwXP8dEU0N=R?moC#YXv3-B+i*|yQ^@B9tt zmN|Birvy9Ku_fPe92Y%{(Vuy~gWu_kaU8yLO~VEuvq-xRo&en&#vl->4_6HQW+GSs inKx-eJs^ni&+rY6t6LUd)`c(t0000 Date: Tue, 2 Apr 2019 08:42:07 +1000 Subject: [PATCH 003/141] Made gurgle bones digestible and trash-edible --- code/_helpers/global_lists_vr.dm | 1 + code/modules/vore/eating/digest_act_vr.dm | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm index cf19a476a8..4618bb536d 100644 --- a/code/_helpers/global_lists_vr.dm +++ b/code/_helpers/global_lists_vr.dm @@ -137,6 +137,7 @@ var/global/list/edible_trash = list(/obj/item/broken_device, /obj/item/stack/material/cardboard, /obj/item/toy, /obj/item/trash, + /obj/item/weapon/digestion_remains, /obj/item/weapon/bananapeel, /obj/item/weapon/bone, /obj/item/weapon/broken_bottle, diff --git a/code/modules/vore/eating/digest_act_vr.dm b/code/modules/vore/eating/digest_act_vr.dm index 5799d39979..2467f5aaa2 100644 --- a/code/modules/vore/eating/digest_act_vr.dm +++ b/code/modules/vore/eating/digest_act_vr.dm @@ -60,8 +60,6 @@ return FALSE //Sorta important to not digest your own beacons. /obj/item/organ/internal/brain/slime/digest_act(var/atom/movable/item_storage = null) return FALSE //so prometheans can be recovered -/obj/item/weapon/digestion_remains/digest_act(var/atom/movable/item_storage = null) - return FALSE //Don't digest stuff we intentionally made ///////////// // Some special treatment From 10b9196d267b44888ec2c8afe3410ec67e4faa82 Mon Sep 17 00:00:00 2001 From: Heroman Date: Sat, 6 Apr 2019 19:12:04 +1000 Subject: [PATCH 004/141] Admin convinience for remains --- code/modules/vore/eating/leave_remains_vr.dm | 47 +++++++++++--------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/code/modules/vore/eating/leave_remains_vr.dm b/code/modules/vore/eating/leave_remains_vr.dm index 79c315ff8e..be515f51c3 100644 --- a/code/modules/vore/eating/leave_remains_vr.dm +++ b/code/modules/vore/eating/leave_remains_vr.dm @@ -10,64 +10,64 @@ var/bones_amount = rand(2,3) //some random variety in amount of bones left if(prob(20)) //ribcage surviving whole is some luck - new /obj/item/weapon/digestion_remains/ribcage(src) + new /obj/item/weapon/digestion_remains/ribcage(src,owner) bones_amount-- while(bones_amount) //throw in the rest - new /obj/item/weapon/digestion_remains(src) + new /obj/item/weapon/digestion_remains(src,owner) bones_amount-- var/skull_amount = 1 switch(H.species.name) //oh boy here we go, finding us a right skull if(SPECIES_HUMAN) - new /obj/item/weapon/digestion_remains/skull(src) + new /obj/item/weapon/digestion_remains/skull(src,owner) skull_amount-- if(SPECIES_TAJ) - new /obj/item/weapon/digestion_remains/skull/tajaran(src) + new /obj/item/weapon/digestion_remains/skull/tajaran(src,owner) skull_amount-- if(SPECIES_UNATHI) - new /obj/item/weapon/digestion_remains/skull/unathi(src) + new /obj/item/weapon/digestion_remains/skull/unathi(src,owner) skull_amount-- if(SPECIES_SKRELL) - new /obj/item/weapon/digestion_remains/skull/skrell(src) + new /obj/item/weapon/digestion_remains/skull/skrell(src,owner) skull_amount-- if(SPECIES_VASILISSAN) - new /obj/item/weapon/digestion_remains/skull/vasilissan(src) + new /obj/item/weapon/digestion_remains/skull/vasilissan(src,owner) skull_amount-- if(SPECIES_AKULA) - new /obj/item/weapon/digestion_remains/skull/akula(src) + new /obj/item/weapon/digestion_remains/skull/akula(src,owner) skull_amount-- if(SPECIES_RAPALA) - new /obj/item/weapon/digestion_remains/skull/rapala(src) + new /obj/item/weapon/digestion_remains/skull/rapala(src,owner) skull_amount-- if(SPECIES_VULPKANIN) - new /obj/item/weapon/digestion_remains/skull/vulpkanin(src) + new /obj/item/weapon/digestion_remains/skull/vulpkanin(src,owner) skull_amount-- if(SPECIES_SERGAL) - new /obj/item/weapon/digestion_remains/skull/sergal(src) + new /obj/item/weapon/digestion_remains/skull/sergal(src,owner) skull_amount-- if(SPECIES_ZORREN_FLAT || SPECIES_ZORREN_HIGH) - new /obj/item/weapon/digestion_remains/skull/zorren(src) + new /obj/item/weapon/digestion_remains/skull/zorren(src,owner) skull_amount-- if(SPECIES_NEVREAN) - new /obj/item/weapon/digestion_remains/skull/nevrean(src) + new /obj/item/weapon/digestion_remains/skull/nevrean(src,owner) skull_amount-- if(SPECIES_TESHARI) - new /obj/item/weapon/digestion_remains/skull/teshari(src) + new /obj/item/weapon/digestion_remains/skull/teshari(src,owner) skull_amount-- if(SPECIES_VOX) - new /obj/item/weapon/digestion_remains/skull/vox(src) + new /obj/item/weapon/digestion_remains/skull/vox(src,owner) skull_amount-- if(SPECIES_XENOHYBRID) - new /obj/item/weapon/digestion_remains/skull/xenohybrid(src) + new /obj/item/weapon/digestion_remains/skull/xenohybrid(src,owner) skull_amount-- if(skull_amount && H.species.selects_bodytype) //We still haven't found correct skull... if(H.species.base_species == SPECIES_HUMAN) - new /obj/item/weapon/digestion_remains/skull/unknown(src) + new /obj/item/weapon/digestion_remains/skull/unknown(src,owner) else - new /obj/item/weapon/digestion_remains/skull/unknown/anthro(src) + new /obj/item/weapon/digestion_remains/skull/unknown/anthro(src,owner) else if(skull_amount) //Something entirely different... - new /obj/item/weapon/digestion_remains/skull/unknown(src) + new /obj/item/weapon/digestion_remains/skull/unknown(src,owner) else return @@ -80,6 +80,13 @@ throwforce = 0 item_state = "bone" w_class = ITEMSIZE_SMALL + var/pred_ckey + var/pred_name + +/obj/item/weapon/digestion_remains/New(var/newloc,var/mob/living/pred) + ..(newloc) + pred_ckey = pred.ckey + pred_name = pred.name /obj/item/weapon/digestion_remains/attack_self(mob/user) if(user.a_intent == I_HURT) @@ -152,5 +159,5 @@ icon_state = "skull_taj" /obj/item/weapon/digestion_remains/skull/xenohybrid - desc = "A bleached skull. It looks very weakened. Seems like it belonged to something with prolonged head." + desc = "A bleached skull. It looks very weakened. Seems like it belonged to something with an elongated head." icon_state = "skull_xenohybrid" \ No newline at end of file From 18e00b3617e9cc5a1cbc489740e3728b43e46e51 Mon Sep 17 00:00:00 2001 From: Heroman Date: Mon, 8 Apr 2019 06:16:53 +1000 Subject: [PATCH 005/141] Fixes micromechs using normal equipment --- code/game/mecha/equipment/mecha_equipment.dm | 32 ++++++++++++++++++++ code/game/mecha/micro/micro.dm | 15 +++++++++ code/game/mecha/micro/micro_equipment.dm | 7 +++++ code/game/mecha/micro/security.dm | 4 +++ code/game/mecha/micro/utility.dm | 2 ++ 5 files changed, 60 insertions(+) diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index 825dfde5f5..02b5285d98 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -4,6 +4,10 @@ #define EQUIP_WEAPON 2 #define EQUIP_UTILITY 3 #define EQUIP_SPECIAL 4 +//VOREStation Addition begin: MICROMECHS +#define EQUIP_MICRO_UTILITY 5 +#define EQUIP_MICRO_WEAPON 6 +//VOREStation Addition end: MICROMECHS /obj/item/mecha_parts/mecha_equipment name = "mecha equipment" @@ -64,6 +68,14 @@ if(equip_type == EQUIP_SPECIAL) chassis.special_equipment -= src listclearnulls(chassis.special_equipment) + //VOREStation Addition begin: MICROMECHS + if(equip_type == EQUIP_MICRO_UTILITY) + chassis.micro_utility_equipment -= src + listclearnulls(chassis.micro_utility_equipment) + if(equip_type == EQUIP_MICRO_WEAPON) + chassis.micro_weapon_equipment -= src + listclearnulls(chassis.micro_weapon_equipment) + //VOREStation Addition end: MICROMECHS chassis.universal_equipment -= src chassis.equipment -= src listclearnulls(chassis.equipment) @@ -140,6 +152,12 @@ return 1 if(equip_type == EQUIP_SPECIAL && M.special_equipment.len < M.max_special_equip) return 1 + //VOREStation Addition begin: MICROMECHS + if(equip_type == EQUIP_MICRO_UTILITY && M.micro_utility_equipment.len < M.max_micro_utility_equip) + return 1 + if(equip_type == EQUIP_MICRO_WEAPON && M.micro_weapon_equipment.len < M.max_micro_weapon_equip) + return 1 + //VOREStation Addition end: MICROMECHS if(equip_type != EQUIP_SPECIAL && M.universal_equipment.len < M.max_universal_equip) //The exosuit needs to be military grade to actually have a universal slot capable of accepting a true weapon. if(equip_type == EQUIP_WEAPON && !istype(M, /obj/mecha/combat)) return 0 @@ -168,6 +186,14 @@ if(equip_type == EQUIP_SPECIAL && M.special_equipment.len < M.max_special_equip && !has_equipped) M.special_equipment += src has_equipped = 1 + //VOREStation Addition begin: MICROMECHS + if(equip_type == EQUIP_MICRO_UTILITY && M.micro_utility_equipment.len < M.max_micro_utility_equip && !has_equipped) + M.micro_utility_equipment += src + has_equipped = 1 + if(equip_type == EQUIP_MICRO_WEAPON && M.micro_weapon_equipment.len < M.max_micro_weapon_equip && !has_equipped) + M.micro_weapon_equipment += src + has_equipped = 1 + //VOREStation Addition end: MICROMECHS if(equip_type != EQUIP_SPECIAL && M.universal_equipment.len < M.max_universal_equip && !has_equipped) M.universal_equipment += src M.equipment += src @@ -194,6 +220,12 @@ chassis.utility_equipment -= src if(EQUIP_SPECIAL) chassis.special_equipment -= src + //VOREStation Addition begin: MICROMECHS + if(EQUIP_UTILITY) + chassis.micro_utility_equipment -= src + if(EQUIP_SPECIAL) + chassis.micro_weapon_equipment -= src + //VOREStation Addition end: MICROMECHS if(chassis.selected == src) chassis.selected = null update_chassis_page() diff --git a/code/game/mecha/micro/micro.dm b/code/game/mecha/micro/micro.dm index 6da9b830c6..9c8a44899d 100644 --- a/code/game/mecha/micro/micro.dm +++ b/code/game/mecha/micro/micro.dm @@ -1,3 +1,11 @@ +/obj/mecha + var/max_micro_utility_equip = 0 + var/max_micro_weapon_equip = 0 + var/list/micro_utility_equipment = new + var/list/micro_weapon_equipment = new + + + /obj/mecha/micro icon = 'icons/mecha/micro.dmi' force = 10 //still a robot @@ -9,6 +17,13 @@ var/list/destroyable_obj = list(/obj/mecha, /obj/structure/window, /obj/structure/grille, /turf/simulated/wall) internal_damage_threshold = 50 maint_access = 0 + max_hull_equip = 1 + max_weapon_equip = 0 + max_utility_equip = 0 + max_universal_equip = 0 + max_special_equip = 1 + max_micro_utility_equip = 1 + max_micro_weapon_equip = 1 //add_req_access = 0 //operation_req_access = list(access_hos) damage_absorption = list("brute"=1,"fire"=1,"bullet"=1,"laser"=1,"energy"=1,"bomb"=1) diff --git a/code/game/mecha/micro/micro_equipment.dm b/code/game/mecha/micro/micro_equipment.dm index 9d2cfe40cd..b8e4557b47 100644 --- a/code/game/mecha/micro/micro_equipment.dm +++ b/code/game/mecha/micro/micro_equipment.dm @@ -14,6 +14,7 @@ energy_drain = 50 projectile = /obj/item/projectile/beam fire_sound = 'sound/weapons/Laser.ogg' + equip_type = EQUIP_MICRO_WEAPON required_type = list(/obj/mecha/micro/sec) /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/microheavy @@ -26,6 +27,7 @@ energy_drain = 120 projectile = /obj/item/projectile/beam/heavylaser fire_sound = 'sound/weapons/lasercannonfire.ogg' + equip_type = EQUIP_MICRO_WEAPON required_type = list(/obj/mecha/micro/sec) /obj/item/mecha_parts/mecha_equipment/weapon/energy/microtaser @@ -38,6 +40,7 @@ equip_cooldown = 10 projectile = /obj/item/projectile/beam/stun fire_sound = 'sound/weapons/Taser.ogg' + equip_type = EQUIP_MICRO_WEAPON required_type = list(/obj/mecha/micro/sec) /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/microshotgun @@ -55,6 +58,7 @@ projectiles_per_shot = 1 deviation = 0.7 projectile_energy_cost = 100 + equip_type = EQUIP_MICRO_WEAPON required_type = list(/obj/mecha/micro/sec) Topic(href,href_list) @@ -89,6 +93,7 @@ projectile_energy_cost = 800 equip_cooldown = 30 det_time = 15 + equip_type = EQUIP_MICRO_WEAPON required_type = list(/obj/mecha/micro/sec) @@ -105,6 +110,7 @@ equip_cooldown = 30 energy_drain = 10 force = 15 + equip_type = EQUIP_MICRO_UTILITY required_type = list(/obj/mecha/micro/utility) action(atom/target) @@ -155,6 +161,7 @@ icon_state = "microscoop" equip_cooldown = 5 energy_drain = 0 + equip_type = EQUIP_MICRO_UTILITY required_type = list(/obj/mecha/micro/utility) var/orecapacity = 500 diff --git a/code/game/mecha/micro/security.dm b/code/game/mecha/micro/security.dm index e3b43846d2..713c08d3d9 100644 --- a/code/game/mecha/micro/security.dm +++ b/code/game/mecha/micro/security.dm @@ -30,6 +30,8 @@ wreckage = /obj/effect/decal/mecha_wreckage/micro/sec/polecat internal_damage_threshold = 35 max_equip = 3 + max_micro_utility_equip = 0 + max_micro_weapon_equip = 3 /obj/effect/decal/mecha_wreckage/micro/sec/polecat name = "Polecat wreckage" @@ -52,6 +54,8 @@ wreckage = /obj/effect/decal/mecha_wreckage/micro/sec/weasel internal_damage_threshold = 20 max_equip = 2 + max_micro_utility_equip = 0 + max_micro_weapon_equip = 2 /obj/effect/decal/mecha_wreckage/micro/sec/weasel name = "Weasel wreckage" diff --git a/code/game/mecha/micro/utility.dm b/code/game/mecha/micro/utility.dm index d2bbe7d507..0d7290a1cf 100644 --- a/code/game/mecha/micro/utility.dm +++ b/code/game/mecha/micro/utility.dm @@ -16,6 +16,8 @@ var/overload_coeff = 2 wreckage = /obj/effect/decal/mecha_wreckage/micro/utility/gopher internal_damage_threshold = 35 + max_micro_utility_equip = 2 + max_micro_weapon_equip = 0 max_equip = 2 /obj/effect/decal/mecha_wreckage/micro/utility/gopher From 20fc3748edafea3de2326d0e8663ce33e83e11cb Mon Sep 17 00:00:00 2001 From: Heroman Date: Mon, 8 Apr 2019 06:48:08 +1000 Subject: [PATCH 006/141] Fixes Berries and Grapes fruits for Alraune --- code/global_vr.dm | 4 ++-- .../mob/living/carbon/human/species/station/alraune.dm | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/global_vr.dm b/code/global_vr.dm index 154613a4bb..9506dd62d3 100644 --- a/code/global_vr.dm +++ b/code/global_vr.dm @@ -10,13 +10,13 @@ var/global/list/acceptable_fruit_types= list( "ambrosia", "apple", "banana", - "berry", + "berries", "cabbage", "carrot", "cherry", "chili", "eggplant", - "grape", + "grapes", "greengrapes", "lemon", "lime", diff --git a/code/modules/mob/living/carbon/human/species/station/alraune.dm b/code/modules/mob/living/carbon/human/species/station/alraune.dm index 55e6215fc7..2de96d9f74 100644 --- a/code/modules/mob/living/carbon/human/species/station/alraune.dm +++ b/code/modules/mob/living/carbon/human/species/station/alraune.dm @@ -389,7 +389,7 @@ /mob/living/carbon/human/proc/alraune_fruit_select() //So if someone doesn't want fruit/vegetables, they don't have to select one. set name = "Select fruit" set desc = "Select what fruit/vegetable you wish to grow." - set category = "Object" + set category = "Abilities" var/obj/item/organ/internal/fruitgland/fruit_gland for(var/F in contents) if(istype(F, /obj/item/organ/internal/fruitgland)) From 86a98230b9eb408f767016f8b335f334848442bb Mon Sep 17 00:00:00 2001 From: Heroman Date: Mon, 8 Apr 2019 07:09:18 +1000 Subject: [PATCH 007/141] Fixes being unable to climb ladders you're already on --- code/modules/multiz/structures.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/multiz/structures.dm b/code/modules/multiz/structures.dm index 02277740c4..c22e17a789 100644 --- a/code/modules/multiz/structures.dm +++ b/code/modules/multiz/structures.dm @@ -48,7 +48,7 @@ var/obj/structure/ladder/target_ladder = getTargetLadder(M) if(!target_ladder) return - if(!M.Move(get_turf(src))) + if(!(M.loc == loc) && !M.Move(get_turf(src))) to_chat(M, "You fail to reach \the [src].") return From 7d828a777750884fbb448a701f9e071bbcf2a030 Mon Sep 17 00:00:00 2001 From: Heroman Date: Mon, 8 Apr 2019 07:27:02 +1000 Subject: [PATCH 008/141] Makes Sonic Jackhammer a 'safe' mining tool --- code/modules/mining/mine_items.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index dde3b7f6f7..1888e956ff 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -55,6 +55,7 @@ origin_tech = list(TECH_MATERIAL = 3, TECH_POWER = 2, TECH_ENGINEERING = 2) desc = "Cracks rocks with sonic blasts, perfect for killing cave lizards." drill_verb = "hammering" + destroy_artefacts = TRUE /obj/item/weapon/pickaxe/gold name = "golden pickaxe" @@ -104,6 +105,7 @@ digspeed = 15 desc = "Cracks rocks with sonic blasts. This one seems like an improved design." drill_verb = "hammering" + destroy_artefacts = TRUE /*****************************Shovel********************************/ From 46467468780066b6de38d84efad2b718f33301ee Mon Sep 17 00:00:00 2001 From: Heroman Date: Mon, 8 Apr 2019 07:35:14 +1000 Subject: [PATCH 009/141] Adds missing shutter to chemistry windows --- maps/tether/tether-07-station3.dmm | 49 +++++++++++++++--------------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/maps/tether/tether-07-station3.dmm b/maps/tether/tether-07-station3.dmm index e0dba22890..e4d438e4d3 100644 --- a/maps/tether/tether-07-station3.dmm +++ b/maps/tether/tether-07-station3.dmm @@ -17359,6 +17359,30 @@ /area/supply/station{ dynamic_lighting = 0 }) +"AZ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/window/westleft, +/obj/machinery/door/window/eastleft{ + req_one_access = list(33) + }, +/obj/structure/table/reinforced, +/obj/machinery/door/blast/shutters{ + dir = 8; + id = "chemistry"; + layer = 3.1; + name = "Chemistry Shutters" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/door/firedoor/glass, +/turf/simulated/floor/tiled/monotile, +/area/medical/chemistry) "Ba" = ( /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4 @@ -20457,29 +20481,6 @@ }, /turf/simulated/floor/tiled/white, /area/medical/reception) -"Gu" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/window/westleft, -/obj/machinery/door/window/eastleft{ - req_one_access = list(33) - }, -/obj/structure/table/reinforced, -/obj/machinery/door/blast/shutters{ - dir = 8; - id = "chemistry"; - layer = 3.1; - name = "Chemistry Shutters" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/simulated/floor/tiled/monotile, -/area/medical/chemistry) "Gv" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -36265,7 +36266,7 @@ Do Dp EP FE -Gu +AZ EP Dp ID From f955d69bd92c66eebb3a55a659f885c4f028a9a0 Mon Sep 17 00:00:00 2001 From: Heroman Date: Mon, 8 Apr 2019 07:37:48 +1000 Subject: [PATCH 010/141] Moves destroy_artefact vars to _vr file --- code/modules/mining/mine_items_vr.dm | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/code/modules/mining/mine_items_vr.dm b/code/modules/mining/mine_items_vr.dm index d8046a7b06..3fbf95d826 100644 --- a/code/modules/mining/mine_items_vr.dm +++ b/code/modules/mining/mine_items_vr.dm @@ -1,7 +1,7 @@ //upgrades the speed of all drills and pickaxes. /obj/item/weapon/pickaxe - digspeed = 36 + digspeed = 36 /obj/item/weapon/pickaxe/silver digspeed = 27 @@ -10,14 +10,15 @@ digspeed = 27 /obj/item/weapon/pickaxe/jackhammer - digspeed = 18 + digspeed = 18 + destroy_artefacts = TRUE /obj/item/weapon/pickaxe/gold digspeed = 18 /obj/item/weapon/pickaxe/plasmacutter - digspeed = 18 - + digspeed = 18 + /obj/item/weapon/pickaxe/diamond digspeed = 9 @@ -26,3 +27,4 @@ /obj/item/weapon/pickaxe/borgdrill digspeed = 13 + destroy_artefacts = TRUE From 09b5ae0ac468b6836a341ab63da8d3f162700fdf Mon Sep 17 00:00:00 2001 From: Heroman Date: Mon, 8 Apr 2019 07:38:22 +1000 Subject: [PATCH 011/141] AND REMOVES THEM FROM NORMAL ONES --- code/modules/mining/mine_items.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 1888e956ff..dde3b7f6f7 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -55,7 +55,6 @@ origin_tech = list(TECH_MATERIAL = 3, TECH_POWER = 2, TECH_ENGINEERING = 2) desc = "Cracks rocks with sonic blasts, perfect for killing cave lizards." drill_verb = "hammering" - destroy_artefacts = TRUE /obj/item/weapon/pickaxe/gold name = "golden pickaxe" @@ -105,7 +104,6 @@ digspeed = 15 desc = "Cracks rocks with sonic blasts. This one seems like an improved design." drill_verb = "hammering" - destroy_artefacts = TRUE /*****************************Shovel********************************/ From 6a5a4ffb855c31ba6ef27b93b00c701942294ffb Mon Sep 17 00:00:00 2001 From: Heroman Date: Mon, 8 Apr 2019 08:17:11 +1000 Subject: [PATCH 012/141] Fixes conveyors being unable to go backwards --- code/modules/recycling/conveyor2.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 428484ea66..4121b8a558 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -1,6 +1,6 @@ #define OFF 0 #define FORWARDS 1 -#define BACKWARDS 2 +#define BACKWARDS -1 //conveyor2 is pretty much like the original, except it supports corners, but not diverters. //note that corner pieces transfer stuff clockwise when running forward, and anti-clockwise backwards. From 35208e6e489405fc09e9b79823efdaf3bce1122e Mon Sep 17 00:00:00 2001 From: Heroman3003 <31296024+Heroman3003@users.noreply.github.com> Date: Mon, 8 Apr 2019 09:22:03 +1000 Subject: [PATCH 013/141] Fixes frozen pizzas, also ports polaris fix --- code/modules/food/food/snacks.dm | 12 ++++++------ code/modules/food/food/snacks_vr.dm | 14 +++++++------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm index 0a653ce3b0..f0840919e2 100644 --- a/code/modules/food/food/snacks.dm +++ b/code/modules/food/food/snacks.dm @@ -3181,7 +3181,7 @@ icon_state = "pizzabox_open" if( pizza ) - var/image/pizzaimg = image("food.dmi", icon_state = pizza.icon_state) + var/image/pizzaimg = image(icon = pizza.icon, icon_state = pizza.icon_state) //VOREStation Edit: Icons for bad pizza pizzaimg.pixel_y = -3 overlays += pizzaimg @@ -3301,23 +3301,23 @@ return ..() -/obj/item/pizzabox/margherita/New() +/obj/item/pizzabox/margherita/Initialize() pizza = new /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/margherita(src) boxtag = "Margherita Deluxe" -/obj/item/pizzabox/vegetable/New() +/obj/item/pizzabox/vegetable/Initialize() pizza = new /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/vegetablepizza(src) boxtag = "Gourmet Vegatable" -/obj/item/pizzabox/mushroom/New() +/obj/item/pizzabox/mushroom/Initialize() pizza = new /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/mushroompizza(src) boxtag = "Mushroom Special" -/obj/item/pizzabox/meat/New() +/obj/item/pizzabox/meat/Initialize() pizza = new /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatpizza(src) boxtag = "Meatlover's Supreme" -/obj/item/pizzabox/old/New() +/obj/item/pizzabox/old/Initialize() pizza = new /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/oldpizza(src) boxtag = "Deluxe Gourmet" diff --git a/code/modules/food/food/snacks_vr.dm b/code/modules/food/food/snacks_vr.dm index 9c5b398f5a..52f3752095 100644 --- a/code/modules/food/food/snacks_vr.dm +++ b/code/modules/food/food/snacks_vr.dm @@ -308,7 +308,7 @@ /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/wolpincube name = "wolpin cube" monkey_type = "Wolpin" - + /obj/item/weapon/reagent_containers/food/snacks/pizza/margfrozen name = "frozen margherita pizza" desc = "It's frozen rock solid, better thaw it in a microwave." @@ -317,7 +317,7 @@ center_of_mass = list("x"=16, "y"=11) nutriment_amt = 15 nutriment_desc = list("ice" = 5, "toothache" = 1, "frozen cheese" = 5, "frozen tomato" = 5) - + /obj/item/weapon/reagent_containers/food/snacks/pizza/margfrozen/Initialize() ..() bitesize = 20 @@ -353,7 +353,7 @@ /obj/item/weapon/reagent_containers/food/snacks/slice/margcargo/filled filled = TRUE - + /obj/item/weapon/reagent_containers/food/snacks/pizza/meatfrozen name = "frozen meat pizza" desc = "It's frozen rock solid, better thaw it in a microwave." @@ -362,7 +362,7 @@ center_of_mass = list("x"=16, "y"=11) nutriment_amt = 15 nutriment_desc = list("ice" = 5, "toothache" = 1, "frozen meat" = 5, "frozen cow screams" = 5) - + /obj/item/weapon/reagent_containers/food/snacks/pizza/meatfrozen/Initialize() ..() bitesize = 20 @@ -398,7 +398,7 @@ /obj/item/weapon/reagent_containers/food/snacks/slice/meatcargo/filled filled = TRUE - + /obj/item/weapon/reagent_containers/food/snacks/pizza/mushfrozen name = "frozen mushroom pizza" desc = "It's frozen rock solid, better thaw it in a microwave." @@ -407,7 +407,7 @@ center_of_mass = list("x"=16, "y"=11) nutriment_amt = 15 nutriment_desc = list("ice" = 5, "toothache" = 1, "frozen mushrooms" = 5, "frozen cream" = 5) - + /obj/item/weapon/reagent_containers/food/snacks/pizza/mushfrozen/Initialize() ..() bitesize = 20 @@ -451,7 +451,7 @@ center_of_mass = list("x"=16, "y"=11) nutriment_amt = 15 nutriment_desc = list("ice" = 5, "toothache" = 1, "frozen vegtable chunks" = 5) - + /obj/item/weapon/reagent_containers/food/snacks/pizza/vegfrozen/Initialize() ..() bitesize = 20 From 55ebfbb38aa647887d34e36e2e743398f415508b Mon Sep 17 00:00:00 2001 From: Heroman3003 <31296024+Heroman3003@users.noreply.github.com> Date: Mon, 8 Apr 2019 09:32:28 +1000 Subject: [PATCH 014/141] Fixes borgs not getting timestamps on radio messages --- code/modules/mob/hear_say.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index e7c097c2b3..5408742654 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -275,6 +275,8 @@ var/final_message = "[part_a][speaker_name][part_b][formatted]" if(check_mentioned(formatted) && is_preference_enabled(/datum/client_preference/check_mention)) final_message = "[time][final_message]" + else + final_message = "[time][final_message]" to_chat(src, final_message) /mob/living/silicon/ai/on_hear_radio(part_a, speaker_name, track, part_b, formatted) @@ -282,6 +284,8 @@ var/final_message = "[part_a][track][part_b][formatted]" if(check_mentioned(formatted) && is_preference_enabled(/datum/client_preference/check_mention)) final_message = "[time][final_message]" + else + final_message = "[time][final_message]" to_chat(src, final_message) /mob/proc/hear_signlang(var/message, var/verb = "gestures", var/datum/language/language, var/mob/speaker = null) From 3af17f032c1d5a659ef7d208221f9dcfb6e20314 Mon Sep 17 00:00:00 2001 From: Heroman3003 <31296024+Heroman3003@users.noreply.github.com> Date: Mon, 8 Apr 2019 09:48:31 +1000 Subject: [PATCH 015/141] Fixes broken dead lizard sprite --- .../mob/living/simple_mob/subtypes/animal/passive/lizard.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/lizard.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/lizard.dm index adb2ea83ca..c8dfe1c3a6 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/lizard.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/lizard.dm @@ -5,7 +5,7 @@ icon_state = "lizard" icon_living = "lizard" - icon_dead = "lizard-dead" + icon_dead = "lizard_dead" health = 5 maxHealth = 5 From e0e915873986dc85611f4fad9f0020cf4d0e21a0 Mon Sep 17 00:00:00 2001 From: Heroman3003 <31296024+Heroman3003@users.noreply.github.com> Date: Mon, 8 Apr 2019 10:19:21 +1000 Subject: [PATCH 016/141] Loadout adjustments for access and swimsuits --- .../loadout/loadout_uniform_vr.dm | 18 +++++++++--------- .../modules/vore/fluffstuff/custom_boxes_vr.dm | 12 ++++++++++++ 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm b/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm index 58201bb73b..1508905c60 100644 --- a/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm @@ -21,7 +21,7 @@ /datum/gear/uniform/job_khi/med display_name = "khi uniform, med" path = /obj/item/clothing/under/rank/khi/med - allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Paramedic","Geneticist") + allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Paramedic","Geneticist","Field Medic") /datum/gear/uniform/job_khi/eng display_name = "khi uniform, eng" @@ -31,7 +31,7 @@ /datum/gear/uniform/job_khi/sci display_name = "khi uniform, sci" path = /obj/item/clothing/under/rank/khi/sci - allowed_roles = list("Research Director","Scientist", "Roboticist", "Xenobiologist") + allowed_roles = list("Research Director", "Scientist", "Roboticist", "Xenobiologist", "Pathfinder", "Explorer") //Federation jackets /datum/gear/suit/job_fed/sec @@ -42,7 +42,7 @@ /datum/gear/suit/job_fed/medsci display_name = "fed uniform, med/sci" path = /obj/item/clothing/suit/storage/fluff/fedcoat/fedblue - allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Paramedic","Geneticist","Research Director","Scientist", "Roboticist", "Xenobiologist") + allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Paramedic","Geneticist","Research Director","Scientist", "Roboticist", "Xenobiologist","Pathfinder","Explorer","Field Medic") /datum/gear/suit/job_fed/eng display_name = "fed uniform, eng" @@ -59,7 +59,7 @@ /datum/gear/uniform/job_trek/medsci/tos display_name = "TOS uniform, med/sci" path = /obj/item/clothing/under/rank/trek/medsci - allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Paramedic","Geneticist","Research Director","Scientist", "Roboticist", "Xenobiologist") + allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Paramedic","Geneticist","Research Director","Scientist", "Roboticist", "Xenobiologist", "Pathfinder", "Explorer", "Field Medic") /datum/gear/uniform/job_trek/eng/tos display_name = "TOS uniform, eng/sec" @@ -75,7 +75,7 @@ /datum/gear/uniform/job_trek/medsci/tng display_name = "TNG uniform, med/sci" path = /obj/item/clothing/under/rank/trek/medsci/next - allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Paramedic","Geneticist","Research Director","Scientist", "Roboticist", "Xenobiologist") + allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Paramedic","Geneticist","Research Director","Scientist", "Roboticist", "Xenobiologist", "Pathfinder", "Explorer", "Field Medic") /datum/gear/uniform/job_trek/eng/tng display_name = "TNG uniform, eng/sec" @@ -91,7 +91,7 @@ /datum/gear/uniform/job_trek/medsci/voy display_name = "VOY uniform, med/sci" path = /obj/item/clothing/under/rank/trek/medsci/voy - allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Paramedic","Geneticist","Research Director","Scientist", "Roboticist", "Xenobiologist") + allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Paramedic","Geneticist","Research Director","Scientist", "Roboticist", "Xenobiologist", "Pathfinder", "Explorer", "Field Medic") /datum/gear/uniform/job_trek/eng/voy display_name = "VOY uniform, eng/sec" @@ -106,7 +106,7 @@ allowed_roles = list("Head of Security","Colony Director","Head of Personnel","Chief Engineer","Research Director", "Chief Medical Officer","Medical Doctor","Chemist","Paramedic","Geneticist", "Scientist","Roboticist","Xenobiologist","Atmospheric Technician", - "Station Engineer","Warden","Detective","Security Officer") + "Station Engineer","Warden","Detective","Security Officer", "Pathfinder", "Explorer", "Field Medic") /datum/gear/uniform/job_trek/cmd/ds9 @@ -117,7 +117,7 @@ /datum/gear/uniform/job_trek/medsci/ds9 display_name = "DS9 uniform, med/sci" path = /obj/item/clothing/under/rank/trek/medsci/ds9 - allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Paramedic","Geneticist","Research Director","Scientist", "Roboticist", "Xenobiologist") + allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Paramedic","Geneticist","Research Director","Scientist", "Roboticist", "Xenobiologist", "Pathfinder", "Explorer", "Field Medic") /datum/gear/uniform/job_trek/eng/ds9 display_name = "DS9 uniform, eng/sec" @@ -134,7 +134,7 @@ /datum/gear/uniform/job_trek/medsci/ent display_name = "ENT uniform, med/sci" path = /obj/item/clothing/under/rank/trek/medsci/ent - allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Paramedic","Geneticist","Research Director","Scientist", "Roboticist", "Xenobiologist") + allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Paramedic","Geneticist","Research Director","Scientist", "Roboticist", "Xenobiologist", "Pathfinder", "Explorer", "Field Medic") /datum/gear/uniform/job_trek/eng/ent display_name = "ENT uniform, eng/sec" diff --git a/code/modules/vore/fluffstuff/custom_boxes_vr.dm b/code/modules/vore/fluffstuff/custom_boxes_vr.dm index c434263c5d..64ada7cd6c 100644 --- a/code/modules/vore/fluffstuff/custom_boxes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_boxes_vr.dm @@ -284,6 +284,18 @@ Swimsuits, for general use, to avoid arriving to work with your swimsuit. name = "Red Swimsuit capsule" has_items = list(/obj/item/clothing/under/swimsuit/red) +/obj/item/weapon/storage/box/fluff/swimsuit/white + name = "White Swimsuit capsule" + has_items = list(/obj/item/clothing/under/swimsuit/white) + +/obj/item/weapon/storage/box/fluff/swimsuit/blue + name = "Striped Swimsuit capsule" + has_items = list(/obj/item/clothing/under/swimsuit/striped) + +/obj/item/weapon/storage/box/fluff/swimsuit/earth + name = "Earthen Swimsuit capsule" + has_items = list(/obj/item/clothing/under/swimsuit/earth) + /obj/item/weapon/storage/box/fluff/swimsuit/engineering name = "Engineering Swimsuit capsule" has_items = list(/obj/item/clothing/under/swimsuit/fluff/engineering) From b240e8d60d7706a6824eab4f168e77d4f87e471d Mon Sep 17 00:00:00 2001 From: Heroman3003 <31296024+Heroman3003@users.noreply.github.com> Date: Mon, 8 Apr 2019 10:34:21 +1000 Subject: [PATCH 017/141] Fixes flags anchoring themselves wrong way --- code/modules/mining/mine_items.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index dde3b7f6f7..75f675f67c 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -211,7 +211,7 @@ var/obj/item/stack/flag/newflag = new src.type(T) newflag.amount = 1 newflag.upright = 1 - anchored = 1 + newflag.anchored = 1 newflag.name = newflag.singular_name newflag.icon_state = "[newflag.base_state]_open" newflag.visible_message("[user] plants [newflag] firmly in the ground.") From f65ac4fce9b2649a8284e7caa8e52abfae2be350 Mon Sep 17 00:00:00 2001 From: Heroman3003 <31296024+Heroman3003@users.noreply.github.com> Date: Mon, 8 Apr 2019 10:49:56 +1000 Subject: [PATCH 018/141] Fixes deck of cards bringing up unnecesary prompt when picked up --- code/modules/games/cards.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index e9b3ae537e..08d762e093 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -254,8 +254,9 @@ return -/obj/item/weapon/deck/verb_pickup(mob/user as mob) // Snowflaked so pick up verb work as intended - if((user == usr && (!( usr.restrained() ) && (!( usr.stat ) && (usr.contents.Find(src) || in_range(src, usr)))))) +/obj/item/weapon/deck/verb_pickup() // Snowflaked so pick up verb work as intended + var/mob/user = usr + if((istype(user) && (!( usr.restrained() ) && (!( usr.stat ) && (usr.contents.Find(src) || in_range(src, usr)))))) if(!istype(usr, /mob/living/simple_mob)) if( !usr.get_active_hand() ) //if active hand is empty var/mob/living/carbon/human/H = user From ec6ee7268c780586a75d35519a1c5e5353b58d86 Mon Sep 17 00:00:00 2001 From: Heroman3003 <31296024+Heroman3003@users.noreply.github.com> Date: Mon, 8 Apr 2019 11:12:33 +1000 Subject: [PATCH 019/141] Fixes borg not being unlockable via PDA holding an ID --- code/modules/mob/living/silicon/robot/robot.dm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index ef1dfd275d..33c159ebf0 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -722,17 +722,18 @@ return 1 return 0 -/mob/living/silicon/robot/proc/check_access(obj/item/weapon/card/id/I) +/mob/living/silicon/robot/proc/check_access(obj/item/I) if(!istype(req_access, /list)) //something's very wrong return 1 var/list/L = req_access if(!L.len) //no requirements return 1 - if(!I || !istype(I, /obj/item/weapon/card/id) || !I.access) //not ID or no access + if(!I || !(istype(I, /obj/item/weapon/card/id) || istype(I, /obj/item/device/pda))) //not ID or PDA return 0 + var/access_found = I.GetAccess() for(var/req in req_access) - if(req in I.access) //have one of the required accesses + if(req in access_found) //have one of the required accesses return 1 return 0 From ea1b347a403f53175c675c056e8ae3bf1f4bec30 Mon Sep 17 00:00:00 2001 From: Heroman3003 <31296024+Heroman3003@users.noreply.github.com> Date: Mon, 8 Apr 2019 12:02:16 +1000 Subject: [PATCH 020/141] Restricts monkey languages, changes the keys on existing --- code/modules/mob/language/station_vr.dm | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/language/station_vr.dm b/code/modules/mob/language/station_vr.dm index c79e090e48..dcc2136672 100644 --- a/code/modules/mob/language/station_vr.dm +++ b/code/modules/mob/language/station_vr.dm @@ -22,7 +22,7 @@ desc = "The dominant language of the Sergal homeworld, Vilous. It consists of aggressive low-pitched hissing and throaty growling." speech_verb = "snarls" colour = "sergal" - key = "z" + key = "t" syllables = list ("grr", "gah", "woof", "arf", "arra", "rah", "wor", "sarg") /datum/language/vulpkanin @@ -66,11 +66,11 @@ ask_verb = "hums" exclaim_verb = "loudly sings" colour = "enochian" //So fancy - key = "a" + key = "i" syllables = list("salve","sum","loqui","operatur","iusta","et","permittit","facere","effercio","pluribus","enim","hoc", "mihi","wan","six","salve","tartu") machine_understands = FALSE - + /datum/language/bug name = LANGUAGE_VESPINAE desc = "A jarring and clicky language developed and used by Vasilissans, it is designed for use with mouthparts and as a result has become a common language for various arthropod species." @@ -98,3 +98,11 @@ /datum/language/gutter flags = WHITELISTED machine_understands = FALSE +/datum/language/human/monkey + flags = RESTRICTED +/datum/language/skrell/monkey + flags = RESTRICTED +/datum/language/unathi/monkey + flags = RESTRICTED +/datum/language/tajaran/monkey + flags = RESTRICTED \ No newline at end of file From 36ce5ec2dc00fb36b389ace3ec7ce9cf63b3d448 Mon Sep 17 00:00:00 2001 From: Heroman3003 <31296024+Heroman3003@users.noreply.github.com> Date: Mon, 8 Apr 2019 13:02:34 +1000 Subject: [PATCH 021/141] Removes Height and Weight descriptors from accessible ones --- code/modules/mob/living/carbon/human/species/species_vr.dm | 1 + .../mob/living/carbon/human/species/station/station_vr.dm | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/code/modules/mob/living/carbon/human/species/species_vr.dm b/code/modules/mob/living/carbon/human/species/species_vr.dm index fa3bb9762d..63f02a5af8 100644 --- a/code/modules/mob/living/carbon/human/species/species_vr.dm +++ b/code/modules/mob/living/carbon/human/species/species_vr.dm @@ -12,6 +12,7 @@ //var/reviving = 0 //commented out 'cause moved to mob holder_type = /obj/item/weapon/holder/micro //This allows you to pick up crew min_age = 18 + descriptors = list() var/wing_hair var/wing var/wing_animation diff --git a/code/modules/mob/living/carbon/human/species/station/station_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_vr.dm index b40f8a9bfe..3c8542aba0 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_vr.dm @@ -305,6 +305,7 @@ min_age = 18 gluttonous = 0 inherent_verbs = list(/mob/living/proc/shred_limb) + descriptors = list() /datum/species/tajaran spawn_flags = SPECIES_CAN_JOIN @@ -330,6 +331,7 @@ spawn_flags = SPECIES_CAN_JOIN min_age = 18 gluttonous = 0 + descriptors = list() /datum/species/diona spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED @@ -345,6 +347,7 @@ push_flags = ~HEAVY //Allows them to use micro step code. swap_flags = ~HEAVY gluttonous = 0 + descriptors = list() inherent_verbs = list( /mob/living/carbon/human/proc/sonar_ping, @@ -371,6 +374,9 @@ icobase = 'icons/mob/human_races/r_vox_old.dmi' deform = 'icons/mob/human_races/r_def_vox_old.dmi' inherent_verbs = list(/mob/living/proc/shred_limb, /mob/living/proc/eat_trash) + descriptors = list( + /datum/mob_descriptor/vox_markings = 0 + ) datum/species/harpy name = SPECIES_RAPALA From c0e1a377a63b993052af5d2fe984e011706094ac Mon Sep 17 00:00:00 2001 From: Heroman Date: Mon, 8 Apr 2019 14:45:59 +1000 Subject: [PATCH 022/141] Fixes tram doors disparity --- maps/tether/tether_things.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/maps/tether/tether_things.dm b/maps/tether/tether_things.dm index 05cf0d4629..379a5d0fb8 100644 --- a/maps/tether/tether_things.dm +++ b/maps/tether/tether_things.dm @@ -216,7 +216,7 @@ // Tram departure cryo doors that turn into ordinary airlock doors at round end /obj/machinery/cryopod/robot/door/tram name = "\improper Tram Station" - icon = 'icons/obj/doors/Doorext.dmi' + icon = 'icons/obj/doors/Doorextglass.dmi' icon_state = "door_closed" base_icon_state = "door_closed" occupied_icon_state = "door_locked" @@ -235,7 +235,7 @@ time_till_despawn = 0 ..() var/turf/T = get_turf(src) - var/obj/machinery/door/airlock/external/door = new(T) + var/obj/machinery/door/airlock/glass_external/door = new(T) door.req_access = null door.req_one_access = null qdel(src) From 032daec451c64f4cfb490d754a47eef5b8166810 Mon Sep 17 00:00:00 2001 From: Heroman Date: Mon, 8 Apr 2019 15:10:58 +1000 Subject: [PATCH 023/141] Removes collection of command PTO --- code/controllers/subsystems/persist_vr.dm | 25 +++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/code/controllers/subsystems/persist_vr.dm b/code/controllers/subsystems/persist_vr.dm index b2bcc4b2c0..6baceae332 100644 --- a/code/controllers/subsystems/persist_vr.dm +++ b/code/controllers/subsystems/persist_vr.dm @@ -41,24 +41,30 @@ SUBSYSTEM_DEF(persist) return continue + // Do not collect useless PTO + var/department_earning = J.department + if(J.department == "Command") + department_earning = "Civilian" + clear_unused_pto(M) + // Update client whatever var/client/C = M.client var/wait_in_hours = (wait / (1 HOUR)) * J.timeoff_factor LAZYINITLIST(C.department_hours) var/dept_hours = C.department_hours - if(isnum(C.department_hours[J.department])) - dept_hours[J.department] += wait_in_hours + if(isnum(C.department_hours[department_earning])) + dept_hours[department_earning] += wait_in_hours else - dept_hours[J.department] = wait_in_hours + dept_hours[department_earning] = wait_in_hours //Cap it - dept_hours[J.department] = min(config.pto_cap, dept_hours[J.department]) + dept_hours[department_earning] = min(config.pto_cap, dept_hours[department_earning]) // Okay we figured it out, lets update database! var/sql_ckey = sql_sanitize_text(C.ckey) - var/sql_dpt = sql_sanitize_text(J.department) - var/sql_bal = text2num("[C.department_hours[J.department]]") + var/sql_dpt = sql_sanitize_text(department_earning) + var/sql_bal = text2num("[C.department_hours[department_earning]]") var/DBQuery/query = dbcon.NewQuery("INSERT INTO vr_player_hours (ckey, department, hours) VALUES ('[sql_ckey]', '[sql_dpt]', [sql_bal]) ON DUPLICATE KEY UPDATE hours = VALUES(hours)") query.Execute() @@ -79,3 +85,10 @@ SUBSYSTEM_DEF(persist) // Let's check the mind. if(M.mind && M.mind.assigned_role) . = job_master.GetJob(M.mind.assigned_role) + +// This proc tries makes sure old Command PTO doesn't linger +/datum/controller/subsystem/persist/proc/clear_unused_pto(var/mob/M) + var/client/C = M.client + LAZYINITLIST(C.department_hours) + if(C.department_hours["Command"]) + C.department_hours["Command"] = null \ No newline at end of file From 5c29581ae63c6729776f15c011ada7b1761bf0b5 Mon Sep 17 00:00:00 2001 From: Heroman Date: Mon, 8 Apr 2019 15:23:04 +1000 Subject: [PATCH 024/141] Fixes tram ignoring respawn timers --- maps/tether/tether_things.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/maps/tether/tether_things.dm b/maps/tether/tether_things.dm index 05cf0d4629..b9c4e9faf0 100644 --- a/maps/tether/tether_things.dm +++ b/maps/tether/tether_things.dm @@ -250,7 +250,8 @@ var/choice = alert("Do you want to depart via the tram? Your character will leave the round.","Departure","Yes","No") if(user && Adjacent(user) && choice == "Yes") - user.ghostize() + var/mob/observer/dead/newghost = user.ghostize() + newghost.timeofdeath = world.time despawn_occupant(user) // Tram arrival point landmarks and datum From 315dabc9aad3937ce3b0af0cc2f657b539b40f24 Mon Sep 17 00:00:00 2001 From: Heroman Date: Mon, 8 Apr 2019 15:55:10 +1000 Subject: [PATCH 025/141] Fixes players in players being totally purged during despawning --- code/game/machinery/cryopod.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index ec127a4599..cda908f800 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -513,6 +513,12 @@ //visible_message("\The [initial(name)] hums and hisses as it moves [to_despawn.real_name] into storage.", 3) visible_message("\The [initial(name)] [on_store_visible_message_1] [to_despawn.real_name] [on_store_visible_message_2].", 3) + //VOREStation Edit begin: Dont delete mobs-in-mobs + if(to_despawn.client && to_despawn.stat<2) + var/mob/observer/dead/newghost = to_despawn.ghostize() + newghost.timeofdeath = world.time + //VOREStation Edit end: Dont delete mobs-in-mobs + //This should guarantee that ghosts don't spawn. to_despawn.ckey = null From 148511e6b03745c6a4ba1c77ce47ecbd81cd4663 Mon Sep 17 00:00:00 2001 From: Heroman Date: Mon, 8 Apr 2019 16:34:36 +1000 Subject: [PATCH 026/141] Fixes some issues with BSH --- code/game/area/Space Station 13 areas_vr.dm | 3 +++ code/modules/vore/fluffstuff/guns/bsharpoon.dm | 5 ++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/code/game/area/Space Station 13 areas_vr.dm b/code/game/area/Space Station 13 areas_vr.dm index c7d8b08398..ecca320658 100644 --- a/code/game/area/Space Station 13 areas_vr.dm +++ b/code/game/area/Space Station 13 areas_vr.dm @@ -79,6 +79,9 @@ /area/security/nuke_storage flags = BLUE_SHIELDED +/area/supply + flags = BLUE_SHIELDED + // Add rad shielding to maintenance and construction sites /area/vacant flags = RAD_SHIELDED diff --git a/code/modules/vore/fluffstuff/guns/bsharpoon.dm b/code/modules/vore/fluffstuff/guns/bsharpoon.dm index 259ef32b52..f573cf017a 100644 --- a/code/modules/vore/fluffstuff/guns/bsharpoon.dm +++ b/code/modules/vore/fluffstuff/guns/bsharpoon.dm @@ -33,13 +33,16 @@ playsound(user, 'sound/weapons/wave.ogg', 60, 1) return var/turf/T = get_turf(A) - if(!T || T.check_density()) + if(!T || (T.check_density() && mode == 1)) to_chat(user,"That's a little too solid to harpoon into!") return var/turf/ownturf = get_turf(src) if(ownturf.z != T.z || get_dist(T,ownturf) > world.view) to_chat(user, "The target is out of range!") return + if(get_area(A).flags & BLUE_SHIELDED) + to_chat(user, "The target area protected by bluespace shielding!") + return last_fire = current_fire playsound(user, 'sound/weapons/wave.ogg', 60, 1) From 879659d5fd5ed42ad39471967c11cb8287724d77 Mon Sep 17 00:00:00 2001 From: Heroman Date: Mon, 8 Apr 2019 16:34:59 +1000 Subject: [PATCH 027/141] Lowers respawn timer back to 1 minute --- code/modules/mob/mob.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index a6965a7f16..d13533a758 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -373,8 +373,8 @@ var/deathtimeseconds = round((deathtime - deathtimeminutes * 600) / 10,1) to_chat(usr, "You have been dead for[pluralcheck] [deathtimeseconds] seconds.") - if ((deathtime < (5 * 600)) && (ticker && ticker.current_state > GAME_STATE_PREGAME)) - to_chat(usr, "You must wait 5 minutes to respawn!") + if ((deathtime < (1 * 600)) && (ticker && ticker.current_state > GAME_STATE_PREGAME)) //VOREStation Edit: lower respawn timer + to_chat(usr, "You must wait 1 minute to respawn!") return else to_chat(usr, "You can respawn now, enjoy your new life!") @@ -716,7 +716,7 @@ if(statpanel("Tickets")) GLOB.ahelp_tickets.stat_entry() - + if(length(GLOB.sdql2_queries)) if(statpanel("SDQL2")) From 59f369c3ef506a1b21df85bb148b1ebd0248fdde Mon Sep 17 00:00:00 2001 From: Heroman Date: Mon, 8 Apr 2019 17:10:28 +1000 Subject: [PATCH 028/141] Prevents translocator beacons from being sent away --- code/controllers/Processes/supply.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/controllers/Processes/supply.dm b/code/controllers/Processes/supply.dm index 781e285371..d4c2d71ad3 100644 --- a/code/controllers/Processes/supply.dm +++ b/code/controllers/Processes/supply.dm @@ -78,6 +78,8 @@ var/datum/controller/supply/supply_controller = new() return 1 if(istype(A,/obj/item/device/radio/beacon)) return 1 + if(istype(A,/obj/item/device/perfect_tele_beacon)) //VOREStation Addition: Translocator beacons + return 1 //VOREStation Addition: Translocator beacons for(var/atom/B in A.contents) if(.(B)) From e05deb65660f9b7fd95d9985995ea282971dda3e Mon Sep 17 00:00:00 2001 From: Heroman Date: Mon, 8 Apr 2019 18:42:29 +1000 Subject: [PATCH 029/141] Fixes ability to telenom via command teleporter --- code/datums/helper_datums/teleport.dm | 27 ++++++++++++++++++++---- code/datums/helper_datums/teleport_vr.dm | 9 ++------ 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index d2f99a347b..541ba77194 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -188,9 +188,28 @@ return 0 */ //VOREStation Removal End //VOREStation Edit Start - if(!local || (destination.z in using_map.player_levels)) //VOREStation Edit + var/obstructed = 0 + var/turf/dest_turf = get_turf(destination) + if(local && !(dest_turf.z in using_map.player_levels)) + if(istype(teleatom, /mob/living)) + to_chat(teleatom, "The portal refuses to carry you that far away!") + return 0 + else if(istype(destination.loc, /obj/belly)) + var/obj/belly/destination_belly = destination.loc + var/mob/living/telenommer = destination_belly.owner + if(istype(telenommer)) + if(!isliving(teleatom)) + return 1 + else + var/mob/living/telemob = teleatom + if(telemob.can_be_drop_prey && telenommer.can_be_drop_pred) + return 1 + obstructed = 1 + else if(!isturf(destination.loc) || !destination.x || !destination.y || !destination.z) //If we're inside something or outside universe + obstructed = 1 + to_chat(teleatom, "Something is blocking way on the other side!") + if(obstructed) + return 0 + else return 1 - if(istype(teleatom, /mob/living)) - to_chat(teleatom, "The portal refuses to carry you that far away!") - return 0 //VOREStation Edit End \ No newline at end of file diff --git a/code/datums/helper_datums/teleport_vr.dm b/code/datums/helper_datums/teleport_vr.dm index eba2570c18..4075bc70f0 100644 --- a/code/datums/helper_datums/teleport_vr.dm +++ b/code/datums/helper_datums/teleport_vr.dm @@ -1,12 +1,8 @@ /datum/teleport/proc/try_televore() //Destination is in a belly - if(isbelly(destination.loc) && isliving(teleatom)) - var/mob/living/L = teleatom + if(isbelly(destination.loc)) var/obj/belly/B = destination.loc - - if(!L.can_be_drop_prey) //Overloading this as a pref for 'want to be unexpectedly eaten' - return FALSE - + teleatom.forceMove(get_turf(B)) //So we can splash the sound and sparks and everything. playSpecials(destination,effectout,soundout) teleatom.forceMove(B) @@ -14,4 +10,3 @@ //No fun! return FALSE - \ No newline at end of file From ea1a6cfcf8c54bd703de70a6bdc384950030dd51 Mon Sep 17 00:00:00 2001 From: Heroman Date: Mon, 8 Apr 2019 20:27:00 +1000 Subject: [PATCH 030/141] Fixes command teleporter sprites --- code/game/machinery/teleporter.dm | 2 +- icons/obj/stationobjs_vr.dmi | Bin 37240 -> 37242 bytes maps/tether/tether-05-station1.dmm | 8 ++++++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 1d3556b45e..302823c82d 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -14,7 +14,7 @@ id = "[rand(1000, 9999)]" ..() underlays.Cut() - underlays += image('icons/obj/stationobjs.dmi', icon_state = "telecomp-wires") + underlays += image('icons/obj/stationobjs_vr.dmi', icon_state = "telecomp-wires") //VOREStation Edit: different direction for wires to account for dirs return /obj/machinery/computer/teleporter/Initialize() diff --git a/icons/obj/stationobjs_vr.dmi b/icons/obj/stationobjs_vr.dmi index 758a46b706c507deab804d92a909b19157cceb1a..799f1066613681a83b8d278662bbdbd888d7979b 100644 GIT binary patch delta 16041 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 WUrqG0Po4sxAN6}$cMDa`0{=g{PCBOm delta 16022 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 I3pS7cA2G%XMF0Q* diff --git a/maps/tether/tether-05-station1.dmm b/maps/tether/tether-05-station1.dmm index 98879a511b..2ae90f8ab0 100644 --- a/maps/tether/tether-05-station1.dmm +++ b/maps/tether/tether-05-station1.dmm @@ -12398,7 +12398,9 @@ /turf/simulated/floor/tiled/dark, /area/engineering/engineering_airlock) "aHU" = ( -/obj/machinery/teleport/station, +/obj/machinery/teleport/station{ + dir = 2 + }, /turf/simulated/floor/tiled/dark, /area/teleporter) "aHW" = ( @@ -12477,7 +12479,9 @@ /turf/simulated/floor/tiled, /area/engineering/hallway) "aIj" = ( -/obj/machinery/teleport/hub, +/obj/machinery/teleport/hub{ + dir = 2 + }, /turf/simulated/floor/tiled/dark, /area/teleporter) "aIl" = ( From 141f7e649a557ac168fc4a017fd18573df5a4413 Mon Sep 17 00:00:00 2001 From: Heroman Date: Mon, 8 Apr 2019 20:42:59 +1000 Subject: [PATCH 031/141] Fixes non-mob mobs being able to use portals --- code/game/objects/effects/portals.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index dc4bf5146a..7dc82a0ffb 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -13,18 +13,24 @@ GLOBAL_LIST_BOILERPLATE(all_portals, /obj/effect/portal) anchored = 1.0 /obj/effect/portal/Bumped(mob/M as mob|obj) + if(istype(M,/mob) && !(istype(M,/mob/living))) + return //do not send ghosts, zshadows, ai eyes, etc spawn(0) src.teleport(M) return return /obj/effect/portal/Crossed(AM as mob|obj) + if(istype(AM,/mob) && !(istype(AM,/mob/living))) + return //do not send ghosts, zshadows, ai eyes, etc spawn(0) src.teleport(AM) return return /obj/effect/portal/attack_hand(mob/user as mob) + if(istype(user) && !(istype(user,/mob/living))) + return //do not send ghosts, zshadows, ai eyes, etc spawn(0) src.teleport(user) return From fd4dc97a8b03b9d6a0ce086ffb2cd030b246d46f Mon Sep 17 00:00:00 2001 From: Neerti Date: Mon, 8 Apr 2019 12:01:02 -0400 Subject: [PATCH 035/141] Merge pull request #6048 from Heroman3003/promcore-decay-fix Fixes promethean cores decaying pointlessly --- code/modules/organs/internal/brain.dm | 1 + code/modules/organs/organ.dm | 37 ++++++++++++++------------- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/code/modules/organs/internal/brain.dm b/code/modules/organs/internal/brain.dm index 2003abe04f..529114fc74 100644 --- a/code/modules/organs/internal/brain.dm +++ b/code/modules/organs/internal/brain.dm @@ -152,6 +152,7 @@ GLOBAL_LIST_BOILERPLATE(all_brain_organs, /obj/item/organ/internal/brain) name = "slime core" desc = "A complex, organic knot of jelly and crystalline particles." icon_state = "core" + decays = FALSE parent_organ = BP_TORSO clone_source = TRUE flags = OPENCONTAINER diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index bee4f385f9..c14fac25ba 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -6,30 +6,31 @@ var/list/organ_cache = list() germ_level = 0 // Strings. - var/organ_tag = "organ" // Unique identifier. - var/parent_organ = BP_TORSO // Organ holding this object. + var/organ_tag = "organ" // Unique identifier. + var/parent_organ = BP_TORSO // Organ holding this object. // Status tracking. - var/status = 0 // Various status flags - var/vital // Lose a vital limb, die immediately. - var/damage = 0 // Current damage to the organ + var/status = 0 // Various status flags + var/vital // Lose a vital limb, die immediately. + var/damage = 0 // Current damage to the organ var/robotic = 0 // Reference data. - var/mob/living/carbon/human/owner // Current mob owning the organ. - var/list/transplant_data // Transplant match data. - var/list/autopsy_data = list() // Trauma data for forensics. - var/list/trace_chemicals = list() // Traces of chemicals in the organ. - var/datum/dna/dna // Original DNA. - var/datum/species/species // Original species. + var/mob/living/carbon/human/owner // Current mob owning the organ. + var/list/transplant_data // Transplant match data. + var/list/autopsy_data = list() // Trauma data for forensics. + var/list/trace_chemicals = list() // Traces of chemicals in the organ. + var/datum/dna/dna // Original DNA. + var/datum/species/species // Original species. // Damage vars. - var/min_bruised_damage = 10 // Damage before considered bruised - var/min_broken_damage = 30 // Damage before becoming broken - var/max_damage // Damage cap - var/can_reject = 1 // Can this organ reject? - var/rejecting // Is this organ already being rejected? - var/preserved = 0 // If this is 1, prevents organ decay. + var/min_bruised_damage = 10 // Damage before considered bruised + var/min_broken_damage = 30 // Damage before becoming broken + var/max_damage // Damage cap + var/can_reject = 1 // Can this organ reject? + var/rejecting // Is this organ already being rejected? + var/decays = TRUE // Can this organ decay at all? + var/preserved = 0 // If this is 1, prevents organ decay. // Language vars. Putting them here in case we decide to do something crazy with sign-or-other-nonverbal languages. var/list/will_assist_languages = list() @@ -135,7 +136,7 @@ var/list/organ_cache = list() if(B && prob(40)) reagents.remove_reagent("blood",0.1) blood_splatter(src,B,1) - if(config.organs_decay) damage += rand(1,3) + if(config.organs_decay && decays) damage += rand(1,3) if(damage >= max_damage) damage = max_damage adjust_germ_level(rand(2,6)) From 5e9ac3f00d2f87825960e6ecc569aca47f176c3b Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 8 Apr 2019 14:07:24 -0400 Subject: [PATCH 037/141] Rosettes, radiopack sprites - Adds Rosettes and Colorable Rosettes - Adds on mob sprite for the subspace radio --- .../objects/items/devices/radio/radio_vr.dm | 3 ++- .../mob/new_player/sprite_accessories_vr.dm | 6 ++---- icons/mob/back_vr.dmi | Bin 18085 -> 18766 bytes icons/mob/human_races/markings_vr.dmi | Bin 60481 -> 60608 bytes 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/code/game/objects/items/devices/radio/radio_vr.dm b/code/game/objects/items/devices/radio/radio_vr.dm index d3681423f3..7e00c83c97 100644 --- a/code/game/objects/items/devices/radio/radio_vr.dm +++ b/code/game/objects/items/devices/radio/radio_vr.dm @@ -22,8 +22,9 @@ name = "subspace radio" desc = "A powerful new radio recently gifted to Nanotrasen from KHI, this communications device has the ability to send and recieve transmissions from anywhere." icon = 'icons/vore/custom_items_vr.dmi' + icon_override = 'icons/mob/back_vr.dmi' icon_state = "radiopack" - item_state = "parachute" + item_state = "radiopack" slot_flags = SLOT_BACK force = 5 throwforce = 6 diff --git a/code/modules/mob/new_player/sprite_accessories_vr.dm b/code/modules/mob/new_player/sprite_accessories_vr.dm index 3335e15db5..39568bf69c 100644 --- a/code/modules/mob/new_player/sprite_accessories_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_vr.dm @@ -1049,19 +1049,17 @@ color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) - /* rosette name = "Rosettes" icon_state = "rosette" color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) rosette_color name = "Rosettes (Colorable)" icon_state = "rosette_color" color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) - */ + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) heterochromia name = "Heterochromia" diff --git a/icons/mob/back_vr.dmi b/icons/mob/back_vr.dmi index 84aec25ab3c4a53858688c8b68506f62211d7d32..190ad99d3f20de4bdf1cc1bcef29d87a00b27e71 100644 GIT binary patch literal 18766 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 E4~d~UKmY&$ diff --git a/icons/mob/human_races/markings_vr.dmi b/icons/mob/human_races/markings_vr.dmi index e52265d69bd8f3ab21a69ab7a4def8ea975c929f..00089f2af93e8df520f222a6efd1a0c011d7b9b6 100644 GIT binary patch literal 60608 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 literal 60481 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 From 466516b066cf9e64e90d1f4109f0f41cd4b5fe28 Mon Sep 17 00:00:00 2001 From: Novacat <35587478+Novacat@users.noreply.github.com> Date: Mon, 8 Apr 2019 15:24:27 -0400 Subject: [PATCH 040/141] Revert "Un-kevinzes nanoui and chemistry subsystems back into processes for greater good" --- .../binary_devices/algae_generator_vr.dm | 2 +- .../components/binary_devices/passive_gate.dm | 2 +- .../components/binary_devices/pump.dm | 2 +- .../components/omni_devices/filter.dm | 4 +- .../components/omni_devices/mixer.dm | 4 +- .../components/unary/cold_sink.dm | 2 +- .../components/unary/heat_source.dm | 2 +- code/_helpers/global_lists.dm | 2 - code/controllers/Processes/chemistry.dm | 33 ----------- code/controllers/Processes/nanoui.dm | 19 ------- code/controllers/subsystems/nanoui.dm | 42 ++++++++++++++ .../subsystems/processing/chemistry.dm | 43 ++++++++++++++ code/controllers/verbs.dm | 2 - code/datums/datum.dm | 2 +- code/datums/mind.dm | 2 +- code/datums/wires/radio.dm | 4 +- code/game/dna/dna_modifier.dm | 12 ++-- code/game/machinery/Sleeper.dm | 2 +- code/game/machinery/adv_med.dm | 2 +- code/game/machinery/alarm.dm | 2 +- code/game/machinery/atmo_control.dm | 8 +-- code/game/machinery/atmoalter/canister.dm | 4 +- code/game/machinery/atmoalter/pump.dm | 2 +- code/game/machinery/atmoalter/scrubber.dm | 4 +- code/game/machinery/computer/Operating.dm | 4 +- code/game/machinery/computer/arcade.dm | 4 +- code/game/machinery/computer/atmos_alert.dm | 2 +- code/game/machinery/computer/camera.dm | 4 +- code/game/machinery/computer/card.dm | 10 ++-- code/game/machinery/computer/cloning.dm | 4 +- code/game/machinery/computer/guestpass.dm | 6 +- code/game/machinery/computer/robot.dm | 2 +- code/game/machinery/computer/supply.dm | 2 +- code/game/machinery/computer/timeclock_vr.dm | 4 +- code/game/machinery/computer3/lapvend.dm | 10 ++-- code/game/machinery/cryo.dm | 4 +- code/game/machinery/doors/airlock.dm | 2 +- .../airlock_controllers.dm | 6 +- .../airlock_docking_controller.dm | 2 +- .../airlock_docking_controller_multi.dm | 4 +- .../simple_docking_controller.dm | 2 +- code/game/machinery/exonet_node.dm | 4 +- code/game/machinery/jukebox.dm | 2 +- code/game/machinery/oxygen_pump.dm | 2 +- code/game/machinery/partslathe_vr.dm | 2 +- code/game/machinery/portable_turret.dm | 2 +- code/game/machinery/requests_console.dm | 2 +- code/game/machinery/turret_control.dm | 2 +- code/game/machinery/vending.dm | 16 +++--- code/game/mecha/mech_fabricator.dm | 2 +- code/game/mecha/mech_prosthetics.dm | 2 +- code/game/objects/items/devices/PDA/PDA.dm | 16 +++--- code/game/objects/items/devices/aicard.dm | 2 +- .../objects/items/devices/communicator/UI.dm | 6 +- .../devices/communicator/communicator.dm | 2 +- .../game/objects/items/devices/radio/radio.dm | 8 +-- .../objects/items/devices/transfer_valve.dm | 6 +- code/game/objects/items/devices/uplink.dm | 6 +- .../items/weapons/id cards/syndicate_ids.dm | 4 +- .../game/objects/items/weapons/tanks/tanks.dm | 2 +- code/game/objects/structures/janicart.dm | 2 +- code/global_init.dm | 2 - code/modules/admin/view_variables/topic.dm | 2 +- code/modules/client/client procs.dm | 4 +- code/modules/clothing/glasses/hud_vr.dm | 2 +- code/modules/clothing/spacesuits/rig/rig.dm | 2 +- .../detectivework/microscope/dnascanner.dm | 2 +- code/modules/economy/Accounts_DB.dm | 6 +- code/modules/events/supply_demand.dm | 4 +- code/modules/food/kitchen/smartfridge.dm | 10 ++-- code/modules/food/recipe_dump.dm | 4 +- code/modules/holodeck/HolodeckControl.dm | 4 +- code/modules/hydroponics/seed.dm | 2 +- code/modules/hydroponics/seed_machines.dm | 4 +- code/modules/mob/living/silicon/pai/pai.dm | 2 +- .../mob/living/silicon/pai/software.dm | 2 +- .../living/silicon/pai/software_modules.dm | 18 +++--- .../silicon/robot/dogborg/dog_sleeper_vr.dm | 6 +- code/modules/mob/logout.dm | 2 +- code/modules/nano/interaction/remote.dm | 2 +- code/modules/nano/modules/alarm_monitor.dm | 2 +- code/modules/nano/modules/atmos_control.dm | 2 +- code/modules/nano/modules/crew_monitor.dm | 2 +- code/modules/nano/modules/human_appearance.dm | 2 +- code/modules/nano/modules/law_manager.dm | 2 +- code/modules/nano/modules/power_monitor.dm | 2 +- code/modules/nano/modules/rcon.dm | 2 +- code/modules/nano/nanomanager.dm | 57 ++++--------------- code/modules/nano/nanoui.dm | 6 +- code/modules/nifsoft/nif_softshop.dm | 6 +- .../overmap/ships/computers/engine_control.dm | 2 +- code/modules/overmap/ships/computers/helm.dm | 2 +- .../overmap/ships/computers/shuttle.dm | 2 +- code/modules/paperwork/faxmachine.dm | 4 +- code/modules/paperwork/photocopier.dm | 4 +- code/modules/power/apc.dm | 2 +- code/modules/power/generator.dm | 2 +- code/modules/power/port_gen.dm | 2 +- code/modules/power/smes.dm | 2 +- code/modules/power/supermatter/supermatter.dm | 2 +- code/modules/power/turbine.dm | 2 +- code/modules/reagents/Chemistry-Holder.dm | 29 +++++----- code/modules/reagents/Chemistry-Machinery.dm | 4 +- code/modules/reagents/Chemistry-Reagents.dm | 9 --- code/modules/reagents/Chemistry-Recipes.dm | 19 ------- code/modules/reagents/dispenser/cartridge.dm | 2 +- .../reagents/dispenser/cartridge_spawn.dm | 4 +- code/modules/reagents/dispenser/dispenser2.dm | 8 +-- .../reagents/dispenser/dispenser2_energy.dm | 4 +- .../reagents/reagent_containers/borghydro.dm | 6 +- code/modules/resleeving/computers.dm | 4 +- code/modules/resleeving/designer.dm | 2 +- code/modules/resleeving/infomorph.dm | 4 +- code/modules/resleeving/infomorph_software.dm | 12 ++-- code/modules/rogueminer_vr/zone_console.dm | 4 +- code/modules/shuttles/escape_pods.dm | 4 +- code/modules/shuttles/shuttle_console.dm | 2 +- code/modules/shuttles/shuttle_emergency.dm | 2 +- code/modules/shuttles/shuttles_web.dm | 2 +- code/modules/telesci/telesci_computer.dm | 2 +- code/modules/virus2/centrifuge.dm | 10 ++-- code/modules/virus2/diseasesplicer.dm | 10 ++-- code/modules/virus2/dishincubator.dm | 22 +++---- code/modules/virus2/effect.dm | 2 +- code/modules/virus2/isolator.dm | 8 +-- .../tools/geosample_scanner.dm | 2 +- code/unit_tests/research_tests.dm | 2 +- maps/tether/tether_phoronlock.dm | 2 +- vorestation.dme | 4 +- 129 files changed, 350 insertions(+), 389 deletions(-) delete mode 100644 code/controllers/Processes/chemistry.dm delete mode 100644 code/controllers/Processes/nanoui.dm create mode 100644 code/controllers/subsystems/nanoui.dm create mode 100644 code/controllers/subsystems/processing/chemistry.dm diff --git a/code/ATMOSPHERICS/components/binary_devices/algae_generator_vr.dm b/code/ATMOSPHERICS/components/binary_devices/algae_generator_vr.dm index 454d04ff44..391f10bc6e 100644 --- a/code/ATMOSPHERICS/components/binary_devices/algae_generator_vr.dm +++ b/code/ATMOSPHERICS/components/binary_devices/algae_generator_vr.dm @@ -200,7 +200,7 @@ "moles" = round(air2.gas[output_gas], 0.01)) // update the ui if it exists, returns null if no ui is passed/found - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "algae_farm_vr.tmpl", "Algae Farm Control Panel", 500, 600) ui.set_initial_data(data) diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm index accedb543d..5abaa00c60 100644 --- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm +++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm @@ -197,7 +197,7 @@ ) // update the ui if it exists, returns null if no ui is passed/found - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) // the ui does not exist, so we'll create a new() one // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm index cacdf5240b..1f1c4ff1ae 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm @@ -140,7 +140,7 @@ Thus, the two variables affect pump operation are set in New(): ) // update the ui if it exists, returns null if no ui is passed/found - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) // the ui does not exist, so we'll create a new() one // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm diff --git a/code/ATMOSPHERICS/components/omni_devices/filter.dm b/code/ATMOSPHERICS/components/omni_devices/filter.dm index 428f37fcfa..6fbd91f861 100644 --- a/code/ATMOSPHERICS/components/omni_devices/filter.dm +++ b/code/ATMOSPHERICS/components/omni_devices/filter.dm @@ -93,7 +93,7 @@ data = build_uidata() - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "omni_filter.tmpl", "Omni Filter Control", 330, 330) @@ -181,7 +181,7 @@ switch_filter(dir_flag(href_list["dir"]), mode_return_switch(new_filter)) update_icon() - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) return /obj/machinery/atmospherics/omni/atmos_filter/proc/mode_return_switch(var/mode) diff --git a/code/ATMOSPHERICS/components/omni_devices/mixer.dm b/code/ATMOSPHERICS/components/omni_devices/mixer.dm index fc00be6ba4..47c78427f0 100644 --- a/code/ATMOSPHERICS/components/omni_devices/mixer.dm +++ b/code/ATMOSPHERICS/components/omni_devices/mixer.dm @@ -131,7 +131,7 @@ data = build_uidata() - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "omni_mixer.tmpl", "Omni Mixer Control", 360, 330) @@ -200,7 +200,7 @@ con_lock(dir_flag(href_list["dir"])) update_icon() - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) return /obj/machinery/atmospherics/omni/mixer/proc/switch_mode(var/port = NORTH, var/mode = ATM_NONE) diff --git a/code/ATMOSPHERICS/components/unary/cold_sink.dm b/code/ATMOSPHERICS/components/unary/cold_sink.dm index 8ff0aa7479..d4bfb73311 100644 --- a/code/ATMOSPHERICS/components/unary/cold_sink.dm +++ b/code/ATMOSPHERICS/components/unary/cold_sink.dm @@ -83,7 +83,7 @@ data["gasTemperatureClass"] = temp_class // update the ui if it exists, returns null if no ui is passed/found - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) // the ui does not exist, so we'll create a new() one // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm diff --git a/code/ATMOSPHERICS/components/unary/heat_source.dm b/code/ATMOSPHERICS/components/unary/heat_source.dm index 69e638bc22..9729e1d387 100644 --- a/code/ATMOSPHERICS/components/unary/heat_source.dm +++ b/code/ATMOSPHERICS/components/unary/heat_source.dm @@ -103,7 +103,7 @@ data["gasTemperatureClass"] = temp_class // update the ui if it exists, returns null if no ui is passed/found - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) // the ui does not exist, so we'll create a new() one // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm index 057e468bb4..a3687b9b99 100644 --- a/code/_helpers/global_lists.dm +++ b/code/_helpers/global_lists.dm @@ -13,8 +13,6 @@ var/global/list/dead_mob_list = list() //List of all dead mobs, including cli var/global/list/listening_objects = list() //List of all objects which care about receiving messages (communicators, radios, etc) var/global/list/cable_list = list() //Index for all cables, so that powernets don't have to look through the entire world all the time -var/global/list/chemical_reactions_list //list of all /datum/chemical_reaction datums. Used during chemical reactions -var/global/list/chemical_reagents_list //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff var/global/list/landmarks_list = list() //list of all landmarks created var/global/list/surgery_steps = list() //list of all surgery steps |BS12 var/global/list/side_effects = list() //list of all medical sideeffects types by thier names |BS12 diff --git a/code/controllers/Processes/chemistry.dm b/code/controllers/Processes/chemistry.dm deleted file mode 100644 index 89d3cc01be..0000000000 --- a/code/controllers/Processes/chemistry.dm +++ /dev/null @@ -1,33 +0,0 @@ -var/datum/controller/process/chemistry/chemistryProcess - -/datum/controller/process/chemistry - var/list/active_holders - var/list/chemical_reactions - var/list/chemical_reagents - -/datum/controller/process/chemistry/setup() - name = "chemistry" - schedule_interval = 20 // every 2 seconds - chemistryProcess = src - active_holders = list() - chemical_reactions = chemical_reactions_list - chemical_reagents = chemical_reagents_list - -/datum/controller/process/chemistry/statProcess() - ..() - stat(null, "[active_holders.len] reagent holder\s") - -/datum/controller/process/chemistry/doWork() - for(last_object in active_holders) - var/datum/reagents/holder = last_object - if(!holder.process_reactions()) - active_holders -= holder - SCHECK - -/datum/controller/process/chemistry/proc/mark_for_update(var/datum/reagents/holder) - if(holder in active_holders) - return - - //Process once, right away. If we still need to continue then add to the active_holders list and continue later - if(holder.process_reactions()) - active_holders += holder \ No newline at end of file diff --git a/code/controllers/Processes/nanoui.dm b/code/controllers/Processes/nanoui.dm deleted file mode 100644 index 0f720600bc..0000000000 --- a/code/controllers/Processes/nanoui.dm +++ /dev/null @@ -1,19 +0,0 @@ -/datum/controller/process/nanoui/setup() - name = "nanoui" - schedule_interval = 20 // every 2 seconds - -/datum/controller/process/nanoui/statProcess() - ..() - stat(null, "[GLOB.nanomanager.processing_uis.len] UIs") - -/datum/controller/process/nanoui/doWork() - for(last_object in GLOB.nanomanager.processing_uis) - var/datum/nanoui/NUI = last_object - if(istype(NUI) && !QDELETED(NUI)) - try - NUI.process() - catch(var/exception/e) - catchException(e, NUI) - else - catchBadType(NUI) - GLOB.nanomanager.processing_uis -= NUI \ No newline at end of file diff --git a/code/controllers/subsystems/nanoui.dm b/code/controllers/subsystems/nanoui.dm new file mode 100644 index 0000000000..c31449addc --- /dev/null +++ b/code/controllers/subsystems/nanoui.dm @@ -0,0 +1,42 @@ +SUBSYSTEM_DEF(nanoui) + name = "NanoUI" + wait = 20 + // a list of current open /nanoui UIs, grouped by src_object and ui_key + var/list/open_uis = list() + // a list of current open /nanoui UIs, not grouped, for use in processing + var/list/processing_uis = list() + // a list of asset filenames which are to be sent to the client on user logon + var/list/asset_files = list() + +/datum/controller/subsystem/nanoui/Initialize() + var/list/nano_asset_dirs = list(\ + "nano/css/",\ + "nano/images/",\ + "nano/js/",\ + "nano/templates/"\ + ) + + var/list/filenames = null + for (var/path in nano_asset_dirs) + filenames = flist(path) + for(var/filename in filenames) + if(copytext(filename, length(filename)) != "/") // filenames which end in "/" are actually directories, which we want to ignore + if(fexists(path + filename)) + asset_files.Add(fcopy_rsc(path + filename)) // add this file to asset_files for sending to clients when they connect + return ..() + +/datum/controller/subsystem/nanoui/Recover() + if(SSnanoui.open_uis) + open_uis |= SSnanoui.open_uis + if(SSnanoui.processing_uis) + processing_uis |= SSnanoui.processing_uis + if(SSnanoui.asset_files) + asset_files |= SSnanoui.asset_files + +/datum/controller/subsystem/nanoui/stat_entry() + return ..("[processing_uis.len] UIs") + +/datum/controller/subsystem/nanoui/fire(resumed) + for(var/thing in processing_uis) + var/datum/nanoui/UI = thing + UI.process() diff --git a/code/controllers/subsystems/processing/chemistry.dm b/code/controllers/subsystems/processing/chemistry.dm new file mode 100644 index 0000000000..67b74d3ab6 --- /dev/null +++ b/code/controllers/subsystems/processing/chemistry.dm @@ -0,0 +1,43 @@ +PROCESSING_SUBSYSTEM_DEF(chemistry) + name = "Chemistry" + wait = 20 + flags = SS_BACKGROUND|SS_POST_FIRE_TIMING + init_order = INIT_ORDER_CHEMISTRY + var/list/chemical_reactions = list() + var/list/chemical_reagents = list() + +/datum/controller/subsystem/processing/chemistry/Recover() + chemical_reactions = SSchemistry.chemical_reactions + chemical_reagents = SSchemistry.chemical_reagents + +/datum/controller/subsystem/processing/chemistry/Initialize() + initialize_chemical_reactions() + initialize_chemical_reagents() + +//Chemical Reactions - Initialises all /datum/chemical_reaction into a list +// It is filtered into multiple lists within a list. +// For example: +// chemical_reaction_list["phoron"] is a list of all reactions relating to phoron +// Note that entries in the list are NOT duplicated. So if a reaction pertains to +// more than one chemical it will still only appear in only one of the sublists. +/datum/controller/subsystem/processing/chemistry/proc/initialize_chemical_reactions() + var/paths = typesof(/datum/chemical_reaction) - /datum/chemical_reaction + SSchemistry.chemical_reactions = list() + + for(var/path in paths) + var/datum/chemical_reaction/D = new path() + if(D.required_reagents && D.required_reagents.len) + var/reagent_id = D.required_reagents[1] + if(!chemical_reactions[reagent_id]) + chemical_reactions[reagent_id] = list() + chemical_reactions[reagent_id] += D + +//Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id +/datum/controller/subsystem/processing/chemistry/proc/initialize_chemical_reagents() + var/paths = typesof(/datum/reagent) - /datum/reagent + chemical_reagents = list() + for(var/path in paths) + var/datum/reagent/D = new path() + if(!D.name) + continue + chemical_reagents[D.id] = D diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm index 4153900657..7e2e1a42e3 100644 --- a/code/controllers/verbs.dm +++ b/code/controllers/verbs.dm @@ -102,8 +102,6 @@ options["LEGACY: gas_data"] = gas_data options["LEGACY: plant_controller"] = plant_controller options["LEGACY: alarm_manager"] = alarm_manager - options["LEGACY: nanomanager"] = GLOB.nanomanager - options["LEGACY: chemistryProcess"] = chemistryProcess var/pick = input(mob, "Choose a controller to debug/view variables of.", "VV controller:") as null|anything in options if(!pick) diff --git a/code/datums/datum.dm b/code/datums/datum.dm index 2ec99d81d4..61eb4c6953 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -31,5 +31,5 @@ weakref = null // Clear this reference to ensure it's kept for as brief duration as possible. tag = null - GLOB.nanomanager.close_uis(src) + SSnanoui.close_uis(src) return QDEL_HINT_QUEUE diff --git a/code/datums/mind.dm b/code/datums/mind.dm index fdca613460..67cf23a3cb 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -85,7 +85,7 @@ current.verbs -= /datum/changeling/proc/EvolutionMenu current.mind = null - GLOB.nanomanager.user_transferred(current, new_character) // transfer active NanoUI instances to new user + SSnanoui.user_transferred(current, new_character) // transfer active NanoUI instances to new user if(new_character.mind) //remove any mind currently in our new body's mind variable new_character.mind.current = null diff --git a/code/datums/wires/radio.dm b/code/datums/wires/radio.dm index dcd708c5f6..d059a0b091 100644 --- a/code/datums/wires/radio.dm +++ b/code/datums/wires/radio.dm @@ -24,7 +24,7 @@ var/const/WIRE_TRANSMIT = 4 if(WIRE_TRANSMIT) R.broadcasting = !R.broadcasting && !IsIndexCut(WIRE_SIGNAL) - GLOB.nanomanager.update_uis(holder) + SSnanoui.update_uis(holder) /datum/wires/radio/UpdateCut(var/index, var/mended) var/obj/item/device/radio/R = holder @@ -38,4 +38,4 @@ var/const/WIRE_TRANSMIT = 4 if(WIRE_TRANSMIT) R.broadcasting = mended && !IsIndexCut(WIRE_SIGNAL) - GLOB.nanomanager.update_uis(holder) + SSnanoui.update_uis(holder) diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index 623ccc11a3..998b712828 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -270,7 +270,7 @@ I.loc = src src.disk = I user << "You insert [I]." - GLOB.nanomanager.update_uis(src) // update all UIs attached to src + SSnanoui.update_uis(src) // update all UIs attached to src return else ..() @@ -428,7 +428,7 @@ data["beakerVolume"] += R.volume // update the ui if it exists, returns null if no ui is passed/found - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) // the ui does not exist, so we'll create a new() one // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm @@ -465,7 +465,7 @@ irradiating = src.radiation_duration var/lock_state = src.connected.locked src.connected.locked = 1//lock it - GLOB.nanomanager.update_uis(src) // update all UIs attached to src + SSnanoui.update_uis(src) // update all UIs attached to src sleep(10*src.radiation_duration) // sleep for radiation_duration seconds @@ -566,7 +566,7 @@ irradiating = src.radiation_duration var/lock_state = src.connected.locked src.connected.locked = 1//lock it - GLOB.nanomanager.update_uis(src) // update all UIs attached to src + SSnanoui.update_uis(src) // update all UIs attached to src sleep(10*src.radiation_duration) // sleep for radiation_duration seconds @@ -624,7 +624,7 @@ irradiating = src.radiation_duration var/lock_state = src.connected.locked src.connected.locked = 1 //lock it - GLOB.nanomanager.update_uis(src) // update all UIs attached to src + SSnanoui.update_uis(src) // update all UIs attached to src sleep(10*src.radiation_duration) // sleep for radiation_duration seconds @@ -751,7 +751,7 @@ irradiating = 2 var/lock_state = src.connected.locked src.connected.locked = 1//lock it - GLOB.nanomanager.update_uis(src) // update all UIs attached to src + SSnanoui.update_uis(src) // update all UIs attached to src sleep(10*2) // sleep for 2 seconds diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 49a4b342ef..57b05a8346 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -109,7 +109,7 @@ break data["stasis"] = stasis_level_name - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) ui = new(user, src, ui_key, "sleeper.tmpl", "Sleeper UI", 600, 600, state = state) ui.set_initial_data(data) diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 2062f92db4..c101202b38 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -389,7 +389,7 @@ occupantData = attempt_vr(scanner,"get_occupant_data_vr",list(occupantData,H)) //VOREStation Insert data["occupant"] = occupantData - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) ui = new(user, src, ui_key, "adv_med.tmpl", "Body Scanner", 690, 800) ui.set_initial_data(data) diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 1ce64f4aed..e74174d921 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -497,7 +497,7 @@ if(!(locked && !remote_connection) || remote_access || issilicon(user)) populate_controls(data) - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) ui = new(user, src, ui_key, "air_alarm.tmpl", name, 325, 625, master_ui = master_ui, state = state) ui.set_initial_data(data) diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm index 839470f356..c18d2b9e93 100644 --- a/code/game/machinery/atmo_control.dm +++ b/code/game/machinery/atmo_control.dm @@ -117,7 +117,7 @@ obj/machinery/computer/general_air_control/Destroy() data["sensors"] = sensors_ui - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) ui = new(user, src, ui_key, "atmo_control.tmpl", name, 525, 600) ui.set_initial_data(data) @@ -174,7 +174,7 @@ obj/machinery/computer/general_air_control/Destroy() data["input_flow_setting"] = round(input_flow_setting, 0.1) data["pressure_setting"] = pressure_setting - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) ui = new(user, src, ui_key, "atmo_control.tmpl", name, 660, 500) ui.set_initial_data(data) @@ -284,7 +284,7 @@ obj/machinery/computer/general_air_control/Destroy() data["input_flow_setting"] = round(input_flow_setting, 0.1) data["pressure_setting"] = pressure_setting - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) ui = new(user, src, ui_key, "atmo_control.tmpl", name, 650, 500) ui.set_initial_data(data) @@ -416,7 +416,7 @@ obj/machinery/computer/general_air_control/Destroy() else data["device_info"] = null - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) ui = new(user, src, ui_key, "atmo_control.tmpl", name, 650, 500) ui.set_initial_data(data) diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 21d3e81591..ed23884103 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -260,7 +260,7 @@ update_flag ..() - GLOB.nanomanager.update_uis(src) // Update all NanoUIs attached to src + SSnanoui.update_uis(src) // Update all NanoUIs attached to src /obj/machinery/portable_atmospherics/canister/attack_ai(var/mob/user as mob) return src.attack_hand(user) @@ -288,7 +288,7 @@ update_flag data["holdingTank"] = list("name" = holding.name, "tankPressure" = round(holding.air_contents.return_pressure())) // update the ui if it exists, returns null if no ui is passed/found - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) // the ui does not exist, so we'll create a new() one // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm diff --git a/code/game/machinery/atmoalter/pump.dm b/code/game/machinery/atmoalter/pump.dm index 7e2c786734..758c2a57cb 100644 --- a/code/game/machinery/atmoalter/pump.dm +++ b/code/game/machinery/atmoalter/pump.dm @@ -138,7 +138,7 @@ if (holding) data["holdingTank"] = list("name" = holding.name, "tankPressure" = round(holding.air_contents.return_pressure() > 0 ? holding.air_contents.return_pressure() : 0)) - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "portpump.tmpl", "Portable Pump", 480, 410, state = physical_state) ui.set_initial_data(data) diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm index 0a47342086..55afd7f35f 100644 --- a/code/game/machinery/atmoalter/scrubber.dm +++ b/code/game/machinery/atmoalter/scrubber.dm @@ -114,7 +114,7 @@ if (holding) data["holdingTank"] = list("name" = holding.name, "tankPressure" = round(holding.air_contents.return_pressure() > 0 ? holding.air_contents.return_pressure() : 0)) - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "portscrubber.tmpl", "Portable Scrubber", 480, 400, state = physical_state) ui.set_initial_data(data) @@ -195,7 +195,7 @@ update_use_power(new_use_power) if(!on) return - + var/power_draw = -1 var/datum/gas_mixture/environment = loc.return_air() diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm index ef1beeaac0..d81070e1f2 100644 --- a/code/game/machinery/computer/Operating.dm +++ b/code/game/machinery/computer/Operating.dm @@ -55,7 +55,7 @@ data["table"] = table data["victim"] = victim_ui - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "operating.tmpl", src.name, 380, 400) ui.set_initial_data(data) @@ -69,4 +69,4 @@ usr.set_machine(src) src.add_fingerprint(usr) - GLOB.nanomanager.update_uis(src) \ No newline at end of file + SSnanoui.update_uis(src) \ No newline at end of file diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index a1f9f227fc..00d1623e5b 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -140,7 +140,7 @@ data["enemyHP"] = enemy_hp data["gameOver"] = gameover - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "arcade_battle.tmpl", src.name, 400, 300) ui.set_initial_data(data) @@ -202,7 +202,7 @@ emagged = 0 src.add_fingerprint(usr) - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) return /obj/machinery/computer/arcade/battle/proc/arcade_action() diff --git a/code/game/machinery/computer/atmos_alert.dm b/code/game/machinery/computer/atmos_alert.dm index d757ae777d..e2b3fc4638 100644 --- a/code/game/machinery/computer/atmos_alert.dm +++ b/code/game/machinery/computer/atmos_alert.dm @@ -37,7 +37,7 @@ var/global/list/minor_air_alarms = list() data["priority_alarms"] = major_alarms data["minor_alarms"] = minor_alarms - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) ui = new(user, src, ui_key, "atmos_alert.tmpl", src.name, 500, 500) ui.set_initial_data(data) diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index c05a886046..4ac34cf157 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -49,7 +49,7 @@ switch_to_camera(user, current_camera) data["map_levels"] = using_map.get_map_levels(src.z) - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "sec_camera.tmpl", "Camera Console", 900, 800) @@ -152,7 +152,7 @@ /obj/machinery/computer/security/process() if(cache_id != camera_repository.camera_cache_id) cache_id = camera_repository.camera_cache_id - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) /obj/machinery/computer/security/proc/can_access_camera(var/obj/machinery/camera/C) var/list/shared_networks = src.network & C.network diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index 9f43bd077e..42a418c7ad 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -68,7 +68,7 @@ id_card.forceMove(src) modify = id_card - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) attack_hand(user) /obj/machinery/computer/card/attack_ai(var/mob/user as mob) @@ -139,7 +139,7 @@ data["regions"] = regions - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "identification_computer.tmpl", src.name, 600, 700) ui.set_initial_data(data) @@ -235,7 +235,7 @@ modify.registered_name = temp_name else src.visible_message("[src] buzzes rudely.") - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) if ("account") if (is_authenticated()) @@ -243,7 +243,7 @@ if ((modify == t2 && (in_range(src, usr) || (istype(usr, /mob/living/silicon))) && istype(loc, /turf))) var/account_num = text2num(href_list["account"]) modify.associated_account_number = account_num - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) if ("mode") mode = text2num(href_list["mode_target"]) @@ -253,7 +253,7 @@ printing = 1 spawn(50) printing = null - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) var/obj/item/weapon/paper/P = new(loc) if (mode) diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 44a1f69945..96e6f6b5f9 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -146,7 +146,7 @@ data["diskette"] = diskette data["temp"] = temp - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "cloning.tmpl", src.name, 400, 450) ui.set_initial_data(data) @@ -284,7 +284,7 @@ temp = "" scantemp = "" - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) add_fingerprint(usr) /obj/machinery/computer/cloning/proc/scan_mob(mob/living/carbon/human/subject as mob) diff --git a/code/game/machinery/computer/guestpass.dm b/code/game/machinery/computer/guestpass.dm index eaea426c07..a1fd7199b2 100644 --- a/code/game/machinery/computer/guestpass.dm +++ b/code/game/machinery/computer/guestpass.dm @@ -104,7 +104,7 @@ if(!giver && user.unEquip(I)) I.forceMove(src) giver = I - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) else if(giver) user << "There is already ID card inside." return @@ -150,7 +150,7 @@ data["log"] = internal_log data["uid"] = uid - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "guest_pass.tmpl", src.name, 400, 520) ui.set_initial_data(data) @@ -242,4 +242,4 @@ usr << "Cannot issue pass without issuing ID." src.add_fingerprint(usr) - GLOB.nanomanager.update_uis(src) \ No newline at end of file + SSnanoui.update_uis(src) \ No newline at end of file diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm index c6c2c94a9e..3e06e19e52 100644 --- a/code/game/machinery/computer/robot.dm +++ b/code/game/machinery/computer/robot.dm @@ -19,7 +19,7 @@ data["is_ai"] = issilicon(user) - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "robot_control.tmpl", "Robotic Control Console", 400, 500) ui.set_initial_data(data) diff --git a/code/game/machinery/computer/supply.dm b/code/game/machinery/computer/supply.dm index f4a68b12d5..6170b302a2 100644 --- a/code/game/machinery/computer/supply.dm +++ b/code/game/machinery/computer/supply.dm @@ -171,7 +171,7 @@ data["contraband"] = can_order_contraband || (authorization & SUP_CONTRABAND) // update the ui if it exists, returns null if no ui is passed/found - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) // the ui does not exist, so we'll create a new() one // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm diff --git a/code/game/machinery/computer/timeclock_vr.dm b/code/game/machinery/computer/timeclock_vr.dm index 8e49a138e3..caeecb2e27 100644 --- a/code/game/machinery/computer/timeclock_vr.dm +++ b/code/game/machinery/computer/timeclock_vr.dm @@ -48,7 +48,7 @@ if(!card && user.unEquip(I)) I.forceMove(src) card = I - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) update_icon() else if(card) to_chat(user, "There is already ID card inside.") @@ -88,7 +88,7 @@ // if(job && job.timeoff_factor < 0) // Currently are Off Duty, so gotta lookup what on-duty jobs are open // data["job_choices"] = getOpenOnDutyJobs(user, job.department) - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "timeclock_vr.tmpl", capitalize(src.name), 500, 520) ui.set_initial_data(data) diff --git a/code/game/machinery/computer3/lapvend.dm b/code/game/machinery/computer3/lapvend.dm index 79f297157c..7c4e458832 100644 --- a/code/game/machinery/computer3/lapvend.dm +++ b/code/game/machinery/computer3/lapvend.dm @@ -34,11 +34,11 @@ if(vendmode == 1 && I) scan_id(I, W) vendmode = 0 - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) if(vendmode == 2 && I) if(reimburse_id(I, W)) vendmode = 0 - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) if(vendmode == 0) if(istype(W, /obj/item/device/laptop)) var/obj/item/device/laptop/L = W @@ -48,7 +48,7 @@ L.loc = src vendmode = 2 to_chat(user, "You slot your [L.name] into \The [src.name]") - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) else ..() @@ -77,7 +77,7 @@ data["power"] = power data["total"] = total() - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "laptop_vendor.tmpl", src.name, 480, 425) ui.set_initial_data(data) @@ -136,7 +136,7 @@ vendmode = 0 src.add_fingerprint(usr) - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) /obj/machinery/lapvend/proc/vend() if(cardreader > 0) diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index 31942366a9..b4927f441c 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -141,7 +141,7 @@ data["beakerVolume"] += R.volume // update the ui if it exists, returns null if no ui is passed/found - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) // the ui does not exist, so we'll create a new() one // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm @@ -205,7 +205,7 @@ var/mob/M = grab.affecting qdel(grab) put_mob(M) - + return /obj/machinery/atmospherics/unary/cryo_cell/MouseDrop_T(var/mob/target, var/mob/user) //Allows borgs to put people into cryo without external assistance diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 0dff930291..c31c8f650b 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -746,7 +746,7 @@ About the new airlock wires panel: data["commands"] = commands - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "door_control.tmpl", "Door Controls", 450, 350, state = state) ui.set_initial_data(data) diff --git a/code/game/machinery/embedded_controller/airlock_controllers.dm b/code/game/machinery/embedded_controller/airlock_controllers.dm index 11893fa5ca..0f8b797289 100644 --- a/code/game/machinery/embedded_controller/airlock_controllers.dm +++ b/code/game/machinery/embedded_controller/airlock_controllers.dm @@ -33,7 +33,7 @@ "secure" = program.memory["secure"] ) - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "advanced_airlock_console.tmpl", name, 470, 290) @@ -89,7 +89,7 @@ "processing" = program.memory["processing"], ) - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "simple_airlock_console.tmpl", name, 470, 290) @@ -153,7 +153,7 @@ "processing" = program.memory["processing"] ) - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "door_access_console.tmpl", name, 330, 220) diff --git a/code/game/machinery/embedded_controller/airlock_docking_controller.dm b/code/game/machinery/embedded_controller/airlock_docking_controller.dm index fa7d5dfa04..e88b046c10 100644 --- a/code/game/machinery/embedded_controller/airlock_docking_controller.dm +++ b/code/game/machinery/embedded_controller/airlock_docking_controller.dm @@ -24,7 +24,7 @@ "override_enabled" = docking_program.override_enabled, ) - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "docking_airlock_console.tmpl", name, 470, 290) diff --git a/code/game/machinery/embedded_controller/airlock_docking_controller_multi.dm b/code/game/machinery/embedded_controller/airlock_docking_controller_multi.dm index bdce39de14..5614d0be63 100644 --- a/code/game/machinery/embedded_controller/airlock_docking_controller_multi.dm +++ b/code/game/machinery/embedded_controller/airlock_docking_controller_multi.dm @@ -35,7 +35,7 @@ "airlocks" = airlocks, ) - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "multi_docking_console.tmpl", name, 470, 290) @@ -73,7 +73,7 @@ "override_enabled" = airlock_program.override_enabled, ) - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "docking_airlock_console.tmpl", name, 470, 290) diff --git a/code/game/machinery/embedded_controller/simple_docking_controller.dm b/code/game/machinery/embedded_controller/simple_docking_controller.dm index 8e5c941bbf..14b27b2512 100644 --- a/code/game/machinery/embedded_controller/simple_docking_controller.dm +++ b/code/game/machinery/embedded_controller/simple_docking_controller.dm @@ -19,7 +19,7 @@ "door_lock" = docking_program.memory["door_status"]["lock"], ) - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "simple_docking_console.tmpl", name, 470, 290) diff --git a/code/game/machinery/exonet_node.dm b/code/game/machinery/exonet_node.dm index fee3fbd0ec..fbfbc04abf 100644 --- a/code/game/machinery/exonet_node.dm +++ b/code/game/machinery/exonet_node.dm @@ -123,7 +123,7 @@ // update the ui if it exists, returns null if no ui is passed/found - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) // the ui does not exist, so we'll create a new() one // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm @@ -167,7 +167,7 @@ log_game(msg) update_icon() - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) add_fingerprint(usr) // Proc: get_exonet_node() diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm index b952f678bb..475f22a7d7 100644 --- a/code/game/machinery/jukebox.dm +++ b/code/game/machinery/jukebox.dm @@ -265,7 +265,7 @@ data["tracks"] = nano_tracks // update the ui if it exists, returns null if no ui is passed/found - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "jukebox.tmpl", title, 450, 600) ui.set_initial_data(data) diff --git a/code/game/machinery/oxygen_pump.dm b/code/game/machinery/oxygen_pump.dm index 0720b03b26..74cc399beb 100644 --- a/code/game/machinery/oxygen_pump.dm +++ b/code/game/machinery/oxygen_pump.dm @@ -202,7 +202,7 @@ // update the ui if it exists, returns null if no ui is passed/found - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) // the ui does not exist, so we'll create a new() one // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm diff --git a/code/game/machinery/partslathe_vr.dm b/code/game/machinery/partslathe_vr.dm index 736474f453..d2d9079ab1 100644 --- a/code/game/machinery/partslathe_vr.dm +++ b/code/game/machinery/partslathe_vr.dm @@ -280,7 +280,7 @@ recipies_ui[++recipies_ui.len] = list("name" = R.name, "type" = "[T]") data["recipies"] = recipies_ui - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "partslathe.tmpl", "Parts Lathe UI", 500, 450) ui.set_initial_data(data) diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index b044cc4c90..948ef595c8 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -327,7 +327,7 @@ settings[++settings.len] = list("category" = "Neutralize All Entities", "setting" = "check_all", "value" = check_all) data["settings"] = settings - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) ui = new(user, src, ui_key, "turret_control.tmpl", "Turret Controls", 500, 300) ui.set_initial_data(data) diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index 5c81cfe31f..42c2cda3f9 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -127,7 +127,7 @@ var/list/obj/machinery/requests_console/allConsoles = list() data["msgVerified"] = msgVerified data["announceAuth"] = announceAuth - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) ui = new(user, src, ui_key, "request_console.tmpl", "[department] Request Console", 520, 410) ui.set_initial_data(data) diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm index c1911d6a05..4319e11127 100644 --- a/code/game/machinery/turret_control.dm +++ b/code/game/machinery/turret_control.dm @@ -137,7 +137,7 @@ data["settings"] = settings - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) ui = new(user, src, ui_key, "turret_control.tmpl", "Turret Controls", 500, 300) ui.set_initial_data(data) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 383e2844d7..d397c03cb1 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -169,7 +169,7 @@ vend(currently_vending, usr) return else if(handled) - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) return // don't smack that machine with your 2 thalers if(I || istype(W, /obj/item/weapon/spacecash)) @@ -183,7 +183,7 @@ if(panel_open) overlays += image(icon, "[initial(icon_state)]-panel") - GLOB.nanomanager.update_uis(src) // Speaker switch is on the main UI, not wires UI + SSnanoui.update_uis(src) // Speaker switch is on the main UI, not wires UI return else if(istype(W, /obj/item/device/multitool) || W.is_wirecutter()) if(panel_open) @@ -195,7 +195,7 @@ coin = W categories |= CAT_COIN to_chat(user, "You insert \the [W] into \the [src].") - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) return else if(W.is_wrench()) playsound(src, W.usesound, 100, 1) @@ -399,7 +399,7 @@ else data["panel"] = 0 - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) ui = new(user, src, ui_key, "vending_machine.tmpl", name, 440, 600) ui.set_initial_data(data) @@ -459,7 +459,7 @@ shut_up = !shut_up add_fingerprint(usr) - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) /obj/machinery/vending/proc/vend(datum/stored_item/vending_product/R, mob/user) if((!allowed(usr)) && !emagged && scan_id) //For SECURE VENDING MACHINES YEAH @@ -470,7 +470,7 @@ vend_ready = 0 //One thing at a time!! status_message = "Vending..." status_error = 0 - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) if(R.category & CAT_COIN) if(!coin) @@ -512,7 +512,7 @@ status_error = 0 vend_ready = 1 currently_vending = null - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) return 1 @@ -568,7 +568,7 @@ if(has_logs) do_logging(R, user) - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) /obj/machinery/vending/process() if(stat & (BROKEN|NOPOWER)) diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 5a80ed7cc3..e4818d0c79 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -103,7 +103,7 @@ if(current) data["builtperc"] = round((progress / current.time) * 100) - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) ui = new(user, src, ui_key, "mechfab.tmpl", "Exosuit Fabricator UI", 800, 600) ui.set_initial_data(data) diff --git a/code/game/mecha/mech_prosthetics.dm b/code/game/mecha/mech_prosthetics.dm index c77bf27a92..e40db24878 100644 --- a/code/game/mecha/mech_prosthetics.dm +++ b/code/game/mecha/mech_prosthetics.dm @@ -113,7 +113,7 @@ if(current) data["builtperc"] = round((progress / current.time) * 100) - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) ui = new(user, src, ui_key, "mechfab.tmpl", "Prosthetics Fab UI", 800, 600) ui.set_initial_data(data) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 14c341ce34..c2a77936c4 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -467,7 +467,7 @@ var/global/list/obj/item/device/pda/PDAs = list() /obj/item/device/pda/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) ui_tick++ - var/datum/nanoui/old_ui = GLOB.nanomanager.get_open_ui(user, src, "main") + var/datum/nanoui/old_ui = SSnanoui.get_open_ui(user, src, "main") var/auto_update = 1 if(mode in no_auto_update) auto_update = 0 @@ -647,7 +647,7 @@ var/global/list/obj/item/device/pda/PDAs = list() nanoUI = data // update the ui if it exists, returns null if no ui is passed/found - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) // the ui does not exist, so we'll create a new() one @@ -685,7 +685,7 @@ var/global/list/obj/item/device/pda/PDAs = list() ..() var/mob/user = usr - var/datum/nanoui/ui = GLOB.nanomanager.get_open_ui(user, src, "main") + var/datum/nanoui/ui = SSnanoui.get_open_ui(user, src, "main") var/mob/living/U = usr //Looking for master was kind of pointless since PDAs don't appear to have one. //if ((src in U.contents) || ( istype(loc, /turf) && in_range(src, U) ) ) @@ -1130,7 +1130,7 @@ var/global/list/obj/item/device/pda/PDAs = list() ai.show_message("Intercepted message from [who]: [t]") P.new_message_from_pda(src, t) - GLOB.nanomanager.update_user_uis(U, src) // Update the sending user's PDA UI so that they can see the new message + SSnanoui.update_user_uis(U, src) // Update the sending user's PDA UI so that they can see the new message else to_chat(U, "ERROR: Messaging server is not responding.") @@ -1150,7 +1150,7 @@ var/global/list/obj/item/device/pda/PDAs = list() if(L) if(reception_message) L << reception_message - GLOB.nanomanager.update_user_uis(L, src) // Update the receiving user's PDA UI so that they can see the new message + SSnanoui.update_user_uis(L, src) // Update the receiving user's PDA UI so that they can see the new message /obj/item/device/pda/proc/new_news(var/message) new_info(news_silent, newstone, news_silent ? "" : "\icon[src] [message]") @@ -1196,7 +1196,7 @@ var/global/list/obj/item/device/pda/PDAs = list() if(can_use(usr)) mode = 0 - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) to_chat(usr, "You press the reset button on \the [src].") else to_chat(usr, "You cannot do this while restrained.") @@ -1297,7 +1297,7 @@ var/global/list/obj/item/device/pda/PDAs = list() user.drop_item() cartridge.loc = src to_chat(usr, "You insert [cartridge] into [src].") - GLOB.nanomanager.update_uis(src) // update all UIs attached to src + SSnanoui.update_uis(src) // update all UIs attached to src if(cartridge.radio) cartridge.radio.hostpda = src @@ -1325,7 +1325,7 @@ var/global/list/obj/item/device/pda/PDAs = list() C.loc = src pai = C to_chat(user, "You slot \the [C] into \the [src].") - GLOB.nanomanager.update_uis(src) // update all UIs attached to src + SSnanoui.update_uis(src) // update all UIs attached to src else if(istype(C, /obj/item/weapon/pen)) var/obj/item/weapon/pen/O = locate() in src if(O) diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index 0ced4be973..cc7ac0e4a4 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -43,7 +43,7 @@ data["laws"] = laws data["has_laws"] = laws.len - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "aicard.tmpl", "[name]", 600, 400, state = state) ui.set_initial_data(data) diff --git a/code/game/objects/items/devices/communicator/UI.dm b/code/game/objects/items/devices/communicator/UI.dm index d414232a80..69f5bd0d4b 100644 --- a/code/game/objects/items/devices/communicator/UI.dm +++ b/code/game/objects/items/devices/communicator/UI.dm @@ -125,7 +125,7 @@ // The value element is the actual data, and can take any form necessary for the template // update the ui if it exists, returns null if no ui is passed/found - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) // the ui does not exist, so we'll create a new() one // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm @@ -261,7 +261,7 @@ notehtml = note if(href_list["switch_template"]) - var/datum/nanoui/ui = GLOB.nanomanager.get_open_ui(usr, src, "main") + var/datum/nanoui/ui = SSnanoui.get_open_ui(usr, src, "main") if(ui) ui.add_template("Body", href_list["switch_template"]) @@ -276,5 +276,5 @@ if(href_list["cartridge_topic"] && cartridge) // Has to have a cartridge to perform these functions cartridge.Topic(href, href_list) - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) add_fingerprint(usr) diff --git a/code/game/objects/items/devices/communicator/communicator.dm b/code/game/objects/items/devices/communicator/communicator.dm index 6324af7fb5..b9a8eff8a4 100644 --- a/code/game/objects/items/devices/communicator/communicator.dm +++ b/code/game/objects/items/devices/communicator/communicator.dm @@ -234,7 +234,7 @@ var/global/list/obj/item/device/communicator/all_communicators = list() cartridge.forceMove(src) to_chat(usr, "You slot \the [cartridge] into \the [src].") modules[++modules.len] = list("module" = "External Device", "icon" = "external64", "number" = EXTRTAB) - GLOB.nanomanager.update_uis(src) // update all UIs attached to src + SSnanoui.update_uis(src) // update all UIs attached to src return // Proc: attack_self() diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 579e65787b..971eb26a46 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -121,7 +121,7 @@ var/global/list/default_medbay_channels = list( if(syndie) data["useSyndMode"] = 1 - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) ui = new(user, src, ui_key, "radio_basic.tmpl", "[name]", 400, 430) ui.set_initial_data(data) @@ -232,7 +232,7 @@ var/global/list/default_medbay_channels = list( return 1 if(.) - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) /obj/item/device/radio/proc/autosay(var/message, var/from, var/channel) //BS12 EDIT var/datum/radio_frequency/connection = null @@ -724,7 +724,7 @@ var/global/list/default_medbay_channels = list( . = 1 if(.) - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) /obj/item/device/radio/borg/interact(mob/user as mob) if(!on) @@ -753,7 +753,7 @@ var/global/list/default_medbay_channels = list( data["has_subspace"] = 1 data["subspace"] = subspace_transmission - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) ui = new(user, src, ui_key, "radio_basic.tmpl", "[name]", 400, 430) ui.set_initial_data(data) diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 8abc2eabc2..ccd339e180 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -37,7 +37,7 @@ log_game("[key_name_admin(user)] attached both tanks to a transfer valve.") update_icon() - GLOB.nanomanager.update_uis(src) // update all UIs attached to src + SSnanoui.update_uis(src) // update all UIs attached to src //TODO: Have this take an assemblyholder else if(isassembly(item)) var/obj/item/device/assembly/A = item @@ -58,7 +58,7 @@ message_admins("[key_name_admin(user)] attached a [item] to a transfer valve. (JMP)") log_game("[key_name_admin(user)] attached a [item] to a transfer valve.") attacher = user - GLOB.nanomanager.update_uis(src) // update all UIs attached to src + SSnanoui.update_uis(src) // update all UIs attached to src return @@ -81,7 +81,7 @@ data["valveOpen"] = valve_open ? 1 : 0 // update the ui if it exists, returns null if no ui is passed/found - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) // the ui does not exist, so we'll create a new() one // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm diff --git a/code/game/objects/items/devices/uplink.dm b/code/game/objects/items/devices/uplink.dm index 0bdb5a6b72..ea7006a73b 100644 --- a/code/game/objects/items/devices/uplink.dm +++ b/code/game/objects/items/devices/uplink.dm @@ -72,7 +72,7 @@ discount_amount = pick(90;0.9, 80;0.8, 70;0.7, 60;0.6, 50;0.5, 40;0.4, 30;0.3, 20;0.2, 10;0.1) next_offer_time = world.time + offer_time update_nano_data() - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) // Toggles the uplink on and off. Normally this will bypass the item's normal functions and go to the uplink menu, if activated. /obj/item/device/uplink/hidden/proc/toggle() @@ -110,7 +110,7 @@ data += nanoui_data // update the ui if it exists, returns null if no ui is passed/found - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) // No auto-refresh ui = new(user, src, ui_key, "uplink.tmpl", title, 450, 600, state = inventory_state) data["menu"] = 0 @@ -138,7 +138,7 @@ UI.buy(src, usr) else if(href_list["lock"]) toggle() - var/datum/nanoui/ui = GLOB.nanomanager.get_open_ui(user, src, "main") + var/datum/nanoui/ui = SSnanoui.get_open_ui(user, src, "main") ui.close() else if(href_list["return"]) nanoui_menu = round(nanoui_menu/10) diff --git a/code/game/objects/items/weapons/id cards/syndicate_ids.dm b/code/game/objects/items/weapons/id cards/syndicate_ids.dm index e1ceb489dd..bbf05718fc 100644 --- a/code/game/objects/items/weapons/id cards/syndicate_ids.dm +++ b/code/game/objects/items/weapons/id cards/syndicate_ids.dm @@ -58,7 +58,7 @@ data["electronic_warfare"] = electronic_warfare data["entries"] = entries - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "agent_id_card.tmpl", "Fake ID", 600, 400) ui.set_initial_data(data) @@ -185,7 +185,7 @@ . = 1 // Always update the UI, or buttons will spin indefinitely - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) /var/global/list/id_card_states /proc/id_card_states() diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 0962eef6f3..fb7a9accd4 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -263,7 +263,7 @@ var/list/global/tank_gauge_cache = list() data["maskConnected"] = 1 // update the ui if it exists, returns null if no ui is passed/found - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) // the ui does not exist, so we'll create a new() one // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 5f051a4e78..8ff7ee844f 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -102,7 +102,7 @@ GLOBAL_LIST_BOILERPLATE(all_janitorial_carts, /obj/structure/janitorialcart) data["replacer"] = myreplacer ? capitalize(myreplacer.name) : null data["signs"] = signs ? "[signs] sign\s" : null - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) ui = new(user, src, ui_key, "janitorcart.tmpl", "Janitorial cart", 240, 160) ui.set_initial_data(data) diff --git a/code/global_init.dm b/code/global_init.dm index 6e3f13d506..c562209183 100644 --- a/code/global_init.dm +++ b/code/global_init.dm @@ -18,8 +18,6 @@ var/global/datum/global_init/init = new () makeDatumRefLists() load_configuration() - initialize_chemical_reagents() - initialize_chemical_reactions() initialize_integrated_circuits_list() qdel(src) //we're done diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm index 35cff902d8..ce2c684c09 100644 --- a/code/modules/admin/view_variables/topic.dm +++ b/code/modules/admin/view_variables/topic.dm @@ -448,7 +448,7 @@ usr << "This can only be done on mobs with clients" return - GLOB.nanomanager.send_resources(H.client) + SSnanoui.send_resources(H.client) usr << "Resource files sent" H << "Your NanoUI Resource files have been refreshed" diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 1ccf0d5c53..e13573e305 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -152,7 +152,7 @@ log_client_to_db() send_resources() - GLOB.nanomanager.send_resources(src) + SSnanoui.send_resources(src) if(!void) void = new() @@ -166,7 +166,7 @@ src.changes() hook_vr("client_new",list(src)) //VOREStation Code - + if(config.paranoia_logging) if(isnum(player_age) && player_age == 0) log_and_message_admins("PARANOIA: [key_name(src)] has connected here for the first time.") diff --git a/code/modules/clothing/glasses/hud_vr.dm b/code/modules/clothing/glasses/hud_vr.dm index 1863ec3c14..dfdd02c461 100644 --- a/code/modules/clothing/glasses/hud_vr.dm +++ b/code/modules/clothing/glasses/hud_vr.dm @@ -23,7 +23,7 @@ /obj/item/clothing/glasses/omnihud/dropped() if(arscreen) - GLOB.nanomanager.close_uis(src) + SSnanoui.close_uis(src) ..() /obj/item/clothing/glasses/omnihud/emp_act(var/severity) diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index 1130e1e19d..a7c3287133 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -616,7 +616,7 @@ if(module_list.len) data["modules"] = module_list - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, ((src.loc != user) ? ai_interface_path : interface_path), interface_title, 480, 550, state = nano_state) ui.set_initial_data(data) diff --git a/code/modules/detectivework/microscope/dnascanner.dm b/code/modules/detectivework/microscope/dnascanner.dm index d45555f40d..413fe14d01 100644 --- a/code/modules/detectivework/microscope/dnascanner.dm +++ b/code/modules/detectivework/microscope/dnascanner.dm @@ -61,7 +61,7 @@ data["bloodsamp_desc"] = (bloodsamp ? (bloodsamp.desc ? bloodsamp.desc : "No information on record.") : "") data["lidstate"] = closed - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data) if (!ui) ui = new(user, src, ui_key, "dnaforensics.tmpl", "QuikScan DNA Analyzer", 540, 326) ui.set_initial_data(data) diff --git a/code/modules/economy/Accounts_DB.dm b/code/modules/economy/Accounts_DB.dm index 2d6676adec..a293226d48 100644 --- a/code/modules/economy/Accounts_DB.dm +++ b/code/modules/economy/Accounts_DB.dm @@ -53,7 +53,7 @@ O.loc = src held_card = O - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) attack_hand(user) @@ -107,7 +107,7 @@ if (accounts.len > 0) data["accounts"] = accounts - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "accounts_terminal.tmpl", src.name, 400, 640) ui.set_initial_data(data) @@ -117,7 +117,7 @@ if(..()) return 1 - var/datum/nanoui/ui = GLOB.nanomanager.get_open_ui(usr, src, "main") + var/datum/nanoui/ui = SSnanoui.get_open_ui(usr, src, "main") if(href_list["choice"]) switch(href_list["choice"]) diff --git a/code/modules/events/supply_demand.dm b/code/modules/events/supply_demand.dm index becec3b192..2d38c1f491 100644 --- a/code/modules/events/supply_demand.dm +++ b/code/modules/events/supply_demand.dm @@ -284,7 +284,7 @@ var/list/medicineReagents = list() for(var/path in typesof(/datum/chemical_reaction) - /datum/chemical_reaction) var/datum/chemical_reaction/CR = path // Stupid casting required for reading - var/datum/reagent/R = chemical_reagents_list[initial(CR.result)] + var/datum/reagent/R = SSchemistry.chemical_reagents[initial(CR.result)] if(R && R.scannable) medicineReagents += R for(var/i in 1 to differentTypes) @@ -298,7 +298,7 @@ var/list/drinkReagents = list() for(var/path in typesof(/datum/chemical_reaction) - /datum/chemical_reaction) var/datum/chemical_reaction/CR = path // Stupid casting required for reading - var/datum/reagent/R = chemical_reagents_list[initial(CR.result)] + var/datum/reagent/R = SSchemistry.chemical_reagents[initial(CR.result)] if(istype(R, /datum/reagent/drink) || istype(R, /datum/reagent/ethanol)) drinkReagents += R for(var/i in 1 to differentTypes) diff --git a/code/modules/food/kitchen/smartfridge.dm b/code/modules/food/kitchen/smartfridge.dm index d1b9381216..0213ef089b 100644 --- a/code/modules/food/kitchen/smartfridge.dm +++ b/code/modules/food/kitchen/smartfridge.dm @@ -216,7 +216,7 @@ overlays.Cut() if(panel_open) overlays += image(icon, icon_panel) - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) return if(wrenchable && default_unfasten_wrench(user, O, 20)) @@ -282,11 +282,11 @@ var/datum/stored_item/item = new/datum/stored_item(src, O.type, O.name) item.add_product(O) item_records.Add(item) - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) /obj/machinery/smartfridge/proc/vend(datum/stored_item/I) I.get_product(get_turf(src)) - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) /obj/machinery/smartfridge/attack_ai(mob/user as mob) attack_hand(user) @@ -321,7 +321,7 @@ if(items.len > 0) data["contents"] = items - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) ui = new(user, src, ui_key, "smartfridge.tmpl", src.name, 400, 500) ui.set_initial_data(data) @@ -331,7 +331,7 @@ if(..()) return 0 var/mob/user = usr - var/datum/nanoui/ui = GLOB.nanomanager.get_open_ui(user, src, "main") + var/datum/nanoui/ui = SSnanoui.get_open_ui(user, src, "main") src.add_fingerprint(user) diff --git a/code/modules/food/recipe_dump.dm b/code/modules/food/recipe_dump.dm index 19f7988826..a458a568cf 100644 --- a/code/modules/food/recipe_dump.dm +++ b/code/modules/food/recipe_dump.dm @@ -68,14 +68,14 @@ //Reagents can be resolved to nicer names as well for(var/Rp in food_recipes) for(var/rid in food_recipes[Rp]["Reagents"]) - var/datum/reagent/Rd = chemical_reagents_list[rid] + var/datum/reagent/Rd = SSchemistry.chemical_reagents[rid] var/R_name = Rd.name var/amt = food_recipes[Rp]["Reagents"][rid] food_recipes[Rp]["Reagents"] -= rid food_recipes[Rp]["Reagents"][R_name] = amt for(var/Rp in drink_recipes) for(var/rid in drink_recipes[Rp]["Reagents"]) - var/datum/reagent/Rd = chemical_reagents_list[rid] + var/datum/reagent/Rd = SSchemistry.chemical_reagents[rid] var/R_name = Rd.name var/amt = drink_recipes[Rp]["Reagents"][rid] drink_recipes[Rp]["Reagents"] -= rid diff --git a/code/modules/holodeck/HolodeckControl.dm b/code/modules/holodeck/HolodeckControl.dm index ee33b66cba..4cce81a2a6 100644 --- a/code/modules/holodeck/HolodeckControl.dm +++ b/code/modules/holodeck/HolodeckControl.dm @@ -112,7 +112,7 @@ else data["gravity"] = null - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "holodeck.tmpl", src.name, 400, 550) ui.set_initial_data(data) @@ -152,7 +152,7 @@ src.add_fingerprint(usr) - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) /obj/machinery/computer/HolodeckControl/emag_act(var/remaining_charges, var/mob/user as mob) playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index 0118088b27..9ed2d836a6 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -437,7 +437,7 @@ for(var/x=1;x<=additional_chems;x++) - var/new_chem = pick(chemical_reagents_list) + var/new_chem = pick(SSchemistry.chemical_reagents) if(new_chem in banned_chems) continue banned_chems += new_chem diff --git a/code/modules/hydroponics/seed_machines.dm b/code/modules/hydroponics/seed_machines.dm index 8d7ebdf314..4601f23484 100644 --- a/code/modules/hydroponics/seed_machines.dm +++ b/code/modules/hydroponics/seed_machines.dm @@ -162,7 +162,7 @@ data["hasGenetics"] = 0 data["sourceName"] = 0 - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "botany_isolator.tmpl", "Lysis-isolation Centrifuge UI", 470, 450) ui.set_initial_data(data) @@ -292,7 +292,7 @@ else data["loaded"] = 0 - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "botany_editor.tmpl", "Bioballistic Delivery UI", 470, 450) ui.set_initial_data(data) diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 1b3720dc33..ac2417a077 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -201,7 +201,7 @@ medicalActive1 = null medicalActive2 = null medical_cannotfind = 0 - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) usr << "You reset your record-viewing software." /mob/living/silicon/pai/cancel_camera() diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index bef2c93403..85d98c1663 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -90,7 +90,7 @@ var/global/list/default_pai_software = list() data["emotions"] = emotions data["current_emotion"] = card.current_emotion - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "pai_interface.tmpl", "pAI Software Interface", 450, 600) ui.set_initial_data(data) diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm index 480c3b63bb..dad52893cf 100644 --- a/code/modules/mob/living/silicon/pai/software_modules.dm +++ b/code/modules/mob/living/silicon/pai/software_modules.dm @@ -36,7 +36,7 @@ data["prime"] = user.pai_law0 data["supplemental"] = user.pai_laws - ui = GLOB.nanomanager.try_update_ui(user, user, id, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, user, id, ui, data, force_open) if(!ui) // Don't copy-paste this unless you're making a pAI software module! ui = new(user, user, id, "pai_directives.tmpl", "pAI Directives", 450, 600) @@ -102,7 +102,7 @@ data["channels"] = channels - ui = GLOB.nanomanager.try_update_ui(user, user, id, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, user, id, ui, data, force_open) if(!ui) ui = new(user, user, id, "pai_radio.tmpl", "Radio Configuration", 300, 150) ui.set_initial_data(data) @@ -128,7 +128,7 @@ // This is dumb, but NanoUI breaks if it has no data to send data["manifest"] = PDA_Manifest - ui = GLOB.nanomanager.try_update_ui(user, user, id, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, user, id, ui, data, force_open) if(!ui) // Don't copy-paste this unless you're making a pAI software module! ui = new(user, user, id, "crew_manifest.tmpl", "Crew Manifest", 450, 600) @@ -178,7 +178,7 @@ data["messages"] = messages - ui = GLOB.nanomanager.try_update_ui(user, user, id, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, user, id, ui, data, force_open) if(!ui) // Don't copy-paste this unless you're making a pAI software module! ui = new(user, user, id, "pai_messenger.tmpl", "Digital Messenger", 450, 600) @@ -236,7 +236,7 @@ data["medical"] = M ? M.fields : null data["could_not_find"] = user.medical_cannotfind - ui = GLOB.nanomanager.try_update_ui(user, user, id, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, user, id, ui, data, force_open) if(!ui) // Don't copy-paste this unless you're making a pAI software module! ui = new(user, user, id, "pai_medrecords.tmpl", "Medical Records", 450, 600) @@ -290,7 +290,7 @@ data["security"] = S ? S.fields : null data["could_not_find"] = user.security_cannotfind - ui = GLOB.nanomanager.try_update_ui(user, user, id, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, user, id, ui, data, force_open) if(!ui) // Don't copy-paste this unless you're making a pAI software module! ui = new(user, user, id, "pai_secrecords.tmpl", "Security Records", 450, 600) @@ -340,7 +340,7 @@ data["progress_b"] = user.hackprogress % 10 data["aborted"] = user.hack_aborted - ui = GLOB.nanomanager.try_update_ui(user, user, id, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, user, id, ui, data, force_open) if(!ui) // Don't copy-paste this unless you're making a pAI software module! ui = new(user, user, id, "pai_doorjack.tmpl", "Door Jack", 300, 150) @@ -431,7 +431,7 @@ gases[++gases.len] = gas data["gas"] = gases - ui = GLOB.nanomanager.try_update_ui(user, user, id, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, user, id, ui, data, force_open) if(!ui) // Don't copy-paste this unless you're making a pAI software module! ui = new(user, user, id, "pai_atmosphere.tmpl", "Atmosphere Sensor", 350, 300) @@ -505,7 +505,7 @@ data["frequency"] = format_frequency(user.sradio.frequency) data["code"] = user.sradio.code - ui = GLOB.nanomanager.try_update_ui(user, user, id, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, user, id, ui, data, force_open) if(!ui) // Don't copy-paste this unless you're making a pAI software module! ui = new(user, user, id, "pai_signaller.tmpl", "Signaller", 320, 150) diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm index 419ec99a26..750f043f33 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm @@ -184,12 +184,12 @@ dat += "

Injector

" if(patient)// && patient.health > min_health) //Not necessary, leave the buttons on, but the feedback during injection will give more information. for(var/re in injection_chems) - var/datum/reagent/C = chemical_reagents_list[re] + var/datum/reagent/C = SSchemistry.chemical_reagents[re] if(C) dat += "Inject [C.name]
" else for(var/re in injection_chems) - var/datum/reagent/C = chemical_reagents_list[re] + var/datum/reagent/C = SSchemistry.chemical_reagents[re] if(C) dat += "Inject [C.name]
" @@ -393,7 +393,7 @@ patient.reagents.add_reagent(chem, inject_amount) drain(750) //-750 charge per injection var/units = round(patient.reagents.get_reagent_amount(chem)) - to_chat(hound, "Injecting [units] unit\s of [chemical_reagents_list[chem]] into occupant.") //If they were immersed, the reagents wouldn't leave with them. + to_chat(hound, "Injecting [units] unit\s of [SSchemistry.chemical_reagents[chem]] into occupant.") //If they were immersed, the reagents wouldn't leave with them. //For if the dogborg's existing patient uh, doesn't make it. /obj/item/device/dogborg/sleeper/proc/update_patient() diff --git a/code/modules/mob/logout.dm b/code/modules/mob/logout.dm index 317bc2c076..aa42ab461d 100644 --- a/code/modules/mob/logout.dm +++ b/code/modules/mob/logout.dm @@ -1,5 +1,5 @@ /mob/Logout() - GLOB.nanomanager.user_logout(src) // this is used to clean up (remove) this user's Nano UIs + SSnanoui.user_logout(src) // this is used to clean up (remove) this user's Nano UIs player_list -= src disconnect_time = world.realtime //VOREStation Addition: logging when we disappear. update_client_z(null) diff --git a/code/modules/nano/interaction/remote.dm b/code/modules/nano/interaction/remote.dm index 2e18386bde..8e6ded6c84 100644 --- a/code/modules/nano/interaction/remote.dm +++ b/code/modules/nano/interaction/remote.dm @@ -18,7 +18,7 @@ src.remoter_state = null // Force an UI update before we go, ensuring that any windows we may have opened for the remote target closes. - GLOB.nanomanager.update_uis(remote_target.nano_container()) + SSnanoui.update_uis(remote_target.nano_container()) remote_target = null return ..() diff --git a/code/modules/nano/modules/alarm_monitor.dm b/code/modules/nano/modules/alarm_monitor.dm index c5a851bacc..ec43035ed8 100644 --- a/code/modules/nano/modules/alarm_monitor.dm +++ b/code/modules/nano/modules/alarm_monitor.dm @@ -80,7 +80,7 @@ "lost_sources" = lost_sources.len ? sanitize(english_list(lost_sources, nothing_text = "", and_text = ", ")) : "")) data["categories"] = categories - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "alarm_monitor.tmpl", "Alarm Monitoring Console", 800, 800, state = state) ui.set_initial_data(data) diff --git a/code/modules/nano/modules/atmos_control.dm b/code/modules/nano/modules/atmos_control.dm index c8c5e8b613..3924f65af7 100644 --- a/code/modules/nano/modules/atmos_control.dm +++ b/code/modules/nano/modules/atmos_control.dm @@ -48,7 +48,7 @@ data["alarms"] = alarms data["map_levels"] = using_map.get_map_levels(T.z) - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) ui = new(user, src, ui_key, "atmos_control.tmpl", src.name, 625, 625, state = state) // adding a template with the key "mapContent" enables the map ui functionality diff --git a/code/modules/nano/modules/crew_monitor.dm b/code/modules/nano/modules/crew_monitor.dm index 4a721ab709..319da90715 100644 --- a/code/modules/nano/modules/crew_monitor.dm +++ b/code/modules/nano/modules/crew_monitor.dm @@ -25,7 +25,7 @@ for(var/z in (data["map_levels"] | T.z)) // Always show crew from the current Z even if we can't show a map data["crewmembers"] += crew_repository.health_data(z) - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) ui = new(user, src, ui_key, "crew_monitor.tmpl", "Crew Monitoring Computer", 900, 800, state = state) diff --git a/code/modules/nano/modules/human_appearance.dm b/code/modules/nano/modules/human_appearance.dm index 33203944a1..3d790b1194 100644 --- a/code/modules/nano/modules/human_appearance.dm +++ b/code/modules/nano/modules/human_appearance.dm @@ -145,7 +145,7 @@ data["change_hair_color"] = can_change(APPEARANCE_HAIR_COLOR) data["change_facial_hair_color"] = can_change(APPEARANCE_FACIAL_HAIR_COLOR) - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "appearance_changer.tmpl", "[src]", 800, 450, state = state) ui.set_initial_data(data) diff --git a/code/modules/nano/modules/law_manager.dm b/code/modules/nano/modules/law_manager.dm index ae8473c8ce..da971a0f87 100644 --- a/code/modules/nano/modules/law_manager.dm +++ b/code/modules/nano/modules/law_manager.dm @@ -176,7 +176,7 @@ data["channels"] = channels data["law_sets"] = package_multiple_laws(data["isAdmin"] ? admin_laws : player_laws) - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "law_manager.tmpl", sanitize("[src] - [owner]"), 800, is_malf(user) ? 600 : 400, state = state) ui.set_initial_data(data) diff --git a/code/modules/nano/modules/power_monitor.dm b/code/modules/nano/modules/power_monitor.dm index af1e155530..ae5dc44f29 100644 --- a/code/modules/nano/modules/power_monitor.dm +++ b/code/modules/nano/modules/power_monitor.dm @@ -28,7 +28,7 @@ data["focus"] = focus.return_reading_data() data["map_levels"] = using_map.get_map_levels(T.z) - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "power_monitor.tmpl", "Power Monitoring Console", 800, 500, state = state) // adding a template with the key "mapContent" enables the map ui functionality diff --git a/code/modules/nano/modules/rcon.dm b/code/modules/nano/modules/rcon.dm index 98a73964a4..65c1acfe36 100644 --- a/code/modules/nano/modules/rcon.dm +++ b/code/modules/nano/modules/rcon.dm @@ -38,7 +38,7 @@ data["hide_smes_details"] = hide_SMES_details data["hide_breakers"] = hide_breakers - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "rcon.tmpl", "RCON Console", 600, 400, state = state) ui.set_initial_data(data) diff --git a/code/modules/nano/nanomanager.dm b/code/modules/nano/nanomanager.dm index b1639f9194..afa779895a 100644 --- a/code/modules/nano/nanomanager.dm +++ b/code/modules/nano/nanomanager.dm @@ -1,38 +1,3 @@ -GLOBAL_DATUM_INIT(nanomanager, /datum/nanomanager, new) // NanoManager, the manager for Nano UIs. - -// This is the window/UI manager for Nano UI -// There should only ever be one (global) instance of nanomanger -/datum/nanomanager - // a list of current open /nanoui UIs, grouped by src_object and ui_key - var/open_uis[0] - // a list of current open /nanoui UIs, not grouped, for use in processing - var/list/processing_uis = list() - // a list of asset filenames which are to be sent to the client on user logon - var/list/asset_files = list() - - /** - * Create a new nanomanager instance. - * This proc generates a list of assets which are to be sent to each client on connect - * - * @return /nanomanager new nanomanager object - */ -/datum/nanomanager/New() - var/list/nano_asset_dirs = list(\ - "nano/css/",\ - "nano/images/",\ - "nano/js/",\ - "nano/templates/"\ - ) - - var/list/filenames = null - for (var/path in nano_asset_dirs) - filenames = flist(path) - for(var/filename in filenames) - if(copytext(filename, length(filename)) != "/") // filenames which end in "/" are actually directories, which we want to ignore - if(fexists(path + filename)) - asset_files.Add(fcopy_rsc(path + filename)) // add this file to asset_files for sending to clients when they connect - - return /** * Get an open /nanoui ui for the current user, src_object and ui_key and try to update it with data @@ -46,7 +11,7 @@ GLOBAL_DATUM_INIT(nanomanager, /datum/nanomanager, new) // NanoManager, the mana * * @return /nanoui Returns the found ui, for null if none exists */ -/datum/nanomanager/proc/try_update_ui(var/mob/user, src_object, ui_key, var/datum/nanoui/ui, data, var/force_open = 0) +/datum/controller/subsystem/nanoui/proc/try_update_ui(var/mob/user, src_object, ui_key, var/datum/nanoui/ui, data, var/force_open = 0) if (isnull(ui)) // no ui has been passed, so we'll search for one { ui = get_open_ui(user, src_object, ui_key) @@ -71,7 +36,7 @@ GLOBAL_DATUM_INIT(nanomanager, /datum/nanomanager, new) // NanoManager, the mana * * @return /nanoui Returns the found ui, or null if none exists */ -/datum/nanomanager/proc/get_open_ui(var/mob/user, src_object, ui_key) +/datum/controller/subsystem/nanoui/proc/get_open_ui(var/mob/user, src_object, ui_key) var/src_object_key = "\ref[src_object]" if (isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list)) //testing("nanomanager/get_open_ui mob [user.name] [src_object:name] [ui_key] - there are no uis open") @@ -94,7 +59,7 @@ GLOBAL_DATUM_INIT(nanomanager, /datum/nanomanager, new) // NanoManager, the mana * * @return int The number of uis updated */ -/datum/nanomanager/proc/update_uis(src_object) +/datum/controller/subsystem/nanoui/proc/update_uis(src_object) var/src_object_key = "\ref[src_object]" if (isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list)) return 0 @@ -114,7 +79,7 @@ GLOBAL_DATUM_INIT(nanomanager, /datum/nanomanager, new) // NanoManager, the mana * * @return int The number of uis close */ -/datum/nanomanager/proc/close_uis(src_object) +/datum/controller/subsystem/nanoui/proc/close_uis(src_object) var/src_object_key = "\ref[src_object]" if (isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list)) return 0 @@ -136,7 +101,7 @@ GLOBAL_DATUM_INIT(nanomanager, /datum/nanomanager, new) // NanoManager, the mana * * @return int The number of uis updated */ -/datum/nanomanager/proc/update_user_uis(var/mob/user, src_object = null, ui_key = null) +/datum/controller/subsystem/nanoui/proc/update_user_uis(var/mob/user, src_object = null, ui_key = null) if (isnull(user.open_uis) || !istype(user.open_uis, /list) || open_uis.len == 0) return 0 // has no open uis @@ -157,7 +122,7 @@ GLOBAL_DATUM_INIT(nanomanager, /datum/nanomanager, new) // NanoManager, the mana * * @return int The number of uis closed */ -/datum/nanomanager/proc/close_user_uis(var/mob/user, src_object = null, ui_key = null) +/datum/controller/subsystem/nanoui/proc/close_user_uis(var/mob/user, src_object = null, ui_key = null) if (isnull(user.open_uis) || !istype(user.open_uis, /list) || open_uis.len == 0) //testing("nanomanager/close_user_uis mob [user.name] has no open uis") return 0 // has no open uis @@ -180,7 +145,7 @@ GLOBAL_DATUM_INIT(nanomanager, /datum/nanomanager, new) // NanoManager, the mana * * @return nothing */ -/datum/nanomanager/proc/ui_opened(var/datum/nanoui/ui) +/datum/controller/subsystem/nanoui/proc/ui_opened(var/datum/nanoui/ui) var/src_object_key = "\ref[ui.src_object]" if (isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list)) open_uis[src_object_key] = list(ui.ui_key = list()) @@ -201,7 +166,7 @@ GLOBAL_DATUM_INIT(nanomanager, /datum/nanomanager, new) // NanoManager, the mana * * @return int 0 if no ui was removed, 1 if removed successfully */ -/datum/nanomanager/proc/ui_closed(var/datum/nanoui/ui) +/datum/controller/subsystem/nanoui/proc/ui_closed(var/datum/nanoui/ui) var/src_object_key = "\ref[ui.src_object]" if (isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list)) return 0 // wasn't open @@ -228,7 +193,7 @@ GLOBAL_DATUM_INIT(nanomanager, /datum/nanomanager, new) // NanoManager, the mana */ // -/datum/nanomanager/proc/user_logout(var/mob/user) +/datum/controller/subsystem/nanoui/proc/user_logout(var/mob/user) //testing("nanomanager/user_logout user [user.name]") return close_user_uis(user) @@ -241,7 +206,7 @@ GLOBAL_DATUM_INIT(nanomanager, /datum/nanomanager, new) // NanoManager, the mana * * @return nothing */ -/datum/nanomanager/proc/user_transferred(var/mob/oldMob, var/mob/newMob) +/datum/controller/subsystem/nanoui/proc/user_transferred(var/mob/oldMob, var/mob/newMob) //testing("nanomanager/user_transferred from mob [oldMob.name] to mob [newMob.name]") if (!oldMob || isnull(oldMob.open_uis) || !istype(oldMob.open_uis, /list) || open_uis.len == 0) //testing("nanomanager/user_transferred mob [oldMob.name] has no open uis") @@ -267,7 +232,7 @@ GLOBAL_DATUM_INIT(nanomanager, /datum/nanomanager, new) // NanoManager, the mana * @return nothing */ -/datum/nanomanager/proc/send_resources(client) +/datum/controller/subsystem/nanoui/proc/send_resources(client) for(var/file in asset_files) client << browse_rsc(file) // send the file to the client diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm index 4e4dd6af5b..43f98e3361 100644 --- a/code/modules/nano/nanoui.dm +++ b/code/modules/nano/nanoui.dm @@ -412,7 +412,7 @@ nanoui is used to open and update nano browser uis winset(user, "mapwindow.map", "focus=true") // return keyboard focus to map on_close_winset() //onclose(user, window_id) - GLOB.nanomanager.ui_opened(src) + SSnanoui.ui_opened(src) /** * Reinitialise this UI, potentially with a different template and/or initial data @@ -433,7 +433,7 @@ nanoui is used to open and update nano browser uis */ /datum/nanoui/proc/close() is_auto_updating = 0 - GLOB.nanomanager.ui_closed(src) + SSnanoui.ui_closed(src) user << browse(null, "window=[window_id]") for(var/datum/nanoui/child in children) child.close() @@ -492,7 +492,7 @@ nanoui is used to open and update nano browser uis map_update = 1 if ((src_object && src_object.Topic(href, href_list, state)) || map_update) - GLOB.nanomanager.update_uis(src_object) // update all UIs attached to src_object + SSnanoui.update_uis(src_object) // update all UIs attached to src_object /** * Process this UI, updating the entire UI or just the status (aka visibility) diff --git a/code/modules/nifsoft/nif_softshop.dm b/code/modules/nifsoft/nif_softshop.dm index 7c2990395d..818a53d38c 100644 --- a/code/modules/nifsoft/nif_softshop.dm +++ b/code/modules/nifsoft/nif_softshop.dm @@ -167,7 +167,7 @@ shut_up = !shut_up add_fingerprint(usr) - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) // Also special treatment! /obj/machinery/vending/nifsoft_shop/vend(datum/stored_item/vending_product/R, mob/user) @@ -179,7 +179,7 @@ vend_ready = 0 //One thing at a time!! status_message = "Installing..." status_error = 0 - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) if(R.category & CAT_COIN) if(!coin) @@ -215,5 +215,5 @@ status_error = 0 vend_ready = 1 currently_vending = null - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) return 1 diff --git a/code/modules/overmap/ships/computers/engine_control.dm b/code/modules/overmap/ships/computers/engine_control.dm index 4316762671..01920ee2e0 100644 --- a/code/modules/overmap/ships/computers/engine_control.dm +++ b/code/modules/overmap/ships/computers/engine_control.dm @@ -52,7 +52,7 @@ data["engines_info"] = enginfo - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "engines_control.tmpl", "[linked.name] Engines Control", 380, 530) ui.set_initial_data(data) diff --git a/code/modules/overmap/ships/computers/helm.dm b/code/modules/overmap/ships/computers/helm.dm index e31560f9e3..0249fae482 100644 --- a/code/modules/overmap/ships/computers/helm.dm +++ b/code/modules/overmap/ships/computers/helm.dm @@ -104,7 +104,7 @@ data["locations"] = locations - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "helm.tmpl", "[linked.name] Helm Control", 380, 530) ui.set_initial_data(data) diff --git a/code/modules/overmap/ships/computers/shuttle.dm b/code/modules/overmap/ships/computers/shuttle.dm index 8d6ecefcc7..09bf47512d 100644 --- a/code/modules/overmap/ships/computers/shuttle.dm +++ b/code/modules/overmap/ships/computers/shuttle.dm @@ -103,7 +103,7 @@ "can_force" = can_go && shuttle.can_force(), ) - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "shuttle_control_console_exploration.tmpl", "[shuttle_tag] Shuttle Control", 470, 310) diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index 8a2940b90d..add0d03d22 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -57,7 +57,7 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins data["cooldown"] = sendcooldown data["destination"] = destination - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "fax.tmpl", src.name, 500, 500) ui.set_initial_data(data) @@ -116,7 +116,7 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins if(href_list["logout"]) authenticated = 0 - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) /obj/machinery/photocopier/faxmachine/proc/sendfax(var/destination) if(stat & (BROKEN|NOPOWER)) diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index c5c087f7d8..24ad752845 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -50,7 +50,7 @@ else data["isSilicon"] = null - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "photocopier.tmpl", src.name, 300, 250) ui.set_initial_data(data) @@ -118,7 +118,7 @@ toner -= 5 sleep(15) - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) /obj/machinery/photocopier/attackby(obj/item/O as obj, mob/user as mob) if(istype(O, /obj/item/weapon/paper) || istype(O, /obj/item/weapon/photo) || istype(O, /obj/item/weapon/paper_bundle)) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 7aa085c198..7b464f6f50 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -822,7 +822,7 @@ ) // update the ui if it exists, returns null if no ui is passed/found - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) // the ui does not exist, so we'll create a new() one // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index bb808a49e2..2eadfc520a 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -211,7 +211,7 @@ // update the ui if it exists, returns null if no ui is passed/found - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) // the ui does not exist, so we'll create a new() one // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 6563cb7fdb..5e4c2e6207 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -327,7 +327,7 @@ - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "pacman.tmpl", src.name, 500, 560) ui.set_initial_data(data) diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 2e97d735ba..ad76cb061f 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -328,7 +328,7 @@ data["outputting"] = 0 // smes is not outputting // update the ui if it exists, returns null if no ui is passed/found - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) // the ui does not exist, so we'll create a new() one // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index ebf59a2d40..e436497fc5 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -333,7 +333,7 @@ data["ambient_pressure"] = round(env.return_pressure()) data["detonating"] = grav_pulling - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "supermatter_crystal.tmpl", "Supermatter Crystal", 500, 300) ui.set_initial_data(data) diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm index 3b3de0b436..29a1db0e16 100644 --- a/code/modules/power/turbine.dm +++ b/code/modules/power/turbine.dm @@ -363,7 +363,7 @@ data["temp"] = compressor.gas_contained.temperature // update the ui if it exists, returns null if no ui is passed/found - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) // the ui does not exist, so we'll create a new() one // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 317bc9a3b5..2d906381d1 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -12,27 +12,24 @@ my_atom = A //I dislike having these here but map-objects are initialised before world/New() is called. >_> - if(!chemical_reagents_list) + if(!SSchemistry.chemical_reagents) //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id var/paths = typesof(/datum/reagent) - /datum/reagent - chemical_reagents_list = list() + SSchemistry.chemical_reagents = list() for(var/path in paths) var/datum/reagent/D = new path() if(!D.name) continue - chemical_reagents_list[D.id] = D + SSchemistry.chemical_reagents[D.id] = D /datum/reagents/Destroy() - . = ..() - if(chemistryProcess) - chemistryProcess.active_holders -= src - + STOP_PROCESSING(SSchemistry, src) for(var/datum/reagent/R in reagent_list) qdel(R) - reagent_list.Cut() reagent_list = null if(my_atom && my_atom.reagents == src) my_atom.reagents = null + return ..() /* Internal procs */ @@ -80,15 +77,14 @@ return /datum/reagents/proc/handle_reactions() - if(chemistryProcess) - chemistryProcess.mark_for_update(src) + START_PROCESSING(SSchemistry, src) //returns 1 if the holder should continue reactiong, 0 otherwise. -/datum/reagents/proc/process_reactions() +/datum/reagents/process() if(QDELETED(my_atom)) //No container, no reaction. - return 0 + return PROCESS_KILL if(my_atom.flags & NOREACT) // No reactions here - return 0 + return PROCESS_KILL var/reaction_occured var/list/effect_reactions = list() @@ -98,7 +94,7 @@ //need to rebuild this to account for chain reactions for(var/datum/reagent/R in reagent_list) - eligible_reactions |= chemical_reactions_list[R.id] + eligible_reactions |= SSchemistry.chemical_reactions[R.id] for(var/datum/chemical_reaction/C in eligible_reactions) if(C.can_happen(src) && C.process(src)) @@ -114,7 +110,8 @@ C.post_reaction(src) update_total() - return reaction_occured + if(!reaction_occured) + return PROCESS_KILL /* Holder-to-chemical */ @@ -136,7 +133,7 @@ if(my_atom) my_atom.on_reagent_change() return 1 - var/datum/reagent/D = chemical_reagents_list[id] + var/datum/reagent/D = SSchemistry.chemical_reagents[id] if(D) var/datum/reagent/R = new D.type() reagent_list += R diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index 825fd95fd4..ee77c5e79e 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -134,7 +134,7 @@ data["bottleSpritesAmount"] = list(1, 2, 3, 4) //how many bottle sprites there are. Sprites are taken from chemical.dmi and can be found in nano/images/pill.png - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "chem_master.tmpl", src.name, 575, 400) ui.set_initial_data(data) @@ -282,7 +282,7 @@ else if(href_list["bottle_sprite"]) bottlesprite = href_list["bottle_sprite"] - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) /obj/machinery/chem_master/attack_ai(mob/user as mob) return src.attack_hand(user) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 0def6cd614..21775ea17e 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -1,12 +1,3 @@ -//Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id -/proc/initialize_chemical_reagents() - var/paths = typesof(/datum/reagent) - /datum/reagent - chemical_reagents_list = list() - for(var/path in paths) - var/datum/reagent/D = new path() - if(!D.name) - continue - chemical_reagents_list[D.id] = D diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index 3c3bf869d7..c3a973402a 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -1,22 +1,3 @@ - -//Chemical Reactions - Initialises all /datum/chemical_reaction into a list -// It is filtered into multiple lists within a list. -// For example: -// chemical_reaction_list["phoron"] is a list of all reactions relating to phoron -// Note that entries in the list are NOT duplicated. So if a reaction pertains to -// more than one chemical it will still only appear in only one of the sublists. -/proc/initialize_chemical_reactions() - var/paths = typesof(/datum/chemical_reaction) - /datum/chemical_reaction - chemical_reactions_list = list() - - for(var/path in paths) - var/datum/chemical_reaction/D = new path() - if(D.required_reagents && D.required_reagents.len) - var/reagent_id = D.required_reagents[1] - if(!chemical_reactions_list[reagent_id]) - chemical_reactions_list[reagent_id] = list() - chemical_reactions_list[reagent_id] += D - //helper that ensures the reaction rate holds after iterating //Ex. REACTION_RATE(0.3) means that 30% of the reagents will react each chemistry tick (~2 seconds by default). #define REACTION_RATE(rate) (1.0 - (1.0-rate)**(1.0/PROCESS_REACTION_ITER)) diff --git a/code/modules/reagents/dispenser/cartridge.dm b/code/modules/reagents/dispenser/cartridge.dm index f73f6e4a71..70142fabd8 100644 --- a/code/modules/reagents/dispenser/cartridge.dm +++ b/code/modules/reagents/dispenser/cartridge.dm @@ -18,7 +18,7 @@ . = ..() if(spawn_reagent) reagents.add_reagent(spawn_reagent, volume) - var/datum/reagent/R = chemical_reagents_list[spawn_reagent] + var/datum/reagent/R = SSchemistry.chemical_reagents[spawn_reagent] setLabel(R.name) /obj/item/weapon/reagent_containers/chem_disp_cartridge/examine(mob/user) diff --git a/code/modules/reagents/dispenser/cartridge_spawn.dm b/code/modules/reagents/dispenser/cartridge_spawn.dm index 730e191891..ba9b727047 100644 --- a/code/modules/reagents/dispenser/cartridge_spawn.dm +++ b/code/modules/reagents/dispenser/cartridge_spawn.dm @@ -1,4 +1,4 @@ -/client/proc/spawn_chemdisp_cartridge(size in list("small", "medium", "large"), reagent in chemical_reagents_list) +/client/proc/spawn_chemdisp_cartridge(size in list("small", "medium", "large"), reagent in SSchemistry.chemical_reagents) set name = "Spawn Chemical Dispenser Cartridge" set category = "Admin" @@ -8,6 +8,6 @@ if("medium") C = new /obj/item/weapon/reagent_containers/chem_disp_cartridge/medium(usr.loc) if("large") C = new /obj/item/weapon/reagent_containers/chem_disp_cartridge(usr.loc) C.reagents.add_reagent(reagent, C.volume) - var/datum/reagent/R = chemical_reagents_list[reagent] + var/datum/reagent/R = SSchemistry.chemical_reagents[reagent] C.setLabel(R.name) log_admin("[key_name(usr)] spawned a [size] reagent container containing [reagent] at ([usr.x],[usr.y],[usr.z])") diff --git a/code/modules/reagents/dispenser/dispenser2.dm b/code/modules/reagents/dispenser/dispenser2.dm index a04db7d53b..38c6cf39da 100644 --- a/code/modules/reagents/dispenser/dispenser2.dm +++ b/code/modules/reagents/dispenser/dispenser2.dm @@ -55,12 +55,12 @@ C.loc = src cartridges[C.label] = C cartridges = sortAssoc(cartridges) - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) /obj/machinery/chemical_dispenser/proc/remove_cartridge(label) . = cartridges[label] cartridges -= label - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) /obj/machinery/chemical_dispenser/attackby(obj/item/weapon/W, mob/user) if(W.is_wrench()) @@ -106,7 +106,7 @@ user.drop_from_inventory(RC) RC.loc = src to_chat(user, "You set \the [RC] on \the [src].") - GLOB.nanomanager.update_uis(src) // update all UIs attached to src + SSnanoui.update_uis(src) // update all UIs attached to src else return ..() @@ -140,7 +140,7 @@ data["chemicals"] = chemicals // update the ui if it exists, returns null if no ui is passed/found - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) ui = new(user, src, ui_key, "chem_disp.tmpl", ui_title, 390, 680) ui.set_initial_data(data) diff --git a/code/modules/reagents/dispenser/dispenser2_energy.dm b/code/modules/reagents/dispenser/dispenser2_energy.dm index f540811c11..c889b2fe9d 100644 --- a/code/modules/reagents/dispenser/dispenser2_energy.dm +++ b/code/modules/reagents/dispenser/dispenser2_energy.dm @@ -13,7 +13,7 @@ process_tick = 15 . = 0 for(var/id in dispense_reagents) - var/datum/reagent/R = chemical_reagents_list[id] + var/datum/reagent/R = SSchemistry.chemical_reagents[id] if(!R) crash_with("[src] at [x],[y],[z] failed to find reagent '[id]'!") dispense_reagents -= id @@ -25,7 +25,7 @@ C.reagents.add_reagent(id, to_restore) . = 1 if(.) - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) /obj/machinery/chemical_dispenser dispense_reagents = list( diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index a050478c4b..df99bca9e1 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -39,7 +39,7 @@ for(var/T in reagent_ids) reagent_volumes[T] = volume - var/datum/reagent/R = chemical_reagents_list[T] + var/datum/reagent/R = SSchemistry.chemical_reagents[T] reagent_names += R.name START_PROCESSING(SSobj, src) @@ -112,14 +112,14 @@ if(t) playsound(loc, 'sound/effects/pop.ogg', 50, 0) mode = t - var/datum/reagent/R = chemical_reagents_list[reagent_ids[mode]] + var/datum/reagent/R = SSchemistry.chemical_reagents[reagent_ids[mode]] usr << "Synthesizer is now producing '[R.name]'." /obj/item/weapon/reagent_containers/borghypo/examine(mob/user) if(!..(user, 2)) return - var/datum/reagent/R = chemical_reagents_list[reagent_ids[mode]] + var/datum/reagent/R = SSchemistry.chemical_reagents[reagent_ids[mode]] user << "It is currently producing [R.name] and has [reagent_volumes[reagent_ids[mode]]] out of [volume] units left." diff --git a/code/modules/resleeving/computers.dm b/code/modules/resleeving/computers.dm index f4445682dc..854b9dd097 100644 --- a/code/modules/resleeving/computers.dm +++ b/code/modules/resleeving/computers.dm @@ -198,7 +198,7 @@ data["coredumped"] = SStranscore.core_dumped data["emergency"] = disk ? 1 : 0 - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "sleever.tmpl", "Resleeving Control Console", 400, 450) ui.set_initial_data(data) @@ -375,7 +375,7 @@ menu = href_list["menu"] temp = "" - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) add_fingerprint(usr) // In here because only relevant to computer diff --git a/code/modules/resleeving/designer.dm b/code/modules/resleeving/designer.dm index 7e545b35fa..d4dadb2945 100644 --- a/code/modules/resleeving/designer.dm +++ b/code/modules/resleeving/designer.dm @@ -141,7 +141,7 @@ data["disk"] = disk ? 1 : 0 data["diskStored"] = disk && disk.stored ? 1 : 0 - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "body_designer.tmpl", "Body Design Console", 400, 600) ui.set_initial_data(data) diff --git a/code/modules/resleeving/infomorph.dm b/code/modules/resleeving/infomorph.dm index 906873408d..6166bb6456 100644 --- a/code/modules/resleeving/infomorph.dm +++ b/code/modules/resleeving/infomorph.dm @@ -187,7 +187,7 @@ var/list/infomorph_emotions = list( medicalActive1 = null medicalActive2 = null medical_cannotfind = 0 - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) usr << "You reset your record-viewing software." /* @@ -509,7 +509,7 @@ var/global/list/default_infomorph_software = list() data["emotions"] = emotions data["current_emotion"] = card.current_emotion - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open, key_state) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open, key_state) if (!ui) ui = new(user, src, ui_key, "pai_interface.tmpl", "Card Software Interface", 450, 600, state = key_state) ui.set_initial_data(data) diff --git a/code/modules/resleeving/infomorph_software.dm b/code/modules/resleeving/infomorph_software.dm index 21a51d91e3..bb5b7fc870 100644 --- a/code/modules/resleeving/infomorph_software.dm +++ b/code/modules/resleeving/infomorph_software.dm @@ -34,7 +34,7 @@ // This is dumb, but NanoUI breaks if it has no data to send data["manifest"] = PDA_Manifest - ui = GLOB.nanomanager.try_update_ui(user, user, id, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, user, id, ui, data, force_open) if(!ui) // Don't copy-paste this unless you're making a pAI software module! ui = new(user, user, id, "pai_manifest.tmpl", "Crew Manifest", 450, 600) @@ -66,7 +66,7 @@ data["medical"] = M ? M.fields : null data["could_not_find"] = user.medical_cannotfind - ui = GLOB.nanomanager.try_update_ui(user, user, id, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, user, id, ui, data, force_open) if(!ui) // Don't copy-paste this unless you're making a pAI software module! ui = new(user, user, id, "pai_medrecords.tmpl", "Medical Records", 450, 600) @@ -120,7 +120,7 @@ data["security"] = S ? S.fields : null data["could_not_find"] = user.security_cannotfind - ui = GLOB.nanomanager.try_update_ui(user, user, id, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, user, id, ui, data, force_open) if(!ui) // Don't copy-paste this unless you're making a pAI software module! ui = new(user, user, id, "pai_secrecords.tmpl", "Security Records", 450, 600) @@ -170,7 +170,7 @@ data["progress_b"] = user.hackprogress % 10 data["aborted"] = user.hack_aborted - ui = GLOB.nanomanager.try_update_ui(user, user, id, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, user, id, ui, data, force_open) if(!ui) // Don't copy-paste this unless you're making a pAI software module! ui = new(user, user, id, "pai_doorjack.tmpl", "Door Jack", 300, 150) @@ -270,7 +270,7 @@ gases[++gases.len] = gas data["gas"] = gases - ui = GLOB.nanomanager.try_update_ui(user, user, id, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, user, id, ui, data, force_open) if(!ui) // Don't copy-paste this unless you're making a pAI software module! ui = new(user, user, id, "pai_atmosphere.tmpl", "Atmosphere Sensor", 350, 300) @@ -314,7 +314,7 @@ data["frequency"] = format_frequency(user.sradio.frequency) data["code"] = user.sradio.code - ui = GLOB.nanomanager.try_update_ui(user, user, id, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, user, id, ui, data, force_open) if(!ui) // Don't copy-paste this unless you're making a pAI software module! ui = new(user, user, id, "pai_signaller.tmpl", "Signaller", 320, 150) diff --git a/code/modules/rogueminer_vr/zone_console.dm b/code/modules/rogueminer_vr/zone_console.dm index 75c5d6625c..17ea54c564 100644 --- a/code/modules/rogueminer_vr/zone_console.dm +++ b/code/modules/rogueminer_vr/zone_console.dm @@ -79,7 +79,7 @@ // Permit emergency recall of the shuttle if its stranded in a zone with just dead people. data["can_recall_shuttle"] = (shuttle_control && shuttle_control.z == BELT_Z && !curZoneOccupied) - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "zone_console.tmpl", src.name, 600, 400) ui.set_initial_data(data) @@ -100,7 +100,7 @@ failsafe_shuttle_recall() src.add_fingerprint(usr) - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) /obj/machinery/computer/roguezones/proc/scan_for_new_zone() if(scanning) return diff --git a/code/modules/shuttles/escape_pods.dm b/code/modules/shuttles/escape_pods.dm index e79f5d9b20..60c1e4bd0d 100644 --- a/code/modules/shuttles/escape_pods.dm +++ b/code/modules/shuttles/escape_pods.dm @@ -55,7 +55,7 @@ "is_armed" = pod.arming_controller.armed, ) - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "escape_pod_console.tmpl", name, 470, 290) @@ -102,7 +102,7 @@ "armed" = armed, ) - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "escape_pod_berth_console.tmpl", name, 470, 290) diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm index 01924be412..3d5422f4f1 100644 --- a/code/modules/shuttles/shuttle_console.dm +++ b/code/modules/shuttles/shuttle_console.dm @@ -57,7 +57,7 @@ "can_force" = shuttle.can_force(), ) - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "shuttle_control_console.tmpl", "[shuttle_tag] Shuttle Control", 470, 310) diff --git a/code/modules/shuttles/shuttle_emergency.dm b/code/modules/shuttles/shuttle_emergency.dm index 7db9ae2b62..86b8e29809 100644 --- a/code/modules/shuttles/shuttle_emergency.dm +++ b/code/modules/shuttles/shuttle_emergency.dm @@ -233,7 +233,7 @@ "user" = debug? user : null, ) - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "escape_shuttle_control_console.tmpl", "Shuttle Control", 470, 420) diff --git a/code/modules/shuttles/shuttles_web.dm b/code/modules/shuttles/shuttles_web.dm index c717e51adc..3726ce23cd 100644 --- a/code/modules/shuttles/shuttles_web.dm +++ b/code/modules/shuttles/shuttles_web.dm @@ -350,7 +350,7 @@ "sensors" = sensors ) - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) ui = new(user, src, ui_key, "flight.tmpl", "[shuttle.visible_name] Flight Computer", 500, 500) diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm index 277463bddc..b2cc345b8c 100644 --- a/code/modules/telesci/telesci_computer.dm +++ b/code/modules/telesci/telesci_computer.dm @@ -116,7 +116,7 @@ data["lastTeleData"]["distance"] = last_tele_data.distance data["lastTeleData"]["time"] = last_tele_data.time - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "telescience_console.tmpl", src.name, 400, 450) ui.set_initial_data(data) diff --git a/code/modules/virus2/centrifuge.dm b/code/modules/virus2/centrifuge.dm index 73e43be704..433a26977b 100644 --- a/code/modules/virus2/centrifuge.dm +++ b/code/modules/virus2/centrifuge.dm @@ -26,7 +26,7 @@ O.loc = src user.visible_message("[user] adds \a [O] to \the [src]!", "You add \a [O] to \the [src]!") - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) src.attack_hand(user) @@ -74,7 +74,7 @@ data["antibodies"] = antigens2string(A.data["antibodies"], none=null) data["is_antibody_sample"] = 1 - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "isolation_centrifuge.tmpl", src.name, 400, 500) ui.set_initial_data(data) @@ -98,7 +98,7 @@ if (..()) return 1 var/mob/user = usr - var/datum/nanoui/ui = GLOB.nanomanager.get_open_ui(user, src, "main") + var/datum/nanoui/ui = SSnanoui.get_open_ui(user, src, "main") src.add_fingerprint(user) @@ -160,7 +160,7 @@ sample.reagents.remove_reagent("blood", amt) sample.reagents.add_reagent("antibodies", amt, data) - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) update_icon() ping("\The [src] pings, \"Antibody isolated.\"") @@ -170,7 +170,7 @@ dish.virus2 = virus2 virus2 = null - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) update_icon() ping("\The [src] pings, \"Pathogen isolated.\"") diff --git a/code/modules/virus2/diseasesplicer.dm b/code/modules/virus2/diseasesplicer.dm index b5db3fa96a..95657498a0 100644 --- a/code/modules/virus2/diseasesplicer.dm +++ b/code/modules/virus2/diseasesplicer.dm @@ -81,7 +81,7 @@ else data["info"] = "No dish loaded." - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "disease_splicer.tmpl", src.name, 400, 600) ui.set_initial_data(data) @@ -95,12 +95,12 @@ scanning -= 1 if(!scanning) ping("\The [src] pings, \"Analysis complete.\"") - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) if(splicing) splicing -= 1 if(!splicing) ping("\The [src] pings, \"Splicing operation complete.\"") - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) if(burning) burning -= 1 if(!burning) @@ -122,13 +122,13 @@ d.species = species_buffer ping("\The [src] pings, \"Backup disk saved.\"") - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) /obj/machinery/computer/diseasesplicer/Topic(href, href_list) if(..()) return 1 var/mob/user = usr - var/datum/nanoui/ui = GLOB.nanomanager.get_open_ui(user, src, "main") + var/datum/nanoui/ui = SSnanoui.get_open_ui(user, src, "main") src.add_fingerprint(user) diff --git a/code/modules/virus2/dishincubator.dm b/code/modules/virus2/dishincubator.dm index 3ecad1d691..379d7ef533 100644 --- a/code/modules/virus2/dishincubator.dm +++ b/code/modules/virus2/dishincubator.dm @@ -29,7 +29,7 @@ O.loc = src user.visible_message("[user] adds \a [O] to \the [src]!", "You add \a [O] to \the [src]!") - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) src.attack_hand(user) return @@ -45,7 +45,7 @@ O.loc = src user.visible_message("[user] adds \a [O] to \the [src]!", "You add \a [O] to \the [src]!") - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) src.attack_hand(user) @@ -85,7 +85,7 @@ for (var/ID in virus) data["blood_already_infected"] = virus[ID] - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "dish_incubator.tmpl", src.name, 400, 600) ui.set_initial_data(data) @@ -104,7 +104,7 @@ foodsupply -= 1 dish.growth += 3 - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) if(radiation) if(radiation > 50 & prob(5)) @@ -117,24 +117,24 @@ else if(prob(5)) dish.virus2.minormutate() radiation -= 1 - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) if(toxins && prob(5)) dish.virus2.infectionchance -= 1 - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) if(toxins > 50) dish.growth = 0 dish.virus2 = null - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) else if(!dish) on = 0 icon_state = "incubator" - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) if(beaker) if(foodsupply < 100 && beaker.reagents.remove_reagent("virusfood",5)) if(foodsupply + 10 <= 100) foodsupply += 10 - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) if (locate(/datum/reagent/toxin) in beaker.reagents.reagent_list && toxins < 100) for(var/datum/reagent/toxin/T in beaker.reagents.reagent_list) @@ -143,13 +143,13 @@ if(toxins > 100) toxins = 100 break - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) /obj/machinery/disease2/incubator/Topic(href, href_list) if (..()) return 1 var/mob/user = usr - var/datum/nanoui/ui = GLOB.nanomanager.get_open_ui(user, src, "main") + var/datum/nanoui/ui = SSnanoui.get_open_ui(user, src, "main") src.add_fingerprint(user) diff --git a/code/modules/virus2/effect.dm b/code/modules/virus2/effect.dm index d7db2633ad..c4ea02b873 100644 --- a/code/modules/virus2/effect.dm +++ b/code/modules/virus2/effect.dm @@ -354,7 +354,7 @@ data = pick("bicaridine", "kelotane", "anti_toxin", "inaprovaline", "space_drugs", "sugar", "tramadol", "dexalin", "cryptobiolin", "impedrezene", "hyperzine", "ethylredoxrazine", "mindbreaker", "glucose") - var/datum/reagent/R = chemical_reagents_list[data] + var/datum/reagent/R = SSchemistry.chemical_reagents[data] name = "[initial(name)] ([initial(R.name)])" /datum/disease2/effect/chem_synthesis/activate(var/mob/living/carbon/mob,var/multiplier) diff --git a/code/modules/virus2/isolator.dm b/code/modules/virus2/isolator.dm index 8fa61e173b..da2c543fc8 100644 --- a/code/modules/virus2/isolator.dm +++ b/code/modules/virus2/isolator.dm @@ -43,7 +43,7 @@ S.loc = src user.visible_message("[user] adds \a [O] to \the [src]!", "You add \a [O] to \the [src]!") - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) update_icon() src.attack_hand(user) @@ -103,7 +103,7 @@ "name" = entry.fields["name"], \ "description" = replacetext(desc, "\n", "")) - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "pathogenic_isolator.tmpl", src.name, 400, 500) ui.set_initial_data(data) @@ -119,14 +119,14 @@ virus2 = null ping("\The [src] pings, \"Viral strain isolated.\"") - GLOB.nanomanager.update_uis(src) + SSnanoui.update_uis(src) update_icon() /obj/machinery/disease2/isolator/Topic(href, href_list) if (..()) return 1 var/mob/user = usr - var/datum/nanoui/ui = GLOB.nanomanager.get_open_ui(user, src, "main") + var/datum/nanoui/ui = SSnanoui.get_open_ui(user, src, "main") src.add_fingerprint(user) diff --git a/code/modules/xenoarcheaology/tools/geosample_scanner.dm b/code/modules/xenoarcheaology/tools/geosample_scanner.dm index 003a5639da..b97a34e48f 100644 --- a/code/modules/xenoarcheaology/tools/geosample_scanner.dm +++ b/code/modules/xenoarcheaology/tools/geosample_scanner.dm @@ -150,7 +150,7 @@ data["rad_shield_on"] = rad_shield // update the ui if it exists, returns null if no ui is passed/found - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) // the ui does not exist, so we'll create a new() one // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm diff --git a/code/unit_tests/research_tests.dm b/code/unit_tests/research_tests.dm index 93bf79a0da..24d307c5e6 100644 --- a/code/unit_tests/research_tests.dm +++ b/code/unit_tests/research_tests.dm @@ -60,7 +60,7 @@ number_of_issues++ for(var/reagent_name in design.chemicals) - if(!(reagent_name in chemical_reagents_list)) + if(!(reagent_name in SSchemistry.chemical_reagents)) log_unit_test("The entry [design_type] has invalid chemical type [reagent_name]") number_of_issues++ diff --git a/maps/tether/tether_phoronlock.dm b/maps/tether/tether_phoronlock.dm index ead834fb70..44f5fd04cb 100644 --- a/maps/tether/tether_phoronlock.dm +++ b/maps/tether/tether_phoronlock.dm @@ -116,7 +116,7 @@ obj/machinery/airlock_sensor/phoron/airlock_exterior "processing" = program.memory["processing"] ) - ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "phoron_airlock_console.tmpl", name, 470, 290) ui.set_initial_data(data) diff --git a/vorestation.dme b/vorestation.dme index 01d77b3198..929b621c36 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -206,10 +206,8 @@ #include "code\controllers\verbs.dm" #include "code\controllers\observer_listener\atom\observer.dm" #include "code\controllers\Processes\alarm.dm" -#include "code\controllers\Processes\chemistry.dm" #include "code\controllers\Processes\emergencyShuttle.dm" #include "code\controllers\Processes\game_master.dm" -#include "code\controllers\Processes\nanoui.dm" #include "code\controllers\Processes\radiation.dm" #include "code\controllers\Processes\supply.dm" #include "code\controllers\Processes\ticker.dm" @@ -229,6 +227,7 @@ #include "code\controllers\subsystems\machines.dm" #include "code\controllers\subsystems\mapping_vr.dm" #include "code\controllers\subsystems\mobs.dm" +#include "code\controllers\subsystems\nanoui.dm" #include "code\controllers\subsystems\orbits.dm" #include "code\controllers\subsystems\overlays.dm" #include "code\controllers\subsystems\persist_vr.dm" @@ -240,6 +239,7 @@ #include "code\controllers\subsystems\transcore_vr.dm" #include "code\controllers\subsystems\vote.dm" #include "code\controllers\subsystems\xenoarch.dm" +#include "code\controllers\subsystems\processing\chemistry.dm" #include "code\controllers\subsystems\processing\fastprocess.dm" #include "code\controllers\subsystems\processing\obj.dm" #include "code\controllers\subsystems\processing\processing.dm" From 98a252c9c8002b4c60148a6978687a4bba18dd2c Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 8 Apr 2019 15:33:46 -0400 Subject: [PATCH 041/141] Slight fix to radio sprite --- icons/mob/back_vr.dmi | Bin 18766 -> 18768 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/back_vr.dmi b/icons/mob/back_vr.dmi index 190ad99d3f20de4bdf1cc1bcef29d87a00b27e71..7c20e2aa166561265780b989585a98693a85f0ab 100644 GIT binary patch delta 2046 zcmVd+)s$ciwqtQtFQkKdfH88jBV!!o1t_leUiWh@2D`En0-tt5@UEM<1Qm ztC4g@37C*Ly#D&@ShZ>u?zrO)tXj1SufP6!QtP{P=@L$!Jc;uc&S8Jf9a2(HG_i=B zl;+$a;rxYjIC=6U4MW6$5->?Ca!^lbzESSI_gc0Q6jv(Q|3=O~qy=;Yi&h<5{$5QOXaMq>`kJ0asO3-Lz9QH#gHAQ8FXQA7ml& zG{VTFyI{crJo@OPc>aI+=K;j_8uw^K>O6np97c{Yo81c@9m}d!tMH{SeQ9Vrkf|8n z1Fov7;y#}bix)56-`w2H6h%Q*RTVEUFE{;iiKM@QZWR;V`Fl-`anyzl}CqTdd;`d5(+ zAA-;{4PLJopZ?T)uockws1`opa1BC;(#&q9DNU4`5r(Rz6dbuo;h9 zrOV@8=@MtENXkvP!ootFIdcZ5PMtzwVIcq@FE1|{RZV{jr^8-{Ns@2G(EM)>m5-Ys z2*}OLg;kQEDhh6NcLM;nly4d{jN^3JS0_?eBF3vb661~TZm5a^t0W;eFBgI^v+nn< zUcDOk-h1!x&+665ZH8no-$>~ctJw@cDl|=lq9`aTDne0F(eN}`PW;A%(_ugFbl49} zFz2YeSHW70+1vL0%Oqm*kN>8 zmS3u_*fQ(v!oxGc*rjh?P^4uLU9l7v7YfWE#yghC-OHX}N}00wV}MV^4Tbm`LY zlMs(S`e@SXoQ@|gj1YM`gha>i1T0AsR8>V!PY-{3dU_BH2BGUZyk2j@!xf{So zCz$=sHS8=J1<_mINS?P#vh>>S!b$C=60BglJXpIXJ;qduwn4|#1~&Q<}n$@ z7_w~ATVYkZTh?@kBntOA9rhjob2PBKbzMWIWPM8mGrSip3)WcgEMz8H=ZfM_oE3jX z5f+Pel`Jc(?q0fduc9dE?!Ix)$a3`!t~LN|k2!1kbX?{uiVRr}qp`VVOl95OH|`M_ z!`(}lp5>gwVzEM!I93#Y;w*p}b3mGrT+$_>rAwTtB58LF3 zKA#UhpU<%6)i=0)G4$_e0X(Z|8Wf$+8=C#>(DdPQ>8`%P#X_=-f&P9l#!r7|Wo6ZM z{o#*mC+J>$0{{-Tv?jgxF`|xdjGo5;bp7FvYqPSl>KNmv2m1RFl4V4D1Cx+jP1?Q_ z&grn956a5jnUeLb`UclBlVYeds<%6tE#;edB!j7{hQp(Vbt*S+<}HT~O>2@Hug*;y zHgJnY1ORXVZS99C@sdg1>R)ceNaqB6px4*$$e%r{p}xVj&4l`Y0^qLz{AYcG>#wJ~ zenMsfO2BEFfB|6r`t`h{ql0=`gruokJprfn*OMsu5<=2hS|?ya2uWv@fC(YQB$R*& cA;cvAKSct|gX+Me)&Kwi07*qoM6N<$g1Th>IRF3v delta 2044 zcmVH(9KS6;P&&$(mr_j1j-Lqd7ghNSd_N7jGu zz4v0#qD8|$_uhLi?!5EPq|_f7eptPFH5M&egn75;Cv6?$5jiO?TC@nOSFgsSk3KrB zS0gh4C165g@cQeoW7VovxZ{pHuxiyRy#D&@Nv-eFrAs(@@+8h*IEQ~ZcSuP+(ZnKh zQkrvzg!329;pEAaGz<|3O28y7$U!}!`9`_--g|NK7B61Bzqz@YDT;!ssw!SyUT*qj6G>kK-6|%!$<^NcA{*#dr!AHR3l`k; zZ!#~vFI~EXD_5?JnV!rWj#C-0?kiWW&=5o%4F4+fnl)>9Zf<`rBuPR}P7Y?xnuQA& zE@1ic<#_YWH__hSp4Po#r^EhOeS_;?qMaVEZ8cjt0EnUpP16t#htYB#x#}BS|KfDmIe^C# zO~l)3w(^{uS;)@Lf~M=>oa6H4%ZV&5kvF8IaEGwf*>F_ zFBeuxf~qLE(cKLI*iyb}%rK7AVPBm{U5Oa4?nsO`y1St&3apZZ+`L=}!pykeyL$C% z+k;YWq0X;2geMMXs@Dk>VDCd-N6pl~|u=baAwfeGdv za60Vg6Rv+`9J4HJ(NxJdqQ1e!W?9(8*Q!xqj3E>Xp|7tGfj|I~Btc*dIv+cXF3a*u z)fHQ&eSE#TVhfjL`K8g*bB1h!C(-&uEXo~COrNdl$E;yd~|}@ zANBbIcPFy^iS+gl%t>bX(Ox*vz`CzrN59VpRaF5nFeX4B8c!WblB6G5tya`MxqaG_ zaNU#Jxz%cgBuPISJx|v(FeX4%Rj8_pexDEB*RSJ+0}W}Pfg?{qELyY(7cX8M{vt*) zZ$5veQ?D|eVoeo>C*aP`PUiFZh7+*Q=R;>_CrdQ>Zr!?-bIuV~wTFj#yPpF9r^Eg^ zr^9|g(fPwxs}(ghHHIgmESuC5OLQJ&5JVAAKJi4-lkk&IJi&zzZ?1oRXXL!EKKAHoK@{;;SJz4abyln8^vHEd zXZ!c>XOZ4-WW4j@#f!te;AH#}nvr#;x@2yLnJg*K0e5zGvJD#spHqDCMPnY9VT>Wm zCcPC_wYz0acSxdepVMLQ0We1cyIa>aWJ=bzG%&+^!LneD^$tU3qIIq){=`{P6k&g{ zSXarivg+=oOZO^@g6{4c_lzu8-{5Kk(Ds{nIV=_{B#C21@h8p#Nc#iRjO3Co2`ydXOf^ZnGa^Y6Bx&;R@5jO_uzTwpT+3`0 z@pVZQ-jX%_ZU9SlCfqH8zh$$Cuh)M!xR#0Fh7Xw4H@NmDv;0IfO+#2w5SC@=x&}cM z#!X{RhrMLL??)gIFrwN?1p)yK`2BD?>?LDnGC&Xo=(>imEF-Ka!;hg6LdHs30`~cQ z@cDd(Ew8@8^^2i@KMUYlP1B(0eBRLPXNRT_mrHl`4K5avWeoK9gE4+OD=UAiuImqf zTsuKG;~M~Qu%$KWy^s-gd}H)H2B7N?e_WfDl~uQ?_EMmlUK-~+wBenisH8(e=q-SrbP z6Ho$9(*z6v>({U69UUFi%OWIA-RcQAt-qc`$(In4&eA#o6GBKjqXbL{Ats>&Ob8(+ a`Tqg!rO4X<@DbAh0000 Date: Mon, 8 Apr 2019 16:15:29 -0400 Subject: [PATCH 042/141] Ports Chemistry/NanoUI Fixes Early Direct port of https://github.com/PolarisSS13/Polaris/pull/6039 --- code/controllers/subsystems/nanoui.dm | 11 ++++- .../subsystems/processing/chemistry.dm | 12 +++-- code/modules/nano/nanomanager.dm | 16 +------ code/modules/reagents/Chemistry-Holder.dm | 46 ++++++++----------- 4 files changed, 36 insertions(+), 49 deletions(-) diff --git a/code/controllers/subsystems/nanoui.dm b/code/controllers/subsystems/nanoui.dm index c31449addc..7512ad872e 100644 --- a/code/controllers/subsystems/nanoui.dm +++ b/code/controllers/subsystems/nanoui.dm @@ -1,6 +1,6 @@ SUBSYSTEM_DEF(nanoui) name = "NanoUI" - wait = 20 + wait = 5 // a list of current open /nanoui UIs, grouped by src_object and ui_key var/list/open_uis = list() // a list of current open /nanoui UIs, not grouped, for use in processing @@ -23,6 +23,8 @@ SUBSYSTEM_DEF(nanoui) if(copytext(filename, length(filename)) != "/") // filenames which end in "/" are actually directories, which we want to ignore if(fexists(path + filename)) asset_files.Add(fcopy_rsc(path + filename)) // add this file to asset_files for sending to clients when they connect + for(var/i in GLOB.clients) + addtimer(CALLBACK(src, .proc/send_resources, i), 10) return ..() /datum/controller/subsystem/nanoui/Recover() @@ -40,3 +42,10 @@ SUBSYSTEM_DEF(nanoui) for(var/thing in processing_uis) var/datum/nanoui/UI = thing UI.process() + +//Sends asset files to a client, called on client/New() +/datum/controller/subsystem/nanoui/proc/send_resources(client) + if(!subsystem_initialized) + return + for(var/file in asset_files) + client << browse_rsc(file) // send the file to the client \ No newline at end of file diff --git a/code/controllers/subsystems/processing/chemistry.dm b/code/controllers/subsystems/processing/chemistry.dm index 67b74d3ab6..34094f9fe3 100644 --- a/code/controllers/subsystems/processing/chemistry.dm +++ b/code/controllers/subsystems/processing/chemistry.dm @@ -4,6 +4,7 @@ PROCESSING_SUBSYSTEM_DEF(chemistry) flags = SS_BACKGROUND|SS_POST_FIRE_TIMING init_order = INIT_ORDER_CHEMISTRY var/list/chemical_reactions = list() + var/list/chemical_reactions_by_reagent = list() var/list/chemical_reagents = list() /datum/controller/subsystem/processing/chemistry/Recover() @@ -22,15 +23,16 @@ PROCESSING_SUBSYSTEM_DEF(chemistry) // more than one chemical it will still only appear in only one of the sublists. /datum/controller/subsystem/processing/chemistry/proc/initialize_chemical_reactions() var/paths = typesof(/datum/chemical_reaction) - /datum/chemical_reaction - SSchemistry.chemical_reactions = list() + chemical_reactions = list() + chemical_reactions_by_reagent = list() for(var/path in paths) - var/datum/chemical_reaction/D = new path() + var/datum/chemical_reaction/D = new path + chemical_reactions += D if(D.required_reagents && D.required_reagents.len) var/reagent_id = D.required_reagents[1] - if(!chemical_reactions[reagent_id]) - chemical_reactions[reagent_id] = list() - chemical_reactions[reagent_id] += D + LAZYINITLIST(chemical_reactions_by_reagent[reagent_id]) + chemical_reactions_by_reagent[reagent_id] += D //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id /datum/controller/subsystem/processing/chemistry/proc/initialize_chemical_reagents() diff --git a/code/modules/nano/nanomanager.dm b/code/modules/nano/nanomanager.dm index afa779895a..69b0e7b77e 100644 --- a/code/modules/nano/nanomanager.dm +++ b/code/modules/nano/nanomanager.dm @@ -221,18 +221,4 @@ oldMob.open_uis.Cut() - return 1 // success - - /** - * Sends all nano assets to the client - * This is called on user login - * - * @param client /client The user's client - * - * @return nothing - */ - -/datum/controller/subsystem/nanoui/proc/send_resources(client) - for(var/file in asset_files) - client << browse_rsc(file) // send the file to the client - + return 1 // success \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 2d906381d1..7a39bfcb32 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -77,41 +77,31 @@ return /datum/reagents/proc/handle_reactions() - START_PROCESSING(SSchemistry, src) - -//returns 1 if the holder should continue reactiong, 0 otherwise. -/datum/reagents/process() - if(QDELETED(my_atom)) //No container, no reaction. - return PROCESS_KILL - if(my_atom.flags & NOREACT) // No reactions here - return PROCESS_KILL - - var/reaction_occured - var/list/effect_reactions = list() + if(QDELETED(my_atom)) + return FALSE + if(my_atom.flags & NOREACT) + return FALSE + var/reaction_occurred var/list/eligible_reactions = list() - for(var/i in 1 to PROCESS_REACTION_ITER) - reaction_occured = 0 + var/list/effect_reactions = list() + do + reaction_occurred = FALSE + for(var/i in reagent_list) + var/datum/reagent/R = i + eligible_reactions |= SSchemistry.chemical_reactions_by_reagent[R.id] - //need to rebuild this to account for chain reactions - for(var/datum/reagent/R in reagent_list) - eligible_reactions |= SSchemistry.chemical_reactions[R.id] - - for(var/datum/chemical_reaction/C in eligible_reactions) + for(var/i in eligible_reactions) + var/datum/chemical_reaction/C = i if(C.can_happen(src) && C.process(src)) effect_reactions |= C - reaction_occured = 1 - eligible_reactions.Cut() - - if(!reaction_occured) - break - - for(var/datum/chemical_reaction/C in effect_reactions) + reaction_occurred = TRUE + eligible_reactions.len = 0 + while(reaction_occurred) + for(var/i in effect_reactions) + var/datum/chemical_reaction/C = i C.post_reaction(src) - update_total() - if(!reaction_occured) - return PROCESS_KILL /* Holder-to-chemical */ From 26317c4017adbc7ab195299e9fcc2f70fd1a8e82 Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 8 Apr 2019 16:18:53 -0400 Subject: [PATCH 043/141] Removes whitespace --- code/modules/reagents/Chemistry-Holder.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 7a39bfcb32..4d863d8046 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -94,7 +94,6 @@ var/datum/chemical_reaction/C = i if(C.can_happen(src) && C.process(src)) effect_reactions |= C - reaction_occurred = TRUE eligible_reactions.len = 0 while(reaction_occurred) From 261e71f34aea3bf1cd702a467d0440c9b778e129 Mon Sep 17 00:00:00 2001 From: Heroman Date: Tue, 9 Apr 2019 07:14:55 +1000 Subject: [PATCH 044/141] Weird hooks, no vorestation edits --- code/game/machinery/doors/door.dm | 117 +++++++++++++++++++-------- code/game/machinery/doors/door_vr.dm | 6 +- 2 files changed, 87 insertions(+), 36 deletions(-) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index c25bde5ed6..d6981cd86d 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -27,7 +27,7 @@ var/destroy_hits = 10 //How many strong hits it takes to destroy the door var/min_force = 10 //minimum amount of force needed to damage the door with a melee weapon var/hitsound = 'sound/weapons/smash.ogg' //sound door makes when hit with a weapon - var/obj/item/stack/material/steel/repairing + var/repairing var/block_air_zones = 1 //If set, air zones cannot merge across the door even when it is opened. var/close_door_at = 0 //When to automatically close the door, if possible @@ -209,18 +209,64 @@ /obj/machinery/door/attackby(obj/item/I as obj, mob/user as mob) src.add_fingerprint(user) - if (attempt_vr(src,"attackby_vr",list(I, user))) return + //if (attempt_vr(src,"attackby_vr",list(I, user))) return if(istype(I)) - if(istype(I, /obj/item/stack/material) && I.get_material_name() == src.get_material_name()) - if(stat & BROKEN) - user << "It looks like \the [src] is pretty busted. It's going to need more than just patching up now." - return - if(health >= maxhealth) - user << "Nothing to fix!" + //VOREStation addition begin: Fireproofing + if(istype(I, /obj/item/stack/material) && I.get_material_name() == plasteel") + if((stat & BROKEN) || (health >= maxhealth)) + to_chat(user, "It looks like \the [src] broken. Repair it before reinforcing it.") return if(!density) - user << "\The [src] must be closed before you can repair it." + to_chat(user, "\The [src] must be closed before you can reinforce it.") + return + + var/amount_needed = 2 + + var/obj/item/stack/stack = I + var/amount_given = amount_needed - reinforcing + var/mats_given = stack.get_amount() + if(reinforcing && amount_given <= 0) + to_chat(user, "You must weld or remove \the plasteel from \the [src] before you can add anything else.") + else + if(mats_given >= amount_given) + if(stack.use(amount_given)) + reinforcing += amount_given + else + if(stack.use(mats_given)) + reinforcing += mats_given + amount_given = mats_given + if(amount_given) + to_chat(user, "You fit [amount_given] [stack.singular_name]\s on \the [src].") + + return + + if(reinforcing && istype(I, /obj/item/weapon/weldingtool)) + if(!density) + to_chat(user, "\The [src] must be closed before you can reinforce it.") + return + + var/obj/item/weapon/weldingtool/welder = I + if(welder.remove_fuel(0,user)) + to_chat(user, "You start weld \the [repairing] into place.") + playsound(src, welder.usesound, 50, 1) + if(do_after(user, (5 * repairing) * welder.toolspeed) && welder && welder.isOn()) + to_chat(user, "You finish repairing the damage to \the [src].") + health = between(health, health + repairing*DOOR_REPAIR_AMOUNT, maxhealth) + update_icon() + repairing = 0 + return + //VOREStation addition begin: Fireproofing + + if(istype(I, /obj/item/stack/material) && I.get_material_name() == src.get_material_name()) + if(stat & BROKEN) + to_chat(user, "It looks like \the [src] is pretty busted. It's going to need more than just patching up now.") + return + if(health >= maxhealth) + to_chat(user, "Nothing to fix!") + return + if(!density) + to_chat(user, "\The [src] must be closed before you can repair it.") return //figure out how much metal we need @@ -228,44 +274,45 @@ amount_needed = (round(amount_needed) == amount_needed)? amount_needed : round(amount_needed) + 1 //Why does BYOND not have a ceiling proc? var/obj/item/stack/stack = I - var/transfer - if (repairing) - transfer = stack.transfer_to(repairing, amount_needed - repairing.amount) - if (!transfer) - user << "You must weld or remove \the [repairing] from \the [src] before you can add anything else." + var/amount_given = amount_needed - repairing + var/mats_given = stack.get_amount() + if(repairing && amount_given <= 0) + to_chat(user, "You must weld or remove \the [get_material_name()] from \the [src] before you can add anything else.") else - repairing = stack.split(amount_needed) - if (repairing) - repairing.loc = src - transfer = repairing.amount - - if (transfer) - user << "You fit [transfer] [stack.singular_name]\s to damaged and broken parts on \the [src]." + if(mats_given >= amount_given) + if(stack.use(amount_given)) + repairing += amount_given + else + if(stack.use(mats_given)) + repairing += mats_given + amount_given = mats_given + if(amount_given) + to_chat(user, "You fit [amount_given] [stack.singular_name]\s to damaged and broken parts on \the [src].") return if(repairing && istype(I, /obj/item/weapon/weldingtool)) if(!density) - user << "\The [src] must be closed before you can repair it." + to_chat(user, "\The [src] must be closed before you can repair it.") return var/obj/item/weapon/weldingtool/welder = I if(welder.remove_fuel(0,user)) - user << "You start to fix dents and weld \the [repairing] into place." + to_chat(user, "You start to fix dents and weld \the [repairing] into place.") playsound(src, welder.usesound, 50, 1) - if(do_after(user, (5 * repairing.amount) * welder.toolspeed) && welder && welder.isOn()) - user << "You finish repairing the damage to \the [src]." - health = between(health, health + repairing.amount*DOOR_REPAIR_AMOUNT, maxhealth) + if(do_after(user, (5 * repairing) * welder.toolspeed) && welder && welder.isOn()) + to_chat(user, "You finish repairing the damage to \the [src].") + health = between(health, health + repairing*DOOR_REPAIR_AMOUNT, maxhealth) update_icon() - qdel(repairing) - repairing = null + repairing = 0 return if(repairing && I.is_crowbar()) - user << "You remove \the [repairing]." + var/obj/item/stack/material/repairing_sheet = get_material().place_sheet(loc) + repairing_sheet.amount += repairing-1 + repairing = 0 + to_chat(user, "You remove \the [repairing_sheet].") playsound(src, I.usesound, 100, 1) - repairing.loc = user.loc - repairing = null return //psa to whoever coded this, there are plenty of objects that need to call attack() on doors without bludgeoning them. @@ -325,13 +372,13 @@ /obj/machinery/door/examine(mob/user) . = ..() if(src.health <= 0) - user << "\The [src] is broken!" + to_chat(user, "\The [src] is broken!") if(src.health < src.maxhealth / 4) - user << "\The [src] looks like it's about to break!" + to_chat(user, "\The [src] looks like it's about to break!") else if(src.health < src.maxhealth / 2) - user << "\The [src] looks seriously damaged!" + to_chat(user, "\The [src] looks seriously damaged!") else if(src.health < src.maxhealth * 3/4) - user << "\The [src] shows signs of damage!" + to_chat(user, "\The [src] shows signs of damage!") /obj/machinery/door/proc/set_broken() diff --git a/code/game/machinery/doors/door_vr.dm b/code/game/machinery/doors/door_vr.dm index 58d84e2d7c..b8f820faa7 100644 --- a/code/game/machinery/doors/door_vr.dm +++ b/code/game/machinery/doors/door_vr.dm @@ -3,7 +3,7 @@ D.fire_act(adj_air, adj_temp, adj_volume) /obj/machinery/door - var/obj/item/stack/material/plasteel/reinforcing //vorestation addition + var/reinforcing = 0 //vorestation addition /obj/machinery/door/firedoor heat_proof = 1 @@ -33,6 +33,9 @@ return ..() + + +/* /obj/machinery/door/proc/attackby_vr(obj/item/I as obj, mob/user as mob) if(istype(I, /obj/item/stack/material) && I.get_material_name() == "plasteel") // Add heat shielding if it isn't already. if(!heat_proof) @@ -140,6 +143,7 @@ reinforcing = null return 1 return 0 +*/ /obj/machinery/door/blast/regular/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) return // blast doors are immune to fire completely. From a0030dc15f00ea859774e472cf3a5229a47a35ab Mon Sep 17 00:00:00 2001 From: Heroman3003 <31296024+Heroman3003@users.noreply.github.com> Date: Tue, 9 Apr 2019 08:23:08 +1000 Subject: [PATCH 045/141] Fixes borg/drone door repair/reinforcement --- code/game/machinery/doors/door.dm | 50 +-------- code/game/machinery/doors/door_vr.dm | 149 +++++++++------------------ 2 files changed, 52 insertions(+), 147 deletions(-) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index d6981cd86d..0d7f8bb5e3 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -209,55 +209,9 @@ /obj/machinery/door/attackby(obj/item/I as obj, mob/user as mob) src.add_fingerprint(user) - //if (attempt_vr(src,"attackby_vr",list(I, user))) return - if(istype(I)) - //VOREStation addition begin: Fireproofing - if(istype(I, /obj/item/stack/material) && I.get_material_name() == plasteel") - if((stat & BROKEN) || (health >= maxhealth)) - to_chat(user, "It looks like \the [src] broken. Repair it before reinforcing it.") - return - if(!density) - to_chat(user, "\The [src] must be closed before you can reinforce it.") - return - - var/amount_needed = 2 - - var/obj/item/stack/stack = I - var/amount_given = amount_needed - reinforcing - var/mats_given = stack.get_amount() - if(reinforcing && amount_given <= 0) - to_chat(user, "You must weld or remove \the plasteel from \the [src] before you can add anything else.") - else - if(mats_given >= amount_given) - if(stack.use(amount_given)) - reinforcing += amount_given - else - if(stack.use(mats_given)) - reinforcing += mats_given - amount_given = mats_given - if(amount_given) - to_chat(user, "You fit [amount_given] [stack.singular_name]\s on \the [src].") - - return - - if(reinforcing && istype(I, /obj/item/weapon/weldingtool)) - if(!density) - to_chat(user, "\The [src] must be closed before you can reinforce it.") - return - - var/obj/item/weapon/weldingtool/welder = I - if(welder.remove_fuel(0,user)) - to_chat(user, "You start weld \the [repairing] into place.") - playsound(src, welder.usesound, 50, 1) - if(do_after(user, (5 * repairing) * welder.toolspeed) && welder && welder.isOn()) - to_chat(user, "You finish repairing the damage to \the [src].") - health = between(health, health + repairing*DOOR_REPAIR_AMOUNT, maxhealth) - update_icon() - repairing = 0 - return - //VOREStation addition begin: Fireproofing - + if(attackby_vr(I, user)) //VOREStation begin: Fireproofing + return //VOREStation begin: Fireproofing if(istype(I, /obj/item/stack/material) && I.get_material_name() == src.get_material_name()) if(stat & BROKEN) to_chat(user, "It looks like \the [src] is pretty busted. It's going to need more than just patching up now.") diff --git a/code/game/machinery/doors/door_vr.dm b/code/game/machinery/doors/door_vr.dm index b8f820faa7..024162bc35 100644 --- a/code/game/machinery/doors/door_vr.dm +++ b/code/game/machinery/doors/door_vr.dm @@ -33,117 +33,68 @@ return ..() - - -/* +// Returns true only if one of the actions unique to reinforcing is done, otherwise false and continuing normal attackby /obj/machinery/door/proc/attackby_vr(obj/item/I as obj, mob/user as mob) - if(istype(I, /obj/item/stack/material) && I.get_material_name() == "plasteel") // Add heat shielding if it isn't already. - if(!heat_proof) - var/obj/item/stack/stack = I - var/transfer - var/amount_needed = 2 - if(stat & BROKEN) - user << "It looks like \the [src] is pretty busted." - if (reinforcing) - transfer = stack.transfer_to(reinforcing, amount_needed - reinforcing.amount) - if (!transfer) - user << "You must weld or remove \the [reinforcing] from \the [src] before you can add anything else." - return 1 + if(istype(I, /obj/item/stack/material) && I.get_material_name() == "plasteel") + if(heat_proof) + to_chat(user, "\The [src] is already reinforced.") + return TRUE + if((stat & BROKEN) || (health < maxhealth)) + to_chat(user, "It looks like \the [src] broken. Repair it before reinforcing it.") + return TRUE + if(!density) + to_chat(user, "\The [src] must be closed before you can reinforce it.") + return TRUE + + var/amount_needed = 2 + + var/obj/item/stack/stack = I + var/amount_given = amount_needed - reinforcing + var/mats_given = stack.get_amount() + if(reinforcing && amount_given <= 0) + to_chat(user, "You must weld or remove \the plasteel from \the [src] before you can add anything else.") + else + if(mats_given >= amount_given) + if(stack.use(amount_given)) + reinforcing += amount_given else - reinforcing = stack.split(amount_needed) - if (reinforcing) - reinforcing.loc = src - transfer = reinforcing.amount - - if (transfer) - user << "You fit [transfer] [stack.singular_name]\s to \the [src]." - return 1 - - if(istype(I, /obj/item/stack/material) && I.get_material_name() == src.get_material_name()) - if(stat & BROKEN) - if(health >= maxhealth && destroy_hits >= 10) - user << "The [src] is about as shored up as it's going to get." - return 1 - if(!density) - user << "\The [src] must be closed before you can repair it." - return 1 - - //figure out how much metal we need - var/amount_needed = (maxhealth - health) / DOOR_REPAIR_AMOUNT - if (destroy_hits < 10) - amount_needed += (20*(10 - destroy_hits) / DOOR_REPAIR_AMOUNT) - amount_needed = (round(amount_needed) == amount_needed)? amount_needed : round(amount_needed) + 1 //Why does BYOND not have a ceiling proc? - - var/obj/item/stack/stack = I - var/transfer - if (repairing) - transfer = stack.transfer_to(repairing, amount_needed - repairing.amount) - if (!transfer) - user << "You must weld or remove \the [repairing] from \the [src] before you can add anything else." - else - repairing = stack.split(amount_needed) - if (repairing) - repairing.loc = src - transfer = repairing.amount - - if (transfer) - user << "\The [src] is completely broken inside, but you manage to fit [transfer] [stack.singular_name]\s to shore it up." - - return 1 - - return 0 + if(stack.use(mats_given)) + reinforcing += mats_given + amount_given = mats_given + if(amount_given) + to_chat(user, "You fit [amount_given] [stack.singular_name]\s on \the [src].") + return TRUE if(reinforcing && istype(I, /obj/item/weapon/weldingtool)) - var/amount_needed = 2 if(!density) - user << "\The [src] must be closed before you can repair it." - return 1 - if (reinforcing.amount < amount_needed) - user << "You need [amount_needed] [reinforcing.singular_name]\s to reinforce \the [src]." - return 1 + to_chat(user, "\The [src] must be closed before you can reinforce it.") + return TRUE + + if(reinforcing < 2) + to_chat(user, "You will need more plasteel to reinforce \the [src].") + return TRUE + var/obj/item/weapon/weldingtool/welder = I if(welder.remove_fuel(0,user)) - user << "You start to weld \the [reinforcing] into place." - playsound(src, 'sound/items/Welder.ogg', 100, 1) - if(do_after(user, 5 * reinforcing.amount) && welder && welder.isOn()) - user << "You finish reinforcing \the [src]." + to_chat(user, "You start weld \the plasteel into place.") + playsound(src, welder.usesound, 50, 1) + if(do_after(user, 10 * welder.toolspeed) && welder && welder.isOn()) + to_chat(user, "You finish reinforcing \the [src].") heat_proof = 1 update_icon() - qdel(reinforcing) - reinforcing = null - return 1 - - if(repairing && istype(I, /obj/item/weapon/weldingtool) && (stat & BROKEN)) - if(!density) - user << "\The [src] must be closed before you can shore it up." - return 1 - - var/obj/item/weapon/weldingtool/welder = I - if(welder.remove_fuel(0,user)) - user << "You start to weld \the [repairing] into place." - playsound(src, 'sound/items/Welder.ogg', 100, 1) - if(do_after(user, 5 * repairing.amount) && welder && welder.isOn()) - user << "You finish shoring up \the [src]. It'll hold for at least a little while." - var/damagerepaired = repairing.amount*DOOR_REPAIR_AMOUNT - if (destroy_hits < 10) - var/severedamage = 10 - destroy_hits - destroy_hits = between(destroy_hits, destroy_hits + (damagerepaired)/20, 10) - damagerepaired -= 20 * severedamage - health = between(health, health + damagerepaired, maxhealth) - update_icon() - qdel(repairing) - repairing = null - return 1 + reinforcing = 0 + return TRUE if(reinforcing && I.is_crowbar()) - user << "You remove \the [reinforcing]." - playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) - reinforcing.loc = user.loc - reinforcing = null - return 1 - return 0 -*/ + var/obj/item/stack/material/plasteel/reinforcing_sheet = new /obj/item/stack/material/plasteel(src.loc) + reinforcing_sheet.amount = reinforcing + reinforcing = 0 + to_chat(user, "You remove \the [reinforcing_sheet].") + playsound(src, I.usesound, 100, 1) + return TRUE + + return FALSE /obj/machinery/door/blast/regular/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) return // blast doors are immune to fire completely. From b690ef5e902b8b74d3288e600b213bd4864c54a7 Mon Sep 17 00:00:00 2001 From: Heroman3003 <31296024+Heroman3003@users.noreply.github.com> Date: Tue, 9 Apr 2019 08:37:10 +1000 Subject: [PATCH 046/141] Readds timeclock terminal near bar --- maps/tether/tether-03-surface3.dmm | 1 + 1 file changed, 1 insertion(+) diff --git a/maps/tether/tether-03-surface3.dmm b/maps/tether/tether-03-surface3.dmm index d62592f183..0c2ad7a327 100644 --- a/maps/tether/tether-03-surface3.dmm +++ b/maps/tether/tether-03-surface3.dmm @@ -16919,6 +16919,7 @@ /turf/simulated/floor/tiled, /area/hallway/lower/third_south) "DW" = ( +/obj/machinery/computer/timeclock/premade/east, /obj/structure/cable/green{ d1 = 1; d2 = 2; From 1975184f81ac7238e07853eb61f3679a1bb56709 Mon Sep 17 00:00:00 2001 From: Heroman3003 <31296024+Heroman3003@users.noreply.github.com> Date: Tue, 9 Apr 2019 08:45:10 +1000 Subject: [PATCH 047/141] Removes promethean language restriction --- .../mob/living/carbon/human/species/station/prometheans_vr.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm b/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm index 5a09e5f04a..633a851ddc 100644 --- a/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm @@ -16,7 +16,6 @@ color_mult = 1 mob_size = MOB_MEDIUM //As of writing, original was MOB_SMALL - Allows normal swapping (good) - num_alternate_languages = 1 //Might be outdated: They currently have 3 in the other file trashcan = 1 //They have goopy bodies. They can just dissolve things within them. appearance_flags = HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_HAIR_COLOR | RADIATION_GLOWS | HAS_UNDERWEAR From 22c473c21086a5647bac2e71b9324fa6477bfed6 Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 8 Apr 2019 19:06:56 -0400 Subject: [PATCH 052/141] Fixes ERT Shuttle ...Our shuttle code is really old, but this is a temporary solution in the meantime. --- maps/tether/tether_shuttle_defs.dm | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/maps/tether/tether_shuttle_defs.dm b/maps/tether/tether_shuttle_defs.dm index f1db714808..f72ebce35c 100644 --- a/maps/tether/tether_shuttle_defs.dm +++ b/maps/tether/tether_shuttle_defs.dm @@ -173,6 +173,19 @@ departure_message = "Attention. A unregistered vessel is now leaving Virgo-3B." ..() +/datum/shuttle/ferry/multidock/specops/ert + name = "Special Operations" + location = 0 + warmup_time = 10 + area_offsite = /area/shuttle/specops/station //centcom is the home station, the Exodus is offsite + area_station = /area/shuttle/specops/centcom + docking_controller_tag = "specops_shuttle_port" + docking_controller_tag_station = "specops_shuttle_port" + docking_controller_tag_offsite = "specops_shuttle_fore" + dock_target_station = "specops_centcom_dock" + dock_target_offsite = "specops_dock_airlock" + + ////////////////////////////////////////////////////////////// // RogueMiner "Belter: Shuttle // TODO - Not implemented yet on new map From df9948018531ef527c5c7a21f6e3ad79dbbbf8bf Mon Sep 17 00:00:00 2001 From: Heroman3003 <31296024+Heroman3003@users.noreply.github.com> Date: Tue, 9 Apr 2019 09:53:49 +1000 Subject: [PATCH 053/141] Fixes some problems with species TF --- code/modules/vore/eating/transforming_vr.dm | 33 +++++++++++---------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/code/modules/vore/eating/transforming_vr.dm b/code/modules/vore/eating/transforming_vr.dm index a3ad00ab7a..e4cb82b7a4 100644 --- a/code/modules/vore/eating/transforming_vr.dm +++ b/code/modules/vore/eating/transforming_vr.dm @@ -215,13 +215,15 @@ if(!istype(M) || !istype(O)) return - if (M.species == "Promethean" && O.species != "Promethean") //If the person was a promethean before TF, remove all their verbs! - M.verbs -= /mob/living/carbon/human/proc/shapeshifter_select_shape - M.verbs -= /mob/living/carbon/human/proc/shapeshifter_select_colour - M.verbs -= /mob/living/carbon/human/proc/shapeshifter_select_hair - M.verbs -= /mob/living/carbon/human/proc/shapeshifter_select_gender - M.verbs -= /mob/living/carbon/human/proc/regenerate - M.verbs -= /mob/living/proc/set_size + M.verbs -= M.species.inherent_verbs //Take away their unique stuff + + var/list/backup_implants = list() + for(var/obj/item/organ/I in M.organs) + for(var/obj/item/weapon/implant/backup/BI in I.contents) + backup_implants += BI + if(backup_implants.len) + for(var/obj/item/weapon/implant/backup/BI in backup_implants) + BI.forceMove(src) M.species = O.species M.custom_species = O.custom_species @@ -235,17 +237,18 @@ M.fixblood() M.update_icons_body() M.update_tail_showing() + + if(backup_implants.len) + var/obj/item/organ/external/torso = M.get_organ(BP_TORSO) + for(var/obj/item/weapon/implant/backup/BI in backup_implants) + BI.forceMove(torso) + torso.implants += BI + + if(message) to_chat(M, "You lose sensation of your body, feeling only the warmth of everything around you... ") to_chat(O, "Your body shifts as you make dramatic changes to your captive's body.") - if (M.species == "Promethean") //Did they get TF'd into a promethean? - M.verbs += /mob/living/carbon/human/proc/shapeshifter_select_shape - M.verbs += /mob/living/carbon/human/proc/shapeshifter_select_colour - M.verbs += /mob/living/carbon/human/proc/shapeshifter_select_hair - M.verbs += /mob/living/carbon/human/proc/shapeshifter_select_gender - M.verbs += /mob/living/carbon/human/proc/regenerate - M.verbs += /mob/living/proc/set_size - M.shapeshifter_select_shape() + M.verbs += M.species.inherent_verbs //Give new unique stuff /obj/belly/proc/put_in_egg(var/atom/movable/M, message=0) var/mob/living/carbon/human/O = owner From b85d43bc218797bcbdf1d85197895c81a243beb7 Mon Sep 17 00:00:00 2001 From: Heroman3003 <31296024+Heroman3003@users.noreply.github.com> Date: Tue, 9 Apr 2019 10:28:55 +1000 Subject: [PATCH 054/141] Allows ghosts with backups to ping medical again --- code/controllers/subsystems/transcore_vr.dm | 10 +++++++--- code/modules/mob/dead/observer/observer_vr.dm | 20 +++++++++++++++++++ code/modules/resleeving/infocore_records.dm | 1 + 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/code/controllers/subsystems/transcore_vr.dm b/code/controllers/subsystems/transcore_vr.dm index ddac25ee83..ddfb679932 100644 --- a/code/controllers/subsystems/transcore_vr.dm +++ b/code/controllers/subsystems/transcore_vr.dm @@ -56,7 +56,7 @@ SUBSYSTEM_DEF(transcore) implants -= imp continue - //In a human + //In a human BITSET(H.hud_updateflag, BACKUP_HUD) if(H == imp.imp_in && H.mind && H.stat < DEAD) @@ -93,6 +93,7 @@ SUBSYSTEM_DEF(transcore) else if(curr_MR.dead_state != MR_DEAD) //First time switching to dead notify(name) + curr_MR.last_notification = world.time curr_MR.dead_state = MR_DEAD if(MC_TICK_CHECK) @@ -158,9 +159,12 @@ SUBSYSTEM_DEF(transcore) return 1 // Send a past-due notification to the medical radio channel. -/datum/controller/subsystem/transcore/proc/notify(var/name) +/datum/controller/subsystem/transcore/proc/notify(var/name, var/repeated = FALSE) ASSERT(name) - global_announcer.autosay("[name] is past-due for a mind backup. This will be the only notification.", "TransCore Oversight", "Medical") + if(repeated) + global_announcer.autosay("This is a repeat notification that [name] is past-due for a mind backup.", "TransCore Oversight", "Medical") + else + global_announcer.autosay("[name] is past-due for a mind backup.", "TransCore Oversight", "Medical") // Called from mind_record to add itself to the transcore. /datum/controller/subsystem/transcore/proc/add_backup(var/datum/transhuman/mind_record/MR) diff --git a/code/modules/mob/dead/observer/observer_vr.dm b/code/modules/mob/dead/observer/observer_vr.dm index 97280c78b9..a0079cbee4 100644 --- a/code/modules/mob/dead/observer/observer_vr.dm +++ b/code/modules/mob/dead/observer/observer_vr.dm @@ -56,3 +56,23 @@ mind.active = TRUE SC.catch_mob(src) //This will result in us being deleted so... + +/mob/observer/dead/verb/backup_ping() + set category = "Ghost" + set name = "Notify Transcore" + set desc = "If your past-due backup notification was missed or ignored, you can use this to send a new one." + + var/record_found = FALSE + for(var/datum/transhuman/mind_record/record in SStranscore.backed_up) + if(record.ckey == ckey) + record_found = TRUE + if(!(record.dead_state == MR_DEAD)) + to_chat(src, "Your backup is not past-due yet.") + else if((world.time - record.last_notification) < 10 MINUTES) + to_chat(src, "Too little time has passed since your last notification.") + else + SStranscore.notify(record.mindname, TRUE) + to_chat(src, "New notification has been sent.") + + if(!record_found) + to_chat(src, "No mind record found!") \ No newline at end of file diff --git a/code/modules/resleeving/infocore_records.dm b/code/modules/resleeving/infocore_records.dm index 834b067e9d..134d2be87d 100644 --- a/code/modules/resleeving/infocore_records.dm +++ b/code/modules/resleeving/infocore_records.dm @@ -14,6 +14,7 @@ //0: Normal, 1: Might be dead, 2: Definitely dead, show on console var/dead_state = 0 var/last_update = 0 + var/last_notification //Backend var/ckey = "" From 97d35171e1eeb23b6aa4692b1363272db524908e Mon Sep 17 00:00:00 2001 From: Heroman3003 <31296024+Heroman3003@users.noreply.github.com> Date: Tue, 9 Apr 2019 10:34:55 +1000 Subject: [PATCH 055/141] Fixes notification spammability (whoops) --- code/modules/mob/dead/observer/observer_vr.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/mob/dead/observer/observer_vr.dm b/code/modules/mob/dead/observer/observer_vr.dm index a0079cbee4..9b7566dd73 100644 --- a/code/modules/mob/dead/observer/observer_vr.dm +++ b/code/modules/mob/dead/observer/observer_vr.dm @@ -72,6 +72,7 @@ to_chat(src, "Too little time has passed since your last notification.") else SStranscore.notify(record.mindname, TRUE) + record.last_notification = world.time to_chat(src, "New notification has been sent.") if(!record_found) From 6cc3d0a2c421b0c4d13d56073f75d55a083b9be6 Mon Sep 17 00:00:00 2001 From: Heroman Date: Tue, 9 Apr 2019 18:35:50 +1000 Subject: [PATCH 058/141] Fixes promethean transformation --- code/modules/mob/living/carbon/human/human.dm | 19 +++++++++--- .../modules/reagents/Chemistry-Reagents_vr.dm | 30 ++++++++++++++----- code/modules/vore/eating/bellymodes_tf_vr.dm | 8 ++--- code/modules/vore/eating/transforming_vr.dm | 20 +++++-------- 4 files changed, 50 insertions(+), 27 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 9af501a92e..389b24f19f 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1102,7 +1102,7 @@ else usr << "You failed to check the pulse. Try again." -/mob/living/carbon/human/proc/set_species(var/new_species, var/default_colour, var/regen_icons = TRUE) +/mob/living/carbon/human/proc/set_species(var/new_species, var/default_colour, var/regen_icons = TRUE, var/mob/living/carbon/human/example = null) //VOREStation Edit - send an example if(!dna) if(!new_species) @@ -1139,7 +1139,15 @@ if(species.default_language) add_language(species.default_language) - if(species.base_color) //VOREStation Edit - Always give them a basse color + //if(species.icon_scale != 1) //VOREStation Removal + // update_transform() //VOREStation Removal + + if(example) //VOREStation Edit begin + if(!(example == src)) + r_skin = example.r_skin + g_skin = example.g_skin + b_skin = example.b_skin + else if(species.base_color) //VOREStation Edit end //Apply colour. r_skin = hex2num(copytext(species.base_color,2,4)) g_skin = hex2num(copytext(species.base_color,4,6)) @@ -1157,10 +1165,13 @@ //icon_state = lowertext(species.name) //Necessary? - species.create_organs(src) - + //VOREStation Edit start: swap places of those two procs species.handle_post_spawn(src) + species.create_organs(src) + //VOREStation Edit end: swap places of those two procs + + maxHealth = species.total_health if(LAZYLEN(descriptors)) diff --git a/code/modules/reagents/Chemistry-Reagents_vr.dm b/code/modules/reagents/Chemistry-Reagents_vr.dm index b841375b84..3244d9a02e 100644 --- a/code/modules/reagents/Chemistry-Reagents_vr.dm +++ b/code/modules/reagents/Chemistry-Reagents_vr.dm @@ -9,16 +9,32 @@ if(ishuman(M)) var/mob/living/carbon/human/H = M if(H.species.name != "Promethean") - M << "Your flesh rapidly mutates!" + to_chat(M, "Your flesh rapidly mutates!") + + var/list/backup_implants = list() + for(var/obj/item/organ/I in H.organs) + for(var/obj/item/weapon/implant/backup/BI in I.contents) + backup_implants += BI + if(backup_implants.len) + for(var/obj/item/weapon/implant/backup/BI in backup_implants) + BI.forceMove(src) + H.set_species("Promethean") - H.verbs += /mob/living/carbon/human/proc/shapeshifter_select_shape - H.verbs += /mob/living/carbon/human/proc/shapeshifter_select_colour - H.verbs += /mob/living/carbon/human/proc/shapeshifter_select_hair - H.verbs += /mob/living/carbon/human/proc/shapeshifter_select_gender - H.verbs += /mob/living/carbon/human/proc/regenerate - H.verbs += /mob/living/proc/set_size H.shapeshifter_set_colour("#05FF9B") //They can still change their color. + if(backup_implants.len) + var/obj/item/organ/external/torso = H.get_organ(BP_TORSO) + for(var/obj/item/weapon/implant/backup/BI in backup_implants) + BI.forceMove(torso) + torso.implants += BI + +/obj/item/weapon/reagent_containers/pill/amt + name = "amt pill" + +/obj/item/weapon/reagent_containers/pill/amt/Initialize() + . = ..() + reagents.add_reagent("advmutationtoxin", 1) + /datum/chemical_reaction/slime/sapphire_mutation name = "Slime Mutation Toxins" id = "slime_mutation_tox" diff --git a/code/modules/vore/eating/bellymodes_tf_vr.dm b/code/modules/vore/eating/bellymodes_tf_vr.dm index 1f638f4f98..d2a379a336 100644 --- a/code/modules/vore/eating/bellymodes_tf_vr.dm +++ b/code/modules/vore/eating/bellymodes_tf_vr.dm @@ -97,7 +97,7 @@ change_ears(P) change_tail_nocolor(P) change_wing_nocolor(P) - change_species(P,1) + change_species(P,1,1) ///////////////////////////// DM_TRANSFORM_REPLICA ///////////////////////////// else if(mode == DM_TRANSFORM_REPLICA) @@ -122,7 +122,7 @@ change_ears(P) change_tail(P) change_wing(P) - change_species(P,1) + change_species(P,1,2) ///////////////////////////// DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG ///////////////////////////// else if(mode == DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG) @@ -134,7 +134,7 @@ change_ears(P) change_tail_nocolor(P) change_wing_nocolor(P) - change_species(P,1) + change_species(P,1,1) continue if(!P.absorbed) @@ -177,7 +177,7 @@ change_ears(P) change_tail(P) change_wing(P) - change_species(P,1) + change_species(P,1,2) continue if(!P.absorbed) diff --git a/code/modules/vore/eating/transforming_vr.dm b/code/modules/vore/eating/transforming_vr.dm index e4cb82b7a4..2f261980ec 100644 --- a/code/modules/vore/eating/transforming_vr.dm +++ b/code/modules/vore/eating/transforming_vr.dm @@ -210,7 +210,7 @@ return 1 return 0 -/obj/belly/proc/change_species(var/mob/living/carbon/human/M, message=0) +/obj/belly/proc/change_species(var/mob/living/carbon/human/M, message=0, color_action = 0) //color_action: 0 for default species, 1 to preserve, 2 to transfer from pred var/mob/living/carbon/human/O = owner if(!istype(M) || !istype(O)) return @@ -224,17 +224,14 @@ if(backup_implants.len) for(var/obj/item/weapon/implant/backup/BI in backup_implants) BI.forceMove(src) - - M.species = O.species + if(color_action == 1) + M.set_species(O.species.name,0,1,M) + else if(color_action == 2) + M.set_species(O.species.name,0,1,O) + else + M.set_species(O.species.name) M.custom_species = O.custom_species - M.species.create_organs(M) //This is the only way to make it so Unathi TF doesn't result in people dying from organ rejection. - for(var/obj/item/organ/I in M.organs) //This prevents organ rejection - I.species = O.species - for(var/obj/item/organ/I in M.internal_organs) //This prevents organ rejection - I.species = O.species - for(var/obj/item/organ/external/Z in M.organs)//Just in case. - Z.sync_colour_to_human(M) - M.fixblood() + M.update_icons_body() M.update_tail_showing() @@ -248,7 +245,6 @@ if(message) to_chat(M, "You lose sensation of your body, feeling only the warmth of everything around you... ") to_chat(O, "Your body shifts as you make dramatic changes to your captive's body.") - M.verbs += M.species.inherent_verbs //Give new unique stuff /obj/belly/proc/put_in_egg(var/atom/movable/M, message=0) var/mob/living/carbon/human/O = owner From 0588af5f160beea60e2b7b8d12995d7333c2833f Mon Sep 17 00:00:00 2001 From: Heroman Date: Tue, 9 Apr 2019 18:39:17 +1000 Subject: [PATCH 059/141] Removes testing pill --- code/modules/reagents/Chemistry-Reagents_vr.dm | 7 ------- 1 file changed, 7 deletions(-) diff --git a/code/modules/reagents/Chemistry-Reagents_vr.dm b/code/modules/reagents/Chemistry-Reagents_vr.dm index 3244d9a02e..611f286ab1 100644 --- a/code/modules/reagents/Chemistry-Reagents_vr.dm +++ b/code/modules/reagents/Chemistry-Reagents_vr.dm @@ -28,13 +28,6 @@ BI.forceMove(torso) torso.implants += BI -/obj/item/weapon/reagent_containers/pill/amt - name = "amt pill" - -/obj/item/weapon/reagent_containers/pill/amt/Initialize() - . = ..() - reagents.add_reagent("advmutationtoxin", 1) - /datum/chemical_reaction/slime/sapphire_mutation name = "Slime Mutation Toxins" id = "slime_mutation_tox" From 22a5b2f43626ed6d65e66a5e3823d659bd709951 Mon Sep 17 00:00:00 2001 From: Heroman Date: Tue, 9 Apr 2019 20:09:19 +1000 Subject: [PATCH 060/141] Undoes some VOREStation promethean nerfs --- .../human/species/station/prometheans_vr.dm | 6 ----- code/modules/organs/subtypes/slime_vr.dm | 22 ------------------- 2 files changed, 28 deletions(-) delete mode 100644 code/modules/organs/subtypes/slime_vr.dm diff --git a/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm b/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm index 633a851ddc..f4e0518a37 100644 --- a/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm @@ -9,13 +9,7 @@ "Rapala", "Neaera", "Stok", "Farwa", "Sobaka", "Wolpin", "Saru", "Sparra") - heal_rate = 0.2 //As of writing, original was 0.5 - Slows regen speed (bad) - hunger_factor = 0.1 //As of writing, original was 0.2 - Slows hunger rate (good) - siemens_coefficient = 1 //As of writing, original was 0.4 (bad) - active_regen_mult = 0.66 //As of writing, original was 1 (good) - color_mult = 1 - mob_size = MOB_MEDIUM //As of writing, original was MOB_SMALL - Allows normal swapping (good) trashcan = 1 //They have goopy bodies. They can just dissolve things within them. appearance_flags = HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_HAIR_COLOR | RADIATION_GLOWS | HAS_UNDERWEAR diff --git a/code/modules/organs/subtypes/slime_vr.dm b/code/modules/organs/subtypes/slime_vr.dm deleted file mode 100644 index 270b194f5d..0000000000 --- a/code/modules/organs/subtypes/slime_vr.dm +++ /dev/null @@ -1,22 +0,0 @@ -/obj/item/organ/external/chest/unbreakable/slime - max_damage = 50 -/obj/item/organ/external/groin/unbreakable/slime - max_damage = 30 -/obj/item/organ/external/arm/unbreakable/slime - max_damage = 8 -/obj/item/organ/external/arm/right/unbreakable/slime - max_damage = 8 -/obj/item/organ/external/leg/unbreakable/slime - max_damage = 8 -/obj/item/organ/external/leg/right/unbreakable/slime - max_damage = 8 -/obj/item/organ/external/foot/unbreakable/slime - max_damage = 8 -/obj/item/organ/external/foot/right/unbreakable/slime - max_damage = 8 -/obj/item/organ/external/hand/unbreakable/slime - max_damage = 8 -/obj/item/organ/external/hand/right/unbreakable/slime - max_damage = 8 -/obj/item/organ/external/head/unbreakable/slime - max_damage = 8 From 9708c52d3f97a6b8d86748c60486fbe9c0a31359 Mon Sep 17 00:00:00 2001 From: Heroman Date: Wed, 10 Apr 2019 04:20:14 +1000 Subject: [PATCH 061/141] Fixes compile error, undoes a mechanic change --- .../mob/living/carbon/human/species/station/prometheans_vr.dm | 1 + vorestation.dme | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm b/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm index f4e0518a37..6204f4d5ba 100644 --- a/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm @@ -10,6 +10,7 @@ "Wolpin", "Saru", "Sparra") color_mult = 1 + mob_size = MOB_MEDIUM //As of writing, original was MOB_SMALL - Allows normal swapping trashcan = 1 //They have goopy bodies. They can just dissolve things within them. appearance_flags = HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_HAIR_COLOR | RADIATION_GLOWS | HAS_UNDERWEAR diff --git a/vorestation.dme b/vorestation.dme index 929b621c36..8d7545801f 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -2518,7 +2518,6 @@ #include "code\modules\organs\subtypes\replicant.dm" #include "code\modules\organs\subtypes\seromi.dm" #include "code\modules\organs\subtypes\slime.dm" -#include "code\modules\organs\subtypes\slime_vr.dm" #include "code\modules\organs\subtypes\standard.dm" #include "code\modules\organs\subtypes\standard_vr.dm" #include "code\modules\organs\subtypes\unathi.dm" From 4c4e94f480bf880e67c7e62b426816ed1ea06e1f Mon Sep 17 00:00:00 2001 From: Heroman Date: Wed, 10 Apr 2019 04:56:00 +1000 Subject: [PATCH 062/141] Fixes layering on some machines --- code/__defines/_planes+layers_vr.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/__defines/_planes+layers_vr.dm b/code/__defines/_planes+layers_vr.dm index 0ec8664fd9..125f492cd7 100644 --- a/code/__defines/_planes+layers_vr.dm +++ b/code/__defines/_planes+layers_vr.dm @@ -5,5 +5,3 @@ #define PLANE_CH_VANTAG 29 //Vore Antag hud #define PLANE_AUGMENTED 40 //Augmented-reality plane - -#define ABOVE_WINDOW_LAYER 3.25 //Above full tile windows so wall items are clickable From e1cce77f60a0a0174436c09936c38a879d00a255 Mon Sep 17 00:00:00 2001 From: Neerti Date: Tue, 9 Apr 2019 17:46:00 -0400 Subject: [PATCH 064/141] Fixes ability to repair doors for bogs/drones --- code/game/machinery/doors/door.dm | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 0d7f8bb5e3..ab60995d44 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -27,7 +27,11 @@ var/destroy_hits = 10 //How many strong hits it takes to destroy the door var/min_force = 10 //minimum amount of force needed to damage the door with a melee weapon var/hitsound = 'sound/weapons/smash.ogg' //sound door makes when hit with a weapon +<<<<<<< HEAD var/repairing +======= + var/repairing = 0 +>>>>>>> 79455bc... Merge pull request #6061 from Heroman3003/auto-dooring var/block_air_zones = 1 //If set, air zones cannot merge across the door even when it is opened. var/close_door_at = 0 //When to automatically close the door, if possible @@ -252,7 +256,11 @@ var/obj/item/weapon/weldingtool/welder = I if(welder.remove_fuel(0,user)) +<<<<<<< HEAD to_chat(user, "You start to fix dents and weld \the [repairing] into place.") +======= + to_chat(user, "You start to fix dents and weld \the [get_material_name()] into place.") +>>>>>>> 79455bc... Merge pull request #6061 from Heroman3003/auto-dooring playsound(src, welder.usesound, 50, 1) if(do_after(user, (5 * repairing) * welder.toolspeed) && welder && welder.isOn()) to_chat(user, "You finish repairing the damage to \the [src].") From 66410d9943843453956a69b48d8f4bbf744f3e28 Mon Sep 17 00:00:00 2001 From: Heroman3003 <31296024+Heroman3003@users.noreply.github.com> Date: Wed, 10 Apr 2019 08:08:25 +1000 Subject: [PATCH 066/141] Fixes unlocking cyborgs with wallets/micros --- code/modules/mob/living/silicon/robot/robot.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 33c159ebf0..c56b6aeca6 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -628,7 +628,7 @@ else to_chat(user, "Unable to locate a radio.") - else if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)||istype(W, /obj/item/weapon/card/robot)) // trying to unlock the interface with an ID card + else if (W.GetID()) // trying to unlock the interface with an ID card if(emagged)//still allow them to open the cover to_chat(user, "The interface seems slightly damaged") if(opened) @@ -729,7 +729,7 @@ var/list/L = req_access if(!L.len) //no requirements return 1 - if(!I || !(istype(I, /obj/item/weapon/card/id) || istype(I, /obj/item/device/pda))) //not ID or PDA + if(!I) //nothing to check with..? return 0 var/access_found = I.GetAccess() for(var/req in req_access) From 16fb2c10364ca986e868b95725310e83f3ea63e9 Mon Sep 17 00:00:00 2001 From: Heroman3003 <31296024+Heroman3003@users.noreply.github.com> Date: Wed, 10 Apr 2019 12:00:24 +1000 Subject: [PATCH 067/141] Fixes tesla logic bug --- code/modules/power/tesla/energy_ball.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index 8c404e05c0..739699ae31 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -247,7 +247,7 @@ closest_atom = A closest_dist = dist - else if(closest_mob) + else if(closest_machine) continue else if(istype(A, /obj/structure/blob)) From 5eca66e0427c786bc182e96b5f6597db92687a8c Mon Sep 17 00:00:00 2001 From: Novacat <35587478+Novacat@users.noreply.github.com> Date: Tue, 9 Apr 2019 22:25:16 -0400 Subject: [PATCH 068/141] Update door.dm --- code/game/machinery/doors/door.dm | 8 -------- 1 file changed, 8 deletions(-) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index ab60995d44..d276efef35 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -27,11 +27,7 @@ var/destroy_hits = 10 //How many strong hits it takes to destroy the door var/min_force = 10 //minimum amount of force needed to damage the door with a melee weapon var/hitsound = 'sound/weapons/smash.ogg' //sound door makes when hit with a weapon -<<<<<<< HEAD - var/repairing -======= var/repairing = 0 ->>>>>>> 79455bc... Merge pull request #6061 from Heroman3003/auto-dooring var/block_air_zones = 1 //If set, air zones cannot merge across the door even when it is opened. var/close_door_at = 0 //When to automatically close the door, if possible @@ -256,11 +252,7 @@ var/obj/item/weapon/weldingtool/welder = I if(welder.remove_fuel(0,user)) -<<<<<<< HEAD - to_chat(user, "You start to fix dents and weld \the [repairing] into place.") -======= to_chat(user, "You start to fix dents and weld \the [get_material_name()] into place.") ->>>>>>> 79455bc... Merge pull request #6061 from Heroman3003/auto-dooring playsound(src, welder.usesound, 50, 1) if(do_after(user, (5 * repairing) * welder.toolspeed) && welder && welder.isOn()) to_chat(user, "You finish repairing the damage to \the [src].") From 6d9524d7ff3d0eabe88d6283a199f9f5e413eac5 Mon Sep 17 00:00:00 2001 From: Heroman Date: Wed, 10 Apr 2019 16:04:56 +1000 Subject: [PATCH 069/141] Gives QM office privacy tinting --- maps/tether/tether-07-station3.dmm | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/maps/tether/tether-07-station3.dmm b/maps/tether/tether-07-station3.dmm index e4d438e4d3..289896093e 100644 --- a/maps/tether/tether-07-station3.dmm +++ b/maps/tether/tether-07-station3.dmm @@ -16541,8 +16541,10 @@ /area/quartermaster/qm) "zK" = ( /obj/structure/grille, -/obj/structure/window/reinforced/full, /obj/machinery/door/firedoor/glass, +/obj/structure/window/reinforced/polarized/full{ + id = "qm_office" + }, /turf/simulated/floor/plating, /area/quartermaster/qm) "zL" = ( @@ -17875,6 +17877,11 @@ /obj/effect/landmark/start{ name = "Quartermaster" }, +/obj/machinery/button/windowtint{ + id = "qm_office"; + pixel_x = 26; + pixel_y = 8 + }, /turf/simulated/floor/tiled, /area/quartermaster/qm) "BN" = ( From dab2dbfbc1865d4e8c432f2d2828986cbac69f15 Mon Sep 17 00:00:00 2001 From: Heroman Date: Wed, 10 Apr 2019 16:47:10 +1000 Subject: [PATCH 070/141] Also updated doors --- maps/tether/tether-07-station3.dmm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/maps/tether/tether-07-station3.dmm b/maps/tether/tether-07-station3.dmm index 289896093e..eef9dc98cf 100644 --- a/maps/tether/tether-07-station3.dmm +++ b/maps/tether/tether-07-station3.dmm @@ -16551,7 +16551,7 @@ /turf/simulated/wall, /area/quartermaster/qm) "zM" = ( -/obj/machinery/door/airlock/glass_mining{ +/obj/machinery/door/airlock/mining{ name = "Quartermaster"; req_access = list(41); req_one_access = list() @@ -18398,7 +18398,7 @@ /turf/simulated/floor/tiled, /area/quartermaster/qm) "CH" = ( -/obj/machinery/door/airlock/glass_mining{ +/obj/machinery/door/airlock/mining{ name = "Quartermaster"; req_access = list(41); req_one_access = list() From 4a0b4c32cb1f84241a5489271222fd2d57bc9c4c Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 10 Apr 2019 14:58:39 -0400 Subject: [PATCH 071/141] Whitelists Rapidvalj for Skrellian - Also allows Custom species to verbally speak Terminus, Skrellian, and High Skrellian --- .../mob/living/carbon/human/species/station/blank_vr.dm | 1 + config/alienwhitelist.txt | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/species/station/blank_vr.dm b/code/modules/mob/living/carbon/human/species/station/blank_vr.dm index 45c5f4b8f3..d73e784ac4 100644 --- a/code/modules/mob/living/carbon/human/species/station/blank_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/blank_vr.dm @@ -25,6 +25,7 @@ max_age = 200 health_hud_intensity = 2 num_alternate_languages = 3 + assisted_langs = list(LANGUAGE_EAL, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX) spawn_flags = SPECIES_CAN_JOIN appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_EYE_COLOR diff --git a/config/alienwhitelist.txt b/config/alienwhitelist.txt index 3db20fb9c1..a1be68f8a2 100644 --- a/config/alienwhitelist.txt +++ b/config/alienwhitelist.txt @@ -20,11 +20,13 @@ mewchild - Vox natje - Xenochimera oreganovulgaris - Xenochimera paradoxspace - Xenochimera -rapidvalj - Vox +rapidvalj - Common Skrellian +rapidvalj - High Skrellian rikaru19xjenkins - Xenomorph Hybrid rikaru19xjenkins - Xenochimera rixunie - Diona rixunie - Gutter +rapidvalj - seiga - Vox sepulchre - Vox sepulchre - Xenomorph Hybrid From a5449b38dc2833abf18fac02038bd7d990c46b69 Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 10 Apr 2019 15:02:56 -0400 Subject: [PATCH 072/141] Remind me not to code while sleepy --- config/alienwhitelist.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/alienwhitelist.txt b/config/alienwhitelist.txt index a1be68f8a2..4c69df3c3a 100644 --- a/config/alienwhitelist.txt +++ b/config/alienwhitelist.txt @@ -20,13 +20,13 @@ mewchild - Vox natje - Xenochimera oreganovulgaris - Xenochimera paradoxspace - Xenochimera +rapidvalj - Vox rapidvalj - Common Skrellian rapidvalj - High Skrellian rikaru19xjenkins - Xenomorph Hybrid rikaru19xjenkins - Xenochimera rixunie - Diona rixunie - Gutter -rapidvalj - seiga - Vox sepulchre - Vox sepulchre - Xenomorph Hybrid From cecbac283172f6bdb81563fcde8ec4110973bee6 Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 10 Apr 2019 18:53:15 -0400 Subject: [PATCH 073/141] Emergency fix to Timer Subsystem --- code/__defines/_tick.dm | 2 +- code/__defines/subsystems.dm | 1 + code/controllers/subsystems/timer.dm | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/code/__defines/_tick.dm b/code/__defines/_tick.dm index 54ac7d398d..c57f770296 100644 --- a/code/__defines/_tick.dm +++ b/code/__defines/_tick.dm @@ -1,5 +1,5 @@ -#define TICK_LIMIT_RUNNING 80 +#define TICK_LIMIT_RUNNING 120 //VOREStation Emergency Edit #define TICK_LIMIT_TO_RUN 70 #define TICK_LIMIT_MC 70 #define TICK_LIMIT_MC_INIT_DEFAULT 98 diff --git a/code/__defines/subsystems.dm b/code/__defines/subsystems.dm index ac480237b5..767941d58f 100644 --- a/code/__defines/subsystems.dm +++ b/code/__defines/subsystems.dm @@ -73,6 +73,7 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G // 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_SHUTTLES 5 +#define FIRE_PRIORITY_TIMERS 7 //VOREStation Emergency Edit #define FIRE_PRIORITY_ORBIT 8 #define FIRE_PRIORITY_VOTE 9 #define FIRE_PRIORITY_AI 10 diff --git a/code/controllers/subsystems/timer.dm b/code/controllers/subsystems/timer.dm index 3cd4ffe6ba..b743e8ff9e 100644 --- a/code/controllers/subsystems/timer.dm +++ b/code/controllers/subsystems/timer.dm @@ -6,6 +6,7 @@ SUBSYSTEM_DEF(timer) name = "Timer" wait = 1 //SS_TICKER subsystem, so wait is in ticks + priority = FIRE_PRIORITY_TIMERS //VOREStation Emergency Edit init_order = INIT_ORDER_TIMER flags = SS_TICKER|SS_NO_INIT From 569723547cfc10035c49a144176b0d0e84a31392 Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 10 Apr 2019 18:55:36 -0400 Subject: [PATCH 074/141] Okay this was not a good change --- code/__defines/_tick.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/__defines/_tick.dm b/code/__defines/_tick.dm index c57f770296..1f112f711b 100644 --- a/code/__defines/_tick.dm +++ b/code/__defines/_tick.dm @@ -1,5 +1,5 @@ -#define TICK_LIMIT_RUNNING 120 //VOREStation Emergency Edit +#define TICK_LIMIT_RUNNING 85 //VOREStation Emergency Edit #define TICK_LIMIT_TO_RUN 70 #define TICK_LIMIT_MC 70 #define TICK_LIMIT_MC_INIT_DEFAULT 98 From bcbeb0cf0d323e13c395c500bd49e972a0ce42ce Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 10 Apr 2019 19:38:07 -0400 Subject: [PATCH 075/141] Rosettes Part two --- .../mob/new_player/sprite_accessories_vr.dm | 7 ------- icons/mob/human_races/markings_vr.dmi | Bin 60608 -> 59484 bytes 2 files changed, 7 deletions(-) diff --git a/code/modules/mob/new_player/sprite_accessories_vr.dm b/code/modules/mob/new_player/sprite_accessories_vr.dm index 39568bf69c..4ee7d5e01c 100644 --- a/code/modules/mob/new_player/sprite_accessories_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_vr.dm @@ -1052,13 +1052,6 @@ rosette name = "Rosettes" icon_state = "rosette" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) - - rosette_color - name = "Rosettes (Colorable)" - icon_state = "rosette_color" - color_blend_mode = ICON_MULTIPLY body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) heterochromia diff --git a/icons/mob/human_races/markings_vr.dmi b/icons/mob/human_races/markings_vr.dmi index 00089f2af93e8df520f222a6efd1a0c011d7b9b6..8eaa83b78a25b1d100b207dfa3198d1013d4ade6 100644 GIT binary patch delta 21617 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 F{|{F7BNG4s From 95b2c63b85b221b37d0d80ee7890b3e73c30a59d Mon Sep 17 00:00:00 2001 From: Heroman3003 <31296024+Heroman3003@users.noreply.github.com> Date: Thu, 11 Apr 2019 09:55:06 +1000 Subject: [PATCH 076/141] Allows restriction of Z-levels for xenoarch spawning --- code/__defines/map_vr.dm | 1 + code/controllers/subsystems/xenoarch.dm | 2 +- maps/tether/tether_defines.dm | 20 ++++++++++---------- maps/~map_system/maps.dm | 1 + maps/~map_system/maps_vr.dm | 2 ++ vorestation.dme | 2 ++ 6 files changed, 17 insertions(+), 11 deletions(-) create mode 100644 code/__defines/map_vr.dm create mode 100644 maps/~map_system/maps_vr.dm diff --git a/code/__defines/map_vr.dm b/code/__defines/map_vr.dm new file mode 100644 index 0000000000..3847dc29f9 --- /dev/null +++ b/code/__defines/map_vr.dm @@ -0,0 +1 @@ +#define MAP_LEVEL_XENOARCH_EXEMPT 0x080 // Z-levels exempt from xenoarch digsite generation. \ No newline at end of file diff --git a/code/controllers/subsystems/xenoarch.dm b/code/controllers/subsystems/xenoarch.dm index 7f3e292c1a..63a6e95a8d 100644 --- a/code/controllers/subsystems/xenoarch.dm +++ b/code/controllers/subsystems/xenoarch.dm @@ -31,7 +31,7 @@ SUBSYSTEM_DEF(xenoarch) /datum/controller/subsystem/xenoarch/proc/SetupXenoarch() for(var/turf/simulated/mineral/M in turfs) - if(!M.density) + if(!M.density || M.z in using_map.xenoarch_exempt_levels) //VOREStation Edit: exclude some Z-levels from xenoarch spawns continue if(isnull(M.geologic_data)) diff --git a/maps/tether/tether_defines.dm b/maps/tether/tether_defines.dm index 8dd5d7cf4a..a23f95a1df 100644 --- a/maps/tether/tether_defines.dm +++ b/maps/tether/tether_defines.dm @@ -175,14 +175,14 @@ // We have a bunch of stuff common to the station z levels /datum/map_z_level/tether/station - flags = MAP_LEVEL_STATION|MAP_LEVEL_CONTACT|MAP_LEVEL_PLAYER|MAP_LEVEL_CONSOLES + flags = MAP_LEVEL_STATION|MAP_LEVEL_CONTACT|MAP_LEVEL_PLAYER|MAP_LEVEL_CONSOLES|MAP_LEVEL_XENOARCH_EXEMPT holomap_legend_x = 220 holomap_legend_y = 160 /datum/map_z_level/tether/station/surface_low z = Z_LEVEL_SURFACE_LOW name = "Surface 1" - flags = MAP_LEVEL_STATION|MAP_LEVEL_CONTACT|MAP_LEVEL_PLAYER|MAP_LEVEL_CONSOLES|MAP_LEVEL_SEALED + flags = MAP_LEVEL_STATION|MAP_LEVEL_CONTACT|MAP_LEVEL_PLAYER|MAP_LEVEL_CONSOLES|MAP_LEVEL_SEALED|MAP_LEVEL_XENOARCH_EXEMPT base_turf = /turf/simulated/floor/outdoors/rocks/virgo3b holomap_offset_x = TETHER_HOLOMAP_MARGIN_X holomap_offset_y = TETHER_HOLOMAP_MARGIN_Y + TETHER_MAP_SIZE*0 @@ -190,7 +190,7 @@ /datum/map_z_level/tether/station/surface_mid z = Z_LEVEL_SURFACE_MID name = "Surface 2" - flags = MAP_LEVEL_STATION|MAP_LEVEL_CONTACT|MAP_LEVEL_PLAYER|MAP_LEVEL_CONSOLES|MAP_LEVEL_SEALED + flags = MAP_LEVEL_STATION|MAP_LEVEL_CONTACT|MAP_LEVEL_PLAYER|MAP_LEVEL_CONSOLES|MAP_LEVEL_SEALED|MAP_LEVEL_XENOARCH_EXEMPT base_turf = /turf/simulated/open holomap_offset_x = TETHER_HOLOMAP_MARGIN_X holomap_offset_y = TETHER_HOLOMAP_MARGIN_Y + TETHER_MAP_SIZE*1 @@ -198,7 +198,7 @@ /datum/map_z_level/tether/station/surface_high z = Z_LEVEL_SURFACE_HIGH name = "Surface 3" - flags = MAP_LEVEL_STATION|MAP_LEVEL_CONTACT|MAP_LEVEL_PLAYER|MAP_LEVEL_CONSOLES|MAP_LEVEL_SEALED + flags = MAP_LEVEL_STATION|MAP_LEVEL_CONTACT|MAP_LEVEL_PLAYER|MAP_LEVEL_CONSOLES|MAP_LEVEL_SEALED|MAP_LEVEL_XENOARCH_EXEMPT base_turf = /turf/simulated/open holomap_offset_x = TETHER_HOLOMAP_MARGIN_X holomap_offset_y = TETHER_HOLOMAP_MARGIN_Y + TETHER_MAP_SIZE*2 @@ -206,14 +206,14 @@ /datum/map_z_level/tether/transit z = Z_LEVEL_TRANSIT name = "Transit" - flags = MAP_LEVEL_SEALED|MAP_LEVEL_PLAYER|MAP_LEVEL_CONTACT + flags = MAP_LEVEL_SEALED|MAP_LEVEL_PLAYER|MAP_LEVEL_CONTACT|MAP_LEVEL_XENOARCH_EXEMPT /datum/map_z_level/tether/station/space_low z = Z_LEVEL_SPACE_LOW name = "Asteroid 1" base_turf = /turf/space transit_chance = 33 - holomap_offset_x = HOLOMAP_ICON_SIZE - TETHER_HOLOMAP_MARGIN_X - TETHER_MAP_SIZE + holomap_offset_x = HOLOMAP_ICON_SIZE - TETHER_HOLOMAP_MARGIN_X - TETHER_MAP_SIZE|MAP_LEVEL_XENOARCH_EXEMPT holomap_offset_y = TETHER_HOLOMAP_MARGIN_Y + TETHER_MAP_SIZE*0 /datum/map_z_level/tether/station/space_mid @@ -221,7 +221,7 @@ name = "Asteroid 2" base_turf = /turf/simulated/open transit_chance = 33 - holomap_offset_x = HOLOMAP_ICON_SIZE - TETHER_HOLOMAP_MARGIN_X - TETHER_MAP_SIZE + holomap_offset_x = HOLOMAP_ICON_SIZE - TETHER_HOLOMAP_MARGIN_X - TETHER_MAP_SIZE|MAP_LEVEL_XENOARCH_EXEMPT holomap_offset_y = TETHER_HOLOMAP_MARGIN_Y + TETHER_MAP_SIZE*1 /datum/map_z_level/tether/station/space_high @@ -229,7 +229,7 @@ name = "Asteroid 3" base_turf = /turf/simulated/open transit_chance = 33 - holomap_offset_x = HOLOMAP_ICON_SIZE - TETHER_HOLOMAP_MARGIN_X - TETHER_MAP_SIZE + holomap_offset_x = HOLOMAP_ICON_SIZE - TETHER_HOLOMAP_MARGIN_X - TETHER_MAP_SIZE|MAP_LEVEL_XENOARCH_EXEMPT holomap_offset_y = TETHER_HOLOMAP_MARGIN_Y + TETHER_MAP_SIZE*2 /datum/map_z_level/tether/mine @@ -247,12 +247,12 @@ /datum/map_z_level/tether/colony z = Z_LEVEL_CENTCOM name = "Colony" - flags = MAP_LEVEL_ADMIN|MAP_LEVEL_CONTACT + flags = MAP_LEVEL_ADMIN|MAP_LEVEL_CONTACT|MAP_LEVEL_XENOARCH_EXEMPT /datum/map_z_level/tether/misc z = Z_LEVEL_MISC name = "Misc" - flags = MAP_LEVEL_ADMIN + flags = MAP_LEVEL_ADMIN|MAP_LEVEL_XENOARCH_EXEMPT /* /datum/map_z_level/tether/wilderness diff --git a/maps/~map_system/maps.dm b/maps/~map_system/maps.dm index 4ba9d3d03b..c0a364c5ca 100644 --- a/maps/~map_system/maps.dm +++ b/maps/~map_system/maps.dm @@ -185,6 +185,7 @@ var/list/all_maps = list() if(flags & MAP_LEVEL_CONTACT) map.contact_levels += z if(flags & MAP_LEVEL_PLAYER) map.player_levels += z if(flags & MAP_LEVEL_SEALED) map.sealed_levels += z + if(flags & MAP_LEVEL_XENOARCH_EXEMPT) map.xenoarch_exempt_levels += z //VOREStation Edit : excluse some z-levels from xenoarch spawns if(flags & MAP_LEVEL_EMPTY) if(!map.empty_levels) map.empty_levels = list() map.empty_levels += z diff --git a/maps/~map_system/maps_vr.dm b/maps/~map_system/maps_vr.dm new file mode 100644 index 0000000000..278db21731 --- /dev/null +++ b/maps/~map_system/maps_vr.dm @@ -0,0 +1,2 @@ +/datum/map + var/list/xenoarch_exempt_levels = list() //Z-levels exempt from xenoarch finds and digsites spawning. \ No newline at end of file diff --git a/vorestation.dme b/vorestation.dme index 929b621c36..8d36bc375b 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -50,6 +50,7 @@ #include "code\__defines\lighting.dm" #include "code\__defines\machinery.dm" #include "code\__defines\map.dm" +#include "code\__defines\map_vr.dm" #include "code\__defines\math.dm" #include "code\__defines\math_physics.dm" #include "code\__defines\MC.dm" @@ -3109,4 +3110,5 @@ #include "maps\submaps\surface_submaps\wilderness\wilderness_areas.dm" #include "maps\tether\tether.dm" #include "maps\~map_system\maps.dm" +#include "maps\~map_system\maps_vr.dm" // END_INCLUDE From c03b35d9e9f92d27885f856ecfa4fd999e136a8a Mon Sep 17 00:00:00 2001 From: Heroman3003 <31296024+Heroman3003@users.noreply.github.com> Date: Thu, 11 Apr 2019 10:16:31 +1000 Subject: [PATCH 077/141] Fixes a whoopsie with flags --- maps/tether/tether_defines.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/maps/tether/tether_defines.dm b/maps/tether/tether_defines.dm index a23f95a1df..8121025647 100644 --- a/maps/tether/tether_defines.dm +++ b/maps/tether/tether_defines.dm @@ -213,7 +213,7 @@ name = "Asteroid 1" base_turf = /turf/space transit_chance = 33 - holomap_offset_x = HOLOMAP_ICON_SIZE - TETHER_HOLOMAP_MARGIN_X - TETHER_MAP_SIZE|MAP_LEVEL_XENOARCH_EXEMPT + holomap_offset_x = HOLOMAP_ICON_SIZE - TETHER_HOLOMAP_MARGIN_X - TETHER_MAP_SIZE holomap_offset_y = TETHER_HOLOMAP_MARGIN_Y + TETHER_MAP_SIZE*0 /datum/map_z_level/tether/station/space_mid @@ -221,7 +221,7 @@ name = "Asteroid 2" base_turf = /turf/simulated/open transit_chance = 33 - holomap_offset_x = HOLOMAP_ICON_SIZE - TETHER_HOLOMAP_MARGIN_X - TETHER_MAP_SIZE|MAP_LEVEL_XENOARCH_EXEMPT + holomap_offset_x = HOLOMAP_ICON_SIZE - TETHER_HOLOMAP_MARGIN_X - TETHER_MAP_SIZE holomap_offset_y = TETHER_HOLOMAP_MARGIN_Y + TETHER_MAP_SIZE*1 /datum/map_z_level/tether/station/space_high @@ -229,7 +229,7 @@ name = "Asteroid 3" base_turf = /turf/simulated/open transit_chance = 33 - holomap_offset_x = HOLOMAP_ICON_SIZE - TETHER_HOLOMAP_MARGIN_X - TETHER_MAP_SIZE|MAP_LEVEL_XENOARCH_EXEMPT + holomap_offset_x = HOLOMAP_ICON_SIZE - TETHER_HOLOMAP_MARGIN_X - TETHER_MAP_SIZE holomap_offset_y = TETHER_HOLOMAP_MARGIN_Y + TETHER_MAP_SIZE*2 /datum/map_z_level/tether/mine From 84a5fd4ef4c3496ce126f987ea8b916de9a12ecd Mon Sep 17 00:00:00 2001 From: Heroman3003 <31296024+Heroman3003@users.noreply.github.com> Date: Thu, 11 Apr 2019 10:50:10 +1000 Subject: [PATCH 078/141] Makes OOC escape unabsorb --- code/modules/vore/eating/living_vr.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm index 8d3cb48d24..3e86a1b782 100644 --- a/code/modules/vore/eating/living_vr.dm +++ b/code/modules/vore/eating/living_vr.dm @@ -330,6 +330,7 @@ if(!confirm == "Okay" || loc != B) return //Actual escaping + M.absorbed = 0 //Make sure we're not absorbed forceMove(get_turf(src)) //Just move me up to the turf, let's not cascade through bellies, there's been a problem, let's just leave. for(var/mob/living/simple_mob/SA in range(10)) SA.prey_excludes[src] = world.time From ecee4b856dcbda249a46ed94378e3a92e8dd908b Mon Sep 17 00:00:00 2001 From: Heroman3003 <31296024+Heroman3003@users.noreply.github.com> Date: Thu, 11 Apr 2019 10:56:53 +1000 Subject: [PATCH 079/141] Fixes a compile error --- code/modules/vore/eating/living_vr.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm index 3e86a1b782..3b9a56c151 100644 --- a/code/modules/vore/eating/living_vr.dm +++ b/code/modules/vore/eating/living_vr.dm @@ -330,7 +330,7 @@ if(!confirm == "Okay" || loc != B) return //Actual escaping - M.absorbed = 0 //Make sure we're not absorbed + absorbed = 0 //Make sure we're not absorbed forceMove(get_turf(src)) //Just move me up to the turf, let's not cascade through bellies, there's been a problem, let's just leave. for(var/mob/living/simple_mob/SA in range(10)) SA.prey_excludes[src] = world.time From 123eb28d7389e32f106c8bbb1e8e998098ea17f0 Mon Sep 17 00:00:00 2001 From: Unknown Date: Thu, 11 Apr 2019 00:31:41 -0400 Subject: [PATCH 082/141] Fixes Pallette with Rosettes Rosettes used a bit lighter shade of grey, which did not work well with the way markings are applied. This fixes that. --- icons/mob/human_races/markings_vr.dmi | Bin 59484 -> 59498 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/human_races/markings_vr.dmi b/icons/mob/human_races/markings_vr.dmi index 8eaa83b78a25b1d100b207dfa3198d1013d4ade6..d776a68b67c89a880db307f3755dca8fb4cb66e2 100644 GIT binary patch delta 17674 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 delta 17714 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 From 40a0eaed13c573a5ae6f2ee887bf86416cc25b88 Mon Sep 17 00:00:00 2001 From: Unknown Date: Thu, 11 Apr 2019 11:26:08 -0400 Subject: [PATCH 083/141] SMESs no longer turn off when out of power Ported from Baystation PR #11973, Mirrored to Polaris PR --- code/modules/power/smes.dm | 5 ----- 1 file changed, 5 deletions(-) diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index ad76cb061f..8628315601 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -144,11 +144,6 @@ charge -= output_used*SMESRATE // reduce the storage (may be recovered in /restore() if excessive) add_avail(output_used) // add output to powernet (smes side) - - if(output_used < 0.0001) // either from no charge or set to 0 - outputting(0) - investigate_log("lost power and turned off","singulo") - log_game("SMES([x],[y],[z]) Power depleted.") else if(output_attempt && output_level > 0) outputting = 1 else From 2496116d9214e9bde6157f04688367f9d3db0477 Mon Sep 17 00:00:00 2001 From: Heroman3003 <31296024+Heroman3003@users.noreply.github.com> Date: Fri, 12 Apr 2019 08:53:51 +1000 Subject: [PATCH 084/141] Fixes NSFW batteries not being rechargable --- code/game/machinery/recharger.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index c201264c3c..0b985d3047 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -44,7 +44,7 @@ obj/machinery/recharger if(E.self_recharge) to_chat(user, "Your gun has no recharge port.") return - if(!G.get_cell()) + if(!G.get_cell() && !istype(G, /obj/item/ammo_casing/nsfw_batt)) //VOREStation Edit: NSFW charging to_chat(user, "This device does not have a battery installed.") return From 4d47aa50309b926dd50b248333bb6f93c9a6d4f6 Mon Sep 17 00:00:00 2001 From: Heroman3003 <31296024+Heroman3003@users.noreply.github.com> Date: Fri, 12 Apr 2019 09:25:14 +1000 Subject: [PATCH 085/141] Unruntimes chems --- code/modules/reagents/Chemistry-Holder.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 4d863d8046..4d12abddfe 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -88,7 +88,8 @@ reaction_occurred = FALSE for(var/i in reagent_list) var/datum/reagent/R = i - eligible_reactions |= SSchemistry.chemical_reactions_by_reagent[R.id] + if(SSchemistry.chemical_reactions_by_reagent[R.id]) //VOREStation Edit: unruntiming chems + eligible_reactions |= SSchemistry.chemical_reactions_by_reagent[R.id] //VOREStation Edit: unruntiming chems for(var/i in eligible_reactions) var/datum/chemical_reaction/C = i From dc78210333dcaf9ae0524451a2f9d9fcc964cb1a Mon Sep 17 00:00:00 2001 From: Heroman3003 <31296024+Heroman3003@users.noreply.github.com> Date: Fri, 12 Apr 2019 10:55:53 +1000 Subject: [PATCH 086/141] Allows cyborgs and AIs to appear in character directory --- code/game/verbs/character_directory.dm | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/code/game/verbs/character_directory.dm b/code/game/verbs/character_directory.dm index 967715901d..1b45091cf7 100644 --- a/code/game/verbs/character_directory.dm +++ b/code/game/verbs/character_directory.dm @@ -29,6 +29,29 @@ html += "OOC notes" html += "" html += "" + if(isAI(C.mob)) + var/mob/living/silicon/ai/A = C.mob + curID++ + html += "
" + html += "

[A.name] (Artificial Intelligence)


" + if(A.ooc_notes) + html += "OOC notes" + html += "" + html += "
" + if(isrobot(C.mob)) + var/mob/living/silicon/robot/R = C.mob + if(R.scrambledcodes || (R.module && R.module.hide_on_manifest)) + continue + curID++ + html += "
" + html += "

[R.name] ([R.modtype] [R.braintype])


" + if(R.flavor_text) + html += "Flavor text" + html += "" + if(R.ooc_notes) + html += "OOC notes" + html += "" + html += "
" if(!curID) html += "

404: Station not found

" From 75842622ad2f3d03748b6532c995e7237a0b8cb5 Mon Sep 17 00:00:00 2001 From: Heroman3003 <31296024+Heroman3003@users.noreply.github.com> Date: Fri, 12 Apr 2019 11:27:16 +1000 Subject: [PATCH 087/141] Adds AI shell landmark to the map --- maps/tether/tether-06-station2.dmm | 1 + 1 file changed, 1 insertion(+) diff --git a/maps/tether/tether-06-station2.dmm b/maps/tether/tether-06-station2.dmm index 35d6e0918e..276b6a8815 100644 --- a/maps/tether/tether-06-station2.dmm +++ b/maps/tether/tether-06-station2.dmm @@ -6049,6 +6049,7 @@ icon_state = "tube1"; dir = 4 }, +/obj/effect/landmark/free_ai_shell, /turf/simulated/floor/tiled/techfloor, /area/ai_cyborg_station) "ls" = ( From 07f965e47b2fde1b4304ebf737c6d07325035173 Mon Sep 17 00:00:00 2001 From: Heroman Date: Fri, 12 Apr 2019 14:56:31 +1000 Subject: [PATCH 088/141] Fixes ghost shuttles causing runtimes --- maps/tether/tether_shuttle_defs.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/maps/tether/tether_shuttle_defs.dm b/maps/tether/tether_shuttle_defs.dm index f72ebce35c..b1d5280242 100644 --- a/maps/tether/tether_shuttle_defs.dm +++ b/maps/tether/tether_shuttle_defs.dm @@ -86,7 +86,6 @@ //These seem backwards because they are written from the perspective of the merc and vox ships departure_message = "Attention. The away mission vessel is approaching the colony." arrival_message = "Attention. The away mission vessel is now leaving from the colony." -*/ /datum/shuttle/multi_shuttle/awaymission/New() ..() @@ -94,9 +93,11 @@ if(awaym_dest && awaym_dest.contents.len) // Otherwise this is an empty imaginary area destinations["Unknown Location [rand(1000,9999)]"] = awaym_dest +*/ + ////////////////////////////////////////////////////////////// // Tether Shuttle -/datum/shuttle/ferry/tether_backup/goodluckmcgee +/datum/shuttle/ferry/tether_backup name = "Tether Backup" location = 1 // At offsite warmup_time = 5 From 91044fdd568f4900527ae4f07750e151956aa1bd Mon Sep 17 00:00:00 2001 From: Heroman Date: Fri, 12 Apr 2019 15:40:09 +1000 Subject: [PATCH 089/141] Fixes micros not getting abducted properly --- maps/tether/submaps/alienship/_alienship.dm | 59 ++++++++++++--------- 1 file changed, 34 insertions(+), 25 deletions(-) diff --git a/maps/tether/submaps/alienship/_alienship.dm b/maps/tether/submaps/alienship/_alienship.dm index 7336a0db19..e204da0e90 100644 --- a/maps/tether/submaps/alienship/_alienship.dm +++ b/maps/tether/submaps/alienship/_alienship.dm @@ -139,36 +139,45 @@ for(var/mob in player_list) //This is extreme, but it's very hard to find people hiding in things, and this is pretty cheap. try if(isliving(mob) && get_area(mob) == src) - var/mob/living/L = mob - - //Situations to get the mob out of - if(L.buckled) - L.buckled.unbuckle_mob() - if(istype(L.loc,/obj/mecha)) - var/obj/mecha/M = L.loc - M.go_out() - else if(istype(L.loc,/obj/machinery/sleeper)) - var/obj/machinery/sleeper/SL = L.loc - SL.go_out() - else if(istype(L.loc,/obj/machinery/recharge_station)) - var/obj/machinery/recharge_station/RS = L.loc - RS.go_out() - - L.forceMove(pick(get_area_turfs(dump_area))) - if(!issilicon(L)) //Don't drop borg modules... - for(var/obj/item/I in L) - if(istype(I,/obj/item/weapon/implant) || istype(I,/obj/item/device/nif)) - continue - L.drop_from_inventory(I, loc) - L.Paralyse(10) - L.forceMove(get_turf(pick(teleport_to))) - L << 'sound/effects/bamf.ogg' - to_chat(L,"You're starting to come to. You feel like you've been out for a few minutes, at least...") + abduct(mob) catch log_debug("Problem doing [mob] for Alienship arrival teleport!") did_entry = TRUE +/area/shuttle/excursion/away_alienship/proc/abduct(var/mob/living/mob) + if(isliving(mob)) + var/mob/living/L = mob + + //Situations to get the mob out of + if(L.buckled) + L.buckled.unbuckle_mob() + if(istype(L.loc,/obj/mecha)) + var/obj/mecha/M = L.loc + M.go_out() + else if(istype(L.loc,/obj/machinery/sleeper)) + var/obj/machinery/sleeper/SL = L.loc + SL.go_out() + else if(istype(L.loc,/obj/machinery/recharge_station)) + var/obj/machinery/recharge_station/RS = L.loc + RS.go_out() + + L.forceMove(pick(get_area_turfs(dump_area))) + if(!issilicon(L)) //Don't drop borg modules... + for(var/obj/item/I in L) + if(istype(I,/obj/item/weapon/implant) || istype(I,/obj/item/device/nif)) + continue + if(istype(I,/obj/item/weapon/holder)) + var/obj/item/weapon/holder/H = I + var/mob/living/M = H.held_mob + M.forceMove(get_turf(H)) + abduct(M) + L.drop_from_inventory(I, loc) + L.Paralyse(10) + L.forceMove(get_turf(pick(teleport_to))) + L << 'sound/effects/bamf.ogg' + to_chat(L,"You're starting to come to. You feel like you've been out for a few minutes, at least...") + /area/tether_away/alienship name = "\improper Away Mission - Unknown Vessel" icon_state = "away" From 82b9508b0e5a3997e3118e1e8c054a0755ac7d8d Mon Sep 17 00:00:00 2001 From: Heroman Date: Fri, 12 Apr 2019 16:18:54 +1000 Subject: [PATCH 090/141] Makes nanoui apply properly to roundstart clients --- code/controllers/subsystems/nanoui.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/controllers/subsystems/nanoui.dm b/code/controllers/subsystems/nanoui.dm index 7512ad872e..b4ceee4d63 100644 --- a/code/controllers/subsystems/nanoui.dm +++ b/code/controllers/subsystems/nanoui.dm @@ -23,9 +23,9 @@ SUBSYSTEM_DEF(nanoui) if(copytext(filename, length(filename)) != "/") // filenames which end in "/" are actually directories, which we want to ignore if(fexists(path + filename)) asset_files.Add(fcopy_rsc(path + filename)) // add this file to asset_files for sending to clients when they connect + .=..() //VOREStation Edit start: fixing some kevinzing for(var/i in GLOB.clients) - addtimer(CALLBACK(src, .proc/send_resources, i), 10) - return ..() + send_resources(i) //VOREStation Edit end: fixing some kevinzing /datum/controller/subsystem/nanoui/Recover() if(SSnanoui.open_uis) From 4c1bb4a4c9e42cc8785fa97c03501e6e3c24722b Mon Sep 17 00:00:00 2001 From: Heroman Date: Fri, 12 Apr 2019 17:30:38 +1000 Subject: [PATCH 091/141] Changes shakers to use initialize --- code/modules/food/drinkingglass/shaker.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/food/drinkingglass/shaker.dm b/code/modules/food/drinkingglass/shaker.dm index b653f14c60..6ea411fbd1 100644 --- a/code/modules/food/drinkingglass/shaker.dm +++ b/code/modules/food/drinkingglass/shaker.dm @@ -11,7 +11,7 @@ rim_pos = null // no fruit slices var/lid_color = "black" -/obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask/New() +/obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask/Initialize() ..() lid_color = pick("black", "red", "blue") update_icon() From c62a184d15e70e56d9117198e96a217707db1640 Mon Sep 17 00:00:00 2001 From: Heroman Date: Fri, 12 Apr 2019 19:24:04 +1000 Subject: [PATCH 092/141] Fixes organizations runtiming --- code/datums/observation/destroyed.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/datums/observation/destroyed.dm b/code/datums/observation/destroyed.dm index ff8778645c..650909f86d 100644 --- a/code/datums/observation/destroyed.dm +++ b/code/datums/observation/destroyed.dm @@ -10,5 +10,6 @@ name = "Destroyed" /datum/Destroy() - GLOB.destroyed_event.raise_event(src) + if(GLOB.destroyed_event) + GLOB.destroyed_event.raise_event(src) . = ..() From 9e3ece47d279f376398219149b888e21874547bb Mon Sep 17 00:00:00 2001 From: Heroman Date: Fri, 12 Apr 2019 19:40:21 +1000 Subject: [PATCH 093/141] Fixes runtime in announcer AI --- code/modules/mob/living/silicon/ai/ai.dm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 94acfd82dc..f5c9e2580e 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -305,7 +305,10 @@ var/list/ai_verbs_default = list( /obj/machinery/ai_powersupply/New(var/mob/living/silicon/ai/ai=null) powered_ai = ai powered_ai.psupply = src - forceMove(powered_ai.loc) + if(istype(powered_ai,/mob/living/silicon/ai/announcer)) //Don't try to get a loc for a nullspace announcer mob, just put it into it + forceMove(powered_ai) + else + forceMove(powered_ai.loc) ..() use_power(1) // Just incase we need to wake up the power system. @@ -443,7 +446,7 @@ var/list/ai_verbs_default = list( return if(usr != src) return - /*if(..()) // <------ MOVED FROM HERE + /*if(..()) // <------ MOVED FROM HERE return*/ if (href_list["mach_close"]) if (href_list["mach_close"] == "aialerts") From 1f94602c85cf3dbd3aca2edde9e212af2bc0a1e2 Mon Sep 17 00:00:00 2001 From: Unknown Date: Fri, 12 Apr 2019 12:20:27 -0400 Subject: [PATCH 094/141] Fixes #5016 Polaris code changes ended up being not compatable with vorestation stuff, this should correct that. --- code/modules/mob/living/silicon/robot/robot.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index c56b6aeca6..ea851806c3 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -1003,7 +1003,7 @@ if(icontype == "Custom") icon = CUSTOM_ITEM_SYNTH else // This is to fix an issue where someone with a custom borg sprite chooses a non-custom sprite and turns invisible. - icon = 'icons/mob/robots.dmi' + vr_sprite_check() //VOREStation Edit icon_state = module_sprites[icontype] updateicon() From e0d243d44fcab07a64faa670853b7444c382c93c Mon Sep 17 00:00:00 2001 From: Heroman Date: Sat, 13 Apr 2019 08:31:39 +1000 Subject: [PATCH 095/141] Fixes missing shaker sprite --- code/modules/food/drinkingglass/drinkingglass.dm | 2 +- code/modules/food/drinkingglass/shaker.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/food/drinkingglass/drinkingglass.dm b/code/modules/food/drinkingglass/drinkingglass.dm index d4c8389a51..604b85665f 100644 --- a/code/modules/food/drinkingglass/drinkingglass.dm +++ b/code/modules/food/drinkingglass/drinkingglass.dm @@ -65,7 +65,7 @@ return 1 return 0 -/obj/item/weapon/reagent_containers/food/drinks/glass2/New() +/obj/item/weapon/reagent_containers/food/drinks/glass2/Initialize() ..() icon_state = base_icon diff --git a/code/modules/food/drinkingglass/shaker.dm b/code/modules/food/drinkingglass/shaker.dm index 6ea411fbd1..3b81c6bdec 100644 --- a/code/modules/food/drinkingglass/shaker.dm +++ b/code/modules/food/drinkingglass/shaker.dm @@ -23,7 +23,7 @@ /obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask/proteinshake name = "protein shake" -/obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask/proteinshake/New() +/obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask/proteinshake/Initialize() ..() reagents.add_reagent("nutriment", 30) reagents.add_reagent("iron", 10) From b700a27063686eebee7f6aac90da6d4ee0b60289 Mon Sep 17 00:00:00 2001 From: Heroman Date: Sat, 13 Apr 2019 10:56:05 +1000 Subject: [PATCH 096/141] Fixes step code, again --- code/modules/vore/resizing/resize_vr.dm | 30 ------------------------- 1 file changed, 30 deletions(-) diff --git a/code/modules/vore/resizing/resize_vr.dm b/code/modules/vore/resizing/resize_vr.dm index 1a1fe508c8..c92121da91 100644 --- a/code/modules/vore/resizing/resize_vr.dm +++ b/code/modules/vore/resizing/resize_vr.dm @@ -155,21 +155,6 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2 * @return false if normal code should continue, true to prevent normal code. */ /mob/living/proc/handle_micro_bump_helping(var/mob/living/tmob) - //Make sure we would be able to step there in the first place: - var/can_move_into = 1 - if(tmob.loc.density) - can_move_into = 0 - if(can_move_into) - for(var/atom/movable/A in tmob.loc) - if(A == src) - continue - if(!A.CanPass(src, tmob.loc)) - can_move_into = 0 - if(!can_move_into) break - - if(!can_move_into) - return FALSE - //Both small! Go ahead and go. if(src.get_effective_size() <= RESIZE_A_SMALLTINY && tmob.get_effective_size() <= RESIZE_A_SMALLTINY) return TRUE @@ -212,21 +197,6 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2 /mob/living/proc/handle_micro_bump_other(var/mob/living/tmob) ASSERT(istype(tmob)) - //Can we even step on their tile normally? - var/can_move_into = 1 - if(tmob.loc.density) - can_move_into = 0 - if(can_move_into) - for(var/atom/movable/A in tmob.loc) - if(A == src) - continue - if(!A.CanPass(src, tmob.loc)) - can_move_into = 0 - if(!can_move_into) break - - if(!can_move_into) - return FALSE - //If they're flying, don't do any special interactions. if(ishuman(src)) var/mob/living/carbon/human/P = src From 7604c8550d2ae85311c980ea696c00d43c059c16 Mon Sep 17 00:00:00 2001 From: Heroman Date: Sat, 13 Apr 2019 12:30:47 +1000 Subject: [PATCH 097/141] Allows help-intent step with buckled mobs --- code/modules/mob/living/living.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index f300f8a350..a2e10d65c2 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -149,6 +149,10 @@ default behaviour is: tmob.forceMove(oldloc) now_pushing = 0 return + else if((tmob.mob_always_swap || (tmob.a_intent == I_HELP || tmob.restrained()) && (a_intent == I_HELP || src.restrained())) && canmove && can_swap && handle_micro_bump_helping(tmob)) + forceMove(tmob.loc) + now_pushing = 0 + return if(!can_move_mob(tmob, 0, 0)) now_pushing = 0 From 7dcbc669a282c7304a7663b92d6395aa8f8a687e Mon Sep 17 00:00:00 2001 From: Unknown Date: Fri, 12 Apr 2019 23:22:28 -0400 Subject: [PATCH 098/141] Fixes Evian's Egg Implant It was in a different part of the file so I missed it. --- code/modules/vore/fluffstuff/custom_items_vr.dm | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/code/modules/vore/fluffstuff/custom_items_vr.dm b/code/modules/vore/fluffstuff/custom_items_vr.dm index ac50c4d7d1..b2c001ed3f 100644 --- a/code/modules/vore/fluffstuff/custom_items_vr.dm +++ b/code/modules/vore/fluffstuff/custom_items_vr.dm @@ -1707,10 +1707,11 @@ return var/obj/item/weapon/implant/reagent_generator/evian/rimplant - for(var/I in contents) - if(istype(I, /obj/item/weapon/implant/reagent_generator)) - rimplant = I - break + for(var/obj/item/organ/external/E in organs) + for(var/obj/item/weapon/implant/I in E.implants) + if(istype(I, /obj/item/weapon/implant/reagent_generator)) + rimplant = I + break if (rimplant) if(rimplant.reagents.total_volume <= rimplant.transfer_amount) to_chat(src, "[pick(rimplant.empty_message)]") From 31ebde962c3273ba70d384c1ad940d6d3f05ab02 Mon Sep 17 00:00:00 2001 From: Heroman Date: Sat, 13 Apr 2019 13:58:12 +1000 Subject: [PATCH 099/141] Forgot vorestation edits --- code/modules/mob/living/living.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index a2e10d65c2..83438240c1 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -149,10 +149,12 @@ default behaviour is: tmob.forceMove(oldloc) now_pushing = 0 return + //VOREStation Edit - Begin else if((tmob.mob_always_swap || (tmob.a_intent == I_HELP || tmob.restrained()) && (a_intent == I_HELP || src.restrained())) && canmove && can_swap && handle_micro_bump_helping(tmob)) forceMove(tmob.loc) now_pushing = 0 return + //VOREStation Edit - End if(!can_move_mob(tmob, 0, 0)) now_pushing = 0 From 123cdfa395c8eee9bb59cdaf32b7a1a15b86701d Mon Sep 17 00:00:00 2001 From: Heroman Date: Sat, 13 Apr 2019 17:01:57 +1000 Subject: [PATCH 100/141] Fixes notify transcore checking for presense of backup --- code/modules/mob/dead/observer/observer_vr.dm | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/code/modules/mob/dead/observer/observer_vr.dm b/code/modules/mob/dead/observer/observer_vr.dm index 9b7566dd73..1c1c3772c6 100644 --- a/code/modules/mob/dead/observer/observer_vr.dm +++ b/code/modules/mob/dead/observer/observer_vr.dm @@ -63,17 +63,17 @@ set desc = "If your past-due backup notification was missed or ignored, you can use this to send a new one." var/record_found = FALSE - for(var/datum/transhuman/mind_record/record in SStranscore.backed_up) - if(record.ckey == ckey) - record_found = TRUE - if(!(record.dead_state == MR_DEAD)) - to_chat(src, "Your backup is not past-due yet.") - else if((world.time - record.last_notification) < 10 MINUTES) - to_chat(src, "Too little time has passed since your last notification.") - else - SStranscore.notify(record.mindname, TRUE) - record.last_notification = world.time - to_chat(src, "New notification has been sent.") + if(src.mind.name in SStranscore.backed_up) + record_found = TRUE + var/datum/transhuman/mind_record/record = SStranscore.backed_up[src.mind.name] + if(!(record.dead_state == MR_DEAD)) + to_chat(src, "Your backup is not past-due yet.") + else if((world.time - record.last_notification) < 10 MINUTES) + to_chat(src, "Too little time has passed since your last notification.") + else + SStranscore.notify(record.mindname, TRUE) + record.last_notification = world.time + to_chat(src, "New notification has been sent.") if(!record_found) to_chat(src, "No mind record found!") \ No newline at end of file From 86766e26c0612c417118e3108f0905ee6f3375f0 Mon Sep 17 00:00:00 2001 From: Heroman Date: Sat, 13 Apr 2019 17:20:01 +1000 Subject: [PATCH 101/141] Removes unnecesary var --- code/modules/mob/dead/observer/observer_vr.dm | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/code/modules/mob/dead/observer/observer_vr.dm b/code/modules/mob/dead/observer/observer_vr.dm index 1c1c3772c6..611bbb39a7 100644 --- a/code/modules/mob/dead/observer/observer_vr.dm +++ b/code/modules/mob/dead/observer/observer_vr.dm @@ -62,9 +62,7 @@ set name = "Notify Transcore" set desc = "If your past-due backup notification was missed or ignored, you can use this to send a new one." - var/record_found = FALSE if(src.mind.name in SStranscore.backed_up) - record_found = TRUE var/datum/transhuman/mind_record/record = SStranscore.backed_up[src.mind.name] if(!(record.dead_state == MR_DEAD)) to_chat(src, "Your backup is not past-due yet.") @@ -74,6 +72,5 @@ SStranscore.notify(record.mindname, TRUE) record.last_notification = world.time to_chat(src, "New notification has been sent.") - - if(!record_found) + else to_chat(src, "No mind record found!") \ No newline at end of file From acc989732081b8dff97e1aef818d68eb2aa3f593 Mon Sep 17 00:00:00 2001 From: Zap-zapper Date: Sat, 13 Apr 2019 18:42:53 +0700 Subject: [PATCH 102/141] Size control implant fix --- code/game/objects/items/weapons/implants/implant_vr.dm | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/code/game/objects/items/weapons/implants/implant_vr.dm b/code/game/objects/items/weapons/implants/implant_vr.dm index bf67f83953..bec23b4c2b 100644 --- a/code/game/objects/items/weapons/implants/implant_vr.dm +++ b/code/game/objects/items/weapons/implants/implant_vr.dm @@ -104,10 +104,7 @@ var/static/regex/size_mult = new/regex("\\d+") if(size_mult.Find(msg)) var/resizing_value = text2num(size_mult.match) - if(findtext(msg, "centimeter")) //Because metric system rules - H.resize(CLAMP(resizing_value/170 , 0.25, 2)) //170 cm is average crewmember, I think - else - H.resize(CLAMP(resizing_value , 0.25, 2)) + H.resize(CLAMP(resizing_value/100 , 0.25, 2)) @@ -128,7 +125,7 @@ description_info = {"Only accessable by those who implanted the victim. Self-implanting allows everyone to change host size. The following special commands are available: 'Shrink' - host size decreases. 'Grow' - host size increases. -'Resize (NUMBER)' or 'Resize (NUMBER) centimeter(s)' - for accurate size control. +'Resize (NUMBER)' - for accurate size control. 'Ignore' - keywords in the speech won't have any effect. 'Implant-toggle' - toggles implant."} From 098f8851ad0b3c1d210090730c3474fecb225dc6 Mon Sep 17 00:00:00 2001 From: Neerti Date: Sat, 13 Apr 2019 17:34:08 -0400 Subject: [PATCH 104/141] Arrivals Power Fix --- code/game/area/Space Station 13 areas.dm | 6 +++ html/changelogs/Woodrat - mapfixes.yml | 5 +++ maps/southern_cross/southern_cross-1.dmm | 53 +++++++++++++----------- 3 files changed, 39 insertions(+), 25 deletions(-) create mode 100644 html/changelogs/Woodrat - mapfixes.yml diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 66dbaa6e2e..787cc55f7b 100755 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -978,6 +978,12 @@ NOTE: there are two lists of areas in the end of this file: centcom and station icon_state = "entry_D2" base_turf = /turf/space +/area/hallway/secondary/entry/D2/arrivals + name = "\improper Shuttle Dock Hallway - Dock Two" + icon_state = "entry_D2" + base_turf = /turf/space + requires_power = 0 + /area/hallway/secondary/entry/D3 name = "\improper Shuttle Dock Hallway - Dock Three" icon_state = "entry_D3" diff --git a/html/changelogs/Woodrat - mapfixes.yml b/html/changelogs/Woodrat - mapfixes.yml new file mode 100644 index 0000000000..5371940049 --- /dev/null +++ b/html/changelogs/Woodrat - mapfixes.yml @@ -0,0 +1,5 @@ +author: Woodrat +delete-after: True +changes: + - tweak: "Arrivals dock should not stay locked shut" + - bugfix: "Two windoors in xenobio stationside lacking access requirements" \ No newline at end of file diff --git a/maps/southern_cross/southern_cross-1.dmm b/maps/southern_cross/southern_cross-1.dmm index f4311ba8e7..b2c92d1d8b 100644 --- a/maps/southern_cross/southern_cross-1.dmm +++ b/maps/southern_cross/southern_cross-1.dmm @@ -317357,7 +317357,7 @@ aaa "aSe" = (/turf/simulated/floor/airless,/area/hallway/secondary/escape/firstdeck/ep_aftstarboard) "aSf" = (/turf/space,/area/skipjack_station/firstdeck) "aSg" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/shuttle/plating,/area/shuttle/escape_pod3/station) -"aSh" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/window/brigdoor/southleft{name = "Containment Pen"; req_access = newlist()},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled/techmaint,/area/rnd/xenobiology) +"aSh" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/industrial/warning,/obj/machinery/door/window/brigdoor/southright{name = "Containment Pen"; req_access = list(47)},/turf/simulated/floor/tiled/techmaint,/area/rnd/xenobiology) "aSi" = (/obj/structure/bed/chair{dir = 8},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/obj/structure/closet/walllocker/emerglocker{pixel_y = -32},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod3/station) "aSj" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/vending/wallmed1{name = "NanoMed Wall"; pixel_x = 0; pixel_y = -30},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod3/station) "aSk" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_3_hatch"; locked = 1; name = "Escape Pod Hatch 3"; req_access = list(13)},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod3/station) @@ -324383,10 +324383,10 @@ aaa "dxk" = (/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_dock_north_starboard_inner"; locked = 1; name = "Escape Airlock"; req_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2) "dxl" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "escape_dock_north_starboard_airlock"; name = "interior access button"; pixel_x = -26; pixel_y = 26; req_one_access = list(13)},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2) "dxm" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "arrivals_dock_north_airlock"; name = "interior access button"; pixel_x = 26; pixel_y = 26; req_one_access = list(13)},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2) -"dxn" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_north_inner"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2) +"dxn" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_north_inner"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2/arrivals) "dxo" = (/turf/simulated/floor/airless,/obj/structure/shuttle/engine/propulsion{icon_state = "burst_l"; dir = 4},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/cryo/station) -"dxp" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "arrivals_dock_north_pump"},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2) -"dxq" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_north_outer"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2) +"dxp" = (/obj/machinery/embedded_controller/radio/airlock/docking_port_multi{frequency = 1380; id_tag = "arrivals_dock_north_airlock"; master_tag = "arrivals_dock"; pixel_y = 30; req_one_access = list(13); tag_airlock_mech_sensor = "arrivals_dock_north_mech"; tag_airpump = "arrivals_dock_north_pump"; tag_chamber_sensor = "arrivals_dock_north_sensor"; tag_exterior_door = "arrivals_dock_north_outer"; tag_interior_door = "arrivals_dock_north_inner"; tag_shuttle_mech_sensor = "shuttle_dock_north_mech"},/obj/effect/floor_decal/industrial/loading{icon_state = "loadingarea"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2/arrivals) +"dxq" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "arrivals_dock_north_pump"},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2/arrivals) "dxr" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "dock3_north_outer"; locked = 1; name = "External Airlock Access"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D3) "dxs" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1380; id_tag = "dock3_north_pump"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3) "dxt" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "dock3_north_airlock"; pixel_x = 0; pixel_y = 30; req_one_access = list(13); tag_airpump = "dock3_north_pump"; tag_chamber_sensor = "dock3_north_sensor"; tag_exterior_door = "dock3_north_outer"; tag_interior_door = "dock3_north_inner"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1380; id_tag = "dock3_north_pump"},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3) @@ -324404,10 +324404,10 @@ aaa "dxF" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2) "dxG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8; icon_state = "map"},/turf/simulated/floor/tiled/monotile,/area/hallway/secondary/entry/D2) "dxH" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2) -"dxI" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_north_inner"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2) -"dxJ" = (/obj/machinery/light/small,/obj/effect/floor_decal/industrial/loading{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2) -"dxK" = (/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "arrivals_dock_north_sensor"; pixel_x = 0; pixel_y = -25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "arrivals_dock_north_pump"},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2) -"dxL" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_north_outer"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "arrivals_dock_north_airlock"; name = "exterior access button"; pixel_x = 4; pixel_y = -26; req_one_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2) +"dxI" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_north_outer"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2/arrivals) +"dxJ" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_north_inner"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2/arrivals) +"dxK" = (/obj/machinery/light/small,/obj/effect/floor_decal/industrial/loading{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2/arrivals) +"dxL" = (/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "arrivals_dock_north_sensor"; pixel_x = 0; pixel_y = -25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "arrivals_dock_north_pump"},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2/arrivals) "dxM" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "dock3_north_airlock"; name = "exterior access button"; pixel_x = -5; pixel_y = -26; req_one_access = list(13)},/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "dock3_north_outer"; locked = 1; name = "External Airlock Access"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2) "dxN" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1380; id_tag = "dock3_north_pump"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "dock3_north_sensor"; pixel_x = 0; pixel_y = -25},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3) "dxO" = (/obj/machinery/light/small,/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1380; id_tag = "dock3_north_pump"},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3) @@ -324445,9 +324445,9 @@ aaa "dyu" = (/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "specops_dock_inner"; locked = 1; name = "Dock One Internal Airlock"; req_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D1) "dyv" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "response_shuttle_dock_airlock"; name = "interior access button"; pixel_x = -28; pixel_y = 26; req_one_access = list(13)},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1) "dyw" = (/obj/machinery/alarm{dir = 8; pixel_x = 22; pixel_y = 0},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1) -"dyx" = (/obj/structure/closet/emcloset,/obj/structure/extinguisher_cabinet{pixel_x = -28; pixel_y = 0},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2) +"dyx" = (/obj/structure/closet/emcloset,/obj/structure/extinguisher_cabinet{pixel_x = -28; pixel_y = 0},/obj/item/weapon/tool/crowbar/red,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2) "dyy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/hologram/holopad,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/monotile,/area/hallway/secondary/entry/D2) -"dyz" = (/obj/machinery/alarm{dir = 8; pixel_x = 22; pixel_y = 0},/obj/structure/closet/emcloset,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2) +"dyz" = (/obj/machinery/alarm{dir = 8; pixel_x = 22; pixel_y = 0},/obj/structure/closet/emcloset,/obj/item/weapon/tool/crowbar/red,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2) "dyA" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3) "dyB" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "shuttle2_dock_airlocksc"; name = "interior access button"; pixel_x = 28; pixel_y = -26; req_one_access = list(13)},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3) "dyC" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "s2s_dock_inner"; locked = 1; name = "Dock Three Internal Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D3) @@ -324484,10 +324484,10 @@ aaa "dzh" = (/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_dock_south_starboard_inner"; locked = 1; name = "Escape Airlock"; req_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2) "dzi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/tiled/monotile,/area/hallway/secondary/entry/D2) "dzj" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2) -"dzk" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_south_inner"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2) -"dzl" = (/obj/machinery/embedded_controller/radio/airlock/docking_port_multi{frequency = 1380; id_tag = "arrivals_dock_north_airlock"; master_tag = "arrivals_dock"; pixel_y = 30; req_one_access = list(13); tag_airlock_mech_sensor = "arrivals_dock_north_mech"; tag_airpump = "arrivals_dock_north_pump"; tag_chamber_sensor = "arrivals_dock_north_sensor"; tag_exterior_door = "arrivals_dock_north_outer"; tag_interior_door = "arrivals_dock_north_inner"; tag_shuttle_mech_sensor = "shuttle_dock_north_mech"},/obj/effect/floor_decal/industrial/loading{icon_state = "loadingarea"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2) -"dzm" = (/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "arrivals_dock_south_sensor"; pixel_x = 0; pixel_y = 25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "arrivals_dock_south_pump"},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2) -"dzn" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_south_outer"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "arrivals_dock_south_airlock"; name = "exterior access button"; pixel_x = 4; pixel_y = 26; req_one_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2) +"dzk" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_north_outer"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "arrivals_dock_north_airlock"; name = "exterior access button"; pixel_x = 4; pixel_y = -26; req_one_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2/arrivals) +"dzl" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_south_inner"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2/arrivals) +"dzm" = (/obj/effect/floor_decal/industrial/loading{icon_state = "loadingarea"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2/arrivals) +"dzn" = (/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "arrivals_dock_south_sensor"; pixel_x = 0; pixel_y = 25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "arrivals_dock_south_pump"},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2/arrivals) "dzo" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "dock3_south_outer"; locked = 1; name = "External Airlock Access"; req_access = list(13)},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "dock3_south_airlock"; name = "exterior access button"; pixel_x = -5; pixel_y = 26; req_one_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D3) "dzp" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "dock3_south_sensor"; pixel_x = 0; pixel_y = 25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1380; id_tag = "dock3_south_pump"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3) "dzq" = (/obj/machinery/light/small{dir = 1},/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1380; id_tag = "dock3_south_pump"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3) @@ -324503,10 +324503,10 @@ aaa "dzA" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "escape_dock_south_starboard_airlock"; name = "interior access button"; pixel_x = -26; pixel_y = -26; req_one_access = list(13)},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2) "dzB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8; icon_state = "map"},/turf/simulated/floor/tiled/monotile,/area/hallway/secondary/entry/D2) "dzC" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "arrivals_dock_south_airlock"; name = "interior access button"; pixel_x = 26; pixel_y = -26; req_one_access = list(13)},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2) -"dzD" = (/obj/effect/floor_decal/industrial/loading{icon_state = "loadingarea"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2) -"dzE" = (/obj/machinery/embedded_controller/radio/airlock/docking_port_multi{frequency = 1380; id_tag = "arrivals_dock_south_airlock"; master_tag = "arrivals_dock"; pixel_y = -30; req_one_access = list(13); tag_airlock_mech_sensor = "arrivals_dock_south_mech"; tag_airpump = "arrivals_dock_south_pump"; tag_chamber_sensor = "arrivals_dock_south_sensor"; tag_exterior_door = "arrivals_dock_south_outer"; tag_interior_door = "arrivals_dock_south_inner"; tag_shuttle_mech_sensor = "arrivals_dock_south_mech"},/obj/effect/floor_decal/industrial/loading{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2) -"dzF" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "arrivals_dock_south_pump"},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2) -"dzG" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_south_outer"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2) +"dzD" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_south_outer"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "arrivals_dock_south_airlock"; name = "exterior access button"; pixel_x = 4; pixel_y = 26; req_one_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2/arrivals) +"dzE" = (/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_south_inner"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2/arrivals) +"dzF" = (/obj/machinery/embedded_controller/radio/airlock/docking_port_multi{frequency = 1380; id_tag = "arrivals_dock_south_airlock"; master_tag = "arrivals_dock"; pixel_y = -30; req_one_access = list(13); tag_airlock_mech_sensor = "arrivals_dock_south_mech"; tag_airpump = "arrivals_dock_south_pump"; tag_chamber_sensor = "arrivals_dock_south_sensor"; tag_exterior_door = "arrivals_dock_south_outer"; tag_interior_door = "arrivals_dock_south_inner"; tag_shuttle_mech_sensor = "arrivals_dock_south_mech"},/obj/effect/floor_decal/industrial/loading{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2/arrivals) +"dzG" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "arrivals_dock_south_pump"},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2/arrivals) "dzH" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "dock3_south_outer"; locked = 1; name = "External Airlock Access"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2) "dzI" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1380; id_tag = "dock3_south_pump"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3) "dzJ" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "dock3_south_airlock"; pixel_x = 0; pixel_y = -30; req_one_access = list(13); tag_airpump = "dock3_south_pump"; tag_chamber_sensor = "dock3_south_sensor"; tag_exterior_door = "dock3_south_outer"; tag_interior_door = "dock3_south_inner"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1380; id_tag = "dock3_south_pump"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3) @@ -324535,7 +324535,7 @@ aaa "dAg" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1) "dAh" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"},/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/hallway/secondary/entry/D1) "dAi" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/floor_decal/industrial/warning,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "admin_shuttle_dock_airlock"; name = "interior access button"; pixel_x = 26; pixel_y = -26; req_one_access = list(13)},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2) -"dAj" = (/obj/structure/closet/emcloset,/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2) +"dAj" = (/obj/structure/closet/emcloset,/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/obj/item/weapon/tool/crowbar/red,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2) "dAk" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3) "dAl" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1331; master_tag = "nuke_shuttle_dock_airlock"; name = "interior access button"; pixel_x = 26; pixel_y = -26; req_one_access = list(13)},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3) "dAm" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"},/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/hallway/secondary/entry/D3) @@ -324671,7 +324671,7 @@ aaa "dCM" = (/obj/machinery/porta_turret/ai_defense,/obj/effect/floor_decal/industrial/outline/grey,/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/tiled/techfloor,/area/ai) "dCN" = (/obj/effect/floor_decal/industrial/warning{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/tiled/techfloor,/area/ai) "dCO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/greengrid,/area/ai) -"dCP" = (/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_south_inner"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2) +"dCP" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_south_outer"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2/arrivals) "dCQ" = (/obj/effect/floor_decal/industrial/warning{dir = 9},/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/tiled/techfloor,/area/ai) "dCR" = (/obj/machinery/porta_turret/ai_defense,/obj/effect/floor_decal/industrial/outline/grey,/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 1},/turf/simulated/floor/tiled/techfloor,/area/ai) "dCS" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/maintenance/thirddeck/forestarboard) @@ -326012,7 +326012,7 @@ aaa "ecC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/meter,/obj/random/mob/mouse,/turf/simulated/floor/plating,/area/maintenance/thirddeck/foreport) "ecD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/meter,/obj/random/mob/mouse,/turf/simulated/floor/plating,/area/maintenance/thirddeck/forestarboard) "ecE" = (/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "heads_meeting"; name = "Meeting Room Window Shutters"; opacity = 0},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/bridge/meeting_room) - + (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -326474,15 +326474,15 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsTdsTdsTaaaaaaaaadsTdsTdsTaaaaaaaaaaaadvjdwsdwwdvjaaaaaaaafaaadvHdvHdvHdvHdvHdvHdvHdvHdvHaaaaafaaaaaadvkdwxdvwdvxdvkaaaaaaaafaaadwldwldwldwldwldwldwlaaaaaaaaaaafaaaaaadvodwydwvdvoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadufdufdufdufdufdufdufaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsTdsTaaaaaaaaaaaaaaadsTdsTaaaaaaaaaaaaduUdwzdwAduUaaaaaaaaadvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHaaaaaaaaaduYdwBdwCdwDduYaaaaaaaaadwldwldwldwldwldwldwldwldwlaaaaaaaaaaaaaaadvedwEdwFdveaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadufdufdufdufdufdufdufaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaadwGduUduUduUduUdwHdwIdwhdwJdwKdwLdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdwMdwNdwOdwPdwQdwRdwSdvkdVjdVjdVkdwldwldwldwldwldwldwldwldwlaaaaaadVndVldVmdwXdwYdwZdvedvedvedvedxaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadufdufdufdufdufdufdufaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduUdxbdxcdxddxedxfdxgdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdxhdxidxjdxkdxldvwdxmdxndzldxpdxqdwldwldwldwldwldwldwldwldwlaaaaaadxrdxsdxtdxudxvdxwdveaaaaaaaaaaaadxxdxxaaaaaaaaaaaaaaadxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadufdufdufdufdufaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadvjdwsdxydxddxzdxAdxBdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdxCdxDdxEdxkdxFdxGdxHdxIdxJdxKdxLdwldwldwldwldwldwldwldwldwlaaaaaadxMdxNdxOdxudxPdwvdvoaaaaaaaaaaaadxxdxxdxxaaaaaaaaadxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduUdxbdxcdxddxedxfdxgdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdxhdxidxjdxkdxldvwdxmdxndxpdxqdxIdwldwldwldwldwldwldwldwldwlaaaaaadxrdxsdxtdxudxvdxwdveaaaaaaaaaaaadxxdxxaaaaaaaaaaaaaaadxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadufdufdufdufdufaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadvjdwsdxydxddxzdxAdxBdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdxCdxDdxEdxkdxFdxGdxHdxJdxKdxLdzkdwldwldwldwldwldwldwldwldwlaaaaaadxMdxNdxOdxudxPdwvdvoaaaaaaaaaaaadxxdxxdxxaaaaaaaaadxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadxQdxQdxQdxQdxQdxQdxQdxQdxQdxQdxQaaaaaaaaaaaadvjdvjdxRdxSdwhdxTdxUdvDdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdxVdxWdxXdwPdxYdxZdyadvkdvkdVjdVjdwldwldwldwldwldwldwldwldwlaaaaaadvNdVodycdyddyedyfdvodvoaaaaaaaaadxxdxxdxxdxxdxxdxxdxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadxQdxQdxQdxQdxQdxQdxQdxQdxQdxQdxQdxQdygdyhdVpdwhdyjdwjdwkdykduUaaaaaadvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHaaaaaaduYdyldvxdvwdvxdymduYaaaaaadwldwldwldwldwldwldwldwldwlaaaaaaaaaaaadvedyndwmdwndyodwpdVqdyqdvNdxxdxxdxxdxxdxxdxxdxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadxQdxQdxQdxQdxQdxQdxQdxQdxQdxQdxQdxQdyrdysdytdyudyvdvUdwtdywduUaaaaaadvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHaaaaaaduYdyxdvxdyydvxdyzduYaaaaaadwldwldwldwldwldwldwldwldwlaaaaaaaaaaaadvedyAdwudvZdyBdyCdyDdyEdyFdxxdxxdxxdxxdxxdxxdxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadxQdxQdxQdxQdxQdxQdxQdxQdxQdxQdxQdxQdvDdvDdvDdvjdyGdyHdyIdyJduUaaaaaadvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHaaaaaaduYdyKdvxdyLdyMdyNduYaaaaaadwldwldwldwldwldwldwldwldwlaaaaaaaaaaaadvedyOdyPdyQdyRdvodvNdvNdvOdxxdxxdxxdxxdxxdxxdxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadxQdxQdxQdxQdxQdxQdxQdxQdxQdxQdxQaaaaaaaaaaaadvjdvjdySdyTdwhdwJdwKdvDdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdxVdwNdwOdwPdyUdyVdyWdvkdvkdVjdVjdwldwldwldwldwldwldwldwldwlaaaaaadvNdVldVmdwXdyXdyYdvodvoaaaaaaaaadxxdxxdxxdxxdxxdxxdxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadvjdwsdyZdzadzbdzcdzddvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdzedzfdzgdzhdxFdzidzjdzkdzDdzmdzndwldwldwldwldwldwldwldwldwlaaaaaadzodzpdzqdzrdzsdwvdvoaaaaaaaaaaaaaaadxxdxxdxxdxxdxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduUdwsdztdzadzudzvdzwdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdzxdzydzzdzhdzAdzBdzCdCPdzEdzFdzGdwldwldwldwldwldwldwldwldwlaaaaaadzHdzIdzJdzrdzKdwvdveaaaaaaaaaaaaaaadxxdxxdxxdxxdxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadvjdwsdyZdzadzbdzcdzddvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdzedzfdzgdzhdxFdzidzjdzldzmdzndzDdwldwldwldwldwldwldwldwldwlaaaaaadzodzpdzqdzrdzsdwvdvoaaaaaaaaaaaaaaadxxdxxdxxdxxdxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduUdwsdztdzadzudzvdzwdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdzxdzydzzdzhdzAdzBdzCdzEdzFdzGdCPdwldwldwldwldwldwldwldwldwlaaaaaadzHdzIdzJdzrdzKdwvdveaaaaaaaaaaaaaaadxxdxxdxxdxxdxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaadwGduUduUduUduUdzLdzMdwhdxTdxUdwLdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdwMdxWdxXdwPdzNdyVdzOdvkdVjdVjdVkdwldwldwldwldwldwldwldwldwlaaaaaadVndVodVrdwXdzPdzQdvedvedvedvedxaaaadxxdxxdxxdxxdxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduUdzRdzSduUaaaaaaaaadvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHaaaaaaaaaduYdzTdzUdzVduYaaaaaaaaadwldwldwldwldwldwldwldwldwlaaaaaaaaaaaaaaadvedzWdzXdveaaaaaaaaaaaaaaadxxdxxdxxdxxdxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadvjdzYdzZdvjaaaaaaaaadvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHaaaaaaaaadvudAadAbdvxdvuaaaaaaaaadwldwldwldwldwldwldwldwldwlaaaaaaaaaaaaaaadvodAcdAddvoaaaaaaaaaaaaaaadxxdxxdxxdxxdxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -326786,5 +326786,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa dUOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} +<<<<<<< HEAD >>>>>>> 6a2cd30... Replaces AI-controlled Maint Drones with AI-controlled Borg Shells (#6025) +======= +>>>>>>> ee9ecc1... Merge pull request #6064 from Woodratt/20190904_arrivalspower From 346725f28b868406f30ac7ac0214de1f5e9c52b4 Mon Sep 17 00:00:00 2001 From: Jonathon Key Date: Sat, 13 Apr 2019 16:36:59 -0500 Subject: [PATCH 106/141] Adds a colorable cloak in loadout (#6040) --- .../preference_setup/loadout/loadout_suit.dm | 8 ++++++++ .../clothing/under/accessories/clothing.dm | 7 +++++++ icons/mob/ties.dmi | Bin 75147 -> 76061 bytes icons/obj/clothing/ties.dmi | Bin 44236 -> 44614 bytes 4 files changed, 15 insertions(+) diff --git a/code/modules/client/preference_setup/loadout/loadout_suit.dm b/code/modules/client/preference_setup/loadout/loadout_suit.dm index 2dbdcde1d3..e2a661f5f3 100644 --- a/code/modules/client/preference_setup/loadout/loadout_suit.dm +++ b/code/modules/client/preference_setup/loadout/loadout_suit.dm @@ -273,6 +273,14 @@ datum/gear/suit/duster display_name = "cloak, medical" path = /obj/item/clothing/accessory/poncho/roles/cloak/medical +/datum/gear/suit/roles/poncho/cloak/custom //A colorable cloak + display_name = "cloak (colorable)" + path = /obj/item/clothing/accessory/poncho/roles/cloak/custom + +/datum/gear/suit/roles/poncho/cloak/custom/New() + ..() + gear_tweaks = list(gear_tweak_free_color_choice) + /datum/gear/suit/unathi_robe display_name = "roughspun robe" path = /obj/item/clothing/suit/unathi/robe diff --git a/code/modules/clothing/under/accessories/clothing.dm b/code/modules/clothing/under/accessories/clothing.dm index 29057e8469..66636aac6f 100644 --- a/code/modules/clothing/under/accessories/clothing.dm +++ b/code/modules/clothing/under/accessories/clothing.dm @@ -216,6 +216,13 @@ icon_state = "medcloak" item_state = "medcloak" + +/obj/item/clothing/accessory/poncho/roles/cloak/custom //A colorable cloak + name = "cloak" + desc = "A simple, bland cloak." + icon_state = "colorcloak" + item_state = "colorcloak" + /obj/item/clothing/accessory/hawaii name = "flower-pattern shirt" desc = "You probably need some welder googles to look at this." diff --git a/icons/mob/ties.dmi b/icons/mob/ties.dmi index 25935ccfbc16e237b5a1fb3e1f0975f608b330b7..ed5fd931450498289a4d5162e65eca5ca0d92527 100644 GIT binary patch delta 15731 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 NQhTXdrDFB(e*k8xVXFWD From fc7c6f38b42d9de09893861b4d58548d64ebf83b Mon Sep 17 00:00:00 2001 From: Neerti Date: Sat, 13 Apr 2019 22:44:21 -0400 Subject: [PATCH 109/141] Base features for Precursotech and Anomalotech Expansion --- code/__defines/misc.dm | 10 + code/__defines/research.dm | 1 + code/__defines/xenoarcheaology.dm | 4 +- code/defines/obj/weapon.dm | 85 ++++ code/game/machinery/autolathe.dm | 2 +- code/game/machinery/bioprinter.dm | 22 +- code/game/mecha/mech_fabricator.dm | 13 +- code/game/mecha/mech_prosthetics.dm | 13 +- .../items/weapons/circuitboards/mecha.dm | 23 ++ .../items/weapons/material/material_armor.dm | 25 ++ .../objects/structures/props/alien_props.dm | 10 +- code/modules/materials/material_recipes.dm | 4 + code/modules/materials/material_sheets.dm | 96 ++++- code/modules/materials/materials.dm | 86 ++++- code/modules/mining/drilling/drill.dm | 24 +- code/modules/mining/drilling/scanner.dm | 8 +- code/modules/mining/machine_processing.dm | 3 +- code/modules/mining/mine_turfs.dm | 8 +- code/modules/mining/ore.dm | 29 ++ code/modules/mining/ore_datum.dm | 30 ++ code/modules/power/singularity/generator.dm | 21 + .../particle_accelerator/particle.dm | 2 +- .../particle_accelerator/particle_smasher.dm | 365 ++++++++++++++++++ code/modules/random_map/noise/ore.dm | 9 + code/modules/research/circuitprinter.dm | 6 +- code/modules/research/designs/precursor.dm | 25 ++ code/modules/research/designs/stock_parts.dm | 70 ++++ code/modules/research/protolathe.dm | 39 +- code/modules/research/rdconsole.dm | 14 + code/modules/research/rdmachines.dm | 48 +-- code/modules/research/research.dm | 10 +- .../xenoarcheaology/artifacts/artifact.dm | 7 +- code/modules/xenoarcheaology/finds/eguns.dm | 15 +- .../xenoarcheaology/finds/find_spawning.dm | 115 +++++- icons/mecha/mecha.dmi | Bin 213024 -> 222812 bytes icons/obj/abductor.dmi | Bin 267710 -> 270604 bytes icons/obj/items.dmi | Bin 62769 -> 63181 bytes icons/obj/machines/particle_smasher.dmi | Bin 0 -> 2879 bytes icons/obj/mining.dmi | Bin 69901 -> 72635 bytes icons/obj/stacks.dmi | Bin 44370 -> 48109 bytes icons/obj/stock_parts.dmi | Bin 67153 -> 70886 bytes icons/obj/xenoarchaeology.dmi | Bin 69275 -> 73470 bytes vorestation.dme | 2 + 43 files changed, 1141 insertions(+), 103 deletions(-) create mode 100644 code/modules/power/singularity/particle_accelerator/particle_smasher.dm create mode 100644 code/modules/research/designs/precursor.dm create mode 100644 icons/obj/machines/particle_smasher.dmi diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm index 0e3234ed83..c17e6d1594 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -145,7 +145,10 @@ #define DEFAULT_TABLE_MATERIAL "plastic" #define DEFAULT_WALL_MATERIAL "steel" +#define MAT_IRON "iron" +#define MAT_MARBLE "marble" #define MAT_STEEL "steel" +#define MAT_PLASTIC "plastic" #define MAT_GLASS "glass" #define MAT_SILVER "silver" #define MAT_GOLD "gold" @@ -164,6 +167,13 @@ #define MAT_DURASTEEL "durasteel" #define MAT_DURASTEELHULL "durasteel hull" #define MAT_TITANIUMHULL "titanium hull" +#define MAT_VERDANTIUM "verdantium" +#define MAT_MORPHIUM "morphium" +#define MAT_MORPHIUMHULL "morphium hull" +#define MAT_VALHOLLIDE "valhollide" +#define MAT_LEAD "lead" +#define MAT_SUPERMATTER "supermatter" +#define MAT_METALHYDROGEN "mhydrogen" #define SHARD_SHARD "shard" #define SHARD_SHRAPNEL "shrapnel" diff --git a/code/__defines/research.dm b/code/__defines/research.dm index 9c3bec3066..b55f6601f8 100644 --- a/code/__defines/research.dm +++ b/code/__defines/research.dm @@ -11,6 +11,7 @@ #define TECH_DATA "programming" #define TECH_ILLEGAL "syndicate" #define TECH_ARCANE "arcane" +#define TECH_PRECURSOR "precursor" #define IMPRINTER 0x0001 //For circuits. Uses glass/chemicals. #define PROTOLATHE 0x0002 //New stuff. Uses glass/metal/chemicals diff --git a/code/__defines/xenoarcheaology.dm b/code/__defines/xenoarcheaology.dm index b8b781795f..45e40cfbde 100644 --- a/code/__defines/xenoarcheaology.dm +++ b/code/__defines/xenoarcheaology.dm @@ -34,7 +34,9 @@ #define ARCHAEO_REMAINS_XENO 34 #define ARCHAEO_GASMASK 35 #define ARCHAEO_ALIEN_ITEM 36 -#define MAX_ARCHAEO 36 +#define ARCHAEO_ALIEN_BOAT 37 +#define ARCHAEO_IMPERION_CIRCUIT 38 +#define MAX_ARCHAEO 38 #define DIGSITE_GARDEN 1 #define DIGSITE_ANIMAL 2 diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index 493d5ccd38..8d31ecb9f4 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -555,6 +555,91 @@ rating = 3 matter = list(DEFAULT_WALL_MATERIAL = 80) +// Rating 4 - Anomaly + +/obj/item/weapon/stock_parts/capacitor/hyper + name = "hyper capacitor" + desc = "A hyper-capacity capacitor used in the construction of a variety of devices." + icon_state = "capacitor_hyper" + origin_tech = list(TECH_POWER = 6, TECH_MATERIAL = 5, TECH_BLUESPACE = 1, TECH_ARCANE = 1) + rating = 4 + matter = list(DEFAULT_WALL_MATERIAL = 80, MAT_GLASS = 40) + +/obj/item/weapon/stock_parts/scanning_module/hyper + name = "quantum scanning module" + desc = "A compact, near-perfect resolution quantum scanning module used in the construction of certain devices." + icon_state = "scan_module_hyper" + origin_tech = list(TECH_MAGNET = 6, TECH_BLUESPACE = 1, TECH_ARCANE = 1) + rating = 4 + matter = list(DEFAULT_WALL_MATERIAL = 100,"glass" = 40) + +/obj/item/weapon/stock_parts/manipulator/hyper + name = "planck-manipulator" + desc = "A miniscule manipulator used in the construction of certain devices." + icon_state = "hyper_mani" + origin_tech = list(TECH_MATERIAL = 6, TECH_DATA = 3, TECH_ARCANE = 1) + rating = 4 + matter = list(DEFAULT_WALL_MATERIAL = 30) + +/obj/item/weapon/stock_parts/micro_laser/hyper + name = "hyper-power micro-laser" + icon_state = "hyper_micro_laser" + desc = "A tiny laser used in certain devices." + origin_tech = list(TECH_MAGNET = 6, TECH_ARCANE = 1) + rating = 4 + matter = list(DEFAULT_WALL_MATERIAL = 30, MAT_GLASS = 40) + +/obj/item/weapon/stock_parts/matter_bin/hyper + name = "hyper matter bin" + desc = "A container for holding compressed matter awaiting re-construction." + icon_state = "hyper_matter_bin" + origin_tech = list(TECH_MATERIAL = 6, TECH_ARCANE = 1) + rating = 4 + matter = list(DEFAULT_WALL_MATERIAL = 100) + +// Rating 5 - Precursor + +/obj/item/weapon/stock_parts/capacitor/omni + name = "omni-capacitor" + desc = "A capacitor of immense capacity used in the construction of a variety of devices." + icon_state = "capacitor_omni" + origin_tech = list(TECH_POWER = 7, TECH_MATERIAL = 6, TECH_BLUESPACE = 3, TECH_PRECURSOR = 1) + rating = 5 + matter = list(DEFAULT_WALL_MATERIAL = 80, MAT_GLASS = 40) + +/obj/item/weapon/stock_parts/scanning_module/omni + name = "omni-scanning module" + desc = "A compact, perfect resolution temporospatial scanning module used in the construction of certain devices." + icon_state = "scan_module_omni" + origin_tech = list(TECH_MAGNET = 7, TECH_BLUESPACE = 3, TECH_PRECURSOR = 1) + rating = 5 + matter = list(DEFAULT_WALL_MATERIAL = 100,"glass" = 40) + +/obj/item/weapon/stock_parts/manipulator/omni + name = "omni-manipulator" + desc = "A strange, infinitesimal manipulator used in the construction of certain devices." + icon_state = "omni_mani" + origin_tech = list(TECH_MATERIAL = 7, TECH_DATA = 4, TECH_PRECURSOR = 1) + rating = 5 + matter = list(DEFAULT_WALL_MATERIAL = 30) + +/obj/item/weapon/stock_parts/micro_laser/omni + name = "omni-power micro-laser" + icon_state = "omni_micro_laser" + desc = "A strange laser used in certain devices." + origin_tech = list(TECH_MAGNET = 7, TECH_PRECURSOR = 1) + rating = 5 + matter = list(DEFAULT_WALL_MATERIAL = 30, MAT_GLASS = 40) + +/obj/item/weapon/stock_parts/matter_bin/omni + name = "omni-matter bin" + desc = "A strange container for holding compressed matter awaiting re-construction." + icon_state = "omni_matter_bin" + origin_tech = list(TECH_MATERIAL = 7, TECH_PRECURSOR = 1) + rating = 5 + matter = list(DEFAULT_WALL_MATERIAL = 100) + + // Subspace stock parts /obj/item/weapon/stock_parts/subspace/ansible diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 0ce85959ef..c04760b4ef 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -304,7 +304,7 @@ storage_capacity[DEFAULT_WALL_MATERIAL] = mb_rating * 25000 storage_capacity["glass"] = mb_rating * 12500 build_time = 50 / man_rating - mat_efficiency = 1.1 - man_rating * 0.1// Normally, price is 1.25 the amount of material, so this shouldn't go higher than 0.8. Maximum rating of parts is 3 + mat_efficiency = 1.1 - man_rating * 0.1// Normally, price is 1.25 the amount of material, so this shouldn't go higher than 0.6. Maximum rating of parts is 5 /obj/machinery/autolathe/dismantle() for(var/mat in stored_material) diff --git a/code/game/machinery/bioprinter.dm b/code/game/machinery/bioprinter.dm index cc982ce207..f60fcabbfa 100644 --- a/code/game/machinery/bioprinter.dm +++ b/code/game/machinery/bioprinter.dm @@ -19,6 +19,7 @@ var/base_print_delay = 100 // For Adminbus reasons var/printing var/loaded_dna //Blood sample for DNA hashing. + var/malfunctioning = FALSE // May cause rejection, or the printing of some alien limb instead! // These should be subtypes of /obj/item/organ // Costs roughly 20u Phoron (1 sheet) per internal organ, limbs are 60u for limb and extremity @@ -76,10 +77,19 @@ /obj/machinery/organ_printer/RefreshParts() // Print Delay updating print_delay = base_print_delay + var/manip_rating = 0 for(var/obj/item/weapon/stock_parts/manipulator/manip in component_parts) + manip_rating += manip.rating print_delay -= (manip.rating-1)*10 print_delay = max(0,print_delay) + manip_rating = round(manip_rating / 2) + + if(manip_rating >= 5) + malfunctioning = TRUE + else + malfunctioning = initial(malfunctioning) + . = ..() /obj/machinery/organ_printer/attack_hand(mob/user) @@ -182,7 +192,17 @@ O.set_dna(C.dna) O.species = C.species - if(istype(O, /obj/item/organ/external)) + var/malfunctioned = FALSE + + if(malfunctioning && prob(30)) // Alien Tech is a hell of a drug. + malfunctioned = TRUE + var/possible_species = list(SPECIES_HUMAN, SPECIES_VOX, SPECIES_SKRELL, SPECIES_ZADDAT, SPECIES_UNATHI, SPECIES_GOLEM, SPECIES_SHADOW) + var/new_species = pick(possible_species) + if(!all_species[new_species]) + new_species = SPECIES_HUMAN + O.species = all_species[new_species] + + if(istype(O, /obj/item/organ/external) && !malfunctioned) var/obj/item/organ/external/E = O E.sync_colour_to_human(C) diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index e4818d0c79..c326574eeb 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -13,7 +13,8 @@ var/speed = 1 var/mat_efficiency = 1 - var/list/materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, "plastic" = 0, "gold" = 0, "silver" = 0, "osmium" = 0, "diamond" = 0, "phoron" = 0, "uranium" = 0) + var/list/materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, "plastic" = 0, MAT_PLASTEEL = 0, "gold" = 0, "silver" = 0, MAT_LEAD = 0, "osmium" = 0, "diamond" = 0, MAT_DURASTEEL = 0, "phoron" = 0, "uranium" = 0, MAT_VERDANTIUM = 0, MAT_MORPHIUM = 0, MAT_METALHYDROGEN = 0, MAT_SUPERMATTER = 0) + var/list/hidden_materials = list(MAT_PLASTEEL, MAT_DURASTEEL, MAT_VERDANTIUM, MAT_MORPHIUM, MAT_METALHYDROGEN, MAT_SUPERMATTER) var/res_max_amount = 200000 var/datum/research/files @@ -75,7 +76,7 @@ var/T = 0 for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) T += M.rating - mat_efficiency = 1 - (T - 1) / 4 // 1 -> 0.5 + mat_efficiency = max(1 - (T - 1) / 4, 0.2) // 1 -> 0.2 for(var/obj/item/weapon/stock_parts/micro_laser/M in component_parts) // Not resetting T is intended; speed is affected by both T += M.rating speed = T / 2 // 1 -> 3 @@ -273,7 +274,13 @@ /obj/machinery/mecha_part_fabricator/proc/get_materials() . = list() for(var/T in materials) - . += list(list("mat" = capitalize(T), "amt" = materials[T])) + var/hidden_mat = FALSE + for(var/HM in hidden_materials) // Direct list contents comparison was failing. + if(T == HM && materials[T] == 0) + hidden_mat = TRUE + continue + if(!hidden_mat) + . += list(list("mat" = capitalize(T), "amt" = materials[T])) /obj/machinery/mecha_part_fabricator/proc/eject_materials(var/material, var/amount) // 0 amount = 0 means ejecting a full stack; -1 means eject everything var/recursive = amount == -1 ? 1 : 0 diff --git a/code/game/mecha/mech_prosthetics.dm b/code/game/mecha/mech_prosthetics.dm index e40db24878..d2d0b8b55f 100644 --- a/code/game/mecha/mech_prosthetics.dm +++ b/code/game/mecha/mech_prosthetics.dm @@ -13,7 +13,8 @@ var/speed = 1 var/mat_efficiency = 1 - var/list/materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, "plastic" = 0, "gold" = 0, "silver" = 0, "osmium" = 0, "diamond" = 0, "phoron" = 0, "uranium" = 0, "plasteel" = 0) + var/list/materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, "plastic" = 0, MAT_PLASTEEL = 0, "gold" = 0, "silver" = 0, MAT_LEAD = 0, "osmium" = 0, "diamond" = 0, MAT_DURASTEEL = 0, "phoron" = 0, "uranium" = 0, MAT_VERDANTIUM = 0, MAT_MORPHIUM = 0) + var/list/hidden_materials = list(MAT_DURASTEEL, MAT_VERDANTIUM, MAT_MORPHIUM) var/res_max_amount = 200000 var/datum/research/files @@ -77,7 +78,7 @@ var/T = 0 for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) T += M.rating - mat_efficiency = 1 - (T - 1) / 4 // 1 -> 0.5 + mat_efficiency = max(0.2, 1 - (T - 1) / 4) // 1 -> 0.2 for(var/obj/item/weapon/stock_parts/micro_laser/M in component_parts) // Not resetting T is intended; speed is affected by both T += M.rating speed = T / 2 // 1 -> 3 @@ -299,7 +300,13 @@ /obj/machinery/pros_fabricator/proc/get_materials() . = list() for(var/T in materials) - . += list(list("mat" = capitalize(T), "amt" = materials[T])) + var/hidden_mat = FALSE + for(var/HM in hidden_materials) // Direct list contents comparison was failing. + if(T == HM && materials[T] == 0) + hidden_mat = TRUE + continue + if(!hidden_mat) + . += list(list("mat" = capitalize(T), "amt" = materials[T])) /obj/machinery/pros_fabricator/proc/eject_materials(var/material, var/amount) // 0 amount = 0 means ejecting a full stack; -1 means eject everything var/recursive = amount == -1 ? 1 : 0 diff --git a/code/game/objects/items/weapons/circuitboards/mecha.dm b/code/game/objects/items/weapons/circuitboards/mecha.dm index 1415edea84..ed158a347b 100644 --- a/code/game/objects/items/weapons/circuitboards/mecha.dm +++ b/code/game/objects/items/weapons/circuitboards/mecha.dm @@ -79,5 +79,28 @@ name = T_BOARD_MECHA("Odysseus central control") icon_state = "mainboard" +/obj/item/weapon/circuitboard/mecha/imperion + name = "Alien Circuit" + origin_tech = list(TECH_DATA = 5, TECH_BLUESPACE = 3, TECH_PRECURSOR = 1) + icon = 'icons/obj/abductor.dmi' + icon_state = "circuit" + +/obj/item/weapon/circuitboard/mecha/imperion/main + desc = "It is marked with a strange glyph." + +/obj/item/weapon/circuitboard/mecha/imperion/peripherals + desc = "It is marked with a pulsing glyph." + +/obj/item/weapon/circuitboard/mecha/imperion/targeting + desc = "It is marked with an ominous glyph." + +/obj/item/weapon/circuitboard/mecha/imperion/phasing + desc = "It is marked with a disturbing glyph." + +/obj/item/weapon/circuitboard/mecha/imperion/damaged + name = "Damaged Alien Circuit" + desc = "It is marked with a constantly shifting glyph." + origin_tech = list(TECH_DATA = 3, TECH_BLUESPACE = 1, TECH_PRECURSOR = 2) + //Undef the macro, shouldn't be needed anywhere else #undef T_BOARD_MECHA diff --git a/code/game/objects/items/weapons/material/material_armor.dm b/code/game/objects/items/weapons/material/material_armor.dm index d8fba58175..d981cafc07 100644 --- a/code/game/objects/items/weapons/material/material_armor.dm +++ b/code/game/objects/items/weapons/material/material_armor.dm @@ -105,6 +105,31 @@ Protectiveness | Armor % if(!material) // No point checking for reflection. return ..() + if(material.negation && prob(material.negation)) // Strange and Alien materials, or just really strong materials. + user.visible_message("\The [src] completely absorbs [attack_text]!") + return TRUE + + if(material.spatial_instability && prob(material.spatial_instability)) + user.visible_message("\The [src] flashes [user] clear of [attack_text]!") + var/list/turfs = new/list() + for(var/turf/T in orange(round(material.spatial_instability / 10) + 1, user)) + if(istype(T,/turf/space)) continue + if(T.density) continue + if(T.x>world.maxx-6 || T.x<6) continue + if(T.y>world.maxy-6 || T.y<6) continue + turfs += T + if(!turfs.len) turfs += pick(/turf in orange(6)) + var/turf/picked = pick(turfs) + if(!isturf(picked)) return + + var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() + spark_system.set_up(5, 0, user.loc) + spark_system.start() + playsound(user.loc, 'sound/effects/teleport.ogg', 50, 1) + + user.loc = picked + return PROJECTILE_FORCE_MISS + if(material.reflectivity) if(istype(damage_source, /obj/item/projectile/energy) || istype(damage_source, /obj/item/projectile/beam)) var/obj/item/projectile/P = damage_source diff --git a/code/game/objects/structures/props/alien_props.dm b/code/game/objects/structures/props/alien_props.dm index 1eb811838e..38f0b1b893 100644 --- a/code/game/objects/structures/props/alien_props.dm +++ b/code/game/objects/structures/props/alien_props.dm @@ -114,4 +114,12 @@ for(var/i = 1 to rand(1, 4)) var/new_tech = pick(techs) techs -= new_tech - origin_tech[new_tech] = rand(5, 9) \ No newline at end of file + origin_tech[new_tech] = rand(5, 9) + + origin_tech[TECH_PRECURSOR] = rand(0,2) + +/obj/item/prop/alien/phasecoil + name = "reverberating device" + desc = "A device pulsing with an ominous energy." + icon_state = "circuit_phase" + origin_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 6, TECH_PHORON = 3, TECH_POWER = 5, TECH_MAGNET = 5, TECH_DATA = 5, TECH_PRECURSOR = 2, TECH_ARCANE = 1) diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm index 232ef46e3e..f62356d83c 100644 --- a/code/modules/materials/material_recipes.dm +++ b/code/modules/materials/material_recipes.dm @@ -190,3 +190,7 @@ recipes += new/datum/stack_recipe("alien wood floor tile", /obj/item/stack/tile/wood/sif, 1, 4, 20) recipes -= new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20) recipes -= new/datum/stack_recipe("wooden chair", /obj/structure/bed/chair/wood, 3, time = 10, one_per_turf = 1, on_floor = 1) + +/material/supermatter/generate_recipes() + recipes = list() + recipes += new/datum/stack_recipe("supermatter shard", /obj/machinery/power/supermatter/shard, 30 , one_per_turf = 1, time = 600, on_floor = 1) diff --git a/code/modules/materials/material_sheets.dm b/code/modules/materials/material_sheets.dm index 0b1daf10fa..1035c70eba 100644 --- a/code/modules/materials/material_sheets.dm +++ b/code/modules/materials/material_sheets.dm @@ -214,7 +214,101 @@ no_variants = FALSE /obj/item/stack/material/durasteel/hull - name = "MAT_DURASTEELHULL" + name = MAT_DURASTEELHULL + +/obj/item/stack/material/titanium + name = MAT_TITANIUM + icon_state = "sheet-silver" + item_state = "sheet-silver" + default_type = MAT_TITANIUM + no_variants = FALSE + +/obj/item/stack/material/titanium/hull + name = MAT_TITANIUMHULL + default_type = MAT_TITANIUMHULL + +// Particle Smasher and Exotic material. +/obj/item/stack/material/verdantium + name = MAT_VERDANTIUM + icon_state = "sheet-wavy" + item_state = "mhydrogen" + default_type = MAT_VERDANTIUM + no_variants = FALSE + apply_colour = TRUE + +/obj/item/stack/material/morphium + name = MAT_MORPHIUM + icon_state = "sheet-wavy" + item_state = "mhydrogen" + default_type = MAT_MORPHIUM + no_variants = FALSE + apply_colour = TRUE + +/obj/item/stack/material/morphium/hull + name = MAT_MORPHIUMHULL + default_type = MAT_MORPHIUMHULL + +/obj/item/stack/material/valhollide + name = MAT_VALHOLLIDE + icon_state = "sheet-gem" + item_state = "diamond" + default_type = MAT_VALHOLLIDE + no_variants = FALSE + apply_colour = TRUE + +// Forged in the equivalent of Hell, one piece at a time. +/obj/item/stack/material/supermatter + name = MAT_SUPERMATTER + icon_state = "sheet-super" + item_state = "diamond" + default_type = MAT_SUPERMATTER + apply_colour = TRUE + +/obj/item/stack/material/supermatter/proc/update_mass() // Due to how dangerous they can be, the item will get heavier and larger the more are in the stack. + slowdown = amount / 10 + w_class = min(5, round(amount / 10) + 1) + throw_range = round(amount / 7) + 1 + +/obj/item/stack/material/supermatter/use(var/used) + . = ..() + update_mass() + return + +/obj/item/stack/material/supermatter/attack_hand(mob/user) + update_mass() + radiation_repository.radiate(src, 5 + amount) + var/mob/living/M = user + if(!istype(M)) + return + + var/burn_user = TRUE + if(istype(M, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = user + var/obj/item/clothing/gloves/G = H.gloves + if(istype(G) && ((G.flags & THICKMATERIAL && prob(70)) || istype(G, /obj/item/clothing/gloves/gauntlets))) + burn_user = FALSE + + if(burn_user) + H.visible_message("\The [src] flashes as it scorches [H]'s hands!") + H.apply_damage(amount / 2 + 5, BURN, "r_hand", used_weapon="Supermatter Chunk") + H.apply_damage(amount / 2 + 5, BURN, "l_hand", used_weapon="Supermatter Chunk") + H.drop_from_inventory(src, get_turf(H)) + return + + if(istype(user, /mob/living/silicon/robot)) + burn_user = FALSE + + if(burn_user) + M.apply_damage(amount, BURN, null, used_weapon="Supermatter Chunk") + +/obj/item/stack/material/supermatter/ex_act(severity) // An incredibly hard to manufacture material, SM chunks are unstable by their 'stabilized' nature. + if(prob((4 / severity) * 20)) + radiation_repository.radiate(get_turf(src), amount * 4) + explosion(get_turf(src),round(amount / 12) , round(amount / 6), round(amount / 3), round(amount / 25)) + qdel(src) + return + radiation_repository.radiate(get_turf(src), amount * 2) + ..() /obj/item/stack/material/wood name = "wooden plank" diff --git a/code/modules/materials/materials.dm b/code/modules/materials/materials.dm index 6f55572ef9..b31c849563 100644 --- a/code/modules/materials/materials.dm +++ b/code/modules/materials/materials.dm @@ -105,6 +105,8 @@ var/list/name_to_material var/opacity = 1 // Is the material transparent? 0.5< makes transparent walls/doors. var/reflectivity = 0 // How reflective to light is the material? Currently used for laser reflection and defense. var/explosion_resistance = 5 // Only used by walls currently. + var/negation = 0 // Objects that respect this will randomly absorb impacts with this var as the percent chance. + var/spatial_instability = 0 // Objects that have trouble staying in the same physical space by sheer laws of nature have this. Percent for respecting items to cause teleportation. var/conductive = 1 // Objects with this var add CONDUCTS to flags on spawn. var/conductivity = null // How conductive the material is. Iron acts as the baseline, at 10. var/list/composite_material // If set, object matter var will be a list containing these values. @@ -293,6 +295,8 @@ var/list/name_to_material /material/supermatter name = "supermatter" icon_colour = "#FFFF00" + stack_type = /obj/item/stack/material/supermatter + shard_type = SHARD_SHARD radioactivity = 20 stack_type = null luminescence = 3 @@ -304,6 +308,7 @@ var/list/name_to_material sheet_singular_name = "crystal" sheet_plural_name = "crystals" is_fusion_fuel = 1 + stack_origin_tech = list(TECH_MATERIAL = 8, TECH_PHORON = 5, TECH_BLUESPACE = 4) /material/phoron name = "phoron" @@ -354,11 +359,14 @@ var/list/name_to_material name = "marble" icon_colour = "#AAAAAA" weight = 26 +<<<<<<< HEAD hardness = 30 //VOREStation Edit - Please. +======= + hardness = 70 +>>>>>>> 4ff3ee1... Merge pull request #6023 from Mechoid/Precursotech_Baseline integrity = 201 //hack to stop kitchen benches being flippable, todo: refactor into weight system stack_type = /obj/item/stack/material/marble - /material/steel name = DEFAULT_WALL_MATERIAL stack_type = /obj/item/stack/material/steel @@ -455,8 +463,8 @@ var/list/name_to_material reflectivity = 0.9 /material/plasteel/titanium - name = "titanium" - stack_type = null + name = MAT_TITANIUM + stack_type = /obj/item/stack/material/titanium conductivity = 2.38 icon_base = "metal" door_icon_base = "metal" @@ -465,7 +473,7 @@ var/list/name_to_material /material/plasteel/titanium/hull name = MAT_TITANIUMHULL - stack_type = null + stack_type = /obj/item/stack/material/titanium/hull icon_base = "hull" icon_reinf = "reinf_mesh" @@ -686,7 +694,7 @@ var/list/name_to_material sheet_plural_name = "ingots" /material/lead - name = "lead" + name = MAT_LEAD stack_type = /obj/item/stack/material/lead icon_colour = "#273956" weight = 23 // Lead is a bit more dense than silver IRL, and silver has 22 ingame. @@ -695,6 +703,74 @@ var/list/name_to_material sheet_plural_name = "ingots" radiation_resistance = 25 // Lead is Special and so gets to block more radiation than it normally would with just weight, totalling in 48 protection. +// Particle Smasher and other exotic materials. + +/material/verdantium + name = MAT_VERDANTIUM + stack_type = /obj/item/stack/material/verdantium + icon_base = "metal" + door_icon_base = "metal" + icon_reinf = "reinf_metal" + icon_colour = "#4FE95A" + integrity = 80 + protectiveness = 15 + weight = 15 + hardness = 30 + shard_type = SHARD_SHARD + negation = 15 + conductivity = 60 + reflectivity = 0.3 + radiation_resistance = 5 + stack_origin_tech = list(TECH_MATERIAL = 6, TECH_POWER = 5, TECH_BIO = 4) + sheet_singular_name = "sheet" + sheet_plural_name = "sheets" + +/material/morphium + name = MAT_MORPHIUM + stack_type = /obj/item/stack/material/morphium + icon_base = "metal" + door_icon_base = "metal" + icon_colour = "#37115A" + icon_reinf = "reinf_metal" + protectiveness = 60 + integrity = 300 + conductivity = 1.5 + hardness = 90 + shard_type = SHARD_SHARD + weight = 30 + negation = 25 + explosion_resistance = 85 + reflectivity = 0.2 + radiation_resistance = 10 + stack_origin_tech = list(TECH_MATERIAL = 8, TECH_ILLEGAL = 1, TECH_PHORON = 4, TECH_BLUESPACE = 4, TECH_ARCANE = 1) + +/material/morphium/hull + name = MAT_MORPHIUMHULL + stack_type = /obj/item/stack/material/morphium/hull + icon_base = "hull" + icon_reinf = "reinf_mesh" + +/material/valhollide + name = MAT_VALHOLLIDE + stack_type = /obj/item/stack/material/valhollide + icon_base = "stone" + door_icon_base = "stone" + icon_reinf = "reinf_mesh" + icon_colour = "##FFF3B2" + protectiveness = 30 + integrity = 240 + weight = 30 + hardness = 45 + negation = 2 + conductivity = 5 + reflectivity = 0.5 + radiation_resistance = 20 + spatial_instability = 30 + stack_origin_tech = list(TECH_MATERIAL = 7, TECH_PHORON = 5, TECH_BLUESPACE = 5) + sheet_singular_name = "gem" + sheet_plural_name = "gems" + + // Adminspawn only, do not let anyone get this. /material/alienalloy name = "alienalloy" diff --git a/code/modules/mining/drilling/drill.dm b/code/modules/mining/drilling/drill.dm index 5e28944ae0..08580c7f97 100644 --- a/code/modules/mining/drilling/drill.dm +++ b/code/modules/mining/drilling/drill.dm @@ -17,7 +17,7 @@ var/list/resource_field = list() var/obj/item/device/radio/intercom/faultreporter = new /obj/item/device/radio/intercom{channels=list("Supply")}(null) - var/ore_types = list( + var/list/ore_types = list( "hematite" = /obj/item/weapon/ore/iron, "uranium" = /obj/item/weapon/ore/uranium, "gold" = /obj/item/weapon/ore/gold, @@ -34,8 +34,20 @@ var/harvest_speed var/capacity var/charge_use + var/exotic_drilling var/obj/item/weapon/cell/cell = null + // Found with an advanced laser. exotic_drilling >= 1 + var/list/ore_types_uncommon = list( + MAT_MARBLE = /obj/item/weapon/ore/marble, + MAT_LEAD = /obj/item/weapon/ore/lead + ) + + // Found with an ultra laser. exotic_drilling >= 2 + var/list/ore_types_rare = list( + MAT_VERDANTIUM = /obj/item/weapon/ore/verdantium + ) + //Flags var/need_update_field = 0 var/need_player_check = 0 @@ -127,7 +139,7 @@ var/oretype = ore_types[metal] new oretype(src) - if(!found_resource) + if(!found_resource) // If a drill can't see an advanced material, it will destroy it while going through. harvesting.has_resources = 0 harvesting.resources = null resource_field -= harvesting @@ -219,6 +231,14 @@ for(var/obj/item/weapon/stock_parts/P in component_parts) if(istype(P, /obj/item/weapon/stock_parts/micro_laser)) harvest_speed = P.rating + exotic_drilling = P.rating - 1 + if(exotic_drilling >= 1) + ore_types |= ore_types_uncommon + if(exotic_drilling >= 2) + ore_types |= ore_types_rare + else + ore_types -= ore_types_uncommon + ore_types -= ore_types_rare if(istype(P, /obj/item/weapon/stock_parts/matter_bin)) capacity = 200 * P.rating if(istype(P, /obj/item/weapon/stock_parts/capacitor)) diff --git a/code/modules/mining/drilling/scanner.dm b/code/modules/mining/drilling/scanner.dm index 0df256c131..56f371fe91 100644 --- a/code/modules/mining/drilling/scanner.dm +++ b/code/modules/mining/drilling/scanner.dm @@ -18,7 +18,8 @@ "surface minerals" = 0, "precious metals" = 0, "nuclear fuel" = 0, - "exotic matter" = 0 + "exotic matter" = 0, + "anomalous matter" = 0 ) for(var/turf/simulated/T in range(2, get_turf(user))) @@ -30,10 +31,11 @@ var/ore_type switch(metal) - if("silicates", "carbon", "hematite") ore_type = "surface minerals" - if("gold", "silver", "diamond") ore_type = "precious metals" + if("silicates", "carbon", "hematite", "marble") ore_type = "surface minerals" + if("gold", "silver", "diamond", "lead") ore_type = "precious metals" if("uranium") ore_type = "nuclear fuel" if("phoron", "osmium", "hydrogen") ore_type = "exotic matter" + if("verdantium") ore_type = "anomalous matter" if(ore_type) metals[ore_type] += T.resources[metal] diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm index 3f76672610..ec3bfad9cb 100644 --- a/code/modules/mining/machine_processing.dm +++ b/code/modules/mining/machine_processing.dm @@ -174,7 +174,8 @@ "uranium" = 30, "diamond" = 50, "platinum" = 40, - "mhydrogen" = 40) + "mhydrogen" = 40, + "verdantium" = 60) /obj/machinery/mineral/processing_unit/New() ..() diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index ae388a717d..09752b74ed 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -46,7 +46,9 @@ var/list/mining_overlay_cache = list() "osmium" = /obj/item/weapon/ore/osmium, "hydrogen" = /obj/item/weapon/ore/hydrogen, "silicates" = /obj/item/weapon/ore/glass, - "carbon" = /obj/item/weapon/ore/coal + "carbon" = /obj/item/weapon/ore/coal, + "verdantium" = /obj/item/weapon/ore/verdantium, + "marble" = /obj/item/weapon/ore/marble ) has_resources = 1 @@ -608,10 +610,10 @@ var/list/mining_overlay_cache = list() var/mineral_name if(rare_ore) - mineral_name = pickweight(list("uranium" = 10, "platinum" = 10, "hematite" = 20, "carbon" = 20, "diamond" = 2, "gold" = 10, "silver" = 10, "phoron" = 20)) + mineral_name = pickweight(list("marble" = 5, "uranium" = 10, "platinum" = 10, "hematite" = 20, "carbon" = 20, "diamond" = 2, "gold" = 10, "silver" = 10, "phoron" = 20, "lead" = 5, "verdantium" = 1)) else - mineral_name = pickweight(list("uranium" = 5, "platinum" = 5, "hematite" = 35, "carbon" = 35, "diamond" = 1, "gold" = 5, "silver" = 5, "phoron" = 10)) + mineral_name = pickweight(list("marble" = 3, "uranium" = 10, "platinum" = 10, "hematite" = 70, "carbon" = 70, "diamond" = 2, "gold" = 10, "silver" = 10, "phoron" = 20, "lead" = 2, "verdantium" = 1)) if(mineral_name && (mineral_name in ore_data)) mineral = ore_data[mineral_name] diff --git a/code/modules/mining/ore.dm b/code/modules/mining/ore.dm index e531e5208f..099ce46ba5 100644 --- a/code/modules/mining/ore.dm +++ b/code/modules/mining/ore.dm @@ -24,6 +24,12 @@ origin_tech = list(TECH_MATERIAL = 1) material = "carbon" +/obj/item/weapon/ore/marble + name = "recrystallized carbonate" + icon_state = "ore_marble" + origin_tech = list(TECH_MATERIAL = 1) + material = "carbon" + /obj/item/weapon/ore/glass name = "sand" icon_state = "ore_glass" @@ -77,6 +83,29 @@ icon_state = "ore_hydrogen" material = "mhydrogen" +/obj/item/weapon/ore/verdantium + name = "verdantite dust" + icon_state = "ore_verdantium" + material = MAT_VERDANTIUM + origin_tech = list(TECH_MATERIAL = 7) + +// POCKET ... Crystal dust. +/obj/item/weapon/ore/verdantium/throw_impact(atom/hit_atom) + ..() + var/mob/living/carbon/human/H = hit_atom + if(istype(H) && H.has_eyes() && prob(85)) + H << "Some of \the [src] gets in your eyes!" + H.Blind(10) + H.eye_blurry += 15 + spawn(1) + if(istype(loc, /turf/)) qdel(src) + +/obj/item/weapon/ore/lead + name = "lead glance" + icon_state = "ore_lead" + material = MAT_LEAD + origin_tech = list(TECH_MATERIAL = 3) + /obj/item/weapon/ore/slag name = "Slag" desc = "Someone screwed up..." diff --git a/code/modules/mining/ore_datum.dm b/code/modules/mining/ore_datum.dm index a3528eb55b..da97a26873 100644 --- a/code/modules/mining/ore_datum.dm +++ b/code/modules/mining/ore_datum.dm @@ -132,4 +132,34 @@ var/global/list/ore_data = list() display_name = "metallic hydrogen" smelts_to = "tritium" compresses_to = "mhydrogen" + scan_icon = "mineral_rare" + +/ore/verdantium + name = MAT_VERDANTIUM + display_name = "crystalline verdantite" + compresses_to = MAT_VERDANTIUM + result_amount = 2 + spread_chance = 5 + scan_icon = "mineral_rare" + xarch_ages = list( + "billion" = 13, + "billion_lower" = 10 + ) + +/ore/marble + name = MAT_MARBLE + display_name = "recrystallized carbonate" + compresses_to = "marble" + result_amount = 1 + spread_chance = 10 + ore = /obj/item/weapon/ore/marble + scan_icon = "mineral_common" + +/ore/lead + name = MAT_LEAD + display_name = "lead glance" + compresses_to = "marble" + result_amount = 1 + spread_chance = 10 + ore = /obj/item/weapon/ore/marble scan_icon = "mineral_rare" \ No newline at end of file diff --git a/code/modules/power/singularity/generator.dm b/code/modules/power/singularity/generator.dm index 888d75ea6f..c49c605598 100644 --- a/code/modules/power/singularity/generator.dm +++ b/code/modules/power/singularity/generator.dm @@ -29,4 +29,25 @@ "You unsecure the [src.name] from the floor.", \ "You hear a ratchet.") return + if(W.is_screwdriver()) + panel_open = !panel_open + playsound(loc, W.usesound, 50, 1) + visible_message("\The [user] adjusts \the [src]'s mechanisms.") + if(panel_open && do_after(user, 30)) + to_chat(user, "\The [src] looks like it could be modified.") + if(panel_open && do_after(user, 80 * W.toolspeed)) // We don't have skills, so a delayed hint for engineers will have to do for now. (Panel open check for sanity) + playsound(loc, W.usesound, 50, 1) + to_chat(user, "\The [src] looks like it could be adapted to forge advanced materials via particle acceleration, somehow..") + else + to_chat(user, "\The [src]'s mechanisms look secure.") + if(istype(W, /obj/item/weapon/smes_coil/super_io) && panel_open) + visible_message("\The [user] begins to modify \the [src] with \the [W].") + if(do_after(user, 300)) + user.drop_from_inventory(W) + visible_message("\The [user] installs \the [W] onto \the [src].") + qdel(W) + var/turf/T = get_turf(src) + var/new_machine = /obj/machinery/particle_smasher + new new_machine(T) + qdel(src) return ..() diff --git a/code/modules/power/singularity/particle_accelerator/particle.dm b/code/modules/power/singularity/particle_accelerator/particle.dm index 3b5992e4e4..2c3e99318d 100644 --- a/code/modules/power/singularity/particle_accelerator/particle.dm +++ b/code/modules/power/singularity/particle_accelerator/particle.dm @@ -44,7 +44,7 @@ if (A) if(ismob(A)) toxmob(A) - if((istype(A,/obj/machinery/the_singularitygen))||(istype(A,/obj/singularity/))) + if((istype(A,/obj/machinery/the_singularitygen))||(istype(A,/obj/singularity/))||(istype(A, /obj/machinery/particle_smasher))) A:energy += energy //R-UST port else if(istype(A,/obj/machinery/power/fusion_core)) diff --git a/code/modules/power/singularity/particle_accelerator/particle_smasher.dm b/code/modules/power/singularity/particle_accelerator/particle_smasher.dm new file mode 100644 index 0000000000..a9fca3e160 --- /dev/null +++ b/code/modules/power/singularity/particle_accelerator/particle_smasher.dm @@ -0,0 +1,365 @@ +/* + * Contains the particle smasher and its recipes. + */ + +/obj/machinery/particle_smasher + name = "Particle Focus" + desc = "A strange device used to create exotic matter." + icon = 'icons/obj/machines/particle_smasher.dmi' + icon_state = "smasher" + anchored = 0 + density = 1 + use_power = 0 + + var/successful_craft = FALSE // Are we waiting to be emptied? + var/image/material_layer // Holds the image used for the filled overlay. + var/image/material_glow // Holds the image used for the glow overlay. + var/image/reagent_layer // Holds the image used for showing a contained beaker. + var/energy = 0 // How many 'energy' units does this have? Acquired by a Particle Accelerator like a Singularity. + var/max_energy = 600 + var/obj/item/stack/material/target // The material being bombarded. + var/obj/item/weapon/reagent_containers/reagent_container // Holds the beaker. The process will consume ALL reagents inside it. + var/beaker_type = /obj/item/weapon/reagent_containers/glass/beaker + var/list/storage // Holds references to items allowed to be used in the fabrication phase. + var/max_storage = 3 // How many items can be jammed into it? + var/list/recipes // The list containing the Particle Smasher's recipes. + +/obj/machinery/particle_smasher/Initialize() + ..() + storage = list() + update_icon() + prepare_recipes() + +/obj/machinery/particle_smasher/Destroy() + for(var/datum/recipe/particle_smasher/D in recipes) + qdel(D) + recipes.Cut() + ..() + +/obj/machinery/particle_smasher/examine(mob/user) + ..() + if(user in view(1)) + to_chat(user, "\The [src] contains:") + for(var/obj/item/I in contents) + to_chat(user, "\the [I]") + +/obj/machinery/particle_smasher/attackby(obj/item/W as obj, mob/user as mob) + if(W.type == /obj/item/device/analyzer) + to_chat(user, "\The [src] reads an energy level of [energy].") + else if(istype(W, /obj/item/stack/material)) + var/obj/item/stack/material/M = W + if(M.uses_charge) + to_chat(user, "You cannot fill \the [src] with a synthesizer!") + return + target = M.split(1) + target.forceMove(src) + update_icon() + else if(istype(W, beaker_type)) + if(reagent_container) + to_chat(user, "\The [src] already has a container attached.") + return + if(isrobot(user) && istype(W.loc, /obj/item/weapon/gripper)) + var/obj/item/weapon/gripper/G = W.loc + G.drop_item() + else + user.drop_from_inventory(W) + reagent_container = W + reagent_container.forceMove(src) + to_chat(user, "You add \the [reagent_container] to \the [src].") + update_icon() + return + else if(W.is_wrench()) + anchored = !anchored + playsound(src, W.usesound, 75, 1) + if(anchored) + user.visible_message("[user.name] secures [src.name] to the floor.", \ + "You secure the [src.name] to the floor.", \ + "You hear a ratchet.") + else + user.visible_message("[user.name] unsecures [src.name] from the floor.", \ + "You unsecure the [src.name] from the floor.", \ + "You hear a ratchet.") + update_icon() + return + else if(istype(W, /obj/item/weapon/card/id)) + to_chat(user, "Swiping \the [W] on \the [src] doesn't seem to do anything...") + return ..() + else if(((isrobot(user) && istype(W.loc, /obj/item/weapon/gripper)) || (!isrobot(user) && W.canremove)) && storage.len < max_storage) + if(isrobot(user) && istype(W.loc, /obj/item/weapon/gripper)) + var/obj/item/weapon/gripper/G = W.loc + G.drop_item() + else + user.drop_from_inventory(W) + W.forceMove(src) + storage += W + else + return ..() + +/obj/machinery/particle_smasher/update_icon() + cut_overlays() + if(!material_layer) + material_layer = image(icon, "[initial(icon_state)]-material") + if(!material_glow) + material_glow = image(icon, "[initial(icon_state)]-material-glow") + material_glow.plane = PLANE_LIGHTING_ABOVE + if(!reagent_layer) + reagent_layer = image(icon, "[initial(icon_state)]-reagent") + if(anchored) + icon_state = "[initial(icon_state)]-o" + if(target) + material_layer.color = target.material.icon_colour + add_overlay(material_layer) + if(successful_craft) + material_glow.color = target.material.icon_colour + add_overlay(material_glow) + if(reagent_container) + add_overlay(reagent_layer) + else + icon_state = initial(icon_state) + + if(target && energy) + var/power_percent = round((energy / max_energy) * 100) + light_color = target.material.icon_colour + switch(power_percent) + if(0 to 25) + light_range = 1 + if(26 to 50) + light_range = 2 + if(51 to 75) + light_range = 3 + if(76 to INFINITY) + light_range = 4 + set_light(light_range, 2, light_color) + else + set_light(0, 0, "#FFFFFF") + +/obj/machinery/particle_smasher/bullet_act(var/obj/item/projectile/Proj) + if(istype(Proj, /obj/item/projectile/beam)) + if(Proj.damage >= 50) + TryCraft() + return 0 + +/obj/machinery/particle_smasher/process() + if(!src.anchored) // Rapidly loses focus. + if(energy) + radiation_repository.radiate(src, round(((src.energy-150)/50)*5,1)) + energy = max(0, energy - 30) + update_icon() + return + + if(energy) + radiation_repository.radiate(src, round(((src.energy-150)/50)*5,1)) + energy = CLAMP(energy - 5, 0, max_energy) + + return + +/obj/machinery/particle_smasher/proc/prepare_recipes() + if(!recipes) + recipes = list() + for(var/D in subtypesof(/datum/recipe/particle_smasher)) + recipes += new D + else + for(var/datum/recipe/particle_smasher/D in recipes) + qdel(D) + recipes.Cut() + for(var/D in subtypesof(/datum/recipe/particle_smasher)) + recipes += new D + +/obj/machinery/particle_smasher/proc/TryCraft() + + if(!recipes || !recipes.len) + recipes = typesof(/datum/recipe/particle_smasher) + + if(!target) // You are just blasting an empty machine. + visible_message("\The [src] shudders.") + update_icon() + return + + if(successful_craft) + visible_message("\The [src] fizzles.") + if(prob(33)) // Why are you blasting it after it's already done! + radiation_repository.radiate(src, 10 + round(src.energy / 60, 1)) + energy = max(0, energy - 30) + update_icon() + return + + var/list/possible_recipes = list() + var/max_prob = 0 + for(var/datum/recipe/particle_smasher/R in recipes) // Only things for the smasher. Don't get things like the chef's cake recipes. + if(R.probability) // It's actually a recipe you're supposed to be able to make. + if(istype(target, R.required_material)) + if(energy >= R.required_energy_min && energy <= R.required_energy_max) // The machine has enough Vaguely Defined 'Energy'. + var/turf/T = get_turf(src) + var/datum/gas_mixture/environment = T.return_air() + if(environment.temperature >= R.required_atmos_temp_min && environment.temperature <= R.required_atmos_temp_max) // Too hot, or too cold. + if(R.reagents && R.reagents.len) + if(!reagent_container || R.check_reagents(reagent_container.reagents) == -1) // It doesn't have a reagent storage when it needs it, or it's lacking what is needed. + continue + if(R.items && R.items.len) + if(!(storage && storage.len) || R.check_items(src) == -1) // It's empty, or it doesn't contain what is needed. + continue + possible_recipes += R + max_prob += R.probability + + if(possible_recipes.len) + var/local_prob = rand(0, max_prob - 1)%max_prob + var/cumulative = 0 + for(var/datum/recipe/particle_smasher/R in possible_recipes) + cumulative += R.probability + if(local_prob < cumulative) + successful_craft = TRUE + DoCraft(R) + break + update_icon() + +/obj/machinery/particle_smasher/proc/DoCraft(var/datum/recipe/particle_smasher/recipe) + if(!successful_craft || !recipe) + return + + qdel(target) + target = null + + if(reagent_container) + reagent_container.reagents.clear_reagents() + + if(recipe.items && recipe.items.len) + for(var/obj/item/I in storage) + for(var/item_type in recipe.items) + if(istype(I, item_type)) + storage -= I + qdel(I) + break + + var/result = recipe.result + var/obj/item/stack/material/M = new result(src) + target = M + update_icon() + +/obj/machinery/particle_smasher/verb/eject_contents() + set src in view(1) + set category = "Object" + set name = "Eject Particle Focus Contents" + + if(usr.incapacitated()) + return + + DumpContents() + +/obj/machinery/particle_smasher/proc/DumpContents() + target = null + reagent_container = null + successful_craft = FALSE + var/turf/T = get_turf(src) + for(var/obj/item/I in contents) + if(I in storage) + storage -= I + I.forceMove(T) + update_icon() + +/* + * The special recipe datums used for the particle smasher. + */ + +/datum/recipe/particle_smasher + //reagents //Commented out due to inheritance. Still a list, used as ex: // example: = list("pacid" = 5) + //items //Commented out due to inheritance. Still a list, used as ex: // example: = list(/obj/item/weapon/tool/crowbar, /obj/item/weapon/welder) Place /foo/bar before /foo. Do not include fruit. Maximum of 3 items. + + result = /obj/item/stack/material/iron // The sheet this will produce. + var/required_material = /obj/item/stack/material/iron // The required material sheet. + var/required_energy_min = 0 // The minimum energy this recipe can process at. + var/required_energy_max = 600 // The maximum energy this recipe can process at. + var/required_atmos_temp_min = 0 // The minimum ambient atmospheric temperature required, in kelvin. + var/required_atmos_temp_max = 600 // The maximum ambient atmospheric temperature required, in kelvin. + var/probability = 0 // The probability for the recipe to be produced. 0 will make it impossible. + +/datum/recipe/particle_smasher/check_items(var/obj/container as obj) + . = 1 + if (items && items.len) + var/list/checklist = list() + checklist = items.Copy() // You should really trust Copy + if(istype(container, /obj/machinery/particle_smasher)) + var/obj/machinery/particle_smasher/machine = container + for(var/obj/O in machine.storage) + if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/grown)) + continue // Fruit is handled in check_fruit(). + var/found = 0 + for(var/i = 1; i < checklist.len+1; i++) + var/item_type = checklist[i] + if (istype(O,item_type)) + checklist.Cut(i, i+1) + found = 1 + break + if (!found) + . = 0 + if (checklist.len) + . = -1 + return . + +/datum/recipe/particle_smasher/deuterium_tritium + reagents = list("hydrogen" = 15) + + result = /obj/item/stack/material/tritium + required_material = /obj/item/stack/material/deuterium + + required_energy_min = 200 + required_energy_max = 400 + + required_atmos_temp_max = 200 + probability = 30 + +/datum/recipe/particle_smasher/verdantium_morphium + result = /obj/item/stack/material/morphium + required_material = /obj/item/stack/material/verdantium + + required_energy_min = 400 + required_energy_max = 500 + probability = 20 + +/datum/recipe/particle_smasher/plasteel_morphium + items = list(/obj/item/prop/alien/junk) + + result = /obj/item/stack/material/morphium + required_material = /obj/item/stack/material/plasteel + + required_energy_min = 100 + required_energy_max = 300 + probability = 10 + +/datum/recipe/particle_smasher/osmium_lead + reagents = list("tungsten" = 10) + + result = /obj/item/stack/material/lead + required_material = /obj/item/stack/material/osmium + + required_energy_min = 200 + required_energy_max = 400 + + required_atmos_temp_min = 1000 + required_atmos_temp_max = 8000 + probability = 50 + +/datum/recipe/particle_smasher/phoron_valhollide + reagents = list("phoron" = 10, "pacid" = 10) + + result = /obj/item/stack/material/valhollide + required_material = /obj/item/stack/material/phoron + + required_energy_min = 300 + required_energy_max = 500 + + required_atmos_temp_min = 1 + required_atmos_temp_max = 100 + probability = 10 + +/datum/recipe/particle_smasher/valhollide_supermatter + reagents = list("phoron" = 300) + + result = /obj/item/stack/material/supermatter + required_material = /obj/item/stack/material/valhollide + + required_energy_min = 575 + required_energy_max = 600 + + required_atmos_temp_min = 3000 + required_atmos_temp_max = 10000 + probability = 1 \ No newline at end of file diff --git a/code/modules/random_map/noise/ore.dm b/code/modules/random_map/noise/ore.dm index 697a0b416d..99dc761ee6 100644 --- a/code/modules/random_map/noise/ore.dm +++ b/code/modules/random_map/noise/ore.dm @@ -57,25 +57,34 @@ T.resources["gold"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) T.resources["silver"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) T.resources["uranium"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) + T.resources["marble"] = rand(RESOURCE_LOW_MIN, RESOURCE_MID_MAX) T.resources["diamond"] = 0 T.resources["phoron"] = 0 T.resources["osmium"] = 0 T.resources["hydrogen"] = 0 + T.resources["verdantium"] = 0 + T.resources["lead"] = 0 else if(current_cell < deep_val) // Rare metals. T.resources["gold"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) T.resources["silver"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) T.resources["uranium"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) T.resources["phoron"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) T.resources["osmium"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) + T.resources["verdantium"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) + T.resources["lead"] = rand(RESOURCE_LOW_MIN, RESOURCE_MID_MAX) T.resources["hydrogen"] = 0 T.resources["diamond"] = 0 T.resources["hematite"] = 0 + T.resources["marble"] = 0 else // Deep metals. T.resources["uranium"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) T.resources["diamond"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) + T.resources["verdantium"] = rand(RESOURCE_LOW_MIN, RESOURCE_MID_MAX) T.resources["phoron"] = rand(RESOURCE_HIGH_MIN, RESOURCE_HIGH_MAX) T.resources["osmium"] = rand(RESOURCE_HIGH_MIN, RESOURCE_HIGH_MAX) T.resources["hydrogen"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) + T.resources["marble"] = rand(RESOURCE_MID_MIN, RESOURCE_HIGH_MAX) + T.resources["lead"] = rand(RESOURCE_LOW_MIN, RESOURCE_HIGH_MAX) T.resources["hematite"] = 0 T.resources["gold"] = 0 T.resources["silver"] = 0 diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm index 70ca9692f3..9d3eab7c43 100644 --- a/code/modules/research/circuitprinter.dm +++ b/code/modules/research/circuitprinter.dm @@ -16,7 +16,9 @@ using metal and glass, it uses glass and reagents (usually sulphuric acid). var/mat_efficiency = 1 var/speed = 1 - materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, "plastic" = 0, "gold" = 0, "silver" = 0, "osmium" = 0, "phoron" = 0, "uranium" = 0, "diamond" = 0) + materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, MAT_PLASTEEL = 0, "plastic" = 0, "gold" = 0, "silver" = 0, "osmium" = 0, MAT_LEAD = 0, "phoron" = 0, "uranium" = 0, "diamond" = 0, MAT_DURASTEEL = 0, MAT_VERDANTIUM = 0, MAT_MORPHIUM = 0, MAT_METALHYDROGEN = 0, MAT_SUPERMATTER = 0) + + hidden_materials = list(MAT_PLASTEEL, MAT_DURASTEEL, MAT_VERDANTIUM, MAT_MORPHIUM, MAT_METALHYDROGEN, MAT_SUPERMATTER) use_power = 1 idle_power_usage = 30 @@ -68,7 +70,7 @@ using metal and glass, it uses glass and reagents (usually sulphuric acid). T = 0 for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) T += M.rating - mat_efficiency = 1 - (T - 1) / 4 + mat_efficiency = max(1 - (T - 1) / 4, 0.2) speed = T /obj/machinery/r_n_d/circuit_imprinter/update_icon() diff --git a/code/modules/research/designs/precursor.dm b/code/modules/research/designs/precursor.dm new file mode 100644 index 0000000000..41284c64ef --- /dev/null +++ b/code/modules/research/designs/precursor.dm @@ -0,0 +1,25 @@ +/* + * Contains Precursor and Anomalous designs for the Protolathe. + */ + +/datum/design/item/precursor/AssembleDesignName() + ..() + name = "Alien prototype ([item_name])" + +/datum/design/item/precursor/AssembleDesignDesc() + if(!desc) + if(build_path) + var/obj/item/I = build_path + desc = initial(I.desc) + ..() + +/datum/design/item/anomaly/AssembleDesignName() + ..() + name = "Anomalous prototype ([item_name])" + +/datum/design/item/anomaly/AssembleDesignDesc() + if(!desc) + if(build_path) + var/obj/item/I = build_path + desc = initial(I.desc) + ..() \ No newline at end of file diff --git a/code/modules/research/designs/stock_parts.dm b/code/modules/research/designs/stock_parts.dm index fb629e7ad7..60a0abb63e 100644 --- a/code/modules/research/designs/stock_parts.dm +++ b/code/modules/research/designs/stock_parts.dm @@ -34,6 +34,20 @@ build_path = /obj/item/weapon/stock_parts/capacitor/super sort_string = "CAAAC" +/datum/design/item/stock_part/hyper_capacitor + id = "hyper_capacitor" + req_tech = list(TECH_POWER = 6, TECH_MATERIAL = 5, TECH_BLUESPACE = 1, TECH_ARCANE = 1) + materials = list(DEFAULT_WALL_MATERIAL = 200, MAT_GLASS = 100, MAT_VERDANTIUM = 30, MAT_DURASTEEL = 25) + build_path = /obj/item/weapon/stock_parts/capacitor/hyper + sort_string = "CAAAD" + +/datum/design/item/stock_part/omni_capacitor + id = "omni_capacitor" + req_tech = list(TECH_POWER = 7, TECH_MATERIAL = 6, TECH_BLUESPACE = 3, TECH_PRECURSOR = 1) + materials = list(DEFAULT_WALL_MATERIAL = 2000, MAT_DIAMOND = 1000, MAT_GLASS = 1000, MAT_MORPHIUM = 100, MAT_DURASTEEL = 100) + build_path = /obj/item/weapon/stock_parts/capacitor/omni + sort_string = "CAAAE" + /datum/design/item/stock_part/micro_mani id = "micro_mani" req_tech = list(TECH_MATERIAL = 1, TECH_DATA = 1) @@ -55,6 +69,20 @@ build_path = /obj/item/weapon/stock_parts/manipulator/pico sort_string = "CAABC" +/datum/design/item/stock_part/hyper_mani + id = "hyper_mani" + req_tech = list(TECH_MATERIAL = 6, TECH_DATA = 3, TECH_ARCANE = 2) + materials = list(DEFAULT_WALL_MATERIAL = 200, MAT_VERDANTIUM = 50, MAT_DURASTEEL = 50) + build_path = /obj/item/weapon/stock_parts/manipulator/hyper + sort_string = "CAABD" + +/datum/design/item/stock_part/omni_mani + id = "omni_mani" + req_tech = list(TECH_MATERIAL = 7, TECH_DATA = 4, TECH_PRECURSOR = 2) + materials = list(DEFAULT_WALL_MATERIAL = 2000, MAT_PLASTEEL = 500, MAT_MORPHIUM = 100, MAT_DURASTEEL = 100) + build_path = /obj/item/weapon/stock_parts/manipulator/omni + sort_string = "CAABE" + /datum/design/item/stock_part/basic_matter_bin id = "basic_matter_bin" req_tech = list(TECH_MATERIAL = 1) @@ -76,6 +104,20 @@ build_path = /obj/item/weapon/stock_parts/matter_bin/super sort_string = "CAACC" +/datum/design/item/stock_part/hyper_matter_bin + id = "hyper_matter_bin" + req_tech = list(TECH_MATERIAL = 6, TECH_ARCANE = 2) + materials = list(DEFAULT_WALL_MATERIAL = 200, MAT_VERDANTIUM = 60, MAT_DURASTEEL = 75) + build_path = /obj/item/weapon/stock_parts/matter_bin/hyper + sort_string = "CAACD" + +/datum/design/item/stock_part/omni_matter_bin + id = "omni_matter_bin" + req_tech = list(TECH_MATERIAL = 7, TECH_PRECURSOR = 2) + materials = list(DEFAULT_WALL_MATERIAL = 2000, MAT_PLASTEEL = 100, MAT_MORPHIUM = 100, MAT_DURASTEEL = 100) + build_path = /obj/item/weapon/stock_parts/matter_bin/omni + sort_string = "CAACE" + /datum/design/item/stock_part/basic_micro_laser id = "basic_micro_laser" req_tech = list(TECH_MAGNET = 1) @@ -97,6 +139,20 @@ build_path = /obj/item/weapon/stock_parts/micro_laser/ultra sort_string = "CAADC" +/datum/design/item/stock_part/hyper_micro_laser + id = "hyper_micro_laser" + req_tech = list(TECH_MAGNET = 6, TECH_MATERIAL = 6, TECH_ARCANE = 2) + materials = list(DEFAULT_WALL_MATERIAL = 200, MAT_GLASS = 20, MAT_URANIUM = 30, MAT_VERDANTIUM = 50, MAT_DURASTEEL = 100) + build_path = /obj/item/weapon/stock_parts/micro_laser/hyper + sort_string = "CAADD" + +/datum/design/item/stock_part/omni_micro_laser + id = "omni_micro_laser" + req_tech = list(TECH_MAGNET = 7, TECH_MATERIAL = 7, TECH_PRECURSOR = 2) + materials = list(DEFAULT_WALL_MATERIAL = 2000, MAT_GLASS = 500, MAT_URANIUM = 2000, MAT_MORPHIUM = 50, MAT_DURASTEEL = 100) + build_path = /obj/item/weapon/stock_parts/micro_laser/omni + sort_string = "CAADE" + /datum/design/item/stock_part/basic_sensor id = "basic_sensor" req_tech = list(TECH_MAGNET = 1) @@ -118,6 +174,20 @@ build_path = /obj/item/weapon/stock_parts/scanning_module/phasic sort_string = "CAAEC" +/datum/design/item/stock_part/hyper_sensor + id = "hyper_sensor" + req_tech = list(TECH_MAGNET = 6, TECH_MATERIAL = 4, TECH_ARCANE = 1) + materials = list(DEFAULT_WALL_MATERIAL = 50, MAT_GLASS = 20, MAT_SILVER = 50, MAT_VERDANTIUM = 40, MAT_DURASTEEL = 50) + build_path = /obj/item/weapon/stock_parts/scanning_module/hyper + sort_string = "CAAED" + +/datum/design/item/stock_part/omni_sensor + id = "omni_sensor" + req_tech = list(TECH_MAGNET = 7, TECH_MATERIAL = 5, TECH_PRECURSOR = 1) + materials = list(DEFAULT_WALL_MATERIAL = 1000, MAT_PLASTEEL = 500, MAT_GLASS = 750, MAT_SILVER = 500, MAT_MORPHIUM = 60, MAT_DURASTEEL = 100) + build_path = /obj/item/weapon/stock_parts/scanning_module/omni + sort_string = "CAAEE" + /datum/design/item/stock_part/subspace_ansible id = "s-ansible" req_tech = list(TECH_DATA = 3, TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2) diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm index bea555b70c..b8b4130dfe 100644 --- a/code/modules/research/protolathe.dm +++ b/code/modules/research/protolathe.dm @@ -15,7 +15,9 @@ var/mat_efficiency = 1 var/speed = 1 - materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, "plastic" = 0, "gold" = 0, "silver" = 0, "osmium" = 0, "phoron" = 0, "uranium" = 0, "diamond" = 0) + materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, MAT_PLASTEEL = 0, "plastic" = 0, "gold" = 0, "silver" = 0, "osmium" = 0, MAT_LEAD = 0, "phoron" = 0, "uranium" = 0, "diamond" = 0, MAT_DURASTEEL = 0, MAT_VERDANTIUM = 0, MAT_MORPHIUM = 0, MAT_METALHYDROGEN = 0, MAT_SUPERMATTER = 0) + + hidden_materials = list(MAT_PLASTEEL, MAT_DURASTEEL, MAT_VERDANTIUM, MAT_MORPHIUM, MAT_METALHYDROGEN, MAT_SUPERMATTER) /obj/machinery/r_n_d/protolathe/Initialize() . = ..() @@ -71,7 +73,7 @@ T = 0 for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) T += M.rating - mat_efficiency = 1 - (T - 2) / 8 + mat_efficiency = max(1 - (T - 2) / 8, 0.2) speed = T / 2 /obj/machinery/r_n_d/protolathe/dismantle() @@ -207,28 +209,17 @@ /obj/machinery/r_n_d/protolathe/proc/eject_materials(var/material, var/amount) // 0 amount = 0 means ejecting a full stack; -1 means eject everything var/recursive = amount == -1 ? 1 : 0 material = lowertext(material) - var/mattype - switch(material) - if(DEFAULT_WALL_MATERIAL) - mattype = /obj/item/stack/material/steel - if("glass") - mattype = /obj/item/stack/material/glass - if("plastic") - mattype = /obj/item/stack/material/plastic - if("gold") - mattype = /obj/item/stack/material/gold - if("silver") - mattype = /obj/item/stack/material/silver - if("osmium") - mattype = /obj/item/stack/material/osmium - if("diamond") - mattype = /obj/item/stack/material/diamond - if("phoron") - mattype = /obj/item/stack/material/phoron - if("uranium") - mattype = /obj/item/stack/material/uranium - else - return + var/obj/item/stack/material/mattype + var/material/MAT = get_material_by_name(material) + + if(!MAT) + return + + mattype = MAT.stack_type + + if(!mattype) + return + var/obj/item/stack/material/S = new mattype(loc) if(amount <= 0) amount = S.max_amount diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 38cba96c84..5346f50e6e 100755 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -660,6 +660,13 @@ won't update every console in existence) but it's more of a hassle to do. Also, dat += "