diff --git a/code/__DEFINES/equipment.dm b/code/__DEFINES/equipment.dm
index 82e91c5680b8..5f8f27a65711 100644
--- a/code/__DEFINES/equipment.dm
+++ b/code/__DEFINES/equipment.dm
@@ -551,3 +551,8 @@ var/global/list/uniform_categories = list(
#define PHONE_MARINE "Marine"
#define PHONE_UPP_SOLDIER "Soldier"
#define PHONE_IO "IO"
+
+#define PHONE_DND_FORCED 2
+#define PHONE_DND_ON 1
+#define PHONE_DND_OFF 0
+#define PHONE_DND_FORBIDDEN -1
diff --git a/code/__DEFINES/keybinding.dm b/code/__DEFINES/keybinding.dm
index b044e3426bc1..88f194bb33df 100644
--- a/code/__DEFINES/keybinding.dm
+++ b/code/__DEFINES/keybinding.dm
@@ -43,12 +43,6 @@
#define COMSIG_KG_CLIENT_RADIO_DOWN "keybinding_client_radio_down"
//Human
-#define COMSIG_KB_HUMAN_QUICKEQUIP_DOWN "keybinding_human_quickequip_down"
-#define COMSIG_KB_HUMAN_SECONDARY_DOWN "keybinding_human_secondary_down"
-#define COMSIG_KB_HUMAN_TERTIARY_DOWN "keybinding_human_tertiary_down"
-#define COMSIG_KB_HUMAN_QUATERNARY_DOWN "keybinding_human_quaternary_down"
-#define COMSIG_KB_HUMAN_QUICK_EQUIP_DOWN "keybinding_human_quick_equip_down"
-
#define COMSIG_KB_HUMAN_ISSUE_ORDER "keybinding_human_issue_order"
#define COMSIG_KB_HUMAN_ISSUE_ORDER_MOVE "keybinding_human_issue_order_move"
#define COMSIG_KB_HUMAN_ISSUE_ORDER_HOLD "keybinding_human_issue_order_hold"
@@ -57,12 +51,31 @@
#define COMSIG_KB_HUMAN_SPECIALIST_ACTIVATION_ONE "keybinding_human_specialist_activation_one"
#define COMSIG_KB_HUMAN_SPECIALIST_ACTIVATION_TWO "keybinding_human_specialist_activation_two"
-#define COMSIG_KB_HUMAN_PICK_UP "keybinding_human_pick_up"
-
#define COMSIG_KB_HUMAN_ROTATE_CHAIR "keybinding_human_rotate_chair"
#define COMSIG_KB_HUMAN_SHOW_HELD_ITEM "keybinding_human_show_held_item"
+#define COMSIG_KB_HUMAN_CYCLE_HELMET_HUD "keybinding_human_cycle_helmet_hud"
+
+// Human Inventory Navigation
+#define COMSIG_KB_HUMAN_INTERACT_OTHER_HAND "keybinding_human_interact_other_hand"
+#define COMSIG_KB_HUMAN_INTERACT_SLOT_BACK "keybinding_human_interact_slot_back"
+#define COMSIG_KB_HUMAN_INTERACT_SLOT_BELT "keybinding_human_interact_slot_belt"
+#define COMSIG_KB_HUMAN_INTERACT_SLOT_UNIFORM "keybinding_human_interact_slot_uniform"
+#define COMSIG_KB_HUMAN_INTERACT_SLOT_SUIT "keybinding_human_interact_slot_suit"
+#define COMSIG_KB_HUMAN_INTERACT_SLOT_HELMET "keybinding_human_interact_slot_helmet"
+#define COMSIG_KB_HUMAN_INTERACT_SLOT_LEFT_POUCH "keybinding_human_interact_slot_left_pouch"
+#define COMSIG_KB_HUMAN_INTERACT_SLOT_RIGHT_POUCH "keybinding_human_interact_slot_right_pouch"
+#define COMSIG_KB_HUMAN_INTERACT_SUIT_S_STORE "keybinding_human_interact_slot_suit_storage"
+
+#define COMSIG_KB_HUMAN_INTERACT_QUICKEQUIP_DOWN "keybinding_human_interact_quickequip_down"
+#define COMSIG_KB_HUMAN_INTERACT_SECONDARY_DOWN "keybinding_human_interact_secondary_down"
+#define COMSIG_KB_HUMAN_INTERACT_TERTIARY_DOWN "keybinding_human_interact_tertiary_down"
+#define COMSIG_KB_HUMAN_INTERACT_QUATERNARY_DOWN "keybinding_human_interact_quaternary_down"
+#define COMSIG_KB_HUMAN_INTERACT_QUICK_EQUIP_DOWN "keybinding_human_interact_quick_equip_down"
+
+#define COMSIG_KB_HUMAN_INTERACT_PICK_UP "keybinding_human_interact_pick_up"
+
// Human Combat
#define COMSIG_KB_HUMAN_WEAPON_FIELDSTRIP "keybinding_human_weapon_fieldstrip"
#define COMSIG_KB_HUMAN_WEAPON_BURSTFIRE "keybinding_human_weapon_burstfire"
@@ -199,6 +212,7 @@
#define CATEGORY_CARBON "CARBON"
#define CATEGORY_HUMAN "HUMAN"
#define CATEGORY_HUMAN_COMBAT "HUMAN COMBAT"
+#define CATEGORY_HUMAN_INVENTORY "HUMAN INVENTORY"
#define CATEGORY_ROBOT "ROBOT"
#define CATEGORY_YAUTJA "YAUTJA"
#define CATEGORY_MISC "MISC"
diff --git a/code/__DEFINES/mode.dm b/code/__DEFINES/mode.dm
index b73b2a0d89af..854da7a52b4c 100644
--- a/code/__DEFINES/mode.dm
+++ b/code/__DEFINES/mode.dm
@@ -240,7 +240,7 @@ var/global/list/whitelist_hierarchy = list(WHITELIST_NORMAL, WHITELIST_COUNCIL,
#define FACTION_MONKEY "Monkey" // Nanu
#define FACTION_LIST_MARINE list(FACTION_MARINE)
-#define FACTION_LIST_HUMANOID list(FACTION_MARINE, FACTION_PMC, FACTION_WY, FACTION_WY_DEATHSQUAD, FACTION_CLF, FACTION_CONTRACTOR, FACTION_UPP, FACTION_FREELANCER, FACTION_SURVIVOR, FACTION_NEUTRAL, FACTION_COLONIST, FACTION_MERCENARY, FACTION_DUTCH, FACTION_HEFA, FACTION_GLADIATOR, FACTION_PIRATE, FACTION_PIZZA, FACTION_SOUTO, FACTION_YAUTJA, FACTION_ZOMBIE, FACTION_TWE)
+#define FACTION_LIST_HUMANOID list(FACTION_MARINE, FACTION_PMC, FACTION_WY, FACTION_WY_DEATHSQUAD, FACTION_CLF, FACTION_CONTRACTOR, FACTION_MARSHAL, FACTION_UPP, FACTION_FREELANCER, FACTION_SURVIVOR, FACTION_NEUTRAL, FACTION_COLONIST, FACTION_MERCENARY, FACTION_DUTCH, FACTION_HEFA, FACTION_GLADIATOR, FACTION_PIRATE, FACTION_PIZZA, FACTION_SOUTO, FACTION_YAUTJA, FACTION_ZOMBIE, FACTION_TWE)
#define FACTION_LIST_ERT list(FACTION_PMC, FACTION_WY_DEATHSQUAD, FACTION_CLF, FACTION_CONTRACTOR, FACTION_UPP, FACTION_FREELANCER, FACTION_MERCENARY, FACTION_DUTCH, FACTION_HEFA, FACTION_GLADIATOR, FACTION_PIRATE, FACTION_PIZZA, FACTION_SOUTO, FACTION_MARSHAL, FACTION_TWE)
#define FACTION_LIST_WY list(FACTION_PMC, FACTION_WY_DEATHSQUAD, FACTION_WY)
#define FACTION_LIST_MARINE_WY list(FACTION_MARINE, FACTION_PMC, FACTION_WY_DEATHSQUAD, FACTION_WY)
diff --git a/code/__DEFINES/xeno.dm b/code/__DEFINES/xeno.dm
index b178f0692dd6..a0a4c927d3d9 100644
--- a/code/__DEFINES/xeno.dm
+++ b/code/__DEFINES/xeno.dm
@@ -174,6 +174,10 @@
/// The time it takes for a pylon to give one larva while activated
#define XENO_PYLON_ACTIVATION_COOLDOWN (5 MINUTES)
+/// The time until you can re-corrupt a comms relay after the last pylon was destroyed
+#define XENO_PYLON_DESTRUCTION_DELAY (5 MINUTES)
+
+
/// The time against away_timer when an AFK xeno larva can be replaced
#define XENO_LEAVE_TIMER_LARVA 80 //80 seconds
/// The time against away_timer when an AFK xeno (not larva) can be replaced
diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm
index 8d6fb4266776..37c623bc3215 100644
--- a/code/__HELPERS/game.dm
+++ b/code/__HELPERS/game.dm
@@ -311,11 +311,11 @@
var/mob/dead/observer/cur_obs = candidates[i]
// Generate the messages
- var/cached_message = SPAN_XENONOTICE("You are currently [i-dequeued]\th in the larva queue.")
+ var/cached_message = "You are currently [i-dequeued]\th in the larva queue."
cur_obs.larva_queue_cached_message = cached_message
if(!cache_only)
var/chat_message = dequeued ? replacetext(cached_message, "currently", "now") : cached_message
- to_chat(candidates[i], chat_message)
+ to_chat(candidates[i], SPAN_XENONOTICE(chat_message))
/proc/convert_k2c(temp)
return ((temp - T0C))
diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm
index 99f621919771..60d2681a1d1a 100644
--- a/code/__HELPERS/icons.dm
+++ b/code/__HELPERS/icons.dm
@@ -329,7 +329,8 @@ world
/// appearance system (overlays/underlays, etc.) is not available.
///
/// Only the first argument is required.
-/proc/getFlatIcon(image/appearance, defdir, deficon, defstate, defblend, start = TRUE, no_anim = FALSE)
+/// appearance_flags indicates whether appearance_flags should be respected (at the cost of about 10-20% perf)
+/proc/getFlatIcon(image/appearance, defdir, deficon, defstate, defblend, start = TRUE, no_anim = FALSE, appearance_flags = FALSE)
// Loop through the underlays, then overlays, sorting them into the layers list
#define PROCESS_OVERLAYS_OR_UNDERLAYS(flat, process, base_layer) \
for (var/i in 1 to process.len) { \
@@ -435,11 +436,21 @@ world
if(layer_image.alpha == 0)
continue
+ // variables only relevant when accounting for appearance_flags:
+ var/apply_color = TRUE
+ var/apply_alpha = TRUE
+
if(layer_image == copy) // 'layer_image' is an /image based on the object being flattened.
curblend = BLEND_OVERLAY
add = icon(layer_image.icon, layer_image.icon_state, base_icon_dir)
else // 'I' is an appearance object.
- add = getFlatIcon(image(layer_image), curdir, curicon, curstate, curblend, FALSE, no_anim)
+ var/image/layer_as_image = image(layer_image)
+ if(appearance_flags)
+ if(layer_as_image.appearance_flags & RESET_COLOR)
+ apply_color = FALSE
+ if(layer_as_image.appearance_flags & RESET_ALPHA)
+ apply_alpha = FALSE
+ add = getFlatIcon(layer_as_image, curdir, curicon, curstate, curblend, FALSE, no_anim, appearance_flags)
if(!add)
continue
@@ -451,9 +462,9 @@ world
if (
addX1 != flatX1 \
- && addX2 != flatX2 \
- && addY1 != flatY1 \
- && addY2 != flatY2 \
+ || addX2 != flatX2 \
+ || addY1 != flatY1 \
+ || addY2 != flatY2 \
)
// Resize the flattened icon so the new icon fits
flat.Crop(
@@ -464,21 +475,34 @@ world
)
flatX1 = addX1
- flatX2 = addY1
- flatY1 = addX2
+ flatX2 = addX2
+ flatY1 = addY1
flatY2 = addY2
+ if(appearance_flags)
+ // apply parent's color/alpha to the added layers if the layer didn't opt
+ if(apply_color && appearance.color)
+ if(islist(appearance.color))
+ add.MapColors(arglist(appearance.color))
+ else
+ add.Blend(appearance.color, ICON_MULTIPLY)
+
+ if(apply_alpha && appearance.alpha < 255)
+ add.Blend(rgb(255, 255, 255, appearance.alpha), ICON_MULTIPLY)
+
// Blend the overlay into the flattened icon
flat.Blend(add, blendMode2iconMode(curblend), layer_image.pixel_x + 2 - flatX1, layer_image.pixel_y + 2 - flatY1)
- if(appearance.color)
- if(islist(appearance.color))
- flat.MapColors(arglist(appearance.color))
- else
- flat.Blend(appearance.color, ICON_MULTIPLY)
+ if(!appearance_flags)
+ // If we didn't apply parent colors individually per layer respecting appearance_flags, then do it just the one time now
+ if(appearance.color)
+ if(islist(appearance.color))
+ flat.MapColors(arglist(appearance.color))
+ else
+ flat.Blend(appearance.color, ICON_MULTIPLY)
- if(appearance.alpha < 255)
- flat.Blend(rgb(255, 255, 255, appearance.alpha), ICON_MULTIPLY)
+ if(appearance.alpha < 255)
+ flat.Blend(rgb(255, 255, 255, appearance.alpha), ICON_MULTIPLY)
if(no_anim)
//Clean up repeated frames
diff --git a/code/_onclick/adjacent.dm b/code/_onclick/adjacent.dm
index dd7a528bb8a6..6504db0d9f0c 100644
--- a/code/_onclick/adjacent.dm
+++ b/code/_onclick/adjacent.dm
@@ -94,6 +94,11 @@ Quick adjacency (to turf):
/obj/item/Adjacent(atom/neighbor, recurse = 1)
if(neighbor == loc || (loc && neighbor == loc.loc))
return TRUE
+
+ // Internal storages have special relationships with the object they are connected to and we still want two depth adjacency for storages
+ if(istype(loc?.loc, /obj/item/storage/internal) && recurse > 0)
+ return loc.loc.Adjacent(neighbor, recurse)
+
if(issurface(loc))
return loc.Adjacent(neighbor, recurse) //Surfaces don't count as storage depth.
else if(istype(loc, /obj/item))
diff --git a/code/controllers/subsystem/statpanel.dm b/code/controllers/subsystem/statpanel.dm
index 9a94eb3371f9..1f94e67a8c33 100644
--- a/code/controllers/subsystem/statpanel.dm
+++ b/code/controllers/subsystem/statpanel.dm
@@ -383,8 +383,10 @@ SUBSYSTEM_DEF(statpanels)
set name = "Open Statbrowser Options"
set hidden = TRUE
+ if (!current_fontsize)
+ current_fontsize = 12
- var/datum/statbrowser_options/SM = statbrowser_options
- if(!SM)
- SM = statbrowser_options = new(src, current_fontsize)
- SM.tgui_interact()
+ var/datum/statbrowser_options/options_panel = statbrowser_options
+ if(!options_panel)
+ options_panel = statbrowser_options = new(src, current_fontsize)
+ options_panel.tgui_interact()
diff --git a/code/datums/disease.dm b/code/datums/disease.dm
index e9c399c7b8bf..92986b668b47 100644
--- a/code/datums/disease.dm
+++ b/code/datums/disease.dm
@@ -121,10 +121,10 @@ var/list/diseases = typesof(/datum/disease) - /datum/disease
check_range = 1 // everything else, like infect-on-contact things, only infect things on top of it
if(isturf(source.loc))
- for(var/mob/living/carbon/M in oview(check_range, source))
- if(isturf(M.loc))
- if(AStar(source.loc, M.loc, /turf/proc/AdjacentTurfs, /turf/proc/Distance, check_range))
- M.contract_disease(src, 0, 1, force_spread)
+ for(var/mob/living/carbon/victim in oview(check_range, source))
+ if(isturf(victim.loc))
+ if(AStar(source.loc, victim.loc, /turf/proc/AdjacentTurfs, /turf/proc/Distance, check_range))
+ victim.contract_disease(src, 0, 1, force_spread)
return
@@ -173,8 +173,6 @@ var/list/diseases = typesof(/datum/disease) - /datum/disease
var/mob/living/carbon/human/H = affected_mob
H.med_hud_set_status()
-
-
/datum/disease/New(process=TRUE)//process = 1 - adding the object to global list. List is processed by master controller.
cure_list = list(cure_id) // to add more cures, add more vars to this list in the actual disease's New()
if(process) // Viruses in list are considered active.
diff --git a/code/datums/diseases/mob_procs.dm b/code/datums/diseases/mob_procs.dm
index 7f9704c46f47..c27efecdff84 100644
--- a/code/datums/diseases/mob_procs.dm
+++ b/code/datums/diseases/mob_procs.dm
@@ -80,9 +80,6 @@
passed = check_disease_pass_clothes(target_zone)
- if(!passed && spread_type == AIRBORNE && !internal)
- passed = (prob((50*virus.permeability_mod) - 1))
-
if(passed)
AddDisease(virus)
@@ -111,36 +108,39 @@
/mob/living/carbon/human/check_disease_pass_clothes(target_zone)
var/obj/item/clothing/Cl
+ var/protection = 0
switch(target_zone)
if(1)
if(isobj(head) && !istype(head, /obj/item/paper))
Cl = head
- . = prob((Cl.permeability_coefficient*100) - 1)
- if(. && wear_mask)
- . = prob((Cl.permeability_coefficient*100) - 1)
+ protection += (Cl.permeability_coefficient*100)-100
+ if(isobj(wear_mask))
+ Cl = wear_mask
+ protection += (Cl.permeability_coefficient*100)-100
if(2)//arms and legs included
if(isobj(wear_suit))
Cl = wear_suit
- . = prob((Cl.permeability_coefficient*100) - 1)
- if(. && isobj(WEAR_BODY))
+ protection += (Cl.permeability_coefficient*100)-100
+ if(isobj(WEAR_BODY))
Cl = WEAR_BODY
- . = prob((Cl.permeability_coefficient*100) - 1)
+ protection += (Cl.permeability_coefficient*100)-100
if(3)
if(isobj(wear_suit) && wear_suit.flags_armor_protection & BODY_FLAG_HANDS)
Cl = wear_suit
- . = prob((Cl.permeability_coefficient*100) - 1)
+ protection += (Cl.permeability_coefficient*100)-100
- if(. && isobj(gloves))
+ if(isobj(gloves))
Cl = gloves
- . = prob((Cl.permeability_coefficient*100) - 1)
+ protection += (Cl.permeability_coefficient*100)-100
if(4)
if(isobj(wear_suit) && wear_suit.flags_armor_protection & BODY_FLAG_FEET)
Cl = wear_suit
- . = prob((Cl.permeability_coefficient*100) - 1)
+ protection += (Cl.permeability_coefficient*100)-100
- if(. && isobj(shoes))
+ if(isobj(shoes))
Cl = shoes
- . = prob((Cl.permeability_coefficient*100) - 1)
+ protection += (Cl.permeability_coefficient*100)-100
else
to_chat(src, "Something bad happened with disease target zone code, tell a dev or admin ")
+ return prob(clamp(protection, 5, 90))
diff --git a/code/datums/emergency_calls/whiskey_outpost.dm b/code/datums/emergency_calls/whiskey_outpost.dm
index 8a20043da558..436e02007c6c 100644
--- a/code/datums/emergency_calls/whiskey_outpost.dm
+++ b/code/datums/emergency_calls/whiskey_outpost.dm
@@ -60,7 +60,7 @@
/datum/game_mode/whiskey_outpost/activate_distress()
var/datum/emergency_call/em_call = /datum/emergency_call/wo
- em_call.activate(FALSE)
+ em_call.activate(TRUE, FALSE)
return
/datum/emergency_call/wo/platoon
diff --git a/code/datums/keybinding/human.dm b/code/datums/keybinding/human.dm
index 6580c38083ea..6d7037eac398 100644
--- a/code/datums/keybinding/human.dm
+++ b/code/datums/keybinding/human.dm
@@ -1,8 +1,3 @@
-#define QUICK_EQUIP_PRIMARY 1
-#define QUICK_EQUIP_SECONDARY 2
-#define QUICK_EQUIP_TERTIARY 3
-#define QUICK_EQUIP_QUATERNARY 4
-
/datum/keybinding/human
category = CATEGORY_HUMAN
weight = WEIGHT_MOB
@@ -10,86 +5,6 @@
/datum/keybinding/human/can_use(client/user)
return ishuman(user.mob)
-/datum/keybinding/human/quick_equip
- hotkey_keys = list("E")
- classic_keys = list("E")
- name = "quick_equip"
- full_name = "Unholster"
- description = "Take out an available weapon"
- keybind_signal = COMSIG_KB_HUMAN_QUICKEQUIP_DOWN
-
-/datum/keybinding/human/quick_equip/down(client/user)
- . = ..()
- if(.)
- return
- var/mob/living/carbon/human/H = user.mob
- H.holster_verb(QUICK_EQUIP_PRIMARY)
- return TRUE
-
-/datum/keybinding/human/quick_equip_secondary
- hotkey_keys = list("Shift+E")
- classic_keys = list("Shift+E")
- name = "quick_equip_secondary"
- full_name = "Unholster secondary"
- description = "Take out your secondary weapon"
- keybind_signal = COMSIG_KB_HUMAN_SECONDARY_DOWN
-
-/datum/keybinding/human/quick_equip_secondary/down(client/user)
- . = ..()
- if(.)
- return
- var/mob/living/carbon/human/H = user.mob
- H.holster_verb(QUICK_EQUIP_SECONDARY)
- return TRUE
-
-/datum/keybinding/human/quick_equip_tertiary
- hotkey_keys = list("Ctrl+E", "Alt+E")
- classic_keys = list("Ctrl+E", "Alt+E")
- name = "quick_equip_tertiary"
- full_name = "Unholster tertiary"
- description = "Take out your tertiary item."
- keybind_signal = COMSIG_KB_HUMAN_TERTIARY_DOWN
-
-/datum/keybinding/human/quick_equip_tertiary/down(client/user)
- . = ..()
- if(.)
- return
- var/mob/living/carbon/human/H = user.mob
- H.holster_verb(QUICK_EQUIP_TERTIARY)
- return TRUE
-
-/datum/keybinding/human/quick_equip_quaternary
- hotkey_keys = list("Unbound")
- classic_keys = list("Unbound")
- name = "quick_equip_quaternary"
- full_name = "Unholster quaternary"
- description = "Take out your quaternary item."
- keybind_signal = COMSIG_KB_HUMAN_QUATERNARY_DOWN
-
-/datum/keybinding/human/quick_equip_quaternary/down(client/user)
- . = ..()
- if(.)
- return
- var/mob/living/carbon/human/H = user.mob
- H.holster_verb(QUICK_EQUIP_QUATERNARY)
- return TRUE
-
-/datum/keybinding/human/quick_equip_inventory
- hotkey_keys = list("Unbound")
- classic_keys = list("Unbound")
- name = "quick_equip_inventory"
- full_name = "Quick equip inventory"
- description = "Quickly puts an item in the best slot available"
- keybind_signal = COMSIG_KB_HUMAN_QUICK_EQUIP_DOWN
-
-/datum/keybinding/human/quick_equip_inventory/down(client/user)
- . = ..()
- if(.)
- return
- var/mob/living/carbon/human/H = user.mob
- H.quick_equip()
- return TRUE
-
/datum/keybinding/human/issue_order
hotkey_keys = list("Unbound")
classic_keys = list("Unbound")
@@ -103,8 +18,8 @@
. = ..()
if(.)
return
- var/mob/living/carbon/human/H = user.mob
- H.issue_order(order)
+ var/mob/living/carbon/human/human_mob = user.mob
+ human_mob.issue_order(order)
return TRUE
/datum/keybinding/human/issue_order/move
@@ -139,8 +54,8 @@
. = ..()
if(.)
return
- var/mob/living/carbon/human/H = user.mob
- H.spec_activation_one()
+ var/mob/living/carbon/human/human_mob = user.mob
+ human_mob.spec_activation_one()
return TRUE
/datum/keybinding/human/specialist_two
@@ -154,24 +69,8 @@
. = ..()
if(.)
return
- var/mob/living/carbon/human/H = user.mob
- H.spec_activation_two()
- return TRUE
-
-/datum/keybinding/human/pick_up
- hotkey_keys = list("F")
- classic_keys = list("Unbound")
- name = "pick_up"
- full_name = "Pick Up Dropped Items"
- keybind_signal = COMSIG_KB_HUMAN_PICK_UP
-
-/datum/keybinding/human/pick_up/down(client/user)
- . = ..()
- if(.)
- return
-
- var/mob/living/carbon/human/human_user = user.mob
- human_user.pickup_recent()
+ var/mob/living/carbon/human/human_mob = user.mob
+ human_mob.spec_activation_two()
return TRUE
/datum/keybinding/human/rotate_chair
@@ -209,7 +108,23 @@
shown_item.showoff(human_user)
return TRUE
-#undef QUICK_EQUIP_PRIMARY
-#undef QUICK_EQUIP_SECONDARY
-#undef QUICK_EQUIP_TERTIARY
-#undef QUICK_EQUIP_QUATERNARY
+/datum/keybinding/human/cycle_helmet_hud
+ hotkey_keys = list("Unbound")
+ classic_keys = list("Unbound")
+ name = "cycle_helmet_hud"
+ full_name = "Cycle Helmet HUD"
+ keybind_signal = COMSIG_KB_HUMAN_CYCLE_HELMET_HUD
+
+/datum/keybinding/human/cycle_helmet_hud/down(client/user)
+ . = ..()
+ if(.)
+ return
+
+ var/mob/living/carbon/human/human_user = user.mob
+ var/obj/item/clothing/head/helmet/marine/marine_helmet = human_user?.head
+ var/cycled_hud = marine_helmet?.cycle_huds(human_user)
+
+ var/datum/action/item_action/cycle_helmet_huds/cycle_action = locate() in marine_helmet.actions
+ cycle_action.set_action_overlay(cycled_hud)
+
+ return TRUE
diff --git a/code/datums/keybinding/human_combat.dm b/code/datums/keybinding/human_combat.dm
index 003fba3b00bd..2f37efc61438 100644
--- a/code/datums/keybinding/human_combat.dm
+++ b/code/datums/keybinding/human_combat.dm
@@ -1,6 +1,5 @@
/datum/keybinding/human/combat
category = CATEGORY_HUMAN_COMBAT
- weight = WEIGHT_MOB
/datum/keybinding/human/combat/can_use(client/user)
. = ..()
diff --git a/code/datums/keybinding/human_inventory.dm b/code/datums/keybinding/human_inventory.dm
new file mode 100644
index 000000000000..163cbccdd5c0
--- /dev/null
+++ b/code/datums/keybinding/human_inventory.dm
@@ -0,0 +1,244 @@
+/datum/keybinding/human/inventory
+ category = CATEGORY_HUMAN_INVENTORY
+
+#define QUICK_EQUIP_PRIMARY 1
+#define QUICK_EQUIP_SECONDARY 2
+#define QUICK_EQUIP_TERTIARY 3
+#define QUICK_EQUIP_QUATERNARY 4
+
+/datum/keybinding/human/inventory/quick_equip
+ hotkey_keys = list("E")
+ classic_keys = list("E")
+ name = "quick_equip"
+ full_name = "Unholster"
+ description = "Take out an available weapon"
+ keybind_signal = COMSIG_KB_HUMAN_INTERACT_QUICKEQUIP_DOWN
+
+/datum/keybinding/human/inventory/quick_equip/down(client/user)
+ . = ..()
+ if(.)
+ return
+ var/mob/living/carbon/human/human_mob = user.mob
+ human_mob.holster_verb(QUICK_EQUIP_PRIMARY)
+ return TRUE
+
+/datum/keybinding/human/inventory/quick_equip_secondary
+ hotkey_keys = list("Shift+E")
+ classic_keys = list("Shift+E")
+ name = "quick_equip_secondary"
+ full_name = "Unholster secondary"
+ description = "Take out your secondary weapon"
+ keybind_signal = COMSIG_KB_HUMAN_INTERACT_SECONDARY_DOWN
+
+/datum/keybinding/human/inventory/quick_equip_secondary/down(client/user)
+ . = ..()
+ if(.)
+ return
+ var/mob/living/carbon/human/human_mob = user.mob
+ human_mob.holster_verb(QUICK_EQUIP_SECONDARY)
+ return TRUE
+
+/datum/keybinding/human/inventory/quick_equip_tertiary
+ hotkey_keys = list("Ctrl+E", "Alt+E")
+ classic_keys = list("Ctrl+E", "Alt+E")
+ name = "quick_equip_tertiary"
+ full_name = "Unholster tertiary"
+ description = "Take out your tertiary item."
+ keybind_signal = COMSIG_KB_HUMAN_INTERACT_TERTIARY_DOWN
+
+/datum/keybinding/human/inventory/quick_equip_tertiary/down(client/user)
+ . = ..()
+ if(.)
+ return
+ var/mob/living/carbon/human/human_mob = user.mob
+ human_mob.holster_verb(QUICK_EQUIP_TERTIARY)
+ return TRUE
+
+/datum/keybinding/human/inventory/quick_equip_quaternary
+ hotkey_keys = list("Unbound")
+ classic_keys = list("Unbound")
+ name = "quick_equip_quaternary"
+ full_name = "Unholster quaternary"
+ description = "Take out your quaternary item."
+ keybind_signal = COMSIG_KB_HUMAN_INTERACT_QUATERNARY_DOWN
+
+/datum/keybinding/human/inventory/quick_equip_quaternary/down(client/user)
+ . = ..()
+ if(.)
+ return
+ var/mob/living/carbon/human/human_mob = user.mob
+ human_mob.holster_verb(QUICK_EQUIP_QUATERNARY)
+ return TRUE
+
+#undef QUICK_EQUIP_PRIMARY
+#undef QUICK_EQUIP_SECONDARY
+#undef QUICK_EQUIP_TERTIARY
+#undef QUICK_EQUIP_QUATERNARY
+
+/datum/keybinding/human/inventory/quick_equip_inventory
+ hotkey_keys = list("Unbound")
+ classic_keys = list("Unbound")
+ name = "quick_equip_inventory"
+ full_name = "Quick equip inventory"
+ description = "Quickly puts an item in the best slot available"
+ keybind_signal = COMSIG_KB_HUMAN_INTERACT_QUICK_EQUIP_DOWN
+
+/datum/keybinding/human/inventory/quick_equip_inventory/down(client/user)
+ . = ..()
+ if(.)
+ return
+ var/mob/living/carbon/human/human_mob = user.mob
+ human_mob.quick_equip()
+ return TRUE
+
+/datum/keybinding/human/inventory/pick_up
+ hotkey_keys = list("F")
+ classic_keys = list("Unbound")
+ name = "pick_up"
+ full_name = "Pick Up Dropped Items"
+ keybind_signal = COMSIG_KB_HUMAN_INTERACT_PICK_UP
+
+/datum/keybinding/human/inventory/pick_up/down(client/user)
+ . = ..()
+ if(.)
+ return
+
+ var/mob/living/carbon/human/human_user = user.mob
+ human_user.pickup_recent()
+ return TRUE
+
+/datum/keybinding/human/inventory/interact_other_hand
+ hotkey_keys = list("Unbound")
+ classic_keys = list("Unbound")
+ name = "interact_other_hand"
+ full_name = "Interact With Other Hand"
+ keybind_signal = COMSIG_KB_HUMAN_INTERACT_OTHER_HAND
+
+/datum/keybinding/human/inventory/interact_other_hand/down(client/user)
+ . = ..()
+ if(.)
+ return
+
+ var/mob/living/carbon/human/human_user = user.mob
+
+ var/active_hand = human_user.get_active_hand()
+ var/inactive_hand = human_user.get_inactive_hand()
+
+ if(!inactive_hand)
+ return
+ human_user.click_adjacent(inactive_hand, active_hand)
+ return TRUE
+
+#define INTERACT_KEYBIND_COOLDOWN_TIME (0.2 SECONDS)
+#define COOLDOWN_SLOT_INTERACT_KEYBIND "slot_interact_keybind_cooldown"
+
+/datum/keybinding/human/inventory/interact_slot
+ hotkey_keys = list("Unbound")
+ classic_keys = list("Unbound")
+ var/storage_slot
+
+/datum/keybinding/human/inventory/interact_slot/proc/check_slot(mob/living/carbon/human/user)
+ return
+
+/datum/keybinding/human/inventory/interact_slot/down(client/user)
+ . = ..()
+ if(.)
+ return
+ if(!storage_slot)
+ return
+ if(TIMER_COOLDOWN_CHECK(src, COOLDOWN_SLOT_INTERACT_KEYBIND))
+ return
+
+ TIMER_COOLDOWN_START(src, COOLDOWN_SLOT_INTERACT_KEYBIND, INTERACT_KEYBIND_COOLDOWN_TIME)
+ var/mob/living/carbon/human/human_user = user.mob
+ var/obj/item/current_item = check_slot(human_user)
+ var/obj/item/in_hand_item = human_user.get_active_hand()
+
+ if(in_hand_item)
+ if(!current_item)
+ if(!human_user.equip_to_slot_if_possible(in_hand_item, storage_slot, FALSE, FALSE))
+ return
+ return TRUE
+
+ current_item.attackby(in_hand_item, human_user)
+ return TRUE
+
+ if(!current_item)
+ return
+ current_item.attack_hand(human_user)
+ return TRUE
+
+/datum/keybinding/human/inventory/interact_slot/back
+ name = "interact_storage_back"
+ full_name = "Interact With Back Slot"
+ keybind_signal = COMSIG_KB_HUMAN_INTERACT_SLOT_BACK
+ storage_slot = WEAR_BACK
+
+/datum/keybinding/human/inventory/interact_slot/back/check_slot(mob/living/carbon/human/user)
+ return user.back
+
+/datum/keybinding/human/inventory/interact_slot/belt
+ name = "interact_storage_belt"
+ full_name = "Interact With Belt Slot"
+ keybind_signal = COMSIG_KB_HUMAN_INTERACT_SLOT_BELT
+ storage_slot = WEAR_WAIST
+
+/datum/keybinding/human/inventory/interact_slot/belt/check_slot(mob/living/carbon/human/user)
+ return user.belt
+
+/datum/keybinding/human/inventory/interact_slot/pouch_left
+ name = "interact_storage_pouch_left"
+ full_name = "Interact With Left Pouch Slot"
+ keybind_signal = COMSIG_KB_HUMAN_INTERACT_SLOT_LEFT_POUCH
+ storage_slot = WEAR_L_STORE
+
+/datum/keybinding/human/inventory/interact_slot/pouch_left/check_slot(mob/living/carbon/human/user)
+ return user.l_store
+
+/datum/keybinding/human/inventory/interact_slot/pouch_right
+ name = "interact_storage_pouch_right"
+ full_name = "Interact With Right Pouch Slot"
+ keybind_signal = COMSIG_KB_HUMAN_INTERACT_SLOT_RIGHT_POUCH
+ storage_slot = WEAR_R_STORE
+
+/datum/keybinding/human/inventory/interact_slot/pouch_right/check_slot(mob/living/carbon/human/user)
+ return user.r_store
+
+/datum/keybinding/human/inventory/interact_slot/uniform
+ name = "interact_storage_uniform"
+ full_name = "Interact With Uniform Slot"
+ keybind_signal = COMSIG_KB_HUMAN_INTERACT_SLOT_UNIFORM
+ storage_slot = WEAR_BODY
+
+/datum/keybinding/human/inventory/interact_slot/uniform/check_slot(mob/living/carbon/human/user)
+ return user.w_uniform
+
+/datum/keybinding/human/inventory/interact_slot/suit
+ name = "interact_storage_suit"
+ full_name = "Interact With Suit Slot"
+ keybind_signal = COMSIG_KB_HUMAN_INTERACT_SLOT_SUIT
+ storage_slot = WEAR_JACKET
+
+/datum/keybinding/human/inventory/interact_slot/suit/check_slot(mob/living/carbon/human/user)
+ return user.wear_suit
+
+/datum/keybinding/human/inventory/interact_slot/helmet
+ name = "interact_storage_helmet"
+ full_name = "Interact With Head Slot"
+ keybind_signal = COMSIG_KB_HUMAN_INTERACT_SLOT_HELMET
+ storage_slot = WEAR_HEAD
+
+/datum/keybinding/human/inventory/interact_slot/helmet/check_slot(mob/living/carbon/human/user)
+ return user.head
+
+/datum/keybinding/human/inventory/interact_slot/suit_storage
+ name = "interact_storage_suit_store"
+ full_name = "Interact With Suit Storage Slot"
+ keybind_signal = COMSIG_KB_HUMAN_INTERACT_SUIT_S_STORE
+ storage_slot = WEAR_J_STORE
+
+/datum/keybinding/human/inventory/interact_slot/suit_storage/check_slot(mob/living/carbon/human/user)
+ return user.s_store
+
+#undef INTERACT_KEYBIND_COOLDOWN_TIME
+#undef COOLDOWN_SLOT_INTERACT_KEYBIND
diff --git a/code/datums/supply_packs/gear.dm b/code/datums/supply_packs/gear.dm
index b67f8f134c25..54a2ae221c9d 100644
--- a/code/datums/supply_packs/gear.dm
+++ b/code/datums/supply_packs/gear.dm
@@ -63,15 +63,3 @@
containertype = /obj/structure/closet/crate/ammo
containername = "fulton recovery device crate"
group = "Gear"
-
-/datum/supply_packs/nvg
- name = "M2 Night Vision Goggles Crate (x3)"
- contains = list(
- /obj/item/prop/helmetgarb/helmet_nvg,
- /obj/item/prop/helmetgarb/helmet_nvg,
- /obj/item/prop/helmetgarb/helmet_nvg,
- )
- cost = 60
- containertype = /obj/structure/closet/crate/supply
- containername = "M2 Night Vission Goggles Crate"
- group = "Gear"
diff --git a/code/game/gamemodes/cm_initialize.dm b/code/game/gamemodes/cm_initialize.dm
index cc1e5449ca7a..effd3325f887 100644
--- a/code/game/gamemodes/cm_initialize.dm
+++ b/code/game/gamemodes/cm_initialize.dm
@@ -382,7 +382,7 @@ Additional game mode variables.
var/mob/dead/observer/candidate_observer = xeno_candidate
if(istype(candidate_observer))
if(candidate_observer.larva_queue_cached_message)
- to_chat(xeno_candidate, candidate_observer.larva_queue_cached_message)
+ to_chat(xeno_candidate, SPAN_XENONOTICE(candidate_observer.larva_queue_cached_message))
return FALSE
// No cache, lets check now then
@@ -393,14 +393,14 @@ Additional game mode variables.
cur_hive = GLOB.hive_datum[hive_num]
for(var/mob_name in cur_hive.banished_ckeys)
if(cur_hive.banished_ckeys[mob_name] == xeno_candidate.ckey)
- candidate_observer.larva_queue_cached_message += "\n" + SPAN_WARNING("NOTE: You are banished from the [cur_hive] and you may not rejoin unless the Queen re-admits you or dies. Your queue number won't update until there is a hive you aren't banished from.")
+ candidate_observer.larva_queue_cached_message += "\nNOTE: You are banished from the [cur_hive] and you may not rejoin unless the Queen re-admits you or dies. Your queue number won't update until there is a hive you aren't banished from."
break
- to_chat(xeno_candidate, candidate_observer.larva_queue_cached_message)
+ to_chat(xeno_candidate, SPAN_XENONOTICE(candidate_observer.larva_queue_cached_message))
return FALSE
// We aren't in queue yet, lets teach them about the queue then
- candidate_observer.larva_queue_cached_message = SPAN_XENONOTICE("You are currently awaiting assignment in the larva queue. The ordering is based on your time of death or the time you joined. When you have been dead long enough and are not inactive, you will periodically receive messages where you are in the queue relative to other currently valid xeno candidates. Your current position will shift as others change their preferences or go inactive, but your relative position compared to all observers is the same. Note: Playing as a facehugger or in the thunderdome will not alter your time of death. This means you won't lose your relative place in queue if you step away, disconnect, play as a facehugger, or play in the thunderdome.")
- to_chat(xeno_candidate, candidate_observer.larva_queue_cached_message)
+ candidate_observer.larva_queue_cached_message = "You are currently awaiting assignment in the larva queue. The ordering is based on your time of death or the time you joined. When you have been dead long enough and are not inactive, you will periodically receive messages where you are in the queue relative to other currently valid xeno candidates. Your current position will shift as others change their preferences or go inactive, but your relative position compared to all observers is the same. Note: Playing as a facehugger or in the thunderdome will not alter your time of death. This means you won't lose your relative place in queue if you step away, disconnect, play as a facehugger, or play in the thunderdome."
+ to_chat(xeno_candidate, SPAN_XENONOTICE(candidate_observer.larva_queue_cached_message))
return FALSE
var/mob/living/carbon/xenomorph/new_xeno
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index f6f75c6ba4e0..5382d80f37a2 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -105,6 +105,7 @@ var/global/cas_tracking_id_increment = 0 //this var used to assign unique tracki
np.new_player_panel_proc()
round_time_lobby = world.time
log_game("Round started at [time2text(world.realtime)]")
+ log_game("Operation time at round start is [worldtime2text()]")
if(SSticker.mode)
log_game("Game mode set to [SSticker.mode]")
log_game("Server IP: [world.internet_address]:[world.port]")
diff --git a/code/game/machinery/floodlight.dm b/code/game/machinery/floodlight.dm
index 5f6cd02a4bf8..516cdad380b1 100644
--- a/code/game/machinery/floodlight.dm
+++ b/code/game/machinery/floodlight.dm
@@ -1,30 +1,28 @@
-//these are probably broken
-
/obj/structure/machinery/floodlight
- name = "Emergency Floodlight"
+ name = "emergency floodlight"
+ desc = "A powerful light usually stationed near landing zones to provide better visibility."
icon = 'icons/obj/structures/machinery/floodlight.dmi'
icon_state = "flood00"
density = TRUE
anchored = TRUE
- var/obj/item/cell/cell = null
- var/use = 0
- var/unlocked = 0
- var/open = 0
light_power = 2
- unslashable = TRUE
- unacidable = TRUE
+ wrenchable = TRUE
+ use_power = USE_POWER_IDLE
+ idle_power_usage = 0
+ active_power_usage = 100
var/on_light_range = 6
+ ///Whether or not the floodlight can be toggled on or off
+ var/toggleable = TRUE
+
+ ///Whether or not the floodlight is turned on, disconnected from whether it has power or is lit
+ var/turned_on = FALSE
+
/obj/structure/machinery/floodlight/Initialize(mapload, ...)
. = ..()
- cell = new /obj/item/cell(src)
- if(light_on)
- set_light(on_light_range)
-/obj/structure/machinery/floodlight/Destroy()
- QDEL_NULL(cell)
- return ..()
+ turn_light(toggle_on = (operable() && turned_on))
/obj/structure/machinery/floodlight/turn_light(mob/user, toggle_on)
. = ..()
@@ -36,100 +34,51 @@
else
set_light(0)
+ update_icon()
-/obj/structure/machinery/floodlight/proc/updateicon()
- icon_state = "flood[open ? "o" : ""][open && cell ? "b" : ""]0[light_on]"
-
-/obj/structure/machinery/floodlight/attack_hand(mob/user as mob)
- if(open && cell)
- if(ishuman(user))
- if(!user.get_active_hand())
- user.put_in_hands(cell)
- cell.forceMove(user.loc)
- else
- cell.forceMove(loc)
+/obj/structure/machinery/floodlight/attack_hand(mob/user)
+ if(!toggleable)
+ to_chat(user, SPAN_NOTICE("[src] doesn't seem to have a switch to toggle the light."))
+ return
- cell.add_fingerprint(user)
- cell.update_icon()
+ if(user.lying || user.stat)
+ return
- src.cell = null
- to_chat(user, "You remove the power cell.")
- updateicon()
+ if(!is_valid_user(user))
+ to_chat(user, SPAN_NOTICE("You don't have the dexterity to do this."))
return
- if(light_on)
- to_chat(user, SPAN_NOTICE("You turn off the light."))
- turn_light(user, toggle_on = FALSE)
- unslashable = TRUE
- unacidable = TRUE
- else
- if(!cell)
- return
- if(cell.charge <= 0)
- return
- to_chat(user, SPAN_NOTICE("You turn on the light."))
- turn_light(user, toggle_on = TRUE)
- unacidable = FALSE
+ turned_on = !turned_on
- updateicon()
+ if(inoperable())
+ to_chat(user, SPAN_NOTICE("You turn [turned_on ? "on" : "off"] the floodlight. It seems to be inoperable."))
+ return
+ to_chat(user, SPAN_NOTICE("You turn [turned_on ? "on" : "off"] the light."))
+ turn_light(user, toggle_on = turned_on)
+ update_use_power(turned_on ? USE_POWER_ACTIVE : USE_POWER_IDLE)
-/obj/structure/machinery/floodlight/attackby(obj/item/W as obj, mob/user as mob)
- if(!ishuman(user))
- return
+/obj/structure/machinery/floodlight/update_icon()
+ . = ..()
+ icon_state = "flood0[light_on]"
+
+/obj/structure/machinery/floodlight/power_change(area/master_area = null)
+ . = ..()
- if (HAS_TRAIT(W, TRAIT_TOOL_WRENCH))
- if (!anchored)
- anchored = TRUE
- to_chat(user, "You anchor the [src] in place.")
- else
- anchored = FALSE
- to_chat(user, "You remove the bolts from the [src].")
-
- if (HAS_TRAIT(W, TRAIT_TOOL_SCREWDRIVER))
- if (!open)
- if(unlocked)
- unlocked = 0
- to_chat(user, "You screw the battery panel in place.")
- else
- unlocked = 1
- to_chat(user, "You unscrew the battery panel.")
-
- if (HAS_TRAIT(W, TRAIT_TOOL_CROWBAR))
- if(unlocked)
- if(open)
- open = 0
- overlays = null
- to_chat(user, "You crowbar the battery panel in place.")
- else
- if(unlocked)
- open = 1
- to_chat(user, "You remove the battery panel.")
-
- if (istype(W, /obj/item/cell))
- if(open)
- if(cell)
- to_chat(user, "There is a power cell already installed.")
- else
- if(user.drop_inv_item_to_loc(W, src))
- cell = W
- to_chat(user, "You insert the power cell.")
- updateicon()
+ turn_light(toggle_on = (!(stat & NOPOWER) && turned_on))
//Magical floodlight that cannot be destroyed or interacted with.
/obj/structure/machinery/floodlight/landing
- name = "Landing Light"
- desc = "A powerful light stationed near landing zones to provide better visibility."
+ name = "landing light"
+ desc = "A powerful light usually stationed near landing zones to provide better visibility. This one seems to have been bolted down and is unable to be moved."
icon_state = "flood01"
- light_on = TRUE
- in_use = 1
use_power = USE_POWER_NONE
-
-/obj/structure/machinery/floodlight/landing/attack_hand()
- return
-
-/obj/structure/machinery/floodlight/landing/attackby()
- return
+ needs_power = FALSE
+ unslashable = TRUE
+ unacidable = TRUE
+ wrenchable = FALSE
+ toggleable = FALSE
+ turned_on = TRUE
/obj/structure/machinery/floodlight/landing/floor
icon_state = "floor_flood01"
diff --git a/code/game/machinery/kitchen/microwave.dm b/code/game/machinery/kitchen/microwave.dm
index f4611b9042db..220772e98b17 100644
--- a/code/game/machinery/kitchen/microwave.dm
+++ b/code/game/machinery/kitchen/microwave.dm
@@ -139,7 +139,6 @@
if (!(R.id in acceptable_reagents))
to_chat(user, SPAN_DANGER("Your [O] contains components unsuitable for cookery."))
return 1
- //G.reagents.trans_to(src,G.amount_per_transfer_from_this)
else if(istype(O,/obj/item/grab))
return 1
else
@@ -152,74 +151,78 @@
/obj/structure/machinery/microwave/attack_hand(mob/user as mob)
user.set_interaction(src)
- interact(user)
+ tgui_interact(user)
+
+/obj/structure/machinery/microwave/tgui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if (!ui)
+ ui = new(user, src, "Microwave", "Microwave Controls")
+ ui.open()
//*******************
//* Microwave Menu
//********************/
-
-/obj/structure/machinery/microwave/interact(mob/user as mob) // The microwave Menu
- var/dat = ""
- if(src.broken > 0)
- dat = {"Bzzzzttttt"}
- else if(src.operating)
- dat = {"Microwaving in progress!
Please wait...!"}
- else if(src.dirty==100)
- dat = {"This microwave is dirty!
Please clean it before use!"}
- else
- var/list/items_counts = new
- var/list/items_measures = new
- var/list/items_measures_p = new
- for (var/obj/O in contents)
- var/display_name = O.name
- if (istype(O,/obj/item/reagent_container/food/snacks/egg))
- items_measures[display_name] = "egg"
- items_measures_p[display_name] = "eggs"
- if (istype(O,/obj/item/reagent_container/food/snacks/tofu))
- items_measures[display_name] = "tofu chunk"
- items_measures_p[display_name] = "tofu chunks"
- if (istype(O,/obj/item/reagent_container/food/snacks/meat)) //any meat
- items_measures[display_name] = "slab of meat"
- items_measures_p[display_name] = "slabs of meat"
- if (istype(O,/obj/item/reagent_container/food/snacks/donkpocket))
- display_name = "Turnovers"
- items_measures[display_name] = "turnover"
- items_measures_p[display_name] = "turnovers"
- if (istype(O,/obj/item/reagent_container/food/snacks/carpmeat))
- items_measures[display_name] = "fillet of meat"
- items_measures_p[display_name] = "fillets of meat"
- items_counts[display_name]++
- for (var/O in items_counts)
- var/N = items_counts[O]
- if (!(O in items_measures))
- dat += {"[capitalize(O)]: [N] [lowertext(O)]\s
"}
- else
- if (N==1)
- dat += {"[capitalize(O)]: [N] [items_measures[O]]
"}
- else
- dat += {"[capitalize(O)]: [N] [items_measures_p[O]]
"}
-
- for (var/datum/reagent/R in reagents.reagent_list)
- var/display_name = R.name
- if (R.id == "hotsauce")
- display_name = "Hotsauce"
- if (R.id == "frostoil")
- display_name = "Coldsauce"
- dat += {"[display_name]: [R.volume] unit\s
"}
-
- if (items_counts.len==0 && reagents.reagent_list.len==0)
- dat = {"The microwave is empty
"}
+/obj/structure/machinery/microwave/ui_data(mob/user)
+ var/list/data = list()
+
+ data["operating"] = operating
+ data["broken"] = (broken > 0)
+ data["dirty"] = (dirty == 100)
+
+ var/list/ingredients = list()
+ var/list/items_counts = list()
+ var/list/items_measures = list()
+ var/list/items_measures_p = list()
+
+ for (var/obj/contents_item as anything in contents)
+ var/display_name = contents_item.name
+
+ if (istype(contents_item, /obj/item/reagent_container/food/snacks/tofu))
+ items_measures[display_name] = "tofu chunk"
+ items_measures_p[display_name] = "tofu chunks"
+ if (istype(contents_item, /obj/item/reagent_container/food/snacks/meat)) //any meat
+ items_measures[display_name] = "slab of meat"
+ items_measures_p[display_name] = "slabs of meat"
+ if (istype(contents_item, /obj/item/reagent_container/food/snacks/donkpocket))
+ display_name = "Turnovers"
+ items_measures[display_name] = "turnover"
+ items_measures_p[display_name] = "turnovers"
+ if (istype(contents_item, /obj/item/reagent_container/food/snacks/carpmeat))
+ items_measures[display_name] = "fillet of meat"
+ items_measures_p[display_name] = "fillets of meat"
+ items_counts[display_name]++
+
+ for (var/contents_item in items_counts)
+ var/list/item = list()
+
+ item["name"] = capitalize(contents_item)
+ item["count"] = items_counts[contents_item]
+
+ if (!(contents_item in items_measures))
+ item["measure"] = "[lowertext(contents_item)][items_counts[contents_item] > 1 ? "s" : ""]" // Adds 's' for plurals.
+ else if (items_counts[contents_item] == 1)
+ item["measure"] = items_measures[contents_item]
else
- dat = {"Ingredients:
[dat]"}
- dat += {"
\
-Turn on!
\
-Eject ingredients!
\
-"}
+ item["measure"] = items_measures_p[contents_item]
+
+ ingredients += list(item)
+
+ for (var/datum/reagent/contents_reagent as anything in reagents.reagent_list)
+ var/list/reagent = list()
- show_browser(user, dat, "Microwave Controls", "microwave")
- return
+ reagent["count"] = contents_reagent.volume
+ reagent["measure"] = contents_reagent.volume > 1 ? "units" : "unit"
+ reagent["name"] = contents_reagent.name
+ if (contents_reagent.id == "hotsauce")
+ reagent["name"] = "Hotsauce"
+ if (contents_reagent.id == "frostoil")
+ reagent["name"] = "Coldsauce"
+ ingredients += list(reagent)
+
+ data["ingredients"] = ingredients
+ return data
//***********************************
//* Microwave Menu Handling/Cooking
@@ -322,7 +325,7 @@
if (src.reagents.total_volume)
src.dirty++
src.reagents.clear_reagents()
- to_chat(usr, SPAN_NOTICE(" You dispose of the microwave contents."))
+ to_chat(usr, SPAN_NOTICE("You dispose of the microwave contents."))
src.updateUsrDialog()
/obj/structure/machinery/microwave/proc/muck_start()
@@ -365,19 +368,16 @@
ffuu.reagents.add_reagent("toxin", amount/10)
return ffuu
-/obj/structure/machinery/microwave/Topic(href, href_list)
- if(..())
- return
-
- usr.set_interaction(src)
- if(src.operating)
- src.updateUsrDialog()
+/obj/structure/machinery/microwave/ui_act(action, params)
+ . = ..()
+ if(.)
return
- switch(href_list["action"])
+ switch (action)
if ("cook")
cook(usr.get_skill_duration_multiplier(SKILL_DOMESTIC)) // picking the right microwave setting for the right food. when's the last time you used the special setting on the microwave? i bet you just slam the 30 second increment. Do you know how much programming went into putting the Pizza setting into a microwave emitter?
- if ("dispose")
+ if ("eject_all")
dispose()
- return
+
+ return TRUE
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index 7855f446c805..c75360e07568 100644
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -11,7 +11,7 @@
black_market_value = 35
var/obj/item/charging = null
var/percent_charge_complete = 0
- var/list/allowed_devices = list(/obj/item/weapon/baton, /obj/item/cell, /obj/item/weapon/gun/energy, /obj/item/device/defibrillator, /obj/item/tool/portadialysis, /obj/item/clothing/suit/auto_cpr, /obj/item/smartgun_battery)
+ var/list/allowed_devices = list(/obj/item/weapon/baton, /obj/item/cell, /obj/item/weapon/gun/energy, /obj/item/device/defibrillator, /obj/item/tool/portadialysis, /obj/item/clothing/suit/auto_cpr, /obj/item/smartgun_battery, /obj/item/device/helmet_visor/night_vision)
var/charge_amount = 1000
@@ -181,6 +181,21 @@
update_icon()
return
+ if(istype(charging, /obj/item/device/helmet_visor/night_vision))
+ var/obj/item/device/helmet_visor/night_vision/charging_night_vision_visor = charging
+ if(charging_night_vision_visor.power_cell)
+ if(!charging_night_vision_visor.power_cell.fully_charged())
+ charging_night_vision_visor.power_cell.give(charge_amount)
+ percent_charge_complete = charging_night_vision_visor.power_cell.percent()
+ update_use_power(USE_POWER_ACTIVE)
+ update_icon()
+ return
+
+ percent_charge_complete = 100
+ update_use_power(USE_POWER_IDLE)
+ update_icon()
+ return
+
/* Disable defib recharging
if(istype(charging, /obj/item/device/defibrillator))
var/obj/item/device/defibrillator/D = charging
diff --git a/code/game/machinery/telecomms/presets.dm b/code/game/machinery/telecomms/presets.dm
index b327bd6fdf26..5f26e9d5ed25 100644
--- a/code/game/machinery/telecomms/presets.dm
+++ b/code/game/machinery/telecomms/presets.dm
@@ -218,12 +218,20 @@ GLOBAL_LIST_EMPTY(all_static_telecomms_towers)
/// Held image for the current overlay on the tower from xeno corruption
var/image/corruption_image
+ /// Holds the delay for when a cluster can recorrupt the comms tower after a pylon has been destroyed
+ COOLDOWN_DECLARE(corruption_delay)
+
/obj/structure/machinery/telecomms/relay/preset/tower/mapcomms/Initialize()
. = ..()
RegisterSignal(src, COMSIG_ATOM_TURF_CHANGE, PROC_REF(register_with_turf))
register_with_turf()
+/obj/structure/machinery/telecomms/relay/preset/tower/mapcomms/get_examine_text(mob/user)
+ . = ..()
+ if(isxeno(user) && !COOLDOWN_FINISHED(src, corruption_delay))
+ . += SPAN_XENO("Corruption cooldown: [(COOLDOWN_TIMELEFT(src, corruption_delay) / (1 SECONDS))] seconds.")
+
/obj/structure/machinery/telecomms/relay/preset/tower/mapcomms/attack_hand(mob/user)
if(user.action_busy)
return
@@ -323,6 +331,10 @@ GLOBAL_LIST_EMPTY(all_static_telecomms_towers)
addtimer(CALLBACK(src, PROC_REF(handle_xeno_acquisition), weeded_turf), (XENO_COMM_ACQUISITION_TIME - ROUND_TIME))
return
+ if(!COOLDOWN_FINISHED(src, corruption_delay))
+ addtimer(CALLBACK(src, PROC_REF(handle_xeno_acquisition), weeded_turf), (COOLDOWN_TIMELEFT(src, corruption_delay)))
+ return
+
var/obj/effect/alien/weeds/node/pylon/cluster/parent_node = weeded_turf.weeds.parent
var/obj/effect/alien/resin/special/cluster/cluster_parent = parent_node.resin_parent
@@ -362,6 +374,8 @@ GLOBAL_LIST_EMPTY(all_static_telecomms_towers)
overlays -= corruption_image
+ COOLDOWN_START(src, corruption_delay, XENO_PYLON_DESTRUCTION_DELAY)
+
/// Handles moving the overlay from growing to idle
/obj/structure/machinery/telecomms/relay/preset/tower/mapcomms/proc/switch_to_idle_corruption()
if(!corrupted)
diff --git a/code/game/machinery/vending/vendor_types/crew/synthetic.dm b/code/game/machinery/vending/vendor_types/crew/synthetic.dm
index 941b73edf5d2..472db608c0f8 100644
--- a/code/game/machinery/vending/vendor_types/crew/synthetic.dm
+++ b/code/game/machinery/vending/vendor_types/crew/synthetic.dm
@@ -101,6 +101,9 @@ GLOBAL_LIST_INIT(cm_vending_clothing_synth, list(
list("Webbing", 0, /obj/item/clothing/accessory/storage/webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR),
list("Surgical Webbing Vest", 0, /obj/item/clothing/accessory/storage/surg_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR),
list("Surgical Webbing Vest (Blue)", 0, /obj/item/clothing/accessory/storage/surg_vest/blue, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR),
+ list("Surgical Drop Pouch", 0, /obj/item/clothing/accessory/storage/surg_vest/drop_green, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR),
+ list("Surgical Drop Pouch (Blue)", 0, /obj/item/clothing/accessory/storage/surg_vest/drop_blue, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR),
+ list("Surgical Drop Pouch (Black)", 0, /obj/item/clothing/accessory/storage/surg_vest/drop_black, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR),
list("Tool Webbing", 0, /obj/item/clothing/accessory/storage/black_vest/tool_webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR),
list("Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR),
@@ -185,9 +188,11 @@ GLOBAL_LIST_INIT(cm_vending_clothing_synth_snowflake, list(
list("Medical Scrubs, White", 12, /obj/item/clothing/under/rank/medical, null, VENDOR_ITEM_REGULAR),
list("USCM Service Uniform", 12, /obj/item/clothing/under/marine/officer/bridge, null, VENDOR_ITEM_REGULAR),
list("USCM Flightsuit", 12, /obj/item/clothing/under/rank/synthetic/flight, null, VENDOR_ITEM_REGULAR),
- list("USCM Engineers Uniform", 12, /obj/item/clothing/under/marine/engineer, null, VENDOR_ITEM_REGULAR),
+ list("USCM Engineers Uniform", 12, /obj/item/clothing/under/marine/engineer/standard, null, VENDOR_ITEM_REGULAR),
+ list("USCM Engineers Uniform (Darker)", 12, /obj/item/clothing/under/marine/engineer/darker, null, VENDOR_ITEM_REGULAR),
list("USCM Engineering Officers Uniform", 12, /obj/item/clothing/under/marine/officer/engi, null, VENDOR_ITEM_REGULAR),
- list("USCM Military Police Uniform", 12, /obj/item/clothing/under/marine/mp, null, VENDOR_ITEM_REGULAR),
+ list("USCM Military Police Uniform", 12, /obj/item/clothing/under/marine/mp/standard, null, VENDOR_ITEM_REGULAR),
+ list("USCM Military Police Uniform (Darker)", 12, /obj/item/clothing/under/marine/mp/darker, null, VENDOR_ITEM_REGULAR),
list("NON-STANDARD UNIFORMS", 0, null, null, null),
list("White T-Shirt and Brown Jeans", 12, /obj/item/clothing/under/tshirt/w_br, null, VENDOR_ITEM_REGULAR),
@@ -232,6 +237,8 @@ GLOBAL_LIST_INIT(cm_vending_clothing_synth_snowflake, list(
list("Beret, Red", 12, /obj/item/clothing/head/beret/cm/red, null, VENDOR_ITEM_REGULAR),
list("Beret, Standard", 12, /obj/item/clothing/head/beret/cm, null, VENDOR_ITEM_REGULAR),
list("Beret, Tan", 12, /obj/item/clothing/head/beret/cm/tan, null, VENDOR_ITEM_REGULAR),
+ list("Beret, Black", 12, /obj/item/clothing/head/beret/cm/black, null, VENDOR_ITEM_REGULAR),
+ list("Beret, White", 12, /obj/item/clothing/head/beret/cm/white, null, VENDOR_ITEM_REGULAR),
list("Surgical Cap, Blue", 12, /obj/item/clothing/head/surgery/blue, null, VENDOR_ITEM_REGULAR),
list("Surgical Cap, Blue", 12, /obj/item/clothing/head/surgery/purple, null, VENDOR_ITEM_REGULAR),
list("Surgical Cap, Green", 12, /obj/item/clothing/head/surgery/green, null, VENDOR_ITEM_REGULAR),
@@ -274,7 +281,13 @@ GLOBAL_LIST_INIT(cm_vending_clothing_synth_snowflake, list(
list("Labcoat, Researcher", 12, /obj/item/clothing/suit/storage/labcoat/researcher, null, VENDOR_ITEM_REGULAR),
list("Quartermaster Jacket", 12, /obj/item/clothing/suit/storage/RO, null, VENDOR_ITEM_REGULAR),
list("Bio Suit", 12, /obj/item/clothing/suit/storage/synthbio, null, VENDOR_ITEM_REGULAR),
- list("USCM Poncho", 12, /obj/item/clothing/accessory/poncho, null, VENDOR_ITEM_REGULAR),
+ list("USCM Poncho (Mission-Specific Camo)", 12, /obj/item/clothing/accessory/poncho, null, VENDOR_ITEM_REGULAR),
+ list("USCM Poncho (Green)", 12, /obj/item/clothing/accessory/poncho/green, null, VENDOR_ITEM_REGULAR),
+ list("USCM Poncho (Brown)", 12, /obj/item/clothing/accessory/poncho/brown, null, VENDOR_ITEM_REGULAR),
+ list("USCM Poncho (Black)", 12, /obj/item/clothing/accessory/poncho/black, null, VENDOR_ITEM_REGULAR),
+ list("USCM Poncho (Blue)", 12, /obj/item/clothing/accessory/poncho/blue, null, VENDOR_ITEM_REGULAR),
+ list("USCM Poncho (Purple)", 12, /obj/item/clothing/accessory/poncho/purple, null, VENDOR_ITEM_REGULAR),
+
list("BACKPACK", 0, null, null, null),
list("Backpack, Industrial", 12, /obj/item/storage/backpack/industrial, null, VENDOR_ITEM_REGULAR),
diff --git a/code/game/machinery/vending/vendor_types/intelligence_officer.dm b/code/game/machinery/vending/vendor_types/intelligence_officer.dm
index 46394bea8c2c..ad10037ccfe1 100644
--- a/code/game/machinery/vending/vendor_types/intelligence_officer.dm
+++ b/code/game/machinery/vending/vendor_types/intelligence_officer.dm
@@ -7,7 +7,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_intelligence_officer, list(
list("SUPPLIES", 0, null, null, null),
list("Power Control Module", 5, /obj/item/circuitboard/apc, null, VENDOR_ITEM_REGULAR),
list("Binoculars", 5, /obj/item/device/binoculars, null, VENDOR_ITEM_REGULAR),
- list("M2 Night Vision Goggles", 25, /obj/item/prop/helmetgarb/helmet_nvg, null, VENDOR_ITEM_RECOMMENDED),
+ list("Night Vision Optic", 25, /obj/item/device/helmet_visor/night_vision, null, VENDOR_ITEM_RECOMMENDED),
list("Data Detector", 5, /obj/item/device/motiondetector/intel, null, VENDOR_ITEM_REGULAR),
list("Intel Radio Encryption Key", 5, /obj/item/device/encryptionkey/intel, null, VENDOR_ITEM_REGULAR),
list("Fire Extinguisher (Portable)", 5, /obj/item/tool/extinguisher/mini, null, VENDOR_ITEM_REGULAR),
diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_engineer.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_engineer.dm
index 543c601bda37..c0daad04f0ce 100644
--- a/code/game/machinery/vending/vendor_types/squad_prep/squad_engineer.dm
+++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_engineer.dm
@@ -24,7 +24,6 @@ GLOBAL_LIST_INIT(cm_vending_gear_engi, list(
list("Laser Designator", 15, /obj/item/device/binoculars/range/designator, null, VENDOR_ITEM_REGULAR),
list("Sandbags x25", 10, /obj/item/stack/sandbags_empty/half, null, VENDOR_ITEM_RECOMMENDED),
list("Super-Capacity Power Cell", 10, /obj/item/cell/super, null, VENDOR_ITEM_REGULAR),
- list("Welding Goggles", 5, /obj/item/clothing/glasses/welding, null, VENDOR_ITEM_REGULAR),
list("ES-11 Mobile Fuel Canister", 4, /obj/item/tool/weldpack/minitank, null, VENDOR_ITEM_REGULAR),
list("EXPLOSIVES", 0, null, null, null),
@@ -62,7 +61,6 @@ GLOBAL_LIST_INIT(cm_vending_gear_engi, list(
list("Machete Pouch (Full)", 8, /obj/item/storage/pouch/machete/full, null, VENDOR_ITEM_REGULAR),
list("USCM Radio Telephone Pack", 15, /obj/item/storage/backpack/marine/satchel/rto, null, VENDOR_ITEM_REGULAR),
list("Fuel Tank Strap Pouch", 4, /obj/item/storage/pouch/flamertank, null, VENDOR_ITEM_REGULAR),
- list("Welding Goggles", 3, /obj/item/clothing/glasses/welding, null, VENDOR_ITEM_REGULAR),
list("Sling Pouch", 6, /obj/item/storage/pouch/sling, null, VENDOR_ITEM_REGULAR),
list("Large General Pouch", 6, /obj/item/storage/pouch/general/large, null, VENDOR_ITEM_REGULAR),
list("M276 Pattern Combat Toolbelt Rig", 15, /obj/item/storage/belt/gun/utility, null, VENDOR_ITEM_REGULAR),
diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_leader.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_leader.dm
index ea3423260ec0..9845ff9cb610 100644
--- a/code/game/machinery/vending/vendor_types/squad_prep/squad_leader.dm
+++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_leader.dm
@@ -23,7 +23,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_leader, list(
list("Machete Pouch (Full)", 4, /obj/item/storage/pouch/machete/full, null, VENDOR_ITEM_REGULAR),
list("USCM Radio Telephone Pack", 5, /obj/item/storage/backpack/marine/satchel/rto, null, VENDOR_ITEM_REGULAR),
list("M276 Pattern Combat Toolbelt Rig", 15, /obj/item/storage/belt/gun/utility, null, VENDOR_ITEM_REGULAR),
- list("M2 Night Vision Goggles", 20, /obj/item/prop/helmetgarb/helmet_nvg, null, VENDOR_ITEM_RECOMMENDED),
+ list("Night Vision Optic", 20, /obj/item/device/helmet_visor/night_vision, null, VENDOR_ITEM_RECOMMENDED),
list("UTILITIES", 0, null, null, null),
list("Whistle", 3, /obj/item/device/whistle, null, VENDOR_ITEM_REGULAR),
diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_prep.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_prep.dm
index 94768340c60e..222cd4693cd2 100644
--- a/code/game/machinery/vending/vendor_types/squad_prep/squad_prep.dm
+++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_prep.dm
@@ -148,6 +148,7 @@
list("MISCELLANEOUS", -1, null, null, null),
list("Ballistic goggles", round(scale * 10), /obj/item/clothing/glasses/mgoggles, VENDOR_ITEM_REGULAR),
+ list("M1A1 Ballistic goggles", round(scale * 10), /obj/item/clothing/glasses/mgoggles/v2, VENDOR_ITEM_REGULAR),
list("Prescription ballistic goggles", round(scale * 10), /obj/item/clothing/glasses/mgoggles/prescription, VENDOR_ITEM_REGULAR),
list("Marine RPG glasses", round(scale * 10), /obj/item/clothing/glasses/regular, VENDOR_ITEM_REGULAR),
list("M5 Integrated Gas Mask", round(scale * 10), /obj/item/prop/helmetgarb/helmet_gasmask, VENDOR_ITEM_REGULAR),
diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm
index c03d79eddfd0..875f84264c0a 100644
--- a/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm
+++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm
@@ -40,7 +40,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_tl, list(
list("M276 Pattern Combat Toolbelt Rig", 15, /obj/item/storage/belt/gun/utility, null, VENDOR_ITEM_REGULAR),
list("Autoinjector Pouch (Full)", 15, /obj/item/storage/pouch/autoinjector/full, null, VENDOR_ITEM_REGULAR),
list("Insulated Gloves", 3, /obj/item/clothing/gloves/yellow, null, VENDOR_ITEM_REGULAR),
- list("M2 Night Vision Goggles", 30, /obj/item/prop/helmetgarb/helmet_nvg, null, VENDOR_ITEM_RECOMMENDED),
+ list("Night Vision Optic", 30, /obj/item/device/helmet_visor/night_vision, null, VENDOR_ITEM_RECOMMENDED),
list("UTILITIES", 0, null, null, null),
list("Binoculars", 5, /obj/item/device/binoculars, null, VENDOR_ITEM_REGULAR),
diff --git a/code/game/objects/effects/landmarks/survivor_spawner.dm b/code/game/objects/effects/landmarks/survivor_spawner.dm
index 25cc1a80d0b4..fe4254982d57 100644
--- a/code/game/objects/effects/landmarks/survivor_spawner.dm
+++ b/code/game/objects/effects/landmarks/survivor_spawner.dm
@@ -145,7 +145,7 @@
intro_text = list("You are a member of a UPP recon force!
",\
"You ARE aware of the xenomorph threat.",\
"Your primary objective is to survive. You believe a second dropship crashed somewhere to the south east, which was carrying additional weapons")
- story_text = "Your orders were simple, Recon the site, ascertain if there is a biological weapons program in the area, and if so to secure the colony and retrieve a sample. However your team failed to account for an active anti-air battery near the area. Both your craft and your sister ship crashed. Barely having a chance to catch your breath, you found yourself being assailed by vile xenomorphs! You and your team have barely held your ground, at the cost of four of your own, but more are coming and ammo is low. You believe an American rescue force is en route, but is the enemy of my enemy truly your friend?"
+ story_text = "Your orders were simple, Recon the site, ascertain if there is a biological weapons program in the area, and if so to secure the colony and retrieve a sample. However your team failed to account for an active anti-air battery near the area. Both your craft and your sister ship crashed. Barely having a chance to catch your breath, you found yourself being assailed by vile xenomorphs! You and your team have barely held your ground, at the cost of four of your own, but more are coming and ammo is low. You believe an American rescue force is en route."
spawn_priority = SPAWN_PRIORITY_LOW
/obj/effect/landmark/survivor_spawner/upp_sapper
@@ -154,7 +154,7 @@
intro_text = list("You are a member of a UPP recon force!
",\
"You ARE aware of the xenomorph threat.",\
"Your primary objective is to survive. You believe a second dropship crashed somewhere to the south east, which was carrying additional weapons")
- story_text = "Your orders were simple, Recon the site, ascertain if there is a biological weapons program in the area, and if so to secure the colony and retrieve a sample. However your team failed to account for an active anti-air battery near the area. Both your craft and your sister ship crashed. Barely having a chance to catch your breath, you found yourself being assailed by vile xenomorphs! You and your team have barely held your ground, at the cost of four of your own, but more are coming and ammo is low. You believe an American rescue force is en route, but is the enemy of my enemy truly your friend?"
+ story_text = "Your orders were simple, Recon the site, ascertain if there is a biological weapons program in the area, and if so to secure the colony and retrieve a sample. However your team failed to account for an active anti-air battery near the area. Both your craft and your sister ship crashed. Barely having a chance to catch your breath, you found yourself being assailed by vile xenomorphs! You and your team have barely held your ground, at the cost of four of your own, but more are coming and ammo is low. You believe an American rescue force is en route."
spawn_priority = SPAWN_PRIORITY_MEDIUM
/obj/effect/landmark/survivor_spawner/upp_medic
@@ -163,7 +163,7 @@
intro_text = list("You are a member of a UPP recon force!
",\
"You ARE aware of the xenomorph threat.",\
"Your primary objective is to survive. You believe a second dropship crashed somewhere to the south east, which was carrying additional weapons")
- story_text = "Your orders were simple, Recon the site, ascertain if there is a biological weapons program in the area, and if so to secure the colony and retrieve a sample. However your team failed to account for an active anti-air battery near the area. Both your craft and your sister ship crashed. Barely having a chance to catch your breath, you found yourself being assailed by vile xenomorphs! You and your team have barely held your ground, at the cost of four of your own, but more are coming and ammo is low. You believe an American rescue force is en route, but is the enemy of my enemy truly your friend?"
+ story_text = "Your orders were simple, Recon the site, ascertain if there is a biological weapons program in the area, and if so to secure the colony and retrieve a sample. However your team failed to account for an active anti-air battery near the area. Both your craft and your sister ship crashed. Barely having a chance to catch your breath, you found yourself being assailed by vile xenomorphs! You and your team have barely held your ground, at the cost of four of your own, but more are coming and ammo is low. You believe an American rescue force is en route."
spawn_priority = SPAWN_PRIORITY_MEDIUM
/obj/effect/landmark/survivor_spawner/upp_specialist
@@ -172,7 +172,7 @@
intro_text = list("You are a member of a UPP recon force!
",\
"You ARE aware of the xenomorph threat.",\
"Your primary objective is to survive. You believe a second dropship crashed somewhere to the south east, which was carrying additional weapons")
- story_text = "Your orders were simple, Recon the site, ascertain if there is a biological weapons program in the area, and if so to secure the colony and retrieve a sample. However your team failed to account for an active anti-air battery near the area. Both your craft and your sister ship crashed. Barely having a chance to catch your breath, you found yourself being assailed by vile xenomorphs! You and your team have barely held your ground, at the cost of four of your own, but more are coming and ammo is low. You believe an American rescue force is en route, but is the enemy of my enemy truly your friend?"
+ story_text = "Your orders were simple, Recon the site, ascertain if there is a biological weapons program in the area, and if so to secure the colony and retrieve a sample. However your team failed to account for an active anti-air battery near the area. Both your craft and your sister ship crashed. Barely having a chance to catch your breath, you found yourself being assailed by vile xenomorphs! You and your team have barely held your ground, at the cost of four of your own, but more are coming and ammo is low. You believe an American rescue force is en route."
spawn_priority = SPAWN_PRIORITY_HIGH
/obj/effect/landmark/survivor_spawner/squad_leader
@@ -181,5 +181,5 @@
intro_text = list("You are a member of a UPP recon force!
",\
"You ARE aware of the xenomorph threat.",\
"Your primary objective is to survive. You believe a second dropship crashed somewhere to the south east, which was carrying additional weapons")
- story_text = "Your orders were simple, Recon the site, ascertain if there is a biological weapons program in the area, and if so to secure the colony and retrieve a sample. However your team failed to account for an active anti-air battery near the area. Both your craft and your sister ship crashed. Barely having a chance to catch your breath, you found yourself being assailed by vile xenomorphs! You and your team have barely held your ground, at the cost of four of your own, but more are coming and ammo is low. You believe an American rescue force is en route, but is the enemy of my enemy truly your friend?"
+ story_text = "Your orders were simple, Recon the site, ascertain if there is a biological weapons program in the area, and if so to secure the colony and retrieve a sample. However your team failed to account for an active anti-air battery near the area. Both your craft and your sister ship crashed. Barely having a chance to catch your breath, you found yourself being assailed by vile xenomorphs! You and your team have barely held your ground, at the cost of four of your own, but more are coming and ammo is low. You believe an American rescue force is en route."
spawn_priority = SPAWN_PRIORITY_VERY_HIGH
diff --git a/code/game/objects/items/devices/helmet_visors.dm b/code/game/objects/items/devices/helmet_visors.dm
index dd913daf7620..596409c88c8b 100644
--- a/code/game/objects/items/devices/helmet_visors.dm
+++ b/code/game/objects/items/devices/helmet_visors.dm
@@ -14,31 +14,65 @@
///The sound when toggling off the visor
var/toggle_off_sound = 'sound/handling/hud_off.ogg'
- ///The icon name for our helmet's action
+ ///The icon name for our helmet's action, in 'icons/obj/items/clothing/helmet_visors.dmi'
var/action_icon_string = "hud_sight_down"
- ///The overlay name for when our visor is active
+ ///The overlay name for when our visor is active, in 'icons/mob/humans/onmob/helmet_garb.dmi'
var/helmet_overlay = "hud_sight_right"
+/obj/item/device/helmet_visor/Destroy(force)
+ if(!istype(loc, /obj/item/clothing/head/helmet/marine))
+ return ..()
+
+ if(!istype(loc?.loc, /mob/living/carbon/human))
+ return ..()
+
+ var/obj/item/clothing/head/helmet/marine/attached_helmet = loc
+ var/mob/living/carbon/human/user = loc.loc
+ deactivate_visor(attached_helmet, user)
+ . = ..()
+
/// Called to see if the user can even use this visor
/obj/item/device/helmet_visor/proc/can_toggle(mob/living/carbon/human/user)
return TRUE
/// Called to see if this visor is a special non-HUD visor
-/obj/item/device/helmet_visor/proc/visor_function(obj/item/clothing/head/helmet/marine/attached_helmet, mob/living/carbon/human/user, silent = FALSE)
+/obj/item/device/helmet_visor/proc/toggle_visor(obj/item/clothing/head/helmet/marine/attached_helmet, mob/living/carbon/human/user, silent = FALSE)
if(attached_helmet == user.head && attached_helmet.active_visor == src)
- var/datum/mob_hud/current_mob_hud = huds[hud_type]
- current_mob_hud.add_hud_to(user, attached_helmet)
+
+ if(!can_toggle(user))
+ return FALSE
+
+ activate_visor(attached_helmet, user)
+
if(!silent)
to_chat(user, SPAN_NOTICE("You activate [src] on [attached_helmet]."))
+ playsound_client(user.client, toggle_on_sound, null, 75)
+
return TRUE
- var/datum/mob_hud/current_mob_hud = huds[hud_type]
- current_mob_hud.remove_hud_from(user, attached_helmet)
+ deactivate_visor(attached_helmet, user)
+
if(!silent)
to_chat(user, SPAN_NOTICE("You deactivate [src] on [attached_helmet]."))
+ playsound_client(user.client, toggle_off_sound, null, 75)
+
return TRUE
+/// Called by toggle_visor() to activate the visor's effects
+/obj/item/device/helmet_visor/proc/activate_visor(obj/item/clothing/head/helmet/marine/attached_helmet, mob/living/carbon/human/user)
+ var/datum/mob_hud/current_mob_hud = huds[hud_type]
+ current_mob_hud.add_hud_to(user, attached_helmet)
+
+/// Called by toggle_visor() to deactivate the visor's effects
+/obj/item/device/helmet_visor/proc/deactivate_visor(obj/item/clothing/head/helmet/marine/attached_helmet, mob/living/carbon/human/user)
+ var/datum/mob_hud/current_mob_hud = huds[hud_type]
+ current_mob_hud.remove_hud_from(user, attached_helmet)
+
+/// Called by /obj/item/clothing/head/helmet/marine/get_examine_text(mob/user) to get extra examine text for this visor
+/obj/item/device/helmet_visor/proc/get_helmet_examine_text()
+ return SPAN_NOTICE("\A [name] is flipped down.")
+
/obj/item/device/helmet_visor/medical
name = "basic medical optic"
icon_state = "med_sight"
@@ -50,13 +84,75 @@
name = "advanced medical optic"
helmet_overlay = "med_sight_left"
+/obj/item/device/helmet_visor/medical/advanced/activate_visor(obj/item/clothing/head/helmet/marine/attached_helmet, mob/living/carbon/human/user)
+ . = ..()
+
+ var/datum/action/item_action/view_publications/helmet_visor/publication_action = new(attached_helmet)
+ publication_action.give_to(user)
+
+/obj/item/device/helmet_visor/medical/advanced/deactivate_visor(obj/item/clothing/head/helmet/marine/attached_helmet, mob/living/carbon/human/user)
+ . = ..()
+
+ var/datum/action/item_action/view_publications/helmet_visor/publication_action = locate() in attached_helmet.actions
+ qdel(publication_action)
+
/obj/item/device/helmet_visor/medical/advanced/can_toggle(mob/living/carbon/human/user)
+ . = ..()
+ if(!.)
+ return
+
if(!skillcheck(user, SKILL_MEDICAL, SKILL_MEDICAL_MEDIC))
to_chat(user, SPAN_NOTICE("You are not skilled enough to use [src]."))
return FALSE
return TRUE
+/obj/item/device/helmet_visor/medical/advanced/ui_state(mob/user)
+ return GLOB.not_incapacitated_and_adjacent_strict_state
+
+/obj/item/device/helmet_visor/medical/advanced/ui_data(mob/user)
+ var/list/data = list(
+ "published_documents" = chemical_data.research_publications,
+ "terminal_view" = FALSE
+ )
+ return data
+
+/obj/item/device/helmet_visor/medical/advanced/tgui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if (!ui)
+ ui = new(user, src, "PublishedDocsHud", name)
+ ui.open()
+
+/obj/item/device/helmet_visor/medical/advanced/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
+ . = ..()
+ if(.)
+ return
+
+ if(!ishuman(ui.user))
+ return
+
+ var/mob/living/carbon/human/user = ui.user
+
+ if(user.stat || user.is_mob_restrained() || !in_range(src, user))
+ return
+
+ switch(action)
+ if ("read_document")
+ var/print_type = params["print_type"]
+ var/print_title = params["print_title"]
+ var/obj/item/paper/research_report/report = chemical_data.get_report(print_type, print_title)
+ if(report)
+ report.read_paper(user)
+ return
+
+/datum/action/item_action/view_publications/helmet_visor/action_activate()
+ var/obj/item/device/helmet_visor/medical/advanced/medical_visor = locate() in holder_item
+
+ if(!medical_visor)
+ return
+
+ medical_visor.tgui_interact(owner)
+
/obj/item/device/helmet_visor/security
name = "security optic"
icon_state = "sec_sight"
@@ -71,28 +167,159 @@
action_icon_string = "blank_hud_sight_down"
helmet_overlay = "weld_visor"
-/obj/item/device/helmet_visor/welding_visor/visor_function(obj/item/clothing/head/helmet/marine/attached_helmet, mob/living/carbon/human/user, silent = FALSE)
- if(attached_helmet == user.head && attached_helmet.active_visor == src)
- attached_helmet.vision_impair = VISION_IMPAIR_MAX
- attached_helmet.flags_inventory |= COVEREYES|COVERMOUTH
- attached_helmet.flags_inv_hide |= HIDEEYES|HIDEFACE
- attached_helmet.eye_protection = EYE_PROTECTION_WELDING
- user.update_tint()
- if(!silent)
- to_chat(user, SPAN_NOTICE("You activate [src] on [attached_helmet]."))
- return TRUE
+/obj/item/device/helmet_visor/welding_visor/activate_visor(obj/item/clothing/head/helmet/marine/attached_helmet, mob/living/carbon/human/user)
+ attached_helmet.vision_impair = VISION_IMPAIR_MAX
+ attached_helmet.flags_inventory |= COVEREYES|COVERMOUTH
+ attached_helmet.flags_inv_hide |= HIDEEYES|HIDEFACE
+ attached_helmet.eye_protection = EYE_PROTECTION_WELDING
+ user.update_tint()
+/obj/item/device/helmet_visor/welding_visor/deactivate_visor(obj/item/clothing/head/helmet/marine/attached_helmet, mob/living/carbon/human/user)
attached_helmet.vision_impair = VISION_IMPAIR_NONE
attached_helmet.flags_inventory &= ~(COVEREYES|COVERMOUTH)
attached_helmet.flags_inv_hide &= ~(HIDEEYES|HIDEFACE)
attached_helmet.eye_protection = EYE_PROTECTION_NONE
- if(!silent)
- to_chat(user, SPAN_NOTICE("You deactivate [src] on [attached_helmet]."))
user.update_tint()
- return TRUE
/obj/item/device/helmet_visor/welding_visor/mercenary
helmet_overlay = ""
/obj/item/device/helmet_visor/welding_visor/tanker
helmet_overlay = "tanker_weld_visor"
+
+#define NVG_VISOR_USAGE(delta_time) (power_cell.use(power_use * (delta_time ? delta_time : 1)))
+
+/obj/item/device/helmet_visor/night_vision
+ name = "night vision optic"
+ desc = "An insertable visor HUD into a standard USCM helmet. This type gives a form of night vision and is standard issue in units with regular funding."
+ icon_state = "nvg_sight"
+ hud_type = null
+ action_icon_string = "nvg_sight_down"
+ helmet_overlay = "nvg_sight_right"
+ toggle_on_sound = 'sound/handling/toggle_nv1.ogg'
+ toggle_off_sound = 'sound/handling/toggle_nv2.ogg'
+
+ /// The internal battery for the visor
+ var/obj/item/cell/high/power_cell
+
+ /// About 5 minutes active use charge (hypothetically)
+ var/power_use = 33
+
+ /// The alpha of darkness we set to for the mob while the visor is on, not completely fullbright but see-able
+ var/lighting_alpha = 100
+
+ /// A slight glowing green light while the NVG is activated, is initialized as in the attached_helmet's contents
+ var/atom/movable/nvg_light/on_light
+
+ /// Whether or not the sight uses on_light and produces light
+ var/visor_glows = TRUE
+
+/obj/item/device/helmet_visor/night_vision/Initialize(mapload, ...)
+ . = ..()
+ power_cell = new(src)
+
+/obj/item/device/helmet_visor/night_vision/Destroy()
+ power_cell = null
+ . = ..()
+
+/obj/item/device/helmet_visor/night_vision/get_examine_text(mob/user)
+ . = ..()
+
+ . += SPAN_NOTICE("It is currently at [round((power_cell.charge / power_cell.maxcharge) * 100)]% charge.")
+
+/obj/item/device/helmet_visor/night_vision/activate_visor(obj/item/clothing/head/helmet/marine/attached_helmet, mob/living/carbon/human/user)
+ RegisterSignal(user, COMSIG_HUMAN_POST_UPDATE_SIGHT, PROC_REF(on_update_sight))
+
+ user.add_client_color_matrix("nvg_visor", 99, color_matrix_multiply(color_matrix_saturation(0), color_matrix_from_string("#7aff7a")))
+ user.overlay_fullscreen("nvg_visor", /atom/movable/screen/fullscreen/flash/noise/nvg)
+ user.overlay_fullscreen("nvg_visor_blur", /atom/movable/screen/fullscreen/brute/nvg, 3)
+ user.update_sight()
+ if(visor_glows)
+ on_light = new(attached_helmet)
+ on_light.set_light_on(TRUE)
+ START_PROCESSING(SSobj, src)
+
+/obj/item/device/helmet_visor/night_vision/deactivate_visor(obj/item/clothing/head/helmet/marine/attached_helmet, mob/living/carbon/human/user)
+ user.remove_client_color_matrix("nvg_visor", 1 SECONDS)
+ user.clear_fullscreen("nvg_visor", 0.5 SECONDS)
+ user.clear_fullscreen("nvg_visor_blur", 0.5 SECONDS)
+
+ if(visor_glows)
+ qdel(on_light)
+ UnregisterSignal(user, COMSIG_HUMAN_POST_UPDATE_SIGHT)
+
+ user.update_sight()
+ STOP_PROCESSING(SSobj, src)
+
+/obj/item/device/helmet_visor/night_vision/process(delta_time)
+ if(!NVG_VISOR_USAGE(delta_time))
+
+ if(!istype(loc, /obj/item/clothing/head/helmet/marine))
+ return PROCESS_KILL
+
+ if(!istype(loc?.loc, /mob/living/carbon/human))
+ return PROCESS_KILL
+
+ var/obj/item/clothing/head/helmet/marine/attached_helmet = loc
+ var/mob/living/carbon/human/user = loc.loc
+ to_chat(user, SPAN_NOTICE("[src] deactivates as the battery goes out."))
+ deactivate_visor(attached_helmet, user)
+ return PROCESS_KILL
+
+/obj/item/device/helmet_visor/night_vision/can_toggle(mob/living/carbon/human/user)
+ . = ..()
+ if(!.)
+ return
+
+ if(!NVG_VISOR_USAGE(FALSE))
+ to_chat(user, SPAN_NOTICE("Your [src] is out of power! You'll need to recharge it."))
+ return FALSE
+
+ return TRUE
+
+/obj/item/device/helmet_visor/night_vision/get_helmet_examine_text()
+ . = ..()
+
+ . += SPAN_NOTICE(" It is currently at [round((power_cell.charge / power_cell.maxcharge) * 100)]% charge.")
+
+/obj/item/device/helmet_visor/night_vision/proc/on_update_sight(mob/user)
+ SIGNAL_HANDLER
+
+ if(lighting_alpha < 255)
+ user.see_in_dark = 12
+ user.lighting_alpha = lighting_alpha
+ user.sync_lighting_plane_alpha()
+
+#undef NVG_VISOR_USAGE
+
+/atom/movable/nvg_light
+ light_power = 0.5
+ light_range = 1
+ light_color = COLOUR_GREEN
+ light_system = MOVABLE_LIGHT
+ light_flags = LIGHT_ATTACHED
+
+/obj/item/device/helmet_visor/night_vision/marine_raider
+ name = "advanced night vision optic"
+ desc = "An insertable visor HUD into a standard USCM helmet. This type gives a form of night vision and is standard issue in special forces units."
+ hud_type = list(MOB_HUD_FACTION_USCM, MOB_HUD_MEDICAL_ADVANCED)
+ helmet_overlay = "nvg_sight_right_raider"
+ power_use = 0
+ visor_glows = FALSE
+
+/obj/item/device/helmet_visor/night_vision/marine_raider/activate_visor(obj/item/clothing/head/helmet/marine/attached_helmet, mob/living/carbon/human/user)
+ . = ..()
+
+ for(var/type in hud_type)
+ var/datum/mob_hud/current_mob_hud = huds[type]
+ current_mob_hud.add_hud_to(user, attached_helmet)
+
+/obj/item/device/helmet_visor/night_vision/marine_raider/deactivate_visor(obj/item/clothing/head/helmet/marine/attached_helmet, mob/living/carbon/human/user)
+ . = ..()
+
+ for(var/type in hud_type)
+ var/datum/mob_hud/current_mob_hud = huds[type]
+ current_mob_hud.remove_hud_from(user, attached_helmet)
+
+/obj/item/device/helmet_visor/night_vision/marine_raider/process(delta_time)
+ return PROCESS_KILL
diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm
index ea43d6b074b9..9afa0dfd1851 100644
--- a/code/game/objects/items/storage/fancy.dm
+++ b/code/game/objects/items/storage/fancy.dm
@@ -71,7 +71,7 @@
storage_slots = 5
throwforce = 2
flags_equip_slot = SLOT_WAIST
-
+ can_hold = list(/obj/item/tool/candle)
/obj/item/storage/fancy/candle_box/fill_preset_inventory()
for(var/i=1; i <= storage_slots; i++)
diff --git a/code/game/objects/items/storage/pouch.dm b/code/game/objects/items/storage/pouch.dm
index a443a3b27cd0..ee274aaab32b 100644
--- a/code/game/objects/items/storage/pouch.dm
+++ b/code/game/objects/items/storage/pouch.dm
@@ -1172,23 +1172,37 @@
/obj/item/storage/pouch/tools
name = "tools pouch"
- desc = "It's designed to hold maintenance tools - screwdriver, wrench, cable coil, etc. It also has a hook for an entrenching tool."
+ desc = "It's designed to hold maintenance tools - screwdriver, wrench, cable coil, etc. It also has a hook for an entrenching tool or light replacer."
storage_slots = 4
max_w_class = SIZE_MEDIUM
icon_state = "tools"
can_hold = list(
- /obj/item/tool/wirecutters,
- /obj/item/tool/shovel/etool,
- /obj/item/tool/screwdriver,
/obj/item/tool/crowbar,
+ /obj/item/tool/screwdriver,
/obj/item/tool/weldingtool,
- /obj/item/device/multitool,
+ /obj/item/tool/wirecutters,
/obj/item/tool/wrench,
- /obj/item/stack/cable_coil,
/obj/item/tool/extinguisher/mini,
/obj/item/tool/shovel/etool,
+ /obj/item/stack/cable_coil,
+ /obj/item/weapon/gun/smg/nailgun/compact,
+ /obj/item/cell,
+ /obj/item/circuitboard,
+ /obj/item/stock_parts,
+ /obj/item/device/demo_scanner,
+ /obj/item/device/reagent_scanner,
+ /obj/item/device/assembly,
+ /obj/item/device/multitool,
+ /obj/item/device/flashlight,
+ /obj/item/device/t_scanner,
+ /obj/item/device/analyzer,
+ /obj/item/explosive/plastic,
+ /obj/item/device/lightreplacer,
+ )
+ bypass_w_limit = list(
+ /obj/item/tool/shovel/etool,
+ /obj/item/device/lightreplacer,
)
- bypass_w_limit = list(/obj/item/tool/shovel/etool)
/obj/item/storage/pouch/tools/tactical
name = "tactical tools pouch"
diff --git a/code/game/smoothwall.dm b/code/game/smoothwall.dm
index a06ed7750c26..eb81861a3b1f 100644
--- a/code/game/smoothwall.dm
+++ b/code/game/smoothwall.dm
@@ -170,6 +170,11 @@
setDir(NORTH)
/obj/structure/window/framed/handle_icon_junction(jun_1, jun_2)
+ if(!icon_exists(icon, "[basestate][jun_2 ? jun_2 : jun_1]")) //Missing states for 5, 6, 7, 9, 10, 11, 13, 14, 15 for the vast majority of /obj/structure/window/framed
+ icon_state = "[basestate]0"
+ junction = 0
+ return
+
icon_state = "[basestate][jun_2 ? jun_2 : jun_1]" //Use junction 2 if possible, junction 1 otherwise.
if(jun_2)
junction = jun_2
@@ -177,6 +182,11 @@
junction = jun_1
/obj/structure/window_frame/handle_icon_junction(jun_1, jun_2)
+ if(!icon_exists(icon, "[basestate][jun_2 ? jun_2 : jun_1]_frame")) //Missing states for 5, 6, 7, 9, 10, 11, 13, 14, 15 for the vast majority of /obj/structure/window_frame
+ icon_state = "[basestate]0_frame"
+ junction = 0
+ return
+
icon_state = "[basestate][jun_2 ? jun_2 : jun_1]_frame" //Use junction 2 if possible, junction 1 otherwise.
if(jun_2)
junction = jun_2
diff --git a/code/game/turfs/walls/wall_types.dm b/code/game/turfs/walls/wall_types.dm
index 2548801cc7b1..22979858ce62 100644
--- a/code/game/turfs/walls/wall_types.dm
+++ b/code/game/turfs/walls/wall_types.dm
@@ -1114,6 +1114,10 @@ INITIALIZE_IMMEDIATE(/turf/closed/wall/indestructible/splashscreen)
if(src in P.permutated)
return
+ //Ineffective if someone is sitting on the wall
+ if(locate(/mob) in contents)
+ return ..()
+
if(!prob(chance_to_reflect))
if(P.ammo.damage_type == BRUTE)
P.damage *= brute_multiplier
diff --git a/code/modules/admin/tabs/event_tab.dm b/code/modules/admin/tabs/event_tab.dm
index 247ab5c241ce..8464c66aba3f 100644
--- a/code/modules/admin/tabs/event_tab.dm
+++ b/code/modules/admin/tabs/event_tab.dm
@@ -218,14 +218,14 @@
if(!istype(chosen_ert))
return
- var/is_announcing = tgui_alert(usr, "Would you like to announce the distress beacon to the server population? This will reveal the distress beacon to all players.", "Announce distress beacon?", list("Yes", "No"), 20 SECONDS)
- if(!is_announcing)
+ var/quiet_launch = tgui_alert(usr, "Would you like to announce the distress beacon to the server population? This will reveal the distress beacon to all players.", "Announce distress beacon?", list("Yes", "No"), 20 SECONDS)
+ if(!quiet_launch)
qdel(chosen_ert)
return
- if(is_announcing == "No")
- is_announcing = FALSE
- if (is_announcing == "Yes")
- is_announcing = TRUE
+ if(quiet_launch == "No")
+ quiet_launch = TRUE
+ if (quiet_launch == "Yes")
+ quiet_launch = FALSE
var/turf/override_spawn_loc
var/prompt = tgui_alert(usr, "Spawn at their assigned spawn, or at your location?", "Spawnpoint Selection", list("Spawn", "Current Location"), 0)
@@ -235,7 +235,7 @@
if(prompt == "Current Location")
override_spawn_loc = get_turf(usr)
- chosen_ert.activate(is_announcing, override_spawn_loc)
+ chosen_ert.activate(quiet_launch = quiet_launch, announce = !quiet_launch, override_spawn_loc = override_spawn_loc)
message_admins("[key_name_admin(usr)] admin-called a [choice == "Randomize" ? "randomized ":""]distress beacon: [chosen_ert.name]")
diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm
index 68028c300745..c6c06a123b2e 100644
--- a/code/modules/client/preferences_gear.dm
+++ b/code/modules/client/preferences_gear.dm
@@ -62,6 +62,10 @@ var/global/list/gear_datums_by_name = list()
display_name = "Ballistic goggles, orange"
path = /obj/item/clothing/glasses/mgoggles/orange
+/datum/gear/eyewear/goggles2
+ display_name = "Ballistic goggles, M1A1"
+ path = /obj/item/clothing/glasses/mgoggles/v2
+
/datum/gear/eyewear/bimex_shades
display_name = "BiMex personal shades"
path = /obj/item/clothing/glasses/sunglasses/big
@@ -205,6 +209,14 @@ var/global/list/gear_datums_by_name = list()
display_name = "USCM beret, tan"
path = /obj/item/clothing/head/beret/cm/tan
+/datum/gear/headwear/uscm/beret_black
+ display_name = "USCM beret, black"
+ path = /obj/item/clothing/head/beret/cm/black
+
+/datum/gear/headwear/uscm/beret_white
+ display_name = "USCM beret, white"
+ path = /obj/item/clothing/head/beret/cm/white
+
/datum/gear/headwear/uscm/boonie_olive
display_name = "USCM boonie hat, olive"
path = /obj/item/clothing/head/cmcap/boonie
diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm
index b31e6281dba1..779d8212f398 100644
--- a/code/modules/clothing/glasses/glasses.dm
+++ b/code/modules/clothing/glasses/glasses.dm
@@ -411,6 +411,13 @@
active_icon_state = "mgogglesorg_down"
inactive_icon_state = "mgogglesorg"
+/obj/item/clothing/glasses/mgoggles/v2
+ name = "M1A1 marine ballistic goggles"
+ desc = "Newer issue USCM goggles. While commonly found mounted atop M10 pattern helmets, they are also capable of preventing insects, dust, and other things from getting into one's eyes. This version has larger lenses."
+ icon_state = "mgoggles2_down"
+ active_icon_state = "mgoggles2_down"
+ inactive_icon_state = "mgoggles2"
+
/obj/item/clothing/glasses/mgoggles/on_enter_storage(obj/item/storage/internal/S)
..()
diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm
index 9d18c44affe8..e6c8391ac0a1 100644
--- a/code/modules/clothing/gloves/miscellaneous.dm
+++ b/code/modules/clothing/gloves/miscellaneous.dm
@@ -46,7 +46,7 @@
icon_state = "latex"
item_state = "lgloves"
siemens_coefficient = 0.30
- permeability_coefficient = 0.01
+ permeability_coefficient = 0.35
/obj/item/clothing/gloves/botanic_leather
desc = "These leather gloves protect against thorns, barbs, prickles, spikes and other harmful objects of floral origin."
diff --git a/code/modules/clothing/head/head.dm b/code/modules/clothing/head/head.dm
index 5135dad6b3b9..f16b6ff42c9d 100644
--- a/code/modules/clothing/head/head.dm
+++ b/code/modules/clothing/head/head.dm
@@ -75,6 +75,12 @@
/obj/item/clothing/head/beret/cm/red
icon_state = "beretred"
+/obj/item/clothing/head/beret/cm/white
+ icon_state = "s_beret"
+
+/obj/item/clothing/head/beret/cm/black
+ icon_state = "beret_black"
+
/obj/item/clothing/head/beret/cm/squadberet
name = "USCM Squad Beret"
desc = "For those who want to show pride and have nothing to lose (in their head, at least)."
@@ -236,6 +242,7 @@
/obj/item/clothing/glasses/mgoggles/prescription = HAT_GARB_RELAY_ICON_STATE,
/obj/item/clothing/glasses/mgoggles/black = HAT_GARB_RELAY_ICON_STATE,
/obj/item/clothing/glasses/mgoggles/orange = HAT_GARB_RELAY_ICON_STATE,
+ /obj/item/clothing/glasses/mgoggles/v2 = HAT_GARB_RELAY_ICON_STATE,
/obj/item/prop/helmetgarb/helmet_nvg = HAT_GARB_RELAY_ICON_STATE,
/obj/item/prop/helmetgarb/helmet_nvg/cosmetic = HAT_GARB_RELAY_ICON_STATE,
/obj/item/prop/helmetgarb/helmet_nvg/marsoc = HAT_GARB_RELAY_ICON_STATE,
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index c64c2a14764d..da0f58088858 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -246,6 +246,7 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list(
// EYEWEAR
/obj/item/clothing/glasses/mgoggles = HELMET_GARB_RELAY_ICON_STATE,
+ /obj/item/clothing/glasses/mgoggles/v2 = HELMET_GARB_RELAY_ICON_STATE,
/obj/item/clothing/glasses/mgoggles/prescription = HELMET_GARB_RELAY_ICON_STATE,
/obj/item/clothing/glasses/mgoggles/black = HELMET_GARB_RELAY_ICON_STATE,
/obj/item/clothing/glasses/mgoggles/orange = HELMET_GARB_RELAY_ICON_STATE,
@@ -416,9 +417,11 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list(
camera = new /obj/structure/machinery/camera(src)
camera.network = list(CAMERA_NET_OVERWATCH)
+ for(var/obj/visor as anything in built_in_visors)
+ visor.forceMove(src)
+
if(length(inserted_visors) || length(built_in_visors))
var/datum/action/item_action/cycle_helmet_huds/new_action = new(src)
- LAZYADD(actions, new_action)
if(ishuman(loc))
var/mob/living/carbon/human/holding_human = loc
if(holding_human.head == src)
@@ -439,6 +442,12 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list(
helmet_overlays = null
QDEL_NULL(camera)
QDEL_NULL(pockets)
+ if(active_visor && istype(loc, /mob/living/carbon/human))
+ var/mob/living/carbon/human/potential_user = loc
+ if(potential_user.head == src)
+ var/obj/item/device/helmet_visor/temp_visor_holder = active_visor
+ active_visor = null
+ toggle_visor(potential_user, temp_visor_holder, TRUE)
return ..()
/obj/item/clothing/head/helmet/marine/attack_hand(mob/user)
@@ -494,21 +503,22 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list(
return
if(HAS_TRAIT(attacking_item, TRAIT_TOOL_SCREWDRIVER) && length(inserted_visors))
+ if(active_visor)
+ var/obj/item/device/helmet_visor/temp_visor_holder = active_visor
+ active_visor = null
+ toggle_visor(user, temp_visor_holder, TRUE)
+
for(var/obj/item/device/helmet_visor/visor as anything in inserted_visors)
visor.forceMove(get_turf(src))
inserted_visors = list()
to_chat(user, SPAN_NOTICE("You remove the inserted visors."))
- var/obj/item/device/helmet_visor/temp_visor_holder = active_visor
- active_visor = null
- turn_off_visor(user, temp_visor_holder, TRUE)
var/datum/action/item_action/cycle_helmet_huds/cycle_action = locate() in actions
cycle_action.set_default_overlay()
if(!length(built_in_visors))
cycle_action.remove_from(user)
- recalculate_visors(user)
return
..()
@@ -589,6 +599,11 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list(
/obj/item/clothing/head/helmet/marine/has_garb_overlay()
return flags_marine_helmet & HELMET_GARB_OVERLAY
+/obj/item/clothing/head/helmet/marine/get_examine_text(mob/user)
+ . = ..()
+ if(active_visor)
+ . += active_visor.get_helmet_examine_text()
+
/obj/item/clothing/head/helmet/marine/proc/add_hugger_damage() //This is called in XenoFacehuggers.dm to first add the overlay and set the var.
if(flags_marine_helmet & HELMET_DAMAGE_OVERLAY && !(flags_marine_helmet & HELMET_IS_DAMAGED))
helmet_overlays["damage"] = image('icons/obj/items/clothing/cm_hats.dmi',icon_state = "hugger_damage")
@@ -615,29 +630,17 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list(
if(!human_user || human_user.head != src)
return
- turn_on_visor(human_user)
+ toggle_visor(user, silent = TRUE)
-/// Turns on the current active visor
-/obj/item/clothing/head/helmet/marine/proc/turn_on_visor(mob/user)
- if(!active_visor)
- return
+/// Toggles the specified visor, if nothing specified then the active visor, if the visor is the active visor and the helmet is on the user's head it will turn on, if it is not the active visor it will turn off
+/obj/item/clothing/head/helmet/marine/proc/toggle_visor(mob/user, obj/item/device/helmet_visor/current_visor, silent = FALSE)
+ current_visor = current_visor || active_visor
- if(active_visor.can_toggle(user))
- active_visor.visor_function(src, user)
-
- playsound_client(user.client, active_visor.toggle_on_sound, null, 75)
- update_icon()
-
-/// Turns off the specified visor
-/obj/item/clothing/head/helmet/marine/proc/turn_off_visor(mob/user, obj/item/device/helmet_visor/current_visor, sound = FALSE)
if(!current_visor)
return
- if(current_visor.can_toggle(user))
- current_visor.visor_function(src, user)
+ current_visor.toggle_visor(src, user, silent)
- if(sound)
- playsound_client(user.client, current_visor.toggle_off_sound, null, 75)
update_icon()
/// Attempts to turn off all visors
@@ -645,8 +648,7 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list(
var/list/total_visors = built_in_visors + inserted_visors
for(var/obj/item/device/helmet_visor/cycled_helmet_visor in total_visors)
- if(cycled_helmet_visor.can_toggle(user))
- cycled_helmet_visor.visor_function(src, user, TRUE)
+ cycled_helmet_visor.deactivate_visor(src, user)
update_icon()
@@ -662,20 +664,19 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list(
for(var/hud_type in total_visors)
if(hud_type == active_visor)
if(length(total_visors) > iterator)
- turn_off_visor(user, active_visor, FALSE)
active_visor = total_visors[(iterator + 1)]
- recalculate_visors(user)
+ toggle_visor(user, total_visors[iterator], TRUE)
+ toggle_visor(user)
return active_visor
else
- turn_off_visor(user, active_visor, TRUE)
active_visor = null
- recalculate_visors(user)
+ toggle_visor(user, total_visors[iterator], FALSE)
return FALSE
iterator++
if(total_visors[1])
active_visor = total_visors[1]
- recalculate_visors(user)
+ toggle_visor(user)
return active_visor
active_visor = null
@@ -944,8 +945,8 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list(
armor_bio = CLOTHING_ARMOR_MEDIUMHIGH
specialty = "M10 pattern SOF"
flags_atom = NO_SNOW_TYPE
- built_in_visors = list(new /obj/item/device/helmet_visor, new /obj/item/device/helmet_visor/medical, new /obj/item/device/helmet_visor/security)
-
+ built_in_visors = list(new /obj/item/device/helmet_visor/night_vision/marine_raider, new /obj/item/device/helmet_visor/security)
+ start_down_visor_type = /obj/item/device/helmet_visor/night_vision/marine_raider
//=============================//PMCS\\==================================\\
//=======================================================================\\
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index d4b1d6f3dd84..b13fab0ae5a4 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -11,7 +11,7 @@
w_class = SIZE_SMALL
item_state = "gas_alt"
gas_transfer_coefficient = 0.01
- permeability_coefficient = 0.01
+ permeability_coefficient = 0.9
armor_melee = CLOTHING_ARMOR_NONE
armor_bullet = CLOTHING_ARMOR_NONE
armor_laser = CLOTHING_ARMOR_NONE
diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm
index 0d4572c7297f..c39e6a620833 100644
--- a/code/modules/clothing/masks/miscellaneous.dm
+++ b/code/modules/clothing/masks/miscellaneous.dm
@@ -17,7 +17,7 @@
flags_inventory = COVERMOUTH
flags_armor_protection = 0
gas_transfer_coefficient = 0.90
- permeability_coefficient = 0.01
+ permeability_coefficient = 0.3
armor_melee = CLOTHING_ARMOR_NONE
armor_bullet = CLOTHING_ARMOR_NONE
armor_laser = CLOTHING_ARMOR_NONE
diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm
index 963e4efa3ae6..59e0918550ed 100644
--- a/code/modules/clothing/suits/bio.dm
+++ b/code/modules/clothing/suits/bio.dm
@@ -3,7 +3,7 @@
name = "bio hood"
icon_state = "bio"
desc = "A hood that protects the head and face from biological contaminants."
- permeability_coefficient = 0.01
+ permeability_coefficient = 0.2
armor_melee = CLOTHING_ARMOR_NONE
armor_bullet = CLOTHING_ARMOR_NONE
armor_laser = CLOTHING_ARMOR_NONE
@@ -30,7 +30,7 @@
item_state = "bio_suit"
w_class = SIZE_LARGE//bulky item
gas_transfer_coefficient = 0.01
- permeability_coefficient = 0.01
+ permeability_coefficient = 0.2
flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_LEGS|BODY_FLAG_FEET|BODY_FLAG_ARMS|BODY_FLAG_HANDS
slowdown = 1
armor_melee = CLOTHING_ARMOR_NONE
diff --git a/code/modules/clothing/under/marine_uniform.dm b/code/modules/clothing/under/marine_uniform.dm
index 585f415f2b63..d9d8d7da45b7 100644
--- a/code/modules/clothing/under/marine_uniform.dm
+++ b/code/modules/clothing/under/marine_uniform.dm
@@ -62,6 +62,14 @@
worn_state = "marine_engineer"
specialty = "USCM Combat Technician"
+/obj/item/clothing/under/marine/engineer/standard
+ flags_atom = NO_SNOW_TYPE
+
+/obj/item/clothing/under/marine/engineer/darker
+ icon_state = "d_marine_engineer"
+ worn_state = "d_marine_engineer"
+ flags_atom = NO_SNOW_TYPE
+
/obj/item/clothing/under/marine/rto
name = "\improper USCM radio telephone operator uniform"
desc = "Standard-issue RTO fatigues. They have shards of light Kevlar to help protect against stabbing weapons and bullets."
@@ -105,6 +113,14 @@
flags_jumpsuit = UNIFORM_SLEEVE_ROLLABLE|UNIFORM_SLEEVE_CUTTABLE|UNIFORM_JACKET_REMOVABLE
specialty = "military police"
+/obj/item/clothing/under/marine/mp/standard
+ flags_atom = NO_SNOW_TYPE
+
+/obj/item/clothing/under/marine/mp/darker
+ icon_state = "d_MP_jumpsuit"
+ worn_state = "d_MP_jumpsuit"
+ flags_atom = NO_SNOW_TYPE
+
/obj/item/clothing/under/marine/warden
name = "military warden jumpsuit"
desc = "Standard-issue Military Warden uniform. It has shards of light Kevlar to help protect against stabbing weapons and bullets."
diff --git a/code/modules/clothing/under/ties.dm b/code/modules/clothing/under/ties.dm
index cf54fa9f01a7..24eec4f1e3a8 100644
--- a/code/modules/clothing/under/ties.dm
+++ b/code/modules/clothing/under/ties.dm
@@ -381,6 +381,22 @@
inv_overlay = image("icon" = 'icons/obj/items/clothing/ties_overlay.dmi', "icon_state" = "[icon_state]")
update_icon()
+/obj/item/clothing/accessory/poncho/green
+ icon_state = "poncho"
+
+/obj/item/clothing/accessory/poncho/brown
+ icon_state = "d_poncho"
+
+/obj/item/clothing/accessory/poncho/black
+ icon_state = "u_poncho"
+
+/obj/item/clothing/accessory/poncho/blue
+ icon_state = "c_poncho"
+
+/obj/item/clothing/accessory/poncho/purple
+ icon_state = "s_poncho"
+
+
//Ties that can store stuff
/obj/item/storage/internal/accessory
@@ -598,6 +614,30 @@
/obj/item/clothing/accessory/storage/surg_vest/blue/equipped
hold = /obj/item/storage/internal/accessory/surg_vest/equipped
+/obj/item/clothing/accessory/storage/surg_vest/drop_blue
+ name = "blue surgical drop pouch"
+ desc = "A matte blue synthcotton drop pouch purpose-made for holding surgical tools."
+ icon_state = "drop_pouch_surgical_blue"
+
+/obj/item/clothing/accessory/storage/surg_vest/drop_blue/equipped
+ hold = /obj/item/storage/internal/accessory/surg_vest/equipped
+
+/obj/item/clothing/accessory/storage/surg_vest/drop_green
+ name = "green surgical drop pouch"
+ desc = "A greenish synthcotton drop pouch purpose-made for holding surgical tools."
+ icon_state = "drop_pouch_surgical_green"
+
+/obj/item/clothing/accessory/storage/surg_vest/drop_green/equipped
+ hold = /obj/item/storage/internal/accessory/surg_vest/equipped
+
+/obj/item/clothing/accessory/storage/surg_vest/drop_black
+ name = "black surgical drop pouch"
+ desc = "A tactical black synthcotton drop pouch purpose-made for holding surgical tools."
+ icon_state = "drop_pouch_surgical_black"
+
+/obj/item/clothing/accessory/storage/surg_vest/drop_black/equipped
+ hold = /obj/item/storage/internal/accessory/surg_vest/equipped
+
/obj/item/clothing/accessory/storage/knifeharness
name = "M272 pattern knife vest"
desc = "An older generation M272 pattern knife vest once employed by the USCM. Can hold up to 5 knives. It is made of synthcotton."
diff --git a/code/modules/cm_aliens/structures/egg.dm b/code/modules/cm_aliens/structures/egg.dm
index a0e8e5054d45..c23f4f3e2b20 100644
--- a/code/modules/cm_aliens/structures/egg.dm
+++ b/code/modules/cm_aliens/structures/egg.dm
@@ -208,16 +208,13 @@
return
user.animation_attack_on(src)
- if(W.attack_verb.len)
+ if(length(W.attack_verb))
visible_message(SPAN_DANGER("\The [src] has been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]"))
else
visible_message(SPAN_DANGER("\The [src] has been attacked with \the [W][(user ? " by [user]." : ".")]"))
var/damage = W.force
- if(W.w_class < SIZE_LARGE || !W.sharp || W.force < 20) //only big strong sharp weapon are adequate
- damage /= 4
if(iswelder(W))
var/obj/item/tool/weldingtool/WT = W
-
if(WT.remove_fuel(0, user))
damage = 15
playsound(src.loc, 'sound/items/Welder.ogg', 25, 1)
diff --git a/code/modules/cm_aliens/structures/fruit.dm b/code/modules/cm_aliens/structures/fruit.dm
index e54cb9417d7c..318bc6ba6cf2 100644
--- a/code/modules/cm_aliens/structures/fruit.dm
+++ b/code/modules/cm_aliens/structures/fruit.dm
@@ -438,7 +438,7 @@
return XENO_NONCOMBAT_ACTION
/obj/item/reagent_container/food/snacks/resin_fruit/proc/add_juice()
- reagents.add_reagent("fruit_resin", 8)
+ reagents.add_reagent("fruit_resin", 30)
/obj/effect/alien/resin/fruit/MouseDrop(atom/over_object)
var/mob/living/carbon/xenomorph/X = over_object
@@ -491,7 +491,7 @@
fruit_type = /obj/effect/alien/resin/fruit/greater
/obj/item/reagent_container/food/snacks/resin_fruit/greater/add_juice()
- reagents.add_reagent("fruit_resin", 16)
+ reagents.add_reagent("fruit_resin", 60)
/obj/item/reagent_container/food/snacks/resin_fruit/unstable
name = XENO_FRUIT_UNSTABLE
@@ -501,8 +501,8 @@
fruit_type = /obj/effect/alien/resin/fruit/unstable
/obj/item/reagent_container/food/snacks/resin_fruit/unstable/add_juice()
- reagents.add_reagent("fruit_resin", 4)
- reagents.add_reagent(PLASMA_CHITIN, 12)
+ reagents.add_reagent("fruit_resin", 30)
+ reagents.add_reagent(PLASMA_CHITIN, 30)
/obj/item/reagent_container/food/snacks/resin_fruit/spore
name = XENO_FRUIT_SPORE
@@ -511,8 +511,8 @@
fruit_type = /obj/effect/alien/resin/fruit/spore
/obj/item/reagent_container/food/snacks/resin_fruit/spore/add_juice()
- reagents.add_reagent("fruit_resin", 4)
- reagents.add_reagent(PLASMA_PHEROMONE, 12)
+ reagents.add_reagent("fruit_resin", 30)
+ reagents.add_reagent(PLASMA_PHEROMONE, 30)
/obj/item/reagent_container/food/snacks/resin_fruit/speed
name = XENO_FRUIT_SPEED
@@ -521,8 +521,8 @@
fruit_type = /obj/effect/alien/resin/fruit/speed
/obj/item/reagent_container/food/snacks/resin_fruit/speed/add_juice()
- reagents.add_reagent("fruit_resin", 4)
- reagents.add_reagent(PLASMA_PHEROMONE, 12)
+ reagents.add_reagent("fruit_resin", 30)
+ reagents.add_reagent(PLASMA_CATECHOLAMINE, 30)
/obj/item/reagent_container/food/snacks/resin_fruit/plasma
name = XENO_FRUIT_PLASMA
@@ -530,5 +530,5 @@
fruit_type = /obj/effect/alien/resin/fruit/plasma
/obj/item/reagent_container/food/snacks/resin_fruit/plasma/add_juice()
- reagents.add_reagent("fruit_resin", 4)
- reagents.add_reagent(PLASMA_PURPLE, 12)
+ reagents.add_reagent("fruit_resin", 30)
+ reagents.add_reagent(PLASMA_PURPLE, 30)
diff --git a/code/modules/cm_aliens/structures/special/pylon_core.dm b/code/modules/cm_aliens/structures/special/pylon_core.dm
index 4eff0240939d..96ded23c8ac7 100644
--- a/code/modules/cm_aliens/structures/special/pylon_core.dm
+++ b/code/modules/cm_aliens/structures/special/pylon_core.dm
@@ -196,10 +196,12 @@
if(!xeno.counts_for_slots)
hive_xenos -= xeno
- if(length(hive_xenos) > (length(GLOB.alive_human_list) * ENDGAME_LARVA_CAP_MULTIPLIER))
+ var/real_total_xeno_count = length(hive_xenos) + linked_hive.stored_larva
+
+ if(real_total_xeno_count > (length(GLOB.alive_human_list) * ENDGAME_LARVA_CAP_MULTIPLIER))
return
- linked_hive.partial_larva += length(hive_xenos) * LARVA_ADDITION_MULTIPLIER
+ linked_hive.partial_larva += real_total_xeno_count * LARVA_ADDITION_MULTIPLIER
linked_hive.convert_partial_larva_to_full_larva()
linked_hive.hive_ui.update_burrowed_larva()
diff --git a/code/modules/cm_aliens/structures/special_structure.dm b/code/modules/cm_aliens/structures/special_structure.dm
index 69bdcc2438ac..8378d93e1ac9 100644
--- a/code/modules/cm_aliens/structures/special_structure.dm
+++ b/code/modules/cm_aliens/structures/special_structure.dm
@@ -72,3 +72,9 @@
/obj/effect/alien/resin/special/attack_alien(mob/living/carbon/xenomorph/M)
if(M.can_destroy_special() || M.hivenumber != linked_hive.hivenumber)
return ..()
+
+/obj/effect/alien/resin/special/get_projectile_hit_boolean(obj/projectile/firing_projectile)
+ if(firing_projectile.original == src || firing_projectile.original == get_turf(src))
+ return TRUE
+
+ return FALSE
diff --git a/code/modules/cm_marines/dropship_ammo.dm b/code/modules/cm_marines/dropship_ammo.dm
index 264400caa0dd..ef59e643e4cf 100644
--- a/code/modules/cm_marines/dropship_ammo.dm
+++ b/code/modules/cm_marines/dropship_ammo.dm
@@ -18,10 +18,10 @@
var/ammo_count
/// Maximal ammunition count
var/max_ammo_count
- /// What to call the ammo in the ammo transfering message
+ /// What to call the ammo in the ammo transferring message
var/ammo_name = "round"
var/ammo_id
- /// Whether the ammo inside this magazine can be transfered to another magazine.
+ /// Whether the ammo inside this magazine can be transferred to another magazine.
var/transferable_ammo = FALSE
/// How many tiles the ammo can deviate from the laser target
var/accuracy_range = 3
@@ -136,7 +136,7 @@
/obj/structure/ship_ammo/heavygun
name = "\improper PGU-100 Multi-Purpose 30mm ammo crate"
icon_state = "30mm_crate"
- desc = "A crate full of PGU-100 30mm Multi-Purpose ammo designed to penetrate light (non reinforced) structures, as well as shred infantry, IAVs, LAVs, IMVs, and MRAPs. Works in large areas for use on Class 4 and superior alien insectoid infestations, as well as fitting within the armaments allowed for use against a tier 4 insurgency as well as higher tiers. However, it lacks armor penetrating capabilities, for which Anti-Tank 30mm ammo is needed."
+ desc = "A crate full of PGU-100 30mm Multi-Purpose ammo designed to penetrate light (non reinforced) structures, as well as shred infantry, IAVs, LAVs, IMVs, and MRAPs. Works in large areas for use on Class 4 and superior alien insectoid infestations, as well as fitting within the armaments allowed for use against a tier 4 insurgency as well as higher tiers. However, it lacks armor penetrating capabilities, for which Anti-Tank 30mm ammo is needed. Can be loaded into the GAU-21 30mm cannon."
equipment_type = /obj/structure/dropship_equipment/weapon/heavygun
ammo_count = 400
max_ammo_count = 400
@@ -146,7 +146,7 @@
fire_mission_delay = 2
var/bullet_spread_range = 4 //how far from the real impact turf can bullets land
var/shrapnel_type = /datum/ammo/bullet/shrapnel/gau //For siming 30mm bullet impacts.
- var/directhit_damage = 105 //how much damage is to be inficted to a mob, this is here so that we can hit resting mobs.
+ var/directhit_damage = 105 //how much damage is to be inflicted to a mob, this is here so that we can hit resting mobs.
var/penetration = 10 //AP value pretty much
/obj/structure/ship_ammo/heavygun/get_examine_text(mob/user)
@@ -193,9 +193,9 @@
/obj/structure/ship_ammo/heavygun/antitank
- name = "PGU-105 30mm Anti-tank ammo crate"
+ name = "\improper PGU-105 30mm Anti-tank ammo crate"
icon_state = "30mm_crate_hv"
- desc = "A crate full of PGU-105 Specialized 30mm APFSDS Titanium-Tungsten alloy penetrators, made for countering peer and near peer APCs, IFVs, and MBTs in CAS support. It's designed to penetrate up to the equivalent 1350mm of RHA when launched from a GAU-21. It is much less effective against soft targets however, in which case 30mm ball ammunition is recommended. WARNING: discarding petals from the ammunition can be harmful if the dropship does not pull out at the needed speeds. Please consult page 3574 of the manual, available for order at any ARMAT store."
+ desc = "A crate full of PGU-105 Specialized 30mm APFSDS Titanium-Tungsten alloy penetrators, made for countering peer and near peer APCs, IFVs, and MBTs in CAS support. It is designed to penetrate up to the equivalent 1350mm of RHA when launched from a GAU-21. It is much less effective against soft targets however, in which case 30mm ball ammunition is recommended. WARNING: discarding petals from the ammunition can be harmful if the dropship does not pull out at the needed speeds. Please consult page 3574 of the manual, available for order at any ARMAT store. Can be loaded into the GAU-21 30mm cannon."
travelling_time = 60
ammo_count = 400
max_ammo_count = 400
@@ -204,15 +204,15 @@
point_cost = 325
fire_mission_delay = 2
shrapnel_type = /datum/ammo/bullet/shrapnel/gau/at
- directhit_damage = 80 //how much damage is to be inficted to a mob, this is here so that we can hit resting mobs.
+ directhit_damage = 80 //how much damage is to be inflicted to a mob, this is here so that we can hit resting mobs.
penetration = 40 //AP value pretty much
//laser battery
/obj/structure/ship_ammo/laser_battery
- name = "high-capacity laser battery"
+ name = "\improper BTU-17/LW Hi-Cap Laser Battery"
icon_state = "laser_battery"
- desc = "A high-capacity laser battery used to power laser beam weapons."
+ desc = "A high-capacity laser battery used to power laser beam weapons. Can be loaded into the LWU-6B Laser Cannon."
travelling_time = 10
ammo_count = 100
max_ammo_count = 100
@@ -283,8 +283,8 @@
//this one is air-to-air only
/obj/structure/ship_ammo/rocket/widowmaker
- name = "\improper AIM-224/B 'Widowmaker'"
- desc = "The AIM-224/B missile is a retrofit of the latest in air-to-air missile technology. Earning the nickname of 'Widowmaker' from various dropship pilots after improvements to its guidance warhead prevents it from being jammed leading to its high kill rate. Not well suited for ground bombardment but its high velocity makes it reach its target quickly. This one has been modified to be a free-fall bomb as a result of dropship ammo shortages."
+ name = "\improper AIM-224B 'Widowmaker'"
+ desc = "The AIM-224B missile is a retrofit of the latest in air-to-air missile technology. Earning the nickname of 'Widowmaker' from various dropship pilots after improvements to its guidance warhead prevents it from being jammed leading to its high kill rate. Not well suited for ground bombardment but its high velocity makes it reach its target quickly. This one has been modified to be a free-fall bomb as a result of dropship ammo shortages. Can be loaded into the LAU-444 Guided Missile Launcher."
icon_state = "single"
travelling_time = 30 //not powerful, but reaches target fast
ammo_id = ""
@@ -298,7 +298,7 @@
/obj/structure/ship_ammo/rocket/banshee
name = "\improper AGM-227 'Banshee'"
- desc = "The AGM-227 missile is a mainstay of the overhauled dropship fleet against any mobile or armored ground targets. It's earned the nickname of 'Banshee' from the sudden wail that it emits right before hitting a target. Useful to clear out large areas."
+ desc = "The AGM-227 missile is a mainstay of the overhauled dropship fleet against any mobile or armored ground targets. It's earned the nickname of 'Banshee' from the sudden wail that it emits right before hitting a target. Useful to clear out large areas. Can be loaded into the LAU-444 Guided Missile Launcher."
icon_state = "banshee"
ammo_id = "b"
point_cost = 300
@@ -312,7 +312,7 @@
/obj/structure/ship_ammo/rocket/keeper
name = "\improper GBU-67 'Keeper II'"
- desc = "The GBU-67 'Keeper II' is the latest in a generation of laser guided weaponry that spans all the way back to the 20th century. Earning its nickname from a shortening of 'Peacekeeper' which comes from the program that developed its guidance system and the various uses of it during peacekeeping conflicts. Its payload is designed to devastate armored targets."
+ desc = "The GBU-67 'Keeper II' is the latest in a generation of laser guided weaponry that spans all the way back to the 20th century. Earning its nickname from a shortening of 'Peacekeeper' which comes from the program that developed its guidance system and the various uses of it during peacekeeping conflicts. Its payload is designed to devastate armored targets. Can be loaded into the LAU-444 Guided Missile Launcher."
icon_state = "paveway"
travelling_time = 20 //A fast payload due to its very tight blast zone
ammo_id = "k"
@@ -325,8 +325,8 @@
QDEL_IN(src, 0.5 SECONDS)
/obj/structure/ship_ammo/rocket/harpoon
- name = "\improper AGM-84 'Harpoon'"
- desc = "The AGM-84 Harpoon is an Anti-Ship Missile, designed and used to effectively take down enemy ships with a huge blast wave with low explosive power. This one is modified to use ground signals."
+ name = "\improper AGM-184 'Harpoon II'"
+ desc = "The AGM-184 Harpoon II is an Anti-Ship Missile, designed and used to effectively take down enemy ships with a huge blast wave with low explosive power. This one is modified to use ground signals. Can be loaded into the LAU-444 Guided Missile Launcher."
icon_state = "harpoon"
ammo_id = "s"
travelling_time = 50
@@ -340,8 +340,8 @@
QDEL_IN(src, 0.5 SECONDS)
/obj/structure/ship_ammo/rocket/napalm
- name = "\improper XN-99 'Napalm'"
- desc = "The XN-99 'Napalm' is an incendiary missile used to turn specific targeted areas into giant balls of fire for a long time."
+ name = "\improper AGM-99 'Napalm'"
+ desc = "The AGM-99 'Napalm' is an incendiary missile used to turn specific targeted areas into giant balls of fire for a long time. Can be loaded into the LAU-444 Guided Missile Launcher."
icon_state = "napalm"
ammo_id = "n"
point_cost = 500
@@ -355,7 +355,7 @@
/obj/structure/ship_ammo/rocket/thermobaric
name = "\improper BLU-200 'Dragons Breath'"
- desc = "The BLU-200 Dragons Breath a thermobaric fuel-air bomb. The aerosolized fuel mixture creates a vacuum when ignited causing serious damage to those in its way."
+ desc = "The BLU-200 Dragons Breath a thermobaric fuel-air bomb. The aerosolized fuel mixture creates a vacuum when ignited causing serious damage to those in its way. Can be loaded into the LAU-444 Guided Missile Launcher."
icon_state = "fatty"
ammo_id = "f"
travelling_time = 50
@@ -373,8 +373,8 @@
//minirockets
/obj/structure/ship_ammo/minirocket
- name = "mini rocket stack"
- desc = "A pack of laser guided mini rockets."
+ name = "\improper AGR-59 'Mini-Mike'"
+ desc = "The AGR-59 'Mini-Mike' minirocket is a cheap and efficient means of putting hate down range. Though rockets lack a guidance package, it makes up for it in ammunition count. Can be loaded into the LAU-229 Rocket Pod."
icon_state = "minirocket"
icon = 'icons/obj/structures/props/almayer_props.dmi'
equipment_type = /obj/structure/dropship_equipment/weapon/minirocket_pod
@@ -410,8 +410,8 @@
/obj/structure/ship_ammo/minirocket/incendiary
- name = "incendiary mini rocket stack"
- desc = "A pack of laser guided incendiary mini rockets."
+ name = "\improper AGR-59-I 'Mini-Mike'"
+ desc = "The AGR-59-I 'Mini-Mike' incendiary minirocket is a cheap and efficient means of putting hate down range AND setting them on fire! Though rockets lack a guidance package, it makes up for it in ammunition count. Can be loaded into the LAU-229 Rocket Pod."
icon_state = "minirocket_inc"
point_cost = 500
fire_mission_delay = 3 //high cooldown
@@ -422,8 +422,8 @@
fire_spread(impact, create_cause_data(initial(name), source_mob), 3, 25, 20, "#EE6515")
/obj/structure/ship_ammo/sentry
- name = "multi-purpose area denial sentry"
- desc = "An omni-directional sentry, capable of defending an area from lightly armored hostile incursion."
+ name = "\improper A/C-49-P Air Deployable Sentry"
+ desc = "An omni-directional sentry, capable of defending an area from lightly armored hostile incursion. Can be loaded into the LAG-14 Internal Sentry Launcher."
icon_state = "launchable_sentry"
equipment_type = /obj/structure/dropship_equipment/weapon/launch_bay
ammo_count = 1
diff --git a/code/modules/cm_marines/dropship_equipment.dm b/code/modules/cm_marines/dropship_equipment.dm
index 707811e77ce1..223cb29a6ab8 100644
--- a/code/modules/cm_marines/dropship_equipment.dm
+++ b/code/modules/cm_marines/dropship_equipment.dm
@@ -1,5 +1,5 @@
-/// Dropship equipments, mainly weaponry but also utility implements
+/// Dropship equipment, mainly weaponry but also utility implements
/obj/structure/dropship_equipment
density = TRUE
anchored = TRUE
@@ -153,7 +153,7 @@
/// Turret holder for dropship automated sentries
/obj/structure/dropship_equipment/sentry_holder
equip_categories = list(DROPSHIP_WEAPON, DROPSHIP_CREW_WEAPON)
- name = "sentry deployment system"
+ name = "\improper A/A-32-P Sentry Defense System"
desc = "A box that deploys a sentry turret. Fits on both the external weapon and crew compartment attach points of dropships. You need a powerloader to lift it."
density = FALSE
health = null
@@ -284,7 +284,7 @@
/// Holder for the dropship mannable machinegun system
/obj/structure/dropship_equipment/mg_holder
- name = "machine gun deployment system"
+ name = "\improper MTU-4B Door Gunner Hardpoint System"
desc = "A box that deploys a crew-served scoped M56D heavy machine gun. Fits on both the external weapon and crew compartment attach points of dropships. You need a powerloader to lift it."
density = FALSE
equip_categories = list(DROPSHIP_WEAPON, DROPSHIP_CREW_WEAPON)
@@ -419,13 +419,13 @@
/obj/structure/dropship_equipment/fuel/fuel_enhancer
- name = "fuel enhancer"
+ name = "\improper fuel enhancer"
desc = "A fuel enhancement system for dropships. It improves the thrust produced by the fuel combustion for faster travels. Fits inside the engine attach points. You need a powerloader to lift it."
icon_state = "fuel_enhancer"
point_cost = 800
/obj/structure/dropship_equipment/fuel/cooling_system
- name = "cooling system"
+ name = "\improper cooling system"
desc = "A cooling system for dropships. It produces additional cooling reducing delays between launch. Fits inside the engine attach points. You need a powerloader to lift it."
icon_state = "cooling_system"
point_cost = 800
@@ -437,7 +437,7 @@
equip_categories = list(DROPSHIP_ELECTRONICS)
/obj/structure/dropship_equipment/electronics/chaff_launcher
- name = "chaff launcher"
+ name = "\improper AN/ALE-203 Chaff Launcher"
icon_state = "chaff_launcher"
point_cost = 0
@@ -445,7 +445,7 @@
#define LIGHTING_MAX_LUMINOSITY_SHIPLIGHTS 12
/obj/structure/dropship_equipment/electronics/spotlights
- name = "spotlight"
+ name = "\improper AN/LEN-15 Spotlight"
icon_state = "spotlights"
desc = "A set of high-powered spotlights to illuminate large areas. Fits on electronics attach points of dropships. Moving this will require a powerloader."
is_interactable = TRUE
@@ -490,12 +490,12 @@
/obj/structure/dropship_equipment/electronics/flare_launcher
- name = "flare launcher"
+ name = "\improper AN/ALE-557 Flare Launcher"
icon_state = "flare_launcher"
point_cost = 0
/obj/structure/dropship_equipment/electronics/targeting_system
- name = "targeting system"
+ name = "\improper AN/AAQ-178 Weapon Targeting System"
icon_state = "targeting_system"
desc = "A targeting system for dropships. It improves firing accuracy on laser targets. Fits on electronics attach points. You need a powerloader to lift this."
point_cost = 800
@@ -507,7 +507,7 @@
icon_state = initial(icon_state)
/obj/structure/dropship_equipment/electronics/landing_zone_detector
- name = "\improper LZ detector"
+ name = "\improper AN/AVD-60 LZ detector"
desc = "An electronic device linked to the dropship's camera system that lets you observe your landing zone mid-flight."
icon_state = "lz_detector"
point_cost = 50
@@ -559,7 +559,7 @@
/obj/structure/dropship_equipment/adv_comp/docking
- name = "docking computer"
+ name = "\improper AN/AKW-222 Docking Computer"
icon_state = "docking_comp"
point_cost = 0
@@ -686,7 +686,7 @@
/obj/structure/dropship_equipment/weapon/heavygun
name = "\improper GAU-21 30mm cannon"
- desc = "A dismounted GAU-21 'Rattler' 30mm rotary cannon. It seems to be missing its feed links and has exposed connection wires. Capable of firing 5200 rounds a minute, feared by many for its power. Earned the nickname 'Rattler' from the vibrations it would cause on dropships in its initial production run."
+ desc = "A dismounted GAU-21 'Rattler' 30mm rotary cannon. It seems to be missing its feed links and has exposed connection wires. Capable of firing 5200 rounds a minute, feared by many for its power. Earned the nickname 'Rattler' from the vibrations it would cause on dropships in its initial production run. Accepts PGU-100/PGU-105 ammo crates"
icon_state = "30mm_cannon"
firing_sound = 'sound/effects/gau_incockpit.ogg'
point_cost = 400
@@ -702,9 +702,9 @@
/obj/structure/dropship_equipment/weapon/rocket_pod
- name = "missile pod"
- icon_state = "rocket_pod"
- desc = "A missile pod weapon system capable of launching a single laser-guided missile. Moving this will require some sort of lifter."
+ name = "\improper LAU-444 Guided Missile Launcher"
+ icon_state = "rocket_pod" //I want to force whoever used rocket and missile interchangeably to come back and look at this god damn mess.
+ desc = "A missile pod weapon system capable of launching a single laser-guided missile. Moving this will require some sort of lifter. Accepts AGM, AIM, BLU, and GBU missile systems."
firing_sound = 'sound/effects/rocketpod_fire.ogg'
firing_delay = 5
point_cost = 600
@@ -722,9 +722,9 @@
/obj/structure/dropship_equipment/weapon/minirocket_pod
- name = "minirocket pod"
+ name = "\improper LAU-229 Rocket Pod"
icon_state = "minirocket_pod"
- desc = "A mini rocket pod capable of launching six laser-guided mini rockets. Moving this will require some sort of lifter."
+ desc = "A rocket pod capable of launching six laser-guided mini rockets. Moving this will require some sort of lifter. Accepts the AGR-59 series of minirockets."
icon = 'icons/obj/structures/props/almayer_props64.dmi'
firing_sound = 'sound/effects/rocketpod_fire.ogg'
firing_delay = 10 //1 seconds
@@ -743,9 +743,9 @@
ammo_equipped = null
/obj/structure/dropship_equipment/weapon/laser_beam_gun
- name = "laser beam gun"
+ name = "\improper LWU-6B Laser Cannon"
icon_state = "laser_beam"
- desc = "State of the art technology recently acquired by the USCM, it fires a battery-fed pulsed laser beam at near lightspeed setting on fire everything it touches. Moving this will require some sort of lifter."
+ desc = "State of the art technology recently acquired by the USCM, it fires a battery-fed pulsed laser beam at near lightspeed setting on fire everything it touches. Moving this will require some sort of lifter. Accepts the BTU-17/LW Hi-Cap Laser Batteries."
icon = 'icons/obj/structures/props/almayer_props64.dmi'
firing_sound = 'sound/effects/phasein.ogg'
firing_delay = 50 //5 seconds
@@ -761,9 +761,9 @@
else icon_state = "laser_beam"
/obj/structure/dropship_equipment/weapon/launch_bay
- name = "launch bay"
+ name = "\improper LAG-14 Internal Sentry Launcher"
icon_state = "launch_bay"
- desc = "A launch bay to drop special ordnance. Fits inside the dropship's crew weapon emplacement. Moving this will require some sort of lifter."
+ desc = "A launch bay to drop special ordnance. Fits inside the dropship's crew weapon emplacement. Moving this will require some sort of lifter. Accepts the A/C-49-P Air Deployable Sentry as ammunition."
icon = 'icons/obj/structures/props/almayer_props.dmi'
firing_sound = 'sound/weapons/gun_flare_explode.ogg'
firing_delay = 10 //1 seconds
@@ -782,7 +782,7 @@
/obj/structure/dropship_equipment/medevac_system
- name = "medevac system"
+ name = "\improper RMU-4M Medevac System"
desc = "A winch system to lift injured marines on medical stretchers onto the dropship. Acquire lift target through the dropship equipment console."
equip_categories = list(DROPSHIP_CREW_WEAPON)
icon_state = "medevac_system"
@@ -1014,7 +1014,7 @@
// Fulton extraction system
/obj/structure/dropship_equipment/fulton_system
- name = "fulton recovery system"
+ name = "\improper RMU-19 Fulton Recovery System"
desc = "A winch system to collect any fulton recovery balloons in high altitude. Make sure you turn it on!"
equip_categories = list(DROPSHIP_CREW_WEAPON)
icon_state = "fulton_system"
@@ -1131,7 +1131,7 @@
// Rappel deployment system
/obj/structure/dropship_equipment/rappel_system
- name = "rappel deployment system"
+ name = "\improper HPU-1 Rappel Deployment System"
equip_categories = list(DROPSHIP_CREW_WEAPON)
icon_state = "rappel_module_packaged"
point_cost = 50
diff --git a/code/modules/cm_marines/radar.dm b/code/modules/cm_marines/radar.dm
index 5e85ff8950c7..f6751a8fe913 100644
--- a/code/modules/cm_marines/radar.dm
+++ b/code/modules/cm_marines/radar.dm
@@ -204,17 +204,20 @@
if(!trackable(humanoid))
continue
var/crewmember_name = "Unknown"
+ var/crewmember_rank = "Unknown"
if(humanoid.wear_id)
var/obj/item/card/id/ID = humanoid.wear_id.GetID()
if(ID?.registered_name)
crewmember_name = ID.registered_name
+ if(ID?.assignment)
+ crewmember_rank = ID.assignment
switch(humanoid.stat)
if(CONSCIOUS)
- crewmember_name = "[crewmember_name] (Conscious)"
+ crewmember_name = "[crewmember_name] ([crewmember_rank]) (Conscious)"
if(UNCONSCIOUS)
- crewmember_name = "[crewmember_name] (Unconscious)"
+ crewmember_name = "[crewmember_name] ([crewmember_rank]) (Unconscious)"
if(DEAD)
- crewmember_name = "[crewmember_name] (DEAD)"
+ crewmember_name = "[crewmember_name] ([crewmember_rank]) (DEAD)"
var/list/crewinfo = list(
ref = REF(humanoid),
name = crewmember_name,
diff --git a/code/modules/cm_phone/phone.dm b/code/modules/cm_phone/phone.dm
index a99bb5603dcb..fd9c8aa02d44 100644
--- a/code/modules/cm_phone/phone.dm
+++ b/code/modules/cm_phone/phone.dm
@@ -24,7 +24,8 @@ GLOBAL_LIST_EMPTY_TYPED(transmitters, /obj/structure/transmitter)
var/range = 7
var/enabled = TRUE
- var/callable = TRUE
+ /// Whether or not the phone is receiving calls or not. Varies between on/off or forcibly on/off.
+ var/do_not_disturb = PHONE_DND_OFF
var/base_icon_state
@@ -35,7 +36,7 @@ GLOBAL_LIST_EMPTY_TYPED(transmitters, /obj/structure/transmitter)
var/list/networks_transmit = list(FACTION_MARINE)
/obj/structure/transmitter/hidden
- callable = FALSE
+ do_not_disturb = PHONE_DND_FORCED
/obj/structure/transmitter/Initialize(mapload, ...)
. = ..()
@@ -80,7 +81,11 @@ GLOBAL_LIST_EMPTY_TYPED(transmitters, /obj/structure/transmitter)
for(var/possible_phone in GLOB.transmitters)
var/obj/structure/transmitter/target_phone = possible_phone
- if(TRANSMITTER_UNAVAILABLE(target_phone) || !target_phone.callable) // Phone not available
+ var/current_dnd = FALSE
+ switch(target_phone.do_not_disturb)
+ if(PHONE_DND_ON, PHONE_DND_FORCED)
+ current_dnd = TRUE
+ if(TRANSMITTER_UNAVAILABLE(target_phone) || current_dnd) // Phone not available
continue
var/net_link = FALSE
for(var/network in networks_transmit)
@@ -124,9 +129,18 @@ GLOBAL_LIST_EMPTY_TYPED(transmitters, /obj/structure/transmitter)
call_phone(user, params["phone_id"])
. = TRUE
SStgui.close_uis(src)
+ if("toggle_dnd")
+ toggle_dnd(user)
update_icon()
+/obj/structure/transmitter/ui_data(mob/user)
+ var/list/data = list()
+
+ data["availability"] = do_not_disturb
+
+ return data
+
/obj/structure/transmitter/ui_static_data(mob/user)
. = list()
@@ -172,6 +186,18 @@ GLOBAL_LIST_EMPTY_TYPED(transmitters, /obj/structure/transmitter)
user.put_in_hands(attached_to)
+/obj/structure/transmitter/proc/toggle_dnd(mob/living/carbon/human/user)
+ switch(do_not_disturb)
+ if(PHONE_DND_ON)
+ do_not_disturb = PHONE_DND_OFF
+ to_chat(user, SPAN_NOTICE("Do Not Disturb has been disabled. You can now receive calls."))
+ if(PHONE_DND_OFF)
+ do_not_disturb = PHONE_DND_ON
+ to_chat(user, SPAN_WARNING("Do Not Disturb has been enabled. No calls will be received."))
+ else
+ return FALSE
+ return TRUE
+
/obj/structure/transmitter/attack_hand(mob/user)
. = ..()
@@ -543,12 +569,18 @@ GLOBAL_LIST_EMPTY_TYPED(transmitters, /obj/structure/transmitter)
UnregisterSignal(attached_to, COMSIG_MOVABLE_MOVED)
reset_tether()
+/obj/structure/transmitter/no_dnd
+ do_not_disturb = PHONE_DND_FORBIDDEN
+
//rotary desk phones (need a touch tone handset at some point)
/obj/structure/transmitter/rotary
name = "rotary telephone"
icon_state = "rotary_phone"
desc = "The finger plate is a little stiff."
+/obj/structure/transmitter/rotary/no_dnd
+ do_not_disturb = PHONE_DND_FORBIDDEN
+
/obj/structure/transmitter/touchtone
name = "touch-tone telephone"
icon_state = "rotary_phone"//placeholder
diff --git a/code/modules/cm_preds/yaut_bracers.dm b/code/modules/cm_preds/yaut_bracers.dm
index 0f52332ee944..272882779d57 100644
--- a/code/modules/cm_preds/yaut_bracers.dm
+++ b/code/modules/cm_preds/yaut_bracers.dm
@@ -836,7 +836,7 @@
to_chat(caller, SPAN_WARNING("You recently activated the stabilising crystal. Be patient."))
return FALSE
- if(!drain_power(caller, 1000))
+ if(!drain_power(caller, 400))
return FALSE
inject_timer = TRUE
@@ -877,7 +877,7 @@
to_chat(usr, SPAN_WARNING("Your bracer is still generating a new healing capsule!"))
return FALSE
- if(!drain_power(caller, 800))
+ if(!drain_power(caller, 600))
return FALSE
healing_capsule_timer = TRUE
diff --git a/code/modules/cm_preds/yaut_weapons.dm b/code/modules/cm_preds/yaut_weapons.dm
index 9b8399571cab..0ea527847d72 100644
--- a/code/modules/cm_preds/yaut_weapons.dm
+++ b/code/modules/cm_preds/yaut_weapons.dm
@@ -955,12 +955,15 @@
if(!HAS_TRAIT(user, TRAIT_YAUTJA_TECH))
to_chat(user, SPAN_WARNING("You have no idea how this thing works!"))
return
+ if(charge_time < 7)
+ to_chat(user, SPAN_WARNING("The rifle does not have enough power remaining!"))
+ return
return ..()
/obj/item/weapon/gun/energy/yautja/plasmarifle/load_into_chamber()
ammo = GLOB.ammo_list[/datum/ammo/energy/yautja/rifle/bolt]
- charge_time -= 10
+ charge_time -= 7
var/obj/projectile/projectile = create_bullet(ammo, initial(name))
projectile.set_light(1)
in_chamber = projectile
@@ -975,7 +978,8 @@
/obj/item/weapon/gun/energy/yautja/plasmarifle/delete_bullet(obj/projectile/projectile_to_fire, refund = 0)
qdel(projectile_to_fire)
- if(refund) charge_time *= 2
+ if(refund)
+ charge_time += 7
return TRUE
#define FIRE_MODE_STANDARD "Standard"
@@ -1165,15 +1169,15 @@
switch(strength)
if("low power stun bolts")
strength = "high power stun bolts"
- charge_cost = 100
- set_fire_delay(FIRE_DELAY_TIER_6 * 3)
+ charge_cost = 50
+ set_fire_delay(FIRE_DELAY_TIER_1)
fire_sound = 'sound/weapons/pred_lasercannon.ogg'
to_chat(user, SPAN_NOTICE("[src] will now fire [strength]."))
ammo = GLOB.ammo_list[/datum/ammo/energy/yautja/caster/bolt/stun]
if("high power stun bolts")
strength = "plasma immobilizers"
- charge_cost = 300
- set_fire_delay(FIRE_DELAY_TIER_6 * 20)
+ charge_cost = 200
+ set_fire_delay(FIRE_DELAY_TIER_2 * 8)
fire_sound = 'sound/weapons/pulse.ogg'
to_chat(user, SPAN_NOTICE("[src] will now fire [strength]."))
ammo = GLOB.ammo_list[/datum/ammo/energy/yautja/caster/sphere/stun]
@@ -1188,8 +1192,8 @@
switch(strength)
if("plasma bolts")
strength = "plasma spheres"
- charge_cost = 1200
- set_fire_delay(FIRE_DELAY_TIER_6 * 20)
+ charge_cost = 1000
+ set_fire_delay(FIRE_DELAY_TIER_2 * 12)
fire_sound = 'sound/weapons/pulse.ogg'
to_chat(user, SPAN_NOTICE("[src] will now fire [strength]."))
ammo = GLOB.ammo_list[/datum/ammo/energy/yautja/caster/sphere]
diff --git a/code/modules/gear_presets/survivors/trijent/crashlanding_upp_bar_insert_trijent.dm b/code/modules/gear_presets/survivors/trijent/crashlanding_upp_bar_insert_trijent.dm
index e8dc8482b769..147e40a24314 100644
--- a/code/modules/gear_presets/survivors/trijent/crashlanding_upp_bar_insert_trijent.dm
+++ b/code/modules/gear_presets/survivors/trijent/crashlanding_upp_bar_insert_trijent.dm
@@ -9,18 +9,13 @@
languages = list(LANGUAGE_RUSSIAN, LANGUAGE_GERMAN, LANGUAGE_CHINESE)
faction = FACTION_UPP
faction_group = list(FACTION_UPP, FACTION_SURVIVOR)
- role_comm_title = "UPP 173RD RECON"
+ role_comm_title = "173/RECON"
idtype = /obj/item/card/id/dogtag
flags = EQUIPMENT_PRESET_EXTRA
- uses_special_name = TRUE
access = list(
ACCESS_CIVILIAN_PUBLIC,
)
-/datum/equipment_preset/survivor/upp/load_name(mob/living/carbon/human/new_human, randomise)
- var/random_name = capitalize(pick(new_human.gender == MALE ? first_names_male_upp : first_names_female_upp)) + " " + capitalize(pick(last_names_upp))
- new_human.change_real_name(new_human, random_name)
-
/datum/equipment_preset/survivor/upp/load_gear(mob/living/carbon/human/new_human)
var/obj/item/clothing/under/marine/veteran/UPP/uniform = new()
var/random_number = rand(1,2)
@@ -152,7 +147,7 @@
assignment = JOB_UPP_LEADER
rank = JOB_UPP_LEADER
languages = list(LANGUAGE_RUSSIAN, LANGUAGE_ENGLISH, LANGUAGE_GERMAN, LANGUAGE_CHINESE)
- role_comm_title = "UPP 173Rd RECON SL"
+ role_comm_title = "173/RECON SL"
skills = /datum/skills/military/survivor/upp_sl
/datum/equipment_preset/survivor/upp/squad_leader/load_gear(mob/living/carbon/human/new_human)
diff --git a/code/modules/gear_presets/uscm.dm b/code/modules/gear_presets/uscm.dm
index 1c84e7cad4ba..ec0195e928c5 100644
--- a/code/modules/gear_presets/uscm.dm
+++ b/code/modules/gear_presets/uscm.dm
@@ -803,7 +803,6 @@
new_human.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/pmc/marsoc, WEAR_FACE)
//head
new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/sof, WEAR_HEAD)
- new_human.equip_to_slot_or_del(new /obj/item/prop/helmetgarb/helmet_nvg/marsoc, WEAR_IN_HELMET)
new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/shotgun/buckshot, WEAR_IN_HELMET)
//uniform
var/obj/item/clothing/under/marine/veteran/marsoc/M = new()
diff --git a/code/modules/hydroponics/hydro_tray.dm b/code/modules/hydroponics/hydro_tray.dm
index 24097e1f8e92..4d175c5a6f1f 100644
--- a/code/modules/hydroponics/hydro_tray.dm
+++ b/code/modules/hydroponics/hydro_tray.dm
@@ -1,4 +1,5 @@
#define HYDRO_SPEED_MULTIPLIER 1
+#define HYDRO_WATER_CONSUMPTION_MULTIPLIER 1.5
/obj/structure/machinery/portable_atmospherics/hydroponics
name = "hydroponics tray"
@@ -206,7 +207,7 @@
if(seed.nutrient_consumption > 0 && nutrilevel > 0 && prob(25))
nutrilevel -= max(0,seed.nutrient_consumption * HYDRO_SPEED_MULTIPLIER)
if(seed.water_consumption > 0 && waterlevel > 0 && prob(25))
- waterlevel -= max(0,seed.water_consumption * HYDRO_SPEED_MULTIPLIER)
+ waterlevel -= round(max(0,(seed.water_consumption * HYDRO_WATER_CONSUMPTION_MULTIPLIER) * HYDRO_SPEED_MULTIPLIER))
// Make sure the plant is not starving or thirsty. Adequate
// water and nutrients will cause a plant to become healthier.
@@ -219,17 +220,9 @@
if(nutrilevel < 1)
plant_health = 0
- // Check that pressure, heat and light are all within bounds.
+ // Check that pressure, heat are all within bounds.
// First, handle an open system or an unconnected closed system.
- var/turf/T = loc
-
- // Handle light requirements.
- if(T)
- var/light_available = T.get_lumcount(0, 10)
- if(abs(light_available - seed.ideal_light) > seed.light_tolerance)
- plant_health -= healthmod
-
// Toxin levels beyond the plant's tolerance cause damage, but
// toxins are sucked up each tick and slowly reduce over time.
if(toxins > 0)
@@ -606,6 +599,25 @@
else
to_chat(user, SPAN_DANGER("This plot is completely devoid of weeds. It doesn't need uprooting."))
+ else if (istype(O, /obj/item/tool/shovel/spade))
+ if(isnull(seed))
+ return
+ user.visible_message(SPAN_DANGER("[user] starts to uproot the plant."), SPAN_DANGER("You begin removing plant from [src]..."))
+ if(!do_after(user, 1 SECONDS, INTERRUPT_NO_NEEDHAND|BEHAVIOR_IMMOBILE, BUSY_ICON_FRIENDLY, src, INTERRUPT_MOVED, BUSY_ICON_FRIENDLY))
+ return
+ to_chat(user, SPAN_NOTICE("You remove the plant from [src]."))
+ seed = null
+ dead = 0
+ sampled = 0
+ age = 0
+ harvest = 0
+ toxins = 0
+ yield_mod = 0
+ mutation_mod = 0
+
+ check_level_sanity()
+ update_icon()
+
else if (istype(O, /obj/item/storage/bag/plants))
attack_hand(user)
@@ -663,20 +675,9 @@
return info
-/obj/structure/machinery/portable_atmospherics/hydroponics/soil/show_hydro_info(mob/user as mob)
- var/info = ..()
- var/turf/T = loc
- var/area/A = T.loc
- var/light_available
- if(A)
- light_available = max(0,min(10,T.dynamic_lumcount)-5)
-
- info += "The tray's sensor suite is reporting a light level of [light_available] lumens.\n"
- return info
-
/obj/structure/machinery/portable_atmospherics/hydroponics/attack_hand(mob/user as mob)
- if(istype(usr,/mob/living/silicon))
+ if(istype(user, /mob/living/silicon))
return
if(harvest)
@@ -684,19 +685,7 @@
else if(dead)
remove_dead(user)
else
- to_chat(usr, show_hydro_info(user))
-
-/obj/structure/machinery/portable_atmospherics/hydroponics/verb/close_lid()
- set name = "Toggle Tray Lid"
- set category = "Object"
- set src in view(1)
-
- if(!usr || usr.stat || usr.is_mob_restrained())
- return
-
- closed_system = !closed_system
- to_chat(usr, "You [closed_system ? "close" : "open"] the tray's lid.")
- update_icon()
+ to_chat(user, show_hydro_info(user))
/obj/structure/machinery/portable_atmospherics/hydroponics/verb/flush() //used to reset the tray
set name = "Flush Tray"
@@ -716,7 +705,7 @@
toxins = 0
yield_mod = 0
mutation_mod = 0
- waterlevel = 100
+ waterlevel = 0
nutrilevel = 0
pestlevel = 0
weedlevel = 0
@@ -743,8 +732,5 @@
else
..()
-/obj/structure/machinery/portable_atmospherics/hydroponics/soil/Initialize()
- . = ..()
- verbs -= /obj/structure/machinery/portable_atmospherics/hydroponics/verb/close_lid
-
#undef HYDRO_SPEED_MULTIPLIER
+#undef HYDRO_WATER_CONSUMPTION_MULTIPLIER
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 1202ca10260d..130a8a923edc 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -1209,6 +1209,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(eta_status)
. += "Evacuation: [eta_status]"
+ if(client.prefs?.be_special & BE_ALIEN_AFTER_DEATH)
+ if(larva_queue_cached_message)
+ . += larva_queue_cached_message
+
/proc/message_ghosts(message)
for(var/mob/dead/observer/O as anything in GLOB.observer_list)
diff --git a/code/modules/mob/living/carbon/human/species/working_joe/task_update.dm b/code/modules/mob/living/carbon/human/species/working_joe/task_update.dm
index 789d203aa938..88051db9999a 100644
--- a/code/modules/mob/living/carbon/human/species/working_joe/task_update.dm
+++ b/code/modules/mob/living/carbon/human/species/working_joe/task_update.dm
@@ -49,7 +49,7 @@
say_message = "Existing tasks have a higher priority."
emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-/datum/emote/living/carbon/human/synthetic/working_joe/task_update/come_with_me
+/datum/emote/living/carbon/human/synthetic/working_joe/task_update/ticket_remove
key = "ticketremoved"
sound = 'sound/voice/joe/support_ticket_removed.ogg'
say_message = "Service support ticket removed from queue."
diff --git a/code/modules/projectiles/ammo_datums.dm b/code/modules/projectiles/ammo_datums.dm
index 1bb1083a9d4f..783b982f10bd 100644
--- a/code/modules/projectiles/ammo_datums.dm
+++ b/code/modules/projectiles/ammo_datums.dm
@@ -2464,9 +2464,6 @@
else
M.apply_effect(stun_time, WEAKEN)
-
-
-
/datum/ammo/energy/yautja/rifle/bolt
name = "plasma rifle bolt"
icon_state = "ion"
diff --git a/code/modules/projectiles/gun_attachables.dm b/code/modules/projectiles/gun_attachables.dm
index 2438947ef254..20781639a579 100644
--- a/code/modules/projectiles/gun_attachables.dm
+++ b/code/modules/projectiles/gun_attachables.dm
@@ -3058,9 +3058,6 @@ Defined in conflicts.dm of the #defines folder.
/obj/item/attachable/attached_gun/extinguisher/fire_attachment(atom/target, obj/item/weapon/gun/gun, mob/living/user)
if(!internal_extinguisher)
return
- if(!(gun.flags_item & WIELDED))
- to_chat(user, SPAN_WARNING("You must wield [gun] to fire [src]!"))
- return
if(..())
return internal_extinguisher.afterattack(target, user)
diff --git a/code/modules/projectiles/guns/shotguns.dm b/code/modules/projectiles/guns/shotguns.dm
index 9a4b1551736c..edecce85ccb4 100644
--- a/code/modules/projectiles/guns/shotguns.dm
+++ b/code/modules/projectiles/guns/shotguns.dm
@@ -266,14 +266,18 @@ can cause issues with ammo types getting mixed up during the burst.
/obj/item/weapon/gun/shotgun/combat/handle_starting_attachment()
..()
- var/obj/item/attachable/attached_gun/grenade/G = new(src)
- G.flags_attach_features &= ~ATTACH_REMOVABLE
- G.hidden = TRUE
- G.Attach(src)
- update_attachable(G.slot)
+ var/obj/item/attachable/attached_gun/grenade/ugl = new(src)
+ var/obj/item/attachable/stock/tactical/stock = new(src)
+ ugl.flags_attach_features &= ~ATTACH_REMOVABLE
+ ugl.hidden = TRUE
+ ugl.Attach(src)
+ update_attachable(ugl.slot)
+ stock.hidden = FALSE
+ stock.Attach(src)
+ update_attachable(stock.slot)
/obj/item/weapon/gun/shotgun/combat/set_gun_attachment_offsets()
- attachable_offset = list("muzzle_x" = 33, "muzzle_y" = 19,"rail_x" = 10, "rail_y" = 21, "under_x" = 14, "under_y" = 16, "stock_x" = 14, "stock_y" = 16)
+ attachable_offset = list("muzzle_x" = 33, "muzzle_y" = 19,"rail_x" = 10, "rail_y" = 21, "under_x" = 14, "under_y" = 16, "stock_x" = 11, "stock_y" = 13.)
diff --git a/code/modules/surgery/surgery_initiator.dm b/code/modules/surgery/surgery_initiator.dm
index 08b4dbdfed60..8b7506c9b7b8 100644
--- a/code/modules/surgery/surgery_initiator.dm
+++ b/code/modules/surgery/surgery_initiator.dm
@@ -27,6 +27,13 @@
to_chat(user, SPAN_WARNING("You can't perform surgery under these bad conditions!"))
return FALSE
+ var/obj/limb/surgery_limb = target.get_limb(target_zone)
+ if(surgery_limb)
+ var/obj/item/blocker = target.get_sharp_obj_blocker(surgery_limb)
+ if(blocker)
+ to_chat(user, SPAN_WARNING("[blocker] [target] is wearing restricts your access to the surgical site, take it off!"))
+ return
+
if(user.action_busy) //already doing an action
return FALSE
@@ -130,6 +137,12 @@
if(surgeryinstance.lying_required && !target.lying)
return TRUE
+ if(surgery_limb)
+ var/obj/item/blocker = target.get_sharp_obj_blocker(surgery_limb)
+ if(blocker)
+ to_chat(user, SPAN_WARNING("[blocker] [target] is wearing restricts your access to the surgical site, take it off!"))
+ return
+
if(affecting)
if(surgeryinstance.requires_bodypart)
if(affecting.status & LIMB_DESTROYED)
diff --git a/colonialmarines.dme b/colonialmarines.dme
index dafbaedd9c1d..26f83f7a43c0 100644
--- a/colonialmarines.dme
+++ b/colonialmarines.dme
@@ -529,6 +529,7 @@ s// DM Environment file for colonialmarines.dme.
#include "code\datums\keybinding\emote.dm"
#include "code\datums\keybinding\human.dm"
#include "code\datums\keybinding\human_combat.dm"
+#include "code\datums\keybinding\human_inventory.dm"
#include "code\datums\keybinding\living.dm"
#include "code\datums\keybinding\mob.dm"
#include "code\datums\keybinding\movement.dm"
diff --git a/html/changelogs/AutoChangeLog-pr-4541.yml b/html/changelogs/AutoChangeLog-pr-4541.yml
deleted file mode 100644
index 3c8ce797677e..000000000000
--- a/html/changelogs/AutoChangeLog-pr-4541.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "QuickLode"
-delete-after: True
-changes:
- - bugfix: "Allows M46C prototype rifle to accept standard M41A MK2 rubber munitions"
\ No newline at end of file
diff --git a/html/changelogs/archive/2023-10.yml b/html/changelogs/archive/2023-10.yml
new file mode 100644
index 000000000000..5e0d2a5e5068
--- /dev/null
+++ b/html/changelogs/archive/2023-10.yml
@@ -0,0 +1,120 @@
+2023-10-01:
+ QuickLode:
+ - bugfix: Allows M46C prototype rifle to accept standard M41A MK2 rubber munitions
+2023-10-02:
+ Ben10083:
+ - bugfix: fixed a Working Joe voiceline from not working
+ Casper:
+ - ui: added microwave TGUI
+ Morrow:
+ - bugfix: Fixed fake incomplete surgeries
+ - bugfix: Fixed manual distress signal manual call options
+ - bugfix: Fixed a WO distress signal over announcing
+ Steelpoint:
+ - balance: Tool Pouch can now hold the same types of items that a toolbelt can hold.
+ It is still restricted to 4 inventory slots.
+ - balance: Eggs no longer are resistant to certain kinds of melee attacks. Making
+ them far easier to kill in melee.
+ realforest2001:
+ - balance: Reduces power cost for plasma caster use, and creation of thwei crystals/health
+ capsules.
+2023-10-03:
+ Drathek:
+ - rscadd: Add the last larva queue message to observer's status panel
+ Huffie56:
+ - qol: remove welding google from squad comtech vendor to avoid him to waste point
+ since tool vendor have them for free.
+ JackieEstegado:
+ - bugfix: Fixed runtime that could happen when melleing an egg.
+ Morrow:
+ - balance: If a mob is on top of a reflective wall the wall no longer functions
+ - balance: Bullets will not longer get eaten by xeno special structures unless you
+ click directly on them
+ - bugfix: '"Fixed" missing window frame icon states'
+ Private Tristan:
+ - balance: all resin fruits now contain 30u of fruit resin along with their secondary
+ reagents.
+ - balance: Alacrit fruits now contain catecholamine plasma instead of pheromone
+ plasma.
+ Steelpoint:
+ - rscadd: Xenomorph hives can now form an alliance with Colonial Marshals.
+ Sulaboy, Hidgamer, Steelpoint:
+ - rscadd: Adds the surgical drop pouch item. It comes in green, blue and black.
+ Only available from the synthetic vendor currently.
+ - imageadd: Adds sprites for the surgical drop pouches.
+2023-10-04:
+ BeagleGaming1:
+ - rscadd: Added keybinds to allow inventory manipulation
+ Morrow:
+ - admin: Operation time logging
+ - balance: Underbarrel extinguisher no longer requires wield
+ - bugfix: Re-added previous UPP changes that were lost in soft conflict
+ - spellcheck: Removed some ambiguous text about loyalties for UPP survivors
+ - bugfix: Fixed storage depth for internal storages
+ - bugfix: Candle boxes can now only hold candles
+ blackdragonTOW:
+ - sounddel: removed 300+ ancient and unused Piano and Violin notes.
+2023-10-05:
+ Drathek:
+ - rscadd: Restore the stat panel options menu to change the stat panel font size
+ - bugfix: Fix getFlatIcon not resizing its template nor respect appearance_flags
+ of RESET_COLOR and RESET_ALPHA
+ Morrow:
+ - bugfix: Fixed req door accesses
+ - rscadd: Added NVG optics
+ - rscadd: Added a hotkey to cycle optics
+ - rscadd: Added special marine raider optic
+ - rscadd: Added examine text for optics
+ - rscadd: Added research publication to advanced medical optic
+ - rscdel: Removed functional tube NVGs from gameplay
+ - refactor: Moved some optics code around to make it less redundant
+ - bugfix: Fixed a bug with duplicate optic actions
+ - bugfix: Fixed a reported bug where HUDs would stay on forever with destruction
+ of a helmet
+ - balance: Comms relays now have a five minute cooldown to be re-pylon'd after a
+ pylon was destroyed
+ - bugfix: Pylons now account for stored larva
+ - bugfix: Fixed floodlight stacking to make mostly invincible walls
+ - refactor: Refactored 90% of the floodlight code
+ Steelpoint:
+ - ui: Added personnel job titles to the handheld crew monitor, to make it easier
+ to tell find out exactly what role's you are looking for. Also slightly expands
+ the default monitor screen size to accommodate the entire personnel text on
+ screen.
+2023-10-06:
+ blackdragonTOW:
+ - bugfix: fixed spider dead sprite to not have white space (is transparent instead)
+2023-10-08:
+ Kivts:
+ - rscadd: You can partially protect yourself from flu and other disease by wearing
+ a mask and other PPE. Doesnt affect Black Goo.
+ Steelpoint:
+ - rscadd: Black and white beret's have been added as loadout options for all characters
+ as headwear.
+ - rscadd: More cosmetic options are on offer for Synthetics. Includes white and
+ black berets, standard or darker engineering and mp uniforms and all camo options
+ for the poncho.
+ - rscadd: The Synth Councillor and Synth Utility uniforms can now roll their sleeves.
+ blackdragonTOW:
+ - spellcheck: Altered inconsistent dropship ammo names
+ irRegularGuy646:
+ - rscadd: Added new "M1A1" ballistic goggle reskin
+ kiVts:
+ - rscadd: Spades can now remove botany plants.
+ - rscadd: Plants now globally take more water to grow.
+ - code_imp: removed all mention of lighting in botany trays.
+ - bugfix: Research computer no longer shows "for" for every simulation result.
+ realforest2001:
+ - rscadd: Added a Do Not Disturb feature for MOST phones. (Overwatch and a couple
+ others excluded).
+ spartanbobby:
+ - maptweak: Fixes floating Cameras and Light in the maint tunnels north of south
+ of brig
+ - maptweak: Fixes incorrect Shower tiles in maint shower north of engineering
+ - maptweak: Fixes incorrect area in maint south of VC bunk
+ - maptweak: Removes Piano from USS Almayer upper lifeboat area
+2023-10-09:
+ SpartanBobby, esselnek:
+ - rscadd: tactical shotguns now come standard with their stock. Yes you can remove
+ it if you dont want it
+ - rscadd: new tactical shotgun stock sprite done by esselnek
diff --git a/html/statbrowser.js b/html/statbrowser.js
index 81bd8cdf9c8d..78eb7d4e5716 100644
--- a/html/statbrowser.js
+++ b/html/statbrowser.js
@@ -17,6 +17,17 @@ if (!String.prototype.trim) {
// Status panel implementation ------------------------------------------------
var status_tab_parts = ["Loading..."];
var current_tab = null;
+var local_fontsize;
+// Per `storage.js` for tgui:
+// Localstorage can sometimes throw an error, even if DOM storage is not
+// disabled in IE11 settings.
+// See: https://superuser.com/questions/1080011
+try {
+ local_fontsize = localStorage.getItem("fontsize");
+} catch (error) {
+ local_fontsize = 12;
+}
+var current_fontsize = local_fontsize ? parseInt(local_fontsize) : 12; // in px, also determines line height and category header sizes for the verb menus
var mc_tab_parts = [["Loading...", ""]];
var href_token = null;
var spells = [];
@@ -232,8 +243,8 @@ function spell_cat_check(cat) {
}
}
-function tab_change(tab) {
- if (tab == current_tab) return;
+function tab_change(tab, force) {
+ if (!force && tab == current_tab) return;
if (document.getElementById(current_tab))
document.getElementById(current_tab).className = "button"; // disable active on last button
current_tab = tab;
@@ -698,6 +709,7 @@ function draw_verbs(cat) {
a.href = "#";
a.onclick = make_verb_onclick(command.replace(/\s/g, "-"));
a.className = "grid-item";
+ a.style.lineHeight = current_fontsize + 2 + "px";
var t = document.createElement("span");
t.textContent = command;
t.className = "grid-item-text";
@@ -716,6 +728,7 @@ function draw_verbs(cat) {
// do addition here
var header = document.createElement("h3");
header.textContent = cat;
+ header.style.fontSize = current_fontsize + 4 + "px";
content.appendChild(header);
content.appendChild(additions[cat]);
}
@@ -848,6 +861,7 @@ Byond.subscribeTo("remove_verb_list", function (v) {
// passes a 2D list of (verbcategory, verbname) creates tabs and adds verbs to respective list
// example (IC, Say)
Byond.subscribeTo("init_verbs", function (payload) {
+ statcontentdiv.style.fontSize = current_fontsize + "px";
wipe_verbs(); // remove all verb categories so we can replace them
checkStatusTab(); // remove all status tabs
verb_tabs = payload.panel_tabs;
@@ -868,6 +882,7 @@ Byond.subscribeTo("init_verbs", function (payload) {
draw_verbs(current_tab);
}
}
+ createOptionsButton();
SendTabsToByond();
});
@@ -1019,3 +1034,29 @@ Byond.subscribeTo("remove_sdql2", remove_sdql2);
Byond.subscribeTo("remove_mc", remove_mc);
Byond.subscribeTo("add_verb_list", add_verb_list);
+
+function createOptionsButton() {
+ var button = document.createElement("BUTTON");
+ button.onclick = function () {
+ openOptionsMenu();
+ this.blur();
+ };
+ button.id = "options";
+ button.textContent = "Options";
+ button.className = "options";
+ button.style.order = 999; // last please
+ button.style.marginLeft = "auto";
+ button.style.marginRight = "2%";
+ menu.appendChild(button);
+}
+
+function openOptionsMenu() {
+ Byond.command("Open-Statbrowser-Options " + current_fontsize);
+}
+
+Byond.subscribeTo("change_fontsize", function (new_fontsize) {
+ current_fontsize = parseInt(new_fontsize);
+ localStorage.setItem("fontsize", current_fontsize.toString());
+ statcontentdiv.style.fontSize = current_fontsize + "px";
+ tab_change(current_tab, true); // Redraw the current tab
+});
diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi
index 2fa8d673454f..8246bb4f70aa 100644
Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ
diff --git a/icons/mob/humans/onmob/eyes.dmi b/icons/mob/humans/onmob/eyes.dmi
index 2be8eb8d6fad..bda5bec0f0d7 100644
Binary files a/icons/mob/humans/onmob/eyes.dmi and b/icons/mob/humans/onmob/eyes.dmi differ
diff --git a/icons/mob/humans/onmob/head_1.dmi b/icons/mob/humans/onmob/head_1.dmi
index b41eab22a229..dad985c1e11c 100644
Binary files a/icons/mob/humans/onmob/head_1.dmi and b/icons/mob/humans/onmob/head_1.dmi differ
diff --git a/icons/mob/humans/onmob/helmet_garb.dmi b/icons/mob/humans/onmob/helmet_garb.dmi
index 325aed72b155..9e4cbf462982 100644
Binary files a/icons/mob/humans/onmob/helmet_garb.dmi and b/icons/mob/humans/onmob/helmet_garb.dmi differ
diff --git a/icons/mob/humans/onmob/mask.dmi b/icons/mob/humans/onmob/mask.dmi
index badd31ad722c..6f7e99813986 100644
Binary files a/icons/mob/humans/onmob/mask.dmi and b/icons/mob/humans/onmob/mask.dmi differ
diff --git a/icons/mob/humans/onmob/ties.dmi b/icons/mob/humans/onmob/ties.dmi
index d82226002ec8..c8fb98c0c5c1 100644
Binary files a/icons/mob/humans/onmob/ties.dmi and b/icons/mob/humans/onmob/ties.dmi differ
diff --git a/icons/mob/humans/onmob/uniform_0.dmi b/icons/mob/humans/onmob/uniform_0.dmi
index 6d944f4fa649..873c325a560e 100644
Binary files a/icons/mob/humans/onmob/uniform_0.dmi and b/icons/mob/humans/onmob/uniform_0.dmi differ
diff --git a/icons/obj/items/clothing/cm_hats.dmi b/icons/obj/items/clothing/cm_hats.dmi
index 9c4ed5bf4617..1595402fef50 100644
Binary files a/icons/obj/items/clothing/cm_hats.dmi and b/icons/obj/items/clothing/cm_hats.dmi differ
diff --git a/icons/obj/items/clothing/glasses.dmi b/icons/obj/items/clothing/glasses.dmi
index b5a175e448bd..13dd0c542c6e 100644
Binary files a/icons/obj/items/clothing/glasses.dmi and b/icons/obj/items/clothing/glasses.dmi differ
diff --git a/icons/obj/items/clothing/helmet_visors.dmi b/icons/obj/items/clothing/helmet_visors.dmi
index 6ba0cfe5623e..f47bc9aa26d2 100644
Binary files a/icons/obj/items/clothing/helmet_visors.dmi and b/icons/obj/items/clothing/helmet_visors.dmi differ
diff --git a/icons/obj/items/clothing/ties.dmi b/icons/obj/items/clothing/ties.dmi
index e0e25b9f579d..f236480c7b9d 100644
Binary files a/icons/obj/items/clothing/ties.dmi and b/icons/obj/items/clothing/ties.dmi differ
diff --git a/icons/obj/items/clothing/ties_overlay.dmi b/icons/obj/items/clothing/ties_overlay.dmi
index 89396622aba3..8db72b11cbe3 100644
Binary files a/icons/obj/items/clothing/ties_overlay.dmi and b/icons/obj/items/clothing/ties_overlay.dmi differ
diff --git a/icons/obj/items/weapons/guns/attachments/stock.dmi b/icons/obj/items/weapons/guns/attachments/stock.dmi
index a15409b808ca..d3a95284a23f 100644
Binary files a/icons/obj/items/weapons/guns/attachments/stock.dmi and b/icons/obj/items/weapons/guns/attachments/stock.dmi differ
diff --git a/maps/map_files/BigRed/BigRed.dmm b/maps/map_files/BigRed/BigRed.dmm
index b22a08e3f62d..b29802bd6548 100644
--- a/maps/map_files/BigRed/BigRed.dmm
+++ b/maps/map_files/BigRed/BigRed.dmm
@@ -29757,7 +29757,7 @@
/area/bigredv2/outside/filtration_plant)
"htp" = (
/obj/structure/transmitter/colony_net{
- callable = 0;
+ do_not_disturb = 1;
dir = 4;
phone_category = "Lambda Labs";
phone_color = "red";
diff --git a/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm b/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm
index dac318453cdf..d000153afd71 100644
--- a/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm
+++ b/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm
@@ -11958,12 +11958,6 @@
icon_state = "brown"
},
/area/lv522/atmos/north_command_centre)
-"fpS" = (
-/obj/item/prop/helmetgarb/helmet_nvg/marsoc,
-/turf/open/floor/corsat{
- icon_state = "plate"
- },
-/area/lv522/oob)
"fpW" = (
/obj/structure/pipes/standard/simple/hidden/green{
dir = 4
@@ -99528,7 +99522,7 @@ tiQ
joK
cPU
daL
-fpS
+xcU
dLz
xcU
edk
diff --git a/maps/map_files/LV624/LV624.dmm b/maps/map_files/LV624/LV624.dmm
index 4d94b662c589..336dc6a90212 100644
--- a/maps/map_files/LV624/LV624.dmm
+++ b/maps/map_files/LV624/LV624.dmm
@@ -1119,8 +1119,10 @@
},
/area/lv624/ground/barrens/containers)
"afu" = (
-/obj/structure/machinery/floodlight,
/obj/item/ammo_casing,
+/obj/structure/machinery/floodlight/landing{
+ name = "bolted floodlight"
+ },
/turf/open/floor/plating{
dir = 9;
icon_state = "warnplate"
@@ -1154,7 +1156,9 @@
},
/area/lv624/ground/barrens/central_barrens)
"afy" = (
-/obj/structure/machinery/floodlight,
+/obj/structure/machinery/floodlight/landing{
+ name = "bolted floodlight"
+ },
/turf/open/floor/plating{
dir = 5;
icon_state = "warnplate"
@@ -1205,11 +1209,6 @@
/obj/item/ammo_casing,
/turf/open/floor/plating,
/area/lv624/ground/barrens/central_barrens)
-"afM" = (
-/obj/structure/machinery/floodlight,
-/obj/effect/decal/cleanable/blood,
-/turf/open/floor/plating,
-/area/lv624/ground/barrens/central_barrens)
"afN" = (
/obj/item/ammo_casing,
/turf/open/floor/plating,
@@ -1389,10 +1388,6 @@
"agA" = (
/turf/open/floor/sandstone/runed,
/area/lv624/ground/caves/south_east_caves)
-"agC" = (
-/obj/structure/machinery/floodlight,
-/turf/open/floor/plating,
-/area/lv624/ground/barrens/central_barrens)
"agD" = (
/obj/structure/surface/table/reinforced{
dir = 8;
@@ -1407,8 +1402,10 @@
/turf/open/floor/plating,
/area/lv624/ground/barrens/central_barrens)
"agF" = (
-/obj/structure/machinery/floodlight,
/obj/item/ammo_casing,
+/obj/structure/machinery/floodlight/landing{
+ name = "bolted floodlight"
+ },
/turf/open/floor/plating,
/area/lv624/ground/barrens/central_barrens)
"agG" = (
@@ -1585,7 +1582,9 @@
},
/area/lv624/ground/barrens/west_barrens/ceiling)
"ahM" = (
-/obj/structure/machinery/floodlight,
+/obj/structure/machinery/floodlight/landing{
+ name = "bolted floodlight"
+ },
/turf/open/floor/plating{
dir = 10;
icon_state = "warnplate"
@@ -1625,7 +1624,9 @@
},
/area/lv624/ground/barrens/central_barrens)
"ahT" = (
-/obj/structure/machinery/floodlight,
+/obj/structure/machinery/floodlight/landing{
+ name = "bolted floodlight"
+ },
/turf/open/floor/plating{
dir = 6;
icon_state = "warnplate"
@@ -41057,7 +41058,7 @@ ajW
afI
ajW
ajW
-agC
+ajW
afN
ajW
ajW
@@ -42192,7 +42193,7 @@ jaa
wVk
wVk
afx
-afM
+agf
ajW
agi
ajW
@@ -42202,7 +42203,7 @@ agT
ahh
ahl
afN
-agC
+ajW
ahS
afk
wVk
@@ -43337,7 +43338,7 @@ ajW
agl
ajW
ajW
-agC
+ajW
ajW
afN
eah
diff --git a/maps/map_files/USS_Almayer/USS_Almayer.dmm b/maps/map_files/USS_Almayer/USS_Almayer.dmm
index 32937d821d60..fb842c754dd9 100644
--- a/maps/map_files/USS_Almayer/USS_Almayer.dmm
+++ b/maps/map_files/USS_Almayer/USS_Almayer.dmm
@@ -2371,11 +2371,18 @@
},
/area/almayer/living/offices/flight)
"ahX" = (
-/obj/structure/machinery/light/small{
- dir = 4
+/obj/effect/decal/warning_stripes{
+ icon_state = "SE-out"
},
-/turf/open/floor/plating/plating_catwalk,
-/area/almayer/hull/upper_hull/u_f_s)
+/obj/effect/decal/warning_stripes{
+ icon_state = "NE-out";
+ pixel_y = 1
+ },
+/obj/structure/machinery/door/airlock/almayer/maint,
+/turf/open/floor/almayer{
+ icon_state = "test_floor4"
+ },
+/area/almayer/hull/upper_hull/u_a_s)
"ahY" = (
/obj/structure/machinery/light,
/obj/structure/surface/table/woodentable/fancy,
@@ -3482,6 +3489,15 @@
/obj/item/device/radio,
/turf/open/floor/wood/ship,
/area/almayer/living/commandbunks)
+"alv" = (
+/obj/structure/machinery/camera/autoname/almayer{
+ dir = 8;
+ name = "ship-grade camera"
+ },
+/turf/open/floor/almayer{
+ icon_state = "plate"
+ },
+/area/almayer/hull/upper_hull/u_f_p)
"alw" = (
/obj/structure/machinery/door/airlock/almayer/generic{
dir = 2;
@@ -5852,7 +5868,9 @@
},
/area/almayer/medical/morgue)
"asV" = (
-/obj/structure/machinery/floodlight/landing,
+/obj/structure/machinery/floodlight/landing{
+ name = "bolted floodlight"
+ },
/turf/open/floor/almayer{
icon_state = "mono"
},
@@ -6629,7 +6647,9 @@
},
/area/almayer/engineering/engineering_workshop/hangar)
"auJ" = (
-/obj/structure/machinery/floodlight/landing,
+/obj/structure/machinery/floodlight/landing{
+ name = "bolted floodlight"
+ },
/turf/open/floor/almayer{
icon_state = "mono"
},
@@ -7816,7 +7836,7 @@
pixel_y = 15
},
/obj/structure/machinery/light,
-/obj/structure/transmitter/rotary{
+/obj/structure/transmitter/rotary/no_dnd{
name = "Bravo Overwatch Telephone";
phone_category = "Command";
phone_id = "Bravo Overwatch"
@@ -8504,7 +8524,7 @@
pixel_y = -5;
req_one_access_txt = "1;4"
},
-/obj/structure/transmitter/rotary{
+/obj/structure/transmitter/rotary/no_dnd{
name = "Combat Information Center Telephone";
phone_category = "Command";
phone_id = "Combat Information Center";
@@ -8914,6 +8934,7 @@
/obj/structure/machinery/door/airlock/multi_tile/almayer/generic{
name = "\improper Port Railguns and Viewing Room"
},
+/obj/structure/disposalpipe/segment,
/turf/open/floor/almayer{
icon_state = "test_floor4"
},
@@ -8955,7 +8976,7 @@
/obj/structure/machinery/light{
dir = 1
},
-/obj/structure/transmitter/rotary{
+/obj/structure/transmitter/rotary/no_dnd{
name = "Charlie Overwatch Telephone";
phone_category = "Command";
phone_id = "Charlie Overwatch"
@@ -9107,9 +9128,7 @@
/obj/structure/sink{
pixel_y = 24
},
-/turf/open/floor/almayer{
- icon_state = "sterile"
- },
+/turf/open/floor/plating/plating_catwalk,
/area/almayer/hull/upper_hull/u_a_s)
"aCv" = (
/obj/structure/machinery/door/poddoor/shutters/almayer{
@@ -9212,9 +9231,7 @@
pixel_y = 16
},
/obj/item/tool/soap,
-/turf/open/floor/almayer{
- icon_state = "sterile"
- },
+/turf/open/floor/plating/plating_catwalk,
/area/almayer/hull/upper_hull/u_a_s)
"aDg" = (
/obj/structure/machinery/light/small{
@@ -12145,8 +12162,15 @@
},
/area/almayer/medical/upper_medical)
"aQA" = (
+/obj/effect/decal/warning_stripes{
+ icon_state = "N";
+ pixel_y = 1
+ },
+/obj/effect/decal/warning_stripes{
+ icon_state = "S"
+ },
/turf/open/floor/almayer{
- icon_state = "sterile"
+ icon_state = "dark_sterile"
},
/area/almayer/hull/upper_hull/u_a_s)
"aQF" = (
@@ -12274,8 +12298,15 @@
/obj/structure/mirror{
pixel_x = 28
},
+/obj/effect/decal/warning_stripes{
+ icon_state = "N";
+ pixel_y = 1
+ },
+/obj/effect/decal/warning_stripes{
+ icon_state = "S"
+ },
/turf/open/floor/almayer{
- icon_state = "sterile"
+ icon_state = "dark_sterile"
},
/area/almayer/hull/upper_hull/u_a_s)
"aRo" = (
@@ -16997,9 +17028,7 @@
/obj/structure/toilet{
dir = 1
},
-/turf/open/floor/almayer{
- icon_state = "sterile"
- },
+/turf/open/floor/plating/plating_catwalk,
/area/almayer/hull/upper_hull/u_a_s)
"bph" = (
/obj/structure/bed/chair/comfy/orange,
@@ -17462,9 +17491,7 @@
/area/almayer/living/bridgebunks)
"brT" = (
/obj/structure/machinery/light,
-/turf/open/floor/almayer{
- icon_state = "sterile"
- },
+/turf/open/floor/plating/plating_catwalk,
/area/almayer/hull/upper_hull/u_a_s)
"brW" = (
/obj/structure/disposalpipe/segment,
@@ -17516,11 +17543,11 @@
/turf/open/floor/wood/ship,
/area/almayer/command/corporateliason)
"bsf" = (
-/obj/structure/largecrate/random,
/obj/structure/machinery/camera/autoname/almayer{
dir = 8;
name = "ship-grade camera"
},
+/obj/structure/largecrate/random,
/turf/open/floor/almayer{
icon_state = "plate"
},
@@ -20971,7 +20998,7 @@
/obj/structure/machinery/door/airlock/almayer/generic{
access_modified = 1;
name = "Storage";
- req_one_access = "2;21"
+ req_one_access_txt = "19;21"
},
/turf/open/floor/almayer{
icon_state = "plate"
@@ -24084,6 +24111,13 @@
icon_state = "blue"
},
/area/almayer/squads/delta)
+"bVr" = (
+/obj/structure/pipes/standard/simple/hidden/supply{
+ dir = 1
+ },
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/plating/plating_catwalk,
+/area/almayer/hull/upper_hull/u_f_p)
"bVt" = (
/obj/structure/machinery/door_control{
id = "laddersoutheast";
@@ -32523,7 +32557,7 @@
/turf/open/floor/almayer{
icon_state = "plate"
},
-/area/almayer/living/tankerbunks)
+/area/almayer/hull/lower_hull/l_f_p)
"eim" = (
/obj/structure/pipes/vents/pump{
dir = 1
@@ -32708,6 +32742,7 @@
dir = 8
},
/obj/effect/decal/cleanable/dirt,
+/obj/structure/disposalpipe/segment,
/turf/open/floor/almayer,
/area/almayer/shipboard/brig/cic_hallway)
"elq" = (
@@ -33962,8 +33997,8 @@
pixel_y = -32
},
/obj/structure/sign/safety/rewire{
- pixel_y = -32;
- pixel_x = 14
+ pixel_x = 14;
+ pixel_y = -32
},
/turf/open/floor/almayer{
icon_state = "mono"
@@ -34204,7 +34239,7 @@
pixel_x = -17;
pixel_y = -17
},
-/obj/structure/transmitter/rotary{
+/obj/structure/transmitter/rotary/no_dnd{
name = "Delta Overwatch Telephone";
phone_category = "Command";
phone_id = "Delta Overwatch"
@@ -35034,7 +35069,7 @@
access_modified = 1;
dir = 2;
name = "\improper Requisitions Break Room";
- req_one_access = "19;21"
+ req_one_access_txt = "19;21"
},
/obj/structure/pipes/standard/simple/hidden/supply{
dir = 4
@@ -35563,15 +35598,13 @@
},
/area/almayer/living/starboard_garden)
"fwF" = (
-/obj/structure/largecrate/random/case/double,
-/obj/structure/machinery/camera/autoname/almayer{
- dir = 8;
- name = "ship-grade camera"
+/obj/structure/machinery/light/small{
+ dir = 4
},
/turf/open/floor/almayer{
icon_state = "plate"
},
-/area/almayer/hull/upper_hull/u_f_p)
+/area/almayer/hull/upper_hull/u_f_s)
"fwY" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -36526,6 +36559,7 @@
/obj/structure/pipes/standard/manifold/hidden/supply{
dir = 8
},
+/obj/structure/disposalpipe/segment,
/turf/open/floor/almayer{
icon_state = "plate"
},
@@ -37365,11 +37399,11 @@
"gjL" = (
/obj/structure/surface/table/almayer,
/obj/structure/machinery/computer/crew/alt,
-/obj/structure/transmitter/rotary{
+/obj/structure/transmitter/rotary/no_dnd{
name = "Brig Cells Telephone";
phone_category = "Almayer";
phone_id = "Brig Cells";
- pixel_x = 15
+ pixel_x = 15;
},
/turf/open/floor/almayer,
/area/almayer/shipboard/brig/processing)
@@ -38377,7 +38411,7 @@
pixel_x = -17;
pixel_y = 16
},
-/obj/structure/transmitter/rotary{
+/obj/structure/transmitter/rotary/no_dnd{
name = "Alpha Overwatch Telephone";
phone_category = "Command";
phone_id = "Alpha Overwatch"
@@ -43554,12 +43588,14 @@
},
/area/almayer/hull/lower_hull/l_f_p)
"iVY" = (
-/obj/effect/decal/hefa_cult_decals/d32,
-/turf/open/floor/almayer{
- dir = 9;
- icon_state = "orange"
+/obj/structure/pipes/standard/manifold/hidden/supply{
+ dir = 8
},
-/area/almayer/engineering/upper_engineering/starboard)
+/obj/structure/disposalpipe/junction{
+ dir = 1
+ },
+/turf/open/floor/plating/plating_catwalk,
+/area/almayer/shipboard/brig/cic_hallway)
"iVZ" = (
/obj/structure/surface/table/woodentable/fancy,
/obj/item/folder/black,
@@ -49266,7 +49302,9 @@
},
/area/almayer/living/port_emb)
"lqZ" = (
-/obj/structure/machinery/floodlight/landing,
+/obj/structure/machinery/floodlight/landing{
+ name = "bolted floodlight"
+ },
/turf/open/floor/almayer{
icon_state = "mono"
},
@@ -52574,7 +52612,9 @@
},
/area/almayer/hallways/stern_hallway)
"mMu" = (
-/obj/structure/machinery/floodlight/landing,
+/obj/structure/machinery/floodlight/landing{
+ name = "bolted floodlight"
+ },
/turf/open/floor/almayer{
icon_state = "mono"
},
@@ -55705,6 +55745,16 @@
icon_state = "dark_sterile"
},
/area/almayer/engineering/laundry)
+"odM" = (
+/obj/structure/pipes/standard/simple/hidden/supply{
+ dir = 1
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 8;
+ icon_state = "pipe-c"
+ },
+/turf/open/floor/plating/plating_catwalk,
+/area/almayer/shipboard/brig/cic_hallway)
"odN" = (
/obj/structure/window/framed/almayer,
/obj/structure/machinery/door/firedoor/border_only/almayer,
@@ -57115,6 +57165,7 @@
"oIm" = (
/obj/structure/prop/server_equipment/broken,
/turf/open/floor/almayer{
+ dir = 1;
icon_state = "orange"
},
/area/almayer/engineering/upper_engineering/starboard)
@@ -59305,9 +59356,9 @@
},
/area/almayer/medical/lower_medical_medbay)
"pLv" = (
-/obj/structure/device/broken_moog,
/obj/effect/decal/cleanable/blood/splatter,
/turf/open/floor/almayer{
+ dir = 1;
icon_state = "orange"
},
/area/almayer/engineering/upper_engineering/starboard)
@@ -60172,8 +60223,8 @@
pixel_y = 32
},
/obj/structure/sign/safety/rewire{
- pixel_y = 32;
- pixel_x = 14
+ pixel_x = 14;
+ pixel_y = 32
},
/turf/open/floor/almayer{
icon_state = "mono"
@@ -63495,6 +63546,7 @@
dir = 1
},
/obj/effect/decal/cleanable/dirt,
+/obj/structure/disposalpipe/segment,
/turf/open/floor/almayer,
/area/almayer/shipboard/brig/cic_hallway)
"rzN" = (
@@ -64474,11 +64526,11 @@
/turf/open/floor/plating/plating_catwalk,
/area/almayer/hull/upper_hull/u_f_s)
"rTY" = (
-/obj/structure/transmitter{
+/obj/structure/transmitter/no_dnd{
name = "Requisition Telephone";
phone_category = "Almayer";
phone_id = "Requisition";
- pixel_y = 30
+ pixel_y = 30;
},
/turf/open/floor/almayer{
dir = 5;
@@ -68673,7 +68725,7 @@
access_modified = 1;
dir = 1;
name = "Storage";
- req_one_access = "2;21"
+ req_one_access_txt = "19;21"
},
/turf/open/floor/almayer{
icon_state = "test_floor4"
@@ -75679,11 +75731,15 @@
},
/area/almayer/command/airoom)
"wyK" = (
-/obj/structure/pipes/standard/simple/hidden/supply,
+/obj/structure/disposalpipe/segment{
+ dir = 4;
+ icon_state = "pipe-c"
+ },
/turf/open/floor/almayer{
- icon_state = "orangecorner"
+ dir = 1;
+ icon_state = "silvercorner"
},
-/area/almayer/hallways/stern_hallway)
+/area/almayer/shipboard/brig/cic_hallway)
"wyO" = (
/obj/structure/largecrate/random/barrel/red,
/obj/structure/prop/invuln/overhead_pipe{
@@ -94536,7 +94592,7 @@ bdH
aad
aag
pCi
-nfI
+wcn
rPC
cQv
cQv
@@ -94739,8 +94795,8 @@ aaf
aag
aag
pCi
-bsf
-ahX
+hKi
+wcn
aFN
wcn
cXZ
@@ -94777,7 +94833,7 @@ kIV
hUc
wNU
mnm
-fwF
+sIk
xEF
aag
aag
@@ -94942,8 +94998,8 @@ adG
adG
adG
adG
-rPC
-rPC
+bsf
+fwF
dav
rPC
rPC
@@ -94980,7 +95036,7 @@ mnm
kIV
wNU
kIV
-kIV
+alv
tuA
tuA
tuA
@@ -96595,13 +96651,13 @@ vGA
uwN
pYX
xuZ
-jnD
+wyK
elh
rzM
aBN
fQS
-tJo
-tJo
+bVr
+bVr
bpd
bqT
vZv
@@ -96797,8 +96853,8 @@ awz
vSN
mPj
rWs
-mIy
-eEw
+iVY
+odM
lPC
mgy
wWT
@@ -104095,7 +104151,7 @@ yjM
qbO
aqw
hnI
-ayT
+bYe
amO
wZM
aPm
@@ -104704,7 +104760,7 @@ aiX
aKG
amb
aiX
-bYe
+ayT
amO
avj
qFl
@@ -105916,10 +105972,10 @@ bbL
bbL
kij
bbL
-bbL
-bbL
-yfv
bYe
+bYe
+yfv
+bbL
aWl
bbL
bbL
@@ -106348,8 +106404,8 @@ baw
baw
baw
mnA
-aJU
-aJU
+baw
+baw
qVM
iBt
iBt
@@ -106950,7 +107006,7 @@ coa
aoe
ahr
akU
-ajC
+bYe
xCX
csz
vGk
@@ -118519,7 +118575,7 @@ dxv
cnS
cnv
ajt
-anf
+bYe
xCX
csz
csz
@@ -123188,7 +123244,7 @@ fDG
alL
alG
aYD
-wyK
+aTS
qgK
tEB
uBM
@@ -125995,7 +126051,7 @@ pVZ
xlX
psm
psm
-jFX
+ahX
psm
psm
fnZ
@@ -133918,7 +133974,7 @@ aaa
aaa
uMc
iKc
-iVY
+uiG
cMN
trB
nVX
diff --git a/maps/templates/clf_ert_station.dmm b/maps/templates/clf_ert_station.dmm
index 9d6ccd92aaa0..7347be914da2 100644
--- a/maps/templates/clf_ert_station.dmm
+++ b/maps/templates/clf_ert_station.dmm
@@ -1658,7 +1658,7 @@
name = "CLF Outpost";
phone_category = "CLF";
phone_id = "CLF Outpost";
- callable = 0;
+ do_not_disturb = 2;
pixel_y = 10
},
/turf/open/floor/wood,
diff --git a/maps/templates/upp_ert_station.dmm b/maps/templates/upp_ert_station.dmm
index d78a900f2c59..ae2a8ad40c47 100644
--- a/maps/templates/upp_ert_station.dmm
+++ b/maps/templates/upp_ert_station.dmm
@@ -880,7 +880,7 @@
name = "UPP Station";
phone_category = "UPP";
phone_id = "UPP Station";
- callable = 0
+ do_not_disturb = 2
},
/turf/open/floor/strata{
icon_state = "floor2"
diff --git a/maps/templates/weyland_ert_station.dmm b/maps/templates/weyland_ert_station.dmm
index 414eee0bcbc7..1937aa6a61a9 100644
--- a/maps/templates/weyland_ert_station.dmm
+++ b/maps/templates/weyland_ert_station.dmm
@@ -2795,7 +2795,7 @@
"Js" = (
/obj/structure/surface/table/reinforced/black,
/obj/structure/transmitter/rotary{
- callable = 0;
+ do_not_disturb = 2;
name = "Weyland-Yutani Station CiC";
phone_category = "W-Y";
phone_id = "W-Y Station CiC"
@@ -3588,7 +3588,7 @@
"SE" = (
/obj/structure/surface/table/woodentable/fancy,
/obj/structure/transmitter/rotary{
- callable = 0;
+ do_not_disturb = 2;
name = "Weyland-Yutani Station Meeting Room";
phone_category = "W-Y";
phone_id = "W-Y Station Meeting Room"
diff --git a/sound/piano/A#1.ogg b/sound/piano/A#1.ogg
deleted file mode 100644
index ae41c0a189b1..000000000000
Binary files a/sound/piano/A#1.ogg and /dev/null differ
diff --git a/sound/piano/A#2.ogg b/sound/piano/A#2.ogg
deleted file mode 100644
index c35ce012b3ee..000000000000
Binary files a/sound/piano/A#2.ogg and /dev/null differ
diff --git a/sound/piano/A#3.ogg b/sound/piano/A#3.ogg
deleted file mode 100644
index 9ea8795bcf31..000000000000
Binary files a/sound/piano/A#3.ogg and /dev/null differ
diff --git a/sound/piano/A#4.ogg b/sound/piano/A#4.ogg
deleted file mode 100644
index aeb41ce1a722..000000000000
Binary files a/sound/piano/A#4.ogg and /dev/null differ
diff --git a/sound/piano/A#5.ogg b/sound/piano/A#5.ogg
deleted file mode 100644
index eca721384308..000000000000
Binary files a/sound/piano/A#5.ogg and /dev/null differ
diff --git a/sound/piano/A#6.ogg b/sound/piano/A#6.ogg
deleted file mode 100644
index 0ae9e89b0c28..000000000000
Binary files a/sound/piano/A#6.ogg and /dev/null differ
diff --git a/sound/piano/A#7.ogg b/sound/piano/A#7.ogg
deleted file mode 100644
index e1b469da8164..000000000000
Binary files a/sound/piano/A#7.ogg and /dev/null differ
diff --git a/sound/piano/A#8.ogg b/sound/piano/A#8.ogg
deleted file mode 100644
index 83bd263e9804..000000000000
Binary files a/sound/piano/A#8.ogg and /dev/null differ
diff --git a/sound/piano/Ab1.ogg b/sound/piano/Ab1.ogg
deleted file mode 100644
index 1f67015756c2..000000000000
Binary files a/sound/piano/Ab1.ogg and /dev/null differ
diff --git a/sound/piano/Ab2.ogg b/sound/piano/Ab2.ogg
deleted file mode 100644
index 985bfd608212..000000000000
Binary files a/sound/piano/Ab2.ogg and /dev/null differ
diff --git a/sound/piano/Ab3.ogg b/sound/piano/Ab3.ogg
deleted file mode 100644
index 5dbcb2d7c634..000000000000
Binary files a/sound/piano/Ab3.ogg and /dev/null differ
diff --git a/sound/piano/Ab4.ogg b/sound/piano/Ab4.ogg
deleted file mode 100644
index 01add48a44ad..000000000000
Binary files a/sound/piano/Ab4.ogg and /dev/null differ
diff --git a/sound/piano/Ab5.ogg b/sound/piano/Ab5.ogg
deleted file mode 100644
index 6fbe70844dc3..000000000000
Binary files a/sound/piano/Ab5.ogg and /dev/null differ
diff --git a/sound/piano/Ab6.ogg b/sound/piano/Ab6.ogg
deleted file mode 100644
index 82b5a84e6824..000000000000
Binary files a/sound/piano/Ab6.ogg and /dev/null differ
diff --git a/sound/piano/Ab7.ogg b/sound/piano/Ab7.ogg
deleted file mode 100644
index 391b1c1185af..000000000000
Binary files a/sound/piano/Ab7.ogg and /dev/null differ
diff --git a/sound/piano/Ab8.ogg b/sound/piano/Ab8.ogg
deleted file mode 100644
index aa83b7aaab90..000000000000
Binary files a/sound/piano/Ab8.ogg and /dev/null differ
diff --git a/sound/piano/An1.ogg b/sound/piano/An1.ogg
deleted file mode 100644
index 4a87d59adac5..000000000000
Binary files a/sound/piano/An1.ogg and /dev/null differ
diff --git a/sound/piano/An2.ogg b/sound/piano/An2.ogg
deleted file mode 100644
index f5327d0d7cf1..000000000000
Binary files a/sound/piano/An2.ogg and /dev/null differ
diff --git a/sound/piano/An3.ogg b/sound/piano/An3.ogg
deleted file mode 100644
index 7c3e8a031e80..000000000000
Binary files a/sound/piano/An3.ogg and /dev/null differ
diff --git a/sound/piano/An4.ogg b/sound/piano/An4.ogg
deleted file mode 100644
index 2ba84a58a6e3..000000000000
Binary files a/sound/piano/An4.ogg and /dev/null differ
diff --git a/sound/piano/An5.ogg b/sound/piano/An5.ogg
deleted file mode 100644
index 5e04fc8c7fbc..000000000000
Binary files a/sound/piano/An5.ogg and /dev/null differ
diff --git a/sound/piano/An6.ogg b/sound/piano/An6.ogg
deleted file mode 100644
index 48b639d77f2d..000000000000
Binary files a/sound/piano/An6.ogg and /dev/null differ
diff --git a/sound/piano/An7.ogg b/sound/piano/An7.ogg
deleted file mode 100644
index 5d93800f28a6..000000000000
Binary files a/sound/piano/An7.ogg and /dev/null differ
diff --git a/sound/piano/An8.ogg b/sound/piano/An8.ogg
deleted file mode 100644
index e01acd4e7e13..000000000000
Binary files a/sound/piano/An8.ogg and /dev/null differ
diff --git a/sound/piano/B#1.ogg b/sound/piano/B#1.ogg
deleted file mode 100644
index bcdd2bfd4a1c..000000000000
Binary files a/sound/piano/B#1.ogg and /dev/null differ
diff --git a/sound/piano/B#2.ogg b/sound/piano/B#2.ogg
deleted file mode 100644
index 0effb061b460..000000000000
Binary files a/sound/piano/B#2.ogg and /dev/null differ
diff --git a/sound/piano/B#3.ogg b/sound/piano/B#3.ogg
deleted file mode 100644
index 64f390516fc3..000000000000
Binary files a/sound/piano/B#3.ogg and /dev/null differ
diff --git a/sound/piano/B#4.ogg b/sound/piano/B#4.ogg
deleted file mode 100644
index a423bbb83d21..000000000000
Binary files a/sound/piano/B#4.ogg and /dev/null differ
diff --git a/sound/piano/B#5.ogg b/sound/piano/B#5.ogg
deleted file mode 100644
index 9a63a927fd08..000000000000
Binary files a/sound/piano/B#5.ogg and /dev/null differ
diff --git a/sound/piano/B#6.ogg b/sound/piano/B#6.ogg
deleted file mode 100644
index be35faabf563..000000000000
Binary files a/sound/piano/B#6.ogg and /dev/null differ
diff --git a/sound/piano/B#7.ogg b/sound/piano/B#7.ogg
deleted file mode 100644
index cbb2ad3bc152..000000000000
Binary files a/sound/piano/B#7.ogg and /dev/null differ
diff --git a/sound/piano/B#8.ogg b/sound/piano/B#8.ogg
deleted file mode 100644
index 5297b755a356..000000000000
Binary files a/sound/piano/B#8.ogg and /dev/null differ
diff --git a/sound/piano/Bb1.ogg b/sound/piano/Bb1.ogg
deleted file mode 100644
index 617f36454115..000000000000
Binary files a/sound/piano/Bb1.ogg and /dev/null differ
diff --git a/sound/piano/Bb2.ogg b/sound/piano/Bb2.ogg
deleted file mode 100644
index eb4215daa4c1..000000000000
Binary files a/sound/piano/Bb2.ogg and /dev/null differ
diff --git a/sound/piano/Bb3.ogg b/sound/piano/Bb3.ogg
deleted file mode 100644
index 35f7eb53d47c..000000000000
Binary files a/sound/piano/Bb3.ogg and /dev/null differ
diff --git a/sound/piano/Bb4.ogg b/sound/piano/Bb4.ogg
deleted file mode 100644
index 1eef7b921392..000000000000
Binary files a/sound/piano/Bb4.ogg and /dev/null differ
diff --git a/sound/piano/Bb5.ogg b/sound/piano/Bb5.ogg
deleted file mode 100644
index 118867fd1468..000000000000
Binary files a/sound/piano/Bb5.ogg and /dev/null differ
diff --git a/sound/piano/Bb6.ogg b/sound/piano/Bb6.ogg
deleted file mode 100644
index 700b2c5abd7f..000000000000
Binary files a/sound/piano/Bb6.ogg and /dev/null differ
diff --git a/sound/piano/Bb7.ogg b/sound/piano/Bb7.ogg
deleted file mode 100644
index c50955bf01c3..000000000000
Binary files a/sound/piano/Bb7.ogg and /dev/null differ
diff --git a/sound/piano/Bb8.ogg b/sound/piano/Bb8.ogg
deleted file mode 100644
index b076c4b4e2be..000000000000
Binary files a/sound/piano/Bb8.ogg and /dev/null differ
diff --git a/sound/piano/Bn1.ogg b/sound/piano/Bn1.ogg
deleted file mode 100644
index 256534881c18..000000000000
Binary files a/sound/piano/Bn1.ogg and /dev/null differ
diff --git a/sound/piano/Bn2.ogg b/sound/piano/Bn2.ogg
deleted file mode 100644
index 8ed87aa49e77..000000000000
Binary files a/sound/piano/Bn2.ogg and /dev/null differ
diff --git a/sound/piano/Bn3.ogg b/sound/piano/Bn3.ogg
deleted file mode 100644
index 19788aad716c..000000000000
Binary files a/sound/piano/Bn3.ogg and /dev/null differ
diff --git a/sound/piano/Bn4.ogg b/sound/piano/Bn4.ogg
deleted file mode 100644
index 773f5b3bd3bf..000000000000
Binary files a/sound/piano/Bn4.ogg and /dev/null differ
diff --git a/sound/piano/Bn5.ogg b/sound/piano/Bn5.ogg
deleted file mode 100644
index 3297fab1d597..000000000000
Binary files a/sound/piano/Bn5.ogg and /dev/null differ
diff --git a/sound/piano/Bn6.ogg b/sound/piano/Bn6.ogg
deleted file mode 100644
index 35a39b20f66a..000000000000
Binary files a/sound/piano/Bn6.ogg and /dev/null differ
diff --git a/sound/piano/Bn7.ogg b/sound/piano/Bn7.ogg
deleted file mode 100644
index e7a8ba403430..000000000000
Binary files a/sound/piano/Bn7.ogg and /dev/null differ
diff --git a/sound/piano/Bn8.ogg b/sound/piano/Bn8.ogg
deleted file mode 100644
index 2c821e818539..000000000000
Binary files a/sound/piano/Bn8.ogg and /dev/null differ
diff --git a/sound/piano/C#1.ogg b/sound/piano/C#1.ogg
deleted file mode 100644
index be3d7e3e3081..000000000000
Binary files a/sound/piano/C#1.ogg and /dev/null differ
diff --git a/sound/piano/C#2.ogg b/sound/piano/C#2.ogg
deleted file mode 100644
index cefe3a745dc0..000000000000
Binary files a/sound/piano/C#2.ogg and /dev/null differ
diff --git a/sound/piano/C#3.ogg b/sound/piano/C#3.ogg
deleted file mode 100644
index dc3d0878475f..000000000000
Binary files a/sound/piano/C#3.ogg and /dev/null differ
diff --git a/sound/piano/C#4.ogg b/sound/piano/C#4.ogg
deleted file mode 100644
index c31a44bdf6dd..000000000000
Binary files a/sound/piano/C#4.ogg and /dev/null differ
diff --git a/sound/piano/C#5.ogg b/sound/piano/C#5.ogg
deleted file mode 100644
index c5d10d13764d..000000000000
Binary files a/sound/piano/C#5.ogg and /dev/null differ
diff --git a/sound/piano/C#6.ogg b/sound/piano/C#6.ogg
deleted file mode 100644
index a084a04de146..000000000000
Binary files a/sound/piano/C#6.ogg and /dev/null differ
diff --git a/sound/piano/C#7.ogg b/sound/piano/C#7.ogg
deleted file mode 100644
index 6da255f5aea0..000000000000
Binary files a/sound/piano/C#7.ogg and /dev/null differ
diff --git a/sound/piano/C#8.ogg b/sound/piano/C#8.ogg
deleted file mode 100644
index b4d4cbe41579..000000000000
Binary files a/sound/piano/C#8.ogg and /dev/null differ
diff --git a/sound/piano/Cb2.ogg b/sound/piano/Cb2.ogg
deleted file mode 100644
index cefff94c1465..000000000000
Binary files a/sound/piano/Cb2.ogg and /dev/null differ
diff --git a/sound/piano/Cb3.ogg b/sound/piano/Cb3.ogg
deleted file mode 100644
index 0425228ee726..000000000000
Binary files a/sound/piano/Cb3.ogg and /dev/null differ
diff --git a/sound/piano/Cb4.ogg b/sound/piano/Cb4.ogg
deleted file mode 100644
index e9c8ad22e94b..000000000000
Binary files a/sound/piano/Cb4.ogg and /dev/null differ
diff --git a/sound/piano/Cb5.ogg b/sound/piano/Cb5.ogg
deleted file mode 100644
index 611c8ef9e42e..000000000000
Binary files a/sound/piano/Cb5.ogg and /dev/null differ
diff --git a/sound/piano/Cb6.ogg b/sound/piano/Cb6.ogg
deleted file mode 100644
index 3fe79c61ef92..000000000000
Binary files a/sound/piano/Cb6.ogg and /dev/null differ
diff --git a/sound/piano/Cb7.ogg b/sound/piano/Cb7.ogg
deleted file mode 100644
index ff6a3fb00726..000000000000
Binary files a/sound/piano/Cb7.ogg and /dev/null differ
diff --git a/sound/piano/Cb8.ogg b/sound/piano/Cb8.ogg
deleted file mode 100644
index 8ff3d57fe907..000000000000
Binary files a/sound/piano/Cb8.ogg and /dev/null differ
diff --git a/sound/piano/Cb9.ogg b/sound/piano/Cb9.ogg
deleted file mode 100644
index fa2a3de7a777..000000000000
Binary files a/sound/piano/Cb9.ogg and /dev/null differ
diff --git a/sound/piano/Cn1.ogg b/sound/piano/Cn1.ogg
deleted file mode 100644
index 86fba1381012..000000000000
Binary files a/sound/piano/Cn1.ogg and /dev/null differ
diff --git a/sound/piano/Cn2.ogg b/sound/piano/Cn2.ogg
deleted file mode 100644
index e069259e8507..000000000000
Binary files a/sound/piano/Cn2.ogg and /dev/null differ
diff --git a/sound/piano/Cn3.ogg b/sound/piano/Cn3.ogg
deleted file mode 100644
index 01f5bcde7c5d..000000000000
Binary files a/sound/piano/Cn3.ogg and /dev/null differ
diff --git a/sound/piano/Cn4.ogg b/sound/piano/Cn4.ogg
deleted file mode 100644
index 2545ccb996b9..000000000000
Binary files a/sound/piano/Cn4.ogg and /dev/null differ
diff --git a/sound/piano/Cn5.ogg b/sound/piano/Cn5.ogg
deleted file mode 100644
index 601fd5340b37..000000000000
Binary files a/sound/piano/Cn5.ogg and /dev/null differ
diff --git a/sound/piano/Cn6.ogg b/sound/piano/Cn6.ogg
deleted file mode 100644
index f89c2c78f3af..000000000000
Binary files a/sound/piano/Cn6.ogg and /dev/null differ
diff --git a/sound/piano/Cn7.ogg b/sound/piano/Cn7.ogg
deleted file mode 100644
index 09723616a74c..000000000000
Binary files a/sound/piano/Cn7.ogg and /dev/null differ
diff --git a/sound/piano/Cn8.ogg b/sound/piano/Cn8.ogg
deleted file mode 100644
index 4c7e2b44c6fc..000000000000
Binary files a/sound/piano/Cn8.ogg and /dev/null differ
diff --git a/sound/piano/Cn9.ogg b/sound/piano/Cn9.ogg
deleted file mode 100644
index 2b6812d62b24..000000000000
Binary files a/sound/piano/Cn9.ogg and /dev/null differ
diff --git a/sound/piano/D#1.ogg b/sound/piano/D#1.ogg
deleted file mode 100644
index d772320b150d..000000000000
Binary files a/sound/piano/D#1.ogg and /dev/null differ
diff --git a/sound/piano/D#2.ogg b/sound/piano/D#2.ogg
deleted file mode 100644
index ae9d529e907c..000000000000
Binary files a/sound/piano/D#2.ogg and /dev/null differ
diff --git a/sound/piano/D#3.ogg b/sound/piano/D#3.ogg
deleted file mode 100644
index 63fc4fdd5953..000000000000
Binary files a/sound/piano/D#3.ogg and /dev/null differ
diff --git a/sound/piano/D#4.ogg b/sound/piano/D#4.ogg
deleted file mode 100644
index 39cf1adbca97..000000000000
Binary files a/sound/piano/D#4.ogg and /dev/null differ
diff --git a/sound/piano/D#5.ogg b/sound/piano/D#5.ogg
deleted file mode 100644
index 071a57544aee..000000000000
Binary files a/sound/piano/D#5.ogg and /dev/null differ
diff --git a/sound/piano/D#6.ogg b/sound/piano/D#6.ogg
deleted file mode 100644
index 7ee1bd4bfa07..000000000000
Binary files a/sound/piano/D#6.ogg and /dev/null differ
diff --git a/sound/piano/D#7.ogg b/sound/piano/D#7.ogg
deleted file mode 100644
index 19f72532dde6..000000000000
Binary files a/sound/piano/D#7.ogg and /dev/null differ
diff --git a/sound/piano/D#8.ogg b/sound/piano/D#8.ogg
deleted file mode 100644
index ee87d875bd40..000000000000
Binary files a/sound/piano/D#8.ogg and /dev/null differ
diff --git a/sound/piano/Db1.ogg b/sound/piano/Db1.ogg
deleted file mode 100644
index 9166b7335552..000000000000
Binary files a/sound/piano/Db1.ogg and /dev/null differ
diff --git a/sound/piano/Db2.ogg b/sound/piano/Db2.ogg
deleted file mode 100644
index 623acd0ec54f..000000000000
Binary files a/sound/piano/Db2.ogg and /dev/null differ
diff --git a/sound/piano/Db3.ogg b/sound/piano/Db3.ogg
deleted file mode 100644
index 5c8943b4da9f..000000000000
Binary files a/sound/piano/Db3.ogg and /dev/null differ
diff --git a/sound/piano/Db4.ogg b/sound/piano/Db4.ogg
deleted file mode 100644
index 2deb5b8d9173..000000000000
Binary files a/sound/piano/Db4.ogg and /dev/null differ
diff --git a/sound/piano/Db5.ogg b/sound/piano/Db5.ogg
deleted file mode 100644
index 9c77ee37a7d8..000000000000
Binary files a/sound/piano/Db5.ogg and /dev/null differ
diff --git a/sound/piano/Db6.ogg b/sound/piano/Db6.ogg
deleted file mode 100644
index 49e1e04dff84..000000000000
Binary files a/sound/piano/Db6.ogg and /dev/null differ
diff --git a/sound/piano/Db7.ogg b/sound/piano/Db7.ogg
deleted file mode 100644
index b53fd2f27e03..000000000000
Binary files a/sound/piano/Db7.ogg and /dev/null differ
diff --git a/sound/piano/Db8.ogg b/sound/piano/Db8.ogg
deleted file mode 100644
index af6cfdffad62..000000000000
Binary files a/sound/piano/Db8.ogg and /dev/null differ
diff --git a/sound/piano/Dn1.ogg b/sound/piano/Dn1.ogg
deleted file mode 100644
index c6dd20cb65b4..000000000000
Binary files a/sound/piano/Dn1.ogg and /dev/null differ
diff --git a/sound/piano/Dn2.ogg b/sound/piano/Dn2.ogg
deleted file mode 100644
index 0783087dc658..000000000000
Binary files a/sound/piano/Dn2.ogg and /dev/null differ
diff --git a/sound/piano/Dn3.ogg b/sound/piano/Dn3.ogg
deleted file mode 100644
index bf7bd97ad137..000000000000
Binary files a/sound/piano/Dn3.ogg and /dev/null differ
diff --git a/sound/piano/Dn4.ogg b/sound/piano/Dn4.ogg
deleted file mode 100644
index e35a6af447e8..000000000000
Binary files a/sound/piano/Dn4.ogg and /dev/null differ
diff --git a/sound/piano/Dn5.ogg b/sound/piano/Dn5.ogg
deleted file mode 100644
index 7e355266c0f5..000000000000
Binary files a/sound/piano/Dn5.ogg and /dev/null differ
diff --git a/sound/piano/Dn6.ogg b/sound/piano/Dn6.ogg
deleted file mode 100644
index 5da94c15adf2..000000000000
Binary files a/sound/piano/Dn6.ogg and /dev/null differ
diff --git a/sound/piano/Dn7.ogg b/sound/piano/Dn7.ogg
deleted file mode 100644
index ac43398ece62..000000000000
Binary files a/sound/piano/Dn7.ogg and /dev/null differ
diff --git a/sound/piano/Dn8.ogg b/sound/piano/Dn8.ogg
deleted file mode 100644
index 534e51e72013..000000000000
Binary files a/sound/piano/Dn8.ogg and /dev/null differ
diff --git a/sound/piano/E#1.ogg b/sound/piano/E#1.ogg
deleted file mode 100644
index 46fd3d50c91b..000000000000
Binary files a/sound/piano/E#1.ogg and /dev/null differ
diff --git a/sound/piano/E#2.ogg b/sound/piano/E#2.ogg
deleted file mode 100644
index eece0448208d..000000000000
Binary files a/sound/piano/E#2.ogg and /dev/null differ
diff --git a/sound/piano/E#3.ogg b/sound/piano/E#3.ogg
deleted file mode 100644
index d5acee8dfa7f..000000000000
Binary files a/sound/piano/E#3.ogg and /dev/null differ
diff --git a/sound/piano/E#4.ogg b/sound/piano/E#4.ogg
deleted file mode 100644
index 3e75fccc91b9..000000000000
Binary files a/sound/piano/E#4.ogg and /dev/null differ
diff --git a/sound/piano/E#5.ogg b/sound/piano/E#5.ogg
deleted file mode 100644
index cc91527d0ea0..000000000000
Binary files a/sound/piano/E#5.ogg and /dev/null differ
diff --git a/sound/piano/E#6.ogg b/sound/piano/E#6.ogg
deleted file mode 100644
index 476edd68e22a..000000000000
Binary files a/sound/piano/E#6.ogg and /dev/null differ
diff --git a/sound/piano/E#7.ogg b/sound/piano/E#7.ogg
deleted file mode 100644
index 7c77c6971ee2..000000000000
Binary files a/sound/piano/E#7.ogg and /dev/null differ
diff --git a/sound/piano/E#8.ogg b/sound/piano/E#8.ogg
deleted file mode 100644
index 61a55478dc95..000000000000
Binary files a/sound/piano/E#8.ogg and /dev/null differ
diff --git a/sound/piano/Eb1.ogg b/sound/piano/Eb1.ogg
deleted file mode 100644
index 745c448a4f1f..000000000000
Binary files a/sound/piano/Eb1.ogg and /dev/null differ
diff --git a/sound/piano/Eb2.ogg b/sound/piano/Eb2.ogg
deleted file mode 100644
index 85fc213e8214..000000000000
Binary files a/sound/piano/Eb2.ogg and /dev/null differ
diff --git a/sound/piano/Eb3.ogg b/sound/piano/Eb3.ogg
deleted file mode 100644
index 66c673310bb6..000000000000
Binary files a/sound/piano/Eb3.ogg and /dev/null differ
diff --git a/sound/piano/Eb4.ogg b/sound/piano/Eb4.ogg
deleted file mode 100644
index bff7248310b8..000000000000
Binary files a/sound/piano/Eb4.ogg and /dev/null differ
diff --git a/sound/piano/Eb5.ogg b/sound/piano/Eb5.ogg
deleted file mode 100644
index 8ecb263ee720..000000000000
Binary files a/sound/piano/Eb5.ogg and /dev/null differ
diff --git a/sound/piano/Eb6.ogg b/sound/piano/Eb6.ogg
deleted file mode 100644
index 29e62c7a16d8..000000000000
Binary files a/sound/piano/Eb6.ogg and /dev/null differ
diff --git a/sound/piano/Eb7.ogg b/sound/piano/Eb7.ogg
deleted file mode 100644
index 95e70c0b8cba..000000000000
Binary files a/sound/piano/Eb7.ogg and /dev/null differ
diff --git a/sound/piano/Eb8.ogg b/sound/piano/Eb8.ogg
deleted file mode 100644
index e421154b62e3..000000000000
Binary files a/sound/piano/Eb8.ogg and /dev/null differ
diff --git a/sound/piano/En1.ogg b/sound/piano/En1.ogg
deleted file mode 100644
index 32819af46ba5..000000000000
Binary files a/sound/piano/En1.ogg and /dev/null differ
diff --git a/sound/piano/En2.ogg b/sound/piano/En2.ogg
deleted file mode 100644
index f1931e091425..000000000000
Binary files a/sound/piano/En2.ogg and /dev/null differ
diff --git a/sound/piano/En3.ogg b/sound/piano/En3.ogg
deleted file mode 100644
index fd9d54a6d03f..000000000000
Binary files a/sound/piano/En3.ogg and /dev/null differ
diff --git a/sound/piano/En4.ogg b/sound/piano/En4.ogg
deleted file mode 100644
index 41dcf10ff57e..000000000000
Binary files a/sound/piano/En4.ogg and /dev/null differ
diff --git a/sound/piano/En5.ogg b/sound/piano/En5.ogg
deleted file mode 100644
index 571bb0768e56..000000000000
Binary files a/sound/piano/En5.ogg and /dev/null differ
diff --git a/sound/piano/En6.ogg b/sound/piano/En6.ogg
deleted file mode 100644
index 7dbf990b1864..000000000000
Binary files a/sound/piano/En6.ogg and /dev/null differ
diff --git a/sound/piano/En7.ogg b/sound/piano/En7.ogg
deleted file mode 100644
index 0793106be1f4..000000000000
Binary files a/sound/piano/En7.ogg and /dev/null differ
diff --git a/sound/piano/En8.ogg b/sound/piano/En8.ogg
deleted file mode 100644
index 2989d16d1ded..000000000000
Binary files a/sound/piano/En8.ogg and /dev/null differ
diff --git a/sound/piano/F#1.ogg b/sound/piano/F#1.ogg
deleted file mode 100644
index f646e20a3385..000000000000
Binary files a/sound/piano/F#1.ogg and /dev/null differ
diff --git a/sound/piano/F#2.ogg b/sound/piano/F#2.ogg
deleted file mode 100644
index 140c0ab01750..000000000000
Binary files a/sound/piano/F#2.ogg and /dev/null differ
diff --git a/sound/piano/F#3.ogg b/sound/piano/F#3.ogg
deleted file mode 100644
index 03f74deae5e7..000000000000
Binary files a/sound/piano/F#3.ogg and /dev/null differ
diff --git a/sound/piano/F#4.ogg b/sound/piano/F#4.ogg
deleted file mode 100644
index 8b6be4a8e83e..000000000000
Binary files a/sound/piano/F#4.ogg and /dev/null differ
diff --git a/sound/piano/F#5.ogg b/sound/piano/F#5.ogg
deleted file mode 100644
index 2ada429e53c6..000000000000
Binary files a/sound/piano/F#5.ogg and /dev/null differ
diff --git a/sound/piano/F#6.ogg b/sound/piano/F#6.ogg
deleted file mode 100644
index a3c41995a142..000000000000
Binary files a/sound/piano/F#6.ogg and /dev/null differ
diff --git a/sound/piano/F#7.ogg b/sound/piano/F#7.ogg
deleted file mode 100644
index 8c87e9c8b7bd..000000000000
Binary files a/sound/piano/F#7.ogg and /dev/null differ
diff --git a/sound/piano/F#8.ogg b/sound/piano/F#8.ogg
deleted file mode 100644
index 7a20d3cd3d4a..000000000000
Binary files a/sound/piano/F#8.ogg and /dev/null differ
diff --git a/sound/piano/Fb1.ogg b/sound/piano/Fb1.ogg
deleted file mode 100644
index ba3f5bde8ca0..000000000000
Binary files a/sound/piano/Fb1.ogg and /dev/null differ
diff --git a/sound/piano/Fb2.ogg b/sound/piano/Fb2.ogg
deleted file mode 100644
index d601261c9218..000000000000
Binary files a/sound/piano/Fb2.ogg and /dev/null differ
diff --git a/sound/piano/Fb3.ogg b/sound/piano/Fb3.ogg
deleted file mode 100644
index 0c67f09c6e71..000000000000
Binary files a/sound/piano/Fb3.ogg and /dev/null differ
diff --git a/sound/piano/Fb4.ogg b/sound/piano/Fb4.ogg
deleted file mode 100644
index 6b23e1dca8bc..000000000000
Binary files a/sound/piano/Fb4.ogg and /dev/null differ
diff --git a/sound/piano/Fb5.ogg b/sound/piano/Fb5.ogg
deleted file mode 100644
index 992fbef3c832..000000000000
Binary files a/sound/piano/Fb5.ogg and /dev/null differ
diff --git a/sound/piano/Fb6.ogg b/sound/piano/Fb6.ogg
deleted file mode 100644
index 622859f44d54..000000000000
Binary files a/sound/piano/Fb6.ogg and /dev/null differ
diff --git a/sound/piano/Fb7.ogg b/sound/piano/Fb7.ogg
deleted file mode 100644
index bb44482880ca..000000000000
Binary files a/sound/piano/Fb7.ogg and /dev/null differ
diff --git a/sound/piano/Fb8.ogg b/sound/piano/Fb8.ogg
deleted file mode 100644
index 940c92efafa5..000000000000
Binary files a/sound/piano/Fb8.ogg and /dev/null differ
diff --git a/sound/piano/Fn1.ogg b/sound/piano/Fn1.ogg
deleted file mode 100644
index 52a717014860..000000000000
Binary files a/sound/piano/Fn1.ogg and /dev/null differ
diff --git a/sound/piano/Fn2.ogg b/sound/piano/Fn2.ogg
deleted file mode 100644
index 28770a787229..000000000000
Binary files a/sound/piano/Fn2.ogg and /dev/null differ
diff --git a/sound/piano/Fn3.ogg b/sound/piano/Fn3.ogg
deleted file mode 100644
index 5db839ab9cbb..000000000000
Binary files a/sound/piano/Fn3.ogg and /dev/null differ
diff --git a/sound/piano/Fn4.ogg b/sound/piano/Fn4.ogg
deleted file mode 100644
index 5a4437102ae4..000000000000
Binary files a/sound/piano/Fn4.ogg and /dev/null differ
diff --git a/sound/piano/Fn5.ogg b/sound/piano/Fn5.ogg
deleted file mode 100644
index fb748454480c..000000000000
Binary files a/sound/piano/Fn5.ogg and /dev/null differ
diff --git a/sound/piano/Fn6.ogg b/sound/piano/Fn6.ogg
deleted file mode 100644
index 3e23b71b1ef5..000000000000
Binary files a/sound/piano/Fn6.ogg and /dev/null differ
diff --git a/sound/piano/Fn7.ogg b/sound/piano/Fn7.ogg
deleted file mode 100644
index d897ab7c3c8f..000000000000
Binary files a/sound/piano/Fn7.ogg and /dev/null differ
diff --git a/sound/piano/Fn8.ogg b/sound/piano/Fn8.ogg
deleted file mode 100644
index 3ebf0e9bbc49..000000000000
Binary files a/sound/piano/Fn8.ogg and /dev/null differ
diff --git a/sound/piano/G#1.ogg b/sound/piano/G#1.ogg
deleted file mode 100644
index 4b559e5583ac..000000000000
Binary files a/sound/piano/G#1.ogg and /dev/null differ
diff --git a/sound/piano/G#2.ogg b/sound/piano/G#2.ogg
deleted file mode 100644
index d70745db3e76..000000000000
Binary files a/sound/piano/G#2.ogg and /dev/null differ
diff --git a/sound/piano/G#3.ogg b/sound/piano/G#3.ogg
deleted file mode 100644
index cb69b23a17af..000000000000
Binary files a/sound/piano/G#3.ogg and /dev/null differ
diff --git a/sound/piano/G#4.ogg b/sound/piano/G#4.ogg
deleted file mode 100644
index fc0965821fc5..000000000000
Binary files a/sound/piano/G#4.ogg and /dev/null differ
diff --git a/sound/piano/G#5.ogg b/sound/piano/G#5.ogg
deleted file mode 100644
index 845c02160cc9..000000000000
Binary files a/sound/piano/G#5.ogg and /dev/null differ
diff --git a/sound/piano/G#6.ogg b/sound/piano/G#6.ogg
deleted file mode 100644
index 934f281311c1..000000000000
Binary files a/sound/piano/G#6.ogg and /dev/null differ
diff --git a/sound/piano/G#7.ogg b/sound/piano/G#7.ogg
deleted file mode 100644
index 0366b7a74b33..000000000000
Binary files a/sound/piano/G#7.ogg and /dev/null differ
diff --git a/sound/piano/G#8.ogg b/sound/piano/G#8.ogg
deleted file mode 100644
index 5c7f1b3fa57c..000000000000
Binary files a/sound/piano/G#8.ogg and /dev/null differ
diff --git a/sound/piano/Gb1.ogg b/sound/piano/Gb1.ogg
deleted file mode 100644
index 229e2e5d477e..000000000000
Binary files a/sound/piano/Gb1.ogg and /dev/null differ
diff --git a/sound/piano/Gb2.ogg b/sound/piano/Gb2.ogg
deleted file mode 100644
index c22963c95b67..000000000000
Binary files a/sound/piano/Gb2.ogg and /dev/null differ
diff --git a/sound/piano/Gb3.ogg b/sound/piano/Gb3.ogg
deleted file mode 100644
index de273ab8d200..000000000000
Binary files a/sound/piano/Gb3.ogg and /dev/null differ
diff --git a/sound/piano/Gb4.ogg b/sound/piano/Gb4.ogg
deleted file mode 100644
index 383d7a9212bf..000000000000
Binary files a/sound/piano/Gb4.ogg and /dev/null differ
diff --git a/sound/piano/Gb5.ogg b/sound/piano/Gb5.ogg
deleted file mode 100644
index e84ca674898a..000000000000
Binary files a/sound/piano/Gb5.ogg and /dev/null differ
diff --git a/sound/piano/Gb6.ogg b/sound/piano/Gb6.ogg
deleted file mode 100644
index d6171c668f75..000000000000
Binary files a/sound/piano/Gb6.ogg and /dev/null differ
diff --git a/sound/piano/Gb7.ogg b/sound/piano/Gb7.ogg
deleted file mode 100644
index c47bff993c11..000000000000
Binary files a/sound/piano/Gb7.ogg and /dev/null differ
diff --git a/sound/piano/Gb8.ogg b/sound/piano/Gb8.ogg
deleted file mode 100644
index bdd5e3396642..000000000000
Binary files a/sound/piano/Gb8.ogg and /dev/null differ
diff --git a/sound/piano/Gn1.ogg b/sound/piano/Gn1.ogg
deleted file mode 100644
index b78d3f44faa5..000000000000
Binary files a/sound/piano/Gn1.ogg and /dev/null differ
diff --git a/sound/piano/Gn2.ogg b/sound/piano/Gn2.ogg
deleted file mode 100644
index 4cc8e85d33fd..000000000000
Binary files a/sound/piano/Gn2.ogg and /dev/null differ
diff --git a/sound/piano/Gn3.ogg b/sound/piano/Gn3.ogg
deleted file mode 100644
index 65a0a83b7e9c..000000000000
Binary files a/sound/piano/Gn3.ogg and /dev/null differ
diff --git a/sound/piano/Gn4.ogg b/sound/piano/Gn4.ogg
deleted file mode 100644
index ac88f21a5168..000000000000
Binary files a/sound/piano/Gn4.ogg and /dev/null differ
diff --git a/sound/piano/Gn5.ogg b/sound/piano/Gn5.ogg
deleted file mode 100644
index a2cd6b032cf9..000000000000
Binary files a/sound/piano/Gn5.ogg and /dev/null differ
diff --git a/sound/piano/Gn6.ogg b/sound/piano/Gn6.ogg
deleted file mode 100644
index 6e22bdeae80c..000000000000
Binary files a/sound/piano/Gn6.ogg and /dev/null differ
diff --git a/sound/piano/Gn7.ogg b/sound/piano/Gn7.ogg
deleted file mode 100644
index 3c2af2907da7..000000000000
Binary files a/sound/piano/Gn7.ogg and /dev/null differ
diff --git a/sound/piano/Gn8.ogg b/sound/piano/Gn8.ogg
deleted file mode 100644
index f27b35f10abd..000000000000
Binary files a/sound/piano/Gn8.ogg and /dev/null differ
diff --git a/sound/violin/A#1.mid b/sound/violin/A#1.mid
deleted file mode 100644
index 693b73f5420f..000000000000
Binary files a/sound/violin/A#1.mid and /dev/null differ
diff --git a/sound/violin/A#2.mid b/sound/violin/A#2.mid
deleted file mode 100644
index 40da5f3da152..000000000000
Binary files a/sound/violin/A#2.mid and /dev/null differ
diff --git a/sound/violin/A#3.mid b/sound/violin/A#3.mid
deleted file mode 100644
index 5bab6ccd6362..000000000000
Binary files a/sound/violin/A#3.mid and /dev/null differ
diff --git a/sound/violin/A#4.mid b/sound/violin/A#4.mid
deleted file mode 100644
index dce830448ef8..000000000000
Binary files a/sound/violin/A#4.mid and /dev/null differ
diff --git a/sound/violin/A#5.mid b/sound/violin/A#5.mid
deleted file mode 100644
index fda796e27b90..000000000000
Binary files a/sound/violin/A#5.mid and /dev/null differ
diff --git a/sound/violin/A#6.mid b/sound/violin/A#6.mid
deleted file mode 100644
index 9e5da684f43c..000000000000
Binary files a/sound/violin/A#6.mid and /dev/null differ
diff --git a/sound/violin/A#7.mid b/sound/violin/A#7.mid
deleted file mode 100644
index 215c56cbe7ee..000000000000
Binary files a/sound/violin/A#7.mid and /dev/null differ
diff --git a/sound/violin/A#8.mid b/sound/violin/A#8.mid
deleted file mode 100644
index 4b55c34691f7..000000000000
Binary files a/sound/violin/A#8.mid and /dev/null differ
diff --git a/sound/violin/Ab1.mid b/sound/violin/Ab1.mid
deleted file mode 100644
index b8253364b4e8..000000000000
Binary files a/sound/violin/Ab1.mid and /dev/null differ
diff --git a/sound/violin/Ab2.mid b/sound/violin/Ab2.mid
deleted file mode 100644
index 4cd7f9b55a7c..000000000000
Binary files a/sound/violin/Ab2.mid and /dev/null differ
diff --git a/sound/violin/Ab3.mid b/sound/violin/Ab3.mid
deleted file mode 100644
index e827cfc635ee..000000000000
Binary files a/sound/violin/Ab3.mid and /dev/null differ
diff --git a/sound/violin/Ab4.mid b/sound/violin/Ab4.mid
deleted file mode 100644
index 57e1f76c9761..000000000000
Binary files a/sound/violin/Ab4.mid and /dev/null differ
diff --git a/sound/violin/Ab5.mid b/sound/violin/Ab5.mid
deleted file mode 100644
index 59e95a6d9974..000000000000
Binary files a/sound/violin/Ab5.mid and /dev/null differ
diff --git a/sound/violin/Ab6.mid b/sound/violin/Ab6.mid
deleted file mode 100644
index 9bd3436287b9..000000000000
Binary files a/sound/violin/Ab6.mid and /dev/null differ
diff --git a/sound/violin/Ab7.mid b/sound/violin/Ab7.mid
deleted file mode 100644
index 3c90af807e27..000000000000
Binary files a/sound/violin/Ab7.mid and /dev/null differ
diff --git a/sound/violin/Ab8.mid b/sound/violin/Ab8.mid
deleted file mode 100644
index 873d771f2aea..000000000000
Binary files a/sound/violin/Ab8.mid and /dev/null differ
diff --git a/sound/violin/An1.mid b/sound/violin/An1.mid
deleted file mode 100644
index d7f8a001d93f..000000000000
Binary files a/sound/violin/An1.mid and /dev/null differ
diff --git a/sound/violin/An2.mid b/sound/violin/An2.mid
deleted file mode 100644
index 2f01800a0754..000000000000
Binary files a/sound/violin/An2.mid and /dev/null differ
diff --git a/sound/violin/An3.mid b/sound/violin/An3.mid
deleted file mode 100644
index c8ed3cdfa6cb..000000000000
Binary files a/sound/violin/An3.mid and /dev/null differ
diff --git a/sound/violin/An4.mid b/sound/violin/An4.mid
deleted file mode 100644
index e7984ca7e62b..000000000000
Binary files a/sound/violin/An4.mid and /dev/null differ
diff --git a/sound/violin/An5.mid b/sound/violin/An5.mid
deleted file mode 100644
index e1fd228f7a9e..000000000000
Binary files a/sound/violin/An5.mid and /dev/null differ
diff --git a/sound/violin/An6.mid b/sound/violin/An6.mid
deleted file mode 100644
index 1c8df6c98e5c..000000000000
Binary files a/sound/violin/An6.mid and /dev/null differ
diff --git a/sound/violin/An7.mid b/sound/violin/An7.mid
deleted file mode 100644
index 2784428daf9e..000000000000
Binary files a/sound/violin/An7.mid and /dev/null differ
diff --git a/sound/violin/An8.mid b/sound/violin/An8.mid
deleted file mode 100644
index 2db2ab70a7d9..000000000000
Binary files a/sound/violin/An8.mid and /dev/null differ
diff --git a/sound/violin/B#1.mid b/sound/violin/B#1.mid
deleted file mode 100644
index d83b176edd8b..000000000000
Binary files a/sound/violin/B#1.mid and /dev/null differ
diff --git a/sound/violin/B#2.mid b/sound/violin/B#2.mid
deleted file mode 100644
index cddff75625f0..000000000000
Binary files a/sound/violin/B#2.mid and /dev/null differ
diff --git a/sound/violin/B#3.mid b/sound/violin/B#3.mid
deleted file mode 100644
index 8bd7ec2fa9d6..000000000000
Binary files a/sound/violin/B#3.mid and /dev/null differ
diff --git a/sound/violin/B#4.mid b/sound/violin/B#4.mid
deleted file mode 100644
index 4c7ab84b57be..000000000000
Binary files a/sound/violin/B#4.mid and /dev/null differ
diff --git a/sound/violin/B#5.mid b/sound/violin/B#5.mid
deleted file mode 100644
index d7f990b2d6c3..000000000000
Binary files a/sound/violin/B#5.mid and /dev/null differ
diff --git a/sound/violin/B#6.mid b/sound/violin/B#6.mid
deleted file mode 100644
index e124ccb8e2b0..000000000000
Binary files a/sound/violin/B#6.mid and /dev/null differ
diff --git a/sound/violin/B#7.mid b/sound/violin/B#7.mid
deleted file mode 100644
index 231c9e428db5..000000000000
Binary files a/sound/violin/B#7.mid and /dev/null differ
diff --git a/sound/violin/B#8.mid b/sound/violin/B#8.mid
deleted file mode 100644
index 981943c08f0c..000000000000
Binary files a/sound/violin/B#8.mid and /dev/null differ
diff --git a/sound/violin/Bb1.mid b/sound/violin/Bb1.mid
deleted file mode 100644
index 693b73f5420f..000000000000
Binary files a/sound/violin/Bb1.mid and /dev/null differ
diff --git a/sound/violin/Bb2.mid b/sound/violin/Bb2.mid
deleted file mode 100644
index 40da5f3da152..000000000000
Binary files a/sound/violin/Bb2.mid and /dev/null differ
diff --git a/sound/violin/Bb3.mid b/sound/violin/Bb3.mid
deleted file mode 100644
index 5bab6ccd6362..000000000000
Binary files a/sound/violin/Bb3.mid and /dev/null differ
diff --git a/sound/violin/Bb4.mid b/sound/violin/Bb4.mid
deleted file mode 100644
index dce830448ef8..000000000000
Binary files a/sound/violin/Bb4.mid and /dev/null differ
diff --git a/sound/violin/Bb5.mid b/sound/violin/Bb5.mid
deleted file mode 100644
index fda796e27b90..000000000000
Binary files a/sound/violin/Bb5.mid and /dev/null differ
diff --git a/sound/violin/Bb6.mid b/sound/violin/Bb6.mid
deleted file mode 100644
index 9e5da684f43c..000000000000
Binary files a/sound/violin/Bb6.mid and /dev/null differ
diff --git a/sound/violin/Bb7.mid b/sound/violin/Bb7.mid
deleted file mode 100644
index 215c56cbe7ee..000000000000
Binary files a/sound/violin/Bb7.mid and /dev/null differ
diff --git a/sound/violin/Bb8.mid b/sound/violin/Bb8.mid
deleted file mode 100644
index 4b55c34691f7..000000000000
Binary files a/sound/violin/Bb8.mid and /dev/null differ
diff --git a/sound/violin/Bn1.mid b/sound/violin/Bn1.mid
deleted file mode 100644
index 27968b5f9e7d..000000000000
Binary files a/sound/violin/Bn1.mid and /dev/null differ
diff --git a/sound/violin/Bn2.mid b/sound/violin/Bn2.mid
deleted file mode 100644
index 54c9b99d03fe..000000000000
Binary files a/sound/violin/Bn2.mid and /dev/null differ
diff --git a/sound/violin/Bn3.mid b/sound/violin/Bn3.mid
deleted file mode 100644
index f73476fb7bb1..000000000000
Binary files a/sound/violin/Bn3.mid and /dev/null differ
diff --git a/sound/violin/Bn4.mid b/sound/violin/Bn4.mid
deleted file mode 100644
index 2aa30708a6cb..000000000000
Binary files a/sound/violin/Bn4.mid and /dev/null differ
diff --git a/sound/violin/Bn5.mid b/sound/violin/Bn5.mid
deleted file mode 100644
index 0ebe636b7145..000000000000
Binary files a/sound/violin/Bn5.mid and /dev/null differ
diff --git a/sound/violin/Bn6.mid b/sound/violin/Bn6.mid
deleted file mode 100644
index 3b8e1c217f7b..000000000000
Binary files a/sound/violin/Bn6.mid and /dev/null differ
diff --git a/sound/violin/Bn7.mid b/sound/violin/Bn7.mid
deleted file mode 100644
index afcb1982a13f..000000000000
Binary files a/sound/violin/Bn7.mid and /dev/null differ
diff --git a/sound/violin/Bn8.mid b/sound/violin/Bn8.mid
deleted file mode 100644
index 3afd469256c1..000000000000
Binary files a/sound/violin/Bn8.mid and /dev/null differ
diff --git a/sound/violin/C#1.mid b/sound/violin/C#1.mid
deleted file mode 100644
index 88dba851452e..000000000000
Binary files a/sound/violin/C#1.mid and /dev/null differ
diff --git a/sound/violin/C#2.mid b/sound/violin/C#2.mid
deleted file mode 100644
index b510926b45fa..000000000000
Binary files a/sound/violin/C#2.mid and /dev/null differ
diff --git a/sound/violin/C#3.mid b/sound/violin/C#3.mid
deleted file mode 100644
index 9954bbe478a2..000000000000
Binary files a/sound/violin/C#3.mid and /dev/null differ
diff --git a/sound/violin/C#4.mid b/sound/violin/C#4.mid
deleted file mode 100644
index 2c5ff74db0aa..000000000000
Binary files a/sound/violin/C#4.mid and /dev/null differ
diff --git a/sound/violin/C#5.mid b/sound/violin/C#5.mid
deleted file mode 100644
index e5850a3fd041..000000000000
Binary files a/sound/violin/C#5.mid and /dev/null differ
diff --git a/sound/violin/C#6.mid b/sound/violin/C#6.mid
deleted file mode 100644
index 217c0ad014c5..000000000000
Binary files a/sound/violin/C#6.mid and /dev/null differ
diff --git a/sound/violin/C#7.mid b/sound/violin/C#7.mid
deleted file mode 100644
index ec32bdbf9040..000000000000
Binary files a/sound/violin/C#7.mid and /dev/null differ
diff --git a/sound/violin/C#8.mid b/sound/violin/C#8.mid
deleted file mode 100644
index 555bce3db0d8..000000000000
Binary files a/sound/violin/C#8.mid and /dev/null differ
diff --git a/sound/violin/Cb1.mid b/sound/violin/Cb1.mid
deleted file mode 100644
index a00f09dfb088..000000000000
Binary files a/sound/violin/Cb1.mid and /dev/null differ
diff --git a/sound/violin/Cb2.mid b/sound/violin/Cb2.mid
deleted file mode 100644
index 4085711bf127..000000000000
Binary files a/sound/violin/Cb2.mid and /dev/null differ
diff --git a/sound/violin/Cb3.mid b/sound/violin/Cb3.mid
deleted file mode 100644
index f647983ef05c..000000000000
Binary files a/sound/violin/Cb3.mid and /dev/null differ
diff --git a/sound/violin/Cb4.mid b/sound/violin/Cb4.mid
deleted file mode 100644
index 24f22f09eecc..000000000000
Binary files a/sound/violin/Cb4.mid and /dev/null differ
diff --git a/sound/violin/Cb5.mid b/sound/violin/Cb5.mid
deleted file mode 100644
index 057e97c5e0d0..000000000000
Binary files a/sound/violin/Cb5.mid and /dev/null differ
diff --git a/sound/violin/Cb6.mid b/sound/violin/Cb6.mid
deleted file mode 100644
index 887e65fc13d0..000000000000
Binary files a/sound/violin/Cb6.mid and /dev/null differ
diff --git a/sound/violin/Cb7.mid b/sound/violin/Cb7.mid
deleted file mode 100644
index 99668bc192c2..000000000000
Binary files a/sound/violin/Cb7.mid and /dev/null differ
diff --git a/sound/violin/Cb8.mid b/sound/violin/Cb8.mid
deleted file mode 100644
index 53ea61d1b250..000000000000
Binary files a/sound/violin/Cb8.mid and /dev/null differ
diff --git a/sound/violin/Cb9.mid b/sound/violin/Cb9.mid
deleted file mode 100644
index 1e8c3afadf13..000000000000
Binary files a/sound/violin/Cb9.mid and /dev/null differ
diff --git a/sound/violin/Cn1.mid b/sound/violin/Cn1.mid
deleted file mode 100644
index 857120f31f4e..000000000000
Binary files a/sound/violin/Cn1.mid and /dev/null differ
diff --git a/sound/violin/Cn2.mid b/sound/violin/Cn2.mid
deleted file mode 100644
index 3ccd6670e873..000000000000
Binary files a/sound/violin/Cn2.mid and /dev/null differ
diff --git a/sound/violin/Cn3.mid b/sound/violin/Cn3.mid
deleted file mode 100644
index 1851e4f8d27d..000000000000
Binary files a/sound/violin/Cn3.mid and /dev/null differ
diff --git a/sound/violin/Cn4.mid b/sound/violin/Cn4.mid
deleted file mode 100644
index 65e8b0efe4e5..000000000000
Binary files a/sound/violin/Cn4.mid and /dev/null differ
diff --git a/sound/violin/Cn5.mid b/sound/violin/Cn5.mid
deleted file mode 100644
index 544f921e43b9..000000000000
Binary files a/sound/violin/Cn5.mid and /dev/null differ
diff --git a/sound/violin/Cn6.mid b/sound/violin/Cn6.mid
deleted file mode 100644
index 7c78dab2f076..000000000000
Binary files a/sound/violin/Cn6.mid and /dev/null differ
diff --git a/sound/violin/Cn7.mid b/sound/violin/Cn7.mid
deleted file mode 100644
index 3abe4cde0863..000000000000
Binary files a/sound/violin/Cn7.mid and /dev/null differ
diff --git a/sound/violin/Cn8.mid b/sound/violin/Cn8.mid
deleted file mode 100644
index 06f14081b3b9..000000000000
Binary files a/sound/violin/Cn8.mid and /dev/null differ
diff --git a/sound/violin/Cn9.mid b/sound/violin/Cn9.mid
deleted file mode 100644
index 62f4eef045a8..000000000000
Binary files a/sound/violin/Cn9.mid and /dev/null differ
diff --git a/sound/violin/D#1.mid b/sound/violin/D#1.mid
deleted file mode 100644
index 829e6fcf185a..000000000000
Binary files a/sound/violin/D#1.mid and /dev/null differ
diff --git a/sound/violin/D#2.mid b/sound/violin/D#2.mid
deleted file mode 100644
index 66029b340cc9..000000000000
Binary files a/sound/violin/D#2.mid and /dev/null differ
diff --git a/sound/violin/D#3.mid b/sound/violin/D#3.mid
deleted file mode 100644
index c982375941e6..000000000000
Binary files a/sound/violin/D#3.mid and /dev/null differ
diff --git a/sound/violin/D#4.mid b/sound/violin/D#4.mid
deleted file mode 100644
index 016ed4f1edf9..000000000000
Binary files a/sound/violin/D#4.mid and /dev/null differ
diff --git a/sound/violin/D#5.mid b/sound/violin/D#5.mid
deleted file mode 100644
index ddb511795df2..000000000000
Binary files a/sound/violin/D#5.mid and /dev/null differ
diff --git a/sound/violin/D#6.mid b/sound/violin/D#6.mid
deleted file mode 100644
index b7242b9ab994..000000000000
Binary files a/sound/violin/D#6.mid and /dev/null differ
diff --git a/sound/violin/D#7.mid b/sound/violin/D#7.mid
deleted file mode 100644
index 773538340a56..000000000000
Binary files a/sound/violin/D#7.mid and /dev/null differ
diff --git a/sound/violin/D#8.mid b/sound/violin/D#8.mid
deleted file mode 100644
index 4ad074e173b7..000000000000
Binary files a/sound/violin/D#8.mid and /dev/null differ
diff --git a/sound/violin/Db1.mid b/sound/violin/Db1.mid
deleted file mode 100644
index 88dba851452e..000000000000
Binary files a/sound/violin/Db1.mid and /dev/null differ
diff --git a/sound/violin/Db2.mid b/sound/violin/Db2.mid
deleted file mode 100644
index b510926b45fa..000000000000
Binary files a/sound/violin/Db2.mid and /dev/null differ
diff --git a/sound/violin/Db3.mid b/sound/violin/Db3.mid
deleted file mode 100644
index 9954bbe478a2..000000000000
Binary files a/sound/violin/Db3.mid and /dev/null differ
diff --git a/sound/violin/Db4.mid b/sound/violin/Db4.mid
deleted file mode 100644
index 2c5ff74db0aa..000000000000
Binary files a/sound/violin/Db4.mid and /dev/null differ
diff --git a/sound/violin/Db5.mid b/sound/violin/Db5.mid
deleted file mode 100644
index e5850a3fd041..000000000000
Binary files a/sound/violin/Db5.mid and /dev/null differ
diff --git a/sound/violin/Db6.mid b/sound/violin/Db6.mid
deleted file mode 100644
index 217c0ad014c5..000000000000
Binary files a/sound/violin/Db6.mid and /dev/null differ
diff --git a/sound/violin/Db7.mid b/sound/violin/Db7.mid
deleted file mode 100644
index ec32bdbf9040..000000000000
Binary files a/sound/violin/Db7.mid and /dev/null differ
diff --git a/sound/violin/Db8.mid b/sound/violin/Db8.mid
deleted file mode 100644
index 555bce3db0d8..000000000000
Binary files a/sound/violin/Db8.mid and /dev/null differ
diff --git a/sound/violin/Dn1.mid b/sound/violin/Dn1.mid
deleted file mode 100644
index 92e4e0d95816..000000000000
Binary files a/sound/violin/Dn1.mid and /dev/null differ
diff --git a/sound/violin/Dn2.mid b/sound/violin/Dn2.mid
deleted file mode 100644
index 34eb9d1db1ba..000000000000
Binary files a/sound/violin/Dn2.mid and /dev/null differ
diff --git a/sound/violin/Dn3.mid b/sound/violin/Dn3.mid
deleted file mode 100644
index fbd56085aafa..000000000000
Binary files a/sound/violin/Dn3.mid and /dev/null differ
diff --git a/sound/violin/Dn4.mid b/sound/violin/Dn4.mid
deleted file mode 100644
index e13c74482921..000000000000
Binary files a/sound/violin/Dn4.mid and /dev/null differ
diff --git a/sound/violin/Dn5.mid b/sound/violin/Dn5.mid
deleted file mode 100644
index 8fd41e5c6fe0..000000000000
Binary files a/sound/violin/Dn5.mid and /dev/null differ
diff --git a/sound/violin/Dn6.mid b/sound/violin/Dn6.mid
deleted file mode 100644
index d47329e8f9ed..000000000000
Binary files a/sound/violin/Dn6.mid and /dev/null differ
diff --git a/sound/violin/Dn7.mid b/sound/violin/Dn7.mid
deleted file mode 100644
index b24966038762..000000000000
Binary files a/sound/violin/Dn7.mid and /dev/null differ
diff --git a/sound/violin/Dn8.mid b/sound/violin/Dn8.mid
deleted file mode 100644
index 56667a1a86d0..000000000000
Binary files a/sound/violin/Dn8.mid and /dev/null differ
diff --git a/sound/violin/E#1.mid b/sound/violin/E#1.mid
deleted file mode 100644
index 3f130ee126c1..000000000000
Binary files a/sound/violin/E#1.mid and /dev/null differ
diff --git a/sound/violin/E#2.mid b/sound/violin/E#2.mid
deleted file mode 100644
index f67c2d0a2673..000000000000
Binary files a/sound/violin/E#2.mid and /dev/null differ
diff --git a/sound/violin/E#3.mid b/sound/violin/E#3.mid
deleted file mode 100644
index bb393382d6c8..000000000000
Binary files a/sound/violin/E#3.mid and /dev/null differ
diff --git a/sound/violin/E#4.mid b/sound/violin/E#4.mid
deleted file mode 100644
index a96520c595d3..000000000000
Binary files a/sound/violin/E#4.mid and /dev/null differ
diff --git a/sound/violin/E#5.mid b/sound/violin/E#5.mid
deleted file mode 100644
index d1378af1972d..000000000000
Binary files a/sound/violin/E#5.mid and /dev/null differ
diff --git a/sound/violin/E#6.mid b/sound/violin/E#6.mid
deleted file mode 100644
index 7abe40bd8242..000000000000
Binary files a/sound/violin/E#6.mid and /dev/null differ
diff --git a/sound/violin/E#7.mid b/sound/violin/E#7.mid
deleted file mode 100644
index df278c20d6b6..000000000000
Binary files a/sound/violin/E#7.mid and /dev/null differ
diff --git a/sound/violin/E#8.mid b/sound/violin/E#8.mid
deleted file mode 100644
index 35254cd5b25b..000000000000
Binary files a/sound/violin/E#8.mid and /dev/null differ
diff --git a/sound/violin/Eb1.mid b/sound/violin/Eb1.mid
deleted file mode 100644
index 829e6fcf185a..000000000000
Binary files a/sound/violin/Eb1.mid and /dev/null differ
diff --git a/sound/violin/Eb2.mid b/sound/violin/Eb2.mid
deleted file mode 100644
index 66029b340cc9..000000000000
Binary files a/sound/violin/Eb2.mid and /dev/null differ
diff --git a/sound/violin/Eb3.mid b/sound/violin/Eb3.mid
deleted file mode 100644
index c982375941e6..000000000000
Binary files a/sound/violin/Eb3.mid and /dev/null differ
diff --git a/sound/violin/Eb4.mid b/sound/violin/Eb4.mid
deleted file mode 100644
index 016ed4f1edf9..000000000000
Binary files a/sound/violin/Eb4.mid and /dev/null differ
diff --git a/sound/violin/Eb5.mid b/sound/violin/Eb5.mid
deleted file mode 100644
index ddb511795df2..000000000000
Binary files a/sound/violin/Eb5.mid and /dev/null differ
diff --git a/sound/violin/Eb6.mid b/sound/violin/Eb6.mid
deleted file mode 100644
index b7242b9ab994..000000000000
Binary files a/sound/violin/Eb6.mid and /dev/null differ
diff --git a/sound/violin/Eb7.mid b/sound/violin/Eb7.mid
deleted file mode 100644
index 773538340a56..000000000000
Binary files a/sound/violin/Eb7.mid and /dev/null differ
diff --git a/sound/violin/Eb8.mid b/sound/violin/Eb8.mid
deleted file mode 100644
index 4ad074e173b7..000000000000
Binary files a/sound/violin/Eb8.mid and /dev/null differ
diff --git a/sound/violin/En1.mid b/sound/violin/En1.mid
deleted file mode 100644
index 79ab68df9df7..000000000000
Binary files a/sound/violin/En1.mid and /dev/null differ
diff --git a/sound/violin/En2.mid b/sound/violin/En2.mid
deleted file mode 100644
index cd61c8d0de5b..000000000000
Binary files a/sound/violin/En2.mid and /dev/null differ
diff --git a/sound/violin/En3.mid b/sound/violin/En3.mid
deleted file mode 100644
index da5b703d545b..000000000000
Binary files a/sound/violin/En3.mid and /dev/null differ
diff --git a/sound/violin/En4.mid b/sound/violin/En4.mid
deleted file mode 100644
index f7d3af024ff2..000000000000
Binary files a/sound/violin/En4.mid and /dev/null differ
diff --git a/sound/violin/En5.mid b/sound/violin/En5.mid
deleted file mode 100644
index d3d353943f9d..000000000000
Binary files a/sound/violin/En5.mid and /dev/null differ
diff --git a/sound/violin/En6.mid b/sound/violin/En6.mid
deleted file mode 100644
index 73eb5b0697db..000000000000
Binary files a/sound/violin/En6.mid and /dev/null differ
diff --git a/sound/violin/En7.mid b/sound/violin/En7.mid
deleted file mode 100644
index 79a9462c844e..000000000000
Binary files a/sound/violin/En7.mid and /dev/null differ
diff --git a/sound/violin/En8.mid b/sound/violin/En8.mid
deleted file mode 100644
index 88947fc7318e..000000000000
Binary files a/sound/violin/En8.mid and /dev/null differ
diff --git a/sound/violin/F#1.mid b/sound/violin/F#1.mid
deleted file mode 100644
index d18668e89112..000000000000
Binary files a/sound/violin/F#1.mid and /dev/null differ
diff --git a/sound/violin/F#2.mid b/sound/violin/F#2.mid
deleted file mode 100644
index 302f0c6fdc15..000000000000
Binary files a/sound/violin/F#2.mid and /dev/null differ
diff --git a/sound/violin/F#3.mid b/sound/violin/F#3.mid
deleted file mode 100644
index 1f592fc90399..000000000000
Binary files a/sound/violin/F#3.mid and /dev/null differ
diff --git a/sound/violin/F#4.mid b/sound/violin/F#4.mid
deleted file mode 100644
index 45854126f988..000000000000
Binary files a/sound/violin/F#4.mid and /dev/null differ
diff --git a/sound/violin/F#5.mid b/sound/violin/F#5.mid
deleted file mode 100644
index fb1e1da339a9..000000000000
Binary files a/sound/violin/F#5.mid and /dev/null differ
diff --git a/sound/violin/F#6.mid b/sound/violin/F#6.mid
deleted file mode 100644
index bfa896bb7844..000000000000
Binary files a/sound/violin/F#6.mid and /dev/null differ
diff --git a/sound/violin/F#7.mid b/sound/violin/F#7.mid
deleted file mode 100644
index a27763c1d47d..000000000000
Binary files a/sound/violin/F#7.mid and /dev/null differ
diff --git a/sound/violin/F#8.mid b/sound/violin/F#8.mid
deleted file mode 100644
index aaab80a72762..000000000000
Binary files a/sound/violin/F#8.mid and /dev/null differ
diff --git a/sound/violin/Fb1.mid b/sound/violin/Fb1.mid
deleted file mode 100644
index c89b3f36b439..000000000000
Binary files a/sound/violin/Fb1.mid and /dev/null differ
diff --git a/sound/violin/Fb2.mid b/sound/violin/Fb2.mid
deleted file mode 100644
index 3db6af1aa459..000000000000
Binary files a/sound/violin/Fb2.mid and /dev/null differ
diff --git a/sound/violin/Fb3.mid b/sound/violin/Fb3.mid
deleted file mode 100644
index 5f601f3ac424..000000000000
Binary files a/sound/violin/Fb3.mid and /dev/null differ
diff --git a/sound/violin/Fb4.mid b/sound/violin/Fb4.mid
deleted file mode 100644
index f1abc8109d1e..000000000000
Binary files a/sound/violin/Fb4.mid and /dev/null differ
diff --git a/sound/violin/Fb5.mid b/sound/violin/Fb5.mid
deleted file mode 100644
index 2ec1b2e51283..000000000000
Binary files a/sound/violin/Fb5.mid and /dev/null differ
diff --git a/sound/violin/Fb6.mid b/sound/violin/Fb6.mid
deleted file mode 100644
index b8bdf7fee071..000000000000
Binary files a/sound/violin/Fb6.mid and /dev/null differ
diff --git a/sound/violin/Fb7.mid b/sound/violin/Fb7.mid
deleted file mode 100644
index 51f5f1bcdb48..000000000000
Binary files a/sound/violin/Fb7.mid and /dev/null differ
diff --git a/sound/violin/Fb8.mid b/sound/violin/Fb8.mid
deleted file mode 100644
index 47928f38475c..000000000000
Binary files a/sound/violin/Fb8.mid and /dev/null differ
diff --git a/sound/violin/Fn1.mid b/sound/violin/Fn1.mid
deleted file mode 100644
index abe0d4e4051b..000000000000
Binary files a/sound/violin/Fn1.mid and /dev/null differ
diff --git a/sound/violin/Fn2.mid b/sound/violin/Fn2.mid
deleted file mode 100644
index d245bef3b54c..000000000000
Binary files a/sound/violin/Fn2.mid and /dev/null differ
diff --git a/sound/violin/Fn3.mid b/sound/violin/Fn3.mid
deleted file mode 100644
index e532e30dac9c..000000000000
Binary files a/sound/violin/Fn3.mid and /dev/null differ
diff --git a/sound/violin/Fn4.mid b/sound/violin/Fn4.mid
deleted file mode 100644
index 47219c72fa2e..000000000000
Binary files a/sound/violin/Fn4.mid and /dev/null differ
diff --git a/sound/violin/Fn5.mid b/sound/violin/Fn5.mid
deleted file mode 100644
index 630d16371d9e..000000000000
Binary files a/sound/violin/Fn5.mid and /dev/null differ
diff --git a/sound/violin/Fn6.mid b/sound/violin/Fn6.mid
deleted file mode 100644
index 08cbc981bdb6..000000000000
Binary files a/sound/violin/Fn6.mid and /dev/null differ
diff --git a/sound/violin/Fn7.mid b/sound/violin/Fn7.mid
deleted file mode 100644
index 6c28c7d272e2..000000000000
Binary files a/sound/violin/Fn7.mid and /dev/null differ
diff --git a/sound/violin/Fn8.mid b/sound/violin/Fn8.mid
deleted file mode 100644
index 2d73762f269a..000000000000
Binary files a/sound/violin/Fn8.mid and /dev/null differ
diff --git a/sound/violin/G#1.mid b/sound/violin/G#1.mid
deleted file mode 100644
index b1b38856858c..000000000000
Binary files a/sound/violin/G#1.mid and /dev/null differ
diff --git a/sound/violin/G#2.mid b/sound/violin/G#2.mid
deleted file mode 100644
index e827cfc635ee..000000000000
Binary files a/sound/violin/G#2.mid and /dev/null differ
diff --git a/sound/violin/G#3.mid b/sound/violin/G#3.mid
deleted file mode 100644
index 57e1f76c9761..000000000000
Binary files a/sound/violin/G#3.mid and /dev/null differ
diff --git a/sound/violin/G#4.mid b/sound/violin/G#4.mid
deleted file mode 100644
index 59e95a6d9974..000000000000
Binary files a/sound/violin/G#4.mid and /dev/null differ
diff --git a/sound/violin/G#5.mid b/sound/violin/G#5.mid
deleted file mode 100644
index 9bd3436287b9..000000000000
Binary files a/sound/violin/G#5.mid and /dev/null differ
diff --git a/sound/violin/G#6.mid b/sound/violin/G#6.mid
deleted file mode 100644
index 3c90af807e27..000000000000
Binary files a/sound/violin/G#6.mid and /dev/null differ
diff --git a/sound/violin/G#7.mid b/sound/violin/G#7.mid
deleted file mode 100644
index b51afd323c64..000000000000
Binary files a/sound/violin/G#7.mid and /dev/null differ
diff --git a/sound/violin/G#8.mid b/sound/violin/G#8.mid
deleted file mode 100644
index d3f5c898d47d..000000000000
Binary files a/sound/violin/G#8.mid and /dev/null differ
diff --git a/sound/violin/Gb1.mid b/sound/violin/Gb1.mid
deleted file mode 100644
index d18668e89112..000000000000
Binary files a/sound/violin/Gb1.mid and /dev/null differ
diff --git a/sound/violin/Gb2.mid b/sound/violin/Gb2.mid
deleted file mode 100644
index 302f0c6fdc15..000000000000
Binary files a/sound/violin/Gb2.mid and /dev/null differ
diff --git a/sound/violin/Gb3.mid b/sound/violin/Gb3.mid
deleted file mode 100644
index 1f592fc90399..000000000000
Binary files a/sound/violin/Gb3.mid and /dev/null differ
diff --git a/sound/violin/Gb4.mid b/sound/violin/Gb4.mid
deleted file mode 100644
index 45854126f988..000000000000
Binary files a/sound/violin/Gb4.mid and /dev/null differ
diff --git a/sound/violin/Gb5.mid b/sound/violin/Gb5.mid
deleted file mode 100644
index fb1e1da339a9..000000000000
Binary files a/sound/violin/Gb5.mid and /dev/null differ
diff --git a/sound/violin/Gb6.mid b/sound/violin/Gb6.mid
deleted file mode 100644
index bfa896bb7844..000000000000
Binary files a/sound/violin/Gb6.mid and /dev/null differ
diff --git a/sound/violin/Gb7.mid b/sound/violin/Gb7.mid
deleted file mode 100644
index a27763c1d47d..000000000000
Binary files a/sound/violin/Gb7.mid and /dev/null differ
diff --git a/sound/violin/Gb8.mid b/sound/violin/Gb8.mid
deleted file mode 100644
index aaab80a72762..000000000000
Binary files a/sound/violin/Gb8.mid and /dev/null differ
diff --git a/sound/violin/Gn1.mid b/sound/violin/Gn1.mid
deleted file mode 100644
index 1df52ab07606..000000000000
Binary files a/sound/violin/Gn1.mid and /dev/null differ
diff --git a/sound/violin/Gn2.mid b/sound/violin/Gn2.mid
deleted file mode 100644
index 6e0ca3831272..000000000000
Binary files a/sound/violin/Gn2.mid and /dev/null differ
diff --git a/sound/violin/Gn3.mid b/sound/violin/Gn3.mid
deleted file mode 100644
index bb3e6dedcbf9..000000000000
Binary files a/sound/violin/Gn3.mid and /dev/null differ
diff --git a/sound/violin/Gn4.mid b/sound/violin/Gn4.mid
deleted file mode 100644
index 0c46432afee5..000000000000
Binary files a/sound/violin/Gn4.mid and /dev/null differ
diff --git a/sound/violin/Gn5.mid b/sound/violin/Gn5.mid
deleted file mode 100644
index f39dcf5e2b9f..000000000000
Binary files a/sound/violin/Gn5.mid and /dev/null differ
diff --git a/sound/violin/Gn6.mid b/sound/violin/Gn6.mid
deleted file mode 100644
index 0efa2259ca17..000000000000
Binary files a/sound/violin/Gn6.mid and /dev/null differ
diff --git a/sound/violin/Gn7.mid b/sound/violin/Gn7.mid
deleted file mode 100644
index 22fd1b6bcb00..000000000000
Binary files a/sound/violin/Gn7.mid and /dev/null differ
diff --git a/sound/violin/Gn8.mid b/sound/violin/Gn8.mid
deleted file mode 100644
index 16b7171d627c..000000000000
Binary files a/sound/violin/Gn8.mid and /dev/null differ
diff --git a/tgui/packages/tgui/interfaces/Microwave.tsx b/tgui/packages/tgui/interfaces/Microwave.tsx
new file mode 100644
index 000000000000..da16a9f44b49
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/Microwave.tsx
@@ -0,0 +1,86 @@
+import { useBackend } from '../backend';
+import { Button, NoticeBox, Section, Flex, Box } from '../components';
+import { BooleanLike } from 'common/react';
+import { Window } from '../layouts';
+
+type Ingredient = {
+ name: string;
+ count: number;
+ measure: string;
+};
+
+type BackendContext = {
+ operating: BooleanLike;
+ broken: BooleanLike;
+ dirty: BooleanLike;
+ ingredients: Ingredient[];
+};
+
+export const Microwave = (props, context) => {
+ const { data, act } = useBackend(context);
+ const { operating, broken, dirty, ingredients } = data;
+
+ return (
+
+
+
+
+
+
+
+ }>
+ {!!operating && (
+
+ Cooking...
+
+ )}
+
+ {!!broken && (
+
+ Appliance broken. Please contact your local technician.
+
+ )}
+
+ {!!dirty && (
+
+ This microwave is too dirty. Cleaning required.
+
+ )}
+
+ {!ingredients.length && None}
+
+
+ {ingredients.map((ingredient) => {
+ return (
+
+ {ingredient.name}: {ingredient.count}{' '}
+ {ingredient.measure}
+
+ );
+ })}
+
+
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/PhoneMenu.js b/tgui/packages/tgui/interfaces/PhoneMenu.js
index 657757dd6781..9a2edf943767 100644
--- a/tgui/packages/tgui/interfaces/PhoneMenu.js
+++ b/tgui/packages/tgui/interfaces/PhoneMenu.js
@@ -15,6 +15,7 @@ export const PhoneMenu = (props, context) => {
const GeneralPanel = (props, context) => {
const { act, data } = useBackend(context);
+ const { availability } = data;
const available_transmitters = Object.keys(data.available_transmitters);
const transmitters = data.transmitters.filter((val1) =>
available_transmitters.includes(val1.phone_id)
@@ -46,6 +47,21 @@ const GeneralPanel = (props, context) => {
categories[0]
);
+ let dnd_tooltip = 'Do Not Disturb is DISABLED';
+ let dnd_locked = 'No';
+ let dnd_icon = 'volume-high';
+ if (availability === 1) {
+ dnd_tooltip = 'Do Not Disturb is ENABLED';
+ dnd_icon = 'volume-xmark';
+ } else if (availability >= 2) {
+ dnd_tooltip = 'Do Not Disturb is ENABLED (LOCKED)';
+ dnd_locked = 'Yes';
+ dnd_icon = 'volume-xmark';
+ } else if (availability < 0) {
+ dnd_tooltip = 'Do Not Disturb is DISABLED (LOCKED)';
+ dnd_locked = 'Yes';
+ }
+
return (
@@ -115,6 +131,18 @@ const GeneralPanel = (props, context) => {
/>
)}
+
+
);
diff --git a/tgui/packages/tgui/interfaces/Radar.tsx b/tgui/packages/tgui/interfaces/Radar.tsx
index 1664082fb1b8..277d23f12d1b 100644
--- a/tgui/packages/tgui/interfaces/Radar.tsx
+++ b/tgui/packages/tgui/interfaces/Radar.tsx
@@ -29,7 +29,7 @@ type Target = {
export const Radar = (props, context) => {
return (
-
+
@@ -40,7 +40,7 @@ export const Radar = (props, context) => {
export const RadarContent = (props, context) => {
return (
-
+
{
-
- {compound.type.document.split(' ')[2]}
-
+ {compound.type.document.split(' ')[0] === 'Simulation' ? (
+
+ {compound.type.document.split(' ')[3]}
+
+ ) : (
+
+ {compound.type.document.split(' ')[2]}
+
+ )}