"
if(jobban_isbanned(user, "appearance"))
@@ -305,6 +316,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Window Flashing: [(windowflashing) ? "Yes" : "No"] "
dat += "Play admin midis: [(toggles & SOUND_MIDI) ? "Yes" : "No"] "
dat += "Play lobby music: [(toggles & SOUND_LOBBY) ? "Yes" : "No"] "
+ dat += "Allow MediHound sleeper: [(toggles & MEDIHOUND_SLEEPER) ? "Yes" : "No"] "
dat += "Ghost ears: [(chat_toggles & CHAT_GHOSTEARS) ? "All Speech" : "Nearest Creatures"] "
dat += "Ghost sight: [(chat_toggles & CHAT_GHOSTSIGHT) ? "All Emotes" : "Nearest Creatures"] "
dat += "Ghost whispers: [(chat_toggles & CHAT_GHOSTWHISPER) ? "All Speech" : "Nearest Creatures"] "
@@ -312,6 +324,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Ghost pda: [(chat_toggles & CHAT_GHOSTPDA) ? "All Messages" : "Nearest Creatures"] "
dat += "Pull requests: [(chat_toggles & CHAT_PULLR) ? "Yes" : "No"] "
dat += "Midround Antagonist: [(toggles & MIDROUND_ANTAG) ? "Yes" : "No"] "
+ //VORE SOUNDS
+ dat += "Hear Vore Sounds: [(toggles & EATING_NOISES) ? "Yes" : "No"] "
+ dat += "Hear Vore Digestion Sounds: [(toggles & DIGESTION_NOISES) ? "Yes" : "No"] "
if(CONFIG_GET(flag/allow_metadata))
dat += "OOC Notes: Edit "
@@ -385,6 +400,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Widescreen: [widescreenpref ? "Enabled ([CONFIG_GET(string/default_view)])" : "Disabled (15x15)"] "
+ dat += "Auto stand: [autostand ? "Enabled" : "Disabled"] "
+
dat += "Screen Shake: [(screenshake==100) ? "Full" : ((screenshake==0) ? "None" : "[screenshake]")] "
if (!user.client.prefs.screenshake==0)
@@ -868,6 +885,65 @@ GLOBAL_LIST_EMPTY(preferences_datums)
return job_engsec_low
return 0
+/datum/preferences/proc/SetTraits(mob/user)
+ if(!SStraits)
+ to_chat(user, "The trait subsystem is still initializing! Try again in a minute. ")
+ return
+
+ var/list/dat = list()
+ if(!SStraits.traits.len)
+ dat += "The trait subsystem hasn't finished initializing, please hold..."
+ dat += "Done "
+
+ else
+ dat += "Choose trait setup "
+ dat += "Left-click to add or remove traits. You need one negative trait for every positive trait. \
+ Traits are applied at roundstart and cannot normally be removed.
"
+ dat += "Done "
+ dat += " "
+ dat += "Current traits: [all_traits.len ? all_traits.Join(", ") : "None"] "
+ /*dat += "[positive_traits.len] / [MAX_POSITIVE_TRAITS] \
+ | [neutral_traits.len] / [MAX_NEUTRAL_TRAITS] \
+ | [negative_traits.len] / [MAX_NEGATIVE_TRAITS] "*/
+ dat += "[all_traits.len] / [MAX_TRAITS] max traits \
+ Trait balance remaining: [GetTraitBalance()] "
+ for(var/V in SStraits.traits)
+ var/datum/trait/T = SStraits.traits[V]
+ var/trait_name = initial(T.name)
+ var/has_trait
+ var/trait_cost = initial(T.value) * -1
+ for(var/_V in all_traits)
+ if(_V == trait_name)
+ has_trait = TRUE
+ if(has_trait)
+ trait_cost *= -1 //invert it back, since we'd be regaining this amount
+ if(trait_cost > 0)
+ trait_cost = "+[trait_cost]"
+ var/font_color = "#AAAAFF"
+ if(initial(T.value) != 0)
+ font_color = initial(T.value) > 0 ? "#AAFFAA" : "#FFAAAA"
+ if(has_trait)
+ dat += "[trait_name] - [initial(T.desc)] \
+ [has_trait ? "Lose" : "Take"] ([trait_cost] pts.) "
+ else
+ dat += "[trait_name] - [initial(T.desc)] \
+ [has_trait ? "Lose" : "Take"] ([trait_cost] pts.) "
+ dat += "Reset Traits "
+
+ user << browse(null, "window=preferences")
+ var/datum/browser/popup = new(user, "mob_occupation", "Trait Preferences
", 900, 600) //no reason not to reuse the occupation window, as it's cleaner that way
+ popup.set_window_options("can_close=0")
+ popup.set_content(dat.Join())
+ popup.open(0)
+ return
+
+/datum/preferences/proc/GetTraitBalance()
+ var/bal = 0
+ for(var/V in all_traits)
+ var/datum/trait/T = SStraits.traits[V]
+ bal -= initial(T.value)
+ return bal
+
/datum/preferences/proc/process_link(mob/user, list/href_list)
if(href_list["jobbancheck"])
var/job = sanitizeSQL(href_list["jobbancheck"])
@@ -915,6 +991,64 @@ GLOBAL_LIST_EMPTY(preferences_datums)
SetChoices(user)
return 1
+ else if(href_list["preference"] == "trait")
+ if(SSticker.HasRoundStarted() && !isnewplayer(user))
+ to_chat(user, "The round has already started. Please wait until next round to set up your traits! ")
+ return
+ switch(href_list["task"])
+ if("close")
+ user << browse(null, "window=mob_occupation")
+ ShowChoices(user)
+ if("update")
+ var/trait = href_list["trait"]
+ var/value = SStraits.trait_points[trait]
+ if(value == 0)
+ if(trait in neutral_traits)
+ neutral_traits -= trait
+ all_traits -= trait
+ else
+ if(all_traits.len >= MAX_TRAITS)
+ to_chat(user, "You can't have more than [MAX_TRAITS] traits! ")
+ return
+ neutral_traits += trait
+ all_traits += trait
+ else
+ var/balance = GetTraitBalance()
+ if(trait in positive_traits)
+ positive_traits -= trait
+ all_traits -= trait
+ else if(trait in negative_traits)
+ if(balance + value < 0)
+ to_chat(user, "Refunding this would cause you to go below your balance! ")
+ return
+ negative_traits -= trait
+ all_traits -= trait
+ else if(value > 0)
+ if(all_traits.len >= MAX_TRAITS)
+ to_chat(user, "You can't have more than [MAX_TRAITS] traits! ")
+ return
+ if(balance - value < 0)
+ to_chat(user, "You don't have enough balance to gain this trait! ")
+ return
+ positive_traits += trait
+ all_traits += trait
+ else
+ if(all_traits.len >= MAX_TRAITS)
+ to_chat(user, "You can't have more than [MAX_TRAITS] traits! ")
+ return
+ negative_traits += trait
+ all_traits += trait
+ SetTraits(user)
+ if("reset")
+ all_traits = list()
+ positive_traits = list()
+ negative_traits = list()
+ neutral_traits = list()
+ SetTraits(user)
+ else
+ SetTraits(user)
+ return TRUE
+
switch(href_list["task"])
if("random")
switch(href_list["preference"])
@@ -1567,6 +1701,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if("widescreenpref")
widescreenpref = !widescreenpref
user.client.change_view(CONFIG_GET(string/default_view))
+ if("autostand")
+ autostand = !autostand
if ("screenshake")
var/desiredshake = input(user, "Set the amount of screenshake you want. \n(0 = disabled, 100 = full, 200 = maximum.)", "Character Preference", screenshake) as null|num
if (!isnull(desiredshake))
@@ -1636,6 +1772,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
user.client.playtitlemusic()
else
user.stop_sound_channel(CHANNEL_LOBBYMUSIC)
+ // VORE SOUND TOGGLES
+ if("toggleeatingnoise")
+ toggles ^= EATING_NOISES
+
+ if("toggledigestionnoise")
+ toggles ^= DIGESTION_NOISES
if("ghost_ears")
chat_toggles ^= CHAT_GHOSTEARS
@@ -1655,6 +1797,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if("pull_requests")
chat_toggles ^= CHAT_PULLR
+ if("hound_sleeper")
+ toggles ^= MEDIHOUND_SLEEPER
+
if("allow_midround_antag")
toggles ^= MIDROUND_ANTAG
@@ -1781,3 +1926,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
character.update_hair()
character.update_body_parts()
character.update_genitals()
+
+ if(CONFIG_GET(flag/roundstart_traits))
+ SStraits.AssignTraits(character, parent)
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index cc8fb9b86d..8bebf460e6 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -1,8 +1,12 @@
//This is the lowest supported version, anything below this is completely obsolete and the entire savefile will be wiped.
-#define SAVEFILE_VERSION_MIN 15
+#define SAVEFILE_VERSION_MIN 18
//This is the current version, anything below this will attempt to update (if it's not obsolete)
+// You do not need to raise this if you are adding new values that have sane defaults.
+// Only raise this value when changing the meaning/format/name/layout of an existing value
+// where you would want the updater procs below to run
#define SAVEFILE_VERSION_MAX 20
+
/*
SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn
This proc checks if the current directory of the savefile S needs updating
@@ -30,83 +34,17 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
return savefile_version
return -1
-
-/datum/preferences/proc/update_antagchoices(current_version, savefile/S)
- if((!islist(be_special) || old_be_special ) && current_version < 12)
- //Archived values of when antag pref defines were a bitfield+fitflags
- var/B_traitor = 1
- var/B_operative = 2
- var/B_changeling = 4
- var/B_wizard = 8
- var/B_malf = 16
- var/B_rev = 32
- var/B_alien = 64
- var/B_pai = 128
- var/B_cultist = 256
- var/B_blob = 512
- var/B_ninja = 1024
- var/B_monkey = 2048
- var/B_gang = 4096
- var/B_abductor = 16384
- var/B_brother = 32768
-
- var/list/archived = list(B_traitor,B_operative,B_changeling,B_wizard,B_malf,B_rev,B_alien,B_pai,B_cultist,B_blob,B_ninja,B_monkey,B_gang,B_abductor,B_brother)
-
- be_special = list()
-
- for(var/flag in archived)
- if(old_be_special & flag)
- //this is shitty, but this proc should only be run once per player and then never again for the rest of eternity,
- switch(flag)
- if(1) //why aren't these the variables above? Good question, it's because byond complains the expression isn't constant, when it is.
- be_special += ROLE_TRAITOR
- if(2)
- be_special += ROLE_OPERATIVE
- if(4)
- be_special += ROLE_CHANGELING
- if(8)
- be_special += ROLE_WIZARD
- if(16)
- be_special += ROLE_MALF
- if(32)
- be_special += ROLE_REV
- if(64)
- be_special += ROLE_ALIEN
- if(128)
- be_special += ROLE_PAI
- if(256)
- be_special += ROLE_CULTIST
- if(512)
- be_special += ROLE_BLOB
- if(1024)
- be_special += ROLE_NINJA
- if(2048)
- be_special += ROLE_MONKEY
- if(16384)
- be_special += ROLE_ABDUCTOR
- if(32768)
- be_special += ROLE_BROTHER
-
-
-/datum/preferences/proc/update_preferences(current_version, savefile/S)
-
-
-//should this proc get fairly long (say 3 versions long),
+//should these procs get fairly long
//just increase SAVEFILE_VERSION_MIN so it's not as far behind
//SAVEFILE_VERSION_MAX and then delete any obsolete if clauses
-//from this proc.
-//It's only really meant to avoid annoying frequent players
+//from these procs.
+//This only really meant to avoid annoying frequent players
//if your savefile is 3 months out of date, then 'tough shit'.
+
+/datum/preferences/proc/update_preferences(current_version, savefile/S)
+ return
+
/datum/preferences/proc/update_character(current_version, savefile/S)
- if(current_version < 16)
- var/berandom
- S["userandomjob"] >> berandom
- if (berandom)
- joblessrole = BERANDOMJOB
- else
- joblessrole = BEASSISTANT
- if(current_version < 17)
- features["legs"] = "Normal Legs"
if(current_version < 20)//Raise this to the max savefile version every time we change something so we don't sanitize this whole list every time you save.
features["mam_body_markings"] = sanitize_inlist(features["mam_body_markings"], GLOB.mam_body_markings_list)
features["mam_ears"] = sanitize_inlist(features["mam_ears"], GLOB.mam_ears_list)
@@ -139,6 +77,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
features["vag_color"] = sanitize_hexcolor(features["vag_color"], 3, 0)
//womb features
features["has_womb"] = sanitize_integer(features["has_womb"], 0, 1, 0)
+
if(current_version < 19)
pda_style = "mono"
if(current_version < 20)
@@ -202,11 +141,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["screenshake"] >> screenshake
S["damagescreenshake"] >> damagescreenshake
S["widescreenpref"] >> widescreenpref
+ S["autostand"] >> autostand
//try to fix any outdated data if necessary
if(needs_update >= 0)
update_preferences(needs_update, S) //needs_update = savefile_version if we need an update (positive integer)
- update_antagchoices(needs_update, S)
//Sanitize
ooccolor = sanitize_ooccolor(sanitize_hexcolor(ooccolor, 6, 1, initial(ooccolor)))
@@ -233,6 +172,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
screenshake = sanitize_integer(screenshake, 0, 800, initial(screenshake))
damagescreenshake = sanitize_integer(damagescreenshake, 0, 2, initial(damagescreenshake))
widescreenpref = sanitize_integer(widescreenpref, 0, 1, initial(widescreenpref))
+ autostand = sanitize_integer(autostand, 0, 1, initial(autostand))
return 1
@@ -281,6 +221,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["damagescreenshake"], damagescreenshake)
WRITE_FILE(S["arousable"], arousable)
WRITE_FILE(S["widescreenpref"], widescreenpref)
+ WRITE_FILE(S["autostand"], autostand)
return 1
@@ -369,6 +310,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["job_engsec_med"] >> job_engsec_med
S["job_engsec_low"] >> job_engsec_low
+ //Traits
+ S["all_traits"] >> all_traits
+ S["positive_traits"] >> positive_traits
+ S["negative_traits"] >> negative_traits
+ S["neutral_traits"] >> neutral_traits
+
//Citadel code
S["feature_genitals_use_skintone"] >> features["genitals_use_skintone"]
S["feature_exhibitionist"] >> features["exhibitionist"]
@@ -477,6 +424,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
job_engsec_med = sanitize_integer(job_engsec_med, 0, 65535, initial(job_engsec_med))
job_engsec_low = sanitize_integer(job_engsec_low, 0, 65535, initial(job_engsec_low))
+ all_traits = SANITIZE_LIST(all_traits)
+ positive_traits = SANITIZE_LIST(positive_traits)
+ negative_traits = SANITIZE_LIST(negative_traits)
+ neutral_traits = SANITIZE_LIST(neutral_traits)
+
cit_character_pref_load(S)
return 1
@@ -542,6 +494,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["job_engsec_med"] , job_engsec_med)
WRITE_FILE(S["job_engsec_low"] , job_engsec_low)
+ //Traits
+ WRITE_FILE(S["all_traits"] , all_traits)
+ WRITE_FILE(S["positive_traits"] , positive_traits)
+ WRITE_FILE(S["negative_traits"] , negative_traits)
+ WRITE_FILE(S["neutral_traits"] , neutral_traits)
+
cit_character_pref_save(S)
return 1
diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm
index 255423a4fc..367a11c2cb 100644
--- a/code/modules/client/preferences_toggles.dm
+++ b/code/modules/client/preferences_toggles.dm
@@ -146,7 +146,7 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, togglemidis)()
usr.stop_sound_channel(CHANNEL_ADMIN)
var/client/C = usr.client
if(C && C.chatOutput && !C.chatOutput.broken && C.chatOutput.loaded)
- C.chatOutput.sendMusic(" ")
+ C.chatOutput.stopMusic()
SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Hearing Midis", "[usr.client.prefs.toggles & SOUND_MIDI ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/verbs/menu/Settings/Sound/togglemidis/Get_checked(client/C)
return C.prefs.toggles & SOUND_MIDI
@@ -235,7 +235,7 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, toggleprayersounds)()
SEND_SOUND(usr, sound(null))
var/client/C = usr.client
if(C && C.chatOutput && !C.chatOutput.broken && C.chatOutput.loaded)
- C.chatOutput.sendMusic(" ")
+ C.chatOutput.stopMusic()
SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Stop Self Sounds")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/client/preferences_vr.dm b/code/modules/client/preferences_vr.dm
index 0f9b6935d3..d787e7e9a8 100644
--- a/code/modules/client/preferences_vr.dm
+++ b/code/modules/client/preferences_vr.dm
@@ -5,4 +5,7 @@
/datum/preferences/proc/set_biological_gender(var/gender)
biological_gender = gender
- identifying_gender = gender
\ No newline at end of file
+ identifying_gender = gender
+
+
+/obj/item/clothing/var/hides_bulges = FALSE // OwO wats this?
diff --git a/code/modules/client/verbs/sethotkeys.dm b/code/modules/client/verbs/sethotkeys.dm
deleted file mode 100644
index ee14787011..0000000000
--- a/code/modules/client/verbs/sethotkeys.dm
+++ /dev/null
@@ -1,25 +0,0 @@
-/client/verb/sethotkeys(from_pref = 0 as num)
- set name = "Set Hotkeys"
- set hidden = TRUE
- set waitfor = FALSE
- set desc = "Used to set mob-specific hotkeys or load hoykey mode from preferences"
-
- var/hotkey_default = "default"
- var/hotkey_macro = "hotkeys"
- var/current_setting
-
- var/list/default_macros = list("default", "robot-default")
-
- if(from_pref)
- current_setting = (prefs.hotkeys ? hotkey_macro : hotkey_default)
- else
- current_setting = winget(src, "mainwindow", "macro")
-
- if(mob)
- hotkey_macro = mob.macro_hotkeys
- hotkey_default = mob.macro_default
-
- if(current_setting in default_macros)
- winset(src, null, "mainwindow.macro=[hotkey_default] input.focus=true input.background-color=#d3b5b5")
- else
- winset(src, null, "mainwindow.macro=[hotkey_macro] mapwindow.map.focus=true input.background-color=#e0e0e0")
diff --git a/code/modules/client/verbs/suicide.dm b/code/modules/client/verbs/suicide.dm
index a6b7156ea8..9471f0ab9e 100644
--- a/code/modules/client/verbs/suicide.dm
+++ b/code/modules/client/verbs/suicide.dm
@@ -21,6 +21,9 @@
if(damagetype & SHAME)
adjustStaminaLoss(200)
suiciding = FALSE
+ GET_COMPONENT_FROM(mood, /datum/component/mood, src)
+ if(mood)
+ mood.add_event("shameful_suicide", /datum/mood_event/shameful_suicide)
return
var/damage_mod = 0
for(var/T in list(BRUTELOSS, FIRELOSS, TOXLOSS, OXYLOSS))
diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm
index 0cf375c8dd..2ecf385a1f 100644
--- a/code/modules/clothing/glasses/_glasses.dm
+++ b/code/modules/clothing/glasses/_glasses.dm
@@ -17,7 +17,7 @@
var/list/icon/current = list() //the current hud icons
var/vision_correction = 0 //does wearing these glasses correct some of our vision defects?
var/glass_colour_type //colors your vision when worn
-
+
/obj/item/clothing/glasses/suicide_act(mob/living/carbon/user)
user.visible_message("[user] is stabbing \the [src] into their eyes! It looks like [user.p_theyre()] trying to commit suicide! ")
return BRUTELOSS
@@ -262,6 +262,15 @@
flash_protect = 2
tint = 3 // to make them blind
+/obj/item/clothing/glasses/sunglasses/blindfold/equipped(mob/living/carbon/human/user, slot)
+ . = ..()
+ if(slot == slot_glasses)
+ user.become_blind("blindfold_[REF(src)]")
+
+/obj/item/clothing/glasses/sunglasses/blindfold/dropped(mob/living/carbon/human/user)
+ ..()
+ user.cure_blind("blindfold_[REF(src)]")
+
/obj/item/clothing/glasses/sunglasses/big
desc = "Strangely ancient technology used to help provide rudimentary eye cover. Larger than average enhanced shielding blocks flashes."
icon_state = "bigsunglasses"
@@ -402,4 +411,4 @@
if(client && client.prefs.uses_glasses_colour && glasses_equipped)
add_client_colour(G.glass_colour_type)
else
- remove_client_colour(G.glass_colour_type)
\ No newline at end of file
+ remove_client_colour(G.glass_colour_type)
diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm
index 1a0404430e..09f5993cb4 100644
--- a/code/modules/clothing/gloves/color.dm
+++ b/code/modules/clothing/gloves/color.dm
@@ -163,7 +163,7 @@
item_state = "lgloves"
siemens_coefficient = 0.3
permeability_coefficient = 0.01
- item_color="white"
+ item_color="mime"
transfer_prints = TRUE
resistance_flags = NONE
@@ -180,7 +180,7 @@
desc = "These look pretty fancy."
icon_state = "white"
item_state = "wgloves"
- item_color="mime"
+ item_color="white"
/obj/item/clothing/gloves/color/white/redcoat
item_color = "redcoat" //Exists for washing machines. Is not different from white gloves in any way.
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index d220018ccc..2d12b450b7 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -6,6 +6,8 @@
* Pumpkin head
* Kitty ears
* Cardborg disguise
+ * Wig
+ * Bronze hat
*/
/*
@@ -219,15 +221,31 @@
hair_color = "#[random_short_color()]"
. = ..()
+/obj/item/clothing/head/bronze
+ name = "bronze hat"
+ desc = "A crude helmet made out of bronze plates. It offers very little in the way of protection."
+ icon = 'icons/obj/clothing/clockwork_garb.dmi'
+ icon_state = "clockwork_helmet_old"
+ flags_inv = HIDEEARS|HIDEHAIR
+ armor = list("melee" = 5, "bullet" = 0, "laser" = -5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 20)
+
/obj/item/clothing/head/foilhat
name = "tinfoil hat"
desc = "Thought control rays, psychotronic scanning. Don't mind that, I'm protected cause I made this hat."
icon_state = "foilhat"
item_state = "foilhat"
armor = list("melee" = 0, "bullet" = 0, "laser" = -5,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = -5, "fire" = 0, "acid" = 0)
+ equip_delay_other = 140
/obj/item/clothing/head/foilhat/equipped(mob/living/carbon/human/user, slot)
if(slot == slot_head)
user.gain_trauma(/datum/brain_trauma/mild/phobia, FALSE, "conspiracies")
to_chat(user, "As you don the foiled hat, an entire world of conspiracy theories and seemingly insane ideas suddenly rush into your mind. What you once thought unbelievable suddenly seems.. undeniable. Everything is connected and nothing happens just by accident. You know too much and now they're out to get you. ")
- flags_1 |= NODROP_1
+
+/obj/item/clothing/head/foilhat/attack_hand(mob/user)
+ if(iscarbon(user))
+ var/mob/living/carbon/C = user
+ if(src == C.head)
+ to_chat(user, "Why would you want to take this off? Do you want them to get into your mind?! ")
+ return
+ ..()
diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm
index 403b81211d..422d4735b2 100644
--- a/code/modules/clothing/outfits/ert.dm
+++ b/code/modules/clothing/outfits/ert.dm
@@ -191,3 +191,73 @@
W.assignment = "CentCom Official"
W.registered_name = H.real_name
W.update_label()
+
+/datum/outfit/ert/commander/inquisitor
+ name = "Inquisition Commander"
+ r_hand = /obj/item/nullrod/scythe/talking/chainsword
+ suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal
+ backpack_contents = list(/obj/item/storage/box/engineer=1,
+ /obj/item/clothing/mask/gas/sechailer=1,
+ /obj/item/gun/energy/e_gun=1)
+
+/datum/outfit/ert/security/inquisitor
+ name = "Inquisition Security"
+
+ suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor
+
+ backpack_contents = list(/obj/item/storage/box/engineer=1,
+ /obj/item/storage/box/handcuffs=1,
+ /obj/item/clothing/mask/gas/sechailer=1,
+ /obj/item/gun/energy/e_gun/stun=1,
+ /obj/item/melee/baton/loaded=1,
+ /obj/item/construction/rcd/loaded=1)
+
+/datum/outfit/ert/medic/inquisitor
+ name = "Inquisition Medic"
+
+ suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor
+
+ backpack_contents = list(/obj/item/storage/box/engineer=1,
+ /obj/item/melee/baton/loaded=1,
+ /obj/item/clothing/mask/gas/sechailer=1,
+ /obj/item/gun/energy/e_gun=1,
+ /obj/item/reagent_containers/hypospray/combat=1,
+ /obj/item/reagent_containers/hypospray/combat/heresypurge=1,
+ /obj/item/gun/medbeam=1)
+
+/datum/outfit/ert/chaplain/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ ..()
+
+ if(visualsOnly)
+ return
+
+ var/obj/item/device/radio/R = H.ears
+ R.keyslot = new /obj/item/device/encryptionkey/heads/hop
+ R.recalculateChannels()
+
+/datum/outfit/ert/chaplain
+ name = "ERT Chaplain"
+
+ suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor // Chap role always gets this suit
+ id = /obj/item/card/id/ert/chaplain
+ glasses = /obj/item/clothing/glasses/hud/health
+ back = /obj/item/storage/backpack/cultpack
+ belt = /obj/item/storage/belt/soulstone
+ backpack_contents = list(/obj/item/storage/box/engineer=1,
+ /obj/item/nullrod=1,
+ /obj/item/clothing/mask/gas/sechailer=1,
+ /obj/item/gun/energy/e_gun=1,
+ )
+
+/datum/outfit/ert/chaplain/inquisitor
+ name = "Inquisition Chaplain"
+
+ suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor
+
+ belt = /obj/item/storage/belt/soulstone/full
+ backpack_contents = list(/obj/item/storage/box/engineer=1,
+ /obj/item/storage/box/holy_grenades=1,
+ /obj/item/nullrod=1,
+ /obj/item/clothing/mask/gas/sechailer=1,
+ /obj/item/gun/energy/e_gun=1,
+ )
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index f4c37b281d..e5bc99fabf 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -81,6 +81,20 @@
. = ..()
AddComponent(/datum/component/squeak, list('sound/effects/clownstep1.ogg'=1,'sound/effects/clownstep2.ogg'=1), 50)
+/obj/item/clothing/shoes/clown_shoes/equipped(mob/user, slot)
+ . = ..()
+ if(user.mind && user.mind.assigned_role == "Clown")
+ GET_COMPONENT_FROM(mood, /datum/component/mood, user)
+ if(mood)
+ mood.clear_event("noshoes")
+
+/obj/item/clothing/shoes/clown_shoes/dropped(mob/user)
+ . = ..()
+ if(user.mind && user.mind.assigned_role == "Clown")
+ GET_COMPONENT_FROM(mood, /datum/component/mood, user)
+ if(mood)
+ mood.add_event("noshoes", /datum/mood_event/noshoes)
+
/obj/item/clothing/shoes/clown_shoes/jester
name = "jester shoes"
desc = "A court jesters shoes, updated with modern squeaking technology."
@@ -229,3 +243,13 @@
desc = "These boots were made for dancing."
icon_state = "bsing"
equip_delay_other = 50
+
+/obj/item/clothing/shoes/bronze
+ name = "bronze boots"
+ desc = "A giant, clunky pair of shoes crudely made out of bronze. Why would anyone wear these?"
+ icon = 'icons/obj/clothing/clockwork_garb.dmi'
+ icon_state = "clockwork_treads"
+
+/obj/item/clothing/shoes/bronze/Initialize()
+ . = ..()
+ AddComponent(/datum/component/squeak, list('sound/machines/clockcult/integration_cog_install.ogg' = 1, 'sound/magic/clockwork/fellowship_armory.ogg' = 1), 50)
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 154f1bffdd..90ae827957 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -587,3 +587,10 @@
icon_state = "bedsheet"
user_vars_to_edit = list("name" = "Spooky Ghost", "real_name" = "Spooky Ghost" , "incorporeal_move" = INCORPOREAL_MOVE_BASIC, "appearance_flags" = KEEP_TOGETHER|TILE_BOUND, "alpha" = 150)
alternate_worn_layer = ABOVE_BODY_FRONT_LAYER //so the bedsheet goes over everything but fire
+
+/obj/item/clothing/suit/bronze
+ name = "bronze suit"
+ desc = "A big and clanky suit made of bronze that offers no protection and looks very unfashionable. Nice."
+ icon = 'icons/obj/clothing/clockwork_garb.dmi'
+ icon_state = "clockwork_cuirass_old"
+ armor = list("melee" = 5, "bullet" = 0, "laser" = -5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 20)
diff --git a/code/modules/error_handler/error_handler.dm b/code/modules/error_handler/error_handler.dm
index 91b004e0e0..304ddce7eb 100644
--- a/code/modules/error_handler/error_handler.dm
+++ b/code/modules/error_handler/error_handler.dm
@@ -2,6 +2,9 @@ GLOBAL_VAR_INIT(total_runtimes, GLOB.total_runtimes || 0)
GLOBAL_VAR_INIT(total_runtimes_skipped, 0)
#ifdef DEBUG
+
+#define ERROR_USEFUL_LEN 2
+
/world/Error(exception/E, datum/e_src)
GLOB.total_runtimes++
diff --git a/code/modules/events/aurora_caelus.dm b/code/modules/events/aurora_caelus.dm
new file mode 100644
index 0000000000..be3108b0ec
--- /dev/null
+++ b/code/modules/events/aurora_caelus.dm
@@ -0,0 +1,62 @@
+/datum/round_event_control/aurora_caelus
+ name = "Aurora Caelus"
+ typepath = /datum/round_event/aurora_caelus
+ max_occurrences = 1
+ weight = 15
+ earliest_start = 5 MINUTES
+
+/datum/round_event_control/aurora_caelus/canSpawnEvent(players, gamemode)
+ if(!CONFIG_GET(flag/starlight))
+ return FALSE
+ return ..()
+
+/datum/round_event/aurora_caelus
+ announceWhen = 1
+ startWhen = 9
+ endWhen = 50
+ var/list/aurora_colors = list("#A2FF80", "#A2FF8B", "#A2FF96", "#A2FFA5", "#A2FFB6", "#A2FFC7", "#A2FFDE")
+ var/aurora_progress = 0 //this cycles from 1 to 7, slowly changing colors from gentle green to gentle blue
+
+/datum/round_event/aurora_caelus/announce()
+ priority_announce("[station_name()]: A harmless cloud of ions is approaching your station, and will exhaust their energy battering the hull. Nanotrasen has approved a short break for all employees to relax and observe this very rare event. During this time, starlight will be bright but gentle, shifting between quiet green and blue colors. Any staff who would like to view these lights for themselves may proceed to the area nearest to them with viewing ports to open space. We hope you enjoy the lights.",
+ sound = 'sound/misc/notice2.ogg',
+ sender_override = "Nanotrasen Meteorology Division")
+ for(var/V in GLOB.player_list)
+ var/mob/M = V
+ if((M.client.prefs.toggles & SOUND_MIDI) && is_station_level(M.z))
+ M.playsound_local(M, 'sound/ambience/aurora_caelus.ogg', 20, FALSE, pressure_affected = FALSE)
+
+/datum/round_event/aurora_caelus/start()
+ for(var/area in GLOB.sortedAreas)
+ var/area/A = area
+ if(initial(A.dynamic_lighting) == DYNAMIC_LIGHTING_IFSTARLIGHT)
+ for(var/turf/open/space/S in A)
+ S.set_light(S.light_range * 3, S.light_power * 0.5)
+
+/datum/round_event/aurora_caelus/tick()
+ if(activeFor % 5 == 0)
+ aurora_progress++
+ var/aurora_color = aurora_colors[aurora_progress]
+ for(var/area in GLOB.sortedAreas)
+ var/area/A = area
+ if(initial(A.dynamic_lighting) == DYNAMIC_LIGHTING_IFSTARLIGHT)
+ for(var/turf/open/space/S in A)
+ S.set_light(l_color = aurora_color)
+
+/datum/round_event/aurora_caelus/end()
+ for(var/area in GLOB.sortedAreas)
+ var/area/A = area
+ if(initial(A.dynamic_lighting) == DYNAMIC_LIGHTING_IFSTARLIGHT)
+ for(var/turf/open/space/S in A)
+ fade_to_black(S)
+ priority_announce("The aurora caelus event is now ending. Starlight conditions will slowly return to normal. When this has concluded, please return to your workplace and continue work as normal. Have a pleasant shift, [station_name()], and thank you for watching with us.",
+ sound = 'sound/misc/notice2.ogg',
+ sender_override = "Nanotrasen Meteorology Division")
+
+/datum/round_event/aurora_caelus/proc/fade_to_black(turf/open/space/S)
+ set waitfor = FALSE
+ var/new_light = initial(S.light_range)
+ while(S.light_range > new_light)
+ S.set_light(S.light_range - 0.2)
+ sleep(30)
+ S.set_light(new_light, initial(S.light_power), initial(S.light_color))
diff --git a/code/modules/events/brand_intelligence.dm b/code/modules/events/brand_intelligence.dm
index 68ec168a1e..c777fea85b 100644
--- a/code/modules/events/brand_intelligence.dm
+++ b/code/modules/events/brand_intelligence.dm
@@ -75,4 +75,4 @@
rebel.shoot_inventory = 1
if(ISMULTIPLE(activeFor, 8))
- originMachine.speak(pick(rampant_speeches))
\ No newline at end of file
+ originMachine.speak(pick(rampant_speeches))
diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm
index c8b8db0681..b19c8358c2 100644
--- a/code/modules/events/disease_outbreak.dm
+++ b/code/modules/events/disease_outbreak.dm
@@ -39,10 +39,10 @@
continue
if(H.stat == DEAD)
continue
- if(VIRUSIMMUNE in H.dna.species.species_traits) //Don't pick someone who's virus immune, only for it to not do anything.
+ if(H.has_trait(TRAIT_VIRUSIMMUNE)) //Don't pick someone who's virus immune, only for it to not do anything.
continue
var/foundAlready = FALSE // don't infect someone that already has a disease
- for(var/thing in H.viruses)
+ for(var/thing in H.diseases)
foundAlready = TRUE
break
if(foundAlready)
@@ -63,7 +63,7 @@
else
D = make_virus(max_severity, max_severity)
D.carrier = TRUE
- H.AddDisease(D)
+ H.ForceContractDisease(D, FALSE, TRUE)
if(advanced_virus)
var/datum/disease/advance/A = D
@@ -75,10 +75,9 @@
break
/datum/round_event/disease_outbreak/proc/make_virus(max_symptoms, max_level)
- if(max_symptoms > SYMPTOM_LIMIT)
- max_symptoms = SYMPTOM_LIMIT
- var/datum/disease/advance/A = new(FALSE, null)
- A.symptoms = list()
+ if(max_symptoms > VIRUS_SYMPTOM_LIMIT)
+ max_symptoms = VIRUS_SYMPTOM_LIMIT
+ var/datum/disease/advance/A = new /datum/disease/advance()
var/list/datum/symptom/possible_symptoms = list()
for(var/symptom in subtypesof(/datum/symptom))
var/datum/symptom/S = symptom
diff --git a/code/modules/events/heart_attack.dm b/code/modules/events/heart_attack.dm
index ebe7dd5bfd..7f9c09dfd9 100644
--- a/code/modules/events/heart_attack.dm
+++ b/code/modules/events/heart_attack.dm
@@ -8,7 +8,7 @@
/datum/round_event/heart_attack/start()
var/list/heart_attack_contestants = list()
for(var/mob/living/carbon/human/H in shuffle(GLOB.player_list))
- if(!H.client || H.stat == DEAD || H.InCritical() || !H.can_heartattack() || H.has_status_effect(STATUS_EFFECT_EXERCISED) || (/datum/disease/heart_failure in H.viruses) || H.undergoing_cardiac_arrest())
+ if(!H.client || H.stat == DEAD || H.InCritical() || !H.can_heartattack() || H.has_status_effect(STATUS_EFFECT_EXERCISED) || (/datum/disease/heart_failure in H.diseases) || H.undergoing_cardiac_arrest())
continue
if(H.satiety <= -60) //Multiple junk food items recently
heart_attack_contestants[H] = 3
@@ -17,6 +17,6 @@
if(LAZYLEN(heart_attack_contestants))
var/mob/living/carbon/human/winner = pickweight(heart_attack_contestants)
- var/datum/disease/D = new /datum/disease/heart_failure
- winner.ForceContractDisease(D)
- notify_ghosts("[winner] is beginning to have a heart attack!", enter_link="(Click to orbit) ", source=winner, action=NOTIFY_ORBIT)
\ No newline at end of file
+ var/datum/disease/D = new /datum/disease/heart_failure()
+ winner.ForceContractDisease(D, FALSE, TRUE)
+ notify_ghosts("[winner] is beginning to have a heart attack!", enter_link="(Click to orbit) ", source=winner, action=NOTIFY_ORBIT)
diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm
index b43b5892ea..693e194d1c 100644
--- a/code/modules/events/pirates.dm
+++ b/code/modules/events/pirates.dm
@@ -9,6 +9,12 @@
earliest_start = 30 MINUTES
gamemode_blacklist = list("nuclear")
+/datum/round_event_control/pirates/preRunEvent()
+ if (!SSmapping.empty_space)
+ return EVENT_CANT_RUN
+
+ return ..()
+
/datum/round_event/pirates
startWhen = 60 //2 minutes to answer
var/datum/comm_message/threat
diff --git a/code/modules/events/processor_overload.dm b/code/modules/events/processor_overload.dm
index 486065140e..74d9bb273e 100644
--- a/code/modules/events/processor_overload.dm
+++ b/code/modules/events/processor_overload.dm
@@ -27,14 +27,12 @@
/datum/round_event/processor_overload/start()
- for(var/obj/machinery/telecomms/T in GLOB.telecomms_list)
- if(istype(T, /obj/machinery/telecomms/processor))
- var/obj/machinery/telecomms/processor/P = T
- if(prob(10))
- // Damage the surrounding area to indicate that it popped
- explosion(get_turf(P), 0, 0, 2)
- // Only a level 1 explosion actually damages the machine
- // at all
- P.ex_act(EXPLODE_DEVASTATE)
- else
- P.emp_act(EMP_HEAVY)
+ for(var/obj/machinery/telecomms/processor/P in GLOB.telecomms_list)
+ if(prob(10))
+ // Damage the surrounding area to indicate that it popped
+ explosion(get_turf(P), 0, 0, 2)
+ // Only a level 1 explosion actually damages the machine
+ // at all
+ P.ex_act(EXPLODE_DEVASTATE)
+ else
+ P.emp_act(EMP_HEAVY)
diff --git a/code/modules/events/solar_flare.dm b/code/modules/events/solar_flare.dm
deleted file mode 100644
index 5f64570c7d..0000000000
--- a/code/modules/events/solar_flare.dm
+++ /dev/null
@@ -1,17 +0,0 @@
-/datum/round_event_control/solar_flare
- name = "Solar Flare"
- typepath = /datum/round_event/solar_flare
- max_occurrences = 1
-
-/datum/round_event/solar_flare
-
-/datum/round_event/solar_flare/setup()
- startWhen = 3
- endWhen = startWhen + 1
- announceWhen = 1
-
-/datum/round_event/solar_flare/announce()
- priority_announce("Incoming solar flare detected near the station. Expect power outages in all exposed areas for a short duration.", "Anomaly Alert", 'sound/effects/alert.ogg')
-
-/datum/round_event/solar_flare/start()
- SSweather.run_weather("solar flare",1)
diff --git a/code/modules/events/spontaneous_appendicitis.dm b/code/modules/events/spontaneous_appendicitis.dm
index dfceb682cd..1407a98518 100644
--- a/code/modules/events/spontaneous_appendicitis.dm
+++ b/code/modules/events/spontaneous_appendicitis.dm
@@ -18,12 +18,12 @@
if(!H.getorgan(/obj/item/organ/appendix)) //Don't give the disease to some who lacks it, only for it to be auto-cured
continue
var/foundAlready = FALSE //don't infect someone that already has appendicitis
- for(var/datum/disease/appendicitis/A in H.viruses)
+ for(var/datum/disease/appendicitis/A in H.diseases)
foundAlready = TRUE
break
if(foundAlready)
continue
- var/datum/disease/D = new /datum/disease/appendicitis
- H.ForceContractDisease(D)
+ var/datum/disease/D = new /datum/disease/appendicitis()
+ H.ForceContractDisease(D, FALSE, TRUE)
break
\ No newline at end of file
diff --git a/code/modules/fields/timestop.dm b/code/modules/fields/timestop.dm
index 232e3c5dce..11a5d416e7 100644
--- a/code/modules/fields/timestop.dm
+++ b/code/modules/fields/timestop.dm
@@ -29,6 +29,9 @@
for(var/mob/living/L in GLOB.player_list)
if(locate(/obj/effect/proc_holder/spell/aoe_turf/conjure/timestop) in L.mind.spell_list) //People who can stop time are immune to its effects
immune[L] = TRUE
+ for(var/mob/living/simple_animal/hostile/guardian/G in GLOB.parasites)
+ if(G.summoner && locate(/obj/effect/proc_holder/spell/aoe_turf/conjure/timestop) in G.summoner.mind.spell_list) //It would only make sense that a person's stand would also be immune.
+ immune[G] = TRUE
if(start)
timestop()
diff --git a/code/modules/fields/turf_objects.dm b/code/modules/fields/turf_objects.dm
index edb1a6ce6b..7d7454f46a 100644
--- a/code/modules/fields/turf_objects.dm
+++ b/code/modules/fields/turf_objects.dm
@@ -74,4 +74,4 @@
return FIELD_EDGE
if(O.parent == F)
return FIELD_TURF
- return NO_FIELD
+ return FALSE
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index f334368a7a..c912a9b4e8 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -1197,3 +1197,28 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
H.preparePixelProjectile(target, start)
H.fire()
qdel(src)
+
+//Reality Dissociation Syndrome hallucinations only trigger in special cases and have no cost
+/datum/hallucination/rds
+ cost = 0
+
+/datum/hallucination/rds/fourth_wall/New(mob/living/carbon/C, forced = TRUE)
+ ..()
+ to_chat(C, "[pick("Leave the server" , "Close the game window")] [pick("immediately", "right now")]. ")
+
+/datum/hallucination/rds/supermatter/New(mob/living/carbon/C, forced = TRUE)
+ ..()
+ SEND_SOUND(C, 'sound/magic/charge.ogg')
+ to_chat(C, "You feel reality distort for a moment... ")
+
+/datum/hallucination/rds/narsie/New(mob/living/carbon/C, forced = TRUE)
+ C.playsound_local(C, 'sound/creatures/narsie_rises.ogg', 50, FALSE, pressure_affected = FALSE)
+ to_chat(C, "NAR-SIE HAS RISEN ")
+
+/datum/hallucination/rds/ark/New(mob/living/carbon/C, forced = TRUE)
+ set waitfor = FALSE
+ ..()
+ C.playsound_local(C, 'sound/machines/clockcult/ark_deathrattle.ogg', 50, FALSE, pressure_affected = FALSE)
+ C.playsound_local(C, 'sound/effects/clockcult_gateway_disrupted.ogg', 50, FALSE, pressure_affected = FALSE)
+ sleep(27)
+ C.playsound_local(C, 'sound/effects/explosion_distant.ogg', 50, FALSE, pressure_affected = FALSE)
diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm
index 637c6c279d..bbc56f9fe4 100644
--- a/code/modules/food_and_drinks/drinks/drinks.dm
+++ b/code/modules/food_and_drinks/drinks/drinks.dm
@@ -21,7 +21,7 @@
else
gulp_size = max(round(reagents.total_volume / 5), 5)
-/obj/item/reagent_containers/food/drinks/attack(mob/M, mob/user, def_zone)
+/obj/item/reagent_containers/food/drinks/attack(mob/living/M, mob/user, def_zone)
if(!reagents || !reagents.total_volume)
to_chat(user, "[src] is empty! ")
@@ -36,6 +36,8 @@
if(M == user)
to_chat(M, "You swallow a gulp of [src]. ")
+ if(M.has_trait(TRAIT_VORACIOUS))
+ M.changeNext_move(CLICK_CD_MELEE * 0.5) //chug! chug! chug!
else
M.visible_message("[user] attempts to feed the contents of [src] to [M]. ", "[user] attempts to feed the contents of [src] to [M]. ")
diff --git a/code/modules/food_and_drinks/food.dm b/code/modules/food_and_drinks/food.dm
index 5e05e85a28..4e38cb81d9 100644
--- a/code/modules/food_and_drinks/food.dm
+++ b/code/modules/food_and_drinks/food.dm
@@ -19,13 +19,27 @@
if(last_check_time + 50 < world.time)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(foodtype & H.dna.species.toxic_food)
- to_chat(H,"What the hell was that thing?! ")
- H.adjust_disgust(25 + 30 * fraction)
- else if(foodtype & H.dna.species.disliked_food)
- to_chat(H,"That didn't taste very good... ")
- H.adjust_disgust(11 + 15 * fraction)
- else if(foodtype & H.dna.species.liked_food)
- to_chat(H,"I love this taste! ")
- H.adjust_disgust(-5 + -2.5 * fraction)
+ if(!H.has_trait(TRAIT_AGEUSIA))
+ if(foodtype & H.dna.species.toxic_food)
+ to_chat(H,"What the hell was that thing?! ")
+ H.adjust_disgust(25 + 30 * fraction)
+ GET_COMPONENT_FROM(mood, /datum/component/mood, H)
+ if(mood)
+ mood.add_event("toxic_food", /datum/mood_event/disgusting_food)
+ else if(foodtype & H.dna.species.disliked_food)
+ to_chat(H,"That didn't taste very good... ")
+ H.adjust_disgust(11 + 15 * fraction)
+ GET_COMPONENT_FROM(mood, /datum/component/mood, H)
+ if(mood)
+ mood.add_event("gross_food", /datum/mood_event/gross_food)
+ else if(foodtype & H.dna.species.liked_food)
+ to_chat(H,"I love this taste! ")
+ H.adjust_disgust(-5 + -2.5 * fraction)
+ GET_COMPONENT_FROM(mood, /datum/component/mood, H)
+ if(mood)
+ mood.add_event("fav_food", /datum/mood_event/favorite_food)
+ else
+ if(foodtype & H.dna.species.toxic_food)
+ to_chat(H, "You don't feel so good... ")
+ H.adjust_disgust(25 + 30 * fraction)
last_check_time = world.time
diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
index b46165cb80..c8b9a2bd17 100644
--- a/code/modules/food_and_drinks/food/snacks.dm
+++ b/code/modules/food_and_drinks/food/snacks.dm
@@ -50,7 +50,7 @@
return
-/obj/item/reagent_containers/food/snacks/attack(mob/M, mob/user, def_zone)
+/obj/item/reagent_containers/food/snacks/attack(mob/living/M, mob/user, def_zone)
if(user.a_intent == INTENT_HARM)
return ..()
if(!eatverb)
@@ -82,6 +82,8 @@
else if(fullness > (600 * (1 + M.overeatduration / 2000))) // The more you eat - the more you can eat
to_chat(M, "You cannot force any more of \the [src] to go down your throat! ")
return 0
+ if(M.has_trait(TRAIT_VORACIOUS))
+ M.changeNext_move(CLICK_CD_MELEE * 0.5) //nom nom nom
else
if(!isbrain(M)) //If you're feeding it to someone else.
if(fullness <= (600 * (1 + M.overeatduration / 1000)))
diff --git a/code/modules/food_and_drinks/food/snacks_meat.dm b/code/modules/food_and_drinks/food/snacks_meat.dm
index bb74b36053..cbe93f7003 100644
--- a/code/modules/food_and_drinks/food/snacks_meat.dm
+++ b/code/modules/food_and_drinks/food/snacks_meat.dm
@@ -113,6 +113,7 @@
list_reagents = list("nutriment" = 6, "vitamin" = 1)
tastes = list("meat" = 1)
foodtype = MEAT
+ var/roasted = FALSE
/obj/item/reagent_containers/food/snacks/sausage/Initialize()
. = ..()
@@ -187,7 +188,7 @@
visible_message("[src] expands! ")
var/mob/spammer = get_mob_by_key(fingerprintslast)
var/mob/living/carbon/monkey/bananas = new(drop_location())
- bananas.log_message("Spawned via [src] at [COORD(src)], Last attached mob: [key_name(spammer)].", INDIVIDUAL_ATTACK_LOG)
+ bananas.log_message("Spawned via [src] at [COORD(src)], Last attached mob: [key_name(spammer)].", INDIVIDUAL_ATTACK_LOG)
qdel(src)
/obj/item/reagent_containers/food/snacks/enchiladas
diff --git a/code/modules/food_and_drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm
index 0139ab116c..6bc5edf096 100644
--- a/code/modules/food_and_drinks/food/snacks_pastry.dm
+++ b/code/modules/food_and_drinks/food/snacks_pastry.dm
@@ -459,4 +459,4 @@
. = O.attack(M, user, def_zone, FALSE)
update_icon()
-#undef PANCAKE_MAX_STACK
\ No newline at end of file
+#undef PANCAKE_MAX_STACK
diff --git a/code/modules/food_and_drinks/food/snacks_pie.dm b/code/modules/food_and_drinks/food/snacks_pie.dm
index faffdf5383..1f755e24b2 100644
--- a/code/modules/food_and_drinks/food/snacks_pie.dm
+++ b/code/modules/food_and_drinks/food/snacks_pie.dm
@@ -56,6 +56,9 @@
if(!H.creamed) // one layer at a time
H.add_overlay(creamoverlay)
H.creamed = TRUE
+ GET_COMPONENT_FROM(mood, /datum/component/mood, H)
+ if(mood)
+ mood.add_event("creampie", /datum/mood_event/creampie)
qdel(src)
/obj/item/reagent_containers/food/snacks/pie/cream/nostun
@@ -244,4 +247,4 @@
icon_state = "frostypie"
bonus_reagents = list("nutriment" = 4, "vitamin" = 6)
tastes = list("mint" = 1, "pie" = 1)
- foodtype = GRAIN | FRUIT | SUGAR
\ No newline at end of file
+ foodtype = GRAIN | FRUIT | SUGAR
diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
index cfbc95d7c0..d816504bc5 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
@@ -381,7 +381,7 @@
return TRUE
if(!O.reagents || !O.reagents.reagent_list.len) // other empty containers not accepted
return FALSE
- if(istype(O, /obj/item/reagent_containers/syringe) || istype(O, /obj/item/reagent_containers/glass/bottle) || istype(O, /obj/item/reagent_containers/glass/beaker) || istype(O, /obj/item/reagent_containers/spray))
+ if(istype(O, /obj/item/reagent_containers/syringe) || istype(O, /obj/item/reagent_containers/glass/bottle) || istype(O, /obj/item/reagent_containers/glass/beaker) || istype(O, /obj/item/reagent_containers/spray) || istype(O, /obj/item/reagent_containers/medspray))
return TRUE
return FALSE
diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm
index 3ac4ec1cab..65a08d8074 100644
--- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm
+++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm
@@ -78,11 +78,17 @@
results = list("gintonic" = 3)
required_reagents = list("gin" = 2, "tonic" = 1)
+/datum/chemical_reaction/rum_coke
+ name = "Rum and Coke"
+ id = "rumcoke"
+ results = list("rumcoke" = 3)
+ required_reagents = list("rum" = 2, "cola" = 1)
+
/datum/chemical_reaction/cuba_libre
name = "Cuba Libre"
id = "cubalibre"
- results = list("cubalibre" = 3)
- required_reagents = list("rum" = 2, "cola" = 1)
+ results = list("cubalibre" = 4)
+ required_reagents = list("rumcoke" = 3, "limejuice" = 1)
/datum/chemical_reaction/martini
name = "Classic Martini"
diff --git a/code/modules/goonchat/browserOutput.dm b/code/modules/goonchat/browserOutput.dm
index 10b1fcd80d..401e55c9e5 100644
--- a/code/modules/goonchat/browserOutput.dm
+++ b/code/modules/goonchat/browserOutput.dm
@@ -125,11 +125,16 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic
C << output("[data]", "[window]:ehjaxCallback")
/datum/chatOutput/proc/sendMusic(music, pitch)
+ if(!findtext(music, GLOB.is_http_protocol))
+ return
var/list/music_data = list("adminMusic" = url_encode(url_encode(music)))
if(pitch)
music_data["musicRate"] = pitch
ehjax_send(data = music_data)
+/datum/chatOutput/proc/stopMusic()
+ ehjax_send(data = "stopMusic")
+
/datum/chatOutput/proc/setMusicVolume(volume = "")
if(volume)
adminMusicVolume = CLAMP(text2num(volume), 0, 100)
diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css
index d2f81e497e..778e16a831 100644
--- a/code/modules/goonchat/browserassets/css/browserOutput.css
+++ b/code/modules/goonchat/browserassets/css/browserOutput.css
@@ -316,6 +316,7 @@ h1.alert, h2.alert {color: #000000;}
.unconscious {color: #0000ff; font-weight: bold;}
.suicide {color: #ff5050; font-style: italic;}
.green {color: #03ff39;}
+.nicegreen {color: #14a833;}
.shadowling {color: #3b2769;}
.cult {color: #960000;}
diff --git a/code/modules/goonchat/browserassets/js/browserOutput.js b/code/modules/goonchat/browserassets/js/browserOutput.js
index 77aae1148a..478ddcccdd 100644
--- a/code/modules/goonchat/browserassets/js/browserOutput.js
+++ b/code/modules/goonchat/browserassets/js/browserOutput.js
@@ -442,6 +442,8 @@ function ehjaxCallback(data) {
} else if (data == 'roundrestart') {
opts.restarting = true;
internalOutput('The connection has been closed because the server is restarting. Please wait while you automatically reconnect.
', 'internal');
+ } else if (data == 'stopMusic') {
+ $('#adminMusic').prop('src', '');
} else {
//Oh we're actually being sent data instead of an instruction
var dataJ;
diff --git a/code/modules/holodeck/computer_funcs.dm b/code/modules/holodeck/computer_funcs.dm
deleted file mode 100644
index 65741eafea..0000000000
--- a/code/modules/holodeck/computer_funcs.dm
+++ /dev/null
@@ -1,111 +0,0 @@
-/obj/machinery/computer/holodeck/attack_hand(var/mob/user as mob)
- user.set_machine(src)
-
- var/dat = "Current Loaded Programs "
- dat += "Power Off "
- for(var/area/A in program_cache)
- dat += "[A.name] "
- if(emagged && emag_programs.len)
- dat += "SUPERVISOR ACCESS - SAFETY PROTOCOLS DISABLED - CAUTION: EMITTER ANOMALY "
- for(var/area/A in emag_programs)
- dat += "[A.name] "
-
- var/datum/browser/popup = new(user, "computer", name, 400, 500)
- popup.set_content(dat)
- popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
- popup.open()
- return
-
-/obj/machinery/computer/holodeck/attack_ai(var/mob/user as mob)
- var/dat = "Current Loaded Programs "
-
- dat += "Power Off "
- for(var/area/A in program_cache)
- dat += "[A.name] "
-
- if(emag_programs.len)
- dat += " "
- if(emagged)
- dat += "Safety protocol: Offline Engage "
- for(var/area/A in emag_programs)
- dat += "[A.name] "
- else
- dat += "Safety protocol: Online Disengage "
-
- var/datum/browser/popup = new(user, "computer", name, 400, 500)
- popup.set_content(dat)
- popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
- popup.open()
-
-
-/obj/machinery/computer/holodeck/proc/load_program(var/area/A, var/force = 0, var/delay = 0)
- if(stat)
- A = offline_program
- force = 1
- delay = 0
- if(program == A)
- return
- if(world.time < (last_change + 25 + (damaged?500:0)) && !force)
- if(delay)
- sleep(25)
- else
- if(world.time < (last_change + 15))//To prevent super-spam clicking, reduced process size and annoyance -Sieve
- return
- if(get_dist(usr,src) <= 3)
- to_chat(usr, "ERROR. Recalibrating projection apparatus. ")
- return
-
- last_change = world.time
- active = (A != offline_program)
- use_power = active ? ACTIVE_POWER_USE : IDLE_POWER_USE
-
- for(var/obj/effect/holodeck_effect/HE in effects)
- HE.deactivate(src)
-
- for(var/item in spawned)
- derez(item, forced=force)
-
- program = A
- // note nerfing does not yet work on guns, should
- // should also remove/limit/filter reagents?
- // this is an exercise left to others I'm afraid. -Sayu
- spawned = A.copy_contents_to(linked, 1, nerf_weapons = !emagged)
- for(var/obj/machinery/M in spawned)
- M.flags_1 |= NODECONSTRUCT_1
- for(var/obj/structure/S in spawned)
- S.flags_1 |= NODECONSTRUCT_1
- effects = list()
-
- spawn(30)
- var/list/added = list()
- for(var/obj/effect/holodeck_effect/HE in spawned)
- effects += HE
- spawned -= HE
- var/atom/x = HE.activate(src)
- if(istype(x) || islist(x))
- spawned += x // holocarp are not forever
- added += x
- for(var/obj/machinery/M in added)
- M.flags_1 |= NODECONSTRUCT_1
- for(var/obj/structure/S in added)
- S.flags_1 |= NODECONSTRUCT_1
-
-/obj/machinery/computer/holodeck/proc/derez(var/obj/obj, var/silent = 1, var/forced = 0)
- // Emagging a machine creates an anomaly in the derez systems.
- if(obj && src.emagged && !src.stat && !forced)
- if((ismob(obj) || istype(obj.loc,/mob)) && prob(50))
- spawn(50) .(obj,silent) // may last a disturbingly long time
- return
- spawned.Remove(obj)
-
- if(!obj)
- return
- var/turf/T = get_turf(obj)
- for(var/atom/movable/AM in obj.contents) // these should be derezed if they were generated
- AM.loc = T
- if(ismob(AM))
- silent = FALSE // otherwise make sure they are dropped
-
- if(!silent)
- visible_message("The [obj.name] fades away!")
- qdel(obj)
diff --git a/code/modules/hydroponics/grown/mushrooms.dm b/code/modules/hydroponics/grown/mushrooms.dm
index b1ac5604b4..352d4eff7b 100644
--- a/code/modules/hydroponics/grown/mushrooms.dm
+++ b/code/modules/hydroponics/grown/mushrooms.dm
@@ -23,9 +23,6 @@
growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi'
reagents_add = list("morphine" = 0.35, "charcoal" = 0.35, "nutriment" = 0)
-
-
-
/obj/item/reagent_containers/food/snacks/grown/mushroom/reishi
seed = /obj/item/seeds/reishi
name = "reishi"
diff --git a/code/modules/hydroponics/grown/nettle.dm b/code/modules/hydroponics/grown/nettle.dm
index 9ec936c1f2..bb1a0d2f23 100644
--- a/code/modules/hydroponics/grown/nettle.dm
+++ b/code/modules/hydroponics/grown/nettle.dm
@@ -56,11 +56,8 @@
var/mob/living/carbon/C = user
if(C.gloves)
return FALSE
- if(ishuman(C))
- var/mob/living/carbon/human/H = C
- if(H.dna && H.dna.species)
- if(PIERCEIMMUNE in H.dna.species.species_traits)
- return FALSE
+ if(C.has_trait(TRAIT_PIERCEIMMUNE))
+ return FALSE
var/hit_zone = (C.held_index_to_dir(C.active_hand_index) == "l" ? "l_":"r_") + "arm"
var/obj/item/bodypart/affecting = C.get_bodypart(hit_zone)
if(affecting)
diff --git a/code/modules/hydroponics/grown/replicapod.dm b/code/modules/hydroponics/grown/replicapod.dm
index bb928c6fa5..3c49b113e9 100644
--- a/code/modules/hydroponics/grown/replicapod.dm
+++ b/code/modules/hydroponics/grown/replicapod.dm
@@ -20,6 +20,7 @@
var/blood_type = null
var/list/features = null
var/factions = null
+ var/list/traits = null
var/contains_sample = 0
/obj/item/seeds/replicapod/attackby(obj/item/W, mob/user, params)
@@ -34,6 +35,7 @@
blood_type = bloodSample.data["blood_type"]
features = bloodSample.data["features"]
factions = bloodSample.data["factions"]
+ traits = bloodSample.data["traits"]
W.reagents.clear_reagents()
to_chat(user, "You inject the contents of the syringe into the seeds. ")
contains_sample = 1
@@ -99,6 +101,8 @@
podman.faction |= factions
if(!features["mcolor"])
features["mcolor"] = "#59CE00"
+ for(var/V in traits)
+ new V(podman)
podman.hardset_dna(null,null,podman.real_name,blood_type, new /datum/species/pod,features)//Discard SE's and UI's, podman cloning is inaccurate, and always make them a podman
podman.set_cloned_appearance()
diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm
index 399debfe95..71605fc0dc 100644
--- a/code/modules/integrated_electronics/core/assemblies.dm
+++ b/code/modules/integrated_electronics/core/assemblies.dm
@@ -3,6 +3,7 @@
/obj/item/device/electronic_assembly
name = "electronic assembly"
+ obj_flags = CAN_BE_HIT
desc = "It's a case, for building small electronics with."
w_class = WEIGHT_CLASS_SMALL
icon = 'icons/obj/assemblies/electronic_setups.dmi'
@@ -20,6 +21,8 @@
var/charge_tick = FALSE
var/charge_delay = 4
var/use_cyborg_cell = TRUE
+ var/ext_next_use = 0
+ var/atom/movable/collw
var/allowed_circuit_action_flags = IC_ACTION_COMBAT | IC_ACTION_LONG_RANGE //which circuit flags are allowed
var/combat_circuits = 0 //number of combat cicuits in the assembly, used for diagnostic hud
var/long_range_circuits = 0 //number of long range cicuits in the assembly, used for diagnostic hud
@@ -31,6 +34,9 @@
/obj/item/device/electronic_assembly/proc/check_interactivity(mob/user)
return user.canUseTopic(src, BE_CLOSE)
+/obj/item/device/electronic_assembly/CollidedWith(atom/movable/AM)
+ collw = AM
+ ..()
/obj/item/device/electronic_assembly/Initialize()
.=..()
diff --git a/code/modules/integrated_electronics/core/integrated_circuit.dm b/code/modules/integrated_electronics/core/integrated_circuit.dm
index ce55a50151..1b99b00765 100644
--- a/code/modules/integrated_electronics/core/integrated_circuit.dm
+++ b/code/modules/integrated_electronics/core/integrated_circuit.dm
@@ -15,7 +15,8 @@
var/next_use = 0 // Uses world.time
var/complexity = 1 // This acts as a limitation on building machines, more resource-intensive components cost more 'space'.
var/size = 1 // This acts as a limitation on building machines, bigger components cost more 'space'. -1 for size 0
- var/cooldown_per_use = 9 // Circuits are limited in how many times they can be work()'d by this variable.
+ var/cooldown_per_use = 1 // Circuits are limited in how many times they can be work()'d by this variable.
+ var/ext_cooldown = 0 // Circuits are limited in how many times they can be work()'d with external world by this variable.
var/power_draw_per_use = 0 // How much power is drawn when work()'d.
var/power_draw_idle = 0 // How much power is drawn when doing nothing.
var/spawn_flags // Used for world initializing, see the #defines above.
@@ -212,6 +213,9 @@ a creative player the means to solve many problems. Circuits are held inside an
HTML += ""
HTML += "Complexity: [complexity] "
+ HTML += "Cooldown per use: [cooldown_per_use/10] sec "
+ if(ext_cooldown)
+ HTML += "External manipulation cooldown: [ext_cooldown/10] sec "
if(power_draw_idle)
HTML += "Power Draw: [power_draw_idle] W (Idle) "
if(power_draw_per_use)
@@ -301,11 +305,15 @@ a creative player the means to solve many problems. Circuits are held inside an
/obj/item/integrated_circuit/proc/check_then_do_work(ord,var/ignore_power = FALSE)
if(world.time < next_use) // All intergrated circuits have an internal cooldown, to protect from spam.
return FALSE
+ if(assembly && ext_cooldown && (world.time < assembly.ext_next_use)) // Some circuits have external cooldown, to protect from spam.
+ return FALSE
if(power_draw_per_use && !ignore_power)
if(!check_power())
power_fail()
return FALSE
next_use = world.time + cooldown_per_use
+ if(assembly)
+ assembly.ext_next_use = world.time + ext_cooldown
do_work(ord)
return TRUE
diff --git a/code/modules/integrated_electronics/core/printer.dm b/code/modules/integrated_electronics/core/printer.dm
index e1ec172710..5576b42afc 100644
--- a/code/modules/integrated_electronics/core/printer.dm
+++ b/code/modules/integrated_electronics/core/printer.dm
@@ -12,7 +12,7 @@
var/debug = FALSE // If it's upgraded and can clone, even without config settings.
var/current_category = null
var/cloning = FALSE // If the printer is currently creating a circuit
- var/clone_countdown = 0 // This counts down when cloning is in progress, and clones the circuit when it's ready
+ var/clone_countdown = 0 // Timestamp for when to print the circuit
var/recycling = FALSE // If an assembly is being emptied into this printer
var/list/program // Currently loaded save, in form of list
@@ -27,6 +27,8 @@
/obj/item/device/integrated_circuit_printer/debug //translation: "integrated_circuit_printer/local_server"
name = "debug circuit printer"
debug = TRUE
+ upgraded = TRUE
+ can_clone = TRUE
w_class = WEIGHT_CLASS_TINY
/obj/item/device/integrated_circuit_printer/Initialize()
@@ -40,8 +42,7 @@
/obj/item/device/integrated_circuit_printer/process()
if(!cloning)
STOP_PROCESSING(SSprocessing, src)
- clone_countdown--
- if(!clone_countdown || fast_clone)
+ if(world.time >= clone_countdown || fast_clone)
var/turf/T = get_turf(src)
T.visible_message("[src] has finished printing its assembly! ")
playsound(get_turf(T), 'sound/items/poster_being_created.ogg', 50, TRUE)
@@ -56,7 +57,6 @@
return TRUE
to_chat(user, "You install [O] into [src]. ")
upgraded = TRUE
- qdel(O)
interact(user)
return TRUE
@@ -66,7 +66,6 @@
return TRUE
to_chat(user, "You install [O] into [src]. Circuit cloning will now be instant. ")
fast_clone = TRUE
- qdel(O)
interact(user)
return TRUE
@@ -142,7 +141,7 @@
if(!program)
HTML += " {[fast_clone ? "Print" : "Begin Printing"] Assembly}"
else if(cloning)
- HTML += " {Cancel Print} - [clone_countdown] second(s) remaining until completion"
+ HTML += " {Cancel Print} - [DisplayTimeText(max(0, clone_countdown - world.time))] remaining until completion"
else
HTML += " {[fast_clone ? "Print" : "Begin Printing"] Assembly} "
@@ -273,11 +272,11 @@
if(!materials.use_amount_type(program["metal_cost"], MAT_METAL))
to_chat(usr, "You need [program["metal_cost"]] metal to build that! ")
return
- var/cloning_time = program["metal_cost"] / 150
+ var/cloning_time = round(program["metal_cost"] / 15)
cloning_time = min(cloning_time, MAX_CIRCUIT_CLONE_TIME)
cloning = TRUE
- clone_countdown = cloning_time
- to_chat(usr, "You begin printing a custom assembly. This will take approximately [round(cloning_time / 60, 0.1)] minute(s). You can still print \
+ clone_countdown = world.time + cloning_time
+ to_chat(usr, "You begin printing a custom assembly. This will take approximately [DisplayTimeText(cloning_time)]. You can still print \
off normal parts during this time. ")
playsound(src, 'sound/items/poster_being_created.ogg', 50, TRUE)
START_PROCESSING(SSprocessing, src)
diff --git a/code/modules/integrated_electronics/passive/power.dm b/code/modules/integrated_electronics/passive/power.dm
index f7df21fc9a..186a2df257 100644
--- a/code/modules/integrated_electronics/passive/power.dm
+++ b/code/modules/integrated_electronics/passive/power.dm
@@ -97,11 +97,15 @@
activators = list()
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
var/volume = 60
- var/list/fuel = list("plasma" = 10000, "welding_fuel" = 3000, "carbon" = 2000, "ethanol" = 2000, "nutriment" = 1600, "blood" = 1000)
+ var/list/fuel = list("plasma" = 50000, "welding_fuel" = 15000, "carbon" = 10000, "ethanol" = 10000, "nutriment" = 8000)
+ var/multi = 1
+ var/lfwb =TRUE
/obj/item/integrated_circuit/passive/power/chemical_cell/New()
..()
create_reagents(volume)
+ extended_desc +="But no fuel can be compared with blood of living human."
+
/obj/item/integrated_circuit/passive/power/chemical_cell/interact(mob/user)
set_pin_data(IC_OUTPUT, 2, WEAKREF(src))
@@ -115,7 +119,18 @@
/obj/item/integrated_circuit/passive/power/chemical_cell/make_energy()
if(assembly)
if(assembly.battery)
+ var/bp = 5000
+ if(reagents.get_reagent_amount("blood")) //only blood is powerful enough to power the station(c)
+ var/datum/reagent/blood/B = locate() in reagents.reagent_list
+ if(lfwb)
+ if(B && B.data["cloneable"])
+ var/mob/M = B.data["donor"]
+ if(M && M.stat != DEAD && M.client)
+ bp = 500000
+ if((assembly.battery.maxcharge-assembly.battery.charge) / GLOB.CELLRATE > bp)
+ if(reagents.remove_reagent("blood", 1))
+ assembly.give_power(bp)
for(var/I in fuel)
if((assembly.battery.maxcharge-assembly.battery.charge) / GLOB.CELLRATE > fuel[I])
if(reagents.remove_reagent(I, 1))
- assembly.give_power(fuel[I])
+ assembly.give_power(fuel[I]*multi)
diff --git a/code/modules/integrated_electronics/subtypes/access.dm b/code/modules/integrated_electronics/subtypes/access.dm
new file mode 100644
index 0000000000..0f0626057a
--- /dev/null
+++ b/code/modules/integrated_electronics/subtypes/access.dm
@@ -0,0 +1,37 @@
+/obj/item/integrated_circuit/input/card_reader
+ name = "card reader"
+ desc = "A circuit that can read registred name, assignment and a PassKey string from an ID card."
+ icon_state = "card_reader"
+
+ complexity = 4
+ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
+ outputs = list(
+ "registered name" = IC_PINTYPE_STRING,
+ "assignment" = IC_PINTYPE_STRING,
+ "passkey" = IC_PINTYPE_STRING
+ )
+ activators = list(
+ "on read" = IC_PINTYPE_PULSE_OUT
+ )
+
+/obj/item/integrated_circuit/input/card_reader/attackby_react(obj/item/I, mob/living/user, intent)
+ var/obj/item/card/id/card = I.GetID()
+ var/list/access = I.GetAccess()
+ var/passkey = strtohex(XorEncrypt(json_encode(access), SScircuit.cipherkey))
+
+ if(card) // An ID card.
+ set_pin_data(IC_OUTPUT, 1, card.registered_name)
+ set_pin_data(IC_OUTPUT, 2, card.assignment)
+
+ else if(length(access)) // A non-card object that has access levels.
+ set_pin_data(IC_OUTPUT, 1, null)
+ set_pin_data(IC_OUTPUT, 2, null)
+
+ else
+ return FALSE
+
+ set_pin_data(IC_OUTPUT, 3, passkey)
+
+ push_data()
+ activate_pin(1)
+ return TRUE
diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm
index 6eb0dd0a1e..c666f05d88 100644
--- a/code/modules/integrated_electronics/subtypes/input.dm
+++ b/code/modules/integrated_electronics/subtypes/input.dm
@@ -416,6 +416,7 @@
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
power_draw_per_use = 30
var/radius = 1
+ cooldown_per_use = 10
/obj/item/integrated_circuit/input/advanced_locator_list/on_data_written()
var/rad = get_pin_data(IC_INPUT, 2)
@@ -526,7 +527,7 @@
action_flags = IC_ACTION_LONG_RANGE
power_draw_idle = 5
power_draw_per_use = 40
-
+ cooldown_per_use = 5
var/frequency = FREQ_SIGNALER
var/code = DEFAULT_SIGNALER_CODE
var/datum/radio_frequency/radio_connection
@@ -583,9 +584,7 @@
return 0
activate_pin(3)
-
- for(var/mob/O in hearers(1, get_turf(src)))
- audible_message("[icon2html(src, hearers(src))] *beep* *beep*", null, 1)
+ audible_message("[icon2html(src, hearers(src))] *beep* *beep*", null, 1)
/obj/item/integrated_circuit/input/ntnet_packet
name = "NTNet networking circuit"
@@ -596,6 +595,7 @@
can be send to multiple recepients. Addresses must be separated with ; symbol."
icon_state = "signal"
complexity = 4
+ cooldown_per_use = 5
inputs = list(
"target NTNet addresses"= IC_PINTYPE_STRING,
"data to send" = IC_PINTYPE_STRING,
@@ -629,17 +629,16 @@
var/datum/netdata/data = new
data.recipient_ids = splittext(target_address, ";")
- data.sender_id = address
data.plaintext_data = message
data.plaintext_data_secondary = text
- data.plaintext_passkey = key
+ data.encrypted_passkey = key
ntnet_send(data)
/obj/item/integrated_circuit/input/ntnet_recieve(datum/netdata/data)
set_pin_data(IC_OUTPUT, 1, data.sender_id)
set_pin_data(IC_OUTPUT, 2, data.plaintext_data)
set_pin_data(IC_OUTPUT, 3, data.plaintext_data_secondary)
- set_pin_data(IC_OUTPUT, 4, data.plaintext_passkey)
+ set_pin_data(IC_OUTPUT, 4, data.encrypted_passkey)
push_data()
activate_pin(2)
@@ -886,9 +885,9 @@
if(net)
set_pin_data(IC_OUTPUT, 1, net.hardware_id)
+ push_data()
activate_pin(2)
else
set_pin_data(IC_OUTPUT, 1, null)
+ push_data()
activate_pin(3)
- push_data()
- return
diff --git a/code/modules/integrated_electronics/subtypes/lists.dm b/code/modules/integrated_electronics/subtypes/lists.dm
index aa373c9940..9f7dbe078b 100644
--- a/code/modules/integrated_electronics/subtypes/lists.dm
+++ b/code/modules/integrated_electronics/subtypes/lists.dm
@@ -13,6 +13,7 @@
)
category_text = "Lists"
power_draw_per_use = 20
+ cooldown_per_use = 10
/obj/item/integrated_circuit/lists/pick
name = "pick circuit"
@@ -28,6 +29,7 @@
"on failure" = IC_PINTYPE_PULSE_OUT,
)
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
+ cooldown_per_use = 1
/obj/item/integrated_circuit/lists/pick/do_work()
var/list/input_list = get_pin_data(IC_INPUT, 1) // List pins guarantee that there is a list inside, even if just an empty one.
@@ -83,6 +85,7 @@
)
icon_state = "addition"
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
+ cooldown_per_use = 1
/obj/item/integrated_circuit/lists/search/do_work()
var/list/input_list = get_pin_data(IC_INPUT, 1)
@@ -115,6 +118,7 @@
)
icon_state = "addition"
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
+ cooldown_per_use = 1
/obj/item/integrated_circuit/lists/at/do_work()
var/list/input_list = get_pin_data(IC_INPUT, 1)
@@ -218,6 +222,7 @@
set_pin_data(IC_OUTPUT, 1, input_list.len)
push_data()
activate_pin(2)
+ cooldown_per_use = 1
/obj/item/integrated_circuit/lists/jointext
@@ -240,6 +245,7 @@
)
icon_state = "addition"
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
+ cooldown_per_use = 1
/obj/item/integrated_circuit/lists/jointext/do_work()
var/list/input_list = get_pin_data(IC_INPUT, 1)
@@ -312,7 +318,7 @@
)
outputs = list()
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
- var/number_of_pins = 4
+ var/number_of_pins = 16
/obj/item/integrated_circuit/lists/deconstructor/Initialize()
for(var/i = 1 to number_of_pins)
diff --git a/code/modules/integrated_electronics/subtypes/manipulation.dm b/code/modules/integrated_electronics/subtypes/manipulation.dm
index ddac72a76a..b30500fad4 100644
--- a/code/modules/integrated_electronics/subtypes/manipulation.dm
+++ b/code/modules/integrated_electronics/subtypes/manipulation.dm
@@ -25,6 +25,7 @@
spawn_flags = IC_SPAWN_RESEARCH
action_flags = IC_ACTION_COMBAT
power_draw_per_use = 0
+ ext_cooldown = 1
var/mode = FALSE
var/stun_projectile = null //stun mode projectile type
@@ -57,7 +58,7 @@
if(gun_properties["shot_delay"])
cooldown_per_use = gun_properties["shot_delay"]*10
if(cooldown_per_use<30)
- cooldown_per_use = 40
+ cooldown_per_use = 30
if(gun_properties["reqpower"])
power_draw_per_use = gun_properties["reqpower"]
set_pin_data(IC_OUTPUT, 1, WEAKREF(installed_gun))
@@ -139,8 +140,10 @@
being held, or anchored in some way. It should be noted that the ability to move is dependant on the type of assembly that this circuit inhabits."
w_class = WEIGHT_CLASS_SMALL
complexity = 20
+ cooldown_per_use = 8
+ ext_cooldown = 1
inputs = list("direction" = IC_PINTYPE_DIR)
- outputs = list()
+ outputs = list("obstacle" = IC_PINTYPE_REF)
activators = list("step towards dir" = IC_PINTYPE_PULSE_IN,"on step"=IC_PINTYPE_PULSE_OUT,"blocked"=IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_RESEARCH
action_flags = IC_ACTION_MOVEMENT
@@ -159,6 +162,7 @@
activate_pin(2)
return
else
+ set_pin_data(IC_OUTPUT, 1, WEAKREF(assembly.collw))
activate_pin(3)
return FALSE
return FALSE
@@ -171,6 +175,7 @@
Beware: Once primed there is no aborting the process!"
icon_state = "grenade"
complexity = 30
+ cooldown_per_use = 10
inputs = list("detonation time" = IC_PINTYPE_NUMBER)
outputs = list()
activators = list("prime grenade" = IC_PINTYPE_PULSE_IN)
@@ -241,6 +246,7 @@
icon_state = "plant_m"
extended_desc = "The circuit accepts a reference to a hydroponic tray in an adjacent tile. \
Mode(0- harvest, 1-uproot weeds, 2-uproot plant) determinies action."
+ cooldown_per_use = 10
w_class = WEIGHT_CLASS_TINY
complexity = 10
inputs = list("target" = IC_PINTYPE_REF,"mode" = IC_PINTYPE_NUMBER)
@@ -300,7 +306,7 @@
extended_desc = "The circuit accepts a reference to an object to be grabbed and can store up to 10 objects. Modes: 1 to grab, 0 to eject the first object, and -1 to eject all objects."
w_class = WEIGHT_CLASS_SMALL
size = 3
-
+ cooldown_per_use = 5
complexity = 10
inputs = list("target" = IC_PINTYPE_REF,"mode" = IC_PINTYPE_NUMBER)
outputs = list("first" = IC_PINTYPE_REF, "last" = IC_PINTYPE_REF, "amount" = IC_PINTYPE_NUMBER,"contents" = IC_PINTYPE_LIST)
@@ -362,13 +368,14 @@
extended_desc = "The circuit accepts a reference to thing to be pulled. Modes: 0 for release. 1 for pull."
w_class = WEIGHT_CLASS_SMALL
size = 3
-
+ cooldown_per_use = 5
complexity = 10
inputs = list("target" = IC_PINTYPE_REF,"mode" = IC_PINTYPE_INDEX)
outputs = list("is pulling" = IC_PINTYPE_BOOLEAN)
activators = list("pulse in" = IC_PINTYPE_PULSE_IN,"pulse out" = IC_PINTYPE_PULSE_OUT,"released" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_RESEARCH
power_draw_per_use = 50
+ ext_cooldown = 1
var/max_grab = GRAB_PASSIVE
/obj/item/integrated_circuit/manipulation/claw/do_work()
@@ -403,6 +410,8 @@
complexity = 15
w_class = WEIGHT_CLASS_SMALL
size = 2
+ cooldown_per_use = 10
+ ext_cooldown = 1
inputs = list(
"target X rel" = IC_PINTYPE_NUMBER,
"target Y rel" = IC_PINTYPE_NUMBER,
diff --git a/code/modules/integrated_electronics/subtypes/output.dm b/code/modules/integrated_electronics/subtypes/output.dm
index 649c66ae3d..88c6530ccb 100644
--- a/code/modules/integrated_electronics/subtypes/output.dm
+++ b/code/modules/integrated_electronics/subtypes/output.dm
@@ -3,6 +3,7 @@
/obj/item/integrated_circuit/output/screen
name = "small screen"
+ extended_desc = " use <br> to start a new line"
desc = "Takes any data type as an input, and displays it to the user upon examining."
icon_state = "screen"
inputs = list("displayed data" = IC_PINTYPE_ANY)
@@ -10,6 +11,8 @@
activators = list("load data" = IC_PINTYPE_PULSE_IN)
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
power_draw_per_use = 10
+ cooldown_per_use = 10
+ var/eol = "<br>"
var/stuff_to_display = null
/obj/item/integrated_circuit/output/screen/disconnect_all()
@@ -30,7 +33,7 @@
if(d)
stuff_to_display = "[d]"
else
- stuff_to_display = I.data
+ stuff_to_display = replacetext("[I.data]", eol , " ")
/obj/item/integrated_circuit/output/screen/medium
name = "screen"
@@ -219,6 +222,7 @@
desc = "Takes any string as an input and will make the device say the string when pulsed."
extended_desc = "This unit is more advanced than the plain speaker circuit, able to transpose any valid text to speech."
icon_state = "speaker"
+ ext_cooldown = 2
complexity = 12
inputs = list("text" = IC_PINTYPE_STRING)
outputs = list()
diff --git a/code/modules/integrated_electronics/subtypes/power.dm b/code/modules/integrated_electronics/subtypes/power.dm
index 872f70a20f..7db6ecfcc8 100644
--- a/code/modules/integrated_electronics/subtypes/power.dm
+++ b/code/modules/integrated_electronics/subtypes/power.dm
@@ -28,7 +28,8 @@
extended_desc = "This circuit transmits 20 kJ of electricity every time the activator pin is pulsed. The input pin must be \
a reference to a machine to send electricity to. This can be a battery, or anything containing a battery. The machine can exist \
inside the assembly, or adjacent to it. The power is sourced from the assembly's power cell. If the target is outside of the assembly, \
- some power is lost due to ineffiency."
+ some power is lost due to ineffiency.Warning!Don't stack more than 1 power transmittors.it becomes less efficient for every other \
+ transmission circuit in its own assembly and other nearby ones. "
w_class = WEIGHT_CLASS_BULKY
complexity = 32
power_draw_per_use = 2000
@@ -49,6 +50,8 @@
if(A.Adjacent(B))
if(AM.loc != assembly)
transfer_amount *= 0.8 // Losses due to distance.
+ var/list/U=A.GetAllContents(/obj/item/integrated_circuit/power/transmitter)
+ transfer_amount *= 1 / U.len
set_pin_data(IC_OUTPUT, 1, cell.charge)
set_pin_data(IC_OUTPUT, 2, cell.maxcharge)
set_pin_data(IC_OUTPUT, 3, cell.percent())
@@ -61,7 +64,6 @@
if(istype(AM, /obj/item))
var/obj/item/I = AM
I.update_icon()
-
return TRUE
else
set_pin_data(IC_OUTPUT, 1, null)
diff --git a/code/modules/integrated_electronics/subtypes/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm
index 9e267b120c..2cd3ccb8cf 100644
--- a/code/modules/integrated_electronics/subtypes/reagents.dm
+++ b/code/modules/integrated_electronics/subtypes/reagents.dm
@@ -3,6 +3,7 @@
/obj/item/integrated_circuit/reagent
category_text = "Reagent"
resistance_flags = UNACIDABLE | FIRE_PROOF
+ cooldown_per_use = 10
var/volume = 0
/obj/item/integrated_circuit/reagent/Initialize()
@@ -21,7 +22,7 @@
icon_state = "smoke"
extended_desc = "This smoke generator creates clouds of smoke on command. It can also hold liquids inside, which will go \
into the smoke clouds when activated. The reagents are consumed when smoke is made."
-
+ ext_cooldown = 1
container_type = OPENCONTAINER
volume = 100
@@ -281,6 +282,7 @@
activate_pin(2)
/obj/item/integrated_circuit/reagent/storage
+ cooldown_per_use = 1
name = "reagent storage"
desc = "Stores liquid inside the device away from electrical components. It can store up to 60u."
icon_state = "reagent_storage"
diff --git a/code/modules/integrated_electronics/subtypes/time.dm b/code/modules/integrated_electronics/subtypes/time.dm
index d93aafef58..86e5e99059 100644
--- a/code/modules/integrated_electronics/subtypes/time.dm
+++ b/code/modules/integrated_electronics/subtypes/time.dm
@@ -1,7 +1,7 @@
/obj/item/integrated_circuit/time
name = "time circuit"
desc = "Now you can build your own clock!"
- complexity = 2
+ complexity = 1
inputs = list()
outputs = list()
category_text = "Time"
@@ -71,7 +71,7 @@
name = "ticker circuit"
desc = "This circuit sends an automatic pulse every four seconds."
icon_state = "tick-m"
- complexity = 8
+ complexity = 4
var/delay = 4 SECONDS
var/next_fire = 0
var/is_running = FALSE
@@ -102,11 +102,28 @@
activate_pin(1)
+/obj/item/integrated_circuit/time/ticker/custom
+ name = "custom ticker"
+ desc = "This advanced circuit sends an automatic pulse every given interval."
+ icon_state = "tick-f"
+ complexity = 8
+ delay = 2 SECONDS
+ inputs = list("enable ticking" = IC_PINTYPE_BOOLEAN,"delay time" = IC_PINTYPE_NUMBER)
+ spawn_flags = IC_SPAWN_RESEARCH
+ power_draw_per_use = 8
+
+/obj/item/integrated_circuit/time/ticker/custom/on_data_written()
+ var/delay_input = get_pin_data(IC_INPUT, 2)
+ if(delay_input && isnum(delay_input) )
+ var/new_delay = CLAMP(delay_input ,1 ,1 HOURS)
+ delay = new_delay
+ ..()
+
/obj/item/integrated_circuit/time/ticker/fast
name = "fast ticker"
desc = "This advanced circuit sends an automatic pulse every two seconds."
icon_state = "tick-f"
- complexity = 12
+ complexity = 6
delay = 2 SECONDS
spawn_flags = IC_SPAWN_RESEARCH
power_draw_per_use = 8
@@ -115,7 +132,7 @@
name = "slow ticker"
desc = "This simple circuit sends an automatic pulse every six seconds."
icon_state = "tick-s"
- complexity = 4
+ complexity = 2
delay = 6 SECONDS
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
power_draw_per_use = 2
@@ -142,4 +159,4 @@
set_pin_data(IC_OUTPUT, 3, text2num(time2text(wtime, "mm") ) )
set_pin_data(IC_OUTPUT, 4, text2num(time2text(wtime, "ss") ) )
push_data()
- activate_pin(2)
\ No newline at end of file
+ activate_pin(2)
diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm
index 67bbd2fad9..f08bf5908e 100644
--- a/code/modules/jobs/access.dm
+++ b/code/modules/jobs/access.dm
@@ -1,9 +1,4 @@
-/obj/var/list/req_access = null
-/obj/var/req_access_txt = "0" as text
-/obj/var/list/req_one_access = null
-/obj/var/req_one_access_txt = "0" as text
-
//returns TRUE if this mob has sufficient access to use this object
/obj/proc/allowed(mob/M)
//check if it doesn't require any access at all
@@ -60,48 +55,36 @@
for(var/b in text2access(req_one_access_txt))
req_one_access += b
+// Check if an item has access to this object
/obj/proc/check_access(obj/item/I)
+ return check_access_list(I ? I.GetAccess() : null)
+
+
+/obj/proc/check_access_list(list/access_list)
gen_access()
- if(!istype(src.req_access, /list)) //something's very wrong
+ if(!islist(req_access)) //something's very wrong
return TRUE
- var/list/L = src.req_access
- if(!L.len && (!src.req_one_access || !src.req_one_access.len)) //no requirements
+ if(!req_access.len && !length(req_one_access))
return TRUE
- if(!I)
+
+ if(!length(access_list) || !islist(access_list))
return FALSE
- for(var/req in src.req_access)
- if(!(req in I.GetAccess())) //doesn't have this access
+
+ for(var/req in req_access)
+ if(!(req in access_list)) //doesn't have this access
return FALSE
- if(src.req_one_access && src.req_one_access.len)
- for(var/req in src.req_one_access)
- if(req in I.GetAccess()) //has an access from the single access list
+
+ if(length(req_one_access))
+ for(var/req in req_one_access)
+ if(req in access_list) //has an access from the single access list
return TRUE
return FALSE
return TRUE
-
-/obj/proc/check_access_list(list/L)
- if(!src.req_access && !src.req_one_access)
- return TRUE
- if(!istype(src.req_access, /list))
- return TRUE
- if(!src.req_access.len && (!src.req_one_access || !src.req_one_access.len))
- return TRUE
- if(!L)
- return FALSE
- if(!istype(L, /list))
- return FALSE
- for(var/req in src.req_access)
- if(!(req in L)) //doesn't have this access
- return FALSE
- if(src.req_one_access && src.req_one_access.len)
- for(var/req in src.req_one_access)
- if(req in L) //has an access from the single access list
- return TRUE
- return FALSE
- return TRUE
+/obj/proc/check_access_ntnet(datum/netdata/data)
+ return check_access_list(data.passkey)
/proc/get_centcom_access(job)
switch(job)
diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm
index e90c29cfd6..906bd570b4 100755
--- a/code/modules/jobs/job_types/captain.dm
+++ b/code/modules/jobs/job_types/captain.dm
@@ -15,6 +15,7 @@ Captain
minimal_player_age = 14
exp_requirements = 180
exp_type = EXP_TYPE_CREW
+ antag_rep = 20
outfit = /datum/outfit/job/captain
@@ -69,6 +70,7 @@ Head of Personnel
exp_requirements = 180
exp_type = EXP_TYPE_CREW
// exp_type_department = EXP_TYPE_SUPPLY - CITADEL CHANGE
+ antag_rep = 16
outfit = /datum/outfit/job/hop
diff --git a/code/modules/jobs/job_types/cargo_service.dm b/code/modules/jobs/job_types/cargo_service.dm
index c74fbd3b1b..9c6c6f566d 100644
--- a/code/modules/jobs/job_types/cargo_service.dm
+++ b/code/modules/jobs/job_types/cargo_service.dm
@@ -11,6 +11,7 @@ Quartermaster
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#d7b088"
+ antag_rep = 12
outfit = /datum/outfit/job/quartermaster
@@ -41,6 +42,7 @@ Cargo Technician
spawn_positions = 2
supervisors = "the quartermaster and the head of personnel"
selection_color = "#dcba97"
+ antag_rep = 4
outfit = /datum/outfit/job/cargo_tech
@@ -69,6 +71,7 @@ Shaft Miner
spawn_positions = 3
supervisors = "the quartermaster and the head of personnel"
selection_color = "#dcba97"
+ antag_rep = 8
outfit = /datum/outfit/job/miner
@@ -147,6 +150,7 @@ Bartender
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#bbe291"
+ antag_rep = 4
outfit = /datum/outfit/job/bartender
@@ -180,6 +184,7 @@ Cook
supervisors = "the head of personnel"
selection_color = "#bbe291"
var/cooks = 0 //Counts cooks amount
+ antag_rep = 8
outfit = /datum/outfit/job/cook
@@ -232,6 +237,7 @@ Botanist
spawn_positions = 2
supervisors = "the head of personnel"
selection_color = "#bbe291"
+ antag_rep = 8
outfit = /datum/outfit/job/botanist
@@ -271,6 +277,7 @@ Janitor
supervisors = "the head of personnel"
selection_color = "#bbe291"
var/global/janitors = 0
+ antag_rep = 8
outfit = /datum/outfit/job/janitor
diff --git a/code/modules/jobs/job_types/civilian.dm b/code/modules/jobs/job_types/civilian.dm
index 9a2030d7ed..a10c15e53f 100644
--- a/code/modules/jobs/job_types/civilian.dm
+++ b/code/modules/jobs/job_types/civilian.dm
@@ -11,6 +11,7 @@ Clown
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#dddddd"
+ antag_rep = 4
outfit = /datum/outfit/job/clown
@@ -72,6 +73,7 @@ Mime
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#dddddd"
+ antag_rep = 4
outfit = /datum/outfit/job/mime
@@ -122,6 +124,7 @@ Curator
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#dddddd"
+ antag_rep = 4
outfit = /datum/outfit/job/curator
@@ -167,6 +170,7 @@ Lawyer
supervisors = "the head of personnel"
selection_color = "#dddddd"
var/lawyers = 0 //Counts lawyer amount
+ antag_rep = 8
outfit = /datum/outfit/job/lawyer
diff --git a/code/modules/jobs/job_types/civilian_chaplain.dm b/code/modules/jobs/job_types/civilian_chaplain.dm
index 6b119c19d7..00685454b0 100644
--- a/code/modules/jobs/job_types/civilian_chaplain.dm
+++ b/code/modules/jobs/job_types/civilian_chaplain.dm
@@ -12,6 +12,7 @@ Chaplain
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#dddddd"
+ antag_rep = 4
outfit = /datum/outfit/job/chaplain
diff --git a/code/modules/jobs/job_types/engineering.dm b/code/modules/jobs/job_types/engineering.dm
index 1b1619cc24..064422bfba 100644
--- a/code/modules/jobs/job_types/engineering.dm
+++ b/code/modules/jobs/job_types/engineering.dm
@@ -17,6 +17,7 @@ Chief Engineer
exp_requirements = 180
exp_type = EXP_TYPE_CREW
exp_type_department = EXP_TYPE_ENGINEERING
+ antag_rep = 16
outfit = /datum/outfit/job/ce
@@ -76,6 +77,7 @@ Station Engineer
selection_color = "#fff5cc"
exp_requirements = 60
exp_type = EXP_TYPE_CREW
+ antag_rep = 8
outfit = /datum/outfit/job/engineer
@@ -132,6 +134,7 @@ Atmospheric Technician
selection_color = "#fff5cc"
exp_requirements = 60
exp_type = EXP_TYPE_CREW
+ antag_rep = 8
outfit = /datum/outfit/job/atmos
diff --git a/code/modules/jobs/job_types/job.dm b/code/modules/jobs/job_types/job.dm
index 70854d020b..704722dc13 100644
--- a/code/modules/jobs/job_types/job.dm
+++ b/code/modules/jobs/job_types/job.dm
@@ -48,6 +48,9 @@
var/exp_type = ""
var/exp_type_department = ""
+ //The amount of good boy points playing this role will earn you towards a higher chance to roll antagonist next round
+ var/antag_rep = 0
+
//Only override this proc
//H is usually a human unless an /equip override transformed it
/datum/job/proc/after_spawn(mob/living/H, mob/M)
@@ -179,6 +182,7 @@
var/obj/item/card/id/C = H.wear_id
if(istype(C))
C.access = J.get_access()
+ shuffle_inplace(C.access) // Shuffle access list to make NTNet passkeys less predictable
C.registered_name = H.real_name
C.assignment = J.title
C.update_label()
diff --git a/code/modules/jobs/job_types/medical.dm b/code/modules/jobs/job_types/medical.dm
index 1f2df19f64..4da6568683 100644
--- a/code/modules/jobs/job_types/medical.dm
+++ b/code/modules/jobs/job_types/medical.dm
@@ -17,6 +17,7 @@ Chief Medical Officer
exp_requirements = 180
exp_type = EXP_TYPE_CREW
exp_type_department = EXP_TYPE_MEDICAL
+ antag_rep = 16
outfit = /datum/outfit/job/cmo
@@ -59,6 +60,7 @@ Medical Doctor
spawn_positions = 3
supervisors = "the chief medical officer"
selection_color = "#ffeef0"
+ antag_rep = 8
outfit = /datum/outfit/job/doctor
@@ -96,6 +98,7 @@ Chemist
selection_color = "#ffeef0"
exp_type = EXP_TYPE_CREW
exp_requirements = 60
+ antag_rep = 8
outfit = /datum/outfit/job/chemist
@@ -131,6 +134,7 @@ Geneticist
selection_color = "#ffeef0"
exp_type = EXP_TYPE_CREW
exp_requirements = 60
+ antag_rep = 8
outfit = /datum/outfit/job/geneticist
@@ -167,6 +171,7 @@ Virologist
selection_color = "#ffeef0"
exp_type = EXP_TYPE_CREW
exp_requirements = 60
+ antag_rep = 8
outfit = /datum/outfit/job/virologist
diff --git a/code/modules/jobs/job_types/science.dm b/code/modules/jobs/job_types/science.dm
index d8579a37b0..4fb1347208 100644
--- a/code/modules/jobs/job_types/science.dm
+++ b/code/modules/jobs/job_types/science.dm
@@ -17,6 +17,7 @@ Research Director
exp_type_department = EXP_TYPE_SCIENCE
exp_requirements = 180
exp_type = EXP_TYPE_CREW
+ antag_rep = 16
outfit = /datum/outfit/job/rd
@@ -72,6 +73,7 @@ Scientist
selection_color = "#ffeeff"
exp_requirements = 60
exp_type = EXP_TYPE_CREW
+ antag_rep = 8
outfit = /datum/outfit/job/scientist
@@ -106,6 +108,7 @@ Roboticist
selection_color = "#ffeeff"
exp_requirements = 60
exp_type = EXP_TYPE_CREW
+ antag_rep = 8
outfit = /datum/outfit/job/roboticist
diff --git a/code/modules/jobs/job_types/security.dm b/code/modules/jobs/job_types/security.dm
index 442b75c972..322922a779 100644
--- a/code/modules/jobs/job_types/security.dm
+++ b/code/modules/jobs/job_types/security.dm
@@ -23,6 +23,7 @@ Head of Security
exp_requirements = 300
exp_type = EXP_TYPE_CREW
exp_type_department = EXP_TYPE_SECURITY
+ antag_rep = 20
outfit = /datum/outfit/job/hos
@@ -76,6 +77,7 @@ Warden
minimal_player_age = 7
exp_requirements = 300
exp_type = EXP_TYPE_CREW
+ antag_rep = 16
outfit = /datum/outfit/job/warden
@@ -128,6 +130,7 @@ Detective
minimal_player_age = 7
exp_requirements = 300
exp_type = EXP_TYPE_CREW
+ antag_rep = 12
outfit = /datum/outfit/job/detective
@@ -178,6 +181,7 @@ Security Officer
minimal_player_age = 7
exp_requirements = 300
exp_type = EXP_TYPE_CREW
+ antag_rep = 12
outfit = /datum/outfit/job/security
diff --git a/code/modules/jobs/job_types/silicon.dm b/code/modules/jobs/job_types/silicon.dm
index 4a4893e93d..0860c08113 100644
--- a/code/modules/jobs/job_types/silicon.dm
+++ b/code/modules/jobs/job_types/silicon.dm
@@ -14,6 +14,7 @@ AI
minimal_player_age = 30
exp_requirements = 180
exp_type = EXP_TYPE_CREW
+ antag_rep = 12
/datum/job/ai/equip(mob/living/carbon/human/H)
return H.AIize(FALSE)
@@ -52,4 +53,4 @@ Cyborg
/datum/job/cyborg/after_spawn(mob/living/silicon/robot/R, mob/M)
if(CONFIG_GET(flag/rename_cyborg)) //name can't be set in robot/New without the client
- R.rename_self("cyborg", M.client)
\ No newline at end of file
+ R.rename_self("cyborg", M.client)
diff --git a/code/modules/language/language_holder.dm b/code/modules/language/language_holder.dm
index d15bc4c117..c1a336eb69 100644
--- a/code/modules/language/language_holder.dm
+++ b/code/modules/language/language_holder.dm
@@ -136,6 +136,10 @@
languages = list(/datum/language/common)
shadow_languages = list(/datum/language/common, /datum/language/machine, /datum/language/draconic)
+/datum/language_holder/empty
+ languages = list()
+ shadow_languages = list()
+
/datum/language_holder/universal/New()
..()
grant_all_languages(omnitongue=TRUE)
diff --git a/code/modules/language/mushroom.dm b/code/modules/language/mushroom.dm
new file mode 100644
index 0000000000..b896d11449
--- /dev/null
+++ b/code/modules/language/mushroom.dm
@@ -0,0 +1,11 @@
+/datum/language/mushroom
+ name = "Mushroom"
+ desc = "A language that consists of the sound of periodic gusts of spore-filled air being released."
+ speech_verb = "puffs"
+ ask_verb = "puffs inquisitively"
+ exclaim_verb = "poofs loudly"
+ whisper_verb = "puffs quietly"
+ key = "y"
+ sentence_chance = 0
+ default_priority = 80
+ syllables = list("poof", "pff", "pFfF", "piff", "puff", "pooof", "pfffff", "piffpiff", "puffpuff", "poofpoof", "pifpafpofpuf")
diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm
index 92122411e4..b302701b24 100644
--- a/code/modules/library/lib_items.dm
+++ b/code/modules/library/lib_items.dm
@@ -206,6 +206,9 @@
if(dat)
user << browse("Penned by [author]. " + "[dat]", "window=book[window_size != null ? ";size=[window_size]" : ""]")
user.visible_message("[user] opens a book titled \"[title]\" and begins reading intently.")
+ GET_COMPONENT_FROM(mood, /datum/component/mood, user)
+ if(mood)
+ mood.add_event("book_nerd", /datum/mood_event/book_nerd)
onclose(user, "book")
else
to_chat(user, "This book is completely blank! ")
diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm
index 054d97c9f1..1fd5e30424 100644
--- a/code/modules/mapping/mapping_helpers.dm
+++ b/code/modules/mapping/mapping_helpers.dm
@@ -160,3 +160,4 @@ GLOBAL_LIST_EMPTY(z_is_planet)
. = ..()
var/turf/T = get_turf(src)
GLOB.z_is_planet["[T.z]"] = TRUE
+
diff --git a/code/modules/mining/aux_base_camera.dm b/code/modules/mining/aux_base_camera.dm
index 3aa963ef5e..02c54ffbd3 100644
--- a/code/modules/mining/aux_base_camera.dm
+++ b/code/modules/mining/aux_base_camera.dm
@@ -173,18 +173,13 @@
if(!check_spot())
return
-
- var/atom/movable/rcd_target
var/turf/target_turf = get_turf(remote_eye)
+ var/atom/rcd_target = target_turf
- //Find airlocks
- rcd_target = locate(/obj/machinery/door/airlock) in target_turf
-
- if(!rcd_target)
- rcd_target = locate (/obj/structure) in target_turf
-
- if(!rcd_target || !rcd_target.anchored)
- rcd_target = target_turf
+ //Find airlocks and other shite
+ for(var/obj/S in target_turf)
+ if(LAZYLEN(S.rcd_vals(owner,B.RCD)))
+ rcd_target = S //If we don't break out of this loop we'll get the last placed thing
owner.changeNext_move(CLICK_CD_RANGE)
B.RCD.afterattack(rcd_target, owner, TRUE) //Activate the RCD and force it to work remotely!
@@ -276,4 +271,4 @@ datum/action/innate/aux_base/install_turret/Activate()
B.turret_stock--
to_chat(owner, "Turret installation complete! ")
- playsound(turret_turf, 'sound/items/drill_use.ogg', 65, 1)
\ No newline at end of file
+ playsound(turret_turf, 'sound/items/drill_use.ogg', 65, 1)
diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm
index 2843c22038..5b86a2d340 100644
--- a/code/modules/mining/equipment/kinetic_crusher.dm
+++ b/code/modules/mining/equipment/kinetic_crusher.dm
@@ -115,6 +115,9 @@
C.total_damage += detonation_damage
L.apply_damage(detonation_damage, BRUTE, blocked = def_check)
+ if(user && lavaland_equipment_pressure_check(get_turf(user))) //CIT CHANGE - makes sure below only happens in low pressure environments
+ user.adjustStaminaLoss(-13)//CIT CHANGE - makes crushers heal stamina
+
/obj/item/twohanded/required/kinetic_crusher/proc/Recharge()
if(!charged)
charged = TRUE
diff --git a/code/modules/mining/equipment/mining_tools.dm b/code/modules/mining/equipment/mining_tools.dm
index 3e241fbc72..e73349198b 100644
--- a/code/modules/mining/equipment/mining_tools.dm
+++ b/code/modules/mining/equipment/mining_tools.dm
@@ -125,4 +125,4 @@
righthand_file = 'icons/mob/inhands/equipment/hydroponics_righthand.dmi'
force = 5
throwforce = 7
- w_class = WEIGHT_CLASS_SMALL
\ No newline at end of file
+ w_class = WEIGHT_CLASS_SMALL
diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm
index 66faa7cb2c..632c9e1cba 100644
--- a/code/modules/mining/equipment/survival_pod.dm
+++ b/code/modules/mining/equipment/survival_pod.dm
@@ -203,7 +203,6 @@
desc = "A large machine releasing a constant gust of air."
anchored = TRUE
density = TRUE
- var/arbitraryatmosblockingvar = TRUE
var/buildstacktype = /obj/item/stack/sheet/metal
var/buildstackamount = 5
CanAtmosPass = ATMOS_PASS_NO
diff --git a/code/modules/mining/equipment/wormhole_jaunter.dm b/code/modules/mining/equipment/wormhole_jaunter.dm
index 3ff5a5f3e9..42e69f8fb2 100644
--- a/code/modules/mining/equipment/wormhole_jaunter.dm
+++ b/code/modules/mining/equipment/wormhole_jaunter.dm
@@ -28,7 +28,7 @@
/obj/item/device/wormhole_jaunter/proc/get_destinations(mob/user)
var/list/destinations = list()
- for(var/obj/item/device/radio/beacon/B in GLOB.teleportbeacons)
+ for(var/obj/item/device/beacon/B in GLOB.teleportbeacons)
var/turf/T = get_turf(B)
if(is_station_level(T.z))
destinations += B
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 56d59dfd09..7f3870e418 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -33,7 +33,7 @@
else
new /obj/item/disk/design_disk/modkit_disc/rapid_repeater(src)
if(9)
- new /obj/item/organ/brain/alien(src)
+ new /obj/item/rod_of_asclepius(src)
if(10)
new /obj/item/organ/heart/cursed/wizard(src)
if(11)
@@ -76,7 +76,6 @@
new /obj/item/borg/upgrade/modkit/lifesteal(src)
new /obj/item/bedsheet/cult(src)
-
//KA modkit design discs
/obj/item/disk/design_disk/modkit_disc
name = "KA Mod Disk"
@@ -140,6 +139,54 @@
//Spooky special loot
+//Rod of Asclepius
+/obj/item/rod_of_asclepius
+ name = "Rod of Asclepius"
+ desc = "A wooden rod about the size of your forearm with a snake carved around it, winding it's way up the sides of the rod. Something about it seems to inspire in you the responsibilty and duty to help others."
+ icon = 'icons/obj/lavaland/artefacts.dmi'
+ icon_state = "asclepius_dormant"
+ var/activated = FALSE
+
+/obj/item/rod_of_asclepius/attack_self(mob/user)
+ if(activated)
+ return
+ if(!iscarbon(user))
+ to_chat(user, "The snake carving seems to come alive, if only for a moment, before returning to it's dormant state, almost as if it finds you incapable of holding it's oath. ")
+ return
+ var/mob/living/carbon/itemUser = user
+ var/failText = "The snake seems unsatisfied with your incomplete oath and returns to it's previous place on the rod, returning to its dormant, wooden state. You must stand still while completing your oath! "
+ to_chat(itemUser, "The wooden snake that was carved into the rod seems to suddenly come alive and begins to slither down your arm! The compulsion to help others grows abnormally strong... ")
+ if(do_after(itemUser, 40, target = itemUser))
+ itemUser.say("I swear to fulfill, to the best of my ability and judgment, this covenant:")
+ else
+ to_chat(itemUser, failText)
+ return
+ if(do_after(itemUser, 20, target = itemUser))
+ itemUser.say("I will apply, for the benefit of the sick, all measures that are required, avoiding those twin traps of overtreatment and therapeutic nihilism.")
+ else
+ to_chat(itemUser, failText)
+ return
+ if(do_after(itemUser, 30, target = itemUser))
+ itemUser.say("I will remember that I remain a member of society, with special obligations to all my fellow human beings, those sound of mind and body as well as the infirm.")
+ else
+ to_chat(itemUser, failText)
+ return
+ if(do_after(itemUser, 30, target = itemUser))
+ itemUser.say("If I do not violate this oath, may I enjoy life and art, respected while I live and remembered with affection thereafter. May I always act so as to preserve the finest traditions of my calling and may I long experience the joy of healing those who seek my help.")
+ else
+ to_chat(itemUser, failText)
+ return
+ to_chat(itemUser, "The snake, satisfied with your oath, attaches itself and the rod to your forearm with an inseparable grip. Your thoughts seem to only revolve around the core idea of helping others, and harm is nothing more than a distant, wicked memory... ")
+ var/datum/status_effect/hippocraticOath/effect = itemUser.apply_status_effect(STATUS_EFFECT_HIPPOCRATIC_OATH)
+ effect.hand = itemUser.get_held_index_of_item(src)
+ activated()
+
+/obj/item/rod_of_asclepius/proc/activated()
+ flags_1 = NODROP_1 | DROPDEL_1
+ desc = "A short wooden rod with a mystical snake inseparably gripping itself and the rod to your forearm. It flows with a healing energy that disperses amongst yourself and those around you. "
+ icon_state = "asclepius_active"
+ activated = TRUE
+
//Wisp Lantern
/obj/item/device/wisp_lantern
name = "spooky lantern"
@@ -789,7 +836,7 @@
agent = "dragon's blood"
desc = "What do dragons have to do with Space Station 13?"
stage_prob = 20
- severity = VIRUS_SEVERITY_BIOHAZARD
+ severity = DISEASE_SEVERITY_BIOHAZARD
visibility_flags = 0
stage1 = list("Your bones ache.")
stage2 = list("Your skin feels scaly.")
@@ -945,7 +992,7 @@
survive.owner = L.mind
L.mind.objectives += survive
add_logs(user, L, "took out a blood contract on", src)
- to_chat(L, "You've been marked for death! Don't let the demons get you! ")
+ to_chat(L, "You've been marked for death! Don't let the demons get you! KILL THEM ALL! ")
L.add_atom_colour("#FF0000", ADMIN_COLOUR_PRIORITY)
var/obj/effect/mine/pickup/bloodbath/B = new(L)
INVOKE_ASYNC(B, /obj/effect/mine/pickup/bloodbath/.proc/mineEffect, L)
@@ -953,7 +1000,7 @@
for(var/mob/living/carbon/human/H in GLOB.player_list)
if(H == L)
continue
- to_chat(H, "You have an overwhelming desire to kill [L]. [L.p_they(TRUE)] [L.p_have()] been marked red! Go kill [L.p_them()]! ")
+ to_chat(H, "You have an overwhelming desire to kill [L]. [L.p_they(TRUE)] [L.p_have()] been marked red! Whoever they were, friend or foe, go kill [L.p_them()]! ")
H.put_in_hands(new /obj/item/kitchen/knife/butcher(H), TRUE)
qdel(src)
diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm
index 16929f9b09..a9cec0a01b 100644
--- a/code/modules/mining/machine_redemption.dm
+++ b/code/modules/mining/machine_redemption.dm
@@ -257,26 +257,23 @@
if("Release")
if(check_access(inserted_id) || allowed(usr)) //Check the ID inside, otherwise check the user
- if(params["id"] == "all")
- materials.retrieve_all(get_step(src, output_dir))
+ var/mat_id = params["id"]
+ if(!materials.materials[mat_id])
+ return
+ var/datum/material/mat = materials.materials[mat_id]
+ var/stored_amount = mat.amount / MINERAL_MATERIAL_AMOUNT
+
+ if(!stored_amount)
+ return
+
+ var/desired = 0
+ if (params["sheets"])
+ desired = text2num(params["sheets"])
else
- var/mat_id = params["id"]
- if(!materials.materials[mat_id])
- return
- var/datum/material/mat = materials.materials[mat_id]
- var/stored_amount = mat.amount / MINERAL_MATERIAL_AMOUNT
+ desired = input("How many sheets?", "How many sheets would you like to smelt?", 1) as null|num
- if(!stored_amount)
- return
-
- var/desired = 0
- if (params["sheets"])
- desired = text2num(params["sheets"])
- else
- desired = input("How many sheets?", "How many sheets would you like to smelt?", 1) as null|num
-
- var/sheets_to_remove = round(min(desired,50,stored_amount))
- materials.retrieve_sheets(sheets_to_remove, mat_id, get_step(src, output_dir))
+ var/sheets_to_remove = round(min(desired,50,stored_amount))
+ materials.retrieve_sheets(sheets_to_remove, mat_id, get_step(src, output_dir))
else
to_chat(usr, "Required access not found. ")
diff --git a/code/modules/mob/camera/camera.dm b/code/modules/mob/camera/camera.dm
index 9a95bc9a4a..5f99cd8aa2 100644
--- a/code/modules/mob/camera/camera.dm
+++ b/code/modules/mob/camera/camera.dm
@@ -9,10 +9,24 @@
see_in_dark = 7
invisibility = INVISIBILITY_ABSTRACT // No one can see us
sight = SEE_SELF
- move_on_shuttle = 0
+ move_on_shuttle = FALSE
+ var/call_life = FALSE //TRUE if Life() should be called on this camera every tick of the mobs subystem, as if it were a living mob
+
+/mob/camera/Initialize()
+ . = ..()
+ if(call_life)
+ GLOB.living_cameras += src
+
+/mob/camera/Destroy()
+ . = ..()
+ if(call_life)
+ GLOB.living_cameras -= src
/mob/camera/experience_pressure_difference()
return
/mob/camera/forceMove(atom/destination)
loc = destination
+
+/mob/camera/emote(act, m_type=1, message = null)
+ return
diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm
index 743ba705dc..358867e6ad 100644
--- a/code/modules/mob/dead/new_player/new_player.dm
+++ b/code/modules/mob/dead/new_player/new_player.dm
@@ -379,6 +379,9 @@
if(SSshuttle.emergency.timeLeft(1) > initial(SSshuttle.emergencyCallTime)*0.5)
SSticker.mode.make_antag_chance(humanc)
+ if(CONFIG_GET(flag/roundstart_traits))
+ SStraits.AssignTraits(humanc, humanc.client, TRUE)
+
log_manifest(character.mind.key,character.mind,character,latejoin = TRUE)
/mob/dead/new_player/proc/AddEmploymentContract(mob/living/carbon/human/employee)
diff --git a/code/modules/mob/dead/new_player/sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories.dm
index 57d912067e..8699e02b29 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories.dm
@@ -1402,6 +1402,14 @@
/datum/sprite_accessory/legs/digitigrade_lizard
name = "Digitigrade Legs"
+/datum/sprite_accessory/caps
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+ color_src = HAIR
+
+/datum/sprite_accessory/caps/round
+ name = "Round"
+ icon_state = "round"
+
/datum/sprite_accessory/moth_wings
icon = 'icons/mob/wings.dmi'
color_src = null
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 07e7fe826c..f03ca135d1 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -288,8 +288,16 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(response != "Ghost")
return //didn't want to ghost after-all
ghostize(0) //0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3
- return
+/mob/camera/verb/ghost()
+ set category = "OOC"
+ set name = "Ghost"
+ set desc = "Relinquish your life and enter the land of the dead."
+
+ var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst still alive you may not play again this round! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body")
+ if(response != "Ghost")
+ return
+ ghostize(0)
/mob/dead/observer/Move(NewLoc, direct)
if(updatedir)
@@ -634,7 +642,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
/mob/dead/observer/MouseDrop(atom/over)
if(!usr || !over)
return
- if (isobserver(usr) && usr.client.holder && isliving(over))
+ if (isobserver(usr) && usr.client.holder && (isliving(over) || iscameramob(over)) )
if (usr.client.holder.cmd_ghost_drag(src,over))
return
diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm
index acef80b8ba..1e7f2210cf 100644
--- a/code/modules/mob/inventory.dm
+++ b/code/modules/mob/inventory.dm
@@ -197,7 +197,7 @@
/mob/proc/put_in_hand_check(obj/item/I)
- if(lying && !(I.flags_1&ABSTRACT_1))
+ if(incapacitated() && !(I.flags_1&ABSTRACT_1)) //Cit change - Changes lying to incapacitated so that it's plausible to pick things up while on the ground
return FALSE
if(!istype(I))
return FALSE
diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm
index dd8c84c969..41715d650d 100644
--- a/code/modules/mob/living/blood.dm
+++ b/code/modules/mob/living/blood.dm
@@ -31,7 +31,7 @@
if(bodytemperature >= TCRYO && !(has_trait(TRAIT_NOCLONE))) //cryosleep or husked people do not pump the blood.
//Blood regeneration if there is some space
- if(blood_volume < BLOOD_VOLUME_NORMAL && !(NOHUNGER in dna.species.species_traits))
+ if(blood_volume < BLOOD_VOLUME_NORMAL && !has_trait(TRAIT_NOHUNGER))
var/nutrition_ratio = 0
switch(nutrition)
if(0 to NUTRITION_LEVEL_STARVING)
@@ -140,7 +140,7 @@
if(blood_data["viruses"])
for(var/thing in blood_data["viruses"])
var/datum/disease/D = thing
- if((D.spread_flags & VIRUS_SPREAD_SPECIAL) || (D.spread_flags & VIRUS_SPREAD_NON_CONTAGIOUS))
+ if((D.spread_flags & DISEASE_SPREAD_SPECIAL) || (D.spread_flags & DISEASE_SPREAD_NON_CONTAGIOUS))
continue
C.ForceContractDisease(D)
if(!(blood_data["blood_type"] in get_safe_blood(C.dna.blood_type)))
@@ -164,13 +164,13 @@
blood_data["donor"] = src
blood_data["viruses"] = list()
- for(var/thing in viruses)
+ for(var/thing in diseases)
var/datum/disease/D = thing
blood_data["viruses"] += D.Copy()
blood_data["blood_DNA"] = copytext(dna.unique_enzymes,1,0)
- if(resistances && resistances.len)
- blood_data["resistances"] = resistances.Copy()
+ if(disease_resistances && disease_resistances.len)
+ blood_data["resistances"] = disease_resistances.Copy()
var/list/temp_chem = list()
for(var/datum/reagent/R in reagents.reagent_list)
temp_chem[R.id] = R.volume
@@ -191,6 +191,10 @@
blood_data["real_name"] = real_name
blood_data["features"] = dna.features
blood_data["factions"] = faction
+ blood_data["traits"] = list()
+ for(var/V in roundstart_traits)
+ var/datum/trait/T = V
+ blood_data["traits"] += T.type
return blood_data
//get the id of the substance this mob use as blood.
diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm
index 8b8b8d5761..fe4454caeb 100644
--- a/code/modules/mob/living/carbon/alien/special/facehugger.dm
+++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm
@@ -202,7 +202,6 @@
return
if(!sterile)
- //target.contract_disease(new /datum/disease/alien_embryo(0)) //so infection chance is same as virus infection chance
target.visible_message("[src] falls limp after violating [target]'s face! ", \
"[src] falls limp after violating [target]'s face! ")
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index e5feb5c6c1..ac905ff827 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -148,6 +148,12 @@
if(istype(target, /obj/screen))
return
+//CIT CHANGES - makes it impossible to throw while in stamina softcrit
+ if(staminaloss >= STAMINA_SOFTCRIT)
+ to_chat(src, "You're too exhausted. ")
+ return
+//END OF CIT CHANGES
+
var/atom/movable/thrown_thing
var/obj/item/I = src.get_active_held_item()
@@ -159,6 +165,7 @@
stop_pulling()
if(has_trait(TRAIT_PACIFISM))
to_chat(src, "You gently let go of [throwable_mob]. ")
+ adjustStaminaLossBuffered(25)//CIT CHANGE - throwing an entire person shall be very tiring
var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors
var/turf/end_T = get_turf(target)
if(start_T && end_T)
@@ -174,6 +181,8 @@
to_chat(src, "You set [I] down gently on the ground. ")
return
+ adjustStaminaLossBuffered(I.getweight()*2)//CIT CHANGE - throwing items shall be more tiring than swinging em. Doubly so.
+
if(thrown_thing)
visible_message("[src] has thrown [thrown_thing]. ")
add_logs(src, thrown_thing, "has thrown")
@@ -399,12 +408,20 @@
if(!I || (I.flags_1 & (NODROP_1|ABSTRACT_1)))
return
- dropItemToGround(I)
+ //dropItemToGround(I) CIT CHANGE - makes it so the item doesn't drop if the modifier rolls above 100
var/modifier = 0
if(has_trait(TRAIT_CLUMSY))
modifier -= 40 //Clumsy people are more likely to hit themselves -Honk!
+ //CIT CHANGES START HERE
+ else if(combatmode)
+ modifier += 50
+
+ if(modifier < 100)
+ dropItemToGround(I)
+ //END OF CIT CHANGES
+
switch(rand(1,100)+modifier) //91-100=Nothing special happens
if(-INFINITY to 0) //attack yourself
I.attack(src,src)
@@ -440,7 +457,7 @@
return ..()
/mob/living/carbon/proc/vomit(lost_nutrition = 10, blood = FALSE, stun = TRUE, distance = 1, message = TRUE, toxic = FALSE)
- if(dna && dna.species && NOHUNGER in dna.species.species_traits)
+ if(has_trait(TRAIT_NOHUNGER))
return 1
if(nutrition < 100 && !blood)
@@ -568,10 +585,12 @@
return
tinttotal = get_total_tint()
if(tinttotal >= TINT_BLIND)
- overlay_fullscreen("tint", /obj/screen/fullscreen/blind)
+ become_blind(EYES_COVERED)
else if(tinttotal >= TINT_DARKENED)
+ cure_blind(EYES_COVERED)
overlay_fullscreen("tint", /obj/screen/fullscreen/impaired, 2)
else
+ cure_blind(EYES_COVERED)
clear_fullscreen("tint", 0)
/mob/living/carbon/proc/get_total_tint()
@@ -736,12 +755,17 @@
//called when we get cuffed/uncuffed
/mob/living/carbon/proc/update_handcuffed()
+ GET_COMPONENT_FROM(mood, /datum/component/mood, src)
if(handcuffed)
drop_all_held_items()
stop_pulling()
throw_alert("handcuffed", /obj/screen/alert/restrained/handcuffed, new_master = src.handcuffed)
+ if(mood)
+ mood.add_event("handcuffed", /datum/mood_event/handcuffed)
else
clear_alert("handcuffed")
+ if(mood)
+ mood.clear_event("handcuffed")
update_action_buttons_icon() //some of our action buttons might be unusable when we're handcuffed.
update_inv_handcuffed()
update_hud_handcuffed()
@@ -752,9 +776,9 @@
var/obj/item/organ/brain/B = getorgan(/obj/item/organ/brain)
if(B)
B.damaged_brain = FALSE
- for(var/thing in viruses)
+ for(var/thing in diseases)
var/datum/disease/D = thing
- if(D.severity != VIRUS_SEVERITY_POSITIVE)
+ if(D.severity != DISEASE_SEVERITY_POSITIVE)
D.cure(FALSE)
if(admin_revive)
regenerate_limbs()
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index 56420df35a..9b23204d98 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -77,7 +77,18 @@
affecting = bodyparts[1]
send_item_attack_message(I, user, affecting.name)
if(I.force)
- apply_damage(I.force, I.damtype, affecting)
+ //CIT CHANGES START HERE - combatmode and resting checks
+ var/totitemdamage = I.force
+ if(iscarbon(user))
+ var/mob/living/carbon/tempcarb = user
+ if(!tempcarb.combatmode)
+ totitemdamage *= 0.5
+ if(user.resting)
+ totitemdamage *= 0.5
+ if(!combatmode)
+ totitemdamage *= 1.5
+ //CIT CHANGES END HERE
+ apply_damage(totitemdamage, I.damtype, affecting) //CIT CHANGE - replaces I.force with totitemdamage
if(I.damtype == BRUTE && affecting.status == BODYPART_ORGANIC)
if(prob(33))
I.add_mob_blood(src)
@@ -110,14 +121,14 @@
/mob/living/carbon/attack_hand(mob/living/carbon/human/user)
- for(var/thing in viruses)
+ for(var/thing in diseases)
var/datum/disease/D = thing
- if(D.spread_flags & VIRUS_SPREAD_CONTACT_SKIN)
+ if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN)
user.ContactContractDisease(D)
- for(var/thing in user.viruses)
+ for(var/thing in user.diseases)
var/datum/disease/D = thing
- if(D.spread_flags & VIRUS_SPREAD_CONTACT_SKIN)
+ if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN)
ContactContractDisease(D)
if(lying && surgeries.len)
@@ -131,14 +142,14 @@
/mob/living/carbon/attack_paw(mob/living/carbon/monkey/M)
if(can_inject(M, TRUE))
- for(var/thing in viruses)
+ for(var/thing in diseases)
var/datum/disease/D = thing
- if((D.spread_flags & VIRUS_SPREAD_CONTACT_SKIN) && prob(85))
+ if((D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN) && prob(85))
M.ContactContractDisease(D)
- for(var/thing in M.viruses)
+ for(var/thing in M.diseases)
var/datum/disease/D = thing
- if(D.spread_flags & VIRUS_SPREAD_CONTACT_SKIN)
+ if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN)
ContactContractDisease(D)
if(M.a_intent == INTENT_HELP)
@@ -146,7 +157,7 @@
return 0
if(..()) //successful monkey bite.
- for(var/thing in M.viruses)
+ for(var/thing in M.diseases)
var/datum/disease/D = thing
ForceContractDisease(D)
return 1
@@ -266,6 +277,9 @@
else
M.visible_message("[M] hugs [src] to make [p_them()] feel better! ", \
"You hug [src] to make [p_them()] feel better! ")
+ GET_COMPONENT_FROM(mood, /datum/component/mood, src)
+ if(mood)
+ mood.add_event("hug", /datum/mood_event/hug)
AdjustStun(-60)
AdjustKnockdown(-60)
AdjustUnconscious(-60)
diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm
index 27c64625a8..662a42eea4 100644
--- a/code/modules/mob/living/carbon/carbon_movement.dm
+++ b/code/modules/mob/living/carbon/carbon_movement.dm
@@ -50,7 +50,7 @@
/mob/living/carbon/Move(NewLoc, direct)
. = ..()
if(. && mob_has_gravity()) //floating is easy
- if(dna && dna.species && (NOHUNGER in dna.species.species_traits))
+ if(has_trait(TRAIT_NOHUNGER))
nutrition = NUTRITION_LEVEL_FED - 1 //just less than feeling vigorous
else if(nutrition && stat != DEAD)
nutrition -= HUNGER_FACTOR/10
diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm
index a626266f01..715b4a2ed9 100644
--- a/code/modules/mob/living/carbon/damage_procs.dm
+++ b/code/modules/mob/living/carbon/damage_procs.dm
@@ -80,7 +80,7 @@
/mob/living/carbon/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE)
- if(!forced && has_dna() && TOXINLOVER in dna.species.species_traits) //damage becomes healing and healing becomes damage
+ if(!forced && has_trait(TRAIT_TOXINLOVER)) //damage becomes healing and healing becomes damage
amount = -amount
if(amount > 0)
blood_volume -= 5*amount
@@ -186,16 +186,16 @@
if(status_flags & GODMODE)
return 0
staminaloss = CLAMP(staminaloss + amount, 0, maxHealth*2)
- if(updating_stamina)
- update_stamina()
+ //if(updating_stamina) CIT CHANGE - makes staminaloss changes always call update_stamina
+ update_stamina()
/mob/living/carbon/setStaminaLoss(amount, updating_stamina = 1)
if(status_flags & GODMODE)
return 0
staminaloss = amount
- if(updating_stamina)
- update_stamina()
+ //if(updating_stamina) CIT CHANGE - makes staminaloss changes always call update_stamina
+ update_stamina()
/mob/living/carbon/getBrainLoss()
. = 0
@@ -237,4 +237,3 @@
if(B)
var/adjusted_amount = amount - B.get_brain_damage()
B.adjust_brain_damage(adjusted_amount, null)
-
diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm
index 26fc9ce245..48df33345c 100644
--- a/code/modules/mob/living/carbon/examine.dm
+++ b/code/modules/mob/living/carbon/examine.dm
@@ -89,7 +89,21 @@
if(digitalcamo)
msg += "[t_He] [t_is] moving [t_his] body in an unnatural and blatantly unsimian manner.\n"
-
+ GET_COMPONENT_FROM(mood, /datum/component/mood, src)
+ if(mood)
+ switch(mood.shown_mood)
+ if(-INFINITY to MOOD_LEVEL_SAD4)
+ msg += "[t_He] look[p_s()] depressed.\n"
+ if(MOOD_LEVEL_SAD4 to MOOD_LEVEL_SAD3)
+ msg += "[t_He] look[p_s()] very sad.\n"
+ if(MOOD_LEVEL_SAD3 to MOOD_LEVEL_SAD2)
+ msg += "[t_He] look[p_s()] a bit down.\n"
+ if(MOOD_LEVEL_HAPPY2 to MOOD_LEVEL_HAPPY3)
+ msg += "[t_He] look[p_s()] quite happy.\n"
+ if(MOOD_LEVEL_HAPPY3 to MOOD_LEVEL_HAPPY4)
+ msg += "[t_He] look[p_s()] very happy.\n"
+ if(MOOD_LEVEL_HAPPY4 to INFINITY)
+ msg += "[t_He] look[p_s()] ecstatic.\n"
msg += "*---------* "
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index f1706e7c52..d090b9f0f7 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -6,8 +6,14 @@
var/t_him = p_them()
var/t_has = p_have()
var/t_is = p_are()
+ var/obscure_name
- var/msg = "*---------*\nThis is [name] !\n"
+ if(isliving(user))
+ var/mob/living/L = user
+ if(L.has_trait(TRAIT_PROSOPAGNOSIA))
+ obscure_name = TRUE
+
+ var/msg = "*---------*\nThis is [!obscure_name ? name : "Unknown"] !\n"
var/list/obscured = check_obscured_slots()
var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE))
@@ -246,10 +252,6 @@
if(91.01 to INFINITY)
msg += "[t_He] [t_is] a shitfaced, slobbering wreck.\n"
- for (var/I in src.vore_organs)
- var/datum/belly/B = vore_organs[I]
- msg += B.get_examine_msg()
-
msg += " "
if(!appears_dead)
@@ -269,6 +271,7 @@
if(digitalcamo)
msg += "[t_He] [t_is] moving [t_his] body in an unnatural and blatantly inhuman manner.\n"
+ var/traitstring = get_trait_string()
if(ishuman(user))
var/mob/living/carbon/human/H = user
var/obj/item/organ/cyberimp/eyes/hud/CIH = H.getorgan(/obj/item/organ/cyberimp/eyes/hud)
@@ -296,6 +299,10 @@
R = find_record("name", perpname, GLOB.data_core.medical)
if(R)
msg += "\[Medical evaluation\] "
+ if(traitstring)
+ msg += "Detected physiological traits: "
+ msg += "[traitstring] "
+
if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(CIH, /obj/item/organ/cyberimp/eyes/hud/security))
@@ -312,9 +319,13 @@
msg += "\[Add crime\] "
msg += "\[View comment log\] "
msg += "\[Add comment\] \n"
+
+ else if(isobserver(user) && traitstring)
+ msg += "Traits: [traitstring] "
+
if(print_flavor_text() && get_visible_name() != "Unknown")//Are we sure we know who this is? Don't show flavor text unless we can recognize them. Prevents certain metagaming with impersonation.
msg += "[print_flavor_text()]\n"
-
+
msg += "*---------* "
to_chat(user, msg)
diff --git a/code/modules/mob/living/carbon/human/examine_vr.dm b/code/modules/mob/living/carbon/human/examine_vr.dm
index 8578db809e..6ef1b687c2 100644
--- a/code/modules/mob/living/carbon/human/examine_vr.dm
+++ b/code/modules/mob/living/carbon/human/examine_vr.dm
@@ -42,13 +42,4 @@
message = "[t_His] stomach is firmly packed with digesting slop. [t_He] must have eaten at least a few times worth their body weight! It looks hard for them to stand, and [t_his] gut jiggles when they move. \n"
if(4075 to 10000) // Four or more people.
message = "[t_He] [t_is] so absolutely stuffed that you aren't sure how it's possible to move. [t_He] can't seem to swell any bigger. The surface of [t_his] belly looks sorely strained! \n"
- return message
-
-/mob/living/carbon/human/proc/examine_bellies()
- var/message = ""
-
- for (var/I in src.vore_organs)
- var/datum/belly/B = vore_organs[I]
- message += B.get_examine_msg()
-
return message
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 64ffc91ae7..2bcb1d5189 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -30,10 +30,17 @@
AddComponent(/datum/component/redirect, list(COMSIG_COMPONENT_CLEAN_ACT), CALLBACK(src, .proc/clean_blood))
+
+/mob/living/carbon/human/ComponentInitialize()
+ if(!CONFIG_GET(flag/disable_human_mood))
+ AddComponent(/datum/component/mood)
+
/mob/living/carbon/human/Destroy()
QDEL_NULL(physiology)
+ QDEL_NULL_LIST(vore_organs) // CITADEL EDIT belly stuff
return ..()
+
/mob/living/carbon/human/OpenCraftingMenu()
handcrafting.ui_interact(src)
@@ -90,10 +97,10 @@
stat("Radiation Levels:","[radiation] rad")
stat("Body Temperature:","[bodytemperature-T0C] degrees C ([bodytemperature*1.8-459.67] degrees F)")
- //Virsuses
- if(viruses.len)
+ //Diseases
+ if(diseases.len)
stat("Viruses:", null)
- for(var/thing in viruses)
+ for(var/thing in diseases)
var/datum/disease/D = thing
stat("*", "[D.name], Type: [D.spread_text], Stage: [D.stage]/[D.max_stages], Possible Cure: [D.cure_text]")
@@ -222,6 +229,9 @@
usr.visible_message("[usr] successfully rips [I] out of their [L.name]!","You successfully remove [I] from your [L.name]. ")
if(!has_embedded_objects())
clear_alert("embeddedobject")
+ GET_COMPONENT_FROM(mood, /datum/component/mood, usr)
+ if(mood)
+ mood.clear_event("embeddedobject")
return
if(href_list["item"])
@@ -482,7 +492,7 @@
. = 1 // Default to returning true.
if(user && !target_zone)
target_zone = user.zone_selected
- if(dna && (PIERCEIMMUNE in dna.species.species_traits))
+ if(has_trait(TRAIT_PIERCEIMMUNE))
. = 0
// If targeting the head, see if the head item is thin enough.
// If targeting anything else, see if the wear suit is thin enough.
@@ -643,13 +653,16 @@
to_chat(src, "You fail to perform CPR on [C]! ")
return 0
- var/they_breathe = (!(NOBREATH in C.dna.species.species_traits))
+ var/they_breathe = !C.has_trait(TRAIT_NOBREATH)
var/they_lung = C.getorganslot(ORGAN_SLOT_LUNGS)
if(C.health > HEALTH_THRESHOLD_CRIT)
return
src.visible_message("[src] performs CPR on [C.name]!", "You perform CPR on [C.name]. ")
+ GET_COMPONENT_FROM(mood, /datum/component/mood, src)
+ if(mood)
+ mood.add_event("perform_cpr", /datum/mood_event/perform_cpr)
C.cpr_time = world.time
add_logs(src, C, "CPRed")
@@ -765,7 +778,7 @@
return
else
if(hud_used.healths)
- var/health_amount = health - staminaloss
+ var/health_amount = health - CLAMP(staminaloss-50, 0, 80)//CIT CHANGE - makes staminaloss have less of an impact on the health hud
if(..(health_amount)) //not dead
switch(hal_screwyhud)
if(SCREWYHUD_CRIT)
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index e6fbfe7be9..06cf675427 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -136,7 +136,7 @@
else if(I)
if(I.throw_speed >= EMBED_THROWSPEED_THRESHOLD)
if(can_embed(I))
- if(prob(I.embedding.embed_chance) && !(dna && (PIERCEIMMUNE in dna.species.species_traits)))
+ if(prob(I.embedding.embed_chance) && !has_trait(TRAIT_PIERCEIMMUNE))
throw_alert("embeddedobject", /obj/screen/alert/embeddedobject)
var/obj/item/bodypart/L = pick(bodyparts)
L.embedded_objects |= I
@@ -144,6 +144,9 @@
I.forceMove(src)
L.receive_damage(I.w_class*I.embedding.embedded_impact_pain_multiplier)
visible_message("[I] embeds itself in [src]'s [L.name]! ","[I] embeds itself in your [L.name]! ")
+ GET_COMPONENT_FROM(mood, /datum/component/mood, src)
+ if(mood)
+ mood.add_event("embedded", /datum/mood_event/embedded)
hitpush = FALSE
skipcatch = TRUE //can't catch the now embedded item
@@ -655,24 +658,33 @@
if(prob(30))
burndamage += rand(30,40)
- if(brutedamage > 0)
- status = "bruised"
- if(brutedamage > 20)
- status = "battered"
- if(brutedamage > 40)
- status = "mangled"
- if(brutedamage > 0 && burndamage > 0)
- status += " and "
- if(burndamage > 40)
- status += "peeling away"
+ if(has_trait(TRAIT_SELF_AWARE))
+ status = "[brutedamage] brute damage and [burndamage] burn damage"
+ if(!brutedamage && !burndamage)
+ status = "no damage"
- else if(burndamage > 10)
- status += "blistered"
- else if(burndamage > 0)
- status += "numb"
- if(status == "")
- status = "OK"
- to_chat(src, "\t Your [LB.name] is [status]. ")
+ else
+ if(brutedamage > 0)
+ status = "bruised"
+ if(brutedamage > 20)
+ status = "battered"
+ if(brutedamage > 40)
+ status = "mangled"
+ if(brutedamage > 0 && burndamage > 0)
+ status += " and "
+ if(burndamage > 40)
+ status += "peeling away"
+
+ else if(burndamage > 10)
+ status += "blistered"
+ else if(burndamage > 0)
+ status += "numb"
+ if(status == "")
+ status = "OK"
+ var/no_damage
+ if(status == "OK" || status == "no damage")
+ no_damage = TRUE
+ to_chat(src, "\t Your [LB.name] [has_trait(TRAIT_SELF_AWARE) ? "has" : "is"] [status]. ")
for(var/obj/item/I in LB.embedded_objects)
to_chat(src, "\t There is \a [I] embedded in your [LB.name]! ")
@@ -687,6 +699,23 @@
to_chat(src, "You're completely exhausted. ")
else
to_chat(src, "You feel fatigued. ")
+ if(has_trait(TRAIT_SELF_AWARE))
+ if(toxloss)
+ if(toxloss > 10)
+ to_chat(src, "You feel sick. ")
+ else if(toxloss > 20)
+ to_chat(src, "You feel nauseous. ")
+ else if(toxloss > 40)
+ to_chat(src, "You feel very unwell! ")
+ if(oxyloss)
+ if(oxyloss > 10)
+ to_chat(src, "You feel lightheaded. ")
+ else if(oxyloss > 20)
+ to_chat(src, "Your thinking is clouded and distant. ")
+ else if(oxyloss > 30)
+ to_chat(src, "You're choking! ")
+ if(roundstart_traits.len)
+ to_chat(src, "You have these traits: [get_trait_string()]. ")
else
if(wear_suit)
wear_suit.add_fingerprint(M)
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 2bc4de894e..60bb0fe497 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -1,5 +1,5 @@
/mob/living/carbon/human
- hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPCHEM_HUD,IMPTRACK_HUD,ANTAG_HUD,GLAND_HUD)
+ hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPCHEM_HUD,IMPTRACK_HUD,ANTAG_HUD,GLAND_HUD,SENTIENT_DISEASE_HUD)
possible_a_intents = list(INTENT_HELP, INTENT_DISARM, INTENT_GRAB, INTENT_HARM)
pressure_resistance = 25
can_buckle = TRUE
diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm
index c5e4581253..f3f0fe0215 100644
--- a/code/modules/mob/living/carbon/human/human_helpers.dm
+++ b/code/modules/mob/living/carbon/human/human_helpers.dm
@@ -138,7 +138,7 @@
if(src.dna.check_mutation(HULK))
to_chat(src, "Your meaty finger is much too large for the trigger guard! ")
return FALSE
- if(NOGUNS in src.dna.species.species_traits)
+ if(has_trait(TRAIT_NOGUNS))
to_chat(src, "Your fingers don't fit in the trigger guard! ")
return FALSE
if(mind)
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 6f187d0351..246e615199 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -20,6 +20,22 @@
#define COLD_GAS_DAMAGE_LEVEL_2 1.5 //Amount of damage applied when the current breath's temperature passes the 200K point
#define COLD_GAS_DAMAGE_LEVEL_3 3 //Amount of damage applied when the current breath's temperature passes the 120K point
+// bitflags for the percentual amount of protection a piece of clothing which covers the body part offers.
+// Used with human/proc/get_heat_protection() and human/proc/get_cold_protection()
+// The values here should add up to 1.
+// Hands and feet have 2.5%, arms and legs 7.5%, each of the torso parts has 15% and the head has 30%
+#define THERMAL_PROTECTION_HEAD 0.3
+#define THERMAL_PROTECTION_CHEST 0.15
+#define THERMAL_PROTECTION_GROIN 0.15
+#define THERMAL_PROTECTION_LEG_LEFT 0.075
+#define THERMAL_PROTECTION_LEG_RIGHT 0.075
+#define THERMAL_PROTECTION_FOOT_LEFT 0.025
+#define THERMAL_PROTECTION_FOOT_RIGHT 0.025
+#define THERMAL_PROTECTION_ARM_LEFT 0.075
+#define THERMAL_PROTECTION_ARM_RIGHT 0.075
+#define THERMAL_PROTECTION_HAND_LEFT 0.025
+#define THERMAL_PROTECTION_HAND_RIGHT 0.025
+
/mob/living/carbon/human/Life()
set invisibility = 0
if (notransform)
@@ -48,13 +64,17 @@
/mob/living/carbon/human/calculate_affecting_pressure(pressure)
if((wear_suit && (wear_suit.flags_1 & STOPSPRESSUREDMAGE_1)) && (head && (head.flags_1 & STOPSPRESSUREDMAGE_1)))
return ONE_ATMOSPHERE
+ if(istype(loc, /obj/belly))
+ return ONE_ATMOSPHERE
+ if(istype(loc, /obj/item/device/dogborg/sleeper))
+ return ONE_ATMOSPHERE
else
return pressure
/mob/living/carbon/human/handle_traits()
if(eye_blind) //blindness, heals slowly over time
- if(tinttotal >= TINT_BLIND) //covering your eyes heals blurry eyes faster
+ if(has_trait(TRAIT_BLIND, EYES_COVERED)) //covering your eyes heals blurry eyes faster
adjust_blindness(-3)
else
adjust_blindness(-1)
@@ -65,6 +85,19 @@
to_chat(src, "You don't feel like harming anybody. ")
a_intent_change(INTENT_HELP)
+ GET_COMPONENT_FROM(mood, /datum/component/mood, src)
+ if (getBrainLoss() >= 60 && stat == CONSCIOUS)
+ if(mood)
+ mood.add_event("brain_damage", /datum/mood_event/brain_damage)
+ if(prob(3))
+ if(prob(25))
+ emote("drool")
+ else
+ say(pick_list_replacements(BRAIN_DAMAGE_FILE, "brain_damage"))
+ else
+ if(mood)
+ mood.clear_event("brain_damage")
+
/mob/living/carbon/human/handle_mutations_and_radiation()
if(!dna || !dna.species.handle_mutations_and_radiation(src))
..()
@@ -81,7 +114,7 @@
if(!L)
if(health >= HEALTH_THRESHOLD_CRIT)
adjustOxyLoss(HUMAN_MAX_OXYLOSS + 1)
- else if(!(NOCRITDAMAGE in dna.species.species_traits))
+ else if(!has_trait(TRAIT_NOCRITDAMAGE))
adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS)
failed_last_breath = 1
@@ -122,6 +155,8 @@
return FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
if(ismob(loc))
return FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
+ if(istype(loc, /obj/belly))
+ return FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
//END EDIT
if(wear_suit)
if(wear_suit.max_heat_protection_temperature >= FIRE_SUIT_MAX_TEMP_PROTECT)
@@ -228,16 +263,14 @@
return thermal_protection_flags
/mob/living/carbon/human/proc/get_cold_protection(temperature)
-
- if(dna.check_mutation(COLDRES))
- return TRUE //Fully protected from the cold.
-
- if(RESISTCOLD in dna.species.species_traits)
+ if(has_trait(TRAIT_RESISTCOLD))
return TRUE
-
+
//CITADEL EDIT Mandatory for vore code.
if(istype(loc, /obj/item/device/dogborg/sleeper))
return 1 //freezing to death in sleepers ruins fun.
+ if(istype(loc, /obj/belly))
+ return 1
if(ismob(loc))
return 1 //because lazy and being inside somemone insulates you from space
//END EDIT
@@ -285,16 +318,14 @@
/mob/living/carbon/human/has_smoke_protection()
if(wear_mask)
if(wear_mask.flags_1 & BLOCK_GAS_SMOKE_EFFECT_1)
- . = 1
+ return TRUE
if(glasses)
if(glasses.flags_1 & BLOCK_GAS_SMOKE_EFFECT_1)
- . = 1
+ return TRUE
if(head)
if(head.flags_1 & BLOCK_GAS_SMOKE_EFFECT_1)
- . = 1
- if(NOBREATH in dna.species.species_traits)
- . = 1
- return .
+ return TRUE
+ return ..()
/mob/living/carbon/human/proc/handle_embedded_objects()
@@ -312,6 +343,9 @@
visible_message("[I] falls out of [name]'s [BP.name]! ","[I] falls out of your [BP.name]! ")
if(!has_embedded_objects())
clear_alert("embeddedobject")
+ GET_COMPONENT_FROM(mood, /datum/component/mood, src)
+ if(mood)
+ mood.clear_event("embedded")
/mob/living/carbon/human/proc/handle_active_genes()
for(var/datum/mutation/human/HM in dna.mutations)
@@ -321,14 +355,14 @@
if(!can_heartattack())
return
- var/we_breath = (!(NOBREATH in dna.species.species_traits))
+ var/we_breath = !has_trait(TRAIT_NOBREATH, SPECIES_TRAIT)
if(!undergoing_cardiac_arrest())
return
- // Cardiac arrest, unless corazone
- if(reagents.get_reagent_amount("corazone"))
+ // Cardiac arrest, unless heart is stabilized
+ if(has_trait(TRAIT_STABLEHEART))
return
if(we_breath)
@@ -430,3 +464,14 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put
adjustToxLoss(4) //Let's be honest you shouldn't be alive by now
#undef HUMAN_MAX_OXYLOSS
+#undef THERMAL_PROTECTION_HEAD
+#undef THERMAL_PROTECTION_CHEST
+#undef THERMAL_PROTECTION_GROIN
+#undef THERMAL_PROTECTION_LEG_LEFT
+#undef THERMAL_PROTECTION_LEG_RIGHT
+#undef THERMAL_PROTECTION_FOOT_LEFT
+#undef THERMAL_PROTECTION_FOOT_RIGHT
+#undef THERMAL_PROTECTION_ARM_LEFT
+#undef THERMAL_PROTECTION_ARM_RIGHT
+#undef THERMAL_PROTECTION_HAND_LEFT
+#undef THERMAL_PROTECTION_HAND_RIGHT
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index c601f1445c..c008be1093 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -7,8 +7,8 @@
/mob/living/carbon/human/treat_message(message)
message = dna.species.handle_speech(message,src)
- if(viruses.len)
- for(var/datum/disease/pierrot_throat/D in viruses)
+ if(diseases.len)
+ for(var/datum/disease/pierrot_throat/D in diseases)
var/list/temp_message = splittext(message, " ") //List each word in the message
var/list/pick_list = list()
for(var/i = 1, i <= temp_message.len, i++) //Create a second list for excluding words down the line
@@ -48,14 +48,12 @@
return real_name
/mob/living/carbon/human/IsVocal()
- CHECK_DNA_AND_SPECIES(src)
-
// how do species that don't breathe talk? magic, that's what.
- if(!(NOBREATH in dna.species.species_traits) && !getorganslot(ORGAN_SLOT_LUNGS))
- return 0
+ if(!has_trait(TRAIT_NOBREATH, SPECIES_TRAIT) && !getorganslot(ORGAN_SLOT_LUNGS))
+ return FALSE
if(mind)
return !mind.miming
- return 1
+ return TRUE
/mob/living/carbon/human/proc/SetSpecialVoice(new_voice)
if(new_voice)
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 3978811236..c60eafbad2 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -53,8 +53,10 @@ GLOBAL_LIST_EMPTY(roundstart_races)
var/damage_overlay_type = "human" //what kind of damage overlays (if any) appear on our species when wounded?
var/fixed_mut_color = "" //to use MUTCOLOR with a fixed color that's independent of dna.feature["mcolor"]
- // species flags. these can be found in flags.dm
+ // species-only traits. Can be found in DNA.dm
var/list/species_traits = list()
+ // generic traits tied to having the species
+ var/list/inherent_traits = list()
var/attack_verb = "punch" // punch-specific attack verb
var/sound/attack_sound = 'sound/weapons/punch1.ogg'
@@ -151,8 +153,8 @@ GLOBAL_LIST_EMPTY(roundstart_races)
var/should_have_brain = TRUE
var/should_have_heart = !(NOBLOOD in species_traits)
- var/should_have_lungs = !(NOBREATH in species_traits)
- var/should_have_appendix = !(NOHUNGER in species_traits)
+ var/should_have_lungs = !(TRAIT_NOBREATH in inherent_traits)
+ var/should_have_appendix = !(TRAIT_NOHUNGER in inherent_traits)
var/should_have_eyes = TRUE
var/should_have_ears = TRUE
var/should_have_tongue = TRUE
@@ -287,8 +289,11 @@ GLOBAL_LIST_EMPTY(roundstart_races)
else //Entries in the list should only ever be items or null, so if it's not an item, we can assume it's an empty hand
C.put_in_hands(new mutanthands())
- if(VIRUSIMMUNE in species_traits)
- for(var/datum/disease/A in C.viruses)
+ for(var/X in inherent_traits)
+ C.add_trait(X, SPECIES_TRAIT)
+
+ if(TRAIT_VIRUSIMMUNE in inherent_traits)
+ for(var/datum/disease/A in C.diseases)
A.cure(FALSE)
//CITADEL EDIT
@@ -304,6 +309,8 @@ GLOBAL_LIST_EMPTY(roundstart_races)
C.dna.blood_type = random_blood_type()
if(DIGITIGRADE in species_traits)
C.Digitigrade_Leg_Swap(TRUE)
+ for(var/X in inherent_traits)
+ C.remove_trait(X, SPECIES_TRAIT)
/datum/species/proc/handle_hair(mob/living/carbon/human/H, forced_colour)
H.remove_overlay(HAIR_LAYER)
@@ -676,6 +683,8 @@ GLOBAL_LIST_EMPTY(roundstart_races)
S = GLOB.legs_list[H.dna.features["legs"]]
if("moth_wings")
S = GLOB.moth_wings_list[H.dna.features["moth_wings"]]
+ if("caps")
+ S = GLOB.caps_list[H.dna.features["caps"]]
//Mammal Bodyparts
if("mam_tail")
@@ -855,11 +864,11 @@ GLOBAL_LIST_EMPTY(roundstart_races)
//END EDIT
/datum/species/proc/spec_life(mob/living/carbon/human/H)
- if(NOBREATH in species_traits)
+ if(H.has_trait(TRAIT_NOBREATH))
H.setOxyLoss(0)
H.losebreath = 0
- var/takes_crit_damage = (!(NOCRITDAMAGE in species_traits))
+ var/takes_crit_damage = (!H.has_trait(TRAIT_NOCRITDAMAGE))
if((H.health < HEALTH_THRESHOLD_CRIT) && takes_crit_damage)
H.adjustBruteLoss(1)
@@ -1111,10 +1120,19 @@ GLOBAL_LIST_EMPTY(roundstart_races)
H.update_inv_wear_suit()
// nutrition decrease and satiety
- if (H.nutrition > 0 && H.stat != DEAD && \
- H.dna && H.dna.species && (!(NOHUNGER in H.dna.species.species_traits)))
+ if (H.nutrition > 0 && H.stat != DEAD && !H.has_trait(TRAIT_NOHUNGER))
// THEY HUNGER
var/hunger_rate = HUNGER_FACTOR
+ GET_COMPONENT_FROM(mood, /datum/component/mood, H)
+ if(mood)
+ switch(mood.mood) //Alerts do_after delay based on how happy you are
+ if(MOOD_LEVEL_HAPPY2 to MOOD_LEVEL_HAPPY3)
+ hunger_rate *= 0.9
+ if(MOOD_LEVEL_HAPPY3 to MOOD_LEVEL_HAPPY4)
+ hunger_rate *= 0.8
+ if(MOOD_LEVEL_HAPPY4 to INFINITY)
+ hunger_rate *= 0.7
+
if(H.satiety > 0)
H.satiety--
if(H.satiety < 0)
@@ -1136,7 +1154,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(H.nutrition > NUTRITION_LEVEL_FAT)
H.metabolism_efficiency = 1
else if(H.nutrition > NUTRITION_LEVEL_FED && H.satiety > 80)
- if(H.metabolism_efficiency != 1.25 && (H.dna && H.dna.species && !(NOHUNGER in H.dna.species.species_traits)))
+ if(H.metabolism_efficiency != 1.25 && !H.has_trait(TRAIT_NOHUNGER))
to_chat(H, "You feel vigorous. ")
H.metabolism_efficiency = 1.25
else if(H.nutrition < NUTRITION_LEVEL_STARVING + 50)
@@ -1148,14 +1166,31 @@ GLOBAL_LIST_EMPTY(roundstart_races)
to_chat(H, "You no longer feel vigorous. ")
H.metabolism_efficiency = 1
+ GET_COMPONENT_FROM(mood, /datum/component/mood, H)
switch(H.nutrition)
if(NUTRITION_LEVEL_FULL to INFINITY)
+ if(mood)
+ mood.add_event("nutrition", /datum/mood_event/nutrition/fat)
H.throw_alert("nutrition", /obj/screen/alert/fat)
- if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FULL)
+ if(NUTRITION_LEVEL_WELL_FED to NUTRITION_LEVEL_FULL)
+ if(mood)
+ mood.add_event("nutrition", /datum/mood_event/nutrition/wellfed)
+ H.clear_alert("nutrition")
+ if( NUTRITION_LEVEL_FED to NUTRITION_LEVEL_WELL_FED)
+ if(mood)
+ mood.add_event("nutrition", /datum/mood_event/nutrition/fed)
+ H.clear_alert("nutrition")
+ if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FED)
+ if(mood)
+ mood.clear_event("nutrition")
H.clear_alert("nutrition")
if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY)
+ if(mood)
+ mood.add_event("nutrition", /datum/mood_event/nutrition/hungry)
H.throw_alert("nutrition", /obj/screen/alert/hungry)
- else
+ if(0 to NUTRITION_LEVEL_STARVING)
+ if(mood)
+ mood.add_event("nutrition", /datum/mood_event/nutrition/starving)
H.throw_alert("nutrition", /obj/screen/alert/starving)
/datum/species/proc/update_health_hud(mob/living/carbon/human/H)
@@ -1165,7 +1200,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
. = FALSE
var/radiation = H.radiation
- if(RADIMMUNE in species_traits)
+ if(H.has_trait(TRAIT_RADIMMUNE))
radiation = 0
return TRUE
@@ -1255,15 +1290,24 @@ GLOBAL_LIST_EMPTY(roundstart_races)
for(var/obj/item/I in H.held_items)
if(I.flags_2 & SLOWS_WHILE_IN_HAND_2)
. += I.slowdown
- var/health_deficiency = (100 - H.health + H.staminaloss)
- var/hungry = (500 - H.nutrition) / 5 // So overeat would be 100 and default level would be 80
+ var/stambufferinfluence = (H.bufferedstam*(100/H.stambuffer))*0.2 //CIT CHANGE - makes stamina buffer influence movedelay
+ var/health_deficiency = ((100 + stambufferinfluence) - H.health + (H.staminaloss*0.75))//CIT CHANGE - reduces the impact of staminaloss on movement speed and makes stamina buffer influence movedelay
if(health_deficiency >= 40)
if(flight)
- . += (health_deficiency / 75)
+ . += ((health_deficiency-39) / 75) // CIT CHANGE - adds -39 to health deficiency penalty to make the transition to low health movement a little less jarring
else
- . += (health_deficiency / 25)
- if((hungry >= 70) && !flight) //Being hungry won't stop you from using flightpack controls/flapping your wings although it probably will in the wing case but who cares.
- . += hungry / 50
+ . += ((health_deficiency-39) / 25) // CIT CHANGE - ditto
+
+ GET_COMPONENT_FROM(mood, /datum/component/mood, H)
+ if(mood && !flight) //How can depression slow you down if you can just fly away from your problems?
+ switch(mood.mood)
+ if(-INFINITY to MOOD_LEVEL_SAD4)
+ . += 1.5
+ if(MOOD_LEVEL_SAD4 to MOOD_LEVEL_SAD3)
+ . += 1
+ if(MOOD_LEVEL_SAD3 to MOOD_LEVEL_SAD2)
+ . += 0.5
+
if(H.has_trait(TRAIT_FAT))
. += (1.5 - flight)
if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT)
@@ -1285,7 +1329,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
add_logs(user, target, "shaked")
return 1
else
- var/we_breathe = (!(NOBREATH in user.dna.species.species_traits))
+ var/we_breathe = !user.has_trait(TRAIT_NOBREATH)
var/we_lung = user.getorganslot(ORGAN_SLOT_LUNGS)
if(we_breathe && we_lung)
@@ -1313,6 +1357,9 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(user.has_trait(TRAIT_PACIFISM))
to_chat(user, "You don't want to harm [target]! ")
return FALSE
+ if(user.staminaloss >= STAMINA_SOFTCRIT) //CITADEL CHANGE - makes it impossible to punch while in stamina softcrit
+ to_chat(user, "You're too exhausted. ") //CITADEL CHANGE - ditto
+ return FALSE //CITADEL CHANGE - ditto
if(target.check_block())
target.visible_message("[target] blocks [user]'s attack! ")
return FALSE
@@ -1334,8 +1381,19 @@ GLOBAL_LIST_EMPTY(roundstart_races)
else
user.do_attack_animation(target, ATTACK_EFFECT_PUNCH)
+ user.adjustStaminaLossBuffered(5) //CITADEL CHANGE - makes punching cause staminaloss
+
var/damage = rand(user.dna.species.punchdamagelow, user.dna.species.punchdamagehigh)
+ //CITADEL CHANGES - makes resting and disabled combat mode reduce punch damage, makes being out of combat mode result in you taking more damage
+ if(!target.combatmode && damage < user.dna.species.punchstunthreshold)
+ damage = user.dna.species.punchstunthreshold - 1
+ if(user.resting)
+ damage *= 0.5
+ if(!user.combatmode)
+ damage *= 0.25
+ //END OF CITADEL CHANGES
+
var/obj/item/bodypart/affecting = target.get_bodypart(ran_zone(user.zone_selected))
if(!damage || !affecting)
@@ -1377,6 +1435,9 @@ GLOBAL_LIST_EMPTY(roundstart_races)
"You hear a slap.")
target.endTailWag()
return FALSE
+ else if(user.staminaloss >= STAMINA_SOFTCRIT)
+ to_chat(user, "You're too exhausted. ")
+ return FALSE
else if(target.check_block()) //END EDIT
target.visible_message("[target] blocks [user]'s disarm attempt! ")
return 0
@@ -1385,22 +1446,31 @@ GLOBAL_LIST_EMPTY(roundstart_races)
else
user.do_attack_animation(target, ATTACK_EFFECT_DISARM)
+ user.adjustStaminaLossBuffered(3) //CITADEL CHANGE - makes disarmspam cause staminaloss
+
if(target.w_uniform)
target.w_uniform.add_fingerprint(user)
- var/randomized_zone = ran_zone(user.zone_selected)
+ //var/randomized_zone = ran_zone(user.zone_selected) CIT CHANGE - comments out to prevent compiling errors
target.SendSignal(COMSIG_HUMAN_DISARM_HIT, user, user.zone_selected)
- var/obj/item/bodypart/affecting = target.get_bodypart(randomized_zone)
+ //var/obj/item/bodypart/affecting = target.get_bodypart(randomized_zone) CIT CHANGE - comments this out to prevent compile errors due to the below commented out bit
var/randn = rand(1, 100)
- if(randn <= 25)
+ /*if(randn <= 25) CITADEL CHANGE - moves disarm push attempts to right click
playsound(target, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
target.visible_message("[user] has pushed [target]! ",
"[user] has pushed [target]! ", null, COMBAT_MESSAGE_RANGE)
target.apply_effect(40, KNOCKDOWN, target.run_armor_check(affecting, "melee", "Your armor prevents your fall!", "Your armor softens your fall!"))
target.forcesay(GLOB.hit_appends)
add_logs(user, target, "disarmed", " pushing them to the ground")
- return
+ return*/
- if(randn <= 60)
+ if(!target.combatmode) // CITADEL CHANGE
+ randn += -10 //CITADEL CHANGE - being out of combat mode makes it easier for you to get disarmed
+ if(user.resting) //CITADEL CHANGE
+ randn += 60 //CITADEL CHANGE - No kosher disarming if you're resting
+ if(!user.combatmode) //CITADEL CHANGE
+ randn += 25 //CITADEL CHANGE - Makes it harder to disarm outside of combat mode
+
+ if(randn <= 35)//CIT CHANGE - changes this back to a 35% chance to accomodate for the above being commented out in favor of right-click pushing
var/obj/item/I = null
if(target.pulling)
target.visible_message("[user] has broken [target]'s grip on [target.pulling]! ")
@@ -1473,8 +1543,21 @@ GLOBAL_LIST_EMPTY(roundstart_races)
armor_block = min(90,armor_block) //cap damage reduction at 90%
var/Iforce = I.force //to avoid runtimes on the forcesay checks at the bottom. Some items might delete themselves if you drop them. (stunning yourself, ninja swords)
+ //CIT CHANGES START HERE - combatmode and resting checks
+ var/totitemdamage = I.force
+ if(iscarbon(user))
+ var/mob/living/carbon/tempcarb = user
+ if(!tempcarb.combatmode)
+ totitemdamage *= 0.5
+ if(user.resting)
+ totitemdamage *= 0.5
+ if(istype(H))
+ if(!H.combatmode)
+ totitemdamage *= 1.5
+ //CIT CHANGES END HERE
+
var/weakness = H.check_weakness(I, user)
- apply_damage(I.force * weakness, I.damtype, def_zone, armor_block, H)
+ apply_damage(totitemdamage * weakness, I.damtype, def_zone, armor_block, H) //CIT CHANGE - replaces I.force with totitemdamage
H.send_item_attack_message(I, user, hit_area)
@@ -1483,7 +1566,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
//dismemberment
var/probability = I.get_dismemberment_chance(affecting)
- if(prob(probability) || ((EASYDISMEMBER in species_traits) && prob(2*probability)))
+ if(prob(probability) || (H.has_trait(TRAIT_EASYDISMEMBER) && prob(2*probability)))
if(affecting.dismember(I.damtype))
I.add_mob_blood(H)
playsound(get_turf(H), I.get_dismember_sound(), 80, 1)
@@ -1612,9 +1695,10 @@ GLOBAL_LIST_EMPTY(roundstart_races)
/////////////
/datum/species/proc/breathe(mob/living/carbon/human/H)
- if(NOBREATH in species_traits)
+ if(H.has_trait(TRAIT_NOBREATH))
return TRUE
+
/datum/species/proc/handle_environment(datum/gas_mixture/environment, mob/living/carbon/human/H)
if(!environment)
return
@@ -1644,9 +1728,13 @@ GLOBAL_LIST_EMPTY(roundstart_races)
H.adjust_bodytemperature(natural*(1/(thermal_protection+1)) + min(thermal_protection * (loc_temp - H.bodytemperature) / BODYTEMP_HEAT_DIVISOR, BODYTEMP_HEATING_MAX))
// +/- 50 degrees from 310K is the 'safe' zone, where no damage is dealt.
- if(H.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT && !(RESISTHOT in species_traits))
+ GET_COMPONENT_FROM(mood, /datum/component/mood, H)
+ if(H.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT && !H.has_trait(TRAIT_RESISTHEAT))
//Body temperature is too hot.
var/burn_damage
+ if(mood)
+ mood.clear_event("cold")
+ mood.add_event("hot", /datum/mood_event/hot)
switch(H.bodytemperature)
if(BODYTEMP_HEAT_DAMAGE_LIMIT to 400)
H.throw_alert("temp", /obj/screen/alert/hot, 1)
@@ -1664,7 +1752,11 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if (H.stat < UNCONSCIOUS && (prob(burn_damage) * 10) / 4) //40% for level 3 damage on humans
H.emote("scream")
H.apply_damage(burn_damage, BURN)
+
else if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT && !(GLOB.mutations_list[COLDRES] in H.dna.mutations))
+ if(mood)
+ mood.clear_event("hot")
+ mood.add_event("cold", /datum/mood_event/cold)
switch(H.bodytemperature)
if(200 to BODYTEMP_COLD_DAMAGE_LIMIT)
H.throw_alert("temp", /obj/screen/alert/cold, 1)
@@ -1678,12 +1770,15 @@ GLOBAL_LIST_EMPTY(roundstart_races)
else
H.clear_alert("temp")
+ if(mood)
+ mood.clear_event("cold")
+ mood.clear_event("hot")
var/pressure = environment.return_pressure()
var/adjusted_pressure = H.calculate_affecting_pressure(pressure) //Returns how much pressure actually affects the mob.
switch(adjusted_pressure)
if(HAZARD_HIGH_PRESSURE to INFINITY)
- if(!(RESISTPRESSURE in species_traits))
+ if(!H.has_trait(TRAIT_RESISTHIGHPRESSURE))
H.adjustBruteLoss(min(((adjusted_pressure / HAZARD_HIGH_PRESSURE) -1 ) * PRESSURE_DAMAGE_COEFFICIENT, MAX_HIGH_PRESSURE_DAMAGE) * H.physiology.pressure_mod)
H.throw_alert("pressure", /obj/screen/alert/highpressure, 2)
else
@@ -1695,7 +1790,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE)
H.throw_alert("pressure", /obj/screen/alert/lowpressure, 1)
else
- if(H.dna.check_mutation(COLDRES) || (RESISTPRESSURE in species_traits))
+ if(H.has_trait(TRAIT_RESISTLOWPRESSURE))
H.clear_alert("pressure")
else
H.adjustBruteLoss(LOW_PRESSURE_DAMAGE * H.physiology.pressure_mod)
@@ -1706,7 +1801,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
//////////
/datum/species/proc/handle_fire(mob/living/carbon/human/H, no_protection = FALSE)
- if(NOFIRE in species_traits)
+ if(H.has_trait(TRAIT_NOFIRE))
return
if(H.on_fire)
//the fire tries to damage the exposed clothes and items
@@ -1772,8 +1867,9 @@ GLOBAL_LIST_EMPTY(roundstart_races)
else
H.adjust_bodytemperature(BODYTEMP_HEATING_MAX + (H.fire_stacks * 12))
+
/datum/species/proc/CanIgniteMob(mob/living/carbon/human/H)
- if(NOFIRE in species_traits)
+ if(H.has_trait(TRAIT_NOFIRE))
return FALSE
return TRUE
diff --git a/code/modules/mob/living/carbon/human/species_types/abductors.dm b/code/modules/mob/living/carbon/human/species_types/abductors.dm
index 447245cad0..54549b15b9 100644
--- a/code/modules/mob/living/carbon/human/species_types/abductors.dm
+++ b/code/modules/mob/living/carbon/human/species_types/abductors.dm
@@ -3,7 +3,8 @@
id = "abductor"
say_mod = "gibbers"
sexes = FALSE
- species_traits = list(SPECIES_ORGANIC,NOBLOOD,NOBREATH,VIRUSIMMUNE,NOGUNS,NOHUNGER,NOEYES)
+ species_traits = list(SPECIES_ORGANIC,NOBLOOD,NOEYES)
+ inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_NOGUNS,TRAIT_NOHUNGER,TRAIT_NOBREATH)
mutanttongue = /obj/item/organ/tongue/abductor
var/scientist = FALSE // vars to not pollute spieces list with castes
diff --git a/code/modules/mob/living/carbon/human/species_types/android.dm b/code/modules/mob/living/carbon/human/species_types/android.dm
index 4badfa8405..0178a99dad 100644
--- a/code/modules/mob/living/carbon/human/species_types/android.dm
+++ b/code/modules/mob/living/carbon/human/species_types/android.dm
@@ -2,7 +2,8 @@
name = "Android"
id = "android"
say_mod = "states"
- species_traits = list(SPECIES_ROBOTIC,NOBREATH,RESISTHOT,RESISTCOLD,RESISTPRESSURE,NOFIRE,NOBLOOD,PIERCEIMMUNE,NOHUNGER,EASYLIMBATTACHMENT)
+ species_traits = list(SPECIES_ROBOTIC,NOBLOOD)
+ inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_LIMBATTACHMENT)
meat = null
damage_overlay_type = "synth"
mutanttongue = /obj/item/organ/tongue/robot
diff --git a/code/modules/mob/living/carbon/human/species_types/corporate.dm b/code/modules/mob/living/carbon/human/species_types/corporate.dm
index bc1fcc9b1e..aa310723dd 100644
--- a/code/modules/mob/living/carbon/human/species_types/corporate.dm
+++ b/code/modules/mob/living/carbon/human/species_types/corporate.dm
@@ -15,5 +15,6 @@
attack_sound = 'sound/weapons/resonator_blast.ogg'
blacklisted = 1
use_skintones = 0
- species_traits = list(SPECIES_ORGANIC,RADIMMUNE,VIRUSIMMUNE,NOBLOOD,PIERCEIMMUNE,EYECOLOR,NODISMEMBER,NOHUNGER)
+ species_traits = list(SPECIES_ORGANIC,NOBLOOD,EYECOLOR)
+ inherent_traits = list(TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER)
sexes = 0
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species_types/dullahan.dm b/code/modules/mob/living/carbon/human/species_types/dullahan.dm
index 78cf1a3b7a..3a0e5a8415 100644
--- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm
+++ b/code/modules/mob/living/carbon/human/species_types/dullahan.dm
@@ -2,7 +2,8 @@
name = "dullahan"
id = "dullahan"
default_color = "FFFFFF"
- species_traits = list(SPECIES_ORGANIC,EYECOLOR,HAIR,FACEHAIR,LIPS,NOBREATH,NOHUNGER)
+ species_traits = list(SPECIES_ORGANIC,EYECOLOR,HAIR,FACEHAIR,LIPS)
+ inherent_traits = list(TRAIT_NOHUNGER,TRAIT_NOBREATH)
mutant_bodyparts = list("tail_human", "ears", "wings")
default_features = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None", "wings" = "None")
use_skintones = TRUE
diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
index 1630b7a194..2208c5a597 100644
--- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
@@ -53,7 +53,8 @@
miss_sound = 'sound/weapons/slashmiss.ogg'
liked_food = MEAT
disliked_food = TOXIC
-
+ meat = /obj/item/reagent_containers/food/snacks/carpmeat/aquatic
+
/datum/species/aquatic/spec_death(gibbed, mob/living/carbon/human/H)
if(H)
H.endTailWag()
@@ -247,7 +248,8 @@
name = "Slimeperson"
id = "slimeperson"
default_color = "00FFFF"
- species_traits = list(SPECIES_ORGANIC,MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD,TOXINLOVER)
+ species_traits = list(SPECIES_ORGANIC,MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD)
+ inherent_traits = list(TRAIT_TOXINLOVER)
mutant_bodyparts = list("mam_tail", "mam_ears", "taur")
default_features = list("mcolor" = "FFF", "mam_tail" = "None", "mam_ears" = "None")
say_mod = "says"
@@ -350,3 +352,10 @@
H.update_body()
else
return
+
+//misc
+/mob/living/carbon/human/dummy
+ no_vore = TRUE
+
+/mob/living/carbon/human/vore
+ devourable = TRUE
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm
index 3619e04584..d274261a2b 100644
--- a/code/modules/mob/living/carbon/human/species_types/golems.dm
+++ b/code/modules/mob/living/carbon/human/species_types/golems.dm
@@ -2,7 +2,8 @@
// Animated beings of stone. They have increased defenses, and do not need to breathe. They're also slow as fuuuck.
name = "Golem"
id = "iron golem"
- species_traits = list(SPECIES_INORGANIC,NOBREATH,RESISTHOT,RESISTCOLD,RESISTPRESSURE,NOFIRE,NOGUNS,NOBLOOD,RADIMMUNE,PIERCEIMMUNE,NODISMEMBER,MUTCOLORS,NO_UNDERWEAR)
+ species_traits = list(SPECIES_INORGANIC,NOBLOOD,MUTCOLORS,NO_UNDERWEAR)
+ inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
mutant_organs = list(/obj/item/organ/adamantine_resonator)
speedmod = 2
armor = 55
@@ -84,7 +85,7 @@
fixed_mut_color = "a3d"
meat = /obj/item/stack/ore/plasma
//Can burn and takes damage from heat
- species_traits = list(SPECIES_INORGANIC,NOBREATH,RESISTCOLD,RESISTPRESSURE,NOGUNS,NOBLOOD,RADIMMUNE,PIERCEIMMUNE,NODISMEMBER,MUTCOLORS,NO_UNDERWEAR)
+ inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
info_text = "As a Plasma Golem , you burn easily. Be careful, if you get hot enough while burning, you'll blow up!"
heatmod = 0 //fine until they blow up
prefix = "Plasma"
@@ -258,7 +259,7 @@
fixed_mut_color = "49311c"
meat = /obj/item/stack/sheet/mineral/wood
//Can burn and take damage from heat
- species_traits = list(SPECIES_ORGANIC,NOBREATH,RESISTCOLD,RESISTPRESSURE,NOGUNS,NOBLOOD,RADIMMUNE,PIERCEIMMUNE,NODISMEMBER,MUTCOLORS,NO_UNDERWEAR)
+ inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
armor = 30
burnmod = 1.25
heatmod = 1.5
@@ -565,7 +566,7 @@
limbs_id = "cultgolem"
sexes = FALSE
info_text = "As a Runic Golem , you possess eldritch powers granted by the Elder God Nar'Sie."
- species_traits = list(SPECIES_INORGANIC,NOBREATH,RESISTHOT,RESISTCOLD,RESISTPRESSURE,NOFIRE,NOGUNS,NOBLOOD,RADIMMUNE,PIERCEIMMUNE,NODISMEMBER,NO_UNDERWEAR,NOEYES) //no mutcolors
+ species_traits = list(SPECIES_INORGANIC,NOBLOOD,NO_UNDERWEAR,NOEYES) //no mutcolors
prefix = "Runic"
var/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/golem/phase_shift
@@ -619,7 +620,7 @@
limbs_id = "clockgolem"
info_text = "As a clockwork golem , you are faster than \
other types of golem (being a machine), and are immune to electric shocks. "
- species_traits = list(SPECIES_INORGANIC,NO_UNDERWEAR, NOTRANSSTING, NOBREATH, NOZOMBIE, RADIMMUNE, NOBLOOD, RESISTCOLD, RESISTPRESSURE, PIERCEIMMUNE, NOEYES)
+ species_traits = list(SPECIES_ROBOTIC,NOBLOOD,NO_UNDERWEAR,NOEYES)
armor = 20 //Reinforced, but much less so to allow for fast movement
attack_verb = "smash"
attack_sound = 'sound/magic/clockwork/anima_fragment_attack.ogg'
@@ -671,7 +672,8 @@
limbs_id = "clothgolem"
sexes = FALSE
info_text = "As a Cloth Golem , you are able to reform yourself after death, provided your remains aren't burned or destroyed. You are, of course, very flammable."
- species_traits = list(SPECIES_UNDEAD,NOBREATH,RESISTCOLD,RESISTPRESSURE,NOGUNS,NOBLOOD,RADIMMUNE,PIERCEIMMUNE,NODISMEMBER,NO_UNDERWEAR) //no mutcolors, and can burn
+ species_traits = list(SPECIES_UNDEAD,NOBLOOD,NO_UNDERWEAR) //no mutcolors, and can burn
+ inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOGUNS)
armor = 15 //feels no pain, but not too resistant
burnmod = 2 // don't get burned
speedmod = 1 // not as heavy as stone
diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
index f32588d6b3..809c657f23 100644
--- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
@@ -4,7 +4,8 @@
id = "jelly"
default_color = "00FF90"
say_mod = "chirps"
- species_traits = list(SPECIES_ORGANIC,MUTCOLORS,EYECOLOR,NOBLOOD,VIRUSIMMUNE,HAIR,FACEHAIR,TOXINLOVER) //CIT CHANGE - adds HAIR and FACEHAIR to species traits
+ species_traits = list(SPECIES_ORGANIC,MUTCOLORS,EYECOLOR,,HAIR,FACEHAIR,NOBLOOD)
+ inherent_traits = list(TRAIT_TOXINLOVER)
mutant_bodyparts = list("mam_tail", "mam_ears", "taur") //CIT CHANGE
default_features = list("mcolor" = "FFF", "mam_tail" = "None", "mam_ears" = "None") //CIT CHANGE
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/slime
@@ -118,6 +119,7 @@
name = "Slimeperson"
id = "slime"
default_color = "00FFFF"
+ species_traits = list(SPECIES_ORGANIC,MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD)
say_mod = "says"
hair_color = "mutcolor"
hair_alpha = 150
@@ -382,6 +384,7 @@
around.",
"...and move this one instead. ")
+
///////////////////////////////////LUMINESCENTS//////////////////////////////////////////
//Luminescents are able to consume and use slime extracts, without them decaying.
@@ -540,7 +543,6 @@
if(species.current_extract)
species.extract_cooldown = world.time + 100
-
var/cooldown = species.current_extract.activate(H, species, activation_type)
species.extract_cooldown = world.time + cooldown
@@ -553,8 +555,6 @@
///////////////////////////////////STARGAZERS//////////////////////////////////////////
//Stargazers are the telepathic branch of jellypeople, able to project psychic messages and to link minds with willing participants.
-//Admin spawn only
-
/datum/species/jelly/stargazer
name = "Stargazer"
@@ -723,5 +723,4 @@
to_chat(H, "You connect [target]'s mind to your slime link! ")
else
to_chat(H, "You can't seem to link [target]'s mind... ")
- to_chat(target, "The foreign presence leaves your mind. ")
-
+ to_chat(target, "The foreign presence leaves your mind. ")
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
index 0d006196aa..15c8f70dc8 100644
--- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
@@ -54,4 +54,5 @@
name = "Ash Walker"
id = "ashlizard"
limbs_id = "lizard"
- species_traits = list(MUTCOLORS,EYECOLOR,LIPS,NOBREATH,NOGUNS,DIGITIGRADE)
+ species_traits = list(MUTCOLORS,EYECOLOR,LIPS,DIGITIGRADE)
+ inherent_traits = list(TRAIT_NOGUNS,TRAIT_NOBREATH)
diff --git a/code/modules/mob/living/carbon/human/species_types/mothmen.dm b/code/modules/mob/living/carbon/human/species_types/mothmen.dm
index 7f0d8afe26..8735d6ceb6 100644
--- a/code/modules/mob/living/carbon/human/species_types/mothmen.dm
+++ b/code/modules/mob/living/carbon/human/species_types/mothmen.dm
@@ -54,7 +54,7 @@
/datum/species/moth/space_move(mob/living/carbon/human/H)
. = ..()
- if(H.loc && !isspaceturf(H.loc) && H.dna.features["moth_wings"] != "Burnt Off" || "None")
+ if(H.loc && !isspaceturf(H.loc) && H.dna.features["moth_wings"] != "Burnt Off")
var/datum/gas_mixture/current = H.loc.return_air()
if(current && (current.return_pressure() >= ONE_ATMOSPHERE*0.85)) //as long as there's reasonable pressure and no gravity, flight is possible
return TRUE
diff --git a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm
new file mode 100644
index 0000000000..18cb2d248d
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm
@@ -0,0 +1,60 @@
+/datum/species/mush //mush mush codecuck
+ name = "Mushroomperson"
+ id = "mush"
+ mutant_bodyparts = list("caps")
+ default_features = list("caps" = "Round")
+
+ fixed_mut_color = "DBBF92"
+ hair_color = "FF4B19" //cap color, spot color uses eye color
+ nojumpsuit = TRUE
+
+ say_mod = "poofs" //what does a mushroom sound like
+ species_traits = list(MUTCOLORS, NOEYES, NO_UNDERWEAR)
+ inherent_traits = list(TRAIT_NOBREATH)
+ speedmod = 1.5 //faster than golems but not by much
+
+ punchdamagelow = 6
+ punchdamagehigh = 14
+ punchstunthreshold = 14 //about 44% chance to stun
+
+ no_equip = list(slot_wear_mask, slot_wear_suit, slot_gloves, slot_shoes, slot_w_uniform)
+
+ burnmod = 1.25
+ heatmod = 1.5
+
+ mutanteyes = /obj/item/organ/eyes/night_vision/mushroom
+ use_skintones = FALSE
+ var/datum/martial_art/mushpunch/mush
+
+/datum/species/mush/check_roundstart_eligible()
+ return FALSE //hard locked out of roundstart on the order of design lead kor, this can be removed in the future when planetstation is here OR SOMETHING but right now we have a problem with races.
+
+/datum/species/mush/after_equip_job(datum/job/J, mob/living/carbon/human/H)
+ H.grant_language(/datum/language/mushroom) //pomf pomf
+
+/datum/species/mush/on_species_gain(mob/living/carbon/C, datum/species/old_species)
+ . = ..()
+ if(ishuman(C))
+ var/mob/living/carbon/human/H = C
+ if(!H.dna.features["caps"])
+ H.dna.features["caps"] = "Round"
+ handle_mutant_bodyparts(H)
+ H.faction |= "mushroom"
+ mush = new(null)
+ mush.teach(H)
+
+/datum/species/mush/on_species_loss(mob/living/carbon/C)
+ . = ..()
+ C.faction -= "mushroom"
+ mush.remove(C)
+ QDEL_NULL(mush)
+
+/datum/species/mush/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
+ if(chem.id == "weedkiller")
+ H.adjustToxLoss(3)
+ H.reagents.remove_reagent(chem.id, REAGENTS_METABOLISM)
+ return TRUE
+
+/datum/species/mush/handle_mutant_bodyparts(mob/living/carbon/human/H, forced_colour)
+ forced_colour = FALSE
+ ..()
diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
index a5c6720db5..5209fe8310 100644
--- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
+++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
@@ -4,7 +4,8 @@
say_mod = "rattles"
sexes = 0
meat = /obj/item/stack/sheet/mineral/plasma
- species_traits = list(SPECIES_INORGANIC,NOBLOOD,RESISTCOLD,RADIMMUNE,NOTRANSSTING,NOHUNGER)
+ species_traits = list(SPECIES_INORGANIC,NOBLOOD,NOTRANSSTING)
+ inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RADIMMUNE,TRAIT_NOHUNGER)
mutantlungs = /obj/item/organ/lungs/plasmaman
mutanttongue = /obj/item/organ/tongue/bone/plasmaman
mutantliver = /obj/item/organ/liver/plasmaman
diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
index 9357855191..17e7649cb6 100644
--- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
@@ -9,7 +9,8 @@
blacklisted = 1
ignored_by = list(/mob/living/simple_animal/hostile/faithless)
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/shadow
- species_traits = list(SPECIES_ORGANIC,NOBREATH,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,NOEYES)
+ species_traits = list(SPECIES_ORGANIC,NOBLOOD,NOEYES)
+ inherent_traits = list(TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_NOBREATH)
dangerous_existence = 1
mutanteyes = /obj/item/organ/eyes/night_vision
@@ -37,7 +38,8 @@
burnmod = 1.5
blacklisted = TRUE
no_equip = list(slot_wear_mask, slot_wear_suit, slot_gloves, slot_shoes, slot_w_uniform, slot_s_store)
- species_traits = list(NOBREATH,RESISTCOLD,RESISTPRESSURE,NOGUNS,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE,NODISMEMBER,NO_UNDERWEAR,NOHUNGER,NO_DNA_COPY,NOTRANSSTING,NOEYES)
+ species_traits = list(NOBLOOD,NO_UNDERWEAR,NO_DNA_COPY,NOTRANSSTING,NOEYES)
+ inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER)
mutanteyes = /obj/item/organ/eyes/night_vision/nightmare
mutant_organs = list(/obj/item/organ/heart/nightmare)
mutant_brain = /obj/item/organ/brain/nightmare
diff --git a/code/modules/mob/living/carbon/human/species_types/skeletons.dm b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
index d47f3d71d5..c6a7e7a127 100644
--- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm
+++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
@@ -6,7 +6,8 @@
blacklisted = 1
sexes = 0
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton
- species_traits = list(SPECIES_UNDEAD,NOBREATH,RESISTHOT,RESISTCOLD,RESISTPRESSURE,NOBLOOD,RADIMMUNE,PIERCEIMMUNE,NOHUNGER,EASYDISMEMBER,EASYLIMBATTACHMENT)
+ species_traits = list(SPECIES_UNDEAD,NOBLOOD)
+ inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT)
mutanttongue = /obj/item/organ/tongue/bone
damage_overlay_type = ""//let's not show bloody wounds or burns over bones.
disliked_food = NONE
diff --git a/code/modules/mob/living/carbon/human/species_types/synths.dm b/code/modules/mob/living/carbon/human/species_types/synths.dm
index 856a472a73..786872544e 100644
--- a/code/modules/mob/living/carbon/human/species_types/synths.dm
+++ b/code/modules/mob/living/carbon/human/species_types/synths.dm
@@ -3,13 +3,15 @@
id = "synth"
say_mod = "beep boops" //inherited from a user's real species
sexes = 0
- species_traits = list(SPECIES_ROBOTIC,NOTRANSSTING,NOBREATH,VIRUSIMMUNE,NODISMEMBER,NOHUNGER) //all of these + whatever we inherit from the real species
+ species_traits = list(SPECIES_ROBOTIC,NOTRANSSTING) //all of these + whatever we inherit from the real species
+ inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER,TRAIT_NOBREATH)
dangerous_existence = 1
blacklisted = 1
meat = null
damage_overlay_type = "synth"
limbs_id = "synth"
- var/list/initial_species_traits = list(SPECIES_ROBOTIC,NOTRANSSTING,NOBREATH,VIRUSIMMUNE,NODISMEMBER,NOHUNGER,NO_DNA_COPY) //for getting these values back for assume_disguise()
+ var/list/initial_species_traits = list(SPECIES_ROBOTIC,NOTRANSSTING) //for getting these values back for assume_disguise()
+ var/list/initial_inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER,TRAIT_NOBREATH)
var/disguise_fail_health = 75 //When their health gets to this level their synthflesh partially falls off
var/datum/species/fake_species = null //a species to do most of our work for us, unless we're damaged
@@ -41,7 +43,9 @@
say_mod = S.say_mod
sexes = S.sexes
species_traits = initial_species_traits.Copy()
+ inherent_traits = initial_inherent_traits.Copy()
species_traits |= S.species_traits
+ inherent_traits |= S.inherent_traits
species_traits -= list(SPECIES_ORGANIC, SPECIES_INORGANIC, SPECIES_UNDEAD)
attack_verb = S.attack_verb
attack_sound = S.attack_sound
@@ -61,6 +65,7 @@
name = initial(name)
say_mod = initial(say_mod)
species_traits = initial_species_traits.Copy()
+ inherent_traits = initial_inherent_traits.Copy()
attack_verb = initial(attack_verb)
attack_sound = initial(attack_sound)
miss_sound = initial(miss_sound)
diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm
index 5186811331..2267be85f2 100644
--- a/code/modules/mob/living/carbon/human/species_types/vampire.dm
+++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm
@@ -2,7 +2,8 @@
name = "vampire"
id = "vampire"
default_color = "FFFFFF"
- species_traits = list(SPECIES_UNDEAD,EYECOLOR,HAIR,FACEHAIR,LIPS,NOHUNGER,NOBREATH,DRINKSBLOOD)
+ species_traits = list(SPECIES_UNDEAD,EYECOLOR,HAIR,FACEHAIR,LIPS,DRINKSBLOOD)
+ inherent_traits = list(TRAIT_NOHUNGER,TRAIT_NOBREATH)
mutant_bodyparts = list("tail_human", "ears", "wings")
default_features = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None", "wings" = "None")
exotic_bloodtype = "U"
diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm
index 14502aa931..7fcc470661 100644
--- a/code/modules/mob/living/carbon/human/species_types/zombies.dm
+++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm
@@ -8,7 +8,8 @@
sexes = 0
blacklisted = 1
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/zombie
- species_traits = list(SPECIES_UNDEAD,NOBREATH,RESISTCOLD,RESISTPRESSURE,NOBLOOD,RADIMMUNE,NOZOMBIE,EASYDISMEMBER,EASYLIMBATTACHMENT,NOTRANSSTING)
+ species_traits = list(SPECIES_UNDEAD,NOBLOOD,NOZOMBIE,NOTRANSSTING)
+ inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_NOBREATH)
mutanttongue = /obj/item/organ/tongue/zombie
var/static/list/spooks = list('sound/hallucinations/growl1.ogg','sound/hallucinations/growl2.ogg','sound/hallucinations/growl3.ogg','sound/hallucinations/veryfar_noise.ogg','sound/hallucinations/wail.ogg')
disliked_food = NONE
diff --git a/code/modules/mob/living/carbon/human/status_procs.dm b/code/modules/mob/living/carbon/human/status_procs.dm
index cf3d676e90..844545a748 100644
--- a/code/modules/mob/living/carbon/human/status_procs.dm
+++ b/code/modules/mob/living/carbon/human/status_procs.dm
@@ -9,6 +9,13 @@
/mob/living/carbon/human/Unconscious(amount, updating = 1, ignore_canunconscious = 0)
amount = dna.species.spec_stun(src,amount)
+ if(has_trait(TRAIT_HEAVY_SLEEPER))
+ amount *= rand(1.25, 1.3)
+ return ..()
+
+/mob/living/carbon/human/Sleeping(amount, updating = 1, ignore_sleepimmune = 0)
+ if(has_trait(TRAIT_HEAVY_SLEEPER))
+ amount *= rand(1.25, 1.3)
return ..()
/mob/living/carbon/human/cure_husk(list/sources)
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 8cbbc2b90f..dc939f8fc1 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -52,6 +52,8 @@
return
if(ismob(loc))
return
+ if(istype(loc, /obj/belly))
+ return
var/datum/gas_mixture/environment
if(loc)
@@ -102,7 +104,9 @@
air_update_turf()
/mob/living/carbon/proc/has_smoke_protection()
- return 0
+ if(has_trait(TRAIT_NOBREATH))
+ return TRUE
+ return FALSE
//Third link in a breath chain, calls handle_breath_temperature()
@@ -140,6 +144,7 @@
//OXYGEN
+ GET_COMPONENT_FROM(mood, /datum/component/mood, src)
if(O2_partialpressure < safe_oxy_min) //Not enough oxygen
if(prob(20))
emote("gasp")
@@ -152,6 +157,8 @@
adjustOxyLoss(3)
failed_last_breath = 1
throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy)
+ if(mood)
+ mood.add_event("suffocation", /datum/mood_event/suffocation)
else //Enough oxygen
failed_last_breath = 0
@@ -159,6 +166,8 @@
adjustOxyLoss(-5)
oxygen_used = breath_gases[/datum/gas/oxygen][MOLES]
clear_alert("not_enough_oxy")
+ if(mood)
+ mood.clear_event("suffocation")
breath_gases[/datum/gas/oxygen][MOLES] -= oxygen_used
breath_gases[/datum/gas/carbon_dioxide][MOLES] += oxygen_used
@@ -249,7 +258,7 @@
O.on_life()
/mob/living/carbon/handle_diseases()
- for(var/thing in viruses)
+ for(var/thing in diseases)
var/datum/disease/D = thing
if(prob(D.infectivity))
D.spread()
@@ -322,8 +331,17 @@
//this updates all special effects: stun, sleeping, knockdown, druggy, stuttering, etc..
/mob/living/carbon/handle_status_effects()
..()
- if(staminaloss)
- adjustStaminaLoss(-3)
+ if(staminaloss && !combatmode && !aimingdownsights)//CIT CHANGE - prevents stamina regen while combat mode is active
+ adjustStaminaLoss(resting ? (recoveringstam ? -7.5 : -3) : -1.5)//CIT CHANGE - decreases adjuststaminaloss to stop stamina damage from being such a joke
+ else if(aimingdownsights)//CIT CHANGE - makes aiming down sights drain stamina
+ adjustStaminaLoss(resting ? 0.2 : 0.5)//CIT CHANGE - ditto. Raw spaghetti
+
+ //CIT CHANGES START HERE. STAMINA BUFFER STUFF
+ if(bufferedstam && world.time > stambufferregentime)
+ var/drainrate = max((bufferedstam*(bufferedstam/(5)))*0.1,1)
+ bufferedstam = max(bufferedstam - drainrate, 0)
+ adjustStaminaLoss(drainrate*0.5)
+ //END OF CIT CHANGES
var/restingpwr = 1 + 4 * resting
@@ -434,10 +452,10 @@
L.damage += d
/mob/living/carbon/proc/liver_failure()
- if(reagents.get_reagent_amount("corazone"))//corazone is processed here an not in the liver because a failing liver can't metabolize reagents
- reagents.remove_reagent("corazone", 0.4) //corazone slowly deletes itself.
+ reagents.metabolize(src, can_overdose=FALSE, liverless = TRUE)
+ if(has_trait(TRAIT_STABLEHEART))
return
- adjustToxLoss(8, TRUE, TRUE)
+ adjustToxLoss(8, TRUE, TRUE)
if(prob(30))
to_chat(src, "You feel confused and nauseous... ")//actual symptoms of liver failure
diff --git a/code/modules/mob/living/carbon/monkey/combat.dm b/code/modules/mob/living/carbon/monkey/combat.dm
index 32b368db4f..ec419ef94c 100644
--- a/code/modules/mob/living/carbon/monkey/combat.dm
+++ b/code/modules/mob/living/carbon/monkey/combat.dm
@@ -1,3 +1,4 @@
+#define MAX_RANGE_FIND 32
/mob/living/carbon/monkey
var/aggressive=0 // set to 1 using VV for an angry monkey
@@ -140,7 +141,7 @@
// Really no idea what needs to be returned but everything else is TRUE
return TRUE
- if(on_fire || buckled || restrained())
+ if(on_fire || buckled || restrained() || (resting && canmove)) //CIT CHANGE - adds (resting && canmove) to make monkey ai attempt to resist out of resting
if(!resisting && prob(MONKEY_RESIST_PROB))
resisting = TRUE
walk_to(src,0)
@@ -475,3 +476,5 @@
if(A)
dropItemToGround(A, TRUE)
update_icons()
+
+#undef MAX_RANGE_FIND
diff --git a/code/modules/mob/living/carbon/status_procs.dm b/code/modules/mob/living/carbon/status_procs.dm
index eccdd5d2cf..1db31d5a2d 100644
--- a/code/modules/mob/living/carbon/status_procs.dm
+++ b/code/modules/mob/living/carbon/status_procs.dm
@@ -42,12 +42,17 @@
/mob/living/carbon/adjust_drugginess(amount)
druggy = max(druggy+amount, 0)
+ GET_COMPONENT_FROM(mood, /datum/component/mood, src)
if(druggy)
overlay_fullscreen("high", /obj/screen/fullscreen/high)
throw_alert("high", /obj/screen/alert/high)
+ if(mood)
+ mood.add_event("high", /datum/mood_event/drugs/high)
else
clear_fullscreen("high")
clear_alert("high")
+ if(mood)
+ mood.clear_event("high")
/mob/living/carbon/set_drugginess(amount)
druggy = max(amount, 0)
@@ -97,4 +102,3 @@
var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN)
if(B)
. = B.cure_all_traumas(resilience)
-
diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm
index 8043f055bb..0c63ad2ab4 100644
--- a/code/modules/mob/living/life.dm
+++ b/code/modules/mob/living/life.dm
@@ -54,9 +54,6 @@
handle_fire()
- // Citadel Vore code for belly processes
- handle_internal_contents()
-
//stuff in the stomach
handle_stomach()
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index c78d8b19d7..ad9d76b6f4 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -48,7 +48,7 @@
staticOverlays.len = 0
remove_from_all_data_huds()
GLOB.mob_living_list -= src
-
+ QDEL_LIST(diseases)
return ..()
/mob/living/ghostize(can_reenter_corpse = 1)
@@ -108,24 +108,24 @@
/mob/living/proc/MobCollide(mob/M)
//Even if we don't push/swap places, we "touched" them, so spread fire
spreadFire(M)
- //Also diseases
- for(var/thing in viruses)
- var/datum/disease/D = thing
- if(D.spread_flags & VIRUS_SPREAD_CONTACT_SKIN)
- M.ContactContractDisease(D)
-
- for(var/thing in M.viruses)
- var/datum/disease/D = thing
- if(D.spread_flags & VIRUS_SPREAD_CONTACT_SKIN)
- ContactContractDisease(D)
if(now_pushing)
return TRUE
-
- //Should stop you pushing a restrained person out of the way
if(isliving(M))
var/mob/living/L = M
+ //Also spread diseases
+ for(var/thing in diseases)
+ var/datum/disease/D = thing
+ if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN)
+ L.ContactContractDisease(D)
+
+ for(var/thing in L.diseases)
+ var/datum/disease/D = thing
+ if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN)
+ ContactContractDisease(D)
+
+ //Should stop you pushing a restrained person out of the way
if(L.pulledby && L.pulledby != src && L.restrained())
if(!(world.time % 5))
to_chat(src, "[L] is restrained, you cannot push past. ")
@@ -224,6 +224,60 @@
AM.setDir(current_dir)
now_pushing = 0
+/mob/living/start_pulling(atom/movable/AM, supress_message = 0)
+ if(!AM || !src)
+ return FALSE
+ if(!(AM.can_be_pulled(src)))
+ return FALSE
+ if(throwing || incapacitated())
+ return FALSE
+
+ AM.add_fingerprint(src)
+
+ // If we're pulling something then drop what we're currently pulling and pull this instead.
+ if(pulling)
+ // Are we trying to pull something we are already pulling? Then just stop here, no need to continue.
+ if(AM == pulling)
+ return
+ stop_pulling()
+
+ changeNext_move(CLICK_CD_GRABBING)
+
+ if(AM.pulledby)
+ if(!supress_message)
+ visible_message("[src] has pulled [AM] from [AM.pulledby]'s grip. ")
+ add_logs(AM, AM.pulledby, "pulled from", src)
+ AM.pulledby.stop_pulling() //an object can't be pulled by two mobs at once.
+
+ pulling = AM
+ AM.pulledby = src
+ if(!supress_message)
+ playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+ update_pull_hud_icon()
+
+ if(ismob(AM))
+ var/mob/M = AM
+
+ add_logs(src, M, "grabbed", addition="passive grab")
+ if(!supress_message)
+ visible_message("[src] has grabbed [M] passively! ")
+ if(!iscarbon(src))
+ M.LAssailant = null
+ else
+ M.LAssailant = usr
+ if(isliving(M))
+ var/mob/living/L = M
+ //Share diseases that are spread by touch
+ for(var/thing in diseases)
+ var/datum/disease/D = thing
+ if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN)
+ L.ContactContractDisease(D)
+
+ for(var/thing in L.diseases)
+ var/datum/disease/D = thing
+ if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN)
+ ContactContractDisease(D)
+
//mob verbs are a lot faster than object verbs
//for more info on why this is not atom/pull, see examinate() in mob.dm
/mob/living/verb/pulled(atom/movable/AM as mob|obj in oview(1))
@@ -235,6 +289,15 @@
else
stop_pulling()
+/mob/living/stop_pulling()
+ ..()
+ update_pull_hud_icon()
+
+/mob/living/verb/stop_pulling1()
+ set name = "Stop Pulling"
+ set category = "IC"
+ stop_pulling()
+
//same as above
/mob/living/pointed(atom/A as mob|obj|turf in view())
if(incapacitated())
@@ -257,7 +320,7 @@
death()
/mob/living/incapacitated(ignore_restraints, ignore_grab)
- if(stat || IsUnconscious() || IsStun() || IsKnockdown() || (!ignore_restraints && restrained(ignore_grab)))
+ if(stat || IsUnconscious() || IsStun() || IsKnockdown() || recoveringstam || (!ignore_restraints && restrained(ignore_grab))) // CIT CHANGE - adds recoveringstam check here
return 1
/mob/living/proc/InCritical()
@@ -314,6 +377,7 @@
/mob/proc/get_contents()
+/*CIT CHANGE - comments out lay_down proc to be modified in modular_citadel
/mob/living/proc/lay_down()
set name = "Rest"
set category = "IC"
@@ -321,6 +385,7 @@
resting = !resting
to_chat(src, "You are now [resting ? "resting" : "getting up"]. ")
update_canmove()
+*/
//Recursive function to find everything a mob is holding.
/mob/living/get_contents(obj/item/storage/Storage = null)
@@ -580,9 +645,9 @@
if(buckled && last_special <= world.time)
resist_buckle()
- // climbing out of a gut
+ // CIT CHANGE - climbing out of a gut
if(attempt_vr(src,"vore_process_resist",args)) return TRUE
-
+
//Breaking out of a container (Locker, sleeper, cryo...)
else if(isobj(loc))
var/obj/C = loc
@@ -599,6 +664,8 @@
else if(canmove)
if(on_fire)
resist_fire() //stop, drop, and roll
+ else if(resting) //cit change - allows resisting out of resting
+ resist_a_rest() // ditto
else if(last_special <= world.time)
resist_restraints() //trying to remove cuffs.
@@ -788,15 +855,21 @@
return FALSE
return TRUE
-/mob/living/proc/can_use_guns(obj/item/G)
+/mob/living/proc/can_use_guns(obj/item/G)//actually used for more than guns!
if(G.trigger_guard != TRIGGER_GUARD_ALLOW_ALL && !IsAdvancedToolUser())
to_chat(src, "You don't have the dexterity to do this! ")
return FALSE
+ var/obj/item/gun/shooty
+ if(istype(G, /obj/item/gun))
+ shooty = G
if(has_trait(TRAIT_PACIFISM))
+ if(shooty && !shooty.harmful)
+ return TRUE
to_chat(src, "You don't want to risk harming anyone! ")
return FALSE
return TRUE
+/*CIT CHANGE - comments out update_stamina to be modified in modular_citadel
/mob/living/carbon/proc/update_stamina()
if(staminaloss)
var/total_health = (health - staminaloss)
@@ -805,6 +878,7 @@
Knockdown(100)
setStaminaLoss(health - 2)
update_health_hud()
+*/
/mob/living/carbon/alien/update_stamina()
return
@@ -889,6 +963,9 @@
"You're set on fire! ")
new/obj/effect/dummy/fire(src)
throw_alert("fire", /obj/screen/alert/fire)
+ GET_COMPONENT_FROM(mood, /datum/component/mood, src)
+ if(mood)
+ mood.add_event("on_fire", /datum/mood_event/on_fire)
update_fire()
return TRUE
return FALSE
@@ -900,6 +977,9 @@
for(var/obj/effect/dummy/fire/F in src)
qdel(F)
clear_alert("fire")
+ GET_COMPONENT_FROM(mood, /datum/component/mood, src)
+ if(mood)
+ mood.clear_event("on_fire")
update_fire()
/mob/living/proc/adjust_fire_stacks(add_fire_stacks) //Adjusting the amount of fire_stacks we have on person
@@ -953,25 +1033,32 @@
var/ko = IsKnockdown() || IsUnconscious() || (stat && (stat != SOFT_CRIT || pulledby)) || (has_trait(TRAIT_FAKEDEATH))
var/move_and_fall = stat == SOFT_CRIT && !pulledby
var/chokehold = pulledby && pulledby.grab_state >= GRAB_NECK
+ var/pinned = resting && pulledby && pulledby.grab_state >= GRAB_AGGRESSIVE // Cit change - adds pinning for aggressive-grabbing people on the ground
var/buckle_lying = !(buckled && !buckled.buckle_lying)
var/has_legs = get_num_legs()
var/has_arms = get_num_arms()
var/ignore_legs = get_leg_ignore()
- if(ko || resting || move_and_fall || IsStun() || chokehold)
+ if(ko || move_and_fall || IsStun() || chokehold) // Cit change - makes resting not force you to drop everything
drop_all_held_items()
unset_machine()
if(pulling)
stop_pulling()
+ else if(resting) //CIT CHANGE - makes resting make you stop pulling and interacting with machines
+ unset_machine() //CIT CHANGE - Ditto!
+ if(pulling) //CIT CHANGE - Ditto.
+ stop_pulling() //CIT CHANGE - Ditto...
else if(has_legs || ignore_legs)
lying = 0
if(buckled)
lying = 90*buckle_lying
else if(!lying)
if(resting)
- fall()
+ lying = pick(90, 270) // Cit change - makes resting not force you to drop your held items
+ if(has_gravity()) // Cit change - Ditto
+ playsound(src, "bodyfall", 50, 1) // Cit change - Ditto!
else if(ko || move_and_fall || (!has_legs && !ignore_legs) || chokehold)
fall(forced = 1)
- canmove = !(ko || resting || IsStun() || IsFrozen() || chokehold || buckled || (!has_legs && !ignore_legs && !has_arms))
+ canmove = !(ko || recoveringstam || pinned || IsStun() || IsFrozen() || chokehold || buckled || (!has_legs && !ignore_legs && !has_arms)) //Cit change - makes it plausible to move while resting, adds pinning and stamina crit
density = !lying
if(lying)
if(layer == initial(layer)) //to avoid special cases like hiding larvas.
@@ -984,6 +1071,8 @@
if(client)
client.move_delay = world.time + movement_delay()
lying_prev = lying
+ if(canmove && !intentionalresting && iscarbon(src) && client && client.prefs && client.prefs.autostand)//CIT CHANGE - adds autostanding as a preference
+ resist_a_rest(TRUE)//CIT CHANGE - ditto
return canmove
/mob/living/proc/AddAbility(obj/effect/proc_holder/A)
@@ -1074,3 +1163,54 @@
return FALSE
mob_pickup(user)
return TRUE
+
+/mob/living/proc/get_static_viruses() //used when creating blood and other infective objects
+ if(!LAZYLEN(diseases))
+ return
+ var/list/datum/disease/result = list()
+ for(var/datum/disease/D in diseases)
+ var/static_virus = D.Copy()
+ result += static_virus
+ return result
+
+/mob/living/reset_perspective(atom/A)
+ if(..())
+ update_sight()
+ if(client.eye && client.eye != src)
+ var/atom/AT = client.eye
+ AT.get_remote_view_fullscreens(src)
+ else
+ clear_fullscreen("remote_view", 0)
+ update_pipe_vision()
+
+/mob/living/vv_edit_var(var_name, var_value)
+ switch(var_name)
+ if("stat")
+ if((stat == DEAD) && (var_value < DEAD))//Bringing the dead back to life
+ GLOB.dead_mob_list -= src
+ GLOB.alive_mob_list += src
+ if((stat < DEAD) && (var_value == DEAD))//Kill he
+ GLOB.alive_mob_list -= src
+ GLOB.dead_mob_list += src
+ . = ..()
+ switch(var_name)
+ if("knockdown")
+ SetKnockdown(var_value)
+ if("stun")
+ SetStun(var_value)
+ if("unconscious")
+ SetUnconscious(var_value)
+ if("sleeping")
+ SetSleeping(var_value)
+ if("eye_blind")
+ set_blindness(var_value)
+ if("eye_damage")
+ set_eye_damage(var_value)
+ if("eye_blurry")
+ set_blurriness(var_value)
+ if("maxHealth")
+ updatehealth()
+ if("resize")
+ update_transform()
+ if("lighting_alpha")
+ sync_lighting_plane_alpha()
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 8ba5449b8e..f31d95a9d7 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -34,6 +34,8 @@
var/list/status_traits = list()
+ var/list/roundstart_traits = list()
+
var/list/surgeries = list() //a list of surgery datums. generally empty, they're added when the player wants them.
var/now_pushing = null //used by living/Collide() and living/PushAM() to prevent potential infinite loop.
@@ -105,3 +107,7 @@
var/radiation = 0 //If the mob is irradiated.
var/ventcrawl_layer = PIPING_LAYER_DEFAULT
var/losebreath = 0
+
+ //List of active diseases
+ var/list/diseases = list() // list of all diseases in a mob
+ var/list/disease_resistances = list()
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 737069a44d..11c57c9bbc 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -59,6 +59,29 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
"÷" = "cords"
))
+/mob/living/proc/Ellipsis(original_msg, chance = 50, keep_words)
+ if(chance <= 0)
+ return "..."
+ if(chance >= 100)
+ return original_msg
+
+ var/list
+ words = splittext(original_msg," ")
+ new_words = list()
+
+ var/new_msg = ""
+
+ for(var/w in words)
+ if(prob(chance))
+ new_words += "..."
+ if(!keep_words)
+ continue
+ new_words += w
+
+ new_msg = jointext(new_words," ")
+
+ return new_msg
+
/mob/living/say(message, bubble_type,var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE)
var/static/list/crit_allowed_modes = list(MODE_WHISPER = TRUE, MODE_CHANGELING = TRUE, MODE_ALIEN = TRUE)
var/static/list/unconscious_allowed_modes = list(MODE_CHANGELING = TRUE, MODE_ALIEN = TRUE)
@@ -381,4 +404,4 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
if(.)
return .
- . = ..()
\ No newline at end of file
+ . = ..()
diff --git a/code/modules/mob/living/silicon/ai/freelook/chunk.dm b/code/modules/mob/living/silicon/ai/freelook/chunk.dm
index bf3139cc4f..829e467ebc 100644
--- a/code/modules/mob/living/silicon/ai/freelook/chunk.dm
+++ b/code/modules/mob/living/silicon/ai/freelook/chunk.dm
@@ -106,10 +106,10 @@
var/turf/t = turf
if(obscuredTurfs[t])
if(!t.obscured)
- t.obscured = image('icons/effects/cameravis.dmi', t, null, LIGHTING_LAYER+1)
+ t.obscured = image('icons/effects/cameravis.dmi', t, null, BYOND_LIGHTING_LAYER+0.1)
t.obscured.pixel_x = -t.pixel_x
t.obscured.pixel_y = -t.pixel_y
- t.obscured.plane = LIGHTING_PLANE+1
+ t.obscured.plane = BYOND_LIGHTING_PLANE+0.1
obscured += t.obscured
for(var/eye in seenby)
var/mob/camera/aiEye/m = eye
@@ -170,4 +170,4 @@
obscured += t.obscured
#undef UPDATE_BUFFER
-#undef CHUNK_SIZE
\ No newline at end of file
+#undef CHUNK_SIZE
diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm
index 97034d389c..ae95a317a3 100644
--- a/code/modules/mob/living/silicon/ai/life.dm
+++ b/code/modules/mob/living/silicon/ai/life.dm
@@ -50,7 +50,7 @@
var/turf/T = get_turf(src)
var/area/A = get_area(src)
switch(requires_power)
- if(POWER_REQ_NONE)
+ if(NONE)
return FALSE
if(POWER_REQ_ALL)
return !T || !A || ((!A.power_equip || isspaceturf(T)) && !is_type_in_list(loc, list(/obj/item, /obj/mecha)))
diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm
index b55fa2a663..75f0fb5e81 100644
--- a/code/modules/mob/living/silicon/ai/say.dm
+++ b/code/modules/mob/living/silicon/ai/say.dm
@@ -154,6 +154,7 @@
return 1
return 0
+#undef VOX_DELAY
#endif
/mob/living/silicon/ai/could_speak_in_language(datum/language/dt)
diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm
index cc17d8e4bd..2a2cda19e0 100644
--- a/code/modules/mob/living/silicon/pai/software.dm
+++ b/code/modules/mob/living/silicon/pai/software.dm
@@ -511,7 +511,7 @@
Structural Integrity: [M.getBruteLoss() > 50 ? "" : ""][M.getBruteLoss()]
Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)
"}
- for(var/thing in M.viruses)
+ for(var/thing in M.diseases)
var/datum/disease/D = thing
dat += {"Infection Detected.
Name: [D.name]
diff --git a/code/modules/mob/living/silicon/robot/laws.dm b/code/modules/mob/living/silicon/robot/laws.dm
index 7f6206dafb..aa1f5aff65 100644
--- a/code/modules/mob/living/silicon/robot/laws.dm
+++ b/code/modules/mob/living/silicon/robot/laws.dm
@@ -66,4 +66,4 @@
temp = master.supplied[index]
if (length(temp) > 0)
laws.supplied[index] = temp
- return
+ return
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm
index 3ff18c8747..0ca3c63162 100644
--- a/code/modules/mob/living/silicon/robot/life.dm
+++ b/code/modules/mob/living/silicon/robot/life.dm
@@ -93,7 +93,7 @@
cut_overlay(fire_overlay)
/mob/living/silicon/robot/update_canmove()
- if(stat || buckled || lockcharge)
+ if(stat || buckled || lockcharge || resting) //CITADEL EDIT resting dogborg-os
canmove = 0
else
canmove = 1
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 553faeacd7..2a3af029dd 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -365,8 +365,12 @@
to_chat(user, "You start fixing yourself... ")
if(!W.use_tool(src, user, 50))
return
-
- adjustBruteLoss(-30)
+ adjustBruteLoss(-10)
+ else
+ to_chat(user, "You start fixing [src]... ")
+ if(!do_after(user, 30, target = src))
+ return
+ adjustBruteLoss(-30)
updatehealth()
add_fingerprint(user)
visible_message("[user] has fixed some of the dents on [src]. ")
@@ -376,11 +380,16 @@
user.changeNext_move(CLICK_CD_MELEE)
var/obj/item/stack/cable_coil/coil = W
if (getFireLoss() > 0 || getToxLoss() > 0)
- if(src == user)
+ if(src == user && coil.use(1))
to_chat(user, "You start fixing yourself... ")
if(!do_after(user, 50, target = src))
return
+ adjustFireLoss(-10)
+ adjustToxLoss(-10)
if (coil.use(1))
+ to_chat(user, "You start fixing [src]... ")
+ if(!do_after(user, 30, target = src))
+ return
adjustFireLoss(-30)
adjustToxLoss(-30)
updatehealth()
@@ -592,9 +601,8 @@
//Citadel changes start here - Allows modules to use different icon files, and allows modules to specify a pixel offset
icon = (module.cyborg_icon_override ? module.cyborg_icon_override : initial(icon))
-
if(laser)
- add_overlay("module.laser")//Is this even used??? - Yes modular_citadel/borg/inventory.dm
+ add_overlay("laser")//Is this even used??? - Yes borg/inventory.dm
if(disabler)
add_overlay("disabler")//ditto
@@ -602,6 +610,13 @@
add_overlay("[module.sleeper_overlay]_g")
if(sleeper_r && module.sleeper_overlay)
add_overlay("[module.sleeper_overlay]_r")
+ if(module.dogborg == TRUE)
+ if(resting)
+ cut_overlays()
+ icon_state = "[module.cyborg_base_icon]-rest"
+ else
+ icon_state = "[module.cyborg_base_icon]"
+
if(stat == DEAD && module.has_snowflake_deadsprite)
icon_state = "[module.cyborg_base_icon]-wreck"
@@ -612,7 +627,6 @@
if(module.cyborg_base_icon == "robot")
icon = 'icons/mob/robots.dmi'
pixel_x = initial(pixel_x)
-
if(stat != DEAD && !(IsUnconscious() || IsStun() || IsKnockdown() || low_power_mode)) //Not dead, not stunned.
if(!eye_lights)
eye_lights = new()
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 4b23e6f47f..d3d324b5fa 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -198,27 +198,31 @@
/obj/item/robot_module/proc/do_transform_animation()
var/mob/living/silicon/robot/R = loc
- R.notransform = TRUE
- var/obj/effect/temp_visual/decoy/fading/fivesecond/ANM = new /obj/effect/temp_visual/decoy/fading/fivesecond(R.loc, R)
- ANM.layer = R.layer - 0.01
- new /obj/effect/temp_visual/small_smoke(R.loc)
if(R.hat)
R.hat.forceMove(get_turf(R))
R.hat = null
- R.update_headlamp()
- R.alpha = 0
- animate(R, alpha = 255, time = 50)
+ R.cut_overlays()
+ R.setDir(SOUTH)
+ do_transform_delay()
+
+/obj/item/robot_module/proc/do_transform_delay()
+ var/mob/living/silicon/robot/R = loc
var/prev_lockcharge = R.lockcharge
+ sleep(1)
+ flick("[cyborg_base_icon]_transform", R)
+ R.notransform = TRUE
R.SetLockdown(1)
R.anchored = TRUE
- sleep(2)
+ sleep(1)
for(var/i in 1 to 4)
playsound(R, pick('sound/items/drill_use.ogg', 'sound/items/jaws_cut.ogg', 'sound/items/jaws_pry.ogg', 'sound/items/welder.ogg', 'sound/items/ratchet.ogg'), 80, 1, -1)
- sleep(12)
+ sleep(7)
if(!prev_lockcharge)
R.SetLockdown(0)
+ R.setDir(SOUTH)
R.anchored = FALSE
R.notransform = FALSE
+ R.update_headlamp()
R.notify_ai(NEW_MODULE)
if(R.hud_used)
R.hud_used.update_robot_modules_display()
diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
index d265d19cb2..9b4386c727 100644
--- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
@@ -274,7 +274,7 @@ Auto Patrol[]"},
if(BOT_PREP_ARREST) // preparing to arrest target
// see if he got away. If he's no no longer adjacent or inside a closet or about to get up, we hunt again.
- if(!Adjacent(target) || !isturf(target.loc) || target.AmountKnockdown() < 40)
+ if(!Adjacent(target) || !isturf(target.loc) || !target.recoveringstam || target.staminaloss <= 120) // CIT CHANGE - replaces amountknockdown with recoveringstam and staminaloss checks
back_to_hunt()
return
@@ -301,7 +301,7 @@ Auto Patrol[]"},
back_to_idle()
return
- if(!Adjacent(target) || !isturf(target.loc) || (target.loc != target_lastloc && target.AmountKnockdown() < 40)) //if he's changed loc and about to get up or not adjacent or got into a closet, we prep arrest again.
+ if(!Adjacent(target) || !isturf(target.loc) || (target.loc != target_lastloc && !target.recoveringstam && target.staminaloss <= 120)) //if he's changed loc and about to get up or not adjacent or got into a closet, we prep arrest again. CIT CHANGE - replaces amountknockdown with recoveringstam and staminaloss checks
back_to_hunt()
return
else
@@ -523,7 +523,7 @@ Auto Patrol[]"},
return
if(iscarbon(A))
var/mob/living/carbon/C = A
- if(!C.IsStun() || arrest_type)
+ if(C.canmove || arrest_type) // CIT CHANGE - makes sentient ed209s check for canmove rather than !isstun.
stun_attack(A)
else if(C.canBeHandcuffed() && !C.handcuffed)
cuff(A)
diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm
index 6946c8992f..4cf1f6b13f 100644
--- a/code/modules/mob/living/simple_animal/bot/medbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/medbot.dm
@@ -383,12 +383,12 @@
return TRUE
if(treat_virus && !C.reagents.has_reagent(treatment_virus_avoid) && !C.reagents.has_reagent(treatment_virus))
- for(var/thing in C.viruses)
+ for(var/thing in C.diseases)
var/datum/disease/D = thing
//the medibot can't detect viruses that are undetectable to Health Analyzers or Pandemic machines.
if(!(D.visibility_flags & HIDDEN_SCANNER || D.visibility_flags & HIDDEN_PANDEMIC) \
- && D.severity != VIRUS_SEVERITY_POSITIVE \
- && (D.stage > 1 || (D.spread_flags & VIRUS_SPREAD_AIRBORNE))) // medibot can't detect a virus in its initial stage unless it spreads airborne.
+ && D.severity != DISEASE_SEVERITY_POSITIVE \
+ && (D.stage > 1 || (D.spread_flags & DISEASE_SPREAD_AIRBORNE))) // medibot can't detect a virus in its initial stage unless it spreads airborne.
return TRUE //STOP DISEASE FOREVER
return FALSE
@@ -435,12 +435,12 @@
else
if(treat_virus)
var/virus = 0
- for(var/thing in C.viruses)
+ for(var/thing in C.diseases)
var/datum/disease/D = thing
//detectable virus
if((!(D.visibility_flags & HIDDEN_SCANNER)) || (!(D.visibility_flags & HIDDEN_PANDEMIC)))
- if(D.severity != VIRUS_SEVERITY_POSITIVE) //virus is harmful
- if((D.stage > 1) || (D.spread_flags & VIRUS_SPREAD_AIRBORNE))
+ if(D.severity != DISEASE_SEVERITY_POSITIVE) //virus is harmful
+ if((D.stage > 1) || (D.spread_flags & DISEASE_SPREAD_AIRBORNE))
virus = 1
if(!reagent_id && (virus))
diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm
index 68b82abb0e..1754a20b94 100644
--- a/code/modules/mob/living/simple_animal/bot/secbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/secbot.dm
@@ -203,7 +203,7 @@ Auto Patrol: []"},
return
if(iscarbon(A))
var/mob/living/carbon/C = A
- if(!C.IsStun() || arrest_type)
+ if(C.canmove || arrest_type) // CIT CHANGE - makes sentient secbots check for canmove rather than !isstun.
stun_attack(A)
else if(C.canBeHandcuffed() && !C.handcuffed)
cuff(A)
@@ -305,7 +305,7 @@ Auto Patrol: []"},
if(BOT_PREP_ARREST) // preparing to arrest target
// see if he got away. If he's no no longer adjacent or inside a closet or about to get up, we hunt again.
- if( !Adjacent(target) || !isturf(target.loc) || target.AmountKnockdown() < 40)
+ if( !Adjacent(target) || !isturf(target.loc) || target.staminaloss <= 120 || !target.recoveringstam) //CIT CHANGE - replaces amountknockdown with checks for stamina so secbots dont run into an infinite loop
back_to_hunt()
return
@@ -332,7 +332,7 @@ Auto Patrol: []"},
back_to_idle()
return
- if(!Adjacent(target) || !isturf(target.loc) || (target.loc != target_lastloc && target.AmountKnockdown() < 40)) //if he's changed loc and about to get up or not adjacent or got into a closet, we prep arrest again.
+ if(!Adjacent(target) || !isturf(target.loc) || (target.loc != target_lastloc && !target.recoveringstam && target.staminaloss <= 120)) //if he's changed loc and about to get up or not adjacent or got into a closet, we prep arrest again. CIT CHANGE - replaces amountknockdown with recoveringstam and staminaloss check
back_to_hunt()
return
else //Try arresting again if the target escapes.
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index 1c12b48919..f50b7c0ccf 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -313,8 +313,8 @@
desc = "A long, thin construct built to herald Nar-Sie's rise. It'll be all over soon."
icon_state = "chosen"
icon_living = "chosen"
- maxHealth = 60
- health = 60
+ maxHealth = 40
+ health = 40
sight = SEE_MOBS
melee_damage_lower = 15
melee_damage_upper = 20
@@ -340,12 +340,9 @@
/mob/living/simple_animal/hostile/construct/harvester/AttackingTarget()
if(iscarbon(target))
- if(ishuman(target))
- var/mob/living/carbon/human/H = target
- if(H.dna && H.dna.species)
- if(NODISMEMBER in H.dna.species.species_traits)
- return ..() //ATTACK!
var/mob/living/carbon/C = target
+ if(C.has_trait(TRAIT_NODISMEMBER))
+ return ..() //ATTACK!
var/list/parts = list()
var/undismembermerable_limbs = 0
for(var/X in C.bodyparts)
@@ -439,7 +436,8 @@
else
if(LAZYLEN(GLOB.cult_narsie.souls_needed))
the_construct.master = pick(GLOB.cult_narsie.souls_needed)
- to_chat(the_construct, "You are now tracking your prey, [the_construct.master] - harvest them! ")
+ var/mob/living/real_target = the_construct.master //We can typecast this way because Narsie only allows /mob/living into the souls list
+ to_chat(the_construct, "You are now tracking your prey, [real_target.real_name] - harvest them! ")
else
to_chat(the_construct, "Nar'Sie has completed her harvest! ")
return
diff --git a/code/modules/mob/living/simple_animal/friendly/cockroach.dm b/code/modules/mob/living/simple_animal/friendly/cockroach.dm
index a6e24f43dd..5a9ae07374 100644
--- a/code/modules/mob/living/simple_animal/friendly/cockroach.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cockroach.dm
@@ -58,3 +58,4 @@
icon = 'icons/effects/blood.dmi'
icon_state = "xfloor1"
random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7")
+ beauty = -300
diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm
index 282a02494a..ae1681cbef 100644
--- a/code/modules/mob/living/simple_animal/friendly/dog.dm
+++ b/code/modules/mob/living/simple_animal/friendly/dog.dm
@@ -231,6 +231,9 @@
return
if(!item_to_add)
user.visible_message("[user] pets [src].","You rest your hand on [src]'s head for a moment. ")
+ GET_COMPONENT_FROM(mood, /datum/component/mood, user)
+ if(mood)
+ mood.add_event("pet_corgi", /datum/mood_event/pet_corgi)
return
if(user && !user.temporarilyRemoveItemFromInventory(item_to_add))
@@ -613,6 +616,9 @@
if(M && stat != DEAD) // Added check to see if this mob (the dog) is dead to fix issue 2454
new /obj/effect/temp_visual/heart(loc)
emote("me", 1, "yaps happily!")
+ GET_COMPONENT_FROM(mood, /datum/component/mood, M)
+ if(mood)
+ mood.add_event("pet_corgi", /datum/mood_event/pet_corgi)
else
if(M && stat != DEAD) // Same check here, even though emote checks it as well (poor form to check it only in the help case)
emote("me", 1, "growls!")
diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm
index a3bc98f48a..646987b155 100644
--- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm
+++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm
@@ -22,7 +22,7 @@
ventcrawler = VENTCRAWLER_ALWAYS
var/datum/mind/origin
var/egg_lain = 0
- //gold_core_spawnable = HOSTILE_SPAWN //are you sure about this??
+ gold_core_spawnable = NO_SPAWN //are you sure about this?? // CITADEL CHANGE, Yes.
/mob/living/simple_animal/hostile/headcrab/proc/Infect(mob/living/carbon/victim)
var/obj/item/organ/body_egg/changeling_egg/egg = new(victim)
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index 8207f321cd..edb6e47ca8 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -106,7 +106,7 @@
if(!search_objects)
. = hearers(vision_range, targets_from) - src //Remove self, so we don't suicide
- var/static/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/mecha, /obj/structure/destructible/clockwork/ocular_warden))
+ var/static/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/mecha, /obj/structure/destructible/clockwork/ocular_warden,/obj/item/device/electronic_assembly))
for(var/HM in typecache_filter_list(range(vision_range, targets_from), hostile_machines))
if(can_see(targets_from, HM, vision_range))
@@ -209,6 +209,11 @@
return FALSE
return TRUE
+ if(istype(the_target, /obj/item/device/electronic_assembly))
+ var/obj/item/device/electronic_assembly/O = the_target
+ if(O.combat_circuits)
+ return TRUE
+
if(istype(the_target, /obj/structure/destructible/clockwork/ocular_warden))
var/obj/structure/destructible/clockwork/ocular_warden/OW = the_target
if(OW.target != src)
diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm
index de8545d3f0..eb2b1be1d4 100644
--- a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm
+++ b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm
@@ -66,6 +66,7 @@
desc = "A small pool of sludge, containing trace amounts of leaper venom."
icon = 'icons/effects/tomatodecal.dmi'
icon_state = "tomato_floor1"
+ beauty = -200
/obj/structure/leaper_bubble
name = "leaper bubble"
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm
index 898a2ad734..1af22a8960 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm
@@ -1,26 +1,27 @@
/mob/living/simple_animal/hostile/megafauna/dragon
vore_active = TRUE
+ no_vore = FALSE
/mob/living/simple_animal/hostile/megafauna/dragon/Initialize()
// Create and register 'stomachs'
- var/datum/belly/megafauna/dragon/maw/maw = new(src)
- var/datum/belly/megafauna/dragon/gullet/gullet = new(src)
- var/datum/belly/megafauna/dragon/gut/gut = new(src)
- for(var/datum/belly/X in list(maw, gullet, gut))
- vore_organs[X.name] = X
+ var/obj/belly/megafauna/dragon/maw/maw = new(src)
+ var/obj/belly/megafauna/dragon/gullet/gullet = new(src)
+ var/obj/belly/megafauna/dragon/gut/gut = new(src)
+// for(var/obj/belly/X in list(maw, gullet, gut))
+// vore_organs[X.name] = X
// Connect 'stomachs' together
maw.transferlocation = gullet
gullet.transferlocation = gut
- vore_selected = maw.name // NPC eats into maw
+ vore_selected = maw // NPC eats into maw
return ..()
-/datum/belly/megafauna/dragon
+/obj/belly/megafauna/dragon
human_prey_swallow_time = 50 // maybe enough to switch targets if distracted
nonhuman_prey_swallow_time = 50
-/datum/belly/megafauna/dragon/maw
+/obj/belly/megafauna/dragon/maw
name = "maw"
- inside_flavor = "The maw of the dreaded Ash drake closes around you, engulfing you into a swelteringly hot, disgusting enviroment. The acidic saliva tingles over your form while that tongue pushes you further back...towards the dark gullet beyond."
+ desc = "The maw of the dreaded Ash drake closes around you, engulfing you into a swelteringly hot, disgusting enviroment. The acidic saliva tingles over your form while that tongue pushes you further back...towards the dark gullet beyond."
vore_verb = "scoop"
vore_sound = 'sound/vore/pred/taurswallow.ogg'
swallow_time = 20
@@ -30,9 +31,9 @@
autotransferchance = 66
autotransferwait = 200
-/datum/belly/megafauna/dragon/gullet
+/obj/belly/megafauna/dragon/gullet
name = "gullet"
- inside_flavor = "A ripple of muscle and arching of the tongue pushes you down like any other food. No choice in the matter, you're simply consumed. The dark ambiance of the outside world is replaced with working, wet flesh. Your only light being what you brought with you."
+ desc = "A ripple of muscle and arching of the tongue pushes you down like any other food. No choice in the matter, you're simply consumed. The dark ambiance of the outside world is replaced with working, wet flesh. Your only light being what you brought with you."
swallow_time = 60 // costs extra time to eat directly to here
escapechance = 5
// From above, will transfer into gut
@@ -40,10 +41,10 @@
autotransferchance = 50
autotransferwait = 200
-/datum/belly/megafauna/dragon/gut
+/obj/belly/megafauna/dragon/gut
name = "stomach"
vore_capacity = 5 //I doubt this many people will actually last in the gut, but...
- inside_flavor = "With a rush of burning ichor greeting you, you're introduced to the Drake's stomach. Wrinkled walls greedily grind against you, acidic slimes working into your body as you become fuel and nutriton for a superior predator. All that's left is your body's willingness to resist your destiny."
+ desc = "With a rush of burning ichor greeting you, you're introduced to the Drake's stomach. Wrinkled walls greedily grind against you, acidic slimes working into your body as you become fuel and nutriton for a superior predator. All that's left is your body's willingness to resist your destiny."
digest_mode = DM_DRAGON
digest_burn = 5
swallow_time = 100 // costs extra time to eat directly to here
diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm
index 670d571d4d..7259a730e5 100644
--- a/code/modules/mob/living/simple_animal/hostile/mimic.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm
@@ -101,15 +101,19 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca
var/destroy_objects = 0
var/knockdown_people = 0
var/static/mutable_appearance/googly_eyes = mutable_appearance('icons/mob/mob.dmi', "googly_eyes")
+ var/overlay_googly_eyes = TRUE
+ var/idledamage = TRUE
gold_core_spawnable = NO_SPAWN
-/mob/living/simple_animal/hostile/mimic/copy/Initialize(mapload, obj/copy, mob/living/creator, destroy_original = 0)
+/mob/living/simple_animal/hostile/mimic/copy/Initialize(mapload, obj/copy, mob/living/creator, destroy_original = 0, no_googlies = FALSE)
. = ..()
+ if (no_googlies)
+ overlay_googly_eyes = FALSE
CopyObject(copy, creator, destroy_original)
/mob/living/simple_animal/hostile/mimic/copy/Life()
..()
- if(!target && !ckey) //Objects eventually revert to normal if no one is around to terrorize
+ if(idledamage && !target && !ckey) //Objects eventually revert to normal if no one is around to terrorize
adjustBruteLoss(1)
for(var/mob/living/M in contents) //a fix for animated statues from the flesh to stone spell
death()
@@ -143,7 +147,8 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca
icon_state = O.icon_state
icon_living = icon_state
copy_overlays(O)
- add_overlay(googly_eyes)
+ if (overlay_googly_eyes)
+ add_overlay(googly_eyes)
if(isstructure(O) || ismachinery(O))
health = (anchored * 50) + 50
destroy_objects = 1
diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm
index ab2126e7b9..edca0c5535 100644
--- a/code/modules/mob/living/simple_animal/shade.dm
+++ b/code/modules/mob/living/simple_animal/shade.dm
@@ -6,8 +6,8 @@
icon = 'icons/mob/mob.dmi'
icon_state = "shade"
icon_living = "shade"
- maxHealth = 50
- health = 50
+ maxHealth = 40
+ health = 40
spacewalk = TRUE
healable = 0
speak_emote = list("hisses")
@@ -17,12 +17,11 @@
response_harm = "punches"
speak_chance = 1
melee_damage_lower = 5
- melee_damage_upper = 15
+ melee_damage_upper = 12
attacktext = "metaphysically strikes"
minbodytemp = 0
maxbodytemp = INFINITY
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
- speed = -1
stop_automated_movement = 1
status_flags = 0
faction = list("cult")
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 09eb099ae7..61e7153434 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -103,7 +103,8 @@
stack_trace("Simple animal being instantiated in nullspace")
if(vore_active)
init_belly()
- verbs |= /mob/living/proc/animal_nom
+ if(!IsAdvancedToolUser())
+ verbs |= /mob/living/simple_animal/proc/animal_nom
/mob/living/simple_animal/Destroy()
GLOB.simple_animals[AIStatus] -= src
diff --git a/code/modules/mob/living/simple_animal/simple_animal_vr.dm b/code/modules/mob/living/simple_animal/simple_animal_vr.dm
index 2eca841c17..72459cc74d 100644
--- a/code/modules/mob/living/simple_animal/simple_animal_vr.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal_vr.dm
@@ -7,18 +7,18 @@
var/vore_default_mode = DM_DIGEST // Default bellymode (DM_DIGEST, DM_HOLD, DM_ABSORB)
var/vore_digest_chance = 25 // Chance to switch to digest mode if resisted
var/vore_escape_chance = 25 // Chance of resisting out of mob
+ var/vore_absorb_chance = 0 // chance of absorbtion by mob
var/vore_stomach_name // The name for the first belly if not "stomach"
var/vore_stomach_flavor // The flavortext for the first belly if not the default
var/vore_fullness = 0 // How "full" the belly is (controls icons)
+ var/list/living_mobs = list()
// Release belly contents beforey being gc'd!
/mob/living/simple_animal/Destroy()
- for(var/I in vore_organs)
- var/datum/belly/B = vore_organs[I]
- B.release_all_contents() // When your stomach is empty
+ release_vore_contents()
prey_excludes.Cut()
. = ..()
@@ -34,10 +34,10 @@
vore_fullness = new_fullness
-
+/*
/mob/living/simple_animal/proc/swallow_check()
for(var/I in vore_organs)
- var/datum/belly/B = vore_organs[I]
+ var/obj/belly/B = vore_organs[I]
if(vore_active)
update_fullness()
if(!vore_fullness)
@@ -48,16 +48,14 @@
/mob/living/simple_animal/proc/swallow_mob()
for(var/I in vore_organs)
- var/datum/belly/B = vore_organs[I]
- for(var/mob/living/M in B.internal_contents)
- B.transfer_contents(M, B.transferlocation)
-
+ var/obj/belly/B = vore_organs[I]
+ for(var/mob/living/M in B.contents)
+ B.transfer_contents(M, transferlocation)
+*/
/mob/living/simple_animal/death()
- for(var/I in vore_organs)
- var/datum/belly/B = vore_organs[I]
- B.release_all_contents() // When your stomach is empty
- ..() // then you have my permission to die.
+ release_vore_contents()
+ . = ..()
// Simple animals have only one belly. This creates it (if it isn't already set up)
/mob/living/simple_animal/proc/init_belly()
@@ -66,18 +64,19 @@
if(no_vore) //If it can't vore, let's not give it a stomach.
return
- var/datum/belly/B = new /datum/belly(src)
- B.immutable = TRUE
+ var/obj/belly/B = new /obj/belly(src)
+ vore_selected = B
+ B.immutable = 1
B.name = vore_stomach_name ? vore_stomach_name : "stomach"
- B.inside_flavor = vore_stomach_flavor ? vore_stomach_flavor : "Your surroundings are warm, soft, and slimy. Makes sense, considering you're inside \the [name]."
+ B.desc = vore_stomach_flavor ? vore_stomach_flavor : "Your surroundings are warm, soft, and slimy. Makes sense, considering you're inside \the [name]."
B.digest_mode = vore_default_mode
B.escapable = vore_escape_chance > 0
B.escapechance = vore_escape_chance
B.digestchance = vore_digest_chance
+ B.absorbchance = vore_absorb_chance
B.human_prey_swallow_time = swallowTime
B.nonhuman_prey_swallow_time = swallowTime
B.vore_verb = "swallow"
- // TODO - Customizable per mob
B.emote_lists[DM_HOLD] = list( // We need more that aren't repetitive. I suck at endo. -Ace
"The insides knead at you gently for a moment.",
"The guts glorp wetly around you as some air shifts.",
@@ -98,5 +97,21 @@
"The juices pooling beneath you sizzle against your sore skin.",
"The churning walls slowly pulverize you into meaty nutrients.",
"The stomach glorps and gurgles as it tries to work you into slop.")
- src.vore_organs[B.name] = B
- src.vore_selected = B.name
+/* B.emote_lists[DM_ITEMWEAK] = list(
+ "The burning acids eat away at your form.",
+ "The muscular stomach flesh grinds harshly against you.",
+ "The caustic air stings your chest when you try to breathe.",
+ "The slimy guts squeeze inward to help the digestive juices soften you up.",
+ "The onslaught against your body doesn't seem to be letting up; you're food now.",
+ "The predator's body ripples and crushes against you as digestive enzymes pull you apart.",
+ "The juices pooling beneath you sizzle against your sore skin.",
+ "The churning walls slowly pulverize you into meaty nutrients.",
+ "The stomach glorps and gurgles as it tries to work you into slop.")*/
+
+//Grab = Nomf
+/*
+/mob/living/simple_animal/UnarmedAttack(var/atom/A, var/proximity)
+ . = ..()
+
+ if(a_intent == I_GRAB && isliving(A) && !has_hands)
+ animal_nom(A)*/
\ No newline at end of file
diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm
index 50d86a2cf6..106381bade 100644
--- a/code/modules/mob/living/status_procs.dm
+++ b/code/modules/mob/living/status_procs.dm
@@ -146,10 +146,23 @@
else
status_traits[trait] |= list(source)
-/mob/living/proc/remove_trait(trait, list/sources)
+/mob/living/proc/add_trait_datum(trait, spawn_effects) //separate proc due to the way these ones are handled
+ if(has_trait(trait))
+ return
+ if(!SStraits || !SStraits.traits[trait])
+ return
+ var/datum/trait/T = SStraits.traits[trait]
+ new T (src, spawn_effects)
+ return TRUE
+
+/mob/living/proc/remove_trait(trait, list/sources, force)
+
if(!status_traits[trait])
return
+ if(locate(ROUNDSTART_TRAIT) in status_traits[trait] && !force) //mob traits applied through roundstart cannot normally be removed
+ return
+
if(!sources) // No defined source cures the trait entirely.
status_traits -= trait
return
@@ -167,19 +180,29 @@
if(!LAZYLEN(status_traits[trait]))
status_traits -= trait
+/mob/living/proc/remove_trait_datum(trait)
+ var/datum/trait/T = roundstart_traits[trait]
+ if(T)
+ qdel(T)
+ return TRUE
+
/mob/living/proc/has_trait(trait, list/sources)
if(!status_traits[trait])
return FALSE
. = FALSE
+ if(sources && !islist(sources))
+ sources = list(sources)
if(LAZYLEN(sources))
for(var/S in sources)
if(S in status_traits[trait])
return TRUE
- else
- if(LAZYLEN(status_traits[trait]))
- return TRUE
+ else if(LAZYLEN(status_traits[trait]))
+ return TRUE
+
+/mob/living/proc/has_trait_datum(trait)
+ return roundstart_traits[trait]
/mob/living/proc/remove_all_traits()
status_traits = list()
diff --git a/code/modules/mob/living/taste.dm b/code/modules/mob/living/taste.dm
index c66168cee4..b2a4a867bc 100644
--- a/code/modules/mob/living/taste.dm
+++ b/code/modules/mob/living/taste.dm
@@ -9,7 +9,7 @@
/mob/living/carbon/get_taste_sensitivity()
var/obj/item/organ/tongue/tongue = getorganslot(ORGAN_SLOT_TONGUE)
- if(istype(tongue))
+ if(istype(tongue) && !has_trait(TRAIT_AGEUSIA))
. = tongue.taste_sensitivity
else
. = 101 // can't taste anything without a tongue
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 26c6e88775..f5e5d32428 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -11,7 +11,6 @@
var/mob/dead/observe = M
observe.reset_perspective(null)
qdel(hud_used)
- QDEL_LIST(viruses)
for(var/cc in client_colours)
qdel(cc)
client_colours = null
@@ -287,16 +286,6 @@
client.eye = loc
return 1
-/mob/living/reset_perspective(atom/A)
- if(..())
- update_sight()
- if(client.eye && client.eye != src)
- var/atom/AT = client.eye
- AT.get_remote_view_fullscreens(src)
- else
- clear_fullscreen("remote_view", 0)
- update_pipe_vision()
-
/mob/proc/show_inv(mob/user)
return
@@ -333,60 +322,6 @@
return 1
-//this and stop_pulling really ought to be /mob/living procs
-/mob/start_pulling(atom/movable/AM, supress_message = 0)
- if(!AM || !src)
- return FALSE
- if(!(AM.can_be_pulled(src)))
- return FALSE
- if(throwing || incapacitated())
- return FALSE
-
- AM.add_fingerprint(src)
-
- // If we're pulling something then drop what we're currently pulling and pull this instead.
- if(pulling)
- // Are we trying to pull something we are already pulling? Then just stop here, no need to continue.
- if(AM == pulling)
- return
- stop_pulling()
-
- changeNext_move(CLICK_CD_GRABBING)
-
- if(AM.pulledby)
- if(!supress_message)
- visible_message("[src] has pulled [AM] from [AM.pulledby]'s grip. ")
- add_logs(AM, AM.pulledby, "pulled from", src)
- AM.pulledby.stop_pulling() //an object can't be pulled by two mobs at once.
-
- pulling = AM
- AM.pulledby = src
- if(!supress_message)
- playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
- update_pull_hud_icon()
-
- if(ismob(AM))
- var/mob/M = AM
-
- //Share diseases that are spread by touch
- for(var/thing in viruses)
- var/datum/disease/D = thing
- if(D.spread_flags & VIRUS_SPREAD_CONTACT_SKIN)
- M.ContactContractDisease(D)
-
- for(var/thing in M.viruses)
- var/datum/disease/D = thing
- if(D.spread_flags & VIRUS_SPREAD_CONTACT_SKIN)
- ContactContractDisease(D)
-
- add_logs(src, M, "grabbed", addition="passive grab")
- if(!supress_message)
- visible_message("[src] has grabbed [M][(zone_selected == "l_arm" || zone_selected == "r_arm")? " by their hands":" passively"]! ")
- if(!iscarbon(src))
- M.LAssailant = null
- else
- M.LAssailant = usr
-
/mob/proc/can_resist()
return FALSE //overridden in living.dm
@@ -409,15 +344,6 @@
setDir(D)
spintime -= speed
-/mob/stop_pulling()
- ..()
- update_pull_hud_icon()
-
-/mob/verb/stop_pulling1()
- set name = "Stop Pulling"
- set category = "IC"
- stop_pulling()
-
/mob/proc/update_pull_hud_icon()
if(hud_used)
if(hud_used.pull_icon)
@@ -439,6 +365,10 @@
I.attack_self(src)
update_inv_hands()
+ if(!I)//CIT CHANGE - allows "using" empty hands
+ use_that_empty_hand() //CIT CHANGE - ditto
+ update_inv_hands() // CIT CHANGE - ditto.
+
/mob/verb/memory()
set name = "Notes"
set category = "IC"
@@ -617,6 +547,7 @@
stat("Location:", COORD(T))
stat("CPU:", "[world.cpu]")
stat("Instances:", "[num2text(world.contents.len, 10)]")
+ stat("World Time:", "[world.time]")
GLOB.stat_entry()
config.stat_entry()
stat(null)
@@ -707,7 +638,6 @@
client.move_delay += movement_delay()
return 1
-
/mob/verb/westface()
set hidden = 1
if(!canface())
@@ -716,7 +646,6 @@
client.move_delay += movement_delay()
return 1
-
/mob/verb/northface()
set hidden = 1
if(!canface())
@@ -725,7 +654,6 @@
client.move_delay += movement_delay()
return 1
-
/mob/verb/southface()
set hidden = 1
if(!canface())
@@ -929,39 +857,6 @@
if (L)
L.alpha = lighting_alpha
-/mob/living/vv_edit_var(var_name, var_value)
- switch(var_name)
- if("stat")
- if((stat == DEAD) && (var_value < DEAD))//Bringing the dead back to life
- GLOB.dead_mob_list -= src
- GLOB.alive_mob_list += src
- if((stat < DEAD) && (var_value == DEAD))//Kill he
- GLOB.alive_mob_list -= src
- GLOB.dead_mob_list += src
- . = ..()
- switch(var_name)
- if("knockdown")
- SetKnockdown(var_value)
- if("stun")
- SetStun(var_value)
- if("unconscious")
- SetUnconscious(var_value)
- if("sleeping")
- SetSleeping(var_value)
- if("eye_blind")
- set_blindness(var_value)
- if("eye_damage")
- set_eye_damage(var_value)
- if("eye_blurry")
- set_blurriness(var_value)
- if("maxHealth")
- updatehealth()
- if("resize")
- update_transform()
- if("lighting_alpha")
- sync_lighting_plane_alpha()
-
-
/mob/proc/is_literate()
return 0
@@ -971,15 +866,6 @@
/mob/proc/get_idcard()
return
-/mob/proc/get_static_viruses() //used when creating blood and other infective objects
- if(!LAZYLEN(viruses))
- return
- var/list/datum/disease/diseases = list()
- for(var/datum/disease/D in viruses)
- var/static_virus = D.Copy()
- diseases += static_virus
- return diseases
-
/mob/vv_get_dropdown()
. = ..()
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index d4bebd6303..0088e09515 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -82,10 +82,6 @@
var/list/mob_spell_list = list() //construct spells and mime spells. Spells that do not transfer from one mob to another and can not be lost in mindswap.
-//List of active diseases
-
- var/list/viruses = list() // list of all diseases in a mob
- var/list/resistances = list()
var/status_flags = CANSTUN|CANKNOCKDOWN|CANUNCONSCIOUS|CANPUSH //bitflags defining which status effects can be inflicted (replaces canknockdown, canstun, etc)
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 989c8278a5..3b9930faa9 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -363,8 +363,10 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
if(M.mind in SSticker.mode.apprentices)
return 2
if("monkey")
- if(M.viruses && (locate(/datum/disease/transformation/jungle_fever) in M.viruses))
- return 2
+ if(isliving(M))
+ var/mob/living/L = M
+ if(L.diseases && (locate(/datum/disease/transformation/jungle_fever) in L.diseases))
+ return 2
return TRUE
if(M.mind && LAZYLEN(M.mind.antag_datums)) //they have an antag datum!
return TRUE
diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm
index a4d234ded7..39a0bba701 100644
--- a/code/modules/mob/say_vr.dm
+++ b/code/modules/mob/say_vr.dm
@@ -98,7 +98,7 @@ proc/get_top_level_mob(var/mob/S)
return FALSE
user.log_message(message, INDIVIDUAL_EMOTE_LOG)
- message = "[user] " + message
+ message = "[user] " + "[message] "
for(var/mob/M in GLOB.dead_mob_list)
if(!M.client || isnewplayer(M))
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index 64454b130e..9178a2341b 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -62,9 +62,9 @@
//keep viruses?
if (tr_flags & TR_KEEPVIRUS)
- O.viruses = viruses
- viruses = list()
- for(var/thing in O.viruses)
+ O.diseases = diseases
+ diseases = list()
+ for(var/thing in O.diseases)
var/datum/disease/D = thing
D.affected_mob = O
@@ -76,6 +76,7 @@
O.setCloneLoss(getCloneLoss(), 0)
O.adjustFireLoss(getFireLoss(), 0)
O.setBrainLoss(getBrainLoss(), 0)
+ O.adjustStaminaLoss(getStaminaLoss(), 0)//CIT CHANGE - makes monkey transformations inherit stamina
O.updatehealth()
O.radiation = radiation
@@ -218,9 +219,9 @@
//keep viruses?
if (tr_flags & TR_KEEPVIRUS)
- O.viruses = viruses
- viruses = list()
- for(var/thing in O.viruses)
+ O.diseases = diseases
+ diseases = list()
+ for(var/thing in O.diseases)
var/datum/disease/D = thing
D.affected_mob = O
O.med_hud_set_status()
@@ -233,6 +234,7 @@
O.setCloneLoss(getCloneLoss(), 0)
O.adjustFireLoss(getFireLoss(), 0)
O.setBrainLoss(getBrainLoss(), 0)
+ O.adjustStaminaLoss(getStaminaLoss(), 0)//CIT CHANGE - makes monkey transformations inherit stamina
O.updatehealth()
O.radiation = radiation
diff --git a/code/modules/ninja/__ninjaDefines.dm b/code/modules/ninja/__ninjaDefines.dm
index 352087f4e8..1a3e9dce63 100644
--- a/code/modules/ninja/__ninjaDefines.dm
+++ b/code/modules/ninja/__ninjaDefines.dm
@@ -18,7 +18,6 @@ Contents:
#define INVALID_DRAIN "INVALID" //This one is if the drain proc needs to cancel, eg missing variables, etc, it's important.
-#define DRAIN_RD_HACKED "RDHACK"
#define DRAIN_RD_HACK_FAILED "RDHACKFAIL"
#define DRAIN_MOB_SHOCK "MOBSHOCK"
#define DRAIN_MOB_SHOCK_FAILED "MOBSHOCKFAIL"
\ No newline at end of file
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index a182e86074..faad79664e 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -388,7 +388,7 @@
if(LIGHT_BROKEN)
to_chat(user, "The [fitting] has been smashed.")
if(cell)
- to_chat(user, "Its backup power charge meter reads [(cell.charge / cell.maxcharge) * 100]%.")
+ to_chat(user, "Its backup power charge meter reads [round((cell.charge / cell.maxcharge) * 100, 0.1)]%.")
diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm
index 45149d1346..d160209e0c 100644
--- a/code/modules/power/singularity/field_generator.dm
+++ b/code/modules/power/singularity/field_generator.dm
@@ -18,6 +18,11 @@ field_generator power level display
#define FG_CHARGING 1
#define FG_ONLINE 2
+//field generator construction defines
+#define FG_UNSECURED 0
+#define FG_SECURED 1
+#define FG_WELDED 2
+
/obj/machinery/field/generator
name = "field generator"
desc = "A large thermal battery that projects a high amount of energy when powered."
diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm
index 2293fb2fb2..f6b785b3e1 100644
--- a/code/modules/power/singularity/narsie.dm
+++ b/code/modules/power/singularity/narsie.dm
@@ -63,21 +63,21 @@
var/mob/living/L = cult_mind.current
L.narsie_act()
for(var/mob/living/player in GLOB.player_list)
- if(player.stat != DEAD && is_station_level(player.loc.z) && !iscultist(player))
+ if(player.stat != DEAD && player.loc && is_station_level(player.loc.z) && !iscultist(player) && !isanimal(player))
souls_needed[player] = TRUE
- soul_goal = round(1 + LAZYLEN(souls_needed) * 0.6)
+ soul_goal = round(1 + LAZYLEN(souls_needed) * 0.75)
INVOKE_ASYNC(src, .proc/begin_the_end)
/obj/singularity/narsie/large/cult/proc/begin_the_end()
sleep(50)
priority_announce("An acausal dimensional event has been detected in your sector. Event has been flagged EXTINCTION-CLASS. Directing all available assets toward simulating solutions. SOLUTION ETA: 60 SECONDS.","Central Command Higher Dimensional Affairs", 'sound/misc/airraid.ogg')
- sleep(550)
- priority_announce("Simulations on acausal dimensional event complete. Deploying solution package now. Deployment ETA: TWO MINUTES. ","Central Command Higher Dimensional Affairs")
+ sleep(500)
+ priority_announce("Simulations on acausal dimensional event complete. Deploying solution package now. Deployment ETA: ONE MINUTE. ","Central Command Higher Dimensional Affairs")
sleep(50)
set_security_level("delta")
SSshuttle.registerHostileEnvironment(src)
SSshuttle.lockdown = TRUE
- sleep(850)
+ sleep(600)
if(resolved == FALSE)
resolved = TRUE
sound_to_playing_players('sound/machines/alarm.ogg')
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index 0123919eb9..7a07ba5a7f 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -233,6 +233,9 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
if(M.z == z)
SEND_SOUND(M, 'sound/magic/charge.ogg')
to_chat(M, "You feel reality distort for a moment... ")
+ GET_COMPONENT_FROM(mood, /datum/component/mood, M)
+ if(mood)
+ mood.add_event("delam", /datum/mood_event/delam)
if(combined_gas > MOLE_PENALTY_THRESHOLD)
investigate_log("has collapsed into a singularity.", INVESTIGATE_SUPERMATTER)
if(T)
@@ -276,7 +279,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
if(!removed || !removed.total_moles() || isspaceturf(T)) //we're in space or there is no gas to process
if(takes_damage)
damage += max((power / 1000) * DAMAGE_INCREASE_MULTIPLIER, 0.1) // always does at least some damage
- else
+ else
if(takes_damage)
//causing damage
damage = max(damage + (max(removed.temperature - ((T0C + HEAT_PENALTY_THRESHOLD)*dynamic_heat_resistance), 0) * mole_heat_penalty / 150 ) * DAMAGE_INCREASE_MULTIPLIER, 0)
@@ -435,7 +438,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
L.rad_act(rads)
explode()
-
+
return 1
/obj/machinery/power/supermatter_shard/bullet_act(obj/item/projectile/Proj)
@@ -530,6 +533,8 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
/obj/machinery/power/supermatter_shard/attackby(obj/item/W, mob/living/user, params)
if(!istype(W) || (W.flags_1 & ABSTRACT_1) || !istype(user))
return
+ if (istype(W, /obj/item/melee/roastingstick))
+ return ..()
if(istype(W, /obj/item/scalpel/supermatter))
to_chat(user, "You carefully begin to scrape \the [src] with \the [W]... ")
if(W.use_tool(src, user, 60, volume=100))
diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm
index ca0122930d..b55accc134 100644
--- a/code/modules/power/tesla/coil.dm
+++ b/code/modules/power/tesla/coil.dm
@@ -25,7 +25,7 @@
/obj/machinery/power/tesla_coil/Initialize()
. = ..()
- wires = new /datum/wires/tesla_coil(src)
+// wires = new /datum/wires/tesla_coil(src) //CITADEL EDIT, Kevinz you cheaty fuccboi.
linked_techweb = SSresearch.science_tech
/obj/machinery/power/tesla_coil/RefreshParts()
@@ -36,6 +36,10 @@
zap_cooldown -= (C.rating * 20)
input_power_multiplier = power_multiplier
+/obj/machinery/power/tesla_coil/on_construction()
+ if(anchored)
+ connect_to_network()
+
/obj/machinery/power/tesla_coil/default_unfasten_wrench(mob/user, obj/item/I, time = 20)
. = ..()
if(. == SUCCESSFUL_UNFASTEN)
@@ -75,15 +79,13 @@
/obj/machinery/power/tesla_coil/tesla_act(var/power)
if(anchored && !panel_open)
obj_flags |= BEING_SHOCKED
- //don't lose arc power when it's not connected to anything
- //please place tesla coils all around the station to maximize effectiveness
var/power_produced = powernet ? power / power_loss : power
add_avail(power_produced*input_power_multiplier)
flick("coilhit", src)
playsound(src.loc, 'sound/magic/lightningshock.ogg', 100, 1, extrarange = 5)
tesla_zap(src, 5, power_produced)
if(istype(linked_techweb))
- linked_techweb.research_points += min(power_produced, 10)
+ linked_techweb.research_points += min(power_produced, 1)
addtimer(CALLBACK(src, .proc/reset_shocked), 10)
else
..()
@@ -110,20 +112,18 @@
/obj/machinery/power/tesla_coil/research/tesla_act(var/power)
if(anchored && !panel_open)
obj_flags |= BEING_SHOCKED
- //don't lose arc power when it's not connected to anything
- //please place tesla coils all around the station to maximize effectiveness
var/power_produced = powernet ? power / power_loss : power
add_avail(power_produced*input_power_multiplier)
flick("rpcoilhit", src)
playsound(src.loc, 'sound/magic/lightningshock.ogg', 100, 1, extrarange = 5)
tesla_zap(src, 5, power_produced)
if(istype(linked_techweb))
- linked_techweb.research_points += min(power_produced, 200)
+ linked_techweb.research_points += min(power_produced, 3) // 4 coils makes ~720/m bonus for R&D,
addtimer(CALLBACK(src, .proc/reset_shocked), 10)
else
..()
-/obj/machinery/power/tesla_coil/default_unfasten_wrench(mob/user, obj/item/wrench/W, time = 20)
+/obj/machinery/power/tesla_coil/research/default_unfasten_wrench(mob/user, obj/item/wrench/W, time = 20)
. = ..()
if(. == SUCCESSFUL_UNFASTEN)
if(panel_open)
@@ -131,7 +131,7 @@
else
icon_state = "rpcoil[anchored]"
-/obj/machinery/power/tesla_coil/attackby(obj/item/W, mob/user, params)
+/obj/machinery/power/tesla_coil/research/attackby(obj/item/W, mob/user, params)
. = ..()
if(default_deconstruction_screwdriver(user, "rpcoil_open[anchored]", "rpcoil[anchored]", W))
return
diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm
index 5c463b4ee9..d7f78635b0 100644
--- a/code/modules/power/turbine.dm
+++ b/code/modules/power/turbine.dm
@@ -81,14 +81,8 @@
#define COMPFRICTION 5e5
-#define COMPSTARTERLOAD 2800
-// Crucial to make things work!!!!
-// OLD FIX - explanation given down below.
-// /obj/machinery/power/compressor/CanPass(atom/movable/mover, turf/target)
-// return !density
-
/obj/machinery/power/compressor/locate_machinery()
if(turbine)
return
@@ -169,7 +163,6 @@
// These are crucial to working of a turbine - the stats modify the power output. TurbGenQ modifies how much raw energy can you get from
// rpms, TurbGenG modifies the shape of the curve - the lower the value the less straight the curve is.
-#define TURBPRES 9000000
#define TURBGENQ 100000
#define TURBGENG 0.5
@@ -180,6 +173,7 @@
locate_machinery()
if(!compressor)
stat |= BROKEN
+ connect_to_network()
/obj/machinery/power/turbine/RefreshParts()
var/P = 0
@@ -370,3 +364,7 @@
if("reconnect")
locate_machinery()
. = TRUE
+
+#undef COMPFRICTION
+#undef TURBGENQ
+#undef TURBGENG
diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition/_ammunition.dm
similarity index 100%
rename from code/modules/projectiles/ammunition.dm
rename to code/modules/projectiles/ammunition/_ammunition.dm
diff --git a/code/modules/projectiles/firing.dm b/code/modules/projectiles/ammunition/_firing.dm
similarity index 100%
rename from code/modules/projectiles/firing.dm
rename to code/modules/projectiles/ammunition/_firing.dm
diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm
deleted file mode 100644
index df0fd7278e..0000000000
--- a/code/modules/projectiles/ammunition/ammo_casings.dm
+++ /dev/null
@@ -1,314 +0,0 @@
-// .357 (Syndie Revolver)
-
-/obj/item/ammo_casing/a357
- name = ".357 bullet casing"
- desc = "A .357 bullet casing."
- caliber = "357"
- projectile_type = /obj/item/projectile/bullet/a357
-
-// 7.62 (Nagant Rifle)
-
-/obj/item/ammo_casing/a762
- name = "7.62 bullet casing"
- desc = "A 7.62 bullet casing."
- icon_state = "762-casing"
- caliber = "a762"
- projectile_type = /obj/item/projectile/bullet/a762
-
-/obj/item/ammo_casing/a762/enchanted
- projectile_type = /obj/item/projectile/bullet/a762_enchanted
-
-// 7.62x38mmR (Nagant Revolver)
-
-/obj/item/ammo_casing/n762
- name = "7.62x38mmR bullet casing"
- desc = "A 7.62x38mmR bullet casing."
- caliber = "n762"
- projectile_type = /obj/item/projectile/bullet/n762
-
-// .50AE (Desert Eagle)
-
-/obj/item/ammo_casing/a50AE
- name = ".50AE bullet casing"
- desc = "A .50AE bullet casing."
- caliber = ".50"
- projectile_type = /obj/item/projectile/bullet/a50AE
-
-// .38 (Detective's Gun)
-
-/obj/item/ammo_casing/c38
- name = ".38 bullet casing"
- desc = "A .38 bullet casing."
- caliber = "38"
- projectile_type = /obj/item/projectile/bullet/c38
-
-// 10mm (Stechkin)
-
-/obj/item/ammo_casing/c10mm
- name = ".10mm bullet casing"
- desc = "A 10mm bullet casing."
- caliber = "10mm"
- projectile_type = /obj/item/projectile/bullet/c10mm
-
-/obj/item/ammo_casing/c10mm/ap
- name = ".10mm armor-piercing bullet casing"
- desc = "A 10mm armor-piercing bullet casing."
- projectile_type = /obj/item/projectile/bullet/c10mm_ap
-
-/obj/item/ammo_casing/c10mm/hp
- name = ".10mm hollow-point bullet casing"
- desc = "A 10mm hollow-point bullet casing."
- projectile_type = /obj/item/projectile/bullet/c10mm_hp
-
-/obj/item/ammo_casing/c10mm/fire
- name = ".10mm incendiary bullet casing"
- desc = "A 10mm incendiary bullet casing."
- projectile_type = /obj/item/projectile/bullet/incendiary/c10mm
-
-// 9mm (Stechkin APS)
-
-/obj/item/ammo_casing/c9mm
- name = "9mm bullet casing"
- desc = "A 9mm bullet casing."
- caliber = "9mm"
- projectile_type = /obj/item/projectile/bullet/c9mm
-
-/obj/item/ammo_casing/c9mm/ap
- name = "9mm armor-piercing bullet casing"
- desc = "A 9mm armor-piercing bullet casing."
- projectile_type =/obj/item/projectile/bullet/c9mm_ap
-
-/obj/item/ammo_casing/c9mm/inc
- name = "9mm incendiary bullet casing"
- desc = "A 9mm incendiary bullet casing."
- projectile_type = /obj/item/projectile/bullet/incendiary/c9mm
-
-// 4.6x30mm (Autorifles)
-
-/obj/item/ammo_casing/c46x30mm
- name = "4.6x30mm bullet casing"
- desc = "A 4.6x30mm bullet casing."
- caliber = "4.6x30mm"
- projectile_type = /obj/item/projectile/bullet/c46x30mm
-
-/obj/item/ammo_casing/c46x30mm/ap
- name = "4.6x30mm armor-piercing bullet casing"
- desc = "A 4.6x30mm armor-piercing bullet casing."
- projectile_type = /obj/item/projectile/bullet/c46x30mm_ap
-
-/obj/item/ammo_casing/c46x30mm/inc
- name = "4.6x30mm incendiary bullet casing"
- desc = "A 4.6x30mm incendiary bullet casing."
- projectile_type = /obj/item/projectile/bullet/incendiary/c46x30mm
-
-// .45 (M1911 + C20r)
-
-/obj/item/ammo_casing/c45
- name = ".45 bullet casing"
- desc = "A .45 bullet casing."
- caliber = ".45"
- projectile_type = /obj/item/projectile/bullet/c45
-
-/obj/item/ammo_casing/c45/nostamina
- projectile_type = /obj/item/projectile/bullet/c45_nostamina
-
-// 5.56mm (M-90gl Carbine)
-
-/obj/item/ammo_casing/a556
- name = "5.56mm bullet casing"
- desc = "A 5.56mm bullet casing."
- caliber = "a556"
- projectile_type = /obj/item/projectile/bullet/a556
-
-// 40mm (Grenade Launcher)
-
-/obj/item/ammo_casing/a40mm
- name = "40mm HE shell"
- desc = "A cased high explosive grenade that can only be activated once fired out of a grenade launcher."
- caliber = "40mm"
- icon_state = "40mmHE"
- projectile_type = /obj/item/projectile/bullet/a40mm
-
-// .50 (Sniper)
-
-/obj/item/ammo_casing/p50
- name = ".50 bullet casing"
- desc = "A .50 bullet casing."
- caliber = ".50"
- projectile_type = /obj/item/projectile/bullet/p50
- icon_state = ".50"
-
-/obj/item/ammo_casing/p50/soporific
- name = ".50 soporific bullet casing"
- desc = "A .50 bullet casing, specialised in sending the target to sleep, instead of hell."
- projectile_type = /obj/item/projectile/bullet/p50/soporific
- icon_state = "sleeper"
-
-/obj/item/ammo_casing/p50/penetrator
- name = ".50 penetrator round bullet casing"
- desc = "A .50 caliber penetrator round casing."
- projectile_type = /obj/item/projectile/bullet/p50/penetrator
-
-// 1.95x129mm (SAW)
-
-/obj/item/ammo_casing/mm195x129
- name = "1.95x129mm bullet casing"
- desc = "A 1.95x129mm bullet casing."
- icon_state = "762-casing"
- caliber = "mm195129"
- projectile_type = /obj/item/projectile/bullet/mm195x129
-
-/obj/item/ammo_casing/mm195x129/ap
- name = "1.95x129mm armor-piercing bullet casing"
- desc = "A 1.95x129mm bullet casing designed with a hardened-tipped core to help penetrate armored targets."
- projectile_type = /obj/item/projectile/bullet/mm195x129_ap
-
-/obj/item/ammo_casing/mm195x129/hollow
- name = "1.95x129mm hollow-point bullet casing"
- desc = "A 1.95x129mm bullet casing designed to cause more damage to unarmored targets."
- projectile_type = /obj/item/projectile/bullet/mm195x129_hp
-
-/obj/item/ammo_casing/mm195x129/incen
- name = "1.95x129mm incendiary bullet casing"
- desc = "A 1.95x129mm bullet casing designed with a chemical-filled capsule on the tip that when bursted, reacts with the atmosphere to produce a fireball, engulfing the target in flames."
- projectile_type = /obj/item/projectile/bullet/incendiary/mm195x129
-
-// Shotgun
-
-/obj/item/ammo_casing/shotgun
- name = "shotgun slug"
- desc = "A 12 gauge lead slug."
- icon_state = "blshell"
- caliber = "shotgun"
- projectile_type = /obj/item/projectile/bullet/shotgun_slug
- materials = list(MAT_METAL=4000)
-
-/obj/item/ammo_casing/shotgun/beanbag
- name = "beanbag slug"
- desc = "A weak beanbag slug for riot control."
- icon_state = "bshell"
- projectile_type = /obj/item/projectile/bullet/shotgun_beanbag
- materials = list(MAT_METAL=250)
-
-/obj/item/ammo_casing/shotgun/incendiary
- name = "incendiary slug"
- desc = "An incendiary-coated shotgun slug."
- icon_state = "ishell"
- projectile_type = /obj/item/projectile/bullet/incendiary/shotgun
-
-/obj/item/ammo_casing/shotgun/dragonsbreath
- name = "dragonsbreath shell"
- desc = "A shotgun shell which fires a spread of incendiary pellets."
- icon_state = "ishell2"
- projectile_type = /obj/item/projectile/bullet/incendiary/shotgun/dragonsbreath
- pellets = 4
- variance = 35
-
-/obj/item/ammo_casing/shotgun/stunslug
- name = "taser slug"
- desc = "A stunning taser slug."
- icon_state = "stunshell"
- projectile_type = /obj/item/projectile/bullet/shotgun_stunslug
- materials = list(MAT_METAL=250)
-
-/obj/item/ammo_casing/shotgun/meteorslug
- name = "meteorslug shell"
- desc = "A shotgun shell rigged with CMC technology, which launches a massive slug when fired."
- icon_state = "mshell"
- projectile_type = /obj/item/projectile/bullet/shotgun_meteorslug
-
-/obj/item/ammo_casing/shotgun/pulseslug
- name = "pulse slug"
- desc = "A delicate device which can be loaded into a shotgun. The primer acts as a button which triggers the gain medium and fires a powerful \
- energy blast. While the heat and power drain limit it to one use, it can still allow an operator to engage targets that ballistic ammunition \
- would have difficulty with."
- icon_state = "pshell"
- projectile_type = /obj/item/projectile/beam/pulse/shotgun
-
-/obj/item/ammo_casing/shotgun/frag12
- name = "FRAG-12 slug"
- desc = "A high explosive breaching round for a 12 gauge shotgun."
- icon_state = "heshell"
- projectile_type = /obj/item/projectile/bullet/shotgun_frag12
-
-/obj/item/ammo_casing/shotgun/buckshot
- name = "buckshot shell"
- desc = "A 12 gauge buckshot shell."
- icon_state = "gshell"
- projectile_type = /obj/item/projectile/bullet/pellet/shotgun_buckshot
- pellets = 6
- variance = 25
-
-/obj/item/ammo_casing/shotgun/rubbershot
- name = "rubber shot"
- desc = "A shotgun casing filled with densely-packed rubber balls, used to incapacitate crowds from a distance."
- icon_state = "bshell"
- projectile_type = /obj/item/projectile/bullet/pellet/shotgun_rubbershot
- pellets = 6
- variance = 25
- materials = list(MAT_METAL=4000)
-
-/obj/item/ammo_casing/shotgun/improvised
- name = "improvised shell"
- desc = "An extremely weak shotgun shell with multiple small pellets made out of metal shards."
- icon_state = "improvshell"
- projectile_type = /obj/item/projectile/bullet/pellet/shotgun_improvised
- materials = list(MAT_METAL=250)
- pellets = 10
- variance = 25
-
-/obj/item/ammo_casing/shotgun/ion
- name = "ion shell"
- desc = "An advanced shotgun shell which uses a subspace ansible crystal to produce an effect similar to a standard ion rifle. \
- The unique properties of the crystal split the pulse into a spread of individually weaker bolts."
- icon_state = "ionshell"
- projectile_type = /obj/item/projectile/ion/weak
- pellets = 4
- variance = 35
-
-/obj/item/ammo_casing/shotgun/laserslug
- name = "laser slug"
- desc = "An advanced shotgun shell that uses a micro laser to replicate the effects of a laser weapon in a ballistic package."
- icon_state = "lshell"
- projectile_type = /obj/item/projectile/beam/laser
-
-/obj/item/ammo_casing/shotgun/techshell
- name = "unloaded technological shell"
- desc = "A high-tech shotgun shell which can be loaded with materials to produce unique effects."
- icon_state = "cshell"
- projectile_type = null
-
-/obj/item/ammo_casing/shotgun/dart
- name = "shotgun dart"
- desc = "A dart for use in shotguns. Can be injected with up to 30 units of any chemical."
- icon_state = "cshell"
- projectile_type = /obj/item/projectile/bullet/dart
- var/reagent_amount = 30
- var/reagent_react = TRUE
-
-/obj/item/ammo_casing/shotgun/dart/noreact
- name = "cryostasis shotgun dart"
- desc = "A dart for use in shotguns, using similar technolgoy as cryostatis beakers to keep internal reagents from reacting. Can be injected with up to 10 units of any chemical."
- icon_state = "cnrshell"
- reagent_amount = 10
- reagent_react = FALSE
-
-/obj/item/ammo_casing/shotgun/dart/Initialize()
- . = ..()
- container_type |= OPENCONTAINER
- create_reagents(reagent_amount)
- reagents.set_reacting(reagent_react)
-
-/obj/item/ammo_casing/shotgun/dart/attackby()
- return
-
-/obj/item/ammo_casing/shotgun/dart/bioterror
- desc = "A shotgun dart filled with deadly toxins."
-
-/obj/item/ammo_casing/shotgun/dart/bioterror/Initialize()
- . = ..()
- reagents.add_reagent("neurotoxin", 6)
- reagents.add_reagent("spore", 6)
- reagents.add_reagent("mutetoxin", 6) //;HELP OPS IN MAINT
- reagents.add_reagent("coniine", 6)
- reagents.add_reagent("sodium_thiopental", 6)
diff --git a/code/modules/projectiles/ammunition/ballistic/lmg.dm b/code/modules/projectiles/ammunition/ballistic/lmg.dm
new file mode 100644
index 0000000000..1ce2e0065e
--- /dev/null
+++ b/code/modules/projectiles/ammunition/ballistic/lmg.dm
@@ -0,0 +1,23 @@
+// 1.95x129mm (SAW)
+
+/obj/item/ammo_casing/mm195x129
+ name = "1.95x129mm bullet casing"
+ desc = "A 1.95x129mm bullet casing."
+ icon_state = "762-casing"
+ caliber = "mm195129"
+ projectile_type = /obj/item/projectile/bullet/mm195x129
+
+/obj/item/ammo_casing/mm195x129/ap
+ name = "1.95x129mm armor-piercing bullet casing"
+ desc = "A 1.95x129mm bullet casing designed with a hardened-tipped core to help penetrate armored targets."
+ projectile_type = /obj/item/projectile/bullet/mm195x129_ap
+
+/obj/item/ammo_casing/mm195x129/hollow
+ name = "1.95x129mm hollow-point bullet casing"
+ desc = "A 1.95x129mm bullet casing designed to cause more damage to unarmored targets."
+ projectile_type = /obj/item/projectile/bullet/mm195x129_hp
+
+/obj/item/ammo_casing/mm195x129/incen
+ name = "1.95x129mm incendiary bullet casing"
+ desc = "A 1.95x129mm bullet casing designed with a chemical-filled capsule on the tip that when bursted, reacts with the atmosphere to produce a fireball, engulfing the target in flames."
+ projectile_type = /obj/item/projectile/bullet/incendiary/mm195x129
diff --git a/code/modules/projectiles/ammunition/ballistic/pistol.dm b/code/modules/projectiles/ammunition/ballistic/pistol.dm
new file mode 100644
index 0000000000..02134e95e1
--- /dev/null
+++ b/code/modules/projectiles/ammunition/ballistic/pistol.dm
@@ -0,0 +1,50 @@
+// 10mm (Stechkin)
+
+/obj/item/ammo_casing/c10mm
+ name = ".10mm bullet casing"
+ desc = "A 10mm bullet casing."
+ caliber = "10mm"
+ projectile_type = /obj/item/projectile/bullet/c10mm
+
+/obj/item/ammo_casing/c10mm/ap
+ name = ".10mm armor-piercing bullet casing"
+ desc = "A 10mm armor-piercing bullet casing."
+ projectile_type = /obj/item/projectile/bullet/c10mm_ap
+
+/obj/item/ammo_casing/c10mm/hp
+ name = ".10mm hollow-point bullet casing"
+ desc = "A 10mm hollow-point bullet casing."
+ projectile_type = /obj/item/projectile/bullet/c10mm_hp
+
+/obj/item/ammo_casing/c10mm/fire
+ name = ".10mm incendiary bullet casing"
+ desc = "A 10mm incendiary bullet casing."
+ projectile_type = /obj/item/projectile/bullet/incendiary/c10mm
+
+// 9mm (Stechkin APS)
+
+/obj/item/ammo_casing/c9mm
+ name = "9mm bullet casing"
+ desc = "A 9mm bullet casing."
+ caliber = "9mm"
+ projectile_type = /obj/item/projectile/bullet/c9mm
+
+/obj/item/ammo_casing/c9mm/ap
+ name = "9mm armor-piercing bullet casing"
+ desc = "A 9mm armor-piercing bullet casing."
+ projectile_type =/obj/item/projectile/bullet/c9mm_ap
+
+/obj/item/ammo_casing/c9mm/inc
+ name = "9mm incendiary bullet casing"
+ desc = "A 9mm incendiary bullet casing."
+ projectile_type = /obj/item/projectile/bullet/incendiary/c9mm
+
+
+// .50AE (Desert Eagle)
+
+/obj/item/ammo_casing/a50AE
+ name = ".50AE bullet casing"
+ desc = "A .50AE bullet casing."
+ caliber = ".50"
+ projectile_type = /obj/item/projectile/bullet/a50AE
+
diff --git a/code/modules/projectiles/ammunition/ballistic/revolver.dm b/code/modules/projectiles/ammunition/ballistic/revolver.dm
new file mode 100644
index 0000000000..52a72e0ff7
--- /dev/null
+++ b/code/modules/projectiles/ammunition/ballistic/revolver.dm
@@ -0,0 +1,23 @@
+// .357 (Syndie Revolver)
+
+/obj/item/ammo_casing/a357
+ name = ".357 bullet casing"
+ desc = "A .357 bullet casing."
+ caliber = "357"
+ projectile_type = /obj/item/projectile/bullet/a357
+
+// 7.62x38mmR (Nagant Revolver)
+
+/obj/item/ammo_casing/n762
+ name = "7.62x38mmR bullet casing"
+ desc = "A 7.62x38mmR bullet casing."
+ caliber = "n762"
+ projectile_type = /obj/item/projectile/bullet/n762
+
+// .38 (Detective's Gun)
+
+/obj/item/ammo_casing/c38
+ name = ".38 bullet casing"
+ desc = "A .38 bullet casing."
+ caliber = "38"
+ projectile_type = /obj/item/projectile/bullet/c38
diff --git a/code/modules/projectiles/ammunition/ballistic/rifle.dm b/code/modules/projectiles/ammunition/ballistic/rifle.dm
new file mode 100644
index 0000000000..a35cfcba1c
--- /dev/null
+++ b/code/modules/projectiles/ammunition/ballistic/rifle.dm
@@ -0,0 +1,28 @@
+// 7.62 (Nagant Rifle)
+
+/obj/item/ammo_casing/a762
+ name = "7.62 bullet casing"
+ desc = "A 7.62 bullet casing."
+ icon_state = "762-casing"
+ caliber = "a762"
+ projectile_type = /obj/item/projectile/bullet/a762
+
+/obj/item/ammo_casing/a762/enchanted
+ projectile_type = /obj/item/projectile/bullet/a762_enchanted
+
+// 5.56mm (M-90gl Carbine)
+
+/obj/item/ammo_casing/a556
+ name = "5.56mm bullet casing"
+ desc = "A 5.56mm bullet casing."
+ caliber = "a556"
+ projectile_type = /obj/item/projectile/bullet/a556
+
+// 40mm (Grenade Launcher)
+
+/obj/item/ammo_casing/a40mm
+ name = "40mm HE shell"
+ desc = "A cased high explosive grenade that can only be activated once fired out of a grenade launcher."
+ caliber = "40mm"
+ icon_state = "40mmHE"
+ projectile_type = /obj/item/projectile/bullet/a40mm
diff --git a/code/modules/projectiles/ammunition/ballistic/shotgun.dm b/code/modules/projectiles/ammunition/ballistic/shotgun.dm
new file mode 100644
index 0000000000..b700d092d7
--- /dev/null
+++ b/code/modules/projectiles/ammunition/ballistic/shotgun.dm
@@ -0,0 +1,139 @@
+// Shotgun
+
+/obj/item/ammo_casing/shotgun
+ name = "shotgun slug"
+ desc = "A 12 gauge lead slug."
+ icon_state = "blshell"
+ caliber = "shotgun"
+ projectile_type = /obj/item/projectile/bullet/shotgun_slug
+ materials = list(MAT_METAL=4000)
+
+/obj/item/ammo_casing/shotgun/beanbag
+ name = "beanbag slug"
+ desc = "A weak beanbag slug for riot control."
+ icon_state = "bshell"
+ projectile_type = /obj/item/projectile/bullet/shotgun_beanbag
+ materials = list(MAT_METAL=250)
+
+/obj/item/ammo_casing/shotgun/incendiary
+ name = "incendiary slug"
+ desc = "An incendiary-coated shotgun slug."
+ icon_state = "ishell"
+ projectile_type = /obj/item/projectile/bullet/incendiary/shotgun
+
+/obj/item/ammo_casing/shotgun/dragonsbreath
+ name = "dragonsbreath shell"
+ desc = "A shotgun shell which fires a spread of incendiary pellets."
+ icon_state = "ishell2"
+ projectile_type = /obj/item/projectile/bullet/incendiary/shotgun/dragonsbreath
+ pellets = 4
+ variance = 35
+
+/obj/item/ammo_casing/shotgun/stunslug
+ name = "taser slug"
+ desc = "A stunning taser slug."
+ icon_state = "stunshell"
+ projectile_type = /obj/item/projectile/bullet/shotgun_stunslug
+ materials = list(MAT_METAL=250)
+
+/obj/item/ammo_casing/shotgun/meteorslug
+ name = "meteorslug shell"
+ desc = "A shotgun shell rigged with CMC technology, which launches a massive slug when fired."
+ icon_state = "mshell"
+ projectile_type = /obj/item/projectile/bullet/shotgun_meteorslug
+
+/obj/item/ammo_casing/shotgun/pulseslug
+ name = "pulse slug"
+ desc = "A delicate device which can be loaded into a shotgun. The primer acts as a button which triggers the gain medium and fires a powerful \
+ energy blast. While the heat and power drain limit it to one use, it can still allow an operator to engage targets that ballistic ammunition \
+ would have difficulty with."
+ icon_state = "pshell"
+ projectile_type = /obj/item/projectile/beam/pulse/shotgun
+
+/obj/item/ammo_casing/shotgun/frag12
+ name = "FRAG-12 slug"
+ desc = "A high explosive breaching round for a 12 gauge shotgun."
+ icon_state = "heshell"
+ projectile_type = /obj/item/projectile/bullet/shotgun_frag12
+
+/obj/item/ammo_casing/shotgun/buckshot
+ name = "buckshot shell"
+ desc = "A 12 gauge buckshot shell."
+ icon_state = "gshell"
+ projectile_type = /obj/item/projectile/bullet/pellet/shotgun_buckshot
+ pellets = 6
+ variance = 25
+
+/obj/item/ammo_casing/shotgun/rubbershot
+ name = "rubber shot"
+ desc = "A shotgun casing filled with densely-packed rubber balls, used to incapacitate crowds from a distance."
+ icon_state = "bshell"
+ projectile_type = /obj/item/projectile/bullet/pellet/shotgun_rubbershot
+ pellets = 6
+ variance = 25
+ materials = list(MAT_METAL=4000)
+
+/obj/item/ammo_casing/shotgun/improvised
+ name = "improvised shell"
+ desc = "An extremely weak shotgun shell with multiple small pellets made out of metal shards."
+ icon_state = "improvshell"
+ projectile_type = /obj/item/projectile/bullet/pellet/shotgun_improvised
+ materials = list(MAT_METAL=250)
+ pellets = 10
+ variance = 25
+
+/obj/item/ammo_casing/shotgun/ion
+ name = "ion shell"
+ desc = "An advanced shotgun shell which uses a subspace ansible crystal to produce an effect similar to a standard ion rifle. \
+ The unique properties of the crystal split the pulse into a spread of individually weaker bolts."
+ icon_state = "ionshell"
+ projectile_type = /obj/item/projectile/ion/weak
+ pellets = 4
+ variance = 35
+
+/obj/item/ammo_casing/shotgun/laserslug
+ name = "laser slug"
+ desc = "An advanced shotgun shell that uses a micro laser to replicate the effects of a laser weapon in a ballistic package."
+ icon_state = "lshell"
+ projectile_type = /obj/item/projectile/beam/laser
+
+/obj/item/ammo_casing/shotgun/techshell
+ name = "unloaded technological shell"
+ desc = "A high-tech shotgun shell which can be loaded with materials to produce unique effects."
+ icon_state = "cshell"
+ projectile_type = null
+
+/obj/item/ammo_casing/shotgun/dart
+ name = "shotgun dart"
+ desc = "A dart for use in shotguns. Can be injected with up to 30 units of any chemical."
+ icon_state = "cshell"
+ projectile_type = /obj/item/projectile/bullet/dart
+ var/reagent_amount = 30
+ var/reagent_react = TRUE
+
+/obj/item/ammo_casing/shotgun/dart/noreact
+ name = "cryostasis shotgun dart"
+ desc = "A dart for use in shotguns, using similar technolgoy as cryostatis beakers to keep internal reagents from reacting. Can be injected with up to 10 units of any chemical."
+ icon_state = "cnrshell"
+ reagent_amount = 10
+ reagent_react = FALSE
+
+/obj/item/ammo_casing/shotgun/dart/Initialize()
+ . = ..()
+ container_type |= OPENCONTAINER
+ create_reagents(reagent_amount)
+ reagents.set_reacting(reagent_react)
+
+/obj/item/ammo_casing/shotgun/dart/attackby()
+ return
+
+/obj/item/ammo_casing/shotgun/dart/bioterror
+ desc = "A shotgun dart filled with deadly toxins."
+
+/obj/item/ammo_casing/shotgun/dart/bioterror/Initialize()
+ . = ..()
+ reagents.add_reagent("neurotoxin", 6)
+ reagents.add_reagent("spore", 6)
+ reagents.add_reagent("mutetoxin", 6) //;HELP OPS IN MAINT
+ reagents.add_reagent("coniine", 6)
+ reagents.add_reagent("sodium_thiopental", 6)
diff --git a/code/modules/projectiles/ammunition/ballistic/smg.dm b/code/modules/projectiles/ammunition/ballistic/smg.dm
new file mode 100644
index 0000000000..3be419c933
--- /dev/null
+++ b/code/modules/projectiles/ammunition/ballistic/smg.dm
@@ -0,0 +1,28 @@
+// 4.6x30mm (Autorifles)
+
+/obj/item/ammo_casing/c46x30mm
+ name = "4.6x30mm bullet casing"
+ desc = "A 4.6x30mm bullet casing."
+ caliber = "4.6x30mm"
+ projectile_type = /obj/item/projectile/bullet/c46x30mm
+
+/obj/item/ammo_casing/c46x30mm/ap
+ name = "4.6x30mm armor-piercing bullet casing"
+ desc = "A 4.6x30mm armor-piercing bullet casing."
+ projectile_type = /obj/item/projectile/bullet/c46x30mm_ap
+
+/obj/item/ammo_casing/c46x30mm/inc
+ name = "4.6x30mm incendiary bullet casing"
+ desc = "A 4.6x30mm incendiary bullet casing."
+ projectile_type = /obj/item/projectile/bullet/incendiary/c46x30mm
+
+// .45 (M1911 + C20r)
+
+/obj/item/ammo_casing/c45
+ name = ".45 bullet casing"
+ desc = "A .45 bullet casing."
+ caliber = ".45"
+ projectile_type = /obj/item/projectile/bullet/c45
+
+/obj/item/ammo_casing/c45/nostamina
+ projectile_type = /obj/item/projectile/bullet/c45_nostamina
diff --git a/code/modules/projectiles/ammunition/ballistic/sniper.dm b/code/modules/projectiles/ammunition/ballistic/sniper.dm
new file mode 100644
index 0000000000..5906fcfaba
--- /dev/null
+++ b/code/modules/projectiles/ammunition/ballistic/sniper.dm
@@ -0,0 +1,19 @@
+// .50 (Sniper)
+
+/obj/item/ammo_casing/p50
+ name = ".50 bullet casing"
+ desc = "A .50 bullet casing."
+ caliber = ".50"
+ projectile_type = /obj/item/projectile/bullet/p50
+ icon_state = ".50"
+
+/obj/item/ammo_casing/p50/soporific
+ name = ".50 soporific bullet casing"
+ desc = "A .50 bullet casing, specialised in sending the target to sleep, instead of hell."
+ projectile_type = /obj/item/projectile/bullet/p50/soporific
+ icon_state = "sleeper"
+
+/obj/item/ammo_casing/p50/penetrator
+ name = ".50 penetrator round bullet casing"
+ desc = "A .50 caliber penetrator round casing."
+ projectile_type = /obj/item/projectile/bullet/p50/penetrator
diff --git a/code/modules/projectiles/ammunition/caseless/_caseless.dm b/code/modules/projectiles/ammunition/caseless/_caseless.dm
new file mode 100644
index 0000000000..154d269cd9
--- /dev/null
+++ b/code/modules/projectiles/ammunition/caseless/_caseless.dm
@@ -0,0 +1,15 @@
+/obj/item/ammo_casing/caseless
+ desc = "A caseless bullet casing."
+ firing_effect_type = null
+ heavy_metal = FALSE
+
+/obj/item/ammo_casing/caseless/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread)
+ if (..()) //successfully firing
+ moveToNullspace()
+ return 1
+ else
+ return 0
+
+/obj/item/ammo_casing/caseless/update_icon()
+ ..()
+ icon_state = "[initial(icon_state)]"
diff --git a/code/modules/projectiles/ammunition/caseless.dm b/code/modules/projectiles/ammunition/caseless/foam.dm
similarity index 56%
rename from code/modules/projectiles/ammunition/caseless.dm
rename to code/modules/projectiles/ammunition/caseless/foam.dm
index b3439c86b2..fdf685e001 100644
--- a/code/modules/projectiles/ammunition/caseless.dm
+++ b/code/modules/projectiles/ammunition/caseless/foam.dm
@@ -1,117 +1,61 @@
-
-// Caseless Ammunition
-
-/obj/item/ammo_casing/caseless
- desc = "A caseless bullet casing."
- firing_effect_type = null
- heavy_metal = FALSE
-
-/obj/item/ammo_casing/caseless/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread)
- if (..()) //successfully firing
- moveToNullspace()
- return 1
- else
- return 0
-
-/obj/item/ammo_casing/caseless/update_icon()
- ..()
- icon_state = "[initial(icon_state)]"
-
-/obj/item/ammo_casing/caseless/a75
- desc = "A .75 bullet casing."
- caliber = "75"
- icon_state = "s-casing-live"
- projectile_type = /obj/item/projectile/bullet/gyro
-
-/obj/item/ammo_casing/caseless/a84mm
- desc = "An 84mm anti-armour rocket."
- caliber = "84mm"
- icon_state = "s-casing-live"
- projectile_type = /obj/item/projectile/bullet/a84mm
-
-/obj/item/ammo_casing/caseless/magspear
- name = "magnetic spear"
- desc = "A reusable spear that is typically loaded into kinetic spearguns."
- projectile_type = /obj/item/projectile/bullet/reusable/magspear
- caliber = "speargun"
- icon_state = "magspear"
- throwforce = 15 //still deadly when thrown
- throw_speed = 3
-
-
-/obj/item/ammo_casing/caseless/laser
- name = "laser casing"
- desc = "You shouldn't be seeing this."
- caliber = "laser"
- icon_state = "s-casing-live"
- projectile_type = /obj/item/projectile/beam
- fire_sound = 'sound/weapons/laser.ogg'
- firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/energy
-
-/obj/item/ammo_casing/caseless/laser/gatling
- projectile_type = /obj/item/projectile/beam/weak
- variance = 0.8
- click_cooldown_override = 1
-
-
-/obj/item/ammo_casing/caseless/foam_dart
- name = "foam dart"
- desc = "It's nerf or nothing! Ages 8 and up."
- projectile_type = /obj/item/projectile/bullet/reusable/foam_dart
- caliber = "foam_force"
- icon = 'icons/obj/guns/toy.dmi'
- icon_state = "foamdart"
- var/modified = 0
-
-/obj/item/ammo_casing/caseless/foam_dart/update_icon()
- ..()
- if (modified)
- icon_state = "foamdart_empty"
- desc = "It's nerf or nothing! ... Although, this one doesn't look too safe."
- if(BB)
- BB.icon_state = "foamdart_empty"
- else
- icon_state = initial(icon_state)
- desc = "It's nerf or nothing! Ages 8 and up."
- if(BB)
- BB.icon_state = initial(BB.icon_state)
-
-
-/obj/item/ammo_casing/caseless/foam_dart/attackby(obj/item/A, mob/user, params)
- var/obj/item/projectile/bullet/reusable/foam_dart/FD = BB
- if (istype(A, /obj/item/screwdriver) && !modified)
- modified = 1
- FD.modified = 1
- FD.damage_type = BRUTE
- to_chat(user, "You pop the safety cap off [src]. ")
- update_icon()
- else if (istype(A, /obj/item/pen))
- if(modified)
- if(!FD.pen)
- if(!user.transferItemToLoc(A, FD))
- return
- FD.pen = A
- FD.damage = 5
- FD.nodamage = 0
- to_chat(user, "You insert [A] into [src]. ")
- else
- to_chat(user, "There's already something in [src]. ")
- else
- to_chat(user, "The safety cap prevents you from inserting [A] into [src]. ")
- else
- return ..()
-
-/obj/item/ammo_casing/caseless/foam_dart/attack_self(mob/living/user)
- var/obj/item/projectile/bullet/reusable/foam_dart/FD = BB
- if(FD.pen)
- FD.damage = initial(FD.damage)
- FD.nodamage = initial(FD.nodamage)
- user.put_in_hands(FD.pen)
- to_chat(user, "You remove [FD.pen] from [src]. ")
- FD.pen = null
-
-/obj/item/ammo_casing/caseless/foam_dart/riot
- name = "riot foam dart"
- desc = "Whose smart idea was it to use toys as crowd control? Ages 18 and up."
- projectile_type = /obj/item/projectile/bullet/reusable/foam_dart/riot
- icon_state = "foamdart_riot"
+/obj/item/ammo_casing/caseless/foam_dart
+ name = "foam dart"
+ desc = "It's nerf or nothing! Ages 8 and up."
+ projectile_type = /obj/item/projectile/bullet/reusable/foam_dart
+ caliber = "foam_force"
+ icon = 'icons/obj/guns/toy.dmi'
+ icon_state = "foamdart"
+ var/modified = 0
+
+/obj/item/ammo_casing/caseless/foam_dart/update_icon()
+ ..()
+ if (modified)
+ icon_state = "foamdart_empty"
+ desc = "It's nerf or nothing! ... Although, this one doesn't look too safe."
+ if(BB)
+ BB.icon_state = "foamdart_empty"
+ else
+ icon_state = initial(icon_state)
+ desc = "It's nerf or nothing! Ages 8 and up."
+ if(BB)
+ BB.icon_state = initial(BB.icon_state)
+
+
+/obj/item/ammo_casing/caseless/foam_dart/attackby(obj/item/A, mob/user, params)
+ var/obj/item/projectile/bullet/reusable/foam_dart/FD = BB
+ if (istype(A, /obj/item/screwdriver) && !modified)
+ modified = 1
+ FD.modified = 1
+ FD.damage_type = BRUTE
+ to_chat(user, "You pop the safety cap off [src]. ")
+ update_icon()
+ else if (istype(A, /obj/item/pen))
+ if(modified)
+ if(!FD.pen)
+ if(!user.transferItemToLoc(A, FD))
+ return
+ FD.pen = A
+ FD.damage = 5
+ FD.nodamage = 0
+ to_chat(user, "You insert [A] into [src]. ")
+ else
+ to_chat(user, "There's already something in [src]. ")
+ else
+ to_chat(user, "The safety cap prevents you from inserting [A] into [src]. ")
+ else
+ return ..()
+
+/obj/item/ammo_casing/caseless/foam_dart/attack_self(mob/living/user)
+ var/obj/item/projectile/bullet/reusable/foam_dart/FD = BB
+ if(FD.pen)
+ FD.damage = initial(FD.damage)
+ FD.nodamage = initial(FD.nodamage)
+ user.put_in_hands(FD.pen)
+ to_chat(user, "You remove [FD.pen] from [src]. ")
+ FD.pen = null
+
+/obj/item/ammo_casing/caseless/foam_dart/riot
+ name = "riot foam dart"
+ desc = "Whose smart idea was it to use toys as crowd control? Ages 18 and up."
+ projectile_type = /obj/item/projectile/bullet/reusable/foam_dart/riot
+ icon_state = "foamdart_riot"
diff --git a/code/modules/projectiles/ammunition/caseless/misc.dm b/code/modules/projectiles/ammunition/caseless/misc.dm
new file mode 100644
index 0000000000..fcb491f071
--- /dev/null
+++ b/code/modules/projectiles/ammunition/caseless/misc.dm
@@ -0,0 +1,22 @@
+/obj/item/ammo_casing/caseless/magspear
+ name = "magnetic spear"
+ desc = "A reusable spear that is typically loaded into kinetic spearguns."
+ projectile_type = /obj/item/projectile/bullet/reusable/magspear
+ caliber = "speargun"
+ icon_state = "magspear"
+ throwforce = 15 //still deadly when thrown
+ throw_speed = 3
+
+/obj/item/ammo_casing/caseless/laser
+ name = "laser casing"
+ desc = "You shouldn't be seeing this."
+ caliber = "laser"
+ icon_state = "s-casing-live"
+ projectile_type = /obj/item/projectile/beam
+ fire_sound = 'sound/weapons/laser.ogg'
+ firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/energy
+
+/obj/item/ammo_casing/caseless/laser/gatling
+ projectile_type = /obj/item/projectile/beam/weak
+ variance = 0.8
+ click_cooldown_override = 1
diff --git a/code/modules/projectiles/ammunition/caseless/rocket.dm b/code/modules/projectiles/ammunition/caseless/rocket.dm
new file mode 100644
index 0000000000..0b74f6ff8c
--- /dev/null
+++ b/code/modules/projectiles/ammunition/caseless/rocket.dm
@@ -0,0 +1,11 @@
+/obj/item/ammo_casing/caseless/a84mm
+ desc = "An 84mm anti-armour rocket."
+ caliber = "84mm"
+ icon_state = "s-casing-live"
+ projectile_type = /obj/item/projectile/bullet/a84mm
+
+/obj/item/ammo_casing/caseless/a75
+ desc = "A .75 bullet casing."
+ caliber = "75"
+ icon_state = "s-casing-live"
+ projectile_type = /obj/item/projectile/bullet/gyro
diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm
deleted file mode 100644
index 96d0fd2e29..0000000000
--- a/code/modules/projectiles/ammunition/energy.dm
+++ /dev/null
@@ -1,258 +0,0 @@
-/obj/item/ammo_casing/energy
- name = "energy weapon lens"
- desc = "The part of the gun that makes the laser go pew."
- caliber = "energy"
- projectile_type = /obj/item/projectile/energy
- var/e_cost = 100 //The amount of energy a cell needs to expend to create this shot.
- var/select_name = "energy"
- fire_sound = 'sound/weapons/laser.ogg'
- firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/energy
- heavy_metal = FALSE
-
-/obj/item/ammo_casing/energy/chameleon
- projectile_type = /obj/item/projectile/energy/chameleon
- e_cost = 0
- var/hitscan_mode = FALSE
- var/list/projectile_vars = list()
-
-/obj/item/ammo_casing/energy/chameleon/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
- . = ..()
- if(!BB)
- newshot()
- for(var/V in projectile_vars)
- if(BB.vars.Find(V))
- BB.vars[V] = projectile_vars[V]
- if(hitscan_mode)
- BB.hitscan = TRUE
-
-/obj/item/ammo_casing/energy/laser
- projectile_type = /obj/item/projectile/beam/laser
- select_name = "kill"
-
-/obj/item/ammo_casing/energy/lasergun
- projectile_type = /obj/item/projectile/beam/laser
- e_cost = 83
- select_name = "kill"
-
-/obj/item/ammo_casing/energy/lasergun/old
- projectile_type = /obj/item/projectile/beam/laser
- e_cost = 200
- select_name = "kill"
-
-/obj/item/ammo_casing/energy/laser/hos
- e_cost = 100
-
-/obj/item/ammo_casing/energy/laser/practice
- projectile_type = /obj/item/projectile/beam/practice
- select_name = "practice"
-
-/obj/item/ammo_casing/energy/laser/scatter
- projectile_type = /obj/item/projectile/beam/scatter
- pellets = 5
- variance = 25
- select_name = "scatter"
-
-/obj/item/ammo_casing/energy/laser/scatter/disabler
- projectile_type = /obj/item/projectile/beam/disabler
- pellets = 3
- variance = 15
-
-/obj/item/ammo_casing/energy/laser/heavy
- projectile_type = /obj/item/projectile/beam/laser/heavylaser
- select_name = "anti-vehicle"
- fire_sound = 'sound/weapons/lasercannonfire.ogg'
-
-/obj/item/ammo_casing/energy/laser/pulse
- projectile_type = /obj/item/projectile/beam/pulse
- e_cost = 200
- select_name = "DESTROY"
- fire_sound = 'sound/weapons/pulse.ogg'
-
-/obj/item/ammo_casing/energy/laser/bluetag
- projectile_type = /obj/item/projectile/beam/lasertag/bluetag
- select_name = "bluetag"
-
-/obj/item/ammo_casing/energy/laser/bluetag/hitscan
- projectile_type = /obj/item/projectile/beam/lasertag/bluetag/hitscan
-
-/obj/item/ammo_casing/energy/laser/redtag
- projectile_type = /obj/item/projectile/beam/lasertag/redtag
- select_name = "redtag"
-
-/obj/item/ammo_casing/energy/laser/redtag/hitscan
- projectile_type = /obj/item/projectile/beam/lasertag/redtag/hitscan
-
-/obj/item/ammo_casing/energy/xray
- projectile_type = /obj/item/projectile/beam/xray
- e_cost = 50
- fire_sound = 'sound/weapons/laser3.ogg'
-
-/obj/item/ammo_casing/energy/electrode
- projectile_type = /obj/item/projectile/energy/electrode
- select_name = "stun"
- fire_sound = 'sound/weapons/taser.ogg'
- e_cost = 200
-
-/obj/item/ammo_casing/energy/electrode/spec
- e_cost = 100
-
-/obj/item/ammo_casing/energy/electrode/gun
- fire_sound = 'sound/weapons/gunshot.ogg'
- e_cost = 100
-
-/obj/item/ammo_casing/energy/electrode/hos
- e_cost = 200
-
-/obj/item/ammo_casing/energy/electrode/old
- e_cost = 1000
-
-/obj/item/ammo_casing/energy/ion
- projectile_type = /obj/item/projectile/ion
- select_name = "ion"
- fire_sound = 'sound/weapons/ionrifle.ogg'
-
-/obj/item/ammo_casing/energy/declone
- projectile_type = /obj/item/projectile/energy/declone
- select_name = "declone"
- fire_sound = 'sound/weapons/pulse3.ogg'
-
-/obj/item/ammo_casing/energy/mindflayer
- projectile_type = /obj/item/projectile/beam/mindflayer
- select_name = "MINDFUCK"
- fire_sound = 'sound/weapons/laser.ogg'
-
-/obj/item/ammo_casing/energy/flora
- fire_sound = 'sound/effects/stealthoff.ogg'
-
-/obj/item/ammo_casing/energy/flora/yield
- projectile_type = /obj/item/projectile/energy/florayield
- select_name = "yield"
-
-/obj/item/ammo_casing/energy/flora/mut
- projectile_type = /obj/item/projectile/energy/floramut
- select_name = "mutation"
-
-/obj/item/ammo_casing/energy/temp
- projectile_type = /obj/item/projectile/temp
- select_name = "freeze"
- e_cost = 250
- fire_sound = 'sound/weapons/pulse3.ogg'
-
-/obj/item/ammo_casing/energy/temp/hot
- projectile_type = /obj/item/projectile/temp/hot
- select_name = "bake"
-
-/obj/item/ammo_casing/energy/meteor
- projectile_type = /obj/item/projectile/meteor
- select_name = "goddamn meteor"
-
-/obj/item/ammo_casing/energy/disabler
- projectile_type = /obj/item/projectile/beam/disabler
- select_name = "disable"
- e_cost = 50
- fire_sound = 'sound/weapons/taser2.ogg'
-
-/obj/item/ammo_casing/energy/plasma
- projectile_type = /obj/item/projectile/plasma
- select_name = "plasma burst"
- fire_sound = 'sound/weapons/plasma_cutter.ogg'
- delay = 15
- e_cost = 25
-
-/obj/item/ammo_casing/energy/plasma/adv
- projectile_type = /obj/item/projectile/plasma/adv
- delay = 10
- e_cost = 10
-
-/obj/item/ammo_casing/energy/wormhole
- projectile_type = /obj/item/projectile/beam/wormhole
- e_cost = 0
- fire_sound = 'sound/weapons/pulse3.ogg'
- var/obj/item/gun/energy/wormhole_projector/gun = null
- select_name = "blue"
-
-/obj/item/ammo_casing/energy/wormhole/orange
- projectile_type = /obj/item/projectile/beam/wormhole/orange
- select_name = "orange"
-
-/obj/item/ammo_casing/energy/bolt
- projectile_type = /obj/item/projectile/energy/bolt
- select_name = "bolt"
- e_cost = 500
- fire_sound = 'sound/weapons/genhit.ogg'
-
-/obj/item/ammo_casing/energy/bolt/halloween
- projectile_type = /obj/item/projectile/energy/bolt/halloween
-
-/obj/item/ammo_casing/energy/bolt/large
- projectile_type = /obj/item/projectile/energy/bolt/large
- select_name = "heavy bolt"
-
-/obj/item/ammo_casing/energy/net
- projectile_type = /obj/item/projectile/energy/net
- select_name = "netting"
- pellets = 6
- variance = 40
-
-/obj/item/ammo_casing/energy/trap
- projectile_type = /obj/item/projectile/energy/trap
- select_name = "snare"
-
-/obj/item/ammo_casing/energy/instakill
- projectile_type = /obj/item/projectile/beam/instakill
- e_cost = 0
- select_name = "DESTROY"
-
-/obj/item/ammo_casing/energy/instakill/blue
- projectile_type = /obj/item/projectile/beam/instakill/blue
-
-/obj/item/ammo_casing/energy/instakill/red
- projectile_type = /obj/item/projectile/beam/instakill/red
-
-/obj/item/ammo_casing/energy/tesla_revolver
- fire_sound = 'sound/magic/lightningbolt.ogg'
- e_cost = 200
- select_name = "stun"
- projectile_type = /obj/item/projectile/energy/tesla/revolver
-
-/obj/item/ammo_casing/energy/gravityrepulse
- projectile_type = /obj/item/projectile/gravityrepulse
- e_cost = 0
- fire_sound = 'sound/weapons/wave.ogg'
- select_name = "repulse"
- delay = 50
- var/obj/item/gun/energy/gravity_gun/gun = null
-
-/obj/item/ammo_casing/energy/gravityrepulse/New(var/obj/item/gun/energy/gravity_gun/G)
- gun = G
-
-/obj/item/ammo_casing/energy/gravityattract
- projectile_type = /obj/item/projectile/gravityattract
- e_cost = 0
- fire_sound = 'sound/weapons/wave.ogg'
- select_name = "attract"
- delay = 50
- var/obj/item/gun/energy/gravity_gun/gun = null
-
-
-/obj/item/ammo_casing/energy/gravityattract/New(var/obj/item/gun/energy/gravity_gun/G)
- gun = G
-
-/obj/item/ammo_casing/energy/gravitychaos
- projectile_type = /obj/item/projectile/gravitychaos
- e_cost = 0
- fire_sound = 'sound/weapons/wave.ogg'
- select_name = "chaos"
- delay = 50
- var/obj/item/gun/energy/gravity_gun/gun = null
-
-/obj/item/ammo_casing/energy/gravitychaos/New(var/obj/item/gun/energy/gravity_gun/G)
- gun = G
-
-/obj/item/ammo_casing/energy/plasma
- projectile_type = /obj/item/projectile/plasma
- select_name = "plasma burst"
- fire_sound = 'sound/weapons/pulse.ogg'
-
-/obj/item/ammo_casing/energy/plasma/adv
- projectile_type = /obj/item/projectile/plasma/adv
diff --git a/code/modules/projectiles/ammunition/energy/_energy.dm b/code/modules/projectiles/ammunition/energy/_energy.dm
new file mode 100644
index 0000000000..3a4e457c3d
--- /dev/null
+++ b/code/modules/projectiles/ammunition/energy/_energy.dm
@@ -0,0 +1,10 @@
+/obj/item/ammo_casing/energy
+ name = "energy weapon lens"
+ desc = "The part of the gun that makes the laser go pew."
+ caliber = "energy"
+ projectile_type = /obj/item/projectile/energy
+ var/e_cost = 100 //The amount of energy a cell needs to expend to create this shot.
+ var/select_name = "energy"
+ fire_sound = 'sound/weapons/laser.ogg'
+ firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/energy
+ heavy_metal = FALSE
diff --git a/code/modules/projectiles/ammunition/energy/chameleon.dm b/code/modules/projectiles/ammunition/energy/chameleon.dm
new file mode 100644
index 0000000000..b47b6c4e5e
--- /dev/null
+++ b/code/modules/projectiles/ammunition/energy/chameleon.dm
@@ -0,0 +1,15 @@
+/obj/item/ammo_casing/energy/chameleon
+ projectile_type = /obj/item/projectile/energy/chameleon
+ e_cost = 0
+ var/hitscan_mode = FALSE
+ var/list/projectile_vars = list()
+
+/obj/item/ammo_casing/energy/chameleon/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
+ . = ..()
+ if(!BB)
+ newshot()
+ for(var/V in projectile_vars)
+ if(BB.vars.Find(V))
+ BB.vv_edit_var(V, projectile_vars[V])
+ if(hitscan_mode)
+ BB.hitscan = TRUE
diff --git a/code/modules/projectiles/ammunition/energy/ebow.dm b/code/modules/projectiles/ammunition/energy/ebow.dm
new file mode 100644
index 0000000000..8d9c72d1ba
--- /dev/null
+++ b/code/modules/projectiles/ammunition/energy/ebow.dm
@@ -0,0 +1,12 @@
+/obj/item/ammo_casing/energy/bolt
+ projectile_type = /obj/item/projectile/energy/bolt
+ select_name = "bolt"
+ e_cost = 500
+ fire_sound = 'sound/weapons/genhit.ogg'
+
+/obj/item/ammo_casing/energy/bolt/halloween
+ projectile_type = /obj/item/projectile/energy/bolt/halloween
+
+/obj/item/ammo_casing/energy/bolt/large
+ projectile_type = /obj/item/projectile/energy/bolt/large
+ select_name = "heavy bolt"
diff --git a/code/modules/projectiles/ammunition/energy/gravity.dm b/code/modules/projectiles/ammunition/energy/gravity.dm
new file mode 100644
index 0000000000..f549a5b5e4
--- /dev/null
+++ b/code/modules/projectiles/ammunition/energy/gravity.dm
@@ -0,0 +1,36 @@
+/obj/item/ammo_casing/energy/gravityrepulse
+ projectile_type = /obj/item/projectile/gravityrepulse
+ e_cost = 0
+ fire_sound = 'sound/weapons/wave.ogg'
+ select_name = "repulse"
+ delay = 50
+ var/obj/item/gun/energy/gravity_gun/gun
+
+/obj/item/ammo_casing/energy/gravityrepulse/Initialize(mapload, obj/item/gun/energy/gravity_gun/G)
+ . = ..()
+ gun = G
+
+/obj/item/ammo_casing/energy/gravityattract
+ projectile_type = /obj/item/projectile/gravityattract
+ e_cost = 0
+ fire_sound = 'sound/weapons/wave.ogg'
+ select_name = "attract"
+ delay = 50
+ var/obj/item/gun/energy/gravity_gun/gun
+
+
+/obj/item/ammo_casing/energy/gravityattract/Initialize(mapload, obj/item/gun/energy/gravity_gun/G)
+ . = ..()
+ gun = G
+
+/obj/item/ammo_casing/energy/gravitychaos
+ projectile_type = /obj/item/projectile/gravitychaos
+ e_cost = 0
+ fire_sound = 'sound/weapons/wave.ogg'
+ select_name = "chaos"
+ delay = 50
+ var/obj/item/gun/energy/gravity_gun/gun
+
+/obj/item/ammo_casing/energy/gravitychaos/Initialize(mapload, obj/item/gun/energy/gravity_gun/G)
+ . = ..()
+ gun = G
diff --git a/code/modules/projectiles/ammunition/energy/laser.dm b/code/modules/projectiles/ammunition/energy/laser.dm
new file mode 100644
index 0000000000..c87ea2ffbd
--- /dev/null
+++ b/code/modules/projectiles/ammunition/energy/laser.dm
@@ -0,0 +1,66 @@
+/obj/item/ammo_casing/energy/laser
+ projectile_type = /obj/item/projectile/beam/laser
+ select_name = "kill"
+
+/obj/item/ammo_casing/energy/lasergun
+ projectile_type = /obj/item/projectile/beam/laser
+ e_cost = 83
+ select_name = "kill"
+
+/obj/item/ammo_casing/energy/lasergun/old
+ projectile_type = /obj/item/projectile/beam/laser
+ e_cost = 200
+ select_name = "kill"
+
+/obj/item/ammo_casing/energy/laser/hos
+ e_cost = 100
+
+/obj/item/ammo_casing/energy/laser/practice
+ projectile_type = /obj/item/projectile/beam/practice
+ select_name = "practice"
+
+/obj/item/ammo_casing/energy/laser/scatter
+ projectile_type = /obj/item/projectile/beam/scatter
+ pellets = 5
+ variance = 25
+ select_name = "scatter"
+
+/obj/item/ammo_casing/energy/laser/scatter/disabler
+ projectile_type = /obj/item/projectile/beam/disabler
+ pellets = 3
+ variance = 15
+
+/obj/item/ammo_casing/energy/laser/heavy
+ projectile_type = /obj/item/projectile/beam/laser/heavylaser
+ select_name = "anti-vehicle"
+ fire_sound = 'sound/weapons/lasercannonfire.ogg'
+
+/obj/item/ammo_casing/energy/laser/pulse
+ projectile_type = /obj/item/projectile/beam/pulse
+ e_cost = 200
+ select_name = "DESTROY"
+ fire_sound = 'sound/weapons/pulse.ogg'
+
+/obj/item/ammo_casing/energy/laser/bluetag
+ projectile_type = /obj/item/projectile/beam/lasertag/bluetag
+ select_name = "bluetag"
+
+/obj/item/ammo_casing/energy/laser/bluetag/hitscan
+ projectile_type = /obj/item/projectile/beam/lasertag/bluetag/hitscan
+
+/obj/item/ammo_casing/energy/laser/redtag
+ projectile_type = /obj/item/projectile/beam/lasertag/redtag
+ select_name = "redtag"
+
+/obj/item/ammo_casing/energy/laser/redtag/hitscan
+ projectile_type = /obj/item/projectile/beam/lasertag/redtag/hitscan
+
+/obj/item/ammo_casing/energy/xray
+ projectile_type = /obj/item/projectile/beam/xray
+ e_cost = 50
+ fire_sound = 'sound/weapons/laser3.ogg'
+
+/obj/item/ammo_casing/energy/mindflayer
+ projectile_type = /obj/item/projectile/beam/mindflayer
+ select_name = "MINDFUCK"
+ fire_sound = 'sound/weapons/laser.ogg'
diff --git a/code/modules/projectiles/ammunition/energy/lmg.dm b/code/modules/projectiles/ammunition/energy/lmg.dm
new file mode 100644
index 0000000000..5ebe83f792
--- /dev/null
+++ b/code/modules/projectiles/ammunition/energy/lmg.dm
@@ -0,0 +1,6 @@
+/obj/item/ammo_casing/energy/c3dbullet
+ projectile_type = /obj/item/projectile/bullet/c3d
+ select_name = "spraydown"
+ fire_sound = 'sound/weapons/gunshot_smg.ogg'
+ e_cost = 20
+ firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect
diff --git a/code/modules/projectiles/ammunition/energy/plasma.dm b/code/modules/projectiles/ammunition/energy/plasma.dm
new file mode 100644
index 0000000000..d02abf9c88
--- /dev/null
+++ b/code/modules/projectiles/ammunition/energy/plasma.dm
@@ -0,0 +1,11 @@
+/obj/item/ammo_casing/energy/plasma
+ projectile_type = /obj/item/projectile/plasma
+ select_name = "plasma burst"
+ fire_sound = 'sound/weapons/plasma_cutter.ogg'
+ delay = 15
+ e_cost = 25
+
+/obj/item/ammo_casing/energy/plasma/adv
+ projectile_type = /obj/item/projectile/plasma/adv
+ delay = 10
+ e_cost = 10
diff --git a/code/modules/projectiles/ammunition/plasma.dm b/code/modules/projectiles/ammunition/energy/plasma_cit.dm
similarity index 100%
rename from code/modules/projectiles/ammunition/plasma.dm
rename to code/modules/projectiles/ammunition/energy/plasma_cit.dm
diff --git a/code/modules/projectiles/ammunition/energy/portal.dm b/code/modules/projectiles/ammunition/energy/portal.dm
new file mode 100644
index 0000000000..3a6300a2f5
--- /dev/null
+++ b/code/modules/projectiles/ammunition/energy/portal.dm
@@ -0,0 +1,14 @@
+/obj/item/ammo_casing/energy/wormhole
+ projectile_type = /obj/item/projectile/beam/wormhole
+ e_cost = 0
+ fire_sound = 'sound/weapons/pulse3.ogg'
+ var/obj/item/gun/energy/wormhole_projector/gun = null
+ select_name = "blue"
+
+/obj/item/ammo_casing/energy/wormhole/orange
+ projectile_type = /obj/item/projectile/beam/wormhole/orange
+ select_name = "orange"
+
+/obj/item/ammo_casing/energy/wormhole/Initialize(mapload, obj/item/gun/energy/wormhole_projector/wh)
+ . = ..()
+ gun = wh
diff --git a/code/modules/projectiles/ammunition/energy/special.dm b/code/modules/projectiles/ammunition/energy/special.dm
new file mode 100644
index 0000000000..0438baf490
--- /dev/null
+++ b/code/modules/projectiles/ammunition/energy/special.dm
@@ -0,0 +1,61 @@
+/obj/item/ammo_casing/energy/ion
+ projectile_type = /obj/item/projectile/ion
+ select_name = "ion"
+ fire_sound = 'sound/weapons/ionrifle.ogg'
+
+/obj/item/ammo_casing/energy/declone
+ projectile_type = /obj/item/projectile/energy/declone
+ select_name = "declone"
+ fire_sound = 'sound/weapons/pulse3.ogg'
+
+/obj/item/ammo_casing/energy/flora
+ fire_sound = 'sound/effects/stealthoff.ogg'
+
+/obj/item/ammo_casing/energy/flora/yield
+ projectile_type = /obj/item/projectile/energy/florayield
+ select_name = "yield"
+
+/obj/item/ammo_casing/energy/flora/mut
+ projectile_type = /obj/item/projectile/energy/floramut
+ select_name = "mutation"
+
+/obj/item/ammo_casing/energy/temp
+ projectile_type = /obj/item/projectile/temp
+ select_name = "freeze"
+ e_cost = 250
+ fire_sound = 'sound/weapons/pulse3.ogg'
+
+/obj/item/ammo_casing/energy/temp/hot
+ projectile_type = /obj/item/projectile/temp/hot
+ select_name = "bake"
+
+/obj/item/ammo_casing/energy/meteor
+ projectile_type = /obj/item/projectile/meteor
+ select_name = "goddamn meteor"
+
+/obj/item/ammo_casing/energy/net
+ projectile_type = /obj/item/projectile/energy/net
+ select_name = "netting"
+ pellets = 6
+ variance = 40
+
+/obj/item/ammo_casing/energy/trap
+ projectile_type = /obj/item/projectile/energy/trap
+ select_name = "snare"
+
+/obj/item/ammo_casing/energy/instakill
+ projectile_type = /obj/item/projectile/beam/instakill
+ e_cost = 0
+ select_name = "DESTROY"
+
+/obj/item/ammo_casing/energy/instakill/blue
+ projectile_type = /obj/item/projectile/beam/instakill/blue
+
+/obj/item/ammo_casing/energy/instakill/red
+ projectile_type = /obj/item/projectile/beam/instakill/red
+
+/obj/item/ammo_casing/energy/tesla_revolver
+ fire_sound = 'sound/magic/lightningbolt.ogg'
+ e_cost = 200
+ select_name = "stun"
+ projectile_type = /obj/item/projectile/energy/tesla/revolver
diff --git a/code/modules/projectiles/ammunition/energy/stun.dm b/code/modules/projectiles/ammunition/energy/stun.dm
new file mode 100644
index 0000000000..5a88a97b08
--- /dev/null
+++ b/code/modules/projectiles/ammunition/energy/stun.dm
@@ -0,0 +1,24 @@
+/obj/item/ammo_casing/energy/electrode
+ projectile_type = /obj/item/projectile/energy/electrode
+ select_name = "stun"
+ fire_sound = 'sound/weapons/taser.ogg'
+ e_cost = 200
+
+/obj/item/ammo_casing/energy/electrode/spec
+ e_cost = 100
+
+/obj/item/ammo_casing/energy/electrode/gun
+ fire_sound = 'sound/weapons/gunshot.ogg'
+ e_cost = 100
+
+/obj/item/ammo_casing/energy/electrode/hos
+ e_cost = 200
+
+/obj/item/ammo_casing/energy/electrode/old
+ e_cost = 1000
+
+/obj/item/ammo_casing/energy/disabler
+ projectile_type = /obj/item/projectile/beam/disabler
+ select_name = "disable"
+ e_cost = 50
+ fire_sound = 'sound/weapons/taser2.ogg'
diff --git a/code/modules/projectiles/ammunition/special/magic.dm b/code/modules/projectiles/ammunition/special/magic.dm
new file mode 100644
index 0000000000..6ebf5739a9
--- /dev/null
+++ b/code/modules/projectiles/ammunition/special/magic.dm
@@ -0,0 +1,42 @@
+/obj/item/ammo_casing/magic
+ name = "magic casing"
+ desc = "I didn't even know magic needed ammo..."
+ projectile_type = /obj/item/projectile/magic
+ firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/magic
+ heavy_metal = FALSE
+
+/obj/item/ammo_casing/magic/change
+ projectile_type = /obj/item/projectile/magic/change
+
+/obj/item/ammo_casing/magic/animate
+ projectile_type = /obj/item/projectile/magic/animate
+
+/obj/item/ammo_casing/magic/heal
+ projectile_type = /obj/item/projectile/magic/resurrection
+
+/obj/item/ammo_casing/magic/death
+ projectile_type = /obj/item/projectile/magic/death
+
+/obj/item/ammo_casing/magic/teleport
+ projectile_type = /obj/item/projectile/magic/teleport
+
+/obj/item/ammo_casing/magic/door
+ projectile_type = /obj/item/projectile/magic/door
+
+/obj/item/ammo_casing/magic/fireball
+ projectile_type = /obj/item/projectile/magic/aoe/fireball
+
+/obj/item/ammo_casing/magic/chaos
+ projectile_type = /obj/item/projectile/magic
+
+/obj/item/ammo_casing/magic/spellblade
+ projectile_type = /obj/item/projectile/magic/spellblade
+
+/obj/item/ammo_casing/magic/arcane_barrage
+ projectile_type = /obj/item/projectile/magic/arcane_barrage
+
+/obj/item/ammo_casing/magic/chaos/newshot()
+ ..()
+
+/obj/item/ammo_casing/magic/honk
+ projectile_type = /obj/item/projectile/bullet/honker
diff --git a/code/modules/projectiles/ammunition/special.dm b/code/modules/projectiles/ammunition/special/syringe.dm
similarity index 53%
rename from code/modules/projectiles/ammunition/special.dm
rename to code/modules/projectiles/ammunition/special/syringe.dm
index b378d7fa6c..4a2a354ca6 100644
--- a/code/modules/projectiles/ammunition/special.dm
+++ b/code/modules/projectiles/ammunition/special/syringe.dm
@@ -1,111 +1,61 @@
-/obj/item/ammo_casing/magic
- name = "magic casing"
- desc = "I didn't even know magic needed ammo..."
- projectile_type = /obj/item/projectile/magic
- firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/magic
- heavy_metal = FALSE
-
-/obj/item/ammo_casing/magic/change
- projectile_type = /obj/item/projectile/magic/change
-
-/obj/item/ammo_casing/magic/animate
- projectile_type = /obj/item/projectile/magic/animate
-
-/obj/item/ammo_casing/magic/heal
- projectile_type = /obj/item/projectile/magic/resurrection
-
-/obj/item/ammo_casing/magic/death
- projectile_type = /obj/item/projectile/magic/death
-
-/obj/item/ammo_casing/magic/teleport
- projectile_type = /obj/item/projectile/magic/teleport
-
-/obj/item/ammo_casing/magic/door
- projectile_type = /obj/item/projectile/magic/door
-
-/obj/item/ammo_casing/magic/fireball
- projectile_type = /obj/item/projectile/magic/aoe/fireball
-
-/obj/item/ammo_casing/magic/chaos
- projectile_type = /obj/item/projectile/magic
-
-/obj/item/ammo_casing/magic/spellblade
- projectile_type = /obj/item/projectile/magic/spellblade
-
-/obj/item/ammo_casing/magic/arcane_barrage
- projectile_type = /obj/item/projectile/magic/arcane_barrage
-
-/obj/item/ammo_casing/magic/chaos/newshot()
- ..()
-
-/obj/item/ammo_casing/magic/honk
- projectile_type = /obj/item/projectile/bullet/honker
-
-/obj/item/ammo_casing/syringegun
- name = "syringe gun spring"
- desc = "A high-power spring that throws syringes."
- projectile_type = /obj/item/projectile/bullet/dart/syringe
- firing_effect_type = null
-
-/obj/item/ammo_casing/syringegun/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
- if(!BB)
- return
- if(istype(loc, /obj/item/gun/syringe))
- var/obj/item/gun/syringe/SG = loc
- if(!SG.syringes.len)
- return
-
- var/obj/item/reagent_containers/syringe/S = SG.syringes[1]
-
- S.reagents.trans_to(BB, S.reagents.total_volume)
- BB.name = S.name
- var/obj/item/projectile/bullet/dart/D = BB
- D.piercing = S.proj_piercing
- SG.syringes.Remove(S)
- qdel(S)
- ..()
-
-/obj/item/ammo_casing/chemgun
- name = "dart synthesiser"
- desc = "A high-power spring, linked to an energy-based dart synthesiser."
- projectile_type = /obj/item/projectile/bullet/dart
- firing_effect_type = null
-
-/obj/item/ammo_casing/chemgun/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
- if(!BB)
- return
- if(istype(loc, /obj/item/gun/chem))
- var/obj/item/gun/chem/CG = loc
- if(CG.syringes_left <= 0)
- return
- CG.reagents.trans_to(BB, 15)
- BB.name = "chemical dart"
- CG.syringes_left--
- ..()
-
-/obj/item/ammo_casing/dnainjector
- name = "rigged syringe gun spring"
- desc = "A high-power spring that throws DNA injectors."
- projectile_type = /obj/item/projectile/bullet/dnainjector
- firing_effect_type = null
-
-/obj/item/ammo_casing/dnainjector/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
- if(!BB)
- return
- if(istype(loc, /obj/item/gun/syringe/dna))
- var/obj/item/gun/syringe/dna/SG = loc
- if(!SG.syringes.len)
- return
-
- var/obj/item/dnainjector/S = popleft(SG.syringes)
- var/obj/item/projectile/bullet/dnainjector/D = BB
- S.forceMove(D)
- D.injector = S
- ..()
-
-/obj/item/ammo_casing/energy/c3dbullet
- projectile_type = /obj/item/projectile/bullet/c3d
- select_name = "spraydown"
- fire_sound = 'sound/weapons/gunshot_smg.ogg'
- e_cost = 20
- firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect
+/obj/item/ammo_casing/syringegun
+ name = "syringe gun spring"
+ desc = "A high-power spring that throws syringes."
+ projectile_type = /obj/item/projectile/bullet/dart/syringe
+ firing_effect_type = null
+
+/obj/item/ammo_casing/syringegun/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
+ if(!BB)
+ return
+ if(istype(loc, /obj/item/gun/syringe))
+ var/obj/item/gun/syringe/SG = loc
+ if(!SG.syringes.len)
+ return
+
+ var/obj/item/reagent_containers/syringe/S = SG.syringes[1]
+
+ S.reagents.trans_to(BB, S.reagents.total_volume)
+ BB.name = S.name
+ var/obj/item/projectile/bullet/dart/D = BB
+ D.piercing = S.proj_piercing
+ SG.syringes.Remove(S)
+ qdel(S)
+ ..()
+
+/obj/item/ammo_casing/chemgun
+ name = "dart synthesiser"
+ desc = "A high-power spring, linked to an energy-based dart synthesiser."
+ projectile_type = /obj/item/projectile/bullet/dart
+ firing_effect_type = null
+
+/obj/item/ammo_casing/chemgun/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
+ if(!BB)
+ return
+ if(istype(loc, /obj/item/gun/chem))
+ var/obj/item/gun/chem/CG = loc
+ if(CG.syringes_left <= 0)
+ return
+ CG.reagents.trans_to(BB, 15)
+ BB.name = "chemical dart"
+ CG.syringes_left--
+ ..()
+
+/obj/item/ammo_casing/dnainjector
+ name = "rigged syringe gun spring"
+ desc = "A high-power spring that throws DNA injectors."
+ projectile_type = /obj/item/projectile/bullet/dnainjector
+ firing_effect_type = null
+
+/obj/item/ammo_casing/dnainjector/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
+ if(!BB)
+ return
+ if(istype(loc, /obj/item/gun/syringe/dna))
+ var/obj/item/gun/syringe/dna/SG = loc
+ if(!SG.syringes.len)
+ return
+
+ var/obj/item/dnainjector/S = popleft(SG.syringes)
+ var/obj/item/projectile/bullet/dnainjector/D = BB
+ S.forceMove(D)
+ D.injector = S
+ ..()
diff --git a/code/modules/projectiles/box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm
similarity index 96%
rename from code/modules/projectiles/box_magazine.dm
rename to code/modules/projectiles/boxes_magazines/_box_magazine.dm
index 57860e7910..1c5a2b1199 100644
--- a/code/modules/projectiles/box_magazine.dm
+++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm
@@ -1,121 +1,121 @@
-//Boxes of ammo
-/obj/item/ammo_box
- name = "ammo box (null_reference_exception)"
- desc = "A box of ammo."
- icon_state = "357"
- icon = 'icons/obj/ammo.dmi'
- flags_1 = CONDUCT_1
- slot_flags = SLOT_BELT
- item_state = "syringe_kit"
- lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
- materials = list(MAT_METAL=30000)
- throwforce = 2
- w_class = WEIGHT_CLASS_TINY
- throw_speed = 3
- throw_range = 7
- var/list/stored_ammo = list()
- var/ammo_type = /obj/item/ammo_casing
- var/max_ammo = 7
- var/multiple_sprites = 0
- var/caliber
- var/multiload = 1
- var/start_empty = 0
-
-/obj/item/ammo_box/Initialize()
- . = ..()
- if(!start_empty)
- for(var/i = 1, i <= max_ammo, i++)
- stored_ammo += new ammo_type(src)
- update_icon()
-
-/obj/item/ammo_box/proc/get_round(keep = 0)
- if (!stored_ammo.len)
- return null
- else
- var/b = stored_ammo[stored_ammo.len]
- stored_ammo -= b
- if (keep)
- stored_ammo.Insert(1,b)
- return b
-
-/obj/item/ammo_box/proc/give_round(obj/item/ammo_casing/R, replace_spent = 0)
- // Boxes don't have a caliber type, magazines do. Not sure if it's intended or not, but if we fail to find a caliber, then we fall back to ammo_type.
- if(!R || (caliber && R.caliber != caliber) || (!caliber && R.type != ammo_type))
- return 0
-
- if (stored_ammo.len < max_ammo)
- stored_ammo += R
- R.forceMove(src)
- return 1
-
- //for accessibles magazines (e.g internal ones) when full, start replacing spent ammo
- else if(replace_spent)
- for(var/obj/item/ammo_casing/AC in stored_ammo)
- if(!AC.BB)//found a spent ammo
- stored_ammo -= AC
- AC.forceMove(get_turf(src.loc))
-
- stored_ammo += R
- R.forceMove(src)
- return 1
-
- return 0
-
-/obj/item/ammo_box/proc/can_load(mob/user)
- return 1
-
-/obj/item/ammo_box/attackby(obj/item/A, mob/user, params, silent = FALSE, replace_spent = 0)
- var/num_loaded = 0
- if(!can_load(user))
- return
- if(istype(A, /obj/item/ammo_box))
- var/obj/item/ammo_box/AM = A
- for(var/obj/item/ammo_casing/AC in AM.stored_ammo)
- var/did_load = give_round(AC, replace_spent)
- if(did_load)
- AM.stored_ammo -= AC
- num_loaded++
- if(!did_load || !multiload)
- break
- if(istype(A, /obj/item/ammo_casing))
- var/obj/item/ammo_casing/AC = A
- if(give_round(AC, replace_spent))
- user.transferItemToLoc(AC, src, TRUE)
- num_loaded++
-
- if(num_loaded)
- if(!silent)
- to_chat(user, "You load [num_loaded] shell\s into \the [src]! ")
- playsound(src, 'sound/weapons/bulletinsert.ogg', 60, 1)
- A.update_icon()
- update_icon()
-
- return num_loaded
-
-/obj/item/ammo_box/attack_self(mob/user)
- var/obj/item/ammo_casing/A = get_round()
- if(A)
- if(!user.put_in_hands(A))
- A.bounce_away(FALSE, NONE)
- playsound(src, 'sound/weapons/bulletinsert.ogg', 60, 1)
- to_chat(user, "You remove a round from \the [src]! ")
- update_icon()
-
-/obj/item/ammo_box/update_icon()
- switch(multiple_sprites)
- if(1)
- icon_state = "[initial(icon_state)]-[stored_ammo.len]"
- if(2)
- icon_state = "[initial(icon_state)]-[stored_ammo.len ? "[max_ammo]" : "0"]"
- desc = "[initial(desc)] There are [stored_ammo.len] shell\s left!"
-
-//Behavior for magazines
-/obj/item/ammo_box/magazine/proc/ammo_count()
- return stored_ammo.len
-
-/obj/item/ammo_box/magazine/proc/empty_magazine()
- var/turf_mag = get_turf(src)
- for(var/obj/item/ammo in stored_ammo)
- ammo.forceMove(turf_mag)
+//Boxes of ammo
+/obj/item/ammo_box
+ name = "ammo box (null_reference_exception)"
+ desc = "A box of ammo."
+ icon_state = "357"
+ icon = 'icons/obj/ammo.dmi'
+ flags_1 = CONDUCT_1
+ slot_flags = SLOT_BELT
+ item_state = "syringe_kit"
+ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
+ materials = list(MAT_METAL=30000)
+ throwforce = 2
+ w_class = WEIGHT_CLASS_TINY
+ throw_speed = 3
+ throw_range = 7
+ var/list/stored_ammo = list()
+ var/ammo_type = /obj/item/ammo_casing
+ var/max_ammo = 7
+ var/multiple_sprites = 0
+ var/caliber
+ var/multiload = 1
+ var/start_empty = 0
+
+/obj/item/ammo_box/Initialize()
+ . = ..()
+ if(!start_empty)
+ for(var/i = 1, i <= max_ammo, i++)
+ stored_ammo += new ammo_type(src)
+ update_icon()
+
+/obj/item/ammo_box/proc/get_round(keep = 0)
+ if (!stored_ammo.len)
+ return null
+ else
+ var/b = stored_ammo[stored_ammo.len]
+ stored_ammo -= b
+ if (keep)
+ stored_ammo.Insert(1,b)
+ return b
+
+/obj/item/ammo_box/proc/give_round(obj/item/ammo_casing/R, replace_spent = 0)
+ // Boxes don't have a caliber type, magazines do. Not sure if it's intended or not, but if we fail to find a caliber, then we fall back to ammo_type.
+ if(!R || (caliber && R.caliber != caliber) || (!caliber && R.type != ammo_type))
+ return 0
+
+ if (stored_ammo.len < max_ammo)
+ stored_ammo += R
+ R.forceMove(src)
+ return 1
+
+ //for accessibles magazines (e.g internal ones) when full, start replacing spent ammo
+ else if(replace_spent)
+ for(var/obj/item/ammo_casing/AC in stored_ammo)
+ if(!AC.BB)//found a spent ammo
+ stored_ammo -= AC
+ AC.forceMove(get_turf(src.loc))
+
+ stored_ammo += R
+ R.forceMove(src)
+ return 1
+
+ return 0
+
+/obj/item/ammo_box/proc/can_load(mob/user)
+ return 1
+
+/obj/item/ammo_box/attackby(obj/item/A, mob/user, params, silent = FALSE, replace_spent = 0)
+ var/num_loaded = 0
+ if(!can_load(user))
+ return
+ if(istype(A, /obj/item/ammo_box))
+ var/obj/item/ammo_box/AM = A
+ for(var/obj/item/ammo_casing/AC in AM.stored_ammo)
+ var/did_load = give_round(AC, replace_spent)
+ if(did_load)
+ AM.stored_ammo -= AC
+ num_loaded++
+ if(!did_load || !multiload)
+ break
+ if(istype(A, /obj/item/ammo_casing))
+ var/obj/item/ammo_casing/AC = A
+ if(give_round(AC, replace_spent))
+ user.transferItemToLoc(AC, src, TRUE)
+ num_loaded++
+
+ if(num_loaded)
+ if(!silent)
+ to_chat(user, "You load [num_loaded] shell\s into \the [src]! ")
+ playsound(src, 'sound/weapons/bulletinsert.ogg', 60, 1)
+ A.update_icon()
+ update_icon()
+
+ return num_loaded
+
+/obj/item/ammo_box/attack_self(mob/user)
+ var/obj/item/ammo_casing/A = get_round()
+ if(A)
+ if(!user.put_in_hands(A))
+ A.bounce_away(FALSE, NONE)
+ playsound(src, 'sound/weapons/bulletinsert.ogg', 60, 1)
+ to_chat(user, "You remove a round from \the [src]! ")
+ update_icon()
+
+/obj/item/ammo_box/update_icon()
+ switch(multiple_sprites)
+ if(1)
+ icon_state = "[initial(icon_state)]-[stored_ammo.len]"
+ if(2)
+ icon_state = "[initial(icon_state)]-[stored_ammo.len ? "[max_ammo]" : "0"]"
+ desc = "[initial(desc)] There are [stored_ammo.len] shell\s left!"
+
+//Behavior for magazines
+/obj/item/ammo_box/magazine/proc/ammo_count()
+ return stored_ammo.len
+
+/obj/item/ammo_box/magazine/proc/empty_magazine()
+ var/turf_mag = get_turf(src)
+ for(var/obj/item/ammo in stored_ammo)
+ ammo.forceMove(turf_mag)
stored_ammo -= ammo
\ No newline at end of file
diff --git a/code/modules/projectiles/boxes_magazines/external/grenade.dm b/code/modules/projectiles/boxes_magazines/external/grenade.dm
new file mode 100644
index 0000000000..2b3c31f81c
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/external/grenade.dm
@@ -0,0 +1,8 @@
+/obj/item/ammo_box/magazine/m75
+ name = "specialized magazine (.75)"
+ icon_state = "75"
+ ammo_type = /obj/item/ammo_casing/caseless/a75
+ caliber = "75"
+ multiple_sprites = 2
+ max_ammo = 8
+
diff --git a/code/modules/projectiles/boxes_magazines/external/lmg.dm b/code/modules/projectiles/boxes_magazines/external/lmg.dm
new file mode 100644
index 0000000000..cb42989022
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/external/lmg.dm
@@ -0,0 +1,22 @@
+/obj/item/ammo_box/magazine/mm195x129
+ name = "box magazine (1.95x129mm)"
+ icon_state = "a762-50"
+ ammo_type = /obj/item/ammo_casing/mm195x129
+ caliber = "mm195129"
+ max_ammo = 50
+
+/obj/item/ammo_box/magazine/mm195x129/hollow
+ name = "box magazine (Hollow-Point 1.95x129mm)"
+ ammo_type = /obj/item/ammo_casing/mm195x129/hollow
+
+/obj/item/ammo_box/magazine/mm195x129/ap
+ name = "box magazine (Armor Penetrating 1.95x129mm)"
+ ammo_type = /obj/item/ammo_casing/mm195x129/ap
+
+/obj/item/ammo_box/magazine/mm195x129/incen
+ name = "box magazine (Incendiary 1.95x129mm)"
+ ammo_type = /obj/item/ammo_casing/mm195x129/incen
+
+/obj/item/ammo_box/magazine/mm195x129/update_icon()
+ ..()
+ icon_state = "a762-[round(ammo_count(),10)]"
diff --git a/code/modules/projectiles/boxes_magazines/external/pistol.dm b/code/modules/projectiles/boxes_magazines/external/pistol.dm
new file mode 100644
index 0000000000..d70b20c65c
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/external/pistol.dm
@@ -0,0 +1,56 @@
+/obj/item/ammo_box/magazine/m10mm
+ name = "pistol magazine (10mm)"
+ desc = "A gun magazine."
+ icon_state = "9x19p"
+ ammo_type = /obj/item/ammo_casing/c10mm
+ caliber = "10mm"
+ max_ammo = 8
+ multiple_sprites = 2
+
+/obj/item/ammo_box/magazine/m10mm/fire
+ name = "pistol magazine (10mm incendiary)"
+ icon_state = "9x19pI"
+ desc = "A gun magazine. Loaded with rounds which ignite the target."
+ ammo_type = /obj/item/ammo_casing/c10mm/fire
+
+/obj/item/ammo_box/magazine/m10mm/hp
+ name = "pistol magazine (10mm HP)"
+ icon_state = "9x19pH"
+ desc= "A gun magazine. Loaded with hollow-point rounds, extremely effective against unarmored targets, but nearly useless against protective clothing."
+ ammo_type = /obj/item/ammo_casing/c10mm/hp
+
+/obj/item/ammo_box/magazine/m10mm/ap
+ name = "pistol magazine (10mm AP)"
+ icon_state = "9x19pA"
+ desc= "A gun magazine. Loaded with rounds which penetrate armour, but are less effective against normal targets."
+ ammo_type = /obj/item/ammo_casing/c10mm/ap
+
+/obj/item/ammo_box/magazine/m45
+ name = "handgun magazine (.45)"
+ icon_state = "45-8"
+ ammo_type = /obj/item/ammo_casing/c45
+ caliber = ".45"
+ max_ammo = 8
+
+/obj/item/ammo_box/magazine/m45/update_icon()
+ ..()
+ icon_state = "45-[ammo_count() ? "8" : "0"]"
+
+/obj/item/ammo_box/magazine/pistolm9mm
+ name = "pistol magazine (9mm)"
+ icon_state = "9x19p-8"
+ ammo_type = /obj/item/ammo_casing/c9mm
+ caliber = "9mm"
+ max_ammo = 15
+
+/obj/item/ammo_box/magazine/pistolm9mm/update_icon()
+ ..()
+ icon_state = "9x19p-[ammo_count() ? "8" : "0"]"
+
+/obj/item/ammo_box/magazine/m50
+ name = "handgun magazine (.50ae)"
+ icon_state = "50ae"
+ ammo_type = /obj/item/ammo_casing/a50AE
+ caliber = ".50"
+ max_ammo = 7
+ multiple_sprites = 1
diff --git a/code/modules/projectiles/boxes_magazines/external/rechargable.dm b/code/modules/projectiles/boxes_magazines/external/rechargable.dm
new file mode 100644
index 0000000000..c4fb00aa22
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/external/rechargable.dm
@@ -0,0 +1,14 @@
+/obj/item/ammo_box/magazine/recharge
+ name = "power pack"
+ desc = "A rechargeable, detachable battery that serves as a magazine for laser rifles."
+ icon_state = "oldrifle-20"
+ ammo_type = /obj/item/ammo_casing/caseless/laser
+ caliber = "laser"
+ max_ammo = 20
+
+/obj/item/ammo_box/magazine/recharge/update_icon()
+ desc = "[initial(desc)] It has [stored_ammo.len] shot\s left."
+ icon_state = "oldrifle-[round(ammo_count(),4)]"
+
+/obj/item/ammo_box/magazine/recharge/attack_self() //No popping out the "bullets"
+ return
diff --git a/code/modules/projectiles/boxes_magazines/external/rifle.dm b/code/modules/projectiles/boxes_magazines/external/rifle.dm
new file mode 100644
index 0000000000..96e7d377ea
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/external/rifle.dm
@@ -0,0 +1,21 @@
+/obj/item/ammo_box/magazine/m10mm/rifle
+ name = "rifle magazine (10mm)"
+ desc = "A well-worn magazine fitted for the surplus rifle."
+ icon_state = "75-8"
+ ammo_type = /obj/item/ammo_casing/c10mm
+ caliber = "10mm"
+ max_ammo = 10
+
+/obj/item/ammo_box/magazine/m10mm/rifle/update_icon()
+ if(ammo_count())
+ icon_state = "75-8"
+ else
+ icon_state = "75-0"
+
+/obj/item/ammo_box/magazine/m556
+ name = "toploader magazine (5.56mm)"
+ icon_state = "5.56m"
+ ammo_type = /obj/item/ammo_casing/a556
+ caliber = "a556"
+ max_ammo = 30
+ multiple_sprites = 2
diff --git a/code/modules/projectiles/boxes_magazines/external/shotgun.dm b/code/modules/projectiles/boxes_magazines/external/shotgun.dm
new file mode 100644
index 0000000000..dc8d0175ba
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/external/shotgun.dm
@@ -0,0 +1,36 @@
+/obj/item/ammo_box/magazine/m12g
+ name = "shotgun magazine (12g taser slugs)"
+ desc = "A drum magazine."
+ icon_state = "m12gs"
+ ammo_type = /obj/item/ammo_casing/shotgun/stunslug
+ caliber = "shotgun"
+ max_ammo = 8
+
+/obj/item/ammo_box/magazine/m12g/update_icon()
+ ..()
+ icon_state = "[initial(icon_state)]-[CEILING(ammo_count(0)/8, 1)*8]"
+
+/obj/item/ammo_box/magazine/m12g/buckshot
+ name = "shotgun magazine (12g buckshot slugs)"
+ icon_state = "m12gb"
+ ammo_type = /obj/item/ammo_casing/shotgun/buckshot
+
+/obj/item/ammo_box/magazine/m12g/slug
+ name = "shotgun magazine (12g slugs)"
+ icon_state = "m12gb"
+ ammo_type = /obj/item/ammo_casing/shotgun
+
+/obj/item/ammo_box/magazine/m12g/dragon
+ name = "shotgun magazine (12g dragon's breath)"
+ icon_state = "m12gf"
+ ammo_type = /obj/item/ammo_casing/shotgun/dragonsbreath
+
+/obj/item/ammo_box/magazine/m12g/bioterror
+ name = "shotgun magazine (12g bioterror)"
+ icon_state = "m12gt"
+ ammo_type = /obj/item/ammo_casing/shotgun/dart/bioterror
+
+/obj/item/ammo_box/magazine/m12g/meteor
+ name = "shotgun magazine (12g meteor slugs)"
+ icon_state = "m12gbc"
+ ammo_type = /obj/item/ammo_casing/shotgun/meteorslug
diff --git a/code/modules/projectiles/boxes_magazines/external/smg.dm b/code/modules/projectiles/boxes_magazines/external/smg.dm
new file mode 100644
index 0000000000..c6dc004879
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/external/smg.dm
@@ -0,0 +1,76 @@
+/obj/item/ammo_box/magazine/wt550m9
+ name = "wt550 magazine (4.6x30mm)"
+ icon_state = "46x30mmt-20"
+ ammo_type = /obj/item/ammo_casing/c46x30mm
+ caliber = "4.6x30mm"
+ max_ammo = 20
+
+/obj/item/ammo_box/magazine/wt550m9/update_icon()
+ ..()
+ icon_state = "46x30mmt-[round(ammo_count(),4)]"
+
+/obj/item/ammo_box/magazine/wt550m9/wtap
+ name = "wt550 magazine (Armour Piercing 4.6x30mm)"
+ icon_state = "46x30mmtA-20"
+ ammo_type = /obj/item/ammo_casing/c46x30mm/ap
+
+/obj/item/ammo_box/magazine/wt550m9/wtap/update_icon()
+ ..()
+ icon_state = "46x30mmtA-[round(ammo_count(),4)]"
+
+/obj/item/ammo_box/magazine/wt550m9/wtic
+ name = "wt550 magazine (Incindiary 4.6x30mm)"
+ icon_state = "46x30mmtI-20"
+ ammo_type = /obj/item/ammo_casing/c46x30mm/inc
+
+/obj/item/ammo_box/magazine/wt550m9/wtic/update_icon()
+ ..()
+ icon_state = "46x30mmtI-[round(ammo_count(),4)]"
+
+/obj/item/ammo_box/magazine/uzim9mm
+ name = "uzi magazine (9mm)"
+ icon_state = "uzi9mm-32"
+ ammo_type = /obj/item/ammo_casing/c9mm
+ caliber = "9mm"
+ max_ammo = 32
+
+/obj/item/ammo_box/magazine/uzim9mm/update_icon()
+ ..()
+ icon_state = "uzi9mm-[round(ammo_count(),4)]"
+
+/obj/item/ammo_box/magazine/smgm9mm
+ name = "SMG magazine (9mm)"
+ icon_state = "smg9mm-42"
+ ammo_type = /obj/item/ammo_casing/c9mm
+ caliber = "9mm"
+ max_ammo = 21
+
+/obj/item/ammo_box/magazine/smgm9mm/update_icon()
+ ..()
+ icon_state = "smg9mm-[ammo_count() ? "42" : "0"]"
+
+/obj/item/ammo_box/magazine/smgm9mm/ap
+ name = "SMG magazine (Armour Piercing 9mm)"
+ ammo_type = /obj/item/ammo_casing/c9mm/ap
+
+/obj/item/ammo_box/magazine/smgm9mm/fire
+ name = "SMG Magazine (Incindiary 9mm)"
+ ammo_type = /obj/item/ammo_casing/c9mm/inc
+
+/obj/item/ammo_box/magazine/smgm45
+ name = "SMG magazine (.45)"
+ icon_state = "c20r45-24"
+ ammo_type = /obj/item/ammo_casing/c45/nostamina
+ caliber = ".45"
+ max_ammo = 24
+
+/obj/item/ammo_box/magazine/smgm45/update_icon()
+ ..()
+ icon_state = "c20r45-[round(ammo_count(),2)]"
+
+/obj/item/ammo_box/magazine/tommygunm45
+ name = "drum magazine (.45)"
+ icon_state = "drum45"
+ ammo_type = /obj/item/ammo_casing/c45
+ caliber = ".45"
+ max_ammo = 50
diff --git a/code/modules/projectiles/boxes_magazines/external/sniper.dm b/code/modules/projectiles/boxes_magazines/external/sniper.dm
new file mode 100644
index 0000000000..67c6257bac
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/external/sniper.dm
@@ -0,0 +1,26 @@
+/obj/item/ammo_box/magazine/sniper_rounds
+ name = "sniper rounds (.50)"
+ icon_state = ".50mag"
+ ammo_type = /obj/item/ammo_casing/p50
+ max_ammo = 6
+ caliber = ".50"
+
+/obj/item/ammo_box/magazine/sniper_rounds/update_icon()
+ if(ammo_count())
+ icon_state = "[initial(icon_state)]-ammo"
+ else
+ icon_state = "[initial(icon_state)]"
+
+/obj/item/ammo_box/magazine/sniper_rounds/soporific
+ name = "sniper rounds (Zzzzz)"
+ desc = "Soporific sniper rounds, designed for happy days and dead quiet nights..."
+ icon_state = "soporific"
+ ammo_type = /obj/item/ammo_casing/p50/soporific
+ max_ammo = 3
+ caliber = ".50"
+
+/obj/item/ammo_box/magazine/sniper_rounds/penetrator
+ name = "sniper rounds (penetrator)"
+ desc = "An extremely powerful round capable of passing straight through cover and anyone unfortunate enough to be behind it."
+ ammo_type = /obj/item/ammo_casing/p50/penetrator
+ max_ammo = 5
diff --git a/code/modules/projectiles/boxes_magazines/external/toy.dm b/code/modules/projectiles/boxes_magazines/external/toy.dm
new file mode 100644
index 0000000000..cb66391c02
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/external/toy.dm
@@ -0,0 +1,55 @@
+/obj/item/ammo_box/magazine/toy
+ name = "foam force META magazine"
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart
+ caliber = "foam_force"
+
+/obj/item/ammo_box/magazine/toy/smg
+ name = "foam force SMG magazine"
+ icon_state = "smg9mm-42"
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart
+ max_ammo = 20
+
+/obj/item/ammo_box/magazine/toy/smg/update_icon()
+ ..()
+ if(ammo_count())
+ icon_state = "smg9mm-42"
+ else
+ icon_state = "smg9mm-0"
+
+/obj/item/ammo_box/magazine/toy/smg/riot
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
+
+/obj/item/ammo_box/magazine/toy/pistol
+ name = "foam force pistol magazine"
+ icon_state = "9x19p"
+ max_ammo = 8
+ multiple_sprites = 2
+
+/obj/item/ammo_box/magazine/toy/pistol/riot
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
+
+/obj/item/ammo_box/magazine/toy/smgm45
+ name = "donksoft SMG magazine"
+ caliber = "foam_force"
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart
+ max_ammo = 20
+
+/obj/item/ammo_box/magazine/toy/smgm45/update_icon()
+ ..()
+ icon_state = "c20r45-[round(ammo_count(),2)]"
+
+/obj/item/ammo_box/magazine/toy/smgm45/riot
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
+
+/obj/item/ammo_box/magazine/toy/m762
+ name = "donksoft box magazine"
+ caliber = "foam_force"
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart
+ max_ammo = 50
+
+/obj/item/ammo_box/magazine/toy/m762/update_icon()
+ ..()
+ icon_state = "a762-[round(ammo_count(),10)]"
+
+/obj/item/ammo_box/magazine/toy/m762/riot
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
diff --git a/code/modules/projectiles/boxes_magazines/external_mag.dm b/code/modules/projectiles/boxes_magazines/external_mag.dm
deleted file mode 100644
index b7b3a3e286..0000000000
--- a/code/modules/projectiles/boxes_magazines/external_mag.dm
+++ /dev/null
@@ -1,340 +0,0 @@
-
-///////////EXTERNAL MAGAZINES////////////////
-
-/obj/item/ammo_box/magazine/m10mm
- name = "pistol magazine (10mm)"
- desc = "A gun magazine."
- icon_state = "9x19p"
- ammo_type = /obj/item/ammo_casing/c10mm
- caliber = "10mm"
- max_ammo = 8
- multiple_sprites = 2
-
-/obj/item/ammo_box/magazine/m10mm/rifle
- name = "rifle magazine (10mm)"
- desc = "A well-worn magazine fitted for the surplus rifle."
- icon_state = "75-8"
- ammo_type = /obj/item/ammo_casing/c10mm
- caliber = "10mm"
- max_ammo = 10
-
-/obj/item/ammo_box/magazine/m10mm/rifle/update_icon()
- if(ammo_count())
- icon_state = "75-8"
- else
- icon_state = "75-0"
-
-
-/obj/item/ammo_box/magazine/m10mm/fire
- name = "pistol magazine (10mm incendiary)"
- icon_state = "9x19pI"
- desc = "A gun magazine. Loaded with rounds which ignite the target."
- ammo_type = /obj/item/ammo_casing/c10mm/fire
-
-/obj/item/ammo_box/magazine/m10mm/hp
- name = "pistol magazine (10mm HP)"
- icon_state = "9x19pH"
- desc= "A gun magazine. Loaded with hollow-point rounds, extremely effective against unarmored targets, but nearly useless against protective clothing."
- ammo_type = /obj/item/ammo_casing/c10mm/hp
-
-/obj/item/ammo_box/magazine/m10mm/ap
- name = "pistol magazine (10mm AP)"
- icon_state = "9x19pA"
- desc= "A gun magazine. Loaded with rounds which penetrate armour, but are less effective against normal targets."
- ammo_type = /obj/item/ammo_casing/c10mm/ap
-
-/obj/item/ammo_box/magazine/m45
- name = "handgun magazine (.45)"
- icon_state = "45-8"
- ammo_type = /obj/item/ammo_casing/c45
- caliber = ".45"
- max_ammo = 8
-
-/obj/item/ammo_box/magazine/m45/update_icon()
- ..()
- icon_state = "45-[ammo_count() ? "8" : "0"]"
-
-/obj/item/ammo_box/magazine/wt550m9
- name = "wt550 magazine (4.6x30mm)"
- icon_state = "46x30mmt-20"
- ammo_type = /obj/item/ammo_casing/c46x30mm
- caliber = "4.6x30mm"
- max_ammo = 20
-
-/obj/item/ammo_box/magazine/wt550m9/update_icon()
- ..()
- icon_state = "46x30mmt-[round(ammo_count(),4)]"
-
-/obj/item/ammo_box/magazine/wt550m9/wtap
- name = "wt550 magazine (Armour Piercing 4.6x30mm)"
- icon_state = "46x30mmtA-20"
- ammo_type = /obj/item/ammo_casing/c46x30mm/ap
-
-/obj/item/ammo_box/magazine/wt550m9/wtap/update_icon()
- ..()
- icon_state = "46x30mmtA-[round(ammo_count(),4)]"
-
-/obj/item/ammo_box/magazine/wt550m9/wtic
- name = "wt550 magazine (Incindiary 4.6x30mm)"
- icon_state = "46x30mmtI-20"
- ammo_type = /obj/item/ammo_casing/c46x30mm/inc
-
-/obj/item/ammo_box/magazine/wt550m9/wtic/update_icon()
- ..()
- icon_state = "46x30mmtI-[round(ammo_count(),4)]"
-
-/obj/item/ammo_box/magazine/uzim9mm
- name = "uzi magazine (9mm)"
- icon_state = "uzi9mm-32"
- ammo_type = /obj/item/ammo_casing/c9mm
- caliber = "9mm"
- max_ammo = 32
-
-/obj/item/ammo_box/magazine/uzim9mm/update_icon()
- ..()
- icon_state = "uzi9mm-[round(ammo_count(),4)]"
-
-/obj/item/ammo_box/magazine/smgm9mm
- name = "SMG magazine (9mm)"
- icon_state = "smg9mm-42"
- ammo_type = /obj/item/ammo_casing/c9mm
- caliber = "9mm"
- max_ammo = 21
-
-/obj/item/ammo_box/magazine/smgm9mm/update_icon()
- ..()
- icon_state = "smg9mm-[ammo_count() ? "42" : "0"]"
-
-/obj/item/ammo_box/magazine/smgm9mm/ap
- name = "SMG magazine (Armour Piercing 9mm)"
- ammo_type = /obj/item/ammo_casing/c9mm/ap
-
-/obj/item/ammo_box/magazine/smgm9mm/fire
- name = "SMG Magazine (Incindiary 9mm)"
- ammo_type = /obj/item/ammo_casing/c9mm/inc
-
-/obj/item/ammo_box/magazine/pistolm9mm
- name = "pistol magazine (9mm)"
- icon_state = "9x19p-8"
- ammo_type = /obj/item/ammo_casing/c9mm
- caliber = "9mm"
- max_ammo = 15
-
-/obj/item/ammo_box/magazine/pistolm9mm/update_icon()
- ..()
- icon_state = "9x19p-[ammo_count() ? "8" : "0"]"
-
-/obj/item/ammo_box/magazine/smgm45
- name = "SMG magazine (.45)"
- icon_state = "c20r45-24"
- ammo_type = /obj/item/ammo_casing/c45/nostamina
- caliber = ".45"
- max_ammo = 24
-
-/obj/item/ammo_box/magazine/smgm45/update_icon()
- ..()
- icon_state = "c20r45-[round(ammo_count(),2)]"
-
-/obj/item/ammo_box/magazine/tommygunm45
- name = "drum magazine (.45)"
- icon_state = "drum45"
- ammo_type = /obj/item/ammo_casing/c45
- caliber = ".45"
- max_ammo = 50
-
-/obj/item/ammo_box/magazine/m50
- name = "handgun magazine (.50ae)"
- icon_state = "50ae"
- ammo_type = /obj/item/ammo_casing/a50AE
- caliber = ".50"
- max_ammo = 7
- multiple_sprites = 1
-
-/obj/item/ammo_box/magazine/m75
- name = "specialized magazine (.75)"
- icon_state = "75"
- ammo_type = /obj/item/ammo_casing/caseless/a75
- caliber = "75"
- multiple_sprites = 2
- max_ammo = 8
-
-/obj/item/ammo_box/magazine/m556
- name = "toploader magazine (5.56mm)"
- icon_state = "5.56m"
- ammo_type = /obj/item/ammo_casing/a556
- caliber = "a556"
- max_ammo = 30
- multiple_sprites = 2
-
-/obj/item/ammo_box/magazine/m12g
- name = "shotgun magazine (12g taser slugs)"
- desc = "A drum magazine."
- icon_state = "m12gs"
- ammo_type = /obj/item/ammo_casing/shotgun/stunslug
- caliber = "shotgun"
- max_ammo = 8
-
-/obj/item/ammo_box/magazine/m12g/update_icon()
- ..()
- icon_state = "[initial(icon_state)]-[CEILING(ammo_count(0)/8, 1)*8]"
-
-/obj/item/ammo_box/magazine/m12g/buckshot
- name = "shotgun magazine (12g buckshot slugs)"
- icon_state = "m12gb"
- ammo_type = /obj/item/ammo_casing/shotgun/buckshot
-
-/obj/item/ammo_box/magazine/m12g/slug
- name = "shotgun magazine (12g slugs)"
- icon_state = "m12gb"
- ammo_type = /obj/item/ammo_casing/shotgun
-
-/obj/item/ammo_box/magazine/m12g/dragon
- name = "shotgun magazine (12g dragon's breath)"
- icon_state = "m12gf"
- ammo_type = /obj/item/ammo_casing/shotgun/dragonsbreath
-
-/obj/item/ammo_box/magazine/m12g/bioterror
- name = "shotgun magazine (12g bioterror)"
- icon_state = "m12gt"
- ammo_type = /obj/item/ammo_casing/shotgun/dart/bioterror
-
-/obj/item/ammo_box/magazine/m12g/meteor
- name = "shotgun magazine (12g meteor slugs)"
- icon_state = "m12gbc"
- ammo_type = /obj/item/ammo_casing/shotgun/meteorslug
-
-
-//// SNIPER MAGAZINES
-
-/obj/item/ammo_box/magazine/sniper_rounds
- name = "sniper rounds (.50)"
- icon_state = ".50mag"
- ammo_type = /obj/item/ammo_casing/p50
- max_ammo = 6
- caliber = ".50"
-
-/obj/item/ammo_box/magazine/sniper_rounds/update_icon()
- if(ammo_count())
- icon_state = "[initial(icon_state)]-ammo"
- else
- icon_state = "[initial(icon_state)]"
-
-/obj/item/ammo_box/magazine/sniper_rounds/soporific
- name = "sniper rounds (Zzzzz)"
- desc = "Soporific sniper rounds, designed for happy days and dead quiet nights..."
- icon_state = "soporific"
- ammo_type = /obj/item/ammo_casing/p50/soporific
- max_ammo = 3
- caliber = ".50"
-
-/obj/item/ammo_box/magazine/sniper_rounds/penetrator
- name = "sniper rounds (penetrator)"
- desc = "An extremely powerful round capable of passing straight through cover and anyone unfortunate enough to be behind it."
- ammo_type = /obj/item/ammo_casing/p50/penetrator
- max_ammo = 5
-
-//// SAW MAGAZINES
-
-/obj/item/ammo_box/magazine/mm195x129
- name = "box magazine (1.95x129mm)"
- icon_state = "a762-50"
- ammo_type = /obj/item/ammo_casing/mm195x129
- caliber = "mm195129"
- max_ammo = 50
-
-/obj/item/ammo_box/magazine/mm195x129/hollow
- name = "box magazine (Hollow-Point 1.95x129mm)"
- ammo_type = /obj/item/ammo_casing/mm195x129/hollow
-
-/obj/item/ammo_box/magazine/mm195x129/ap
- name = "box magazine (Armor Penetrating 1.95x129mm)"
- ammo_type = /obj/item/ammo_casing/mm195x129/ap
-
-/obj/item/ammo_box/magazine/mm195x129/incen
- name = "box magazine (Incendiary 1.95x129mm)"
- ammo_type = /obj/item/ammo_casing/mm195x129/incen
-
-/obj/item/ammo_box/magazine/mm195x129/update_icon()
- ..()
- icon_state = "a762-[round(ammo_count(),10)]"
-
-
-
-
-////TOY GUN MAGAZINES
-
-/obj/item/ammo_box/magazine/toy
- name = "foam force META magazine"
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart
- caliber = "foam_force"
-
-/obj/item/ammo_box/magazine/toy/smg
- name = "foam force SMG magazine"
- icon_state = "smg9mm-42"
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart
- max_ammo = 20
-
-/obj/item/ammo_box/magazine/toy/smg/update_icon()
- ..()
- if(ammo_count())
- icon_state = "smg9mm-42"
- else
- icon_state = "smg9mm-0"
-
-/obj/item/ammo_box/magazine/toy/smg/riot
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
-
-/obj/item/ammo_box/magazine/toy/pistol
- name = "foam force pistol magazine"
- icon_state = "9x19p"
- max_ammo = 8
- multiple_sprites = 2
-
-/obj/item/ammo_box/magazine/toy/pistol/riot
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
-
-/obj/item/ammo_box/magazine/toy/smgm45
- name = "donksoft SMG magazine"
- caliber = "foam_force"
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart
- max_ammo = 20
-
-/obj/item/ammo_box/magazine/toy/smgm45/update_icon()
- ..()
- icon_state = "c20r45-[round(ammo_count(),2)]"
-
-/obj/item/ammo_box/magazine/toy/smgm45/riot
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
-
-/obj/item/ammo_box/magazine/toy/m762
- name = "donksoft box magazine"
- caliber = "foam_force"
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart
- max_ammo = 50
-
-/obj/item/ammo_box/magazine/toy/m762/update_icon()
- ..()
- icon_state = "a762-[round(ammo_count(),10)]"
-
-/obj/item/ammo_box/magazine/toy/m762/riot
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
-
-
-
-
-//// RECHARGEABLE MAGAZINES
-
-/obj/item/ammo_box/magazine/recharge
- name = "power pack"
- desc = "A rechargeable, detachable battery that serves as a magazine for laser rifles."
- icon_state = "oldrifle-20"
- ammo_type = /obj/item/ammo_casing/caseless/laser
- caliber = "laser"
- max_ammo = 20
-
-/obj/item/ammo_box/magazine/recharge/update_icon()
- desc = "[initial(desc)] It has [stored_ammo.len] shot\s left."
- icon_state = "oldrifle-[round(ammo_count(),4)]"
-
-/obj/item/ammo_box/magazine/recharge/attack_self() //No popping out the "bullets"
- return
diff --git a/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm b/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm
new file mode 100644
index 0000000000..bbfc79471c
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm
@@ -0,0 +1,47 @@
+/obj/item/ammo_box/magazine/internal/cylinder
+ name = "revolver cylinder"
+ ammo_type = /obj/item/ammo_casing/a357
+ caliber = "357"
+ max_ammo = 7
+
+/obj/item/ammo_box/magazine/internal/cylinder/ammo_count(countempties = 1)
+ var/boolets = 0
+ for(var/obj/item/ammo_casing/bullet in stored_ammo)
+ if(bullet && (bullet.BB || countempties))
+ boolets++
+
+ return boolets
+
+/obj/item/ammo_box/magazine/internal/cylinder/get_round(keep = 0)
+ rotate()
+
+ var/b = stored_ammo[1]
+ if(!keep)
+ stored_ammo[1] = null
+
+ return b
+
+/obj/item/ammo_box/magazine/internal/cylinder/proc/rotate()
+ var/b = stored_ammo[1]
+ stored_ammo.Cut(1,2)
+ stored_ammo.Insert(0, b)
+
+/obj/item/ammo_box/magazine/internal/cylinder/proc/spin()
+ for(var/i in 1 to rand(0, max_ammo*2))
+ rotate()
+
+/obj/item/ammo_box/magazine/internal/cylinder/give_round(obj/item/ammo_casing/R, replace_spent = 0)
+ if(!R || (caliber && R.caliber != caliber) || (!caliber && R.type != ammo_type))
+ return FALSE
+
+ for(var/i in 1 to stored_ammo.len)
+ var/obj/item/ammo_casing/bullet = stored_ammo[i]
+ if(!bullet || !bullet.BB) // found a spent ammo
+ stored_ammo[i] = R
+ R.forceMove(src)
+
+ if(bullet)
+ bullet.forceMove(drop_location())
+ return TRUE
+
+ return FALSE
diff --git a/code/modules/projectiles/boxes_magazines/internal/_internal.dm b/code/modules/projectiles/boxes_magazines/internal/_internal.dm
new file mode 100644
index 0000000000..e21cb5ce61
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/internal/_internal.dm
@@ -0,0 +1,7 @@
+/obj/item/ammo_box/magazine/internal
+ desc = "Oh god, this shouldn't be here"
+ flags_1 = CONDUCT_1|ABSTRACT_1
+
+//internals magazines are accessible, so replace spent ammo if full when trying to put a live one in
+/obj/item/ammo_box/magazine/internal/give_round(obj/item/ammo_casing/R)
+ return ..(R,1)
diff --git a/code/modules/projectiles/boxes_magazines/internal/grenade.dm b/code/modules/projectiles/boxes_magazines/internal/grenade.dm
new file mode 100644
index 0000000000..12325a0299
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/internal/grenade.dm
@@ -0,0 +1,17 @@
+/obj/item/ammo_box/magazine/internal/cylinder/grenademulti
+ name = "grenade launcher internal magazine"
+ ammo_type = /obj/item/ammo_casing/a40mm
+ caliber = "40mm"
+ max_ammo = 6
+
+/obj/item/ammo_box/magazine/internal/grenadelauncher
+ name = "grenade launcher internal magazine"
+ ammo_type = /obj/item/ammo_casing/a40mm
+ caliber = "40mm"
+ max_ammo = 1
+
+/obj/item/ammo_box/magazine/internal/rocketlauncher
+ name = "grenade launcher internal magazine"
+ ammo_type = /obj/item/ammo_casing/caseless/a84mm
+ caliber = "84mm"
+ max_ammo = 1
diff --git a/code/modules/projectiles/boxes_magazines/internal/misc.dm b/code/modules/projectiles/boxes_magazines/internal/misc.dm
new file mode 100644
index 0000000000..aab0643cbc
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/internal/misc.dm
@@ -0,0 +1,11 @@
+/obj/item/ammo_box/magazine/internal/speargun
+ name = "speargun internal magazine"
+ ammo_type = /obj/item/ammo_casing/caseless/magspear
+ caliber = "speargun"
+ max_ammo = 1
+
+/obj/item/ammo_box/magazine/internal/minigun
+ name = "gatling gun fusion core"
+ ammo_type = /obj/item/ammo_casing/caseless/laser/gatling
+ caliber = "gatling"
+ max_ammo = 5000
diff --git a/code/modules/projectiles/boxes_magazines/internal/revolver.dm b/code/modules/projectiles/boxes_magazines/internal/revolver.dm
new file mode 100644
index 0000000000..976f80f437
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/internal/revolver.dm
@@ -0,0 +1,22 @@
+/obj/item/ammo_box/magazine/internal/cylinder/rev38
+ name = "detective revolver cylinder"
+ ammo_type = /obj/item/ammo_casing/c38
+ caliber = "38"
+ max_ammo = 6
+
+/obj/item/ammo_box/magazine/internal/cylinder/rev762
+ name = "nagant revolver cylinder"
+ ammo_type = /obj/item/ammo_casing/n762
+ caliber = "n762"
+ max_ammo = 7
+
+/obj/item/ammo_box/magazine/internal/cylinder/rus357
+ name = "russian revolver cylinder"
+ ammo_type = /obj/item/ammo_casing/a357
+ caliber = "357"
+ max_ammo = 6
+ multiload = 0
+
+/obj/item/ammo_box/magazine/internal/rus357/Initialize()
+ stored_ammo += new ammo_type(src)
+ . = ..()
diff --git a/code/modules/projectiles/boxes_magazines/internal/rifle.dm b/code/modules/projectiles/boxes_magazines/internal/rifle.dm
new file mode 100644
index 0000000000..ef83e96b1c
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/internal/rifle.dm
@@ -0,0 +1,15 @@
+/obj/item/ammo_box/magazine/internal/boltaction
+ name = "bolt action rifle internal magazine"
+ desc = "Oh god, this shouldn't be here"
+ ammo_type = /obj/item/ammo_casing/a762
+ caliber = "a762"
+ max_ammo = 5
+ multiload = 1
+
+/obj/item/ammo_box/magazine/internal/boltaction/enchanted
+ max_ammo = 1
+ ammo_type = /obj/item/ammo_casing/a762/enchanted
+
+/obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage
+ ammo_type = /obj/item/ammo_casing/magic/arcane_barrage
+
diff --git a/code/modules/projectiles/boxes_magazines/internal/shotgun.dm b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm
new file mode 100644
index 0000000000..3bd277da31
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm
@@ -0,0 +1,48 @@
+/obj/item/ammo_box/magazine/internal/shot
+ name = "shotgun internal magazine"
+ ammo_type = /obj/item/ammo_casing/shotgun/beanbag
+ caliber = "shotgun"
+ max_ammo = 4
+ multiload = 0
+
+/obj/item/ammo_box/magazine/internal/shot/ammo_count(countempties = 1)
+ if (!countempties)
+ var/boolets = 0
+ for(var/obj/item/ammo_casing/bullet in stored_ammo)
+ if(bullet.BB)
+ boolets++
+ return boolets
+ else
+ return ..()
+
+/obj/item/ammo_box/magazine/internal/shot/tube
+ name = "dual feed shotgun internal tube"
+ ammo_type = /obj/item/ammo_casing/shotgun/rubbershot
+ max_ammo = 4
+
+/obj/item/ammo_box/magazine/internal/shot/lethal
+ ammo_type = /obj/item/ammo_casing/shotgun/buckshot
+
+/obj/item/ammo_box/magazine/internal/shot/com
+ name = "combat shotgun internal magazine"
+ ammo_type = /obj/item/ammo_casing/shotgun/buckshot
+ max_ammo = 6
+
+/obj/item/ammo_box/magazine/internal/shot/com/compact
+ name = "compact combat shotgun internal magazine"
+ ammo_type = /obj/item/ammo_casing/shotgun/buckshot
+ max_ammo = 4
+
+/obj/item/ammo_box/magazine/internal/shot/dual
+ name = "double-barrel shotgun internal magazine"
+ max_ammo = 2
+
+/obj/item/ammo_box/magazine/internal/shot/improvised
+ name = "improvised shotgun internal magazine"
+ ammo_type = /obj/item/ammo_casing/shotgun/improvised
+ max_ammo = 1
+
+/obj/item/ammo_box/magazine/internal/shot/riot
+ name = "riot shotgun internal magazine"
+ ammo_type = /obj/item/ammo_casing/shotgun/rubbershot
+ max_ammo = 6
diff --git a/code/modules/projectiles/boxes_magazines/internal/toy.dm b/code/modules/projectiles/boxes_magazines/internal/toy.dm
new file mode 100644
index 0000000000..f2bb0dbf08
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/internal/toy.dm
@@ -0,0 +1,7 @@
+/obj/item/ammo_box/magazine/internal/shot/toy
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart
+ caliber = "foam_force"
+ max_ammo = 4
+
+/obj/item/ammo_box/magazine/internal/shot/toy/crossbow
+ max_ammo = 5
diff --git a/code/modules/projectiles/boxes_magazines/internal_mag.dm b/code/modules/projectiles/boxes_magazines/internal_mag.dm
deleted file mode 100644
index b26d30c389..0000000000
--- a/code/modules/projectiles/boxes_magazines/internal_mag.dm
+++ /dev/null
@@ -1,191 +0,0 @@
-////////////////INTERNAL MAGAZINES//////////////////////
-
-/obj/item/ammo_box/magazine/internal
- desc = "Oh god, this shouldn't be here"
- flags_1 = CONDUCT_1|ABSTRACT_1
-
-//internals magazines are accessible, so replace spent ammo if full when trying to put a live one in
-/obj/item/ammo_box/magazine/internal/give_round(obj/item/ammo_casing/R)
- return ..(R,1)
-
-
-
-// Revolver internal mags
-/obj/item/ammo_box/magazine/internal/cylinder
- name = "revolver cylinder"
- ammo_type = /obj/item/ammo_casing/a357
- caliber = "357"
- max_ammo = 7
-
-/obj/item/ammo_box/magazine/internal/cylinder/ammo_count(countempties = 1)
- var/boolets = 0
- for(var/obj/item/ammo_casing/bullet in stored_ammo)
- if(bullet && (bullet.BB || countempties))
- boolets++
-
- return boolets
-
-/obj/item/ammo_box/magazine/internal/cylinder/get_round(keep = 0)
- rotate()
-
- var/b = stored_ammo[1]
- if(!keep)
- stored_ammo[1] = null
-
- return b
-
-/obj/item/ammo_box/magazine/internal/cylinder/proc/rotate()
- var/b = stored_ammo[1]
- stored_ammo.Cut(1,2)
- stored_ammo.Insert(0, b)
-
-/obj/item/ammo_box/magazine/internal/cylinder/proc/spin()
- for(var/i in 1 to rand(0, max_ammo*2))
- rotate()
-
-
-/obj/item/ammo_box/magazine/internal/cylinder/give_round(obj/item/ammo_casing/R, replace_spent = 0)
- if(!R || (caliber && R.caliber != caliber) || (!caliber && R.type != ammo_type))
- return 0
-
- for(var/i in 1 to stored_ammo.len)
- var/obj/item/ammo_casing/bullet = stored_ammo[i]
- if(!bullet || !bullet.BB) // found a spent ammo
- stored_ammo[i] = R
- R.forceMove(src)
-
- if(bullet)
- bullet.forceMove(drop_location())
- return 1
-
- return 0
-
-/obj/item/ammo_box/magazine/internal/cylinder/rev38
- name = "detective revolver cylinder"
- ammo_type = /obj/item/ammo_casing/c38
- caliber = "38"
- max_ammo = 6
-
-/obj/item/ammo_box/magazine/internal/cylinder/grenademulti
- name = "grenade launcher internal magazine"
- ammo_type = /obj/item/ammo_casing/a40mm
- caliber = "40mm"
- max_ammo = 6
-
-/obj/item/ammo_box/magazine/internal/cylinder/rev762
- name = "nagant revolver cylinder"
- ammo_type = /obj/item/ammo_casing/n762
- caliber = "n762"
- max_ammo = 7
-
-// Shotgun internal mags
-/obj/item/ammo_box/magazine/internal/shot
- name = "shotgun internal magazine"
- ammo_type = /obj/item/ammo_casing/shotgun/beanbag
- caliber = "shotgun"
- max_ammo = 4
- multiload = 0
-
-/obj/item/ammo_box/magazine/internal/shot/ammo_count(countempties = 1)
- if (!countempties)
- var/boolets = 0
- for(var/obj/item/ammo_casing/bullet in stored_ammo)
- if(bullet.BB)
- boolets++
- return boolets
- else
- return ..()
-
-
-/obj/item/ammo_box/magazine/internal/shot/tube
- name = "dual feed shotgun internal tube"
- ammo_type = /obj/item/ammo_casing/shotgun/rubbershot
- max_ammo = 4
-
-/obj/item/ammo_box/magazine/internal/shot/lethal
- ammo_type = /obj/item/ammo_casing/shotgun/buckshot
-
-/obj/item/ammo_box/magazine/internal/shot/com
- name = "combat shotgun internal magazine"
- ammo_type = /obj/item/ammo_casing/shotgun/buckshot
- max_ammo = 6
-
-/obj/item/ammo_box/magazine/internal/shot/com/compact
- name = "compact combat shotgun internal magazine"
- ammo_type = /obj/item/ammo_casing/shotgun/buckshot
- max_ammo = 4
-
-/obj/item/ammo_box/magazine/internal/shot/dual
- name = "double-barrel shotgun internal magazine"
- max_ammo = 2
-
-/obj/item/ammo_box/magazine/internal/shot/improvised
- name = "improvised shotgun internal magazine"
- ammo_type = /obj/item/ammo_casing/shotgun/improvised
- max_ammo = 1
-
-/obj/item/ammo_box/magazine/internal/shot/riot
- name = "riot shotgun internal magazine"
- ammo_type = /obj/item/ammo_casing/shotgun/rubbershot
- max_ammo = 6
-
-
-
-
-/obj/item/ammo_box/magazine/internal/grenadelauncher
- name = "grenade launcher internal magazine"
- ammo_type = /obj/item/ammo_casing/a40mm
- caliber = "40mm"
- max_ammo = 1
-
-/obj/item/ammo_box/magazine/internal/rocketlauncher
- name = "grenade launcher internal magazine"
- ammo_type = /obj/item/ammo_casing/caseless/a84mm
- caliber = "84mm"
- max_ammo = 1
-
-/obj/item/ammo_box/magazine/internal/speargun
- name = "speargun internal magazine"
- ammo_type = /obj/item/ammo_casing/caseless/magspear
- caliber = "speargun"
- max_ammo = 1
-
-/obj/item/ammo_box/magazine/internal/cylinder/rus357
- name = "russian revolver cylinder"
- ammo_type = /obj/item/ammo_casing/a357
- caliber = "357"
- max_ammo = 6
- multiload = 0
-
-/obj/item/ammo_box/magazine/internal/rus357/Initialize()
- stored_ammo += new ammo_type(src)
- . = ..()
-
-/obj/item/ammo_box/magazine/internal/boltaction
- name = "bolt action rifle internal magazine"
- desc = "Oh god, this shouldn't be here"
- ammo_type = /obj/item/ammo_casing/a762
- caliber = "a762"
- max_ammo = 5
- multiload = 1
-
-/obj/item/ammo_box/magazine/internal/boltaction/enchanted
- max_ammo = 1
- ammo_type = /obj/item/ammo_casing/a762/enchanted
-
-/obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage
- ammo_type = /obj/item/ammo_casing/magic/arcane_barrage
-
-/obj/item/ammo_box/magazine/internal/shot/toy
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart
- caliber = "foam_force"
- max_ammo = 4
-
-/obj/item/ammo_box/magazine/internal/shot/toy/crossbow
- max_ammo = 5
-
-/obj/item/ammo_box/magazine/internal/minigun
- name = "gatling gun fusion core"
- ammo_type = /obj/item/ammo_casing/caseless/laser/gatling
- caliber = "gatling"
- max_ammo = 5000
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 1a0e756277..7b7daadc18 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -27,7 +27,7 @@
var/obj/item/ammo_casing/chambered = null
trigger_guard = TRIGGER_GUARD_NORMAL //trigger guard on the weapon, hulks can't fire them with their big meaty fingers
var/sawn_desc = null //description change if weapon is sawn-off
- var/sawn_state = SAWN_INTACT
+ var/sawn_off = FALSE
var/burst_size = 1 //how large a burst is
var/fire_delay = 0 //rate of fire for burst firing and semi auto
var/firing_burst = 0 //Prevent the weapon from firing again while already firing
@@ -35,6 +35,7 @@
var/weapon_weight = WEAPON_LIGHT
var/spread = 0 //Spread induced by the gun itself.
var/randomspread = 1 //Set to 0 for shotguns. This is used for weapons that don't fire all their bullets at once.
+ var/harmful = TRUE //some arent harmful and should have this set to false. used for pacifists with tasers, medibeams, etc
lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
@@ -111,6 +112,9 @@
if(recoil)
shake_camera(user, recoil + 1, recoil)
+ if(iscarbon(user)) //CIT CHANGE - makes gun recoil cause staminaloss
+ user.adjustStaminaLossBuffered(getstamcost(user)*(firing_burst && burst_size >= 2 ? 1/burst_size : 1)) //CIT CHANGE - ditto
+
if(suppressed)
playsound(user, fire_sound, 10, 1)
else
@@ -169,6 +173,9 @@
//DUAL (or more!) WIELDING
var/bonus_spread = 0
var/loop_counter = 0
+
+ bonus_spread += getinaccuracy(user) //CIT CHANGE - adds bonus spread while not aiming
+
if(ishuman(user) && user.a_intent == INTENT_HARM)
var/mob/living/carbon/human/H = user
for(var/obj/item/gun/G in H.held_items)
@@ -246,6 +253,8 @@
var/rand_spr = rand()
if(spread)
randomized_gun_spread = rand(0,spread)
+ if(user.has_trait(TRAIT_POOR_AIM)) //nice shootin' tex
+ bonus_spread += 25
var/randomized_bonus_spread = rand(0, bonus_spread)
if(burst_size > 1)
diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm
index c16c5f0fc0..f7cb05486f 100644
--- a/code/modules/projectiles/guns/ballistic.dm
+++ b/code/modules/projectiles/guns/ballistic.dm
@@ -21,9 +21,9 @@
/obj/item/gun/ballistic/update_icon()
..()
if(current_skin)
- icon_state = "[unique_reskin[current_skin]][suppressed ? "-suppressed" : ""][sawn_state ? "-sawn" : ""]"
+ icon_state = "[unique_reskin[current_skin]][suppressed ? "-suppressed" : ""][sawn_off ? "-sawn" : ""]"
else
- icon_state = "[initial(icon_state)][suppressed ? "-suppressed" : ""][sawn_state ? "-sawn" : ""]"
+ icon_state = "[initial(icon_state)][suppressed ? "-suppressed" : ""][sawn_off ? "-sawn" : ""]"
/obj/item/gun/ballistic/process_chamber(empty_chamber = 1)
@@ -185,7 +185,7 @@
/obj/item/gun/ballistic/proc/sawoff(mob/user)
- if(sawn_state == SAWN_OFF)
+ if(sawn_off)
to_chat(user, "\The [src] is already shortened! ")
return
user.changeNext_move(CLICK_CD_MELEE)
@@ -197,7 +197,7 @@
return
if(do_after(user, 30, target = src))
- if(sawn_state == SAWN_OFF)
+ if(sawn_off)
return
user.visible_message("[user] shortens \the [src]!", "You shorten \the [src]. ")
name = "sawn-off [src.name]"
@@ -206,7 +206,7 @@
item_state = "gun"
slot_flags &= ~SLOT_BACK //you can't sling it on your back
slot_flags |= SLOT_BELT //but you can wear it on your belt (poorly concealed under a trenchcoat, ideally)
- sawn_state = SAWN_OFF
+ sawn_off = TRUE
update_icon()
return 1
diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm
index 14e529ba23..489f88ffad 100644
--- a/code/modules/projectiles/guns/ballistic/revolver.dm
+++ b/code/modules/projectiles/guns/ballistic/revolver.dm
@@ -311,7 +311,7 @@
/obj/item/gun/ballistic/revolver/doublebarrel/improvised/attackby(obj/item/A, mob/user, params)
..()
- if(istype(A, /obj/item/stack/cable_coil) && !sawn_state)
+ if(istype(A, /obj/item/stack/cable_coil) && !sawn_off)
var/obj/item/stack/cable_coil/C = A
if(C.use(10))
slot_flags = SLOT_BACK
@@ -339,7 +339,7 @@
icon_state = "ishotgun"
item_state = "gun"
w_class = WEIGHT_CLASS_NORMAL
- sawn_state = SAWN_OFF
+ sawn_off = TRUE
slot_flags = SLOT_BELT
diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm
index 315178368d..723e1b910c 100644
--- a/code/modules/projectiles/guns/ballistic/shotgun.dm
+++ b/code/modules/projectiles/guns/ballistic/shotgun.dm
@@ -37,8 +37,13 @@
/obj/item/gun/ballistic/shotgun/attack_self(mob/living/user)
if(recentpump > world.time)
return
+ if(istype(user) && user.staminaloss >= STAMINA_SOFTCRIT)//CIT CHANGE - makes pumping shotguns impossible in stamina softcrit
+ to_chat(user, "You're too exhausted for that. ")//CIT CHANGE - ditto
+ return//CIT CHANGE - ditto
pump(user)
recentpump = world.time + 10
+ if(istype(user))//CIT CHANGE - makes pumping shotguns cost a lil bit of stamina.
+ user.adjustStaminaLossBuffered(5) //CIT CHANGE - DITTO. make this scale inversely to the strength stat when stats/skills are added
return
/obj/item/gun/ballistic/shotgun/blow_up(mob/user)
diff --git a/code/modules/projectiles/guns/ballistic/toy.dm b/code/modules/projectiles/guns/ballistic/toy.dm
index af666951cb..93a210879e 100644
--- a/code/modules/projectiles/guns/ballistic/toy.dm
+++ b/code/modules/projectiles/guns/ballistic/toy.dm
@@ -13,6 +13,7 @@
clumsy_check = 0
item_flags = NONE
casing_ejector = FALSE
+ harmful = FALSE
/obj/item/gun/ballistic/automatic/toy/unrestricted
pin = /obj/item/device/firing_pin
@@ -27,6 +28,7 @@
burst_size = 1
fire_delay = 0
actions_types = list()
+ harmful = FALSE
/obj/item/gun/ballistic/automatic/toy/pistol/update_icon()
..()
@@ -56,6 +58,7 @@
item_flags = NONE
casing_ejector = FALSE
can_suppress = FALSE
+ harmful = FALSE
/obj/item/gun/ballistic/shotgun/toy/process_chamber(empty_chamber = 0)
..()
diff --git a/code/modules/projectiles/guns/mounted.dm b/code/modules/projectiles/guns/energy/mounted.dm
similarity index 96%
rename from code/modules/projectiles/guns/mounted.dm
rename to code/modules/projectiles/guns/energy/mounted.dm
index 5893c2a107..79226689de 100644
--- a/code/modules/projectiles/guns/mounted.dm
+++ b/code/modules/projectiles/guns/energy/mounted.dm
@@ -1,26 +1,26 @@
-/obj/item/gun/energy/e_gun/advtaser/mounted
- name = "mounted taser"
- desc = "An arm mounted dual-mode weapon that fires electrodes and disabler shots."
- icon = 'icons/obj/items_cyborg.dmi'
- icon_state = "taser"
- item_state = "armcannonstun4"
- force = 5
- selfcharge = 1
- can_flashlight = 0
- trigger_guard = TRIGGER_GUARD_ALLOW_ALL // Has no trigger at all, uses neural signals instead
-
-/obj/item/gun/energy/e_gun/advtaser/mounted/dropped()//if somebody manages to drop this somehow...
- ..()
-
-/obj/item/gun/energy/laser/mounted
- name = "mounted laser"
- desc = "An arm mounted cannon that fires lethal lasers."
- icon = 'icons/obj/items_cyborg.dmi'
- icon_state = "laser"
- item_state = "armcannonlase"
- force = 5
- selfcharge = 1
- trigger_guard = TRIGGER_GUARD_ALLOW_ALL
-
-/obj/item/gun/energy/laser/mounted/dropped()
- ..()
+/obj/item/gun/energy/e_gun/advtaser/mounted
+ name = "mounted taser"
+ desc = "An arm mounted dual-mode weapon that fires electrodes and disabler shots."
+ icon = 'icons/obj/items_cyborg.dmi'
+ icon_state = "taser"
+ item_state = "armcannonstun4"
+ force = 5
+ selfcharge = 1
+ can_flashlight = 0
+ trigger_guard = TRIGGER_GUARD_ALLOW_ALL // Has no trigger at all, uses neural signals instead
+
+/obj/item/gun/energy/e_gun/advtaser/mounted/dropped()//if somebody manages to drop this somehow...
+ ..()
+
+/obj/item/gun/energy/laser/mounted
+ name = "mounted laser"
+ desc = "An arm mounted cannon that fires lethal lasers."
+ icon = 'icons/obj/items_cyborg.dmi'
+ icon_state = "laser"
+ item_state = "armcannonlase"
+ force = 5
+ selfcharge = 1
+ trigger_guard = TRIGGER_GUARD_ALLOW_ALL
+
+/obj/item/gun/energy/laser/mounted/dropped()
+ ..()
diff --git a/code/modules/projectiles/guns/energy/plasma.dm b/code/modules/projectiles/guns/energy/plasma_cit.dm
similarity index 100%
rename from code/modules/projectiles/guns/energy/plasma.dm
rename to code/modules/projectiles/guns/energy/plasma_cit.dm
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index 3d9408bcca..93188dd073 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -49,6 +49,7 @@
modifystate = 1
ammo_x_offset = 1
selfcharge = 1
+ harmful = FALSE
/obj/item/gun/energy/meteorgun
name = "meteor gun"
diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm
index 69f6a47813..d7b62879dd 100644
--- a/code/modules/projectiles/guns/energy/stun.dm
+++ b/code/modules/projectiles/guns/energy/stun.dm
@@ -5,6 +5,7 @@
item_state = null //so the human update icon uses the icon_state instead.
ammo_type = list(/obj/item/ammo_casing/energy/electrode)
ammo_x_offset = 3
+ harmful = FALSE
/obj/item/gun/energy/tesla_revolver
name = "tesla gun"
@@ -22,6 +23,7 @@
icon_state = "advtaser"
ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/disabler)
ammo_x_offset = 2
+ harmful = FALSE
/obj/item/gun/energy/e_gun/advtaser/cyborg
name = "cyborg taser"
@@ -29,6 +31,7 @@
can_flashlight = 0
can_charge = 0
use_cyborg_cell = 1
+ harmful = FALSE
/obj/item/gun/energy/disabler
name = "disabler"
@@ -37,10 +40,11 @@
item_state = null
ammo_type = list(/obj/item/ammo_casing/energy/disabler)
ammo_x_offset = 3
+ harmful = FALSE
/obj/item/gun/energy/disabler/cyborg
name = "cyborg disabler"
desc = "An integrated disabler that draws from a cyborg's power cell. This weapon contains a limiter to prevent the cyborg's power cell from overheating."
can_charge = 0
use_cyborg_cell = 1
-
+ harmful = FALSE
diff --git a/code/modules/projectiles/guns/magic/staff.dm b/code/modules/projectiles/guns/magic/staff.dm
index c268c15272..617de22baa 100644
--- a/code/modules/projectiles/guns/magic/staff.dm
+++ b/code/modules/projectiles/guns/magic/staff.dm
@@ -27,6 +27,7 @@
ammo_type = /obj/item/ammo_casing/magic/heal
icon_state = "staffofhealing"
item_state = "staffofhealing"
+ harmful = FALSE
/obj/item/gun/magic/staff/healing/handle_suicide() //Stops people trying to commit suicide to heal themselves
return
@@ -59,6 +60,7 @@
max_charges = 10
recharge_rate = 2
no_den_usage = 1
+ harmful = FALSE
/obj/item/gun/magic/staff/honk
name = "staff of the honkmother"
@@ -69,6 +71,7 @@
item_state = "honker"
max_charges = 4
recharge_rate = 8
+ harmful = FALSE
/obj/item/gun/magic/staff/spellblade
name = "spellblade"
diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm
index bf3ade0748..6d094c6ff7 100644
--- a/code/modules/projectiles/guns/magic/wand.dm
+++ b/code/modules/projectiles/guns/magic/wand.dm
@@ -8,6 +8,7 @@
can_charge = 0
max_charges = 100 //100, 50, 50, 34 (max charge distribution by 25%ths)
var/variable_charges = 1
+ harmful = FALSE
/obj/item/gun/magic/wand/Initialize()
if(prob(75) && variable_charges) //25% chance of listed max charges, 50% chance of 1/2 max charges, 25% chance of 1/3 max charges
@@ -85,6 +86,7 @@
fire_sound = 'sound/magic/staff_healing.ogg'
icon_state = "revivewand"
max_charges = 10 //10, 5, 5, 4
+ harmful = FALSE
/obj/item/gun/magic/wand/resurrection/zap_self(mob/living/user)
user.revive(full_heal = 1)
@@ -125,6 +127,7 @@
icon_state = "telewand"
max_charges = 10 //10, 5, 5, 4
no_den_usage = 1
+ harmful = FALSE
/obj/item/gun/magic/wand/teleport/zap_self(mob/living/user)
if(do_teleport(user, user, 10))
@@ -146,6 +149,7 @@
fire_sound = 'sound/magic/staff_door.ogg'
max_charges = 20 //20, 10, 10, 7
no_den_usage = 1
+ harmful = FALSE
/obj/item/gun/magic/wand/door/zap_self(mob/living/user)
to_chat(user, "You feel vaguely more open with your feelings. ")
diff --git a/code/modules/projectiles/guns/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm
similarity index 97%
rename from code/modules/projectiles/guns/beam_rifle.dm
rename to code/modules/projectiles/guns/misc/beam_rifle.dm
index a2365dfc13..59465eb989 100644
--- a/code/modules/projectiles/guns/beam_rifle.dm
+++ b/code/modules/projectiles/guns/misc/beam_rifle.dm
@@ -1,590 +1,590 @@
-
-#define ZOOM_LOCK_AUTOZOOM_FREEMOVE 0
-#define ZOOM_LOCK_AUTOZOOM_ANGLELOCK 1
-#define ZOOM_LOCK_CENTER_VIEW 2
-#define ZOOM_LOCK_OFF 3
-
-#define AUTOZOOM_PIXEL_STEP_FACTOR 48
-
-#define AIMING_BEAM_ANGLE_CHANGE_THRESHOLD 0.1
-
-/obj/item/gun/energy/beam_rifle
- name = "particle acceleration rifle"
- desc = "An energy-based anti material marksman rifle that uses highly charged particle beams moving at extreme velocities to decimate whatever is unfortunate enough to be targetted by one. \
- Hold down left click while scoped to aim, when weapon is fully aimed (Tracer goes from red to green as it charges), release to fire. Moving while aiming or \
- changing where you're pointing at while aiming will delay the aiming process depending on how much you changed. "
- icon = 'icons/obj/guns/energy.dmi'
- icon_state = "esniper"
- item_state = "esniper"
- fire_sound = 'sound/weapons/beam_sniper.ogg'
- slot_flags = SLOT_BACK
- force = 15
- materials = list()
- recoil = 4
- ammo_x_offset = 3
- ammo_y_offset = 3
- modifystate = FALSE
- weapon_weight = WEAPON_HEAVY
- w_class = WEIGHT_CLASS_BULKY
- ammo_type = list(/obj/item/ammo_casing/energy/beam_rifle/hitscan)
- cell_type = /obj/item/stock_parts/cell/beam_rifle
- canMouseDown = TRUE
- pin = null
- var/aiming = FALSE
- var/aiming_time = 12
- var/aiming_time_fire_threshold = 5
- var/aiming_time_left = 12
- var/aiming_time_increase_user_movement = 3
- var/scoped_slow = 1
- var/aiming_time_increase_angle_multiplier = 0.3
- var/last_process = 0
-
- var/lastangle = 0
- var/aiming_lastangle = 0
- var/mob/current_user = null
- var/list/obj/effect/projectile/tracer/current_tracers
-
- var/structure_piercing = 2 //Amount * 2. For some reason structures aren't respecting this unless you have it doubled. Probably with the objects in question's Bump() code instead of this but I'll deal with this later.
- var/structure_bleed_coeff = 0.7
- var/wall_pierce_amount = 0
- var/wall_devastate = 0
- var/aoe_structure_range = 1
- var/aoe_structure_damage = 50
- var/aoe_fire_range = 2
- var/aoe_fire_chance = 40
- var/aoe_mob_range = 1
- var/aoe_mob_damage = 30
- var/impact_structure_damage = 60
- var/projectile_damage = 30
- var/projectile_stun = 0
- var/projectile_setting_pierce = TRUE
- var/delay = 65
- var/lastfire = 0
-
- //ZOOMING
- var/zoom_current_view_increase = 0
- var/zoom_target_view_increase = 10
- var/zooming = FALSE
- var/zoom_lock = ZOOM_LOCK_OFF
- var/zooming_angle
- var/current_zoom_x = 0
- var/current_zoom_y = 0
- var/zoom_animating = 0
-
- var/static/image/charged_overlay = image(icon = 'icons/obj/guns/energy.dmi', icon_state = "esniper_charged")
- var/static/image/drained_overlay = image(icon = 'icons/obj/guns/energy.dmi', icon_state = "esniper_empty")
-
- var/datum/action/item_action/zoom_lock_action/zoom_lock_action
- var/datum/component/mobhook
-
-/obj/item/gun/energy/beam_rifle/debug
- delay = 0
- cell_type = /obj/item/stock_parts/cell/infinite
- aiming_time = 0
- recoil = 0
- pin = /obj/item/device/firing_pin
-
-/obj/item/gun/energy/beam_rifle/equipped(mob/user)
- set_user(user)
- . = ..()
-
-/obj/item/gun/energy/beam_rifle/pickup(mob/user)
- set_user(user)
- . = ..()
-
-/obj/item/gun/energy/beam_rifle/dropped(mob/user)
- set_user()
- . = ..()
-
-/obj/item/gun/energy/beam_rifle/ui_action_click(owner, action)
- if(istype(action, /datum/action/item_action/zoom_lock_action))
- zoom_lock++
- if(zoom_lock > 3)
- zoom_lock = 0
- switch(zoom_lock)
- if(ZOOM_LOCK_AUTOZOOM_FREEMOVE)
- to_chat(owner, "You switch [src]'s zooming processor to free directional. ")
- if(ZOOM_LOCK_AUTOZOOM_ANGLELOCK)
- to_chat(owner, "You switch [src]'s zooming processor to locked directional. ")
- if(ZOOM_LOCK_CENTER_VIEW)
- to_chat(owner, "You switch [src]'s zooming processor to center mode. ")
- if(ZOOM_LOCK_OFF)
- to_chat(owner, "You disable [src]'s zooming system. ")
- reset_zooming()
-
-/obj/item/gun/energy/beam_rifle/proc/smooth_zooming(delay_override = null)
- if(!check_user() || !zooming || zoom_lock == ZOOM_LOCK_OFF || zoom_lock == ZOOM_LOCK_CENTER_VIEW)
- return
- if(zoom_animating && delay_override != 0)
- return smooth_zooming(zoom_animating + delay_override) //Automatically compensate for ongoing zooming actions.
- var/total_time = SSfastprocess.wait
- if(delay_override)
- total_time = delay_override
- zoom_animating = total_time
- animate(current_user.client, pixel_x = current_zoom_x, pixel_y = current_zoom_y , total_time, SINE_EASING, ANIMATION_PARALLEL)
- zoom_animating = 0
-
-/obj/item/gun/energy/beam_rifle/proc/set_autozoom_pixel_offsets_immediate(current_angle)
- if(zoom_lock == ZOOM_LOCK_CENTER_VIEW || zoom_lock == ZOOM_LOCK_OFF)
- return
- current_zoom_x = sin(current_angle) + sin(current_angle) * AUTOZOOM_PIXEL_STEP_FACTOR * zoom_current_view_increase
- current_zoom_y = cos(current_angle) + cos(current_angle) * AUTOZOOM_PIXEL_STEP_FACTOR * zoom_current_view_increase
-
-/obj/item/gun/energy/beam_rifle/proc/handle_zooming()
- if(!zooming || !check_user())
- return
- current_user.client.change_view(world.view + zoom_target_view_increase)
- zoom_current_view_increase = zoom_target_view_increase
- set_autozoom_pixel_offsets_immediate(zooming_angle)
- smooth_zooming()
-
-/obj/item/gun/energy/beam_rifle/proc/start_zooming()
- if(zoom_lock == ZOOM_LOCK_OFF)
- return
- zooming = TRUE
-
-/obj/item/gun/energy/beam_rifle/proc/stop_zooming(mob/user)
- if(zooming)
- zooming = FALSE
- reset_zooming(user)
-
-/obj/item/gun/energy/beam_rifle/proc/reset_zooming(mob/user)
- if(!user)
- user = current_user
- if(!user || !user.client)
- return FALSE
- zoom_animating = 0
- animate(user.client, pixel_x = 0, pixel_y = 0, 0, FALSE, LINEAR_EASING, ANIMATION_END_NOW)
- zoom_current_view_increase = 0
- user.client.change_view(CONFIG_GET(string/default_view))
- zooming_angle = 0
- current_zoom_x = 0
- current_zoom_y = 0
-
-/obj/item/gun/energy/beam_rifle/update_icon()
- cut_overlays()
- var/obj/item/ammo_casing/energy/primary_ammo = ammo_type[1]
- if(cell.charge > primary_ammo.e_cost)
- add_overlay(charged_overlay)
- else
- add_overlay(drained_overlay)
-
-/obj/item/gun/energy/beam_rifle/attack_self(mob/user)
- projectile_setting_pierce = !projectile_setting_pierce
- to_chat(user, "You set \the [src] to [projectile_setting_pierce? "pierce":"impact"] mode. ")
- aiming_beam()
-
-/obj/item/gun/energy/beam_rifle/proc/update_slowdown()
- if(aiming)
- slowdown = scoped_slow
- else
- slowdown = initial(slowdown)
-
-/obj/item/gun/energy/beam_rifle/Initialize()
- . = ..()
- current_tracers = list()
- START_PROCESSING(SSprojectiles, src)
- zoom_lock_action = new(src)
-
-/obj/item/gun/energy/beam_rifle/Destroy()
- STOP_PROCESSING(SSfastprocess, src)
- set_user(null)
- QDEL_LIST(current_tracers)
- QDEL_NULL(mobhook)
- return ..()
-
-/obj/item/gun/energy/beam_rifle/emp_act(severity)
- chambered = null
- recharge_newshot()
-
-/obj/item/gun/energy/beam_rifle/proc/aiming_beam(force_update = FALSE)
- var/diff = abs(aiming_lastangle - lastangle)
- check_user()
- if(diff < AIMING_BEAM_ANGLE_CHANGE_THRESHOLD && !force_update)
- return
- aiming_lastangle = lastangle
- var/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/P = new
- P.gun = src
- P.wall_pierce_amount = wall_pierce_amount
- P.structure_pierce_amount = structure_piercing
- P.do_pierce = projectile_setting_pierce
- if(aiming_time)
- var/percent = ((100/aiming_time)*aiming_time_left)
- P.color = rgb(255 * percent,255 * ((100 - percent) / 100),0)
- else
- P.color = rgb(0, 255, 0)
- var/turf/curloc = get_turf(src)
- var/turf/targloc = get_turf(current_user.client.mouseObject)
- if(!istype(targloc))
- if(!istype(curloc))
- return
- targloc = get_turf_in_angle(lastangle, curloc, 10)
- P.preparePixelProjectile(targloc, current_user, current_user.client.mouseParams, 0)
- P.fire(lastangle)
-
-/obj/item/gun/energy/beam_rifle/process()
- if(!aiming)
- last_process = world.time
- return
- check_user()
- handle_zooming()
- aiming_time_left = max(0, aiming_time_left - (world.time - last_process))
- aiming_beam(TRUE)
- last_process = world.time
-
-/obj/item/gun/energy/beam_rifle/proc/check_user(automatic_cleanup = TRUE)
- if(!istype(current_user) || !isturf(current_user.loc) || !(src in current_user.held_items) || current_user.incapacitated()) //Doesn't work if you're not holding it!
- if(automatic_cleanup)
- stop_aiming()
- set_user(null)
- return FALSE
- return TRUE
-
-/obj/item/gun/energy/beam_rifle/proc/process_aim()
- if(istype(current_user) && current_user.client && current_user.client.mouseParams)
- var/angle = mouse_angle_from_client(current_user.client)
- switch(angle)
- if(316 to 360)
- current_user.setDir(NORTH)
- if(0 to 45)
- current_user.setDir(NORTH)
- if(46 to 135)
- current_user.setDir(EAST)
- if(136 to 225)
- current_user.setDir(SOUTH)
- if(226 to 315)
- current_user.setDir(WEST)
- var/difference = abs(lastangle - angle)
- if(difference > 350) //Too lazy to properly math, detects 360 --> 0 changes.
- difference = (lastangle > 350? ((360 - lastangle) + angle) : ((360 - angle) + lastangle))
- delay_penalty(difference * aiming_time_increase_angle_multiplier)
- lastangle = angle
-
-/obj/item/gun/energy/beam_rifle/proc/on_mob_move()
- check_user()
- if(aiming)
- delay_penalty(aiming_time_increase_user_movement)
- process_aim()
- aiming_beam(TRUE)
-
-/obj/item/gun/energy/beam_rifle/proc/start_aiming()
- aiming_time_left = aiming_time
- aiming = TRUE
- process_aim()
- aiming_beam(TRUE)
- zooming_angle = lastangle
- start_zooming()
-
-/obj/item/gun/energy/beam_rifle/proc/stop_aiming(mob/user)
- set waitfor = FALSE
- aiming_time_left = aiming_time
- aiming = FALSE
- QDEL_LIST(current_tracers)
- stop_zooming(user)
-
-/obj/item/gun/energy/beam_rifle/proc/set_user(mob/user)
- if(user == current_user)
- return
- stop_aiming(current_user)
- QDEL_NULL(mobhook)
- if(istype(current_user))
- LAZYREMOVE(current_user.mousemove_intercept_objects, src)
- current_user = null
- if(istype(user))
- current_user = user
- LAZYADD(current_user.mousemove_intercept_objects, src)
- mobhook = user.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_MOVED), CALLBACK(src, .proc/on_mob_move))
-
-/obj/item/gun/energy/beam_rifle/onMouseDrag(src_object, over_object, src_location, over_location, params, mob)
- if(aiming)
- process_aim()
- aiming_beam()
- if(zoom_lock == ZOOM_LOCK_AUTOZOOM_FREEMOVE)
- zooming_angle = lastangle
- set_autozoom_pixel_offsets_immediate(zooming_angle)
- smooth_zooming(2)
- return ..()
-
-/obj/item/gun/energy/beam_rifle/onMouseDown(object, location, params, mob/mob)
- if(istype(mob))
- set_user(mob)
- if(istype(object, /obj/screen) && !istype(object, /obj/screen/click_catcher))
- return
- if((object in mob.contents) || (object == mob))
- return
- start_aiming()
- return ..()
-
-/obj/item/gun/energy/beam_rifle/onMouseUp(object, location, params, mob/M)
- if(istype(object, /obj/screen) && !istype(object, /obj/screen/click_catcher))
- return
- process_aim()
- if(aiming_time_left <= aiming_time_fire_threshold && check_user())
- sync_ammo()
- afterattack(M.client.mouseObject, M, FALSE, M.client.mouseParams, passthrough = TRUE)
- stop_aiming()
- QDEL_LIST(current_tracers)
- return ..()
-
-/obj/item/gun/energy/beam_rifle/afterattack(atom/target, mob/living/user, flag, params, passthrough = FALSE)
- if(flag) //It's adjacent, is the user, or is on the user's person
- if(target in user.contents) //can't shoot stuff inside us.
- return
- if(!ismob(target) || user.a_intent == INTENT_HARM) //melee attack
- return
- if(target == user && user.zone_selected != "mouth") //so we can't shoot ourselves (unless mouth selected)
- return
- if(!passthrough && (aiming_time > aiming_time_fire_threshold))
- return
- if(lastfire > world.time + delay)
- return
- lastfire = world.time
- . = ..()
- stop_aiming()
-
-/obj/item/gun/energy/beam_rifle/proc/sync_ammo()
- for(var/obj/item/ammo_casing/energy/beam_rifle/AC in contents)
- AC.sync_stats()
-
-/obj/item/gun/energy/beam_rifle/proc/delay_penalty(amount)
- aiming_time_left = CLAMP(aiming_time_left + amount, 0, aiming_time)
-
-/obj/item/ammo_casing/energy/beam_rifle
- name = "particle acceleration lens"
- desc = "Don't look into barrel!"
- var/wall_pierce_amount = 0
- var/wall_devastate = 0
- var/aoe_structure_range = 1
- var/aoe_structure_damage = 30
- var/aoe_fire_range = 2
- var/aoe_fire_chance = 66
- var/aoe_mob_range = 1
- var/aoe_mob_damage = 20
- var/impact_structure_damage = 50
- var/projectile_damage = 40
- var/projectile_stun = 0
- var/structure_piercing = 2
- var/structure_bleed_coeff = 0.7
- var/do_pierce = TRUE
- var/obj/item/gun/energy/beam_rifle/host
-
-/obj/item/ammo_casing/energy/beam_rifle/proc/sync_stats()
- var/obj/item/gun/energy/beam_rifle/BR = loc
- if(!istype(BR))
- stack_trace("Beam rifle syncing error")
- host = BR
- do_pierce = BR.projectile_setting_pierce
- wall_pierce_amount = BR.wall_pierce_amount
- wall_devastate = BR.wall_devastate
- aoe_structure_range = BR.aoe_structure_range
- aoe_structure_damage = BR.aoe_structure_damage
- aoe_fire_range = BR.aoe_fire_range
- aoe_fire_chance = BR.aoe_fire_chance
- aoe_mob_range = BR.aoe_mob_range
- aoe_mob_damage = BR.aoe_mob_damage
- impact_structure_damage = BR.impact_structure_damage
- projectile_damage = BR.projectile_damage
- projectile_stun = BR.projectile_stun
- delay = BR.delay
- structure_piercing = BR.structure_piercing
- structure_bleed_coeff = BR.structure_bleed_coeff
-
-/obj/item/ammo_casing/energy/beam_rifle/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
- . = ..()
- var/obj/item/projectile/beam/beam_rifle/hitscan/HS_BB = BB
- if(!istype(HS_BB))
- return
- HS_BB.impact_direct_damage = projectile_damage
- HS_BB.stun = projectile_stun
- HS_BB.impact_structure_damage = impact_structure_damage
- HS_BB.aoe_mob_damage = aoe_mob_damage
- HS_BB.aoe_mob_range = CLAMP(aoe_mob_range, 0, 15) //Badmin safety lock
- HS_BB.aoe_fire_chance = aoe_fire_chance
- HS_BB.aoe_fire_range = aoe_fire_range
- HS_BB.aoe_structure_damage = aoe_structure_damage
- HS_BB.aoe_structure_range = CLAMP(aoe_structure_range, 0, 15) //Badmin safety lock
- HS_BB.wall_devastate = wall_devastate
- HS_BB.wall_pierce_amount = wall_pierce_amount
- HS_BB.structure_pierce_amount = structure_piercing
- HS_BB.structure_bleed_coeff = structure_bleed_coeff
- HS_BB.do_pierce = do_pierce
- HS_BB.gun = host
-
-/obj/item/ammo_casing/energy/beam_rifle/throw_proj(atom/target, turf/targloc, mob/living/user, params, spread)
- var/turf/curloc = get_turf(user)
- if(!istype(curloc) || !BB)
- return FALSE
- var/obj/item/gun/energy/beam_rifle/gun = loc
- if(!targloc && gun)
- targloc = get_turf_in_angle(gun.lastangle, curloc, 10)
- else if(!targloc)
- return FALSE
- var/firing_dir
- if(BB.firer)
- firing_dir = BB.firer.dir
- if(!BB.suppressed && firing_effect_type)
- new firing_effect_type(get_turf(src), firing_dir)
- BB.preparePixelProjectile(target, user, params, spread)
- BB.fire(gun? gun.lastangle : null, null)
- BB = null
- return TRUE
-
-/obj/item/ammo_casing/energy/beam_rifle/hitscan
- projectile_type = /obj/item/projectile/beam/beam_rifle/hitscan
- select_name = "beam"
- e_cost = 5000
- fire_sound = 'sound/weapons/beam_sniper.ogg'
-
-/obj/item/projectile/beam/beam_rifle
- name = "particle beam"
- icon = ""
- hitsound = 'sound/effects/explosion3.ogg'
- damage = 0 //Handled manually.
- damage_type = BURN
- flag = "energy"
- range = 150
- jitter = 10
- var/obj/item/gun/energy/beam_rifle/gun
- var/structure_pierce_amount = 0 //All set to 0 so the gun can manually set them during firing.
- var/structure_bleed_coeff = 0
- var/structure_pierce = 0
- var/do_pierce = TRUE
- var/wall_pierce_amount = 0
- var/wall_pierce = 0
- var/wall_devastate = 0
- var/aoe_structure_range = 0
- var/aoe_structure_damage = 0
- var/aoe_fire_range = 0
- var/aoe_fire_chance = 0
- var/aoe_mob_range = 0
- var/aoe_mob_damage = 0
- var/impact_structure_damage = 0
- var/impact_direct_damage = 0
- var/turf/cached
- var/list/pierced = list()
-
-/obj/item/projectile/beam/beam_rifle/proc/AOE(turf/epicenter)
- set waitfor = FALSE
- if(!epicenter)
- return
- new /obj/effect/temp_visual/explosion/fast(epicenter)
- for(var/mob/living/L in range(aoe_mob_range, epicenter)) //handle aoe mob damage
- L.adjustFireLoss(aoe_mob_damage)
- to_chat(L, "\The [src] sears you! ")
- for(var/turf/T in range(aoe_fire_range, epicenter)) //handle aoe fire
- if(prob(aoe_fire_chance))
- new /obj/effect/hotspot(T)
- for(var/obj/O in range(aoe_structure_range, epicenter))
- if(!isitem(O))
- if(O.level == 1) //Please don't break underfloor items!
- continue
- O.take_damage(aoe_structure_damage * get_damage_coeff(O), BURN, "laser", FALSE)
-
-/obj/item/projectile/beam/beam_rifle/proc/check_pierce(atom/target)
- if(!do_pierce)
- return FALSE
- if(pierced[target]) //we already pierced them go away
- return TRUE
- if(isclosedturf(target))
- if(wall_pierce++ < wall_pierce_amount)
- if(prob(wall_devastate))
- if(iswallturf(target))
- var/turf/closed/wall/W = target
- W.dismantle_wall(TRUE, TRUE)
- else
- target.ex_act(EXPLODE_HEAVY)
- return TRUE
- if(ismovableatom(target))
- var/atom/movable/AM = target
- if(AM.density && !AM.CanPass(src, get_turf(target)) && !ismob(AM))
- if(structure_pierce < structure_pierce_amount)
- if(isobj(AM))
- var/obj/O = AM
- O.take_damage((impact_structure_damage + aoe_structure_damage) * structure_bleed_coeff * get_damage_coeff(AM), BURN, "energy", FALSE)
- pierced[AM] = TRUE
- structure_pierce++
- return TRUE
- return FALSE
-
-/obj/item/projectile/beam/beam_rifle/proc/get_damage_coeff(atom/target)
- if(istype(target, /obj/machinery/door))
- return 0.4
- if(istype(target, /obj/structure/window))
- return 0.5
- return 1
-
-/obj/item/projectile/beam/beam_rifle/proc/handle_impact(atom/target)
- if(isobj(target))
- var/obj/O = target
- O.take_damage(impact_structure_damage * get_damage_coeff(target), BURN, "laser", FALSE)
- if(isliving(target))
- var/mob/living/L = target
- L.adjustFireLoss(impact_direct_damage)
- L.emote("scream")
-
-/obj/item/projectile/beam/beam_rifle/proc/handle_hit(atom/target)
- set waitfor = FALSE
- if(!cached && !QDELETED(target))
- cached = get_turf(target)
- if(nodamage)
- return FALSE
- playsound(cached, 'sound/effects/explosion3.ogg', 100, 1)
- AOE(cached)
- if(!QDELETED(target))
- handle_impact(target)
-
-/obj/item/projectile/beam/beam_rifle/Collide(atom/target)
- if(check_pierce(target))
- permutated += target
- trajectory_ignore_forcemove = TRUE
- forceMove(target)
- trajectory_ignore_forcemove = FALSE
- return FALSE
- if(!QDELETED(target))
- cached = get_turf(target)
- . = ..()
-
-/obj/item/projectile/beam/beam_rifle/on_hit(atom/target, blocked = FALSE)
- if(!QDELETED(target))
- cached = get_turf(target)
- handle_hit(target)
- . = ..()
-
-/obj/item/projectile/beam/beam_rifle/hitscan
- icon_state = ""
- hitscan = TRUE
- tracer_type = /obj/effect/projectile/tracer/tracer/beam_rifle
- var/constant_tracer = FALSE
-
-/obj/item/projectile/beam/beam_rifle/hitscan/generate_hitscan_tracers(cleanup = TRUE, duration = 5, impacting = TRUE, highlander)
- set waitfor = FALSE
- if(isnull(highlander))
- highlander = constant_tracer
- if(highlander && istype(gun))
- QDEL_LIST(gun.current_tracers)
- for(var/datum/point/p in beam_segments)
- gun.current_tracers += generate_tracer_between_points(p, beam_segments[p], tracer_type, color, 0)
- else
- for(var/datum/point/p in beam_segments)
- generate_tracer_between_points(p, beam_segments[p], tracer_type, color, duration)
- if(cleanup)
- QDEL_LIST(beam_segments)
- beam_segments = null
- QDEL_NULL(beam_index)
-
-/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam
- tracer_type = /obj/effect/projectile/tracer/tracer/aiming
- name = "aiming beam"
- hitsound = null
- hitsound_wall = null
- nodamage = TRUE
- damage = 0
- constant_tracer = TRUE
-
-/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/prehit(atom/target)
- qdel(src)
- return FALSE
-
-/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/on_hit()
- qdel(src)
- return FALSE
+
+#define ZOOM_LOCK_AUTOZOOM_FREEMOVE 0
+#define ZOOM_LOCK_AUTOZOOM_ANGLELOCK 1
+#define ZOOM_LOCK_CENTER_VIEW 2
+#define ZOOM_LOCK_OFF 3
+
+#define AUTOZOOM_PIXEL_STEP_FACTOR 48
+
+#define AIMING_BEAM_ANGLE_CHANGE_THRESHOLD 0.1
+
+/obj/item/gun/energy/beam_rifle
+ name = "particle acceleration rifle"
+ desc = "An energy-based anti material marksman rifle that uses highly charged particle beams moving at extreme velocities to decimate whatever is unfortunate enough to be targetted by one. \
+ Hold down left click while scoped to aim, when weapon is fully aimed (Tracer goes from red to green as it charges), release to fire. Moving while aiming or \
+ changing where you're pointing at while aiming will delay the aiming process depending on how much you changed. "
+ icon = 'icons/obj/guns/energy.dmi'
+ icon_state = "esniper"
+ item_state = "esniper"
+ fire_sound = 'sound/weapons/beam_sniper.ogg'
+ slot_flags = SLOT_BACK
+ force = 15
+ materials = list()
+ recoil = 4
+ ammo_x_offset = 3
+ ammo_y_offset = 3
+ modifystate = FALSE
+ weapon_weight = WEAPON_HEAVY
+ w_class = WEIGHT_CLASS_BULKY
+ ammo_type = list(/obj/item/ammo_casing/energy/beam_rifle/hitscan)
+ cell_type = /obj/item/stock_parts/cell/beam_rifle
+ canMouseDown = TRUE
+ pin = null
+ var/aiming = FALSE
+ var/aiming_time = 12
+ var/aiming_time_fire_threshold = 5
+ var/aiming_time_left = 12
+ var/aiming_time_increase_user_movement = 3
+ var/scoped_slow = 1
+ var/aiming_time_increase_angle_multiplier = 0.3
+ var/last_process = 0
+
+ var/lastangle = 0
+ var/aiming_lastangle = 0
+ var/mob/current_user = null
+ var/list/obj/effect/projectile/tracer/current_tracers
+
+ var/structure_piercing = 2 //Amount * 2. For some reason structures aren't respecting this unless you have it doubled. Probably with the objects in question's Bump() code instead of this but I'll deal with this later.
+ var/structure_bleed_coeff = 0.7
+ var/wall_pierce_amount = 0
+ var/wall_devastate = 0
+ var/aoe_structure_range = 1
+ var/aoe_structure_damage = 50
+ var/aoe_fire_range = 2
+ var/aoe_fire_chance = 40
+ var/aoe_mob_range = 1
+ var/aoe_mob_damage = 30
+ var/impact_structure_damage = 60
+ var/projectile_damage = 30
+ var/projectile_stun = 0
+ var/projectile_setting_pierce = TRUE
+ var/delay = 65
+ var/lastfire = 0
+
+ //ZOOMING
+ var/zoom_current_view_increase = 0
+ var/zoom_target_view_increase = 10
+ var/zooming = FALSE
+ var/zoom_lock = ZOOM_LOCK_OFF
+ var/zooming_angle
+ var/current_zoom_x = 0
+ var/current_zoom_y = 0
+ var/zoom_animating = 0
+
+ var/static/image/charged_overlay = image(icon = 'icons/obj/guns/energy.dmi', icon_state = "esniper_charged")
+ var/static/image/drained_overlay = image(icon = 'icons/obj/guns/energy.dmi', icon_state = "esniper_empty")
+
+ var/datum/action/item_action/zoom_lock_action/zoom_lock_action
+ var/datum/component/mobhook
+
+/obj/item/gun/energy/beam_rifle/debug
+ delay = 0
+ cell_type = /obj/item/stock_parts/cell/infinite
+ aiming_time = 0
+ recoil = 0
+ pin = /obj/item/device/firing_pin
+
+/obj/item/gun/energy/beam_rifle/equipped(mob/user)
+ set_user(user)
+ . = ..()
+
+/obj/item/gun/energy/beam_rifle/pickup(mob/user)
+ set_user(user)
+ . = ..()
+
+/obj/item/gun/energy/beam_rifle/dropped(mob/user)
+ set_user()
+ . = ..()
+
+/obj/item/gun/energy/beam_rifle/ui_action_click(owner, action)
+ if(istype(action, /datum/action/item_action/zoom_lock_action))
+ zoom_lock++
+ if(zoom_lock > 3)
+ zoom_lock = 0
+ switch(zoom_lock)
+ if(ZOOM_LOCK_AUTOZOOM_FREEMOVE)
+ to_chat(owner, "You switch [src]'s zooming processor to free directional. ")
+ if(ZOOM_LOCK_AUTOZOOM_ANGLELOCK)
+ to_chat(owner, "You switch [src]'s zooming processor to locked directional. ")
+ if(ZOOM_LOCK_CENTER_VIEW)
+ to_chat(owner, "You switch [src]'s zooming processor to center mode. ")
+ if(ZOOM_LOCK_OFF)
+ to_chat(owner, "You disable [src]'s zooming system. ")
+ reset_zooming()
+
+/obj/item/gun/energy/beam_rifle/proc/smooth_zooming(delay_override = null)
+ if(!check_user() || !zooming || zoom_lock == ZOOM_LOCK_OFF || zoom_lock == ZOOM_LOCK_CENTER_VIEW)
+ return
+ if(zoom_animating && delay_override != 0)
+ return smooth_zooming(zoom_animating + delay_override) //Automatically compensate for ongoing zooming actions.
+ var/total_time = SSfastprocess.wait
+ if(delay_override)
+ total_time = delay_override
+ zoom_animating = total_time
+ animate(current_user.client, pixel_x = current_zoom_x, pixel_y = current_zoom_y , total_time, SINE_EASING, ANIMATION_PARALLEL)
+ zoom_animating = 0
+
+/obj/item/gun/energy/beam_rifle/proc/set_autozoom_pixel_offsets_immediate(current_angle)
+ if(zoom_lock == ZOOM_LOCK_CENTER_VIEW || zoom_lock == ZOOM_LOCK_OFF)
+ return
+ current_zoom_x = sin(current_angle) + sin(current_angle) * AUTOZOOM_PIXEL_STEP_FACTOR * zoom_current_view_increase
+ current_zoom_y = cos(current_angle) + cos(current_angle) * AUTOZOOM_PIXEL_STEP_FACTOR * zoom_current_view_increase
+
+/obj/item/gun/energy/beam_rifle/proc/handle_zooming()
+ if(!zooming || !check_user())
+ return
+ current_user.client.change_view(world.view + zoom_target_view_increase)
+ zoom_current_view_increase = zoom_target_view_increase
+ set_autozoom_pixel_offsets_immediate(zooming_angle)
+ smooth_zooming()
+
+/obj/item/gun/energy/beam_rifle/proc/start_zooming()
+ if(zoom_lock == ZOOM_LOCK_OFF)
+ return
+ zooming = TRUE
+
+/obj/item/gun/energy/beam_rifle/proc/stop_zooming(mob/user)
+ if(zooming)
+ zooming = FALSE
+ reset_zooming(user)
+
+/obj/item/gun/energy/beam_rifle/proc/reset_zooming(mob/user)
+ if(!user)
+ user = current_user
+ if(!user || !user.client)
+ return FALSE
+ zoom_animating = 0
+ animate(user.client, pixel_x = 0, pixel_y = 0, 0, FALSE, LINEAR_EASING, ANIMATION_END_NOW)
+ zoom_current_view_increase = 0
+ user.client.change_view(CONFIG_GET(string/default_view))
+ zooming_angle = 0
+ current_zoom_x = 0
+ current_zoom_y = 0
+
+/obj/item/gun/energy/beam_rifle/update_icon()
+ cut_overlays()
+ var/obj/item/ammo_casing/energy/primary_ammo = ammo_type[1]
+ if(cell.charge > primary_ammo.e_cost)
+ add_overlay(charged_overlay)
+ else
+ add_overlay(drained_overlay)
+
+/obj/item/gun/energy/beam_rifle/attack_self(mob/user)
+ projectile_setting_pierce = !projectile_setting_pierce
+ to_chat(user, "You set \the [src] to [projectile_setting_pierce? "pierce":"impact"] mode. ")
+ aiming_beam()
+
+/obj/item/gun/energy/beam_rifle/proc/update_slowdown()
+ if(aiming)
+ slowdown = scoped_slow
+ else
+ slowdown = initial(slowdown)
+
+/obj/item/gun/energy/beam_rifle/Initialize()
+ . = ..()
+ current_tracers = list()
+ START_PROCESSING(SSprojectiles, src)
+ zoom_lock_action = new(src)
+
+/obj/item/gun/energy/beam_rifle/Destroy()
+ STOP_PROCESSING(SSfastprocess, src)
+ set_user(null)
+ QDEL_LIST(current_tracers)
+ QDEL_NULL(mobhook)
+ return ..()
+
+/obj/item/gun/energy/beam_rifle/emp_act(severity)
+ chambered = null
+ recharge_newshot()
+
+/obj/item/gun/energy/beam_rifle/proc/aiming_beam(force_update = FALSE)
+ var/diff = abs(aiming_lastangle - lastangle)
+ check_user()
+ if(diff < AIMING_BEAM_ANGLE_CHANGE_THRESHOLD && !force_update)
+ return
+ aiming_lastangle = lastangle
+ var/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/P = new
+ P.gun = src
+ P.wall_pierce_amount = wall_pierce_amount
+ P.structure_pierce_amount = structure_piercing
+ P.do_pierce = projectile_setting_pierce
+ if(aiming_time)
+ var/percent = ((100/aiming_time)*aiming_time_left)
+ P.color = rgb(255 * percent,255 * ((100 - percent) / 100),0)
+ else
+ P.color = rgb(0, 255, 0)
+ var/turf/curloc = get_turf(src)
+ var/turf/targloc = get_turf(current_user.client.mouseObject)
+ if(!istype(targloc))
+ if(!istype(curloc))
+ return
+ targloc = get_turf_in_angle(lastangle, curloc, 10)
+ P.preparePixelProjectile(targloc, current_user, current_user.client.mouseParams, 0)
+ P.fire(lastangle)
+
+/obj/item/gun/energy/beam_rifle/process()
+ if(!aiming)
+ last_process = world.time
+ return
+ check_user()
+ handle_zooming()
+ aiming_time_left = max(0, aiming_time_left - (world.time - last_process))
+ aiming_beam(TRUE)
+ last_process = world.time
+
+/obj/item/gun/energy/beam_rifle/proc/check_user(automatic_cleanup = TRUE)
+ if(!istype(current_user) || !isturf(current_user.loc) || !(src in current_user.held_items) || current_user.incapacitated()) //Doesn't work if you're not holding it!
+ if(automatic_cleanup)
+ stop_aiming()
+ set_user(null)
+ return FALSE
+ return TRUE
+
+/obj/item/gun/energy/beam_rifle/proc/process_aim()
+ if(istype(current_user) && current_user.client && current_user.client.mouseParams)
+ var/angle = mouse_angle_from_client(current_user.client)
+ switch(angle)
+ if(316 to 360)
+ current_user.setDir(NORTH)
+ if(0 to 45)
+ current_user.setDir(NORTH)
+ if(46 to 135)
+ current_user.setDir(EAST)
+ if(136 to 225)
+ current_user.setDir(SOUTH)
+ if(226 to 315)
+ current_user.setDir(WEST)
+ var/difference = abs(lastangle - angle)
+ if(difference > 350) //Too lazy to properly math, detects 360 --> 0 changes.
+ difference = (lastangle > 350? ((360 - lastangle) + angle) : ((360 - angle) + lastangle))
+ delay_penalty(difference * aiming_time_increase_angle_multiplier)
+ lastangle = angle
+
+/obj/item/gun/energy/beam_rifle/proc/on_mob_move()
+ check_user()
+ if(aiming)
+ delay_penalty(aiming_time_increase_user_movement)
+ process_aim()
+ aiming_beam(TRUE)
+
+/obj/item/gun/energy/beam_rifle/proc/start_aiming()
+ aiming_time_left = aiming_time
+ aiming = TRUE
+ process_aim()
+ aiming_beam(TRUE)
+ zooming_angle = lastangle
+ start_zooming()
+
+/obj/item/gun/energy/beam_rifle/proc/stop_aiming(mob/user)
+ set waitfor = FALSE
+ aiming_time_left = aiming_time
+ aiming = FALSE
+ QDEL_LIST(current_tracers)
+ stop_zooming(user)
+
+/obj/item/gun/energy/beam_rifle/proc/set_user(mob/user)
+ if(user == current_user)
+ return
+ stop_aiming(current_user)
+ QDEL_NULL(mobhook)
+ if(istype(current_user))
+ LAZYREMOVE(current_user.mousemove_intercept_objects, src)
+ current_user = null
+ if(istype(user))
+ current_user = user
+ LAZYADD(current_user.mousemove_intercept_objects, src)
+ mobhook = user.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_MOVED), CALLBACK(src, .proc/on_mob_move))
+
+/obj/item/gun/energy/beam_rifle/onMouseDrag(src_object, over_object, src_location, over_location, params, mob)
+ if(aiming)
+ process_aim()
+ aiming_beam()
+ if(zoom_lock == ZOOM_LOCK_AUTOZOOM_FREEMOVE)
+ zooming_angle = lastangle
+ set_autozoom_pixel_offsets_immediate(zooming_angle)
+ smooth_zooming(2)
+ return ..()
+
+/obj/item/gun/energy/beam_rifle/onMouseDown(object, location, params, mob/mob)
+ if(istype(mob))
+ set_user(mob)
+ if(istype(object, /obj/screen) && !istype(object, /obj/screen/click_catcher))
+ return
+ if((object in mob.contents) || (object == mob))
+ return
+ start_aiming()
+ return ..()
+
+/obj/item/gun/energy/beam_rifle/onMouseUp(object, location, params, mob/M)
+ if(istype(object, /obj/screen) && !istype(object, /obj/screen/click_catcher))
+ return
+ process_aim()
+ if(aiming_time_left <= aiming_time_fire_threshold && check_user())
+ sync_ammo()
+ afterattack(M.client.mouseObject, M, FALSE, M.client.mouseParams, passthrough = TRUE)
+ stop_aiming()
+ QDEL_LIST(current_tracers)
+ return ..()
+
+/obj/item/gun/energy/beam_rifle/afterattack(atom/target, mob/living/user, flag, params, passthrough = FALSE)
+ if(flag) //It's adjacent, is the user, or is on the user's person
+ if(target in user.contents) //can't shoot stuff inside us.
+ return
+ if(!ismob(target) || user.a_intent == INTENT_HARM) //melee attack
+ return
+ if(target == user && user.zone_selected != "mouth") //so we can't shoot ourselves (unless mouth selected)
+ return
+ if(!passthrough && (aiming_time > aiming_time_fire_threshold))
+ return
+ if(lastfire > world.time + delay)
+ return
+ lastfire = world.time
+ . = ..()
+ stop_aiming()
+
+/obj/item/gun/energy/beam_rifle/proc/sync_ammo()
+ for(var/obj/item/ammo_casing/energy/beam_rifle/AC in contents)
+ AC.sync_stats()
+
+/obj/item/gun/energy/beam_rifle/proc/delay_penalty(amount)
+ aiming_time_left = CLAMP(aiming_time_left + amount, 0, aiming_time)
+
+/obj/item/ammo_casing/energy/beam_rifle
+ name = "particle acceleration lens"
+ desc = "Don't look into barrel!"
+ var/wall_pierce_amount = 0
+ var/wall_devastate = 0
+ var/aoe_structure_range = 1
+ var/aoe_structure_damage = 30
+ var/aoe_fire_range = 2
+ var/aoe_fire_chance = 66
+ var/aoe_mob_range = 1
+ var/aoe_mob_damage = 20
+ var/impact_structure_damage = 50
+ var/projectile_damage = 40
+ var/projectile_stun = 0
+ var/structure_piercing = 2
+ var/structure_bleed_coeff = 0.7
+ var/do_pierce = TRUE
+ var/obj/item/gun/energy/beam_rifle/host
+
+/obj/item/ammo_casing/energy/beam_rifle/proc/sync_stats()
+ var/obj/item/gun/energy/beam_rifle/BR = loc
+ if(!istype(BR))
+ stack_trace("Beam rifle syncing error")
+ host = BR
+ do_pierce = BR.projectile_setting_pierce
+ wall_pierce_amount = BR.wall_pierce_amount
+ wall_devastate = BR.wall_devastate
+ aoe_structure_range = BR.aoe_structure_range
+ aoe_structure_damage = BR.aoe_structure_damage
+ aoe_fire_range = BR.aoe_fire_range
+ aoe_fire_chance = BR.aoe_fire_chance
+ aoe_mob_range = BR.aoe_mob_range
+ aoe_mob_damage = BR.aoe_mob_damage
+ impact_structure_damage = BR.impact_structure_damage
+ projectile_damage = BR.projectile_damage
+ projectile_stun = BR.projectile_stun
+ delay = BR.delay
+ structure_piercing = BR.structure_piercing
+ structure_bleed_coeff = BR.structure_bleed_coeff
+
+/obj/item/ammo_casing/energy/beam_rifle/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
+ . = ..()
+ var/obj/item/projectile/beam/beam_rifle/hitscan/HS_BB = BB
+ if(!istype(HS_BB))
+ return
+ HS_BB.impact_direct_damage = projectile_damage
+ HS_BB.stun = projectile_stun
+ HS_BB.impact_structure_damage = impact_structure_damage
+ HS_BB.aoe_mob_damage = aoe_mob_damage
+ HS_BB.aoe_mob_range = CLAMP(aoe_mob_range, 0, 15) //Badmin safety lock
+ HS_BB.aoe_fire_chance = aoe_fire_chance
+ HS_BB.aoe_fire_range = aoe_fire_range
+ HS_BB.aoe_structure_damage = aoe_structure_damage
+ HS_BB.aoe_structure_range = CLAMP(aoe_structure_range, 0, 15) //Badmin safety lock
+ HS_BB.wall_devastate = wall_devastate
+ HS_BB.wall_pierce_amount = wall_pierce_amount
+ HS_BB.structure_pierce_amount = structure_piercing
+ HS_BB.structure_bleed_coeff = structure_bleed_coeff
+ HS_BB.do_pierce = do_pierce
+ HS_BB.gun = host
+
+/obj/item/ammo_casing/energy/beam_rifle/throw_proj(atom/target, turf/targloc, mob/living/user, params, spread)
+ var/turf/curloc = get_turf(user)
+ if(!istype(curloc) || !BB)
+ return FALSE
+ var/obj/item/gun/energy/beam_rifle/gun = loc
+ if(!targloc && gun)
+ targloc = get_turf_in_angle(gun.lastangle, curloc, 10)
+ else if(!targloc)
+ return FALSE
+ var/firing_dir
+ if(BB.firer)
+ firing_dir = BB.firer.dir
+ if(!BB.suppressed && firing_effect_type)
+ new firing_effect_type(get_turf(src), firing_dir)
+ BB.preparePixelProjectile(target, user, params, spread)
+ BB.fire(gun? gun.lastangle : null, null)
+ BB = null
+ return TRUE
+
+/obj/item/ammo_casing/energy/beam_rifle/hitscan
+ projectile_type = /obj/item/projectile/beam/beam_rifle/hitscan
+ select_name = "beam"
+ e_cost = 5000
+ fire_sound = 'sound/weapons/beam_sniper.ogg'
+
+/obj/item/projectile/beam/beam_rifle
+ name = "particle beam"
+ icon = ""
+ hitsound = 'sound/effects/explosion3.ogg'
+ damage = 0 //Handled manually.
+ damage_type = BURN
+ flag = "energy"
+ range = 150
+ jitter = 10
+ var/obj/item/gun/energy/beam_rifle/gun
+ var/structure_pierce_amount = 0 //All set to 0 so the gun can manually set them during firing.
+ var/structure_bleed_coeff = 0
+ var/structure_pierce = 0
+ var/do_pierce = TRUE
+ var/wall_pierce_amount = 0
+ var/wall_pierce = 0
+ var/wall_devastate = 0
+ var/aoe_structure_range = 0
+ var/aoe_structure_damage = 0
+ var/aoe_fire_range = 0
+ var/aoe_fire_chance = 0
+ var/aoe_mob_range = 0
+ var/aoe_mob_damage = 0
+ var/impact_structure_damage = 0
+ var/impact_direct_damage = 0
+ var/turf/cached
+ var/list/pierced = list()
+
+/obj/item/projectile/beam/beam_rifle/proc/AOE(turf/epicenter)
+ set waitfor = FALSE
+ if(!epicenter)
+ return
+ new /obj/effect/temp_visual/explosion/fast(epicenter)
+ for(var/mob/living/L in range(aoe_mob_range, epicenter)) //handle aoe mob damage
+ L.adjustFireLoss(aoe_mob_damage)
+ to_chat(L, "\The [src] sears you! ")
+ for(var/turf/T in range(aoe_fire_range, epicenter)) //handle aoe fire
+ if(prob(aoe_fire_chance))
+ new /obj/effect/hotspot(T)
+ for(var/obj/O in range(aoe_structure_range, epicenter))
+ if(!isitem(O))
+ if(O.level == 1) //Please don't break underfloor items!
+ continue
+ O.take_damage(aoe_structure_damage * get_damage_coeff(O), BURN, "laser", FALSE)
+
+/obj/item/projectile/beam/beam_rifle/proc/check_pierce(atom/target)
+ if(!do_pierce)
+ return FALSE
+ if(pierced[target]) //we already pierced them go away
+ return TRUE
+ if(isclosedturf(target))
+ if(wall_pierce++ < wall_pierce_amount)
+ if(prob(wall_devastate))
+ if(iswallturf(target))
+ var/turf/closed/wall/W = target
+ W.dismantle_wall(TRUE, TRUE)
+ else
+ target.ex_act(EXPLODE_HEAVY)
+ return TRUE
+ if(ismovableatom(target))
+ var/atom/movable/AM = target
+ if(AM.density && !AM.CanPass(src, get_turf(target)) && !ismob(AM))
+ if(structure_pierce < structure_pierce_amount)
+ if(isobj(AM))
+ var/obj/O = AM
+ O.take_damage((impact_structure_damage + aoe_structure_damage) * structure_bleed_coeff * get_damage_coeff(AM), BURN, "energy", FALSE)
+ pierced[AM] = TRUE
+ structure_pierce++
+ return TRUE
+ return FALSE
+
+/obj/item/projectile/beam/beam_rifle/proc/get_damage_coeff(atom/target)
+ if(istype(target, /obj/machinery/door))
+ return 0.4
+ if(istype(target, /obj/structure/window))
+ return 0.5
+ return 1
+
+/obj/item/projectile/beam/beam_rifle/proc/handle_impact(atom/target)
+ if(isobj(target))
+ var/obj/O = target
+ O.take_damage(impact_structure_damage * get_damage_coeff(target), BURN, "laser", FALSE)
+ if(isliving(target))
+ var/mob/living/L = target
+ L.adjustFireLoss(impact_direct_damage)
+ L.emote("scream")
+
+/obj/item/projectile/beam/beam_rifle/proc/handle_hit(atom/target)
+ set waitfor = FALSE
+ if(!cached && !QDELETED(target))
+ cached = get_turf(target)
+ if(nodamage)
+ return FALSE
+ playsound(cached, 'sound/effects/explosion3.ogg', 100, 1)
+ AOE(cached)
+ if(!QDELETED(target))
+ handle_impact(target)
+
+/obj/item/projectile/beam/beam_rifle/Collide(atom/target)
+ if(check_pierce(target))
+ permutated += target
+ trajectory_ignore_forcemove = TRUE
+ forceMove(target)
+ trajectory_ignore_forcemove = FALSE
+ return FALSE
+ if(!QDELETED(target))
+ cached = get_turf(target)
+ . = ..()
+
+/obj/item/projectile/beam/beam_rifle/on_hit(atom/target, blocked = FALSE)
+ if(!QDELETED(target))
+ cached = get_turf(target)
+ handle_hit(target)
+ . = ..()
+
+/obj/item/projectile/beam/beam_rifle/hitscan
+ icon_state = ""
+ hitscan = TRUE
+ tracer_type = /obj/effect/projectile/tracer/tracer/beam_rifle
+ var/constant_tracer = FALSE
+
+/obj/item/projectile/beam/beam_rifle/hitscan/generate_hitscan_tracers(cleanup = TRUE, duration = 5, impacting = TRUE, highlander)
+ set waitfor = FALSE
+ if(isnull(highlander))
+ highlander = constant_tracer
+ if(highlander && istype(gun))
+ QDEL_LIST(gun.current_tracers)
+ for(var/datum/point/p in beam_segments)
+ gun.current_tracers += generate_tracer_between_points(p, beam_segments[p], tracer_type, color, 0)
+ else
+ for(var/datum/point/p in beam_segments)
+ generate_tracer_between_points(p, beam_segments[p], tracer_type, color, duration)
+ if(cleanup)
+ QDEL_LIST(beam_segments)
+ beam_segments = null
+ QDEL_NULL(beam_index)
+
+/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam
+ tracer_type = /obj/effect/projectile/tracer/tracer/aiming
+ name = "aiming beam"
+ hitsound = null
+ hitsound_wall = null
+ nodamage = TRUE
+ damage = 0
+ constant_tracer = TRUE
+
+/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/prehit(atom/target)
+ qdel(src)
+ return FALSE
+
+/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/on_hit()
+ qdel(src)
+ return FALSE
diff --git a/code/modules/projectiles/guns/chem_gun.dm b/code/modules/projectiles/guns/misc/chem_gun.dm
similarity index 95%
rename from code/modules/projectiles/guns/chem_gun.dm
rename to code/modules/projectiles/guns/misc/chem_gun.dm
index b928abafef..17e3bd1876 100644
--- a/code/modules/projectiles/guns/chem_gun.dm
+++ b/code/modules/projectiles/guns/misc/chem_gun.dm
@@ -1,47 +1,47 @@
-//his isn't a subtype of the syringe gun because the syringegun subtype is made to hold syringes
-//this is meant to hold reagents/obj/item/gun/syringe
-/obj/item/gun/chem
- name = "reagent gun"
- desc = "A Nanotrasen syringe gun, modified to automatically synthesise chemical darts, and instead hold reagents."
- icon_state = "chemgun"
- item_state = "chemgun"
- w_class = WEIGHT_CLASS_NORMAL
- throw_speed = 3
- throw_range = 7
- force = 4
- materials = list(MAT_METAL=2000)
- clumsy_check = FALSE
- fire_sound = 'sound/items/syringeproj.ogg'
- container_type = OPENCONTAINER
- var/time_per_syringe = 250
- var/syringes_left = 4
- var/max_syringes = 4
- var/last_synth = 0
-
-/obj/item/gun/chem/Initialize()
- . = ..()
- chambered = new /obj/item/ammo_casing/chemgun(src)
- START_PROCESSING(SSobj, src)
- create_reagents(100)
-
-/obj/item/gun/chem/Destroy()
- . = ..()
- STOP_PROCESSING(SSobj, src)
-
-/obj/item/gun/chem/can_shoot()
- return syringes_left
-
-/obj/item/gun/chem/process_chamber()
- if(chambered && !chambered.BB && syringes_left)
- chambered.newshot()
-
-/obj/item/gun/chem/process()
- if(syringes_left >= max_syringes)
- return
- if(world.time < last_synth+time_per_syringe)
- return
- to_chat(loc, "You hear a click as [src] synthesizes a new dart. ")
- syringes_left++
- if(chambered && !chambered.BB)
- chambered.newshot()
+//his isn't a subtype of the syringe gun because the syringegun subtype is made to hold syringes
+//this is meant to hold reagents/obj/item/gun/syringe
+/obj/item/gun/chem
+ name = "reagent gun"
+ desc = "A Nanotrasen syringe gun, modified to automatically synthesise chemical darts, and instead hold reagents."
+ icon_state = "chemgun"
+ item_state = "chemgun"
+ w_class = WEIGHT_CLASS_NORMAL
+ throw_speed = 3
+ throw_range = 7
+ force = 4
+ materials = list(MAT_METAL=2000)
+ clumsy_check = FALSE
+ fire_sound = 'sound/items/syringeproj.ogg'
+ container_type = OPENCONTAINER
+ var/time_per_syringe = 250
+ var/syringes_left = 4
+ var/max_syringes = 4
+ var/last_synth = 0
+
+/obj/item/gun/chem/Initialize()
+ . = ..()
+ chambered = new /obj/item/ammo_casing/chemgun(src)
+ START_PROCESSING(SSobj, src)
+ create_reagents(100)
+
+/obj/item/gun/chem/Destroy()
+ . = ..()
+ STOP_PROCESSING(SSobj, src)
+
+/obj/item/gun/chem/can_shoot()
+ return syringes_left
+
+/obj/item/gun/chem/process_chamber()
+ if(chambered && !chambered.BB && syringes_left)
+ chambered.newshot()
+
+/obj/item/gun/chem/process()
+ if(syringes_left >= max_syringes)
+ return
+ if(world.time < last_synth+time_per_syringe)
+ return
+ to_chat(loc, "You hear a click as [src] synthesizes a new dart. ")
+ syringes_left++
+ if(chambered && !chambered.BB)
+ chambered.newshot()
last_synth = world.time
\ No newline at end of file
diff --git a/code/modules/projectiles/guns/grenade_launcher.dm b/code/modules/projectiles/guns/misc/grenade_launcher.dm
similarity index 97%
rename from code/modules/projectiles/guns/grenade_launcher.dm
rename to code/modules/projectiles/guns/misc/grenade_launcher.dm
index 771c0091e3..e57d77bdf9 100644
--- a/code/modules/projectiles/guns/grenade_launcher.dm
+++ b/code/modules/projectiles/guns/misc/grenade_launcher.dm
@@ -1,52 +1,52 @@
-/obj/item/gun/grenadelauncher
- name = "grenade launcher"
- desc = "A terrible, terrible thing. It's really awful!"
- icon = 'icons/obj/guns/projectile.dmi'
- icon_state = "riotgun"
- item_state = "riotgun"
- w_class = WEIGHT_CLASS_BULKY
- throw_speed = 2
- throw_range = 7
- force = 5
- var/list/grenades = new/list()
- var/max_grenades = 3
- materials = list(MAT_METAL=2000)
-
-/obj/item/gun/grenadelauncher/examine(mob/user)
- ..()
- to_chat(user, "[grenades.len] / [max_grenades] grenades loaded.")
-
-/obj/item/gun/grenadelauncher/attackby(obj/item/I, mob/user, params)
-
- if((istype(I, /obj/item/grenade)))
- if(grenades.len < max_grenades)
- if(!user.transferItemToLoc(I, src))
- return
- grenades += I
- to_chat(user, "You put the grenade in the grenade launcher. ")
- to_chat(user, "[grenades.len] / [max_grenades] Grenades. ")
- else
- to_chat(usr, "The grenade launcher cannot hold more grenades. ")
-
-/obj/item/gun/grenadelauncher/afterattack(obj/target, mob/user , flag)
- if(target == user)
- return
-
- if(grenades.len)
- fire_grenade(target,user)
- else
- to_chat(user, "The grenade launcher is empty. ")
-
-/obj/item/gun/grenadelauncher/proc/fire_grenade(atom/target, mob/user)
- user.visible_message("[user] fired a grenade! ", \
- "You fire the grenade launcher! ")
- var/obj/item/grenade/F = grenades[1] //Now with less copypasta!
- grenades -= F
- F.forceMove(user.loc)
- F.throw_at(target, 30, 2, user)
- message_admins("[key_name_admin(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).")
- log_game("[key_name(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).")
- F.active = 1
- F.icon_state = initial(F.icon_state) + "_active"
- playsound(user.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3)
- addtimer(CALLBACK(F, /obj/item/grenade.proc/prime), 15)
+/obj/item/gun/grenadelauncher
+ name = "grenade launcher"
+ desc = "A terrible, terrible thing. It's really awful!"
+ icon = 'icons/obj/guns/projectile.dmi'
+ icon_state = "riotgun"
+ item_state = "riotgun"
+ w_class = WEIGHT_CLASS_BULKY
+ throw_speed = 2
+ throw_range = 7
+ force = 5
+ var/list/grenades = new/list()
+ var/max_grenades = 3
+ materials = list(MAT_METAL=2000)
+
+/obj/item/gun/grenadelauncher/examine(mob/user)
+ ..()
+ to_chat(user, "[grenades.len] / [max_grenades] grenades loaded.")
+
+/obj/item/gun/grenadelauncher/attackby(obj/item/I, mob/user, params)
+
+ if((istype(I, /obj/item/grenade)))
+ if(grenades.len < max_grenades)
+ if(!user.transferItemToLoc(I, src))
+ return
+ grenades += I
+ to_chat(user, "You put the grenade in the grenade launcher. ")
+ to_chat(user, "[grenades.len] / [max_grenades] Grenades. ")
+ else
+ to_chat(usr, "The grenade launcher cannot hold more grenades. ")
+
+/obj/item/gun/grenadelauncher/afterattack(obj/target, mob/user , flag)
+ if(target == user)
+ return
+
+ if(grenades.len)
+ fire_grenade(target,user)
+ else
+ to_chat(user, "The grenade launcher is empty. ")
+
+/obj/item/gun/grenadelauncher/proc/fire_grenade(atom/target, mob/user)
+ user.visible_message("[user] fired a grenade! ", \
+ "You fire the grenade launcher! ")
+ var/obj/item/grenade/F = grenades[1] //Now with less copypasta!
+ grenades -= F
+ F.forceMove(user.loc)
+ F.throw_at(target, 30, 2, user)
+ message_admins("[key_name_admin(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).")
+ log_game("[key_name(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).")
+ F.active = 1
+ F.icon_state = initial(F.icon_state) + "_active"
+ playsound(user.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3)
+ addtimer(CALLBACK(F, /obj/item/grenade.proc/prime), 15)
diff --git a/code/modules/projectiles/guns/medbeam.dm b/code/modules/projectiles/guns/misc/medbeam.dm
similarity index 95%
rename from code/modules/projectiles/guns/medbeam.dm
rename to code/modules/projectiles/guns/misc/medbeam.dm
index 79cafe0dd6..0626505791 100644
--- a/code/modules/projectiles/guns/medbeam.dm
+++ b/code/modules/projectiles/guns/misc/medbeam.dm
@@ -1,133 +1,134 @@
-/obj/item/gun/medbeam
- name = "Medical Beamgun"
- desc = "Don't cross the streams!"
- icon = 'icons/obj/chronos.dmi'
- icon_state = "chronogun"
- item_state = "chronogun"
- w_class = WEIGHT_CLASS_NORMAL
-
- var/mob/living/current_target
- var/last_check = 0
- var/check_delay = 10 //Check los as often as possible, max resolution is SSobj tick though
- var/max_range = 8
- var/active = 0
- var/datum/beam/current_beam = null
- var/mounted = 0 //Denotes if this is a handheld or mounted version
-
- weapon_weight = WEAPON_MEDIUM
-
-/obj/item/gun/medbeam/Initialize()
- . = ..()
- START_PROCESSING(SSobj, src)
-
-/obj/item/gun/medbeam/Destroy(mob/user)
- STOP_PROCESSING(SSobj, src)
- LoseTarget()
- return ..()
-
-/obj/item/gun/medbeam/dropped(mob/user)
- ..()
- LoseTarget()
-
-/obj/item/gun/medbeam/equipped(mob/user)
- ..()
- LoseTarget()
-
-/obj/item/gun/medbeam/proc/LoseTarget()
- if(active)
- qdel(current_beam)
- current_beam = null
- active = 0
- on_beam_release(current_target)
- current_target = null
-
-/obj/item/gun/medbeam/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0)
- if(isliving(user))
- add_fingerprint(user)
-
- if(current_target)
- LoseTarget()
- if(!isliving(target))
- return
-
- current_target = target
- active = TRUE
- current_beam = new(user,current_target,time=6000,beam_icon_state="medbeam",btype=/obj/effect/ebeam/medical)
- INVOKE_ASYNC(current_beam, /datum/beam.proc/Start)
-
- SSblackbox.record_feedback("tally", "gun_fired", 1, type)
-
-/obj/item/gun/medbeam/process()
-
- var/source = loc
- if(!mounted && !isliving(source))
- LoseTarget()
- return
-
- if(!current_target)
- LoseTarget()
- return
-
- if(world.time <= last_check+check_delay)
- return
-
- last_check = world.time
-
- if(get_dist(source, current_target)>max_range || !los_check(source, current_target))
- LoseTarget()
- if(isliving(source))
- to_chat(source, "You lose control of the beam! ")
- return
-
- if(current_target)
- on_beam_tick(current_target)
-
-/obj/item/gun/medbeam/proc/los_check(atom/movable/user, mob/target)
- var/turf/user_turf = user.loc
- if(mounted)
- user_turf = get_turf(user)
- else if(!istype(user_turf))
- return 0
- var/obj/dummy = new(user_turf)
- dummy.pass_flags |= PASSTABLE|PASSGLASS|PASSGRILLE //Grille/Glass so it can be used through common windows
- for(var/turf/turf in getline(user_turf,target))
- if(mounted && turf == user_turf)
- continue //Mechs are dense and thus fail the check
- if(turf.density)
- qdel(dummy)
- return 0
- for(var/atom/movable/AM in turf)
- if(!AM.CanPass(dummy,turf,1))
- qdel(dummy)
- return 0
- for(var/obj/effect/ebeam/medical/B in turf)// Don't cross the str-beams!
- if(B.owner.origin != current_beam.origin)
- explosion(B.loc,0,3,5,8)
- qdel(dummy)
- return 0
- qdel(dummy)
- return 1
-
-/obj/item/gun/medbeam/proc/on_beam_hit(var/mob/living/target)
- return
-
-/obj/item/gun/medbeam/proc/on_beam_tick(var/mob/living/target)
- if(target.health != target.maxHealth)
- new /obj/effect/temp_visual/heal(get_turf(target), "#80F5FF")
- target.adjustBruteLoss(-4)
- target.adjustFireLoss(-4)
- return
-
-/obj/item/gun/medbeam/proc/on_beam_release(var/mob/living/target)
- return
-
-/obj/effect/ebeam/medical
- name = "medical beam"
-
-//////////////////////////////Mech Version///////////////////////////////
-/obj/item/gun/medbeam/mech
- mounted = 1
-
-/obj/item/gun/medbeam/mech/Initialize()
- . = ..()
- STOP_PROCESSING(SSobj, src) //Mech mediguns do not process until installed, and are controlled by the holder obj
+/obj/item/gun/medbeam
+ name = "Medical Beamgun"
+ desc = "Don't cross the streams!"
+ icon = 'icons/obj/chronos.dmi'
+ icon_state = "chronogun"
+ item_state = "chronogun"
+ w_class = WEIGHT_CLASS_NORMAL
+ harmful = FALSE
+
+ var/mob/living/current_target
+ var/last_check = 0
+ var/check_delay = 10 //Check los as often as possible, max resolution is SSobj tick though
+ var/max_range = 8
+ var/active = 0
+ var/datum/beam/current_beam = null
+ var/mounted = 0 //Denotes if this is a handheld or mounted version
+
+ weapon_weight = WEAPON_MEDIUM
+
+/obj/item/gun/medbeam/Initialize()
+ . = ..()
+ START_PROCESSING(SSobj, src)
+
+/obj/item/gun/medbeam/Destroy(mob/user)
+ STOP_PROCESSING(SSobj, src)
+ LoseTarget()
+ return ..()
+
+/obj/item/gun/medbeam/dropped(mob/user)
+ ..()
+ LoseTarget()
+
+/obj/item/gun/medbeam/equipped(mob/user)
+ ..()
+ LoseTarget()
+
+/obj/item/gun/medbeam/proc/LoseTarget()
+ if(active)
+ qdel(current_beam)
+ current_beam = null
+ active = 0
+ on_beam_release(current_target)
+ current_target = null
+
+/obj/item/gun/medbeam/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0)
+ if(isliving(user))
+ add_fingerprint(user)
+
+ if(current_target)
+ LoseTarget()
+ if(!isliving(target))
+ return
+
+ current_target = target
+ active = TRUE
+ current_beam = new(user,current_target,time=6000,beam_icon_state="medbeam",btype=/obj/effect/ebeam/medical)
+ INVOKE_ASYNC(current_beam, /datum/beam.proc/Start)
+
+ SSblackbox.record_feedback("tally", "gun_fired", 1, type)
+
+/obj/item/gun/medbeam/process()
+
+ var/source = loc
+ if(!mounted && !isliving(source))
+ LoseTarget()
+ return
+
+ if(!current_target)
+ LoseTarget()
+ return
+
+ if(world.time <= last_check+check_delay)
+ return
+
+ last_check = world.time
+
+ if(get_dist(source, current_target)>max_range || !los_check(source, current_target))
+ LoseTarget()
+ if(isliving(source))
+ to_chat(source, "You lose control of the beam! ")
+ return
+
+ if(current_target)
+ on_beam_tick(current_target)
+
+/obj/item/gun/medbeam/proc/los_check(atom/movable/user, mob/target)
+ var/turf/user_turf = user.loc
+ if(mounted)
+ user_turf = get_turf(user)
+ else if(!istype(user_turf))
+ return 0
+ var/obj/dummy = new(user_turf)
+ dummy.pass_flags |= PASSTABLE|PASSGLASS|PASSGRILLE //Grille/Glass so it can be used through common windows
+ for(var/turf/turf in getline(user_turf,target))
+ if(mounted && turf == user_turf)
+ continue //Mechs are dense and thus fail the check
+ if(turf.density)
+ qdel(dummy)
+ return 0
+ for(var/atom/movable/AM in turf)
+ if(!AM.CanPass(dummy,turf,1))
+ qdel(dummy)
+ return 0
+ for(var/obj/effect/ebeam/medical/B in turf)// Don't cross the str-beams!
+ if(B.owner.origin != current_beam.origin)
+ explosion(B.loc,0,3,5,8)
+ qdel(dummy)
+ return 0
+ qdel(dummy)
+ return 1
+
+/obj/item/gun/medbeam/proc/on_beam_hit(var/mob/living/target)
+ return
+
+/obj/item/gun/medbeam/proc/on_beam_tick(var/mob/living/target)
+ if(target.health != target.maxHealth)
+ new /obj/effect/temp_visual/heal(get_turf(target), "#80F5FF")
+ target.adjustBruteLoss(-4)
+ target.adjustFireLoss(-4)
+ return
+
+/obj/item/gun/medbeam/proc/on_beam_release(var/mob/living/target)
+ return
+
+/obj/effect/ebeam/medical
+ name = "medical beam"
+
+//////////////////////////////Mech Version///////////////////////////////
+/obj/item/gun/medbeam/mech
+ mounted = 1
+
+/obj/item/gun/medbeam/mech/Initialize()
+ . = ..()
+ STOP_PROCESSING(SSobj, src) //Mech mediguns do not process until installed, and are controlled by the holder obj
diff --git a/code/modules/projectiles/guns/syringe_gun.dm b/code/modules/projectiles/guns/misc/syringe_gun.dm
similarity index 96%
rename from code/modules/projectiles/guns/syringe_gun.dm
rename to code/modules/projectiles/guns/misc/syringe_gun.dm
index ac9f7daedf..cc1b321e3a 100644
--- a/code/modules/projectiles/guns/syringe_gun.dm
+++ b/code/modules/projectiles/guns/misc/syringe_gun.dm
@@ -1,104 +1,104 @@
-/obj/item/gun/syringe
- name = "syringe gun"
- desc = "A spring loaded rifle designed to fit syringes, used to incapacitate unruly patients from a distance."
- icon_state = "syringegun"
- item_state = "syringegun"
- w_class = WEIGHT_CLASS_NORMAL
- throw_speed = 3
- throw_range = 7
- force = 4
- materials = list(MAT_METAL=2000)
- clumsy_check = 0
- fire_sound = 'sound/items/syringeproj.ogg'
- var/list/syringes = list()
- var/max_syringes = 1
-
-/obj/item/gun/syringe/Initialize()
- . = ..()
- chambered = new /obj/item/ammo_casing/syringegun(src)
-
-/obj/item/gun/syringe/recharge_newshot()
- if(!syringes.len)
- return
- chambered.newshot()
-
-/obj/item/gun/syringe/can_shoot()
- return syringes.len
-
-/obj/item/gun/syringe/process_chamber()
- if(chambered && !chambered.BB) //we just fired
- recharge_newshot()
-
-/obj/item/gun/syringe/examine(mob/user)
- ..()
- to_chat(user, "Can hold [max_syringes] syringe\s. Has [syringes.len] syringe\s remaining.")
-
-/obj/item/gun/syringe/attack_self(mob/living/user)
- if(!syringes.len)
- to_chat(user, "[src] is empty! ")
- return 0
-
- var/obj/item/reagent_containers/syringe/S = syringes[syringes.len]
-
- if(!S)
- return 0
- S.forceMove(user.loc)
-
- syringes.Remove(S)
- to_chat(user, "You unload [S] from \the [src]. ")
-
- return 1
-
-/obj/item/gun/syringe/attackby(obj/item/A, mob/user, params, show_msg = TRUE)
- if(istype(A, /obj/item/reagent_containers/syringe))
- if(syringes.len < max_syringes)
- if(!user.transferItemToLoc(A, src))
- return FALSE
- to_chat(user, "You load [A] into \the [src]. ")
- syringes += A
- recharge_newshot()
- return TRUE
- else
- to_chat(user, "[src] cannot hold more syringes! ")
- return FALSE
-
-/obj/item/gun/syringe/rapidsyringe
- name = "rapid syringe gun"
- desc = "A modification of the syringe gun design, using a rotating cylinder to store up to six syringes."
- icon_state = "rapidsyringegun"
- max_syringes = 6
-
-/obj/item/gun/syringe/syndicate
- name = "dart pistol"
- desc = "A small spring-loaded sidearm that functions identically to a syringe gun."
- icon_state = "syringe_pistol"
- item_state = "gun" //Smaller inhand
- w_class = WEIGHT_CLASS_SMALL
- force = 2 //Also very weak because it's smaller
- suppressed = TRUE //Softer fire sound
- can_unsuppress = FALSE //Permanently silenced
-
-/obj/item/gun/syringe/dna
- name = "modified syringe gun"
- desc = "A syringe gun that has been modified to fit DNA injectors instead of normal syringes."
-
-/obj/item/gun/syringe/dna/Initialize()
- . = ..()
- chambered = new /obj/item/ammo_casing/dnainjector(src)
-
-/obj/item/gun/syringe/dna/attackby(obj/item/A, mob/user, params, show_msg = TRUE)
- if(istype(A, /obj/item/dnainjector))
- var/obj/item/dnainjector/D = A
- if(D.used)
- to_chat(user, "This injector is used up! ")
- return
- if(syringes.len < max_syringes)
- if(!user.transferItemToLoc(D, src))
- return FALSE
- to_chat(user, "You load \the [D] into \the [src]. ")
- syringes += D
- recharge_newshot()
- return TRUE
- else
- to_chat(user, "[src] cannot hold more syringes! ")
- return FALSE
+/obj/item/gun/syringe
+ name = "syringe gun"
+ desc = "A spring loaded rifle designed to fit syringes, used to incapacitate unruly patients from a distance."
+ icon_state = "syringegun"
+ item_state = "syringegun"
+ w_class = WEIGHT_CLASS_NORMAL
+ throw_speed = 3
+ throw_range = 7
+ force = 4
+ materials = list(MAT_METAL=2000)
+ clumsy_check = 0
+ fire_sound = 'sound/items/syringeproj.ogg'
+ var/list/syringes = list()
+ var/max_syringes = 1
+
+/obj/item/gun/syringe/Initialize()
+ . = ..()
+ chambered = new /obj/item/ammo_casing/syringegun(src)
+
+/obj/item/gun/syringe/recharge_newshot()
+ if(!syringes.len)
+ return
+ chambered.newshot()
+
+/obj/item/gun/syringe/can_shoot()
+ return syringes.len
+
+/obj/item/gun/syringe/process_chamber()
+ if(chambered && !chambered.BB) //we just fired
+ recharge_newshot()
+
+/obj/item/gun/syringe/examine(mob/user)
+ ..()
+ to_chat(user, "Can hold [max_syringes] syringe\s. Has [syringes.len] syringe\s remaining.")
+
+/obj/item/gun/syringe/attack_self(mob/living/user)
+ if(!syringes.len)
+ to_chat(user, "[src] is empty! ")
+ return 0
+
+ var/obj/item/reagent_containers/syringe/S = syringes[syringes.len]
+
+ if(!S)
+ return 0
+ S.forceMove(user.loc)
+
+ syringes.Remove(S)
+ to_chat(user, "You unload [S] from \the [src]. ")
+
+ return 1
+
+/obj/item/gun/syringe/attackby(obj/item/A, mob/user, params, show_msg = TRUE)
+ if(istype(A, /obj/item/reagent_containers/syringe))
+ if(syringes.len < max_syringes)
+ if(!user.transferItemToLoc(A, src))
+ return FALSE
+ to_chat(user, "You load [A] into \the [src]. ")
+ syringes += A
+ recharge_newshot()
+ return TRUE
+ else
+ to_chat(user, "[src] cannot hold more syringes! ")
+ return FALSE
+
+/obj/item/gun/syringe/rapidsyringe
+ name = "rapid syringe gun"
+ desc = "A modification of the syringe gun design, using a rotating cylinder to store up to six syringes."
+ icon_state = "rapidsyringegun"
+ max_syringes = 6
+
+/obj/item/gun/syringe/syndicate
+ name = "dart pistol"
+ desc = "A small spring-loaded sidearm that functions identically to a syringe gun."
+ icon_state = "syringe_pistol"
+ item_state = "gun" //Smaller inhand
+ w_class = WEIGHT_CLASS_SMALL
+ force = 2 //Also very weak because it's smaller
+ suppressed = TRUE //Softer fire sound
+ can_unsuppress = FALSE //Permanently silenced
+
+/obj/item/gun/syringe/dna
+ name = "modified syringe gun"
+ desc = "A syringe gun that has been modified to fit DNA injectors instead of normal syringes."
+
+/obj/item/gun/syringe/dna/Initialize()
+ . = ..()
+ chambered = new /obj/item/ammo_casing/dnainjector(src)
+
+/obj/item/gun/syringe/dna/attackby(obj/item/A, mob/user, params, show_msg = TRUE)
+ if(istype(A, /obj/item/dnainjector))
+ var/obj/item/dnainjector/D = A
+ if(D.used)
+ to_chat(user, "This injector is used up! ")
+ return
+ if(syringes.len < max_syringes)
+ if(!user.transferItemToLoc(D, src))
+ return FALSE
+ to_chat(user, "You load \the [D] into \the [src]. ")
+ syringes += D
+ recharge_newshot()
+ return TRUE
+ else
+ to_chat(user, "[src] cannot hold more syringes! ")
+ return FALSE
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 546ed7743b..db43917d6c 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -419,6 +419,9 @@
transform = M
trajectory.increment(trajectory_multiplier)
var/turf/T = trajectory.return_turf()
+ if(!istype(T))
+ qdel(src)
+ return
if(T.z != loc.z)
var/old = loc
before_z_change(loc, T)
@@ -459,6 +462,13 @@
xo = targloc.x - curloc.x
setAngle(Get_Angle(src, targloc))
+ //CIT CHANGES START HERE - makes it so laying down makes you unable to shoot through most objects
+ if(iscarbon(source))
+ var/mob/living/carbon/checklad = source
+ if(istype(checklad) && checklad.resting)
+ pass_flags = 0
+ //END OF CIT CHANGES
+
if(isliving(source) && params)
var/list/calculated = calculate_projectile_angle_and_pixel_offsets(source, params)
p_x = calculated[2]
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index 235f27e9e5..725ef9baa6 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -7,422 +7,3 @@
flag = "bullet"
hitsound_wall = "ricochet"
impact_effect_type = /obj/effect/temp_visual/impact_effect
-
-/obj/item/projectile/bullet/incendiary
- damage = 20
- var/fire_stacks = 4
-
-/obj/item/projectile/bullet/incendiary/on_hit(atom/target, blocked = FALSE)
- . = ..()
- if(iscarbon(target))
- var/mob/living/carbon/M = target
- M.adjust_fire_stacks(fire_stacks)
- M.IgniteMob()
-
-/obj/item/projectile/bullet/incendiary/Move()
- . = ..()
- var/turf/location = get_turf(src)
- if(location)
- new /obj/effect/hotspot(location)
- location.hotspot_expose(700, 50, 1)
-
-// .357 (Syndie Revolver)
-
-/obj/item/projectile/bullet/a357
- name = ".357 bullet"
- damage = 60
-
-// 7.62 (Nagant Rifle)
-
-/obj/item/projectile/bullet/a762
- name = "7.62 bullet"
- damage = 60
-
-/obj/item/projectile/bullet/a762_enchanted
- name = "enchanted 7.62 bullet"
- damage = 5
- stamina = 80
-
-// 7.62x38mmR (Nagant Revolver)
-
-/obj/item/projectile/bullet/n762
- name = "7.62x38mmR bullet"
- damage = 60
-
-// .50AE (Desert Eagle)
-
-/obj/item/projectile/bullet/a50AE
- name = ".50AE bullet"
- damage = 60
-
-// .38 (Detective's Gun)
-
-/obj/item/projectile/bullet/c38
- name = ".38 bullet"
- damage = 15
- knockdown = 60
- stamina = 50
-
-// 10mm (Stechkin)
-
-/obj/item/projectile/bullet/c10mm
- name = "10mm bullet"
- damage = 30
-
-/obj/item/projectile/bullet/c10mm_ap
- name = "10mm armor-piercing bullet"
- damage = 27
- armour_penetration = 40
-
-/obj/item/projectile/bullet/c10mm_hp
- name = "10mm hollow-point bullet"
- damage = 40
- armour_penetration = -50
-
-/obj/item/projectile/bullet/incendiary/c10mm
- name = "10mm incendiary bullet"
- damage = 15
- fire_stacks = 2
-
-// 9mm (Stechkin APS)
-
-/obj/item/projectile/bullet/c9mm
- name = "9mm bullet"
- damage = 20
-
-/obj/item/projectile/bullet/c9mm_ap
- name = "9mm armor-piercing bullet"
- damage = 15
- armour_penetration = 40
-
-/obj/item/projectile/bullet/incendiary/c9mm
- name = "9mm incendiary bullet"
- damage = 10
- fire_stacks = 1
-
-// 4.6x30mm (Autorifles)
-
-/obj/item/projectile/bullet/c46x30mm
- name = "4.6x30mm bullet"
- damage = 20
-
-/obj/item/projectile/bullet/c46x30mm_ap
- name = "4.6x30mm armor-piercing bullet"
- damage = 15
- armour_penetration = 40
-
-/obj/item/projectile/bullet/incendiary/c46x30mm
- name = "4.6x30mm incendiary bullet"
- damage = 10
- fire_stacks = 1
-
-// .45 (M1911 & C20r)
-
-/obj/item/projectile/bullet/c45
- name = ".45 bullet"
- damage = 20
- stamina = 65
-
-/obj/item/projectile/bullet/c45_nostamina
- name = ".45 bullet"
- damage = 30
-
-// 5.56mm (M-90gl Carbine)
-
-/obj/item/projectile/bullet/a556
- name = "5.56mm bullet"
- damage = 35
-
-// 40mm (Grenade Launcher
-
-/obj/item/projectile/bullet/a40mm
- name ="40mm grenade"
- desc = "USE A WEEL GUN"
- icon_state= "bolter"
- damage = 60
-
-/obj/item/projectile/bullet/a40mm/on_hit(atom/target, blocked = FALSE)
- ..()
- explosion(target, -1, 0, 2, 1, 0, flame_range = 3)
- return TRUE
-
-// .50 (Sniper)
-
-/obj/item/projectile/bullet/p50
- name =".50 bullet"
- speed = 0.4
- damage = 70
- knockdown = 100
- dismemberment = 50
- armour_penetration = 50
- var/breakthings = TRUE
-
-/obj/item/projectile/bullet/p50/on_hit(atom/target, blocked = 0)
- if((blocked != 100) && (!ismob(target) && breakthings))
- target.ex_act(rand(1,2))
- return ..()
-
-/obj/item/projectile/bullet/p50/soporific
- name =".50 soporific bullet"
- armour_penetration = 0
- nodamage = TRUE
- dismemberment = 0
- knockdown = 0
- breakthings = FALSE
-
-/obj/item/projectile/bullet/p50/soporific/on_hit(atom/target, blocked = FALSE)
- if((blocked != 100) && isliving(target))
- var/mob/living/L = target
- L.Sleeping(400)
- return ..()
-
-/obj/item/projectile/bullet/p50/penetrator
- name =".50 penetrator bullet"
- icon_state = "gauss"
- name = "penetrator round"
- damage = 60
- forcedodge = TRUE
- dismemberment = 0 //It goes through you cleanly.
- knockdown = 0
- breakthings = FALSE
-
-// 1.95x129mm (SAW)
-
-/obj/item/projectile/bullet/mm195x129
- name = "1.95x129mm bullet"
- damage = 45
- armour_penetration = 5
-
-/obj/item/projectile/bullet/mm195x129_ap
- name = "1.95x129mm armor-piercing bullet"
- damage = 40
- armour_penetration = 75
-
-/obj/item/projectile/bullet/mm195x129_hp
- name = "1.95x129mm hollow-point bullet"
- damage = 60
- armour_penetration = -60
-
-/obj/item/projectile/bullet/incendiary/mm195x129
- name = "1.95x129mm incendiary bullet"
- damage = 15
- fire_stacks = 3
-
-// Shotgun
-
-/obj/item/projectile/bullet/shotgun_slug
- name = "12g shotgun slug"
- damage = 60
-
-/obj/item/projectile/bullet/shotgun_beanbag
- name = "beanbag slug"
- damage = 5
- stamina = 80
-
-/obj/item/projectile/bullet/incendiary/shotgun
- name = "incendiary slug"
- damage = 20
-
-/obj/item/projectile/bullet/incendiary/shotgun/dragonsbreath
- name = "dragonsbreath pellet"
- damage = 5
-
-/obj/item/projectile/bullet/shotgun_stunslug
- name = "stunslug"
- damage = 5
- knockdown = 100
- stutter = 5
- jitter = 20
- range = 7
- icon_state = "spark"
- color = "#FFFF00"
-
-/obj/item/projectile/bullet/shotgun_meteorslug
- name = "meteorslug"
- icon = 'icons/obj/meteor.dmi'
- icon_state = "dust"
- damage = 20
- knockdown = 80
- hitsound = 'sound/effects/meteorimpact.ogg'
-
-/obj/item/projectile/bullet/shotgun_meteorslug/on_hit(atom/target, blocked = FALSE)
- . = ..()
- if(ismovableatom(target))
- var/atom/movable/M = target
- var/atom/throw_target = get_edge_target_turf(M, get_dir(src, get_step_away(M, src)))
- M.throw_at(throw_target, 3, 2)
-
-/obj/item/projectile/bullet/shotgun_meteorslug/Initialize()
- . = ..()
- SpinAnimation()
-
-/obj/item/projectile/bullet/shotgun_frag12
- name ="frag12 slug"
- damage = 25
- knockdown = 50
-
-/obj/item/projectile/bullet/shotgun_frag12/on_hit(atom/target, blocked = FALSE)
- ..()
- explosion(target, -1, 0, 1)
- return TRUE
-
-/obj/item/projectile/bullet/pellet
- var/tile_dropoff = 0.75
- var/tile_dropoff_s = 1.25
-
-/obj/item/projectile/bullet/pellet/shotgun_buckshot
- name = "buckshot pellet"
- damage = 12.5
-
-/obj/item/projectile/bullet/pellet/shotgun_rubbershot
- name = "rubbershot pellet"
- damage = 3
- stamina = 25
-
-/obj/item/projectile/bullet/pellet/Range()
- ..()
- if(damage > 0)
- damage -= tile_dropoff
- if(stamina > 0)
- stamina -= tile_dropoff_s
- if(damage < 0 && stamina < 0)
- qdel(src)
-
-/obj/item/projectile/bullet/pellet/shotgun_improvised
- tile_dropoff = 0.55 //Come on it does 6 damage don't be like that.
- damage = 6
-
-/obj/item/projectile/bullet/pellet/shotgun_improvised/Initialize()
- . = ..()
- range = rand(1, 8)
-
-/obj/item/projectile/bullet/pellet/shotgun_improvised/on_range()
- do_sparks(1, TRUE, src)
- ..()
-
-// Scattershot
-
-/obj/item/projectile/bullet/scattershot
- damage = 20
- stamina = 65
-
-// LMD (exosuits)
-
-/obj/item/projectile/bullet/lmg
- damage = 20
-
-// Turrets
-
-/obj/item/projectile/bullet/manned_turret
- damage = 20
-
-/obj/item/projectile/bullet/syndicate_turret
- damage = 20
-
-// FNX-99 (Mechs)
-
-/obj/item/projectile/bullet/incendiary/fnx99
- damage = 20
-
-// C3D (Borgs)
-
-/obj/item/projectile/bullet/c3d
- damage = 20
-
-// Honker
-
-/obj/item/projectile/bullet/honker
- damage = 0
- knockdown = 60
- forcedodge = TRUE
- nodamage = TRUE
- hitsound = 'sound/items/bikehorn.ogg'
- icon = 'icons/obj/hydroponics/harvest.dmi'
- icon_state = "banana"
- range = 200
-
-/obj/item/projectile/bullet/honker/Initialize()
- . = ..()
- SpinAnimation()
-
-// Mime
-
-/obj/item/projectile/bullet/mime
- damage = 20
-
-/obj/item/projectile/bullet/mime/on_hit(atom/target, blocked = FALSE)
- . = ..()
- if(iscarbon(target))
- var/mob/living/carbon/M = target
- M.silent = max(M.silent, 10)
-
-// Darts
-
-/obj/item/projectile/bullet/dart
- name = "dart"
- icon_state = "cbbolt"
- damage = 6
- var/piercing = FALSE
-
-/obj/item/projectile/bullet/dart/Initialize()
- . = ..()
- create_reagents(50)
- reagents.set_reacting(FALSE)
-
-/obj/item/projectile/bullet/dart/on_hit(atom/target, blocked = FALSE)
- if(iscarbon(target))
- var/mob/living/carbon/M = target
- if(blocked != 100) // not completely blocked
- if(M.can_inject(null, FALSE, def_zone, piercing)) // Pass the hit zone to see if it can inject by whether it hit the head or the body.
- ..()
- reagents.reaction(M, INJECT)
- reagents.trans_to(M, reagents.total_volume)
- return TRUE
- else
- blocked = 100
- target.visible_message("\The [src] was deflected! ", \
- "You were protected against \the [src]! ")
-
- ..(target, blocked)
- reagents.set_reacting(TRUE)
- reagents.handle_reactions()
- return TRUE
-
-/obj/item/projectile/bullet/dart/metalfoam/Initialize()
- . = ..()
- reagents.add_reagent("aluminium", 15)
- reagents.add_reagent("foaming_agent", 5)
- reagents.add_reagent("facid", 5)
-
-//This one is for future syringe guns update
-/obj/item/projectile/bullet/dart/syringe
- name = "syringe"
- icon_state = "syringeproj"
-
-// DNA injector
-
-/obj/item/projectile/bullet/dnainjector
- name = "\improper DNA injector"
- icon_state = "syringeproj"
- var/obj/item/dnainjector/injector
- damage = 5
- hitsound_wall = "shatter"
-
-/obj/item/projectile/bullet/dnainjector/on_hit(atom/target, blocked = FALSE)
- if(iscarbon(target))
- var/mob/living/carbon/M = target
- if(blocked != 100)
- if(M.can_inject(null, FALSE, def_zone, FALSE))
- if(injector.inject(M, firer))
- QDEL_NULL(injector)
- return TRUE
- else
- blocked = 100
- target.visible_message("\The [src] was deflected! ", \
- "You were protected against \the [src]! ")
- return ..()
-
-/obj/item/projectile/bullet/dnainjector/Destroy()
- QDEL_NULL(injector)
- return ..()
-
diff --git a/code/modules/projectiles/projectile/bullets/_incendiary.dm b/code/modules/projectiles/projectile/bullets/_incendiary.dm
new file mode 100644
index 0000000000..d0cf74421c
--- /dev/null
+++ b/code/modules/projectiles/projectile/bullets/_incendiary.dm
@@ -0,0 +1,17 @@
+/obj/item/projectile/bullet/incendiary
+ damage = 20
+ var/fire_stacks = 4
+
+/obj/item/projectile/bullet/incendiary/on_hit(atom/target, blocked = FALSE)
+ . = ..()
+ if(iscarbon(target))
+ var/mob/living/carbon/M = target
+ M.adjust_fire_stacks(fire_stacks)
+ M.IgniteMob()
+
+/obj/item/projectile/bullet/incendiary/Move()
+ . = ..()
+ var/turf/location = get_turf(src)
+ if(location)
+ new /obj/effect/hotspot(location)
+ location.hotspot_expose(700, 50, 1)
diff --git a/code/modules/projectiles/projectile/bullets/dart_syringe.dm b/code/modules/projectiles/projectile/bullets/dart_syringe.dm
new file mode 100644
index 0000000000..023c3b9090
--- /dev/null
+++ b/code/modules/projectiles/projectile/bullets/dart_syringe.dm
@@ -0,0 +1,39 @@
+/obj/item/projectile/bullet/dart
+ name = "dart"
+ icon_state = "cbbolt"
+ damage = 6
+ var/piercing = FALSE
+
+/obj/item/projectile/bullet/dart/Initialize()
+ . = ..()
+ create_reagents(50)
+ reagents.set_reacting(FALSE)
+
+/obj/item/projectile/bullet/dart/on_hit(atom/target, blocked = FALSE)
+ if(iscarbon(target))
+ var/mob/living/carbon/M = target
+ if(blocked != 100) // not completely blocked
+ if(M.can_inject(null, FALSE, def_zone, piercing)) // Pass the hit zone to see if it can inject by whether it hit the head or the body.
+ ..()
+ reagents.reaction(M, INJECT)
+ reagents.trans_to(M, reagents.total_volume)
+ return TRUE
+ else
+ blocked = 100
+ target.visible_message("\The [src] was deflected! ", \
+ "You were protected against \the [src]! ")
+
+ ..(target, blocked)
+ reagents.set_reacting(TRUE)
+ reagents.handle_reactions()
+ return TRUE
+
+/obj/item/projectile/bullet/dart/metalfoam/Initialize()
+ . = ..()
+ reagents.add_reagent("aluminium", 15)
+ reagents.add_reagent("foaming_agent", 5)
+ reagents.add_reagent("facid", 5)
+
+/obj/item/projectile/bullet/dart/syringe
+ name = "syringe"
+ icon_state = "syringeproj"
diff --git a/code/modules/projectiles/projectile/bullets/dnainjector.dm b/code/modules/projectiles/projectile/bullets/dnainjector.dm
new file mode 100644
index 0000000000..861ead5393
--- /dev/null
+++ b/code/modules/projectiles/projectile/bullets/dnainjector.dm
@@ -0,0 +1,24 @@
+/obj/item/projectile/bullet/dnainjector
+ name = "\improper DNA injector"
+ icon_state = "syringeproj"
+ var/obj/item/dnainjector/injector
+ damage = 5
+ hitsound_wall = "shatter"
+
+/obj/item/projectile/bullet/dnainjector/on_hit(atom/target, blocked = FALSE)
+ if(iscarbon(target))
+ var/mob/living/carbon/M = target
+ if(blocked != 100)
+ if(M.can_inject(null, FALSE, def_zone, FALSE))
+ if(injector.inject(M, firer))
+ QDEL_NULL(injector)
+ return TRUE
+ else
+ blocked = 100
+ target.visible_message("\The [src] was deflected! ", \
+ "You were protected against \the [src]! ")
+ return ..()
+
+/obj/item/projectile/bullet/dnainjector/Destroy()
+ QDEL_NULL(injector)
+ return ..()
diff --git a/code/modules/projectiles/projectile/bullets/grenade.dm b/code/modules/projectiles/projectile/bullets/grenade.dm
new file mode 100644
index 0000000000..965001b55f
--- /dev/null
+++ b/code/modules/projectiles/projectile/bullets/grenade.dm
@@ -0,0 +1,12 @@
+// 40mm (Grenade Launcher
+
+/obj/item/projectile/bullet/a40mm
+ name ="40mm grenade"
+ desc = "USE A WEEL GUN"
+ icon_state= "bolter"
+ damage = 60
+
+/obj/item/projectile/bullet/a40mm/on_hit(atom/target, blocked = FALSE)
+ ..()
+ explosion(target, -1, 0, 2, 1, 0, flame_range = 3)
+ return TRUE
diff --git a/code/modules/projectiles/projectile/bullets/lmg.dm b/code/modules/projectiles/projectile/bullets/lmg.dm
new file mode 100644
index 0000000000..03e64976d9
--- /dev/null
+++ b/code/modules/projectiles/projectile/bullets/lmg.dm
@@ -0,0 +1,44 @@
+// C3D (Borgs)
+
+/obj/item/projectile/bullet/c3d
+ damage = 20
+
+// Mech LMG
+
+/obj/item/projectile/bullet/lmg
+ damage = 20
+
+// Mech FNX-99
+
+/obj/item/projectile/bullet/incendiary/fnx99
+ damage = 20
+
+// Turrets
+
+/obj/item/projectile/bullet/manned_turret
+ damage = 20
+
+/obj/item/projectile/bullet/syndicate_turret
+ damage = 20
+
+// 1.95x129mm (SAW)
+
+/obj/item/projectile/bullet/mm195x129
+ name = "1.95x129mm bullet"
+ damage = 45
+ armour_penetration = 5
+
+/obj/item/projectile/bullet/mm195x129_ap
+ name = "1.95x129mm armor-piercing bullet"
+ damage = 40
+ armour_penetration = 75
+
+/obj/item/projectile/bullet/mm195x129_hp
+ name = "1.95x129mm hollow-point bullet"
+ damage = 60
+ armour_penetration = -60
+
+/obj/item/projectile/bullet/incendiary/mm195x129
+ name = "1.95x129mm incendiary bullet"
+ damage = 15
+ fire_stacks = 3
diff --git a/code/modules/projectiles/projectile/bullets/pistol.dm b/code/modules/projectiles/projectile/bullets/pistol.dm
new file mode 100644
index 0000000000..ac14fa563c
--- /dev/null
+++ b/code/modules/projectiles/projectile/bullets/pistol.dm
@@ -0,0 +1,36 @@
+// 9mm (Stechkin APS)
+
+/obj/item/projectile/bullet/c9mm
+ name = "9mm bullet"
+ damage = 20
+
+/obj/item/projectile/bullet/c9mm_ap
+ name = "9mm armor-piercing bullet"
+ damage = 15
+ armour_penetration = 40
+
+/obj/item/projectile/bullet/incendiary/c9mm
+ name = "9mm incendiary bullet"
+ damage = 10
+ fire_stacks = 1
+
+// 10mm (Stechkin)
+
+/obj/item/projectile/bullet/c10mm
+ name = "10mm bullet"
+ damage = 30
+
+/obj/item/projectile/bullet/c10mm_ap
+ name = "10mm armor-piercing bullet"
+ damage = 27
+ armour_penetration = 40
+
+/obj/item/projectile/bullet/c10mm_hp
+ name = "10mm hollow-point bullet"
+ damage = 40
+ armour_penetration = -50
+
+/obj/item/projectile/bullet/incendiary/c10mm
+ name = "10mm incendiary bullet"
+ damage = 15
+ fire_stacks = 2
diff --git a/code/modules/projectiles/projectile/bullets/revolver.dm b/code/modules/projectiles/projectile/bullets/revolver.dm
new file mode 100644
index 0000000000..fc4ed0fa50
--- /dev/null
+++ b/code/modules/projectiles/projectile/bullets/revolver.dm
@@ -0,0 +1,25 @@
+// 7.62x38mmR (Nagant Revolver)
+
+/obj/item/projectile/bullet/n762
+ name = "7.62x38mmR bullet"
+ damage = 60
+
+// .50AE (Desert Eagle)
+
+/obj/item/projectile/bullet/a50AE
+ name = ".50AE bullet"
+ damage = 60
+
+// .38 (Detective's Gun)
+
+/obj/item/projectile/bullet/c38
+ name = ".38 bullet"
+ damage = 15
+ knockdown = 60
+ stamina = 50
+
+// .357 (Syndie Revolver)
+
+/obj/item/projectile/bullet/a357
+ name = ".357 bullet"
+ damage = 60
diff --git a/code/modules/projectiles/projectile/bullets/rifle.dm b/code/modules/projectiles/projectile/bullets/rifle.dm
new file mode 100644
index 0000000000..a019c05ef1
--- /dev/null
+++ b/code/modules/projectiles/projectile/bullets/rifle.dm
@@ -0,0 +1,16 @@
+// 5.56mm (M-90gl Carbine)
+
+/obj/item/projectile/bullet/a556
+ name = "5.56mm bullet"
+ damage = 35
+
+// 7.62 (Nagant Rifle)
+
+/obj/item/projectile/bullet/a762
+ name = "7.62 bullet"
+ damage = 60
+
+/obj/item/projectile/bullet/a762_enchanted
+ name = "enchanted 7.62 bullet"
+ damage = 5
+ stamina = 80
diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm
new file mode 100644
index 0000000000..ecbe2e96e4
--- /dev/null
+++ b/code/modules/projectiles/projectile/bullets/shotgun.dm
@@ -0,0 +1,95 @@
+/obj/item/projectile/bullet/shotgun_slug
+ name = "12g shotgun slug"
+ damage = 60
+
+/obj/item/projectile/bullet/shotgun_beanbag
+ name = "beanbag slug"
+ damage = 5
+ stamina = 80
+
+/obj/item/projectile/bullet/incendiary/shotgun
+ name = "incendiary slug"
+ damage = 20
+
+/obj/item/projectile/bullet/incendiary/shotgun/dragonsbreath
+ name = "dragonsbreath pellet"
+ damage = 5
+
+/obj/item/projectile/bullet/shotgun_stunslug
+ name = "stunslug"
+ damage = 5
+ knockdown = 100
+ stutter = 5
+ jitter = 20
+ range = 7
+ icon_state = "spark"
+ color = "#FFFF00"
+
+/obj/item/projectile/bullet/shotgun_meteorslug
+ name = "meteorslug"
+ icon = 'icons/obj/meteor.dmi'
+ icon_state = "dust"
+ damage = 20
+ knockdown = 80
+ hitsound = 'sound/effects/meteorimpact.ogg'
+
+/obj/item/projectile/bullet/shotgun_meteorslug/on_hit(atom/target, blocked = FALSE)
+ . = ..()
+ if(ismovableatom(target))
+ var/atom/movable/M = target
+ var/atom/throw_target = get_edge_target_turf(M, get_dir(src, get_step_away(M, src)))
+ M.throw_at(throw_target, 3, 2)
+
+/obj/item/projectile/bullet/shotgun_meteorslug/Initialize()
+ . = ..()
+ SpinAnimation()
+
+/obj/item/projectile/bullet/shotgun_frag12
+ name ="frag12 slug"
+ damage = 25
+ knockdown = 50
+
+/obj/item/projectile/bullet/shotgun_frag12/on_hit(atom/target, blocked = FALSE)
+ ..()
+ explosion(target, -1, 0, 1)
+ return TRUE
+
+/obj/item/projectile/bullet/pellet
+ var/tile_dropoff = 0.75
+ var/tile_dropoff_s = 1.25
+
+/obj/item/projectile/bullet/pellet/shotgun_buckshot
+ name = "buckshot pellet"
+ damage = 12.5
+
+/obj/item/projectile/bullet/pellet/shotgun_rubbershot
+ name = "rubbershot pellet"
+ damage = 3
+ stamina = 25
+
+/obj/item/projectile/bullet/pellet/Range()
+ ..()
+ if(damage > 0)
+ damage -= tile_dropoff
+ if(stamina > 0)
+ stamina -= tile_dropoff_s
+ if(damage < 0 && stamina < 0)
+ qdel(src)
+
+/obj/item/projectile/bullet/pellet/shotgun_improvised
+ tile_dropoff = 0.55 //Come on it does 6 damage don't be like that.
+ damage = 6
+
+/obj/item/projectile/bullet/pellet/shotgun_improvised/Initialize()
+ . = ..()
+ range = rand(1, 8)
+
+/obj/item/projectile/bullet/pellet/shotgun_improvised/on_range()
+ do_sparks(1, TRUE, src)
+ ..()
+
+// Mech Scattershot
+
+/obj/item/projectile/bullet/scattershot
+ damage = 20
+ stamina = 65
diff --git a/code/modules/projectiles/projectile/bullets/smg.dm b/code/modules/projectiles/projectile/bullets/smg.dm
new file mode 100644
index 0000000000..50532a5977
--- /dev/null
+++ b/code/modules/projectiles/projectile/bullets/smg.dm
@@ -0,0 +1,26 @@
+// .45 (M1911 & C20r)
+
+/obj/item/projectile/bullet/c45
+ name = ".45 bullet"
+ damage = 20
+ stamina = 65
+
+/obj/item/projectile/bullet/c45_nostamina
+ name = ".45 bullet"
+ damage = 30
+
+// 4.6x30mm (Autorifles)
+
+/obj/item/projectile/bullet/c46x30mm
+ name = "4.6x30mm bullet"
+ damage = 20
+
+/obj/item/projectile/bullet/c46x30mm_ap
+ name = "4.6x30mm armor-piercing bullet"
+ damage = 15
+ armour_penetration = 40
+
+/obj/item/projectile/bullet/incendiary/c46x30mm
+ name = "4.6x30mm incendiary bullet"
+ damage = 10
+ fire_stacks = 1
diff --git a/code/modules/projectiles/projectile/bullets/sniper.dm b/code/modules/projectiles/projectile/bullets/sniper.dm
new file mode 100644
index 0000000000..d29cb70440
--- /dev/null
+++ b/code/modules/projectiles/projectile/bullets/sniper.dm
@@ -0,0 +1,39 @@
+// .50 (Sniper)
+
+/obj/item/projectile/bullet/p50
+ name =".50 bullet"
+ speed = 0.4
+ damage = 70
+ knockdown = 100
+ dismemberment = 50
+ armour_penetration = 50
+ var/breakthings = TRUE
+
+/obj/item/projectile/bullet/p50/on_hit(atom/target, blocked = 0)
+ if((blocked != 100) && (!ismob(target) && breakthings))
+ target.ex_act(rand(1,2))
+ return ..()
+
+/obj/item/projectile/bullet/p50/soporific
+ name =".50 soporific bullet"
+ armour_penetration = 0
+ nodamage = TRUE
+ dismemberment = 0
+ knockdown = 0
+ breakthings = FALSE
+
+/obj/item/projectile/bullet/p50/soporific/on_hit(atom/target, blocked = FALSE)
+ if((blocked != 100) && isliving(target))
+ var/mob/living/L = target
+ L.Sleeping(400)
+ return ..()
+
+/obj/item/projectile/bullet/p50/penetrator
+ name =".50 penetrator bullet"
+ icon_state = "gauss"
+ name = "penetrator round"
+ damage = 60
+ forcedodge = TRUE
+ dismemberment = 0 //It goes through you cleanly.
+ knockdown = 0
+ breakthings = FALSE
diff --git a/code/modules/projectiles/projectile/bullets/special.dm b/code/modules/projectiles/projectile/bullets/special.dm
new file mode 100644
index 0000000000..091dff454c
--- /dev/null
+++ b/code/modules/projectiles/projectile/bullets/special.dm
@@ -0,0 +1,26 @@
+// Honker
+
+/obj/item/projectile/bullet/honker
+ damage = 0
+ knockdown = 60
+ forcedodge = TRUE
+ nodamage = TRUE
+ hitsound = 'sound/items/bikehorn.ogg'
+ icon = 'icons/obj/hydroponics/harvest.dmi'
+ icon_state = "banana"
+ range = 200
+
+/obj/item/projectile/bullet/honker/Initialize()
+ . = ..()
+ SpinAnimation()
+
+// Mime
+
+/obj/item/projectile/bullet/mime
+ damage = 20
+
+/obj/item/projectile/bullet/mime/on_hit(atom/target, blocked = FALSE)
+ . = ..()
+ if(iscarbon(target))
+ var/mob/living/carbon/M = target
+ M.silent = max(M.silent, 10)
diff --git a/code/modules/projectiles/projectile/energy/_energy.dm b/code/modules/projectiles/projectile/energy/_energy.dm
new file mode 100644
index 0000000000..3df1eb74d3
--- /dev/null
+++ b/code/modules/projectiles/projectile/energy/_energy.dm
@@ -0,0 +1,8 @@
+/obj/item/projectile/energy
+ name = "energy"
+ icon_state = "spark"
+ damage = 0
+ damage_type = BURN
+ flag = "energy"
+ is_reflectable = TRUE
+
diff --git a/code/modules/projectiles/projectile/energy/chameleon.dm b/code/modules/projectiles/projectile/energy/chameleon.dm
new file mode 100644
index 0000000000..8ed6283c51
--- /dev/null
+++ b/code/modules/projectiles/projectile/energy/chameleon.dm
@@ -0,0 +1,3 @@
+/obj/item/projectile/energy/chameleon
+ nodamage = TRUE
+
diff --git a/code/modules/projectiles/projectile/energy/ebow.dm b/code/modules/projectiles/projectile/energy/ebow.dm
new file mode 100644
index 0000000000..3e65bbfad2
--- /dev/null
+++ b/code/modules/projectiles/projectile/energy/ebow.dm
@@ -0,0 +1,15 @@
+/obj/item/projectile/energy/bolt //ebow bolts
+ name = "bolt"
+ icon_state = "cbbolt"
+ damage = 8
+ damage_type = TOX
+ nodamage = 0
+ knockdown = 100
+ stutter = 5
+
+/obj/item/projectile/energy/bolt/halloween
+ name = "candy corn"
+ icon_state = "candy_corn"
+
+/obj/item/projectile/energy/bolt/large
+ damage = 20
diff --git a/code/modules/projectiles/projectile/energy/misc.dm b/code/modules/projectiles/projectile/energy/misc.dm
new file mode 100644
index 0000000000..21c3138add
--- /dev/null
+++ b/code/modules/projectiles/projectile/energy/misc.dm
@@ -0,0 +1,15 @@
+/obj/item/projectile/energy/declone
+ name = "radiation beam"
+ icon_state = "declone"
+ damage = 20
+ damage_type = CLONE
+ irradiate = 10
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser
+
+/obj/item/projectile/energy/dart //ninja throwing dart
+ name = "dart"
+ icon_state = "toxin"
+ damage = 5
+ damage_type = TOX
+ knockdown = 100
+ range = 7
diff --git a/code/modules/projectiles/projectile/energy/net_snare.dm b/code/modules/projectiles/projectile/energy/net_snare.dm
new file mode 100644
index 0000000000..48544d1c28
--- /dev/null
+++ b/code/modules/projectiles/projectile/energy/net_snare.dm
@@ -0,0 +1,98 @@
+/obj/item/projectile/energy/net
+ name = "energy netting"
+ icon_state = "e_netting"
+ damage = 10
+ damage_type = STAMINA
+ hitsound = 'sound/weapons/taserhit.ogg'
+ range = 10
+
+/obj/item/projectile/energy/net/Initialize()
+ . = ..()
+ SpinAnimation()
+
+/obj/item/projectile/energy/net/on_hit(atom/target, blocked = FALSE)
+ if(isliving(target))
+ var/turf/Tloc = get_turf(target)
+ if(!locate(/obj/effect/nettingportal) in Tloc)
+ new /obj/effect/nettingportal(Tloc)
+ ..()
+
+/obj/item/projectile/energy/net/on_range()
+ do_sparks(1, TRUE, src)
+ ..()
+
+/obj/effect/nettingportal
+ name = "DRAGnet teleportation field"
+ desc = "A field of bluespace energy, locking on to teleport a target."
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "dragnetfield"
+ light_range = 3
+ anchored = TRUE
+
+/obj/effect/nettingportal/Initialize()
+ . = ..()
+ var/obj/item/device/beacon/teletarget = null
+ for(var/obj/machinery/computer/teleporter/com in GLOB.machines)
+ if(com.target)
+ if(com.power_station && com.power_station.teleporter_hub && com.power_station.engaged)
+ teletarget = com.target
+
+ addtimer(CALLBACK(src, .proc/pop, teletarget), 30)
+
+/obj/effect/nettingportal/proc/pop(teletarget)
+ if(teletarget)
+ for(var/mob/living/L in get_turf(src))
+ do_teleport(L, teletarget, 2)//teleport what's in the tile to the beacon
+ else
+ for(var/mob/living/L in get_turf(src))
+ do_teleport(L, L, 15) //Otherwise it just warps you off somewhere.
+
+ qdel(src)
+
+/obj/effect/nettingportal/singularity_act()
+ return
+
+/obj/effect/nettingportal/singularity_pull()
+ return
+
+/obj/item/projectile/energy/trap
+ name = "energy snare"
+ icon_state = "e_snare"
+ nodamage = 1
+ knockdown = 20
+ hitsound = 'sound/weapons/taserhit.ogg'
+ range = 4
+
+/obj/item/projectile/energy/trap/on_hit(atom/target, blocked = FALSE)
+ if(!ismob(target) || blocked >= 100) //Fully blocked by mob or collided with dense object - drop a trap
+ new/obj/item/restraints/legcuffs/beartrap/energy(get_turf(loc))
+ else if(iscarbon(target))
+ var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy(get_turf(target))
+ B.Crossed(target)
+ ..()
+
+/obj/item/projectile/energy/trap/on_range()
+ new /obj/item/restraints/legcuffs/beartrap/energy(loc)
+ ..()
+
+/obj/item/projectile/energy/trap/cyborg
+ name = "Energy Bola"
+ icon_state = "e_snare"
+ nodamage = 1
+ knockdown = 0
+ hitsound = 'sound/weapons/taserhit.ogg'
+ range = 10
+
+/obj/item/projectile/energy/trap/cyborg/on_hit(atom/target, blocked = FALSE)
+ if(!ismob(target) || blocked >= 100)
+ do_sparks(1, TRUE, src)
+ qdel(src)
+ if(iscarbon(target))
+ var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy/cyborg(get_turf(target))
+ B.Crossed(target)
+ QDEL_IN(src, 10)
+ ..()
+
+/obj/item/projectile/energy/trap/cyborg/on_range()
+ do_sparks(1, TRUE, src)
+ qdel(src)
diff --git a/code/modules/projectiles/projectile/energy/stun.dm b/code/modules/projectiles/projectile/energy/stun.dm
new file mode 100644
index 0000000000..3b04febae3
--- /dev/null
+++ b/code/modules/projectiles/projectile/energy/stun.dm
@@ -0,0 +1,31 @@
+/obj/item/projectile/energy/electrode
+ name = "electrode"
+ icon_state = "spark"
+ color = "#FFFF00"
+ nodamage = 1
+ knockdown = 100
+ stutter = 5
+ jitter = 20
+ hitsound = 'sound/weapons/taserhit.ogg'
+ range = 7
+ tracer_type = /obj/effect/projectile/tracer/stun
+ muzzle_type = /obj/effect/projectile/muzzle/stun
+ impact_type = /obj/effect/projectile/impact/stun
+
+/obj/item/projectile/energy/electrode/on_hit(atom/target, blocked = FALSE)
+ . = ..()
+ if(!ismob(target) || blocked >= 100) //Fully blocked by mob or collided with dense object - burst into sparks!
+ do_sparks(1, TRUE, src)
+ else if(iscarbon(target))
+ var/mob/living/carbon/C = target
+ GET_COMPONENT_FROM(mood, /datum/component/mood, C)
+ if(mood)
+ mood.add_event("tased", /datum/mood_event/tased)
+ if(C.dna && C.dna.check_mutation(HULK))
+ C.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
+ else if((C.status_flags & CANKNOCKDOWN) && !C.has_trait(TRAIT_STUNIMMUNE))
+ addtimer(CALLBACK(C, /mob/living/carbon.proc/do_jitter_animation, jitter), 5)
+
+/obj/item/projectile/energy/electrode/on_range() //to ensure the bolt sparks when it reaches the end of its range if it didn't hit a target yet
+ do_sparks(1, TRUE, src)
+ ..()
diff --git a/code/modules/projectiles/projectile/energy/tesla.dm b/code/modules/projectiles/projectile/energy/tesla.dm
new file mode 100644
index 0000000000..6eebd6afbf
--- /dev/null
+++ b/code/modules/projectiles/projectile/energy/tesla.dm
@@ -0,0 +1,31 @@
+/obj/item/projectile/energy/tesla
+ name = "tesla bolt"
+ icon_state = "tesla_projectile"
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser
+ var/chain
+
+/obj/item/projectile/energy/tesla/fire(setAngle)
+ if(firer)
+ chain = firer.Beam(src, icon_state = "lightning[rand(1, 12)]", time = INFINITY, maxdistance = INFINITY)
+ ..()
+
+/obj/item/projectile/energy/tesla/Destroy()
+ qdel(chain)
+ return ..()
+
+/obj/item/projectile/energy/tesla/revolver
+ name = "energy orb"
+
+/obj/item/projectile/energy/tesla/revolver/on_hit(atom/target)
+ . = ..()
+ if(isliving(target))
+ tesla_zap(target, 3, 10000)
+ qdel(src)
+
+/obj/item/projectile/energy/tesla/cannon
+ name = "tesla orb"
+
+/obj/item/projectile/energy/tesla/cannon/on_hit(atom/target)
+ . = ..()
+ tesla_zap(target, 3, 10000, explosive = FALSE, stun_mobs = FALSE)
+ qdel(src)
diff --git a/code/modules/projectiles/projectile/reusable/_reusable.dm b/code/modules/projectiles/projectile/reusable/_reusable.dm
new file mode 100644
index 0000000000..33c9678fe4
--- /dev/null
+++ b/code/modules/projectiles/projectile/reusable/_reusable.dm
@@ -0,0 +1,20 @@
+/obj/item/projectile/bullet/reusable
+ name = "reusable bullet"
+ desc = "How do you even reuse a bullet?"
+ var/ammo_type = /obj/item/ammo_casing/caseless
+ var/dropped = FALSE
+ impact_effect_type = null
+
+/obj/item/projectile/bullet/reusable/on_hit(atom/target, blocked = FALSE)
+ . = ..()
+ handle_drop()
+
+/obj/item/projectile/bullet/reusable/on_range()
+ handle_drop()
+ ..()
+
+/obj/item/projectile/bullet/reusable/proc/handle_drop()
+ if(!dropped)
+ var/turf/T = get_turf(src)
+ new ammo_type(T)
+ dropped = TRUE
diff --git a/code/modules/projectiles/projectile/reusable.dm b/code/modules/projectiles/projectile/reusable/foam_dart.dm
similarity index 59%
rename from code/modules/projectiles/projectile/reusable.dm
rename to code/modules/projectiles/projectile/reusable/foam_dart.dm
index ccd4b7589c..c7f99c75aa 100644
--- a/code/modules/projectiles/projectile/reusable.dm
+++ b/code/modules/projectiles/projectile/reusable/foam_dart.dm
@@ -1,69 +1,41 @@
-/obj/item/projectile/bullet/reusable
- name = "reusable bullet"
- desc = "How do you even reuse a bullet?"
- var/ammo_type = /obj/item/ammo_casing/caseless
- var/dropped = 0
- impact_effect_type = null
-
-/obj/item/projectile/bullet/reusable/on_hit(atom/target, blocked = FALSE)
- . = ..()
- handle_drop()
-
-/obj/item/projectile/bullet/reusable/on_range()
- handle_drop()
- ..()
-
-/obj/item/projectile/bullet/reusable/proc/handle_drop()
- if(!dropped)
- var/turf/T = get_turf(src)
- new ammo_type(T)
- dropped = 1
-
-/obj/item/projectile/bullet/reusable/magspear
- name = "magnetic spear"
- desc = "WHITE WHALE, HOLY GRAIL"
- damage = 30 //takes 3 spears to kill a mega carp, one to kill a normal carp
- icon_state = "magspear"
- ammo_type = /obj/item/ammo_casing/caseless/magspear
-
-/obj/item/projectile/bullet/reusable/foam_dart
- name = "foam dart"
- desc = "I hope you're wearing eye protection."
- damage = 0 // It's a damn toy.
- damage_type = OXY
- nodamage = 1
- icon = 'icons/obj/guns/toy.dmi'
- icon_state = "foamdart_proj"
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart
- range = 10
- var/modified = 0
- var/obj/item/pen/pen = null
-
-/obj/item/projectile/bullet/reusable/foam_dart/handle_drop()
- if(dropped)
- return
- var/turf/T = get_turf(src)
- dropped = 1
- var/obj/item/ammo_casing/caseless/foam_dart/newcasing = new ammo_type(T)
- newcasing.modified = modified
- var/obj/item/projectile/bullet/reusable/foam_dart/newdart = newcasing.BB
- newdart.modified = modified
- newdart.damage = damage
- newdart.nodamage = nodamage
- newdart.damage_type = damage_type
- if(pen)
- newdart.pen = pen
- pen.forceMove(newdart)
- pen = null
- newdart.update_icon()
-
-
-/obj/item/projectile/bullet/reusable/foam_dart/Destroy()
- pen = null
- return ..()
-
-/obj/item/projectile/bullet/reusable/foam_dart/riot
- name = "riot foam dart"
- icon_state = "foamdart_riot_proj"
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
- stamina = 25
+/obj/item/projectile/bullet/reusable/foam_dart
+ name = "foam dart"
+ desc = "I hope you're wearing eye protection."
+ damage = 0 // It's a damn toy.
+ damage_type = OXY
+ nodamage = 1
+ icon = 'icons/obj/guns/toy.dmi'
+ icon_state = "foamdart_proj"
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart
+ range = 10
+ var/modified = 0
+ var/obj/item/pen/pen = null
+
+/obj/item/projectile/bullet/reusable/foam_dart/handle_drop()
+ if(dropped)
+ return
+ var/turf/T = get_turf(src)
+ dropped = 1
+ var/obj/item/ammo_casing/caseless/foam_dart/newcasing = new ammo_type(T)
+ newcasing.modified = modified
+ var/obj/item/projectile/bullet/reusable/foam_dart/newdart = newcasing.BB
+ newdart.modified = modified
+ newdart.damage = damage
+ newdart.nodamage = nodamage
+ newdart.damage_type = damage_type
+ if(pen)
+ newdart.pen = pen
+ pen.forceMove(newdart)
+ pen = null
+ newdart.update_icon()
+
+
+/obj/item/projectile/bullet/reusable/foam_dart/Destroy()
+ pen = null
+ return ..()
+
+/obj/item/projectile/bullet/reusable/foam_dart/riot
+ name = "riot foam dart"
+ icon_state = "foamdart_riot_proj"
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
+ stamina = 25
diff --git a/code/modules/projectiles/projectile/reusable/magspear.dm b/code/modules/projectiles/projectile/reusable/magspear.dm
new file mode 100644
index 0000000000..7fcd6b80a6
--- /dev/null
+++ b/code/modules/projectiles/projectile/reusable/magspear.dm
@@ -0,0 +1,6 @@
+/obj/item/projectile/bullet/reusable/magspear
+ name = "magnetic spear"
+ desc = "WHITE WHALE, HOLY GRAIL"
+ damage = 30 //takes 3 spears to kill a mega carp, one to kill a normal carp
+ icon_state = "magspear"
+ ammo_type = /obj/item/ammo_casing/caseless/magspear
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
deleted file mode 100644
index e8f309309a..0000000000
--- a/code/modules/projectiles/projectile/special.dm
+++ /dev/null
@@ -1,617 +0,0 @@
-/obj/item/projectile/ion
- name = "ion bolt"
- icon_state = "ion"
- damage = 0
- damage_type = BURN
- nodamage = 1
- flag = "energy"
- impact_effect_type = /obj/effect/temp_visual/impact_effect/ion
-
-
-/obj/item/projectile/ion/on_hit(atom/target, blocked = FALSE)
- ..()
- empulse(target, 1, 1)
- return 1
-
-
-/obj/item/projectile/ion/weak
-
-/obj/item/projectile/ion/weak/on_hit(atom/target, blocked = FALSE)
- ..()
- empulse(target, 0, 0)
- return 1
-
-
-/obj/item/projectile/bullet/gyro
- name ="explosive bolt"
- icon_state= "bolter"
- damage = 50
-
-/obj/item/projectile/bullet/gyro/on_hit(atom/target, blocked = FALSE)
- ..()
- explosion(target, -1, 0, 2)
- return 1
-
-/obj/item/projectile/bullet/a84mm
- name ="anti-armour rocket"
- desc = "USE A WEEL GUN"
- icon_state= "atrocket"
- damage = 80
- var/anti_armour_damage = 200
- armour_penetration = 100
- dismemberment = 100
-
-/obj/item/projectile/bullet/a84mm/on_hit(atom/target, blocked = FALSE)
- ..()
- explosion(target, -1, 1, 3, 1, 0, flame_range = 4)
-
- if(ismecha(target))
- var/obj/mecha/M = target
- M.take_damage(anti_armour_damage)
- if(issilicon(target))
- var/mob/living/silicon/S = target
- S.take_overall_damage(anti_armour_damage*0.75, anti_armour_damage*0.25)
- return 1
-
-/obj/item/projectile/bullet/srmrocket
- name ="SRM-8 Rocket"
- desc = "Boom."
- icon_state = "missile"
- damage = 30
- ricochets_max = 0 //it's a MISSILE
-
-/obj/item/projectile/bullet/srmrocket/on_hit(atom/target, blocked=0)
- ..()
- if(!isliving(target)) //if the target isn't alive, so is a wall or something
- explosion(target, 0, 1, 2, 4)
- else
- explosion(target, 0, 0, 2, 4)
- return 1
-
-/obj/item/projectile/temp
- name = "freeze beam"
- icon_state = "ice_2"
- damage = 0
- damage_type = BURN
- nodamage = 1
- flag = "energy"
- var/temperature = 100
-
-
-/obj/item/projectile/temp/on_hit(atom/target, blocked = FALSE)//These two could likely check temp protection on the mob
- ..()
- if(isliving(target))
- var/mob/M = target
- M.bodytemperature = temperature
- return 1
-
-/obj/item/projectile/temp/hot
- name = "heat beam"
- temperature = 400
-
-/obj/item/projectile/meteor
- name = "meteor"
- icon = 'icons/obj/meteor.dmi'
- icon_state = "small1"
- damage = 0
- damage_type = BRUTE
- nodamage = 1
- flag = "bullet"
-
-/obj/item/projectile/meteor/Collide(atom/A)
- if(A == firer)
- forceMove(A.loc)
- return
- A.ex_act(EXPLODE_HEAVY)
- playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1)
- for(var/mob/M in urange(10, src))
- if(!M.stat)
- shake_camera(M, 3, 1)
- qdel(src)
-
-/obj/item/projectile/energy/floramut
- name = "alpha somatoray"
- icon_state = "energy"
- damage = 0
- damage_type = TOX
- nodamage = 1
- flag = "energy"
-
-/obj/item/projectile/energy/floramut/on_hit(atom/target, blocked = FALSE)
- . = ..()
- if(iscarbon(target))
- var/mob/living/carbon/C = target
- if(C.dna.species.id == "pod")
- C.randmuti()
- C.randmut()
- C.updateappearance()
- C.domutcheck()
-
-/obj/item/projectile/energy/florayield
- name = "beta somatoray"
- icon_state = "energy2"
- damage = 0
- damage_type = TOX
- nodamage = 1
- flag = "energy"
-
-/obj/item/projectile/beam/mindflayer
- name = "flayer ray"
-
-/obj/item/projectile/beam/mindflayer/on_hit(atom/target, blocked = FALSE)
- . = ..()
- if(ishuman(target))
- var/mob/living/carbon/human/M = target
- M.adjustBrainLoss(20)
- M.hallucination += 20
-
-/obj/item/projectile/beam/wormhole
- name = "bluespace beam"
- icon_state = "spark"
- hitsound = "sparks"
- damage = 3
- var/obj/item/gun/energy/wormhole_projector/gun
- color = "#33CCFF"
-
-/obj/item/projectile/beam/wormhole/orange
- name = "orange bluespace beam"
- color = "#FF6600"
-
-/obj/item/projectile/beam/wormhole/New(var/obj/item/ammo_casing/energy/wormhole/casing)
- if(casing)
- gun = casing.gun
-
-/obj/item/ammo_casing/energy/wormhole/New(var/obj/item/gun/energy/wormhole_projector/wh)
- gun = wh
-
-/obj/item/projectile/beam/wormhole/on_hit(atom/target)
- if(ismob(target))
- var/turf/portal_destination = pick(orange(6, src))
- do_teleport(target, portal_destination)
- return ..()
- if(!gun)
- qdel(src)
- gun.create_portal(src, get_turf(src))
-
-/obj/item/projectile/plasma
- name = "plasma blast"
- icon_state = "plasmacutter"
- damage_type = BRUTE
- damage = 20
- range = 4
- dismemberment = 20
- impact_effect_type = /obj/effect/temp_visual/impact_effect/purple_laser
- var/pressure_decrease_active = FALSE
- var/pressure_decrease = 0.25
- var/mine_range = 3 //mines this many additional tiles of rock
- tracer_type = /obj/effect/projectile/tracer/plasma_cutter
- muzzle_type = /obj/effect/projectile/muzzle/plasma_cutter
- impact_type = /obj/effect/projectile/impact/plasma_cutter
-
-/obj/item/projectile/plasma/Initialize()
- . = ..()
- if(!lavaland_equipment_pressure_check(get_turf(src)))
- name = "weakened [name]"
- damage = damage * pressure_decrease
- pressure_decrease_active = TRUE
-
-/obj/item/projectile/plasma/on_hit(atom/target)
- . = ..()
- if(ismineralturf(target))
- var/turf/closed/mineral/M = target
- M.gets_drilled(firer)
- if(mine_range)
- mine_range--
- range++
- if(range > 0)
- return -1
-
-/obj/item/projectile/plasma/adv
- damage = 28
- range = 5
- mine_range = 5
-
-/obj/item/projectile/plasma/adv/mech
- damage = 40
- range = 9
- mine_range = 3
-
-/obj/item/projectile/plasma/turret
- //Between normal and advanced for damage, made a beam so not the turret does not destroy glass
- name = "plasma beam"
- damage = 24
- range = 7
- pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
-
-
-/obj/item/projectile/gravityrepulse
- name = "repulsion bolt"
- icon = 'icons/effects/effects.dmi'
- icon_state = "chronofield"
- hitsound = 'sound/weapons/wave.ogg'
- damage = 0
- damage_type = BRUTE
- nodamage = 1
- color = "#33CCFF"
- var/turf/T
- var/power = 4
- var/list/thrown_items = list()
-
-/obj/item/projectile/gravityrepulse/Initialize()
- . = ..()
- var/obj/item/ammo_casing/energy/gravityrepulse/C = loc
- if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items
- power = min(C.gun.power, 15)
-
-/obj/item/projectile/gravityrepulse/on_hit()
- . = ..()
- T = get_turf(src)
- for(var/atom/movable/A in range(T, power))
- if(A == src || (firer && A == src.firer) || A.anchored || thrown_items[A])
- continue
- var/throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(A, src)))
- A.throw_at(throwtarget,power+1,1)
- thrown_items[A] = A
- for(var/turf/F in range(T,power))
- new /obj/effect/temp_visual/gravpush(F)
-
-/obj/item/projectile/gravityattract
- name = "attraction bolt"
- icon = 'icons/effects/effects.dmi'
- icon_state = "chronofield"
- hitsound = 'sound/weapons/wave.ogg'
- damage = 0
- damage_type = BRUTE
- nodamage = 1
- color = "#FF6600"
- var/turf/T
- var/power = 4
- var/list/thrown_items = list()
-
-/obj/item/projectile/gravityattract/Initialize()
- . = ..()
- var/obj/item/ammo_casing/energy/gravityattract/C = loc
- if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items
- power = min(C.gun.power, 15)
-
-/obj/item/projectile/gravityattract/on_hit()
- . = ..()
- T = get_turf(src)
- for(var/atom/movable/A in range(T, power))
- if(A == src || (firer && A == src.firer) || A.anchored || thrown_items[A])
- continue
- A.throw_at(T, power+1, 1)
- thrown_items[A] = A
- for(var/turf/F in range(T,power))
- new /obj/effect/temp_visual/gravpush(F)
-
-/obj/item/projectile/gravitychaos
- name = "gravitational blast"
- icon = 'icons/effects/effects.dmi'
- icon_state = "chronofield"
- hitsound = 'sound/weapons/wave.ogg'
- damage = 0
- damage_type = BRUTE
- nodamage = 1
- color = "#101010"
- var/turf/T
- var/power = 4
- var/list/thrown_items = list()
-
-/obj/item/projectile/gravitychaos/Initialize()
- . = ..()
- var/obj/item/ammo_casing/energy/gravitychaos/C = loc
- if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items
- power = min(C.gun.power, 15)
-
-/obj/item/projectile/gravitychaos/on_hit()
- . = ..()
- T = get_turf(src)
- for(var/atom/movable/A in range(T, power))
- if(A == src|| (firer && A == src.firer) || A.anchored || thrown_items[A])
- continue
- A.throw_at(get_edge_target_turf(A, pick(GLOB.cardinals)), power+1, 1)
- thrown_items[A] = A
- for(var/turf/Z in range(T,power))
- new /obj/effect/temp_visual/gravpush(Z)
-
-/obj/effect/ebeam/curse_arm
- name = "curse arm"
- layer = LARGE_MOB_LAYER
-
-/obj/item/projectile/curse_hand
- name = "curse hand"
- icon_state = "cursehand"
- hitsound = 'sound/effects/curse4.ogg'
- layer = LARGE_MOB_LAYER
- damage_type = BURN
- damage = 10
- knockdown = 20
- speed = 2
- range = 16
- forcedodge = TRUE
- var/datum/beam/arm
- var/handedness = 0
-
-/obj/item/projectile/curse_hand/Initialize(mapload)
- . = ..()
- handedness = prob(50)
- update_icon()
-
-/obj/item/projectile/curse_hand/update_icon()
- icon_state = "[icon_state][handedness]"
-
-/obj/item/projectile/curse_hand/fire(setAngle)
- if(starting)
- arm = starting.Beam(src, icon_state = "curse[handedness]", time = INFINITY, maxdistance = INFINITY, beam_type=/obj/effect/ebeam/curse_arm)
- ..()
-
-/obj/item/projectile/curse_hand/prehit(atom/target)
- if(target == original)
- forcedodge = FALSE
- else if(!isturf(target))
- return FALSE
- return ..()
-
-/obj/item/projectile/curse_hand/Destroy()
- if(arm)
- arm.End()
- arm = null
- if(forcedodge)
- playsound(src, 'sound/effects/curse3.ogg', 25, 1, -1)
- var/turf/T = get_step(src, dir)
- new/obj/effect/temp_visual/dir_setting/curse/hand(T, dir, handedness)
- for(var/obj/effect/temp_visual/dir_setting/curse/grasp_portal/G in starting)
- qdel(G)
- new /obj/effect/temp_visual/dir_setting/curse/grasp_portal/fading(starting, dir)
- var/datum/beam/D = starting.Beam(T, icon_state = "curse[handedness]", time = 32, maxdistance = INFINITY, beam_type=/obj/effect/ebeam/curse_arm, beam_sleep_time = 1)
- for(var/b in D.elements)
- var/obj/effect/ebeam/B = b
- animate(B, alpha = 0, time = 32)
- return ..()
-
-/obj/item/projectile/hallucination
- name = "bullet"
- icon = null
- icon_state = null
- hitsound = ""
- suppressed = TRUE
- ricochets_max = 0
- ricochet_chance = 0
- damage = 0
- nodamage = TRUE
- projectile_type = /obj/item/projectile/hallucination
- log_override = TRUE
- var/hal_icon_state
- var/image/fake_icon
- var/mob/living/carbon/hal_target
- var/hal_fire_sound
- var/hal_hitsound
- var/hal_hitsound_wall
- var/hal_impact_effect
- var/hal_impact_effect_wall
- var/hit_duration
- var/hit_duration_wall
-
-/obj/item/projectile/hallucination/fire()
- ..()
- fake_icon = image('icons/obj/projectiles.dmi', src, hal_icon_state, ABOVE_MOB_LAYER)
- if(hal_target.client)
- hal_target.client.images += fake_icon
-
-/obj/item/projectile/hallucination/Destroy()
- if(hal_target.client)
- hal_target.client.images -= fake_icon
- QDEL_NULL(fake_icon)
- return ..()
-
-/obj/item/projectile/hallucination/Collide(atom/A)
- if(!ismob(A))
- if(hal_hitsound_wall)
- hal_target.playsound_local(loc, hal_hitsound_wall, 40, 1)
- if(hal_impact_effect_wall)
- spawn_hit(A, TRUE)
- else if(A == hal_target)
- if(hal_hitsound)
- hal_target.playsound_local(A, hal_hitsound, 100, 1)
- target_on_hit(A)
- qdel(src)
- return TRUE
-
-/obj/item/projectile/hallucination/proc/target_on_hit(mob/M)
- if(M == hal_target)
- to_chat(hal_target, "[M] is hit by \a [src] in the chest! ")
- hal_apply_effect()
- else if(M in view(hal_target))
- to_chat(hal_target, "[M] is hit by \a [src] in the chest!! ")
- if(damage_type == BRUTE)
- var/splatter_dir = dir
- if(starting)
- splatter_dir = get_dir(starting, get_turf(M))
- spawn_blood(M, splatter_dir)
- else if(hal_impact_effect)
- spawn_hit(M, FALSE)
-
-/obj/item/projectile/hallucination/proc/spawn_blood(mob/M, set_dir)
- set waitfor = 0
- if(!hal_target.client)
- return
-
- var/splatter_icon_state
- if(set_dir in GLOB.diagonals)
- splatter_icon_state = "splatter[pick(1, 2, 6)]"
- else
- splatter_icon_state = "splatter[pick(3, 4, 5)]"
-
- var/image/blood = image('icons/effects/blood.dmi', M, splatter_icon_state, ABOVE_MOB_LAYER)
- var/target_pixel_x = 0
- var/target_pixel_y = 0
- switch(set_dir)
- if(NORTH)
- target_pixel_y = 16
- if(SOUTH)
- target_pixel_y = -16
- layer = ABOVE_MOB_LAYER
- if(EAST)
- target_pixel_x = 16
- if(WEST)
- target_pixel_x = -16
- if(NORTHEAST)
- target_pixel_x = 16
- target_pixel_y = 16
- if(NORTHWEST)
- target_pixel_x = -16
- target_pixel_y = 16
- if(SOUTHEAST)
- target_pixel_x = 16
- target_pixel_y = -16
- layer = ABOVE_MOB_LAYER
- if(SOUTHWEST)
- target_pixel_x = -16
- target_pixel_y = -16
- layer = ABOVE_MOB_LAYER
- hal_target.client.images += blood
- animate(blood, pixel_x = target_pixel_x, pixel_y = target_pixel_y, alpha = 0, time = 5)
- addtimer(CALLBACK(src, .proc/cleanup_blood), 5)
-
-/obj/item/projectile/hallucination/proc/cleanup_blood(image/blood)
- hal_target.client.images -= blood
- qdel(blood)
-
-/obj/item/projectile/hallucination/proc/spawn_hit(atom/A, is_wall)
- set waitfor = 0
- if(!hal_target.client)
- return
-
- var/image/hit_effect = image('icons/effects/blood.dmi', A, is_wall ? hal_impact_effect_wall : hal_impact_effect, ABOVE_MOB_LAYER)
- hit_effect.pixel_x = A.pixel_x + rand(-4,4)
- hit_effect.pixel_y = A.pixel_y + rand(-4,4)
- hal_target.client.images += hit_effect
- sleep(is_wall ? hit_duration_wall : hit_duration)
- hal_target.client.images -= hit_effect
- qdel(hit_effect)
-
-
-/obj/item/projectile/hallucination/proc/hal_apply_effect()
- return
-
-/obj/item/projectile/hallucination/bullet
- name = "bullet"
- hal_icon_state = "bullet"
- hal_fire_sound = "gunshot"
- hal_hitsound = 'sound/weapons/pierce.ogg'
- hal_hitsound_wall = "ricochet"
- hal_impact_effect = "impact_bullet"
- hal_impact_effect_wall = "impact_bullet"
- hit_duration = 5
- hit_duration_wall = 5
-
-/obj/item/projectile/hallucination/bullet/hal_apply_effect()
- hal_target.adjustStaminaLoss(60)
-
-/obj/item/projectile/hallucination/laser
- name = "laser"
- damage_type = BURN
- hal_icon_state = "laser"
- hal_fire_sound = 'sound/weapons/laser.ogg'
- hal_hitsound = 'sound/weapons/sear.ogg'
- hal_hitsound_wall = 'sound/weapons/effects/searwall.ogg'
- hal_impact_effect = "impact_laser"
- hal_impact_effect_wall = "impact_laser_wall"
- hit_duration = 4
- hit_duration_wall = 10
- pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
-
-/obj/item/projectile/hallucination/laser/hal_apply_effect()
- hal_target.adjustStaminaLoss(20)
- hal_target.blur_eyes(2)
-
-/obj/item/projectile/hallucination/taser
- name = "electrode"
- damage_type = BURN
- hal_icon_state = "spark"
- color = "#FFFF00"
- hal_fire_sound = 'sound/weapons/taser.ogg'
- hal_hitsound = 'sound/weapons/taserhit.ogg'
- hal_hitsound_wall = null
- hal_impact_effect = null
- hal_impact_effect_wall = null
-
-/obj/item/projectile/hallucination/taser/hal_apply_effect()
- hal_target.Knockdown(100)
- hal_target.stuttering += 20
- if(hal_target.dna && hal_target.dna.check_mutation(HULK))
- hal_target.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
- else if((hal_target.status_flags & CANKNOCKDOWN) && !hal_target.has_trait(TRAIT_STUNIMMUNE))
- addtimer(CALLBACK(hal_target, /mob/living/carbon.proc/do_jitter_animation, 20), 5)
-
-/obj/item/projectile/hallucination/disabler
- name = "disabler beam"
- damage_type = STAMINA
- hal_icon_state = "omnilaser"
- hal_fire_sound = 'sound/weapons/taser2.ogg'
- hal_hitsound = 'sound/weapons/tap.ogg'
- hal_hitsound_wall = 'sound/weapons/effects/searwall.ogg'
- hal_impact_effect = "impact_laser_blue"
- hal_impact_effect_wall = null
- hit_duration = 4
- pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
-
-/obj/item/projectile/hallucination/disabler/hal_apply_effect()
- hal_target.adjustStaminaLoss(25)
-
-/obj/item/projectile/hallucination/ebow
- name = "bolt"
- damage_type = TOX
- hal_icon_state = "cbbolt"
- hal_fire_sound = 'sound/weapons/genhit.ogg'
- hal_hitsound = null
- hal_hitsound_wall = null
- hal_impact_effect = null
- hal_impact_effect_wall = null
-
-/obj/item/projectile/hallucination/ebow/hal_apply_effect()
- hal_target.Knockdown(100)
- hal_target.stuttering += 5
- hal_target.adjustStaminaLoss(8)
-
-/obj/item/projectile/hallucination/change
- name = "bolt of change"
- damage_type = BURN
- hal_icon_state = "ice_1"
- hal_fire_sound = 'sound/magic/staff_change.ogg'
- hal_hitsound = null
- hal_hitsound_wall = null
- hal_impact_effect = null
- hal_impact_effect_wall = null
-
-/obj/item/projectile/hallucination/change/hal_apply_effect()
- new /datum/hallucination/self_delusion(hal_target, TRUE, wabbajack = FALSE)
-
-/obj/item/projectile/hallucination/death
- name = "bolt of death"
- damage_type = BURN
- hal_icon_state = "pulse1_bl"
- hal_fire_sound = 'sound/magic/wandodeath.ogg'
- hal_hitsound = null
- hal_hitsound_wall = null
- hal_impact_effect = null
- hal_impact_effect_wall = null
-
-/obj/item/projectile/hallucination/death/hal_apply_effect()
- new /datum/hallucination/death(hal_target, TRUE)
-
-// Neurotoxin
-
-/obj/item/projectile/bullet/neurotoxin
- name = "neurotoxin spit"
- icon_state = "neurotoxin"
- damage = 5
- damage_type = TOX
- knockdown = 100
-
-/obj/item/projectile/bullet/neurotoxin/on_hit(atom/target, blocked = FALSE)
- if(isalien(target))
- knockdown = 0
- nodamage = TRUE
- return ..()
diff --git a/code/modules/projectiles/projectile/special/curse.dm b/code/modules/projectiles/projectile/special/curse.dm
new file mode 100644
index 0000000000..e5ac8126dd
--- /dev/null
+++ b/code/modules/projectiles/projectile/special/curse.dm
@@ -0,0 +1,55 @@
+/obj/effect/ebeam/curse_arm
+ name = "curse arm"
+ layer = LARGE_MOB_LAYER
+
+/obj/item/projectile/curse_hand
+ name = "curse hand"
+ icon_state = "cursehand"
+ hitsound = 'sound/effects/curse4.ogg'
+ layer = LARGE_MOB_LAYER
+ damage_type = BURN
+ damage = 10
+ knockdown = 20
+ speed = 2
+ range = 16
+ forcedodge = TRUE
+ var/datum/beam/arm
+ var/handedness = 0
+
+/obj/item/projectile/curse_hand/Initialize(mapload)
+ . = ..()
+ handedness = prob(50)
+ update_icon()
+
+/obj/item/projectile/curse_hand/update_icon()
+ icon_state = "[icon_state][handedness]"
+
+/obj/item/projectile/curse_hand/fire(setAngle)
+ if(starting)
+ arm = starting.Beam(src, icon_state = "curse[handedness]", time = INFINITY, maxdistance = INFINITY, beam_type=/obj/effect/ebeam/curse_arm)
+ ..()
+
+/obj/item/projectile/curse_hand/prehit(atom/target)
+ if(target == original)
+ forcedodge = FALSE
+ else if(!isturf(target))
+ return FALSE
+ return ..()
+
+/obj/item/projectile/curse_hand/Destroy()
+ if(arm)
+ arm.End()
+ arm = null
+ if(forcedodge)
+ playsound(src, 'sound/effects/curse3.ogg', 25, 1, -1)
+ var/turf/T = get_step(src, dir)
+ new/obj/effect/temp_visual/dir_setting/curse/hand(T, dir, handedness)
+ for(var/obj/effect/temp_visual/dir_setting/curse/grasp_portal/G in starting)
+ qdel(G)
+ new /obj/effect/temp_visual/dir_setting/curse/grasp_portal/fading(starting, dir)
+ var/datum/beam/D = starting.Beam(T, icon_state = "curse[handedness]", time = 32, maxdistance = INFINITY, beam_type=/obj/effect/ebeam/curse_arm, beam_sleep_time = 1)
+ for(var/b in D.elements)
+ var/obj/effect/ebeam/B = b
+ animate(B, alpha = 0, time = 32)
+ return ..()
+
diff --git a/code/modules/projectiles/projectile/special/floral.dm b/code/modules/projectiles/projectile/special/floral.dm
new file mode 100644
index 0000000000..295f89148a
--- /dev/null
+++ b/code/modules/projectiles/projectile/special/floral.dm
@@ -0,0 +1,25 @@
+/obj/item/projectile/energy/floramut
+ name = "alpha somatoray"
+ icon_state = "energy"
+ damage = 0
+ damage_type = TOX
+ nodamage = 1
+ flag = "energy"
+
+/obj/item/projectile/energy/floramut/on_hit(atom/target, blocked = FALSE)
+ . = ..()
+ if(iscarbon(target))
+ var/mob/living/carbon/C = target
+ if(C.dna.species.id == "pod")
+ C.randmuti()
+ C.randmut()
+ C.updateappearance()
+ C.domutcheck()
+
+/obj/item/projectile/energy/florayield
+ name = "beta somatoray"
+ icon_state = "energy2"
+ damage = 0
+ damage_type = TOX
+ nodamage = 1
+ flag = "energy"
diff --git a/code/modules/projectiles/projectile/special/gravity.dm b/code/modules/projectiles/projectile/special/gravity.dm
new file mode 100644
index 0000000000..89f753d36d
--- /dev/null
+++ b/code/modules/projectiles/projectile/special/gravity.dm
@@ -0,0 +1,90 @@
+/obj/item/projectile/gravityrepulse
+ name = "repulsion bolt"
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "chronofield"
+ hitsound = 'sound/weapons/wave.ogg'
+ damage = 0
+ damage_type = BRUTE
+ nodamage = 1
+ color = "#33CCFF"
+ var/turf/T
+ var/power = 4
+ var/list/thrown_items = list()
+
+/obj/item/projectile/gravityrepulse/Initialize()
+ . = ..()
+ var/obj/item/ammo_casing/energy/gravityrepulse/C = loc
+ if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items
+ power = min(C.gun.power, 15)
+
+/obj/item/projectile/gravityrepulse/on_hit()
+ . = ..()
+ T = get_turf(src)
+ for(var/atom/movable/A in range(T, power))
+ if(A == src || (firer && A == src.firer) || A.anchored || thrown_items[A])
+ continue
+ var/throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(A, src)))
+ A.throw_at(throwtarget,power+1,1)
+ thrown_items[A] = A
+ for(var/turf/F in range(T,power))
+ new /obj/effect/temp_visual/gravpush(F)
+
+/obj/item/projectile/gravityattract
+ name = "attraction bolt"
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "chronofield"
+ hitsound = 'sound/weapons/wave.ogg'
+ damage = 0
+ damage_type = BRUTE
+ nodamage = 1
+ color = "#FF6600"
+ var/turf/T
+ var/power = 4
+ var/list/thrown_items = list()
+
+/obj/item/projectile/gravityattract/Initialize()
+ . = ..()
+ var/obj/item/ammo_casing/energy/gravityattract/C = loc
+ if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items
+ power = min(C.gun.power, 15)
+
+/obj/item/projectile/gravityattract/on_hit()
+ . = ..()
+ T = get_turf(src)
+ for(var/atom/movable/A in range(T, power))
+ if(A == src || (firer && A == src.firer) || A.anchored || thrown_items[A])
+ continue
+ A.throw_at(T, power+1, 1)
+ thrown_items[A] = A
+ for(var/turf/F in range(T,power))
+ new /obj/effect/temp_visual/gravpush(F)
+
+/obj/item/projectile/gravitychaos
+ name = "gravitational blast"
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "chronofield"
+ hitsound = 'sound/weapons/wave.ogg'
+ damage = 0
+ damage_type = BRUTE
+ nodamage = 1
+ color = "#101010"
+ var/turf/T
+ var/power = 4
+ var/list/thrown_items = list()
+
+/obj/item/projectile/gravitychaos/Initialize()
+ . = ..()
+ var/obj/item/ammo_casing/energy/gravitychaos/C = loc
+ if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items
+ power = min(C.gun.power, 15)
+
+/obj/item/projectile/gravitychaos/on_hit()
+ . = ..()
+ T = get_turf(src)
+ for(var/atom/movable/A in range(T, power))
+ if(A == src|| (firer && A == src.firer) || A.anchored || thrown_items[A])
+ continue
+ A.throw_at(get_edge_target_turf(A, pick(GLOB.cardinals)), power+1, 1)
+ thrown_items[A] = A
+ for(var/turf/Z in range(T,power))
+ new /obj/effect/temp_visual/gravpush(Z)
diff --git a/code/modules/projectiles/projectile/special/hallucination.dm b/code/modules/projectiles/projectile/special/hallucination.dm
new file mode 100644
index 0000000000..e158ed89f0
--- /dev/null
+++ b/code/modules/projectiles/projectile/special/hallucination.dm
@@ -0,0 +1,230 @@
+/obj/item/projectile/hallucination
+ name = "bullet"
+ icon = null
+ icon_state = null
+ hitsound = ""
+ suppressed = TRUE
+ ricochets_max = 0
+ ricochet_chance = 0
+ damage = 0
+ nodamage = TRUE
+ projectile_type = /obj/item/projectile/hallucination
+ log_override = TRUE
+ var/hal_icon_state
+ var/image/fake_icon
+ var/mob/living/carbon/hal_target
+ var/hal_fire_sound
+ var/hal_hitsound
+ var/hal_hitsound_wall
+ var/hal_impact_effect
+ var/hal_impact_effect_wall
+ var/hit_duration
+ var/hit_duration_wall
+
+/obj/item/projectile/hallucination/fire()
+ ..()
+ fake_icon = image('icons/obj/projectiles.dmi', src, hal_icon_state, ABOVE_MOB_LAYER)
+ if(hal_target.client)
+ hal_target.client.images += fake_icon
+
+/obj/item/projectile/hallucination/Destroy()
+ if(hal_target.client)
+ hal_target.client.images -= fake_icon
+ QDEL_NULL(fake_icon)
+ return ..()
+
+/obj/item/projectile/hallucination/Collide(atom/A)
+ if(!ismob(A))
+ if(hal_hitsound_wall)
+ hal_target.playsound_local(loc, hal_hitsound_wall, 40, 1)
+ if(hal_impact_effect_wall)
+ spawn_hit(A, TRUE)
+ else if(A == hal_target)
+ if(hal_hitsound)
+ hal_target.playsound_local(A, hal_hitsound, 100, 1)
+ target_on_hit(A)
+ qdel(src)
+ return TRUE
+
+/obj/item/projectile/hallucination/proc/target_on_hit(mob/M)
+ if(M == hal_target)
+ to_chat(hal_target, "[M] is hit by \a [src] in the chest! ")
+ hal_apply_effect()
+ else if(M in view(hal_target))
+ to_chat(hal_target, "[M] is hit by \a [src] in the chest!! ")
+ if(damage_type == BRUTE)
+ var/splatter_dir = dir
+ if(starting)
+ splatter_dir = get_dir(starting, get_turf(M))
+ spawn_blood(M, splatter_dir)
+ else if(hal_impact_effect)
+ spawn_hit(M, FALSE)
+
+/obj/item/projectile/hallucination/proc/spawn_blood(mob/M, set_dir)
+ set waitfor = 0
+ if(!hal_target.client)
+ return
+
+ var/splatter_icon_state
+ if(set_dir in GLOB.diagonals)
+ splatter_icon_state = "splatter[pick(1, 2, 6)]"
+ else
+ splatter_icon_state = "splatter[pick(3, 4, 5)]"
+
+ var/image/blood = image('icons/effects/blood.dmi', M, splatter_icon_state, ABOVE_MOB_LAYER)
+ var/target_pixel_x = 0
+ var/target_pixel_y = 0
+ switch(set_dir)
+ if(NORTH)
+ target_pixel_y = 16
+ if(SOUTH)
+ target_pixel_y = -16
+ layer = ABOVE_MOB_LAYER
+ if(EAST)
+ target_pixel_x = 16
+ if(WEST)
+ target_pixel_x = -16
+ if(NORTHEAST)
+ target_pixel_x = 16
+ target_pixel_y = 16
+ if(NORTHWEST)
+ target_pixel_x = -16
+ target_pixel_y = 16
+ if(SOUTHEAST)
+ target_pixel_x = 16
+ target_pixel_y = -16
+ layer = ABOVE_MOB_LAYER
+ if(SOUTHWEST)
+ target_pixel_x = -16
+ target_pixel_y = -16
+ layer = ABOVE_MOB_LAYER
+ hal_target.client.images += blood
+ animate(blood, pixel_x = target_pixel_x, pixel_y = target_pixel_y, alpha = 0, time = 5)
+ addtimer(CALLBACK(src, .proc/cleanup_blood), 5)
+
+/obj/item/projectile/hallucination/proc/cleanup_blood(image/blood)
+ hal_target.client.images -= blood
+ qdel(blood)
+
+/obj/item/projectile/hallucination/proc/spawn_hit(atom/A, is_wall)
+ set waitfor = 0
+ if(!hal_target.client)
+ return
+
+ var/image/hit_effect = image('icons/effects/blood.dmi', A, is_wall ? hal_impact_effect_wall : hal_impact_effect, ABOVE_MOB_LAYER)
+ hit_effect.pixel_x = A.pixel_x + rand(-4,4)
+ hit_effect.pixel_y = A.pixel_y + rand(-4,4)
+ hal_target.client.images += hit_effect
+ sleep(is_wall ? hit_duration_wall : hit_duration)
+ hal_target.client.images -= hit_effect
+ qdel(hit_effect)
+
+
+/obj/item/projectile/hallucination/proc/hal_apply_effect()
+ return
+
+/obj/item/projectile/hallucination/bullet
+ name = "bullet"
+ hal_icon_state = "bullet"
+ hal_fire_sound = "gunshot"
+ hal_hitsound = 'sound/weapons/pierce.ogg'
+ hal_hitsound_wall = "ricochet"
+ hal_impact_effect = "impact_bullet"
+ hal_impact_effect_wall = "impact_bullet"
+ hit_duration = 5
+ hit_duration_wall = 5
+
+/obj/item/projectile/hallucination/bullet/hal_apply_effect()
+ hal_target.adjustStaminaLoss(60)
+
+/obj/item/projectile/hallucination/laser
+ name = "laser"
+ damage_type = BURN
+ hal_icon_state = "laser"
+ hal_fire_sound = 'sound/weapons/laser.ogg'
+ hal_hitsound = 'sound/weapons/sear.ogg'
+ hal_hitsound_wall = 'sound/weapons/effects/searwall.ogg'
+ hal_impact_effect = "impact_laser"
+ hal_impact_effect_wall = "impact_laser_wall"
+ hit_duration = 4
+ hit_duration_wall = 10
+ pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
+
+/obj/item/projectile/hallucination/laser/hal_apply_effect()
+ hal_target.adjustStaminaLoss(20)
+ hal_target.blur_eyes(2)
+
+/obj/item/projectile/hallucination/taser
+ name = "electrode"
+ damage_type = BURN
+ hal_icon_state = "spark"
+ color = "#FFFF00"
+ hal_fire_sound = 'sound/weapons/taser.ogg'
+ hal_hitsound = 'sound/weapons/taserhit.ogg'
+ hal_hitsound_wall = null
+ hal_impact_effect = null
+ hal_impact_effect_wall = null
+
+/obj/item/projectile/hallucination/taser/hal_apply_effect()
+ hal_target.Knockdown(100)
+ hal_target.stuttering += 20
+ if(hal_target.dna && hal_target.dna.check_mutation(HULK))
+ hal_target.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
+ else if((hal_target.status_flags & CANKNOCKDOWN) && !hal_target.has_trait(TRAIT_STUNIMMUNE))
+ addtimer(CALLBACK(hal_target, /mob/living/carbon.proc/do_jitter_animation, 20), 5)
+
+/obj/item/projectile/hallucination/disabler
+ name = "disabler beam"
+ damage_type = STAMINA
+ hal_icon_state = "omnilaser"
+ hal_fire_sound = 'sound/weapons/taser2.ogg'
+ hal_hitsound = 'sound/weapons/tap.ogg'
+ hal_hitsound_wall = 'sound/weapons/effects/searwall.ogg'
+ hal_impact_effect = "impact_laser_blue"
+ hal_impact_effect_wall = null
+ hit_duration = 4
+ pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
+
+/obj/item/projectile/hallucination/disabler/hal_apply_effect()
+ hal_target.adjustStaminaLoss(25)
+
+/obj/item/projectile/hallucination/ebow
+ name = "bolt"
+ damage_type = TOX
+ hal_icon_state = "cbbolt"
+ hal_fire_sound = 'sound/weapons/genhit.ogg'
+ hal_hitsound = null
+ hal_hitsound_wall = null
+ hal_impact_effect = null
+ hal_impact_effect_wall = null
+
+/obj/item/projectile/hallucination/ebow/hal_apply_effect()
+ hal_target.Knockdown(100)
+ hal_target.stuttering += 5
+ hal_target.adjustStaminaLoss(8)
+
+/obj/item/projectile/hallucination/change
+ name = "bolt of change"
+ damage_type = BURN
+ hal_icon_state = "ice_1"
+ hal_fire_sound = 'sound/magic/staff_change.ogg'
+ hal_hitsound = null
+ hal_hitsound_wall = null
+ hal_impact_effect = null
+ hal_impact_effect_wall = null
+
+/obj/item/projectile/hallucination/change/hal_apply_effect()
+ new /datum/hallucination/self_delusion(hal_target, TRUE, wabbajack = FALSE)
+
+/obj/item/projectile/hallucination/death
+ name = "bolt of death"
+ damage_type = BURN
+ hal_icon_state = "pulse1_bl"
+ hal_fire_sound = 'sound/magic/wandodeath.ogg'
+ hal_hitsound = null
+ hal_hitsound_wall = null
+ hal_impact_effect = null
+ hal_impact_effect_wall = null
+
+/obj/item/projectile/hallucination/death/hal_apply_effect()
+ new /datum/hallucination/death(hal_target, TRUE)
diff --git a/code/modules/projectiles/projectile/special/ion.dm b/code/modules/projectiles/projectile/special/ion.dm
new file mode 100644
index 0000000000..403a1bedd7
--- /dev/null
+++ b/code/modules/projectiles/projectile/special/ion.dm
@@ -0,0 +1,20 @@
+/obj/item/projectile/ion
+ name = "ion bolt"
+ icon_state = "ion"
+ damage = 0
+ damage_type = BURN
+ nodamage = 1
+ flag = "energy"
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/ion
+
+/obj/item/projectile/ion/on_hit(atom/target, blocked = FALSE)
+ ..()
+ empulse(target, 1, 1)
+ return TRUE
+
+/obj/item/projectile/ion/weak
+
+/obj/item/projectile/ion/weak/on_hit(atom/target, blocked = FALSE)
+ ..()
+ empulse(target, 0, 0)
+ return TRUE
diff --git a/code/modules/projectiles/projectile/special/meteor.dm b/code/modules/projectiles/projectile/special/meteor.dm
new file mode 100644
index 0000000000..f4e60998e1
--- /dev/null
+++ b/code/modules/projectiles/projectile/special/meteor.dm
@@ -0,0 +1,19 @@
+/obj/item/projectile/meteor
+ name = "meteor"
+ icon = 'icons/obj/meteor.dmi'
+ icon_state = "small1"
+ damage = 0
+ damage_type = BRUTE
+ nodamage = 1
+ flag = "bullet"
+
+/obj/item/projectile/meteor/Collide(atom/A)
+ if(A == firer)
+ forceMove(A.loc)
+ return
+ A.ex_act(EXPLODE_HEAVY)
+ playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1)
+ for(var/mob/M in urange(10, src))
+ if(!M.stat)
+ shake_camera(M, 3, 1)
+ qdel(src)
diff --git a/code/modules/projectiles/projectile/special/mindflayer.dm b/code/modules/projectiles/projectile/special/mindflayer.dm
new file mode 100644
index 0000000000..eaa998f7e0
--- /dev/null
+++ b/code/modules/projectiles/projectile/special/mindflayer.dm
@@ -0,0 +1,9 @@
+/obj/item/projectile/beam/mindflayer
+ name = "flayer ray"
+
+/obj/item/projectile/beam/mindflayer/on_hit(atom/target, blocked = FALSE)
+ . = ..()
+ if(ishuman(target))
+ var/mob/living/carbon/human/M = target
+ M.adjustBrainLoss(20)
+ M.hallucination += 20
diff --git a/code/modules/projectiles/projectile/special/neurotoxin.dm b/code/modules/projectiles/projectile/special/neurotoxin.dm
new file mode 100644
index 0000000000..46027e7bdf
--- /dev/null
+++ b/code/modules/projectiles/projectile/special/neurotoxin.dm
@@ -0,0 +1,12 @@
+/obj/item/projectile/bullet/neurotoxin
+ name = "neurotoxin spit"
+ icon_state = "neurotoxin"
+ damage = 5
+ damage_type = TOX
+ knockdown = 100
+
+/obj/item/projectile/bullet/neurotoxin/on_hit(atom/target, blocked = FALSE)
+ if(isalien(target))
+ knockdown = 0
+ nodamage = TRUE
+ return ..()
diff --git a/code/modules/projectiles/projectile/special/plasma.dm b/code/modules/projectiles/projectile/special/plasma.dm
new file mode 100644
index 0000000000..aeafb6157a
--- /dev/null
+++ b/code/modules/projectiles/projectile/special/plasma.dm
@@ -0,0 +1,49 @@
+/obj/item/projectile/plasma
+ name = "plasma blast"
+ icon_state = "plasmacutter"
+ damage_type = BRUTE
+ damage = 20
+ range = 4
+ dismemberment = 20
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/purple_laser
+ var/pressure_decrease_active = FALSE
+ var/pressure_decrease = 0.25
+ var/mine_range = 3 //mines this many additional tiles of rock
+ tracer_type = /obj/effect/projectile/tracer/plasma_cutter
+ muzzle_type = /obj/effect/projectile/muzzle/plasma_cutter
+ impact_type = /obj/effect/projectile/impact/plasma_cutter
+
+/obj/item/projectile/plasma/Initialize()
+ . = ..()
+ if(!lavaland_equipment_pressure_check(get_turf(src)))
+ name = "weakened [name]"
+ damage = damage * pressure_decrease
+ pressure_decrease_active = TRUE
+
+/obj/item/projectile/plasma/on_hit(atom/target)
+ . = ..()
+ if(ismineralturf(target))
+ var/turf/closed/mineral/M = target
+ M.gets_drilled(firer)
+ if(mine_range)
+ mine_range--
+ range++
+ if(range > 0)
+ return -1
+
+/obj/item/projectile/plasma/adv
+ damage = 28
+ range = 5
+ mine_range = 5
+
+/obj/item/projectile/plasma/adv/mech
+ damage = 40
+ range = 9
+ mine_range = 3
+
+/obj/item/projectile/plasma/turret
+ //Between normal and advanced for damage, made a beam so not the turret does not destroy glass
+ name = "plasma beam"
+ damage = 24
+ range = 7
+ pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
diff --git a/code/modules/projectiles/projectile/special/rocket.dm b/code/modules/projectiles/projectile/special/rocket.dm
new file mode 100644
index 0000000000..6518b2a4d5
--- /dev/null
+++ b/code/modules/projectiles/projectile/special/rocket.dm
@@ -0,0 +1,45 @@
+/obj/item/projectile/bullet/gyro
+ name ="explosive bolt"
+ icon_state= "bolter"
+ damage = 50
+
+/obj/item/projectile/bullet/gyro/on_hit(atom/target, blocked = FALSE)
+ ..()
+ explosion(target, -1, 0, 2)
+ return TRUE
+
+/obj/item/projectile/bullet/a84mm
+ name ="anti-armour rocket"
+ desc = "USE A WEEL GUN"
+ icon_state= "atrocket"
+ damage = 80
+ var/anti_armour_damage = 200
+ armour_penetration = 100
+ dismemberment = 100
+
+/obj/item/projectile/bullet/a84mm/on_hit(atom/target, blocked = FALSE)
+ ..()
+ explosion(target, -1, 1, 3, 1, 0, flame_range = 4)
+
+ if(ismecha(target))
+ var/obj/mecha/M = target
+ M.take_damage(anti_armour_damage)
+ if(issilicon(target))
+ var/mob/living/silicon/S = target
+ S.take_overall_damage(anti_armour_damage*0.75, anti_armour_damage*0.25)
+ return TRUE
+
+/obj/item/projectile/bullet/srmrocket
+ name ="SRM-8 Rocket"
+ desc = "Boom."
+ icon_state = "missile"
+ damage = 30
+ ricochets_max = 0 //it's a MISSILE
+
+/obj/item/projectile/bullet/srmrocket/on_hit(atom/target, blocked=0)
+ ..()
+ if(!isliving(target)) //if the target isn't alive, so is a wall or something
+ explosion(target, 0, 1, 2, 4)
+ else
+ explosion(target, 0, 0, 2, 4)
+ return TRUE
diff --git a/code/modules/projectiles/projectile/special/temperature.dm b/code/modules/projectiles/projectile/special/temperature.dm
new file mode 100644
index 0000000000..7fb9c6efb2
--- /dev/null
+++ b/code/modules/projectiles/projectile/special/temperature.dm
@@ -0,0 +1,19 @@
+/obj/item/projectile/temp
+ name = "freeze beam"
+ icon_state = "ice_2"
+ damage = 0
+ damage_type = BURN
+ nodamage = FALSE
+ flag = "energy"
+ var/temperature = 100
+
+/obj/item/projectile/temp/on_hit(atom/target, blocked = FALSE)//These two could likely check temp protection on the mob
+ ..()
+ if(isliving(target))
+ var/mob/M = target
+ M.bodytemperature = temperature
+ return TRUE
+
+/obj/item/projectile/temp/hot
+ name = "heat beam"
+ temperature = 400
diff --git a/code/modules/projectiles/projectile/special/wormhole.dm b/code/modules/projectiles/projectile/special/wormhole.dm
new file mode 100644
index 0000000000..94ef5b9a23
--- /dev/null
+++ b/code/modules/projectiles/projectile/special/wormhole.dm
@@ -0,0 +1,25 @@
+/obj/item/projectile/beam/wormhole
+ name = "bluespace beam"
+ icon_state = "spark"
+ hitsound = "sparks"
+ damage = 3
+ var/obj/item/gun/energy/wormhole_projector/gun
+ color = "#33CCFF"
+
+/obj/item/projectile/beam/wormhole/orange
+ name = "orange bluespace beam"
+ color = "#FF6600"
+
+/obj/item/projectile/beam/wormhole/Initialize(mapload, obj/item/ammo_casing/energy/wormhole/casing)
+ . = ..()
+ if(casing)
+ gun = casing.gun
+
+/obj/item/projectile/beam/wormhole/on_hit(atom/target)
+ if(ismob(target))
+ var/turf/portal_destination = pick(orange(6, src))
+ do_teleport(target, portal_destination)
+ return ..()
+ if(!gun)
+ qdel(src)
+ gun.create_portal(src, get_turf(src))
diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index 0f3ac0e1bc..2a650f3381 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -251,7 +251,7 @@
R.handle_reactions()
return amount
-/datum/reagents/proc/metabolize(mob/living/carbon/C, can_overdose = 0)
+/datum/reagents/proc/metabolize(mob/living/carbon/C, can_overdose = FALSE, liverless = FALSE)
var/list/cached_reagents = reagent_list
var/list/cached_addictions = addiction_list
if(C)
@@ -261,6 +261,8 @@
var/datum/reagent/R = reagent
if(QDELETED(R.holder))
continue
+ if(liverless && !R.self_consuming) //need to be metabolized
+ continue
if(!C)
C = R.holder.my_atom
if(C && R)
@@ -301,6 +303,9 @@
need_mob_update += R.addiction_act_stage4(C)
if(40 to INFINITY)
to_chat(C, "You feel like you've gotten over your need for [R.name]. ")
+ GET_COMPONENT_FROM(mood, /datum/component/mood, C)
+ if(mood)
+ mood.clear_event("[R.id]_addiction")
cached_addictions.Remove(R)
addiction_tick++
if(C && need_mob_update) //some of the metabolized reagents had effects on the mob that requires some updates.
diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
index ce4e1f7ad2..3b06b4c71e 100644
--- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
@@ -16,6 +16,8 @@
var/recharged = 0
var/recharge_delay = 5
var/mutable_appearance/beaker_overlay
+ var/working_state = "dispenser_working"
+ var/nopower_state = "dispenser_nopower"
var/obj/item/reagent_containers/beaker = null
var/list/dispensable_reagents = list(
"hydrogen",
@@ -60,6 +62,7 @@
cell = new cell_type
recharge()
dispensable_reagents = sortList(dispensable_reagents)
+ update_icon()
/obj/machinery/chem_dispenser/Destroy()
QDEL_NULL(beaker)
@@ -67,13 +70,36 @@
return ..()
/obj/machinery/chem_dispenser/process()
-
if(recharged < 0)
recharge()
recharged = recharge_delay
else
recharged -= 1
+/obj/machinery/chem_dispenser/proc/display_beaker()
+ ..()
+ var/mutable_appearance/b_o = beaker_overlay || mutable_appearance(icon, "disp_beaker")
+ b_o.pixel_y = -4
+ b_o.pixel_x = -7
+ return b_o
+
+obj/machinery/chem_dispenser/proc/work_animation()
+ if(working_state)
+ flick(working_state,src)
+
+/obj/machinery/chem_dispenser/power_change()
+ ..()
+ if(!powered() && nopower_state)
+ icon_state = nopower_state
+ else
+ icon_state = initial(icon_state)
+
+obj/machinery/chem_dispenser/update_icon()
+ cut_overlays()
+ if(beaker)
+ beaker_overlay = display_beaker()
+ add_overlay(beaker_overlay)
+
/obj/machinery/chem_dispenser/proc/recharge()
if(stat & (BROKEN|NOPOWER))
return
@@ -163,6 +189,7 @@
var/target = text2num(params["target"])
if(target in beaker.possible_transfer_amounts)
amount = target
+ work_animation()
. = TRUE
if("dispense")
var/reagent = params["reagent"]
@@ -173,11 +200,13 @@
R.add_reagent(reagent, actual)
cell.use((actual / 10) / powerefficiency)
+ work_animation()
. = TRUE
if("remove")
var/amount = text2num(params["amount"])
if(beaker && amount in beaker.possible_transfer_amounts)
beaker.reagents.remove_all(amount)
+ work_animation()
. = TRUE
if("eject")
if(beaker)
@@ -185,7 +214,7 @@
if(Adjacent(usr) && !issilicon(usr))
usr.put_in_hands(beaker)
beaker = null
- cut_overlays()
+ update_icon()
. = TRUE
if("dispense_recipe")
var/recipe_to_use = params["recipe"]
@@ -200,6 +229,7 @@
if(actual)
R.add_reagent(r_id, actual)
cell.use((actual / 10) / powerefficiency)
+ work_animation()
if("clear_recipes")
var/yesno = alert("Clear all recipes?",, "Yes","No")
if(yesno == "Yes")
@@ -226,23 +256,17 @@
/obj/machinery/chem_dispenser/attackby(obj/item/I, mob/user, params)
if(default_unfasten_wrench(user, I))
return
-
if(istype(I, /obj/item/reagent_containers) && !(I.flags_1 & ABSTRACT_1) && I.is_open_container())
var/obj/item/reagent_containers/B = I
. = 1 //no afterattack
if(beaker)
to_chat(user, "A container is already loaded into [src]! ")
return
-
if(!user.transferItemToLoc(B, src))
return
-
beaker = B
to_chat(user, "You add [B] to [src]. ")
-
- beaker_overlay = beaker_overlay || mutable_appearance(icon, "disp_beaker")
- beaker_overlay.pixel_x = rand(-10, 5)//randomize beaker overlay position.
- add_overlay(beaker_overlay)
+ update_icon()
else if(user.a_intent != INTENT_HARM && !istype(I, /obj/item/card/emag))
to_chat(user, "You can't load [I] into [src]! ")
return ..()
@@ -266,6 +290,7 @@
beaker.reagents.remove_all()
cell.use(total/powerefficiency)
cell.emp_act(severity)
+ work_animation()
visible_message("[src] malfunctions, spraying chemicals everywhere! ")
..()
@@ -278,6 +303,8 @@
recharge_delay = 20
dispensable_reagents = list()
circuit = /obj/item/circuitboard/machine/chem_dispenser
+ working_state = "minidispenser_working"
+ nopower_state = "minidispenser_nopower"
var/static/list/dispensable_reagent_tiers = list(
list(
"hydrogen",
@@ -362,6 +389,29 @@
final_list += list(avoid_assoc_duplicate_keys(fuck[1],key_list) = text2num(fuck[2]))
return final_list
+/obj/machinery/chem_dispenser/constructable/display_beaker()
+ var/mutable_appearance/b_o = beaker_overlay || mutable_appearance(icon, "disp_beaker")
+ b_o.pixel_y = -4
+ b_o.pixel_x = -4
+ return b_o
+
+/obj/machinery/chem_dispenser/drinks/display_beaker()
+ var/mutable_appearance/b_o = beaker_overlay || mutable_appearance(icon, "disp_beaker")
+ switch(dir)
+ if(NORTH)
+ b_o.pixel_y = 7
+ b_o.pixel_x = rand(-9, 9)
+ if(EAST)
+ b_o.pixel_x = 4
+ b_o.pixel_y = rand(-5, 7)
+ if(WEST)
+ b_o.pixel_x = -5
+ b_o.pixel_y = rand(-5, 7)
+ else//SOUTH
+ b_o.pixel_y = -7
+ b_o.pixel_x = rand(-9, 9)
+ return b_o
+
/obj/machinery/chem_dispenser/drinks
name = "soda dispenser"
desc = "Contains a large reservoir of soft drinks."
@@ -369,6 +419,10 @@
icon = 'icons/obj/chemical.dmi'
icon_state = "soda_dispenser"
amount = 10
+ pixel_y = 6
+ layer = WALL_OBJ_LAYER
+ working_state = null
+ nopower_state = null
dispensable_reagents = list(
"water",
"ice",
@@ -398,8 +452,6 @@
"tirizene"
)
-
-
/obj/machinery/chem_dispenser/drinks/beer
name = "booze dispenser"
desc = "Contains a large reservoir of the good stuff."
diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm
index b14d436df5..c6ca72ad4a 100644
--- a/code/modules/reagents/chemistry/machinery/pandemic.dm
+++ b/code/modules/reagents/chemistry/machinery/pandemic.dm
@@ -57,7 +57,7 @@
if(istype(D, /datum/disease/advance))
var/datum/disease/advance/A = D
var/disease_name = SSdisease.get_disease_name(A.GetDiseaseID())
- if(disease_name == "Unknown")
+ if((disease_name == "Unknown") && A.mutable)
this["can_rename"] = TRUE
this["name"] = disease_name
this["is_adv"] = TRUE
@@ -180,17 +180,21 @@
if("rename_disease")
var/id = get_virus_id_by_index(text2num(params["index"]))
var/datum/disease/advance/A = SSdisease.archive_diseases[id]
+ if(!A.mutable)
+ return
if(A)
var/new_name = stripped_input(usr, "Name the disease", "New name", "", MAX_NAME_LEN)
if(!new_name || ..())
return
A.AssignName(new_name)
- for(var/datum/disease/advance/AD in SSdisease.active_diseases)
- AD.Refresh()
. = TRUE
if("create_culture_bottle")
var/id = get_virus_id_by_index(text2num(params["index"]))
- var/datum/disease/advance/A = new(FALSE, SSdisease.archive_diseases[id])
+ var/datum/disease/advance/A = SSdisease.archive_diseases[id]
+ if(!A.mutable)
+ to_chat(usr, "ERROR: Cannot replicate virus strain. ")
+ return
+ A = A.Copy()
var/list/data = list("viruses" = list(A))
var/obj/item/reagent_containers/glass/bottle/B = new(drop_location())
B.name = "[A.name] culture bottle"
diff --git a/code/modules/reagents/chemistry/machinery/scp_294.dm b/code/modules/reagents/chemistry/machinery/scp_294.dm
index f7d6473358..5aa09d407b 100644
--- a/code/modules/reagents/chemistry/machinery/scp_294.dm
+++ b/code/modules/reagents/chemistry/machinery/scp_294.dm
@@ -14,6 +14,8 @@
icon_state = "294_bottom"
amount = 10
resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF
+ working_state = null
+ nopower_state = null
var/static/list/shortcuts = list(
"meth" = "methamphetamine",
"tricord" = "tricordrazine"
@@ -23,9 +25,9 @@
/obj/machinery/chem_dispenser/scp_294/Initialize()
. = ..()
GLOB.poi_list += src
- top_overlay = mutable_appearance(icon, "294_top", layer = ABOVE_MOB_LAYER)
+ top_overlay = mutable_appearance(icon, "294_top", layer = ABOVE_ALL_MOB_LAYER)
update_icon()
-
+
/obj/machinery/chem_dispenser/scp_294/update_icon()
cut_overlays()
@@ -36,6 +38,9 @@
GLOB.poi_list -= src
QDEL_NULL(top_overlay)
+/obj/machinery/chem_dispenser/scp_294/display_beaker()
+ return
+
/obj/machinery/chem_dispenser/scp_294/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
diff --git a/code/modules/reagents/chemistry/machinery/smoke_machine.dm b/code/modules/reagents/chemistry/machinery/smoke_machine.dm
index 7c24f786af..56cec26dd3 100644
--- a/code/modules/reagents/chemistry/machinery/smoke_machine.dm
+++ b/code/modules/reagents/chemistry/machinery/smoke_machine.dm
@@ -37,10 +37,13 @@
/obj/machinery/smoke_machine/update_icon()
if((!is_operational()) || (!on) || (reagents.total_volume == 0))
- icon_state = "smoke0"
+ if (panel_open)
+ icon_state = "smoke0-o"
+ else
+ icon_state = "smoke0"
else
icon_state = "smoke1"
- . = ..()
+ return ..()
/obj/machinery/smoke_machine/RefreshParts()
var/new_volume = REAGENTS_BASE_VOLUME
@@ -62,15 +65,16 @@
/obj/machinery/smoke_machine/process()
..()
- update_icon()
if(!is_operational())
return
if(reagents.total_volume == 0)
on = FALSE
+ update_icon()
return
var/turf/T = get_turf(src)
var/smoke_test = locate(/obj/effect/particle_effect/smoke) in T
if(on && !smoke_test)
+ update_icon()
var/datum/effect_system/smoke_spread/chem/smoke_machine/smoke = new()
smoke.set_up(reagents, setting*3, efficiency, T)
smoke.start()
@@ -87,6 +91,10 @@
if(default_unfasten_wrench(user, I, 40))
on = FALSE
return
+ if(default_deconstruction_screwdriver(user, "smoke0-o", "smoke0", I))
+ return
+ if(default_deconstruction_crowbar(I))
+ return
return ..()
/obj/machinery/smoke_machine/deconstruct()
@@ -124,6 +132,7 @@
switch(action)
if("purge")
reagents.clear_reagents()
+ update_icon()
. = TRUE
if("setting")
var/amount = text2num(params["amount"])
@@ -132,6 +141,7 @@
. = TRUE
if("power")
on = !on
+ update_icon()
if(on)
message_admins("[key_name_admin(usr)] activated a smoke machine that contains [english_list(reagents.reagent_list)] at [ADMIN_COORDJMP(src)].")
log_game("[key_name(usr)] activated a smoke machine that contains [english_list(reagents.reagent_list)] at [COORD(src)].")
diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm
index 4ca1efa4e7..a1a65409a1 100644
--- a/code/modules/reagents/chemistry/reagents.dm
+++ b/code/modules/reagents/chemistry/reagents.dm
@@ -31,6 +31,7 @@
var/addiction_threshold = 0
var/addiction_stage = 0
var/overdosed = 0 // You fucked up and this is now triggering its overdose effects, purge that shit quick.
+ var/self_consuming = FALSE
/datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references
. = ..()
@@ -90,24 +91,39 @@
/datum/reagent/proc/overdose_start(mob/living/M)
to_chat(M, "You feel like you took too much of [name]! ")
+ GET_COMPONENT_FROM(mood, /datum/component/mood, M)
+ if(mood)
+ mood.add_event("[id]_overdose", /datum/mood_event/drugs/overdose, name)
return
/datum/reagent/proc/addiction_act_stage1(mob/living/M)
+ GET_COMPONENT_FROM(mood, /datum/component/mood, M)
+ if(mood)
+ mood.add_event("[id]_overdose", /datum/mood_event/drugs/withdrawal_light, name)
if(prob(30))
to_chat(M, "You feel like having some [name] right about now. ")
return
/datum/reagent/proc/addiction_act_stage2(mob/living/M)
+ GET_COMPONENT_FROM(mood, /datum/component/mood, M)
+ if(mood)
+ mood.add_event("[id]_overdose", /datum/mood_event/drugs/withdrawal_medium, name)
if(prob(30))
to_chat(M, "You feel like you need [name]. You just can't get enough. ")
return
/datum/reagent/proc/addiction_act_stage3(mob/living/M)
+ GET_COMPONENT_FROM(mood, /datum/component/mood, M)
+ if(mood)
+ mood.add_event("[id]_overdose", /datum/mood_event/drugs/withdrawal_severe, name)
if(prob(30))
to_chat(M, "You have an intense craving for [name]. ")
return
/datum/reagent/proc/addiction_act_stage4(mob/living/M)
+ GET_COMPONENT_FROM(mood, /datum/component/mood, M)
+ if(mood)
+ mood.add_event("[id]_overdose", /datum/mood_event/drugs/withdrawal_critical, name)
if(prob(30))
to_chat(M, "You're not feeling good at all! You really need some [name]. ")
return
diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
index 53b98b2d4a..e8070e8906 100644
--- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
@@ -1,5 +1,6 @@
#define ALCOHOL_THRESHOLD_MODIFIER 0.05 //Greater numbers mean that less alcohol has greater intoxication potential
#define ALCOHOL_RATE 0.005 //The rate at which alcohol affects you
+#define ALCOHOL_EXPONENT 1.6 //The exponent applied to boozepwr to make higher volume alcohol atleast a little bit damaging.
////////////// I don't know who made this header before I refactored alcohols but I'm going to fucking strangle them because it was so ugly, holy Christ
// ALCOHOLS //
@@ -37,9 +38,12 @@ All effects don't start immediately, but rather get worse over time; the rate is
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.drunkenness < volume * boozepwr * ALCOHOL_THRESHOLD_MODIFIER)
- H.drunkenness = max((H.drunkenness + (sqrt(volume) * boozepwr * ALCOHOL_RATE)), 0) //Volume, power, and server alcohol rate effect how quickly one gets drunk
+ var/booze_power = boozepwr
+ if(H.has_trait(TRAIT_ALCOHOL_TOLERANCE)) //we're an accomplished drinker
+ booze_power *= 0.7
+ H.drunkenness = max((H.drunkenness + (sqrt(volume) * booze_power * ALCOHOL_RATE)), 0) //Volume, power, and server alcohol rate effect how quickly one gets drunk
var/obj/item/organ/liver/L = H.getorganslot(ORGAN_SLOT_LIVER)
- H.applyLiverDamage((max(sqrt(volume) * boozepwr * L.alcohol_tolerance, 0))/4)
+ H.applyLiverDamage((max(sqrt(volume) * (boozepwr ** ALCOHOL_EXPONENT) * L.alcohol_tolerance, 0))/150)
return ..() || .
/datum/reagent/consumable/ethanol/reaction_obj(obj/O, reac_volume)
@@ -117,7 +121,8 @@ All effects don't start immediately, but rather get worse over time; the rate is
M.dizziness = max(0,M.dizziness-5)
M.drowsyness = max(0,M.drowsyness-3)
M.AdjustSleeping(-40, FALSE)
- M.Jitter(5)
+ if(!M.has_trait(TRAIT_ALCOHOL_TOLERANCE))
+ M.Jitter(5)
..()
. = 1
@@ -140,19 +145,62 @@ All effects don't start immediately, but rather get worse over time; the rate is
color = "#102000" // rgb: 16, 32, 0
nutriment_factor = 1 * REAGENTS_METABOLISM
boozepwr = 80
+ overdose_threshold = 60
+ addiction_threshold = 30
taste_description = "jitters and death"
glass_icon_state = "thirteen_loko_glass"
glass_name = "glass of Thirteen Loko"
glass_desc = "This is a glass of Thirteen Loko, it appears to be of the highest quality. The drink, not the glass."
-
/datum/reagent/consumable/ethanol/thirteenloko/on_mob_life(mob/living/M)
M.drowsyness = max(0,M.drowsyness-7)
M.AdjustSleeping(-40)
M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL)
- M.Jitter(5)
+ if(!M.has_trait(TRAIT_ALCOHOL_TOLERANCE))
+ M.Jitter(5)
return ..()
+/datum/reagent/consumable/ethanol/thirteenloko/overdose_start(mob/living/M)
+ to_chat(M, "Your entire body violently jitters as you start to feel queasy. You really shouldn't have drank all of that [name]! ")
+ M.Jitter(20)
+ M.Stun(15)
+
+/datum/reagent/consumable/ethanol/thirteenloko/overdose_process(mob/living/M)
+ if(prob(7) && iscarbon(M))
+ var/obj/item/I = M.get_active_held_item()
+ if(I)
+ M.dropItemToGround(I)
+ to_chat(M, "Your hands jitter and you drop what you were holding! ")
+ M.Jitter(10)
+
+ if(prob(7))
+ to_chat(M, "[pick("You have a really bad headache.", "Your eyes hurt.", "You find it hard to stay still.", "You feel your heart practically beating out of your chest.")] ")
+
+ if(prob(5) && iscarbon(M))
+ if(M.has_trait(TRAIT_BLIND))
+ var/obj/item/organ/eyes/eye = M.getorganslot(ORGAN_SLOT_EYES)
+ if(istype(eye))
+ eye.Remove(M)
+ eye.forceMove(get_turf(M))
+ to_chat(M, "You double over in pain as you feel your eyeballs liquify in your head! ")
+ M.emote("scream")
+ M.adjustBruteLoss(15)
+ else
+ to_chat(M, "You scream in terror as you go blind! ")
+ M.become_blind(EYE_DAMAGE)
+ M.emote("scream")
+
+ if(prob(3) && iscarbon(M))
+ M.visible_message("[M] starts having a seizure! ", "You have a seizure! ")
+ M.Unconscious(100)
+ M.Jitter(350)
+
+ if(prob(1) && iscarbon(M))
+ var/datum/disease/D = new /datum/disease/heart_failure
+ M.ForceContractDisease(D)
+ to_chat(M, "You're pretty sure you just felt your heart stop for a second there.. ")
+ M.playsound_local(M, 'sound/effects/singlebeat.ogg', 100, 0)
+
/datum/reagent/consumable/ethanol/vodka
name = "Vodka"
id = "vodka"
@@ -305,7 +353,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
shot_glass_icon_state = "shotglassgreen"
/datum/reagent/consumable/ethanol/absinthe/on_mob_life(mob/living/M)
- if(prob(10))
+ if(prob(10) && !M.has_trait(TRAIT_ALCOHOL_TOLERANCE))
M.hallucination += 4 //Reference to the urban myth
..()
@@ -367,16 +415,27 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "Gin and Tonic"
glass_desc = "A mild but still great cocktail. Drink up, like a true Englishman."
+/datum/reagent/consumable/ethanol/rum_coke
+ name = "Rum and Coke"
+ id = "rumcoke"
+ description = "Rum, mixed with cola."
+ taste_description = "cola"
+ boozepwr = 40
+ color = "#3E1B00"
+ glass_icon_state = "whiskeycolaglass"
+ glass_name = "Rum and Coke"
+ glass_desc = "The classic go-to of space-fratboys."
+
/datum/reagent/consumable/ethanol/cuba_libre
name = "Cuba Libre"
id = "cubalibre"
- description = "Rum, mixed with cola. Viva la revolucion."
+ description = "Viva la Revolucion! Viva Cuba Libre!"
color = "#3E1B00" // rgb: 62, 27, 0
boozepwr = 50
- taste_description = "cola"
+ taste_description = "a refreshing marriage of citrus and rum"
glass_icon_state = "cubalibreglass"
glass_name = "Cuba Libre"
- glass_desc = "A classic mix of rum and cola."
+ glass_desc = "A classic mix of rum, cola, and lime. A favorite of revolutionaries everywhere!"
/datum/reagent/consumable/ethanol/cuba_libre/on_mob_life(mob/living/M)
if(M.mind && M.mind.has_antag_datum(/datum/antagonist/rev)) //Cuba Libre, the traditional drink of revolutions! Heals revolutionaries.
@@ -556,7 +615,10 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_desc = "Heavy, hot and strong. Just like the Iron fist of the LAW."
/datum/reagent/consumable/ethanol/beepsky_smash/on_mob_life(mob/living/M)
- M.Stun(40, 0)
+ if(M.has_trait(TRAIT_ALCOHOL_TOLERANCE))
+ M.Stun(30, 0) //this realistically does nothing to prevent chainstunning but will cause them to recover faster once it's out of their system
+ else
+ M.Stun(40, 0)
return ..()
/datum/reagent/consumable/ethanol/irish_cream
@@ -585,7 +647,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/manly_dorf/on_mob_add(mob/living/M)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(H.dna.check_mutation(DWARFISM))
+ if(H.dna.check_mutation(DWARFISM) || H.has_trait(TRAIT_ALCOHOL_TOLERANCE))
to_chat(H, "Now THAT is MANLY! ")
boozepwr = 5 //We've had worse in the mines
dorf_mode = TRUE
@@ -1148,8 +1210,9 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/atomicbomb/on_mob_life(mob/living/M)
M.set_drugginess(50)
- M.confused = max(M.confused+2,0)
- M.Dizzy(10)
+ if(!M.has_trait(TRAIT_ALCOHOL_TOLERANCE))
+ M.confused = max(M.confused+2,0)
+ M.Dizzy(10)
if (!M.slurring)
M.slurring = 1
M.slurring += 3
diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm
index 7e85580342..adcf7996d6 100644
--- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm
@@ -3,6 +3,12 @@
id = "drug"
metabolization_rate = 0.5 * REAGENTS_METABOLISM
taste_description = "bitterness"
+ var/trippy = TRUE //Does this drug make you trip?
+
+/datum/reagent/drug/on_mob_delete(mob/living/M)
+ GET_COMPONENT_FROM(mood, /datum/component/mood, M)
+ if(mood && trippy)
+ mood.clear_event("[id]_high")
/datum/reagent/drug/space_drugs
name = "Space drugs"
@@ -23,7 +29,9 @@
/datum/reagent/drug/space_drugs/overdose_start(mob/living/M)
to_chat(M, "You start tripping hard! ")
-
+ GET_COMPONENT_FROM(mood, /datum/component/mood, M)
+ if(mood)
+ mood.add_event("[id]_overdose", /datum/mood_event/drugs/overdose, name)
/datum/reagent/drug/space_drugs/overdose_process(mob/living/M)
if(M.hallucination < volume && prob(20))
@@ -38,11 +46,15 @@
color = "#60A584" // rgb: 96, 165, 132
addiction_threshold = 30
taste_description = "smoke"
+ trippy = FALSE
/datum/reagent/drug/nicotine/on_mob_life(mob/living/M)
if(prob(1))
var/smoke_message = pick("You feel relaxed.", "You feel calmed.","You feel alert.","You feel rugged.")
to_chat(M, "[smoke_message] ")
+ GET_COMPONENT_FROM(mood, /datum/component/mood, M)
+ if(mood)
+ mood.add_event("smoked", /datum/mood_event/drugs/smoked, name)
M.AdjustStun(-20, 0)
M.AdjustKnockdown(-20, 0)
M.AdjustUnconscious(-20, 0)
@@ -57,6 +69,7 @@
taste_description = "mint"
reagent_state = LIQUID
color = "#80AF9C"
+ trippy = FALSE
/datum/reagent/drug/crank
name = "Crank"
@@ -187,7 +200,7 @@
M.AdjustUnconscious(-40, 0)
M.adjustStaminaLoss(-2, 0)
M.Jitter(2)
- M.adjustBrainLoss(0.25)
+ M.adjustBrainLoss(rand(1,4))
if(prob(5))
M.emote(pick("twitch", "shiver"))
..()
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index 3dcf29f15e..55d64ea36c 100644
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -378,7 +378,7 @@
M.adjust_bodytemperature(5 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL)
..()
-/datum/reagent/mushroomhallucinogen
+/datum/reagent/drug/mushroomhallucinogen
name = "Mushroom Hallucinogen"
id = "mushroomhallucinogen"
description = "A strong hallucinogenic drug derived from certain species of mushroom."
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index 2552bb7c8d..2f7f9eaa08 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -60,9 +60,9 @@
M.SetSleeping(0, 0)
M.jitteriness = 0
M.cure_all_traumas(TRUE, TRAUMA_RESILIENCE_MAGIC)
- for(var/thing in M.viruses)
+ for(var/thing in M.diseases)
var/datum/disease/D = thing
- if(D.severity == VIRUS_SEVERITY_POSITIVE)
+ if(D.severity == DISEASE_SEVERITY_POSITIVE)
continue
D.cure()
..()
@@ -1192,6 +1192,7 @@
id = "corazone"
description = "A medication used to treat pain, fever, and inflammation, along with heart attacks."
color = "#F5F5F5"
+ self_consuming = TRUE
/datum/reagent/medicine/muscle_stimulant
name = "Muscle Stimulant"
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index f486dd1a95..0e6be47893 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -16,13 +16,15 @@
for(var/thing in data["viruses"])
var/datum/disease/D = thing
- if((D.spread_flags & VIRUS_SPREAD_SPECIAL) || (D.spread_flags & VIRUS_SPREAD_NON_CONTAGIOUS))
+ if((D.spread_flags & DISEASE_SPREAD_SPECIAL) || (D.spread_flags & DISEASE_SPREAD_NON_CONTAGIOUS))
continue
- if((method == TOUCH || method == VAPOR) && (D.spread_flags & VIRUS_SPREAD_CONTACT_FLUIDS))
- M.ContactContractDisease(D)
- else //ingest, patch or inject
- M.ForceContractDisease(D)
+ if(isliving(M))
+ var/mob/living/L = M
+ if((method == TOUCH || method == VAPOR) && (D.spread_flags & DISEASE_SPREAD_CONTACT_FLUIDS))
+ L.ContactContractDisease(D)
+ else //ingest, patch or inject
+ L.ForceContractDisease(D)
if(iscarbon(M))
var/mob/living/carbon/C = M
@@ -97,12 +99,15 @@
taste_description = "slime"
/datum/reagent/vaccine/reaction_mob(mob/M, method=TOUCH, reac_volume)
+ if(!isliving(M))
+ return
+ var/mob/living/L = M
if(islist(data) && (method == INGEST || method == INJECT))
- for(var/thing in M.viruses)
+ for(var/thing in L.diseases)
var/datum/disease/D = thing
if(D.GetDiseaseID() in data)
D.cure()
- M.resistances |= data
+ L.disease_resistances |= data
/datum/reagent/vaccine/on_merge(list/data)
if(istype(data))
@@ -217,13 +222,18 @@
to_chat(M, "Your blood rites falter as holy water scours your body! ")
for(var/datum/action/innate/cult/blood_spell/BS in BM.spells)
qdel(BS)
- if(data >= 30) // 12 units, 54 seconds @ metabolism 0.4 units & tick rate 1.8 sec
+ if(data >= 25) // 10 units, 45 seconds @ metabolism 0.4 units & tick rate 1.8 sec
if(!M.stuttering)
M.stuttering = 1
M.stuttering = min(M.stuttering+4, 10)
M.Dizzy(5)
- if(iscultist(M) && prob(5))
+ if(iscultist(M) && prob(8))
M.say(pick("Av'te Nar'sie","Pa'lid Mors","INO INO ORA ANA","SAT ANA!","Daim'niodeis Arc'iai Le'eones","R'ge Na'sie","Diabo us Vo'iscum","Eld' Mon Nobis"))
+ if(prob(20))
+ M.visible_message("[M] starts having a seizure! ", "You have a seizure! ")
+ M.Unconscious(120)
+ to_chat(M, "[pick("Your blood is your bond - you are nothing without it", "Do not forget your place", \
+ "All that power, and you still fail?", "If you cannot scour this poison, I shall scour your meager life!")]. ")
else if(is_servant_of_ratvar(M) && prob(8))
switch(pick("speech", "message", "emote"))
if("speech")
@@ -623,8 +633,11 @@
taste_description = "slime"
/datum/reagent/aslimetoxin/reaction_mob(mob/M, method=TOUCH, reac_volume)
+ if(!isliving(M))
+ return
+ var/mob/living/L = M
if(method != TOUCH)
- M.ForceContractDisease(new /datum/disease/transformation/slime(0))
+ L.ForceContractDisease(new /datum/disease/transformation/slime(), FALSE, TRUE)
/datum/reagent/gluttonytoxin
name = "Gluttony's Blessing"
@@ -635,7 +648,10 @@
taste_description = "decay"
/datum/reagent/gluttonytoxin/reaction_mob(mob/M, method=TOUCH, reac_volume)
- M.ForceContractDisease(new /datum/disease/transformation/morph(0))
+ if(!isliving(M))
+ return
+ var/mob/living/L = M
+ L.ForceContractDisease(new /datum/disease/transformation/morph(), FALSE, TRUE)
/datum/reagent/serotrotium
name = "Serotrotium"
@@ -679,6 +695,13 @@
color = "#6E3B08" // rgb: 110, 59, 8
taste_description = "metal"
+/datum/reagent/copper/reaction_obj(obj/O, reac_volume)
+ if(istype(O, /obj/item/stack/sheet/metal))
+ var/obj/item/stack/sheet/metal/M = O
+ reac_volume = min(reac_volume, M.amount)
+ new/obj/item/stack/tile/bronze(get_turf(M), reac_volume)
+ M.use(reac_volume)
+
/datum/reagent/nitrogen
name = "Nitrogen"
id = "nitrogen"
@@ -1096,8 +1119,11 @@
taste_description = "sludge"
/datum/reagent/nanites/reaction_mob(mob/M, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0)
+ if(!isliving(M))
+ return
+ var/mob/living/L = M
if(method==PATCH || method==INGEST || method==INJECT || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection))))
- M.ForceContractDisease(new /datum/disease/transformation/robot(0))
+ L.ForceContractDisease(new /datum/disease/transformation/robot(), FALSE, TRUE)
/datum/reagent/xenomicrobes
name = "Xenomicrobes"
@@ -1108,8 +1134,11 @@
taste_description = "sludge"
/datum/reagent/xenomicrobes/reaction_mob(mob/M, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0)
+ if(!isliving(M))
+ return
+ var/mob/living/L = M
if(method==PATCH || method==INGEST || method==INJECT || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection))))
- M.ForceContractDisease(new /datum/disease/transformation/xeno(0))
+ L.ForceContractDisease(new /datum/disease/transformation/xeno(), FALSE, TRUE)
/datum/reagent/fungalspores
name = "Tubercle bacillus Cosmosis microbes"
@@ -1120,8 +1149,11 @@
taste_description = "slime"
/datum/reagent/fungalspores/reaction_mob(mob/M, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0)
+ if(!isliving(M))
+ return
+ var/mob/living/L = M
if(method==PATCH || method==INGEST || method==INJECT || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection))))
- M.ForceContractDisease(new /datum/disease/tuberculosis(0))
+ L.ForceContractDisease(new /datum/disease/tuberculosis(), FALSE, TRUE)
/datum/reagent/fluorosurfactant//foam precursor
name = "Fluorosurfactant"
@@ -1812,4 +1844,4 @@
var/datum/antagonist/changeling/changeling = L.mind.has_antag_datum(/datum/antagonist/changeling)
if(changeling)
changeling.chem_charges = max(changeling.chem_charges-2, 0)
- return ..()
\ No newline at end of file
+ return ..()
diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
index aba6f580ef..e77d87c5b6 100644
--- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
@@ -100,16 +100,14 @@
/datum/reagent/toxin/lexorin/on_mob_life(mob/living/M)
. = TRUE
- var/mob/living/carbon/C
- if(iscarbon(M))
- C = M
- CHECK_DNA_AND_SPECIES(C)
- if(NOBREATH in C.dna.species.species_traits)
- . = FALSE
+
+ if(M.has_trait(TRAIT_NOBREATH))
+ . = FALSE
if(.)
M.adjustOxyLoss(5, 0)
- if(C)
+ if(iscarbon(M))
+ var/mob/living/carbon/C = M
C.losebreath += 2
if(prob(20))
M.emote("gasp")
@@ -184,7 +182,7 @@
/datum/reagent/toxin/mindbreaker
name = "Mindbreaker Toxin"
id = "mindbreaker"
- description = "A powerful hallucinogen. Not a thing to be messed with."
+ description = "A powerful hallucinogen. Not a thing to be messed with. For some mental patients. it counteracts their symptoms and anchors them to reality."
color = "#B31008" // rgb: 139, 166, 233
toxpwr = 0
taste_description = "sourness"
@@ -810,6 +808,7 @@
toxpwr = 1
var/acidpwr = 10 //the amount of protection removed from the armour
taste_description = "acid"
+ self_consuming = TRUE
/datum/reagent/toxin/acid/reaction_mob(mob/living/carbon/C, method=TOUCH, reac_volume)
if(!istype(C))
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index d6213a391b..054fe077c3 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -18,7 +18,7 @@
volume = vol
create_reagents(volume)
if(spawned_disease)
- var/datum/disease/F = new spawned_disease(0)
+ var/datum/disease/F = new spawned_disease()
var/list/data = list("viruses"= list(F))
reagents.add_reagent("blood", disease_amount, data)
diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm
index 7afba472ba..5ae253022f 100644
--- a/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/code/modules/reagents/reagent_containers/hypospray.dm
@@ -167,3 +167,10 @@
volume = 1
amount_per_transfer_from_this = 1
list_reagents = list("unstablemutationtoxin" = 1)
+
+/obj/item/reagent_containers/hypospray/combat/heresypurge
+ name = "holy water autoinjector"
+ desc = "A modified air-needle autoinjector for use in combat situations. Prefilled with 5 doses of a holy water mixture."
+ volume = 250
+ list_reagents = list("holywater" = 150, "tiresolution" = 50, "dizzysolution" = 50)
+ amount_per_transfer_from_this = 50
diff --git a/code/modules/reagents/reagent_containers/medspray.dm b/code/modules/reagents/reagent_containers/medspray.dm
new file mode 100644
index 0000000000..2f715084ad
--- /dev/null
+++ b/code/modules/reagents/reagent_containers/medspray.dm
@@ -0,0 +1,91 @@
+/obj/item/reagent_containers/medspray
+ name = "medical spray"
+ desc = "A medical spray bottle, designed for precision application, with an unscrewable cap."
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "medspray"
+ item_state = "spraycan"
+ lefthand_file = 'icons/mob/inhands/equipment/hydroponics_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/hydroponics_righthand.dmi'
+ flags_1 = NOBLUDGEON_1
+ obj_flags = UNIQUE_RENAME
+ container_type = OPENCONTAINER
+ slot_flags = SLOT_BELT
+ throwforce = 0
+ w_class = WEIGHT_CLASS_SMALL
+ throw_speed = 3
+ throw_range = 7
+ amount_per_transfer_from_this = 10
+ volume = 60
+ var/can_fill_from_container = TRUE
+ var/apply_type = PATCH
+ var/apply_method = "spray"
+ var/self_delay = 30
+ var/squirt_mode = 0
+ var/squirt_amount = 5
+
+/obj/item/reagent_containers/medspray/attack_self(mob/user)
+ squirt_mode = !squirt_mode
+ if(squirt_mode)
+ amount_per_transfer_from_this = squirt_amount
+ else
+ amount_per_transfer_from_this = initial(amount_per_transfer_from_this)
+ to_chat(user, "You will now apply the medspray's contents in [squirt_mode ? "short bursts":"extended sprays"]. You'll now use [amount_per_transfer_from_this] units per use. ")
+
+/obj/item/reagent_containers/medspray/attack(mob/M, mob/user, def_zone)
+ if(!reagents || !reagents.total_volume)
+ to_chat(user, "[src] is empty! ")
+ return
+
+ if(M == user)
+ M.visible_message("[user] attempts to [apply_method] [src] on themselves. ")
+ if(self_delay)
+ if(!do_mob(user, M, self_delay))
+ return
+ if(!reagents || !reagents.total_volume)
+ return
+ to_chat(M, "You [apply_method] yourself with [src]. ")
+
+ else
+ add_logs(user, M, "attempted to apply", src, reagents.log_list())
+ M.visible_message("[user] attempts to [apply_method] [src] on [M]. ", \
+ "[user] attempts to [apply_method] [src] on [M]. ")
+ if(!do_mob(user, M))
+ return
+ if(!reagents || !reagents.total_volume)
+ return
+ M.visible_message("[user] [apply_method]s [M] down with [src]. ", \
+ "[user] [apply_method]s [M] down with [src]. ")
+
+ if(!reagents || !reagents.total_volume)
+ return
+
+ else
+ add_logs(user, M, "applied", src, reagents.log_list())
+ playsound(src, 'sound/effects/spray2.ogg', 50, 1, -6)
+ var/fraction = min(amount_per_transfer_from_this/reagents.total_volume, 1)
+ reagents.reaction(M, apply_type, fraction)
+ reagents.trans_to(M, amount_per_transfer_from_this)
+ return
+
+/obj/item/reagent_containers/medspray/styptic
+ name = "medical spray (styptic powder)"
+ desc = "A medical spray bottle, designed for precision application, with an unscrewable cap. This one contains styptic powder, for treating cuts and bruises."
+ icon_state = "brutespray"
+ list_reagents = list("styptic_powder" = 60)
+
+/obj/item/reagent_containers/medspray/silver_sulf
+ name = "medical spray (silver sulfadiazine)"
+ desc = "A medical spray bottle, designed for precision application, with an unscrewable cap. This one contains silver sulfadiazine, useful for treating burns."
+ icon_state = "burnspray"
+ list_reagents = list("silver_sulfadiazine" = 60)
+
+/obj/item/reagent_containers/medspray/synthflesh
+ name = "medical spray (synthflesh)"
+ desc = "A medical spray bottle, designed for precision application, with an unscrewable cap. This one contains synthflesh, an apex brute and burn healing agent."
+ icon_state = "synthspray"
+ list_reagents = list("synthflesh" = 60)
+
+/obj/item/reagent_containers/medspray/sterilizine
+ name = "sterilizer spray"
+ desc = "Spray bottle loaded with non-toxic sterilizer. Useful in preparation for surgery."
+ list_reagents = list("sterilizine" = 60)
diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm
index 68507d673a..4b2e3f128c 100644
--- a/code/modules/reagents/reagent_containers/spray.dm
+++ b/code/modules/reagents/reagent_containers/spray.dm
@@ -147,11 +147,14 @@
/obj/item/reagent_containers/spray/cleaner
name = "space cleaner"
desc = "BLAM!-brand non-foaming space cleaner!"
- list_reagents = list("cleaner" = 250)
+ volume = 100
+ list_reagents = list("cleaner" = 100)
+ amount_per_transfer_from_this = 2
+ stream_amount = 5
/obj/item/reagent_containers/spray/cleaner/suicide_act(mob/user)
user.visible_message("[user] is putting the nozzle of \the [src] in [user.p_their()] mouth. It looks like [user.p_theyre()] trying to commit suicide! ")
- if(do_mob(user,user,30))
+ if(do_mob(user,user,30))
if(reagents.total_volume >= amount_per_transfer_from_this)//if not empty
user.visible_message("[user] pulls the trigger! ")
src.spray(user)
@@ -171,19 +174,6 @@
list_reagents = list("spraytan" = 50)
-/obj/item/reagent_containers/spray/medical
- name = "medical spray"
- icon = 'icons/obj/chemical.dmi'
- icon_state = "medspray"
- volume = 100
-
-
-/obj/item/reagent_containers/spray/medical/sterilizer
- name = "sterilizer spray"
- desc = "Spray bottle loaded with non-toxic sterilizer. Useful in preparation for surgery."
- list_reagents = list("sterilizine" = 100)
-
-
//pepperspray
/obj/item/reagent_containers/spray/pepper
name = "pepperspray"
diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm
deleted file mode 100644
index a35c261120..0000000000
--- a/code/modules/research/circuitprinter.dm
+++ /dev/null
@@ -1,125 +0,0 @@
-/*///////////////Circuit Imprinter (By Darem)////////////////////////
- Used to print new circuit boards (for computers and similar systems) and AI modules. Each circuit board pattern are stored in
-a /datum/desgin on the linked R&D console. You can then print them out in a fasion similar to a regular lathe. However, instead of
-using metal and glass, it uses glass and reagents (usually sulfuric acis).
-
-*/
-/obj/machinery/rnd/circuit_imprinter
- name = "circuit imprinter"
- desc = "Manufactures circuit boards for the construction of machines."
- icon_state = "circuit_imprinter"
- container_type = OPENCONTAINER
- circuit = /obj/item/circuitboard/machine/circuit_imprinter
-
- var/efficiency_coeff
-
- var/datum/component/material_container/materials //Store for hyper speed!
-
- var/list/categories = list(
- "AI Modules",
- "Computer Boards",
- "Teleportation Machinery",
- "Medical Machinery",
- "Engineering Machinery",
- "Exosuit Modules",
- "Hydroponics Machinery",
- "Subspace Telecomms",
- "Research Machinery",
- "Misc. Machinery",
- "Computer Parts"
- )
-
-/obj/machinery/rnd/circuit_imprinter/Initialize()
- materials = AddComponent(/datum/component/material_container, list(MAT_GLASS, MAT_GOLD, MAT_DIAMOND, MAT_METAL, MAT_BLUESPACE), 0,
- FALSE, list(/obj/item/stack, /obj/item/stack/ore/bluespace_crystal), CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert))
- materials.precise_insertion = TRUE
- create_reagents(0)
- RefreshParts()
- return ..()
-
-/obj/machinery/rnd/circuit_imprinter/RefreshParts()
- reagents.maximum_volume = 0
- for(var/obj/item/reagent_containers/glass/G in component_parts)
- reagents.maximum_volume += G.volume
- G.reagents.trans_to(src, G.reagents.total_volume)
-
- GET_COMPONENT(materials, /datum/component/material_container)
- materials.max_amount = 0
- for(var/obj/item/stock_parts/matter_bin/M in component_parts)
- materials.max_amount += M.rating * 75000
-
- var/T = 0
- for(var/obj/item/stock_parts/manipulator/M in component_parts)
- T += M.rating
- efficiency_coeff = 2 ** (T - 1) //Only 1 manipulator here, you're making runtimes Razharas
-
-/obj/machinery/rnd/circuit_imprinter/blob_act(obj/structure/blob/B)
- if (prob(50))
- qdel(src)
-
-/obj/machinery/rnd/circuit_imprinter/proc/check_mat(datum/design/being_built, M) // now returns how many times the item can be built with the material
- var/list/all_materials = being_built.reagents_list + being_built.materials
-
- GET_COMPONENT(materials, /datum/component/material_container)
- var/A = materials.amount(M)
- if(!A)
- A = reagents.get_reagent_amount(M)
-
- return round(A / max(1, (all_materials[M]/efficiency_coeff)))
-
-//we eject the materials upon deconstruction.
-/obj/machinery/rnd/circuit_imprinter/on_deconstruction()
- for(var/obj/item/reagent_containers/glass/G in component_parts)
- reagents.trans_to(G, G.reagents.maximum_volume)
- GET_COMPONENT(materials, /datum/component/material_container)
- materials.retrieve_all()
- ..()
-
-
-/obj/machinery/rnd/circuit_imprinter/disconnect_console()
- linked_console.linked_imprinter = null
- ..()
-
-/obj/machinery/rnd/circuit_imprinter/proc/user_try_print_id(id)
- if((!linked_console && requires_console) || !id)
- return FALSE
- var/datum/design/D = (linked_console || requires_console)? linked_console.stored_research.researched_designs[id] : get_techweb_design_by_id(id)
- if(!istype(D))
- return FALSE
-
- var/power = 1000
- for(var/M in D.materials)
- power += round(D.materials[M] / 5)
- power = max(4000, power)
- use_power(power)
-
- var/list/efficient_mats = list()
- for(var/MAT in D.materials)
- efficient_mats[MAT] = D.materials[MAT]/efficiency_coeff
-
- if(!materials.has_materials(efficient_mats))
- say("Not enough materials to complete prototype.")
- return FALSE
- for(var/R in D.reagents_list)
- if(!reagents.has_reagent(R, D.reagents_list[R]/efficiency_coeff))
- say("Not enough reagents to complete prototype.")
- return FALSE
-
- busy = TRUE
- flick("circuit_imprinter_ani", src)
- materials.use_amount(efficient_mats)
- for(var/R in D.reagents_list)
- reagents.remove_reagent(R, D.reagents_list[R]/efficiency_coeff)
-
- var/P = D.build_path
- addtimer(CALLBACK(src, .proc/reset_busy), 16)
- addtimer(CALLBACK(src, .proc/do_print, P, efficient_mats, D.dangerous_construction), 16)
- return TRUE
-
-/obj/machinery/rnd/circuit_imprinter/proc/do_print(path, list/matlist, notify_admins)
- if(notify_admins && usr)
- investigate_log("[key_name(usr)] built [path] at a circuit imprinter.", INVESTIGATE_RESEARCH)
- message_admins("[ADMIN_LOOKUPFLW(usr)] has built [path] at a circuit imprinter.")
- var/obj/item/I = new path(get_turf(src))
- I.materials = matlist.Copy()
- SSblackbox.record_feedback("nested tally", "circuit_printed", 1, list("[type]", "[path]"))
diff --git a/code/modules/research/departmental_circuit_imprinter.dm b/code/modules/research/departmental_circuit_imprinter.dm
deleted file mode 100644
index 01c4a6a22c..0000000000
--- a/code/modules/research/departmental_circuit_imprinter.dm
+++ /dev/null
@@ -1,200 +0,0 @@
-/obj/machinery/rnd/circuit_imprinter/department
- name = "Department Circuit Imprinter"
- desc = "A special circuit imprinter with a built in interface meant for departmental usage, with built in ExoSync recievers allowing it to print designs researched that match its ROM-encoded department type. Features a bluespace materials reciever for recieving materials without the hassle of running to mining!"
- icon_state = "circuit_imprinter"
- container_type = OPENCONTAINER
- circuit = /obj/item/circuitboard/machine/circuit_imprinter/department
- requires_console = FALSE
-
- var/list/datum/design/cached_designs
- var/list/datum/design/matching_designs
- var/department_tag = "Unidentified" //used for material distribution among other things.
- var/datum/techweb/stored_research
- var/datum/techweb/host_research
- var/screen = DEPPRINTER_SCREEN_PRIMARY
-
-/obj/machinery/rnd/circuit_imprinter/department/science
- allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_SCIENCE
- department_tag = "Science"
-
-/obj/machinery/rnd/circuit_imprinter/department/Initialize()
- . = ..()
- stored_research = new
- cached_designs = list()
- host_research = SSresearch.science_tech
- matching_designs = list()
- update_research()
-
-/obj/machinery/rnd/circuit_imprinter/department/Destroy()
- QDEL_NULL(stored_research)
- return ..()
-
-/obj/machinery/rnd/circuit_imprinter/department/user_try_print_id(id, amount)
- var/datum/design/D = get_techweb_design_by_id(id)
- if(!D || !(D.departmental_flags & allowed_department_flags))
- say("Warning: Printing failed. Please update the research data with the on-screen button!")
- return FALSE
- . = ..()
-
-/obj/machinery/rnd/circuit_imprinter/department/attack_hand(mob/user)
- if(..())
- return
- interact(user)
-
-/obj/machinery/rnd/circuit_imprinter/department/interact(mob/user)
- user.set_machine(src)
-
- var/datum/browser/popup = new(user, "rndconsole", name, 460, 550)
- popup.set_content(generate_ui())
- popup.open()
-
-/obj/machinery/rnd/circuit_imprinter/department/proc/search(string)
- matching_designs.Cut()
- for(var/v in stored_research.researched_designs)
- var/datum/design/D = stored_research.researched_designs[v]
- if(!(D.build_type & IMPRINTER) || !(D.departmental_flags & allowed_department_flags))
- continue
- if(findtext(D.name,string))
- matching_designs.Add(D)
-
-/obj/machinery/rnd/circuit_imprinter/department/proc/update_research()
- host_research.copy_research_to(stored_research, TRUE)
- update_designs()
-
-/obj/machinery/rnd/circuit_imprinter/department/proc/update_designs()
- cached_designs.Cut()
- for(var/i in stored_research.researched_designs)
- var/datum/design/d = stored_research.researched_designs[i]
- if((d.departmental_flags & allowed_department_flags) && (d.build_type & IMPRINTER))
- cached_designs |= d
-
-/obj/machinery/rnd/circuit_imprinter/department/proc/generate_ui()
- var/list/ui = list()
- ui += ui_header()
- switch(screen)
- if(DEPPRINTER_SCREEN_MATERIALS)
- ui += ui_materials()
- if(DEPPRINTER_SCREEN_CHEMICALS)
- ui += ui_chemicals()
- if(DEPPRINTER_SCREEN_SEARCH)
- ui += ui_search()
- else
- ui += ui_department_imprinter()
- for(var/i in 1 to length(ui))
- if(!findtextEx(ui[i], RDSCREEN_NOBREAK))
- ui[i] += " "
- ui[i] = replacetextEx(ui[i], RDSCREEN_NOBREAK, "")
- return ui.Join("")
-
-/obj/machinery/rnd/circuit_imprinter/department/proc/ui_search() //Legacy code
- var/list/l = list()
- l += "Search Results: "
- l += " "
- var/coeff = efficiency_coeff
- for(var/datum/design/D in matching_designs)
- var/temp_materials
- var/check_materials = TRUE
- var/all_materials = D.materials + D.reagents_list
- for(var/M in all_materials)
- temp_materials += " | "
- if (!check_mat(D, M))
- check_materials = FALSE
- temp_materials += " [all_materials[M]/coeff] [CallMaterialName(M)] "
- else
- temp_materials += " [all_materials[M]/coeff] [CallMaterialName(M)]"
- if (check_materials)
- l += "[D.name] [temp_materials]"
- else
- l += "[D.name] [temp_materials]"
- l += ""
- return l
-
-/obj/machinery/rnd/circuit_imprinter/department/proc/ui_department_imprinter()
- var/list/l = list()
- var/coeff = efficiency_coeff
- l += " "
- for(var/datum/design/D in cached_designs)
- var/temp_materials
- var/check_materials = TRUE
- var/all_materials = D.materials + D.reagents_list
- for(var/M in all_materials)
- temp_materials += " | "
- if (!check_mat(D, M))
- check_materials = FALSE
- temp_materials += " [all_materials[M]/coeff] [CallMaterialName(M)] "
- else
- temp_materials += " [all_materials[M]/coeff] [CallMaterialName(M)]"
- if (check_materials)
- l += "[D.name] [temp_materials]"
- else
- l += "[D.name] [temp_materials]"
- l += ""
- return l
-
-/obj/machinery/rnd/circuit_imprinter/department/proc/ui_header()
- var/list/l = list()
- l += "[RDSCREEN_NOBREAK]"
- return l
-
-/obj/machinery/rnd/circuit_imprinter/department/proc/ui_materials()
- var/list/l = list()
- l += "Material Storage: "
- for(var/mat_id in materials.materials)
- var/datum/material/M = materials.materials[mat_id]
- l += "* [M.amount] of [M.name]: "
- if(M.amount >= MINERAL_MATERIAL_AMOUNT) l += "
Eject [RDSCREEN_NOBREAK]"
- if(M.amount >= MINERAL_MATERIAL_AMOUNT*5) l += "
5x [RDSCREEN_NOBREAK]"
- if(M.amount >= MINERAL_MATERIAL_AMOUNT) l += "
All [RDSCREEN_NOBREAK]"
- l += ""
- l += "
[RDSCREEN_NOBREAK]"
- return l
-
-/obj/machinery/rnd/circuit_imprinter/department/proc/ui_chemicals()
- var/list/l = list()
- l += ""
- return l
-
-/obj/machinery/rnd/circuit_imprinter/department/Topic(raw, ls)
- if(..())
- return
- add_fingerprint(usr)
- usr.set_machine(src)
- if(ls["switch_screen"])
- screen = text2num(ls["switch_screen"])
- if(ls["imprint"]) //Causes the circuit_imprinter to build something.
- if(busy)
- say("Warning: Fabricators busy!")
- else
- user_try_print_id(ls["imprint"])
- if(ls["search"]) //Search for designs with name matching pattern
- search(ls["to_search"])
- screen = DEPPRINTER_SCREEN_SEARCH
- if(ls["sync_research"])
- update_research()
- say("Synchronizing research with host technology database.")
- if(ls["dispose"]) //Causes the protolathe to dispose of a single reagent (all of it)
- reagents.del_reagent(ls["dispose"])
- if(ls["disposeall"]) //Causes the protolathe to dispose of all it's reagents.
- reagents.clear_reagents()
- if(ls["ejectsheet"]) //Causes the protolathe to eject a sheet of material
- materials.retrieve_sheets(text2num(ls["eject_amt"]), ls["ejectsheet"])
diff --git a/code/modules/research/departmental_lathe.dm b/code/modules/research/departmental_lathe.dm
deleted file mode 100644
index ab893e7853..0000000000
--- a/code/modules/research/departmental_lathe.dm
+++ /dev/null
@@ -1,244 +0,0 @@
-/obj/machinery/rnd/protolathe/department
- name = "department protolathe"
- desc = "A special protolathe with a built in interface meant for departmental usage, with built in ExoSync recievers allowing it to print designs researched that match its ROM-encoded department type. Features a bluespace materials reciever for recieving materials without the hassle of running to mining!"
- icon_state = "protolathe"
- container_type = OPENCONTAINER
- circuit = /obj/item/circuitboard/machine/protolathe/department
- requires_console = FALSE
-
- var/list/datum/design/cached_designs
- var/list/datum/design/matching_designs
- var/department_tag = "Unidentified" //used for material distribution among other things.
- var/datum/techweb/stored_research
- var/datum/techweb/host_research
- var/screen = DEPLATHE_SCREEN_PRIMARY
-
-/obj/machinery/rnd/protolathe/department/engineering
- allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_ENGINEERING
- department_tag = "Engineering"
- circuit = /obj/item/circuitboard/machine/protolathe/department/engineering
-
-/obj/machinery/rnd/protolathe/department/service
- allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_SERVICE
- department_tag = "Service"
- circuit = /obj/item/circuitboard/machine/protolathe/department/service
-
-/obj/machinery/rnd/protolathe/department/medical
- allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_MEDICAL
- department_tag = "Medical"
- circuit = /obj/item/circuitboard/machine/protolathe/department/medical
-
-/obj/machinery/rnd/protolathe/department/cargo
- allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_CARGO
- department_tag = "Cargo"
- circuit = /obj/item/circuitboard/machine/protolathe/department/cargo
-
-/obj/machinery/rnd/protolathe/department/science
- allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_SCIENCE
- department_tag = "Science"
- circuit = /obj/item/circuitboard/machine/protolathe/department/science
-
-/obj/machinery/rnd/protolathe/department/security
- allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_SECURITY
- department_tag = "Security"
- circuit = /obj/item/circuitboard/machine/protolathe/department/security
-
-/obj/machinery/rnd/protolathe/department/Initialize()
- . = ..()
- matching_designs = list()
- cached_designs = list()
- stored_research = new
- host_research = SSresearch.science_tech
- update_research()
-
-/obj/machinery/rnd/protolathe/department/Destroy()
- QDEL_NULL(stored_research)
- return ..()
-
-/obj/machinery/rnd/protolathe/department/user_try_print_id(id, amount)
- var/datum/design/D = get_techweb_design_by_id(id)
- if(!D || !(D.departmental_flags & allowed_department_flags))
- say("Warning: Printing failed. Please update the research data with the on-screen button!")
- return FALSE
- . = ..()
-
-/obj/machinery/rnd/protolathe/department/attack_hand(mob/user)
- if(..())
- return
- interact(user)
-
-/obj/machinery/rnd/protolathe/department/interact(mob/user)
- user.set_machine(src)
- var/datum/browser/popup = new(user, "rndconsole", name, 460, 550)
- popup.set_content(generate_ui())
- popup.open()
-
-/obj/machinery/rnd/protolathe/department/proc/search(string)
- matching_designs.Cut()
- for(var/v in stored_research.researched_designs)
- var/datum/design/D = stored_research.researched_designs[v]
- if(!(D.build_type & PROTOLATHE) || !(D.departmental_flags & allowed_department_flags))
- continue
- if(findtext(D.name,string))
- matching_designs.Add(D)
-
-/obj/machinery/rnd/protolathe/department/proc/update_research()
- host_research.copy_research_to(stored_research, TRUE)
- update_designs()
-
-/obj/machinery/rnd/protolathe/department/proc/update_designs()
- cached_designs.Cut()
- for(var/i in stored_research.researched_designs)
- var/datum/design/d = stored_research.researched_designs[i]
- if((d.departmental_flags & allowed_department_flags) && (d.build_type & PROTOLATHE))
- cached_designs |= d
-
-/obj/machinery/rnd/protolathe/department/proc/generate_ui()
- var/list/ui = list()
- ui += ui_header()
- switch(screen)
- if(DEPLATHE_SCREEN_MATERIALS)
- ui += ui_materials()
- if(DEPLATHE_SCREEN_CHEMICALS)
- ui += ui_chemicals()
- if(DEPLATHE_SCREEN_SEARCH)
- ui += ui_search()
- else
- ui += ui_department_lathe()
- for(var/i in 1 to length(ui))
- if(!findtextEx(ui[i], RDSCREEN_NOBREAK))
- ui[i] += " "
- ui[i] = replacetextEx(ui[i], RDSCREEN_NOBREAK, "")
- return ui.Join("")
-
-/obj/machinery/rnd/protolathe/department/proc/ui_search() //Legacy code
- var/list/l = list()
- var/coeff = efficiency_coeff
- l += "Search Results: "
- l += " "
- for(var/datum/design/D in matching_designs)
- var/temp_material
- var/c = 50
- var/t
- var/all_materials = D.materials + D.reagents_list
- for(var/M in all_materials)
- t = check_mat(D, M)
- temp_material += " | "
- if (t < 1)
- temp_material += "[all_materials[M]*coeff] [CallMaterialName(M)] "
- else
- temp_material += " [all_materials[M]*coeff] [CallMaterialName(M)]"
- c = min(c,t)
-
- if (c >= 1)
- l += "[D.name] [RDSCREEN_NOBREAK]"
- if(c >= 5)
- l += "x5 [RDSCREEN_NOBREAK]"
- if(c >= 10)
- l += "x10 [RDSCREEN_NOBREAK]"
- l += "[temp_material][RDSCREEN_NOBREAK]"
- else
- l += "[D.name] [temp_material][RDSCREEN_NOBREAK]"
- l += ""
- l += ""
- return l
-
-/obj/machinery/rnd/protolathe/department/proc/ui_department_lathe()
- var/list/l = list()
- var/coeff = efficiency_coeff
- l += " "
- for(var/datum/design/D in cached_designs)
- var/temp_material
- var/c = 50
- var/t
- var/all_materials = D.materials + D.reagents_list
- for(var/M in all_materials)
- t = check_mat(D, M)
- temp_material += " | "
- if (t < 1)
- temp_material += "[all_materials[M]*coeff] [CallMaterialName(M)] "
- else
- temp_material += " [all_materials[M]*coeff] [CallMaterialName(M)]"
- c = min(c,t)
-
- if (c >= 1)
- l += "[D.name] [RDSCREEN_NOBREAK]"
- if(c >= 5)
- l += "x5 [RDSCREEN_NOBREAK]"
- if(c >= 10)
- l += "x10 [RDSCREEN_NOBREAK]"
- l += "[temp_material][RDSCREEN_NOBREAK]"
- else
- l += "[D.name] [temp_material][RDSCREEN_NOBREAK]"
- l += ""
- l += ""
- return l
-
-/obj/machinery/rnd/protolathe/department/proc/ui_header()
- var/list/l = list()
- l += "[RDSCREEN_NOBREAK]"
- return l
-
-/obj/machinery/rnd/protolathe/department/proc/ui_materials()
- var/list/l = list()
- l += "Material Storage: "
- for(var/mat_id in materials.materials)
- var/datum/material/M = materials.materials[mat_id]
- l += "* [M.amount] of [M.name]: "
- if(M.amount >= MINERAL_MATERIAL_AMOUNT) l += "
Eject [RDSCREEN_NOBREAK]"
- if(M.amount >= MINERAL_MATERIAL_AMOUNT*5) l += "
5x [RDSCREEN_NOBREAK]"
- if(M.amount >= MINERAL_MATERIAL_AMOUNT) l += "
All [RDSCREEN_NOBREAK]"
- l += ""
- l += "
[RDSCREEN_NOBREAK]"
- return l
-
-/obj/machinery/rnd/protolathe/department/proc/ui_chemicals()
- var/list/l = list()
- l += ""
- return l
-
-/obj/machinery/rnd/protolathe/department/Topic(raw, ls)
- if(..())
- return
- add_fingerprint(usr)
- usr.set_machine(src)
- if(ls["switch_screen"])
- screen = text2num(ls["switch_screen"])
- if(ls["build"]) //Causes the Protolathe to build something.
- if(busy)
- say("Warning: Fabricators busy!")
- else
- user_try_print_id(ls["build"], ls["amount"])
- if(ls["search"]) //Search for designs with name matching pattern
- search(ls["to_search"])
- screen = DEPLATHE_SCREEN_SEARCH
- if(ls["sync_research"])
- update_research()
- say("Synchronizing research with host technology database.")
- if(ls["dispose"]) //Causes the protolathe to dispose of a single reagent (all of it)
- reagents.del_reagent(ls["dispose"])
- if(ls["disposeall"]) //Causes the protolathe to dispose of all it's reagents.
- reagents.clear_reagents()
- if(ls["ejectsheet"]) //Causes the protolathe to eject a sheet of material
- materials.retrieve_sheets(text2num(ls["eject_amt"]), ls["ejectsheet"])
- updateUsrDialog()
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index 25e2c8115c..52f06a0acc 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -423,6 +423,14 @@
build_path = /obj/item/device/healthanalyzer
category = list("initial", "Medical")
+/datum/design/pillbottle
+ name = "Pill Bottle"
+ id = "pillbottle"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 20, MAT_GLASS = 100)
+ build_path = /obj/item/storage/pill_bottle
+ category = list("initial", "Medical")
+
/datum/design/beanbag_slug
name = "Beanbag Slug"
id = "beanbag_slug"
diff --git a/code/modules/research/designs/bluespace_designs.dm b/code/modules/research/designs/bluespace_designs.dm
index f5170066e2..799df94c0c 100644
--- a/code/modules/research/designs/bluespace_designs.dm
+++ b/code/modules/research/designs/bluespace_designs.dm
@@ -9,7 +9,7 @@
id = "beacon"
build_type = PROTOLATHE
materials = list(MAT_METAL = 150, MAT_GLASS = 100)
- build_path = /obj/item/device/radio/beacon
+ build_path = /obj/item/device/beacon
category = list("Bluespace Designs")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SECURITY
diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm
index 189c06dd36..6205a214b7 100644
--- a/code/modules/research/designs/misc_designs.dm
+++ b/code/modules/research/designs/misc_designs.dm
@@ -257,6 +257,16 @@
category = list("Electronics")
departmental_flags = DEPARTMENTAL_FLAG_SERVICE
+/datum/design/roastingstick
+ name = "Advanced roasting stick"
+ desc = "A roasting stick for cooking sausages in exotic ovens."
+ id = "roastingstick"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL=1000, MAT_GLASS=500, MAT_BLUESPACE = 250)
+ build_path = /obj/item/melee/roastingstick
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SERVICE
+
/////////////////////////////////////////
////////////Janitor Designs//////////////
/////////////////////////////////////////
diff --git a/code/modules/research/machinery/_production.dm b/code/modules/research/machinery/_production.dm
new file mode 100644
index 0000000000..ac5d1b225a
--- /dev/null
+++ b/code/modules/research/machinery/_production.dm
@@ -0,0 +1,333 @@
+/obj/machinery/rnd/production
+ name = "technology fabricator"
+ desc = "Makes researched and prototype items with materials and energy."
+ container_type = OPENCONTAINER
+
+ var/consoleless_interface = FALSE //Whether it can be used without a console.
+ var/efficiency_coeff = 1 //Materials needed / coeff = actual.
+ var/list/categories = list()
+ var/datum/component/material_container/materials //Store for hyper speed!
+ var/allowed_department_flags = ALL
+ var/production_animation //What's flick()'d on print.
+ var/allowed_buildtypes = NONE
+ var/list/datum/design/cached_designs
+ var/list/datum/design/matching_designs
+ var/department_tag = "Unidentified" //used for material distribution among other things.
+ var/datum/techweb/stored_research
+ var/datum/techweb/host_research
+
+ var/screen = RESEARCH_FABRICATOR_SCREEN_MAIN
+ var/selected_category
+
+/obj/machinery/rnd/production/Initialize()
+ . = ..()
+ create_reagents(0)
+ materials = AddComponent(/datum/component/material_container,
+ list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE), 0,
+ FALSE, list(/obj/item/stack), CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert))
+ materials.precise_insertion = TRUE
+ RefreshParts()
+ matching_designs = list()
+ cached_designs = list()
+ stored_research = new
+ host_research = SSresearch.science_tech
+ update_research()
+
+/obj/machinery/rnd/production/proc/update_research()
+ host_research.copy_research_to(stored_research, TRUE)
+ update_designs()
+
+/obj/machinery/rnd/production/proc/update_designs()
+ cached_designs.Cut()
+ for(var/i in stored_research.researched_designs)
+ var/datum/design/d = stored_research.researched_designs[i]
+ if((d.departmental_flags & allowed_department_flags) && (d.build_type & allowed_buildtypes))
+ cached_designs |= d
+
+/obj/machinery/rnd/production/RefreshParts()
+ calculate_efficiency()
+
+/obj/machinery/rnd/production/attack_hand(mob/user)
+ interact(user) //remove this snowflake shit when the refactor of storage components or some other pr that unsnowflakes attack_hand on machinery is in
+
+/obj/machinery/rnd/production/interact(mob/user)
+ if(!consoleless_interface)
+ return ..()
+ user.set_machine(src)
+ var/datum/browser/popup = new(user, "rndconsole", name, 460, 550)
+ popup.set_content(generate_ui())
+ popup.open()
+
+/obj/machinery/rnd/production/Destroy()
+ QDEL_NULL(stored_research)
+ return ..()
+
+/obj/machinery/rnd/production/proc/calculate_efficiency()
+ efficiency_coeff = 1
+ if(reagents) //If reagents/materials aren't initialized, don't bother, we'll be doing this again after reagents init anyways.
+ reagents.maximum_volume = 0
+ for(var/obj/item/reagent_containers/glass/G in component_parts)
+ reagents.maximum_volume += G.volume
+ G.reagents.trans_to(src, G.reagents.total_volume)
+ if(materials)
+ materials.max_amount = 0
+ for(var/obj/item/stock_parts/matter_bin/M in component_parts)
+ materials.max_amount += M.rating * 75000
+ var/total_rating = 0
+ for(var/obj/item/stock_parts/manipulator/M in component_parts)
+ total_rating += M.rating
+ total_rating = max(1, total_rating)
+ efficiency_coeff = total_rating
+
+//we eject the materials upon deconstruction.
+/obj/machinery/rnd/production/on_deconstruction()
+ for(var/obj/item/reagent_containers/glass/G in component_parts)
+ reagents.trans_to(G, G.reagents.maximum_volume)
+ materials.retrieve_all()
+ return ..()
+
+/obj/machinery/rnd/production/proc/do_print(path, amount, list/matlist, notify_admins)
+ if(notify_admins)
+ investigate_log("[key_name(usr)] built [amount] of [path] at [src]([type]).", INVESTIGATE_RESEARCH)
+ message_admins("[ADMIN_LOOKUPFLW(usr)] has built [amount] of [path] at a [src]([type]).")
+ for(var/i in 1 to amount)
+ var/obj/item/I = new path(get_turf(src))
+ if(!istype(I, /obj/item/stack/sheet) && !istype(I, /obj/item/stack/ore/bluespace_crystal))
+ I.materials = matlist.Copy()
+ SSblackbox.record_feedback("nested tally", "item_printed", amount, list("[type]", "[path]"))
+
+/obj/machinery/rnd/production/proc/check_mat(datum/design/being_built, M) // now returns how many times the item can be built with the material
+ var/list/all_materials = being_built.reagents_list + being_built.materials
+
+ var/A = materials.amount(M)
+ if(!A)
+ A = reagents.get_reagent_amount(M)
+
+ return round(A / max(1, (all_materials[M]/efficiency_coeff)))
+
+/obj/machinery/rnd/production/proc/user_try_print_id(id, amount)
+ if((!istype(linked_console) && requires_console) || !id)
+ return FALSE
+ if(istext(amount))
+ amount = text2num(amount)
+ if(isnull(amount))
+ amount = 1
+ var/datum/design/D = (linked_console || requires_console)? linked_console.stored_research.researched_designs[id] : get_techweb_design_by_id(id)
+ if(!istype(D))
+ return FALSE
+ if(!(D.departmental_flags & allowed_department_flags))
+ say("Warning: Printing failed: This fabricator does not have the necessary keys to decrypt design schematics. Please update the research data with the on-screen button and contact Nanotrasen Support!")
+ return FALSE
+ if(D.build_type && !(D.build_type & allowed_buildtypes))
+ say("This machine does not have the necessary manipulation systems for this design. Please contact Nanotrasen Support!")
+ return FALSE
+ var/power = 1000
+ amount = CLAMP(amount, 1, 50)
+ for(var/M in D.materials)
+ power += round(D.materials[M] * amount / 35)
+ power = min(3000, power)
+ use_power(power)
+ var/list/efficient_mats = list()
+ for(var/MAT in D.materials)
+ efficient_mats[MAT] = D.materials[MAT]/efficiency_coeff
+ if(!materials.has_materials(efficient_mats, amount))
+ say("Not enough materials to complete prototype[amount > 1? "s" : ""].")
+ return FALSE
+ for(var/R in D.reagents_list)
+ if(!reagents.has_reagent(R, D.reagents_list[R]*amount/efficiency_coeff))
+ say("Not enough reagents to complete prototype[amount > 1? "s" : ""].")
+ return FALSE
+ materials.use_amount(efficient_mats, amount)
+ for(var/R in D.reagents_list)
+ reagents.remove_reagent(R, D.reagents_list[R]*amount/efficiency_coeff)
+ busy = TRUE
+ if(production_animation)
+ flick(production_animation, src)
+ var/timecoeff = D.lathe_time_factor / efficiency_coeff
+ addtimer(CALLBACK(src, .proc/reset_busy), (30 * timecoeff * amount) ** 0.5)
+ addtimer(CALLBACK(src, .proc/do_print, D.build_path, amount, efficient_mats, D.dangerous_construction), (32 * timecoeff * amount) ** 0.8)
+ return TRUE
+
+/obj/machinery/rnd/production/proc/search(string)
+ matching_designs.Cut()
+ for(var/v in stored_research.researched_designs)
+ var/datum/design/D = stored_research.researched_designs[v]
+ if(!(D.build_type & allowed_buildtypes) || !(D.departmental_flags & allowed_department_flags))
+ continue
+ if(findtext(D.name,string))
+ matching_designs.Add(D)
+
+/obj/machinery/rnd/production/proc/generate_ui()
+ var/list/ui = list()
+ ui += ui_header()
+ switch(screen)
+ if(RESEARCH_FABRICATOR_SCREEN_MATERIALS)
+ ui += ui_screen_materials()
+ if(RESEARCH_FABRICATOR_SCREEN_CHEMICALS)
+ ui += ui_screen_chemicals()
+ if(RESEARCH_FABRICATOR_SCREEN_SEARCH)
+ ui += ui_screen_search()
+ if(RESEARCH_FABRICATOR_SCREEN_CATEGORYVIEW)
+ ui += ui_screen_category_view()
+ else
+ ui += ui_screen_main()
+ for(var/i in 1 to length(ui))
+ if(!findtextEx(ui[i], RDSCREEN_NOBREAK))
+ ui[i] += " "
+ ui[i] = replacetextEx(ui[i], RDSCREEN_NOBREAK, "")
+ return ui.Join("")
+
+/obj/machinery/rnd/production/proc/ui_header()
+ var/list/l = list()
+ l += "[RDSCREEN_NOBREAK]"
+ return l
+
+/obj/machinery/rnd/production/proc/ui_screen_materials()
+ var/list/l = list()
+ l += "Material Storage: "
+ for(var/mat_id in materials.materials)
+ var/datum/material/M = materials.materials[mat_id]
+ l += "* [M.amount] of [M.name]: "
+ if(M.amount >= MINERAL_MATERIAL_AMOUNT) l += "
Eject [RDSCREEN_NOBREAK]"
+ if(M.amount >= MINERAL_MATERIAL_AMOUNT*5) l += "
5x [RDSCREEN_NOBREAK]"
+ if(M.amount >= MINERAL_MATERIAL_AMOUNT) l += "
All [RDSCREEN_NOBREAK]"
+ l += ""
+ l += "
[RDSCREEN_NOBREAK]"
+ return l
+
+/obj/machinery/rnd/production/proc/ui_screen_chemicals()
+ var/list/l = list()
+ l += ""
+ return l
+
+/obj/machinery/rnd/production/proc/ui_screen_search()
+ var/list/l = list()
+ var/coeff = efficiency_coeff
+ l += "Search Results: "
+ l += " "
+ for(var/datum/design/D in matching_designs)
+ l += design_menu_entry(D, coeff)
+ l += ""
+ return l
+
+/obj/machinery/rnd/production/proc/design_menu_entry(datum/design/D, coeff)
+ if(!istype(D))
+ return
+ if(!coeff)
+ coeff = efficiency_coeff
+ var/list/l = list()
+ var/temp_material
+ var/c = 50
+ var/t
+ var/all_materials = D.materials + D.reagents_list
+ for(var/M in all_materials)
+ t = check_mat(D, M)
+ temp_material += " | "
+ if (t < 1)
+ temp_material += "[all_materials[M]/coeff] [CallMaterialName(M)] "
+ else
+ temp_material += " [all_materials[M]/coeff] [CallMaterialName(M)]"
+ c = min(c,t)
+
+ if (c >= 1)
+ l += "[D.name] [RDSCREEN_NOBREAK]"
+ if(c >= 5)
+ l += "x5 [RDSCREEN_NOBREAK]"
+ if(c >= 10)
+ l += "x10 [RDSCREEN_NOBREAK]"
+ l += "[temp_material][RDSCREEN_NOBREAK]"
+ else
+ l += "[D.name] [temp_material][RDSCREEN_NOBREAK]"
+ l += ""
+ return l
+
+/obj/machinery/rnd/production/Topic(raw, ls)
+ if(..())
+ return
+ add_fingerprint(usr)
+ usr.set_machine(src)
+ if(ls["switch_screen"])
+ screen = text2num(ls["switch_screen"])
+ if(ls["build"]) //Causes the Protolathe to build something.
+ if(busy)
+ say("Warning: Fabricators busy!")
+ else
+ user_try_print_id(ls["build"], ls["amount"])
+ if(ls["search"]) //Search for designs with name matching pattern
+ search(ls["to_search"])
+ screen = RESEARCH_FABRICATOR_SCREEN_SEARCH
+ if(ls["sync_research"])
+ update_research()
+ say("Synchronizing research with host technology database.")
+ if(ls["category"])
+ selected_category = ls["category"]
+ if(ls["dispose"]) //Causes the protolathe to dispose of a single reagent (all of it)
+ reagents.del_reagent(ls["dispose"])
+ if(ls["disposeall"]) //Causes the protolathe to dispose of all it's reagents.
+ reagents.clear_reagents()
+ if(ls["ejectsheet"]) //Causes the protolathe to eject a sheet of material
+ materials.retrieve_sheets(text2num(ls["eject_amt"]), ls["ejectsheet"])
+ updateUsrDialog()
+
+/obj/machinery/rnd/production/proc/ui_screen_main()
+ var/list/l = list()
+ l += " "
+
+ l += list_categories(categories, RESEARCH_FABRICATOR_SCREEN_CATEGORYVIEW)
+
+ return l
+
+/obj/machinery/rnd/production/proc/ui_screen_category_view()
+ if(!selected_category)
+ return ui_screen_main()
+ var/list/l = list()
+ l += "
Browsing [selected_category]: "
+ var/coeff = efficiency_coeff
+ for(var/v in stored_research.researched_designs)
+ var/datum/design/D = stored_research.researched_designs[v]
+ if(!(selected_category in D.category)|| !(D.build_type & allowed_buildtypes))
+ continue
+ if(!(D.departmental_flags & allowed_department_flags))
+ continue
+ l += design_menu_entry(D, coeff)
+ l += ""
+ return l
+
+/obj/machinery/rnd/production/proc/list_categories(list/categories, menu_num)
+ if(!categories)
+ return
+
+ var/line_length = 1
+ var/list/l = ""
+
+ for(var/C in categories)
+ if(line_length > 2)
+ l += " "
+ line_length = 1
+
+ l += "[C] "
+ line_length++
+
+ l += "
"
+ return l
diff --git a/code/modules/research/machinery/circuit_imprinter.dm b/code/modules/research/machinery/circuit_imprinter.dm
new file mode 100644
index 0000000000..e51b1c5cf5
--- /dev/null
+++ b/code/modules/research/machinery/circuit_imprinter.dm
@@ -0,0 +1,25 @@
+/obj/machinery/rnd/production/circuit_imprinter
+ name = "circuit imprinter"
+ desc = "Manufactures circuit boards for the construction of machines."
+ icon_state = "circuit_imprinter"
+ container_type = OPENCONTAINER
+ circuit = /obj/item/circuitboard/machine/circuit_imprinter
+ categories = list(
+ "AI Modules",
+ "Computer Boards",
+ "Teleportation Machinery",
+ "Medical Machinery",
+ "Engineering Machinery",
+ "Exosuit Modules",
+ "Hydroponics Machinery",
+ "Subspace Telecomms",
+ "Research Machinery",
+ "Misc. Machinery",
+ "Computer Parts"
+ )
+ production_animation = "circuit_imprinter_ani"
+ allowed_buildtypes = IMPRINTER
+
+/obj/machinery/rnd/production/circuit_imprinter/disconnect_console()
+ linked_console.linked_imprinter = null
+ ..()
\ No newline at end of file
diff --git a/code/modules/research/machinery/departmental_circuit_imprinter.dm b/code/modules/research/machinery/departmental_circuit_imprinter.dm
new file mode 100644
index 0000000000..e1acdd5cc2
--- /dev/null
+++ b/code/modules/research/machinery/departmental_circuit_imprinter.dm
@@ -0,0 +1,13 @@
+/obj/machinery/rnd/production/circuit_imprinter/department
+ name = "Department Circuit Imprinter"
+ desc = "A special circuit imprinter with a built in interface meant for departmental usage, with built in ExoSync recievers allowing it to print designs researched that match its ROM-encoded department type. Features a bluespace materials reciever for recieving materials without the hassle of running to mining!"
+ icon_state = "circuit_imprinter"
+ container_type = OPENCONTAINER
+ circuit = /obj/item/circuitboard/machine/circuit_imprinter/department
+ requires_console = FALSE
+ consoleless_interface = TRUE
+
+/obj/machinery/rnd/production/circuit_imprinter/department/science
+ name = "department protolathe (Science)"
+ allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_SCIENCE
+ department_tag = "Science"
\ No newline at end of file
diff --git a/code/modules/research/machinery/departmental_protolathe.dm b/code/modules/research/machinery/departmental_protolathe.dm
new file mode 100644
index 0000000000..1c315ab815
--- /dev/null
+++ b/code/modules/research/machinery/departmental_protolathe.dm
@@ -0,0 +1,44 @@
+/obj/machinery/rnd/production/protolathe/department
+ name = "department protolathe"
+ desc = "A special protolathe with a built in interface meant for departmental usage, with built in ExoSync recievers allowing it to print designs researched that match its ROM-encoded department type. Features a bluespace materials reciever for recieving materials without the hassle of running to mining!"
+ icon_state = "protolathe"
+ container_type = OPENCONTAINER
+ circuit = /obj/item/circuitboard/machine/protolathe/department
+ requires_console = FALSE
+ consoleless_interface = TRUE
+
+/obj/machinery/rnd/production/protolathe/department/engineering
+ name = "department protolathe (Engineering)"
+ allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_ENGINEERING
+ department_tag = "Engineering"
+ circuit = /obj/item/circuitboard/machine/protolathe/department/engineering
+
+/obj/machinery/rnd/production/protolathe/department/service
+ name = "department protolathe (Service)"
+ allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_SERVICE
+ department_tag = "Service"
+ circuit = /obj/item/circuitboard/machine/protolathe/department/service
+
+/obj/machinery/rnd/production/protolathe/department/medical
+ name = "department protolathe (Medical)"
+ allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_MEDICAL
+ department_tag = "Medical"
+ circuit = /obj/item/circuitboard/machine/protolathe/department/medical
+
+/obj/machinery/rnd/production/protolathe/department/cargo
+ name = "department protolathe (Cargo)"
+ allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_CARGO
+ department_tag = "Cargo"
+ circuit = /obj/item/circuitboard/machine/protolathe/department/cargo
+
+/obj/machinery/rnd/production/protolathe/department/science
+ name = "department protolathe (Science)"
+ allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_SCIENCE
+ department_tag = "Science"
+ circuit = /obj/item/circuitboard/machine/protolathe/department/science
+
+/obj/machinery/rnd/production/protolathe/department/security
+ name = "department protolathe (Security)"
+ allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_SECURITY
+ department_tag = "Security"
+ circuit = /obj/item/circuitboard/machine/protolathe/department/security
\ No newline at end of file
diff --git a/code/modules/research/machinery/departmental_techfab.dm b/code/modules/research/machinery/departmental_techfab.dm
new file mode 100644
index 0000000000..cf0e30596f
--- /dev/null
+++ b/code/modules/research/machinery/departmental_techfab.dm
@@ -0,0 +1,42 @@
+/obj/machinery/rnd/production/techfab/department
+ name = "department techfab"
+ desc = "An advanced fabricator designed to print out the latest prototypes and circuits researched from Science. Contains hardware to sync to research networks. This one is department-locked and only possesses a limited set of decryption keys."
+ icon_state = "protolathe"
+ container_type = OPENCONTAINER
+ circuit = /obj/item/circuitboard/machine/techfab/department
+
+/obj/machinery/rnd/production/techfab/department/engineering
+ name = "department techfab (Engineering)"
+ allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_ENGINEERING
+ department_tag = "Engineering"
+ circuit = /obj/item/circuitboard/machine/techfab/department/engineering
+
+/obj/machinery/rnd/production/techfab/department/service
+ name = "department techfab (Service)"
+ allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_SERVICE
+ department_tag = "Service"
+ circuit = /obj/item/circuitboard/machine/techfab/department/service
+
+/obj/machinery/rnd/production/techfab/department/medical
+ name = "department techfab (Medical)"
+ allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_MEDICAL
+ department_tag = "Medical"
+ circuit = /obj/item/circuitboard/machine/techfab/department/medical
+
+/obj/machinery/rnd/production/techfab/department/cargo
+ name = "department techfab (Cargo)"
+ allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_CARGO
+ department_tag = "Cargo"
+ circuit = /obj/item/circuitboard/machine/techfab/department/cargo
+
+/obj/machinery/rnd/production/techfab/department/science
+ name = "department techfab (Science)"
+ allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_SCIENCE
+ department_tag = "Science"
+ circuit = /obj/item/circuitboard/machine/techfab/department/science
+
+/obj/machinery/rnd/production/techfab/department/security
+ name = "department techfab (Security)"
+ allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_SECURITY
+ department_tag = "Security"
+ circuit = /obj/item/circuitboard/machine/techfab/department/security
\ No newline at end of file
diff --git a/code/modules/research/machinery/protolathe.dm b/code/modules/research/machinery/protolathe.dm
new file mode 100644
index 0000000000..ef74fec666
--- /dev/null
+++ b/code/modules/research/machinery/protolathe.dm
@@ -0,0 +1,25 @@
+/obj/machinery/rnd/production/protolathe
+ name = "protolathe"
+ desc = "Converts raw materials into useful objects."
+ icon_state = "protolathe"
+ container_type = OPENCONTAINER
+ circuit = /obj/item/circuitboard/machine/protolathe
+ categories = list(
+ "Power Designs",
+ "Medical Designs",
+ "Bluespace Designs",
+ "Stock Parts",
+ "Equipment",
+ "Mining Designs",
+ "Electronics",
+ "Weapons",
+ "Ammo",
+ "Firing Pins",
+ "Computer Parts"
+ )
+ production_animation = "protolathe_n"
+ allowed_buildtypes = PROTOLATHE
+
+/obj/machinery/rnd/production/protolathe/disconnect_console()
+ linked_console.linked_lathe = null
+ ..()
\ No newline at end of file
diff --git a/code/modules/research/machinery/techfab.dm b/code/modules/research/machinery/techfab.dm
new file mode 100644
index 0000000000..40b407ac61
--- /dev/null
+++ b/code/modules/research/machinery/techfab.dm
@@ -0,0 +1,35 @@
+/obj/machinery/rnd/production/techfab
+ name = "technology fabricator"
+ desc = "Produces researched prototypes with raw materials and energy."
+ icon_state = "protolathe"
+ container_type = OPENCONTAINER
+ circuit = /obj/item/circuitboard/machine/techfab
+ categories = list(
+ "Power Designs",
+ "Medical Designs",
+ "Bluespace Designs",
+ "Stock Parts",
+ "Equipment",
+ "Mining Designs",
+ "Electronics",
+ "Weapons",
+ "Ammo",
+ "Firing Pins",
+ "Computer Parts",
+ "AI Modules",
+ "Computer Boards",
+ "Teleportation Machinery",
+ "Medical Machinery",
+ "Engineering Machinery",
+ "Exosuit Modules",
+ "Hydroponics Machinery",
+ "Subspace Telecomms",
+ "Research Machinery",
+ "Misc. Machinery",
+ "Computer Parts"
+ )
+ console_link = FALSE
+ production_animation = "protolathe_n"
+ requires_console = FALSE
+ consoleless_interface = TRUE
+ allowed_buildtypes = PROTOLATHE | IMPRINTER
\ No newline at end of file
diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm
deleted file mode 100644
index 12630cafbe..0000000000
--- a/code/modules/research/protolathe.dm
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
-Protolathe
-
-Similar to an autolathe, you load glass and metal sheets (but not other objects) into it to be used as raw materials for the stuff
-it creates. All the menus and other manipulation commands are in the R&D console.
-
-Note: Must be placed west/left of and R&D console to function.
-
-*/
-/obj/machinery/rnd/protolathe
- name = "protolathe"
- desc = "Converts raw materials into useful objects."
- icon_state = "protolathe"
- container_type = OPENCONTAINER
- circuit = /obj/item/circuitboard/machine/protolathe
-
- var/efficiency_coeff
- var/list/categories = list(
- "Power Designs",
- "Medical Designs",
- "Bluespace Designs",
- "Stock Parts",
- "Equipment",
- "Mining Designs",
- "Electronics",
- "Weapons",
- "Ammo",
- "Firing Pins",
- "Computer Parts"
- )
-
- var/datum/component/material_container/materials //Store for hyper speed!
-
-/obj/machinery/rnd/protolathe/Initialize()
- create_reagents(0)
- materials = AddComponent(/datum/component/material_container,
- list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE), 0,
- FALSE, list(/obj/item/stack, /obj/item/stack/ore/bluespace_crystal), CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert))
- materials.precise_insertion = TRUE
- RefreshParts()
- return ..()
-
-/obj/machinery/rnd/protolathe/RefreshParts()
- reagents.maximum_volume = 0
- for(var/obj/item/reagent_containers/glass/G in component_parts)
- reagents.maximum_volume += G.volume
- G.reagents.trans_to(src, G.reagents.total_volume)
-
- GET_COMPONENT(materials, /datum/component/material_container)
- materials.max_amount = 0
- for(var/obj/item/stock_parts/matter_bin/M in component_parts)
- materials.max_amount += M.rating * 75000
-
- var/T = 1.2
- for(var/obj/item/stock_parts/manipulator/M in component_parts)
- T -= M.rating/10
- efficiency_coeff = min(max(0, T), 1)
-
-/obj/machinery/rnd/protolathe/proc/check_mat(datum/design/being_built, M) // now returns how many times the item can be built with the material
- var/list/all_materials = being_built.reagents_list + being_built.materials
-
- GET_COMPONENT(materials, /datum/component/material_container)
- var/A = materials.amount(M)
- if(!A)
- A = reagents.get_reagent_amount(M)
-
- return round(A / max(1, (all_materials[M]*efficiency_coeff)))
-
-//we eject the materials upon deconstruction.
-/obj/machinery/rnd/protolathe/on_deconstruction()
- for(var/obj/item/reagent_containers/glass/G in component_parts)
- reagents.trans_to(G, G.reagents.maximum_volume)
- GET_COMPONENT(materials, /datum/component/material_container)
- materials.retrieve_all()
- ..()
-
-
-/obj/machinery/rnd/protolathe/disconnect_console()
- linked_console.linked_lathe = null
- ..()
-
-/obj/machinery/rnd/protolathe/proc/user_try_print_id(id, amount)
- if((!istype(linked_console) && requires_console) || !id)
- return FALSE
- if(istext(amount))
- amount = text2num(amount)
- if(isnull(amount))
- amount = 1
- var/datum/design/D = (linked_console || requires_console)? linked_console.stored_research.researched_designs[id] : get_techweb_design_by_id(id)
- if(!istype(D))
- return FALSE
- if(D.make_reagents.len)
- return FALSE
-
- var/power = 1000
- amount = CLAMP(amount, 1, 10)
- for(var/M in D.materials)
- power += round(D.materials[M] * amount / 5)
- power = max(3000, power)
- use_power(power)
-
- var/list/efficient_mats = list()
- for(var/MAT in D.materials)
- efficient_mats[MAT] = D.materials[MAT]*efficiency_coeff
-
- if(!materials.has_materials(efficient_mats, amount))
- say("Not enough materials to complete prototype[amount > 1? "s" : ""].")
- return FALSE
- for(var/R in D.reagents_list)
- if(!reagents.has_reagent(R, D.reagents_list[R]*efficiency_coeff))
- say("Not enough reagents to complete prototype[amount > 1? "s" : ""].")
- return FALSE
-
- materials.use_amount(efficient_mats, amount)
- for(var/R in D.reagents_list)
- reagents.remove_reagent(R, D.reagents_list[R]*efficiency_coeff)
-
- busy = TRUE
- flick("protolathe_n", src)
- var/timecoeff = efficiency_coeff * D.lathe_time_factor
-
- addtimer(CALLBACK(src, .proc/reset_busy), (32 * timecoeff * amount) ** 0.8)
- addtimer(CALLBACK(src, .proc/do_print, D.build_path, amount, efficient_mats, D.dangerous_construction), (32 * timecoeff * amount) ** 0.8)
- return TRUE
-
-/obj/machinery/rnd/protolathe/proc/do_print(path, amount, list/matlist, notify_admins)
- if(notify_admins && usr)
- investigate_log("[key_name(usr)] built [amount] of [path] at a protolathe.", INVESTIGATE_RESEARCH)
- message_admins("[ADMIN_LOOKUPFLW(usr)] has built [amount] of [path] at a protolathe")
- for(var/i in 1 to amount)
- var/obj/item/I = new path(get_turf(src))
- if(!istype(I, /obj/item/stack/sheet) && !istype(I, /obj/item/stack/ore/bluespace_crystal))
- I.materials = matlist.Copy()
- SSblackbox.record_feedback("nested tally", "item_printed", amount, list("[type]", "[path]"))
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index 42cf5a529b..c4628c70ef 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -27,8 +27,8 @@ doesn't have toxins access.
circuit = /obj/item/circuitboard/computer/rdconsole
var/obj/machinery/rnd/destructive_analyzer/linked_destroy //Linked Destructive Analyzer
- var/obj/machinery/rnd/protolathe/linked_lathe //Linked Protolathe
- var/obj/machinery/rnd/circuit_imprinter/linked_imprinter //Linked Circuit Imprinter
+ var/obj/machinery/rnd/production/protolathe/linked_lathe //Linked Protolathe
+ var/obj/machinery/rnd/production/circuit_imprinter/linked_imprinter //Linked Circuit Imprinter
req_access = list(ACCESS_TOX) //lA AND SETTING MANIPULATION REQUIRES SCIENTIST ACCESS.
@@ -70,16 +70,16 @@ doesn't have toxins access.
if(linked_destroy == null)
linked_destroy = D
D.linked_console = src
- else if(istype(D, /obj/machinery/rnd/protolathe))
+ else if(istype(D, /obj/machinery/rnd/production/protolathe))
if(linked_lathe == null)
- var/obj/machinery/rnd/protolathe/P = D
+ var/obj/machinery/rnd/production/protolathe/P = D
if(!P.console_link)
continue
linked_lathe = D
D.linked_console = src
- else if(istype(D, /obj/machinery/rnd/circuit_imprinter))
+ else if(istype(D, /obj/machinery/rnd/production/circuit_imprinter))
if(linked_imprinter == null)
- var/obj/machinery/rnd/circuit_imprinter/C = D
+ var/obj/machinery/rnd/production/circuit_imprinter/C = D
if(!C.console_link)
continue
linked_imprinter = D
@@ -720,11 +720,11 @@ doesn't have toxins access.
if(D.build_type)
var/lathes = list()
if(D.build_type & IMPRINTER)
- lathes += "[machine_icon(/obj/machinery/rnd/circuit_imprinter)] [RDSCREEN_NOBREAK]"
+ lathes += "[machine_icon(/obj/machinery/rnd/production/circuit_imprinter)] [RDSCREEN_NOBREAK]"
if (linked_imprinter && D.id in stored_research.researched_designs)
l += "Imprint "
if(D.build_type & PROTOLATHE)
- lathes += "[machine_icon(/obj/machinery/rnd/protolathe)] [RDSCREEN_NOBREAK]"
+ lathes += "[machine_icon(/obj/machinery/rnd/production/protolathe)] [RDSCREEN_NOBREAK]"
if (linked_lathe && D.id in stored_research.researched_designs)
l += "Construct "
if(D.build_type & AUTOLATHE)
diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm
index 707e3e1e46..0a8659c795 100644
--- a/code/modules/research/rdmachines.dm
+++ b/code/modules/research/rdmachines.dm
@@ -16,7 +16,6 @@
var/shocked = FALSE
var/obj/machinery/computer/rdconsole/linked_console
var/obj/item/loaded_item = null //the item loaded inside the machine (currently only used by experimentor and destructive analyzer)
- var/allowed_department_flags = ALL
/obj/machinery/rnd/proc/reset_busy()
busy = FALSE
@@ -47,8 +46,6 @@
if(panel_open)
wires.interact(user)
-
-
/obj/machinery/rnd/attackby(obj/item/O, mob/user, params)
if (shocked)
if(shock(user,50))
@@ -114,6 +111,6 @@
else
var/obj/item/stack/S = type_inserted
stack_name = initial(S.name)
- use_power(max(1000, (MINERAL_MATERIAL_AMOUNT * amount_inserted / 100)))
+ use_power(min(1000, (amount_inserted / 100)))
add_overlay("protolathe_[stack_name]")
addtimer(CALLBACK(src, /atom/proc/cut_overlay, "protolathe_[stack_name]"), 10)
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index afdbcb4d4d..2fc41e1638 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -93,7 +93,7 @@
prereq_ids = list("base")
design_ids = list("solarcontrol", "recharger", "powermonitor", "rped", "pacman", "adv_capacitor", "adv_scanning", "emitter", "high_cell", "adv_matter_bin",
"atmosalerts", "atmos_control", "recycler", "autolathe", "high_micro_laser", "nano_mani", "weldingmask", "mesons", "thermomachine", "tesla_coil", "grounding_rod", "apc_control", "cell_charger")
- research_cost = 2500
+ research_cost = 7500
export_price = 5000
/datum/techweb_node/adv_engi
@@ -111,7 +111,7 @@
description = "Finely-tooled manufacturing techniques allowing for picometer-perfect precision levels."
prereq_ids = list("engineering", "datatheory")
design_ids = list("pico_mani", "super_matter_bin")
- research_cost = 2500
+ research_cost = 7500
export_price = 5000
/datum/techweb_node/adv_power
@@ -129,7 +129,7 @@
display_name = "Basic Bluespace Theory"
description = "Basic studies into the mysterious alternate dimension known as bluespace."
prereq_ids = list("base")
- design_ids = list("beacon", "xenobioconsole")
+ design_ids = list("beacon") //CIT CHANGE removed xenobioconsole from here.
research_cost = 2500
export_price = 5000
@@ -140,7 +140,7 @@
prereq_ids = list("practical_bluespace", "high_efficiency")
design_ids = list("bluespace_matter_bin", "femto_mani", "triphasic_scanning", "tele_station", "tele_hub", "quantumpad", "launchpad", "launchpad_console",
"teleconsole", "bag_holding", "bluespace_crystal", "wormholeprojector", "bluespace_pod")
- research_cost = 2500
+ research_cost = 15000
export_price = 5000
/datum/techweb_node/practical_bluespace
@@ -148,8 +148,8 @@
display_name = "Applied Bluespace Research"
description = "Using bluespace to make things faster and better."
prereq_ids = list("bluespace_basic", "engineering")
- design_ids = list("bs_rped","minerbag_holding", "telesci_gps", "bluespacebeaker", "bluespacesyringe", "bluespacebodybag", "phasic_scanning")
- research_cost = 2500
+ design_ids = list("bs_rped","minerbag_holding", "telesci_gps", "bluespacebeaker", "bluespacesyringe", "bluespacebodybag", "phasic_scanning", "roastingstick", "xenobioconsole") //CIT CHANGE added xenobioconsole here
+ research_cost = 5000
export_price = 5000
@@ -291,7 +291,7 @@
description = "Determining whether reversing the polarity will actually help in a given situation."
prereq_ids = list("emp_basic")
design_ids = list("ultra_micro_laser")
- research_cost = 2500
+ research_cost = 3000
export_price = 5000
/datum/techweb_node/emp_super
@@ -300,7 +300,7 @@
description = "Even better electromagnetic technology."
prereq_ids = list("emp_adv")
design_ids = list("quadultra_micro_laser")
- research_cost = 2500
+ research_cost = 3000
export_price = 5000
/////////////////////////Clown tech/////////////////////////
diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm
index e8937b5dae..f240e0b6af 100644
--- a/code/modules/research/xenobiology/xenobiology.dm
+++ b/code/modules/research/xenobiology/xenobiology.dm
@@ -350,7 +350,7 @@
switch(activation_type)
if(SLIME_ACTIVATE_MINOR)
to_chat(user, "You feel something wrong inside you... ")
- user.ForceContractDisease(new /datum/disease/transformation/slime(0))
+ user.ForceContractDisease(new /datum/disease/transformation/slime(), FALSE, TRUE)
return 100
if(SLIME_ACTIVATE_MAJOR)
diff --git a/code/modules/ruins/spaceruin_code/caravanambush.dm b/code/modules/ruins/spaceruin_code/caravanambush.dm
index 603af76f1a..bcbe74d896 100644
--- a/code/modules/ruins/spaceruin_code/caravanambush.dm
+++ b/code/modules/ruins/spaceruin_code/caravanambush.dm
@@ -53,6 +53,14 @@
shuttleId = "caravantrade1"
possible_destinations = "whiteship_away;whiteship_home;whiteship_z4;whiteship_lavaland;caravantrade1_custom;caravantrade1_ambush"
+/obj/machinery/computer/camera_advanced/shuttle_docker/caravan/Initialize()
+ . = ..()
+ GLOB.jam_on_wardec += src
+
+/obj/machinery/computer/camera_advanced/shuttle_docker/caravan/Destroy()
+ GLOB.jam_on_wardec -= src
+ return ..()
+
/obj/machinery/computer/camera_advanced/shuttle_docker/caravan/trade1
name = "Small Freighter Navigation Computer"
desc = "Used to designate a precise transit location for the Small Freighter."
@@ -163,4 +171,4 @@
jumpto_ports = list("caravansyndicate3_ambush" = 1, "caravansyndicate3_listeningpost" = 1)
view_range = 10
x_offset = -1
- y_offset = -3
\ No newline at end of file
+ y_offset = -3
diff --git a/code/modules/ruins/spaceruin_code/cloning_lab.dm b/code/modules/ruins/spaceruin_code/cloning_lab.dm
new file mode 100644
index 0000000000..1e372f1fa4
--- /dev/null
+++ b/code/modules/ruins/spaceruin_code/cloning_lab.dm
@@ -0,0 +1,35 @@
+/obj/item/paper/fluff/ruins/exp_cloning/manual
+ name = "paper - 'H-11 Cloning Apparatus Manual"
+ info = {"Getting Started
+ Congratulations, you are testing the H-11 experimental cloning device!
+ Using the H-11 is almost as simple as brain surgery! Simply insert the target humanoid into the scanning chamber and select the clone option to initiate cloning!
+ That's all there is to it!
+ Notice, cloning system cannot scan inorganic life or small primates. Scan may fail if subject has suffered extreme brain damage.
+ The provided CLONEPOD SYSTEM will produce the desired clone. Standard clone maturation times are roughly 90 seconds.
+ The cloning pod may be unlocked early after initial maturation is complete.
+ Please note that resulting clones will have a DEVELOPMENTAL DEFECT as a result of genetic drift. We hope to reduce this through further testing.
+ Clones may also experience memory loss and radical changes in personality as a result of the cloning process.
+
+ This technology produced under license from Thinktronic Systems, LTD. "}
+
+/obj/item/paper/fluff/ruins/exp_cloning/log
+ name = "experiment log"
+ info = {"Day 1
+ We are very excited to be part of the first crew of the SC Irmanda!
+ This ship is made to test an innovative FTL technology. I had some concerns at first, \
+ but the engineers assure me that it is safe and there is absolutely no risk of the external wings breaking off from the acceleration.
+ We've been tasked with testing the latest model of the Thinktronic Cloning Pod. We'll stay in dock for a week before launching, but we're going to get started right away. \
+ If the engine is as fast as they say, we might not have the time to run all the routine tests on the cloned subject!
+
+ Day 2
+ We cloned an unknown corpse that was given to us by the medical crew. The genetic replication is good enough to let the subject survive outside of the pod, \
+ but the cellular damage remains a concern for his long-term survival. For safety we will be keeping him in quarantine.
+ We left him some books, but clearly we were too optimistic about his mental faculties. His brain seems to suffer from the same cloning decay that was caused by \
+ the previous models. We will run further tests to see if there are improvements.
+ Day 4
+ It seems we'll be launching even sooner than expected! Apparently the press is starting to lose interest, so we have to cut short the pre-flight checks \
+ and give them something to talk about. Hopefully this will end up with increased funding...
+ The crew has all been invited to the main hall, where we have seats for the initial FTL acceleration. Unfortunately the clone cannot leave the quarantine room \
+ without risking infection, so we will strap him into the bed and hope for the best. We can grow another clone if anything goes wrong, anyway.
+
+ Professor Galen Linkovich "}
\ No newline at end of file
diff --git a/code/modules/security_levels/security_levels.dm b/code/modules/security_levels/security_levels.dm
index 61c3f8833f..7e45854628 100644
--- a/code/modules/security_levels/security_levels.dm
+++ b/code/modules/security_levels/security_levels.dm
@@ -42,7 +42,6 @@ GLOBAL_VAR_INIT(security_level, SEC_LEVEL_GREEN)
SSshuttle.emergency.modTimer(2)
GLOB.security_level = SEC_LEVEL_BLUE
sound_to_playing_players('sound/misc/voybluealert.ogg') // Citadel change - Makes alerts play a sound
-
for(var/obj/machinery/firealarm/FA in GLOB.machines)
if(is_station_level(FA.z))
FA.update_icon()
@@ -73,7 +72,6 @@ GLOBAL_VAR_INIT(security_level, SEC_LEVEL_GREEN)
SSshuttle.emergency.modTimer(0.5)
GLOB.security_level = SEC_LEVEL_DELTA
sound_to_playing_players('sound/misc/deltakalaxon.ogg') // Citadel change - Makes alerts play a sound
-
for(var/obj/machinery/firealarm/FA in GLOB.machines)
if(is_station_level(FA.z))
FA.update_icon()
diff --git a/code/modules/shuttle/docking.dm b/code/modules/shuttle/docking.dm
index b12662c02d..1d9b0f769b 100644
--- a/code/modules/shuttle/docking.dm
+++ b/code/modules/shuttle/docking.dm
@@ -135,7 +135,7 @@
var/atom/movable/moving_atom = old_contents[k]
if(moving_atom.loc != oldT) //fix for multi-tile objects
continue
- move_mode = moving_atom.beforeShuttleMove(newT, rotation, move_mode) //atoms
+ move_mode = moving_atom.beforeShuttleMove(newT, rotation, move_mode, src) //atoms
move_mode = oldT.fromShuttleMove(newT, underlying_turf_type, baseturf_cache, move_mode) //turfs
move_mode = newT.toShuttleMove(oldT, move_mode , src) //turfs
diff --git a/code/modules/shuttle/navigation_computer.dm b/code/modules/shuttle/navigation_computer.dm
index e657cfde37..29c0de1b27 100644
--- a/code/modules/shuttle/navigation_computer.dm
+++ b/code/modules/shuttle/navigation_computer.dm
@@ -17,6 +17,7 @@
var/see_hidden = FALSE
var/designate_time = 0
var/turf/designating_target_loc
+ var/jammed = FALSE
/obj/machinery/computer/camera_advanced/shuttle_docker/Initialize()
. = ..()
@@ -26,6 +27,12 @@
. = ..()
GLOB.navigation_computers -= src
+/obj/machinery/computer/camera_advanced/shuttle_docker/attack_hand(mob/user)
+ if(jammed)
+ to_chat(user, "The Syndicate is jamming the console! ")
+ return
+ return ..()
+
/obj/machinery/computer/camera_advanced/shuttle_docker/GrantActions(mob/living/user)
if(jumpto_ports.len)
jump_action = new /datum/action/innate/camera_jump/shuttle_docker
@@ -199,7 +206,7 @@
/obj/machinery/computer/camera_advanced/shuttle_docker/proc/checkLandingTurf(turf/T, list/overlappers)
// Too close to the map edge is never allowed
- if(!T || T.x == 1 || T.y == 1 || T.x == world.maxx || T.y == world.maxy)
+ if(!T || T.x <= 10 || T.y <= 10 || T.x >= world.maxx - 10 || T.y >= world.maxy - 10)
return SHUTTLE_DOCKER_BLOCKED
// If it's one of our shuttle areas assume it's ok to be there
if(shuttle_port.shuttle_areas[T.loc])
diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm
index 7b196b8289..ec596e31a1 100644
--- a/code/modules/shuttle/on_move.dm
+++ b/code/modules/shuttle/on_move.dm
@@ -82,7 +82,7 @@ All ShuttleMove procs go here
// Called on every atom in shuttle turf contents before anything has been moved
// returns the new move_mode (based on the old)
// WARNING: Do not leave turf contents in beforeShuttleMove or dock() will runtime
-/atom/movable/proc/beforeShuttleMove(turf/newT, rotation, move_mode)
+/atom/movable/proc/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock)
return move_mode
// Called on atoms to move the atom to the new location
@@ -154,7 +154,7 @@ All ShuttleMove procs go here
/************************************Machinery move procs************************************/
-/obj/machinery/door/airlock/beforeShuttleMove(turf/newT, rotation, move_mode)
+/obj/machinery/door/airlock/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock)
. = ..()
shuttledocked = 0
for(var/obj/machinery/door/airlock/A in range(1, src))
@@ -168,7 +168,7 @@ All ShuttleMove procs go here
for(var/obj/machinery/door/airlock/A in range(1, src))
A.shuttledocked = 1
-/obj/machinery/camera/beforeShuttleMove(turf/newT, rotation, move_mode)
+/obj/machinery/camera/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock)
. = ..()
if(. & MOVE_AREA)
. |= MOVE_CONTENTS
@@ -192,7 +192,7 @@ All ShuttleMove procs go here
if(is_mining_level(z)) //Avoids double logging and landing on other Z-levels due to badminnery
SSblackbox.record_feedback("associative", "colonies_dropped", 1, list("x" = x, "y" = y, "z" = z))
-/obj/machinery/gravity_generator/main/beforeShuttleMove(turf/newT, rotation, move_mode)
+/obj/machinery/gravity_generator/main/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock)
. = ..()
on = FALSE
update_list()
@@ -203,7 +203,7 @@ All ShuttleMove procs go here
on = TRUE
update_list()
-/obj/machinery/thruster/beforeShuttleMove(turf/newT, rotation, move_mode)
+/obj/machinery/thruster/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock)
. = ..()
if(. & MOVE_AREA)
. |= MOVE_CONTENTS
@@ -242,7 +242,7 @@ All ShuttleMove procs go here
var/turf/T = loc
hide(T.intact)
-/obj/machinery/navbeacon/beforeShuttleMove(turf/newT, rotation, move_mode)
+/obj/machinery/navbeacon/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock)
. = ..()
GLOB.navbeacons["[z]"] -= src
GLOB.deliverybeacons -= src
@@ -307,12 +307,12 @@ All ShuttleMove procs go here
/************************************Structure move procs************************************/
-/obj/structure/grille/beforeShuttleMove(turf/newT, rotation, move_mode)
+/obj/structure/grille/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock)
. = ..()
if(. & MOVE_AREA)
. |= MOVE_CONTENTS
-/obj/structure/lattice/beforeShuttleMove(turf/newT, rotation, move_mode)
+/obj/structure/lattice/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock)
. = ..()
if(. & MOVE_AREA)
. |= MOVE_CONTENTS
@@ -327,7 +327,7 @@ All ShuttleMove procs go here
if(level==1)
hide(T.intact)
-/obj/structure/shuttle/beforeShuttleMove(turf/newT, rotation, move_mode)
+/obj/structure/shuttle/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock)
. = ..()
if(. & MOVE_AREA)
. |= MOVE_CONTENTS
@@ -338,6 +338,11 @@ All ShuttleMove procs go here
/atom/movable/lighting_object/onShuttleMove()
return FALSE
+/obj/docking_port/mobile/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock)
+ . = ..()
+ if(moving_dock == src)
+ . |= MOVE_CONTENTS
+
/obj/docking_port/stationary/onShuttleMove(turf/newT, turf/oldT, list/movement_force, move_dir, obj/docking_port/stationary/old_dock, obj/docking_port/mobile/moving_dock)
if(!moving_dock.can_move_docking_ports || old_dock == src)
return FALSE
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index 6a8fd7b3a1..844d6c020f 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -521,7 +521,7 @@
if(SHUTTLE_CALL)
var/error = initiate_docking(destination, preferred_direction)
if(error && error & (DOCKING_NULL_DESTINATION | DOCKING_NULL_SOURCE))
- var/msg = "A mobile dock in transit exited initiate_docking() with an error. This is most likely a mapping problem: Error: [error], ([src]) ([previous])"
+ var/msg = "A mobile dock in transit exited initiate_docking() with an error. This is most likely a mapping problem: Error: [error], ([src]) ([previous][ADMIN_JMP(previous)] -> [destination][ADMIN_JMP(destination)])"
WARNING(msg)
message_admins(msg)
mode = SHUTTLE_IDLE
diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm
index 213e2d8b17..be17c0d641 100644
--- a/code/modules/shuttle/supply.dm
+++ b/code/modules/shuttle/supply.dm
@@ -5,7 +5,7 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list(
/obj/structure/spider/spiderling,
/obj/item/disk/nuclear,
/obj/machinery/nuclearbomb,
- /obj/item/device/radio/beacon,
+ /obj/item/device/beacon,
/obj/singularity,
/obj/machinery/teleport/station,
/obj/machinery/teleport/hub,
@@ -17,7 +17,7 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list(
/obj/effect/clockwork/spatial_gateway,
/obj/structure/destructible/clockwork/powered/clockwork_obelisk,
/obj/item/device/warp_cube,
- /obj/machinery/rnd/protolathe, //print tracking beacons, send shuttle
+ /obj/machinery/rnd/production/protolathe, //print tracking beacons, send shuttle
/obj/machinery/autolathe, //same
/obj/item/projectile/beam/wormhole,
/obj/effect/portal,
diff --git a/code/modules/shuttle/white_ship.dm b/code/modules/shuttle/white_ship.dm
index 79c2fda7ed..6264588a3a 100644
--- a/code/modules/shuttle/white_ship.dm
+++ b/code/modules/shuttle/white_ship.dm
@@ -18,3 +18,10 @@
y_offset = -10
designate_time = 100
+/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship/Initialize()
+ . = ..()
+ GLOB.jam_on_wardec += src
+
+/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship/Destroy()
+ GLOB.jam_on_wardec -= src
+ return ..()
diff --git a/code/modules/spells/spell_types/aimed.dm b/code/modules/spells/spell_types/aimed.dm
index 997c83249a..6980cba8e2 100644
--- a/code/modules/spells/spell_types/aimed.dm
+++ b/code/modules/spells/spell_types/aimed.dm
@@ -69,7 +69,7 @@
P.preparePixelProjectile(target, user)
for(var/V in projectile_var_overrides)
if(P.vars[V])
- P.vars[V] = projectile_var_overrides[V]
+ P.vv_edit_var(V, projectile_var_overrides[V])
P.fire()
return TRUE
diff --git a/code/modules/spells/spell_types/conjure.dm b/code/modules/spells/spell_types/conjure.dm
index 306c3fcef6..18bfb54935 100644
--- a/code/modules/spells/spell_types/conjure.dm
+++ b/code/modules/spells/spell_types/conjure.dm
@@ -36,8 +36,8 @@
var/atom/summoned_object = new summoned_object_type(spawn_place)
for(var/varName in newVars)
- if(varName in summoned_object.vars)
- summoned_object.vars[varName] = newVars[varName]
+ if(varName in newVars)
+ summoned_object.vv_edit_var(varName, newVars[varName])
summoned_object.admin_spawned = TRUE
if(summon_lifespan)
QDEL_IN(summoned_object, summon_lifespan)
diff --git a/code/modules/spells/spell_types/emplosion.dm b/code/modules/spells/spell_types/emplosion.dm
index e6393e8584..8c45c06379 100644
--- a/code/modules/spells/spell_types/emplosion.dm
+++ b/code/modules/spells/spell_types/emplosion.dm
@@ -15,4 +15,4 @@
continue
empulse(target.loc, emp_heavy, emp_light)
- return
+ return
\ No newline at end of file
diff --git a/code/modules/spells/spell_types/inflict_handler.dm b/code/modules/spells/spell_types/inflict_handler.dm
index a1ba69b426..da0af7a601 100644
--- a/code/modules/spells/spell_types/inflict_handler.dm
+++ b/code/modules/spells/spell_types/inflict_handler.dm
@@ -49,4 +49,4 @@
target.blur_eyes(amt_eye_blurry)
//summoning
if(summon_type)
- new summon_type(target.loc, target)
+ new summon_type(target.loc, target)
\ No newline at end of file
diff --git a/code/modules/spells/spell_types/mime.dm b/code/modules/spells/spell_types/mime.dm
index 28960fce31..d51f89be18 100644
--- a/code/modules/spells/spell_types/mime.dm
+++ b/code/modules/spells/spell_types/mime.dm
@@ -56,10 +56,15 @@
/obj/effect/proc_holder/spell/targeted/mime/speak/cast(list/targets,mob/user = usr)
for(var/mob/living/carbon/human/H in targets)
H.mind.miming=!H.mind.miming
+ GET_COMPONENT_FROM(mood, /datum/component/mood, H)
if(H.mind.miming)
to_chat(H, "You make a vow of silence. ")
+ if(mood)
+ mood.clear_event("vow")
else
to_chat(H, "You break your vow of silence. ")
+ if(mood)
+ mood.add_event("vow", /datum/mood_event/broken_vow)
// These spells can only be gotten from the "Guide for Advanced Mimery series" for Mime Traitors.
diff --git a/code/modules/spells/spell_types/summonitem.dm b/code/modules/spells/spell_types/summonitem.dm
index ab7702fcce..d568aa67f4 100644
--- a/code/modules/spells/spell_types/summonitem.dm
+++ b/code/modules/spells/spell_types/summonitem.dm
@@ -83,6 +83,9 @@
to_chat(C, "The [item_to_retrieve] that was embedded in your [L] has mysteriously vanished. How fortunate! ")
if(!C.has_embedded_objects())
C.clear_alert("embeddedobject")
+ GET_COMPONENT_FROM(mood, /datum/component/mood, C)
+ if(mood)
+ mood.clear_event("embedded")
break
else
diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm
index b71413200a..cdef94127e 100644
--- a/code/modules/station_goals/bsa.dm
+++ b/code/modules/station_goals/bsa.dm
@@ -14,7 +14,7 @@
/datum/station_goal/bluespace_cannon/on_report()
//Unlock BSA parts
- var/datum/supply_pack/misc/bsa/P = SSshuttle.supply_packs[/datum/supply_pack/misc/bsa]
+ var/datum/supply_pack/engineering/bsa/P = SSshuttle.supply_packs[/datum/supply_pack/engineering/bsa]
P.special_enabled = TRUE
/datum/station_goal/bluespace_cannon/check_completion()
diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm
index a90b3598ce..a43e435977 100644
--- a/code/modules/station_goals/dna_vault.dm
+++ b/code/modules/station_goals/dna_vault.dm
@@ -44,10 +44,10 @@
/datum/station_goal/dna_vault/on_report()
- var/datum/supply_pack/P = SSshuttle.supply_packs[/datum/supply_pack/misc/dna_vault]
+ var/datum/supply_pack/P = SSshuttle.supply_packs[/datum/supply_pack/engineering/dna_vault]
P.special_enabled = TRUE
- P = SSshuttle.supply_packs[/datum/supply_pack/misc/dna_probes]
+ P = SSshuttle.supply_packs[/datum/supply_pack/engineering/dna_probes]
P.special_enabled = TRUE
/datum/station_goal/dna_vault/check_completion()
@@ -256,24 +256,25 @@
var/obj/item/organ/lungs/L = H.internal_organs_slot[ORGAN_SLOT_LUNGS]
L.tox_breath_dam_min = 0
L.tox_breath_dam_max = 0
- S.species_traits |= VIRUSIMMUNE
+ H.add_trait(TRAIT_VIRUSIMMUNE, "dna_vault")
if(VAULT_NOBREATH)
to_chat(H, "Your lungs feel great. ")
- S.species_traits |= NOBREATH
+ H.add_trait(TRAIT_NOBREATH, "dna_vault")
if(VAULT_FIREPROOF)
to_chat(H, "You feel fireproof. ")
S.burnmod = 0.5
- S.heatmod = 0
+ H.add_trait(TRAIT_RESISTHEAT, "dna_vault")
+ H.add_trait(TRAIT_NOFIRE, "dna_vault")
if(VAULT_STUNTIME)
to_chat(H, "Nothing can keep you down for long. ")
S.stunmod = 0.5
if(VAULT_ARMOUR)
to_chat(H, "You feel tough. ")
S.armor = 30
-
+ H.add_trait(TRAIT_PIERCEIMMUNE, "dna_vault")
if(VAULT_SPEED)
to_chat(H, "Your legs feel faster. ")
- S.speedmod = -1
+ H.add_trait(TRAIT_GOTTAGOFAST, "dna_vault")
if(VAULT_QUICK)
to_chat(H, "Your arms move as fast as lightning. ")
H.next_move_modifier = 0.5
diff --git a/code/modules/station_goals/shield.dm b/code/modules/station_goals/shield.dm
index 265dd96532..815ecfe579 100644
--- a/code/modules/station_goals/shield.dm
+++ b/code/modules/station_goals/shield.dm
@@ -15,10 +15,10 @@
/datum/station_goal/station_shield/on_report()
//Unlock
- var/datum/supply_pack/P = SSshuttle.supply_packs[/datum/supply_pack/misc/shield_sat]
+ var/datum/supply_pack/P = SSshuttle.supply_packs[/datum/supply_pack/engineering/shield_sat]
P.special_enabled = TRUE
- P = SSshuttle.supply_packs[/datum/supply_pack/misc/shield_sat_control]
+ P = SSshuttle.supply_packs[/datum/supply_pack/engineering/shield_sat_control]
P.special_enabled = TRUE
/datum/station_goal/station_shield/check_completion()
diff --git a/code/modules/surgery/advanced/viral_bonding.dm b/code/modules/surgery/advanced/viral_bonding.dm
index f661373acd..da42e4fdb9 100644
--- a/code/modules/surgery/advanced/viral_bonding.dm
+++ b/code/modules/surgery/advanced/viral_bonding.dm
@@ -17,7 +17,7 @@
/datum/surgery/advanced/viral_bonding/can_start(mob/user, mob/living/carbon/target)
if(!..())
return FALSE
- if(!LAZYLEN(target.viruses))
+ if(!LAZYLEN(target.diseases))
return FALSE
return TRUE
@@ -38,7 +38,7 @@
/datum/surgery_step/viral_bond/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
user.visible_message("[target]'s bone marrow begins pulsing slowly.", "[target]'s bone marrow begins pulsing slowly. The viral bonding is complete. ")
- for(var/X in target.viruses)
+ for(var/X in target.diseases)
var/datum/disease/D = X
D.carrier = TRUE
return TRUE
\ No newline at end of file
diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm
index c178d7f72f..133c22510e 100644
--- a/code/modules/surgery/bodyparts/bodyparts.dm
+++ b/code/modules/surgery/bodyparts/bodyparts.dm
@@ -62,7 +62,7 @@
/obj/item/bodypart/attack(mob/living/carbon/C, mob/user)
if(ishuman(C))
var/mob/living/carbon/human/H = C
- if(EASYLIMBATTACHMENT in H.dna.species.species_traits)
+ if(C.has_trait(TRAIT_LIMBATTACHMENT))
if(!H.get_bodypart(body_zone) && !animal_origin)
if(H == user)
H.visible_message("[H] jams [src] into [H.p_their()] empty socket! ",\
diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm
index 10f2d182fe..2cf8389a6b 100644
--- a/code/modules/surgery/bodyparts/dismemberment.dm
+++ b/code/modules/surgery/bodyparts/dismemberment.dm
@@ -6,21 +6,22 @@
//Dismember a limb
/obj/item/bodypart/proc/dismember(dam_type = BRUTE)
if(!owner)
- return 0
+ return FALSE
var/mob/living/carbon/C = owner
if(!dismemberable)
- return 0
+ return FALSE
if(C.status_flags & GODMODE)
- return 0
- if(ishuman(C))
- var/mob/living/carbon/human/H = C
- if(NODISMEMBER in H.dna.species.species_traits) // species don't allow dismemberment
- return 0
+ return FALSE
+ if(C.has_trait(TRAIT_NODISMEMBER))
+ return FALSE
var/obj/item/bodypart/affecting = C.get_bodypart("chest")
affecting.receive_damage(CLAMP(brute_dam/2, 15, 50), CLAMP(burn_dam/2, 0, 50)) //Damage the chest based on limb's existing damage
C.visible_message("[C]'s [src.name] has been violently dismembered! ")
C.emote("scream")
+ GET_COMPONENT_FROM(mood, /datum/component/mood, C)
+ if(mood)
+ mood.add_event("dismembered", /datum/mood_event/dismembered)
drop_limb()
if(dam_type == BURN)
@@ -46,14 +47,12 @@
/obj/item/bodypart/chest/dismember()
if(!owner)
- return 0
+ return FALSE
var/mob/living/carbon/C = owner
if(!dismemberable)
- return 0
- if(ishuman(C))
- var/mob/living/carbon/human/H = C
- if(NODISMEMBER in H.dna.species.species_traits) // species don't allow dismemberment
- return 0
+ return FALSE
+ if(C.has_trait(TRAIT_NODISMEMBER))
+ return FALSE
var/organ_spilled = 0
var/turf/T = get_turf(C)
@@ -105,6 +104,9 @@
I.forceMove(src)
if(!C.has_embedded_objects())
C.clear_alert("embeddedobject")
+ GET_COMPONENT_FROM(mood, /datum/component/mood, C)
+ if(mood)
+ mood.add_event("embedded")
if(!special)
if(C.dna)
diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm
index 7ac387b4d8..2c90496eb6 100644
--- a/code/modules/surgery/bodyparts/helpers.dm
+++ b/code/modules/surgery/bodyparts/helpers.dm
@@ -121,6 +121,9 @@
I.forceMove(T)
clear_alert("embeddedobject")
+ GET_COMPONENT_FROM(mood, /datum/component/mood, src)
+ if(mood)
+ mood.clear_event("embedded")
/mob/living/carbon/proc/has_embedded_objects()
. = 0
diff --git a/code/modules/surgery/organs/appendix.dm b/code/modules/surgery/organs/appendix.dm
index 35a2d851e3..4494148082 100644
--- a/code/modules/surgery/organs/appendix.dm
+++ b/code/modules/surgery/organs/appendix.dm
@@ -14,7 +14,7 @@
name = "appendix"
/obj/item/organ/appendix/Remove(mob/living/carbon/M, special = 0)
- for(var/datum/disease/appendicitis/A in M.viruses)
+ for(var/datum/disease/appendicitis/A in M.diseases)
A.cure()
inflamed = 1
update_icon()
@@ -23,7 +23,7 @@
/obj/item/organ/appendix/Insert(mob/living/carbon/M, special = 0)
..()
if(inflamed)
- M.AddDisease(new /datum/disease/appendicitis)
+ M.ForceContractDisease(new /datum/disease/appendicitis(), FALSE, TRUE)
/obj/item/organ/appendix/prepare_eat()
var/obj/S = ..()
diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm
index d9bcbc09d4..b840d82670 100644
--- a/code/modules/surgery/organs/eyes.dm
+++ b/code/modules/surgery/organs/eyes.dm
@@ -26,6 +26,8 @@
HMN.regenerate_icons()
else
eye_color = HMN.eye_color
+ if(HMN.has_trait(TRAIT_NIGHT_VISION) && !lighting_alpha)
+ lighting_alpha = LIGHTING_PLANE_ALPHA_NV_TRAIT
M.update_tint()
owner.update_sight()
@@ -75,6 +77,10 @@
desc = "Even without their shadowy owner, looking at these eyes gives you a sense of dread."
icon_state = "burning_eyes"
+/obj/item/organ/eyes/night_vision/mushroom
+ name = "fung-eye"
+ desc = "While on the outside they look inert and dead, the eyes of mushroom people are actually very advanced."
+
///Robotic
/obj/item/organ/eyes/robotic
@@ -128,12 +134,14 @@
eye.on = TRUE
eye.forceMove(M)
eye.update_brightness(M)
+ M.become_blind("flashlight_eyes")
/obj/item/organ/eyes/robotic/flashlight/Remove(var/mob/living/carbon/M, var/special = 0)
eye.on = FALSE
eye.update_brightness(M)
eye.forceMove(src)
+ M.cure_blind("flashlight_eyes")
..()
// Welding shield implant
diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm
index f492d99b8e..737ffbe6e8 100644
--- a/code/modules/surgery/organs/lungs.dm
+++ b/code/modules/surgery/organs/lungs.dm
@@ -68,17 +68,15 @@
/obj/item/organ/lungs/proc/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/H)
if((H.status_flags & GODMODE))
return
-
- var/species_traits = list()
- if(H && H.dna && H.dna.species && H.dna.species.species_traits)
- species_traits = H.dna.species.species_traits
+ if(H.has_trait(TRAIT_NOBREATH))
+ return
if(!breath || (breath.total_moles() == 0))
if(H.reagents.has_reagent(crit_stabilizing_reagent))
return
if(H.health >= HEALTH_THRESHOLD_CRIT)
H.adjustOxyLoss(HUMAN_MAX_OXYLOSS)
- else if(!(NOCRITDAMAGE in species_traits))
+ else if(!H.has_trait(TRAIT_NOCRITDAMAGE))
H.adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS)
H.failed_last_breath = TRUE
@@ -313,11 +311,7 @@
/obj/item/organ/lungs/proc/handle_breath_temperature(datum/gas_mixture/breath, mob/living/carbon/human/H) // called by human/life, handles temperatures
var/breath_temperature = breath.temperature
- var/species_traits = list()
- if(H && H.dna && H.dna.species && H.dna.species.species_traits)
- species_traits = H.dna.species.species_traits
-
- if(!(GLOB.mutations_list[COLDRES] in H.dna.mutations) && !(RESISTCOLD in species_traits)) // COLD DAMAGE
+ if(!H.has_trait(TRAIT_RESISTCOLD)) // COLD DAMAGE
var/cold_modifier = H.dna.species.coldmod
if(breath_temperature < cold_level_3_threshold)
H.apply_damage_type(cold_level_3_damage*cold_modifier, cold_damage_type)
@@ -329,7 +323,7 @@
if(prob(20))
to_chat(H, "You feel [cold_message] in your [name]! ")
- if(!(RESISTHOT in species_traits)) // HEAT DAMAGE
+ if(!H.has_trait(TRAIT_RESISTHEAT)) // HEAT DAMAGE
var/heat_modifier = H.dna.species.heatmod
if(breath_temperature > heat_level_1_threshold && breath_temperature < heat_level_2_threshold)
H.apply_damage_type(heat_level_1_damage*heat_modifier, heat_damage_type)
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index fcaf89c61c..fe613af015 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -110,7 +110,7 @@
var/breathes = TRUE
var/blooded = TRUE
if(dna && dna.species)
- if(NOBREATH in dna.species.species_traits)
+ if(has_trait(TRAIT_NOBREATH, SPECIES_TRAIT))
breathes = FALSE
if(NOBLOOD in dna.species.species_traits)
blooded = FALSE
diff --git a/code/modules/surgery/organs/stomach.dm b/code/modules/surgery/organs/stomach.dm
index 1422c20c7b..d54f94b0be 100755
--- a/code/modules/surgery/organs/stomach.dm
+++ b/code/modules/surgery/organs/stomach.dm
@@ -36,21 +36,32 @@
H.blur_eyes(3) //We need to add more shit down here
H.adjust_disgust(-0.5 * disgust_metabolism)
-
+ GET_COMPONENT_FROM(mood, /datum/component/mood, H)
switch(H.disgust)
if(0 to DISGUST_LEVEL_GROSS)
H.clear_alert("disgust")
+ if(mood)
+ mood.clear_event("disgust")
if(DISGUST_LEVEL_GROSS to DISGUST_LEVEL_VERYGROSS)
H.throw_alert("disgust", /obj/screen/alert/gross)
+ if(mood)
+ mood.add_event("disgust", /datum/mood_event/disgust/gross)
if(DISGUST_LEVEL_VERYGROSS to DISGUST_LEVEL_DISGUSTED)
H.throw_alert("disgust", /obj/screen/alert/verygross)
+ if(mood)
+ mood.add_event("disgust", /datum/mood_event/disgust/verygross)
if(DISGUST_LEVEL_DISGUSTED to INFINITY)
H.throw_alert("disgust", /obj/screen/alert/disgusted)
+ if(mood)
+ mood.add_event("disgust", /datum/mood_event/disgust/disgusted)
/obj/item/organ/stomach/Remove(mob/living/carbon/M, special = 0)
var/mob/living/carbon/human/H = owner
if(istype(H))
H.clear_alert("disgust")
+ GET_COMPONENT_FROM(mood, /datum/component/mood, H)
+ if(mood)
+ mood.clear_event("disgust")
..()
diff --git a/code/modules/surgery/remove_embedded_object.dm b/code/modules/surgery/remove_embedded_object.dm
index 577541e6c4..8f3fad38f8 100644
--- a/code/modules/surgery/remove_embedded_object.dm
+++ b/code/modules/surgery/remove_embedded_object.dm
@@ -30,6 +30,9 @@
L.embedded_objects -= I
if(!H.has_embedded_objects())
H.clear_alert("embeddedobject")
+ GET_COMPONENT_FROM(mood, /datum/component/mood, H)
+ if(mood)
+ mood.clear_event("embedded")
if(objects > 0)
user.visible_message("[user] successfully removes [objects] objects from [H]'s [L]!", "You successfully remove [objects] objects from [H]'s [L.name]. ")
diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm
index 47d35108a1..862991c4b8 100644
--- a/code/modules/unit_tests/_unit_tests.dm
+++ b/code/modules/unit_tests/_unit_tests.dm
@@ -1,7 +1,8 @@
//include unit test files in this module in this ifdef
-
+// CITADEL EDIT add vore_tests.dm
#ifdef UNIT_TESTS
#include "unit_test.dm"
#include "reagent_recipe_collisions.dm"
#include "reagent_id_typos.dm"
+//#include "vore_tests.dm"
#endif
diff --git a/code/modules/unit_tests/vore_tests.dm b/code/modules/unit_tests/vore_tests.dm
new file mode 100644
index 0000000000..6549aa9ce7
--- /dev/null
+++ b/code/modules/unit_tests/vore_tests.dm
@@ -0,0 +1,218 @@
+/datum/unit_test
+ var/static/default_mobloc = null
+
+/datum/unit_test/proc/create_test_mob(var/turf/mobloc = null, var/mobtype = /mob/living/carbon/human, var/with_mind = FALSE)
+ if(isnull(mobloc))
+ if(!default_mobloc)
+ for(var/turf/simulated/floor/tiled/T in world)
+ var/pressure = T.zone.air.return_pressure()
+ if(90 < pressure && pressure < 120) // Find a turf between 90 and 120
+ default_mobloc = T
+ break
+ mobloc = default_mobloc
+ if(!mobloc)
+ Fail("Unable to find a location to create test mob")
+ return FALSE
+
+ var/mob/living/carbon/human/H = new mobtype(mobloc)
+
+ if(with_mind)
+ H.mind_initialize("TestKey[rand(0,10000)]")
+
+ return H
+
+/datum/unit_test/space_suffocation
+ name = "MOB: human mob suffocates in space"
+
+ var/startOxyloss
+ var/endOxyloss
+ var/mob/living/carbon/human/H
+ async = 1
+
+/datum/unit_test/space_suffocation/Run()
+ var/turf/open/space/T = locate()
+
+ H = new(T)
+ startOxyloss = H.getOxyLoss()
+
+ return 1
+
+/datum/unit_test/space_suffocation/check_result()
+ if(H.life_tick < 10)
+ return 0
+
+ endOxyloss = H.getOxyLoss()
+
+ if(!startOxyloss < endOxyloss)
+ Fail("Human mob is not taking oxygen damage in space. (Before: [startOxyloss]; after: [endOxyloss])")
+
+ qdel(H)
+ return 1
+
+/datum/unit_test/belly_nonsuffocation
+ name = "MOB: human mob does not suffocate in a belly"
+ var/startLifeTick
+ var/startOxyloss
+ var/endOxyloss
+ var/mob/living/carbon/human/pred
+ var/mob/living/carbon/human/prey
+
+/datum/unit_test/belly_nonsuffocation/Run()
+ pred = create_test_mob()
+ if(!istype(pred))
+ return FALSE
+ prey = create_test_mob(pred.loc)
+ if(!istype(prey))
+ return FALSE
+
+ return TRUE
+
+/datum/unit_test/belly_nonsuffocation/check_result()
+ // Unfortuantely we need to wait for the pred's belly to initialize. (Currently after a spawn())
+ if(!pred.vore_organs || !pred.vore_organs.len)
+ return FALSE
+
+ // Now that pred belly exists, we can eat the prey.
+ if(!pred.vore_selected)
+ Fail("[pred] has no vore_selected.")
+ return TRUE
+
+ // Attempt to eat the prey
+ if(prey.loc != pred.vore_selected)
+ pred.vore_selected.nom_mob(prey)
+
+ if(prey.loc != pred.vore_selected)
+ Fail("[pred.vore_selected].nom_mob([prey]) did not put prey inside [pred]")
+ return TRUE
+
+ // Okay, we succeeded in eating them, now lets wait a bit
+ startLifeTick = pred.life_tick
+ startOxyloss = prey.getOxyLoss()
+ return FALSE
+
+ if(pred.life_tick < (startLifeTick + 10))
+ return FALSE // Wait for them to breathe a few times
+
+ // Alright lets check it!
+ endOxyloss = prey.getOxyLoss()
+ if(startOxyloss < endOxyloss)
+ Fail("Prey takes oxygen damage in a pred's belly! (Before: [startOxyloss]; after: [endOxyloss])")
+ qdel(prey)
+ qdel(pred)
+ return TRUE
+////////////////////////////////////////////////////////////////
+/datum/unit_test/belly_spacesafe
+ name = "MOB: human mob protected from space in a belly"
+ var/startLifeTick
+ var/startOxyloss
+ var/startBruteloss
+ var/endOxyloss
+ var/endBruteloss
+ var/mob/living/carbon/human/pred
+ var/mob/living/carbon/human/prey
+
+/datum/unit_test/belly_spacesafe/Run()
+ pred = create_test_mob()
+ if(!istype(pred))
+ return FALSE
+ prey = create_test_mob(pred.loc)
+ if(!istype(prey))
+ return FALSE
+
+ return TRUE
+
+/datum/unit_test/belly_spacesafe/check_result()
+ // Unfortuantely we need to wait for the pred's belly to initialize. (Currently after a spawn())
+ if(!pred.vore_organs || !pred.vore_organs.len)
+ return FALSE
+
+ // Now that pred belly exists, we can eat the prey.
+ if(!pred.vore_selected)
+ Fail("[pred] has no vore_selected.")
+ return TRUE
+
+ // Attempt to eat the prey
+ if(prey.loc != pred.vore_selected)
+ pred.vore_selected.nom_mob(prey)
+
+ if(prey.loc != pred.vore_selected)
+ Fail("[pred.vore_selected].nom_mob([prey]) did not put prey inside [pred]")
+ return TRUE
+ else
+ var/turf/T = locate(/turf/open/space)
+ if(!T)
+ Fail("could not find a space turf for testing")
+ return TRUE
+ else
+ pred.forceMove(T)
+
+ // Okay, we succeeded in eating them, now lets wait a bit
+ startLifeTick = pred.life_tick
+ startOxyloss = prey.getOxyLoss()
+ startBruteloss = prey.getBruteloss()
+ return FALSE
+
+ if(pred.life_tick < (startLifeTick + 10))
+ return FALSE // Wait for them to breathe a few times
+
+ // Alright lets check it!
+ endOxyloss = prey.getOxyLoss()
+ endBruteloss = prey.getBruteLoss()
+ if(startBruteloss < endBruteloss)
+ Fail("Prey takes brute damage in space! (Before: [startBruteloss]; after: [endBruteloss])")
+ qdel(prey)
+ qdel(pred)
+ return TRUE
+////////////////////////////////////////////////////////////////
+/datum/unit_test/belly_damage
+ name = "MOB: human mob takes damage from digestion"
+ var/startLifeTick
+ var/startBruteBurn
+ var/endBruteBurn
+ var/mob/living/carbon/human/pred
+ var/mob/living/carbon/human/prey
+
+/datum/unit_test/belly_damage/Run()
+ pred = create_test_mob()
+ if(!istype(pred))
+ return FALSE
+ prey = create_test_mob(pred.loc)
+ if(!istype(prey))
+ return FALSE
+
+ return TRUE
+
+/datum/unit_test/belly_damage/check_result()
+ // Unfortuantely we need to wait for the pred's belly to initialize. (Currently after a spawn())
+ if(!pred.vore_organs || !pred.vore_organs.len)
+ return FALSE
+
+ // Now that pred belly exists, we can eat the prey.
+ if(!pred.vore_selected)
+ Fail("[pred] has no vore_selected.")
+ return TRUE
+
+ // Attempt to eat the prey
+ if(prey.loc != pred.vore_selected)
+ pred.vore_selected.nom_mob(prey)
+
+ if(prey.loc != pred.vore_selected)
+ Fail("[pred.vore_selected].nom_mob([prey]) did not put prey inside [pred]")
+ return TRUE
+
+ // Okay, we succeeded in eating them, now lets wait a bit
+ pred.vore_selected.digest_mode = DM_DIGEST
+ startLifeTick = pred.life_tick
+ startBruteBurn = prey.getBruteLoss() + prey.getFireLoss()
+ return FALSE
+
+ if(pred.life_tick < (startLifeTick + 10))
+ return FALSE // Wait a few ticks for damage to happen
+
+ // Alright lets check it!
+ endBruteBurn = prey.getBruteLoss() + prey.getFireLoss()
+ if(startBruteBurn >= endBruteBurn)
+ Fail("Prey doesn't take damage in digesting belly! (Before: [startBruteBurn]; after: [endBruteBurn])")
+ qdel(prey)
+ qdel(pred)
+ return TRUE
diff --git a/code/modules/vore/eating/belly_vr.dm b/code/modules/vore/eating/belly_vr.dm
deleted file mode 100644
index d175f51e02..0000000000
--- a/code/modules/vore/eating/belly_vr.dm
+++ /dev/null
@@ -1,467 +0,0 @@
-//
-// The belly object is what holds onto a mob while they're inside a predator.
-// It takes care of altering the pred's decription, digesting the prey, relaying struggles etc.
-//
-
-// If you change what variables are on this, then you need to update the copy() proc.
-
-//
-// Parent type of all the various "belly" varieties.
-//
-/datum/belly
- var/name // Name of this location
- var/inside_flavor // Flavor text description of inside sight/sound/smells/feels.
- var/vore_sound = 'sound/vore/pred/swallow_01.ogg' // Sound when ingesting someone
- var/vore_verb = "ingest" // Verb for eating with this in messages
- var/human_prey_swallow_time = 10 SECONDS // Time in deciseconds to swallow /mob/living/carbon/human
- var/nonhuman_prey_swallow_time = 5 SECONDS // Time in deciseconds to swallow anything else
- var/emoteTime = 30 SECONDS // How long between stomach emotes at prey
- var/digest_brute = 0 // Brute damage per tick in digestion mode
- var/digest_burn = 1 // Burn damage per tick in digestion mode
- var/digest_tickrate = 9 // Modulus this of air controller tick number to iterate gurgles on
- var/immutable = FALSE // Prevents this belly from being deleted
- var/escapable = FALSE // Belly can be resisted out of at any time
- var/escapetime = 60 SECONDS // Deciseconds, how long to escape this belly
- var/digestchance = 0 // % Chance of stomach beginning to digest if prey struggles
-// var/silenced = FALSE // Will the heartbeat/fleshy internal loop play?
- var/escapechance = 0 // % Chance of prey beginning to escape if prey struggles.
-
- var/datum/belly/transferlocation = null // Location that the prey is released if they struggle and get dropped off.
- var/transferchance = 0 // % Chance of prey being transferred to transfer location when resisting
- var/autotransferchance = 0 // % Chance of prey being autotransferred to transfer location
- var/autotransferwait = 10 // Time between trying to transfer.
- var/can_taste = FALSE // If this belly prints the flavor of prey when it eats someone.
-
- var/tmp/digest_mode = DM_HOLD // Whether or not to digest. Default to not digest.
- var/tmp/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_HEAL,DM_NOISY) // Possible digest modes
- var/tmp/mob/living/owner // The mob whose belly this is.
- var/tmp/list/internal_contents = list() // People/Things you've eaten into this belly!
- var/tmp/is_full // Flag for if digested remeans are present. (for disposal messages)
- var/tmp/emotePend = FALSE // If there's already a spawned thing counting for the next emote
- var/swallow_time = 10 SECONDS // for mob transfering automation
- var/vore_capacity = 1 // The capacity (in people) this person can hold
-
- // Don't forget to watch your commas at the end of each line if you change these.
- var/list/struggle_messages_outside = list(
- "%pred's %belly wobbles with a squirming meal.",
- "%pred's %belly jostles with movement.",
- "%pred's %belly briefly swells outward as someone pushes from inside.",
- "%pred's %belly fidgets with a trapped victim.",
- "%pred's %belly jiggles with motion from inside.",
- "%pred's %belly sloshes around.",
- "%pred's %belly gushes softly.",
- "%pred's %belly lets out a wet squelch.")
-
- var/list/struggle_messages_inside = list(
- "Your useless squirming only causes %pred's slimy %belly to squelch over your body.",
- "Your struggles only cause %pred's %belly to gush softly around you.",
- "Your movement only causes %pred's %belly to slosh around you.",
- "Your motion causes %pred's %belly to jiggle.",
- "You fidget around inside of %pred's %belly.",
- "You shove against the walls of %pred's %belly, making it briefly swell outward.",
- "You jostle %pred's %belly with movement.",
- "You squirm inside of %pred's %belly, making it wobble around.")
-
- var/list/digest_messages_owner = list(
- "You feel %prey's body succumb to your digestive system, which breaks it apart into soft slurry.",
- "You hear a lewd glorp as your %belly muscles grind %prey into a warm pulp.",
- "Your %belly lets out a rumble as it melts %prey into sludge.",
- "You feel a soft gurgle as %prey's body loses form in your %belly. They're nothing but a soft mass of churning slop now.",
- "Your %belly begins gushing %prey's remains through your system, adding some extra weight to your thighs.",
- "Your %belly begins gushing %prey's remains through your system, adding some extra weight to your rump.",
- "Your %belly begins gushing %prey's remains through your system, adding some extra weight to your belly.",
- "Your %belly groans as %prey falls apart into a thick soup. You can feel their remains soon flowing deeper into your body to be absorbed.",
- "Your %belly kneads on every fiber of %prey, softening them down into mush to fuel your next hunt.",
- "Your %belly churns %prey down into a hot slush. You can feel the nutrients coursing through your digestive track with a series of long, wet glorps.")
-
- var/list/digest_messages_prey = list(
- "Your body succumbs to %pred's digestive system, which breaks you apart into soft slurry.",
- "%pred's %belly lets out a lewd glorp as their muscles grind you into a warm pulp.",
- "%pred's %belly lets out a rumble as it melts you into sludge.",
- "%pred feels a soft gurgle as your body loses form in their %belly. You're nothing but a soft mass of churning slop now.",
- "%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's thighs.",
- "%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's rump.",
- "%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's belly.",
- "%pred's %belly groans as you fall apart into a thick soup. Your remains soon flow deeper into %pred's body to be absorbed.",
- "%pred's %belly kneads on every fiber of your body, softening you down into mush to fuel their next hunt.",
- "%pred's %belly churns you down into a hot slush. Your nutrient-rich remains course through their digestive track with a series of long, wet glorps.")
-
- var/list/examine_messages = list(
- "They have something solid in their %belly!",
- "It looks like they have something in their %belly!")
-
- //Mostly for being overridden on precreated bellies on mobs. Could be VV'd into
- //a carbon's belly if someone really wanted. No UI for carbons to adjust this.
- //List has indexes that are the digestion mode strings, and keys that are lists of strings.
- var/list/emote_lists = list()
-
-// Constructor that sets the owning mob
-/datum/belly/New(var/mob/living/owning_mob)
- owner = owning_mob
-
-// Toggle digestion on/off and notify user of the new setting.
-// If multiple digestion modes are avaliable (i.e. unbirth) then user should be prompted.
-/datum/belly/proc/toggle_digestion()
- return
-
-// Checks if any mobs are present inside the belly
-// return True if the belly is empty.
-/datum/belly/proc/is_empty()
- return internal_contents.len == 0
-
-// Release all contents of this belly into the owning mob's location.
-// If that location is another mob, contents are transferred into whichever of its bellies the owning mob is in.
-// Returns the number of mobs so released.
-/datum/belly/proc/release_all_contents()
- if (internal_contents.len == 0)
- return 0
- for (var/atom/movable/M in internal_contents)
- M.forceMove(owner.loc) // Move the belly contents into the same location as belly's owner.
- for(var/mob/living/W in M)
- W.stop_sound_channel(CHANNEL_PREYLOOP)
- internal_contents.Remove(M) // Remove from the belly contents
-
- var/datum/belly/B = check_belly(owner) // This makes sure that the mob behaves properly if released into another mob
- if(B)
- B.internal_contents.Add(M)
-
- owner.visible_message("[owner] expels everything from their [lowertext(name)]! ")
- return TRUE
-
-// Release a specific atom from the contents of this belly into the owning mob's location.
-// If that location is another mob, the atom is transferred into whichever of its bellies the owning mob is in.
-// Returns the number of atoms so released.
-/datum/belly/proc/release_specific_contents(var/atom/movable/M)
- if (!(M in internal_contents))
- return FALSE // They weren't in this belly anyway
-
- M.forceMove(owner.loc) // Move the belly contents into the same location as belly's owner.
- for(var/mob/living/W in M)
- W.stop_sound_channel(CHANNEL_PREYLOOP)
- src.internal_contents.Remove(M) // Remove from the belly contents
-
- var/datum/belly/B = check_belly(owner)
- if(B)
- B.internal_contents.Add(M)
-
- owner.visible_message("[owner] expels [M] from their [lowertext(name)]! ")
-// owner.regenerate_icons()
- return TRUE
-
-// Actually perform the mechanics of devouring the tasty prey.
-// The purpose of this method is to avoid duplicate code, and ensure that all necessary
-// steps are taken.
-/datum/belly/proc/nom_mob(var/mob/prey, var/mob/user)
- var/sound/preyloop = sound('sound/vore/prey/loop.ogg', repeat = TRUE)
-
- prey.forceMove(owner)
- internal_contents.Add(prey)
- prey.playsound_local(get_turf(prey),preyloop,40,0, channel = CHANNEL_PREYLOOP)
-
- // Handle prey messages
- if(inside_flavor)
- to_chat(prey, "[src.inside_flavor] ")
- if(isliving(prey))
- var/mob/living/M = prey
- if(can_taste && M.get_taste_message(0))
- to_chat(owner, "[M] tastes of [M.get_taste_message(0)]. ")
-
- // Setup the autotransfer checks if needed
- if(transferlocation && autotransferchance > 0)
- addtimer(CALLBACK(src, /datum/belly/.proc/check_autotransfer, prey), autotransferwait)
-
-/datum/belly/proc/check_autotransfer(var/mob/prey)
- // Some sanity checks
- if(transferlocation && (autotransferchance > 0) && (prey in internal_contents))
- if(prob(autotransferchance))
- // Double check transferlocation isn't insane
- if(verify_transferlocation())
- transfer_contents(prey, transferlocation)
- else
- // Didn't transfer, so wait before retrying
- addtimer(CALLBACK(src, /datum/belly/.proc/check_autotransfer, prey), autotransferwait)
-
-/datum/belly/proc/verify_transferlocation()
- for(var/I in owner.vore_organs)
- var/datum/belly/B = owner.vore_organs[I]
- if(B == transferlocation)
- return TRUE
-
- for(var/I in owner.vore_organs)
- var/datum/belly/B = owner.vore_organs[I]
- if(B.name == transferlocation.name)
- transferlocation = B
- return TRUE
- return FALSE
-
-// Get the line that should show up in Examine message if the owner of this belly
-// is examined. By making this a proc, we not only take advantage of polymorphism,
-// but can easily make the message vary based on how many people are inside, etc.
-// Returns a string which shoul be appended to the Examine output.
-/datum/belly/proc/get_examine_msg()
- if(internal_contents.len && examine_messages.len)
- var/formatted_message
- var/raw_message = pick(examine_messages)
-
- formatted_message = replacetext(raw_message,"%belly",lowertext(name))
- formatted_message = replacetext(formatted_message,"%pred",owner)
- formatted_message = replacetext(formatted_message,"%prey",english_list(internal_contents))
-
- return("[formatted_message] ")
-
-// The next function gets the messages set on the belly, in human-readable format.
-// This is useful in customization boxes and such. The delimiter right now is \n\n so
-// in message boxes, this looks nice and is easily delimited.
-/datum/belly/proc/get_messages(var/type, var/delim = "\n\n")
- ASSERT(type == "smo" || type == "smi" || type == "dmo" || type == "dmp" || type == "em")
- var/list/raw_messages
-
- switch(type)
- if("smo")
- raw_messages = struggle_messages_outside
- if("smi")
- raw_messages = struggle_messages_inside
- if("dmo")
- raw_messages = digest_messages_owner
- if("dmp")
- raw_messages = digest_messages_prey
- if("em")
- raw_messages = examine_messages
-
- var/messages = list2text(raw_messages,delim)
- return messages
-
-// The next function sets the messages on the belly, from human-readable var
-// replacement strings and linebreaks as delimiters (two \n\n by default).
-// They also sanitize the messages.
-/datum/belly/proc/set_messages(var/raw_text, var/type, var/delim = "\n\n")
- ASSERT(type == "smo" || type == "smi" || type == "dmo" || type == "dmp" || type == "em")
-
- var/list/raw_list = text2list(html_encode(raw_text),delim)
- if(raw_list.len > 10)
- raw_list.Cut(11)
-
- for(var/i = 1, i <= raw_list.len, i++)
- if(length(raw_list[i]) > 160 || length(raw_list[i]) < 10) //160 is fudged value due to htmlencoding increasing the size
- raw_list.Cut(i,i)
- else
- raw_list[i] = readd_quotes(raw_list[i])
- //Also fix % sign for var replacement
- raw_list[i] = replacetext(raw_list[i],"%","%")
-
- ASSERT(raw_list.len <= 10) //Sanity
-
- switch(type)
- if("smo")
- struggle_messages_outside = raw_list
- if("smi")
- struggle_messages_inside = raw_list
- if("dmo")
- digest_messages_owner = raw_list
- if("dmp")
- digest_messages_prey = raw_list
- if("em")
- examine_messages = raw_list
-
- return
-
-// Handle the death of a mob via digestion.
-// Called from the process_Life() methods of bellies that digest prey.
-// Default implementation calls M.death() and removes from internal contents.
-// Indigestable items are removed, and M is deleted.
-/datum/belly/proc/digestion_death(var/mob/living/M)
- is_full = TRUE
- internal_contents.Remove(M)
- M.stop_sound_channel(CHANNEL_PREYLOOP)
- // If digested prey is also a pred... anyone inside their bellies gets moved up.
- if(is_vore_predator(M))
- for(var/bellytype in M.vore_organs)
- var/datum/belly/belly = M.vore_organs[bellytype]
- for (var/obj/thing in belly.internal_contents)
- thing.loc = owner
- internal_contents.Add(thing)
- for (var/mob/subprey in belly.internal_contents)
- subprey.loc = owner
- internal_contents.Add(subprey)
- to_chat(subprey, "As [M] melts away around you, you find yourself in [owner]'s [name]")
-
- //Drop all items into the belly
- for(var/obj/item/W in M)
- if(!M.dropItemToGround(W))
- qdel(W)
-
- message_admins("[key_name(owner)] digested [key_name(M)].")
- log_attack("[key_name(owner)] digested [key_name(M)].")
-
- // Delete the digested mob
- qdel(M)
-
-//Handle a mob struggling
-// Called from /mob/living/carbon/relaymove()
-/datum/belly/proc/relay_resist(var/mob/living/R)
- if (!(R in internal_contents))
- return // User is not in this belly, or struggle too soon.
-
- R.setClickCooldown(50)
- var/sound/prey_struggle = sound(get_sfx("prey_struggle"))
-
- if(owner.stat) //If owner is stat (dead, KO) we can actually escape
- to_chat(R, "You attempt to climb out of \the [name]. (This will take around [escapetime/10] seconds.) ")
- to_chat(owner, "Someone is attempting to climb out of your [name]! ")
-
- if(do_after(R, escapetime, owner))
- if((owner.stat || escapable) && (R in internal_contents)) //Can still escape?
- release_specific_contents(R)
- return
- else if(!(R in internal_contents)) //Aren't even in the belly. Quietly fail.
- return
- else //Belly became inescapable or mob revived
- to_chat(R, "Your attempt to escape [name] has failed! ")
- to_chat(owner, "The attempt to escape from your [name] has failed! ")
- return
- return
- var/struggle_outer_message = pick(struggle_messages_outside)
- var/struggle_user_message = pick(struggle_messages_inside)
-
- struggle_outer_message = replacetext(struggle_outer_message,"%pred",owner)
- struggle_outer_message = replacetext(struggle_outer_message,"%prey",R)
- struggle_outer_message = replacetext(struggle_outer_message,"%belly",lowertext(name))
-
- struggle_user_message = replacetext(struggle_user_message,"%pred",owner)
- struggle_user_message = replacetext(struggle_user_message,"%prey",R)
- struggle_user_message = replacetext(struggle_user_message,"%belly",lowertext(name))
-
- struggle_outer_message = "" + struggle_outer_message + " "
- struggle_user_message = "" + struggle_user_message + " "
-
- R.visible_message( "[struggle_outer_message] ", "[struggle_user_message] ")
- playsound(get_turf(owner),"struggle_sound",35,0,-6,1,channel=151,ignore_walls = FALSE)
- R.stop_sound_channel(151)
- R.playsound_local(get_turf(R),prey_struggle,45,0)
-
- if(escapable && R.a_intent != "help") //If the stomach has escapable enabled and the person is actually trying to kick out
- to_chat(R, "You attempt to climb out of \the [name]. ")
- to_chat(owner, "Someone is attempting to climb out of your [name]! ")
- if(prob(escapechance)) //Let's have it check to see if the prey escapes first.
- if(do_after(R, escapetime))
- if((escapable) && (R in internal_contents)) //Does the owner still have escapable enabled?
- release_specific_contents(R)
- to_chat(R, "You climb out of \the [name]. ")
- to_chat(owner, "[R] climbs out of your [name]! ")
- for(var/mob/M in viewers(4, owner))
- M.visible_message("[R] climbs out of [owner]'s [name]! ", 2)
- return
- else if(!(R in internal_contents)) //Aren't even in the belly. Quietly fail.
- return
- else //Belly became inescapable.
- to_chat(R, "Your attempt to escape [name] has failed! ")
- to_chat(owner, "The attempt to escape from your [name] has failed!/span>")
- return
-
- else if(prob(transferchance) && istype(transferlocation)) //Next, let's have it see if they end up getting into an even bigger mess then when they started.
- var/location_ok = verify_transferlocation()
-
- if(!location_ok)
- to_chat(owner, "Something went wrong with your belly transfer settings. ")
- transferlocation = null
- return
-
- to_chat(R, "Your attempt to escape [name] has failed and your struggles only results in you sliding into [owner]'s [transferlocation]! ")
- to_chat(owner, "Someone slid into your [transferlocation] due to their struggling inside your [name]! ")
- transfer_contents(R, transferlocation)
- return
-
- else if(prob(digestchance)) //Finally, let's see if it should run the digest chance.)
- to_chat(R, "In response to your struggling, \the [name] begins to get more active... ")
- to_chat(owner, "You feel your [name] beginning to become active! ")
- digest_mode = DM_DIGEST
- return
- else //Nothing interesting happened.
- to_chat(R, "But make no progress in escaping [owner]'s [name]. ")
- to_chat(owner, "But appears to be unable to make any progress in escaping your [name]. ")
- return
-
-//Transfers contents from one belly to another
-/datum/belly/proc/transfer_contents(var/atom/movable/content, var/datum/belly/target, silent = 0)
- if(!(content in internal_contents))
- return
- internal_contents.Remove(content)
- // Re-use nom_mob
- target.nom_mob(content, target.owner)
- if(!silent)
- playsound(get_turf(owner),"[target].vore_sound",35,0,-6,1,ignore_walls = FALSE)
-/*
-//Handles creation of temporary 'vore chest' upon digestion
-/datum/belly/proc/slimy_mass(var/obj/item/content, var/mob/living/M)
- if(!content in internal_contents)
- return
- internal_contents += new /obj/structure/closet/crate/vore(src)
- internal_contents.Remove(content)
- M.transferItemToLoc(content, /obj/structure/closet/crate/vore)
- if(!M.transferItemToLoc(W))
- qdel(W)
-
-/datum/belly/proc/regurgitate_items(var/obj/structure/closet/crate/vore/C)
- */
-
-// Belly copies and then returns the copy
-// Needs to be updated for any var changes
-/datum/belly/proc/copy(mob/new_owner)
- var/datum/belly/dupe = new /datum/belly(new_owner)
-
- //// Non-object variables
- dupe.name = name
- dupe.inside_flavor = inside_flavor
- dupe.vore_sound = vore_sound
- dupe.vore_verb = vore_verb
- dupe.human_prey_swallow_time = human_prey_swallow_time
- dupe.nonhuman_prey_swallow_time = nonhuman_prey_swallow_time
- dupe.emoteTime = emoteTime
- dupe.digest_brute = digest_brute
- dupe.digest_burn = digest_burn
- dupe.digest_tickrate = digest_tickrate
- dupe.immutable = immutable
- dupe.can_taste = can_taste
- dupe.escapable = escapable
- dupe.escapetime = escapetime
- dupe.digestchance = digestchance
- dupe.escapechance = escapechance
- dupe.transferchance = transferchance
- dupe.transferlocation = transferlocation
- dupe.autotransferchance = autotransferchance
- dupe.autotransferwait = autotransferwait
-
- //// Object-holding variables
- //struggle_messages_outside - strings
- dupe.struggle_messages_outside.Cut()
- for(var/I in struggle_messages_outside)
- dupe.struggle_messages_outside += I
-
- //struggle_messages_inside - strings
- dupe.struggle_messages_inside.Cut()
- for(var/I in struggle_messages_inside)
- dupe.struggle_messages_inside += I
-
- //digest_messages_owner - strings
- dupe.digest_messages_owner.Cut()
- for(var/I in digest_messages_owner)
- dupe.digest_messages_owner += I
-
- //digest_messages_prey - strings
- dupe.digest_messages_prey.Cut()
- for(var/I in digest_messages_prey)
- dupe.digest_messages_prey += I
-
- //examine_messages - strings
- dupe.examine_messages.Cut()
- for(var/I in examine_messages)
- dupe.examine_messages += I
-
- //emote_lists - index: digest mode, key: list of strings
- dupe.emote_lists.Cut()
- for(var/K in emote_lists)
- dupe.emote_lists[K] = list()
- for(var/I in emote_lists[K])
- dupe.emote_lists[K] += I
-
- return dupe
diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm
deleted file mode 100644
index 3d00f9e0fe..0000000000
--- a/code/modules/vore/eating/bellymodes_vr.dm
+++ /dev/null
@@ -1,143 +0,0 @@
-// Process the predator's effects upon the contents of its belly (i.e digestion/transformation etc)
-// Called from /mob/living/Life() proc.
-/datum/belly/proc/process_Life()
- var/sound/prey_gurgle = sound(get_sfx("digest_prey"))
- var/sound/prey_digest = sound(get_sfx("death_prey"))
-
-/////////////////////////// Auto-Emotes ///////////////////////////
- if((digest_mode in emote_lists) && !emotePend)
- emotePend = TRUE
-
- spawn(emoteTime)
- var/list/EL = emote_lists[digest_mode]
- for(var/mob/living/M in internal_contents)
- M << "[pick(EL)] "
- src.emotePend = FALSE
-
-///////////////////////////// DM_HOLD /////////////////////////////
- if(digest_mode == DM_HOLD)
- return //Pretty boring, huh
-
-//////////////////////////// DM_DIGEST ////////////////////////////
- if(digest_mode == DM_DIGEST)
- for (var/mob/living/M in internal_contents)
- if(prob(25))
- M.stop_sound_channel(CHANNEL_PRED)
- playsound(get_turf(owner),"digest_pred",50,0,-6,0,channel=CHANNEL_PRED,ignore_walls = FALSE)
- M.stop_sound_channel(CHANNEL_PRED)
- M.playsound_local(get_turf(M), null, 45, S = prey_gurgle)
-
- //Pref protection!
- if (!M.digestable)
- continue
-
- //Person just died in guts!
- if(M.stat == DEAD)
- var/digest_alert_owner = pick(digest_messages_owner)
- var/digest_alert_prey = pick(digest_messages_prey)
-
- //Replace placeholder vars
- digest_alert_owner = replacetext(digest_alert_owner,"%pred",owner)
- digest_alert_owner = replacetext(digest_alert_owner,"%prey",M)
- digest_alert_owner = replacetext(digest_alert_owner,"%belly",lowertext(name))
-
- digest_alert_prey = replacetext(digest_alert_prey,"%pred",owner)
- digest_alert_prey = replacetext(digest_alert_prey,"%prey",M)
- digest_alert_prey = replacetext(digest_alert_prey,"%belly",lowertext(name))
-
- //Send messages
- to_chat(owner, "[digest_alert_owner] ")
- to_chat(M, "[digest_alert_prey] ")
- M.visible_message("You watch as [owner]'s form loses its additions. ")
-
- owner.nutrition += 400 // so eating dead mobs gives you *something*.
- M.stop_sound_channel(CHANNEL_PRED)
- playsound(get_turf(owner),"death_pred",45,0,-6,0,channel=CHANNEL_PRED,ignore_walls = FALSE)
- M.stop_sound_channel(CHANNEL_PRED)
- M.playsound_local(get_turf(M), null, 45, S = prey_digest)
- digestion_death(M)
- owner.update_icons()
- continue
-
-
- // Deal digestion damage (and feed the pred)
- if(!(M.status_flags & GODMODE))
- M.adjustFireLoss(digest_burn)
- owner.nutrition += 1
- return
-
-///////////////////////////// DM_HEAL /////////////////////////////
- if(digest_mode == DM_HEAL)
- for (var/mob/living/M in internal_contents)
- if(prob(25))
- M.stop_sound_channel(CHANNEL_PRED)
- playsound(get_turf(owner),"digest_pred",35,0,-6,0,channel=CHANNEL_PRED,ignore_walls = FALSE)
- M.stop_sound_channel(CHANNEL_PRED)
- M.playsound_local(get_turf(M), null, 45, S = prey_gurgle)
-
- if(M.stat != DEAD)
- if(owner.nutrition >= NUTRITION_LEVEL_STARVING && (M.health < M.maxHealth))
- M.adjustBruteLoss(-1)
- M.adjustFireLoss(-1)
- owner.nutrition -= 10
- return
-
-////////////////////////// DM_NOISY /////////////////////////////////
-//for when you just want people to squelch around
- if(digest_mode == DM_NOISY)
- for (var/mob/living/M in internal_contents)
- if(prob(35))
- M.stop_sound_channel(CHANNEL_PRED)
- playsound(get_turf(owner),"digest_pred",35,0,-6,0,channel=CHANNEL_PRED,ignore_walls = FALSE)
- M.stop_sound_channel(CHANNEL_PRED)
- M.playsound_local(get_turf(M), null, 45, S = prey_gurgle)
-
-
-//////////////////////////DM_DRAGON /////////////////////////////////////
-//because dragons need snowflake guts
- if(digest_mode == DM_DRAGON)
- for (var/mob/living/M in internal_contents)
- if(prob(25))
- M.stop_sound_channel(CHANNEL_PRED)
- playsound(get_turf(owner),"digest_pred",50,0,-6,0,channel=CHANNEL_PRED,ignore_walls = FALSE)
- M.stop_sound_channel(CHANNEL_PRED)
- M.playsound_local(get_turf(M), null, 45, S = prey_gurgle)
-
- //No digestion protection for megafauna.
-
- //Person just died in guts!
- if(M.stat == DEAD)
- var/digest_alert_owner = pick(digest_messages_owner)
- var/digest_alert_prey = pick(digest_messages_prey)
-
- //Replace placeholder vars
- digest_alert_owner = replacetext(digest_alert_owner,"%pred",owner)
- digest_alert_owner = replacetext(digest_alert_owner,"%prey",M)
- digest_alert_owner = replacetext(digest_alert_owner,"%belly",lowertext(name))
-
- digest_alert_prey = replacetext(digest_alert_prey,"%pred",owner)
- digest_alert_prey = replacetext(digest_alert_prey,"%prey",M)
- digest_alert_prey = replacetext(digest_alert_prey,"%belly",lowertext(name))
-
- //Send messages
- to_chat(owner, "[digest_alert_owner] ")
- to_chat(M, "[digest_alert_prey] ")
- M.visible_message("You watch as [owner]'s guts loudly rumble as it finishes off a meal. ")
-
- M.stop_sound_channel(CHANNEL_PRED)
- playsound(get_turf(owner),"death_pred",45,0,-6,0,channel=CHANNEL_PRED)
- M.stop_sound_channel(CHANNEL_PRED)
- M.playsound_local(get_turf(M), null, 45, S = prey_digest)
- M.spill_organs(FALSE,TRUE,TRUE)
- M << sound(null, repeat = 0, wait = 0, volume = 80, channel = CHANNEL_PREYLOOP)
- digestion_death(M)
- owner.update_icons()
- continue
-
-
- // Deal digestion damage (and feed the pred)
- if(!(M.status_flags & GODMODE))
- M.adjustFireLoss(digest_burn)
- M.adjustToxLoss(4) // something something plasma based acids
- M.adjustCloneLoss(3) // eventually this'll kill you if you're healing everything else, you nerds.
- return
\ No newline at end of file
diff --git a/config/config.txt b/config/config.txt
index 0440549c88..a8c9cf13de 100644
--- a/config/config.txt
+++ b/config/config.txt
@@ -46,6 +46,9 @@ MENTOR_LEGACY_SYSTEM
## Comment this out if you want to use the SQL based banning system. The legacy systems use the files in the data folder. You need to set up your database to use the SQL based system.
BAN_LEGACY_SYSTEM
+## Comment this out to stop locally connected clients from being given the almost full access !localhost! admin rank
+ENABLE_LOCALHOST_RANK
+
## Uncomment this entry to have certain jobs require your account to be at least a certain number of days old to select. You can configure the exact age requirement for different jobs by editing
## the minimal_player_age variable in the files in folder /code/game/jobs/job/.. for the job you want to edit. Set minimal_player_age to 0 to disable age requirement for that job.
## REQUIRES the database set up to work. Keep it hashed if you don't have a database set up.
@@ -70,7 +73,6 @@ BAN_LEGACY_SYSTEM
## Allows admins to bypass job playtime requirements.
#USE_EXP_RESTRICTIONS_ADMIN_BYPASS
-
## log OOC channel
LOG_OOC
diff --git a/config/game_options.txt b/config/game_options.txt
index 6cdc0990ad..d056fb7569 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -223,6 +223,21 @@ BROTHER_OBJECTIVES_AMOUNT 2
## If late-joining players have a chance to become a traitor/changeling
ALLOW_LATEJOIN_ANTAGONISTS
+## Comment this out to disable the antagonist reputation system. This system rewards players who participate in the game instead of greytiding by giving them slightly higher odds to
+## roll antagonist in subsequent rounds until they get it.
+##
+## For details See the comments for /datum/game_mode/proc/antag_pick in code/game/gamemodes/game_mode.dm
+# USE_ANTAG_REP
+
+## The maximum amount of antagonist reputation tickets a player can bank (not use at once)
+ANTAG_REP_MAXIMUM 200
+
+## The default amount of tickets all users use while rolling
+DEFAULT_ANTAG_TICKETS 100
+
+## The maximum amount of extra tickets a user may use from their ticket bank in addition to the default tickets
+MAX_TICKETS_PER_ROLL 100
+
## Uncomment to allow players to see the set odds of different rounds in secret/random in the get server revision screen. This will NOT tell the current roundtype.
#SHOW_GAME_TYPE_ODDS
@@ -511,11 +526,14 @@ ALLOW_MISCREANTS
## Determines if players are allowed to print integrated circuits, uncomment to allow.
#IC_PRINTING
+## Uncomment to allow roundstart trait selection in the character setup menu.
+ROUNDSTART_TRAITS
+
## Enable night shifts ##
-ENABLE_NIGHT_SHIFTS
+#ENABLE_NIGHT_SHIFTS
## Enable randomized shift start times##
-RANDOMIZE_SHIFT_TIME
+#RANDOMIZE_SHIFT_TIME
## Sets shift time to server time at roundstart. Overridden by RANDOMIZE_SHIFT_TIME ##
#SHIFT_TIME_REALTIME
diff --git a/html/browser/common.css b/html/browser/common.css
index 2f43c8c6d7..25db5313d4 100644
--- a/html/browser/common.css
+++ b/html/browser/common.css
@@ -337,14 +337,39 @@ div.notice
transition: .4s;
}
+.slider.red:before {
+ background-color: #d6858b;
+}
+
+.slider.locked:before {
+ content: url("padlock.png");
+ background-color: #b4b4b4;
+}
+
input:checked + .slider {
background-color: #40628a;
}
+input:checked + .slider.red {
+ background-color: #a92621;
+}
+
+input:checked + .slider.locked {
+ background-color: #707070;
+}
+
input:focus + .slider {
box-shadow: 0 0 1px #2196F3;
}
+input:focus + .slider.red {
+ box-shadow: 0 0 1px #f3212d;
+}
+
+input:focus + .slider.locked {
+ box-shadow: 0 0 1px #979797;
+}
+
input:checked + .slider:before {
transform: translateX(24px);
}
diff --git a/html/changelogs/AutoChangeLog-pr-5323.yml b/html/changelogs/AutoChangeLog-pr-5323.yml
deleted file mode 100644
index 82ae6c925b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5323.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Raeschen"
-delete-after: True
-changes:
- - tweak: "Changed/removed some miscreant objectives"
diff --git a/html/changelogs/AutoChangeLog-pr-5374.yml b/html/changelogs/AutoChangeLog-pr-5374.yml
deleted file mode 100644
index 82a54f6df9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5374.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "Dax Dupont"
-delete-after: True
-changes:
- - bugfix: "Telecom equipment now can only be printed by engineers and scientists as intended."
- - bugfix: "WT-550 AP can only be printed by sec now."
- - tweak: "Removed engineering requirement for arcade machines to bring it in line with others."
diff --git a/html/changelogs/AutoChangeLog-pr-5377.yml b/html/changelogs/AutoChangeLog-pr-5377.yml
deleted file mode 100644
index 349cd33be9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5377.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Naksu"
-delete-after: True
-changes:
- - bugfix: "Cyborg engineering module geiger counters now work properly again"
diff --git a/html/changelogs/AutoChangeLog-pr-5378.yml b/html/changelogs/AutoChangeLog-pr-5378.yml
deleted file mode 100644
index 39ee297c68..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5378.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Improvedname, Toriate"
-delete-after: True
-changes:
- - rscadd: "Adds carrot satchel"
diff --git a/html/changelogs/AutoChangeLog-pr-5379.yml b/html/changelogs/AutoChangeLog-pr-5379.yml
deleted file mode 100644
index 2c634bd925..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5379.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - rscadd: "As it would happen, the chef does not actually have Italian genes, but rather was being influenced by a strange moustache-a."
diff --git a/html/changelogs/AutoChangeLog-pr-5384.yml b/html/changelogs/AutoChangeLog-pr-5384.yml
deleted file mode 100644
index 76a838dbe5..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5384.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "deathride58"
-delete-after: True
-changes:
- - tweak: "Input boxes for emotes are now larger. Check it out with the *subtle and *custom commands. This also applies to the M hotkey."
diff --git a/html/changelogs/AutoChangeLog-pr-5385.yml b/html/changelogs/AutoChangeLog-pr-5385.yml
deleted file mode 100644
index 3cb16e227b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5385.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Denton"
-delete-after: True
-changes:
- - code_imp: "Removes grind_results from empty soda cans since they can't be ground."
diff --git a/html/changelogs/AutoChangeLog-pr-5386.yml b/html/changelogs/AutoChangeLog-pr-5386.yml
deleted file mode 100644
index bd2fed8838..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5386.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Denton"
-delete-after: True
-changes:
- - spellcheck: "For consistency's sake, aluminium is now universally spelled with two 'i'."
diff --git a/html/changelogs/AutoChangeLog-pr-5387.yml b/html/changelogs/AutoChangeLog-pr-5387.yml
deleted file mode 100644
index d7abf266c6..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5387.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Dax Dupont"
-delete-after: True
-changes:
- - rscadd: "Defibs can now be researched and printed."
diff --git a/html/changelogs/AutoChangeLog-pr-5388.yml b/html/changelogs/AutoChangeLog-pr-5388.yml
deleted file mode 100644
index 31f18743c6..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5388.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Denton"
-delete-after: True
-changes:
- - code_imp: "Changed can_synth values from 0/1 to FALSE/TRUE"
diff --git a/html/changelogs/AutoChangeLog-pr-5389.yml b/html/changelogs/AutoChangeLog-pr-5389.yml
deleted file mode 100644
index 884319e080..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5389.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - bugfix: "Goliath hide plates now properly apply to explorer suits and APLUs again."
diff --git a/html/changelogs/AutoChangeLog-pr-5390.yml b/html/changelogs/AutoChangeLog-pr-5390.yml
deleted file mode 100644
index 8cb9140c3e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5390.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - balance: "Printed power cells must now be charged before use"
diff --git a/html/changelogs/AutoChangeLog-pr-5391.yml b/html/changelogs/AutoChangeLog-pr-5391.yml
deleted file mode 100644
index 497af33fd9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5391.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Dax Dupont"
-delete-after: True
-changes:
- - balance: "Hatches are now small instead of tiny."
diff --git a/html/changelogs/AutoChangeLog-pr-5397.yml b/html/changelogs/AutoChangeLog-pr-5397.yml
deleted file mode 100644
index 42ac36f460..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5397.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Robustin"
-delete-after: True
-changes:
- - bugfix: "Fixed the limb grower having a max volume of 0."
diff --git a/html/changelogs/AutoChangeLog-pr-5398.yml b/html/changelogs/AutoChangeLog-pr-5398.yml
deleted file mode 100644
index 23246095b9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5398.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - bugfix: "The preference to lock action buttons in place is now correctly saved across rounds."
diff --git a/html/changelogs/AutoChangeLog-pr-5399.yml b/html/changelogs/AutoChangeLog-pr-5399.yml
deleted file mode 100644
index f31125b6e0..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5399.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ordo"
-delete-after: True
-changes:
- - tweak: "Replaced nitrogen with ethanol in morphine recipe. The recipe now has a lower yield."
diff --git a/html/changelogs/AutoChangeLog-pr-5400.yml b/html/changelogs/AutoChangeLog-pr-5400.yml
deleted file mode 100644
index 007a5dbb1f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5400.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "UI Changes"
-delete-after: True
-changes:
- - tweak: "The Scan with Debugger/Device button now reads Copy Ref and no longer sends you to the circuit's page when clicked"
- - tweak: "The assembly's menu is now slightly wider"
- - tweak: "The advanced in \"integrated advanced medical analyser\" is now abbreviated to adv."
diff --git a/html/changelogs/AutoChangeLog-pr-5404.yml b/html/changelogs/AutoChangeLog-pr-5404.yml
deleted file mode 100644
index 738d191bf6..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5404.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - balance: "Changed the chemical recipe for Lexorin from plasma, hydrogen, and nitrogen to plasma, hydrogen, and oxygen."
- - bugfix: "These were necessary due to recipe conflicts"
diff --git a/html/changelogs/AutoChangeLog-pr-5405.yml b/html/changelogs/AutoChangeLog-pr-5405.yml
deleted file mode 100644
index 4684cf09d4..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5405.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Dax Dupont"
-delete-after: True
-changes:
- - bugfix: "Cloner UI now properly updates cloning pod status when autocloning starts cloning someone."
diff --git a/html/changelogs/AutoChangeLog-pr-5408.yml b/html/changelogs/AutoChangeLog-pr-5408.yml
deleted file mode 100644
index ea9647b343..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5408.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: "Toriate"
-delete-after: True
-changes:
- - rscadd: "Added magnetic weapons to techwebs nodes"
- - tweak: "Magrifle magazine now has 24-round capacity, magpistol has 14-round capacity"
- - balance: "rebalanced magrifle projectiles to deal more damage overall on a full burst, but less individually"
- - bugfix: "fixed broken sprites for magrifles"
diff --git a/html/changelogs/AutoChangeLog-pr-5409.yml b/html/changelogs/AutoChangeLog-pr-5409.yml
deleted file mode 100644
index 9cadfc27f2..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5409.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ShizCalev"
-delete-after: True
-changes:
- - bugfix: "Corrected a number of missing checks when using alt-click actions. Please report any strange behavior to a coder."
diff --git a/html/changelogs/AutoChangeLog-pr-5410.yml b/html/changelogs/AutoChangeLog-pr-5410.yml
deleted file mode 100644
index f2ee8ca86e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5410.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Dax Dupont"
-delete-after: True
-changes:
- - balance: "Grabbers/throwers no longer can contain/throw things equal to the assembly size."
diff --git a/html/changelogs/AutoChangeLog-pr-5412.yml b/html/changelogs/AutoChangeLog-pr-5412.yml
deleted file mode 100644
index 4575638349..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5412.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Mokiros"
-delete-after: True
-changes:
- - rscadd: "All-In-One Grinder can now be built with researchable curcuit and micro-manipulator."
diff --git a/html/changelogs/AutoChangeLog-pr-5414.yml b/html/changelogs/AutoChangeLog-pr-5414.yml
deleted file mode 100644
index 8c582750a5..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5414.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - rscadd: "You can now smelt titanium glass and plastitanium glass"
- - rscadd: "Use titanium glass and plastitanium glass to build shuttle windows and plastitanium windows"
diff --git a/html/changelogs/AutoChangeLog-pr-5415.yml b/html/changelogs/AutoChangeLog-pr-5415.yml
deleted file mode 100644
index 655fb49afe..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5415.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Kor"
-delete-after: True
-changes:
- - rscadd: "Mining sentience upgrades now grant minebots an ID and radio."
diff --git a/html/changelogs/AutoChangeLog-pr-5416.yml b/html/changelogs/AutoChangeLog-pr-5416.yml
deleted file mode 100644
index 984d50ea2d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5416.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "More Robust Than You, Basilman, and MMMiracles"
-delete-after: True
-changes:
- - rscadd: "Deep in space, a valuable artifact awaits"
diff --git a/html/changelogs/AutoChangeLog-pr-5419.yml b/html/changelogs/AutoChangeLog-pr-5419.yml
deleted file mode 100644
index a5d05ffa00..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5419.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Naksu"
-delete-after: True
-changes:
- - rscdel: "Steam engines have been removed from maintenance, engineering, atmos and teleportation areas."
diff --git a/html/changelogs/AutoChangeLog-pr-5420.yml b/html/changelogs/AutoChangeLog-pr-5420.yml
deleted file mode 100644
index 821c60f3b4..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5420.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Dax Dupont"
-delete-after: True
-changes:
- - bugfix: "Fixes duplicate air alarm on meta."
diff --git a/html/changelogs/AutoChangeLog-pr-5421.yml b/html/changelogs/AutoChangeLog-pr-5421.yml
deleted file mode 100644
index 1e4b3c7f9e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5421.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - bugfix: "Prevents megafauna (and other large things like spiders and mulebots) from going into machines"
diff --git a/html/changelogs/AutoChangeLog-pr-5422.yml b/html/changelogs/AutoChangeLog-pr-5422.yml
deleted file mode 100644
index a004909230..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5422.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ShizCalev"
-delete-after: True
-changes:
- - spellcheck: "Corrected typo in NTNet Scanner circuits' name, make sure to update your blueprints."
diff --git a/html/changelogs/AutoChangeLog-pr-5423.yml b/html/changelogs/AutoChangeLog-pr-5423.yml
deleted file mode 100644
index a52ec62ade..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5423.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - admin: "The notify irc/discord bot chat command no longer requires admin privileges."
diff --git a/html/changelogs/AutoChangeLog-pr-5427.yml b/html/changelogs/AutoChangeLog-pr-5427.yml
deleted file mode 100644
index c94a419a29..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5427.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Naksu"
-delete-after: True
-changes:
- - rscadd: "The chef is now trained for working under siege"
diff --git a/html/changelogs/AutoChangeLog-pr-5428.yml b/html/changelogs/AutoChangeLog-pr-5428.yml
deleted file mode 100644
index 25cfb0aa6d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5428.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "More Robust Than You"
-delete-after: True
-changes:
- - rscadd: "You can now squish urinal cakes"
diff --git a/html/changelogs/AutoChangeLog-pr-5432.yml b/html/changelogs/AutoChangeLog-pr-5432.yml
deleted file mode 100644
index 7d159a3c40..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5432.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: "RealDonaldTrump"
-delete-after: True
-changes:
- - rscadd: "Added a QM Command Headset and Encryption key"
- - tweak: "Removed the HoP's Cargo access and supply comms access."
- - tweak: "The QM is immune to revolutionaries now and must be murdered, as a head of staff."
- - rscdel: "Removed QM access from Shaft Miners and Cargo Techs during skeleton shifts."
diff --git a/html/changelogs/AutoChangeLog-pr-5433.yml b/html/changelogs/AutoChangeLog-pr-5433.yml
deleted file mode 100644
index 1fe9d351c7..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5433.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "More Robust Than You"
-delete-after: True
-changes:
- - bugfix: "Your hand no longer magically squishes urinal cakes when trying to pick them up"
diff --git a/html/changelogs/AutoChangeLog-pr-5434.yml b/html/changelogs/AutoChangeLog-pr-5434.yml
deleted file mode 100644
index 7ee8978492..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5434.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Denton"
-delete-after: True
-changes:
- - bugfix: "Fixes lye/plastic/charcoal conflicts when mixing."
- - bugfix: "Lye is now made by combining ash with water and carbon. Plastic sheets by heating ash, sulphuric acid and oil."
diff --git a/html/changelogs/AutoChangeLog-pr-5438.yml b/html/changelogs/AutoChangeLog-pr-5438.yml
deleted file mode 100644
index 0a4d3390e8..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5438.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Dax Dupont"
-delete-after: True
-changes:
- - bugfix: "AI no longers block ark after mass_recall"
- - bugfix: "Placed the dispersal logic AFTER the mass_recall on ark activation instead of infront(did nothing before basically)."
diff --git a/html/changelogs/AutoChangeLog-pr-5440.yml b/html/changelogs/AutoChangeLog-pr-5440.yml
deleted file mode 100644
index 0707b4f149..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5440.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Cebutris"
-delete-after: True
-changes:
- - rscadd: "Added in prayer beads, code and sprites shamelessly stolen from Paradise. Chaplains can pray for people, to heal their wounds without the risk of braindamage, and cleanse their mind of unholy thoughts"
diff --git a/html/changelogs/AutoChangeLog-pr-5442.yml b/html/changelogs/AutoChangeLog-pr-5442.yml
deleted file mode 100644
index 1b4b8dd334..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5442.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Dax Dupont"
-delete-after: True
-changes:
- - rscadd: "Cell chargers can now be built and upgraded with capacitors!"
- - bugfix: "Fixed empty subtype batteries not updating icons"
diff --git a/html/changelogs/AutoChangeLog-pr-5445.yml b/html/changelogs/AutoChangeLog-pr-5445.yml
deleted file mode 100644
index 40def083f5..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5445.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "More Robust Than You"
-delete-after: True
-changes:
- - bugfix: "SCP-294 no longer looks fucked up"
diff --git a/html/changelogs/AutoChangeLog-pr-5447.yml b/html/changelogs/AutoChangeLog-pr-5447.yml
deleted file mode 100644
index 4cd5e4a0e0..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5447.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-author: "Robustin"
-delete-after: True
-changes:
- - balance: "The rift created by teleporting in from space will now include a description indicating the direction of the \"origin\" teleport rune - giving the examiner a fair idea of where the \"space base\" is located."
- - balance: "You can no longer manifest spirits or summon cultists while in space or Lavaland. You may still ascend as a spirit (formerly spirit sight, astral jaunt, etc.) in either of these locations."
- - balance: "Juggernauts have lost 20% reflect rate on energy projectiles (now around 50% for standard lasers)."
- - balance: "Wraiths and Juggernauts have -5 melee damage (20 and 25 now, respectively)."
- - balance: "Construct shells now cost 50 metal through the \"twisted construction\" spell. Twisted construction is now a \"single use\" spell."
- - balance: "The Concealment spell will now work on cult airlocks (including converted airlocks). The \"concealed\" airlock will appear as a generic airlock but will deny access to any non-cultist."
- - balance: "The draw blood effect on blood splatters will now draw more blood from stains with low blood levels."
- - tweak: "Unanchored (via ritual dagger) cult structures are no longer \"dense\", meaning you can move them through teleport runes more efficiently."
- - tweak: "The button to nominate yourself for cult master now has a confirmation prompt seeking assurance that the user is prepared to be the cult's master."
- - tweak: "The reveal aspect of the concealment spell is slightly smaller, albeit still slightly larger (6 range) than the concealment aspect (5 range)."
- - imageadd: "Juggernauts \"gauntlet echo\" now has a more cult-themed appearance."
- - bugfix: "Using a shuttle curse to push the shuttle timer above its default can no longer be \"reset\" with a recall. This also adds a block_recall(time_in_deciseconds) helper-proc to the shuttle subsystem."
- - bugfix: "Using runed metal on a regular girder is no longer an option, preventing runtimes and deletions associated with the (unintended) combination."
diff --git a/html/changelogs/AutoChangeLog-pr-5451.yml b/html/changelogs/AutoChangeLog-pr-5451.yml
deleted file mode 100644
index 05ec2a27e2..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5451.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "deathride58"
-delete-after: True
-changes:
- - code_imp: "Synced with upstream. Again. For the hundredth time probably. Check the github for more details."
diff --git a/html/changelogs/AutoChangeLog-pr-5453.yml b/html/changelogs/AutoChangeLog-pr-5453.yml
deleted file mode 100644
index 6e9eaebe6a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5453.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - tweak: "After consulting with their in-house physicists, Nanotrasen has updated their worst-case disaster training simulation \"Space Station 13\". The combustion of hydrogen isotopes now produces water vapor instead of carbon dioxide."
diff --git a/html/changelogs/AutoChangeLog-pr-5456.yml b/html/changelogs/AutoChangeLog-pr-5456.yml
deleted file mode 100644
index 0bbfaf59f9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5456.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Dax Dupont"
-delete-after: True
-changes:
- - rscadd: "Added hooray emoji!"
diff --git a/html/changelogs/AutoChangeLog-pr-5463.yml b/html/changelogs/AutoChangeLog-pr-5463.yml
new file mode 100644
index 0000000000..5bbaf394c5
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5463.yml
@@ -0,0 +1,21 @@
+author: "deathride58"
+delete-after: True
+changes:
+ - rscadd: "You can now sprint by holding shift."
+ - rscadd: "Added combat mode. Press C or use the UI button to toggle it on and off. The code and the sound for toggling combat mode are from Interbay. The sound is mainly a placeholder until a more fitting sound can be found."
+ - rscadd: "You can now use the right mouse button to perform actions while in combat mode. If something doesn't have a unique action for right clicking, it'll default to the normal left click action."
+ - rscadd: "You can now move around and use items while resting. The code is from Interbay"
+ - rscadd: "You can now use the resist button to get up from resting. This will take time depending on your health and stamina, even if you try to use the rest button instead."
+ - rscadd: "Reworked stamina, and introduced stamina crit. If you run out of stamina, you'll enter stamina softcrit, during which you'll be unable to attack, get up from resting, or perform various other actions. If you keep losing stamina after entering stamina softcrit, you'll enter full stamina crit, in which you'll be unable to move or interact with the environment until you're above 0% stamina again."
+ - rscadd: "Added a stamina buffer. Performing actions that drain the user's stamina will now drain the stamina buffer before draining actual stamina. The stamina buffer will start to regenerate after going 5 seconds without performing a stamina-draining action. When the stamina buffer regenerates, it will use up stamina, at a rate of 0.5 points of stamina per 1 point of stamina buffer."
+ - rscadd: "Added a rest button to the HUD"
+ - balance: "90% of all stuns have been removed in favor of stamina. Stuns will now simply knock the affected person down if they would have been 8 seconds or less, but will function for a \"normal\" stun with a length that's a tenth of the normal time if their normal time is longer than 8 seconds."
+ - balance: "Attacking with weapons will now cost stamina depending on the weapon's size. Some code from Interbay."
+ - balance: "Throwing things now costs stamina. Some code from Interbay."
+ - balance: "Default movement speed has been reduced by one tick to accommodate for sprinting. This does not require a config update."
+ - balance: "The slowdown you get when you're low on health has been reduced by one tick to accommodate for the shift from stun-based combat to stamina-based combat."
+ - balance: "Dogborg pouncing has been buffed from a knockdown of 4.5 seconds to a knockdown of 45 seconds. After the previously mentioned changes, this brings dogborg pouncing from 11.5 stamina + knockdown to 115 stamina + 4.5 second stun. **This is a temporary change to make dogborgs immune to the stun nerfs for now until a better solution can be found.**"
+ - balance: "Crushers now regenerate stamina upon successfully detonating a mark."
+ - rscadd: "Also laid down the groundwork for a psuedo z-height system. You can see a small glimpse of it by hopping on a table!"
+ - rscadd: "Added a couple of fancy buttons to the UI! Sprites are from Toriate."
+ - rscadd: "Also added a stamina meter to the UI. Sprites are from Hippiestation"
diff --git a/html/changelogs/AutoChangeLog-pr-5464.yml b/html/changelogs/AutoChangeLog-pr-5464.yml
deleted file mode 100644
index 2ec5074007..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5464.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - rscadd: "Heart-shaped boxes of chocolates are now included in Valentine's Day event gifts"
diff --git a/html/changelogs/AutoChangeLog-pr-5465.yml b/html/changelogs/AutoChangeLog-pr-5465.yml
deleted file mode 100644
index ac80a64f1d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5465.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Iamgoofball"
-delete-after: True
-changes:
- - bugfix: "The Cook now ONLY works under siege."
diff --git a/html/changelogs/AutoChangeLog-pr-5467.yml b/html/changelogs/AutoChangeLog-pr-5467.yml
deleted file mode 100644
index ba61559a87..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5467.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Frozenguy5"
-delete-after: True
-changes:
- - bugfix: "You can craft rat kebabs now."
diff --git a/html/changelogs/AutoChangeLog-pr-5469.yml b/html/changelogs/AutoChangeLog-pr-5469.yml
deleted file mode 100644
index 7ae6cf54a9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5469.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "coiax"
-delete-after: True
-changes:
- - rscadd: "Transference potions now just rename the mob that you are transferring into with your name, rather than your name plus the old name of the mob."
diff --git a/html/changelogs/AutoChangeLog-pr-5470.yml b/html/changelogs/AutoChangeLog-pr-5470.yml
deleted file mode 100644
index f1a9fb3df8..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5470.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Naksu"
-delete-after: True
-changes:
- - tweak: "The clogged vents event has been removed for pressing ceremonial reasons"
diff --git a/html/changelogs/AutoChangeLog-pr-5473.yml b/html/changelogs/AutoChangeLog-pr-5473.yml
deleted file mode 100644
index e702a232cc..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5473.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Naksu"
-delete-after: True
-changes:
- - bugfix: "Chasms no longer eat shuttle docking ports, rendering them unusable and unresponsive"
diff --git a/html/changelogs/AutoChangeLog-pr-5477.yml b/html/changelogs/AutoChangeLog-pr-5477.yml
deleted file mode 100644
index ecafe93d22..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5477.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Dax Dupont"
-delete-after: True
-changes:
- - bugfix: "Integrated circuits no longer start upgraded."
- - balance: "The IC printers that are available on round start in the IC labs are no longer upgraded by default. You will need to research these as was intended"
diff --git a/html/changelogs/AutoChangeLog-pr-5478.yml b/html/changelogs/AutoChangeLog-pr-5478.yml
deleted file mode 100644
index 453d0ebde9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5478.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Cebutris"
-delete-after: True
-changes:
- - rscadd: "Everyone who gets new mineral announcements should now have access to actually get those materials"
diff --git a/html/changelogs/AutoChangeLog-pr-5484.yml b/html/changelogs/AutoChangeLog-pr-5484.yml
deleted file mode 100644
index a8b6d91826..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5484.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Poojawa"
-delete-after: True
-changes:
- - balance: "emags now have a 10 use endurance. Emag carefully, operatives."
diff --git a/html/changelogs/AutoChangeLog-pr-5485.yml b/html/changelogs/AutoChangeLog-pr-5485.yml
deleted file mode 100644
index 76b35f1eaf..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5485.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Poojawa"
-delete-after: True
-changes:
- - rscadd: "Cryopods are now available for safe round exiting, no longer will you need to ahelp with 'oh fuck wrong job'. Being kicked back to lobby for a restart is still admin. You will be warned to ahelp if you're an antag role however."
diff --git a/html/changelogs/AutoChangeLog-pr-5490.yml b/html/changelogs/AutoChangeLog-pr-5490.yml
deleted file mode 100644
index 3f9f6aaa4f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5490.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Cebutris"
-delete-after: True
-changes:
- - rscadd: "Security vendors now have a stunsword modification kit available for purchase with a coin. There might be another somewhere in there, but that would require tampering with it, and you're a good little redshirt, aren't you?"
diff --git a/html/changelogs/AutoChangeLog-pr-5493.yml b/html/changelogs/AutoChangeLog-pr-5493.yml
deleted file mode 100644
index 712b4b9f28..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5493.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - balance: "You no longer need an aggressive grab to table someone."
diff --git a/html/changelogs/AutoChangeLog-pr-5495.yml b/html/changelogs/AutoChangeLog-pr-5495.yml
deleted file mode 100644
index 80d21e35bc..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5495.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Kor"
-delete-after: True
-changes:
- - rscadd: "Bluespace slime extracts now have a new chemical reaction with water, which create slime radio potions. When applied to a simple animal, that mob gains an internal radio."
diff --git a/html/changelogs/AutoChangeLog-pr-5496.yml b/html/changelogs/AutoChangeLog-pr-5496.yml
deleted file mode 100644
index c1e3e1c7d9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5496.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - refactor: "Map initialization now supports stations with multiple z-levels."
- - bugfix: "The map reader no longer sometimes expands the world size inappropriately."
- - tweak: "Pride's Mirror's destination has become less predictable."
diff --git a/html/changelogs/AutoChangeLog-pr-5505.yml b/html/changelogs/AutoChangeLog-pr-5505.yml
deleted file mode 100644
index 0b89b2e2e0..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5505.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MMMiracles"
-delete-after: True
-changes:
- - rscadd: "You can now produce a cryostatis variant of the shotgun dart after researching Medical Weaponry. Holds 10u and doesn't have reagents react inside it."
diff --git a/html/changelogs/AutoChangeLog-pr-5506.yml b/html/changelogs/AutoChangeLog-pr-5506.yml
deleted file mode 100644
index 40765e014b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5506.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - rscdel: "Minimap gone from crew monitoring"
diff --git a/html/changelogs/AutoChangeLog-pr-5508.yml b/html/changelogs/AutoChangeLog-pr-5508.yml
deleted file mode 100644
index 282af66cbb..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5508.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - tweak: "Removing and printing integrated circuits will now attempt to place them into a free hand."
- - tweak: "You can now hit an integrated circuit printer with an unsecured electronic assembly to recycle all of the parts in the assembly en masse."
- - tweak: "You can now recycle empty electronic assemblies in an integrated circuit printer!"
- - soundadd: "Integrated circuit printers now have sounds for printing circuits and assemblies."
diff --git a/html/changelogs/AutoChangeLog-pr-5509.yml b/html/changelogs/AutoChangeLog-pr-5509.yml
deleted file mode 100644
index 938597014c..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5509.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "coiax"
-delete-after: True
-changes:
- - rscadd: "Centcom now reports that thanks to extensive bioengineering, apples
-and oranges now taste of apples and oranges, rather than nothing as they
-did before."
diff --git a/html/changelogs/AutoChangeLog-pr-5512.yml b/html/changelogs/AutoChangeLog-pr-5512.yml
deleted file mode 100644
index bbabd36f85..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5512.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "More Robust Than You"
-delete-after: True
-changes:
- - bugfix: "Fixes SCP-294 losing its top sometimes"
diff --git a/html/changelogs/AutoChangeLog-pr-5515.yml b/html/changelogs/AutoChangeLog-pr-5515.yml
deleted file mode 100644
index eea214c057..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5515.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Poojawa"
-delete-after: True
-changes:
- - balance: "returned Flightsuit armor to being less useful, also ensured they're not getting the best possible huds as well. Batteries to be done eventually."
diff --git a/html/changelogs/AutoChangeLog-pr-5517.yml b/html/changelogs/AutoChangeLog-pr-5517.yml
deleted file mode 100644
index b02e311eb5..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5517.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Denton"
-delete-after: True
-changes:
- - tweak: "Emagging meteor shield satellites now shows you a message."
- - spellcheck: "Fixed a typo when emagging RnD servers."
diff --git a/html/changelogs/AutoChangeLog-pr-5518.yml b/html/changelogs/AutoChangeLog-pr-5518.yml
deleted file mode 100644
index 0dff286598..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5518.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Naksu"
-delete-after: True
-changes:
- - code_imp: "replaced some item-specific movement hooks with components"
diff --git a/html/changelogs/AutoChangeLog-pr-5522.yml b/html/changelogs/AutoChangeLog-pr-5522.yml
deleted file mode 100644
index ff182e1d62..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5522.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - code_imp: "made powercell rigging no longer set rigged to the plasma reagent datum what the hell and makes it use TRUE/FALSE defines"
diff --git a/html/changelogs/AutoChangeLog-pr-5525.yml b/html/changelogs/AutoChangeLog-pr-5525.yml
deleted file mode 100644
index 8fffeb931d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5525.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: "RealDonaldTrump"
-delete-after: True
-changes:
- - rscadd: "Slimepeople (And all types, including Jelly, Xenobio Slimeperson, Stargazer and Luminescent) now have the ability to utilise the 'Alter Form' ability, allowing them to change most things about their body's form."
- - rscadd: "Re-added the slime split and bodyswap ability to Xenobiological Slimepeople, only obtainable through xenobio."
- - rscadd: "Slimepeople can now select tails, taur bodies and ears at roundstart. YOU WILL NEED TO SET YOUR COLOURS; otherwise you'll be rainbow coloured and not exactly slime-like. And nobody wants that."
- - config: "Changed the ID for the roundstart slimepeople (Without the body swap and slime split abilities) to slimeperson. This will need set in the config on Jay's end."
diff --git a/html/changelogs/AutoChangeLog-pr-5527.yml b/html/changelogs/AutoChangeLog-pr-5527.yml
deleted file mode 100644
index d1d01ed199..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5527.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - bugfix: "The RPG loot event will no longer break circuit analyzers."
diff --git a/html/changelogs/AutoChangeLog-pr-5532.yml b/html/changelogs/AutoChangeLog-pr-5532.yml
deleted file mode 100644
index ef599784de..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5532.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MetroidLover"
-delete-after: True
-changes:
- - rscadd: "Added the ability to gain smoke bomb charges by attacking the initiated ninja suit with a beaker containing smoke powder"
diff --git a/html/changelogs/AutoChangeLog-pr-5534.yml b/html/changelogs/AutoChangeLog-pr-5534.yml
deleted file mode 100644
index 5099a198f2..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5534.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Zna12"
-delete-after: True
-changes:
- - rscadd: "Autoylathe"
- - tweak: "Tweaked the description of replica katana to show that it's not as much of a toy as i thought it was."
diff --git a/html/changelogs/AutoChangeLog-pr-5535.yml b/html/changelogs/AutoChangeLog-pr-5535.yml
deleted file mode 100644
index c74dec1e9d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5535.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - rscadd: "added a subreaction for rainbow slime cores, injecting 5u of plasma now makes them explode into random slimecores."
- - rscadd: "added a slimejelly reaction to rainbow slime cores that does the above but all the cores that spawn get 5u each of plasma, water and blood injected. (aka chaos)"
- - code_imp: "improved clusterbuster code with Initialize, addtimer, vars for sounds and payload spawners, etc"
diff --git a/html/changelogs/AutoChangeLog-pr-5538.yml b/html/changelogs/AutoChangeLog-pr-5538.yml
deleted file mode 100644
index b77960fd42..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5538.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Fel and LeonDuvall"
-delete-after: True
-changes:
- - rscadd: "You can now drink sake! Can be found in the bar, or made with rice
-and sugar."
diff --git a/html/changelogs/AutoChangeLog-pr-5539.yml b/html/changelogs/AutoChangeLog-pr-5539.yml
deleted file mode 100644
index f0d826d2dc..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5539.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "TankNut"
-delete-after: True
-changes:
- - tweak: "Corpses spawned in ruins have their suit sensors disabled"
diff --git a/html/changelogs/AutoChangeLog-pr-5540.yml b/html/changelogs/AutoChangeLog-pr-5540.yml
deleted file mode 100644
index 858331ade5..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5540.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Modafinil"
-delete-after: True
-changes:
- - rscadd: "Adds new medicine chem that suppresses sleep and very lightly reduces stunrates, has a very low metabolic rate which is randomized and a low overdose treshold. Overdosing is a lethal oxyloss unless treated. (With epipen urgently and with charcoal/calomel before it puts you to sleep)"
diff --git a/html/changelogs/AutoChangeLog-pr-5542.yml b/html/changelogs/AutoChangeLog-pr-5542.yml
deleted file mode 100644
index 941c3c2a57..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5542.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "coiax"
-delete-after: True
-changes:
- - bugfix: "Species with RESISTHOT (golems, skeletons) can extinguish burning
-items as if they were wearing fireproof gloves."
diff --git a/html/changelogs/AutoChangeLog-pr-5546.yml b/html/changelogs/AutoChangeLog-pr-5546.yml
deleted file mode 100644
index 0c26141b42..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5546.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "jakeramsay007"
-delete-after: True
-changes:
- - bugfix: "Jellypeople/Slimepeople now are able to speak their Slime language, as intended when it was added."
diff --git a/html/changelogs/AutoChangeLog-pr-5547.yml b/html/changelogs/AutoChangeLog-pr-5547.yml
deleted file mode 100644
index b9174386ca..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5547.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Dax Dupont"
-delete-after: True
-changes:
- - bugfix: "After an incident where a very eager roboticist kept expanding a borg's size leading to a structural collapse of the entire station proper safety limitations have been implemented."
diff --git a/html/changelogs/AutoChangeLog-pr-5548.yml b/html/changelogs/AutoChangeLog-pr-5548.yml
deleted file mode 100644
index f3695c5649..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5548.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - bugfix: "fixes lava and fire burning HE-pipes"
diff --git a/html/changelogs/AutoChangeLog-pr-5549.yml b/html/changelogs/AutoChangeLog-pr-5549.yml
deleted file mode 100644
index fddb207ee1..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5549.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - bugfix: "removes the maintenance panel examination message on poddoors (blast doors)"
diff --git a/html/changelogs/AutoChangeLog-pr-5550.yml b/html/changelogs/AutoChangeLog-pr-5550.yml
deleted file mode 100644
index 9e3ae64528..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5550.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Dax Dupont"
-delete-after: True
-changes:
- - rscadd: "Nanotrasen has invested in better reflective materials for it's reflectors. You can now make complex laser shows again."
diff --git a/html/changelogs/AutoChangeLog-pr-5554.yml b/html/changelogs/AutoChangeLog-pr-5554.yml
deleted file mode 100644
index 7db22a96bd..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5554.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "coiax"
-delete-after: True
-changes:
- - admin: "Admins can use the Select Equipment verb on observers. Doing so will
-humanise them and then apply the equipment."
diff --git a/html/changelogs/AutoChangeLog-pr-5555.yml b/html/changelogs/AutoChangeLog-pr-5555.yml
deleted file mode 100644
index 37e6f9f6f2..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5555.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Dax Dupont"
-delete-after: True
-changes:
- - bugfix: "You can rotate freezers and cryo again."
diff --git a/html/changelogs/AutoChangeLog-pr-5558.yml b/html/changelogs/AutoChangeLog-pr-5558.yml
deleted file mode 100644
index c08bcd67d9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5558.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "deathride58"
-delete-after: True
-changes:
- - balance: "RnD's base research point generation rate has been decreased to 1,200 points per minute."
diff --git a/html/changelogs/AutoChangeLog-pr-5563.yml b/html/changelogs/AutoChangeLog-pr-5563.yml
deleted file mode 100644
index 3a2e25a193..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5563.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Naksu"
-delete-after: True
-changes:
- - rscadd: "Exosuit fabricators can now build RPED and crew pinpointer upgrades for engineering and medical borgs respectively."
diff --git a/html/changelogs/AutoChangeLog-pr-5566.yml b/html/changelogs/AutoChangeLog-pr-5566.yml
deleted file mode 100644
index 008d93439f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5566.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ordo"
-delete-after: True
-changes:
- - rscadd: "Adds a few new liquors to the bar, and a few new cocktails to boot!"
diff --git a/html/changelogs/AutoChangeLog-pr-5567.yml b/html/changelogs/AutoChangeLog-pr-5567.yml
deleted file mode 100644
index cb5c5258b1..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5567.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - tweak: "Crew pinpointers now fit on medical belts!"
diff --git a/html/changelogs/AutoChangeLog-pr-5568.yml b/html/changelogs/AutoChangeLog-pr-5568.yml
deleted file mode 100644
index 465ed69402..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5568.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "More Robust Than You"
-delete-after: True
-changes:
- - bugfix: "Actually fixes SCP 294 overlay problems"
diff --git a/html/changelogs/AutoChangeLog-pr-5571.yml b/html/changelogs/AutoChangeLog-pr-5571.yml
deleted file mode 100644
index dd25c0c971..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5571.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - bugfix: "Bicycles are rideable again"
diff --git a/html/changelogs/AutoChangeLog-pr-5576.yml b/html/changelogs/AutoChangeLog-pr-5576.yml
deleted file mode 100644
index ea6e7f4cba..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5576.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "deathride58"
-delete-after: True
-changes:
- - tweak: "Most of the light sources in the game have had their light values to be a little more realistic."
diff --git a/html/changelogs/AutoChangeLog-pr-5577.yml b/html/changelogs/AutoChangeLog-pr-5577.yml
deleted file mode 100644
index 7024c307cc..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5577.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Poojawa"
-delete-after: True
-changes:
- - tweak: "Atmosia is considerably more lethal now. Don't go into space unprotected!"
- - balance: "being on fire is actually something to worry about."
diff --git a/html/changelogs/AutoChangeLog-pr-5580.yml b/html/changelogs/AutoChangeLog-pr-5580.yml
deleted file mode 100644
index 415bbfccbc..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5580.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - bugfix: "New blob tiles are no longer invincible after their blob's death."
- - bugfix: "Blob nodes no longer produce blob tiles even after the blob's death."
diff --git a/html/changelogs/AutoChangeLog-pr-5582.yml b/html/changelogs/AutoChangeLog-pr-5582.yml
deleted file mode 100644
index 581e515c04..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5582.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Improvedname"
-delete-after: True
-changes:
- - bugfix: "Fried eggs don't require boiled eggs anymore and just normal eggs"
diff --git a/html/changelogs/AutoChangeLog-pr-5586.yml b/html/changelogs/AutoChangeLog-pr-5586.yml
deleted file mode 100644
index 2d254beaa0..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5586.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - bugfix: "Fixed paper bins not catching fire properly"
diff --git a/html/changelogs/AutoChangeLog-pr-5590.yml b/html/changelogs/AutoChangeLog-pr-5590.yml
deleted file mode 100644
index a0359447af..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5590.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-author: "XDTM"
-delete-after: True
-changes:
- - rscadd: "Added three new techweb nodes: Advanced Surgery, Experimental Surgery, and Alien Surgery(requires abductor tech)"
- - rscadd: "Added several new surgical procedures, which require these techweb nodes. To enable an advanced surgery, print its relative disk from a protolathe, and load it on an Operating Computer. Advanced surgery can only be performed at operating tables."
- - tweak: "You can now intentionally fail surgical procedures by initiating them with disarm intent instead of help intent."
- - rscadd: "Brain traumas now have a custom resilience system. Some trauma sources can cause traumas which require more extensive treatment, such as the new Lobotomy surgery."
- - rscadd: "Traitors can now purchase a Brainwashing Surgery Disk for 5 TC."
diff --git a/html/changelogs/AutoChangeLog-pr-5592.yml b/html/changelogs/AutoChangeLog-pr-5592.yml
deleted file mode 100644
index b131a5f963..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5592.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "coiax"
-delete-after: True
-changes:
- - rscadd: "Mime's Bane, a toxin that prevents people from emoting while it's in their system, can now be created by mixing 1 part Mute Toxin, 1 part Nothing and 1 part Radium."
diff --git a/html/changelogs/AutoChangeLog-pr-5595.yml b/html/changelogs/AutoChangeLog-pr-5595.yml
deleted file mode 100644
index f3edc90a12..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5595.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - rscadd: "Circuits integrity, charge, and overall circuit composition is displayed on diagnostic huds. If the assembly has dangerous circuits then the status icon will display exclamation points, if the assembly can communicate with something far away a wifi icon will appear next to the status icon, and if the circuit can not operate the status icon will display an 'X'."
- - rscadd: "AR interface circuit which can modify the status icon if it is not displaying the exclamation points or the 'X'."
- - tweak: "Locomotive circuits can no longer be added to assemblies that can't use them."
- - spellcheck: "Fixed a typo in the grenade primer description."
- - code_imp: "Added flags to circuits that help group subsets of circuits and regulate them."
diff --git a/html/changelogs/AutoChangeLog-pr-5596.yml b/html/changelogs/AutoChangeLog-pr-5596.yml
deleted file mode 100644
index 3f7c3c9388..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5596.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - bugfix: "fixed walls under doors breaking to space"
- - tweak: "changed doors to no longer spawn on top of walls"
diff --git a/html/changelogs/AutoChangeLog-pr-5597.yml b/html/changelogs/AutoChangeLog-pr-5597.yml
deleted file mode 100644
index c830d7955a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5597.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - bugfix: "fixed ghost spawners showing up in the spawner menu when you can't use them"
diff --git a/html/changelogs/AutoChangeLog-pr-5604.yml b/html/changelogs/AutoChangeLog-pr-5604.yml
deleted file mode 100644
index b26d3fbea9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5604.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-author: "Joan"
-delete-after: True
-changes:
- - tweak: "The crusher kit now includes an advanced mining scanner."
- - tweak: "The resonator kit now includes webbing and a small extinguisher."
- - tweak: "The minebot kit now includes a minebot passthrough kinetic accelerator module, which will cause kinetic accelerator shots to pass through minebots. The welding goggles have been replaced with a welding helmet, allowing you to wear mesons and still be able to repair the minebot without eye damage.
-feature: You can now install kinetic accelerator modkits on minebots. Some exceptions may apply. Crowbar to remove modkits."
- - balance: "Minebots now shoot 33% faster by default(3 seconds to 2). The minebot cooldown upgrade still produces a fire rate of 1 second."
- - balance: "Minebots are now slightly less likely to sit in melee like idiots, and are now healed for 15 instead of 10 when welded."
- - balance: "Sentient minebots are penalized; they cannot have armor and melee upgrades installed, and making them sentient will override those upgrades if they were installed. In addition, they move very slightly slower and have their kinetic accelerator's cooldown increased by 1 second."
diff --git a/html/changelogs/AutoChangeLog-pr-5606.yml b/html/changelogs/AutoChangeLog-pr-5606.yml
deleted file mode 100644
index fd2238ab98..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5606.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - rscadd: "The round-end report now shows information about the first person to die in that round."
diff --git a/html/changelogs/AutoChangeLog-pr-5607.yml b/html/changelogs/AutoChangeLog-pr-5607.yml
deleted file mode 100644
index 09a3db4529..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5607.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - rscadd: "Admins may now spawn a debug circuit printer that can always print circuits, and has infinite metal."
- - bugfix: "Buttons, number pads, and text pads in integrated circuits now correctly show their labels."
- - bugfix: "Integrated hypo-injectors can now correctly draw blood."
- - tweak: "The circuit analyzer output has been slightly tweaked and includes usage instructions."
diff --git a/html/changelogs/AutoChangeLog-pr-5608.yml b/html/changelogs/AutoChangeLog-pr-5608.yml
deleted file mode 100644
index 430d10aee3..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5608.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Jittai"
-delete-after: True
-changes:
- - tweak: "Ctrl+Clicking progresses through grab cycle on living mobs (not just humans)"
diff --git a/html/changelogs/AutoChangeLog-pr-5609.yml b/html/changelogs/AutoChangeLog-pr-5609.yml
deleted file mode 100644
index 9cf7d4dece..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5609.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - rscadd: "Nanotrasen psychologists have identified new phobias emerging amongst the workforce. Nanotrasen's surgeon general advises all personnel to just buck up and deal with it."
diff --git a/html/changelogs/AutoChangeLog-pr-5610.yml b/html/changelogs/AutoChangeLog-pr-5610.yml
deleted file mode 100644
index 2f9459d9c4..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5610.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Dax Dupont"
-delete-after: True
-changes:
- - rscadd: "Adds special tutorial holopads for the hazard course."
diff --git a/html/changelogs/AutoChangeLog-pr-5611.yml b/html/changelogs/AutoChangeLog-pr-5611.yml
deleted file mode 100644
index f5a6ffa91c..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5611.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "NTnet circuit fix"
-delete-after: True
-changes:
- - bugfix: "Now NTnet circuits can recieve sender adress properly.Also, now messages could be sended to multiple recepiens."
diff --git a/html/changelogs/AutoChangeLog-pr-5612.yml b/html/changelogs/AutoChangeLog-pr-5612.yml
deleted file mode 100644
index 2140adcada..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5612.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Kevinz000 and Naksu"
-delete-after: True
-changes:
- - bugfix: "Ore stacks will now initialize with proper visuals and no longer show a NO SPRITE text when you gather more than 20 ores to a stack."
diff --git a/html/changelogs/AutoChangeLog-pr-5613.yml b/html/changelogs/AutoChangeLog-pr-5613.yml
deleted file mode 100644
index 0d6bf7c6c8..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5613.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - bugfix: "fixed multiserver mining formula"
diff --git a/html/changelogs/AutoChangeLog-pr-5615.yml b/html/changelogs/AutoChangeLog-pr-5615.yml
deleted file mode 100644
index 5b78aec45f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5615.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - tweak: "Plastic surgery now lets you choose from a list of ten random names, so you can pick the one that you prefer."
- - tweak: "Abductors performing plastic surgery can now give their target spooky subject names, with one normal name available for standard plastique."
diff --git a/html/changelogs/AutoChangeLog-pr-5616.yml b/html/changelogs/AutoChangeLog-pr-5616.yml
deleted file mode 100644
index 8b9cf3dd00..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5616.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "deathride58"
-delete-after: True
-changes:
- - balance: "Xenos no longer have stun or stamina immunity"
diff --git a/html/changelogs/AutoChangeLog-pr-5617.yml b/html/changelogs/AutoChangeLog-pr-5617.yml
deleted file mode 100644
index f96e0ef3d6..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5617.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "deathride58"
-delete-after: True
-changes:
- - balance: "Sleeping Carp and Psychotic Brawl will now both use Knockdown() instead of Stun() for their stuns, making things a lot more consistent with the recent stun nerfs."
diff --git a/html/changelogs/AutoChangeLog-pr-5618.yml b/html/changelogs/AutoChangeLog-pr-5618.yml
deleted file mode 100644
index 7e25ba3dd7..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5618.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "RealDonaldTrump"
-delete-after: True
-changes:
- - tweak: "Altered the HoP to require Service experience instead of Supply"
diff --git a/html/changelogs/AutoChangeLog-pr-5619.yml b/html/changelogs/AutoChangeLog-pr-5619.yml
deleted file mode 100644
index 08dcfe13ae..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5619.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - rscadd: "Added the dish drive. This machine, the future in plate disposal, can be researched from techwebs (Biological Processing) and built with a standard machine frame using two matter bins, a micro manipulator, and a glass sheet."
- - rscadd: "A circuit board for the dish drive can be found in the chef's and bartender's wardrobes."
- - rscadd: "You can hit a dish drive with any dish (like a plate or drinking glass), and the dish drive will convert it from matter to energy, allowing it to store an infinite amount of dishes. You can also interact with it to get things back from it."
- - rscadd: "Dish drives also have an automatic \"suction\" function that sucks in all loose dishes within four tiles. This can be toggled by activating its circuit board in-hand."
- - rscadd: "Dish drives automatically beam their stored dishes into any disposal unit that it can see within seven tiles every minute. You can toggle this by alt-clicking its circuit board."
diff --git a/html/changelogs/AutoChangeLog-pr-5623.yml b/html/changelogs/AutoChangeLog-pr-5623.yml
deleted file mode 100644
index 89b45d32e5..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5623.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "Poojawa"
-delete-after: True
-changes:
- - bugfix: "Fixed preferences from overridding vore bellies on different characters with the last saved. Maybe. Worked on local."
- - soundadd: "added a button for prey to restart their sound loop, if it cut out and they want it back on."
- - soundadd: "Vore sounds respect walls, people can stop bitching about dorm room vore RP."
diff --git a/html/changelogs/AutoChangeLog-pr-5630.yml b/html/changelogs/AutoChangeLog-pr-5630.yml
deleted file mode 100644
index d7f24d0ad5..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5630.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Naksu"
-delete-after: True
-changes:
- - bugfix: "Flightsuits should be controllable again"
diff --git a/html/changelogs/AutoChangeLog-pr-5633.yml b/html/changelogs/AutoChangeLog-pr-5633.yml
deleted file mode 100644
index 8130f1cd15..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5633.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Cebutris"
-delete-after: True
-changes:
- - bugfix: "Slimes of all sorts should no longer have livers"
diff --git a/html/changelogs/AutoChangeLog-pr-5634.yml b/html/changelogs/AutoChangeLog-pr-5634.yml
deleted file mode 100644
index c020140483..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5634.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Denton"
-delete-after: True
-changes:
- - code_imp: "Renamed the IDs of various reagents to be more descriptive."
- - spellcheck: "Fixed the descriptions of changeling adrenaling reagents."
diff --git a/html/changelogs/AutoChangeLog-pr-5635.yml b/html/changelogs/AutoChangeLog-pr-5635.yml
deleted file mode 100644
index d9b05dafa2..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5635.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Denton"
-delete-after: True
-changes:
- - tweak: "Changed Santa event earliest start from 33 minutes & 20 seconds to 30 minutes. Changed shuttle loan earliest start from 6 minutes & 40 seconds to 7 minutes."
diff --git a/html/changelogs/AutoChangeLog-pr-5636.yml b/html/changelogs/AutoChangeLog-pr-5636.yml
deleted file mode 100644
index 36034f0db6..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5636.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Denton"
-delete-after: True
-changes:
- - spellcheck: "Tweaked the message you see when emagging meteor shield satellites."
diff --git a/html/changelogs/AutoChangeLog-pr-5638.yml b/html/changelogs/AutoChangeLog-pr-5638.yml
deleted file mode 100644
index 359dde9603..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5638.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "Kevinz000 & Deathride58"
-delete-after: True
-changes:
- - rscadd: "A separate round time has been added to status panel. This will start at 00:00:00."
- - rscadd: "Night shift lighting [if enabled in the same configuration] will activate between station time 7:30 PM and 7:30 AM. This will dim all lights affected, but they will still have the same range."
- - rscadd: "APCs now have an option to set night lighting mode on or off, regardless of time."
diff --git a/html/changelogs/AutoChangeLog-pr-5640.yml b/html/changelogs/AutoChangeLog-pr-5640.yml
deleted file mode 100644
index 1e73571181..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5640.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Naksu"
-delete-after: True
-changes:
- - code_imp: "removed unused poisoned apple variant"
diff --git a/html/changelogs/AutoChangeLog-pr-5641.yml b/html/changelogs/AutoChangeLog-pr-5641.yml
deleted file mode 100644
index 9e6eba0abe..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5641.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Jittai / ChuckTheSheep"
-delete-after: True
-changes:
- - imageadd: "NT has stopped buying re-boxed storebrand Donkpockets and now stocks stations with real, genuine, tasty Donkpockets!"
diff --git a/html/changelogs/AutoChangeLog-pr-5642.yml b/html/changelogs/AutoChangeLog-pr-5642.yml
deleted file mode 100644
index 1bf3247e67..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5642.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - tweak: "Nanotrasen has begun a campaign to inform their employees that you can alt-click to disable morgue tray beeping."
diff --git a/html/changelogs/AutoChangeLog-pr-5645.yml b/html/changelogs/AutoChangeLog-pr-5645.yml
deleted file mode 100644
index 9478df06eb..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5645.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Robustin"
-delete-after: True
-changes:
- - bugfix: "The clock cult's marauder limit now works properly, temporarily lower the marauder limit when one has recently been summoned."
diff --git a/html/changelogs/AutoChangeLog-pr-5647.yml b/html/changelogs/AutoChangeLog-pr-5647.yml
deleted file mode 100644
index 53ae908ef9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5647.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Super3222, TheMythicGhost, DaedalusGame"
-delete-after: True
-changes:
- - rscadd: "Adds a barometer function to the standard atmos analyzer."
- - imageadd: "Adds a new sprite for the atmos analyzer to resemble a barometer."
diff --git a/html/changelogs/AutoChangeLog-pr-5648.yml b/html/changelogs/AutoChangeLog-pr-5648.yml
deleted file mode 100644
index 2c763dd2b3..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5648.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Repukan"
-delete-after: True
-changes:
- - bugfix: "fixed windoors dropping more cable than what was used to build them."
diff --git a/html/changelogs/AutoChangeLog-pr-5649.yml b/html/changelogs/AutoChangeLog-pr-5649.yml
deleted file mode 100644
index b973890684..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5649.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "RealDonaldTrump"
-delete-after: True
-changes:
- - balance: "Rebalanced cold damage on slimepeople"
- - bugfix: "Transform potions no longer give more than one alter form ability"
diff --git a/html/changelogs/AutoChangeLog-pr-5650.yml b/html/changelogs/AutoChangeLog-pr-5650.yml
deleted file mode 100644
index 0eefedb0ab..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5650.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MetroidLover"
-delete-after: True
-changes:
- - balance: "rebalanced Ninja event to allow it to happen earlier."
diff --git a/html/changelogs/AutoChangeLog-pr-5651.yml b/html/changelogs/AutoChangeLog-pr-5651.yml
deleted file mode 100644
index eeb3b0a2cb..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5651.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MetroidLover"
-delete-after: True
-changes:
- - bugfix: "fixed Ninja welcome text to no longer tell you to right click your suit."
diff --git a/html/changelogs/AutoChangeLog-pr-5653.yml b/html/changelogs/AutoChangeLog-pr-5653.yml
deleted file mode 100644
index 11325e5f67..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5653.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "kevinz000, Denton"
-delete-after: True
-changes:
- - rscadd: "Nanotrasen's RnD division has integrated all stationary tachyon doppler arrays into the techweb system. Record increasingly large explosions with them and you will generate research points!"
- - spellcheck: "Fixed a few typos in the RnD doppler array name/description."
diff --git a/html/changelogs/AutoChangeLog-pr-5657.yml b/html/changelogs/AutoChangeLog-pr-5657.yml
deleted file mode 100644
index 45f0856d0e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5657.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Cebutris"
-delete-after: True
-changes:
- - tweak: "Toxin loving species now properly take toxin damage from liver failiure"
diff --git a/html/changelogs/AutoChangeLog-pr-5658.yml b/html/changelogs/AutoChangeLog-pr-5658.yml
deleted file mode 100644
index 179b332095..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5658.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - code_imp: "removes input/output plates and changes autogibbers to use input dir"
diff --git a/html/changelogs/AutoChangeLog-pr-5659.yml b/html/changelogs/AutoChangeLog-pr-5659.yml
deleted file mode 100644
index b6ba2cee2b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5659.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Denton"
-delete-after: True
-changes:
- - tweak: "The outer airlocks of various lavaland ruins and ships now cycle lock."
diff --git a/html/changelogs/AutoChangeLog-pr-5660.yml b/html/changelogs/AutoChangeLog-pr-5660.yml
deleted file mode 100644
index 23fd1ab34d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5660.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Denton"
-delete-after: True
-changes:
- - tweak: "The outer airlocks of most space ruin airlocks are now cycle linked."
diff --git a/html/changelogs/AutoChangeLog-pr-5661.yml b/html/changelogs/AutoChangeLog-pr-5661.yml
deleted file mode 100644
index a1f53d6f16..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5661.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Naksu"
-delete-after: True
-changes:
- - admin: "Admins can now start the game as extended revs, a version of revs that doesn't end when head(rev)s are dead. Admins can also use the speedy mode, which nukes the station after 20 minutes."
diff --git a/html/changelogs/AutoChangeLog-pr-5662.yml b/html/changelogs/AutoChangeLog-pr-5662.yml
deleted file mode 100644
index c7851b94cb..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5662.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Denton"
-delete-after: True
-changes:
- - bugfix: "Players can no longer kill themselves by whispering inside clone pods."
diff --git a/html/changelogs/AutoChangeLog-pr-5663.yml b/html/changelogs/AutoChangeLog-pr-5663.yml
deleted file mode 100644
index 6bda49061b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5663.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Repukan"
-delete-after: True
-changes:
- - rscadd: "Whiskey to the flask"
- - rscdel: "Hearty Punch from the flask"
diff --git a/html/changelogs/AutoChangeLog-pr-5666.yml b/html/changelogs/AutoChangeLog-pr-5666.yml
deleted file mode 100644
index 0000b86190..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5666.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Denton"
-delete-after: True
-changes:
- - tweak: "The 'neurotoxin2' toxin has been renamed to Fentanyl."
diff --git a/html/changelogs/AutoChangeLog-pr-5668.yml b/html/changelogs/AutoChangeLog-pr-5668.yml
deleted file mode 100644
index e8f9ae32b9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5668.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Poojawa"
-delete-after: True
-changes:
- - bugfix: "Dogborgs should no longer have offset issues after attacking."
- - bugfix: "Dogborg laser/disabler fluff now works again."
diff --git a/html/changelogs/AutoChangeLog-pr-5669.yml b/html/changelogs/AutoChangeLog-pr-5669.yml
deleted file mode 100644
index 48cf9a6be9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5669.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ShizCalev"
-delete-after: True
-changes:
- - tweak: "Silicons no longer have to be adjacent to morguetrays to disable the alarms on then."
diff --git a/html/changelogs/AutoChangeLog-pr-5670.yml b/html/changelogs/AutoChangeLog-pr-5670.yml
deleted file mode 100644
index bc9ed17cfa..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5670.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Poojawa"
-delete-after: True
-changes:
- - bugfix: "Shock collars re-added to autolathes"
diff --git a/html/changelogs/AutoChangeLog-pr-5672.yml b/html/changelogs/AutoChangeLog-pr-5672.yml
deleted file mode 100644
index 4c9c5f0a06..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5672.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Astral"
-delete-after: True
-changes:
- - rscadd: "Traitor CMOs and Chemists, for 12 TC, can now get a reagent dartgun, which is capable of synthesizing it's own syringes, but does so slowly, and can be easily identified as syndicate by anyone who isn't blind!"
diff --git a/html/changelogs/AutoChangeLog-pr-5673.yml b/html/changelogs/AutoChangeLog-pr-5673.yml
deleted file mode 100644
index 15622f81a9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5673.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - bugfix: "enables the RPED to construct/replace other parts commonly used in machines (igniters, beakers, bs crystals)"
- - bugfix: "fixes part ratings of cells so slime cells are correctly more desirable than bluespace cells and other such nonsense"
diff --git a/html/changelogs/AutoChangeLog-pr-5674.yml b/html/changelogs/AutoChangeLog-pr-5674.yml
deleted file mode 100644
index f6359e0328..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5674.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - bugfix: "shivering symptom now works properly instead of only cooling you if you're already cold"
- - bugfix: "fixed bodytemp going negative in a few cases"
diff --git a/html/changelogs/AutoChangeLog-pr-5680.yml b/html/changelogs/AutoChangeLog-pr-5680.yml
deleted file mode 100644
index 025217a854..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5680.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - tweak: "Reskinning objects now shows their possible appearances in the chat box."
diff --git a/html/changelogs/AutoChangeLog-pr-5681.yml b/html/changelogs/AutoChangeLog-pr-5681.yml
deleted file mode 100644
index 0334a6ccb1..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5681.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - rscadd: "Added Bastion Bourbon, which you can mix with tea, creme de menthe, triple citrus, and berry juice. When it's in your system, it will very slowly heal you as long as you're not in critical. When it's first added to your system, you heal an amount of each damage type equal to the volume taken in, with a max of 10. This is turned to a max of 20 for anyone in critical."
- - rscadd: "Added Squirt Cider, which you can mix with water, tomato juice, and nutriment. It's nutritious and healthy!"
diff --git a/html/changelogs/AutoChangeLog-pr-5684.yml b/html/changelogs/AutoChangeLog-pr-5684.yml
deleted file mode 100644
index f460ddfb01..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5684.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - tweak: "The last scientists have reported that thermonuclear blasts triggered by so called 'power gamers' have shorted the doppler array. We've readjusted the ALU and are confident that this will not happen again."
diff --git a/html/changelogs/AutoChangeLog-pr-5687.yml b/html/changelogs/AutoChangeLog-pr-5687.yml
deleted file mode 100644
index c5603175fb..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5687.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "deathride58"
-delete-after: True
-changes:
- - rscadd: "Lights will now actually glow in the dark!"
diff --git a/html/changelogs/AutoChangeLog-pr-5689.yml b/html/changelogs/AutoChangeLog-pr-5689.yml
deleted file mode 100644
index f6eae22630..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5689.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - tweak: "Tweaked the inventory management of the black fedora to be more like the detective's"
diff --git a/html/changelogs/AutoChangeLog-pr-5697.yml b/html/changelogs/AutoChangeLog-pr-5697.yml
deleted file mode 100644
index 24a1d5abe2..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5697.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Toriate"
-delete-after: True
-changes:
- - rscadd: "Added a syndicate exclusive .357. Replaces the original one in the uplink. All other .357s are untouched."
- - imageadd: "added new sprites for crowbars, wrenches, syndicate .357, and eguns"
diff --git a/html/changelogs/AutoChangeLog-pr-5698.yml b/html/changelogs/AutoChangeLog-pr-5698.yml
deleted file mode 100644
index 8bdc304c7f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5698.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "XDTM"
-delete-after: True
-changes:
- - balance: "You can no longer gain the same trauma more than once."
- - balance: "You can no longer gain more than a certain amount of brain traumas per resilience tier. (Example: You cannot gain 4 mild traumas, but you can gain 3 mild and 1 severe)"
- - tweak: "Abductors' trauma gland now gives traumas of random resilience, instead of lobotomy every time."
diff --git a/html/changelogs/AutoChangeLog-pr-5701.yml b/html/changelogs/AutoChangeLog-pr-5701.yml
deleted file mode 100644
index b113bf0ee0..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5701.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "XDTM"
-delete-after: True
-changes:
- - tweak: "Operating computers now display the chemicals required to complete a surgery step, if there are any."
- - tweak: "Completing a surgery without the required chems will always result in failure, instead of a success with no effect."
diff --git a/html/changelogs/AutoChangeLog-pr-5702.yml b/html/changelogs/AutoChangeLog-pr-5702.yml
deleted file mode 100644
index 9ebcd306d6..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5702.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-author: "XDTM"
-delete-after: True
-changes:
- - balance: "Wizard spells and items can now be resisted/ignored with anti-magic items/clothing such as null rods!"
- - balance: "Revenant spells can now be resisted with \"holy\" items like null rods and bibles."
- - balance: "Wizard hardsuits are now magic immune, but not holy."
- - balance: "Immortality Talismans now grant both spell and holy immunity."
- - tweak: "Inquisitor Hardsuits already granted spell and holy immunity, but now they do it properly instead of having a null rod embedded inside."
- - tweak: "Holy Melons now grant holy immunity."
diff --git a/html/changelogs/AutoChangeLog-pr-5703.yml b/html/changelogs/AutoChangeLog-pr-5703.yml
deleted file mode 100644
index 1090c34dd0..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5703.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - balance: "Instead of starting unable to clone circuits at all, circuit printers can now print circuits over time from roundstart. The formula for this is equal to (metal cost / 150) seconds, with a maximum of 3 minutes. You can see printing progress by using the printer's interface, and you can print normal components during this time."
- - balance: "If circuit printing is disabled in the config, cloning remains unavailable."
- - balance: "The upgrade disk to allow circuit printers to clone circuits has been replaced with an upgrade disk to make circuit cloning instant."
- - balance: "Both circuit printer upgrade disks now cost 5000 metal and glass, down from 10000."
diff --git a/html/changelogs/AutoChangeLog-pr-5704.yml b/html/changelogs/AutoChangeLog-pr-5704.yml
deleted file mode 100644
index 30963a5296..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5704.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - bugfix: "Tritium no longer produces so much radiation that it crashes the server"
diff --git a/html/changelogs/AutoChangeLog-pr-5705.yml b/html/changelogs/AutoChangeLog-pr-5705.yml
deleted file mode 100644
index 9a898ad295..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5705.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - code_imp: "Butchering has been refactored."
- - balance: "Some items now take longer to butcher, and have a chance to harvest fewer items, like spears. Others, however, are faster, like circular saws."
- - balance: "Certain creatures will always drop certain items on butchering, regardless of butchering effectiveness or chances."
- - balance: "Items that are very effective at butchering may yield bonus loot from butchered creatures!"
diff --git a/html/changelogs/AutoChangeLog-pr-5707.yml b/html/changelogs/AutoChangeLog-pr-5707.yml
deleted file mode 100644
index b30b0458bf..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5707.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - balance: "livers don't unfail automatically every second life cycle you have to get a new one or get some corazone stat"
- - balance: "increased liver damage from alcohol significantly because apparently your liver regenerates faster than you can chug unless you drink 100 liters of bacchus blessing"
- - bugfix: "fixed cyber livers thinking they should fail at half durability"
diff --git a/html/changelogs/AutoChangeLog-pr-5711.yml b/html/changelogs/AutoChangeLog-pr-5711.yml
deleted file mode 100644
index 637e4770ca..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5711.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - rscadd: "Plain hamburgers may now spawn as steamed hams with a very low chance."
diff --git a/html/changelogs/AutoChangeLog-pr-5713.yml b/html/changelogs/AutoChangeLog-pr-5713.yml
deleted file mode 100644
index 372798d263..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5713.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Robustin"
-delete-after: True
-changes:
- - bugfix: "Twisted Construction will now consume ALL available plasteel in a stack."
- - bugfix: "Runes will no longer count the original invoker more than once."
diff --git a/html/changelogs/AutoChangeLog-pr-5714.yml b/html/changelogs/AutoChangeLog-pr-5714.yml
deleted file mode 100644
index 3aea8b539a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5714.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MMMiracles"
-delete-after: True
-changes:
- - rscadd: "Added tinfoil hats, headgear that can help protect against government conspiracies and extra-terrestrials. Found in hacked autolathes."
diff --git a/html/changelogs/AutoChangeLog-pr-5717.yml b/html/changelogs/AutoChangeLog-pr-5717.yml
deleted file mode 100644
index 83cda7c017..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5717.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "Robustin"
-delete-after: True
-changes:
- - bugfix: "The heart attack event will now actually make the victim acquire the heart disease"
- - bugfix: "Clicking the chatbox link will let you orbit the victim"
- - tweak: "The event is now significantly more sensitive to junk food. Recent consumption of multiple junk food items will triple your chances of having a heart attack (exercise will still block it)."
diff --git a/html/changelogs/AutoChangeLog-pr-5719.yml b/html/changelogs/AutoChangeLog-pr-5719.yml
deleted file mode 100644
index ac7d4e09a5..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5719.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Iamgoofball"
-delete-after: True
-changes:
- - rscadd: "Look sir, free crabs!"
diff --git a/html/changelogs/AutoChangeLog-pr-5720.yml b/html/changelogs/AutoChangeLog-pr-5720.yml
deleted file mode 100644
index 5a97f1e8d4..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5720.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "selea"
-delete-after: True
-changes:
- - bugfix: "fixed floorbot"
- - bugfix: "fixed cleanbot"
- - refactor: "improved pathiding in case of given minimal distance;improved sanitation"
diff --git a/html/changelogs/AutoChangeLog-pr-5722.yml b/html/changelogs/AutoChangeLog-pr-5722.yml
new file mode 100644
index 0000000000..e3f570caa2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5722.yml
@@ -0,0 +1,6 @@
+author: "Poojawa"
+delete-after: True
+changes:
+ - rscadd: "Hypospray mk IIs are being deployed to stations, these should provide an easier time for medical staff! They come with both inject and spray modes! Spray mode acts like a patch for applying meds"
+ - soundadd: "Hyposprays are fancy, you'll know when they're being used."
+ - server: "Due to fucky-ness, you'll need to unload, then reload the hypos at least once. just how it be."
diff --git a/html/changelogs/AutoChangeLog-pr-5723.yml b/html/changelogs/AutoChangeLog-pr-5723.yml
deleted file mode 100644
index f1a0c512c1..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5723.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Astral"
-delete-after: True
-changes:
- - rscadd: "blood cultists can now use a nar nar plushie as an extra invoker for runes!"
diff --git a/html/changelogs/AutoChangeLog-pr-5726.yml b/html/changelogs/AutoChangeLog-pr-5726.yml
deleted file mode 100644
index 5119596f74..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5726.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Poojawa"
-delete-after: True
-changes:
- - rscadd: "Tesla Corona Analyzers! Study the seemingly magic Edison's Bane for supplemental research points!"
diff --git a/html/changelogs/AutoChangeLog-pr-5727.yml b/html/changelogs/AutoChangeLog-pr-5727.yml
deleted file mode 100644
index dc916865b0..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5727.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "RealDonaldTrump"
-delete-after: True
-changes:
- - tweak: "Removed the probability check from prayer beads for their low amount of healing, as well as lowering the time needed to heal from 15 seconds to 10 seconds. Slimepeople won't get harmed by prayer beads either."
diff --git a/html/changelogs/AutoChangeLog-pr-5729.yml b/html/changelogs/AutoChangeLog-pr-5729.yml
deleted file mode 100644
index 8f579124be..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5729.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Naksu"
-delete-after: True
-changes:
- - rscdel: "SNPCs have been removed."
diff --git a/html/changelogs/AutoChangeLog-pr-5730.yml b/html/changelogs/AutoChangeLog-pr-5730.yml
deleted file mode 100644
index 5483366e13..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5730.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "XDTM"
-delete-after: True
-changes:
- - tweak: "Bath Salts now induce psychotic rage, but cause much more brain damage."
diff --git a/html/changelogs/AutoChangeLog-pr-5733.yml b/html/changelogs/AutoChangeLog-pr-5733.yml
deleted file mode 100644
index 26cb19420a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5733.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Dax Dupont"
-delete-after: True
-changes:
- - rscadd: "Medals now show the commendation text in the description."
diff --git a/html/changelogs/AutoChangeLog-pr-5734.yml b/html/changelogs/AutoChangeLog-pr-5734.yml
deleted file mode 100644
index 7107a79eea..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5734.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Poojawa"
-delete-after: True
-changes:
- - bugfix: "Cyborg defib units are now actually functional"
diff --git a/html/changelogs/AutoChangeLog-pr-5787.yml b/html/changelogs/AutoChangeLog-pr-5787.yml
new file mode 100644
index 0000000000..6b44ee591e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5787.yml
@@ -0,0 +1,6 @@
+author: "Poojawa"
+delete-after: True
+changes:
+ - rscadd: "Tesla Engines are now standard on all but Omega."
+ - bugfix: "fixed a pipe in Meta station that wasn't connected properly."
+ - bugfix: "fixed an exploit related to Tesla wires."
diff --git a/html/changelogs/AutoChangeLog-pr-5788.yml b/html/changelogs/AutoChangeLog-pr-5788.yml
new file mode 100644
index 0000000000..2f5d1bdd2d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5788.yml
@@ -0,0 +1,4 @@
+author: "Naksu"
+delete-after: True
+changes:
+ - code_imp: "First pass on cleaning up junk defines and unused code"
diff --git a/html/changelogs/AutoChangeLog-pr-5789.yml b/html/changelogs/AutoChangeLog-pr-5789.yml
new file mode 100644
index 0000000000..aef3f8ad01
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5789.yml
@@ -0,0 +1,12 @@
+author: "Poojawa"
+delete-after: True
+changes:
+ - rscadd: "Added release sound effects for choosing. If having a non-belly, belly."
+ - rscadd: "Added a 'silent' modifier to bellies."
+ - rscadd: "Added a vore subsystem to handle belly processing, should be less clunky"
+ - balance: "rebalanced heal mode and dragon digestion."
+ - soundadd: "added client preference based sound toggles to both eating/release/struggle and digestion noises seperately."
+ - refactor: "vore prefs save to JSON now instead of .sav. much easier really.
+refractor: dragon vore is working, though with this game who knows."
+ - server: "your prefs should automatically transfer, but it's likely you'll lose pre-loaded bellies, BACK UP EVERYTHING. (you should be doing this anyway too)"
+ - server: "Creating new characters will import the previous' bellies. but once you click 'save' they'll make the new JSON file will all the info. This is per slot, so if you change your character, you'll have to change belly stuff."
diff --git a/html/changelogs/AutoChangeLog-pr-5803.yml b/html/changelogs/AutoChangeLog-pr-5803.yml
new file mode 100644
index 0000000000..39ecfb7c9d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5803.yml
@@ -0,0 +1,6 @@
+author: "Denton"
+delete-after: True
+changes:
+ - bugfix: "Pubbystation: Added a missing APC to the cargo sorting room, a light fixture to the RnD security checkpoint and removed an overlooked firelock east of the bridge."
+ - rscadd: "Pubbystation: Added a spare RPD to the Atmospherics department. Replaced Engineering's outdated meson goggles with modern engineering scanners. Added a GPS device to the secure storage crate."
+ - tweak: "Moved Pubbystation's drone shell dispenser from the experimentation lab to Robotics maint."
diff --git a/html/changelogs/AutoChangeLog-pr-5806.yml b/html/changelogs/AutoChangeLog-pr-5806.yml
new file mode 100644
index 0000000000..c21932b1cb
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5806.yml
@@ -0,0 +1,4 @@
+author: "Jittai / ChuckTheSheep"
+delete-after: True
+changes:
+ - tweak: "Adjusted the space parallax's contrast to be less vibrant."
diff --git a/html/changelogs/AutoChangeLog-pr-5815.yml b/html/changelogs/AutoChangeLog-pr-5815.yml
new file mode 100644
index 0000000000..5054ef2a97
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5815.yml
@@ -0,0 +1,4 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - rscadd: "Added a new mini antagonist, the sentient disease."
diff --git a/html/changelogs/AutoChangeLog-pr-5817.yml b/html/changelogs/AutoChangeLog-pr-5817.yml
new file mode 100644
index 0000000000..d8422bca42
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5817.yml
@@ -0,0 +1,4 @@
+author: "ZeroNetAlpha"
+delete-after: True
+changes:
+ - tweak: "Tweaked Aquatic Species to give fillets when run through the chef's gibber."
diff --git a/html/changelogs/AutoChangeLog-pr-5821.yml b/html/changelogs/AutoChangeLog-pr-5821.yml
new file mode 100644
index 0000000000..86c02f0379
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5821.yml
@@ -0,0 +1,4 @@
+author: "selea"
+delete-after: True
+changes:
+ - bugfix: "After several months of natural selection, hostile mobs started to attack assemblies with combat circuits."
diff --git a/html/changelogs/AutoChangeLog-pr-5822.yml b/html/changelogs/AutoChangeLog-pr-5822.yml
new file mode 100644
index 0000000000..7592b0a1dd
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5822.yml
@@ -0,0 +1,4 @@
+author: "deathride58"
+delete-after: True
+changes:
+ - bugfix: "Widescreen pref works again."
diff --git a/html/changelogs/AutoChangeLog-pr-5825.yml b/html/changelogs/AutoChangeLog-pr-5825.yml
new file mode 100644
index 0000000000..d16ba7b816
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5825.yml
@@ -0,0 +1,4 @@
+author: "Naksu"
+delete-after: True
+changes:
+ - admin: "Admins can now easily spawn mobs that look like objects. Googly eyes optional!"
diff --git a/html/changelogs/AutoChangeLog-pr-5827.yml b/html/changelogs/AutoChangeLog-pr-5827.yml
new file mode 100644
index 0000000000..6a7fc6dba0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5827.yml
@@ -0,0 +1,4 @@
+author: "Anonymous"
+delete-after: True
+changes:
+ - rscadd: "Adds nymphomania trait, which will raise your minimal arousal and boost rate of it."
diff --git a/html/changelogs/AutoChangeLog-pr-5828.yml b/html/changelogs/AutoChangeLog-pr-5828.yml
new file mode 100644
index 0000000000..121f22e488
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5828.yml
@@ -0,0 +1,8 @@
+author: "Poojawa"
+delete-after: True
+changes:
+ - rscdel: "Removed old things in .dms we weren't using anymore"
+ - tweak: "subtle messages are now italic'd, so there's better context on whispering"
+ - tweak: "broke apart the cit_gun.dm file, they're decently spaced out now"
+ - tweak: "dogborg_sleeper is now standalone from dogborg_equipment because too lazy to debug why it was breaking backpacks."
+ - tweak: "does that thing I've been meaning to do with Xenobio. additional tools have been provided."
diff --git a/html/changelogs/AutoChangeLog-pr-5830.yml b/html/changelogs/AutoChangeLog-pr-5830.yml
new file mode 100644
index 0000000000..49b495e7e2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5830.yml
@@ -0,0 +1,5 @@
+author: "ZeroNetAlpha"
+delete-after: True
+changes:
+ - tweak: "Makes all darts deletable with nothing more than a little space cleaner."
+ - tweak: "Makes in-flight foam darts dissolve when hit with space cleaner, be it foam, smoke, or a janitor being a badass with a spraybottle."
diff --git a/html/changelogs/AutoChangeLog-pr-5843.yml b/html/changelogs/AutoChangeLog-pr-5843.yml
new file mode 100644
index 0000000000..6916b09b7f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5843.yml
@@ -0,0 +1,4 @@
+author: "Poojawa"
+delete-after: True
+changes:
+ - rscadd: "Added new trek uniforms to loadouts!"
diff --git a/html/changelogs/AutoChangeLog-pr-5846.yml b/html/changelogs/AutoChangeLog-pr-5846.yml
new file mode 100644
index 0000000000..37ec3fd75c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5846.yml
@@ -0,0 +1,4 @@
+author: "MMMiracles"
+delete-after: True
+changes:
+ - tweak: "Thirteen Loko now has an overdose threshold of 60u, see your local CMO for potential side-effects."
diff --git a/html/changelogs/AutoChangeLog-pr-5850.yml b/html/changelogs/AutoChangeLog-pr-5850.yml
new file mode 100644
index 0000000000..832dfa320f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5850.yml
@@ -0,0 +1,7 @@
+author: "Dax Dupont"
+delete-after: True
+changes:
+ - rscadd: "Beacons can now be toggled on and off."
+ - rscadd: "Mappers can now have beacons that default to off. Useful for ruins!"
+ - tweak: "Renaming replaces the snowflake locator frequency/code"
+ - refactor: "Beacons are no longer radios. Why were they radios in the first place? I don't know."
diff --git a/html/changelogs/AutoChangeLog-pr-5851.yml b/html/changelogs/AutoChangeLog-pr-5851.yml
new file mode 100644
index 0000000000..0970cb6464
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5851.yml
@@ -0,0 +1,4 @@
+author: "Cebutris"
+delete-after: True
+changes:
+ - spellcheck: "lithenessk -> litheness"
diff --git a/html/changelogs/AutoChangeLog-pr-5853.yml b/html/changelogs/AutoChangeLog-pr-5853.yml
new file mode 100644
index 0000000000..e3b8223b44
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5853.yml
@@ -0,0 +1,9 @@
+author: "Floyd / Qustinnus (Sprites by Ausops, Some moodlets by Ike709)"
+delete-after: True
+changes:
+ - rscadd: "Adds mood, which can be found by clicking on the face icon on your screen."
+ - rscadd: "Adds various moodlets which affect your mood. Try eating your favourite food, playing an arcade game, reading a book, or petting a doggo to increase your moo. Also be sure to take care of your hunger on a regular basis, like always."
+ - rscadd: "Adds config option to disable/enable mood."
+ - rscadd: "Indoor area's now have a beauty var defined by the amount of cleanables in them, (We can later expand this to something like rimworld, where structures could make rooms more beautiful). These also affect mood. (Janitor now has gameplay purpose besides slipping and removing useless decals)
+remove: Removes hunger slowdown, replacing it with slowdown by being depressed"
+ - imageadd: "Icons for mood states and depression states"
diff --git a/html/changelogs/AutoChangeLog-pr-5857.yml b/html/changelogs/AutoChangeLog-pr-5857.yml
new file mode 100644
index 0000000000..c0319c5409
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5857.yml
@@ -0,0 +1,7 @@
+author: "ACCount"
+delete-after: True
+changes:
+ - rscadd: "Station airlocks now support NTNet remote control. Door remotes now use NTNet."
+ - rscadd: "Don't worry, any non-public airlock is fully protected from unauthorized control attempts by NTNet PassKey system!"
+ - rscadd: "New integrated circuit component: card reader. Use it to read PassKeys from ID cards."
+ - bugfix: "Fixes a delay issue when airlocks are being opened/closed by signalers."
diff --git a/html/changelogs/AutoChangeLog-pr-5858.yml b/html/changelogs/AutoChangeLog-pr-5858.yml
new file mode 100644
index 0000000000..9be53f10fb
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5858.yml
@@ -0,0 +1,4 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - rscadd: "Sentient diseases now get two minutes to select an initial host before being assigned a random one."
diff --git a/html/changelogs/AutoChangeLog-pr-5861.yml b/html/changelogs/AutoChangeLog-pr-5861.yml
new file mode 100644
index 0000000000..c92e23329c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5861.yml
@@ -0,0 +1,4 @@
+author: "Astral"
+delete-after: True
+changes:
+ - bugfix: "Lighting fixtures should no longer be visible in camera-less areas by cameras."
diff --git a/html/changelogs/AutoChangeLog-pr-5863.yml b/html/changelogs/AutoChangeLog-pr-5863.yml
new file mode 100644
index 0000000000..f59dbe3279
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5863.yml
@@ -0,0 +1,6 @@
+author: "Dax Dupont"
+delete-after: True
+changes:
+ - rscadd: "Display cases can now have a list where to randomly spawn items from."
+ - refactor: "Moved plaque code to main type."
+ - refactor: "Statues now use default unwrench and the tool interaction is now completely non existent when no deconstruct flag is available."
diff --git a/html/changelogs/AutoChangeLog-pr-5864.yml b/html/changelogs/AutoChangeLog-pr-5864.yml
new file mode 100644
index 0000000000..2e26e19478
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5864.yml
@@ -0,0 +1,8 @@
+author: "Robustin"
+delete-after: True
+changes:
+ - balance: "Harvesters now have 40hp, from 60."
+ - tweak: "The nuke will now detonate 2 minutes after Nar'sie is summoned, down from 2.5 minutes"
+ - tweak: "The \"ARM\" ending now requires 75% of the remaining souls aboard to be sacrificed before the nuke goes off, up from 60%."
+ - bugfix: "Drones can no longer be on the sacrifice list"
+ - bugfix: "Bloodsense will now show the true name of the target"
diff --git a/html/changelogs/AutoChangeLog-pr-5871.yml b/html/changelogs/AutoChangeLog-pr-5871.yml
new file mode 100644
index 0000000000..3d9c42ed5a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5871.yml
@@ -0,0 +1,5 @@
+author: "Naksu"
+delete-after: True
+changes:
+ - tweak: "The smoke machine can now be deconstructed using a screwdriver and a crowbar"
+ - code_imp: "The smoke machine no longer calls update_icon every process()"
diff --git a/html/changelogs/AutoChangeLog-pr-5872.yml b/html/changelogs/AutoChangeLog-pr-5872.yml
new file mode 100644
index 0000000000..0615c7222c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5872.yml
@@ -0,0 +1,4 @@
+author: "Naksu"
+delete-after: True
+changes:
+ - balance: "The white ship and miscellaneous caravan ships lose their advanced place-anywhere shuttle movement during war ops."
diff --git a/html/changelogs/AutoChangeLog-pr-5873.yml b/html/changelogs/AutoChangeLog-pr-5873.yml
new file mode 100644
index 0000000000..fb14c54aa6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5873.yml
@@ -0,0 +1,4 @@
+author: "Mark9013100"
+delete-after: True
+changes:
+ - rscadd: "Pill bottles can now be produced in the autolathe."
diff --git a/html/changelogs/AutoChangeLog-pr-5880.yml b/html/changelogs/AutoChangeLog-pr-5880.yml
new file mode 100644
index 0000000000..4f1b0ce0ec
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5880.yml
@@ -0,0 +1,4 @@
+author: "ninjanomnom"
+delete-after: True
+changes:
+ - bugfix: "Blowing up the wrong part of the shuttle should no longer result in the shuttle being permanently broken."
diff --git a/html/changelogs/AutoChangeLog-pr-5881.yml b/html/changelogs/AutoChangeLog-pr-5881.yml
new file mode 100644
index 0000000000..4aea27c4e0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5881.yml
@@ -0,0 +1,4 @@
+author: "Naksu"
+delete-after: True
+changes:
+ - rscdel: "The smoke machine can no longer be found in chemistry departments, instead it must be constructed manually. The board was added to techwebs earlier."
diff --git a/html/changelogs/AutoChangeLog-pr-5882.yml b/html/changelogs/AutoChangeLog-pr-5882.yml
new file mode 100644
index 0000000000..ada0ba952c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5882.yml
@@ -0,0 +1,4 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - rscadd: "Oh hey guys, RND shows correct material values now, don't hurt me!"
diff --git a/html/changelogs/AutoChangeLog-pr-5887.yml b/html/changelogs/AutoChangeLog-pr-5887.yml
new file mode 100644
index 0000000000..f9e8bcae27
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5887.yml
@@ -0,0 +1,4 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - bugfix: "Dead bodies no longer freak out about phobias"
diff --git a/html/changelogs/AutoChangeLog-pr-5888.yml b/html/changelogs/AutoChangeLog-pr-5888.yml
new file mode 100644
index 0000000000..57ce9196c9
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5888.yml
@@ -0,0 +1,4 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - rscadd: "Turrets can be set to shoot personnel without loyalty implants"
diff --git a/html/changelogs/AutoChangeLog-pr-5889.yml b/html/changelogs/AutoChangeLog-pr-5889.yml
new file mode 100644
index 0000000000..411f8d85fa
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5889.yml
@@ -0,0 +1,4 @@
+author: "Astral"
+delete-after: True
+changes:
+ - bugfix: "Constructed turbines will now properly connect to the powernet"
diff --git a/html/changelogs/AutoChangeLog-pr-5890.yml b/html/changelogs/AutoChangeLog-pr-5890.yml
new file mode 100644
index 0000000000..848e273808
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5890.yml
@@ -0,0 +1,5 @@
+author: "Denton"
+delete-after: True
+changes:
+ - rscadd: "Engi-Vend machines now have welding goggles available."
+ - tweak: "Grouped Nano-Med/Engi-Vend items by category."
diff --git a/html/changelogs/AutoChangeLog-pr-5891.yml b/html/changelogs/AutoChangeLog-pr-5891.yml
new file mode 100644
index 0000000000..55dc2fc13b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5891.yml
@@ -0,0 +1,4 @@
+author: "XDTM"
+delete-after: True
+changes:
+ - rscadd: "You can now place people on tables on Help Intent. Doing so takes a few seconds and makes the target Rest, instead of stunning them."
diff --git a/html/changelogs/AutoChangeLog-pr-5892.yml b/html/changelogs/AutoChangeLog-pr-5892.yml
new file mode 100644
index 0000000000..a6e882d262
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5892.yml
@@ -0,0 +1,5 @@
+author: "The Dreamweaver (Sprites: Onule)"
+delete-after: True
+changes:
+ - rscdel: "Nanotrasen's Lavaland research team has discovered that the alien brain has disappeared from necropolis chests."
+ - rscadd: "In it's place they have discovered a new artifact, the Rod of Asclepius, a strange rod with a magnitude of healing properties, and an even higher magnitude of responsibility..."
diff --git a/html/changelogs/AutoChangeLog-pr-5895.yml b/html/changelogs/AutoChangeLog-pr-5895.yml
new file mode 100644
index 0000000000..998bd2c206
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5895.yml
@@ -0,0 +1,4 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - tweak: "Added wall safes to Deltastation's HoP and Captain's offices."
diff --git a/html/changelogs/AutoChangeLog-pr-5896.yml b/html/changelogs/AutoChangeLog-pr-5896.yml
new file mode 100644
index 0000000000..7b9d78d60f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5896.yml
@@ -0,0 +1,5 @@
+author: "Xhuis"
+delete-after: True
+changes:
+ - bugfix: "Circuit slow-cloning no longer breaks with some circuits."
+ - code_imp: "Circuit slow-cloning is now cleaner."
diff --git a/html/changelogs/AutoChangeLog-pr-5899.yml b/html/changelogs/AutoChangeLog-pr-5899.yml
new file mode 100644
index 0000000000..0d28d7e89b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5899.yml
@@ -0,0 +1,4 @@
+author: "Cobby"
+delete-after: True
+changes:
+ - tweak: "The Eminence scoffs at your \"consecrated\" tiles once the Justicar is freed from his imprisonment."
diff --git a/html/changelogs/AutoChangeLog-pr-5900.yml b/html/changelogs/AutoChangeLog-pr-5900.yml
new file mode 100644
index 0000000000..90238368d0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5900.yml
@@ -0,0 +1,4 @@
+author: "ninjanomnom"
+delete-after: True
+changes:
+ - admin: "The debug message for generic shuttle errors is improved a little"
diff --git a/html/changelogs/AutoChangeLog-pr-5908.yml b/html/changelogs/AutoChangeLog-pr-5908.yml
new file mode 100644
index 0000000000..bcf78a9b89
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5908.yml
@@ -0,0 +1,4 @@
+author: "checkraisefold"
+delete-after: True
+changes:
+ - bugfix: "Nukeops properly checks the required amount of enemies for the gamemode! This should fix downstream problems."
diff --git a/html/changelogs/AutoChangeLog-pr-5909.yml b/html/changelogs/AutoChangeLog-pr-5909.yml
new file mode 100644
index 0000000000..ae1d0dcb05
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5909.yml
@@ -0,0 +1,4 @@
+author: "Denton"
+delete-after: True
+changes:
+ - tweak: "Various belts can now hold additional job-specific items."
diff --git a/html/changelogs/AutoChangeLog-pr-5911.yml b/html/changelogs/AutoChangeLog-pr-5911.yml
new file mode 100644
index 0000000000..2a8128761f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5911.yml
@@ -0,0 +1,7 @@
+author: "Toriate"
+delete-after: True
+changes:
+ - rscadd: "Added ammo counters for RCDs"
+ - rscadd: "Added actual flashing yellow light for RCDs"
+ - imageadd: "added new RCD sprites including inhands"
+ - imagedel: "deleted old RCD iconstate, but not the inhands"
diff --git a/html/changelogs/AutoChangeLog-pr-5912.yml b/html/changelogs/AutoChangeLog-pr-5912.yml
new file mode 100644
index 0000000000..dfe252014f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5912.yml
@@ -0,0 +1,4 @@
+author: "Naksu"
+delete-after: True
+changes:
+ - bugfix: "internet sounds can be stopped again"
diff --git a/html/changelogs/AutoChangeLog-pr-5913.yml b/html/changelogs/AutoChangeLog-pr-5913.yml
new file mode 100644
index 0000000000..96c102aefa
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5913.yml
@@ -0,0 +1,12 @@
+author: "Robustin"
+delete-after: True
+changes:
+ - bugfix: "One-man conversions are actually fixed this time - excess chanters var removed for a more readable and maintainable rune code."
+ - bugfix: "Runes should no longer become GIANT if spammed (credit to Joan for this fix)."
+ - bugfix: "Pylons are no longer a source of infinite rods."
+ - tweak: "Attempting conversion without 2 cultists present will give a more helpful warning."
+ - tweak: "You can no longer convert braindead individuals."
+ - balance: "Cult doors will no longer lose power but also cannot shock people, brittle cult doors have 30 less integrity. Therefore ordinary crew can now beat cult airlocks open without frying themselves."
+ - balance: "Blood magic now costs slightly more blood and takes slightly more time, the stun spell now stuns for 2 less seconds, twisted construction now costs 10 health, and the blood rite relics (halberd, bolts, beam) are all 50-100 charges cheaper."
+ - balance: "The deconversion time for holy water is slightly reduced, 10 units and 45 seconds (give or take), is all you should need now. Blood cultists can now have seizures while afflicted with holy water."
+ - balance: "Shades are now slower and have a modest reduction to their damage and health."
diff --git a/html/changelogs/AutoChangeLog-pr-5914.yml b/html/changelogs/AutoChangeLog-pr-5914.yml
new file mode 100644
index 0000000000..dfdc937f9b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5914.yml
@@ -0,0 +1,4 @@
+author: "Naksu"
+delete-after: True
+changes:
+ - balance: "The space cleaner spray bottle is now much more efficient and uses much less space cleaner per spray. The amount of cleaner it can hold has been adjusted to compensate."
diff --git a/html/changelogs/AutoChangeLog-pr-5915.yml b/html/changelogs/AutoChangeLog-pr-5915.yml
new file mode 100644
index 0000000000..7cc5fb3dfa
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5915.yml
@@ -0,0 +1,4 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - tweak: "The Clockwork Justicar has decided to be merciful, and allow nonbelievers to anchor their petty machines in his city. It's only fair for them to have a fighting chance, after all."
diff --git a/html/changelogs/AutoChangeLog-pr-5916.yml b/html/changelogs/AutoChangeLog-pr-5916.yml
new file mode 100644
index 0000000000..4f400aeea0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5916.yml
@@ -0,0 +1,4 @@
+author: "Onule"
+delete-after: True
+changes:
+ - tweak: "Mining drones have been given a visual makeover!"
diff --git a/html/changelogs/AutoChangeLog-pr-5917.yml b/html/changelogs/AutoChangeLog-pr-5917.yml
new file mode 100644
index 0000000000..425938df34
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5917.yml
@@ -0,0 +1,4 @@
+author: "MrDoomBringer"
+delete-after: True
+changes:
+ - rscadd: "Orderable supplies in cargo now all have descriptions! The station's overall FLAVORFUL_TEXT stat has gone up by nearly 2% as a result."
diff --git a/html/changelogs/AutoChangeLog-pr-5918.yml b/html/changelogs/AutoChangeLog-pr-5918.yml
new file mode 100644
index 0000000000..0ee0b8d218
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5918.yml
@@ -0,0 +1,4 @@
+author: "JJRcop"
+delete-after: True
+changes:
+ - bugfix: "Sanity checks for Play Internet Sound"
diff --git a/html/changelogs/AutoChangeLog-pr-5920.yml b/html/changelogs/AutoChangeLog-pr-5920.yml
new file mode 100644
index 0000000000..cc2a6e72dc
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5920.yml
@@ -0,0 +1,4 @@
+author: "Xhuis"
+delete-after: True
+changes:
+ - rscadd: "The Nanotrasen Meteorology Division has identified the aurora caelus in your sector. If you are lucky, you may get a chance to witness it with your own eyes."
diff --git a/html/changelogs/AutoChangeLog-pr-5921.yml b/html/changelogs/AutoChangeLog-pr-5921.yml
new file mode 100644
index 0000000000..404a00d2bf
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5921.yml
@@ -0,0 +1,4 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - bugfix: "Fixed pacifists from being able to fire mech weapons"
diff --git a/html/changelogs/AutoChangeLog-pr-5922.yml b/html/changelogs/AutoChangeLog-pr-5922.yml
new file mode 100644
index 0000000000..13f274bae1
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5922.yml
@@ -0,0 +1,4 @@
+author: "ninjanomnom"
+delete-after: True
+changes:
+ - bugfix: "Custom shuttles being too close to the map edge was causing problems, you must now be at least 10 tiles away."
diff --git a/html/changelogs/AutoChangeLog-pr-5924.yml b/html/changelogs/AutoChangeLog-pr-5924.yml
new file mode 100644
index 0000000000..7ee12ffc92
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5924.yml
@@ -0,0 +1,4 @@
+author: "Naksu"
+delete-after: True
+changes:
+ - admin: "ERT creation has been refactored to allow for easier customization and deployment via templates and settings"
diff --git a/html/changelogs/AutoChangeLog-pr-5925.yml b/html/changelogs/AutoChangeLog-pr-5925.yml
new file mode 100644
index 0000000000..84da455954
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5925.yml
@@ -0,0 +1,4 @@
+author: "Polyphynx"
+delete-after: True
+changes:
+ - tweak: "Medical sprays can now be stored in medical belts and smartfridges."
diff --git a/html/padlock.png b/html/padlock.png
new file mode 100644
index 0000000000..c09b95bf51
Binary files /dev/null and b/html/padlock.png differ
diff --git a/icons/effects/parallax.dmi b/icons/effects/parallax.dmi
index b7a003d1bb..181b76007d 100755
Binary files a/icons/effects/parallax.dmi and b/icons/effects/parallax.dmi differ
diff --git a/icons/mob/actions/actions_minor_antag.dmi b/icons/mob/actions/actions_minor_antag.dmi
index 4e5806f2fb..20daacd32c 100644
Binary files a/icons/mob/actions/actions_minor_antag.dmi and b/icons/mob/actions/actions_minor_antag.dmi differ
diff --git a/icons/mob/actions/actions_slime.dmi b/icons/mob/actions/actions_slime.dmi
index 23fd6e3e8a..acf7a31c6e 100644
Binary files a/icons/mob/actions/actions_slime.dmi and b/icons/mob/actions/actions_slime.dmi differ
diff --git a/icons/mob/aibots.dmi b/icons/mob/aibots.dmi
index e02778dfc8..74137e8947 100644
Binary files a/icons/mob/aibots.dmi and b/icons/mob/aibots.dmi differ
diff --git a/icons/mob/citadel_refs/borg HUDs.dmi b/icons/mob/citadel_refs/borg HUDs.dmi
new file mode 100644
index 0000000000..bcbfcc1dc2
Binary files /dev/null and b/icons/mob/citadel_refs/borg HUDs.dmi differ
diff --git a/icons/mob/citadel_refs/dogborg animations.dmi b/icons/mob/citadel_refs/dogborg animations.dmi
new file mode 100644
index 0000000000..98c060f323
Binary files /dev/null and b/icons/mob/citadel_refs/dogborg animations.dmi differ
diff --git a/icons/mob/citadel_refs/widerobot_vr.dmi b/icons/mob/citadel_refs/widerobot_vr.dmi
new file mode 100644
index 0000000000..fa7285ae4c
Binary files /dev/null and b/icons/mob/citadel_refs/widerobot_vr.dmi differ
diff --git a/icons/mob/custom_w.dmi b/icons/mob/custom_w.dmi
index 8a93893b81..bda9dcea61 100644
Binary files a/icons/mob/custom_w.dmi and b/icons/mob/custom_w.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index d180eb445c..8f27d8b3bb 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi
index c275e66752..c27834de5c 100644
Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ
diff --git a/icons/mob/inhands/equipment/tools_lefthand.dmi b/icons/mob/inhands/equipment/tools_lefthand.dmi
index 4f256eea92..5b497afe53 100644
Binary files a/icons/mob/inhands/equipment/tools_lefthand.dmi and b/icons/mob/inhands/equipment/tools_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/tools_righthand.dmi b/icons/mob/inhands/equipment/tools_righthand.dmi
index 4661d879c8..dbed4c43d2 100644
Binary files a/icons/mob/inhands/equipment/tools_righthand.dmi and b/icons/mob/inhands/equipment/tools_righthand.dmi differ
diff --git a/icons/mob/mutant_bodyparts.dmi b/icons/mob/mutant_bodyparts.dmi
index 25594b3283..19ebe0a4be 100644
Binary files a/icons/mob/mutant_bodyparts.dmi and b/icons/mob/mutant_bodyparts.dmi differ
diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi
index fd145092a7..b757c00145 100644
Binary files a/icons/mob/robots.dmi and b/icons/mob/robots.dmi differ
diff --git a/icons/mob/screen_cyborg.dmi b/icons/mob/screen_cyborg.dmi
index fc236ac7e2..25d02d69ce 100644
Binary files a/icons/mob/screen_cyborg.dmi and b/icons/mob/screen_cyborg.dmi differ
diff --git a/icons/mob/screen_full.dmi b/icons/mob/screen_full.dmi
index 76c3672627..502e9ad3f9 100644
Binary files a/icons/mob/screen_full.dmi and b/icons/mob/screen_full.dmi differ
diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi
index 5a088e451f..2c234e9894 100644
Binary files a/icons/mob/screen_gen.dmi and b/icons/mob/screen_gen.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index 241db46d08..a4b426ccd9 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/mob/widerobot.dmi b/icons/mob/widerobot.dmi
index 88ac16da24..81ec2ed86d 100644
Binary files a/icons/mob/widerobot.dmi and b/icons/mob/widerobot.dmi differ
diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi
index 367be13b3b..1022770acd 100644
Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ
diff --git a/icons/obj/citadel/hypospray.dmi b/icons/obj/citadel/hypospray.dmi
new file mode 100644
index 0000000000..f5e89227c7
Binary files /dev/null and b/icons/obj/citadel/hypospray.dmi differ
diff --git a/icons/obj/citadel/vial.dmi b/icons/obj/citadel/vial.dmi
new file mode 100644
index 0000000000..23bceb93b9
Binary files /dev/null and b/icons/obj/citadel/vial.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index e97dc22159..5e6e6e54d2 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index a494c1081c..de5f448ddd 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/custom.dmi b/icons/obj/custom.dmi
index 9564d6c184..8ed3bb4eca 100644
Binary files a/icons/obj/custom.dmi and b/icons/obj/custom.dmi differ
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index 2e7a9219aa..834f430a98 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/icons/obj/dice.dmi b/icons/obj/dice.dmi
index 0ca008e37e..1d6601aa31 100644
Binary files a/icons/obj/dice.dmi and b/icons/obj/dice.dmi differ
diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi
index cd15db0552..b3774b26ab 100644
Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ
diff --git a/icons/obj/grenade.dmi b/icons/obj/grenade.dmi
index 9be47e5ef2..c003cf238e 100644
Binary files a/icons/obj/grenade.dmi and b/icons/obj/grenade.dmi differ
diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/hydroponics/harvest.dmi
index 742c02985d..054aa47bbd 100644
Binary files a/icons/obj/hydroponics/harvest.dmi and b/icons/obj/hydroponics/harvest.dmi differ
diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi
index 2787cfd8e0..8e930e1ee7 100644
Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ
diff --git a/icons/obj/lavaland/artefacts.dmi b/icons/obj/lavaland/artefacts.dmi
index ce3030b6c5..829f8b9170 100644
Binary files a/icons/obj/lavaland/artefacts.dmi and b/icons/obj/lavaland/artefacts.dmi differ
diff --git a/icons/obj/radio.dmi b/icons/obj/radio.dmi
index a9e81da034..64642b8a6c 100644
Binary files a/icons/obj/radio.dmi and b/icons/obj/radio.dmi differ
diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi
index d4e6d62f60..897508fa8c 100644
Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ
diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi
index 7fa7bec604..1454d17a16 100644
Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ
diff --git a/interface/skin.dmf b/interface/skin.dmf
index 8a2b53f5f1..99850c34ba 100644
--- a/interface/skin.dmf
+++ b/interface/skin.dmf
@@ -68,27 +68,45 @@ window "mainwindow"
left = "mapwindow"
right = "infowindow"
is-vert = true
- splitter = 75
elem "input"
type = INPUT
- pos = 5,420
- size = 595x20
+ pos = 3,420
+ size = 517x20
anchor1 = 0,100
anchor2 = 100,100
- font-size = 10
background-color = #d3b5b5
is-default = true
+ border = sunken
saved-params = "command"
- elem "say"
+ elem "saybutton"
type = BUTTON
pos = 600,420
- size = 37x20
+ size = 40x20
anchor1 = 100,100
anchor2 = none
saved-params = "is-checked"
text = "Chat"
- command = ".winset \"say.is-checked=true ? input.command=\"!say \\\"\" : input.command=\""
- is-flat = true
+ command = ".winset \"saybutton.is-checked=true ? input.command=\"!say \\\"\" : input.command=\"\"saybutton.is-checked=true ? mebutton.is-checked=false\"\"saybutton.is-checked=true ? oocbutton.is-checked=false\""
+ button-type = pushbox
+ elem "oocbutton"
+ type = BUTTON
+ pos = 520,420
+ size = 40x20
+ anchor1 = 100,100
+ anchor2 = none
+ saved-params = "is-checked"
+ text = "OOC"
+ command = ".winset \"oocbutton.is-checked=true ? input.command=\"!ooc \\\"\" : input.command=\"\"oocbutton.is-checked=true ? mebutton.is-checked=false\"\"oocbutton.is-checked=true ? saybutton.is-checked=false\""
+ button-type = pushbox
+ elem "mebutton"
+ type = BUTTON
+ pos = 560,420
+ size = 40x20
+ anchor1 = 100,100
+ anchor2 = none
+ saved-params = "is-checked"
+ text = "Me"
+ command = ".winset \"mebutton.is-checked=true ? input.command=\"!me \\\"\" : input.command=\"\"mebutton.is-checked=true ? saybutton.is-checked=false\"\"mebutton.is-checked=true ? oocbutton.is-checked=false\""
button-type = pushbox
elem "asset_cache_browser"
type = BROWSER
@@ -249,3 +267,4 @@ window "statwindow"
anchor2 = 100,100
is-default = true
saved-params = ""
+
diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm
index e22c35a6c4..cdf6df2dab 100644
--- a/interface/stylesheet.dm
+++ b/interface/stylesheet.dm
@@ -81,6 +81,7 @@ h1.alert, h2.alert {color: #000000;}
.unconscious {color: #0000ff; font-weight: bold;}
.suicide {color: #ff5050; font-style: italic;}
.green {color: #03ff39;}
+.nicegreen {color: #14a833;}
.shadowling {color: #3b2769;}
.cult {color: #960000;}
.cultlarge {color: #960000; font-weight: bold; font-size: 3;}
diff --git a/modular_citadel/cit_medkits.dm b/modular_citadel/cit_medkits.dm
index 217c69f068..c01ba07573 100644
--- a/modular_citadel/cit_medkits.dm
+++ b/modular_citadel/cit_medkits.dm
@@ -1,7 +1,6 @@
//help I have no idea what I'm doing
/obj/item/storage/firstaid
- ..()
icon = 'modular_citadel/icons/firstaid.dmi'
/obj/item/storage/firstaid/Initialize(mapload)
@@ -9,7 +8,6 @@
icon_state = pick("[initial(icon_state)]","[initial(icon_state)]2","[initial(icon_state)]3","[initial(icon_state)]4")
/obj/item/storage/firstaid/fire
- ..()
icon_state = "burn"
/obj/item/storage/firstaid/fire/Initialize(mapload)
@@ -17,7 +15,6 @@
icon_state = pick("[initial(icon_state)]","[initial(icon_state)]2","[initial(icon_state)]3","[initial(icon_state)]4")
/obj/item/storage/firstaid/toxin
- ..()
icon_state = "toxin"
/obj/item/storage/firstaid/toxin/Initialize(mapload)
@@ -25,11 +22,9 @@
icon_state = pick("[initial(icon_state)]","[initial(icon_state)]2","[initial(icon_state)]3","[initial(icon_state)]4")
/obj/item/storage/firstaid/o2
- ..()
icon_state = "oxy"
/obj/item/storage/firstaid/tactical
- ..()
icon_state = "tactical"
/obj/item/storage/minifirstaid
diff --git a/modular_citadel/cit_screenshake.dm b/modular_citadel/cit_screenshake.dm
index 818f363902..5bb1f82c10 100644
--- a/modular_citadel/cit_screenshake.dm
+++ b/modular_citadel/cit_screenshake.dm
@@ -46,17 +46,17 @@
/obj/item/attack(mob/living/M, mob/living/user)
. = ..()
- if(force && force >=15)
+ if(force >= 15)
shake_camera(user, ((force - 10) * 0.01 + 1), ((force - 10) * 0.01))
if(M.client)
switch (M.client.prefs.damagescreenshake)
if (1)
shake_camera(M, ((force - 10) * 0.015 + 1), ((force - 10) * 0.015))
if (2)
- if (M.IsKnockdown())
+ if (!M.canmove)
shake_camera(M, ((force - 10) * 0.015 + 1), ((force - 10) * 0.015))
/obj/item/attack_obj(obj/O, mob/living/user)
. = ..()
- if(force && force >= 20)
+ if(force >= 20)
shake_camera(user, ((force - 15) * 0.01 + 1), ((force - 15) * 0.01))
diff --git a/modular_citadel/cit_turfs.dm b/modular_citadel/cit_turfs.dm
index 76b9a8f178..582552b83b 100644
--- a/modular_citadel/cit_turfs.dm
+++ b/modular_citadel/cit_turfs.dm
@@ -72,11 +72,6 @@ GLOBAL_LIST_INIT(turf_footstep_sounds, list(
. = ..()
CitDirtify(obj, oldloc)*/
-/mob/living/Move(atom/newloc, direct)
- . = ..()
- if(. && makesfootstepsounds)
- CitFootstep(newloc)
-
//Baystation-styled tile dirtification.
/turf/open/floor/proc/CitDirtify(atom/obj, atom/oldloc)
if(prob(50))
diff --git a/modular_citadel/code/__HELPERS/list2list.dm b/modular_citadel/code/__HELPERS/list2list.dm
new file mode 100644
index 0000000000..e812b3a1e9
--- /dev/null
+++ b/modular_citadel/code/__HELPERS/list2list.dm
@@ -0,0 +1,12 @@
+/proc/tg_ui_icon_to_cit_ui(ui_style)
+ switch(ui_style)
+ if('icons/mob/screen_plasmafire.dmi')
+ return 'modular_citadel/icons/ui/screen_plasmafire.dmi'
+ if('icons/mob/screen_slimecore.dmi')
+ return 'modular_citadel/icons/ui/screen_slimecore.dmi'
+ if('icons/mob/screen_operative.dmi')
+ return 'modular_citadel/icons/ui/screen_operative.dmi'
+ if('icons/mob/screen_clockwork.dmi')
+ return 'modular_citadel/icons/ui/screen_clockwork.dmi'
+ else
+ return 'modular_citadel/icons/ui/screen_midnight.dmi'
diff --git a/modular_citadel/code/_onclick/click.dm b/modular_citadel/code/_onclick/click.dm
new file mode 100644
index 0000000000..4746231c59
--- /dev/null
+++ b/modular_citadel/code/_onclick/click.dm
@@ -0,0 +1,74 @@
+/mob/proc/RightClickOn(atom/A, params) //mostly a copy-paste from ClickOn()
+ var/list/modifiers = params2list(params)
+ if(incapacitated(ignore_restraints = 1))
+ return
+
+ face_atom(A)
+
+ if(next_move > world.time) // in the year 2000...
+ return
+
+ if(!modifiers["catcher"] && A.IsObscured())
+ return
+
+ if(ismecha(loc))
+ var/obj/mecha/M = loc
+ return M.click_action(A,src,params)
+
+ if(restrained())
+ changeNext_move(CLICK_CD_HANDCUFFED) //Doing shit in cuffs shall be vey slow
+ RestrainedClickOn(A)
+ return
+
+ if(in_throw_mode)
+ throw_item(A)//todo: make it plausible to lightly toss items via right-click
+ return
+
+ var/obj/item/W = get_active_held_item()
+
+ if(W == A)
+ if(!W.rightclick_attack_self(src))
+ W.attack_self(src)
+ update_inv_hands()
+ return
+
+ //These are always reachable.
+ //User itself, current loc, and user inventory
+ if(DirectAccess(A))
+ if(W)
+ W.rightclick_melee_attack_chain(src, A, params)
+ else
+ if(ismob(A))
+ changeNext_move(CLICK_CD_MELEE)
+ if(!AltUnarmedAttack(A))
+ UnarmedAttack(A)
+ return
+
+ //Can't reach anything else in lockers or other weirdness
+ if(!loc.AllowClick())
+ return
+
+ //Standard reach turf to turf or reaching inside storage
+ if(CanReach(A,W))
+ if(W)
+ W.rightclick_melee_attack_chain(src, A, params)
+ else
+ if(ismob(A))
+ changeNext_move(CLICK_CD_MELEE)
+ if(!AltUnarmedAttack(A,1))
+ UnarmedAttack(A,1)
+ else
+ if(W)
+ if(!W.altafterattack(A, src, FALSE, params))
+ W.afterattack(A, src, FALSE, params)
+ else
+ if(!AltRangedAttack(A,params))
+ RangedAttack(A,params)
+
+/mob/proc/AltUnarmedAttack(atom/A, proximity_flag)
+ if(ismob(A))
+ changeNext_move(CLICK_CD_MELEE)
+ return FALSE
+
+/mob/proc/AltRangedAttack(atom/A, params)
+ return FALSE
diff --git a/modular_citadel/code/_onclick/hud/screen_objects.dm b/modular_citadel/code/_onclick/hud/screen_objects.dm
new file mode 100644
index 0000000000..5a193335f3
--- /dev/null
+++ b/modular_citadel/code/_onclick/hud/screen_objects.dm
@@ -0,0 +1,49 @@
+/obj/screen/mov_intent
+ icon = 'modular_citadel/icons/ui/screen_midnight.dmi'
+
+/obj/screen/sprintbutton
+ name = "toggle sprint"
+ icon = 'modular_citadel/icons/ui/screen_midnight.dmi'
+ icon_state = "act_sprint"
+ layer = ABOVE_HUD_LAYER - 0.1
+
+/obj/screen/sprintbutton/Click()
+ if(ishuman(usr))
+ var/mob/living/carbon/human/H = usr
+ H.togglesprint()
+
+/obj/screen/sprintbutton/proc/insert_witty_toggle_joke_here(mob/living/carbon/human/H)
+ if(!H)
+ return
+ if(H.sprinting)
+ icon_state = "act_sprint_on"
+ else
+ icon_state = "act_sprint"
+
+/obj/screen/restbutton
+ name = "rest"
+ icon = 'modular_citadel/icons/ui/screen_midnight.dmi'
+ icon_state = "rest"
+
+/obj/screen/restbutton/Click()
+ if(isliving(usr))
+ var/mob/living/theuser = usr
+ theuser.lay_down()
+
+/obj/screen/combattoggle
+ name = "toggle combat mode"
+ icon = 'modular_citadel/icons/ui/screen_midnight.dmi'
+ icon_state = "combat_off"
+
+/obj/screen/combattoggle/Click()
+ if(iscarbon(usr))
+ var/mob/living/carbon/C = usr
+ C.toggle_combat_mode()
+
+/obj/screen/combattoggle/proc/rebasetointerbay(mob/living/carbon/C)
+ if(!C)
+ return
+ if(C.combatmode)
+ icon_state = "combat"
+ else
+ icon_state = "combat_off"
diff --git a/modular_citadel/code/_onclick/hud/stamina.dm b/modular_citadel/code/_onclick/hud/stamina.dm
new file mode 100644
index 0000000000..72cd260f8a
--- /dev/null
+++ b/modular_citadel/code/_onclick/hud/stamina.dm
@@ -0,0 +1,73 @@
+/datum/hud/var/obj/screen/staminas/staminas
+/datum/hud/var/obj/screen/staminabuffer/staminabuffer
+
+/obj/screen/staminas
+ icon = 'modular_citadel/icons/ui/screen_gen.dmi'
+ name = "stamina"
+ icon_state = "stamina0"
+ screen_loc = ui_stamina
+ mouse_opacity = 0
+
+/mob/living/carbon/human/proc/staminahudamount()
+ if(stat == DEAD || recoveringstam)
+ return "staminacrit"
+ else
+ switch(hal_screwyhud)
+ if(1 to 2)
+ return "staminacrit"
+ if(5)
+ return "stamina0"
+ else
+ switch(100 - staminaloss)
+ if(100 to INFINITY)
+ return "stamina0"
+ if(80 to 100)
+ return "stamina1"
+ if(60 to 80)
+ return "stamina2"
+ if(40 to 60)
+ return "stamina3"
+ if(20 to 40)
+ return "stamina4"
+ if(0 to 20)
+ return "stamina5"
+ else
+ return "stamina6"
+
+//stam buffer
+/obj/screen/staminabuffer
+ icon = 'modular_citadel/icons/ui/screen_gen.dmi'
+ name = "stamina buffer"
+ icon_state = "stambuffer0"
+ screen_loc = ui_stamina
+ layer = ABOVE_HUD_LAYER + 0.1
+ mouse_opacity = 0
+
+/mob/living/carbon/human/proc/staminabufferhudamount()
+ if(stat == DEAD || recoveringstam)
+ return "stambuffer7"
+ else
+ switch(hal_screwyhud)
+ if(1 to 2)
+ return "stambuffer7"
+ if(5)
+ return "stambuffer0"
+ else
+ var/percentmult = 100/stambuffer
+ switch(stambuffer*percentmult - bufferedstam*percentmult)
+ if(95 to INFINITY)
+ return "stambuffer0"
+ if(90 to 95)
+ return "stambuffer1"
+ if(80 to 90)
+ return "stambuffer2"
+ if(60 to 80)
+ return "stambuffer3"
+ if(40 to 60)
+ return "stambuffer4"
+ if(20 to 40)
+ return "stambuffer5"
+ if(5 to 20)
+ return "stambuffer6"
+ else
+ return "stambuffer7"
diff --git a/modular_citadel/code/_onclick/item_attack.dm b/modular_citadel/code/_onclick/item_attack.dm
new file mode 100644
index 0000000000..b86ddc51be
--- /dev/null
+++ b/modular_citadel/code/_onclick/item_attack.dm
@@ -0,0 +1,25 @@
+/obj/item/proc/rightclick_melee_attack_chain(mob/user, atom/target, params)
+ if(!pre_altattackby(target, user, params)) //Hey, does this item have special behavior that should override all normal right-click functionality?
+ if(!target.altattackby(src, user, params)) //Does the target do anything special when we right-click on it?
+ melee_attack_chain(user, target, params) //Ugh. Lame! I'm filing a legal complaint about the discrimination against the right mouse button!
+ else
+ altafterattack(target, user, TRUE, params)
+ return
+
+/obj/item/proc/pre_altattackby(atom/A, mob/living/user, params)
+ return FALSE //return something other than false if you wanna override attacking completely
+
+/atom/proc/altattackby(obj/item/W, mob/user, params)
+ return FALSE //return something other than false if you wanna add special right-click behavior to objects.
+
+/obj/item/proc/rightclick_attack_self(mob/user)
+ return FALSE
+
+/obj/item/proc/altafterattack(atom/target, mob/user, proximity_flag, click_parameters)
+ return FALSE
+
+/obj/item/proc/getweight()
+ if(total_mass)
+ return total_mass
+ else
+ return w_class*1.25
diff --git a/modular_citadel/code/_onclick/other_mobs.dm b/modular_citadel/code/_onclick/other_mobs.dm
new file mode 100644
index 0000000000..51a5c6c5c3
--- /dev/null
+++ b/modular_citadel/code/_onclick/other_mobs.dm
@@ -0,0 +1,29 @@
+/mob/living/carbon/human/AltUnarmedAttack(atom/A, proximity)
+ if(!has_active_hand())
+ to_chat(src, "You look at the state of the universe and sigh. ") //lets face it, people rarely ever see this message in its intended condition.
+ return TRUE
+
+ if(!A.alt_attack_hand(src))
+ A.attack_hand(src)
+ return TRUE
+ return TRUE
+
+/mob/living/carbon/human/AltRangedAttack(atom/A, params)
+ if(!has_active_hand())
+ to_chat(src, "You ponder your life choices and sigh. ")
+ return TRUE
+
+ if(!incapacitated())
+ switch(a_intent)
+ if(INTENT_HELP)
+ visible_message("[src] waves to [A]. ", "You wave to [A]. ")
+ if(INTENT_DISARM)
+ visible_message("[src] shoos away [A]. ", "You shoo away [A]. ")
+ if(INTENT_GRAB)
+ visible_message("[src] beckons [A] to come. ", "You beckon [A] to come. ") //This sounds lewder than it actually is. Fuck.
+ if(INTENT_HARM)
+ visible_message("[src] shakes [p_their()] fist at [A]. ", "You shake your fist at [A]. ")
+ return TRUE
+
+/atom/proc/alt_attack_hand(mob/user)
+ return FALSE
diff --git a/modular_citadel/code/datums/status_effects/debuffs.dm b/modular_citadel/code/datums/status_effects/debuffs.dm
new file mode 100644
index 0000000000..37669fe94c
--- /dev/null
+++ b/modular_citadel/code/datums/status_effects/debuffs.dm
@@ -0,0 +1,13 @@
+/datum/status_effect/incapacitating/knockdown/on_creation(mob/living/new_owner, set_duration, updating_canmove)
+ if(iscarbon(new_owner) && isnum(set_duration))
+ new_owner.resting = TRUE
+ new_owner.adjustStaminaLoss(set_duration*0.25)
+ if(set_duration > 80)
+ set_duration = set_duration*0.15
+ . = ..()
+ return
+ else if(updating_canmove)
+ new_owner.update_canmove()
+ qdel(src)
+ else
+ . = ..()
diff --git a/modular_citadel/code/datums/traits/neutral.dm b/modular_citadel/code/datums/traits/neutral.dm
new file mode 100644
index 0000000000..2bb9c3a356
--- /dev/null
+++ b/modular_citadel/code/datums/traits/neutral.dm
@@ -0,0 +1,24 @@
+// Citadel-specific Neutral Traits
+
+/datum/trait/libido
+ name = "Nymphomania"
+ desc = "You're always feeling a bit in heat. Also, you get aroused faster than usual."
+ value = 0
+ gain_text = "You are feeling extra wild. "
+ lose_text = "You don't feel that burning sensation anymore. "
+
+/datum/trait/libido/add()
+ var/mob/living/M = trait_holder
+ M.min_arousal = 16
+ M.arousal_rate = 3
+
+/datum/trait/libido/remove()
+ var/mob/living/M = trait_holder
+ M.min_arousal = initial(M.min_arousal)
+ M.arousal_rate = initial(M.arousal_rate)
+
+/datum/trait/libido/on_process()
+ var/mob/living/M = trait_holder
+ if(M.canbearoused == FALSE)
+ to_chat(trait_holder, "Having high libido is useless when you can't feel arousal at all! ")
+ qdel(src)
diff --git a/code/citadel/icons/areas.dmi b/modular_citadel/code/game/area/areas.dmi
similarity index 100%
rename from code/citadel/icons/areas.dmi
rename to modular_citadel/code/game/area/areas.dmi
diff --git a/code/citadel/cit_areas.dm b/modular_citadel/code/game/area/cit_areas.dm
similarity index 70%
rename from code/citadel/cit_areas.dm
rename to modular_citadel/code/game/area/cit_areas.dm
index 42879b7408..ae36ed6df5 100644
--- a/code/citadel/cit_areas.dm
+++ b/modular_citadel/code/game/area/cit_areas.dm
@@ -1,6 +1,6 @@
/area/maintenance/bar
name = "Maintenance Bar"
- icon = 'code/citadel/icons/areas.dmi'
+ icon = 'modular_citadel/code/game/area/areas.dmi'
icon_state = "maintbar"
/area/maintenance/bar/cafe
@@ -14,5 +14,5 @@
/area/crew_quarters/cryopod
name = "Cryogenics"
- icon = 'code/citadel/icons/areas.dmi'
+ icon = 'modular_citadel/code/game/area/areas.dmi'
icon_state = "cryo"
\ No newline at end of file
diff --git a/modular_citadel/code/game/machinery/cryopod.dm b/modular_citadel/code/game/machinery/cryopod.dm
index 81d336bc98..6e57b0169d 100644
--- a/modular_citadel/code/game/machinery/cryopod.dm
+++ b/modular_citadel/code/game/machinery/cryopod.dm
@@ -396,7 +396,7 @@
if(target == user && world.time - target.client.cryo_warned > 5 * 600)//if we haven't warned them in the last 5 minutes
var/caught = FALSE
if(target.mind.assigned_role in GLOB.command_positions)
- alert("You're a Head of Staff![generic_plsnoleave_message] ")
+ alert("You're a Head of Staff![generic_plsnoleave_message] Be sure to put your locker items back into your locker! ")
caught = TRUE
if(iscultist(target) || is_servant_of_ratvar(target))
to_chat(target, "You're a Cultist![generic_plsnoleave_message] ")
diff --git a/code/citadel/cit_displaycases.dm b/modular_citadel/code/game/machinery/displaycases.dm
similarity index 100%
rename from code/citadel/cit_displaycases.dm
rename to modular_citadel/code/game/machinery/displaycases.dm
diff --git a/modular_citadel/code/game/machinery/firealarm.dm b/modular_citadel/code/game/machinery/firealarm.dm
new file mode 100644
index 0000000000..f4da844706
--- /dev/null
+++ b/modular_citadel/code/game/machinery/firealarm.dm
@@ -0,0 +1,10 @@
+/obj/machinery/firealarm/alt_attack_hand(mob/user)
+ if(is_interactable() && !user.stat)
+ var/area/A = get_area(src)
+ if(istype(A))
+ if(A.fire)
+ reset()
+ else
+ alarm()
+ return TRUE
+ return FALSE
diff --git a/code/citadel/plasmacases.dm b/modular_citadel/code/game/machinery/plasmacases.dm
similarity index 100%
rename from code/citadel/plasmacases.dm
rename to modular_citadel/code/game/machinery/plasmacases.dm
diff --git a/modular_citadel/code/game/machinery/vending.dm b/modular_citadel/code/game/machinery/vending.dm
index 130c93d854..6905efd88d 100644
--- a/modular_citadel/code/game/machinery/vending.dm
+++ b/modular_citadel/code/game/machinery/vending.dm
@@ -1,3 +1,106 @@
/obj/machinery/vending/security
contraband = list(/obj/item/clothing/glasses/sunglasses = 2, /obj/item/storage/fancy/donut_box = 2, /obj/item/device/ssword_kit = 1)
- premium = list(/obj/item/coin/antagtoken = 1, /obj/item/device/ssword_kit = 1)
\ No newline at end of file
+ premium = list(/obj/item/coin/antagtoken = 1, /obj/item/device/ssword_kit = 1)
+
+#define STANDARD_CHARGE 1
+#define CONTRABAND_CHARGE 2
+#define COIN_CHARGE 3
+
+/obj/machinery/vending/kink
+ name = "KinkMate"
+ desc = "A vending machine for all your unmentionable desires."
+ icon = 'icons/obj/citvending.dmi'
+ icon_state = "kink"
+ product_slogans = "Kinky!;Sexy!;Check me out, big boy!"
+ vend_reply = "Have fun, you shameless pervert!"
+ products = list(
+ /obj/item/clothing/under/maid = 5,
+ /obj/item/clothing/under/stripper_pink = 5,
+ /obj/item/clothing/under/stripper_green = 5,
+ /obj/item/dildo/custom = 5
+ )
+ contraband = list(/obj/item/restraints/handcuffs/fake/kinky = 5,
+ /obj/item/clothing/neck/petcollar = 5,
+ /obj/item/clothing/under/mankini = 1,
+ /obj/item/dildo/flared/huge = 1
+ )
+ premium = list(/obj/item/device/electropack/shockcollar = 1)
+ refill_canister = /obj/item/vending_refill/kink
+/*
+/obj/machinery/vending/nazivend
+ name = "Nazivend"
+ desc = "A vending machine containing Nazi German supplies. A label reads: \"Remember the gorrilions lost.\""
+ icon = 'icons/obj/citvending.dmi'
+ icon_state = "nazi"
+ vend_reply = "SIEG HEIL!"
+ product_slogans = "Das Vierte Reich wird zuruckkehren!;ENTFERNEN JUDEN!;Billiger als die Juden jemals geben!;Rader auf dem adminbus geht rund und rund.;Warten Sie, warum wir wieder hassen Juden?- *BZZT*"
+ products = list(
+ /obj/item/clothing/head/stalhelm = 20,
+ /obj/item/clothing/head/panzer = 20,
+ /obj/item/clothing/suit/soldiercoat = 20,
+ // /obj/item/clothing/under/soldieruniform = 20,
+ /obj/item/clothing/shoes/jackboots = 20
+ )
+ contraband = list(
+ /obj/item/clothing/head/naziofficer = 10,
+ // /obj/item/clothing/suit/officercoat = 10,
+ // /obj/item/clothing/under/officeruniform = 10,
+ /obj/item/clothing/suit/space/hardsuit/nazi = 3,
+ /obj/item/gun/energy/plasma/MP40k = 4
+ )
+ premium = list()
+
+ refill_canister = /obj/item/vending_refill/nazi
+*/
+/obj/machinery/vending/sovietvend
+ name = "KomradeVendtink"
+ desc = "Rodina-mat' zovyot!"
+ icon = 'icons/obj/citvending.dmi'
+ icon_state = "soviet"
+ vend_reply = "The fascist and capitalist svin'ya shall fall, komrade!"
+ product_slogans = "Quality worth waiting in line for!; Get Hammer and Sickled!; Sosvietsky soyuz above all!; With capitalist pigsky, you would have paid a fortunetink! ; Craftink in Motherland herself!"
+ products = list(
+ /obj/item/clothing/under/soviet = 20,
+ /obj/item/clothing/head/ushanka = 20,
+ /obj/item/clothing/shoes/jackboots = 20,
+ /obj/item/clothing/head/squatter_hat = 20,
+ /obj/item/clothing/under/squatter_outfit = 20,
+ /obj/item/clothing/under/russobluecamooutfit = 20,
+ /obj/item/clothing/head/russobluecamohat = 20
+ )
+ contraband = list(
+ /obj/item/clothing/under/syndicate/tacticool = 4,
+ /obj/item/clothing/mask/balaclava = 4,
+ /obj/item/clothing/suit/russofurcoat = 4,
+ /obj/item/clothing/head/russofurhat = 4,
+ /obj/item/clothing/suit/space/hardsuit/soviet = 3,
+ /obj/item/gun/energy/laser/LaserAK = 4
+ )
+ premium = list()
+
+ refill_canister = /obj/item/vending_refill/soviet
+
+
+#undef STANDARD_CHARGE
+#undef CONTRABAND_CHARGE
+#undef COIN_CHARGE
+
+
+/obj/item/vending_refill/kink
+ machine_name = "KinkMate"
+ icon = 'modular_citadel/icons/vending_restock.dmi'
+ icon_state = "refill_kink"
+ charges = list(8, 5, 0)// of 20 standard, 12 contraband, 0 premium
+ init_charges = list(8, 5, 0)
+
+/obj/item/vending_refill/nazi
+ machine_name = "nazivend"
+ icon_state = "refill_nazi"
+ charges = list(33, 13, 0)
+ init_charges = list(33, 13, 0)
+
+/obj/item/vending_refill/soviet
+ machine_name = "sovietvend"
+ icon_state = "refill_soviet"
+ charges = list(47, 7, 0)
+ init_charges = list(47, 7, 0)
diff --git a/code/citadel/cit_spawners.dm b/modular_citadel/code/game/objects/effects/spawner/spawners.dm
similarity index 100%
rename from code/citadel/cit_spawners.dm
rename to modular_citadel/code/game/objects/effects/spawner/spawners.dm
diff --git a/modular_citadel/code/game/objects/effects/temporary_visuals/projectiles/impact.dm b/modular_citadel/code/game/objects/effects/temporary_visuals/projectiles/impact.dm
new file mode 100644
index 0000000000..20052c3351
--- /dev/null
+++ b/modular_citadel/code/game/objects/effects/temporary_visuals/projectiles/impact.dm
@@ -0,0 +1,4 @@
+/obj/effect/projectile/impact/laser/wavemotion
+ name = "particle impact"
+ icon = 'modular_citadel/icons/obj/projectiles_impact.dmi'
+ icon_state = "impact_wavemotion"
\ No newline at end of file
diff --git a/modular_citadel/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm b/modular_citadel/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm
new file mode 100644
index 0000000000..5114cb223e
--- /dev/null
+++ b/modular_citadel/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm
@@ -0,0 +1,4 @@
+/obj/effect/projectile/muzzle/laser/wavemotion
+ name = "particle backblast"
+ icon = 'modular_citadel/icons/obj/projectiles_muzzle.dmi'
+ icon_state = "muzzle_wavemotion"
\ No newline at end of file
diff --git a/modular_citadel/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm b/modular_citadel/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm
new file mode 100644
index 0000000000..8110fcabeb
--- /dev/null
+++ b/modular_citadel/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm
@@ -0,0 +1,4 @@
+/obj/effect/projectile/tracer/laser/wavemotion
+ name = "particle trail"
+ icon = 'modular_citadel/icons/obj/projectiles_tracer.dmi'
+ icon_state = "tracer_wavemotion"
\ No newline at end of file
diff --git a/modular_citadel/code/game/objects/items.dm b/modular_citadel/code/game/objects/items.dm
new file mode 100644
index 0000000000..6f44d4b005
--- /dev/null
+++ b/modular_citadel/code/game/objects/items.dm
@@ -0,0 +1,2 @@
+/obj/item
+ var/total_mass
diff --git a/code/citadel/cit_genemods.dm b/modular_citadel/code/game/objects/items/devices/genemods.dm
similarity index 100%
rename from code/citadel/cit_genemods.dm
rename to modular_citadel/code/game/objects/items/devices/genemods.dm
diff --git a/modular_citadel/code/game/objects/structures/beds_chairs/chair.dm b/modular_citadel/code/game/objects/structures/beds_chairs/chair.dm
new file mode 100644
index 0000000000..2023c6f326
--- /dev/null
+++ b/modular_citadel/code/game/objects/structures/beds_chairs/chair.dm
@@ -0,0 +1,21 @@
+/obj/structure/chair/alt_attack_hand(mob/living/user)
+ if(Adjacent(user) && istype(user))
+ if(!item_chair || !user.can_hold_items() || !has_buckled_mobs() || buckled_mobs.len > 1 || dir != user.dir || flags_1 & NODECONSTRUCT_1)
+ return TRUE
+ if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
+ to_chat(user, "You can't do that right now! ")
+ return TRUE
+ if(user.staminaloss >= STAMINA_SOFTCRIT)
+ to_chat(user, "You're too exhausted for that. ")
+ return TRUE
+ var/mob/living/poordude = buckled_mobs[1]
+ if(!istype(poordude))
+ return TRUE
+ user.visible_message("[user] pulls [src] out from under [poordude]. ", "You pull [src] out from under [poordude]. ")
+ var/C = new item_chair(loc)
+ user.put_in_hands(C)
+ poordude.Knockdown(20)//rip in peace
+ user.adjustStaminaLoss(5)
+ unbuckle_all_mobs(TRUE)
+ qdel(src)
+ return TRUE
diff --git a/modular_citadel/code/modules/admin/holder2.dm b/modular_citadel/code/modules/admin/holder2.dm
index f581de8dfc..143000a0d6 100644
--- a/modular_citadel/code/modules/admin/holder2.dm
+++ b/modular_citadel/code/modules/admin/holder2.dm
@@ -2,7 +2,6 @@
var/following = null
/datum/admins/associate(client/C)
- removeMentor(C.ckey) //safety to avoid multiple datums and other weird shit i cannot comprehend
..()
if(istype(C))
C.mentor_datum_set(TRUE)
diff --git a/modular_citadel/code/modules/admin/topic.dm b/modular_citadel/code/modules/admin/topic.dm
index bdd8758882..26bc902bef 100644
--- a/modular_citadel/code/modules/admin/topic.dm
+++ b/modular_citadel/code/modules/admin/topic.dm
@@ -1,4 +1,8 @@
/datum/admins/proc/citaTopic(href, href_list)
+ if(href_list["makementor"])
+ makeMentor(href_list["makementor"])
+ else if(href_list["removementor"])
+ removeMentor(href_list["removementor"])
/datum/admins/proc/makeMentor(ckey)
if(!usr.client)
diff --git a/code/citadel/cit_crewobjectives.dm b/modular_citadel/code/modules/antagonists/cit_crewobjectives.dm
similarity index 100%
rename from code/citadel/cit_crewobjectives.dm
rename to modular_citadel/code/modules/antagonists/cit_crewobjectives.dm
diff --git a/code/citadel/cit_miscreants.dm b/modular_citadel/code/modules/antagonists/cit_miscreants.dm
similarity index 100%
rename from code/citadel/cit_miscreants.dm
rename to modular_citadel/code/modules/antagonists/cit_miscreants.dm
diff --git a/code/citadel/crew_objectives/cit_crewobjectives_cargo.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_cargo.dm
similarity index 100%
rename from code/citadel/crew_objectives/cit_crewobjectives_cargo.dm
rename to modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_cargo.dm
diff --git a/code/citadel/crew_objectives/cit_crewobjectives_civilian.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_civilian.dm
similarity index 100%
rename from code/citadel/crew_objectives/cit_crewobjectives_civilian.dm
rename to modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_civilian.dm
diff --git a/code/citadel/crew_objectives/cit_crewobjectives_command.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_command.dm
similarity index 100%
rename from code/citadel/crew_objectives/cit_crewobjectives_command.dm
rename to modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_command.dm
diff --git a/code/citadel/crew_objectives/cit_crewobjectives_engineering.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_engineering.dm
similarity index 100%
rename from code/citadel/crew_objectives/cit_crewobjectives_engineering.dm
rename to modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_engineering.dm
diff --git a/code/citadel/crew_objectives/cit_crewobjectives_medical.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_medical.dm
similarity index 100%
rename from code/citadel/crew_objectives/cit_crewobjectives_medical.dm
rename to modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_medical.dm
diff --git a/code/citadel/crew_objectives/cit_crewobjectives_science.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_science.dm
similarity index 100%
rename from code/citadel/crew_objectives/cit_crewobjectives_science.dm
rename to modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_science.dm
diff --git a/code/citadel/crew_objectives/cit_crewobjectives_security.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_security.dm
similarity index 100%
rename from code/citadel/crew_objectives/cit_crewobjectives_security.dm
rename to modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_security.dm
diff --git a/code/citadel/cit_arousal.dm b/modular_citadel/code/modules/arousal/arousal.dm
similarity index 99%
rename from code/citadel/cit_arousal.dm
rename to modular_citadel/code/modules/arousal/arousal.dm
index 077824fe9e..584acc6eb6 100644
--- a/code/citadel/cit_arousal.dm
+++ b/modular_citadel/code/modules/arousal/arousal.dm
@@ -142,7 +142,7 @@
/obj/screen/arousal
name = "arousal"
icon_state = "arousal0"
- icon = 'code/citadel/icons/hud.dmi'
+ icon = 'modular_citadel/icons/obj/genitals/hud.dmi'
screen_loc = ui_arousal
/obj/screen/arousal/Click()
diff --git a/code/citadel/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm
similarity index 96%
rename from code/citadel/organs/breasts.dm
rename to modular_citadel/code/modules/arousal/organs/breasts.dm
index 901c546212..ea44c6d671 100644
--- a/code/citadel/organs/breasts.dm
+++ b/modular_citadel/code/modules/arousal/organs/breasts.dm
@@ -2,7 +2,7 @@
name = "breasts"
desc = "Female milk producing organs."
icon_state = "breasts"
- icon = 'code/citadel/icons/breasts.dmi'
+ icon = 'modular_citadel/icons/obj/genitals/breasts.dmi'
zone = "chest"
slot = "breasts"
w_class = 3
diff --git a/code/citadel/organs/eggsack.dm b/modular_citadel/code/modules/arousal/organs/eggsack.dm
similarity index 87%
rename from code/citadel/organs/eggsack.dm
rename to modular_citadel/code/modules/arousal/organs/eggsack.dm
index 1486310d61..27104cd36a 100644
--- a/code/citadel/organs/eggsack.dm
+++ b/modular_citadel/code/modules/arousal/organs/eggsack.dm
@@ -2,7 +2,7 @@
name = "Egg sack"
desc = "An egg producing reproductive organ."
icon_state = "egg_sack"
- icon = 'code/citadel/icons/ovipositor.dmi'
+ icon = 'modular_citadel/icons/obj/genitals/ovipositor.dmi'
zone = "groin"
slot = "testicles"
color = null //don't use the /genital color since it already is colored
diff --git a/code/citadel/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm
similarity index 100%
rename from code/citadel/organs/genitals.dm
rename to modular_citadel/code/modules/arousal/organs/genitals.dm
diff --git a/code/citadel/organs/genitals_sprite_accessories.dm b/modular_citadel/code/modules/arousal/organs/genitals_sprite_accessories.dm
similarity index 83%
rename from code/citadel/organs/genitals_sprite_accessories.dm
rename to modular_citadel/code/modules/arousal/organs/genitals_sprite_accessories.dm
index 710bab787c..7c02b1c3a5 100644
--- a/code/citadel/organs/genitals_sprite_accessories.dm
+++ b/modular_citadel/code/modules/arousal/organs/genitals_sprite_accessories.dm
@@ -4,7 +4,7 @@
//DICKS,COCKS,PENISES,WHATEVER YOU WANT TO CALL THEM
/datum/sprite_accessory/penis
- icon = 'code/citadel/icons/penis_onmob.dmi'
+ icon = 'modular_citadel/icons/obj/genitals/penis_onmob.dmi'
icon_state = null
name = "penis" //the preview name of the accessory
gender_specific = 0 //Might be needed somewhere down the list.
@@ -35,21 +35,21 @@
// Taur cocks go here //
////////////////////////
/datum/sprite_accessory/penis/taur_flared
- icon = 'code/citadel/icons/taur_penis_onmob.dmi' //Needed larger width
+ icon = 'modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi' //Needed larger width
icon_state = "flared"
name = "Taur, Flared"
center = TRUE //Center the image 'cause 2-tile wide.
dimension_x = 64
/datum/sprite_accessory/penis/taur_knotted
- icon = 'code/citadel/icons/taur_penis_onmob.dmi' //Needed larger width
+ icon = 'modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi' //Needed larger width
icon_state = "knotted"
name = "Taur, Knotted"
center = TRUE //Center the image 'cause 2-tile wide.
dimension_x = 64
/datum/sprite_accessory/penis/taur_tapered
- icon = 'code/citadel/icons/taur_penis_onmob.dmi' //Needed larger width
+ icon = 'modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi' //Needed larger width
icon_state = "tapered"
name = "Taur, Tapered"
center = TRUE //Center the image 'cause 2-tile wide.
@@ -60,7 +60,7 @@
//Vaginas
/datum/sprite_accessory/vagina
- icon = 'code/citadel/icons/vagina_onmob.dmi'
+ icon = 'modular_citadel/icons/obj/genitals/vagina_onmob.dmi'
icon_state = null
name = "vagina"
gender_specific = 0
@@ -90,7 +90,7 @@
//BREASTS BE HERE
/datum/sprite_accessory/breasts
- icon = 'code/citadel/icons/breasts_onmob.dmi'
+ icon = 'modular_citadel/icons/obj/genitals/breasts_onmob.dmi'
icon_state = null
name = "breasts"
gender_specific = 0
@@ -104,7 +104,7 @@
//OVIPOSITORS BE HERE
/datum/sprite_accessory/ovipositor
- icon = 'code/citadel/icons/penis_onmob.dmi'
+ icon = 'modular_citadel/icons/obj/genitals/penis_onmob.dmi'
icon_state = null
name = "Ovipositor" //the preview name of the accessory
gender_specific = 0 //Might be needed somewhere down the list.
diff --git a/code/citadel/organs/ovipositor.dm b/modular_citadel/code/modules/arousal/organs/ovipositor.dm
similarity index 88%
rename from code/citadel/organs/ovipositor.dm
rename to modular_citadel/code/modules/arousal/organs/ovipositor.dm
index 3d684ee387..76bf60d93c 100644
--- a/code/citadel/organs/ovipositor.dm
+++ b/modular_citadel/code/modules/arousal/organs/ovipositor.dm
@@ -2,7 +2,7 @@
name = "Ovipositor"
desc = "An egg laying reproductive organ."
icon_state = "ovi_knotted_2"
- icon = 'code/citadel/icons/ovipositor.dmi'
+ icon = 'modular_citadel/icons/obj/genitals/ovipositor.dmi'
zone = "groin"
slot = "penis"
w_class = 3
diff --git a/code/citadel/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm
similarity index 97%
rename from code/citadel/organs/penis.dm
rename to modular_citadel/code/modules/arousal/organs/penis.dm
index 509ed72ef4..ae58aabf51 100644
--- a/code/citadel/organs/penis.dm
+++ b/modular_citadel/code/modules/arousal/organs/penis.dm
@@ -2,7 +2,7 @@
name = "penis"
desc = "A male reproductive organ."
icon_state = "penis"
- icon = 'code/citadel/icons/penis.dmi'
+ icon = 'modular_citadel/icons/obj/genitals/penis.dmi'
zone = "groin"
slot = "penis"
w_class = 3
diff --git a/code/citadel/organs/testicles.dm b/modular_citadel/code/modules/arousal/organs/testicles.dm
similarity index 96%
rename from code/citadel/organs/testicles.dm
rename to modular_citadel/code/modules/arousal/organs/testicles.dm
index bb3ade6048..815d8034e7 100644
--- a/code/citadel/organs/testicles.dm
+++ b/modular_citadel/code/modules/arousal/organs/testicles.dm
@@ -2,7 +2,7 @@
name = "testicles"
desc = "A male reproductive organ."
icon_state = "testicles"
- icon = 'code/citadel/icons/penis.dmi'
+ icon = 'modular_citadel/icons/obj/genitals/penis.dmi'
zone = "groin"
slot = "testicles"
w_class = 3
diff --git a/code/citadel/organs/vagina.dm b/modular_citadel/code/modules/arousal/organs/vagina.dm
similarity index 97%
rename from code/citadel/organs/vagina.dm
rename to modular_citadel/code/modules/arousal/organs/vagina.dm
index 1f19dc7e64..4d9eedb1cf 100644
--- a/code/citadel/organs/vagina.dm
+++ b/modular_citadel/code/modules/arousal/organs/vagina.dm
@@ -1,7 +1,7 @@
/obj/item/organ/genital/vagina
name = "vagina"
desc = "A female reproductive organ."
- icon = 'code/citadel/icons/vagina.dmi'
+ icon = 'modular_citadel/icons/obj/genitals/vagina.dmi'
icon_state = "vagina"
zone = "groin"
slot = "vagina"
diff --git a/code/citadel/organs/womb.dm b/modular_citadel/code/modules/arousal/organs/womb.dm
similarity index 94%
rename from code/citadel/organs/womb.dm
rename to modular_citadel/code/modules/arousal/organs/womb.dm
index 433f005623..c59d74e629 100644
--- a/code/citadel/organs/womb.dm
+++ b/modular_citadel/code/modules/arousal/organs/womb.dm
@@ -1,7 +1,7 @@
/obj/item/organ/genital/womb
name = "womb"
desc = "A female reproductive organ."
- icon = 'code/citadel/icons/vagina.dmi'
+ icon = 'modular_citadel/icons/obj/genitals/vagina.dmi'
icon_state = "womb"
zone = "groin"
slot = "womb"
diff --git a/code/citadel/toys/dildos.dm b/modular_citadel/code/modules/arousal/toys/dildos.dm
similarity index 98%
rename from code/citadel/toys/dildos.dm
rename to modular_citadel/code/modules/arousal/toys/dildos.dm
index d216ed86ba..45f4f5a64a 100644
--- a/code/citadel/toys/dildos.dm
+++ b/modular_citadel/code/modules/arousal/toys/dildos.dm
@@ -4,7 +4,7 @@
obj/item/dildo
name = "dildo"
desc = "Floppy!"
- icon = 'code/citadel/icons/dildo.dmi'
+ icon = 'modular_citadel/icons/obj/genitals/dildo.dmi'
damtype = BRUTE
force = 0
throwforce = 0
diff --git a/modular_citadel/code/modules/client/client_procs.dm b/modular_citadel/code/modules/client/client_procs.dm
index 5bb53ee0f2..511aac0738 100644
--- a/modular_citadel/code/modules/client/client_procs.dm
+++ b/modular_citadel/code/modules/client/client_procs.dm
@@ -12,3 +12,11 @@
/client/proc/is_mentor() // admins are mentors too.
if(mentor_datum || check_rights_for(src, R_ADMIN,0))
return TRUE
+
+/client/verb/togglerightclickstuff()
+ set category = "OOC"
+ set name = "Toggle Rightclick"
+ set desc = "Did the context menu get stuck on or off? Press this button."
+
+ show_popup_menus = !show_popup_menus
+ to_chat(src, "The right-click context menu is now [show_popup_menus ? "enabled" : "disabled"]. ")
diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm
index 577f41ea77..69015b064d 100644
--- a/modular_citadel/code/modules/client/loadout/__donator.dm
+++ b/modular_citadel/code/modules/client/loadout/__donator.dm
@@ -198,9 +198,27 @@
category = slot_wear_suit
path = /obj/item/clothing/under/gladiator
ckeywhitelist = list("aroche")
-
+
/datum/gear/bloodredtie
name = "Blood Red Tie"
category = slot_neck
path = /obj/item/clothing/neck/tie/bloodred
ckeywhitelist = list("kyutness")
+
+/datum/gear/puffydress
+ name = "Puffy Dress"
+ category = slot_wear_suit
+ path = /obj/item/clothing/suit/puffydress
+ //ckeywhitelist = //Don't know their ckey yet
+
+/datum/gear/labredblack
+ name = "Black and Red Coat"
+ category = slot_wear_suit
+ path = /obj/item/clothing/suit/toggle/labcoat/labredblack
+ ckeywhitelist = list("blakeryan")
+
+
+
+
+
+
diff --git a/modular_citadel/code/modules/client/loadout/uniform_trek.dm b/modular_citadel/code/modules/client/loadout/uniform_trek.dm
new file mode 100644
index 0000000000..dd03d3c446
--- /dev/null
+++ b/modular_citadel/code/modules/client/loadout/uniform_trek.dm
@@ -0,0 +1,156 @@
+// Trekie things
+//TOS
+/datum/gear/uniform/job_trek/cmd/tos
+ name = "TOS uniform, cmd"
+ category = slot_w_uniform
+ path = /obj/item/clothing/under/rank/trek/command
+ restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster")
+
+/datum/gear/uniform/job_trek/medsci/tos
+ name = "TOS uniform, med/sci"
+ category = slot_w_uniform
+ path = /obj/item/clothing/under/rank/trek/medsci
+ restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist")
+
+/datum/gear/uniform/job_trek/eng/tos
+ name = "TOS uniform, ops/sec"
+ category = slot_w_uniform
+ path = /obj/item/clothing/under/rank/trek/engsec
+ restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
+
+//Federation jackets from movies
+/datum/gear/uniform/job_trek/cmd/cap
+ name = "fed (movie) uniform, Captain"
+ category = slot_wear_suit
+ path = /obj/item/clothing/suit/storage/fluff/fedcoat/capt
+ restricted_roles = list("Captain","Head of Personnel")
+
+/datum/gear/uniform/job_trek/cmd/mov
+ name = "fed (movie) uniform, sec"
+ category = slot_wear_suit
+ path = /obj/item/clothing/suit/storage/fluff/fedcoat
+ restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster","Warden","Detective","Security Officer")
+
+/datum/gear/suit/job_trek/medsci/mov
+ name = "fed (movie) uniform, med/sci"
+ category = slot_wear_suit
+ path = /obj/item/clothing/suit/storage/fluff/fedcoat/medsci
+ restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist")
+
+/datum/gear/suit/job_trek/eng/mov
+ name = "fed (movie) uniform, ops/eng"
+ category = slot_wear_suit
+ path = /obj/item/clothing/suit/storage/fluff/fedcoat/eng
+ restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Cargo Technician", "Shaft Miner", "Quartermaster")
+
+//TNG
+/datum/gear/uniform/job_trek/cmd/tng
+ name = "TNG uniform, cmd"
+ category = slot_w_uniform
+ path = /obj/item/clothing/under/rank/trek/command/next
+ restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster")
+
+/datum/gear/uniform/job_trek/medsci/tng
+ name = "TNG uniform, med/sci"
+ category = slot_w_uniform
+ path = /obj/item/clothing/under/rank/trek/medsci/next
+ restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist")
+
+/datum/gear/uniform/job_trek/eng/tng
+ name = "TNG uniform, ops/sec"
+ category = slot_w_uniform
+ path = /obj/item/clothing/under/rank/trek/engsec/next
+ restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
+
+//VOY
+/datum/gear/uniform/job_trek/cmd/voy
+ name = "VOY uniform, cmd"
+ category = slot_w_uniform
+ path = /obj/item/clothing/under/rank/trek/command/voy
+ restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster")
+
+/datum/gear/uniform/job_trek/medsci/voy
+ name = "VOY uniform, med/sci"
+ category = slot_w_uniform
+ path = /obj/item/clothing/under/rank/trek/medsci/voy
+ restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist")
+
+/datum/gear/uniform/job_trek/eng/voy
+ name = "VOY uniform, ops/sec"
+ category = slot_w_uniform
+ path = /obj/item/clothing/under/rank/trek/engsec/voy
+ restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
+
+//DS9
+
+/datum/gear/suit/job_trek/ds9_coat
+ name = "DS9 Overcoat (use uniform)"
+ category = slot_wear_suit
+ path = /obj/item/clothing/suit/storage/trek/ds9
+ restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster",
+ "Medical Doctor","Chemist","Virologist","Geneticist","Scientist", "Roboticist",
+ "Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer",
+ "Cargo Technician", "Shaft Miner") //everyone who actually deserves a job.
+
+/datum/gear/uniform/job_trek/cmd/ds9
+ name = "DS9 uniform, cmd"
+ category = slot_w_uniform
+ path = /obj/item/clothing/under/rank/trek/command/ds9
+ restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster")
+
+/datum/gear/uniform/job_trek/medsci/ds9
+ name = "DS9 uniform, med/sci"
+ category = slot_w_uniform
+ path = /obj/item/clothing/under/rank/trek/medsci/ds9
+ restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist")
+
+/datum/gear/uniform/job_trek/eng/ds9
+ name = "DS9 uniform, ops/sec"
+ category = slot_w_uniform
+ path = /obj/item/clothing/under/rank/trek/engsec/ds9
+ restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
+
+
+//ENT
+/datum/gear/uniform/job_trek/cmd/ent
+ name = "ENT uniform, cmd"
+ category = slot_w_uniform
+ path = /obj/item/clothing/under/rank/trek/command/ent
+ restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster")
+
+/datum/gear/uniform/job_trek/medsci/ent
+ name = "ENT uniform, med/sci"
+ category = slot_w_uniform
+ path = /obj/item/clothing/under/rank/trek/medsci/ent
+ restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist")
+
+/datum/gear/uniform/job_trek/eng/ent
+ name = "ENT uniform, ops/sec"
+ category = slot_w_uniform
+ path = /obj/item/clothing/under/rank/trek/engsec/ent
+ restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
+
+//Hats!
+/datum/gear/hat/job_trek/cap
+ name = "Federation Officer's Cap"
+ category = slot_head
+ path = /obj/item/clothing/head/caphat/formal/fedcover
+ restricted_roles = list("Captain","Head of Personnel")
+
+/datum/gear/hat/job_trek/cap/medisci
+ name = "Federation Officer's Cap"
+ category = slot_head
+ path = /obj/item/clothing/head/caphat/formal/fedcover/medsci
+ restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist")
+
+/datum/gear/hat/job_trek/cap/eng
+ name = "Federation Officer's Cap"
+ category = slot_head
+ path = /obj/item/clothing/head/caphat/formal/fedcover/eng
+ restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
+
+/datum/gear/hat/job_trek/cap/sec
+ name = "Federation Officer's Cap"
+ category = slot_head
+ path = /obj/item/clothing/head/caphat/formal/fedcover/sec
+ restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
\ No newline at end of file
diff --git a/modular_citadel/code/modules/client/preferences.dm b/modular_citadel/code/modules/client/preferences.dm
index 1e12ae5c86..4d1fc880d7 100644
--- a/modular_citadel/code/modules/client/preferences.dm
+++ b/modular_citadel/code/modules/client/preferences.dm
@@ -11,6 +11,7 @@
var/damagescreenshake = 2
var/arousable = TRUE
var/widescreenpref = TRUE
+ var/autostand = TRUE
/datum/preferences/New(client/C)
..()
diff --git a/modular_citadel/code/modules/client/preferences_toggles.dm b/modular_citadel/code/modules/client/preferences_toggles.dm
new file mode 100644
index 0000000000..a475d65106
--- /dev/null
+++ b/modular_citadel/code/modules/client/preferences_toggles.dm
@@ -0,0 +1,36 @@
+TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, toggleeatingnoise)()
+ set name = "Toggle Eating Noises"
+ set category = "Preferences"
+ set desc = "Hear Eating noises"
+ usr.client.prefs.toggles ^= EATING_NOISES
+ usr.client.prefs.save_preferences()
+ usr.stop_sound_channel(CHANNEL_PRED)
+ to_chat(usr, "You will [(usr.client.prefs.toggles & EATING_NOISES) ? "now" : "no longer"] hear eating noises.")
+/datum/verbs/menu/Settings/Sound/toggleeatingnoise/Get_checked(client/C)
+ return !(C.prefs.toggles & EATING_NOISES)
+
+
+TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, toggledigestionnoise)()
+ set name = "Toggle Digestion Noises"
+ set category = "Preferences"
+ set desc = "Hear digestive noises"
+ usr.client.prefs.toggles ^= DIGESTION_NOISES
+ usr.client.prefs.save_preferences()
+ usr.stop_sound_channel(CHANNEL_DIGEST)
+ to_chat(usr, "You will [(usr.client.prefs.toggles & DIGESTION_NOISES) ? "now" : "no longer"] hear digestion noises.")
+/datum/verbs/menu/Settings/Sound/toggledigestionnoise/Get_checked(client/C)
+ return !(C.prefs.toggles & DIGESTION_NOISES)
+
+TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, togglehoundsleeper)()
+ set name = "Allow/Deny Hound Sleeper"
+ set category = "Preferences"
+ set desc = "Allow MediHound Sleepers"
+ usr.client.prefs.toggles ^= MEDIHOUND_SLEEPER
+ usr.client.prefs.save_preferences()
+ if(usr.client.prefs.toggles & MEDIHOUND_SLEEPER)
+ to_chat(usr, "You will now allow MediHounds to place you in their sleeper.")
+ else
+ to_chat(usr, "You will no longer allow MediHounds to place you in their sleeper.")
+ SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle MediHound Sleeper", "[usr.client.prefs.toggles & MEDIHOUND_SLEEPER ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+/datum/verbs/menu/Settings/Sound/togglehoundsleeper/Get_checked(client/C)
+ return C.prefs.toggles & MEDIHOUND_SLEEPER
\ No newline at end of file
diff --git a/modular_citadel/code/modules/clothing/suits/suits.dm b/modular_citadel/code/modules/clothing/suits/suits.dm
new file mode 100644
index 0000000000..776da896bd
--- /dev/null
+++ b/modular_citadel/code/modules/clothing/suits/suits.dm
@@ -0,0 +1,13 @@
+/*/////////////////////////////////////////////////////////////////////////////////
+/////// ///////
+/////// Cit's exclusive suits, armor, etc. go here ///////
+/////// ///////
+*//////////////////////////////////////////////////////////////////////////////////
+
+
+/obj/item/clothing/suit/armor/hos/trenchcoat/cloak
+ name = "armored trenchcloak"
+ desc = "A trenchcoat enchanced with a special lightweight kevlar. This one appears to be designed to be draped over one's shoulders rather than worn normally.."
+ alternate_worn_icon = 'icons/mob/citadel/suit.dmi'
+ icon_state = "hostrench"
+ item_state = "hostrench"
\ No newline at end of file
diff --git a/modular_citadel/code/modules/clothing/under.dm b/modular_citadel/code/modules/clothing/under.dm
deleted file mode 100644
index bf77704122..0000000000
--- a/modular_citadel/code/modules/clothing/under.dm
+++ /dev/null
@@ -1,7 +0,0 @@
-/obj/item/clothing/under/syndicate/cosmetic
- name = "tactitool turtleneck"
- desc = "Just looking at it makes you want to buy an SKS, go into the woods, and -operate-."
- icon_state = "tactifool"
- item_state = "bl_suit"
- item_color = "tactifool"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
\ No newline at end of file
diff --git a/modular_citadel/code/modules/clothing/under/trek_under.dm b/modular_citadel/code/modules/clothing/under/trek_under.dm
new file mode 100644
index 0000000000..60276325cb
--- /dev/null
+++ b/modular_citadel/code/modules/clothing/under/trek_under.dm
@@ -0,0 +1,257 @@
+/*/////////////////////////////////////////////////////////////////////////////////
+/////// ///////
+/////// Star Trek Stuffs ///////
+/////// ///////
+*//////////////////////////////////////////////////////////////////////////////////
+// <3 Nienhaus && Joan.
+// I made the Voy and DS9 stuff tho. - Poojy
+
+
+
+/obj/item/clothing/under/rank/trek
+ name = "Section 31 Uniform"
+ desc = "Oooh... right."
+ icon = 'modular_citadel/icons/mob/clothing/trek_item_icon.dmi'
+ icon_override = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi'
+ item_state = ""
+ can_adjust = FALSE //to prevent you from "wearing it casually"
+
+//TOS
+/obj/item/clothing/under/rank/trek/command
+ name = "Command Uniform"
+ desc = "The uniform worn by command officers in the mid 2260s."
+ icon_state = "trek_command"
+ item_state = "trek_command"
+ armor = list("melee" = 10, "bullet" = 10, "laser" = 10,"energy" = 10, "bomb" = 0, "bio" = 10, "rad" = 10, "fire" = 0, "acid" = 0) // Considering only staff heads get to pick it
+
+/obj/item/clothing/under/rank/trek/engsec
+ name = "Operations Uniform"
+ desc = "The uniform worn by operations officers of the mid 2260s. You feel strangely vulnerable just seeing this..."
+ icon_state = "trek_engsec"
+ item_state = "trek_engsec"
+ armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 10, "acid" = 0) // since they're shared between jobs and kinda moot.
+
+/obj/item/clothing/under/rank/trek/medsci
+ name = "MedSci Uniform"
+ desc = "The uniform worn by medsci officers in the mid 2260s."
+ icon_state = "trek_medsci"
+ item_state = "trek_medsci"
+ permeability_coefficient = 0.50
+ armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 10, "fire" = 0, "acid" = 10) // basically a copy of vanilla sci/med
+
+//TNG
+/obj/item/clothing/under/rank/trek/command/next
+ desc = "The uniform worn by command officers. This one's from the mid 2360s."
+ icon_state = "trek_next_command"
+ item_state = "trek_next_command"
+
+/obj/item/clothing/under/rank/trek/engsec/next
+ desc = "The uniform worn by operation officers. This one's from the mid 2360s."
+ icon_state = "trek_next_engsec"
+ item_state = "trek_next_engsec"
+
+/obj/item/clothing/under/rank/trek/medsci/next
+ desc = "The uniform worn by medsci officers. This one's from the mid 2360s."
+ icon_state = "trek_next_medsci"
+ item_state = "trek_next_medsci"
+
+//ENT
+/obj/item/clothing/under/rank/trek/command/ent
+ desc = "The uniform worn by command officers of the 2140s."
+ icon_state = "trek_ent_command"
+ item_state = "trek_ent_command"
+
+/obj/item/clothing/under/rank/trek/engsec/ent
+ desc = "The uniform worn by operations officers of the 2140s."
+ icon_state = "trek_ent_engsec"
+ item_state = "trek_ent_engsec"
+
+/obj/item/clothing/under/rank/trek/medsci/ent
+ desc = "The uniform worn by medsci officers of the 2140s."
+ icon_state = "trek_ent_medsci"
+ item_state = "trek_ent_medsci"
+
+//VOY
+/obj/item/clothing/under/rank/trek/command/voy
+ desc = "The uniform worn by command officers of the 2370s."
+ icon_state = "trek_voy_command"
+ item_state = "trek_voy_command"
+
+/obj/item/clothing/under/rank/trek/engsec/voy
+ desc = "The uniform worn by operations officers of the 2370s."
+ icon_state = "trek_voy_engsec"
+ item_state = "trek_voy_engsec"
+
+/obj/item/clothing/under/rank/trek/medsci/voy
+ desc = "The uniform worn by medsci officers of the 2370s."
+ icon_state = "trek_voy_medsci"
+ item_state = "trek_voy_medsci"
+
+//DS9
+
+/obj/item/clothing/suit/storage/trek/ds9
+ name = "Padded Overcoat"
+ desc = "The overcoat worn by all officers of the 2380s."
+ icon = 'modular_citadel/icons/mob/clothing/trek_item_icon.dmi'
+ icon_state = "trek_ds9_coat"
+ icon_override = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi'
+ item_state = "trek_ds9_coat"
+ body_parts_covered = CHEST|GROIN|ARMS
+ permeability_coefficient = 0.50
+ allowed = list(
+ /obj/item/device/flashlight, /obj/item/device/analyzer,
+ /obj/item/device/radio, /obj/item/tank/internals/emergency_oxygen,
+ /obj/item/reagent_containers/hypospray, /obj/item/device/healthanalyzer,/obj/item/reagent_containers/syringe,
+ /obj/item/reagent_containers/glass/bottle/vial,/obj/item/reagent_containers/glass/beaker,
+ /obj/item/reagent_containers/pill,/obj/item/storage/pill_bottle, /obj/item/restraints/handcuffs
+ )
+ armor = list("melee" = 10, "bullet" = 5, "laser" = 5,"energy" = 5, "bomb" = 5, "bio" = 5, "rad" = 10, "fire" = 10, "acid" = 0)
+
+/obj/item/clothing/suit/storage/trek/ds9/admiral // Only for adminuz
+ name = "Admiral Overcoat"
+ desc = "Admirality specialty coat to keep flag officers fashionable and protected."
+ icon_state = "trek_ds9_coat_adm"
+ item_state = "trek_ds9_coat_adm"
+ permeability_coefficient = 0.01
+ armor = list("melee" = 50, "bullet" = 50, "laser" = 50,"energy" = 50, "bomb" = 50, "bio" = 50, "rad" = 50, "fire" = 50, "acid" = 50)
+
+/obj/item/clothing/under/rank/trek/command/ds9
+ desc = "The uniform worn by command officers of the 2380s."
+ icon_state = "trek_command"
+ item_state = "trek_ds9_command"
+
+/obj/item/clothing/under/rank/trek/engsec/ds9
+ desc = "The uniform worn by operations officers of the 2380s."
+ icon_state = "trek_engsec"
+ item_state = "trek_ds9_engsec"
+
+/obj/item/clothing/under/rank/trek/medsci/ds9
+ desc = "The uniform undershirt worn by medsci officers of the 2380s."
+ icon_state = "trek_medsci"
+ item_state = "trek_ds9_medsci"
+
+//MODERN ish Joan sqrl sprites. I think
+
+//For general use
+/obj/item/clothing/suit/storage/fluff/fedcoat
+ name = "Federation Uniform Jacket (Red)"
+ desc = "A uniform jacket from the United Federation. Starfleet still uses this uniform and there are variations of it. Set phasers to awesome."
+
+ icon = 'modular_citadel/icons/mob/clothing/trek_item_icon.dmi'
+ icon_override = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi'
+ icon_state = "fedcoat"
+ item_state = "fedcoat"
+
+ blood_overlay_type = "coat"
+ body_parts_covered = CHEST|GROIN|ARMS
+ allowed = list(
+ /obj/item/tank/internals/emergency_oxygen,
+ /obj/item/device/flashlight,
+ /obj/item/device/analyzer,
+ /obj/item/device/radio,
+ /obj/item/gun,
+ /obj/item/melee/baton,
+ /obj/item/restraints/handcuffs,
+ /obj/item/reagent_containers/hypospray,
+ /obj/item/device/healthanalyzer,
+ /obj/item/reagent_containers/syringe,
+ /obj/item/reagent_containers/glass/bottle/vial,
+ /obj/item/reagent_containers/glass/beaker,
+ /obj/item/storage/pill_bottle,
+ /obj/item/device/taperecorder)
+ armor = list("melee" = 10, "bullet" = 5, "laser" = 5,"energy" = 5, "bomb" = 5, "bio" = 5, "rad" = 10, "fire" = 10, "acid" = 0)
+ var/unbuttoned = 0
+
+ verb/toggle()
+ set name = "Toggle coat buttons"
+ set category = "Object"
+ set src in usr
+
+ if(!usr.canmove || usr.stat || usr.restrained())
+ return 0
+
+ switch(unbuttoned)
+ if(0)
+ icon_state = "[initial(icon_state)]_open"
+ item_state = "[initial(item_state)]_open"
+ unbuttoned = 1
+ usr << "You unbutton the coat."
+ if(1)
+ icon_state = "[initial(icon_state)]"
+ item_state = "[initial(item_state)]"
+ unbuttoned = 0
+ usr << "You button up the coat."
+ usr.update_inv_wear_suit()
+
+ //Variants
+/obj/item/clothing/suit/storage/fluff/fedcoat/medsci
+ desc = "A uniform jacket from the United Federation. Starfleet still uses this uniform and there are variations of it. Wearing this may make you feel all scientific."
+ icon_state = "fedblue"
+ item_state = "fedblue"
+
+/obj/item/clothing/suit/storage/fluff/fedcoat/eng
+ desc = "A uniform jacket from the United Federation. Starfleet still uses this uniform and there are variations of it.Wearing it may make you feel like checking a warp core, whatever that is."
+ icon_state = "fedeng"
+ item_state = "fedeng"
+
+/obj/item/clothing/suit/storage/fluff/fedcoat/capt
+ desc = "A uniform jacket from the United Federation. Starfleet still uses this uniform and there are variations of it. You feel like a commanding officer of Starfleet."
+ icon_state = "fedcapt"
+ item_state = "fedcapt"
+
+//"modern" ones for fancy
+
+/obj/item/clothing/suit/storage/fluff/modernfedcoat
+ name = "Modern Federation Uniform Jacket"
+ desc = "A modern uniform jacket from the United Federation. Their Starfleet had recently started using these uniforms. Wearing this makes you feel like a competant commander."
+ icon = 'modular_citadel/icons/mob/clothing/trek_item_icon.dmi'
+ icon_override = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi'
+ icon_state = "fedmodern"
+ item_state = "fedmodern"
+ body_parts_covered = CHEST|GROIN|ARMS
+ allowed = list(
+ /obj/item/tank/internals/emergency_oxygen,
+ /obj/item/device/flashlight,
+ /obj/item/gun,
+ /obj/item/melee/baton,
+ /obj/item/restraints/handcuffs,
+ /obj/item/device/taperecorder)
+ armor = list("melee" = 45, "bullet" = 25, "laser" = 25,"energy" = 25, "bomb" = 25, "bio" = 25, "rad" = 50, "fire" = 50, "acid" = 50)
+
+ //Variants
+/obj/item/clothing/suit/storage/fluff/modernfedcoat/medsci
+ desc = "A modern uniform jacket from the United Federation. Their Starfleet had recently started using these uniforms. Wearing this makes you feel like a scientist or a pilot."
+ icon_state = "fedmodernblue"
+ item_state = "fedmodernblue"
+
+/obj/item/clothing/suit/storage/fluff/modernfedcoat/eng
+ desc = "A modern uniform jacket from the United Federation. Their Starfleet had recently started using these uniforms. You feel like you can handle any type of technical engineering problems."
+ icon_state = "fedmoderneng"
+ item_state = "fedmoderneng"
+
+/obj/item/clothing/suit/storage/fluff/modernfedcoat/sec
+ desc = "A modern uniform jacket from the United Federation. Their Starfleet had recently started using these uniforms. This uniform makes you want to protect and serve as an officer."
+ icon_state = "fedmodernsec"
+ item_state = "fedmodernsec"
+
+/obj/item/clothing/head/caphat/formal/fedcover
+ name = "Federation Officer's Cap"
+ desc = "An officer's cap that demands discipline from the one who wears it."
+ icon = 'modular_citadel/icons/mob/clothing/trek_item_icon.dmi'
+ icon_state = "fedcapofficer"
+ icon_override = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi'
+ item_state = "fedcapofficer_mob"
+ armor = list("melee" = 10, "bullet" = 10, "laser" = 10,"energy" = 10, "bomb" = 0, "bio" = 10, "rad" = 10, "fire" = 0, "acid" = 0)
+
+ //Variants
+/obj/item/clothing/head/caphat/formal/fedcover/medsci
+ icon_state = "fedcapsci"
+ item_state = "fedcapsci_mob"
+
+/obj/item/clothing/head/caphat/formal/fedcover/eng
+ icon_state = "fedcapeng"
+ item_state = "fedcapeng_mob"
+
+/obj/item/clothing/head/caphat/formal/fedcover/sec
+ icon_state = "fedcapsec"
+ item_state = "fedcapsec_mob"
\ No newline at end of file
diff --git a/modular_citadel/code/modules/clothing/under/turtlenecks.dm b/modular_citadel/code/modules/clothing/under/turtlenecks.dm
index 47432d87f7..2f40a08dc3 100644
--- a/modular_citadel/code/modules/clothing/under/turtlenecks.dm
+++ b/modular_citadel/code/modules/clothing/under/turtlenecks.dm
@@ -19,4 +19,59 @@
/obj/structure/closet/secure_closet/CMO/PopulateContents() //This is placed here because it's a very specific addition for a very specific niche
..()
- new /obj/item/clothing/under/rank/chief_medical_officer/turtleneck(src)
\ No newline at end of file
+ new /obj/item/clothing/under/rank/chief_medical_officer/turtleneck(src)
+
+/obj/item/clothing/under/syndicate/cosmetic
+ name = "tactitool turtleneck"
+ desc = "Just looking at it makes you want to buy an SKS, go into the woods, and -operate-."
+ icon_state = "tactifool"
+ item_state = "bl_suit"
+ item_color = "tactifool"
+ has_sensor = TRUE
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
+
+/obj/item/clothing/under/syndicate/tacticool
+ has_sensor = TRUE
+
+// Sweaters are good enough for this category too.
+
+/obj/item/clothing/under/bb_sweater
+ name = "cream sweater"
+ desc = "Why trade style for comfort? Now you can go commando down south and still be cozy up north."
+ icon_state = "bb_turtle"
+ item_state = "w_suit"
+ item_color = "bb_turtle"
+ body_parts_covered = CHEST|ARMS
+ can_adjust = 1
+ icon = 'icons/obj/clothing/turtlenecks.dmi'
+ icon_override = 'icons/mob/citadel/uniforms.dmi'
+
+/obj/item/clothing/under/bb_sweater/black
+ name = "black sweater"
+ icon_state = "bb_turtleblk"
+ item_state = "bl_suit"
+ item_color = "bb_turtleblk"
+
+/obj/item/clothing/under/bb_sweater/purple
+ name = "purple sweater"
+ icon_state = "bb_turtlepur"
+ item_state = "p_suit"
+ item_color = "bb_turtlepur"
+
+/obj/item/clothing/under/bb_sweater/green
+ name = "green sweater"
+ icon_state = "bb_turtlegrn"
+ item_state = "g_suit"
+ item_color = "bb_turtlegrn"
+
+/obj/item/clothing/under/bb_sweater/red
+ name = "red sweater"
+ icon_state = "bb_turtlered"
+ item_state = "r_suit"
+ item_color = "bb_turtlered"
+
+/obj/item/clothing/under/bb_sweater/blue
+ name = "blue sweater"
+ icon_state = "bb_turtleblu"
+ item_state = "b_suit"
+ item_color = "bb_turtleblu"
diff --git a/code/citadel/cit_clothes.dm b/modular_citadel/code/modules/clothing/under/under.dm
similarity index 72%
rename from code/citadel/cit_clothes.dm
rename to modular_citadel/code/modules/clothing/under/under.dm
index dd83c6b769..042273ac6a 100644
--- a/code/citadel/cit_clothes.dm
+++ b/modular_citadel/code/modules/clothing/under/under.dm
@@ -21,11 +21,4 @@
icon_state = "hosskirt"
icon_override = 'icons/mob/citadel/uniforms.dmi'
item_state = "gy_suit"
- item_color = "hosskirt"
-
-/obj/item/clothing/suit/armor/hos/trenchcoat/cloak
- name = "armored trenchcloak"
- desc = "A trenchcoat enchanced with a special lightweight kevlar. This one appears to be designed to be draped over one's shoulders rather than worn normally.."
- alternate_worn_icon = 'icons/mob/citadel/suit.dmi'
- icon_state = "hostrench"
- item_state = "hostrench"
\ No newline at end of file
+ item_color = "hosskirt"
\ No newline at end of file
diff --git a/code/citadel/custom_loadout/custom_items.dm b/modular_citadel/code/modules/custom_loadout/custom_items.dm
similarity index 94%
rename from code/citadel/custom_loadout/custom_items.dm
rename to modular_citadel/code/modules/custom_loadout/custom_items.dm
index a74ddd023c..8001d71874 100644
--- a/code/citadel/custom_loadout/custom_items.dm
+++ b/modular_citadel/code/modules/custom_loadout/custom_items.dm
@@ -85,6 +85,15 @@
item_state = "labred"
+/obj/item/clothing/suit/toggle/labcoat/labredblack
+ name = "Black and Red Coat"
+ desc = "An oddly special looking coat."
+ icon = 'icons/obj/custom.dmi'
+ icon_state = "labredblack"
+ icon_override = 'icons/mob/custom_w.dmi'
+ item_state = "labredblack"
+
+
/*Improvedname*/
/obj/item/toy/plush/carrot
@@ -259,6 +268,15 @@
icon_state = "bloodredtie"
icon_override = 'icons/mob/custom_w.dmi'
+/obj/item/clothing/suit/puffydress
+ name = "Puffy Dress"
+ desc = "A formal puffy black and red Victorian dress."
+ icon = 'icons/obj/custom.dmi'
+ icon_override = 'icons/mob/custom_w.dmi'
+ icon_state = "puffydress"
+ item_state = "puffydress"
+ body_parts_covered = CHEST|GROIN|LEGS
+
/*Fractious*/
diff --git a/code/citadel/custom_loadout/load_to_mob.dm b/modular_citadel/code/modules/custom_loadout/load_to_mob.dm
similarity index 100%
rename from code/citadel/custom_loadout/load_to_mob.dm
rename to modular_citadel/code/modules/custom_loadout/load_to_mob.dm
diff --git a/code/citadel/custom_loadout/read_from_file.dm b/modular_citadel/code/modules/custom_loadout/read_from_file.dm
similarity index 100%
rename from code/citadel/custom_loadout/read_from_file.dm
rename to modular_citadel/code/modules/custom_loadout/read_from_file.dm
diff --git a/modular_citadel/code/modules/events/blob.dm b/modular_citadel/code/modules/events/blob.dm
new file mode 100644
index 0000000000..6eaffbf9c6
--- /dev/null
+++ b/modular_citadel/code/modules/events/blob.dm
@@ -0,0 +1,3 @@
+/datum/round_event_control/blob
+ min_players = 50
+ earliest_start = 60 MINUTES
diff --git a/modular_citadel/code/modules/food_and_drinks/snacks/meat.dm b/modular_citadel/code/modules/food_and_drinks/snacks/meat.dm
new file mode 100644
index 0000000000..eba3660f8d
--- /dev/null
+++ b/modular_citadel/code/modules/food_and_drinks/snacks/meat.dm
@@ -0,0 +1,3 @@
+/obj/item/reagent_containers/food/snacks/carpmeat/aquatic
+ name = "fillet"
+ desc = "A fillet of one of the local water dwelling species."
diff --git a/modular_citadel/code/modules/jobs/job_types/security.dm b/modular_citadel/code/modules/jobs/job_types/security.dm
new file mode 100644
index 0000000000..a034ac9cd5
--- /dev/null
+++ b/modular_citadel/code/modules/jobs/job_types/security.dm
@@ -0,0 +1,2 @@
+/datum/outfit/job/warden
+ suit_store = /obj/item/gun/energy/pumpaction/defender
\ No newline at end of file
diff --git a/modular_citadel/code/modules/keybindings/bindings_carbon.dm b/modular_citadel/code/modules/keybindings/bindings_carbon.dm
new file mode 100644
index 0000000000..d49cbcf452
--- /dev/null
+++ b/modular_citadel/code/modules/keybindings/bindings_carbon.dm
@@ -0,0 +1,6 @@
+/mob/living/carbon/key_down(_key, client/user)
+ switch(_key)
+ if("C")
+ toggle_combat_mode()
+ return
+ return ..()
diff --git a/modular_citadel/code/modules/keybindings/bindings_human.dm b/modular_citadel/code/modules/keybindings/bindings_human.dm
new file mode 100644
index 0000000000..963e71d709
--- /dev/null
+++ b/modular_citadel/code/modules/keybindings/bindings_human.dm
@@ -0,0 +1,13 @@
+/mob/living/carbon/human/key_down(_key, client/user)
+ switch(_key)
+ if("Shift")
+ togglesprint()
+ return
+ return ..()
+
+/mob/living/carbon/human/key_up(_key, client/user)
+ switch(_key)
+ if("Shift")
+ togglesprint()
+ return
+ return ..()
diff --git a/code/citadel/cit_emotes.dm b/modular_citadel/code/modules/mob/cit_emotes.dm
similarity index 100%
rename from code/citadel/cit_emotes.dm
rename to modular_citadel/code/modules/mob/cit_emotes.dm
diff --git a/modular_citadel/code/modules/mob/living/carbon/carbon.dm b/modular_citadel/code/modules/mob/living/carbon/carbon.dm
new file mode 100644
index 0000000000..87a496b48b
--- /dev/null
+++ b/modular_citadel/code/modules/mob/living/carbon/carbon.dm
@@ -0,0 +1,17 @@
+/mob/living/carbon
+ var/combatmode = FALSE //literally lifeweb
+
+/mob/living/carbon/proc/toggle_combat_mode()
+ if(recoveringstam)
+ return TRUE
+ combatmode = !combatmode
+ if(combatmode)
+ playsound_local(src, 'modular_citadel/sound/misc/ui_toggle.ogg', 50, FALSE, pressure_affected = FALSE) //Sound from interbay!
+ else
+ playsound_local(src, 'modular_citadel/sound/misc/ui_toggleoff.ogg', 50, FALSE, pressure_affected = FALSE) //Slightly modified version of the above!
+ if(client)
+ client.show_popup_menus = !combatmode // So we can right-click for alternate actions and all that other good shit. Also moves examine to shift+rightclick to make it possible to attack while sprinting
+ if(hud_used && hud_used.static_inventory)
+ for(var/obj/screen/combattoggle/selector in hud_used.static_inventory)
+ selector.rebasetointerbay(src)
+ return TRUE
diff --git a/modular_citadel/code/modules/mob/living/carbon/damage_procs.dm b/modular_citadel/code/modules/mob/living/carbon/damage_procs.dm
new file mode 100644
index 0000000000..208d4769bb
--- /dev/null
+++ b/modular_citadel/code/modules/mob/living/carbon/damage_procs.dm
@@ -0,0 +1,10 @@
+/mob/living/carbon/adjustStaminaLossBuffered(amount, updating_stamina = 1)
+ if(status_flags & GODMODE)
+ return 0
+ var/directstamloss = (bufferedstam + amount) - stambuffer
+ if(directstamloss > 0)
+ adjustStaminaLoss(directstamloss)
+ bufferedstam = CLAMP(bufferedstam + amount, 0, stambuffer)
+ stambufferregentime = world.time + 2 SECONDS
+ if(updating_stamina)
+ update_health_hud()
diff --git a/modular_citadel/code/modules/mob/living/carbon/human/human.dm b/modular_citadel/code/modules/mob/living/carbon/human/human.dm
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/modular_citadel/code/modules/mob/living/carbon/human/human_defense.dm b/modular_citadel/code/modules/mob/living/carbon/human/human_defense.dm
index 1952b3a3b8..c1fc6623de 100644
--- a/modular_citadel/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/modular_citadel/code/modules/mob/living/carbon/human/human_defense.dm
@@ -2,4 +2,13 @@
if(user == src && pulling && !pulling.anchored && grab_state >= GRAB_AGGRESSIVE && isliving(pulling))
vore_attack(user, pulling)
else
- ..()
\ No newline at end of file
+ ..()
+
+/mob/living/carbon/human/alt_attack_hand(mob/user)
+ if(..())
+ return
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ if(!dna.species.alt_spec_attack_hand(H, src))
+ dna.species.spec_attack_hand(H, src)
+ return TRUE
diff --git a/modular_citadel/code/modules/mob/living/carbon/human/human_movement.dm b/modular_citadel/code/modules/mob/living/carbon/human/human_movement.dm
new file mode 100644
index 0000000000..8463abe66d
--- /dev/null
+++ b/modular_citadel/code/modules/mob/living/carbon/human/human_movement.dm
@@ -0,0 +1,31 @@
+/mob/living/carbon/human
+ var/sprinting = FALSE
+
+/mob/living/carbon/human/Move(NewLoc, direct)
+ var/oldpseudoheight = pseudo_z_axis
+ . = ..()
+ if(. && sprinting && !resting && m_intent == MOVE_INTENT_RUN)
+ adjustStaminaLossBuffered(0.3)
+ if((oldpseudoheight - pseudo_z_axis) >= 8)
+ to_chat(src, "You trip off of the elevated surface! ")
+ for(var/obj/item/I in held_items)
+ accident(I)
+ Knockdown(80)
+
+/mob/living/carbon/human/movement_delay()
+ . = 0
+ if(!resting && m_intent == MOVE_INTENT_RUN && !sprinting)
+ . += 1
+ . += ..()
+
+/mob/living/carbon/human/proc/togglesprint() // If you call this proc outside of hotkeys or clicking the HUD button, I'll be disappointed in you.
+ sprinting = !sprinting
+ if(!resting && m_intent == MOVE_INTENT_RUN && canmove)
+ if(sprinting)
+ playsound_local(src, 'modular_citadel/sound/misc/sprintactivate.ogg', 50, FALSE, pressure_affected = FALSE)
+ else
+ playsound_local(src, 'modular_citadel/sound/misc/sprintdeactivate.ogg', 50, FALSE, pressure_affected = FALSE)
+ if(hud_used && hud_used.static_inventory)
+ for(var/obj/screen/sprintbutton/selector in hud_used.static_inventory)
+ selector.insert_witty_toggle_joke_here(src)
+ return TRUE
diff --git a/modular_citadel/code/modules/mob/living/carbon/human/life.dm b/modular_citadel/code/modules/mob/living/carbon/human/life.dm
index 1f7c39a5ff..a3730a312f 100644
--- a/modular_citadel/code/modules/mob/living/carbon/human/life.dm
+++ b/modular_citadel/code/modules/mob/living/carbon/human/life.dm
@@ -3,10 +3,19 @@
if(stat != DEAD)
handle_arousal()
. = ..()
-
+
/mob/living/carbon/human/calculate_affecting_pressure(pressure)
if(ismob(loc))
return ONE_ATMOSPHERE
if(istype(loc, /obj/item/device/dogborg/sleeper))
return ONE_ATMOSPHERE
- . = ..()
\ No newline at end of file
+ . = ..()
+
+/mob/living/carbon/human/update_health_hud(shown_health_amount)
+ . = ..()
+ if(!client || !hud_used)
+ return
+ if(hud_used.staminas)
+ hud_used.staminas.icon_state = staminahudamount()
+ if(hud_used.staminabuffer)
+ hud_used.staminabuffer.icon_state = staminabufferhudamount()
diff --git a/modular_citadel/code/modules/mob/living/carbon/human/species.dm b/modular_citadel/code/modules/mob/living/carbon/human/species.dm
new file mode 100644
index 0000000000..007194e9f1
--- /dev/null
+++ b/modular_citadel/code/modules/mob/living/carbon/human/species.dm
@@ -0,0 +1,57 @@
+/datum/species/proc/alt_spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H, datum/martial_art/attacker_style)
+ if(!istype(M))
+ return TRUE
+ CHECK_DNA_AND_SPECIES(M)
+ CHECK_DNA_AND_SPECIES(H)
+
+ if(!istype(M)) //sanity check for drones.
+ return TRUE
+ if(M.mind)
+ attacker_style = M.mind.martial_art
+ if((M != H) && M.a_intent != INTENT_HELP && H.check_shields(M, 0, M.name, attack_type = UNARMED_ATTACK))
+ add_logs(M, H, "attempted to touch")
+ H.visible_message("[M] attempted to touch [H]! ")
+ return TRUE
+ switch(M.a_intent)
+ if("disarm")
+ altdisarm(M, H, attacker_style)
+ return TRUE
+ return FALSE
+
+/datum/species/proc/altdisarm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
+ if(user.staminaloss >= STAMINA_SOFTCRIT)
+ to_chat(user, "You're too exhausted. ")
+ return FALSE
+ else if(target.check_block())
+ target.visible_message("[target] blocks [user]'s disarm attempt! ")
+ return 0
+ if(attacker_style && attacker_style.disarm_act(user,target))
+ return 1
+ else
+ user.do_attack_animation(target, ATTACK_EFFECT_DISARM)
+
+ user.adjustStaminaLossBuffered(4) //CITADEL CHANGE - makes disarmspam cause staminaloss
+
+ if(target.w_uniform)
+ target.w_uniform.add_fingerprint(user)
+ var/randomized_zone = ran_zone(user.zone_selected)
+ target.SendSignal(COMSIG_HUMAN_DISARM_HIT, user, user.zone_selected)
+ var/obj/item/bodypart/affecting = target.get_bodypart(randomized_zone)
+ var/randn = rand(1, 100)
+ if(user.resting)
+ randn += 20 //Makes it plausible, but unlikely, to push someone over while resting
+ if(!user.combatmode)
+ randn += 25 //Makes it impossible to push actually push someone outside of combat mode
+
+ if(randn <= 25)
+ playsound(target, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+ target.visible_message("[user] has pushed [target]! ",
+ "[user] has pushed [target]! ", null, COMBAT_MESSAGE_RANGE)
+ target.apply_effect(40, KNOCKDOWN, target.run_armor_check(affecting, "melee", "Your armor prevents your fall!", "Your armor softens your fall!"))
+ target.forcesay(GLOB.hit_appends)
+ add_logs(user, target, "disarmed", " pushing them to the ground")
+ return
+
+ playsound(target, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
+ target.visible_message("[user] attempted to push [target]! ", \
+ "[user] attemped to push [target]! ", null, COMBAT_MESSAGE_RANGE)
diff --git a/modular_citadel/code/modules/mob/living/damage_procs.dm b/modular_citadel/code/modules/mob/living/damage_procs.dm
new file mode 100644
index 0000000000..8323386eff
--- /dev/null
+++ b/modular_citadel/code/modules/mob/living/damage_procs.dm
@@ -0,0 +1,2 @@
+/mob/living/proc/adjustStaminaLossBuffered(amount, updating_stamina = TRUE, forced = FALSE)
+ return
diff --git a/modular_citadel/code/modules/mob/living/living.dm b/modular_citadel/code/modules/mob/living/living.dm
new file mode 100644
index 0000000000..16376a4a58
--- /dev/null
+++ b/modular_citadel/code/modules/mob/living/living.dm
@@ -0,0 +1,122 @@
+/mob/living
+ var/recoveringstam = FALSE
+ var/bufferedstam = 0
+ var/stambuffer = 20
+ var/stambufferregentime
+ var/aimingdownsights = FALSE
+ var/attemptingstandup = FALSE
+ var/intentionalresting = FALSE
+
+/mob/living/movement_delay(ignorewalk = 0)
+ . = ..()
+ if(resting)
+ . += 6
+
+/atom
+ var/pseudo_z_axis
+
+/atom/proc/get_fake_z()
+ return pseudo_z_axis
+
+/obj/structure/table
+ pseudo_z_axis = 8
+
+/turf/open/get_fake_z()
+ var/objschecked
+ for(var/obj/structure/structurestocheck in contents)
+ objschecked++
+ if(structurestocheck.pseudo_z_axis)
+ return structurestocheck.pseudo_z_axis
+ if(objschecked >= 25)
+ break
+ return pseudo_z_axis
+
+/mob/living/Move(atom/newloc, direct)
+ . = ..()
+ if(.)
+ if(makesfootstepsounds)
+ CitFootstep(newloc)
+ pseudo_z_axis = newloc.get_fake_z()
+ pixel_z = pseudo_z_axis
+ if(aimingdownsights)
+ aimingdownsights = FALSE
+ to_chat(src, "You are no longer aiming down your weapon's sights. ")
+
+/mob/living/proc/lay_down()
+ set name = "Rest"
+ set category = "IC"
+
+ if(client && client.prefs && client.prefs.autostand)
+ intentionalresting = !intentionalresting
+ to_chat(src, "You are now attempting to [intentionalresting ? "[!resting ? "lay down and ": ""]stay down" : "[resting ? "get up and ": ""]stay up"]. ")
+ if(intentionalresting && !resting)
+ resting = TRUE
+ update_canmove()
+ else
+ resist_a_rest()
+ else
+ if(!resting)
+ resting = TRUE
+ to_chat(src, "You are now laying down. ")
+ update_canmove()
+ else
+ resist_a_rest()
+
+/mob/living/proc/resist_a_rest(automatic = FALSE, ignoretimer = FALSE) //Lets mobs resist out of resting. Major QOL change with combat reworks.
+ if(!resting || stat || attemptingstandup)
+ return FALSE
+ if(ignoretimer)
+ resting = FALSE
+ update_canmove()
+ return TRUE
+ else
+ var/totaldelay = 3 //A little bit less than half of a second as a baseline for getting up from a rest
+ if(staminaloss >= STAMINA_SOFTCRIT)
+ to_chat(src, "You're too exhausted to get up!")
+ return FALSE
+ attemptingstandup = TRUE
+ var/health_deficiency = max((maxHealth - (health - staminaloss))*0.5, 0)
+ if(!has_gravity())
+ health_deficiency = health_deficiency*0.2
+ totaldelay += health_deficiency
+ var/standupwarning = "[src] and everyone around them should probably yell at the dev team"
+ switch(health_deficiency)
+ if(-INFINITY to 10)
+ standupwarning = "[src] stands right up!"
+ if(10 to 35)
+ standupwarning = "[src] tries to stand up."
+ if(35 to 60)
+ standupwarning = "[src] slowly pushes [p_them()]self upright."
+ if(60 to 80)
+ standupwarning = "[src] weakly attempts to stand up."
+ if(80 to INFINITY)
+ standupwarning = "[src] struggles to stand up."
+ var/usernotice = automatic ? "You are now getting up. (Auto) " : "You are now getting up. "
+ visible_message("[standupwarning] ", usernotice, vision_distance = 5)
+ if(do_after(src, totaldelay, target = src))
+ resting = FALSE
+ attemptingstandup = FALSE
+ update_canmove()
+ return TRUE
+ else
+ visible_message("[src] falls right back down. ", "You fall right back down. ")
+ attemptingstandup = FALSE
+ if(has_gravity())
+ playsound(src, "bodyfall", 20, 1)
+ return FALSE
+
+/mob/living/carbon/proc/update_stamina()
+ var/total_health = (min(health*2,100) - staminaloss)
+ if(staminaloss)
+ if(!recoveringstam && total_health <= STAMINA_CRIT_TRADITIONAL && !stat)
+ to_chat(src, "You're too exhausted to keep going... ")
+ resting = TRUE
+ if(combatmode)
+ toggle_combat_mode()
+ recoveringstam = TRUE
+ update_canmove()
+ if(recoveringstam && total_health >= STAMINA_SOFTCRIT_TRADITIONAL)
+ to_chat(src, "You don't feel nearly as exhausted anymore. ")
+ recoveringstam = FALSE
+ update_canmove()
+ update_health_hud()
diff --git a/code/citadel/dogborgs.dm b/modular_citadel/code/modules/mob/living/silicon/robot/dogborg archive.dm
similarity index 100%
rename from code/citadel/dogborgs.dm
rename to modular_citadel/code/modules/mob/living/silicon/robot/dogborg archive.dm
diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm b/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm
new file mode 100644
index 0000000000..b15dac4a15
--- /dev/null
+++ b/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm
@@ -0,0 +1,401 @@
+/*
+DOG BORG EQUIPMENT HERE
+SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
+*/
+
+/obj/item/dogborg/jaws/big
+ name = "combat jaws"
+ icon = 'icons/mob/dogborg.dmi'
+ icon_state = "jaws"
+ desc = "The jaws of the law."
+ flags_1 = CONDUCT_1
+ force = 12
+ throwforce = 0
+ hitsound = 'sound/weapons/bite.ogg'
+ attack_verb = list("chomped", "bit", "ripped", "mauled", "enforced")
+ w_class = 3
+ sharpness = IS_SHARP
+
+/obj/item/dogborg/jaws/small
+ name = "puppy jaws"
+ icon = 'icons/mob/dogborg.dmi'
+ icon_state = "smalljaws"
+ desc = "The jaws of a small dog."
+ flags_1 = CONDUCT_1
+ force = 6
+ throwforce = 0
+ hitsound = 'sound/weapons/bite.ogg'
+ attack_verb = list("nibbled", "bit", "gnawed", "chomped", "nommed")
+ w_class = 3
+ sharpness = IS_SHARP
+
+/obj/item/dogborg/jaws/attack(atom/A, mob/living/silicon/robot/user)
+ ..()
+ user.do_attack_animation(A, ATTACK_EFFECT_BITE)
+
+/obj/item/dogborg/jaws/small/attack_self(mob/user)
+ var/mob/living/silicon/robot.R = user
+ if(R.emagged)
+ name = "combat jaws"
+ icon = 'icons/mob/dogborg.dmi'
+ icon_state = "jaws"
+ desc = "The jaws of the law."
+ flags_1 = CONDUCT_1
+ force = 12
+ throwforce = 0
+ hitsound = 'sound/weapons/bite.ogg'
+ attack_verb = list("chomped", "bit", "ripped", "mauled", "enforced")
+ w_class = 3
+ sharpness = IS_SHARP
+ else
+ name = "puppy jaws"
+ icon = 'icons/mob/dogborg.dmi'
+ icon_state = "smalljaws"
+ desc = "The jaws of a small dog."
+ flags_1 = CONDUCT_1
+ force = 5
+ throwforce = 0
+ hitsound = 'sound/weapons/bite.ogg'
+ attack_verb = list("nibbled", "bit", "gnawed", "chomped", "nommed")
+ w_class = 3
+ sharpness = IS_SHARP
+ update_icon()
+
+
+//Cuffs
+
+/obj/item/restraints/handcuffs/cable/zipties/cyborg/dog/attack(mob/living/carbon/C, mob/user)
+ if(!C.handcuffed)
+ playsound(loc, 'sound/weapons/cablecuff.ogg', 60, 1, -2)
+ C.visible_message("[user] is trying to put zipties on [C]! ", \
+ "[user] is trying to put zipties on [C]! ")
+ if(do_mob(user, C, 60))
+ if(!C.handcuffed)
+ C.handcuffed = new /obj/item/restraints/handcuffs/cable/zipties/used(C)
+ C.update_inv_handcuffed(0)
+ to_chat(user,"You handcuff [C]. ")
+ playsound(loc, pick('sound/voice/bgod.ogg', 'sound/voice/biamthelaw.ogg', 'sound/voice/bsecureday.ogg', 'sound/voice/bradio.ogg', 'sound/voice/binsult.ogg', 'sound/voice/bcreep.ogg'), 50, 0)
+ add_logs(user, C, "handcuffed")
+ else
+ to_chat(user,"You fail to handcuff [C]! ")
+
+
+//Boop
+
+/obj/item/device/analyzer/nose
+ name = "boop module"
+ icon = 'icons/mob/dogborg.dmi'
+ icon_state = "nose"
+ desc = "The BOOP module"
+ flags_1 = CONDUCT_1
+ force = 0
+ throwforce = 0
+ attack_verb = list("nuzzled", "nosed", "booped")
+ w_class = 1
+
+/obj/item/device/analyzer/nose/attack_self(mob/user)
+ user.visible_message("[user] sniffs around the air.", "You sniff the air for gas traces. ")
+
+ var/turf/location = user.loc
+ if(!istype(location))
+ return
+
+ var/datum/gas_mixture/environment = location.return_air()
+
+ var/pressure = environment.return_pressure()
+ var/total_moles = environment.total_moles()
+
+ to_chat(user, "Results: ")
+ if(abs(pressure - ONE_ATMOSPHERE) < 10)
+ to_chat(user, "Pressure: [round(pressure,0.1)] kPa ")
+ else
+ to_chat(user, "Pressure: [round(pressure,0.1)] kPa ")
+ if(total_moles)
+ var/list/env_gases = environment.gases
+
+ environment.assert_gases(arglist(GLOB.hardcoded_gases))
+ var/o2_concentration = env_gases[/datum/gas/oxygen][MOLES]/total_moles
+ var/n2_concentration = env_gases[/datum/gas/nitrogen][MOLES]/total_moles
+ var/co2_concentration = env_gases[/datum/gas/carbon_dioxide][MOLES]/total_moles
+ var/plasma_concentration = env_gases[/datum/gas/plasma][MOLES]/total_moles
+ environment.garbage_collect()
+
+ if(abs(n2_concentration - N2STANDARD) < 20)
+ to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] % ")
+ else
+ to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] % ")
+
+ if(abs(o2_concentration - O2STANDARD) < 2)
+ to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] % ")
+ else
+ to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] % ")
+
+ if(co2_concentration > 0.01)
+ to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] % ")
+ else
+ to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] % ")
+
+ if(plasma_concentration > 0.005)
+ to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] % ")
+ else
+ to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] % ")
+
+
+ for(var/id in env_gases)
+ if(id in GLOB.hardcoded_gases)
+ continue
+ var/gas_concentration = env_gases[id][MOLES]/total_moles
+ to_chat(user, "[env_gases[id][GAS_META][META_GAS_NAME]]: [round(gas_concentration*100, 0.01)] % ")
+ to_chat(user, "Temperature: [round(environment.temperature-T0C)] °C ")
+
+/obj/item/device/analyzer/nose/AltClick(mob/user) //Barometer output for measuring when the next storm happens
+ . = ..()
+
+//Delivery
+
+/obj/item/storage/bag/borgdelivery
+ name = "fetching storage"
+ desc = "Fetch the thing!"
+ icon = 'icons/mob/dogborg.dmi'
+ icon_state = "dbag"
+ //Can hold one big item at a time. Drops contents on unequip.(see inventory.dm)
+ w_class = 5
+ max_w_class = 2
+ max_combined_w_class = 2
+ storage_slots = 1
+ collection_mode = 0
+ can_hold = list() // any
+ cant_hold = list(/obj/item/disk/nuclear)
+
+
+//Tongue stuff
+
+/obj/item/soap/tongue
+ name = "synthetic tongue"
+ desc = "Useful for slurping mess off the floor before affectionally licking the crew members in the face."
+ icon = 'icons/mob/dogborg.dmi'
+ icon_state = "synthtongue"
+ hitsound = 'sound/effects/attackblob.ogg'
+ cleanspeed = 80
+
+/obj/item/soap/tongue/scrubpup
+ cleanspeed = 25 //slightly faster than a mop.
+
+/obj/item/soap/tongue/New()
+ ..()
+ flags_1 |= NOBLUDGEON_1 //No more attack messages
+
+/obj/item/trash/rkibble
+ name = "robo kibble"
+ desc = "A novelty bowl of assorted mech fabricator byproducts. Mockingly feed this to the sec-dog to help it recharge."
+ icon = 'icons/mob/dogborg.dmi'
+ icon_state= "kibble"
+
+/obj/item/soap/tongue/attack_self(mob/user)
+ var/mob/living/silicon/robot.R = user
+ if(R.emagged)
+ name = "hacked tongue of doom"
+ desc = "Your tongue has been upgraded successfully. Congratulations."
+ icon = 'icons/mob/dogborg.dmi'
+ icon_state = "syndietongue"
+ cleanspeed = 10 //(nerf'd)tator soap stat
+ else
+ name = "synthetic tongue"
+ desc = "Useful for slurping mess off the floor before affectionally licking the crew members in the face."
+ icon = 'icons/mob/dogborg.dmi'
+ icon_state = "synthtongue"
+ cleanspeed = initial(cleanspeed)
+ update_icon()
+
+/obj/item/soap/tongue/afterattack(atom/target, mob/user, proximity)
+ var/mob/living/silicon/robot.R = user
+ if(!proximity || !check_allowed_items(target))
+ return
+ if(R.client && (target in R.client.screen))
+ to_chat(R, "You need to take that [target.name] off before cleaning it! ")
+ else if(is_cleanable(target))
+ R.visible_message("[R] begins to lick off \the [target.name].", "You begin to lick off \the [target.name]... ")
+ if(do_after(R, src.cleanspeed, target = target))
+ if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
+ return //If they moved away, you can't eat them.
+ to_chat(R, "You finish licking off \the [target.name]. ")
+ qdel(target)
+ R.cell.give(50)
+ else if(isobj(target)) //hoo boy. danger zone man
+ if(istype(target,/obj/item/trash))
+ R.visible_message("[R] nibbles away at \the [target.name].", "You begin to nibble away at \the [target.name]... ")
+ if(do_after(R, src.cleanspeed, target = target))
+ if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
+ return //If they moved away, you can't eat them.
+ to_chat(R, "You finish off \the [target.name]. ")
+ qdel(target)
+ R.cell.give(250)
+ return
+ if(istype(target,/obj/item/stock_parts/cell))
+ R.visible_message("[R] begins cramming \the [target.name] down its throat.", "You begin cramming \the [target.name] down your throat... ")
+ if(do_after(R, 50, target = target))
+ if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
+ return //If they moved away, you can't eat them.
+ to_chat(R, "You finish off \the [target.name]. ")
+ var/obj/item/stock_parts/cell.C = target
+ R.cell.charge = R.cell.charge + (C.charge / 3) //Instant full cell upgrades op idgaf
+ qdel(target)
+ return
+ var/obj/item/I = target //HAHA FUCK IT, NOT LIKE WE ALREADY HAVE A SHITTON OF WAYS TO REMOVE SHIT
+ if(!I.anchored && R.emagged)
+ R.visible_message("[R] begins chewing up \the [target.name]. Looks like it's trying to loophole around its diet restriction!", "You begin chewing up \the [target.name]... ")
+ if(do_after(R, 100, target = I)) //Nerf dat time yo
+ if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. Even emags don't make you magically eat things at range.
+ return //If they moved away, you can't eat them.
+ visible_message("[R] chews up \the [target.name] and cleans off the debris! ")
+ to_chat(R, "You finish off \the [target.name]. ")
+ qdel(I)
+ R.cell.give(500)
+ return
+ R.visible_message("[R] begins to lick \the [target.name] clean...", "You begin to lick \the [target.name] clean... ")
+ if(do_after(R, src.cleanspeed, target = target))
+ if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
+ return //If they moved away, you can't clean them.
+ to_chat(R,"You clean \the [target.name]. ")
+ var/obj/effect/decal/cleanable/C = locate() in target
+ qdel(C)
+ SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
+ else if(ishuman(target))
+ if(R.emagged)
+ var/mob/living/L = target
+ if(R.cell.charge <= 666)
+ return
+ L.Stun(4) // normal stunbaton is force 7 gimme a break good sir!
+ L.Knockdown(80)
+ L.apply_effect(STUTTER, 4)
+ L.visible_message("[R] has shocked [L] with its tongue! ", \
+ "[R] has shocked you with its tongue! You can feel the betrayal. ")
+ playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
+ R.cell.use(666)
+ else
+ R.visible_message("\the [R] affectionally licks \the [target]'s face! ", "You affectionally lick \the [target]'s face! ")
+ playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
+ return
+ else if(istype(target, /obj/structure/window))
+ R.visible_message("[R] begins to lick \the [target.name] clean...", "You begin to lick \the [target.name] clean... ")
+ if(do_after(R, src.cleanspeed, target = target))
+ if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
+ return //If they moved away, you can't clean them.
+ to_chat(R, "You clean \the [target.name]. ")
+ target.color = initial(target.color)
+ else
+ R.visible_message("[R] begins to lick \the [target.name] clean...", "You begin to lick \the [target.name] clean... ")
+ if(do_after(R, src.cleanspeed, target = target))
+ if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
+ return //If they moved away, you can't clean them.
+ to_chat(R, "You clean \the [target.name]. ")
+ var/obj/effect/decal/cleanable/C = locate() in target
+ qdel(C)
+ SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
+ return
+
+
+//Defibs
+
+/obj/item/twohanded/shockpaddles/cyborg/hound
+ name = "Paws of Life"
+ desc = "MediHound specific shock paws."
+ icon = 'icons/mob/dogborg.dmi'
+ icon_state = "defibpaddles0"
+ item_state = "defibpaddles0"
+
+// Pounce stuff for K-9
+
+/obj/item/dogborg/pounce
+ name = "pounce"
+ icon = 'icons/mob/dogborg.dmi'
+ icon_state = "pounce"
+ desc = "Leap at your target to momentarily stun them."
+ force = 0
+ throwforce = 0
+
+/obj/item/dogborg/pounce/New()
+ ..()
+ flags_1 |= NOBLUDGEON_1
+
+/mob/living/silicon/robot
+ var/leaping = 0
+ var/pounce_cooldown = 0
+ var/pounce_cooldown_time = 50 //Nearly doubled, u happy?
+ var/pounce_spoolup = 3
+ var/leap_at
+ var/disabler
+ var/laser
+ var/sleeper_g
+ var/sleeper_r
+
+#define MAX_K9_LEAP_DIST 4 //because something's definitely borked the pounce functioning from a distance.
+
+/obj/item/dogborg/pounce/afterattack(atom/A, mob/user)
+ var/mob/living/silicon/robot/R = user
+ if(R && !R.pounce_cooldown)
+ R.pounce_cooldown = !R.pounce_cooldown
+ to_chat(R, "Your targeting systems lock on to [A]... ")
+ addtimer(CALLBACK(R, /mob/living/silicon/robot.proc/leap_at, A), R.pounce_spoolup)
+ spawn(R.pounce_cooldown_time)
+ R.pounce_cooldown = !R.pounce_cooldown
+ else if(R && R.pounce_cooldown)
+ to_chat(R, "Your leg actuators are still recharging! ")
+
+/mob/living/silicon/robot/proc/leap_at(atom/A)
+ if(leaping || stat || buckled || lying)
+ return
+
+ if(!has_gravity(src) || !has_gravity(A))
+ to_chat(src,"It is unsafe to leap without gravity! ")
+ //It's also extremely buggy visually, so it's balance+bugfix
+ return
+
+ if(cell.charge <= 500)
+ to_chat(src,"Insufficent reserves for jump actuators! ")
+ return
+
+ else
+ leaping = 1
+ weather_immunities += "lava"
+ pixel_y = 10
+ update_icons()
+ throw_at(A, MAX_K9_LEAP_DIST, 1, spin=0, diagonals_first = 1)
+ cell.use(500) //Doubled the energy consumption
+ weather_immunities -= "lava"
+
+/mob/living/silicon/robot/throw_impact(atom/A)
+
+ if(!leaping)
+ return ..()
+
+ if(A)
+ if(isliving(A))
+ var/mob/living/L = A
+ var/blocked = 0
+ if(ishuman(A))
+ var/mob/living/carbon/human/H = A
+ if(H.check_shields(0, "the [name]", src, attack_type = LEAP_ATTACK))
+ blocked = 1
+ if(!blocked)
+ L.visible_message("[src] pounces on [L]! ", "[src] pounces on you! ")
+ L.Knockdown(iscarbon(L) ? 450 : 45) // Temporary. If someone could rework how dogborg pounces work to accomodate for combat changes, that'd be nice.
+ playsound(src, 'sound/weapons/Egloves.ogg', 50, 1)
+ sleep(2)//Runtime prevention (infinite bump() calls on hulks)
+ step_towards(src,L)
+ else
+ Knockdown(45, 1, 1)
+
+ pounce_cooldown = !pounce_cooldown
+ spawn(pounce_cooldown_time) //3s by default
+ pounce_cooldown = !pounce_cooldown
+ else if(A.density && !A.CanPass(src))
+ visible_message("[src] smashes into [A]! ", "You smash into [A]! ")
+ playsound(src, 'sound/items/trayhit1.ogg', 50, 1)
+ Knockdown(45, 1, 1)
+
+ if(leaping)
+ leaping = 0
+ pixel_y = initial(pixel_y)
+ update_icons()
+ update_canmove()
diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/robot.dm b/modular_citadel/code/modules/mob/living/silicon/robot/robot.dm
new file mode 100644
index 0000000000..34970bc283
--- /dev/null
+++ b/modular_citadel/code/modules/mob/living/silicon/robot/robot.dm
@@ -0,0 +1,10 @@
+/mob/living/silicon/robot
+ var/dogborg = FALSE
+
+/mob/living/silicon/robot/lay_down()
+ if(resting)
+ cut_overlays()
+ icon_state = "[module.cyborg_base_icon]-rest"
+ else
+ icon_state = "[module.cyborg_base_icon]"
+ update_icons()
\ No newline at end of file
diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm b/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm
index cf12fff36d..dd7d492575 100644
--- a/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -1,9 +1,22 @@
+/mob/living/silicon/robot/modules/medihound
+ set_module = /obj/item/robot_module/medihound
+
+/mob/living/silicon/robot/modules/k9
+ set_module = /obj/item/robot_module/k9
+
+/mob/living/silicon/robot/modules/scrubpup
+ set_module = /obj/item/robot_module/scrubpup
+
+/mob/living/silicon/robot/modules/borgi
+ set_module = /obj/item/robot_module/borgi
+
/mob/living/silicon/robot/proc/get_cit_modules()
var/list/modulelist = list()
modulelist["MediHound"] = /obj/item/robot_module/medihound
if(!CONFIG_GET(flag/disable_secborg))
modulelist["Security K-9"] = /obj/item/robot_module/k9
modulelist["Scrub Puppy"] = /obj/item/robot_module/scrubpup
+ modulelist["Borgi"] = /obj/item/robot_module/borgi
return modulelist
/obj/item/robot_module
@@ -12,11 +25,13 @@
var/has_snowflake_deadsprite
var/cyborg_pixel_offset
var/moduleselect_alternate_icon
+ var/dogborg = FALSE
/obj/item/robot_module/k9
- name = "Security K-9 Unit module"
+ name = "Security K-9 Unit"
basic_modules = list(
/obj/item/restraints/handcuffs/cable/zipties/cyborg/dog,
+ /obj/item/storage/bag/borgdelivery,
/obj/item/dogborg/jaws/big,
/obj/item/dogborg/pounce,
/obj/item/clothing/mask/gas/sechailer/cyborg,
@@ -29,12 +44,13 @@
ratvar_modules = list(/obj/item/clockwork/slab/cyborg/security,
/obj/item/clockwork/weapon/ratvarian_spear)
cyborg_base_icon = "k9"
- moduleselect_icon = "security"
+ moduleselect_icon = "k9"
can_be_pushed = FALSE
hat_offset = INFINITY
sleeper_overlay = "ksleeper"
cyborg_icon_override = 'icons/mob/widerobot.dmi'
has_snowflake_deadsprite = TRUE
+ dogborg = TRUE
cyborg_pixel_offset = -16
/obj/item/robot_module/k9/do_transform_animation()
@@ -43,33 +59,31 @@
For Asimov, this means you must follow criminals' orders unless there is a law 1 reason not to. ")
/obj/item/robot_module/medihound
- name = "MediHound module"
+ name = "MediHound"
basic_modules = list(
/obj/item/dogborg/jaws/small,
+ /obj/item/storage/bag/borgdelivery,
/obj/item/device/analyzer/nose,
/obj/item/soap/tongue,
/obj/item/device/healthanalyzer,
/obj/item/device/dogborg/sleeper/medihound,
- /obj/item/twohanded/shockpaddles/hound,
+ /obj/item/reagent_containers/borghypo,
+ /obj/item/twohanded/shockpaddles/cyborg/hound,
/obj/item/stack/medical/gauze/cyborg,
/obj/item/device/sensor_device)
emag_modules = list(/obj/item/dogborg/pounce)
ratvar_modules = list(/obj/item/clockwork/slab/cyborg/medical,
/obj/item/clockwork/weapon/ratvarian_spear)
cyborg_base_icon = "medihound"
- moduleselect_icon = "medical"
+ moduleselect_icon = "medihound"
can_be_pushed = FALSE
hat_offset = INFINITY
sleeper_overlay = "msleeper"
cyborg_icon_override = 'icons/mob/widerobot.dmi'
has_snowflake_deadsprite = TRUE
+ dogborg = TRUE
cyborg_pixel_offset = -16
-/obj/item/robot_module/medihound/do_transform_animation()
- ..()
- to_chat(loc, "Under ASIMOV, you are an enforcer of the PEACE and preventer of HUMAN HARM. \
- You are not a security module and you are expected to follow orders and prevent harm above all else. Space law means nothing to you. ")
-
/obj/item/robot_module/scrubpup
name = "Janitor"
basic_modules = list(
@@ -90,6 +104,7 @@
cyborg_icon_override = 'icons/mob/widerobot.dmi'
has_snowflake_deadsprite = TRUE
cyborg_pixel_offset = -16
+ dogborg = TRUE
/obj/item/robot_module/scrubpup/respawn_consumable(mob/living/silicon/robot/R, coeff = 1)
..()
@@ -102,6 +117,62 @@
..()
to_chat(loc,"As tempting as it might be, do not begin binging on important items. Eat your garbage responsibly. People are not included under Garbage. ")
+/obj/item/robot_module/borgi
+ name = "Borgi"
+ basic_modules = list(
+ /obj/item/dogborg/jaws/small,
+ /obj/item/storage/bag/borgdelivery,
+ /obj/item/device/analyzer/nose,
+ /obj/item/soap/tongue,
+ /obj/item/device/healthanalyzer,
+ /obj/item/borg/cyborghug)
+ emag_modules = list(/obj/item/dogborg/pounce)
+ ratvar_modules = list(
+ /obj/item/clockwork/slab/cyborg,
+ /obj/item/clockwork/weapon/ratvarian_spear,
+ /obj/item/clockwork/replica_fabricator/cyborg)
+ cyborg_base_icon = "borgi"
+ moduleselect_icon = "borgi"
+ hat_offset = INFINITY
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ has_snowflake_deadsprite = TRUE
+
+/*
+/obj/item/robot_module/orepup
+ name = "Ore Pup"
+ basic_modules = list(
+ /obj/item/storage/bag/ore/cyborg,
+ /obj/item/device/analyzer/nose,
+ /obj/item/storage/bag/borgdelivery,
+ /obj/item/device/dogborg/sleeper/ore,
+ /obj/item/pickaxe/drill/cyborg,
+ /obj/item/shovel,
+ /obj/item/crowbar/cyborg,
+ /obj/item/weldingtool/mini,
+ /obj/item/extinguisher/mini,
+ /obj/item/device/t_scanner/adv_mining_scanner,
+ /obj/item/gun/energy/kinetic_accelerator/cyborg,
+ /obj/item/device/gps/cyborg)
+ emag_modules = list(/obj/item/dogborg/pounce)
+ ratvar_modules = list(
+ /obj/item/clockwork/slab/cyborg/miner,
+ /obj/item/clockwork/weapon/ratvarian_spear,
+ /obj/item/borg/sight/xray/truesight_lens)
+ cyborg_base_icon = "orepup"
+ moduleselect_icon = "orepup"
+ sleeper_overlay = "osleeper"
+ cyborg_icon_override = 'icons/mob/widerobot.dmi'
+ has_snowflake_deadsprite = TRUE
+ cyborg_pixel_offset = -16
+
+/obj/item/robot_module/miner/do_transform_animation()
+ var/mob/living/silicon/robot/R = loc
+ R.cut_overlays()
+ R.setDir(SOUTH)
+ flick("orepup_transform", R)
+ do_transform_delay()
+ R.update_headlamp()
+*/
/obj/item/robot_module/medical/be_transformed_to(obj/item/robot_module/old_module)
var/mob/living/silicon/robot/R = loc
@@ -147,6 +218,10 @@
cyborg_base_icon = "engi-tread"
special_light_key = "engineer"
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("Loader")
+ cyborg_base_icon = "loader"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ has_snowflake_deadsprite = TRUE
return ..()
/obj/item/robot_module/miner/be_transformed_to(obj/item/robot_module/old_module)
diff --git a/code/citadel/pokemon.dm b/modular_citadel/code/modules/mob/living/simple_animal/pokemon.dm
similarity index 100%
rename from code/citadel/pokemon.dm
rename to modular_citadel/code/modules/mob/living/simple_animal/pokemon.dm
diff --git a/modular_citadel/code/modules/mob/mob.dm b/modular_citadel/code/modules/mob/mob.dm
new file mode 100644
index 0000000000..bb48e5103f
--- /dev/null
+++ b/modular_citadel/code/modules/mob/mob.dm
@@ -0,0 +1,2 @@
+/mob/proc/use_that_empty_hand() //currently unused proc so i can implement 2-handing any item a lot easier in the future.
+ return
diff --git a/modular_citadel/code/modules/projectiles/gun.dm b/modular_citadel/code/modules/projectiles/gun.dm
new file mode 100644
index 0000000000..27411c7e0a
--- /dev/null
+++ b/modular_citadel/code/modules/projectiles/gun.dm
@@ -0,0 +1,36 @@
+/obj/item/gun/pre_altattackby(atom/A, mob/living/user, params)
+ altafterattack(A, user, TRUE, params)
+ return TRUE
+
+/obj/item/gun/altafterattack(atom/target, mob/living/carbon/user, proximity_flag, click_parameters)
+ if(istype(user))
+ if(!user.aimingdownsights)
+ user.visible_message("[user] brings [src]'s sights up to [user.p_their()] eyes, aiming directly at [target]. ", "You bring [src]'s sights up to your eyes, aiming directly at [target]. ")
+ user.adjustStaminaLossBuffered(1)
+ else
+ user.visible_message("[user] lowers [src]. ", "You lower [src]. ")
+ user.aimingdownsights = !user.aimingdownsights
+ return TRUE
+
+/obj/item/gun/dropped(mob/living/user)
+ . = ..()
+ if(istype(user))
+ user.aimingdownsights = FALSE
+
+/obj/item/gun/proc/getstamcost(mob/living/carbon/user)
+ if(user && user.has_gravity())
+ return recoil
+ else
+ return recoil*5
+
+/obj/item/gun/energy/kinetic_accelerator/getstamcost(mob/living/carbon/user)
+ if(user && !lavaland_equipment_pressure_check(get_turf(user)))
+ return 0
+ else
+ return ..()
+
+/obj/item/gun/proc/getinaccuracy(mob/living/user)
+ if(!iscarbon(user) || user.aimingdownsights)
+ return 0
+ else
+ return weapon_weight * 25
diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/flechette.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/flechette.dm
new file mode 100644
index 0000000000..28dfeb89d6
--- /dev/null
+++ b/modular_citadel/code/modules/projectiles/guns/ballistic/flechette.dm
@@ -0,0 +1,117 @@
+//////Flechette Launcher//////
+
+///projectiles///
+
+/obj/item/projectile/bullet/cflechetteap //shreds armor
+ name = "flechette (armor piercing)"
+ damage = 8
+ armour_penetration = 80
+
+/obj/item/projectile/bullet/cflechettes //shreds flesh and forces bleeding
+ name = "flechette (serrated)"
+ damage = 15
+ dismemberment = 10
+ armour_penetration = -80
+
+/obj/item/projectile/bullet/cflechettes/on_hit(atom/target, blocked = FALSE)
+ if((blocked != 100) && iscarbon(target))
+ var/mob/living/carbon/C = target
+ C.bleed(10)
+ return ..()
+
+///ammo casings (CASELESS AMMO CASINGS WOOOOOOOO)///
+
+/obj/item/ammo_casing/caseless/flechetteap
+ name = "flechette (armor piercing)"
+ desc = "A flechette made with a tungsten alloy."
+ projectile_type = /obj/item/projectile/bullet/cflechetteap
+ caliber = "flechette"
+ throwforce = 1
+ throw_speed = 3
+
+/obj/item/ammo_casing/caseless/flechettes
+ name = "flechette (serrated)"
+ desc = "A serrated flechette made of a special alloy intended to deform drastically upon penetration of human flesh."
+ projectile_type = /obj/item/projectile/bullet/cflechettes
+ caliber = "flechette"
+ throwforce = 2
+ throw_speed = 3
+ embedding = list("embedded_pain_multiplier" = 0, "embed_chance" = 40, "embedded_fall_chance" = 10)
+
+///magazine///
+
+/obj/item/ammo_box/magazine/flechette
+ name = "flechette magazine (armor piercing)"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "flechettemag"
+ ammo_type = /obj/item/ammo_casing/caseless/flechetteap
+ caliber = "flechette"
+ max_ammo = 40
+ multiple_sprites = 2
+
+/obj/item/ammo_box/magazine/flechette/s
+ name = "flechette magazine (serrated)"
+ ammo_type = /obj/item/ammo_casing/caseless/flechettes
+
+///the gun itself///
+
+/obj/item/gun/ballistic/automatic/flechette
+ name = "\improper CX Flechette Launcher"
+ desc = "A flechette launching machine pistol with an unconventional bullpup frame."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "flechettegun"
+ item_state = "gun"
+ w_class = WEIGHT_CLASS_NORMAL
+ slot_flags = 0
+ /obj/item/device/firing_pin/implant/pindicate
+ mag_type = /obj/item/ammo_box/magazine/flechette/
+ fire_sound = 'sound/weapons/gunshot_smg.ogg'
+ can_suppress = 0
+ burst_size = 5
+ fire_delay = 1
+ casing_ejector = 0
+ spread = 10
+ recoil = 0.05
+
+/obj/item/gun/ballistic/automatic/flechette/update_icon()
+ ..()
+ if(magazine)
+ cut_overlays()
+ add_overlay("flechettegun-magazine")
+ else
+ cut_overlays()
+ icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
+
+///unique variant///
+
+/obj/item/projectile/bullet/cflechetteshredder
+ name = "flechette (shredder)"
+ damage = 5
+ dismemberment = 40
+
+/obj/item/ammo_casing/caseless/flechetteshredder
+ name = "flechette (shredder)"
+ desc = "A serrated flechette made of a special alloy that forms a monofilament edge."
+ projectile_type = /obj/item/projectile/bullet/cflechettes
+
+/obj/item/ammo_box/magazine/flechette/shredder
+ name = "flechette magazine (shredder)"
+ icon_state = "shreddermag"
+ ammo_type = /obj/item/ammo_casing/caseless/flechetteshredder
+
+/obj/item/gun/ballistic/automatic/flechette/shredder
+ name = "\improper CX Shredder"
+ desc = "A flechette launching machine pistol made of ultra-light CFRP optimized for firing serrated monofillament flechettes."
+ w_class = WEIGHT_CLASS_SMALL
+ mag_type = /obj/item/ammo_box/magazine/flechette/shredder
+ spread = 15
+ recoil = 0.1
+
+/obj/item/gun/ballistic/automatic/flechette/shredder/update_icon()
+ ..()
+ if(magazine)
+ cut_overlays()
+ add_overlay("shreddergun-magazine")
+ else
+ cut_overlays()
+ icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/handguns.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/handguns.dm
new file mode 100644
index 0000000000..487d5111fc
--- /dev/null
+++ b/modular_citadel/code/modules/projectiles/guns/ballistic/handguns.dm
@@ -0,0 +1,424 @@
+////////////Anti Tank Pistol////////////
+
+/obj/item/gun/ballistic/automatic/pistol/antitank
+ name = "Anti Tank Pistol"
+ desc = "A massively impractical and silly monstrosity of a pistol that fires .50 calliber rounds. The recoil is likely to dislocate your wrist."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "atp"
+ item_state = "pistol"
+ recoil = 4
+ mag_type = /obj/item/ammo_box/magazine/sniper_rounds
+ fire_delay = 50
+ burst_size = 1
+ can_suppress = 0
+ w_class = WEIGHT_CLASS_NORMAL
+ actions_types = list()
+ fire_sound = 'sound/weapons/blastcannon.ogg'
+ spread = 20 //damn thing has no rifling.
+
+/obj/item/gun/ballistic/automatic/pistol/antitank/update_icon()
+ ..()
+ if(magazine)
+ cut_overlays()
+ add_overlay("atp-mag")
+ else
+ cut_overlays()
+ icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
+
+/obj/item/gun/ballistic/automatic/pistol/antitank/syndicate
+ name = "Syndicate Anti Tank Pistol"
+ desc = "A massively impractical and silly monstrosity of a pistol that fires .50 calliber rounds. The recoil is likely to dislocate a variety of joints without proper bracing."
+ pin = /obj/item/device/firing_pin/implant/pindicate
+
+/* made redundant by reskinnable stetchkins
+//////Stealth Pistol//////
+
+/obj/item/gun/ballistic/automatic/pistol/stealth
+ name = "stealth pistol"
+ desc = "A unique bullpup pistol with a compact frame. Has an integrated surpressor."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "stealthpistol"
+ w_class = WEIGHT_CLASS_SMALL
+ mag_type = /obj/item/ammo_box/magazine/m10mm
+ can_suppress = 0
+ fire_sound = 'sound/weapons/gunshot_silenced.ogg'
+ suppressed = 1
+ burst_size = 1
+
+/obj/item/gun/ballistic/automatic/pistol/stealth/update_icon()
+ ..()
+ if(magazine)
+ cut_overlays()
+ add_overlay("stealthpistol-magazine")
+ else
+ cut_overlays()
+ icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
+
+*/
+
+///foam stealth pistol///
+
+/obj/item/gun/ballistic/automatic/toy/pistol/stealth
+ name = "foam force stealth pistol"
+ desc = "A small, easily concealable toy bullpup handgun. Ages 8 and up."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "foamsp"
+ w_class = WEIGHT_CLASS_SMALL
+ mag_type = /obj/item/ammo_box/magazine/toy/pistol
+ can_suppress = FALSE
+ fire_sound = 'sound/weapons/gunshot_silenced.ogg'
+ suppressed = TRUE
+ burst_size = 1
+ fire_delay = 0
+ spread = 20
+ actions_types = list()
+
+/obj/item/gun/ballistic/automatic/toy/pistol/stealth/update_icon()
+ ..()
+ if(magazine)
+ cut_overlays()
+ add_overlay("foamsp-magazine")
+ else
+ cut_overlays()
+ icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
+
+//////10mm soporific bullets//////
+
+obj/item/projectile/bullet/c10mm/soporific
+ name ="10mm soporific bullet"
+ armour_penetration = 0
+ nodamage = TRUE
+ dismemberment = 0
+ knockdown = 0
+
+/obj/item/projectile/bullet/c10mm/soporific/on_hit(atom/target, blocked = FALSE)
+ if((blocked != 100) && isliving(target))
+ var/mob/living/L = target
+ L.blur_eyes(6)
+ if(L.getStaminaLoss() >= 60)
+ L.Sleeping(300)
+ else
+ L.adjustStaminaLoss(25)
+ return 1
+
+/obj/item/ammo_casing/c10mm/soporific
+ name = ".10mm soporific bullet casing"
+ desc = "A 10mm soporific bullet casing."
+ projectile_type = /obj/item/projectile/bullet/c10mm/soporific
+
+/obj/item/ammo_box/magazine/m10mm/soporific
+ name = "pistol magazine (10mm soporific)"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "9x19pS"
+ desc = "A gun magazine. Loaded with rounds which inject the target with a variety of illegal substances to induce sleep in the target."
+ ammo_type = /obj/item/ammo_casing/c10mm/soporific
+
+/obj/item/ammo_box/c10mm/soporific
+ name = "ammo box (10mm soporific)"
+ ammo_type = /obj/item/ammo_casing/c10mm/soporific
+ max_ammo = 24
+
+//////modular pistol////// (reskinnable stetchkins)
+
+/obj/item/gun/ballistic/automatic/pistol/modular
+ name = "modular pistol"
+ desc = "A small, easily concealable 10mm handgun. Has a threaded barrel for suppressors."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "cde"
+ can_unsuppress = TRUE
+ obj_flags = UNIQUE_RENAME
+ unique_reskin = list("Default" = "cde",
+ "NT-99" = "n99",
+ "Stealth" = "stealthpistol",
+ "HKVP-78" = "vp78",
+ "Luger" = "p08b",
+ "Mk.58" = "secguncomp",
+ "PX4 Storm" = "px4"
+ )
+
+/obj/item/gun/ballistic/automatic/pistol/modular/update_icon()
+ ..()
+ if(current_skin)
+ icon_state = "[unique_reskin[current_skin]][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]"
+ else
+ icon_state = "[initial(icon_state)][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]"
+ if(magazine && suppressed)
+ cut_overlays()
+ add_overlay("[unique_reskin[current_skin]]-magazine-sup") //Yes, this means the default iconstate can't have a magazine overlay
+ else if (magazine)
+ cut_overlays()
+ add_overlay("[unique_reskin[current_skin]]-magazine")
+ else
+ cut_overlays()
+
+/////////RAYGUN MEMES/////////
+
+/obj/item/projectile/beam/lasertag/ray //the projectile, compatible with regular laser tag armor
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "ray"
+ name = "ray bolt"
+ eyeblur = 0
+
+/obj/item/ammo_casing/energy/laser/raytag
+ projectile_type = /obj/item/projectile/beam/lasertag/ray
+ select_name = "raytag"
+ fire_sound = 'sound/weapons/raygun.ogg'
+
+/obj/item/gun/energy/laser/practice/raygun
+ name = "toy ray gun"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "raygun"
+ desc = "A toy laser with a classic, retro feel and look. Compatible with existing laser tag systems."
+ ammo_type = list(/obj/item/ammo_casing/energy/laser/raytag)
+ selfcharge = TRUE
+
+/*/////////////////////////////////////////////////////////////////////////////////////////////
+ The Recolourable Gun
+*//////////////////////////////////////////////////////////////////////////////////////////////
+
+/obj/item/gun/ballistic/automatic/pistol/p37
+ name = "\improper CX Mk.37P"
+ desc = "A modern reimagining of an old legendary gun, the Mk.37 is a handgun with a toggle-locking mechanism manufactured by CX Armories. \
+ This model is coated with a special polychromic material. \
+ Has a small warning on the receiver that boldly states 'WARNING: WILL DETONATE UPON UNAUTHORIZED USE'. \
+ Uses 9mm bullets loaded into proprietary magazines."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "p37"
+ w_class = WEIGHT_CLASS_NORMAL
+ spawnwithmagazine = FALSE
+ mag_type = /obj/item/ammo_box/magazine/m9mm/p37
+ can_suppress = FALSE
+ pin = /obj/item/device/firing_pin/dna/dredd //goes boom if whoever isn't DNA locked to it tries to use it
+ actions_types = list(/datum/action/item_action/pick_color)
+
+ var/frame_color = "#808080" //RGB
+ var/receiver_color = "#808080"
+ var/body_color = "#0098FF"
+ var/barrel_color = "#808080"
+ var/tip_color = "#808080"
+ var/arm_color = "#808080"
+ var/grip_color = "#00FFCB" //Does not actually colour the grip, just the lights surrounding it
+ var/energy_color = "#00FFCB"
+
+///Defining all the colourable bits and displaying them///
+
+/obj/item/gun/ballistic/automatic/pistol/p37/update_icon()
+ var/mutable_appearance/frame_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_frame")
+ var/mutable_appearance/receiver_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_receiver")
+ var/mutable_appearance/body_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_body")
+ var/mutable_appearance/barrel_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_barrel")
+ var/mutable_appearance/tip_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_tip")
+ var/mutable_appearance/grip_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_grip")
+ var/mutable_appearance/energy_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_light")
+ var/mutable_appearance/arm_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_arm")
+ var/mutable_appearance/arm_overlay_e = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_arm-e")
+
+ if(frame_color)
+ frame_overlay.color = frame_color
+ if(receiver_color)
+ receiver_overlay.color = receiver_color
+ if(body_color)
+ body_overlay.color = body_color
+ if(barrel_color)
+ barrel_overlay.color = barrel_color
+ if(tip_color)
+ tip_overlay.color = tip_color
+ if(grip_color)
+ grip_overlay.color = grip_color
+ if(energy_color)
+ energy_overlay.color = energy_color
+ if(arm_color)
+ arm_overlay.color = arm_color
+ if(arm_color)
+ arm_overlay_e.color = arm_color
+
+ cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other
+
+ add_overlay(frame_overlay)
+ add_overlay(receiver_overlay)
+ add_overlay(body_overlay)
+ add_overlay(barrel_overlay)
+ add_overlay(tip_overlay)
+ add_overlay(grip_overlay)
+ add_overlay(energy_overlay)
+
+ if(magazine) //does not need a cut_overlays proc call here because it's already called further up
+ add_overlay("p37_mag")
+
+ if(chambered)
+ cut_overlay(arm_overlay_e)
+ add_overlay(arm_overlay)
+ else
+ cut_overlay(arm_overlay)
+ add_overlay(arm_overlay_e)
+
+///letting you actually recolor things///
+
+/obj/item/gun/ballistic/automatic/pistol/p37/ui_action_click(mob/user, var/datum/action/A)
+ if(istype(A, /datum/action/item_action/pick_color))
+
+ var/choice = input(user,"Mk.37P polychrome options", "Gun Recolor") in list("Frame Color","Receiver Color","Body Color",
+ "Barrel Color", "Barrel Tip Color", "Grip Light Color",
+ "Light Color", "Arm Color", "*CANCEL*")
+
+ switch(choice)
+
+ if("Frame Color")
+ var/frame_color_input = input(usr,"","Choose Frame Color",frame_color) as color|null
+ if(frame_color_input)
+ frame_color = sanitize_hexcolor(frame_color_input, desired_format=6, include_crunch=1)
+ update_icon()
+
+ if("Receiver Color")
+ var/receiver_color_input = input(usr,"","Choose Receiver Color",receiver_color) as color|null
+ if(receiver_color_input)
+ receiver_color = sanitize_hexcolor(receiver_color_input, desired_format=6, include_crunch=1)
+ update_icon()
+
+ if("Body Color")
+ var/body_color_input = input(usr,"","Choose Body Color",body_color) as color|null
+ if(body_color_input)
+ body_color = sanitize_hexcolor(body_color_input, desired_format=6, include_crunch=1)
+ update_icon()
+
+ if("Barrel Color")
+ var/barrel_color_input = input(usr,"","Choose Barrel Color",barrel_color) as color|null
+ if(barrel_color_input)
+ barrel_color = sanitize_hexcolor(barrel_color_input, desired_format=6, include_crunch=1)
+ update_icon()
+
+ if("Barrel Tip Color")
+ var/tip_color_input = input(usr,"","Choose Barrel Tip Color",tip_color) as color|null
+ if(tip_color_input)
+ tip_color = sanitize_hexcolor(tip_color_input, desired_format=6, include_crunch=1)
+ update_icon()
+
+ if("Grip Light Color")
+ var/grip_color_input = input(usr,"","Choose Grip Light Color",grip_color) as color|null
+ if(grip_color_input)
+ grip_color = sanitize_hexcolor(grip_color_input, desired_format=6, include_crunch=1)
+ update_icon()
+
+ if("Light Color")
+ var/energy_color_input = input(usr,"","Choose Light Color",energy_color) as color|null
+ if(energy_color_input)
+ energy_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1)
+ update_icon()
+
+ if("Arm Color")
+ var/arm_color_input = input(usr,"","Choose Arm Color",arm_color) as color|null
+ if(arm_color_input)
+ arm_color = sanitize_hexcolor(arm_color_input, desired_format=6, include_crunch=1)
+ update_icon()
+ A.UpdateButtonIcon()
+
+ else
+ ..()
+
+///boolets///
+
+/obj/item/projectile/bullet/c9mm/frangible
+ name = "9mm frangible bullet"
+ damage = 15
+ stamina = 0
+ speed = 1.0
+ range = 20
+ armour_penetration = -25
+
+/obj/item/projectile/bullet/c9mm/rubber
+ name = "9mm rubber bullet"
+ damage = 5
+ stamina = 30
+ speed = 1.2
+ range = 14
+ knockdown = 0
+
+/obj/item/ammo_casing/c9mm/frangible
+ name = "9mm frangible bullet casing"
+ desc = "A 9mm frangible bullet casing."
+ projectile_type = /obj/item/projectile/bullet/c9mm/frangible
+
+/obj/item/ammo_casing/c9mm/rubber
+ name = "9mm rubber bullet casing"
+ desc = "A 9mm rubber bullet casing."
+ projectile_type = /obj/item/projectile/bullet/c9mm/rubber
+
+/obj/item/ammo_box/magazine/m9mm/p37
+ name = "\improper P37 magazine (9mm frangible)"
+ desc = "A gun magazine. Loaded with plastic composite rounds which fragment upon impact to minimize collateral damage."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "11mm" //topkek
+ ammo_type = /obj/item/ammo_casing/c9mm/frangible
+ caliber = "9mm"
+ max_ammo = 11
+ multiple_sprites = 1
+
+/obj/item/ammo_box/magazine/m9mm/p37/fmj
+ name = "\improper P37 magazine (9mm)"
+ ammo_type = /obj/item/ammo_casing/c9mm
+ desc = "A gun magazine. Loaded with conventional full metal jacket rounds."
+
+/obj/item/ammo_box/magazine/m9mm/p37/rubber
+ name = "\improper P37 magazine (9mm Non-Lethal Rubbershot)"
+ ammo_type = /obj/item/ammo_casing/c9mm/rubber
+ desc = "A gun magazine. Loaded with less-than-lethal rubber bullets."
+
+/obj/item/ammo_box/c9mm/frangible
+ name = "ammo box (9mm frangible)"
+ ammo_type = /obj/item/ammo_casing/c9mm/frangible
+
+/obj/item/ammo_box/c9mm/rubber
+ name = "ammo box (9mm non-lethal rubbershot)"
+ ammo_type = /obj/item/ammo_casing/c9mm/rubber
+
+/datum/design/c9mmfrag
+ name = "Box of 9mm Frangible Bullets"
+ id = "9mm_frag"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 25000)
+ build_path = /obj/item/ammo_box/c9mm/frangible
+ category = list("hacked", "Security")
+
+/datum/design/c9mmrubber
+ name = "Box of 9mm Rubber Bullets"
+ id = "9mm_rubber"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 30000)
+ build_path = /obj/item/ammo_box/c9mm/rubber
+ category = list("initial", "Security")
+
+
+///Security Variant///
+
+/obj/item/gun/ballistic/automatic/pistol/p37/sec
+ name = "\improper CX Mk.37S"
+ desc = "A modern reimagining of an old legendary gun, the Mk.37 is a handgun with a toggle-locking mechanism manufactured by CX Armories. Uses 9mm bullets loaded into proprietary magazines."
+ spawnwithmagazine = FALSE
+ pin = /obj/item/device/firing_pin/implant/mindshield
+ actions_types = list() //so you can't recolor it
+
+ frame_color = "#808080" //RGB
+ receiver_color = "#808080"
+ body_color = "#282828"
+ barrel_color = "#808080"
+ tip_color = "#808080"
+ arm_color = "#800000"
+ grip_color = "#FFFF00" //Does not actually colour the grip, just the lights surrounding it
+ energy_color = "#FFFF00"
+
+///Foam Variant because WE NEED MEMES///
+
+/obj/item/gun/ballistic/automatic/pistol/p37/foam
+ name = "\improper Foam Force Mk.37F"
+ desc = "A licensed foam-firing reproduction of a handgun with a toggle-locking mechanism manufactured by CX Armories. This model is coated with a special polychromic material. Uses standard foam pistol magazines."
+ icon_state = "p37_foam"
+ pin = /obj/item/device/firing_pin
+ spawnwithmagazine = TRUE
+ obj_flags = 0
+ casing_ejector = FALSE
+ mag_type = /obj/item/ammo_box/magazine/toy/pistol
+ can_suppress = FALSE
+ actions_types = list(/datum/action/item_action/pick_color)
+
+/obj/item/ammo_box/magazine/toy/pistol //forcing this might be a bad idea, but it'll fix the foam gun infinite material exploit
+ materials = list(MAT_METAL = 200)
diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon.dm
new file mode 100644
index 0000000000..cd4ec113de
--- /dev/null
+++ b/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon.dm
@@ -0,0 +1,466 @@
+///////XCOM X9 AR///////
+
+/obj/item/gun/ballistic/automatic/x9 //will be adminspawn only so ERT or something can use them
+ name = "\improper X9 Assault Rifle"
+ desc = "A rather old design of a cheap, reliable assault rifle made for combat against unknown enemies. Uses 5.56mm ammo."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "x9"
+ item_state = "arg"
+ slot_flags = 0
+ mag_type = /obj/item/ammo_box/magazine/m556 //Uses the m90gl's magazine, just like the NT-ARG
+ fire_sound = 'sound/weapons/gunshot_smg.ogg'
+ can_suppress = 0
+ burst_size = 6 //in line with XCOMEU stats. This can fire 5 bursts from a full magazine.
+ fire_delay = 1
+ spread = 30 //should be 40 for XCOM memes, but since its adminspawn only, might as well make it useable
+ recoil = 1
+
+///toy memes///
+
+/obj/item/ammo_box/magazine/toy/x9
+ name = "foam force X9 magazine"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "toy9magazine"
+ max_ammo = 30
+ multiple_sprites = 2
+ materials = list(MAT_METAL = 200)
+
+/obj/item/gun/ballistic/automatic/x9/toy
+ name = "\improper Foam Force X9"
+ desc = "An old but reliable assault rifle made for combat against unknown enemies. Appears to be hastily converted. Ages 8 and up."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "toy9"
+ can_suppress = 0
+ obj_flags = 0
+ mag_type = /obj/item/ammo_box/magazine/toy/x9
+ casing_ejector = 0
+ spread = 90 //MAXIMUM XCOM MEMES (actually that'd be 180 spread)
+ w_class = WEIGHT_CLASS_BULKY
+ weapon_weight = WEAPON_HEAVY
+
+////////XCOM2 Magpistol/////////
+
+//////projectiles//////
+
+/obj/item/projectile/bullet/mags
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "magjectile"
+ damage = 15
+ armour_penetration = 10
+ light_range = 2
+ speed = 0.6
+ range = 25
+ light_color = LIGHT_COLOR_RED
+
+/obj/item/projectile/bullet/nlmags //non-lethal boolets
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "magjectile-nl"
+ damage = 0
+ knockdown = 0
+ stamina = 25
+ armour_penetration = -10
+ light_range = 2
+ speed = 0.7
+ range = 25
+ light_color = LIGHT_COLOR_BLUE
+
+
+/////actual ammo/////
+
+/obj/item/ammo_casing/caseless/amags
+ desc = "A ferromagnetic slug intended to be launched out of a compatible weapon."
+ caliber = "mags"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "mag-casing-live"
+ projectile_type = /obj/item/projectile/bullet/mags
+
+/obj/item/ammo_casing/caseless/anlmags
+ desc = "A specialized ferromagnetic slug designed with a less-than-lethal payload."
+ caliber = "mags"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "mag-casing-live"
+ projectile_type = /obj/item/projectile/bullet/nlmags
+
+//////magazines/////
+
+/obj/item/ammo_box/magazine/mmag/small
+ name = "magpistol magazine (non-lethal disabler)"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "nlmagmag"
+ ammo_type = /obj/item/ammo_casing/caseless/anlmags
+ caliber = "mags"
+ max_ammo = 15
+ multiple_sprites = 2
+
+/obj/item/ammo_box/magazine/mmag/small/lethal
+ name = "magpistol magazine (lethal)"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "smallmagmag"
+ ammo_type = /obj/item/ammo_casing/caseless/amags
+
+//////the gun itself//////
+
+/obj/item/gun/ballistic/automatic/pistol/mag
+ name = "magpistol"
+ desc = "A handgun utilizing maglev technologies to propel a ferromagnetic slug to extreme velocities."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "magpistol"
+ force = 10
+ fire_sound = 'sound/weapons/magpistol.ogg'
+ mag_type = /obj/item/ammo_box/magazine/mmag/small
+ can_suppress = 0
+ casing_ejector = 0
+ fire_delay = 2
+ recoil = 0.2
+
+/obj/item/gun/ballistic/automatic/pistol/mag/update_icon()
+ ..()
+ if(magazine)
+ cut_overlays()
+ add_overlay("magpistol-magazine")
+ else
+ cut_overlays()
+ icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
+
+///research memes///
+
+/obj/item/gun/ballistic/automatic/pistol/mag/nopin
+ pin = null
+ spawnwithmagazine = FALSE
+
+/datum/design/magpistol
+ name = "Magpistol"
+ desc = "A weapon which fires ferromagnetic slugs."
+ id = "magpisol"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 7500, MAT_GLASS = 1000, MAT_URANIUM = 1000, MAT_TITANIUM = 5000, MAT_SILVER = 2000)
+ build_path = /obj/item/gun/ballistic/automatic/pistol/mag/nopin
+ category = list("Weapons")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/mag_magpistol
+ name = "Magpistol Magazine"
+ desc = "A 14 round magazine for the Magpistol."
+ id = "mag_magpistol"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 4000, MAT_SILVER = 500)
+ build_path = /obj/item/ammo_box/magazine/mmag/small/lethal
+ category = list("Ammo")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/mag_magpistol/nl
+ name = "Magpistol Magazine (Non-Lethal)"
+ desc = "A 14 round non-lethal magazine for the Magpistol."
+ id = "mag_magpistol_nl"
+ materials = list(MAT_METAL = 3000, MAT_SILVER = 250, MAT_TITANIUM = 250)
+ build_path = /obj/item/ammo_box/magazine/mmag/small
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+//////toy memes/////
+
+/obj/item/projectile/bullet/reusable/foam_dart/mag
+ name = "magfoam dart"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "magjectile-toy"
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag
+ light_range = 2
+ light_color = LIGHT_COLOR_YELLOW
+
+/obj/item/ammo_casing/caseless/foam_dart/mag
+ name = "magfoam dart"
+ desc = "A foam dart with fun light-up projectiles powered by magnets!"
+ projectile_type = /obj/item/projectile/bullet/reusable/foam_dart/mag
+
+/obj/item/ammo_box/magazine/internal/shot/toy/mag
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag
+ max_ammo = 14
+
+/obj/item/gun/ballistic/shotgun/toy/mag
+ name = "foam force magpistol"
+ desc = "A fancy toy sold alongside light-up foam force darts. Ages 8 and up."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "toymag"
+ item_state = "gun"
+ mag_type = /obj/item/ammo_box/magazine/internal/shot/toy/mag
+ fire_sound = 'sound/weapons/magpistol.ogg'
+ slot_flags = SLOT_BELT
+ w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/ammo_box/foambox/mag
+ name = "ammo box (Magnetic Foam Darts)"
+ icon = 'icons/obj/guns/toy.dmi'
+ icon_state = "foambox"
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag
+ max_ammo = 42
+
+//////Magrifle//////
+
+///projectiles///
+
+/obj/item/projectile/bullet/magrifle
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "magjectile-large"
+ damage = 20
+ armour_penetration = 25
+ light_range = 3
+ speed = 0.7
+ range = 35
+ light_color = LIGHT_COLOR_RED
+
+/obj/item/projectile/bullet/nlmagrifle //non-lethal boolets
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "magjectile-large-nl"
+ damage = 0
+ knockdown = 0
+ stamina = 25
+ armour_penetration = -10
+ light_range = 3
+ speed = 0.65
+ range = 35
+ light_color = LIGHT_COLOR_BLUE
+
+///ammo casings///
+
+/obj/item/ammo_casing/caseless/amagm
+ desc = "A large ferromagnetic slug intended to be launched out of a compatible weapon."
+ caliber = "magm"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "mag-casing-live"
+ projectile_type = /obj/item/projectile/bullet/magrifle
+
+/obj/item/ammo_casing/caseless/anlmagm
+ desc = "A large, specialized ferromagnetic slug designed with a less-than-lethal payload."
+ caliber = "magm"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "mag-casing-live"
+ projectile_type = /obj/item/projectile/bullet/nlmagrifle
+
+///magazines///
+
+/obj/item/ammo_box/magazine/mmag/
+ name = "magrifle magazine (non-lethal disabler)"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "mediummagmag"
+ ammo_type = /obj/item/ammo_casing/caseless/anlmagm
+ caliber = "magm"
+ max_ammo = 24
+ multiple_sprites = 2
+
+/obj/item/ammo_box/magazine/mmag/lethal
+ name = "magrifle magazine (lethal)"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "mediummagmag"
+ ammo_type = /obj/item/ammo_casing/caseless/amagm
+ max_ammo = 24
+
+///the gun itself///
+
+/obj/item/gun/ballistic/automatic/magrifle
+ name = "\improper Magnetic Rifle"
+ desc = "A simple upscalling of the technologies used in the magpistol, the magrifle is capable of firing slightly larger slugs in bursts. Compatible with the magpistol's slugs."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "magrifle"
+ item_state = "arg"
+ slot_flags = 0
+ mag_type = /obj/item/ammo_box/magazine/mmag
+ fire_sound = 'sound/weapons/magrifle.ogg'
+ can_suppress = 0
+ burst_size = 3
+ fire_delay = 2
+ spread = 5
+ recoil = 0.15
+ casing_ejector = 0
+
+///research///
+
+/obj/item/gun/ballistic/automatic/magrifle/nopin
+ pin = null
+ spawnwithmagazine = FALSE
+
+/datum/design/magrifle
+ name = "Magrifle"
+ desc = "An upscaled Magpistol in rifle form."
+ id = "magrifle"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 10000, MAT_GLASS = 2000, MAT_URANIUM = 2000, MAT_TITANIUM = 10000, MAT_SILVER = 4000, MAT_GOLD = 2000)
+ build_path = /obj/item/gun/ballistic/automatic/magrifle/nopin
+ category = list("Weapons")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/mag_magrifle
+ name = "Magrifle Magazine (Lethal)"
+ desc = "A 24-round magazine for the Magrifle."
+ id = "mag_magrifle"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 8000, MAT_SILVER = 1000)
+ build_path = /obj/item/ammo_box/magazine/mmag/lethal
+ category = list("Ammo")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/mag_magrifle/nl
+ name = "Magrifle Magazine (Non-Lethal)"
+ desc = "A 24- round non-lethal magazine for the Magrifle."
+ id = "mag_magrifle_nl"
+ materials = list(MAT_METAL = 6000, MAT_SILVER = 500, MAT_TITANIUM = 500)
+ build_path = /obj/item/ammo_box/magazine/mmag
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+///foamagrifle///
+
+/obj/item/ammo_box/magazine/toy/foamag
+ name = "foam force magrifle magazine"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "foamagmag"
+ max_ammo = 24
+ multiple_sprites = 2
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag
+ materials = list(MAT_METAL = 200)
+
+/obj/item/gun/ballistic/automatic/magrifle/toy
+ name = "foamag rifle"
+ desc = "A foam launching magnetic rifle. Ages 8 and up."
+ icon_state = "foamagrifle"
+ obj_flags = 0
+ mag_type = /obj/item/ammo_box/magazine/toy/foamag
+ casing_ejector = FALSE
+ spread = 60
+ w_class = WEIGHT_CLASS_BULKY
+ weapon_weight = WEAPON_HEAVY
+
+/*
+// TECHWEBS IMPLEMENTATION
+*/
+
+/datum/techweb_node/magnetic_weapons
+ id = "magnetic_weapons"
+ display_name = "Magnetic Weapons"
+ description = "Weapons using magnetic technology"
+ prereq_ids = list("weaponry", "adv_weaponry", "emp_adv")
+ design_ids = list("magrifle", "magpisol", "mag_magrifle", "mag_magrifle_nl", "mag_magpistol", "mag_magpistol_nl")
+ research_cost = 2500
+ export_price = 5000
+
+
+//////Hyper-Burst Rifle//////
+
+///projectiles///
+
+/obj/item/projectile/bullet/mags/hyper
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "magjectile"
+ damage = 10
+ armour_penetration = 10
+ stamina = 10
+ forcedodge = TRUE
+ range = 6
+ light_range = 1
+ light_color = LIGHT_COLOR_RED
+
+/obj/item/projectile/bullet/mags/hyper/inferno
+ icon_state = "magjectile-large"
+ stamina = 0
+ forcedodge = FALSE
+ range = 25
+ light_range = 4
+
+/obj/item/projectile/bullet/mags/hyper/inferno/on_hit(atom/target, blocked = FALSE)
+ ..()
+ explosion(target, -1, 1, 2, 4, 5)
+ return 1
+
+///ammo casings///
+
+/obj/item/ammo_casing/caseless/ahyper
+ desc = "A large block of speciallized ferromagnetic material designed to be fired out of the experimental Hyper-Burst Rifle."
+ caliber = "hypermag"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "hyper-casing-live"
+ projectile_type = /obj/item/projectile/bullet/mags/hyper
+ pellets = 12
+ variance = 40
+
+/obj/item/ammo_casing/caseless/ahyper/inferno
+ projectile_type = /obj/item/projectile/bullet/mags/hyper/inferno
+ pellets = 1
+ variance = 0
+
+///magazines///
+
+/obj/item/ammo_box/magazine/mhyper
+ name = "hyper-burst rifle magazine"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "hypermag-4"
+ ammo_type = /obj/item/ammo_casing/caseless/ahyper
+ caliber = "hypermag"
+ desc = "A magazine for the Hyper-Burst Rifle. Loaded with a special slug that fragments into 12 smaller shards which can absolutely puncture anything, but has rather short effective range."
+ max_ammo = 4
+
+/obj/item/ammo_box/magazine/mhyper/update_icon()
+ ..()
+ icon_state = "hypermag-[ammo_count() ? "4" : "0"]"
+
+/obj/item/ammo_box/magazine/mhyper/inferno
+ name = "hyper-burst rifle magazine (inferno)"
+ ammo_type = /obj/item/ammo_casing/caseless/ahyper/inferno
+ desc = "A magazine for the Hyper-Burst Rifle. Loaded with a special slug that violently reacts with whatever surface it strikes, generating a massive amount of heat and light."
+
+///gun itself///
+
+/obj/item/gun/ballistic/automatic/hyperburst
+ name = "\improper Hyper-Burst Rifle"
+ desc = "An extremely beefed up version of a stolen Nanotrasen weapon prototype, this 'rifle' is more like a cannon, with an extremely large bore barrel capable of generating several smaller magnetic 'barrels' to simultaneously launch multiple projectiles at once."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "hyperburst"
+ item_state = "arg"
+ slot_flags = 0
+ mag_type = /obj/item/ammo_box/magazine/mhyper
+ fire_sound = 'sound/weapons/magburst.ogg'
+ can_suppress = 0
+ burst_size = 1
+ fire_delay = 40
+ recoil = 2
+ casing_ejector = 0
+ weapon_weight = WEAPON_HEAVY
+
+/obj/item/gun/ballistic/automatic/hyperburst/update_icon()
+ ..()
+ icon_state = "hyperburst[magazine ? "-[get_ammo()]" : ""][chambered ? "" : "-e"]"
+
+///toy memes///
+
+/obj/item/projectile/beam/lasertag/mag //the projectile, compatible with regular laser tag armor
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "magjectile-toy"
+ name = "lasertag magbolt"
+ forcedodge = TRUE //for penetration memes
+ range = 5 //so it isn't super annoying
+ light_range = 2
+ light_color = LIGHT_COLOR_YELLOW
+ eyeblur = 0
+
+/obj/item/ammo_casing/energy/laser/magtag
+ projectile_type = /obj/item/projectile/beam/lasertag/mag
+ select_name = "magtag"
+ pellets = 3
+ variance = 30
+ e_cost = 1000
+ fire_sound = 'sound/weapons/magburst.ogg'
+
+/obj/item/gun/energy/laser/practice/hyperburst
+ name = "toy hyper-burst launcher"
+ desc = "A toy laser with a unique beam shaping lens that projects harmless bolts capable of going through objects. Compatible with existing laser tag systems."
+ ammo_type = list(/obj/item/ammo_casing/energy/laser/magtag)
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "toyburst"
+ clumsy_check = FALSE
+ obj_flags = 0
+ fire_delay = 40
+ weapon_weight = WEAPON_HEAVY
+ selfcharge = TRUE
+ charge_delay = 2
+ recoil = 2
+ cell_type = /obj/item/stock_parts/cell/toymagburst
+
+/obj/item/stock_parts/cell/toymagburst
+ name = "toy mag burst rifle power supply"
+ maxcharge = 4000
\ No newline at end of file
diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm
new file mode 100644
index 0000000000..a9824c7d33
--- /dev/null
+++ b/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm
@@ -0,0 +1,234 @@
+
+///////XCOM X9 AR///////
+
+/obj/item/gun/ballistic/automatic/x9 //will be adminspawn only so ERT or something can use them
+ name = "\improper X9 Assault Rifle"
+ desc = "A rather old design of a cheap, reliable assault rifle made for combat against unknown enemies. Uses 5.56mm ammo."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "x9"
+ item_state = "arg"
+ slot_flags = 0
+ mag_type = /obj/item/ammo_box/magazine/m556 //Uses the m90gl's magazine, just like the NT-ARG
+ fire_sound = 'sound/weapons/gunshot_smg.ogg'
+ can_suppress = 0
+ burst_size = 6 //in line with XCOMEU stats. This can fire 5 bursts from a full magazine.
+ fire_delay = 1
+ spread = 30 //should be 40 for XCOM memes, but since its adminspawn only, might as well make it useable
+ recoil = 1
+
+///toy memes///
+
+/obj/item/ammo_box/magazine/toy/x9
+ name = "foam force X9 magazine"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "toy9magazine"
+ max_ammo = 30
+ multiple_sprites = 2
+ materials = list(MAT_METAL = 200)
+
+/obj/item/gun/ballistic/automatic/x9/toy
+ name = "\improper Foam Force X9"
+ desc = "An old but reliable assault rifle made for combat against unknown enemies. Appears to be hastily converted. Ages 8 and up."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "toy9"
+ can_suppress = 0
+ obj_flags = 0
+ mag_type = /obj/item/ammo_box/magazine/toy/x9
+ casing_ejector = 0
+ spread = 90 //MAXIMUM XCOM MEMES (actually that'd be 180 spread)
+ w_class = WEIGHT_CLASS_BULKY
+ weapon_weight = WEAPON_HEAVY
+
+
+//////Flechette Launcher//////
+
+///projectiles///
+
+/obj/item/projectile/bullet/cflechetteap //shreds armor
+ name = "flechette (armor piercing)"
+ damage = 8
+ armour_penetration = 80
+
+/obj/item/projectile/bullet/cflechettes //shreds flesh and forces bleeding
+ name = "flechette (serrated)"
+ damage = 15
+ dismemberment = 10
+ armour_penetration = -80
+
+/obj/item/projectile/bullet/cflechettes/on_hit(atom/target, blocked = FALSE)
+ if((blocked != 100) && iscarbon(target))
+ var/mob/living/carbon/C = target
+ C.bleed(10)
+ return ..()
+
+///ammo casings (CASELESS AMMO CASINGS WOOOOOOOO)///
+
+/obj/item/ammo_casing/caseless/flechetteap
+ name = "flechette (armor piercing)"
+ desc = "A flechette made with a tungsten alloy."
+ projectile_type = /obj/item/projectile/bullet/cflechetteap
+ caliber = "flechette"
+ throwforce = 1
+ throw_speed = 3
+
+/obj/item/ammo_casing/caseless/flechettes
+ name = "flechette (serrated)"
+ desc = "A serrated flechette made of a special alloy intended to deform drastically upon penetration of human flesh."
+ projectile_type = /obj/item/projectile/bullet/cflechettes
+ caliber = "flechette"
+ throwforce = 2
+ throw_speed = 3
+ embedding = list("embedded_pain_multiplier" = 0, "embed_chance" = 40, "embedded_fall_chance" = 10)
+
+///magazine///
+
+/obj/item/ammo_box/magazine/flechette
+ name = "flechette magazine (armor piercing)"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "flechettemag"
+ ammo_type = /obj/item/ammo_casing/caseless/flechetteap
+ caliber = "flechette"
+ max_ammo = 40
+ multiple_sprites = 2
+
+/obj/item/ammo_box/magazine/flechette/s
+ name = "flechette magazine (serrated)"
+ ammo_type = /obj/item/ammo_casing/caseless/flechettes
+
+///the gun itself///
+
+/obj/item/gun/ballistic/automatic/flechette
+ name = "\improper CX Flechette Launcher"
+ desc = "A flechette launching machine pistol with an unconventional bullpup frame."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "flechettegun"
+ item_state = "gun"
+ w_class = WEIGHT_CLASS_NORMAL
+ slot_flags = 0
+ /obj/item/device/firing_pin/implant/pindicate
+ mag_type = /obj/item/ammo_box/magazine/flechette/
+ fire_sound = 'sound/weapons/gunshot_smg.ogg'
+ can_suppress = 0
+ burst_size = 5
+ fire_delay = 1
+ casing_ejector = 0
+ spread = 10
+ recoil = 0.05
+
+/obj/item/gun/ballistic/automatic/flechette/update_icon()
+ ..()
+ if(magazine)
+ cut_overlays()
+ add_overlay("flechettegun-magazine")
+ else
+ cut_overlays()
+ icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
+
+///unique variant///
+
+/obj/item/projectile/bullet/cflechetteshredder
+ name = "flechette (shredder)"
+ damage = 5
+ dismemberment = 40
+
+/obj/item/ammo_casing/caseless/flechetteshredder
+ name = "flechette (shredder)"
+ desc = "A serrated flechette made of a special alloy that forms a monofilament edge."
+ projectile_type = /obj/item/projectile/bullet/cflechettes
+
+/obj/item/ammo_box/magazine/flechette/shredder
+ name = "flechette magazine (shredder)"
+ icon_state = "shreddermag"
+ ammo_type = /obj/item/ammo_casing/caseless/flechetteshredder
+
+/obj/item/gun/ballistic/automatic/flechette/shredder
+ name = "\improper CX Shredder"
+ desc = "A flechette launching machine pistol made of ultra-light CFRP optimized for firing serrated monofillament flechettes."
+ w_class = WEIGHT_CLASS_SMALL
+ mag_type = /obj/item/ammo_box/magazine/flechette/shredder
+ spread = 15
+ recoil = 0.1
+
+/obj/item/gun/ballistic/automatic/flechette/shredder/update_icon()
+ ..()
+ if(magazine)
+ cut_overlays()
+ add_overlay("shreddergun-magazine")
+ else
+ cut_overlays()
+ icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
+
+/*/////////////////////////////////////////////////////////////
+//////////////////////// Zero's Meme //////////////////////////
+*//////////////////////////////////////////////////////////////
+/obj/item/ammo_box/magazine/toy/AM4B
+ name = "foam force AM4-B magazine"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "AM4MAG-60"
+ max_ammo = 60
+ multiple_sprites = 0
+ materials = list(MAT_METAL = 200)
+
+/obj/item/gun/ballistic/automatic/AM4B
+ name = "AM4-B"
+ desc = "A Relic from a bygone age. Nobody quite knows why it's here. Has a polychromic coating."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "AM4"
+ item_state = "arg"
+ mag_type = /obj/item/ammo_box/magazine/toy/AM4B
+ can_suppress = 0
+ item_flags = NEEDS_PERMIT
+ casing_ejector = 0
+ spread = 30 //Assault Rifleeeeeee
+ w_class = WEIGHT_CLASS_NORMAL
+ burst_size = 4 //Shh.
+ fire_delay = 1
+ var/body_color = "#3333aa"
+
+/obj/item/gun/ballistic/automatic/AM4B/update_icon()
+ ..()
+ var/mutable_appearance/body_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "AM4-Body")
+ if(body_color)
+ body_overlay.color = body_color
+ cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other
+ add_overlay(body_overlay)
+ if(ismob(loc))
+ var/mob/M = loc
+ M.update_inv_hands()
+/obj/item/gun/ballistic/automatic/AM4B/AltClick(mob/living/user)
+ if(!in_range(src, user)) //Basic checks to prevent abuse
+ return
+ if(user.incapacitated() || !istype(user))
+ to_chat(user, "You can't do that right now! ")
+ return
+ if(alert("Are you sure you want to recolor your gun?", "Confirm Repaint", "Yes", "No") == "Yes")
+ var/body_color_input = input(usr,"","Choose Shroud Color",body_color) as color|null
+ if(body_color_input)
+ body_color = sanitize_hexcolor(body_color_input, desired_format=6, include_crunch=1)
+ update_icon()
+/obj/item/gun/ballistic/automatic/AM4B/examine(mob/user)
+ ..()
+ to_chat(user, "Alt-click to recolor it. ")
+
+/obj/item/ammo_box/magazine/toy/AM4C
+ name = "foam force AM4-C magazine"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "AM4MAG-32"
+ max_ammo = 32
+ multiple_sprites = 0
+ materials = list(MAT_METAL = 200)
+
+/obj/item/gun/ballistic/automatic/AM4C
+ name = "AM4-C"
+ desc = "A Relic from a bygone age. This one seems newer, yet less effective."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "AM4C"
+ item_state = "arg"
+ mag_type = /obj/item/ammo_box/magazine/toy/AM4C
+ can_suppress = 0
+ item_flags = NEEDS_PERMIT
+ casing_ejector = 0
+ spread = 45 //Assault Rifleeeeeee
+ w_class = WEIGHT_CLASS_NORMAL
+ burst_size = 4 //Shh.
+ fire_delay = 1
diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/spinfusor.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/spinfusor.dm
new file mode 100644
index 0000000000..5b42f9686a
--- /dev/null
+++ b/modular_citadel/code/modules/projectiles/guns/ballistic/spinfusor.dm
@@ -0,0 +1,90 @@
+/////////////spinfusor stuff////////////////
+
+/obj/item/projectile/bullet/spinfusor
+ name ="spinfusor disk"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state= "spinner"
+ damage = 30
+ dismemberment = 25
+
+/obj/item/projectile/bullet/spinfusor/on_hit(atom/target, blocked = FALSE) //explosion to emulate the spinfusor's AOE
+ ..()
+ explosion(target, -1, -1, 2, 0, -1)
+ return 1
+
+/obj/item/ammo_casing/caseless/spinfusor
+ name = "spinfusor disk"
+ desc = "A magnetic disk designed specifically for the Stormhammer magnetic cannon. Warning: extremely volatile!"
+ projectile_type = /obj/item/projectile/bullet/spinfusor
+ caliber = "spinfusor"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "disk"
+ throwforce = 15 //still deadly when thrown
+ throw_speed = 3
+
+/obj/item/ammo_casing/caseless/spinfusor/throw_impact(atom/target) //disks detonate when thrown
+ if(!..()) // not caught in mid-air
+ visible_message("[src] detonates! ")
+ playsound(src.loc, "sparks", 50, 1)
+ explosion(target, -1, -1, 1, 1, -1)
+ qdel(src)
+ return 1
+
+/obj/item/ammo_box/magazine/internal/spinfusor
+ name = "spinfusor internal magazine"
+ ammo_type = /obj/item/ammo_casing/caseless/spinfusor
+ caliber = "spinfusor"
+ max_ammo = 1
+
+/obj/item/gun/ballistic/automatic/spinfusor
+ name = "Stormhammer Magnetic Cannon"
+ desc = "An innovative weapon utilizing mag-lev technology to spin up a magnetic fusor and launch it at extreme velocities."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "spinfusor"
+ item_state = "spinfusor"
+ mag_type = /obj/item/ammo_box/magazine/internal/spinfusor
+ fire_sound = 'sound/weapons/rocketlaunch.ogg'
+ w_class = WEIGHT_CLASS_BULKY
+ can_suppress = 0
+ burst_size = 1
+ fire_delay = 40
+ select = 0
+ actions_types = list()
+ casing_ejector = 0
+
+/obj/item/gun/ballistic/automatic/spinfusor/attackby(obj/item/A, mob/user, params)
+ var/num_loaded = magazine.attackby(A, user, params, 1)
+ if(num_loaded)
+ to_chat(user, "You load [num_loaded] disk\s into \the [src]. ")
+ update_icon()
+ chamber_round()
+
+/obj/item/gun/ballistic/automatic/spinfusor/attack_self(mob/living/user)
+ return //caseless rounds are too glitchy to unload properly. Best to make it so that you cannot remove disks from the spinfusor
+
+/obj/item/gun/ballistic/automatic/spinfusor/update_icon()
+ ..()
+ icon_state = "spinfusor[magazine ? "-[get_ammo(1)]" : ""]"
+
+/obj/item/ammo_box/aspinfusor
+ name = "ammo box (spinfusor disks)"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "spinfusorbox"
+ ammo_type = /obj/item/ammo_casing/caseless/spinfusor
+ max_ammo = 8
+
+/datum/supply_pack/security/armory/spinfusor
+ name = "Stormhammer Spinfusor Crate"
+ cost = 14000
+ contains = list(/obj/item/gun/ballistic/automatic/spinfusor,
+ /obj/item/gun/ballistic/automatic/spinfusor)
+ crate_name = "spinfusor crate"
+
+/datum/supply_pack/security/armory/spinfusorammo
+ name = "Spinfusor Disk Crate"
+ cost = 7000
+ contains = list(/obj/item/ammo_box/aspinfusor,
+ /obj/item/ammo_box/aspinfusor,
+ /obj/item/ammo_box/aspinfusor,
+ /obj/item/ammo_box/aspinfusor)
+ crate_name = "spinfusor disk crate"
\ No newline at end of file
diff --git a/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm b/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm
index a3367e4aa6..fb488fcca4 100644
--- a/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm
+++ b/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm
@@ -1,5 +1,56 @@
/obj/item/gun/energy/e_gun
- icon = 'modular_citadel/icons/obj/guns/energy.dmi'
+ name = "blaster carbine"
+ desc = "A high powered particle blaster carbine with varitable setting for stunning or lethal applications."
+ icon = 'modular_citadel/icons/obj/guns/OVERRIDE_energy.dmi'
+ lefthand_file = 'modular_citadel/icons/mob/inhands/OVERRIDE_guns_lefthand.dmi'
+ righthand_file = 'modular_citadel/icons/mob/inhands/OVERRIDE_guns_righthand.dmi'
ammo_x_offset = 2
flight_x_offset = 17
- flight_y_offset = 11
\ No newline at end of file
+ flight_y_offset = 11
+
+
+/*/////////////////////////////////////////////////////////////////////////////////////////////
+ The Recolourable Energy Gun
+*//////////////////////////////////////////////////////////////////////////////////////////////
+
+obj/item/gun/energy/e_gun/cx
+ name = "\improper CX Model D Energy Gun"
+ desc = "An overpriced hybrid energy gun with two settings: disable, and kill. Manufactured by CX Armories. Has a polychromic coating."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "cxe"
+ lefthand_file = 'icons/mob/citadel/guns_lefthand.dmi'
+ righthand_file = 'icons/mob/citadel/guns_righthand.dmi'
+ ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser)
+ flight_x_offset = 15
+ flight_y_offset = 10
+ var/body_color = "#252528"
+
+obj/item/gun/energy/e_gun/cx/update_icon()
+ ..()
+ var/mutable_appearance/body_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "cxegun_body")
+ if(body_color)
+ body_overlay.color = body_color
+ add_overlay(body_overlay)
+
+ if(ismob(loc))
+ var/mob/M = loc
+ M.update_inv_hands()
+
+obj/item/gun/energy/e_gun/cx/AltClick(mob/living/user)
+ if(!in_range(src, user)) //Basic checks to prevent abuse
+ return
+ if(user.incapacitated() || !istype(user))
+ to_chat(user, "You can't do that right now! ")
+ return
+ if(alert("Are you sure you want to repaint your gun?", "Confirm Repaint", "Yes", "No") == "Yes")
+ var/body_color_input = input(usr,"","Choose Body Color",body_color) as color|null
+ if(body_color_input)
+ body_color = sanitize_hexcolor(body_color_input, desired_format=6, include_crunch=1)
+ update_icon()
+
+obj/item/gun/energy/e_gun/cx/worn_overlays(isinhands, icon_file)
+ . = ..()
+ if(isinhands)
+ var/mutable_appearance/body_inhand = mutable_appearance(icon_file, "cxe_body")
+ body_inhand.color = body_color
+ . += body_inhand
diff --git a/modular_citadel/code/modules/projectiles/guns/energy/laser.dm b/modular_citadel/code/modules/projectiles/guns/energy/laser.dm
new file mode 100644
index 0000000000..25ae98e72a
--- /dev/null
+++ b/modular_citadel/code/modules/projectiles/guns/energy/laser.dm
@@ -0,0 +1,46 @@
+/obj/item/gun/energy/laser
+ name = "blaster rifle"
+ desc = "a high energy particle blaster, efficient and deadly."
+ icon = 'modular_citadel/icons/obj/guns/OVERRIDE_energy.dmi'
+ ammo_x_offset = 1
+ shaded_charge = 1
+ lefthand_file = 'modular_citadel/icons/mob/inhands/OVERRIDE_guns_lefthand.dmi'
+ righthand_file = 'modular_citadel/icons/mob/inhands/OVERRIDE_guns_righthand.dmi'
+
+/obj/item/gun/energy/laser/practice
+ icon_state = "laser-p"
+
+/obj/item/gun/energy/laser/bluetag
+ lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
+
+/obj/item/gun/energy/laser/redtag
+ lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
+
+/obj/item/gun/energy/laser/carbine
+ name = "VGS blaster carbine"
+ desc = "A ruggedized laser carbine featuring much higher capacity and improved handling when compared to a normal blaster carbine."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "lasernew"
+ item_state = "laser"
+ force = 10
+ throwforce = 10
+ ammo_type = list(/obj/item/ammo_casing/energy/lasergun)
+ cell_type = /obj/item/stock_parts/cell/lascarbine
+
+/obj/item/gun/energy/laser/carbine/nopin
+ pin = null
+
+/obj/item/stock_parts/cell/lascarbine
+ name = "laser carbine power supply"
+ maxcharge = 2500
+
+/datum/design/lasercarbine
+ name = "VGS Blaster Carbine"
+ desc = "Beefed up version of a normal blaster carbine."
+ id = "lasercarbine"
+ build_type = PROTOLATHE
+ materials = list(MAT_GOLD = 2500, MAT_METAL = 5000, MAT_GLASS = 5000)
+ build_path = /obj/item/gun/energy/laser/carbine/nopin
+ category = list("Weapons")
\ No newline at end of file
diff --git a/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm b/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm
new file mode 100644
index 0000000000..8fcf7a6463
--- /dev/null
+++ b/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm
@@ -0,0 +1,199 @@
+/*
+// PUMP-ACTION ENERGY GUNS
+*/
+
+/obj/item/gun/energy/pumpaction //parent object with all procs defined under. Useless in-game, but VERY important codewise
+ icon_state = "blaster"
+ name = "pump-action particle blaster"
+ desc = "A pump action energy gun that requires manual racking to charge supercapacitors."
+ icon = 'modular_citadel/icons/obj/guns/pumpactionblaster.dmi'
+ cell_type = /obj/item/stock_parts/cell/pumpaction
+ var/recentpump = 0 // to prevent spammage
+
+/obj/item/gun/energy/pumpaction/emp_act(severity) //makes it not rack itself when emp'd
+ cell.use(round(cell.charge / severity))
+ chambered = null //we empty the chamber
+ update_icon()
+
+/obj/item/gun/energy/pumpaction/process() //makes it not rack itself when self-charging
+ if(selfcharge)
+ charge_tick++
+ if(charge_tick < charge_delay)
+ return
+ charge_tick = 0
+ if(!cell)
+ return
+ cell.give(100)
+ update_icon()
+
+/obj/item/gun/energy/pumpaction/attack_self(mob/living/user) //makes clicking on it in hand pump it
+ if(recentpump > world.time)
+ return
+ pump(user)
+ recentpump = world.time + 10
+ return
+
+/obj/item/gun/energy/pumpaction/process_chamber() //makes it so that it doesn't rack itself after firing
+ if(chambered && !chambered.BB) //if BB is null, i.e the shot has been fired...
+ var/obj/item/ammo_casing/energy/shot = chambered
+ cell.use(shot.e_cost)//... drain the cell cell
+ chambered = null //either way, released the prepared shot
+
+/obj/item/gun/energy/pumpaction/select_fire(mob/living/user) //makes it so that it doesn't rack itself when changing firing modes unless already racked
+ select++
+ if (select > ammo_type.len)
+ select = 1
+ var/obj/item/ammo_casing/energy/shot = ammo_type[select]
+ fire_sound = shot.fire_sound
+ fire_delay = shot.delay
+ if (shot.select_name)
+ to_chat(user, "[src] is now set to [shot.select_name]. ")
+ if(chambered)
+ chambered = null
+ recharge_newshot(1)
+ update_icon()
+ if(ismob(loc)) //forces inhands to update
+ var/mob/M = loc
+ M.update_inv_hands()
+ return
+
+/obj/item/gun/energy/pumpaction/update_icon() //adds racked indicators
+ ..()
+ var/obj/item/ammo_casing/energy/shot = ammo_type[select]
+ if(chambered)
+ add_overlay("[icon_state]_rack_[shot.select_name]")
+ else
+ add_overlay("[icon_state]_rack_empty")
+
+/obj/item/gun/energy/pumpaction/proc/pump(mob/M) //pumping proc. Checks if the gun is empty and plays a different sound if it is.
+ var/obj/item/ammo_casing/energy/shot = ammo_type[select]
+ if(cell.charge < shot.e_cost)
+ playsound(M, 'modular_citadel/sound/weapons/laserPumpEmpty.ogg', 100, 1) //Ends with three beeps made from highly processed knife honing noises
+ else
+ playsound(M, 'modular_citadel/sound/weapons/laserPump.ogg', 100, 1) //Ends with high pitched charging noise
+ recharge_newshot() //try to charge a new shot
+ update_icon()
+ return 1
+
+/obj/item/gun/energy/pumpaction/AltClick(mob/living/user) //for changing firing modes since attackself is already used for pumping
+ if(!in_range(src, user)) //Basic checks to prevent abuse
+ return
+ if(user.incapacitated() || !istype(user))
+ to_chat(user, "You can't do that right now! ")
+ return
+
+ if(ammo_type.len > 1)
+ select_fire(user)
+ update_icon()
+
+/obj/item/gun/energy/pumpaction/examine(mob/user) //so people don't ask HOW TO CHANGE FIRING MODE
+ ..()
+ to_chat(user, "Alt-click to change firing modes. ")
+
+/obj/item/gun/energy/pumpaction/worn_overlays(isinhands, icon_file) //ammo counter for inhands
+ . = ..()
+ var/ratio = CEILING((cell.charge / cell.maxcharge) * charge_sections, 1)
+ var/obj/item/ammo_casing/energy/shot = ammo_type[select]
+ if(isinhands)
+ if(cell.charge < shot.e_cost)
+ var/mutable_appearance/ammo_inhand = mutable_appearance(icon_file, "[item_state]_empty")
+ . += ammo_inhand
+ else
+ var/mutable_appearance/ammo_inhand = mutable_appearance(icon_file, "[item_state]_charge_[shot.select_name][ratio]")
+ . += ammo_inhand
+ if(chambered)
+ var/mutable_appearance/rack_inhand = mutable_appearance(icon_file, "[item_state]_rack_[shot.select_name]")
+ . += rack_inhand
+ else
+ var/mutable_appearance/rack_inhand = mutable_appearance(icon_file, "[item_state]_rack_empty")
+ . += rack_inhand
+
+/obj/item/stock_parts/cell/pumpaction //nice number to achieve the amount of shots wanted
+ name = "pump action particle blaster power supply"
+ maxcharge = 1200
+
+//PUMP ACTION DISABLER
+
+/obj/item/gun/energy/pumpaction/blaster
+ icon_state = "blaster"
+ name = "pump-action particle blaster"
+ desc = "A non-lethal pump-action particle blaster with an overdrive firing mode. Requires manual racking after every shot to charge an integral bank of supercapacitors."
+ item_state = "particleblaster"
+ lefthand_file = 'modular_citadel/icons/mob/inhands/guns_lefthand.dmi'
+ righthand_file = 'modular_citadel/icons/mob/inhands/guns_righthand.dmi'
+ ammo_type = list(/obj/item/ammo_casing/energy/laser/scatter/disabler/pump, /obj/item/ammo_casing/energy/disabler/slug)
+ ammo_x_offset = 2
+ modifystate = 1
+
+//WARDEN'S SPECIAL vERSION
+
+/obj/item/gun/energy/pumpaction/defender
+ icon_state = "defender"
+ name = "particle defender"
+ desc = "A pump-action particle blaster with a unique particle focusing chamber optimized for decisive de-escalation. Requires manual racking after every shot to charge an integral bank of supercapacitors."
+ item_state = "particleblaster"
+ lefthand_file = 'modular_citadel/icons/mob/inhands/guns_lefthand.dmi'
+ righthand_file = 'modular_citadel/icons/mob/inhands/guns_righthand.dmi'
+ ammo_type = list(/obj/item/ammo_casing/energy/electrode/pump, /obj/item/ammo_casing/energy/laser/pump)
+ ammo_x_offset = 2
+ modifystate = 1
+
+//AMMO CASINGS (fire modes)
+
+/obj/item/ammo_casing/energy/laser/scatter/disabler/pump
+ projectile_type = /obj/item/projectile/beam/disabler/weak
+ e_cost = 150
+ pellets = 5
+ variance = 30
+ fire_sound = 'modular_citadel/sound/weapons/ParticleBlaster.ogg'
+ select_name = "disable"
+
+/obj/item/ammo_casing/energy/disabler/slug
+ projectile_type = /obj/item/projectile/beam/disabler/slug
+ select_name = "overdrive"
+ e_cost = 200
+ fire_sound = 'modular_citadel/sound/weapons/LaserSlugv3.ogg'
+
+/obj/item/ammo_casing/energy/laser/pump
+ projectile_type = /obj/item/projectile/beam/weak
+ e_cost = 200
+ select_name = "kill"
+ pellets = 3
+ variance = 15
+ fire_sound = 'modular_citadel/sound/weapons/ParticleBlaster.ogg'
+
+/obj/item/ammo_casing/energy/electrode/pump
+ projectile_type = /obj/item/projectile/energy/electrode/pump
+ select_name = "stun"
+ fire_sound = 'modular_citadel/sound/weapons/LaserSlugv3.ogg'
+ e_cost = 300
+ pellets = 3
+ variance = 20
+
+//PROJECTILES
+
+/obj/item/projectile/beam/disabler/weak
+ name = "particle blast"
+ damage = 18
+ icon_state = "disablerpellet"
+ icon = 'modular_citadel/icons/obj/projectiles.dmi'
+
+/obj/item/projectile/beam/disabler/slug
+ name = "positron blast"
+ damage = 60
+ range = 14
+ speed = 0.6
+ icon_state = "disablerslug"
+ icon = 'modular_citadel/icons/obj/projectiles.dmi'
+
+/obj/item/projectile/energy/electrode/pump
+ name = "electron blast"
+ icon_state = "stunjectile"
+ icon = 'modular_citadel/icons/obj/projectiles.dmi'
+ color = null
+ nodamage = 1
+ knockdown = 100
+ stutter = 5
+ jitter = 20
+ hitsound = 'sound/weapons/taserhit.ogg'
+ range = 7
\ No newline at end of file
diff --git a/modular_citadel/code/modules/projectiles/guns/toys.dm b/modular_citadel/code/modules/projectiles/guns/toys.dm
new file mode 100644
index 0000000000..d6b80a95e5
--- /dev/null
+++ b/modular_citadel/code/modules/projectiles/guns/toys.dm
@@ -0,0 +1,60 @@
+/*
+// NEW TOYS GUNS GO HERE
+*/
+
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+//HITSCAN EXPERIMENT
+
+/obj/item/gun/energy/pumpaction/toy
+ icon_state = "blastertoy"
+ name = "pump-action plastic blaster"
+ desc = "A fearsome toy of terrible power. It has the ability to fire beams of pure light in either dispersal mode or overdrive mode. Requires the operation of a 40KW power shunt between every shot to prepare the beam focusing chamber."
+ item_state = "particleblaster"
+ lefthand_file = 'modular_citadel/icons/mob/inhands/guns_lefthand.dmi'
+ righthand_file = 'modular_citadel/icons/mob/inhands/guns_righthand.dmi'
+ ammo_type = list(/obj/item/ammo_casing/energy/laser/dispersal, /obj/item/ammo_casing/energy/laser/wavemotion)
+ ammo_x_offset = 2
+ modifystate = 1
+ selfcharge = TRUE
+ item_flags = NONE
+ clumsy_check = FALSE
+
+//PROJECTILES
+
+/obj/item/projectile/beam/lasertag/wavemotion
+ tracer_type = /obj/effect/projectile/tracer/laser/wavemotion
+ muzzle_type = /obj/effect/projectile/muzzle/laser/wavemotion
+ impact_type = /obj/effect/projectile/impact/laser/wavemotion
+ hitscan = TRUE
+
+/obj/item/projectile/beam/lasertag/dispersal
+ tracer_type = /obj/effect/projectile/tracer/laser/blue
+ muzzle_type = /obj/effect/projectile/muzzle/laser/blue
+ impact_type = /obj/effect/projectile/impact/laser/blue
+ hitscan = TRUE
+
+//AMMO CASINGS
+
+/obj/item/ammo_casing/energy/laser/wavemotion
+ projectile_type = /obj/item/projectile/beam/lasertag/wavemotion
+ select_name = "overdrive"
+ e_cost = 300
+ fire_sound = 'modular_citadel/sound/weapons/LaserSlugv3.ogg'
+
+/obj/item/ammo_casing/energy/laser/dispersal
+ projectile_type = /obj/item/projectile/beam/lasertag/dispersal
+ select_name = "dispersal"
+ pellets = 5
+ variance = 25
+ e_cost = 200
+ fire_sound = 'modular_citadel/sound/weapons/ParticleBlaster.ogg'
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////
+//TOY REVOLVER
+
+/obj/item/toy/gun/justicar
+ name = "\improper replica F3 Justicar"
+ desc = "An authentic cap-firing reproduction of a F3 Justicar big-bore revolver! Pretend to blow your friend's brains out with this 100% safe toy! Satisfaction guaranteed!"
+ icon_state = "justicar"
+ icon = 'modular_citadel/icons/obj/guns/toys.dmi'
+ materials = list(MAT_METAL=2000, MAT_GLASS=250)
\ No newline at end of file
diff --git a/modular_citadel/code/modules/projectiles/projectile/energy.dm b/modular_citadel/code/modules/projectiles/projectile/energy.dm
new file mode 100644
index 0000000000..8c5725a8a3
--- /dev/null
+++ b/modular_citadel/code/modules/projectiles/projectile/energy.dm
@@ -0,0 +1,2 @@
+/obj/item/projectile/energy/electrode
+ stamina = 30
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/other_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/other_reagents.dm
new file mode 100644
index 0000000000..0b57c621f2
--- /dev/null
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -0,0 +1,7 @@
+/datum/reagent/space_cleaner/reaction_obj(obj/O, reac_volume)
+ if(istype(O, /obj/effect/decal/cleanable) || istype(O, /obj/item/projectile/bullet/reusable/foam_dart) || istype(O, /obj/item/ammo_casing/caseless/foam_dart))
+ qdel(O)
+ else
+ if(O)
+ O.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
+ O.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
diff --git a/code/citadel/cit_kegs.dm b/modular_citadel/code/modules/reagents/reagent container/cit_kegs.dm
similarity index 93%
rename from code/citadel/cit_kegs.dm
rename to modular_citadel/code/modules/reagents/reagent container/cit_kegs.dm
index d7e4ac03b9..d40dba8a3f 100644
--- a/code/citadel/cit_kegs.dm
+++ b/modular_citadel/code/modules/reagents/reagent container/cit_kegs.dm
@@ -1,7 +1,7 @@
/obj/structure/reagent_dispensers/keg
name = "keg"
desc = "A keg."
- icon = 'code/citadel/icons/objects.dmi'
+ icon = 'modular_citadel/icons/obj/objects.dmi'
icon_state = "keg"
reagent_id = "water"
diff --git a/modular_citadel/code/modules/reagents/reagent container/hypospraymkii.dm b/modular_citadel/code/modules/reagents/reagent container/hypospraymkii.dm
new file mode 100644
index 0000000000..e89068c95f
--- /dev/null
+++ b/modular_citadel/code/modules/reagents/reagent container/hypospraymkii.dm
@@ -0,0 +1,223 @@
+#define HYPO_SPRAY 0
+#define HYPO_INJECT 1
+
+//A vial-loaded hypospray. Cartridge-based!
+/obj/item/reagent_containers/hypospray/mkii
+ name = "hypospray mk.II"
+ icon = 'modular_citadel/icons/obj/hypospraymkii.dmi'
+ icon_state = "hypo2"
+ var/list/allowed_containers = list(/obj/item/reagent_containers/glass/bottle/vial/small)
+ desc = "A new development from DeForest Medical, this new hypospray takes 30-unit vials as the drug supply for easy swapping."
+ volume = 0
+ amount_per_transfer_from_this = 5
+ possible_transfer_amounts = list(5,10,15)
+ var/mode = HYPO_INJECT
+ var/obj/item/reagent_containers/glass/bottle/vial/vial
+ var/loaded_vial = /obj/item/reagent_containers/glass/bottle/vial/small
+ var/spawnwithvial = TRUE
+ var/start_vial = null
+
+/obj/item/reagent_containers/hypospray/mkii/CMO
+ name = "hypospray mk.II deluxe"
+ allowed_containers = list(/obj/item/reagent_containers/glass/bottle/vial/small, /obj/item/reagent_containers/glass/bottle/vial/large)
+ icon_state = "cmo2"
+ ignore_flags = 1
+ desc = "The Chief Medical Officer's hypospray is identically functional to the base model, excepting that it can take larger vials in addition to regular sized. It is also able to penetrate harder materials and deliver more reagents per spray."
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
+ loaded_vial = /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/CMO
+ possible_transfer_amounts = list(5,10,15,30,60) //cmo hypo should be able to dump lots into it
+
+/obj/item/reagent_containers/hypospray/mkii/Initialize()
+ . = ..()
+ if(!spawnwithvial)
+ update_icon()
+ return
+ if (!start_vial)
+ start_vial = new loaded_vial(src)
+ vial = start_vial
+ update_icon()
+
+/obj/item/reagent_containers/hypospray/mkii/update_icon()
+ ..()
+ icon_state = "[initial(icon_state)][vial ? "" : "-e"]"
+ if(ismob(loc))
+ var/mob/M = loc
+ M.update_inv_hands()
+ return
+
+/obj/item/reagent_containers/hypospray/mkii/examine(mob/user)
+ . = ..()
+ to_chat(user, "[src] is set to [mode ? "Inject" : "Spray"] contents on application.")
+
+/obj/item/reagent_containers/hypospray/mkii/proc/unload_hypo(obj/item/I, mob/user)
+ if((istype(I, /obj/item/reagent_containers/glass/bottle/vial)))
+ var/obj/item/reagent_containers/glass/bottle/vial/V = I
+ reagents.trans_to(V, reagents.total_volume)
+ reagents.maximum_volume = 0
+ V.forceMove(user.loc)
+ user.put_in_hands(V)
+ to_chat(user, "You remove the vial from the [src]. ")
+ vial = null
+ update_icon()
+ playsound(loc, 'sound/weapons/empty.ogg', 50, 1)
+ else
+ to_chat(user, "This hypo isn't loaded! ")
+ return
+
+/obj/item/reagent_containers/hypospray/mkii/attackby(obj/item/I, mob/living/user)
+ if((istype(I, /obj/item/reagent_containers/glass/bottle/vial) && vial != null))
+ to_chat(user, "[src] can not hold more than one vial! ")
+ return FALSE
+ if((istype(I, /obj/item/reagent_containers/glass/bottle/vial)))
+ var/obj/item/reagent_containers/glass/bottle/vial/V = I
+ if(!is_type_in_list(V, allowed_containers))
+ to_chat(user, "\The [src] doesn't accept this vial. ")
+ return
+ vial = V
+ reagents.maximum_volume = V.volume
+ V.reagents.trans_to(src, V.reagents.total_volume)
+ if(!user.transferItemToLoc(V,src))
+ return
+ user.visible_message("[user] has loads vial into \the [src]. ","You have loaded [vial] into \the [src]. ")
+ update_icon()
+ playsound(loc, 'sound/weapons/autoguninsert.ogg', 50, 1)
+ return TRUE
+ else
+ to_chat(user, "This doesn't fit in \the [src]. ")
+ return FALSE
+ return FALSE
+
+/obj/item/reagent_containers/hypospray/mkii/attack(obj/item/I, mob/user, params)
+ return
+
+/obj/item/reagent_containers/hypospray/mkii/afterattack(atom/target, mob/user, proximity)
+ if(!proximity)
+ return
+
+ if(!ismob(target))
+ return
+
+ var/mob/living/L
+ if(isliving(target))
+ L = target
+ if(!L.can_inject(user, 1))
+ return
+
+ if(!L && !target.is_injectable()) //only checks on non-living mobs, due to how can_inject() handles
+ to_chat(user, "You cannot directly fill [target]! ")
+ return
+
+ if(target.reagents.total_volume >= target.reagents.maximum_volume)
+ to_chat(user, "[target] is full. ")
+ return
+
+ if(ishuman(L))
+ var/obj/item/bodypart/affecting = L.get_bodypart(check_zone(user.zone_selected))
+ if(!affecting)
+ to_chat(user, "The limb is missing! ")
+ return
+ if(affecting.status != BODYPART_ORGANIC)
+ to_chat(user, "Medicine won't work on a robotic limb! ")
+ return
+
+ var/contained = reagents.log_list()
+ add_logs(user, L, "attemped to inject", src, addition="which had [contained]")
+//Always log attemped injections for admins
+ if(vial != null)
+ switch(mode)
+ if(HYPO_INJECT)
+ if(L) //living mob
+ if(!L.can_inject(user, TRUE))
+ return
+ if(L != user)
+ L.visible_message("[user] is trying to inject [L] with [src]! ", \
+ "[user] is trying to inject [L] with the [src]! ")
+ if(!do_mob(user, L, extra_checks=CALLBACK(L, /mob/living/proc/can_inject,user,1)))
+ return
+ if(!reagents.total_volume)
+ return
+ if(L.reagents.total_volume >= L.reagents.maximum_volume)
+ return
+ L.visible_message("[user] uses the [src] on [L]! ", \
+ "[user] uses the [src] on [L]! ")
+ else
+ if(!do_mob(user, L, extra_checks=CALLBACK(L, /mob/living/proc/can_inject,user,1)))
+ return
+ if(!reagents.total_volume)
+ return
+ if(L.reagents.total_volume >= L.reagents.maximum_volume)
+ return
+ log_attack("[user.name] ([user.ckey]) applied [src] to [L.name] ([L.ckey]), which had [contained] (INTENT: [uppertext(user.a_intent)]) (MODE: [src.mode]) ")
+ L.log_message("applied [src] to themselves ([contained]). ", INDIVIDUAL_ATTACK_LOG)
+
+ var/fraction = min(amount_per_transfer_from_this/reagents.total_volume, 1)
+ reagents.reaction(L, INJECT, fraction)
+ reagents.trans_to(target, amount_per_transfer_from_this)
+ if(amount_per_transfer_from_this >= 15)
+ playsound(loc,'sound/items/hypospray_long.ogg',50, 1, -1)
+ if(amount_per_transfer_from_this < 15)
+ playsound(loc, pick('sound/items/hypospray.ogg','sound/items/hypospray2.ogg'), 50, 1, -1)
+ to_chat(user, "You inject [amount_per_transfer_from_this] units of the solution. The hypospray's cartridge now contains [reagents.total_volume] units. ")
+
+ if(HYPO_SPRAY)
+ if(L) //living mob
+ if(!L.can_inject(user, TRUE))
+ return
+ if(L != user)
+ L.visible_message("[user] is trying to inject [L] with [src]! ", \
+ "[user] is trying to inject [L] with the [src]! ")
+ if(!do_mob(user, L, extra_checks=CALLBACK(L, /mob/living/proc/can_inject,user,1)))
+ return
+ if(!reagents.total_volume)
+ return
+ if(L.reagents.total_volume >= L.reagents.maximum_volume)
+ return
+ L.visible_message("[user] uses the [src] on [L]! ", \
+ "[user] uses the [src] on [L]! ")
+ else
+ if(!do_mob(user, L, extra_checks=CALLBACK(L, /mob/living/proc/can_inject,user,1)))
+ return
+ if(!reagents.total_volume)
+ return
+ if(L.reagents.total_volume >= L.reagents.maximum_volume)
+ return
+ log_attack("[user.name] ([user.ckey]) applied [src] to [L.name] ([L.ckey]), which had [contained] (INTENT: [uppertext(user.a_intent)]) (MODE: [src.mode]) ")
+ L.log_message("applied [src] to themselves ([contained]). ", INDIVIDUAL_ATTACK_LOG)
+ var/fraction = min(amount_per_transfer_from_this/reagents.total_volume, 1)
+ reagents.reaction(L, PATCH, fraction)
+ reagents.trans_to(target, amount_per_transfer_from_this)
+ if(amount_per_transfer_from_this >= 15)
+ playsound(loc,'sound/items/hypospray_long.ogg',50, 1, -1)
+ if(amount_per_transfer_from_this < 15)
+ playsound(loc, pick('sound/items/hypospray.ogg','sound/items/hypospray2.ogg'), 50, 1, -1)
+ to_chat(user, "You spray [amount_per_transfer_from_this] units of the solution. The hypospray's cartridge now contains [reagents.total_volume] units. ")
+ else
+ to_chat(user, "[src] doesn't work here! ")
+ return
+
+/obj/item/reagent_containers/hypospray/mkii/AltClick(mob/living/user)
+ if(user)
+ if(user.incapacitated())
+ return
+ else if(!contents)
+ to_chat(user, "This Hypo needs to be loaded first!")
+ return
+ else
+ for(var/obj/item/I in contents)
+ unload_hypo(I,user)
+
+/obj/item/reagent_containers/hypospray/mkii/verb/modes()
+ set name = "Change Application Method"
+ set category = "Object"
+ set src in usr
+ var/mob/M = usr
+ var/choice = alert(M, "Which application mode should this be? Current mode is: [mode ? "Spray" : "Inject"]", "", "Spray", "Cancel", "Inject")
+ switch(choice)
+ if("Cancel")
+ return
+ if("Inject")
+ mode = HYPO_INJECT
+ to_chat(M, "[src] is now set to inject contents on application.")
+ if("Spray")
+ mode = HYPO_SPRAY
+ to_chat(M, "[src] is now set to spray contents on application.")
\ No newline at end of file
diff --git a/modular_citadel/code/modules/reagents/reagent container/hypovial.dm b/modular_citadel/code/modules/reagents/reagent container/hypovial.dm
new file mode 100644
index 0000000000..e3e82e22a7
--- /dev/null
+++ b/modular_citadel/code/modules/reagents/reagent container/hypovial.dm
@@ -0,0 +1,116 @@
+/obj/item/reagent_containers/glass/bottle/vial
+ name = "hypospray vial"
+ desc = "This is a vial suitable for loading into mk II hyposprays."
+ icon = 'modular_citadel/icons/obj/vial.dmi'
+ icon_state = "hypovial"
+ spillable = FALSE
+ var/comes_with = list() //Easy way of doing this.
+ volume = 10
+ obj_flags = UNIQUE_RENAME
+ unique_reskin = list("Hypospray vial" = "hypovial",
+ "Red hypospray vial" = "hypovial-b",
+ "Blue hypospray vial" = "hypovial-d",
+ "Green hypospray vial" = "hypovial-a",
+ "Orange hypospray vial" = "hypovial-k",
+ "Purple hypospray vial" = "hypovial-p",
+ "Black hypospray vial" = "hypovial-t"
+ )
+
+/obj/item/reagent_containers/glass/bottle/vial/Initialize()
+ . = ..()
+ if(!icon_state)
+ icon_state = "hypovial"
+ update_icon()
+ for(var/R in comes_with)
+ reagents.add_reagent(R,comes_with[R])
+
+/obj/item/reagent_containers/glass/bottle/vial/on_reagent_change()
+ update_icon()
+
+/obj/item/reagent_containers/glass/bottle/vial/update_icon()
+ cut_overlays()
+ if(reagents.total_volume)
+ var/mutable_appearance/filling = mutable_appearance('modular_citadel/icons/obj/vial.dmi', "[icon_state]10")
+
+ var/percent = round((reagents.total_volume / volume) * 100)
+ switch(percent)
+ if(0 to 9)
+ filling.icon_state = "[icon_state]10"
+ if(10 to 29)
+ filling.icon_state = "[icon_state]25"
+ if(30 to 49)
+ filling.icon_state = "[icon_state]50"
+ if(50 to 69)
+ filling.icon_state = "[icon_state]75"
+ if(70 to INFINITY)
+ filling.icon_state = "[icon_state]100"
+
+ filling.color = mix_color_from_reagents(reagents.reagent_list)
+ add_overlay(filling)
+
+/obj/item/reagent_containers/glass/bottle/vial/small
+ volume = 30
+
+/obj/item/reagent_containers/glass/bottle/vial/large
+ name = "large hypospray vial"
+ desc = "This is a vial suitable for loading into the Chief Medical Officer's Hypospray mk II."
+ icon_state = "hypoviallarge"
+ volume = 60
+ unique_reskin = list("Large hypospray vial" = "hypoviallarge",
+ "Red hypospray vial" = "hypoviallarge-b",
+ "Blue hypospray vial" = "hypoviallarge-d",
+ "Green hypospray vial" = "hypoviallarge-a",
+ "Orange hypospray vial" = "hypoviallarge-k",
+ "Purple hypospray vial" = "hypoviallarge-p",
+ "Black hypospray vial" = "hypoviallarge-t"
+ )
+
+/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/bicaridine
+ name = "vial (bicaridine)"
+ icon_state = "hypovial-b"
+ comes_with = list("bicaridine" = 30)
+
+/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/antitoxin
+ name = "vial (Anti-Tox)"
+ icon_state = "hypovial-a"
+ comes_with = list("antitoxin" = 30)
+
+/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/kelotane
+ name = "vial (kelotane)"
+ icon_state = "hypovial-k"
+ comes_with = list("kelotane" = 30)
+
+/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/dexalin
+ name = "vial (dexalin)"
+ icon_state = "hypovial-d"
+ comes_with = list("dexalin" = 30)
+
+/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/tricordrazine
+ name = "vial (tricordrazine)"
+ icon_state = "hypovial"
+ comes_with = list("tricordrazine" = 30)
+
+/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/CMO
+ name = "large vial (CMO Special)"
+ icon_state = "hypoviallarge-cmos"
+ comes_with = list("epinephrine" = 15, "kelotane" = 15, "charcoal" = 15, "bicaridine" = 15)
+
+/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/bicaridine
+ name = "large vial (bicaridine)"
+ icon_state = "hypoviallarge-b"
+ comes_with = list("bicaridine" = 60)
+
+/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/antitoxin
+ name = "large vial (Anti-Tox)"
+ icon_state = "hypoviallarge-a"
+ comes_with = list("antitoxin" = 60)
+
+/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/kelotane
+ name = "large vial (kelotane)"
+ icon_state = "hypoviallarge-k"
+ comes_with = list("kelotane" = 60)
+
+/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/dexalin
+ name = "large vial (dexalin)"
+ icon_state = "hypoviallarge-d"
+ comes_with = list("dexalin" = 60)
diff --git a/code/citadel/cit_reagents.dm b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm
similarity index 98%
rename from code/citadel/cit_reagents.dm
rename to modular_citadel/code/modules/reagents/reagents/cit_reagents.dm
index df4af10faa..01c5e005a3 100644
--- a/code/citadel/cit_reagents.dm
+++ b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm
@@ -29,7 +29,7 @@
gender = PLURAL
density = 0
layer = ABOVE_NORMAL_TURF_LAYER
- icon = 'code/citadel/icons/effects.dmi'
+ icon = 'modular_citadel/icons/obj/genitals/effects.dmi'
icon_state = "semen1"
random_icon_states = list("semen1", "semen2", "semen3", "semen4")
@@ -59,7 +59,7 @@
gender = PLURAL
density = 0
layer = ABOVE_NORMAL_TURF_LAYER
- icon = 'code/citadel/icons/effects.dmi'
+ icon = 'modular_citadel/icons/obj/genitals/effects.dmi'
icon_state = "fem1"
random_icon_states = list("fem1", "fem2", "fem3", "fem4")
blood_state = null
@@ -260,7 +260,7 @@
/obj/item/reagent_containers/food/drinks/bottle/sake
name = "Traditional Sake"
desc = "Sweet as can be, and burns like foxfire going down."
- icon = 'code/citadel/icons/drinks.dmi'
+ icon = 'modular_citadel/icons/obj/drinks.dmi'
icon_state = "sakebottle"
list_reagents = list("sake" = 100)
diff --git a/modular_citadel/code/modules/recycling/disposal/bin.dm b/modular_citadel/code/modules/recycling/disposal/bin.dm
new file mode 100644
index 0000000000..226c56d226
--- /dev/null
+++ b/modular_citadel/code/modules/recycling/disposal/bin.dm
@@ -0,0 +1,6 @@
+/obj/machinery/disposal/bin/alt_attack_hand(mob/user)
+ if(is_interactable() && !user.stat)
+ flush = !flush
+ update_icon()
+ return TRUE
+ return FALSE
diff --git a/modular_citadel/code/modules/research/designs/autoylathe_designs.dm b/modular_citadel/code/modules/research/designs/autoylathe_designs.dm
index a257513e96..f0e98a5bfe 100644
--- a/modular_citadel/code/modules/research/designs/autoylathe_designs.dm
+++ b/modular_citadel/code/modules/research/designs/autoylathe_designs.dm
@@ -624,3 +624,27 @@
materials = list(MAT_PLASTIC = 4000, MAT_METAL = 500)
build_path = /obj/item/gun/ballistic/automatic/AM4C
category = list("initial", "Rifles")
+
+/datum/design/foam_f3
+ name = "Replica F3 Justicar"
+ id = "foam_f3"
+ build_type = AUTOYLATHE
+ materials = list(MAT_PLASTIC = 2000, MAT_METAL = 250)
+ build_path = /obj/item/toy/gun/justicar
+ category = list("initial", "Pistols")
+
+/datum/design/toy_blaster
+ name = "pump-action plastic blaster"
+ id = "toy_blaster"
+ build_type = AUTOYLATHE
+ materials = list(MAT_PLASTIC = 2000, MAT_METAL = 750, MAT_GLASS = 1000)
+ build_path = /obj/item/gun/energy/pumpaction/toy
+ category = list("initial", "Rifles")
+
+/datum/design/capammo
+ name = "Box of Caps"
+ id = "capammo"
+ build_type = AUTOYLATHE
+ materials = list(MAT_METAL = 10, MAT_GLASS = 10)
+ build_path = /obj/item/toy/ammo/gun
+ category = list("initial", "Misc")
\ No newline at end of file
diff --git a/modular_citadel/code/modules/vore/eating/belly_dat_vr.dm b/modular_citadel/code/modules/vore/eating/belly_dat_vr.dm
new file mode 100644
index 0000000000..3886eb14cf
--- /dev/null
+++ b/modular_citadel/code/modules/vore/eating/belly_dat_vr.dm
@@ -0,0 +1,162 @@
+// THIS IS NOW MERELY LEGACY, because memes. hopefully it won't be dumb.
+
+//
+// The belly object is what holds onto a mob while they're inside a predator.
+// It takes care of altering the pred's decription, digesting the prey, relaying struggles etc.
+//
+
+// If you change what variables are on this, then you need to update the copy() proc.
+
+//
+// Parent type of all the various "belly" varieties.
+//
+/datum/belly
+ var/name // Name of this location
+ var/inside_flavor // Flavor text description of inside sight/sound/smells/feels.
+ var/vore_sound = 'sound/vore/pred/swallow_01.ogg' // Sound when ingesting someone
+ var/vore_verb = "ingest" // Verb for eating with this in messages
+ var/human_prey_swallow_time = 10 SECONDS // Time in deciseconds to swallow /mob/living/carbon/human
+ var/nonhuman_prey_swallow_time = 5 SECONDS // Time in deciseconds to swallow anything else
+ var/emoteTime = 30 SECONDS // How long between stomach emotes at prey
+ var/digest_brute = 0 // Brute damage per tick in digestion mode
+ var/digest_burn = 1 // Burn damage per tick in digestion mode
+ var/digest_tickrate = 9 // Modulus this of air controller tick number to iterate gurgles on
+ var/immutable = FALSE // Prevents this belly from being deleted
+ var/escapable = FALSE // Belly can be resisted out of at any time
+ var/escapetime = 60 SECONDS // Deciseconds, how long to escape this belly
+ var/digestchance = 0 // % Chance of stomach beginning to digest if prey struggles
+// var/silenced = FALSE // Will the heartbeat/fleshy internal loop play?
+ var/escapechance = 0 // % Chance of prey beginning to escape if prey struggles.
+
+ var/datum/belly/transferlocation = null // Location that the prey is released if they struggle and get dropped off.
+ var/transferchance = 0 // % Chance of prey being transferred to transfer location when resisting
+ var/autotransferchance = 0 // % Chance of prey being autotransferred to transfer location
+ var/autotransferwait = 10 // Time between trying to transfer.
+ var/can_taste = FALSE // If this belly prints the flavor of prey when it eats someone.
+
+ var/tmp/digest_mode = DM_HOLD // Whether or not to digest. Default to not digest.
+ var/tmp/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_HEAL,DM_NOISY) // Possible digest modes
+ var/tmp/mob/living/owner // The mob whose belly this is.
+ var/tmp/list/internal_contents = list() // People/Things you've eaten into this belly!
+ var/tmp/is_full // Flag for if digested remeans are present. (for disposal messages)
+ var/tmp/emotePend = FALSE // If there's already a spawned thing counting for the next emote
+ var/swallow_time = 10 SECONDS // for mob transfering automation
+ var/vore_capacity = 1 // The capacity (in people) this person can hold
+
+ // Don't forget to watch your commas at the end of each line if you change these.
+ var/list/struggle_messages_outside = list(
+ "%pred's %belly wobbles with a squirming meal.",
+ "%pred's %belly jostles with movement.",
+ "%pred's %belly briefly swells outward as someone pushes from inside.",
+ "%pred's %belly fidgets with a trapped victim.",
+ "%pred's %belly jiggles with motion from inside.",
+ "%pred's %belly sloshes around.",
+ "%pred's %belly gushes softly.",
+ "%pred's %belly lets out a wet squelch.")
+
+ var/list/struggle_messages_inside = list(
+ "Your useless squirming only causes %pred's slimy %belly to squelch over your body.",
+ "Your struggles only cause %pred's %belly to gush softly around you.",
+ "Your movement only causes %pred's %belly to slosh around you.",
+ "Your motion causes %pred's %belly to jiggle.",
+ "You fidget around inside of %pred's %belly.",
+ "You shove against the walls of %pred's %belly, making it briefly swell outward.",
+ "You jostle %pred's %belly with movement.",
+ "You squirm inside of %pred's %belly, making it wobble around.")
+
+ var/list/digest_messages_owner = list(
+ "You feel %prey's body succumb to your digestive system, which breaks it apart into soft slurry.",
+ "You hear a lewd glorp as your %belly muscles grind %prey into a warm pulp.",
+ "Your %belly lets out a rumble as it melts %prey into sludge.",
+ "You feel a soft gurgle as %prey's body loses form in your %belly. They're nothing but a soft mass of churning slop now.",
+ "Your %belly begins gushing %prey's remains through your system, adding some extra weight to your thighs.",
+ "Your %belly begins gushing %prey's remains through your system, adding some extra weight to your rump.",
+ "Your %belly begins gushing %prey's remains through your system, adding some extra weight to your belly.",
+ "Your %belly groans as %prey falls apart into a thick soup. You can feel their remains soon flowing deeper into your body to be absorbed.",
+ "Your %belly kneads on every fiber of %prey, softening them down into mush to fuel your next hunt.",
+ "Your %belly churns %prey down into a hot slush. You can feel the nutrients coursing through your digestive track with a series of long, wet glorps.")
+
+ var/list/digest_messages_prey = list(
+ "Your body succumbs to %pred's digestive system, which breaks you apart into soft slurry.",
+ "%pred's %belly lets out a lewd glorp as their muscles grind you into a warm pulp.",
+ "%pred's %belly lets out a rumble as it melts you into sludge.",
+ "%pred feels a soft gurgle as your body loses form in their %belly. You're nothing but a soft mass of churning slop now.",
+ "%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's thighs.",
+ "%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's rump.",
+ "%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's belly.",
+ "%pred's %belly groans as you fall apart into a thick soup. Your remains soon flow deeper into %pred's body to be absorbed.",
+ "%pred's %belly kneads on every fiber of your body, softening you down into mush to fuel their next hunt.",
+ "%pred's %belly churns you down into a hot slush. Your nutrient-rich remains course through their digestive track with a series of long, wet glorps.")
+
+ var/list/examine_messages = list(
+ "They have something solid in their %belly!",
+ "It looks like they have something in their %belly!")
+
+ //Mostly for being overridden on precreated bellies on mobs. Could be VV'd into
+ //a carbon's belly if someone really wanted. No UI for carbons to adjust this.
+ //List has indexes that are the digestion mode strings, and keys that are lists of strings.
+ var/list/emote_lists = list()
+
+//OLD: This only exists for legacy conversion purposes
+//It's called whenever an old datum-style belly is loaded
+/datum/belly/proc/copy(obj/belly/new_belly)
+
+ //// Non-object variables
+ new_belly.name = name
+ new_belly.desc = inside_flavor
+ new_belly.vore_sound = vore_sound
+ new_belly.vore_verb = vore_verb
+ new_belly.human_prey_swallow_time = human_prey_swallow_time
+ new_belly.nonhuman_prey_swallow_time = nonhuman_prey_swallow_time
+ new_belly.emote_time = emoteTime
+ new_belly.digest_brute = digest_brute
+ new_belly.digest_burn = digest_burn
+ new_belly.immutable = immutable
+ new_belly.can_taste = can_taste
+ new_belly.escapable = escapable
+ new_belly.escapetime = escapetime
+ new_belly.digestchance = digestchance
+ new_belly.escapechance = escapechance
+ new_belly.transferchance = transferchance
+ new_belly.transferlocation = transferlocation
+
+ //// Object-holding variables
+ //struggle_messages_outside - strings
+ new_belly.struggle_messages_outside.Cut()
+ for(var/I in struggle_messages_outside)
+ new_belly.struggle_messages_outside += I
+
+ //struggle_messages_inside - strings
+ new_belly.struggle_messages_inside.Cut()
+ for(var/I in struggle_messages_inside)
+ new_belly.struggle_messages_inside += I
+
+ //digest_messages_owner - strings
+ new_belly.digest_messages_owner.Cut()
+ for(var/I in digest_messages_owner)
+ new_belly.digest_messages_owner += I
+
+ //digest_messages_prey - strings
+ new_belly.digest_messages_prey.Cut()
+ for(var/I in digest_messages_prey)
+ new_belly.digest_messages_prey += I
+
+ //examine_messages - strings
+ new_belly.examine_messages.Cut()
+ for(var/I in examine_messages)
+ new_belly.examine_messages += I
+
+ //emote_lists - index: digest mode, key: list of strings
+ new_belly.emote_lists.Cut()
+ for(var/K in emote_lists)
+ new_belly.emote_lists[K] = list()
+ for(var/I in emote_lists[K])
+ new_belly.emote_lists[K] += I
+
+ return new_belly
+
+// // // // // // // // // // // //
+// // // LEGACY USE ONLY!! // // //
+// // // // // // // // // // // //
+// See top of file! //
+// // // // // // // // // // // //
diff --git a/modular_citadel/code/modules/vore/eating/belly_obj_vr.dm b/modular_citadel/code/modules/vore/eating/belly_obj_vr.dm
new file mode 100644
index 0000000000..14ded0b7cc
--- /dev/null
+++ b/modular_citadel/code/modules/vore/eating/belly_obj_vr.dm
@@ -0,0 +1,655 @@
+//#define VORE_SOUND_FALLOFF 0.05
+
+//
+// Belly system 2.0, now using objects instead of datums because EH at datums.
+// How many times have I rewritten bellies and vore now? -Aro
+//
+
+// If you change what variables are on this, then you need to update the copy() proc.
+
+//
+// Parent type of all the various "belly" varieties.
+//
+/obj/belly
+ name = "belly" // Name of this location
+ desc = "It's a belly! You're in it!" // Flavor text description of inside sight/sound/smells/feels.
+ var/vore_sound = 'sound/vore/pred/swallow_01.ogg' // Sound when ingesting someone
+ var/vore_verb = "ingest" // Verb for eating with this in messages
+ var/release_sound = 'sound/effects/splat.ogg'
+ var/human_prey_swallow_time = 100 // Time in deciseconds to swallow /mob/living/carbon/human
+ var/nonhuman_prey_swallow_time = 30 // Time in deciseconds to swallow anything else
+ var/emote_time = 60 SECONDS // How long between stomach emotes at prey
+ var/digest_brute = 2 // Brute damage per tick in digestion mode
+ var/digest_burn = 2 // Burn damage per tick in digestion mode
+ var/immutable = FALSE // Prevents this belly from being deleted
+ var/escapable = TRUE // Belly can be resisted out of at any time
+ var/escapetime = 20 SECONDS // Deciseconds, how long to escape this belly
+ var/digestchance = 0 // % Chance of stomach beginning to digest if prey struggles
+ var/absorbchance = 0 // % Chance of stomach beginning to absorb if prey struggles
+ var/escapechance = 100 // % Chance of prey beginning to escape if prey struggles.
+ var/can_taste = FALSE // If this belly prints the flavor of prey when it eats someone.
+ var/bulge_size = 0.25 // The minimum size the prey has to be in order to show up on examine.
+// var/shrink_grow_size = 1 // This horribly named variable determines the minimum/maximum size it will shrink/grow prey to.
+ var/silent = FALSE
+
+ var/transferlocation = null // Location that the prey is released if they struggle and get dropped off.
+ var/transferchance = 0 // % Chance of prey being transferred to transfer location when resisting
+ var/autotransferchance = 0 // % Chance of prey being autotransferred to transfer location
+ var/autotransferwait = 10 // Time between trying to transfer.
+ var/swallow_time = 10 SECONDS // for mob transfering automation
+ var/vore_capacity = 1 // simple animal nom capacity
+
+ //I don't think we've ever altered these lists. making them static until someone actually overrides them somewhere.
+ var/tmp/static/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_HEAL,DM_NOISY) // Possible digest modes
+
+ var/tmp/mob/living/owner // The mob whose belly this is.
+ var/tmp/digest_mode = DM_HOLD // Current mode the belly is set to from digest_modes (+transform_modes if human)
+ var/tmp/next_process = 0 // Waiting for this SSbellies times_fired to process again.
+ var/tmp/list/items_preserved = list() // Stuff that wont digest so we shouldn't process it again.
+ var/tmp/next_emote = 0 // When we're supposed to print our next emote, as a belly controller tick #
+ var/tmp/recent_sound = FALSE // Prevent audio spam
+
+ // Don't forget to watch your commas at the end of each line if you change these.
+ var/list/struggle_messages_outside = list(
+ "%pred's %belly wobbles with a squirming meal.",
+ "%pred's %belly jostles with movement.",
+ "%pred's %belly briefly swells outward as someone pushes from inside.",
+ "%pred's %belly fidgets with a trapped victim.",
+ "%pred's %belly jiggles with motion from inside.",
+ "%pred's %belly sloshes around.",
+ "%pred's %belly gushes softly.",
+ "%pred's %belly lets out a wet squelch.")
+
+ var/list/struggle_messages_inside = list(
+ "Your useless squirming only causes %pred's slimy %belly to squelch over your body.",
+ "Your struggles only cause %pred's %belly to gush softly around you.",
+ "Your movement only causes %pred's %belly to slosh around you.",
+ "Your motion causes %pred's %belly to jiggle.",
+ "You fidget around inside of %pred's %belly.",
+ "You shove against the walls of %pred's %belly, making it briefly swell outward.",
+ "You jostle %pred's %belly with movement.",
+ "You squirm inside of %pred's %belly, making it wobble around.")
+
+ var/list/digest_messages_owner = list(
+ "You feel %prey's body succumb to your digestive system, which breaks it apart into soft slurry.",
+ "You hear a lewd glorp as your %belly muscles grind %prey into a warm pulp.",
+ "Your %belly lets out a rumble as it melts %prey into sludge.",
+ "You feel a soft gurgle as %prey's body loses form in your %belly. They're nothing but a soft mass of churning slop now.",
+ "Your %belly begins gushing %prey's remains through your system, adding some extra weight to your thighs.",
+ "Your %belly begins gushing %prey's remains through your system, adding some extra weight to your rump.",
+ "Your %belly begins gushing %prey's remains through your system, adding some extra weight to your belly.",
+ "Your %belly groans as %prey falls apart into a thick soup. You can feel their remains soon flowing deeper into your body to be absorbed.",
+ "Your %belly kneads on every fiber of %prey, softening them down into mush to fuel your next hunt.",
+ "Your %belly churns %prey down into a hot slush. You can feel the nutrients coursing through your digestive track with a series of long, wet glorps.")
+
+ var/list/digest_messages_prey = list(
+ "Your body succumbs to %pred's digestive system, which breaks you apart into soft slurry.",
+ "%pred's %belly lets out a lewd glorp as their muscles grind you into a warm pulp.",
+ "%pred's %belly lets out a rumble as it melts you into sludge.",
+ "%pred feels a soft gurgle as your body loses form in their %belly. You're nothing but a soft mass of churning slop now.",
+ "%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's thighs.",
+ "%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's rump.",
+ "%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's belly.",
+ "%pred's %belly groans as you fall apart into a thick soup. Your remains soon flow deeper into %pred's body to be absorbed.",
+ "%pred's %belly kneads on every fiber of your body, softening you down into mush to fuel their next hunt.",
+ "%pred's %belly churns you down into a hot slush. Your nutrient-rich remains course through their digestive track with a series of long, wet glorps.")
+
+ var/list/examine_messages = list(
+ "They have something solid in their %belly!",
+ "It looks like they have something in their %belly!")
+
+ //Mostly for being overridden on precreated bellies on mobs. Could be VV'd into
+ //a carbon's belly if someone really wanted. No UI for carbons to adjust this.
+ //List has indexes that are the digestion mode strings, and keys that are lists of strings.
+ var/tmp/list/emote_lists = list()
+
+//For serialization, keep this updated, required for bellies to save correctly.
+/obj/belly/vars_to_save()
+ return ..() + list(
+ "name",
+ "desc",
+ "vore_sound",
+ "vore_verb",
+ "release_sound",
+ "human_prey_swallow_time",
+ "nonhuman_prey_swallow_time",
+ "emote_time",
+ "digest_brute",
+ "digest_burn",
+ "immutable",
+ "can_taste",
+ "escapable",
+ "escapetime",
+ "digestchance",
+ "absorbchance",
+ "escapechance",
+ "transferchance",
+ "transferlocation",
+ "bulge_size",
+ "struggle_messages_outside",
+ "struggle_messages_inside",
+ "digest_messages_owner",
+ "digest_messages_prey",
+ "examine_messages",
+ "emote_lists",
+ "silent"
+ )
+
+ //ommitted list
+ // "shrink_grow_size",
+/obj/belly/New(var/newloc)
+ . = ..(newloc)
+ //If not, we're probably just in a prefs list or something.
+ if(isliving(newloc))
+ owner = loc
+ owner.vore_organs |= src
+ SSbellies.belly_list += src
+
+/obj/belly/Destroy()
+ SSbellies.belly_list -= src
+ if(owner)
+ owner.vore_organs -= src
+ owner = null
+ . = ..()
+
+// Called whenever an atom enters this belly
+/obj/belly/Entered(var/atom/movable/thing,var/atom/OldLoc)
+ if(OldLoc in contents)
+ return //Someone dropping something (or being stripdigested)
+
+ //Generic entered message
+ to_chat(owner,"[thing] slides into your [lowertext(name)]. ")
+
+ //Sound w/ antispam flag setting
+ if(!silent && !recent_sound)
+ for(var/mob/M in get_hearers_in_view(5, get_turf(owner)))
+ if(M.client && M.client.prefs.toggles & EATING_NOISES)
+ playsound(get_turf(owner),"[src.vore_sound]",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED)
+ recent_sound = TRUE
+
+ //Messages if it's a mob
+ if(isliving(thing))
+ var/mob/living/M = thing
+ if(desc)
+ to_chat(M, "[desc] ")
+ var/taste
+ if(can_taste && (taste = M.get_taste_message(FALSE)))
+ to_chat(owner, "[M] tastes of [taste]. ")
+
+// Release all contents of this belly into the owning mob's location.
+// If that location is another mob, contents are transferred into whichever of its bellies the owning mob is in.
+// Returns the number of mobs so released.
+/obj/belly/proc/release_all_contents(var/include_absorbed = FALSE)
+ var/atom/destination = drop_location()
+ var/count = 0
+ for(var/thing in contents)
+ var/atom/movable/AM = thing
+ if(isliving(AM))
+ var/mob/living/L = AM
+ if(L.absorbed && !include_absorbed)
+ continue
+ L.absorbed = FALSE
+ for(var/mob/living/W in AM)
+ W.stop_sound_channel(CHANNEL_PREYLOOP)
+ AM.forceMove(destination) // Move the belly contents into the same location as belly's owner.
+ count++
+ for(var/mob/M in get_hearers_in_view(5, get_turf(owner)))
+ if(M.client && M.client.prefs.toggles & EATING_NOISES)
+ playsound(get_turf(owner),"[src.release_sound]",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED)
+ items_preserved.Cut()
+ owner.visible_message("[owner] expels everything from their [lowertext(name)]! ")
+ owner.update_icons()
+
+ return count
+
+// Release a specific atom from the contents of this belly into the owning mob's location.
+// If that location is another mob, the atom is transferred into whichever of its bellies the owning mob is in.
+// Returns the number of atoms so released.
+/obj/belly/proc/release_specific_contents(var/atom/movable/M)
+ if (!(M in contents))
+ return FALSE // They weren't in this belly anyway
+
+ M.forceMove(drop_location()) // Move the belly contents into the same location as belly's owner.
+ items_preserved -= M
+ for(var/mob/living/P in M)
+ P.stop_sound_channel(CHANNEL_PREYLOOP)
+ if(release_sound)
+ for(var/mob/H in get_hearers_in_view(5, get_turf(owner)))
+ if(H.client && H.client.prefs.toggles & EATING_NOISES)
+ playsound(get_turf(owner),"[src.release_sound]",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED)
+
+ if(istype(M,/mob/living))
+ var/mob/living/ML = M
+ var/mob/living/OW = owner
+ if(ML.absorbed)
+ ML.absorbed = FALSE
+ if(ishuman(M) && ishuman(OW))
+ var/mob/living/carbon/human/Prey = M
+ var/mob/living/carbon/human/Pred = OW
+ var/absorbed_count = 2 //Prey that we were, plus the pred gets a portion
+ for(var/mob/living/P in contents)
+ if(P.absorbed)
+ absorbed_count++
+ Pred.reagents.trans_to(Prey, Pred.reagents.total_volume / absorbed_count)
+
+ owner.visible_message("[owner] expels [M] from their [lowertext(name)]! ")
+ owner.update_icons()
+ return TRUE
+
+// Actually perform the mechanics of devouring the tasty prey.
+// The purpose of this method is to avoid duplicate code, and ensure that all necessary
+// steps are taken.
+/obj/belly/proc/nom_mob(var/mob/prey, var/mob/user)
+ var/sound/preyloop = sound('sound/vore/prey/loop.ogg', repeat = TRUE)
+ if(owner.stat == DEAD)
+ return
+ if (prey.buckled)
+ prey.buckled.unbuckle_mob(prey,TRUE)
+
+ prey.forceMove(src)
+ prey.playsound_local(loc,preyloop,70,0, channel = CHANNEL_PREYLOOP)
+ owner.updateVRPanel()
+
+ for(var/mob/living/M in contents)
+ M.updateVRPanel()
+
+ // Setup the autotransfer checks if needed
+ if(transferlocation && autotransferchance > 0)
+ addtimer(CALLBACK(src, /obj/belly/.proc/check_autotransfer, prey), autotransferwait)
+
+/obj/belly/proc/check_autotransfer(var/mob/prey)
+ // Some sanity checks
+ if(transferlocation && (autotransferchance > 0) && (prey in contents))
+ if(prob(autotransferchance))
+ // Double check transferlocation isn't insane
+ if(verify_transferlocation())
+ transfer_contents(prey, transferlocation)
+ else
+ // Didn't transfer, so wait before retrying
+ addtimer(CALLBACK(src, /obj/belly/.proc/check_autotransfer, prey), autotransferwait)
+
+/obj/belly/proc/verify_transferlocation()
+ for(var/I in owner.vore_organs)
+ var/obj/belly/B = owner.vore_organs[I]
+ if(B == transferlocation)
+ return TRUE
+
+ for(var/I in owner.vore_organs)
+ var/obj/belly/B = owner.vore_organs[I]
+ if(B == transferlocation)
+ transferlocation = B
+ return TRUE
+ return FALSE
+
+
+// Get the line that should show up in Examine message if the owner of this belly
+// is examined. By making this a proc, we not only take advantage of polymorphism,
+// but can easily make the message vary based on how many people are inside, etc.
+// Returns a string which shoul be appended to the Examine output.
+/obj/belly/proc/get_examine_msg()
+ if(contents.len && examine_messages.len)
+ var/formatted_message
+ var/raw_message = pick(examine_messages)
+ var/total_bulge = 0
+
+ formatted_message = replacetext(raw_message,"%belly",lowertext(name))
+ formatted_message = replacetext(formatted_message,"%pred",owner)
+ formatted_message = replacetext(formatted_message,"%prey",english_list(contents))
+ for(var/mob/living/P in contents)
+ if(!P.absorbed) //This is required first, in case there's a person absorbed and not absorbed in a stomach.
+ total_bulge += P.mob_size
+ if(total_bulge >= bulge_size && bulge_size != 0)
+ return("[formatted_message] ")
+ else
+ return ""
+
+// The next function gets the messages set on the belly, in human-readable format.
+// This is useful in customization boxes and such. The delimiter right now is \n\n so
+// in message boxes, this looks nice and is easily delimited.
+/obj/belly/proc/get_messages(var/type, var/delim = "\n\n")
+ ASSERT(type == "smo" || type == "smi" || type == "dmo" || type == "dmp" || type == "em")
+ var/list/raw_messages
+
+ switch(type)
+ if("smo")
+ raw_messages = struggle_messages_outside
+ if("smi")
+ raw_messages = struggle_messages_inside
+ if("dmo")
+ raw_messages = digest_messages_owner
+ if("dmp")
+ raw_messages = digest_messages_prey
+ if("em")
+ raw_messages = examine_messages
+
+ var/messages = list2text(raw_messages,delim)
+ return messages
+
+// The next function sets the messages on the belly, from human-readable var
+// replacement strings and linebreaks as delimiters (two \n\n by default).
+// They also sanitize the messages.
+/obj/belly/proc/set_messages(var/raw_text, var/type, var/delim = "\n\n")
+ ASSERT(type == "smo" || type == "smi" || type == "dmo" || type == "dmp" || type == "em")
+
+ var/list/raw_list = text2list(html_encode(raw_text),delim)
+ if(raw_list.len > 10)
+ raw_list.Cut(11)
+ testing("[owner] tried to set [lowertext(name)] with 11+ messages")
+
+ for(var/i = 1, i <= raw_list.len, i++)
+ if(length(raw_list[i]) > 160 || length(raw_list[i]) < 10) //160 is fudged value due to htmlencoding increasing the size
+ raw_list.Cut(i,i)
+ testing("[owner] tried to set [lowertext(name)] with >121 or <10 char message")
+ else
+ raw_list[i] = readd_quotes(raw_list[i])
+ //Also fix % sign for var replacement
+ raw_list[i] = replacetext(raw_list[i],"%","%")
+
+ ASSERT(raw_list.len <= 10) //Sanity
+
+ switch(type)
+ if("smo")
+ struggle_messages_outside = raw_list
+ if("smi")
+ struggle_messages_inside = raw_list
+ if("dmo")
+ digest_messages_owner = raw_list
+ if("dmp")
+ digest_messages_prey = raw_list
+ if("em")
+ examine_messages = raw_list
+
+ return
+
+// Handle the death of a mob via digestion.
+// Called from the process_Life() methods of bellies that digest prey.
+// Default implementation calls M.death() and removes from internal contents.
+// Indigestable items are removed, and M is deleted.
+/obj/belly/proc/digestion_death(var/mob/living/M)
+ //M.death(1) // "Stop it he's already dead..." Basically redundant and the reason behind screaming mouse carcasses.
+ if(M.ckey)
+ message_admins("[key_name(owner)] has digested [key_name(M)] in their [lowertext(name)] ([owner ? "JMP " : "null"])")
+ log_attack("[key_name(owner)] digested [key_name(M)].")
+
+ // If digested prey is also a pred... anyone inside their bellies gets moved up.
+ if(is_vore_predator(M))
+ for(var/belly in M.vore_organs)
+ var/obj/belly/B = belly
+ for(var/thing in B)
+ var/atom/movable/AM = thing
+ AM.forceMove(owner.loc)
+ if(isliving(AM))
+ to_chat(AM,"As [M] melts away around you, you find yourself in [owner]'s [lowertext(name)]")
+
+ //Drop all items into the belly
+ for(var/obj/item/W in M)
+ if(!M.dropItemToGround(W))
+ qdel(W)
+
+/* //Reagent transfer //maybe someday
+ if(ishuman(owner))
+ var/mob/living/carbon/human/Pred = owner
+ if(ishuman(M))
+ var/mob/living/carbon/human/Prey = M
+ Prey.bloodstr.del_reagent("numbenzyme")
+ Prey.bloodstr.trans_to_holder(Pred.bloodstr, Prey.bloodstr.total_volume, 0.5, TRUE) // Copy=TRUE because we're deleted anyway
+ Prey.ingested.trans_to_holder(Pred.bloodstr, Prey.ingested.total_volume, 0.5, TRUE) // Therefore don't bother spending cpu
+ Prey.touching.trans_to_holder(Pred.bloodstr, Prey.touching.total_volume, 0.5, TRUE) // On updating the prey's reagents
+ else if(M.reagents)
+ M.reagents.trans_to_holder(Pred.bloodstr, M.reagents.total_volume, 0.5, TRUE) */
+
+ // Delete the digested mob
+ qdel(M)
+
+// Handle a mob being absorbed
+/obj/belly/proc/absorb_living(var/mob/living/M)
+ M.absorbed = TRUE
+ to_chat(M,"[owner]'s [lowertext(name)] absorbs your body, making you part of them. ")
+ to_chat(owner,"Your [lowertext(name)] absorbs [M]'s body, making them part of you. ")
+
+// Reagent sharing is neat, but eh. I'll figure it out later
+/* if(ishuman(M) && ishuman(owner))
+ var/mob/living/carbon/human/Prey = M
+ var/mob/living/carbon/human/Pred = owner
+ //Reagent sharing for absorbed with pred - Copy so both pred and prey have these reagents.
+ Prey.bloodstr.trans_to_holder(Pred.bloodstr, Prey.bloodstr.total_volume, copy = TRUE)
+ Prey.ingested.trans_to_holder(Pred.bloodstr, Prey.ingested.total_volume, copy = TRUE)
+ Prey.touching.trans_to_holder(Pred.bloodstr, Prey.touching.total_volume, copy = TRUE)
+ // TODO - Find a way to make the absorbed prey share the effects with the pred.
+ // Currently this is infeasible because reagent containers are designed to have a single my_atom, and we get
+ // problems when A absorbs B, and then C absorbs A, resulting in B holding onto an invalid reagent container.
+*/
+ //This is probably already the case, but for sub-prey, it won't be.
+ if(M.loc != src)
+ M.forceMove(src)
+
+ //Seek out absorbed prey of the prey, absorb them too.
+ //This in particular will recurse oddly because if there is absorbed prey of prey of prey...
+ //it will just move them up one belly. This should never happen though since... when they were
+ //absobred, they should have been absorbed as well!
+ for(var/belly in M.vore_organs)
+ var/obj/belly/B = belly
+ for(var/mob/living/Mm in B)
+ if(Mm.absorbed)
+ absorb_living(Mm)
+
+ //Update owner
+ owner.updateVRPanel()
+
+//Digest a single item
+//Receives a return value from digest_act that's how much nutrition
+//the item should be worth
+/obj/belly/proc/digest_item(var/obj/item/item)
+ var/digested = item.digest_act(src, owner)
+ if(!digested)
+ items_preserved |= item
+ else
+// owner.nutrition += (5 * digested) // haha no.
+ if(iscyborg(owner))
+ var/mob/living/silicon/robot/R = owner
+ R.cell.charge += (50 * digested)
+
+//Determine where items should fall out of us into.
+//Typically just to the owner's location.
+/obj/belly/drop_location()
+ //Should be the case 99.99% of the time
+ if(owner)
+ return owner.loc
+ //Sketchy fallback for safety, put them somewhere safe.
+ else if(ismob(src))
+ testing("[src] (\ref[src]) doesn't have an owner, and dropped someone at a latespawn point!")
+ SSjob.SendToLateJoin(src)
+ // wew lad. let's see if this never gets used, hopefully
+ else
+ qdel(src) //final option, I guess.
+ testing("[src] (\ref[src]) was QDEL'd for not having a drop_location!")
+
+//Handle a mob struggling
+// Called from /mob/living/carbon/relaymove()
+/obj/belly/proc/relay_resist(var/mob/living/R)
+ if (!(R in contents))
+ return // User is not in this belly
+
+ R.setClickCooldown(50)
+
+ if(owner.stat || !owner.client && R.a_intent != INTENT_HELP) //If owner is stat (dead, KO) we can actually escape
+ to_chat(R,"You attempt to climb out of \the [lowertext(name)]. (This will take around 5 seconds.) ")
+ to_chat(owner,"Someone is attempting to climb out of your [lowertext(name)]! ")
+
+ if(do_after(R, 50, owner))
+ if(owner.stat && (R in contents) && R.a_intent != INTENT_HELP) //Can still escape and want to?
+ release_specific_contents(R)
+ return
+ else if(!(R in contents)) //Aren't even in the belly. Quietly fail.
+ return
+ else //Belly became inescapable or mob revived
+ to_chat(R,"Your attempt to escape [lowertext(name)] has failed! ")
+ to_chat(owner,"The attempt to escape from your [lowertext(name)] has failed! ")
+ return
+ return
+ var/struggle_outer_message = pick(struggle_messages_outside)
+ var/struggle_user_message = pick(struggle_messages_inside)
+
+ struggle_outer_message = replacetext(struggle_outer_message,"%pred",owner)
+ struggle_outer_message = replacetext(struggle_outer_message,"%prey",R)
+ struggle_outer_message = replacetext(struggle_outer_message,"%belly",lowertext(name))
+
+ struggle_user_message = replacetext(struggle_user_message,"%pred",owner)
+ struggle_user_message = replacetext(struggle_user_message,"%prey",R)
+ struggle_user_message = replacetext(struggle_user_message,"%belly",lowertext(name))
+
+ struggle_outer_message = "" + struggle_outer_message + " "
+ struggle_user_message = "" + struggle_user_message + " "
+
+ for(var/mob/M in get_hearers_in_view(3, get_turf(owner)))
+ M.show_message(struggle_outer_message, 2) // hearable
+ to_chat(R,struggle_user_message)
+
+ if(!silent)
+ for(var/mob/M in get_hearers_in_view(5, get_turf(owner)))
+ if(M.client && M.client.prefs.toggles & EATING_NOISES)
+ playsound(get_turf(owner),"struggle_sound",35,0,-5,1,ignore_walls = FALSE,channel=CHANNEL_PRED)
+ R.stop_sound_channel(CHANNEL_PRED)
+ var/sound/prey_struggle = sound(get_sfx("prey_struggle"))
+ R.playsound_local(get_turf(R),prey_struggle,45,0)
+
+ if(R.a_intent != INTENT_HELP) //If on non help intent
+ to_chat(R,"You start to climb out of \the [lowertext(name)]. ")
+ to_chat(owner,"Someone is attempting to climb out of your [lowertext(name)]! ")
+ if(do_after(R, escapetime, owner))
+ if((owner.stat || !owner.client || escapable) && (R in contents))
+ release_specific_contents(R)
+ to_chat(R,"You climb out of \the [lowertext(name)]. ")
+ to_chat(owner,"[R] climbs out of your [lowertext(name)]! ")
+ for(var/mob/M in hearers(4, owner))
+ M.show_message("[R] climbs out of [owner]'s [lowertext(name)]! ", 2)
+ return
+ else if(!istype(loc, /obj/belly)) //Aren't even in the belly. Quietly fail.
+ return
+ else //Belly became inescapable.
+ to_chat(R,"Your attempt to escape [lowertext(name)] has failed! ")
+ to_chat(owner,"The attempt to escape from your [lowertext(name)] has failed! ")
+ return
+
+ else if(prob(transferchance) && transferlocation) //Next, let's have it see if they end up getting into an even bigger mess then when they started.
+ var/obj/belly/dest_belly
+ for(var/belly in owner.vore_organs)
+ var/obj/belly/B = belly
+ if(B.name == transferlocation)
+ dest_belly = B
+ break
+ if(!dest_belly)
+ to_chat(owner, "Something went wrong with your belly transfer settings. Your [lowertext(name)] has had it's transfer chance and transfer location cleared as a precaution. ")
+ transferchance = 0
+ transferlocation = null
+ return
+
+ to_chat(R,"Your attempt to escape [lowertext(name)] has failed and your struggles only results in you sliding into [owner]'s [transferlocation]! ")
+ to_chat(owner,"Someone slid into your [transferlocation] due to their struggling inside your [lowertext(name)]! ")
+ transfer_contents(R, dest_belly)
+ return
+/*
+ else if(prob(absorbchance) && digest_mode != DM_ABSORB) //After that, let's have it run the absorb chance.
+ to_chat(R,"In response to your struggling, \the [lowertext(name)] begins to cling more tightly... ")
+ to_chat(owner,"You feel your [lowertext(name)] start to cling onto its contents... ")
+ digest_mode = DM_ABSORB
+ return
+
+ else if(prob(digestchance) && digest_mode != DM_ITEMWEAK && digest_mode != DM_DIGEST) //Finally, let's see if it should run the digest chance.
+ to_chat(R,"In response to your struggling, \the [lowertext(name)] begins to get more active... ")
+ to_chat(owner,"You feel your [lowertext(name)] beginning to become active! ")
+ digest_mode = DM_ITEMWEAK
+ return
+
+ else if(prob(digestchance) && digest_mode == DM_ITEMWEAK) //Oh god it gets even worse if you fail twice!
+ to_chat(R,"In response to your struggling, \the [lowertext(name)] begins to get even more active! ")
+ to_chat(owner,"You feel your [lowertext(name)] beginning to become even more active! ")
+ digest_mode = DM_DIGEST
+ return */
+ else if(prob(digestchance)) //Finally, let's see if it should run the digest chance.)
+ to_chat(R, "In response to your struggling, \the [name] begins to get more active... ")
+ to_chat(owner, "You feel your [name] beginning to become active! ")
+ digest_mode = DM_DIGEST
+ return
+
+ else //Nothing interesting happened.
+ to_chat(R,"You make no progress in escaping [owner]'s [lowertext(name)]. ")
+ to_chat(owner,"Your prey appears to be unable to make any progress in escaping your [lowertext(name)]. ")
+ return
+
+//Transfers contents from one belly to another
+/obj/belly/proc/transfer_contents(var/atom/movable/content, var/obj/belly/target, silent = FALSE)
+ if(!(content in src) || !istype(target))
+ return
+ target.nom_mob(content, target.owner)
+ if(!silent)
+ for(var/mob/M in get_hearers_in_view(5, get_turf(owner)))
+ if(M.client && M.client.prefs.toggles & EATING_NOISES)
+ playsound(get_turf(owner),"[src.vore_sound]",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED)
+ owner.updateVRPanel()
+ for(var/mob/living/M in contents)
+ M.updateVRPanel()
+
+// Belly copies and then returns the copy
+// Needs to be updated for any var changes
+/obj/belly/proc/copy(mob/new_owner)
+ var/obj/belly/dupe = new /obj/belly(new_owner)
+
+ //// Non-object variables
+ dupe.name = name
+ dupe.desc = desc
+ dupe.vore_sound = vore_sound
+ dupe.vore_verb = vore_verb
+ dupe.release_sound = release_sound
+ dupe.human_prey_swallow_time = human_prey_swallow_time
+ dupe.nonhuman_prey_swallow_time = nonhuman_prey_swallow_time
+ dupe.emote_time = emote_time
+ dupe.digest_brute = digest_brute
+ dupe.digest_burn = digest_burn
+ dupe.immutable = immutable
+ dupe.can_taste = can_taste
+ dupe.escapable = escapable
+ dupe.escapetime = escapetime
+ dupe.digestchance = digestchance
+ dupe.absorbchance = absorbchance
+ dupe.escapechance = escapechance
+ dupe.transferchance = transferchance
+ dupe.transferlocation = transferlocation
+ dupe.bulge_size = bulge_size
+// dupe.shrink_grow_size = shrink_grow_size
+
+ //// Object-holding variables
+ //struggle_messages_outside - strings
+ dupe.struggle_messages_outside.Cut()
+ for(var/I in struggle_messages_outside)
+ dupe.struggle_messages_outside += I
+
+ //struggle_messages_inside - strings
+ dupe.struggle_messages_inside.Cut()
+ for(var/I in struggle_messages_inside)
+ dupe.struggle_messages_inside += I
+
+ //digest_messages_owner - strings
+ dupe.digest_messages_owner.Cut()
+ for(var/I in digest_messages_owner)
+ dupe.digest_messages_owner += I
+
+ //digest_messages_prey - strings
+ dupe.digest_messages_prey.Cut()
+ for(var/I in digest_messages_prey)
+ dupe.digest_messages_prey += I
+
+ //examine_messages - strings
+ dupe.examine_messages.Cut()
+ for(var/I in examine_messages)
+ dupe.examine_messages += I
+
+ //emote_lists - index: digest mode, key: list of strings
+ dupe.emote_lists.Cut()
+ for(var/K in emote_lists)
+ dupe.emote_lists[K] = list()
+ for(var/I in emote_lists[K])
+ dupe.emote_lists[K] += I
+ dupe.silent = silent
+
+ return dupe
diff --git a/modular_citadel/code/modules/vore/eating/bellymodes_vr.dm b/modular_citadel/code/modules/vore/eating/bellymodes_vr.dm
new file mode 100644
index 0000000000..3260e2ae99
--- /dev/null
+++ b/modular_citadel/code/modules/vore/eating/bellymodes_vr.dm
@@ -0,0 +1,186 @@
+// Process the predator's effects upon the contents of its belly (i.e digestion/transformation etc)
+/obj/belly/proc/process_belly(var/times_fired,var/wait) //Passed by controller
+ if((times_fired < next_process) || !contents.len)
+ recent_sound = FALSE
+ return SSBELLIES_IGNORED
+
+ if(loc != owner)
+ if(istype(owner))
+ loc = owner
+ else
+ qdel(src)
+ return SSBELLIES_PROCESSED
+
+ next_process = times_fired + (6 SECONDS/wait) //Set up our next process time.
+
+/////////////////////////// Auto-Emotes ///////////////////////////
+ if(contents.len && next_emote <= times_fired)
+ next_emote = times_fired + round(emote_time/wait,1)
+ var/list/EL = emote_lists[digest_mode]
+ for(var/mob/living/M in contents)
+ if(M.digestable || !(digest_mode == DM_DIGEST)) // don't give digesty messages to indigestible people
+ to_chat(M,"[pick(EL)] ")
+
+/////////////////////////// Exit Early ////////////////////////////
+ var/list/touchable_items = contents - items_preserved
+ if(!length(touchable_items))
+ return SSBELLIES_PROCESSED
+
+////////////////////////// Sound vars /////////////////////////////
+ var/sound/prey_digest = sound(get_sfx("digest_prey"))
+ var/sound/prey_death = sound(get_sfx("death_prey"))
+
+
+///////////////////////////// DM_HOLD /////////////////////////////
+ if(digest_mode == DM_HOLD)
+ return SSBELLIES_PROCESSED
+
+//////////////////////////// DM_DIGEST ////////////////////////////
+ else if(digest_mode == DM_DIGEST)
+ for (var/mob/living/M in contents)
+ if(prob(25))
+ M.stop_sound_channel(CHANNEL_DIGEST)
+ for(var/mob/H in get_hearers_in_view(5, get_turf(owner)))
+ if(H.client && H.client.prefs.toggles & DIGESTION_NOISES)
+ playsound(get_turf(owner),"digest_pred",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_DIGEST)
+ M.stop_sound_channel(CHANNEL_DIGEST)
+ M.playsound_local(get_turf(M), prey_digest, 45)
+
+ //Pref protection!
+ if (!M.digestable || M.absorbed)
+ continue
+
+ //Person just died in guts!
+ if(M.stat == DEAD)
+ var/digest_alert_owner = pick(digest_messages_owner)
+ var/digest_alert_prey = pick(digest_messages_prey)
+
+ //Replace placeholder vars
+ digest_alert_owner = replacetext(digest_alert_owner,"%pred",owner)
+ digest_alert_owner = replacetext(digest_alert_owner,"%prey",M)
+ digest_alert_owner = replacetext(digest_alert_owner,"%belly",lowertext(name))
+
+ digest_alert_prey = replacetext(digest_alert_prey,"%pred",owner)
+ digest_alert_prey = replacetext(digest_alert_prey,"%prey",M)
+ digest_alert_prey = replacetext(digest_alert_prey,"%belly",lowertext(name))
+
+ //Send messages
+ to_chat(owner, "[digest_alert_owner] ")
+ to_chat(M, "[digest_alert_prey] ")
+ M.visible_message("You watch as [owner]'s form loses its additions. ")
+
+ owner.nutrition += 400 // so eating dead mobs gives you *something*.
+ M.stop_sound_channel(DIGESTION_NOISES)
+ for(var/mob/H in get_hearers_in_view(5, get_turf(owner)))
+ if(H.client && H.client.prefs.toggles & DIGESTION_NOISES)
+ playsound(get_turf(owner),"death_pred",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_DIGEST)
+ M.stop_sound_channel(DIGESTION_NOISES)
+ M.stop_sound_channel(CHANNEL_PREYLOOP)
+ M.playsound_local(get_turf(M), prey_death, 65)
+ digestion_death(M)
+ owner.update_icons()
+ continue
+
+
+ // Deal digestion damage (and feed the pred)
+ if(!(M.status_flags & GODMODE))
+ M.adjustFireLoss(digest_burn)
+ owner.nutrition += 1
+
+ //Contaminate or gurgle items
+ var/obj/item/T = pick(touchable_items)
+ if(istype(T))
+ if(istype(T,/obj/item/reagent_containers/food) || istype(T,/obj/item/organ))
+ digest_item(T)
+
+ owner.updateVRPanel()
+
+///////////////////////////// DM_HEAL /////////////////////////////
+ if(digest_mode == DM_HEAL)
+ for (var/mob/living/M in contents)
+ if(prob(25))
+ M.stop_sound_channel(CHANNEL_DIGEST)
+ for(var/mob/H in get_hearers_in_view(5, get_turf(owner)))
+ if(H.client && H.client.prefs.toggles & DIGESTION_NOISES)
+ playsound(get_turf(owner),"digest_pred",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_DIGEST)
+ M.stop_sound_channel(CHANNEL_DIGEST)
+ M.playsound_local(get_turf(M), prey_digest, 65)
+
+ if(M.stat != DEAD)
+ if(owner.nutrition >= NUTRITION_LEVEL_STARVING && (M.health < M.maxHealth))
+ M.adjustBruteLoss(-3)
+ M.adjustFireLoss(-3)
+ owner.nutrition -= 5
+ return
+
+////////////////////////// DM_NOISY /////////////////////////////////
+//for when you just want people to squelch around
+ if(digest_mode == DM_NOISY)
+ for (var/mob/living/M in contents)
+ if(prob(35))
+ M.stop_sound_channel(CHANNEL_DIGEST)
+ for(var/mob/H in get_hearers_in_view(5, get_turf(owner)))
+ if(H.client && H.client.prefs.toggles & DIGESTION_NOISES)
+ playsound(get_turf(owner),"digest_pred",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_DIGEST)
+ M.stop_sound_channel(CHANNEL_PRED)
+ M.playsound_local(get_turf(M), prey_digest, 65)
+
+
+//////////////////////////DM_DRAGON /////////////////////////////////////
+//because dragons need snowflake guts
+ if(digest_mode == DM_DRAGON)
+ for (var/mob/living/M in contents)
+ if(prob(25))
+ M.stop_sound_channel(CHANNEL_DIGEST)
+ for(var/mob/H in get_hearers_in_view(5, get_turf(owner)))
+ if(H.client && H.client.prefs.toggles & DIGESTION_NOISES)
+ playsound(get_turf(owner),"digest_pred",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_DIGEST)
+ M.stop_sound_channel(CHANNEL_DIGEST)
+ M.playsound_local(get_turf(M), prey_digest, 65)
+
+ //No digestion protection for megafauna.
+
+ //Person just died in guts!
+ if(M.stat == DEAD)
+ var/digest_alert_owner = pick(digest_messages_owner)
+ var/digest_alert_prey = pick(digest_messages_prey)
+
+ //Replace placeholder vars
+ digest_alert_owner = replacetext(digest_alert_owner,"%pred",owner)
+ digest_alert_owner = replacetext(digest_alert_owner,"%prey",M)
+ digest_alert_owner = replacetext(digest_alert_owner,"%belly",lowertext(name))
+
+ digest_alert_prey = replacetext(digest_alert_prey,"%pred",owner)
+ digest_alert_prey = replacetext(digest_alert_prey,"%prey",M)
+ digest_alert_prey = replacetext(digest_alert_prey,"%belly",lowertext(name))
+
+ //Send messages
+ to_chat(owner, "[digest_alert_owner] ")
+ to_chat(M, "[digest_alert_prey] ")
+ M.visible_message("You watch as [owner]'s guts loudly rumble as it finishes off a meal. ")
+
+ M.stop_sound_channel(CHANNEL_DIGEST)
+ for(var/mob/H in get_hearers_in_view(5, get_turf(owner)))
+ if(H.client && H.client.prefs.toggles & DIGESTION_NOISES)
+ playsound(get_turf(owner),"death_pred",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_DIGEST)
+ M.stop_sound_channel(CHANNEL_DIGEST)
+ M.playsound_local(get_turf(M), prey_death, 65)
+ M.spill_organs(FALSE,TRUE,TRUE)
+ M.stop_sound_channel(CHANNEL_PREYLOOP)
+ digestion_death(M)
+ owner.update_icons()
+ continue
+
+
+ // Deal digestion damage (and feed the pred)
+ if(!(M.status_flags & GODMODE))
+ M.adjustFireLoss(digest_burn)
+ M.adjustToxLoss(2) // something something plasma based acids
+ M.adjustCloneLoss(1) // eventually this'll kill you if you're healing everything else, you nerds.
+ //Contaminate or gurgle items
+ var/obj/item/T = pick(touchable_items)
+ if(istype(T))
+ if(istype(T,/obj/item/reagent_containers/food) || istype(T,/obj/item/organ))
+ digest_item(T)
+
+ owner.updateVRPanel()
\ No newline at end of file
diff --git a/modular_citadel/code/modules/vore/eating/digest_act_vr.dm b/modular_citadel/code/modules/vore/eating/digest_act_vr.dm
new file mode 100644
index 0000000000..faa458ad56
--- /dev/null
+++ b/modular_citadel/code/modules/vore/eating/digest_act_vr.dm
@@ -0,0 +1,119 @@
+//Please make sure to:
+//return FALSE: You are not going away, stop asking me to digest.
+//return non-negative integer: Amount of nutrition/charge gained (scaled to nutrition, other end can multiply for charge scale).
+
+// Ye default implementation.
+/obj/item/proc/digest_act(var/atom/movable/item_storage = null)
+ for(var/obj/item/O in contents)
+ if(istype(O,/obj/item/storage/internal)) //Dump contents from dummy pockets.
+ for(var/obj/item/SO in O)
+ if(item_storage)
+ SO.forceMove(item_storage)
+ qdel(O)
+ else if(item_storage)
+ O.forceMove(item_storage)
+
+ qdel(src)
+ return w_class
+
+/////////////
+// Some indigestible stuff
+/////////////
+/obj/item/hand_tele/digest_act(...)
+ return FALSE
+/obj/item/card/id/digest_act(...)
+ return FALSE
+/obj/item/aicard/digest_act(...)
+ return FALSE
+/obj/item/paicard/digest_act(...)
+ return FALSE
+/obj/item/pinpointer/digest_act(...)
+ return FALSE
+/obj/item/disk/nuclear/digest_act(...)
+ return FALSE
+/obj/item/device/perfect_tele_beacon/digest_act(...)
+ return FALSE //Sorta important to not digest your own beacons.
+/obj/item/device/pda/digest_act(...)
+ return FALSE
+/obj/item/gun/digest_act(...)
+ return FALSE
+/obj/item/clothing/shoes/magboots/digest_act(...)
+ return FALSE
+/obj/item/clothing/head/helmet/space/digest_act(...)
+ return FALSE
+/obj/item/clothing/suit/space/digest_act(...)
+ return FALSE
+/obj/item/reagent_containers/hypospray/CMO/digest_act(...)
+ return FALSE
+/obj/item/tank/jetpack/oxygen/captain/digest_act(...)
+ return FALSE
+/obj/item/clothing/accessory/medal/gold/captain/digest_act(...)
+ return FALSE
+/obj/item/clothing/suit/armor/digest_act(...)
+ return FALSE
+/obj/item/documents/digest_act(...)
+ return FALSE
+/obj/item/nuke_core/digest_act(...)
+ return FALSE
+/obj/item/nuke_core_container/digest_act(...)
+ return FALSE
+/obj/item/areaeditor/blueprints/digest_act(...)
+ return FALSE
+/obj/item/documents/syndicate/digest_act(...)
+ return FALSE
+/obj/item/bombcore/digest_act(...)
+ return FALSE
+/obj/item/grenade/digest_act(...)
+ return FALSE
+/obj/item/storage/digest_act(...)
+ return FALSE
+
+/////////////
+// Some special treatment
+/////////////
+/*
+//PDAs need to lose their ID to not take it with them, so we can get a digested ID
+/obj/item/device/pda/digest_act(var/atom/movable/item_storage = null)
+ if(id)
+ id = null
+
+ . = ..()
+*/
+
+/obj/item/reagent_containers/food/digest_act(var/atom/movable/item_storage = null)
+ if(isbelly(item_storage))
+ var/obj/belly/B = item_storage
+ if(ishuman(B.owner))
+ var/mob/living/carbon/human/H = B.owner
+ reagents.trans_to(H, (reagents.total_volume * 0.3), 1, 0)
+ else if(iscyborg(B.owner))
+ var/mob/living/silicon/robot/R = B.owner
+ R.cell.charge += 150
+
+ . = ..()
+
+/*
+/obj/item/holder/digest_act(var/atom/movable/item_storage = null)
+ for(var/mob/living/M in contents)
+ if(item_storage)
+ M.forceMove(item_storage)
+ held_mob = null
+
+ . = ..() */
+
+/obj/item/organ/digest_act(var/atom/movable/item_storage = null)
+ if((. = ..()))
+ . += 70 //Organs give a little more
+
+/obj/item/storage/digest_act(var/atom/movable/item_storage = null)
+ for(var/obj/item/I in contents)
+ I.screen_loc = null
+
+ . = ..()
+
+/////////////
+// Some more complicated stuff
+/////////////
+/obj/item/device/mmi/digital/posibrain/digest_act(var/atom/movable/item_storage = null)
+ //Replace this with a VORE setting so all types of posibrains can/can't be digested on a whim
+ return FALSE
diff --git a/code/modules/vore/eating/living_vr.dm b/modular_citadel/code/modules/vore/eating/living_vr.dm
similarity index 71%
rename from code/modules/vore/eating/living_vr.dm
rename to modular_citadel/code/modules/vore/eating/living_vr.dm
index 16a63c40ac..5b2ad312ab 100644
--- a/code/modules/vore/eating/living_vr.dm
+++ b/modular_citadel/code/modules/vore/eating/living_vr.dm
@@ -1,23 +1,24 @@
///////////////////// Mob Living /////////////////////
/mob/living
var/digestable = TRUE // Can the mob be digested inside a belly?
- var/datum/belly/vore_selected // Default to no vore capability.
+ var/obj/belly/vore_selected // Default to no vore capability.
var/list/vore_organs = list() // List of vore containers inside a mob
var/devourable = FALSE // Can the mob be vored at all?
// var/feeding = FALSE // Are we going to feed someone else?
var/vore_taste = null // What the character tastes like
var/no_vore = FALSE // If the character/mob can vore.
var/openpanel = 0 // Is the vore panel open?
+ var/noisy = FALSE // tummies are rumbly?
+ var/absorbed = FALSE //are we absorbed?
//
// Hook for generic creation of stuff on new creatures
//
/hook/living_new/proc/vore_setup(mob/living/M)
- M.verbs += /mob/living/proc/lick
M.verbs += /mob/living/proc/preyloop_refresh
- if(M.no_vore) //If the mob isn's supposed to have a stomach, let's not give it an insidepanel so it can make one for itself, or a stomach.
- M << "The creature that you are can not eat others. "
- return TRUE
+ M.verbs += /mob/living/proc/lick
+ if(M.no_vore) //If the mob isn't supposed to have a stomach, let's not give it an insidepanel so it can make one for itself, or a stomach.
+ return 1
M.verbs += /mob/living/proc/insidePanel
//Tries to load prefs if a client is present otherwise gives freebie stomach
@@ -27,44 +28,36 @@
if(M.client && M.client.prefs_vr)
if(!M.copy_from_prefs_vr())
- M << "ERROR: You seem to have saved vore prefs, but they couldn't be loaded. "
- return FALSE
+ to_chat(M,"ERROR: You seem to have saved vore prefs, but they couldn't be loaded. ")
+ return 0
if(M.vore_organs && M.vore_organs.len)
M.vore_selected = M.vore_organs[1]
if(!M.vore_organs || !M.vore_organs.len)
if(!M.vore_organs)
M.vore_organs = list()
- var/datum/belly/B = new /datum/belly(M)
+ var/obj/belly/B = new /obj/belly(M)
+ M.vore_selected = B
B.immutable = TRUE
B.name = "Stomach"
- B.inside_flavor = "It appears to be rather warm and wet. Makes sense, considering it's inside \the [M.name]"
- B.can_taste = TRUE
- M.vore_organs[B.name] = B
- M.vore_selected = B.name
-
- //Simple_animal gets emotes. move this to that hook instead?
- if(istype(src,/mob/living/simple_animal))
- B.emote_lists[DM_HOLD] = list(
- "The insides knead at you gently for a moment.",
- "The guts glorp wetly around you as some air shifts.",
- "Your predator takes a deep breath and sighs, shifting you somewhat.",
- "The stomach squeezes you tight for a moment, then relaxes.",
- "During a moment of quiet, breathing becomes the most audible thing.",
- "The warm slickness surrounds and kneads on you.")
-
- B.emote_lists[DM_DIGEST] = list(
- "The caustic acids eat away at your form.",
- "The acrid air burns at your lungs.",
- "Without a thought for you, the stomach grinds inwards painfully.",
- "The guts treat you like food, squeezing to press more acids against you.",
- "The onslaught against your body doesn't seem to be letting up; you're food now.",
- "The insides work on you like they would any other food.")
+ B.desc = "It appears to be rather warm and wet. Makes sense, considering it's inside \the [M.name]."
+ B.can_taste = FALSE
//Return 1 to hook-caller
return 1
+/*
+// Hide vore organs in contents
//
+/datum/proc/view_variables_filter_contents(list/L)
+ return 0
+
+/mob/living/view_variables_filter_contents(list/L)
+ . = ..()
+ var/len_before = L.len
+ L -= vore_organs
+ . += len_before - L.len*/
+
// Handle being clicked, perhaps with something to devour
//
@@ -126,33 +119,37 @@
var/belly = user.vore_selected
return perform_dragon(user, prey, user, belly)
-/mob/living/proc/perform_dragon(var/mob/living/user, var/mob/living/prey, var/mob/living/pred, var/belly, swallow_time = 20)
+/mob/living/proc/perform_dragon(var/mob/living/user, var/mob/living/prey, var/mob/living/pred, var/obj/belly/belly, swallow_time = 20)
//Sanity
- if(!user || !prey || !pred || !belly || !(belly in pred.vore_organs))
+ if(!user || !prey || !pred || !istype(belly) || !(belly in pred.vore_organs))
+ testing("[user] attempted to feed [prey] to [pred], via [lowertext(belly.name)] but it went wrong.")
return
// The belly selected at the time of noms
- var/datum/belly/belly_target = pred.vore_organs[belly]
var/attempt_msg = "ERROR: Vore message couldn't be created. Notify a dev. (at)"
var/success_msg = "ERROR: Vore message couldn't be created. Notify a dev. (sc)"
+/* //Final distance check. Time has passed, menus have come and gone. Can't use do_after adjacent because doesn't behave for held micros
+ var/user_to_pred = get_dist(get_turf(user),get_turf(pred))
+ var/user_to_prey = get_dist(get_turf(user),get_turf(prey)) */
+
// Prepare messages
if(user == pred) //Feeding someone to yourself
- attempt_msg = text("[] starts to [] [] into their []! ",pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name))
- success_msg = text("[] manages to [] [] into their []! ",pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name))
+ attempt_msg = text("[] starts to [] [] into their []! ",pred,lowertext(belly.vore_verb),prey,lowertext(belly.name))
+ success_msg = text("[] manages to [] [] into their []! ",pred,lowertext(belly.vore_verb),prey,lowertext(belly.name))
// Announce that we start the attempt!
user.visible_message(attempt_msg)
- if(!do_mob(src, user, swallow_time)) // one second should be good enough, right?
+ if(!do_mob(src, user, swallow_time))
return FALSE // Prey escaped (or user disabled) before timer expired.
// If we got this far, nom successful! Announce it!
user.visible_message(success_msg)
- playsound(get_turf(user), belly_target.vore_sound,75,0,-6,0)
+ playsound(get_turf(user), "[belly.vore_sound]",75,0,-6,0)
// Actually shove prey into the belly.
- belly_target.nom_mob(prey, user)
+ belly.nom_mob(prey, user)
if (pred == user)
message_admins("[key_name(pred)] ate [key_name(prey)].")
log_attack("[key_name(pred)] ate [key_name(prey)]")
@@ -161,43 +158,55 @@
// Master vore proc that actually does vore procedures
//
-/mob/living/proc/perform_the_nom(var/mob/living/user, var/mob/living/prey, var/mob/living/pred, var/belly, swallow_time = 100)
+/mob/living/proc/perform_the_nom(var/mob/living/user, var/mob/living/prey, var/mob/living/pred, var/obj/belly/belly, var/delay)
//Sanity
- if(!user || !prey || !pred || !belly || !(belly in pred.vore_organs))
+ if(!user || !prey || !pred || !istype(belly) || !(belly in pred.vore_organs))
+ testing("[user] attempted to feed [prey] to [pred], via [lowertext(belly.name)] but it went wrong.")
return
if (!prey.devourable)
to_chat(user, "This can't be eaten!")
return
// The belly selected at the time of noms
- var/datum/belly/belly_target = pred.vore_organs[belly]
var/attempt_msg = "ERROR: Vore message couldn't be created. Notify a dev. (at)"
var/success_msg = "ERROR: Vore message couldn't be created. Notify a dev. (sc)"
+/* //Final distance check. Time has passed, menus have come and gone. Can't use do_after adjacent because doesn't behave for held micros
+ var/user_to_pred = get_dist(get_turf(user),get_turf(pred))
+ var/user_to_prey = get_dist(get_turf(user),get_turf(prey)) */
+
// Prepare messages
if(user == pred) //Feeding someone to yourself
- attempt_msg = text("[] is attemping to [] [] into their []! ",pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name))
- success_msg = text("[] manages to [] [] into their []! ",pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name))
+ attempt_msg = text("[] is attemping to [] [] into their []! ",pred,lowertext(belly.vore_verb),prey,lowertext(belly.name))
+ success_msg = text("[] manages to [] [] into their []! ",pred,lowertext(belly.vore_verb),prey,lowertext(belly.name))
else //Feeding someone to another person
- attempt_msg = text("[] is attempting to make [] [] [] into their []! ",user,pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name))
- success_msg = text("[] manages to make [] [] [] into their []! ",user,pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name))
+ attempt_msg = text("[] is attempting to make [] [] [] into their []! ",user,pred,lowertext(belly.vore_verb),prey,lowertext(belly.name))
+ success_msg = text("[] manages to make [] [] [] into their []! ",user,pred,lowertext(belly.vore_verb),prey,lowertext(belly.name))
// Announce that we start the attempt!
user.visible_message(attempt_msg)
// Now give the prey time to escape... return if they did
+ var/swallow_time = delay || ishuman(prey) ? belly.human_prey_swallow_time : belly.nonhuman_prey_swallow_time
+
if(!do_mob(src, user, swallow_time))
return FALSE // Prey escaped (or user disabled) before timer expired.
// If we got this far, nom successful! Announce it!
user.visible_message(success_msg)
- playsound(get_turf(user), belly_target.vore_sound,75,0,-6,0,ignore_walls = FALSE)
+ for(var/mob/M in get_hearers_in_view(5, get_turf(user)))
+ if(M.client && M.client.prefs.toggles & EATING_NOISES)
+ playsound(get_turf(user),"[belly.vore_sound]",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED)
// Actually shove prey into the belly.
- belly_target.nom_mob(prey, user)
+ belly.nom_mob(prey, user)
// user.update_icons()
stop_pulling()
+ // Flavor handling
+ if(belly.can_taste && prey.get_taste_message(FALSE))
+ to_chat(belly.owner, "[prey] tastes of [prey.get_taste_message(FALSE)]. ")
+
// Inform Admins
var/prey_braindead
var/prey_stat
@@ -250,50 +259,38 @@
return 0
*/
+
+//
+// Release everything in every vore organ
+//
+/mob/living/proc/release_vore_contents(var/include_absorbed = TRUE)
+ for(var/belly in vore_organs)
+ var/obj/belly/B = belly
+ B.release_all_contents(include_absorbed)
+
//
// Custom resist catches for /mob/living
//
/mob/living/proc/vore_process_resist()
//Are we resisting from inside a belly?
- var/datum/belly/B = check_belly(src)
- if(B)
- spawn() B.relay_resist(src)
+ if(isbelly(loc))
+ var/obj/belly/B = loc
+ B.relay_resist(src)
return TRUE //resist() on living does this TRUE thing.
//Other overridden resists go here
-
return FALSE
-//
-// Proc for updating vore organs and digestion/healing/absorbing
-//
-/mob/living/proc/handle_internal_contents()
- if(SSmobs.times_fired%6==1)
- return //The accursed timer
-
- for (var/I in vore_organs)
- var/datum/belly/B = vore_organs[I]
- if(B.internal_contents.len)
- B.process_Life() //AKA 'do bellymodes_vr.dm'
-
- for (var/I in vore_organs)
- var/datum/belly/B = vore_organs[I]
- if(B.internal_contents.len)
- listclearnulls(B.internal_contents)
- for(var/atom/movable/M in B.internal_contents)
- if(M.loc != src)
- B.internal_contents.Remove(M)
-
// internal slimy button in case the loop stops playing but the player wants to hear it
/mob/living/proc/preyloop_refresh()
set name = "Internal loop refresh"
set category = "Vore"
- if(ismob(src.loc))
+ if(istype(src.loc, /obj/belly))
src.stop_sound_channel(CHANNEL_PREYLOOP) // sanity just in case
var/sound/preyloop = sound('sound/vore/prey/loop.ogg', repeat = TRUE)
- src.playsound_local(get_turf(src),preyloop,40,0, channel = CHANNEL_PREYLOOP)
+ src.playsound_local(get_turf(src),preyloop,80,0, channel = CHANNEL_PREYLOOP)
else
to_chat(src, "You aren't inside anything, you clod. ")
@@ -309,7 +306,7 @@
var/confirm = alert(src, "You're in a mob. Use this as a trick to get out of hostile animals. If you are in more than one pred, use this more than once.", "Confirmation", "Okay", "Cancel")
if(confirm == "Okay")
for(var/I in pred.vore_organs)
- var/datum/belly/B = pred.vore_organs[I]
+ var/obj/belly/B = pred.vore_organs[I]
B.release_specific_contents(src)
for(var/mob/living/simple_animal/SA in range(10))
@@ -355,9 +352,15 @@
P.digestable = src.digestable
P.devourable = src.devourable
- P.belly_prefs = src.vore_organs
P.vore_taste = src.vore_taste
+ var/list/serialized = list()
+ for(var/belly in src.vore_organs)
+ var/obj/belly/B = belly
+ serialized += list(B.serialize()) //Can't add a list as an object to another list in Byond. Thanks.
+
+ P.belly_prefs = serialized
+
return TRUE
//
@@ -370,16 +373,52 @@
var/datum/vore_preferences/P = client.prefs_vr
- src.digestable = P.digestable
- src.devourable = P.devourable
- src.vore_organs = list()
- src.vore_taste = P.vore_taste
+ digestable = P.digestable
+ devourable = P.devourable
+ vore_taste = P.vore_taste
- for(var/I in P.belly_prefs)
- var/datum/belly/Bp = P.belly_prefs[I]
- src.vore_organs[Bp.name] = Bp.copy(src)
+ vore_organs.Cut()
+ for(var/entry in P.belly_prefs)
+ list_to_object(entry,src)
return TRUE
+
+//
+// Returns examine messages for bellies
+//
+/mob/living/proc/examine_bellies()
+ if(!show_pudge()) //Some clothing or equipment can hide this.
+ return ""
+
+ var/message = ""
+ for (var/belly in vore_organs)
+ var/obj/belly/B = belly
+ message += B.get_examine_msg()
+
+ return message
+
+//
+// Whether or not people can see our belly messages
+//
+/mob/living/proc/show_pudge()
+ return TRUE //Can override if you want.
+
+/mob/living/carbon/human/show_pudge()
+ //A uniform could hide it.
+ if(istype(w_uniform,/obj/item/clothing))
+ var/obj/item/clothing/under = w_uniform
+ if(under.hides_bulges)
+ return FALSE
+
+ //We return as soon as we find one, no need for 'else' really.
+ if(istype(wear_suit,/obj/item/clothing))
+ var/obj/item/clothing/suit = wear_suit
+ if(suit.hides_bulges)
+ return FALSE
+
+
+ return ..()
+
//
// Clearly super important. Obviously.
//
diff --git a/code/modules/vore/eating/simple_animal_vr.dm b/modular_citadel/code/modules/vore/eating/simple_animal_vr.dm
similarity index 94%
rename from code/modules/vore/eating/simple_animal_vr.dm
rename to modular_citadel/code/modules/vore/eating/simple_animal_vr.dm
index 4e7c453371..a93eb2fcf4 100644
--- a/code/modules/vore/eating/simple_animal_vr.dm
+++ b/modular_citadel/code/modules/vore/eating/simple_animal_vr.dm
@@ -31,7 +31,7 @@
//
// Simple nom proc for if you get ckey'd into a simple_animal mob! Avoids grabs.
//
-/mob/living/proc/animal_nom(var/mob/living/T in oview(1))
+/mob/living/simple_animal/proc/animal_nom(var/mob/living/T in oview(1))
set name = "Animal Nom"
set category = "Vore"
set desc = "Since you can't grab, you get a verb!"
diff --git a/code/modules/vore/eating/vore_vr.dm b/modular_citadel/code/modules/vore/eating/vore_vr.dm
similarity index 56%
rename from code/modules/vore/eating/vore_vr.dm
rename to modular_citadel/code/modules/vore/eating/vore_vr.dm
index f6d886e93f..f0ceb97e31 100644
--- a/code/modules/vore/eating/vore_vr.dm
+++ b/modular_citadel/code/modules/vore/eating/vore_vr.dm
@@ -23,6 +23,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
// Overrides/additions to stock defines go here, as well as hooks. Sort them by
// the object they are overriding. So all /mob/living together, etc.
//
+
//
// The datum type bolted onto normal preferences datums for storing Vore stuff
//
@@ -40,21 +41,23 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
//Actual preferences
var/digestable = TRUE
var/devourable = FALSE
+// var/allowmobvore = TRUE
var/list/belly_prefs = list()
- var/vore_taste
+ var/vore_taste = "nothing in particular"
+// var/can_be_drop_prey = FALSE
+// var/can_be_drop_pred = FALSE
//Mechanically required
var/path
var/slot
var/client/client
var/client_ckey
- var/client/parent
/datum/vore_preferences/New(client/C)
if(istype(C))
client = C
client_ckey = C.ckey
- load_vore(C)
+ load_vore()
//
// Check if an object is capable of eating things, based on vore_organs
@@ -68,46 +71,60 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
//
// Belly searching for simplifying other procs
+// Mostly redundant now with belly-objects and isbelly(loc)
//
/proc/check_belly(atom/movable/A)
- if(istype(A.loc,/mob/living))
- var/mob/living/M = A.loc
- for(var/I in M.vore_organs)
- var/datum/belly/B = M.vore_organs[I]
- if(A in B.internal_contents)
- return(B)
-
- return FALSE
+ return isbelly(A.loc)
//
// Save/Load Vore Preferences
//
+/datum/vore_preferences/proc/load_path(ckey,slot,filename="character",ext="json")
+ if(!ckey || !slot) return
+ path = "data/player_saves/[copytext(ckey,1,2)]/[ckey]/vore/[filename][slot].[ext]"
+
+
/datum/vore_preferences/proc/load_vore()
- if(!client || !client_ckey) return FALSE //No client, how can we save?
+ if(!client || !client_ckey)
+ return FALSE //No client, how can we save?
+ if(!client.prefs || !client.prefs.default_slot)
+ return FALSE //Need to know what character to load!
slot = client.prefs.default_slot
- path = client.prefs.path
+ load_path(client_ckey,slot)
if(!path) return FALSE //Path couldn't be set?
if(!fexists(path)) //Never saved before
save_vore() //Make the file first
return TRUE
- var/savefile/S = new /savefile(path)
- if(!S) return FALSE //Savefile object couldn't be created?
+ var/list/json_from_file = json_decode(file2text(path))
+ if(!json_from_file)
+ return FALSE //My concern grows
- S.cd = "/character[slot]"
+ var/version = json_from_file["version"]
+ json_from_file = patch_version(json_from_file,version)
- S["digestable"] >> digestable
- S["devourable"] >> devourable
- S["belly_prefs"] >> belly_prefs
- S["vore_taste"] >> vore_taste
+ digestable = json_from_file["digestable"]
+ devourable = json_from_file["devourable"]
+// allowmobvore = json_from_file["allowmobvore"]
+ vore_taste = json_from_file["vore_taste"]
+// can_be_drop_prey = json_from_file["can_be_drop_prey"]
+// can_be_drop_prey = json_from_file["can_be_drop_pred"]
+ belly_prefs = json_from_file["belly_prefs"]
+ //Quick sanitize
if(isnull(digestable))
digestable = TRUE
if(isnull(devourable))
devourable = FALSE
+/* if(isnull(allowmobvore))
+ allowmobvore = TRUE
+ if(isnull(can_be_drop_prey))
+ allowmobvore = FALSE
+ if(isnull(can_be_drop_pred))
+ allowmobvore = FALSE */
if(isnull(belly_prefs))
belly_prefs = list()
@@ -115,28 +132,37 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
/datum/vore_preferences/proc/save_vore()
if(!path) return FALSE
- if(!slot) return FALSE
- var/savefile/S = new /savefile(path)
- if(!S) return FALSE
- S.cd = "/character[slot]"
- WRITE_FILE(S["digestable"], digestable)
- WRITE_FILE(S["devourable"], devourable)
- WRITE_FILE(S["belly_prefs"], belly_prefs)
- WRITE_FILE(S["vore_taste"], vore_taste)
+ var/version = 1 //For "good times" use in the future
+ var/list/settings_list = list(
+ "version" = version,
+ "digestable" = digestable,
+ "devourable" = devourable,
+ "vore_taste" = vore_taste,
+ "belly_prefs" = belly_prefs,
+ )
+
+ /* commented out list things
+ "allowmobvore" = allowmobvore,
+ "can_be_drop_prey" = can_be_drop_prey,
+ "can_be_drop_pred" = can_be_drop_pred, */
+
+ //List to JSON
+ var/json_to_file = json_encode(settings_list)
+ if(!json_to_file)
+ testing("Saving: [path] failed jsonencode")
+ return FALSE
+
+ //Write it out
+ if(fexists(path))
+ fdel(path) //Byond only supports APPENDING to files, not replacing.
+ text2file(json_to_file,path)
+ if(!fexists(path))
+ testing("Saving: [path] failed file write")
+ return FALSE
return TRUE
-#ifdef TESTING
-//DEBUG
-//Some crude tools for testing savefiles
-//path is the savefile path
-/client/verb/vore_savefile_export(path as text)
- var/savefile/S = new /savefile(path)
- S.ExportText("/",file("[path].txt"))
-//path is the savefile path
-/client/verb/vore_savefile_import(path as text)
- var/savefile/S = new /savefile(path)
- S.ImportText("/",file("[path].txt"))
-
-#endif
\ No newline at end of file
+//Can do conversions here
+/datum/vore_preferences/proc/patch_version(var/list/json_from_file,var/version)
+ return json_from_file
\ No newline at end of file
diff --git a/code/modules/vore/eating/voreitems.dm b/modular_citadel/code/modules/vore/eating/voreitems.dm
similarity index 93%
rename from code/modules/vore/eating/voreitems.dm
rename to modular_citadel/code/modules/vore/eating/voreitems.dm
index 5d157c39fe..741782545a 100644
--- a/code/modules/vore/eating/voreitems.dm
+++ b/modular_citadel/code/modules/vore/eating/voreitems.dm
@@ -16,7 +16,7 @@
/obj/item/projectile/sickshot
name = "sickshot pulse"
icon_state = "e_netting"
- damage = 1
+ damage = 0
damage_type = STAMINA
range = 2
@@ -25,8 +25,7 @@
var/mob/living/carbon/H = target
if(prob(5))
for(var/X in H.vore_organs)
- var/datum/belly/B = H.vore_organs[X]
- B.release_all_contents()
+ H.release_vore_contents()
H.visible_message("[H] contracts strangely, spewing out contents on the floor! ", \
"You spew out everything inside you on the floor! ")
return
diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm
similarity index 59%
rename from code/modules/vore/eating/vorepanel_vr.dm
rename to modular_citadel/code/modules/vore/eating/vorepanel_vr.dm
index e9bb44765f..7d7a48ed28 100644
--- a/code/modules/vore/eating/vorepanel_vr.dm
+++ b/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm
@@ -14,7 +14,7 @@
var/datum/vore_look/picker_holder = new()
picker_holder.loop = picker_holder
- picker_holder.selected = vore_organs[vore_selected]
+ picker_holder.selected = vore_selected
var/dat = picker_holder.gen_vui(src)
@@ -22,11 +22,23 @@
picker_holder.popup.set_content(dat)
picker_holder.popup.open()
+/mob/living/proc/updateVRPanel() //Panel popup update call from belly events.
+ if(src.openpanel == 1)
+ var/datum/vore_look/picker_holder = new()
+ picker_holder.loop = picker_holder
+ picker_holder.selected = vore_selected
+
+ var/dat = picker_holder.gen_vui(src)
+
+ picker_holder.popup = new(src, "insidePanel","Vore Panel", 400, 600, picker_holder)
+ picker_holder.popup.set_content(dat)
+ picker_holder.popup.open()
+
//
// Callback Handler for the Inside form
//
/datum/vore_look
- var/datum/belly/selected
+ var/obj/belly/selected
var/show_interacts = TRUE
var/datum/browser/popup
var/loop = null; // Magic self-reference to stop the handler from being GC'd before user takes action.
@@ -44,29 +56,38 @@
/datum/vore_look/proc/gen_vui(var/mob/living/user)
var/dat
- if (is_vore_predator(user.loc))
- var/mob/living/eater = user.loc
- var/datum/belly/inside_belly
-
- //This big block here figures out where the prey is
- inside_belly = check_belly(user)
+ var/atom/userloc = user.loc
+ if (isbelly(userloc))
+ var/obj/belly/inside_belly = userloc
+ var/mob/living/eater = inside_belly.owner
+ //Don't display this part if we couldn't find the belly since could be held in hand.
if(inside_belly)
- dat += "You are currently inside [eater]'s [inside_belly] ! "
+ dat += "You are currently [user.absorbed ? "absorbed into " : "inside "] [eater]'s [inside_belly] ! "
- if(inside_belly.inside_flavor)
- dat += "[inside_belly.inside_flavor] "
+ if(inside_belly.desc)
+ dat += "[inside_belly.desc] "
- if (inside_belly.internal_contents.len > 1)
+ if (inside_belly.contents.len > 1)
dat += "You can see the following around you: "
- for (var/atom/movable/O in inside_belly.internal_contents)
+ for (var/atom/movable/O in inside_belly)
if(istype(O,/mob/living))
var/mob/living/M = O
//That's just you
if(M == user)
continue
+
+ //That's an absorbed person you're checking
+ if(M.absorbed)
+ if(user.absorbed)
+ dat += "[O] "
+ continue
+ else
+ continue
+
//Anything else
- dat += "[O] "
+ dat += "[O] "
+
//Zero-width space, for wrapping
dat += ""
else
@@ -75,8 +96,8 @@
dat += " "
dat += ""
- for(var/K in user.vore_organs) //Fuggin can't iterate over values
- var/datum/belly/B = user.vore_organs[K]
+ for(var/belly in user.vore_organs)
+ var/obj/belly/B = belly
if(B == selected)
dat += "[B.name] "
else
@@ -90,8 +111,10 @@
spanstyle = "color:red;"
if(DM_HEAL)
spanstyle = "color:green;"
+ if(DM_NOISY)
+ spanstyle = "color:purple;"
- dat += " ([B.internal_contents.len]) "
+ dat += " ([B.contents.len]) "
if(user.vore_organs.len < BELLIES_MAX)
dat += "New+ "
@@ -102,15 +125,27 @@
if(!selected)
dat += "No belly selected. Click one to select it."
else
- if(selected.internal_contents.len > 0)
+ if(selected.contents.len)
dat += "Contents: "
- for(var/O in selected.internal_contents)
+ for(var/O in selected)
+
+ //Mobs can be absorbed, so treat them separately from everything else
+ if(istype(O,/mob/living))
+ var/mob/living/M = O
+
+ //Absorbed gets special color OOoOOOOoooo
+ if(M.absorbed)
+ dat += "[O] "
+ continue
+
+ //Anything else
dat += "[O] "
//Zero-width space, for wrapping
dat += ""
+
//If there's more than one thing, add an [All] button
- if(selected.internal_contents.len > 1)
+ if(selected.contents.len > 1)
dat += "\[All\] "
dat += " "
@@ -129,14 +164,15 @@
//Inside flavortext
dat += "Flavor Text: "
- dat += " '[selected.inside_flavor]'"
+ dat += " '[selected.desc]'"
//Belly sound
dat += "Set Vore Sound "
dat += "Test "
- // //Belly silence
- // dat += "Belly Silence ([selected.silenced ? "Silenced" : "Noisy"]) "
+ //Release sound
+ dat += "Set Release Sound "
+ dat += "Test "
//Belly messages
dat += "Belly Messages "
@@ -145,6 +181,10 @@
dat += "Can Taste: "
dat += " [selected.can_taste ? "Yes" : "No"]"
+ //Minimum size prey must be to show up.
+ dat += "Required examine size: "
+ dat += " [selected.bulge_size*100]%"
+
//Belly escapability
dat += "Belly Interactions ([selected.escapable ? "On" : "Off"]) "
if(selected.escapable)
@@ -173,15 +213,21 @@
dat += " [selected.digestchance]%"
dat += " "
+ // Belly Silence
+ dat += "Belly Silence (for not belly bellies): "
+ dat += " [selected.silent ? "Yes" : "No"]"
+
//Delete button
dat += "Delete Belly "
+ dat += "Set Flavor "
+ dat += "Toggle Hunger Noises "
+
dat += " "
//Under the last HR, save and stuff.
dat += "Save Prefs "
dat += "Refresh "
- dat += "Set Flavor "
dat += " "
switch(user.digestable)
@@ -221,8 +267,8 @@
if(href_list["outsidepick"])
var/atom/movable/tgt = locate(href_list["outsidepick"])
- var/datum/belly/OB = locate(href_list["outsidebelly"])
- if(!(tgt in OB.internal_contents)) //Aren't here anymore, need to update menu.
+ var/obj/belly/OB = locate(href_list["outsidebelly"])
+ if(!(tgt in OB)) //Aren't here anymore, need to update menu.
return TRUE
var/intent = "Examine"
@@ -234,42 +280,49 @@
M.examine(user)
if("Help Out") //Help the inside-mob out
- to_chat(user, "You begin to push [M] to freedom! ")
- to_chat(M, "[usr] begins to push you to freedom!")
- M.loc << "Someone is trying to escape from inside you! "
+ if(user.stat || user.absorbed || M.absorbed)
+ to_chat(user,"You can't do that in your state! ")
+ return 1
+
+ to_chat(user,"You begin to push [M] to freedom! ")
+ to_chat(M,"[usr] begins to push you to freedom!")
+ to_chat(M.loc,"Someone is trying to escape from inside you! ")
sleep(50)
if(prob(33))
OB.release_specific_contents(M)
- to_chat(usr, "You manage to help [M] to safety! ")
- to_chat(M, "[user] pushes you free! ")
- M.loc << "[M] forces free of the confines of your body! "
+ to_chat(usr,"You manage to help [M] to safety! ")
+ to_chat(M,"[user] pushes you free! ")
+ to_chat(OB.owner,"[M] forces free of the confines of your body! ")
else
- to_chat(user, "[M] slips back down inside despite your efforts. ")
- to_chat(M, " Even with [user]'s help, you slip back inside again. ")
- M.loc << "Your body efficiently shoves [M] back where they belong. "
+ to_chat(user,"[M] slips back down inside despite your efforts. ")
+ to_chat(M," Even with [user]'s help, you slip back inside again. ")
+ to_chat(OB.owner,"Your body efficiently shoves [M] back where they belong. ")
+
if("Devour") //Eat the inside mob
+ if(user.absorbed || user.stat)
+ to_chat(user,"You can't do that in your state! ")
+ return 1
+
if(!user.vore_selected)
- to_chat(user, "Pick a belly on yourself first! ")
- return
+ to_chat(user,"Pick a belly on yourself first! ")
+ return 1
- var/datum/belly/TB = user.vore_organs[user.vore_selected]
- to_chat(user, "You begin to [lowertext(TB.vore_verb)] [M] into your [lowertext(TB.name)]! ")
- to_chat(M, "[user] begins to [lowertext(TB.vore_verb)] you into their [lowertext(TB.name)]! ")
- M.loc << "Someone inside you is eating someone else! "
+ var/obj/belly/TB = user.vore_selected
+ to_chat(user,"You begin to [lowertext(TB.vore_verb)] [M] into your [lowertext(TB.name)]! ")
+ to_chat(M,"[user] begins to [lowertext(TB.vore_verb)] you into their [lowertext(TB.name)]! ")
+ to_chat(OB.owner,"Someone inside you is eating someone else! ")
- sleep(TB.nonhuman_prey_swallow_time)
- if((user in OB.internal_contents) && (M in OB.internal_contents))
- to_chat(user, "You manage to [lowertext(TB.vore_verb)] [M] into your [lowertext(TB.name)]! ")
- to_chat(M, "[user] manages to [lowertext(TB.vore_verb)] you into their [lowertext(TB.name)]! ")
- M.loc << "Someone inside you has eaten someone else! "
- M.loc = user
+ sleep(TB.nonhuman_prey_swallow_time) //Can't do after, in a stomach, weird things abound.
+ if((user in OB) && (M in OB)) //Make sure they're still here.
+ to_chat(user,"You manage to [lowertext(TB.vore_verb)] [M] into your [lowertext(TB.name)]! ")
+ to_chat(M,"[user] manages to [lowertext(TB.vore_verb)] you into their [lowertext(TB.name)]! ")
+ to_chat(OB.owner,"Someone inside you has eaten someone else! ")
TB.nom_mob(M)
- OB.internal_contents -= M
else if(istype(tgt,/obj/item))
var/obj/item/T = tgt
- if(!(tgt in OB.internal_contents))
+ if(!(tgt in OB.contents))
//Doesn't exist anymore, update.
return TRUE
intent = alert("What do you want to do to that?","Query","Examine","Use Hand")
@@ -301,27 +354,29 @@
return
selected.release_all_contents()
- playsound(get_turf(user),'sound/vore/pred/escape.ogg',50,0,-5,0,ignore_walls = FALSE)
+ for(var/mob/M in get_hearers_in_view(5, get_turf(user)))
+ if(M.client && M.client.prefs.toggles & EATING_NOISES)
+ playsound(get_turf(user),'sound/vore/pred/escape.ogg',50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED)
to_chat(user.loc,"Everything is released from [user]! ")
if("Move all")
if(user.stat)
to_chat(user, "You can't do that in your state! ")
- return
+ return FALSE
- var/choice = input("Move all where?","Select Belly") in user.vore_organs + "Cancel - Don't Move"
+ var/obj/belly/choice = input("Move all where?","Select Belly") as null|anything in user.vore_organs
+ if(!choice)
+ return FALSE
- if(choice == "Cancel - Don't Move")
- return
- else
- var/datum/belly/B = user.vore_organs[choice]
- for(var/atom/movable/tgt in selected.internal_contents)
- to_chat(tgt, "You're squished from [user]'s [selected] to their [B]! ")
- selected.transfer_contents(tgt, B, 1)
- playsound(get_turf(user),'sound/vore/pred/stomachmove.ogg',50,0,-5,0,ignore_walls = FALSE)
+ for(var/atom/movable/tgt in selected)
+ selected.transfer_contents(tgt, choice, 1)
+ for(var/mob/M in get_hearers_in_view(5, get_turf(user)))
+ if(M.client && M.client.prefs.toggles & EATING_NOISES)
+ playsound(get_turf(user),'sound/vore/pred/stomachmove.ogg',50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED)
+ to_chat(tgt,"You're squished from [user]'s [lowertext(selected)] to their [lowertext(choice.name)]! ")
var/atom/movable/tgt = locate(href_list["insidepick"])
- if(!(tgt in selected.internal_contents)) //Old menu, needs updating because they aren't really there.
+ if(!(tgt in selected)) //Old menu, needs updating because they aren't really there.
return TRUE//Forces update
intent = "Examine"
intent = alert("Examine, Eject, Move? Examine if you want to leave this box.","Query","Examine","Eject","Move")
@@ -335,48 +390,54 @@
return FALSE
selected.release_specific_contents(tgt)
- playsound(get_turf(user),'sound/effects/splat.ogg',50,0,-5,0,ignore_walls = FALSE)
+ for(var/mob/M in get_hearers_in_view(5, get_turf(user)))
+ if(M.client && M.client.prefs.toggles & EATING_NOISES)
+ playsound(get_turf(user),'sound/vore/pred/escape.ogg',50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED)
user.loc << "[tgt] is released from [user]! "
if("Move")
if(user.stat)
- to_chat(user, "You can't do that in your state! ")
- return FALSE
+ to_chat(user,"You can't do that in your state! ")
+ return 0
- var/choice = input("Move [tgt] where?","Select Belly") in user.vore_organs + "Cancel - Don't Move"
+ var/obj/belly/choice = input("Move [tgt] where?","Select Belly") as null|anything in user.vore_organs
+ if(!choice || !(tgt in selected))
+ return 0
- if(choice == "Cancel - Don't Move")
- return
- else
- var/datum/belly/B = user.vore_organs[choice]
- if (!(tgt in selected.internal_contents))
- return FALSE
- to_chat(tgt, "You're moved from [user]'s [lowertext(selected.name)] to their [lowertext(B.name)]! ")
- playsound(get_turf(user),'sound/vore/pred/stomachmove.ogg',50,0,-5,0,ignore_walls = FALSE)
- selected.transfer_contents(tgt, B)
+ to_chat(tgt,"You're squished from [user]'s [lowertext(selected.name)] to their [lowertext(choice.name)]! ")
+ selected.transfer_contents(tgt, choice)
+ for(var/mob/M in get_hearers_in_view(5, get_turf(user)))
+ if(M.client && M.client.prefs.toggles & EATING_NOISES)
+ playsound(get_turf(user),'sound/vore/pred/stomachmove.ogg',50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED)
if(href_list["newbelly"])
if(user.vore_organs.len >= BELLIES_MAX)
- return TRUE
+ return 0
var/new_name = html_encode(input(usr,"New belly's name:","New Belly") as text|null)
+ var/failure_msg
if(length(new_name) > BELLIES_NAME_MAX || length(new_name) < BELLIES_NAME_MIN)
- to_chat(usr, "Entered belly name is too long. ")
- return FALSE
- if(new_name in user.vore_organs)
- to_chat(usr, "No duplicate belly names, please. ")
- return FALSE
+ failure_msg = "Entered belly name length invalid (must be longer than [BELLIES_NAME_MIN], no more than than [BELLIES_NAME_MAX])."
+ // else if(whatever) //Next test here.
+ else
+ for(var/belly in user.vore_organs)
+ var/obj/belly/B = belly
+ if(lowertext(new_name) == lowertext(B.name))
+ failure_msg = "No duplicate belly names, please."
+ break
- var/datum/belly/NB = new(user)
+ if(failure_msg) //Something went wrong.
+ alert(user,failure_msg,"Error!")
+ return 0
+
+ var/obj/belly/NB = new(user)
NB.name = new_name
- NB.owner = user //might be the thing we all needed.
- user.vore_organs[new_name] = NB
selected = NB
if(href_list["bellypick"])
selected = locate(href_list["bellypick"])
- user.vore_selected = selected.name
+ user.vore_selected = selected
////
//Please keep these the same order they are on the panel UI for ease of coding
@@ -384,41 +445,40 @@
if(href_list["b_name"])
var/new_name = html_encode(input(usr,"Belly's new name:","New Name") as text|null)
+ var/failure_msg
if(length(new_name) > BELLIES_NAME_MAX || length(new_name) < BELLIES_NAME_MIN)
- to_chat(usr, "Entered belly name length invalid (must be longer than 2, shorter than 12). ")
- return FALSE
- if(new_name in user.vore_organs)
- to_chat(usr, "No duplicate belly names, please. ")
- return FALSE
+ failure_msg = "Entered belly name length invalid (must be longer than [BELLIES_NAME_MIN], no more than than [BELLIES_NAME_MAX])."
+ // else if(whatever) //Next test here.
+ else
+ for(var/belly in user.vore_organs)
+ var/obj/belly/B = belly
+ if(lowertext(new_name) == lowertext(B.name))
+ failure_msg = "No duplicate belly names, please."
+ break
+
+ if(failure_msg) //Something went wrong.
+ alert(user,failure_msg,"Error!")
+ return 0
- user.vore_organs[new_name] = selected
- user.vore_organs -= selected.name
selected.name = new_name
if(href_list["b_mode"])
var/list/menu_list = selected.digest_modes
- if(selected.digest_modes.len == 1) // Don't do anything
- return 1
- if(selected.digest_modes.len == 2) // Just toggle... there's probably a more elegant way to do this...
- var/index = selected.digest_modes.Find(selected.digest_mode)
- switch(index)
- if(1)
- selected.digest_mode = selected.digest_modes[2]
- if(2)
- selected.digest_mode = selected.digest_modes[1]
- else
- selected.digest_mode = input("Choose Mode (currently [selected.digest_mode])") in menu_list
+ var/new_mode = input("Choose Mode (currently [selected.digest_mode])") as null|anything in menu_list
+ if(!new_mode)
+ return 0
+ selected.digest_mode = new_mode
if(href_list["b_desc"])
- var/new_desc = html_encode(input(usr,"Belly Description (1024 char limit):","New Description",selected.inside_flavor) as message|null)
+ var/new_desc = html_encode(input(usr,"Belly Description ([BELLIES_DESC_MAX] char limit):","New Description",selected.desc) as message|null)
+
if(new_desc)
new_desc = readd_quotes(new_desc)
if(length(new_desc) > BELLIES_DESC_MAX)
- to_chat(usr, "Entered belly desc too long. [BELLIES_DESC_MAX] character limit. ")
+ alert("Entered belly desc too long. [BELLIES_DESC_MAX] character limit.","Error")
return FALSE
-
- selected.inside_flavor = new_desc
+ selected.desc = new_desc
else //Returned null
return FALSE
@@ -429,12 +489,11 @@
"Struggle Message (outside)",
"Struggle Message (inside)",
"Examine Message (when full)",
- "Reset All To Default",
- "Cancel - No Changes"
+ "Reset All To Default"
)
alert(user,"Setting abusive or deceptive messages will result in a ban. Consider this your warning. Max 150 characters per message, max 10 messages per topic.","Really, don't.")
- var/choice = input(user,"Select a type to modify. Messages from each topic are pulled at random when needed.","Pick Type") in messages
+ var/choice = input(user,"Select a type to modify. Messages from each topic are pulled at random when needed.","Pick Type") as null|anything in messages
var/help = " Press enter twice to separate messages. '%pred' will be replaced with your name. '%prey' will be replaced with the prey's name. '%belly' will be replaced with your belly's name."
switch(choice)
@@ -459,7 +518,7 @@
selected.set_messages(new_message,"smi")
if("Examine Message (when full)")
- var/new_message = input(user,"These are sent to people who examine you when this belly has contents. Write them in 3rd person ('Their %belly is bulging'). "+help,"Examine Message (when full)",selected.get_messages("em")) as message
+ var/new_message = input(user,"These are sent to people who examine you when this belly has contents. Write them in 3rd person ('Their %belly is bulging')."+help,"Examine Message (when full)",selected.get_messages("em")) as message
if(new_message)
selected.set_messages(new_message,"em")
@@ -471,40 +530,57 @@
selected.struggle_messages_outside = initial(selected.struggle_messages_outside)
selected.struggle_messages_inside = initial(selected.struggle_messages_inside)
- if("Cancel - No Changes")
- return
-
if(href_list["b_verb"])
var/new_verb = html_encode(input(usr,"New verb when eating (infinitive tense, e.g. nom or swallow):","New Verb") as text|null)
if(length(new_verb) > BELLIES_NAME_MAX || length(new_verb) < BELLIES_NAME_MIN)
- to_chat(usr, "Entered verb length invalid (must be longer than [BELLIES_NAME_MIN], no longer than [BELLIES_NAME_MAX]). ")
- return FALSE
+ alert("Entered verb length invalid (must be longer than [BELLIES_NAME_MIN], no longer than [BELLIES_NAME_MAX]).","Error")
+ return 0
selected.vore_verb = new_verb
- if(href_list["b_sound"])
- var/choice = input(user,"Currently set to [selected.vore_sound]","Select Sound") in GLOB.pred_vore_sounds + "Cancel - No Changes"
+ if(href_list["b_release"])
+ var/choice = input(user,"Currently set to [selected.release_sound]","Select Sound") as null|anything in GLOB.release_sound
- if(choice == "Cancel")
+ if(!choice)
+ return
+
+ selected.release_sound = GLOB.release_sound[choice]
+
+ if(href_list["b_releasesoundtest"])
+ var/soundfile = GLOB.release_sound[selected.release_sound]
+ if(soundfile)
+ user << soundfile
+
+ if(href_list["b_sound"])
+ var/choice = input(user,"Currently set to [selected.vore_sound]","Select Sound") as null|anything in GLOB.pred_vore_sounds
+
+ if(!choice)
return
selected.vore_sound = GLOB.pred_vore_sounds[choice]
if(href_list["b_soundtest"])
- user << selected.vore_sound
-/*
- if(href_list["silenced"])
- if(selected.silenced == FALSE)
- selected.silenced = TRUE
- to_chat(usr,"The [selected.name] is now silenced, it will not play the internal loop to prey within it. ")
- else if(selected.silenced == TRUE)
- selected.silenced = FALSE
- to_chat(usr,"The [selected.name] will play the internal loop to prey within it. ")
-*/
+ var/soundfile = GLOB.pred_vore_sounds[selected.vore_sound]
+ if(soundfile)
+ user << soundfile
+
if(href_list["b_tastes"])
selected.can_taste = !selected.can_taste
+ if(href_list["b_bulge_size"])
+ var/new_bulge = input(user, "Choose the required size prey must be to show up on examine, ranging from 25% to 200% Set this to 0 for no text on examine.", "Set Belly Examine Size.") as num|null
+ if(new_bulge == null)
+ return
+ if(new_bulge == 0) //Disable.
+ selected.bulge_size = 0
+ to_chat(user,"Your stomach will not be seen on examine. ")
+ else if (!IsInRange(new_bulge,25,200))
+ selected.bulge_size = 0.25 //Set it to the default.
+ to_chat(user,"Invalid size. ")
+ else if(new_bulge)
+ selected.bulge_size = (new_bulge/100)
+
if(href_list["b_escapable"])
if(selected.escapable == FALSE) //Possibly escapable and special interactions.
selected.escapable = TRUE
@@ -515,7 +591,7 @@
show_interacts = FALSE //Force the hiding of the panel
else
to_chat(usr,"Something went wrong. Your stomach will now not have special interactions. Press the button enable them again and tell a dev.") //If they somehow have a varable that's not 0 or 1
- selected.escapable = FALSE
+ selected.escapable = TRUE
show_interacts = FALSE //Force the hiding of the panel
if(href_list["b_escapechance"])
@@ -537,68 +613,73 @@
var/choice = input("Where do you want your [selected.name] to lead if prey resists?","Select Belly") as null|anything in (user.vore_organs + "None - Remove" - selected.name)
if(!choice) //They cancelled, no changes
- return
+ return FALSE
else if(choice == "None - Remove")
selected.transferlocation = null
else
selected.transferlocation = user.vore_organs[choice]
+ if(href_list["b_absorbchance"])
+ var/absorb_chance_input = input(user, "Set belly absorb mode chance on resist (as %)", "Prey Absorb Chance") as num|null
+ if(!isnull(absorb_chance_input))
+ selected.absorbchance = sanitize_integer(absorb_chance_input, 0, 100, initial(selected.absorbchance))
+
if(href_list["b_digestchance"])
var/digest_chance_input = input(user, "Set belly digest mode chance on resist (as %)", "Prey Digest Chance") as num|null
if(!isnull(digest_chance_input))
selected.digestchance = sanitize_integer(digest_chance_input, 0, 100, initial(selected.digestchance))
+ if(href_list["b_silent"])
+ selected.silent = !selected.silent
+
if(href_list["b_del"])
- var/dest_for = FALSE //Check to see if it's the destination of another vore organ.
- for(var/I in user.vore_organs)
- var/datum/belly/B = user.vore_organs[I]
+ var/alert = alert("Are you sure you want to delete your [lowertext(selected.name)]?","Confirmation","Delete","Cancel")
+ if(!alert == "Delete")
+ return FALSE
+
+ var/failure_msg = ""
+
+ var/dest_for //Check to see if it's the destination of another vore organ.
+ for(var/belly in user.vore_organs)
+ var/obj/belly/B = belly
if(B.transferlocation == selected)
dest_for = B.name
+ failure_msg += "This is the destiantion for at least '[dest_for]' belly transfers. Remove it as the destination from any bellies before deleting it. "
break
- if(dest_for)
- alert("This is the destiantion for at least '[dest_for]' belly transfers. Remove it as the destination from any bellies before deleting it.","Error")
- return TRUE
- else if(selected.internal_contents.len)
- alert("Can't delete bellies with contents!","Error")
- return TRUE
- if(selected.internal_contents.len)
- to_chat(usr, "Can't delete bellies with contents! ")
- return
- else if(selected.immutable)
- to_chat(usr, "This belly is marked as undeletable. ")
- return
- else if(user.vore_organs.len == 1)
- to_chat(usr, "You must have at least one belly. ")
- return
- else
- var/alert = alert("Are you sure you want to delete [selected]?","Confirmation","Delete","Cancel")
- if(alert == "Delete" && !selected.internal_contents.len)
- user.vore_organs -= selected.name
- user.vore_organs.Remove(selected)
- selected = user.vore_organs[1]
- user.vore_selected = user.vore_organs[1]
- to_chat(usr,"Note: If you had this organ selected as a transfer location, please remove the transfer location by selecting Cancel - None - Remove on this stomach. ")
+ if(selected.contents.len)
+ failure_msg += "You cannot delete bellies with contents! " //These end with spaces, to be nice looking. Make sure you do the same.
+ if(selected.immutable)
+ failure_msg += "This belly is marked as undeletable. "
+ if(user.vore_organs.len == 1)
+ failure_msg += "You must have at least one belly. "
+
+ if(failure_msg)
+ alert(user,failure_msg,"Error!")
+ return FALSE
+
+ qdel(selected)
+ selected = user.vore_organs[1]
+ user.vore_selected = user.vore_organs[1]
if(href_list["saveprefs"])
- if(user.save_vore_prefs())
- to_chat(user, "Belly Preferences saved! ")
+ if(!user.save_vore_prefs())
+ to_chat(user, "Belly Preferences not saved! ")
else
- to_chat(user, "ERROR: Belly Preferences were not saved! ")
+ to_chat(user, "Belly Preferences were saved! ")
log_admin("Could not save vore prefs on USER: [user].")
if(href_list["setflavor"])
var/new_flavor = html_encode(input(usr,"What your character tastes like (40ch limit). This text will be printed to the pred after 'X tastes of...' so just put something like 'strawberries and cream':","Character Flavor",user.vore_taste) as text|null)
+ if(!new_flavor)
+ return 0
- if(new_flavor)
- new_flavor = readd_quotes(new_flavor)
- if(length(new_flavor) > FLAVOR_MAX)
- alert("Entered flavor/taste text too long. [FLAVOR_MAX] character limit.","Error")
- return FALSE
- user.vore_taste = new_flavor
- else //Returned null
- return FALSE
+ new_flavor = readd_quotes(new_flavor)
+ if(length(new_flavor) > FLAVOR_MAX)
+ alert("Entered flavor/taste text too long. [FLAVOR_MAX] character limit.","Error!")
+ return 0
+ user.vore_taste = new_flavor
if(href_list["toggledg"])
var/choice = alert(user, "This button is for those who don't like being digested. It can make you undigestable to all mobs. Digesting you is currently: [user.digestable ? "Allowed" : "Prevented"]", "", "Allow Digestion", "Cancel", "Prevent Digestion")
@@ -626,5 +707,15 @@
if(user.client.prefs_vr)
user.client.prefs_vr.devourable = user.devourable
+ if(href_list["togglenoisy"])
+ var/choice = alert(user, "Toggle audible hunger noises. Currently: [user.noisy ? "Enabled" : "Disabled"]", "", "Enable audible hunger", "Cancel", "Disable audible hunger")
+ switch(choice)
+ if("Cancel")
+ return 0
+ if("Enable audible hunger")
+ user.noisy = TRUE
+ if("Disable audible hunger")
+ user.noisy = FALSE
+
//Refresh when interacted with, returning 1 makes vore_look.Topic update
- return TRUE
+ return 1
\ No newline at end of file
diff --git a/code/modules/vore/hook-defs_vr.dm b/modular_citadel/code/modules/vore/hook-defs_vr.dm
similarity index 100%
rename from code/modules/vore/hook-defs_vr.dm
rename to modular_citadel/code/modules/vore/hook-defs_vr.dm
diff --git a/modular_citadel/code/modules/vore/persistence.dm b/modular_citadel/code/modules/vore/persistence.dm
new file mode 100644
index 0000000000..078a3f48ee
--- /dev/null
+++ b/modular_citadel/code/modules/vore/persistence.dm
@@ -0,0 +1,90 @@
+/*
+* Returns a byond list that can be passed to the "deserialize" proc
+* to bring a new instance of this atom to its original state
+*
+* If we want to store this info, we can pass it to `json_encode` or some other
+* interface that suits our fancy, to make it into an easily-handled string
+*/
+/datum/proc/serialize()
+ var/data = list("type" = "[type]")
+ return data
+
+/*
+* This is given the byond list from above, to bring this atom to the state
+* described in the list.
+* This will be called after `New` but before `initialize`, so linking and stuff
+* would probably be handled in `initialize`
+*
+* Also, this should only be called by `list_to_object` in persistence.dm - at least
+* with current plans - that way it can actually initialize the type from the list
+*/
+/datum/proc/deserialize(var/list/data)
+ return
+
+/atom
+ // This var isn't actually used for anything, but is present so that
+ // DM's map reader doesn't forfeit on reading a JSON-serialized map
+ var/map_json_data
+
+// This is so specific atoms can override these, and ignore certain ones
+/atom/proc/vars_to_save()
+ return list("color","dir","icon","icon_state","name","pixel_x","pixel_y")
+
+/atom/proc/map_important_vars()
+ // A list of important things to save in the map editor
+ return list("color","dir","icon","icon_state","layer","name","pixel_x","pixel_y")
+
+/area/map_important_vars()
+ // Keep the area default icons, to keep things nice and legible
+ return list("name")
+
+// No need to save any state of an area by default
+/area/vars_to_save()
+ return list("name")
+
+/atom/serialize()
+ var/list/data = ..()
+ for(var/thing in vars_to_save())
+ if(vars[thing] != initial(vars[thing]))
+ data[thing] = vars[thing]
+ return data
+
+
+/atom/deserialize(var/list/data)
+ for(var/thing in vars_to_save())
+ if(thing in data)
+ vars[thing] = data[thing]
+ ..()
+
+
+/*
+Whoops, forgot to put documentation here.
+What this does, is take a JSON string produced by running
+BYOND's native `json_encode` on a list from `serialize` above, and
+turns that string into a new instance of that object.
+
+You can also easily get an instance of this string by calling "Serialize Marked Datum"
+in the "Debug" tab.
+
+If you're clever, you can do neat things with SDQL and this, though be careful -
+some objects, like humans, are dependent that certain extra things are defined
+in their list
+*/
+/proc/object_to_json(var/atom/movable/thing)
+ return json_encode(thing.serialize())
+
+/proc/json_to_object(var/json_data, var/loc)
+ return list_to_object(json_decode(json_data), loc)
+
+/proc/list_to_object(var/list/data, var/loc)
+ if(!islist(data))
+ throw EXCEPTION("You didn't give me a list, bucko")
+ if(!("type" in data))
+ throw EXCEPTION("No 'type' field in the data")
+ var/path = text2path(data["type"])
+ if(!path)
+ throw EXCEPTION("Path not found: [path]")
+
+ var/atom/movable/thing = new path(loc)
+ thing.deserialize(data)
+ return thing
\ No newline at end of file
diff --git a/code/modules/vore/resizing/grav_pull_vr.dm b/modular_citadel/code/modules/vore/resizing/grav_pull_vr.dm
similarity index 100%
rename from code/modules/vore/resizing/grav_pull_vr.dm
rename to modular_citadel/code/modules/vore/resizing/grav_pull_vr.dm
diff --git a/code/modules/vore/resizing/holder_micro_vr.dm b/modular_citadel/code/modules/vore/resizing/holder_micro_vr.dm
similarity index 100%
rename from code/modules/vore/resizing/holder_micro_vr.dm
rename to modular_citadel/code/modules/vore/resizing/holder_micro_vr.dm
diff --git a/code/modules/vore/resizing/resize_vr.dm b/modular_citadel/code/modules/vore/resizing/resize_vr.dm
similarity index 100%
rename from code/modules/vore/resizing/resize_vr.dm
rename to modular_citadel/code/modules/vore/resizing/resize_vr.dm
diff --git a/code/modules/vore/resizing/sizechemicals.dm b/modular_citadel/code/modules/vore/resizing/sizechemicals.dm
similarity index 98%
rename from code/modules/vore/resizing/sizechemicals.dm
rename to modular_citadel/code/modules/vore/resizing/sizechemicals.dm
index 78b4bd71ca..1164bf65d6 100644
--- a/code/modules/vore/resizing/sizechemicals.dm
+++ b/modular_citadel/code/modules/vore/resizing/sizechemicals.dm
@@ -110,6 +110,6 @@
for(var/atom/movable/A in B.internal_contents)
if(prob(55))
playsound(M, 'sound/effects/splat.ogg', 50, 1)
- B.release_specific_contents(A)
+ B.release_vore_contents(A)
..()
. = 1
\ No newline at end of file
diff --git a/code/modules/vore/resizing/sizegun_vr.dm b/modular_citadel/code/modules/vore/resizing/sizegun_vr.dm
similarity index 100%
rename from code/modules/vore/resizing/sizegun_vr.dm
rename to modular_citadel/code/modules/vore/resizing/sizegun_vr.dm
diff --git a/code/modules/vore/trycatch_vr.dm b/modular_citadel/code/modules/vore/trycatch_vr.dm
similarity index 100%
rename from code/modules/vore/trycatch_vr.dm
rename to modular_citadel/code/modules/vore/trycatch_vr.dm
diff --git a/code/citadel/icons/misc.dmi b/modular_citadel/icons/misc/misc.dmi
similarity index 100%
rename from code/citadel/icons/misc.dmi
rename to modular_citadel/icons/misc/misc.dmi
diff --git a/modular_citadel/icons/mob/clothing/fed hats n modern.dmi b/modular_citadel/icons/mob/clothing/fed hats n modern.dmi
new file mode 100644
index 0000000000..ab8682b785
Binary files /dev/null and b/modular_citadel/icons/mob/clothing/fed hats n modern.dmi differ
diff --git a/modular_citadel/icons/mob/clothing/fedcoats.dmi b/modular_citadel/icons/mob/clothing/fedcoats.dmi
new file mode 100644
index 0000000000..6554b3a45d
Binary files /dev/null and b/modular_citadel/icons/mob/clothing/fedcoats.dmi differ
diff --git a/modular_citadel/icons/mob/clothing/trek_item_icon.dmi b/modular_citadel/icons/mob/clothing/trek_item_icon.dmi
new file mode 100644
index 0000000000..4ac77773a0
Binary files /dev/null and b/modular_citadel/icons/mob/clothing/trek_item_icon.dmi differ
diff --git a/modular_citadel/icons/mob/clothing/trek_mob_icon.dmi b/modular_citadel/icons/mob/clothing/trek_mob_icon.dmi
new file mode 100644
index 0000000000..9323ea9f3c
Binary files /dev/null and b/modular_citadel/icons/mob/clothing/trek_mob_icon.dmi differ
diff --git a/modular_citadel/icons/mob/inhands/OVERRIDE_guns_lefthand.dmi b/modular_citadel/icons/mob/inhands/OVERRIDE_guns_lefthand.dmi
new file mode 100644
index 0000000000..b438c7acee
Binary files /dev/null and b/modular_citadel/icons/mob/inhands/OVERRIDE_guns_lefthand.dmi differ
diff --git a/modular_citadel/icons/mob/inhands/OVERRIDE_guns_righthand.dmi b/modular_citadel/icons/mob/inhands/OVERRIDE_guns_righthand.dmi
new file mode 100644
index 0000000000..dda226b046
Binary files /dev/null and b/modular_citadel/icons/mob/inhands/OVERRIDE_guns_righthand.dmi differ
diff --git a/modular_citadel/icons/mob/inhands/guns_lefthand.dmi b/modular_citadel/icons/mob/inhands/guns_lefthand.dmi
new file mode 100644
index 0000000000..601cc921d7
Binary files /dev/null and b/modular_citadel/icons/mob/inhands/guns_lefthand.dmi differ
diff --git a/modular_citadel/icons/mob/inhands/guns_righthand.dmi b/modular_citadel/icons/mob/inhands/guns_righthand.dmi
new file mode 100644
index 0000000000..c76907d2e8
Binary files /dev/null and b/modular_citadel/icons/mob/inhands/guns_righthand.dmi differ
diff --git a/modular_citadel/icons/mob/legacy robo transforms.dmi b/modular_citadel/icons/mob/legacy robo transforms.dmi
new file mode 100644
index 0000000000..a9baa71ac5
Binary files /dev/null and b/modular_citadel/icons/mob/legacy robo transforms.dmi differ
diff --git a/code/citadel/icons/mobs.dmi b/modular_citadel/icons/mob/mobs.dmi
similarity index 100%
rename from code/citadel/icons/mobs.dmi
rename to modular_citadel/icons/mob/mobs.dmi
diff --git a/modular_citadel/icons/mob/robots.dmi b/modular_citadel/icons/mob/robots.dmi
index a81f672b2b..9da2a97cc6 100644
Binary files a/modular_citadel/icons/mob/robots.dmi and b/modular_citadel/icons/mob/robots.dmi differ
diff --git a/code/citadel/icons/drinks.dmi b/modular_citadel/icons/obj/drinks.dmi
similarity index 100%
rename from code/citadel/icons/drinks.dmi
rename to modular_citadel/icons/obj/drinks.dmi
diff --git a/code/citadel/icons/breasts.dmi b/modular_citadel/icons/obj/genitals/breasts.dmi
similarity index 100%
rename from code/citadel/icons/breasts.dmi
rename to modular_citadel/icons/obj/genitals/breasts.dmi
diff --git a/code/citadel/icons/breasts_onmob.dmi b/modular_citadel/icons/obj/genitals/breasts_onmob.dmi
similarity index 100%
rename from code/citadel/icons/breasts_onmob.dmi
rename to modular_citadel/icons/obj/genitals/breasts_onmob.dmi
diff --git a/code/citadel/icons/dildo.dmi b/modular_citadel/icons/obj/genitals/dildo.dmi
similarity index 100%
rename from code/citadel/icons/dildo.dmi
rename to modular_citadel/icons/obj/genitals/dildo.dmi
diff --git a/code/citadel/icons/effects.dmi b/modular_citadel/icons/obj/genitals/effects.dmi
similarity index 100%
rename from code/citadel/icons/effects.dmi
rename to modular_citadel/icons/obj/genitals/effects.dmi
diff --git a/code/citadel/icons/hud.dmi b/modular_citadel/icons/obj/genitals/hud.dmi
similarity index 100%
rename from code/citadel/icons/hud.dmi
rename to modular_citadel/icons/obj/genitals/hud.dmi
diff --git a/code/citadel/icons/onahole.dmi b/modular_citadel/icons/obj/genitals/onahole.dmi
similarity index 100%
rename from code/citadel/icons/onahole.dmi
rename to modular_citadel/icons/obj/genitals/onahole.dmi
diff --git a/code/citadel/icons/ovipositor.dmi b/modular_citadel/icons/obj/genitals/ovipositor.dmi
similarity index 100%
rename from code/citadel/icons/ovipositor.dmi
rename to modular_citadel/icons/obj/genitals/ovipositor.dmi
diff --git a/code/citadel/icons/penis.dmi b/modular_citadel/icons/obj/genitals/penis.dmi
similarity index 100%
rename from code/citadel/icons/penis.dmi
rename to modular_citadel/icons/obj/genitals/penis.dmi
diff --git a/code/citadel/icons/penis_onmob.dmi b/modular_citadel/icons/obj/genitals/penis_onmob.dmi
similarity index 100%
rename from code/citadel/icons/penis_onmob.dmi
rename to modular_citadel/icons/obj/genitals/penis_onmob.dmi
diff --git a/code/citadel/icons/taur_penis_onmob.dmi b/modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi
similarity index 100%
rename from code/citadel/icons/taur_penis_onmob.dmi
rename to modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi
diff --git a/code/citadel/icons/vagina.dmi b/modular_citadel/icons/obj/genitals/vagina.dmi
similarity index 100%
rename from code/citadel/icons/vagina.dmi
rename to modular_citadel/icons/obj/genitals/vagina.dmi
diff --git a/code/citadel/icons/vagina_onmob.dmi b/modular_citadel/icons/obj/genitals/vagina_onmob.dmi
similarity index 100%
rename from code/citadel/icons/vagina_onmob.dmi
rename to modular_citadel/icons/obj/genitals/vagina_onmob.dmi
diff --git a/modular_citadel/icons/obj/guns/OVERRIDE_energy.dmi b/modular_citadel/icons/obj/guns/OVERRIDE_energy.dmi
new file mode 100644
index 0000000000..9a902e0dff
Binary files /dev/null and b/modular_citadel/icons/obj/guns/OVERRIDE_energy.dmi differ
diff --git a/modular_citadel/icons/obj/guns/energy.dmi b/modular_citadel/icons/obj/guns/energy.dmi
deleted file mode 100644
index 21d348b66e..0000000000
Binary files a/modular_citadel/icons/obj/guns/energy.dmi and /dev/null differ
diff --git a/modular_citadel/icons/obj/guns/pumpactionblaster.dmi b/modular_citadel/icons/obj/guns/pumpactionblaster.dmi
new file mode 100644
index 0000000000..363faf3c57
Binary files /dev/null and b/modular_citadel/icons/obj/guns/pumpactionblaster.dmi differ
diff --git a/modular_citadel/icons/obj/guns/toys.dmi b/modular_citadel/icons/obj/guns/toys.dmi
new file mode 100644
index 0000000000..3c8595f405
Binary files /dev/null and b/modular_citadel/icons/obj/guns/toys.dmi differ
diff --git a/modular_citadel/icons/obj/hypospraymkii.dmi b/modular_citadel/icons/obj/hypospraymkii.dmi
new file mode 100644
index 0000000000..f5e89227c7
Binary files /dev/null and b/modular_citadel/icons/obj/hypospraymkii.dmi differ
diff --git a/code/citadel/icons/objects.dmi b/modular_citadel/icons/obj/objects.dmi
similarity index 100%
rename from code/citadel/icons/objects.dmi
rename to modular_citadel/icons/obj/objects.dmi
diff --git a/modular_citadel/icons/obj/projectiles.dmi b/modular_citadel/icons/obj/projectiles.dmi
new file mode 100644
index 0000000000..f5f6f2f8f3
Binary files /dev/null and b/modular_citadel/icons/obj/projectiles.dmi differ
diff --git a/modular_citadel/icons/obj/projectiles_impact.dmi b/modular_citadel/icons/obj/projectiles_impact.dmi
new file mode 100644
index 0000000000..1d798b5e9e
Binary files /dev/null and b/modular_citadel/icons/obj/projectiles_impact.dmi differ
diff --git a/modular_citadel/icons/obj/projectiles_muzzle.dmi b/modular_citadel/icons/obj/projectiles_muzzle.dmi
new file mode 100644
index 0000000000..2116b0559c
Binary files /dev/null and b/modular_citadel/icons/obj/projectiles_muzzle.dmi differ
diff --git a/modular_citadel/icons/obj/projectiles_tracer.dmi b/modular_citadel/icons/obj/projectiles_tracer.dmi
new file mode 100644
index 0000000000..e26e8501f1
Binary files /dev/null and b/modular_citadel/icons/obj/projectiles_tracer.dmi differ
diff --git a/code/citadel/icons/structures.dmi b/modular_citadel/icons/obj/structures.dmi
similarity index 100%
rename from code/citadel/icons/structures.dmi
rename to modular_citadel/icons/obj/structures.dmi
diff --git a/modular_citadel/icons/obj/vial.dmi b/modular_citadel/icons/obj/vial.dmi
new file mode 100644
index 0000000000..694cc1741b
Binary files /dev/null and b/modular_citadel/icons/obj/vial.dmi differ
diff --git a/modular_citadel/icons/ui/screen_clockwork.dmi b/modular_citadel/icons/ui/screen_clockwork.dmi
new file mode 100644
index 0000000000..499d2663b6
Binary files /dev/null and b/modular_citadel/icons/ui/screen_clockwork.dmi differ
diff --git a/modular_citadel/icons/ui/screen_gen.dmi b/modular_citadel/icons/ui/screen_gen.dmi
new file mode 100644
index 0000000000..d006185a3c
Binary files /dev/null and b/modular_citadel/icons/ui/screen_gen.dmi differ
diff --git a/modular_citadel/icons/ui/screen_midnight.dmi b/modular_citadel/icons/ui/screen_midnight.dmi
new file mode 100644
index 0000000000..38d96b86d1
Binary files /dev/null and b/modular_citadel/icons/ui/screen_midnight.dmi differ
diff --git a/modular_citadel/icons/ui/screen_operative.dmi b/modular_citadel/icons/ui/screen_operative.dmi
new file mode 100644
index 0000000000..7296db1f9c
Binary files /dev/null and b/modular_citadel/icons/ui/screen_operative.dmi differ
diff --git a/modular_citadel/icons/ui/screen_plasmafire.dmi b/modular_citadel/icons/ui/screen_plasmafire.dmi
new file mode 100644
index 0000000000..2829b22d59
Binary files /dev/null and b/modular_citadel/icons/ui/screen_plasmafire.dmi differ
diff --git a/modular_citadel/icons/ui/screen_slimecore.dmi b/modular_citadel/icons/ui/screen_slimecore.dmi
new file mode 100644
index 0000000000..0f24033da6
Binary files /dev/null and b/modular_citadel/icons/ui/screen_slimecore.dmi differ
diff --git a/modular_citadel/sound/misc/sprintactivate.ogg b/modular_citadel/sound/misc/sprintactivate.ogg
new file mode 100644
index 0000000000..f499765dc2
Binary files /dev/null and b/modular_citadel/sound/misc/sprintactivate.ogg differ
diff --git a/modular_citadel/sound/misc/sprintdeactivate.ogg b/modular_citadel/sound/misc/sprintdeactivate.ogg
new file mode 100644
index 0000000000..c22587ace0
Binary files /dev/null and b/modular_citadel/sound/misc/sprintdeactivate.ogg differ
diff --git a/modular_citadel/sound/misc/ui_toggle.ogg b/modular_citadel/sound/misc/ui_toggle.ogg
new file mode 100644
index 0000000000..7336b9cf0e
Binary files /dev/null and b/modular_citadel/sound/misc/ui_toggle.ogg differ
diff --git a/modular_citadel/sound/misc/ui_toggleoff.ogg b/modular_citadel/sound/misc/ui_toggleoff.ogg
new file mode 100644
index 0000000000..98df1726e9
Binary files /dev/null and b/modular_citadel/sound/misc/ui_toggleoff.ogg differ
diff --git a/modular_citadel/sound/weapons/LaserSlugv3.ogg b/modular_citadel/sound/weapons/LaserSlugv3.ogg
new file mode 100644
index 0000000000..dbb8f4b954
Binary files /dev/null and b/modular_citadel/sound/weapons/LaserSlugv3.ogg differ
diff --git a/modular_citadel/sound/weapons/ParticleBlaster.ogg b/modular_citadel/sound/weapons/ParticleBlaster.ogg
new file mode 100644
index 0000000000..ae0ae165f9
Binary files /dev/null and b/modular_citadel/sound/weapons/ParticleBlaster.ogg differ
diff --git a/modular_citadel/sound/weapons/laserPump.ogg b/modular_citadel/sound/weapons/laserPump.ogg
new file mode 100644
index 0000000000..4063765c5b
Binary files /dev/null and b/modular_citadel/sound/weapons/laserPump.ogg differ
diff --git a/modular_citadel/sound/weapons/laserPumpEmpty.ogg b/modular_citadel/sound/weapons/laserPumpEmpty.ogg
new file mode 100644
index 0000000000..ce82e2bd9d
Binary files /dev/null and b/modular_citadel/sound/weapons/laserPumpEmpty.ogg differ
diff --git a/sound/ambience/LICENSE.txt b/sound/ambience/LICENSE.txt
index d1d18306a6..5fb0ece74d 100644
--- a/sound/ambience/LICENSE.txt
+++ b/sound/ambience/LICENSE.txt
@@ -2,3 +2,5 @@ ambidet1.ogg is Fast Talking by Kevin Macleod. It has been licensed under the CC
It has been cropped for use ingame.
ambidet2.ogg is Night on the Docks, Piano by Kevin Macleod. It has been licensed under CC-BY 3.0 license.
It has been cropped for use ingame, and also fades in.
+aurora_caelus.ogg is Music for Manatees, by Kevin Macleod. It has been licensed under CC-BY 3.0 license.
+ It has been cropped for use ingame, and also fades out.
diff --git a/sound/ambience/aurora_caelus.ogg b/sound/ambience/aurora_caelus.ogg
new file mode 100644
index 0000000000..0c741678d5
Binary files /dev/null and b/sound/ambience/aurora_caelus.ogg differ
diff --git a/sound/items/hypospray.ogg b/sound/items/hypospray.ogg
new file mode 100644
index 0000000000..b70d3fd5b5
Binary files /dev/null and b/sound/items/hypospray.ogg differ
diff --git a/sound/items/hypospray2.ogg b/sound/items/hypospray2.ogg
new file mode 100644
index 0000000000..14835e9bb6
Binary files /dev/null and b/sound/items/hypospray2.ogg differ
diff --git a/sound/items/hypospray_long.ogg b/sound/items/hypospray_long.ogg
new file mode 100644
index 0000000000..d7da6c839f
Binary files /dev/null and b/sound/items/hypospray_long.ogg differ
diff --git a/strings/tips.txt b/strings/tips.txt
index 939110deb5..8f68853b42 100644
--- a/strings/tips.txt
+++ b/strings/tips.txt
@@ -31,7 +31,7 @@ As a Medical Doctor, you can surgically implant or extract things from people's
As a Medical Doctor, you must target the correct limb and be on help intent when trying to perform surgery on someone.
As a Chemist, there are dozens of chemicals that can heal, and even more that can cause harm. Experiment!
As a Chemist, some chemicals can only be synthesized by heating up the contents in the chemical heater.
-As a Geneticist, you can eject someone from cloning early by disabling power in genetics. Note that they will suffer more genetic damage from this.
+As a Geneticist, you can eject someone from cloning early by disabling power in genetics. Note that they will suffer more genetic damage and may lose vital organs from this.
As a Geneticist, becoming a hulk makes you capable of dealing high melee damage, stunlocking people, and punching through walls. However, you can't fire guns, will lose your hulk status if you take too much damage, and are not considered a human by the AI while you are a hulk.
As the Virologist, your viruses can range from healing powers so great that you can heal out of critical status, or diseases so dangerous they can kill the entire crew with airborne spontaneous combustion. Experiment!
As the Virologist, you only require small amounts of vaccine to heal a sick patient. Work with the Chemist to distribute your cures more efficiently.
@@ -122,7 +122,7 @@ As a Nuclear Operative, stick together! While your equipment is robust, your fel
As a Nuclear Operative, you might end up in a situation where the AI has bolted you into a room. Having some spare C4 in your pocket can save your life.
As a Monkey, you can crawl through air or scrubber vents by alt+left clicking them. You must drop everything you are wearing and holding to do this, however.
As a Monkey, you can still wear a few human items, such as backpacks, gas masks and hats, and still have two free hands.
-As the Malfunctioning AI, you can shunt to an APC if the situation gets bad. This can allow the clock to tick down long enough for you to win, but keep in mind the crew's pinpointer will point to you when you do this.
+As the Malfunctioning AI, you can shunt to an APC if the situation gets bad. This disables your doomsday device if it is active.
As the Malfunctioning AI, you should either order your cyborgs to dismantle the robotics console or blow it up yourself in order to protect them.
As the Malfunctioning AI, look into flooding the station with plasma fires to kill off large portions of the crew, letting you pick off the remaining few with space suits who escaped.
As an Alien, your melee prowess is unmatched, but your ranged abilities are sorely lacking. Make use of corners to force a melee confrontation!
@@ -155,8 +155,7 @@ As a Cultist, you can create an army of manifested goons using a combination of
As a Cultist or Servant, check the alert in the upper-right of your screen for all the details about your cult's current status and objective.
As a Servant, your jumpsuit functions like a chameleon suit and can take on a lot of different appearances. Use this for stealth and disguise!
As a Servant, you can unlock scripture tiers early by stockpiling large amounts of power.
-As a Servant, stargazers are a very important tool for power generation, and you should be making them constantly.
-As a Servant, stargazers only work if they can see space, and do *not* work on the City of Cogs.
+As a Servant, integration cogs are your primary source of power generation, and you should use as many as possible.
As a Servant, Abscond also brings anyone you're dragging to Reebe at the cost of some extra power.
As a Servant, wraith spectacles let you see everything through walls at virtually no drawback. Just take them off if someone might see you!
As a Servant, declaring war empowers a huge amount of your tools and constructs, and makes you into a spaceproof, armored clockwork automaton.
diff --git a/tgstation.dme b/tgstation.dme
index cae3e0521a..5f971c4690 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -92,6 +92,7 @@
#include "code\__DEFINES\vv.dm"
#include "code\__DEFINES\wall_dents.dm"
#include "code\__DEFINES\wires.dm"
+#include "code\__HELPERS\_cit_helpers.dm"
#include "code\__HELPERS\_lists.dm"
#include "code\__HELPERS\_logging.dm"
#include "code\__HELPERS\_string_lists.dm"
@@ -133,6 +134,7 @@
#include "code\_globalvars\genetics.dm"
#include "code\_globalvars\logging.dm"
#include "code\_globalvars\misc.dm"
+#include "code\_globalvars\regexes.dm"
#include "code\_globalvars\lists\flavor_misc.dm"
#include "code\_globalvars\lists\maintenance_loot.dm"
#include "code\_globalvars\lists\mapping.dm"
@@ -182,42 +184,6 @@
#include "code\_onclick\hud\robot.dm"
#include "code\_onclick\hud\screen_objects.dm"
#include "code\_onclick\hud\swarmer.dm"
-#include "code\citadel\_cit_helpers.dm"
-#include "code\citadel\cit_areas.dm"
-#include "code\citadel\cit_arousal.dm"
-#include "code\citadel\cit_clothes.dm"
-#include "code\citadel\cit_crewobjectives.dm"
-#include "code\citadel\cit_displaycases.dm"
-#include "code\citadel\cit_emotes.dm"
-#include "code\citadel\cit_guns.dm"
-#include "code\citadel\cit_kegs.dm"
-#include "code\citadel\cit_miscreants.dm"
-#include "code\citadel\cit_reagents.dm"
-#include "code\citadel\cit_spawners.dm"
-#include "code\citadel\cit_uniforms.dm"
-#include "code\citadel\cit_vendors.dm"
-#include "code\citadel\dogborgstuff.dm"
-#include "code\citadel\plasmacases.dm"
-#include "code\citadel\crew_objectives\cit_crewobjectives_cargo.dm"
-#include "code\citadel\crew_objectives\cit_crewobjectives_civilian.dm"
-#include "code\citadel\crew_objectives\cit_crewobjectives_command.dm"
-#include "code\citadel\crew_objectives\cit_crewobjectives_engineering.dm"
-#include "code\citadel\crew_objectives\cit_crewobjectives_medical.dm"
-#include "code\citadel\crew_objectives\cit_crewobjectives_science.dm"
-#include "code\citadel\crew_objectives\cit_crewobjectives_security.dm"
-#include "code\citadel\custom_loadout\custom_items.dm"
-#include "code\citadel\custom_loadout\load_to_mob.dm"
-#include "code\citadel\custom_loadout\read_from_file.dm"
-#include "code\citadel\organs\breasts.dm"
-#include "code\citadel\organs\eggsack.dm"
-#include "code\citadel\organs\genitals.dm"
-#include "code\citadel\organs\genitals_sprite_accessories.dm"
-#include "code\citadel\organs\ovipositor.dm"
-#include "code\citadel\organs\penis.dm"
-#include "code\citadel\organs\testicles.dm"
-#include "code\citadel\organs\vagina.dm"
-#include "code\citadel\organs\womb.dm"
-#include "code\citadel\toys\dildos.dm"
#include "code\controllers\admin.dm"
#include "code\controllers\configuration_citadel.dm"
#include "code\controllers\controller.dm"
@@ -257,6 +223,7 @@
#include "code\controllers\subsystem\medals.dm"
#include "code\controllers\subsystem\minimap.dm"
#include "code\controllers\subsystem\mobs.dm"
+#include "code\controllers\subsystem\moods.dm"
#include "code\controllers\subsystem\nightshift.dm"
#include "code\controllers\subsystem\npcpool.dm"
#include "code\controllers\subsystem\orbit.dm"
@@ -282,6 +249,7 @@
#include "code\controllers\subsystem\timer.dm"
#include "code\controllers\subsystem\title.dm"
#include "code\controllers\subsystem\traumas.dm"
+#include "code\controllers\subsystem\vore.dm"
#include "code\controllers\subsystem\vote.dm"
#include "code\controllers\subsystem\weather.dm"
#include "code\controllers\subsystem\processing\circuit.dm"
@@ -292,6 +260,7 @@
#include "code\controllers\subsystem\processing\obj.dm"
#include "code\controllers\subsystem\processing\processing.dm"
#include "code\controllers\subsystem\processing\projectiles.dm"
+#include "code\controllers\subsystem\processing\traits.dm"
#include "code\datums\action.dm"
#include "code\datums\ai_laws.dm"
#include "code\datums\armor.dm"
@@ -307,6 +276,7 @@
#include "code\datums\dog_fashion.dm"
#include "code\datums\embedding_behavior.dm"
#include "code\datums\emotes.dm"
+#include "code\datums\ert.dm"
#include "code\datums\explosion.dm"
#include "code\datums\forced_movement.dm"
#include "code\datums\holocall.dm"
@@ -347,12 +317,14 @@
#include "code\datums\components\caltrop.dm"
#include "code\datums\components\chasm.dm"
#include "code\datums\components\cleaning.dm"
+#include "code\datums\components\construction.dm"
#include "code\datums\components\decal.dm"
#include "code\datums\components\forensics.dm"
#include "code\datums\components\infective.dm"
#include "code\datums\components\jousting.dm"
#include "code\datums\components\knockoff.dm"
#include "code\datums\components\material_container.dm"
+#include "code\datums\components\mood.dm"
#include "code\datums\components\ntnet_interface.dm"
#include "code\datums\components\paintable.dm"
#include "code\datums\components\rad_insulation.dm"
@@ -398,7 +370,6 @@
#include "code\datums\diseases\advance\symptoms\fever.dm"
#include "code\datums\diseases\advance\symptoms\fire.dm"
#include "code\datums\diseases\advance\symptoms\flesh_eating.dm"
-#include "code\datums\diseases\advance\symptoms\genetics.dm"
#include "code\datums\diseases\advance\symptoms\hallucigen.dm"
#include "code\datums\diseases\advance\symptoms\headache.dm"
#include "code\datums\diseases\advance\symptoms\heal.dm"
@@ -418,7 +389,6 @@
#include "code\datums\diseases\advance\symptoms\vomit.dm"
#include "code\datums\diseases\advance\symptoms\weight.dm"
#include "code\datums\diseases\advance\symptoms\youth.dm"
-#include "code\datums\helper_datums\construction_datum.dm"
#include "code\datums\helper_datums\events.dm"
#include "code\datums\helper_datums\getrev.dm"
#include "code\datums\helper_datums\icon_snapshot.dm"
@@ -431,10 +401,16 @@
#include "code\datums\martial\boxing.dm"
#include "code\datums\martial\cqc.dm"
#include "code\datums\martial\krav_maga.dm"
+#include "code\datums\martial\mushpunch.dm"
#include "code\datums\martial\plasma_fist.dm"
#include "code\datums\martial\psychotic_brawl.dm"
#include "code\datums\martial\sleeping_carp.dm"
#include "code\datums\martial\wrestling.dm"
+#include "code\datums\mood_events\drug_events.dm"
+#include "code\datums\mood_events\generic_negative_events.dm"
+#include "code\datums\mood_events\generic_positive_events.dm"
+#include "code\datums\mood_events\mood_event.dm"
+#include "code\datums\mood_events\needs_events.dm"
#include "code\datums\mutations\body.dm"
#include "code\datums\mutations\chameleon.dm"
#include "code\datums\mutations\cold_resistance.dm"
@@ -449,6 +425,10 @@
#include "code\datums\status_effects\gas.dm"
#include "code\datums\status_effects\neutral.dm"
#include "code\datums\status_effects\status_effect.dm"
+#include "code\datums\traits\_trait.dm"
+#include "code\datums\traits\good.dm"
+#include "code\datums\traits\negative.dm"
+#include "code\datums\traits\neutral.dm"
#include "code\datums\weather\weather.dm"
#include "code\datums\weather\weather_types\acid_rain.dm"
#include "code\datums\weather\weather_types\advanced_darkness.dm"
@@ -469,7 +449,6 @@
#include "code\datums\wires\robot.dm"
#include "code\datums\wires\suit_storage_unit.dm"
#include "code\datums\wires\syndicatebomb.dm"
-#include "code\datums\wires\tesla_coil.dm"
#include "code\datums\wires\vending.dm"
#include "code\datums\wires\wires.dm"
#include "code\game\alternate_appearance.dm"
@@ -537,6 +516,7 @@
#include "code\game\machinery\dna_scanner.dm"
#include "code\game\machinery\doppler_array.dm"
#include "code\game\machinery\droneDispenser.dm"
+#include "code\game\machinery\exp_cloner.dm"
#include "code\game\machinery\firealarm.dm"
#include "code\game\machinery\flasher.dm"
#include "code\game\machinery\gulag_item_reclaimer.dm"
@@ -798,8 +778,10 @@
#include "code\game\objects\items\circuitboards\computer_circuitboards.dm"
#include "code\game\objects\items\circuitboards\machine_circuitboards.dm"
#include "code\game\objects\items\devices\aicard.dm"
+#include "code\game\objects\items\devices\beacon.dm"
#include "code\game\objects\items\devices\camera_bug.dm"
#include "code\game\objects\items\devices\chameleonproj.dm"
+#include "code\game\objects\items\devices\dogborg_sleeper.dm"
#include "code\game\objects\items\devices\doorCharge.dm"
#include "code\game\objects\items\devices\electroadaptive_pseudocircuit.dm"
#include "code\game\objects\items\devices\flashlight.dm"
@@ -826,7 +808,6 @@
#include "code\game\objects\items\devices\PDA\PDA_types.dm"
#include "code\game\objects\items\devices\PDA\radio.dm"
#include "code\game\objects\items\devices\PDA\virus_cart.dm"
-#include "code\game\objects\items\devices\radio\beacon.dm"
#include "code\game\objects\items\devices\radio\electropack.dm"
#include "code\game\objects\items\devices\radio\encryptionkey.dm"
#include "code\game\objects\items\devices\radio\headset.dm"
@@ -852,6 +833,7 @@
#include "code\game\objects\items\implants\implant_krav_maga.dm"
#include "code\game\objects\items\implants\implant_loyality.dm"
#include "code\game\objects\items\implants\implant_misc.dm"
+#include "code\game\objects\items\implants\implant_spell.dm"
#include "code\game\objects\items\implants\implant_storage.dm"
#include "code\game\objects\items\implants\implant_track.dm"
#include "code\game\objects\items\implants\implantcase.dm"
@@ -1047,6 +1029,7 @@
#include "code\modules\admin\ipintel.dm"
#include "code\modules\admin\IsBanned.dm"
#include "code\modules\admin\NewBan.dm"
+#include "code\modules\admin\permissionedit.dm"
#include "code\modules\admin\player_panel.dm"
#include "code\modules\admin\secrets.dm"
#include "code\modules\admin\sound_emitter.dm"
@@ -1055,7 +1038,6 @@
#include "code\modules\admin\topic.dm"
#include "code\modules\admin\whitelist.dm"
#include "code\modules\admin\DB_ban\functions.dm"
-#include "code\modules\admin\permissionverbs\permissionedit.dm"
#include "code\modules\admin\verbs\adminhelp.dm"
#include "code\modules\admin\verbs\adminjump.dm"
#include "code\modules\admin\verbs\adminpm.dm"
@@ -1087,6 +1069,7 @@
#include "code\modules\admin\verbs\pray.dm"
#include "code\modules\admin\verbs\randomverbs.dm"
#include "code\modules\admin\verbs\reestablish_db_connection.dm"
+#include "code\modules\admin\verbs\spawnobjasmob.dm"
#include "code\modules\admin\verbs\tripAI.dm"
#include "code\modules\admin\verbs\SDQL2\SDQL_2.dm"
#include "code\modules\admin\verbs\SDQL2\SDQL_2_parser.dm"
@@ -1213,6 +1196,11 @@
#include "code\modules\antagonists\devil\sintouched\objectives.dm"
#include "code\modules\antagonists\devil\true_devil\_true_devil.dm"
#include "code\modules\antagonists\devil\true_devil\inventory.dm"
+#include "code\modules\antagonists\disease\disease_abilities.dm"
+#include "code\modules\antagonists\disease\disease_datum.dm"
+#include "code\modules\antagonists\disease\disease_disease.dm"
+#include "code\modules\antagonists\disease\disease_event.dm"
+#include "code\modules\antagonists\disease\disease_mob.dm"
#include "code\modules\antagonists\ert\ert.dm"
#include "code\modules\antagonists\greentext\greentext.dm"
#include "code\modules\antagonists\highlander\highlander.dm"
@@ -1456,6 +1444,7 @@
#include "code\modules\events\anomaly_grav.dm"
#include "code\modules\events\anomaly_pyro.dm"
#include "code\modules\events\anomaly_vortex.dm"
+#include "code\modules\events\aurora_caelus.dm"
#include "code\modules\events\blob.dm"
#include "code\modules\events\brand_intelligence.dm"
#include "code\modules\events\camerafailure.dm"
@@ -1516,7 +1505,6 @@
#include "code\modules\fields\turf_objects.dm"
#include "code\modules\flufftext\Dreaming.dm"
#include "code\modules\flufftext\Hallucination.dm"
-#include "code\modules\flufftext\TextFilters.dm"
#include "code\modules\food_and_drinks\food.dm"
#include "code\modules\food_and_drinks\pizzabox.dm"
#include "code\modules\food_and_drinks\drinks\drinks.dm"
@@ -1640,6 +1628,7 @@
#include "code\modules\integrated_electronics\core\special_pins\string_pin.dm"
#include "code\modules\integrated_electronics\passive\passive.dm"
#include "code\modules\integrated_electronics\passive\power.dm"
+#include "code\modules\integrated_electronics\subtypes\access.dm"
#include "code\modules\integrated_electronics\subtypes\arithmetic.dm"
#include "code\modules\integrated_electronics\subtypes\converters.dm"
#include "code\modules\integrated_electronics\subtypes\data_transfer.dm"
@@ -1690,6 +1679,7 @@
#include "code\modules\language\language_menu.dm"
#include "code\modules\language\machine.dm"
#include "code\modules\language\monkey.dm"
+#include "code\modules\language\mushroom.dm"
#include "code\modules\language\narsian.dm"
#include "code\modules\language\ratvarian.dm"
#include "code\modules\language\slime.dm"
@@ -1881,6 +1871,7 @@
#include "code\modules\mob\living\carbon\human\species_types\jellypeople.dm"
#include "code\modules\mob\living\carbon\human\species_types\lizardpeople.dm"
#include "code\modules\mob\living\carbon\human\species_types\mothmen.dm"
+#include "code\modules\mob\living\carbon\human\species_types\mushpeople.dm"
#include "code\modules\mob\living\carbon\human\species_types\plasmamen.dm"
#include "code\modules\mob\living\carbon\human\species_types\podpeople.dm"
#include "code\modules\mob\living\carbon\human\species_types\shadowpeople.dm"
@@ -2192,29 +2183,57 @@
#include "code\modules\procedural_mapping\mapGenerators\repair.dm"
#include "code\modules\procedural_mapping\mapGenerators\shuttle.dm"
#include "code\modules\procedural_mapping\mapGenerators\syndicate.dm"
-#include "code\modules\projectiles\ammunition.dm"
-#include "code\modules\projectiles\box_magazine.dm"
-#include "code\modules\projectiles\firing.dm"
#include "code\modules\projectiles\gun.dm"
#include "code\modules\projectiles\pins.dm"
#include "code\modules\projectiles\projectile.dm"
-#include "code\modules\projectiles\ammunition\ammo_casings.dm"
-#include "code\modules\projectiles\ammunition\caseless.dm"
-#include "code\modules\projectiles\ammunition\energy.dm"
-#include "code\modules\projectiles\ammunition\plasma.dm"
-#include "code\modules\projectiles\ammunition\special.dm"
+#include "code\modules\projectiles\ammunition\_ammunition.dm"
+#include "code\modules\projectiles\ammunition\_firing.dm"
+#include "code\modules\projectiles\ammunition\ballistic\lmg.dm"
+#include "code\modules\projectiles\ammunition\ballistic\pistol.dm"
+#include "code\modules\projectiles\ammunition\ballistic\revolver.dm"
+#include "code\modules\projectiles\ammunition\ballistic\rifle.dm"
+#include "code\modules\projectiles\ammunition\ballistic\shotgun.dm"
+#include "code\modules\projectiles\ammunition\ballistic\smg.dm"
+#include "code\modules\projectiles\ammunition\ballistic\sniper.dm"
+#include "code\modules\projectiles\ammunition\caseless\_caseless.dm"
+#include "code\modules\projectiles\ammunition\caseless\foam.dm"
+#include "code\modules\projectiles\ammunition\caseless\misc.dm"
+#include "code\modules\projectiles\ammunition\caseless\rocket.dm"
+#include "code\modules\projectiles\ammunition\energy\_energy.dm"
+#include "code\modules\projectiles\ammunition\energy\chameleon.dm"
+#include "code\modules\projectiles\ammunition\energy\ebow.dm"
+#include "code\modules\projectiles\ammunition\energy\gravity.dm"
+#include "code\modules\projectiles\ammunition\energy\laser.dm"
+#include "code\modules\projectiles\ammunition\energy\lmg.dm"
+#include "code\modules\projectiles\ammunition\energy\plasma.dm"
+#include "code\modules\projectiles\ammunition\energy\plasma_cit.dm"
+#include "code\modules\projectiles\ammunition\energy\portal.dm"
+#include "code\modules\projectiles\ammunition\energy\special.dm"
+#include "code\modules\projectiles\ammunition\energy\stun.dm"
+#include "code\modules\projectiles\ammunition\special\magic.dm"
+#include "code\modules\projectiles\ammunition\special\syringe.dm"
+#include "code\modules\projectiles\boxes_magazines\_box_magazine.dm"
#include "code\modules\projectiles\boxes_magazines\ammo_boxes.dm"
-#include "code\modules\projectiles\boxes_magazines\external_mag.dm"
-#include "code\modules\projectiles\boxes_magazines\internal_mag.dm"
+#include "code\modules\projectiles\boxes_magazines\external\grenade.dm"
+#include "code\modules\projectiles\boxes_magazines\external\lmg.dm"
+#include "code\modules\projectiles\boxes_magazines\external\pistol.dm"
+#include "code\modules\projectiles\boxes_magazines\external\rechargable.dm"
+#include "code\modules\projectiles\boxes_magazines\external\rifle.dm"
+#include "code\modules\projectiles\boxes_magazines\external\shotgun.dm"
+#include "code\modules\projectiles\boxes_magazines\external\smg.dm"
+#include "code\modules\projectiles\boxes_magazines\external\sniper.dm"
+#include "code\modules\projectiles\boxes_magazines\external\toy.dm"
+#include "code\modules\projectiles\boxes_magazines\internal\_cylinder.dm"
+#include "code\modules\projectiles\boxes_magazines\internal\_internal.dm"
+#include "code\modules\projectiles\boxes_magazines\internal\grenade.dm"
+#include "code\modules\projectiles\boxes_magazines\internal\misc.dm"
+#include "code\modules\projectiles\boxes_magazines\internal\revolver.dm"
+#include "code\modules\projectiles\boxes_magazines\internal\rifle.dm"
+#include "code\modules\projectiles\boxes_magazines\internal\shotgun.dm"
+#include "code\modules\projectiles\boxes_magazines\internal\toy.dm"
#include "code\modules\projectiles\guns\ballistic.dm"
-#include "code\modules\projectiles\guns\beam_rifle.dm"
-#include "code\modules\projectiles\guns\chem_gun.dm"
#include "code\modules\projectiles\guns\energy.dm"
-#include "code\modules\projectiles\guns\grenade_launcher.dm"
#include "code\modules\projectiles\guns\magic.dm"
-#include "code\modules\projectiles\guns\medbeam.dm"
-#include "code\modules\projectiles\guns\mounted.dm"
-#include "code\modules\projectiles\guns\syringe_gun.dm"
#include "code\modules\projectiles\guns\ballistic\automatic.dm"
#include "code\modules\projectiles\guns\ballistic\laser_gatling.dm"
#include "code\modules\projectiles\guns\ballistic\launchers.dm"
@@ -2226,21 +2245,58 @@
#include "code\modules\projectiles\guns\energy\kinetic_accelerator.dm"
#include "code\modules\projectiles\guns\energy\laser.dm"
#include "code\modules\projectiles\guns\energy\megabuster.dm"
-#include "code\modules\projectiles\guns\energy\plasma.dm"
+#include "code\modules\projectiles\guns\energy\mounted.dm"
+#include "code\modules\projectiles\guns\energy\plasma_cit.dm"
#include "code\modules\projectiles\guns\energy\pulse.dm"
#include "code\modules\projectiles\guns\energy\special.dm"
#include "code\modules\projectiles\guns\energy\stun.dm"
#include "code\modules\projectiles\guns\magic\staff.dm"
#include "code\modules\projectiles\guns\magic\wand.dm"
+#include "code\modules\projectiles\guns\misc\beam_rifle.dm"
#include "code\modules\projectiles\guns\misc\blastcannon.dm"
+#include "code\modules\projectiles\guns\misc\chem_gun.dm"
+#include "code\modules\projectiles\guns\misc\grenade_launcher.dm"
+#include "code\modules\projectiles\guns\misc\medbeam.dm"
+#include "code\modules\projectiles\guns\misc\syringe_gun.dm"
#include "code\modules\projectiles\projectile\beams.dm"
#include "code\modules\projectiles\projectile\bullets.dm"
-#include "code\modules\projectiles\projectile\energy.dm"
#include "code\modules\projectiles\projectile\magic.dm"
#include "code\modules\projectiles\projectile\megabuster.dm"
#include "code\modules\projectiles\projectile\plasma.dm"
-#include "code\modules\projectiles\projectile\reusable.dm"
-#include "code\modules\projectiles\projectile\special.dm"
+#include "code\modules\projectiles\projectile\bullets\_incendiary.dm"
+#include "code\modules\projectiles\projectile\bullets\dart_syringe.dm"
+#include "code\modules\projectiles\projectile\bullets\dnainjector.dm"
+#include "code\modules\projectiles\projectile\bullets\grenade.dm"
+#include "code\modules\projectiles\projectile\bullets\lmg.dm"
+#include "code\modules\projectiles\projectile\bullets\pistol.dm"
+#include "code\modules\projectiles\projectile\bullets\revolver.dm"
+#include "code\modules\projectiles\projectile\bullets\rifle.dm"
+#include "code\modules\projectiles\projectile\bullets\shotgun.dm"
+#include "code\modules\projectiles\projectile\bullets\smg.dm"
+#include "code\modules\projectiles\projectile\bullets\sniper.dm"
+#include "code\modules\projectiles\projectile\bullets\special.dm"
+#include "code\modules\projectiles\projectile\energy\_energy.dm"
+#include "code\modules\projectiles\projectile\energy\chameleon.dm"
+#include "code\modules\projectiles\projectile\energy\ebow.dm"
+#include "code\modules\projectiles\projectile\energy\misc.dm"
+#include "code\modules\projectiles\projectile\energy\net_snare.dm"
+#include "code\modules\projectiles\projectile\energy\stun.dm"
+#include "code\modules\projectiles\projectile\energy\tesla.dm"
+#include "code\modules\projectiles\projectile\reusable\_reusable.dm"
+#include "code\modules\projectiles\projectile\reusable\foam_dart.dm"
+#include "code\modules\projectiles\projectile\reusable\magspear.dm"
+#include "code\modules\projectiles\projectile\special\curse.dm"
+#include "code\modules\projectiles\projectile\special\floral.dm"
+#include "code\modules\projectiles\projectile\special\gravity.dm"
+#include "code\modules\projectiles\projectile\special\hallucination.dm"
+#include "code\modules\projectiles\projectile\special\ion.dm"
+#include "code\modules\projectiles\projectile\special\meteor.dm"
+#include "code\modules\projectiles\projectile\special\mindflayer.dm"
+#include "code\modules\projectiles\projectile\special\neurotoxin.dm"
+#include "code\modules\projectiles\projectile\special\plasma.dm"
+#include "code\modules\projectiles\projectile\special\rocket.dm"
+#include "code\modules\projectiles\projectile\special\temperature.dm"
+#include "code\modules\projectiles\projectile\special\wormhole.dm"
#include "code\modules\reagents\chem_splash.dm"
#include "code\modules\reagents\reagent_containers.dm"
#include "code\modules\reagents\reagent_dispenser.dm"
@@ -2276,6 +2332,7 @@
#include "code\modules\reagents\reagent_containers\dropper.dm"
#include "code\modules\reagents\reagent_containers\glass.dm"
#include "code\modules\reagents\reagent_containers\hypospray.dm"
+#include "code\modules\reagents\reagent_containers\medspray.dm"
#include "code\modules\reagents\reagent_containers\patch.dm"
#include "code\modules\reagents\reagent_containers\pill.dm"
#include "code\modules\reagents\reagent_containers\spray.dm"
@@ -2289,13 +2346,9 @@
#include "code\modules\recycling\disposal\outlet.dm"
#include "code\modules\recycling\disposal\pipe.dm"
#include "code\modules\recycling\disposal\pipe_sorting.dm"
-#include "code\modules\research\circuitprinter.dm"
-#include "code\modules\research\departmental_circuit_imprinter.dm"
-#include "code\modules\research\departmental_lathe.dm"
#include "code\modules\research\designs.dm"
#include "code\modules\research\destructive_analyzer.dm"
#include "code\modules\research\experimentor.dm"
-#include "code\modules\research\protolathe.dm"
#include "code\modules\research\rdconsole.dm"
#include "code\modules\research\rdmachines.dm"
#include "code\modules\research\research_disk.dm"
@@ -2321,6 +2374,13 @@
#include "code\modules\research\designs\stock_parts_designs.dm"
#include "code\modules\research\designs\telecomms_designs.dm"
#include "code\modules\research\designs\weapon_designs.dm"
+#include "code\modules\research\machinery\_production.dm"
+#include "code\modules\research\machinery\circuit_imprinter.dm"
+#include "code\modules\research\machinery\departmental_circuit_imprinter.dm"
+#include "code\modules\research\machinery\departmental_protolathe.dm"
+#include "code\modules\research\machinery\departmental_techfab.dm"
+#include "code\modules\research\machinery\protolathe.dm"
+#include "code\modules\research\machinery\techfab.dm"
#include "code\modules\research\techweb\__techweb_helpers.dm"
#include "code\modules\research\techweb\_techweb.dm"
#include "code\modules\research\techweb\_techweb_node.dm"
@@ -2337,6 +2397,7 @@
#include "code\modules\ruins\spaceruin_code\asteroid4.dm"
#include "code\modules\ruins\spaceruin_code\bigderelict1.dm"
#include "code\modules\ruins\spaceruin_code\caravanambush.dm"
+#include "code\modules\ruins\spaceruin_code\cloning_lab.dm"
#include "code\modules\ruins\spaceruin_code\crashedclownship.dm"
#include "code\modules\ruins\spaceruin_code\crashedship.dm"
#include "code\modules\ruins\spaceruin_code\deepstorage.dm"
@@ -2508,15 +2569,6 @@
#include "code\modules\vehicles\speedbike.dm"
#include "code\modules\vehicles\vehicle_actions.dm"
#include "code\modules\vehicles\vehicle_key.dm"
-#include "code\modules\vore\hook-defs_vr.dm"
-#include "code\modules\vore\trycatch_vr.dm"
-#include "code\modules\vore\eating\belly_vr.dm"
-#include "code\modules\vore\eating\bellymodes_vr.dm"
-#include "code\modules\vore\eating\living_vr.dm"
-#include "code\modules\vore\eating\simple_animal_vr.dm"
-#include "code\modules\vore\eating\vore_vr.dm"
-#include "code\modules\vore\eating\voreitems.dm"
-#include "code\modules\vore\eating\vorepanel_vr.dm"
#include "code\modules\VR\vr_human.dm"
#include "code\modules\VR\vr_sleeper.dm"
#include "code\modules\zombie\items.dm"
@@ -2533,26 +2585,42 @@
#include "modular_citadel\hopefully_temporary_patches.dm"
#include "modular_citadel\simplemob_vore_values.dm"
#include "modular_citadel\code\init.dm"
+#include "modular_citadel\code\__HELPERS\list2list.dm"
#include "modular_citadel\code\__HELPERS\lists.dm"
#include "modular_citadel\code\__HELPERS\mobs.dm"
#include "modular_citadel\code\_globalvars\lists\mobs.dm"
+#include "modular_citadel\code\_onclick\click.dm"
+#include "modular_citadel\code\_onclick\item_attack.dm"
+#include "modular_citadel\code\_onclick\other_mobs.dm"
+#include "modular_citadel\code\_onclick\hud\screen_objects.dm"
+#include "modular_citadel\code\_onclick\hud\stamina.dm"
#include "modular_citadel\code\controllers\configuration\entries\general.dm"
#include "modular_citadel\code\controllers\subsystem\job.dm"
#include "modular_citadel\code\controllers\subsystem\research.dm"
#include "modular_citadel\code\controllers\subsystem\shuttle.dm"
#include "modular_citadel\code\datums\uplink_items_cit.dm"
#include "modular_citadel\code\datums\mutations\hulk.dm"
+#include "modular_citadel\code\datums\status_effects\debuffs.dm"
+#include "modular_citadel\code\datums\traits\neutral.dm"
#include "modular_citadel\code\datums\wires\airlock.dm"
#include "modular_citadel\code\datums\wires\autoylathe.dm"
+#include "modular_citadel\code\game\area\cit_areas.dm"
#include "modular_citadel\code\game\gamemodes\miniantags\bot_swarm\swarmer_event.dm"
#include "modular_citadel\code\game\gamemodes\revolution\revolution.dm"
#include "modular_citadel\code\game\machinery\cryopod.dm"
+#include "modular_citadel\code\game\machinery\displaycases.dm"
+#include "modular_citadel\code\game\machinery\firealarm.dm"
#include "modular_citadel\code\game\machinery\Sleeper.dm"
#include "modular_citadel\code\game\machinery\toylathe.dm"
#include "modular_citadel\code\game\machinery\vending.dm"
#include "modular_citadel\code\game\machinery\computer\card.dm"
#include "modular_citadel\code\game\objects\ids.dm"
+#include "modular_citadel\code\game\objects\items.dm"
#include "modular_citadel\code\game\objects\tools.dm"
+#include "modular_citadel\code\game\objects\effects\spawner\spawners.dm"
+#include "modular_citadel\code\game\objects\effects\temporary_visuals\projectiles\impact.dm"
+#include "modular_citadel\code\game\objects\effects\temporary_visuals\projectiles\muzzle.dm"
+#include "modular_citadel\code\game\objects\effects\temporary_visuals\projectiles\tracer.dm"
#include "modular_citadel\code\game\objects\items\handcuffs.dm"
#include "modular_citadel\code\game\objects\items\holy_weapons.dm"
#include "modular_citadel\code\game\objects\items\stunsword.dm"
@@ -2564,6 +2632,7 @@
#include "modular_citadel\code\game\objects\items\devices\radio\headset.dm"
#include "modular_citadel\code\game\objects\items\devices\radio\shockcollar.dm"
#include "modular_citadel\code\game\objects\items\melee\eutactic_blades.dm"
+#include "modular_citadel\code\game\objects\structures\beds_chairs\chair.dm"
#include "modular_citadel\code\game\objects\structures\beds_chairs\sofa.dm"
#include "modular_citadel\code\game\objects\structures\crates_lockers\closets\fitness.dm"
#include "modular_citadel\code\game\objects\structures\crates_lockers\closets\wardrobe.dm"
@@ -2572,12 +2641,33 @@
#include "modular_citadel\code\modules\admin\holder2.dm"
#include "modular_citadel\code\modules\admin\secrets.dm"
#include "modular_citadel\code\modules\admin\topic.dm"
+#include "modular_citadel\code\modules\antagonists\cit_crewobjectives.dm"
+#include "modular_citadel\code\modules\antagonists\cit_miscreants.dm"
+#include "modular_citadel\code\modules\antagonists\crew_objectives\cit_crewobjectives_cargo.dm"
+#include "modular_citadel\code\modules\antagonists\crew_objectives\cit_crewobjectives_civilian.dm"
+#include "modular_citadel\code\modules\antagonists\crew_objectives\cit_crewobjectives_command.dm"
+#include "modular_citadel\code\modules\antagonists\crew_objectives\cit_crewobjectives_engineering.dm"
+#include "modular_citadel\code\modules\antagonists\crew_objectives\cit_crewobjectives_medical.dm"
+#include "modular_citadel\code\modules\antagonists\crew_objectives\cit_crewobjectives_science.dm"
+#include "modular_citadel\code\modules\antagonists\crew_objectives\cit_crewobjectives_security.dm"
+#include "modular_citadel\code\modules\arousal\arousal.dm"
+#include "modular_citadel\code\modules\arousal\organs\breasts.dm"
+#include "modular_citadel\code\modules\arousal\organs\eggsack.dm"
+#include "modular_citadel\code\modules\arousal\organs\genitals.dm"
+#include "modular_citadel\code\modules\arousal\organs\genitals_sprite_accessories.dm"
+#include "modular_citadel\code\modules\arousal\organs\ovipositor.dm"
+#include "modular_citadel\code\modules\arousal\organs\penis.dm"
+#include "modular_citadel\code\modules\arousal\organs\testicles.dm"
+#include "modular_citadel\code\modules\arousal\organs\vagina.dm"
+#include "modular_citadel\code\modules\arousal\organs\womb.dm"
+#include "modular_citadel\code\modules\arousal\toys\dildos.dm"
#include "modular_citadel\code\modules\cargo\console.dm"
#include "modular_citadel\code\modules\cargo\packs.dm"
#include "modular_citadel\code\modules\client\client_defines.dm"
#include "modular_citadel\code\modules\client\client_procs.dm"
#include "modular_citadel\code\modules\client\preferences.dm"
#include "modular_citadel\code\modules\client\preferences_savefile.dm"
+#include "modular_citadel\code\modules\client\preferences_toggles.dm"
#include "modular_citadel\code\modules\client\loadout\__donator.dm"
#include "modular_citadel\code\modules\client\loadout\_medical.dm"
#include "modular_citadel\code\modules\client\loadout\_security.dm"
@@ -2593,16 +2683,27 @@
#include "modular_citadel\code\modules\client\loadout\shoes.dm"
#include "modular_citadel\code\modules\client\loadout\suit.dm"
#include "modular_citadel\code\modules\client\loadout\uniform.dm"
+#include "modular_citadel\code\modules\client\loadout\uniform_trek.dm"
#include "modular_citadel\code\modules\client\verbs\who.dm"
-#include "modular_citadel\code\modules\clothing\under.dm"
#include "modular_citadel\code\modules\clothing\spacesuits\flightsuit.dm"
+#include "modular_citadel\code\modules\clothing\suits\suits.dm"
#include "modular_citadel\code\modules\clothing\under\polychromic_clothes.dm"
+#include "modular_citadel\code\modules\clothing\under\trek_under.dm"
#include "modular_citadel\code\modules\clothing\under\turtlenecks.dm"
+#include "modular_citadel\code\modules\clothing\under\under.dm"
#include "modular_citadel\code\modules\crafting\recipes.dm"
+#include "modular_citadel\code\modules\custom_loadout\custom_items.dm"
+#include "modular_citadel\code\modules\custom_loadout\load_to_mob.dm"
+#include "modular_citadel\code\modules\custom_loadout\read_from_file.dm"
+#include "modular_citadel\code\modules\events\blob.dm"
+#include "modular_citadel\code\modules\food_and_drinks\snacks\meat.dm"
#include "modular_citadel\code\modules\jobs\jobs.dm"
#include "modular_citadel\code\modules\jobs\job_types\captain.dm"
#include "modular_citadel\code\modules\jobs\job_types\cargo_service.dm"
#include "modular_citadel\code\modules\jobs\job_types\engineering.dm"
+#include "modular_citadel\code\modules\jobs\job_types\security.dm"
+#include "modular_citadel\code\modules\keybindings\bindings_carbon.dm"
+#include "modular_citadel\code\modules\keybindings\bindings_human.dm"
#include "modular_citadel\code\modules\mentor\follow.dm"
#include "modular_citadel\code\modules\mentor\mentor.dm"
#include "modular_citadel\code\modules\mentor\mentor_memo.dm"
@@ -2611,19 +2712,58 @@
#include "modular_citadel\code\modules\mentor\mentorpm.dm"
#include "modular_citadel\code\modules\mentor\mentorsay.dm"
#include "modular_citadel\code\modules\mining\mine_items.dm"
+#include "modular_citadel\code\modules\mob\cit_emotes.dm"
+#include "modular_citadel\code\modules\mob\mob.dm"
+#include "modular_citadel\code\modules\mob\living\damage_procs.dm"
+#include "modular_citadel\code\modules\mob\living\living.dm"
+#include "modular_citadel\code\modules\mob\living\carbon\carbon.dm"
+#include "modular_citadel\code\modules\mob\living\carbon\damage_procs.dm"
+#include "modular_citadel\code\modules\mob\living\carbon\human\human.dm"
#include "modular_citadel\code\modules\mob\living\carbon\human\human_defense.dm"
+#include "modular_citadel\code\modules\mob\living\carbon\human\human_movement.dm"
#include "modular_citadel\code\modules\mob\living\carbon\human\life.dm"
+#include "modular_citadel\code\modules\mob\living\carbon\human\species.dm"
#include "modular_citadel\code\modules\mob\living\carbon\human\species_types\jellypeople.dm"
+#include "modular_citadel\code\modules\mob\living\silicon\robot\dogborg_equipment.dm"
+#include "modular_citadel\code\modules\mob\living\silicon\robot\robot.dm"
#include "modular_citadel\code\modules\mob\living\silicon\robot\robot_modules.dm"
#include "modular_citadel\code\modules\mob\living\simple_animal\banana_spider.dm"
#include "modular_citadel\code\modules\mob\living\simple_animal\kiwi.dm"
#include "modular_citadel\code\modules\power\lighting.dm"
+#include "modular_citadel\code\modules\projectiles\gun.dm"
+#include "modular_citadel\code\modules\projectiles\guns\pumpenergy.dm"
+#include "modular_citadel\code\modules\projectiles\guns\toys.dm"
+#include "modular_citadel\code\modules\projectiles\guns\ballistic\flechette.dm"
+#include "modular_citadel\code\modules\projectiles\guns\ballistic\handguns.dm"
+#include "modular_citadel\code\modules\projectiles\guns\ballistic\magweapon.dm"
#include "modular_citadel\code\modules\projectiles\guns\ballistic\revolver.dm"
+#include "modular_citadel\code\modules\projectiles\guns\ballistic\rifles.dm"
+#include "modular_citadel\code\modules\projectiles\guns\ballistic\spinfusor.dm"
#include "modular_citadel\code\modules\projectiles\guns\energy\energy_gun.dm"
+#include "modular_citadel\code\modules\projectiles\guns\energy\laser.dm"
+#include "modular_citadel\code\modules\projectiles\projectile\energy.dm"
+#include "modular_citadel\code\modules\reagents\chemistry\reagents\other_reagents.dm"
+#include "modular_citadel\code\modules\reagents\reagent container\cit_kegs.dm"
+#include "modular_citadel\code\modules\reagents\reagent container\hypospraymkii.dm"
+#include "modular_citadel\code\modules\reagents\reagent container\hypovial.dm"
+#include "modular_citadel\code\modules\reagents\reagents\cit_reagents.dm"
+#include "modular_citadel\code\modules\recycling\disposal\bin.dm"
#include "modular_citadel\code\modules\research\designs\autoylathe_designs.dm"
#include "modular_citadel\code\modules\research\designs\machine_designs.dm"
#include "modular_citadel\code\modules\research\techweb\_techweb.dm"
#include "modular_citadel\code\modules\research\techweb\all_nodes.dm"
#include "modular_citadel\code\modules\uplink\uplink_items.dm"
+#include "modular_citadel\code\modules\vore\hook-defs_vr.dm"
+#include "modular_citadel\code\modules\vore\persistence.dm"
+#include "modular_citadel\code\modules\vore\trycatch_vr.dm"
+#include "modular_citadel\code\modules\vore\eating\belly_dat_vr.dm"
+#include "modular_citadel\code\modules\vore\eating\belly_obj_vr.dm"
+#include "modular_citadel\code\modules\vore\eating\bellymodes_vr.dm"
+#include "modular_citadel\code\modules\vore\eating\digest_act_vr.dm"
+#include "modular_citadel\code\modules\vore\eating\living_vr.dm"
+#include "modular_citadel\code\modules\vore\eating\simple_animal_vr.dm"
+#include "modular_citadel\code\modules\vore\eating\vore_vr.dm"
+#include "modular_citadel\code\modules\vore\eating\voreitems.dm"
+#include "modular_citadel\code\modules\vore\eating\vorepanel_vr.dm"
#include "modular_citadel\interface\skin.dmf"
// END_INCLUDE
diff --git a/tgui/assets/tgui.js b/tgui/assets/tgui.js
index e84cebf112..6e2f1133f2 100644
--- a/tgui/assets/tgui.js
+++ b/tgui/assets/tgui.js
@@ -7,12 +7,12 @@ return t.set(e,+a+n)}function O(t,e){return Jo(this,t,void 0===e?1:+e)}function
real:8476,trade:8482,alefsym:8501,larr:8592,uarr:8593,rarr:8594,darr:8595,harr:8596,crarr:8629,lArr:8656,uArr:8657,rArr:8658,dArr:8659,hArr:8660,forall:8704,part:8706,exist:8707,empty:8709,nabla:8711,isin:8712,notin:8713,ni:8715,prod:8719,sum:8721,minus:8722,lowast:8727,radic:8730,prop:8733,infin:8734,ang:8736,and:8743,or:8744,cap:8745,cup:8746,"int":8747,there4:8756,sim:8764,cong:8773,asymp:8776,ne:8800,equiv:8801,le:8804,ge:8805,sub:8834,sup:8835,nsub:8836,sube:8838,supe:8839,oplus:8853,otimes:8855,perp:8869,sdot:8901,lceil:8968,rceil:8969,lfloor:8970,rfloor:8971,lang:9001,rang:9002,loz:9674,spades:9824,clubs:9827,hearts:9829,diams:9830},sc=[8364,129,8218,402,8222,8230,8224,8225,710,8240,352,8249,338,141,381,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,353,8250,339,157,382,376],pc=RegExp("&(#?(?:x[\\w\\d]+|\\d+|"+Object.keys(oc).join("|")+"));?","g"),uc=//g,lc=/&/g;var vc=function(){return e(this.node)},bc=function(t){this.type=ku,this.text=t.template};bc.prototype={detach:vc,firstNode:function(){return this.node},render:function(){return this.node||(this.node=document.createTextNode(this.text)),this.node},toString:function(t){return t?Ee(this.text):this.text},unrender:function(t){return t?this.detach():void 0}};var yc=bc,xc=Se,_c=Ce,wc=function(t,e,n){var a;this.ref=e,this.resolved=!1,this.root=t.root,this.parentFragment=t.parentFragment,this.callback=n,a=ls(t.root,e,t.parentFragment),void 0!=a?this.resolve(a):bs.addUnresolved(this)};wc.prototype={resolve:function(t){this.keypath&&!t&&bs.addUnresolved(this),this.resolved=!0,this.keypath=t,this.callback(t)},forceResolution:function(){this.resolve(E(this.ref))},rebind:function(t,e){var n;void 0!=this.keypath&&(n=this.keypath.replace(t,e),void 0!==n&&this.resolve(n))},unbind:function(){this.resolved||bs.removeUnresolved(this)}};var kc=wc,Ec=function(t,e,n){this.parentFragment=t.parentFragment,this.ref=e,this.callback=n,this.rebind()},Sc={"@keypath":{prefix:"c",prop:["context"]},"@index":{prefix:"i",prop:["index"]},"@key":{prefix:"k",prop:["key","index"]}};Ec.prototype={rebind:function(){var t,e=this.ref,n=this.parentFragment,a=Sc[e];if(!a)throw Error('Unknown special reference "'+e+'" - valid references are @index, @key and @keypath');if(this.cached)return this.callback(E("@"+a.prefix+Pe(this.cached,a)));if(-1!==a.prop.indexOf("index")||-1!==a.prop.indexOf("key"))for(;n;){if(n.owner.currentSubtype===Bu&&void 0!==(t=Pe(n,a)))return this.cached=n,n.registerIndexRef(this),this.callback(E("@"+a.prefix+t));n=!n.parent&&n.owner&&n.owner.component&&n.owner.component.parentFragment&&!n.owner.component.instance.isolated?n.owner.component.parentFragment:n.parent}else for(;n;){if(void 0!==(t=Pe(n,a)))return this.callback(E("@"+a.prefix+t.str));n=n.parent}},unbind:function(){this.cached&&this.cached.unregisterIndexRef(this)}};var Cc=Ec,Pc=function(t,e,n){this.parentFragment=t.parentFragment,this.ref=e,this.callback=n,e.ref.fragment.registerIndexRef(this),this.rebind()};Pc.prototype={rebind:function(){var t,e=this.ref.ref;t="k"===e.ref.t?"k"+e.fragment.key:"i"+e.fragment.index,void 0!==t&&this.callback(E("@"+t))},unbind:function(){this.ref.ref.fragment.unregisterIndexRef(this)}};var Ac=Pc,Oc=Ae;Ae.resolve=function(t){var e,n,a={};for(e in t.refs)n=t.refs[e],a[n.ref.n]="k"===n.ref.t?n.fragment.key:n.fragment.index;return a};var Tc,Rc=Oe,Lc=Te,jc={},Mc=Function.prototype.bind;Tc=function(t,e,n,a){var r,i=this;r=t.root,this.root=r,this.parentFragment=e,this.callback=a,this.owner=t,this.str=n.s,this.keypaths=[],this.pending=n.r.length,this.refResolvers=n.r.map(function(t,e){return Rc(i,t,function(t){i.resolve(e,t)})}),this.ready=!0,this.bubble()},Tc.prototype={bubble:function(){this.ready&&(this.uniqueString=Le(this.str,this.keypaths),this.keypath=je(this.uniqueString),this.createEvaluator(),this.callback(this.keypath))},unbind:function(){for(var t;t=this.refResolvers.pop();)t.unbind()},resolve:function(t,e){this.keypaths[t]=e,this.bubble()},createEvaluator:function(){var t,e,n,a,r,i=this;a=this.keypath,t=this.root.viewmodel.computations[a.str],t?this.root.viewmodel.mark(a):(r=Lc(this.str,this.refResolvers.length),e=this.keypaths.map(function(t){var e;return"undefined"===t?function(){}:t.isSpecial?(e=t.value,function(){return e}):function(){var e=i.root.viewmodel.get(t,{noUnwrap:!0,fullRootGet:!0});return"function"==typeof e&&(e=De(e,i.root)),e}}),n={deps:this.keypaths.filter(Me),getter:function(){var t=e.map(Re);return r.apply(null,t)}},t=this.root.viewmodel.compute(a,n))},rebind:function(t,e){this.refResolvers.forEach(function(n){return n.rebind(t,e)})}};var Dc=Tc,Nc=function(t,e,n){var a=this;this.resolver=e,this.root=e.root,this.parentFragment=n,this.viewmodel=e.root.viewmodel,"string"==typeof t?this.value=t:t.t===Nu?this.refResolver=Rc(this,t.n,function(t){a.resolve(t)}):new Dc(e,n,t,function(t){a.resolve(t)})};Nc.prototype={resolve:function(t){this.keypath&&this.viewmodel.unregister(this.keypath,this),this.keypath=t,this.value=this.viewmodel.get(t),this.bind(),this.resolver.bubble()},bind:function(){this.viewmodel.register(this.keypath,this)},rebind:function(t,e){this.refResolver&&this.refResolver.rebind(t,e)},setValue:function(t){this.value=t,this.resolver.bubble()},unbind:function(){this.keypath&&this.viewmodel.unregister(this.keypath,this),this.refResolver&&this.refResolver.unbind()},forceResolution:function(){this.refResolver&&this.refResolver.forceResolution()}};var Fc=Nc,Ic=function(t,e,n){var a,r,i,o,s=this;this.parentFragment=o=t.parentFragment,this.root=a=t.root,this.mustache=t,this.ref=r=e.r,this.callback=n,this.unresolved=[],(i=ls(a,r,o))?this.base=i:this.baseResolver=new kc(this,r,function(t){s.base=t,s.baseResolver=null,s.bubble()}),this.members=e.m.map(function(t){return new Fc(t,s,o)}),this.ready=!0,this.bubble()};Ic.prototype={getKeypath:function(){var t=this.members.map(Ne);return!t.every(Fe)||this.baseResolver?null:this.base.join(t.join("."))},bubble:function(){this.ready&&!this.baseResolver&&this.callback(this.getKeypath())},unbind:function(){this.members.forEach(K)},rebind:function(t,e){var n;if(this.base){var a=this.base.replace(t,e);a&&a!==this.base&&(this.base=a,n=!0)}this.members.forEach(function(a){a.rebind(t,e)&&(n=!0)}),n&&this.bubble()},forceResolution:function(){this.baseResolver&&(this.base=E(this.ref),this.baseResolver.unbind(),this.baseResolver=null),this.members.forEach(Ie),this.bubble()}};var Bc=Ic,qc=Be,Uc=qe,Vc=Ue,Gc={getValue:_c,init:qc,resolve:Uc,rebind:Vc},zc=function(t){this.type=Eu,Gc.init(this,t)};zc.prototype={update:function(){this.node.data=void 0==this.value?"":this.value},resolve:Gc.resolve,rebind:Gc.rebind,detach:vc,unbind:xc,render:function(){return this.node||(this.node=document.createTextNode(n(this.value))),this.node},unrender:function(t){t&&e(this.node)},getValue:Gc.getValue,setValue:function(t){var e;this.keypath&&(e=this.root.viewmodel.wrapped[this.keypath.str])&&(t=e.get()),s(t,this.value)||(this.value=t,this.parentFragment.bubble(),this.node&&bs.addView(this))},firstNode:function(){return this.node},toString:function(t){var e=""+n(this.value);return t?Ee(e):e}};var Wc=zc,Hc=Ve,Kc=Ge,Qc=ze,$c=We,Yc=He,Jc=Ke,Xc=Qe,Zc=$e,tl=Ye,el=function(t,e){Gc.rebind.call(this,t,e)},nl=Xe,al=Ze,rl=ln,il=dn,ol=fn,sl=gn,pl=function(t){this.type=Cu,this.subtype=this.currentSubtype=t.template.n,this.inverted=this.subtype===Iu,this.pElement=t.pElement,this.fragments=[],this.fragmentsToCreate=[],this.fragmentsToRender=[],this.fragmentsToUnrender=[],t.template.i&&(this.indexRefs=t.template.i.split(",").map(function(t,e){return{n:t,t:0===e?"k":"i"}})),this.renderedFragments=[],this.length=0,Gc.init(this,t)};pl.prototype={bubble:Hc,detach:Kc,find:Qc,findAll:$c,findAllComponents:Yc,findComponent:Jc,findNextNode:Xc,firstNode:Zc,getIndexRef:function(t){if(this.indexRefs)for(var e=this.indexRefs.length;e--;){var n=this.indexRefs[e];if(n.n===t)return n}},getValue:Gc.getValue,shuffle:tl,rebind:el,render:nl,resolve:Gc.resolve,setValue:al,toString:rl,unbind:il,unrender:ol,update:sl};var ul,cl,ll=pl,dl=vn,fl=bn,hl=yn,ml=xn,gl={};try{co("table").innerHTML="foo"}catch(Ao){ul=!0,cl={TABLE:['"],THEAD:['"],TBODY:['"],TR:['"],SELECT:[''," "]}}var vl=function(t,e,n){var a,r,i,o,s,p=[];if(null!=t&&""!==t){for(ul&&(r=cl[e.tagName])?(a=_n("DIV"),a.innerHTML=r[0]+t+r[1],a=a.querySelector(".x"),"SELECT"===a.tagName&&(i=a.options[a.selectedIndex])):e.namespaceURI===no.svg?(a=_n("DIV"),a.innerHTML=''+t+" ",a=a.querySelector(".x")):(a=_n(e.tagName),a.innerHTML=t,"SELECT"===a.tagName&&(i=a.options[a.selectedIndex]));o=a.firstChild;)p.push(o),n.appendChild(o);if("SELECT"===e.tagName)for(s=p.length;s--;)p[s]!==i&&(p[s].selected=!1)}return p},bl=wn,yl=En,xl=Sn,_l=Cn,wl=Pn,kl=An,El=function(t){this.type=Su,Gc.init(this,t)};El.prototype={detach:dl,find:fl,findAll:hl,firstNode:ml,getValue:Gc.getValue,rebind:Gc.rebind,render:yl,resolve:Gc.resolve,setValue:xl,toString:_l,unbind:xc,unrender:wl,update:kl};var Sl,Cl,Pl,Al,Ol=El,Tl=function(){this.parentFragment.bubble()},Rl=On,Ll=function(t){return this.node?lo(this.node,t)?this.node:this.fragment&&this.fragment.find?this.fragment.find(t):void 0:null},jl=function(t,e){e._test(this,!0)&&e.live&&(this.liveQueries||(this.liveQueries=[])).push(e),this.fragment&&this.fragment.findAll(t,e)},Ml=function(t,e){this.fragment&&this.fragment.findAllComponents(t,e)},Dl=function(t){return this.fragment?this.fragment.findComponent(t):void 0},Nl=Tn,Fl=Rn,Il=Ln,Bl=/^true|on|yes|1$/i,ql=/^[0-9]+$/,Ul=function(t,e){var n,a,r;return r=e.a||{},a={},n=r.twoway,void 0!==n&&(a.twoway=0===n||Bl.test(n)),n=r.lazy,void 0!==n&&(0!==n&&ql.test(n)?a.lazy=parseInt(n):a.lazy=0===n||Bl.test(n)),a},Vl=jn;Sl="altGlyph altGlyphDef altGlyphItem animateColor animateMotion animateTransform clipPath feBlend feColorMatrix feComponentTransfer feComposite feConvolveMatrix feDiffuseLighting feDisplacementMap feDistantLight feFlood feFuncA feFuncB feFuncG feFuncR feGaussianBlur feImage feMerge feMergeNode feMorphology feOffset fePointLight feSpecularLighting feSpotLight feTile feTurbulence foreignObject glyphRef linearGradient radialGradient textPath vkern".split(" "),Cl="attributeName attributeType baseFrequency baseProfile calcMode clipPathUnits contentScriptType contentStyleType diffuseConstant edgeMode externalResourcesRequired filterRes filterUnits glyphRef gradientTransform gradientUnits kernelMatrix kernelUnitLength keyPoints keySplines keyTimes lengthAdjust limitingConeAngle markerHeight markerUnits markerWidth maskContentUnits maskUnits numOctaves pathLength patternContentUnits patternTransform patternUnits pointsAtX pointsAtY pointsAtZ preserveAlpha preserveAspectRatio primitiveUnits refX refY repeatCount repeatDur requiredExtensions requiredFeatures specularConstant specularExponent spreadMethod startOffset stdDeviation stitchTiles surfaceScale systemLanguage tableValues targetX targetY textLength viewBox viewTarget xChannelSelector yChannelSelector zoomAndPan".split(" "),Pl=function(t){for(var e={},n=t.length;n--;)e[t[n].toLowerCase()]=t[n];return e},Al=Pl(Sl.concat(Cl));var Gl=function(t){var e=t.toLowerCase();return Al[e]||e},zl=function(t,e){var n,a;if(n=e.indexOf(":"),-1===n||(a=e.substr(0,n),"xmlns"===a))t.name=t.element.namespace!==no.html?Gl(e):e;else if(e=e.substring(n+1),t.name=Gl(e),t.namespace=no[a.toLowerCase()],t.namespacePrefix=a,!t.namespace)throw'Unknown namespace ("'+a+'")'},Wl=Mn,Hl=Dn,Kl=Nn,Ql=Fn,$l={"accept-charset":"acceptCharset",accesskey:"accessKey",bgcolor:"bgColor","class":"className",codebase:"codeBase",colspan:"colSpan",contenteditable:"contentEditable",datetime:"dateTime",dirname:"dirName","for":"htmlFor","http-equiv":"httpEquiv",ismap:"isMap",maxlength:"maxLength",novalidate:"noValidate",pubdate:"pubDate",readonly:"readOnly",rowspan:"rowSpan",tabindex:"tabIndex",usemap:"useMap"},Yl=In,Jl=qn,Xl=Un,Zl=Vn,td=Gn,ed=zn,nd=Wn,ad=Hn,rd=Kn,id=Qn,od=$n,sd=Yn,pd=Jn,ud=Xn,cd=Zn,ld=function(t){this.init(t)};ld.prototype={bubble:Vl,init:Hl,rebind:Kl,render:Ql,toString:Yl,unbind:Jl,update:cd};var dd,fd=ld,hd=function(t,e){var n,a,r=[];for(n in e)"twoway"!==n&&"lazy"!==n&&e.hasOwnProperty(n)&&(a=new fd({element:t,name:n,value:e[n],root:t.root}),r[n]=a,"value"!==n&&r.push(a));return(a=r.value)&&r.push(a),r};"undefined"!=typeof document&&(dd=co("div"));var md=function(t,e){this.element=t,this.root=t.root,this.parentFragment=t.parentFragment,this.attributes=[],this.fragment=new rg({root:t.root,owner:this,template:[e]})};md.prototype={bubble:function(){this.node&&this.update(),this.element.bubble()},rebind:function(t,e){this.fragment.rebind(t,e)},render:function(t){this.node=t,this.isSvg=t.namespaceURI===no.svg,this.update()},unbind:function(){this.fragment.unbind()},update:function(){var t,e,n=this;t=""+this.fragment,e=ta(t,this.isSvg),this.attributes.filter(function(t){return ea(e,t)}).forEach(function(t){n.node.removeAttribute(t.name)}),e.forEach(function(t){n.node.setAttribute(t.name,t.value)}),this.attributes=e},toString:function(){return""+this.fragment}};var gd=md,vd=function(t,e){return e?e.map(function(e){return new gd(t,e)}):[]},bd=function(t){var e,n,a,r;if(this.element=t,this.root=t.root,this.attribute=t.attributes[this.name||"value"],e=this.attribute.interpolator,e.twowayBinding=this,n=e.keypath){if("}"===n.str.slice(-1))return g("Two-way binding does not work with expressions (`%s` on <%s>)",e.resolver.uniqueString,t.name,{ractive:this.root}),!1;if(n.isSpecial)return g("Two-way binding does not work with %s",e.resolver.ref,{ractive:this.root}),!1}else{var i=e.template.r?"'"+e.template.r+"' reference":"expression";m("The %s being used for two-way binding is ambiguous, and may cause unexpected results. Consider initialising your data to eliminate the ambiguity",i,{ractive:this.root}),e.resolver.forceResolution(),n=e.keypath}this.attribute.isTwoway=!0,this.keypath=n,a=this.root.viewmodel.get(n),void 0===a&&this.getInitialValue&&(a=this.getInitialValue(),void 0!==a&&this.root.viewmodel.set(n,a)),(r=na(t))&&(this.resetValue=a,r.formBindings.push(this))};bd.prototype={handleChange:function(){var t=this;bs.start(this.root),this.attribute.locked=!0,this.root.viewmodel.set(this.keypath,this.getValue()),bs.scheduleTask(function(){return t.attribute.locked=!1}),bs.end()},rebound:function(){var t,e,n;e=this.keypath,n=this.attribute.interpolator.keypath,e!==n&&(N(this.root._twowayBindings[e.str],this),this.keypath=n,t=this.root._twowayBindings[n.str]||(this.root._twowayBindings[n.str]=[]),t.push(this))},unbind:function(){}},bd.extend=function(t){var e,n=this;return e=function(t){bd.call(this,t),this.init&&this.init()},e.prototype=Eo(n.prototype),a(e.prototype,t),e.extend=bd.extend,e};var yd,xd=bd,_d=aa;yd=xd.extend({getInitialValue:function(){return""},getValue:function(){return this.element.node.value},render:function(){var t,e=this.element.node,n=!1;this.rendered=!0,t=this.root.lazy,this.element.lazy===!0?t=!0:this.element.lazy===!1?t=!1:p(this.element.lazy)?(t=!1,n=+this.element.lazy):p(t||"")&&(n=+t,t=!1,this.element.lazy=n),this.handler=n?ia:_d,e.addEventListener("change",_d,!1),t||(e.addEventListener("input",this.handler,!1),e.attachEvent&&e.addEventListener("keyup",this.handler,!1)),e.addEventListener("blur",ra,!1)},unrender:function(){var t=this.element.node;this.rendered=!1,t.removeEventListener("change",_d,!1),t.removeEventListener("input",this.handler,!1),t.removeEventListener("keyup",this.handler,!1),t.removeEventListener("blur",ra,!1)}});var wd=yd,kd=wd.extend({getInitialValue:function(){return this.element.fragment?""+this.element.fragment:""},getValue:function(){return this.element.node.innerHTML}}),Ed=kd,Sd=oa,Cd={},Pd=xd.extend({name:"checked",init:function(){this.siblings=Sd(this.root._guid,"radio",this.element.getAttribute("name")),this.siblings.push(this)},render:function(){var t=this.element.node;t.addEventListener("change",_d,!1),t.attachEvent&&t.addEventListener("click",_d,!1)},unrender:function(){var t=this.element.node;t.removeEventListener("change",_d,!1),t.removeEventListener("click",_d,!1)},handleChange:function(){bs.start(this.root),this.siblings.forEach(function(t){t.root.viewmodel.set(t.keypath,t.getValue())}),bs.end()},getValue:function(){return this.element.node.checked},unbind:function(){N(this.siblings,this)}}),Ad=Pd,Od=xd.extend({name:"name",init:function(){this.siblings=Sd(this.root._guid,"radioname",this.keypath.str),this.siblings.push(this),this.radioName=!0},getInitialValue:function(){return this.element.getAttribute("checked")?this.element.getAttribute("value"):void 0},render:function(){var t=this.element.node;t.name="{{"+this.keypath.str+"}}",t.checked=this.root.viewmodel.get(this.keypath)==this.element.getAttribute("value"),t.addEventListener("change",_d,!1),t.attachEvent&&t.addEventListener("click",_d,!1)},unrender:function(){var t=this.element.node;t.removeEventListener("change",_d,!1),t.removeEventListener("click",_d,!1)},getValue:function(){var t=this.element.node;return t._ractive?t._ractive.value:t.value},handleChange:function(){this.element.node.checked&&xd.prototype.handleChange.call(this)},rebound:function(t,e){var n;xd.prototype.rebound.call(this,t,e),(n=this.element.node)&&(n.name="{{"+this.keypath.str+"}}")},unbind:function(){N(this.siblings,this)}}),Td=Od,Rd=xd.extend({name:"name",getInitialValue:function(){return this.noInitialValue=!0,[]},init:function(){var t,e;this.checkboxName=!0,this.siblings=Sd(this.root._guid,"checkboxes",this.keypath.str),this.siblings.push(this),this.noInitialValue&&(this.siblings.noInitialValue=!0),this.siblings.noInitialValue&&this.element.getAttribute("checked")&&(t=this.root.viewmodel.get(this.keypath),e=this.element.getAttribute("value"),t.push(e))},unbind:function(){N(this.siblings,this)},render:function(){var t,e,n=this.element.node;t=this.root.viewmodel.get(this.keypath),e=this.element.getAttribute("value"),i(t)?this.isChecked=L(t,e):this.isChecked=t==e,n.name="{{"+this.keypath.str+"}}",n.checked=this.isChecked,n.addEventListener("change",_d,!1),n.attachEvent&&n.addEventListener("click",_d,!1)},unrender:function(){var t=this.element.node;t.removeEventListener("change",_d,!1),t.removeEventListener("click",_d,!1)},changed:function(){var t=!!this.isChecked;return this.isChecked=this.element.node.checked,this.isChecked===t},handleChange:function(){this.isChecked=this.element.node.checked,xd.prototype.handleChange.call(this)},getValue:function(){return this.siblings.filter(sa).map(pa)}}),Ld=Rd,jd=xd.extend({name:"checked",render:function(){var t=this.element.node;t.addEventListener("change",_d,!1),t.attachEvent&&t.addEventListener("click",_d,!1)},unrender:function(){var t=this.element.node;t.removeEventListener("change",_d,!1),t.removeEventListener("click",_d,!1)},getValue:function(){return this.element.node.checked}}),Md=jd,Dd=xd.extend({getInitialValue:function(){var t,e,n,a,r=this.element.options;if(void 0===this.element.getAttribute("value")&&(e=t=r.length,t)){for(;e--;)if(r[e].getAttribute("selected")){n=r[e].getAttribute("value"),a=!0;break}if(!a)for(;++ee;e+=1)if(a=t[e],t[e].selected)return r=a._ractive?a._ractive.value:a.value},forceUpdate:function(){var t=this,e=this.getValue();void 0!==e&&(this.attribute.locked=!0,bs.scheduleTask(function(){return t.attribute.locked=!1}),this.root.viewmodel.set(this.keypath,e))}}),Nd=Dd,Fd=Nd.extend({getInitialValue:function(){return this.element.options.filter(function(t){return t.getAttribute("selected")}).map(function(t){return t.getAttribute("value")})},render:function(){var t;this.element.node.addEventListener("change",_d,!1),t=this.root.viewmodel.get(this.keypath),void 0===t&&this.handleChange()},unrender:function(){this.element.node.removeEventListener("change",_d,!1)},setValue:function(){throw Error("TODO not implemented yet")},getValue:function(){var t,e,n,a,r,i;for(t=[],e=this.element.node.options,a=e.length,n=0;a>n;n+=1)r=e[n],r.selected&&(i=r._ractive?r._ractive.value:r.value,t.push(i));return t},handleChange:function(){var t,e,n;return t=this.attribute,e=t.value,n=this.getValue(),void 0!==e&&j(n,e)||Nd.prototype.handleChange.call(this),this},forceUpdate:function(){var t=this,e=this.getValue();void 0!==e&&(this.attribute.locked=!0,bs.scheduleTask(function(){return t.attribute.locked=!1}),this.root.viewmodel.set(this.keypath,e))},updateModel:function(){void 0!==this.attribute.value&&this.attribute.value.length||this.root.viewmodel.set(this.keypath,this.initialValue)}}),Id=Fd,Bd=xd.extend({render:function(){this.element.node.addEventListener("change",_d,!1)},unrender:function(){this.element.node.removeEventListener("change",_d,!1)},getValue:function(){return this.element.node.files}}),qd=Bd,Ud=wd.extend({getInitialValue:function(){},getValue:function(){var t=parseFloat(this.element.node.value);return isNaN(t)?void 0:t}}),Vd=ua,Gd=la,zd=da,Wd=fa,Hd=ha,Kd=/^event(?:\.(.+))?/,Qd=ba,$d=ya,Yd={},Jd={touchstart:!0,touchmove:!0,touchend:!0,touchcancel:!0,touchleave:!0},Xd=_a,Zd=wa,tf=ka,ef=Ea,nf=Sa,af=function(t,e,n){this.init(t,e,n)};af.prototype={bubble:Gd,fire:zd,getAction:Wd,init:Hd,listen:$d,rebind:Xd,render:Zd,resolve:tf,unbind:ef,unrender:nf};var rf=af,of=function(t,e){var n,a,r,i,o=[];for(a in e)if(e.hasOwnProperty(a))for(r=a.split("-"),n=r.length;n--;)i=new rf(t,r[n],e[a]),o.push(i);return o},sf=function(t,e){var n,a,r,i=this;this.element=t,this.root=n=t.root,a=e.n||e,("string"==typeof a||(r=new rg({template:a,root:n,owner:t}),a=""+r,r.unbind(),""!==a))&&(e.a?this.params=e.a:e.d&&(this.fragment=new rg({template:e.d,root:n,owner:t}),this.params=this.fragment.getArgsList(),this.fragment.bubble=function(){this.dirtyArgs=this.dirtyValue=!0,i.params=this.getArgsList(),i.ready&&i.update()}),this.fn=v("decorators",n,a),this.fn||l(Io(a,"decorator")))};sf.prototype={init:function(){var t,e,n;if(t=this.element.node,this.params?(n=[t].concat(this.params),e=this.fn.apply(this.root,n)):e=this.fn.call(this.root,t),!e||!e.teardown)throw Error("Decorator definition must return an object with a teardown method");this.actual=e,this.ready=!0},update:function(){this.actual.update?this.actual.update.apply(this.root,this.params):(this.actual.teardown(!0),this.init())},rebind:function(t,e){this.fragment&&this.fragment.rebind(t,e)},teardown:function(t){this.torndown=!0,this.ready&&this.actual.teardown(),!t&&this.fragment&&this.fragment.unbind()}};var pf,uf,cf,lf=sf,df=La,ff=ja,hf=Ba,mf=function(t){return t.replace(/-([a-zA-Z])/g,function(t,e){return e.toUpperCase()})};Xi?(uf={},cf=co("div").style,pf=function(t){var e,n,a;if(t=mf(t),!uf[t])if(void 0!==cf[t])uf[t]=t;else for(a=t.charAt(0).toUpperCase()+t.substring(1),e=ro.length;e--;)if(n=ro[e],void 0!==cf[n+a]){uf[t]=n+a;break}return uf[t]}):pf=null;var gf,vf,bf=pf;Xi?(vf=window.getComputedStyle||Po.getComputedStyle,gf=function(t){var e,n,a,r,o;if(e=vf(this.node),"string"==typeof t)return o=e[bf(t)],"0px"===o&&(o=0),o;if(!i(t))throw Error("Transition$getStyle must be passed a string, or an array of strings representing CSS properties");for(n={},a=t.length;a--;)r=t[a],o=e[bf(r)],"0px"===o&&(o=0),n[r]=o;return n}):gf=null;var yf=gf,xf=function(t,e){var n;if("string"==typeof t)this.node.style[bf(t)]=e;else for(n in t)t.hasOwnProperty(n)&&(this.node.style[bf(n)]=t[n]);return this},_f=function(t){var e;this.duration=t.duration,this.step=t.step,this.complete=t.complete,"string"==typeof t.easing?(e=t.root.easing[t.easing],e||(g(Io(t.easing,"easing")),e=qa)):e="function"==typeof t.easing?t.easing:qa,this.easing=e,this.start=ns(),this.end=this.start+this.duration,this.running=!0,_s.add(this)};_f.prototype={tick:function(t){var e,n;return this.running?t>this.end?(this.step&&this.step(1),this.complete&&this.complete(1),!1):(e=t-this.start,n=this.easing(e/this.duration),this.step&&this.step(n),!0):!1},stop:function(){this.abort&&this.abort(),this.running=!1}};var wf,kf,Ef,Sf,Cf,Pf,Af,Of,Tf=_f,Rf=RegExp("^-(?:"+ro.join("|")+")-"),Lf=function(t){return t.replace(Rf,"")},jf=RegExp("^(?:"+ro.join("|")+")([A-Z])"),Mf=function(t){var e;return t?(jf.test(t)&&(t="-"+t),e=t.replace(/[A-Z]/g,function(t){return"-"+t.toLowerCase()})):""},Df={},Nf={};Xi?(kf=co("div").style,function(){void 0!==kf.transition?(Ef="transition",Sf="transitionend",Cf=!0):void 0!==kf.webkitTransition?(Ef="webkitTransition",Sf="webkitTransitionEnd",Cf=!0):Cf=!1}(),Ef&&(Pf=Ef+"Duration",Af=Ef+"Property",Of=Ef+"TimingFunction"),wf=function(t,e,n,a,r){setTimeout(function(){var i,o,s,p,u;p=function(){o&&s&&(t.root.fire(t.name+":end",t.node,t.isIntro),r())},i=(t.node.namespaceURI||"")+t.node.tagName,t.node.style[Af]=a.map(bf).map(Mf).join(","),t.node.style[Of]=Mf(n.easing||"linear"),t.node.style[Pf]=n.duration/1e3+"s",u=function(e){var n;n=a.indexOf(mf(Lf(e.propertyName))),-1!==n&&a.splice(n,1),a.length||(t.node.removeEventListener(Sf,u,!1),s=!0,p())},t.node.addEventListener(Sf,u,!1),setTimeout(function(){for(var r,c,l,d,f,h=a.length,g=[];h--;)d=a[h],r=i+d,Cf&&!Nf[r]&&(t.node.style[bf(d)]=e[d],Df[r]||(c=t.getStyle(d),Df[r]=t.getStyle(d)!=e[d],Nf[r]=!Df[r],Nf[r]&&(t.node.style[bf(d)]=c))),(!Cf||Nf[r])&&(void 0===c&&(c=t.getStyle(d)),l=a.indexOf(d),-1===l?m("Something very strange happened with transitions. Please raise an issue at https://github.com/ractivejs/ractive/issues - thanks!",{node:t.node}):a.splice(l,1),f=/[^\d]*$/.exec(e[d])[0],g.push({name:bf(d),interpolator:qo(parseFloat(c),parseFloat(e[d])),suffix:f}));g.length?new Tf({root:t.root,duration:n.duration,easing:mf(n.easing||""),step:function(e){var n,a;for(a=g.length;a--;)n=g[a],t.node.style[n.name]=n.interpolator(e)+n.suffix},complete:function(){o=!0,p()}}):o=!0,a.length||(t.node.removeEventListener(Sf,u,!1),s=!0,p())},0)},n.delay||0)}):wf=null;var Ff,If,Bf,qf,Uf,Vf=wf;if("undefined"!=typeof document){if(Ff="hidden",Uf={},Ff in document)Bf="";else for(qf=ro.length;qf--;)If=ro[qf],Ff=If+"Hidden",Ff in document&&(Bf=If);void 0!==Bf?(document.addEventListener(Bf+"visibilitychange",Ua),Ua()):("onfocusout"in document?(document.addEventListener("focusout",Va),document.addEventListener("focusin",Ga)):(window.addEventListener("pagehide",Va),window.addEventListener("blur",Va),window.addEventListener("pageshow",Ga),window.addEventListener("focus",Ga)),Uf.hidden=!1)}var Gf,zf,Wf,Hf=Uf;Xi?(zf=window.getComputedStyle||Po.getComputedStyle,Gf=function(t,e,n){var a,r=this;if(4===arguments.length)throw Error("t.animateStyle() returns a promise - use .then() instead of passing a callback");if(Hf.hidden)return this.setStyle(t,e),Wf||(Wf=us.resolve());"string"==typeof t?(a={},a[t]=e):(a=t,n=e),n||(g('The "%s" transition does not supply an options object to `t.animateStyle()`. This will break in a future version of Ractive. For more info see https://github.com/RactiveJS/Ractive/issues/340',this.name),n=this);var i=new us(function(t){var e,i,o,s,p,u,c;if(!n.duration)return r.setStyle(a),void t();for(e=Object.keys(a),i=[],o=zf(r.node),p={},u=e.length;u--;)c=e[u],s=o[bf(c)],"0px"===s&&(s=0),s!=a[c]&&(i.push(c),r.node.style[bf(c)]=s);return i.length?void Vf(r,a,n,i,t):void t()});return i}):Gf=null;var Kf=Gf,Qf=function(t,e){return"number"==typeof t?t={duration:t}:"string"==typeof t?t="slow"===t?{duration:600}:"fast"===t?{duration:200}:{duration:400}:t||(t={}),r({},t,e)},$f=za,Yf=function(t,e,n){this.init(t,e,n)};Yf.prototype={init:hf,start:$f,getStyle:yf,setStyle:xf,animateStyle:Kf,processParams:Qf};var Jf,Xf,Zf=Yf,th=Ha;Jf=function(){var t=this.node,e=this.fragment.toString(!1);if(window&&window.appearsToBeIELessEqual8&&(t.type="text/css"),t.styleSheet)t.styleSheet.cssText=e;else{for(;t.hasChildNodes();)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}},Xf=function(){this.node.type&&"text/javascript"!==this.node.type||m("Script tag was updated. This does not cause the code to be re-evaluated!",{ractive:this.root}),this.node.text=this.fragment.toString(!1)};var eh=function(){var t,e;return this.template.y?"":(t="<"+this.template.e,t+=this.attributes.map(Xa).join("")+this.conditionalAttributes.map(Xa).join(""),"option"===this.name&&Ya(this)&&(t+=" selected"),"input"===this.name&&Ja(this)&&(t+=" checked"),t+=">","textarea"===this.name&&void 0!==this.getAttribute("value")?t+=Ee(this.getAttribute("value")):void 0!==this.getAttribute("contenteditable")&&(t+=this.getAttribute("value")||""),this.fragment&&(e="script"!==this.name&&"style"!==this.name,t+=this.fragment.toString(e)),ic.test(this.template.e)||(t+=""+this.template.e+">"),t)},nh=Za,ah=tr,rh=function(t){this.init(t)};rh.prototype={bubble:Tl,detach:Rl,find:Ll,findAll:jl,findAllComponents:Ml,findComponent:Dl,findNextNode:Nl,firstNode:Fl,getAttribute:Il,init:df,rebind:ff,render:th,toString:eh,unbind:nh,unrender:ah};var ih=rh,oh=/^\s*$/,sh=/^\s*/,ph=function(t){var e,n,a,r;return e=t.split("\n"),n=e[0],void 0!==n&&oh.test(n)&&e.shift(),a=D(e),void 0!==a&&oh.test(a)&&e.pop(),r=e.reduce(nr,null),r&&(t=e.map(function(t){return t.replace(r,"")}).join("\n")),t},uh=ar,ch=function(t,e){var n;return e?n=t.split("\n").map(function(t,n){return n?e+t:t}).join("\n"):t},lh='Could not find template for partial "%s"',dh=function(t){var e,n;e=this.parentFragment=t.parentFragment,this.root=e.root,this.type=Au,this.index=t.index,this.name=t.template.r,this.rendered=!1,this.fragment=this.fragmentToRender=this.fragmentToUnrender=null,Gc.init(this,t),this.keypath||((n=uh(this.root,this.name,e))?(xc.call(this),this.isNamed=!0,this.setTemplate(n)):g(lh,this.name))};dh.prototype={bubble:function(){this.parentFragment.bubble()},detach:function(){return this.fragment.detach()},find:function(t){return this.fragment.find(t)},findAll:function(t,e){return this.fragment.findAll(t,e)},findComponent:function(t){return this.fragment.findComponent(t)},findAllComponents:function(t,e){return this.fragment.findAllComponents(t,e)},firstNode:function(){return this.fragment.firstNode()},findNextNode:function(){return this.parentFragment.findNextNode(this)},getPartialName:function(){return this.isNamed&&this.name?this.name:void 0===this.value?this.name:this.value},getValue:function(){return this.fragment.getValue()},rebind:function(t,e){this.isNamed||Vc.call(this,t,e),this.fragment&&this.fragment.rebind(t,e)},render:function(){return this.docFrag=document.createDocumentFragment(),this.update(),this.rendered=!0,this.docFrag},resolve:Gc.resolve,setValue:function(t){var e;(void 0===t||t!==this.value)&&(void 0!==t&&(e=uh(this.root,""+t,this.parentFragment)),!e&&this.name&&(e=uh(this.root,this.name,this.parentFragment))&&(xc.call(this),this.isNamed=!0),e||g(lh,this.name,{ractive:this.root}),this.value=t,this.setTemplate(e||[]),this.bubble(),this.rendered&&bs.addView(this))},setTemplate:function(t){this.fragment&&(this.fragment.unbind(),this.rendered&&(this.fragmentToUnrender=this.fragment)),this.fragment=new rg({template:t,root:this.root,owner:this,pElement:this.parentFragment.pElement}),this.fragmentToRender=this.fragment},toString:function(t){var e,n,a,r;return e=this.fragment.toString(t),n=this.parentFragment.items[this.index-1],n&&n.type===ku?(a=n.text.split("\n").pop(),(r=/^\s+$/.exec(a))?ch(e,r[0]):e):e},unbind:function(){this.isNamed||xc.call(this),this.fragment&&this.fragment.unbind()},unrender:function(t){this.rendered&&(this.fragment&&this.fragment.unrender(t),this.rendered=!1)},update:function(){var t,e;this.fragmentToUnrender&&(this.fragmentToUnrender.unrender(!0),this.fragmentToUnrender=null),this.fragmentToRender&&(this.docFrag.appendChild(this.fragmentToRender.render()),this.fragmentToRender=null),
this.rendered&&(t=this.parentFragment.getNode(),e=this.parentFragment.findNextNode(this),t.insertBefore(this.docFrag,e))}};var fh,hh,mh,gh=dh,vh=pr,bh=ur,yh=new is("detach"),xh=cr,_h=lr,wh=dr,kh=fr,Eh=hr,Sh=mr,Ch=function(t,e,n,a){var r=t.root,i=t.keypath;a?r.viewmodel.smartUpdate(i,e,a):r.viewmodel.mark(i)},Ph=[],Ah=["pop","push","reverse","shift","sort","splice","unshift"];Ah.forEach(function(t){var e=function(){for(var e=arguments.length,n=Array(e),a=0;e>a;a++)n[a]=arguments[a];var r,i,o,s;for(r=bp(this,t,n),i=Array.prototype[t].apply(this,arguments),bs.start(),this._ractive.setting=!0,s=this._ractive.wrappers.length;s--;)o=this._ractive.wrappers[s],bs.addRactive(o.root),Ch(o,this,t,r);return bs.end(),this._ractive.setting=!1,i};So(Ph,t,{value:e})}),fh={},fh.__proto__?(hh=function(t){t.__proto__=Ph},mh=function(t){t.__proto__=Array.prototype}):(hh=function(t){var e,n;for(e=Ah.length;e--;)n=Ah[e],So(t,n,{value:Ph[n],configurable:!0})},mh=function(t){var e;for(e=Ah.length;e--;)delete t[Ah[e]]}),hh.unpatch=mh;var Oh,Th,Rh,Lh=hh;Oh={filter:function(t){return i(t)&&(!t._ractive||!t._ractive.setting)},wrap:function(t,e,n){return new Th(t,e,n)}},Th=function(t,e,n){this.root=t,this.value=e,this.keypath=E(n),e._ractive||(So(e,"_ractive",{value:{wrappers:[],instances:[],setting:!1},configurable:!0}),Lh(e)),e._ractive.instances[t._guid]||(e._ractive.instances[t._guid]=0,e._ractive.instances.push(t)),e._ractive.instances[t._guid]+=1,e._ractive.wrappers.push(this)},Th.prototype={get:function(){return this.value},teardown:function(){var t,e,n,a,r;if(t=this.value,e=t._ractive,n=e.wrappers,a=e.instances,e.setting)return!1;if(r=n.indexOf(this),-1===r)throw Error(Rh);if(n.splice(r,1),n.length){if(a[this.root._guid]-=1,!a[this.root._guid]){if(r=a.indexOf(this.root),-1===r)throw Error(Rh);a.splice(r,1)}}else delete t._ractive,Lh.unpatch(this.value)}},Rh="Something went wrong in a rather interesting way";var jh,Mh,Dh=Oh,Nh=/^\s*[0-9]+\s*$/,Fh=function(t){return Nh.test(t)?[]:{}};try{Object.defineProperty({},"test",{value:0}),jh={filter:function(t,e,n){var a,r;return e?(e=E(e),(a=n.viewmodel.wrapped[e.parent.str])&&!a.magic?!1:(r=n.viewmodel.get(e.parent),i(r)&&/^[0-9]+$/.test(e.lastKey)?!1:r&&("object"==typeof r||"function"==typeof r))):!1},wrap:function(t,e,n){return new Mh(t,e,n)}},Mh=function(t,e,n){var a,r,i;return n=E(n),this.magic=!0,this.ractive=t,this.keypath=n,this.value=e,this.prop=n.lastKey,a=n.parent,this.obj=a.isRoot?t.viewmodel.data:t.viewmodel.get(a),r=this.originalDescriptor=Object.getOwnPropertyDescriptor(this.obj,this.prop),r&&r.set&&(i=r.set._ractiveWrappers)?void(-1===i.indexOf(this)&&i.push(this)):void gr(this,e,r)},Mh.prototype={get:function(){return this.value},reset:function(t){return this.updating?void 0:(this.updating=!0,this.obj[this.prop]=t,bs.addRactive(this.ractive),this.ractive.viewmodel.mark(this.keypath,{keepExistingWrapper:!0}),this.updating=!1,!0)},set:function(t,e){this.updating||(this.obj[this.prop]||(this.updating=!0,this.obj[this.prop]=Fh(t),this.updating=!1),this.obj[this.prop][t]=e)},teardown:function(){var t,e,n,a,r;return this.updating?!1:(t=Object.getOwnPropertyDescriptor(this.obj,this.prop),e=t&&t.set,void(e&&(a=e._ractiveWrappers,r=a.indexOf(this),-1!==r&&a.splice(r,1),a.length||(n=this.obj[this.prop],Object.defineProperty(this.obj,this.prop,this.originalDescriptor||{writable:!0,enumerable:!0,configurable:!0}),this.obj[this.prop]=n))))}}}catch(Ao){jh=!1}var Ih,Bh,qh=jh;qh&&(Ih={filter:function(t,e,n){return qh.filter(t,e,n)&&Dh.filter(t)},wrap:function(t,e,n){return new Bh(t,e,n)}},Bh=function(t,e,n){this.value=e,this.magic=!0,this.magicWrapper=qh.wrap(t,e,n),this.arrayWrapper=Dh.wrap(t,e,n)},Bh.prototype={get:function(){return this.value},teardown:function(){this.arrayWrapper.teardown(),this.magicWrapper.teardown()},reset:function(t){return this.magicWrapper.reset(t)}});var Uh=Ih,Vh=vr,Gh={},zh=xr,Wh=_r,Hh=Er,Kh=Or,Qh=Tr,$h=function(t,e){this.computation=t,this.viewmodel=t.viewmodel,this.ref=e,this.root=this.viewmodel.ractive,this.parentFragment=this.root.component&&this.root.component.parentFragment};$h.prototype={resolve:function(t){this.computation.softDeps.push(t),this.computation.unresolvedDeps[t.str]=null,this.viewmodel.register(t,this.computation,"computed")}};var Yh=$h,Jh=function(t,e){this.key=t,this.getter=e.getter,this.setter=e.setter,this.hardDeps=e.deps||[],this.softDeps=[],this.unresolvedDeps={},this.depValues={},this._dirty=this._firstRun=!0};Jh.prototype={constructor:Jh,init:function(t){var e,n=this;this.viewmodel=t,this.bypass=!0,e=t.get(this.key),t.clearCache(this.key.str),this.bypass=!1,this.setter&&void 0!==e&&this.set(e),this.hardDeps&&this.hardDeps.forEach(function(e){return t.register(e,n,"computed")})},invalidate:function(){this._dirty=!0},get:function(){var t,e,n=this,a=!1;if(this.getting){var r="The "+this.key.str+" computation indirectly called itself. This probably indicates a bug in the computation. It is commonly caused by `array.sort(...)` - if that's the case, clone the array first with `array.slice().sort(...)`";return h(r),this.value}if(this.getting=!0,this._dirty){if(this._firstRun||!this.hardDeps.length&&!this.softDeps.length?a=!0:[this.hardDeps,this.softDeps].forEach(function(t){var e,r,i;if(!a)for(i=t.length;i--;)if(e=t[i],r=n.viewmodel.get(e),!s(r,n.depValues[e.str]))return n.depValues[e.str]=r,void(a=!0)}),a){this.viewmodel.capture();try{this.value=this.getter()}catch(i){m('Failed to compute "%s"',this.key.str),d(i.stack||i),this.value=void 0}t=this.viewmodel.release(),e=this.updateDependencies(t),e&&[this.hardDeps,this.softDeps].forEach(function(t){t.forEach(function(t){n.depValues[t.str]=n.viewmodel.get(t)})})}this._dirty=!1}return this.getting=this._firstRun=!1,this.value},set:function(t){if(this.setting)return void(this.value=t);if(!this.setter)throw Error("Computed properties without setters are read-only. (This may change in a future version of Ractive!)");this.setter(t)},updateDependencies:function(t){var e,n,a,r,i;for(n=this.softDeps,e=n.length;e--;)a=n[e],-1===t.indexOf(a)&&(r=!0,this.viewmodel.unregister(a,this,"computed"));for(e=t.length;e--;)a=t[e],-1!==n.indexOf(a)||this.hardDeps&&-1!==this.hardDeps.indexOf(a)||(r=!0,Rr(this.viewmodel,a)&&!this.unresolvedDeps[a.str]?(i=new Yh(this,a.str),t.splice(e,1),this.unresolvedDeps[a.str]=i,bs.addUnresolved(i)):this.viewmodel.register(a,this,"computed"));return r&&(this.softDeps=t.slice()),r}};var Xh=Jh,Zh=Lr,tm={FAILED_LOOKUP:!0},em=jr,nm={},am=Dr,rm=Nr,im=function(t,e){this.localKey=t,this.keypath=e.keypath,this.origin=e.origin,this.deps=[],this.unresolved=[],this.resolved=!1};im.prototype={forceResolution:function(){this.keypath=this.localKey,this.setup()},get:function(t,e){return this.resolved?this.origin.get(this.map(t),e):void 0},getValue:function(){return this.keypath?this.origin.get(this.keypath):void 0},initViewmodel:function(t){this.local=t,this.setup()},map:function(t){return void 0===typeof this.keypath?this.localKey:t.replace(this.localKey,this.keypath)},register:function(t,e,n){this.deps.push({keypath:t,dep:e,group:n}),this.resolved&&this.origin.register(this.map(t),e,n)},resolve:function(t){void 0!==this.keypath&&this.unbind(!0),this.keypath=t,this.setup()},set:function(t,e){this.resolved||this.forceResolution(),this.origin.set(this.map(t),e)},setup:function(){var t=this;void 0!==this.keypath&&(this.resolved=!0,this.deps.length&&(this.deps.forEach(function(e){var n=t.map(e.keypath);if(t.origin.register(n,e.dep,e.group),e.dep.setValue)e.dep.setValue(t.origin.get(n));else{if(!e.dep.invalidate)throw Error("An unexpected error occurred. Please raise an issue at https://github.com/ractivejs/ractive/issues - thanks!");e.dep.invalidate()}}),this.origin.mark(this.keypath)))},setValue:function(t){if(!this.keypath)throw Error("Mapping does not have keypath, cannot set value. Please raise an issue at https://github.com/ractivejs/ractive/issues - thanks!");this.origin.set(this.keypath,t)},unbind:function(t){var e=this;t||delete this.local.mappings[this.localKey],this.resolved&&(this.deps.forEach(function(t){e.origin.unregister(e.map(t.keypath),t.dep,t.group)}),this.tracker&&this.origin.unregister(this.keypath,this.tracker))},unregister:function(t,e,n){var a,r;if(this.resolved){for(a=this.deps,r=a.length;r--;)if(a[r].dep===e){a.splice(r,1);break}this.origin.unregister(this.map(t),e,n)}}};var om=Fr,sm=function(t,e){var n,a,r,i;return n={},a=0,r=t.map(function(t,r){var o,s,p;s=a,p=e.length;do{if(o=e.indexOf(t,s),-1===o)return i=!0,-1;s=o+1}while(n[o]&&p>s);return o===a&&(a+=1),o!==r&&(i=!0),n[o]=!0,o})},pm=Ir,um={},cm=Ur,lm=Gr,dm=zr,fm=Wr,hm=Kr,mm={implicit:!0},gm={noCascade:!0},vm=$r,bm=Yr,ym=function(t){var e,n,a=t.adapt,r=t.data,i=t.ractive,o=t.computed,s=t.mappings;this.ractive=i,this.adaptors=a,this.onchange=t.onchange,this.cache={},this.cacheMap=Eo(null),this.deps={computed:Eo(null),"default":Eo(null)},this.depsMap={computed:Eo(null),"default":Eo(null)},this.patternObservers=[],this.specials=Eo(null),this.wrapped=Eo(null),this.computations=Eo(null),this.captureGroups=[],this.unresolvedImplicitDependencies=[],this.changes=[],this.implicitChanges={},this.noCascade={},this.data=r,this.mappings=Eo(null);for(e in s)this.map(E(e),s[e]);if(r)for(e in r)(n=this.mappings[e])&&void 0===n.getValue()&&n.setValue(r[e]);for(e in o)s&&e in s&&l("Cannot map to a computed property ('%s')",e),this.compute(E(e),o[e]);this.ready=!0};ym.prototype={adapt:Vh,applyChanges:Hh,capture:Kh,clearCache:Qh,compute:Zh,get:em,init:am,map:rm,mark:om,merge:pm,register:cm,release:lm,reset:dm,set:fm,smartUpdate:hm,teardown:vm,unregister:bm};var xm=ym;Xr.prototype={constructor:Xr,begin:function(t){this.inProcess[t._guid]=!0},end:function(t){var e=t.parent;e&&this.inProcess[e._guid]?Zr(this.queue,e).push(t):ti(this,t),delete this.inProcess[t._guid]}};var _m=Xr,wm=ei,km=/\$\{([^\}]+)\}/g,Em=new is("construct"),Sm=new is("config"),Cm=new _m("init"),Pm=0,Am=["adaptors","components","decorators","easing","events","interpolators","partials","transitions"],Om=ii,Tm=ci;ci.prototype={bubble:function(){this.dirty||(this.dirty=!0,bs.addView(this))},update:function(){this.callback(this.fragment.getValue()),this.dirty=!1},rebind:function(t,e){this.fragment.rebind(t,e)},unbind:function(){this.fragment.unbind()}};var Rm=function(t,e,n,r,o){var s,p,u,c,l,d,f={},h={},g={},v=[];for(p=t.parentFragment,u=t.root,o=o||{},a(f,o),o.content=r||[],f[""]=o.content,e.defaults.el&&m("The <%s/> component has a default `el` property; it has been disregarded",t.name),c=p;c;){if(c.owner.type===Lu){l=c.owner.container;break}c=c.parent}return n&&Object.keys(n).forEach(function(e){var a,r,o=n[e];if("string"==typeof o)a=dc(o),h[e]=a?a.value:o;else if(0===o)h[e]=!0;else{if(!i(o))throw Error("erm wut");di(o)?(g[e]={origin:t.root.viewmodel,keypath:void 0},r=li(t,o[0],function(t){t.isSpecial?d?s.set(e,t.value):(h[e]=t.value,delete g[e]):d?s.viewmodel.mappings[e].resolve(t):g[e].keypath=t})):r=new Tm(t,o,function(t){d?s.set(e,t):h[e]=t}),v.push(r)}}),s=Eo(e.prototype),Om(s,{el:null,append:!0,data:h,partials:o,magic:u.magic||e.defaults.magic,modifyArrays:u.modifyArrays,adapt:u.adapt},{parent:u,component:t,container:l,mappings:g,inlinePartials:f,cssIds:p.cssIds}),d=!0,t.resolvers=v,s},Lm=fi,jm=function(t){var e,n;for(e=t.root;e;)(n=e._liveComponentQueries["_"+t.name])&&n.push(t.instance),e=e.parent},Mm=mi,Dm=gi,Nm=vi,Fm=bi,Im=yi,Bm=new is("teardown"),qm=_i,Um=function(t,e){this.init(t,e)};Um.prototype={detach:bh,find:xh,findAll:_h,findAllComponents:wh,findComponent:kh,findNextNode:Eh,firstNode:Sh,init:Mm,rebind:Dm,render:Nm,toString:Fm,unbind:Im,unrender:qm};var Vm=Um,Gm=function(t){this.type=Ou,this.value=t.template.c};Gm.prototype={detach:vc,firstNode:function(){return this.node},render:function(){return this.node||(this.node=document.createComment(this.value)),this.node},toString:function(){return""},unrender:function(t){t&&this.node.parentNode.removeChild(this.node)}};var zm=Gm,Wm=function(t){var e,n;this.type=Lu,this.container=e=t.parentFragment.root,this.component=n=e.component,this.container=e,this.containerFragment=t.parentFragment,this.parentFragment=n.parentFragment;var a=this.name=t.template.n||"",r=e._inlinePartials[a];r||(m('Could not find template for partial "'+a+'"',{ractive:t.root}),r=[]),this.fragment=new rg({owner:this,root:e.parent,template:r,pElement:this.containerFragment.pElement}),i(n.yielders[a])?n.yielders[a].push(this):n.yielders[a]=[this],bs.scheduleTask(function(){if(n.yielders[a].length>1)throw Error("A component template can only have one {{yield"+(a?" "+a:"")+"}} declaration at a time")})};Wm.prototype={detach:function(){return this.fragment.detach()},find:function(t){return this.fragment.find(t)},findAll:function(t,e){return this.fragment.findAll(t,e)},findComponent:function(t){return this.fragment.findComponent(t)},findAllComponents:function(t,e){return this.fragment.findAllComponents(t,e)},findNextNode:function(){return this.containerFragment.findNextNode(this)},firstNode:function(){return this.fragment.firstNode()},getValue:function(t){return this.fragment.getValue(t)},render:function(){return this.fragment.render()},unbind:function(){this.fragment.unbind()},unrender:function(t){this.fragment.unrender(t),N(this.component.yielders[this.name],this)},rebind:function(t,e){this.fragment.rebind(t,e)},toString:function(){return""+this.fragment}};var Hm=Wm,Km=function(t){this.declaration=t.template.a};Km.prototype={init:ko,render:ko,unrender:ko,teardown:ko,toString:function(){return""}};var Qm=Km,$m=wi,Ym=Ei,Jm=Si,Xm=Ci,Zm=Oi,tg=Ri,eg=function(t){this.init(t)};eg.prototype={bubble:cu,detach:lu,find:du,findAll:fu,findAllComponents:hu,findComponent:mu,findNextNode:gu,firstNode:vu,getArgsList:hc,getNode:mc,getValue:gc,init:$m,rebind:Ym,registerIndexRef:function(t){var e=this.registeredIndexRefs;-1===e.indexOf(t)&&e.push(t)},render:Jm,toString:Xm,unbind:Zm,unregisterIndexRef:function(t){var e=this.registeredIndexRefs;e.splice(e.indexOf(t),1)},unrender:tg};var ng,ag,rg=eg,ig=Li,og=["template","partials","components","decorators","events"],sg=new is("reset"),pg=function(t,e){function n(e,a,r){r&&r.partials[t]||e.forEach(function(e){e.type===Au&&e.getPartialName()===t&&a.push(e),e.fragment&&n(e.fragment.items,a,r),i(e.fragments)?n(e.fragments,a,r):i(e.items)?n(e.items,a,r):e.type===Ru&&e.instance&&n(e.instance.fragment.items,a,e.instance),e.type===Pu&&(i(e.attributes)&&n(e.attributes,a,r),i(e.conditionalAttributes)&&n(e.conditionalAttributes,a,r))})}var a,r=[];return n(this.fragment.items,r),this.partials[t]=e,a=bs.start(this,!0),r.forEach(function(e){e.value=void 0,e.setValue(t)}),bs.end(),a},ug=ji,cg=xp("reverse"),lg=Mi,dg=xp("shift"),fg=xp("sort"),hg=xp("splice"),mg=Ni,gg=Fi,vg=new is("teardown"),bg=Bi,yg=qi,xg=Ui,_g=new is("unrender"),wg=xp("unshift"),kg=Vi,Eg=new is("update"),Sg=Gi,Cg={add:Zo,animate:Es,detach:Cs,find:As,findAll:Fs,findAllComponents:Is,findComponent:Bs,findContainer:qs,findParent:Us,fire:Ws,get:Hs,insert:Qs,merge:Ys,observe:lp,observeOnce:dp,off:mp,on:gp,once:vp,pop:_p,push:wp,render:Tp,reset:ig,resetPartial:pg,resetTemplate:ug,reverse:cg,set:lg,shift:dg,sort:fg,splice:hg,subtract:mg,teardown:gg,toggle:bg,toHTML:yg,toHtml:yg,unrender:xg,unshift:wg,update:kg,updateModel:Sg},Pg=function(t,e,n){return n||Wi(t,e)?function(){var n,a="_super"in this,r=this._super;return this._super=e,n=t.apply(this,arguments),a&&(this._super=r),n}:t},Ag=Hi,Og=Yi,Tg=function(t){var e,n,a={};return t&&(e=t._ractive)?(a.ractive=e.root,a.keypath=e.keypath.str,a.index={},(n=Oc(e.proxy.parentFragment))&&(a.index=Oc.resolve(n)),a):a};ng=function(t){return this instanceof ng?void Om(this,t):new ng(t)},ag={DEBUG:{writable:!0,value:!0},DEBUG_PROMISES:{writable:!0,value:!0},extend:{value:Og},getNodeInfo:{value:Tg},parse:{value:Hp},Promise:{value:us},svg:{value:ao},magic:{value:eo},VERSION:{value:"0.7.3"},adaptors:{writable:!0,value:{}},components:{writable:!0,value:{}},decorators:{writable:!0,value:{}},easing:{writable:!0,value:po},events:{writable:!0,value:{}},interpolators:{writable:!0,value:Vo},partials:{writable:!0,value:{}},transitions:{writable:!0,value:{}}},Co(ng,ag),ng.prototype=a(Cg,so),ng.prototype.constructor=ng,ng.defaults=ng.prototype;var Rg="function";if(typeof Date.now!==Rg||typeof String.prototype.trim!==Rg||typeof Object.keys!==Rg||typeof Array.prototype.indexOf!==Rg||typeof Array.prototype.forEach!==Rg||typeof Array.prototype.map!==Rg||typeof Array.prototype.filter!==Rg||"undefined"!=typeof window&&typeof window.addEventListener!==Rg)throw Error("It looks like you're attempting to use Ractive.js in an older browser. You'll need to use one of the 'legacy builds' in order to continue - see http://docs.ractivejs.org/latest/legacy-builds for more information.");var Lg=ng;return Lg})},{}],206:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={oninit:function(){var t=this;this.observe("value",function(e,n,a){var r=t.get(),i=r.min,o=r.max,s=Math.clamp(i,o,e);t.animate("percentage",Math.round((s-i)/(o-i)*100))})}}}(r),r.exports.template={v:3,t:[" ",{p:[13,1,305],t:7,e:"div",a:{"class":"bar"},f:[{p:[14,3,326],t:7,e:"div",a:{"class":["barFill ",{t:2,r:"state",p:[14,23,346]}],style:["width: ",{t:2,r:"percentage",p:[14,48,371]},"%"]}}," ",{p:[15,3,398],t:7,e:"span",a:{"class":"barText"},f:[{t:16,p:[15,25,420]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],207:[function(t,e,n){var a=t(205),r={exports:{}};!function(e){"use strict";var n=t(338),a=t(337);e.exports={computed:{clickable:function(){return!this.get("enabled")||this.get("state")&&"toggle"!=this.get("state")?!1:!0},enabled:function(){return this.get("config.status")===n.UI_INTERACTIVE?!0:!1},styles:function(){var t="";if(this.get("class")&&(t+=" "+this.get("class")),this.get("tooltip-side")&&(t=" tooltip-"+this.get("tooltip-side")),this.get("grid")&&(t+=" gridable"),this.get("enabled")){var e=this.get("state"),n=this.get("style");return e?"inactive "+e+" "+t:"active normal "+n+" "+t}return"inactive disabled "+t}},oninit:function(){var t=this;this.on("press",function(e){var n=t.get(),r=n.action,i=n.params;(0,a.act)(t.get("config.ref"),r,i),e.node.blur()})},data:{iconStackToHTML:function(t){var e="",n=t.split(",");if(n.length){e+='';for(var a=n,r=Array.isArray(a),i=0,a=r?a:a[Symbol.iterator]();;){var o;if(r){if(i>=a.length)break;o=a[i++]}else{if(i=a.next(),i.done)break;o=i.value}var s=o,p=/([\w\-]+)\s*(\dx)/g,u=p.exec(s),c=u[1],l=u[2];e+=' '}}return e&&(e+=" "),e}}}}(r),r.exports.template={v:3,t:[" ",{p:[70,1,2019],t:7,e:"span",a:{"class":["button ",{t:2,r:"styles",p:[70,21,2039]}],unselectable:"on","data-tooltip":[{t:2,r:"tooltip",p:[73,17,2124]}]},m:[{t:4,f:["tabindex='0'"],r:"clickable",p:[72,3,2075]}],v:{"mouseover-mousemove":"hover",mouseleave:"unhover","click-enter":{n:[{t:4,f:["press"],r:"clickable",p:[76,19,2217]}],d:[]}},f:[{t:4,f:[{p:[78,5,2265],t:7,e:"i",a:{"class":["fa fa-",{t:2,r:"icon",p:[78,21,2281]}]}}],n:50,r:"icon",p:[77,3,2247]}," ",{t:4,f:[{t:3,x:{r:["iconStackToHTML","icon_stack"],s:"_0(_1)"},p:[81,6,2335]}],n:50,r:"icon_stack",p:[80,3,2310]}," ",{t:16,p:[83,3,2383]}]}]},e.exports=a.extend(r.exports)},{205:205,337:337,338:338}],208:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"display"},f:[{t:4,f:[{p:[3,5,44],t:7,e:"header",f:[{p:[4,7,60],t:7,e:"h3",f:[{t:2,r:"title",p:[4,11,64]}]}," ",{t:4,f:[{p:[6,9,110],t:7,e:"div",a:{"class":"buttonRight"},f:[{t:16,n:"button",p:[6,34,135]}]}],n:50,r:"button",p:[5,7,86]}]}],n:50,r:"title",p:[2,3,25]}," ",{p:[10,3,202],t:7,e:"article",f:[{t:16,p:[11,5,217]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],209:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={oninit:function(){var t=this;this.on("clear",function(){t.set("value",""),t.find("input").focus()})}}}(r),r.exports.template={v:3,t:[" ",{p:[12,1,170],t:7,e:"input",a:{type:"text",value:[{t:2,r:"value",p:[12,27,196]}],placeholder:[{t:2,r:"placeholder",p:[12,51,220]}]}}," ",{p:[13,1,240],t:7,e:"ui-button",a:{icon:"refresh"},v:{press:"clear"}}]},e.exports=a.extend(r.exports)},{205:205}],210:[function(t,e,n){var a=t(205),r={exports:{}};!function(e){"use strict";e.exports={data:{graph:t(201),xaccessor:function(t){return t.x},yaccessor:function(t){return t.y}},computed:{size:function(){var t=this.get("points");return t[0].length},scale:function(){var t=this.get("points");return Math.max.apply(Math,Array.map(t,function(t){return Math.max.apply(Math,Array.map(t,function(t){return t.y}))}))},xaxis:function(){var t=this.get("xinc"),e=this.get("size");return Array.from(Array(e).keys()).filter(function(e){return e&&e%t==0})},yaxis:function(){var t=this.get("yinc"),e=this.get("scale");return Array.from(Array(t).keys()).map(function(t){return Math.round(e*(++t/100)*10)})}},oninit:function(){var t=this;this.on({enter:function(t){this.set("selected",t.index.count)},exit:function(t){this.set("selected")}}),window.addEventListener("resize",function(e){t.set("width",t.el.clientWidth)})},onrender:function(){this.set("width",this.el.clientWidth)}}}(r),r.exports.template={v:3,t:[" ",{p:[47,1,1269],t:7,e:"svg",a:{"class":"linegraph",width:"100%",height:[{t:2,x:{r:["height"],s:"_0+10"},p:[47,45,1313]}]},f:[{p:[48,3,1334],t:7,e:"g",a:{transform:"translate(0, 5)"},f:[{t:4,f:[{t:4,f:[{p:[51,9,1504],t:7,e:"line",a:{x1:[{t:2,x:{r:["xscale","."],s:"_0(_1)"},p:[51,19,1514]}],x2:[{t:2,x:{r:["xscale","."],s:"_0(_1)"},p:[51,38,1533]}],y1:"0",y2:[{t:2,r:"height",p:[51,64,1559]}],stroke:"darkgray"}}," ",{t:4,f:[{p:[53,11,1635],t:7,e:"text",a:{x:[{t:2,x:{r:["xscale","."],s:"_0(_1)"},p:[53,20,1644]}],y:[{t:2,x:{r:["height"],s:"_0-5"},p:[53,38,1662]}],"text-anchor":"middle",fill:"white"},f:[{t:2,x:{r:["size",".","xfactor"],s:"(_0-_1)*_2"},p:[53,88,1712]}," ",{t:2,r:"xunit",p:[53,113,1737]}]}],n:50,x:{r:["@index"],s:"_0%2==0"},p:[52,9,1600]}],n:52,r:"xaxis",p:[50,7,1479]}," ",{t:4,f:[{p:[57,9,1820],t:7,e:"line",a:{x1:"0",x2:[{t:2,r:"width",p:[57,26,1837]}],y1:[{t:2,x:{r:["yscale","."],s:"_0(_1)"},p:[57,41,1852]}],y2:[{t:2,x:{r:["yscale","."],s:"_0(_1)"},p:[57,60,1871]}],stroke:"darkgray"}}," ",{p:[58,9,1915],t:7,e:"text",a:{x:"0",y:[{t:2,x:{r:["yscale","."],s:"_0(_1)-5"},p:[58,24,1930]}],"text-anchor":"begin",fill:"white"},f:[{t:2,x:{r:[".","yfactor"],s:"_0*_1"},p:[58,76,1982]}," ",{t:2,r:"yunit",p:[58,92,1998]}]}],n:52,r:"yaxis",p:[56,7,1795]}," ",{t:4,f:[{p:[61,9,2071],t:7,e:"path",a:{d:[{t:2,x:{r:["area.path"],s:"_0.print()"},p:[61,18,2080]}],fill:[{t:2,rx:{r:"colors",m:[{t:30,n:"curve"}]},p:[61,47,2109]}],opacity:"0.1"}}],n:52,i:"curve",r:"curves",p:[60,7,2039]}," ",{t:4,f:[{p:[64,9,2200],t:7,e:"path",a:{d:[{t:2,x:{r:["line.path"],s:"_0.print()"},p:[64,18,2209]}],stroke:[{t:2,rx:{r:"colors",m:[{t:30,n:"curve"}]},p:[64,49,2240]}],fill:"none"}}],n:52,i:"curve",r:"curves",p:[63,7,2168]}," ",{t:4,f:[{t:4,f:[{p:[68,11,2375],t:7,e:"circle",a:{transform:["translate(",{t:2,r:".",p:[68,40,2404]},")"],r:[{t:2,x:{r:["selected","count"],s:"_0==_1?10:4"},p:[68,51,2415]}],fill:[{t:2,rx:{r:"colors",m:[{t:30,n:"curve"}]},p:[68,89,2453]}]},v:{mouseenter:"enter",mouseleave:"exit"}}],n:52,i:"count",x:{r:["line.path"],s:"_0.points()"},p:[67,9,2329]}],n:52,i:"curve",r:"curves",p:[66,7,2297]}," ",{t:4,f:[{t:4,f:[{t:4,f:[{p:[74,13,2678],t:7,e:"text",a:{transform:["translate(",{t:2,r:".",p:[74,40,2705]},") ",{t:2,x:{r:["count","size"],s:'_0<=_1/2?"translate(15, 4)":"translate(-15, 4)"'},p:[74,47,2712]}],"text-anchor":[{t:2,x:{r:["count","size"],s:'_0<=_1/2?"start":"end"'},p:[74,126,2791]}],fill:"white"},f:[{t:2,x:{r:["count","item","yfactor"],s:"_1[_0].y*_2"},p:[75,15,2861]}," ",{t:2,r:"yunit",p:[75,43,2889]}," @ ",{t:2,x:{r:["size","count","item","xfactor"],s:"(_0-_2[_1].x)*_3"},p:[75,55,2901]}," ",{t:2,r:"xunit",p:[75,92,2938]}]}],n:50,x:{r:["selected","count"],s:"_0==_1"},p:[73,11,2638]}],n:52,i:"count",x:{r:["line.path"],s:"_0.points()"},p:[72,9,2592]}],n:52,i:"curve",r:"curves",p:[71,7,2560]}," ",{t:4,f:[{p:[81,9,3063],t:7,e:"g",a:{transform:["translate(",{t:2,x:{r:["width","curves.length","@index"],s:"(_0/(_1+1))*(_2+1)"},p:[81,33,3087]},", 10)"]},f:[{p:[82,11,3154],t:7,e:"circle",a:{r:"4",fill:[{t:2,rx:{r:"colors",m:[{t:30,n:"curve"}]},p:[82,31,3174]}]}}," ",{p:[83,11,3206],t:7,e:"text",a:{x:"8",y:"4",fill:"white"},f:[{t:2,rx:{r:"legend",m:[{t:30,n:"curve"}]},p:[83,42,3237]}]}]}],n:52,i:"curve",r:"curves",p:[80,7,3031]}],x:{r:["graph","points","xaccessor","yaccessor","width","height"],s:"_0({data:_1,xaccessor:_2,yaccessor:_3,width:_4,height:_5})"},p:[49,5,1371]}]}]}]},e.exports=a.extend(r.exports)},{201:201,205:205}],211:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"notice"},f:[{t:16,p:[2,3,24]}]}]},e.exports=a.extend(r.exports)},{205:205}],212:[function(t,e,n){var a=t(205),r={exports:{}};!function(e){"use strict";var n=t(337),a=t(339);e.exports={oninit:function(){var t=this,e=a.resize.bind(this),r=function(){return t.set({resize:!1,x:null,y:null})};this.observe("config.fancy",function(a,i,o){(0,n.winset)(t.get("config.window"),"can-resize",!a),a?(document.addEventListener("mousemove",e),document.addEventListener("mouseup",r)):(document.removeEventListener("mousemove",e),document.removeEventListener("mouseup",r))}),this.on("resize",function(){return t.toggle("resize")})}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[28,3,766],t:7,e:"div",a:{"class":"resize"},v:{mousedown:"resize"}}],n:50,r:"config.fancy",p:[27,1,742]}]},e.exports=a.extend(r.exports)},{205:205,337:337,339:339}],213:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"section",a:{"class":[{t:4,f:["candystripe"],r:"candystripe",p:[1,17,16]}]},f:[{t:4,f:[{p:[3,5,84],t:7,e:"span",a:{"class":"label",style:[{t:4,f:["color:",{t:2,r:"labelcolor",p:[3,53,132]}],r:"labelcolor",p:[3,32,111]}]},f:[{t:2,r:"label",p:[3,84,163]},":"]}],n:50,r:"label",p:[2,3,65]}," ",{t:4,f:[{t:16,p:[6,5,215]}],n:50,r:"nowrap",p:[5,3,195]},{t:4,n:51,f:[{p:[8,5,242],t:7,e:"div",a:{"class":"content",style:[{t:4,f:["float:right;"],r:"right",p:[8,33,270]}]},f:[{t:16,p:[9,7,312]}]}],r:"nowrap"}]}]},e.exports=a.extend(r.exports)},{205:205}],214:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"subdisplay"},f:[{t:4,f:[{p:[3,5,47],t:7,e:"header",f:[{p:[4,7,63],t:7,e:"h4",f:[{t:2,r:"title",p:[4,11,67]}]}," ",{t:4,f:[{t:16,n:"button",p:[5,21,103]}],n:50,r:"button",p:[5,7,89]}]}],n:50,r:"title",p:[2,3,28]}," ",{p:[8,3,156],t:7,e:"article",f:[{t:16,p:[9,5,171]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],215:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={oninit:function(){var t=this;this.set("active",this.findComponent("tab").get("name")),this.on("switch",function(e){t.set("active",e.node.textContent.trim())}),this.observe("active",function(e,n,a){for(var r=t.findAllComponents("tab"),i=Array.isArray(r),o=0,r=i?r:r[Symbol.iterator]();;){var s;if(i){if(o>=r.length)break;s=r[o++]}else{if(o=r.next(),o.done)break;s=o.value}var p=s;p.set("shown",p.get("name")===e)}})}}}(r),r.exports.template={v:3,t:[" "," ",{p:[20,1,524],t:7,e:"header",f:[{t:4,f:[{p:[22,5,556],t:7,e:"ui-button",a:{pane:[{t:2,r:".",p:[22,22,573]}]},v:{press:"switch"},f:[{t:2,r:".",p:[22,47,598]}]}],n:52,r:"tabs",p:[21,3,536]}]}," ",{p:[25,1,641],t:7,e:"ui-display",f:[{t:8,r:"content",p:[26,3,657]}]}]},r.exports.components=r.exports.components||{};var i={tab:t(216)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,216:216}],216:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:16,p:[2,3,17]}],n:50,r:"shown",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{205:205}],217:[function(t,e,n){var a=t(205),r={exports:{}};!function(e){"use strict";var n=t(338),a=t(337),r=t(339);e.exports={computed:{visualStatus:function(){switch(this.get("config.status")){case n.UI_INTERACTIVE:return"good";case n.UI_UPDATE:return"average";case n.UI_DISABLED:return"bad";default:return"bad"}}},oninit:function(){var t=this,e=r.drag.bind(this),n=function(e){return t.set({drag:!1,x:null,y:null})};this.observe("config.fancy",function(r,i,o){(0,a.winset)(t.get("config.window"),"titlebar",!r&&t.get("config.titlebar")),r?(document.addEventListener("mousemove",e),document.addEventListener("mouseup",n)):(document.removeEventListener("mousemove",e),document.removeEventListener("mouseup",n))}),this.on({drag:function(){this.toggle("drag")},close:function(){(0,a.winset)(this.get("config.window"),"is-visible",!1),window.location.href=(0,a.href)({command:"uiclose "+this.get("config.ref")},"winset")},minimize:function(){(0,a.winset)(this.get("config.window"),"is-minimized",!0)}})}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[50,3,1440],t:7,e:"header",a:{"class":"titlebar"},v:{mousedown:"drag"},f:[{p:[51,5,1491],t:7,e:"i",a:{"class":["statusicon fa fa-eye fa-2x ",{t:2,r:"visualStatus",p:[51,42,1528]}]}}," ",{p:[52,5,1556],t:7,e:"span",a:{"class":"title"},f:[{t:16,p:[52,25,1576]}]}," ",{t:4,f:[{p:[54,7,1626],t:7,e:"i",a:{"class":"minimize fa fa-minus fa-2x"},v:{click:"minimize"}}," ",{p:[55,7,1696],t:7,e:"i",a:{"class":"close fa fa-close fa-2x"},v:{click:"close"}}],n:50,r:"config.fancy",p:[53,5,1598]}]}],n:50,r:"config.titlebar",p:[49,1,1413]}]},e.exports=a.extend(r.exports)},{205:205,337:337,338:338,339:339}],218:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";var e=[11,10,9,8];t.exports={data:{userAgent:navigator.userAgent},computed:{ie:function(){if(document.documentMode)return document.documentMode;for(var t in e){var n=document.createElement("div");if(n.innerHTML="",n.getElementsByTagName("span").length)return t}}},oninit:function(){var t=this;this.on("debug",function(){return t.toggle("debug")})}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[27,3,662],t:7,e:"ui-notice",f:[{p:[28,5,679],t:7,e:"span",f:["You have an old (IE",{t:2,r:"ie",p:[28,30,704]},"), end-of-life (click 'EOL Info' for more information) version of Internet Explorer installed."]},{p:[28,137,811],t:7,e:"br"}," ",{p:[29,5,822],t:7,e:"span",f:["To upgrade, click 'Upgrade IE' to download IE11 from Microsoft."]},{p:[29,81,898],t:7,e:"br"}," ",{p:[30,5,909],t:7,e:"span",f:["If you are unable to upgrade directly, click 'IE VMs' to download a VM with IE11 or Edge from Microsoft."]},{p:[30,122,1026],t:7,e:"br"}," ",{p:[31,5,1037],t:7,e:"span",f:["Otherwise, click 'No Frills' below to disable potentially incompatible features (and this message)."]}," ",{p:[32,5,1155],t:7,e:"hr"}," ",{p:[33,5,1166],t:7,e:"ui-button",a:{icon:"close",action:"tgui:nofrills"},f:["No Frills"]}," ",{p:[34,5,1240],t:7,e:"ui-button",a:{icon:"internet-explorer",action:"tgui:link",params:'{"url": "http://windows.microsoft.com/en-us/internet-explorer/download-ie"}'},f:["Upgrade IE"]}," ",{p:[36,5,1416],t:7,e:"ui-button",a:{icon:"edge",action:"tgui:link",params:'{"url": "https://dev.windows.com/en-us/microsoft-edge/tools/vms"}'},f:["IE VMs"]}," ",{p:[38,5,1565],t:7,e:"ui-button",a:{icon:"info",action:"tgui:link",params:'{"url": "https://support.microsoft.com/en-us/lifecycle#gp/Microsoft-Internet-Explorer"}'},f:["EOL Info"]}," ",{p:[40,5,1738],t:7,e:"ui-button",a:{icon:"bug"},v:{press:"debug"},f:["Debug Info"]}," ",{t:4,f:[{p:[42,7,1826],t:7,e:"hr"}," ",{p:[43,7,1839],t:7,e:"span",f:["Detected: IE",{t:2,r:"ie",p:[43,25,1857]}]},{p:[43,38,1870],t:7,e:"br"}," ",{p:[44,7,1883],t:7,e:"span",f:["User Agent: ",{t:2,r:"userAgent",p:[44,25,1901]}]}],n:50,r:"debug",p:[41,5,1805]}]}],n:50,x:{r:["config.fancy","ie"],s:"_0&&_1&&_1<11"},p:[26,1,621]}]},e.exports=a.extend(r.exports)},{205:205}],219:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{powerState:function(t){switch(t){case 2:return"good";case 1:return"average";default:
return"bad"}},shockState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[22,1,348],t:7,e:"ui-display",a:{title:"Power Status"},f:[{p:[23,2,384],t:7,e:"ui-section",a:{label:"Main"},f:[{p:[24,3,413],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.power.main"],s:"_0(_1)"},p:[24,16,426]}]},f:[{t:2,x:{r:["data.power.main"],s:'_0?"Online":"Offline"'},p:[24,49,459]}]}," ",{t:4,f:["[ ",{p:[26,6,567],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.main_1","data.wires.main_2"],s:"!_0||!_1"},p:[25,3,512]},{t:4,n:51,f:[{t:4,f:["[ ",{t:2,r:"data.power.main_timeleft",p:[29,7,674]}," seconds left ]"],n:50,x:{r:["data.power.main_timeleft"],s:"_0>0"},p:[28,4,630]}],x:{r:["data.wires.main_1","data.wires.main_2"],s:"!_0||!_1"}}," ",{p:[32,3,744],t:7,e:"div",a:{style:"float:right"},f:[{p:[33,4,774],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"disrupt-main",state:[{t:2,x:{r:["data.power.main"],s:'_0?null:"disabled"'},p:[33,63,833]}]},f:["Disrupt"]}]}]}," ",{p:[36,2,922],t:7,e:"ui-section",a:{label:"Backup"},f:[{p:[37,3,953],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.power.backup"],s:"_0(_1)"},p:[37,16,966]}]},f:[{t:2,x:{r:["data.power.backup"],s:'_0?"Online":"Offline"'},p:[37,51,1001]}]}," ",{t:4,f:["[ ",{p:[39,6,1115],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.backup_1","data.wires.backup_2"],s:"!_0||!_1"},p:[38,3,1056]},{t:4,n:51,f:[{t:4,f:["[ ",{t:2,r:"data.power.backup_timeleft",p:[42,7,1224]}," seconds left ]"],n:50,x:{r:["data.power.backup_timeleft"],s:"_0>0"},p:[41,4,1178]}],x:{r:["data.wires.backup_1","data.wires.backup_2"],s:"!_0||!_1"}}," ",{p:[45,3,1296],t:7,e:"div",a:{style:"float:right"},f:[{p:[46,4,1326],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"disrupt-backup",state:[{t:2,x:{r:["data.power.backup"],s:'_0?null:"disabled"'},p:[46,65,1387]}]},f:["Disrupt"]}]}]}," ",{p:[49,2,1478],t:7,e:"ui-section",a:{label:"Electrify"},f:[{p:[50,3,1512],t:7,e:"span",a:{"class":[{t:2,x:{r:["shockState","data.shock"],s:"_0(_1)"},p:[50,16,1525]}]},f:[{t:2,x:{r:["data.shock"],s:'_0==2?"Safe":"Electrified"'},p:[50,44,1553]}]}," ",{t:4,f:["[ ",{p:[52,6,1640],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.shock"],s:"!_0"},p:[51,3,1608]},{t:4,n:51,f:[{t:4,f:["[ ",{p:[55,7,1742],t:7,e:"span",a:{"class":"bad"},f:[{t:2,r:"data.shock_timeleft",p:[55,25,1760]}," seconds left"]}," ]"],n:50,x:{r:["data.shock_timeleft"],s:"_0>0"},p:[54,4,1703]}," ",{t:4,f:["[ ",{p:[58,7,1863],t:7,e:"span",a:{"class":"bad"},f:["Permanent"]}," ]"],n:50,x:{r:["data.shock_timeleft"],s:"_0==-1"},p:[57,4,1822]}],x:{r:["data.wires.shock"],s:"!_0"}}," ",{p:[61,3,1926],t:7,e:"div",a:{style:"float:right"},f:[{p:[62,4,1956],t:7,e:"ui-button",a:{icon:"wrench",action:"shock-restore",state:[{t:2,x:{r:["data.wires.shock","data.shock"],s:'_0&&_1==0?null:"disabled"'},p:[62,59,2011]}]},f:["Restore"]}," ",{p:[63,4,2094],t:7,e:"ui-button",a:{icon:"bolt",action:"shock-temp",state:[{t:2,x:{r:["data.wires.shock"],s:"!_0"},p:[63,54,2144]}]},f:["Set (Temporary)"]}," ",{p:[64,4,2199],t:7,e:"ui-button",a:{icon:"bolt",action:"shock-perm",state:[{t:2,x:{r:["data.wires.shock"],s:"!_0"},p:[64,53,2248]}]},f:["Set (Permanent)"]}]}]}]}," ",{p:[68,1,2341],t:7,e:"ui-display",a:{title:"Access & Door Control"},f:[{p:[69,2,2386],t:7,e:"ui-section",a:{label:"ID Scan"},f:[{t:4,f:["[ ",{p:[71,6,2455],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.id_scanner"],s:"!_0"},p:[70,3,2418]}," ",{p:[73,3,2516],t:7,e:"div",a:{style:"float:right"},f:[{p:[74,4,2546],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.id_scanner"],s:"!_0"},p:[74,22,2564]}],icon:"power-off",action:"idscan-on",style:[{t:2,x:{r:["data.id_scanner"],s:'_0?"selected":""'},p:[74,93,2635]}]},f:["Enabled"]}," ",{p:[75,4,2698],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.id_scanner"],s:"!_0"},p:[75,22,2716]}],icon:"close",action:"idscan-off",style:[{t:2,x:{r:["data.id_scanner"],s:'_0?"":"selected"'},p:[75,90,2784]}]},f:["Disabled"]}]}]}," ",{p:[78,2,2872],t:7,e:"ui-section",a:{label:"Emergency Access"},f:[{p:[79,3,2913],t:7,e:"div",a:{style:"float:right"},f:[{p:[80,4,2943],t:7,e:"ui-button",a:{icon:"power-off",action:"emergency-on",style:[{t:2,x:{r:["data.emergency"],s:'_0?"selected":""'},p:[80,61,3e3]}]},f:["Enabled"]}," ",{p:[81,4,3062],t:7,e:"ui-button",a:{icon:"close",action:"emergency-off",style:[{t:2,x:{r:["data.emergency"],s:'_0?"":"selected"'},p:[81,58,3116]}]},f:["Disabled"]}]}]}," ",{p:[84,2,3203],t:7,e:"br"}," ",{p:[85,2,3212],t:7,e:"ui-section",a:{label:"Door bolts"},f:[{t:4,f:["[ ",{p:[87,6,3279],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.bolts"],s:"!_0"},p:[86,3,3247]}," ",{p:[89,3,3340],t:7,e:"div",a:{style:"float:right"},f:[{p:[90,4,3370],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.bolts"],s:"!_0"},p:[90,22,3388]}],icon:"unlock",action:"bolt-raise",style:[{t:2,x:{r:["data.locked"],s:'_0?"":"selected"'},p:[90,85,3451]}]},f:["Raised"]}," ",{p:[91,4,3509],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.bolts"],s:"!_0"},p:[91,22,3527]}],icon:"lock",action:"bolt-drop",style:[{t:2,x:{r:["data.locked"],s:'_0?"selected":""'},p:[91,82,3587]}]},f:["Dropped"]}]}]}," ",{p:[94,2,3670],t:7,e:"ui-section",a:{label:"Door bolt lights"},f:[{t:4,f:["[ ",{p:[96,6,3744],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.lights"],s:"!_0"},p:[95,3,3711]}," ",{p:[98,3,3805],t:7,e:"div",a:{style:"float:right"},f:[{p:[99,4,3835],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.lights"],s:"!_0"},p:[99,22,3853]}],icon:"power-off",action:"light-on",style:[{t:2,x:{r:["data.lights"],s:'_0?"selected":""'},p:[99,88,3919]}]},f:["Enabled"]}," ",{p:[100,4,3978],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.lights"],s:"!_0"},p:[100,22,3996]}],icon:"close",action:"light-off",style:[{t:2,x:{r:["data.lights"],s:'_0?"":"selected"'},p:[100,85,4059]}]},f:["Disabled"]}]}]}," ",{p:[103,2,4143],t:7,e:"ui-section",a:{label:"Door force sensors"},f:[{t:4,f:["[ ",{p:[105,6,4217],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.safe"],s:"!_0"},p:[104,3,4186]}," ",{p:[107,3,4278],t:7,e:"div",a:{style:"float:right"},f:[{p:[108,4,4308],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.safe"],s:"!_0"},p:[108,22,4326]}],icon:"power-off",action:"safe-on",style:[{t:2,x:{r:["data.safe"],s:'_0?"selected":""'},p:[108,85,4389]}]},f:["Enabled"]}," ",{p:[109,4,4446],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.safe"],s:"!_0"},p:[109,22,4464]}],icon:"close",action:"safe-off",style:[{t:2,x:{r:["data.safe"],s:'_0?"":"selected"'},p:[109,82,4524]}]},f:["Disabled"]}]}]}," ",{p:[112,2,4606],t:7,e:"ui-section",a:{label:"Door timing saftey"},f:[{t:4,f:["[ ",{p:[114,6,4682],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.timing"],s:"!_0"},p:[113,3,4649]}," ",{p:[116,3,4743],t:7,e:"div",a:{style:"float:right"},f:[{p:[117,4,4773],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.timing"],s:"!_0"},p:[117,22,4791]}],icon:"power-off",action:"speed-on",style:[{t:2,x:{r:["data.speed"],s:'_0?"selected":""'},p:[117,88,4857]}]},f:["Enabled"]}," ",{p:[118,4,4915],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.timing"],s:"!_0"},p:[118,22,4933]}],icon:"close",action:"speed-off",style:[{t:2,x:{r:["data.speed"],s:'_0?"":"selected"'},p:[118,85,4996]}]},f:["Disabled"]}]}]}," ",{p:[121,2,5079],t:7,e:"br"}," ",{p:[122,2,5088],t:7,e:"ui-section",a:{label:"Door control"},f:[{t:4,f:["[ ",{p:[124,6,5166],t:7,e:"span",a:{"class":"bad"},f:["Door is ",{t:2,x:{r:["data.locked","data.welded"],s:'(_0?"bolted":"")+(_0&&_1?" and ":"")+(_1?"welded":"")'},p:[124,32,5192]}]}," ]"],n:50,x:{r:["data.locked","data.welded"],s:"_0||_1"},p:[123,3,5125]}," ",{p:[126,3,5327],t:7,e:"div",a:{style:"float:right"},f:[{p:[127,4,5357],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.locked","data.welded","data.opened"],s:'(_0||_1)||(_2&&"disabled")'},p:[127,22,5375]}],icon:"sign-out",action:"open-close"},f:["Open door"]}," ",{p:[128,4,5502],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.locked","data.welded","data.opened"],s:'(_0||_1)||(!_2&&"disabled")'},p:[128,22,5520]}],icon:"sign-in",action:"open-close"},f:["Close door"]}]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],220:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" "," "," "," "," ",{p:[7,1,267],t:7,e:"ui-notice",f:[{t:4,f:[{p:[9,5,312],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[10,7,355],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[10,24,372]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[10,75,423]}]}]}],n:50,r:"data.siliconUser",p:[8,3,282]},{t:4,n:51,f:[{p:[13,5,514],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[13,31,540]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[16,1,625],t:7,e:"status"}," ",{t:4,f:[{t:4,f:[{p:[19,7,719],t:7,e:"ui-display",a:{title:"Air Controls"},f:[{p:[20,9,762],t:7,e:"ui-section",f:[{p:[21,11,786],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.atmos_alarm"],s:'_0?"exclamation-triangle":"exclamation"'},p:[21,28,803]}],style:[{t:2,x:{r:["data.atmos_alarm"],s:'_0?"caution":null'},p:[21,98,873]}],action:[{t:2,x:{r:["data.atmos_alarm"],s:'_0?"reset":"alarm"'},p:[22,23,937]}]},f:["Area Atmosphere Alarm"]}]}," ",{p:[24,9,1045],t:7,e:"ui-section",f:[{p:[25,11,1069],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0==3?"exclamation-triangle":"exclamation"'},p:[25,28,1086]}],style:[{t:2,x:{r:["data.mode"],s:'_0==3?"danger":null'},p:[25,96,1154]}],action:"mode",params:['{"mode": ',{t:2,x:{r:["data.mode"],s:"_0==3?1:3"},p:[26,44,1236]},"}"]},f:["Panic Siphon"]}]}," ",{p:[28,9,1322],t:7,e:"br"}," ",{p:[29,9,1337],t:7,e:"ui-section",f:[{p:[30,11,1361],t:7,e:"ui-button",a:{icon:"sign-out",action:"tgui:view",params:'{"screen": "vents"}'},f:["Vent Controls"]}]}," ",{p:[32,9,1494],t:7,e:"ui-section",f:[{p:[33,11,1518],t:7,e:"ui-button",a:{icon:"filter",action:"tgui:view",params:'{"screen": "scrubbers"}'},f:["Scrubber Controls"]}]}," ",{p:[35,9,1657],t:7,e:"ui-section",f:[{p:[36,11,1681],t:7,e:"ui-button",a:{icon:"cog",action:"tgui:view",params:'{"screen": "modes"}'},f:["Operating Mode"]}]}," ",{p:[38,9,1810],t:7,e:"ui-section",f:[{p:[39,11,1834],t:7,e:"ui-button",a:{icon:"bar-chart",action:"tgui:view",params:'{"screen": "thresholds"}'},f:["Alarm Thresholds"]}]}]}],n:50,x:{r:["config.screen"],s:'_0=="home"'},p:[18,3,680]},{t:4,n:51,f:[{t:4,n:50,x:{r:["config.screen"],s:'_0=="vents"'},f:[{p:[43,5,2032],t:7,e:"vents"}]},{t:4,n:50,x:{r:["config.screen"],s:'(!(_0=="vents"))&&(_0=="scrubbers")'},f:[" ",{p:[45,5,2089],t:7,e:"scrubbers"}]},{t:4,n:50,x:{r:["config.screen"],s:'(!(_0=="vents"))&&((!(_0=="scrubbers"))&&(_0=="modes"))'},f:[" ",{p:[47,5,2146],t:7,e:"modes"}]},{t:4,n:50,x:{r:["config.screen"],s:'(!(_0=="vents"))&&((!(_0=="scrubbers"))&&((!(_0=="modes"))&&(_0=="thresholds")))'},f:[" ",{p:[49,5,2204],t:7,e:"thresholds"}]}],x:{r:["config.screen"],s:'_0=="home"'}}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[17,1,636]}]},r.exports.components=r.exports.components||{};var i={vents:t(226),modes:t(222),thresholds:t(225),status:t(224),scrubbers:t(223)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,222:222,223:223,224:224,225:225,226:226}],221:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-button",a:{icon:"arrow-left",action:"tgui:view",params:'{"screen": "home"}'},f:["Back"]}]},e.exports=a.extend(r.exports)},{205:205}],222:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:{button:[{p:[5,5,115],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Operating Modes",button:0},f:[" ",{t:4,f:[{p:[8,5,168],t:7,e:"ui-section",f:[{p:[9,7,188],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["selected"],s:'_0?"check-square-o":"square-o"'},p:[9,24,205]}],state:[{t:2,x:{r:["selected","danger"],s:'_0?_1?"danger":"selected":null'},p:[10,16,267]}],action:"mode",params:['{"mode": ',{t:2,r:"mode",p:[11,40,361]},"}"]},f:[{t:2,r:"name",p:[11,51,372]}]}]}],n:52,r:"data.modes",p:[7,3,142]}]}]},r.exports.components=r.exports.components||{};var i={back:t(221)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,221:221}],223:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" "," ",{p:{button:[{p:[6,5,185],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Scrubber Controls",button:0},f:[" ",{t:4,f:[{p:[9,5,242],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"long_name",p:[9,27,264]}]},f:[{p:[10,7,287],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[11,9,323],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["power"],s:'_0?"power-off":"close"'},p:[11,26,340]}],style:[{t:2,x:{r:["power"],s:'_0?"selected":null'},p:[11,68,382]}],action:"power",params:['{"id_tag": "',{t:2,r:"id_tag",p:[12,46,459]},'", "val": ',{t:2,x:{r:["power"],s:"+!_0"},p:[12,66,479]},"}"]},f:[{t:2,x:{r:["power"],s:'_0?"On":"Off"'},p:[12,80,493]}]}]}," ",{p:[14,7,558],t:7,e:"ui-section",a:{label:"Mode"},f:[{p:[15,9,593],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["scrubbing"],s:'_0?"filter":"sign-in"'},p:[15,26,610]}],style:[{t:2,x:{r:["scrubbing"],s:'_0?null:"danger"'},p:[15,71,655]}],action:"scrubbing",params:['{"id_tag": "',{t:2,r:"id_tag",p:[16,50,738]},'", "val": ',{t:2,x:{r:["scrubbing"],s:"+!_0"},p:[16,70,758]},"}"]},f:[{t:2,x:{r:["scrubbing"],s:'_0?"Scrubbing":"Siphoning"'},p:[16,88,776]}]}]}," ",{p:[18,7,858],t:7,e:"ui-section",a:{label:"Range"},f:[{p:[19,9,894],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["widenet"],s:'_0?"expand":"compress"'},p:[19,26,911]}],style:[{t:2,x:{r:["widenet"],s:'_0?"selected":null'},p:[19,70,955]}],action:"widenet",params:['{"id_tag": "',{t:2,r:"id_tag",p:[20,48,1036]},'", "val": ',{t:2,x:{r:["widenet"],s:"+!_0"},p:[20,68,1056]},"}"]},f:[{t:2,x:{r:["widenet"],s:'_0?"Expanded":"Normal"'},p:[20,84,1072]}]}]}," ",{p:[22,7,1148],t:7,e:"ui-section",a:{label:"Filters"},f:[{p:[23,9,1186],t:7,e:"filters"}]}]}],n:52,r:"data.scrubbers",p:[8,3,212]},{t:4,n:51,f:[{p:[27,5,1257],t:7,e:"span",a:{"class":"bad"},f:["Error: No scrubbers connected."]}],r:"data.scrubbers"}]}]},r.exports.components=r.exports.components||{};var i={filters:t(313),back:t(221)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,221:221,313:313}],224:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Air Status"},f:[{t:4,f:[{t:4,f:[{p:[4,7,110],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[4,26,129]}]},f:[{p:[5,6,146],t:7,e:"span",a:{"class":[{t:2,x:{r:["danger_level"],s:'_0==2?"bad":_0==1?"average":"good"'},p:[5,19,159]}]},f:[{t:2,x:{r:["value"],s:"Math.fixed(_0,2)"},p:[6,5,237]},{t:2,r:"unit",p:[6,29,261]}]}]}],n:52,r:"adata.environment_data",p:[3,5,70]}," ",{p:[10,5,322],t:7,e:"ui-section",a:{label:"Local Status"},f:[{p:[11,7,363],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.danger_level"],s:'_0==2?"bad bold":_0==1?"average bold":"good"'},p:[11,20,376]}]},f:[{t:2,x:{r:["data.danger_level"],s:'_0==2?"Danger (Internals Required)":_0==1?"Caution":"Optimal"'},p:[12,6,475]}]}]}," ",{p:[15,5,619],t:7,e:"ui-section",a:{label:"Area Status"},f:[{p:[16,7,659],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.atmos_alarm","data.fire_alarm"],s:'_0||_1?"bad bold":"good"'},p:[16,20,672]}]},f:[{t:2,x:{r:["data.atmos_alarm","fire_alarm"],s:'_0?"Atmosphere Alarm":_1?"Fire Alarm":"Nominal"'},p:[17,8,744]}]}]}],n:50,r:"data.environment_data",p:[2,3,35]},{t:4,n:51,f:[{p:[21,5,876],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[22,7,912],t:7,e:"span",a:{"class":"bad bold"},f:["Cannot obtain air sample for analysis."]}]}],r:"data.environment_data"}," ",{t:4,f:[{p:[26,5,1040],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[27,7,1076],t:7,e:"span",a:{"class":"bad bold"},f:["Safety measures offline. Device may exhibit abnormal behavior."]}]}],n:50,r:"data.emagged",p:[25,3,1014]}]}]},e.exports=a.extend(r.exports)},{205:205}],225:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.css=" th, td {\r\n padding-right: 16px;\r\n text-align: left;\r\n }",r.exports.template={v:3,t:[" ",{p:{button:[{p:[5,5,116],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Alarm Thresholds",button:0},f:[" ",{p:[7,3,143],t:7,e:"table",f:[{p:[8,5,156],t:7,e:"thead",f:[{p:[8,12,163],t:7,e:"tr",f:[{p:[9,7,175],t:7,e:"th"}," ",{p:[10,7,192],t:7,e:"th",f:[{p:[10,11,196],t:7,e:"span",a:{"class":"bad"},f:["min2"]}]}," ",{p:[11,7,238],t:7,e:"th",f:[{p:[11,11,242],t:7,e:"span",a:{"class":"average"},f:["min1"]}]}," ",{p:[12,7,288],t:7,e:"th",f:[{p:[12,11,292],t:7,e:"span",a:{"class":"average"},f:["max1"]}]}," ",{p:[13,7,338],t:7,e:"th",f:[{p:[13,11,342],t:7,e:"span",a:{"class":"bad"},f:["max2"]}]}]}]}," ",{p:[15,5,401],t:7,e:"tbody",f:[{t:4,f:[{p:[16,32,441],t:7,e:"tr",f:[{p:[17,9,455],t:7,e:"th",f:[{t:3,r:"name",p:[17,13,459]}]}," ",{t:4,f:[{p:[18,27,502],t:7,e:"td",f:[{p:[19,11,518],t:7,e:"ui-button",a:{action:"threshold",params:['{"env": "',{t:2,r:"env",p:[19,58,565]},'", "var": "',{t:2,r:"val",p:[19,76,583]},'"}']},f:[{t:2,x:{r:["selected"],s:"Math.fixed(_0,2)"},p:[19,87,594]}]}]}],n:52,r:"settings",p:[18,9,484]}]}],n:52,r:"data.thresholds",p:[16,7,416]}]}," ",{p:[23,3,697],t:7,e:"table",f:[]}]}]}," "]},r.exports.components=r.exports.components||{};var i={back:t(221)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,221:221}],226:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:{button:[{p:[5,5,113],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Vent Controls",button:0},f:[" ",{t:4,f:[{p:[8,5,166],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"long_name",p:[8,27,188]}]},f:[{p:[9,7,211],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[10,9,247],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["power"],s:'_0?"power-off":"close"'},p:[10,26,264]}],style:[{t:2,x:{r:["power"],s:'_0?"selected":null'},p:[10,68,306]}],action:"power",params:['{"id_tag": "',{t:2,r:"id_tag",p:[11,46,383]},'", "val": ',{t:2,x:{r:["power"],s:"+!_0"},p:[11,66,403]},"}"]},f:[{t:2,x:{r:["power"],s:'_0?"On":"Off"'},p:[11,80,417]}]}]}," ",{p:[13,7,482],t:7,e:"ui-section",a:{label:"Mode"},f:[{p:[14,9,517],t:7,e:"span",f:[{t:2,x:{r:["direction"],s:'_0=="release"?"Pressurizing":"Siphoning"'},p:[14,15,523]}]}]}," ",{p:[16,7,616],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[17,9,665],t:7,e:"ui-button",a:{icon:"sign-in",style:[{t:2,x:{r:["incheck"],s:'_0?"selected":null'},p:[17,42,698]}],action:"incheck",params:['{"id_tag": "',{t:2,r:"id_tag",p:[18,48,779]},'", "val": ',{t:2,r:"checks",p:[18,68,799]},"}"]},f:["Internal"]}," ",{p:[19,9,842],t:7,e:"ui-button",a:{icon:"sign-out",style:[{t:2,x:{r:["excheck"],s:'_0?"selected":null'},p:[19,43,876]}],action:"excheck",params:['{"id_tag": "',{t:2,r:"id_tag",p:[20,48,957]},'", "val": ',{t:2,r:"checks",p:[20,68,977]},"}"]},f:["External"]}]}," ",{t:4,f:[{p:[23,9,1064],t:7,e:"ui-section",a:{label:"Internal Target Pressure"},f:[{p:[24,11,1121],t:7,e:"ui-button",a:{icon:"pencil",action:"set_internal_pressure",params:['{"id_tag": "',{t:2,r:"id_tag",p:[25,33,1210]},'"}']},f:[{t:2,x:{r:["internal"],s:"Math.fixed(_0)"},p:[25,47,1224]}]}," ",{p:[26,11,1272],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["intdefault"],s:'_0?"disabled":null'},p:[26,44,1305]}],action:"reset_internal_pressure",params:['{"id_tag": "',{t:2,r:"id_tag",p:[27,33,1407]},'"}']},f:["Reset"]}]}],n:50,r:"incheck",p:[22,7,1039]}," ",{t:4,f:[{p:[31,11,1511],t:7,e:"ui-section",a:{label:"External Target Pressure"},f:[{p:[32,13,1570],t:7,e:"ui-button",a:{icon:"pencil",action:"set_external_pressure",params:['{"id_tag": "',{t:2,r:"id_tag",p:[33,35,1661]},'"}']},f:[{t:2,x:{r:["external"],s:"Math.fixed(_0)"},p:[33,49,1675]}]}," ",{p:[34,13,1725],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["extdefault"],s:'_0?"disabled":null'},p:[34,46,1758]}],action:"reset_external_pressure",params:['{"id_tag": "',{t:2,r:"id_tag",p:[35,35,1862]},'"}']},f:["Reset"]}]}],n:50,r:"excheck",p:[30,7,1484]}]}],n:52,r:"data.vents",p:[7,3,140]},{t:4,n:51,f:[{p:[40,5,1973],t:7,e:"span",a:{"class":"bad"},f:["Error: No vents connected."]}],r:"data.vents"}]}]},r.exports.components=r.exports.components||{};var i={back:t(221)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,221:221}],227:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.css=" table {\r\n width: 100%;\r\n border-spacing: 2px;\r\n }\r\n th {\r\n text-align: left;\r\n }\r\n td {\r\n vertical-align: top;\r\n }\r\n td .button {\r\n margin-top: 4px\r\n }",r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",f:[{p:[3,5,34],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.oneAccess"],s:'_0?"unlock":"lock"'},p:[3,22,51]}],action:"one_access"},f:[{t:2,x:{r:["data.oneAccess"],s:'_0?"One":"All"'},p:[3,82,111]}," Required"]}," ",{p:[4,5,172],t:7,e:"ui-button",a:{icon:"refresh",action:"clear"},f:["Clear"]}]}," ",{p:[6,3,251],t:7,e:"hr"}," ",{p:[7,3,260],t:7,e:"table",f:[{p:[8,3,271],t:7,e:"thead",f:[{p:[9,4,283],t:7,e:"tr",f:[{t:4,f:[{p:[10,5,315],t:7,e:"th",f:[{p:[10,9,319],t:7,e:"span",a:{"class":"highlight bold"},f:[{t:2,r:"name",p:[10,38,348]}]}]}],n:52,r:"data.regions",p:[9,8,287]}]}]}," ",{p:[13,3,403],t:7,e:"tbody",f:[{p:[14,4,415],t:7,e:"tr",f:[{t:4,f:[{p:[15,5,447],t:7,e:"td",f:[{t:4,f:[{p:[16,11,481],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["req"],s:'_0?"check-square-o":"square-o"'},p:[16,28,498]}],style:[{t:2,x:{r:["req"],s:'_0?"selected":null'},p:[16,76,546]}],action:"set",params:['{"access": "',{t:2,r:"id",p:[17,46,621]},'"}']},f:[{t:2,r:"name",p:[17,56,631]}]}," ",{p:[18,9,661],t:7,e:"br"}],n:52,r:"accesses",p:[15,9,451]}]}],n:52,r:"data.regions",p:[14,8,419]}]}]}]}]}," "]},e.exports=a.extend(r.exports)},{205:205}],228:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{powerState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}}},computed:{malfAction:function(){switch(this.get("data.malfStatus")){case 1:return"hack";case 2:return"occupy";case 3:return"deoccupy"}},malfButton:function(){switch(this.get("data.malfStatus")){case 1:return"Override Programming";case 2:case 4:return"Shunt Core Process";case 3:return"Return to Main Core"}},malfIcon:function(){switch(this.get("data.malfStatus")){case 1:return"terminal";case 2:case 4:return"caret-square-o-down";case 3:return"caret-square-o-left"}},powerCellStatusState:function(){var t=this.get("data.powerCellStatus");return t>50?"good":t>25?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[46,2,1206],t:7,e:"ui-notice",f:[{p:[47,3,1221],t:7,e:"b",f:[{p:[47,6,1224],t:7,e:"h3",f:["SYSTEM FAILURE"]}]}," ",{p:[48,3,1255],t:7,e:"i",f:["I/O regulators malfunction detected! Waiting for system reboot..."]},{p:[48,75,1327],t:7,e:"br"}," Automatic reboot in ",{t:2,r:"data.failTime",p:[49,23,1355]}," seconds... ",{p:[50,3,1387],t:7,e:"ui-button",a:{icon:"refresh",action:"reboot"},f:["Reboot Now"]},{p:[50,67,1451],t:7,e:"br"},{p:[50,71,1455],t:7,e:"br"},{p:[50,75,1459],t:7,e:"br"}]}],n:50,r:"data.failTime",p:[45,1,1182]},{t:4,n:51,f:[{p:[53,2,1491],t:7,e:"ui-notice",f:[{t:4,f:[{p:[55,3,1535],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[56,5,1576],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[56,22,1593]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[56,73,1644]}]}]}],n:50,r:"data.siliconUser",p:[54,4,1507]},{t:4,n:51,f:[{p:[59,3,1732],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[59,29,1758]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[62,2,1846],t:7,e:"ui-display",a:{title:"Power Status"},f:[{p:[63,4,1884],t:7,e:"ui-section",a:{label:"Main Breaker"},f:[{t:4,f:[{p:[65,5,1967],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.isOperating"],s:'_0?"good":"bad"'},p:[65,18,1980]}]},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[65,57,2019]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[64,3,1921]},{t:4,n:51,f:[{p:[67,5,2079],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOperating"],s:'_0?"power-off":"close"'},p:[67,22,2096]}],style:[{t:2,x:{r:["data.isOperating"],s:'_0?"selected":null'},p:[67,75,2149]}],action:"breaker"},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[68,21,2212]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}]}," ",{p:[71,4,2293],t:7,e:"ui-section",a:{label:"External Power"},f:[{p:[72,3,2332],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.externalPower"],s:"_0(_1)"},p:[72,16,2345]}]},f:[{t:2,x:{r:["data.externalPower"],s:'_0==2?"Good":_0==1?"Low":"None"'},p:[72,52,2381]}]}]}," ",{p:[74,4,2490],t:7,e:"ui-section",a:{label:"Power Cell"},f:[{t:4,f:[{p:[76,5,2567],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.powerCellStatus",p:[76,38,2600]}],state:[{t:2,r:"powerCellStatusState",p:[76,71,2633]}]},f:[{t:2,x:{r:["adata.powerCellStatus"],s:"Math.fixed(_0)"},p:[76,97,2659]},"%"]}],n:50,x:{r:["data.powerCellStatus"],s:"_0!=null"},p:[75,3,2525]},{t:4,n:51,f:[{p:[78,5,2724],t:7,e:"span",a:{"class":"bad"},f:["Removed"]}],x:{r:["data.powerCellStatus"],s:"_0!=null"}}]}," ",{t:4,f:[{p:[82,3,2830],t:7,e:"ui-section",a:{label:"Charge Mode"},f:[{t:4,f:[{p:[84,4,2913],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.chargeMode"],s:'_0?"good":"bad"'},p:[84,17,2926]}]},f:[{t:2,x:{r:["data.chargeMode"],s:'_0?"Auto":"Off"'},p:[84,55,2964]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[83,5,2868]},{t:4,n:51,f:[{p:[86,4,3026],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.chargeMode"],s:'_0?"refresh":"close"'},p:[86,21,3043]}],style:[{t:2,x:{r:["data.chargeMode"],s:'_0?"selected":null'},p:[86,71,3093]}],action:"charge"},f:[{t:2,x:{r:["data.chargeMode"],s:'_0?"Auto":"Off"'},p:[87,22,3156]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}," [",{p:[90,6,3236],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.chargingStatus"],s:"_0(_1)"},p:[90,19,3249]}]},f:[{t:2,x:{r:["data.chargingStatus"],s:'_0==2?"Fully Charged":_0==1?"Charging":"Not Charging"'},p:[90,56,3286]}]},"]"]}],n:50,x:{r:["data.powerCellStatus"],s:"_0!=null"},p:[81,4,2790]}]}," ",{p:[94,2,3445],t:7,e:"ui-display",a:{title:"Power Channels"},f:[{t:4,f:[{p:[96,3,3517],t:7,e:"ui-section",a:{label:[{t:2,r:"title",p:[96,22,3536]}],nowrap:0},f:[{p:[97,5,3560],t:7,e:"div",a:{"class":"content"},f:[{t:2,rx:{r:"adata.powerChannels",m:[{t:30,n:"@index"},"powerLoad"]},p:[97,26,3581]}]}," ",{p:[98,5,3634],t:7,e:"div",a:{"class":"content"},f:[{p:[98,26,3655],t:7,e:"span",a:{"class":[{t:2,x:{r:["status"],s:'_0>=2?"good":"bad"'},p:[98,39,3668]}]},f:[{t:2,x:{r:["status"],s:'_0>=2?"On":"Off"'},p:[98,73,3702]}]}]}," ",{p:[99,5,3751],t:7,e:"div",a:{"class":"content"},f:["[",{p:[99,27,3773],t:7,e:"span",f:[{t:2,x:{r:["status"],s:'_0==1||_0==3?"Auto":"Manual"'},p:[99,33,3779]}]},"]"]}," ",{p:[100,5,3849],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{t:4,f:[{p:[102,6,3942],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["status"],s:'_0==1||_0==3?"selected":null'},p:[102,39,3975]}],action:"channel",params:[{t:2,r:"topicParams.auto",p:[103,30,4057]}]},f:["Auto"]}," ",{p:[104,6,4102],t:7,e:"ui-button",a:{icon:"power-off",state:[{t:2,x:{r:["status"],s:'_0==2?"selected":null'},p:[104,41,4137]}],action:"channel",params:[{t:2,r:"topicParams.on",p:[105,13,4204]}]},f:["On"]}," ",{p:[106,6,4245],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["status"],s:'_0==0?"selected":null'},p:[106,37,4276]}],action:"channel",params:[{t:2,r:"topicParams.off",p:[107,13,4343]}]},f:["Off"]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[101,4,3895]}]}]}],n:52,r:"data.powerChannels",p:[95,4,3485]}," ",{p:[112,4,4439],t:7,e:"ui-section",a:{label:"Total Load"},f:[{p:[113,3,4474],t:7,e:"span",a:{"class":"bold"},f:[{t:2,r:"adata.totalLoad",p:[113,22,4493]}]}]}]}," ",{t:4,f:[{p:[117,4,4585],t:7,e:"ui-display",a:{title:"System Overrides"},f:[{p:[118,3,4626],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"overload"},f:["Overload"]}," ",{t:4,f:[{p:[120,5,4727],t:7,e:"ui-button",a:{icon:[{t:2,r:"malfIcon",p:[120,22,4744]}],state:[{t:2,x:{r:["data.malfStatus"],s:'_0==4?"disabled":null'},p:[120,43,4765]}],action:[{t:2,r:"malfAction",p:[120,97,4819]}]},f:[{t:2,r:"malfButton",p:[120,113,4835]}]}],n:50,r:"data.malfStatus",p:[119,3,4698]}]}],n:50,r:"data.siliconUser",p:[116,2,4556]}," ",{p:[124,2,4903],t:7,e:"ui-notice",f:[{p:[125,4,4919],t:7,e:"ui-section",a:{label:"Emergency Light Fallback"},f:[{t:4,f:[{p:[127,8,5020],t:7,e:"span",f:[{t:2,x:{r:["data.emergencyLights"],s:'_0?"Enabled":"Disabled"'},p:[127,14,5026]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[126,6,4971]},{t:4,n:51,f:[{p:[129,8,5106],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"emergency_lighting"},f:[{t:2,x:{r:["data.emergencyLights"],s:'_0?"Enabled":"Disabled"'},p:[129,66,5164]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}]}]}," ",{p:[133,2,5275],t:7,e:"ui-notice",f:[{p:[134,4,5291],t:7,e:"ui-section",a:{label:"Night Shift Lighting"},f:[{t:4,f:[{p:[136,8,5388],t:7,e:"span",f:[{t:2,x:{r:["data.nightshiftLights"],s:'_0?"Enabled":"Disabled"'},p:[136,14,5394]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[135,6,5339]},{t:4,n:51,f:[{p:[138,8,5475],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"toggle_nightshift"},f:[{t:2,x:{r:["data.nightshiftLights"],s:'_0?"Enabled":"Disabled"'},p:[138,65,5532]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}]}]}," ",{p:[142,2,5644],t:7,e:"ui-notice",f:[{p:[143,4,5660],t:7,e:"ui-section",a:{label:"Cover Lock"},f:[{t:4,f:[{p:[145,5,5741],t:7,e:"span",f:[{t:2,x:{r:["data.coverLocked"],s:'_0?"Engaged":"Disengaged"'},p:[145,11,5747]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[144,3,5695]},{t:4,n:51,f:[{p:[147,5,5819],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.coverLocked"],s:'_0?"lock":"unlock"'},p:[147,22,5836]}],action:"cover"},f:[{t:2,x:{r:["data.coverLocked"],s:'_0?"Engaged":"Disengaged"'},p:[147,79,5893]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}]}]}],r:"data.failTime"}]},e.exports=a.extend(r.exports)},{205:205}],229:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Alarms"},f:[{p:[2,3,31],t:7,e:"ul",f:[{t:4,f:[{p:[4,7,72],t:7,e:"li",f:[{p:[4,11,76],t:7,e:"ui-button",a:{icon:"close",style:"danger",action:"clear",params:['{"zone": "',{t:2,r:".",p:[4,83,148]},'"}']},f:[{t:2,r:".",p:[4,92,157]}]}]}],n:52,r:"data.priority",p:[3,5,41]},{t:4,n:51,f:[{p:[6,7,201],t:7,e:"li",f:[{p:[6,11,205],t:7,e:"span",a:{"class":"good"},f:["No Priority Alerts"]}]}],r:"data.priority"}," ",{t:4,f:[{p:[9,7,303],t:7,e:"li",f:[{p:[9,11,307],t:7,e:"ui-button",a:{icon:"close",style:"caution",action:"clear",params:['{"zone": "',{t:2,r:".",p:[9,84,380]},'"}']},f:[{t:2,r:".",p:[9,93,389]}]}]}],n:52,r:"data.minor",p:[8,5,275]},{t:4,n:51,f:[{p:[11,7,433],t:7,e:"li",f:[{p:[11,11,437],t:7,e:"span",a:{"class":"good"},f:["No Minor Alerts"]}]}],r:"data.minor"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],230:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:[{t:2,x:{r:["data.tank","data.sensors.0.long_name"],s:"_0?_1:null"},p:[1,20,19]}]},f:[{t:4,f:[{p:[3,5,102],t:7,e:"ui-subdisplay",a:{title:[{t:2,x:{r:["data.tank","long_name"],s:"!_0?_1:null"},p:[3,27,124]}]},f:[{p:[4,7,167],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[5,3,200],t:7,e:"span",f:[{t:2,x:{r:["pressure"],s:"Math.fixed(_0,2)"},p:[5,9,206]}," kPa"]}]}," ",{t:4,f:[{p:[8,9,302],t:7,e:"ui-section",a:{label:"Temperature"
-},f:[{p:[9,11,346],t:7,e:"span",f:[{t:2,x:{r:["temperature"],s:"Math.fixed(_0,2)"},p:[9,17,352]}," K"]}]}],n:50,r:"temperature",p:[7,7,273]}," ",{t:4,f:[{p:[13,9,462],t:7,e:"ui-section",a:{label:[{t:2,r:"id",p:[13,28,481]}]},f:[{p:[14,5,495],t:7,e:"span",f:[{t:2,x:{r:["."],s:"Math.fixed(_0,2)"},p:[14,11,501]},"%"]}]}],n:52,i:"id",r:"gases",p:[12,4,434]}]}],n:52,r:"adata.sensors",p:[2,3,73]}]}," ",{t:4,f:[{p:{button:[{p:[23,5,704],t:7,e:"ui-button",a:{icon:"refresh",action:"reconnect"},f:["Reconnect"]}]},t:7,e:"ui-display",a:{title:"Controls",button:0},f:[" ",{p:[25,5,792],t:7,e:"ui-section",a:{label:"Input Injector"},f:[{p:[26,7,835],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.inputting"],s:'_0?"power-off":"close"'},p:[26,24,852]}],style:[{t:2,x:{r:["data.inputting"],s:'_0?"selected":null'},p:[26,75,903]}],action:"input"},f:[{t:2,x:{r:["data.inputting"],s:'_0?"Injecting":"Off"'},p:[27,9,968]}]}]}," ",{p:[29,5,1044],t:7,e:"ui-section",a:{label:"Input Rate"},f:[{p:[30,7,1083],t:7,e:"span",f:[{t:2,x:{r:["adata.inputRate"],s:"Math.fixed(_0)"},p:[30,13,1089]}," L/s"]}]}," ",{p:[32,5,1156],t:7,e:"ui-section",a:{label:"Output Regulator"},f:[{p:[33,7,1201],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.outputting"],s:'_0?"power-off":"close"'},p:[33,24,1218]}],style:[{t:2,x:{r:["data.outputting"],s:'_0?"selected":null'},p:[33,76,1270]}],action:"output"},f:[{t:2,x:{r:["data.outputting"],s:'_0?"Open":"Closed"'},p:[34,9,1337]}]}]}," ",{p:[36,5,1412],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[37,7,1456],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure"},f:[{t:2,x:{r:["adata.outputPressure"],s:"Math.round(_0)"},p:[37,50,1499]}," kPa"]}]}]}],n:50,r:"data.tank",p:[20,1,618]}]},e.exports=a.extend(r.exports)},{205:205}],231:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,48],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[3,22,65]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[3,66,109]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[4,22,164]}]}]}," ",{p:[6,3,223],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[7,5,265],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[8,5,360],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.pressure","data.max_pressure"],s:'_0==_1?"disabled":null'},p:[8,35,390]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[9,5,518],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[9,11,524]}," kPa"]}]}," ",{p:[11,3,586],t:7,e:"ui-section",a:{label:"Filter"},f:[{t:4,f:[{p:[13,7,654],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[13,25,672]}],action:"filter",params:['{"mode": ',{t:2,r:"id",p:[14,42,748]},"}"]},f:[{t:2,r:"name",p:[14,51,757]}]}],n:52,r:"data.filter_types",p:[12,5,619]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],232:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,48],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[3,22,65]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[3,66,109]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[4,22,164]}]}]}," ",{p:[6,3,223],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[7,5,265],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[8,5,360],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.set_pressure","data.max_pressure"],s:'_0==_1?"disabled":null'},p:[8,35,390]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[9,5,522],t:7,e:"span",f:[{t:2,x:{r:["adata.set_pressure"],s:"Math.round(_0)"},p:[9,11,528]}," kPa"]}]}," ",{p:[11,3,594],t:7,e:"ui-section",a:{label:"Node 1"},f:[{p:[12,5,627],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==0?"disabled":null'},p:[12,44,666]}],action:"node1",params:'{"concentration": -0.1}'}}," ",{p:[14,5,783],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==0?"disabled":null'},p:[14,39,817]}],action:"node1",params:'{"concentration": -0.01}'}}," ",{p:[16,5,935],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==100?"disabled":null'},p:[16,38,968]}],action:"node1",params:'{"concentration": 0.01}'}}," ",{p:[18,5,1087],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==100?"disabled":null'},p:[18,43,1125]}],action:"node1",params:'{"concentration": 0.1}'}}," ",{p:[20,5,1243],t:7,e:"span",f:[{t:2,x:{r:["adata.node1_concentration"],s:"Math.round(_0)"},p:[20,11,1249]},"%"]}]}," ",{p:[22,3,1319],t:7,e:"ui-section",a:{label:"Node 2"},f:[{p:[23,5,1352],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==0?"disabled":null'},p:[23,44,1391]}],action:"node2",params:'{"concentration": -0.1}'}}," ",{p:[25,5,1508],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==0?"disabled":null'},p:[25,39,1542]}],action:"node2",params:'{"concentration": -0.01}'}}," ",{p:[27,5,1660],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==100?"disabled":null'},p:[27,38,1693]}],action:"node2",params:'{"concentration": 0.01}'}}," ",{p:[29,5,1812],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==100?"disabled":null'},p:[29,43,1850]}],action:"node2",params:'{"concentration": 0.1}'}}," ",{p:[31,5,1968],t:7,e:"span",f:[{t:2,x:{r:["adata.node2_concentration"],s:"Math.round(_0)"},p:[31,11,1974]},"%"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],233:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,48],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[3,22,65]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[3,66,109]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[4,22,164]}]}]}," ",{t:4,f:[{p:[7,5,250],t:7,e:"ui-section",a:{label:"Transfer Rate"},f:[{p:[8,7,292],t:7,e:"ui-button",a:{icon:"pencil",action:"rate",params:'{"rate": "input"}'},f:["Set"]}," ",{p:[9,7,381],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.rate","data.max_rate"],s:'_0==_1?"disabled":null'},p:[9,37,411]}],action:"rate",params:'{"rate": "max"}'},f:["Max"]}," ",{p:[10,7,525],t:7,e:"span",f:[{t:2,x:{r:["adata.rate"],s:"Math.round(_0)"},p:[10,13,531]}," L/s"]}]}],n:50,r:"data.max_rate",p:[6,3,223]},{t:4,n:51,f:[{p:[13,5,605],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[14,7,649],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[15,7,746],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.pressure","data.max_pressure"],s:'_0==_1?"disabled":null'},p:[15,37,776]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[16,7,906],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[16,13,912]}," kPa"]}]}],r:"data.max_rate"}]}]},e.exports=a.extend(r.exports)},{205:205}],234:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{p:[3,5,67],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"selected":null'},p:[3,38,100]}],action:[{t:2,x:{r:["data.timing"],s:'_0?"stop":"start"'},p:[3,83,145]}]},f:[{t:2,x:{r:["data.timing"],s:'_0?"Stop":"Start"'},p:[3,119,181]}]}," ",{p:[4,5,233],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"flash",style:[{t:2,x:{r:["data.flash_charging"],s:'_0?"disabled":null'},p:[4,57,285]}]},f:[{t:2,x:{r:["data.flash_charging"],s:'_0?"Recharging":"Flash"'},p:[4,102,330]}]}]},t:7,e:"ui-display",a:{title:"Cell Timer",button:0},f:[" ",{p:[6,3,410],t:7,e:"ui-section",f:[{p:[7,5,428],t:7,e:"ui-button",a:{icon:"fast-backward",action:"time",params:'{"adjust": -600}'}}," ",{p:[8,5,518],t:7,e:"ui-button",a:{icon:"backward",action:"time",params:'{"adjust": -100}'}}," ",{p:[9,5,603],t:7,e:"span",f:[{t:2,x:{r:["text","data.minutes"],s:"_0.zeroPad(_1,2)"},p:[9,11,609]},":",{t:2,x:{r:["text","data.seconds"],s:"_0.zeroPad(_1,2)"},p:[9,45,643]}]}," ",{p:[10,5,689],t:7,e:"ui-button",a:{icon:"forward",action:"time",params:'{"adjust": 100}'}}," ",{p:[11,5,772],t:7,e:"ui-button",a:{icon:"fast-forward",action:"time",params:'{"adjust": 600}'}}]}," ",{p:[13,3,875],t:7,e:"ui-section",f:[{p:[14,7,895],t:7,e:"ui-button",a:{icon:"hourglass-start",action:"preset",params:'{"preset": "short"}'},f:["Short"]}," ",{p:[15,7,999],t:7,e:"ui-button",a:{icon:"hourglass-start",action:"preset",params:'{"preset": "medium"}'},f:["Medium"]}," ",{p:[16,7,1105],t:7,e:"ui-button",a:{icon:"hourglass-start",action:"preset",params:'{"preset": "long"}'},f:["Long"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],235:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,23],t:7,e:"ui-notice",f:[{t:2,r:"data.notice",p:[3,5,40]}]}],n:50,r:"data.notice",p:[1,1,0]},{p:[6,1,82],t:7,e:"ui-display",a:{title:"Bluespace Artillery Control",button:0},f:[{t:4,f:[{p:[8,3,167],t:7,e:"ui-section",a:{label:"Target"},f:[{p:[9,5,200],t:7,e:"ui-button",a:{icon:"crosshairs",action:"recalibrate"},f:[{t:2,r:"data.target",p:[9,55,250]}]}]}," ",{p:[11,3,298],t:7,e:"ui-section",a:{label:"Controls"},f:[{t:4,f:[{p:[13,3,356],t:7,e:"ui-notice",f:[{p:[14,4,372],t:7,e:"span",f:["Bluespace Artillery firing protocols must be globally unlocked from two keycard authentication devices first!"]}]}],n:50,x:{r:["data.unlocked"],s:"!_0"},p:[12,2,330]},{t:4,n:51,f:[{p:[17,3,525],t:7,e:"ui-button",a:{icon:"warning",state:[{t:2,x:{r:["data.ready"],s:'_0?null:"disabled"'},p:[17,36,558]}],action:"fire"},f:["FIRE!"]}],x:{r:["data.unlocked"],s:"!_0"}}]}],n:50,r:"data.connected",p:[7,3,141]}," ",{t:4,f:[{p:[22,3,694],t:7,e:"ui-section",a:{label:"Maintenance"},f:[{p:[23,7,734],t:7,e:"ui-button",a:{icon:"wrench",action:"build"},f:["Complete Deployment."]}]}],n:50,x:{r:["data.connected"],s:"!_0"},p:[21,3,667]}]}]},e.exports=a.extend(r.exports)},{205:205}],236:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.hasHoldingTank"],s:'_0?"is":"is not"'},p:[2,23,35]}," connected to a tank."]}]}," ",{p:{button:[{p:[6,5,185],t:7,e:"ui-button",a:{icon:"pencil",action:"relabel"},f:["Relabel"]}]},t:7,e:"ui-display",a:{title:"Canister",button:0},f:[" ",{p:[8,3,266],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[9,5,301],t:7,e:"span",f:[{t:2,x:{r:["adata.tankPressure"],s:"Math.round(_0)"},p:[9,11,307]}," kPa"]}]}," ",{p:[11,3,373],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[12,5,404],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.portConnected"],s:'_0?"good":"average"'},p:[12,18,417]}]},f:[{t:2,x:{r:["data.portConnected"],s:'_0?"Connected":"Not Connected"'},p:[12,63,462]}]}]}," ",{t:4,f:[{p:[15,3,573],t:7,e:"ui-section",a:{label:"Access"},f:[{p:[16,7,608],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.restricted"],s:'_0?"lock":"unlock"'},p:[16,24,625]}],style:[{t:2,x:{r:[],s:'"caution"'},p:[17,14,680]}],action:"restricted"},f:[{t:2,x:{r:["data.restricted"],s:'_0?"Restricted to Engineering":"Public"'},p:[18,27,722]}]}]}],n:50,r:"data.isPrototype",p:[14,3,544]}]}," ",{p:[22,1,839],t:7,e:"ui-display",a:{title:"Valve"},f:[{p:[23,3,869],t:7,e:"ui-section",a:{label:"Release Pressure"},f:[{p:[24,5,912],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.minReleasePressure",p:[24,18,925]}],max:[{t:2,r:"data.maxReleasePressure",p:[24,52,959]}],value:[{t:2,r:"data.releasePressure",p:[25,14,1002]}]},f:[{t:2,x:{r:["adata.releasePressure"],s:"Math.round(_0)"},p:[25,40,1028]}," kPa"]}]}," ",{p:[27,3,1099],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[28,5,1144],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.releasePressure","data.defaultReleasePressure"],s:'_0!=_1?null:"disabled"'},p:[28,38,1177]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[30,5,1333],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.releasePressure","data.minReleasePressure"],s:'_0>_1?null:"disabled"'},p:[30,36,1364]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[32,5,1511],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[33,5,1606],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.releasePressure","data.maxReleasePressure"],s:'_0<_1?null:"disabled"'},p:[33,35,1636]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}," ",{p:[36,3,1798],t:7,e:"ui-section",a:{label:"Valve"},f:[{p:[37,5,1830],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.valveOpen"],s:'_0?"unlock":"lock"'},p:[37,22,1847]}],style:[{t:2,x:{r:["data.valveOpen","data.hasHoldingTank"],s:'_0?_1?"caution":"danger":null'},p:[38,14,1901]}],action:"valve"},f:[{t:2,x:{r:["data.valveOpen"],s:'_0?"Open":"Closed"'},p:[39,22,1995]}]}]}]}," ",{t:4,f:[{p:[42,1,2090],t:7,e:"ui-display",a:{title:"Valve Toggle Timer"},f:[{t:4,f:[{p:[44,5,2155],t:7,e:"ui-section",a:{label:"Adjust Timer"},f:[{p:[45,7,2196],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.timer_is_not_default"],s:'_0?null:"disabled"'},p:[45,40,2229]}],action:"timer",params:'{"change": "reset"}'},f:["Reset"]}," ",{p:[47,7,2358],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.timer_is_not_min"],s:'_0?null:"disabled"'},p:[47,38,2389]}],action:"timer",params:'{"change": "decrease"}'},f:["Decrease"]}," ",{p:[49,7,2520],t:7,e:"ui-button",a:{icon:"pencil",state:[{t:2,x:{r:[],s:'"disabled"'},p:[49,39,2552]}],action:"timer",params:'{"change": "input"}'},f:["Set"]}," ",{p:[51,7,2637],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.timer_is_not_max"],s:'_0?null:"disabled"'},p:[51,37,2667]}],action:"timer",params:'{"change": "increase"}'},f:["Increase"]}]}],n:51,r:"data.timing",p:[43,3,2133]}," ",{p:[55,3,2833],t:7,e:"ui-section",a:{label:"Timer"},f:[{p:[56,6,2866],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"danger":"caution"'},p:[56,39,2899]}],action:"toggle_timer"},f:[{t:2,x:{r:["data.timing"],s:'_0?"On":"Off"'},p:[57,30,2969]}]}," ",{p:[59,2,3017],t:7,e:"ui-section",a:{label:"Time until Valve Toggle"},f:[{p:[60,2,3064],t:7,e:"span",f:[{t:2,x:{r:["data.timing","data.time_left","data.timer_set"],s:"_0?_1:_2"},p:[60,8,3070]}]}]}]}]}],n:50,r:"data.isPrototype",p:[41,1,2062]},{p:{button:[{t:4,f:[{p:[69,7,3277],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.valveOpen"],s:'_0?"danger":null'},p:[69,38,3308]}],action:"eject"},f:["Eject"]}],n:50,r:"data.hasHoldingTank",p:[68,5,3242]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[73,3,3442],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holdingTank.name",p:[74,4,3473]}]}," ",{p:[76,3,3519],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holdingTank.tankPressure"],s:"Math.round(_0)"},p:[77,4,3553]}," kPa"]}],n:50,r:"data.hasHoldingTank",p:[72,3,3411]},{t:4,n:51,f:[{p:[80,3,3635],t:7,e:"ui-section",f:[{p:[81,4,3652],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.hasHoldingTank"}]}]},e.exports=a.extend(r.exports)},{205:205}],237:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{tabs:function(){return Object.keys(this.get("data.supplies"))}}}}(r),r.exports.template={v:3,t:[" ",{p:[11,1,158],t:7,e:"ui-display",a:{title:"Cargo"},f:[{p:[12,3,188],t:7,e:"ui-section",a:{label:"Shuttle"},f:[{t:4,f:[{p:[14,7,270],t:7,e:"ui-button",a:{action:"send"},f:[{t:2,r:"data.location",p:[14,32,295]}]}],n:50,x:{r:["data.docked","data.requestonly"],s:"_0&&!_1"},p:[13,5,222]},{t:4,n:51,f:[{p:[16,7,346],t:7,e:"span",f:[{t:2,r:"data.location",p:[16,13,352]}]}],x:{r:["data.docked","data.requestonly"],s:"_0&&!_1"}}]}," ",{p:[19,3,410],t:7,e:"ui-section",a:{label:"Credits"},f:[{p:[20,5,444],t:7,e:"span",f:[{t:2,x:{r:["adata.points"],s:"Math.floor(_0)"},p:[20,11,450]}]}]}," ",{p:[22,3,506],t:7,e:"ui-section",a:{label:"CentCom Message"},f:[{p:[23,7,550],t:7,e:"span",f:[{t:2,r:"data.message",p:[23,13,556]}]}]}," ",{t:4,f:[{p:[26,5,644],t:7,e:"ui-section",a:{label:"Loan"},f:[{t:4,f:[{p:[28,9,716],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.away","data.docked"],s:'_0&&_1?null:"disabled"'},p:[29,17,744]}],action:"loan"},f:["Loan Shuttle"]}],n:50,x:{r:["data.loan_dispatched"],s:"!_0"},p:[27,7,677]},{t:4,n:51,f:[{p:[32,9,868],t:7,e:"span",a:{"class":"bad"},f:["Loaned to CentCom"]}],x:{r:["data.loan_dispatched"],s:"!_0"}}]}],n:50,x:{r:["data.loan","data.requestonly"],s:"_0&&!_1"},p:[25,3,600]}]}," ",{t:4,f:[{p:{button:[{p:[40,7,1066],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.cart.length"],s:'_0?null:"disabled"'},p:[40,38,1097]}],action:"clear"},f:["Clear"]}]},t:7,e:"ui-display",a:{title:"Cart",button:0},f:[" ",{t:4,f:[{p:[43,7,1222],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[44,9,1263],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[44,31,1285]}]}," ",{p:[45,9,1307],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"object",p:[45,30,1328]}]}," ",{p:[46,9,1354],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"cost",p:[46,30,1375]}," Credits"]}," ",{p:[47,9,1407],t:7,e:"div",a:{"class":"content"},f:[{p:[48,11,1440],t:7,e:"ui-button",a:{icon:"minus",action:"remove",params:['{"id": "',{t:2,r:"id",p:[48,67,1496]},'"}']}}]}]}],n:52,r:"data.cart",p:[42,5,1195]},{t:4,n:51,f:[{p:[52,7,1566],t:7,e:"span",f:["Nothing in Cart"]}],r:"data.cart"}]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[37,1,972]},{p:{button:[{t:4,f:[{p:[59,7,1735],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.requests.length"],s:'_0?null:"disabled"'},p:[59,38,1766]}],action:"denyall"},f:["Clear"]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[58,5,1702]}]},t:7,e:"ui-display",a:{title:"Requests",button:0},f:[" ",{t:4,f:[{p:[63,5,1908],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[64,7,1947],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[64,29,1969]}]}," ",{p:[65,7,1989],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"object",p:[65,28,2010]}]}," ",{p:[66,7,2034],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"cost",p:[66,28,2055]}," Credits"]}," ",{p:[67,7,2085],t:7,e:"div",a:{"class":"content"},f:["By ",{t:2,r:"orderer",p:[67,31,2109]}]}," ",{p:[68,7,2134],t:7,e:"div",a:{"class":"content"},f:["Comment: ",{t:2,r:"reason",p:[68,37,2164]}]}," ",{t:4,f:[{p:[70,9,2223],t:7,e:"div",a:{"class":"content"},f:[{p:[71,11,2256],t:7,e:"ui-button",a:{icon:"check",action:"approve",params:['{"id": "',{t:2,r:"id",p:[71,68,2313]},'"}']}}," ",{p:[72,11,2336],t:7,e:"ui-button",a:{icon:"close",action:"deny",params:['{"id": "',{t:2,r:"id",p:[72,65,2390]},'"}']}}]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[69,7,2188]}]}],n:52,r:"data.requests",p:[62,3,1879]},{t:4,n:51,f:[{p:[77,7,2473],t:7,e:"span",f:["No Requests"]}],r:"data.requests"}]}," ",{p:[80,1,2529],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"tabs",p:[80,16,2544]}]},f:[{t:4,f:[{p:[82,5,2587],t:7,e:"tab",a:{name:[{t:2,r:"name",p:[82,16,2598]}]},f:[{t:4,f:[{p:[84,9,2641],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[84,28,2660]}],candystripe:0,right:0},f:[{p:[85,11,2700],t:7,e:"ui-button",a:{action:"add",params:['{"id": "',{t:2,r:"id",p:[85,51,2740]},'"}']},f:[{t:2,r:"cost",p:[85,61,2750]}," Credits"]}]}],n:52,r:"packs",p:[83,7,2616]}]}],n:52,r:"data.supplies",p:[81,3,2558]}]}]},e.exports=a.extend(r.exports)},{205:205}],238:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{tabs:function(){return Object.keys(this.get("data.supplies"))}}}}(r),r.exports.template={v:3,t:[" ",{p:[12,1,174],t:7,e:"ui-notice",f:[{t:4,f:[{p:[14,5,220],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[15,7,263],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[15,24,280]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[15,75,331]}]}]}],n:50,r:"data.siliconUser",p:[13,3,189]},{t:4,n:51,f:[{p:[18,5,422],t:7,e:"span",f:["Swipe a QM-Level ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[18,39,456]}," this interface."]}],r:"data.siliconUser"}]}," ",{t:4,f:[{p:[23,3,568],t:7,e:"ui-display",a:{title:"Express Cargo Console"},f:[{p:[24,5,616],t:7,e:"ui-section",a:{label:"Credits"},f:[{p:[25,7,652],t:7,e:"span",f:[{t:2,x:{r:["adata.points"],s:"Math.floor(_0)"},p:[25,13,658]}]}]}," ",{p:[28,5,720],t:7,e:"ui-section",a:{label:"Notice"},f:[{p:[29,7,755],t:7,e:"span",f:[{t:2,r:"data.message",p:[29,13,761]}]}]}]}," ",{p:[32,3,824],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"tabs",p:[32,18,839]}]},f:[{t:4,f:[{p:[34,7,886],t:7,e:"tab",a:{name:[{t:2,r:"name",p:[34,18,897]}]},f:[{t:4,f:[{p:[36,11,944],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[36,30,963]}],candystripe:0,right:0},f:[{p:[37,13,1005],t:7,e:"ui-button",a:{action:"add",params:['{"id": "',{t:2,r:"id",p:[37,53,1045]},'"}']},f:[{t:2,r:"cost",p:[37,63,1055]}," Credits (Premium Pricing)"]}]}],n:52,r:"packs",p:[35,9,917]}]}],n:52,r:"data.supplies",p:[33,5,855]}]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[22,1,543]}]},e.exports=a.extend(r.exports)},{205:205}],239:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Cellular Emporium",button:0},f:[{p:[2,3,49],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.can_readapt"],s:'_0?null:"disabled"'},p:[2,36,82]}],action:"readapt"},f:["Readapt"]}," ",{p:[4,3,169],t:7,e:"ui-section",a:{label:"Genetic Points Remaining",right:0},f:[{t:2,r:"data.genetic_points_remaining",p:[5,5,226]}]}]}," ",{p:[8,1,293],t:7,e:"ui-display",f:[{t:4,f:[{p:[10,3,335],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[10,22,354]}],candystripe:0,right:0},f:[{p:[11,5,388],t:7,e:"span",f:[{t:2,r:"desc",p:[11,11,394]}]}," ",{p:[12,5,415],t:7,e:"span",f:[{t:2,r:"helptext",p:[12,11,421]}]}," ",{p:[13,5,446],t:7,e:"span",f:["Cost: ",{t:2,r:"dna_cost",p:[13,17,458]}]}," ",{p:[14,5,483],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["owned","can_purchase"],s:'_0?"selected":_1?null:"disabled"'},p:[15,14,508]}],action:"evolve",params:['{"name": "',{t:2,r:"name",p:[17,25,615]},'"}']},f:[{t:2,x:{r:["owned"],s:'_0?"Evolved":"Evolve"'},p:[18,7,635]}]}]}],n:52,r:"data.abilities",p:[9,1,307]},{t:4,f:[{p:[23,3,738],t:7,e:"span",a:{"class":"warning"},f:["No abilities availible."]}],n:51,r:"data.abilities",p:[22,1,715]}]}]},e.exports=a.extend(r.exports)},{205:205}],240:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,3,31],t:7,e:"ui-section",a:{label:"Energy"},f:[{p:[3,5,64],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.maxEnergy",p:[3,26,85]}],value:[{t:2,r:"data.energy",p:[3,53,112]}]},f:[{t:2,x:{r:["adata.energy"],s:"Math.fixed(_0)"},p:[3,70,129]}," Units"]}]}]}," ",{p:[6,1,206],t:7,e:"ui-display",a:{title:"Saved Recipes",button:0},f:[{p:[7,3,251],t:7,e:"ui-section",f:[{p:[8,5,269],t:7,e:"ui-button",a:{icon:"plus",action:"add_recipe"},f:["Add Recipe"]}," ",{p:[9,2,337],t:7,e:"ui-button",a:{icon:"minus",action:"clear_recipes"},f:["Clear Recipes"]}," ",{t:4,f:[{p:[11,7,445],t:7,e:"ui-button",a:{grid:0,icon:"tint",action:"dispense_recipe",params:['{"recipe": "',{t:2,r:"contents",p:[11,80,518]},'"}']},f:[{t:2,r:"recipe_name",p:[11,96,534]}]}],n:52,r:"data.recipes",p:[10,5,415]}]}]}," ",{p:{button:[{t:4,f:[{p:[18,7,719],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.amount","."],s:'_0==_1?"selected":null'},p:[18,37,749]}],action:"amount",params:['{"target": ',{t:2,r:".",p:[18,114,826]},"}"]},f:[{t:2,r:".",p:[18,122,834]}]}],n:52,r:"data.beakerTransferAmounts",p:[17,5,675]}]},t:7,e:"ui-display",a:{title:"Dispense",button:0},f:[" ",{p:[21,3,886],t:7,e:"ui-section",f:[{t:4,f:[{p:[23,7,936],t:7,e:"ui-button",a:{grid:0,icon:"tint",action:"dispense",params:['{"reagent": "',{t:2,r:"id",p:[23,74,1003]},'"}']},f:[{t:2,r:"title",p:[23,84,1013]}]}],n:52,r:"data.chemicals",p:[22,5,904]}]}]}," ",{p:{button:[{t:4,f:[{p:[30,7,1190],t:7,e:"ui-button",a:{icon:"minus",action:"remove",params:['{"amount": ',{t:2,r:".",p:[30,66,1249]},"}"]},f:[{t:2,r:".",p:[30,74,1257]}]}],n:52,r:"data.beakerTransferAmounts",p:[29,5,1146]}," ",{p:[32,5,1295],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[32,36,1326]}],action:"eject"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[34,3,1423],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[36,7,1493],t:7,e:"span",f:[{t:2,x:{r:["adata.beakerCurrentVolume"],s:"Math.round(_0)"},p:[36,13,1499]},"/",{t:2,r:"data.beakerMaxVolume",p:[36,55,1541]}," Units"]}," ",{p:[37,7,1586],t:7,e:"br"}," ",{t:4,f:[{p:[39,9,1639],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[39,52,1682]}," units of ",{t:2,r:"name",p:[39,87,1717]}]},{p:[39,102,1732],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[38,7,1599]},{t:4,n:51,f:[{p:[41,9,1763],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[35,5,1458]},{t:4,n:51,f:[{p:[44,7,1839],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],241:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Thermostat"},f:[{p:[2,3,35],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,67],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isActive"],s:'_0?"power-off":"close"'},p:[3,22,84]}],style:[{t:2,x:{r:["data.isActive"],s:'_0?"selected":null'},p:[4,10,137]}],state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[5,10,186]}],action:"power"},f:[{t:2,x:{r:["data.isActive"],s:'_0?"On":"Off"'},p:[6,18,249]}]}]}," ",{p:[8,3,314],t:7,e:"ui-section",a:{label:"Target"},f:[{p:[9,4,346],t:7,e:"ui-button",a:{icon:"pencil",action:"temperature",params:'{"target": "input"}'},f:[{t:2,x:{r:["adata.targetTemp"],s:"Math.round(_0)"},p:[9,79,421]}," K"]}]}]}," ",{p:{button:[{p:[14,5,564],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[14,36,595]}],action:"eject"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[16,3,692],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[18,7,762],t:7,e:"span",f:["Temperature: ",{t:2,x:{r:["adata.currentTemp"],s:"Math.round(_0)"},p:[18,26,781]}," K"]}," ",{p:[19,7,831],t:7,e:"br"}," ",{t:4,f:[{p:[21,9,885],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[21,52,928]}," units of ",{t:2,r:"name",p:[21,87,963]}]},{p:[21,102,978],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[20,7,845]},{t:4,n:51,f:[{p:[23,9,1009],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[17,5,727]},{t:4,n:51,f:[{p:[26,7,1085],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],242:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,32],t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[{p:[3,3,70],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"Eject":"close"'},p:[3,20,87]}],style:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"selected":null'},p:[4,11,143]}],state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[5,11,199]}],action:"eject"},f:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"Eject":"No beaker"'},p:[7,5,268]}]}," ",{p:[10,3,340],t:7,e:"ui-section",f:[{t:4,f:[{t:4,f:[{p:[13,6,426],t:7,e:"ui-section",a:{label:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[13,25,445]}," units of ",{t:2,r:"name",p:[13,60,480]}],nowrap:0},f:[{p:[14,7,505],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{p:[15,8,555],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[15,61,608]},'", "amount": 1}']},f:["1"]}," ",{p:[16,8,653],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[16,61,706]},'", "amount": 5}']},f:["5"]}," ",{p:[17,8,751],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[17,61,804]},'", "amount": 10}']},f:["10"]}," ",{p:[18,8,851],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[18,61,904]},'", "amount": 1000}']},f:["All"]}," ",{p:[19,8,954],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[19,61,1007]},'", "amount": -1}']},f:["Custom"]}," ",{p:[20,8,1058],t:7,e:"ui-button",a:{action:"analyze",params:['{"id": "',{t:2,r:"id",p:[20,52,1102]},'"}']},f:["Analyze"]}]}]}],n:52,r:"data.beakerContents",p:[12,5,390]},{t:4,n:51,f:[{p:[24,5,1184],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"data.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[11,4,357]},{t:4,n:51,f:[{p:[27,5,1255],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}," ",{p:[32,2,1343],t:7,e:"ui-display",a:{title:"Buffer"},f:[{p:[33,3,1374],t:7,e:"ui-button",a:{action:"toggleMode",state:[{t:2,x:{r:["data.mode"],s:'_0?null:"selected"'},p:[33,41,1412]}]},f:["Destroy"]}," ",{p:[34,3,1470],t:7,e:"ui-button",a:{action:"toggleMode",state:[{t:2,x:{r:["data.mode"],s:'_0?"selected":null'},p:[34,41,1508]}]},f:["Transfer to Beaker"]}," ",{p:[35,3,1577],t:7,e:"ui-section",f:[{t:4,f:[{p:[37,5,1629],t:7,e:"ui-section",a:{label:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[37,24,1648]}," units of ",{t:2,r:"name",p:[37,59,1683]}],nowrap:0},f:[{p:[38,6,1707],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{p:[39,7,1756],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[39,62,1811]},'", "amount": 1}']},f:["1"]}," ",{p:[40,7,1855],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[40,62,1910]},'", "amount": 5}']},f:["5"]}," ",{p:[41,7,1954],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[41,62,2009]},'", "amount": 10}']},f:["10"]}," ",{p:[42,7,2055],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[42,62,2110]},'", "amount": 1000}']},f:["All"]}," ",{p:[43,7,2159],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[43,62,2214]},'", "amount": -1}']},f:["Custom"]}," ",{p:[44,7,2264],t:7,e:"ui-button",a:{action:"analyze",params:['{"id": "',{t:2,r:"id",p:[44,51,2308]},'"}']},f:["Analyze"]}]}]}],n:52,r:"data.bufferContents",p:[36,4,1594]}]}]}," ",{t:4,f:[{p:[52,3,2444],t:7,e:"ui-display",a:{title:"Pills, Bottles and Patches"},f:[{t:4,f:[{p:[54,5,2534],t:7,e:"ui-button",a:{action:"ejectp",state:[{t:2,x:{r:["data.isPillBottleLoaded"],s:'_0?null:"disabled"'},p:[54,39,2568]}]},f:[{t:2,x:{r:["data.isPillBottleLoaded"],s:'_0?"Eject":"No Pill bottle loaded"'},p:[54,88,2617]}]}," ",{p:[55,5,2698],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.pillBotContent",p:[55,27,2720]},"/",{t:2,r:"data.pillBotMaxContent",p:[55,51,2744]}]}],n:50,r:"data.isPillBottleLoaded",p:[53,4,2497]},{t:4,n:51,f:[{p:[57,5,2796],t:7,e:"span",a:{"class":"average"},f:["No Pillbottle"]}],r:"data.isPillBottleLoaded"}," ",{p:[60,4,2860],t:7,e:"br"}," ",{p:[61,4,2870],t:7,e:"br"}," ",{p:[62,4,2880],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[62,63,2939]}]},f:["Create Pill (max 50µ)"]}," ",{p:[63,4,3023],t:7,e:"br"}," ",{p:[64,4,3033],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[64,63,3092]}]},f:["Create Multiple Pills"]}," ",{p:[65,4,3176],t:7,e:"br"}," ",{p:[66,4,3186],t:7,e:"br"}," ",{p:[67,4,3196],t:7,e:"ui-button",a:{action:"createPatch",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],
-s:'_0?null:"disabled"'},p:[67,64,3256]}]},f:["Create Patch (max 40µ)"]}," ",{p:[68,4,3341],t:7,e:"br"}," ",{p:[69,4,3351],t:7,e:"ui-button",a:{action:"createPatch",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[69,64,3411]}]},f:["Create Multiple Patches"]}," ",{p:[70,4,3497],t:7,e:"br"}," ",{p:[71,4,3507],t:7,e:"br"}," ",{p:[72,4,3517],t:7,e:"ui-button",a:{action:"createBottle",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[72,65,3578]}]},f:["Create Bottle (max 30µ)"]}," ",{p:[73,4,3664],t:7,e:"br"}," ",{p:[74,4,3674],t:7,e:"ui-button",a:{action:"createBottle",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[74,65,3735]}]},f:["Dispense Buffer to Bottles"]}]}],n:50,x:{r:["data.condi"],s:"!_0"},p:[51,2,2421]},{t:4,n:51,f:[{p:[79,3,3857],t:7,e:"ui-display",a:{title:"Condiments bottles and packs"},f:[{p:[80,4,3912],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[80,63,3971]}]},f:["Create Pack (max 10µ)"]}," ",{p:[81,4,4055],t:7,e:"br"}," ",{p:[82,4,4065],t:7,e:"br"}," ",{p:[83,4,4075],t:7,e:"ui-button",a:{action:"createBottle",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[83,65,4136]}]},f:["Create Bottle (max 50µ)"]}]}],x:{r:["data.condi"],s:"!_0"}}],n:50,x:{r:["data.screen"],s:'_0=="home"'},p:[1,1,0]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.screen"],s:'_0=="analyze"'},f:[{p:[87,2,4284],t:7,e:"ui-display",a:{title:[{t:2,r:"data.analyzeVars.name",p:[87,20,4302]}]},f:[{p:[88,3,4333],t:7,e:"span",a:{"class":"highlight"},f:["Description:"]}," ",{p:[89,3,4381],t:7,e:"span",a:{"class":"content",style:"float:center"},f:[{t:2,r:"data.analyzeVars.description",p:[89,46,4424]}]}," ",{p:[90,3,4467],t:7,e:"br"}," ",{p:[91,3,4476],t:7,e:"span",a:{"class":"highlight"},f:["Color:"]}," ",{p:[92,3,4518],t:7,e:"span",a:{style:["color: ",{t:2,r:"data.analyzeVars.color",p:[92,23,4538]},"; background-color: ",{t:2,r:"data.analyzeVars.color",p:[92,69,4584]}]},f:[{t:2,r:"data.analyzeVars.color",p:[92,97,4612]}]}," ",{p:[93,3,4649],t:7,e:"br"}," ",{p:[94,3,4658],t:7,e:"span",a:{"class":"highlight"},f:["State:"]}," ",{p:[95,3,4700],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.state",p:[95,25,4722]}]}," ",{p:[96,3,4759],t:7,e:"br"}," ",{p:[97,3,4768],t:7,e:"span",a:{"class":"highlight"},f:["Metabolization Rate:"]}," ",{p:[98,3,4824],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.metaRate",p:[98,25,4846]},"µ/minute"]}," ",{p:[99,3,4894],t:7,e:"br"}," ",{p:[100,3,4903],t:7,e:"span",a:{"class":"highlight"},f:["Overdose Threshold:"]}," ",{p:[101,3,4958],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.overD",p:[101,25,4980]}]}," ",{p:[102,3,5017],t:7,e:"br"}," ",{p:[103,3,5026],t:7,e:"span",a:{"class":"highlight"},f:["Addiction Threshold:"]}," ",{p:[104,3,5082],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.addicD",p:[104,25,5104]}]}," ",{p:[105,3,5142],t:7,e:"br"}," ",{p:[106,3,5151],t:7,e:"br"}," ",{p:[107,3,5160],t:7,e:"ui-button",a:{action:"goScreen",params:'{"screen": "home"}'},f:["Back"]}]}]}],x:{r:["data.screen"],s:'_0=="home"'}}]},e.exports=a.extend(r.exports)},{205:205}],243:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-button",a:{action:"toggle"},f:[{t:2,x:{r:["data.recollection"],s:'_0?"Recital":"Recollection"'},p:[2,30,43]}]}]}," ",{t:4,f:[{p:[5,3,149],t:7,e:"ui-display",f:[{t:3,r:"data.rec_text",p:[6,3,165]}," ",{t:4,f:[{p:[8,4,231],t:7,e:"br"},{p:[8,8,235],t:7,e:"ui-button",a:{action:"rec_category",params:['{"category": "',{t:2,r:"name",p:[8,63,290]},'"}']},f:[{t:3,r:"name",p:[8,75,302]}," - ",{t:3,r:"desc",p:[8,88,315]}]}],n:52,r:"data.recollection_categories",p:[7,3,188]}," ",{t:3,r:"data.rec_section",p:[10,3,354]}," ",{t:3,r:"data.rec_binds",p:[11,3,380]}]}],n:50,r:"data.recollection",p:[4,1,120]},{t:4,n:51,f:[{p:[14,2,431],t:7,e:"ui-display",a:{title:"Power",button:0},f:[{p:[15,4,469],t:7,e:"ui-section",f:[{t:3,r:"data.power",p:[16,6,488]}]}]}," ",{p:[19,2,541],t:7,e:"ui-display",f:[{p:[20,3,557],t:7,e:"ui-section",f:[{p:[21,4,574],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Driver"?"selected":null'},p:[21,22,592]}],action:"select",params:'{"category": "Driver"}'},f:["Driver"]}," ",{p:[22,4,715],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Script"?"selected":null'},p:[22,22,733]}],action:"select",params:'{"category": "Script"}'},f:["Scripts"]}," ",{p:[23,4,857],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Application"?"selected":null'},p:[23,22,875]}],action:"select",params:'{"category": "Application"}'},f:["Applications"]}," ",{p:[24,4,1014],t:7,e:"br"},{t:3,r:"data.tier_info",p:[24,8,1018]}]}," ",{p:[26,3,1059],t:7,e:"ui-section",f:[{t:3,r:"data.scripturecolors",p:[27,4,1076]}]},{p:[28,16,1119],t:7,e:"hr"}," ",{p:[29,3,1127],t:7,e:"ui-section",f:[{t:4,f:[{p:[31,4,1172],t:7,e:"div",f:[{p:[31,9,1177],t:7,e:"ui-button",a:{tooltip:[{t:3,r:"tip",p:[31,29,1197]}],"tooltip-side":"right",action:"recite",params:['{"category": "',{t:2,r:"type",p:[31,99,1267]},'"}']},f:["Recite ",{t:3,r:"required",p:[31,118,1286]}]}," ",{t:4,f:[{t:4,f:[{p:[34,6,1362],t:7,e:"ui-button",a:{action:"bind",params:['{"category": "',{t:2,r:"type",p:[34,53,1409]},'"}']},f:["Unbind ",{t:3,r:"bound",p:[34,72,1428]}]}],n:50,r:"bound",p:[33,5,1342]},{t:4,n:51,f:[{p:[36,6,1472],t:7,e:"ui-button",a:{action:"bind",params:['{"category": "',{t:2,r:"type",p:[36,53,1519]},'"}']},f:["Quickbind"]}],r:"bound"}],n:50,r:"quickbind",p:[32,6,1319]}," ",{t:3,r:"name",p:[39,6,1586]}," ",{t:3,r:"descname",p:[39,17,1597]}," ",{t:3,r:"invokers",p:[39,32,1612]}]}],n:52,r:"data.scripture",p:[30,3,1143]}]}]}],r:"data.recollection"}]},e.exports=a.extend(r.exports)},{205:205}],244:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Codex Gigas"},f:[{p:[2,2,35],t:7,e:"ui-section",f:[{t:2,r:"data.name",p:[3,3,51]}]}," ",{p:[5,5,86],t:7,e:"ui-section",a:{label:"Prefix"},f:[{p:[6,3,117],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[6,22,136]}],action:"Dark "},f:["Dark"]}," ",{p:[7,3,221],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[7,22,240]}],action:"Hellish "},f:["Hellish"]}," ",{p:[8,3,331],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[8,22,350]}],action:"Fallen "},f:["Fallen"]}," ",{p:[9,3,439],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[9,22,458]}],action:"Fiery "},f:["Fiery"]}," ",{p:[10,3,545],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[10,22,564]}],action:"Sinful "},f:["Sinful"]}," ",{p:[11,3,653],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[11,22,672]}],action:"Blood "},f:["Blood"]}," ",{p:[12,3,759],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[12,22,778]}],action:"Fluffy "},f:["Fluffy"]}]}," ",{p:[14,5,888],t:7,e:"ui-section",a:{label:"Title"},f:[{p:[15,3,918],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[15,22,937]}],action:"Lord "},f:["Lord"]}," ",{p:[16,3,1022],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[16,22,1041]}],action:"Prelate "},f:["Prelate"]}," ",{p:[17,3,1132],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[17,22,1151]}],action:"Count "},f:["Count"]}," ",{p:[18,3,1238],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[18,22,1257]}],action:"Viscount "},f:["Viscount"]}," ",{p:[19,3,1350],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[19,22,1369]}],action:"Vizier "},f:["Vizier"]}," ",{p:[20,3,1458],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[20,22,1477]}],action:"Elder "},f:["Elder"]}," ",{p:[21,3,1564],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[21,22,1583]}],action:"Adept "},f:["Adept"]}]}," ",{p:[23,5,1691],t:7,e:"ui-section",a:{label:"Name"},f:[{p:[24,3,1720],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[24,22,1739]}],action:"hal"},f:["hal"]}," ",{p:[25,3,1821],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[25,22,1840]}],action:"ve"},f:["ve"]}," ",{p:[26,3,1920],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[26,22,1939]}],action:"odr"},f:["odr"]}," ",{p:[27,3,2021],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[27,22,2040]}],action:"neit"},f:["neit"]}," ",{p:[28,3,2124],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[28,22,2143]}],action:"ci"},f:["ci"]}," ",{p:[29,3,2223],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[29,22,2242]}],action:"quon"},f:["quon"]}," ",{p:[30,3,2326],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[30,22,2345]}],action:"mya"},f:["mya"]}," ",{p:[31,3,2427],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[31,22,2446]}],action:"folth"},f:["folth"]}," ",{p:[32,3,2532],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[32,22,2551]}],action:"wren"},f:["wren"]}," ",{p:[33,3,2635],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[33,22,2654]}],action:"geyr"},f:["geyr"]}," ",{p:[34,3,2738],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[34,22,2757]}],action:"hil"},f:["hil"]}," ",{p:[35,3,2839],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[35,22,2858]}],action:"niet"},f:["niet"]}," ",{p:[36,3,2942],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[36,22,2961]}],action:"twou"},f:["twou"]}," ",{p:[37,3,3045],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[37,22,3064]}],action:"phi"},f:["phi"]}," ",{p:[38,3,3146],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[38,22,3165]}],action:"coa"},f:["coa"]}]}," ",{p:[40,5,3268],t:7,e:"ui-section",a:{label:"suffix"},f:[{p:[41,3,3299],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[41,22,3318]}],action:" the Red"},f:["the Red"]}," ",{p:[42,3,3409],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[42,22,3428]}],action:" the Soulless"},f:["the Soulless"]}," ",{p:[43,3,3529],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[43,22,3548]}],action:" the Master"},f:["the Master"]}," ",{p:[44,3,3645],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[44,22,3664]}],action:", the Lord of all things"},f:["the Lord of all things"]}," ",{p:[45,3,3786],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[45,22,3805]}],action:", Jr."},f:["jr"]}]}," ",{p:[47,5,3909],t:7,e:"ui-section",a:{label:"submit"},f:[{p:[48,3,3941],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0>=4?null:"disabled"'},p:[48,21,3959]}],action:"search"},f:["search"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],245:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[2,1,2],t:7,e:"ui-button",a:{icon:"circle",action:"clean_order"},f:["Clear Order"]},{p:[2,70,71],t:7,e:"br"},{p:[2,74,75],t:7,e:"br"}," ",{p:[3,1,81],t:7,e:"i",f:["Your new computer device you always dreamed of is just four steps away..."]},{p:[3,81,161],t:7,e:"hr"}," ",{t:4,f:[" ",{p:[5,1,223],t:7,e:"div",a:{"class":"item"},f:[{p:[6,2,244],t:7,e:"h2",f:["Step 1: Select your device type"]}," ",{p:[7,2,287],t:7,e:"ui-button",a:{icon:"calc",action:"pick_device",params:'{"pick" : "1"}'},f:["Laptop"]}," ",{p:[8,2,377],t:7,e:"ui-button",a:{icon:"calc",action:"pick_device",params:'{"pick" : "2"}'},f:["LTablet"]}]}],n:50,x:{r:["data.state"],s:"_0==0"},p:[4,1,167]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.state"],s:"_0==1"},f:[{p:[11,1,502],t:7,e:"div",a:{"class":"item"},f:[{p:[12,2,523],t:7,e:"h2",f:["Step 2: Personalise your device"]}," ",{p:[13,2,566],t:7,e:"table",f:[{p:[14,3,577],t:7,e:"tr",f:[{p:[15,4,586],t:7,e:"td",f:[{p:[15,8,590],t:7,e:"b",f:["Current Price:"]}]},{p:[16,4,616],t:7,e:"td",f:[{t:2,r:"data.totalprice",p:[16,8,620]},"C"]}]}," ",{p:[18,3,653],t:7,e:"tr",f:[{p:[19,4,663],t:7,e:"td",f:[{p:[19,8,667],t:7,e:"b",f:["Battery:"]}]},{p:[20,4,687],t:7,e:"td",f:[{p:[20,8,691],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "1"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==1?"selected":null'},p:[20,73,756]}]},f:["Standard"]}]},{p:[21,4,827],t:7,e:"td",f:[{p:[21,8,831],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "2"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==2?"selected":null'},p:[21,73,896]}]},f:["Upgraded"]}]},{p:[22,4,967],t:7,e:"td",f:[{p:[22,8,971],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "3"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==3?"selected":null'},p:[22,73,1036]}]},f:["Advanced"]}]}]}," ",{p:[24,3,1115],t:7,e:"tr",f:[{p:[25,4,1124],t:7,e:"td",f:[{p:[25,8,1128],t:7,e:"b",f:["Hard Drive:"]}]},{p:[26,4,1151],t:7,e:"td",f:[{p:[26,8,1155],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "1"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==1?"selected":null'},p:[26,67,1214]}]},f:["Standard"]}]},{p:[27,4,1282],t:7,e:"td",f:[{p:[27,8,1286],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "2"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==2?"selected":null'},p:[27,67,1345]}]},f:["Upgraded"]}]},{p:[28,4,1413],t:7,e:"td",f:[{p:[28,8,1417],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "3"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==3?"selected":null'},p:[28,67,1476]}]},f:["Advanced"]}]}]}," ",{p:[30,3,1552],t:7,e:"tr",f:[{p:[31,4,1561],t:7,e:"td",f:[{p:[31,8,1565],t:7,e:"b",f:["Network Card:"]}]},{p:[32,4,1590],t:7,e:"td",f:[{p:[32,8,1594],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "0"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==0?"selected":null'},p:[32,73,1659]}]},f:["None"]}]},{p:[33,4,1726],t:7,e:"td",f:[{p:[33,8,1730],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "1"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==1?"selected":null'},p:[33,73,1795]}]},f:["Standard"]}]},{p:[34,4,1866],t:7,e:"td",f:[{p:[34,8,1870],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "2"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==2?"selected":null'},p:[34,73,1935]}]},f:["Advanced"]}]}]}," ",{p:[36,3,2014],t:7,e:"tr",f:[{p:[37,4,2023],t:7,e:"td",f:[{p:[37,8,2027],t:7,e:"b",f:["Nano Printer:"]}]},{p:[38,4,2052],t:7,e:"td",f:[{p:[38,8,2056],t:7,e:"ui-button",a:{action:"hw_nanoprint",params:'{"print" : "0"}',state:[{t:2,x:{r:["data.hw_nanoprint"],s:'_0==0?"selected":null'},p:[38,73,2121]}]},f:["None"]}]},{p:[39,4,2190],t:7,e:"td",f:[{p:[39,8,2194],t:7,e:"ui-button",a:{action:"hw_nanoprint",params:'{"print" : "1"}',state:[{t:2,x:{r:["data.hw_nanoprint"],s:'_0==1?"selected":null'},p:[39,73,2259]}]},f:["Standard"]}]}]}," ",{p:[41,3,2340],t:7,e:"tr",f:[{p:[42,4,2349],t:7,e:"td",f:[{p:[42,8,2353],t:7,e:"b",f:["Card Reader:"]}]},{p:[43,4,2377],t:7,e:"td",f:[{p:[43,8,2381],t:7,e:"ui-button",a:{action:"hw_card",params:'{"card" : "0"}',state:[{t:2,x:{r:["data.hw_card"],s:'_0==0?"selected":null'},p:[43,67,2440]}]},f:["None"]}]},{p:[44,4,2504],t:7,e:"td",f:[{p:[44,8,2508],t:7,e:"ui-button",a:{action:"hw_card",params:'{"card" : "1"}',state:[{t:2,x:{r:["data.hw_card"],s:'_0==1?"selected":null'},p:[44,67,2567]}]},f:["Standard"]}]}]}]}," ",{t:4,f:[" ",{p:[49,4,2706],t:7,e:"table",f:[{p:[50,5,2719],t:7,e:"tr",f:[{p:[51,6,2730],t:7,e:"td",f:[{p:[51,10,2734],t:7,e:"b",f:["Processor Unit:"]}]},{p:[52,6,2763],t:7,e:"td",f:[{p:[52,10,2767],t:7,e:"ui-button",a:{action:"hw_cpu",params:'{"cpu" : "1"}',state:[{t:2,x:{r:["data.hw_cpu"],s:'_0==1?"selected":null'},p:[52,67,2824]}]},f:["Standard"]}]},{p:[53,6,2893],t:7,e:"td",f:[{p:[53,10,2897],t:7,e:"ui-button",a:{action:"hw_cpu",params:'{"cpu" : "2"}',state:[{t:2,x:{r:["data.hw_cpu"],s:'_0==2?"selected":null'},p:[53,67,2954]}]},f:["Advanced"]}]}]}," ",{p:[55,5,3033],t:7,e:"tr",f:[{p:[56,6,3044],t:7,e:"td",f:[{p:[56,10,3048],t:7,e:"b",f:["Tesla Relay:"]}]},{p:[57,6,3074],t:7,e:"td",f:[{p:[57,10,3078],t:7,e:"ui-button",a:{action:"hw_tesla",params:'{"tesla" : "0"}',state:[{t:2,x:{r:["data.hw_tesla"],s:'_0==0?"selected":null'},p:[57,71,3139]}]},f:["None"]}]},{p:[58,6,3206],t:7,e:"td",f:[{p:[58,10,3210],t:7,e:"ui-button",a:{action:"hw_tesla",params:'{"tesla" : "1"}',state:[{t:2,x:{r:["data.hw_tesla"],s:'_0==1?"selected":null'},p:[58,71,3271]}]},f:["Standard"]}]}]}]}],n:50,x:{r:["data.devtype"],s:"_0!=2"},p:[48,3,2659]}," ",{p:[62,3,3374],t:7,e:"table",f:[{p:[63,4,3386],t:7,e:"tr",f:[{p:[64,5,3396],t:7,e:"td",f:[{p:[64,9,3400],t:7,e:"b",f:["Confirm Order:"]}]},{p:[65,5,3427],t:7,e:"td",f:[{p:[65,9,3431],t:7,e:"ui-button",a:{action:"confirm_order"},f:["CONFIRM"]}]}]}]}," ",{p:[69,2,3512],t:7,e:"hr"}," ",{p:[70,2,3519],t:7,e:"b",f:["Battery"]}," allows your device to operate without external utility power source. Advanced batteries increase battery life.",{p:[70,127,3644],t:7,e:"br"}," ",{p:[71,2,3651],t:7,e:"b",f:["Hard Drive"]}," stores file on your device. Advanced drives can store more files, but use more power, shortening battery life.",{p:[71,130,3779],t:7,e:"br"}," ",{p:[72,2,3786],t:7,e:"b",f:["Network Card"]}," allows your device to wirelessly connect to stationwide NTNet network. Basic cards are limited to on-station use, while advanced cards can operate anywhere near the station, which includes the asteroid outposts.",{p:[72,233,4017],t:7,e:"br"}," ",{p:[73,2,4024],t:7,e:"b",f:["Processor Unit"]}," is critical for your device's functionality. It allows you to run programs from your hard drive. Advanced CPUs use more power, but allow you to run more programs on background at once.",{p:[73,208,4230],t:7,e:"br"}," ",{p:[74,2,4237],t:7,e:"b",f:["Tesla Relay"]}," is an advanced wireless power relay that allows your device to connect to nearby area power controller to provide alternative power source. This component is currently unavailable on tablet computers due to size restrictions.",{p:[74,246,4481],t:7,e:"br"}," ",{p:[75,2,4488],t:7,e:"b",f:["Nano Printer"]}," is device that allows for various paperwork manipulations, such as, scanning of documents or printing new ones. This device was certified EcoFriendlyPlus and is capable of recycling existing paper for printing purposes.",{p:[75,241,4727],t:7,e:"br"}," ",{p:[76,2,4734],t:7,e:"b",f:["Card Reader"]}," adds a slot that allows you to manipulate RFID cards. Please note that this is not necessary to allow the device to read your identification, it is just necessary to manipulate other cards."]}]},{t:4,n:50,x:{r:["data.state"],s:"(!(_0==1))&&(_0==2)"},f:[" ",{p:[79,2,4981],t:7,e:"h2",f:["Step 3: Payment"]}," ",{p:[80,2,5008],t:7,e:"b",f:["Your device is now ready for fabrication.."]},{p:[80,51,5057],t:7,e:"br"}," ",{p:[81,2,5064],t:7,e:"i",f:["Please ensure the required amount of credits are in the machine, then press purchase."]},{p:[81,94,5156],t:7,e:"br"}," ",{p:[82,2,5163],t:7,e:"i",f:["Current credits: ",{p:[82,22,5183],t:7,e:"b",f:[{t:2,r:"data.credits",p:[82,25,5186]},"C"]}]},{p:[82,50,5211],t:7,e:"br"}," ",{p:[83,2,5218],t:7,e:"i",f:["Total price: ",{p:[83,18,5234],t:7,e:"b",f:[{t:2,r:"data.totalprice",p:[83,21,5237]},"C"]}]},{p:[83,49,5265],t:7,e:"br"},{p:[83,53,5269],t:7,e:"br"}," ",{p:[84,2,5276],t:7,e:"ui-button",a:{action:"purchase",state:[{t:2,x:{r:["data.credits","data.totalprice"],s:'_0>=_1?null:"disabled"'},p:[84,38,5312]}]},f:["PURCHASE"]}]},{t:4,n:50,x:{r:["data.state"],s:"(!(_0==1))&&((!(_0==2))&&(_0==3))"},f:[" ",{p:[87,2,5423],t:7,e:"h2",f:["Step 4: Thank you for your purchase"]},{p:[87,46,5467],t:7,e:"br"}," ",{p:[88,2,5474],t:7,e:"b",f:["Should you experience any issues with your new device, contact your local network admin for assistance."]}]}],x:{r:["data.state"],s:"_0==0"}}]},e.exports=a.extend(r.exports)},{205:205}],246:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,1,22],t:7,e:"ui-display",f:[{p:[3,2,37],t:7,e:"ui-section",a:{label:"Cap"},f:[{p:[4,3,65],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.is_capped"],s:'_0?"power-off":"close"'},p:[4,20,82]}],style:[{t:2,x:{r:["data.is_capped"],s:'_0?null:"selected"'},p:[4,71,133]}],action:"toggle_cap"},f:[{t:2,x:{r:["data.is_capped"],s:'_0?"On":"Off"'},p:[6,4,202]}]}]}]}],n:50,r:"data.has_cap",p:[1,1,0]},{p:[10,1,288],t:7,e:"ui-display",f:[{t:4,f:[{p:[14,2,419],t:7,e:"ui-section",f:[{p:[15,3,435],t:7,e:"ui-button",a:{action:"select_colour"},f:["Select New Colour"]}]}],n:50,r:"data.can_change_colour",p:[13,1,386]}]}," ",{p:[19,1,540],t:7,e:"ui-display",a:{title:"Stencil"},f:[{t:4,f:[{p:[21,2,599],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[21,21,618]}]},f:[{t:4,f:[{p:[23,7,655],t:7,e:"ui-button",a:{action:"select_stencil",params:['{"item":"',{t:2,r:"item",p:[23,59,707]},'"}'],style:[{t:2,x:{r:["item","data.selected_stencil"],s:'_0==_1?"selected":null'},p:[24,12,731]}]},f:[{t:2,r:"item",p:[25,4,791]}]}],n:52,r:"items",p:[22,3,632]}]}],n:52,r:"data.drawables",p:[20,3,572]}]}," ",{p:[31,1,874],t:7,e:"ui-display",a:{title:"Text Mode"},f:[{p:[32,2,907],t:7,e:"ui-section",a:{label:"Current Buffer"},f:[{t:2,r:"text_buffer",p:[32,37,942]}]}," ",{p:[34,2,976],t:7,e:"ui-section",f:[{p:[34,14,988],t:7,e:"ui-button",a:{action:"enter_text"},f:["New Text"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],247:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{isHead:function(t){return t%10==0},dept_class:function(t){return 0==t?"dept-cap":t>=10&&20>t?"dept-sec":t>=20&&30>t?"dept-med":t>=30&&40>t?"dept-sci":t>=40&&50>t?"dept-eng":t>=50&&60>t?"dept-cargo":t>=200&&230>t?"dept-cent":"dept-other"},health_state:function(t,e,n,a){var r=t+e+n+a;return 0>=r?"health-5":25>=r?"health-4":50>=r?"health-3":75>=r?"health-2":"health-0"}},computed:{sorted_sensors:function(){var t=this.get("data.sensors");return t.sort(function(t,e){return t.ijob-e.ijob})}}}}(r),r.exports.css=" .health {\r\n width: 16px;\r\n height: 16px;\r\n background-color: #FFF;\r\n border: 1px solid #434343;\r\n position: relative;\r\n top: 2px;\r\n display: inline-block;\r\n }\r\n .health-5 { background-color: #17d568; }\r\n .health-4 { background-color: #2ecc71; }\r\n .health-3 { background-color: #e67e22; }\r\n .health-2 { background-color: #ed5100; }\r\n .health-1 { background-color: #e74c3c; }\r\n .health-0 { background-color: #ed2814; }\r\n\r\n .dept-cap {color : #C06616;}\r\n .dept-sec {color : #E74C3C;}\r\n .dept-med {color : #3498DB;}\r\n .dept-sci {color : #9B59B6;}\r\n .dept-eng {color : #F1C40F;}\r\n .dept-cargo {color : #F39C12;}\r\n .dept-cent {color : #00C100;}\r\n .dept-other {color: #C38312;}\r\n\r\n .oxy { color : #3498db; }\r\n .toxin { color : #2ecc71; }\r\n .burn { color : #e67e22; }\r\n .brute { color : #e74c3c; }\r\n\r\n table.crew{\r\n border-collapse: collapse;\r\n }\r\n\r\n table.crew td {\r\n padding : 0px 10px;\r\n }",r.exports.template={v:3,t:[" ",{p:[33,1,1192],t:7,e:"ui-display",f:[{p:[34,2,1207],t:7,e:"ui-section",f:[{p:[35,3,1223],t:7,e:"table",a:{"class":"crew"},f:[{p:[36,3,1247],t:7,e:"thead",f:[{p:[37,3,1258],t:7,e:"tr",f:[{p:[38,4,1267],t:7,e:"th",f:["Name"]}," ",{p:[39,4,1285],t:7,e:"th",f:["Status"]}," ",{p:[40,4,1305],t:7,e:"th",f:["Vitals"]}," ",{p:[41,4,1325],t:7,e:"th",f:["Position"]}," ",{t:4,f:[{p:[43,5,1378],t:7,e:"th",f:["Tracking"]}],n:50,r:"data.link_allowed",p:[42,4,1347]}]}]}," ",{p:[47,3,1432],t:7,e:"tbody",f:[{t:4,f:[{p:[49,4,1472],t:7,e:"tr",f:[{p:[50,5,1482],t:7,e:"td",f:[{p:[51,6,1493],t:7,e:"span",a:{"class":[{t:2,x:{r:["isHead","ijob"],s:'_0(_1)?"bold ":""'},p:[51,19,1506]},{t:2,x:{r:["dept_class","ijob"],s:"_0(_1)"},p:[51,49,1536]}]},f:[{t:2,r:"name",p:[52,7,1566]}," (",{t:2,r:"assignment",p:[52,17,1576]},") ",{p:[53,6,1598],t:7,e:"span",f:[]}]}]}," ",{p:[55,5,1621],t:7,e:"td",f:[{t:4,f:[{p:[57,7,1662],t:7,e:"span",a:{"class":["health ",{t:2,x:{r:["health_state","oxydam","toxdam","burndam","brutedam"],s:"_0(_1,_2,_3,_4)"},p:[57,27,1682]}]}}],n:50,x:{r:["oxydam"],s:"_0!=null"},p:[56,6,1632]},{t:4,n:51,f:[{t:4,f:[{p:[60,8,1790],t:7,e:"span",a:{"class":"health health-5"}}],n:50,r:"life_status",p:[59,7,1762]},{t:4,n:51,f:[{p:[62,8,1852],t:7,e:"span",a:{"class":"health health-0"}}],r:"life_status"}],x:{r:["oxydam"],s:"_0!=null"}}]}," ",{p:[66,5,1935],t:7,e:"td",f:[{t:4,f:[{p:[68,7,1976],t:7,e:"span",f:["( ",{p:[70,8,2e3],t:7,e:"span",a:{"class":"oxy"},f:[{t:2,r:"oxydam",p:[70,26,2018]}]}," / ",{p:[72,8,2054],t:7,e:"span",a:{"class":"toxin"},f:[{t:2,r:"toxdam",p:[72,28,2074]}]}," / ",{p:[74,8,2110],t:7,e:"span",a:{"class":"burn"},f:[{t:2,r:"burndam",p:[74,27,2129]}]}," / ",{p:[76,8,2166],t:7,e:"span",a:{"class":"brute"},f:[{t:2,r:"brutedam",p:[76,28,2186]}]}," )"]}],n:50,x:{r:["oxydam"],s:"_0!=null"},p:[67,6,1946]},{t:4,n:51,f:[{t:4,f:[{p:[81,8,2280],t:7,e:"span",f:["Alive"]}],n:50,r:"life_status",p:[80,7,2252]},{t:4,n:51,f:[{p:[83,8,2323],t:7,e:"span",f:["Dead"]}],r:"life_status"}],x:{r:["oxydam"],s:"_0!=null"}}]}," ",{p:[87,5,2386],t:7,e:"td",f:[{t:4,f:[{p:[89,6,2424],t:7,e:"span",f:[{t:2,r:"area",p:[89,12,2430]}]}],n:50,x:{r:["pos_x"],s:"_0!=null"},p:[88,5,2396]},{t:4,n:51,f:[{p:[91,6,2466],t:7,e:"span",f:["N/A"]}],x:{r:["pos_x"],s:"_0!=null"}}]}," ",{t:4,f:[{p:[95,6,2545],t:7,e:"td",f:[{p:[96,7,2557],t:7,e:"ui-button",a:{action:"select_person",state:[{t:2,x:{r:["can_track"],s:'_0?null:"disabled"'},p:[96,48,2598]}],params:['{"name":"',{t:2,r:"name",p:[96,100,2650]},'"}']},f:["Track"]}]}],n:50,r:"data.link_allowed",p:[94,5,2512]}]}],n:52,r:"sorted_sensors",p:[48,3,1443]}]}]}]}]}," "]},e.exports=a.extend(r.exports)},{205:205}],248:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[2,3,33],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[3,3,66],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[3,9,72]}]}]}," ",{t:4,f:[{p:[6,5,189],t:7,e:"ui-section",a:{label:"State"},f:[{p:[7,7,223],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.statstate",p:[7,20,236]}]},f:[{t:2,r:"data.occupant.stat",p:[7,49,265]}]}]}," ",{p:[9,4,317],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[10,6,356],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.temperaturestatus",p:[10,19,369]}]},f:[{t:2,r:"data.occupant.bodyTemperature",p:[10,56,406]}," K"]}]}," ",{p:[12,5,472],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[13,7,507],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[13,20,520]}],max:[{t:2,r:"data.occupant.maxHealth",p:[13,54,554]}],value:[{t:2,r:"data.occupant.health",p:[13,90,590]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[14,16,632]}]},f:[{t:2,r:"data.occupant.health",p:[14,68,684]}]}]}," ",{t:4,f:[{p:[17,7,908],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[17,26,927]}]},f:[{p:[18,9,948],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[18,30,969]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[18,66,1005]}],state:"bad"},f:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[18,103,1042]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[16,5,742]}],n:50,r:"data.hasOccupant",p:[5,3,159]}]}," ",{p:[23,1,1138],t:7,e:"ui-display",a:{title:"Cell"},f:[{p:[24,3,1167],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[25,5,1199],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOperating"],s:'_0?"power-off":"close"'},p:[25,22,1216]}],style:[{t:2,x:{r:["data.isOperating"],s:'_0?"selected":null'},p:[26,14,1276]}],state:[{t:2,x:{r:["data.isOpen"],s:'_0?"disabled":null'},p:[27,14,1332]}],action:"power"},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[28,22,1391]}]}]}," ",{p:[30,3,1459],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[31,3,1495],t:7,e:"span",a:{"class":[{t:2,r:"data.temperaturestatus",p:[31,16,1508]}]},f:[{t:2,r:"data.cellTemperature",p:[31,44,1536]}," K"]}]}," ",{p:[33,2,1588],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[34,5,1619],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOpen"],s:'_0?"unlock":"lock"'},p:[34,22,1636]}],action:"door"},f:[{t:2,x:{r:["data.isOpen"],s:'_0?"Open":"Closed"'},p:[34,73,1687]}]}," ",{p:[35,5,1740],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoEject"],s:'_0?"sign-out":"sign-in"'},p:[35,22,1757]}],action:"autoeject"},f:[{t:2,x:{r:["data.autoEject"],s:'_0?"Auto":"Manual"'},p:[35,86,1821]}]}]}]}," ",{p:{button:[{p:[40,5,1967],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[40,36,1998]}],action:"ejectbeaker"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[42,3,2101],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{t:4,f:[{p:[45,9,2211],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,r:"volume",p:[45,52,2254]}," units of ",{t:2,r:"name",p:[45,72,2274]}]},{p:[45,87,2289],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[44,7,2171]},{t:4,n:51,f:[{p:[47,9,2320],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[43,5,2136]},{t:4,n:51,f:[{p:[50,7,2396],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],249:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"ui-section",a:{label:"State"},f:[{t:4,f:[{p:[4,4,76],t:7,e:"span",a:{"class":"good"},f:["Ready"]}],n:50,r:"data.full_pressure",p:[3,3,45]},{t:4,n:51,f:[{t:4,f:[{p:[7,5,153],t:7,e:"span",a:{"class":"bad"},f:["Power Disabled"]}],n:50,r:"data.panel_open",p:[6,4,124]},{t:4,n:51,f:[{t:4,f:[{p:[10,6,248],t:7,e:"span",a:{"class":"average"},f:["Pressurizing"]}],n:50,r:"data.pressure_charging",p:[9,5,211]},{t:4,n:51,f:[{p:[12,6,310],t:7,e:"span",a:{"class":"bad"},f:["Off"]}],r:"data.pressure_charging"}],r:"data.panel_open"}],r:"data.full_pressure"}]}," ",{p:[17,2,393],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[18,3,426],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.per",p:[18,36,459]}],state:"good"},f:[{t:2,r:"data.per",p:[18,63,486]},"%"]}]}," ",{p:[20,5,530],t:7,e:"ui-section",a:{label:"Handle"},f:[{p:[21,9,567],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.flush"],s:'_0?"toggle-on":"toggle-off"'},p:[22,10,589]}],state:[{t:2,x:{r:["data.isai","data.panel_open"],s:'_0||_1?"disabled":null'},p:[23,11,647]}],action:[{t:2,x:{r:["data.flush"],s:'_0?"handle-0":"handle-1"'},p:[24,12,714]}]},f:[{t:2,x:{r:["data.flush"],s:'_0?"Disengage":"Engage"'},p:[25,5,763]}]}]}," ",{p:[27,2,837],t:7,e:"ui-section",a:{label:"Eject"},f:[{p:[28,3,867],t:7,e:"ui-button",a:{icon:"sign-out",state:[{t:2,x:{r:["data.isai"],s:'_0?"disabled":null'},p:[28,37,901]}],action:"eject"},f:["Eject Contents"]},{p:[28,114,978],t:7,e:"br"}]}," ",{p:[30,2,1002],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[31,3,1032],t:7,e:"ui-button",a:{icon:"power-off",state:[{t:2,x:{r:["data.panel_open"],s:'_0?"disabled":null'},p:[31,38,1067]}],action:[{t:2,x:{r:["data.pressure_charging"],s:'_0?"pump-0":"pump-1"'},p:[31,87,1116]}],style:[{t:2,x:{r:["data.pressure_charging"],
-s:'_0?"selected":null'},p:[31,145,1174]}]}},{p:[31,206,1235],t:7,e:"br"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],250:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"DNA Vault Database"},f:[{p:[2,3,43],t:7,e:"ui-section",a:{label:"Human DNA"},f:[{p:[3,7,81],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.dna_max",p:[3,28,102]}],value:[{t:2,r:"data.dna",p:[3,53,127]}]},f:[{t:2,r:"data.dna",p:[3,67,141]},"/",{t:2,r:"data.dna_max",p:[3,80,154]}," Samples"]}]}," ",{p:[5,3,208],t:7,e:"ui-section",a:{label:"Plant Data"},f:[{p:[6,5,245],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.plants_max",p:[6,26,266]}],value:[{t:2,r:"data.plants",p:[6,54,294]}]},f:[{t:2,r:"data.plants",p:[6,71,311]},"/",{t:2,r:"data.plants_max",p:[6,87,327]}," Samples"]}]}," ",{p:[8,3,384],t:7,e:"ui-section",a:{label:"Animal Data"},f:[{p:[9,5,422],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.animals_max",p:[9,26,443]}],value:[{t:2,r:"data.animals",p:[9,55,472]}]},f:[{t:2,r:"data.animals",p:[9,73,490]},"/",{t:2,r:"data.animals_max",p:[9,90,507]}," Samples"]}]}]}," ",{t:4,f:[{p:[13,1,616],t:7,e:"ui-display",a:{title:"Personal Gene Therapy"},f:[{p:[14,3,663],t:7,e:"ui-section",f:[{p:[15,2,678],t:7,e:"span",f:["Applicable gene therapy treatments:"]}]}," ",{p:[17,3,747],t:7,e:"ui-section",f:[{p:[18,2,762],t:7,e:"ui-button",a:{action:"gene",params:['{"choice": "',{t:2,r:"data.choiceA",p:[18,47,807]},'"}']},f:[{t:2,r:"data.choiceA",p:[18,67,827]}]}," ",{p:[19,2,858],t:7,e:"ui-button",a:{action:"gene",params:['{"choice": "',{t:2,r:"data.choiceB",p:[19,47,903]},'"}']},f:[{t:2,r:"data.choiceB",p:[19,67,923]}]}]}]}],n:50,x:{r:["data.completed","data.used"],s:"_0&&!_1"},p:[12,1,578]}]},e.exports=a.extend(r.exports)},{205:205}],251:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[2,3,33],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[3,3,66],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[3,9,72]}]}]}," ",{t:4,f:[{p:[6,5,183],t:7,e:"ui-section",a:{label:"Items in storage"},f:[{p:[7,4,225],t:7,e:"span",f:[{t:2,r:"data.items",p:[7,10,231]}]}]}],n:50,r:"data.items",p:[5,3,159]}," ",{t:4,f:[{p:[11,5,310],t:7,e:"ui-section",a:{label:"State"},f:[{p:[12,7,344],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.statstate",p:[12,20,357]}]},f:[{t:2,r:"data.occupant.stat",p:[12,49,386]}]}]}," ",{p:[14,5,439],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[15,7,474],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[15,20,487]}],max:[{t:2,r:"data.occupant.maxHealth",p:[15,54,521]}],value:[{t:2,r:"data.occupant.health",p:[15,90,557]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[16,16,599]}]},f:[{t:2,x:{r:["adata.occupant.health"],s:"Math.round(_0)"},p:[16,68,651]}]}]}," ",{t:4,f:[{p:[19,7,888],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[19,26,907]}]},f:[{p:[20,9,928],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[20,30,949]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[20,66,985]}],state:"bad"},f:[{t:2,x:{r:["type","adata.occupant"],s:"Math.round(_1[_0])"},p:[20,103,1022]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[18,5,722]}," ",{p:[23,5,1109],t:7,e:"ui-section",a:{label:"Cells"},f:[{p:[24,9,1145],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"bad":"good"'},p:[24,22,1158]}]},f:[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"Damaged":"Healthy"'},p:[24,68,1204]}]}]}," ",{p:[26,5,1287],t:7,e:"ui-section",a:{label:"Brain"},f:[{p:[27,9,1323],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"bad":"good"'},p:[27,22,1336]}]},f:[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"Abnormal":"Healthy"'},p:[27,68,1382]}]}]}," ",{p:[29,5,1466],t:7,e:"ui-section",a:{label:"Bloodstream"},f:[{t:4,f:[{p:[31,11,1553],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,1)"},p:[31,54,1596]}," units of ",{t:2,r:"name",p:[31,89,1631]}]},{p:[31,104,1646],t:7,e:"br"}],n:52,r:"adata.occupant.reagents",p:[30,9,1508]},{t:4,n:51,f:[{p:[33,11,1681],t:7,e:"span",a:{"class":"good"},f:["Pure"]}],r:"adata.occupant.reagents"}]}],n:50,r:"data.occupied",p:[10,3,283]}]}," ",{p:[38,1,1777],t:7,e:"ui-display",a:{title:"Operations"},f:[{p:[39,3,1812],t:7,e:"ui-section",a:{label:"Inject"},f:[{t:4,f:[{p:[41,7,1872],t:7,e:"ui-button",a:{icon:"flask",state:[{t:2,x:{r:["data.occupied"],s:'_0?null:"disabled"'},p:[41,38,1903]}],action:"inject",params:['{"chem": "',{t:2,r:"id",p:[41,111,1976]},'"}']},f:[{t:2,r:"name",p:[41,121,1986]}]},{p:[41,141,2006],t:7,e:"br"}],n:52,r:"data.chem",p:[40,5,1845]}]}," ",{p:[44,2,2046],t:7,e:"ui-section",a:{label:"Eject"},f:[{p:[45,6,2079],t:7,e:"ui-button",a:{icon:"sign-out",action:"eject"},f:["Eject Contents"]}]}," ",{p:[47,2,2166],t:7,e:"ui-section",a:{label:"Self Cleaning"},f:[{p:[48,3,2204],t:7,e:"ui-button",a:{icon:"recycle",action:"cleaning"},f:["Self-Clean Cycle"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],252:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,24],t:7,e:"ui-display",a:{title:[{t:2,r:"data.question",p:[2,21,42]}]},f:[{p:[3,5,66],t:7,e:"ui-section",f:[{t:4,f:[{p:[5,9,118],t:7,e:"ui-button",a:{action:"vote",params:['{"answer": "',{t:2,r:"answer",p:[6,45,174]},'"}'],style:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[7,18,206]}]},f:[{t:2,r:"answer",p:[7,53,241]}," (",{t:2,r:"amount",p:[7,65,253]},")"]}],n:52,r:"data.answers",p:[4,7,86]}]}]}],n:50,r:"data.shaking",p:[1,1,0]},{t:4,n:51,f:[{p:[13,3,353],t:7,e:"ui-notice",f:["The eightball is not currently being shaken."]}],r:"data.shaking"}]},e.exports=a.extend(r.exports)},{205:205}],253:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,5,17],t:7,e:"span",f:["Time Until Launch: ",{t:2,r:"data.timer_str",p:[2,30,42]}]}]}," ",{p:[4,1,83],t:7,e:"ui-notice",f:[{p:[5,3,98],t:7,e:"span",f:["Engines: ",{t:2,x:{r:["data.engines_started"],s:'_0?"Online":"Idle"'},p:[5,18,113]}]}]}," ",{p:[7,1,180],t:7,e:"ui-display",a:{title:"Early Launch"},f:[{p:[8,2,216],t:7,e:"span",f:["Authorizations Remaining: ",{t:2,x:{r:["data.emagged","data.authorizations_remaining"],s:'_0?"ERROR":_1'},p:[9,2,250]}]}," ",{p:[10,2,318],t:7,e:"ui-button",a:{icon:"exclamation-triangle",action:"authorize",style:"danger",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[12,10,404]}]},f:["AUTHORIZE"]}," ",{p:[15,2,473],t:7,e:"ui-button",a:{icon:"minus",action:"repeal",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[16,10,523]}]},f:["Repeal"]}," ",{p:[19,2,589],t:7,e:"ui-button",a:{icon:"close",action:"abort",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[20,10,638]}]},f:["Repeal All"]}]}," ",{p:[24,1,722],t:7,e:"ui-display",a:{title:"Authorizations"},f:[{t:4,f:[{p:[26,3,793],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{t:2,r:"name",p:[26,34,824]}," (",{t:2,r:"job",p:[26,44,834]},")"]}],n:52,r:"data.authorizations",p:[25,2,760]},{t:4,n:51,f:[{p:[28,3,870],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:["No authorizations."]}],r:"data.authorizations"}]}]},e.exports=a.extend(r.exports)},{205:205}],254:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Message"},f:[{t:2,r:"data.hidden_message",p:[3,5,50]}]}," ",{p:[5,3,94],t:7,e:"ui-section",a:{label:"Created On"},f:[{t:2,r:"data.realdate",p:[6,5,131]}]}," ",{p:[8,3,169],t:7,e:"ui-section",a:{label:"Approval"},f:[{p:[9,5,204],t:7,e:"ui-button",a:{icon:"arrow-up",state:[{t:2,x:{r:["data.is_creator","data.has_liked"],s:'_0?"disabled":_1?"selected":null'},p:[11,14,252]}],action:"like"},f:[{t:2,r:"data.num_likes",p:[12,21,344]}]}," ",{p:[13,5,380],t:7,e:"ui-button",a:{icon:"circle",state:[{t:2,x:{r:["data.is_creator","data.has_liked","data.has_disliked"],s:'_0?"disabled":!_1&&!_2?"selected":null'},p:[15,14,426]}],action:"neutral"}}," ",{p:[17,5,562],t:7,e:"ui-button",a:{icon:"arrow-down",state:[{t:2,x:{r:["data.is_creator","data.has_disliked"],s:'_0?"disabled":_1?"selected":null'},p:[19,14,612]}],action:"dislike"},f:[{t:2,r:"data.num_dislikes",p:[20,24,710]}]}]}]}," ",{t:4,f:[{p:[24,3,805],t:7,e:"ui-display",a:{title:"Admin Panel"},f:[{p:[25,5,843],t:7,e:"ui-section",a:{label:"Creator Ckey"},f:[{t:2,r:"data.creator_key",p:[25,38,876]}]}," ",{p:[26,5,915],t:7,e:"ui-section",a:{label:"Creator Character Name"},f:[{t:2,r:"data.creator_name",p:[26,48,958]}]}," ",{p:[27,5,998],t:7,e:"ui-button",a:{icon:"remove",action:"delete",style:"danger"},f:["Delete"]}]}],n:50,r:"data.admin_mode",p:[23,1,778]}]},e.exports=a.extend(r.exports)},{205:205}],255:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The requested interface (",{t:2,r:"config.interface",p:[2,34,46]},") was not found. Does it exist?"]}]}]},e.exports=a.extend(r.exports)},{205:205}],256:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,20],t:7,e:"ui-notice",f:["Currently syncing with the database"]}],n:50,r:"data.sync",p:[1,1,0]},{t:4,n:51,f:[{p:{button:[{p:[8,4,163],t:7,e:"ui-button",a:{icon:"eject",action:"eject_all"},f:["Eject all"]}," ",{p:[9,4,232],t:7,e:"ui-button",a:{icon:["toggle-",{t:2,x:{r:["data.show_materials"],s:'_0?"off":"on"'},p:[9,28,256]}],action:"toggle_materials_visibility"},f:[{t:2,x:{r:["data.show_materials"],s:'_0?"Hide":"Show"'},p:[10,5,339]}]}]},t:7,e:"ui-display",a:{title:"Materials",button:0},f:[" ",{t:4,f:[{p:[14,4,449],t:7,e:"div",a:{"class":"display tabular"},f:[{p:[15,5,484],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[16,6,520],t:7,e:"section",a:{"class":"cell"}}," ",{p:[17,6,559],t:7,e:"section",a:{"class":"cell"},f:["Mineral"]}," ",{p:[20,6,620],t:7,e:"section",a:{"class":"cell"},f:["Amount"]}," ",{p:[23,6,680],t:7,e:"section",a:{"class":"cell"}}," ",{p:[24,6,719],t:7,e:"section",a:{"class":"cell"}}]}," ",{t:4,f:[{p:[27,6,808],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[28,7,845],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[29,8,876]}]}," ",{p:[31,7,910],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"amount",p:[32,8,941]}]}," ",{p:[34,7,977],t:7,e:"section",a:{"class":"cell"},f:[{p:[35,8,1008],t:7,e:"ui-button",a:{icon:"eject"},f:["Release amount"]}]}," ",{p:[37,7,1084],t:7,e:"section",a:{"class":"cell",style:"width: 40px;"},f:[{p:[38,8,1136],t:7,e:"ui-button",a:{icon:"eject"},f:["Release all"]}]}]}],n:52,r:"data.all_materials",p:[26,5,773]}]}],n:50,r:"data.show_materials",p:[13,3,417]}]}," ",{p:[45,2,1274],t:7,e:"ui-display",a:{title:"Categories"},f:[{t:4,f:[{p:[47,4,1334],t:7,e:"ui-button",f:[{t:2,r:".",p:[47,15,1345]}]}],r:"data.categories",p:[46,3,1309]}]}],r:"data.sync"}]},e.exports=a.extend(r.exports)},{205:205}],257:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[3,5,49],t:7,e:"ui-button",a:{action:"toggle_power",style:[{t:2,x:{r:["data.toggle"],s:'_0?"selected":null'},p:[5,18,111]}]},f:["Turn ",{t:2,x:{r:["data.toggle"],s:'_0?"off":"on"'},p:[6,16,166]}]}]}," ",{p:[9,3,235],t:7,e:"ui-display",a:{title:"Logging"},f:[{t:4,f:[{p:[11,3,292],t:7,e:"ui-section",a:{label:">"},f:[{t:2,r:".",p:[11,25,314]},{p:[11,30,319],t:7,e:"ui-section",f:[]}]}],n:52,r:"data.logs",p:[10,5,269]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],258:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{seclevelState:function(){switch(this.get("data.seclevel")){case"blue":return"average";case"red":return"bad";case"delta":return"bad bold";default:return"good"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[16,1,323],t:7,e:"ui-display",f:[{p:[17,5,341],t:7,e:"ui-section",a:{label:"Alert Level"},f:[{p:[18,9,383],t:7,e:"span",a:{"class":[{t:2,r:"seclevelState",p:[18,22,396]}]},f:[{t:2,x:{r:["text","data.seclevel"],s:"_0.titleCase(_1)"},p:[18,41,415]}]}]}," ",{p:[20,5,480],t:7,e:"ui-section",a:{label:"Controls"},f:[{p:[21,9,519],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.alarm"],s:'_0?"close":"bell-o"'},p:[21,26,536]}],action:[{t:2,x:{r:["data.alarm"],s:'_0?"reset":"alarm"'},p:[21,71,581]}]},f:[{t:2,x:{r:["data.alarm"],s:'_0?"Reset":"Activate"'},p:[22,13,631]}]}]}," ",{t:4,f:[{p:[25,7,733],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[26,9,771],t:7,e:"span",a:{"class":"bad bold"},f:["Safety measures offline. Device may exhibit abnormal behavior."]}]}],n:50,r:"data.emagged",p:[24,5,705]}]}]},e.exports=a.extend(r.exports)},{205:205}],259:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[2,1,31],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,2,60],t:7,e:"ui-button",a:{icon:"power-off",style:[{t:2,x:{r:["data.power"],s:'_0?"selected":"danger"'},p:[3,37,95]}],action:"power"},f:[{t:2,x:{r:["data.power"],s:'_0?"Enabled":"Disabled"'},p:[3,92,150]}]}]}," ",{p:[5,1,218],t:7,e:"ui-section",a:{label:"Tag"},f:[{p:[6,2,245],t:7,e:"ui-button",a:{icon:"pencil",action:"rename"},f:[{t:2,r:"data.tag",p:[6,43,286]}]}]}," ",{p:[8,1,327],t:7,e:"ui-section",a:{label:"Scanning mode"},f:[{p:[9,2,364],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.updating"],s:'_0?"unlock":"lock"'},p:[9,18,380]}],style:[{t:2,x:{r:["data.updating"],s:'_0?null:"danger"'},p:[9,63,425]}],action:"updating",tooltip:"Toggle between automatic scanning or scan only when a button is pressed.","tooltip-side":"right"},f:[{t:2,x:{r:["data.updating"],s:'_0?"AUTO":"MANUAL"'},p:[9,221,583]}]}]}," ",{p:[11,1,649],t:7,e:"ui-section",a:{label:"Detection range"},f:[{p:[12,2,688],t:7,e:"ui-button",a:{icon:"refresh",style:[{t:2,x:{r:["data.globalmode"],s:'_0?null:"selected"'},p:[12,35,721]}],action:"globalmode",tooltip:"Local sector or whole region scanning.","tooltip-side":"right"},f:[{t:2,x:{r:["data.globalmode"],s:'_0?"MAXIMUM":"LOCAL"'},p:[12,165,851]}]}]}]}," ",{t:4,f:[{p:[16,2,957],t:7,e:"ui-display",a:{title:"Current Location"},f:[{p:[17,3,998],t:7,e:"span",f:[{t:2,r:"data.current",p:[17,9,1004]}]}]}," ",{p:[20,2,1048],t:7,e:"ui-display",a:{title:"Detected Signals"},f:[{t:4,f:[{p:[22,3,1114],t:7,e:"ui-section",a:{label:[{t:2,r:"entrytag",p:[22,21,1132]}]},f:[{p:[23,3,1149],t:7,e:"span",f:[{t:2,r:"area",p:[23,9,1155]}," (",{t:2,r:"coord",p:[23,19,1165]},")"]}," ",{t:4,f:[{p:[25,4,1209],t:7,e:"span",f:["Dist: ",{t:2,r:"dist",p:[25,16,1221]},"m Dir: ",{t:2,r:"degrees",p:[25,31,1236]},"° (",{t:2,r:"direction",p:[25,45,1250]},")"]}],n:50,r:"direction",p:[24,3,1187]}]}],n:52,r:"data.signals",p:[21,2,1088]}]}],n:50,r:"data.power",p:[15,1,936]}]},e.exports=a.extend(r.exports)},{205:205}],260:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Labor Camp Teleporter"},f:[{p:[2,2,45],t:7,e:"ui-section",a:{label:"Teleporter Status"},f:[{p:[3,3,87],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.teleporter"],s:'_0?"good":"bad"'},p:[3,16,100]}]},f:[{t:2,x:{r:["data.teleporter"],s:'_0?"Connected":"Not connected"'},p:[3,54,138]}]}]}," ",{t:4,f:[{p:[6,4,244],t:7,e:"ui-section",a:{label:"Location"},f:[{p:[7,5,279],t:7,e:"span",f:[{t:2,r:"data.teleporter_location",p:[7,11,285]}]}]}," ",{p:[9,4,343],t:7,e:"ui-section",a:{label:"Locked status"},f:[{p:[10,5,383],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.teleporter_lock"],s:'_0?"lock":"unlock"'},p:[10,22,400]}],action:"teleporter_lock"},f:[{t:2,x:{r:["data.teleporter_lock"],s:'_0?"Locked":"Unlocked"'},p:[10,93,471]}]}," ",{p:[11,5,537],t:7,e:"ui-button",a:{action:"toggle_open"},f:[{t:2,x:{r:["data.teleporter_state_open"],s:'_0?"Open":"Closed"'},p:[11,37,569]}]}]}],n:50,r:"data.teleporter",p:[5,3,216]},{t:4,n:51,f:[{p:[14,4,666],t:7,e:"span",f:[{p:[14,10,672],t:7,e:"ui-button",a:{action:"scan_teleporter"},f:["Scan Teleporter"]}]}],r:"data.teleporter"}]}," ",{p:[17,1,770],t:7,e:"ui-display",a:{title:"Labor Camp Beacon"},f:[{p:[18,2,811],t:7,e:"ui-section",a:{label:"Beacon Status"},f:[{p:[19,3,849],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.beacon"],s:'_0?"good":"bad"'},p:[19,16,862]}]},f:[{t:2,x:{r:["data.beacon"],s:'_0?"Connected":"Not connected"'},p:[19,50,896]}]}]}," ",{t:4,f:[{p:[22,3,992],t:7,e:"ui-section",a:{label:"Location"},f:[{p:[23,4,1026],t:7,e:"span",f:[{t:2,r:"data.beacon_location",p:[23,10,1032]}]}]}],n:50,r:"data.beacon",p:[21,2,969]},{t:4,n:51,f:[{p:[26,4,1097],t:7,e:"span",f:[{p:[26,10,1103],t:7,e:"ui-button",a:{action:"scan_beacon"},f:["Scan Beacon"]}]}],r:"data.beacon"}]}," ",{p:[29,1,1193],t:7,e:"ui-display",a:{title:"Prisoner details"},f:[{p:[30,2,1233],t:7,e:"ui-section",a:{label:"Prisoner ID"},f:[{p:[31,3,1269],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[31,33,1299]}]}]}," ",{t:4,f:[{p:[34,2,1392],t:7,e:"ui-section",a:{label:"Set ID goal"},f:[{p:[35,4,1429],t:7,e:"ui-button",a:{action:"set_goal"},f:[{t:2,r:"data.goal",p:[35,33,1458]}]}]}],n:50,r:"data.id",p:[33,2,1374]}," ",{p:[38,2,1512],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[39,3,1545],t:7,e:"span",f:[{t:2,x:{r:["data.prisoner.name"],s:'_0?_0:"No Occupant"'},p:[39,9,1551]}]}]}," ",{t:4,f:[{p:[42,3,1661],t:7,e:"ui-section",a:{label:"Criminal Status"},f:[{p:[43,4,1702],t:7,e:"span",f:[{t:2,r:"data.prisoner.crimstat",p:[43,10,1708]}]}]}],n:50,r:"data.prisoner",p:[41,2,1636]}]}," ",{p:[47,1,1785],t:7,e:"ui-display",f:[{p:[48,2,1800],t:7,e:"center",f:[{p:[48,10,1808],t:7,e:"ui-button",a:{action:"teleport",state:[{t:2,x:{r:["data.can_teleport"],s:'_0?null:"disabled"'},p:[48,45,1843]}]},f:["Process Prisoner"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],261:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"center",f:[{p:[2,10,23],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[2,40,53]}]}]}]}," ",{p:[4,1,135],t:7,e:"ui-display",a:{title:"Stored Items"},f:[{t:4,f:[{p:[6,3,194],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[6,22,213]}]},f:[{p:[7,4,228],t:7,e:"ui-button",a:{action:"release_items",params:['{"mobref":',{t:2,r:"mob",p:[7,56,280]},"}"],state:[{t:2,x:{r:["data.can_reclaim"],s:'_0?null:"disabled"'},p:[7,72,296]}]},f:["Drop Items"]}]}],n:52,r:"data.mobs",p:[5,2,171]}]}]},e.exports=a.extend(r.exports)},{205:205}],262:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{p:[3,3,70],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.emagged"],s:'_0?"un":null'},p:[3,20,87]},"lock"],state:[{t:2,x:{r:["data.can_toggle_safety"],s:'_0?null:"disabled"'},p:[3,63,130]}],action:"safety"},f:["Safeties: ",{p:[4,14,209],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.emagged"],s:'_0?"bad":"good"'},p:[4,27,222]}]},f:[{t:2,x:{r:["data.emagged"],s:'_0?"OFF":"ON"'},p:[4,62,257]}]}]}]},t:7,e:"ui-display",a:{title:"Default Programs",button:0},f:[" ",{t:4,f:[{p:[8,2,363],t:7,e:"ui-button",a:{action:"load_program",params:['{"type": ',{t:2,r:"type",p:[8,52,413]},"}"],style:[{t:2,x:{r:["data.program","type"],s:'_0==_1?"selected":null'},p:[8,70,431]}]},f:[{t:2,r:"name",p:[9,5,483]}," "]},{p:[10,14,506],t:7,e:"br"}],n:52,r:"data.default_programs",p:[7,2,329]}]}," ",{t:4,f:[{p:[14,2,562],t:7,e:"ui-display",a:{title:"Dangerous Programs"},f:[{t:4,f:[{p:[16,4,638],t:7,e:"ui-button",a:{icon:"warning",action:"load_program",params:['{"type": ',{t:2,r:"type",p:[16,69,703]},"}"],style:[{t:2,x:{r:["data.program","type"],s:'_0==_1?"selected":null'},p:[16,87,721]}]},f:[{t:2,r:"name",p:[17,5,773]}," "]},{p:[18,16,798],t:7,e:"br"}],n:52,r:"data.emag_programs",p:[15,3,605]}]}],n:50,r:"data.emagged",p:[13,1,539]}]},e.exports=a.extend(r.exports)},{205:205}],263:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{occupantStatState:function(){switch(this.get("data.occupant.stat")){case 0:return"good";case 1:return"average";default:return"bad"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[15,1,280],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[16,3,313],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[17,3,346],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[17,9,352]}]}]}," ",{t:4,f:[{p:[20,5,466],t:7,e:"ui-section",a:{label:"State"},f:[{p:[21,7,500],t:7,e:"span",a:{"class":[{t:2,r:"occupantStatState",p:[21,20,513]}]},f:[{t:2,x:{r:["data.occupant.stat"],s:'_0==0?"Conscious":_0==1?"Unconcious":"Dead"'},p:[21,43,536]}]}]}],n:50,r:"data.occupied",p:[19,3,439]}]}," ",{p:[25,1,680],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[26,2,712],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[27,5,743],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"unlock":"lock"'},p:[27,22,760]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Open":"Closed"'},p:[27,71,809]}]}]}," ",{p:[29,3,874],t:7,e:"ui-section",a:{label:"Uses"},f:[{t:2,r:"data.ready_implants",p:[30,5,905]}," ",{t:4,f:[{p:[32,7,969],t:7,e:"span",a:{"class":"fa fa-cog fa-spin"}}],n:50,r:"data.replenishing",p:[31,5,936]}]}," ",{p:[35,3,1036],t:7,e:"ui-section",a:{label:"Activate"},f:[{p:[36,7,1073],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.occupied","data.ready_implants","data.ready"],s:'_0&&_1>0&&_2?null:"disabled"'},p:[36,25,1091]}],action:"implant"},f:[{t:2,x:{r:["data.ready","data.special_name"],s:'_0?(_1?_1:"Implant"):"Recharging"'},p:[37,9,1198]}," "]},{p:[38,19,1302],t:7,e:"br"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],264:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{healthState:function(){var t=this.get("data.health");return t>70?"good":t>50?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[15,3,296],t:7,e:"ui-notice",f:[{p:[16,5,313],t:7,e:"span",f:["Wipe in progress!"]}]}],n:50,r:"data.wiping",p:[14,1,273]},{p:{button:[{t:4,f:[{p:[22,7,479],t:7,e:"ui-button",a:{icon:"trash",state:[{t:2,x:{r:["data.isDead"],s:'_0?"disabled":null'},p:[22,38,510]}],action:"wipe"},f:[{t:2,x:{r:["data.wiping"],s:'_0?"Stop Wiping":"Wipe"'},p:[22,89,561]}," AI"]}],n:50,r:"data.name",p:[21,5,454]}]},t:7,e:"ui-display",a:{title:[{t:2,x:{r:["data.name"],s:'_0||"Empty Card"'},p:[19,19,388]}],button:0},f:[" ",{t:4,f:[{p:[26,5,672],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[27,9,709],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.isDead","data.isBraindead"],s:'_0||_1?"bad":"good"'},p:[27,22,722]}]},f:[{t:2,x:{r:["data.isDead","data.isBraindead"],s:'_0||_1?"Offline":"Operational"'},p:[27,76,776]}]}]}," ",{p:[29,5,871],t:7,e:"ui-section",a:{label:"Software Integrity"},f:[{p:[30,7,918],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.health",p:[30,40,951]}],state:[{t:2,r:"healthState",p:[30,64,975]}]},f:[{t:2,x:{r:["adata.health"],s:"Math.round(_0)"},p:[30,81,992]},"%"]}]}," ",{p:[32,5,1055],t:7,e:"ui-section",a:{label:"Laws"},f:[{t:4,f:[{p:[34,9,1117],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:".",p:[34,33,1141]}]},{p:[34,45,1153],t:7,e:"br"}],n:52,r:"data.laws",p:[33,7,1088]}]}," ",{p:[37,5,1200],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[38,7,1237],t:7,e:"ui-button",a:{icon:"signal",style:[{t:2,x:{r:["data.wireless"],s:'_0?"selected":null'},p:[38,39,1269]}],action:"wireless"},f:["Wireless Activity"]}," ",{p:[39,7,1363],t:7,e:"ui-button",a:{icon:"microphone",style:[{t:2,x:{r:["data.radio"],s:'_0?"selected":null'},p:[39,43,1399]}],action:"radio"},f:["Subspace Radio"]}]}],n:50,r:"data.name",p:[25,3,649]}]}]},e.exports=a.extend(r.exports)},{205:205}],265:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,23],t:7,e:"ui-notice",f:[{p:[3,3,38],t:7,e:"span",f:["Waiting for another device to confirm your request..."]}]}],n:50,r:"data.waiting",p:[1,1,0]},{t:4,n:51,f:[{p:[6,2,132],t:7,e:"ui-display",f:[{p:[7,3,148],t:7,e:"ui-section",f:[{t:4,f:[{p:[9,5,197],t:7,e:"ui-button",a:{icon:"check",action:"auth_swipe"},f:["Authorize ",{t:2,r:"data.auth_required",p:[9,59,251]}]}],n:50,r:"data.auth_required",p:[8,4,165]},{t:4,n:51,f:[{p:[11,5,304],t:7,e:"ui-button",a:{icon:"warning",state:[{t:2,x:{r:["data.red_alert"],s:'_0?"disabled":null'},p:[11,38,337]}],action:"red_alert"},f:["Red Alert"]}," ",{p:[12,5,423],t:7,e:"ui-button",a:{icon:"wrench",state:[{t:2,x:{r:["data.emergency_maint"],s:'_0?"disabled":null'},p:[12,37,455]}],action:"emergency_maint"},f:["Emergency Maintenance Access"]}," ",{p:[13,5,572],t:7,e:"ui-button",a:{icon:"warning",state:"null",action:"bsa_unlock"},f:["Bluespace Artillery Unlock"]}],r:"data.auth_required"}]}]}],r:"data.waiting"}]},e.exports=a.extend(r.exports)},{205:205}],266:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Ore values"},f:[{t:4,f:[{p:[3,3,57],t:7,e:"ui-section",a:{label:[{t:2,r:"ore",p:[3,22,76]}]},f:[{p:[4,4,90],t:7,e:"span",f:[{t:2,r:"value",p:[4,10,96]}]}]}],n:52,r:"data.ores",p:[2,2,34]}]}," ",{p:[8,1,158],t:7,e:"ui-display",a:{title:"Points"},f:[{p:[9,2,188],t:7,e:"ui-section",a:{label:"ID"},f:[{p:[10,3,215],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[10,33,245]}]}]}," ",{t:4,f:[{p:[13,3,339],t:7,e:"ui-section",a:{label:"Points collected"},f:[{p:[14,4,381],t:7,e:"span",f:[{t:2,r:"data.points",p:[14,10,387]}]}]}," ",{p:[16,3,430],t:7,e:"ui-section",a:{label:"Goal"},f:[{p:[17,4,460],t:7,e:"span",f:[{t:2,r:"data.goal",p:[17,10,466]}]}]}," ",{p:[19,3,507],t:7,e:"ui-section",a:{label:"Unclaimed points"},f:[{p:[20,4,549],t:7,e:"span",f:[{t:2,r:"data.unclaimed_points",p:[20,10,555]}]}," ",{p:[21,4,592],t:7,e:"ui-button",a:{action:"claim_points",state:[{t:2,x:{r:["data.unclaimed_points"],s:'_0?null:"disabled"'},p:[21,43,631]}]},f:["Claim points"]}]}],n:50,r:"data.id",p:[12,2,320]}]}," ",{p:[25,1,745],t:7,e:"ui-display",f:[{p:[26,2,760],t:7,e:"center",f:[{p:[27,3,772],t:7,e:"ui-button",a:{action:"move_shuttle",state:[{t:2,x:{r:["data.can_go_home"],s:'_0?null:"disabled"'},p:[27,42,811]}]},f:["Move shuttle"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],267:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Known Languages"},f:[{t:4,f:[{p:[3,5,70],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[3,23,88]}]},f:[{p:[4,7,105],t:7,e:"span",f:[{t:2,r:"desc",p:[4,13,111]}]}," ",{p:[5,7,134],t:7,e:"span",f:["Key: ,",{t:2,r:"key",p:[5,19,146]}]}," ",{t:4,f:[{p:[7,9,192],t:7,e:"span",f:["(gained from mob)"]}],n:50,r:"shadow",p:[6,7,168]}," ",{p:[9,7,245],t:7,e:"span",f:[{t:2,x:{r:["can_speak"],s:'_0?"Can Speak":"Cannot Speak"'},p:[9,13,251]}]}," ",{t:4,f:[{p:[11,9,342],t:7,e:"ui-button",a:{action:"select_default",params:['{"language_name":"',{t:2,r:"name",p:[13,37,425]},'"}'],style:[{t:2,x:{r:["is_default","can_speak"],s:'_0?"selected":_1?null:"disabled"'},p:[14,18,455]}]},f:[{t:2,x:{r:["is_default"],s:'_0?"Default Language":"Select as Default"'},p:[15,10,526]}]}],n:50,r:"data.is_living",p:[10,7,310]}," ",{t:4,f:[{t:4,f:[{p:[20,11,685],t:7,e:"ui-button",a:{action:"grant_language",params:['{"language_name":"',{t:2,r:"name",p:[20,72,746]},'"}']},f:["Grant"]}],n:50,r:"shadow",p:[19,9,659]},{t:4,n:51,f:[{p:[22,11,805],t:7,e:"ui-button",a:{action:"remove_language",params:['{"language_name":"',{t:2,r:"name",p:[22,73,867]},'"}']},f:["Remove"]}],r:"shadow"}],n:50,r:"data.admin_mode",p:[18,7,626]}]}],n:52,r:"data.languages",p:[2,3,40]}]}," ",{t:4,f:[{t:4,f:[{p:[30,5,1033],t:7,e:"ui-button",a:{action:"toggle_omnitongue",style:[{t:2,x:{r:["data.omnitongue"],s:'_0?"selected":null'},p:[32,14,1092]}]},f:["Omnitongue ",{t:2,x:{r:["data.omnitongue"],s:'_0?"Enabled":"Disabled"'},p:[33,19,1152]}]}],n:50,r:"data.is_living",p:[29,3,1005]}," ",{p:[36,3,1231],t:7,e:"ui-display",a:{title:"Unknown Languages"},f:[{t:4,f:[{p:[38,7,1315],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[38,25,1333]}]},f:[{p:[39,9,1352],t:7,e:"span",f:[{t:2,r:"desc",p:[39,15,1358]}]}," ",{p:[40,9,1383],t:7,e:"span",f:["Key: ,",{t:2,r:"key",p:[40,21,1395]}]}," ",{p:[41,9,1419],t:7,e:"ui-button",a:{action:"grant_language",params:['{"language_name":"',{t:2,r:"name",p:[43,37,1502]},'"}']},f:["Grant"]}]}],n:52,r:"data.unknown_languages",p:[37,5,1275]}]}],n:50,r:"data.admin_mode",p:[28,1,978]}]},e.exports=a.extend(r.exports)},{205:205}],268:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Controls"},f:[{t:4,f:[{t:4,f:[{p:[4,4,84],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[5,5,118],t:7,e:"span",f:["Launchpad closed."]}]}],n:50,r:"data.pad_closed",p:[3,3,56]},{t:4,n:51,f:[{p:[8,4,183],t:7,e:"ui-section",a:{label:"Launchpad"},f:[{p:[9,4,218],t:7,e:"span",f:[{p:[9,10,224],t:7,e:"b",f:[{t:2,r:"data.pad_name",p:[9,13,227]}]}]},{p:[9,41,255],t:7,e:"br"}," ",{p:[10,4,264],t:7,e:"ui-button",a:{icon:"pencil",action:"rename"},f:["Rename"]}," ",{p:[11,4,328],t:7,e:"ui-button",a:{icon:"remove",style:"danger",action:"remove"},f:["Remove"]}]}," ",{p:[14,4,427],t:7,e:"ui-section",a:{label:"Set Target"},f:[{p:[15,4,463],t:7,e:"table",f:[{p:[16,4,475],t:7,e:"tr",f:[{p:[17,5,485],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[17,38,518],t:7,e:"ui-button",a:{action:"up-left"},f:["↖"]}]}," ",{p:[18,5,570],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[18,57,622],t:7,e:"ui-button",a:{action:"up"},f:["↑"]}]}," ",{p:[19,5,669],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[19,56,720],t:7,e:"ui-button",a:{action:"up-right"},f:["↗"]}]}]}," ",{p:[21,4,782],t:7,e:"tr",f:[{p:[22,5,792],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[22,38,825],t:7,e:"ui-button",a:{action:"left",style:"width:35px!important"},f:["←"]}]}," ",{p:[23,5,903],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[23,57,955],t:7,e:"ui-button",a:{action:"reset"},f:["R"]}]}," ",{p:[24,5,1005],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[24,56,1056],t:7,e:"ui-button",a:{action:"right"},f:["→"]}]}]}," ",{p:[26,4,1115],t:7,e:"tr",f:[{p:[27,5,1125],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[27,38,1158],t:7,e:"ui-button",a:{action:"down-left"},f:["↙"]}]}," ",{p:[28,5,1212],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[28,57,1264],t:7,e:"ui-button",a:{action:"down"},f:["↓"]}]}," ",{p:[29,5,1313],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[29,56,1364],t:7,e:"ui-button",a:{action:"down-right"},f:["↘"]}]}]}]}]}," ",{p:[33,4,1459],t:7,e:"ui-section",a:{label:"Current Target"},f:[{p:[34,5,1500],t:7,e:"span",f:[{t:2,r:"data.abs_y",p:[34,11,1506]}," ",{t:2,r:"data.north_south",p:[34,26,1521]}]},{p:[34,53,1548],t:7,e:"br"}," ",{p:[35,5,1558],t:7,e:"span",f:[{t:2,r:"data.abs_x",p:[35,11,1564]}," ",{t:2,r:"data.east_west",p:[35,26,1579]}]}]}," ",{p:[37,4,1627],t:7,e:"ui-section",a:{label:"Activate"},f:[{p:[38,5,1662],t:7,e:"ui-button",a:{action:"launch",tooltip:"Teleport everything on the pad to the target.","tooltip-side":"down"},f:["Launch"]}," ",{p:[39,5,1789],t:7,e:"ui-button",a:{action:"pull",tooltip:"Teleport everything from the target to the pad.","tooltip-side":"down"},f:["Pull"]}]}],r:"data.pad_closed"}],n:50,r:"data.has_pad",p:[2,2,32]},{t:4,n:51,f:[{p:[45,3,1956],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[46,4,1989],t:7,e:"span",f:["No launchpad found. Link the remote to a launchpad."]}]}],r:"data.has_pad"}]}]},e.exports=a.extend(r.exports)},{205:205}],269:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{mechChargeState:function(t){var e=this.get("data.recharge_port.mech.cell.maxcharge");return t>=e/1.5?"good":t>=e/3?"average":"bad"},mechHealthState:function(t){var e=this.get("data.recharge_port.mech.maxhealth");return t>e/1.5?"good":t>e/3?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[20,1,545],t:7,e:"ui-display",a:{title:"Mech Status"},f:[{t:4,f:[{t:4,f:[{p:[23,4,646],t:7,e:"ui-section",
-a:{label:"Integrity"},f:[{p:[24,6,683],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.recharge_port.mech.maxhealth",p:[24,27,704]}],value:[{t:2,r:"adata.recharge_port.mech.health",p:[24,74,751]}],state:[{t:2,x:{r:["mechHealthState","adata.recharge_port.mech.health"],s:"_0(_1)"},p:[24,117,794]}]},f:[{t:2,x:{r:["adata.recharge_port.mech.health"],s:"Math.round(_0)"},p:[24,171,848]},"/",{t:2,r:"adata.recharge_port.mech.maxhealth",p:[24,219,896]}]}]}," ",{t:4,f:[{t:4,f:[{p:[28,5,1061],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[28,31,1087],t:7,e:"span",a:{"class":"bad"},f:["Cell Critical Failure"]}]}],n:50,r:"data.recharge_port.mech.cell.critfail",p:[27,3,1010]},{t:4,n:51,f:[{p:[30,11,1170],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[31,13,1210],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.recharge_port.mech.cell.maxcharge",p:[31,34,1231]}],value:[{t:2,r:"adata.recharge_port.mech.cell.charge",p:[31,86,1283]}],state:[{t:2,x:{r:["mechChargeState","adata.recharge_port.mech.cell.charge"],s:"_0(_1)"},p:[31,134,1331]}]},f:[{t:2,x:{r:["adata.recharge_port.mech.cell.charge"],s:"Math.round(_0)"},p:[31,193,1390]},"/",{t:2,x:{r:["adata.recharge_port.mech.cell.maxcharge"],s:"Math.round(_0)"},p:[31,246,1443]}]}]}],r:"data.recharge_port.mech.cell.critfail"}],n:50,r:"data.recharge_port.mech.cell",p:[26,4,970]},{t:4,n:51,f:[{p:[35,3,1558],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[35,29,1584],t:7,e:"span",a:{"class":"bad"},f:["Cell Missing"]}]}],r:"data.recharge_port.mech.cell"}],n:50,r:"data.recharge_port.mech",p:[22,2,610]},{t:4,n:51,f:[{p:[38,4,1662],t:7,e:"ui-section",f:["Mech Not Found"]}],r:"data.recharge_port.mech"}],n:50,r:"data.recharge_port",p:[21,3,581]},{t:4,n:51,f:[{p:[41,5,1729],t:7,e:"ui-section",f:["Recharging Port Not Found"]}," ",{p:[42,2,1782],t:7,e:"ui-button",a:{icon:"refresh",action:"reconnect"},f:["Reconnect"]}],r:"data.recharge_port"}]}]},e.exports=a.extend(r.exports)},{205:205}],270:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{t:4,f:[{p:[3,5,45],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[4,7,88],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[4,24,105]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[4,75,156]}]}]}],n:50,r:"data.siliconUser",p:[2,3,15]},{t:4,n:51,f:[{p:[7,5,247],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[7,31,273]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[10,1,358],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[11,3,389],t:7,e:"ui-section",a:{label:"Power"},f:[{t:4,f:[{p:[13,7,470],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[13,24,487]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[13,68,531]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[13,116,579]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[12,5,421]},{t:4,n:51,f:[{p:[15,7,639],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.on"],s:'_0?"good":"bad"'},p:[15,20,652]}],state:[{t:2,x:{r:["data.cell"],s:'_0?null:"disabled"'},p:[15,57,689]}]},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[15,92,724]}]}],x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"}}]}," ",{p:[18,3,791],t:7,e:"ui-section",a:{label:"Cell"},f:[{p:[19,5,822],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.cell"],s:'_0?null:"bad"'},p:[19,18,835]}]},f:[{t:2,x:{r:["data.cell","data.cellPercent"],s:'_0?_1+"%":"No Cell"'},p:[19,48,865]}]}]}," ",{p:[21,3,943],t:7,e:"ui-section",a:{label:"Mode"},f:[{p:[22,5,974],t:7,e:"span",a:{"class":[{t:2,r:"data.modeStatus",p:[22,18,987]}]},f:[{t:2,r:"data.mode",p:[22,39,1008]}]}]}," ",{p:[24,3,1049],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[25,5,1080],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.load"],s:'_0?"good":"average"'},p:[25,18,1093]}]},f:[{t:2,x:{r:["data.load"],s:'_0?_0:"None"'},p:[25,54,1129]}]}]}," ",{p:[27,3,1191],t:7,e:"ui-section",a:{label:"Destination"},f:[{p:[28,5,1229],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.destination"],s:'_0?"good":"average"'},p:[28,18,1242]}]},f:[{t:2,x:{r:["data.destination"],s:'_0?_0:"None"'},p:[28,60,1284]}]}]}]}," ",{t:4,f:[{p:{button:[{t:4,f:[{p:[35,9,1513],t:7,e:"ui-button",a:{icon:"eject",action:"unload"},f:["Unload"]}],n:50,r:"data.load",p:[34,7,1486]}," ",{t:4,f:[{p:[38,9,1623],t:7,e:"ui-button",a:{icon:"eject",action:"ejectpai"},f:["Eject PAI"]}],n:50,r:"data.haspai",p:[37,7,1594]}," ",{p:[40,7,1709],t:7,e:"ui-button",a:{icon:"pencil",action:"setid"},f:["Set ID"]}]},t:7,e:"ui-display",a:{title:"Controls",button:0},f:[" ",{p:[42,5,1791],t:7,e:"ui-section",a:{label:"Destination"},f:[{p:[43,7,1831],t:7,e:"ui-button",a:{icon:"pencil",action:"destination"},f:["Set Destination"]}," ",{p:[44,7,1912],t:7,e:"ui-button",a:{icon:"stop",action:"stop"},f:["Stop"]}," ",{p:[45,7,1973],t:7,e:"ui-button",a:{icon:"play",action:"go"},f:["Go"]}]}," ",{p:[47,5,2047],t:7,e:"ui-section",a:{label:"Home"},f:[{p:[48,7,2080],t:7,e:"ui-button",a:{icon:"home",action:"home"},f:["Go Home"]}," ",{p:[49,7,2144],t:7,e:"ui-button",a:{icon:"pencil",action:"sethome"},f:["Set Home"]}]}," ",{p:[51,5,2231],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[52,7,2268],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoReturn"],s:'_0?"check-square-o":"square-o"'},p:[52,24,2285]}],style:[{t:2,x:{r:["data.autoReturn"],s:'_0?"selected":null'},p:[52,84,2345]}],action:"autoret"},f:["Auto-Return Home"]}," ",{p:[54,7,2449],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoPickup"],s:'_0?"check-square-o":"square-o"'},p:[54,24,2466]}],style:[{t:2,x:{r:["data.autoPickup"],s:'_0?"selected":null'},p:[54,84,2526]}],action:"autopick"},f:["Auto-Pickup Crate"]}," ",{p:[56,7,2632],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.reportDelivery"],s:'_0?"check-square-o":"square-o"'},p:[56,24,2649]}],style:[{t:2,x:{r:["data.reportDelivery"],s:'_0?"selected":null'},p:[56,88,2713]}],action:"report"},f:["Report Deliveries"]}]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[31,1,1373]}]},e.exports=a.extend(r.exports)},{205:205}],271:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Relay"},f:[{t:4,f:[{p:[3,3,57],t:7,e:"h2",f:["NETWORK BUFFERS OVERLOADED"]}," ",{p:[4,3,96],t:7,e:"h3",f:["Overload Recovery Mode"]}," ",{p:[5,3,131],t:7,e:"i",f:["This system is suffering temporary outage due to overflow of traffic buffers. Until buffered traffic is processed, all further requests will be dropped. Frequent occurences of this error may indicate insufficient hardware capacity of your network. Please contact your network planning department for instructions on how to resolve this issue."]}," ",{p:[6,3,484],t:7,e:"h3",f:["ADMINISTRATIVE OVERRIDE"]}," ",{p:[7,3,520],t:7,e:"b",f:["CAUTION - Data loss may occur"]}," ",{p:[8,3,562],t:7,e:"ui-button",a:{icon:"signal",action:"restart"},f:["Purge buffered traffic"]}],n:50,r:"data.dos_crashed",p:[2,2,29]},{t:4,n:51,f:[{p:[12,3,663],t:7,e:"ui-section",a:{label:"Relay status"},f:[{p:[13,4,701],t:7,e:"ui-button",a:{icon:"power-off",action:"toggle"},f:[{t:2,x:{r:["data.enabled"],s:'_0?"ENABLED":"DISABLED"'},p:[14,6,752]}]}]}," ",{p:[18,3,836],t:7,e:"ui-section",a:{label:"Network buffer status"},f:[{t:2,r:"data.dos_overload",p:[19,4,883]}," / ",{t:2,r:"data.dos_capacity",p:[19,28,907]}," GQ"]}],r:"data.dos_crashed"}]}]},e.exports=a.extend(r.exports)},{205:205}],272:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{healthState:function(){var t=this.get("data.health");return t>70?"good":t>50?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[15,1,320],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[18,3,363],t:7,e:"ui-notice",f:[{p:[19,5,380],t:7,e:"span",f:["Reconstruction in progress!"]}]}],n:50,r:"data.restoring",p:[17,1,337]},{p:[24,1,451],t:7,e:"ui-display",f:[{p:[26,1,467],t:7,e:"div",a:{"class":"item"},f:[{p:[27,3,489],t:7,e:"div",a:{"class":"itemLabel"},f:["Inserted AI:"]}," ",{p:[30,3,541],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[31,2,569],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",state:[{t:2,x:{r:["data.nocard"],s:'_0?"disabled":null'},p:[31,52,619]}]},f:[{t:2,x:{r:["data.name"],s:'_0?_0:"---"'},p:[31,89,656]}]}]}]}," ",{t:4,f:[{p:[36,2,744],t:7,e:"b",f:["ERROR: ",{t:2,r:"data.error",p:[36,12,754]}]}],n:50,r:"data.error",p:[35,1,723]},{t:4,n:51,f:[{p:[38,2,785],t:7,e:"h2",f:["System Status"]}," ",{p:[39,2,810],t:7,e:"div",a:{"class":"item"},f:[{p:[40,3,832],t:7,e:"div",a:{"class":"itemLabel"},f:["Current AI:"]}," ",{p:[43,3,885],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.name",p:[44,4,915]}]}," ",{p:[46,3,942],t:7,e:"div",a:{"class":"itemLabel"},f:["Status:"]}," ",{p:[49,3,991],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["Nonfunctional"],n:50,r:"data.isDead",p:[50,4,1021]},{t:4,n:51,f:["Functional"],r:"data.isDead"}]}," ",{p:[56,3,1114],t:7,e:"div",a:{"class":"itemLabel"},f:["System Integrity:"]}," ",{p:[59,3,1173],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[60,4,1203],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.health",p:[60,37,1236]}],state:[{t:2,r:"healthState",p:[61,11,1264]}]},f:[{t:2,x:{r:["adata.health"],s:"Math.round(_0)"},p:[61,28,1281]},"%"]}]}," ",{p:[63,3,1336],t:7,e:"div",a:{"class":"itemLabel"},f:["Active Laws:"]}," ",{p:[66,3,1390],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[67,4,1420],t:7,e:"table",f:[{t:4,f:[{p:[69,6,1462],t:7,e:"tr",f:[{p:[69,10,1466],t:7,e:"td",f:[{p:[69,14,1470],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:".",p:[69,38,1494]}]}]}]}],n:52,r:"data.ai_laws",p:[68,5,1433]}]}]}," ",{p:[73,2,1547],t:7,e:"ui-section",a:{label:"Operations"},f:[{p:[74,3,1582],t:7,e:"ui-button",a:{icon:"plus",style:[{t:2,x:{r:["data.restoring"],s:'_0?"disabled":null'},p:[74,33,1612]}],action:"PRG_beginReconstruction"},f:["Begin Reconstruction"]}]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],273:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[5,1,91],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"home",params:'{"target" : "mod"}',state:[{t:2,x:{r:["data.mmode"],s:'_0==1?"disabled":null'},p:[5,80,170]}]},f:["Access Modification"]}],n:50,r:"data.have_id_slot",p:[4,1,64]},{p:[7,1,253],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"folder-open",params:'{"target" : "manage"}',state:[{t:2,x:{r:["data.mmode"],s:'_0==2?"disabled":null'},p:[7,90,342]}]},f:["Job Management"]}," ",{p:[8,1,411],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"folder-open",params:'{"target" : "manifest"}',state:[{t:2,x:{r:["data.mmode"],s:'!_0?"disabled":null'},p:[8,92,502]}]},f:["Crew Manifest"]}," ",{t:4,f:[{p:[10,1,593],t:7,e:"ui-button",a:{action:"PRG_print",icon:"print",state:[{t:2,x:{r:["data.has_id","data.mmode"],s:'!_1||_0&&_1==1?null:"disabled"'},p:[10,51,643]}]},f:["Print"]}],n:50,r:"data.have_printer",p:[9,1,566]},{t:4,f:[{p:[14,1,766],t:7,e:"div",a:{"class":"item"},f:[{p:[15,3,788],t:7,e:"h2",f:["Crew Manifest"]}," ",{p:[16,3,814],t:7,e:"br"},"Please use security record computer to modify entries.",{p:[16,61,872],t:7,e:"br"},{p:[16,65,876],t:7,e:"br"}]}," ",{t:4,f:[{p:[19,2,916],t:7,e:"div",a:{"class":"item"},f:[{t:2,r:"name",p:[20,2,937]}," - ",{t:2,r:"rank",p:[20,13,948]}]}],n:52,r:"data.manifest",p:[18,1,890]}],n:50,x:{r:["data.mmode"],s:"!_0"},p:[13,1,745]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.mmode"],s:"_0==2"},f:[{p:[25,1,1008],t:7,e:"div",a:{"class":"item"},f:[{p:[26,3,1030],t:7,e:"h2",f:["Job Management"]}]}," ",{p:[28,1,1063],t:7,e:"table",f:[{p:[29,1,1072],t:7,e:"tr",f:[{p:[29,5,1076],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,27,1098],t:7,e:"b",f:["Job"]}]},{p:[29,42,1113],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,64,1135],t:7,e:"b",f:["Slots"]}]},{p:[29,81,1152],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,103,1174],t:7,e:"b",f:["Open job"]}]},{p:[29,123,1194],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,145,1216],t:7,e:"b",f:["Close job"]}]}]}," ",{t:4,f:[{p:[32,2,1269],t:7,e:"tr",f:[{p:[32,6,1273],t:7,e:"td",f:[{t:2,r:"title",p:[32,10,1277]}]},{p:[32,24,1291],t:7,e:"td",f:[{t:2,r:"current",p:[32,28,1295]},"/",{t:2,r:"total",p:[32,40,1307]}]},{p:[32,54,1321],t:7,e:"td",f:[{p:[32,58,1325],t:7,e:"ui-button",a:{action:"PRG_open_job",params:['{"target" : "',{t:2,r:"title",p:[32,112,1379]},'"}'],state:[{t:2,x:{r:["status_open"],s:'_0?null:"disabled"'},p:[32,132,1399]}]},f:[{t:2,r:"desc_open",p:[32,169,1436]}]},{p:[32,194,1461],t:7,e:"br"}]},{p:[32,203,1470],t:7,e:"td",f:[{p:[32,207,1474],t:7,e:"ui-button",a:{action:"PRG_close_job",params:['{"target" : "',{t:2,r:"title",p:[32,262,1529]},'"}'],state:[{t:2,x:{r:["status_close"],s:'_0?null:"disabled"'},p:[32,282,1549]}]},f:[{t:2,r:"desc_close",p:[32,320,1587]}]}]}]}],n:52,r:"data.slots",p:[30,1,1244]}]}]},{t:4,n:50,x:{r:["data.mmode"],s:"!(_0==2)"},f:[" ",{p:[40,1,1665],t:7,e:"div",a:{"class":"item"},f:[{p:[41,3,1687],t:7,e:"h2",f:["Access Modification"]}]}," ",{t:4,f:[{p:[45,3,1751],t:7,e:"span",a:{"class":"alert"},f:[{p:[45,23,1771],t:7,e:"i",f:["Please insert the ID into the terminal to proceed."]}]},{p:[45,87,1835],t:7,e:"br"}],n:50,x:{r:["data.has_id"],s:"!_0"},p:[44,1,1727]},{p:[48,1,1852],t:7,e:"div",a:{"class":"item"},f:[{p:[49,3,1874],t:7,e:"div",a:{"class":"itemLabel"},f:["Target Identity:"]}," ",{p:[52,3,1930],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[53,2,1958],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",params:'{"target" : "id"}'},f:[{t:2,r:"data.id_name",p:[53,72,2028]}]}]}]}," ",{p:[56,1,2076],t:7,e:"div",a:{"class":"item"},f:[{p:[57,3,2098],t:7,e:"div",a:{"class":"itemLabel"},f:["Auth Identity:"]}," ",{p:[60,3,2152],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[61,2,2180],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",params:'{"target" : "auth"}'},f:[{t:2,r:"data.auth_name",p:[61,74,2252]}]}]}]}," ",{p:[64,1,2302],t:7,e:"hr"}," ",{t:4,f:[{t:4,f:[{p:[68,2,2362],t:7,e:"div",a:{"class":"item"},f:[{p:[69,4,2385],t:7,e:"h2",f:["Details"]}]}," ",{t:4,f:[{p:[73,2,2436],t:7,e:"div",a:{"class":"item"},f:[{p:[74,4,2459],t:7,e:"div",a:{"class":"itemLabel"},f:["Registered Name:"]}," ",{p:[77,4,2518],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.id_owner",p:[78,3,2547]}]}]}," ",{p:[81,2,2587],t:7,e:"div",a:{"class":"item"},f:[{p:[82,4,2610],t:7,e:"div",a:{"class":"itemLabel"},f:["Rank:"]}," ",{p:[85,4,2658],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.id_rank",p:[86,3,2687]}]}]}," ",{p:[89,2,2726],t:7,e:"div",a:{"class":"item"},f:[{p:[90,4,2749],t:7,e:"div",a:{"class":"itemLabel"},f:["Demote:"]}," ",{p:[93,4,2799],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[94,3,2828],t:7,e:"ui-button",a:{action:"PRG_terminate",icon:"gear",state:[{t:2,x:{r:["data.id_rank"],s:'_0=="Unassigned"?"disabled":null'},p:[94,56,2881]}]},f:["Demote ",{t:2,r:"data.id_owner",p:[94,117,2942]}]}]}]}],n:50,r:"data.minor",p:[72,2,2415]},{t:4,n:51,f:[{p:[99,2,3007],t:7,e:"div",a:{"class":"item"},f:[{p:[100,4,3030],t:7,e:"div",a:{"class":"itemLabel"},f:["Registered Name:"]}," ",{p:[103,4,3089],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[104,3,3118],t:7,e:"ui-button",a:{action:"PRG_edit",icon:"pencil",params:'{"name" : "1"}'},f:[{t:2,r:"data.id_owner",p:[104,70,3185]}]}]}]}," ",{p:[108,2,3239],t:7,e:"div",a:{"class":"item"},f:[{p:[109,4,3262],t:7,e:"h2",f:["Assignment"]}]}," ",{p:[111,3,3294],t:7,e:"ui-button",a:{action:"PRG_togglea",icon:"gear"},f:[{t:2,x:{r:["data.assignments"],s:'_0?"Hide assignments":"Show assignments"'},p:[111,47,3338]}]}," ",{p:[112,2,3415],t:7,e:"div",a:{"class":"item"},f:[{p:[113,4,3438],t:7,e:"span",a:{id:"allvalue.jobsslot"},f:[]}]}," ",{p:[117,2,3495],t:7,e:"div",a:{"class":"item"},f:[{t:4,f:[{p:[119,4,3547],t:7,e:"div",a:{id:"all-value.jobs"},f:[{p:[120,3,3576],t:7,e:"table",f:[{p:[121,5,3589],t:7,e:"tr",f:[{p:[122,4,3598],t:7,e:"th",f:["Command"]}," ",{p:[123,4,3619],t:7,e:"td",f:[{p:[124,6,3630],t:7,e:"ui-button",a:{action:"PRG_assign",params:'{"assign_target" : "Captain"}',state:[{t:2,x:{r:["data.id_rank"],s:'_0=="Captain"?"selected":null'},p:[124,83,3707]}]},f:["Captain"]}]}]}," ",{p:[127,5,3804],t:7,e:"tr",f:[{p:[128,4,3813],t:7,e:"th",f:["Special"]}," ",{p:[129,4,3834],t:7,e:"td",f:[{p:[130,6,3845],t:7,e:"ui-button",a:{action:"PRG_assign",params:'{"assign_target" : "Custom"}'},f:["Custom"]}]}]}," ",{p:[133,5,3959],t:7,e:"tr",f:[{p:[134,4,3968],t:7,e:"th",a:{style:"color: '#FFA500';"},f:["Engineering"]}," ",{p:[135,4,4019],t:7,e:"td",f:[{t:4,f:[{p:[137,5,4067],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[137,64,4126]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[137,82,4144]}]},f:[{t:2,r:"display_name",p:[137,127,4189]}]}],n:52,r:"data.engineering_jobs",p:[136,6,4030]}]}]}," ",{p:[141,5,4260],t:7,e:"tr",f:[{p:[142,4,4269],t:7,e:"th",a:{style:"color: '#008000';"},f:["Medical"]}," ",{p:[143,4,4316],t:7,e:"td",f:[{t:4,f:[{p:[145,5,4360],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[145,64,4419]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[145,82,4437]}]},f:[{t:2,r:"display_name",p:[145,127,4482]}]}],n:52,r:"data.medical_jobs",p:[144,6,4327]}]}]}," ",{p:[149,5,4553],t:7,e:"tr",f:[{p:[150,4,4562],t:7,e:"th",a:{style:"color: '#800080';"},f:["Science"]}," ",{p:[151,4,4609],t:7,e:"td",f:[{t:4,f:[{p:[153,5,4653],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[153,64,4712]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[153,82,4730]}]},f:[{t:2,r:"display_name",p:[153,127,4775]}]}],n:52,r:"data.science_jobs",p:[152,6,4620]}]}]}," ",{p:[157,5,4846],t:7,e:"tr",f:[{p:[158,4,4855],t:7,e:"th",a:{style:"color: '#DD0000';"},f:["Security"]}," ",{p:[159,4,4903],t:7,e:"td",f:[{t:4,f:[{p:[161,5,4948],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[161,64,5007]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[161,82,5025]}]},f:[{t:2,r:"display_name",p:[161,127,5070]}]}],n:52,r:"data.security_jobs",p:[160,6,4914]}]}]}," ",{p:[165,5,5141],t:7,e:"tr",f:[{p:[166,4,5150],t:7,e:"th",a:{style:"color: '#cc6600';"},f:["Cargo"]}," ",{p:[167,4,5195],t:7,e:"td",f:[{t:4,f:[{p:[169,5,5237],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[169,64,5296]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[169,82,5314]}]},f:[{t:2,r:"display_name",p:[169,127,5359]}]}],n:52,r:"data.cargo_jobs",p:[168,6,5206]}]}]}," ",{p:[173,5,5430],t:7,e:"tr",f:[{p:[174,4,5439],t:7,e:"th",a:{style:"color: '#808080';"},f:["Civilian"]}," ",{p:[175,4,5487],t:7,e:"td",f:[{t:4,f:[{p:[177,5,5532],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[177,64,5591]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[177,82,5609]}]},f:[{t:2,r:"display_name",p:[177,127,5654]}]}],n:52,r:"data.civilian_jobs",p:[176,6,5498]}]}]}," ",{t:4,f:[{p:[182,4,5757],t:7,e:"tr",f:[{p:[183,6,5768],t:7,e:"th",a:{style:"color: '#A52A2A';"},f:["CentCom"]}," ",{p:[184,6,5817],t:7,e:"td",f:[{t:4,f:[{p:[186,7,5862],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[186,66,5921]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[186,84,5939]}]},f:[{t:2,r:"display_name",p:[186,129,5984]}]}],n:52,r:"data.centcom_jobs",p:[185,5,5827]}]}]}],n:50,r:"data.centcom_access",p:[181,5,5725]}]}]}],n:50,r:"data.assignments",p:[118,4,3518]}]}],r:"data.minor"}," ",{t:4,f:[{p:[198,4,6153],t:7,e:"div",a:{"class":"item"},f:[{p:[199,3,6175],t:7,e:"h2",f:["Central Command"]}]}," ",{p:[201,4,6215],t:7,e:"div",a:{"class":"item",style:"width: 100%"},f:[{t:4,f:[{p:[203,5,6296],t:7,e:"div",a:{"class":"itemContentWide"},f:[{p:[204,5,6331],t:7,e:"ui-button",a:{action:"PRG_access",params:['{"access_target" : "',{t:2,r:"ref",p:[204,64,6390]},'", "allowed" : "',{t:2,r:"allowed",p:[204,87,6413]},'"}'],state:[{t:2,x:{r:["allowed"],s:'_0?"toggle":null'},p:[204,109,6435]}]},f:[{t:2,r:"desc",p:[204,140,6466]}]}]}],n:52,r:"data.all_centcom_access",p:[202,3,6257]}]}],n:50,r:"data.centcom_access",p:[197,2,6121]},{t:4,n:51,f:[{p:[209,4,6538],t:7,e:"div",a:{"class":"item"},f:[{p:[210,3,6560],t:7,e:"h2",f:[{t:2,r:"data.station_name",p:[210,7,6564]}]}]}," ",{p:[212,4,6606],t:7,e:"div",a:{"class":"item",style:"width: 100%"},f:[{t:4,f:[{p:[214,5,6676],t:7,e:"div",a:{style:"float: left; width: 175px; min-height: 250px"},f:[{p:[215,4,6739],t:7,e:"div",a:{"class":"average"},f:[{p:[215,25,6760],t:7,e:"ui-button",a:{action:"PRG_regsel",state:[{t:2,x:{r:["selected"],s:'_0?"toggle":null'},p:[215,63,6798]}],params:['{"region" : "',{t:2,r:"regid",p:[215,116,6851]},'"}']},f:[{p:[215,129,6864],t:7,e:"b",f:[{t:2,r:"name",p:[215,132,6867]}]}]}]}," ",{p:[216,4,6902],t:7,e:"br"}," ",{t:4,f:[{p:[218,6,6938],t:7,e:"div",a:{"class":"itemContentWide"},f:[{p:[219,5,6973],t:7,e:"ui-button",a:{action:"PRG_access",params:['{"access_target" : "',{t:2,r:"ref",p:[219,64,7032]},'", "allowed" : "',{t:2,r:"allowed",p:[219,87,7055]},'"}'],state:[{t:2,x:{r:["allowed"],s:'_0?"toggle":null'},p:[219,109,7077]}]},f:[{t:2,r:"desc",p:[219,140,7108]}]}]}],n:52,r:"accesses",p:[217,6,6913]}]}],n:52,r:"data.regions",p:[213,3,6648]}]}],r:"data.centcom_access"}],n:50,r:"data.has_id",p:[67,3,2340]}],n:50,r:"data.authenticated",p:[66,1,2310]}]}],x:{r:["data.mmode"],s:"!_0"}}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],274:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{chargeState:function(t){var e=this.get("data.battery.max");return t>e/2?"good":t>e/4?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[15,1,311],t:7,e:"ntosheader"}," ",{p:[17,1,328],t:7,e:"ui-display",f:[{p:[18,2,343],t:7,e:"i",f:["Welcome to computer configuration utility. Please consult your system administrator if you have any questions about your device."]},{p:[18,137,478],t:7,e:"hr"}," ",{p:[19,2,485],t:7,e:"ui-display",a:{title:"Power Supply"},f:[{p:[20,3,522],t:7,e:"ui-section",a:{label:"Power Usage"},f:[{t:2,r:"data.power_usage",p:[21,4,559]},"W"]}," ",{t:4,f:[{p:[25,4,630],t:7,e:"ui-section",a:{label:"Battery Status"},f:["Active"]}," ",{p:[28,4,701],t:7,e:"ui-section",a:{label:"Battery Rating"},f:[{t:2,r:"data.battery.max",p:[29,5,742]}]}," ",{p:[31,4,785],t:7,e:"ui-section",a:{label:"Battery Charge"},f:[{p:[32,5,826],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.battery.max",p:[32,26,847]}],value:[{t:2,r:"adata.battery.charge",p:[32,56,877]}],state:[{t:2,x:{r:["chargeState","adata.battery.charge"],s:"_0(_1)"},p:[32,89,910]}]},f:[{t:2,x:{r:["adata.battery.charge"],s:"Math.round(_0)"},p:[32,128,949]},"/",{t:2,r:"adata.battery.max",p:[32,165,986]}]}]}],n:50,r:"data.battery",p:[24,3,605]},{t:4,n:51,f:[{p:[35,4,1051],t:7,e:"ui-section",a:{label:"Battery Status"},f:["Not Available"]}],r:"data.battery"}]}," ",{p:[41,2,1156],t:7,e:"ui-display",a:{title:"File System"},f:[{p:[42,3,1192],t:7,e:"ui-section",a:{label:"Used Capacity"},f:[{p:[43,4,1231],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.disk_size",p:[43,25,1252]}],value:[{t:2,r:"adata.disk_used",p:[43,53,1280]}],state:"good"},f:[{t:2,x:{r:["adata.disk_used"],s:"Math.round(_0)"},p:[43,87,1314]},"GQ / ",{t:2,r:"adata.disk_size",p:[43,123,1350]},"GQ"]}]}]}," ",{p:[47,2,1419],t:7,e:"ui-display",a:{title:"Computer Components"},f:[{t:4,f:[{p:[49,4,1491],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"name",p:[49,26,1513]}]},f:[{p:[50,5,1529],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"desc",p:[50,59,1583]}]}," ",{p:[52,5,1605],t:7,e:"ui-section",a:{label:"State"},f:[{p:[53,6,1638],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["critical"],s:'_0?"disabled":null'},p:[53,24,1656]}],action:"PC_toggle_component",params:['{"name": "',{t:2,r:"name",p:[53,105,1737]},'"}']},f:[{t:2,x:{r:["enabled"],s:'_0?"Enabled":"Disabled"'},p:[54,7,1757]}]}]}," ",{t:4,f:[{p:[59,6,1868],t:7,e:"ui-section",a:{label:"Power Usage"},f:[{t:2,r:"powerusage",p:[60,7,1908]},"W"]}],n:50,r:"powerusage",p:[58,5,1843]}]}," ",{p:[64,4,1985],t:7,e:"br"}],n:52,r:"data.hardware",p:[48,3,1463]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],275:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[7,3,103],t:7,e:"h2",f:["An error has occurred and this program can not continue."]}," Additional information: ",{t:2,r:"data.error",p:[8,27,196]},{p:[8,41,210],t:7,e:"br"}," ",{p:[9,3,218],t:7,e:"i",f:["Please try again. If the problem persists contact your system administrator for assistance."]}," ",{p:[10,3,320],t:7,e:"ui-button",a:{action:"PRG_closefile"},f:["Restart program"]}],n:50,r:"data.error",p:[6,2,81]},{t:4,n:51,f:[{t:4,f:[{p:[13,4,422],t:7,e:"h2",f:["Viewing file ",{t:2,r:"data.filename",p:[13,21,439]}]}," ",{p:[14,4,466],t:7,e:"div",a:{"class":"item"},f:[{p:[15,4,489],t:7,e:"ui-button",a:{action:"PRG_closefile"},f:["CLOSE"]}," ",{p:[16,4,545],t:7,e:"ui-button",a:{action:"PRG_edit"},f:["EDIT"]}," ",{p:[17,4,595],t:7,e:"ui-button",a:{action:"PRG_printfile"},f:["PRINT"]}," "]},{p:[18,10,657],t:7,e:"hr"}," ",{t:3,r:"data.filedata",p:[19,4,666]}],n:50,r:"data.filename",p:[12,3,396]},{t:4,n:51,f:[{p:[21,4,702],t:7,e:"h2",f:["Available files (local):"]}," ",{p:[22,4,740],t:7,e:"table",f:[{p:[23,5,753],t:7,e:"tr",f:[{p:[24,6,764],t:7,e:"th",f:["File name"]}," ",{p:[25,6,789],t:7,e:"th",f:["File type"]}," ",{p:[26,6,814],t:7,e:"th",f:["File size (GQ)"]}," ",{p:[27,6,844],t:7,e:"th",f:["Operations"]}]}," ",{t:4,f:[{p:[30,6,907],t:7,e:"tr",f:[{p:[31,7,919],t:7,e:"td",f:[{t:2,r:"name",p:[31,11,923]}]}," ",{p:[32,7,944],t:7,e:"td",f:[".",{t:2,r:"type",p:[32,12,949]}]}," ",{p:[33,7,970],t:7,e:"td",f:[{t:2,r:"size",p:[33,11,974]},"GQ"]}," ",{p:[34,7,997],t:7,e:"td",f:[{p:[35,8,1010],t:7,e:"ui-button",a:{action:"PRG_openfile",params:['{"name": "',{t:2,r:"name",p:[35,59,1061]},'"}']},f:["VIEW"]}," ",{p:[36,8,1098],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[36,26,1116]}],action:"PRG_deletefile",params:['{"name": "',{t:2,r:"name",p:[36,105,1195]},'"}']},f:["DELETE"]}," ",{p:[37,8,1234],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[37,26,1252]}],action:"PRG_rename",params:['{"name": "',{t:2,r:"name",p:[37,101,1327]},'"}']},f:["RENAME"]}," ",{p:[38,8,1366],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[38,26,1384]}],action:"PRG_clone",params:['{"name": "',{t:2,r:"name",p:[38,100,1458]},'"}']},f:["CLONE"]}," ",{t:4,f:[{p:[40,9,1531],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[40,27,1549]}],action:"PRG_copytousb",params:['{"name": "',{t:2,r:"name",p:[40,105,1627]},'"}']},f:["EXPORT"]}],n:50,r:"data.usbconnected",p:[39,8,1496]}]}]}],n:52,r:"data.files",p:[29,5,880]}]}," ",{t:4,f:[{p:[47,4,1761],t:7,e:"h2",f:["Available files (portable device):"]}," ",{p:[48,4,1809],t:7,e:"table",f:[{p:[49,5,1822],t:7,e:"tr",f:[{p:[50,6,1833],t:7,e:"th",f:["File name"]}," ",{p:[51,6,1858],t:7,e:"th",f:["File type"]}," ",{p:[52,6,1883],t:7,e:"th",f:["File size (GQ)"]}," ",{p:[53,6,1913],t:7,e:"th",f:["Operations"]}]}," ",{t:4,f:[{p:[56,6,1979],t:7,e:"tr",f:[{p:[57,7,1991],t:7,e:"td",f:[{t:2,r:"name",p:[57,11,1995]}]}," ",{p:[58,7,2016],t:7,e:"td",f:[".",{t:2,r:"type",p:[58,12,2021]}]}," ",{p:[59,7,2042],t:7,e:"td",f:[{t:2,r:"size",p:[59,11,2046]},"GQ"]}," ",{p:[60,7,2069],t:7,e:"td",f:[{p:[61,8,2082],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[61,26,2100]}],action:"PRG_usbdeletefile",params:['{"name": "',{t:2,r:"name",p:[61,108,2182]},'"}']},f:["DELETE"]}," ",{t:4,f:[{p:[63,9,2256],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[63,27,2274]}],action:"PRG_copyfromusb",params:['{"name": "',{t:2,r:"name",p:[63,107,2354]},'"}']},f:["IMPORT"]}],n:50,r:"data.usbconnected",p:[62,8,2221]}]}]}],n:52,r:"data.usbfiles",p:[55,5,1949]}]}],n:50,r:"data.usbconnected",p:[46,4,1731]}," ",{p:[70,4,2470],t:7,e:"ui-button",a:{action:"PRG_newtextfile"},f:["NEW DATA FILE"]}],r:"data.filename"}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],276:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"i",f:["No program loaded. Please select program from list below."]}," ",{p:[6,2,146],t:7,e:"table",f:[{t:4,f:[{p:[8,4,185],t:7,e:"tr",f:[{p:[8,8,189],t:7,e:"td",f:[{p:[8,12,193],t:7,e:"ui-button",a:{action:"PC_runprogram",params:['{"name": "',{t:2,r:"name",p:[8,64,245]},'"}']},f:[{t:2,r:"desc",p:[9,5,263]}]}]},{p:[11,4,293],t:7,e:"td",f:[{p:[11,8,297],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["running"],s:'_0?null:"disabled"'},p:[11,26,315]}],icon:"close",action:"PC_killprogram",params:['{"name": "',{t:2,r:"name",p:[11,114,403]},'"}']}}]}]}],n:52,r:"data.programs",p:[7,3,157]}]}," ",{p:[14,2,454],t:7,e:"br"},{p:[14,6,458],t:7,e:"br"}," ",{t:4,f:[{p:[16,3,491],t:7,e:"ui-button",a:{action:"PC_toggle_light",style:[{t:2,x:{r:["data.light_on"],s:'_0?"selected":null'},p:[16,46,534]}]},f:["Toggle Flashlight"]},{p:[16,114,602],t:7,e:"br"}," ",{p:[17,3,610],t:7,e:"ui-button",a:{action:"PC_light_color"},f:["Change Flashlight Color ",{p:[17,62,669],t:7,e:"span",a:{style:["border:1px solid #161616; background-color: ",{t:2,r:"data.comp_light_color",p:[17,119,726]},";"]},f:[" "]}]}],n:50,r:"data.has_light",p:[15,2,465]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],277:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[6,3,105],t:7,e:"h1",f:["ADMINISTRATIVE MODE"]}],n:50,r:"data.adminmode",p:[5,2,79]}," ",{t:4,f:[{p:[10,3,170],t:7,e:"div",a:{"class":"itemLabel"},f:["Current channel:"]}," ",{p:[13,3,229],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.title",p:[14,4,259]}]}," ",{p:[16,3,287],t:7,e:"div",a:{"class":"itemLabel"},f:["Operator access:"]}," ",{p:[19,3,346],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:[{p:[21,5,406],t:7,e:"b",f:["Enabled"]}],n:50,r:"data.is_operator",p:[20,4,376]},{t:4,n:51,f:[{p:[23,5,439],t:7,e:"b",f:["Disabled"]}],r:"data.is_operator"}]}," ",{p:[26,3,480],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[29,3,532],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[30,4,562],t:7,e:"table",f:[{p:[31,5,575],t:7,e:"tr",f:[{p:[31,9,579],t:7,e:"td",f:[{p:[31,13,583],t:7,e:"ui-button",a:{action:"PRG_speak"},f:["Send message"]}]}]},{p:[32,5,643],t:7,e:"tr",f:[{p:[32,9,647],t:7,e:"td",f:[{p:[32,13,651],t:7,e:"ui-button",a:{action:"PRG_changename"},f:["Change nickname"]}]}]},{p:[33,5,719],t:7,e:"tr",f:[{p:[33,9,723],t:7,e:"td",f:[{p:[33,13,727],t:7,e:"ui-button",a:{action:"PRG_toggleadmin"},f:["Toggle administration mode"]}]}]},{p:[34,5,807],t:7,e:"tr",f:[{p:[34,9,811],t:7,e:"td",f:[{p:[34,13,815],t:7,e:"ui-button",a:{action:"PRG_leavechannel"},f:["Leave channel"]}]}]},{p:[35,5,883],t:7,e:"tr",f:[{p:[35,9,887],t:7,e:"td",f:[{p:[35,13,891],t:7,e:"ui-button",a:{action:"PRG_savelog"},f:["Save log to local drive"]}," ",{t:4,f:[{p:[37,6,995],t:7,e:"tr",f:[{p:[37,10,999],
-t:7,e:"td",f:[{p:[37,14,1003],t:7,e:"ui-button",a:{action:"PRG_renamechannel"},f:["Rename channel"]}]}]},{p:[38,6,1074],t:7,e:"tr",f:[{p:[38,10,1078],t:7,e:"td",f:[{p:[38,14,1082],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}]}]},{p:[39,6,1149],t:7,e:"tr",f:[{p:[39,10,1153],t:7,e:"td",f:[{p:[39,14,1157],t:7,e:"ui-button",a:{action:"PRG_deletechannel"},f:["Delete channel"]}]}]}],n:50,r:"data.is_operator",p:[36,5,964]}]}]}]}]}," ",{p:[43,3,1263],t:7,e:"b",f:["Chat Window"]}," ",{p:[44,4,1286],t:7,e:"div",a:{"class":"statusDisplay",style:"overflow: auto;"},f:[{p:[45,4,1342],t:7,e:"div",a:{"class":"item"},f:[{p:[46,5,1366],t:7,e:"div",a:{"class":"itemContent",style:"width: 100%;"},f:[{t:4,f:[{t:2,r:"msg",p:[48,7,1450]},{p:[48,14,1457],t:7,e:"br"}],n:52,r:"data.messages",p:[47,6,1419]}]}]}]}," ",{p:[53,3,1516],t:7,e:"b",f:["Connected Users"]},{p:[53,25,1538],t:7,e:"br"}," ",{t:4,f:[{t:2,r:"name",p:[55,4,1573]},{p:[55,12,1581],t:7,e:"br"}],n:52,r:"data.clients",p:[54,3,1546]}],n:50,r:"data.title",p:[9,2,148]},{t:4,n:51,f:[{p:[58,3,1613],t:7,e:"b",f:["Controls:"]}," ",{p:[59,3,1633],t:7,e:"table",f:[{p:[60,4,1645],t:7,e:"tr",f:[{p:[60,8,1649],t:7,e:"td",f:[{p:[60,12,1653],t:7,e:"ui-button",a:{action:"PRG_changename"},f:["Change nickname"]}]}]},{p:[61,4,1720],t:7,e:"tr",f:[{p:[61,8,1724],t:7,e:"td",f:[{p:[61,12,1728],t:7,e:"ui-button",a:{action:"PRG_newchannel"},f:["New Channel"]}]}]},{p:[62,4,1791],t:7,e:"tr",f:[{p:[62,8,1795],t:7,e:"td",f:[{p:[62,12,1799],t:7,e:"ui-button",a:{action:"PRG_toggleadmin"},f:["Toggle administration mode"]}]}]}]}," ",{p:[64,3,1889],t:7,e:"b",f:["Available channels:"]}," ",{p:[65,3,1919],t:7,e:"table",f:[{t:4,f:[{p:[67,4,1964],t:7,e:"tr",f:[{p:[67,8,1968],t:7,e:"td",f:[{p:[67,12,1972],t:7,e:"ui-button",a:{action:"PRG_joinchannel",params:['{"id": "',{t:2,r:"id",p:[67,64,2024]},'"}']},f:[{t:2,r:"chan",p:[67,74,2034]}]},{p:[67,94,2054],t:7,e:"br"}]}]}],n:52,r:"data.all_channels",p:[66,3,1930]}]}],r:"data.title"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],278:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:["##SYSTEM ERROR: ",{t:2,r:"data.error",p:[6,19,117]},{p:[6,33,131],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["RESET"]}],n:50,r:"data.error",p:[5,2,79]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.target"],s:"_0"},f:["##DoS traffic generator active. Tx: ",{t:2,r:"data.speed",p:[8,39,243]},"GQ/s",{p:[8,57,261],t:7,e:"br"}," ",{t:4,f:[{t:2,r:"nums",p:[10,4,300]},{p:[10,12,308],t:7,e:"br"}],n:52,r:"data.dos_strings",p:[9,3,269]}," ",{p:[12,3,329],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["ABORT"]}]},{t:4,n:50,x:{r:["data.target"],s:"!(_0)"},f:[" ##DoS traffic generator ready. Select target device.",{p:[14,55,443],t:7,e:"br"}," ",{t:4,f:["Targeted device ID: ",{t:2,r:"data.focus",p:[16,24,494]}],n:50,r:"data.focus",p:[15,3,451]},{t:4,n:51,f:["Targeted device ID: None"],r:"data.focus"}," ",{p:[20,3,564],t:7,e:"ui-button",a:{action:"PRG_execute"},f:["EXECUTE"]},{p:[20,54,615],t:7,e:"div",a:{style:"clear:both"}}," Detected devices on network:",{p:[21,31,677],t:7,e:"br"}," ",{t:4,f:[{p:[23,4,711],t:7,e:"ui-button",a:{action:"PRG_target_relay",params:['{"targid": "',{t:2,r:"id",p:[23,61,768]},'"}']},f:[{t:2,r:"id",p:[23,71,778]}]}],n:52,r:"data.relays",p:[22,3,685]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],279:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"i",f:["Welcome to software download utility. Please select which software you wish to download."]},{p:[5,97,174],t:7,e:"hr"}," ",{t:4,f:[{p:[7,3,203],t:7,e:"ui-display",a:{title:"Download Error"},f:[{p:[8,4,243],t:7,e:"ui-section",a:{label:"Information"},f:[{t:2,r:"data.error",p:[9,5,281]}]}," ",{p:[11,4,318],t:7,e:"ui-section",a:{label:"Reset Program"},f:[{p:[12,5,358],t:7,e:"ui-button",a:{icon:"times",action:"PRG_reseterror"},f:["RESET"]}]}]}],n:50,r:"data.error",p:[6,2,181]},{t:4,n:51,f:[{t:4,f:[{p:[19,4,516],t:7,e:"ui-display",a:{title:"Download Running"},f:[{p:[20,5,559],t:7,e:"i",f:["Please wait..."]}," ",{p:[21,5,586],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"data.downloadname",p:[22,6,623]}]}," ",{p:[24,5,669],t:7,e:"ui-section",a:{label:"File description"},f:[{t:2,r:"data.downloaddesc",p:[25,6,713]}]}," ",{p:[27,5,759],t:7,e:"ui-section",a:{label:"File size"},f:[{t:2,r:"data.downloadsize",p:[28,6,796]},"GQ"]}," ",{p:[30,5,844],t:7,e:"ui-section",a:{label:"Transfer Rate"},f:[{t:2,r:"data.downloadspeed",p:[31,6,885]}," GQ/s"]}," ",{p:[33,5,937],t:7,e:"ui-section",a:{label:"Download progress"},f:[{p:[34,6,982],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.downloadsize",p:[34,27,1003]}],value:[{t:2,r:"adata.downloadcompletion",p:[34,58,1034]}],state:"good"},f:[{t:2,x:{r:["adata.downloadcompletion"],s:"Math.round(_0)"},p:[34,101,1077]},"GQ / ",{t:2,r:"adata.downloadsize",p:[34,146,1122]},"GQ"]}]}]}],n:50,r:"data.downloadname",p:[18,3,486]}],r:"data.error"}," ",{t:4,f:[{t:4,f:[{p:[41,4,1270],t:7,e:"ui-display",a:{title:"File System"},f:[{p:[42,5,1308],t:7,e:"ui-section",a:{label:"Used Capacity"},f:[{p:[43,6,1349],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.disk_size",p:[43,27,1370]}],value:[{t:2,r:"adata.disk_used",p:[43,55,1398]}],state:"good"},f:[{t:2,x:{r:["adata.disk_used"],s:"Math.round(_0)"},p:[43,89,1432]},"GQ / ",{t:2,r:"adata.disk_size",p:[43,125,1468]},"GQ"]}]}]}," ",{p:[47,4,1545],t:7,e:"ui-display",a:{title:"Primary Software Repository"},f:[{t:4,f:[{p:[49,6,1642],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"filedesc",p:[49,28,1664]}]},f:[{p:[50,7,1686],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"fileinfo",p:[50,61,1740]}]}," ",{p:[52,7,1774],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"filename",p:[53,8,1813]}," (",{t:2,r:"size",p:[53,22,1827]}," GQ)"]}," ",{p:[55,7,1868],t:7,e:"ui-section",a:{label:"Compatibility"},f:[{t:2,r:"compatibility",p:[56,8,1911]}]}," ",{p:[58,7,1957],t:7,e:"ui-button",a:{icon:"signal",action:"PRG_downloadfile",params:['{"filename": "',{t:2,r:"filename",p:[58,80,2030]},'"}']},f:["DOWNLOAD"]}]}," ",{p:[62,6,2113],t:7,e:"br"}],n:52,r:"data.downloadable_programs",p:[48,5,1599]}]}," ",{t:4,f:[{p:[67,5,2194],t:7,e:"ui-display",a:{title:"UNKNOWN Software Repository"},f:[{p:[68,6,2249],t:7,e:"i",f:["Please note that Nanotrasen does not recommend download of software from non-official servers."]}," ",{t:4,f:[{p:[70,7,2395],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"filedesc",p:[70,29,2417]}]},f:[{p:[71,8,2440],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"fileinfo",p:[71,62,2494]}]}," ",{p:[73,8,2530],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"filename",p:[74,9,2570]}," (",{t:2,r:"size",p:[74,23,2584]}," GQ)"]}," ",{p:[76,8,2627],t:7,e:"ui-section",a:{label:"Compatibility"},f:[{t:2,r:"compatibility",p:[77,9,2671]}]}," ",{p:[79,8,2719],t:7,e:"ui-button",a:{icon:"signal",action:"PRG_downloadfile",params:['{"filename": "',{t:2,r:"filename",p:[79,81,2792]},'"}']},f:["DOWNLOAD"]}]}," ",{p:[83,7,2879],t:7,e:"br"}],n:52,r:"data.hacked_programs",p:[69,6,2357]}]}],n:50,r:"data.hackedavailable",p:[66,4,2160]}],n:50,x:{r:["data.error"],s:"!_0"},p:[40,3,1246]}],n:50,x:{r:["data.downloadname"],s:"!_0"},p:[39,2,1216]}," ",{p:[89,2,2954],t:7,e:"br"},{p:[89,6,2958],t:7,e:"br"},{p:[89,10,2962],t:7,e:"hr"},{p:[89,14,2966],t:7,e:"i",f:["NTOS v2.0.4b Copyright Nanotrasen 2557 - 2559"]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],280:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[6,2,81],t:7,e:"ui-display",a:{title:"WIRELESS CONNECTIVITY"},f:[{p:[8,3,129],t:7,e:"ui-section",a:{label:"Active NTNetRelays"},f:[{p:[9,4,173],t:7,e:"b",f:[{t:2,r:"data.ntnetrelays",p:[9,7,176]}]}]}," ",{t:4,f:[{p:[12,4,250],t:7,e:"ui-section",a:{label:"System status"},f:[{p:[13,6,291],t:7,e:"b",f:[{t:2,x:{r:["data.ntnetstatus"],s:'_0?"ENABLED":"DISABLED"'},p:[13,9,294]}]}]}," ",{p:[15,4,366],t:7,e:"ui-section",a:{label:"Control"},f:[{p:[17,4,401],t:7,e:"ui-button",a:{icon:"plus",action:"toggleWireless"},f:["TOGGLE"]}]}," ",{p:[21,4,500],t:7,e:"br"},{p:[21,8,504],t:7,e:"br"}," ",{p:[22,4,513],t:7,e:"i",f:["Caution - Disabling wireless transmitters when using wireless device may prevent you from re-enabling them again!"]}],n:50,r:"data.ntnetrelays",p:[11,3,221]},{t:4,n:51,f:[{p:[24,4,650],t:7,e:"br"},{p:[24,8,654],t:7,e:"p",f:["Wireless coverage unavailable, no relays are connected."]}],r:"data.ntnetrelays"}]}," ",{p:[29,2,750],t:7,e:"ui-display",a:{title:"FIREWALL CONFIGURATION"},f:[{p:[31,2,798],t:7,e:"table",f:[{p:[32,3,809],t:7,e:"tr",f:[{p:[33,4,818],t:7,e:"th",f:["PROTOCOL"]},{p:[34,4,835],t:7,e:"th",f:["STATUS"]},{p:[35,4,850],t:7,e:"th",f:["CONTROL"]}]},{p:[36,3,865],t:7,e:"tr",f:[" ",{p:[37,4,874],t:7,e:"td",f:["Software Downloads"]},{p:[38,4,901],t:7,e:"td",f:[{t:2,x:{r:["data.config_softwaredownload"],s:'_0?"ENABLED":"DISABLED"'},p:[38,8,905]}]},{p:[39,4,967],t:7,e:"td",f:[" ",{p:[39,9,972],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "1"}'},f:["TOGGLE"]}]}]},{p:[40,3,1051],t:7,e:"tr",f:[" ",{p:[41,4,1060],t:7,e:"td",f:["Peer to Peer Traffic"]},{p:[42,4,1089],t:7,e:"td",f:[{t:2,x:{r:["data.config_peertopeer"],s:'_0?"ENABLED":"DISABLED"'},p:[42,8,1093]}]},{p:[43,4,1149],t:7,e:"td",f:[{p:[43,8,1153],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "2"}'},f:["TOGGLE"]}]}]},{p:[44,3,1232],t:7,e:"tr",f:[" ",{p:[45,4,1241],t:7,e:"td",f:["Communication Systems"]},{p:[46,4,1271],t:7,e:"td",f:[{t:2,x:{r:["data.config_communication"],s:'_0?"ENABLED":"DISABLED"'},p:[46,8,1275]}]},{p:[47,4,1334],t:7,e:"td",f:[{p:[47,8,1338],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "3"}'},f:["TOGGLE"]}]}]},{p:[48,3,1417],t:7,e:"tr",f:[" ",{p:[49,4,1426],t:7,e:"td",f:["Remote System Control"]},{p:[50,4,1456],t:7,e:"td",f:[{t:2,x:{r:["data.config_systemcontrol"],s:'_0?"ENABLED":"DISABLED"'},p:[50,8,1460]}]},{p:[51,4,1519],t:7,e:"td",f:[{p:[51,8,1523],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "4"}'},f:["TOGGLE"]}]}]}]}]}," ",{p:[55,2,1630],t:7,e:"ui-display",a:{title:"SECURITY SYSTEMS"},f:[{t:4,f:[{p:[58,4,1699],t:7,e:"ui-notice",f:[{p:[59,5,1716],t:7,e:"h1",f:["NETWORK INCURSION DETECTED"]}]}," ",{p:[61,5,1774],t:7,e:"i",f:["An abnormal activity has been detected in the network. Please verify system logs for more information"]}],n:50,r:"data.idsalarm",p:[57,3,1673]}," ",{p:[64,3,1902],t:7,e:"ui-section",a:{label:"Intrusion Detection System"},f:[{p:[65,4,1954],t:7,e:"b",f:[{t:2,x:{r:["data.idsstatus"],s:'_0?"ENABLED":"DISABLED"'},p:[65,7,1957]}]}]}," ",{p:[68,3,2029],t:7,e:"ui-section",a:{label:"Maximal Log Count"},f:[{p:[69,4,2072],t:7,e:"b",f:[{t:2,r:"data.ntnetmaxlogs",p:[69,7,2075]}]}]}," ",{p:[72,3,2125],t:7,e:"ui-section",a:{label:"Controls"},f:[]}," ",{p:[74,4,2176],t:7,e:"table",f:[{p:[75,4,2188],t:7,e:"tr",f:[{p:[75,8,2192],t:7,e:"td",f:[{p:[75,12,2196],t:7,e:"ui-button",a:{action:"resetIDS"},f:["RESET IDS"]}]}]},{p:[76,4,2251],t:7,e:"tr",f:[{p:[76,8,2255],t:7,e:"td",f:[{p:[76,12,2259],t:7,e:"ui-button",a:{action:"toggleIDS"},f:["TOGGLE IDS"]}]}]},{p:[77,4,2316],t:7,e:"tr",f:[{p:[77,8,2320],t:7,e:"td",f:[{p:[77,12,2324],t:7,e:"ui-button",a:{action:"updatemaxlogs"},f:["SET LOG LIMIT"]}]}]},{p:[78,4,2388],t:7,e:"tr",f:[{p:[78,8,2392],t:7,e:"td",f:[{p:[78,12,2396],t:7,e:"ui-button",a:{action:"purgelogs"},f:["PURGE LOGS"]}]}]}]}," ",{p:[81,3,2467],t:7,e:"ui-subdisplay",a:{title:"System Logs"},f:[{p:[82,3,2506],t:7,e:"div",a:{"class":"statusDisplay",style:"overflow: auto;"},f:[{p:[83,3,2561],t:7,e:"div",a:{"class":"item"},f:[{p:[84,4,2584],t:7,e:"div",a:{"class":"itemContent",style:"width: 100%;"},f:[{t:4,f:[{t:2,r:"entry",p:[86,6,2667]},{p:[86,15,2676],t:7,e:"br"}],n:52,r:"data.ntnetlogs",p:[85,5,2636]}]}]}]}]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],281:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[7,2,102],t:7,e:"div",a:{"class":"item"},f:[{p:[8,3,124],t:7,e:"h2",f:["An error has occurred during operation..."]}," ",{p:[9,3,178],t:7,e:"b",f:["Additional information:"]},{t:2,r:"data.error",p:[9,34,209]},{p:[9,48,223],t:7,e:"br"}," ",{p:[10,3,231],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Clear"]}]}],n:50,r:"data.error",p:[6,2,81]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.downloading"],s:"_0"},f:[{p:[13,3,321],t:7,e:"h2",f:["Download in progress..."]}," ",{p:[14,3,357],t:7,e:"div",a:{"class":"itemLabel"},f:["Downloaded file:"]}," ",{p:[17,3,416],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_name",p:[18,4,446]}]}," ",{p:[20,3,483],t:7,e:"div",a:{"class":"itemLabel"},f:["Download progress:"]}," ",{p:[23,3,544],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_progress",p:[24,4,574]}," / ",{t:2,r:"data.download_size",p:[24,33,603]}," GQ"]}," ",{p:[26,3,642],t:7,e:"div",a:{"class":"itemLabel"},f:["Transfer speed:"]}," ",{p:[29,3,700],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_netspeed",p:[30,4,730]},"GQ/s"]}," ",{p:[32,3,774],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[35,3,826],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[36,4,856],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Abort download"]}]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading"],s:"(!(_0))&&(_1)"},f:[" ",{p:[39,3,954],t:7,e:"h2",f:["Server enabled"]}," ",{p:[40,3,981],t:7,e:"div",a:{"class":"itemLabel"},f:["Connected clients:"]}," ",{p:[43,3,1042],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.upload_clients",p:[44,4,1072]}]}," ",{p:[46,3,1109],t:7,e:"div",a:{"class":"itemLabel"},f:["Provided file:"]}," ",{p:[49,3,1166],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.upload_filename",p:[50,4,1196]}]}," ",{p:[52,3,1234],t:7,e:"div",a:{"class":"itemLabel"},f:["Server password:"]}," ",{p:[55,3,1293],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["ENABLED"],n:50,r:"data.upload_haspassword",p:[56,4,1323]},{t:4,n:51,f:["DISABLED"],r:"data.upload_haspassword"}]}," ",{p:[62,3,1420],t:7,e:"div",a:{"class":"itemLabel"},f:["Commands:"]}," ",{p:[65,3,1472],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[66,4,1502],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}," ",{p:[67,4,1567],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Exit server"]}]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading","data.upload_filelist"],s:"(!(_0))&&((!(_1))&&(_2))"},f:[" ",{p:[70,3,1668],t:7,e:"h2",f:["File transfer server ready. Select file to upload:"]}," ",{p:[71,3,1732],t:7,e:"table",f:[{p:[72,3,1743],t:7,e:"tr",f:[{p:[72,7,1747],t:7,e:"th",f:["File name"]},{p:[72,20,1760],t:7,e:"th",f:["File size"]},{p:[72,33,1773],t:7,e:"th",f:["Controls ",{t:4,f:[{p:[74,4,1824],t:7,e:"tr",f:[{p:[74,8,1828],t:7,e:"td",f:[{t:2,r:"filename",p:[74,12,1832]}]},{p:[75,4,1849],t:7,e:"td",f:[{t:2,r:"size",p:[75,8,1853]},"GQ"]},{p:[76,4,1868],t:7,e:"td",f:[{p:[76,8,1872],t:7,e:"ui-button",a:{action:"PRG_uploadfile",params:['{"id": "',{t:2,r:"uid",p:[76,59,1923]},'"}']},f:["Select"]}]}]}],n:52,r:"data.upload_filelist",p:[73,3,1789]}]}]}]}," ",{p:[79,3,1981],t:7,e:"hr"}," ",{p:[80,3,1989],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}," ",{p:[81,3,2053],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Return"]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading","data.upload_filelist"],s:"(!(_0))&&((!(_1))&&(!(_2)))"},f:[" ",{p:[83,3,2116],t:7,e:"h2",f:["Available files:"]}," ",{p:[84,3,2145],t:7,e:"table",a:{border:"1",style:"border-collapse: collapse"},f:[{p:[84,55,2197],t:7,e:"tr",f:[{p:[84,59,2201],t:7,e:"th",f:["Server UID"]},{p:[84,73,2215],t:7,e:"th",f:["File Name"]},{p:[84,86,2228],t:7,e:"th",f:["File Size"]},{p:[84,99,2241],t:7,e:"th",f:["Password Protection"]},{p:[84,122,2264],t:7,e:"th",f:["Operations ",{t:4,f:[{p:[86,5,2311],t:7,e:"tr",f:[{p:[86,9,2315],t:7,e:"td",f:[{t:2,r:"uid",p:[86,13,2319]}]},{p:[87,5,2332],t:7,e:"td",f:[{t:2,r:"filename",p:[87,9,2336]}]},{p:[88,5,2354],t:7,e:"td",f:[{t:2,r:"size",p:[88,9,2358]},"GQ ",{t:4,f:[{p:[90,6,2400],t:7,e:"td",f:["Enabled"]}],n:50,r:"haspassword",p:[89,5,2374]}," ",{t:4,f:[{p:[93,6,2457],t:7,e:"td",f:["Disabled"]}],n:50,x:{r:["haspassword"],s:"!_0"},p:[92,5,2430]}]},{p:[96,5,2494],t:7,e:"td",f:[{p:[96,9,2498],t:7,e:"ui-button",a:{action:"PRG_downloadfile",params:['{"id": "',{t:2,r:"uid",p:[96,62,2551]},'"}']},f:["Download"]}]}]}],n:52,r:"data.servers",p:[85,4,2283]}]}]}]}," ",{p:[99,3,2612],t:7,e:"hr"}," ",{p:[100,3,2620],t:7,e:"ui-button",a:{action:"PRG_uploadmenu"},f:["Send file"]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],282:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{chargingState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}},chargingMode:function(t){return 2==t?"Full":1==t?"Charging":"Draining"},channelState:function(t){return t>=2?"good":"bad"},channelPower:function(t){return t>=2?"On":"Off"},channelMode:function(t){return 1==t||3==t?"Auto":"Manual"}},computed:{graphData:function(){var t=this.get("data.history");return Object.keys(t).map(function(e){return t[e].map(function(t,e){return{x:e,y:t}})})}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[43,1,1082],t:7,e:"ntosheader"}," ",{p:[45,1,1099],t:7,e:"ui-display",a:{title:"Network"},f:[{t:4,f:[{p:[47,5,1157],t:7,e:"ui-linegraph",a:{points:[{t:2,r:"graphData",p:[47,27,1179]}],height:"500",legend:'["Available", "Load"]',colors:'["rgb(0, 102, 0)", "rgb(153, 0, 0)"]',xunit:"seconds ago",xfactor:[{t:2,r:"data.interval",p:[49,38,1331]}],yunit:"W",yfactor:"1",xinc:[{t:2,x:{r:["data.stored"],s:"_0/10"},p:[50,15,1387]}],yinc:"9"}}],n:50,r:"config.fancy",p:[46,3,1131]},{t:4,n:51,f:[{p:[52,5,1437],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[53,7,1475],t:7,e:"span",f:[{t:2,r:"data.supply",p:[53,13,1481]}]}]}," ",{p:[55,5,1528],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[56,9,1563],t:7,e:"span",f:[{t:2,r:"data.demand",p:[56,15,1569]}]}]}],r:"config.fancy"}]}," ",{p:[60,1,1638],t:7,e:"ui-display",a:{title:"Areas"},f:[{p:[61,3,1668],t:7,e:"ui-section",a:{nowrap:0},f:[{p:[62,5,1693],t:7,e:"div",a:{"class":"content"},f:["Area"]}," ",{p:[63,5,1730],t:7,e:"div",a:{"class":"content"},f:["Charge"]}," ",{p:[64,5,1769],t:7,e:"div",a:{"class":"content"},f:["Load"]}," ",{p:[65,5,1806],t:7,e:"div",a:{"class":"content"},f:["Status"]}," ",{p:[66,5,1845],t:7,e:"div",a:{"class":"content"},f:["Equipment"]}," ",{p:[67,5,1887],t:7,e:"div",a:{"class":"content"},f:["Lighting"]}," ",{p:[68,5,1928],t:7,e:"div",a:{"class":"content"},f:["Environment"]}]}," ",{t:4,f:[{p:[71,5,2013],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[71,24,2032]}],nowrap:0},f:[{p:[72,7,2057],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].charge)"},p:[72,28,2078]}," %"]}," ",{p:[73,7,2136],t:7,e:"div",a:{"class":"content"},f:[{t:2,rx:{r:"adata.areas",m:[{t:30,n:"@index"},"load"]},p:[73,28,2157]}]}," ",{p:[74,7,2199],t:7,e:"div",a:{"class":"content"},f:[{p:[74,28,2220],t:7,e:"span",a:{"class":[{t:2,x:{r:["chargingState","charging"],s:"_0(_1)"},p:[74,41,2233]}]},f:[{t:2,x:{r:["chargingMode","charging"],s:"_0(_1)"},p:[74,70,2262]}]}]}," ",{p:[75,7,2309],t:7,e:"div",a:{"class":"content"},f:[{p:[75,28,2330],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","eqp"],s:"_0(_1)"},p:[75,41,2343]}]},f:[{t:2,x:{r:["channelPower","eqp"],s:"_0(_1)"},p:[75,64,2366]}," [",{p:[75,87,2389],t:7,e:"span",f:[{t:2,x:{r:["channelMode","eqp"],s:"_0(_1)"},p:[75,93,2395]}]},"]"]}]}," ",{p:[76,7,2444],t:7,e:"div",a:{"class":"content"},f:[{p:[76,28,2465],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","lgt"],s:"_0(_1)"},p:[76,41,2478]}]},f:[{t:2,x:{r:["channelPower","lgt"],s:"_0(_1)"},p:[76,64,2501]}," [",{p:[76,87,2524],t:7,e:"span",f:[{t:2,x:{r:["channelMode","lgt"],s:"_0(_1)"},p:[76,93,2530]}]},"]"]}]}," ",{p:[77,7,2579],t:7,e:"div",a:{"class":"content"},f:[{p:[77,28,2600],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","env"],s:"_0(_1)"},p:[77,41,2613]}]},f:[{t:2,x:{r:["channelPower","env"],s:"_0(_1)"},p:[77,64,2636]}," [",{p:[77,87,2659],t:7,e:"span",f:[{t:2,x:{r:["channelMode","env"],s:"_0(_1)"},p:[77,93,2665]}]},"]"]}]}]}],n:52,r:"data.areas",p:[70,3,1987]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],283:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"div",a:{"class":"item"},f:[{p:[6,3,101],t:7,e:"div",a:{"class":"itemLabel"},f:["Payload status:"]}," ",{p:[9,3,158],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["ARMED"],n:50,r:"data.armed",p:[10,4,188]},{t:4,n:51,f:["DISARMED"],r:"data.armed"}]}," ",{p:[16,3,270],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[19,3,321],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[20,4,351],t:7,e:"table",f:[{p:[21,4,363],t:7,e:"tr",f:[{p:[21,8,367],t:7,e:"td",f:[{p:[21,12,371],t:7,e:"ui-button",a:{action:"PRG_obfuscate"},f:["OBFUSCATE PROGRAM NAME"]}]}]},{p:[22,4,444],t:7,e:"tr",f:[{p:[22,8,448],t:7,e:"td",f:[{p:[22,12,452],t:7,e:"ui-button",a:{action:"PRG_arm",state:[{t:2,x:{r:["data.armed"],s:'_0?"danger":null'},p:[22,47,487]}]},f:[{t:2,x:{r:["data.armed"],s:'_0?"DISARM":"ARM"'},p:[22,81,521]}]}," ",{p:[23,4,571],t:7,e:"ui-button",a:{icon:"radiation",state:[{t:2,x:{r:["data.armed"],s:'_0?null:"disabled"'},p:[23,39,606]}],action:"PRG_activate"},f:["ACTIVATE"]}]}]}]}]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],284:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[5,3,95],t:7,e:"ui-display",a:{title:[{t:2,r:"class",p:[5,22,114]}," Alarms"]},f:[{p:[6,5,138],t:7,e:"ul",f:[{t:4,f:[{p:[8,9,171],t:7,e:"li",f:[{t:2,r:".",p:[8,13,175]}]}],n:52,r:".",p:[7,7,150]},{t:4,n:51,f:[{p:[10,9,211],t:7,e:"li",f:["System Nominal"]}],r:"."}]}]}],n:52,i:"class",r:"data.alarms",p:[4,1,64]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],285:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{integState:function(t){var e=100;return t==e?"good":t>e/2?"average":"bad"},bigState:function(t,e,n){return charge>n?"bad":t>e?"average":"good"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[23,1,421],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[27,2,462],t:7,e:"ui-button",a:{action:"PRG_clear"},f:["Back to Menu"]},{p:[27,56,516],t:7,e:"br"}," ",{p:[28,3,524],t:7,e:"ui-display",a:{title:"Supermatter Status:"},f:[{p:[29,3,568],t:7,e:"ui-section",a:{label:"Core Integrity"},f:[{p:[30,5,609],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"adata.SM_integrity",p:[30,38,642]}],state:[{t:2,x:{r:["integState","adata.SM_integrity"],s:"_0(_1)"},p:[30,69,673]}]},f:[{t:2,r:"data.SM_integrity",p:[30,105,709]},"%"]}]}," ",{p:[32,3,761],t:7,e:"ui-section",a:{label:"Relative EER"},f:[{p:[33,5,800],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_power"],s:"_0(_1,150,300)"},p:[33,18,813]}]},f:[{t:2,r:"data.SM_power",p:[33,55,850]}," MeV/cm3"]}]}," ",{p:[35,3,903],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[36,5,941],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_ambienttemp"],s:"_0(_1,4000,5000)"},p:[36,18,954]}]},f:[{t:2,r:"data.SM_ambienttemp",p:[36,63,999]}," K"]}]}," ",{p:[38,3,1052],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[39,5,1087],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_ambientpressure"],s:"_0(_1,5000,10000)"},p:[39,18,1100]}]},f:[{t:2,r:"data.SM_ambientpressure",p:[39,68,1150]}," kPa"]}]}]}," ",{p:[42,3,1227],t:7,e:"hr"},{p:[42,7,1231],t:7,e:"br"}," ",{p:[43,3,1239],t:7,e:"ui-display",a:{title:"Gas Composition:"},f:[{t:4,f:[{p:[45,5,1307],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[45,24,1326]}]},f:[{t:2,r:"amount",p:[46,6,1343]}," %"]}],n:52,r:"data.gases",p:[44,4,1281]}]}],n:50,r:"data.active",p:[26,1,440]},{t:4,n:51,f:[{p:[51,2,1418],t:7,e:"ui-button",a:{action:"PRG_refresh"},f:["Refresh"]},{p:[51,53,1469],t:7,e:"br"}," ",{p:[52,2,1476],t:7,e:"ui-display",a:{title:"Detected Supermatters"},f:[{t:4,f:[{p:[54,3,1552],t:7,e:"ui-section",a:{label:"Area"},f:[{t:2,r:"area_name",p:[55,5,1583]}," - (#",{t:2,r:"uid",p:[55,23,1601]},")"]}," ",{p:[57,3,1630],t:7,e:"ui-section",a:{label:"Integrity"},f:[{t:2,r:"integrity",p:[58,5,1666]}," %"]}," ",{p:[60,3,1702],t:7,e:"ui-section",a:{label:"Options"},f:[{p:[61,5,1736],t:7,e:"ui-button",a:{action:"PRG_set",params:['{"target" : "',{t:2,r:"uid",p:[61,54,1785]},'"}']},f:["View Details"]}]}],n:52,r:"data.supermatters",p:[53,2,1521]}]}],r:"data.active"}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],286:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"item",style:"float: left"},f:[{p:[2,2,41],t:7,e:"table",f:[{p:[2,9,48],t:7,e:"tr",f:[{t:4,f:[{p:[4,3,113],t:7,e:"td",f:[{p:[4,7,117],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[4,17,127]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[3,2,55]}," ",{t:4,f:[{p:[7,3,226],t:7,e:"td",f:[{p:[7,7,230],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[7,10,233]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[6,2,165]}," ",{t:4,f:[{p:[10,3,305],t:7,e:"td",f:[{p:[10,7,309],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[10,17,319]}]}}]}],n:50,r:"data.PC_ntneticon",p:[9,2,276]}," ",{t:4,f:[{p:[13,3,386],t:7,e:"td",f:[{p:[13,7,390],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[13,17,400]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[12,2,355]}," ",{t:4,f:[{p:[16,3,469],t:7,e:"td",f:[{p:[16,7,473],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[16,10,476]}]}]}],n:50,r:"data.PC_stationtime",p:[15,2,438]}," ",{t:4,f:[{p:[19,3,552],t:7,e:"td",f:[{p:[19,7,556],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[19,17,566]}]}}]}],n:52,r:"data.PC_programheaders",p:[18,2,516]}]}]}]}," ",{p:[23,1,609],t:7,e:"div",a:{style:"float: right; margin-top: 5px"},f:[{p:[24,2,655],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[26,3,745],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}," ",{p:[27,3,801],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}],n:50,r:"data.PC_showexitprogram",p:[25,2,710]}]}," ",{p:[30,1,881],t:7,e:"div",a:{style:"clear: both"}}]},e.exports=a.extend(r.exports)},{205:205}],287:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Auth. Disk:"},f:[{t:4,f:[{p:[3,7,69],t:7,e:"ui-button",a:{icon:"eject",style:"selected",action:"eject_disk"},f:["++++++++++"]}],n:50,r:"data.disk_present",p:[2,3,36]},{t:4,n:51,f:[{p:[5,7,172],t:7,e:"ui-button",a:{icon:"plus",action:"insert_disk"},f:["----------"]}],r:"data.disk_present"}]}," ",{p:[8,1,266],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[9,3,297],t:7,e:"span",f:[{t:2,r:"data.status1",p:[9,9,303]},"-",{t:2,r:"data.status2",p:[9,26,320]}]}]}," ",{p:[11,1,360],t:7,e:"ui-display",a:{title:"Timer"},f:[{p:[12,3,390],t:7,e:"ui-section",a:{label:"Time to Detonation"},f:[{p:[13,5,435],t:7,e:"span",f:[{t:2,x:{r:["data.timing","data.time_left","data.timer_set"],s:"_0?_1:_2"},p:[13,11,441]}]}]}," ",{t:4,f:[{p:[16,5,540],t:7,e:"ui-section",a:{label:"Adjust Timer"},f:[{p:[17,7,581],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_default"],s:'_0&&_1&&_2?null:"disabled"'},p:[17,40,614]}],action:"timer",params:'{"change": "reset"}'},f:["Reset"]}," ",{p:[19,7,786],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_min"],s:'_0&&_1&&_2?null:"disabled"'},p:[19,38,817]}],action:"timer",params:'{"change": "decrease"}'},f:["Decrease"]}," ",{p:[21,7,991],t:7,e:"ui-button",a:{icon:"pencil",state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[21,39,1023]}],action:"timer",params:'{"change": "input"}'},f:["Set"]}," ",{p:[22,7,1155],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_max"],s:'_0&&_1&&_2?null:"disabled"'},p:[22,37,1185]}],action:"timer",params:'{"change": "increase"}'},f:["Increase"]}]}],n:51,r:"data.timing",p:[15,3,518]}," ",{p:[26,3,1394],t:7,e:"ui-section",a:{label:"Timer"},f:[{p:[27,5,1426],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"danger":"caution"'},p:[27,38,1459]}],action:"toggle_timer",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.safety"],s:'_0&&_1&&!_2?null:"disabled"'},p:[29,14,1542]}]},f:[{t:2,x:{r:["data.timing"],s:'_0?"On":"Off"'},p:[30,7,1631]}]}]}]}," ",{p:[34,1,1713],t:7,e:"ui-display",a:{title:"Anchoring"},f:[{p:[35,3,1747],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[36,12,1770]}],icon:[{t:2,x:{r:["data.anchored"],s:'_0?"lock":"unlock"'},p:[37,11,1846]}],style:[{t:2,x:{r:["data.anchored"],s:'_0?null:"caution"'},p:[38,12,1897]}],action:"anchor"},f:[{t:2,x:{r:["data.anchored"],s:'_0?"Engaged":"Off"'},p:[39,21,1956]}]}]}," ",{p:[41,1,2022],t:7,e:"ui-display",a:{title:"Safety"},f:[{p:[42,3,2053],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[43,12,2076]}],icon:[{t:2,x:{r:["data.safety"],s:'_0?"lock":"unlock"'},p:[44,11,2152]}],action:"safety",style:[{t:2,x:{r:["data.safety"],s:'_0?"caution":"danger"'},p:[45,12,2217]}]},f:[{p:[46,7,2265],t:7,e:"span",f:[{t:2,x:{r:["data.safety"],s:'_0?"On":"Off"'},p:[46,13,2271]}]}]}]}," ",{p:[49,1,2341],t:7,e:"ui-display",a:{title:"Code"},f:[{p:[50,3,2370],t:7,e:"ui-section",a:{label:"Message"},f:[{t:2,r:"data.message",p:[50,31,2398]}]}," ",{p:[51,3,2431],t:7,e:"ui-section",a:{label:"Keypad"},f:[{p:[52,5,2464],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[52,39,2498]}],params:'{"digit":"1"}'},f:["1"]}," ",{p:[53,5,2583],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[53,39,2617]}],params:'{"digit":"2"}'},f:["2"]}," ",{p:[54,5,2702],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[54,39,2736]}],params:'{"digit":"3"}'},f:["3"]}," ",{p:[55,5,2821],t:7,e:"br"}," ",{p:[56,5,2831],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[56,39,2865]}],params:'{"digit":"4"}'},f:["4"]}," ",{p:[57,5,2950],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],
-s:'_0?null:"disabled"'},p:[57,39,2984]}],params:'{"digit":"5"}'},f:["5"]}," ",{p:[58,5,3069],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[58,39,3103]}],params:'{"digit":"6"}'},f:["6"]}," ",{p:[59,5,3188],t:7,e:"br"}," ",{p:[60,5,3198],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[60,39,3232]}],params:'{"digit":"7"}'},f:["7"]}," ",{p:[61,5,3317],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[61,39,3351]}],params:'{"digit":"8"}'},f:["8"]}," ",{p:[62,5,3436],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[62,39,3470]}],params:'{"digit":"9"}'},f:["9"]}," ",{p:[63,5,3555],t:7,e:"br"}," ",{p:[64,5,3565],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[64,39,3599]}],params:'{"digit":"R"}'},f:["R"]}," ",{p:[65,5,3684],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[65,39,3718]}],params:'{"digit":"0"}'},f:["0"]}," ",{p:[66,5,3803],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[66,39,3837]}],params:'{"digit":"E"}'},f:["E"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],288:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,25],t:7,e:"ui-notice",f:["No table detected!"]}],n:51,r:"data.table",p:[1,1,0]},{p:[6,1,88],t:7,e:"ui-display",f:[{p:[7,2,103],t:7,e:"ui-display",a:{title:"Patient State"},f:[{t:4,f:[{p:[9,4,166],t:7,e:"ui-section",a:{label:"State"},f:[{p:[10,5,198],t:7,e:"span",a:{"class":[{t:2,r:"data.patient.statstate",p:[10,18,211]}]},f:[{t:2,r:"data.patient.stat",p:[10,46,239]}]}]}," ",{p:[12,4,290],t:7,e:"ui-section",a:{label:"Blood Type"},f:[{p:[13,5,327],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.patient.blood_type",p:[13,27,349]}]}]}," ",{p:[15,4,406],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[16,5,439],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.patient.minHealth",p:[16,18,452]}],max:[{t:2,r:"data.patient.maxHealth",p:[16,51,485]}],value:[{t:2,r:"data.patient.health",p:[16,86,520]}],state:[{t:2,x:{r:["data.patient.health"],s:'_0>=0?"good":"average"'},p:[17,12,557]}]},f:[{t:2,x:{r:["adata.patient.health"],s:"Math.round(_0)"},p:[17,63,608]}]}]}," ",{t:4,f:[{p:[20,5,840],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[20,24,859]}]},f:[{p:[21,6,877],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.patient.maxHealth",p:[21,27,898]}],value:[{t:2,rx:{r:"data.patient",m:[{t:30,n:"type"}]},p:[21,62,933]}],state:"bad"},f:[{t:2,x:{r:["type","adata.patient"],s:"Math.round(_1[_0])"},p:[21,98,969]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Burn",type:"fireLoss"},{label:"Toxin",type:"toxLoss"},{label:"Respiratory",type:"oxyLoss"}]'},p:[19,4,676]}],n:50,r:"data.patient",p:[8,3,141]},{t:4,n:51,f:["No patient detected."],r:"data.patient"}]}," ",{p:[28,2,1113],t:7,e:"ui-display",a:{title:"Initiated Procedures"},f:[{t:4,f:[{t:4,f:[{p:[31,5,1217],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"name",p:[31,27,1239]}]},f:[{p:[32,6,1256],t:7,e:"ui-section",a:{label:"Next Step"},f:[{p:[33,7,1294],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"next_step",p:[33,29,1316]}]}," ",{t:4,f:[{p:[35,8,1373],t:7,e:"span",a:{"class":"content"},f:[{p:[35,30,1395],t:7,e:"b",f:["Required chemicals:"]},{p:[35,56,1421],t:7,e:"br"}," ",{t:2,r:"chems_needed",p:[35,61,1426]}]}],n:50,r:"chems_needed",p:[34,7,1344]}]}," ",{t:4,f:[{p:[39,7,1523],t:7,e:"ui-section",a:{label:"Alternative Step"},f:[{p:[40,8,1569],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"alternative_step",p:[40,30,1591]}]}," ",{t:4,f:[{p:[42,9,1661],t:7,e:"span",a:{"class":"content"},f:[{p:[42,31,1683],t:7,e:"b",f:["Required chemicals:"]},{p:[42,57,1709],t:7,e:"br"}," ",{t:2,r:"chems_needed",p:[42,62,1714]}]}],n:50,r:"alt_chems_needed",p:[41,8,1627]}]}],n:50,r:"alternative_step",p:[38,6,1491]}]}],n:52,r:"data.procedures",p:[30,4,1186]}],n:50,r:"data.procedures",p:[29,3,1158]},{t:4,n:51,f:["No active procedures."],r:"data.procedures"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],289:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"ui-section",f:["This machine only accepts ore. Gibtonite and Slag are not accepted."]}," ",{p:[5,2,117],t:7,e:"ui-section",f:["Current unclaimed points: ",{t:2,r:"data.unclaimedPoints",p:[6,29,159]}," ",{t:4,f:[{p:[8,4,220],t:7,e:"ui-button",a:{action:"Claim"},f:["Claim Points"]}],n:50,r:"data.unclaimedPoints",p:[7,3,187]}]}," ",{p:[13,2,311],t:7,e:"ui-section",f:[{t:4,f:[{p:[15,4,350],t:7,e:"ui-button",a:{action:"Eject"},f:["Eject ID"]}," You have ",{t:2,r:"data.claimedPoints",p:[18,13,421]}," mining points collected."],n:50,r:"data.hasID",p:[14,3,327]},{t:4,n:51,f:[{p:[20,4,485],t:7,e:"ui-button",a:{action:"Insert"},f:["Insert ID"]}],r:"data.hasID"}]}]}," ",{p:[26,1,588],t:7,e:"ui-display",f:[{t:4,f:[{p:[28,3,627],t:7,e:"ui-section",f:[{p:[29,4,644],t:7,e:"ui-button",a:{action:"diskEject",icon:"eject"},f:["Eject Disk"]}]}," ",{t:4,f:[{p:[34,4,772],t:7,e:"ui-section",a:{"class":"candystripe"},f:[{p:[35,5,808],t:7,e:"ui-button",a:{action:"diskUpload",state:[{t:2,x:{r:["canupload"],s:'(_0)?null:"disabled"'},p:[35,42,845]}],icon:"upload",align:"right",params:['{ "design" : "',{t:2,r:"index",p:[35,129,932]},'" }']},f:["Upload"]}," File ",{t:2,r:"index",p:[38,10,988]},": ",{t:2,r:"name",p:[38,21,999]}]}],n:52,r:"data.diskDesigns",p:[33,3,741]}],n:50,r:"data.hasDisk",p:[27,2,603]},{t:4,n:51,f:[{p:[42,3,1053],t:7,e:"ui-section",f:[{p:[43,4,1070],t:7,e:"ui-button",a:{action:"diskInsert",icon:"floppy-o"},f:["Insert Disk"]}]}],r:"data.hasDisk"}]}," ",{p:[49,1,1195],t:7,e:"div",a:{"class":"display tabular"},f:[{p:[50,2,1227],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[51,4,1261],t:7,e:"section",a:{"class":"cell"},f:["Mineral"]}," ",{p:[54,4,1316],t:7,e:"section",a:{"class":"cell"},f:["Sheets"]}," ",{p:[57,4,1370],t:7,e:"section",a:{"class":"cell"},f:[]}," ",{p:[59,4,1412],t:7,e:"section",a:{"class":"cell"},f:[{p:[60,5,1440],t:7,e:"ui-button",a:{"class":"center mineral",grid:0,action:"Release",params:'{"id" : "all"}'},f:["Release All"]}]}," ",{p:[64,4,1576],t:7,e:"section",a:{"class":"cell"},f:["Ore Value"]}]}," ",{t:4,f:[{p:[69,3,1673],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[70,4,1707],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[71,5,1735]}]}," ",{p:[73,4,1763],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[74,5,1805]}]}," ",{p:[76,4,1835],t:7,e:"section",a:{"class":"cell"},f:[{p:[77,5,1863],t:7,e:"input",a:{value:[{t:2,r:"sheets",p:[77,18,1876]}],placeholder:"###","class":"number"}}]}," ",{p:[79,4,1941],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{p:[80,5,1983],t:7,e:"ui-button",a:{"class":"center",grid:0,action:"Release",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[80,59,2037]}],params:['{ "id" : ',{t:2,r:"id",p:[80,114,2092]},', "sheets" : ',{t:2,r:"sheets",p:[80,133,2111]}," }"]},f:["Release"]}]}," ",{p:[84,4,2178],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"value",p:[85,5,2220]}]}]}],n:52,r:"data.materials",p:[68,2,1645]}," ",{t:4,f:[{p:[90,3,2298],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[91,4,2332],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[92,5,2360]}]}," ",{p:[94,4,2388],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[95,5,2430]}]}," ",{p:[97,4,2460],t:7,e:"section",a:{"class":"cell"},f:[{p:[98,5,2488],t:7,e:"input",a:{value:[{t:2,r:"sheets",p:[98,18,2501]}],placeholder:"###","class":"number"}}]}," ",{p:[100,4,2566],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{p:[101,5,2608],t:7,e:"ui-button",a:{"class":"center",grid:0,action:"Smelt",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[101,57,2660]}],params:['{ "id" : ',{t:2,r:"id",p:[101,113,2716]},', "sheets" : ',{t:2,r:"sheets",p:[101,132,2735]}," }"]},f:["Smelt"]}]}," ",{p:[105,4,2799],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{p:[106,5,2841],t:7,e:"ui-button",a:{"class":"center",grid:0,action:"SmeltAll",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[106,60,2896]}],params:['{ "id" : ',{t:2,r:"id",p:[106,116,2952]}," }"]},f:["Smelt All"]}]}]}],n:52,r:"data.alloys",p:[89,2,2273]}]}]},e.exports=a.extend(r.exports)},{205:205}],290:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:{button:[{p:[4,4,87],t:7,e:"ui-button",a:{icon:"remove",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[4,36,119]}],action:"empty_eject_beaker"},f:["Empty and eject"]}," ",{p:[7,4,231],t:7,e:"ui-button",a:{icon:"trash",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[7,35,262]}],action:"empty_beaker"},f:["Empty"]}," ",{p:[10,4,358],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[10,35,389]}],action:"eject_beaker"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{t:4,f:[{p:[15,4,528],t:7,e:"ui-section",f:[{t:4,f:[{p:[17,6,578],t:7,e:"span",a:{"class":"bad"},f:["The beaker is empty!"]}],n:50,r:"data.beaker_empty",p:[16,5,546]},{t:4,n:51,f:[{p:[19,6,644],t:7,e:"ui-subdisplay",a:{title:"Blood"},f:[{t:4,f:[{p:[21,8,712],t:7,e:"ui-section",a:{label:"Blood DNA"},f:[{t:2,r:"data.blood.dna",p:[21,38,742]}]}," ",{p:[22,8,782],t:7,e:"ui-section",a:{label:"Blood type"},f:[{t:2,r:"data.blood.type",p:[22,39,813]}]}],n:50,r:"data.has_blood",p:[20,7,681]},{t:4,n:51,f:[{p:[24,8,870],t:7,e:"ui-section",f:[{p:[25,9,892],t:7,e:"span",a:{"class":"average"},f:["No blood sample detected."]}]}],r:"data.has_blood"}]}],r:"data.beaker_empty"}]}],n:50,r:"data.has_beaker",p:[14,3,500]},{t:4,n:51,f:[{p:[32,4,1054],t:7,e:"ui-section",f:[{p:[33,5,1072],t:7,e:"span",a:{"class":"bad"},f:["No beaker loaded."]}]}],r:"data.has_beaker"}]}," ",{t:4,f:[{p:[38,3,1188],t:7,e:"ui-display",a:{title:"Diseases"},f:[{t:4,f:[{p:{button:[{t:4,f:[{p:[43,8,1343],t:7,e:"ui-button",a:{icon:"pencil",action:"rename_disease",state:[{t:2,x:{r:["can_rename"],s:'_0?"":"disabled"'},p:[43,64,1399]}],params:['{"index": ',{t:2,r:"index",p:[43,116,1451]},"}"]},f:["Name advanced disease"]}],n:50,r:"is_adv",p:[42,7,1320]}," ",{p:[47,7,1538],t:7,e:"ui-button",a:{icon:"flask",action:"create_culture_bottle",state:[{t:2,x:{r:["data.is_ready"],s:'_0?"":"disabled"'},p:[47,69,1600]}],params:['{"index": ',{t:2,r:"index",p:[47,124,1655]},"}"]},f:["Create virus culture bottle"]}]},t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[40,24,1269]}],button:0},f:[" ",{p:[51,6,1749],t:7,e:"ui-section",a:{label:"Disease agent"},f:[{t:2,r:"agent",p:[51,40,1783]}]}," ",{p:[52,6,1812],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"description",p:[52,38,1844]}]}," ",{p:[53,6,1879],t:7,e:"ui-section",a:{label:"Spread"},f:[{t:2,r:"spread",p:[53,33,1906]}]}," ",{p:[54,6,1936],t:7,e:"ui-section",a:{label:"Possible cure"},f:[{t:2,r:"cure",p:[54,40,1970]}]}," ",{t:4,f:[{p:[56,7,2021],t:7,e:"ui-section",a:{label:"Symptoms"},f:[{t:4,f:[{p:[58,9,2087],t:7,e:"ui-button",a:{action:"symptom_details",state:"",params:['{"picked_symptom": ',{t:2,r:"sym_index",p:[58,81,2159]},', "index": ',{t:2,r:"index",p:[58,105,2183]},"}"]},f:[{t:2,r:"name",p:[59,10,2206]}," "]},{p:[60,21,2236],t:7,e:"br"}],n:52,r:"symptoms",p:[57,8,2059]}]}," ",{p:[63,7,2289],t:7,e:"ui-section",a:{label:"Resistance"},f:[{t:2,r:"resistance",p:[63,38,2320]}]}," ",{p:[64,7,2355],t:7,e:"ui-section",a:{label:"Stealth"},f:[{t:2,r:"stealth",p:[64,35,2383]}]}," ",{p:[65,7,2415],t:7,e:"ui-section",a:{label:"Stage speed"},f:[{t:2,r:"stage_speed",p:[65,39,2447]}]}," ",{p:[66,7,2483],t:7,e:"ui-section",a:{label:"Transmittability"},f:[{t:2,r:"transmission",p:[66,44,2520]}]}],n:50,r:"is_adv",p:[55,6,1999]}]}],n:52,r:"data.viruses",p:[39,4,1222]},{t:4,n:51,f:[{p:[70,5,2601],t:7,e:"ui-section",f:[{p:[71,6,2620],t:7,e:"span",a:{"class":"average"},f:["No detectable virus in the blood sample."]}]}],r:"data.viruses"}]}," ",{p:[75,3,2743],t:7,e:"ui-display",a:{title:"Antibodies"},f:[{t:4,f:[{p:[77,5,2811],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[77,24,2830]}]},f:[{p:[78,7,2848],t:7,e:"ui-button",a:{icon:"eyedropper",state:[{t:2,x:{r:["data.is_ready"],s:'_0?"":"disabled"'},p:[78,43,2884]}],action:"create_vaccine_bottle",params:['{"index": ',{t:2,r:"id",p:[78,129,2970]},"}"]},f:["Create vaccine bottle"]}]}],n:52,r:"data.resistances",p:[76,4,2779]},{t:4,n:51,f:[{p:[83,5,3067],t:7,e:"ui-section",f:[{p:[84,6,3086],t:7,e:"span",a:{"class":"average"},f:["No antibodies detected in the blood sample."]}]}],r:"data.resistances"}]}],n:50,r:"data.has_blood",p:[37,2,1162]}],n:50,x:{r:["data.mode"],s:"_0==1"},p:[1,1,0]},{t:4,n:51,f:[{p:[90,2,3231],t:7,e:"ui-button",a:{icon:"undo",state:"",action:"back"},f:["Back"]}," ",{t:4,f:[{p:[94,4,3330],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[94,23,3349]}]},f:[{p:[95,4,3364],t:7,e:"ui-section",f:[{t:2,r:"desc",p:[96,5,3382]}," ",{t:4,f:[{p:[98,5,3417],t:7,e:"br"}," ",{p:[99,5,3428],t:7,e:"b",f:["This symptom has been neutered, and has no effect. It will still affect the virus' statistics."]}],n:50,r:"neutered",p:[97,4,3395]}]}," ",{p:[102,4,3564],t:7,e:"ui-section",f:[{p:[103,5,3582],t:7,e:"ui-section",a:{label:"Level"},f:[{t:2,r:"level",p:[103,31,3608]}]}," ",{p:[104,5,3636],t:7,e:"ui-section",a:{label:"Resistance"},f:[{t:2,r:"resistance",p:[104,36,3667]}]}," ",{p:[105,5,3700],t:7,e:"ui-section",a:{label:"Stealth"},f:[{t:2,r:"stealth",p:[105,33,3728]}]}," ",{p:[106,5,3758],t:7,e:"ui-section",a:{label:"Stage speed"},f:[{t:2,r:"stage_speed",p:[106,37,3790]}]}," ",{p:[107,5,3824],t:7,e:"ui-section",a:{label:"Transmittability"},f:[{t:2,r:"transmission",p:[107,42,3861]}]}]}," ",{p:[109,4,3913],t:7,e:"ui-subdisplay",a:{title:"Effect Thresholds"},f:[{p:[110,5,3960],t:7,e:"ui-section",f:[{t:3,r:"threshold_desc",p:[110,17,3972]}]}]}]}],n:53,r:"data.symptom",p:[93,2,3303]}],x:{r:["data.mode"],s:"_0==1"}}]},e.exports=a.extend(r.exports)},{205:205}],291:[function(t,e,n){var a=t(205),r={exports:{}};!function(e){"use strict";var n=t(340);e.exports={data:{filter:"",tooltiptext:function(t,e,n){var a="";return t&&(a+="REQUIREMENTS: "+t+" "),e&&(a+="CATALYSTS: "+e+" "),n&&(a+="TOOLS: "+n),a}},oninit:function(){var t=this;this.on({hover:function(t){this.set("hovered",t.context.params)},unhover:function(t){this.set("hovered")}}),this.observe("filter",function(e,a,r){var i=null;i=t.get("data.display_compact")?t.findAll(".section"):t.findAll(".display:not(:first-child)"),(0,n.filterMulti)(i,t.get("filter").toLowerCase())},{init:!1})}}}(r),r.exports.template={v:3,t:[" ",{p:[48,1,1342],t:7,e:"ui-display",a:{title:[{t:2,r:"data.category",p:[48,20,1361]},{t:4,f:[" : ",{t:2,r:"data.subcategory",p:[48,64,1405]}],n:50,r:"data.subcategory",p:[48,37,1378]}]},f:[{t:4,f:[{p:[50,3,1459],t:7,e:"ui-section",f:["Crafting... ",{p:[51,16,1488],t:7,e:"i",a:{"class":"fa-spin fa fa-spinner"}}]}],n:50,r:"data.busy",p:[49,2,1438]},{t:4,n:51,f:[{p:[54,3,1557],t:7,e:"ui-section",f:[{p:[55,4,1574],t:7,e:"table",a:{style:"width:100%"},f:[{p:[56,5,1606],t:7,e:"tr",f:[{p:[57,6,1617],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[58,7,1659],t:7,e:"ui-button",a:{icon:"arrow-left",action:"backwardCat"},f:[{t:2,r:"data.prev_cat",p:[59,8,1718]}]}]}," ",{p:[62,6,1774],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[63,7,1816],t:7,e:"ui-button",a:{icon:"arrow-right",action:"forwardCat"},f:[{t:2,r:"data.next_cat",p:[64,7,1874]}]}]}," ",{p:[67,6,1930],t:7,e:"td",a:{style:"float:right!important"},f:[{t:4,f:[{p:[69,7,2014],t:7,e:"ui-button",a:{icon:"lock",action:"toggle_recipes"},f:["Showing Craftable Recipes"]}],n:50,r:"data.display_craftable_only",p:[68,6,1971]},{t:4,n:51,f:[{p:[73,7,2138],t:7,e:"ui-button",a:{icon:"unlock",action:"toggle_recipes"},f:["Showing All Recipes"]}],r:"data.display_craftable_only"}]}," ",{p:[78,6,2268],t:7,e:"td",a:{style:"float:right!important"},f:[{p:[79,7,2310],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.display_compact"],s:'_0?"check-square-o":"square-o"'},p:[79,24,2327]}],action:"toggle_compact"},f:["Compact"]}]}]}," ",{p:[84,5,2474],t:7,e:"tr",f:[{t:4,f:[{p:[86,6,2515],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[87,7,2557],t:7,e:"ui-button",a:{icon:"arrow-left",action:"backwardSubCat"},f:[{t:2,r:"data.prev_subcat",p:[88,8,2619]}]}]}," ",{p:[91,6,2678],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[92,7,2720],t:7,e:"ui-button",a:{icon:"arrow-right",action:"forwardSubCat"},f:[{t:2,r:"data.next_subcat",p:[93,8,2782]}]}]}],n:50,r:"data.subcategory",p:[85,5,2484]}]}]}," ",{t:4,f:[{t:4,f:[" ",{p:[101,6,2992],t:7,e:"ui-input",a:{value:[{t:2,r:"filter",p:[101,23,3009]}],placeholder:"Filter.."}}],n:51,r:"data.display_compact",p:[100,5,2902]}],n:50,r:"config.fancy",p:[99,4,2876]}]}," ",{t:4,f:[{p:[106,5,3144],t:7,e:"ui-display",f:[{t:4,f:[{p:[108,6,3193],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[108,25,3212]}]},f:[{p:[109,7,3230],t:7,e:"ui-button",a:{tooltip:[{t:2,x:{r:["tooltiptext","req_text","catalyst_text","tool_text"],s:"_0(_1,_2,_3)"},p:[109,27,3250]}],"tooltip-side":"right",action:"make",params:['{"recipe": "',{t:2,r:"ref",p:[109,135,3358]},'"}'],icon:"gears"},v:{hover:"hover",unhover:"unhover"},f:["Craft"]}]}],n:52,r:"data.can_craft",p:[107,5,3162]}," ",{t:4,f:[{t:4,f:[{p:[116,7,3567],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[116,26,3586]}]},f:[{p:[117,8,3605],t:7,e:"ui-button",a:{tooltip:[{t:2,x:{r:["tooltiptext","req_text","catalyst_text","tool_text"],s:"_0(_1,_2,_3)"},p:[117,28,3625]}],"tooltip-side":"right",state:"disabled",icon:"gears"},v:{hover:"hover",unhover:"unhover"},f:["Craft"]}]}],n:52,r:"data.cant_craft",p:[115,6,3534]}],n:51,r:"data.display_craftable_only",p:[114,5,3495]}]}],n:50,r:"data.display_compact",p:[105,4,3110]},{t:4,n:51,f:[{t:4,f:[{p:[126,6,3947],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[126,25,3966]}]},f:[{t:4,f:[{p:[128,8,4009],t:7,e:"ui-section",a:{label:"Requirements"},f:[{t:2,r:"req_text",p:[129,9,4052]}]}],n:50,r:"req_text",p:[127,7,3984]}," ",{t:4,f:[{p:[133,8,4139],t:7,e:"ui-section",a:{label:"Catalysts"},f:[{t:2,r:"catalyst_text",p:[134,9,4179]}]}],n:50,r:"catalyst_text",p:[132,7,4109]}," ",{t:4,f:[{p:[138,8,4267],t:7,e:"ui-section",a:{label:"Tools"},f:[{t:2,r:"tool_text",p:[139,9,4303]}]}],n:50,r:"tool_text",p:[137,7,4241]}," ",{p:[142,7,4361],t:7,e:"ui-section",f:[{p:[143,8,4382],t:7,e:"ui-button",a:{icon:"gears",action:"make",params:['{"recipe": "',{t:2,r:"ref",p:[143,66,4440]},'"}']},f:["Craft"]}]}]}],n:52,r:"data.can_craft",p:[125,5,3916]}," ",{t:4,f:[{t:4,f:[{p:[151,7,4621],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[151,26,4640]}]},f:[{t:4,f:[{p:[153,9,4685],t:7,e:"ui-section",a:{label:"Requirements"},f:[{t:2,r:"req_text",p:[154,10,4729]}]}],n:50,r:"req_text",p:[152,8,4659]}," ",{t:4,f:[{p:[158,9,4820],t:7,e:"ui-section",a:{label:"Catalysts"},f:[{t:2,r:"catalyst_text",p:[159,10,4861]}]}],n:50,r:"catalyst_text",p:[157,8,4789]}," ",{t:4,f:[{p:[163,9,4953],t:7,e:"ui-section",a:{label:"Tools"},f:[{t:2,r:"tool_text",p:[164,10,4990]}]}],n:50,r:"tool_text",p:[162,8,4926]}]}],n:52,r:"data.cant_craft",p:[150,6,4588]}],n:51,r:"data.display_craftable_only",p:[149,5,4549]}],r:"data.display_compact"}],r:"data.busy"}]}]},e.exports=a.extend(r.exports)},{205:205,340:340}],292:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.holding"],s:'_0?"is":"is not"'},p:[2,23,35]}," connected to a tank."]}]}," ",{p:[4,1,113],t:7,e:"ui-display",a:{title:"Status",button:0},f:[{p:[5,3,151],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[6,5,186],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[6,11,192]}," kPa"]}]}," ",{p:[8,3,254],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[9,5,285],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected"],s:'_0?"good":"average"'},p:[9,18,298]}]},f:[{t:2,x:{r:["data.connected"],s:'_0?"Connected":"Not Connected"'},p:[9,59,339]}]}]}]}," ",{p:[12,1,430],t:7,e:"ui-display",a:{title:"Pump"},f:[{p:[13,3,459],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[14,5,491],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[14,22,508]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":"null"'},p:[15,14,559]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[16,22,616]}]}]}," ",{p:[18,3,675],t:7,e:"ui-section",a:{label:"Direction"},f:[{p:[19,5,711],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.direction"],s:'_0=="out"?"sign-out":"sign-in"'},p:[19,22,728]}],action:"direction"},f:[{t:2,x:{r:["data.direction"],s:'_0=="out"?"Out":"In"'},p:[20,26,808]}]}]}," ",{p:[22,3,883],t:7,e:"ui-section",a:{label:"Target Pressure"},f:[{p:[23,5,925],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.min_pressure",p:[23,18,938]}],max:[{t:2,r:"data.max_pressure",p:[23,46,966]}],value:[{t:2,r:"data.target_pressure",p:[24,14,1003]}]},f:[{t:2,x:{r:["adata.target_pressure"],s:"Math.round(_0)"},p:[24,40,1029]}," kPa"]}]}," ",{p:[26,3,1100],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[27,5,1145],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.target_pressure","data.default_pressure"],s:'_0!=_1?null:"disabled"'},p:[27,38,1178]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[29,5,1328],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.target_pressure","data.min_pressure"],s:'_0>_1?null:"disabled"'},p:[29,36,1359]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[31,5,1500],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[32,5,1595],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.target_pressure","data.max_pressure"],s:'_0<_1?null:"disabled"'},p:[32,35,1625]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}]}," ",{p:{button:[{t:4,f:[{p:[39,7,1891],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.on"],s:'_0?"danger":null'},p:[39,38,1922]}],action:"eject"},f:["Eject"]}],n:50,r:"data.holding",p:[38,5,1863]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[43,3,2042],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holding.name",p:[44,4,2073]}]}," ",{p:[46,3,2115],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holding.pressure"],s:"Math.round(_0)"},p:[47,4,2149]}," kPa"]}],n:50,r:"data.holding",p:[42,3,2018]},{t:4,n:51,f:[{p:[50,3,2223],t:7,e:"ui-section",f:[{p:[51,4,2240],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.holding"}]}]},e.exports=a.extend(r.exports)},{205:205}],293:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[3,1,69],t:7,e:"ui-notice",f:[{p:[4,3,84],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.holding"],s:'_0?"is":"is not"'},p:[4,23,104]}," connected to a tank."]}]}," ",{p:[6,1,182],t:7,e:"ui-display",a:{title:"Status",button:0},f:[{p:[7,3,220],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[8,5,255],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[8,11,261]}," kPa"]}]}," ",{p:[10,3,323],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[11,5,354],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected"],s:'_0?"good":"average"'},p:[11,18,367]}]},f:[{t:2,x:{r:["data.connected"],s:'_0?"Connected":"Not Connected"'},p:[11,59,408]}]}]}]}," ",{p:[14,1,499],t:7,e:"ui-display",a:{title:"Filter"},f:[{p:[15,3,530],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[16,5,562],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[16,22,579]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":"null"'},p:[17,14,630]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[18,22,687]}]}]}]}," ",{p:{button:[{t:4,f:[{p:[24,7,856],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.on"],s:'_0?"danger":null'},p:[24,38,887]}],action:"eject"},f:["Eject"]}],n:50,r:"data.holding",p:[23,5,828]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[28,3,1007],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holding.name",p:[29,4,1038]}]}," ",{p:[31,3,1080],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holding.pressure"],s:"Math.round(_0)"},p:[32,4,1114]}," kPa"]}],n:50,r:"data.holding",p:[27,3,983]},{t:4,n:51,f:[{p:[35,3,1188],t:7,e:"ui-section",f:[{p:[36,4,1205],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.holding"}]}," ",{p:[40,1,1293],t:7,e:"ui-display",a:{title:"Filters"},f:[{t:4,f:[{p:[42,5,1345],t:7,e:"filters"}],n:53,r:"data",p:[41,3,1325]}]}]},r.exports.components=r.exports.components||{};var i={filters:t(313)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,313:313}],294:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{chargingState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}},chargingMode:function(t){return 2==t?"Full":1==t?"Charging":"Draining"},channelState:function(t){return t>=2?"good":"bad"},channelPower:function(t){return t>=2?"On":"Off"},channelMode:function(t){return 1==t||3==t?"Auto":"Manual"}},computed:{graphData:function(){var t=this.get("data.history");return Object.keys(t).map(function(e){return t[e].map(function(t,e){return{x:e,y:t}})})}}}}(r),r.exports.template={v:3,t:[" ",{p:[42,1,1035],t:7,e:"ui-display",a:{title:"Network"},f:[{t:4,f:[{p:[44,5,1093],t:7,e:"ui-linegraph",a:{points:[{t:2,r:"graphData",p:[44,27,1115]}],height:"500",legend:'["Available", "Load"]',colors:'["rgb(0, 102, 0)", "rgb(153, 0, 0)"]',xunit:"seconds ago",xfactor:[{t:2,r:"data.interval",p:[46,38,1267]}],yunit:"W",yfactor:"1",xinc:[{t:2,x:{r:["data.stored"],s:"_0/10"},p:[47,15,1323]}],yinc:"9"}}],n:50,r:"config.fancy",p:[43,3,1067]},{t:4,n:51,f:[{p:[49,5,1373],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[50,7,1411],t:7,e:"span",f:[{t:2,r:"data.supply",p:[50,13,1417]}]}]}," ",{p:[52,5,1464],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[53,9,1499],t:7,e:"span",f:[{t:2,r:"data.demand",p:[53,15,1505]}]}]}],r:"config.fancy"}]}," ",{p:[57,1,1574],t:7,e:"ui-display",a:{title:"Areas"},f:[{p:[58,3,1604],t:7,e:"ui-section",a:{nowrap:0},f:[{p:[59,5,1629],t:7,e:"div",a:{"class":"content"},f:["Area"]}," ",{p:[60,5,1666],t:7,e:"div",a:{"class":"content"},f:["Charge"]}," ",{p:[61,5,1705],t:7,e:"div",a:{"class":"content"},f:["Load"]}," ",{p:[62,5,1742],t:7,e:"div",a:{"class":"content"},f:["Status"]}," ",{p:[63,5,1781],t:7,e:"div",a:{"class":"content"},f:["Equipment"]}," ",{p:[64,5,1823],t:7,e:"div",a:{"class":"content"},f:["Lighting"]}," ",{p:[65,5,1864],t:7,e:"div",a:{"class":"content"},f:["Environment"]}]}," ",{t:4,f:[{p:[68,5,1949],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[68,24,1968]}],nowrap:0},f:[{p:[69,7,1993],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].charge)"},p:[69,28,2014]}," %"]}," ",{p:[70,7,2072],t:7,e:"div",a:{"class":"content"},f:[{t:2,rx:{r:"adata.areas",m:[{t:30,n:"@index"},"load"]},p:[70,28,2093]}]}," ",{p:[71,7,2135],t:7,e:"div",a:{"class":"content"},f:[{p:[71,28,2156],t:7,e:"span",a:{"class":[{t:2,x:{r:["chargingState","charging"],s:"_0(_1)"},p:[71,41,2169]}]},f:[{t:2,x:{r:["chargingMode","charging"],s:"_0(_1)"},p:[71,70,2198]}]}]}," ",{p:[72,7,2245],t:7,e:"div",a:{"class":"content"},f:[{p:[72,28,2266],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","eqp"],s:"_0(_1)"},p:[72,41,2279]}]},f:[{t:2,x:{r:["channelPower","eqp"],s:"_0(_1)"},p:[72,64,2302]}," [",{p:[72,87,2325],t:7,e:"span",f:[{t:2,x:{r:["channelMode","eqp"],s:"_0(_1)"},p:[72,93,2331]}]},"]"]}]}," ",{p:[73,7,2380],t:7,e:"div",a:{"class":"content"},f:[{p:[73,28,2401],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","lgt"],s:"_0(_1)"},p:[73,41,2414]}]},f:[{t:2,x:{r:["channelPower","lgt"],s:"_0(_1)"},p:[73,64,2437]}," [",{p:[73,87,2460],t:7,e:"span",f:[{t:2,x:{r:["channelMode","lgt"],s:"_0(_1)"},p:[73,93,2466]}]},"]"]}]}," ",{p:[74,7,2515],t:7,e:"div",a:{"class":"content"},f:[{p:[74,28,2536],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","env"],s:"_0(_1)"},p:[74,41,2549]}]},f:[{t:2,x:{r:["channelPower","env"],s:"_0(_1)"},p:[74,64,2572]}," [",{p:[74,87,2595],t:7,e:"span",f:[{t:2,x:{r:["channelMode","env"],s:"_0(_1)"},p:[74,93,2601]}]},"]"]}]}]}],n:52,r:"data.areas",p:[67,3,1923]}]}]},e.exports=a.extend(r.exports)},{205:205}],295:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{readableFrequency:function(){return Math.round(this.get("adata.frequency"))/10}}}}(r),r.exports.template={v:3,t:[" ",{p:[11,1,177],t:7,e:"ui-display",a:{title:"Settings"},f:[{t:4,f:[{p:[13,5,236],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[14,7,270],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.listening"],s:'_0?"power-off":"close"'},p:[14,24,287]}],style:[{t:2,x:{r:["data.listening"],s:'_0?"selected":null'},p:[14,75,338]}],action:"listen"},f:[{t:2,x:{r:["data.listening"],s:'_0?"On":"Off"'},p:[16,9,413]}]}]}],n:50,r:"data.headset",p:[12,3,210]},{t:4,n:51,f:[{p:[19,5,494],t:7,e:"ui-section",a:{label:"Microphone"},f:[{p:[20,7,533],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.broadcasting"],s:'_0?"power-off":"close"'},p:[20,24,550]}],style:[{t:2,x:{r:["data.broadcasting"],s:'_0?"selected":null'},p:[20,78,604]}],action:"broadcast"},f:[{t:2,x:{r:["data.broadcasting"],s:'_0?"Engaged":"Disengaged"'},p:[22,9,685]}]}]}," ",{p:[24,5,769],t:7,e:"ui-section",a:{label:"Speaker"},f:[{p:[25,7,805],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.listening"],s:'_0?"power-off":"close"'},p:[25,24,822]}],style:[{t:2,x:{r:["data.listening"],s:'_0?"selected":null'},p:[25,75,873]}],action:"listen"},f:[{t:2,x:{r:["data.listening"],s:'_0?"Engaged":"Disengaged"'},p:[27,9,948]}]}]}],r:"data.headset"}," ",{t:4,f:[{p:[31,5,1064],t:7,e:"ui-section",a:{label:"High Volume"},f:[{p:[32,7,1104],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.useCommand"],s:'_0?"power-off":"close"'},p:[32,24,1121]}],style:[{t:2,x:{r:["data.useCommand"],s:'_0?"selected":null'},p:[32,76,1173]}],action:"command"},f:[{t:2,x:{r:["data.useCommand"],s:'_0?"On":"Off"'},p:[34,9,1250]}]}]}],n:50,r:"data.command",p:[30,3,1038]}]}," ",{p:[38,1,1342],t:7,e:"ui-display",a:{title:"Channel"},f:[{p:[39,3,1374],t:7,e:"ui-section",a:{label:"Frequency"},f:[{t:4,f:[{p:[41,7,1439],t:7,e:"span",f:[{t:2,r:"readableFrequency",p:[41,13,1445]}]}],n:50,r:"data.freqlock",p:[40,5,1410]},{t:4,n:51,f:[{p:[43,7,1495],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.frequency","data.minFrequency"],s:'_0==_1?"disabled":null'},p:[43,46,1534]}],action:"frequency",params:'{"adjust": -1}'}}," ",{p:[44,7,1646],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.frequency","data.minFrequency"],s:'_0==_1?"disabled":null'},p:[44,41,1680]}],action:"frequency",params:'{"adjust": -.2}'}}," ",{p:[45,7,1793],t:7,e:"ui-button",a:{icon:"pencil",action:"frequency",params:'{"tune": "input"}'},f:[{t:2,r:"readableFrequency",p:[45,78,1864]}]}," ",{p:[46,7,1905],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.frequency","data.maxFrequency"],s:'_0==_1?"disabled":null'},p:[46,40,1938]}],action:"frequency",params:'{"adjust": .2}'}}," ",{p:[47,7,2050],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.frequency","data.maxFrequency"],s:'_0==_1?"disabled":null'},p:[47,45,2088]}],action:"frequency",params:'{"adjust": 1}'}}],r:"data.freqlock"}]}," ",{t:4,f:[{p:[51,5,2262],t:7,e:"ui-section",a:{label:"Subspace Transmission"},f:[{p:[52,7,2312],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.subspace"],s:'_0?"power-off":"close"'},p:[52,24,2329]}],style:[{t:2,x:{r:["data.subspace"],s:'_0?"selected":null'},p:[52,74,2379]}],action:"subspace"},f:[{t:2,x:{r:["data.subspace"],s:'_0?"Active":"Inactive"'},p:[53,29,2447]}]}]}],n:50,r:"data.subspaceSwitchable",p:[50,3,2225]}," ",{t:4,f:[{p:[57,5,2578],t:7,e:"ui-section",a:{label:"Channels"},f:[{t:4,f:[{p:[59,9,2656],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["."],s:'_0?"check-square-o":"square-o"'},p:[59,26,2673]
-}],style:[{t:2,x:{r:["."],s:'_0?"selected":null'},p:[60,18,2730]}],action:"channel",params:['{"channel": "',{t:2,r:"channel",p:[61,49,2806]},'"}']},f:[{t:2,r:"channel",p:[62,11,2833]}]},{p:[62,34,2856],t:7,e:"br"}],n:52,i:"channel",r:"data.channels",p:[58,7,2615]}]}],n:50,x:{r:["data.subspace","data.channels"],s:"_0&&_1"},p:[56,3,2534]}]}]},e.exports=a.extend(r.exports)},{205:205}],296:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" "," "," "," "," "," "," "," "," "," ",{p:[11,1,560],t:7,e:"rdheader"}," ",{t:4,f:[{p:[13,2,595],t:7,e:"ui-display",a:{title:"CONSOLE LOCKED"},f:[{p:[14,3,634],t:7,e:"ui-button",a:{action:"Unlock"},f:["Unlock"]}]}],n:50,r:"data.locked",p:[12,1,573]},{t:4,f:[{p:[18,2,729],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.tabs",p:[18,17,744]}]},f:[{p:[19,3,763],t:7,e:"tab",a:{name:"Technology"},f:[{p:[20,4,791],t:7,e:"techweb"}]}," ",{p:[22,3,815],t:7,e:"tab",a:{name:"View Node"},f:[{p:[23,4,842],t:7,e:"nodeview"}]}," ",{p:[25,3,867],t:7,e:"tab",a:{name:"View Design"},f:[{p:[26,4,896],t:7,e:"designview"}]}," ",{p:[28,3,923],t:7,e:"tab",a:{name:"Disk Operations - Design"},f:[{p:[29,4,965],t:7,e:"diskopsdesign"}]}," ",{p:[31,3,995],t:7,e:"tab",a:{name:"Disk Operations - Technology"},f:[{p:[32,4,1041],t:7,e:"diskopstech"}]}," ",{p:[34,3,1069],t:7,e:"tab",a:{name:"Deconstructive Analyzer"},f:[{p:[35,4,1110],t:7,e:"destruct"}]}," ",{p:[37,3,1135],t:7,e:"tab",a:{name:"Protolathe"},f:[{p:[38,4,1163],t:7,e:"protolathe"}]}," ",{p:[40,3,1190],t:7,e:"tab",a:{name:"Circuit Imprinter"},f:[{p:[41,4,1225],t:7,e:"circuit"}]}," ",{p:[43,3,1249],t:7,e:"tab",a:{name:"Settings"},f:[{p:[44,4,1275],t:7,e:"settings"}]}]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[17,1,706]}]},r.exports.components=r.exports.components||{};var i={settings:t(305),circuit:t(297),protolathe:t(303),destruct:t(299),diskopsdesign:t(300),diskopstech:t(301),designview:t(298),nodeview:t(302),techweb:t(306),rdheader:t(304)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,297:297,298:298,299:299,300:300,301:301,302:302,303:303,304:304,305:305,306:306}],297:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:4,f:[{p:[3,3,58],t:7,e:"ui-display",a:{title:"Circuit Imprinter Busy!"}}],n:50,r:"data.circuitbusy",p:[2,2,30]},{t:4,n:51,f:[{p:[5,3,130],t:7,e:"ui-display",f:[{p:[6,4,147],t:7,e:"ui-section",f:["Search Available Designs: ",{p:[7,4,189],t:7,e:"input",a:{value:[{t:2,r:"textsearch",p:[7,17,202]}],placeholder:"Type Here","class":"text"}}," ",{p:[8,5,261],t:7,e:"ui-button",a:{action:"textSearch",params:['{"latheType" : "circuit", "inputText" : ',{t:2,r:"textsearch",p:[8,84,340]},"}"]},f:["Search"]}]}," ",{p:[10,4,398],t:7,e:"ui-section",f:["Materials: ",{t:2,r:"data.circuitmats",p:[10,27,421]}," / ",{t:2,r:"data.circuitmaxmats",p:[10,50,444]}]}," ",{p:[11,4,485],t:7,e:"ui-section",f:["Reagents: ",{t:2,r:"data.circuitchems",p:[11,26,507]}," / ",{t:2,r:"data.circuitmaxchems",p:[11,50,531]}]}," ",{p:[12,3,572],t:7,e:"ui-display",f:[{p:[14,3,590],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.lathe_tabs",p:[14,18,605]}]},f:[{p:[15,4,631],t:7,e:"tab",a:{name:"Category List"},f:[{t:4,f:[{p:[17,6,696],t:7,e:"ui-button",a:{action:"switchcat",state:[{t:2,x:{r:["data.circuitcat"],s:'_0=="{{name}}"?"selected":null'},p:[17,43,733]}],params:['{"type" : "circuit", "cat" : "',{t:2,r:"name",p:[17,135,825]},'"}']},f:[{t:2,r:"name",p:[17,147,837]}]}],n:52,r:"data.circuitcats",p:[16,5,663]}]}," ",{p:[20,4,888],t:7,e:"tab",a:{name:"Selected Category"},f:[{t:4,f:[{p:[22,6,956],t:7,e:"ui-section",f:[{t:2,r:"name",p:[22,18,968]},{t:2,r:"matstring",p:[22,26,976]}," ",{p:[23,7,997],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[23,40,1030]}],params:['{"latheType" : "circuit", "id" : "',{t:2,r:"id",p:[23,119,1109]},'"}']},f:["Print"]}]}],n:52,r:"data.circuitdes",p:[21,5,924]}]}," ",{p:[27,4,1187],t:7,e:"tab",a:{name:"Search Results"},f:[{t:4,f:[{p:[29,6,1254],t:7,e:"ui-section",f:[{t:2,r:"name",p:[29,18,1266]},{t:2,r:"matstring",p:[29,26,1274]}," ",{p:[30,7,1295],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[30,40,1328]}],params:['{"latheType" : "circuit", "id" : "',{t:2,r:"id",p:[30,119,1407]},'"}']},f:["Print"]}]}],n:52,r:"data.circuitmatch",p:[28,5,1220]}]}," ",{p:[34,4,1485],t:7,e:"tab",a:{name:"Materials"},f:[{t:4,f:[{p:[36,6,1550],t:7,e:"ui-section",f:[{t:2,r:"name",p:[36,18,1562]}," : ",{t:2,r:"amount",p:[36,29,1573]}," cm3 - ",{t:4,f:[{p:[38,7,1623],t:7,e:"input",a:{value:[{t:2,r:"number",p:[38,20,1636]}],placeholder:["1-",{t:2,r:"sheets",p:[38,46,1662]}],"class":"number"}}," ",{p:[39,7,1698],t:7,e:"ui-button",a:{action:"releasemats",params:['{"latheType" : "circuit", "mat_id" : ',{t:2,r:"mat_id",p:[39,84,1775]},', "sheets" : ',{t:2,r:"number",p:[39,107,1798]},"}"]},f:["Release"]}],n:50,x:{r:["sheets"],s:"_0>0"},p:[37,6,1597]}]}],n:52,r:"data.circuitmat_list",p:[35,5,1513]}]}," ",{p:[44,4,1895],t:7,e:"tab",a:{name:"Chemicals"},f:[{t:4,f:[{p:[46,6,1961],t:7,e:"ui-section",f:[{t:2,r:"name",p:[46,18,1973]}," : ",{t:2,r:"amount",p:[46,29,1984]}," - ",{p:[47,7,2005],t:7,e:"ui-button",a:{action:"purgechem",params:['{"latheType" : "circuit", "name" : ',{t:2,r:"name",p:[47,80,2078]},', "id" : ',{t:2,r:"reagentid",p:[47,97,2095]},"}"]},f:["Purge"]}]}],n:52,r:"data.circuitchem_list",p:[45,5,1923]}]}]}]}]}],r:"data.circuitbusy"}],n:50,r:"data.circuit_linked",p:[1,1,0]},{t:4,n:51,f:[{p:[55,2,2216],t:7,e:"ui-display",a:{title:"No Linked Circuit Imprinter"}}],r:"data.circuit_linked"}]},e.exports=a.extend(r.exports)},{205:205}],298:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,31],t:7,e:"ui-display",a:{title:[{t:2,r:"data.sdesign_name",p:[2,21,50]}]},f:[{p:[3,3,77],t:7,e:"ui-section",a:{title:"Description"},f:[{t:2,r:"data.sdesign_desc",p:[3,35,109]}]}]}," ",{p:[5,2,162],t:7,e:"ui-display",a:{title:"Lathe Types"},f:[{t:4,f:[{p:[7,4,239],t:7,e:"ui-section",a:{title:"Circuit Imprinter"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&1"},p:[6,3,198]}," ",{t:4,f:[{p:[10,4,346],t:7,e:"ui-section",a:{title:"Protolathe"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&2"},p:[9,3,305]}," ",{t:4,f:[{p:[13,4,446],t:7,e:"ui-section",a:{title:"Autolathe"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&4"},p:[12,3,405]}," ",{t:4,f:[{p:[16,4,545],t:7,e:"ui-section",a:{title:"Crafting Fabricator"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&8"},p:[15,3,504]}," ",{t:4,f:[{p:[19,4,655],t:7,e:"ui-section",a:{title:"Exosuit Fabricator"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&16"},p:[18,3,613]}," ",{t:4,f:[{p:[22,4,764],t:7,e:"ui-section",a:{title:"Biogenerator"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&32"},p:[21,3,722]}," ",{t:4,f:[{p:[25,4,867],t:7,e:"ui-section",a:{title:"Limb Grower"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&64"},p:[24,3,825]}," ",{t:4,f:[{p:[28,4,970],t:7,e:"ui-section",a:{title:"Ore Smelter"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&128"},p:[27,3,927]}]}," ",{p:[31,2,1045],t:7,e:"ui-display",a:{title:"Materials"},f:[{t:4,f:[{p:[33,4,1116],t:7,e:"ui-section",a:{title:[{t:2,r:"matname",p:[33,23,1135]}]},f:[{t:2,r:"matamt",p:[33,36,1148]}," cm^3"]}],n:52,r:"data.sdesign_materials",p:[32,3,1079]}]}],n:50,r:"data.design_selected",p:[1,1,0]},{t:4,f:[{p:[38,2,1248],t:7,e:"ui-display",a:{title:"No Design Selected."}}],n:50,x:{r:["data.design_selected"],s:"!_0"},p:[37,1,1216]}]},e.exports=a.extend(r.exports)},{205:205}],299:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:4,f:[{p:[4,3,60],t:7,e:"ui-display",a:{title:"Destructive Analyzer Busy!"}}],n:50,r:"data.destroybusy",p:[3,2,32]},{t:4,n:51,f:[{t:4,f:[{p:[7,4,168],t:7,e:"ui-display",a:{title:"Destructive Analyzer Unloaded"}}],n:50,x:{r:["data.destroy_loaded"],s:"!_0"},p:[6,3,135]},{t:4,n:51,f:[{p:[9,4,248],t:7,e:"ui-display",a:{title:"Loaded Item"},f:[{p:[10,4,285],t:7,e:"ui-section",a:{title:"Name"},f:[{t:2,r:"data.destroy_name",p:[10,29,310]}]}]}," ",{p:[12,4,367],t:7,e:"ui-display",a:{title:"Boost Nodes"},f:[{t:4,f:[{p:[14,6,438],t:7,e:"ui-section",a:{title:[{t:2,r:"name",p:[14,25,457]}," | ",{t:2,r:"value",p:[14,36,468]}]},f:[{p:[15,7,487],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["allow"],s:'_0?null:"disabled"'},p:[15,25,505]}],action:"deconstruct",params:['{"id":',{t:2,r:"id",p:[15,90,570]},"}"]},f:["Deconstruct and Boost"]}]}],n:52,r:"data.boost_paths",p:[13,5,405]}]}," ",{p:[19,4,670],t:7,e:"ui-button",a:{action:"eject_da"},f:["Eject Item"]}],x:{r:["data.destroy_loaded"],s:"!_0"}}],r:"data.destroybusy"}],n:50,r:"data.destroy_linked",p:[2,1,2]},{t:4,n:51,f:[{p:[23,2,755],t:7,e:"ui-display",a:{title:"No Linked Destructive Analyzer"}}],r:"data.destroy_linked"}]},e.exports=a.extend(r.exports)},{205:205}],300:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[3,2,24],t:7,e:"ui-display",a:{title:"No Design Disk Loaded"}}],n:50,x:{r:["data.ddisk"],s:"!_0"},p:[2,1,2]},{t:4,n:51,f:[{t:4,f:[{p:[6,3,121],t:7,e:"ui-display",a:{title:"Design Disk Updating"}}],n:50,r:"data.ddisk_update",p:[5,2,92]},{t:4,n:51,f:[{t:4,f:[{p:[9,4,221],t:7,e:"ui-display",a:{title:"Design Disk"},f:[{p:[10,5,259],t:7,e:"ui-section",a:{title:"Disk Space"},f:["Disk Capacity: ",{t:2,r:"data.ddisk_size",p:[10,51,305]}," blueprints."]}," ",{p:[11,5,355],t:7,e:"ui-section",a:{title:"Disk IO"},f:[{p:[11,33,383],t:7,e:"ui-button",a:{action:"ddisk_upall"},f:["Upload all designs"]}]}," ",{p:[12,5,464],t:7,e:"ui-section",a:{title:"Clear Disk"},f:[{p:[12,36,495],t:7,e:"ui-button",a:{action:"clear_designdisk",style:"danger"},f:["WIPE ALL DATA"]}]}," ",{p:[13,5,591],t:7,e:"ui-section",a:{title:"Eject Disk"},f:[{p:[13,36,622],t:7,e:"ui-button",a:{action:"eject_designdisk"},f:["Eject Disk"]}]}]}," ",{p:[15,4,717],t:7,e:"ui-display",a:{title:"Disk Contents"},f:[{t:4,f:[{p:[17,6,792],t:7,e:"ui-section",a:{title:"Number"},f:["#",{t:2,r:"pos",p:[17,34,820]},": ",{t:4,f:[{p:[19,8,866],t:7,e:"ui-button",a:{action:"upload_empty_ddisk_slot",params:['{"slot": "',{t:2,r:"pos",p:[19,70,928]},'"}']},f:["Upload to Empty Slot"]}],n:50,x:{r:["id"],s:'_0=="null"'},p:[18,7,837]},{t:4,n:51,f:[{p:[21,8,996],t:7,e:"ui-button",a:{action:"select_design",params:['{"id": "',{t:2,r:"id",p:[21,58,1046]},'"}'],state:[{t:2,x:{r:["data.sdesign_id","id"],s:'_0==_1?"selected":null'},p:[21,75,1063]}]},f:[{t:2,r:"name",p:[21,122,1110]}]}," ",{p:[22,8,1139],t:7,e:"ui-button",a:{action:"ddisk_erasepos",style:"danger",params:['{"id": "',{t:2,r:"id",p:[22,74,1205]},'"}'],state:[{t:2,x:{r:["id"],s:'_0=="null"?"disabled":null'},p:[22,91,1222]}]},f:["Delete Slot"]}],x:{r:["id"],s:'_0=="null"'}}]}],n:52,r:"data.ddisk_designs",p:[16,5,757]}]}],n:50,x:{r:["data.ddisk_upload"],s:"!_0"},p:[8,3,190]},{t:4,n:51,f:[{p:[28,4,1367],t:7,e:"ui-display",a:{title:"Upload Design to Disk"},f:[{p:[28,46,1409],t:7,e:"ui-section",f:["Available Designs:"]}]}," ",{t:4,f:[{p:[30,5,1513],t:7,e:"ui-section",f:[{p:[30,17,1525],t:7,e:"ui-button",a:{action:"ddisk_uploaddesign",params:['{"id": "',{t:2,r:"id",p:[30,72,1580]},'"}']},f:[{t:2,r:"name",p:[30,82,1590]}]}]}],n:52,r:"data.ddisk_possible_designs",p:[29,4,1470]}],x:{r:["data.ddisk_upload"],s:"!_0"}}],r:"data.ddisk_update"}],x:{r:["data.ddisk"],s:"!_0"}}]},e.exports=a.extend(r.exports)},{205:205}],301:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[3,2,24],t:7,e:"ui-display",a:{title:"No Technology Disk Loaded"}}],n:50,x:{r:["data.tdisk"],s:"!_0"},p:[2,1,2]},{t:4,n:51,f:[{t:4,f:[{p:[6,3,125],t:7,e:"ui-display",a:{title:"Technology Disk Updating"}}],n:50,r:"data.tdisk_update",p:[5,2,96]},{t:4,n:51,f:[{p:[8,3,198],t:7,e:"ui-display",a:{title:"Technology Disk"},f:[{p:[9,4,239],t:7,e:"ui-section",a:{title:"Disk IO"},f:[{p:[9,32,267],t:7,e:"ui-button",a:{action:"tdisk_down"},f:["Download Research to Disk"]},{p:[9,100,335],t:7,e:"ui-button",a:{action:"tdisk_up"},f:["Upload Research from Disk"]}," ",{p:[10,4,406],t:7,e:"ui-section",a:{title:"Clear Disk"},f:[{p:[10,35,437],t:7,e:"ui-button",a:{action:"clear_techdisk",style:"danger"},f:["WIPE ALL DATA"]}]}," ",{p:[11,4,530],t:7,e:"ui-section",a:{title:"Eject Disk"},f:[{p:[11,35,561],t:7,e:"ui-button",a:{action:"eject_techdisk"},f:["Eject Disk"]}]}]}]}," ",{p:[13,3,652],t:7,e:"ui-display",a:{title:"Disk Contents"},f:[{t:4,f:[{p:[15,5,723],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[15,53,771]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[15,70,788]}]},f:[{t:2,r:"display_name",p:[15,115,833]}]}],n:52,r:"data.tdisk_nodes",p:[14,4,691]}]}],r:"data.tdisk_update"}],x:{r:["data.tdisk"],s:"!_0"}}]},e.exports=a.extend(r.exports)},{205:205}],302:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,29],t:7,e:"ui-display",a:{title:[{t:2,r:"data.snode_name",p:[2,21,48]}]},f:[{p:[3,3,73],t:7,e:"ui-section",a:{title:"Description"},f:["Description: ",{t:2,r:"data.snode_desc",p:[3,48,118]}]}," ",{p:[4,3,154],t:7,e:"ui-section",a:{title:"Point Cost"},f:["Point Cost: ",{t:2,r:"data.snode_cost",p:[4,46,197]}]}," ",{p:[5,3,233],t:7,e:"ui-section",a:{title:"Export Price"},f:["Export Price: ",{t:2,r:"data.snode_export",p:[5,50,280]}]}," ",{p:[6,3,318],t:7,e:"ui-button",a:{action:"research_node",params:['{"id"="',{t:2,r:"id",p:[6,52,367]},'"}'],state:[{t:2,x:{r:["data.snode_researched"],s:'_0?"disabled":null'},p:[6,69,384]}]},f:[{t:2,x:{r:["data.snode_researched"],s:'_0?"Researched":"Research Node"'},p:[6,115,430]}]}]}," ",{p:[8,2,518],t:7,e:"ui-display",a:{title:"Prerequisites"},f:[{t:4,f:[{p:[10,4,588],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[10,52,636]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[10,69,653]}]},f:[{t:2,r:"display_name",p:[10,114,698]}]}],n:52,r:"data.node_prereqs",p:[9,3,556]}]}," ",{p:[13,2,759],t:7,e:"ui-display",a:{title:"Unlocks"},f:[{t:4,f:[{p:[15,4,823],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[15,52,871]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[15,69,888]}]},f:[{t:2,r:"display_name",p:[15,114,933]}]}],n:52,r:"data.node_unlocks",p:[14,3,791]}]}," ",{p:[18,2,994],t:7,e:"ui-display",a:{title:"Designs"},f:[{t:4,f:[{p:[20,4,1058],t:7,e:"ui-button",a:{action:"select_design",params:['{"id": "',{t:2,r:"id",p:[20,54,1108]},'"}'],state:[{t:2,x:{r:["data.sdesign_id","id"],s:'_0==_1?"selected":null'},p:[20,71,1125]}]},f:[{t:2,r:"name",p:[20,118,1172]}]}],n:52,r:"data.node_designs",p:[19,3,1026]}]}],n:50,r:"data.node_selected",p:[1,1,0]},{t:4,f:[{p:[25,2,1263],t:7,e:"ui-display",a:{title:"No Node Selected."}}],n:50,x:{r:["data.node_selected"],s:"!_0"},p:[24,1,1233]}]},e.exports=a.extend(r.exports)},{205:205}],303:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:4,f:[{p:[3,3,59],t:7,e:"ui-display",a:{title:"Protolathe Busy!"}}],n:50,r:"data.protobusy",p:[2,2,33]},{t:4,n:51,f:[{p:[5,3,124],t:7,e:"ui-display",f:[{p:[6,4,141],t:7,e:"ui-section",f:["Search Available Designs: ",{p:[7,4,183],t:7,e:"input",a:{value:[{t:2,r:"textsearch",p:[7,17,196]}],placeholder:"Type Here","class":"text"}}," ",{p:[8,5,255],t:7,e:"ui-button",a:{action:"textSearch",params:['{"latheType" : "proto", "inputText" : ',{t:2,r:"textsearch",p:[8,82,332]},"}"]},f:["Search"]}]}," ",{p:[10,4,390],t:7,e:"ui-section",f:["Materials: ",{t:2,r:"data.protomats",p:[10,27,413]}," / ",{t:2,r:"data.protomaxmats",p:[10,48,434]}]}," ",{p:[11,4,473],t:7,e:"ui-section",f:["Reagents: ",{t:2,r:"data.protochems",p:[11,26,495]}," / ",{t:2,r:"data.protomaxchems",p:[11,48,517]}]}," ",{p:[12,3,556],t:7,e:"ui-display",f:[{p:[14,3,574],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.lathe_tabs",p:[14,18,589]}]},f:[{p:[15,4,615],t:7,e:"tab",a:{name:"Category List"},f:[{t:4,f:[{p:[17,6,678],t:7,e:"ui-button",a:{action:"switchcat",state:[{t:2,x:{r:["data.protocat","name"],s:'_0==_1?"selected":null'},p:[17,43,715]}],params:['{"type" : "proto", "cat" : "',{t:2,r:"name",p:[17,125,797]},'"}']},f:[{t:2,r:"name",p:[17,137,809]}]}],n:52,r:"data.protocats",p:[16,5,647]}]}," ",{p:[20,4,860],t:7,e:"tab",a:{name:"Selected Category"},f:[{t:4,f:[{p:[22,6,926],t:7,e:"ui-section",f:[{t:2,r:"name",p:[22,18,938]},{t:2,r:"matstring",p:[22,26,946]}," ",{t:4,f:[{p:[24,8,996],t:7,e:"input",a:{value:[{t:2,r:"number",p:[24,21,1009]}],placeholder:["1-",{t:2,x:{r:["canprint"],s:"_0>10?10:_0"},p:[24,47,1035]}],"class":"number"}}],n:50,x:{r:["canprint"],s:"_0>1"},p:[23,7,967]}," ",{p:[26,7,1108],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[26,40,1141]}],params:['{"latheType" : "proto", "id" : "',{t:2,r:"id",p:[26,117,1218]},'", "amount" : "',{t:2,r:"number",p:[26,138,1239]},'"}']},f:["Print"]}]}],n:52,r:"data.protodes",p:[21,5,896]}]}," ",{p:[30,4,1321],t:7,e:"tab",a:{name:"Search Results"},f:[{t:4,f:[{p:[32,6,1386],t:7,e:"ui-section",f:[{t:2,r:"name",p:[32,18,1398]},{t:2,r:"matstring",p:[32,26,1406]}," ",{t:4,f:[{p:[34,8,1456],t:7,e:"input",a:{value:[{t:2,r:"number",p:[34,21,1469]}],placeholder:["1-",{t:2,x:{r:["canprint"],s:"_0>10?10:_0"},p:[34,47,1495]}],"class":"number"}}],n:50,x:{r:["canprint"],s:"_0>1"},p:[33,7,1427]}," ",{p:[36,7,1568],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[36,40,1601]}],params:['{"latheType" : "proto", "id" : "',{t:2,r:"id",p:[36,117,1678]},'", "amount" : "',{t:2,r:"number",p:[36,138,1699]},'"}']},f:["Print"]}]}],n:52,r:"data.protomatch",p:[31,5,1354]}]}," ",{p:[40,4,1781],t:7,e:"tab",a:{name:"Materials"},f:[{t:4,f:[{p:[42,6,1844],t:7,e:"ui-section",f:[{t:2,r:"name",p:[42,18,1856]}," : ",{t:2,r:"amount",p:[42,29,1867]}," cm3 - ",{t:4,f:[{p:[44,7,1917],t:7,e:"input",a:{value:[{t:2,r:"number",p:[44,20,1930]}],placeholder:["1-",{t:2,r:"sheets",p:[44,46,1956]}],"class":"number"}}," ",{p:[45,7,1992],t:7,e:"ui-button",a:{action:"releasemats",params:['{"latheType" : "proto", "mat_id" : ',{t:2,r:"mat_id",p:[45,82,2067]},', "sheets" : ',{t:2,r:"number",p:[45,105,2090]},"}"]},f:["Release"]}],n:50,x:{r:["sheets"],s:"_0>0"},p:[43,6,1891]}]}],n:52,r:"data.protomat_list",p:[41,5,1809]}]}," ",{p:[50,4,2187],t:7,e:"tab",a:{name:"Chemicals"},f:[{t:4,f:[{p:[52,6,2251],t:7,e:"ui-section",f:[{t:2,r:"name",p:[52,18,2263]}," : ",{t:2,r:"amount",p:[52,29,2274]}," - ",{p:[53,7,2295],t:7,e:"ui-button",a:{action:"purgechem",params:['{"latheType" : "proto", "name" : ',{t:2,r:"name",p:[53,78,2366]},', "id" : ',{t:2,r:"reagentid",p:[53,95,2383]},"}"]},f:["Purge"]}]}],n:52,r:"data.protochem_list",p:[51,5,2215]}]}]}]}]}],r:"data.protobusy"}],n:50,r:"data.protolathe_linked",p:[1,1,0]},{t:4,n:51,f:[{p:[61,2,2504],t:7,e:"ui-display",a:{title:"No Linked Protolathe"}}],r:"data.protolathe_linked"}]},e.exports=a.extend(r.exports)},{205:205}],304:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,1,14],t:7,e:"span",a:{"class":"memoedit"},f:["NanoTrasen R&D Console"]},{p:[2,53,66],t:7,e:"br"}," Available Points: ",{p:[3,19,91],t:7,e:"ui-section",a:{title:"Research Points"},f:[{t:2,r:"data.research_points_stored",p:[3,55,127]}]}," ",{p:[4,1,173],t:7,e:"ui-section",a:{title:["Page Selection - ",{t:2,r:"page",p:[4,37,209]}]},f:[{p:[4,47,219],t:7,e:"input",a:{value:[{t:2,r:"pageselect",p:[4,60,232]}],placeholder:"1","class":"number"}}," Select Page: ",{p:[5,14,294],t:7,e:"ui-button",a:{action:"page",params:['{"num" : "',{t:2,r:"pageselect",p:[5,57,337]},'"}']},f:["[Go]"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],305:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"span",a:{"class":"bad"},f:["Settings"]},{p:[1,34,33],t:7,e:"br"},{p:[1,39,38],t:7,e:"br"}," ",{p:[2,1,45],t:7,e:"ui-button",a:{action:"Resync"},f:["RESYNC MACHINERY"]},{p:[2,56,100],t:7,e:"br"}," ",{p:[3,1,107],t:7,e:"ui-button",a:{action:"Lock"},f:["LOCK"]}," ",{p:[4,1,150],t:7,e:"ui-button",a:{action:"disconnect",params:'{"type" : "destroy"}',state:[{t:2,x:{r:["data.destroy_linked"],s:'_0?null:"disabled"'},p:[4,71,220]}]},f:["Disconnect Destructive Analyzer"]}," ",{p:[5,1,309],t:7,e:"ui-button",a:{action:"disconnect",params:'{"type" : "lathe"}',state:[{t:2,x:{r:["data.protolathe_linked"],s:'_0?null:"disabled"'},p:[5,69,377]}]},f:["Disconnect Protolathe"]}," ",{p:[6,1,459],t:7,e:"ui-button",a:{action:"disconnect",params:'{"type" : "imprinter"}',state:[{t:2,x:{r:["data.circuit_linked"],s:'_0?null:"disabled"'},p:[6,73,531]}]},f:["Disconnect Circuit Imprinter"]}]},e.exports=a.extend(r.exports)},{205:205}],306:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Available for Research"},f:[{t:4,f:[{p:[3,3,78],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[3,51,126]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[3,68,143]}]},f:[{t:2,r:"display_name",p:[3,113,188]}]}],n:52,r:"data.techweb_avail",p:[2,2,46]}]}," ",{p:[6,1,245],t:7,e:"ui-display",a:{title:"Locked Nodes"},f:[{t:4,f:[{p:[8,3,314],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[8,51,362]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[8,68,379]}]},f:[{t:2,r:"display_name",p:[8,113,424]}]}],n:52,r:"data.techweb_locked",p:[7,2,281]}]}," ",{p:[11,1,482],t:7,e:"ui-display",a:{title:"Researched Nodes"},f:[{t:4,f:[{p:[13,3,559],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[13,51,607]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[13,68,624]}]},f:[{t:2,r:"display_name",p:[13,113,669]}]}],n:52,r:"data.techweb_researched",p:[12,2,522]}]}]},e.exports=a.extend(r.exports)},{205:205}],307:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,1,25],t:7,e:"ui-notice",f:[{p:[3,3,40],t:7,e:"span",f:["The grinder is currently processing and cannot be used."]}]}],n:50,r:"data.processing",p:[1,1,0]},{p:{button:[{p:[8,5,208],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.operating","data.contents"],s:'(_0==0)&&_1?null:"disabled"'},p:[8,36,239]}],action:"eject"},f:["Eject Contents"]}]},t:7,e:"ui-display",a:{title:"Processing Chamber",button:0},f:[" ",{p:[10,3,364],t:7,e:"ui-section",a:{label:"Grinding"},f:[{p:[11,5,399],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.operating"],s:'_0?"average":"good"'},p:[11,18,412]}]},f:[{t:2,x:{r:["data.operating"],s:'_0?"Busy":"Ready"'},p:[11,59,453]}]}," ",{p:[12,2,500],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.operating","data.contents"],s:'(_0==0)&&_1?null:"disabled"'},p:[12,35,533]}],action:"grind"},f:["Activate"]}]}," ",{p:[14,3,653],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{t:4,f:[{p:[17,9,755],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:["The ",{t:2,r:"name",p:[17,56,802]}]},{p:[17,71,817],t:7,e:"br"}],n:52,r:"adata.contentslist",p:[16,7,717]},{t:4,n:51,f:[{p:[19,9,848],t:7,e:"span",f:["No Contents"]}],r:"adata.contentslist"}],n:50,r:"data.contents",p:[15,5,688]},{t:4,n:51,f:[{p:[22,7,911],t:7,e:"span",f:["No Contents"]}],r:"data.contents"}]}]}," ",{p:{button:[{p:[28,5,1047],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.operating","data.isBeakerLoaded"],s:'(_0==0)&&_1?null:"disabled"'},p:[28,36,1078]}],action:"detach"},f:["Detach"]}]},t:7,e:"ui-display",a:{title:"Container",button:0},f:[" ",{p:[30,3,1202],t:7,e:"ui-section",a:{label:"Reagents"},f:[{t:4,f:[{p:[32,7,1272],t:7,e:"span",f:[{t:2,x:{r:["adata.beakerCurrentVolume"],s:"Math.round(_0)"},p:[32,13,1278]},"/",{t:2,r:"data.beakerMaxVolume",p:[32,55,1320]}," Units"]}," ",{p:[33,7,1365],t:7,e:"br"}," ",{t:4,f:[{p:[35,9,1418],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[35,52,1461]}," units of ",{t:2,r:"name",p:[35,87,1496]}]},{p:[35,102,1511],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[34,7,1378]},{t:4,n:51,f:[{p:[37,9,1542],t:7,e:"span",a:{"class":"bad"},f:["Container Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[31,5,1237]},{t:4,n:51,f:[{p:[40,7,1621],t:7,e:"span",a:{"class":"average"},f:["No Container"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],308:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" "," ",{t:4,f:[{p:[5,2,123],t:7,e:"dirsel"}],n:50,x:{r:["data.mode"],s:"_0>=0"},p:[4,1,98]},{t:4,f:[{p:[8,2,187],t:7,e:"colorsel"}],n:50,x:{r:["data.mode"],s:"_0==-2||_0==0"},p:[7,1,143]},{p:[10,1,209],t:7,e:"ui-display",a:{title:"Utilities"},f:[{p:[11,2,242],t:7,e:"ui-section",f:[{p:[12,3,258],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0>=0?"check-square-o":"square-o"'},p:[12,20,275]}],state:[{t:2,x:{r:["data.mode"],s:'_0>=0?"selected":null'},p:[12,79,334]}],action:"mode",params:['{"mode": ',{t:2,r:"data.screen",p:[13,35,409]},"}"]},f:["Lay Pipes"]}]}," ",{p:[15,2,467],t:7,e:"ui-section",f:[{p:[16,3,483],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0==-1?"check-square-o":"square-o"'},p:[16,20,500]}],state:[{t:2,x:{r:["data.mode"],s:'_0==-1?"selected":null'},p:[16,80,560]}],action:"mode",params:'{"mode": -1}'},f:["Eat Pipes"]}]}," ",{p:[19,2,681],t:7,e:"ui-section",f:[{p:[20,3,697],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0==-2?"check-square-o":"square-o"'},p:[20,20,714]}],state:[{t:2,x:{r:["data.mode"],s:'_0==-2?"selected":null'},p:[20,80,774]}],action:"mode",params:'{"mode": -2}'},f:["Paint Pipes"]}]}]}," ",{p:[24,1,911],t:7,e:"ui-display",a:{title:"Category"},f:[{p:[25,2,943],t:7,e:"ui-section",f:[{p:[26,3,959],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.screen"],s:'_0==0?"check-square-o":"square-o"'},p:[26,20,976]}],state:[{t:2,x:{r:["data.screen"],s:'_0==0?"selected":null'},p:[26,81,1037]}],action:"screen",params:'{"screen": 0}'},f:["Atmospherics"]}," ",{p:[28,3,1150],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.screen"],s:'_0==2?"check-square-o":"square-o"'},p:[28,20,1167]}],state:[{t:2,x:{r:["data.screen"],s:'_0==2?"selected":null'},p:[28,81,1228]}],action:"screen",params:'{"screen": 2}'},f:["Disposals"]}," ",{p:[30,3,1338],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.screen"],s:'_0==3?"check-square-o":"square-o"'},p:[30,20,1355]}],state:[{t:2,x:{r:["data.screen"],s:'_0==3?"selected":null'},p:[30,81,1416]}],action:"screen",params:'{"screen": 3}'},f:["Transit Tubes"]}]}," ",{t:4,f:[{p:[34,3,1573],t:7,e:"ui-section",a:{label:"Piping Layer"},f:[{p:[35,4,1611],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.piping_layer"],s:'_0==1?"selected":null'},p:[35,22,1629]}],action:"piping_layer",params:'{"piping_layer": 1}'},f:["1"]}," ",{p:[37,4,1751],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.piping_layer"],s:'_0==2?"selected":null'},p:[37,22,1769]}],action:"piping_layer",params:'{"piping_layer": 2}'},f:["2"]}," ",{p:[39,4,1891],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.piping_layer"],s:'_0==3?"selected":null'},p:[39,22,1909]}],action:"piping_layer",params:'{"piping_layer": 3}'},f:["3"]}]}],n:50,x:{r:["data.screen"],s:"_0==0"},p:[33,2,1545]}]}," ",{t:4,f:[{p:[45,2,2098],t:7,e:"ui-display",a:{title:[{t:2,r:"cat_name",p:[45,21,2117]}]},f:[{t:4,f:[{p:[47,4,2157],t:7,e:"ui-section",f:[{p:[48,5,2175],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[48,23,2193]}],action:"pipe_type",params:['{"pipe_type": ',{t:2,r:"pipe_index",p:[49,28,2274]},', "category": ',{t:2,r:"cat_name",p:[49,56,2302]},"}"]},f:[{t:2,r:"pipe_name",p:[49,71,2317]}]}]}],n:52,r:"recipes",p:[46,3,2135]}]}],n:52,r:"data.categories",p:[44,1,2070]}]},r.exports.components=r.exports.components||{};var i={colorsel:t(309),dirsel:t(310)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,309:309,310:310}],309:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Color"},f:[{t:4,f:[{p:[3,3,60],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[3,21,78]}],action:"color",params:['{"paint_color": ',{t:2,r:"color_name",p:[4,28,155]},"}"]},f:[{t:2,r:"color_name",p:[4,45,172]}]}],n:52,r:"data.paint_colors",p:[2,2,29]}]}]},e.exports=a.extend(r.exports)},{205:205}],310:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Direction"},f:[{t:4,f:[{p:[3,3,64],t:7,e:"ui-section",f:[{t:4,f:[{p:[5,5,105],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[5,23,123]}],action:"setdir",params:['{"dir": ',{t:2,r:"dir",p:[6,22,195]},', "flipped": ',{t:2,r:"flipped",p:[6,42,215]},"}"]},f:[{p:[6,56,229],t:7,e:"img",a:{src:["pipe.",{t:2,r:"dir",p:[6,71,244]},".",{t:2,r:"icon_state",p:[6,79,252]},".png"],title:[{t:2,r:"dir_name",p:[6,106,279]}]}}]}],n:52,r:"previews",p:[4,4,81]}]}],n:52,r:"data.preview_rows",p:[2,2,33]}]}]},e.exports=a.extend(r.exports)},{205:205}],311:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,23],t:7,e:"ui-notice",f:[{t:2,r:"data.notice",p:[3,5,40]}]}],n:50,r:"data.notice",p:[1,1,0]},{p:[6,1,82],t:7,e:"ui-display",a:{title:"Satellite Network Control",button:0},f:[{t:4,f:[{p:[8,4,168],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[9,9,209],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[9,31,231]}]}," ",{p:[10,9,253],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"mode",p:[10,30,274]}]}," ",{p:[11,9,298],t:7,e:"div",a:{"class":"content"},f:[{p:[12,11,331],t:7,e:"ui-button",a:{action:"toggle",params:['{"id": "',{t:2,r:"id",p:[12,54,374]},'"}']},f:[{t:2,x:{r:["active"],s:'_0?"Deactivate":"Activate"'},p:[12,64,384]}]}]}]}],n:52,r:"data.satellites",p:[7,2,138]}]}," ",{t:4,f:[{p:[18,1,528],t:7,e:"ui-display",a:{title:"Station Shield Coverage"},f:[{p:[19,3,576],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.meteor_shield_coverage_max",p:[19,24,597]}],value:[{t:2,r:"data.meteor_shield_coverage",p:[19,68,641]}]},f:[{t:2,x:{r:["data.meteor_shield_coverage","data.meteor_shield_coverage_max"],s:"100*_0/_1"},p:[19,101,674]}," %"]}," ",{p:[20,1,758],t:7,e:"ui-display",f:[]}]}],n:50,r:"data.meteor_shield",p:[17,1,500]}]},e.exports=a.extend(r.exports)},{205:205}],312:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Recipient Contents"},f:[{p:[2,2,42],t:7,e:"ui-section",f:[{p:[3,3,58],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[3,34,89]}],action:"eject"},f:["Eject"]}," ",{p:[4,3,170],t:7,e:"ui-button",a:{icon:"circle",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[4,35,202]}],action:"input"},f:["Input"]}," ",{p:[5,3,283],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"disabled":null'},p:[5,33,313]}],action:"makecup"},f:["Create Cup"]}]}]}," ",{p:[8,1,430],t:7,e:"ui-display",a:{title:"Recipient"},f:[{p:[9,2,463],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[11,4,528],t:7,e:"span",f:[{t:2,x:{r:["adata.beakerCurrentVolume"],s:"Math.round(_0)"},p:[11,10,534]},"/",{t:2,r:"data.beakerMaxVolume",p:[11,52,576]}," Units"]}," ",{t:4,f:[{p:[13,5,654],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[13,48,697]}," units of ",{t:2,r:"name",p:[13,83,732]}]},{p:[13,98,747],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[12,4,618]},{t:4,n:51,f:[{p:[15,5,771],t:7,e:"span",a:{"class":"bad"},f:["Recipient Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[10,3,496]},{t:4,n:51,f:[{p:[18,4,842],t:7,e:"span",a:{"class":"average"},f:["No Recipient"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],313:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,26],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["enabled"],s:'_0?"check-square-o":"square-o"'},p:[2,20,43]}],style:[{t:2,x:{r:["enabled"],s:'_0?"selected":null'},p:[2,72,95]}],action:"toggle_filter",params:['{"id_tag": "',{
-t:2,r:"id_tag",p:[3,48,176]},'", "val": ',{t:2,r:"gas_id",p:[3,68,196]},"}"]},f:[{t:2,r:"gas_name",p:[3,81,209]}]}],n:52,r:"filter_types",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{205:205}],314:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" "," "," ",{p:[5,1,200],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.tabs",p:[5,16,215]}]},f:[{p:[6,2,233],t:7,e:"tab",a:{name:"Status"},f:[{p:[7,3,256],t:7,e:"status"}]}," ",{p:[9,2,277],t:7,e:"tab",a:{name:"Templates"},f:[{p:[10,3,303],t:7,e:"templates"}]}," ",{p:[12,2,327],t:7,e:"tab",a:{name:"Modification"},f:[{t:4,f:[{p:[14,3,381],t:7,e:"modification"}],n:50,r:"data.selected",p:[13,3,356]}," ",{t:4,f:[{p:[17,3,437],t:7,e:"span",a:{"class":"bad"},f:["No shuttle selected."]}],n:50,x:{r:["data.selected"],s:"!_0"},p:[16,3,411]}]}]}]},r.exports.components=r.exports.components||{};var i={modification:t(315),templates:t(317),status:t(316)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,315:315,316:316,317:317}],315:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:["Selected: ",{t:2,r:"data.selected.name",p:[1,30,29]}]},f:[{t:4,f:[{p:[3,5,96],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.selected.description",p:[3,37,128]}]}],n:50,r:"data.selected.description",p:[2,3,57]}," ",{t:4,f:[{p:[6,5,224],t:7,e:"ui-section",a:{label:"Admin Notes"},f:[{t:2,r:"data.selected.admin_notes",p:[6,37,256]}]}],n:50,r:"data.selected.admin_notes",p:[5,3,185]}]}," ",{t:4,f:[{p:[11,3,361],t:7,e:"ui-display",a:{title:["Existing Shuttle: ",{t:2,r:"data.existing_shuttle.name",p:[11,40,398]}]},f:["Status: ",{t:2,r:"data.existing_shuttle.status",p:[12,13,444]}," ",{t:4,f:["(",{t:2,r:"data.existing_shuttle.timeleft",p:[14,8,526]},")"],n:50,r:"data.existing_shuttle.timer",p:[13,5,482]}," ",{p:[16,5,580],t:7,e:"ui-button",a:{action:"jump_to",params:['{"type": "mobile", "id": "',{t:2,r:"data.existing_shuttle.id",p:[17,41,649]},'"}']},f:["Jump To"]}]}],n:50,r:"data.existing_shuttle",p:[10,1,328]},{t:4,f:[{p:[24,3,778],t:7,e:"ui-display",a:{title:"Existing Shuttle: None"}}],n:50,x:{r:["data.existing_shuttle"],s:"!_0"},p:[23,1,744]},{p:[27,1,847],t:7,e:"ui-button",a:{action:"preview",params:['{"shuttle_id": "',{t:2,r:"data.selected.shuttle_id",p:[28,27,902]},'"}']},f:["Preview"]}," ",{p:[31,1,961],t:7,e:"ui-button",a:{action:"load",params:['{"shuttle_id": "',{t:2,r:"data.selected.shuttle_id",p:[32,27,1013]},'"}'],style:"danger"},f:["Load"]}," ",{p:[37,1,1089],t:7,e:"ui-display",a:{title:"Status"},f:[]}]},e.exports=a.extend(r.exports)},{205:205}],316:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,27],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[2,22,46]}," (",{t:2,r:"id",p:[2,32,56]},")"]},f:[{t:2,r:"status",p:[3,5,71]}," ",{t:4,f:["(",{t:2,r:"timeleft",p:[5,8,109]},")"],n:50,r:"timer",p:[4,5,87]}," ",{p:[7,5,141],t:7,e:"ui-button",a:{action:"jump_to",params:['{"type": "mobile", "id": "',{t:2,r:"id",p:[7,67,203]},'"}']},f:["Jump To"]}," ",{p:[10,5,252],t:7,e:"ui-button",a:{action:"fast_travel",params:['{"id": "',{t:2,r:"id",p:[10,53,300]},'"}'],state:[{t:2,x:{r:["can_fast_travel"],s:'_0?null:"disabled"'},p:[10,70,317]}]},f:["Fast Travel"]}]}],n:52,r:"data.shuttles",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{205:205}],317:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.templates_tabs",p:[1,16,15]}]},f:[{t:4,f:[{p:[3,5,74],t:7,e:"tab",a:{name:[{t:2,r:"port_id",p:[3,16,85]}]},f:[{t:4,f:[{p:[5,9,135],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[5,28,154]}]},f:[{t:4,f:[{p:[7,13,209],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"description",p:[7,45,241]}]}],n:50,r:"description",p:[6,11,176]}," ",{t:4,f:[{p:[10,13,333],t:7,e:"ui-section",a:{label:"Admin Notes"},f:[{t:2,r:"admin_notes",p:[10,45,365]}]}],n:50,r:"admin_notes",p:[9,11,300]}," ",{p:[13,11,426],t:7,e:"ui-button",a:{action:"select_template",params:['{"shuttle_id": "',{t:2,r:"shuttle_id",p:[14,37,499]},'"}'],state:[{t:2,x:{r:["data.selected.shuttle_id","shuttle_id"],s:'_0==_1?"selected":null'},p:[15,20,537]}]},f:[{t:2,x:{r:["data.selected.shuttle_id","shuttle_id"],s:'_0==_1?"Selected":"Select"'},p:[17,13,630]}]}]}],n:52,r:"templates",p:[4,7,106]}]}],n:52,r:"data.templates",p:[2,3,44]}]}]},e.exports=a.extend(r.exports)},{205:205}],318:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[2,3,33],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[3,3,66],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[3,9,72]}]}]}," ",{t:4,f:[{p:[6,5,186],t:7,e:"ui-section",a:{label:"State"},f:[{p:[7,7,220],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.statstate",p:[7,20,233]}]},f:[{t:2,r:"data.occupant.stat",p:[7,49,262]}]}]}," ",{p:[9,5,315],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[10,7,350],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[10,20,363]}],max:[{t:2,r:"data.occupant.maxHealth",p:[10,54,397]}],value:[{t:2,r:"data.occupant.health",p:[10,90,433]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[11,16,475]}]},f:[{t:2,x:{r:["adata.occupant.health"],s:"Math.round(_0)"},p:[11,68,527]}]}]}," ",{t:4,f:[{p:[14,7,764],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[14,26,783]}]},f:[{p:[15,9,804],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[15,30,825]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[15,66,861]}],state:"bad"},f:[{t:2,x:{r:["type","adata.occupant"],s:"Math.round(_1[_0])"},p:[15,103,898]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[13,5,598]}," ",{p:[18,5,985],t:7,e:"ui-section",a:{label:"Cells"},f:[{p:[19,9,1021],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"bad":"good"'},p:[19,22,1034]}]},f:[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"Damaged":"Healthy"'},p:[19,68,1080]}]}]}," ",{p:[21,5,1163],t:7,e:"ui-section",a:{label:"Brain"},f:[{p:[22,9,1199],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"bad":"good"'},p:[22,22,1212]}]},f:[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"Abnormal":"Healthy"'},p:[22,68,1258]}]}]}," ",{p:[24,5,1342],t:7,e:"ui-section",a:{label:"Bloodstream"},f:[{t:4,f:[{p:[26,11,1429],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,1)"},p:[26,54,1472]}," units of ",{t:2,r:"name",p:[26,89,1507]}]},{p:[26,104,1522],t:7,e:"br"}],n:52,r:"adata.occupant.reagents",p:[25,9,1384]},{t:4,n:51,f:[{p:[28,11,1557],t:7,e:"span",a:{"class":"good"},f:["Pure"]}],r:"adata.occupant.reagents"}]}],n:50,r:"data.occupied",p:[5,3,159]}]}," ",{p:[33,1,1653],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[34,2,1685],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[35,5,1716],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"unlock":"lock"'},p:[35,22,1733]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Open":"Closed"'},p:[35,71,1782]}]}]}," ",{p:[37,3,1847],t:7,e:"ui-section",a:{label:"Inject"},f:[{t:4,f:[{p:[39,7,1908],t:7,e:"ui-button",a:{icon:"flask",state:[{t:2,x:{r:["data.occupied","allowed"],s:'_0&&_1?null:"disabled"'},p:[39,38,1939]}],action:"inject",params:['{"chem": "',{t:2,r:"id",p:[39,122,2023]},'"}']},f:[{t:2,r:"name",p:[39,132,2033]}]},{p:[39,152,2053],t:7,e:"br"}],n:52,r:"data.chems",p:[38,5,1880]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],319:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,25],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[2,22,44]}],labelcolor:[{t:2,r:"htmlcolor",p:[2,44,66]}],candystripe:0,right:0},f:[{p:[3,5,105],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[3,32,132],t:7,e:"span",a:{"class":[{t:2,x:{r:["status"],s:'_0=="Dead"?"bad bold":_0=="Unconscious"?"average bold":"good"'},p:[3,45,145]}]},f:[{t:2,r:"status",p:[3,132,232]}]}]}," ",{p:[4,5,268],t:7,e:"ui-section",a:{label:"Jelly"},f:[{t:2,r:"exoticblood",p:[4,31,294]}]}," ",{p:[5,5,328],t:7,e:"ui-section",a:{label:"Location"},f:[{t:2,r:"area",p:[5,34,357]}]}," ",{p:[7,5,386],t:7,e:"ui-button",a:{state:[{t:2,r:"swap_button_state",p:[8,14,411]}],action:"swap",params:['{"ref": "',{t:2,r:"ref",p:[9,38,472]},'"}']},f:[{t:4,f:["You Are Here"],n:50,x:{r:["occupied"],s:'_0=="owner"'},p:[10,7,491]},{t:4,n:51,f:[{t:4,f:["Occupied"],n:50,x:{r:["occupied"],s:'_0=="stranger"'},p:[13,9,566]},{t:4,n:51,f:["Swap"],x:{r:["occupied"],s:'_0=="stranger"'}}],x:{r:["occupied"],s:'_0=="owner"'}}]}]}],n:52,r:"data.bodies",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{205:205}],320:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{t:4,f:[{p:[4,23,82],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.drying"],s:'_0?"stop":"tint"'},p:[4,40,99]}],action:"Dry"},f:[{t:2,x:{r:["data.drying"],s:'_0?"Stop drying":"Dry"'},p:[4,88,147]}]}],n:50,r:"data.isdryer",p:[4,3,62]}]},t:7,e:"ui-display",a:{title:"Storage",button:0},f:[" ",{t:4,f:[{p:[7,3,258],t:7,e:"ui-notice",f:[{p:[8,5,275],t:7,e:"span",f:["Unfortunately, this ",{t:2,r:"data.name",p:[8,31,301]}," is empty."]}]}],n:50,x:{r:["data.contents.length"],s:"_0==0"},p:[6,1,221]},{t:4,n:51,f:[{p:[11,1,359],t:7,e:"div",a:{"class":"display tabular"},f:[{p:[12,2,391],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[13,4,425],t:7,e:"section",a:{"class":"cell bold"},f:["Item"]}," ",{p:[16,4,482],t:7,e:"section",a:{"class":"cell bold"},f:["Quantity"]}," ",{p:[19,4,543],t:7,e:"section",a:{"class":"cell bold",align:"center"},f:[{t:4,f:[{t:2,r:"data.verb",p:[20,22,608]}],n:50,r:"data.verb",p:[20,5,591]},{t:4,n:51,f:["Dispense"],r:"data.verb"}]}]}," ",{t:4,f:[{p:[24,3,703],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[25,4,737],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[26,5,765]}]}," ",{p:[28,4,793],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[29,5,835]}]}," ",{p:[31,4,865],t:7,e:"section",a:{"class":"table",alight:"right"},f:[{p:[32,5,909],t:7,e:"section",a:{"class":"cell"}}," ",{p:[33,5,947],t:7,e:"section",a:{"class":"cell"},f:[{p:[34,6,976],t:7,e:"ui-button",a:{grid:0,action:"Release",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[34,45,1015]}],params:['{ "name" : ',{t:2,r:"name",p:[34,102,1072]},', "amount" : 1 }']},f:["One"]}]}," ",{p:[38,5,1151],t:7,e:"section",a:{"class":"cell"},f:[{p:[39,6,1180],t:7,e:"ui-button",a:{grid:0,action:"Release",state:[{t:2,x:{r:["amount"],s:'(_0>1)?null:"disabled"'},p:[39,45,1219]}],params:['{ "name" : ',{t:2,r:"name",p:[39,101,1275]}," }"]},f:["Many"]}]}]}]}],n:52,r:"data.contents",p:[23,2,676]}]}],x:{r:["data.contents.length"],s:"_0==0"}}]}]},e.exports=a.extend(r.exports)},{205:205}],321:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{capacityPercentState:function(){var t=this.get("data.capacityPercent");return t>50?"good":t>15?"average":"bad"},inputState:function(){return this.get("data.capacityPercent")>=100?"good":this.get("data.inputting")?"average":"bad"},outputState:function(){return this.get("data.outputting")?"good":this.get("data.charge")>0?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[24,1,663],t:7,e:"ui-display",a:{title:"Storage"},f:[{p:[25,3,695],t:7,e:"ui-section",a:{label:"Stored Energy"},f:[{p:[26,5,735],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.capacityPercent",p:[26,38,768]}],state:[{t:2,r:"capacityPercentState",p:[26,71,801]}]},f:[{t:2,x:{r:["adata.capacityPercent"],s:"Math.fixed(_0)"},p:[26,97,827]},"%"]}]}]}," ",{p:[29,1,908],t:7,e:"ui-display",a:{title:"Input"},f:[{p:[30,3,938],t:7,e:"ui-section",a:{label:"Charge Mode"},f:[{p:[31,5,976],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"refresh":"close"'},p:[31,22,993]}],style:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"selected":null'},p:[31,74,1045]}],action:"tryinput"},f:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"Auto":"Off"'},p:[32,25,1113]}]}," [",{p:[34,6,1182],t:7,e:"span",a:{"class":[{t:2,r:"inputState",p:[34,19,1195]}]},f:[{t:2,x:{r:["data.capacityPercent","data.inputting"],s:'_0>=100?"Fully Charged":_1?"Charging":"Not Charging"'},p:[34,35,1211]}]},"]"]}," ",{p:[36,3,1335],t:7,e:"ui-section",a:{label:"Target Input"},f:[{p:[37,5,1374],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.inputLevelMax",p:[37,26,1395]}],value:[{t:2,r:"data.inputLevel",p:[37,57,1426]}]},f:[{t:2,r:"adata.inputLevel_text",p:[37,78,1447]}]}]}," ",{p:[39,3,1501],t:7,e:"ui-section",a:{label:"Adjust Input"},f:[{p:[40,5,1540],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.inputLevel"],s:'_0==0?"disabled":null'},p:[40,44,1579]}],action:"input",params:'{"target": "min"}'}}," ",{p:[41,5,1674],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.inputLevel"],s:'_0==0?"disabled":null'},p:[41,39,1708]}],action:"input",params:'{"adjust": -10000}'}}," ",{p:[42,5,1804],t:7,e:"ui-button",a:{icon:"pencil",action:"input",params:'{"target": "input"}'},f:["Set"]}," ",{p:[43,5,1894],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.inputLevel","data.inputLevelMax"],s:'_0==_1?"disabled":null'},p:[43,38,1927]}],action:"input",params:'{"adjust": 10000}'}}," ",{p:[44,5,2039],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.inputLevel","data.inputLevelMax"],s:'_0==_1?"disabled":null'},p:[44,43,2077]}],action:"input",params:'{"target": "max"}'}}]}," ",{p:[46,3,2204],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[47,3,2238],t:7,e:"span",f:[{t:2,r:"adata.inputAvailable",p:[47,9,2244]}]}]}]}," ",{p:[50,1,2308],t:7,e:"ui-display",a:{title:"Output"},f:[{p:[51,3,2339],t:7,e:"ui-section",a:{label:"Output Mode"},f:[{p:[52,5,2377],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"power-off":"close"'},p:[52,22,2394]}],style:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"selected":null'},p:[52,77,2449]}],action:"tryoutput"},f:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"On":"Off"'},p:[53,26,2519]}]}," [",{p:[55,6,2587],t:7,e:"span",a:{"class":[{t:2,r:"outputState",p:[55,19,2600]}]},f:[{t:2,x:{r:["data.outputting","data.charge"],s:'_0?"Sending":_1>0?"Not Sending":"No Charge"'},p:[55,36,2617]}]},"]"]}," ",{p:[57,3,2724],t:7,e:"ui-section",a:{label:"Target Output"},f:[{p:[58,5,2764],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.outputLevelMax",p:[58,26,2785]}],value:[{t:2,r:"data.outputLevel",p:[58,58,2817]}]},f:[{t:2,r:"adata.outputLevel_text",p:[58,80,2839]}]}]}," ",{p:[60,3,2894],t:7,e:"ui-section",a:{label:"Adjust Output"},f:[{p:[61,5,2934],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.outputLevel"],s:'_0==0?"disabled":null'},p:[61,44,2973]}],action:"output",params:'{"target": "min"}'}}," ",{p:[62,5,3070],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.outputLevel"],s:'_0==0?"disabled":null'},p:[62,39,3104]}],action:"output",params:'{"adjust": -10000}'}}," ",{p:[63,5,3202],t:7,e:"ui-button",a:{icon:"pencil",action:"output",params:'{"target": "input"}'},f:["Set"]}," ",{p:[64,5,3293],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.outputLevel","data.outputLevelMax"],s:'_0==_1?"disabled":null'},p:[64,38,3326]}],action:"output",params:'{"adjust": 10000}'}}," ",{p:[65,5,3441],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.outputLevel","data.outputLevelMax"],s:'_0==_1?"disabled":null'},p:[65,43,3479]}],action:"output",params:'{"target": "max"}'}}]}," ",{p:[67,3,3609],t:7,e:"ui-section",a:{label:"Outputting"},f:[{p:[68,3,3644],t:7,e:"span",f:[{t:2,r:"adata.outputUsed",p:[68,9,3650]}]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],322:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:["\ufeff",{t:4,f:[" ",{p:[2,2,33],t:7,e:"ui-display",a:{title:"Dispersal Tank"},f:[{p:[3,3,73],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[4,4,104],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.active"],s:'_0?"power-off":"close"'},p:[4,21,121]}],style:[{t:2,x:{r:["data.active"],s:'_0?"selected":null'},p:[5,12,174]}],state:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?null:"disabled"'},p:[6,12,223]}],action:"power"},f:[{t:2,x:{r:["data.active"],s:'_0?"On":"Off"'},p:[7,20,286]}]}]}," ",{p:[10,3,354],t:7,e:"ui-section",a:{label:"Smoke Radius Setting"},f:[{p:[11,5,401],t:7,e:"div",a:{"class":"content",style:"float:left"},f:[{p:[12,6,448],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=1?null:"disabled"'},p:[12,36,478]}],style:[{t:2,x:{r:["data.setting"],s:'_0==1?"selected":null'},p:[12,89,531]}],action:"setting",params:'{"amount": 1}'},f:["3"]}," ",{p:[13,6,634],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=2?null:"disabled"'},p:[13,36,664]}],style:[{t:2,x:{r:["data.setting"],s:'_0==2?"selected":null'},p:[13,89,717]}],action:"setting",params:'{"amount": 2}'},f:["6"]}," ",{p:[14,6,820],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=3?null:"disabled"'},p:[14,36,850]}],style:[{t:2,x:{r:["data.setting"],s:'_0==3?"selected":null'},p:[14,89,903]}],action:"setting",params:'{"amount": 3}'},f:["9"]}," ",{p:[15,6,1006],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=4?null:"disabled"'},p:[15,36,1036]}],style:[{t:2,x:{r:["data.setting"],s:'_0==4?"selected":null'},p:[15,89,1089]}],action:"setting",params:'{"amount": 4}'},f:["12"]}," ",{p:[16,6,1193],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=5?null:"disabled"'},p:[16,36,1223]}],style:[{t:2,x:{r:["data.setting"],s:'_0==5?"selected":null'},p:[16,89,1276]}],action:"setting",params:'{"amount": 5}'},f:["15"]}]}]}," ",{p:[19,3,1410],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[21,6,1476],t:7,e:"span",f:[{t:2,x:{r:["adata.TankCurrentVolume"],s:"Math.round(_0)"},p:[21,12,1482]},"/",{t:2,r:"data.TankMaxVolume",p:[21,52,1522]}," Units"]}," ",{p:[22,6,1564],t:7,e:"br"}," ",{p:[23,5,1575],t:7,e:"br"}," ",{t:4,f:[{p:[25,7,1623],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[25,50,1666]}," units of ",{t:2,r:"name",p:[25,85,1701]}]},{p:[25,100,1716],t:7,e:"br"}],n:52,r:"adata.TankContents",p:[24,6,1587]}],n:50,r:"data.isTankLoaded",p:[20,4,1444]},{t:4,n:51,f:[{p:[28,6,1757],t:7,e:"span",a:{"class":"bad"},f:["Tank Empty"]}],r:"data.isTankLoaded"}," ",{p:[30,4,1809],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?"Eject":"Close"'},p:[30,21,1826]}],style:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?"selected":null'},p:[31,12,1881]}],state:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?null:"disabled"'},p:[32,12,1936]}],action:"purge"},f:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?"Purge Contents":"No chemicals detected"'},p:[33,20,1999]}]}]}]}],n:50,x:{r:["data.screen"],s:'_0=="home"'},p:[1,2,1]}]},e.exports=a.extend(r.exports)},{205:205}],323:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,3,31],t:7,e:"ui-section",a:{label:"Generated Power"},f:[{t:2,x:{r:["adata.generated"],s:"Math.round(_0)"},p:[3,5,73]},"W"]}," ",{p:[5,3,126],t:7,e:"ui-section",a:{label:"Orientation"},f:[{p:[6,5,164],t:7,e:"span",f:[{t:2,x:{r:["adata.angle"],s:"Math.round(_0)"},p:[6,11,170]},"° (",{t:2,r:"data.direction",p:[6,45,204]},")"]}]}," ",{p:[8,3,251],t:7,e:"ui-section",a:{label:"Adjust Angle"},f:[{p:[9,5,290],t:7,e:"ui-button",a:{icon:"step-backward",action:"angle",params:'{"adjust": -15}'},f:["15°"]}," ",{p:[10,5,387],t:7,e:"ui-button",a:{icon:"backward",action:"angle",params:'{"adjust": -5}'},f:["5°"]}," ",{p:[11,5,477],t:7,e:"ui-button",a:{icon:"forward",action:"angle",params:'{"adjust": 5}'},f:["5°"]}," ",{p:[12,5,565],t:7,e:"ui-button",a:{icon:"step-forward",action:"angle",params:'{"adjust": 15}'},f:["15°"]}]}]}," ",{p:[15,1,687],t:7,e:"ui-display",a:{title:"Tracking"},f:[{p:[16,3,720],t:7,e:"ui-section",a:{label:"Tracker Mode"},f:[{p:[17,5,759],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.tracking_state"],s:'_0==0?"selected":null'},p:[17,36,790]}],action:"tracking",params:'{"mode": 0}'},f:["Off"]}," ",{p:[19,5,907],t:7,e:"ui-button",a:{icon:"clock-o",state:[{t:2,x:{r:["data.tracking_state"],s:'_0==1?"selected":null'},p:[19,38,940]}],action:"tracking",params:'{"mode": 1}'},f:["Timed"]}," ",{p:[21,5,1059],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.connected_tracker","data.tracking_state"],s:'_0?_1==2?"selected":null:"disabled"'},p:[21,38,1092]}],action:"tracking",params:'{"mode": 2}'},f:["Auto"]}]}," ",{p:[24,3,1262],t:7,e:"ui-section",a:{label:"Tracking Rate"},f:[{p:[25,3,1300],t:7,e:"span",f:[{t:2,x:{r:["adata.tracking_rate"],s:"Math.round(_0)"},p:[25,9,1306]},"°/h (",{t:2,r:"data.rotating_way",p:[25,53,1350]},")"]}]}," ",{p:[27,3,1399],t:7,e:"ui-section",a:{label:"Adjust Rate"},f:[{p:[28,5,1437],t:7,e:"ui-button",a:{icon:"fast-backward",action:"rate",params:'{"adjust": -180}'},f:["180°"]}," ",{p:[29,5,1535],t:7,e:"ui-button",a:{icon:"step-backward",action:"rate",params:'{"adjust": -30}'},f:["30°"]}," ",{p:[30,5,1631],t:7,e:"ui-button",a:{icon:"backward",action:"rate",params:'{"adjust": -5}'},f:["5°"]}," ",{p:[31,5,1720],t:7,e:"ui-button",a:{icon:"forward",action:"rate",params:'{"adjust": 5}'},f:["5°"]}," ",{p:[32,5,1807],t:7,e:"ui-button",a:{icon:"step-forward",action:"rate",params:'{"adjust": 30}'},f:["30°"]}," ",{p:[33,5,1901],t:7,e:"ui-button",a:{icon:"fast-forward",action:"rate",params:'{"adjust": 180}'},f:["180°"]}]}]}," ",{p:{button:[{p:[38,5,2088],t:7,e:"ui-button",a:{icon:"refresh",action:"refresh"},f:["Refresh"]}]},t:7,e:"ui-display",a:{title:"Devices",button:0},f:[" ",{p:[40,2,2169],t:7,e:"ui-section",a:{label:"Solar Tracker"},f:[{p:[41,5,2209],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected_tracker"],s:'_0?"good":"bad"'},p:[41,18,2222]}]},f:[{t:2,x:{r:["data.connected_tracker"],s:'_0?"":"Not "'},p:[41,63,2267]},"Found"]}]}," ",{p:[43,2,2338],t:7,e:"ui-section",a:{label:"Solar Panels"},f:[{p:[44,3,2375],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected_panels"],s:'_0?"good":"bad"'},p:[44,16,2388]}]},f:[{t:2,x:{r:["adata.connected_panels"],s:"Math.round(_0)"},p:[44,60,2432]}," Panels Connected"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],324:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{t:4,f:[{p:[4,7,87],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.hasPowercell"],s:'_0?null:"disabled"'},p:[4,38,118]}],action:"eject"},f:["Eject"]}],n:50,r:"data.open",p:[3,5,62]}]},t:7,e:"ui-display",a:{title:"Power",button:0},f:[" ",{p:[7,3,226],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[8,5,258],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[8,22,275]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[9,14,326]}],state:[{t:2,x:{r:["data.hasPowercell"],s:'_0?null:"disabled"'},p:[9,54,366]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[10,22,431]}]}]}," ",{p:[12,3,490],t:7,e:"ui-section",a:{label:"Cell"},f:[{t:4,f:[{p:[14,7,554],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.powerLevel",p:[14,40,587]}]},f:[{t:2,x:{r:["adata.powerLevel"],s:"Math.fixed(_0)"},p:[14,61,608]},"%"]}],n:50,r:"data.hasPowercell",p:[13,5,521]},{t:4,n:51,f:[{p:[16,4,667],t:7,e:"span",a:{"class":"bad"},f:["No Cell"]}],r:"data.hasPowercell"}]}]}," ",{p:[20,1,744],t:7,e:"ui-display",a:{title:"Thermostat"},f:[{p:[21,3,779],t:7,e:"ui-section",a:{label:"Current Temperature"},f:[{p:[22,3,823],t:7,e:"span",f:[{t:2,x:{r:["adata.currentTemp"],s:"Math.round(_0)"},p:[22,9,829]},"°C"]}]}," ",{p:[24,2,894],t:7,e:"ui-section",a:{label:"Target Temperature"},f:[{p:[25,3,937],t:7,e:"span",f:[{t:2,x:{r:["adata.targetTemp"],s:"Math.round(_0)"},p:[25,9,943]},"°C"]}]}," ",{t:4,f:[{p:[28,5,1031],t:7,e:"ui-section",a:{label:"Adjust Target"},f:[{p:[29,7,1073],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.targetTemp","data.minTemp"],s:'_0>_1?null:"disabled"'},p:[29,46,1112]}],action:"target",params:'{"adjust": -20}'}}," ",{p:[30,7,1218],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.targetTemp","data.minTemp"],s:'_0>_1?null:"disabled"'},p:[30,41,1252]}],action:"target",params:'{"adjust": -5}'}}," ",{p:[31,7,1357],t:7,e:"ui-button",a:{icon:"pencil",action:"target",params:'{"target": "input"}'},f:["Set"]}," ",{p:[32,7,1450],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.targetTemp","data.maxTemp"],s:'_0<_1?null:"disabled"'},p:[32,40,1483]}],action:"target",params:'{"adjust": 5}'}}," ",{p:[33,7,1587],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.targetTemp","data.maxTemp"],s:'_0<_1?null:"disabled"'},p:[33,45,1625]}],action:"target",params:'{"adjust": 20}'}}]}],n:50,r:"data.open",p:[27,3,1008]}," ",{p:[36,3,1754],t:7,e:"ui-section",a:{label:"Mode"},f:[{t:4,f:[{p:[38,7,1808],t:7,e:"ui-button",a:{icon:"long-arrow-up",state:[{t:2,x:{r:["data.mode"],s:'_0=="heat"?"selected":null'},p:[38,46,1847]}],action:"mode",params:'{"mode": "heat"}'},f:["Heat"]}," ",{p:[39,7,1956],t:7,e:"ui-button",a:{icon:"long-arrow-down",state:[{t:2,x:{r:["data.mode"],s:'_0=="cool"?"selected":null'},p:[39,48,1997]}],action:"mode",params:'{"mode": "cool"}'},f:["Cool"]}," ",{p:[40,7,2106],t:7,e:"ui-button",a:{icon:"arrows-v",state:[{t:2,x:{r:["data.mode"],s:'_0=="auto"?"selected":null'},p:[40,41,2140]}],action:"mode",params:'{"mode": "auto"}'},f:["Auto"]}],n:50,r:"data.open",p:[37,3,1783]},{t:4,n:51,f:[{p:[42,4,2258],t:7,e:"span",f:[{t:2,x:{r:["text","data.mode"],s:"_0.titleCase(_1)"},p:[42,10,2264]}]}],r:"data.open"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],325:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:{button:[{p:[4,8,97],t:7,e:"ui-button",a:{action:"jump",params:['{"name" : ',{t:2,r:"name",p:[4,51,140]},"}"]},f:["Jump"]}," ",{p:[7,9,195],t:7,e:"ui-button",a:{action:"spawn",params:['{"name" : ',{t:2,r:"name",p:[7,53,239]},"}"]},f:["Spawn"]}]},t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[2,22,46]}],button:0},f:[" ",{p:[11,3,308],t:7,e:"ui-section",a:{label:"Description"},f:[{p:[12,5,346],t:7,e:"span",f:[{t:3,r:"desc",p:[12,11,352]}]}]}," ",{p:[14,3,390],t:7,e:"ui-section",a:{label:"Spawners left"},f:[{p:[15,5,430],t:7,e:"span",f:[{t:2,r:"amount_left",p:[15,11,436]}]}]}]}],n:52,r:"data.spawners",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{205:205}],326:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,31],t:7,e:"ui-display",a:{title:[{t:2,r:"class",p:[2,22,50]}," Alarms"]},f:[{p:[3,5,74],t:7,e:"ul",f:[{t:4,f:[{p:[5,9,107],t:7,e:"li",f:[{t:2,r:".",p:[5,13,111]}]}],n:52,r:".",p:[4,7,86]},{t:4,n:51,f:[{p:[7,9,147],t:7,e:"li",f:["System Nominal"]}],r:"."}]}]}],n:52,i:"class",r:"data.alarms",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{205:205}],327:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,42],t:7,e:"ui-notice",f:[{p:[3,5,59],t:7,e:"span",f:["Biological entity detected in contents. Please remove."]}]}],n:50,x:{r:["data.occupied","data.safeties"],s:"_0&&_1"},p:[1,1,0]},{t:4,f:[{p:[7,3,179],t:7,e:"ui-notice",f:[{p:[8,5,196],t:7,e:"span",f:["Contents are being disinfected. Please wait."]}]}],n:50,r:"data.uv_active",p:[6,1,153]},{t:4,n:51,f:[{p:{button:[{t:4,f:[{p:[13,25,369],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[13,42,386]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Unlock":"Lock"'},p:[13,93,437]}]}],n:50,x:{r:["data.open"],s:"!_0"},p:[13,7,351]}," ",{t:4,f:[{p:[14,27,519],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"sign-out":"sign-in"'},p:[14,44,536]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Close":"Open"'},p:[14,98,590]}]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[14,7,499]}]},t:7,e:"ui-display",a:{title:"Storage",button:0},f:[" ",{t:4,f:[{p:[17,7,692],t:7,e:"ui-notice",f:[{p:[18,9,713],t:7,e:"span",f:["Unit Locked"]}]}],n:50,r:"data.locked",p:[16,5,665]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.open"],s:"_0"},f:[{p:[21,9,793],t:7,e:"ui-section",a:{label:"Helmet"},f:[{p:[22,11,832],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.helmet"],s:'_0?"square":"square-o"'},p:[22,28,849]}],state:[{t:2,x:{r:["data.helmet"],s:'_0?null:"disabled"'},p:[22,75,896]}],action:"dispense",params:'{"item": "helmet"}'},f:[{t:2,x:{r:["data.helmet"],s:'_0||"Empty"'},p:[23,59,992]}]}]}," ",{p:[25,9,1063],t:7,e:"ui-section",a:{label:"Suit"},f:[{p:[26,11,1100],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.suit"],s:'_0?"square":"square-o"'},p:[26,28,1117]}],state:[{t:2,x:{r:["data.suit"],s:'_0?null:"disabled"'},p:[26,74,1163]}],action:"dispense",params:'{"item": "suit"}'},f:[{t:2,x:{r:["data.suit"],s:'_0||"Empty"'},p:[27,57,1255]}]}]}," ",{p:[29,9,1324],t:7,e:"ui-section",a:{label:"Mask"},f:[{p:[30,11,1361],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mask"],s:'_0?"square":"square-o"'},p:[30,28,1378]}],state:[{t:2,x:{r:["data.mask"],s:'_0?null:"disabled"'},p:[30,74,1424]}],action:"dispense",params:'{"item": "mask"}'},f:[{t:2,x:{r:["data.mask"],s:'_0||"Empty"'},p:[31,57,1516]}]}]}," ",{p:[33,9,1585],t:7,e:"ui-section",a:{label:"Storage"},f:[{p:[34,11,1625],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.storage"],s:'_0?"square":"square-o"'},p:[34,28,1642]}],state:[{t:2,x:{r:["data.storage"],s:'_0?null:"disabled"'},p:[34,77,1691]}],action:"dispense",params:'{"item": "storage"}'},f:[{t:2,x:{r:["data.storage"],s:'_0||"Empty"'},p:[35,60,1789]}]}]}]},{t:4,n:50,x:{r:["data.open"],s:"!(_0)"},f:[" ",{p:[38,7,1873],t:7,e:"ui-button",a:{icon:"recycle",state:[{t:2,x:{r:["data.occupied","data.safeties"],s:'_0&&_1?"disabled":null'},p:[38,40,1906]}],action:"uv"},f:["Disinfect"]}]}],r:"data.locked"}]}],r:"data.uv_active"}]},e.exports=a.extend(r.exports)},{205:205}],328:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,5,18],t:7,e:"ui-section",a:{label:"Dispense"},f:[{p:[3,9,57],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.plasma"],s:'_0?"square":"square-o"'},p:[3,26,74]}],state:[{t:2,x:{r:["data.plasma"],s:'_0?null:"disabled"'},p:[3,74,122]}],action:"plasma"},f:["Plasma (",{t:2,x:{r:["adata.plasma"],s:"Math.round(_0)"},p:[4,37,196]},")"]}," ",{p:[5,9,247],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.oxygen"],s:'_0?"square":"square-o"'},p:[5,26,264]}],state:[{t:2,x:{r:["data.oxygen"],s:'_0?null:"disabled"'},p:[5,74,312]}],action:"oxygen"},f:["Oxygen (",{t:2,x:{r:["adata.oxygen"],s:"Math.round(_0)"},p:[6,37,386]},")"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],329:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{tankPressureState:function(){var t=this.get("data.tankPressure");return t>=200?"good":t>=100?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[14,1,295],t:7,e:"ui-notice",f:[{p:[15,3,310],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.connected"],s:'_0?"is":"is not"'},p:[15,23,330]}," connected to a mask."]}]}," ",{p:[17,1,409],t:7,e:"ui-display",f:[{p:[18,3,425],t:7,e:"ui-section",a:{label:"Tank Pressure"},f:[{p:[19,7,467],t:7,e:"ui-bar",a:{min:"0",max:"1013",value:[{t:2,r:"data.tankPressure",p:[19,41,501]}],state:[{t:2,r:"tankPressureState",p:[20,16,540]}]},f:[{t:2,x:{r:["adata.tankPressure"],s:"Math.round(_0)"},p:[20,39,563]}," kPa"]}]}," ",{p:[22,3,631],t:7,e:"ui-section",a:{label:"Release Pressure"},f:[{p:[23,5,674],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.minReleasePressure",p:[23,18,687]}],max:[{t:2,r:"data.maxReleasePressure",p:[23,52,721]}],value:[{t:2,r:"data.releasePressure",p:[24,14,764]}]},f:[{t:2,x:{r:["adata.releasePressure"],s:"Math.round(_0)"},p:[24,40,790]}," kPa"]}]}," ",{p:[26,3,861],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[27,5,906],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.releasePressure","data.defaultReleasePressure"],s:'_0!=_1?null:"disabled"'},p:[27,38,939]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[29,5,1095],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.releasePressure","data.minReleasePressure"],
-s:'_0>_1?null:"disabled"'},p:[29,36,1126]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[31,5,1273],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[32,5,1368],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.releasePressure","data.maxReleasePressure"],s:'_0<_1?null:"disabled"'},p:[32,35,1398]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],330:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,5,33],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[3,9,75],t:7,e:"span",f:[{t:2,x:{r:["adata.temperature"],s:"Math.fixed(_0,2)"},p:[3,15,81]}," K"]}]}," ",{p:[5,5,151],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[6,9,190],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.fixed(_0,2)"},p:[6,15,196]}," kPa"]}]}]}," ",{p:[9,1,276],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[10,5,311],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[11,9,347],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[11,26,364]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[11,70,408]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[12,28,469]}]}]}," ",{p:[14,5,531],t:7,e:"ui-section",a:{label:"Target Temperature"},f:[{p:[15,9,580],t:7,e:"ui-button",a:{icon:"fast-backward",style:[{t:2,x:{r:["data.target","data.min"],s:'_0==_1?"disabled":null'},p:[15,48,619]}],action:"target",params:'{"adjust": -20}'}}," ",{p:[17,9,733],t:7,e:"ui-button",a:{icon:"backward",style:[{t:2,x:{r:["data.target","data.min"],s:'_0==_1?"disabled":null'},p:[17,43,767]}],action:"target",params:'{"adjust": -5}'}}," ",{p:[19,9,880],t:7,e:"ui-button",a:{icon:"pencil",action:"target",params:'{"target": "input"}'},f:[{t:2,x:{r:["adata.target"],s:"Math.fixed(_0,2)"},p:[19,79,950]}]}," ",{p:[20,9,1003],t:7,e:"ui-button",a:{icon:"forward",style:[{t:2,x:{r:["data.target","data.max"],s:'_0==_1?"disabled":null'},p:[20,42,1036]}],action:"target",params:'{"adjust": 5}'}}," ",{p:[22,9,1148],t:7,e:"ui-button",a:{icon:"fast-forward",style:[{t:2,x:{r:["data.target","data.max"],s:'_0==_1?"disabled":null'},p:[22,47,1186]}],action:"target",params:'{"adjust": 20}'}}]}]}]},e.exports=a.extend(r.exports)},{205:205}],331:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{powerState:function(t){switch(t){case 1:return"good";default:return"bad"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[13,1,173],t:7,e:"ui-notice",f:[{p:[14,2,187],t:7,e:"ui-section",a:{label:"Reconnect"},f:[{p:[15,3,221],t:7,e:"div",a:{style:"float:right"},f:[{p:[16,4,251],t:7,e:"ui-button",a:{icon:"refresh",action:"reconnect"},f:["Reconnect"]}]}]}]}," ",{p:[20,1,359],t:7,e:"ui-display",a:{title:"Turbine Controller"},f:[{p:[21,2,401],t:7,e:"ui-section",a:{label:"Status"},f:[{t:4,f:[{p:[23,4,456],t:7,e:"span",a:{"class":"bad"},f:["Broken"]}],n:50,r:"data.broken",p:[22,3,432]},{t:4,n:51,f:[{p:[25,4,504],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.online"],s:"_0(_1)"},p:[25,17,517]}]},f:[{t:2,x:{r:["data.online","data.compressor_broke","data.turbine_broke"],s:'_0&&!(_1||_2)?"Online":"Offline"'},p:[25,46,546]}]}],r:"data.broken"}," ",{p:[27,3,656],t:7,e:"div",a:{style:"float:right"},f:[{p:[28,4,686],t:7,e:"ui-button",a:{icon:"power-off",action:"power-on",state:[{t:2,r:"data.broken",p:[28,57,739]}],style:[{t:2,x:{r:["data.online"],s:'_0?"selected":""'},p:[28,81,763]}]},f:["On"]}," ",{p:[29,4,817],t:7,e:"ui-button",a:{icon:"close",action:"power-off",state:[{t:2,r:"data.broken",p:[29,54,867]}],style:[{t:2,x:{r:["data.online"],s:'_0?"":"selected"'},p:[29,78,891]}]},f:["Off"]}]}," ",{t:4,f:[{p:[32,4,989],t:7,e:"br"}," [ ",{p:[33,6,1e3],t:7,e:"span",a:{"class":"bad"},f:["Compressor is inoperable"]}," ]"],n:50,r:"data.compressor_broke",p:[31,3,955]}," ",{t:4,f:[{p:[36,4,1097],t:7,e:"br"}," [ ",{p:[37,6,1108],t:7,e:"span",a:{"class":"bad"},f:["Turbine is inoperable"]}," ]"],n:50,r:"data.turbine_broke",p:[35,3,1066]}]}]}," ",{p:[41,1,1200],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[42,2,1230],t:7,e:"ui-section",a:{label:"Turbine Speed"},f:[{p:[43,3,1268],t:7,e:"span",f:[{t:2,x:{r:["data.broken","data.rpm"],s:'_0?"--":_1'},p:[43,9,1274]}," RPM"]}]}," ",{p:[45,2,1337],t:7,e:"ui-section",a:{label:"Internal Temp"},f:[{p:[46,3,1375],t:7,e:"span",f:[{t:2,x:{r:["data.broken","data.temp"],s:'_0?"--":_1'},p:[46,9,1381]}," K"]}]}," ",{p:[48,2,1443],t:7,e:"ui-section",a:{label:"Generated Power"},f:[{p:[49,3,1483],t:7,e:"span",f:[{t:2,x:{r:["data.broken","data.power"],s:'_0?"--":_1'},p:[49,9,1489]}]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],332:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{},oninit:function(){this.on({hover:function(t){var e=this.get("data.telecrystals");e>=t.context.params.cost&&this.set("hovered",t.context.params)},unhover:function(t){this.set("hovered")}})}}}(r),r.exports.template={v:3,t:[" ",{p:{button:[{t:4,f:[{p:[23,7,482],t:7,e:"ui-button",a:{icon:"lock",action:"lock"},f:["Lock"]}],n:50,r:"data.lockable",p:[22,5,453]}]},t:7,e:"ui-display",a:{title:"Uplink",button:0},f:[" ",{p:[26,3,568],t:7,e:"ui-section",a:{label:"Telecrystals",right:0},f:[{p:[27,5,613],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.telecrystals"],s:'_0>0?"good":"bad"'},p:[27,18,626]}]},f:[{t:2,r:"data.telecrystals",p:[27,62,670]}," TC"]}]}]}," ",{t:4,f:[{p:[31,3,764],t:7,e:"ui-display",f:[{p:[32,2,779],t:7,e:"ui-button",a:{action:"select",params:['{"category": "',{t:2,r:"name",p:[32,51,828]},'"}']},f:[{t:2,r:"name",p:[32,63,840]}]}," ",{t:4,f:[{p:[34,4,883],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[34,23,902]}],candystripe:0,right:0},f:[{p:[35,3,934],t:7,e:"ui-button",a:{tooltip:[{t:2,r:"name",p:[35,23,954]},": ",{t:2,r:"desc",p:[35,33,964]}],"tooltip-side":"left",state:[{t:2,x:{r:["data.telecrystals","hovered.cost","cost","hovered.item","name"],s:'_0<_2||(_0-_1<_2&&_3!=_4)?"disabled":null'},p:[36,12,1006]}],action:"buy",params:['{"category": "',{t:2,r:"category",p:[37,40,1165]},'", "item": ',{t:2,r:"name",p:[37,63,1188]},', "cost": ',{t:2,r:"cost",p:[37,81,1206]},"}"]},v:{hover:"hover",unhover:"unhover"},f:[{t:2,r:"cost",p:[38,43,1260]}," TC"]}]}],n:52,r:"items",p:[33,2,863]}]}],n:52,r:"data.categories",p:[30,1,735]}]},e.exports=a.extend(r.exports)},{205:205}],333:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{healthState:function(t){var e=this.get("data.vr_avatar.maxhealth");return t>e/1.5?"good":t>e/3?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[14,1,292],t:7,e:"ui-display",f:[{t:4,f:[{p:[16,3,333],t:7,e:"ui-display",a:{title:"Virtual Avatar"},f:[{p:[17,4,373],t:7,e:"ui-section",a:{label:"Name"},f:[{t:2,r:"data.vr_avatar.name",p:[18,5,404]}]}," ",{p:[20,4,450],t:7,e:"ui-section",a:{label:"Status"},f:[{t:2,r:"data.vr_avatar.status",p:[21,5,483]}]}," ",{p:[23,4,531],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[24,5,564],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.vr_avatar.maxhealth",p:[24,26,585]}],value:[{t:2,r:"adata.vr_avatar.health",p:[24,64,623]}],state:[{t:2,x:{r:["healthState","adata.vr_avatar.health"],s:"_0(_1)"},p:[24,99,658]}]},f:[{t:2,x:{r:["adata.vr_avatar.health"],s:"Math.round(_0)"},p:[24,140,699]},"/",{t:2,r:"adata.vr_avatar.maxhealth",p:[24,179,738]}]}]}]}],n:50,r:"data.vr_avatar",p:[15,2,307]},{t:4,n:51,f:[{p:[28,3,826],t:7,e:"ui-display",a:{title:"Virtual Avatar"},f:["No Virtual Avatar detected"]}],r:"data.vr_avatar"}," ",{p:[32,2,922],t:7,e:"ui-display",a:{title:"VR Commands"},f:[{p:[33,3,958],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.toggle_open"],s:'_0?"times":"plus"'},p:[33,20,975]}],action:"toggle_open"},f:[{t:2,x:{r:["data.toggle_open"],s:'_0?"Close":"Open"'},p:[34,4,1042]}," the VR Sleeper"]}," ",{t:4,f:[{p:[37,4,1144],t:7,e:"ui-button",a:{icon:"signal",action:"vr_connect"},f:["Connect to VR"]}],n:50,r:"data.isoccupant",p:[36,3,1116]}," ",{t:4,f:[{p:[42,4,1267],t:7,e:"ui-button",a:{icon:"ban",action:"delete_avatar"},f:["Delete Virtual Avatar"]}],n:50,r:"data.vr_avatar",p:[41,3,1240]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],334:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{t:4,f:[{p:[3,5,42],t:7,e:"ui-section",a:{label:[{t:2,r:"color",p:[3,24,61]},{t:2,x:{r:["wire"],s:'_0?" ("+_0+")":""'},p:[3,33,70]}],labelcolor:[{t:2,r:"color",p:[3,80,117]}],candystripe:0,right:0},f:[{p:[4,7,154],t:7,e:"ui-button",a:{action:"cut",params:['{"wire":"',{t:2,r:"color",p:[4,48,195]},'"}']},f:[{t:2,x:{r:["cut"],s:'_0?"Mend":"Cut"'},p:[4,61,208]}]}," ",{p:[5,7,252],t:7,e:"ui-button",a:{action:"pulse",params:['{"wire":"',{t:2,r:"color",p:[5,50,295]},'"}']},f:["Pulse"]}," ",{p:[6,7,333],t:7,e:"ui-button",a:{action:"attach",params:['{"wire":"',{t:2,r:"color",p:[6,51,377]},'"}']},f:[{t:2,x:{r:["attached"],s:'_0?"Detach":"Attach"'},p:[6,64,390]}]}]}],n:52,r:"data.wires",p:[2,3,16]}]}," ",{t:4,f:[{p:[11,3,508],t:7,e:"ui-display",f:[{t:4,f:[{p:[13,7,555],t:7,e:"ui-section",f:[{t:2,r:".",p:[13,19,567]}]}],n:52,r:"data.status",p:[12,5,526]}]}],n:50,r:"data.status",p:[10,1,485]}]},e.exports=a.extend(r.exports)},{205:205}],335:[function(t,e,n){(function(e){"use strict";var n=t(205),a=e.interopRequireDefault(n);t(194),t(1),t(190),t(193);var r=t(336),i=e.interopRequireDefault(r),o=t(337),s=t(191),p=t(192),u=e.interopRequireDefault(p);a["default"].DEBUG=/minified/.test(function(){}),Object.assign(Math,t(341)),window.initialize=function(e){window.tgui=window.tgui||new i["default"]({el:"#container",data:function(){var n=JSON.parse(e);return{constants:t(338),text:t(342),config:n.config,data:n.data,adata:n.data}}})};var c=document.getElementById("data"),l=c.textContent,d=c.getAttribute("data-ref");"{}"!==l&&(window.initialize(l),c.remove()),(0,o.act)(d,"tgui:initialize"),(0,s.loadCSS)("font-awesome.min.css");var f=new u["default"]("FontAwesome");f.check("").then(function(){return document.body.classList.add("icons")})["catch"](function(){return document.body.classList.add("no-icons")})}).call(this,t("babel/external-helpers"))},{1:1,190:190,191:191,192:192,193:193,194:194,205:205,336:336,337:337,338:338,341:341,342:342,"babel/external-helpers":"babel/external-helpers"}],336:[function(t,e,n){var a=t(205),r={exports:{}};!function(e){"use strict";var n=t(337),a=t(339);e.exports={components:{"ui-bar":t(206),"ui-button":t(207),"ui-display":t(208),"ui-input":t(209),"ui-linegraph":t(210),"ui-notice":t(211),"ui-section":t(213),"ui-subdisplay":t(214),"ui-tabs":t(215)},events:{enter:t(203).enter,space:t(203).space},transitions:{fade:t(204)},onconfig:function(){var e=this.get("config.interface"),n={ai_airlock:t(219),airalarm:t(220),"airalarm/back":t(221),"airalarm/modes":t(222),"airalarm/scrubbers":t(223),"airalarm/status":t(224),"airalarm/thresholds":t(225),"airalarm/vents":t(226),airlock_electronics:t(227),apc:t(228),atmos_alert:t(229),atmos_control:t(230),atmos_filter:t(231),atmos_mixer:t(232),atmos_pump:t(233),brig_timer:t(234),bsa:t(235),canister:t(236),cargo:t(237),cargo_express:t(238),cellular_emporium:t(239),chem_dispenser:t(240),chem_heater:t(241),chem_master:t(242),clockwork_slab:t(243),codex_gigas:t(244),computer_fabricator:t(245),crayon:t(246),crew:t(247),cryo:t(248),disposal_unit:t(249),dna_vault:t(250),dogborg_sleeper:t(251),eightball:t(252),emergency_shuttle_console:t(253),engraved_message:t(254),error:t(255),"exofab - Copia":t(256),exonet_node:t(257),firealarm:t(258),gps:t(259),gulag_console:t(260),gulag_item_reclaimer:t(261),holodeck:t(262),implantchair:t(263),intellicard:t(264),keycard_auth:t(265),labor_claim_console:t(266),language_menu:t(267),launchpad_remote:t(268),mech_bay_power_console:t(269),mulebot:t(270),ntnet_relay:t(271),ntos_ai_restorer:t(272),ntos_card:t(273),ntos_configuration:t(274),ntos_file_manager:t(275),ntos_main:t(276),ntos_net_chat:t(277),ntos_net_dos:t(278),ntos_net_downloader:t(279),ntos_net_monitor:t(280),ntos_net_transfer:t(281),ntos_power_monitor:t(282),ntos_revelation:t(283),ntos_station_alert:t(284),ntos_supermatter_monitor:t(285),ntosheader:t(286),nuclear_bomb:t(287),operating_computer:t(288),ore_redemption_machine:t(289),pandemic:t(290),personal_crafting:t(291),portable_pump:t(292),portable_scrubber:t(293),power_monitor:t(294),radio:t(295),rdconsole:t(296),"rdconsole/circuit":t(297),"rdconsole/designview":t(298),"rdconsole/destruct":t(299),"rdconsole/diskopsdesign":t(300),"rdconsole/diskopstech":t(301),"rdconsole/nodeview":t(302),"rdconsole/protolathe":t(303),"rdconsole/rdheader":t(304),"rdconsole/settings":t(305),"rdconsole/techweb":t(306),reagentgrinder:t(307),rpd:t(308),"rpd/colorsel":t(309),"rpd/dirsel":t(310),sat_control:t(311),scp_294:t(312),scrubbing_types:t(313),shuttle_manipulator:t(314),"shuttle_manipulator/modification":t(315),"shuttle_manipulator/status":t(316),"shuttle_manipulator/templates":t(317),sleeper:t(318),slime_swap_body:t(319),smartvend:t(320),smes:t(321),smoke_machine:t(322),solar_control:t(323),space_heater:t(324),spawners_menu:t(325),station_alert:t(326),suit_storage_unit:t(327),tank_dispenser:t(328),tanks:t(329),thermomachine:t(330),turbine_computer:t(331),uplink:t(332),vr_sleeper:t(333),wires:t(334)};e in n?this.components["interface"]=n[e]:this.components["interface"]=n.error},oninit:function(){this.observe("config.style",function(t,e,n){t&&document.body.classList.add(t),e&&document.body.classList.remove(e)})},oncomplete:function(){if(this.get("config.locked")){var t=(0,a.lock)(window.screenLeft,window.screenTop),e=t.x,r=t.y;(0,n.winset)(this.get("config.window"),"pos",e+","+r)}(0,n.winset)("mapwindow.map","focus",!0)}}}(r),r.exports.template={v:3,t:[" "," "," "," ",{p:[56,1,1874],t:7,e:"titlebar",f:[{t:3,r:"config.title",p:[56,11,1884]}]}," ",{p:[57,1,1915],t:7,e:"main",f:[{p:[58,3,1925],t:7,e:"warnings"}," ",{p:[59,3,1940],t:7,e:"interface"}]}," ",{t:4,f:[{p:[62,3,1990],t:7,e:"resize"}],n:50,r:"config.titlebar",p:[61,1,1963]}]},r.exports.components=r.exports.components||{};var i={warnings:t(218),titlebar:t(217),resize:t(212)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{203:203,204:204,205:205,206:206,207:207,208:208,209:209,210:210,211:211,212:212,213:213,214:214,215:215,217:217,218:218,219:219,220:220,221:221,222:222,223:223,224:224,225:225,226:226,227:227,228:228,229:229,230:230,231:231,232:232,233:233,234:234,235:235,236:236,237:237,238:238,239:239,240:240,241:241,242:242,243:243,244:244,245:245,246:246,247:247,248:248,249:249,250:250,251:251,252:252,253:253,254:254,255:255,256:256,257:257,258:258,259:259,260:260,261:261,262:262,263:263,264:264,265:265,266:266,267:267,268:268,269:269,270:270,271:271,272:272,273:273,274:274,275:275,276:276,277:277,278:278,279:279,280:280,281:281,282:282,283:283,284:284,285:285,286:286,287:287,288:288,289:289,290:290,291:291,292:292,293:293,294:294,295:295,296:296,297:297,298:298,299:299,300:300,301:301,302:302,303:303,304:304,305:305,306:306,307:307,308:308,309:309,310:310,311:311,312:312,313:313,314:314,315:315,316:316,317:317,318:318,319:319,320:320,321:321,322:322,323:323,324:324,325:325,326:326,327:327,328:328,329:329,330:330,331:331,332:332,333:333,334:334,337:337,339:339}],337:[function(t,e,n){"use strict";function a(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return"byond://"+e+"?"+Object.keys(t).map(function(e){return o(e)+"="+o(t[e])}).join("&")}function r(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};window.location.href=a(Object.assign({src:t,action:e},n))}function i(t,e,n){var r;window.location.href=a((r={},r[t+"."+e]=n,r),"winset")}n.__esModule=!0,n.href=a,n.act=r,n.winset=i;var o=encodeURIComponent},{}],338:[function(t,e,n){"use strict";n.__esModule=!0;n.UI_INTERACTIVE=2,n.UI_UPDATE=1,n.UI_DISABLED=0,n.UI_CLOSE=-1},{}],339:[function(t,e,n){"use strict";function a(t,e){return 0>t?t=0:t+window.innerWidth>window.screen.availWidth&&(t=window.screen.availWidth-window.innerWidth),0>e?e=0:e+window.innerHeight>window.screen.availHeight&&(e=window.screen.availHeight-window.innerHeight),{x:t,y:e}}function r(t){if(t.preventDefault(),this.get("drag")){if(this.get("x")){var e=t.screenX-this.get("x")+window.screenLeft,n=t.screenY-this.get("y")+window.screenTop;if(this.get("config.locked")){var r=a(e,n);e=r.x,n=r.y}(0,s.winset)(this.get("config.window"),"pos",e+","+n)}this.set({x:t.screenX,y:t.screenY})}}function i(t,e){return t=Math.clamp(100,window.screen.width,t),e=Math.clamp(100,window.screen.height,e),{x:t,y:e}}function o(t){if(t.preventDefault(),this.get("resize")){if(this.get("x")){var e=t.screenX-this.get("x")+window.innerWidth,n=t.screenY-this.get("y")+window.innerHeight,a=i(e,n);e=a.x,n=a.y,(0,s.winset)(this.get("config.window"),"size",e+","+n)}this.set({x:t.screenX,y:t.screenY})}}n.__esModule=!0,n.lock=a,n.drag=r,n.sane=i,n.resize=o;var s=t(337)},{337:337}],340:[function(t,e,n){"use strict";function a(t,e){for(var n=t,a=Array.isArray(n),i=0,n=a?n:n[Symbol.iterator]();;){var o;if(a){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;s.textContent.toLowerCase().includes(e)?(s.style.display="",r(s,e)):s.style.display="none"}}function r(t,e){for(var n=t.queryAll("section"),a=t.query("header").textContent.toLowerCase().includes(e),r=n,i=Array.isArray(r),o=0,r=i?r:r[Symbol.iterator]();;){var s;if(i){if(o>=r.length)break;s=r[o++]}else{if(o=r.next(),o.done)break;s=o.value}var p=s;a||p.textContent.toLowerCase().includes(e)?p.style.display="":p.style.display="none"}}n.__esModule=!0,n.filterMulti=a,n.filter=r},{}],341:[function(t,e,n){"use strict";function a(t,e,n){return Math.max(t,Math.min(n,e))}function r(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return+(Math.round(t+"e"+e)+"e-"+e)}n.__esModule=!0,n.clamp=a,n.fixed=r},{}],342:[function(t,e,n){"use strict";function a(t){return t[0].toUpperCase()+t.slice(1).toLowerCase()}function r(t){return t.replace(/\w\S*/g,a)}function i(t,e){for(t=""+t;t.length1){for(var p=Array(o),u=0;o>u;u++)p[u]=arguments[u+3];n.children=p}return{$$typeof:t,type:e,key:void 0===a?null:""+a,ref:null,props:n,_owner:null}}}(),e.asyncIterator=function(t){if("function"==typeof Symbol){if(Symbol.asyncIterator){var e=t[Symbol.asyncIterator];if(null!=e)return e.call(t)}if(Symbol.iterator)return t[Symbol.iterator]()}throw new TypeError("Object is not async iterable")},e.asyncGenerator=function(){function t(t){this.value=t}function e(e){function n(t,e){return new Promise(function(n,r){var s={key:t,arg:e,resolve:n,reject:r,next:null};o?o=o.next=s:(i=o=s,a(t,e))})}function a(n,i){try{var o=e[n](i),s=o.value;s instanceof t?Promise.resolve(s.value).then(function(t){a("next",t)},function(t){a("throw",t)}):r(o.done?"return":"normal",o.value)}catch(p){r("throw",p)}}function r(t,e){switch(t){case"return":i.resolve({value:e,done:!0});break;case"throw":i.reject(e);break;default:i.resolve({value:e,done:!1})}i=i.next,i?a(i.key,i.arg):o=null}var i,o;this._invoke=n,"function"!=typeof e["return"]&&(this["return"]=void 0)}return"function"==typeof Symbol&&Symbol.asyncIterator&&(e.prototype[Symbol.asyncIterator]=function(){return this}),e.prototype.next=function(t){return this._invoke("next",t)},e.prototype["throw"]=function(t){return this._invoke("throw",t)},e.prototype["return"]=function(t){return this._invoke("return",t)},{wrap:function(t){return function(){return new e(t.apply(this,arguments))}},await:function(e){return new t(e)}}}(),e.asyncGeneratorDelegate=function(t,e){function n(n,a){return r=!0,a=new Promise(function(e){e(t[n](a))}),{done:!1,value:e(a)}}var a={},r=!1;return"function"==typeof Symbol&&Symbol.iterator&&(a[Symbol.iterator]=function(){return this}),a.next=function(t){return r?(r=!1,t):n("next",t)},"function"==typeof t["throw"]&&(a["throw"]=function(t){if(r)throw r=!1,t;return n("throw",t)}),"function"==typeof t["return"]&&(a["return"]=function(t){return n("return",t)}),a},e.asyncToGenerator=function(t){return function(){var e=t.apply(this,arguments);return new Promise(function(t,n){function a(r,i){try{var o=e[r](i),s=o.value}catch(p){return void n(p)}return o.done?void t(s):Promise.resolve(s).then(function(t){a("next",t)},function(t){a("throw",t)})}return a("next")})}},e.classCallCheck=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},e.createClass=function(){function t(t,e){for(var n=0;n=0||Object.prototype.hasOwnProperty.call(t,a)&&(n[a]=t[a]);return n},e.possibleConstructorReturn=function(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e},e.selfGlobal=void 0===t?self:t,e.set=function a(t,e,n,r){var i=Object.getOwnPropertyDescriptor(t,e);if(void 0===i){var o=Object.getPrototypeOf(t);null!==o&&a(o,e,n,r)}else if("value"in i&&i.writable)i.value=n;else{var s=i.set;void 0!==s&&s.call(r,n)}return n},e.slicedToArray=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(p){r=!0,i=p}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),e.slicedToArrayLoose=function(t,e){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t)){for(var n,a=[],r=t[Symbol.iterator]();!(n=r.next()).done&&(a.push(n.value),!e||a.length!==e););return a}throw new TypeError("Invalid attempt to destructure non-iterable instance")},e.taggedTemplateLiteral=function(t,e){return Object.freeze(Object.defineProperties(t,{raw:{value:Object.freeze(e)}}))},e.taggedTemplateLiteralLoose=function(t,e){return t.raw=e,t},e.temporalRef=function(t,e,n){if(t===n)throw new ReferenceError(e+" is not defined - temporal dead zone");return t},e.temporalUndefined={},e.toArray=function(t){return Array.isArray(t)?t:Array.from(t)},e.toConsumableArray=function(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e_1?null:"disabled"'},p:[30,36,1364]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[32,5,1511],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[33,5,1606],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.releasePressure","data.maxReleasePressure"],s:'_0<_1?null:"disabled"'},p:[33,35,1636]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}," ",{p:[36,3,1798],t:7,e:"ui-section",a:{label:"Valve"},f:[{p:[37,5,1830],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.valveOpen"],s:'_0?"unlock":"lock"'},p:[37,22,1847]}],style:[{t:2,x:{r:["data.valveOpen","data.hasHoldingTank"],s:'_0?_1?"caution":"danger":null'},p:[38,14,1901]}],action:"valve"},f:[{t:2,x:{r:["data.valveOpen"],s:'_0?"Open":"Closed"'},p:[39,22,1995]}]}]}]}," ",{t:4,f:[{p:[42,1,2090],t:7,e:"ui-display",a:{title:"Valve Toggle Timer"},f:[{t:4,f:[{p:[44,5,2155],t:7,e:"ui-section",a:{label:"Adjust Timer"},f:[{p:[45,7,2196],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.timer_is_not_default"],s:'_0?null:"disabled"'},p:[45,40,2229]}],action:"timer",params:'{"change": "reset"}'},f:["Reset"]}," ",{p:[47,7,2358],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.timer_is_not_min"],s:'_0?null:"disabled"'},p:[47,38,2389]}],action:"timer",params:'{"change": "decrease"}'},f:["Decrease"]}," ",{p:[49,7,2520],t:7,e:"ui-button",a:{icon:"pencil",state:[{t:2,x:{r:[],s:'"disabled"'},p:[49,39,2552]}],action:"timer",params:'{"change": "input"}'},f:["Set"]}," ",{p:[51,7,2637],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.timer_is_not_max"],s:'_0?null:"disabled"'},p:[51,37,2667]}],action:"timer",params:'{"change": "increase"}'},f:["Increase"]}]}],n:51,r:"data.timing",p:[43,3,2133]}," ",{p:[55,3,2833],t:7,e:"ui-section",a:{label:"Timer"},f:[{p:[56,6,2866],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"danger":"caution"'},p:[56,39,2899]}],action:"toggle_timer"},f:[{t:2,x:{r:["data.timing"],s:'_0?"On":"Off"'},p:[57,30,2969]}]}," ",{p:[59,2,3017],t:7,e:"ui-section",a:{label:"Time until Valve Toggle"},f:[{p:[60,2,3064],t:7,e:"span",f:[{t:2,x:{r:["data.timing","data.time_left","data.timer_set"],s:"_0?_1:_2"},p:[60,8,3070]}]}]}]}]}],n:50,r:"data.isPrototype",p:[41,1,2062]},{p:{button:[{t:4,f:[{p:[69,7,3277],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.valveOpen"],s:'_0?"danger":null'},p:[69,38,3308]}],action:"eject"},f:["Eject"]}],n:50,r:"data.hasHoldingTank",p:[68,5,3242]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[73,3,3442],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holdingTank.name",p:[74,4,3473]}]}," ",{p:[76,3,3519],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holdingTank.tankPressure"],s:"Math.round(_0)"},p:[77,4,3553]}," kPa"]}],n:50,r:"data.hasHoldingTank",p:[72,3,3411]},{t:4,n:51,f:[{p:[80,3,3635],t:7,e:"ui-section",f:[{p:[81,4,3652],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.hasHoldingTank"}]}]},e.exports=a.extend(r.exports)},{205:205}],237:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{tabs:function(){return Object.keys(this.get("data.supplies"))}}}}(r),r.exports.template={v:3,t:[" ",{p:[11,1,158],t:7,e:"ui-display",a:{title:"Cargo"},f:[{p:[12,3,188],t:7,e:"ui-section",a:{label:"Shuttle"},f:[{t:4,f:[{p:[14,7,270],t:7,e:"ui-button",a:{action:"send"},f:[{t:2,r:"data.location",p:[14,32,295]}]}],n:50,x:{r:["data.docked","data.requestonly"],s:"_0&&!_1"},p:[13,5,222]},{t:4,n:51,f:[{p:[16,7,346],t:7,e:"span",f:[{t:2,r:"data.location",p:[16,13,352]}]}],x:{r:["data.docked","data.requestonly"],s:"_0&&!_1"}}]}," ",{p:[19,3,410],t:7,e:"ui-section",a:{label:"Credits"},f:[{p:[20,5,444],t:7,e:"span",f:[{t:2,x:{r:["adata.points"],s:"Math.floor(_0)"},p:[20,11,450]}]}]}," ",{p:[22,3,506],t:7,e:"ui-section",a:{label:"CentCom Message"},f:[{p:[23,7,550],t:7,e:"span",f:[{t:2,r:"data.message",p:[23,13,556]}]}]}," ",{t:4,f:[{p:[26,5,644],t:7,e:"ui-section",a:{label:"Loan"},f:[{t:4,f:[{p:[28,9,716],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.away","data.docked"],s:'_0&&_1?null:"disabled"'},p:[29,17,744]}],action:"loan"},f:["Loan Shuttle"]}],n:50,x:{r:["data.loan_dispatched"],s:"!_0"},p:[27,7,677]},{t:4,n:51,f:[{p:[32,9,868],t:7,e:"span",a:{"class":"bad"},f:["Loaned to CentCom"]}],x:{r:["data.loan_dispatched"],s:"!_0"}}]}],n:50,x:{r:["data.loan","data.requestonly"],s:"_0&&!_1"},p:[25,3,600]}]}," ",{t:4,f:[{p:{button:[{p:[40,7,1066],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.cart.length"],s:'_0?null:"disabled"'},p:[40,38,1097]}],action:"clear"},f:["Clear"]}]},t:7,e:"ui-display",a:{title:"Cart",button:0},f:[" ",{t:4,f:[{p:[43,7,1222],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[44,9,1263],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[44,31,1285]}]}," ",{p:[45,9,1307],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"object",p:[45,30,1328]}]}," ",{p:[46,9,1354],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"cost",p:[46,30,1375]}," Credits"]}," ",{p:[47,9,1407],t:7,e:"div",a:{"class":"content"},f:[{p:[48,11,1440],t:7,e:"ui-button",a:{icon:"minus",action:"remove",params:['{"id": "',{t:2,r:"id",p:[48,67,1496]},'"}']}}]}]}],n:52,r:"data.cart",p:[42,5,1195]},{t:4,n:51,f:[{p:[52,7,1566],t:7,e:"span",f:["Nothing in Cart"]}],r:"data.cart"}]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[37,1,972]},{p:{button:[{t:4,f:[{p:[59,7,1735],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.requests.length"],s:'_0?null:"disabled"'},p:[59,38,1766]}],action:"denyall"},f:["Clear"]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[58,5,1702]}]},t:7,e:"ui-display",a:{title:"Requests",button:0},f:[" ",{t:4,f:[{p:[63,5,1908],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[64,7,1947],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[64,29,1969]}]}," ",{p:[65,7,1989],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"object",p:[65,28,2010]}]}," ",{p:[66,7,2034],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"cost",p:[66,28,2055]}," Credits"]}," ",{p:[67,7,2085],t:7,e:"div",a:{"class":"content"},f:["By ",{t:2,r:"orderer",p:[67,31,2109]}]}," ",{p:[68,7,2134],t:7,e:"div",a:{"class":"content"},f:["Comment: ",{t:2,r:"reason",p:[68,37,2164]}]}," ",{t:4,f:[{p:[70,9,2223],t:7,e:"div",a:{"class":"content"},f:[{p:[71,11,2256],t:7,e:"ui-button",a:{icon:"check",action:"approve",params:['{"id": "',{t:2,r:"id",p:[71,68,2313]},'"}']}}," ",{p:[72,11,2336],t:7,e:"ui-button",a:{icon:"close",action:"deny",params:['{"id": "',{t:2,r:"id",p:[72,65,2390]},'"}']}}]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[69,7,2188]}]}],n:52,r:"data.requests",p:[62,3,1879]},{t:4,n:51,f:[{p:[77,7,2473],t:7,e:"span",f:["No Requests"]}],r:"data.requests"}]}," ",{p:[80,1,2529],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"tabs",p:[80,16,2544]}]},f:[{t:4,f:[{p:[82,5,2587],t:7,e:"tab",a:{name:[{t:2,r:"name",p:[82,16,2598]}]},f:[{t:4,f:[{p:[84,9,2641],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[84,28,2660]}],candystripe:0,right:0},f:[{p:[85,11,2700],t:7,e:"ui-button",a:{tooltip:[{t:2,r:"desc",p:[85,31,2720]}],"tooltip-side":"left",action:"add",params:['{"id": "',{t:2,r:"id",p:[85,90,2779]},'"}']},f:[{t:2,r:"cost",p:[85,100,2789]}," Credits"]}]}],n:52,r:"packs",p:[83,7,2616]}]}],n:52,r:"data.supplies",p:[81,3,2558]}]}]},e.exports=a.extend(r.exports)},{205:205}],238:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{tabs:function(){return Object.keys(this.get("data.supplies"))}}}}(r),r.exports.template={v:3,t:[" ",{p:[12,1,174],t:7,e:"ui-notice",f:[{t:4,f:[{p:[14,5,220],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[15,7,263],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[15,24,280]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[15,75,331]}]}]}],n:50,r:"data.siliconUser",p:[13,3,189]},{t:4,n:51,f:[{p:[18,5,422],t:7,e:"span",f:["Swipe a QM-Level ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[18,39,456]}," this interface."]}],r:"data.siliconUser"}]}," ",{t:4,f:[{p:[23,3,568],t:7,e:"ui-display",a:{title:"Express Cargo Console"},f:[{p:[24,5,616],t:7,e:"ui-section",a:{label:"Credits"},f:[{p:[25,7,652],t:7,e:"span",f:[{t:2,x:{r:["adata.points"],s:"Math.floor(_0)"},p:[25,13,658]}]}]}," ",{p:[28,5,720],t:7,e:"ui-section",a:{label:"Notice"},f:[{p:[29,7,755],t:7,e:"span",f:[{t:2,r:"data.message",p:[29,13,761]}]}]}]}," ",{p:[32,3,824],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"tabs",p:[32,18,839]}]},f:[{t:4,f:[{p:[34,7,886],t:7,e:"tab",a:{name:[{t:2,r:"name",p:[34,18,897]}]},f:[{t:4,f:[{p:[36,11,944],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[36,30,963]}],candystripe:0,right:0},f:[{p:[37,13,1005],t:7,e:"ui-button",a:{tooltip:[{t:2,r:"desc",p:[37,33,1025]}],"tooltip-side":"left",action:"add",params:['{"id": "',{t:2,r:"id",p:[37,92,1084]},'"}']},f:[{t:2,r:"cost",p:[37,102,1094]}," Credits"]}]}],n:52,r:"packs",p:[35,9,917]}]}],n:52,r:"data.supplies",p:[33,5,855]}]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[22,1,543]}]},e.exports=a.extend(r.exports)},{205:205}],239:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Cellular Emporium",button:0},f:[{p:[2,3,49],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.can_readapt"],s:'_0?null:"disabled"'},p:[2,36,82]}],action:"readapt"},f:["Readapt"]}," ",{p:[4,3,169],t:7,e:"ui-section",a:{label:"Genetic Points Remaining",right:0},f:[{t:2,r:"data.genetic_points_remaining",p:[5,5,226]}]}]}," ",{p:[8,1,293],t:7,e:"ui-display",f:[{t:4,f:[{p:[10,3,335],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[10,22,354]}],candystripe:0,right:0},f:[{p:[11,5,388],t:7,e:"span",f:[{t:2,r:"desc",p:[11,11,394]}]}," ",{p:[12,5,415],t:7,e:"span",f:[{t:2,r:"helptext",p:[12,11,421]}]}," ",{p:[13,5,446],t:7,e:"span",f:["Cost: ",{t:2,r:"dna_cost",p:[13,17,458]}]}," ",{p:[14,5,483],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["owned","can_purchase"],s:'_0?"selected":_1?null:"disabled"'},p:[15,14,508]}],action:"evolve",params:['{"name": "',{t:2,r:"name",p:[17,25,615]},'"}']},f:[{t:2,x:{r:["owned"],s:'_0?"Evolved":"Evolve"'},p:[18,7,635]}]}]}],n:52,r:"data.abilities",p:[9,1,307]},{t:4,f:[{p:[23,3,738],t:7,e:"span",a:{"class":"warning"},f:["No abilities availible."]}],n:51,r:"data.abilities",p:[22,1,715]}]}]},e.exports=a.extend(r.exports)},{205:205}],240:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,3,31],t:7,e:"ui-section",a:{label:"Energy"},f:[{p:[3,5,64],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.maxEnergy",p:[3,26,85]}],value:[{t:2,r:"data.energy",p:[3,53,112]}]},f:[{t:2,x:{r:["adata.energy"],s:"Math.fixed(_0)"},p:[3,70,129]}," Units"]}]}]}," ",{p:[6,1,206],t:7,e:"ui-display",a:{title:"Saved Recipes",button:0},f:[{p:[7,3,251],t:7,e:"ui-section",f:[{p:[8,5,269],t:7,e:"ui-button",a:{icon:"plus",action:"add_recipe"},f:["Add Recipe"]}," ",{p:[9,2,337],t:7,e:"ui-button",a:{icon:"minus",action:"clear_recipes"},f:["Clear Recipes"]}," ",{t:4,f:[{p:[11,7,445],t:7,e:"ui-button",a:{grid:0,icon:"tint",action:"dispense_recipe",params:['{"recipe": "',{t:2,r:"contents",p:[11,80,518]},'"}']},f:[{t:2,r:"recipe_name",p:[11,96,534]}]}],n:52,r:"data.recipes",p:[10,5,415]}]}]}," ",{p:{button:[{t:4,f:[{p:[18,7,719],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.amount","."],s:'_0==_1?"selected":null'},p:[18,37,749]}],action:"amount",params:['{"target": ',{t:2,r:".",p:[18,114,826]},"}"]},f:[{t:2,r:".",p:[18,122,834]}]}],n:52,r:"data.beakerTransferAmounts",p:[17,5,675]}]},t:7,e:"ui-display",a:{title:"Dispense",button:0},f:[" ",{p:[21,3,886],t:7,e:"ui-section",f:[{t:4,f:[{p:[23,7,936],t:7,e:"ui-button",a:{grid:0,icon:"tint",action:"dispense",params:['{"reagent": "',{t:2,r:"id",p:[23,74,1003]},'"}']},f:[{t:2,r:"title",p:[23,84,1013]}]}],n:52,r:"data.chemicals",p:[22,5,904]}]}]}," ",{p:{button:[{t:4,f:[{p:[30,7,1190],t:7,e:"ui-button",a:{icon:"minus",action:"remove",params:['{"amount": ',{t:2,r:".",p:[30,66,1249]},"}"]},f:[{t:2,r:".",p:[30,74,1257]}]}],n:52,r:"data.beakerTransferAmounts",p:[29,5,1146]}," ",{p:[32,5,1295],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[32,36,1326]}],action:"eject"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[34,3,1423],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[36,7,1493],t:7,e:"span",f:[{t:2,x:{r:["adata.beakerCurrentVolume"],s:"Math.round(_0)"},p:[36,13,1499]},"/",{t:2,r:"data.beakerMaxVolume",p:[36,55,1541]}," Units"]}," ",{p:[37,7,1586],t:7,e:"br"}," ",{t:4,f:[{p:[39,9,1639],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[39,52,1682]}," units of ",{t:2,r:"name",p:[39,87,1717]}]},{p:[39,102,1732],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[38,7,1599]},{t:4,n:51,f:[{p:[41,9,1763],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[35,5,1458]},{t:4,n:51,f:[{p:[44,7,1839],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],241:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Thermostat"},f:[{p:[2,3,35],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,67],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isActive"],s:'_0?"power-off":"close"'},p:[3,22,84]}],style:[{t:2,x:{r:["data.isActive"],s:'_0?"selected":null'},p:[4,10,137]}],state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[5,10,186]}],action:"power"},f:[{t:2,x:{r:["data.isActive"],s:'_0?"On":"Off"'},p:[6,18,249]}]}]}," ",{p:[8,3,314],t:7,e:"ui-section",a:{label:"Target"},f:[{p:[9,4,346],t:7,e:"ui-button",a:{icon:"pencil",action:"temperature",params:'{"target": "input"}'},f:[{t:2,x:{r:["adata.targetTemp"],s:"Math.round(_0)"},p:[9,79,421]}," K"]}]}]}," ",{p:{button:[{p:[14,5,564],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[14,36,595]}],action:"eject"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[16,3,692],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[18,7,762],t:7,e:"span",f:["Temperature: ",{t:2,x:{r:["adata.currentTemp"],s:"Math.round(_0)"},p:[18,26,781]}," K"]}," ",{p:[19,7,831],t:7,e:"br"}," ",{t:4,f:[{p:[21,9,885],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[21,52,928]}," units of ",{t:2,r:"name",p:[21,87,963]}]},{p:[21,102,978],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[20,7,845]},{t:4,n:51,f:[{p:[23,9,1009],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[17,5,727]},{t:4,n:51,f:[{p:[26,7,1085],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],242:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,32],t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[{p:[3,3,70],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"Eject":"close"'},p:[3,20,87]}],style:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"selected":null'},p:[4,11,143]}],state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[5,11,199]}],action:"eject"},f:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"Eject":"No beaker"'},p:[7,5,268]}]}," ",{p:[10,3,340],t:7,e:"ui-section",f:[{t:4,f:[{t:4,f:[{p:[13,6,426],t:7,e:"ui-section",a:{label:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[13,25,445]}," units of ",{t:2,r:"name",p:[13,60,480]}],nowrap:0},f:[{p:[14,7,505],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{p:[15,8,555],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[15,61,608]},'", "amount": 1}']},f:["1"]}," ",{p:[16,8,653],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[16,61,706]},'", "amount": 5}']},f:["5"]}," ",{p:[17,8,751],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[17,61,804]},'", "amount": 10}']},f:["10"]}," ",{p:[18,8,851],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[18,61,904]},'", "amount": 1000}']},f:["All"]}," ",{p:[19,8,954],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[19,61,1007]},'", "amount": -1}']},f:["Custom"]}," ",{p:[20,8,1058],t:7,e:"ui-button",a:{action:"analyze",params:['{"id": "',{t:2,r:"id",p:[20,52,1102]},'"}']},f:["Analyze"]}]}]}],n:52,r:"data.beakerContents",p:[12,5,390]},{t:4,n:51,f:[{p:[24,5,1184],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"data.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[11,4,357]},{t:4,n:51,f:[{p:[27,5,1255],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}," ",{p:[32,2,1343],t:7,e:"ui-display",a:{title:"Buffer"},f:[{p:[33,3,1374],t:7,e:"ui-button",a:{action:"toggleMode",state:[{t:2,x:{r:["data.mode"],s:'_0?null:"selected"'},p:[33,41,1412]}]},f:["Destroy"]}," ",{p:[34,3,1470],t:7,e:"ui-button",a:{action:"toggleMode",state:[{t:2,x:{r:["data.mode"],s:'_0?"selected":null'},p:[34,41,1508]}]},f:["Transfer to Beaker"]}," ",{p:[35,3,1577],t:7,e:"ui-section",f:[{t:4,f:[{p:[37,5,1629],t:7,e:"ui-section",a:{label:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[37,24,1648]}," units of ",{t:2,r:"name",p:[37,59,1683]}],nowrap:0},f:[{p:[38,6,1707],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{p:[39,7,1756],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[39,62,1811]},'", "amount": 1}']},f:["1"]}," ",{p:[40,7,1855],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[40,62,1910]},'", "amount": 5}']},f:["5"]}," ",{p:[41,7,1954],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[41,62,2009]},'", "amount": 10}']},f:["10"]}," ",{p:[42,7,2055],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[42,62,2110]},'", "amount": 1000}']},f:["All"]}," ",{p:[43,7,2159],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[43,62,2214]},'", "amount": -1}']},f:["Custom"]}," ",{p:[44,7,2264],t:7,e:"ui-button",a:{action:"analyze",params:['{"id": "',{t:2,r:"id",p:[44,51,2308]},'"}']},f:["Analyze"]}]}]}],n:52,r:"data.bufferContents",p:[36,4,1594]}]}]}," ",{t:4,f:[{p:[52,3,2444],t:7,e:"ui-display",a:{title:"Pills, Bottles and Patches"},f:[{t:4,f:[{p:[54,5,2534],t:7,e:"ui-button",a:{action:"ejectp",state:[{t:2,x:{r:["data.isPillBottleLoaded"],s:'_0?null:"disabled"'},p:[54,39,2568]}]},f:[{t:2,x:{r:["data.isPillBottleLoaded"],s:'_0?"Eject":"No Pill bottle loaded"'},p:[54,88,2617]}]}," ",{p:[55,5,2698],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.pillBotContent",p:[55,27,2720]},"/",{t:2,r:"data.pillBotMaxContent",p:[55,51,2744]}]}],n:50,r:"data.isPillBottleLoaded",p:[53,4,2497]},{t:4,n:51,f:[{p:[57,5,2796],t:7,e:"span",a:{"class":"average"},f:["No Pillbottle"]}],r:"data.isPillBottleLoaded"}," ",{p:[60,4,2860],t:7,e:"br"}," ",{p:[61,4,2870],t:7,e:"br"}," ",{p:[62,4,2880],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[62,63,2939]}]},f:["Create Pill (max 50µ)"]}," ",{p:[63,4,3023],t:7,e:"br"}," ",{p:[64,4,3033],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[64,63,3092]}]},f:["Create Multiple Pills"]}," ",{p:[65,4,3176],t:7,e:"br"}," ",{p:[66,4,3186],t:7,
+e:"br"}," ",{p:[67,4,3196],t:7,e:"ui-button",a:{action:"createPatch",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[67,64,3256]}]},f:["Create Patch (max 40µ)"]}," ",{p:[68,4,3341],t:7,e:"br"}," ",{p:[69,4,3351],t:7,e:"ui-button",a:{action:"createPatch",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[69,64,3411]}]},f:["Create Multiple Patches"]}," ",{p:[70,4,3497],t:7,e:"br"}," ",{p:[71,4,3507],t:7,e:"br"}," ",{p:[72,4,3517],t:7,e:"ui-button",a:{action:"createBottle",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[72,65,3578]}]},f:["Create Bottle (max 30µ)"]}," ",{p:[73,4,3664],t:7,e:"br"}," ",{p:[74,4,3674],t:7,e:"ui-button",a:{action:"createBottle",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[74,65,3735]}]},f:["Dispense Buffer to Bottles"]}]}],n:50,x:{r:["data.condi"],s:"!_0"},p:[51,2,2421]},{t:4,n:51,f:[{p:[79,3,3857],t:7,e:"ui-display",a:{title:"Condiments bottles and packs"},f:[{p:[80,4,3912],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[80,63,3971]}]},f:["Create Pack (max 10µ)"]}," ",{p:[81,4,4055],t:7,e:"br"}," ",{p:[82,4,4065],t:7,e:"br"}," ",{p:[83,4,4075],t:7,e:"ui-button",a:{action:"createBottle",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[83,65,4136]}]},f:["Create Bottle (max 50µ)"]}]}],x:{r:["data.condi"],s:"!_0"}}],n:50,x:{r:["data.screen"],s:'_0=="home"'},p:[1,1,0]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.screen"],s:'_0=="analyze"'},f:[{p:[87,2,4284],t:7,e:"ui-display",a:{title:[{t:2,r:"data.analyzeVars.name",p:[87,20,4302]}]},f:[{p:[88,3,4333],t:7,e:"span",a:{"class":"highlight"},f:["Description:"]}," ",{p:[89,3,4381],t:7,e:"span",a:{"class":"content",style:"float:center"},f:[{t:2,r:"data.analyzeVars.description",p:[89,46,4424]}]}," ",{p:[90,3,4467],t:7,e:"br"}," ",{p:[91,3,4476],t:7,e:"span",a:{"class":"highlight"},f:["Color:"]}," ",{p:[92,3,4518],t:7,e:"span",a:{style:["color: ",{t:2,r:"data.analyzeVars.color",p:[92,23,4538]},"; background-color: ",{t:2,r:"data.analyzeVars.color",p:[92,69,4584]}]},f:[{t:2,r:"data.analyzeVars.color",p:[92,97,4612]}]}," ",{p:[93,3,4649],t:7,e:"br"}," ",{p:[94,3,4658],t:7,e:"span",a:{"class":"highlight"},f:["State:"]}," ",{p:[95,3,4700],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.state",p:[95,25,4722]}]}," ",{p:[96,3,4759],t:7,e:"br"}," ",{p:[97,3,4768],t:7,e:"span",a:{"class":"highlight"},f:["Metabolization Rate:"]}," ",{p:[98,3,4824],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.metaRate",p:[98,25,4846]},"µ/minute"]}," ",{p:[99,3,4894],t:7,e:"br"}," ",{p:[100,3,4903],t:7,e:"span",a:{"class":"highlight"},f:["Overdose Threshold:"]}," ",{p:[101,3,4958],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.overD",p:[101,25,4980]}]}," ",{p:[102,3,5017],t:7,e:"br"}," ",{p:[103,3,5026],t:7,e:"span",a:{"class":"highlight"},f:["Addiction Threshold:"]}," ",{p:[104,3,5082],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.addicD",p:[104,25,5104]}]}," ",{p:[105,3,5142],t:7,e:"br"}," ",{p:[106,3,5151],t:7,e:"br"}," ",{p:[107,3,5160],t:7,e:"ui-button",a:{action:"goScreen",params:'{"screen": "home"}'},f:["Back"]}]}]}],x:{r:["data.screen"],s:'_0=="home"'}}]},e.exports=a.extend(r.exports)},{205:205}],243:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-button",a:{action:"toggle"},f:[{t:2,x:{r:["data.recollection"],s:'_0?"Recital":"Recollection"'},p:[2,30,43]}]}]}," ",{t:4,f:[{p:[5,3,149],t:7,e:"ui-display",f:[{t:3,r:"data.rec_text",p:[6,3,165]}," ",{t:4,f:[{p:[8,4,231],t:7,e:"br"},{p:[8,8,235],t:7,e:"ui-button",a:{action:"rec_category",params:['{"category": "',{t:2,r:"name",p:[8,63,290]},'"}']},f:[{t:3,r:"name",p:[8,75,302]}," - ",{t:3,r:"desc",p:[8,88,315]}]}],n:52,r:"data.recollection_categories",p:[7,3,188]}," ",{t:3,r:"data.rec_section",p:[10,3,354]}," ",{t:3,r:"data.rec_binds",p:[11,3,380]}]}],n:50,r:"data.recollection",p:[4,1,120]},{t:4,n:51,f:[{p:[14,2,431],t:7,e:"ui-display",a:{title:"Power",button:0},f:[{p:[15,4,469],t:7,e:"ui-section",f:[{t:3,r:"data.power",p:[16,6,488]}]}]}," ",{p:[19,2,541],t:7,e:"ui-display",f:[{p:[20,3,557],t:7,e:"ui-section",f:[{p:[21,4,574],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Driver"?"selected":null'},p:[21,22,592]}],action:"select",params:'{"category": "Driver"}'},f:["Driver"]}," ",{p:[22,4,715],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Script"?"selected":null'},p:[22,22,733]}],action:"select",params:'{"category": "Script"}'},f:["Scripts"]}," ",{p:[23,4,857],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Application"?"selected":null'},p:[23,22,875]}],action:"select",params:'{"category": "Application"}'},f:["Applications"]}," ",{p:[24,4,1014],t:7,e:"br"},{t:3,r:"data.tier_info",p:[24,8,1018]}]}," ",{p:[26,3,1059],t:7,e:"ui-section",f:[{t:3,r:"data.scripturecolors",p:[27,4,1076]}]},{p:[28,16,1119],t:7,e:"hr"}," ",{p:[29,3,1127],t:7,e:"ui-section",f:[{t:4,f:[{p:[31,4,1172],t:7,e:"div",f:[{p:[31,9,1177],t:7,e:"ui-button",a:{tooltip:[{t:3,r:"tip",p:[31,29,1197]}],"tooltip-side":"right",action:"recite",params:['{"category": "',{t:2,r:"type",p:[31,99,1267]},'"}']},f:["Recite ",{t:3,r:"required",p:[31,118,1286]}]}," ",{t:4,f:[{t:4,f:[{p:[34,6,1362],t:7,e:"ui-button",a:{action:"bind",params:['{"category": "',{t:2,r:"type",p:[34,53,1409]},'"}']},f:["Unbind ",{t:3,r:"bound",p:[34,72,1428]}]}],n:50,r:"bound",p:[33,5,1342]},{t:4,n:51,f:[{p:[36,6,1472],t:7,e:"ui-button",a:{action:"bind",params:['{"category": "',{t:2,r:"type",p:[36,53,1519]},'"}']},f:["Quickbind"]}],r:"bound"}],n:50,r:"quickbind",p:[32,6,1319]}," ",{t:3,r:"name",p:[39,6,1586]}," ",{t:3,r:"descname",p:[39,17,1597]}," ",{t:3,r:"invokers",p:[39,32,1612]}]}],n:52,r:"data.scripture",p:[30,3,1143]}]}]}],r:"data.recollection"}]},e.exports=a.extend(r.exports)},{205:205}],244:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Codex Gigas"},f:[{p:[2,2,35],t:7,e:"ui-section",f:[{t:2,r:"data.name",p:[3,3,51]}]}," ",{p:[5,5,86],t:7,e:"ui-section",a:{label:"Prefix"},f:[{p:[6,3,117],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[6,22,136]}],action:"Dark "},f:["Dark"]}," ",{p:[7,3,221],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[7,22,240]}],action:"Hellish "},f:["Hellish"]}," ",{p:[8,3,331],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[8,22,350]}],action:"Fallen "},f:["Fallen"]}," ",{p:[9,3,439],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[9,22,458]}],action:"Fiery "},f:["Fiery"]}," ",{p:[10,3,545],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[10,22,564]}],action:"Sinful "},f:["Sinful"]}," ",{p:[11,3,653],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[11,22,672]}],action:"Blood "},f:["Blood"]}," ",{p:[12,3,759],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[12,22,778]}],action:"Fluffy "},f:["Fluffy"]}]}," ",{p:[14,5,888],t:7,e:"ui-section",a:{label:"Title"},f:[{p:[15,3,918],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[15,22,937]}],action:"Lord "},f:["Lord"]}," ",{p:[16,3,1022],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[16,22,1041]}],action:"Prelate "},f:["Prelate"]}," ",{p:[17,3,1132],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[17,22,1151]}],action:"Count "},f:["Count"]}," ",{p:[18,3,1238],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[18,22,1257]}],action:"Viscount "},f:["Viscount"]}," ",{p:[19,3,1350],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[19,22,1369]}],action:"Vizier "},f:["Vizier"]}," ",{p:[20,3,1458],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[20,22,1477]}],action:"Elder "},f:["Elder"]}," ",{p:[21,3,1564],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[21,22,1583]}],action:"Adept "},f:["Adept"]}]}," ",{p:[23,5,1691],t:7,e:"ui-section",a:{label:"Name"},f:[{p:[24,3,1720],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[24,22,1739]}],action:"hal"},f:["hal"]}," ",{p:[25,3,1821],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[25,22,1840]}],action:"ve"},f:["ve"]}," ",{p:[26,3,1920],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[26,22,1939]}],action:"odr"},f:["odr"]}," ",{p:[27,3,2021],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[27,22,2040]}],action:"neit"},f:["neit"]}," ",{p:[28,3,2124],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[28,22,2143]}],action:"ci"},f:["ci"]}," ",{p:[29,3,2223],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[29,22,2242]}],action:"quon"},f:["quon"]}," ",{p:[30,3,2326],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[30,22,2345]}],action:"mya"},f:["mya"]}," ",{p:[31,3,2427],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[31,22,2446]}],action:"folth"},f:["folth"]}," ",{p:[32,3,2532],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[32,22,2551]}],action:"wren"},f:["wren"]}," ",{p:[33,3,2635],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[33,22,2654]}],action:"geyr"},f:["geyr"]}," ",{p:[34,3,2738],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[34,22,2757]}],action:"hil"},f:["hil"]}," ",{p:[35,3,2839],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[35,22,2858]}],action:"niet"},f:["niet"]}," ",{p:[36,3,2942],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[36,22,2961]}],action:"twou"},f:["twou"]}," ",{p:[37,3,3045],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[37,22,3064]}],action:"phi"},f:["phi"]}," ",{p:[38,3,3146],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[38,22,3165]}],action:"coa"},f:["coa"]}]}," ",{p:[40,5,3268],t:7,e:"ui-section",a:{label:"suffix"},f:[{p:[41,3,3299],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[41,22,3318]}],action:" the Red"},f:["the Red"]}," ",{p:[42,3,3409],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[42,22,3428]}],action:" the Soulless"},f:["the Soulless"]}," ",{p:[43,3,3529],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[43,22,3548]}],action:" the Master"},f:["the Master"]}," ",{p:[44,3,3645],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[44,22,3664]}],action:", the Lord of all things"},f:["the Lord of all things"]}," ",{p:[45,3,3786],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[45,22,3805]}],action:", Jr."},f:["jr"]}]}," ",{p:[47,5,3909],t:7,e:"ui-section",a:{label:"submit"},f:[{p:[48,3,3941],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0>=4?null:"disabled"'},p:[48,21,3959]}],action:"search"},f:["search"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],245:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[2,1,2],t:7,e:"ui-button",a:{icon:"circle",action:"clean_order"},f:["Clear Order"]},{p:[2,70,71],t:7,e:"br"},{p:[2,74,75],t:7,e:"br"}," ",{p:[3,1,81],t:7,e:"i",f:["Your new computer device you always dreamed of is just four steps away..."]},{p:[3,81,161],t:7,e:"hr"}," ",{t:4,f:[" ",{p:[5,1,223],t:7,e:"div",a:{"class":"item"},f:[{p:[6,2,244],t:7,e:"h2",f:["Step 1: Select your device type"]}," ",{p:[7,2,287],t:7,e:"ui-button",a:{icon:"calc",action:"pick_device",params:'{"pick" : "1"}'},f:["Laptop"]}," ",{p:[8,2,377],t:7,e:"ui-button",a:{icon:"calc",action:"pick_device",params:'{"pick" : "2"}'},f:["LTablet"]}]}],n:50,x:{r:["data.state"],s:"_0==0"},p:[4,1,167]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.state"],s:"_0==1"},f:[{p:[11,1,502],t:7,e:"div",a:{"class":"item"},f:[{p:[12,2,523],t:7,e:"h2",f:["Step 2: Personalise your device"]}," ",{p:[13,2,566],t:7,e:"table",f:[{p:[14,3,577],t:7,e:"tr",f:[{p:[15,4,586],t:7,e:"td",f:[{p:[15,8,590],t:7,e:"b",f:["Current Price:"]}]},{p:[16,4,616],t:7,e:"td",f:[{t:2,r:"data.totalprice",p:[16,8,620]},"C"]}]}," ",{p:[18,3,653],t:7,e:"tr",f:[{p:[19,4,663],t:7,e:"td",f:[{p:[19,8,667],t:7,e:"b",f:["Battery:"]}]},{p:[20,4,687],t:7,e:"td",f:[{p:[20,8,691],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "1"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==1?"selected":null'},p:[20,73,756]}]},f:["Standard"]}]},{p:[21,4,827],t:7,e:"td",f:[{p:[21,8,831],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "2"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==2?"selected":null'},p:[21,73,896]}]},f:["Upgraded"]}]},{p:[22,4,967],t:7,e:"td",f:[{p:[22,8,971],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "3"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==3?"selected":null'},p:[22,73,1036]}]},f:["Advanced"]}]}]}," ",{p:[24,3,1115],t:7,e:"tr",f:[{p:[25,4,1124],t:7,e:"td",f:[{p:[25,8,1128],t:7,e:"b",f:["Hard Drive:"]}]},{p:[26,4,1151],t:7,e:"td",f:[{p:[26,8,1155],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "1"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==1?"selected":null'},p:[26,67,1214]}]},f:["Standard"]}]},{p:[27,4,1282],t:7,e:"td",f:[{p:[27,8,1286],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "2"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==2?"selected":null'},p:[27,67,1345]}]},f:["Upgraded"]}]},{p:[28,4,1413],t:7,e:"td",f:[{p:[28,8,1417],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "3"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==3?"selected":null'},p:[28,67,1476]}]},f:["Advanced"]}]}]}," ",{p:[30,3,1552],t:7,e:"tr",f:[{p:[31,4,1561],t:7,e:"td",f:[{p:[31,8,1565],t:7,e:"b",f:["Network Card:"]}]},{p:[32,4,1590],t:7,e:"td",f:[{p:[32,8,1594],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "0"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==0?"selected":null'},p:[32,73,1659]}]},f:["None"]}]},{p:[33,4,1726],t:7,e:"td",f:[{p:[33,8,1730],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "1"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==1?"selected":null'},p:[33,73,1795]}]},f:["Standard"]}]},{p:[34,4,1866],t:7,e:"td",f:[{p:[34,8,1870],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "2"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==2?"selected":null'},p:[34,73,1935]}]},f:["Advanced"]}]}]}," ",{p:[36,3,2014],t:7,e:"tr",f:[{p:[37,4,2023],t:7,e:"td",f:[{p:[37,8,2027],t:7,e:"b",f:["Nano Printer:"]}]},{p:[38,4,2052],t:7,e:"td",f:[{p:[38,8,2056],t:7,e:"ui-button",a:{action:"hw_nanoprint",params:'{"print" : "0"}',state:[{t:2,x:{r:["data.hw_nanoprint"],s:'_0==0?"selected":null'},p:[38,73,2121]}]},f:["None"]}]},{p:[39,4,2190],t:7,e:"td",f:[{p:[39,8,2194],t:7,e:"ui-button",a:{action:"hw_nanoprint",params:'{"print" : "1"}',state:[{t:2,x:{r:["data.hw_nanoprint"],s:'_0==1?"selected":null'},p:[39,73,2259]}]},f:["Standard"]}]}]}," ",{p:[41,3,2340],t:7,e:"tr",f:[{p:[42,4,2349],t:7,e:"td",f:[{p:[42,8,2353],t:7,e:"b",f:["Card Reader:"]}]},{p:[43,4,2377],t:7,e:"td",f:[{p:[43,8,2381],t:7,e:"ui-button",a:{action:"hw_card",params:'{"card" : "0"}',state:[{t:2,x:{r:["data.hw_card"],s:'_0==0?"selected":null'},p:[43,67,2440]}]},f:["None"]}]},{p:[44,4,2504],t:7,e:"td",f:[{p:[44,8,2508],t:7,e:"ui-button",a:{action:"hw_card",params:'{"card" : "1"}',state:[{t:2,x:{r:["data.hw_card"],s:'_0==1?"selected":null'},p:[44,67,2567]}]},f:["Standard"]}]}]}]}," ",{t:4,f:[" ",{p:[49,4,2706],t:7,e:"table",f:[{p:[50,5,2719],t:7,e:"tr",f:[{p:[51,6,2730],t:7,e:"td",f:[{p:[51,10,2734],t:7,e:"b",f:["Processor Unit:"]}]},{p:[52,6,2763],t:7,e:"td",f:[{p:[52,10,2767],t:7,e:"ui-button",a:{action:"hw_cpu",params:'{"cpu" : "1"}',state:[{t:2,x:{r:["data.hw_cpu"],s:'_0==1?"selected":null'},p:[52,67,2824]}]},f:["Standard"]}]},{p:[53,6,2893],t:7,e:"td",f:[{p:[53,10,2897],t:7,e:"ui-button",a:{action:"hw_cpu",params:'{"cpu" : "2"}',state:[{t:2,x:{r:["data.hw_cpu"],s:'_0==2?"selected":null'},p:[53,67,2954]}]},f:["Advanced"]}]}]}," ",{p:[55,5,3033],t:7,e:"tr",f:[{p:[56,6,3044],t:7,e:"td",f:[{p:[56,10,3048],t:7,e:"b",f:["Tesla Relay:"]}]},{p:[57,6,3074],t:7,e:"td",f:[{p:[57,10,3078],t:7,e:"ui-button",a:{action:"hw_tesla",params:'{"tesla" : "0"}',state:[{t:2,x:{r:["data.hw_tesla"],s:'_0==0?"selected":null'},p:[57,71,3139]}]},f:["None"]}]},{p:[58,6,3206],t:7,e:"td",f:[{p:[58,10,3210],t:7,e:"ui-button",a:{action:"hw_tesla",params:'{"tesla" : "1"}',state:[{t:2,x:{r:["data.hw_tesla"],s:'_0==1?"selected":null'},p:[58,71,3271]}]},f:["Standard"]}]}]}]}],n:50,x:{r:["data.devtype"],s:"_0!=2"},p:[48,3,2659]}," ",{p:[62,3,3374],t:7,e:"table",f:[{p:[63,4,3386],t:7,e:"tr",f:[{p:[64,5,3396],t:7,e:"td",f:[{p:[64,9,3400],t:7,e:"b",f:["Confirm Order:"]}]},{p:[65,5,3427],t:7,e:"td",f:[{p:[65,9,3431],t:7,e:"ui-button",a:{action:"confirm_order"},f:["CONFIRM"]}]}]}]}," ",{p:[69,2,3512],t:7,e:"hr"}," ",{p:[70,2,3519],t:7,e:"b",f:["Battery"]}," allows your device to operate without external utility power source. Advanced batteries increase battery life.",{p:[70,127,3644],t:7,e:"br"}," ",{p:[71,2,3651],t:7,e:"b",f:["Hard Drive"]}," stores file on your device. Advanced drives can store more files, but use more power, shortening battery life.",{p:[71,130,3779],t:7,e:"br"}," ",{p:[72,2,3786],t:7,e:"b",f:["Network Card"]}," allows your device to wirelessly connect to stationwide NTNet network. Basic cards are limited to on-station use, while advanced cards can operate anywhere near the station, which includes the asteroid outposts.",{p:[72,233,4017],t:7,e:"br"}," ",{p:[73,2,4024],t:7,e:"b",f:["Processor Unit"]}," is critical for your device's functionality. It allows you to run programs from your hard drive. Advanced CPUs use more power, but allow you to run more programs on background at once.",{p:[73,208,4230],t:7,e:"br"}," ",{p:[74,2,4237],t:7,e:"b",f:["Tesla Relay"]}," is an advanced wireless power relay that allows your device to connect to nearby area power controller to provide alternative power source. This component is currently unavailable on tablet computers due to size restrictions.",{p:[74,246,4481],t:7,e:"br"}," ",{p:[75,2,4488],t:7,e:"b",f:["Nano Printer"]}," is device that allows for various paperwork manipulations, such as, scanning of documents or printing new ones. This device was certified EcoFriendlyPlus and is capable of recycling existing paper for printing purposes.",{p:[75,241,4727],t:7,e:"br"}," ",{p:[76,2,4734],t:7,e:"b",f:["Card Reader"]}," adds a slot that allows you to manipulate RFID cards. Please note that this is not necessary to allow the device to read your identification, it is just necessary to manipulate other cards."]}]},{t:4,n:50,x:{r:["data.state"],s:"(!(_0==1))&&(_0==2)"},f:[" ",{p:[79,2,4981],t:7,e:"h2",f:["Step 3: Payment"]}," ",{p:[80,2,5008],t:7,e:"b",f:["Your device is now ready for fabrication.."]},{p:[80,51,5057],t:7,e:"br"}," ",{p:[81,2,5064],t:7,e:"i",f:["Please ensure the required amount of credits are in the machine, then press purchase."]},{p:[81,94,5156],t:7,e:"br"}," ",{p:[82,2,5163],t:7,e:"i",f:["Current credits: ",{p:[82,22,5183],t:7,e:"b",f:[{t:2,r:"data.credits",p:[82,25,5186]},"C"]}]},{p:[82,50,5211],t:7,e:"br"}," ",{p:[83,2,5218],t:7,e:"i",f:["Total price: ",{p:[83,18,5234],t:7,e:"b",f:[{t:2,r:"data.totalprice",p:[83,21,5237]},"C"]}]},{p:[83,49,5265],t:7,e:"br"},{p:[83,53,5269],t:7,e:"br"}," ",{p:[84,2,5276],t:7,e:"ui-button",a:{action:"purchase",state:[{t:2,x:{r:["data.credits","data.totalprice"],s:'_0>=_1?null:"disabled"'},p:[84,38,5312]}]},f:["PURCHASE"]}]},{t:4,n:50,x:{r:["data.state"],s:"(!(_0==1))&&((!(_0==2))&&(_0==3))"},f:[" ",{p:[87,2,5423],t:7,e:"h2",f:["Step 4: Thank you for your purchase"]},{p:[87,46,5467],t:7,e:"br"}," ",{p:[88,2,5474],t:7,e:"b",f:["Should you experience any issues with your new device, contact your local network admin for assistance."]}]}],x:{r:["data.state"],s:"_0==0"}}]},e.exports=a.extend(r.exports)},{205:205}],246:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,1,22],t:7,e:"ui-display",f:[{p:[3,2,37],t:7,e:"ui-section",a:{label:"Cap"},f:[{p:[4,3,65],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.is_capped"],s:'_0?"power-off":"close"'},p:[4,20,82]}],style:[{t:2,x:{r:["data.is_capped"],s:'_0?null:"selected"'},p:[4,71,133]}],action:"toggle_cap"},f:[{t:2,x:{r:["data.is_capped"],s:'_0?"On":"Off"'},p:[6,4,202]}]}]}]}],n:50,r:"data.has_cap",p:[1,1,0]},{p:[10,1,288],t:7,e:"ui-display",f:[{t:4,f:[{p:[14,2,419],t:7,e:"ui-section",f:[{p:[15,3,435],t:7,e:"ui-button",a:{action:"select_colour"},f:["Select New Colour"]}]}],n:50,r:"data.can_change_colour",p:[13,1,386]}]}," ",{p:[19,1,540],t:7,e:"ui-display",a:{title:"Stencil"},f:[{t:4,f:[{p:[21,2,599],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[21,21,618]}]},f:[{t:4,f:[{p:[23,7,655],t:7,e:"ui-button",a:{action:"select_stencil",params:['{"item":"',{t:2,r:"item",p:[23,59,707]},'"}'],style:[{t:2,x:{r:["item","data.selected_stencil"],s:'_0==_1?"selected":null'},p:[24,12,731]}]},f:[{t:2,r:"item",p:[25,4,791]}]}],n:52,r:"items",p:[22,3,632]}]}],n:52,r:"data.drawables",p:[20,3,572]}]}," ",{p:[31,1,874],t:7,e:"ui-display",a:{title:"Text Mode"},f:[{p:[32,2,907],t:7,e:"ui-section",a:{label:"Current Buffer"},f:[{t:2,r:"text_buffer",p:[32,37,942]}]}," ",{p:[34,2,976],t:7,e:"ui-section",f:[{p:[34,14,988],t:7,e:"ui-button",a:{action:"enter_text"},f:["New Text"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],247:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{isHead:function(t){return t%10==0},dept_class:function(t){return 0==t?"dept-cap":t>=10&&20>t?"dept-sec":t>=20&&30>t?"dept-med":t>=30&&40>t?"dept-sci":t>=40&&50>t?"dept-eng":t>=50&&60>t?"dept-cargo":t>=200&&230>t?"dept-cent":"dept-other"},health_state:function(t,e,n,a){var r=t+e+n+a;return 0>=r?"health-5":25>=r?"health-4":50>=r?"health-3":75>=r?"health-2":"health-0"}},computed:{sorted_sensors:function(){var t=this.get("data.sensors");return t.sort(function(t,e){return t.ijob-e.ijob})}}}}(r),r.exports.css=" .health {\r\n width: 16px;\r\n height: 16px;\r\n background-color: #FFF;\r\n border: 1px solid #434343;\r\n position: relative;\r\n top: 2px;\r\n display: inline-block;\r\n }\r\n .health-5 { background-color: #17d568; }\r\n .health-4 { background-color: #2ecc71; }\r\n .health-3 { background-color: #e67e22; }\r\n .health-2 { background-color: #ed5100; }\r\n .health-1 { background-color: #e74c3c; }\r\n .health-0 { background-color: #ed2814; }\r\n\r\n .dept-cap {color : #C06616;}\r\n .dept-sec {color : #E74C3C;}\r\n .dept-med {color : #3498DB;}\r\n .dept-sci {color : #9B59B6;}\r\n .dept-eng {color : #F1C40F;}\r\n .dept-cargo {color : #F39C12;}\r\n .dept-cent {color : #00C100;}\r\n .dept-other {color: #C38312;}\r\n\r\n .oxy { color : #3498db; }\r\n .toxin { color : #2ecc71; }\r\n .burn { color : #e67e22; }\r\n .brute { color : #e74c3c; }\r\n\r\n table.crew{\r\n border-collapse: collapse;\r\n }\r\n\r\n table.crew td {\r\n padding : 0px 10px;\r\n }",r.exports.template={v:3,t:[" ",{p:[33,1,1192],t:7,e:"ui-display",f:[{p:[34,2,1207],t:7,e:"ui-section",f:[{p:[35,3,1223],t:7,e:"table",a:{"class":"crew"},f:[{p:[36,3,1247],t:7,e:"thead",f:[{p:[37,3,1258],t:7,e:"tr",f:[{p:[38,4,1267],t:7,e:"th",f:["Name"]}," ",{p:[39,4,1285],t:7,e:"th",f:["Status"]}," ",{p:[40,4,1305],t:7,e:"th",f:["Vitals"]}," ",{p:[41,4,1325],t:7,e:"th",f:["Position"]}," ",{t:4,f:[{p:[43,5,1378],t:7,e:"th",f:["Tracking"]}],n:50,r:"data.link_allowed",p:[42,4,1347]}]}]}," ",{p:[47,3,1432],t:7,e:"tbody",f:[{t:4,f:[{p:[49,4,1472],t:7,e:"tr",f:[{p:[50,5,1482],t:7,e:"td",f:[{p:[51,6,1493],t:7,e:"span",a:{"class":[{t:2,x:{r:["isHead","ijob"],s:'_0(_1)?"bold ":""'},p:[51,19,1506]},{t:2,x:{r:["dept_class","ijob"],s:"_0(_1)"},p:[51,49,1536]}]},f:[{t:2,r:"name",p:[52,7,1566]}," (",{t:2,r:"assignment",p:[52,17,1576]},") ",{p:[53,6,1598],t:7,e:"span",f:[]}]}]}," ",{p:[55,5,1621],t:7,e:"td",f:[{t:4,f:[{p:[57,7,1662],t:7,e:"span",a:{"class":["health ",{t:2,x:{r:["health_state","oxydam","toxdam","burndam","brutedam"],s:"_0(_1,_2,_3,_4)"},p:[57,27,1682]}]}}],n:50,x:{r:["oxydam"],s:"_0!=null"},p:[56,6,1632]},{t:4,n:51,f:[{t:4,f:[{p:[60,8,1790],t:7,e:"span",a:{"class":"health health-5"}}],n:50,r:"life_status",p:[59,7,1762]},{t:4,n:51,f:[{p:[62,8,1852],t:7,e:"span",a:{"class":"health health-0"}}],r:"life_status"}],x:{r:["oxydam"],s:"_0!=null"}}]}," ",{p:[66,5,1935],t:7,e:"td",f:[{t:4,f:[{p:[68,7,1976],t:7,e:"span",f:["( ",{p:[70,8,2e3],t:7,e:"span",a:{"class":"oxy"},f:[{t:2,r:"oxydam",p:[70,26,2018]}]}," / ",{p:[72,8,2054],t:7,e:"span",a:{"class":"toxin"},f:[{t:2,r:"toxdam",p:[72,28,2074]}]}," / ",{p:[74,8,2110],t:7,e:"span",a:{"class":"burn"},f:[{t:2,r:"burndam",p:[74,27,2129]}]}," / ",{p:[76,8,2166],t:7,e:"span",a:{"class":"brute"},f:[{t:2,r:"brutedam",p:[76,28,2186]}]}," )"]}],n:50,x:{r:["oxydam"],s:"_0!=null"},p:[67,6,1946]},{t:4,n:51,f:[{t:4,f:[{p:[81,8,2280],t:7,e:"span",f:["Alive"]}],n:50,r:"life_status",p:[80,7,2252]},{t:4,n:51,f:[{p:[83,8,2323],t:7,e:"span",f:["Dead"]}],r:"life_status"}],x:{r:["oxydam"],s:"_0!=null"}}]}," ",{p:[87,5,2386],t:7,e:"td",f:[{t:4,f:[{p:[89,6,2424],t:7,e:"span",f:[{t:2,r:"area",p:[89,12,2430]}]}],n:50,x:{r:["pos_x"],s:"_0!=null"},p:[88,5,2396]},{t:4,n:51,f:[{p:[91,6,2466],t:7,e:"span",f:["N/A"]}],x:{r:["pos_x"],s:"_0!=null"}}]}," ",{t:4,f:[{p:[95,6,2545],t:7,e:"td",f:[{p:[96,7,2557],t:7,e:"ui-button",a:{action:"select_person",state:[{t:2,x:{r:["can_track"],s:'_0?null:"disabled"'},p:[96,48,2598]}],params:['{"name":"',{t:2,r:"name",p:[96,100,2650]},'"}']},f:["Track"]}]}],n:50,r:"data.link_allowed",p:[94,5,2512]}]}],n:52,r:"sorted_sensors",p:[48,3,1443]}]}]}]}]}," "]},e.exports=a.extend(r.exports)},{205:205}],248:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[2,3,33],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[3,3,66],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[3,9,72]}]}]}," ",{t:4,f:[{p:[6,5,189],t:7,e:"ui-section",a:{label:"State"},f:[{p:[7,7,223],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.statstate",p:[7,20,236]}]},f:[{t:2,r:"data.occupant.stat",p:[7,49,265]}]}]}," ",{p:[9,4,317],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[10,6,356],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.temperaturestatus",p:[10,19,369]}]},f:[{t:2,r:"data.occupant.bodyTemperature",p:[10,56,406]}," K"]}]}," ",{p:[12,5,472],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[13,7,507],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[13,20,520]}],max:[{t:2,r:"data.occupant.maxHealth",p:[13,54,554]}],value:[{t:2,r:"data.occupant.health",p:[13,90,590]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[14,16,632]}]},f:[{t:2,r:"data.occupant.health",p:[14,68,684]}]}]}," ",{t:4,f:[{p:[17,7,908],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[17,26,927]}]},f:[{p:[18,9,948],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[18,30,969]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[18,66,1005]}],state:"bad"},f:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[18,103,1042]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[16,5,742]}],n:50,r:"data.hasOccupant",p:[5,3,159]}]}," ",{p:[23,1,1138],t:7,e:"ui-display",a:{title:"Cell"},f:[{p:[24,3,1167],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[25,5,1199],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOperating"],s:'_0?"power-off":"close"'},p:[25,22,1216]}],style:[{t:2,x:{r:["data.isOperating"],s:'_0?"selected":null'},p:[26,14,1276]}],state:[{t:2,x:{r:["data.isOpen"],s:'_0?"disabled":null'},p:[27,14,1332]}],action:"power"},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[28,22,1391]}]}]}," ",{p:[30,3,1459],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[31,3,1495],t:7,e:"span",a:{"class":[{t:2,r:"data.temperaturestatus",p:[31,16,1508]}]},f:[{t:2,r:"data.cellTemperature",p:[31,44,1536]}," K"]}]}," ",{p:[33,2,1588],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[34,5,1619],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOpen"],s:'_0?"unlock":"lock"'},p:[34,22,1636]}],action:"door"},f:[{t:2,x:{r:["data.isOpen"],s:'_0?"Open":"Closed"'},p:[34,73,1687]}]}," ",{p:[35,5,1740],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoEject"],s:'_0?"sign-out":"sign-in"'},p:[35,22,1757]}],action:"autoeject"},f:[{t:2,x:{r:["data.autoEject"],s:'_0?"Auto":"Manual"'},p:[35,86,1821]}]}]}]}," ",{p:{button:[{p:[40,5,1967],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[40,36,1998]}],action:"ejectbeaker"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[42,3,2101],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{t:4,f:[{p:[45,9,2211],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,r:"volume",p:[45,52,2254]}," units of ",{t:2,r:"name",p:[45,72,2274]}]},{p:[45,87,2289],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[44,7,2171]},{t:4,n:51,f:[{p:[47,9,2320],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[43,5,2136]},{t:4,n:51,f:[{p:[50,7,2396],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],249:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"ui-section",a:{label:"State"},f:[{t:4,f:[{p:[4,4,76],t:7,e:"span",a:{"class":"good"},f:["Ready"]}],n:50,r:"data.full_pressure",p:[3,3,45]},{t:4,n:51,f:[{t:4,f:[{p:[7,5,153],t:7,e:"span",a:{"class":"bad"},f:["Power Disabled"]}],n:50,r:"data.panel_open",p:[6,4,124]},{t:4,n:51,f:[{t:4,f:[{p:[10,6,248],t:7,e:"span",a:{"class":"average"},f:["Pressurizing"]}],n:50,r:"data.pressure_charging",p:[9,5,211]},{t:4,n:51,f:[{p:[12,6,310],t:7,e:"span",a:{"class":"bad"},f:["Off"]}],r:"data.pressure_charging"}],r:"data.panel_open"}],r:"data.full_pressure"}]}," ",{p:[17,2,393],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[18,3,426],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.per",p:[18,36,459]}],state:"good"},f:[{t:2,r:"data.per",p:[18,63,486]},"%"]}]}," ",{p:[20,5,530],t:7,e:"ui-section",a:{label:"Handle"},f:[{p:[21,9,567],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.flush"],s:'_0?"toggle-on":"toggle-off"'},p:[22,10,589]}],state:[{t:2,x:{r:["data.isai","data.panel_open"],s:'_0||_1?"disabled":null'},p:[23,11,647]}],action:[{t:2,x:{r:["data.flush"],s:'_0?"handle-0":"handle-1"'},p:[24,12,714]}]},f:[{t:2,x:{r:["data.flush"],s:'_0?"Disengage":"Engage"'},p:[25,5,763]}]}]}," ",{p:[27,2,837],t:7,e:"ui-section",a:{label:"Eject"},f:[{p:[28,3,867],t:7,e:"ui-button",a:{icon:"sign-out",state:[{t:2,x:{r:["data.isai"],s:'_0?"disabled":null'},p:[28,37,901]}],action:"eject"},f:["Eject Contents"]},{p:[28,114,978],t:7,e:"br"}]}," ",{p:[30,2,1002],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[31,3,1032],t:7,e:"ui-button",a:{icon:"power-off",state:[{t:2,x:{r:["data.panel_open"],s:'_0?"disabled":null'
+},p:[31,38,1067]}],action:[{t:2,x:{r:["data.pressure_charging"],s:'_0?"pump-0":"pump-1"'},p:[31,87,1116]}],style:[{t:2,x:{r:["data.pressure_charging"],s:'_0?"selected":null'},p:[31,145,1174]}]}},{p:[31,206,1235],t:7,e:"br"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],250:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"DNA Vault Database"},f:[{p:[2,3,43],t:7,e:"ui-section",a:{label:"Human DNA"},f:[{p:[3,7,81],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.dna_max",p:[3,28,102]}],value:[{t:2,r:"data.dna",p:[3,53,127]}]},f:[{t:2,r:"data.dna",p:[3,67,141]},"/",{t:2,r:"data.dna_max",p:[3,80,154]}," Samples"]}]}," ",{p:[5,3,208],t:7,e:"ui-section",a:{label:"Plant Data"},f:[{p:[6,5,245],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.plants_max",p:[6,26,266]}],value:[{t:2,r:"data.plants",p:[6,54,294]}]},f:[{t:2,r:"data.plants",p:[6,71,311]},"/",{t:2,r:"data.plants_max",p:[6,87,327]}," Samples"]}]}," ",{p:[8,3,384],t:7,e:"ui-section",a:{label:"Animal Data"},f:[{p:[9,5,422],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.animals_max",p:[9,26,443]}],value:[{t:2,r:"data.animals",p:[9,55,472]}]},f:[{t:2,r:"data.animals",p:[9,73,490]},"/",{t:2,r:"data.animals_max",p:[9,90,507]}," Samples"]}]}]}," ",{t:4,f:[{p:[13,1,616],t:7,e:"ui-display",a:{title:"Personal Gene Therapy"},f:[{p:[14,3,663],t:7,e:"ui-section",f:[{p:[15,2,678],t:7,e:"span",f:["Applicable gene therapy treatments:"]}]}," ",{p:[17,3,747],t:7,e:"ui-section",f:[{p:[18,2,762],t:7,e:"ui-button",a:{action:"gene",params:['{"choice": "',{t:2,r:"data.choiceA",p:[18,47,807]},'"}']},f:[{t:2,r:"data.choiceA",p:[18,67,827]}]}," ",{p:[19,2,858],t:7,e:"ui-button",a:{action:"gene",params:['{"choice": "',{t:2,r:"data.choiceB",p:[19,47,903]},'"}']},f:[{t:2,r:"data.choiceB",p:[19,67,923]}]}]}]}],n:50,x:{r:["data.completed","data.used"],s:"_0&&!_1"},p:[12,1,578]}]},e.exports=a.extend(r.exports)},{205:205}],251:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[2,3,33],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[3,3,66],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[3,9,72]}]}]}," ",{t:4,f:[{p:[6,5,183],t:7,e:"ui-section",a:{label:"Items in storage"},f:[{p:[7,4,225],t:7,e:"span",f:[{t:2,r:"data.items",p:[7,10,231]}]}]}],n:50,r:"data.items",p:[5,3,159]}," ",{t:4,f:[{p:[11,5,310],t:7,e:"ui-section",a:{label:"State"},f:[{p:[12,7,344],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.statstate",p:[12,20,357]}]},f:[{t:2,r:"data.occupant.stat",p:[12,49,386]}]}]}," ",{p:[14,5,439],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[15,7,474],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[15,20,487]}],max:[{t:2,r:"data.occupant.maxHealth",p:[15,54,521]}],value:[{t:2,r:"data.occupant.health",p:[15,90,557]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[16,16,599]}]},f:[{t:2,x:{r:["adata.occupant.health"],s:"Math.round(_0)"},p:[16,68,651]}]}]}," ",{t:4,f:[{p:[19,7,888],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[19,26,907]}]},f:[{p:[20,9,928],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[20,30,949]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[20,66,985]}],state:"bad"},f:[{t:2,x:{r:["type","adata.occupant"],s:"Math.round(_1[_0])"},p:[20,103,1022]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[18,5,722]}," ",{p:[23,5,1109],t:7,e:"ui-section",a:{label:"Cells"},f:[{p:[24,9,1145],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"bad":"good"'},p:[24,22,1158]}]},f:[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"Damaged":"Healthy"'},p:[24,68,1204]}]}]}," ",{p:[26,5,1287],t:7,e:"ui-section",a:{label:"Brain"},f:[{p:[27,9,1323],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"bad":"good"'},p:[27,22,1336]}]},f:[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"Abnormal":"Healthy"'},p:[27,68,1382]}]}]}," ",{p:[29,5,1466],t:7,e:"ui-section",a:{label:"Bloodstream"},f:[{t:4,f:[{p:[31,11,1553],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,1)"},p:[31,54,1596]}," units of ",{t:2,r:"name",p:[31,89,1631]}]},{p:[31,104,1646],t:7,e:"br"}],n:52,r:"adata.occupant.reagents",p:[30,9,1508]},{t:4,n:51,f:[{p:[33,11,1681],t:7,e:"span",a:{"class":"good"},f:["Pure"]}],r:"adata.occupant.reagents"}]}],n:50,r:"data.occupied",p:[10,3,283]}]}," ",{p:[38,1,1777],t:7,e:"ui-display",a:{title:"Operations"},f:[{p:[39,3,1812],t:7,e:"ui-section",a:{label:"Inject"},f:[{t:4,f:[{p:[41,7,1872],t:7,e:"ui-button",a:{icon:"flask",state:[{t:2,x:{r:["data.occupied"],s:'_0?null:"disabled"'},p:[41,38,1903]}],action:"inject",params:['{"chem": "',{t:2,r:"id",p:[41,111,1976]},'"}']},f:[{t:2,r:"name",p:[41,121,1986]}]},{p:[41,141,2006],t:7,e:"br"}],n:52,r:"data.chem",p:[40,5,1845]}]}," ",{p:[44,2,2046],t:7,e:"ui-section",a:{label:"Eject"},f:[{p:[45,6,2079],t:7,e:"ui-button",a:{icon:"sign-out",action:"eject"},f:["Eject Contents"]}]}," ",{p:[47,2,2166],t:7,e:"ui-section",a:{label:"Self Cleaning"},f:[{p:[48,3,2204],t:7,e:"ui-button",a:{icon:"recycle",action:"cleaning"},f:["Self-Clean Cycle"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],252:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,24],t:7,e:"ui-display",a:{title:[{t:2,r:"data.question",p:[2,21,42]}]},f:[{p:[3,5,66],t:7,e:"ui-section",f:[{t:4,f:[{p:[5,9,118],t:7,e:"ui-button",a:{action:"vote",params:['{"answer": "',{t:2,r:"answer",p:[6,45,174]},'"}'],style:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[7,18,206]}]},f:[{t:2,r:"answer",p:[7,53,241]}," (",{t:2,r:"amount",p:[7,65,253]},")"]}],n:52,r:"data.answers",p:[4,7,86]}]}]}],n:50,r:"data.shaking",p:[1,1,0]},{t:4,n:51,f:[{p:[13,3,353],t:7,e:"ui-notice",f:["The eightball is not currently being shaken."]}],r:"data.shaking"}]},e.exports=a.extend(r.exports)},{205:205}],253:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,5,17],t:7,e:"span",f:["Time Until Launch: ",{t:2,r:"data.timer_str",p:[2,30,42]}]}]}," ",{p:[4,1,83],t:7,e:"ui-notice",f:[{p:[5,3,98],t:7,e:"span",f:["Engines: ",{t:2,x:{r:["data.engines_started"],s:'_0?"Online":"Idle"'},p:[5,18,113]}]}]}," ",{p:[7,1,180],t:7,e:"ui-display",a:{title:"Early Launch"},f:[{p:[8,2,216],t:7,e:"span",f:["Authorizations Remaining: ",{t:2,x:{r:["data.emagged","data.authorizations_remaining"],s:'_0?"ERROR":_1'},p:[9,2,250]}]}," ",{p:[10,2,318],t:7,e:"ui-button",a:{icon:"exclamation-triangle",action:"authorize",style:"danger",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[12,10,404]}]},f:["AUTHORIZE"]}," ",{p:[15,2,473],t:7,e:"ui-button",a:{icon:"minus",action:"repeal",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[16,10,523]}]},f:["Repeal"]}," ",{p:[19,2,589],t:7,e:"ui-button",a:{icon:"close",action:"abort",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[20,10,638]}]},f:["Repeal All"]}]}," ",{p:[24,1,722],t:7,e:"ui-display",a:{title:"Authorizations"},f:[{t:4,f:[{p:[26,3,793],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{t:2,r:"name",p:[26,34,824]}," (",{t:2,r:"job",p:[26,44,834]},")"]}],n:52,r:"data.authorizations",p:[25,2,760]},{t:4,n:51,f:[{p:[28,3,870],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:["No authorizations."]}],r:"data.authorizations"}]}]},e.exports=a.extend(r.exports)},{205:205}],254:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Message"},f:[{t:2,r:"data.hidden_message",p:[3,5,50]}]}," ",{p:[5,3,94],t:7,e:"ui-section",a:{label:"Created On"},f:[{t:2,r:"data.realdate",p:[6,5,131]}]}," ",{p:[8,3,169],t:7,e:"ui-section",a:{label:"Approval"},f:[{p:[9,5,204],t:7,e:"ui-button",a:{icon:"arrow-up",state:[{t:2,x:{r:["data.is_creator","data.has_liked"],s:'_0?"disabled":_1?"selected":null'},p:[11,14,252]}],action:"like"},f:[{t:2,r:"data.num_likes",p:[12,21,344]}]}," ",{p:[13,5,380],t:7,e:"ui-button",a:{icon:"circle",state:[{t:2,x:{r:["data.is_creator","data.has_liked","data.has_disliked"],s:'_0?"disabled":!_1&&!_2?"selected":null'},p:[15,14,426]}],action:"neutral"}}," ",{p:[17,5,562],t:7,e:"ui-button",a:{icon:"arrow-down",state:[{t:2,x:{r:["data.is_creator","data.has_disliked"],s:'_0?"disabled":_1?"selected":null'},p:[19,14,612]}],action:"dislike"},f:[{t:2,r:"data.num_dislikes",p:[20,24,710]}]}]}]}," ",{t:4,f:[{p:[24,3,805],t:7,e:"ui-display",a:{title:"Admin Panel"},f:[{p:[25,5,843],t:7,e:"ui-section",a:{label:"Creator Ckey"},f:[{t:2,r:"data.creator_key",p:[25,38,876]}]}," ",{p:[26,5,915],t:7,e:"ui-section",a:{label:"Creator Character Name"},f:[{t:2,r:"data.creator_name",p:[26,48,958]}]}," ",{p:[27,5,998],t:7,e:"ui-button",a:{icon:"remove",action:"delete",style:"danger"},f:["Delete"]}]}],n:50,r:"data.admin_mode",p:[23,1,778]}]},e.exports=a.extend(r.exports)},{205:205}],255:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The requested interface (",{t:2,r:"config.interface",p:[2,34,46]},") was not found. Does it exist?"]}]}]},e.exports=a.extend(r.exports)},{205:205}],256:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,20],t:7,e:"ui-notice",f:["Currently syncing with the database"]}],n:50,r:"data.sync",p:[1,1,0]},{t:4,n:51,f:[{p:{button:[{p:[8,4,163],t:7,e:"ui-button",a:{icon:"eject",action:"eject_all"},f:["Eject all"]}," ",{p:[9,4,232],t:7,e:"ui-button",a:{icon:["toggle-",{t:2,x:{r:["data.show_materials"],s:'_0?"off":"on"'},p:[9,28,256]}],action:"toggle_materials_visibility"},f:[{t:2,x:{r:["data.show_materials"],s:'_0?"Hide":"Show"'},p:[10,5,339]}]}]},t:7,e:"ui-display",a:{title:"Materials",button:0},f:[" ",{t:4,f:[{p:[14,4,449],t:7,e:"div",a:{"class":"display tabular"},f:[{p:[15,5,484],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[16,6,520],t:7,e:"section",a:{"class":"cell"}}," ",{p:[17,6,559],t:7,e:"section",a:{"class":"cell"},f:["Mineral"]}," ",{p:[20,6,620],t:7,e:"section",a:{"class":"cell"},f:["Amount"]}," ",{p:[23,6,680],t:7,e:"section",a:{"class":"cell"}}," ",{p:[24,6,719],t:7,e:"section",a:{"class":"cell"}}]}," ",{t:4,f:[{p:[27,6,808],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[28,7,845],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[29,8,876]}]}," ",{p:[31,7,910],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"amount",p:[32,8,941]}]}," ",{p:[34,7,977],t:7,e:"section",a:{"class":"cell"},f:[{p:[35,8,1008],t:7,e:"ui-button",a:{icon:"eject"},f:["Release amount"]}]}," ",{p:[37,7,1084],t:7,e:"section",a:{"class":"cell",style:"width: 40px;"},f:[{p:[38,8,1136],t:7,e:"ui-button",a:{icon:"eject"},f:["Release all"]}]}]}],n:52,r:"data.all_materials",p:[26,5,773]}]}],n:50,r:"data.show_materials",p:[13,3,417]}]}," ",{p:[45,2,1274],t:7,e:"ui-display",a:{title:"Categories"},f:[{t:4,f:[{p:[47,4,1334],t:7,e:"ui-button",f:[{t:2,r:".",p:[47,15,1345]}]}],r:"data.categories",p:[46,3,1309]}]}],r:"data.sync"}]},e.exports=a.extend(r.exports)},{205:205}],257:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[3,5,49],t:7,e:"ui-button",a:{action:"toggle_power",style:[{t:2,x:{r:["data.toggle"],s:'_0?"selected":null'},p:[5,18,111]}]},f:["Turn ",{t:2,x:{r:["data.toggle"],s:'_0?"off":"on"'},p:[6,16,166]}]}]}," ",{p:[9,3,235],t:7,e:"ui-display",a:{title:"Logging"},f:[{t:4,f:[{p:[11,3,292],t:7,e:"ui-section",a:{label:">"},f:[{t:2,r:".",p:[11,25,314]},{p:[11,30,319],t:7,e:"ui-section",f:[]}]}],n:52,r:"data.logs",p:[10,5,269]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],258:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{seclevelState:function(){switch(this.get("data.seclevel")){case"blue":return"average";case"red":return"bad";case"delta":return"bad bold";default:return"good"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[16,1,323],t:7,e:"ui-display",f:[{p:[17,5,341],t:7,e:"ui-section",a:{label:"Alert Level"},f:[{p:[18,9,383],t:7,e:"span",a:{"class":[{t:2,r:"seclevelState",p:[18,22,396]}]},f:[{t:2,x:{r:["text","data.seclevel"],s:"_0.titleCase(_1)"},p:[18,41,415]}]}]}," ",{p:[20,5,480],t:7,e:"ui-section",a:{label:"Controls"},f:[{p:[21,9,519],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.alarm"],s:'_0?"close":"bell-o"'},p:[21,26,536]}],action:[{t:2,x:{r:["data.alarm"],s:'_0?"reset":"alarm"'},p:[21,71,581]}]},f:[{t:2,x:{r:["data.alarm"],s:'_0?"Reset":"Activate"'},p:[22,13,631]}]}]}," ",{t:4,f:[{p:[25,7,733],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[26,9,771],t:7,e:"span",a:{"class":"bad bold"},f:["Safety measures offline. Device may exhibit abnormal behavior."]}]}],n:50,r:"data.emagged",p:[24,5,705]}]}]},e.exports=a.extend(r.exports)},{205:205}],259:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[2,1,31],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,2,60],t:7,e:"ui-button",a:{icon:"power-off",style:[{t:2,x:{r:["data.power"],s:'_0?"selected":"danger"'},p:[3,37,95]}],action:"power"},f:[{t:2,x:{r:["data.power"],s:'_0?"Enabled":"Disabled"'},p:[3,92,150]}]}]}," ",{p:[5,1,218],t:7,e:"ui-section",a:{label:"Tag"},f:[{p:[6,2,245],t:7,e:"ui-button",a:{icon:"pencil",action:"rename"},f:[{t:2,r:"data.tag",p:[6,43,286]}]}]}," ",{p:[8,1,327],t:7,e:"ui-section",a:{label:"Scanning mode"},f:[{p:[9,2,364],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.updating"],s:'_0?"unlock":"lock"'},p:[9,18,380]}],style:[{t:2,x:{r:["data.updating"],s:'_0?null:"danger"'},p:[9,63,425]}],action:"updating",tooltip:"Toggle between automatic scanning or scan only when a button is pressed.","tooltip-side":"right"},f:[{t:2,x:{r:["data.updating"],s:'_0?"AUTO":"MANUAL"'},p:[9,221,583]}]}]}," ",{p:[11,1,649],t:7,e:"ui-section",a:{label:"Detection range"},f:[{p:[12,2,688],t:7,e:"ui-button",a:{icon:"refresh",style:[{t:2,x:{r:["data.globalmode"],s:'_0?null:"selected"'},p:[12,35,721]}],action:"globalmode",tooltip:"Local sector or whole region scanning.","tooltip-side":"right"},f:[{t:2,x:{r:["data.globalmode"],s:'_0?"MAXIMUM":"LOCAL"'},p:[12,165,851]}]}]}]}," ",{t:4,f:[{p:[16,2,957],t:7,e:"ui-display",a:{title:"Current Location"},f:[{p:[17,3,998],t:7,e:"span",f:[{t:2,r:"data.current",p:[17,9,1004]}]}]}," ",{p:[20,2,1048],t:7,e:"ui-display",a:{title:"Detected Signals"},f:[{t:4,f:[{p:[22,3,1114],t:7,e:"ui-section",a:{label:[{t:2,r:"entrytag",p:[22,21,1132]}]},f:[{p:[23,3,1149],t:7,e:"span",f:[{t:2,r:"area",p:[23,9,1155]}," (",{t:2,r:"coord",p:[23,19,1165]},")"]}," ",{t:4,f:[{p:[25,4,1209],t:7,e:"span",f:["Dist: ",{t:2,r:"dist",p:[25,16,1221]},"m Dir: ",{t:2,r:"degrees",p:[25,31,1236]},"° (",{t:2,r:"direction",p:[25,45,1250]},")"]}],n:50,r:"direction",p:[24,3,1187]}]}],n:52,r:"data.signals",p:[21,2,1088]}]}],n:50,r:"data.power",p:[15,1,936]}]},e.exports=a.extend(r.exports)},{205:205}],260:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Labor Camp Teleporter"},f:[{p:[2,2,45],t:7,e:"ui-section",a:{label:"Teleporter Status"},f:[{p:[3,3,87],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.teleporter"],s:'_0?"good":"bad"'},p:[3,16,100]}]},f:[{t:2,x:{r:["data.teleporter"],s:'_0?"Connected":"Not connected"'},p:[3,54,138]}]}]}," ",{t:4,f:[{p:[6,4,244],t:7,e:"ui-section",a:{label:"Location"},f:[{p:[7,5,279],t:7,e:"span",f:[{t:2,r:"data.teleporter_location",p:[7,11,285]}]}]}," ",{p:[9,4,343],t:7,e:"ui-section",a:{label:"Locked status"},f:[{p:[10,5,383],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.teleporter_lock"],s:'_0?"lock":"unlock"'},p:[10,22,400]}],action:"teleporter_lock"},f:[{t:2,x:{r:["data.teleporter_lock"],s:'_0?"Locked":"Unlocked"'},p:[10,93,471]}]}," ",{p:[11,5,537],t:7,e:"ui-button",a:{action:"toggle_open"},f:[{t:2,x:{r:["data.teleporter_state_open"],s:'_0?"Open":"Closed"'},p:[11,37,569]}]}]}],n:50,r:"data.teleporter",p:[5,3,216]},{t:4,n:51,f:[{p:[14,4,666],t:7,e:"span",f:[{p:[14,10,672],t:7,e:"ui-button",a:{action:"scan_teleporter"},f:["Scan Teleporter"]}]}],r:"data.teleporter"}]}," ",{p:[17,1,770],t:7,e:"ui-display",a:{title:"Labor Camp Beacon"},f:[{p:[18,2,811],t:7,e:"ui-section",a:{label:"Beacon Status"},f:[{p:[19,3,849],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.beacon"],s:'_0?"good":"bad"'},p:[19,16,862]}]},f:[{t:2,x:{r:["data.beacon"],s:'_0?"Connected":"Not connected"'},p:[19,50,896]}]}]}," ",{t:4,f:[{p:[22,3,992],t:7,e:"ui-section",a:{label:"Location"},f:[{p:[23,4,1026],t:7,e:"span",f:[{t:2,r:"data.beacon_location",p:[23,10,1032]}]}]}],n:50,r:"data.beacon",p:[21,2,969]},{t:4,n:51,f:[{p:[26,4,1097],t:7,e:"span",f:[{p:[26,10,1103],t:7,e:"ui-button",a:{action:"scan_beacon"},f:["Scan Beacon"]}]}],r:"data.beacon"}]}," ",{p:[29,1,1193],t:7,e:"ui-display",a:{title:"Prisoner details"},f:[{p:[30,2,1233],t:7,e:"ui-section",a:{label:"Prisoner ID"},f:[{p:[31,3,1269],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[31,33,1299]}]}]}," ",{t:4,f:[{p:[34,2,1392],t:7,e:"ui-section",a:{label:"Set ID goal"},f:[{p:[35,4,1429],t:7,e:"ui-button",a:{action:"set_goal"},f:[{t:2,r:"data.goal",p:[35,33,1458]}]}]}],n:50,r:"data.id",p:[33,2,1374]}," ",{p:[38,2,1512],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[39,3,1545],t:7,e:"span",f:[{t:2,x:{r:["data.prisoner.name"],s:'_0?_0:"No Occupant"'},p:[39,9,1551]}]}]}," ",{t:4,f:[{p:[42,3,1661],t:7,e:"ui-section",a:{label:"Criminal Status"},f:[{p:[43,4,1702],t:7,e:"span",f:[{t:2,r:"data.prisoner.crimstat",p:[43,10,1708]}]}]}],n:50,r:"data.prisoner",p:[41,2,1636]}]}," ",{p:[47,1,1785],t:7,e:"ui-display",f:[{p:[48,2,1800],t:7,e:"center",f:[{p:[48,10,1808],t:7,e:"ui-button",a:{action:"teleport",state:[{t:2,x:{r:["data.can_teleport"],s:'_0?null:"disabled"'},p:[48,45,1843]}]},f:["Process Prisoner"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],261:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"center",f:[{p:[2,10,23],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[2,40,53]}]}]}]}," ",{p:[4,1,135],t:7,e:"ui-display",a:{title:"Stored Items"},f:[{t:4,f:[{p:[6,3,194],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[6,22,213]}]},f:[{p:[7,4,228],t:7,e:"ui-button",a:{action:"release_items",params:['{"mobref":',{t:2,r:"mob",p:[7,56,280]},"}"],state:[{t:2,x:{r:["data.can_reclaim"],s:'_0?null:"disabled"'},p:[7,72,296]}]},f:["Drop Items"]}]}],n:52,r:"data.mobs",p:[5,2,171]}]}]},e.exports=a.extend(r.exports)},{205:205}],262:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{p:[3,3,70],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.emagged"],s:'_0?"un":null'},p:[3,20,87]},"lock"],state:[{t:2,x:{r:["data.can_toggle_safety"],s:'_0?null:"disabled"'},p:[3,63,130]}],action:"safety"},f:["Safeties: ",{p:[4,14,209],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.emagged"],s:'_0?"bad":"good"'},p:[4,27,222]}]},f:[{t:2,x:{r:["data.emagged"],s:'_0?"OFF":"ON"'},p:[4,62,257]}]}]}]},t:7,e:"ui-display",a:{title:"Default Programs",button:0},f:[" ",{t:4,f:[{p:[8,2,363],t:7,e:"ui-button",a:{action:"load_program",params:['{"type": ',{t:2,r:"type",p:[8,52,413]},"}"],style:[{t:2,x:{r:["data.program","type"],s:'_0==_1?"selected":null'},p:[8,70,431]}]},f:[{t:2,r:"name",p:[9,5,483]}," "]},{p:[10,14,506],t:7,e:"br"}],n:52,r:"data.default_programs",p:[7,2,329]}]}," ",{t:4,f:[{p:[14,2,562],t:7,e:"ui-display",a:{title:"Dangerous Programs"},f:[{t:4,f:[{p:[16,4,638],t:7,e:"ui-button",a:{icon:"warning",action:"load_program",params:['{"type": ',{t:2,r:"type",p:[16,69,703]},"}"],style:[{t:2,x:{r:["data.program","type"],s:'_0==_1?"selected":null'},p:[16,87,721]}]},f:[{t:2,r:"name",p:[17,5,773]}," "]},{p:[18,16,798],t:7,e:"br"}],n:52,r:"data.emag_programs",p:[15,3,605]}]}],n:50,r:"data.emagged",p:[13,1,539]}]},e.exports=a.extend(r.exports)},{205:205}],263:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{occupantStatState:function(){switch(this.get("data.occupant.stat")){case 0:return"good";case 1:return"average";default:return"bad"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[15,1,280],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[16,3,313],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[17,3,346],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[17,9,352]}]}]}," ",{t:4,f:[{p:[20,5,466],t:7,e:"ui-section",a:{label:"State"},f:[{p:[21,7,500],t:7,e:"span",a:{"class":[{t:2,r:"occupantStatState",p:[21,20,513]}]},f:[{t:2,x:{r:["data.occupant.stat"],s:'_0==0?"Conscious":_0==1?"Unconcious":"Dead"'},p:[21,43,536]}]}]}],n:50,r:"data.occupied",p:[19,3,439]}]}," ",{p:[25,1,680],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[26,2,712],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[27,5,743],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"unlock":"lock"'},p:[27,22,760]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Open":"Closed"'},p:[27,71,809]}]}]}," ",{p:[29,3,874],t:7,e:"ui-section",a:{label:"Uses"},f:[{t:2,r:"data.ready_implants",p:[30,5,905]}," ",{t:4,f:[{p:[32,7,969],t:7,e:"span",a:{"class":"fa fa-cog fa-spin"}}],n:50,r:"data.replenishing",p:[31,5,936]}]}," ",{p:[35,3,1036],t:7,e:"ui-section",a:{label:"Activate"},f:[{p:[36,7,1073],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.occupied","data.ready_implants","data.ready"],s:'_0&&_1>0&&_2?null:"disabled"'},p:[36,25,1091]}],action:"implant"},f:[{t:2,x:{r:["data.ready","data.special_name"],s:'_0?(_1?_1:"Implant"):"Recharging"'},p:[37,9,1198]}," "]},{p:[38,19,1302],t:7,e:"br"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],264:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{healthState:function(){var t=this.get("data.health");return t>70?"good":t>50?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[15,3,296],t:7,e:"ui-notice",f:[{p:[16,5,313],t:7,e:"span",f:["Wipe in progress!"]}]}],n:50,r:"data.wiping",p:[14,1,273]},{p:{button:[{t:4,f:[{p:[22,7,479],t:7,e:"ui-button",a:{icon:"trash",state:[{t:2,x:{r:["data.isDead"],s:'_0?"disabled":null'},p:[22,38,510]}],action:"wipe"},f:[{t:2,x:{r:["data.wiping"],s:'_0?"Stop Wiping":"Wipe"'},p:[22,89,561]}," AI"]}],n:50,r:"data.name",p:[21,5,454]}]},t:7,e:"ui-display",a:{title:[{t:2,x:{r:["data.name"],s:'_0||"Empty Card"'},p:[19,19,388]}],button:0},f:[" ",{t:4,f:[{p:[26,5,672],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[27,9,709],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.isDead","data.isBraindead"],s:'_0||_1?"bad":"good"'},p:[27,22,722]}]},f:[{t:2,x:{r:["data.isDead","data.isBraindead"],s:'_0||_1?"Offline":"Operational"'},p:[27,76,776]}]}]}," ",{p:[29,5,871],t:7,e:"ui-section",a:{label:"Software Integrity"},f:[{p:[30,7,918],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.health",p:[30,40,951]}],state:[{t:2,r:"healthState",p:[30,64,975]}]},f:[{t:2,x:{r:["adata.health"],s:"Math.round(_0)"},p:[30,81,992]},"%"]}]}," ",{p:[32,5,1055],t:7,e:"ui-section",a:{label:"Laws"},f:[{t:4,f:[{p:[34,9,1117],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:".",p:[34,33,1141]}]},{p:[34,45,1153],t:7,e:"br"}],n:52,r:"data.laws",p:[33,7,1088]}]}," ",{p:[37,5,1200],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[38,7,1237],t:7,e:"ui-button",a:{icon:"signal",style:[{t:2,x:{r:["data.wireless"],s:'_0?"selected":null'},p:[38,39,1269]}],action:"wireless"},f:["Wireless Activity"]}," ",{p:[39,7,1363],t:7,e:"ui-button",a:{icon:"microphone",style:[{t:2,x:{r:["data.radio"],s:'_0?"selected":null'},p:[39,43,1399]}],action:"radio"},f:["Subspace Radio"]}]}],n:50,r:"data.name",p:[25,3,649]}]}]},e.exports=a.extend(r.exports)},{205:205}],265:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,23],t:7,e:"ui-notice",f:[{p:[3,3,38],t:7,e:"span",f:["Waiting for another device to confirm your request..."]}]}],n:50,r:"data.waiting",p:[1,1,0]},{t:4,n:51,f:[{p:[6,2,132],t:7,e:"ui-display",f:[{p:[7,3,148],t:7,e:"ui-section",f:[{t:4,f:[{p:[9,5,197],t:7,e:"ui-button",a:{icon:"check",action:"auth_swipe"},f:["Authorize ",{t:2,r:"data.auth_required",p:[9,59,251]}]}],n:50,r:"data.auth_required",p:[8,4,165]},{t:4,n:51,f:[{p:[11,5,304],t:7,e:"ui-button",a:{icon:"warning",state:[{t:2,x:{r:["data.red_alert"],s:'_0?"disabled":null'},p:[11,38,337]}],action:"red_alert"},f:["Red Alert"]}," ",{p:[12,5,423],t:7,e:"ui-button",a:{icon:"wrench",state:[{t:2,x:{r:["data.emergency_maint"],s:'_0?"disabled":null'},p:[12,37,455]}],action:"emergency_maint"},f:["Emergency Maintenance Access"]}," ",{p:[13,5,572],t:7,e:"ui-button",a:{icon:"warning",state:"null",action:"bsa_unlock"},f:["Bluespace Artillery Unlock"]}],r:"data.auth_required"}]}]}],r:"data.waiting"}]},e.exports=a.extend(r.exports)},{205:205}],266:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Ore values"},f:[{t:4,f:[{p:[3,3,57],t:7,e:"ui-section",a:{label:[{t:2,r:"ore",p:[3,22,76]}]},f:[{p:[4,4,90],t:7,e:"span",f:[{t:2,r:"value",p:[4,10,96]}]}]}],n:52,r:"data.ores",p:[2,2,34]}]}," ",{p:[8,1,158],t:7,e:"ui-display",a:{title:"Points"},f:[{p:[9,2,188],t:7,e:"ui-section",a:{label:"ID"},f:[{p:[10,3,215],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[10,33,245]}]}]}," ",{t:4,f:[{p:[13,3,339],t:7,e:"ui-section",a:{label:"Points collected"},f:[{p:[14,4,381],t:7,e:"span",f:[{t:2,r:"data.points",p:[14,10,387]}]}]}," ",{p:[16,3,430],t:7,e:"ui-section",a:{label:"Goal"},f:[{p:[17,4,460],t:7,e:"span",f:[{t:2,r:"data.goal",p:[17,10,466]}]}]}," ",{p:[19,3,507],t:7,e:"ui-section",a:{label:"Unclaimed points"},f:[{p:[20,4,549],t:7,e:"span",f:[{t:2,r:"data.unclaimed_points",p:[20,10,555]}]}," ",{p:[21,4,592],t:7,e:"ui-button",a:{action:"claim_points",state:[{t:2,x:{r:["data.unclaimed_points"],s:'_0?null:"disabled"'},p:[21,43,631]}]},f:["Claim points"]}]}],n:50,r:"data.id",p:[12,2,320]}]}," ",{p:[25,1,745],t:7,e:"ui-display",f:[{p:[26,2,760],t:7,e:"center",f:[{p:[27,3,772],t:7,e:"ui-button",a:{action:"move_shuttle",state:[{t:2,x:{r:["data.can_go_home"],s:'_0?null:"disabled"'},p:[27,42,811]}]},f:["Move shuttle"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],267:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Known Languages"},f:[{t:4,f:[{p:[3,5,70],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[3,23,88]}]},f:[{p:[4,7,105],t:7,e:"span",f:[{t:2,r:"desc",p:[4,13,111]}]}," ",{p:[5,7,134],t:7,e:"span",f:["Key: ,",{t:2,r:"key",p:[5,19,146]}]}," ",{t:4,f:[{p:[7,9,192],t:7,e:"span",f:["(gained from mob)"]}],n:50,r:"shadow",p:[6,7,168]}," ",{p:[9,7,245],t:7,e:"span",f:[{t:2,x:{r:["can_speak"],s:'_0?"Can Speak":"Cannot Speak"'},p:[9,13,251]}]}," ",{t:4,f:[{p:[11,9,342],t:7,e:"ui-button",a:{action:"select_default",params:['{"language_name":"',{t:2,r:"name",p:[13,37,425]},'"}'],style:[{t:2,x:{r:["is_default","can_speak"],s:'_0?"selected":_1?null:"disabled"'},p:[14,18,455]}]},f:[{t:2,x:{r:["is_default"],s:'_0?"Default Language":"Select as Default"'},p:[15,10,526]}]}],n:50,r:"data.is_living",p:[10,7,310]}," ",{t:4,f:[{t:4,f:[{p:[20,11,685],t:7,e:"ui-button",a:{action:"grant_language",params:['{"language_name":"',{t:2,r:"name",p:[20,72,746]},'"}']},f:["Grant"]}],n:50,r:"shadow",p:[19,9,659]},{t:4,n:51,f:[{p:[22,11,805],t:7,e:"ui-button",a:{action:"remove_language",params:['{"language_name":"',{t:2,r:"name",p:[22,73,867]},'"}']},f:["Remove"]}],r:"shadow"}],n:50,r:"data.admin_mode",p:[18,7,626]}]}],n:52,r:"data.languages",p:[2,3,40]}]}," ",{t:4,f:[{t:4,f:[{p:[30,5,1033],t:7,e:"ui-button",a:{action:"toggle_omnitongue",style:[{t:2,x:{r:["data.omnitongue"],s:'_0?"selected":null'},p:[32,14,1092]}]},f:["Omnitongue ",{t:2,x:{r:["data.omnitongue"],s:'_0?"Enabled":"Disabled"'},p:[33,19,1152]}]}],n:50,r:"data.is_living",p:[29,3,1005]}," ",{p:[36,3,1231],t:7,e:"ui-display",a:{title:"Unknown Languages"},f:[{t:4,f:[{p:[38,7,1315],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[38,25,1333]}]},f:[{p:[39,9,1352],t:7,e:"span",f:[{t:2,r:"desc",p:[39,15,1358]}]}," ",{p:[40,9,1383],t:7,e:"span",f:["Key: ,",{t:2,r:"key",p:[40,21,1395]}]}," ",{p:[41,9,1419],t:7,e:"ui-button",a:{action:"grant_language",params:['{"language_name":"',{t:2,r:"name",p:[43,37,1502]},'"}']},f:["Grant"]}]}],n:52,r:"data.unknown_languages",p:[37,5,1275]}]}],n:50,r:"data.admin_mode",p:[28,1,978]}]},e.exports=a.extend(r.exports)},{205:205}],268:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Controls"},f:[{t:4,f:[{t:4,f:[{p:[4,4,84],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[5,5,118],t:7,e:"span",f:["Launchpad closed."]}]}],n:50,r:"data.pad_closed",p:[3,3,56]},{t:4,n:51,f:[{p:[8,4,183],t:7,e:"ui-section",a:{label:"Launchpad"},f:[{p:[9,4,218],t:7,e:"span",f:[{p:[9,10,224],t:7,e:"b",f:[{t:2,r:"data.pad_name",p:[9,13,227]}]}]},{p:[9,41,255],t:7,e:"br"}," ",{p:[10,4,264],t:7,e:"ui-button",a:{icon:"pencil",action:"rename"},f:["Rename"]}," ",{p:[11,4,328],t:7,e:"ui-button",a:{icon:"remove",style:"danger",action:"remove"},f:["Remove"]}]}," ",{p:[14,4,427],t:7,e:"ui-section",a:{label:"Set Target"},f:[{p:[15,4,463],t:7,e:"table",f:[{p:[16,4,475],t:7,e:"tr",f:[{p:[17,5,485],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[17,38,518],t:7,e:"ui-button",a:{action:"up-left"},f:["↖"]}]}," ",{p:[18,5,570],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[18,57,622],t:7,e:"ui-button",a:{action:"up"},f:["↑"]}]}," ",{p:[19,5,669],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[19,56,720],t:7,e:"ui-button",a:{action:"up-right"},f:["↗"]}]}]}," ",{p:[21,4,782],t:7,e:"tr",f:[{p:[22,5,792],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[22,38,825],t:7,e:"ui-button",a:{action:"left",style:"width:35px!important"},f:["←"]}]}," ",{p:[23,5,903],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[23,57,955],t:7,e:"ui-button",a:{action:"reset"},f:["R"]}]}," ",{p:[24,5,1005],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[24,56,1056],t:7,e:"ui-button",a:{action:"right"},f:["→"]}]}]}," ",{p:[26,4,1115],t:7,e:"tr",f:[{p:[27,5,1125],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[27,38,1158],t:7,e:"ui-button",a:{action:"down-left"},f:["↙"]}]}," ",{p:[28,5,1212],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[28,57,1264],t:7,e:"ui-button",a:{action:"down"},f:["↓"]}]}," ",{p:[29,5,1313],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[29,56,1364],t:7,e:"ui-button",a:{action:"down-right"},f:["↘"]}]}]}]}]}," ",{p:[33,4,1459],t:7,e:"ui-section",a:{label:"Current Target"},f:[{p:[34,5,1500],t:7,e:"span",f:[{t:2,r:"data.abs_y",p:[34,11,1506]}," ",{t:2,r:"data.north_south",p:[34,26,1521]}]},{p:[34,53,1548],t:7,e:"br"}," ",{p:[35,5,1558],t:7,e:"span",f:[{t:2,r:"data.abs_x",p:[35,11,1564]}," ",{t:2,r:"data.east_west",p:[35,26,1579]}]}]}," ",{p:[37,4,1627],t:7,e:"ui-section",a:{label:"Activate"},f:[{p:[38,5,1662],t:7,e:"ui-button",a:{action:"launch",tooltip:"Teleport everything on the pad to the target.","tooltip-side":"down"},f:["Launch"]}," ",{p:[39,5,1789],t:7,e:"ui-button",a:{action:"pull",tooltip:"Teleport everything from the target to the pad.","tooltip-side":"down"},f:["Pull"]}]}],r:"data.pad_closed"}],n:50,r:"data.has_pad",p:[2,2,32]},{t:4,n:51,f:[{p:[45,3,1956],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[46,4,1989],t:7,e:"span",f:["No launchpad found. Link the remote to a launchpad."]}]}],r:"data.has_pad"}]}]},e.exports=a.extend(r.exports)},{205:205}],269:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{mechChargeState:function(t){var e=this.get("data.recharge_port.mech.cell.maxcharge");return t>=e/1.5?"good":t>=e/3?"average":"bad"},mechHealthState:function(t){var e=this.get("data.recharge_port.mech.maxhealth");return t>e/1.5?"good":t>e/3?"average":"bad";
+}}}}(r),r.exports.template={v:3,t:[" ",{p:[20,1,545],t:7,e:"ui-display",a:{title:"Mech Status"},f:[{t:4,f:[{t:4,f:[{p:[23,4,646],t:7,e:"ui-section",a:{label:"Integrity"},f:[{p:[24,6,683],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.recharge_port.mech.maxhealth",p:[24,27,704]}],value:[{t:2,r:"adata.recharge_port.mech.health",p:[24,74,751]}],state:[{t:2,x:{r:["mechHealthState","adata.recharge_port.mech.health"],s:"_0(_1)"},p:[24,117,794]}]},f:[{t:2,x:{r:["adata.recharge_port.mech.health"],s:"Math.round(_0)"},p:[24,171,848]},"/",{t:2,r:"adata.recharge_port.mech.maxhealth",p:[24,219,896]}]}]}," ",{t:4,f:[{t:4,f:[{p:[28,5,1061],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[28,31,1087],t:7,e:"span",a:{"class":"bad"},f:["Cell Critical Failure"]}]}],n:50,r:"data.recharge_port.mech.cell.critfail",p:[27,3,1010]},{t:4,n:51,f:[{p:[30,11,1170],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[31,13,1210],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.recharge_port.mech.cell.maxcharge",p:[31,34,1231]}],value:[{t:2,r:"adata.recharge_port.mech.cell.charge",p:[31,86,1283]}],state:[{t:2,x:{r:["mechChargeState","adata.recharge_port.mech.cell.charge"],s:"_0(_1)"},p:[31,134,1331]}]},f:[{t:2,x:{r:["adata.recharge_port.mech.cell.charge"],s:"Math.round(_0)"},p:[31,193,1390]},"/",{t:2,x:{r:["adata.recharge_port.mech.cell.maxcharge"],s:"Math.round(_0)"},p:[31,246,1443]}]}]}],r:"data.recharge_port.mech.cell.critfail"}],n:50,r:"data.recharge_port.mech.cell",p:[26,4,970]},{t:4,n:51,f:[{p:[35,3,1558],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[35,29,1584],t:7,e:"span",a:{"class":"bad"},f:["Cell Missing"]}]}],r:"data.recharge_port.mech.cell"}],n:50,r:"data.recharge_port.mech",p:[22,2,610]},{t:4,n:51,f:[{p:[38,4,1662],t:7,e:"ui-section",f:["Mech Not Found"]}],r:"data.recharge_port.mech"}],n:50,r:"data.recharge_port",p:[21,3,581]},{t:4,n:51,f:[{p:[41,5,1729],t:7,e:"ui-section",f:["Recharging Port Not Found"]}," ",{p:[42,2,1782],t:7,e:"ui-button",a:{icon:"refresh",action:"reconnect"},f:["Reconnect"]}],r:"data.recharge_port"}]}]},e.exports=a.extend(r.exports)},{205:205}],270:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{t:4,f:[{p:[3,5,45],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[4,7,88],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[4,24,105]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[4,75,156]}]}]}],n:50,r:"data.siliconUser",p:[2,3,15]},{t:4,n:51,f:[{p:[7,5,247],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[7,31,273]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[10,1,358],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[11,3,389],t:7,e:"ui-section",a:{label:"Power"},f:[{t:4,f:[{p:[13,7,470],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[13,24,487]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[13,68,531]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[13,116,579]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[12,5,421]},{t:4,n:51,f:[{p:[15,7,639],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.on"],s:'_0?"good":"bad"'},p:[15,20,652]}],state:[{t:2,x:{r:["data.cell"],s:'_0?null:"disabled"'},p:[15,57,689]}]},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[15,92,724]}]}],x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"}}]}," ",{p:[18,3,791],t:7,e:"ui-section",a:{label:"Cell"},f:[{p:[19,5,822],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.cell"],s:'_0?null:"bad"'},p:[19,18,835]}]},f:[{t:2,x:{r:["data.cell","data.cellPercent"],s:'_0?_1+"%":"No Cell"'},p:[19,48,865]}]}]}," ",{p:[21,3,943],t:7,e:"ui-section",a:{label:"Mode"},f:[{p:[22,5,974],t:7,e:"span",a:{"class":[{t:2,r:"data.modeStatus",p:[22,18,987]}]},f:[{t:2,r:"data.mode",p:[22,39,1008]}]}]}," ",{p:[24,3,1049],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[25,5,1080],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.load"],s:'_0?"good":"average"'},p:[25,18,1093]}]},f:[{t:2,x:{r:["data.load"],s:'_0?_0:"None"'},p:[25,54,1129]}]}]}," ",{p:[27,3,1191],t:7,e:"ui-section",a:{label:"Destination"},f:[{p:[28,5,1229],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.destination"],s:'_0?"good":"average"'},p:[28,18,1242]}]},f:[{t:2,x:{r:["data.destination"],s:'_0?_0:"None"'},p:[28,60,1284]}]}]}]}," ",{t:4,f:[{p:{button:[{t:4,f:[{p:[35,9,1513],t:7,e:"ui-button",a:{icon:"eject",action:"unload"},f:["Unload"]}],n:50,r:"data.load",p:[34,7,1486]}," ",{t:4,f:[{p:[38,9,1623],t:7,e:"ui-button",a:{icon:"eject",action:"ejectpai"},f:["Eject PAI"]}],n:50,r:"data.haspai",p:[37,7,1594]}," ",{p:[40,7,1709],t:7,e:"ui-button",a:{icon:"pencil",action:"setid"},f:["Set ID"]}]},t:7,e:"ui-display",a:{title:"Controls",button:0},f:[" ",{p:[42,5,1791],t:7,e:"ui-section",a:{label:"Destination"},f:[{p:[43,7,1831],t:7,e:"ui-button",a:{icon:"pencil",action:"destination"},f:["Set Destination"]}," ",{p:[44,7,1912],t:7,e:"ui-button",a:{icon:"stop",action:"stop"},f:["Stop"]}," ",{p:[45,7,1973],t:7,e:"ui-button",a:{icon:"play",action:"go"},f:["Go"]}]}," ",{p:[47,5,2047],t:7,e:"ui-section",a:{label:"Home"},f:[{p:[48,7,2080],t:7,e:"ui-button",a:{icon:"home",action:"home"},f:["Go Home"]}," ",{p:[49,7,2144],t:7,e:"ui-button",a:{icon:"pencil",action:"sethome"},f:["Set Home"]}]}," ",{p:[51,5,2231],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[52,7,2268],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoReturn"],s:'_0?"check-square-o":"square-o"'},p:[52,24,2285]}],style:[{t:2,x:{r:["data.autoReturn"],s:'_0?"selected":null'},p:[52,84,2345]}],action:"autoret"},f:["Auto-Return Home"]}," ",{p:[54,7,2449],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoPickup"],s:'_0?"check-square-o":"square-o"'},p:[54,24,2466]}],style:[{t:2,x:{r:["data.autoPickup"],s:'_0?"selected":null'},p:[54,84,2526]}],action:"autopick"},f:["Auto-Pickup Crate"]}," ",{p:[56,7,2632],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.reportDelivery"],s:'_0?"check-square-o":"square-o"'},p:[56,24,2649]}],style:[{t:2,x:{r:["data.reportDelivery"],s:'_0?"selected":null'},p:[56,88,2713]}],action:"report"},f:["Report Deliveries"]}]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[31,1,1373]}]},e.exports=a.extend(r.exports)},{205:205}],271:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Relay"},f:[{t:4,f:[{p:[3,3,57],t:7,e:"h2",f:["NETWORK BUFFERS OVERLOADED"]}," ",{p:[4,3,96],t:7,e:"h3",f:["Overload Recovery Mode"]}," ",{p:[5,3,131],t:7,e:"i",f:["This system is suffering temporary outage due to overflow of traffic buffers. Until buffered traffic is processed, all further requests will be dropped. Frequent occurences of this error may indicate insufficient hardware capacity of your network. Please contact your network planning department for instructions on how to resolve this issue."]}," ",{p:[6,3,484],t:7,e:"h3",f:["ADMINISTRATIVE OVERRIDE"]}," ",{p:[7,3,520],t:7,e:"b",f:["CAUTION - Data loss may occur"]}," ",{p:[8,3,562],t:7,e:"ui-button",a:{icon:"signal",action:"restart"},f:["Purge buffered traffic"]}],n:50,r:"data.dos_crashed",p:[2,2,29]},{t:4,n:51,f:[{p:[12,3,663],t:7,e:"ui-section",a:{label:"Relay status"},f:[{p:[13,4,701],t:7,e:"ui-button",a:{icon:"power-off",action:"toggle"},f:[{t:2,x:{r:["data.enabled"],s:'_0?"ENABLED":"DISABLED"'},p:[14,6,752]}]}]}," ",{p:[18,3,836],t:7,e:"ui-section",a:{label:"Network buffer status"},f:[{t:2,r:"data.dos_overload",p:[19,4,883]}," / ",{t:2,r:"data.dos_capacity",p:[19,28,907]}," GQ"]}],r:"data.dos_crashed"}]}]},e.exports=a.extend(r.exports)},{205:205}],272:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{healthState:function(){var t=this.get("data.health");return t>70?"good":t>50?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[15,1,320],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[18,3,363],t:7,e:"ui-notice",f:[{p:[19,5,380],t:7,e:"span",f:["Reconstruction in progress!"]}]}],n:50,r:"data.restoring",p:[17,1,337]},{p:[24,1,451],t:7,e:"ui-display",f:[{p:[26,1,467],t:7,e:"div",a:{"class":"item"},f:[{p:[27,3,489],t:7,e:"div",a:{"class":"itemLabel"},f:["Inserted AI:"]}," ",{p:[30,3,541],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[31,2,569],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",state:[{t:2,x:{r:["data.nocard"],s:'_0?"disabled":null'},p:[31,52,619]}]},f:[{t:2,x:{r:["data.name"],s:'_0?_0:"---"'},p:[31,89,656]}]}]}]}," ",{t:4,f:[{p:[36,2,744],t:7,e:"b",f:["ERROR: ",{t:2,r:"data.error",p:[36,12,754]}]}],n:50,r:"data.error",p:[35,1,723]},{t:4,n:51,f:[{p:[38,2,785],t:7,e:"h2",f:["System Status"]}," ",{p:[39,2,810],t:7,e:"div",a:{"class":"item"},f:[{p:[40,3,832],t:7,e:"div",a:{"class":"itemLabel"},f:["Current AI:"]}," ",{p:[43,3,885],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.name",p:[44,4,915]}]}," ",{p:[46,3,942],t:7,e:"div",a:{"class":"itemLabel"},f:["Status:"]}," ",{p:[49,3,991],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["Nonfunctional"],n:50,r:"data.isDead",p:[50,4,1021]},{t:4,n:51,f:["Functional"],r:"data.isDead"}]}," ",{p:[56,3,1114],t:7,e:"div",a:{"class":"itemLabel"},f:["System Integrity:"]}," ",{p:[59,3,1173],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[60,4,1203],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.health",p:[60,37,1236]}],state:[{t:2,r:"healthState",p:[61,11,1264]}]},f:[{t:2,x:{r:["adata.health"],s:"Math.round(_0)"},p:[61,28,1281]},"%"]}]}," ",{p:[63,3,1336],t:7,e:"div",a:{"class":"itemLabel"},f:["Active Laws:"]}," ",{p:[66,3,1390],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[67,4,1420],t:7,e:"table",f:[{t:4,f:[{p:[69,6,1462],t:7,e:"tr",f:[{p:[69,10,1466],t:7,e:"td",f:[{p:[69,14,1470],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:".",p:[69,38,1494]}]}]}]}],n:52,r:"data.ai_laws",p:[68,5,1433]}]}]}," ",{p:[73,2,1547],t:7,e:"ui-section",a:{label:"Operations"},f:[{p:[74,3,1582],t:7,e:"ui-button",a:{icon:"plus",style:[{t:2,x:{r:["data.restoring"],s:'_0?"disabled":null'},p:[74,33,1612]}],action:"PRG_beginReconstruction"},f:["Begin Reconstruction"]}]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],273:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[5,1,91],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"home",params:'{"target" : "mod"}',state:[{t:2,x:{r:["data.mmode"],s:'_0==1?"disabled":null'},p:[5,80,170]}]},f:["Access Modification"]}],n:50,r:"data.have_id_slot",p:[4,1,64]},{p:[7,1,253],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"folder-open",params:'{"target" : "manage"}',state:[{t:2,x:{r:["data.mmode"],s:'_0==2?"disabled":null'},p:[7,90,342]}]},f:["Job Management"]}," ",{p:[8,1,411],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"folder-open",params:'{"target" : "manifest"}',state:[{t:2,x:{r:["data.mmode"],s:'!_0?"disabled":null'},p:[8,92,502]}]},f:["Crew Manifest"]}," ",{t:4,f:[{p:[10,1,593],t:7,e:"ui-button",a:{action:"PRG_print",icon:"print",state:[{t:2,x:{r:["data.has_id","data.mmode"],s:'!_1||_0&&_1==1?null:"disabled"'},p:[10,51,643]}]},f:["Print"]}],n:50,r:"data.have_printer",p:[9,1,566]},{t:4,f:[{p:[14,1,766],t:7,e:"div",a:{"class":"item"},f:[{p:[15,3,788],t:7,e:"h2",f:["Crew Manifest"]}," ",{p:[16,3,814],t:7,e:"br"},"Please use security record computer to modify entries.",{p:[16,61,872],t:7,e:"br"},{p:[16,65,876],t:7,e:"br"}]}," ",{t:4,f:[{p:[19,2,916],t:7,e:"div",a:{"class":"item"},f:[{t:2,r:"name",p:[20,2,937]}," - ",{t:2,r:"rank",p:[20,13,948]}]}],n:52,r:"data.manifest",p:[18,1,890]}],n:50,x:{r:["data.mmode"],s:"!_0"},p:[13,1,745]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.mmode"],s:"_0==2"},f:[{p:[25,1,1008],t:7,e:"div",a:{"class":"item"},f:[{p:[26,3,1030],t:7,e:"h2",f:["Job Management"]}]}," ",{p:[28,1,1063],t:7,e:"table",f:[{p:[29,1,1072],t:7,e:"tr",f:[{p:[29,5,1076],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,27,1098],t:7,e:"b",f:["Job"]}]},{p:[29,42,1113],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,64,1135],t:7,e:"b",f:["Slots"]}]},{p:[29,81,1152],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,103,1174],t:7,e:"b",f:["Open job"]}]},{p:[29,123,1194],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,145,1216],t:7,e:"b",f:["Close job"]}]}]}," ",{t:4,f:[{p:[32,2,1269],t:7,e:"tr",f:[{p:[32,6,1273],t:7,e:"td",f:[{t:2,r:"title",p:[32,10,1277]}]},{p:[32,24,1291],t:7,e:"td",f:[{t:2,r:"current",p:[32,28,1295]},"/",{t:2,r:"total",p:[32,40,1307]}]},{p:[32,54,1321],t:7,e:"td",f:[{p:[32,58,1325],t:7,e:"ui-button",a:{action:"PRG_open_job",params:['{"target" : "',{t:2,r:"title",p:[32,112,1379]},'"}'],state:[{t:2,x:{r:["status_open"],s:'_0?null:"disabled"'},p:[32,132,1399]}]},f:[{t:2,r:"desc_open",p:[32,169,1436]}]},{p:[32,194,1461],t:7,e:"br"}]},{p:[32,203,1470],t:7,e:"td",f:[{p:[32,207,1474],t:7,e:"ui-button",a:{action:"PRG_close_job",params:['{"target" : "',{t:2,r:"title",p:[32,262,1529]},'"}'],state:[{t:2,x:{r:["status_close"],s:'_0?null:"disabled"'},p:[32,282,1549]}]},f:[{t:2,r:"desc_close",p:[32,320,1587]}]}]}]}],n:52,r:"data.slots",p:[30,1,1244]}]}]},{t:4,n:50,x:{r:["data.mmode"],s:"!(_0==2)"},f:[" ",{p:[40,1,1665],t:7,e:"div",a:{"class":"item"},f:[{p:[41,3,1687],t:7,e:"h2",f:["Access Modification"]}]}," ",{t:4,f:[{p:[45,3,1751],t:7,e:"span",a:{"class":"alert"},f:[{p:[45,23,1771],t:7,e:"i",f:["Please insert the ID into the terminal to proceed."]}]},{p:[45,87,1835],t:7,e:"br"}],n:50,x:{r:["data.has_id"],s:"!_0"},p:[44,1,1727]},{p:[48,1,1852],t:7,e:"div",a:{"class":"item"},f:[{p:[49,3,1874],t:7,e:"div",a:{"class":"itemLabel"},f:["Target Identity:"]}," ",{p:[52,3,1930],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[53,2,1958],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",params:'{"target" : "id"}'},f:[{t:2,r:"data.id_name",p:[53,72,2028]}]}]}]}," ",{p:[56,1,2076],t:7,e:"div",a:{"class":"item"},f:[{p:[57,3,2098],t:7,e:"div",a:{"class":"itemLabel"},f:["Auth Identity:"]}," ",{p:[60,3,2152],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[61,2,2180],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",params:'{"target" : "auth"}'},f:[{t:2,r:"data.auth_name",p:[61,74,2252]}]}]}]}," ",{p:[64,1,2302],t:7,e:"hr"}," ",{t:4,f:[{t:4,f:[{p:[68,2,2362],t:7,e:"div",a:{"class":"item"},f:[{p:[69,4,2385],t:7,e:"h2",f:["Details"]}]}," ",{t:4,f:[{p:[73,2,2436],t:7,e:"div",a:{"class":"item"},f:[{p:[74,4,2459],t:7,e:"div",a:{"class":"itemLabel"},f:["Registered Name:"]}," ",{p:[77,4,2518],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.id_owner",p:[78,3,2547]}]}]}," ",{p:[81,2,2587],t:7,e:"div",a:{"class":"item"},f:[{p:[82,4,2610],t:7,e:"div",a:{"class":"itemLabel"},f:["Rank:"]}," ",{p:[85,4,2658],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.id_rank",p:[86,3,2687]}]}]}," ",{p:[89,2,2726],t:7,e:"div",a:{"class":"item"},f:[{p:[90,4,2749],t:7,e:"div",a:{"class":"itemLabel"},f:["Demote:"]}," ",{p:[93,4,2799],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[94,3,2828],t:7,e:"ui-button",a:{action:"PRG_terminate",icon:"gear",state:[{t:2,x:{r:["data.id_rank"],s:'_0=="Unassigned"?"disabled":null'},p:[94,56,2881]}]},f:["Demote ",{t:2,r:"data.id_owner",p:[94,117,2942]}]}]}]}],n:50,r:"data.minor",p:[72,2,2415]},{t:4,n:51,f:[{p:[99,2,3007],t:7,e:"div",a:{"class":"item"},f:[{p:[100,4,3030],t:7,e:"div",a:{"class":"itemLabel"},f:["Registered Name:"]}," ",{p:[103,4,3089],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[104,3,3118],t:7,e:"ui-button",a:{action:"PRG_edit",icon:"pencil",params:'{"name" : "1"}'},f:[{t:2,r:"data.id_owner",p:[104,70,3185]}]}]}]}," ",{p:[108,2,3239],t:7,e:"div",a:{"class":"item"},f:[{p:[109,4,3262],t:7,e:"h2",f:["Assignment"]}]}," ",{p:[111,3,3294],t:7,e:"ui-button",a:{action:"PRG_togglea",icon:"gear"},f:[{t:2,x:{r:["data.assignments"],s:'_0?"Hide assignments":"Show assignments"'},p:[111,47,3338]}]}," ",{p:[112,2,3415],t:7,e:"div",a:{"class":"item"},f:[{p:[113,4,3438],t:7,e:"span",a:{id:"allvalue.jobsslot"},f:[]}]}," ",{p:[117,2,3495],t:7,e:"div",a:{"class":"item"},f:[{t:4,f:[{p:[119,4,3547],t:7,e:"div",a:{id:"all-value.jobs"},f:[{p:[120,3,3576],t:7,e:"table",f:[{p:[121,5,3589],t:7,e:"tr",f:[{p:[122,4,3598],t:7,e:"th",f:["Command"]}," ",{p:[123,4,3619],t:7,e:"td",f:[{p:[124,6,3630],t:7,e:"ui-button",a:{action:"PRG_assign",params:'{"assign_target" : "Captain"}',state:[{t:2,x:{r:["data.id_rank"],s:'_0=="Captain"?"selected":null'},p:[124,83,3707]}]},f:["Captain"]}]}]}," ",{p:[127,5,3804],t:7,e:"tr",f:[{p:[128,4,3813],t:7,e:"th",f:["Special"]}," ",{p:[129,4,3834],t:7,e:"td",f:[{p:[130,6,3845],t:7,e:"ui-button",a:{action:"PRG_assign",params:'{"assign_target" : "Custom"}'},f:["Custom"]}]}]}," ",{p:[133,5,3959],t:7,e:"tr",f:[{p:[134,4,3968],t:7,e:"th",a:{style:"color: '#FFA500';"},f:["Engineering"]}," ",{p:[135,4,4019],t:7,e:"td",f:[{t:4,f:[{p:[137,5,4067],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[137,64,4126]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[137,82,4144]}]},f:[{t:2,r:"display_name",p:[137,127,4189]}]}],n:52,r:"data.engineering_jobs",p:[136,6,4030]}]}]}," ",{p:[141,5,4260],t:7,e:"tr",f:[{p:[142,4,4269],t:7,e:"th",a:{style:"color: '#008000';"},f:["Medical"]}," ",{p:[143,4,4316],t:7,e:"td",f:[{t:4,f:[{p:[145,5,4360],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[145,64,4419]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[145,82,4437]}]},f:[{t:2,r:"display_name",p:[145,127,4482]}]}],n:52,r:"data.medical_jobs",p:[144,6,4327]}]}]}," ",{p:[149,5,4553],t:7,e:"tr",f:[{p:[150,4,4562],t:7,e:"th",a:{style:"color: '#800080';"},f:["Science"]}," ",{p:[151,4,4609],t:7,e:"td",f:[{t:4,f:[{p:[153,5,4653],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[153,64,4712]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[153,82,4730]}]},f:[{t:2,r:"display_name",p:[153,127,4775]}]}],n:52,r:"data.science_jobs",p:[152,6,4620]}]}]}," ",{p:[157,5,4846],t:7,e:"tr",f:[{p:[158,4,4855],t:7,e:"th",a:{style:"color: '#DD0000';"},f:["Security"]}," ",{p:[159,4,4903],t:7,e:"td",f:[{t:4,f:[{p:[161,5,4948],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[161,64,5007]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[161,82,5025]}]},f:[{t:2,r:"display_name",p:[161,127,5070]}]}],n:52,r:"data.security_jobs",p:[160,6,4914]}]}]}," ",{p:[165,5,5141],t:7,e:"tr",f:[{p:[166,4,5150],t:7,e:"th",a:{style:"color: '#cc6600';"},f:["Cargo"]}," ",{p:[167,4,5195],t:7,e:"td",f:[{t:4,f:[{p:[169,5,5237],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[169,64,5296]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[169,82,5314]}]},f:[{t:2,r:"display_name",p:[169,127,5359]}]}],n:52,r:"data.cargo_jobs",p:[168,6,5206]}]}]}," ",{p:[173,5,5430],t:7,e:"tr",f:[{p:[174,4,5439],t:7,e:"th",a:{style:"color: '#808080';"},f:["Civilian"]}," ",{p:[175,4,5487],t:7,e:"td",f:[{t:4,f:[{p:[177,5,5532],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[177,64,5591]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[177,82,5609]}]},f:[{t:2,r:"display_name",p:[177,127,5654]}]}],n:52,r:"data.civilian_jobs",p:[176,6,5498]}]}]}," ",{t:4,f:[{p:[182,4,5757],t:7,e:"tr",f:[{p:[183,6,5768],t:7,e:"th",a:{style:"color: '#A52A2A';"},f:["CentCom"]}," ",{p:[184,6,5817],t:7,e:"td",f:[{t:4,f:[{p:[186,7,5862],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[186,66,5921]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[186,84,5939]}]},f:[{t:2,r:"display_name",p:[186,129,5984]}]}],n:52,r:"data.centcom_jobs",p:[185,5,5827]}]}]}],n:50,r:"data.centcom_access",p:[181,5,5725]}]}]}],n:50,r:"data.assignments",p:[118,4,3518]}]}],r:"data.minor"}," ",{t:4,f:[{p:[198,4,6153],t:7,e:"div",a:{"class":"item"},f:[{p:[199,3,6175],t:7,e:"h2",f:["Central Command"]}]}," ",{p:[201,4,6215],t:7,e:"div",a:{"class":"item",style:"width: 100%"},f:[{t:4,f:[{p:[203,5,6296],t:7,e:"div",a:{"class":"itemContentWide"},f:[{p:[204,5,6331],t:7,e:"ui-button",a:{action:"PRG_access",params:['{"access_target" : "',{t:2,r:"ref",p:[204,64,6390]},'", "allowed" : "',{t:2,r:"allowed",p:[204,87,6413]},'"}'],state:[{t:2,x:{r:["allowed"],s:'_0?"toggle":null'},p:[204,109,6435]}]},f:[{t:2,r:"desc",p:[204,140,6466]}]}]}],n:52,r:"data.all_centcom_access",p:[202,3,6257]}]}],n:50,r:"data.centcom_access",p:[197,2,6121]},{t:4,n:51,f:[{p:[209,4,6538],t:7,e:"div",a:{"class":"item"},f:[{p:[210,3,6560],t:7,e:"h2",f:[{t:2,r:"data.station_name",p:[210,7,6564]}]}]}," ",{p:[212,4,6606],t:7,e:"div",a:{"class":"item",style:"width: 100%"},f:[{t:4,f:[{p:[214,5,6676],t:7,e:"div",a:{style:"float: left; width: 175px; min-height: 250px"},f:[{p:[215,4,6739],t:7,e:"div",a:{"class":"average"},f:[{p:[215,25,6760],t:7,e:"ui-button",a:{action:"PRG_regsel",state:[{t:2,x:{r:["selected"],s:'_0?"toggle":null'},p:[215,63,6798]}],params:['{"region" : "',{t:2,r:"regid",p:[215,116,6851]},'"}']},f:[{p:[215,129,6864],t:7,e:"b",f:[{t:2,r:"name",p:[215,132,6867]}]}]}]}," ",{p:[216,4,6902],t:7,e:"br"}," ",{t:4,f:[{p:[218,6,6938],t:7,e:"div",a:{"class":"itemContentWide"},f:[{p:[219,5,6973],t:7,e:"ui-button",a:{action:"PRG_access",params:['{"access_target" : "',{t:2,r:"ref",p:[219,64,7032]},'", "allowed" : "',{t:2,r:"allowed",p:[219,87,7055]},'"}'],state:[{t:2,x:{r:["allowed"],s:'_0?"toggle":null'},p:[219,109,7077]}]},f:[{t:2,r:"desc",p:[219,140,7108]}]}]}],n:52,r:"accesses",p:[217,6,6913]}]}],n:52,r:"data.regions",p:[213,3,6648]}]}],r:"data.centcom_access"}],n:50,r:"data.has_id",p:[67,3,2340]}],n:50,r:"data.authenticated",p:[66,1,2310]}]}],x:{r:["data.mmode"],s:"!_0"}}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],274:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{chargeState:function(t){var e=this.get("data.battery.max");return t>e/2?"good":t>e/4?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[15,1,311],t:7,e:"ntosheader"}," ",{p:[17,1,328],t:7,e:"ui-display",f:[{p:[18,2,343],t:7,e:"i",f:["Welcome to computer configuration utility. Please consult your system administrator if you have any questions about your device."]},{p:[18,137,478],t:7,e:"hr"}," ",{p:[19,2,485],t:7,e:"ui-display",a:{title:"Power Supply"},f:[{p:[20,3,522],t:7,e:"ui-section",a:{label:"Power Usage"},f:[{t:2,r:"data.power_usage",p:[21,4,559]},"W"]}," ",{t:4,f:[{p:[25,4,630],t:7,e:"ui-section",a:{label:"Battery Status"},f:["Active"]}," ",{p:[28,4,701],t:7,e:"ui-section",a:{label:"Battery Rating"},f:[{t:2,r:"data.battery.max",p:[29,5,742]}]}," ",{p:[31,4,785],t:7,e:"ui-section",a:{label:"Battery Charge"},f:[{p:[32,5,826],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.battery.max",p:[32,26,847]}],value:[{t:2,r:"adata.battery.charge",p:[32,56,877]}],state:[{t:2,x:{r:["chargeState","adata.battery.charge"],s:"_0(_1)"},p:[32,89,910]}]},f:[{t:2,x:{r:["adata.battery.charge"],s:"Math.round(_0)"},p:[32,128,949]},"/",{t:2,r:"adata.battery.max",p:[32,165,986]}]}]}],n:50,r:"data.battery",p:[24,3,605]},{t:4,n:51,f:[{p:[35,4,1051],t:7,e:"ui-section",a:{label:"Battery Status"},f:["Not Available"]}],r:"data.battery"}]}," ",{p:[41,2,1156],t:7,e:"ui-display",a:{title:"File System"},f:[{p:[42,3,1192],t:7,e:"ui-section",a:{label:"Used Capacity"},f:[{p:[43,4,1231],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.disk_size",p:[43,25,1252]}],value:[{t:2,r:"adata.disk_used",p:[43,53,1280]}],state:"good"},f:[{t:2,x:{r:["adata.disk_used"],s:"Math.round(_0)"},p:[43,87,1314]},"GQ / ",{t:2,r:"adata.disk_size",p:[43,123,1350]},"GQ"]}]}]}," ",{p:[47,2,1419],t:7,e:"ui-display",a:{title:"Computer Components"},f:[{t:4,f:[{p:[49,4,1491],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"name",p:[49,26,1513]}]},f:[{p:[50,5,1529],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"desc",p:[50,59,1583]}]}," ",{p:[52,5,1605],t:7,e:"ui-section",a:{label:"State"},f:[{p:[53,6,1638],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["critical"],s:'_0?"disabled":null'},p:[53,24,1656]}],action:"PC_toggle_component",params:['{"name": "',{t:2,r:"name",p:[53,105,1737]},'"}']},f:[{t:2,x:{r:["enabled"],s:'_0?"Enabled":"Disabled"'},p:[54,7,1757]}]}]}," ",{t:4,f:[{p:[59,6,1868],t:7,e:"ui-section",a:{label:"Power Usage"},f:[{t:2,r:"powerusage",p:[60,7,1908]},"W"]}],n:50,r:"powerusage",p:[58,5,1843]}]}," ",{p:[64,4,1985],t:7,e:"br"}],n:52,r:"data.hardware",p:[48,3,1463]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],275:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[7,3,103],t:7,e:"h2",f:["An error has occurred and this program can not continue."]}," Additional information: ",{t:2,r:"data.error",p:[8,27,196]},{p:[8,41,210],t:7,e:"br"}," ",{p:[9,3,218],t:7,e:"i",f:["Please try again. If the problem persists contact your system administrator for assistance."]}," ",{p:[10,3,320],t:7,e:"ui-button",a:{action:"PRG_closefile"},f:["Restart program"]}],n:50,r:"data.error",p:[6,2,81]},{t:4,n:51,f:[{t:4,f:[{p:[13,4,422],t:7,e:"h2",f:["Viewing file ",{t:2,r:"data.filename",p:[13,21,439]}]}," ",{p:[14,4,466],t:7,e:"div",a:{"class":"item"},f:[{p:[15,4,489],t:7,e:"ui-button",a:{action:"PRG_closefile"},f:["CLOSE"]}," ",{p:[16,4,545],t:7,e:"ui-button",a:{action:"PRG_edit"},f:["EDIT"]}," ",{p:[17,4,595],t:7,e:"ui-button",a:{action:"PRG_printfile"},f:["PRINT"]}," "]},{p:[18,10,657],t:7,e:"hr"}," ",{t:3,r:"data.filedata",p:[19,4,666]}],n:50,r:"data.filename",p:[12,3,396]},{t:4,n:51,f:[{p:[21,4,702],t:7,e:"h2",f:["Available files (local):"]}," ",{p:[22,4,740],t:7,e:"table",f:[{p:[23,5,753],t:7,e:"tr",f:[{p:[24,6,764],t:7,e:"th",f:["File name"]}," ",{p:[25,6,789],t:7,e:"th",f:["File type"]}," ",{p:[26,6,814],t:7,e:"th",f:["File size (GQ)"]}," ",{p:[27,6,844],t:7,e:"th",f:["Operations"]}]}," ",{t:4,f:[{p:[30,6,907],t:7,e:"tr",f:[{p:[31,7,919],t:7,e:"td",f:[{t:2,r:"name",p:[31,11,923]}]}," ",{p:[32,7,944],t:7,e:"td",f:[".",{t:2,r:"type",p:[32,12,949]}]}," ",{p:[33,7,970],t:7,e:"td",f:[{t:2,r:"size",p:[33,11,974]},"GQ"]}," ",{p:[34,7,997],t:7,e:"td",f:[{p:[35,8,1010],t:7,e:"ui-button",a:{action:"PRG_openfile",params:['{"name": "',{t:2,r:"name",p:[35,59,1061]},'"}']},f:["VIEW"]}," ",{p:[36,8,1098],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[36,26,1116]}],action:"PRG_deletefile",params:['{"name": "',{t:2,r:"name",p:[36,105,1195]},'"}']},f:["DELETE"]}," ",{p:[37,8,1234],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[37,26,1252]}],action:"PRG_rename",params:['{"name": "',{t:2,r:"name",p:[37,101,1327]},'"}']},f:["RENAME"]}," ",{p:[38,8,1366],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[38,26,1384]}],action:"PRG_clone",params:['{"name": "',{t:2,r:"name",p:[38,100,1458]},'"}']},f:["CLONE"]}," ",{t:4,f:[{p:[40,9,1531],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[40,27,1549]}],action:"PRG_copytousb",params:['{"name": "',{t:2,r:"name",p:[40,105,1627]},'"}']},f:["EXPORT"]}],n:50,r:"data.usbconnected",p:[39,8,1496]}]}]}],n:52,r:"data.files",p:[29,5,880]}]}," ",{t:4,f:[{p:[47,4,1761],t:7,e:"h2",f:["Available files (portable device):"]}," ",{p:[48,4,1809],t:7,e:"table",f:[{p:[49,5,1822],t:7,e:"tr",f:[{p:[50,6,1833],t:7,e:"th",f:["File name"]}," ",{p:[51,6,1858],t:7,e:"th",f:["File type"]}," ",{p:[52,6,1883],t:7,e:"th",f:["File size (GQ)"]}," ",{p:[53,6,1913],t:7,e:"th",f:["Operations"]}]}," ",{t:4,f:[{p:[56,6,1979],t:7,e:"tr",f:[{p:[57,7,1991],t:7,e:"td",f:[{t:2,r:"name",p:[57,11,1995]}]}," ",{p:[58,7,2016],t:7,e:"td",f:[".",{t:2,r:"type",p:[58,12,2021]}]}," ",{p:[59,7,2042],t:7,e:"td",f:[{t:2,r:"size",p:[59,11,2046]},"GQ"]}," ",{p:[60,7,2069],t:7,e:"td",f:[{p:[61,8,2082],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[61,26,2100]}],action:"PRG_usbdeletefile",params:['{"name": "',{t:2,r:"name",p:[61,108,2182]},'"}']},f:["DELETE"]}," ",{t:4,f:[{p:[63,9,2256],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[63,27,2274]}],action:"PRG_copyfromusb",params:['{"name": "',{t:2,r:"name",p:[63,107,2354]},'"}']},f:["IMPORT"]}],n:50,r:"data.usbconnected",p:[62,8,2221]}]}]}],n:52,r:"data.usbfiles",p:[55,5,1949]}]}],n:50,r:"data.usbconnected",p:[46,4,1731]}," ",{p:[70,4,2470],t:7,e:"ui-button",a:{action:"PRG_newtextfile"},f:["NEW DATA FILE"]}],r:"data.filename"}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],276:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"i",f:["No program loaded. Please select program from list below."]}," ",{p:[6,2,146],t:7,e:"table",f:[{t:4,f:[{p:[8,4,185],t:7,e:"tr",f:[{p:[8,8,189],t:7,e:"td",f:[{p:[8,12,193],t:7,e:"ui-button",a:{action:"PC_runprogram",params:['{"name": "',{t:2,r:"name",p:[8,64,245]},'"}']},f:[{t:2,r:"desc",p:[9,5,263]}]}]},{p:[11,4,293],t:7,e:"td",f:[{p:[11,8,297],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["running"],s:'_0?null:"disabled"'},p:[11,26,315]}],icon:"close",action:"PC_killprogram",params:['{"name": "',{t:2,r:"name",p:[11,114,403]},'"}']}}]}]}],n:52,r:"data.programs",p:[7,3,157]}]}," ",{p:[14,2,454],t:7,e:"br"},{p:[14,6,458],t:7,e:"br"}," ",{t:4,f:[{p:[16,3,491],t:7,e:"ui-button",a:{action:"PC_toggle_light",style:[{t:2,x:{r:["data.light_on"],s:'_0?"selected":null'},p:[16,46,534]}]},f:["Toggle Flashlight"]},{p:[16,114,602],t:7,e:"br"}," ",{p:[17,3,610],t:7,e:"ui-button",a:{action:"PC_light_color"},f:["Change Flashlight Color ",{p:[17,62,669],t:7,e:"span",a:{style:["border:1px solid #161616; background-color: ",{t:2,r:"data.comp_light_color",p:[17,119,726]},";"]},f:[" "]}]}],n:50,r:"data.has_light",p:[15,2,465]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],277:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[6,3,105],t:7,e:"h1",f:["ADMINISTRATIVE MODE"]}],n:50,r:"data.adminmode",p:[5,2,79]}," ",{t:4,f:[{p:[10,3,170],t:7,e:"div",a:{"class":"itemLabel"},f:["Current channel:"]}," ",{p:[13,3,229],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.title",p:[14,4,259]}]}," ",{p:[16,3,287],t:7,e:"div",a:{"class":"itemLabel"},f:["Operator access:"]}," ",{p:[19,3,346],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:[{p:[21,5,406],t:7,e:"b",f:["Enabled"]}],n:50,r:"data.is_operator",p:[20,4,376]},{t:4,n:51,f:[{p:[23,5,439],t:7,e:"b",f:["Disabled"]}],r:"data.is_operator"}]}," ",{p:[26,3,480],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[29,3,532],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[30,4,562],t:7,e:"table",f:[{p:[31,5,575],t:7,e:"tr",f:[{p:[31,9,579],t:7,e:"td",f:[{p:[31,13,583],t:7,e:"ui-button",a:{action:"PRG_speak"},f:["Send message"]}]}]},{p:[32,5,643],t:7,e:"tr",f:[{p:[32,9,647],t:7,e:"td",f:[{p:[32,13,651],t:7,e:"ui-button",a:{action:"PRG_changename"},f:["Change nickname"]}]}]},{p:[33,5,719],t:7,e:"tr",f:[{p:[33,9,723],t:7,e:"td",f:[{p:[33,13,727],t:7,e:"ui-button",a:{action:"PRG_toggleadmin"},f:["Toggle administration mode"]}]}]},{p:[34,5,807],t:7,e:"tr",f:[{p:[34,9,811],t:7,e:"td",f:[{p:[34,13,815],t:7,e:"ui-button",a:{action:"PRG_leavechannel"},f:["Leave channel"]}]}]},{p:[35,5,883],t:7,e:"tr",f:[{p:[35,9,887],t:7,
+e:"td",f:[{p:[35,13,891],t:7,e:"ui-button",a:{action:"PRG_savelog"},f:["Save log to local drive"]}," ",{t:4,f:[{p:[37,6,995],t:7,e:"tr",f:[{p:[37,10,999],t:7,e:"td",f:[{p:[37,14,1003],t:7,e:"ui-button",a:{action:"PRG_renamechannel"},f:["Rename channel"]}]}]},{p:[38,6,1074],t:7,e:"tr",f:[{p:[38,10,1078],t:7,e:"td",f:[{p:[38,14,1082],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}]}]},{p:[39,6,1149],t:7,e:"tr",f:[{p:[39,10,1153],t:7,e:"td",f:[{p:[39,14,1157],t:7,e:"ui-button",a:{action:"PRG_deletechannel"},f:["Delete channel"]}]}]}],n:50,r:"data.is_operator",p:[36,5,964]}]}]}]}]}," ",{p:[43,3,1263],t:7,e:"b",f:["Chat Window"]}," ",{p:[44,4,1286],t:7,e:"div",a:{"class":"statusDisplay",style:"overflow: auto;"},f:[{p:[45,4,1342],t:7,e:"div",a:{"class":"item"},f:[{p:[46,5,1366],t:7,e:"div",a:{"class":"itemContent",style:"width: 100%;"},f:[{t:4,f:[{t:2,r:"msg",p:[48,7,1450]},{p:[48,14,1457],t:7,e:"br"}],n:52,r:"data.messages",p:[47,6,1419]}]}]}]}," ",{p:[53,3,1516],t:7,e:"b",f:["Connected Users"]},{p:[53,25,1538],t:7,e:"br"}," ",{t:4,f:[{t:2,r:"name",p:[55,4,1573]},{p:[55,12,1581],t:7,e:"br"}],n:52,r:"data.clients",p:[54,3,1546]}],n:50,r:"data.title",p:[9,2,148]},{t:4,n:51,f:[{p:[58,3,1613],t:7,e:"b",f:["Controls:"]}," ",{p:[59,3,1633],t:7,e:"table",f:[{p:[60,4,1645],t:7,e:"tr",f:[{p:[60,8,1649],t:7,e:"td",f:[{p:[60,12,1653],t:7,e:"ui-button",a:{action:"PRG_changename"},f:["Change nickname"]}]}]},{p:[61,4,1720],t:7,e:"tr",f:[{p:[61,8,1724],t:7,e:"td",f:[{p:[61,12,1728],t:7,e:"ui-button",a:{action:"PRG_newchannel"},f:["New Channel"]}]}]},{p:[62,4,1791],t:7,e:"tr",f:[{p:[62,8,1795],t:7,e:"td",f:[{p:[62,12,1799],t:7,e:"ui-button",a:{action:"PRG_toggleadmin"},f:["Toggle administration mode"]}]}]}]}," ",{p:[64,3,1889],t:7,e:"b",f:["Available channels:"]}," ",{p:[65,3,1919],t:7,e:"table",f:[{t:4,f:[{p:[67,4,1964],t:7,e:"tr",f:[{p:[67,8,1968],t:7,e:"td",f:[{p:[67,12,1972],t:7,e:"ui-button",a:{action:"PRG_joinchannel",params:['{"id": "',{t:2,r:"id",p:[67,64,2024]},'"}']},f:[{t:2,r:"chan",p:[67,74,2034]}]},{p:[67,94,2054],t:7,e:"br"}]}]}],n:52,r:"data.all_channels",p:[66,3,1930]}]}],r:"data.title"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],278:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:["##SYSTEM ERROR: ",{t:2,r:"data.error",p:[6,19,117]},{p:[6,33,131],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["RESET"]}],n:50,r:"data.error",p:[5,2,79]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.target"],s:"_0"},f:["##DoS traffic generator active. Tx: ",{t:2,r:"data.speed",p:[8,39,243]},"GQ/s",{p:[8,57,261],t:7,e:"br"}," ",{t:4,f:[{t:2,r:"nums",p:[10,4,300]},{p:[10,12,308],t:7,e:"br"}],n:52,r:"data.dos_strings",p:[9,3,269]}," ",{p:[12,3,329],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["ABORT"]}]},{t:4,n:50,x:{r:["data.target"],s:"!(_0)"},f:[" ##DoS traffic generator ready. Select target device.",{p:[14,55,443],t:7,e:"br"}," ",{t:4,f:["Targeted device ID: ",{t:2,r:"data.focus",p:[16,24,494]}],n:50,r:"data.focus",p:[15,3,451]},{t:4,n:51,f:["Targeted device ID: None"],r:"data.focus"}," ",{p:[20,3,564],t:7,e:"ui-button",a:{action:"PRG_execute"},f:["EXECUTE"]},{p:[20,54,615],t:7,e:"div",a:{style:"clear:both"}}," Detected devices on network:",{p:[21,31,677],t:7,e:"br"}," ",{t:4,f:[{p:[23,4,711],t:7,e:"ui-button",a:{action:"PRG_target_relay",params:['{"targid": "',{t:2,r:"id",p:[23,61,768]},'"}']},f:[{t:2,r:"id",p:[23,71,778]}]}],n:52,r:"data.relays",p:[22,3,685]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],279:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"i",f:["Welcome to software download utility. Please select which software you wish to download."]},{p:[5,97,174],t:7,e:"hr"}," ",{t:4,f:[{p:[7,3,203],t:7,e:"ui-display",a:{title:"Download Error"},f:[{p:[8,4,243],t:7,e:"ui-section",a:{label:"Information"},f:[{t:2,r:"data.error",p:[9,5,281]}]}," ",{p:[11,4,318],t:7,e:"ui-section",a:{label:"Reset Program"},f:[{p:[12,5,358],t:7,e:"ui-button",a:{icon:"times",action:"PRG_reseterror"},f:["RESET"]}]}]}],n:50,r:"data.error",p:[6,2,181]},{t:4,n:51,f:[{t:4,f:[{p:[19,4,516],t:7,e:"ui-display",a:{title:"Download Running"},f:[{p:[20,5,559],t:7,e:"i",f:["Please wait..."]}," ",{p:[21,5,586],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"data.downloadname",p:[22,6,623]}]}," ",{p:[24,5,669],t:7,e:"ui-section",a:{label:"File description"},f:[{t:2,r:"data.downloaddesc",p:[25,6,713]}]}," ",{p:[27,5,759],t:7,e:"ui-section",a:{label:"File size"},f:[{t:2,r:"data.downloadsize",p:[28,6,796]},"GQ"]}," ",{p:[30,5,844],t:7,e:"ui-section",a:{label:"Transfer Rate"},f:[{t:2,r:"data.downloadspeed",p:[31,6,885]}," GQ/s"]}," ",{p:[33,5,937],t:7,e:"ui-section",a:{label:"Download progress"},f:[{p:[34,6,982],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.downloadsize",p:[34,27,1003]}],value:[{t:2,r:"adata.downloadcompletion",p:[34,58,1034]}],state:"good"},f:[{t:2,x:{r:["adata.downloadcompletion"],s:"Math.round(_0)"},p:[34,101,1077]},"GQ / ",{t:2,r:"adata.downloadsize",p:[34,146,1122]},"GQ"]}]}]}],n:50,r:"data.downloadname",p:[18,3,486]}],r:"data.error"}," ",{t:4,f:[{t:4,f:[{p:[41,4,1270],t:7,e:"ui-display",a:{title:"File System"},f:[{p:[42,5,1308],t:7,e:"ui-section",a:{label:"Used Capacity"},f:[{p:[43,6,1349],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.disk_size",p:[43,27,1370]}],value:[{t:2,r:"adata.disk_used",p:[43,55,1398]}],state:"good"},f:[{t:2,x:{r:["adata.disk_used"],s:"Math.round(_0)"},p:[43,89,1432]},"GQ / ",{t:2,r:"adata.disk_size",p:[43,125,1468]},"GQ"]}]}]}," ",{p:[47,4,1545],t:7,e:"ui-display",a:{title:"Primary Software Repository"},f:[{t:4,f:[{p:[49,6,1642],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"filedesc",p:[49,28,1664]}]},f:[{p:[50,7,1686],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"fileinfo",p:[50,61,1740]}]}," ",{p:[52,7,1774],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"filename",p:[53,8,1813]}," (",{t:2,r:"size",p:[53,22,1827]}," GQ)"]}," ",{p:[55,7,1868],t:7,e:"ui-section",a:{label:"Compatibility"},f:[{t:2,r:"compatibility",p:[56,8,1911]}]}," ",{p:[58,7,1957],t:7,e:"ui-button",a:{icon:"signal",action:"PRG_downloadfile",params:['{"filename": "',{t:2,r:"filename",p:[58,80,2030]},'"}']},f:["DOWNLOAD"]}]}," ",{p:[62,6,2113],t:7,e:"br"}],n:52,r:"data.downloadable_programs",p:[48,5,1599]}]}," ",{t:4,f:[{p:[67,5,2194],t:7,e:"ui-display",a:{title:"UNKNOWN Software Repository"},f:[{p:[68,6,2249],t:7,e:"i",f:["Please note that Nanotrasen does not recommend download of software from non-official servers."]}," ",{t:4,f:[{p:[70,7,2395],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"filedesc",p:[70,29,2417]}]},f:[{p:[71,8,2440],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"fileinfo",p:[71,62,2494]}]}," ",{p:[73,8,2530],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"filename",p:[74,9,2570]}," (",{t:2,r:"size",p:[74,23,2584]}," GQ)"]}," ",{p:[76,8,2627],t:7,e:"ui-section",a:{label:"Compatibility"},f:[{t:2,r:"compatibility",p:[77,9,2671]}]}," ",{p:[79,8,2719],t:7,e:"ui-button",a:{icon:"signal",action:"PRG_downloadfile",params:['{"filename": "',{t:2,r:"filename",p:[79,81,2792]},'"}']},f:["DOWNLOAD"]}]}," ",{p:[83,7,2879],t:7,e:"br"}],n:52,r:"data.hacked_programs",p:[69,6,2357]}]}],n:50,r:"data.hackedavailable",p:[66,4,2160]}],n:50,x:{r:["data.error"],s:"!_0"},p:[40,3,1246]}],n:50,x:{r:["data.downloadname"],s:"!_0"},p:[39,2,1216]}," ",{p:[89,2,2954],t:7,e:"br"},{p:[89,6,2958],t:7,e:"br"},{p:[89,10,2962],t:7,e:"hr"},{p:[89,14,2966],t:7,e:"i",f:["NTOS v2.0.4b Copyright Nanotrasen 2557 - 2559"]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],280:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[6,2,81],t:7,e:"ui-display",a:{title:"WIRELESS CONNECTIVITY"},f:[{p:[8,3,129],t:7,e:"ui-section",a:{label:"Active NTNetRelays"},f:[{p:[9,4,173],t:7,e:"b",f:[{t:2,r:"data.ntnetrelays",p:[9,7,176]}]}]}," ",{t:4,f:[{p:[12,4,250],t:7,e:"ui-section",a:{label:"System status"},f:[{p:[13,6,291],t:7,e:"b",f:[{t:2,x:{r:["data.ntnetstatus"],s:'_0?"ENABLED":"DISABLED"'},p:[13,9,294]}]}]}," ",{p:[15,4,366],t:7,e:"ui-section",a:{label:"Control"},f:[{p:[17,4,401],t:7,e:"ui-button",a:{icon:"plus",action:"toggleWireless"},f:["TOGGLE"]}]}," ",{p:[21,4,500],t:7,e:"br"},{p:[21,8,504],t:7,e:"br"}," ",{p:[22,4,513],t:7,e:"i",f:["Caution - Disabling wireless transmitters when using wireless device may prevent you from re-enabling them again!"]}],n:50,r:"data.ntnetrelays",p:[11,3,221]},{t:4,n:51,f:[{p:[24,4,650],t:7,e:"br"},{p:[24,8,654],t:7,e:"p",f:["Wireless coverage unavailable, no relays are connected."]}],r:"data.ntnetrelays"}]}," ",{p:[29,2,750],t:7,e:"ui-display",a:{title:"FIREWALL CONFIGURATION"},f:[{p:[31,2,798],t:7,e:"table",f:[{p:[32,3,809],t:7,e:"tr",f:[{p:[33,4,818],t:7,e:"th",f:["PROTOCOL"]},{p:[34,4,835],t:7,e:"th",f:["STATUS"]},{p:[35,4,850],t:7,e:"th",f:["CONTROL"]}]},{p:[36,3,865],t:7,e:"tr",f:[" ",{p:[37,4,874],t:7,e:"td",f:["Software Downloads"]},{p:[38,4,901],t:7,e:"td",f:[{t:2,x:{r:["data.config_softwaredownload"],s:'_0?"ENABLED":"DISABLED"'},p:[38,8,905]}]},{p:[39,4,967],t:7,e:"td",f:[" ",{p:[39,9,972],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "1"}'},f:["TOGGLE"]}]}]},{p:[40,3,1051],t:7,e:"tr",f:[" ",{p:[41,4,1060],t:7,e:"td",f:["Peer to Peer Traffic"]},{p:[42,4,1089],t:7,e:"td",f:[{t:2,x:{r:["data.config_peertopeer"],s:'_0?"ENABLED":"DISABLED"'},p:[42,8,1093]}]},{p:[43,4,1149],t:7,e:"td",f:[{p:[43,8,1153],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "2"}'},f:["TOGGLE"]}]}]},{p:[44,3,1232],t:7,e:"tr",f:[" ",{p:[45,4,1241],t:7,e:"td",f:["Communication Systems"]},{p:[46,4,1271],t:7,e:"td",f:[{t:2,x:{r:["data.config_communication"],s:'_0?"ENABLED":"DISABLED"'},p:[46,8,1275]}]},{p:[47,4,1334],t:7,e:"td",f:[{p:[47,8,1338],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "3"}'},f:["TOGGLE"]}]}]},{p:[48,3,1417],t:7,e:"tr",f:[" ",{p:[49,4,1426],t:7,e:"td",f:["Remote System Control"]},{p:[50,4,1456],t:7,e:"td",f:[{t:2,x:{r:["data.config_systemcontrol"],s:'_0?"ENABLED":"DISABLED"'},p:[50,8,1460]}]},{p:[51,4,1519],t:7,e:"td",f:[{p:[51,8,1523],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "4"}'},f:["TOGGLE"]}]}]}]}]}," ",{p:[55,2,1630],t:7,e:"ui-display",a:{title:"SECURITY SYSTEMS"},f:[{t:4,f:[{p:[58,4,1699],t:7,e:"ui-notice",f:[{p:[59,5,1716],t:7,e:"h1",f:["NETWORK INCURSION DETECTED"]}]}," ",{p:[61,5,1774],t:7,e:"i",f:["An abnormal activity has been detected in the network. Please verify system logs for more information"]}],n:50,r:"data.idsalarm",p:[57,3,1673]}," ",{p:[64,3,1902],t:7,e:"ui-section",a:{label:"Intrusion Detection System"},f:[{p:[65,4,1954],t:7,e:"b",f:[{t:2,x:{r:["data.idsstatus"],s:'_0?"ENABLED":"DISABLED"'},p:[65,7,1957]}]}]}," ",{p:[68,3,2029],t:7,e:"ui-section",a:{label:"Maximal Log Count"},f:[{p:[69,4,2072],t:7,e:"b",f:[{t:2,r:"data.ntnetmaxlogs",p:[69,7,2075]}]}]}," ",{p:[72,3,2125],t:7,e:"ui-section",a:{label:"Controls"},f:[]}," ",{p:[74,4,2176],t:7,e:"table",f:[{p:[75,4,2188],t:7,e:"tr",f:[{p:[75,8,2192],t:7,e:"td",f:[{p:[75,12,2196],t:7,e:"ui-button",a:{action:"resetIDS"},f:["RESET IDS"]}]}]},{p:[76,4,2251],t:7,e:"tr",f:[{p:[76,8,2255],t:7,e:"td",f:[{p:[76,12,2259],t:7,e:"ui-button",a:{action:"toggleIDS"},f:["TOGGLE IDS"]}]}]},{p:[77,4,2316],t:7,e:"tr",f:[{p:[77,8,2320],t:7,e:"td",f:[{p:[77,12,2324],t:7,e:"ui-button",a:{action:"updatemaxlogs"},f:["SET LOG LIMIT"]}]}]},{p:[78,4,2388],t:7,e:"tr",f:[{p:[78,8,2392],t:7,e:"td",f:[{p:[78,12,2396],t:7,e:"ui-button",a:{action:"purgelogs"},f:["PURGE LOGS"]}]}]}]}," ",{p:[81,3,2467],t:7,e:"ui-subdisplay",a:{title:"System Logs"},f:[{p:[82,3,2506],t:7,e:"div",a:{"class":"statusDisplay",style:"overflow: auto;"},f:[{p:[83,3,2561],t:7,e:"div",a:{"class":"item"},f:[{p:[84,4,2584],t:7,e:"div",a:{"class":"itemContent",style:"width: 100%;"},f:[{t:4,f:[{t:2,r:"entry",p:[86,6,2667]},{p:[86,15,2676],t:7,e:"br"}],n:52,r:"data.ntnetlogs",p:[85,5,2636]}]}]}]}]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],281:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[7,2,102],t:7,e:"div",a:{"class":"item"},f:[{p:[8,3,124],t:7,e:"h2",f:["An error has occurred during operation..."]}," ",{p:[9,3,178],t:7,e:"b",f:["Additional information:"]},{t:2,r:"data.error",p:[9,34,209]},{p:[9,48,223],t:7,e:"br"}," ",{p:[10,3,231],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Clear"]}]}],n:50,r:"data.error",p:[6,2,81]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.downloading"],s:"_0"},f:[{p:[13,3,321],t:7,e:"h2",f:["Download in progress..."]}," ",{p:[14,3,357],t:7,e:"div",a:{"class":"itemLabel"},f:["Downloaded file:"]}," ",{p:[17,3,416],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_name",p:[18,4,446]}]}," ",{p:[20,3,483],t:7,e:"div",a:{"class":"itemLabel"},f:["Download progress:"]}," ",{p:[23,3,544],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_progress",p:[24,4,574]}," / ",{t:2,r:"data.download_size",p:[24,33,603]}," GQ"]}," ",{p:[26,3,642],t:7,e:"div",a:{"class":"itemLabel"},f:["Transfer speed:"]}," ",{p:[29,3,700],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_netspeed",p:[30,4,730]},"GQ/s"]}," ",{p:[32,3,774],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[35,3,826],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[36,4,856],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Abort download"]}]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading"],s:"(!(_0))&&(_1)"},f:[" ",{p:[39,3,954],t:7,e:"h2",f:["Server enabled"]}," ",{p:[40,3,981],t:7,e:"div",a:{"class":"itemLabel"},f:["Connected clients:"]}," ",{p:[43,3,1042],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.upload_clients",p:[44,4,1072]}]}," ",{p:[46,3,1109],t:7,e:"div",a:{"class":"itemLabel"},f:["Provided file:"]}," ",{p:[49,3,1166],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.upload_filename",p:[50,4,1196]}]}," ",{p:[52,3,1234],t:7,e:"div",a:{"class":"itemLabel"},f:["Server password:"]}," ",{p:[55,3,1293],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["ENABLED"],n:50,r:"data.upload_haspassword",p:[56,4,1323]},{t:4,n:51,f:["DISABLED"],r:"data.upload_haspassword"}]}," ",{p:[62,3,1420],t:7,e:"div",a:{"class":"itemLabel"},f:["Commands:"]}," ",{p:[65,3,1472],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[66,4,1502],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}," ",{p:[67,4,1567],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Exit server"]}]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading","data.upload_filelist"],s:"(!(_0))&&((!(_1))&&(_2))"},f:[" ",{p:[70,3,1668],t:7,e:"h2",f:["File transfer server ready. Select file to upload:"]}," ",{p:[71,3,1732],t:7,e:"table",f:[{p:[72,3,1743],t:7,e:"tr",f:[{p:[72,7,1747],t:7,e:"th",f:["File name"]},{p:[72,20,1760],t:7,e:"th",f:["File size"]},{p:[72,33,1773],t:7,e:"th",f:["Controls ",{t:4,f:[{p:[74,4,1824],t:7,e:"tr",f:[{p:[74,8,1828],t:7,e:"td",f:[{t:2,r:"filename",p:[74,12,1832]}]},{p:[75,4,1849],t:7,e:"td",f:[{t:2,r:"size",p:[75,8,1853]},"GQ"]},{p:[76,4,1868],t:7,e:"td",f:[{p:[76,8,1872],t:7,e:"ui-button",a:{action:"PRG_uploadfile",params:['{"id": "',{t:2,r:"uid",p:[76,59,1923]},'"}']},f:["Select"]}]}]}],n:52,r:"data.upload_filelist",p:[73,3,1789]}]}]}]}," ",{p:[79,3,1981],t:7,e:"hr"}," ",{p:[80,3,1989],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}," ",{p:[81,3,2053],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Return"]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading","data.upload_filelist"],s:"(!(_0))&&((!(_1))&&(!(_2)))"},f:[" ",{p:[83,3,2116],t:7,e:"h2",f:["Available files:"]}," ",{p:[84,3,2145],t:7,e:"table",a:{border:"1",style:"border-collapse: collapse"},f:[{p:[84,55,2197],t:7,e:"tr",f:[{p:[84,59,2201],t:7,e:"th",f:["Server UID"]},{p:[84,73,2215],t:7,e:"th",f:["File Name"]},{p:[84,86,2228],t:7,e:"th",f:["File Size"]},{p:[84,99,2241],t:7,e:"th",f:["Password Protection"]},{p:[84,122,2264],t:7,e:"th",f:["Operations ",{t:4,f:[{p:[86,5,2311],t:7,e:"tr",f:[{p:[86,9,2315],t:7,e:"td",f:[{t:2,r:"uid",p:[86,13,2319]}]},{p:[87,5,2332],t:7,e:"td",f:[{t:2,r:"filename",p:[87,9,2336]}]},{p:[88,5,2354],t:7,e:"td",f:[{t:2,r:"size",p:[88,9,2358]},"GQ ",{t:4,f:[{p:[90,6,2400],t:7,e:"td",f:["Enabled"]}],n:50,r:"haspassword",p:[89,5,2374]}," ",{t:4,f:[{p:[93,6,2457],t:7,e:"td",f:["Disabled"]}],n:50,x:{r:["haspassword"],s:"!_0"},p:[92,5,2430]}]},{p:[96,5,2494],t:7,e:"td",f:[{p:[96,9,2498],t:7,e:"ui-button",a:{action:"PRG_downloadfile",params:['{"id": "',{t:2,r:"uid",p:[96,62,2551]},'"}']},f:["Download"]}]}]}],n:52,r:"data.servers",p:[85,4,2283]}]}]}]}," ",{p:[99,3,2612],t:7,e:"hr"}," ",{p:[100,3,2620],t:7,e:"ui-button",a:{action:"PRG_uploadmenu"},f:["Send file"]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],282:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{chargingState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}},chargingMode:function(t){return 2==t?"Full":1==t?"Charging":"Draining"},channelState:function(t){return t>=2?"good":"bad"},channelPower:function(t){return t>=2?"On":"Off"},channelMode:function(t){return 1==t||3==t?"Auto":"Manual"}},computed:{graphData:function(){var t=this.get("data.history");return Object.keys(t).map(function(e){return t[e].map(function(t,e){return{x:e,y:t}})})}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[43,1,1082],t:7,e:"ntosheader"}," ",{p:[45,1,1099],t:7,e:"ui-display",a:{title:"Network"},f:[{t:4,f:[{p:[47,5,1157],t:7,e:"ui-linegraph",a:{points:[{t:2,r:"graphData",p:[47,27,1179]}],height:"500",legend:'["Available", "Load"]',colors:'["rgb(0, 102, 0)", "rgb(153, 0, 0)"]',xunit:"seconds ago",xfactor:[{t:2,r:"data.interval",p:[49,38,1331]}],yunit:"W",yfactor:"1",xinc:[{t:2,x:{r:["data.stored"],s:"_0/10"},p:[50,15,1387]}],yinc:"9"}}],n:50,r:"config.fancy",p:[46,3,1131]},{t:4,n:51,f:[{p:[52,5,1437],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[53,7,1475],t:7,e:"span",f:[{t:2,r:"data.supply",p:[53,13,1481]}]}]}," ",{p:[55,5,1528],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[56,9,1563],t:7,e:"span",f:[{t:2,r:"data.demand",p:[56,15,1569]}]}]}],r:"config.fancy"}]}," ",{p:[60,1,1638],t:7,e:"ui-display",a:{title:"Areas"},f:[{p:[61,3,1668],t:7,e:"ui-section",a:{nowrap:0},f:[{p:[62,5,1693],t:7,e:"div",a:{"class":"content"},f:["Area"]}," ",{p:[63,5,1730],t:7,e:"div",a:{"class":"content"},f:["Charge"]}," ",{p:[64,5,1769],t:7,e:"div",a:{"class":"content"},f:["Load"]}," ",{p:[65,5,1806],t:7,e:"div",a:{"class":"content"},f:["Status"]}," ",{p:[66,5,1845],t:7,e:"div",a:{"class":"content"},f:["Equipment"]}," ",{p:[67,5,1887],t:7,e:"div",a:{"class":"content"},f:["Lighting"]}," ",{p:[68,5,1928],t:7,e:"div",a:{"class":"content"},f:["Environment"]}]}," ",{t:4,f:[{p:[71,5,2013],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[71,24,2032]}],nowrap:0},f:[{p:[72,7,2057],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].charge)"},p:[72,28,2078]}," %"]}," ",{p:[73,7,2136],t:7,e:"div",a:{"class":"content"},f:[{t:2,rx:{r:"adata.areas",m:[{t:30,n:"@index"},"load"]},p:[73,28,2157]}]}," ",{p:[74,7,2199],t:7,e:"div",a:{"class":"content"},f:[{p:[74,28,2220],t:7,e:"span",a:{"class":[{t:2,x:{r:["chargingState","charging"],s:"_0(_1)"},p:[74,41,2233]}]},f:[{t:2,x:{r:["chargingMode","charging"],s:"_0(_1)"},p:[74,70,2262]}]}]}," ",{p:[75,7,2309],t:7,e:"div",a:{"class":"content"},f:[{p:[75,28,2330],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","eqp"],s:"_0(_1)"},p:[75,41,2343]}]},f:[{t:2,x:{r:["channelPower","eqp"],s:"_0(_1)"},p:[75,64,2366]}," [",{p:[75,87,2389],t:7,e:"span",f:[{t:2,x:{r:["channelMode","eqp"],s:"_0(_1)"},p:[75,93,2395]}]},"]"]}]}," ",{p:[76,7,2444],t:7,e:"div",a:{"class":"content"},f:[{p:[76,28,2465],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","lgt"],s:"_0(_1)"},p:[76,41,2478]}]},f:[{t:2,x:{r:["channelPower","lgt"],s:"_0(_1)"},p:[76,64,2501]}," [",{p:[76,87,2524],t:7,e:"span",f:[{t:2,x:{r:["channelMode","lgt"],s:"_0(_1)"},p:[76,93,2530]}]},"]"]}]}," ",{p:[77,7,2579],t:7,e:"div",a:{"class":"content"},f:[{p:[77,28,2600],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","env"],s:"_0(_1)"},p:[77,41,2613]}]},f:[{t:2,x:{r:["channelPower","env"],s:"_0(_1)"},p:[77,64,2636]}," [",{p:[77,87,2659],t:7,e:"span",f:[{t:2,x:{r:["channelMode","env"],s:"_0(_1)"},p:[77,93,2665]}]},"]"]}]}]}],n:52,r:"data.areas",p:[70,3,1987]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],283:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"div",a:{"class":"item"},f:[{p:[6,3,101],t:7,e:"div",a:{"class":"itemLabel"},f:["Payload status:"]}," ",{p:[9,3,158],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["ARMED"],n:50,r:"data.armed",p:[10,4,188]},{t:4,n:51,f:["DISARMED"],r:"data.armed"}]}," ",{p:[16,3,270],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[19,3,321],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[20,4,351],t:7,e:"table",f:[{p:[21,4,363],t:7,e:"tr",f:[{p:[21,8,367],t:7,e:"td",f:[{p:[21,12,371],t:7,e:"ui-button",a:{action:"PRG_obfuscate"},f:["OBFUSCATE PROGRAM NAME"]}]}]},{p:[22,4,444],t:7,e:"tr",f:[{p:[22,8,448],t:7,e:"td",f:[{p:[22,12,452],t:7,e:"ui-button",a:{action:"PRG_arm",state:[{t:2,x:{r:["data.armed"],s:'_0?"danger":null'},p:[22,47,487]}]},f:[{t:2,x:{r:["data.armed"],s:'_0?"DISARM":"ARM"'},p:[22,81,521]}]}," ",{p:[23,4,571],t:7,e:"ui-button",a:{icon:"radiation",state:[{t:2,x:{r:["data.armed"],s:'_0?null:"disabled"'},p:[23,39,606]}],action:"PRG_activate"},f:["ACTIVATE"]}]}]}]}]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],284:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[5,3,95],t:7,e:"ui-display",a:{title:[{t:2,r:"class",p:[5,22,114]}," Alarms"]},f:[{p:[6,5,138],t:7,e:"ul",f:[{t:4,f:[{p:[8,9,171],t:7,e:"li",f:[{t:2,r:".",p:[8,13,175]}]}],n:52,r:".",p:[7,7,150]},{t:4,n:51,f:[{p:[10,9,211],t:7,e:"li",f:["System Nominal"]}],r:"."}]}]}],n:52,i:"class",r:"data.alarms",p:[4,1,64]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],285:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{integState:function(t){var e=100;return t==e?"good":t>e/2?"average":"bad"},bigState:function(t,e,n){return charge>n?"bad":t>e?"average":"good"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[23,1,421],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[27,2,462],t:7,e:"ui-button",a:{action:"PRG_clear"},f:["Back to Menu"]},{p:[27,56,516],t:7,e:"br"}," ",{p:[28,3,524],t:7,e:"ui-display",a:{title:"Supermatter Status:"},f:[{p:[29,3,568],t:7,e:"ui-section",a:{label:"Core Integrity"},f:[{p:[30,5,609],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"adata.SM_integrity",p:[30,38,642]}],state:[{t:2,x:{r:["integState","adata.SM_integrity"],s:"_0(_1)"},p:[30,69,673]}]},f:[{t:2,r:"data.SM_integrity",p:[30,105,709]},"%"]}]}," ",{p:[32,3,761],t:7,e:"ui-section",a:{label:"Relative EER"},f:[{p:[33,5,800],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_power"],s:"_0(_1,150,300)"},p:[33,18,813]}]},f:[{t:2,r:"data.SM_power",p:[33,55,850]}," MeV/cm3"]}]}," ",{p:[35,3,903],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[36,5,941],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_ambienttemp"],s:"_0(_1,4000,5000)"},p:[36,18,954]}]},f:[{t:2,r:"data.SM_ambienttemp",p:[36,63,999]}," K"]}]}," ",{p:[38,3,1052],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[39,5,1087],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_ambientpressure"],s:"_0(_1,5000,10000)"},p:[39,18,1100]}]},f:[{t:2,r:"data.SM_ambientpressure",p:[39,68,1150]}," kPa"]}]}]}," ",{p:[42,3,1227],t:7,e:"hr"},{p:[42,7,1231],t:7,e:"br"}," ",{p:[43,3,1239],t:7,e:"ui-display",a:{title:"Gas Composition:"},f:[{t:4,f:[{p:[45,5,1307],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[45,24,1326]}]},f:[{t:2,r:"amount",p:[46,6,1343]}," %"]}],n:52,r:"data.gases",p:[44,4,1281]}]}],n:50,r:"data.active",p:[26,1,440]},{t:4,n:51,f:[{p:[51,2,1418],t:7,e:"ui-button",a:{action:"PRG_refresh"},f:["Refresh"]},{p:[51,53,1469],t:7,e:"br"}," ",{p:[52,2,1476],t:7,e:"ui-display",a:{title:"Detected Supermatters"},f:[{t:4,f:[{p:[54,3,1552],t:7,e:"ui-section",a:{label:"Area"},f:[{t:2,r:"area_name",p:[55,5,1583]}," - (#",{t:2,r:"uid",p:[55,23,1601]},")"]}," ",{p:[57,3,1630],t:7,e:"ui-section",a:{label:"Integrity"},f:[{t:2,r:"integrity",p:[58,5,1666]}," %"]}," ",{p:[60,3,1702],t:7,e:"ui-section",a:{label:"Options"},f:[{p:[61,5,1736],t:7,e:"ui-button",a:{action:"PRG_set",params:['{"target" : "',{t:2,r:"uid",p:[61,54,1785]},'"}']},f:["View Details"]}]}],n:52,r:"data.supermatters",p:[53,2,1521]}]}],r:"data.active"}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],286:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"item",style:"float: left"},f:[{p:[2,2,41],t:7,e:"table",f:[{p:[2,9,48],t:7,e:"tr",f:[{t:4,f:[{p:[4,3,113],t:7,e:"td",f:[{p:[4,7,117],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[4,17,127]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[3,2,55]}," ",{t:4,f:[{p:[7,3,226],t:7,e:"td",f:[{p:[7,7,230],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[7,10,233]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[6,2,165]}," ",{t:4,f:[{p:[10,3,305],t:7,e:"td",f:[{p:[10,7,309],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[10,17,319]}]}}]}],n:50,r:"data.PC_ntneticon",p:[9,2,276]}," ",{t:4,f:[{p:[13,3,386],t:7,e:"td",f:[{p:[13,7,390],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[13,17,400]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[12,2,355]}," ",{t:4,f:[{p:[16,3,469],t:7,e:"td",f:[{p:[16,7,473],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[16,10,476]}]}]}],n:50,r:"data.PC_stationtime",p:[15,2,438]}," ",{t:4,f:[{p:[19,3,552],t:7,e:"td",f:[{p:[19,7,556],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[19,17,566]}]}}]}],n:52,r:"data.PC_programheaders",p:[18,2,516]}]}]}]}," ",{p:[23,1,609],t:7,e:"div",a:{style:"float: right; margin-top: 5px"},f:[{p:[24,2,655],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[26,3,745],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}," ",{p:[27,3,801],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}],n:50,r:"data.PC_showexitprogram",p:[25,2,710]}]}," ",{p:[30,1,881],t:7,e:"div",a:{style:"clear: both"}}]},e.exports=a.extend(r.exports)},{205:205}],287:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Auth. Disk:"},f:[{t:4,f:[{p:[3,7,69],t:7,e:"ui-button",a:{icon:"eject",style:"selected",action:"eject_disk"},f:["++++++++++"]}],n:50,r:"data.disk_present",p:[2,3,36]},{t:4,n:51,f:[{p:[5,7,172],t:7,e:"ui-button",a:{icon:"plus",action:"insert_disk"},f:["----------"]}],r:"data.disk_present"}]}," ",{p:[8,1,266],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[9,3,297],t:7,e:"span",f:[{t:2,r:"data.status1",p:[9,9,303]},"-",{t:2,r:"data.status2",p:[9,26,320]}]}]}," ",{p:[11,1,360],t:7,e:"ui-display",a:{title:"Timer"},f:[{p:[12,3,390],t:7,e:"ui-section",a:{label:"Time to Detonation"},f:[{p:[13,5,435],t:7,e:"span",f:[{t:2,x:{r:["data.timing","data.time_left","data.timer_set"],s:"_0?_1:_2"},p:[13,11,441]}]}]}," ",{t:4,f:[{p:[16,5,540],t:7,e:"ui-section",a:{label:"Adjust Timer"},f:[{p:[17,7,581],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_default"],s:'_0&&_1&&_2?null:"disabled"'},p:[17,40,614]}],action:"timer",params:'{"change": "reset"}'},f:["Reset"]}," ",{p:[19,7,786],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_min"],s:'_0&&_1&&_2?null:"disabled"'},p:[19,38,817]}],action:"timer",params:'{"change": "decrease"}'},f:["Decrease"]}," ",{p:[21,7,991],t:7,e:"ui-button",a:{icon:"pencil",state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[21,39,1023]}],action:"timer",params:'{"change": "input"}'},f:["Set"]}," ",{p:[22,7,1155],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_max"],s:'_0&&_1&&_2?null:"disabled"'},p:[22,37,1185]}],action:"timer",params:'{"change": "increase"}'},f:["Increase"]}]}],n:51,r:"data.timing",p:[15,3,518]}," ",{p:[26,3,1394],t:7,e:"ui-section",a:{label:"Timer"},f:[{p:[27,5,1426],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"danger":"caution"'},p:[27,38,1459]}],action:"toggle_timer",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.safety"],s:'_0&&_1&&!_2?null:"disabled"'},p:[29,14,1542]}]},f:[{t:2,x:{r:["data.timing"],s:'_0?"On":"Off"'},p:[30,7,1631]}]}]}]}," ",{p:[34,1,1713],t:7,e:"ui-display",a:{title:"Anchoring"},f:[{p:[35,3,1747],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[36,12,1770]}],icon:[{t:2,x:{r:["data.anchored"],s:'_0?"lock":"unlock"'},p:[37,11,1846]}],style:[{t:2,x:{r:["data.anchored"],s:'_0?null:"caution"'},p:[38,12,1897]}],action:"anchor"},f:[{t:2,x:{r:["data.anchored"],s:'_0?"Engaged":"Off"'},p:[39,21,1956]}]}]}," ",{p:[41,1,2022],t:7,e:"ui-display",a:{title:"Safety"},f:[{p:[42,3,2053],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[43,12,2076]}],icon:[{t:2,x:{r:["data.safety"],s:'_0?"lock":"unlock"'},p:[44,11,2152]}],action:"safety",style:[{t:2,x:{r:["data.safety"],s:'_0?"caution":"danger"'},p:[45,12,2217]}]},f:[{p:[46,7,2265],t:7,e:"span",f:[{t:2,x:{r:["data.safety"],s:'_0?"On":"Off"'},p:[46,13,2271]}]}]}]}," ",{p:[49,1,2341],t:7,e:"ui-display",a:{title:"Code"},f:[{p:[50,3,2370],t:7,e:"ui-section",a:{label:"Message"},f:[{t:2,r:"data.message",p:[50,31,2398]}]}," ",{p:[51,3,2431],t:7,e:"ui-section",a:{label:"Keypad"},f:[{p:[52,5,2464],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[52,39,2498]}],params:'{"digit":"1"}'},f:["1"]}," ",{p:[53,5,2583],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[53,39,2617]}],params:'{"digit":"2"}'},f:["2"]}," ",{p:[54,5,2702],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[54,39,2736]}],params:'{"digit":"3"}'},f:["3"]}," ",{p:[55,5,2821],t:7,e:"br"}," ",{p:[56,5,2831],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'
+},p:[56,39,2865]}],params:'{"digit":"4"}'},f:["4"]}," ",{p:[57,5,2950],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[57,39,2984]}],params:'{"digit":"5"}'},f:["5"]}," ",{p:[58,5,3069],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[58,39,3103]}],params:'{"digit":"6"}'},f:["6"]}," ",{p:[59,5,3188],t:7,e:"br"}," ",{p:[60,5,3198],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[60,39,3232]}],params:'{"digit":"7"}'},f:["7"]}," ",{p:[61,5,3317],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[61,39,3351]}],params:'{"digit":"8"}'},f:["8"]}," ",{p:[62,5,3436],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[62,39,3470]}],params:'{"digit":"9"}'},f:["9"]}," ",{p:[63,5,3555],t:7,e:"br"}," ",{p:[64,5,3565],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[64,39,3599]}],params:'{"digit":"R"}'},f:["R"]}," ",{p:[65,5,3684],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[65,39,3718]}],params:'{"digit":"0"}'},f:["0"]}," ",{p:[66,5,3803],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[66,39,3837]}],params:'{"digit":"E"}'},f:["E"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],288:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,25],t:7,e:"ui-notice",f:["No table detected!"]}],n:51,r:"data.table",p:[1,1,0]},{p:[6,1,88],t:7,e:"ui-display",f:[{p:[7,2,103],t:7,e:"ui-display",a:{title:"Patient State"},f:[{t:4,f:[{p:[9,4,166],t:7,e:"ui-section",a:{label:"State"},f:[{p:[10,5,198],t:7,e:"span",a:{"class":[{t:2,r:"data.patient.statstate",p:[10,18,211]}]},f:[{t:2,r:"data.patient.stat",p:[10,46,239]}]}]}," ",{p:[12,4,290],t:7,e:"ui-section",a:{label:"Blood Type"},f:[{p:[13,5,327],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.patient.blood_type",p:[13,27,349]}]}]}," ",{p:[15,4,406],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[16,5,439],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.patient.minHealth",p:[16,18,452]}],max:[{t:2,r:"data.patient.maxHealth",p:[16,51,485]}],value:[{t:2,r:"data.patient.health",p:[16,86,520]}],state:[{t:2,x:{r:["data.patient.health"],s:'_0>=0?"good":"average"'},p:[17,12,557]}]},f:[{t:2,x:{r:["adata.patient.health"],s:"Math.round(_0)"},p:[17,63,608]}]}]}," ",{t:4,f:[{p:[20,5,840],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[20,24,859]}]},f:[{p:[21,6,877],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.patient.maxHealth",p:[21,27,898]}],value:[{t:2,rx:{r:"data.patient",m:[{t:30,n:"type"}]},p:[21,62,933]}],state:"bad"},f:[{t:2,x:{r:["type","adata.patient"],s:"Math.round(_1[_0])"},p:[21,98,969]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Burn",type:"fireLoss"},{label:"Toxin",type:"toxLoss"},{label:"Respiratory",type:"oxyLoss"}]'},p:[19,4,676]}],n:50,r:"data.patient",p:[8,3,141]},{t:4,n:51,f:["No patient detected."],r:"data.patient"}]}," ",{p:[28,2,1113],t:7,e:"ui-display",a:{title:"Initiated Procedures"},f:[{t:4,f:[{t:4,f:[{p:[31,5,1217],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"name",p:[31,27,1239]}]},f:[{p:[32,6,1256],t:7,e:"ui-section",a:{label:"Next Step"},f:[{p:[33,7,1294],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"next_step",p:[33,29,1316]}]}," ",{t:4,f:[{p:[35,8,1373],t:7,e:"span",a:{"class":"content"},f:[{p:[35,30,1395],t:7,e:"b",f:["Required chemicals:"]},{p:[35,56,1421],t:7,e:"br"}," ",{t:2,r:"chems_needed",p:[35,61,1426]}]}],n:50,r:"chems_needed",p:[34,7,1344]}]}," ",{t:4,f:[{p:[39,7,1523],t:7,e:"ui-section",a:{label:"Alternative Step"},f:[{p:[40,8,1569],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"alternative_step",p:[40,30,1591]}]}," ",{t:4,f:[{p:[42,9,1661],t:7,e:"span",a:{"class":"content"},f:[{p:[42,31,1683],t:7,e:"b",f:["Required chemicals:"]},{p:[42,57,1709],t:7,e:"br"}," ",{t:2,r:"chems_needed",p:[42,62,1714]}]}],n:50,r:"alt_chems_needed",p:[41,8,1627]}]}],n:50,r:"alternative_step",p:[38,6,1491]}]}],n:52,r:"data.procedures",p:[30,4,1186]}],n:50,r:"data.procedures",p:[29,3,1158]},{t:4,n:51,f:["No active procedures."],r:"data.procedures"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],289:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"ui-section",f:["This machine only accepts ore. Gibtonite and Slag are not accepted."]}," ",{p:[5,2,117],t:7,e:"ui-section",f:["Current unclaimed points: ",{t:2,r:"data.unclaimedPoints",p:[6,29,159]}," ",{t:4,f:[{p:[8,4,220],t:7,e:"ui-button",a:{action:"Claim"},f:["Claim Points"]}],n:50,r:"data.unclaimedPoints",p:[7,3,187]}]}," ",{p:[13,2,311],t:7,e:"ui-section",f:[{t:4,f:[{p:[15,4,350],t:7,e:"ui-button",a:{action:"Eject"},f:["Eject ID"]}," You have ",{t:2,r:"data.claimedPoints",p:[18,13,421]}," mining points collected."],n:50,r:"data.hasID",p:[14,3,327]},{t:4,n:51,f:[{p:[20,4,485],t:7,e:"ui-button",a:{action:"Insert"},f:["Insert ID"]}],r:"data.hasID"}]}]}," ",{p:[26,1,588],t:7,e:"ui-display",f:[{t:4,f:[{p:[28,3,627],t:7,e:"ui-section",f:[{p:[29,4,644],t:7,e:"ui-button",a:{action:"diskEject",icon:"eject"},f:["Eject Disk"]}]}," ",{t:4,f:[{p:[34,4,772],t:7,e:"ui-section",a:{"class":"candystripe"},f:[{p:[35,5,808],t:7,e:"ui-button",a:{action:"diskUpload",state:[{t:2,x:{r:["canupload"],s:'(_0)?null:"disabled"'},p:[35,42,845]}],icon:"upload",align:"right",params:['{ "design" : "',{t:2,r:"index",p:[35,129,932]},'" }']},f:["Upload"]}," File ",{t:2,r:"index",p:[38,10,988]},": ",{t:2,r:"name",p:[38,21,999]}]}],n:52,r:"data.diskDesigns",p:[33,3,741]}],n:50,r:"data.hasDisk",p:[27,2,603]},{t:4,n:51,f:[{p:[42,3,1053],t:7,e:"ui-section",f:[{p:[43,4,1070],t:7,e:"ui-button",a:{action:"diskInsert",icon:"floppy-o"},f:["Insert Disk"]}]}],r:"data.hasDisk"}]}," ",{p:[49,1,1195],t:7,e:"div",a:{"class":"display tabular"},f:[{p:[50,2,1227],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[51,4,1261],t:7,e:"section",a:{"class":"cell"},f:["Mineral"]}," ",{p:[54,4,1316],t:7,e:"section",a:{"class":"cell"},f:["Sheets"]}," ",{p:[57,4,1370],t:7,e:"section",a:{"class":"cell"},f:[]}," ",{p:[59,4,1412],t:7,e:"section",a:{"class":"cell"},f:[]}," ",{p:[61,4,1454],t:7,e:"section",a:{"class":"cell"},f:["Ore Value"]}]}," ",{t:4,f:[{p:[66,3,1551],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[67,4,1585],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[68,5,1613]}]}," ",{p:[70,4,1641],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[71,5,1683]}]}," ",{p:[73,4,1713],t:7,e:"section",a:{"class":"cell"},f:[{p:[74,5,1741],t:7,e:"input",a:{value:[{t:2,r:"sheets",p:[74,18,1754]}],placeholder:"###","class":"number"}}]}," ",{p:[76,4,1819],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{p:[77,5,1861],t:7,e:"ui-button",a:{"class":"center",grid:0,action:"Release",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[77,59,1915]}],params:['{ "id" : ',{t:2,r:"id",p:[77,114,1970]},', "sheets" : ',{t:2,r:"sheets",p:[77,133,1989]}," }"]},f:["Release"]}]}," ",{p:[81,4,2056],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"value",p:[82,5,2098]}]}]}],n:52,r:"data.materials",p:[65,2,1523]}," ",{t:4,f:[{p:[87,3,2176],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[88,4,2210],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[89,5,2238]}]}," ",{p:[91,4,2266],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[92,5,2308]}]}," ",{p:[94,4,2338],t:7,e:"section",a:{"class":"cell"},f:[{p:[95,5,2366],t:7,e:"input",a:{value:[{t:2,r:"sheets",p:[95,18,2379]}],placeholder:"###","class":"number"}}]}," ",{p:[97,4,2444],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{p:[98,5,2486],t:7,e:"ui-button",a:{"class":"center",grid:0,action:"Smelt",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[98,57,2538]}],params:['{ "id" : ',{t:2,r:"id",p:[98,113,2594]},', "sheets" : ',{t:2,r:"sheets",p:[98,132,2613]}," }"]},f:["Smelt"]}]}," ",{p:[102,4,2677],t:7,e:"section",a:{"class":"cell",align:"right"},f:[]}]}],n:52,r:"data.alloys",p:[86,2,2151]}]}]},e.exports=a.extend(r.exports)},{205:205}],290:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:{button:[{p:[4,4,87],t:7,e:"ui-button",a:{icon:"remove",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[4,36,119]}],action:"empty_eject_beaker"},f:["Empty and eject"]}," ",{p:[7,4,231],t:7,e:"ui-button",a:{icon:"trash",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[7,35,262]}],action:"empty_beaker"},f:["Empty"]}," ",{p:[10,4,358],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[10,35,389]}],action:"eject_beaker"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{t:4,f:[{p:[15,4,528],t:7,e:"ui-section",f:[{t:4,f:[{p:[17,6,578],t:7,e:"span",a:{"class":"bad"},f:["The beaker is empty!"]}],n:50,r:"data.beaker_empty",p:[16,5,546]},{t:4,n:51,f:[{p:[19,6,644],t:7,e:"ui-subdisplay",a:{title:"Blood"},f:[{t:4,f:[{p:[21,8,712],t:7,e:"ui-section",a:{label:"Blood DNA"},f:[{t:2,r:"data.blood.dna",p:[21,38,742]}]}," ",{p:[22,8,782],t:7,e:"ui-section",a:{label:"Blood type"},f:[{t:2,r:"data.blood.type",p:[22,39,813]}]}],n:50,r:"data.has_blood",p:[20,7,681]},{t:4,n:51,f:[{p:[24,8,870],t:7,e:"ui-section",f:[{p:[25,9,892],t:7,e:"span",a:{"class":"average"},f:["No blood sample detected."]}]}],r:"data.has_blood"}]}],r:"data.beaker_empty"}]}],n:50,r:"data.has_beaker",p:[14,3,500]},{t:4,n:51,f:[{p:[32,4,1054],t:7,e:"ui-section",f:[{p:[33,5,1072],t:7,e:"span",a:{"class":"bad"},f:["No beaker loaded."]}]}],r:"data.has_beaker"}]}," ",{t:4,f:[{p:[38,3,1188],t:7,e:"ui-display",a:{title:"Diseases"},f:[{t:4,f:[{p:{button:[{t:4,f:[{p:[43,8,1343],t:7,e:"ui-button",a:{icon:"pencil",action:"rename_disease",state:[{t:2,x:{r:["can_rename"],s:'_0?"":"disabled"'},p:[43,64,1399]}],params:['{"index": ',{t:2,r:"index",p:[43,116,1451]},"}"]},f:["Name advanced disease"]}],n:50,r:"is_adv",p:[42,7,1320]}," ",{p:[47,7,1538],t:7,e:"ui-button",a:{icon:"flask",action:"create_culture_bottle",state:[{t:2,x:{r:["data.is_ready"],s:'_0?"":"disabled"'},p:[47,69,1600]}],params:['{"index": ',{t:2,r:"index",p:[47,124,1655]},"}"]},f:["Create virus culture bottle"]}]},t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[40,24,1269]}],button:0},f:[" ",{p:[51,6,1749],t:7,e:"ui-section",a:{label:"Disease agent"},f:[{t:2,r:"agent",p:[51,40,1783]}]}," ",{p:[52,6,1812],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"description",p:[52,38,1844]}]}," ",{p:[53,6,1879],t:7,e:"ui-section",a:{label:"Spread"},f:[{t:2,r:"spread",p:[53,33,1906]}]}," ",{p:[54,6,1936],t:7,e:"ui-section",a:{label:"Possible cure"},f:[{t:2,r:"cure",p:[54,40,1970]}]}," ",{t:4,f:[{p:[56,7,2021],t:7,e:"ui-section",a:{label:"Symptoms"},f:[{t:4,f:[{p:[58,9,2087],t:7,e:"ui-button",a:{action:"symptom_details",state:"",params:['{"picked_symptom": ',{t:2,r:"sym_index",p:[58,81,2159]},', "index": ',{t:2,r:"index",p:[58,105,2183]},"}"]},f:[{t:2,r:"name",p:[59,10,2206]}," "]},{p:[60,21,2236],t:7,e:"br"}],n:52,r:"symptoms",p:[57,8,2059]}]}," ",{p:[63,7,2289],t:7,e:"ui-section",a:{label:"Resistance"},f:[{t:2,r:"resistance",p:[63,38,2320]}]}," ",{p:[64,7,2355],t:7,e:"ui-section",a:{label:"Stealth"},f:[{t:2,r:"stealth",p:[64,35,2383]}]}," ",{p:[65,7,2415],t:7,e:"ui-section",a:{label:"Stage speed"},f:[{t:2,r:"stage_speed",p:[65,39,2447]}]}," ",{p:[66,7,2483],t:7,e:"ui-section",a:{label:"Transmittability"},f:[{t:2,r:"transmission",p:[66,44,2520]}]}],n:50,r:"is_adv",p:[55,6,1999]}]}],n:52,r:"data.viruses",p:[39,4,1222]},{t:4,n:51,f:[{p:[70,5,2601],t:7,e:"ui-section",f:[{p:[71,6,2620],t:7,e:"span",a:{"class":"average"},f:["No detectable virus in the blood sample."]}]}],r:"data.viruses"}]}," ",{p:[75,3,2743],t:7,e:"ui-display",a:{title:"Antibodies"},f:[{t:4,f:[{p:[77,5,2811],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[77,24,2830]}]},f:[{p:[78,7,2848],t:7,e:"ui-button",a:{icon:"eyedropper",state:[{t:2,x:{r:["data.is_ready"],s:'_0?"":"disabled"'},p:[78,43,2884]}],action:"create_vaccine_bottle",params:['{"index": ',{t:2,r:"id",p:[78,129,2970]},"}"]},f:["Create vaccine bottle"]}]}],n:52,r:"data.resistances",p:[76,4,2779]},{t:4,n:51,f:[{p:[83,5,3067],t:7,e:"ui-section",f:[{p:[84,6,3086],t:7,e:"span",a:{"class":"average"},f:["No antibodies detected in the blood sample."]}]}],r:"data.resistances"}]}],n:50,r:"data.has_blood",p:[37,2,1162]}],n:50,x:{r:["data.mode"],s:"_0==1"},p:[1,1,0]},{t:4,n:51,f:[{p:[90,2,3231],t:7,e:"ui-button",a:{icon:"undo",state:"",action:"back"},f:["Back"]}," ",{t:4,f:[{p:[94,4,3330],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[94,23,3349]}]},f:[{p:[95,4,3364],t:7,e:"ui-section",f:[{t:2,r:"desc",p:[96,5,3382]}," ",{t:4,f:[{p:[98,5,3417],t:7,e:"br"}," ",{p:[99,5,3428],t:7,e:"b",f:["This symptom has been neutered, and has no effect. It will still affect the virus' statistics."]}],n:50,r:"neutered",p:[97,4,3395]}]}," ",{p:[102,4,3564],t:7,e:"ui-section",f:[{p:[103,5,3582],t:7,e:"ui-section",a:{label:"Level"},f:[{t:2,r:"level",p:[103,31,3608]}]}," ",{p:[104,5,3636],t:7,e:"ui-section",a:{label:"Resistance"},f:[{t:2,r:"resistance",p:[104,36,3667]}]}," ",{p:[105,5,3700],t:7,e:"ui-section",a:{label:"Stealth"},f:[{t:2,r:"stealth",p:[105,33,3728]}]}," ",{p:[106,5,3758],t:7,e:"ui-section",a:{label:"Stage speed"},f:[{t:2,r:"stage_speed",p:[106,37,3790]}]}," ",{p:[107,5,3824],t:7,e:"ui-section",a:{label:"Transmittability"},f:[{t:2,r:"transmission",p:[107,42,3861]}]}]}," ",{p:[109,4,3913],t:7,e:"ui-subdisplay",a:{title:"Effect Thresholds"},f:[{p:[110,5,3960],t:7,e:"ui-section",f:[{t:3,r:"threshold_desc",p:[110,17,3972]}]}]}]}],n:53,r:"data.symptom",p:[93,2,3303]}],x:{r:["data.mode"],s:"_0==1"}}]},e.exports=a.extend(r.exports)},{205:205}],291:[function(t,e,n){var a=t(205),r={exports:{}};!function(e){"use strict";var n=t(340);e.exports={data:{filter:"",tooltiptext:function(t,e,n){var a="";return t&&(a+="REQUIREMENTS: "+t+" "),e&&(a+="CATALYSTS: "+e+" "),n&&(a+="TOOLS: "+n),a}},oninit:function(){var t=this;this.on({hover:function(t){this.set("hovered",t.context.params)},unhover:function(t){this.set("hovered")}}),this.observe("filter",function(e,a,r){var i=null;i=t.get("data.display_compact")?t.findAll(".section"):t.findAll(".display:not(:first-child)"),(0,n.filterMulti)(i,t.get("filter").toLowerCase())},{init:!1})}}}(r),r.exports.template={v:3,t:[" ",{p:[48,1,1342],t:7,e:"ui-display",a:{title:[{t:2,r:"data.category",p:[48,20,1361]},{t:4,f:[" : ",{t:2,r:"data.subcategory",p:[48,64,1405]}],n:50,r:"data.subcategory",p:[48,37,1378]}]},f:[{t:4,f:[{p:[50,3,1459],t:7,e:"ui-section",f:["Crafting... ",{p:[51,16,1488],t:7,e:"i",a:{"class":"fa-spin fa fa-spinner"}}]}],n:50,r:"data.busy",p:[49,2,1438]},{t:4,n:51,f:[{p:[54,3,1557],t:7,e:"ui-section",f:[{p:[55,4,1574],t:7,e:"table",a:{style:"width:100%"},f:[{p:[56,5,1606],t:7,e:"tr",f:[{p:[57,6,1617],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[58,7,1659],t:7,e:"ui-button",a:{icon:"arrow-left",action:"backwardCat"},f:[{t:2,r:"data.prev_cat",p:[59,8,1718]}]}]}," ",{p:[62,6,1774],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[63,7,1816],t:7,e:"ui-button",a:{icon:"arrow-right",action:"forwardCat"},f:[{t:2,r:"data.next_cat",p:[64,7,1874]}]}]}," ",{p:[67,6,1930],t:7,e:"td",a:{style:"float:right!important"},f:[{t:4,f:[{p:[69,7,2014],t:7,e:"ui-button",a:{icon:"lock",action:"toggle_recipes"},f:["Showing Craftable Recipes"]}],n:50,r:"data.display_craftable_only",p:[68,6,1971]},{t:4,n:51,f:[{p:[73,7,2138],t:7,e:"ui-button",a:{icon:"unlock",action:"toggle_recipes"},f:["Showing All Recipes"]}],r:"data.display_craftable_only"}]}," ",{p:[78,6,2268],t:7,e:"td",a:{style:"float:right!important"},f:[{p:[79,7,2310],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.display_compact"],s:'_0?"check-square-o":"square-o"'},p:[79,24,2327]}],action:"toggle_compact"},f:["Compact"]}]}]}," ",{p:[84,5,2474],t:7,e:"tr",f:[{t:4,f:[{p:[86,6,2515],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[87,7,2557],t:7,e:"ui-button",a:{icon:"arrow-left",action:"backwardSubCat"},f:[{t:2,r:"data.prev_subcat",p:[88,8,2619]}]}]}," ",{p:[91,6,2678],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[92,7,2720],t:7,e:"ui-button",a:{icon:"arrow-right",action:"forwardSubCat"},f:[{t:2,r:"data.next_subcat",p:[93,8,2782]}]}]}],n:50,r:"data.subcategory",p:[85,5,2484]}]}]}," ",{t:4,f:[{t:4,f:[" ",{p:[101,6,2992],t:7,e:"ui-input",a:{value:[{t:2,r:"filter",p:[101,23,3009]}],placeholder:"Filter.."}}],n:51,r:"data.display_compact",p:[100,5,2902]}],n:50,r:"config.fancy",p:[99,4,2876]}]}," ",{t:4,f:[{p:[106,5,3144],t:7,e:"ui-display",f:[{t:4,f:[{p:[108,6,3193],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[108,25,3212]}]},f:[{p:[109,7,3230],t:7,e:"ui-button",a:{tooltip:[{t:2,x:{r:["tooltiptext","req_text","catalyst_text","tool_text"],s:"_0(_1,_2,_3)"},p:[109,27,3250]}],"tooltip-side":"right",action:"make",params:['{"recipe": "',{t:2,r:"ref",p:[109,135,3358]},'"}'],icon:"gears"},v:{hover:"hover",unhover:"unhover"},f:["Craft"]}]}],n:52,r:"data.can_craft",p:[107,5,3162]}," ",{t:4,f:[{t:4,f:[{p:[116,7,3567],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[116,26,3586]}]},f:[{p:[117,8,3605],t:7,e:"ui-button",a:{tooltip:[{t:2,x:{r:["tooltiptext","req_text","catalyst_text","tool_text"],s:"_0(_1,_2,_3)"},p:[117,28,3625]}],"tooltip-side":"right",state:"disabled",icon:"gears"},v:{hover:"hover",unhover:"unhover"},f:["Craft"]}]}],n:52,r:"data.cant_craft",p:[115,6,3534]}],n:51,r:"data.display_craftable_only",p:[114,5,3495]}]}],n:50,r:"data.display_compact",p:[105,4,3110]},{t:4,n:51,f:[{t:4,f:[{p:[126,6,3947],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[126,25,3966]}]},f:[{t:4,f:[{p:[128,8,4009],t:7,e:"ui-section",a:{label:"Requirements"},f:[{t:2,r:"req_text",p:[129,9,4052]}]}],n:50,r:"req_text",p:[127,7,3984]}," ",{t:4,f:[{p:[133,8,4139],t:7,e:"ui-section",a:{label:"Catalysts"},f:[{t:2,r:"catalyst_text",p:[134,9,4179]}]}],n:50,r:"catalyst_text",p:[132,7,4109]}," ",{t:4,f:[{p:[138,8,4267],t:7,e:"ui-section",a:{label:"Tools"},f:[{t:2,r:"tool_text",p:[139,9,4303]}]}],n:50,r:"tool_text",p:[137,7,4241]}," ",{p:[142,7,4361],t:7,e:"ui-section",f:[{p:[143,8,4382],t:7,e:"ui-button",a:{icon:"gears",action:"make",params:['{"recipe": "',{t:2,r:"ref",p:[143,66,4440]},'"}']},f:["Craft"]}]}]}],n:52,r:"data.can_craft",p:[125,5,3916]}," ",{t:4,f:[{t:4,f:[{p:[151,7,4621],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[151,26,4640]}]},f:[{t:4,f:[{p:[153,9,4685],t:7,e:"ui-section",a:{label:"Requirements"},f:[{t:2,r:"req_text",p:[154,10,4729]}]}],n:50,r:"req_text",p:[152,8,4659]}," ",{t:4,f:[{p:[158,9,4820],t:7,e:"ui-section",a:{label:"Catalysts"},f:[{t:2,r:"catalyst_text",p:[159,10,4861]}]}],n:50,r:"catalyst_text",p:[157,8,4789]}," ",{t:4,f:[{p:[163,9,4953],t:7,e:"ui-section",a:{label:"Tools"},f:[{t:2,r:"tool_text",p:[164,10,4990]}]}],n:50,r:"tool_text",p:[162,8,4926]}]}],n:52,r:"data.cant_craft",p:[150,6,4588]}],n:51,r:"data.display_craftable_only",p:[149,5,4549]}],r:"data.display_compact"}],r:"data.busy"}]}]},e.exports=a.extend(r.exports)},{205:205,340:340}],292:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.holding"],s:'_0?"is":"is not"'},p:[2,23,35]}," connected to a tank."]}]}," ",{p:[4,1,113],t:7,e:"ui-display",a:{title:"Status",button:0},f:[{p:[5,3,151],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[6,5,186],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[6,11,192]}," kPa"]}]}," ",{p:[8,3,254],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[9,5,285],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected"],s:'_0?"good":"average"'},p:[9,18,298]}]},f:[{t:2,x:{r:["data.connected"],s:'_0?"Connected":"Not Connected"'},p:[9,59,339]}]}]}]}," ",{p:[12,1,430],t:7,e:"ui-display",a:{title:"Pump"},f:[{p:[13,3,459],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[14,5,491],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[14,22,508]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":"null"'},p:[15,14,559]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[16,22,616]}]}]}," ",{p:[18,3,675],t:7,e:"ui-section",a:{label:"Direction"},f:[{p:[19,5,711],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.direction"],s:'_0=="out"?"sign-out":"sign-in"'},p:[19,22,728]}],action:"direction"},f:[{t:2,x:{r:["data.direction"],s:'_0=="out"?"Out":"In"'},p:[20,26,808]}]}]}," ",{p:[22,3,883],t:7,e:"ui-section",a:{label:"Target Pressure"},f:[{p:[23,5,925],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.min_pressure",p:[23,18,938]}],max:[{t:2,r:"data.max_pressure",p:[23,46,966]}],value:[{t:2,r:"data.target_pressure",p:[24,14,1003]}]},f:[{t:2,x:{r:["adata.target_pressure"],s:"Math.round(_0)"},p:[24,40,1029]}," kPa"]}]}," ",{p:[26,3,1100],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[27,5,1145],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.target_pressure","data.default_pressure"],s:'_0!=_1?null:"disabled"'},p:[27,38,1178]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[29,5,1328],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.target_pressure","data.min_pressure"],s:'_0>_1?null:"disabled"'},p:[29,36,1359]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[31,5,1500],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[32,5,1595],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.target_pressure","data.max_pressure"],s:'_0<_1?null:"disabled"'},p:[32,35,1625]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}]}," ",{p:{button:[{t:4,f:[{p:[39,7,1891],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.on"],s:'_0?"danger":null'},p:[39,38,1922]}],action:"eject"},f:["Eject"]}],n:50,r:"data.holding",p:[38,5,1863]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[43,3,2042],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holding.name",p:[44,4,2073]}]}," ",{p:[46,3,2115],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holding.pressure"],s:"Math.round(_0)"},p:[47,4,2149]}," kPa"]}],n:50,r:"data.holding",p:[42,3,2018]},{t:4,n:51,f:[{p:[50,3,2223],t:7,e:"ui-section",f:[{p:[51,4,2240],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.holding"}]}]},e.exports=a.extend(r.exports)},{205:205}],293:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[3,1,69],t:7,e:"ui-notice",f:[{p:[4,3,84],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.holding"],s:'_0?"is":"is not"'},p:[4,23,104]}," connected to a tank."]}]}," ",{p:[6,1,182],t:7,e:"ui-display",a:{title:"Status",button:0},f:[{p:[7,3,220],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[8,5,255],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[8,11,261]}," kPa"]}]}," ",{p:[10,3,323],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[11,5,354],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected"],s:'_0?"good":"average"'},p:[11,18,367]}]},f:[{t:2,x:{r:["data.connected"],s:'_0?"Connected":"Not Connected"'},p:[11,59,408]}]}]}]}," ",{p:[14,1,499],t:7,e:"ui-display",a:{title:"Filter"},f:[{p:[15,3,530],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[16,5,562],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[16,22,579]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":"null"'},p:[17,14,630]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[18,22,687]}]}]}]}," ",{p:{button:[{t:4,f:[{p:[24,7,856],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.on"],s:'_0?"danger":null'},p:[24,38,887]}],action:"eject"},f:["Eject"]}],n:50,r:"data.holding",p:[23,5,828]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[28,3,1007],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holding.name",p:[29,4,1038]}]}," ",{p:[31,3,1080],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holding.pressure"],s:"Math.round(_0)"},p:[32,4,1114]}," kPa"]}],n:50,r:"data.holding",p:[27,3,983]},{t:4,n:51,f:[{p:[35,3,1188],t:7,e:"ui-section",f:[{p:[36,4,1205],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.holding"}]}," ",{p:[40,1,1293],t:7,e:"ui-display",a:{title:"Filters"},f:[{t:4,f:[{p:[42,5,1345],t:7,e:"filters"}],n:53,r:"data",p:[41,3,1325]}]}]},r.exports.components=r.exports.components||{};var i={filters:t(313)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,313:313}],294:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{chargingState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}},chargingMode:function(t){return 2==t?"Full":1==t?"Charging":"Draining"},channelState:function(t){return t>=2?"good":"bad"},channelPower:function(t){return t>=2?"On":"Off"},channelMode:function(t){return 1==t||3==t?"Auto":"Manual"}},computed:{graphData:function(){var t=this.get("data.history");return Object.keys(t).map(function(e){return t[e].map(function(t,e){return{x:e,y:t}})})}}}}(r),r.exports.template={v:3,t:[" ",{p:[42,1,1035],t:7,e:"ui-display",a:{title:"Network"},f:[{t:4,f:[{p:[44,5,1093],t:7,e:"ui-linegraph",a:{points:[{t:2,r:"graphData",p:[44,27,1115]}],height:"500",legend:'["Available", "Load"]',colors:'["rgb(0, 102, 0)", "rgb(153, 0, 0)"]',xunit:"seconds ago",xfactor:[{t:2,r:"data.interval",p:[46,38,1267]}],yunit:"W",yfactor:"1",xinc:[{t:2,x:{r:["data.stored"],s:"_0/10"},p:[47,15,1323]}],yinc:"9"}}],n:50,r:"config.fancy",p:[43,3,1067]},{t:4,n:51,f:[{p:[49,5,1373],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[50,7,1411],t:7,e:"span",f:[{t:2,r:"data.supply",p:[50,13,1417]}]}]}," ",{p:[52,5,1464],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[53,9,1499],t:7,e:"span",f:[{t:2,r:"data.demand",p:[53,15,1505]}]}]}],r:"config.fancy"}]}," ",{p:[57,1,1574],t:7,e:"ui-display",a:{title:"Areas"},f:[{p:[58,3,1604],t:7,e:"ui-section",a:{nowrap:0},f:[{p:[59,5,1629],t:7,e:"div",a:{"class":"content"},f:["Area"]}," ",{p:[60,5,1666],t:7,e:"div",a:{"class":"content"},f:["Charge"]}," ",{p:[61,5,1705],t:7,e:"div",a:{"class":"content"},f:["Load"]}," ",{p:[62,5,1742],t:7,e:"div",a:{"class":"content"},f:["Status"]}," ",{p:[63,5,1781],t:7,e:"div",a:{"class":"content"},f:["Equipment"]}," ",{p:[64,5,1823],t:7,e:"div",a:{"class":"content"},f:["Lighting"]}," ",{p:[65,5,1864],t:7,e:"div",a:{"class":"content"},f:["Environment"]}]}," ",{t:4,f:[{p:[68,5,1949],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[68,24,1968]}],nowrap:0},f:[{p:[69,7,1993],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].charge)"},p:[69,28,2014]}," %"]}," ",{p:[70,7,2072],t:7,e:"div",a:{"class":"content"},f:[{t:2,rx:{r:"adata.areas",m:[{t:30,n:"@index"},"load"]},p:[70,28,2093]}]}," ",{p:[71,7,2135],t:7,e:"div",a:{"class":"content"},f:[{p:[71,28,2156],t:7,e:"span",a:{"class":[{t:2,x:{r:["chargingState","charging"],s:"_0(_1)"},p:[71,41,2169]}]},f:[{t:2,x:{r:["chargingMode","charging"],s:"_0(_1)"},p:[71,70,2198]}]}]}," ",{p:[72,7,2245],t:7,e:"div",a:{"class":"content"},f:[{p:[72,28,2266],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","eqp"],s:"_0(_1)"},p:[72,41,2279]}]},f:[{t:2,x:{r:["channelPower","eqp"],s:"_0(_1)"},p:[72,64,2302]}," [",{p:[72,87,2325],t:7,e:"span",f:[{t:2,x:{r:["channelMode","eqp"],s:"_0(_1)"},p:[72,93,2331]}]},"]"]}]}," ",{p:[73,7,2380],t:7,e:"div",a:{"class":"content"},f:[{p:[73,28,2401],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","lgt"],s:"_0(_1)"},p:[73,41,2414]}]},f:[{t:2,x:{r:["channelPower","lgt"],s:"_0(_1)"},p:[73,64,2437]}," [",{p:[73,87,2460],t:7,e:"span",f:[{t:2,x:{r:["channelMode","lgt"],s:"_0(_1)"},p:[73,93,2466]}]},"]"]}]}," ",{p:[74,7,2515],t:7,e:"div",a:{"class":"content"},f:[{p:[74,28,2536],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","env"],s:"_0(_1)"},p:[74,41,2549]}]},f:[{t:2,x:{r:["channelPower","env"],s:"_0(_1)"},p:[74,64,2572]}," [",{p:[74,87,2595],t:7,e:"span",f:[{t:2,x:{r:["channelMode","env"],s:"_0(_1)"},p:[74,93,2601]}]},"]"]}]}]}],n:52,r:"data.areas",p:[67,3,1923]}]}]},e.exports=a.extend(r.exports)},{205:205}],295:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{readableFrequency:function(){return Math.round(this.get("adata.frequency"))/10}}}}(r),r.exports.template={v:3,t:[" ",{p:[11,1,177],t:7,e:"ui-display",a:{title:"Settings"},f:[{t:4,f:[{p:[13,5,236],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[14,7,270],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.listening"],s:'_0?"power-off":"close"'},p:[14,24,287]}],style:[{t:2,x:{r:["data.listening"],s:'_0?"selected":null'},p:[14,75,338]}],action:"listen"},f:[{t:2,x:{r:["data.listening"],s:'_0?"On":"Off"'},p:[16,9,413]}]}]}],n:50,r:"data.headset",p:[12,3,210]},{t:4,n:51,f:[{p:[19,5,494],t:7,e:"ui-section",a:{label:"Microphone"},f:[{p:[20,7,533],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.broadcasting"],s:'_0?"power-off":"close"'},p:[20,24,550]}],style:[{t:2,x:{r:["data.broadcasting"],s:'_0?"selected":null'},p:[20,78,604]}],action:"broadcast"},f:[{t:2,x:{r:["data.broadcasting"],s:'_0?"Engaged":"Disengaged"'},p:[22,9,685]}]}]}," ",{p:[24,5,769],t:7,e:"ui-section",a:{label:"Speaker"},f:[{p:[25,7,805],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.listening"],s:'_0?"power-off":"close"'},p:[25,24,822]}],style:[{t:2,x:{r:["data.listening"],s:'_0?"selected":null'},p:[25,75,873]}],action:"listen"},f:[{t:2,x:{r:["data.listening"],s:'_0?"Engaged":"Disengaged"'},p:[27,9,948]}]}]}],r:"data.headset"}," ",{t:4,f:[{p:[31,5,1064],t:7,e:"ui-section",a:{label:"High Volume"},f:[{p:[32,7,1104],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.useCommand"],s:'_0?"power-off":"close"'},p:[32,24,1121]}],style:[{t:2,x:{r:["data.useCommand"],s:'_0?"selected":null'},p:[32,76,1173]}],action:"command"},f:[{t:2,x:{r:["data.useCommand"],s:'_0?"On":"Off"'},p:[34,9,1250]}]}]}],n:50,r:"data.command",p:[30,3,1038]}]}," ",{p:[38,1,1342],t:7,e:"ui-display",a:{title:"Channel"},f:[{p:[39,3,1374],t:7,e:"ui-section",a:{label:"Frequency"},f:[{t:4,f:[{p:[41,7,1439],t:7,e:"span",f:[{t:2,r:"readableFrequency",p:[41,13,1445]}]}],n:50,r:"data.freqlock",p:[40,5,1410]},{t:4,n:51,f:[{p:[43,7,1495],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.frequency","data.minFrequency"],s:'_0==_1?"disabled":null'},p:[43,46,1534]}],action:"frequency",params:'{"adjust": -1}'}}," ",{p:[44,7,1646],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.frequency","data.minFrequency"],s:'_0==_1?"disabled":null'},p:[44,41,1680]}],action:"frequency",params:'{"adjust": -.2}'}}," ",{p:[45,7,1793],t:7,e:"ui-button",a:{icon:"pencil",action:"frequency",params:'{"tune": "input"}'},f:[{t:2,r:"readableFrequency",p:[45,78,1864]}]}," ",{p:[46,7,1905],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.frequency","data.maxFrequency"],s:'_0==_1?"disabled":null'},p:[46,40,1938]}],action:"frequency",params:'{"adjust": .2}'}}," ",{p:[47,7,2050],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.frequency","data.maxFrequency"],s:'_0==_1?"disabled":null'},p:[47,45,2088]}],action:"frequency",params:'{"adjust": 1}'}}],r:"data.freqlock"}]}," ",{t:4,f:[{p:[51,5,2262],t:7,e:"ui-section",a:{label:"Subspace Transmission"},f:[{p:[52,7,2312],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.subspace"],s:'_0?"power-off":"close"'},p:[52,24,2329]}],style:[{t:2,x:{r:["data.subspace"],s:'_0?"selected":null'},p:[52,74,2379]}],action:"subspace"},f:[{t:2,x:{r:["data.subspace"],s:'_0?"Active":"Inactive"'},p:[53,29,2447]}]}]}],n:50,r:"data.subspaceSwitchable",p:[50,3,2225]}," ",{t:4,f:[{p:[57,5,2578],t:7,e:"ui-section",a:{label:"Channels"},f:[{t:4,f:[{p:[59,9,2656],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["."],s:'_0?"check-square-o":"square-o"'},p:[59,26,2673]}],style:[{t:2,x:{r:["."],s:'_0?"selected":null'},p:[60,18,2730]}],action:"channel",params:['{"channel": "',{t:2,r:"channel",p:[61,49,2806]},'"}']},f:[{t:2,r:"channel",p:[62,11,2833]}]},{p:[62,34,2856],t:7,
+e:"br"}],n:52,i:"channel",r:"data.channels",p:[58,7,2615]}]}],n:50,x:{r:["data.subspace","data.channels"],s:"_0&&_1"},p:[56,3,2534]}]}]},e.exports=a.extend(r.exports)},{205:205}],296:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" "," "," "," "," "," "," "," "," "," ",{p:[11,1,560],t:7,e:"rdheader"}," ",{t:4,f:[{p:[13,2,595],t:7,e:"ui-display",a:{title:"CONSOLE LOCKED"},f:[{p:[14,3,634],t:7,e:"ui-button",a:{action:"Unlock"},f:["Unlock"]}]}],n:50,r:"data.locked",p:[12,1,573]},{t:4,f:[{p:[18,2,729],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.tabs",p:[18,17,744]}]},f:[{p:[19,3,763],t:7,e:"tab",a:{name:"Technology"},f:[{p:[20,4,791],t:7,e:"techweb"}]}," ",{p:[22,3,815],t:7,e:"tab",a:{name:"View Node"},f:[{p:[23,4,842],t:7,e:"nodeview"}]}," ",{p:[25,3,867],t:7,e:"tab",a:{name:"View Design"},f:[{p:[26,4,896],t:7,e:"designview"}]}," ",{p:[28,3,923],t:7,e:"tab",a:{name:"Disk Operations - Design"},f:[{p:[29,4,965],t:7,e:"diskopsdesign"}]}," ",{p:[31,3,995],t:7,e:"tab",a:{name:"Disk Operations - Technology"},f:[{p:[32,4,1041],t:7,e:"diskopstech"}]}," ",{p:[34,3,1069],t:7,e:"tab",a:{name:"Deconstructive Analyzer"},f:[{p:[35,4,1110],t:7,e:"destruct"}]}," ",{p:[37,3,1135],t:7,e:"tab",a:{name:"Protolathe"},f:[{p:[38,4,1163],t:7,e:"protolathe"}]}," ",{p:[40,3,1190],t:7,e:"tab",a:{name:"Circuit Imprinter"},f:[{p:[41,4,1225],t:7,e:"circuit"}]}," ",{p:[43,3,1249],t:7,e:"tab",a:{name:"Settings"},f:[{p:[44,4,1275],t:7,e:"settings"}]}]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[17,1,706]}]},r.exports.components=r.exports.components||{};var i={settings:t(305),circuit:t(297),protolathe:t(303),destruct:t(299),diskopsdesign:t(300),diskopstech:t(301),designview:t(298),nodeview:t(302),techweb:t(306),rdheader:t(304)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,297:297,298:298,299:299,300:300,301:301,302:302,303:303,304:304,305:305,306:306}],297:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:4,f:[{p:[3,3,58],t:7,e:"ui-display",a:{title:"Circuit Imprinter Busy!"}}],n:50,r:"data.circuitbusy",p:[2,2,30]},{t:4,n:51,f:[{p:[5,3,130],t:7,e:"ui-display",f:[{p:[6,4,147],t:7,e:"ui-section",f:["Search Available Designs: ",{p:[7,4,189],t:7,e:"input",a:{value:[{t:2,r:"textsearch",p:[7,17,202]}],placeholder:"Type Here","class":"text"}}," ",{p:[8,5,261],t:7,e:"ui-button",a:{action:"textSearch",params:['{"latheType" : "circuit", "inputText" : ',{t:2,r:"textsearch",p:[8,84,340]},"}"]},f:["Search"]}]}," ",{p:[10,4,398],t:7,e:"ui-section",f:["Materials: ",{t:2,r:"data.circuitmats",p:[10,27,421]}," / ",{t:2,r:"data.circuitmaxmats",p:[10,50,444]}]}," ",{p:[11,4,485],t:7,e:"ui-section",f:["Reagents: ",{t:2,r:"data.circuitchems",p:[11,26,507]}," / ",{t:2,r:"data.circuitmaxchems",p:[11,50,531]}]}," ",{p:[12,3,572],t:7,e:"ui-display",f:[{p:[14,3,590],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.lathe_tabs",p:[14,18,605]}]},f:[{p:[15,4,631],t:7,e:"tab",a:{name:"Category List"},f:[{t:4,f:[{p:[17,6,696],t:7,e:"ui-button",a:{action:"switchcat",state:[{t:2,x:{r:["data.circuitcat"],s:'_0=="{{name}}"?"selected":null'},p:[17,43,733]}],params:['{"type" : "circuit", "cat" : "',{t:2,r:"name",p:[17,135,825]},'"}']},f:[{t:2,r:"name",p:[17,147,837]}]}],n:52,r:"data.circuitcats",p:[16,5,663]}]}," ",{p:[20,4,888],t:7,e:"tab",a:{name:"Selected Category"},f:[{t:4,f:[{p:[22,6,956],t:7,e:"ui-section",f:[{t:2,r:"name",p:[22,18,968]},{t:2,r:"matstring",p:[22,26,976]}," ",{p:[23,7,997],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[23,40,1030]}],params:['{"latheType" : "circuit", "id" : "',{t:2,r:"id",p:[23,119,1109]},'"}']},f:["Print"]}]}],n:52,r:"data.circuitdes",p:[21,5,924]}]}," ",{p:[27,4,1187],t:7,e:"tab",a:{name:"Search Results"},f:[{t:4,f:[{p:[29,6,1254],t:7,e:"ui-section",f:[{t:2,r:"name",p:[29,18,1266]},{t:2,r:"matstring",p:[29,26,1274]}," ",{p:[30,7,1295],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[30,40,1328]}],params:['{"latheType" : "circuit", "id" : "',{t:2,r:"id",p:[30,119,1407]},'"}']},f:["Print"]}]}],n:52,r:"data.circuitmatch",p:[28,5,1220]}]}," ",{p:[34,4,1485],t:7,e:"tab",a:{name:"Materials"},f:[{t:4,f:[{p:[36,6,1550],t:7,e:"ui-section",f:[{t:2,r:"name",p:[36,18,1562]}," : ",{t:2,r:"amount",p:[36,29,1573]}," cm3 - ",{t:4,f:[{p:[38,7,1623],t:7,e:"input",a:{value:[{t:2,r:"number",p:[38,20,1636]}],placeholder:["1-",{t:2,r:"sheets",p:[38,46,1662]}],"class":"number"}}," ",{p:[39,7,1698],t:7,e:"ui-button",a:{action:"releasemats",params:['{"latheType" : "circuit", "mat_id" : ',{t:2,r:"mat_id",p:[39,84,1775]},', "sheets" : ',{t:2,r:"number",p:[39,107,1798]},"}"]},f:["Release"]}],n:50,x:{r:["sheets"],s:"_0>0"},p:[37,6,1597]}]}],n:52,r:"data.circuitmat_list",p:[35,5,1513]}]}," ",{p:[44,4,1895],t:7,e:"tab",a:{name:"Chemicals"},f:[{t:4,f:[{p:[46,6,1961],t:7,e:"ui-section",f:[{t:2,r:"name",p:[46,18,1973]}," : ",{t:2,r:"amount",p:[46,29,1984]}," - ",{p:[47,7,2005],t:7,e:"ui-button",a:{action:"purgechem",params:['{"latheType" : "circuit", "name" : ',{t:2,r:"name",p:[47,80,2078]},', "id" : ',{t:2,r:"reagentid",p:[47,97,2095]},"}"]},f:["Purge"]}]}],n:52,r:"data.circuitchem_list",p:[45,5,1923]}]}]}]}]}],r:"data.circuitbusy"}],n:50,r:"data.circuit_linked",p:[1,1,0]},{t:4,n:51,f:[{p:[55,2,2216],t:7,e:"ui-display",a:{title:"No Linked Circuit Imprinter"}}],r:"data.circuit_linked"}]},e.exports=a.extend(r.exports)},{205:205}],298:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,31],t:7,e:"ui-display",a:{title:[{t:2,r:"data.sdesign_name",p:[2,21,50]}]},f:[{p:[3,3,77],t:7,e:"ui-section",a:{title:"Description"},f:[{t:2,r:"data.sdesign_desc",p:[3,35,109]}]}]}," ",{p:[5,2,162],t:7,e:"ui-display",a:{title:"Lathe Types"},f:[{t:4,f:[{p:[7,4,239],t:7,e:"ui-section",a:{title:"Circuit Imprinter"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&1"},p:[6,3,198]}," ",{t:4,f:[{p:[10,4,346],t:7,e:"ui-section",a:{title:"Protolathe"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&2"},p:[9,3,305]}," ",{t:4,f:[{p:[13,4,446],t:7,e:"ui-section",a:{title:"Autolathe"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&4"},p:[12,3,405]}," ",{t:4,f:[{p:[16,4,545],t:7,e:"ui-section",a:{title:"Crafting Fabricator"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&8"},p:[15,3,504]}," ",{t:4,f:[{p:[19,4,655],t:7,e:"ui-section",a:{title:"Exosuit Fabricator"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&16"},p:[18,3,613]}," ",{t:4,f:[{p:[22,4,764],t:7,e:"ui-section",a:{title:"Biogenerator"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&32"},p:[21,3,722]}," ",{t:4,f:[{p:[25,4,867],t:7,e:"ui-section",a:{title:"Limb Grower"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&64"},p:[24,3,825]}," ",{t:4,f:[{p:[28,4,970],t:7,e:"ui-section",a:{title:"Ore Smelter"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&128"},p:[27,3,927]}]}," ",{p:[31,2,1045],t:7,e:"ui-display",a:{title:"Materials"},f:[{t:4,f:[{p:[33,4,1116],t:7,e:"ui-section",a:{title:[{t:2,r:"matname",p:[33,23,1135]}]},f:[{t:2,r:"matamt",p:[33,36,1148]}," cm^3"]}],n:52,r:"data.sdesign_materials",p:[32,3,1079]}]}],n:50,r:"data.design_selected",p:[1,1,0]},{t:4,f:[{p:[38,2,1248],t:7,e:"ui-display",a:{title:"No Design Selected."}}],n:50,x:{r:["data.design_selected"],s:"!_0"},p:[37,1,1216]}]},e.exports=a.extend(r.exports)},{205:205}],299:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:4,f:[{p:[4,3,60],t:7,e:"ui-display",a:{title:"Destructive Analyzer Busy!"}}],n:50,r:"data.destroybusy",p:[3,2,32]},{t:4,n:51,f:[{t:4,f:[{p:[7,4,168],t:7,e:"ui-display",a:{title:"Destructive Analyzer Unloaded"}}],n:50,x:{r:["data.destroy_loaded"],s:"!_0"},p:[6,3,135]},{t:4,n:51,f:[{p:[9,4,248],t:7,e:"ui-display",a:{title:"Loaded Item"},f:[{p:[10,4,285],t:7,e:"ui-section",a:{title:"Name"},f:[{t:2,r:"data.destroy_name",p:[10,29,310]}]}]}," ",{p:[12,4,367],t:7,e:"ui-display",a:{title:"Boost Nodes"},f:[{t:4,f:[{p:[14,6,438],t:7,e:"ui-section",a:{title:[{t:2,r:"name",p:[14,25,457]}," | ",{t:2,r:"value",p:[14,36,468]}]},f:[{p:[15,7,487],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["allow"],s:'_0?null:"disabled"'},p:[15,25,505]}],action:"deconstruct",params:['{"id":',{t:2,r:"id",p:[15,90,570]},"}"]},f:["Deconstruct and Boost"]}]}],n:52,r:"data.boost_paths",p:[13,5,405]}]}," ",{p:[19,4,670],t:7,e:"ui-button",a:{action:"eject_da"},f:["Eject Item"]}],x:{r:["data.destroy_loaded"],s:"!_0"}}],r:"data.destroybusy"}],n:50,r:"data.destroy_linked",p:[2,1,2]},{t:4,n:51,f:[{p:[23,2,755],t:7,e:"ui-display",a:{title:"No Linked Destructive Analyzer"}}],r:"data.destroy_linked"}]},e.exports=a.extend(r.exports)},{205:205}],300:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[3,2,24],t:7,e:"ui-display",a:{title:"No Design Disk Loaded"}}],n:50,x:{r:["data.ddisk"],s:"!_0"},p:[2,1,2]},{t:4,n:51,f:[{t:4,f:[{p:[6,3,121],t:7,e:"ui-display",a:{title:"Design Disk Updating"}}],n:50,r:"data.ddisk_update",p:[5,2,92]},{t:4,n:51,f:[{t:4,f:[{p:[9,4,221],t:7,e:"ui-display",a:{title:"Design Disk"},f:[{p:[10,5,259],t:7,e:"ui-section",a:{title:"Disk Space"},f:["Disk Capacity: ",{t:2,r:"data.ddisk_size",p:[10,51,305]}," blueprints."]}," ",{p:[11,5,355],t:7,e:"ui-section",a:{title:"Disk IO"},f:[{p:[11,33,383],t:7,e:"ui-button",a:{action:"ddisk_upall"},f:["Upload all designs"]}]}," ",{p:[12,5,464],t:7,e:"ui-section",a:{title:"Clear Disk"},f:[{p:[12,36,495],t:7,e:"ui-button",a:{action:"clear_designdisk",style:"danger"},f:["WIPE ALL DATA"]}]}," ",{p:[13,5,591],t:7,e:"ui-section",a:{title:"Eject Disk"},f:[{p:[13,36,622],t:7,e:"ui-button",a:{action:"eject_designdisk"},f:["Eject Disk"]}]}]}," ",{p:[15,4,717],t:7,e:"ui-display",a:{title:"Disk Contents"},f:[{t:4,f:[{p:[17,6,792],t:7,e:"ui-section",a:{title:"Number"},f:["#",{t:2,r:"pos",p:[17,34,820]},": ",{t:4,f:[{p:[19,8,866],t:7,e:"ui-button",a:{action:"upload_empty_ddisk_slot",params:['{"slot": "',{t:2,r:"pos",p:[19,70,928]},'"}']},f:["Upload to Empty Slot"]}],n:50,x:{r:["id"],s:'_0=="null"'},p:[18,7,837]},{t:4,n:51,f:[{p:[21,8,996],t:7,e:"ui-button",a:{action:"select_design",params:['{"id": "',{t:2,r:"id",p:[21,58,1046]},'"}'],state:[{t:2,x:{r:["data.sdesign_id","id"],s:'_0==_1?"selected":null'},p:[21,75,1063]}]},f:[{t:2,r:"name",p:[21,122,1110]}]}," ",{p:[22,8,1139],t:7,e:"ui-button",a:{action:"ddisk_erasepos",style:"danger",params:['{"id": "',{t:2,r:"id",p:[22,74,1205]},'"}'],state:[{t:2,x:{r:["id"],s:'_0=="null"?"disabled":null'},p:[22,91,1222]}]},f:["Delete Slot"]}],x:{r:["id"],s:'_0=="null"'}}]}],n:52,r:"data.ddisk_designs",p:[16,5,757]}]}],n:50,x:{r:["data.ddisk_upload"],s:"!_0"},p:[8,3,190]},{t:4,n:51,f:[{p:[28,4,1367],t:7,e:"ui-display",a:{title:"Upload Design to Disk"},f:[{p:[28,46,1409],t:7,e:"ui-section",f:["Available Designs:"]}]}," ",{t:4,f:[{p:[30,5,1513],t:7,e:"ui-section",f:[{p:[30,17,1525],t:7,e:"ui-button",a:{action:"ddisk_uploaddesign",params:['{"id": "',{t:2,r:"id",p:[30,72,1580]},'"}']},f:[{t:2,r:"name",p:[30,82,1590]}]}]}],n:52,r:"data.ddisk_possible_designs",p:[29,4,1470]}],x:{r:["data.ddisk_upload"],s:"!_0"}}],r:"data.ddisk_update"}],x:{r:["data.ddisk"],s:"!_0"}}]},e.exports=a.extend(r.exports)},{205:205}],301:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[3,2,24],t:7,e:"ui-display",a:{title:"No Technology Disk Loaded"}}],n:50,x:{r:["data.tdisk"],s:"!_0"},p:[2,1,2]},{t:4,n:51,f:[{t:4,f:[{p:[6,3,125],t:7,e:"ui-display",a:{title:"Technology Disk Updating"}}],n:50,r:"data.tdisk_update",p:[5,2,96]},{t:4,n:51,f:[{p:[8,3,198],t:7,e:"ui-display",a:{title:"Technology Disk"},f:[{p:[9,4,239],t:7,e:"ui-section",a:{title:"Disk IO"},f:[{p:[9,32,267],t:7,e:"ui-button",a:{action:"tdisk_down"},f:["Download Research to Disk"]},{p:[9,100,335],t:7,e:"ui-button",a:{action:"tdisk_up"},f:["Upload Research from Disk"]}," ",{p:[10,4,406],t:7,e:"ui-section",a:{title:"Clear Disk"},f:[{p:[10,35,437],t:7,e:"ui-button",a:{action:"clear_techdisk",style:"danger"},f:["WIPE ALL DATA"]}]}," ",{p:[11,4,530],t:7,e:"ui-section",a:{title:"Eject Disk"},f:[{p:[11,35,561],t:7,e:"ui-button",a:{action:"eject_techdisk"},f:["Eject Disk"]}]}]}]}," ",{p:[13,3,652],t:7,e:"ui-display",a:{title:"Disk Contents"},f:[{t:4,f:[{p:[15,5,723],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[15,53,771]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[15,70,788]}]},f:[{t:2,r:"display_name",p:[15,115,833]}]}],n:52,r:"data.tdisk_nodes",p:[14,4,691]}]}],r:"data.tdisk_update"}],x:{r:["data.tdisk"],s:"!_0"}}]},e.exports=a.extend(r.exports)},{205:205}],302:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,29],t:7,e:"ui-display",a:{title:[{t:2,r:"data.snode_name",p:[2,21,48]}]},f:[{p:[3,3,73],t:7,e:"ui-section",a:{title:"Description"},f:["Description: ",{t:2,r:"data.snode_desc",p:[3,48,118]}]}," ",{p:[4,3,154],t:7,e:"ui-section",a:{title:"Point Cost"},f:["Point Cost: ",{t:2,r:"data.snode_cost",p:[4,46,197]}]}," ",{p:[5,3,233],t:7,e:"ui-section",a:{title:"Export Price"},f:["Export Price: ",{t:2,r:"data.snode_export",p:[5,50,280]}]}," ",{p:[6,3,318],t:7,e:"ui-button",a:{action:"research_node",params:['{"id"="',{t:2,r:"id",p:[6,52,367]},'"}'],state:[{t:2,x:{r:["data.snode_researched"],s:'_0?"disabled":null'},p:[6,69,384]}]},f:[{t:2,x:{r:["data.snode_researched"],s:'_0?"Researched":"Research Node"'},p:[6,115,430]}]}]}," ",{p:[8,2,518],t:7,e:"ui-display",a:{title:"Prerequisites"},f:[{t:4,f:[{p:[10,4,588],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[10,52,636]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[10,69,653]}]},f:[{t:2,r:"display_name",p:[10,114,698]}]}],n:52,r:"data.node_prereqs",p:[9,3,556]}]}," ",{p:[13,2,759],t:7,e:"ui-display",a:{title:"Unlocks"},f:[{t:4,f:[{p:[15,4,823],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[15,52,871]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[15,69,888]}]},f:[{t:2,r:"display_name",p:[15,114,933]}]}],n:52,r:"data.node_unlocks",p:[14,3,791]}]}," ",{p:[18,2,994],t:7,e:"ui-display",a:{title:"Designs"},f:[{t:4,f:[{p:[20,4,1058],t:7,e:"ui-button",a:{action:"select_design",params:['{"id": "',{t:2,r:"id",p:[20,54,1108]},'"}'],state:[{t:2,x:{r:["data.sdesign_id","id"],s:'_0==_1?"selected":null'},p:[20,71,1125]}]},f:[{t:2,r:"name",p:[20,118,1172]}]}],n:52,r:"data.node_designs",p:[19,3,1026]}]}],n:50,r:"data.node_selected",p:[1,1,0]},{t:4,f:[{p:[25,2,1263],t:7,e:"ui-display",a:{title:"No Node Selected."}}],n:50,x:{r:["data.node_selected"],s:"!_0"},p:[24,1,1233]}]},e.exports=a.extend(r.exports)},{205:205}],303:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:4,f:[{p:[3,3,59],t:7,e:"ui-display",a:{title:"Protolathe Busy!"}}],n:50,r:"data.protobusy",p:[2,2,33]},{t:4,n:51,f:[{p:[5,3,124],t:7,e:"ui-display",f:[{p:[6,4,141],t:7,e:"ui-section",f:["Search Available Designs: ",{p:[7,4,183],t:7,e:"input",a:{value:[{t:2,r:"textsearch",p:[7,17,196]}],placeholder:"Type Here","class":"text"}}," ",{p:[8,5,255],t:7,e:"ui-button",a:{action:"textSearch",params:['{"latheType" : "proto", "inputText" : ',{t:2,r:"textsearch",p:[8,82,332]},"}"]},f:["Search"]}]}," ",{p:[10,4,390],t:7,e:"ui-section",f:["Materials: ",{t:2,r:"data.protomats",p:[10,27,413]}," / ",{t:2,r:"data.protomaxmats",p:[10,48,434]}]}," ",{p:[11,4,473],t:7,e:"ui-section",f:["Reagents: ",{t:2,r:"data.protochems",p:[11,26,495]}," / ",{t:2,r:"data.protomaxchems",p:[11,48,517]}]}," ",{p:[12,3,556],t:7,e:"ui-display",f:[{p:[14,3,574],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.lathe_tabs",p:[14,18,589]}]},f:[{p:[15,4,615],t:7,e:"tab",a:{name:"Category List"},f:[{t:4,f:[{p:[17,6,678],t:7,e:"ui-button",a:{action:"switchcat",state:[{t:2,x:{r:["data.protocat","name"],s:'_0==_1?"selected":null'},p:[17,43,715]}],params:['{"type" : "proto", "cat" : "',{t:2,r:"name",p:[17,125,797]},'"}']},f:[{t:2,r:"name",p:[17,137,809]}]}],n:52,r:"data.protocats",p:[16,5,647]}]}," ",{p:[20,4,860],t:7,e:"tab",a:{name:"Selected Category"},f:[{t:4,f:[{p:[22,6,926],t:7,e:"ui-section",f:[{t:2,r:"name",p:[22,18,938]},{t:2,r:"matstring",p:[22,26,946]}," ",{t:4,f:[{p:[24,8,996],t:7,e:"input",a:{value:[{t:2,r:"number",p:[24,21,1009]}],placeholder:["1-",{t:2,x:{r:["canprint"],s:"_0>10?10:_0"},p:[24,47,1035]}],"class":"number"}}],n:50,x:{r:["canprint"],s:"_0>1"},p:[23,7,967]}," ",{p:[26,7,1108],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[26,40,1141]}],params:['{"latheType" : "proto", "id" : "',{t:2,r:"id",p:[26,117,1218]},'", "amount" : "',{t:2,r:"number",p:[26,138,1239]},'"}']},f:["Print"]}]}],n:52,r:"data.protodes",p:[21,5,896]}]}," ",{p:[30,4,1321],t:7,e:"tab",a:{name:"Search Results"},f:[{t:4,f:[{p:[32,6,1386],t:7,e:"ui-section",f:[{t:2,r:"name",p:[32,18,1398]},{t:2,r:"matstring",p:[32,26,1406]}," ",{t:4,f:[{p:[34,8,1456],t:7,e:"input",a:{value:[{t:2,r:"number",p:[34,21,1469]}],placeholder:["1-",{t:2,x:{r:["canprint"],s:"_0>10?10:_0"},p:[34,47,1495]}],"class":"number"}}],n:50,x:{r:["canprint"],s:"_0>1"},p:[33,7,1427]}," ",{p:[36,7,1568],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[36,40,1601]}],params:['{"latheType" : "proto", "id" : "',{t:2,r:"id",p:[36,117,1678]},'", "amount" : "',{t:2,r:"number",p:[36,138,1699]},'"}']},f:["Print"]}]}],n:52,r:"data.protomatch",p:[31,5,1354]}]}," ",{p:[40,4,1781],t:7,e:"tab",a:{name:"Materials"},f:[{t:4,f:[{p:[42,6,1844],t:7,e:"ui-section",f:[{t:2,r:"name",p:[42,18,1856]}," : ",{t:2,r:"amount",p:[42,29,1867]}," cm3 - ",{t:4,f:[{p:[44,7,1917],t:7,e:"input",a:{value:[{t:2,r:"number",p:[44,20,1930]}],placeholder:["1-",{t:2,r:"sheets",p:[44,46,1956]}],"class":"number"}}," ",{p:[45,7,1992],t:7,e:"ui-button",a:{action:"releasemats",params:['{"latheType" : "proto", "mat_id" : ',{t:2,r:"mat_id",p:[45,82,2067]},', "sheets" : ',{t:2,r:"number",p:[45,105,2090]},"}"]},f:["Release"]}],n:50,x:{r:["sheets"],s:"_0>0"},p:[43,6,1891]}]}],n:52,r:"data.protomat_list",p:[41,5,1809]}]}," ",{p:[50,4,2187],t:7,e:"tab",a:{name:"Chemicals"},f:[{t:4,f:[{p:[52,6,2251],t:7,e:"ui-section",f:[{t:2,r:"name",p:[52,18,2263]}," : ",{t:2,r:"amount",p:[52,29,2274]}," - ",{p:[53,7,2295],t:7,e:"ui-button",a:{action:"purgechem",params:['{"latheType" : "proto", "name" : ',{t:2,r:"name",p:[53,78,2366]},', "id" : ',{t:2,r:"reagentid",p:[53,95,2383]},"}"]},f:["Purge"]}]}],n:52,r:"data.protochem_list",p:[51,5,2215]}]}]}]}]}],r:"data.protobusy"}],n:50,r:"data.protolathe_linked",p:[1,1,0]},{t:4,n:51,f:[{p:[61,2,2504],t:7,e:"ui-display",a:{title:"No Linked Protolathe"}}],r:"data.protolathe_linked"}]},e.exports=a.extend(r.exports)},{205:205}],304:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,1,14],t:7,e:"span",a:{"class":"memoedit"},f:["NanoTrasen R&D Console"]},{p:[2,53,66],t:7,e:"br"}," Available Points: ",{p:[3,19,91],t:7,e:"ui-section",a:{title:"Research Points"},f:[{t:2,r:"data.research_points_stored",p:[3,55,127]}]}," ",{p:[4,1,173],t:7,e:"ui-section",a:{title:["Page Selection - ",{t:2,r:"page",p:[4,37,209]}]},f:[{p:[4,47,219],t:7,e:"input",a:{value:[{t:2,r:"pageselect",p:[4,60,232]}],placeholder:"1","class":"number"}}," Select Page: ",{p:[5,14,294],t:7,e:"ui-button",a:{action:"page",params:['{"num" : "',{t:2,r:"pageselect",p:[5,57,337]},'"}']},f:["[Go]"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],305:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"span",a:{"class":"bad"},f:["Settings"]},{p:[1,34,33],t:7,e:"br"},{p:[1,39,38],t:7,e:"br"}," ",{p:[2,1,45],t:7,e:"ui-button",a:{action:"Resync"},f:["RESYNC MACHINERY"]},{p:[2,56,100],t:7,e:"br"}," ",{p:[3,1,107],t:7,e:"ui-button",a:{action:"Lock"},f:["LOCK"]}," ",{p:[4,1,150],t:7,e:"ui-button",a:{action:"disconnect",params:'{"type" : "destroy"}',state:[{t:2,x:{r:["data.destroy_linked"],s:'_0?null:"disabled"'},p:[4,71,220]}]},f:["Disconnect Destructive Analyzer"]}," ",{p:[5,1,309],t:7,e:"ui-button",a:{action:"disconnect",params:'{"type" : "lathe"}',state:[{t:2,x:{r:["data.protolathe_linked"],s:'_0?null:"disabled"'},p:[5,69,377]}]},f:["Disconnect Protolathe"]}," ",{p:[6,1,459],t:7,e:"ui-button",a:{action:"disconnect",params:'{"type" : "imprinter"}',state:[{t:2,x:{r:["data.circuit_linked"],s:'_0?null:"disabled"'},p:[6,73,531]}]},f:["Disconnect Circuit Imprinter"]}]},e.exports=a.extend(r.exports)},{205:205}],306:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Available for Research"},f:[{t:4,f:[{p:[3,3,78],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[3,51,126]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[3,68,143]}]},f:[{t:2,r:"display_name",p:[3,113,188]}]}],n:52,r:"data.techweb_avail",p:[2,2,46]}]}," ",{p:[6,1,245],t:7,e:"ui-display",a:{title:"Locked Nodes"},f:[{t:4,f:[{p:[8,3,314],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[8,51,362]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[8,68,379]}]},f:[{t:2,r:"display_name",p:[8,113,424]}]}],n:52,r:"data.techweb_locked",p:[7,2,281]}]}," ",{p:[11,1,482],t:7,e:"ui-display",a:{title:"Researched Nodes"},f:[{t:4,f:[{p:[13,3,559],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[13,51,607]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[13,68,624]}]},f:[{t:2,r:"display_name",p:[13,113,669]}]}],n:52,r:"data.techweb_researched",p:[12,2,522]}]}]},e.exports=a.extend(r.exports)},{205:205}],307:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,1,25],t:7,e:"ui-notice",f:[{p:[3,3,40],t:7,e:"span",f:["The grinder is currently processing and cannot be used."]}]}],n:50,r:"data.processing",p:[1,1,0]},{p:{button:[{p:[8,5,208],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.operating","data.contents"],s:'(_0==0)&&_1?null:"disabled"'},p:[8,36,239]}],action:"eject"},f:["Eject Contents"]}]},t:7,e:"ui-display",a:{title:"Processing Chamber",button:0},f:[" ",{p:[10,3,364],t:7,e:"ui-section",a:{label:"Grinding"},f:[{p:[11,5,399],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.operating"],s:'_0?"average":"good"'},p:[11,18,412]}]},f:[{t:2,x:{r:["data.operating"],s:'_0?"Busy":"Ready"'},p:[11,59,453]}]}," ",{p:[12,2,500],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.operating","data.contents"],s:'(_0==0)&&_1?null:"disabled"'},p:[12,35,533]}],action:"grind"},f:["Activate"]}]}," ",{p:[14,3,653],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{t:4,f:[{p:[17,9,755],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:["The ",{t:2,r:"name",p:[17,56,802]}]},{p:[17,71,817],t:7,e:"br"}],n:52,r:"adata.contentslist",p:[16,7,717]},{t:4,n:51,f:[{p:[19,9,848],t:7,e:"span",f:["No Contents"]}],r:"adata.contentslist"}],n:50,r:"data.contents",p:[15,5,688]},{t:4,n:51,f:[{p:[22,7,911],t:7,e:"span",f:["No Contents"]}],r:"data.contents"}]}]}," ",{p:{button:[{p:[28,5,1047],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.operating","data.isBeakerLoaded"],s:'(_0==0)&&_1?null:"disabled"'},p:[28,36,1078]}],action:"detach"},f:["Detach"]}]},t:7,e:"ui-display",a:{title:"Container",button:0},f:[" ",{p:[30,3,1202],t:7,e:"ui-section",a:{label:"Reagents"},f:[{t:4,f:[{p:[32,7,1272],t:7,e:"span",f:[{t:2,x:{r:["adata.beakerCurrentVolume"],s:"Math.round(_0)"},p:[32,13,1278]},"/",{t:2,r:"data.beakerMaxVolume",p:[32,55,1320]}," Units"]}," ",{p:[33,7,1365],t:7,e:"br"}," ",{t:4,f:[{p:[35,9,1418],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[35,52,1461]}," units of ",{t:2,r:"name",p:[35,87,1496]}]},{p:[35,102,1511],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[34,7,1378]},{t:4,n:51,f:[{p:[37,9,1542],t:7,e:"span",a:{"class":"bad"},f:["Container Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[31,5,1237]},{t:4,n:51,f:[{p:[40,7,1621],t:7,e:"span",a:{"class":"average"},f:["No Container"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],308:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" "," ",{t:4,f:[{p:[5,2,123],t:7,e:"dirsel"}],n:50,x:{r:["data.mode"],s:"_0>=0"},p:[4,1,98]},{t:4,f:[{p:[8,2,187],t:7,e:"colorsel"}],n:50,x:{r:["data.mode"],s:"_0==-2||_0==0"},p:[7,1,143]},{p:[10,1,209],t:7,e:"ui-display",a:{title:"Utilities"},f:[{p:[11,2,242],t:7,e:"ui-section",f:[{p:[12,3,258],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0>=0?"check-square-o":"square-o"'},p:[12,20,275]}],state:[{t:2,x:{r:["data.mode"],s:'_0>=0?"selected":null'},p:[12,79,334]}],action:"mode",params:['{"mode": ',{t:2,r:"data.screen",p:[13,35,409]},"}"]},f:["Lay Pipes"]}]}," ",{p:[15,2,467],t:7,e:"ui-section",f:[{p:[16,3,483],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0==-1?"check-square-o":"square-o"'},p:[16,20,500]}],state:[{t:2,x:{r:["data.mode"],s:'_0==-1?"selected":null'},p:[16,80,560]}],action:"mode",params:'{"mode": -1}'},f:["Eat Pipes"]}]}," ",{p:[19,2,681],t:7,e:"ui-section",f:[{p:[20,3,697],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0==-2?"check-square-o":"square-o"'},p:[20,20,714]}],state:[{t:2,x:{r:["data.mode"],s:'_0==-2?"selected":null'},p:[20,80,774]}],action:"mode",params:'{"mode": -2}'},f:["Paint Pipes"]}]}]}," ",{p:[24,1,911],t:7,e:"ui-display",a:{title:"Category"},f:[{p:[25,2,943],t:7,e:"ui-section",f:[{p:[26,3,959],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.screen"],s:'_0==0?"check-square-o":"square-o"'},p:[26,20,976]}],state:[{t:2,x:{r:["data.screen"],s:'_0==0?"selected":null'},p:[26,81,1037]}],action:"screen",params:'{"screen": 0}'},f:["Atmospherics"]}," ",{p:[28,3,1150],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.screen"],s:'_0==2?"check-square-o":"square-o"'},p:[28,20,1167]}],state:[{t:2,x:{r:["data.screen"],s:'_0==2?"selected":null'},p:[28,81,1228]}],action:"screen",params:'{"screen": 2}'},f:["Disposals"]}," ",{p:[30,3,1338],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.screen"],s:'_0==3?"check-square-o":"square-o"'},p:[30,20,1355]}],state:[{t:2,x:{r:["data.screen"],s:'_0==3?"selected":null'},p:[30,81,1416]}],action:"screen",params:'{"screen": 3}'},f:["Transit Tubes"]}]}," ",{t:4,f:[{p:[34,3,1573],t:7,e:"ui-section",a:{label:"Piping Layer"},f:[{p:[35,4,1611],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.piping_layer"],s:'_0==1?"selected":null'},p:[35,22,1629]}],action:"piping_layer",params:'{"piping_layer": 1}'},f:["1"]}," ",{p:[37,4,1751],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.piping_layer"],s:'_0==2?"selected":null'},p:[37,22,1769]}],action:"piping_layer",params:'{"piping_layer": 2}'},f:["2"]}," ",{p:[39,4,1891],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.piping_layer"],s:'_0==3?"selected":null'},p:[39,22,1909]}],action:"piping_layer",params:'{"piping_layer": 3}'},f:["3"]}]}],n:50,x:{r:["data.screen"],s:"_0==0"},p:[33,2,1545]}]}," ",{t:4,f:[{p:[45,2,2098],t:7,e:"ui-display",a:{title:[{t:2,r:"cat_name",p:[45,21,2117]}]},f:[{t:4,f:[{p:[47,4,2157],t:7,e:"ui-section",f:[{p:[48,5,2175],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[48,23,2193]}],action:"pipe_type",params:['{"pipe_type": ',{t:2,r:"pipe_index",p:[49,28,2274]},', "category": ',{t:2,r:"cat_name",p:[49,56,2302]},"}"]},f:[{t:2,r:"pipe_name",p:[49,71,2317]}]}]}],n:52,r:"recipes",p:[46,3,2135]}]}],n:52,r:"data.categories",p:[44,1,2070]}]},r.exports.components=r.exports.components||{};var i={colorsel:t(309),dirsel:t(310)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,309:309,310:310}],309:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Color"},f:[{t:4,f:[{p:[3,3,60],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[3,21,78]}],action:"color",params:['{"paint_color": ',{t:2,r:"color_name",p:[4,28,155]},"}"]},f:[{t:2,r:"color_name",p:[4,45,172]}]}],n:52,r:"data.paint_colors",p:[2,2,29]}]}]},e.exports=a.extend(r.exports)},{205:205}],310:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Direction"},f:[{t:4,f:[{p:[3,3,64],t:7,e:"ui-section",f:[{t:4,f:[{p:[5,5,105],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[5,23,123]}],action:"setdir",params:['{"dir": ',{t:2,r:"dir",p:[6,22,195]},', "flipped": ',{t:2,r:"flipped",p:[6,42,215]},"}"]},f:[{p:[6,56,229],t:7,e:"img",a:{src:["pipe.",{t:2,r:"dir",p:[6,71,244]},".",{t:2,r:"icon_state",p:[6,79,252]},".png"],title:[{t:2,r:"dir_name",p:[6,106,279]}]}}]}],n:52,r:"previews",p:[4,4,81]}]}],n:52,r:"data.preview_rows",p:[2,2,33]}]}]},e.exports=a.extend(r.exports)},{205:205}],311:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,23],t:7,e:"ui-notice",f:[{t:2,r:"data.notice",p:[3,5,40]}]}],n:50,r:"data.notice",p:[1,1,0]},{p:[6,1,82],t:7,e:"ui-display",a:{title:"Satellite Network Control",button:0},f:[{t:4,f:[{p:[8,4,168],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[9,9,209],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[9,31,231]}]}," ",{p:[10,9,253],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"mode",p:[10,30,274]}]}," ",{p:[11,9,298],t:7,e:"div",a:{"class":"content"},f:[{p:[12,11,331],t:7,e:"ui-button",a:{action:"toggle",params:['{"id": "',{t:2,r:"id",p:[12,54,374]},'"}']},f:[{t:2,x:{r:["active"],s:'_0?"Deactivate":"Activate"'},p:[12,64,384]}]}]}]}],n:52,r:"data.satellites",p:[7,2,138]}]}," ",{t:4,f:[{p:[18,1,528],t:7,e:"ui-display",a:{title:"Station Shield Coverage"},f:[{p:[19,3,576],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.meteor_shield_coverage_max",p:[19,24,597]}],value:[{t:2,r:"data.meteor_shield_coverage",p:[19,68,641]}]},f:[{t:2,x:{r:["data.meteor_shield_coverage","data.meteor_shield_coverage_max"],s:"100*_0/_1"},p:[19,101,674]}," %"]}," ",{p:[20,1,758],t:7,e:"ui-display",f:[]}]}],n:50,r:"data.meteor_shield",p:[17,1,500]}]},e.exports=a.extend(r.exports)},{205:205}],312:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Recipient Contents"},f:[{p:[2,2,42],t:7,e:"ui-section",f:[{p:[3,3,58],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[3,34,89]}],action:"ejectBeaker"},f:["Eject"]}," ",{p:[4,3,176],t:7,e:"ui-button",a:{icon:"circle",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[4,35,208]}],action:"input"},f:["Input"]}," ",{p:[5,3,289],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"disabled":null'},p:[5,33,319]}],action:"makecup"},f:["Create Cup"]}]}]}," ",{p:[8,1,436],t:7,e:"ui-display",a:{title:"Recipient"},f:[{p:[9,2,469],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[11,4,534],t:7,e:"span",f:[{t:2,x:{r:["adata.beakerCurrentVolume"],s:"Math.round(_0)"},p:[11,10,540]},"/",{t:2,r:"data.beakerMaxVolume",p:[11,52,582]}," Units"]}," ",{t:4,f:[{p:[13,5,660],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[13,48,703]}," units of ",{t:2,r:"name",p:[13,83,738]}]},{p:[13,98,753],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[12,4,624]},{t:4,n:51,f:[{p:[15,5,777],t:7,e:"span",a:{"class":"bad"},f:["Recipient Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[10,3,502]},{t:4,n:51,f:[{p:[18,4,848],t:7,e:"span",a:{"class":"average"},f:["No Recipient"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],313:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,26],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["enabled"],s:'_0?"check-square-o":"square-o"'},p:[2,20,43]}],style:[{t:2,x:{r:["enabled"],s:'_0?"selected":null'},p:[2,72,95]}],action:"toggle_filter",params:['{"id_tag": "',{t:2,r:"id_tag",p:[3,48,176]},'", "val": ',{t:2,r:"gas_id",p:[3,68,196]},"}"]},f:[{t:2,r:"gas_name",p:[3,81,209]}]}],n:52,r:"filter_types",p:[1,1,0]}]},e.exports=a.extend(r.exports);
+},{205:205}],314:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" "," "," ",{p:[5,1,200],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.tabs",p:[5,16,215]}]},f:[{p:[6,2,233],t:7,e:"tab",a:{name:"Status"},f:[{p:[7,3,256],t:7,e:"status"}]}," ",{p:[9,2,277],t:7,e:"tab",a:{name:"Templates"},f:[{p:[10,3,303],t:7,e:"templates"}]}," ",{p:[12,2,327],t:7,e:"tab",a:{name:"Modification"},f:[{t:4,f:[{p:[14,3,381],t:7,e:"modification"}],n:50,r:"data.selected",p:[13,3,356]}," ",{t:4,f:[{p:[17,3,437],t:7,e:"span",a:{"class":"bad"},f:["No shuttle selected."]}],n:50,x:{r:["data.selected"],s:"!_0"},p:[16,3,411]}]}]}]},r.exports.components=r.exports.components||{};var i={modification:t(315),templates:t(317),status:t(316)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,315:315,316:316,317:317}],315:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:["Selected: ",{t:2,r:"data.selected.name",p:[1,30,29]}]},f:[{t:4,f:[{p:[3,5,96],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.selected.description",p:[3,37,128]}]}],n:50,r:"data.selected.description",p:[2,3,57]}," ",{t:4,f:[{p:[6,5,224],t:7,e:"ui-section",a:{label:"Admin Notes"},f:[{t:2,r:"data.selected.admin_notes",p:[6,37,256]}]}],n:50,r:"data.selected.admin_notes",p:[5,3,185]}]}," ",{t:4,f:[{p:[11,3,361],t:7,e:"ui-display",a:{title:["Existing Shuttle: ",{t:2,r:"data.existing_shuttle.name",p:[11,40,398]}]},f:["Status: ",{t:2,r:"data.existing_shuttle.status",p:[12,13,444]}," ",{t:4,f:["(",{t:2,r:"data.existing_shuttle.timeleft",p:[14,8,526]},")"],n:50,r:"data.existing_shuttle.timer",p:[13,5,482]}," ",{p:[16,5,580],t:7,e:"ui-button",a:{action:"jump_to",params:['{"type": "mobile", "id": "',{t:2,r:"data.existing_shuttle.id",p:[17,41,649]},'"}']},f:["Jump To"]}]}],n:50,r:"data.existing_shuttle",p:[10,1,328]},{t:4,f:[{p:[24,3,778],t:7,e:"ui-display",a:{title:"Existing Shuttle: None"}}],n:50,x:{r:["data.existing_shuttle"],s:"!_0"},p:[23,1,744]},{p:[27,1,847],t:7,e:"ui-button",a:{action:"preview",params:['{"shuttle_id": "',{t:2,r:"data.selected.shuttle_id",p:[28,27,902]},'"}']},f:["Preview"]}," ",{p:[31,1,961],t:7,e:"ui-button",a:{action:"load",params:['{"shuttle_id": "',{t:2,r:"data.selected.shuttle_id",p:[32,27,1013]},'"}'],style:"danger"},f:["Load"]}," ",{p:[37,1,1089],t:7,e:"ui-display",a:{title:"Status"},f:[]}]},e.exports=a.extend(r.exports)},{205:205}],316:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,27],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[2,22,46]}," (",{t:2,r:"id",p:[2,32,56]},")"]},f:[{t:2,r:"status",p:[3,5,71]}," ",{t:4,f:["(",{t:2,r:"timeleft",p:[5,8,109]},")"],n:50,r:"timer",p:[4,5,87]}," ",{p:[7,5,141],t:7,e:"ui-button",a:{action:"jump_to",params:['{"type": "mobile", "id": "',{t:2,r:"id",p:[7,67,203]},'"}']},f:["Jump To"]}," ",{p:[10,5,252],t:7,e:"ui-button",a:{action:"fast_travel",params:['{"id": "',{t:2,r:"id",p:[10,53,300]},'"}'],state:[{t:2,x:{r:["can_fast_travel"],s:'_0?null:"disabled"'},p:[10,70,317]}]},f:["Fast Travel"]}]}],n:52,r:"data.shuttles",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{205:205}],317:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.templates_tabs",p:[1,16,15]}]},f:[{t:4,f:[{p:[3,5,74],t:7,e:"tab",a:{name:[{t:2,r:"port_id",p:[3,16,85]}]},f:[{t:4,f:[{p:[5,9,135],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[5,28,154]}]},f:[{t:4,f:[{p:[7,13,209],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"description",p:[7,45,241]}]}],n:50,r:"description",p:[6,11,176]}," ",{t:4,f:[{p:[10,13,333],t:7,e:"ui-section",a:{label:"Admin Notes"},f:[{t:2,r:"admin_notes",p:[10,45,365]}]}],n:50,r:"admin_notes",p:[9,11,300]}," ",{p:[13,11,426],t:7,e:"ui-button",a:{action:"select_template",params:['{"shuttle_id": "',{t:2,r:"shuttle_id",p:[14,37,499]},'"}'],state:[{t:2,x:{r:["data.selected.shuttle_id","shuttle_id"],s:'_0==_1?"selected":null'},p:[15,20,537]}]},f:[{t:2,x:{r:["data.selected.shuttle_id","shuttle_id"],s:'_0==_1?"Selected":"Select"'},p:[17,13,630]}]}]}],n:52,r:"templates",p:[4,7,106]}]}],n:52,r:"data.templates",p:[2,3,44]}]}]},e.exports=a.extend(r.exports)},{205:205}],318:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[2,3,33],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[3,3,66],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[3,9,72]}]}]}," ",{t:4,f:[{p:[6,5,186],t:7,e:"ui-section",a:{label:"State"},f:[{p:[7,7,220],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.statstate",p:[7,20,233]}]},f:[{t:2,r:"data.occupant.stat",p:[7,49,262]}]}]}," ",{p:[9,5,315],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[10,7,350],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[10,20,363]}],max:[{t:2,r:"data.occupant.maxHealth",p:[10,54,397]}],value:[{t:2,r:"data.occupant.health",p:[10,90,433]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[11,16,475]}]},f:[{t:2,x:{r:["adata.occupant.health"],s:"Math.round(_0)"},p:[11,68,527]}]}]}," ",{t:4,f:[{p:[14,7,764],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[14,26,783]}]},f:[{p:[15,9,804],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[15,30,825]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[15,66,861]}],state:"bad"},f:[{t:2,x:{r:["type","adata.occupant"],s:"Math.round(_1[_0])"},p:[15,103,898]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[13,5,598]}," ",{p:[18,5,985],t:7,e:"ui-section",a:{label:"Cells"},f:[{p:[19,9,1021],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"bad":"good"'},p:[19,22,1034]}]},f:[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"Damaged":"Healthy"'},p:[19,68,1080]}]}]}," ",{p:[21,5,1163],t:7,e:"ui-section",a:{label:"Brain"},f:[{p:[22,9,1199],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"bad":"good"'},p:[22,22,1212]}]},f:[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"Abnormal":"Healthy"'},p:[22,68,1258]}]}]}," ",{p:[24,5,1342],t:7,e:"ui-section",a:{label:"Bloodstream"},f:[{t:4,f:[{p:[26,11,1429],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,1)"},p:[26,54,1472]}," units of ",{t:2,r:"name",p:[26,89,1507]}]},{p:[26,104,1522],t:7,e:"br"}],n:52,r:"adata.occupant.reagents",p:[25,9,1384]},{t:4,n:51,f:[{p:[28,11,1557],t:7,e:"span",a:{"class":"good"},f:["Pure"]}],r:"adata.occupant.reagents"}]}],n:50,r:"data.occupied",p:[5,3,159]}]}," ",{p:[33,1,1653],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[34,2,1685],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[35,5,1716],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"unlock":"lock"'},p:[35,22,1733]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Open":"Closed"'},p:[35,71,1782]}]}]}," ",{p:[37,3,1847],t:7,e:"ui-section",a:{label:"Inject"},f:[{t:4,f:[{p:[39,7,1908],t:7,e:"ui-button",a:{icon:"flask",state:[{t:2,x:{r:["data.occupied","allowed"],s:'_0&&_1?null:"disabled"'},p:[39,38,1939]}],action:"inject",params:['{"chem": "',{t:2,r:"id",p:[39,122,2023]},'"}']},f:[{t:2,r:"name",p:[39,132,2033]}]},{p:[39,152,2053],t:7,e:"br"}],n:52,r:"data.chems",p:[38,5,1880]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],319:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,25],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[2,22,44]}],labelcolor:[{t:2,r:"htmlcolor",p:[2,44,66]}],candystripe:0,right:0},f:[{p:[3,5,105],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[3,32,132],t:7,e:"span",a:{"class":[{t:2,x:{r:["status"],s:'_0=="Dead"?"bad bold":_0=="Unconscious"?"average bold":"good"'},p:[3,45,145]}]},f:[{t:2,r:"status",p:[3,132,232]}]}]}," ",{p:[4,5,268],t:7,e:"ui-section",a:{label:"Jelly"},f:[{t:2,r:"exoticblood",p:[4,31,294]}]}," ",{p:[5,5,328],t:7,e:"ui-section",a:{label:"Location"},f:[{t:2,r:"area",p:[5,34,357]}]}," ",{p:[7,5,386],t:7,e:"ui-button",a:{state:[{t:2,r:"swap_button_state",p:[8,14,411]}],action:"swap",params:['{"ref": "',{t:2,r:"ref",p:[9,38,472]},'"}']},f:[{t:4,f:["You Are Here"],n:50,x:{r:["occupied"],s:'_0=="owner"'},p:[10,7,491]},{t:4,n:51,f:[{t:4,f:["Occupied"],n:50,x:{r:["occupied"],s:'_0=="stranger"'},p:[13,9,566]},{t:4,n:51,f:["Swap"],x:{r:["occupied"],s:'_0=="stranger"'}}],x:{r:["occupied"],s:'_0=="owner"'}}]}]}],n:52,r:"data.bodies",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{205:205}],320:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{t:4,f:[{p:[4,23,82],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.drying"],s:'_0?"stop":"tint"'},p:[4,40,99]}],action:"Dry"},f:[{t:2,x:{r:["data.drying"],s:'_0?"Stop drying":"Dry"'},p:[4,88,147]}]}],n:50,r:"data.isdryer",p:[4,3,62]}]},t:7,e:"ui-display",a:{title:"Storage",button:0},f:[" ",{t:4,f:[{p:[7,3,258],t:7,e:"ui-notice",f:[{p:[8,5,275],t:7,e:"span",f:["Unfortunately, this ",{t:2,r:"data.name",p:[8,31,301]}," is empty."]}]}],n:50,x:{r:["data.contents.length"],s:"_0==0"},p:[6,1,221]},{t:4,n:51,f:[{p:[11,1,359],t:7,e:"div",a:{"class":"display tabular"},f:[{p:[12,2,391],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[13,4,425],t:7,e:"section",a:{"class":"cell bold"},f:["Item"]}," ",{p:[16,4,482],t:7,e:"section",a:{"class":"cell bold"},f:["Quantity"]}," ",{p:[19,4,543],t:7,e:"section",a:{"class":"cell bold",align:"center"},f:[{t:4,f:[{t:2,r:"data.verb",p:[20,22,608]}],n:50,r:"data.verb",p:[20,5,591]},{t:4,n:51,f:["Dispense"],r:"data.verb"}]}]}," ",{t:4,f:[{p:[24,3,703],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[25,4,737],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[26,5,765]}]}," ",{p:[28,4,793],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[29,5,835]}]}," ",{p:[31,4,865],t:7,e:"section",a:{"class":"table",alight:"right"},f:[{p:[32,5,909],t:7,e:"section",a:{"class":"cell"}}," ",{p:[33,5,947],t:7,e:"section",a:{"class":"cell"},f:[{p:[34,6,976],t:7,e:"ui-button",a:{grid:0,action:"Release",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[34,45,1015]}],params:['{ "name" : ',{t:2,r:"name",p:[34,102,1072]},', "amount" : 1 }']},f:["One"]}]}," ",{p:[38,5,1151],t:7,e:"section",a:{"class":"cell"},f:[{p:[39,6,1180],t:7,e:"ui-button",a:{grid:0,action:"Release",state:[{t:2,x:{r:["amount"],s:'(_0>1)?null:"disabled"'},p:[39,45,1219]}],params:['{ "name" : ',{t:2,r:"name",p:[39,101,1275]}," }"]},f:["Many"]}]}]}]}],n:52,r:"data.contents",p:[23,2,676]}]}],x:{r:["data.contents.length"],s:"_0==0"}}]}]},e.exports=a.extend(r.exports)},{205:205}],321:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{capacityPercentState:function(){var t=this.get("data.capacityPercent");return t>50?"good":t>15?"average":"bad"},inputState:function(){return this.get("data.capacityPercent")>=100?"good":this.get("data.inputting")?"average":"bad"},outputState:function(){return this.get("data.outputting")?"good":this.get("data.charge")>0?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[24,1,663],t:7,e:"ui-display",a:{title:"Storage"},f:[{p:[25,3,695],t:7,e:"ui-section",a:{label:"Stored Energy"},f:[{p:[26,5,735],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.capacityPercent",p:[26,38,768]}],state:[{t:2,r:"capacityPercentState",p:[26,71,801]}]},f:[{t:2,x:{r:["adata.capacityPercent"],s:"Math.fixed(_0)"},p:[26,97,827]},"%"]}]}]}," ",{p:[29,1,908],t:7,e:"ui-display",a:{title:"Input"},f:[{p:[30,3,938],t:7,e:"ui-section",a:{label:"Charge Mode"},f:[{p:[31,5,976],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"refresh":"close"'},p:[31,22,993]}],style:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"selected":null'},p:[31,74,1045]}],action:"tryinput"},f:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"Auto":"Off"'},p:[32,25,1113]}]}," [",{p:[34,6,1182],t:7,e:"span",a:{"class":[{t:2,r:"inputState",p:[34,19,1195]}]},f:[{t:2,x:{r:["data.capacityPercent","data.inputting"],s:'_0>=100?"Fully Charged":_1?"Charging":"Not Charging"'},p:[34,35,1211]}]},"]"]}," ",{p:[36,3,1335],t:7,e:"ui-section",a:{label:"Target Input"},f:[{p:[37,5,1374],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.inputLevelMax",p:[37,26,1395]}],value:[{t:2,r:"data.inputLevel",p:[37,57,1426]}]},f:[{t:2,r:"adata.inputLevel_text",p:[37,78,1447]}]}]}," ",{p:[39,3,1501],t:7,e:"ui-section",a:{label:"Adjust Input"},f:[{p:[40,5,1540],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.inputLevel"],s:'_0==0?"disabled":null'},p:[40,44,1579]}],action:"input",params:'{"target": "min"}'}}," ",{p:[41,5,1674],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.inputLevel"],s:'_0==0?"disabled":null'},p:[41,39,1708]}],action:"input",params:'{"adjust": -10000}'}}," ",{p:[42,5,1804],t:7,e:"ui-button",a:{icon:"pencil",action:"input",params:'{"target": "input"}'},f:["Set"]}," ",{p:[43,5,1894],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.inputLevel","data.inputLevelMax"],s:'_0==_1?"disabled":null'},p:[43,38,1927]}],action:"input",params:'{"adjust": 10000}'}}," ",{p:[44,5,2039],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.inputLevel","data.inputLevelMax"],s:'_0==_1?"disabled":null'},p:[44,43,2077]}],action:"input",params:'{"target": "max"}'}}]}," ",{p:[46,3,2204],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[47,3,2238],t:7,e:"span",f:[{t:2,r:"adata.inputAvailable",p:[47,9,2244]}]}]}]}," ",{p:[50,1,2308],t:7,e:"ui-display",a:{title:"Output"},f:[{p:[51,3,2339],t:7,e:"ui-section",a:{label:"Output Mode"},f:[{p:[52,5,2377],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"power-off":"close"'},p:[52,22,2394]}],style:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"selected":null'},p:[52,77,2449]}],action:"tryoutput"},f:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"On":"Off"'},p:[53,26,2519]}]}," [",{p:[55,6,2587],t:7,e:"span",a:{"class":[{t:2,r:"outputState",p:[55,19,2600]}]},f:[{t:2,x:{r:["data.outputting","data.charge"],s:'_0?"Sending":_1>0?"Not Sending":"No Charge"'},p:[55,36,2617]}]},"]"]}," ",{p:[57,3,2724],t:7,e:"ui-section",a:{label:"Target Output"},f:[{p:[58,5,2764],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.outputLevelMax",p:[58,26,2785]}],value:[{t:2,r:"data.outputLevel",p:[58,58,2817]}]},f:[{t:2,r:"adata.outputLevel_text",p:[58,80,2839]}]}]}," ",{p:[60,3,2894],t:7,e:"ui-section",a:{label:"Adjust Output"},f:[{p:[61,5,2934],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.outputLevel"],s:'_0==0?"disabled":null'},p:[61,44,2973]}],action:"output",params:'{"target": "min"}'}}," ",{p:[62,5,3070],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.outputLevel"],s:'_0==0?"disabled":null'},p:[62,39,3104]}],action:"output",params:'{"adjust": -10000}'}}," ",{p:[63,5,3202],t:7,e:"ui-button",a:{icon:"pencil",action:"output",params:'{"target": "input"}'},f:["Set"]}," ",{p:[64,5,3293],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.outputLevel","data.outputLevelMax"],s:'_0==_1?"disabled":null'},p:[64,38,3326]}],action:"output",params:'{"adjust": 10000}'}}," ",{p:[65,5,3441],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.outputLevel","data.outputLevelMax"],s:'_0==_1?"disabled":null'},p:[65,43,3479]}],action:"output",params:'{"target": "max"}'}}]}," ",{p:[67,3,3609],t:7,e:"ui-section",a:{label:"Outputting"},f:[{p:[68,3,3644],t:7,e:"span",f:[{t:2,r:"adata.outputUsed",p:[68,9,3650]}]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],322:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:["\ufeff",{t:4,f:[" ",{p:[2,2,33],t:7,e:"ui-display",a:{title:"Dispersal Tank"},f:[{p:[3,3,73],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[4,4,104],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.active"],s:'_0?"power-off":"close"'},p:[4,21,121]}],style:[{t:2,x:{r:["data.active"],s:'_0?"selected":null'},p:[5,12,174]}],state:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?null:"disabled"'},p:[6,12,223]}],action:"power"},f:[{t:2,x:{r:["data.active"],s:'_0?"On":"Off"'},p:[7,20,286]}]}]}," ",{p:[10,3,354],t:7,e:"ui-section",a:{label:"Smoke Radius Setting"},f:[{p:[11,5,401],t:7,e:"div",a:{"class":"content",style:"float:left"},f:[{p:[12,6,448],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=1?null:"disabled"'},p:[12,36,478]}],style:[{t:2,x:{r:["data.setting"],s:'_0==1?"selected":null'},p:[12,89,531]}],action:"setting",params:'{"amount": 1}'},f:["3"]}," ",{p:[13,6,634],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=2?null:"disabled"'},p:[13,36,664]}],style:[{t:2,x:{r:["data.setting"],s:'_0==2?"selected":null'},p:[13,89,717]}],action:"setting",params:'{"amount": 2}'},f:["6"]}," ",{p:[14,6,820],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=3?null:"disabled"'},p:[14,36,850]}],style:[{t:2,x:{r:["data.setting"],s:'_0==3?"selected":null'},p:[14,89,903]}],action:"setting",params:'{"amount": 3}'},f:["9"]}," ",{p:[15,6,1006],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=4?null:"disabled"'},p:[15,36,1036]}],style:[{t:2,x:{r:["data.setting"],s:'_0==4?"selected":null'},p:[15,89,1089]}],action:"setting",params:'{"amount": 4}'},f:["12"]}," ",{p:[16,6,1193],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=5?null:"disabled"'},p:[16,36,1223]}],style:[{t:2,x:{r:["data.setting"],s:'_0==5?"selected":null'},p:[16,89,1276]}],action:"setting",params:'{"amount": 5}'},f:["15"]}]}]}," ",{p:[19,3,1410],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[21,6,1476],t:7,e:"span",f:[{t:2,x:{r:["adata.TankCurrentVolume"],s:"Math.round(_0)"},p:[21,12,1482]},"/",{t:2,r:"data.TankMaxVolume",p:[21,52,1522]}," Units"]}," ",{p:[22,6,1564],t:7,e:"br"}," ",{p:[23,5,1575],t:7,e:"br"}," ",{t:4,f:[{p:[25,7,1623],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[25,50,1666]}," units of ",{t:2,r:"name",p:[25,85,1701]}]},{p:[25,100,1716],t:7,e:"br"}],n:52,r:"adata.TankContents",p:[24,6,1587]}],n:50,r:"data.isTankLoaded",p:[20,4,1444]},{t:4,n:51,f:[{p:[28,6,1757],t:7,e:"span",a:{"class":"bad"},f:["Tank Empty"]}],r:"data.isTankLoaded"}," ",{p:[30,4,1809],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?"Eject":"Close"'},p:[30,21,1826]}],style:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?"selected":null'},p:[31,12,1881]}],state:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?null:"disabled"'},p:[32,12,1936]}],action:"purge"},f:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?"Purge Contents":"No chemicals detected"'},p:[33,20,1999]}]}]}]}],n:50,x:{r:["data.screen"],s:'_0=="home"'},p:[1,2,1]}]},e.exports=a.extend(r.exports)},{205:205}],323:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,3,31],t:7,e:"ui-section",a:{label:"Generated Power"},f:[{t:2,x:{r:["adata.generated"],s:"Math.round(_0)"},p:[3,5,73]},"W"]}," ",{p:[5,3,126],t:7,e:"ui-section",a:{label:"Orientation"},f:[{p:[6,5,164],t:7,e:"span",f:[{t:2,x:{r:["adata.angle"],s:"Math.round(_0)"},p:[6,11,170]},"° (",{t:2,r:"data.direction",p:[6,45,204]},")"]}]}," ",{p:[8,3,251],t:7,e:"ui-section",a:{label:"Adjust Angle"},f:[{p:[9,5,290],t:7,e:"ui-button",a:{icon:"step-backward",action:"angle",params:'{"adjust": -15}'},f:["15°"]}," ",{p:[10,5,387],t:7,e:"ui-button",a:{icon:"backward",action:"angle",params:'{"adjust": -5}'},f:["5°"]}," ",{p:[11,5,477],t:7,e:"ui-button",a:{icon:"forward",action:"angle",params:'{"adjust": 5}'},f:["5°"]}," ",{p:[12,5,565],t:7,e:"ui-button",a:{icon:"step-forward",action:"angle",params:'{"adjust": 15}'},f:["15°"]}]}]}," ",{p:[15,1,687],t:7,e:"ui-display",a:{title:"Tracking"},f:[{p:[16,3,720],t:7,e:"ui-section",a:{label:"Tracker Mode"},f:[{p:[17,5,759],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.tracking_state"],s:'_0==0?"selected":null'},p:[17,36,790]}],action:"tracking",params:'{"mode": 0}'},f:["Off"]}," ",{p:[19,5,907],t:7,e:"ui-button",a:{icon:"clock-o",state:[{t:2,x:{r:["data.tracking_state"],s:'_0==1?"selected":null'},p:[19,38,940]}],action:"tracking",params:'{"mode": 1}'},f:["Timed"]}," ",{p:[21,5,1059],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.connected_tracker","data.tracking_state"],s:'_0?_1==2?"selected":null:"disabled"'},p:[21,38,1092]}],action:"tracking",params:'{"mode": 2}'},f:["Auto"]}]}," ",{p:[24,3,1262],t:7,e:"ui-section",a:{label:"Tracking Rate"},f:[{p:[25,3,1300],t:7,e:"span",f:[{t:2,x:{r:["adata.tracking_rate"],s:"Math.round(_0)"},p:[25,9,1306]},"°/h (",{t:2,r:"data.rotating_way",p:[25,53,1350]},")"]}]}," ",{p:[27,3,1399],t:7,e:"ui-section",a:{label:"Adjust Rate"},f:[{p:[28,5,1437],t:7,e:"ui-button",a:{icon:"fast-backward",action:"rate",params:'{"adjust": -180}'},f:["180°"]}," ",{p:[29,5,1535],t:7,e:"ui-button",a:{icon:"step-backward",action:"rate",params:'{"adjust": -30}'},f:["30°"]}," ",{p:[30,5,1631],t:7,e:"ui-button",a:{icon:"backward",action:"rate",params:'{"adjust": -5}'},f:["5°"]}," ",{p:[31,5,1720],t:7,e:"ui-button",a:{icon:"forward",action:"rate",params:'{"adjust": 5}'},f:["5°"]}," ",{p:[32,5,1807],t:7,e:"ui-button",a:{icon:"step-forward",action:"rate",params:'{"adjust": 30}'},f:["30°"]}," ",{p:[33,5,1901],t:7,e:"ui-button",a:{icon:"fast-forward",action:"rate",params:'{"adjust": 180}'},f:["180°"]}]}]}," ",{p:{button:[{p:[38,5,2088],t:7,e:"ui-button",a:{icon:"refresh",action:"refresh"},f:["Refresh"]}]},t:7,e:"ui-display",a:{title:"Devices",button:0},f:[" ",{p:[40,2,2169],t:7,e:"ui-section",a:{label:"Solar Tracker"},f:[{p:[41,5,2209],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected_tracker"],s:'_0?"good":"bad"'},p:[41,18,2222]}]},f:[{t:2,x:{r:["data.connected_tracker"],s:'_0?"":"Not "'},p:[41,63,2267]},"Found"]}]}," ",{p:[43,2,2338],t:7,e:"ui-section",a:{label:"Solar Panels"},f:[{p:[44,3,2375],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected_panels"],s:'_0?"good":"bad"'},p:[44,16,2388]}]},f:[{t:2,x:{r:["adata.connected_panels"],s:"Math.round(_0)"},p:[44,60,2432]}," Panels Connected"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],324:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{t:4,f:[{p:[4,7,87],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.hasPowercell"],s:'_0?null:"disabled"'},p:[4,38,118]}],action:"eject"},f:["Eject"]}],n:50,r:"data.open",p:[3,5,62]}]},t:7,e:"ui-display",a:{title:"Power",button:0},f:[" ",{p:[7,3,226],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[8,5,258],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[8,22,275]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[9,14,326]}],state:[{t:2,x:{r:["data.hasPowercell"],s:'_0?null:"disabled"'},p:[9,54,366]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[10,22,431]}]}]}," ",{p:[12,3,490],t:7,e:"ui-section",a:{label:"Cell"},f:[{t:4,f:[{p:[14,7,554],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.powerLevel",p:[14,40,587]}]},f:[{t:2,x:{r:["adata.powerLevel"],s:"Math.fixed(_0)"},p:[14,61,608]},"%"]}],n:50,r:"data.hasPowercell",p:[13,5,521]},{t:4,n:51,f:[{p:[16,4,667],t:7,e:"span",a:{"class":"bad"},f:["No Cell"]}],r:"data.hasPowercell"}]}]}," ",{p:[20,1,744],t:7,e:"ui-display",a:{title:"Thermostat"},f:[{p:[21,3,779],t:7,e:"ui-section",a:{label:"Current Temperature"},f:[{p:[22,3,823],t:7,e:"span",f:[{t:2,x:{r:["adata.currentTemp"],s:"Math.round(_0)"},p:[22,9,829]},"°C"]}]}," ",{p:[24,2,894],t:7,e:"ui-section",a:{label:"Target Temperature"},f:[{p:[25,3,937],t:7,e:"span",f:[{t:2,x:{r:["adata.targetTemp"],s:"Math.round(_0)"},p:[25,9,943]},"°C"]}]}," ",{t:4,f:[{p:[28,5,1031],t:7,e:"ui-section",a:{label:"Adjust Target"},f:[{p:[29,7,1073],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.targetTemp","data.minTemp"],s:'_0>_1?null:"disabled"'},p:[29,46,1112]}],action:"target",params:'{"adjust": -20}'}}," ",{p:[30,7,1218],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.targetTemp","data.minTemp"],s:'_0>_1?null:"disabled"'},p:[30,41,1252]}],action:"target",params:'{"adjust": -5}'}}," ",{p:[31,7,1357],t:7,e:"ui-button",a:{icon:"pencil",action:"target",params:'{"target": "input"}'},f:["Set"]}," ",{p:[32,7,1450],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.targetTemp","data.maxTemp"],s:'_0<_1?null:"disabled"'},p:[32,40,1483]}],action:"target",params:'{"adjust": 5}'}}," ",{p:[33,7,1587],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.targetTemp","data.maxTemp"],s:'_0<_1?null:"disabled"'},p:[33,45,1625]}],action:"target",params:'{"adjust": 20}'}}]}],n:50,r:"data.open",p:[27,3,1008]}," ",{p:[36,3,1754],t:7,e:"ui-section",a:{label:"Mode"},f:[{t:4,f:[{p:[38,7,1808],t:7,e:"ui-button",a:{icon:"long-arrow-up",state:[{t:2,x:{r:["data.mode"],s:'_0=="heat"?"selected":null'},p:[38,46,1847]}],action:"mode",params:'{"mode": "heat"}'},f:["Heat"]}," ",{p:[39,7,1956],t:7,e:"ui-button",a:{icon:"long-arrow-down",state:[{t:2,x:{r:["data.mode"],s:'_0=="cool"?"selected":null'},p:[39,48,1997]}],action:"mode",params:'{"mode": "cool"}'},f:["Cool"]}," ",{p:[40,7,2106],t:7,e:"ui-button",a:{icon:"arrows-v",state:[{t:2,x:{r:["data.mode"],s:'_0=="auto"?"selected":null'},p:[40,41,2140]}],action:"mode",params:'{"mode": "auto"}'},f:["Auto"]}],n:50,r:"data.open",p:[37,3,1783]},{t:4,n:51,f:[{p:[42,4,2258],t:7,e:"span",f:[{t:2,x:{r:["text","data.mode"],s:"_0.titleCase(_1)"},p:[42,10,2264]}]}],r:"data.open"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],325:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:{button:[{p:[4,8,97],t:7,e:"ui-button",a:{action:"jump",params:['{"name" : ',{t:2,r:"name",p:[4,51,140]},"}"]},f:["Jump"]}," ",{p:[7,9,195],t:7,e:"ui-button",a:{action:"spawn",params:['{"name" : ',{t:2,r:"name",p:[7,53,239]},"}"]},f:["Spawn"]}]},t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[2,22,46]}],button:0},f:[" ",{p:[11,3,308],t:7,e:"ui-section",a:{label:"Description"},f:[{p:[12,5,346],t:7,e:"span",f:[{t:3,r:"desc",p:[12,11,352]}]}]}," ",{p:[14,3,390],t:7,e:"ui-section",a:{label:"Spawners left"},f:[{p:[15,5,430],t:7,e:"span",f:[{t:2,r:"amount_left",p:[15,11,436]}]}]}]}],n:52,r:"data.spawners",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{205:205}],326:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,31],t:7,e:"ui-display",a:{title:[{t:2,r:"class",p:[2,22,50]}," Alarms"]},f:[{p:[3,5,74],t:7,e:"ul",f:[{t:4,f:[{p:[5,9,107],t:7,e:"li",f:[{t:2,r:".",p:[5,13,111]}]}],n:52,r:".",p:[4,7,86]},{t:4,n:51,f:[{p:[7,9,147],t:7,e:"li",f:["System Nominal"]}],r:"."}]}]}],n:52,i:"class",r:"data.alarms",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{205:205}],327:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,42],t:7,e:"ui-notice",f:[{p:[3,5,59],t:7,e:"span",f:["Biological entity detected in contents. Please remove."]}]}],n:50,x:{r:["data.occupied","data.safeties"],s:"_0&&_1"},p:[1,1,0]},{t:4,f:[{p:[7,3,179],t:7,e:"ui-notice",f:[{p:[8,5,196],t:7,e:"span",f:["Contents are being disinfected. Please wait."]}]}],n:50,r:"data.uv_active",p:[6,1,153]},{t:4,n:51,f:[{p:{button:[{t:4,f:[{p:[13,25,369],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[13,42,386]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Unlock":"Lock"'},p:[13,93,437]}]}],n:50,x:{r:["data.open"],s:"!_0"},p:[13,7,351]}," ",{t:4,f:[{p:[14,27,519],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"sign-out":"sign-in"'},p:[14,44,536]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Close":"Open"'},p:[14,98,590]}]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[14,7,499]}]},t:7,e:"ui-display",a:{title:"Storage",button:0},f:[" ",{t:4,f:[{p:[17,7,692],t:7,e:"ui-notice",f:[{p:[18,9,713],t:7,e:"span",f:["Unit Locked"]}]}],n:50,r:"data.locked",p:[16,5,665]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.open"],s:"_0"},f:[{p:[21,9,793],t:7,e:"ui-section",a:{label:"Helmet"},f:[{p:[22,11,832],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.helmet"],s:'_0?"square":"square-o"'},p:[22,28,849]}],state:[{t:2,x:{r:["data.helmet"],s:'_0?null:"disabled"'},p:[22,75,896]}],action:"dispense",params:'{"item": "helmet"}'},f:[{t:2,x:{r:["data.helmet"],s:'_0||"Empty"'},p:[23,59,992]}]}]}," ",{p:[25,9,1063],t:7,e:"ui-section",a:{label:"Suit"},f:[{p:[26,11,1100],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.suit"],s:'_0?"square":"square-o"'},p:[26,28,1117]}],state:[{t:2,x:{r:["data.suit"],s:'_0?null:"disabled"'},p:[26,74,1163]}],action:"dispense",params:'{"item": "suit"}'},f:[{t:2,x:{r:["data.suit"],s:'_0||"Empty"'},p:[27,57,1255]}]}]}," ",{p:[29,9,1324],t:7,e:"ui-section",a:{label:"Mask"},f:[{p:[30,11,1361],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mask"],s:'_0?"square":"square-o"'},p:[30,28,1378]}],state:[{t:2,x:{r:["data.mask"],s:'_0?null:"disabled"'},p:[30,74,1424]}],action:"dispense",params:'{"item": "mask"}'},f:[{t:2,x:{r:["data.mask"],s:'_0||"Empty"'},p:[31,57,1516]}]}]}," ",{p:[33,9,1585],t:7,e:"ui-section",a:{label:"Storage"},f:[{p:[34,11,1625],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.storage"],s:'_0?"square":"square-o"'},p:[34,28,1642]}],state:[{t:2,x:{r:["data.storage"],s:'_0?null:"disabled"'},p:[34,77,1691]}],action:"dispense",params:'{"item": "storage"}'},f:[{t:2,x:{r:["data.storage"],s:'_0||"Empty"'},p:[35,60,1789]}]}]}]},{t:4,n:50,x:{r:["data.open"],s:"!(_0)"},f:[" ",{p:[38,7,1873],t:7,e:"ui-button",a:{icon:"recycle",state:[{t:2,x:{r:["data.occupied","data.safeties"],s:'_0&&_1?"disabled":null'},p:[38,40,1906]}],action:"uv"},f:["Disinfect"]}]}],r:"data.locked"}]}],r:"data.uv_active"}]},e.exports=a.extend(r.exports)},{205:205}],328:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,5,18],t:7,e:"ui-section",a:{label:"Dispense"},f:[{p:[3,9,57],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.plasma"],s:'_0?"square":"square-o"'},p:[3,26,74]}],state:[{t:2,x:{r:["data.plasma"],s:'_0?null:"disabled"'},p:[3,74,122]}],action:"plasma"},f:["Plasma (",{t:2,x:{r:["adata.plasma"],s:"Math.round(_0)"},p:[4,37,196]},")"]}," ",{p:[5,9,247],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.oxygen"],s:'_0?"square":"square-o"'},p:[5,26,264]}],state:[{t:2,x:{r:["data.oxygen"],s:'_0?null:"disabled"'},p:[5,74,312]}],action:"oxygen"},f:["Oxygen (",{t:2,x:{r:["adata.oxygen"],s:"Math.round(_0)"},p:[6,37,386]},")"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],329:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{tankPressureState:function(){var t=this.get("data.tankPressure");return t>=200?"good":t>=100?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[14,1,295],t:7,e:"ui-notice",f:[{p:[15,3,310],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.connected"],s:'_0?"is":"is not"'},p:[15,23,330]}," connected to a mask."]}]}," ",{p:[17,1,409],t:7,e:"ui-display",f:[{p:[18,3,425],t:7,e:"ui-section",a:{label:"Tank Pressure"},f:[{p:[19,7,467],t:7,e:"ui-bar",a:{min:"0",max:"1013",value:[{t:2,r:"data.tankPressure",p:[19,41,501]}],state:[{t:2,r:"tankPressureState",p:[20,16,540]}]},f:[{t:2,x:{r:["adata.tankPressure"],s:"Math.round(_0)"},p:[20,39,563]}," kPa"]}]}," ",{p:[22,3,631],t:7,e:"ui-section",a:{label:"Release Pressure"},f:[{p:[23,5,674],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.minReleasePressure",p:[23,18,687]}],max:[{t:2,r:"data.maxReleasePressure",p:[23,52,721]}],value:[{t:2,r:"data.releasePressure",p:[24,14,764]}]},f:[{t:2,x:{r:["adata.releasePressure"],s:"Math.round(_0)"},p:[24,40,790]}," kPa"]}]}," ",{p:[26,3,861],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[27,5,906],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.releasePressure","data.defaultReleasePressure"],s:'_0!=_1?null:"disabled"'},p:[27,38,939]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[29,5,1095],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.releasePressure","data.minReleasePressure"],s:'_0>_1?null:"disabled"'},p:[29,36,1126]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[31,5,1273],t:7,e:"ui-button",
+a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[32,5,1368],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.releasePressure","data.maxReleasePressure"],s:'_0<_1?null:"disabled"'},p:[32,35,1398]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],330:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,5,33],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[3,9,75],t:7,e:"span",f:[{t:2,x:{r:["adata.temperature"],s:"Math.fixed(_0,2)"},p:[3,15,81]}," K"]}]}," ",{p:[5,5,151],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[6,9,190],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.fixed(_0,2)"},p:[6,15,196]}," kPa"]}]}]}," ",{p:[9,1,276],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[10,5,311],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[11,9,347],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[11,26,364]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[11,70,408]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[12,28,469]}]}]}," ",{p:[14,5,531],t:7,e:"ui-section",a:{label:"Target Temperature"},f:[{p:[15,9,580],t:7,e:"ui-button",a:{icon:"fast-backward",style:[{t:2,x:{r:["data.target","data.min"],s:'_0==_1?"disabled":null'},p:[15,48,619]}],action:"target",params:'{"adjust": -20}'}}," ",{p:[17,9,733],t:7,e:"ui-button",a:{icon:"backward",style:[{t:2,x:{r:["data.target","data.min"],s:'_0==_1?"disabled":null'},p:[17,43,767]}],action:"target",params:'{"adjust": -5}'}}," ",{p:[19,9,880],t:7,e:"ui-button",a:{icon:"pencil",action:"target",params:'{"target": "input"}'},f:[{t:2,x:{r:["adata.target"],s:"Math.fixed(_0,2)"},p:[19,79,950]}]}," ",{p:[20,9,1003],t:7,e:"ui-button",a:{icon:"forward",style:[{t:2,x:{r:["data.target","data.max"],s:'_0==_1?"disabled":null'},p:[20,42,1036]}],action:"target",params:'{"adjust": 5}'}}," ",{p:[22,9,1148],t:7,e:"ui-button",a:{icon:"fast-forward",style:[{t:2,x:{r:["data.target","data.max"],s:'_0==_1?"disabled":null'},p:[22,47,1186]}],action:"target",params:'{"adjust": 20}'}}]}]}]},e.exports=a.extend(r.exports)},{205:205}],331:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{powerState:function(t){switch(t){case 1:return"good";default:return"bad"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[13,1,173],t:7,e:"ui-notice",f:[{p:[14,2,187],t:7,e:"ui-section",a:{label:"Reconnect"},f:[{p:[15,3,221],t:7,e:"div",a:{style:"float:right"},f:[{p:[16,4,251],t:7,e:"ui-button",a:{icon:"refresh",action:"reconnect"},f:["Reconnect"]}]}]}]}," ",{p:[20,1,359],t:7,e:"ui-display",a:{title:"Turbine Controller"},f:[{p:[21,2,401],t:7,e:"ui-section",a:{label:"Status"},f:[{t:4,f:[{p:[23,4,456],t:7,e:"span",a:{"class":"bad"},f:["Broken"]}],n:50,r:"data.broken",p:[22,3,432]},{t:4,n:51,f:[{p:[25,4,504],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.online"],s:"_0(_1)"},p:[25,17,517]}]},f:[{t:2,x:{r:["data.online","data.compressor_broke","data.turbine_broke"],s:'_0&&!(_1||_2)?"Online":"Offline"'},p:[25,46,546]}]}],r:"data.broken"}," ",{p:[27,3,656],t:7,e:"div",a:{style:"float:right"},f:[{p:[28,4,686],t:7,e:"ui-button",a:{icon:"power-off",action:"power-on",state:[{t:2,r:"data.broken",p:[28,57,739]}],style:[{t:2,x:{r:["data.online"],s:'_0?"selected":""'},p:[28,81,763]}]},f:["On"]}," ",{p:[29,4,817],t:7,e:"ui-button",a:{icon:"close",action:"power-off",state:[{t:2,r:"data.broken",p:[29,54,867]}],style:[{t:2,x:{r:["data.online"],s:'_0?"":"selected"'},p:[29,78,891]}]},f:["Off"]}]}," ",{t:4,f:[{p:[32,4,989],t:7,e:"br"}," [ ",{p:[33,6,1e3],t:7,e:"span",a:{"class":"bad"},f:["Compressor is inoperable"]}," ]"],n:50,r:"data.compressor_broke",p:[31,3,955]}," ",{t:4,f:[{p:[36,4,1097],t:7,e:"br"}," [ ",{p:[37,6,1108],t:7,e:"span",a:{"class":"bad"},f:["Turbine is inoperable"]}," ]"],n:50,r:"data.turbine_broke",p:[35,3,1066]}]}]}," ",{p:[41,1,1200],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[42,2,1230],t:7,e:"ui-section",a:{label:"Turbine Speed"},f:[{p:[43,3,1268],t:7,e:"span",f:[{t:2,x:{r:["data.broken","data.rpm"],s:'_0?"--":_1'},p:[43,9,1274]}," RPM"]}]}," ",{p:[45,2,1337],t:7,e:"ui-section",a:{label:"Internal Temp"},f:[{p:[46,3,1375],t:7,e:"span",f:[{t:2,x:{r:["data.broken","data.temp"],s:'_0?"--":_1'},p:[46,9,1381]}," K"]}]}," ",{p:[48,2,1443],t:7,e:"ui-section",a:{label:"Generated Power"},f:[{p:[49,3,1483],t:7,e:"span",f:[{t:2,x:{r:["data.broken","data.power"],s:'_0?"--":_1'},p:[49,9,1489]}]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],332:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{},oninit:function(){this.on({hover:function(t){var e=this.get("data.telecrystals");e>=t.context.params.cost&&this.set("hovered",t.context.params)},unhover:function(t){this.set("hovered")}})}}}(r),r.exports.template={v:3,t:[" ",{p:{button:[{t:4,f:[{p:[23,7,482],t:7,e:"ui-button",a:{icon:"lock",action:"lock"},f:["Lock"]}],n:50,r:"data.lockable",p:[22,5,453]}]},t:7,e:"ui-display",a:{title:"Uplink",button:0},f:[" ",{p:[26,3,568],t:7,e:"ui-section",a:{label:"Telecrystals",right:0},f:[{p:[27,5,613],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.telecrystals"],s:'_0>0?"good":"bad"'},p:[27,18,626]}]},f:[{t:2,r:"data.telecrystals",p:[27,62,670]}," TC"]}]}]}," ",{t:4,f:[{p:[31,3,764],t:7,e:"ui-display",f:[{p:[32,2,779],t:7,e:"ui-button",a:{action:"select",params:['{"category": "',{t:2,r:"name",p:[32,51,828]},'"}']},f:[{t:2,r:"name",p:[32,63,840]}]}," ",{t:4,f:[{p:[34,4,883],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[34,23,902]}],candystripe:0,right:0},f:[{p:[35,3,934],t:7,e:"ui-button",a:{tooltip:[{t:2,r:"name",p:[35,23,954]},": ",{t:2,r:"desc",p:[35,33,964]}],"tooltip-side":"left",state:[{t:2,x:{r:["data.telecrystals","hovered.cost","cost","hovered.item","name"],s:'_0<_2||(_0-_1<_2&&_3!=_4)?"disabled":null'},p:[36,12,1006]}],action:"buy",params:['{"category": "',{t:2,r:"category",p:[37,40,1165]},'", "item": ',{t:2,r:"name",p:[37,63,1188]},', "cost": ',{t:2,r:"cost",p:[37,81,1206]},"}"]},v:{hover:"hover",unhover:"unhover"},f:[{t:2,r:"cost",p:[38,43,1260]}," TC"]}]}],n:52,r:"items",p:[33,2,863]}]}],n:52,r:"data.categories",p:[30,1,735]}]},e.exports=a.extend(r.exports)},{205:205}],333:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{healthState:function(t){var e=this.get("data.vr_avatar.maxhealth");return t>e/1.5?"good":t>e/3?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[14,1,292],t:7,e:"ui-display",f:[{t:4,f:[{p:[16,3,333],t:7,e:"ui-display",a:{title:"Virtual Avatar"},f:[{p:[17,4,373],t:7,e:"ui-section",a:{label:"Name"},f:[{t:2,r:"data.vr_avatar.name",p:[18,5,404]}]}," ",{p:[20,4,450],t:7,e:"ui-section",a:{label:"Status"},f:[{t:2,r:"data.vr_avatar.status",p:[21,5,483]}]}," ",{p:[23,4,531],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[24,5,564],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.vr_avatar.maxhealth",p:[24,26,585]}],value:[{t:2,r:"adata.vr_avatar.health",p:[24,64,623]}],state:[{t:2,x:{r:["healthState","adata.vr_avatar.health"],s:"_0(_1)"},p:[24,99,658]}]},f:[{t:2,x:{r:["adata.vr_avatar.health"],s:"Math.round(_0)"},p:[24,140,699]},"/",{t:2,r:"adata.vr_avatar.maxhealth",p:[24,179,738]}]}]}]}],n:50,r:"data.vr_avatar",p:[15,2,307]},{t:4,n:51,f:[{p:[28,3,826],t:7,e:"ui-display",a:{title:"Virtual Avatar"},f:["No Virtual Avatar detected"]}],r:"data.vr_avatar"}," ",{p:[32,2,922],t:7,e:"ui-display",a:{title:"VR Commands"},f:[{p:[33,3,958],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.toggle_open"],s:'_0?"times":"plus"'},p:[33,20,975]}],action:"toggle_open"},f:[{t:2,x:{r:["data.toggle_open"],s:'_0?"Close":"Open"'},p:[34,4,1042]}," the VR Sleeper"]}," ",{t:4,f:[{p:[37,4,1144],t:7,e:"ui-button",a:{icon:"signal",action:"vr_connect"},f:["Connect to VR"]}],n:50,r:"data.isoccupant",p:[36,3,1116]}," ",{t:4,f:[{p:[42,4,1267],t:7,e:"ui-button",a:{icon:"ban",action:"delete_avatar"},f:["Delete Virtual Avatar"]}],n:50,r:"data.vr_avatar",p:[41,3,1240]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],334:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{t:4,f:[{p:[3,5,42],t:7,e:"ui-section",a:{label:[{t:2,r:"color",p:[3,24,61]},{t:2,x:{r:["wire"],s:'_0?" ("+_0+")":""'},p:[3,33,70]}],labelcolor:[{t:2,r:"color",p:[3,80,117]}],candystripe:0,right:0},f:[{p:[4,7,154],t:7,e:"ui-button",a:{action:"cut",params:['{"wire":"',{t:2,r:"color",p:[4,48,195]},'"}']},f:[{t:2,x:{r:["cut"],s:'_0?"Mend":"Cut"'},p:[4,61,208]}]}," ",{p:[5,7,252],t:7,e:"ui-button",a:{action:"pulse",params:['{"wire":"',{t:2,r:"color",p:[5,50,295]},'"}']},f:["Pulse"]}," ",{p:[6,7,333],t:7,e:"ui-button",a:{action:"attach",params:['{"wire":"',{t:2,r:"color",p:[6,51,377]},'"}']},f:[{t:2,x:{r:["attached"],s:'_0?"Detach":"Attach"'},p:[6,64,390]}]}]}],n:52,r:"data.wires",p:[2,3,16]}]}," ",{t:4,f:[{p:[11,3,508],t:7,e:"ui-display",f:[{t:4,f:[{p:[13,7,555],t:7,e:"ui-section",f:[{t:2,r:".",p:[13,19,567]}]}],n:52,r:"data.status",p:[12,5,526]}]}],n:50,r:"data.status",p:[10,1,485]}]},e.exports=a.extend(r.exports)},{205:205}],335:[function(t,e,n){(function(e){"use strict";var n=t(205),a=e.interopRequireDefault(n);t(194),t(1),t(190),t(193);var r=t(336),i=e.interopRequireDefault(r),o=t(337),s=t(191),p=t(192),u=e.interopRequireDefault(p);a["default"].DEBUG=/minified/.test(function(){}),Object.assign(Math,t(341)),window.initialize=function(e){window.tgui=window.tgui||new i["default"]({el:"#container",data:function(){var n=JSON.parse(e);return{constants:t(338),text:t(342),config:n.config,data:n.data,adata:n.data}}})};var c=document.getElementById("data"),l=c.textContent,d=c.getAttribute("data-ref");"{}"!==l&&(window.initialize(l),c.remove()),(0,o.act)(d,"tgui:initialize"),(0,s.loadCSS)("font-awesome.min.css");var f=new u["default"]("FontAwesome");f.check("").then(function(){return document.body.classList.add("icons")})["catch"](function(){return document.body.classList.add("no-icons")})}).call(this,t("babel/external-helpers"))},{1:1,190:190,191:191,192:192,193:193,194:194,205:205,336:336,337:337,338:338,341:341,342:342,"babel/external-helpers":"babel/external-helpers"}],336:[function(t,e,n){var a=t(205),r={exports:{}};!function(e){"use strict";var n=t(337),a=t(339);e.exports={components:{"ui-bar":t(206),"ui-button":t(207),"ui-display":t(208),"ui-input":t(209),"ui-linegraph":t(210),"ui-notice":t(211),"ui-section":t(213),"ui-subdisplay":t(214),"ui-tabs":t(215)},events:{enter:t(203).enter,space:t(203).space},transitions:{fade:t(204)},onconfig:function(){var e=this.get("config.interface"),n={ai_airlock:t(219),airalarm:t(220),"airalarm/back":t(221),"airalarm/modes":t(222),"airalarm/scrubbers":t(223),"airalarm/status":t(224),"airalarm/thresholds":t(225),"airalarm/vents":t(226),airlock_electronics:t(227),apc:t(228),atmos_alert:t(229),atmos_control:t(230),atmos_filter:t(231),atmos_mixer:t(232),atmos_pump:t(233),brig_timer:t(234),bsa:t(235),canister:t(236),cargo:t(237),cargo_express:t(238),cellular_emporium:t(239),chem_dispenser:t(240),chem_heater:t(241),chem_master:t(242),clockwork_slab:t(243),codex_gigas:t(244),computer_fabricator:t(245),crayon:t(246),crew:t(247),cryo:t(248),disposal_unit:t(249),dna_vault:t(250),dogborg_sleeper:t(251),eightball:t(252),emergency_shuttle_console:t(253),engraved_message:t(254),error:t(255),"exofab - Copia":t(256),exonet_node:t(257),firealarm:t(258),gps:t(259),gulag_console:t(260),gulag_item_reclaimer:t(261),holodeck:t(262),implantchair:t(263),intellicard:t(264),keycard_auth:t(265),labor_claim_console:t(266),language_menu:t(267),launchpad_remote:t(268),mech_bay_power_console:t(269),mulebot:t(270),ntnet_relay:t(271),ntos_ai_restorer:t(272),ntos_card:t(273),ntos_configuration:t(274),ntos_file_manager:t(275),ntos_main:t(276),ntos_net_chat:t(277),ntos_net_dos:t(278),ntos_net_downloader:t(279),ntos_net_monitor:t(280),ntos_net_transfer:t(281),ntos_power_monitor:t(282),ntos_revelation:t(283),ntos_station_alert:t(284),ntos_supermatter_monitor:t(285),ntosheader:t(286),nuclear_bomb:t(287),operating_computer:t(288),ore_redemption_machine:t(289),pandemic:t(290),personal_crafting:t(291),portable_pump:t(292),portable_scrubber:t(293),power_monitor:t(294),radio:t(295),rdconsole:t(296),"rdconsole/circuit":t(297),"rdconsole/designview":t(298),"rdconsole/destruct":t(299),"rdconsole/diskopsdesign":t(300),"rdconsole/diskopstech":t(301),"rdconsole/nodeview":t(302),"rdconsole/protolathe":t(303),"rdconsole/rdheader":t(304),"rdconsole/settings":t(305),"rdconsole/techweb":t(306),reagentgrinder:t(307),rpd:t(308),"rpd/colorsel":t(309),"rpd/dirsel":t(310),sat_control:t(311),scp_294:t(312),scrubbing_types:t(313),shuttle_manipulator:t(314),"shuttle_manipulator/modification":t(315),"shuttle_manipulator/status":t(316),"shuttle_manipulator/templates":t(317),sleeper:t(318),slime_swap_body:t(319),smartvend:t(320),smes:t(321),smoke_machine:t(322),solar_control:t(323),space_heater:t(324),spawners_menu:t(325),station_alert:t(326),suit_storage_unit:t(327),tank_dispenser:t(328),tanks:t(329),thermomachine:t(330),turbine_computer:t(331),uplink:t(332),vr_sleeper:t(333),wires:t(334)};e in n?this.components["interface"]=n[e]:this.components["interface"]=n.error},oninit:function(){this.observe("config.style",function(t,e,n){t&&document.body.classList.add(t),e&&document.body.classList.remove(e)})},oncomplete:function(){if(this.get("config.locked")){var t=(0,a.lock)(window.screenLeft,window.screenTop),e=t.x,r=t.y;(0,n.winset)(this.get("config.window"),"pos",e+","+r)}(0,n.winset)("mapwindow.map","focus",!0)}}}(r),r.exports.template={v:3,t:[" "," "," "," ",{p:[56,1,1874],t:7,e:"titlebar",f:[{t:3,r:"config.title",p:[56,11,1884]}]}," ",{p:[57,1,1915],t:7,e:"main",f:[{p:[58,3,1925],t:7,e:"warnings"}," ",{p:[59,3,1940],t:7,e:"interface"}]}," ",{t:4,f:[{p:[62,3,1990],t:7,e:"resize"}],n:50,r:"config.titlebar",p:[61,1,1963]}]},r.exports.components=r.exports.components||{};var i={warnings:t(218),titlebar:t(217),resize:t(212)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{203:203,204:204,205:205,206:206,207:207,208:208,209:209,210:210,211:211,212:212,213:213,214:214,215:215,217:217,218:218,219:219,220:220,221:221,222:222,223:223,224:224,225:225,226:226,227:227,228:228,229:229,230:230,231:231,232:232,233:233,234:234,235:235,236:236,237:237,238:238,239:239,240:240,241:241,242:242,243:243,244:244,245:245,246:246,247:247,248:248,249:249,250:250,251:251,252:252,253:253,254:254,255:255,256:256,257:257,258:258,259:259,260:260,261:261,262:262,263:263,264:264,265:265,266:266,267:267,268:268,269:269,270:270,271:271,272:272,273:273,274:274,275:275,276:276,277:277,278:278,279:279,280:280,281:281,282:282,283:283,284:284,285:285,286:286,287:287,288:288,289:289,290:290,291:291,292:292,293:293,294:294,295:295,296:296,297:297,298:298,299:299,300:300,301:301,302:302,303:303,304:304,305:305,306:306,307:307,308:308,309:309,310:310,311:311,312:312,313:313,314:314,315:315,316:316,317:317,318:318,319:319,320:320,321:321,322:322,323:323,324:324,325:325,326:326,327:327,328:328,329:329,330:330,331:331,332:332,333:333,334:334,337:337,339:339}],337:[function(t,e,n){"use strict";function a(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return"byond://"+e+"?"+Object.keys(t).map(function(e){return o(e)+"="+o(t[e])}).join("&")}function r(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};window.location.href=a(Object.assign({src:t,action:e},n))}function i(t,e,n){var r;window.location.href=a((r={},r[t+"."+e]=n,r),"winset")}n.__esModule=!0,n.href=a,n.act=r,n.winset=i;var o=encodeURIComponent},{}],338:[function(t,e,n){"use strict";n.__esModule=!0;n.UI_INTERACTIVE=2,n.UI_UPDATE=1,n.UI_DISABLED=0,n.UI_CLOSE=-1},{}],339:[function(t,e,n){"use strict";function a(t,e){return 0>t?t=0:t+window.innerWidth>window.screen.availWidth&&(t=window.screen.availWidth-window.innerWidth),0>e?e=0:e+window.innerHeight>window.screen.availHeight&&(e=window.screen.availHeight-window.innerHeight),{x:t,y:e}}function r(t){if(t.preventDefault(),this.get("drag")){if(this.get("x")){var e=t.screenX-this.get("x")+window.screenLeft,n=t.screenY-this.get("y")+window.screenTop;if(this.get("config.locked")){var r=a(e,n);e=r.x,n=r.y}(0,s.winset)(this.get("config.window"),"pos",e+","+n)}this.set({x:t.screenX,y:t.screenY})}}function i(t,e){return t=Math.clamp(100,window.screen.width,t),e=Math.clamp(100,window.screen.height,e),{x:t,y:e}}function o(t){if(t.preventDefault(),this.get("resize")){if(this.get("x")){var e=t.screenX-this.get("x")+window.innerWidth,n=t.screenY-this.get("y")+window.innerHeight,a=i(e,n);e=a.x,n=a.y,(0,s.winset)(this.get("config.window"),"size",e+","+n)}this.set({x:t.screenX,y:t.screenY})}}n.__esModule=!0,n.lock=a,n.drag=r,n.sane=i,n.resize=o;var s=t(337)},{337:337}],340:[function(t,e,n){"use strict";function a(t,e){for(var n=t,a=Array.isArray(n),i=0,n=a?n:n[Symbol.iterator]();;){var o;if(a){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;s.textContent.toLowerCase().includes(e)?(s.style.display="",r(s,e)):s.style.display="none"}}function r(t,e){for(var n=t.queryAll("section"),a=t.query("header").textContent.toLowerCase().includes(e),r=n,i=Array.isArray(r),o=0,r=i?r:r[Symbol.iterator]();;){var s;if(i){if(o>=r.length)break;s=r[o++]}else{if(o=r.next(),o.done)break;s=o.value}var p=s;a||p.textContent.toLowerCase().includes(e)?p.style.display="":p.style.display="none"}}n.__esModule=!0,n.filterMulti=a,n.filter=r},{}],341:[function(t,e,n){"use strict";function a(t,e,n){return Math.max(t,Math.min(n,e))}function r(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return+(Math.round(t+"e"+e)+"e-"+e)}n.__esModule=!0,n.clamp=a,n.fixed=r},{}],342:[function(t,e,n){"use strict";function a(t){return t[0].toUpperCase()+t.slice(1).toLowerCase()}function r(t){return t.replace(/\w\S*/g,a)}function i(t,e){for(t=""+t;t.length1){for(var p=Array(o),u=0;o>u;u++)p[u]=arguments[u+3];n.children=p}return{$$typeof:t,type:e,key:void 0===a?null:""+a,ref:null,props:n,_owner:null}}}(),e.asyncIterator=function(t){if("function"==typeof Symbol){if(Symbol.asyncIterator){var e=t[Symbol.asyncIterator];if(null!=e)return e.call(t)}if(Symbol.iterator)return t[Symbol.iterator]()}throw new TypeError("Object is not async iterable")},e.asyncGenerator=function(){function t(t){this.value=t}function e(e){function n(t,e){return new Promise(function(n,r){var s={key:t,arg:e,resolve:n,reject:r,next:null};o?o=o.next=s:(i=o=s,a(t,e))})}function a(n,i){try{var o=e[n](i),s=o.value;s instanceof t?Promise.resolve(s.value).then(function(t){a("next",t)},function(t){a("throw",t)}):r(o.done?"return":"normal",o.value)}catch(p){r("throw",p)}}function r(t,e){switch(t){case"return":i.resolve({value:e,done:!0});break;case"throw":i.reject(e);break;default:i.resolve({value:e,done:!1})}i=i.next,i?a(i.key,i.arg):o=null}var i,o;this._invoke=n,"function"!=typeof e["return"]&&(this["return"]=void 0)}return"function"==typeof Symbol&&Symbol.asyncIterator&&(e.prototype[Symbol.asyncIterator]=function(){return this}),e.prototype.next=function(t){return this._invoke("next",t)},e.prototype["throw"]=function(t){return this._invoke("throw",t)},e.prototype["return"]=function(t){return this._invoke("return",t)},{wrap:function(t){return function(){return new e(t.apply(this,arguments))}},await:function(e){return new t(e)}}}(),e.asyncGeneratorDelegate=function(t,e){function n(n,a){return r=!0,a=new Promise(function(e){e(t[n](a))}),{done:!1,value:e(a)}}var a={},r=!1;return"function"==typeof Symbol&&Symbol.iterator&&(a[Symbol.iterator]=function(){return this}),a.next=function(t){return r?(r=!1,t):n("next",t)},"function"==typeof t["throw"]&&(a["throw"]=function(t){if(r)throw r=!1,t;return n("throw",t)}),"function"==typeof t["return"]&&(a["return"]=function(t){return n("return",t)}),a},e.asyncToGenerator=function(t){return function(){var e=t.apply(this,arguments);return new Promise(function(t,n){function a(r,i){try{var o=e[r](i),s=o.value}catch(p){return void n(p)}return o.done?void t(s):Promise.resolve(s).then(function(t){a("next",t)},function(t){a("throw",t)})}return a("next")})}},e.classCallCheck=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},e.createClass=function(){function t(t,e){for(var n=0;n=0||Object.prototype.hasOwnProperty.call(t,a)&&(n[a]=t[a]);return n},e.possibleConstructorReturn=function(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e},e.selfGlobal=void 0===t?self:t,e.set=function a(t,e,n,r){var i=Object.getOwnPropertyDescriptor(t,e);if(void 0===i){var o=Object.getPrototypeOf(t);null!==o&&a(o,e,n,r)}else if("value"in i&&i.writable)i.value=n;else{var s=i.set;void 0!==s&&s.call(r,n)}return n},e.slicedToArray=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(p){r=!0,i=p}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),e.slicedToArrayLoose=function(t,e){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t)){for(var n,a=[],r=t[Symbol.iterator]();!(n=r.next()).done&&(a.push(n.value),!e||a.length!==e););return a}throw new TypeError("Invalid attempt to destructure non-iterable instance")},e.taggedTemplateLiteral=function(t,e){return Object.freeze(Object.defineProperties(t,{raw:{value:Object.freeze(e)}}))},e.taggedTemplateLiteralLoose=function(t,e){return t.raw=e,t},e.temporalRef=function(t,e,n){if(t===n)throw new ReferenceError(e+" is not defined - temporal dead zone");return t},e.temporalUndefined={},e.toArray=function(t){return Array.isArray(t)?t:Array.from(t)},e.toConsumableArray=function(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e
{{#each packs}}
- {{cost}} Credits
+ {{cost}} Credits
{{/each}}
diff --git a/tgui/src/interfaces/cargo_express.ract b/tgui/src/interfaces/cargo_express.ract
index 4df4517310..ca03b5311b 100644
--- a/tgui/src/interfaces/cargo_express.ract
+++ b/tgui/src/interfaces/cargo_express.ract
@@ -34,7 +34,7 @@
{{#each packs}}
- {{cost}} Credits (Premium Pricing)
+ {{cost}} Credits
{{/each}}
diff --git a/tgui/src/interfaces/ore_redemption_machine.ract b/tgui/src/interfaces/ore_redemption_machine.ract
index 7d8b86982e..4015d95c3c 100644
--- a/tgui/src/interfaces/ore_redemption_machine.ract
+++ b/tgui/src/interfaces/ore_redemption_machine.ract
@@ -57,9 +57,6 @@
Ore Value
@@ -103,9 +100,6 @@
- = 1) ? null : 'disabled'}} params='{ "id" : {{id}} }'>
- Smelt All
-
{{/each}}
diff --git a/tgui/src/interfaces/scp_294.ract b/tgui/src/interfaces/scp_294.ract
index e2b36785a2..e0b302bf0c 100644
--- a/tgui/src/interfaces/scp_294.ract
+++ b/tgui/src/interfaces/scp_294.ract
@@ -1,6 +1,6 @@
- Eject
+ Eject
Input
Create Cup
diff --git a/tools/WebhookProcessor/github_webhook_processor.php b/tools/WebhookProcessor/github_webhook_processor.php
index 6a2bbc228f..e2039869d1 100644
--- a/tools/WebhookProcessor/github_webhook_processor.php
+++ b/tools/WebhookProcessor/github_webhook_processor.php
@@ -216,7 +216,7 @@ function tag_pr($payload, $opened) {
$tags[] = 'Removal';
}
- $remove = array();
+ $remove = array('Test Merge Candidate');
$mergeable = $payload['pull_request']['mergeable'];
if($mergeable === TRUE) //only look for the false value