From 08e7703e4f1d77592d7cc43e00c3f32b297ab484 Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Mon, 5 Jun 2017 00:11:48 -0400 Subject: [PATCH] Finishing Up NIFs Squashed commit: [4b18ca1] Finishing up NIFs [e4adb4a] Tons more NIF work All the implants are done! --- code/__defines/nifsoft.dm | 37 ++-- code/game/objects/structures/trash_pile.dm | 3 +- .../client/preference_setup/vore/08_nif.dm | 45 +++++ .../living/carbon/human/human_attackhand.dm | 1 + .../mob/living/carbon/human/human_damage.dm | 4 + code/modules/mob/living/carbon/human/life.dm | 6 +- code/modules/nano/interaction/inventory_vr.dm | 22 +- code/modules/nifsoft/nif.dm | 140 ++++++++++--- code/modules/nifsoft/nif_softshop.dm | 108 +++++++++- code/modules/nifsoft/nif_statpanel.dm | 9 +- code/modules/nifsoft/nifsoft.dm | 75 ++++++- code/modules/nifsoft/software/01_vision.dm | 84 ++++---- code/modules/nifsoft/software/05_health.dm | 63 ++++-- code/modules/nifsoft/software/10_combat.dm | 143 ++++++++++++- code/modules/nifsoft/software/14_commlink.dm | 132 ++++++++++++ code/modules/nifsoft/software/15_misc.dm | 191 +++++++++++++++++- code/modules/organs/organ_external.dm | 2 + code/modules/research/designs_vr.dm | 8 + code/modules/resleeving/implant.dm | 3 +- code/modules/resleeving/infocore.dm | 20 +- code/modules/resleeving/machines.dm | 6 + code/modules/vore/persist/persist_vr.dm | 30 ++- icons/obj/vending_vr.dmi | Bin 67288 -> 67274 bytes maps/tether/tether-01-surface.dmm | 8 +- maps/tether/tether-03-station.dmm | 2 +- maps/tether/tether-06-colony.dmm | 6 +- maps/tether/tether-07-misc.dmm | 2 +- sound/items/nif_click.ogg | Bin 0 -> 7990 bytes sound/items/nif_tone_bad.ogg | Bin 0 -> 11552 bytes sound/items/nif_tone_good.ogg | Bin 0 -> 33960 bytes vorestation.dme | 2 + 31 files changed, 1003 insertions(+), 149 deletions(-) create mode 100644 code/modules/client/preference_setup/vore/08_nif.dm create mode 100644 code/modules/nifsoft/software/14_commlink.dm create mode 100644 sound/items/nif_click.ogg create mode 100644 sound/items/nif_tone_bad.ogg create mode 100644 sound/items/nif_tone_good.ogg diff --git a/code/__defines/nifsoft.dm b/code/__defines/nifsoft.dm index e4d4f12293..06d1b0c7aa 100644 --- a/code/__defines/nifsoft.dm +++ b/code/__defines/nifsoft.dm @@ -16,27 +16,29 @@ #define NIF_UVFILTER 12 #define NIF_FLASHPROT 13 //Health-related -#define NIF_ORGANIC_HEAL 14 -#define NIF_SYNTH_HEAL 15 -#define NIF_AUTOSTASIS 16 //These two are just part of -#define NIF_MED_ALARM 17 //medichines right now -#define NIF_TOXHEAL 18 -#define NIF_SPAREBREATH 19 +#define NIF_CREWMONITOR 14 +#define NIF_ORGANIC_HEAL 15 +#define NIF_SYNTH_HEAL 16 +#define NIF_AUTOSTASIS 17 //These two are just part of +#define NIF_MED_ALARM 18 //medichines right now +#define NIF_TOXHEAL 19 //And this, for organics +#define NIF_SPAREBREATH 20 //Combat Related -#define NIF_BRUTEARMOR 20 -#define NIF_BURNARMOR 21 -#define NIF_PAINKILLERS 22 -#define NIF_HARDCLAWS 23 -#define NIF_HIDDENLASER 24 +#define NIF_BRUTEARMOR 21 +#define NIF_BURNARMOR 22 +#define NIF_PAINKILLERS 23 +#define NIF_HARDCLAWS 24 +#define NIF_HIDDENLASER 25 //Other -#define NIF_COMMLINK 25 -#define NIF_SUITSENSORS 26 +#define NIF_COMMLINK 26 #define NIF_APCCHARGE 27 #define NIF_PRESSURE 28 #define NIF_HEATSINK 29 +#define NIF_COMPLIANCE 30 +#define NIF_SIZECHANGE 31 // Must be equal to the highest number above -#define TOTAL_NIF_SOFTWARE 29 +#define TOTAL_NIF_SOFTWARE 31 ////////////////////// // NIF flag list hints @@ -78,10 +80,9 @@ //Other #define NIF_O_COMMLINK 0x1 -#define NIF_O_SENSORS 0x2 -#define NIF_O_APCCHARGE 0x4 -#define NIF_O_PRESSURESEAL 0x8 -#define NIF_O_HEATSINKS 0x10 +#define NIF_O_APCCHARGE 0x2 +#define NIF_O_PRESSURESEAL 0x4 +#define NIF_O_HEATSINKS 0x8 /////////////////// // applies_to flags diff --git a/code/game/objects/structures/trash_pile.dm b/code/game/objects/structures/trash_pile.dm index 5490251280..0959f93004 100644 --- a/code/game/objects/structures/trash_pile.dm +++ b/code/game/objects/structures/trash_pile.dm @@ -225,7 +225,8 @@ prob(4);/obj/item/device/radio_jammer, prob(2);/obj/item/weapon/storage/box/syndie_kit/spy, prob(2);/obj/item/weapon/grenade/anti_photon, - prob(1);/obj/item/weapon/cell/hyper/empty) + prob(1);/obj/item/weapon/cell/hyper/empty, + prob(1);/obj/item/weapon/disk/nifsoft/compliance) var/obj/item/I = new path() return I diff --git a/code/modules/client/preference_setup/vore/08_nif.dm b/code/modules/client/preference_setup/vore/08_nif.dm new file mode 100644 index 0000000000..52586d3bcf --- /dev/null +++ b/code/modules/client/preference_setup/vore/08_nif.dm @@ -0,0 +1,45 @@ +//Pretty small file, mostly just for storage. +/datum/preferences + var/obj/item/device/nif/nif_path + var/nif_durability + +// Definition of the stuff for NIFs +/datum/category_item/player_setup_item/vore/nif + name = "NIF Data" + sort_order = 8 + +/datum/category_item/player_setup_item/vore/nif/load_character(var/savefile/S) + S["nif_path"] >> pref.nif_path + S["nif_durability"] >> pref.nif_durability + +/datum/category_item/player_setup_item/vore/nif/save_character(var/savefile/S) + S["nif_path"] << pref.nif_path + S["nif_durability"] << pref.nif_durability + +/datum/category_item/player_setup_item/vore/nif/sanitize_character() + if(pref.nif_path && !ispath(pref.nif_path)) //We have at least a text string that should be a path. + pref.nif_path = text2path(pref.nif_path) //Try to convert it to a hard path. + if(!pref.nif_path) //If we couldn't, kill it. + pref.nif_path = null //Kill! + WARNING("Loaded a NIF but it was an invalid path, [pref.real_name]") + + if(ispath(pref.nif_path) && !pref.nif_durability) //How'd you lose this? + pref.nif_durability = initial(pref.nif_path.durability) //Well, have a new one, my bad. + WARNING("Loaded a NIF but with no durability, [pref.real_name]") + +/datum/category_item/player_setup_item/vore/nif/copy_to_mob(var/mob/living/carbon/human/character) + //If you had a NIF... + if((character.type == /mob/living/carbon/human) && ispath(pref.nif_path) && pref.nif_durability) + new pref.nif_path(character,pref.nif_durability) + + //And now here's the trick. We wipe these so that if they die, they lose the NIF. + //Backup implants will start saving this again periodically, and so will cryo'ing out. + pref.nif_path = null + pref.nif_durability = null + var/savefile/S = new /savefile(pref.path) + if(!S) WARNING ("Couldn't load NIF save savefile? [pref.real_name]") + S.cd = "/character[pref.default_slot]" + save_character(S) + +/datum/category_item/player_setup_item/vore/nif/content(var/mob/user) + . += "NIF: [ispath(pref.nif_path) ? "Present" : "None"]" diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 3af1a52bf6..b321d288fb 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -1,5 +1,6 @@ /mob/living/carbon/human/proc/get_unarmed_attack(var/mob/living/carbon/human/target, var/hit_zone) // VOREStation Edit - Begin + if(nif && nif.flag_check(NIF_C_HARDCLAWS,NIF_FLAGS_COMBAT)){return unarmed_hardclaws} if(src.default_attack && src.default_attack.is_usable(src, target, hit_zone)) if(pulling_punches) var/datum/unarmed_attack/soft_type = src.default_attack.get_sparring_variant() diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 30ee7c64d6..d1f468500b 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -104,6 +104,7 @@ amount *= M.incoming_damage_percent if(!isnull(M.incoming_brute_damage_percent)) amount *= M.incoming_brute_damage_percent + if(nif && nif.flag_check(NIF_C_BRUTEARMOR,NIF_FLAGS_COMBAT)){amount *= 0.7} //VOREStation Edit - NIF mod for damage resistance for this type of damage take_overall_damage(amount, 0) else for(var/datum/modifier/M in modifiers) @@ -120,6 +121,7 @@ amount *= M.incoming_damage_percent if(!isnull(M.incoming_fire_damage_percent)) amount *= M.incoming_fire_damage_percent + if(nif && nif.flag_check(NIF_C_BURNARMOR,NIF_FLAGS_COMBAT)){amount *= 0.7} //VOREStation Edit - NIF mod for damage resistance for this type of damage take_overall_damage(0, amount) else for(var/datum/modifier/M in modifiers) @@ -139,6 +141,7 @@ amount *= M.incoming_damage_percent if(!isnull(M.incoming_brute_damage_percent)) amount *= M.incoming_brute_damage_percent + if(nif && nif.flag_check(NIF_C_BRUTEARMOR,NIF_FLAGS_COMBAT)){amount *= 0.7} //VOREStation Edit - NIF mod for damage resistance for this type of damage O.take_damage(amount, 0, sharp=is_sharp(damage_source), edge=has_edge(damage_source), used_weapon=damage_source) else for(var/datum/modifier/M in modifiers) @@ -160,6 +163,7 @@ amount *= M.incoming_damage_percent if(!isnull(M.incoming_fire_damage_percent)) amount *= M.incoming_fire_damage_percent + if(nif && nif.flag_check(NIF_C_BURNARMOR,NIF_FLAGS_COMBAT)){amount *= 0.7} //VOREStation Edit - NIF mod for damage resistance for this type of damage O.take_damage(0, amount, sharp=is_sharp(damage_source), edge=has_edge(damage_source), used_weapon=damage_source) else for(var/datum/modifier/M in modifiers) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 75d598fb69..fd21301044 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -666,7 +666,8 @@ pressure_alert = -1 else if( !(COLD_RESISTANCE in mutations)) - take_overall_damage(brute=LOW_PRESSURE_DAMAGE, used_weapon = "Low Pressure") + if(!isSynthetic() || !nif || !nif.flag_check(NIF_O_PRESSURESEAL,NIF_FLAGS_OTHER)) //VOREStation Edit - NIF pressure seals + take_overall_damage(brute=LOW_PRESSURE_DAMAGE, used_weapon = "Low Pressure") if(getOxyLoss() < 55) // 11 OxyLoss per 4 ticks when wearing internals; unconsciousness in 16 ticks, roughly half a minute adjustOxyLoss(4) // 16 OxyLoss per 4 ticks when no internals present; unconsciousness in 13 ticks, roughly twenty seconds pressure_alert = -2 @@ -703,7 +704,8 @@ // FBPs will overheat, prosthetic limbs are fine. if(robobody_count) - bodytemperature += round(robobody_count*1.75) + if(!nif || !nif.flag_check(NIF_O_HEATSINKS,NIF_FLAGS_OTHER)) //VOREStation Edit - NIF heatsinks + bodytemperature += round(robobody_count*1.75) var/body_temperature_difference = species.body_temperature - bodytemperature diff --git a/code/modules/nano/interaction/inventory_vr.dm b/code/modules/nano/interaction/inventory_vr.dm index 373e9f382b..21ee1ca590 100644 --- a/code/modules/nano/interaction/inventory_vr.dm +++ b/code/modules/nano/interaction/inventory_vr.dm @@ -1,7 +1,7 @@ /* This state checks that the src_object is on the user's glasses slot. */ -/var/global/datum/topic_state/inventory_state/glasses_state = new() +/var/global/datum/topic_state/glasses_state/glasses_state = new() /datum/topic_state/glasses_state/can_use_topic(var/src_object, var/mob/user) if(ishuman(user)) @@ -10,3 +10,23 @@ return user.shared_nano_interaction() return STATUS_CLOSE + +/var/global/datum/topic_state/nif_state/nif_state = new() + +/datum/topic_state/nif_state/can_use_topic(var/src_object, var/mob/user) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + if(H.nif && H.nif.stat == NIF_WORKING && src_object == H.nif) + return user.shared_nano_interaction() + + return STATUS_CLOSE + +/var/global/datum/topic_state/commlink_state/commlink_state = new() + +/datum/topic_state/commlink_state/can_use_topic(var/src_object, var/mob/user) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + if(H.nif && H.nif.stat == NIF_WORKING && H.nif.comm == src_object) + return user.shared_nano_interaction() + + return STATUS_CLOSE diff --git a/code/modules/nifsoft/nif.dm b/code/modules/nifsoft/nif.dm index b4ef9eafd7..dc958718cc 100644 --- a/code/modules/nifsoft/nif.dm +++ b/code/modules/nifsoft/nif.dm @@ -3,8 +3,8 @@ //Nanotech Implant Foundation /obj/item/device/nif - name = "nanotech implant foundation" - desc = "A somewhat degraded copy of a Kitsuhana working surface, in a box. Can print new \ + name = "nanite implant framework" + desc = "A somewhat diminished knockoff of a Kitsuhana nano working surface, in a box. Can print new \ implants inside living hosts on the fly based on software uploads. Must be surgically \ implanted in the head to work. May eventually wear out and break." @@ -14,7 +14,7 @@ w_class = ITEMSIZE_TINY var/durability = 100 // Durability remaining - var/burn_factor = 100 // Divisor for power charge from nutrition (efficiency basically) + var/bioadap = FALSE // If it'll work in fancy species var/tmp/power_usage = 0 // Nifsoft adds to this var/tmp/mob/living/carbon/human/human // Our owner! @@ -31,31 +31,51 @@ var/tmp/install_done // Time when install will finish var/tmp/open = FALSE // If it's open for maintenance (1-3) - var/obj/item/clothing/glasses/hud/nif_hud/nif_hud + var/obj/item/clothing/glasses/hud/nif_hud/nif_hud // The AR ones require this + var/obj/item/device/communicator/commlink/comm // The commlink requires this var/global/icon/big_icon - var/global/click_sound = 'sound/effects/pop.ogg' + var/global/click_sound = 'sound/items/nif_click.ogg' + var/global/bad_sound = 'sound/items/nif_tone_bad.ogg' + var/global/good_sound = 'sound/items/nif_tone_good.ogg' + var/global/list/look_messages = list( + "flicks their eyes around", + "looks at something unseen", + "reads some invisible text", + "seems to be daydreaming", + "focuses elsewhere for a moment") //Constructor comes with a free AR HUD /obj/item/device/nif/New(var/newloc,var/wear) ..(newloc) - new /datum/nifsoft/ar_civ(src) + + //Required for AR stuff. nif_hud = new(src) + //First one to spawn in the game, make a big icon if(!big_icon) big_icon = new(icon,icon_state = "nif_full") - //Probably loading from a save + //If given a human on spawn (probably from persistence) if(ishuman(newloc)) var/mob/living/carbon/human/H = newloc - implant(H) - owner = H.mind.name - name = initial(name) + " ([owner])" - stat = NIF_WORKING + if(!quick_implant(H)) + WARNING("NIF spawned in [H] failed to implant") + spawn(0) + qdel(src) + else + //Free commlink for return customers + new /datum/nifsoft/commlink(src) + //Free civilian AR included + new /datum/nifsoft/ar_civ(src) + + //If given wear (like when spawned) then done if(wear) durability = wear + wear(0) //Just make it update. + //Draw me yo. update_icon() //Destructor cleans up references @@ -66,12 +86,20 @@ for(var/S in nifsofts) if(S) qdel(S) + if(nif_hud) + qdel(nif_hud) + if(comm) + qdel(comm) + nifsofts.Cut() ..() //Being implanted in some mob /obj/item/device/nif/proc/implant(var/mob/living/carbon/human/H) - if(istype(H) && !H.nif && H.species && !(H.species.flags & NO_SCAN) && (loc == H.get_organ(BP_HEAD))) //NO_SCAN is the default 'too complicated' flag. + if(istype(H) && !H.nif && H.species && (loc == H.get_organ(BP_HEAD))) + if(!bioadap && (H.species.flags & NO_SCAN)) //NO_SCAN is the default 'too complicated' flag + return FALSE + human = H human.nif = src stat = NIF_INSTALLING @@ -87,8 +115,10 @@ return FALSE src.forceMove(head) head.implants += src - owner = H.real_name - return implant(H) + spawn(0) //Let the character finish spawning yo. + owner = H.mind.name + implant(H) + return TRUE return FALSE @@ -121,20 +151,20 @@ //Wear update/check proc /obj/item/device/nif/proc/wear(var/wear = 0) - if(wear) - durability -= wear * rand(0.85,1.15) // Also +/- 15% + wear *= (rand(85,115) / 100) //Apparently rand() only takes integers. + durability -= wear if(durability <= 0) - stat = NIF_TEMPFAIL - update_icon() notify("Danger! General system insta#^!($",TRUE) to_chat(human,"Your NIF vision overlays disappear and your head suddenly seems very quiet...") + stat = NIF_TEMPFAIL + update_icon() //Attackby proc, for maintenance /obj/item/device/nif/attackby(obj/item/weapon/W, mob/user as mob) if(open == 0 && istype(W,/obj/item/weapon/screwdriver)) if(do_after(user, 4 SECONDS, src) && open == 0) - user.visible_message("[user] unscrews and pries open \the [src].","You unscrew and pry open \the [src].") + user.visible_message("[user] unscrews and pries open \the [src].","You unscrew and pry open \the [src].") playsound(user, 'sound/items/Screwdriver.ogg', 50, 1) open = 1 update_icon() @@ -144,25 +174,25 @@ to_chat(user,"You need at least three coils of wire to add them to \the [src].") return if(do_after(user, 6 SECONDS, src) && open == 1 && C.use(3)) - user.visible_message("[user] replaces some wiring in \the [src].","You replace any burned out wiring in \the [src].") + user.visible_message("[user] replaces some wiring in \the [src].","You replace any burned out wiring in \the [src].") playsound(user, 'sound/items/Deconstruct.ogg', 50, 1) open = 2 update_icon() else if(open == 2 && istype(W,/obj/item/device/multitool)) if(do_after(user, 8 SECONDS, src) && open == 2) - user.visible_message("[user] resets several circuits in \the [src].","You find and repair any faulty circuits in \the [src].") + user.visible_message("[user] resets several circuits in \the [src].","You find and repair any faulty circuits in \the [src].") open = 3 update_icon() else if(open == 3 && istype(W,/obj/item/weapon/screwdriver)) if(do_after(user, 3 SECONDS, src) && open == 3) - user.visible_message("[user] closes up \the [src].","You re-seal \the [src] for use once more.") + user.visible_message("[user] closes up \the [src].","You re-seal \the [src] for use once more.") playsound(user, 'sound/items/Screwdriver.ogg', 50, 1) open = FALSE durability = initial(durability) stat = NIF_PREINSTALL update_icon() -//Wear update/check proc +//Icon updating /obj/item/device/nif/update_icon() if(open) icon_state = "nif_open[open]" @@ -181,19 +211,24 @@ //The (dramatic) install process /obj/item/device/nif/proc/handle_install() - if(human.stat) //No stuff while KO. Sleeping it off is viable, and doesn't start until you wake up from surgery + if(human.stat || !human.mind) //No stuff while KO or not sleeved return FALSE //Firsties if(!install_done) - if(human.real_name == owner) + if(human.mind.name == owner) install_done = world.time + 1 MINUTE notify("Welcome back, [owner]! Performing quick-calibration...") - else + else if(!owner) install_done = world.time + 30 MINUTES notify("Adapting to new user...") sleep(5 SECONDS) notify("Adjoining optic [human.isSynthetic() ? "interface" : "nerve"], please be patient.",TRUE) + else + notify("You are not an authorized user for this device. Please contact [owner].",TRUE) + unimplant() + stat = NIF_TEMPFAIL + return FALSE var/percent_done = (world.time - (install_done - (30 MINUTES))) / (30 MINUTES) @@ -229,7 +264,7 @@ //Finishing up if(1.0 to INFINITY) stat = NIF_WORKING - owner = human.real_name + owner = human.mind.name name = initial(name) + " ([owner])" notify("Calibration complete! User data stored!") @@ -272,12 +307,19 @@ //Prints 'AR' messages to the user /obj/item/device/nif/proc/notify(var/message,var/alert = 0) - if(!human) return + if(!human || stat == NIF_TEMPFAIL) return to_chat(human,"\[\icon[src.big_icon]NIF\] displays, \"[message]\"") + if(prob(1)) human.visible_message("\The [human] [pick(look_messages)].") + if(alert) + human << bad_sound + else + human << good_sound //Called to spend nutrition, returns 1 if it was able to /obj/item/device/nif/proc/use_charge(var/use_charge) + if(stat != NIF_WORKING) return FALSE + //You don't want us to take any? Well okay. if(!use_charge) return TRUE @@ -292,6 +334,8 @@ //Install a piece of software /obj/item/device/nif/proc/install(var/datum/nifsoft/new_soft) + if(stat == NIF_TEMPFAIL) return FALSE + if(nifsofts[new_soft.list_pos]) return FALSE @@ -305,6 +349,7 @@ notify("The software \"[new_soft]\" is not supported in organic life.",TRUE) return FALSE + wear(new_soft.wear) nifsofts[new_soft.list_pos] = new_soft power_usage += new_soft.p_drain @@ -320,7 +365,6 @@ if(new_soft.other_flags) other_flags |= new_soft.other_flags - wear(new_soft.wear) return TRUE //Uninstall a piece of software @@ -353,7 +397,10 @@ //Activate a nifsoft /obj/item/device/nif/proc/activate(var/datum/nifsoft/soft) + if(stat != NIF_WORKING) return FALSE + if(human) + if(prob(5)) human.visible_message("\The [human] [pick(look_messages)].") var/applies_to = soft.applies_to var/synth = human.isSynthetic() if(synth && !(applies_to & NIF_SYNTHETIC)) @@ -366,6 +413,7 @@ return FALSE if(!use_charge(soft.a_drain)) + notify("Not enough power to activate \"[soft]\" NIFsoft!",TRUE) return FALSE if(soft.tick_flags == NIF_ACTIVETICK) @@ -378,6 +426,9 @@ //Deactivate a nifsoft /obj/item/device/nif/proc/deactivate(var/datum/nifsoft/soft) + if(human) + if(prob(5)) human.visible_message("\The [human] [pick(look_messages)].") + if(soft.tick_flags == NIF_ACTIVETICK) nifsofts_life -= soft @@ -427,7 +478,7 @@ //Check for an installed implant /obj/item/device/nif/proc/imp_check(var/soft) - if(!stat == NIF_WORKING) return FALSE + if(stat != NIF_WORKING) return FALSE ASSERT(soft) if(ispath(soft)) @@ -439,7 +490,8 @@ //Check for a set flag /obj/item/device/nif/proc/flag_check(var/flag,var/hint) - if(!stat == NIF_WORKING) return FALSE + if(stat != NIF_WORKING) return FALSE + ASSERT(flag && hint) var/result = FALSE @@ -457,6 +509,7 @@ return result +/////////////////////////////////////////////////////////////////////////////////////// //NIF HUD object becasue HUD handling is trash and should be rewritten /obj/item/clothing/glasses/hud/nif_hud/var/obj/item/device/nif/nif @@ -464,6 +517,12 @@ ..(newloc) nif = newloc +/obj/item/clothing/glasses/hud/nif_hud/Destroy() + if(nif) + nif.nif_hud = null + nif = null + ..() + /obj/item/clothing/glasses/hud/nif_hud/process_hud(M,var/thing) //Faster checking with local var, and this is called often so I want fast. var/visflags = nif.vision_flags @@ -479,3 +538,22 @@ process_omni_hud(nif.human, "sci") else if(NIF_V_AR_CIVILIAN & visflags) process_omni_hud(nif.human, "civ") + +// Alternate NIFs +/obj/item/device/nif/bad + name = "second-hand NIF" + desc = "A copy of a copy of a copy of a copy of... this can't be any good, right? Surely?" + durability = 10 + +/obj/item/device/nif/authentic + name = "\improper Kitsuhana NIF" + desc = "An actual Kitsuhana working surface, in a box. From a society slightly less afraid \ + of self-replicating nanotechnology. Basically just a high-endurance NIF." + durability = 1000 + +/obj/item/device/nif/bioadap + name = "bioadaptive NIF" + desc = "A NIF that goes out of it's way to accomidate strange body types. \ + Will function in species where it normally wouldn't." + durability = 25 + bioadap = TRUE diff --git a/code/modules/nifsoft/nif_softshop.dm b/code/modules/nifsoft/nif_softshop.dm index 3680b47786..4d0da46843 100644 --- a/code/modules/nifsoft/nif_softshop.dm +++ b/code/modules/nifsoft/nif_softshop.dm @@ -20,7 +20,7 @@ starting_illegal_nifsoft = list() for(var/P in subtypesof(/datum/nifsoft) - /datum/nifsoft/package) var/datum/nifsoft/NS = P - if(initial(NS.initial)) + if(initial(NS.vended)) switch(initial(NS.illegal)) if(TRUE) starting_illegal_nifsoft += NS @@ -40,7 +40,13 @@ for(var/entry in current_list[1]) var/datum/nifsoft/NS = entry - var/name = initial(NS.name) + var/applies_to = initial(NS.applies_to) + var/context = "" + if(!(applies_to & NIF_SYNTHETIC)) + context = " (Org Only)" + else if(!(applies_to & NIF_ORGANIC)) + context = " (Syn Only)" + var/name = "[initial(NS.name)][context]" var/datum/stored_item/vending_product/product = new/datum/stored_item/vending_product(src, entry, name) product.price = initial(NS.cost) @@ -61,6 +67,104 @@ return ..() +/* +/obj/proc/allowed(mob/M) + //check if it doesn't require any access at all + if(src.check_access(null)) + return 1 + + var/id = M.GetIdCard() + if(id) + return check_access(id) + return 0 + +///obj/item/proc/GetAccess() +// return list() + +/atom/movable/proc/GetAccess() + var/obj/item/weapon/card/id/id = GetIdCard() + return id ? id.GetAccess() : list() + +/obj/proc/GetID() + return null + +/obj/proc/check_access(obj/item/I) + return check_access_list(I ? I.GetAccess() : list()) + +/obj/proc/check_access_list(var/list/L) + if(!req_access) req_access = list() + if(!req_one_access) req_one_access = list() + if(!L) return 0 + if(!istype(L, /list)) return 0 + return has_access(req_access, req_one_access, L) +*/ + +//Had to override this too +/obj/machinery/vending/nifsoft_shop/Topic(href, href_list) + if(stat & (BROKEN|NOPOWER)) + return + if(usr.stat || usr.restrained()) + return + + if(href_list["remove_coin"] && !istype(usr,/mob/living/silicon)) + if(!coin) + usr << "There is no coin in this machine." + return + + coin.forceMove(src.loc) + if(!usr.get_active_hand()) + usr.put_in_hands(coin) + usr << "You remove \the [coin] from \the [src]" + coin = null + categories &= ~CAT_COIN + + if((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf)))) + if((href_list["vend"]) && (vend_ready) && (!currently_vending)) + if((!allowed(usr)) && !emagged && scan_id) //For SECURE VENDING MACHINES YEAH + usr << "Access denied." //Unless emagged of course + flick(icon_deny,src) + return + + var/key = text2num(href_list["vend"]) + var/datum/stored_item/vending_product/R = product_records[key] + + // This should not happen unless the request from NanoUI was bad + if(!(R.category & categories)) + return + + //Specific soft access checking + var/datum/nifsoft/path = R.item_path + if(initial(path.access)) + var/list/soft_access = list(initial(path.access)) + var/list/usr_access = usr.GetAccess() + if(!has_access(soft_access, list(), usr_access) && !emagged) + usr << "You aren't authorized to buy [initial(path.name)]." + flick(icon_deny,src) + return + + if(R.price <= 0) + vend(R, usr) + else if(istype(usr,/mob/living/silicon)) //If the item is not free, provide feedback if a synth is trying to buy something. + usr << "Artificial unit recognized. Artificial units cannot complete this transaction. Purchase canceled." + return + else + currently_vending = R + if(!vendor_account || vendor_account.suspended) + status_message = "This machine is currently unable to process payments due to problems with the associated account." + status_error = 1 + else + status_message = "[initial(path.desc)]

Please swipe a card or insert cash to pay for the item." + status_error = 0 + + else if(href_list["cancelpurchase"]) + currently_vending = null + + else if((href_list["togglevoice"]) && (panel_open)) + shut_up = !shut_up + + add_fingerprint(usr) + nanomanager.update_uis(src) + // Also special treatment! /obj/machinery/vending/nifsoft_shop/vend(datum/stored_item/vending_product/R, mob/user) var/mob/living/carbon/human/H = user diff --git a/code/modules/nifsoft/nif_statpanel.dm b/code/modules/nifsoft/nif_statpanel.dm index 990bf43565..4ddba7a3c9 100644 --- a/code/modules/nifsoft/nif_statpanel.dm +++ b/code/modules/nifsoft/nif_statpanel.dm @@ -4,7 +4,7 @@ SetupNifStat() /mob/living/carbon/human/proc/SetupNifStat() - var/nif_status + var/nif_status = "" switch(nif.stat) if(NIF_WORKING) nif_status = "Operating Normally" @@ -16,6 +16,7 @@ nif_status = "Adapting To User" else nif_status = "Unknown - Error" + nif_status += " ([round((nif.durability/initial(nif.durability))*100)]%)" stat("NIF Status", nif_status) if(!nif.stat) @@ -39,17 +40,13 @@ nifsoft = new_soft nifsoft_name = new_soft.name name = new_soft.name - toggleable = new_soft.activates /obj/effect/nif_stat/Destroy() nifsoft = null ..() /obj/effect/nif_stat/proc/atom_button_text() - if(!toggleable) - name = "Always On" - else - name = "[nifsoft.active ? "Active" : "Disabled"]" + name = nifsoft.stat_text() return src /obj/effect/nif_stat/Click(var/location, var/control, var/params) diff --git a/code/modules/nifsoft/nifsoft.dm b/code/modules/nifsoft/nifsoft.dm index 453e00d79b..f86e0150e3 100644 --- a/code/modules/nifsoft/nifsoft.dm +++ b/code/modules/nifsoft/nifsoft.dm @@ -9,9 +9,9 @@ var/cost = 1000 // Cost in cash of buying this software from a terminal //TODO - While coding - var/initial = TRUE // This is available in NIFSoft Shops at the start of the game + var/vended = TRUE // This is available in NIFSoft Shops at the start of the game var/wear = 1 // The wear (+/- 10% when applied) that this causes to the NIF - var/list/req_one_access // What access they need to buy it + var/access // What access they need to buy it, can only set one for ~reasons~ var/illegal = FALSE // If this is a black-market nifsoft (emag option) var/active = FALSE // Whether the active mode of this implant is on @@ -63,6 +63,7 @@ deactivate() if(nif) . = nif.uninstall(src) + nif = null qdel(src) //Called every life() tick on a mob on active implants @@ -88,6 +89,17 @@ uninstall() return +//Called when installed from a disk +/datum/nifsoft/proc/disk_install(var/mob/living/carbon/human/target,var/mob/living/carbon/human/user) + return TRUE + +//Stat-line clickable text +/datum/nifsoft/proc/stat_text() + if(activates) + return "[active ? "Active" : "Disabled"]" + + return "Always On" + ////////////////////// //A package of NIF software /datum/nifsoft/package @@ -108,3 +120,62 @@ software.Cut() software = null ..() + +///////////////// +// A NIFSoft Disk +/obj/item/weapon/disk/nifsoft + name = "NIFSoft Disk" + desc = "It has a small label: \n\ + \"Portable NIFSoft Disk. \n\ + Insert directly into brain.\"" + icon = 'icons/obj/cloning.dmi' + icon_state = "datadisk2" + item_state = "card-id" + w_class = ITEMSIZE_SMALL + var/datum/nifsoft/stored = null + var/laws = "" + +/obj/item/weapon/disk/nifsoft/afterattack(var/A, mob/user, flag, params) + if(!in_range(user, A)) + return + + if(!ishuman(user) || !ishuman(A)) + return + + var/mob/living/carbon/human/Ht = A + var/mob/living/carbon/human/Hu = user + + if(!Ht.nif || Ht.nif.stat != NIF_WORKING) + to_chat(user,"Either they don't have a NIF, or the disk can't connect.") + return + + Ht.visible_message("[Hu] begins uploading new NIFSoft into [Ht]!","[Hu] is uploading new NIFSoft into you!") + if(do_after(Ht,10 SECONDS,Hu)) + var/extra = extra_params() + new stored(Ht.nif,extra) + qdel(src) + +//So disks can pass fancier stuff. +/obj/item/weapon/disk/nifsoft/proc/extra_params() + return null + +/obj/item/weapon/disk/nifsoft/compliance + name = "NIFSoft Disk (Compliance)" + desc = "Wow, adding laws to people? That seems illegal. It probably is. Okay, it really is." + stored = /datum/nifsoft/compliance + +/obj/item/weapon/disk/nifsoft/compliance/afterattack(var/A, mob/user, flag, params) + if(!laws) + to_chat(user,"You haven't set any laws yet. Use the disk in-hand first.") + return + ..(A,user,flag,params) + +/obj/item/weapon/disk/nifsoft/compliance/attack_self(mob/user) + var/newlaws = input(user,"Please Input Laws","Compliance Laws",laws) as message + newlaws = sanitize(newlaws,2048) + if(newlaws) + to_chat(user,"You set the laws to:
[newlaws]") + laws = newlaws + +/obj/item/weapon/disk/nifsoft/compliance/extra_params() + return laws diff --git a/code/modules/nifsoft/software/01_vision.dm b/code/modules/nifsoft/software/01_vision.dm index 15f253d9b2..d222cd67dd 100644 --- a/code/modules/nifsoft/software/01_vision.dm +++ b/code/modules/nifsoft/software/01_vision.dm @@ -5,16 +5,15 @@ desc = "Provides a general identification and health status overlay on your vision with no frills." list_pos = NIF_CIVILIAN_AR cost = 500 - initial = TRUE a_drain = 0.05 activate() - if(..()) + if((. = ..())) nif.deactivate_these(NIF_MEDICAL_AR,NIF_SECURITY_AR,NIF_ENGINE_AR,NIF_SCIENCE_AR,NIF_OMNI_AR) nif.set_flag(NIF_V_AR_CIVILIAN,NIF_FLAGS_VISION) deactivate() - if(..()) + if((. = ..())) nif.clear_flag(NIF_V_AR_CIVILIAN,NIF_FLAGS_VISION) /datum/nifsoft/ar_med @@ -22,17 +21,16 @@ desc = "Like the civilian model, but provides medical records access and virus database lookup." list_pos = NIF_MEDICAL_AR cost = 750 - initial = TRUE - req_one_access = list(access_medical) + access = access_medical a_drain = 0.05 activate() - if(..()) + if((. = ..())) nif.deactivate_these(NIF_CIVILIAN_AR,NIF_SECURITY_AR,NIF_ENGINE_AR,NIF_SCIENCE_AR,NIF_OMNI_AR) nif.set_flag(NIF_V_AR_MEDICAL,NIF_FLAGS_VISION) deactivate() - if(..()) + if((. = ..())) nif.clear_flag(NIF_V_AR_MEDICAL,NIF_FLAGS_VISION) /datum/nifsoft/ar_sec @@ -40,17 +38,16 @@ desc = "Like the civilian model, but provides access to arrest status and security records." list_pos = NIF_SECURITY_AR cost = 750 - initial = TRUE - req_one_access = list(access_security) + access = access_security a_drain = 0.05 activate() - if(..()) + if((. = ..())) nif.deactivate_these(NIF_CIVILIAN_AR,NIF_MEDICAL_AR,NIF_ENGINE_AR,NIF_SCIENCE_AR,NIF_OMNI_AR) nif.set_flag(NIF_V_AR_SECURITY,NIF_FLAGS_VISION) deactivate() - if(..()) + if((. = ..())) nif.clear_flag(NIF_V_AR_SECURITY,NIF_FLAGS_VISION) /datum/nifsoft/ar_eng @@ -58,17 +55,16 @@ desc = "Like the civilian model, but provides station alert notices." list_pos = NIF_ENGINE_AR cost = 750 - initial = TRUE - req_one_access = list(access_engine) + access = access_engine a_drain = 0.05 activate() - if(..()) + if((. = ..())) nif.deactivate_these(NIF_CIVILIAN_AR,NIF_MEDICAL_AR,NIF_SECURITY_AR,NIF_SCIENCE_AR,NIF_OMNI_AR) nif.set_flag(NIF_V_AR_ENGINE,NIF_FLAGS_VISION) deactivate() - if(..()) + if((. = ..())) nif.clear_flag(NIF_V_AR_ENGINE,NIF_FLAGS_VISION) /datum/nifsoft/ar_science @@ -76,17 +72,16 @@ desc = "Like the civilian model, but provides ... well, nothing. For now." list_pos = NIF_SCIENCE_AR cost = 750 - initial = TRUE - req_one_access = list(access_research) + access = access_research a_drain = 0.05 activate() - if(..()) + if((. = ..())) nif.deactivate_these(NIF_CIVILIAN_AR,NIF_MEDICAL_AR,NIF_SECURITY_AR,NIF_ENGINE_AR,NIF_OMNI_AR) nif.set_flag(NIF_V_AR_SCIENCE,NIF_FLAGS_VISION) deactivate() - if(..()) + if((. = ..())) nif.clear_flag(NIF_V_AR_SCIENCE,NIF_FLAGS_VISION) /datum/nifsoft/ar_omni @@ -94,17 +89,16 @@ desc = "Like the civilian model, but provides most of the features of the medical and security overlays as well." list_pos = NIF_OMNI_AR cost = 750 - initial = TRUE - req_one_access = list(access_captain) + access = access_captain a_drain = 0.05 activate() - if(..()) + if((. = ..())) nif.deactivate_these(NIF_CIVILIAN_AR,NIF_MEDICAL_AR,NIF_SECURITY_AR,NIF_ENGINE_AR,NIF_SCIENCE_AR) nif.set_flag(NIF_V_AR_OMNI,NIF_FLAGS_VISION) deactivate() - if(..()) + if((. = ..())) nif.clear_flag(NIF_V_AR_OMNI,NIF_FLAGS_VISION) ////////////// @@ -117,11 +111,11 @@ a_drain = 0.025 activate() - if(..()) + if((. = ..())) nif.set_flag(NIF_V_CORRECTIVE,NIF_FLAGS_VISION) deactivate() - if(..()) + if((. = ..())) nif.clear_flag(NIF_V_CORRECTIVE,NIF_FLAGS_VISION) /datum/nifsoft/uvblocker @@ -132,11 +126,11 @@ a_drain = 0.2 activate() - if(..()) + if((. = ..())) nif.set_flag(NIF_V_UVFILTER,NIF_FLAGS_VISION) deactivate() - if(..()) + if((. = ..())) nif.clear_flag(NIF_V_UVFILTER,NIF_FLAGS_VISION) /datum/nifsoft/flashprot @@ -144,15 +138,15 @@ desc = "Enables a high-speed shielding response to intense light, such as flashes, to block them." list_pos = NIF_FLASHPROT cost = 600 - req_one_access = list(access_security) + access = access_security a_drain = 0.05 activate() - if(..()) + if((. = ..())) nif.set_flag(NIF_V_FLASHPROT,NIF_FLAGS_VISION) deactivate() - if(..()) + if((. = ..())) nif.clear_flag(NIF_V_FLASHPROT,NIF_FLAGS_VISION) //////////////// @@ -163,19 +157,20 @@ list_pos = NIF_MESONS cost = 1000 a_drain = 0.1 + access = access_engine tick_flags = NIF_ACTIVETICK activate() - if(..()) + if((. = ..())) nif.deactivate_these(NIF_MATERIAL,NIF_THERMALS,NIF_NIGHTVIS) nif.set_flag(NIF_V_MESONS,NIF_FLAGS_VISION) deactivate() - if(..()) + if((. = ..())) nif.clear_flag(NIF_V_MESONS,NIF_FLAGS_VISION) life() - if(..()) + if((. = ..())) var/mob/living/carbon/human/H = nif.human H.client.screen |= global_hud.meson H.sight |= SEE_TURFS @@ -186,19 +181,20 @@ list_pos = NIF_MATERIAL cost = 1000 a_drain = 0.1 + access = access_research tick_flags = NIF_ACTIVETICK activate() - if(..()) + if((. = ..())) nif.deactivate_these(NIF_MESONS,NIF_THERMALS,NIF_NIGHTVIS) nif.set_flag(NIF_V_MATERIAL,NIF_FLAGS_VISION) deactivate() - if(..()) + if((. = ..())) nif.clear_flag(NIF_V_MATERIAL,NIF_FLAGS_VISION) life() - if(..()) + if((. = ..())) nif.human.sight |= SEE_OBJS /datum/nifsoft/thermals @@ -206,21 +202,21 @@ desc = "Similar to the worn Thermal Goggles, these allow you to see heat-emitting creatures through walls." list_pos = NIF_THERMALS cost = 1000 - req_one_access = list(access_security) a_drain = 0.1 + access = access_captain tick_flags = NIF_ACTIVETICK activate() - if(..()) + if((. = ..())) nif.deactivate_these(NIF_MESONS,NIF_MATERIAL,NIF_NIGHTVIS) nif.set_flag(NIF_V_THERMALS,NIF_FLAGS_VISION) deactivate() - if(..()) + if((. = ..())) nif.clear_flag(NIF_V_THERMALS,NIF_FLAGS_VISION) life() - if(..()) + if((. = ..())) var/mob/living/carbon/human/H = nif.human H.sight |= SEE_MOBS H.client.screen |= global_hud.thermal @@ -231,21 +227,21 @@ desc = "Similar to the worn Night Vision Goggles, these allow you to see in complete darkness." list_pos = NIF_NIGHTVIS cost = 1000 - req_one_access = list(access_security) a_drain = 0.1 + access = access_security tick_flags = NIF_ACTIVETICK activate() - if(..()) + if((. = ..())) nif.deactivate_these(NIF_MESONS,NIF_MATERIAL,NIF_THERMALS) nif.set_flag(NIF_V_NIGHTVIS,NIF_FLAGS_VISION) deactivate() - if(..()) + if((. = ..())) nif.clear_flag(NIF_V_NIGHTVIS,NIF_FLAGS_VISION) life() - if(..()) + if((. = ..())) var/mob/living/carbon/human/H = nif.human H.see_in_dark += 7 H.client.screen |= global_hud.nvg diff --git a/code/modules/nifsoft/software/05_health.dm b/code/modules/nifsoft/software/05_health.dm index 4bc83c407f..1d606d2653 100644 --- a/code/modules/nifsoft/software/05_health.dm +++ b/code/modules/nifsoft/software/05_health.dm @@ -1,14 +1,41 @@ -/* -#define NIF_SPAREBREATH 17 -*/ +// #define NIF_CREWMONITOR 14 +/datum/nifsoft/crewmonitor + name = "Crew Monitor" + desc = "A link to the local crew monitor sensors. Useful for finding people in trouble." + list_pos = NIF_CREWMONITOR + access = access_medical + cost = 1250 + p_drain = 0.025 + var/datum/nano_module/crew_monitor/arscreen + + New() + ..() + arscreen = new(nif) + + Destroy() + qdel(arscreen) + ..() + + activate() + if((. = ..())) + arscreen.ui_interact(nif.human,"main",null,1,nif_state) + return TRUE + + deactivate() + if((. = ..())) + return TRUE + + stat_text() + return "Show Monitor" /datum/nifsoft/medichines_org - name = "Medichines (Org)" + name = "Medichines" desc = "An internal swarm of nanites to make sure you stay in good shape and to promote healing, or to preserve you if you are critically injured." list_pos = NIF_ORGANIC_HEAL cost = 2500 p_drain = 0.05 a_drain = 0.1 //This is messed with manually below. + wear = 2 activates = FALSE //It is automatic in emergencies, not manually controllable. tick_flags = NIF_ALWAYSTICK applies_to = NIF_ORGANIC @@ -16,19 +43,19 @@ //These self-activate on their own, these aren't user-settable to on/off. activate() - if(..()) + if((. = ..())) nif.set_flag(NIF_H_ORGREPAIR,NIF_FLAGS_HEALTH) mode = 1 deactivate() - if(..()) + if((. = ..())) nif.clear_flag(NIF_H_ORGREPAIR,NIF_FLAGS_HEALTH) a_drain = initial(a_drain) mode = initial(mode) - nif.human.in_stasis = 0 + nif.human.Stasis(0) life() - if(..()) + if((. = ..())) var/mob/living/carbon/human/H = nif.human var/HP_percent = H.health/H.getMaxHealth() @@ -67,21 +94,22 @@ //Patient critical - emergency stasis if(mode >= 3) if(HP_percent <= 0) - H.in_stasis = 3 + H.Stasis(3) if(HP_percent > 0.2) - H.in_stasis = 0 + H.Stasis(0) nif.notify("Ending emergency stasis.",TRUE) mode = 2 return TRUE /datum/nifsoft/medichines_syn - name = "Medichines (Syn)" + name = "Medichines" desc = "A swarm of mechanical repair nanites, able to repair relatively minor damage to synthetic bodies. Large repairs must still be performed manually." list_pos = NIF_SYNTH_HEAL cost = 2500 p_drain = 0.05 a_drain = 0.00 //This is manually drained below. + wear = 2 activates = FALSE //It is automatic in emergencies, not manually controllable. tick_flags = NIF_ALWAYSTICK applies_to = NIF_SYNTHETIC @@ -89,17 +117,17 @@ //These self-activate on their own, these aren't user-settable to on/off. activate() - if(..()) + if((. = ..())) nif.set_flag(NIF_H_SYNTHREPAIR,NIF_FLAGS_HEALTH) mode = 1 deactivate() - if(..()) + if((. = ..())) nif.clear_flag(NIF_H_SYNTHREPAIR,NIF_FLAGS_HEALTH) mode = 0 life() - if(..()) + if((. = ..())) //We're good! if(!nif.human.bad_external_organs.len) if(mode || active) @@ -135,6 +163,7 @@ cost = 650 p_drain = 0.05 a_drain = 0.1 + wear = 2 tick_flags = NIF_ALWAYSTICK applies_to = NIF_ORGANIC var/filled = 100 //Tracks the internal tank 'refilling', which still uses power @@ -143,17 +172,17 @@ if(!(filled > 50)) nif.notify("Respirocytes not saturated!",TRUE) return FALSE - if(..()) + if((. = ..())) nif.set_flag(NIF_H_SPAREBREATH,NIF_FLAGS_HEALTH) nif.notify("Now taking air from reserves.") deactivate() - if(..()) + if((. = ..())) nif.clear_flag(NIF_H_SPAREBREATH,NIF_FLAGS_HEALTH) nif.notify("Now taking air from environment and refilling reserves.") life() - if(..()) + if((. = ..())) if(active) //Supplying air, not recharging it switch(filled) //Text warnings if(75) diff --git a/code/modules/nifsoft/software/10_combat.dm b/code/modules/nifsoft/software/10_combat.dm index 64f3ae9a25..38fe1b86e2 100644 --- a/code/modules/nifsoft/software/10_combat.dm +++ b/code/modules/nifsoft/software/10_combat.dm @@ -1,7 +1,140 @@ /* -#define NIF_BRUTEARMOR 18 -#define NIF_BURNARMOR 19 -#define NIF_PAINKILLERS 20 -#define NIF_HARDCLAWS 21 #define NIF_HIDDENLASER 22 -*/ \ No newline at end of file +*/ + +/datum/nifsoft/brute_armor + name = "Bullhide Mod" + desc = "A difficult-to-produce thickening of the dermis and skeletal structure, allowing a user to absorb more external trauma from physical sources." + list_pos = NIF_BRUTEARMOR + cost = 3200 + p_drain = 0.05 + illegal = TRUE + wear = 3 + access = 999 //Prevents anyone from buying it without an emag. + activates = FALSE //It's armor. + + install() + if((. = ..())) + nif.set_flag(NIF_C_BRUTEARMOR,NIF_FLAGS_COMBAT) + + uninstall() + . = ..() + nif.clear_flag(NIF_C_BRUTEARMOR,NIF_FLAGS_COMBAT) + +/datum/nifsoft/burn_armor + name = "Dragon's Skin" + desc = "A thin layer of material under the skin provides heat disappation for burns, reducing the trauma from lasers and fire. Not effective against ongoing environmental heat." + list_pos = NIF_BURNARMOR + cost = 3200 + p_drain = 0.05 + illegal = TRUE + wear = 3 + access = 999 //Prevents anyone from buying it without an emag. + activates = FALSE //It's armor. + + install() + if((. = ..())) + nif.set_flag(NIF_C_BURNARMOR,NIF_FLAGS_COMBAT) + + uninstall() + . = ..() + nif.clear_flag(NIF_C_BURNARMOR,NIF_FLAGS_COMBAT) + +/datum/nifsoft/painkillers + name = "Nova Shock" + desc = "A constant stream of high-grade painkillers numb the user's body to all pain. Generally results in extreme addiction or overdose." + list_pos = NIF_PAINKILLERS + cost = 2600 + a_drain = 1 //Gotta produce them drugs, yo. + illegal = TRUE + wear = 2 + access = 999 //Prevents anyone from buying it without an emag. + tick_flags = NIF_ACTIVETICK + + activate() + if((. = ..())) + nif.set_flag(NIF_C_PAINKILLERS,NIF_FLAGS_COMBAT) + + deactivate() + if((. = ..())) + nif.clear_flag(NIF_C_PAINKILLERS,NIF_FLAGS_COMBAT) + + life() + if((. = ..())) + var/mob/living/carbon/human/H = nif.human + H.bloodstr.add_reagent("numbenzyme",0.5) + +/datum/nifsoft/hardclaws + name = "Bloodletters" + desc = "Generates monofilament wires from one's fingertips, allowing one to slash through almost any armor with relative ease. The monofilaments need to be replaced constantly, though, which does use power." + list_pos = NIF_HARDCLAWS + cost = 2200 + a_drain = 0.5 + illegal = TRUE + wear = 4 + access = 999 //Prevents anyone from buying it without an emag. + + activate() + if((. = ..())) + nif.set_flag(NIF_C_HARDCLAWS,NIF_FLAGS_COMBAT) + + deactivate() + if((. = ..())) + nif.clear_flag(NIF_C_HARDCLAWS,NIF_FLAGS_COMBAT) + +// The unarmed attack to go with the hardclaws +var/global/datum/unarmed_attack/hardclaws/unarmed_hardclaws = new() +/datum/unarmed_attack/hardclaws + attack_verb = list("claws") + attack_noun = list("talons") + damage = 15 + attack_sound = "punch" + miss_sound = 'sound/weapons/punchmiss.ogg' + sharp = 1 + edge = 1 + sparring_variant_type = /datum/unarmed_attack/hardclaws + +/datum/nifsoft/hidelaser + name = "Dazzle" + desc = "Fabricates a 2-shot holdout laser inside your body, which can be deployed (somewhat painfully) on demand. Only enough materials to generate one." + list_pos = NIF_HIDDENLASER + cost = 2200 + //a_drain = 50 //Done manually below. + illegal = TRUE + wear = 6 + access = 999 //Prevents anyone from buying it without an emag. + var/used = FALSE + + activate() + if((. = ..())) + nif.set_flag(NIF_C_HIDELASER,NIF_FLAGS_COMBAT) + if(used) + nif.notify("You do not have a hidden weapon to deploy anymore!",TRUE) + deactivate() + return FALSE + if(!nif.use_charge(50)) + nif.notify("Insufficient energy to deploy weapon!",TRUE) + deactivate() + return FALSE + + var/mob/living/carbon/human/H = nif.human + H.adjustHalLoss(30) + var/obj/item/weapon/gun/energy/gun/martin/dazzle/dgun = new(get_turf(H)) + H.put_in_hands(dgun) + nif.notify("Weapon deployed!",TRUE) + used = TRUE + spawn(0) + uninstall() + + deactivate() + if((. = ..())) + nif.clear_flag(NIF_C_HIDELASER,NIF_FLAGS_COMBAT) + +//The gun to go with this implant +/obj/item/weapon/gun/energy/gun/martin/dazzle + name = "Microlaser" + desc = "A tiny nanofabricated laser." + + icon = 'icons/obj/gun_vr.dmi' + icon_state = "PDW" + item_state = "gun" diff --git a/code/modules/nifsoft/software/14_commlink.dm b/code/modules/nifsoft/software/14_commlink.dm new file mode 100644 index 0000000000..4380c53952 --- /dev/null +++ b/code/modules/nifsoft/software/14_commlink.dm @@ -0,0 +1,132 @@ +/////////// +// Commlink - Has a bunch of extra stuff due to communicator defines. +/datum/nifsoft/commlink + name = "Commlink" + desc = "An internal communicator for keeping in touch with people." + list_pos = NIF_COMMLINK + cost = 500 + wear = 0 + p_drain = 0.01 + + install() + if((. = ..())) + nif.comm = new(nif,src) + + activate() + if((. = ..())) + nif.set_flag(NIF_O_COMMLINK,NIF_FLAGS_OTHER) + nif.comm.initialize_exonet(nif.human) + nif.comm.ui_interact(nif.human,key_state = commlink_state) + spawn(0) + deactivate() + + deactivate() + if((. = ..())) + nif.clear_flag(NIF_O_COMMLINK,NIF_FLAGS_OTHER) + + stat_text() + return "Show Commlink" + +/datum/nifsoft/commlink/Topic(href, href_list) + if(href_list["open"]) + activate() + +/obj/item/device/communicator/commlink + name = "commlink" + desc = "An internal communicator, basically." + occupation = "\[Commlink\]" + var/obj/item/device/nif/nif + var/datum/nifsoft/commlink/nifsoft + + New(var/newloc,var/soft) + ..() + nif = newloc + nifsoft = soft + register_device(nif.human) + qdel(camera) //Not supported on internal one. + + Destroy() + if(nif) + nif.comm = null + nif = null + ..() + +//So that only the owner's chat is relayed to others. +/obj/item/device/communicator/commlink/hear_talk(mob/living/M, text, verb, datum/language/speaking) + if(M != nif.human) return + for(var/obj/item/device/communicator/comm in communicating) + + var/turf/T = get_turf(comm) + if(!T) return + + var/icon_object = src + + var/list/mobs_to_relay + if(istype(comm,/obj/item/device/communicator/commlink)) + var/obj/item/device/communicator/commlink/CL = comm + mobs_to_relay = list(CL.nif.human) + icon_object = CL.nif.big_icon + else + var/list/in_range = get_mobs_and_objs_in_view_fast(T,world.view,0) + mobs_to_relay = in_range["mobs"] + + for(var/mob/mob in mobs_to_relay) + //Can whoever is hearing us understand? + if(!mob.say_understands(M, speaking)) + if(speaking) + text = speaking.scramble(text) + else + text = stars(text) + var/name_used = M.GetVoice() + var/rendered = null + if(speaking) //Language being used + rendered = "\icon[icon_object] [name_used] [speaking.format_message(text, verb)]" + else + rendered = "\icon[icon_object] [name_used] [verb], \"[text]\"" + mob.show_message(rendered, 2) + +//Not supported by the internal one +/obj/item/device/communicator/commlink/show_message(msg, type, alt, alt_type) + return + +//The silent treatment +/obj/item/device/communicator/commlink/request(var/atom/candidate) + if(candidate in voice_requests) + return + var/who = null + if(isobserver(candidate)) + who = candidate.name + else if(istype(candidate, /obj/item/device/communicator)) + var/obj/item/device/communicator/comm = candidate + who = comm.owner + comm.voice_invites |= src + + if(!who) + return + + voice_requests |= candidate + + if(ringer && nif.human) + nif.notify("New commlink call from [who]. (Open)") + +//Similar reason +/obj/item/device/communicator/commlink/request_im(var/atom/candidate, var/origin_address, var/text) + var/who = null + if(isobserver(candidate)) + var/mob/observer/dead/ghost = candidate + who = ghost + im_list += list(list("address" = origin_address, "to_address" = exonet.address, "im" = text)) + else if(istype(candidate, /obj/item/device/communicator)) + var/obj/item/device/communicator/comm = candidate + who = comm.owner + comm.im_contacts |= src + im_list += list(list("address" = origin_address, "to_address" = exonet.address, "im" = text)) + else return + + im_contacts |= candidate + + if(!who) + return + + if(ringer && nif.human) + nif.notify("Commlink message from [who]: \"[text]\" (Open)") diff --git a/code/modules/nifsoft/software/15_misc.dm b/code/modules/nifsoft/software/15_misc.dm index a20e26c3a6..cc8d6b8b10 100644 --- a/code/modules/nifsoft/software/15_misc.dm +++ b/code/modules/nifsoft/software/15_misc.dm @@ -1,9 +1,182 @@ -/* -#define NIF_COMMLINK 23 -#define NIF_SUITSENSORS 24 -#define NIF_APCCHARGE 25 -#define NIF_PRESSURE 26 -#define NIF_HEATSINK 27 -#define NIF_UVFILTER 28 -#define NIF_FLASHPROT 29 -*/ \ No newline at end of file +/datum/nifsoft/apc_recharge + name = "APC Connector" + desc = "A small attachment that allows synthmorphs to recharge themselves from APCs." + list_pos = NIF_APCCHARGE + cost = 1250 + wear = 2 + applies_to = NIF_SYNTHETIC + tick_flags = NIF_ACTIVETICK + var/obj/machinery/power/apc/apc + + activate() + if((. = ..())) + var/mob/living/carbon/human/H = nif.human + nif.set_flag(NIF_O_APCCHARGE,NIF_FLAGS_OTHER) + apc = locate(/obj/machinery/power/apc) in get_step(H,H.dir) + if(!apc) + apc = locate(/obj/machinery/power/apc) in get_step(H,0) + if(!apc) + nif.notify("You must be facing an APC to connect to.",TRUE) + spawn(0) + deactivate() + return FALSE + + H.visible_message("Thin snakelike tendrils grow from [H] and connect to \the [apc].","Thin snakelike tendrils grow from you and connect to \the [apc].") + + deactivate() + if((. = ..())) + nif.clear_flag(NIF_O_APCCHARGE,NIF_FLAGS_OTHER) + apc = null + + life() + if((. = ..())) + var/mob/living/carbon/human/H = nif.human + if(apc && (get_dist(H,apc) <= 1) && H.nutrition < 450) + H.nutrition = min(H.nutrition+10, 450) + apc.drain_power(7000/450*10) //This is from the large rechargers. No idea what the math is. + return TRUE + else + nif.notify("APC charging has ended.") + H.visible_message("[H]'s snakelike tendrils whip back into their body from \the [apc].","The APC connector tendrils return to your body.") + deactivate() + return FALSE + +/datum/nifsoft/pressure + name = "Pressure Seals" + desc = "Creates pressure seals around important synthetic components to protect them from vacuum. Almost impossible on organics." + list_pos = NIF_PRESSURE + cost = 1750 + a_drain = 0.5 + wear = 3 + applies_to = NIF_SYNTHETIC + + activate() + if((. = ..())) + nif.set_flag(NIF_O_PRESSURESEAL,NIF_FLAGS_OTHER) + + deactivate() + if((. = ..())) + nif.clear_flag(NIF_O_PRESSURESEAL,NIF_FLAGS_OTHER) + +/datum/nifsoft/heatsinks + name = "Heat Sinks" + desc = "Advanced heat sinks for internal heat storage of heat on a synth until able to vent it in atmosphere." + list_pos = NIF_HEATSINK + cost = 1450 + a_drain = 0.25 + wear = 3 + var/used = 0 + tick_flags = NIF_ALWAYSTICK + applies_to = NIF_SYNTHETIC + + activate() + if((. = ..())) + if(used >= 50) + nif.notify("Heat sinks not safe to operate again yet!",TRUE) + spawn(0) + deactivate() + return FALSE + nif.set_flag(NIF_O_HEATSINKS,NIF_FLAGS_OTHER) + + deactivate() + if((. = ..())) + nif.clear_flag(NIF_O_HEATSINKS,NIF_FLAGS_OTHER) + + life() + if((. = ..())) + //Not being used, all clean. + if(!active && !used) + return TRUE + + //Being used, and running out. + else if(active && ++used == 100) + nif.notify("Heat sinks overloaded! Shutting down!",TRUE) + deactivate() + + //Being cleaned, and finishing empty. + else if(!active && --used == 0) + nif.notify("Heat sinks re-chilled.") + +/datum/nifsoft/compliance + name = "Compliance Module" + desc = "A system that allows one to apply 'laws' to sapient life. Extremely illegal, of course." + list_pos = NIF_COMPLIANCE + cost = 8200 + wear = 4 + illegal = TRUE + vended = FALSE + access = 999 //Prevents anyone from buying it without an emag. + var/laws = "Be nice to people!" + + New(var/newloc,var/newlaws) + laws = newlaws //Sanitize before this (the disk does) + ..(newloc) + + activate() + if((. = ..())) + to_chat(nif.human,"You are compelled to follow these rules: \n[laws]") + + install() + if((. = ..())) + to_chat(nif.human,"You feel suddenly compelled to follow these rules: \n[laws]") + + uninstall() + nif.notify("ERROR! Unable to comply!",TRUE) + return FALSE //NOPE. + + stat_text() + return "Show Laws" + +/datum/nifsoft/sizechange + name = "Mass Alteration" + desc = "A system that allows one to change their size, through drastic mass rearrangement. Causes significant wear when installed." + list_pos = NIF_SIZECHANGE + cost = 750 + wear = 6 + + activate() + if((. = ..())) + var/choice = alert(nif.human,"Change which way?","Mass Alteration","Size Up","Cancel", "Size Down") + if(choice == "Cancel") + spawn(0) deactivate() + return FALSE + + if(!nif.use_charge(100)) + nif.notify("Insufficient energy to resize!",TRUE) + spawn(0) deactivate() + return FALSE + + if(choice == "Size Up") + switch(nif.human.size_multiplier) + if(RESIZE_BIG to RESIZE_HUGE) + nif.human.resize(RESIZE_HUGE) + if(RESIZE_NORMAL to RESIZE_BIG) + nif.human.resize(RESIZE_BIG) + if(RESIZE_SMALL to RESIZE_NORMAL) + nif.human.resize(RESIZE_NORMAL) + if((0 - INFINITY) to RESIZE_TINY) + nif.human.resize(RESIZE_SMALL) + + else if(choice == "Size Down") + switch(nif.human.size_multiplier) + if(RESIZE_HUGE to INFINITY) + nif.human.resize(RESIZE_BIG) + if(RESIZE_BIG to RESIZE_HUGE) + nif.human.resize(RESIZE_NORMAL) + if(RESIZE_NORMAL to RESIZE_BIG) + nif.human.resize(RESIZE_SMALL) + if((0 - INFINITY) to RESIZE_NORMAL) + nif.human.resize(RESIZE_TINY) + + nif.human.visible_message("Swirling grey mist envelops [nif.human] as they change size!","Swirling streams of nanites wrap around you as you change size!") + nif.human.update_icons() + + spawn(0) + deactivate() + + deactivate() + if((. = ..())) + return TRUE + + stat_text() + return "Change Size" \ No newline at end of file diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 63a1d2ff50..478ebc4d38 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -98,6 +98,8 @@ while(null in owner.organs) owner.organs -= null + implants.Cut() //VOREStation Add - Remove these too! + return ..() /obj/item/organ/external/emp_act(severity) diff --git a/code/modules/research/designs_vr.dm b/code/modules/research/designs_vr.dm index 07285cf921..64ed9b5d30 100644 --- a/code/modules/research/designs_vr.dm +++ b/code/modules/research/designs_vr.dm @@ -77,6 +77,14 @@ build_path = /obj/item/device/universal_translator/ear sort_string = "HABBB" +/datum/design/item/nif + name = "nanite implant framework" + id = "nif" + req_tech = list(TECH_MAGNET = 5, TECH_BLUESPACE = 5, TECH_MATERIAL = 5, TECH_ENGINEERING = 5, TECH_DATA = 5) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 8000, "uranium" = 6000, "diamond" = 6000) + build_path = /obj/item/device/nif + sort_string = "HABBC" + // Resleeving Circuitboards /datum/design/circuit/transhuman_clonepod diff --git a/code/modules/resleeving/implant.dm b/code/modules/resleeving/implant.dm index d5e2dfac6a..e6dd47b705 100644 --- a/code/modules/resleeving/implant.dm +++ b/code/modules/resleeving/implant.dm @@ -49,7 +49,8 @@ BITSET(H.hud_updateflag, BACKUP_HUD) //Okay we've got a mind at least if(H == imp_in && H.mind && H.stat < DEAD) - transcore.m_backup(H.mind) + transcore.m_backup(H.mind,H.nif) + persist_nif_data(H) spawn(attempt_delay) backup() diff --git a/code/modules/resleeving/infocore.dm b/code/modules/resleeving/infocore.dm index e03e3291a9..dc0b06d8bd 100644 --- a/code/modules/resleeving/infocore.dm +++ b/code/modules/resleeving/infocore.dm @@ -40,7 +40,7 @@ var/datum/transhuman/infocore/transcore = new/datum/transhuman/infocore spawn(process_time) process() -/datum/transhuman/infocore/proc/m_backup(var/datum/mind/mind) +/datum/transhuman/infocore/proc/m_backup(var/datum/mind/mind,var/obj/item/device/nif/nif) ASSERT(mind) if(!mind.name || core_dumped) return 0 @@ -50,6 +50,20 @@ var/datum/transhuman/infocore/transcore = new/datum/transhuman/infocore if(mind.name in backed_up) MR = backed_up[mind.name] MR.last_update = world.time + if(nif) + MR.nif_path = nif.type + MR.nif_durability = nif.durability + var/list/nifsofts = list() + for(var/N in nif.nifsofts) + if(N) + var/datum/nifsoft/nifsoft = N + nifsofts += nifsoft.type + MR.nif_software = nifsofts + else + MR.nif_path = null + MR.nif_durability = null + MR.nif_software = null + else MR = new(mind, mind.current, 1) @@ -114,6 +128,10 @@ var/datum/transhuman/infocore/transcore = new/datum/transhuman/infocore var/languages var/mind_oocnotes + var/nif_path + var/nif_durability + var/list/nif_software + /datum/transhuman/mind_record/New(var/datum/mind/mind,var/mob/living/carbon/human/M,var/obj/item/weapon/implant/backup/imp,var/add_to_db = 1) ASSERT(mind && M && imp) diff --git a/code/modules/resleeving/machines.dm b/code/modules/resleeving/machines.dm index abab41e929..4216f6fb0a 100644 --- a/code/modules/resleeving/machines.dm +++ b/code/modules/resleeving/machines.dm @@ -504,6 +504,12 @@ occupant.ooc_notes = MR.mind_oocnotes occupant.apply_vore_prefs() //Cheap hack for now to give them SOME bellies. + //Re-supply a NIF if one was backed up with them. + if(MR.nif_path) + var/obj/item/device/nif/nif = new MR.nif_path(occupant,MR.nif_durability) + for(var/path in MR.nif_software) + new path(nif) + // If it was a custom sleeve (not owned by anyone), update namification sequences if(!occupant.original_player) occupant.real_name = occupant.mind.name diff --git a/code/modules/vore/persist/persist_vr.dm b/code/modules/vore/persist/persist_vr.dm index 977473812a..bddd9bc7b9 100644 --- a/code/modules/vore/persist/persist_vr.dm +++ b/code/modules/vore/persist/persist_vr.dm @@ -78,6 +78,10 @@ WARNING("persist_interround_data failed to prep [occupant] for persisting") return + //This one doesn't rely on persistence prefs + if(ishuman(occupant) && occupant.stat != DEAD) + persist_nif_data(occupant, prefs) + if(!prefs.persistence_settings) return // Persistence disabled by preference settings @@ -94,6 +98,7 @@ if(prefs.persistence_settings & PERSIST_WEIGHT) resolve_excess_nutrition(H) prefs.weight_vr = H.weight + prefs.save_character() // Saves mob's current coloration state to prefs @@ -212,7 +217,30 @@ * towards future shenanigans such as upgradable NIFs or different types or things of that nature, * without invoking the need for a bunch of different save file variables. */ -/proc/persist_nif_data(var/mob/living/carbon/human/H) +/proc/persist_nif_data(var/mob/living/carbon/human/H,var/datum/preferences/prefs) if(!istype(H)) CRASH("persist_nif_data given a nonhuman: [H]") + if(!prefs) + prefs = prep_for_persist(H) + + if(!prefs) + WARNING("persist_nif_data failed to prep [H] for persisting") + return + + var/obj/item/device/nif/nif = H.nif + + if(nif) + prefs.nif_path = nif.type + prefs.nif_durability = nif.durability + else + prefs.nif_path = null + prefs.nif_durability = null + + var/datum/category_group/player_setup_category/vore_cat = prefs.player_setup.categories_by_name["VORE"] + var/datum/category_item/player_setup_item/vore/nif/nif_prefs = vore_cat.items_by_name["NIF Data"] + + var/savefile/S = new /savefile(prefs.path) + if(!S) WARNING ("Couldn't load NIF save savefile? [prefs.real_name]") + S.cd = "/character[prefs.default_slot]" + nif_prefs.save_character(S) diff --git a/icons/obj/vending_vr.dmi b/icons/obj/vending_vr.dmi index b6c7cbb8e6c6294aa6a2d7c84a3cb0f334d672d9..e7f1f48d3235d93a22fbe92a9fb9ac67b7b31279 100644 GIT binary patch delta 8490 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 diff --git a/maps/tether/tether-01-surface.dmm b/maps/tether/tether-01-surface.dmm index a9046f15e7..564f67fe31 100644 --- a/maps/tether/tether-01-surface.dmm +++ b/maps/tether/tether-01-surface.dmm @@ -1152,7 +1152,7 @@ "awh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_one) "awi" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/junction{dir = 1; icon_state = "pipe-j2"},/obj/effect/floor_decal/industrial/danger{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_one) "awj" = (/obj/machinery/status_display{pixel_y = 30},/obj/machinery/vending/fitness,/obj/effect/floor_decal/corner/lightgrey{dir = 9},/obj/effect/floor_decal/corner/lightgrey{dir = 6},/turf/simulated/floor/tiled/monotile,/area/crew_quarters/locker/laundry_arrival) -"awk" = (/obj/machinery/vending/cola,/obj/effect/floor_decal/corner/lightgrey{dir = 9},/obj/effect/floor_decal/corner/lightgrey{dir = 6},/turf/simulated/floor/tiled/monotile,/area/crew_quarters/locker/laundry_arrival) +"awk" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7,/obj/machinery/vending/nifsoft_shop,/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_three) "awl" = (/obj/machinery/vending/snack,/obj/effect/floor_decal/corner/lightgrey{dir = 9},/obj/effect/floor_decal/corner/lightgrey{dir = 6},/turf/simulated/floor/tiled/monotile,/area/crew_quarters/locker/laundry_arrival) "awm" = (/obj/machinery/camera/network/civilian,/obj/machinery/vending/coffee,/obj/effect/floor_decal/corner/lightgrey{dir = 9},/obj/effect/floor_decal/corner/lightgrey{dir = 6},/turf/simulated/floor/tiled/monotile,/area/crew_quarters/locker/laundry_arrival) "awn" = (/obj/effect/floor_decal/borderfloor{dir = 9},/obj/effect/floor_decal/corner/lightgrey/border{dir = 9},/turf/simulated/floor/tiled,/area/crew_quarters/locker/laundry_arrival) @@ -4237,7 +4237,7 @@ "bDy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 9},/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_three) "bDz" = (/obj/structure/cable{icon_state = "1-2"},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/effect/floor_decal/borderfloor/corner2{dir = 4},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7,/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_three) "bDA" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/firealarm{dir = 2; layer = 3.3; pixel_x = 0; pixel_y = 26},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7,/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_three) -"bDB" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7,/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_three) +"bDB" = (/obj/effect/floor_decal/corner/lightgrey{dir = 9},/obj/effect/floor_decal/corner/lightgrey{dir = 6},/obj/machinery/vending/nifsoft_shop,/turf/simulated/floor/tiled/monotile,/area/crew_quarters/locker/laundry_arrival) "bDC" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/effect/floor_decal/borderfloor{dir = 5},/obj/effect/floor_decal/corner/lightgrey/border{dir = 5},/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_three) "bDD" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/dark,/area/tcomsat{name = "\improper Telecomms Lobby"}) "bDE" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/porta_turret{dir = 6},/turf/simulated/floor/tiled/dark,/area/tcomsat{name = "\improper Telecomms Lobby"}) @@ -5455,7 +5455,7 @@ aaaaadaadaadaadaadaadaadaadaadaagaagamGasrassastasuasuasuasuasuasuasvaswasxasyas aaaaadaadaadaadaadaadaadaadaadaagamGamGamGamGatcaoZaoZatdateatfatgathaoZatiatjatkatlatmatnatoatparpatqatratratratratsasLattatuatvatwatxatxatxatyasLatzatAasOatBatCatCatCatCatCatCagIagIagIaagaagaagaagaagaagaagagIatDatEatFatGatGatGatGatGatHatGatGatGatGatGatGatIatJanRatKaoTaoTatLatMatNatOaoTaoWaslanRaagapCapCapCapCatPataaqWaqnaqoarCarBarCarCarCarCarBarCaqrapCaaa aaaaadaadaadaadaadaadaadaadaagaagamGatQatRatSatTaoZaquaotatQamGatUatVatWamGatXatYarparparparparparpatZauaauaauaauaauaasLaubaucaudaueaufaufaufaugasLbeQauibeSaukatCaulaulaulaulatCaumaunagIagIagIagIauoagIagIagIagIaupakuauqaurausautautauuauvauwauxautautautauyajPajQanRauzauzauAauBauCauDauEauFauGauHanRaagapCauIauIapCauJataaqWaqnaqoarCarBarCarCarCarCarBarCaqrapCaaa aaaaadaadaadaadaadaadaadaadaagaagamGauKaoZaoZatTaoZauLaotauMamGatUauNauOamGauPauQbfxarXarXarXarXauSauTauaauUauVauWauXauYauZavaavbavcavdavdavdaveasLaZkavgasOavhatCaulaulaulaulaulaviavjavkavlavmavnavnavoavpavqavravsavtavuagIagIavvavvavvavvavvavvavwavvavvavxajPajQanRanRanRanRavyavzanRanRanRanRanRavAagIapCavBavBapCavCavDaqWaqnaqoarCarBarCarCarCarCarBarCaqYapCaaa -aaaaadaadaadaadaadaadaadaadaadaagamGavEavFavGavHbhtavJaotatQamGavKavLavMamGavNavOauaauaauaauaauaauaauaauaavPavQavRavSavTavUavVavWavXavYavYavZawaasLawbavgasOavhatCaulaulaulaulaulaviaviaviawcaviaviawdaviaweatGawfawgawhawiamgagXavvawjawkawlawmawnawoawpavvawqawrawsawtawuawvawwawxawyawzawAawBawCawDawEawuawFawGawGawHawIawJaqWaqnaqoarCarBarCarCarCarCarBarCaqrapCaaa +aaaaadaadaadaadaadaadaadaadaadaagamGavEavFavGavHbhtavJaotatQamGavKavLavMamGavNavOauaauaauaauaauaauaauaauaavPavQavRavSavTavUavVavWavXavYavYavZawaasLawbavgasOavhatCaulaulaulaulaulaviaviaviawcaviaviawdaviaweatGawfawgawhawiamgagXavvawjbDBawlawmawnawoawpavvawqawrawsawtawuawvawwawxawyawzawAawBawCawDawEawuawFawGawGawHawIawJaqWaqnaqoarCarBarCarCarCarCarBarCaqrapCaaa aaaaadaadaadaadaadaadaadaadaadaagawKawKawKawKawKawKawKawKawKawKawKawKawKawKawLavOauaawMawNawOawPawQawRawSawTawUawVawWauYawXawYawZaxaaxbaxcaxdaxeblMaxgblPasOavhatCaxiaulaulaulatCaxjaxkaxlaxmaxnaxoaxpaxqaxraxsaxtaxuaxvaxwagIagIavvaxxaxyaxzaxzaxAbZmaxCaxDaxEasRawgaxFatGatGaxGatGaxHaxIatGatGawgatGatGaxJaxKaxLaxMaxNaxKaxOaqWaqnaqoarCarBarCarCarCarCarBarCaqratbaaa aaaaadaadaadaadaadaadaadaadaadaagarpaxPaxQaxRaxRaxSaxRaxTaxUaxRaxRaxUaxRbphaxWavOauaaxXaxYaxZayaaybayaayaayaayaaycaydauYayeayfaygayhayiayjaykaylasLakYaymasObpiatCatCatCatCatCatCayoaypagIagIagIagIagIagIayqagIagIagIagIagIagIaagavvayraysaytayuayvaywayxayyayzayAayBayCayDayEayFayDayGayHayHayIayJayKayHayHayLayMayNayOayPayQaqWaqnaqoarCarBarCarCarCarCarBarCaqrapCaaa aaaaadaadaadaadaadaadaadaadaadaagarpayRaySayTayTayTayTayTayTayTayTayTayTayTayUayVauaayWawUayXayYayZayZayZazaazbazcazdasLasLasLauYauYazeasLasLasLasLaagazfasOasOasPasPasPasPasPasPagIagIagIaagaagaagaagazgazhazgaagaagaagaagaagaagavvaziazjazkazkavvazlazmavvagIagIaznagIagIagIagIagIazoagIagIagIagIagIauoagIapCazpazpapCavCazqaqWaqnaqoarCarBarCarCarCarCarBarCaqYapCaaa @@ -5687,7 +5687,7 @@ boYboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabp boYboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabqfbzhbCibAWbBFbBGbBGbBHbBHbBHbBHbBHbBIbBJbAFbAGbCjbznbCkbClbClbCmbCnbAHbCobznbpabpabpabpabzrbBnbCpbzrbCqbCqbzrbCrbBqbzwbAhbAibAibAibAibAibAibAibAibAibAibAibAibAibAibAibAjbvEbCsbCtbCubCubCubCvbCubCwbCxbCwbCwbCwbCwbCybCybCybCybpabpaboZboZboZboZboZboZboZboZboZboZboZboZboY boYboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabzhbCzbAWbBFbBGbBGbCAbzObCBbBHbBHbBIbBJbAFbAGbCCbznbCDbCEbCFbCGbCHbAHbCIbznbpabpabpabpabzrbCJbCKbzrbCqbCqbzrbCLbBqbzwbAhbAibAibAibAibAibAibAibAibAibAibAibAibAibAibAibAjbvEbBUbCMbCNaMZaNybCQbCRbCSbCTbCUbCVbCWbCSbCXbCYbCZbDabpabpabpabpaboZboZboZboZboZboZboZboZboZboZboY boYboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabzGbAVbAWbBFbBGbBGbDbbDcbDdbBHbBHbBIbBJbAFbAGbCjbznbznbznbznbDebDfbzobznbznbwObwOaHnaHnbzrbzrbzrbzrbzrbzrbzrbDgbDhbzwbIIbAibAibAibAibAibAibAibAibAibAibAibAibAibAibAibAjbvEbDibDjbDkbDlbDmbDnbDobCSbDpbCTbCTbDqbCSbDrbDsbDtbDabpabpabpabpaboZboZboZboZboZboZboZboZboZboZboY -boYboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabzGbDubDvbBFbBGbBGbBGbBGbBGbBHbBHbBIbBJbAFbAGbAGbzibDwbwVbDxbDybDzbxbbxobDAbDBbDCaHnbmbbdqbaMaHobwsaPTaPFbwsbDIbBqaQRaQQbAhbAibAibAibAibAibAibAibAibAibAibAibAibAibAibAjbvEbBUbDJbwsbwsbDKbDLbDMbCSbDNbCTbCTbDObCSbDsbDsbDPbDabpabpabpabpaboZboZboZboZboZboZboZboZboZboZboY +boYboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabzGbDubDvbBFbBGbBGbBGbBGbBGbBHbBHbBIbBJbAFbAGbAGbzibDwbwVbDxbDybDzbxbbxobDAawkbDCaHnbmbbdqbaMaHobwsaPTaPFbwsbDIbBqaQRaQQbAhbAibAibAibAibAibAibAibAibAibAibAibAibAibAibAjbvEbBUbDJbwsbwsbDKbDLbDMbCSbDNbCTbCTbDObCSbDsbDsbDPbDabpabpabpabpaboZboZboZboZboZboZboZboZboZboZboY boYboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabzGbAVbDQbBFbBGbBGbBGbBGbBGbBHbBHbBIbDRbDSbDTbDUbDVbDWbyobyobDXbDYbyxbyxbDZbygbEaaHnbmmbmlbmlbmjbwsbEebEfbEgbEhbEiaRsaRrbAhbAibAibAibAibAibAibAibAibAibAibAibAibAibAibAjbEkbElbEmbEnbEobEpbEqaRGbCSbEsbEtbEubEvbCSbEwbExbDsbDabpabpabpabpaboZboZboZboZboZboZboZboZboZboZboY boYboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabzhbEybDQbEzbEAbEAbEAbEAbEAbEBbEBbECbEDbEEbEFbEGbEHbEIbEJbEJbEJbEKbELbEMbENbEObEPbmtbmwbmvbmvbmubwsaRZbDHbwsbEVbzvaSdaSabAhbAibAibAibAibAibAibAibAibAibAibAibAibAibAibAjbEXbBUbEYbEZbwsaSCbCQaSBbCSbFcbFdbFebFfbCSbFgbFhbFibDabpabpabpabpaboZboZboZboZboZboZboZboZboZboZboY boYboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabzhbFjbFkbFlbFlbFlbFlbFlbFlbFlbFlbFlbFmbFnbFobFpbzhbwsbzZbzZbzZbwsbwsbvEbyVbFqbFraHnbmbbmybmxaHobwsbwsbwsbwsbFubzvaTeaTabAhbAibAibAibAibAibAibAibAibAibAibAibAibAibAibAjbEXbBUbFvbDkbDkbDkaTybDkbCSbCSbFxbFybCSbCSbFzbFAbFzbFBbpabpabpabpaboZboZboZboZboZboZboZboZboZboZboY diff --git a/maps/tether/tether-03-station.dmm b/maps/tether/tether-03-station.dmm index 221a24b85b..3c0a2abc28 100644 --- a/maps/tether/tether-03-station.dmm +++ b/maps/tether/tether-03-station.dmm @@ -2680,7 +2680,7 @@ "aZB" = (/obj/machinery/door/firedoor/glass,/obj/structure/disposalpipe/segment,/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "englockdown"; name = "Engineering Lockdown"; opacity = 0},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Mezzenine"; req_one_access = list()},/turf/simulated/floor/tiled/steel_grid,/area/engineering/foyer_mezzenine) "aZC" = (/obj/machinery/door/airlock/maintenance/engi,/obj/structure/cable{icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor/glass,/turf/simulated/floor/plating,/area/hallway/station/port) "aZD" = (/obj/machinery/vending/snack,/obj/effect/floor_decal/corner/lightgrey{dir = 9},/obj/effect/floor_decal/corner/lightgrey{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals9,/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 8},/turf/simulated/floor/tiled,/area/hallway/station/port) -"aZE" = (/obj/machinery/vending/cola,/obj/effect/floor_decal/corner/lightgrey{dir = 9},/obj/effect/floor_decal/corner/lightgrey{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals9,/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 8},/turf/simulated/floor/tiled,/area/hallway/station/starboard) +"aZE" = (/obj/effect/floor_decal/corner/lightgrey{dir = 9},/obj/effect/floor_decal/corner/lightgrey{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals9,/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 8},/obj/machinery/vending/nifsoft_shop,/turf/simulated/floor/tiled,/area/hallway/station/starboard) "aZF" = (/obj/machinery/vending/coffee,/obj/effect/floor_decal/corner/lightgrey{dir = 9},/obj/effect/floor_decal/corner/lightgrey{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals9,/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 8},/turf/simulated/floor/tiled,/area/hallway/station/starboard) "aZG" = (/turf/simulated/wall/r_wall,/area/hallway/station/starboard) "aZH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 5},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/turf/simulated/floor/tiled,/area/hallway/station/starboard) diff --git a/maps/tether/tether-06-colony.dmm b/maps/tether/tether-06-colony.dmm index 9c04bd82cf..45192898b2 100644 --- a/maps/tether/tether-06-colony.dmm +++ b/maps/tether/tether-06-colony.dmm @@ -1363,6 +1363,8 @@ "Ak" = (/obj/structure/table/reinforced,/obj/item/device/camera,/obj/item/weapon/storage/box/ids,/obj/effect/floor_decal/borderfloorblack{dir = 8},/obj/effect/floor_decal/corner/blue/border{dir = 8},/obj/effect/floor_decal/borderfloorblack/corner2{dir = 10},/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 10},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Residential Security"}) "Al" = (/obj/structure/table/reinforced,/obj/machinery/computer/skills,/obj/effect/floor_decal/borderfloorblack{dir = 4},/obj/effect/floor_decal/corner/blue/border{dir = 4},/obj/effect/floor_decal/borderfloorblack/corner2{dir = 5},/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 5},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Residential Security"}) "Am" = (/obj/effect/floor_decal/borderfloorblack,/obj/effect/floor_decal/corner/blue/border,/obj/effect/floor_decal/borderfloorblack/corner2{dir = 9},/obj/effect/floor_decal/borderfloorblack/corner2,/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 9},/obj/effect/floor_decal/corner/blue/bordercorner2,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Residential Security"}) +"An" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/blue/border,/obj/machinery/vending/nifsoft_shop,/turf/unsimulated/floor/steel,/area/centcom/security) +"Ao" = (/obj/machinery/vending/nifsoft_shop,/turf/unsimulated/floor/steel{icon = 'icons/turf/floors_vr.dmi'; icon_state = "wood"},/area/centcom/restaurant) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -1441,7 +1443,7 @@ aaababababababababababababababababababababababababababjMkikhkhkikjkkjMababababab aaababababababababababababababababababababababababababjMlLkhkhkikjkkjMababababababacgGgGgGgGgGgGgGnHnInJnKnLhrhrnMnNnOkHnPnQnRlUlUnSnTlUnSnTlUlUnUnVnWkHltlololololonXnYnZlololololooakHahahahejobocodoeofogmdmdejkJhlhlhlhlnEohnFohnFnFoinGkKeS aaabababababababababababababababojokokokokokokokokokokolomononomomomomababababababacacacacacacacgGgGgGgGhthtoohrgGgGgGkHkHkHkHopoqkHkHorkHkHosoqkHkHkHotototototototototototototototototahahahouejejejejejovjKjKejkJhlkFkDkEhlowowowowowowhlkKeS aaabababababababababababababababomoxoyozoyoyoyoyozoyoAoBoCoCoCoDoEabababababababababacacacacacacgGoFoGoHoGoIhrhroJoGoKkHoLoMoNlUlUoOoPlUoQoRlUlUoSoToLotoUoVoWoXotoYoZpaoZoYotpbpbpbpbotahahahpclGkekelHkekdhlhlkclFhlkKejkJhlhlhlhlhlhlhlhlkKeS -aaabababababababababababababababomoxoyfyeWeWeWeWfyoyoAoBoCoCoCpfoEabababababababababacacacacacacgGpglPhrlPphhrhrhrhrpikHpjlUlUlUlUpklTnwlXpllUlUlUlUpmotoUpnoWoXotpopopopopootppppppppotahahahpckFkChlkBkDkDkChlkBkChlpqejprkDkDkDkEkFkDpsptpueS +aaabababababababababababababababomoxoyfyeWeWeWeWfyoyoAoBoCoCoCpfoEabababababababababacacacacacacgGpglPhrlPphhrhrhrhrpikHpjlUlUlUlUpklTnwlXpllUlUlUlUpmotoUpnoWoXotpopopopopootppppppppotahahahpckFkChlkBkDkDkChlkBkChlpqejprAnkDkDkEkFkDpsptpueS aaabababababababababababababababomoxfyfTfRhchcipfTfyoAoBoCoCoCpzoEabababababababababacacacacacacgGpAmkpBpCmkhrhrhrhrpDkHpjlUlUlUlUpEpFpFpFpGlUlUlUlUpHotoUpnoWpnpIpopopopopopJpopopopKotahahahouejejpcejejejejpLejejpcejejpMpNpNpNlFlGpNpNpNpOeS aaabababababababababababababababompPeWpdkMhchckMpeeWoAoBoCoCoCpzoEabababababababababacacacacacacgGmKhrhrhrhrhrhrhrhrpTkHpjlUlUlUlUlUlUlUlUlUlUlUlUlUpmotoUpnpnpnpIpopopopopopJpopopopKotbHahahjJpUpVhlpWpXjJsfhlpvpwhlqbejqcqdqdqdhlhlqdqdqdqeeS aaabababababababababababababababomoxeWpxpxhchcpxpxeWoAoBoCoCoCpzoEabababababababababababacacacacgGmKhrhrhrhrhrhrhrhrqgkHpjlUlUlUlUlUlUlUlUlUlUlUlUlUpmotoUpnpnqhotpoqipoqipootqjqjqjqjotahahahjJqknGhlhlqlqmqnhlhlqoqpqqejqrqsqsqsqsqsqsqsqsqteS @@ -1452,7 +1454,7 @@ aaabababababababababababababababomoxqfpxpxhchcpxpxqfoAoBoCoCahrKahahahahahahahah aaabababababababababababababababomoxqfipiphchcipipqfoAoBoCoCrTrKahahahahahahahahahahahahahahahahahrpahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahjDahahahjDahahahahahrLahrMrMrMrMahrNrzrzrzrzrOrUrQrRrRrSrI aaabababababababababababababababomoxeWqvkMhchckMqweWoAoBoCoCadriahahahahahahahahahrMrMrMrMrMrMahahqUahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahjDahahahjDahahahahahrXrYrYrYrYrYrYrZrzrzrzrzrCrDsasbsbscrI aaabababababababababababababababomoxfyqVpxhchcpxrgfyoAoBoCoCqWqXqXqXqXqXqXqXqXqXqXqXqXqXrhrVrJrJrVrhqXqXqXqXshjDqXqXshjDqXqXqXqXsisjsksjsisislslsisislslsijDjDjDotototsmototototslslslsijDjDjDejejejejejejousnsnsnsnsnsnouejejejejejejejejejejeS -aaabababababababababababababababquoxpyhchchchchchcpQoAoBoCoCoCoDoEabababababababababababrhsdrWsesdrhsrsrsraiahahssstahahaisrsrsrsisisisisisusvswsxswsyszsisAahahotsBsCsDsDsEsFotsGsHsIslahahahejsJsKsKsKsLejhlpYhlhlpYhlejsMsNsOsPsQejsRsSsTsUeS +aaabababababababababababababababquoxpyhchchchchchcpQoAoBoCoCoCoDoEabababababababababababrhsdrWsesdrhsrsrsraiahahssstahahaisrsrsrsisisisisisusvAosxswsyszsisAahahotsBsCsDsDsEsFotsGsHsIslahahahejsJsKsKsKsLejhlpYhlhlpYhlejsMsNsOsPsQejsRsSsTsUeS aaabababababababababababababababomoxsopxhcipiphcspsooAoBoCoCoCpzoEabababababababababababrhsVsqsXsWrhahtbtctctctctctctctctctctdahsiszsytetfswswswswswswswsiahahahottgsDsDthototottitjtkslahahahejtltmtmtmtnejejovtotoovejejtpfcfcfcfctqfcfcfctreS aaabababababababababababababababompPsosYhcipiphcsZsooAoBoCoCoCpzoEabababababababababababrhtstatattrhahtwtxtxtxtytxtxtytxtxtxtzahsiswswtAtAswswswtAtAswswsiahahahottgsDsDsDtBsFottCtDtEslahahahejtFfcfcfcfctGtHtIfcfctJtKtLfcfcfcfctMejtNfcfctreS aaabababababababababababababababomoxfyfTtupxtvhcfTfyoAoBoCoCoCpzoEabababababababababababrhtPtOuHtQrhtTtwtxtUtVtVtVtVtVtVtUtxtztWslswtXtYtZuaswtXubucuaswslahahahotudsDsDthotototuetDtEsiahahahejufugfcuhuiujukulfcfculumunuoupfcuqurejusututuueS diff --git a/maps/tether/tether-07-misc.dmm b/maps/tether/tether-07-misc.dmm index 9f4b9f4d35..c1189bb371 100644 --- a/maps/tether/tether-07-misc.dmm +++ b/maps/tether/tether-07-misc.dmm @@ -930,7 +930,7 @@ "rT" = (/obj/structure/table/rack,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/effect/floor_decal/borderfloorblack,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) "rU" = (/obj/structure/table/rack,/obj/item/weapon/pinpointer/nukeop,/obj/item/weapon/pinpointer/nukeop,/obj/item/weapon/pinpointer/nukeop,/obj/item/weapon/pinpointer/nukeop,/obj/item/weapon/pinpointer/nukeop,/obj/item/weapon/pinpointer/nukeop,/obj/effect/floor_decal/borderfloorblack,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) "rV" = (/obj/structure/table/rack,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/effect/floor_decal/borderfloorblack{dir = 6},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) -"rW" = (/obj/effect/floor_decal/borderfloorblack{dir = 8},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) +"rW" = (/obj/effect/floor_decal/borderfloorblack{dir = 8},/obj/machinery/vending/nifsoft_shop{categories = 111; emagged = 1; name = "Hacked NIFSoft Shop"; prices = list()},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) "rX" = (/obj/machinery/telecomms/allinone{intercept = 1},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) "rY" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "antag_ground_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/shuttle/antag_ground/base) "rZ" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "antag_space_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/shuttle/antag_space/base) diff --git a/sound/items/nif_click.ogg b/sound/items/nif_click.ogg new file mode 100644 index 0000000000000000000000000000000000000000..4bb8db9f30f9ac5c90086780b30d30e3f6400b00 GIT binary patch literal 7990 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 literal 0 HcmV?d00001 diff --git a/sound/items/nif_tone_bad.ogg b/sound/items/nif_tone_bad.ogg new file mode 100644 index 0000000000000000000000000000000000000000..d2c237acf3f35e4f70c759e2795d1a3ba926d9d2 GIT binary patch literal 11552 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 z zo1<7l%RG@#-YPxF;#{7k6zvEobA6JDqIUZ#zivvo5|g~OsRz=dpQvrk93%BI^Es+6 zl**tZmJ?{Iv3mcJU5YjBmd%~U^!|g7OE;O+L|<(~TA4Jv|L!9}LvKl2HF>r5Vk$(E zi=MG30ttYICjl@a_<#%0fSM68lsXJJ9&D$5$m9YUAGV5?rS3e~8^6ONe)59=U>%L9 z24FKIemzBRRe0QVHAD$#(x+ryTuS)5^M+WD>YB%tDun8sxNqdyPAqFmD{At}5|iFf zu(<3^h<3-%m2(M^*54YQF>Btu7V2rLP)we5F;4wlvMXrdvcDm;=1#|sY`X4!7D~S# zdWMV*pT3}@vL4W$*;eTqz173JH0@_$96IW2K*uYziHC<9jujwagrU-Y5!uYYB1cTz zX2kUY5QTzicLPYj07eRL=O0J4yf;5j%jzG9Yb4#B(a9T8sl;Sy_<8I2g&AT$GxPb; z#4+^jx?r#b7iZaW5jRfX)TPLaVZdjPa9~wwB8rm)LH3BikRI~j)Kg`$f;`n{*Grju+aYIX)Vp$yC*9&neN_Uih29Qxu z!^U~0v6NoO+76n%`g;E>`2FF)YY^kK>#acc(EukgMr**Ge+g0cMMf;RaRe_`*a_l$ zy;yC0Hzb1NPkMMztaR4d#h@?reqFgfY4d&XZDe(&Z*7-VYFVMB)a-S7oKC9z)9qbL zht-s(@=KP1}oXmnBJ2rtz%fJ8O! z#!j0zkA)?b%?h>snCfVtw`aI{l4D-v`xuO{K*nslGNHOS=+gw%D~7P?q^G;4)RaJm zD8XAp67=S$O;Qx!mlWYmya7MQCA0WGS@kmgM8NtUjZN15Q~YbOt>lPjzd4Kd6e0z( zU7vNtr|giXKr!TV0D(N=)09Wh9FYP%anYq1C$Rg#J={n10&^jb*~|YfFad6iKT%i4Q{~+Ed`nhBju>H2ifPF7XdwVH$t;bh^$NR9;OGEecNCQ*oz1d-2oPcj) z+h^U23Gq{p)`j9)y9p|fgrM-DTFV6KS$hpj_vmyUQ@yJx9TR0#HY4X4yb@2QLY=FI z-pp`QTA0Av1uN>RBJe{o-@=_?WqeQdL*+fF`J%swR|HV&5`E*FBtMQRG$Wy&Ug##I z(7fE+SFpaDDsUyNLd_w~hJ!lD(SDYptghhT-Q`xNkRB9Saq8&2E5j?U_Q^nDO>id4 zlGI17F+ag#Gk6HuqpjkoKepniSKTt7DUoDeC1`Om{G@t-18uzVh0L#_fHmVH@=&rA z6zsJ1;utI*Y1I!RM9i*%iWovDxCpq8NB)4Fnr#0Oaam2$O^e}6=+xKm-Q~qldxW%v zl-;v8=P6!S!5a2kLEn}=XMT$0Umuz5cbz{3#RA;C0klIpJT1Rw%RRBwuFQD)#19E* z(QH5hA`Y1#=_8nm7Lr0Z9jZqe67TXL;NEFK+lb0!!M;IL_-jur54cUPAWMpcqBd-+ zh^g?-$CDCPpH&!}arq!IUSH0hU$4vKv(Yv*+(2e8f3&;!dxLggQtMa z0E1ixrZJ*8MdL&f%k1nUo0hd!PnH>AbPP;)y|^NYz0MZo7eqE6UHKqV!P z_FUf#daf3YxCRay0}N?96o-kePV;PmX8x{S*MZP+`K4+oanj-_LA z69BFoC?bB>QTt-_EJ^it;$-(Te4axe0)#Pdve1VVQ!HeS^OT(nsA3oKT@<6-yl8yn^XSLXgQ4!X&fL{xyn35Y?E+m+Ao@Vh~Bm?yL z>@Wam_E5Fv=gCo$K~QIzv5)}3#cd}5G$71J{~Yoo%>x4&z(HRNzeQ)DGI9DY8wwdL zlYHEdxnx2^G@2UxAP2f8VmrzOuK1QSjymlIPY@>89r7#KJkpqrdv5D=d8KeRw`$r@ zoZ|HGtmk8>*LLcKYPC-g6Mut`eBV}2|Hs5mQ^rq2RPK=O7nCDy!`snAM4j42NmN2T+^UBFu)eK z=5<-TF>VG5GrjN9k7z*A_cI~mp~8Y_q$q-vwl>kkSd)@N4xM+Glo zW%qHJa#J&PLsD$Vuu3^>Z9(TP0w%tET1Q~wGC4)qct-X8k5Qio4T9y1h$`y@392Gx zaM`R=7XgSEqXmFc0Aby<(%wn%4$1~BXYp51v~}6+5{gu^^Nk|_@u?)LV$mVn^*l<* z08nOK_jO$nh~H~Yl=oI3Bs*kqyjfLkGotZwwNUWW9@{wa@OUh>y3@qHZAzEUd@o6` zlH;CN$iib;ESIVxUsu@cnzfO~9N$M0r+u7RyAuc$g}65SIe)Zy2N;WOMMi3xj}^10=rE z5);59;C^7>BOaatUf+XZkZ3UVK{z3$dF6* zD>7Ire5&Vbw)KeT*HLw&O?Cj#aslOwAS1&Mb@*z88_+A%%ND={m0i33I8oMc^uP<8 z1(Yvu@Bn>Qq7uKX3VR~(!qA59wkmGPxQ@sl=P=EUmAO2e zz(_ScCyx&`>6qCYc{h{5&)88At$SR%StG-j=3+81?0Z#8=3OTv-o(G26r=f;ojebI zaS)I}y>0Le@9{KO%HRgaGrOeALpxc?nyc&avxs74t?9EJca5 zFxuLFoY2VafDIq$6p&LV9Og>&$*8N^*g1$bmXw`iAT1Rd-zPcI){g=_(al=*zx%O0 z(6f3;)bveeX@BSW_r;m7P>KP{&#~YASta*9p|b?vYH6sa&>z^Lvo7=4Ar}JPueSS( z!=87YU$!#wtp&6$x#<|bXR}dgU@!W|M4*rcXp2~Ub}QzZ9w?`V00gzP0EOT#@Bjeb zoy^sA0Cgdk^-cp&6ac2(D66kp71o8Q78;>BCR!8fLeb*8s(Xvf>tsqXHPuWeB5f(O@De=fLwP0d1Y=!6-l5b@=Jg`?p=G{F zr>DFX_0kqE1f-Knmf29s4+CW=lF8WDW}S%7K3baa`+m|~9U|hD%L|f_mKPn+CgMMQ zm)h9Uw(?52^OwOX@>RF16pXp|mq*5R)-tP+!A)Dz3`YYQ3ZrQO%ci65Gd1Wz%W5~a zKA;WseLb+3TM0yil9cVBMvYaLTnEOyG7p*2GKV4iIq5&qijY))fYBmIWJR?2Vgs8s zpshKe9X*NBxG*Wgr2kS%(`45(P!4xc;e0Pl_GF4qV=)oi>;f2 z5ethFH74-81aEUt4uk>X&e|>eO)tH@Pa6;+?#G$e2VX%au|>DUrFQF}gPVXO*`(i> zum_Ry6#Q~^H4Yt6lStf(*~mgE$g8hUAL?)GOJ+!<=?vY`%1e(=sGL!1j$urDGWp=O z4GNkkU(YR#$1|nZ%zj8+$AdQZGxe`$Z0||gdUx`ryB<0`JK11%uS-{Q=lG>aR$k(E zWy9_8hIVu1ZAYwrba!rQ4652-e|!3YF7IOU&8x^Bxzl5j`!P8bHw3D681r9eRM&9F zo-=G3dGrr!n#EIXUrxoBB83?cXBq7E(7r&g$=(&(DXw{+Ul*3BH@Ti9#!;NB^ z!HF{;;GJa&lQ8u0I*^gXYrC`i|Es984r?m>-~SmYErPU!lmY_M9U>v!NQ0C#GCGGM zC`d>T7^RL5=>`GmF_at~O2g%!4` z_V4xX<&?H1*oPE`@h&#Qf4Qo#59m4(q8Y1*&}E0)BeE z6AuH^!#n@tz9l>gr55&FKe`HcN-eC#H_~1_d_#Wh0q2qougmLSeYv%ugOeUL@)2%G zy6W#zwJ3FhWO!6qI6bT^$;RNlDQjAL?v|Io#CA))8?n$tua*7y68gBJAWPE^2d%ls zk!4`!M=rQy8}z}oy;ZXG+$F0ZnO_!a(QP7NEh51Sx_$BK`zHa?#~{LvY9o?;%E*j_ ztkoWQI-xI@YE+|NuZ0>pa5_HYe4bQ07k~Tk-SBSYScYIk+y{y-=1j^WzfSR~G5E8k zAG${00A@8APmLb^nK4G#kr0NyZ~L2OgI+r}%Vg~TpX31%c4;7=!>{Q@4jvS^_}Uk| zwiB_y`s+2=8sPqy1SWtP5`+pZV)&$C?O|uo17qkfMr;k||~7z(*RPEnN0_ z0`s!;={e9%^nf_qTmF6#5da9&qq=r=Mf==m(=E+mTY0k{`ZS+~e<(wmXt1)9*JI>r z`_H}!uFvr?Z7YW+;+p;iI3{O-b6~eSJ(KEj{NijH%DhVPDPdIM7rD$9J4b(ydh5bp z)@o887WO@8?tO>!9+g&?f<=U(jTJs;w`*&E3;o}@?!85{1Pg2YA|j<=za1u(WKAn? z3GthJd_zYY7A3QHSAok37Y5VStXA-(`YepOS`?wX&aAGnyfxO@Z4M1$U)A;L+>b4a zQjhU|=9z8ohU_DeY-u0garxw*u81Fx|NEn0n&Q*0b^41g$h6EM$W;sXdsA666{7L>32$S5iouWTYu$5Nn*^#s!W9<7$AB_?^!i-4?*Giqm zpRPpZGB}PX<72?@{eRdPwFz53SNdt6PS76~8TuIoHShD@LNY(|Gda6Ri->hv>+o-U z$b2%Qwb-&J&4yH79^PMD&E$y1<-mM{60$}QJggJALci*;a@y81NJetKj{59>JB5FX z8T^(5gBkF17Y=Zvx@qJUqB?;tv@$$6Qmm4ZmW(bqn3m&vN4F#Vg@g(Y%9eMLA!a%8 zd_1hJ&cLtGTUXCkZNn>34^(f9%P~`(Q(JltH#8J~mGBWrv3SGz!s;!_6^=eIInUg6 z%8u8m#4yNA|C6;=8Sh$@vr{n<2U}rNvp~BBq@1qDny7G&*}Q3keXo4|cQ?)?&3YKy zJHT%EkX2yEb0MnkL3^Ew@tB~L2nRO#^n`&3@Cm~TvOhR#2NXx3^N&z4TH=w>KR43v zw`pO(?=GoEfBz4S>0|XjmzYQ^*Bi2m1An@~(^^wIXVN{btUBa1`UJ9w8c$7zE8D20 z>?Ur6FZ59k+9S?zryL}`kumuNsq1%d1SLglow(^lpi`;qn14%UZn4i+gd><`AkdDg z>5C$4rzPr&dCRStNB+tSx)^Tlh@_MF+Rx-4mT@+S_#inU%MtA_5?C=bFaeH|R5(cI zO{h`V?8PvrU1r)J@~i#z`^kEPpsosr#6DyzJ!)JsH^SvE%)Z9#Acjxxzcvt(VZS)A z>Gy5uWeNA9=pM=DV`YJS9e4=do}yY@r5b&ftaannPv0Ti=JtUWe~{+G>nsAm;OIB< zqoTjYvnA#iboK!1=I=Dl>rbR~OT4!Iq#6$rB6KFI(x27k2NM2t*ukqRXjjB1k^#Cv z3#t|#uEXVDv8Q=@OU-vbSL^$BO6n>ZEBT1v|FtAL-;hD3Sbn&;CQm+x%P~;erecXH zN#az%=*0!elC>hi@2^^*J9!OlJ|x1y_Qb$zR#7ibTwKX5`zz!AAOXpyH{+6jWfRsb zos-Uy!awa65X+0=HQG&Aeu)!Edq;*1ED zTjSxZ#3G6@(%t(SYdMp+&XAo2)50w&-we5r>wm+Ht(-=TE8dBITi_L6Sq#nNirGzL z-jh^1B6Ojv%}*+vapHQBspRm>GZbPfxt~niH_@}R@Km%C^L?9CK=OT*9%g zPa+oXAe@(3pME4*YMvM}=1pBCAhc9`i0Ysd7XC}9={+S*|551IQlh&kgu$QKW>9bQ z%@5KSXC`EXnRxW5^mbhMazkfgnu6L7%A$vncPlL7S~$BonX7&@s!{rH{=JdLGo+v! zck3vLV5Sx^(dV81diRl3{SR6Kwf2BcLA%9ifc43t85tLlqiP`lhCX2rB|C1(U`uRV zoSZg)EZ@Ena|``HKXU(?J;SrMe8P+|&P543A{>&%1M-f*MUVgr;PI^>NuI=J;KE@= z_ggG1hFyFLnc((>DGa$Ewz}K&lmuVlndpQ(G}NU+>9peXse)IgDO|_Px+*`jCTGO# zXe*`(d{NR~!!A*yNpGcX>LpdeJrew_=xhHf%vD@8@N&R(35m_H2p`?txE>xLdjzWoBYooEHDQ+A;26^wVY{^ww!*E}cQFRiQ2&{*a9R@Z4UWp#+_$+2 z<*42QF_e2X;YR*~5`z06R7450iKqPw!@<(Ox%c3z0^Tc{Fj#R>A2H*PsCqhLUzC;1 zQq}0t%x9kW8HiPVIR}W@eSg{81$eywp1h%e&j=_W-35hg2#)PawUiD#iwCrb4(Ge> zM8#FzRk1dUasu?sIS+KAbTw3P5AQ9gwptYa;rujfJ6bp4IK$4L{w*aTDU6B0@>lNW zKO^iPbOEsb*=s)Q_xg#MJ0m4lc*VAI0uYunz?zxJUK>LTQsdmV>R6#Bdjvq1qauPC zjl4g#%BfumHEc;KfB-Vw3$}GHAr_;OEmA;Ix99=xcP$llPnPWLsT7c+JW<9b4_U_% zDsY9rdp^18WRhMe)^(#~=US43Hl0vxq;(6~S^}=_Z!O#^{B4OGK=6m{cwhB+S^nWd zwh7b}JD+}7n_njpKO-E{OJ-w zE{=+FsmKPx65Dk1c~MW_hVjRpz|OO?pCj7yI^^y&NqIfqM*FFxMVa2MIR6_Q)D4IsRT4se_wGD%_E)iCC4l6b4r8Sa7h0%vmR0Vkg%7VqZ zFa8II+PU!0aQUz0LV*1}9@ChnxlO-Kz0JqwO|outZ*#E!lCj21=7Ors9=P{QN?}}u zsr=aDek=cb)8X@9`-69&Sk?SruV3V*%1OlSd1!fEz02esMJ$QoycjzNNL7Vs<;X-> zPx%6BKXfJoI;+i80U$BM(Nj&xxLPy2C3G_Va_y`R02&{a5SMHxnl2nSZ5jY5kwotB z#pD{IFBvcG}*Y7@e8%ba-#lI`BE>jU(tiU_~sBSO>~WaQuYU zpR~@^KOvK1WlM4rD%;5Dv}SBBidbJLEgfI>J=CU^dl z*D3V&@q+CFkBKPL2Dj%UNKPhi^5O+U@VmD;^xyVM5IIO&v5ctS(kDicBNG?m-kuQQ z`o7;)EJ_gats@PJto&kW#VLZ~X?xycS$jQ7vI=7dn$!|xhRAWoaM?x5FJ%y8D<|Yh z`*Ex*2p33r7n$(ozU^vs-ubSaREoes1LuTnP^I0m{%Ab`tk-Vktg zB(eYbWjA1@nk}FqrmEJ^P2KU{mYBoJ6TI=P@xd`XeKYnyj=$PGupgaJRqr~hg8hC- zBn3uqYjJ=j*G2q=$ism6moWO5Pb}Z$mNuk6<^#+X950PhI%;c`H3z;6SC+}TOiR(I zGq09A@JW-01tOnBTN2=cruN&+{Qp>dC(zWgTqMY;LdtNjhq{z!ILXdf!e?fvl%?99 z*j@z1v6x>Rlu)_dV{{x^GO3C6<3M*p>_ze3LEdy9+7d~|+EWks>G*e6Iu zyKv_4SBYQ=&!-dRGLrTVT;ngtbUwc@alFuAf37f2$p#i|@4PdB;~AJ^^m1lti5E6cWif_m+b=xta@ z1shtBTcc*^5m_OTsBg|yhmO{|@bH;u#)!@>r+y*{G=w=veA!I>4y(D?&*9MXXSB&* zT!dw!)x{(=jP^#r4lpz6v-2N>o%6iof2{)S~QLbJpNz#DGpl7bD_GKi-@ z*mVuLB&qhv^YO&F`IZrG%DjRkvgFeC^=R#)w+w#16lK&|)S93-#(tO$jXvstD*qbK@<6>r&Sjrx`( z56`r7ScRs4&uaF=*vIl>U&3hrcUj_bmkz0>XX?J(6vO5<| zi;Fj*0e&TGg9Bv`S((?iC!sV`Qpcsy+YT8BxAx>0@qSUL-2QXt0HlRRQ^?lyd5wC?6Yj_XebTo@d1 z()yV?ZL20`Fpj=dd%ENg;aH};Hwobk$@$F5&lo|MlIP^K@c8?C#gNx|eKi7j86n^C zg=m0LmNI$1hr$+KcNvd>drw3uaoW)&YU9KTHO==p{>f@)*EetQ8W5MMb82w8mA_)W zKHpkJeeQ?5U;cA40YD#@^_F1qvcBB3w5~p%6o726vV(w`a8O7EG0y(V3`?iR0-s-B zl(r%Puu&X&W1>hT1f-ve8+_S4t%5j^NzY#Ua|vfIHHDW!?$PTCu`Q2pn z=PS02g15X(5_RtLTu>VYx@7D$Zc!gcb8JdmYi$Z%?P|K9tveH`t~v&s9QfHq+^#kk zFnBuL;Hc6TG!H@TfZmF$5VFGZNb}@|DJxDbs8iW&P=!Ef12z4)huZL zYm8$Uts{opk&SMIPjo3~?<+JX(0`)a#_9 zWTK-SJwG4%;P6x2(q(fDgH_%_@gCKD=wH24)=MKh@uo2MS@c5V^?O&h5Qe< zcACp!{ESs8gBPd99-?`~Pa7oB|yB0qrbPv+P6U)a*2_+;t4cN|(iWp=PyUnE9o*T1}uGorr z{R&(6VmU($DIFU~O6r|zU}{=?%#^~!vwvpagPAOv9=FS10*R8{^%HtrE<)+n?{ntu z{eKM(u4SV5?#%n~gb-~g0CqmTm> zf~kX%nn8j2HmAQP2)6ga@W`@j3e)FPgq+)3MaNPN4+b0;#w?k9JthxE11}4#pxuu~ z;M!dY#Yffo1WD~7EDIq~(rYzhb)oa|nSv zM$L7{I%rJFzGPa?D(iann2!G5!4Ld<8H~J`ZsL#^EVIMh54s-l;0O`Sn0JJ>#>M%t zE2z+2;{!}!b|5lxob$eyARwp8Kp-0_S7h9s=`vL;)QdkqJOa9p*3QrjXA~<-JUS1ekVG}i@f-5>K-ts)^ zr$1c+=@r-_G?Tt2@yc(lmCVcqeV~Fw#u_Ml9QqsV49^hh>5wD1iJQjrPfp4!WDrG2g}bGtVSn?PI!a0RIY7XakZ*q!WV(Fc;kfz~v zmDjR(Br25wly`tf)_(4&d!wnb=<88HG2=tU-;QmeA}cti8Qe1M5=E`{X%Mk=L(7~_hY9sSQBlySLd~=YH8i;y8IFv ztZ06+zzsmszbQBn7u~JbN(BWRI^gyQ*eifK#Sm!)!?GIJZ7&tm6xXt7ne|g4q<}I_ zDiEkcIl;g3XhGQnh2i<}C0HICZAMNjiK$!TMK{ zZh1pU3pMK4>8YWNnT#NwvnKGb_MN$-U6??|`Qd7_>%EwCIRmCL#exnDmHY4N}^~T+zNfS~< zQ!mEhju>g;M=Cq#xnRo{7mEr1?WVlVm;Ogw^9!^K%QMgn z6>%ZnH5|d(GK`QFw&p2DVQS1depc|_FK(R2+^)QRSUkuVqtVD(IY>;rt~tRStvF8` zxoYTXtz@w1jYRFtcs>&vo~Ut-dKMfrC;slbJIenD)E_g&<;%;8P;GniHpBAQEuOd9 zo!~9c;d*VazIkieE3~(;WSO*U9uK%<=3*%qVTy(~2tgJdhju_*t2k2f6&EM$FB3I9 zR^?d%H~xIlU{anuk58rt>9S@t#5zjpTFGzMp5fXM+iR1mT{GRkuleXT{-YP{2CXj7 zh{r*wt1Mf$isUbmoyPV!R;qI>1{KYT3*=y{E6u>3zx6%LoY&Ku33C5YVj2LXX9in5 z6fJXfEK$b+WKMl>fY(+)qgwC?u3URzuM|K7z>(5dfU*erWDGe+eSM*hWYLQPRL~dJ zQ){ss=2-O+ckSS4@nmq>m2lBv}=%rh5T`9<95k8+plI>$mm2tVTgY@@g@(P{|g0H_wKZq1yDist=dlqVK zsrvY(m|sF-KBTHojDd)#2Pg0Oy4G8nSs*lSzpf22HtB`^{0qtuVt?UU2ir7Qza|Ik*d$`(F{#+7%opr6`Zn*z*uv9*KkHrs zx5lu=n(WGDhFwBZ``&YtW1&#&*bKX$IC-T?ZOu;3+!2k{mBJRNM{fqOG}&0DyduK> zTBEn`V1!~HM?(INt?HNX0TT-6Ei!YnKTYk&K_dAKxtl#3po*NGPw{l>2)5BP^?1i8*nJv!J^iqJspf4sfiF3^#$;A?kG!PvNc zzVJSIuT1yJ*VX=D^se5DaO(XMQoH3J(n(%ySE4;B)!bbi_}K)TV#Y>HH#9k~?G1hw z7}ftuBD-zM30ks=B-LOiO8D@XH||mW6HRIyR&|9$J77U2+XKuGznd^{s7{mQ?Af@u zp7|g@#9hU5jOG8_wEaL5_t~=D*N6fYRZ9Y(6LZK3bV~0*sQT{+`ZA>v@@rS1FDmqu z6>QmXIgaE?Gp}(alm)}Q2XD0|tN>EOWuA;*^Mi8YqIFJ>ekfoPk1K{PqIIxu3Aw-& z#U2?r9TKVsF2pXwE}(`Vdq*Ct`(XI{6Aq(uyIRP(h1V%1b*N58HGTd3wxnN#>FhOi zZ8lb|Jqbd-*qXgKbX-#nXN76(9DKjEyY&-(Ir1u|($6!q<#Ns-y5(Rpq)+orIBOk` z4!CFMvkv|>PPYAds-p@w|50UZ{+c#h%eWPAE+U{P?UQp;A%6orp_^FgHgjNHg7Mf3o(D2 z=F#?OQ$6l|XI+fJ_|H&UENsu*7Sk33!Yy3J4#3-Fe!G&vb|a}Q)2}G&2%iWV2!0>=0qj(L=ty2wCS$GtA(|yj@Th=im=4l zzU1g+OpL%k2B5RMJFk?P`~)D~U$6KWFf_eLIwE*w;??=ZNep6~#lB=bBWEpKJtMyqt9QBsZs3Zd?w7lEE;7cJ#A~D_! zttF2OAvi+Hh%qrzgoqV;+sL3rO&(#WCMj)W*tMscnBsL8$eULL{#PXsm{i3V)ltSx zK77`lfi-M`v4QiR**H)LCE`K5WiJ`6Od@Oz%6z81a|hV&>%80 z(5=N4xQQIyKxUDjt%_5DtbK0S1MAT1_$FTWBtF(kOvGSl9%*9Y{Y{3Xabr#>=O1(b zzPrt9Hdc_mt|tGqRLU?W0&JB4Z*F<}|# z9`i?NSnIKOxVPGGeJ7W_@e_wNL2qZ*A&X>-WPV|TulYYv3CQM=^4M)Zf+MLGu$s63 z+CE=d6zpV&8r=#Wmr}k-Jjo86NFP*^ z$xDB%_u9;Uo!XH*xujL9c>e0rI55%bb>Mj3=M+GmE;tqH#$YMVN+f81*x!S5IcqbY zcUC?&Jp8f(L!(zt-J$W;_G@$*=#Kl2fy*~Mdu&sj%miR%#C>?5BLWY*9IXp>fe*g5 zEDwAT9H(5L%?_bo-V|)B4iOH)|EHoA7>ep9U#l{@zkE{0^8$bjtqK8v95tZ6F?eT# z-%2_clu)n1_{qQV8(_a4!~g0`>mmw+aeD~lor?2*f0M&44JqI*%#Ti|z@Qz^KBaVf z&oK~Z(#N)*E*Rt-b!aQ6`X`wx$ox6h8&8G3@yFJuS7$Yy^DRtmQ;=~vX;3sfrn_8*d(qdG!kEV~> zDJeM0ZEgzR!=C9J-RQz2aG4KNeH?W|W-r53v^8UT)yKHE#SG8#cd5S275sY16iWN` z$kpP=60@me;HGch2*Q(33%RzzjTT`A(OrLjC0zos9&!fTvD;st*-_)Z^yXjyh3k3Y z{XUGnOUV!F@_Nu|uE3%2EQ_!+E#Wz*H_6U-o%fQ&iA4Zuy9!oMx4wPp5g;W4ms;`8 zO7>@yo9DBfHHHiP&lAj`M#Vg~zFhhFJ7a8$W-SgEVBO0l2!fL0$&g`S*zrK{wqGs1 z5d=&u3>)s7I^(?{u)Q8muq&SRb3rLg0-*4aw9c@_U$#NU44s1@bdVK+36 zNS8pyx%WThRPuJ%y;7VneB=1-Hm*77p41=;)ml^GA*Og@36sX5$OctZd?4{#uu#_e zI!V2WYgs5DRE_fW&MTF6UF?FrQcpx38C(p9pSYG*GG^Y({itSZ*t8Az4Z5m0BnfYj zbu{3orGVRV7tw2fp8uPDyH9ICu`Vy0H8a6fEqpW*b|n9A3rs(tNIb10_DHoww_ z{auFxtP=Hh6$FJ~*R0uL=TfO~z2dQ==!O4u+{Uq#yfl;JhC=lDfuimSXXqG2>l# z!}e0?*`Av>9@X>zpvR?P?WAkmSOGCA<%WTVfVcok){Re{WGXZoQL2Yi2AGLId7npB z)tK7wbi-7#neF&9t3vJ@AMO7%usmptQ(mC%v)#(Hf>-|M^r`l)l*=VFbeoaJxD?8h zjBV4mV3Ym(_-g)uZ3;G=N-O!2D_{N*iwGTP3 zbSw^V%g6|m)=LO7#$>5FD4<^!^|!|cf~C&|Y9u+yuO4S?mC3iFLoP0g_tp!KI+ZXA zPX6D$>IR|1`!~`1u(s%IvXObGm?_&(SBYn8sIw$ zQhRGVoUliJd03wPHTax1ZZpDz;j}7r>XD9U_fYMaMOJqRBlu}s%T4d%E|qBZ!c{wi zkvz5R#GZ#%(&l4Kex^W@8 zW*_YjK((DDcfL}*q$?_ZVo3oQN0N(-5)O0;1_|OA5R4xabQmSFGu$_XHT~NCs*ptd zo=e?sD>dF_W|DRij5@03c-!k`ff6iX(>umB4 z1nf^^+c3=zEI=lJBX7RkG?2|&NlQEf=}O)ghK?$T-Y#fYd?bGykS*|u+ledTPIyD&*XTQP z!9gPpYtS(zuH+yy%{5soYi`xCVMFUc_jQRG>;BBbFe{O%O<~Wo=R+y7J9;`+2>9wu z7H0WVW@A3YK-M}3K6WM2r`&r$sCk{Fvx1Ex{!iL<^Xq&10!iL45 zLMDqp*w_Z^T$7;u?T7DV9k;9v5;MAVQ78IN+)B@atjLVYlaDq9c5`2OFNu+5I1Qp{ zDMr3?zb09}p!ze@0kpk~+%8;f#Hd!8dA{54U9q^H*6-*SDTsH=h&qPd(JQN#Uy8dq zN2eey`GGn$$oG?n^o&E(Lliw5;;o%8?_B)aq_9z7B9Zbb#Fu@$h+Pvtbkjhg%g}D@ zg1bWuyA^*OJ>{HWAGL7kfA@YDAf(O49bp#xnlazemKcDXVy&G0x&)w^#x@GFUd9dt z8J4{XAlkZB~d_!cg%Y*sp;#a!DV^I*V96B{Wpe0 zHFUEb&3$%jwwo(PtDE}%Mmm+X3#PILyCW>v0L=LCi>Lwr^Re1W!4T%l0}rQ&&O^1oJxsTd*g0jYgb{6p{8uPIXQE8C%c4Tb4@k zX_FF|8l>wz{&R=dqcl<$Qpv$yl=k`{r?fN|0I(Up_DXL@5Ozg8uZMK$3*TyCF{5>Y%;oog2Bo;Cf)CsI zQ|{NGOpJs{O!$AbS69?!`?^j-5Oy_#@AzF_(IJMJX1u=5*4WKW&iBD8!GmM8O2`{( zqZ3Vi$yCQ8l(^o>1*PfEUIJnW9Yrl~>2vDnmef2KC#~@_=OM4arFwM)JW0nPg6fx> zHktmIg;5C$ceYDy+^YQkch#z0G#HfK5zt3Y5n~;`3)+Z#GT+hqz>KN$@iA zUlF13YsgGy`sKa46MpQ!DOaiFMFG_WA5E-3DFPp9S`N(^oxhK=4szNmp(@XRZ{#U%VOYne=(ZAjEx1h%Wma)Zu(EQ6hswAc z&x$Eoyy=Le&sss+k0d)>68|%5AoE+>!mgqWaVq0jGU=!%8@43a1VGY^vxAkKQ>1`F z{r$H$=eL-d+f8IzceyrOOA*Zf^2UF#*^6d3s8o7NMponFMGI6imn)>^{s*3YJJFNH zMSL=3n`^!JncH7XX-2?<+N+TP*_z_Tn(OoOfxRG}0Z(#yD6+ilS3@SP+8o7i17|>q%}GeDO?U+Rn!7ys;;+2*$mNl^ zV{QwV0XW-!7IEdzNjmXUQOX3lsaV(5Gd>5QeR*s1X=$&o>=t7QeyYW#shC0}XvFQ5 z=XLP*g%bA#ggPeN@Tis_u&)NayH>x6SPtz}saI9OY$k_fktBXbwYw6OzD6BXQ_ah% z0QC-_*_5~oCON3dTT;&mAWH8oIO{>KZkVt5`txPd8)Y|SrmL1|{6Mq2a2usSdL|{? zf}pB(Mh6z^SaER==%i=jEiel$mn*Tg6(#wCCArL~K`i{T*nNX}$wD1o34H>tZWtr< z27bO*=s)ZB1s+jEa>YKz0e}JXd%gxfE*>AqWBLVWpI+9q2BR>hZ6VeD4;xe0OQa7P zTI-*BtmHH~j^s4`k`0BwJ{j(6g@ye(K3wY(UUa|6iUnU&)Sd@kg{mNz9Gg4*wSG-x zDNjrb2PW+yvl7N#3EQS3UZtt zWlA^j@e%Kzvr|*jw}Oba6BN^a&5e^)^H5p}FuntRr-o0b3%XI>L7G{me)o9qzRpSN+;cIL*-C#Q_AAgd>Yr@G z2GeoxFD`G-*6;Rrxuj|)0XB<80I*>V-~{AqJ`?8*7BH)lHf1Le183C|PQuUm-dk76n04%p-^gM!sO5!y#`!gDSQ&-Rir zKYI*mX=Tr(Eiu|AsJfvt$zXX7l;BStSmtK;ov$H(!xA@@kioYAdYpJHm264xbXa-9 zPmWqyYfRLzW6@>f1tiOWz(zRl5~|`}8rQCqq;}NMqEkx8;x=cfFgzhGRPWvVquBc^??+|Mt>Wsp>)T!$}6L%Mt+-bvpV0 z0Jj~VgXn!+F+6~SZ9|5DV-cFd8gUPxV^-m7D4tGXnEx(0fcc$^Rd0*%Pi%h*dw-t_ zg<^@~1HYA~goG#BX$5inKvHW0~2RB!B^wV!78OwEhRqkG=GcTLZLY8Pqec_({b z^ZwSUa~$g$J9=>|j;^`w#2A1_CYbLX78dVik9k~XONS@SPK^#=Vh7zaR_}{TpUrJv zI_`!FAdrZm?1So9;nW?JyLVU&eN>7ty-?sUcz@<53^O*2Fbrz!iQjr+rkp?`Ak5_9 zw-PHp8{+N}a&0N@3;(@YoZXz0vzh(4`O%8)!;$ku08xo_Mzz{UE(9cq((YJ+u*66k*Q$dT;@%v$HuIekH_#$JvwQI4 zHDe7g>So3`1la8dw%M*l1Z_!qK>QF)@~#IEe{RV^t&4?qGOIA5%jX_;H7}3Hw+a5F zM5^*0IhrwZ%~(cx0sw<5Hc`k*mUG|rA0FNv(Ivu!1@4&wHm_vfc#F1FUe$OEgDb%~v^Xhw&>Z>lQX_-`OviS;7m%1S|pzl~6Q zF0os>F#1)v%S34f59_>_AMMAaKLj3M-M*o>%E}^|c~>3|;iCe>2TBIClXzShM~01# zMFy7VLQ4H$ES)=!PV=OHAWh!y(m0?q0T0xlNfBR8L%}D#T2A^1=V^eEU~IPODq=`G~4#dSI9etQ_;cq>ct;`RA(UXu$uDgb5)+9^MNu5L^J42FH=3$Oq@#3;KSvA0cdpQI zvD=0bOZ=waV_G`Tg-oe~ZD5;FGM@`sOW1@mnz?bkjN>~~%dAjG{4yeZ>OFW?TD{_H z9geCP!OrDIHz8l+r`L4b1WTyA{LY=EA6cEARE$86C3Tj=<0QoxJdnWcJwrSbQkxQE zysE^fM{2+_alSqS#~3cPHNz4g_5Re-vW-n3UhTE^fh%@hJXbiQmmg+X-CNf7oJ zL9(@LQ_bhkQ+-6GYs#i5e~_qSBpe^L&bNiStFkor`Oft*dlqn|1<2m+-NiKAmNVYE zljm{!C2l5!t3BmA+IsFOIuPD5JT(Qi`2OuUQeLj1gW0xeLGf84d$Oi_&{gIf2fZzR ziR&`5?|OZH;_6`jxYosgcMox3a@KtqDtYpwcEoeK-7)S~-@)(IDZyGSQkI3FIWtLm%P8 zX84`oeyt{ifEFCC(T}XvL4+GZH~wh?oDjz8ksc>=3L|X0?7tsKGNyeodU|_bH5$1i zDkJLt*(&}jmmz$m?V!i|ugwTs{K&?q(`9`tovko$8m9N3`fbJgg#5_7)+KM>