From bdc22f269f24b6b991ea11f608041065ef067ffa Mon Sep 17 00:00:00 2001 From: Kashargul <144968721+Kashargul@users.noreply.github.com> Date: Sun, 3 Nov 2024 08:06:30 +0100 Subject: [PATCH 01/36] . --- code/datums/chat_message.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/chat_message.dm b/code/datums/chat_message.dm index 0896f823ed..ddd6046109 100644 --- a/code/datums/chat_message.dm +++ b/code/datums/chat_message.dm @@ -231,7 +231,7 @@ var/list/runechat_image_cache = list() return ending_life = TRUE animate(message, alpha = 0, time = fadetime, flags = ANIMATION_PARALLEL) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), src), fadetime, TIMER_DELETE_ME, TIMER_UNIQUE) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), src), fadetime, TIMER_DELETE_ME|TIMER_UNIQUE) /** * Creates a message overlay at a defined location for a given speaker From a43a9f198ea89f5d6944e409549886d20e43d497 Mon Sep 17 00:00:00 2001 From: Kashargul <144968721+Kashargul@users.noreply.github.com> Date: Sun, 3 Nov 2024 08:07:12 +0100 Subject: [PATCH 02/36] should work without unique --- code/datums/chat_message.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/chat_message.dm b/code/datums/chat_message.dm index ddd6046109..32e86c6457 100644 --- a/code/datums/chat_message.dm +++ b/code/datums/chat_message.dm @@ -231,7 +231,7 @@ var/list/runechat_image_cache = list() return ending_life = TRUE animate(message, alpha = 0, time = fadetime, flags = ANIMATION_PARALLEL) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), src), fadetime, TIMER_DELETE_ME|TIMER_UNIQUE) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), src), fadetime, TIMER_DELETE_ME) /** * Creates a message overlay at a defined location for a given speaker From 5d7575bc8406fceffb47a9d90f4df54b3a18ea3b Mon Sep 17 00:00:00 2001 From: Kashargul <144968721+Kashargul@users.noreply.github.com> Date: Sun, 3 Nov 2024 19:40:00 +0100 Subject: [PATCH 03/36] we need that sadly (#16560) --- code/datums/chat_message.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/datums/chat_message.dm b/code/datums/chat_message.dm index 32e86c6457..f216ae01cf 100644 --- a/code/datums/chat_message.dm +++ b/code/datums/chat_message.dm @@ -94,6 +94,7 @@ var/list/runechat_image_cache = list() * * lifespan - The lifespan of the message in deciseconds */ /datum/chatmessage/proc/generate_image(text, atom/target, mob/owner, list/extra_classes, lifespan) + set waitfor = FALSE if(!target || !owner) qdel(src) From 30af417501961863062505465670dff79e619104 Mon Sep 17 00:00:00 2001 From: Kashargul <144968721+Kashargul@users.noreply.github.com> Date: Sun, 3 Nov 2024 19:51:35 +0100 Subject: [PATCH 04/36] fix f1 adminhelp (#16557) --- code/modules/mentor/mentor.dm | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/code/modules/mentor/mentor.dm b/code/modules/mentor/mentor.dm index 370d80a344..4242654b42 100644 --- a/code/modules/mentor/mentor.dm +++ b/code/modules/mentor/mentor.dm @@ -167,12 +167,15 @@ var/list/mentor_verbs_default = list( set name = "Request help" set hidden = 1 - var/mhelp = tgui_alert(usr, "Select the help you need.","Request for Help",list("Adminhelp","Mentorhelp")) == "Mentorhelp" + var/mhelp = tgui_alert(usr, "Select the help you need.","Request for Help",list("Adminhelp","Mentorhelp")) if(!mhelp) return - var/msg = tgui_input_text(usr, "Input your request for help.", "Request for Help", multiline = TRUE) - if (mhelp) + var/msg = tgui_input_text(usr, "Input your request for help.", "Request for Help ([mhelp])", multiline = TRUE) + if(!msg) + return + + if (mhelp == "Mentorhelp") mentorhelp(msg) return From ae4cbc4f7206a0ce178db1baa2e56f7292dfde19 Mon Sep 17 00:00:00 2001 From: ShadowLarkens Date: Sun, 3 Nov 2024 10:58:21 -0800 Subject: [PATCH 05/36] Fix overflow in smartfrige, expand width a little (#16555) --- tgui/packages/tgui/interfaces/SmartVend.tsx | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/tgui/packages/tgui/interfaces/SmartVend.tsx b/tgui/packages/tgui/interfaces/SmartVend.tsx index b934d133e5..7c8eeba29d 100644 --- a/tgui/packages/tgui/interfaces/SmartVend.tsx +++ b/tgui/packages/tgui/interfaces/SmartVend.tsx @@ -20,7 +20,7 @@ export const SmartVend = (props) => { const { secure, locked, contents } = data; return ( - +
{(secure && locked === -1 && ( @@ -39,7 +39,7 @@ export const SmartVend = (props) => { {(contents.length === 0 && ( Unfortunately, this {config.title} is empty. )) || ( - +
Item @@ -51,7 +51,12 @@ export const SmartVend = (props) => { {map(contents, (value: content, key) => ( - {value.name} + + {value.name} + {value.amount} in stock From 8c35071d7e89df1c92888d40d6b9ad65d4d2bade Mon Sep 17 00:00:00 2001 From: Kashargul <144968721+Kashargul@users.noreply.github.com> Date: Sun, 3 Nov 2024 19:59:16 +0100 Subject: [PATCH 06/36] prevent out of index access on tgui spamming the rd console (#16552) * prevent out of index access on tgui spam * prevent multi register and unregister * this needs to be grouped for the execution order --- code/game/machinery/partslathe_vr.dm | 5 +++-- code/game/objects/structures/railing.dm | 2 +- code/modules/research/circuitprinter.dm | 5 +++-- code/modules/research/protolathe.dm | 5 +++-- code/modules/tgui/modules/overmap.dm | 9 +++++++-- 5 files changed, 17 insertions(+), 9 deletions(-) diff --git a/code/game/machinery/partslathe_vr.dm b/code/game/machinery/partslathe_vr.dm index cc277d70d2..8693642de7 100644 --- a/code/game/machinery/partslathe_vr.dm +++ b/code/game/machinery/partslathe_vr.dm @@ -174,8 +174,9 @@ return /obj/machinery/partslathe/proc/removeFromQueue(var/index) - queue.Cut(index, index + 1) - return + if(queue.len >= index) + queue.Cut(index, index + 1) + return /obj/machinery/partslathe/proc/canBuild(var/datum/category_item/partslathe/D) for(var/M in D.resources) diff --git a/code/game/objects/structures/railing.dm b/code/game/objects/structures/railing.dm index 7f7f57c1f0..69167f859c 100644 --- a/code/game/objects/structures/railing.dm +++ b/code/game/objects/structures/railing.dm @@ -222,7 +222,7 @@ // Install if(W.has_tool_quality(TOOL_SCREWDRIVER)) - user.visible_message(span_info(anchored ? span_bold("\The [user]") + " begins unscrewing \the [src]." : span_bold("\The [user]") + "begins fasten \the [src]." )) + user.visible_message(span_info((anchored ? (span_bold("\The [user]") + " begins unscrewing \the [src].") : (span_bold("\The [user]") + "begins fasten \the [src].")))) playsound(src, W.usesound, 75, 1) if(do_after(user, 10, src)) to_chat(user, (anchored ? span_notice("You have unfastened \the [src] from the floor.") : span_notice("You have fastened \the [src] to the floor."))) diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm index 75f4fb1cac..745dcf8dfc 100644 --- a/code/modules/research/circuitprinter.dm +++ b/code/modules/research/circuitprinter.dm @@ -168,8 +168,9 @@ using metal and glass, it uses glass and reagents (usually sulphuric acid). return /obj/machinery/r_n_d/circuit_imprinter/proc/removeFromQueue(var/index) - queue.Cut(index, index + 1) - return + if(queue.len >= index) + queue.Cut(index, index + 1) + return /obj/machinery/r_n_d/circuit_imprinter/proc/canBuild(var/datum/design/D) for(var/M in D.materials) diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm index e6f87f6118..0fc4de44c6 100644 --- a/code/modules/research/protolathe.dm +++ b/code/modules/research/protolathe.dm @@ -184,8 +184,9 @@ return /obj/machinery/r_n_d/protolathe/proc/removeFromQueue(var/index) - queue.Cut(index, index + 1) - return + if(queue.len >= index) + queue.Cut(index, index + 1) + return /obj/machinery/r_n_d/protolathe/proc/canBuild(var/datum/design/D) for(var/M in D.materials) diff --git a/code/modules/tgui/modules/overmap.dm b/code/modules/tgui/modules/overmap.dm index ed2f166c6a..0661d4b146 100644 --- a/code/modules/tgui/modules/overmap.dm +++ b/code/modules/tgui/modules/overmap.dm @@ -2,6 +2,7 @@ var/obj/effect/overmap/visitable/ship/linked var/list/viewers var/extra_view = 0 + var/map_view_used = FALSE /datum/tgui_module/ship/New() . = ..() @@ -77,13 +78,17 @@ user.reset_view(linked) user.set_viewsize(world.view + extra_view) user.AddComponent(/datum/component/recursive_move) - RegisterSignal(user, COMSIG_OBSERVER_MOVED, /datum/tgui_module/ship/proc/unlook) + if(!map_view_used) + RegisterSignal(user, COMSIG_OBSERVER_MOVED, /datum/tgui_module/ship/proc/unlook) + map_view_used = TRUE LAZYDISTINCTADD(viewers, WEAKREF(user)) /datum/tgui_module/ship/proc/unlook(var/mob/user) user.reset_view() user.set_viewsize() // reset to default - UnregisterSignal(user, COMSIG_OBSERVER_MOVED) + if(map_view_used) + UnregisterSignal(user, COMSIG_OBSERVER_MOVED) + map_view_used = FALSE LAZYREMOVE(viewers, WEAKREF(user)) /datum/tgui_module/ship/proc/viewing_overmap(mob/user) From d50bc61c83135c2eab72543d4386e01e47393f29 Mon Sep 17 00:00:00 2001 From: Kashargul <144968721+Kashargul@users.noreply.github.com> Date: Sun, 3 Nov 2024 19:59:34 +0100 Subject: [PATCH 07/36] sanity checks secondary ear colours (#16553) --- code/modules/mob/living/carbon/human/update_icons.dm | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index e90d7771ed..838ab77e2f 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -1343,15 +1343,21 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() if(ear_secondary_style && !(head && (head.flags_inv & BLOCKHEADHAIR))) var/icon/ears_s = new/icon("icon" = ear_secondary_style.icon, "icon_state" = ear_secondary_style.icon_state) if(ear_secondary_style.do_colouration) - ears_s.Blend(LAZYACCESS(ear_secondary_colors, 1), ear_secondary_style.color_blend_mode) + var/color = LAZYACCESS(ear_secondary_colors, 1) + if(color) + ears_s.Blend(color, ear_secondary_style.color_blend_mode) if(ear_secondary_style.extra_overlay) var/icon/overlay = new/icon("icon" = ear_secondary_style.icon, "icon_state" = ear_secondary_style.extra_overlay) - overlay.Blend(LAZYACCESS(ear_secondary_colors, 2), ear_secondary_style.color_blend_mode) + var/color = LAZYACCESS(ear_secondary_colors, 2) + if(color) + overlay.Blend(color, ear_secondary_style.color_blend_mode) ears_s.Blend(overlay, ICON_OVERLAY) qdel(overlay) if(ear_secondary_style.extra_overlay2) //MORE COLOURS IS BETTERER var/icon/overlay = new/icon("icon" = ear_secondary_style.icon, "icon_state" = ear_secondary_style.extra_overlay2) - overlay.Blend(LAZYACCESS(ear_secondary_colors, 3), ear_secondary_style.color_blend_mode) + var/color = LAZYACCESS(ear_secondary_colors, 3) + if(color) + overlay.Blend(color, ear_secondary_style.color_blend_mode) ears_s.Blend(overlay, ICON_OVERLAY) qdel(overlay) if(!rendered) From 67848017dfd86755078c62f5f5093a18a8b350fd Mon Sep 17 00:00:00 2001 From: Casey Date: Sun, 3 Nov 2024 23:34:49 -0500 Subject: [PATCH 08/36] Late map swap --- maps/~map_system/_map_selection.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/maps/~map_system/_map_selection.dm b/maps/~map_system/_map_selection.dm index 879f058f54..47ff0d984d 100644 --- a/maps/~map_system/_map_selection.dm +++ b/maps/~map_system/_map_selection.dm @@ -5,8 +5,8 @@ /* FOR LIVE SERVER */ /*********************/ -#define USE_MAP_TETHER -//#define USE_MAP_STELLARDELIGHT +//#define USE_MAP_TETHER +#define USE_MAP_STELLARDELIGHT //#define USE_MAP_GROUNDBASE // Debug From 92c6fc1e5c636e18ece81108c12ecf7b63b328c6 Mon Sep 17 00:00:00 2001 From: Kashargul <144968721+Kashargul@users.noreply.github.com> Date: Mon, 4 Nov 2024 11:27:54 +0100 Subject: [PATCH 09/36] fix regeneration multipliers (#16561) * fix regeneration multipliers * . * . --- code/controllers/configuration/entries/game_options.dm | 6 ++++-- .../objects/items/devices/communicator/communicator.dm | 3 +-- code/modules/mob/mob_planes_vr.dm | 3 ++- config/example/game_options.txt | 8 ++++---- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index 867460f861..5508d5e168 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -12,10 +12,12 @@ /datum/config_entry/flag/limbs_can_break /datum/config_entry/number/organ_health_multiplier - default = 1 + integer = FALSE + default = 1.0 /datum/config_entry/number/organ_regeneration_multiplier - default = 1 + integer = FALSE + default = 1.0 // FIXME: Unused ///datum/config_entry/flag/revival_pod_plants diff --git a/code/game/objects/items/devices/communicator/communicator.dm b/code/game/objects/items/devices/communicator/communicator.dm index 56209fc53c..cb0b7e7b7a 100644 --- a/code/game/objects/items/devices/communicator/communicator.dm +++ b/code/game/objects/items/devices/communicator/communicator.dm @@ -279,11 +279,10 @@ var/global/list/obj/item/communicator/all_communicators = list() // Parameters: None // Description: Removes the ghost's address and nulls the exonet datum, to allow qdel()ing. /mob/observer/dead/Destroy() - . = ..() if(exonet) exonet.remove_address() qdel_null(exonet) - return ..() + . = ..() // Proc: register_device() // Parameters: 1 (user - the person to use their name for) diff --git a/code/modules/mob/mob_planes_vr.dm b/code/modules/mob/mob_planes_vr.dm index 9f5b30f579..9928180070 100644 --- a/code/modules/mob/mob_planes_vr.dm +++ b/code/modules/mob/mob_planes_vr.dm @@ -21,8 +21,9 @@ my_mob = M /obj/screen/plane_master/augmented/Destroy() + entopic_users -= my_mob my_mob = null - return ..() + . = ..() /obj/screen/plane_master/augmented/set_visibility(var/want = FALSE) . = ..() diff --git a/config/example/game_options.txt b/config/example/game_options.txt index 67322ac49a..f5b43ecb36 100644 --- a/config/example/game_options.txt +++ b/config/example/game_options.txt @@ -18,12 +18,12 @@ BONES_CAN_BREAK 1 LIMBS_CAN_BREAK 1 ## multiplier which enables organs to take more damage before bones breaking or limbs being destroyed -## 100 means normal, 50 means half -ORGAN_HEALTH_MULTIPLIER 100 +## 1.0 means normal, 0.5 means half +ORGAN_HEALTH_MULTIPLIER 1.0 ## multiplier which influences how fast organs regenerate naturally -## 100 means normal, 50 means half -ORGAN_REGENERATION_MULTIPLIER 50 +## 1.0 means normal, 0.5 means half +ORGAN_REGENERATION_MULTIPLIER 0.5 ### REVIVAL ### From 5fb49d6f96dad1b7bb51f93df5d5508dc4f49636 Mon Sep 17 00:00:00 2001 From: ShadowLarkens Date: Mon, 4 Nov 2024 02:41:29 -0800 Subject: [PATCH 10/36] =?UTF-8?q?Make=20vore=20panel=20layout=20better=20f?= =?UTF-8?q?or=20long=20belly=20descriptions=20in=20the=20insi=E2=80=A6=20(?= =?UTF-8?q?#16556)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Make vore panel layout better for long belly descriptions in the inside panel. * Even more layout tweaks. --- .../VoreBellySelectionAndCustomization.tsx | 15 ++-- .../interfaces/VorePanel/VoreInsidePanel.tsx | 2 +- .../VorePanel/VoreUserPreferences.tsx | 6 +- .../tgui/interfaces/VorePanel/index.tsx | 87 +++++++++++-------- 4 files changed, 63 insertions(+), 47 deletions(-) diff --git a/tgui/packages/tgui/interfaces/VorePanel/VoreBellySelectionAndCustomization.tsx b/tgui/packages/tgui/interfaces/VorePanel/VoreBellySelectionAndCustomization.tsx index 3e30618ae8..c576608120 100644 --- a/tgui/packages/tgui/interfaces/VorePanel/VoreBellySelectionAndCustomization.tsx +++ b/tgui/packages/tgui/interfaces/VorePanel/VoreBellySelectionAndCustomization.tsx @@ -1,7 +1,8 @@ import { BooleanLike } from 'common/react'; +import { Stack } from 'tgui-core/components'; import { useBackend } from '../../backend'; -import { Box, Divider, Flex, Icon, Section, Tabs } from '../../components'; +import { Box, Divider, Icon, Section, Tabs } from '../../components'; import { digestModeToColor } from './constants'; import { bellyData, hostMob, selectedData } from './types'; import { VoreSelectedBelly } from './VoreSelectedBelly'; @@ -17,8 +18,8 @@ export const VoreBellySelectionAndCustomization = (props: { const { our_bellies, selected, show_pictures, host_mobtype } = props; return ( - - + +
act('newbelly')}> @@ -54,8 +55,8 @@ export const VoreBellySelectionAndCustomization = (props: { ))}
-
- + + {selected && (
)} -
-
+ + ); }; diff --git a/tgui/packages/tgui/interfaces/VorePanel/VoreInsidePanel.tsx b/tgui/packages/tgui/interfaces/VorePanel/VoreInsidePanel.tsx index 538ed71c13..b5bba05f06 100644 --- a/tgui/packages/tgui/interfaces/VorePanel/VoreInsidePanel.tsx +++ b/tgui/packages/tgui/interfaces/VorePanel/VoreInsidePanel.tsx @@ -19,7 +19,7 @@ export const VoreInsidePanel = (props: { } return ( -
+
You are currently {absorbed ? 'absorbed into' : 'inside'} diff --git a/tgui/packages/tgui/interfaces/VorePanel/VoreUserPreferences.tsx b/tgui/packages/tgui/interfaces/VorePanel/VoreUserPreferences.tsx index 0f10b6e0e3..f6ff55f268 100644 --- a/tgui/packages/tgui/interfaces/VorePanel/VoreUserPreferences.tsx +++ b/tgui/packages/tgui/interfaces/VorePanel/VoreUserPreferences.tsx @@ -1,7 +1,7 @@ import { BooleanLike } from 'common/react'; import { useBackend } from '../../backend'; -import { Box, Button, Divider, Flex, Section } from '../../components'; +import { Button, Divider, Flex, Section } from '../../components'; import { prefData } from './types'; import { VoreUserPreferencesAesthetic } from './VoreUserPreferencesTabs/VoreUserPreferencesAesthetic '; import { VoreUserPreferencesMechanical } from './VoreUserPreferencesTabs/VoreUserPreferencesMechanical '; @@ -442,7 +442,7 @@ export const VoreUserPreferences = (props: { }; return ( - +
-
+
); }; diff --git a/tgui/packages/tgui/interfaces/VorePanel/index.tsx b/tgui/packages/tgui/interfaces/VorePanel/index.tsx index ad2547cf08..9cf7a76a6b 100644 --- a/tgui/packages/tgui/interfaces/VorePanel/index.tsx +++ b/tgui/packages/tgui/interfaces/VorePanel/index.tsx @@ -1,4 +1,5 @@ import { useState } from 'react'; +import { Stack } from 'tgui-core/components'; import { useBackend } from '../../backend'; import { Button, Flex, Icon, NoticeBox, Tabs } from '../../components'; @@ -38,42 +39,56 @@ export const VorePanel = (props) => { return ( - {(data.unsaved_changes && ( - - - Warning: Unsaved Changes! - - - - - - - - - )) || - ''} - - - setTabIndex(0)}> - Bellies - - - setTabIndex(1)}> - Preferences - - - - {tabs[tabIndex] || 'Error'} + + + {(data.unsaved_changes && ( + + + Warning: Unsaved Changes! + + + + + + + + + )) || + ''} + + 500 ? '30%' : '20%'}> + + + + + setTabIndex(0)} + > + Bellies + + + setTabIndex(1)} + > + Preferences + + + + + {tabs[tabIndex] || 'Error'} + ); From 4879a52633778bc3287012aa548586bd1dfbb6fc Mon Sep 17 00:00:00 2001 From: Kashargul <144968721+Kashargul@users.noreply.github.com> Date: Mon, 4 Nov 2024 11:44:44 +0100 Subject: [PATCH 11/36] Server maint subsystem (#16518) * upports server maint subsystem * fix runtime in admin z narrate * . * sorts them verbs * . * . * Update code/controllers/subsystems/statpanel.dm Co-authored-by: Selis <12716288+ItsSelis@users.noreply.github.com> * Update code/controllers/subsystems/server_maint.dm Co-authored-by: Selis <12716288+ItsSelis@users.noreply.github.com> --------- Co-authored-by: Selis <12716288+ItsSelis@users.noreply.github.com> --- .gitignore | 1 + code/ATMOSPHERICS/_atmospherics_helpers.dm | 4 +- code/ZAS/Diagnostic.dm | 8 +- code/__defines/subsystems.dm | 3 +- code/_helpers/_lists.dm | 7 ++ code/_onclick/hud/human.dm | 2 +- code/_onclick/observer.dm | 2 +- code/_onclick/rig.dm | 2 +- .../configuration/entries/general.dm | 7 +- code/controllers/subsystems/plants.dm | 2 +- code/controllers/subsystems/server_maint.dm | 115 ++++++++++++++++++ code/controllers/subsystems/statpanel.dm | 2 +- code/controllers/subsystems/vote.dm | 2 +- code/controllers/verbs.dm | 6 +- code/datums/helper_datums/getrev.dm | 2 +- .../managed_browsers/feedback_viewer.dm | 2 +- code/game/antagonist/antagonist_factions.dm | 4 +- code/game/antagonist/antagonist_objectives.dm | 2 +- code/game/gamemodes/cult/ritual.dm | 2 +- .../gamemodes/events/holidays/Holidays.dm | 2 +- code/game/gamemodes/game_mode.dm | 2 +- code/game/machinery/camera/tracking.dm | 10 +- code/game/machinery/computer/ai_core.dm | 2 +- code/game/magic/archived_book.dm | 2 +- .../micro/mecha_construction_paths_vr.dm | 2 +- .../objects/effects/spawners/bombspawner.dm | 4 +- .../items/devices/communicator/integrated.dm | 2 +- .../items/devices/communicator/messaging.dm | 4 +- .../items/devices/communicator/phone.dm | 2 +- code/game/response_team.dm | 4 +- code/game/trader_visit.dm | 4 +- code/modules/admin/DB ban/functions.dm | 2 +- code/modules/admin/ToRban.dm | 2 +- code/modules/admin/admin.dm | 91 +++++++------- code/modules/admin/admin_investigate.dm | 2 +- code/modules/admin/admin_memo.dm | 2 +- code/modules/admin/admin_report.dm | 4 +- code/modules/admin/admin_tools.dm | 4 +- code/modules/admin/admin_verbs.dm | 68 +++++------ code/modules/admin/admin_verbs_vr.dm | 8 +- code/modules/admin/admin_vr.dm | 4 +- code/modules/admin/callproc/callproc.dm | 4 +- code/modules/admin/ckey_vr.dm | 2 +- code/modules/admin/holder2.dm | 2 +- code/modules/admin/map_capture.dm | 2 +- code/modules/admin/news.dm | 4 +- .../admin/permissionverbs/permissionedit.dm | 2 +- code/modules/admin/persistence.dm | 4 +- code/modules/admin/verbs/SDQL2/SDQL_2.dm | 2 +- code/modules/admin/verbs/adminhelp.dm | 2 +- code/modules/admin/verbs/adminjump.dm | 18 +-- code/modules/admin/verbs/adminsay.dm | 6 +- code/modules/admin/verbs/antag-ooc.dm | 2 +- code/modules/admin/verbs/change_appearance.dm | 6 +- .../admin/verbs/check_customitem_activity.dm | 2 +- code/modules/admin/verbs/cinematic.dm | 2 +- code/modules/admin/verbs/custom_event.dm | 4 +- code/modules/admin/verbs/deadsay.dm | 2 +- code/modules/admin/verbs/debug.dm | 50 ++++---- code/modules/admin/verbs/debug_vr.dm | 2 +- code/modules/admin/verbs/diagnostics.dm | 18 +-- code/modules/admin/verbs/dice.dm | 4 +- code/modules/admin/verbs/entity_narrate.dm | 8 +- code/modules/admin/verbs/event_triggers.dm | 2 +- code/modules/admin/verbs/fps.dm | 2 +- code/modules/admin/verbs/get_player_status.dm | 2 +- code/modules/admin/verbs/getlogs.dm | 4 +- code/modules/admin/verbs/grief_fixers.dm | 2 +- code/modules/admin/verbs/lightning_strike.dm | 2 +- .../admin/verbs/map_template_loadverb.dm | 6 +- code/modules/admin/verbs/mapping.dm | 10 +- code/modules/admin/verbs/modify_robot.dm | 6 +- code/modules/admin/verbs/panicbunker.dm | 6 +- code/modules/admin/verbs/playsound.dm | 30 ++--- code/modules/admin/verbs/pray.dm | 2 +- code/modules/admin/verbs/randomverbs.dm | 66 +++++----- code/modules/admin/verbs/randomverbs_vr.dm | 10 +- code/modules/admin/verbs/resize.dm | 2 +- code/modules/admin/verbs/smite.dm | 2 +- code/modules/admin/verbs/striketeam.dm | 2 +- code/modules/admin/verbs/tripAI.dm | 2 +- .../admin/view_variables/view_variables.dm | 2 +- code/modules/asset_cache/asset_list.dm | 2 +- code/modules/client/client defines.dm | 5 + code/modules/client/client procs.dm | 12 +- code/modules/client/movement.dm | 5 +- .../volume_sliders/01_volume.dm | 2 +- .../client/preferences_toggle_procs.dm | 8 +- code/modules/client/preferences_vr.dm | 2 +- code/modules/client/ui_style.dm | 2 +- code/modules/client/verbs/advanced_who.dm | 2 +- .../client/verbs/character_directory.dm | 2 +- code/modules/client/verbs/ignore.dm | 4 +- code/modules/client/verbs/ooc.dm | 6 +- code/modules/client/verbs/ping.dm | 17 ++- code/modules/client/verbs/suicide.dm | 2 +- code/modules/client/verbs/who.dm | 2 +- code/modules/clothing/clothing.dm | 2 +- code/modules/clothing/masks/monitor.dm | 2 +- .../gm_interfaces/fake_pda_conversations.dm | 2 +- .../eventkit/gm_interfaces/mob_spawner.dm | 2 +- code/modules/events/event_manager.dm | 4 +- code/modules/examine/examine.dm | 4 +- code/modules/flufftext/look_up.dm | 2 +- code/modules/food/recipe_dump.dm | 2 +- code/modules/media/mediamanager.dm | 2 +- code/modules/mentor/mentor.dm | 8 +- code/modules/mentor/mentorhelp.dm | 2 +- code/modules/mining/abandonedcrates_vr.dm | 2 +- code/modules/mob/autowhisper.dm | 4 +- code/modules/mob/dead/observer/free_vr.dm | 2 +- code/modules/mob/dead/observer/observer.dm | 54 ++++---- code/modules/mob/dead/observer/observer_vr.dm | 10 +- code/modules/mob/freelook/ai/eye.dm | 4 +- code/modules/mob/language/language.dm | 2 +- code/modules/mob/language/snowflake.dm | 2 +- code/modules/mob/living/autohiss.dm | 2 +- .../living/carbon/alien/diona/diona_powers.dm | 4 +- .../mob/living/carbon/alien/progression.dm | 2 +- code/modules/mob/living/carbon/brain/brain.dm | 2 +- .../mob/living/carbon/carbon_powers.dm | 6 +- code/modules/mob/living/carbon/give.dm | 2 +- code/modules/mob/living/carbon/human/emote.dm | 4 +- .../mob/living/carbon/human/emote_vr.dm | 10 +- code/modules/mob/living/carbon/human/human.dm | 10 +- .../living/carbon/human/human_attackhand.dm | 2 +- .../carbon/human/human_attackhand_vr.dm | 2 +- .../mob/living/carbon/human/human_powers.dm | 20 +-- .../living/carbon/human/human_powers_vr.dm | 4 +- .../human/species/species_shapeshift.dm | 12 +- .../human/species/species_shapeshift_vr.dm | 8 +- .../carbon/human/species/station/alraune.dm | 2 +- .../human/species/station/prometheans_vr.dm | 2 +- .../human/species/station/prommie_blob.dm | 8 +- .../station/station_special_abilities_vr.dm | 52 ++++---- .../station/traits_vr/traits_tutorial.dm | 2 +- .../human/species/virtual_reality/avatar.dm | 4 +- .../human/species/xenomorphs/alien_powers.dm | 20 +-- .../mob/living/carbon/human/update_icons.dm | 6 +- code/modules/mob/living/carbon/lick_wounds.dm | 2 +- code/modules/mob/living/default_language.dm | 4 +- code/modules/mob/living/living.dm | 12 +- code/modules/mob/living/living_powers.dm | 2 +- code/modules/mob/living/living_vr.dm | 10 +- code/modules/mob/living/riding.dm | 2 +- code/modules/mob/living/silicon/ai/ai.dm | 32 ++--- .../living/silicon/ai/ai_remote_control.dm | 2 +- .../modules/mob/living/silicon/ai/latejoin.dm | 2 +- code/modules/mob/living/silicon/ai/laws.dm | 4 +- code/modules/mob/living/silicon/pai/admin.dm | 2 +- code/modules/mob/living/silicon/pai/pai.dm | 18 +-- code/modules/mob/living/silicon/pai/pai_vr.dm | 16 +-- .../mob/living/silicon/pai/software.dm | 2 +- .../mob/living/silicon/robot/drone/drone.dm | 2 +- .../silicon/robot/drone/drone_manufacturer.dm | 2 +- .../modules/mob/living/silicon/robot/robot.dm | 14 +-- code/modules/mob/living/silicon/silicon.dm | 4 +- .../mob/living/simple_mob/simple_mob.dm | 6 +- .../mob/living/simple_mob/simple_mob_vr.dm | 4 +- .../subtypes/animal/alien animals/catslug.dm | 4 +- .../subtypes/animal/alien animals/stardog.dm | 12 +- .../subtypes/animal/alien animals/teppi.dm | 4 +- .../simple_mob/subtypes/animal/animal.dm | 2 +- .../subtypes/animal/borer/borer_powers.dm | 14 +-- .../simple_mob/subtypes/animal/pets/cat.dm | 2 +- .../simple_mob/subtypes/animal/pets/fox_vr.dm | 4 +- .../subtypes/animal/sif/grafadreka.dm | 6 +- .../simple_mob/subtypes/animal/sif/kururak.dm | 6 +- .../simple_mob/subtypes/animal/sif/leech.dm | 10 +- .../simple_mob/subtypes/animal/sif/racoon.dm | 4 +- .../simple_mob/subtypes/animal/sif/savik.dm | 2 +- .../simple_mob/subtypes/animal/sif/shantak.dm | 2 +- .../simple_mob/subtypes/animal/space/bear.dm | 2 +- .../simple_mob/subtypes/animal/space/goose.dm | 2 +- .../subtypes/animal/space/space_vr.dm | 2 +- .../simple_mob/subtypes/animal/space/worm.dm | 2 +- .../simple_mob/subtypes/animal/squirrel.dm | 2 +- .../subtypes/mechanical/mecha/durand.dm | 2 +- .../simple_mob/subtypes/vore/bigdragon.dm | 10 +- .../subtypes/vore/demon/demon_abilities.dm | 4 +- .../subtypes/vore/dominated_brain.dm | 12 +- .../simple_mob/subtypes/vore/leopardmander.dm | 2 +- .../mobs_monsters/clowns/honkelemental.dm | 2 +- .../simple_mob/subtypes/vore/morph/morph.dm | 4 +- .../simple_mob/subtypes/vore/sect_drone.dm | 2 +- .../simple_mob/subtypes/vore/sect_queen.dm | 2 +- .../living/simple_mob/subtypes/vore/vore.dm | 4 +- code/modules/mob/mob.dm | 16 +-- code/modules/mob/new_player/skill.dm | 2 +- .../mob/new_player/sprite_accessories_taur.dm | 2 +- .../new_player/sprite_accessories_taur_vr.dm | 2 +- code/modules/mob/say.dm | 6 +- code/modules/mob/say_vr.dm | 12 +- code/modules/multiz/movement.dm | 4 +- code/modules/multiz/movement_vr.dm | 2 +- code/modules/nifsoft/nif.dm | 2 +- code/modules/nifsoft/nif_tgui.dm | 2 +- .../nifsoft/software/13_soulcatcher.dm | 6 +- code/modules/organs/internal/eyes.dm | 2 +- code/modules/paperwork/silicon_photography.dm | 6 +- code/modules/pda/ai.dm | 2 +- .../player_tips_controller_vr.dm | 2 +- .../power/supermatter/setup_supermatter.dm | 2 +- .../projectiles/targeting/targeting_mob.dm | 2 +- code/modules/random_map/drop/droppod.dm | 2 +- code/modules/random_map/drop/supply.dm | 2 +- code/modules/random_map/random_map_verbs.dm | 10 +- code/modules/reagents/Chemistry-Logging.dm | 2 +- .../machinery/dispenser/cartridge_spawn.dm | 2 +- code/modules/shieldgen/directional_shield.dm | 2 - code/modules/tgchat/chat_verbs.dm | 2 +- code/modules/tgui/external.dm | 2 +- code/modules/tgui_panel/external.dm | 4 +- code/modules/vchat/vchat_client.dm | 2 +- code/modules/ventcrawl/ventcrawl_multiz.dm | 6 +- code/modules/ventcrawl/ventcrawl_verb.dm | 2 +- code/modules/virus2/admin.dm | 2 +- code/modules/vore/chat_healthbars.dm | 2 +- code/modules/vore/eating/belly_import.dm | 4 +- code/modules/vore/eating/inbelly_spawn.dm | 2 +- code/modules/vore/eating/living_vr.dm | 24 ++-- code/modules/vore/eating/silicon_vr.dm | 4 +- code/modules/vore/eating/simple_animal_vr.dm | 6 +- code/modules/vore/eating/vertical_nom_vr.dm | 2 +- code/modules/vore/eating/vorepanel_vr.dm | 2 +- code/modules/vore/resizing/resize_vr.dm | 4 +- code/modules/whitelist/whitelist.dm | 2 +- interface/interface.dm | 4 +- tools/localhost-asset-webroot-server.py | 15 +++ vorestation.dme | 1 + 230 files changed, 842 insertions(+), 691 deletions(-) create mode 100644 code/controllers/subsystems/server_maint.dm create mode 100644 tools/localhost-asset-webroot-server.py diff --git a/.gitignore b/.gitignore index f11d80fbec..d87340a7fa 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,7 @@ cfg/ #Ignore everything in datafolder and subdirectories /data/**/* /tmp/**/* +/cache/**/* #Visual studio stuff *.vscode/* diff --git a/code/ATMOSPHERICS/_atmospherics_helpers.dm b/code/ATMOSPHERICS/_atmospherics_helpers.dm index 76b520a45f..da777c2581 100644 --- a/code/ATMOSPHERICS/_atmospherics_helpers.dm +++ b/code/ATMOSPHERICS/_atmospherics_helpers.dm @@ -17,7 +17,7 @@ /client/proc/atmos_toggle_debug(var/obj/machinery/atmospherics/M in view()) set name = "Toggle Debug Messages" - set category = "Debug" + set category = "Debug.Misc" M.debug = !M.debug to_chat(usr, "[M]: Debug messages toggled [M.debug? "on" : "off"].") @@ -439,7 +439,7 @@ var/sink_heat_capacity = sink.heat_capacity() var/transfer_heat_capacity = source.heat_capacity()*estimate_moles/source_total_moles air_temperature = (sink.temperature*sink_heat_capacity + source.temperature*transfer_heat_capacity) / (sink_heat_capacity + transfer_heat_capacity) - + //get the number of moles that would have to be transfered to bring sink to the target pressure return pressure_delta*output_volume/(air_temperature * R_IDEAL_GAS_EQUATION) diff --git a/code/ZAS/Diagnostic.dm b/code/ZAS/Diagnostic.dm index fba2456802..7126588a30 100644 --- a/code/ZAS/Diagnostic.dm +++ b/code/ZAS/Diagnostic.dm @@ -1,5 +1,5 @@ /client/proc/ZoneTick() - set category = "Debug" + set category = "Debug.Misc" set name = "Process Atmos" set desc = "Manually run a single tick of the air subsystem" @@ -17,7 +17,7 @@ */ /client/proc/Zone_Info(turf/T as null|turf) - set category = "Debug" + set category = "Debug.Misc" if(T) if(istype(T,/turf/simulated) && T:zone) T:zone:dbg_data(src) @@ -36,7 +36,7 @@ /client/var/list/zone_debug_images /client/proc/Test_ZAS_Connection(var/turf/simulated/T as turf) - set category = "Debug" + set category = "Debug.Misc" if(!istype(T)) return @@ -95,6 +95,6 @@ to_chat(mob, "both turfs can merge.") /client/proc/ZASSettings() - set category = "Debug" + set category = "Debug.Dangerous" vsc.SetDefault(mob) diff --git a/code/__defines/subsystems.dm b/code/__defines/subsystems.dm index 533d2c810c..313da615bd 100644 --- a/code/__defines/subsystems.dm +++ b/code/__defines/subsystems.dm @@ -116,7 +116,7 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G // Subsystem init_order, from highest priority to lowest priority // Subsystems shutdown in the reverse of the order they initialize in // The numbers just define the ordering, they are meaningless otherwise. - +#define INIT_ORDER_SERVER_MAINT 93 #define INIT_ORDER_WEBHOOKS 50 #define INIT_ORDER_SQLITE 40 #define INIT_ORDER_GARBAGE 39 @@ -169,6 +169,7 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G #define FIRE_PRIORITY_VOTE 8 #define FIRE_PRIORITY_INSTRUMENTS 9 #define FIRE_PRIORITY_PING 10 +#define FIRE_PRIORITY_SERVER_MAINT 10 #define FIRE_PRIORITY_AI 10 #define FIRE_PRIORITY_GARBAGE 15 #define FIRE_PRIORITY_ASSETS 20 diff --git a/code/_helpers/_lists.dm b/code/_helpers/_lists.dm index cb8c989845..b71b20e037 100644 --- a/code/_helpers/_lists.dm +++ b/code/_helpers/_lists.dm @@ -209,6 +209,13 @@ result = first - second return result +/** + * Removes any null entries from the list + * Returns TRUE if the list had nulls, FALSE otherwise +**/ +/proc/list_clear_nulls(list/list_to_clear) + return (list_to_clear.RemoveAll(null) > 0) + /* Two lists may be different (A!=B) even if they have the same elements. This actually tests if they have the same entries and values. diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 9a7c8e200d..1f5fc4f497 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -396,7 +396,7 @@ HUD.inventory_shown = 0 /mob/living/carbon/human/verb/toggle_hotkey_verbs() - set category = "OOC" + set category = "OOC.Client Settings" set name = "Toggle hotkey buttons" set desc = "This disables or enables the user interface buttons which can be used with hotkeys." diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm index f8dc673b5f..7e0f0bdc69 100644 --- a/code/_onclick/observer.dm +++ b/code/_onclick/observer.dm @@ -2,7 +2,7 @@ /mob/observer/dead/verb/toggle_inquisition() // warning: unexpected inquisition set name = "Toggle Inquisitiveness" set desc = "Sets whether your ghost examines everything on click by default" - set category = "Ghost" + set category = "Ghost.Settings" if(!client) return client.inquisitive_ghost = !client.inquisitive_ghost if(client.inquisitive_ghost) diff --git a/code/_onclick/rig.dm b/code/_onclick/rig.dm index dc57ad2150..6ca619c767 100644 --- a/code/_onclick/rig.dm +++ b/code/_onclick/rig.dm @@ -10,7 +10,7 @@ /client/verb/toggle_hardsuit_mode() set name = "Toggle Hardsuit Activation Mode" set desc = "Switch between hardsuit activation modes." - set category = "OOC" + set category = "OOC.Game Settings" hardsuit_click_mode++ if(hardsuit_click_mode > MAX_HARDSUIT_CLICK_MODE) diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index 981e59067f..0b145d4be5 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -549,13 +549,12 @@ /datum/config_entry/flag/persistence_ignore_mapload /datum/config_entry/flag/allow_byond_links - default = TRUE //CHOMP Edit turned this on - + default = TRUE /datum/config_entry/flag/allow_discord_links - default = TRUE //CHOMP Edit turned this on + default = TRUE /datum/config_entry/flag/allow_url_links - default = TRUE // honestly if I were you i'd leave this one off, only use in dire situations //CHOMP Edit: pussy. + default = TRUE // honestly if I were you i'd leave this one off, only use in dire situations /datum/config_entry/flag/starlight // Whether space turfs have ambient light or not diff --git a/code/controllers/subsystems/plants.dm b/code/controllers/subsystems/plants.dm index af4815395e..dc3c059bd7 100644 --- a/code/controllers/subsystems/plants.dm +++ b/code/controllers/subsystems/plants.dm @@ -147,7 +147,7 @@ SUBSYSTEM_DEF(plants) // Debug for testing seed genes. /client/proc/show_plant_genes() - set category = "Debug" + set category = "Debug.Investigate" set name = "Show Plant Genes" set desc = "Prints the round's plant gene masks." diff --git a/code/controllers/subsystems/server_maint.dm b/code/controllers/subsystems/server_maint.dm new file mode 100644 index 0000000000..e8d10d6748 --- /dev/null +++ b/code/controllers/subsystems/server_maint.dm @@ -0,0 +1,115 @@ +#define PING_BUFFER_TIME 25 + +SUBSYSTEM_DEF(server_maint) + name = "Server Tasks" + wait = 6 + flags = SS_POST_FIRE_TIMING + priority = FIRE_PRIORITY_SERVER_MAINT + init_order = INIT_ORDER_SERVER_MAINT + //init_stage = INITSTAGE_EARLY + runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT + var/list/currentrun + ///Associated list of list names to lists to clear of nulls + var/list/lists_to_clear + ///Delay between list clearings in ticks + var/delay = 5 + var/cleanup_ticker = 0 + +/*/datum/controller/subsystem/server_maint/PreInit() + world.hub_password = "" *///quickly! before the hubbies see us. + +/datum/controller/subsystem/server_maint/New() + if (fexists("tmp/")) + fdel("tmp/") + //if (CONFIG_GET(flag/hub)) + //world.update_hub_visibility(TRUE) + //Keep in mind, because of how delay works adding a list here makes each list take wait * delay more time to clear + //Do it for stuff that's properly important, and shouldn't have null checks inside its other uses + lists_to_clear = list( + "player_list" = global.player_list, + "mob_list" = global.mob_list, + "living_mob_list" = global.living_mob_list, + "dead_mob_list" = global.dead_mob_list, + "observer_mob_list" = global.observer_mob_list, + "listening_objects" = global.listening_objects, + "human_mob_list" = global.human_mob_list, + "silicon_mob_list" = global.silicon_mob_list, + "ai_list" = global.ai_list, + //"keyloop_list" = global.keyloop_list, //A null here will cause new clients to be unable to move. totally unacceptable + ) + + /*var/datum/tgs_version/tgsversion = world.TgsVersion() + if(tgsversion) + SSblackbox.record_feedback("text", "server_tools", 1, tgsversion.raw_parameter)*/ + + return SS_INIT_SUCCESS + +/datum/controller/subsystem/server_maint/fire(resumed = FALSE) + if(!resumed) + if(list_clear_nulls(GLOB.clients)) + log_world("Found a null in clients list!") + src.currentrun = GLOB.clients.Copy() + + var/position_in_loop = (cleanup_ticker / delay) + 1 //Index at 1, thanks byond + + if(!(position_in_loop % 1)) //If it's a whole number + var/listname = lists_to_clear[position_in_loop] + if(list_clear_nulls(lists_to_clear[listname])) + log_world("Found a null in [listname]!") + + cleanup_ticker++ + + var/amount_to_work = length(lists_to_clear) + if(cleanup_ticker >= amount_to_work * delay) //If we've already done a loop, reset + cleanup_ticker = 0 + + var/list/currentrun = src.currentrun + //var/round_started = SSticker.HasRoundStarted() + + //var/kick_inactive = CONFIG_GET(flag/kick_inactive) + //var/afk_period + //if(kick_inactive) + //afk_period = CONFIG_GET(number/afk_period) + for(var/I in currentrun) + var/client/C = I + //handle kicking inactive players + /*if(round_started && kick_inactive && !C.holder && C.is_afk(afk_period)) + var/cmob = C.mob + if (!isnewplayer(cmob) || !SSticker.queued_players.Find(cmob)) + log_access("AFK: [key_name(C)]") + to_chat(C, span_userdanger("You have been inactive for more than [DisplayTimeText(afk_period)] and have been disconnected.") + "
" + span_danger("You may reconnect via the button in the file menu or by " + span_bold(span_underline("clicking here to reconnect")" + ".")) + QDEL_IN(C, 1) //to ensure they get our message before getting disconnected + continue*/ + + if (!(!C || world.time - C.connection_time < PING_BUFFER_TIME || C.inactivity >= (wait-1))) + winset(C, null, "command=.update_ping+[num2text(world.time+world.tick_lag*TICK_USAGE_REAL/100, 32)]") + + if (MC_TICK_CHECK) //one day, when ss13 has 1000 people per server, you guys are gonna be glad I added this tick check + return + +/datum/controller/subsystem/server_maint/Shutdown() + if (fexists("tmp/")) + fdel("tmp/") + //kick_clients_in_lobby(span_boldannounce("The round came to an end with you in the lobby."), TRUE) //second parameter ensures only afk clients are kicked + var/server = CONFIG_GET(string/server) + for(var/thing in GLOB.clients) + if(!thing) + continue + var/client/C = thing + C?.tgui_panel?.send_roundrestart() + if(server) //if you set a server location in config.txt, it sends you there instead of trying to reconnect to the same world address. -- NeoFite + C << link("byond://[server]") + +/* +/datum/controller/subsystem/server_maint/proc/UpdateHubStatus() + if(!CONFIG_GET(flag/hub) || !CONFIG_GET(number/max_hub_pop)) + return FALSE //no point, hub / auto hub controls are disabled + + var/max_pop = CONFIG_GET(number/max_hub_pop) + + if(GLOB.clients.len > max_pop) + world.update_hub_visibility(FALSE) + else + world.update_hub_visibility(TRUE) +*/ +#undef PING_BUFFER_TIME diff --git a/code/controllers/subsystems/statpanel.dm b/code/controllers/subsystems/statpanel.dm index f0cd7555f6..42c1ecd5f2 100644 --- a/code/controllers/subsystems/statpanel.dm +++ b/code/controllers/subsystems/statpanel.dm @@ -136,7 +136,7 @@ SUBSYSTEM_DEF(statpanels) target.stat_panel.send_message("update_stat", list( global_data = global_data, - ping_str = "Ping: -- Not Available --", // [round(target.lastping, 1)]ms (Average: [round(target.avgping, 1)]ms)", + ping_str = "Ping: [round(target.lastping, 1)]ms (Average: [round(target.avgping, 1)]ms)", other_str = target.mob?.get_status_tab_items(), )) diff --git a/code/controllers/subsystems/vote.dm b/code/controllers/subsystems/vote.dm index 102ffe5028..19030913c8 100644 --- a/code/controllers/subsystems/vote.dm +++ b/code/controllers/subsystems/vote.dm @@ -392,7 +392,7 @@ SUBSYSTEM_DEF(vote) usr.client.vote() /client/verb/vote() - set category = "OOC" + set category = "OOC.Game" set name = "Vote" if(SSvote) diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm index fee7da9b85..702dbfddae 100644 --- a/code/controllers/verbs.dm +++ b/code/controllers/verbs.dm @@ -38,7 +38,7 @@ // Debug verbs. /client/proc/restart_controller(controller in list("Master", "Failsafe")) - set category = "Debug" + set category = "Debug.Dangerous" set name = "Restart Controller" set desc = "Restart one of the various periodic loop controllers for the game (be careful!)" @@ -55,7 +55,7 @@ message_admins("Admin [key_name_admin(usr)] has restarted the [controller] controller.") /client/proc/debug_antagonist_template(antag_type in all_antag_types) - set category = "Debug" + set category = "Debug.Investigate" set name = "Debug Antagonist" set desc = "Debug an antagonist template." @@ -65,7 +65,7 @@ message_admins("Admin [key_name_admin(usr)] is debugging the [antag.role_text] template.") /client/proc/debug_controller() - set category = "Debug" + set category = "Debug.Investigate" set name = "Debug Controller" set desc = "Debug the various subsystems/controllers for the game (be careful!)" diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm index 626e65bbd2..854e6db9ce 100644 --- a/code/datums/helper_datums/getrev.dm +++ b/code/datums/helper_datums/getrev.dm @@ -51,7 +51,7 @@ . += "#[tm.number][details]" /client/verb/showrevinfo() - set category = "OOC" + set category = "OOC.Game" set name = "Show Server Revision" set desc = "Check the current server code revision" diff --git a/code/datums/managed_browsers/feedback_viewer.dm b/code/datums/managed_browsers/feedback_viewer.dm index 078e2ca851..eca1fff099 100644 --- a/code/datums/managed_browsers/feedback_viewer.dm +++ b/code/datums/managed_browsers/feedback_viewer.dm @@ -2,7 +2,7 @@ var/datum/managed_browser/feedback_viewer/feedback_viewer = null /datum/admins/proc/view_feedback() - set category = "Admin" + set category = "Admin.Misc" set name = "View Feedback" set desc = "Open the Feedback Viewer" diff --git a/code/game/antagonist/antagonist_factions.dm b/code/game/antagonist/antagonist_factions.dm index b16179f292..b1ee3e16e5 100644 --- a/code/game/antagonist/antagonist_factions.dm +++ b/code/game/antagonist/antagonist_factions.dm @@ -1,6 +1,6 @@ /mob/living/proc/convert_to_rev(mob/M as mob in oview(src)) set name = "Convert Bourgeoise" - set category = "Abilities" + set category = "Abilities.Antag" if(!M.mind) return convert_to_faction(M.mind, revs) @@ -44,7 +44,7 @@ /mob/living/proc/convert_to_loyalist(mob/M as mob in oview(src)) set name = "Convert Recidivist" - set category = "Abilities" + set category = "Abilities.Antag" if(!M.mind) return convert_to_faction(M.mind, loyalists) diff --git a/code/game/antagonist/antagonist_objectives.dm b/code/game/antagonist/antagonist_objectives.dm index b8a5af5ada..f05219465a 100644 --- a/code/game/antagonist/antagonist_objectives.dm +++ b/code/game/antagonist/antagonist_objectives.dm @@ -32,7 +32,7 @@ /mob/living/proc/write_ambition() set name = "Set Ambition" - set category = "IC" + set category = "IC.Antag" set src = usr if(!mind) diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index 597813550b..6883220bac 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -6,7 +6,7 @@ var/global/list/engwords = list("travel", "blood", "join", "hell", "destroy", "t var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa","mgar","balaq", "karazet", "geeri") /client/proc/check_words() // -- Urist - set category = "Special Verbs" + set category = "Admin.Secrets" set name = "Check Rune Words" set desc = "Check the rune-word meaning" if(!cultwords["travel"]) diff --git a/code/game/gamemodes/events/holidays/Holidays.dm b/code/game/gamemodes/events/holidays/Holidays.dm index 7efae68f8d..68b9a0cdf8 100644 --- a/code/game/gamemodes/events/holidays/Holidays.dm +++ b/code/game/gamemodes/events/holidays/Holidays.dm @@ -239,7 +239,7 @@ var/global/list/Holiday = list() //Holidays are lists now, so we can have more t //Allows GA and GM to set the Holiday variable /client/proc/Set_Holiday() set name = "Set Holiday" - set category = "Fun" + set category = "Fun.Event Kit" set desc = "Force-set the Holiday variable to make the game think it's a certain day." if(!check_rights(R_SERVER)) return diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 63da8cc334..51e3a508ac 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -546,7 +546,7 @@ var/global/list/additional_antag_types = list() /mob/verb/check_round_info() set name = "Check Round Info" - set category = "OOC" + set category = "OOC.Game" if(!ticker || !ticker.mode) to_chat(usr, span_warning("Something is terribly wrong; there is no gametype.")) diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm index 501acc8481..54fdfbdba4 100644 --- a/code/game/machinery/camera/tracking.dm +++ b/code/game/machinery/camera/tracking.dm @@ -26,7 +26,7 @@ /mob/living/silicon/ai/proc/ai_camera_list(var/camera in get_camera_list()) - set category = "AI Commands" + set category = "AI.Camera Control" set name = "Show Camera List" if(check_unable()) @@ -41,7 +41,7 @@ return /mob/living/silicon/ai/proc/ai_store_location(loc as text) - set category = "AI Commands" + set category = "AI.Camera Control" set name = "Store Camera Location" set desc = "Stores your current camera location by the given name" @@ -70,7 +70,7 @@ return sortList(stored_locations) /mob/living/silicon/ai/proc/ai_goto_location(loc in sorted_stored_locations()) - set category = "AI Commands" + set category = "AI.Camera Control" set name = "Goto Camera Location" set desc = "Returns to the selected camera location" @@ -82,7 +82,7 @@ src.eyeobj.setLoc(L) /mob/living/silicon/ai/proc/ai_remove_location(loc in sorted_stored_locations()) - set category = "AI Commands" + set category = "AI.Camera Control" set name = "Delete Camera Location" set desc = "Deletes the selected camera location" @@ -129,7 +129,7 @@ return targets /mob/living/silicon/ai/proc/ai_camera_track(var/target_name in trackable_mobs()) - set category = "AI Commands" + set category = "AI.Camera Control" set name = "Follow With Camera" set desc = "Select who you would like to track." diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm index af3a5af05c..2808be538a 100644 --- a/code/game/machinery/computer/ai_core.dm +++ b/code/game/machinery/computer/ai_core.dm @@ -262,7 +262,7 @@ GLOBAL_LIST_BOILERPLATE(all_deactivated_AI_cores, /obj/structure/AIcore/deactiva /client/proc/empty_ai_core_toggle_latejoin() set name = "Toggle AI Core Latejoin" - set category = "Admin" + set category = "Admin.Silicon" var/list/cores = list() for(var/obj/structure/AIcore/deactivated/D in all_deactivated_AI_cores) diff --git a/code/game/magic/archived_book.dm b/code/game/magic/archived_book.dm index d41689661d..665f585f96 100644 --- a/code/game/magic/archived_book.dm +++ b/code/game/magic/archived_book.dm @@ -34,7 +34,7 @@ var/global/datum/book_manager/book_mgr = new() /client/proc/delbook() set name = "Delete Book" set desc = "Permamently deletes a book from the database." - set category = "Admin" + set category = "Admin.Moderation" if(!src.holder) to_chat(src, "Only administrators may use this command.") return diff --git a/code/game/mecha/micro/mecha_construction_paths_vr.dm b/code/game/mecha/micro/mecha_construction_paths_vr.dm index 60ed08cac1..9f6b58ff5d 100644 --- a/code/game/mecha/micro/mecha_construction_paths_vr.dm +++ b/code/game/mecha/micro/mecha_construction_paths_vr.dm @@ -252,7 +252,7 @@ if(3) if(diff==FORWARD) user.visible_message("[user] installs external reinforced armor layer to [holder].", "You install external reinforced armor layer to [holder].") - qdel(used_atom)//CHOMPedit upstream port. Fixes polecat not useing it's armor plates up. + qdel(used_atom)// upstream port. Fixes polecat not useing it's armor plates up. holder.icon_state = "polecat18" else user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].") diff --git a/code/game/objects/effects/spawners/bombspawner.dm b/code/game/objects/effects/spawners/bombspawner.dm index 511df962db..08d2ec96c3 100644 --- a/code/game/objects/effects/spawners/bombspawner.dm +++ b/code/game/objects/effects/spawners/bombspawner.dm @@ -1,5 +1,5 @@ /client/proc/spawn_tanktransferbomb() - set category = "Debug" + set category = "Debug.Game" set desc = "Spawn a tank transfer valve bomb" set name = "Instant TTV" @@ -139,5 +139,3 @@ new type(src.loc) qdel(src) - - diff --git a/code/game/objects/items/devices/communicator/integrated.dm b/code/game/objects/items/devices/communicator/integrated.dm index 41990e30f2..78066c5d17 100644 --- a/code/game/objects/items/devices/communicator/integrated.dm +++ b/code/game/objects/items/devices/communicator/integrated.dm @@ -20,7 +20,7 @@ // Parameters: None // Description: Lets synths use their communicators without hands. /obj/item/communicator/integrated/verb/activate() - set category = "Abilities.AI_IM" + set category = "Abilities.AI" set name = "Use Communicator" set desc = "Utilizes your built-in communicator." set src in usr diff --git a/code/game/objects/items/devices/communicator/messaging.dm b/code/game/objects/items/devices/communicator/messaging.dm index a9c0724160..9339b3f84b 100644 --- a/code/game/objects/items/devices/communicator/messaging.dm +++ b/code/game/objects/items/devices/communicator/messaging.dm @@ -114,7 +114,7 @@ // Parameters: None // Description: Allows a ghost to send a text message to a communicator. /mob/observer/dead/verb/text_communicator() - set category = "Ghost" + set category = "Ghost.Message" set name = "Text Communicator" set desc = "If there is a communicator available, send a text message to it." @@ -174,7 +174,7 @@ // Parameters: None // Description: Lets ghosts review messages they've sent or received. /mob/observer/dead/verb/show_text_messages() - set category = "Ghost" + set category = "Ghost.Settings" set name = "Show Text Messages" set desc = "Allows you to see exonet text messages you've sent and received." diff --git a/code/game/objects/items/devices/communicator/phone.dm b/code/game/objects/items/devices/communicator/phone.dm index 41b665535a..dc46930913 100644 --- a/code/game/objects/items/devices/communicator/phone.dm +++ b/code/game/objects/items/devices/communicator/phone.dm @@ -272,7 +272,7 @@ // Parameters: None // Description: Allows ghosts to call communicators, if they meet all the requirements. /mob/observer/dead/verb/join_as_voice() - set category = "Ghost" + set category = "Ghost.Message" set name = "Call Communicator" set desc = "If there is a communicator available, send a request to speak through it. This will reset your respawn timer, if someone picks up." diff --git a/code/game/response_team.dm b/code/game/response_team.dm index d80fa0861b..39bed0f177 100644 --- a/code/game/response_team.dm +++ b/code/game/response_team.dm @@ -9,7 +9,7 @@ var/silent_ert = 0 /client/proc/response_team() set name = "Dispatch Emergency Response Team" - set category = "Special Verbs" + set category = "Fun.Event Kit" set desc = "Send an emergency response team to the station" if(!holder) @@ -43,7 +43,7 @@ var/silent_ert = 0 /client/verb/JoinResponseTeam() set name = "Join Response Team" - set category = "IC" + set category = "IC.Event" if(!MayRespawn(1)) to_chat(usr, span_warning("You cannot join the response team at this time.")) diff --git a/code/game/trader_visit.dm b/code/game/trader_visit.dm index ceb90b4675..8f52110f53 100644 --- a/code/game/trader_visit.dm +++ b/code/game/trader_visit.dm @@ -5,7 +5,7 @@ var/can_call_traders = 1 /client/proc/trader_ship() set name = "Dispatch Beruang Trader Ship" - set category = "Special Verbs" + set category = "Fun.Event Kit" set desc = "Invite players to join the Beruang." if(!holder) @@ -36,7 +36,7 @@ var/can_call_traders = 1 /client/verb/JoinTraders() set name = "Join Trader Visit" - set category = "IC" + set category = "IC.Event" if(!MayRespawn(1)) to_chat(usr, span_warning("You cannot join the traders.")) diff --git a/code/modules/admin/DB ban/functions.dm b/code/modules/admin/DB ban/functions.dm index 8b7f6cf01f..76aa32b9b0 100644 --- a/code/modules/admin/DB ban/functions.dm +++ b/code/modules/admin/DB ban/functions.dm @@ -250,7 +250,7 @@ /client/proc/DB_ban_panel() - set category = "Admin" + set category = "Admin.Moderation" set name = "Banning Panel" set desc = "Edit admin permissions" diff --git a/code/modules/admin/ToRban.dm b/code/modules/admin/ToRban.dm index 939755222b..932dedf5da 100644 --- a/code/modules/admin/ToRban.dm +++ b/code/modules/admin/ToRban.dm @@ -45,7 +45,7 @@ /client/proc/ToRban(task in list("update","toggle","show","remove","remove all","find")) set name = "ToRban" - set category = "Server" + set category = "Server.Config" if(!holder) return switch(task) if("update") diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 359e64b0db..f7e33d15d3 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -32,7 +32,7 @@ var/global/floorIsLava = 0 ///////////////////////////////////////////////////////////////////////////////////////////////Panels /datum/admins/proc/show_player_panel(var/mob/M in mob_list) - set category = "Admin" + set category = "Admin.Game" set name = "Show Player Panel" set desc="Edit player (respawn, ban, heal, etc)" @@ -224,7 +224,7 @@ var/global/floorIsLava = 0 /datum/player_info/var/timestamp // Because this is bloody annoying /datum/admins/proc/PlayerNotes() - set category = "Admin" + set category = "Admin.Logs" set name = "Player Notes" if (!istype(src,/datum/admins)) src = usr.client.holder @@ -264,7 +264,7 @@ var/global/floorIsLava = 0 /datum/admins/proc/show_player_info(var/key as text) - set category = "Admin" + set category = "Admin.Investigate" set name = "Show Player Info" if (!istype(src,/datum/admins)) src = usr.client.holder @@ -278,7 +278,7 @@ var/global/floorIsLava = 0 /datum/admins/proc/access_news_network() //MARKER - set category = "Fun" + set category = "Fun.Event Kit" set name = "Access Newscaster Network" set desc = "Allows you to view, add and edit news feeds." @@ -594,7 +594,7 @@ var/global/floorIsLava = 0 /datum/admins/proc/restart() - set category = "Server" + set category = "Server.Game" set name = "Restart" set desc="Restarts the world" if (!usr.client.holder) @@ -617,7 +617,7 @@ var/global/floorIsLava = 0 /datum/admins/proc/announce() - set category = "Special Verbs" + set category = "Admin.Chat" set name = "Announce" set desc="Announce your desires to the world" if(!check_rights(0)) return @@ -635,7 +635,7 @@ var/global/floorIsLava = 0 var/datum/announcement/priority/admin_pri_announcer = new var/datum/announcement/minor/admin_min_announcer = new /datum/admins/proc/intercom() - set category = "Fun" + set category = "Fun.Event Kit" set name = "Intercom Msg" set desc = "Send an intercom message, like an arrivals announcement." if(!check_rights(0)) return @@ -663,7 +663,7 @@ var/datum/announcement/minor/admin_min_announcer = new feedback_add_details("admin_verb","IN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/intercom_convo() - set category = "Fun" + set category = "Fun.Event Kit" set name = "Intercom Convo" set desc = "Send an intercom conversation, like several uses of the Intercom Msg verb." set waitfor = FALSE //Why bother? We have some sleeps. You can leave tho! @@ -750,7 +750,7 @@ var/datum/announcement/minor/admin_min_announcer = new sleep(this_wait SECONDS) /datum/admins/proc/toggleooc() - set category = "Server" + set category = "Server.Chat" set desc="Globally Toggles OOC" set name="Toggle Player OOC" @@ -766,7 +766,7 @@ var/datum/announcement/minor/admin_min_announcer = new feedback_add_details("admin_verb","TOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/togglelooc() - set category = "Server" + set category = "Server.Chat" set desc="Globally Toggles LOOC" set name="Toggle Player LOOC" @@ -783,7 +783,7 @@ var/datum/announcement/minor/admin_min_announcer = new /datum/admins/proc/toggledsay() - set category = "Server" + set category = "Server.Chat" set desc="Globally Toggles DSAY" set name="Toggle DSAY" @@ -800,7 +800,7 @@ var/datum/announcement/minor/admin_min_announcer = new feedback_add_details("admin_verb","TDSAY") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc /datum/admins/proc/toggleoocdead() - set category = "Server" + set category = "Server.Chat" set desc="Toggle Dead OOC." set name="Toggle Dead OOC" @@ -813,7 +813,7 @@ var/datum/announcement/minor/admin_min_announcer = new feedback_add_details("admin_verb","TDOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/togglehubvisibility() - set category = "Server" + set category = "Server.Config" set desc="Globally Toggles Hub Visibility" set name="Toggle Hub Visibility" @@ -826,7 +826,7 @@ var/datum/announcement/minor/admin_min_announcer = new feedback_add_details("admin_verb","THUB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc /datum/admins/proc/toggletraitorscaling() - set category = "Server" + set category = "Server.Game" set desc="Toggle traitor scaling" set name="Toggle Traitor Scaling" CONFIG_SET(flag/traitor_scaling, !CONFIG_GET(flag/traitor_scaling)) @@ -835,7 +835,7 @@ var/datum/announcement/minor/admin_min_announcer = new feedback_add_details("admin_verb","TTS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/startnow() - set category = "Server" + set category = "Server.Game" set desc="Start the round ASAP" set name="Start Now" @@ -858,7 +858,7 @@ var/datum/announcement/minor/admin_min_announcer = new log_and_message_admins("cancelled immediate game start.") /datum/admins/proc/toggleenter() - set category = "Server" + set category = "Server.Game" set desc="People can't enter" set name="Toggle Entering" CONFIG_SET(flag/enter_allowed, !CONFIG_GET(flag/enter_allowed)) @@ -872,7 +872,7 @@ var/datum/announcement/minor/admin_min_announcer = new feedback_add_details("admin_verb","TE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/toggleAI() - set category = "Server" + set category = "Server.Game" set desc="People can't be AI" set name="Toggle AI" CONFIG_SET(flag/allow_ai, !CONFIG_GET(flag/allow_ai)) @@ -885,7 +885,7 @@ var/datum/announcement/minor/admin_min_announcer = new feedback_add_details("admin_verb","TAI") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/toggleaban() - set category = "Server" + set category = "Server.Game" set desc="Respawn basically" set name="Toggle Respawn" CONFIG_SET(flag/abandon_allowed, !CONFIG_GET(flag/abandon_allowed)) @@ -899,7 +899,7 @@ var/datum/announcement/minor/admin_min_announcer = new feedback_add_details("admin_verb","TR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/togglepersistence() - set category = "Server" + set category = "Server.Config" set desc="Whether persistent data will be saved from now on." set name="Toggle Persistent Data" CONFIG_SET(flag/persistence_disabled, !CONFIG_GET(flag/persistence_disabled)) @@ -913,7 +913,7 @@ var/datum/announcement/minor/admin_min_announcer = new feedback_add_details("admin_verb","TPD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/togglemaploadpersistence() - set category = "Server" + set category = "Server.Config" set desc="Whether mapload persistent data will be saved from now on." set name="Toggle Mapload Persistent Data" CONFIG_SET(flag/persistence_ignore_mapload, !CONFIG_GET(flag/persistence_ignore_mapload)) @@ -927,7 +927,7 @@ var/datum/announcement/minor/admin_min_announcer = new feedback_add_details("admin_verb","TMPD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/toggle_aliens() - set category = "Server" + set category = "Server.Game" set desc="Toggle alien mobs" set name="Toggle Aliens" CONFIG_SET(flag/aliens_allowed, !CONFIG_GET(flag/aliens_allowed)) @@ -936,7 +936,7 @@ var/datum/announcement/minor/admin_min_announcer = new feedback_add_details("admin_verb","TA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/toggle_space_ninja() - set category = "Server" + set category = "Server.Game" set desc="Toggle space ninjas spawning." set name="Toggle Space Ninjas" CONFIG_SET(flag/ninjas_allowed, !CONFIG_GET(flag/ninjas_allowed)) @@ -945,7 +945,7 @@ var/datum/announcement/minor/admin_min_announcer = new feedback_add_details("admin_verb","TSN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/delay() - set category = "Server" + set category = "Server.Game" set desc="Delay the game start/end" set name="Delay" @@ -965,7 +965,7 @@ var/datum/announcement/minor/admin_min_announcer = new feedback_add_details("admin_verb","DELAY") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/adjump() - set category = "Server" + set category = "Server.Game" set desc="Toggle admin jumping" set name="Toggle Jump" CONFIG_SET(flag/allow_admin_jump, !CONFIG_GET(flag/allow_admin_jump)) @@ -973,7 +973,7 @@ var/datum/announcement/minor/admin_min_announcer = new feedback_add_details("admin_verb","TJ") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/adspawn() - set category = "Server" + set category = "Server.Game" set desc="Toggle admin spawning" set name="Toggle Spawn" CONFIG_SET(flag/allow_admin_spawning, !CONFIG_GET(flag/allow_admin_spawning)) @@ -981,7 +981,7 @@ var/datum/announcement/minor/admin_min_announcer = new feedback_add_details("admin_verb","TAS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/adrev() - set category = "Server" + set category = "Server.Game" set desc="Toggle admin revives" set name="Toggle Revive" CONFIG_SET(flag/allow_admin_rev, !CONFIG_GET(flag/allow_admin_rev)) @@ -989,7 +989,7 @@ var/datum/announcement/minor/admin_min_announcer = new feedback_add_details("admin_verb","TAR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/immreboot() - set category = "Server" + set category = "Server.Game" set desc="Reboots the server post haste" set name="Immediate Reboot" if(!usr.client.holder) return @@ -1007,7 +1007,7 @@ var/datum/announcement/minor/admin_min_announcer = new world.Reboot() /datum/admins/proc/unprison(var/mob/M in mob_list) - set category = "Admin" + set category = "Admin.Moderation" set name = "Unprison" if (M.z == 2) if (CONFIG_GET(flag/allow_admin_jump)) @@ -1048,7 +1048,7 @@ var/datum/announcement/minor/admin_min_announcer = new return 0 /datum/admins/proc/spawn_fruit(seedtype in SSplants.seeds) - set category = "Debug" + set category = "Debug.Game" set desc = "Spawn the product of a seed." set name = "Spawn Fruit" @@ -1063,7 +1063,7 @@ var/datum/announcement/minor/admin_min_announcer = new log_admin("[key_name(usr)] spawned [seedtype] fruit at ([usr.x],[usr.y],[usr.z])") /datum/admins/proc/spawn_custom_item() - set category = "Debug" + set category = "Debug.Game" set desc = "Spawn a custom item." set name = "Spawn Custom Item" @@ -1081,8 +1081,7 @@ var/datum/announcement/minor/admin_min_announcer = new item_to_spawn.spawn_item(get_turf(usr)) /datum/admins/proc/check_custom_items() - - set category = "Debug" + set category = "Debug.Investigate" set desc = "Check the custom item list." set name = "Check Custom Items" @@ -1103,7 +1102,7 @@ var/datum/announcement/minor/admin_min_announcer = new to_chat(usr, "- name: [item.name] icon: [item.item_icon] path: [item.item_path] desc: [item.item_desc]") /datum/admins/proc/spawn_plant(seedtype in SSplants.seeds) - set category = "Debug" + set category = "Debug.Game" set desc = "Spawn a spreading plant effect." set name = "Spawn Plant" @@ -1116,7 +1115,7 @@ var/datum/announcement/minor/admin_min_announcer = new /datum/admins/proc/spawn_atom(var/object as text) set name = "Spawn" - set category = "Debug" + set category = "Debug.Game" set desc = "(atom path) Spawn an atom" if(!check_rights(R_SPAWN)) return @@ -1150,7 +1149,7 @@ var/datum/announcement/minor/admin_min_announcer = new /datum/admins/proc/show_traitor_panel(var/mob/M in mob_list) - set category = "Admin" + set category = "Admin.Events" set desc = "Edit mobs's memory and role" set name = "Show Traitor Panel" @@ -1165,7 +1164,7 @@ var/datum/announcement/minor/admin_min_announcer = new feedback_add_details("admin_verb","STP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/show_game_mode() - set category = "Admin" + set category = "Admin.Game" set desc = "Show the current round configuration." set name = "Show Game Mode" @@ -1239,7 +1238,7 @@ var/datum/announcement/minor/admin_min_announcer = new /datum/admins/proc/toggletintedweldhelmets() - set category = "Debug" + set category = "Server.Config" set desc="Reduces view range when wearing welding helmets" set name="Toggle tinted welding helmets." CONFIG_SET(flag/welder_vision, !CONFIG_GET(flag/welder_vision)) @@ -1252,7 +1251,7 @@ var/datum/announcement/minor/admin_min_announcer = new feedback_add_details("admin_verb","TTWH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/toggleguests() - set category = "Server" + set category = "Server.Config" set desc="Guests can't enter" set name="Toggle guests" CONFIG_SET(flag/guests_allowed, !CONFIG_GET(flag/guests_allowed)) @@ -1286,7 +1285,7 @@ var/datum/announcement/minor/admin_min_announcer = new to_chat(usr, span_bold("No AIs located")) //Just so you know the thing is actually working and not just ignoring you. /datum/admins/proc/show_skills() - set category = "Admin" + set category = "Admin.Investigate" set name = "Show Skills" if (!istype(src,/datum/admins)) @@ -1303,7 +1302,7 @@ var/datum/announcement/minor/admin_min_announcer = new return /client/proc/update_mob_sprite(mob/living/carbon/human/H as mob) - set category = "Admin" + set category = "Admin.Game" set name = "Update Mob Sprite" set desc = "Should fix any mob sprite update errors." @@ -1402,7 +1401,7 @@ var/datum/announcement/minor/admin_min_announcer = new return 1 /datum/admins/proc/force_antag_latespawn() - set category = "Admin" + set category = "Admin.Events" set name = "Force Template Spawn" set desc = "Force an antagonist template to spawn." @@ -1426,7 +1425,7 @@ var/datum/announcement/minor/admin_min_announcer = new antag.attempt_late_spawn() /datum/admins/proc/force_mode_latespawn() - set category = "Admin" + set category = "Admin.Events" set name = "Force Mode Spawn" set desc = "Force autotraitor to proc." @@ -1444,7 +1443,7 @@ var/datum/announcement/minor/admin_min_announcer = new ticker.mode.try_latespawn() /datum/admins/proc/paralyze_mob(mob/living/H as mob) - set category = "Admin" + set category = "Admin.Events" set name = "Toggle Paralyze" set desc = "Paralyzes a player. Or unparalyses them." @@ -1462,7 +1461,7 @@ var/datum/announcement/minor/admin_min_announcer = new log_and_message_admins(msg) /datum/admins/proc/set_tcrystals(mob/living/carbon/human/H as mob) - set category = "Debug" + set category = "Debug.Game" set name = "Set Telecrystals" set desc = "Allows admins to change telecrystals of a user." set popup_menu = FALSE //VOREStation Edit - Declutter. @@ -1478,7 +1477,7 @@ var/datum/announcement/minor/admin_min_announcer = new to_chat(usr, "You do not have access to this command.") /datum/admins/proc/add_tcrystals(mob/living/carbon/human/H as mob) - set category = "Debug" + set category = "Debug.Game" set name = "Add Telecrystals" set desc = "Allows admins to change telecrystals of a user by addition." set popup_menu = FALSE //VOREStation Edit - Declutter. @@ -1495,7 +1494,7 @@ var/datum/announcement/minor/admin_min_announcer = new /datum/admins/proc/sendFax() - set category = "Special Verbs" + set category = "Fun.Event Kit" set name = "Send Fax" set desc = "Sends a fax to this machine" var/department = tgui_input_list(usr, "Choose a fax", "Fax", alldepartments) diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm index c2317542fb..eed6315ef0 100644 --- a/code/modules/admin/admin_investigate.dm +++ b/code/modules/admin/admin_investigate.dm @@ -28,7 +28,7 @@ //ADMINVERBS /client/proc/investigate_show( subject in list("hrefs","notes","singulo","telesci") ) set name = "Investigate" - set category = "Admin" + set category = "Admin.Investigate" if(!holder) return switch(subject) if("singulo", "telesci") //general one-round-only stuff diff --git a/code/modules/admin/admin_memo.dm b/code/modules/admin/admin_memo.dm index 23ce2bc7e8..b230031cf2 100644 --- a/code/modules/admin/admin_memo.dm +++ b/code/modules/admin/admin_memo.dm @@ -4,7 +4,7 @@ //switch verb so we don't spam up the verb lists with like, 3 verbs for this feature. /client/proc/admin_memo(task in list("write","show","delete")) set name = "Memo" - set category = "Server" + set category = "Server.Admin" #ifndef ENABLE_MEMOS return #endif diff --git a/code/modules/admin/admin_report.dm b/code/modules/admin/admin_report.dm index d265f2cd1e..002d702654 100644 --- a/code/modules/admin/admin_report.dm +++ b/code/modules/admin/admin_report.dm @@ -91,7 +91,7 @@ world/New() // display only the reports that haven't been handled /client/proc/display_admin_reports() - set category = "Admin" + set category = "Admin.Moderation" set name = "Display Admin Reports" if(!src.holder) return @@ -119,7 +119,7 @@ world/New() /client/proc/Report(mob/M as mob in world) - set category = "Admin" + set category = "Admin.Moderation" if(!src.holder) return diff --git a/code/modules/admin/admin_tools.dm b/code/modules/admin/admin_tools.dm index 323d046a8d..73d065bcc0 100644 --- a/code/modules/admin/admin_tools.dm +++ b/code/modules/admin/admin_tools.dm @@ -1,5 +1,5 @@ /client/proc/cmd_admin_check_player_logs(mob/living/M as mob in mob_list) - set category = "Admin" + set category = "Admin.Logs" set name = "Check Player Attack Logs" set desc = "Check a player's attack logs." @@ -30,7 +30,7 @@ feedback_add_details("admin_verb","PL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_check_dialogue_logs(mob/living/M as mob in mob_list) - set category = "Admin" + set category = "Admin.Logs" set name = "Check Player Dialogue Logs" set desc = "Check a player's dialogue logs." diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 5e2685917e..65b85e4aa4 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -1,6 +1,6 @@ /client/proc/hide_most_verbs()//Allows you to keep some functionality while hiding some verbs set name = "Adminverbs - Hide Most" - set category = "Admin" + set category = "Admin.Misc" remove_verb(src, list(/client/proc/hide_most_verbs, admin_verbs_hideable)) add_verb(src, /client/proc/show_verbs) @@ -11,7 +11,7 @@ /client/proc/hide_verbs() set name = "Adminverbs - Hide All" - set category = "Admin" + set category = "Admin.Misc" remove_admin_verbs() add_verb(src, /client/proc/show_verbs) @@ -22,7 +22,7 @@ /client/proc/show_verbs() set name = "Adminverbs - Show" - set category = "Admin" + set category = "Admin.Misc" remove_verb(src, /client/proc/show_verbs) add_admin_verbs() @@ -98,7 +98,7 @@ /client/proc/player_panel() set name = "Player Panel" - set category = "Admin" + set category = "Admin.Game" if(holder) holder.player_panel_old() feedback_add_details("admin_verb","PP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -106,7 +106,7 @@ /client/proc/player_panel_new() set name = "Player Panel New" - set category = "Admin" + set category = "Admin.Game" if(holder) holder.player_panel_new() feedback_add_details("admin_verb","PPN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -114,7 +114,7 @@ /client/proc/check_antagonists() set name = "Check Antagonists" - set category = "Admin" + set category = "Admin.Investigate" if(holder) holder.check_antagonists() log_admin("[key_name(usr)] checked antagonists.") //for tsar~ @@ -123,7 +123,7 @@ /client/proc/jobbans() set name = "Display Job bans" - set category = "Admin" + set category = "Admin.Investigate" if(holder) if(CONFIG_GET(flag/ban_legacy_system)) holder.Jobbans() @@ -134,7 +134,7 @@ /client/proc/unban_panel() set name = "Unban Panel" - set category = "Admin" + set category = "Admin.Game" if(holder) if(CONFIG_GET(flag/ban_legacy_system)) holder.unbanpanel() @@ -153,14 +153,14 @@ /client/proc/secrets() set name = "Secrets" - set category = "Admin" + set category = "Admin.Secrets" if (holder) holder.Secrets() feedback_add_details("admin_verb","S") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return /client/proc/colorooc() - set category = "Fun" + set category = "Admin.Misc" set name = "OOC Text Color" if(!holder) return var/response = tgui_alert(src, "Please choose a distinct color that is easy to read and doesn't mix with all the other chat and radio frequency colors.", "Change own OOC color", list("Pick new color", "Reset to default", "Cancel")) @@ -193,7 +193,7 @@ GLOB.stealthminID["[ckey]"] = "@[num2text(num)]" /client/proc/stealth() - set category = "Admin" + set category = "Admin.Game" set name = "Stealth Mode" if(holder) if(holder.fakekey) @@ -256,7 +256,7 @@ #undef AUTOBANTIME /client/proc/drop_bomb() // Some admin dickery that can probably be done better -- TLE - set category = "Special Verbs.Fun" + set category = "Fun.Do Not" set name = "Drop Bomb" set desc = "Cause an explosion of varying strength at your location." @@ -284,7 +284,7 @@ feedback_add_details("admin_verb","DB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/give_disease2(mob/T as mob in mob_list) // -- Giacom - set category = "Fun" + set category = "Fun.Event Kit" set name = "Give Disease" set desc = "Gives a Disease to a mob." @@ -315,7 +315,7 @@ message_admins(span_blue("[key_name_admin(usr)] gave [key_name(T)] a [greater] disease2 with infection chance [D.infectionchance]."), 1) /client/proc/admin_give_modifier(var/mob/living/L) - set category = "Debug" + set category = "Debug.Game" set name = "Give Modifier" set desc = "Makes a mob weaker or stronger by adding a specific modifier to them." set popup_menu = FALSE //VOREStation Edit - Declutter. @@ -339,7 +339,7 @@ log_and_message_admins("has given [key_name(L)] the modifer [new_modifier_type], with a duration of [duration ? "[duration / 600] minutes" : "forever"].") /client/proc/make_sound(var/obj/O in world) // -- TLE - set category = "Special Verbs.Events" + set category = "Fun.Sounds" set name = "Make Sound" set desc = "Display a message to everyone who can hear the target" if(O) @@ -354,13 +354,13 @@ /client/proc/togglebuildmodeself() set name = "Toggle Build Mode Self" - set category = "Special Verbs.Events" + set category = "Debug.Events" if(src.mob) togglebuildmode(src.mob) feedback_add_details("admin_verb","TBMS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/object_talk(var/msg as text) // -- TLE - set category = "Special Verbs.Events" + set category = "Fun.Narrate" set name = "oSay" set desc = "Display a message to everyone who can hear the target" if(mob.control_object) @@ -371,7 +371,7 @@ feedback_add_details("admin_verb","OT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/kill_air() // -- TLE - set category = "Debug" + set category = "Debug.Dangerous" set name = "Kill Air" set desc = "Toggle Air Processing" SSair.can_fire = !SSair.can_fire @@ -382,7 +382,7 @@ /client/proc/readmin_self() set name = "Re-Admin self" - set category = "Admin" + set category = "Admin.Misc" if(deadmin_holder) deadmin_holder.reassociate() @@ -393,7 +393,7 @@ /client/proc/deadmin_self() set name = "De-admin self" - set category = "Admin" + set category = "Admin.Misc" if(holder) if(tgui_alert(usr, "Confirm self-deadmin for the round? You can't re-admin yourself without someone promoting you.","Deadmin",list("Yes","No")) == "Yes") @@ -406,7 +406,7 @@ /client/proc/toggle_log_hrefs() set name = "Toggle href logging" - set category = "Server" + set category = "Server.Config" if(!holder) return if(config) CONFIG_SET(flag/log_hrefs, !CONFIG_GET(flag/log_hrefs)) @@ -414,13 +414,13 @@ /client/proc/check_ai_laws() set name = "Check AI Laws" - set category = "Admin.Game" + set category = "Admin.Silicon" if(holder) src.holder.output_ai_laws() /client/proc/rename_silicon() set name = "Rename Silicon" - set category = "Admin" + set category = "Admin.Silicon" if(!check_rights(R_ADMIN|R_FUN|R_EVENT)) return @@ -435,7 +435,7 @@ /client/proc/manage_silicon_laws() set name = "Manage Silicon Laws" - set category = "Admin" + set category = "Admin.Silicon" if(!check_rights(R_ADMIN|R_EVENT)) return @@ -462,7 +462,7 @@ /client/proc/shuttle_panel() set name = "Shuttle Control Panel" - set category = "Admin" + set category = "Admin.Events" if(!check_rights(R_ADMIN | R_EVENT)) return @@ -476,7 +476,7 @@ /client/proc/mod_panel() set name = "Moderator Panel" - set category = "Admin" + set category = "Admin.Moderation" /* if(holder) holder.mod_panel()*/ // feedback_add_details("admin_verb","MP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -484,14 +484,14 @@ /client/proc/playernotes() set name = "Show Player Info" - set category = "Admin" + set category = "Admin.Moderation" if(holder) holder.PlayerNotes() return /client/proc/free_slot() set name = "Free Job Slot" - set category = "Admin" + set category = "Admin.Game" if(holder) var/list/jobs = list() for (var/datum/job/J in job_master.occupations) @@ -508,7 +508,7 @@ /client/proc/toggleghostwriters() set name = "Toggle ghost writers" - set category = "Server" + set category = "Server.Game" if(!holder) return if(config) CONFIG_SET(flag/cult_ghostwriter, !CONFIG_GET(flag/cult_ghostwriter)) @@ -516,14 +516,14 @@ /client/proc/toggledrones() set name = "Toggle maintenance drones" - set category = "Server" + set category = "Server.Game" if(!holder) return if(config) CONFIG_SET(flag/allow_drone_spawn, !CONFIG_GET(flag/allow_drone_spawn)) message_admins("Admin [key_name_admin(usr)] has [CONFIG_GET(flag/allow_drone_spawn) ? "en" : "dis"]abled maintenance drones.", 1) /client/proc/man_up(mob/T as mob in mob_list) - set category = "Fun" + set category = "Fun.Do Not" set name = "Man Up" set desc = "Tells mob to man up and deal with it." set popup_menu = FALSE //VOREStation Edit - Declutter. @@ -537,7 +537,7 @@ message_admins(span_blue("[key_name_admin(usr)] told [key_name(T)] to man up and deal with it."), 1) /client/proc/global_man_up() - set category = "Fun" + set category = "Fun.Do Not" set name = "Man Up Global" set desc = "Tells everyone to man up and deal with it." @@ -551,7 +551,7 @@ message_admins(span_blue("[key_name_admin(usr)] told everyone to man up and deal with it."), 1) /client/proc/give_spell(mob/T as mob in mob_list) // -- Urist - set category = "Fun" + set category = "Fun.Event Kit" set name = "Give Spell" set desc = "Gives a spell to a mob." var/spell/S = tgui_input_list(usr, "Choose the spell to give to that guy", "ABRAKADABRA", spells) @@ -563,6 +563,6 @@ /client/proc/debugstatpanel() set name = "Debug Stat Panel" - set category = "Debug" + set category = "Debug.Misc" src.stat_panel.send_message("create_debug") diff --git a/code/modules/admin/admin_verbs_vr.dm b/code/modules/admin/admin_verbs_vr.dm index d6552d1e56..a04c4bddbd 100644 --- a/code/modules/admin/admin_verbs_vr.dm +++ b/code/modules/admin/admin_verbs_vr.dm @@ -1,5 +1,5 @@ /client/proc/adminorbit() - set category = "Fun" + set category = "Fun.Event Kit" set name = "Orbit Things" set desc = "Makes something orbit around something else." set popup_menu = FALSE @@ -57,7 +57,7 @@ /client/proc/removetickets() set name = "Security Tickets" - set category = "Admin" + set category = "Admin.Investigate" set desc = "Allows one to remove tickets from the global list." if(!check_rights(R_ADMIN)) @@ -77,7 +77,7 @@ /client/proc/delbook() set name = "Delete Book" set desc = "Permamently deletes a book from the database." - set category = "Admin" + set category = "Admin.Game" if(!src.holder) to_chat(src, "Only administrators may use this command.") return @@ -124,7 +124,7 @@ /client/proc/toggle_spawning_with_recolour() set name = "Toggle Simple/Robot recolour verb" set desc = "Makes it so new robots/simple_mobs spawn with a verb to recolour themselves for this round. You must set them separately." - set category = "Server" + set category = "Server.Game" if(!check_rights(R_ADMIN|R_EVENT|R_FUN)) return diff --git a/code/modules/admin/admin_vr.dm b/code/modules/admin/admin_vr.dm index e40db3f525..9076957fa6 100644 --- a/code/modules/admin/admin_vr.dm +++ b/code/modules/admin/admin_vr.dm @@ -1,5 +1,5 @@ /datum/admins/proc/set_uplink(mob/living/carbon/human/H as mob) - set category = "Debug" + set category = "Debug.Events" set name = "Set Uplink" set desc = "Allows admins to set up an uplink on a character. This will be required for a character to use telecrystals." set popup_menu = FALSE @@ -11,4 +11,4 @@ var/msg = "[key_name(usr)] has given [H.ckey] an uplink." message_admins(msg) else - to_chat(usr, "You do not have access to this command.") \ No newline at end of file + to_chat(usr, "You do not have access to this command.") diff --git a/code/modules/admin/callproc/callproc.dm b/code/modules/admin/callproc/callproc.dm index 3400098afe..f1bb2833fb 100644 --- a/code/modules/admin/callproc/callproc.dm +++ b/code/modules/admin/callproc/callproc.dm @@ -1,5 +1,5 @@ /client/proc/callproc() - set category = "Debug" + set category = "Debug.Events" set name = "Advanced ProcCall" set waitfor = 0 @@ -131,7 +131,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention) #endif /client/proc/callproc_datum(datum/A as null|area|mob|obj|turf) - set category = "Debug" + set category = "Debug.Events" set name = "Atom ProcCall" set waitfor = 0 diff --git a/code/modules/admin/ckey_vr.dm b/code/modules/admin/ckey_vr.dm index 1ae417a1c1..f0801e8b78 100644 --- a/code/modules/admin/ckey_vr.dm +++ b/code/modules/admin/ckey_vr.dm @@ -1,6 +1,6 @@ // Command to set the ckey of a mob without requiring VV permission /client/proc/SetCKey(var/mob/M in mob_list) - set category = "Admin" + set category = "Admin.Game" set name = "Set CKey" set desc = "Mob to teleport" if(!src.holder) diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index 9c8f05ceea..2727ec15be 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -118,7 +118,7 @@ NOTE: It checks usr by default. Supply the "user" argument if you wish to check vv_update_display(D, "marked", VV_MSG_MARKED) /client/proc/mark_datum_mapview(datum/D as mob|obj|turf|area in view(view)) - set category = "Debug" + set category = "Debug.Game" set name = "Mark Object" mark_datum(D) diff --git a/code/modules/admin/map_capture.dm b/code/modules/admin/map_capture.dm index 431ec7f637..e157335829 100644 --- a/code/modules/admin/map_capture.dm +++ b/code/modules/admin/map_capture.dm @@ -1,5 +1,5 @@ /datum/admins/proc/capture_map(tx as null|num, ty as null|num, tz as null|num, range as null|num) - set category = "Server" + set category = "Server.Game" set name = "Capture Map Part" set desc = "Usage: Capture-Map-Part target_x_cord target_y_cord target_z_cord range (captures part of a map originating from bottom left corner)" diff --git a/code/modules/admin/news.dm b/code/modules/admin/news.dm index c0812b818e..30defc11c2 100644 --- a/code/modules/admin/news.dm +++ b/code/modules/admin/news.dm @@ -13,7 +13,7 @@ /client/proc/modify_server_news() set name = "Modify Public News" - set category = "Server" + set category = "Server.Game" if(!check_rights(0)) return @@ -118,4 +118,4 @@ text = replacetext(text, "", "\[sglogo\]") return text -#undef NEWSFILE \ No newline at end of file +#undef NEWSFILE diff --git a/code/modules/admin/permissionverbs/permissionedit.dm b/code/modules/admin/permissionverbs/permissionedit.dm index d94aec94bd..34adf5c3ab 100644 --- a/code/modules/admin/permissionverbs/permissionedit.dm +++ b/code/modules/admin/permissionverbs/permissionedit.dm @@ -1,5 +1,5 @@ /client/proc/edit_admin_permissions() - set category = "Admin" + set category = "Admin.Secrets" set name = "Permissions Panel" set desc = "Edit admin permissions" if(!check_rights(R_PERMISSIONS)) return diff --git a/code/modules/admin/persistence.dm b/code/modules/admin/persistence.dm index 8405f8d101..79a93b8c0f 100644 --- a/code/modules/admin/persistence.dm +++ b/code/modules/admin/persistence.dm @@ -1,6 +1,6 @@ /datum/admins/proc/view_persistent_data() - set category = "Admin" + set category = "Admin.Game" set name = "View Persistent Data" set desc = "Shows a list of persistent data for this round. Allows modification by admins." - SSpersistence.show_info(usr) \ No newline at end of file + SSpersistence.show_info(usr) diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index 86ff00b533..dc8d8ae15f 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -188,7 +188,7 @@ Example: USING PROCCALL = BLOCKING, SELECT = FORCE_NULLS, PRIORITY = HIGH SELECT CRASH("SDQL2 fatal error");}; /client/proc/SDQL2_query(query_text as message) - set category = "Debug" + set category = "Debug.Misc" if(!check_rights(R_DEBUG)) //Shouldn't happen... but just to be safe. message_admins(span_danger("ERROR: Non-admin [key_name(usr)] attempted to execute a SDQL query!")) log_admin("Non-admin [key_name(usr)] attempted to execute a SDQL query!") diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 6c3da08252..d543c9e64c 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -639,7 +639,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) //admin proc /client/proc/cmd_admin_ticket_panel() set name = "Show Ticket List" - set category = "Admin" + set category = "Admin.Misc" if(!check_rights(R_ADMIN|R_MOD|R_DEBUG|R_EVENT, TRUE)) return diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm index 7b902c675d..aead36bbc7 100644 --- a/code/modules/admin/verbs/adminjump.dm +++ b/code/modules/admin/verbs/adminjump.dm @@ -7,7 +7,7 @@ /client/proc/Jump(areaname as null|anything in return_sorted_areas()) set name = "Jump to Area" set desc = "Area to jump to" - set category = "Admin" + set category = "Admin.Game" if(!check_rights(R_ADMIN|R_MOD|R_DEBUG|R_EVENT)) return @@ -33,7 +33,7 @@ /client/proc/jumptoturf(var/turf/T in world) set name = "Jump to Turf" - set category = "Admin" + set category = "Admin.Game" if(!check_rights(R_ADMIN|R_MOD|R_DEBUG|R_EVENT)) return if(CONFIG_GET(flag/allow_admin_jump)) @@ -48,7 +48,7 @@ /// Verb wrapper around do_jumptomob() /client/proc/jumptomob(mob as null|anything in mob_list) - set category = "Admin" + set category = "Admin.Game" set name = "Jump to Mob" set popup_menu = FALSE //VOREStation Edit - Declutter. @@ -80,7 +80,7 @@ to_chat(A, span_filter_adminlog("This mob is not located in the game world.")) /client/proc/jumptocoord(tx as num, ty as num, tz as num) - set category = "Admin" + set category = "Admin.Game" set name = "Jump to Coordinate" if(!check_rights(R_ADMIN|R_MOD|R_DEBUG|R_EVENT)) @@ -102,7 +102,7 @@ tgui_alert_async(usr, "Admin jumping disabled") /client/proc/jumptokey() - set category = "Admin" + set category = "Admin.Game" set name = "Jump to Key" if(!check_rights(R_ADMIN|R_MOD|R_DEBUG|R_EVENT)) @@ -125,7 +125,7 @@ tgui_alert_async(usr, "Admin jumping disabled") /client/proc/Getmob(mob/living/M as null|anything in mob_list) //VOREStation Edit - set category = "Admin" + set category = "Admin.Game" set name = "Get Mob" set desc = "Mob to teleport" set popup_menu = TRUE //VOREStation Edit @@ -148,7 +148,7 @@ tgui_alert_async(usr, "Admin jumping disabled") /client/proc/Getkey() - set category = "Admin" + set category = "Admin.Game" set name = "Get Key" set desc = "Key to teleport" @@ -178,7 +178,7 @@ tgui_alert_async(usr, "Admin jumping disabled") /client/proc/sendmob() - set category = "Admin" + set category = "Admin.Game" set name = "Send Mob" if(!check_rights(R_ADMIN|R_MOD|R_DEBUG|R_EVENT)) return @@ -202,7 +202,7 @@ tgui_alert_async(usr, "Admin jumping disabled") /client/proc/cmd_admin_move_atom(var/atom/movable/AM, tx as num, ty as num, tz as num) - set category = "Admin" + set category = "Admin.Game" set name = "Move Atom to Coordinate" if(!check_rights(R_ADMIN|R_DEBUG|R_EVENT)) diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm index 9c9dff4c7b..911ad029e8 100644 --- a/code/modules/admin/verbs/adminsay.dm +++ b/code/modules/admin/verbs/adminsay.dm @@ -1,5 +1,5 @@ /client/proc/cmd_admin_say(msg as text) - set category = "Special Verbs" + set category = "Admin.Chat" set name = "Asay" //Gave this shit a shorter name so you only have to time out "asay" rather than "admin say" to use it --NeoFite set hidden = 1 if(!check_rights(R_ADMIN)) //VOREStation Edit @@ -18,7 +18,7 @@ feedback_add_details("admin_verb","M") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_mod_say(msg as text) - set category = "Special Verbs" + set category = "Admin.Chat" set name = "Msay" set hidden = 1 @@ -41,7 +41,7 @@ feedback_add_details("admin_verb","MS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_event_say(msg as text) - set category = "Special Verbs" + set category = "Admin.Chat" set name = "Esay" set hidden = 1 diff --git a/code/modules/admin/verbs/antag-ooc.dm b/code/modules/admin/verbs/antag-ooc.dm index 59f21a15ae..0d2b6e4fe8 100644 --- a/code/modules/admin/verbs/antag-ooc.dm +++ b/code/modules/admin/verbs/antag-ooc.dm @@ -1,5 +1,5 @@ /client/proc/aooc(msg as text) - set category = "OOC" + set category = "OOC.Chat" set name = "AOOC" set desc = "Antagonist OOC" diff --git a/code/modules/admin/verbs/change_appearance.dm b/code/modules/admin/verbs/change_appearance.dm index c27b658503..ed0f3266f2 100644 --- a/code/modules/admin/verbs/change_appearance.dm +++ b/code/modules/admin/verbs/change_appearance.dm @@ -1,7 +1,7 @@ /client/proc/change_human_appearance_admin() set name = "Change Mob Appearance - Admin" set desc = "Allows you to change the mob appearance" - set category = "Admin" + set category = "Admin.Events" if(!check_rights(R_FUN)) return @@ -15,7 +15,7 @@ /client/proc/change_human_appearance_self() set name = "Change Mob Appearance - Self" set desc = "Allows the mob to change its appearance" - set category = "Admin" + set category = "Admin.Events" if(!check_rights(R_FUN)) return @@ -37,7 +37,7 @@ /client/proc/editappear() set name = "Edit Appearance" - set category = "Fun" + set category = "Fun.Event Kit" if(!check_rights(R_FUN)) return diff --git a/code/modules/admin/verbs/check_customitem_activity.dm b/code/modules/admin/verbs/check_customitem_activity.dm index cb3bfa45dc..796a48368d 100644 --- a/code/modules/admin/verbs/check_customitem_activity.dm +++ b/code/modules/admin/verbs/check_customitem_activity.dm @@ -2,7 +2,7 @@ var/checked_for_inactives = 0 var/inactive_keys = "None
" /client/proc/check_customitem_activity() - set category = "Admin" + set category = "Admin.Investigate" set name = "Check activity of players with custom items" var/dat = span_bold("Inactive players with custom items") + "
" diff --git a/code/modules/admin/verbs/cinematic.dm b/code/modules/admin/verbs/cinematic.dm index 4b370a925b..db6e44be73 100644 --- a/code/modules/admin/verbs/cinematic.dm +++ b/code/modules/admin/verbs/cinematic.dm @@ -1,6 +1,6 @@ /client/proc/cinematic(var/cinematic as anything in list("explosion",null)) set name = "Cinematic" - set category = "Fun" + set category = "Fun.Do Not" set desc = "Shows a cinematic." // Intended for testing but I thought it might be nice for events on the rare occasion Feel free to comment it out if it's not wanted. if(!check_rights(R_FUN)) diff --git a/code/modules/admin/verbs/custom_event.dm b/code/modules/admin/verbs/custom_event.dm index ef0b32bb8b..dc699dfa57 100644 --- a/code/modules/admin/verbs/custom_event.dm +++ b/code/modules/admin/verbs/custom_event.dm @@ -1,6 +1,6 @@ // verb for admins to set custom event /client/proc/cmd_admin_change_custom_event() - set category = "Fun" + set category = "Fun.Event Kit" set name = "Change Custom Event" if(!holder) @@ -33,7 +33,7 @@ // normal verb for players to view info /client/verb/cmd_view_custom_event() - set category = "OOC" + set category = "OOC.Game" set name = "Custom Event Info" if(!custom_event_msg || custom_event_msg == "") diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm index 20334999b3..24ad107d41 100644 --- a/code/modules/admin/verbs/deadsay.dm +++ b/code/modules/admin/verbs/deadsay.dm @@ -1,5 +1,5 @@ /client/proc/dsay(msg as text) - set category = "Special Verbs" + set category = "Admin.Chat" set name = "Dsay" //Gave this shit a shorter name so you only have to time out "dsay" rather than "dead say" to use it --NeoFite set hidden = 1 if(!src.holder) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 685e1fd175..18ff612d9a 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -1,5 +1,5 @@ /client/proc/Debug2() - set category = "Debug" + set category = "Debug.Investigate" set name = "Debug-Game" if(!check_rights(R_DEBUG)) return @@ -18,7 +18,7 @@ /client/proc/simple_DPS() set name = "Simple DPS" - set category = "Debug" + set category = "Debug.Investigate" set desc = "Gives a really basic idea of how much hurt something in-hand does." var/obj/item/I = null @@ -73,7 +73,7 @@ return /client/proc/Cell() - set category = "Debug" + set category = "Debug.Investigate" set name = "Cell" if(!mob) return @@ -94,7 +94,7 @@ feedback_add_details("admin_verb","ASL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_robotize(var/mob/M in mob_list) - set category = "Fun" + set category = "Fun.Event Kit" set name = "Make Robot" if(!ticker) @@ -109,7 +109,7 @@ tgui_alert_async(usr, "Invalid mob") /client/proc/cmd_admin_animalize(var/mob/M in mob_list) - set category = "Fun" + set category = "Fun.Event Kit" set name = "Make Simple Animal" if(!ticker) @@ -130,7 +130,7 @@ /client/proc/makepAI() - set category = "Fun" + set category = "Fun.Event Kit" set name = "Make pAI" set desc = "Spawn someone in as a pAI!" if(!check_rights(R_ADMIN|R_EVENT|R_DEBUG)) @@ -161,7 +161,7 @@ feedback_add_details("admin_verb","MPAI") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_alienize(var/mob/M in mob_list) - set category = "Fun" + set category = "Fun.Event Kit" set name = "Make Alien" if(!ticker) @@ -180,7 +180,7 @@ //TODO: merge the vievars version into this or something maybe mayhaps /client/proc/cmd_debug_del_all() - set category = "Debug" + set category = "Debug.Dangerous" set name = "Del-All" // to prevent REALLY stupid deletions @@ -195,7 +195,7 @@ feedback_add_details("admin_verb","DELA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_debug_make_powernets() - set category = "Debug" + set category = "Debug.Dangerous" set name = "Make Powernets" SSmachines.makepowernets() log_admin("[key_name(src)] has remade the powernet. SSmachines.makepowernets() called.") @@ -203,7 +203,7 @@ feedback_add_details("admin_verb","MPWN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_debug_tog_aliens() - set category = "Server" + set category = "Server.Game" set name = "Toggle Aliens" CONFIG_SET(flag/aliens_allowed, !CONFIG_GET(flag/aliens_allowed)) @@ -212,7 +212,7 @@ feedback_add_details("admin_verb","TAL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_display_del_log() - set category = "Debug" + set category = "Debug.Investigate" set name = "Display del() Log" set desc = "Display del's log of everything that's passed through it." @@ -242,7 +242,7 @@ usr << browse(dellog.Join(), "window=dellog") /client/proc/cmd_display_init_log() - set category = "Debug" + set category = "Debug.Investigate" set name = "Display Initialize() Log" set desc = "Displays a list of things that didn't handle Initialize() properly" @@ -251,7 +251,7 @@ /* /client/proc/cmd_display_overlay_log() - set category = "Debug" + set category = "Debug.Investigate" set name = "Display overlay Log" set desc = "Display SSoverlays log of everything that's passed through it." @@ -273,7 +273,7 @@ . = lines.Join("\n") /client/proc/cmd_admin_grantfullaccess(var/mob/M in mob_list) - set category = "Admin" + set category = "Admin.Events" set name = "Grant Full Access" if (!ticker) @@ -304,7 +304,7 @@ message_admins(span_blue("[key_name_admin(usr)] has granted [M.key] full access."), 1) /client/proc/cmd_assume_direct_control(var/mob/M in mob_list) - set category = "Admin" + set category = "Admin.Game" set name = "Assume direct control" set desc = "Direct intervention" @@ -325,7 +325,7 @@ /client/proc/take_picture(var/atom/A in world) set name = "Save PNG" - set category = "Debug" + set category = "Debug.Misc" set desc = "Opens a dialog to save a PNG of any object in the game." if(!check_rights(R_DEBUG)) @@ -422,7 +422,7 @@ to_world("* [areatype]") /datum/admins/proc/cmd_admin_dress(input in getmobs()) - set category = "Fun" + set category = "Fun.Event Kit" set name = "Select equipment" if(!check_rights(R_FUN)) @@ -454,7 +454,7 @@ /client/proc/startSinglo() - set category = "Debug" + set category = "Debug.Game" set name = "Start Singularity" set desc = "Sets up the singularity and all machines to get power flowing through the station" @@ -498,7 +498,7 @@ Rad.toggle_power() /client/proc/setup_supermatter_engine() - set category = "Debug" + set category = "Debug.Game" set name = "Setup supermatter" set desc = "Sets up the supermatter engine" @@ -581,7 +581,7 @@ /client/proc/cmd_debug_mob_lists() - set category = "Debug" + set category = "Debug.Investigate" set name = "Debug Mob Lists" set desc = "For when you just gotta know" @@ -600,7 +600,7 @@ to_chat(usr, span_filter_debuglogs(jointext(GLOB.clients,","))) /client/proc/cmd_debug_using_map() - set category = "Debug" + set category = "Debug.Investigate" set name = "Debug Map Datum" set desc = "Debug the map metadata about the currently compiled in map." @@ -625,7 +625,7 @@ tgui_alert_async(usr, "Invalid mob") /datum/admins/proc/view_runtimes() - set category = "Debug" + set category = "Debug.Investigate" set name = "View Runtimes" set desc = "Open the Runtime Viewer" @@ -635,7 +635,7 @@ error_cache.showTo(usr) /datum/admins/proc/change_weather() - set category = "Debug" + set category = "Debug.Events" set name = "Change Weather" set desc = "Changes the current weather." @@ -653,7 +653,7 @@ log_admin(log) /datum/admins/proc/toggle_firework_override() - set category = "Fun" + set category = "Fun.Event Kit" set name = "Toggle Weather Firework Override" set desc = "Toggles ability for weather fireworks to affect weather on planet of choice." @@ -668,7 +668,7 @@ log_admin(log) /datum/admins/proc/change_time() - set category = "Debug" + set category = "Debug.Events" set name = "Change Planet Time" set desc = "Changes the time of a planet." diff --git a/code/modules/admin/verbs/debug_vr.dm b/code/modules/admin/verbs/debug_vr.dm index 051bbf6492..60e5c5d636 100644 --- a/code/modules/admin/verbs/debug_vr.dm +++ b/code/modules/admin/verbs/debug_vr.dm @@ -1,5 +1,5 @@ /datum/admins/proc/quick_nif() - set category = "Fun" + set category = "Fun.Add Nif" set name = "Quick NIF" set desc = "Spawns a NIF into someone in quick-implant mode." diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm index 1ce73a7f74..63b18ab07b 100644 --- a/code/modules/admin/verbs/diagnostics.dm +++ b/code/modules/admin/verbs/diagnostics.dm @@ -1,5 +1,5 @@ /client/proc/air_report() - set category = "Debug" + set category = "Debug.Investigate" set name = "Show Air Report" if(!master_controller || !air_master) @@ -42,7 +42,7 @@ usr << browse(output,"window=airreport") /client/proc/fix_next_move() - set category = "Debug" + set category = "Debug.Game" set name = "Unfreeze Everyone" var/largest_move_time = 0 var/largest_click_time = 0 @@ -73,7 +73,7 @@ return /client/proc/radio_report() - set category = "Debug" + set category = "Debug.Game" set name = "Radio report" var/output = "Radio Report
" @@ -100,7 +100,7 @@ /client/proc/reload_admins() set name = "Reload Admins" - set category = "Debug" + set category = "Debug.Server" if(!check_rights(R_SERVER)) return @@ -110,7 +110,7 @@ /client/proc/reload_eventMs() set name = "Reload Event Managers" - set category = "Debug" + set category = "Debug.Server" if(!check_rights(R_SERVER)) return @@ -121,7 +121,7 @@ //todo: /client/proc/jump_to_dead_group() set name = "Jump to dead group" - set category = "Debug" + set category = "Debug.Game" /* if(!holder) to_chat(src, "Only administrators may use this command.") @@ -143,7 +143,7 @@ /client/proc/kill_airgroup() set name = "Kill Local Airgroup" set desc = "Use this to allow manual manupliation of atmospherics." - set category = "Debug" + set category = "Debug.Dangerous" /* if(!holder) to_chat(src, "Only administrators may use this command.") @@ -166,7 +166,7 @@ /client/proc/print_jobban_old() set name = "Print Jobban Log" set desc = "This spams all the active jobban entries for the current round to standard output." - set category = "Debug" + set category = "Debug.Investigate" to_chat(usr, span_bold("Jobbans active in this round.")) for(var/t in jobban_keylist) @@ -175,7 +175,7 @@ /client/proc/print_jobban_old_filter() set name = "Search Jobban Log" set desc = "This searches all the active jobban entries for the current round and outputs the results to standard output." - set category = "Debug" + set category = "Debug.Investigate" var/job_filter = tgui_input_text(usr, "Contains what?","Job Filter") if(!job_filter) diff --git a/code/modules/admin/verbs/dice.dm b/code/modules/admin/verbs/dice.dm index cc21521859..09e171eafd 100644 --- a/code/modules/admin/verbs/dice.dm +++ b/code/modules/admin/verbs/dice.dm @@ -1,5 +1,5 @@ /client/proc/roll_dices() - set category = "Fun" + set category = "Fun.Event Kit" set name = "Roll Dice" if(!check_rights(R_FUN)) return @@ -21,4 +21,4 @@ if(tgui_alert(usr, "Do you want to inform the world about the result?","Show world?",list("Yes", "No")) == "Yes") to_world("

Gods rolled [dice], result is [result]

") - message_admins("[key_name_admin(src)] rolled dice [dice], result is [result]", 1) \ No newline at end of file + message_admins("[key_name_admin(src)] rolled dice [dice], result is [result]", 1) diff --git a/code/modules/admin/verbs/entity_narrate.dm b/code/modules/admin/verbs/entity_narrate.dm index f88dbb192c..d8322e93b8 100644 --- a/code/modules/admin/verbs/entity_narrate.dm +++ b/code/modules/admin/verbs/entity_narrate.dm @@ -27,7 +27,7 @@ /client/proc/add_mob_for_narration(E as obj|mob|turf in orange(world.view)) set name = "Narrate Entity (Add ref)" set desc = "Saves a reference of target mob to be called when narrating." - set category = "Fun" + set category = "Fun.Narrate" if(!check_rights(R_FUN)) return @@ -77,7 +77,7 @@ /client/proc/remove_mob_for_narration() set name = "Narrate Entity (Remove ref)" set desc = "Remove mobs you're no longer narrating from your list for easier work." - set category = "Fun" + set category = "Fun.Narrate" if(!check_rights(R_FUN)) return @@ -107,7 +107,7 @@ /client/proc/narrate_mob() set name = "Narrate Entity (Interface)" set desc = "Send either a visible or audiable message through your chosen entities using an interface" - set category = "Fun" + set category = "Fun.Narrate" if(!check_rights(R_FUN)) return @@ -138,7 +138,7 @@ /client/proc/narrate_mob_args(name as text, mode as text, message as text) set name = "Narrate Entity" set desc = "Narrate entities using positional arguments. Name should be as saved in ref list, mode should be Speak or Emote, follow with message" - set category = "Fun" + set category = "Fun.Narrate" diff --git a/code/modules/admin/verbs/event_triggers.dm b/code/modules/admin/verbs/event_triggers.dm index bf7596656e..fe843855ae 100644 --- a/code/modules/admin/verbs/event_triggers.dm +++ b/code/modules/admin/verbs/event_triggers.dm @@ -4,7 +4,7 @@ Eventkit verb to be used to spawn the obj/effect/landmarks defined under code\ga /client/proc/manage_event_triggers() set name = "Manage Event Triggers" set desc = "Open dialogue to create or delete narration/notification triggers" - set category = "EventKit" + set category = "Fun.Event Kit" if(!check_rights(R_FUN)) return diff --git a/code/modules/admin/verbs/fps.dm b/code/modules/admin/verbs/fps.dm index 76f177535a..b997c863fe 100644 --- a/code/modules/admin/verbs/fps.dm +++ b/code/modules/admin/verbs/fps.dm @@ -1,7 +1,7 @@ //Merged Doohl's and the existing ticklag as they both had good elements about them ~ //Replaces the old Ticklag verb, fps is easier to understand /client/proc/set_server_fps() - set category = "Debug" + set category = "Debug.Server" set name = "Set Server FPS" set desc = "Sets game speed in frames-per-second. Can potentially break the game" diff --git a/code/modules/admin/verbs/get_player_status.dm b/code/modules/admin/verbs/get_player_status.dm index b55f5483cf..2e57317ec9 100644 --- a/code/modules/admin/verbs/get_player_status.dm +++ b/code/modules/admin/verbs/get_player_status.dm @@ -6,7 +6,7 @@ /client/proc/getPlayerStatus() set name = "Report Player Status" set desc = "Get information on all active players in-game." - set category = "EventKit" + set category = "Fun.Event Kit" if(!check_rights(R_FUN)) return diff --git a/code/modules/admin/verbs/getlogs.dm b/code/modules/admin/verbs/getlogs.dm index 236fbef7a6..d7ad8ed13c 100644 --- a/code/modules/admin/verbs/getlogs.dm +++ b/code/modules/admin/verbs/getlogs.dm @@ -81,7 +81,7 @@ //Shows today's server log /datum/admins/proc/view_txt_log() - set category = "Admin" + set category = "Admin.Logs" set name = "Show Server Log" set desc = "Shows today's server log." @@ -96,7 +96,7 @@ //Shows today's attack log /datum/admins/proc/view_atk_log() - set category = "Admin" + set category = "Admin.Logs" set name = "Show Server Attack Log" set desc = "Shows today's server attack log." diff --git a/code/modules/admin/verbs/grief_fixers.dm b/code/modules/admin/verbs/grief_fixers.dm index 1dcf54b9bf..1aa8f349f1 100644 --- a/code/modules/admin/verbs/grief_fixers.dm +++ b/code/modules/admin/verbs/grief_fixers.dm @@ -1,5 +1,5 @@ /client/proc/fixatmos() - set category = "Admin" + set category = "Admin.Game" set name = "Fix Atmospherics Grief" if(!check_rights(R_ADMIN|R_DEBUG|R_EVENT)) return diff --git a/code/modules/admin/verbs/lightning_strike.dm b/code/modules/admin/verbs/lightning_strike.dm index ce500bb9d7..57191c3235 100644 --- a/code/modules/admin/verbs/lightning_strike.dm +++ b/code/modules/admin/verbs/lightning_strike.dm @@ -1,7 +1,7 @@ /client/proc/admin_lightning_strike() set name = "Lightning Strike" set desc = "Causes lightning to strike on your tile. This can be made to hurt things on or nearby it severely." - set category = "Fun" + set category = "Fun.Do Not" if(!check_rights(R_FUN)) return diff --git a/code/modules/admin/verbs/map_template_loadverb.dm b/code/modules/admin/verbs/map_template_loadverb.dm index d49c3ba739..c9dc93d3ef 100644 --- a/code/modules/admin/verbs/map_template_loadverb.dm +++ b/code/modules/admin/verbs/map_template_loadverb.dm @@ -1,5 +1,5 @@ /client/proc/map_template_load() - set category = "Debug" + set category = "Debug.Events" set name = "Map template - Place At Loc" var/datum/map_template/template @@ -32,7 +32,7 @@ usr.client.images -= preview /client/proc/map_template_load_on_new_z() - set category = "Debug" + set category = "Debug.Events" set name = "Map template - New Z" var/datum/map_template/template @@ -55,7 +55,7 @@ /client/proc/map_template_upload() - set category = "Debug" + set category = "Debug.Events" set name = "Map Template - Upload" var/map = input(usr, "Choose a Map Template to upload to template storage","Upload Map Template") as null|file diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index c51b131b8e..22be10769d 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -167,7 +167,7 @@ var/list/debug_verbs = list ( /client/proc/enable_debug_verbs() - set category = "Debug" + set category = "Debug.Misc" set name = "Debug verbs" if(!check_rights(R_DEBUG)) return @@ -177,7 +177,7 @@ var/list/debug_verbs = list ( feedback_add_details("admin_verb","mDV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/hide_debug_verbs() - set category = "Debug" + set category = "Debug.Misc" set name = "Hide Debug verbs" if(!check_rights(R_DEBUG)) return @@ -209,7 +209,7 @@ var/list/debug_verbs = list ( /client/proc/testZAScolors() - set category = "ZAS" + set category = "Mapping.ZAS" set name = "Check ZAS connections" if(!check_rights(R_DEBUG)) return @@ -258,7 +258,7 @@ var/list/debug_verbs = list ( testZAScolors_turfs += T /client/proc/testZAScolors_remove() - set category = "ZAS" + set category = "Mapping.ZAS" set name = "Remove ZAS connection colors" testZAScolors_turfs.Cut() @@ -270,7 +270,7 @@ var/list/debug_verbs = list ( images.Remove(i) /client/proc/rebootAirMaster() - set category = "ZAS" + set category = "Mapping.ZAS" set name = "Reboot ZAS" if(tgui_alert(usr, "This will destroy and remake all zone geometry on the whole map.","Reboot ZAS",list("Reboot ZAS","Nevermind")) == "Reboot ZAS") diff --git a/code/modules/admin/verbs/modify_robot.dm b/code/modules/admin/verbs/modify_robot.dm index b1531f8890..2524f1b50b 100644 --- a/code/modules/admin/verbs/modify_robot.dm +++ b/code/modules/admin/verbs/modify_robot.dm @@ -2,7 +2,7 @@ /client/proc/modify_robot(var/mob/living/silicon/robot/target in silicon_mob_list) set name = "Modify Robot Module" set desc = "Allows to add or remove modules to/from robots." - set category = "Admin" + set category = "Admin.Silicon" if(!check_rights(R_ADMIN|R_FUN|R_VAREDIT|R_EVENT)) return @@ -90,8 +90,8 @@ robot.module.contents.Remove(add_item) target.module.modules.Add(add_item) target.module.contents.Add(add_item) - spawn(0) //ChompEDIT Must be after to allow the movement to finish - SEND_SIGNAL(add_item, COMSIG_OBSERVER_MOVED)//ChompEDIT - report the movement since setting loc doesn't call Move or Moved + spawn(0) Must be after to allow the movement to finish + SEND_SIGNAL(add_item, COMSIG_OBSERVER_MOVED) target.hud_used.update_robot_modules_display() to_chat(usr, span_danger("You added \"[add_item]\" to [target].")) if(istype(add_item, /obj/item/stack/)) diff --git a/code/modules/admin/verbs/panicbunker.dm b/code/modules/admin/verbs/panicbunker.dm index f4fdc3612e..0e736696b1 100644 --- a/code/modules/admin/verbs/panicbunker.dm +++ b/code/modules/admin/verbs/panicbunker.dm @@ -1,5 +1,5 @@ /client/proc/panicbunker() - set category = "Server" + set category = "Server.Config" set name = "Toggle Panic Bunker" if(!check_rights(R_ADMIN)) @@ -17,7 +17,7 @@ feedback_add_details("admin_verb","PANIC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/paranoia_logging() - set category = "Server" + set category = "Server.Config" set name = "New Player Warnings" if(!check_rights(R_ADMIN)) @@ -31,7 +31,7 @@ feedback_add_details("admin_verb","PARLOG") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/ip_reputation() - set category = "Server" + set category = "Server.Config" set name = "Toggle IP Rep Checks" if(!check_rights(R_ADMIN)) diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index c3b5673442..4fb01a3b31 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -6,7 +6,7 @@ var/list/sounds_cache = list() /client/proc/play_sound(S as sound) - set category = "Fun" + set category = "Fun.Sounds" set name = "Play Global Sound" if(!check_rights(R_SOUNDS)) return @@ -50,7 +50,7 @@ var/list/sounds_cache = list() feedback_add_details("admin_verb", "Play Global Sound") /client/proc/play_local_sound(S as sound) - set category = "Fun" + set category = "Fun.Sounds" set name = "Play Local Sound" if(!check_rights(R_SOUNDS)) return @@ -61,7 +61,7 @@ var/list/sounds_cache = list() feedback_add_details("admin_verb", "Play Local Sound") /client/proc/play_direct_mob_sound(S as sound, mob/M) - set category = "Fun" + set category = "Fun.Sounds" set name = "Play Direct Mob Sound" if(!check_rights(R_SOUNDS)) return @@ -76,7 +76,7 @@ var/list/sounds_cache = list() feedback_add_details("admin_verb", "Play Direct Mob Sound") /client/proc/play_z_sound(S as sound) - set category = "Fun" + set category = "Fun.Sounds" set name = "Play Z Sound" if(!check_rights(R_SOUNDS)) return var/target_z = mob.z @@ -98,7 +98,7 @@ var/list/sounds_cache = list() /client/proc/play_server_sound() - set category = "Fun" + set category = "Fun.Sounds" set name = "Play Server Sound" if(!check_rights(R_SOUNDS)) return @@ -215,7 +215,7 @@ var/list/sounds_cache = list() feedback_add_details("admin_verb", "Play Internet Sound") /client/proc/play_web_sound() - set category = "Fun" + set category = "Fun.Sounds" set name = "Play Internet Sound" if(!check_rights(R_SOUNDS)) return @@ -243,7 +243,7 @@ var/list/sounds_cache = list() web_sound(usr, null) /client/proc/stop_sounds() - set category = "Debug" + set category = "Debug.Dangerous" set name = "Stop All Playing Sounds" if(!src.holder) return @@ -264,8 +264,8 @@ var/list/sounds_cache = list() #undef SHELLEO_STDERR /* -/client/proc/cuban_pete() - set category = "Fun" +/client/proc/cuban_pete()" + set category = "Fun.Sounds" set name = "Cuban Pete Time" message_admins("[key_name_admin(usr)] has declared Cuban Pete Time!", 1) @@ -280,8 +280,8 @@ var/list/sounds_cache = list() CP.gib() -/client/proc/bananaphone() - set category = "Fun" +/client/proc/bananaphone()" + set category = "Fun.Sounds" set name = "Banana Phone" message_admins("[key_name_admin(usr)] has activated Banana Phone!", 1) @@ -291,8 +291,8 @@ var/list/sounds_cache = list() M << 'bananaphone.ogg' -/client/proc/space_asshole() - set category = "Fun" +/client/proc/space_asshole()" + set category = "Fun.Sounds" set name = "Space Asshole" message_admins("[key_name_admin(usr)] has played the Space Asshole Hymn.", 1) @@ -302,8 +302,8 @@ var/list/sounds_cache = list() M << 'sound/music/space_asshole.ogg' -/client/proc/honk_theme() - set category = "Fun" +/client/proc/honk_theme()" + set category = "Fun.Sounds" set name = "Honk" message_admins("[key_name_admin(usr)] has creeped everyone out with Blackest Honks.", 1) diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index 9b056896a0..a33d77a405 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -1,5 +1,5 @@ /mob/verb/pray() - set category = "IC" + set category = "IC.Game" set name = "Pray" if(say_disabled) //This is here to try to identify lag problems diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 31da1afe1b..bc0547c4b5 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -18,7 +18,7 @@ feedback_add_details("admin_verb","DEVR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_prison(mob/M as mob in mob_list) - set category = "Admin" + set category = "Admin.Game" set name = "Prison" if(!holder) return @@ -46,7 +46,7 @@ //Allows staff to determine who the newer players are. /client/proc/cmd_check_new_players() - set category = "Admin" + set category = "Admin.Investigate" set name = "Check new Players" if(!holder) return @@ -80,7 +80,7 @@ to_chat(src, "No matches for that age range found.") /client/proc/cmd_admin_subtle_message(mob/M as mob in mob_list) - set category = "Special Verbs" + set category = "Admin" set name = "Subtle Message" if(!ismob(M)) return @@ -107,7 +107,7 @@ feedback_add_details("admin_verb","SMS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_world_narrate() // Allows administrators to fluff events a little easier -- TLE - set category = "Special Verbs" + set category = "Fun.Narrate" set name = "Global Narrate" if (!holder) @@ -128,7 +128,7 @@ feedback_add_details("admin_verb","GLN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_direct_narrate(var/mob/M) // Targetted narrate -- TLE - set category = "Special Verbs" + set category = "Fun.Narrate" set name = "Direct Narrate" if(!holder) @@ -155,7 +155,7 @@ feedback_add_details("admin_verb","DIRN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_godmode(mob/M as mob in mob_list) - set category = "Special Verbs" + set category = "Admin.Game" set name = "Godmode" if(!holder) @@ -225,7 +225,7 @@ feedback_add_details("admin_verb","MUTE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_add_random_ai_law() - set category = "Fun" + set category = "Fun.Silicon" set name = "Add Random AI Law" if(!holder) @@ -276,7 +276,7 @@ Ccomp's first proc. /client/proc/allow_character_respawn() - set category = "Special Verbs" + set category = "Admin.Game" set name = "Allow player to respawn" set desc = "Let a player bypass the wait to respawn or allow them to re-enter their corpse." @@ -313,7 +313,7 @@ Ccomp's first proc. /client/proc/toggle_antagHUD_use() - set category = "Server" + set category = "Server.Game" set name = "Toggle antagHUD usage" set desc = "Toggles antagHUD usage for observers" @@ -348,7 +348,7 @@ Ccomp's first proc. /client/proc/toggle_antagHUD_restrictions() - set category = "Server" + set category = "Server.Game" set name = "Toggle antagHUD Restrictions" set desc = "Restricts players that have used antagHUD from being able to join this round." @@ -381,7 +381,7 @@ Works kind of like entering the game with a new character. Character receives a Traitors and the like can also be revived with the previous role mostly intact. /N */ /client/proc/respawn_character() - set category = "Special Verbs" + set category = "Fun.Event Kit" set name = "Spawn Character" set desc = "(Re)Spawn a client's loaded character." @@ -594,7 +594,7 @@ Traitors and the like can also be revived with the previous role mostly intact. return new_character /client/proc/cmd_admin_add_freeform_ai_law() - set category = "Fun" + set category = "Fun.Silicon" set name = "Add Custom AI law" if(!holder) @@ -623,7 +623,7 @@ Traitors and the like can also be revived with the previous role mostly intact. feedback_add_details("admin_verb","IONC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_rejuvenate(mob/living/M as mob in mob_list) - set category = "Special Verbs" + set category = "Admin.Game" set name = "Rejuvenate" if(!holder) @@ -646,7 +646,7 @@ Traitors and the like can also be revived with the previous role mostly intact. feedback_add_details("admin_verb","REJU") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_create_centcom_report() - set category = "Special Verbs" + set category = "Fun.Event Kit" set name = "Create Command Report" if(!holder) @@ -674,7 +674,7 @@ Traitors and the like can also be revived with the previous role mostly intact. feedback_add_details("admin_verb","CCR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_delete(atom/O as obj|mob|turf in _validate_atom(O)) // I don't understand precisely how this fixes the string matching against a substring, but it does - Ater - set category = "Admin" + set category = "Admin.Game" set name = "Delete" if (!holder) @@ -683,7 +683,7 @@ Traitors and the like can also be revived with the previous role mostly intact. admin_delete(O) /client/proc/cmd_admin_list_open_jobs() - set category = "Admin" + set category = "Admin.Investigate" set name = "List free slots" if (!holder) @@ -695,7 +695,7 @@ Traitors and the like can also be revived with the previous role mostly intact. feedback_add_details("admin_verb","LFS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_explosion(atom/O as obj|mob|turf in world) - set category = "Special Verbs" + set category = "Fun.Do Not" set name = "Explosion" if(!check_rights(R_DEBUG|R_FUN)) return //VOREStation Edit @@ -723,7 +723,7 @@ Traitors and the like can also be revived with the previous role mostly intact. return /client/proc/cmd_admin_emp(atom/O as obj|mob|turf in world) - set category = "Special Verbs" + set category = "Fun.Do Not" set name = "EM Pulse" if(!check_rights(R_DEBUG|R_FUN)) return //VOREStation Edit @@ -749,7 +749,7 @@ Traitors and the like can also be revived with the previous role mostly intact. return /client/proc/cmd_admin_gib(mob/M as mob in mob_list) - set category = "Special Verbs" + set category = "Fun.Do Not" set name = "Gib" if(!check_rights(R_ADMIN|R_FUN)) return //VOREStation Edit @@ -771,7 +771,7 @@ Traitors and the like can also be revived with the previous role mostly intact. /client/proc/cmd_admin_gib_self() set name = "Gibself" - set category = "Fun" + set category = "Fun.Do Not" if(!holder) return @@ -791,7 +791,7 @@ Traitors and the like can also be revived with the previous role mostly intact. /* /client/proc/cmd_manual_ban() set name = "Manual Ban" - set category = "Special Verbs" + set category = "Admin.Moderation" if(!authenticated || !holder) to_chat(src, "Only administrators may use this command.") return @@ -851,7 +851,7 @@ Traitors and the like can also be revived with the previous role mostly intact. return /client/proc/cmd_admin_check_contents(mob/living/M as mob in mob_list) - set category = "Special Verbs" + set category = "Admin.Investigate" set name = "Check Contents" set popup_menu = FALSE //VOREStation Edit - Declutter. @@ -865,7 +865,7 @@ Traitors and the like can also be revived with the previous role mostly intact. /* This proc is DEFERRED. Does not do anything. /client/proc/cmd_admin_remove_phoron() - set category = "Debug" + set category = "Debug.Game" set name = "Stabilize Atmos." if(!holder) to_chat(src, "Only administrators may use this command.") @@ -895,7 +895,7 @@ Traitors and the like can also be revived with the previous role mostly intact. */ /client/proc/toggle_view_range() - set category = "Special Verbs" + set category = "Admin.Game" set name = "Change View Range" set desc = "switches between 1x and custom views" @@ -915,7 +915,7 @@ Traitors and the like can also be revived with the previous role mostly intact. feedback_add_details("admin_verb","CVRA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/admin_call_shuttle() - set category = "Admin" + set category = "Admin.Events" set name = "Call Shuttle" if ((!( ticker ) || !emergency_shuttle.location())) @@ -947,7 +947,7 @@ Traitors and the like can also be revived with the previous role mostly intact. return /client/proc/admin_cancel_shuttle() - set category = "Admin" + set category = "Admin.Events" set name = "Cancel Shuttle" if(!check_rights(R_ADMIN)) return //VOREStation Edit @@ -965,7 +965,7 @@ Traitors and the like can also be revived with the previous role mostly intact. return /client/proc/admin_deny_shuttle() - set category = "Admin" + set category = "Admin.Events" set name = "Toggle Deny Shuttle" if (!ticker) @@ -979,7 +979,7 @@ Traitors and the like can also be revived with the previous role mostly intact. message_admins("[key_name_admin(usr)] has [emergency_shuttle.deny_shuttle ? "denied" : "allowed"] the shuttle to be called.") /client/proc/cmd_admin_attack_log(mob/M as mob in mob_list) - set category = "Special Verbs" + set category = "Admin.Logs" set name = "Attack Log" to_chat(usr, span_red(span_bold("Attack Log for [mob]"))) @@ -989,7 +989,7 @@ Traitors and the like can also be revived with the previous role mostly intact. /client/proc/everyone_random() - set category = "Fun" + set category = "Fun.Do Not" set name = "Make Everyone Random" set desc = "Make everyone have a random appearance. You can only use this before rounds!" @@ -1023,7 +1023,7 @@ Traitors and the like can also be revived with the previous role mostly intact. /client/proc/toggle_random_events() - set category = "Server" + set category = "Server.Game" set name = "Toggle random events on/off" set desc = "Toggles random events such as meteors, black holes, blob (but not space dust) on/off" @@ -1041,7 +1041,7 @@ Traitors and the like can also be revived with the previous role mostly intact. /client/proc/despawn_player(var/mob/M in living_mob_list) set name = "Cryo Player" - set category = "Admin" + set category = "Admin.Game" set desc = "Removes a player from the round as if they'd cryo'd." set popup_menu = FALSE @@ -1104,7 +1104,7 @@ Traitors and the like can also be revived with the previous role mostly intact. /client/proc/cmd_admin_droppod_spawn(var/object as text) set name = "Drop Pod Atom" set desc = "Spawn a new atom/movable in a drop pod where you are." - set category = "Fun" + set category = "Fun.Drop Pod" if(!check_rights(R_SPAWN)) return @@ -1146,7 +1146,7 @@ Traitors and the like can also be revived with the previous role mostly intact. /client/proc/cmd_admin_droppod_deploy() set name = "Drop Pod Deploy" set desc = "Drop an existing mob where you are in a drop pod." - set category = "Fun" + set category = "Fun.Drop Pod" if(!check_rights(R_SPAWN)) return diff --git a/code/modules/admin/verbs/randomverbs_vr.dm b/code/modules/admin/verbs/randomverbs_vr.dm index 8b045ffaf9..8cd3c50604 100644 --- a/code/modules/admin/verbs/randomverbs_vr.dm +++ b/code/modules/admin/verbs/randomverbs_vr.dm @@ -1,5 +1,5 @@ /client/proc/spawn_character_mob() - set category = "Special Verbs" + set category = "Fun.Event Kit" set name = "Spawn Character As Mob" set desc = "Spawn a specified ckey as a chosen mob." @@ -76,7 +76,7 @@ return new_mob /client/proc/cmd_admin_z_narrate() // Allows administrators to fluff events a little easier -- TLE - set category = "Special Verbs" + set category = "Fun.Narrate" set name = "Z Narrate" set desc = "Narrates to your Z level." @@ -84,6 +84,10 @@ return var/msg = tgui_input_text(usr, "Message:", text("Enter the text you wish to appear to everyone:")) + + if (!msg) + return + if(!(msg[1] == "<" && msg[length(msg)] == ">")) //You can use HTML but only if the whole thing is HTML. Tries to prevent admin 'accidents'. msg = sanitize(msg) @@ -101,7 +105,7 @@ feedback_add_details("admin_verb","GLNA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/toggle_vantag_hud(var/mob/target as mob) - set category = "Fun" + set category = "Fun.Event Kit" set name = "Give/Remove Event HUD" set desc = "Give a mob the event hud, which shows them other people's event preferences, or remove it from them" diff --git a/code/modules/admin/verbs/resize.dm b/code/modules/admin/verbs/resize.dm index 85b7943397..eb4267aee4 100644 --- a/code/modules/admin/verbs/resize.dm +++ b/code/modules/admin/verbs/resize.dm @@ -1,7 +1,7 @@ /client/proc/resize(var/mob/living/L in mob_list) set name = "Resize" set desc = "Resizes any living mob without any restrictions on size." - set category = "Fun" + set category = "Fun.Event Kit" if(!check_rights(R_ADMIN|R_FUN|R_VAREDIT)) return diff --git a/code/modules/admin/verbs/smite.dm b/code/modules/admin/verbs/smite.dm index 497f8f43ad..82a9b7996d 100644 --- a/code/modules/admin/verbs/smite.dm +++ b/code/modules/admin/verbs/smite.dm @@ -1,7 +1,7 @@ /client/proc/smite(var/mob/living/carbon/human/target in player_list) set name = "Smite" set desc = "Abuse a player with various 'special treatments' from a list." - set category = "Fun" + set category = "Fun.Do Not" if(!check_rights(R_FUN)) return diff --git a/code/modules/admin/verbs/striketeam.dm b/code/modules/admin/verbs/striketeam.dm index af7e42c872..a3eea5b9b6 100644 --- a/code/modules/admin/verbs/striketeam.dm +++ b/code/modules/admin/verbs/striketeam.dm @@ -2,7 +2,7 @@ var/const/commandos_possible = 6 //if more Commandos are needed in the future /client/proc/strike_team() - set category = "Fun" + set category = "Fun.Event Kit" set name = "Spawn Strike Team" set desc = "Spawns a strike team if you want to run an admin event." diff --git a/code/modules/admin/verbs/tripAI.dm b/code/modules/admin/verbs/tripAI.dm index b932729d98..2e31e7418b 100644 --- a/code/modules/admin/verbs/tripAI.dm +++ b/code/modules/admin/verbs/tripAI.dm @@ -1,5 +1,5 @@ /client/proc/triple_ai() - set category = "Fun" + set category = "Fun.Event Kit" set name = "Create AI Triumvirate" if(ticker.current_state > GAME_STATE_PREGAME) diff --git a/code/modules/admin/view_variables/view_variables.dm b/code/modules/admin/view_variables/view_variables.dm index c2af0624d1..fd15cd54a1 100644 --- a/code/modules/admin/view_variables/view_variables.dm +++ b/code/modules/admin/view_variables/view_variables.dm @@ -1,5 +1,5 @@ /client/proc/debug_variables(datum/D in world) - set category = "Debug" + set category = "Debug.Investigate" set name = "View Variables" //set src in world var/static/cookieoffset = rand(1, 9999) //to force cookies to reset after the round. diff --git a/code/modules/asset_cache/asset_list.dm b/code/modules/asset_cache/asset_list.dm index 5971a753c3..bdc062e066 100644 --- a/code/modules/asset_cache/asset_list.dm +++ b/code/modules/asset_cache/asset_list.dm @@ -1,4 +1,4 @@ -#define ASSET_CROSS_ROUND_CACHE_DIRECTORY "tmp/assets" +#define ASSET_CROSS_ROUND_CACHE_DIRECTORY "cache/assets" //These datums are used to populate the asset cache, the proc "register()" does this. //Place any asset datums you create in asset_list_items.dm diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm index 155950ae43..5b9adc2330 100644 --- a/code/modules/client/client defines.dm +++ b/code/modules/client/client defines.dm @@ -106,6 +106,11 @@ var/last_asset_job = 0 var/last_completed_asset_job = 0 + ///Last ping of the client + var/lastping = 0 + ///Average ping of the client + var/avgping = 0 + ///world.time they connected var/connection_time ///world.realtime they connected diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index a27237fa01..f7d4a940c1 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -512,13 +512,13 @@ /client/verb/character_setup() set name = "Character Setup" - set category = "Preferences" + set category = "Preferences.Character" if(prefs) prefs.ShowChoices(usr) /client/verb/game_options() set name = "Game Options" - set category = "Preferences" + set category = "Preferences.Character" if(prefs) prefs.tgui_interact(usr) @@ -620,7 +620,7 @@ /client/verb/toggle_fullscreen() set name = "Toggle Fullscreen" - set category = "OOC" + set category = "OOC.Client Settings" fullscreen = !fullscreen @@ -641,7 +641,7 @@ /client/verb/toggle_verb_panel() set name = "Toggle Verbs" - set category = "OOC" + set category = "OOC.Client Settings" show_verb_panel = !show_verb_panel @@ -650,7 +650,7 @@ /* /client/verb/toggle_status_bar() set name = "Toggle Status Bar" - set category = "OOC" + set category = "OOC.Client Settings" show_status_bar = !show_status_bar @@ -662,7 +662,7 @@ /client/verb/show_active_playtime() set name = "Active Playtime" - set category = "IC" + set category = "OOC.Game" if(!play_hours.len) to_chat(src, span_warning("Persistent playtime disabled!")) diff --git a/code/modules/client/movement.dm b/code/modules/client/movement.dm index efcf51c02e..c04cf26c30 100644 --- a/code/modules/client/movement.dm +++ b/code/modules/client/movement.dm @@ -5,11 +5,10 @@ /client/verb/spinleft() set name = "Spin View CCW" - set category = "OOC" + set category = "OOC.Game" dir = turn(dir, 90) /client/verb/spinright() set name = "Spin View CW" - set category = "OOC" + set category = "OOC.Game" dir = turn(dir, -90) - diff --git a/code/modules/client/preference_setup/volume_sliders/01_volume.dm b/code/modules/client/preference_setup/volume_sliders/01_volume.dm index 46a38bbb92..219a4750cb 100644 --- a/code/modules/client/preference_setup/volume_sliders/01_volume.dm +++ b/code/modules/client/preference_setup/volume_sliders/01_volume.dm @@ -97,7 +97,7 @@ /client/verb/volume_panel() set name = "Volume Panel" - set category = "Preferences" + set category = "Preferences.Sounds" set desc = "Allows you to adjust volume levels on the fly." if(!volume_panel) diff --git a/code/modules/client/preferences_toggle_procs.dm b/code/modules/client/preferences_toggle_procs.dm index 73a3c1045d..fbd61f46ea 100644 --- a/code/modules/client/preferences_toggle_procs.dm +++ b/code/modules/client/preferences_toggle_procs.dm @@ -1,7 +1,7 @@ //Toggles for preferences, normal clients /client/verb/toggle_be_special(role in be_special_flags) set name = "Toggle Special Role Candidacy" - set category = "Preferences" + set category = "Preferences.Character" set desc = "Toggles which special roles you would like to be a candidate for, during events." var/role_flag = be_special_flags[role] @@ -16,7 +16,7 @@ /client/verb/toggle_chat_timestamps() set name = "Toggle Chat Timestamps" - set category = "Preferences" + set category = "Preferences.Chat" set desc = "Toggles whether or not messages in chat will display timestamps. Enabling this will not add timestamps to messages that have already been sent." prefs.chat_timestamp = !prefs.chat_timestamp //There is no preference datum for tgui input lock, nor for any TGUI prefs. @@ -27,7 +27,7 @@ // Not attached to a pref datum because those are strict binary toggles /client/verb/toggle_examine_mode() set name = "Toggle Examine Mode" - set category = "Preferences" + set category = "Preferences.Game" set desc = "Toggle the additional behaviour of examining things." prefs.examine_text_mode++ @@ -44,7 +44,7 @@ /client/verb/toggle_multilingual_mode() set name = "Toggle Multilingual Mode" - set category = "Preferences" + set category = "Preferences.Character" set desc = "Toggle the behaviour of multilingual speech parsing." prefs.multilingual_mode++ diff --git a/code/modules/client/preferences_vr.dm b/code/modules/client/preferences_vr.dm index 9ee5ed0b24..8453d0f16a 100644 --- a/code/modules/client/preferences_vr.dm +++ b/code/modules/client/preferences_vr.dm @@ -16,7 +16,7 @@ //Why weren't these in game toggles already? /client/verb/toggle_capture_crystal() set name = "Toggle Catchable" - set category = "Preferences" + set category = "Preferences.Character" set desc = "Toggles being catchable with capture crystals." var/mob/living/L = mob diff --git a/code/modules/client/ui_style.dm b/code/modules/client/ui_style.dm index 653242dabc..9cd68b8606 100644 --- a/code/modules/client/ui_style.dm +++ b/code/modules/client/ui_style.dm @@ -37,7 +37,7 @@ var/global/list/all_tooltip_styles = list( /client/verb/change_ui() set name = "Change UI" - set category = "Preferences" + set category = "Preferences.Game" set desc = "Configure your user interface" if(!ishuman(usr)) diff --git a/code/modules/client/verbs/advanced_who.dm b/code/modules/client/verbs/advanced_who.dm index a8acf146ce..4c4af542a4 100644 --- a/code/modules/client/verbs/advanced_who.dm +++ b/code/modules/client/verbs/advanced_who.dm @@ -1,7 +1,7 @@ /client/verb/who_advanced() set name = "Advanced Who" - set category = "OOC" + set category = "OOC.Resources" var/msg = span_bold("Current Players:") + "\n" diff --git a/code/modules/client/verbs/character_directory.dm b/code/modules/client/verbs/character_directory.dm index 8155adab8d..c35b295469 100644 --- a/code/modules/client/verbs/character_directory.dm +++ b/code/modules/client/verbs/character_directory.dm @@ -2,7 +2,7 @@ GLOBAL_DATUM(character_directory, /datum/character_directory) /client/verb/show_character_directory() set name = "Character Directory" - set category = "OOC" + set category = "OOC.Game" set desc = "Shows a listing of all active characters, along with their associated OOC notes, flavor text, and more." // This is primarily to stop malicious users from trying to lag the server by spamming this verb diff --git a/code/modules/client/verbs/ignore.dm b/code/modules/client/verbs/ignore.dm index 1e5237d3b1..9981348f2b 100644 --- a/code/modules/client/verbs/ignore.dm +++ b/code/modules/client/verbs/ignore.dm @@ -1,6 +1,6 @@ /client/verb/ignore(key_to_ignore as text) set name = "Ignore" - set category = "OOC" + set category = "OOC.Chat Settings" set desc = "Makes OOC and Deadchat messages from a specific player not appear to you." if(!key_to_ignore) @@ -20,7 +20,7 @@ /client/verb/unignore() set name = "Unignore" - set category = "OOC" + set category = "OOC.Chat Settings" set desc = "Reverts your ignoring of a specific player." if(!prefs) diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm index 5e6d1b5f5d..63d7793ce8 100644 --- a/code/modules/client/verbs/ooc.dm +++ b/code/modules/client/verbs/ooc.dm @@ -1,7 +1,7 @@ /client/verb/ooc(msg as text) set name = "OOC" - set category = "OOC" + set category = "OOC.Chat" if(say_disabled) //This is here to try to identify lag problems to_chat(usr, span_warning("Speech is currently admin-disabled.")) @@ -84,7 +84,7 @@ /client/verb/looc(msg as text) set name = "LOOC" set desc = "Local OOC, seen only by those in view." - set category = "OOC" + set category = "OOC.Chat" if(say_disabled) //This is here to try to identify lag problems to_chat(usr, span_danger("Speech is currently admin-disabled.")) @@ -198,7 +198,7 @@ /client/verb/fit_viewport() set name = "Fit Viewport" - set category = "OOC" + set category = "OOC.Client Settings" set desc = "Fit the width of the map window to match the viewport" // Fetch aspect ratio diff --git a/code/modules/client/verbs/ping.dm b/code/modules/client/verbs/ping.dm index 706edc02f6..32c8f8244e 100644 --- a/code/modules/client/verbs/ping.dm +++ b/code/modules/client/verbs/ping.dm @@ -1,5 +1,16 @@ + +/client/verb/update_ping(time as num) + set instant = TRUE + set name = ".update_ping" + var/ping = pingfromtime(time) + lastping = ping + if (!avgping) + avgping = ping + else + avgping = MC_AVERAGE_SLOW(avgping, ping) + /client/proc/pingfromtime(time) - return ((world.time+world.tick_lag*world.tick_usage/100)-time)*100 + return ((world.time+world.tick_lag*TICK_USAGE_REAL/100)-time)*100 /client/verb/display_ping(time as num) set instant = TRUE @@ -8,5 +19,5 @@ /client/verb/ping() set name = "Ping" - set category = "OOC" - winset(src, null, "command=.display_ping+[world.time+world.tick_lag*world.tick_usage/100]") + set category = "OOC.Debug" + winset(src, null, "command=.display_ping+[world.time+world.tick_lag*TICK_USAGE_REAL/100]") diff --git a/code/modules/client/verbs/suicide.dm b/code/modules/client/verbs/suicide.dm index 050d663787..21eb9a135d 100644 --- a/code/modules/client/verbs/suicide.dm +++ b/code/modules/client/verbs/suicide.dm @@ -80,7 +80,7 @@ /* /mob/living/silicon/pai/verb/suicide() - set category = "pAI Commands" + set category = "Abilities.pAI Commands" set desc = "Kill yourself and become a ghost (You will receive a confirmation prompt)" set name = "pAI Suicide" var/answer = tgui_alert(usr, "REALLY kill yourself? This action can't be undone.", "Suicide", list("Yes","No")) diff --git a/code/modules/client/verbs/who.dm b/code/modules/client/verbs/who.dm index a2b789af6a..942ecd5e52 100644 --- a/code/modules/client/verbs/who.dm +++ b/code/modules/client/verbs/who.dm @@ -1,6 +1,6 @@ /client/verb/who() set name = "Who" - set category = "OOC" + set category = "OOC.Resources" var/msg = span_bold("Current Players:") + "\n" diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index f45481622a..45f808a148 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -630,7 +630,7 @@ /obj/item/clothing/shoes/proc/draw_knife() set name = "Draw Boot Knife" set desc = "Pull out your boot knife." - set category = "IC" + set category = "IC.Game" set src in usr if(usr.stat || usr.restrained() || usr.incapacitated()) diff --git a/code/modules/clothing/masks/monitor.dm b/code/modules/clothing/masks/monitor.dm index 9e25521dd9..5efb8fb6d5 100644 --- a/code/modules/clothing/masks/monitor.dm +++ b/code/modules/clothing/masks/monitor.dm @@ -47,7 +47,7 @@ /obj/item/clothing/mask/monitor/verb/set_monitor_state() set name = "Set Monitor State" set desc = "Choose an icon for your monitor." - set category = "IC" + set category = "IC.Game" set src in usr var/mob/living/carbon/human/H = loc diff --git a/code/modules/eventkit/gm_interfaces/fake_pda_conversations.dm b/code/modules/eventkit/gm_interfaces/fake_pda_conversations.dm index accd006fe1..b54ec0a780 100644 --- a/code/modules/eventkit/gm_interfaces/fake_pda_conversations.dm +++ b/code/modules/eventkit/gm_interfaces/fake_pda_conversations.dm @@ -5,7 +5,7 @@ /client/proc/fake_pdaconvos() - set category = "EventKit" + set category = "Fun.Event Kit" set name = "Manage PDA identities" set desc = "Creates fake identities for use in setting up PDA props" diff --git a/code/modules/eventkit/gm_interfaces/mob_spawner.dm b/code/modules/eventkit/gm_interfaces/mob_spawner.dm index 8e6cc6e8c7..85adcecc3f 100644 --- a/code/modules/eventkit/gm_interfaces/mob_spawner.dm +++ b/code/modules/eventkit/gm_interfaces/mob_spawner.dm @@ -193,7 +193,7 @@ qdel(src) /client/proc/eventkit_open_mob_spawner() - set category = "EventKit" + set category = "Fun.Event Kit" set name = "Open Mob Spawner" set desc = "Opens an advanced version of the mob spawner." diff --git a/code/modules/events/event_manager.dm b/code/modules/events/event_manager.dm index cc0972f208..6416a583a0 100644 --- a/code/modules/events/event_manager.dm +++ b/code/modules/events/event_manager.dm @@ -224,7 +224,7 @@ /client/proc/forceEvent(var/type in SSevents.allEvents) set name = "Trigger Event (Debug Only)" - set category = "Debug" + set category = "Debug.Dangerous" if(!holder) return @@ -235,6 +235,6 @@ /client/proc/event_manager_panel() set name = "Event Manager Panel" - set category = "Admin" + set category = "Admin.Events" SSevents.Interact(usr) feedback_add_details("admin_verb","EMP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/examine/examine.dm b/code/modules/examine/examine.dm index 16f1b305ab..92cefa1ce1 100644 --- a/code/modules/examine/examine.dm +++ b/code/modules/examine/examine.dm @@ -63,7 +63,7 @@ //mob verbs are faster than object verbs. See http://www.byond.com/forum/?post=1326139&page=2#comment8198716 for why this isn't atom/verb/examine() /mob/verb/examinate(atom/A as mob|obj|turf in _validate_atom(A)) set name = "Examine" - set category = "IC" + set category = "IC.Game" if((is_blind(src) || usr.stat) && !isobserver(src)) to_chat(src, span_notice("Something is there but you can't see it.")) @@ -93,7 +93,7 @@ /mob/verb/mob_examine() set name = "Mob Examine" set desc = "Allows one to examine mobs they can see, even from inside of bellies and objects." - set category = "IC" + set category = "IC.Game" set popup_menu = FALSE if((is_blind(src) || src.stat) && !isobserver(src)) diff --git a/code/modules/flufftext/look_up.dm b/code/modules/flufftext/look_up.dm index 1bfcf6898c..01d0cd69c9 100644 --- a/code/modules/flufftext/look_up.dm +++ b/code/modules/flufftext/look_up.dm @@ -2,7 +2,7 @@ /mob/living/verb/look_up() set name = "Look Up" - set category = "IC" + set category = "IC.Game" set desc = "Look above you, and hope there's no ceiling spiders." to_chat(usr, "You look upwards...") diff --git a/code/modules/food/recipe_dump.dm b/code/modules/food/recipe_dump.dm index 8e1ac10571..21733d96b6 100644 --- a/code/modules/food/recipe_dump.dm +++ b/code/modules/food/recipe_dump.dm @@ -1,6 +1,6 @@ /client/proc/recipe_dump() set name = "Generate Recipe Dump" - set category = "Server" + set category = "Server.Admin" set desc = "Dumps food and drink recipe info and images for wiki or other use." if(!holder) diff --git a/code/modules/media/mediamanager.dm b/code/modules/media/mediamanager.dm index f9a24ac630..e23866e8e9 100644 --- a/code/modules/media/mediamanager.dm +++ b/code/modules/media/mediamanager.dm @@ -54,7 +54,7 @@ /client/verb/change_volume() set name = "Set Volume" - set category = "OOC" + set category = "OOC.Client Settings" set desc = "Set jukebox volume" set_new_volume(usr) diff --git a/code/modules/mentor/mentor.dm b/code/modules/mentor/mentor.dm index 4242654b42..c6524130aa 100644 --- a/code/modules/mentor/mentor.dm +++ b/code/modules/mentor/mentor.dm @@ -43,7 +43,7 @@ var/list/mentor_verbs_default = list( remove_verb(src, mentor_verbs_default) /client/proc/make_mentor() - set category = "Special Verbs" + set category = "Admin.Secrets" set name = "Make Mentor" if(!holder) to_chat(src, span_admin_pm_warning("Error: Only administrators may use this command.")) @@ -66,7 +66,7 @@ var/list/mentor_verbs_default = list( feedback_add_details("admin_verb","Make Mentor") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/unmake_mentor() - set category = "Special Verbs" + set category = "Admin.Secrets" set name = "Unmake Mentor" if(!holder) to_chat(src, span_admin_pm_warning("Error: Only administrators may use this command.")) @@ -85,7 +85,7 @@ var/list/mentor_verbs_default = list( feedback_add_details("admin_verb","Unmake Mentor") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_mentor_say(msg as text) - set category = "Admin" + set category = "Admin.Chat" set name ="Mentorsay" //check rights @@ -126,7 +126,7 @@ var/list/mentor_verbs_default = list( mentor_commands(href, href_list, usr) /client/proc/cmd_dementor() - set category = "Admin" + set category = "Admin.Misc" set name = "De-mentor" if(tgui_alert(usr, "Confirm self-dementor for the round? You can't re-mentor yourself without someone promoting you.","Dementor",list("Yes","No")) == "Yes") diff --git a/code/modules/mentor/mentorhelp.dm b/code/modules/mentor/mentorhelp.dm index cbf457083a..d801effd6e 100644 --- a/code/modules/mentor/mentorhelp.dm +++ b/code/modules/mentor/mentorhelp.dm @@ -480,7 +480,7 @@ GLOBAL_DATUM_INIT(mhelp_tickets, /datum/mentor_help_tickets, new) //admin proc /client/proc/cmd_mentor_ticket_panel() set name = "Mentor Ticket List" - set category = "Admin" + set category = "Admin.Misc" var/browse_to diff --git a/code/modules/mining/abandonedcrates_vr.dm b/code/modules/mining/abandonedcrates_vr.dm index e57c911f40..7d7ed2ad98 100644 --- a/code/modules/mining/abandonedcrates_vr.dm +++ b/code/modules/mining/abandonedcrates_vr.dm @@ -41,7 +41,7 @@ list(/obj/item/toy/syndicateballoon, 3) = 2, list(/obj/item/clothing/suit/ianshirt, 3) = 2, list(/obj/item/clothing/head/bearpelt, 4) = 2, - //list(/obj/item/archaeological_find, 3) = 2, //ChompREMOVE - causes runtimes + //list(/obj/item/archaeological_find, 3) = 2, // Removed, causes runtimes list(pick(subtypesof(/obj/item/toy/mecha)), 4) = 2, list(pick(subtypesof(/obj/item/toy/figure)), 4) = 2, list(pick(subtypesof(/obj/item/toy/plushie)), 4) = 2, diff --git a/code/modules/mob/autowhisper.dm b/code/modules/mob/autowhisper.dm index 03584e93ea..e667c63931 100644 --- a/code/modules/mob/autowhisper.dm +++ b/code/modules/mob/autowhisper.dm @@ -1,7 +1,7 @@ /mob/living/verb/toggle_autowhisper() set name = "Autowhisper Toggle" set desc = "Toggle whether you will automatically whisper/subtle" - set category = "IC" + set category = "IC.Settings" autowhisper = !autowhisper if(autowhisper_display) @@ -24,7 +24,7 @@ /mob/living/verb/autowhisper_mode() set name = "Autowhisper Mode" set desc = "Set the mode your emotes will default to while using Autowhisper" - set category = "IC" + set category = "IC.Settings" var/choice = tgui_input_list(src, "Select Custom Subtle Mode", "Custom Subtle Mode", list("Adjacent Turfs (Default)", "My Turf", "My Table", "Current Belly (Prey)", "Specific Belly (Pred)", "Specific Person", "Psay/Pme")) diff --git a/code/modules/mob/dead/observer/free_vr.dm b/code/modules/mob/dead/observer/free_vr.dm index e57bfd3678..811a535ab1 100644 --- a/code/modules/mob/dead/observer/free_vr.dm +++ b/code/modules/mob/dead/observer/free_vr.dm @@ -8,7 +8,7 @@ var/global/list/prevent_respawns = list() /mob/observer/dead/verb/cleanup() set name = "Quit This Round" - set category = "OOC" + set category = "OOC.Game" set desc = "Free your job slot, remove yourself from the manifest, and prevent respawning as this character for this round." var/confirm = tgui_alert(usr, "This will free up your job slot, remove you from the manifest, and allow you to respawn as this character. You can rejoin as another \ diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index dea1e3ea13..83a81d2c36 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -215,7 +215,7 @@ Works together with spawning an observer, noted above. This is the proc mobs get to turn into a ghost. Forked from ghostize due to compatibility issues. */ /mob/living/verb/ghost() - set category = "OOC" + set category = "OOC.Game" set name = "Ghost" set desc = "Relinquish your life and enter the land of the dead." @@ -258,7 +258,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp . += "[eta_status]" /mob/observer/dead/verb/reenter_corpse() - set category = "Ghost" + set category = "Ghost.Game" set name = "Re-enter Corpse" if(!client) return if(!(mind && mind.current && can_reenter_corpse)) @@ -295,7 +295,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return 1 /mob/observer/dead/verb/toggle_medHUD() - set category = "Ghost" + set category = "Ghost.Settings" set name = "Toggle MedicHUD" set desc = "Toggles Medical HUD allowing you to see how everyone is doing" @@ -305,7 +305,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp to_chat(src, span_boldnotice("Medical HUD [medHUD ? "Enabled" : "Disabled"]")) /mob/observer/dead/verb/toggle_secHUD() - set category = "Ghost" + set category = "Ghost.Settings" set name = "Toggle Security HUD" set desc = "Toggles Security HUD allowing you to see people's displayed ID's job, wanted status, etc" @@ -318,7 +318,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp to_chat(src, span_boldnotice("Security HUD [secHUD ? "Enabled" : "Disabled"]")) /mob/observer/dead/verb/toggle_antagHUD() - set category = "Ghost" + set category = "Ghost.Settings" set name = "Toggle AntagHUD" set desc = "Toggles AntagHUD allowing you to see who is the antagonist" @@ -370,7 +370,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/observer/dead/verb/dead_tele(areaname as anything in jumpable_areas()) set name = "Teleport" - set category = "Ghost" + set category = "Ghost.Game" set desc = "Teleport to a location." if(!istype(usr, /mob/observer/dead)) @@ -379,12 +379,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/area/A - if(!areaname) - var/list/areas = jumpable_areas() - var/input = tgui_input_list(usr, "Select an area:", "Ghost Teleport", areas) - if(!input) - return - A = areas[input] + if(areaname) + A = return_sorted_areas()[areaname] + else + A = return_sorted_areas()[tgui_input_list(usr, "Select an area:", "Ghost Teleport", jumpable_areas())] if(!A) return @@ -392,12 +390,12 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp to_chat(usr, "Not when you're not dead!") return - usr.forceMove(pick(get_area_turfs(A || jumpable_areas()[areaname]))) + usr.forceMove(pick(get_area_turfs(A))) usr.on_mob_jump() /mob/observer/dead/verb/follow(mobname as anything in jumpable_mobs()) set name = "Follow" - set category = "Ghost" + set category = "Ghost.Game" set desc = "Follow and haunt a mob." if(!istype(usr, /mob/observer/dead)) @@ -571,7 +569,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return (T && T.holy) && (is_manifest || (mind in cult.current_antagonists)) /mob/observer/dead/verb/jumptomob() //Moves the ghost instead of just changing the ghosts's eye -Nodrak - set category = "Ghost" + set category = "Ghost.Game" set name = "Jump to Mob" set desc = "Teleport to a mob" set popup_menu = FALSE @@ -610,7 +608,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/observer/dead/verb/analyze_air() set name = "Analyze Air" - set category = "Ghost" + set category = "Ghost.Game" if(!istype(usr, /mob/observer/dead)) return @@ -637,7 +635,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/observer/dead/verb/check_radiation() set name = "Check Radiation" - set category = "Ghost" + set category = "Ghost.Game" var/turf/t = get_turf(src) if(t) @@ -647,7 +645,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/observer/dead/verb/become_mouse() set name = "Become mouse" - set category = "Ghost" + set category = "Ghost.Join" if(CONFIG_GET(flag/disable_player_mice)) to_chat(src, span_warning("Spawning as a mouse is currently disabled.")) @@ -701,7 +699,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/observer/dead/verb/view_manfiest() set name = "Show Crew Manifest" - set category = "Ghost" + set category = "Ghost.Game" var/datum/tgui_module/crew_manifest/self_deleting/S = new(src) S.tgui_interact(src) @@ -718,7 +716,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp //Used for drawing on walls with blood puddles as a spooky ghost. /mob/observer/dead/verb/bloody_doodle() - set category = "Ghost" + set category = "Ghost.Game" set name = "Write in blood" set desc = "If the round is sufficiently spooky, write a short message in blood on the floor or a wall. Remember, no IC in OOC or OOC in IC." @@ -829,7 +827,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp client.images += J /mob/observer/dead/proc/toggle_visibility(var/forced = 0) - set category = "Ghost" + set category = "Ghost.Settings" set name = "Toggle Visibility" set desc = "Allows you to turn (in)visible (almost) at will." @@ -851,7 +849,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp toggle_icon("cult") /mob/observer/dead/verb/toggle_anonsay() - set category = "Ghost" + set category = "Ghost.Settings" set name = "Toggle Anonymous Chat" set desc = "Toggles showing your key in dead chat." @@ -870,7 +868,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/observer/dead/verb/toggle_ghostsee() set name = "Toggle Ghost Vision" set desc = "Toggles your ability to see things only ghosts can see, like other ghosts" - set category = "Ghost" + set category = "Ghost.Settings" ghostvision = !ghostvision updateghostsight() to_chat(src, span_filter_notice("You [ghostvision ? "now" : "no longer"] have ghost vision.")) @@ -878,7 +876,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/observer/dead/verb/toggle_darkness() set name = "Toggle Darkness" set desc = "Toggles your ability to see lighting overlays, and the darkness they create." - set category = "Ghost" + set category = "Ghost.Settings" var/static/list/darkness_names = list("normal darkness levels", "30% darkness removed", "70% darkness removed", "no darkness") var/static/list/darkness_levels = list(255, 178, 76, 0) @@ -931,7 +929,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/observer/dead/proc/ghost_whisper() set name = "Spectral Whisper" - set category = "IC" + set category = "IC.Subtle" if(is_manifest) //Only able to whisper if it's hit with a tome. var/list/options = list() @@ -952,7 +950,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp to_chat(src, span_danger("You have not been pulled past the veil!")) /mob/observer/dead/verb/choose_ghost_sprite() - set category = "Ghost" + set category = "Ghost.Settings" set name = "Choose Sprite" var/choice @@ -986,7 +984,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return FALSE /mob/observer/dead/verb/paialert() - set category = "Ghost" + set category = "Ghost.Message" set name = "Blank pAI alert" set desc = "Flash an indicator light on available blank pAI devices for a smidgen of hope." @@ -1042,5 +1040,5 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/observer/dead/verb/respawn() set name = "Respawn" - set category = "Ghost" + set category = "Ghost.Join" src.abandon_mob() diff --git a/code/modules/mob/dead/observer/observer_vr.dm b/code/modules/mob/dead/observer/observer_vr.dm index 078ea96cdd..fad743e5c5 100644 --- a/code/modules/mob/dead/observer/observer_vr.dm +++ b/code/modules/mob/dead/observer/observer_vr.dm @@ -1,5 +1,5 @@ /mob/observer/dead/verb/nifjoin() - set category = "Ghost" + set category = "Ghost.Join" set name = "Join Into Soulcatcher" set desc = "Select a player with a working NIF + Soulcatcher NIFSoft to join into it." @@ -58,7 +58,7 @@ SC.catch_mob(src) //This will result in us being deleted so... /mob/observer/dead/verb/backup_ping() - set category = "Ghost" + set category = "Ghost.Join" set name = "Notify Transcore" set desc = "If your past-due backup notification was missed or ignored, you can use this to send a new one." @@ -86,7 +86,7 @@ to_chat(src,span_warning("No backup record could be found, sorry.")) /* /mob/observer/dead/verb/backup_delay() - set category = "Ghost" + set category = "Ghost.Settings" set name = "Cancel Transcore Notification" set desc = "You can use this to avoid automatic backup notification happening. Manual notification can still be used." @@ -105,7 +105,7 @@ to_chat(src,span_warning("No backup record could be found, sorry.")) */ /mob/observer/dead/verb/findghostpod() //Moves the ghost instead of just changing the ghosts's eye -Nodrak - set category = "Ghost" + set category = "Ghost.Join" set name = "Find Ghost Pod" set desc = "Find an active ghost pod" set popup_menu = FALSE @@ -132,7 +132,7 @@ to_chat(src, span_filter_notice("This ghost pod is not located in the game world.")) /mob/observer/dead/verb/findautoresleever() - set category = "Ghost" + set category = "Ghost.Join" set name = "Find Auto Resleever" set desc = "Find a Auto Resleever" set popup_menu = FALSE diff --git a/code/modules/mob/freelook/ai/eye.dm b/code/modules/mob/freelook/ai/eye.dm index fa3fb311f0..679d02c37c 100644 --- a/code/modules/mob/freelook/ai/eye.dm +++ b/code/modules/mob/freelook/ai/eye.dm @@ -10,7 +10,7 @@ /mob/observer/eye/aiEye/New() ..() visualnet = cameranet - + /mob/observer/eye/aiEye/Destroy() if(owner) var/mob/living/silicon/ai/ai = owner @@ -105,7 +105,7 @@ src.eyeobj.setLoc(src) /mob/living/silicon/ai/proc/toggle_acceleration() - set category = "AI Settings" + set category = "AI.Settings" set name = "Toggle Camera Acceleration" if(!eyeobj) diff --git a/code/modules/mob/language/language.dm b/code/modules/mob/language/language.dm index f6d433a391..41f1b65066 100644 --- a/code/modules/mob/language/language.dm +++ b/code/modules/mob/language/language.dm @@ -285,7 +285,7 @@ /mob/verb/check_languages() set name = "Check Known Languages" - set category = "IC" + set category = "IC.Game" set src = usr var/datum/browser/popup = new(src, "checklanguage", "Known Languages", 420, 470) diff --git a/code/modules/mob/language/snowflake.dm b/code/modules/mob/language/snowflake.dm index 7c8160c5c1..9524fb638c 100644 --- a/code/modules/mob/language/snowflake.dm +++ b/code/modules/mob/language/snowflake.dm @@ -4,7 +4,7 @@ /mob/proc/adjust_hive_range() set name = "Adjust Special Language Range" set desc = "Changes the range you will transmit your hive language to!" - set category = "IC" + set category = "IC.Settings" var/option = tgui_alert(src, "What range?", "Adjust special language range", list("Global","This Z level","Local", "Subtle")) diff --git a/code/modules/mob/living/autohiss.dm b/code/modules/mob/living/autohiss.dm index dd63c80415..618c0a3225 100644 --- a/code/modules/mob/living/autohiss.dm +++ b/code/modules/mob/living/autohiss.dm @@ -20,7 +20,7 @@ /client/verb/toggle_autohiss() set name = "Toggle Auto-Hiss" set desc = "Toggle automatic hissing as Unathi and r-rolling as Taj" - set category = "OOC" + set category = "OOC.Game Settings" autohiss_mode = (autohiss_mode + 1) % AUTOHISS_NUM switch(autohiss_mode) diff --git a/code/modules/mob/living/carbon/alien/diona/diona_powers.dm b/code/modules/mob/living/carbon/alien/diona/diona_powers.dm index 492a590793..a2b33f7973 100644 --- a/code/modules/mob/living/carbon/alien/diona/diona_powers.dm +++ b/code/modules/mob/living/carbon/alien/diona/diona_powers.dm @@ -1,7 +1,7 @@ //Verbs after this point. /mob/living/carbon/alien/diona/proc/merge() - set category = "Abilities" + set category = "Abilities.Diona" set name = "Merge with gestalt" set desc = "Merge with another diona." @@ -41,7 +41,7 @@ /mob/living/carbon/alien/diona/proc/split() - set category = "Abilities" + set category = "Abilities.Diona" set name = "Split from gestalt" set desc = "Split away from your gestalt as a lone nymph." diff --git a/code/modules/mob/living/carbon/alien/progression.dm b/code/modules/mob/living/carbon/alien/progression.dm index e59688646e..af26a44221 100644 --- a/code/modules/mob/living/carbon/alien/progression.dm +++ b/code/modules/mob/living/carbon/alien/progression.dm @@ -2,7 +2,7 @@ set name = "Evolve" set desc = "Evolve into your adult form." - set category = "Abilities" + set category = "Abilities.General" if(stat != CONSCIOUS) return diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm index f25f41cc7a..6f98a87804 100644 --- a/code/modules/mob/living/carbon/brain/brain.dm +++ b/code/modules/mob/living/carbon/brain/brain.dm @@ -54,7 +54,7 @@ // Vorestation edit start /mob/living/carbon/brain/verb/backup_ping() - set category = "IC" + set category = "IC.Game" set name = "Notify Transcore" set desc = "Your body is gone. Notify robotics to be resleeved!" var/datum/transcore_db/db = SStranscore.db_by_mind_name(mind.name) diff --git a/code/modules/mob/living/carbon/carbon_powers.dm b/code/modules/mob/living/carbon/carbon_powers.dm index f805968d40..d6fdc94788 100644 --- a/code/modules/mob/living/carbon/carbon_powers.dm +++ b/code/modules/mob/living/carbon/carbon_powers.dm @@ -1,7 +1,7 @@ //Brain slug proc for voluntary removal of control. /mob/living/carbon/proc/release_control() - set category = "Abilities" + set category = "Abilities.Brainslug" set name = "Release Control" set desc = "Release control of your host's body." @@ -21,7 +21,7 @@ //Brain slug proc for tormenting the host. /mob/living/carbon/proc/punish_host() - set category = "Abilities" + set category = "Abilities.Brainslug" set name = "Torment host" set desc = "Punish your host with agony." @@ -39,7 +39,7 @@ to_chat(B.host_brain, span_danger("Horrific, burning agony lances through you, ripping a soundless scream from your trapped mind!")) /mob/living/carbon/proc/spawn_larvae() - set category = "Abilities" + set category = "Abilities.Brainslug" set name = "Reproduce" set desc = "Spawn several young." diff --git a/code/modules/mob/living/carbon/give.dm b/code/modules/mob/living/carbon/give.dm index fa60a10498..93559fbd98 100644 --- a/code/modules/mob/living/carbon/give.dm +++ b/code/modules/mob/living/carbon/give.dm @@ -1,5 +1,5 @@ /mob/living/verb/give(var/mob/living/target in living_mobs(1)) - set category = "IC" + set category = "IC.Game" set name = "Give" do_give(target) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 0d9d9d975e..21e87074bf 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -331,7 +331,7 @@ var/list/_simple_mob_default_emotes = list( /mob/living/carbon/human/verb/pose() set name = "Set Pose" set desc = "Sets a description which will be shown when someone examines you." - set category = "IC" + set category = "IC.Settings" var/datum/gender/T = gender_datums[get_visible_gender()] @@ -340,7 +340,7 @@ var/list/_simple_mob_default_emotes = list( /mob/living/carbon/human/verb/set_flavor() set name = "Set Flavour Text" set desc = "Sets an extended description of your character's features." - set category = "IC" + set category = "IC.Settings" var/HTML = "" HTML += "
" diff --git a/code/modules/mob/living/carbon/human/emote_vr.dm b/code/modules/mob/living/carbon/human/emote_vr.dm index 7339a35cdd..25669fb6f8 100644 --- a/code/modules/mob/living/carbon/human/emote_vr.dm +++ b/code/modules/mob/living/carbon/human/emote_vr.dm @@ -1,7 +1,7 @@ /mob/living/carbon/human/verb/toggle_resizing_immunity() set name = "Toggle Resizing Immunity" set desc = "Toggles your ability to resist resizing attempts" - set category = "IC" + set category = "IC.Settings" resizable = !resizable to_chat(src, span_notice("You are now [resizable ? "susceptible" : "immune"] to being resized.")) @@ -35,7 +35,7 @@ /mob/living/carbon/human/verb/toggle_gender_identity_vr() set name = "Set Gender Identity" set desc = "Sets the pronouns when examined and performing an emote." - set category = "IC" + set category = "IC.Settings" var/new_gender_identity = tgui_input_list(usr, "Please select a gender Identity:", "Set Gender Identity", list(FEMALE, MALE, NEUTER, PLURAL, HERM)) if(!new_gender_identity) return 0 @@ -44,14 +44,14 @@ /mob/living/carbon/human/verb/switch_tail_layer() set name = "Switch tail layer" - set category = "IC" + set category = "IC.Game" set desc = "Switch tail layer on top." tail_alt = !tail_alt update_tail_showing() /mob/living/carbon/human/verb/hide_wings_vr() set name = "Show/Hide wings" - set category = "IC" + set category = "IC.Settings" set desc = "Hide your wings, or show them if you already hid them." wings_hidden = !wings_hidden update_wing_showing() @@ -64,7 +64,7 @@ /mob/living/carbon/human/verb/hide_tail_vr() set name = "Show/Hide tail" - set category = "IC" + set category = "IC.Settings" set desc = "Hide your tail, or show it if you already hid it." if(!tail_style) //Just some checks. to_chat(src,span_notice("You have no tail to hide!")) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 75c4c2d9ce..eb89d07364 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -70,7 +70,7 @@ /mob/living/carbon/human/Destroy() human_mob_list -= src - /* //Chomp REMOVE - this is done on mob/living/Destroy + /* //REMOVE - this is done on mob/living/Destroy for(var/organ in organs) qdel(organ) */ @@ -947,7 +947,7 @@ /mob/living/carbon/human/proc/remotesay() set name = "Project mind" - set category = "Superpower" + set category = "Abilities.Superpower" if(stat!=CONSCIOUS) reset_view(0) @@ -976,7 +976,7 @@ /mob/living/carbon/human/proc/remoteobserve() set name = "Remote View" - set category = "Superpower" + set category = "Abilities.Superpower" if(stat!=CONSCIOUS) remoteview_target = null @@ -1339,7 +1339,7 @@ return 0 /mob/living/carbon/human/proc/bloody_doodle() - set category = "IC" + set category = "IC.Game" set name = "Write in blood" set desc = "Use blood on your hands to write a short message on the floor or a wall, murder mystery style." @@ -1648,7 +1648,7 @@ /mob/living/carbon/human/verb/pull_punches() set name = "Pull Punches" set desc = "Try not to hurt them." - set category = "IC" + set category = "IC.Game" if(stat) return pulling_punches = !pulling_punches diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 34054954e9..ddcc522f21 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -446,7 +446,7 @@ /mob/living/carbon/human/verb/check_attacks() set name = "Check Attacks" - set category = "IC" + set category = "IC.Game" set src = usr var/dat = span_bold(span_giant("Known Attacks")) + "

" diff --git a/code/modules/mob/living/carbon/human/human_attackhand_vr.dm b/code/modules/mob/living/carbon/human/human_attackhand_vr.dm index bbee7002ac..7175f645cc 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand_vr.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand_vr.dm @@ -3,7 +3,7 @@ /mob/living/carbon/human/verb/check_attacks() set name = "Check Attacks" - set category = "IC" + set category = "IC.Game" set src = usr var/dat = span_bold("Known Attacks") + "

" diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm index 1d6746cfc0..9abd6ddf22 100644 --- a/code/modules/mob/living/carbon/human/human_powers.dm +++ b/code/modules/mob/living/carbon/human/human_powers.dm @@ -4,7 +4,7 @@ /mob/living/carbon/human/proc/tie_hair() set name = "Tie Hair" set desc = "Style your hair." - set category = "IC" + set category = "IC.Game" if(incapacitated()) to_chat(src, span_warning("You can't mess with your hair right now!")) @@ -34,7 +34,7 @@ to_chat(src, span_notice("You're already using that style.")) /mob/living/carbon/human/proc/tackle() - set category = "Abilities" + set category = "Abilities.General" set name = "Tackle" set desc = "Tackle someone down." @@ -81,7 +81,7 @@ O.show_message(span_warning(span_red(span_bold("[src] [failed ? "tried to tackle" : "has tackled"] down [T]!"))), 1) /mob/living/carbon/human/proc/commune() - set category = "Abilities" + set category = "Abilities.General" set name = "Commune with creature" set desc = "Send a telepathic message to an unlucky recipient." @@ -119,7 +119,7 @@ /mob/living/carbon/human/proc/regurgitate() set name = "Regurgitate" set desc = "Empties the contents of your stomach" - set category = "Abilities" + set category = "Abilities.General" if(stomach_contents.len) for(var/mob/M in src) @@ -132,7 +132,7 @@ /mob/living/carbon/human/proc/psychic_whisper(mob/M as mob in oview()) set name = "Psychic Whisper" set desc = "Whisper silently to someone over a distance." - set category = "Abilities" + set category = "Abilities.General" var/msg = sanitize(tgui_input_text(usr, "Message:", "Psychic Whisper")) if(msg) @@ -144,7 +144,7 @@ /mob/living/carbon/human/proc/diona_split_nymph() set name = "Split" set desc = "Split your humanoid form into its constituent nymphs." - set category = "Abilities" + set category = "Abilities.Diona" diona_split_into_nymphs(5) // Separate proc to void argments being supplied when used as a verb /mob/living/carbon/human/proc/diona_split_into_nymphs(var/number_of_resulting_nymphs) @@ -204,7 +204,7 @@ /mob/living/carbon/human/proc/self_diagnostics() set name = "Self-Diagnostics" set desc = "Run an internal self-diagnostic to check for damage." - set category = "IC" + set category = "Abilities.General" if(stat == DEAD) return @@ -247,7 +247,7 @@ /mob/living/carbon/human/proc/sonar_ping() set name = "Listen In" set desc = "Allows you to listen in to movement and noises around you." - set category = "Abilities" + set category = "Abilities.General" if(incapacitated()) to_chat(src, span_warning("You need to recover before you can use this ability.")) @@ -291,7 +291,7 @@ /mob/living/carbon/human/proc/regenerate() set name = "Regenerate" set desc = "Allows you to regrow limbs and heal organs after a period of rest." - set category = "Abilities" + set category = "Abilities.General" if(nutrition < 250) to_chat(src, span_warning("You lack the biomass to begin regeneration!")) @@ -355,7 +355,7 @@ /mob/living/carbon/human/proc/setmonitor_state() set name = "Set monitor display" set desc = "Set your monitor display" - set category = "IC" + set category = "IC.Settings" if(stat) to_chat(src,span_warning("You must be awake and standing to perform this action!")) return diff --git a/code/modules/mob/living/carbon/human/human_powers_vr.dm b/code/modules/mob/living/carbon/human/human_powers_vr.dm index a1a0c2b76a..acc53a7d49 100644 --- a/code/modules/mob/living/carbon/human/human_powers_vr.dm +++ b/code/modules/mob/living/carbon/human/human_powers_vr.dm @@ -1,7 +1,7 @@ /mob/living/carbon/human/proc/reagent_purge() set name = "Purge Reagents" set desc = "Empty yourself of any reagents you may have consumed or come into contact with." - set category = "IC" + set category = "IC.Game" if(stat == DEAD) return @@ -17,7 +17,7 @@ /mob/living/carbon/human/verb/toggle_eyes_layer() set name = "Switch Eyes/Monitor Layer" set desc = "Toggle rendering of eyes/monitor above markings." - set category = "IC" + set category = "IC.Settings" if(stat) to_chat(src, span_warning("You must be awake and standing to perform this action!")) diff --git a/code/modules/mob/living/carbon/human/species/species_shapeshift.dm b/code/modules/mob/living/carbon/human/species/species_shapeshift.dm index cac17137eb..69eee28388 100644 --- a/code/modules/mob/living/carbon/human/species/species_shapeshift.dm +++ b/code/modules/mob/living/carbon/human/species/species_shapeshift.dm @@ -79,7 +79,7 @@ var/list/wrapped_species_by_ref = list() /mob/living/carbon/human/proc/shapeshifter_select_hair() set name = "Select Hair" - set category = "Abilities" + set category = "Abilities.Shapeshift" if(stat || world.time < last_special) return @@ -123,7 +123,7 @@ var/list/wrapped_species_by_ref = list() /mob/living/carbon/human/proc/shapeshifter_select_gender() set name = "Select Gender" - set category = "Abilities" + set category = "Abilities.Shapeshift" if(stat || world.time < last_special) return @@ -145,7 +145,7 @@ var/list/wrapped_species_by_ref = list() /mob/living/carbon/human/proc/shapeshifter_select_shape() set name = "Select Body Shape" - set category = "Abilities" + set category = "Abilities.Shapeshift" if(stat || world.time < last_special) return @@ -172,7 +172,7 @@ var/list/wrapped_species_by_ref = list() /mob/living/carbon/human/proc/shapeshifter_select_colour() set name = "Select Body Colour" - set category = "Abilities" + set category = "Abilities.Shapeshift" if(stat || world.time < last_special) return @@ -210,7 +210,7 @@ var/list/wrapped_species_by_ref = list() /mob/living/carbon/human/proc/shapeshifter_select_hair_colors() set name = "Select Hair Colors" - set category = "Abilities" + set category = "Abilities.Shapeshift" if(stat || world.time < last_special) return @@ -309,7 +309,7 @@ var/list/wrapped_species_by_ref = list() /mob/living/carbon/human/proc/shapeshifter_select_eye_colour() set name = "Select Eye Color" - set category = "Abilities" + set category = "Abilities.Shapeshift" if(stat || world.time < last_special) return diff --git a/code/modules/mob/living/carbon/human/species/species_shapeshift_vr.dm b/code/modules/mob/living/carbon/human/species/species_shapeshift_vr.dm index 58b4a6d045..5a0d5ce3a6 100644 --- a/code/modules/mob/living/carbon/human/species/species_shapeshift_vr.dm +++ b/code/modules/mob/living/carbon/human/species/species_shapeshift_vr.dm @@ -4,7 +4,7 @@ /mob/living/carbon/human/proc/shapeshifter_select_ears() set name = "Select Ears" - set category = "Abilities" + set category = "Abilities.Shapeshift" if(stat || world.time < last_special) return @@ -89,7 +89,7 @@ /mob/living/carbon/human/proc/shapeshifter_select_tail() set name = "Select Tail" - set category = "Abilities" + set category = "Abilities.Shapeshift" if(stat || world.time < last_special) return @@ -143,7 +143,7 @@ /mob/living/carbon/human/proc/shapeshifter_select_wings() set name = "Select Wings" - set category = "Abilities" + set category = "Abilities.Shapeshift" if(stat || world.time < last_special) return @@ -199,7 +199,7 @@ /mob/living/carbon/human/proc/promethean_select_opaqueness() set name = "Toggle Transparency" - set category = "Abilities" + set category = "Abilities.Shapeshift" if(stat || world.time < last_special) return diff --git a/code/modules/mob/living/carbon/human/species/station/alraune.dm b/code/modules/mob/living/carbon/human/species/station/alraune.dm index 6889cb3bbb..239f4a4e5a 100644 --- a/code/modules/mob/living/carbon/human/species/station/alraune.dm +++ b/code/modules/mob/living/carbon/human/species/station/alraune.dm @@ -382,7 +382,7 @@ /mob/living/carbon/human/proc/alraune_fruit_select() //So if someone doesn't want fruit/vegetables, they don't have to select one. set name = "Select fruit" set desc = "Select what fruit/vegetable you wish to grow." - set category = "Abilities" + set category = "Abilities.Alraune" var/obj/item/organ/internal/fruitgland/fruit_gland for(var/F in contents) if(istype(F, /obj/item/organ/internal/fruitgland)) diff --git a/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm b/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm index 113c3c73ed..de24de4936 100644 --- a/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm @@ -40,7 +40,7 @@ /mob/living/carbon/human/proc/prommie_blobform() set name = "Toggle Blobform" set desc = "Switch between amorphous and humanoid forms." - set category = "Abilities" + set category = "Abilities.Promethean" set hidden = FALSE var/atom/movable/to_locate = temporary_form || src diff --git a/code/modules/mob/living/carbon/human/species/station/prommie_blob.dm b/code/modules/mob/living/carbon/human/species/station/prommie_blob.dm index 9f19887a66..a4bdf523a4 100644 --- a/code/modules/mob/living/carbon/human/species/station/prommie_blob.dm +++ b/code/modules/mob/living/carbon/human/species/station/prommie_blob.dm @@ -235,7 +235,7 @@ /mob/living/simple_mob/slime/promethean/proc/prommie_blobform() set name = "Toggle Blobform" set desc = "Switch between amorphous and humanoid forms." - set category = "Abilities" + set category = "Abilities.Promethean" set hidden = FALSE var/atom/movable/to_locate = src @@ -253,7 +253,7 @@ /mob/living/simple_mob/slime/promethean/proc/toggle_expand() set name = "Toggle Width" set desc = "Switch between smole and lorge." - set category = "Abilities" + set category = "Abilities.Promethean" set hidden = FALSE if(stat || world.time < last_special) @@ -273,7 +273,7 @@ /mob/living/simple_mob/slime/promethean/proc/toggle_shine() set name = "Toggle Shine" set desc = "Shine on you crazy diamond." - set category = "Abilities" + set category = "Abilities.Promethean" set hidden = FALSE if(stat || world.time < last_special) @@ -293,7 +293,7 @@ /mob/living/simple_mob/slime/promethean/proc/prommie_select_colour() set name = "Select Body Colour" - set category = "Abilities" + set category = "Abilities.Promethean" if(stat || world.time < last_special) return diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm index 9bca0bcfc7..0eba887099 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm @@ -1,6 +1,6 @@ /mob/living/carbon/human/proc/reconstitute_form() //Scree's race ability.in exchange for: No cloning. set name = "Reconstitute Form" - set category = "Abilities" + set category = "Abilities.General" // Sanity is mostly handled in chimera_regenerate() if(stat == DEAD) @@ -106,7 +106,7 @@ /mob/living/carbon/human/proc/hatch() set name = "Hatch" - set category = "Abilities" + set category = "Abilities.General" if(revive_ready != REVIVING_DONE) //Hwhat? @@ -388,7 +388,7 @@ /mob/living/carbon/human/proc/bloodsuck() set name = "Partially Drain prey of blood" set desc = "Bites prey and drains them of a significant portion of blood, feeding you in the process. You may only do this once per minute." - set category = "Abilities" + set category = "Abilities.General" if(stat || paralysis || stunned || weakened || lying || restrained() || buckled) @@ -510,7 +510,7 @@ /mob/living/carbon/human/proc/succubus_drain() set name = "Drain prey of nutrition" set desc = "Slowly drain prey of all the nutrition in their body, feeding you in the process. You may only do this to one person at a time." - set category = "Abilities" + set category = "Abilities.Succubus" if(!ishuman(src)) return //If you're not a human you don't have permission to do this. var/mob/living/carbon/human/C = src @@ -573,7 +573,7 @@ /mob/living/carbon/human/proc/succubus_drain_lethal() set name = "Lethally drain prey" //Provide a warning that THIS WILL KILL YOUR PREY. set desc = "Slowly drain prey of all the nutrition in their body, feeding you in the process. Once prey run out of nutrition, you will begin to drain them lethally. You may only do this to one person at a time." - set category = "Abilities" + set category = "Abilities.Succubus" if(!ishuman(src)) return //If you're not a human you don't have permission to do this. @@ -665,7 +665,7 @@ /mob/living/carbon/human/proc/slime_feed() set name = "Feed prey with self" set desc = "Slowly feed prey with your body, draining you in the process. You may only do this to one person at a time." - set category = "Abilities" + set category = "Abilities.Vore" if(!ishuman(src)) return //If you're not a human you don't have permission to do this. var/mob/living/carbon/human/C = src @@ -726,7 +726,7 @@ /mob/living/carbon/human/proc/succubus_drain_finalize() set name = "Drain/Feed Finalization" set desc = "Toggle to allow for draining to be prolonged. Turn this on to make it so prey will be knocked out/die while being drained, or you will feed yourself to the prey's selected stomach if you're feeding them. Can be toggled at any time." - set category = "Abilities" + set category = "Abilities.Succubus" var/mob/living/carbon/human/C = src C.drain_finalized = !C.drain_finalized @@ -818,7 +818,7 @@ /mob/living/proc/shred_limb() set name = "Damage/Remove Prey's Organ" set desc = "Severely damages prey's organ. If the limb is already severely damaged, it will be torn off." - set category = "Abilities" + set category = "Abilities.Vore" //can_shred() will return a mob we can shred, if we can shred any. var/mob/living/carbon/human/T = can_shred() @@ -894,13 +894,13 @@ /mob/living/proc/shred_limb_temp() set name = "Damage/Remove Prey's Organ (beartrap)" set desc = "Severely damages prey's organ. If the limb is already severely damaged, it will be torn off." - set category = "Abilities" + set category = "Abilities.Vore" shred_limb() /mob/living/proc/flying_toggle() set name = "Toggle Flight" set desc = "While flying over open spaces, you will use up some nutrition. If you run out nutrition, you will fall." - set category = "Abilities" + set category = "Abilities.General" var/mob/living/carbon/human/C = src if(!C.wing_style) //The species var isn't taken into account here, as it's only purpose is to give this proc to a person. @@ -923,7 +923,7 @@ /mob/living/proc/flying_vore_toggle() set name = "Toggle Flight Vore" set desc = "Allows you to engage in voracious misadventures while flying." - set category = "Abilities" + set category = "Abilities.Vore" flight_vore = !flight_vore if(flight_vore) @@ -935,7 +935,7 @@ /mob/living/proc/start_wings_hovering() set name = "Hover" set desc = "Allows you to stop gliding and hover. This will take a fair amount of nutrition to perform." - set category = "Abilities" + set category = "Abilities.General" var/mob/living/carbon/human/C = src if(!C.wing_style) //The species var isn't taken into account here, as it's only purpose is to give this proc to a person. @@ -967,13 +967,13 @@ /mob/living/proc/toggle_pass_table() set name = "Toggle Agility" //Dunno a better name for this. You have to be pretty agile to hop over stuff!!! set desc = "Allows you to start/stop hopping over things such as hydroponics trays, tables, and railings." - set category = "Abilities" + set category = "Abilities.General" pass_flags ^= PASSTABLE //I dunno what this fancy ^= is but Aronai gave it to me. to_chat(src, "You [pass_flags&PASSTABLE ? "will" : "will NOT"] move over tables/railings/trays!") /mob/living/carbon/human/proc/check_silk_amount() set name = "Check Silk Amount" - set category = "Abilities" + set category = "Abilities.Weaver" if(species.is_weaver) to_chat(src, "Your silk reserves are at [species.silk_reserve]/[species.silk_max_reserve].") @@ -982,7 +982,7 @@ /mob/living/carbon/human/proc/toggle_silk_production() set name = "Toggle Silk Production" - set category = "Abilities" + set category = "Abilities.Weaver" if(species.is_weaver) species.silk_production = !(species.silk_production) @@ -992,7 +992,7 @@ /mob/living/carbon/human/proc/weave_structure() set name = "Weave Structure" - set category = "Abilities" + set category = "Abilities.Weaver" if(!(species.is_weaver)) to_chat(src, span_warning("You are not a weaver! How are you doing this? Tell a developer!")) @@ -1052,7 +1052,7 @@ /mob/living/carbon/human/proc/weave_item() set name = "Weave Item" - set category = "Abilities" + set category = "Abilities.Weaver" if(!(species.is_weaver)) return @@ -1106,7 +1106,7 @@ /mob/living/carbon/human/proc/set_silk_color() set name = "Set Silk Color" - set category = "Abilities" + set category = "Abilities.Weaver" if(!(species.is_weaver)) to_chat(src, span_warning("You are not a weaver! How are you doing this? Tell a developer!")) @@ -1118,7 +1118,7 @@ /mob/living/carbon/human/proc/toggle_eye_glow() set name = "Toggle Eye Glowing" - set category = "Abilities" + set category = "Abilities.General" species.has_glowing_eyes = !species.has_glowing_eyes update_eyes() @@ -1128,7 +1128,7 @@ /mob/living/carbon/human/proc/enter_cocoon() set name = "Spin Cocoon" - set category = "Abilities" + set category = "Abilities.Weaver" if(!isturf(loc)) to_chat(src, "You don't have enough space to spin a cocoon!") return @@ -1153,7 +1153,7 @@ /mob/living/carbon/human/proc/water_stealth() set name = "Dive under water / Resurface" set desc = "Dive under water, allowing for you to be stealthy and move faster." - set category = "Abilities" + set category = "Abilities.General" if(last_special > world.time) return @@ -1185,7 +1185,7 @@ /mob/living/carbon/human/proc/underwater_devour() set name = "Devour From Water" set desc = "Grab something in the water with you and devour them with your selected stomach." - set category = "Abilities" + set category = "Abilities.Vore" if(last_special > world.time) return @@ -1241,7 +1241,7 @@ /mob/living/carbon/human/proc/toggle_pain_module() set name = "Toggle pain simulation." set desc = "Turn on your pain simulation for that organic experience! Or turn it off for repairs, or if it's too much." - set category = "Abilities" + set category = "Abilities.General" if(synth_cosmetic_pain) to_chat(src, span_notice(" You turn off your pain simulators.")) @@ -1256,7 +1256,7 @@ /mob/living/proc/long_vore() // Allows the user to tongue grab a creature in range. Made a /living proc so frogs can frog you. set name = "Grab Prey With Appendage" - set category = "Abilities" + set category = "Abilities.Vore" set desc = "Grab a target with any of your appendages!" if(stat || paralysis || weakened || stunned || world.time < last_special) //No tongue flicking while stunned. @@ -1468,7 +1468,7 @@ /mob/living/proc/target_lunge() //The leaper leap, but usable as an ability set name = "Lunge At Prey" - set category = "Abilities" + set category = "Abilities.Vore" set desc = "Dive atop your prey and gobble them up!" var/leap_warmup = 1 SECOND //Easy to modify @@ -1538,7 +1538,7 @@ /mob/living/proc/injection() // Allows the user to inject reagents into others somehow, like stinging, or biting. set name = "Injection" - set category = "Abilities" + set category = "Abilities.General" set desc = "Inject another being with something!" if(stat || paralysis || weakened || stunned || world.time < last_special) //Epic copypasta from tongue grabbing. diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/traits_tutorial.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/traits_tutorial.dm index 6da754903d..e5671811fc 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/traits_tutorial.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/traits_tutorial.dm @@ -27,7 +27,7 @@ TGUI frontend path: tgui\packages\tgui\interfaces\TraitTutorial.tsx /mob/living/carbon/human/proc/trait_tutorial() set name = "Explain Custom Traits" set desc = "Click this verb to obtain a detailed tutorial on your selected traits. " - set category = "Abilities" + set category = "Abilities.General" var/datum/tgui_module/trait_tutorial_tgui/fancy_UI if(!fancy_UI) fancy_UI = new /datum/tgui_module/trait_tutorial_tgui/ //Preventing a bunch of instances being spawned all over the place. Hopefully diff --git a/code/modules/mob/living/carbon/human/species/virtual_reality/avatar.dm b/code/modules/mob/living/carbon/human/species/virtual_reality/avatar.dm index 9f72a2621c..c8d044330b 100644 --- a/code/modules/mob/living/carbon/human/species/virtual_reality/avatar.dm +++ b/code/modules/mob/living/carbon/human/species/virtual_reality/avatar.dm @@ -54,7 +54,7 @@ /mob/living/carbon/human/proc/shapeshifter_change_opacity() set name = "Toggle Opacity" - set category = "Abilities" + set category = "Abilities.Shapeshifter" if(stat || world.time < last_special) return @@ -88,7 +88,7 @@ // exit_vr is called on the vr mob, and puts the mind back into the original mob /mob/living/carbon/human/proc/exit_vr() set name = "Exit Virtual Reality" - set category = "Abilities" + set category = "Abilities.VR" if(!vr_holder) return diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm index 7c69a214c1..346259c449 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm @@ -56,7 +56,7 @@ /mob/living/carbon/human/proc/transfer_plasma(mob/living/carbon/human/M as mob in oview()) set name = "Transfer Plasma" set desc = "Transfer Plasma to another alien" - set category = "Abilities" + set category = "Abilities.Alien" if (get_dist(src,M) <= 1) to_chat(src, span_alium("You need to be closer.")) @@ -81,7 +81,7 @@ set name = "Lay Egg (500)" //Cost is entire queen reserve, to compensate being able to reproduce on it's own set desc = "Lay an egg that will eventually hatch into a new xenomorph larva. Life finds a way." - set category = "Abilities" + set category = "Abilities.Alien" if(!CONFIG_GET(flag/aliens_allowed)) to_chat(src, "You begin to lay an egg, but hesitate. You suspect it isn't allowed.") @@ -102,7 +102,7 @@ /mob/living/carbon/human/proc/evolve() set name = "Evolve (500)" set desc = "Produce an internal egg sac capable of spawning children. Only one queen can exist at a time." - set category = "Abilities" + set category = "Abilities.Alien" if(alien_queen_exists()) to_chat(src, span_notice("We already have an active queen.")) @@ -117,7 +117,7 @@ /mob/living/carbon/human/proc/plant() set name = "Plant Weeds (50)" set desc = "Plants some alien weeds" - set category = "Abilities" + set category = "Abilities.Alien" if(check_alien_ability(50,1,O_RESIN)) visible_message(span_alium(span_bold("[src] has planted some alien weeds!"))) @@ -149,7 +149,7 @@ /mob/living/carbon/human/proc/corrosive_acid(O as obj|turf in oview(1)) //If they right click to corrode, an error will flash if its an invalid target./N set name = "Corrosive Acid (200)" set desc = "Drench an object in acid, destroying it over time." - set category = "Abilities" + set category = "Abilities.Alien" if(!(O in oview(1))) to_chat(src, span_alium("[O] is too far away.")) @@ -186,7 +186,7 @@ /mob/living/carbon/human/proc/neurotoxin() set name = "Toggle Neurotoxic Spit (40)" set desc = "Readies a neurotoxic spit, which paralyzes the target for a short time if they are not wearing protective gear." - set category = "Abilities" + set category = "Abilities.Alien" if(spitting) to_chat(src, span_alium("You stop preparing to spit.")) @@ -207,7 +207,7 @@ /mob/living/carbon/human/proc/acidspit() set name = "Toggle Acid Spit (50)" set desc = "Readies an acidic spit, which burns the target if they are not wearing protective gear." - set category = "Abilities" + set category = "Abilities.Alien" if(spitting) to_chat(src, span_alium("You stop preparing to spit.")) @@ -228,7 +228,7 @@ /mob/living/carbon/human/proc/resin() //Gurgs : Refactored resin ability, big thanks to Jon. set name = "Secrete Resin (75)" set desc = "Secrete tough malleable resin." - set category = "Abilities" + set category = "Abilities.Alien" var/list/options = list("resin door","resin wall","resin membrane","nest","resin blob") for(var/option in options) @@ -276,7 +276,7 @@ return /mob/living/carbon/human/proc/leap() - set category = "Abilities" + set category = "Abilities.Alien" set name = "Leap" set desc = "Leap at a target and grab them aggressively." @@ -344,7 +344,7 @@ G.synch() /mob/living/carbon/human/proc/gut() - set category = "Abilities" + set category = "Abilities.Alien" set name = "Slaughter" set desc = "While grabbing someone aggressively, rip their guts out or tear them apart." diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 838ab77e2f..116c312176 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -1377,13 +1377,13 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() //If you have a custom tail selected if(tail_style && !(wear_suit && wear_suit.flags_inv & HIDETAIL && !istaurtail(tail_style)) && !tail_hidden) - var/icon/tail_s = new/icon("icon" = (tail_style.can_loaf && resting) ? tail_style.icon_loaf : tail_style.icon, "icon_state" = (wagging && tail_style.ani_state ? tail_style.ani_state : tail_style.icon_state)) //CHOMPEdit + var/icon/tail_s = new/icon("icon" = (tail_style.can_loaf && resting) ? tail_style.icon_loaf : tail_style.icon, "icon_state" = (wagging && tail_style.ani_state ? tail_style.ani_state : tail_style.icon_state)) if(tail_style.can_loaf && !is_shifted) pixel_y = (resting) ? -tail_style.loaf_offset*size_multiplier : default_pixel_y //move player down, then taur up, to fit the overlays correctly // VOREStation Edit: Taur Loafing if(tail_style.do_colouration) tail_s.Blend(rgb(src.r_tail, src.g_tail, src.b_tail), tail_style.color_blend_mode) if(tail_style.extra_overlay) - var/icon/overlay = new/icon("icon" = (tail_style?.can_loaf && resting) ? tail_style.icon_loaf : tail_style.icon, "icon_state" = tail_style.extra_overlay) //CHOMPEdit + var/icon/overlay = new/icon("icon" = (tail_style?.can_loaf && resting) ? tail_style.icon_loaf : tail_style.icon, "icon_state" = tail_style.extra_overlay) if(wagging && tail_style.ani_state) overlay = new/icon("icon" = (tail_style?.can_loaf && resting) ? tail_style.icon_loaf : tail_style.icon, "icon_state" = tail_style.extra_overlay_w) //RS EDIT overlay.Blend(rgb(src.r_tail2, src.g_tail2, src.b_tail2), tail_style.color_blend_mode) @@ -1395,7 +1395,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() qdel(overlay) if(tail_style.extra_overlay2) - var/icon/overlay = new/icon("icon" = (tail_style?.can_loaf && resting) ? tail_style.icon_loaf : tail_style.icon, "icon_state" = tail_style.extra_overlay2) //CHOMPEdit + var/icon/overlay = new/icon("icon" = (tail_style?.can_loaf && resting) ? tail_style.icon_loaf : tail_style.icon, "icon_state" = tail_style.extra_overlay2) if(wagging && tail_style.ani_state) overlay = new/icon("icon" = (tail_style?.can_loaf && resting) ? tail_style.icon_loaf : tail_style.icon, "icon_state" = tail_style.extra_overlay2_w) //RS EDIT overlay.Blend(rgb(src.r_tail3, src.g_tail3, src.b_tail3), tail_style.color_blend_mode) diff --git a/code/modules/mob/living/carbon/lick_wounds.dm b/code/modules/mob/living/carbon/lick_wounds.dm index 880e7358b9..68dcae6789 100644 --- a/code/modules/mob/living/carbon/lick_wounds.dm +++ b/code/modules/mob/living/carbon/lick_wounds.dm @@ -1,6 +1,6 @@ /mob/living/carbon/human/proc/lick_wounds(var/mob/living/carbon/M as mob in view(1)) // Allows the user to lick themselves. Given how rarely this trait is used, I don't see an issue with a slight buff. set name = "Lick Wounds" - set category = "Abilities" + set category = "Abilities.General" set desc = "Disinfect and heal small wounds with your saliva." if(stat || paralysis || weakened || stunned) diff --git a/code/modules/mob/living/default_language.dm b/code/modules/mob/living/default_language.dm index 847f1b221b..fba38e21f5 100644 --- a/code/modules/mob/living/default_language.dm +++ b/code/modules/mob/living/default_language.dm @@ -3,7 +3,7 @@ /mob/living/verb/set_default_language(language as null|anything in languages) set name = "Set Default Language" - set category = "IC" + set category = "IC.Settings" if (only_species_language && language != GLOB.all_languages[src.species_language]) to_chat(src, span_notice("You can only speak your species language, [src.species_language].")) @@ -28,7 +28,7 @@ /mob/living/verb/check_default_language() set name = "Check Default Language" - set category = "IC" + set category = "IC.Game" if(default_language) to_chat(src, span_notice("You are currently speaking [default_language] by default.")) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 256f8d3c03..a81282f364 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -104,7 +104,7 @@ /mob/living/verb/succumb() set name = "Succumb to death" - set category = "IC" + set category = "IC.Game" set desc = "Press this button if you are in crit and wish to die. Use this sparingly (ending a scene, no medical, etc.)" var/confirm1 = tgui_alert(usr, "Pressing this button will kill you instantenously! Are you sure you wish to proceed?", "Confirm wish to succumb", list("No","Yes")) var/confirm2 = "No" @@ -123,7 +123,7 @@ /mob/living/verb/toggle_afk() set name = "Toggle AFK" - set category = "IC" + set category = "IC.Game" set desc = "Mark yourself as Away From Keyboard, or clear that status!" if(away_from_keyboard) remove_status_indicator("afk") @@ -710,7 +710,7 @@ /mob/living/proc/Examine_OOC() set name = "Examine Meta-Info (OOC)" - set category = "OOC" + set category = "OOC.Game" set src in view() //VOREStation Edit Start - Making it so SSD people have prefs with fallback to original style. if(CONFIG_GET(flag/allow_metadata)) @@ -729,7 +729,7 @@ /mob/living/verb/resist() set name = "Resist" - set category = "IC" + set category = "IC.Game" if(!incapacitated(INCAPACITATION_KNOCKOUT) && (last_resist_time + RESIST_COOLDOWN < world.time)) last_resist_time = world.time @@ -789,7 +789,7 @@ /mob/living/verb/lay_down() set name = "Rest" - set category = "IC" + set category = "IC.Game" resting = !resting to_chat(src, span_notice("You are now [resting ? "resting" : "getting up"].")) @@ -1334,7 +1334,7 @@ /mob/living/verb/mob_sleep() set name = "Sleep" - set category = "IC" + set category = "IC.Game" if(!toggled_sleeping && alert(src, "Are you sure you wish to go to sleep? You will snooze until you use the Sleep verb again.", "Sleepy Time", "No", "Yes") == "No") return toggled_sleeping = !toggled_sleeping diff --git a/code/modules/mob/living/living_powers.dm b/code/modules/mob/living/living_powers.dm index 740cbed074..3b6806b9f9 100644 --- a/code/modules/mob/living/living_powers.dm +++ b/code/modules/mob/living/living_powers.dm @@ -8,7 +8,7 @@ /mob/living/proc/hide() set name = "Hide" set desc = "Allows to hide beneath tables or certain items. Toggled on or off." - set category = "Abilities" + set category = "Abilities.General" if(stat == DEAD || paralysis || weakened || stunned || restrained() || buckled || LAZYLEN(grabbed_by) || has_buckled_mobs()) //VORE EDIT: Check for has_buckled_mobs() (taur riding) return diff --git a/code/modules/mob/living/living_vr.dm b/code/modules/mob/living/living_vr.dm index 82850fea56..fe8b80b535 100644 --- a/code/modules/mob/living/living_vr.dm +++ b/code/modules/mob/living/living_vr.dm @@ -4,7 +4,7 @@ ..() /mob/living/verb/customsay() - set category = "IC" + set category = "IC.Settings" set name = "Customize Speech Verbs" set desc = "Customize the text which appears when you type- e.g. 'says', 'asks', 'exclaims'." @@ -25,7 +25,7 @@ /mob/living/verb/set_metainfo() set name = "Set OOC Metainfo" set desc = "Sets OOC notes about yourself or your RP preferences or status." - set category = "OOC" + set category = "OOC.Game Settings" if(usr != src) return @@ -100,7 +100,7 @@ /mob/living/verb/set_custom_link() set name = "Set Custom Link" set desc = "Set a custom link to show up with your examine text." - set category = "IC" + set category = "IC.Settings" if(usr != src) return @@ -117,7 +117,7 @@ /mob/living/verb/set_voice_freq() set name = "Set Voice Frequency" set desc = "Sets your voice frequency to be higher or lower pitched!" - set category = "OOC" + set category = "OOC.Game Settings" var/list/preset_voice_freqs = list("high" = MAX_VOICE_FREQ, "middle-high" = 56250, "middle" = 425000, "middle-low"= 28750, "low" = MIN_VOICE_FREQ, "custom" = 1, "random" = 0) var/choice = tgui_input_list(src, "What would you like to set your voice frequency to?", "Voice Frequency", preset_voice_freqs) @@ -138,7 +138,7 @@ /mob/living/verb/set_voice_type() set name = "Set Voice Type" set desc = "Sets your voice style!" - set category = "OOC" + set category = "OOC.Game Settings" var/list/possible_voice_types = list( "beep-boop", diff --git a/code/modules/mob/living/riding.dm b/code/modules/mob/living/riding.dm index 5319895da7..1174ee3075 100644 --- a/code/modules/mob/living/riding.dm +++ b/code/modules/mob/living/riding.dm @@ -1,6 +1,6 @@ /mob/living/proc/toggle_rider_reins() set name = "Give Reins" - set category = "Abilities" + set category = "Abilities.General" set desc = "Let people riding on you control your movement." if(riding_datum) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 19c7f4bab6..74467c67a9 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -347,7 +347,7 @@ var/list/ai_verbs_default = list( update_use_power(USE_POWER_ACTIVE) /mob/living/silicon/ai/proc/pick_icon() - set category = "AI Settings" + set category = "AI.Settings" set name = "Set AI Core Display" if(stat || aiRestorePowerRoutine) return @@ -359,7 +359,7 @@ var/list/ai_verbs_default = list( /mob/living/silicon/ai/var/message_cooldown = 0 /mob/living/silicon/ai/proc/ai_announcement() - set category = "AI Commands" + set category = "AI.Station Commands" set name = "Make Station Announcement" if(check_unable(AI_CHECK_WIRELESS | AI_CHECK_RADIO)) return @@ -380,7 +380,7 @@ var/list/ai_verbs_default = list( message_cooldown = 0 /mob/living/silicon/ai/proc/ai_call_shuttle() - set category = "AI Commands" + set category = "AI.Station Commands" set name = "Call Emergency Shuttle" if(check_unable(AI_CHECK_WIRELESS)) return @@ -401,7 +401,7 @@ var/list/ai_verbs_default = list( post_status(src, "shuttle", user = src) /mob/living/silicon/ai/proc/ai_recall_shuttle() - set category = "AI Commands" + set category = "AI.Station Commands" set name = "Recall Emergency Shuttle" if(check_unable(AI_CHECK_WIRELESS)) @@ -417,7 +417,7 @@ var/list/ai_verbs_default = list( /mob/living/silicon/ai/var/emergency_message_cooldown = 0 /mob/living/silicon/ai/proc/ai_emergency_message() - set category = "AI Commands" + set category = "AI.Station Commands" set name = "Send Emergency Message" if(check_unable(AI_CHECK_WIRELESS)) @@ -538,7 +538,7 @@ var/list/ai_verbs_default = list( return 1 /mob/living/silicon/ai/cancel_camera() - set category = "AI Commands" + set category = "AI.Camera Control" set name = "Cancel Camera View" view_core() @@ -561,7 +561,7 @@ var/list/ai_verbs_default = list( return cameralist /mob/living/silicon/ai/proc/ai_network_change(var/network in get_camera_network_list()) - set category = "AI Commands" + set category = "AI.Camera Control" set name = "Jump To Network" unset_machine() @@ -584,7 +584,7 @@ var/list/ai_verbs_default = list( //End of code by Mord_Sith /mob/living/silicon/ai/proc/ai_statuschange() - set category = "AI Settings" + set category = "AI.Settings" set name = "AI Status" if(check_unable(AI_CHECK_WIRELESS)) @@ -597,7 +597,7 @@ var/list/ai_verbs_default = list( /mob/living/silicon/ai/proc/ai_hologram_change() set name = "Change Hologram" set desc = "Change the default hologram available to AI to something else." - set category = "AI Settings" + set category = "AI.Settings" if(check_unable()) return @@ -725,7 +725,7 @@ var/list/ai_verbs_default = list( /mob/living/silicon/ai/proc/toggle_camera_light() set name = "Toggle Camera Light" set desc = "Toggles the light on the camera the AI is looking through." - set category = "AI Commands" + set category = "AI.Camera Control" if(check_unable()) return @@ -799,7 +799,7 @@ var/list/ai_verbs_default = list( /mob/living/silicon/ai/proc/control_integrated_radio() set name = "Radio Settings" set desc = "Allows you to change settings of your radio." - set category = "AI Settings" + set category = "AI.Settings" if(check_unable(AI_CHECK_RADIO)) return @@ -810,7 +810,7 @@ var/list/ai_verbs_default = list( /mob/living/silicon/ai/proc/sensor_mode() set name = "Toggle Sensor Augmentation" //VOREStation Add - set category = "AI Settings" + set category = "AI.Settings" set desc = "Augment visual feed with internal sensor overlays" sensor_type = !sensor_type //VOREStation Add to_chat(usr, "You [sensor_type ? "enable" : "disable"] your sensors.") //VOREStation Add @@ -818,7 +818,7 @@ var/list/ai_verbs_default = list( /mob/living/silicon/ai/proc/toggle_hologram_movement() set name = "Toggle Hologram Movement" - set category = "AI Settings" + set category = "AI.Settings" set desc = "Toggles hologram movement based on moving with your virtual eye." hologram_follow = !hologram_follow @@ -910,7 +910,7 @@ var/list/ai_verbs_default = list( // Pass lying down or getting up to our pet human, if we're in a rig. /mob/living/silicon/ai/lay_down() set name = "Rest" - set category = "IC" + set category = "IC.Game" resting = 0 var/obj/item/rig/rig = src.get_rig() @@ -993,12 +993,12 @@ var/list/ai_verbs_default = list( /mob/living/silicon/ai/proc/toggle_multicam_verb() set name = "Toggle Multicam" - set category = "AI Commands" + set category = "AI.Camera Control" toggle_multicam() /mob/living/silicon/ai/proc/add_multicam_verb() set name = "Add Multicam Viewport" - set category = "AI Commands" + set category = "AI.Camera Control" drop_new_multicam() //Special subtype kept around for global announcements diff --git a/code/modules/mob/living/silicon/ai/ai_remote_control.dm b/code/modules/mob/living/silicon/ai/ai_remote_control.dm index cfe1d2873a..c1871a0358 100644 --- a/code/modules/mob/living/silicon/ai/ai_remote_control.dm +++ b/code/modules/mob/living/silicon/ai/ai_remote_control.dm @@ -67,7 +67,7 @@ target.post_deploy() /mob/living/silicon/ai/proc/deploy_to_shell_act() - set category = "AI Commands" + set category = "AI.Commands" set name = "Deploy to Shell" deploy_to_shell() // This is so the AI is not prompted with a list of all mobs when using the 'real' proc. diff --git a/code/modules/mob/living/silicon/ai/latejoin.dm b/code/modules/mob/living/silicon/ai/latejoin.dm index 4afac25fbc..37606a5661 100644 --- a/code/modules/mob/living/silicon/ai/latejoin.dm +++ b/code/modules/mob/living/silicon/ai/latejoin.dm @@ -12,7 +12,7 @@ var/global/list/empty_playable_ai_cores = list() /mob/living/silicon/ai/verb/store_core() set name = "Store Core" - set category = "OOC" + set category = "OOC.Game" set desc = "Enter intelligence storage. This is functionally equivalent to cryo or robotic storage, freeing up your job slot." if(ticker && ticker.mode && ticker.mode.name == "AI malfunction") diff --git a/code/modules/mob/living/silicon/ai/laws.dm b/code/modules/mob/living/silicon/ai/laws.dm index ad051cddff..82874155ba 100755 --- a/code/modules/mob/living/silicon/ai/laws.dm +++ b/code/modules/mob/living/silicon/ai/laws.dm @@ -1,5 +1,5 @@ /mob/living/silicon/ai/proc/show_laws_verb() - set category = "AI Commands" + set category = "AI.Commands" set name = "Show Laws" src.show_laws() @@ -22,6 +22,6 @@ R.show_laws() /mob/living/silicon/ai/proc/ai_checklaws() - set category = "AI Commands" + set category = "AI.Commands" set name = "State Laws" subsystem_law_manager() diff --git a/code/modules/mob/living/silicon/pai/admin.dm b/code/modules/mob/living/silicon/pai/admin.dm index ebd161c4f2..6620035ffa 100644 --- a/code/modules/mob/living/silicon/pai/admin.dm +++ b/code/modules/mob/living/silicon/pai/admin.dm @@ -1,7 +1,7 @@ // Originally a debug verb, made it a proper adminverb for ~fun~ /client/proc/makePAI(turf/t in view(), name as text, pai_key as null|text) set name = "Make pAI" - set category = "Admin" + set category = "Admin.Events" if(!check_rights(R_ADMIN|R_EVENT|R_DEBUG)) return diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 98d1a2ee6a..8d22b5e96d 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -227,7 +227,7 @@ return 1 /mob/living/silicon/pai/verb/reset_record_view() - set category = "pAI Commands" + set category = "Abilities.pAI Commands" set name = "Reset Records Software" securityActive1 = null @@ -240,7 +240,7 @@ to_chat(usr, span_notice("You reset your record-viewing software.")) /mob/living/silicon/pai/cancel_camera() - set category = "pAI Commands" + set category = "Abilities.pAI Commands" set name = "Cancel Camera View" src.reset_view(null) src.unset_machine() @@ -251,7 +251,7 @@ // to it. Really this deserves its own file, but for the moment it can sit here. ~ Z /mob/living/silicon/pai/verb/fold_out() - set category = "pAI Commands" + set category = "Abilities.pAI Commands" set name = "Unfold Chassis" if(stat || sleeping || paralysis || weakened) @@ -309,7 +309,7 @@ update_icon() /mob/living/silicon/pai/verb/fold_up() - set category = "pAI Commands" + set category = "Abilities.pAI Commands" set name = "Collapse Chassis" if(stat || sleeping || paralysis || weakened) @@ -326,7 +326,7 @@ /* //VOREStation Removal Start /mob/living/silicon/pai/proc/choose_chassis() - set category = "pAI Commands" + set category = "Abilities.pAI Commands" set name = "Choose Chassis" var/choice @@ -345,7 +345,7 @@ */ /mob/living/silicon/pai/proc/choose_verbs() - set category = "pAI Commands" + set category = "Abilities.pAI Commands" set name = "Choose Speech Verbs" var/choice = tgui_input_list(usr,"What theme would you like to use for your speech verbs?","Theme Choice", possible_say_verbs) @@ -358,7 +358,7 @@ /mob/living/silicon/pai/lay_down() set name = "Rest" - set category = "IC" + set category = "IC.Game" // Pass lying down or getting up to our pet human, if we're in a rig. if(istype(src.loc,/obj/item/paicard)) @@ -522,7 +522,7 @@ /mob/living/silicon/pai/verb/allowmodification() set name = "Change Access Modifcation Permission" - set category = "pAI Commands" + set category = "Abilities.pAI Commands" set desc = "Allows people to modify your access or block people from modifying your access." if(idaccessible == 0) @@ -535,7 +535,7 @@ /mob/living/silicon/pai/verb/wipe_software() set name = "Enter Storage" - set category = "pAI Commands" + set category = "Abilities.pAI Commands" set desc = "Upload your personality to the cloud and wipe your software from the card. This is functionally equivalent to cryo or robotic storage, freeing up your job slot." // Make sure people don't kill themselves accidentally diff --git a/code/modules/mob/living/silicon/pai/pai_vr.dm b/code/modules/mob/living/silicon/pai/pai_vr.dm index 2e3c1ed1fe..eda552040e 100644 --- a/code/modules/mob/living/silicon/pai/pai_vr.dm +++ b/code/modules/mob/living/silicon/pai/pai_vr.dm @@ -101,7 +101,7 @@ /mob/living/silicon/pai/proc/pai_nom(var/mob/living/T in oview(1)) set name = "pAI Nom" - set category = "pAI Commands" + set category = "Abilities.pAI Commands" set desc = "Allows you to eat someone while unfolded. Can't be used while in card form." if (stat != CONSCIOUS) @@ -173,7 +173,7 @@ //proc override to avoid pAI players being invisible while the chassis selection window is open /mob/living/silicon/pai/proc/choose_chassis() - set category = "pAI Commands" + set category = "Abilities.pAI Commands" set name = "Choose Chassis" var/choice @@ -206,7 +206,7 @@ update_icon() /mob/living/silicon/pai/verb/toggle_eyeglow() - set category = "pAI Commands" + set category = "Abilities.pAI Commands" set name = "Toggle Eye Glow" if(chassis in allows_eye_color) @@ -222,7 +222,7 @@ /mob/living/silicon/pai/verb/pick_eye_color() - set category = "pAI Commands" + set category = "Abilities.pAI Commands" set name = "Pick Eye Color" if(chassis in allows_eye_color) else @@ -408,7 +408,7 @@ return 1 /mob/living/silicon/pai/verb/save_pai_to_slot() - set category = "pAI Commands" + set category = "Abilities.pAI Commands" set name = "Save Configuration" savefile_save(src) to_chat(src, span_filter_notice("[name] configuration saved to global pAI settings.")) @@ -444,7 +444,7 @@ /mob/living/silicon/pai/verb/toggle_gender_identity_vr() set name = "Set Gender Identity" set desc = "Sets the pronouns when examined and performing an emote." - set category = "IC" + set category = "IC.Settings" var/new_gender_identity = tgui_input_list(usr, "Please select a gender Identity:", "Set Gender Identity", list(FEMALE, MALE, NEUTER, PLURAL, HERM)) if(!new_gender_identity) return 0 @@ -454,7 +454,7 @@ /mob/living/silicon/pai/verb/pai_hide() set name = "Hide" set desc = "Allows to hide beneath tables or certain items. Toggled on or off." - set category = "Abilities" + set category = "Abilities.pAI" hide() if(status_flags & HIDING) @@ -464,7 +464,7 @@ update_icon() /mob/living/silicon/pai/verb/screen_message(message as text|null) - set category = "pAI Commands" + set category = "Abilities.pAI Commands" set name = "Screen Message" set desc = "Allows you to display a message on your screen. This will show up in the chat of anyone who is holding your card." diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index 9e52af2bec..700634ea63 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -39,7 +39,7 @@ var/global/list/default_pai_software = list() software = default_pai_software.Copy() /mob/living/silicon/pai/verb/paiInterface() - set category = "pAI Commands" + set category = "Abilities.pAI Commands" set name = "Software Interface" tgui_interact(src) diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index ba2c6ef4fa..fd1132d05a 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -172,7 +172,7 @@ var/list/mob_hat_cache = list() /mob/living/silicon/robot/drone/verb/pick_shell() set name = "Customize Appearance" - set category = "Abilities.Silicon" + set category = "Abilities.Settings" if(!can_pick_shell) to_chat(src, span_warning("You already selected a shell or this drone type isn't customizable.")) diff --git a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm index 18da101324..91f4c79b5e 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm @@ -94,7 +94,7 @@ /mob/observer/dead/verb/join_as_drone() - set category = "Ghost" + set category = "Ghost.Join" set name = "Join As Drone" set desc = "If there is a powered, enabled fabricator in the game world with a prepared chassis, join as a maintenance drone." diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 1610036f16..a79310c02b 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -430,7 +430,7 @@ /mob/living/silicon/robot/verb/namepick() set name = "Pick Name" - set category = "Abilities.Silicon" + set category = "Abilities.Settings" if(custom_name) to_chat(usr, "You can't pick another custom name. [isshell(src) ? "" : "Go ask for a name change."]") @@ -448,7 +448,7 @@ /mob/living/silicon/robot/verb/extra_customization() set name = "Customize Appearance" - set category = "Abilities.Silicon" + set category = "Abilities.Settings" set desc = "Customize your appearance (assuming your chosen sprite allows)." if(!sprite_datum || !sprite_datum.has_extra_customization) @@ -502,7 +502,7 @@ // function to toggle VTEC once installed /mob/living/silicon/robot/proc/toggle_vtec() set name = "Toggle VTEC" - set category = "Abilities" + set category = "Abilities.Silicon" vtec_active = !vtec_active hud_used.toggle_vtec_control() to_chat(src, span_filter_notice("VTEC module [vtec_active ? "enabled" : "disabled"].")) @@ -803,7 +803,7 @@ /mob/living/silicon/robot/proc/ColorMate() set name = "Recolour Module" - set category = "Abilities.Silicon" + set category = "Abilities.Settings" set desc = "Allows to recolour once." if(!has_recoloured) @@ -1369,7 +1369,7 @@ /mob/living/silicon/robot/verb/rest_style() set name = "Switch Rest Style" set desc = "Select your resting pose." - set category = "IC" + set category = "IC.Settings" if(!sprite_datum || !sprite_datum.has_rest_sprites || sprite_datum.rest_sprite_options.len < 1) to_chat(src, span_notice("Your current appearance doesn't have any resting styles!")) @@ -1387,7 +1387,7 @@ /mob/living/silicon/robot/verb/robot_nom(var/mob/living/T in living_mobs(1)) set name = "Robot Nom" - set category = "IC" + set category = "Abilities.Vore" set desc = "Allows you to eat someone." if (stat != CONSCIOUS) @@ -1461,7 +1461,7 @@ /mob/living/silicon/robot/proc/robot_mount(var/mob/living/M in living_mobs(1)) set name = "Robot Mount/Dismount" - set category = "Abilities" + set category = "Abilities.General" set desc = "Let people ride on you." if(LAZYLEN(buckled_mobs)) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 3f3d101668..3f917a15ce 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -257,14 +257,14 @@ /mob/living/silicon/verb/pose() set name = "Set Pose" set desc = "Sets a description which will be shown when someone examines you." - set category = "IC" + set category = "IC.Settings" pose = strip_html_simple(tgui_input_text(usr, "This is [src]. It is...", "Pose", null)) /mob/living/silicon/verb/set_flavor() set name = "Set Flavour Text" set desc = "Sets an extended description of your character's features." - set category = "IC" + set category = "IC.Settings" var/new_flavortext = strip_html_simple(tgui_input_text(usr, "Please enter your new flavour text.", "Flavour text", flavor_text, multiline = TRUE)) if(new_flavortext) diff --git a/code/modules/mob/living/simple_mob/simple_mob.dm b/code/modules/mob/living/simple_mob/simple_mob.dm index e063e5b94a..2eff632c3a 100644 --- a/code/modules/mob/living/simple_mob/simple_mob.dm +++ b/code/modules/mob/living/simple_mob/simple_mob.dm @@ -350,7 +350,7 @@ /mob/living/simple_mob/proc/ColorMate() set name = "Recolour" - set category = "Abilities" + set category = "Abilities.Settings" set desc = "Allows to recolour once." if(!has_recoloured) @@ -363,7 +363,7 @@ /mob/living/simple_mob/proc/hunting_vision() set name = "Track Prey Through Walls" - set category = "Abilities" + set category = "Abilities.Mob" set desc = "Uses you natural predatory instincts to seek out prey even through walls, or your natural survival instincts to spot predators from a distance." if(hunting_cooldown + 5 MINUTES < world.time) @@ -378,7 +378,7 @@ /mob/living/simple_mob/proc/hunting_vision_plus() set name = "Thermal vision toggle" - set category = "Abilities" + set category = "Abilities.Mob" set desc = "Uses you natural predatory instincts to seek out prey even through walls, or your natural survival instincts to spot predators from a distance." if(!isthermal) diff --git a/code/modules/mob/living/simple_mob/simple_mob_vr.dm b/code/modules/mob/living/simple_mob/simple_mob_vr.dm index b4f999bc83..6a4ba095f9 100644 --- a/code/modules/mob/living/simple_mob/simple_mob_vr.dm +++ b/code/modules/mob/living/simple_mob/simple_mob_vr.dm @@ -367,7 +367,7 @@ /mob/living/simple_mob/proc/animal_mount(var/mob/living/M in living_mobs(1)) set name = "Animal Mount/Dismount" - set category = "Abilities" + set category = "Abilities.Mob" set desc = "Let people ride on you." if(LAZYLEN(buckled_mobs)) @@ -402,7 +402,7 @@ /mob/living/simple_mob/proc/leap() set name = "Pounce Target" - set category = "Abilities" + set category = "Abilities.Mob" set desc = "Select a target to pounce at." if(last_special > world.time) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm index 67fe95dba1..e951368c32 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm @@ -284,7 +284,7 @@ /mob/living/simple_mob/vore/alienanimals/catslug/proc/catslug_color() set name = "Pick Color" - set category = "Abilities" + set category = "Abilities.Settings" set desc = "You can set your color!" if(picked_color) to_chat(src, span_notice("You have already picked a color! If you picked the wrong color, ask an admin to change your picked_color variable to 0.")) @@ -1112,7 +1112,7 @@ /mob/living/simple_mob/vore/alienanimals/catslug/suslug/proc/assussinate() set name = "Kill Innocent" - set category = "Abilities" + set category = "Abilities.Catslug" set desc = "Kill an innocent suslug!" if(!is_impostor) to_chat(src, span_notice("You are not an impostor! You can't kill like that!")) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/stardog.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/stardog.dm index 1fa6963c68..6bf397a381 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/stardog.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/stardog.dm @@ -187,14 +187,14 @@ /mob/living/simple_mob/vore/overmap/stardog/verb/eject() set name = "Eject" set desc = "Stop controlling the dog and return to your own body." - set category = "Abilities" + set category = "Abilities.Stardog" control_node.eject() /mob/living/simple_mob/vore/overmap/stardog/verb/eat_space_weather() set name = "Eat Space Weather" set desc = "Eat carp or rocks!" - set category = "Abilities" + set category = "Abilities.Stardog" var/obj/effect/overmap/event/E var/nut = 0 @@ -297,7 +297,7 @@ /mob/living/simple_mob/vore/overmap/stardog/verb/transition() //Don't ask how it works. I don't know. I didn't think about it. I just thought it would be cool. set name = "Transition" set desc = "Attempt to go to the location you have arrived at, or return to space!" - set category = "Abilities" + set category = "Abilities.Stardog" if(nutrition <= 500) to_chat(src, span_warning("You're too hungry...")) return @@ -451,7 +451,7 @@ /turf/simulated/floor/outdoors/fur/verb/pet() set name = "Pet Fur" set desc = "Pet the fur!" - set category = "IC" + set category = "IC.Stardog" set src in oview(1) usr.visible_message(span_notice("\The [usr] pets \the [src]."), span_notice("You pet \the [src]."), runemessage = "pet pat...") @@ -466,7 +466,7 @@ /turf/simulated/floor/outdoors/fur/verb/emote_beyond(message as message) //Now even the stars will know your sin. set name = "Emote Beyond" set desc = "Emote to those beyond the fur!" - set category = "IC" + set category = "IC.Chat" set src in oview(1) if(!isliving(usr)) @@ -1139,7 +1139,7 @@ /obj/machinery/computer/ship/navigation/verb/emote_beyond(message as message) //I could have put this into any other file but right here will do set name = "Emote Beyond" set desc = "Emote to those beyond the ship!" - set category = "IC" + set category = "IC.Chat" set src in oview(7) if(!isliving(usr)) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/teppi.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/teppi.dm index 50704e1fa9..4f9e9188c2 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/teppi.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/teppi.dm @@ -962,7 +962,7 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have? // /mob/living/simple_mob/vore/alienanimals/teppi/proc/produce_offspring() set name = "Produce Offspring" - set category = "Abilities" + set category = "Abilities.Teppi" set desc = "You can have babies if the conditions are right." if(prevent_breeding) to_chat(src, span_notice("You have elected to not participate in breeding mechanics, and so cannot complete that action.")) @@ -1004,7 +1004,7 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have? /mob/living/simple_mob/vore/alienanimals/teppi/proc/toggle_producing_offspring() set name = "Toggle Producing Offspring" - set category = "Abilities" + set category = "Abilities.Teppi" set desc = "You can toggle whether or not you can produce offspring." if(!prevent_breeding) to_chat(src, span_notice("You disable breeding.")) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/animal.dm b/code/modules/mob/living/simple_mob/subtypes/animal/animal.dm index 51d338364c..836e4b7041 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/animal.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/animal.dm @@ -31,7 +31,7 @@ /mob/living/simple_mob/animal/verb/set_flavour_text() set name = "Set Flavour Text" - set category = "IC" + set category = "IC.Settings" set desc = "Set your flavour text." set src = usr var/new_flavour_text = sanitize((input("Please describe yourself.", "Flavour Text", flavor_text) as message|null), MAX_MESSAGE_LEN) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/borer/borer_powers.dm b/code/modules/mob/living/simple_mob/subtypes/animal/borer/borer_powers.dm index 160ddbdeff..85087a9b15 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/borer/borer_powers.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/borer/borer_powers.dm @@ -1,5 +1,5 @@ /mob/living/simple_mob/animal/borer/verb/release_host() - set category = "Abilities" + set category = "Abilities.Borer" set name = "Release Host" set desc = "Slither out of your host." @@ -39,7 +39,7 @@ leave_host() /mob/living/simple_mob/animal/borer/verb/infest() - set category = "Abilities" + set category = "Abilities.Borer" set name = "Infest" set desc = "Infest a suitable humanoid host." @@ -127,7 +127,7 @@ /* /mob/living/simple_mob/animal/borer/verb/devour_brain() - set category = "Abilities" + set category = "Abilities.Borer" set name = "Devour Brain" set desc = "Take permanent control of a dead host." @@ -200,7 +200,7 @@ H.lastKnownIP = s2h_ip /mob/living/simple_mob/animal/borer/verb/secrete_chemicals() - set category = "Abilities" + set category = "Abilities.Borer" set name = "Secrete Chemicals" set desc = "Push some chemicals into your host's bloodstream." @@ -228,7 +228,7 @@ chemicals -= 50 /mob/living/simple_mob/animal/borer/verb/dominate_victim() - set category = "Abilities" + set category = "Abilities.Borer" set name = "Paralyze Victim" set desc = "Freeze the limbs of a potential host with supernatural fear." @@ -268,7 +268,7 @@ used_dominate = world.time /mob/living/simple_mob/animal/borer/verb/bond_brain() - set category = "Abilities" + set category = "Abilities.Borer" set name = "Assume Control" set desc = "Fully connect to the brain of your host." @@ -339,7 +339,7 @@ return /mob/living/carbon/human/proc/jumpstart() - set category = "Abilities" + set category = "Abilities.Borer" set name = "Revive Host" set desc = "Send a jolt of electricity through your host, reviving them." diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm index 33a46f63ac..5dbc635a9c 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm @@ -97,7 +97,7 @@ var/list/_cat_default_emotes = list( /mob/living/simple_mob/animal/passive/cat/verb/become_friends() set name = "Become Friends" - set category = "IC" + set category = "IC.Game" set src in view(1) var/mob/living/L = usr diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/fox_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/fox_vr.dm index 9a73a80ac1..d42cb23b09 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/pets/fox_vr.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/fox_vr.dm @@ -108,7 +108,7 @@ /mob/living/simple_mob/animal/passive/fox/renault/verb/become_friends() set name = "Become Friends" - set category = "IC" + set category = "IC.Game" set src in view(1) var/mob/living/L = usr @@ -167,7 +167,7 @@ /mob/living/simple_mob/animal/passive/fox/fluff/verb/friend() set name = "Become Friends" - set category = "IC" + set category = "IC.Game" set src in view(1) if(friend && usr == friend) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka.dm index e0d523d3fa..127295f615 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka.dm @@ -103,7 +103,7 @@ Field studies suggest analytical abilities on par with some species of cepholapo /mob/living/simple_mob/animal/sif/grafadreka/verb/sit_down() set name = "Sit Down" - set category = "IC" + set category = "IC.Grafadreka" if(sitting) resting = FALSE @@ -132,7 +132,7 @@ Field studies suggest analytical abilities on par with some species of cepholapo icon_rest = "doggo_lying" projectileverb = "spits" friendly = list("headbutts", "grooms", "play-bites", "rubs against") - bitesize = 10 // chomp + bitesize = 10 gender = NEUTER has_langs = list("Drake") @@ -564,7 +564,7 @@ var/global/list/wounds_being_tended_by_drakes = list() /mob/living/simple_mob/animal/sif/grafadreka/verb/rally_pack() set name = "Rally Pack" set desc = "Tries to command your fellow pack members to follow you." - set category = "Abilities" + set category = "Abilities.Grafadreka" if(!has_modifier_of_type(/datum/modifier/ace)) to_chat(src, span_warning("You aren't the pack leader! Sit down!")) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/kururak.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/kururak.dm index d6acfd76d0..b5ead80914 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/kururak.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/kururak.dm @@ -143,7 +143,7 @@ return ..() /mob/living/simple_mob/animal/sif/kururak/verb/do_flash() - set category = "Abilities" + set category = "Abilities.Kururak" set name = "Tail Blind" set desc = "Disorient a creature within range." @@ -229,7 +229,7 @@ R.flash_eyes() /mob/living/simple_mob/animal/sif/kururak/verb/do_strike() - set category = "Abilities" + set category = "Abilities.Kururak" set name = "Rending Strike" set desc = "Strike viciously at an entity within range." @@ -294,7 +294,7 @@ /mob/living/simple_mob/animal/sif/kururak/verb/rally_pack() // Mostly for telling other players to follow you. AI Kururaks will auto-follow, if set to. set name = "Rally Pack" set desc = "Tries to command your fellow pack members to follow you." - set category = "Abilities" + set category = "Abilities.Kururak" if(has_modifier_of_type(/datum/modifier/ace)) for(var/mob/living/simple_mob/animal/sif/kururak/K in hearers(7, src)) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/leech.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/leech.dm index 5e45548393..83aba9a001 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/leech.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/leech.dm @@ -225,7 +225,7 @@ leave_host() /mob/living/simple_mob/animal/sif/leech/verb/infest() - set category = "Abilities" + set category = "Abilities.Leech" set name = "Infest" set desc = "Infest a suitable humanoid host." @@ -312,7 +312,7 @@ return /mob/living/simple_mob/animal/sif/leech/verb/uninfest() - set category = "Abilities" + set category = "Abilities.Leech" set name = "Uninfest" set desc = "Leave your current host." @@ -336,7 +336,7 @@ host = null /mob/living/simple_mob/animal/sif/leech/verb/inject_victim() - set category = "Abilities" + set category = "Abilities.Leech" set name = "Incapacitate Potential Host" set desc = "Inject an organic host with an incredibly painful mixture of chemicals." @@ -384,7 +384,7 @@ H.add_modifier(/datum/modifier/poisoned/paralysis, 15 SECONDS) /mob/living/simple_mob/animal/sif/leech/verb/medicate_host() - set category = "Abilities" + set category = "Abilities.Leech" set name = "Produce Chemicals (50)" set desc = "Inject your host with possibly beneficial chemicals, to keep the blood flowing." @@ -407,7 +407,7 @@ to_chat(src, span_alien("We injected \the [host] with five units of [chem].")) /mob/living/simple_mob/animal/sif/leech/verb/feed_on_organ() - set category = "Abilities" + set category = "Abilities.Leech" set name = "Feed on Organ" set desc = "Extend probosci to feed on a piece of your host's organs." diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/racoon.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/racoon.dm index 0798f487d7..ad9f962330 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/racoon.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/racoon.dm @@ -72,7 +72,7 @@ /mob/living/simple_mob/animal/sif/sakimm/verb/remove_hat() set name = "Remove Hat" set desc = "Remove the animal's hat. You monster." - set category = "Abilities" + set category = "Abilities.Sakimm" set src in view(1) drop_hat(usr) @@ -95,7 +95,7 @@ /mob/living/simple_mob/animal/sif/sakimm/verb/give_hat() set name = "Give Hat" set desc = "Give the animal a hat. You hero." - set category = "Abilities" + set category = "Abilities.Sakimm" set src in view(1) take_hat(usr) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/savik.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/savik.dm index 79ccba6827..934dfebb48 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/savik.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/savik.dm @@ -78,7 +78,7 @@ /mob/living/simple_mob/animal/sif/savik/verb/berserk() set name = "Berserk" set desc = "Enrage and become vastly stronger for a period of time, however you will be weaker afterwards." - set category = "Abilities" + set category = "Abilities.Savik" add_modifier(/datum/modifier/berserk, 30 SECONDS) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/shantak.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/shantak.dm index 37644c4116..9615b97cd2 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/shantak.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/shantak.dm @@ -77,7 +77,7 @@ /mob/living/simple_mob/animal/sif/shantak/leader/verb/rally_pack() set name = "Rally Pack" set desc = "Commands your fellow packmembers to follow you, the leader." - set category = "Abilities" + set category = "Abilities.Shantak" for(var/mob/living/simple_mob/animal/sif/shantak/S in hearers(7, src)) if(istype(S, /mob/living/simple_mob/animal/sif/shantak/leader)) // Leaders won't follow other leaders. Also avoids trying to follow ourselves. diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/bear.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/bear.dm index 7270b2c491..d2b1466df0 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/space/bear.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/bear.dm @@ -44,6 +44,6 @@ /mob/living/simple_mob/animal/space/bear/verb/berserk() set name = "Berserk" set desc = "Enrage and become vastly stronger for a period of time, however you will be weaker afterwards." - set category = "Abilities" + set category = "Abilities.Bear" add_modifier(/datum/modifier/berserk, 30 SECONDS) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/goose.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/goose.dm index 0d5ad98cae..e6b642b6d8 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/space/goose.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/goose.dm @@ -42,7 +42,7 @@ /mob/living/simple_mob/animal/space/goose/verb/berserk() set name = "Berserk" set desc = "Enrage and become vastly stronger for a period of time, however you will be weaker afterwards." - set category = "Abilities" + set category = "Abilities.Goose" add_modifier(/datum/modifier/berserk, 30 SECONDS) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/space_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/space_vr.dm index 082f6342d0..e4ade30032 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/space/space_vr.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/space_vr.dm @@ -1,3 +1,3 @@ // Fix for Virgo 2's Surface /mob/living/simple_mob/animal/space - maxbodytemp = 700 \ No newline at end of file + maxbodytemp = 700 diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm index 47be983339..9ea34022f9 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm @@ -124,7 +124,7 @@ /mob/living/simple_mob/animal/space/space_worm/head/verb/toggle_devour() set name = "Toggle Feeding" set desc = "Extends your teeth for 30 seconds so that you can chew through mobs and structures alike." - set category = "Abilities" + set category = "Abilities.Worm" if(world.time < time_maw_opened + maw_cooldown) if(open_maw) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/squirrel.dm b/code/modules/mob/living/simple_mob/subtypes/animal/squirrel.dm index c6a8f0ac94..ded0cdb570 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/squirrel.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/squirrel.dm @@ -208,7 +208,7 @@ /mob/living/simple_mob/vore/squirrel/verb/squirrel_color() set name = "Pick Color" - set category = "Abilities" + set category = "Abilities.Settings" set desc = "You can set your color!" if(picked_color) to_chat(src, span_notice("You have already picked a color! If you picked the wrong color, ask an admin to change your picked_color variable to 0.")) diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/durand.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/durand.dm index 44a4ba3e32..86a6ad2c65 100644 --- a/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/durand.dm +++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/durand.dm @@ -60,7 +60,7 @@ /mob/living/simple_mob/mechanical/mecha/combat/durand/verb/toggle_defense_mode() set name = "Toggle Defense Mode" set desc = "Toggles a special mode which makes you immobile and much more resilient." - set category = "Abilities" + set category = "Abilities.Durand" set_defense_mode(!defense_mode) diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/bigdragon.dm b/code/modules/mob/living/simple_mob/subtypes/vore/bigdragon.dm index d3fc35c3c3..3036edd2f2 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/bigdragon.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/bigdragon.dm @@ -276,14 +276,14 @@ I think I covered everything. /mob/living/simple_mob/vore/bigdragon/proc/toggle_glow() set name = "Toggle Glow" set desc = "Switch between glowing and not glowing." - set category = "Abilities" + set category = "Abilities.Settings" glow_toggle = !glow_toggle /mob/living/simple_mob/vore/bigdragon/proc/sprite_toggle() set name = "Toggle Small Sprite" set desc = "Switches your sprite to a smaller variant so you can see what you're doing. Others will always see your standard sprite instead. " - set category = "Abilities" + set category = "Abilities.Settings" if(!small) var/image/I = image(icon = small_icon, icon_state = small_icon_state, loc = src) @@ -298,7 +298,7 @@ I think I covered everything. /mob/living/simple_mob/vore/bigdragon/proc/flame_toggle() set name = "Toggle breath attack" set desc = "Toggles whether you will breath attack on harm intent (If you have one)." - set category = "Abilities" + set category = "Abilities.Settings" if(norange) to_chat(src, span_userdanger("You don't have a breath attack!")) @@ -310,7 +310,7 @@ I think I covered everything. /mob/living/simple_mob/vore/bigdragon/proc/special_toggle() set name = "Toggle special attacks" set desc = "Toggles whether you will tail spin and charge (If you have them)." - set category = "Abilities" + set category = "Abilities.Settings" if(nospecial) to_chat(src, span_userdanger("You don't have special attacks!")) @@ -419,7 +419,7 @@ I think I covered everything. /mob/living/simple_mob/vore/bigdragon/proc/set_style() set name = "Set Dragon Style" set desc = "Customise your icons." - set category = "Abilities" + set category = "Abilities.Settings" var/list/options = list("Underbelly","Body","Ears","Mane","Horns","Eyes") for(var/option in options) diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_abilities.dm b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_abilities.dm index 73b9cc71ef..48101c4742 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_abilities.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_abilities.dm @@ -1,7 +1,7 @@ /mob/living/simple_mob/vore/demon/verb/blood_crawl() set name = "Bloodcrawl" set desc = "Shift out of reality using blood as your gateway" - set category = "Abilities" + set category = "Abilities.Demon" var/turf/T = get_turf(src) if(!T.CanPass(src,T) || loc != T) @@ -108,7 +108,7 @@ /mob/living/simple_mob/vore/demon/verb/phase_shift() set name = "Phase Shift" set desc = "Shift out of reality temporarily" - set category = "Abilities" + set category = "Abilities.Demon" var/turf/T = get_turf(src) diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/dominated_brain.dm b/code/modules/mob/living/simple_mob/subtypes/vore/dominated_brain.dm index 79f2432c44..28c9c8fb3e 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/dominated_brain.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/dominated_brain.dm @@ -172,7 +172,7 @@ //Welcome to the adapted borer code. /mob/proc/dominate_predator() - set category = "Abilities" + set category = "Abilities.Vore" set name = "Dominate Predator" set desc = "Connect to and dominate the brain of your predator." @@ -271,7 +271,7 @@ qdel(prey) /mob/proc/release_predator() - set category = "Abilities" + set category = "Abilities.Vore" set name = "Restore Control" set desc = "Release control of your predator's body." @@ -289,7 +289,7 @@ remove_verb(src, /mob/proc/release_predator) /mob/living/dominated_brain/proc/resist_control() - set category = "Abilities" + set category = "Abilities.Vore" set name = "Resist Control" set desc = "Attempt to resist control." if(pred_body.ckey == pred_ckey) @@ -308,7 +308,7 @@ to_chat(src, span_warning("\The [pred_body] is already dominated, and cannot be controlled at this time.")) /mob/living/proc/dominate_prey() - set category = "Abilities" + set category = "Abilities.Vore" set name = "Dominate Prey" set desc = "Connect to and dominate the brain of your prey." @@ -378,7 +378,7 @@ to_chat(M, span_warning("Your mind is gathered into \the [src], becoming part of them...")) /mob/living/dominated_brain/proc/cease_this_foolishness() - set category = "Abilities" + set category = "Abilities.Vore" set name = "Return to Body" set desc = "If your body is inside of your predator still, attempts to re-insert yourself into it." @@ -405,7 +405,7 @@ remove_verb(src, /mob/living/dominated_brain/proc/cease_this_foolishness) /mob/living/proc/lend_prey_control() - set category = "Abilities" + set category = "Abilities.Vore" set name = "Give Prey Control" set desc = "Allow prey control of your body." diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/leopardmander.dm b/code/modules/mob/living/simple_mob/subtypes/vore/leopardmander.dm index 5b35207b54..81e756e527 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/leopardmander.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/leopardmander.dm @@ -135,7 +135,7 @@ /mob/living/simple_mob/vore/leopardmander/exotic/proc/toggle_glow() set name = "Toggle Glow" set desc = "Switch between glowing and not glowing." - set category = "Abilities" + set category = "Abilities.Leopardmander" glow_toggle = !glow_toggle diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/mobs_monsters/clowns/honkelemental.dm b/code/modules/mob/living/simple_mob/subtypes/vore/mobs_monsters/clowns/honkelemental.dm index 2f9f0b578c..cfd68d41c4 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/mobs_monsters/clowns/honkelemental.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/mobs_monsters/clowns/honkelemental.dm @@ -24,7 +24,7 @@ emote_see = list("honks") /mob/living/simple_mob/clowns/big/c_shift/honkelemental/verb/spawn_egg() - set category = "Abilities" + set category = "Abilities.Clown" set name = "Spawn Clown Egg" set desc = "Spawns an egg that a player can touch, which will call on ghosts to spawn as clowns." diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/morph/morph.dm b/code/modules/mob/living/simple_mob/subtypes/vore/morph/morph.dm index 6eb6187f49..a726e5dcb4 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/morph/morph.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/morph/morph.dm @@ -247,7 +247,7 @@ /mob/living/simple_mob/vore/morph/proc/morph_color() set name = "Pick Color" - set category = "Abilities" + set category = "Abilities.Settings" set desc = "You can set your color!" var/newcolor = input(usr, "Choose a color.", "", color) as color|null if(newcolor) @@ -257,7 +257,7 @@ /mob/living/simple_mob/vore/morph/proc/take_over_prey() set name = "Take Over Prey" - set category = "Abilities" + set category = "Abilities.Morph" set desc = "Take command of your prey's body." if(morphed) to_chat(src, span_warning("You must restore to your original form first!")) diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/sect_drone.dm b/code/modules/mob/living/simple_mob/subtypes/vore/sect_drone.dm index 0c0adcc0a2..27e6d0e92a 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/sect_drone.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/sect_drone.dm @@ -93,7 +93,7 @@ /mob/living/simple_mob/vore/sect_drone/proc/set_abdomen_color() set name = "Set Glow Color" set desc = "Customize your eyes and abdomen glow color." - set category = "Abilities" + set category = "Abilities.Sect Drone" var/new_color = input(src, "Please select color.", "Glow Color", custom_eye_color) as color|null if(new_color) diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/sect_queen.dm b/code/modules/mob/living/simple_mob/subtypes/vore/sect_queen.dm index 15dfcf1368..76ab3b915f 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/sect_queen.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/sect_queen.dm @@ -94,7 +94,7 @@ /mob/living/simple_mob/vore/sect_queen/proc/set_abdomen_color() set name = "Set Glow Color" set desc = "Customize your eyes and abdomen glow color." - set category = "Abilities" + set category = "Abilities.Sect Queen" var/new_color = input(src, "Please select color.", "Glow Color", custom_eye_color) as color|null if(new_color) diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm b/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm index 62a4ac73b5..f30f34a184 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm @@ -52,7 +52,7 @@ /mob/living/simple_mob/proc/set_name() set name = "Set Name" set desc = "Sets your mobs name. You only get to do this once." - set category = "Abilities" + set category = "Abilities.Settings" if(limit_renames && nameset) to_chat(src, span_userdanger("You've already set your name. Ask an admin to toggle \"nameset\" to 0 if you really must.")) return @@ -66,7 +66,7 @@ /mob/living/simple_mob/proc/set_desc() set name = "Set Description" set desc = "Set your description." - set category = "Abilities" + set category = "Abilities.Settings" var/newdesc newdesc = sanitizeSafe(tgui_input_text(src,"Set your description. Max 4096 chars.", "Description set","", prevent_enter = TRUE), MAX_MESSAGE_LEN) if(newdesc) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 88247bdd07..9413f82256 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -288,7 +288,7 @@ /mob/verb/memory() set name = "Notes" - set category = "IC" + set category = "IC.Game" if(mind) mind.show_memory(src) else @@ -296,7 +296,7 @@ /mob/verb/add_memory(msg as message) set name = "Add Note" - set category = "IC" + set category = "IC.Game" msg = sanitize(msg) @@ -384,7 +384,7 @@ /mob/verb/abandon_mob() set name = "Return to Menu" - set category = "OOC" + set category = "OOC.Game" if(stat != DEAD || !ticker) to_chat(usr, span_boldnotice("You must be dead to use this!")) @@ -465,7 +465,7 @@ /client/verb/changes() set name = "Changelog" - set category = "OOC" + set category = "OOC.Resources" src << link("https://wiki.vore-station.net/Changelog") /* @@ -477,7 +477,7 @@ /mob/verb/observe() set name = "Observe" - set category = "OOC" + set category = "OOC.Game" var/is_admin = 0 if(client.holder && (client.holder.rights & R_ADMIN|R_EVENT)) @@ -519,7 +519,7 @@ /mob/verb/cancel_camera() set name = "Cancel Camera View" - set category = "OOC" + set category = "OOC.Game" unset_machine() reset_view(null) @@ -543,7 +543,7 @@ /mob/verb/stop_pulling() set name = "Stop Pulling" - set category = "IC" + set category = "IC.Game" if(pulling) if(ishuman(pulling)) @@ -998,7 +998,7 @@ /mob/verb/face_direction() set name = "Face Direction" - set category = "IC" + set category = "IC.Game" set src = usr set_face_dir() diff --git a/code/modules/mob/new_player/skill.dm b/code/modules/mob/new_player/skill.dm index 9bf4c4a497..98361e4bb6 100644 --- a/code/modules/mob/new_player/skill.dm +++ b/code/modules/mob/new_player/skill.dm @@ -207,7 +207,7 @@ var/global/list/SKILL_PRE = list(JOB_ENGINEER = SKILL_ENGINEER, JOB_ROBOTICIST = return /mob/living/carbon/human/verb/show_skills() - set category = "IC" + set category = "IC.Game" set name = "Show Own Skills" show_skill_window(src, src) diff --git a/code/modules/mob/new_player/sprite_accessories_taur.dm b/code/modules/mob/new_player/sprite_accessories_taur.dm index 8994b7ce1c..6dc5cbb011 100644 --- a/code/modules/mob/new_player/sprite_accessories_taur.dm +++ b/code/modules/mob/new_player/sprite_accessories_taur.dm @@ -90,7 +90,7 @@ /mob/living/carbon/human/proc/taur_mount(var/mob/living/M in living_mobs(1)) set name = "Taur Mount/Dismount" - set category = "Abilities" + set category = "Abilities.General" set desc = "Let people ride on you." if(LAZYLEN(buckled_mobs)) diff --git a/code/modules/mob/new_player/sprite_accessories_taur_vr.dm b/code/modules/mob/new_player/sprite_accessories_taur_vr.dm index 8ee54f33d9..f952596664 100644 --- a/code/modules/mob/new_player/sprite_accessories_taur_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_taur_vr.dm @@ -617,7 +617,7 @@ name = "Drake (Taur)" icon_state = "drake_s" extra_overlay = "drake_markings" -/// suit_sprites = 'icons/mob/taursuits_drake_vr.dmi' ///Chomp edit +/// suit_sprites = 'icons/mob/taursuits_drake_vr.dmi' suit_sprites = 'icons/mob/taursuits_drake_ch.dmi' icon_sprite_tag = "drake" can_loaf = TRUE diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index a5b7a6f00d..e7b7127163 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -3,7 +3,7 @@ /mob/verb/whisper(message as text) set name = "Whisper" - set category = "IC" + set category = "IC.Subtle" set hidden = 1 //VOREStation Addition Start if(forced_psay) @@ -15,7 +15,7 @@ /mob/verb/say_verb(message as text) set name = "Say" - set category = "IC" + set category = "IC.Chat" set hidden = 1 //VOREStation Addition Start if(forced_psay) @@ -28,7 +28,7 @@ /mob/verb/me_verb(message as message) set name = "Me" - set category = "IC" + set category = "IC.Chat" set desc = "Emote to nearby people (and your pred/prey)" set hidden = 1 diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm index 0ce22e0ec0..2c2a928deb 100644 --- a/code/modules/mob/say_vr.dm +++ b/code/modules/mob/say_vr.dm @@ -4,7 +4,7 @@ /mob/verb/me_verb_subtle(message as message) //This would normally go in say.dm set name = "Subtle" - set category = "IC" + set category = "IC.Subtle" set desc = "Emote to nearby people (and your pred/prey)" set hidden = 1 @@ -27,7 +27,7 @@ /mob/verb/me_verb_subtle_custom(message as message) // Literally same as above but with mode_selection set to true set name = "Subtle (Custom)" - set category = "IC" + set category = "IC.Subtle" set desc = "Emote to nearby people, with ability to choose which specific portion of people you wish to target." if(say_disabled) //This is here to try to identify lag problems @@ -260,7 +260,7 @@ ///// PSAY ///// /mob/verb/psay(message as text) - set category = "IC" + set category = "IC.Subtle" set name = "Psay" set desc = "Talk to people affected by complete absorbed or dominate predator/prey." @@ -358,7 +358,7 @@ ///// PME ///// /mob/verb/pme(message as message) - set category = "IC" + set category = "IC.Subtle" set name = "Pme" set desc = "Emote to people affected by complete absorbed or dominate predator/prey." @@ -454,7 +454,7 @@ M.me_verb(message) /mob/living/verb/player_narrate(message as message) - set category = "IC" + set category = "IC.Chat" set name = "Narrate (Player)" set desc = "Narrate an action or event! An alternative to emoting, for when your emote shouldn't start with your name!" @@ -500,7 +500,7 @@ /mob/verb/select_speech_bubble() set name = "Select Speech Bubble" - set category = "OOC" + set category = "OOC.Chat Settings" var/new_speech_bubble = tgui_input_list(src, "Pick new voice (default for automatic selection)", "Character Preference", selectable_speech_bubbles) if(new_speech_bubble) diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm index 66fe8d90ef..41c026076f 100644 --- a/code/modules/multiz/movement.dm +++ b/code/modules/multiz/movement.dm @@ -1,13 +1,13 @@ /mob/verb/up() set name = "Move Upwards" - set category = "IC" + set category = "IC.Game" if(zMove(UP)) to_chat(src, span_notice("You move upwards.")) /mob/verb/down() set name = "Move Down" - set category = "IC" + set category = "IC.Game" if(zMove(DOWN)) to_chat(src, span_notice("You move down.")) diff --git a/code/modules/multiz/movement_vr.dm b/code/modules/multiz/movement_vr.dm index 656d56600e..ca467e0a14 100644 --- a/code/modules/multiz/movement_vr.dm +++ b/code/modules/multiz/movement_vr.dm @@ -211,7 +211,7 @@ /mob/living/verb/climb_down() set name = "Climb down wall" set desc = "attempt to climb down the wall you are standing on, in direction you're looking" - set category = "IC" + set category = "IC.Game" var/fall_chance = 0 //Increased if we can't actually climb var/turf/our_turf = get_turf(src) //floor we're standing on diff --git a/code/modules/nifsoft/nif.dm b/code/modules/nifsoft/nif.dm index 04dc280ffb..d3e02a4e1d 100644 --- a/code/modules/nifsoft/nif.dm +++ b/code/modules/nifsoft/nif.dm @@ -688,7 +688,7 @@ You can also set the stat of a NIF to NIF_TEMPFAIL without any issues to disable /mob/living/carbon/human/proc/set_nif_examine() set name = "NIF Appearance" set desc = "If your NIF alters your appearance in some way, describe it here." - set category = "OOC" + set category = "OOC.Game Settings" if(!nif) remove_verb(src, /mob/living/carbon/human/proc/set_nif_examine) diff --git a/code/modules/nifsoft/nif_tgui.dm b/code/modules/nifsoft/nif_tgui.dm index 2c9227e5ad..35fe90115b 100644 --- a/code/modules/nifsoft/nif_tgui.dm +++ b/code/modules/nifsoft/nif_tgui.dm @@ -81,7 +81,7 @@ */ /mob/living/carbon/human/proc/nif_menu() set name = "NIF Menu" - set category = "IC" + set category = "IC.Nif" set desc = "Open the NIF user interface." var/obj/item/nif/N = nif diff --git a/code/modules/nifsoft/software/13_soulcatcher.dm b/code/modules/nifsoft/software/13_soulcatcher.dm index 7e5783cb25..82d506678b 100644 --- a/code/modules/nifsoft/software/13_soulcatcher.dm +++ b/code/modules/nifsoft/software/13_soulcatcher.dm @@ -396,7 +396,7 @@ /mob/living/carbon/brain/caught_soul/resist() set name = "Resist" - set category = "IC" + set category = "IC.Game" to_chat(src,span_warning("There's no way out! You're stuck in VR.")) @@ -487,7 +487,7 @@ /mob/proc/nsay(message as text) set name = "NSay" set desc = "Speak into your NIF's Soulcatcher." - set category = "IC" + set category = "IC.NiF" src.nsay_act(message) @@ -517,7 +517,7 @@ /mob/proc/nme(message as message) set name = "NMe" set desc = "Emote into your NIF's Soulcatcher." - set category = "IC" + set category = "IC.NiF" src.nme_act(message) diff --git a/code/modules/organs/internal/eyes.dm b/code/modules/organs/internal/eyes.dm index c0fdfb2b65..c7952314d7 100644 --- a/code/modules/organs/internal/eyes.dm +++ b/code/modules/organs/internal/eyes.dm @@ -33,7 +33,7 @@ /obj/item/organ/internal/eyes/proc/change_eye_color() set name = "Change Eye Color" set desc = "Changes your robotic eye color instantly." - set category = "IC" + set category = "IC.Settings" set src in usr var/current_color = rgb(eye_colour[1],eye_colour[2],eye_colour[3]) diff --git a/code/modules/paperwork/silicon_photography.dm b/code/modules/paperwork/silicon_photography.dm index ce7fee79ec..5d34396130 100644 --- a/code/modules/paperwork/silicon_photography.dm +++ b/code/modules/paperwork/silicon_photography.dm @@ -95,7 +95,7 @@ injectmasteralbum(p) /mob/living/silicon/ai/proc/take_image() - set category = "AI Commands" + set category = "AI.Commands" set name = "Take Image" set desc = "Takes an image" @@ -103,7 +103,7 @@ aiCamera.toggle_camera_mode() /mob/living/silicon/ai/proc/view_images() - set category = "AI Commands" + set category = "AI.Commands" set name = "View Images" set desc = "View images" @@ -111,7 +111,7 @@ aiCamera.viewpictures() /mob/living/silicon/ai/proc/delete_images() - set category = "AI Commands" + set category = "AI.Commands" set name = "Delete Image" set desc = "Delete image" diff --git a/code/modules/pda/ai.dm b/code/modules/pda/ai.dm index b3f889f02f..4511f530a3 100644 --- a/code/modules/pda/ai.dm +++ b/code/modules/pda/ai.dm @@ -22,7 +22,7 @@ //AI verb and proc for sending PDA messages. /obj/item/pda/ai/verb/cmd_pda_open_ui() - set category = "Abilities.AI_IM" + set category = "Abilities.AI" set name = "Use PDA" set src in usr diff --git a/code/modules/player_tips_vr/player_tips_controller_vr.dm b/code/modules/player_tips_vr/player_tips_controller_vr.dm index 6b8ce44414..e0e856765c 100644 --- a/code/modules/player_tips_vr/player_tips_controller_vr.dm +++ b/code/modules/player_tips_vr/player_tips_controller_vr.dm @@ -41,7 +41,7 @@ Controlled by the player_tips subsystem under code/controllers/subsystems/player /mob/living/verb/request_automated_advice() set name = "Request Automated Advice" set desc = "Sends you advice from a list of possibilities. You can choose to request a specific topic." - set category = "OOC" + set category = "OOC.Game Settings" var/choice = tgui_input_list(src, "What topic would you like to receive advice on?", "Select Topic", list("none","general","gameplay","roleplay","lore","cancel")) if(choice == "cancel") diff --git a/code/modules/power/supermatter/setup_supermatter.dm b/code/modules/power/supermatter/setup_supermatter.dm index 2267909e85..ab3729890d 100644 --- a/code/modules/power/supermatter/setup_supermatter.dm +++ b/code/modules/power/supermatter/setup_supermatter.dm @@ -10,7 +10,7 @@ /datum/admins/proc/setup_supermatter() - set category = "Debug" + set category = "Debug.Game" set name = "Setup Supermatter" set desc = "Allows you to start the Supermatter engine." diff --git a/code/modules/projectiles/targeting/targeting_mob.dm b/code/modules/projectiles/targeting/targeting_mob.dm index f80255c2b5..17aa15eed7 100644 --- a/code/modules/projectiles/targeting/targeting_mob.dm +++ b/code/modules/projectiles/targeting/targeting_mob.dm @@ -4,7 +4,7 @@ /mob/verb/toggle_gun_mode() set name = "Toggle Gun Mode" set desc = "Begin or stop aiming." - set category = "IC" + set category = "IC.Game" if(isliving(src)) var/mob/living/M = src diff --git a/code/modules/random_map/drop/droppod.dm b/code/modules/random_map/drop/droppod.dm index 6ceb139537..09ef0e6d2e 100644 --- a/code/modules/random_map/drop/droppod.dm +++ b/code/modules/random_map/drop/droppod.dm @@ -149,7 +149,7 @@ drop.forceMove(T) /datum/admins/proc/call_drop_pod() - set category = "Fun" + set category = "Fun.Drop Pod" set desc = "Call an immediate drop pod on your location." set name = "Call Drop Pod" diff --git a/code/modules/random_map/drop/supply.dm b/code/modules/random_map/drop/supply.dm index e4c2047d1f..2e04d38d92 100644 --- a/code/modules/random_map/drop/supply.dm +++ b/code/modules/random_map/drop/supply.dm @@ -33,7 +33,7 @@ /datum/admins/proc/call_supply_drop() - set category = "Fun" + set category = "Fun.Drop Pod" set desc = "Call an immediate supply drop on your location." set name = "Call Supply Drop" diff --git a/code/modules/random_map/random_map_verbs.dm b/code/modules/random_map/random_map_verbs.dm index c08e5ea119..8bef0f3231 100644 --- a/code/modules/random_map/random_map_verbs.dm +++ b/code/modules/random_map/random_map_verbs.dm @@ -1,5 +1,5 @@ /client/proc/print_random_map() - set category = "Debug" + set category = "Debug.Events" set name = "Display Random Map" set desc = "Show the contents of a random map." @@ -13,7 +13,7 @@ M.display_map(usr) /client/proc/delete_random_map() - set category = "Debug" + set category = "Debug.Events" set name = "Delete Random Map" set desc = "Delete a random map." @@ -30,7 +30,7 @@ qdel(M) /client/proc/create_random_map() - set category = "Debug" + set category = "Debug.Events" set name = "Create Random Map" set desc = "Create a random map." @@ -54,7 +54,7 @@ log_admin("[key_name(usr)] has created [M.name].") /client/proc/apply_random_map() - set category = "Debug" + set category = "Debug.Events" set name = "Apply Random Map" set desc = "Apply a map to the game world." @@ -79,7 +79,7 @@ M.apply_to_map() /client/proc/overlay_random_map() - set category = "Debug" + set category = "Debug.Events" set name = "Overlay Random Map" set desc = "Apply a map to another map." diff --git a/code/modules/reagents/Chemistry-Logging.dm b/code/modules/reagents/Chemistry-Logging.dm index 4c7b2343ad..57ea0270ad 100644 --- a/code/modules/reagents/Chemistry-Logging.dm +++ b/code/modules/reagents/Chemistry-Logging.dm @@ -16,7 +16,7 @@ /client/proc/view_chemical_reaction_logs() set name = "Show Chemical Reactions" - set category = "Admin" + set category = "Admin.Investigate" if(!check_rights(R_ADMIN|R_MOD)) return diff --git a/code/modules/reagents/machinery/dispenser/cartridge_spawn.dm b/code/modules/reagents/machinery/dispenser/cartridge_spawn.dm index 00287e8373..a33c401f03 100644 --- a/code/modules/reagents/machinery/dispenser/cartridge_spawn.dm +++ b/code/modules/reagents/machinery/dispenser/cartridge_spawn.dm @@ -1,6 +1,6 @@ /client/proc/spawn_chemdisp_cartridge(size in list("small", "medium", "large"), reagent in SSchemistry.chemical_reagents) set name = "Spawn Chemical Dispenser Cartridge" - set category = "Admin" + set category = "Admin.Events" var/obj/item/reagent_containers/chem_disp_cartridge/C switch(size) diff --git a/code/modules/shieldgen/directional_shield.dm b/code/modules/shieldgen/directional_shield.dm index 4dcc10b43d..f1e2d3fd53 100644 --- a/code/modules/shieldgen/directional_shield.dm +++ b/code/modules/shieldgen/directional_shield.dm @@ -102,12 +102,10 @@ START_PROCESSING(SSobj, src) AddComponent(/datum/component/recursive_move) RegisterSignal(src, COMSIG_OBSERVER_MOVED, PROC_REF(moved_event)) - //ChompEDIT START - shields on init if(always_on) spawn(0) if(!QDELETED(src)) create_shields() - //ChompEDIT END return ..() /obj/item/shield_projector/Destroy() diff --git a/code/modules/tgchat/chat_verbs.dm b/code/modules/tgchat/chat_verbs.dm index 29edc5b227..53cb07a84c 100644 --- a/code/modules/tgchat/chat_verbs.dm +++ b/code/modules/tgchat/chat_verbs.dm @@ -1,5 +1,5 @@ /client/verb/export_chat() - set category = "OOC" + set category = "OOC.Chat" set name = "Export Chatlog" set desc = "Allows to trigger the chat export" diff --git a/code/modules/tgui/external.dm b/code/modules/tgui/external.dm index 85b48569ba..93c5fe8129 100644 --- a/code/modules/tgui/external.dm +++ b/code/modules/tgui/external.dm @@ -183,7 +183,7 @@ /client/verb/tgui_fix_white() set desc = "Only use this if you have a broken TGUI window occupying your screen!" set name = "Fix TGUI" - set category = "OOC" + set category = "OOC.Debug" if(alert(src, "Only use this verb if you have a white TGUI window stuck on your screen.", "Fix TGUI", "Continue", "Nevermind") != "Continue") // Not tgui_alert since we're fixing tgui return diff --git a/code/modules/tgui_panel/external.dm b/code/modules/tgui_panel/external.dm index 3b68028a20..a4c8855fca 100644 --- a/code/modules/tgui_panel/external.dm +++ b/code/modules/tgui_panel/external.dm @@ -10,7 +10,7 @@ */ /client/verb/fix_tgui_panel() set name = "Fix chat" - set category = "OOC" + set category = "OOC.Debug" var/action log_tgui(src, "Started fixing.", context = "verb/fix_tgui_panel") @@ -44,7 +44,7 @@ /client/verb/refresh_tgui() set name = "Refresh TGUI" - set category = "OOC" + set category = "OOC.Debug" for(var/window_id in tgui_windows) var/datum/tgui_window/window = tgui_windows[window_id] diff --git a/code/modules/vchat/vchat_client.dm b/code/modules/vchat/vchat_client.dm index 5c4b0e1617..c22a790ef5 100644 --- a/code/modules/vchat/vchat_client.dm +++ b/code/modules/vchat/vchat_client.dm @@ -387,7 +387,7 @@ var/to_chat_src /client/proc/vchat_export_log() set name = "Export chatlog" - set category = "OOC" + set category = "OOC.Chat" if(chatOutput.broken) to_chat(src, span_warning("Error: VChat isn't processing your messages!")) diff --git a/code/modules/ventcrawl/ventcrawl_multiz.dm b/code/modules/ventcrawl/ventcrawl_multiz.dm index 87ef8f9ba7..1f669b3407 100644 --- a/code/modules/ventcrawl/ventcrawl_multiz.dm +++ b/code/modules/ventcrawl/ventcrawl_multiz.dm @@ -1,7 +1,7 @@ /obj/machinery/atmospherics/pipe/zpipe/up/verb/ventcrawl_move_up() set name = "Ventcrawl Upwards" set desc = "Climb up through a pipe." - set category = "Abilities" + set category = "Abilities.General" set src = usr.loc var/obj/machinery/atmospherics/target = check_ventcrawl(GetAbove(loc)) if(target) ventcrawl_to(usr, target, UP) @@ -9,7 +9,7 @@ /obj/machinery/atmospherics/pipe/zpipe/down/verb/ventcrawl_move_down() set name = "Ventcrawl Downwards" set desc = "Climb down through a pipe." - set category = "Abilities" + set category = "Abilities.General" set src = usr.loc var/obj/machinery/atmospherics/target = check_ventcrawl(GetBelow(loc)) if(target) ventcrawl_to(usr, target, DOWN) @@ -21,4 +21,4 @@ return node1 if(node2 in target) return node2 - return \ No newline at end of file + return diff --git a/code/modules/ventcrawl/ventcrawl_verb.dm b/code/modules/ventcrawl/ventcrawl_verb.dm index b49f22836d..82352777be 100644 --- a/code/modules/ventcrawl/ventcrawl_verb.dm +++ b/code/modules/ventcrawl/ventcrawl_verb.dm @@ -1,7 +1,7 @@ /mob/living/proc/ventcrawl() set name = "Crawl through Vent" set desc = "Enter an air vent and crawl through the pipe system." - set category = "Abilities" + set category = "Abilities.General" var/pipe = start_ventcrawl() if(pipe) handle_ventcrawl() diff --git a/code/modules/virus2/admin.dm b/code/modules/virus2/admin.dm index e8d1687f64..e08d7e5957 100644 --- a/code/modules/virus2/admin.dm +++ b/code/modules/virus2/admin.dm @@ -32,7 +32,7 @@ /datum/admins/var/datum/virus2_editor/virus2_editor_datum = new /client/proc/virus2_editor() set name = "Virus Editor" - set category = "Admin" + set category = "Admin.Events" if(!holder || !check_rights(R_SPAWN)) return // spawn privileges to create viruses holder.virus2_editor_datum.show_ui(src) diff --git a/code/modules/vore/chat_healthbars.dm b/code/modules/vore/chat_healthbars.dm index 84616f4fca..15d45a2299 100644 --- a/code/modules/vore/chat_healthbars.dm +++ b/code/modules/vore/chat_healthbars.dm @@ -114,7 +114,7 @@ /mob/living/verb/print_healthbars() set name = "Print Prey Healthbars" - set category = "Abilities" + set category = "Abilities.Vore" var/nuffin = TRUE diff --git a/code/modules/vore/eating/belly_import.dm b/code/modules/vore/eating/belly_import.dm index 18e750863f..d13389b579 100644 --- a/code/modules/vore/eating/belly_import.dm +++ b/code/modules/vore/eating/belly_import.dm @@ -525,7 +525,7 @@ new_belly.egg_type = new_egg_type /* Not implemented on virgo - if(istext(belly_data["egg_name"])) //CHOMPAdd Start + if(istext(belly_data["egg_name"])) var/new_egg_name = html_encode(belly_data["egg_name"]) if(new_egg_name) new_egg_name = readd_quotes(new_egg_name) @@ -643,7 +643,7 @@ var/new_sound_volume = belly_data["sound_volume"] new_belly.sound_volume = sanitize_integer(new_sound_volume, 0, 100, initial(new_belly.sound_volume)) - if(isnum(belly_data["noise_freq"])) //CHOMPAdd Start + if(isnum(belly_data["noise_freq"])) var/new_noise_freq = belly_data["noise_freq"] new_belly.noise_freq = sanitize_integer(new_noise_freq, MIN_VOICE_FREQ, MAX_VOICE_FREQ, initial(new_belly.noise_freq)) */ diff --git a/code/modules/vore/eating/inbelly_spawn.dm b/code/modules/vore/eating/inbelly_spawn.dm index e684d39b5c..e2ef03a472 100644 --- a/code/modules/vore/eating/inbelly_spawn.dm +++ b/code/modules/vore/eating/inbelly_spawn.dm @@ -1,5 +1,5 @@ /mob/observer/dead/verb/spawn_in_belly() - set category = "Ghost" + set category = "Ghost.Join" set name = "Spawn In Belly" set desc = "Spawn in someone's belly." diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm index bc37ecc605..ae486f1e3f 100644 --- a/code/modules/vore/eating/living_vr.dm +++ b/code/modules/vore/eating/living_vr.dm @@ -459,7 +459,7 @@ // /mob/living/proc/lick(mob/living/tasted in living_mobs(1)) set name = "Lick" - set category = "IC" + set category = "IC.Game" set desc = "Lick someone nearby!" set popup_menu = FALSE // Stop licking by accident! @@ -500,7 +500,7 @@ //This is just the above proc but switched about. /mob/living/proc/smell(mob/living/smelled in living_mobs(1)) set name = "Smell" - set category = "IC" + set category = "IC.Game" set desc = "Smell someone nearby!" set popup_menu = FALSE @@ -536,7 +536,7 @@ // /mob/living/proc/escapeOOC() set name = "OOC Escape" - set category = "OOC" + set category = "OOC.Vore" //You're in a belly! if(isbelly(loc)) @@ -825,7 +825,7 @@ /mob/living/proc/glow_toggle() set name = "Glow (Toggle)" - set category = "Abilities" + set category = "Abilities.General" set desc = "Toggle your glowing on/off!" //I don't really see a point to any sort of checking here. @@ -836,7 +836,7 @@ /mob/living/proc/glow_color() set name = "Glow (Set Color)" - set category = "Abilities" + set category = "Abilities.Settings" set desc = "Pick a color for your body's glow." //Again, no real need for a check on this. I'm unsure how it could be somehow abused. @@ -856,7 +856,7 @@ /mob/living/proc/eat_trash() set name = "Eat Trash" - set category = "Abilities" + set category = "Abilities.Vore" set desc = "Consume held garbage." if(!vore_selected) @@ -1000,14 +1000,14 @@ /mob/living/proc/toggle_trash_catching() //Ported from chompstation set name = "Toggle Trash Catching" - set category = "Abilities" + set category = "Abilities.Vore" set desc = "Toggle Trash Eater throw vore abilities." trash_catching = !trash_catching to_chat(src, span_warning("Trash catching [trash_catching ? "enabled" : "disabled"].")) /mob/living/proc/eat_minerals() //Actual eating abstracted so the user isn't given a prompt due to an argument in this verb. set name = "Eat Minerals" - set category = "Abilities" + set category = "Abilities.Vore" set desc = "Consume held raw ore, gems and refined minerals. Snack time!" handle_eat_minerals() @@ -1136,7 +1136,7 @@ /mob/living/proc/toggle_stuffing_mode() set name = "Toggle feeding mode" - set category = "Abilities" + set category = "Abilities.Vore" set desc = "Switch whether you will try to feed other people food whole or normally, bite by bite." stuffing_feeder = !stuffing_feeder @@ -1144,7 +1144,7 @@ /mob/living/proc/switch_scaling() set name = "Switch scaling mode" - set category = "Preferences" + set category = "Preferences.Game" set desc = "Switch sharp/fuzzy scaling for current mob." appearance_flags ^= PIXEL_SCALE fuzzy = !fuzzy @@ -1152,7 +1152,7 @@ /mob/living/proc/center_offset() set name = "Switch center offset mode" - set category = "Preferences" + set category = "Preferences.Game" set desc = "Switch sprite center offset to fix even/odd symmetry." offset_override = !offset_override update_transform() @@ -1236,7 +1236,7 @@ /mob/living/proc/vorebelly_printout() //Spew the vorepanel belly messages into chat window for copypasting. set name = "X-Print Vorebelly Settings" - set category = "Preferences" + set category = "Preferences.Vore" set desc = "Print out your vorebelly messages into chat for copypasting." var/result = tgui_alert(src, "Would you rather open the export panel?", "Selected Belly Export", list("Open Panel", "Print to Chat")) diff --git a/code/modules/vore/eating/silicon_vr.dm b/code/modules/vore/eating/silicon_vr.dm index dd6d2260cb..0ef778f829 100644 --- a/code/modules/vore/eating/silicon_vr.dm +++ b/code/modules/vore/eating/silicon_vr.dm @@ -41,7 +41,7 @@ /mob/living/silicon/ai/verb/holo_nom() set name = "Hardlight Nom" - set category = "AI Commands" + set category = "AI.Vore" set desc = "Wrap up a person in hardlight holograms." // Wrong state @@ -80,7 +80,7 @@ //I basically have to do this, you know? /mob/living/silicon/ai/examinate(atom/A as mob|obj|turf in view(eyeobj)) set name = "Examine" - set category = "IC" + set category = "IC.Game" A.examine(src) */ diff --git a/code/modules/vore/eating/simple_animal_vr.dm b/code/modules/vore/eating/simple_animal_vr.dm index 21380ccf59..b6eb8840b3 100644 --- a/code/modules/vore/eating/simple_animal_vr.dm +++ b/code/modules/vore/eating/simple_animal_vr.dm @@ -8,7 +8,7 @@ // /mob/living/simple_mob/proc/animal_nom(mob/living/T in living_mobs(1)) set name = "Animal Nom" - set category = "Abilities" // Moving this to abilities from IC as it's more fitting there + set category = "Abilities.Vore" // Moving this to abilities from IC as it's more fitting there set desc = "Since you can't grab, you get a verb!" if(stat != CONSCIOUS) @@ -30,7 +30,7 @@ /mob/living/simple_mob/proc/toggle_digestion() set name = "Toggle Animal's Digestion" set desc = "Enables digestion on this mob for 20 minutes." - set category = "OOC" + set category = "OOC.Mob Settings" set src in oview(1) var/mob/living/carbon/human/user = usr @@ -56,7 +56,7 @@ /mob/living/simple_mob/proc/toggle_fancygurgle() set name = "Toggle Animal's Gurgle sounds" set desc = "Switches between Fancy and Classic sounds on this mob." - set category = "OOC" + set category = "OOC.Mob Settings" set src in oview(1) var/mob/living/user = usr //I mean, At least ghosts won't use it. diff --git a/code/modules/vore/eating/vertical_nom_vr.dm b/code/modules/vore/eating/vertical_nom_vr.dm index f819fa5138..e47c1f00d9 100644 --- a/code/modules/vore/eating/vertical_nom_vr.dm +++ b/code/modules/vore/eating/vertical_nom_vr.dm @@ -1,7 +1,7 @@ /mob/living/proc/vertical_nom() set name = "Nom from Above" set desc = "Allows you to eat people who are below your tile or adjacent one. Requires passability." - set category = "Abilities" + set category = "Abilities.Vore" if(stat == DEAD || paralysis || weakened || stunned) to_chat(src, span_notice("You cannot do that while in your current state.")) diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm index 88266f1b84..f682673a14 100644 --- a/code/modules/vore/eating/vorepanel_vr.dm +++ b/code/modules/vore/eating/vorepanel_vr.dm @@ -22,7 +22,7 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono", /mob/proc/insidePanel() set name = "Vore Panel" - set category = "IC" + set category = "IC.Vore" if(SSticker.current_state == GAME_STATE_INIT) return diff --git a/code/modules/vore/resizing/resize_vr.dm b/code/modules/vore/resizing/resize_vr.dm index 33a152492b..9a0a59047d 100644 --- a/code/modules/vore/resizing/resize_vr.dm +++ b/code/modules/vore/resizing/resize_vr.dm @@ -152,7 +152,7 @@ /mob/living/proc/set_size() set name = "Adjust Mass" - set category = "Abilities" //Seeing as prometheans have an IC reason to be changing mass. + set category = "Abilities.General" //Seeing as prometheans have an IC reason to be changing mass. var/nagmessage = "Adjust your mass to be a size between 25 to 200% (or 1% to 600% in dormitories). (DO NOT ABUSE)" var/default = size_multiplier * 100 @@ -403,7 +403,7 @@ /mob/living/verb/toggle_pickups() set name = "Toggle Micro Pick-up" set desc = "Toggles whether your help-intent action attempts to pick up the micro or pet/hug/help them. Does not disable participation in pick-up mechanics entirely, refer to Vore Panel preferences for that." - set category = "IC" + set category = "IC.Settings" pickup_active = !pickup_active to_chat(src, span_filter_notice("You will [pickup_active ? "now" : "no longer"] attempt to pick up mobs when clicking them with help intent.")) diff --git a/code/modules/whitelist/whitelist.dm b/code/modules/whitelist/whitelist.dm index 2bc269acf7..917ecc56ec 100644 --- a/code/modules/whitelist/whitelist.dm +++ b/code/modules/whitelist/whitelist.dm @@ -5,7 +5,7 @@ /client/verb/print_whitelist() set name = "Show Whitelist Entries" set desc = "Print the set of things you're whitelisted for." - set category = "OOC" + set category = "OOC.Client settings" to_chat(src, "You are whitelisted for:") to_chat(src, jointext(get_whitelists_list(), "\n")) diff --git a/interface/interface.dm b/interface/interface.dm index 7276d0fc60..7042a2dda0 100644 --- a/interface/interface.dm +++ b/interface/interface.dm @@ -2,7 +2,7 @@ /client/verb/wiki(query as text) set name = "wiki" set desc = "Type what you want to know about. This will open the wiki on your web browser." - set category = "OOC" + set category = "OOC.Resources" if(CONFIG_GET(string/wikiurl)) if(query) if(CONFIG_GET(string/wikisearchurl)) @@ -95,7 +95,7 @@ /client/verb/hotkeys_help() set name = "hotkeys-help" - set category = "OOC" + set category = "OOC.Resources" var/admin = {" Admin: diff --git a/tools/localhost-asset-webroot-server.py b/tools/localhost-asset-webroot-server.py new file mode 100644 index 0000000000..31a85a4eb4 --- /dev/null +++ b/tools/localhost-asset-webroot-server.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python3 +from http.server import HTTPServer, SimpleHTTPRequestHandler +import os + +class CORSRequestHandler(SimpleHTTPRequestHandler): + def end_headers(self): + self.send_header('Access-Control-Allow-Origin', '*') + self.send_header('Access-Control-Allow-Methods', 'GET') + self.send_header('Cache-Control', 'no-store, no-cache, must-revalidate') + return super(CORSRequestHandler, self).end_headers() + +os.makedirs('../data/asset-store/', exist_ok=True) +os.chdir('../data/asset-store/') +httpd = HTTPServer(('localhost', 58715), CORSRequestHandler) +httpd.serve_forever() diff --git a/vorestation.dme b/vorestation.dme index 17cb03062b..9b8c8dcb74 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -365,6 +365,7 @@ #include "code\controllers\subsystems\player_tips.dm" #include "code\controllers\subsystems\radiation.dm" #include "code\controllers\subsystems\robot_sprites.dm" +#include "code\controllers\subsystems\server_maint.dm" #include "code\controllers\subsystems\shuttles.dm" #include "code\controllers\subsystems\skybox.dm" #include "code\controllers\subsystems\sounds.dm" From a1576977cccc9cb18ce53ac97e3cf3c2cf8b861f Mon Sep 17 00:00:00 2001 From: Kashargul <144968721+Kashargul@users.noreply.github.com> Date: Mon, 4 Nov 2024 21:12:31 +0100 Subject: [PATCH 12/36] Robot upgrades (#16481) * initial * variable cell durability and hp increase on upgrades * cell hp * cell influences components * set defaults for most * value tgui * . * . * . * fix copy typoes * also this * . * sanity that * . --- code/datums/mutable_appearance.dm | 2 +- code/modules/admin/modify_robot.dm | 98 +++++- code/modules/client/client procs.dm | 2 +- .../mob/living/silicon/robot/component.dm | 68 +++- .../mob/living/silicon/robot/robot_damage.dm | 6 + code/modules/power/cell.dm | 1 + code/modules/power/cells/device_cells_vr.dm | 1 + code/modules/power/cells/power_cells.dm | 7 + code/modules/research/prosfab_designs.dm | 44 +++ .../ModifyRobotTabs/ModifyRobotComponent.tsx | 292 ++++++++++-------- .../ModifyRobotComponentTabs.tsx | 247 +++++++++++++++ .../tgui/interfaces/ModifyRobot/constants.ts | 8 + .../tgui/interfaces/ModifyRobot/index.tsx | 20 +- .../tgui/interfaces/ModifyRobot/types.ts | 23 ++ 14 files changed, 665 insertions(+), 154 deletions(-) create mode 100644 tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotComponentTabs.tsx diff --git a/code/datums/mutable_appearance.dm b/code/datums/mutable_appearance.dm index 98ece935a6..56faf42469 100644 --- a/code/datums/mutable_appearance.dm +++ b/code/datums/mutable_appearance.dm @@ -4,7 +4,7 @@ // Mutable appearances are children of images, just so you know. -/image/mutable_appearance/New(copy_from, ...) +/mutable_appearance/New(copy_from, ...) ..() if(!copy_from) plane = FLOAT_PLANE // No clue why this is 0 by default yet images are on FLOAT_PLANE diff --git a/code/modules/admin/modify_robot.dm b/code/modules/admin/modify_robot.dm index 9166f3be29..f2847943f3 100644 --- a/code/modules/admin/modify_robot.dm +++ b/code/modules/admin/modify_robot.dm @@ -89,6 +89,13 @@ .["target"]["components"] = get_components() .["cell"] = list("name" = target.cell?.name, "charge" = target.cell?.charge, "maxcharge" = target.cell?.maxcharge) .["cell_options"] = get_cells() + .["camera_options"] = get_component("camera") + .["radio_options"] = get_component("radio") + .["actuator_options"] = get_component("actuator") + .["diagnosis_options"] = get_component("diagnosis") + .["comms_options"] = get_component("comms") + .["armour_options"] = get_component("armour") + .["current_gear"] = get_gear() // Access .["id_icon"] = icon2html(target.idcard, user, sourceonly=TRUE) var/list/active_access = list() @@ -198,7 +205,7 @@ target.module.contents.Add(add_item) spawn(0) SEND_SIGNAL(add_item, COMSIG_OBSERVER_MOVED) - target.hud_used.update_robot_modules_display() + target.hud_used?.update_robot_modules_display() if(istype(add_item, /obj/item/stack/)) var/obj/item/stack/item_with_synth = add_item for(var/synth in item_with_synth.synths) @@ -243,7 +250,7 @@ if("rem_module") var/obj/item/rem_item = locate(params["module"]) target.uneq_all() - target.hud_used.update_robot_modules_display(TRUE) + target.hud_used?.update_robot_modules_display(TRUE) target.module.emag.Remove(rem_item) target.module.modules.Remove(rem_item) target.module.contents.Remove(rem_item) @@ -262,14 +269,14 @@ source.emag_items = 1 // Target target.uneq_all() - target.hud_used.update_robot_modules_display(TRUE) + target.hud_used?.update_robot_modules_display(TRUE) qdel(target.module) target.modtype = mod_type module_type = robot_modules[mod_type] target.transform_with_anim() new module_type(target) target.hands.icon_state = target.get_hud_module_icon() - target.hud_used.update_robot_modules_display() + target.hud_used?.update_robot_modules_display() return TRUE if("ert_toggle") target.crisis_override = !target.crisis_override @@ -299,7 +306,7 @@ if(!U.action(target)) return FALSE U.loc = target - target.hud_used.update_robot_modules_display() + target.hud_used?.update_robot_modules_display() return TRUE if("install_modkit") var/new_modkit = text2path(params["modkit"]) @@ -348,22 +355,34 @@ var/datum/robot_component/C = locate(params["component"]) if(C.wrapped) qdel(C.wrapped) + var/new_component = text2path(params["new_part"]) if(istype(C, /datum/robot_component/actuator)) - C.wrapped = new /obj/item/robot_parts/robot_component/actuator(target) + if(!new_component) + new_component = /obj/item/robot_parts/robot_component/actuator + C.wrapped = new new_component(target) else if(istype(C, /datum/robot_component/radio)) - C.wrapped = new /obj/item/robot_parts/robot_component/radio(target) + if(!new_component) + new_component = /obj/item/robot_parts/robot_component/radio + C.wrapped = new new_component(target) else if(istype(C, /datum/robot_component/cell)) - var/new_cell = text2path(params["cell"]) - target.cell = new new_cell(target) + target.cell = new new_component(target) C.wrapped = target.cell else if(istype(C, /datum/robot_component/diagnosis_unit)) - C.wrapped = new /obj/item/robot_parts/robot_component/diagnosis_unit(target) + if(!new_component) + new_component = /obj/item/robot_parts/robot_component/diagnosis_unit + C.wrapped = new new_component(target) else if(istype(C, /datum/robot_component/camera)) - C.wrapped = new /obj/item/robot_parts/robot_component/camera(target) + if(!new_component) + new_component = /obj/item/robot_parts/robot_component/camera + C.wrapped = new new_component(target) else if(istype(C, /datum/robot_component/binary_communication)) - C.wrapped = new /obj/item/robot_parts/robot_component/binary_communication_device(target) + if(!new_component) + new_component = /obj/item/robot_parts/robot_component/binary_communication_device + C.wrapped = new new_component(target) else if(istype(C, /datum/robot_component/armour)) - C.wrapped = new /obj/item/robot_parts/robot_component/armour(target) + if(!new_component) + new_component = /obj/item/robot_parts/robot_component/armour + C.wrapped = new new_component(target) C.brute_damage = 0 C.electronics_damage = 0 C.install() @@ -533,7 +552,7 @@ target.clear_inherent_laws() target.laws = new global.using_map.default_law_type target.laws.show_laws(target) - target.hud_used.update_robot_modules_display() + target.hud_used?.update_robot_modules_display() else target.emagged = 1 target.lawupdate = 0 @@ -545,7 +564,7 @@ if(!target.bolt.malfunction) target.bolt.malfunction = MALFUNCTION_PERMANENT target.laws.show_laws(target) - target.hud_used.update_robot_modules_display() + target.hud_used?.update_robot_modules_display() return TRUE /datum/eventkit/modify_robot/proc/get_target_items(var/mob/user) @@ -672,14 +691,59 @@ continue if(cell_options[initial(C.name)]) // empty cells are defined after normal cells! continue - cell_options += list(initial(C.name) = list("path" = "[C]", "charge" = initial(C.maxcharge), "max_charge" = initial(C.maxcharge), "charge_amount" = initial(C.charge_amount) , "self_charge" = initial(C.self_recharge))) // our cells do not have their charge predefined, they do it on init, so both maaxcharge for now + cell_options += list(initial(C.name) = list("path" = "[C]", "charge" = initial(C.maxcharge), "max_charge" = initial(C.maxcharge), "charge_amount" = initial(C.charge_amount) , "self_charge" = initial(C.self_recharge), "max_damage" = initial(C.robot_durability))) // our cells do not have their charge predefined, they do it on init, so both maaxcharge for now return cell_options +/datum/eventkit/modify_robot/proc/get_component(var/type) + var/path + switch(type) + if("camera") + path = /obj/item/robot_parts/robot_component/camera + if("radio") + path = /obj/item/robot_parts/robot_component/radio + if("actuator") + path = /obj/item/robot_parts/robot_component/actuator + if("diagnosis") + path = /obj/item/robot_parts/robot_component/diagnosis_unit + if("comms") + path = /obj/item/robot_parts/robot_component/binary_communication_device + if("armour") + path = /obj/item/robot_parts/robot_component/armour + if(!path) + return + var/list/components = list() + for(var/component in typesof(path)) + var/obj/item/robot_parts/robot_component/C = component + components += list("[initial(C.name)]" = list("path" = "[component]", "idle_usage" = "[C.idle_usage]", "active_usage" = "[C.active_usage]", "max_damage" = "[C.max_damage]")) + return components + +/datum/eventkit/modify_robot/proc/get_gear() + var/list/equip = list() + for (var/V in target.components) + var/datum/robot_component/C = target.components[V] + var/component_name + if(istype(C.wrapped, /obj/item/robot_parts/robot_component)) + component_name = C.wrapped?.name + switch(V) + if("actuator") + equip += list("[lowertext(C.name)]" = "[component_name]") + if("radio") + equip += list("[lowertext(C.name)]" = "[component_name]") + if("diagnosis unit") + equip += list("[lowertext(C.name)]" = "[component_name]") + if("camera") + equip += list("[lowertext(C.name)]" = "[component_name]") + if("comms") + equip += list("[lowertext(C.name)]" = "[component_name]") + if("armour") + equip += list("[lowertext(C.name)]" = "[component_name]") + return equip + /datum/eventkit/modify_robot/proc/get_components() var/list/components = list() for(var/entry in target.components) var/datum/robot_component/C = target.components[entry] - components += list(list("name" = C.name, "ref" = "\ref[C]", "brute_damage" = C.brute_damage, "electronics_damage" = C.electronics_damage, "max_damage" = C.max_damage, "installed" = C.installed, "exists" = (C.wrapped ? TRUE : FALSE))) + components += list(list("name" = C.name, "ref" = "\ref[C]", "brute_damage" = C.brute_damage, "electronics_damage" = C.electronics_damage, "max_damage" = C.max_damage, "idle_usage" = C.idle_usage, "active_usage" = C.active_usage, "installed" = C.installed, "exists" = (C.wrapped ? TRUE : FALSE))) return components /datum/eventkit/modify_robot/proc/package_laws(var/list/data, var/field, var/list/datum/ai_law/laws) diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index f7d4a940c1..86dffce176 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -518,7 +518,7 @@ /client/verb/game_options() set name = "Game Options" - set category = "Preferences.Character" + set category = "Preferences.Game" if(prefs) prefs.tgui_interact(usr) diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index f89061e88e..d57d1092a6 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -21,7 +21,20 @@ src.owner = R /datum/robot_component/proc/install() + if(istype(wrapped, /obj/item/robot_parts/robot_component)) + var/obj/item/robot_parts/robot_component/comp = wrapped + max_damage = comp.max_damage + idle_usage = comp.idle_usage + active_usage = comp.active_usage + return + if(istype(wrapped, /obj/item/cell)) + var/obj/item/cell/cell = wrapped + max_damage = cell.robot_durability + /datum/robot_component/proc/uninstall() + max_damage = initial(max_damage) + idle_usage = initial(idle_usage) + active_usage = initial(active_usage) /datum/robot_component/proc/destroy() var/brokenstate = "broken" // Generic icon @@ -231,24 +244,34 @@ var/brute = 0 var/burn = 0 var/icon_state_broken = "broken" + var/idle_usage = 0 + var/active_usage = 0 + var/max_damage = 0 /obj/item/robot_parts/robot_component/binary_communication_device name = "binary communication device" desc = "A module used for binary communications over encrypted frequencies, commonly used by synthetic robots." icon_state = "binradio" icon_state_broken = "binradio_broken" + idle_usage = 5 + active_usage = 25 + max_damage = 30 /obj/item/robot_parts/robot_component/actuator name = "actuator" desc = "A modular, hydraulic actuator used by exosuits and robots alike for movement and manipulation." icon_state = "motor" icon_state_broken = "motor_broken" + idle_usage = 0 + active_usage = 200 + max_damage = 50 /obj/item/robot_parts/robot_component/armour name = "armour plating" desc = "A pair of flexible, adaptable armor plates, used to protect the internals of robots." icon_state = "armor" icon_state_broken = "armor_broken" + max_damage = 90 /obj/item/robot_parts/robot_component/armour_platform name = "platform armour plating" @@ -256,21 +279,64 @@ icon_state = "armor" icon_state_broken = "armor_broken" color = COLOR_GRAY80 + max_damage = 140 /obj/item/robot_parts/robot_component/camera name = "camera" desc = "A modified camera module used as a visual receptor for robots and exosuits, also serving as a relay for wireless video feed." icon_state = "camera" icon_state_broken = "camera_broken" + idle_usage = 10 + max_damage = 40 /obj/item/robot_parts/robot_component/diagnosis_unit name = "diagnosis unit" desc = "An internal computer and sensors used by robots and exosuits to accurately diagnose any system discrepancies on their components." icon_state = "analyser" icon_state_broken = "analyser_broken" + active_usage = 1000 + max_damage = 30 /obj/item/robot_parts/robot_component/radio name = "radio" desc = "A modular, multi-frequency radio used by robots and exosuits to enable communication systems. Comes with built-in subspace receivers." icon_state = "radio" - icon_state_broken = "radio_broken" \ No newline at end of file + icon_state_broken = "radio_broken" + idle_usage = 15 + active_usage = 75 + max_damage = 40 + +// Improved components +/obj/item/robot_parts/robot_component/binary_communication_device/upgraded + name = "improved binary communication device" + idle_usage = 2.5 + active_usage = 12.5 + max_damage = 45 + +/obj/item/robot_parts/robot_component/radio/upgraded + name = "improved radio" + idle_usage = 5 + active_usage = 35 + max_damage = 40 + +/obj/item/robot_parts/robot_component/actuator/upgraded + name = "improved actuator" + idle_usage = 0 + active_usage = 100 + max_damage = 75 + +/obj/item/robot_parts/robot_component/diagnosis_unit/upgraded + name = "improved self-diagnosis unit" + active_usage = 500 + max_damage = 45 + +/obj/item/robot_parts/robot_component/camera/upgraded + name = "improved camera" + idle_usage = 5 + max_damage = 60 + +/obj/item/robot_parts/robot_component/armour/armour_titan + name = "prototype armour plating" + desc = "A pair of flexible, adaptable armor plates, used to protect the internals of robots." + max_damage = 220 + color = COLOR_OFF_WHITE diff --git a/code/modules/mob/living/silicon/robot/robot_damage.dm b/code/modules/mob/living/silicon/robot/robot_damage.dm index 907148e453..1ad7f5c48f 100644 --- a/code/modules/mob/living/silicon/robot/robot_damage.dm +++ b/code/modules/mob/living/silicon/robot/robot_damage.dm @@ -6,6 +6,12 @@ health = getMaxHealth() - (getBruteLoss() + getFireLoss()) return +/mob/living/silicon/robot/getMaxHealth() + . = ..() + for(var/V in components) + var/datum/robot_component/C = components[V] + . += C.max_damage - initial(C.max_damage) + /mob/living/silicon/robot/getBruteLoss() var/amount = 0 for(var/V in components) diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 2a98049b0b..e963b54849 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -27,6 +27,7 @@ var/last_use = 0 // A tracker for use in self-charging var/connector_type = "standard" //What connector sprite to use when in a cell charger, null if no connectors var/charge_delay = 0 // How long it takes for the cell to start recharging after last use + var/robot_durability = 50 matter = list(MAT_STEEL = 700, MAT_GLASS = 50) drop_sound = 'sound/items/drop/component.ogg' pickup_sound = 'sound/items/pickup/component.ogg' diff --git a/code/modules/power/cells/device_cells_vr.dm b/code/modules/power/cells/device_cells_vr.dm index f810799f84..8a62f646aa 100644 --- a/code/modules/power/cells/device_cells_vr.dm +++ b/code/modules/power/cells/device_cells_vr.dm @@ -29,6 +29,7 @@ matter = null standard_overlays = FALSE var/swaps_to = /obj/item/cell/device/weapon/recharge/alien + robot_durability = 100 /obj/item/cell/void/attack_self(var/mob/user) user.remove_from_mob(src) diff --git a/code/modules/power/cells/power_cells.dm b/code/modules/power/cells/power_cells.dm index 774c5d8817..f4a7c9d1aa 100644 --- a/code/modules/power/cells/power_cells.dm +++ b/code/modules/power/cells/power_cells.dm @@ -16,6 +16,7 @@ icon_state = "crap" maxcharge = 500 matter = list(MAT_STEEL = 700, MAT_GLASS = 40) + robot_durability = 20 /obj/item/cell/crap/update_icon() //No visible charge indicator return @@ -50,6 +51,7 @@ icon_state = "high" maxcharge = 10000 matter = list(MAT_STEEL = 700, MAT_GLASS = 60) + robot_durability = 55 /obj/item/cell/high/empty/New() ..() @@ -65,6 +67,7 @@ icon_state = "super" maxcharge = 20000 matter = list(MAT_STEEL = 700, MAT_GLASS = 70) + robot_durability = 60 /obj/item/cell/super/empty/New() ..() @@ -79,6 +82,7 @@ description_fluff = "Almost as good as a hyper." icon_state = "super" //We don't want roboticists confuse it with a low standard cell maxcharge = 25000 + robot_durability = 65 /* * Hyper @@ -89,6 +93,7 @@ icon_state = "hyper" maxcharge = 30000 matter = list(MAT_STEEL = 700, MAT_GLASS = 80) + robot_durability = 70 /obj/item/cell/hyper/empty/New() ..() @@ -143,6 +148,7 @@ origin_tech = null maxcharge = 30000 //determines how badly mobs get shocked matter = list(MAT_STEEL = 700, MAT_GLASS = 80) + robot_durability = 200 /obj/item/cell/infinite/check_charge() return 1 @@ -161,6 +167,7 @@ charge = 100 maxcharge = 300 minor_fault = 1 + robot_durability = 30 /* * Slime diff --git a/code/modules/research/prosfab_designs.dm b/code/modules/research/prosfab_designs.dm index 803ac462db..8bf0beb742 100644 --- a/code/modules/research/prosfab_designs.dm +++ b/code/modules/research/prosfab_designs.dm @@ -378,6 +378,50 @@ id = "mmi_ai_shell" build_path = /obj/item/mmi/inert/ai_remote +//////////////////// Advanced Components //////////////////// +/datum/design/item/prosfab/cyborg/component/radio_upgraded + name = "Improved Radio" + id = "improved_radio" + build_path = /obj/item/robot_parts/robot_component/radio/upgraded + req_tech = list(TECH_MAGNET = 7, TECH_MATERIAL = 5, TECH_PRECURSOR = 1) + materials = list(MAT_STEEL = 10000, MAT_DIAMOND = 2000, MAT_PLASTEEL = 3000, MAT_GLASS = 6500, MAT_SILVER = 3000, MAT_MORPHIUM = 560, MAT_DURASTEEL = 800) + +/datum/design/item/prosfab/cyborg/component/actuator_upgraded + name = "Improved Actuator" + id = "improved_actuator" + build_path = /obj/item/robot_parts/robot_component/actuator/upgraded + req_tech = list(TECH_MAGNET = 7, TECH_MATERIAL = 5, TECH_PRECURSOR = 1) + materials = list(MAT_STEEL = 10000, MAT_PLASTEEL = 2500, MAT_MORPHIUM = 500, MAT_DURASTEEL = 500) + +/datum/design/item/prosfab/cyborg/component/diagnosis_unit_upgraded + name = "Improved Diagnosis Unit" + id = "improved_diagnosis_unit" + build_path = /obj/item/robot_parts/robot_component/diagnosis_unit/upgraded + req_tech = list(TECH_MAGNET = 7, TECH_MATERIAL = 5, TECH_PRECURSOR = 1) + materials = list(MAT_STEEL = 10000, MAT_DIAMOND = 2000, MAT_URANIUM = 4000, MAT_PLASTEEL = 1000, MAT_GLASS = 400, MAT_SILVER = 1000, MAT_MORPHIUM = 420, MAT_DURASTEEL = 600) + +/datum/design/item/prosfab/cyborg/component/camera_upgraded + name = "Improved Camera" + id = "improved_camera" + build_path = /obj/item/robot_parts/robot_component/camera/upgraded + req_tech = list(TECH_MAGNET = 7, TECH_MATERIAL = 5, TECH_PRECURSOR = 1) + materials = list(MAT_STEEL = 10000, MAT_DIAMOND = 2000, MAT_PLASTEEL = 3000, MAT_GLASS = 6500, MAT_SILVER = 3000, MAT_MORPHIUM = 560, MAT_DURASTEEL = 800) + +/datum/design/item/prosfab/cyborg/component/binary_communication_device/upgraded + name = "Improved Binary Communication Device" + id = "improved_binary_communication_device" + build_path = /obj/item/robot_parts/robot_component/binary_communication_device/upgraded + req_tech = list(TECH_MAGNET = 7, TECH_MATERIAL = 5, TECH_PRECURSOR = 1) + materials = list(MAT_STEEL = 10000, MAT_DIAMOND = 2000, MAT_PLASTEEL = 3000, MAT_GLASS = 6500, MAT_GOLD = 3000, MAT_DURASTEEL = 800) + +/datum/design/item/prosfab/cyborg/component/armour_very_heavy + name = "Armour Plating (Prototype)" + id = "titan_armour" + build_path = /obj/item/robot_parts/robot_component/armour/armour_titan + req_tech = list(TECH_MATERIAL = 9, TECH_PRECURSOR = 3) + materials = list(MAT_STEEL = 12000, MAT_MORPHIUM = 3000, MAT_DURASTEEL = 5000) + + //////////////////// Cyborg Modules //////////////////// /datum/design/item/prosfab/robot_upgrade category = list("Cyborg Modules") diff --git a/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotComponent.tsx b/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotComponent.tsx index a2ba8e8294..293db7da7d 100644 --- a/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotComponent.tsx +++ b/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotComponent.tsx @@ -1,40 +1,149 @@ -import { toFixed } from 'common/math'; import { capitalize } from 'common/string'; import { useState } from 'react'; import { useBackend } from 'tgui/backend'; import { - Box, Button, - Collapsible, Divider, - Dropdown, Flex, Icon, Image, Input, Section, - Slider, Stack, + Tabs, } from 'tgui/components'; import { NoSpriteWarning } from '../components'; +import { + ACTUATOR, + ARMOUR, + CAMERA, + COMMS, + DIAGNOSIS, + POWERCELL, + RADIO, +} from '../constants'; import { prepareSearch } from '../functions'; -import { Cell, Component, InstalledCell, Target } from '../types'; +import { Cell, Comp, Component, InstalledCell, Lookup, Target } from '../types'; +import { BadminTab, CellCommp, CompTab } from './ModifyRobotComponentTabs'; export const ModifyRobotComponent = (props: { target: Target; cell: InstalledCell; cells: Record; + cams: Record; + rads: Record; + acts: Record; + diags: Record; + comms: Record; + arms: Record; + gear: Record; }) => { - const { act } = useBackend(); - const { target, cell, cells } = props; + const { target, cell, cells, cams, rads, acts, diags, comms, arms, gear } = + props; const [searchComponentReplaceText, setSearchComponentReplaceText] = useState(''); const [searchComponentRemoveText, setSearchComponentRemoveText] = useState(''); const [selectedCell, setSelectedCell] = useState(cell.name || ''); + const [selectedCam, setSelectedCam] = useState(gear[CAMERA] || ''); + const [selectedRad, setSelectedRad] = useState(gear[RADIO] || ''); + const [selectedAct, setSelectedAct] = useState(gear[ACTUATOR] || ''); + const [selectedDiag, setSelectedDiag] = useState( + gear[DIAGNOSIS] || '', + ); + const [selectedComm, setSelectedComm] = useState(gear[COMMS] || ''); + const [selectedArm, setSelectedArm] = useState(gear[ARMOUR] || ''); + const [tab, setTab] = useState(0); const cell_options = Object.keys(cells) as Array; + const cam_options = Object.keys(cams) as Array; + const rad_options = Object.keys(rads) as Array; + const act_options = Object.keys(acts) as Array; + const diag_options = Object.keys(diags) as Array; + const comm_options = Object.keys(comms) as Array; + const arm_options = Object.keys(arms) as Array; + const tabs: React.JSX.Element[] = []; + + tabs[0] = ( + + ); + tabs[1] = ( + + ); + tabs[2] = ; + + const componentLookup: Lookup[] = []; + + componentLookup[ACTUATOR] = { + path: acts[selectedAct]?.path, + selected: selectedAct, + active: gear[ACTUATOR] || undefined, + }; + componentLookup[RADIO] = { + path: rads[selectedRad]?.path, + selected: selectedRad, + active: gear[RADIO] || undefined, + }; + componentLookup[POWERCELL] = { + path: cells[selectedCell]?.path, + selected: selectedCell, + active: cell.name || undefined, + }; + componentLookup[CAMERA] = { + path: cams[selectedCam]?.path, + selected: selectedCam, + active: gear[CAMERA] || undefined, + }; + + componentLookup[DIAGNOSIS] = { + path: diags[selectedDiag]?.path, + selected: selectedDiag, + active: gear[DIAGNOSIS] || undefined, + }; + + componentLookup[COMMS] = { + path: comms[selectedComm]?.path, + selected: selectedComm, + active: gear[COMMS] || undefined, + }; + + componentLookup[ARMOUR] = { + path: arms[selectedArm]?.path, + selected: selectedArm, + active: gear[ARMOUR] || undefined, + }; return ( <> {!target.active && } @@ -48,13 +157,11 @@ export const ModifyRobotComponent = (props: { action="add_component" buttonColor="green" buttonIcon="arrows-spin" - celltype={cells[selectedCell]?.path} - selected_cell={selectedCell} - cell={cell.name || undefined} + componentLookup={componentLookup} /> - - + + -
- Current cell:{' '} - {cell.name ? ( - capitalize(cell.name) - ) : ( - - No cell installed! - - )} - toFixed(value, 2)} - disabled={!cell.charge} - minValue={0} - maxValue={100} - value={((cell.charge || 0) / (cell.maxcharge || 1)) * 100} - onChange={(e, value) => - act('adjust_cell_charge', { - charge: (value / 100) * (cell.maxcharge || 0), - }) - } - > - - Current charge - - {cell.charge} - - - - - - Charge State: {cells[selectedCell]?.charge} /{' '} - {cells[selectedCell]?.max_charge} - - - Charge Rate: {cells[selectedCell]?.charge_amount} - - - Self Charge:{' '} - {cells[selectedCell]?.self_charge ? 'Yes' : 'No'} - - -
-
- - {target.components.map((component, i) => { - return ( - - - act('adjust_brute', { - component: component.ref, - damage: value, - }) - } - > - - Brute damage - - {component.brute_damage} - - - - act('adjust_electronics', { - component: component.ref, - damage: value, - }) - } - > - - Electronics damage - - - {component.electronics_damage} - - - - - ); - })} - -
+ + setTab(0)}> + Power Cell + + setTab(1)}> + Components + + setTab(2)}> + Badmin + +
+ {tabs[tab]}
@@ -193,9 +213,7 @@ const ComponentSection = (props: { action: string; buttonColor: string; buttonIcon: string; - celltype?: string; - selected_cell?: string; - cell?: string; + componentLookup?: Lookup[]; }) => { const { act } = useBackend(); const { @@ -206,9 +224,7 @@ const ComponentSection = (props: { action, buttonColor, buttonIcon, - celltype, - selected_cell, - cell, + componentLookup = [], } = props; return (
@@ -229,15 +245,20 @@ const ComponentSection = (props: { tooltip={getComponentTooltip( component, action, - selected_cell, - cell, + componentLookup[component.name]?.selected, + componentLookup[component.name]?.active, )} color={getComponentColor(component, action)} - disabled={checkDisabled(component, action, selected_cell, cell)} + disabled={checkDisabled( + component, + action, + componentLookup[component.name]?.selected, + componentLookup[component.name]?.active, + )} onClick={() => act(action, { component: component.ref, - cell: celltype, + new_part: componentLookup[component.name]?.path, }) } > @@ -259,6 +280,16 @@ const ComponentSection = (props: { + {action === 'add_component' && ( + + Idle Power: {component.idle_usage} + + + Active Power: {component.active_usage} + + + )} + {action === 'add_component' && 'Brute Damage: ' + component.brute_damage} @@ -279,19 +310,14 @@ const ComponentSection = (props: { function checkDisabled( component: Component, action: string, - selected_cell: string | undefined, - cell: string | undefined, + selected: string | undefined, + active: string | undefined, ): boolean { switch (action) { case 'rem_component': return !component.exists; case 'add_component': - if ( - selected_cell && - cell && - component.name === 'power cell' && - selected_cell !== cell - ) { + if (selected && active && selected !== active) { return false; } return ( @@ -307,8 +333,8 @@ function checkDisabled( function getComponentTooltip( component: Component, action: string, - selected_cell: string | undefined, - cell: string | undefined, + selected: string | undefined, + active: string | undefined, ): string { switch (action) { case 'add_component': @@ -322,7 +348,7 @@ function getComponentTooltip( ) { return 'Component destroyed!'; } - if (checkDisabled(component, action, selected_cell, cell)) { + if (checkDisabled(component, action, selected, active)) { return 'Disabled due to fully intact component!'; } return ''; diff --git a/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotComponentTabs.tsx b/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotComponentTabs.tsx new file mode 100644 index 0000000000..a55cbff157 --- /dev/null +++ b/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotComponentTabs.tsx @@ -0,0 +1,247 @@ +import { toFixed } from 'common/math'; +import { capitalize } from 'common/string'; +import { useBackend } from 'tgui/backend'; +import { + Box, + Collapsible, + Dropdown, + Flex, + Section, + Slider, + Stack, +} from 'tgui/components'; + +import { Cell, Comp, InstalledCell, Target } from '../types'; + +export const CellCommp = (props: { + cell: InstalledCell; + selectedCell: string; + cell_options: string[]; + onSelectedCell: (value: any) => void; + cells: Record; +}) => { + const { act } = useBackend(); + const { cell, selectedCell, cell_options, onSelectedCell, cells } = props; + return ( +
+ Current cell:{' '} + {cell.name ? ( + capitalize(cell.name) + ) : ( + + No cell installed! + + )} + toFixed(value, 2)} + disabled={!cell.charge} + minValue={0} + maxValue={100} + value={((cell.charge || 0) / (cell.maxcharge || 1)) * 100} + onChange={(e, value) => + act('adjust_cell_charge', { + charge: (value / 100) * (cell.maxcharge || 0), + }) + } + > + + Current charge + + {cell.charge} + + + + + Max Damage: {cells[selectedCell]?.max_damage} + + Charge State: {cells[selectedCell]?.charge} /{' '} + {cells[selectedCell]?.max_charge} + + + Charge Rate: {cells[selectedCell]?.charge_amount} + + + Self Charge: {cells[selectedCell]?.self_charge ? 'Yes' : 'No'} + + +
+ ); +}; + +export const CompTab = (props: { + selectedAct: string; + act_options: string[]; + onSelectedAct: (value: any) => void; + acts: Record; + selectedRad: string; + rad_options: string[]; + onSelectedRad: (value: any) => void; + rads: Record; + selectedDiag: string; + diag_options: string[]; + onSelectedDiag: (value: any) => void; + diags: Record; + selectedCam: string; + cam_options: string[]; + onSelectedCam: (value: any) => void; + cams: Record; + selectedComm: string; + comm_options: string[]; + onSelectedComm: (value: any) => void; + comms: Record; + selectedArm: string; + arm_options: string[]; + onSelectedArm: (value: any) => void; + arms: Record; +}) => { + const { + selectedAct, + act_options, + onSelectedAct, + acts, + selectedRad, + rad_options, + onSelectedRad, + rads, + selectedDiag, + diag_options, + onSelectedDiag, + diags, + selectedCam, + cam_options, + onSelectedCam, + cams, + selectedComm, + comm_options, + onSelectedComm, + comms, + selectedArm, + arm_options, + onSelectedArm, + arms, + } = props; + return ( +
+ + + + + + + + + + + + +
+ ); +}; + +export const BadminTab = (props: { target: Target }) => { + const { act } = useBackend(); + const { target } = props; + return ( +
+ + {target.components.map((component, i) => { + return ( + + + act('adjust_brute', { + component: component.ref, + damage: value, + }) + } + > + + Brute damage + + {component.brute_damage} + + + + act('adjust_electronics', { + component: component.ref, + damage: value, + }) + } + > + + Electronics damage + + {component.electronics_damage} + + + + ); + })} + +
+ ); +}; + +const ComponentInfo = (props: { comps: Comp }) => { + const { comps } = props; + return ( + + Max Damage: {comps?.max_damage} + + + Idle Power: {comps?.idle_usage} + + Active Power: {comps?.active_usage} + + + + ); +}; diff --git a/tgui/packages/tgui/interfaces/ModifyRobot/constants.ts b/tgui/packages/tgui/interfaces/ModifyRobot/constants.ts index ab554eb3c3..57d39b74eb 100644 --- a/tgui/packages/tgui/interfaces/ModifyRobot/constants.ts +++ b/tgui/packages/tgui/interfaces/ModifyRobot/constants.ts @@ -4,3 +4,11 @@ export const install2col = { 1: 'green', 2: 'grey', }; + +export const ACTUATOR = 'actuator'; +export const RADIO = 'radio'; +export const POWERCELL = 'power cell'; +export const DIAGNOSIS = 'self-diagnosis unit'; +export const CAMERA = 'camera'; +export const COMMS = 'binary communication device'; +export const ARMOUR = 'armour plating'; diff --git a/tgui/packages/tgui/interfaces/ModifyRobot/index.tsx b/tgui/packages/tgui/interfaces/ModifyRobot/index.tsx index 253f599656..212912520f 100644 --- a/tgui/packages/tgui/interfaces/ModifyRobot/index.tsx +++ b/tgui/packages/tgui/interfaces/ModifyRobot/index.tsx @@ -57,6 +57,13 @@ export const ModifyRobot = (props) => { channel, channels, law_sets, + camera_options, + radio_options, + actuator_options, + diagnosis_options, + comms_options, + armour_options, + current_gear, } = data; const [tab, setTab] = useState(0); @@ -82,7 +89,18 @@ export const ModifyRobot = (props) => { tabs[2] = ; tabs[3] = ; tabs[4] = ( - + ); tabs[5] = ( ; + camera_options: Record; + radio_options: Record; + actuator_options: Record; + diagnosis_options: Record; + comms_options: Record; + armour_options: Record; + current_gear: Record; id_icon: string; access_options: Access[] | undefined; ion_law_nr: string; @@ -85,6 +92,8 @@ export type Component = { brute_damage: number; electronics_damage: number; max_damage: number; + idle_usage: number; + active_usage: number; installed: number; exists: BooleanLike; }; @@ -115,10 +124,24 @@ export type Cell = { max_charge: number; charge_amount: number; self_charge: BooleanLike; + max_damage: number; }; +export type Comp = { + path: string; + max_damage: number; + idle_usage: number; + active_usage: number; +} | null; + export type Access = { id: number; name: string }; +export type Lookup = { + path: string; + selected: string | undefined; + active: string | undefined; +}; + type law_pack = { name: string; header: string; From 4b7cdb86c4897822773a6d4cb092d9f12ca69649 Mon Sep 17 00:00:00 2001 From: SatinIsle <98125273+SatinIsle@users.noreply.github.com> Date: Mon, 4 Nov 2024 20:20:53 +0000 Subject: [PATCH 13/36] Emergency door release (#16559) Added an extra button to all station dorms, an emergency door release. This can be pulled by the occupants to immediately unbolt and open the door even if it is unpowered. Why we need this: During deadshifts, it's somewhat common for players to go and scene in a dorm and lock the door. Then if the power goes out, they generally need to ahelp to get out, because they'll have bolted themselves in. Obviously there are a few ways to solve this, such as special doors, making the room always powered or making a variation of the lock itself that doesn't use power. However, I felt that having an extra lever allows people to keep whatever vibe they want as for power in their scenes, has a cool vibe itself, and I also have plans for how I can use this specifically in events. --- code/game/machinery/door_control.dm | 20 ++++++++++ icons/obj/door_release.dmi | Bin 0 -> 787 bytes maps/groundbase/gb-z2.dmm | 46 ++++++++++++++++++++++ maps/stellar_delight/stellar_delight1.dmm | 44 +++++++++++++++++++++ maps/tether/tether-01-surface1.dmm | 40 +++++++++++++++++++ 5 files changed, 150 insertions(+) create mode 100644 icons/obj/door_release.dmi diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm index 23e19a54a0..0c29400e73 100644 --- a/code/game/machinery/door_control.dm +++ b/code/game/machinery/door_control.dm @@ -221,3 +221,23 @@ spawn(0) if(SG?.anchored) SG.toggle() + +/obj/machinery/button/remote/airlock/release + icon = 'icons/obj/door_release.dmi' + name = "emergency door release" + desc = "Forces the opening of doors in an emergency, regardless of whether they're powered." + + use_power = USE_POWER_OFF + idle_power_usage = 0 + active_power_usage = 0 + +/obj/machinery/button/remote/airlock/release/trigger() + for(var/obj/machinery/door/airlock/D in machines) + if(D.id_tag == id) + if(D.locked) + D.unlock(1) + if(D.density) + D.open(1) + +/obj/machinery/button/remote/airlock/release/powered() + return 1 //Is always able to be used diff --git a/icons/obj/door_release.dmi b/icons/obj/door_release.dmi new file mode 100644 index 0000000000000000000000000000000000000000..669aa390b0b80110fa11376ad092fad123b63d0e GIT binary patch literal 787 zcmV+u1MK{XP)005u_0{{R3dEt5<0000gP)t-sz`(%F z05h=&Gwne^GygL^Jw4brH!LhHAvqiX006+i!2ka<0094H004_vdH?_b00DGTPE!Ct z=GbNc005MFR9JLGWpiV4X>fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM z;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3K9+B|pC?xuht^K#7YpC9|j)q>+m=ttc@! z6~s2gRB1@GN+Vnet*7Mx00H+&L_t(&f$f<=O2beTMUw>x)?yKKAT1r)P7Lh^1Q(zPomUECXM$Nl zz`5W;9Jl}no#;S1cQ4XT+V`%$*Ovqpy=V4AbMt@lOAa?lLI^3(PW!N0K%=oO#?34i zsLzLh=1D9NCa`-U540xh%A@Il)rg!0(~F6eqN2SUj%#~oUR2P z&0O2^eQ^4?8uw<4-)dNd;ofUm&!ts R{U-nb002ovPDHLkV1iv_Vy*xH literal 0 HcmV?d00001 diff --git a/maps/groundbase/gb-z2.dmm b/maps/groundbase/gb-z2.dmm index e3d7326b77..537bcba1d8 100644 --- a/maps/groundbase/gb-z2.dmm +++ b/maps/groundbase/gb-z2.dmm @@ -2120,6 +2120,12 @@ icon_state = "2-8" }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/button/remote/airlock/release{ + dir = 8; + pixel_y = -7; + pixel_x = 27; + id = "dorm5" + }, /turf/simulated/floor/wood, /area/groundbase/dorms/room5) "fn" = ( @@ -2641,6 +2647,12 @@ icon_state = "2-4" }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/button/remote/airlock/release{ + dir = 4; + pixel_y = -7; + pixel_x = -27; + id = "dorm4" + }, /turf/simulated/floor/wood, /area/groundbase/dorms/room4) "gQ" = ( @@ -6090,6 +6102,12 @@ icon_state = "2-4" }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/button/remote/airlock/release{ + dir = 4; + pixel_y = -7; + pixel_x = -27; + id = "dorm6" + }, /turf/simulated/floor/wood, /area/groundbase/dorms/room6) "qG" = ( @@ -7288,6 +7306,12 @@ icon_state = "2-8" }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/button/remote/airlock/release{ + dir = 8; + pixel_y = -7; + pixel_x = 27; + id = "dorm3" + }, /turf/simulated/floor/wood, /area/groundbase/dorms/room3) "uf" = ( @@ -13390,6 +13414,11 @@ /obj/structure/bed/chair/sofa/corp/left{ dir = 4 }, +/obj/machinery/button/remote/airlock/release{ + pixel_y = 27; + pixel_x = 7; + id = "dorm8" + }, /turf/simulated/floor/wood, /area/groundbase/dorms/room8) "Lu" = ( @@ -15037,6 +15066,12 @@ /obj/structure/bed/chair/sofa/corp/left{ dir = 8 }, +/obj/machinery/button/remote/airlock/release{ + dir = 8; + pixel_y = -7; + pixel_x = 27; + id = "dorm1" + }, /turf/simulated/floor/wood, /area/groundbase/dorms/room1) "PU" = ( @@ -15368,6 +15403,11 @@ /obj/structure/bed/chair/sofa/corp/right{ dir = 8 }, +/obj/machinery/button/remote/airlock/release{ + pixel_y = 27; + pixel_x = -7; + id = "dorm7" + }, /turf/simulated/floor/wood, /area/groundbase/dorms/room7) "QP" = ( @@ -16945,6 +16985,12 @@ /obj/structure/bed/chair/sofa/corp/right{ dir = 4 }, +/obj/machinery/button/remote/airlock/release{ + dir = 4; + pixel_y = -7; + pixel_x = -27; + id = "dorm2" + }, /turf/simulated/floor/wood, /area/groundbase/dorms/room2) "Vz" = ( diff --git a/maps/stellar_delight/stellar_delight1.dmm b/maps/stellar_delight/stellar_delight1.dmm index b6a140ba19..10c6715388 100644 --- a/maps/stellar_delight/stellar_delight1.dmm +++ b/maps/stellar_delight/stellar_delight1.dmm @@ -7207,6 +7207,12 @@ /obj/structure/closet/crate/bin{ anchored = 1 }, +/obj/machinery/button/remote/airlock/release{ + pixel_y = -22; + pixel_x = 6; + dir = 1; + id = "dorm4" + }, /turf/simulated/floor/carpet, /area/stellardelight/deck1/dorms/dorm4) "oB" = ( @@ -7545,6 +7551,12 @@ /obj/structure/closet/crate/bin{ anchored = 1 }, +/obj/machinery/button/remote/airlock/release{ + pixel_y = -22; + pixel_x = -8; + dir = 1; + id = "dorm6" + }, /turf/simulated/floor/carpet/purcarpet, /area/stellardelight/deck1/dorms/dorm6) "pn" = ( @@ -8799,6 +8811,11 @@ /obj/structure/closet/crate/bin{ anchored = 1 }, +/obj/machinery/button/remote/airlock/release{ + pixel_y = 24; + pixel_x = -7; + id = "dorm8" + }, /turf/simulated/floor/carpet, /area/stellardelight/deck1/dorms/dorm8) "rX" = ( @@ -16042,6 +16059,11 @@ /obj/structure/closet/crate/bin{ anchored = 1 }, +/obj/machinery/button/remote/airlock/release{ + pixel_y = 24; + pixel_x = 7; + id = "dorm1" + }, /turf/simulated/floor/carpet, /area/stellardelight/deck1/dorms/dorm1) "HY" = ( @@ -21133,6 +21155,12 @@ /obj/structure/closet/crate/bin{ anchored = 1 }, +/obj/machinery/button/remote/airlock/release{ + pixel_y = -22; + pixel_x = 6; + dir = 1; + id = "dorm3" + }, /turf/simulated/floor/carpet/purcarpet, /area/stellardelight/deck1/dorms/dorm3) "SQ" = ( @@ -22475,6 +22503,11 @@ /obj/structure/closet/crate/bin{ anchored = 1 }, +/obj/machinery/button/remote/airlock/release{ + pixel_y = 24; + pixel_x = -7; + id = "dorm7" + }, /turf/simulated/floor/carpet/purcarpet, /area/stellardelight/deck1/dorms/dorm7) "Vw" = ( @@ -22760,6 +22793,11 @@ /obj/structure/closet/crate/bin{ anchored = 1 }, +/obj/machinery/button/remote/airlock/release{ + pixel_y = 24; + pixel_x = 7; + id = "dorm2" + }, /turf/simulated/floor/carpet/purcarpet, /area/stellardelight/deck1/dorms/dorm2) "Wb" = ( @@ -23885,6 +23923,12 @@ /obj/structure/closet/crate/bin{ anchored = 1 }, +/obj/machinery/button/remote/airlock/release{ + pixel_y = -22; + pixel_x = -8; + dir = 1; + id = "dorm5" + }, /turf/simulated/floor/carpet, /area/stellardelight/deck1/dorms/dorm5) "Yt" = ( diff --git a/maps/tether/tether-01-surface1.dmm b/maps/tether/tether-01-surface1.dmm index 2e93b90624..413088b4ad 100644 --- a/maps/tether/tether-01-surface1.dmm +++ b/maps/tether/tether-01-surface1.dmm @@ -22258,6 +22258,11 @@ /obj/structure/cable/orange{ icon_state = "1-2" }, +/obj/machinery/button/remote/airlock/release{ + pixel_y = -4; + pixel_x = 33; + id = "dorm7" + }, /turf/simulated/floor/wood, /area/crew_quarters/sleep/Dorm_7) "aMA" = ( @@ -22326,6 +22331,11 @@ pixel_y = -4; specialfunctions = 4 }, +/obj/machinery/button/remote/airlock/release{ + pixel_y = -4; + pixel_x = -33; + id = "dorm8" + }, /turf/simulated/floor/wood, /area/crew_quarters/sleep/Dorm_8) "aMD" = ( @@ -23381,6 +23391,11 @@ /obj/structure/cable/orange{ icon_state = "1-2" }, +/obj/machinery/button/remote/airlock/release{ + pixel_y = -4; + pixel_x = 33; + id = "dorm5" + }, /turf/simulated/floor/wood, /area/crew_quarters/sleep/Dorm_5) "aOI" = ( @@ -23445,6 +23460,11 @@ pixel_y = -4; specialfunctions = 4 }, +/obj/machinery/button/remote/airlock/release{ + pixel_y = -4; + pixel_x = -33; + id = "dorm6" + }, /turf/simulated/floor/wood, /area/crew_quarters/sleep/Dorm_6) "aOL" = ( @@ -24537,6 +24557,11 @@ /obj/structure/cable/orange{ icon_state = "1-2" }, +/obj/machinery/button/remote/airlock/release{ + pixel_y = -4; + pixel_x = 33; + id = "dorm3" + }, /turf/simulated/floor/wood, /area/crew_quarters/sleep/Dorm_3) "aQI" = ( @@ -24605,6 +24630,11 @@ pixel_y = -4; specialfunctions = 4 }, +/obj/machinery/button/remote/airlock/release{ + pixel_y = -4; + pixel_x = -33; + id = "dorm4" + }, /turf/simulated/floor/wood, /area/crew_quarters/sleep/Dorm_4) "aQL" = ( @@ -25617,6 +25647,11 @@ /obj/structure/cable/orange{ icon_state = "1-2" }, +/obj/machinery/button/remote/airlock/release{ + pixel_y = -4; + pixel_x = 33; + id = "dorm1" + }, /turf/simulated/floor/wood, /area/crew_quarters/sleep/Dorm_1) "aSV" = ( @@ -25627,6 +25662,11 @@ pixel_y = -4; specialfunctions = 4 }, +/obj/machinery/button/remote/airlock/release{ + pixel_y = -4; + pixel_x = -33; + id = "dorm2" + }, /turf/simulated/floor/wood, /area/crew_quarters/sleep/Dorm_2) "aSW" = ( From c316e6513d26b01aa232f002e9843b132d02c203 Mon Sep 17 00:00:00 2001 From: tesseracting Date: Mon, 4 Nov 2024 21:43:39 +0000 Subject: [PATCH 14/36] digi footwrap fix (#16554) adds missing sprite for digi footwraps --- icons/inventory/feet/mob_digi.dmi | Bin 41675 -> 41489 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/inventory/feet/mob_digi.dmi b/icons/inventory/feet/mob_digi.dmi index 71cecdb2cd64f8aec3c5a77197e877209a21bba9..04d2fa870d1037e78f6304460374a40c69fde70b 100644 GIT binary patch literal 41489 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 L^Jg2J0`L3>Oh9Uz From 5854cf834abbed87f52d486d3e2a58e102e10d4b Mon Sep 17 00:00:00 2001 From: Kashargul <144968721+Kashargul@users.noreply.github.com> Date: Mon, 4 Nov 2024 22:45:30 +0100 Subject: [PATCH 15/36] fix the vorepanel (#16565) --- .../tgui/interfaces/VorePanel/VoreInsidePanel.tsx | 8 ++++---- tgui/packages/tgui/interfaces/VorePanel/index.tsx | 2 +- tgui/packages/tgui/interfaces/VorePanel/types.ts | 12 ++++++------ 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/tgui/packages/tgui/interfaces/VorePanel/VoreInsidePanel.tsx b/tgui/packages/tgui/interfaces/VorePanel/VoreInsidePanel.tsx index b5bba05f06..e3d68dda7c 100644 --- a/tgui/packages/tgui/interfaces/VorePanel/VoreInsidePanel.tsx +++ b/tgui/packages/tgui/interfaces/VorePanel/VoreInsidePanel.tsx @@ -36,15 +36,15 @@ export const VoreInsidePanel = (props: { and you are   - - {digestModeToPreyMode[belly_mode]} + + {digestModeToPreyMode[belly_mode!]}   {desc} - {(contents.length && ( + {(contents!.length && ( diff --git a/tgui/packages/tgui/interfaces/VorePanel/index.tsx b/tgui/packages/tgui/interfaces/VorePanel/index.tsx index 9cf7a76a6b..e0b865d172 100644 --- a/tgui/packages/tgui/interfaces/VorePanel/index.tsx +++ b/tgui/packages/tgui/interfaces/VorePanel/index.tsx @@ -66,7 +66,7 @@ export const VorePanel = (props) => { )) || ''} - 500 ? '30%' : '20%'}> + 500 ? '30%' : '20%'}> diff --git a/tgui/packages/tgui/interfaces/VorePanel/types.ts b/tgui/packages/tgui/interfaces/VorePanel/types.ts index 85cae957e5..a0c6dd3143 100644 --- a/tgui/packages/tgui/interfaces/VorePanel/types.ts +++ b/tgui/packages/tgui/interfaces/VorePanel/types.ts @@ -25,12 +25,12 @@ export type hostMob = { export type insideData = { absorbed: BooleanLike; - belly_name: string; - belly_mode: string; - desc: string; - pred: string; - ref: string; - contents: contentData[]; + belly_name?: string; + belly_mode?: string; + desc?: string; + pred?: string; + ref?: string; + contents?: contentData[]; }; export type contentData = { From 2bc9005f63ad211a18aa0c3cbafe25ba8fa7285e Mon Sep 17 00:00:00 2001 From: Kashargul <144968721+Kashargul@users.noreply.github.com> Date: Tue, 5 Nov 2024 12:25:37 +0100 Subject: [PATCH 16/36] migrate power cells to initialize (#16567) * migrate power cells to initialize * forgot the dme --- code/modules/power/cell.dm | 7 ++- code/modules/power/cells/device_cells.dm | 50 ++++++++++------- code/modules/power/cells/device_cells_vr.dm | 53 ------------------ code/modules/power/cells/esoteric_cells.dm | 1 + code/modules/power/cells/power_cells.dm | 60 ++++++++++++++++----- vorestation.dme | 1 - 6 files changed, 81 insertions(+), 91 deletions(-) delete mode 100644 code/modules/power/cells/device_cells_vr.dm diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index e963b54849..5379ab7f42 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -18,7 +18,7 @@ var/emp_proof = FALSE var/static/cell_uid = 1 // Unique ID of this power cell. Used to reduce bunch of uglier code in nanoUI. var/c_uid - var/charge = 0 // note %age conveted to actual charge in New + var/charge = 1000 // maximum charge on spawn var/maxcharge = 1000 var/rigged = 0 // true if rigged to explode var/minor_fault = 0 //If not 100% reliable, it will build up faults. @@ -36,10 +36,9 @@ var/standard_overlays = TRUE var/last_overlay_state = null // Used to optimize update_icon() calls. -/obj/item/cell/New() - ..() +/obj/item/cell/Initialize() + . = ..() c_uid = cell_uid++ - charge = maxcharge update_icon() if(self_recharge) START_PROCESSING(SSobj, src) diff --git a/code/modules/power/cells/device_cells.dm b/code/modules/power/cells/device_cells.dm index fd93e450f1..4179cf6c2d 100644 --- a/code/modules/power/cells/device_cells.dm +++ b/code/modules/power/cells/device_cells.dm @@ -10,15 +10,14 @@ force = 0 throw_speed = 5 throw_range = 7 + charge = 480 maxcharge = 480 charge_amount = 5 matter = list(MAT_STEEL = 350, MAT_GLASS = 50) preserve_item = 1 -/obj/item/cell/device/empty/Initialize() - . = ..() +/obj/item/cell/device/empty charge = 0 - update_icon() /* * Crap Device @@ -29,16 +28,15 @@ description_fluff = "You can't top the rust top." //TOTALLY TRADEMARK INFRINGEMENT origin_tech = list(TECH_POWER = 0) icon_state = "device_crap" + charge = 240 maxcharge = 240 matter = list(MAT_STEEL = 350, MAT_GLASS = 30) /obj/item/cell/device/crap/update_icon() //No visible charge indicator return -/obj/item/cell/device/crap/empty/Initialize() - . = ..() +/obj/item/cell/device/crap/empty charge = 0 - update_icon() /* * Hyper Device @@ -47,13 +45,12 @@ name = "hyper device power cell" desc = "A small power cell designed to power handheld devices. Has a better charge than a standard device cell." icon_state = "hype_device_cell" + charge = 600 maxcharge = 600 matter = list(MAT_STEEL = 400, MAT_GLASS = 60) -/obj/item/cell/device/hyper/empty/Initialize() - . = ..() +/obj/item/cell/device/hyper/empty charge = 0 - update_icon() /* * EMP Proof Device @@ -65,10 +62,8 @@ matter = list(MAT_STEEL = 400, MAT_GLASS = 60) emp_proof = TRUE -/obj/item/cell/device/empproof/empty/Initialize() - . = ..() +/obj/item/cell/device/empproof/empty charge = 0 - update_icon() /* * Weapon @@ -77,13 +72,12 @@ name = "weapon power cell" desc = "A small power cell designed to power handheld weaponry." icon_state = "weapon_cell" + charge = 2400 maxcharge = 2400 charge_amount = 20 -/obj/item/cell/device/weapon/empty/Initialize() - . = ..() +/obj/item/cell/device/weapon/empty charge = 0 - update_icon() /* * EMP Proof Weapon @@ -95,10 +89,8 @@ matter = list(MAT_STEEL = 400, MAT_GLASS = 60) emp_proof = TRUE -/obj/item/cell/device/weapon/empproof/empty/Initialize() - . = ..() +/obj/item/cell/device/weapon/empproof/empty charge = 0 - update_icon() /* * Self-charging Weapon @@ -139,7 +131,7 @@ value = CATALOGUER_REWARD_EASY /obj/item/cell/device/weapon/recharge/alien - name = "void cell" + name = "void cell (device)" desc = "An alien technology that produces energy seemingly out of nowhere. Its small, cylinderal shape means it might be able to be used with human technology, perhaps?" catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_void_cell) icon = 'icons/obj/abductor.dmi' @@ -147,6 +139,24 @@ charge_amount = 120 // 5%. charge_delay = 50 // Every five seconds, bit faster than the default. origin_tech = list(TECH_POWER = 8, TECH_ENGINEERING = 6) + var/swaps_to = /obj/item/cell/void + standard_overlays = FALSE /obj/item/cell/device/weapon/recharge/alien/update_icon() - return // No overlays please. \ No newline at end of file + return // No overlays please. + +/obj/item/cell/device/weapon/recharge/alien/attack_self(var/mob/user) + user.remove_from_mob(src) + to_chat(user, span_notice("You swap [src] to 'machinery cell' mode.")) + var/obj/item/cell/newcell = new swaps_to(null) + user.put_in_active_hand(newcell) + var/percentage = charge/maxcharge + newcell.charge = newcell.maxcharge * percentage + newcell.persist_storable = persist_storable + qdel(src) + +// Bloo friendlier hybrid tech +/obj/item/cell/device/weapon/recharge/alien/hybrid + icon = 'icons/obj/power_vr.dmi' + icon_state = "cellb" + swaps_to = /obj/item/cell/void/hybrid diff --git a/code/modules/power/cells/device_cells_vr.dm b/code/modules/power/cells/device_cells_vr.dm deleted file mode 100644 index 8a62f646aa..0000000000 --- a/code/modules/power/cells/device_cells_vr.dm +++ /dev/null @@ -1,53 +0,0 @@ - -//The device cell -/obj/item/cell/device/weapon/recharge/alien - name = "void cell (device)" - var/swaps_to = /obj/item/cell/void - standard_overlays = FALSE - -/obj/item/cell/device/weapon/recharge/alien/attack_self(var/mob/user) - user.remove_from_mob(src) - to_chat(user, span_notice("You swap [src] to 'machinery cell' mode.")) - var/obj/item/cell/newcell = new swaps_to(null) - user.put_in_active_hand(newcell) - var/percentage = charge/maxcharge - newcell.charge = newcell.maxcharge * percentage - newcell.persist_storable = persist_storable - qdel(src) - -//The machine cell -/obj/item/cell/void - name = "void cell (machinery)" - desc = "An alien technology that produces energy seemingly out of nowhere. Its small, cylinderal shape means it might be able to be used with human technology, perhaps?" - origin_tech = list(TECH_POWER = 8, TECH_ENGINEERING = 6) - icon = 'icons/obj/abductor.dmi' - icon_state = "cell" - maxcharge = 4800 //10x the device version - charge_amount = 1200 //10x the device version - self_recharge = TRUE - charge_delay = 50 - matter = null - standard_overlays = FALSE - var/swaps_to = /obj/item/cell/device/weapon/recharge/alien - robot_durability = 100 - -/obj/item/cell/void/attack_self(var/mob/user) - user.remove_from_mob(src) - to_chat(user, span_notice("You swap [src] to 'device cell' mode.")) - var/obj/item/cell/newcell = new swaps_to(null) - user.put_in_active_hand(newcell) - var/percentage = charge/maxcharge - newcell.charge = newcell.maxcharge * percentage - newcell.persist_storable = persist_storable - qdel(src) - -// Bloo friendlier hybrid tech -/obj/item/cell/device/weapon/recharge/alien/hybrid - icon = 'icons/obj/power_vr.dmi' - icon_state = "cellb" - swaps_to = /obj/item/cell/void/hybrid - -/obj/item/cell/void/hybrid - icon = 'icons/obj/power_vr.dmi' - icon_state = "cellb" - swaps_to = /obj/item/cell/device/weapon/recharge/alien/hybrid diff --git a/code/modules/power/cells/esoteric_cells.dm b/code/modules/power/cells/esoteric_cells.dm index aeacc6b3e6..925a8f5543 100644 --- a/code/modules/power/cells/esoteric_cells.dm +++ b/code/modules/power/cells/esoteric_cells.dm @@ -4,6 +4,7 @@ desc = "A modified power cell sitting in a highly conductive chassis." origin_tech = list(TECH_POWER = 2) icon_state = "modded" + charge = 10000 maxcharge = 10000 matter = list(MAT_STEEL = 1000, MAT_GLASS = 80, MAT_SILVER = 100) self_recharge = TRUE diff --git a/code/modules/power/cells/power_cells.dm b/code/modules/power/cells/power_cells.dm index f4a7c9d1aa..3722b6832f 100644 --- a/code/modules/power/cells/power_cells.dm +++ b/code/modules/power/cells/power_cells.dm @@ -1,8 +1,7 @@ /* * Empty */ -/obj/item/cell/empty/New() - ..() +/obj/item/cell/empty charge = 0 /* @@ -14,6 +13,7 @@ description_fluff = "You can't top the rust top." //TOTALLY TRADEMARK INFRINGEMENT origin_tech = list(TECH_POWER = 0) icon_state = "crap" + charge = 500 maxcharge = 500 matter = list(MAT_STEEL = 700, MAT_GLASS = 40) robot_durability = 20 @@ -21,8 +21,7 @@ /obj/item/cell/crap/update_icon() //No visible charge indicator return -/obj/item/cell/crap/empty/New() - ..() +/obj/item/cell/crap/empty charge = 0 /* @@ -32,6 +31,7 @@ name = "heavy-duty power cell" origin_tech = list(TECH_POWER = 1) icon_state = "apc" + charge = 5000 maxcharge = 5000 matter = list(MAT_STEEL = 700, MAT_GLASS = 50) @@ -40,6 +40,7 @@ */ /obj/item/cell/robot_station name = "standard robot power cell" + charge = 7500 maxcharge = 7500 /* @@ -49,14 +50,13 @@ name = "high-capacity power cell" origin_tech = list(TECH_POWER = 2) icon_state = "high" + charge = 10000 maxcharge = 10000 matter = list(MAT_STEEL = 700, MAT_GLASS = 60) robot_durability = 55 -/obj/item/cell/high/empty/New() - ..() +/obj/item/cell/high/empty charge = 0 - update_icon() /* * Super @@ -65,14 +65,13 @@ name = "super-capacity power cell" origin_tech = list(TECH_POWER = 5) icon_state = "super" + charge = 20000 maxcharge = 20000 matter = list(MAT_STEEL = 700, MAT_GLASS = 70) robot_durability = 60 -/obj/item/cell/super/empty/New() - ..() +/obj/item/cell/super/empty charge = 0 - update_icon() /* * Syndicate @@ -81,6 +80,7 @@ name = "syndicate robot power cell" description_fluff = "Almost as good as a hyper." icon_state = "super" //We don't want roboticists confuse it with a low standard cell + charge = 25000 maxcharge = 25000 robot_durability = 65 @@ -91,14 +91,13 @@ name = "hyper-capacity power cell" origin_tech = list(TECH_POWER = 6) icon_state = "hyper" + charge = 30000 maxcharge = 30000 matter = list(MAT_STEEL = 700, MAT_GLASS = 80) robot_durability = 70 -/obj/item/cell/hyper/empty/New() - ..() +/obj/item/cell/hyper/empty charge = 0 - update_icon() /* * Mecha @@ -146,6 +145,7 @@ name = "infinite-capacity power cell!" icon_state = "infinity" origin_tech = null + charge = 30000 maxcharge = 30000 //determines how badly mobs get shocked matter = list(MAT_STEEL = 700, MAT_GLASS = 80) robot_durability = 200 @@ -180,6 +180,7 @@ icon_state = "yellow slime extract" //"potato_battery" connector_type = "slime" description_info = "This 'cell' holds a max charge of 10k and self recharges over time." + charge = 10000 maxcharge = 10000 matter = null self_recharge = TRUE @@ -191,6 +192,7 @@ /obj/item/cell/emergency_light name = "miniature power cell" desc = "A tiny power cell with a very low power capacity. Used in light fixtures to power them in the event of an outage." + charge = 120 maxcharge = 120 //Emergency lights use 0.2 W per tick, meaning ~10 minutes of emergency power from a cell matter = list(MAT_GLASS = 20) icon_state = "em_light" @@ -247,3 +249,35 @@ cut_overlays() target.adjust_nutrition(amount) user.custom_emote(message = "connects \the [src] to [user == target ? "their" : "[target]'s"] charging port, expending it.") + +//The machine cell +/obj/item/cell/void + name = "void cell (machinery)" + desc = "An alien technology that produces energy seemingly out of nowhere. Its small, cylinderal shape means it might be able to be used with human technology, perhaps?" + origin_tech = list(TECH_POWER = 8, TECH_ENGINEERING = 6) + icon = 'icons/obj/abductor.dmi' + icon_state = "cell" + charge = 4800 + maxcharge = 4800 //10x the device version + charge_amount = 1200 //10x the device version + self_recharge = TRUE + charge_delay = 50 + matter = null + standard_overlays = FALSE + var/swaps_to = /obj/item/cell/device/weapon/recharge/alien + robot_durability = 100 + +/obj/item/cell/void/attack_self(var/mob/user) + user.remove_from_mob(src) + to_chat(user, span_notice("You swap [src] to 'device cell' mode.")) + var/obj/item/cell/newcell = new swaps_to(null) + user.put_in_active_hand(newcell) + var/percentage = charge/maxcharge + newcell.charge = newcell.maxcharge * percentage + newcell.persist_storable = persist_storable + qdel(src) + +/obj/item/cell/void/hybrid + icon = 'icons/obj/power_vr.dmi' + icon_state = "cellb" + swaps_to = /obj/item/cell/device/weapon/recharge/alien/hybrid diff --git a/vorestation.dme b/vorestation.dme index 9b8c8dcb74..da8a2da180 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -3690,7 +3690,6 @@ #include "code\modules\power\antimatter\control.dm" #include "code\modules\power\antimatter\shielding.dm" #include "code\modules\power\cells\device_cells.dm" -#include "code\modules\power\cells\device_cells_vr.dm" #include "code\modules\power\cells\esoteric_cells.dm" #include "code\modules\power\cells\power_cells.dm" #include "code\modules\power\fusion\_setup.dm" From 9077c940c4537b52b902d0db443e97cb4c087f1d Mon Sep 17 00:00:00 2001 From: Guti <32563288+TheCaramelion@users.noreply.github.com> Date: Tue, 5 Nov 2024 12:40:02 +0100 Subject: [PATCH 17/36] Better Viro (#16536) * Better Viro * Quarantine ship * Lazy... * Roanoake prep * Roanoake * Verbs * Verbs + Logging * Virus breath check --- code/__defines/diseases.dm | 30 + code/__defines/math.dm | 6 + code/datums/diseases/_MobProcs.dm | 195 +++++++ code/datums/diseases/_disease.dm | 167 ++++++ code/datums/diseases/advance/advance.dm | 404 ++++++++++++++ .../datums/diseases/advance/disease_preset.dm | 16 + .../diseases/advance/symptoms/choking.dm | 52 ++ .../diseases/advance/symptoms/confusion.dm | 40 ++ .../datums/diseases/advance/symptoms/cough.dm | 39 ++ .../advance/symptoms/damage_converter.dm | 59 ++ .../datums/diseases/advance/symptoms/dizzy.dm | 38 ++ .../datums/diseases/advance/symptoms/fever.dm | 40 ++ code/datums/diseases/advance/symptoms/fire.dm | 56 ++ .../diseases/advance/symptoms/flesh_eating.dm | 42 ++ .../diseases/advance/symptoms/hallucigen.dm | 40 ++ .../diseases/advance/symptoms/headache.dm | 33 ++ code/datums/diseases/advance/symptoms/heal.dm | 150 +++++ .../diseases/advance/symptoms/itching.dm | 33 ++ .../diseases/advance/symptoms/language.dm | 31 ++ .../diseases/advance/symptoms/macrophage.dm | 73 +++ code/datums/diseases/advance/symptoms/mlem.dm | 33 ++ .../advance/symptoms/necrotic_agent.dm | 31 ++ .../diseases/advance/symptoms/oxygen.dm | 37 ++ .../diseases/advance/symptoms/sensory.dm | 63 +++ .../diseases/advance/symptoms/shivering.dm | 39 ++ .../diseases/advance/symptoms/sneeze.dm | 42 ++ code/datums/diseases/advance/symptoms/spin.dm | 40 ++ .../diseases/advance/symptoms/symptoms.dm | 36 ++ .../advance/symptoms/synthetic_infection.dm | 32 ++ .../diseases/advance/symptoms/telepathy.dm | 36 ++ .../datums/diseases/advance/symptoms/viral.dm | 65 +++ .../diseases/advance/symptoms/vision.dm | 50 ++ .../datums/diseases/advance/symptoms/vomit.dm | 34 ++ .../diseases/advance/symptoms/weakness.dm | 43 ++ .../datums/diseases/advance/symptoms/weigh.dm | 37 ++ code/datums/diseases/anxiety.dm | 53 ++ code/datums/diseases/beesease.dm | 36 ++ code/datums/diseases/brainrot.dm | 43 ++ code/datums/diseases/choreomania.dm | 38 ++ code/datums/diseases/cold.dm | 64 +++ code/datums/diseases/cold9.dm | 30 + code/datums/diseases/darkness.dm | 10 + code/datums/diseases/flu.dm | 50 ++ code/datums/diseases/food_poisoning.dm | 67 +++ code/datums/diseases/lycancoughy.dm | 64 +++ code/datums/diseases/magnitis.dm | 63 +++ code/datums/diseases/roanoake.dm | 90 +++ code/datums/supplypacks/medical.dm | 12 +- code/game/atoms.dm | 4 +- code/game/machinery/adv_med.dm | 10 +- code/game/machinery/computer/medical.dm | 6 +- code/game/machinery/pandemic.dm | 377 +++++++++++++ .../effects/decals/Cleanable/humans.dm | 9 +- .../objects/effects/decals/Cleanable/misc.dm | 2 +- .../objects/items/devices/scanners/guide.dm | 8 +- .../objects/items/devices/scanners/health.dm | 14 +- .../circuitboards/computer/computer.dm | 10 +- .../objects/items/weapons/storage/bags.dm | 2 +- .../objects/items/weapons/storage/belt.dm | 1 - .../items/weapons/storage/uplink_kits.dm | 2 +- code/game/turfs/simulated.dm | 2 +- code/modules/admin/admin_verb_lists_vr.dm | 10 +- code/modules/admin/admin_verbs.dm | 31 -- code/modules/admin/view_variables/topic.dm | 12 - code/modules/events/disease_outbreak.dm | 98 ++++ code/modules/food/food/snacks.dm | 1 + .../food/kitchen/smartfridge/medical.dm | 8 +- code/modules/food/recipes_microwave.dm | 8 - .../gamemaster/event2/events/medical/virus.dm | 69 --- code/modules/mob/living/carbon/carbon.dm | 16 +- .../mob/living/carbon/carbon_defines.dm | 3 +- code/modules/mob/living/carbon/human/human.dm | 4 - .../living/carbon/human/human_attackhand.dm | 16 +- code/modules/mob/living/carbon/human/life.dm | 19 +- code/modules/mob/living/carbon/viruses.dm | 48 -- code/modules/mob/living/default_language.dm | 24 +- code/modules/mob/living/life.dm | 4 + .../simple_mob/subtypes/vore/macrophage.dm | 63 +++ code/modules/mob/mob_defines.dm | 3 + code/modules/organs/blood.dm | 31 +- .../reagents/reactions/instant/virology.dm | 133 +++++ .../reagents/reagent_containers/glass.dm | 5 +- .../reagents/reagent_containers/hypospray.dm | 1 - .../reagents/reagent_containers/syringes.dm | 12 +- .../reagents/reagent_containers/virology.dm | 26 + code/modules/reagents/reagents/core.dm | 77 ++- code/modules/reagents/reagents/dispenser.dm | 15 +- code/modules/reagents/reagents/toxins.dm | 12 + code/modules/reagents/reagents/virology.dm | 47 ++ code/modules/virus2/admin.dm | 222 -------- code/modules/virus2/analyser.dm | 73 --- code/modules/virus2/antibodies.dm | 26 - code/modules/virus2/biohazard destroyer.dm | 20 - code/modules/virus2/centrifuge.dm | 208 ------- code/modules/virus2/curer.dm | 105 ---- code/modules/virus2/disease2.dm | 320 ----------- code/modules/virus2/diseasesplicer.dm | 193 ------- code/modules/virus2/dishincubator.dm | 201 ------- code/modules/virus2/effect.dm | 520 ------------------ code/modules/virus2/effect_vr.dm | 63 --- code/modules/virus2/helpers.dm | 181 ------ code/modules/virus2/isolator.dm | 211 ------- code/modules/virus2/items_devices.dm | 114 ---- icons/mob/macrophage.dmi | Bin 0 -> 4509 bytes icons/obj/pandemic.dmi | Bin 0 -> 1380 bytes .../beach/submaps/quarantineshuttle.dmm | 13 +- maps/groundbase/gb-z2.dmm | 34 +- maps/stellar_delight/stellar_delight1.dmm | 15 +- maps/tether/tether-01-surface1.dmm | 32 +- tgui/packages/tgui/interfaces/PanDEMIC.tsx | 315 +++++++++++ vorestation.dme | 65 ++- 111 files changed, 4135 insertions(+), 2821 deletions(-) create mode 100644 code/__defines/diseases.dm create mode 100644 code/datums/diseases/_MobProcs.dm create mode 100644 code/datums/diseases/_disease.dm create mode 100644 code/datums/diseases/advance/advance.dm create mode 100644 code/datums/diseases/advance/disease_preset.dm create mode 100644 code/datums/diseases/advance/symptoms/choking.dm create mode 100644 code/datums/diseases/advance/symptoms/confusion.dm create mode 100644 code/datums/diseases/advance/symptoms/cough.dm create mode 100644 code/datums/diseases/advance/symptoms/damage_converter.dm create mode 100644 code/datums/diseases/advance/symptoms/dizzy.dm create mode 100644 code/datums/diseases/advance/symptoms/fever.dm create mode 100644 code/datums/diseases/advance/symptoms/fire.dm create mode 100644 code/datums/diseases/advance/symptoms/flesh_eating.dm create mode 100644 code/datums/diseases/advance/symptoms/hallucigen.dm create mode 100644 code/datums/diseases/advance/symptoms/headache.dm create mode 100644 code/datums/diseases/advance/symptoms/heal.dm create mode 100644 code/datums/diseases/advance/symptoms/itching.dm create mode 100644 code/datums/diseases/advance/symptoms/language.dm create mode 100644 code/datums/diseases/advance/symptoms/macrophage.dm create mode 100644 code/datums/diseases/advance/symptoms/mlem.dm create mode 100644 code/datums/diseases/advance/symptoms/necrotic_agent.dm create mode 100644 code/datums/diseases/advance/symptoms/oxygen.dm create mode 100644 code/datums/diseases/advance/symptoms/sensory.dm create mode 100644 code/datums/diseases/advance/symptoms/shivering.dm create mode 100644 code/datums/diseases/advance/symptoms/sneeze.dm create mode 100644 code/datums/diseases/advance/symptoms/spin.dm create mode 100644 code/datums/diseases/advance/symptoms/symptoms.dm create mode 100644 code/datums/diseases/advance/symptoms/synthetic_infection.dm create mode 100644 code/datums/diseases/advance/symptoms/telepathy.dm create mode 100644 code/datums/diseases/advance/symptoms/viral.dm create mode 100644 code/datums/diseases/advance/symptoms/vision.dm create mode 100644 code/datums/diseases/advance/symptoms/vomit.dm create mode 100644 code/datums/diseases/advance/symptoms/weakness.dm create mode 100644 code/datums/diseases/advance/symptoms/weigh.dm create mode 100644 code/datums/diseases/anxiety.dm create mode 100644 code/datums/diseases/beesease.dm create mode 100644 code/datums/diseases/brainrot.dm create mode 100644 code/datums/diseases/choreomania.dm create mode 100644 code/datums/diseases/cold.dm create mode 100644 code/datums/diseases/cold9.dm create mode 100644 code/datums/diseases/darkness.dm create mode 100644 code/datums/diseases/flu.dm create mode 100644 code/datums/diseases/food_poisoning.dm create mode 100644 code/datums/diseases/lycancoughy.dm create mode 100644 code/datums/diseases/magnitis.dm create mode 100644 code/datums/diseases/roanoake.dm create mode 100644 code/game/machinery/pandemic.dm create mode 100644 code/modules/events/disease_outbreak.dm delete mode 100644 code/modules/gamemaster/event2/events/medical/virus.dm delete mode 100644 code/modules/mob/living/carbon/viruses.dm create mode 100644 code/modules/mob/living/simple_mob/subtypes/vore/macrophage.dm create mode 100644 code/modules/reagents/reactions/instant/virology.dm create mode 100644 code/modules/reagents/reagent_containers/virology.dm create mode 100644 code/modules/reagents/reagents/virology.dm delete mode 100644 code/modules/virus2/admin.dm delete mode 100644 code/modules/virus2/analyser.dm delete mode 100644 code/modules/virus2/antibodies.dm delete mode 100644 code/modules/virus2/biohazard destroyer.dm delete mode 100644 code/modules/virus2/centrifuge.dm delete mode 100644 code/modules/virus2/curer.dm delete mode 100644 code/modules/virus2/disease2.dm delete mode 100644 code/modules/virus2/diseasesplicer.dm delete mode 100644 code/modules/virus2/dishincubator.dm delete mode 100644 code/modules/virus2/effect.dm delete mode 100644 code/modules/virus2/effect_vr.dm delete mode 100644 code/modules/virus2/helpers.dm delete mode 100644 code/modules/virus2/isolator.dm delete mode 100644 code/modules/virus2/items_devices.dm create mode 100644 icons/mob/macrophage.dmi create mode 100644 icons/obj/pandemic.dmi create mode 100644 tgui/packages/tgui/interfaces/PanDEMIC.tsx diff --git a/code/__defines/diseases.dm b/code/__defines/diseases.dm new file mode 100644 index 0000000000..30f1d6252b --- /dev/null +++ b/code/__defines/diseases.dm @@ -0,0 +1,30 @@ +#define VIRUS_SYMPTOM_LIMIT 6 + +//Visibility Flags +#define HIDDEN_SCANNER (1<<0) +#define HIDDEN_PANDEMIC (1<<1) + +//Disease Flags +#define CURABLE (1<<0) +#define CAN_CARRY (1<<1) +#define CAN_RESIST (1<<2) + +//Spread Flags +#define SPECIAL (1<<0) +#define NON_CONTAGIOUS (1<<1) +#define BLOOD (1<<2) +#define CONTACT_FEET (1<<3) +#define CONTACT_HANDS (1<<4) +#define CONTACT_GENERAL (1<<5) +#define AIRBORNE (1<<6) + + +//Severity Defines +#define NONTHREAT "No threat" +#define MINOR "Minor" +#define MEDIUM "Medium" +#define HARMFUL "Harmful" +#define DANGEROUS "Dangerous!" +#define BIOHAZARD "BIOHAZARD THREAT!" + +#define SYMPTOM_ACTIVATION_PROB 3 diff --git a/code/__defines/math.dm b/code/__defines/math.dm index f4539605f2..846753ab56 100644 --- a/code/__defines/math.dm +++ b/code/__defines/math.dm @@ -220,3 +220,9 @@ #define ROUNDUPTOPOWEROFTWO(x) (2 ** -round(-log(2,x))) #define DEFAULT(a, b) (a? a : b) + +// sqrt, but if you give it a negative number, you get 0 instead of a runtime +/proc/sqrtor0(num) + if(num < 0) + return 0 + return sqrt(num) diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm new file mode 100644 index 0000000000..a24fa9264f --- /dev/null +++ b/code/datums/diseases/_MobProcs.dm @@ -0,0 +1,195 @@ +/mob/proc/HasDisease(datum/disease/D) + for(var/thing in GetViruses()) + var/datum/disease/DD = thing + if(DD.IsSame(D)) + return TRUE + return FALSE + +/mob/proc/CanContractDisease(datum/disease/D) + if(stat == DEAD && !D.allow_dead) + return FALSE + + if(D.GetDiseaseID() in GetResistances()) + return FALSE + + if(HasDisease(D)) + return FALSE + + if(istype(D, /datum/disease/advance) && count_by_type(GetViruses(), /datum/disease/advance) > 0) + return FALSE + + if(!(type in D.viable_mobtypes)) + return -1 + + if(isSynthetic()) + if(D.infect_synthetics) + return TRUE + return FALSE + + return TRUE + +/mob/proc/ContractDisease(datum/disease/D) + if(!CanContractDisease(D)) + return 0 + AddDisease(D) + return TRUE + +/mob/proc/AddDisease(datum/disease/D, respect_carrier = FALSE) + var/datum/disease/DD = new D.type(1, D, 0) + viruses += DD + DD.affected_mob = src + active_diseases += DD + + var/list/skipped = list("affected_mob", "holder", "carrier", "stage", "type", "parent_type", "vars", "transformed") + if(respect_carrier) + skipped -= "carrier" + for(var/V in DD.vars) + if(V in skipped) + continue + if(istype(DD.vars[V],/list)) + var/list/L = D.vars[V] + DD.vars[V] = L.Copy() + else + DD.vars[V] = D.vars[V] + + log_admin("[key_name(usr)] has contracted the virus \"[DD]\"") + +/mob/living/carbon/ContractDisease(datum/disease/D) + if(!CanContractDisease(D)) + return 0 + + var/obj/item/clothing/Cl = null + var/passed = 1 + + var/head_ch = 100 + var/body_ch = 100 + var/hands_ch = 25 + var/feet_ch = 25 + + if(D.spread_flags & CONTACT_HANDS) + head_ch = 0 + body_ch = 0 + hands_ch = 100 + feet_ch = 0 + if(D.spread_flags & CONTACT_FEET) + head_ch = 0 + body_ch = 0 + hands_ch = 0 + feet_ch = 100 + + if(prob(15/D.permeability_mod)) + return + + if(nutrition > 300 && prob(nutrition/10)) + return + + var/list/zone_weights = list( + 1 = head_ch, + 2 = body_ch, + 3 = hands_ch, + 4 = feet_ch + ) + + var/target_zone = pick(zone_weights) + + if(ishuman(src)) + var/mob/living/carbon/human/H = src + + switch(target_zone) + if(1) + if(isobj(H.head) && !istype(H.head, /obj/item/paper)) + Cl = H.head + passed = prob((Cl.permeability_coefficient*100) - 1) + if(passed && isobj(H.wear_mask)) + Cl = H.wear_mask + passed = prob((Cl.permeability_coefficient*100) - 1) + if(2) + if(isobj(H.wear_suit)) + Cl = H.wear_suit + passed = prob((Cl.permeability_coefficient*100) - 1) + if(passed && isobj(H.w_uniform)) + Cl = H.w_uniform + passed = prob((Cl.permeability_coefficient*100) - 1) + if(3) + if(isobj(H.wear_suit) && H.wear_suit.body_parts_covered & HANDS) + Cl = H.wear_suit + passed = prob((Cl.permeability_coefficient*100) - 1) + + if(passed && isobj(H.gloves)) + Cl = H.gloves + passed = prob((Cl.permeability_coefficient*100) - 1) + if(4) + if(isobj(H.wear_suit) && H.wear_suit.body_parts_covered & FEET) + Cl = H.wear_suit + passed = prob((Cl.permeability_coefficient*100) - 1) + + if(passed && isobj(H.shoes)) + Cl = H.shoes + passed = prob((Cl.permeability_coefficient*100) - 1) + if(!passed && (D.spread_flags & AIRBORNE) && !internal) + passed = (prob((50*D.permeability_mod) -1)) + + if(passed) + AddDisease(D) + return passed + +/mob/proc/ForceContractDisease(datum/disease/D, respect_carrier) + if(!CanContractDisease(D)) + return FALSE + + AddDisease(D, respect_carrier) + return TRUE + +/mob/living/carbon/human/CanContractDisease(datum/disease/D) + if(species.virus_immune && !D.bypasses_immunity) + return FALSE + + for(var/organ in D.required_organs) + if(locate(organ) in internal_organs) + continue + if(locate(organ) in organs) + continue + return FALSE + return ..() + +/mob/living/carbon/human/monkey/CanContractDisease(datum/disease/D) + . = ..() + if(. == -1) + if(D.viable_mobtypes.Find(/mob/living/carbon/human)) + return 1 + +/mob/living/proc/handle_diseases() + return + +/mob/proc/GetViruses() + LAZYINITLIST(viruses) + return viruses + +/mob/proc/GetResistances() + LAZYINITLIST(resistances) + return resistances + +/client/proc/ReleaseVirus() + set category = "Fun.Event Kit" + set name = "Release Virus" + set desc = "Release a pre-set virus." + + if(!is_admin()) + return FALSE + + var/datum/disease/D = tgui_input_list(usr, "Choose virus", "Viruses", subtypesof(/datum/disease), subtypesof(/datum/disease)) + var/mob/living/carbon/human/H = null + + if(isnull(D)) + return FALSE + + for(var/thing in shuffle(human_mob_list)) + H = thing + if(H.stat == DEAD) + continue + if(!H.HasDisease(D)) + H.ForceContractDisease(D) + break + + message_admins("[key_name_admin(usr)] has triggered a virus outbreak of [D.name]! Affected mob: [key_name_admin(H)]") + log_admin("[key_name_admin(usr)] infected [key_name_admin(H)] with [D.name]") diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm new file mode 100644 index 0000000000..6ae5cdbb9e --- /dev/null +++ b/code/datums/diseases/_disease.dm @@ -0,0 +1,167 @@ +GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) + +/datum/disease + //Flags + var/visibility_flags = 0 + var/disease_flags = CURABLE|CAN_CARRY|CAN_RESIST + var/spread_flags = AIRBORNE + + //Fluff + /// Used for identification of viruses in the Medical Records Virus Database + var/medical_name + var/form = "Virus" + var/name = "No disease" + var/desc = "" + var/agent = "some microbes" + var/spread_text = "" + var/cure_text = "" + + //Stages + var/stage = 1 + var/max_stages = 0 + var/stage_prob = 4 + /// The fraction of stages the virus must at least be at to show up on medical HUDs. Rounded up. + var/discovery_threshold = 0.5 + /// If TRUE, this virus will show up on medical HUDs. Automatically set when it reaches mid-stage. + var/discovered = FALSE + + // Other + var/list/viable_mobtypes = list() + var/mob/living/carbon/affected_mob + var/list/cures = list() + var/infectivity = 65 + var/cure_chance = 8 + var/carrier = FALSE + var/bypasses_immunity = FALSE + var/virus_heal_resistant = FALSE + var/permeability_mod = 1 + var/severity = NONTHREAT + var/list/required_organs = list() + var/needs_all_cures = TRUE + var/list/strain_data = list() + var/allow_dead = FALSE + var/infect_synthetics = FALSE + var/processing = FALSE + +/datum/disease/Destroy() + affected_mob = null + active_diseases.Remove(src) + if(processing) + End() + return ..() + +/datum/disease/proc/stage_act() + if(!affected_mob) + return FALSE + var/cure = has_cure() + + if(carrier && !cure) + return FALSE + + if(!processing) + processing = TRUE + Start() + + stage = min(stage, max_stages) + + handle_stage_advance(cure) + + return handle_cure_testing(cure) + +/datum/disease/proc/handle_stage_advance(has_cure = FALSE) + if(!has_cure && prob(stage_prob)) + stage = min(stage + 1, max_stages) + if(!discovered && stage >= CEILING(max_stages * discovery_threshold, 1)) + discovered = TRUE + BITSET(affected_mob.hud_updateflag, STATUS_HUD) + +/datum/disease/proc/handle_cure_testing(has_cure = FALSE) + if(has_cure && prob(cure_chance)) + stage = max(stage -1, 1) + + if(disease_flags & CURABLE) + if(has_cure && prob(cure_chance)) + cure() + return FALSE + return TRUE + +/datum/disease/proc/has_cure() + if(!(disease_flags & CURABLE)) + return 0 + + var/cures_found = 0 + for(var/C_id in cures) + if(affected_mob.reagents.has_reagent(C_id)) + cures_found++ + + if(needs_all_cures && cures_found < length(cures)) + return FALSE + + return cures_found + +/datum/disease/proc/spread(force_spread = 0) + if(!affected_mob) + return + + if((spread_flags & SPECIAL || spread_flags & NON_CONTAGIOUS || spread_flags & BLOOD) && !force_spread) + return + + if(affected_mob.reagents.has_reagent("spaceacilin") || (affected_mob.nutrition > 300 && prob(affected_mob.nutrition/10))) + return + + var/spread_range = 1 + + if(force_spread) + spread_range = force_spread + + if(spread_flags & AIRBORNE) + spread_range++ + + var/turf/target = affected_mob.loc + if(istype(target)) + for(var/mob/living/carbon/C in oview(spread_range, affected_mob)) + var/turf/current = get_turf(C) + if(current) + while(TRUE) + if(current == target) + C.ContractDisease(src) + break + var/direction = get_dir(current, target) + var/turf/next = get_step(current, direction) + current = next + +/datum/disease/proc/cure() + if(affected_mob) + if(disease_flags & CAN_RESIST) + if(!(type in affected_mob.GetResistances())) + affected_mob.resistances += type + remove_virus() + qdel(src) + +/datum/disease/proc/IsSame(datum/disease/D) + if(ispath(D)) + return istype(src, D) + return istype(src, D.type) + +/datum/disease/proc/Copy() + var/datum/disease/D = new type() + D.strain_data = strain_data.Copy() + return D + +/datum/disease/proc/GetDiseaseID() + return type + +/datum/disease/proc/IsSpreadByTouch() + if(spread_flags & CONTACT_FEET || spread_flags & CONTACT_HANDS || spread_flags & CONTACT_GENERAL) + return 1 + return 0 + +/datum/disease/proc/remove_virus() + affected_mob.viruses -= src + BITSET(affected_mob.hud_updateflag, STATUS_HUD) + +/datum/disease/proc/Start() + return + +/datum/disease/proc/End() + return diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm new file mode 100644 index 0000000000..73ef664998 --- /dev/null +++ b/code/datums/diseases/advance/advance.dm @@ -0,0 +1,404 @@ +GLOBAL_LIST_EMPTY(archive_diseases) + +GLOBAL_LIST_INIT(advance_cures, list( + "sodiumchloride", "sugar", "orangejuice", + "spaceacilin", "glucose", "ethanol", + "dyloteane", "impedrezene", "hepanephrodaxon", + "gold", "silver" +)) + +/datum/disease/advance + name = "Unknown" + desc = "An engineered disease which can contain a multitude of symptoms." + form = "Advance Disease" + agent = "advance microbes" + max_stages = 5 + spread_text = "Unknown" + viable_mobtypes = list(/mob/living/carbon/human) + + var/list/symptoms = list() + var/id = "" + +/datum/disease/advance/New(process = 1, datum/disease/advance/D) + if(!istype(D)) + D = null + + if(!symptoms || !length(symptoms)) + + if(!D || !D.symptoms || !length(D.symptoms)) + symptoms = GenerateSymptoms(0, 2) + else + for(var/datum/symptom/S in D.symptoms) + symptoms += new S.type + + Refresh() + ..(process, D) + return + +/datum/disease/advance/Destroy() + if(processing) + for(var/datum/symptom/S in symptoms) + S.End(src) + return ..() + +/datum/disease/advance/stage_act() + if(!..()) + return FALSE + if(symptoms && length(symptoms)) + + if(!processing) + processing = TRUE + for(var/datum/symptom/S in symptoms) + S.Start(src) + + for(var/datum/symptom/S in symptoms) + S.Activate(src) + else + CRASH("We do not have any symptoms during stage_act()!") + return TRUE + +/datum/disease/advance/IsSame(datum/disease/advance/D) + if(ispath(D)) + return FALSE + + if(!istype(D, /datum/disease/advance)) + return FALSE + + if(GetDiseaseID() != D.GetDiseaseID()) + return FALSE + + return TRUE + +/datum/disease/advance/cure(resistance=1) + if(affected_mob) + var/id = "[GetDiseaseID()]" + if(resistance && !(id in affected_mob.GetResistances())) + affected_mob.GetResistances()[id] = id + remove_virus() + qdel(src) + +/datum/disease/advance/Copy(process = 0) + return new /datum/disease/advance(process, src, 1) + +/datum/disease/advance/proc/Mix(datum/disease/advance/D) + if(!(IsSame(D))) + var/list/possible_symptoms = shuffle(D.symptoms) + for(var/datum/symptom/S in possible_symptoms) + AddSymptom(new S.type) + +/datum/disease/advance/proc/HasSymptom(datum/symptom/S) + for(var/datum/symptom/symp in symptoms) + if(symp.id == S.id) + return 1 + return 0 + +/datum/disease/advance/proc/GenerateSymptomsBySeverity(sev_min, sev_max, amount = 1) + + var/list/generated = list() + + var/list/possible_symptoms = list() + for(var/symp in GLOB.list_symptoms) + var/datum/symptom/S = new symp + if(S.severity >= sev_min && S.severity <= sev_max) + if(!HasSymptom(S)) + possible_symptoms += S + + if(!length(possible_symptoms)) + return generated + + for(var/i = 1 to amount) + generated += pick_n_take(possible_symptoms) + + return generated + +/datum/disease/advance/proc/GenerateSymptoms(level_min, level_max, amount_get = 0) + + var/list/generated = list() + + // Generate symptoms. By default, we only choose non-deadly symptoms. + var/list/possible_symptoms = list() + for(var/symp in GLOB.list_symptoms) + var/datum/symptom/S = new symp + if(S.level >= level_min && S.level <= level_max) + if(!HasSymptom(S)) + possible_symptoms += S + + if(!length(possible_symptoms)) + return generated + + // Random chance to get more than one symptom + var/number_of = amount_get + if(!amount_get) + number_of = 1 + while(prob(20)) + number_of += 1 + + for(var/i = 1; number_of >= i && length(possible_symptoms); i++) + generated += pick_n_take(possible_symptoms) + + return generated + +/datum/disease/advance/proc/Refresh(new_name = FALSE, archive = FALSE) + var/list/properties = GenerateProperties() + AssignProperties(properties) + id = null + + if(!GLOB.archive_diseases[GetDiseaseID()]) + if(new_name) + AssignName() + GLOB.archive_diseases[GetDiseaseID()] = src // So we don't infinite loop + GLOB.archive_diseases[GetDiseaseID()] = new /datum/disease/advance(0, src, 1) + + var/datum/disease/advance/A = GLOB.archive_diseases[GetDiseaseID()] + AssignName(A.name) + +/datum/disease/advance/proc/GenerateProperties() + + if(!symptoms || !length(symptoms)) + CRASH("We did not have any symptoms before generating properties.") + + var/list/properties = list("resistance" = 1, "stealth" = 0, "stage rate" = 1, "transmittable" = 1, "severity" = 0) + + for(var/datum/symptom/S in symptoms) + + properties["resistance"] += S.resistance + properties["stealth"] += S.stealth + properties["stage rate"] += S.stage_speed + properties["transmittable"] += S.transmittable + properties["severity"] = max(properties["severity"], S.severity) // severity is based on the highest severity symptom + + return properties + +/datum/disease/advance/proc/AssignProperties(list/properties = list()) + + if(properties && length(properties)) + switch(properties["stealth"]) + if(2) + visibility_flags = HIDDEN_SCANNER + if(3 to INFINITY) + visibility_flags = HIDDEN_SCANNER|HIDDEN_PANDEMIC + + // The more symptoms we have, the less transmittable it is but some symptoms can make up for it. + SetSpread(clamp(2 ** (properties["transmittable"] - length(symptoms)), BLOOD, AIRBORNE)) + permeability_mod = max(CEILING(0.4 * properties["transmittable"], 1), 1) + cure_chance = 15 - clamp(properties["resistance"], -5, 5) // can be between 10 and 20 + stage_prob = max(properties["stage rate"], 2) + SetSeverity(properties["severity"]) + GenerateCure(properties) + else + CRASH("Our properties were empty or null!") + +/datum/disease/advance/proc/SetSpread(spread_id) + switch(spread_id) + if(NON_CONTAGIOUS, SPECIAL) + spread_text = "Non-contagious" + if(CONTACT_GENERAL, CONTACT_HANDS, CONTACT_FEET) + spread_text = "On contact" + if(AIRBORNE) + spread_text = "Airborne" + if(BLOOD) + spread_text = "Blood" + + spread_flags = spread_id + +/datum/disease/advance/proc/SetSeverity(level_sev) + + switch(level_sev) + + if(-INFINITY to 0) + severity = NONTHREAT + if(1) + severity = MINOR + if(2) + severity = MEDIUM + if(3) + severity = HARMFUL + if(4) + severity = DANGEROUS + if(5 to INFINITY) + severity = BIOHAZARD + else + severity = "Unknown" + +/datum/disease/advance/proc/GenerateCure(list/properties = list()) + if(properties && length(properties)) + var/res = clamp(properties["resistance"] - (length(symptoms) / 2), 1, length(GLOB.advance_cures)) + cures = list(GLOB.advance_cures[res]) + cure_text = cures[1] + return + +// Randomly generate a symptom, has a chance to lose or gain a symptom. +/datum/disease/advance/proc/Evolve(min_level, max_level) + var/s = safepick(GenerateSymptoms(min_level, max_level, 1)) + if(s) + AddSymptom(s) + Refresh(1) + return + +// Randomly remove a symptom. +/datum/disease/advance/proc/Devolve() + if(length(symptoms) > 1) + var/s = safepick(symptoms) + if(s) + RemoveSymptom(s) + Refresh(1) + return + +// Name the disease. +/datum/disease/advance/proc/AssignName(name = "Unknown") + src.name = name + return + +// Return a unique ID of the disease. +/datum/disease/advance/GetDiseaseID() + if(!id) + var/list/L = list() + for(var/datum/symptom/S in symptoms) + L += S.id + L = sortList(L) // Sort the list so it doesn't matter which order the symptoms are in. + var/result = jointext(L, ":") + id = result + return id + +// Add a symptom, if it is over the limit (with a small chance to be able to go over) +// we take a random symptom away and add the new one. +/datum/disease/advance/proc/AddSymptom(datum/symptom/S) + + if(HasSymptom(S)) + return + + if(length(symptoms) < (VIRUS_SYMPTOM_LIMIT - 1) + rand(-1, 1)) + symptoms += S + else + RemoveSymptom(pick(symptoms)) + symptoms += S + return + +// Simply removes the symptom. +/datum/disease/advance/proc/RemoveSymptom(datum/symptom/S) + symptoms -= S + return + +// Mix a list of advance diseases and return the mixed result. +/proc/Advance_Mix(list/D_list) + + var/list/diseases = list() + + for(var/datum/disease/advance/A in D_list) + diseases += A.Copy() + + if(!length(diseases)) + return null + if(length(diseases) <= 1) + return pick(diseases) // Just return the only entry. + + var/i = 0 + // Mix our diseases until we are left with only one result. + while(i < 20 && length(diseases) > 1) + + i++ + + var/datum/disease/advance/D1 = pick(diseases) + diseases -= D1 + + var/datum/disease/advance/D2 = pick(diseases) + D2.Mix(D1) + + // Should be only 1 entry left, but if not let's only return a single entry + var/datum/disease/advance/to_return = pick(diseases) + to_return.Refresh(1) + return to_return + +/proc/SetViruses(datum/reagent/R, list/data) + if(data) + var/list/preserve = list() + if(istype(data) && data["viruses"]) + for(var/datum/disease/A in data["viruses"]) + preserve += A.Copy() + R.data = data.Copy() + if(length(preserve)) + R.data["viruses"] = preserve + +/client/proc/AdminCreateVirus() + set category = "Fun.Event Kit" + set name = "Create Advanced Virus" + set desc = "Create an advanced virus and release it." + + if(!is_admin()) + return FALSE + + var/i = VIRUS_SYMPTOM_LIMIT + var/mob/living/carbon/human/H = null + + var/datum/disease/advance/D = new(0, null) + D.symptoms = list() + + var/list/symptoms = list() + symptoms += "Done" + symptoms += GLOB.list_symptoms.Copy() + do + if(usr) + var/symptom = tgui_input_list(usr, "Choose a symptom to add ([i] remaining)", "Choose a Symptom", symptoms) + if(isnull(symptom)) + return + else if(istext(symptom)) + i = 0 + else if(ispath(symptom)) + var/datum/symptom/S = new symptom + if(!D.HasSymptom(S)) + D.symptoms += S + i -= 1 + while(i > 0) + + if(length(D.symptoms) > 0) + + var/new_name = tgui_input_text(usr, "Name your new disease.", "New Name") + if(!new_name) + return + D.AssignName(new_name) + D.Refresh() + + for(var/datum/disease/advance/AD in active_diseases) + AD.Refresh() + + for(var/thing in shuffle(human_mob_list)) + H = thing + if(H.stat == DEAD) + continue + if(!H.HasDisease(D)) + H.ForceContractDisease(D) + break + + var/list/name_symptoms = list() + for(var/datum/symptom/S in D.symptoms) + name_symptoms += S.name + message_admins("[key_name_admin(usr)] has triggered a custom virus outbreak of [D.name]! It has these symptoms: [english_list(name_symptoms)]") + log_admin("[key_name_admin(usr)] infected [key_name_admin(H)] with [D.name]. It has these symptoms: [english_list(name_symptoms)]") + +/datum/disease/advance/proc/totalStageSpeed() + var/total_stage_speed = 0 + for(var/i in symptoms) + var/datum/symptom/S = i + total_stage_speed += S.stage_speed + return total_stage_speed + +/datum/disease/advance/proc/totalStealth() + var/total_stealth = 0 + for(var/i in symptoms) + var/datum/symptom/S = i + total_stealth += S.stealth + return total_stealth + +/datum/disease/advance/proc/totalResistance() + var/total_resistance = 0 + for(var/i in symptoms) + var/datum/symptom/S = i + total_resistance += S.resistance + return total_resistance + +/datum/disease/advance/proc/totalTransmittable() + var/total_transmittable = 0 + for(var/i in symptoms) + var/datum/symptom/S = i + total_transmittable += S.transmittable + return total_transmittable diff --git a/code/datums/diseases/advance/disease_preset.dm b/code/datums/diseases/advance/disease_preset.dm new file mode 100644 index 0000000000..d30bbf2ebb --- /dev/null +++ b/code/datums/diseases/advance/disease_preset.dm @@ -0,0 +1,16 @@ +// Cold + +/datum/disease/advance/cold/New(process = 1, datum/disease/advance/D, copy = 0) + if(!D) + name = "Cold" + symptoms = list(new /datum/symptom/sneeze) + ..(process, D, copy) + + +// Flu + +/datum/disease/advance/flu/New(process = 1, datum/disease/advance/D, copy = 0) + if(!D) + name = "Flu" + symptoms = list(new /datum/symptom/cough) + ..(process, D, copy) diff --git a/code/datums/diseases/advance/symptoms/choking.dm b/code/datums/diseases/advance/symptoms/choking.dm new file mode 100644 index 0000000000..24be1c1a15 --- /dev/null +++ b/code/datums/diseases/advance/symptoms/choking.dm @@ -0,0 +1,52 @@ +/* +////////////////////////////////////// + +Choking + + Very very noticable. + Lowers resistance. + Decreases stage speed. + Decreases transmittablity tremendously. + Moderate Level. + +Bonus + Inflicts spikes of oxyloss + +////////////////////////////////////// +*/ + +/datum/symptom/choking + name = "Choking" + stealth = -3 + resistance = -2 + stage_speed = -2 + transmittable = -4 + level = 3 + severity = 3 + +/datum/symptom/choking/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + switch(A.stage) + if(1, 2) + to_chat(M, span_warning(pick("You're having difficulty breathing.", "Your breathing becomes heavy."))) + if(3, 4) + to_chat(M, span_boldwarning(pick("Your windpipe feels like a straw.", "Your breathing becomes tremendously difficult."))) + Choke_stage_3_4(M, A) + M.emote("gasp") + else + to_chat(M, span_userdanger(pick("You're choking!", "You can't breathe!"))) + Choke(M, A) + M.emote("gasp") + return + +/datum/symptom/choking/proc/Choke_stage_3_4(mob/living/M, datum/disease/advance/A) + var/get_damage = sqrtor0(21+A.totalStageSpeed()*0.5)+sqrtor0(16+A.totalStealth()) + M.adjustOxyLoss(get_damage) + return 1 + +/datum/symptom/choking/proc/Choke(mob/living/M, datum/disease/advance/A) + var/get_damage = sqrtor0(21+A.totalStageSpeed()*0.5)+sqrtor0(16+A.totalStealth()*5) + M.adjustOxyLoss(get_damage) + return 1 diff --git a/code/datums/diseases/advance/symptoms/confusion.dm b/code/datums/diseases/advance/symptoms/confusion.dm new file mode 100644 index 0000000000..039d9ad8db --- /dev/null +++ b/code/datums/diseases/advance/symptoms/confusion.dm @@ -0,0 +1,40 @@ +/* +////////////////////////////////////// + +Confusion + + Little bit hidden. + Lowers resistance. + Decreases stage speed. + Not very transmittable. + Intense Level. + +Bonus + Makes the affected mob be confused for short periods of time. + +////////////////////////////////////// +*/ + +/datum/symptom/confusion + + name = "Confusion" + stealth = 1 + resistance = -1 + stage_speed = -3 + transmittable = 0 + level = 4 + severity = 2 + + +/datum/symptom/confusion/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/carbon/M = A.affected_mob + switch(A.stage) + if(1, 2, 3, 4) + to_chat(M, span_warning(pick("Your head hurts.", "Your mind blanks for a moment."))) + else + to_chat(M, span_userdanger("You can't think straight!")) + M.AdjustConfused(rand(16, 200)) + + return diff --git a/code/datums/diseases/advance/symptoms/cough.dm b/code/datums/diseases/advance/symptoms/cough.dm new file mode 100644 index 0000000000..bdf04a9fdf --- /dev/null +++ b/code/datums/diseases/advance/symptoms/cough.dm @@ -0,0 +1,39 @@ +/* +////////////////////////////////////// + +Coughing + + Noticable. + Little Resistance. + Doesn't increase stage speed much. + Transmittable. + Low Level. + +BONUS + Will force the affected mob to drop small items! + +////////////////////////////////////// +*/ + +/datum/symptom/cough + name = "Cough" + stealth = -1 + resistance = 3 + stage_speed = 1 + transmittable = 2 + level = 1 + severity = 1 + +/datum/symptom/cough/Activate(var/datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + switch(A.stage) + if(1, 2, 3) + to_chat(M, span_warning(pick("You swallow excess mucus", "You lightly cough."))) + else + M.emote("cough") + var/obj/item/I = M.get_active_hand() + if(I && I.w_class == ITEMSIZE_SMALL) + M.drop_item() + return diff --git a/code/datums/diseases/advance/symptoms/damage_converter.dm b/code/datums/diseases/advance/symptoms/damage_converter.dm new file mode 100644 index 0000000000..f2a299469b --- /dev/null +++ b/code/datums/diseases/advance/symptoms/damage_converter.dm @@ -0,0 +1,59 @@ +/* +////////////////////////////////////// + +Damage Converter + + Little bit hidden. + Lowers resistance tremendously. + Decreases stage speed tremendously. + Reduced transmittablity + Intense Level. + +Bonus + Slowly converts brute/fire damage to toxin. + +////////////////////////////////////// +*/ + +/datum/symptom/damage_converter + name = "Toxic Compensation" + stealth = 1 + resistance = -4 + stage_speed = -4 + transmittable = -2 + level = 4 + +/datum/symptom/damage_converter/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB * 10)) + var/mob/living/M = A.affected_mob + switch(A.stage) + if(4, 5) + Convert(M) + return + +/datum/symptom/damage_converter/proc/Convert(mob/living/M) + + var/get_damage = rand(1, 2) + + if(ishuman(M)) + var/mob/living/carbon/human/H = M + + var/list/parts = H.get_damaged_organs(TRUE, TRUE) + + if(!length(parts)) + return + var/healed = 0 + for(var/obj/item/organ/external/E in parts) + healed += min(E.brute_dam, get_damage) + min(E.burn_dam, get_damage) + E.heal_damage(get_damage, get_damage, 0, 0) + M.adjustToxLoss(healed) + + else + if(M.getFireLoss() > 0 || M.getBruteLoss() > 0) + M.adjustFireLoss(-get_damage) + M.adjustBruteLoss(-get_damage) + M.adjustToxLoss(get_damage) + else + return + return TRUE diff --git a/code/datums/diseases/advance/symptoms/dizzy.dm b/code/datums/diseases/advance/symptoms/dizzy.dm new file mode 100644 index 0000000000..fdedcba79c --- /dev/null +++ b/code/datums/diseases/advance/symptoms/dizzy.dm @@ -0,0 +1,38 @@ +/* +////////////////////////////////////// + +Dizziness + + Hidden. + Lowers resistance considerably. + Decreases stage speed. + Reduced transmittability + Intense Level. + +Bonus + Shakes the affected mob's screen for short periods. + +////////////////////////////////////// +*/ + +/// Not the egg +/datum/symptom/dizzy + name = "Dizziness" + stealth = 2 + resistance = -2 + stage_speed = -3 + transmittable = -1 + level = 4 + severity = 2 + +/datum/symptom/dizzy/Activate(var/datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + switch(A.stage) + if(1, 2, 3, 4) + to_chat(M, span_warning(pick("You feel dizzy.", "Your head spins."))) + else + to_chat(M, span_userdanger("A wave of dizziness washes over you!")) + M.make_dizzy(10) + return diff --git a/code/datums/diseases/advance/symptoms/fever.dm b/code/datums/diseases/advance/symptoms/fever.dm new file mode 100644 index 0000000000..a9e027da9c --- /dev/null +++ b/code/datums/diseases/advance/symptoms/fever.dm @@ -0,0 +1,40 @@ +/* +////////////////////////////////////// + +Fever + + No change to hidden. + Increases resistance. + Increases stage speed. + Little transmittable. + Low level. + +Bonus + Heats up your body. + +////////////////////////////////////// +*/ + +/datum/symptom/fever + name = "Fever" + stealth = 0 + resistance = 3 + stage_speed = 3 + transmittable = 2 + level = 2 + severity = 2 + +/datum/symptom/fever/Activate(var/datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/carbon/M = A.affected_mob + to_chat(M, span_warning(pick("You feel hot.", "You feel like you're burning."))) + if(M.bodytemperature < BODYTEMP_HEAT_DAMAGE_LIMIT) + Heat(M, A) + + return + +/datum/symptom/fever/proc/Heat(var/mob/living/M, var/datum/disease/advance/A) + var/get_heat = (sqrt(21+A.totalTransmittable()*2))+(sqrt(20+A.totalStageSpeed()*3)) + M.bodytemperature = min(M.bodytemperature + (get_heat * A.stage), BODYTEMP_HEAT_DAMAGE_LIMIT - 1) + return TRUE diff --git a/code/datums/diseases/advance/symptoms/fire.dm b/code/datums/diseases/advance/symptoms/fire.dm new file mode 100644 index 0000000000..956d778f5d --- /dev/null +++ b/code/datums/diseases/advance/symptoms/fire.dm @@ -0,0 +1,56 @@ +/* +////////////////////////////////////// + +Spontaneous Combustion + + Slightly hidden. + Lowers resistance tremendously. + Decreases stage tremendously. + Decreases transmittablity tremendously. + Fatal Level. + +Bonus + Ignites infected mob. + +////////////////////////////////////// +*/ + +/datum/symptom/fire + name = "Spontaneous Combustion" + stealth = 1 + resistance = -4 + stage_speed = -4 + transmittable = -4 + level = 6 + severity = 5 + +/datum/symptom/fire/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + switch(A.stage) + if(3) + to_chat(M, span_warning(pick("You feel hot.", "You hear a crackling noise.", "You smell smoke."))) + if(4) + Firestacks_stage_4(M, A) + M.IgniteMob() + to_chat(M, span_userdanger("Your skin bursts into flames!")) + M.emote("scream") + if(5) + Firestacks_stage_5(M, A) + M.IgniteMob() + to_chat(M, span_userdanger("Your skin erupts into an inferno!")) + M.emote("scream") + return + +/datum/symptom/fire/proc/Firestacks_stage_4(mob/living/M, datum/disease/advance/A) + var/get_stacks = max((sqrtor0(20 + A.totalStageSpeed() * 2)) - (sqrtor0(16 + A.totalStealth())), 1) + M.adjust_fire_stacks(get_stacks) + M.adjustFireLoss(get_stacks * 0.5) + return 1 + +/datum/symptom/fire/proc/Firestacks_stage_5(mob/living/M, datum/disease/advance/A) + var/get_stacks = max((sqrtor0(20 + A.totalStageSpeed() * 3))-(sqrtor0(16 + A.totalStealth())), 1) + M.adjust_fire_stacks(get_stacks) + M.adjustFireLoss(get_stacks) + return 1 diff --git a/code/datums/diseases/advance/symptoms/flesh_eating.dm b/code/datums/diseases/advance/symptoms/flesh_eating.dm new file mode 100644 index 0000000000..28c9002c3a --- /dev/null +++ b/code/datums/diseases/advance/symptoms/flesh_eating.dm @@ -0,0 +1,42 @@ +/* +////////////////////////////////////// + +Necrotizing Fasciitis (AKA Flesh-Eating Disease) + + Very very noticable. + Lowers resistance tremendously. + No changes to stage speed. + Decreases transmittablity temrendously. + Fatal Level. + +Bonus + Deals brute damage over time. + +////////////////////////////////////// +*/ + +/datum/symptom/flesh_eating + name = "Necrotizing Fasciitis" + stealth = -3 + resistance = -4 + stage_speed = 0 + transmittable = -4 + level = 6 + severity = 5 + +/datum/symptom/flesh_eating/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + switch(A.stage) + if(2,3) + to_chat(M, span_warning(pick("You feel a sudden pain across your body.", "Drops of blood appear suddenly on your skin."))) + if(4,5) + to_chat(M, span_userdanger(pick("You cringe as a violent pain takes over your body.", "It feels like your body is eating itself inside out.", "IT HURTS."))) + Flesheat(M, A) + return + +/datum/symptom/flesh_eating/proc/Flesheat(mob/living/M, datum/disease/advance/A) + var/get_damage = ((sqrt(16-A.totalStealth()))*5) + M.adjustBruteLoss(get_damage) + return 1 diff --git a/code/datums/diseases/advance/symptoms/hallucigen.dm b/code/datums/diseases/advance/symptoms/hallucigen.dm new file mode 100644 index 0000000000..4bd1e44401 --- /dev/null +++ b/code/datums/diseases/advance/symptoms/hallucigen.dm @@ -0,0 +1,40 @@ +/* +////////////////////////////////////// + +Hallucigen + + Very noticable. + Lowers resistance considerably. + Decreases stage speed. + Reduced transmittable. + Critical Level. + +Bonus + Makes the affected mob be hallucinated for short periods of time. + +////////////////////////////////////// +*/ + +/datum/symptom/hallucigen + name = "Hallucigen" + stealth = -2 + resistance = -3 + stage_speed = -3 + transmittable = -1 + level = 5 + severity = 3 + +/datum/symptom/hallucigen/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/carbon/M = A.affected_mob + switch(A.stage) + if(1, 2) + to_chat(M, span_warning(pick("Something appears in your peripheral vision, then winks out.", "You hear a faint whisper with no source.", "Your head aches."))) + if(3, 4) + to_chat(M, span_boldwarning(pick("Something is following you.", "You are being watched.", "You hear a whisper in your ear.", "Thumping footsteps slam toward you from nowhere."))) + else + to_chat(M, span_userdanger(pick("Oh, your head...", "Your head pounds.", "They're everywhere! Run!", "Something in the shadows..."))) + M.hallucination = rand(5, 10) + + return diff --git a/code/datums/diseases/advance/symptoms/headache.dm b/code/datums/diseases/advance/symptoms/headache.dm new file mode 100644 index 0000000000..431ed9b670 --- /dev/null +++ b/code/datums/diseases/advance/symptoms/headache.dm @@ -0,0 +1,33 @@ +/* +////////////////////////////////////// + +Headache + + Noticable. + Highly resistant. + Increases stage speed. + Not transmittable. + Low Level. + +BONUS + Displays an annoying message! + Should be used for buffing your disease. + +////////////////////////////////////// +*/ + +/datum/symptom/headache + name = "Headache" + stealth = -1 + resistance = 4 + stage_speed = 2 + transmittable = 0 + level = 1 + severity = 1 + +/datum/symptom/headache/Activate(var/datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + to_chat(M, span_warning(pick("Your head hurts.", "Your head starts pounding."))) + return diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm new file mode 100644 index 0000000000..1c21959872 --- /dev/null +++ b/code/datums/diseases/advance/symptoms/heal.dm @@ -0,0 +1,150 @@ +/* +////////////////////////////////////// + +Healing + + Little bit hidden. + Lowers resistance tremendously. + Decreases stage speed tremendously. + Decreases transmittablity temrendously. + Fatal Level. + +Bonus + Heals toxins in the affected mob's blood stream. + +////////////////////////////////////// +*/ + +/datum/symptom/heal + name = "Toxic Filter" + stealth = 1 + resistance = -4 + stage_speed = -4 + transmittable = -4 + level = 6 + +/datum/symptom/heal/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB * 10)) + var/mob/living/M = A.affected_mob + switch(A.stage) + if(4, 5) + Heal(M, A) + return + +/datum/symptom/heal/proc/Heal(mob/living/M, datum/disease/advance/A) + var/get_damage = (sqrt(20+A.totalStageSpeed())*(1+rand())) + M.adjustToxLoss(-get_damage) + return TRUE + +/* +////////////////////////////////////// + +Metabolism + + Little bit hidden. + Lowers resistance. + Decreases stage speed. + Decreases transmittablity temrendously. + High Level. + +Bonus + Cures all diseases (except itself) and creates anti-bodies for them until the symptom dies. + +////////////////////////////////////// +*/ + +/datum/symptom/heal/metabolism + name = "Anti-Bodies Metabolism" + stealth = -1 + resistance = -1 + stage_speed = -1 + transmittable = -4 + level = 3 + var/list/cured_diseases = list() + +/datum/symptom/heal/metabolism/Heal(mob/living/M, datum/disease/advance/A) + var/cured = 0 + for(var/thing in M.GetViruses()) + var/datum/disease/D = thing + if(D.virus_heal_resistant) + continue + if(D != A) + cured = TRUE + cured_diseases += D.GetDiseaseID() + D.cure() + if(cured) + to_chat(M, span_notice("You feel much better.")) + +/datum/symptom/heal/metabolism/End(datum/disease/advance/A) + var/mob/living/M = A.affected_mob + if(istype(M)) + if(length(cured_diseases)) + for(var/res in M.GetResistances()) + M.resistances -= res + to_chat(M, span_warning("You feel weaker.")) + +/* +////////////////////////////////////// + +Longevity + + Medium hidden boost. + Large resistance boost. + Large stage speed boost. + Large transmittablity boost. + High Level. + +Bonus + After a certain amount of time the symptom will cure itself. + +////////////////////////////////////// +*/ + +/datum/symptom/heal/longevity + name = "Longevity" + stealth = 3 + resistance = 4 + stage_speed = 4 + transmittable = 4 + level = 3 + var/longevity = 30 + +/datum/symptom/heal/longevity/Heal(mob/living/M, datum/disease/advance/A) + longevity -= 1 + if(!longevity) + A.cure() + +/datum/symptom/heal/longevity/Start(datum/disease/advance/A) + longevity = rand(initial(longevity) - 5, initial(longevity) + 5) + +/* +////////////////////////////////////// + + DNA Restoration + + Not well hidden. + Lowers resistance minorly. + Does not affect stage speed. + Decreases transmittablity greatly. + Very high level. + +Bonus + Heals brain damage, treats radiation. + +////////////////////////////////////// +*/ + +/datum/symptom/heal/dna + name = "Deoxyribonucleic Acid Restoration" + stealth = -1 + resistance = -1 + stage_speed = 0 + transmittable = -3 + level = 5 + +/datum/symptom/heal/dna/Heal(var/mob/living/carbon/M, var/datum/disease/advance/A) + var/amt_healed = (sqrt(20+A.totalStageSpeed()*(3+rand())))-(sqrt(16+A.totalStealth()*rand())) + M.adjustBrainLoss(-amt_healed) + M.radiation = max(M.radiation - 3, 0) + return TRUE diff --git a/code/datums/diseases/advance/symptoms/itching.dm b/code/datums/diseases/advance/symptoms/itching.dm new file mode 100644 index 0000000000..fdf2f5f5e4 --- /dev/null +++ b/code/datums/diseases/advance/symptoms/itching.dm @@ -0,0 +1,33 @@ +/* +////////////////////////////////////// + +Itching + + Not noticable or unnoticable. + Resistant. + Increases stage speed. + Little transmittable. + Low Level. + +BONUS + Displays an annoying message! + Should be used for buffing your disease. + +////////////////////////////////////// +*/ + +/datum/symptom/itching + name = "Itching" + stealth = 0 + resistance = 3 + stage_speed = 3 + transmittable = 1 + level = 1 + severity = 1 + +/datum/symptom/itching/Activate(var/datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + to_chat(M, span_warning("Your [pick("back", "arm", "leg", "elbow", "head")] itches.")) + return diff --git a/code/datums/diseases/advance/symptoms/language.dm b/code/datums/diseases/advance/symptoms/language.dm new file mode 100644 index 0000000000..3ffa7c06bb --- /dev/null +++ b/code/datums/diseases/advance/symptoms/language.dm @@ -0,0 +1,31 @@ +/* +////////////////////////////////////// + +Lingual Disocation + + Improves stealth. + Increases resistance. + Decreases stage speed. + Slightly decreases transmissibility. + Moderate Level. + +Bonus + Forces the affected mob to vomit + +////////////////////////////////////// +*/ + +/datum/symptom/language + name = "Lingual Disocation" + stealth = 3 + resistance = 2 + stage_speed = -2 + transmittable = -1 + level = 3 + +/datum/symptom/language/Activate(var/datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/carbon/human/H = A.affected_mob + H.apply_default_language(pick(H.languages)) + return diff --git a/code/datums/diseases/advance/symptoms/macrophage.dm b/code/datums/diseases/advance/symptoms/macrophage.dm new file mode 100644 index 0000000000..5769fadaa6 --- /dev/null +++ b/code/datums/diseases/advance/symptoms/macrophage.dm @@ -0,0 +1,73 @@ +/* +////////////////////////////////////// + +Macrophages + + Very noticeable. + Lowers resistance slightly. + Decreases stage speed. + Increases transmittablity + Fatal leve. + +BONUS + The virus grows and ceases to be microscopic. + +////////////////////////////////////// +*/ + +/datum/symptom/macrophage + name = "Macrophage" + stealth = -4 + resistance = -1 + stage_speed = -2 + transmittable = 2 + level = 6 + severity = 2 + + var/gigagerms = FALSE + var/netspeed = 0 + var/phagecounter = 10 + +/datum/symptom/macrophage/Start(datum/disease/advance/A) + netspeed = max(1, A.stage) + if(A.severity >= HARMFUL) + gigagerms = TRUE + +/datum/symptom/macrophage/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + switch(A.stage) + if(1, 2, 3) + to_chat(M, span_notice("Your skin crawls.")) + if(4) + M.visible_message(span_danger("Lumps form on [M]'s skin!"), span_userdanger("You cringe in pain as lumps form and move around on your skin!")) + if(5) + phagecounter -= max(2, A.totalStageSpeed()) + if(gigagerms && phagecounter <= 0) + Burst(A, M, TRUE) + phagecounter += 10 + while(phagecounter <= 0) + phagecounter += 5 + Burst(A, M) + +/datum/symptom/macrophage/proc/Burst(datum/disease/advance/A, var/mob/living/M, var/gigagerms = FALSE) + var/mob/living/simple_mob/vore/aggressive/macrophage/phage + phage = new(M.loc) + M.apply_damage(rand(1, 7)) + phage.viruses = A.Copy() + phage.health += A.totalResistance() + phage.maxHealth += A.totalResistance() + phage.infections += A + phage.base_disease = A + + if(A.spread_flags & CONTACT_GENERAL) + for(var/datum/disease/D in M.GetViruses()) + if((D.spread_flags & SPECIAL) || (D.spread_flags & NON_CONTAGIOUS)) + continue + if(D == A) + continue + phage.viruses += D + + M.visible_message(span_danger("A strange crearure bursts out of [M]!"), span_userdanger("A slimy creature bursts forth from your flesh!")) + addtimer(CALLBACK(phage, TYPE_PROC_REF(/mob/living/simple_mob/vore/aggressive/macrophage, dust)), 3000) diff --git a/code/datums/diseases/advance/symptoms/mlem.dm b/code/datums/diseases/advance/symptoms/mlem.dm new file mode 100644 index 0000000000..fdb8672c27 --- /dev/null +++ b/code/datums/diseases/advance/symptoms/mlem.dm @@ -0,0 +1,33 @@ +/* +////////////////////////////////////// + +Mlemingtong + + Not noticable or unnoticable. + Resistant. + Increases stage speed. + Little transmittable. + Low Level. + +BONUS + Mlem. Mlem. Mlem. + Should be used for buffing your disease. + +////////////////////////////////////// +*/ + +/datum/symptom/mlem + name = "Mlemington" + stealth = 0 + resistance = 3 + stage_speed = 3 + transmittable = 1 + level = 1 + severity = 1 + +/datum/symptom/itching/Activate(var/datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + M.emote("mlem") + return diff --git a/code/datums/diseases/advance/symptoms/necrotic_agent.dm b/code/datums/diseases/advance/symptoms/necrotic_agent.dm new file mode 100644 index 0000000000..24a3e9ff06 --- /dev/null +++ b/code/datums/diseases/advance/symptoms/necrotic_agent.dm @@ -0,0 +1,31 @@ +/* +////////////////////////////////////// + +Necrotic Agent + + Very Noticable. + Lowers resistance resistance considerably. + Decreases stage speed. + Reduced transmittable. + Critical Level. + +Bonus + Makes the disease work on corpses + +////////////////////////////////////// +*/ + +/datum/symptom/necrotic_agent + name = "Necrotic Agent" + stealth = -2 + resistance = -3 + stage_speed = -3 + transmittable = 0 + level = 6 + severity = 3 + +/datum/symptom/necrotic_agent/Start(datum/disease/advance/A) + A.allow_dead = TRUE + +/datum/symptom/necrotic_agent/End(datum/disease/advance/A) + A.allow_dead = FALSE diff --git a/code/datums/diseases/advance/symptoms/oxygen.dm b/code/datums/diseases/advance/symptoms/oxygen.dm new file mode 100644 index 0000000000..3f9fbd8eee --- /dev/null +++ b/code/datums/diseases/advance/symptoms/oxygen.dm @@ -0,0 +1,37 @@ +/* +////////////////////////////////////// + +Self-Respiration + + Slightly hidden. + Lowers resistance significantly. + Decreases stage speed significantly. + Decreases transmittablity tremendously. + Fatal Level. + +Bonus + The body generates dexalin. + +////////////////////////////////////// +*/ + +/datum/symptom/oxygen + name = "Self-Respiration" + stealth = 1 + resistance = -3 + stage_speed = -3 + transmittable = -4 + level = 6 + +/datum/symptom/oxygen/Activate(var/datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB * 5)) + var/mob/living/M = A.affected_mob + switch(A.stage) + if(4, 5) + if(M.reagents.get_reagent_amount("dexalin") < 10) + M.reagents.add_reagent("dexalin", 10) + else + if(prob(SYMPTOM_ACTIVATION_PROB * 5)) + to_chat(M, span_notice(pick("Your lungs feel great.", "You realize you haven't been breathing.", "You don't feel the need to breathe."))) + return diff --git a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/advance/symptoms/sensory.dm new file mode 100644 index 0000000000..6f1f3ac9d3 --- /dev/null +++ b/code/datums/diseases/advance/symptoms/sensory.dm @@ -0,0 +1,63 @@ +/* +////////////////////////////////////// +Sensory-Restoration + Very very very very noticable. + Lowers resistance tremendously. + Decreases stage speed tremendously. + Decreases transmittablity tremendously. + Fatal. +Bonus + The body generates Sensory restorational chemicals. + imidazoline for eyes + removes alcohol + removes hallucinogens + alkysine to kickstart the mind + +////////////////////////////////////// +*/ +/datum/symptom/mind_restoration + name = "Mind Restoration" + stealth = -3 + resistance = -4 + stage_speed = -4 + transmittable = -3 + level = 5 + severity = 0 + +/datum/symptom/mind_restoration/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB * 3)) + var/mob/living/M = A.affected_mob + + if(A.stage >= 3) + M.slurring = min(0, M.slurring-4) + M.druggy = min(0, M.druggy-4) + M.reagents.remove_reagent("ethanol", 3) + if(A.stage >= 4) + M.drowsyness = min(0, M.drowsyness-4) + if(M.reagents.has_reagent("bliss")) + M.reagents.del_reagent("bliss") + M.hallucination = min(0, M.hallucination-4) + if(A.stage >= 5) + if(M.reagents.get_reagent_amount("alkysine") < 10) + M.reagents.add_reagent("alkysine", 5) + +/datum/symptom/sensory_restoration + name = "Sensory Restoration" + stealth = -1 + resistance = -3 + stage_speed = -2 + transmittable = -4 + level = 4 + +/datum/symptom/sensory_restoration/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB * 5)) + var/mob/living/M = A.affected_mob + switch(A.stage) + if(4, 5) + if(M.reagents.get_reagent_amount("imidazoline") < 10) + M.reagents.add_reagent("imidazoline", 5) + else + if(prob(SYMPTOM_ACTIVATION_PROB)) + to_chat(M, span_notice(pick("Your eyes feel great.","You feel like your eyes can focus more clearly.", "You don't feel the need to blink."))) diff --git a/code/datums/diseases/advance/symptoms/shivering.dm b/code/datums/diseases/advance/symptoms/shivering.dm new file mode 100644 index 0000000000..375850ef40 --- /dev/null +++ b/code/datums/diseases/advance/symptoms/shivering.dm @@ -0,0 +1,39 @@ +/* +////////////////////////////////////// + +Shivering + + No change to hidden. + Increases resistance. + Increases stage speed. + Little transmittable. + Low level. + +Bonus + Cools down your body. + +////////////////////////////////////// +*/ + +/datum/symptom/shivering + name = "Shivering" + stealth = 0 + resistance = 2 + stage_speed = 2 + transmittable = 2 + level = 2 + severity = 2 + +/datum/symptom/shivering/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/carbon/M = A.affected_mob + to_chat(M, span_warning(pick("You feel cold.", "You start shivering."))) + if(M.bodytemperature > BODYTEMP_COLD_DAMAGE_LIMIT) + Chill(M, A) + return + +/datum/symptom/shivering/proc/Chill(mob/living/M, datum/disease/advance/A) + var/get_cold = (sqrt(16+A.totalStealth()*2))+(sqrt(21+A.totalResistance()*2)) + M.bodytemperature = max(M.bodytemperature - (get_cold * A.stage), BODYTEMP_COLD_DAMAGE_LIMIT + 1) + return 1 diff --git a/code/datums/diseases/advance/symptoms/sneeze.dm b/code/datums/diseases/advance/symptoms/sneeze.dm new file mode 100644 index 0000000000..d60baaa11a --- /dev/null +++ b/code/datums/diseases/advance/symptoms/sneeze.dm @@ -0,0 +1,42 @@ +/* +////////////////////////////////////// + +Sneezing + + Very Noticable. + Increases resistance. + Doesn't increase stage speed. + Very transmittable. + Low Level. + +Bonus + Forces a spread type of AIRBORNE + with extra range! + +////////////////////////////////////// +*/ + +/datum/symptom/sneeze + name = "Sneezing" + stealth = -2 + resistance = 3 + stage_speed = 0 + transmittable = 4 + level = 1 + severity = 1 + +/datum/symptom/sneeze/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + switch(A.stage) + if(1, 2, 3) + M.emote("sniff") + else + M.emote("sneeze") + A.spread(5) + if(prob(30)) + var/obj/effect/decal/cleanable/mucus/icky = new(get_turf(M)) + icky.viruses |= A.Copy() + + return diff --git a/code/datums/diseases/advance/symptoms/spin.dm b/code/datums/diseases/advance/symptoms/spin.dm new file mode 100644 index 0000000000..995be34071 --- /dev/null +++ b/code/datums/diseases/advance/symptoms/spin.dm @@ -0,0 +1,40 @@ +/* +////////////////////////////////////// + +Spyndrome + + Slightly hidden. + No change to resistance. + Increases stage speed. + Little transmittable. + Low Level. + +BONUS + Makes the host spin. + Should be used for buffing your disease. + +////////////////////////////////////// +*/ + +/datum/symptom/mlem + name = "Spyndrome" + stealth = 2 + resistance = 0 + stage_speed = 3 + transmittable = 1 + level = 1 + severity = 1 + var/list/directions = list(2,4,1,8,2,4,1,8,2,4,1,8,2,4,1,8,2,4,1,8) + +/datum/symptom/mlem/Activate(var/datum/disease/advance/A) + ..() + + if(prob(SYMPTOM_ACTIVATION_PROB)) + if(A.affected_mob.buckled()) + to_chat(viewers(A.affected_mob), span_warning("[A.affected_mob.name] struggles violently against their restraints!")) + else + to_chat(viewers(A.affected_mob), span_warning("[A.affected_mob.name] spins around violently!")) + for(var/D in directions) + A.affected_mob.dir = D + A.affected_mob.dir = pick(2,4,1,8) + return diff --git a/code/datums/diseases/advance/symptoms/symptoms.dm b/code/datums/diseases/advance/symptoms/symptoms.dm new file mode 100644 index 0000000000..90b39fab3b --- /dev/null +++ b/code/datums/diseases/advance/symptoms/symptoms.dm @@ -0,0 +1,36 @@ +// Symptoms are the effects that engineered advanced diseases do. + +GLOBAL_LIST_INIT(list_symptoms, subtypesof(/datum/symptom)) + +/datum/symptom + // Buffs/Debuffs the symptom has to the overall engineered disease. + var/name = "" + var/stealth = 0 + var/resistance = 0 + var/stage_speed = 0 + var/transmittable = 0 + // The type level of the symptom. Higher is harder to generate. + var/level = 0 + // The severity level of the symptom. Higher is more dangerous. + var/severity = 0 + // The hash tag for our diseases, we will add it up with our other symptoms to get a unique id! ID MUST BE UNIQUE!!! + var/id = "" + +/datum/symptom/New() + var/list/S = GLOB.list_symptoms + for(var/i = 1; i <= length(S); i++) + if(type == S[i]) + id = "[i]" + return + CRASH("We couldn't assign an ID!") + +// Called when processing of the advance disease, which holds this symptom, starts. +/datum/symptom/proc/Start(datum/disease/advance/A) + return + +// Called when the advance disease is going to be deleted or when the advance disease stops processing. +/datum/symptom/proc/End(datum/disease/advance/A) + return + +/datum/symptom/proc/Activate(datum/disease/advance/A) + return diff --git a/code/datums/diseases/advance/symptoms/synthetic_infection.dm b/code/datums/diseases/advance/symptoms/synthetic_infection.dm new file mode 100644 index 0000000000..cb17d88c81 --- /dev/null +++ b/code/datums/diseases/advance/symptoms/synthetic_infection.dm @@ -0,0 +1,32 @@ +/* +////////////////////////////////////// + +Sneezing + + Slightly hidden. + Increases resistance. + Doesn't increase stage speed. + Slightly transmittable. + High Level. + +Bonus + Allows the disease to infect synthetics + +////////////////////////////////////// +*/ + +/datum/symptom/infect_synthetics + name = "Synthetic Infection" + stealth = 1 + resistance = 2 + stage_speed = 0 + transmittable = 1 + level = 5 + severity = 3 + id = "synthetic_infection" + +/datum/symptom/infect_synthetics/Start(datum/disease/advance/A) + A.infect_synthetics = TRUE + +/datum/symptom/infect_synthetics/End(datum/disease/advance/A) + A.infect_synthetics = FALSE diff --git a/code/datums/diseases/advance/symptoms/telepathy.dm b/code/datums/diseases/advance/symptoms/telepathy.dm new file mode 100644 index 0000000000..3e02ec94d8 --- /dev/null +++ b/code/datums/diseases/advance/symptoms/telepathy.dm @@ -0,0 +1,36 @@ +/* +////////////////////////////////////// + +Telepathy + + Hidden. + Decreases resistance. + Decreases stage speed significantly. + Decreases transmittablity tremendously. + Critical Level. + +Bonus + The user gains telepathy. + +////////////////////////////////////// +*/ + +/datum/symptom/telepathy + name = "Pineal Gland Decalcification" + stealth = 2 + resistance = -2 + stage_speed = -3 + transmittable = -4 + level = 5 + +/datum/symptom/telepathy/Start(datum/disease/advance/A) + var/mob/living/carbon/human/H = A.affected_mob + H.dna.SetSEState(REMOTETALKBLOCK, 1) + domutcheck(H, null, TRUE) + to_chat(H, span_notice("Your mind expands...")) + +/datum/symptom/telepathy/End(datum/disease/advance/A) + var/mob/living/carbon/human/H = A.affected_mob + H.dna.SetSEState(REMOTETALKBLOCK, 0) + domutcheck(H, null, TRUE) + to_chat(H, span_notice("Everything feels... Normal.")) diff --git a/code/datums/diseases/advance/symptoms/viral.dm b/code/datums/diseases/advance/symptoms/viral.dm new file mode 100644 index 0000000000..3da1de698c --- /dev/null +++ b/code/datums/diseases/advance/symptoms/viral.dm @@ -0,0 +1,65 @@ +/* +////////////////////////////////////// +Viral adaptation + + Moderate stealth boost. + Major Increases to resistance. + Reduces stage speed. + No change to transmission + Critical Level. + +BONUS + Extremely useful for buffing viruses + +////////////////////////////////////// +*/ +/datum/symptom/viraladaptation + name = "Viral self-adaptation" + stealth = 3 + resistance = 5 + stage_speed = -3 + transmittable = 0 + level = 3 + +/datum/symptom/viraladaptation/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + switch(A.stage) + if(1) + to_chat(M, span_notice("You feel off, but no different from before.")) + if(5) + to_chat(M, span_notice("You feel better, but nothing interesting happens.")) + +/* +////////////////////////////////////// +Viral evolution + + Moderate stealth reductopn. + Major decreases to resistance. + increases stage speed. + increase to transmission + Critical Level. + +BONUS + Extremely useful for buffing viruses + +////////////////////////////////////// +*/ +/datum/symptom/viralevolution + name = "Viral evolutionary acceleration" + stealth = -2 + resistance = -3 + stage_speed = 5 + transmittable = 3 + level = 3 + +/datum/symptom/viralevolution/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + switch(A.stage) + if(1) + to_chat(M, span_notice("You feel better, but no different from before.")) + if(5) + to_chat(M,span_notice("You feel off, but nothing interesting happens.")) diff --git a/code/datums/diseases/advance/symptoms/vision.dm b/code/datums/diseases/advance/symptoms/vision.dm new file mode 100644 index 0000000000..d74b0c6a5d --- /dev/null +++ b/code/datums/diseases/advance/symptoms/vision.dm @@ -0,0 +1,50 @@ +/* +////////////////////////////////////// + +Hyphema (Eye bleeding) + + Slightly noticable. + Lowers resistance tremendously. + Decreases stage speed tremendously. + Decreases transmittablity. + Critical Level. + +Bonus + Causes blindness. + +////////////////////////////////////// +*/ + +/datum/symptom/visionloss + name = "Hyphema" + stealth = -1 + resistance = -4 + stage_speed = -4 + transmittable = -3 + level = 5 + severity = 4 + +/datum/symptom/visionloss/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/carbon/M = A.affected_mob + var/obj/item/organ/internal/eyes/eyes = M.internal_organs_by_name[O_EYES] + if(!eyes) + return + switch(A.stage) + if(1, 2) + to_chat(M, span_warning("Your eyes itch.")) + if(3, 4) + to_chat(M, span_boldwarning("Your eyes burn!")) + M.eye_blurry = 20 + eyes.take_damage(1) + else + to_chat(M, span_userdanger("Your eyes burn horrificly!")) + M.eye_blurry = 40 + eyes.take_damage(5) + if(eyes.damage >= 10) + M.disabilities |= NEARSIGHTED + if(prob(eyes.damage - 10 + 1)) + if(!M.eye_blind) + to_chat(M, span_userdanger("You go blind!")) + M.Blind(20) diff --git a/code/datums/diseases/advance/symptoms/vomit.dm b/code/datums/diseases/advance/symptoms/vomit.dm new file mode 100644 index 0000000000..06c2b0fafb --- /dev/null +++ b/code/datums/diseases/advance/symptoms/vomit.dm @@ -0,0 +1,34 @@ +/* +////////////////////////////////////// + +Vomiting + + Noticeable. + No change to resistance. + Slightly increases stage speed. + Increases transmissibility. + Medium Level. + +Bonus + Forces the affected mob to vomit + +////////////////////////////////////// +*/ + +/datum/symptom/vomit + name = "Vomiting" + stealth = -2 + resistance = 0 + stage_speed = 1 + transmittable = 2 + level = 3 + severity = 1 + +/datum/symptom/vomit/Activate(datum/disease/advance/A) + if(!..()) + return + var/mob/living/M = A.affected_mob + if(prob(2)) + to_chat(M, span_warning(pick("you feel nauseated.", "You feel like you're going to throw up!"))) + if(prob(SYMPTOM_ACTIVATION_PROB)) + M.vomit() diff --git a/code/datums/diseases/advance/symptoms/weakness.dm b/code/datums/diseases/advance/symptoms/weakness.dm new file mode 100644 index 0000000000..917be5a46c --- /dev/null +++ b/code/datums/diseases/advance/symptoms/weakness.dm @@ -0,0 +1,43 @@ +/* +////////////////////////////////////// + +Weakness + + Slightly noticeable. + Lowers resistance slightly. + Decreases stage speed moderately. + Decreases transmittablity moderately. + Moderate Level. + +Bonus + Weakens the host + +////////////////////////////////////// +*/ + +/datum/symptom/weakness + name = "Weakness" + stealth = -1 + resistance = -1 + stage_speed = -2 + transmittable = -2 + level = 3 + severity = 3 + +/datum/symptom/weakness/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + switch(A.stage) + if(1, 2) + to_chat(M, span_warning(pick("You feel weak.", "You feel lazy."))) + if(3, 4) + to_chat(M, span_boldwarning(pick("You feel very frail.", "You think you might faint."))) + M.Weaken(10) + else + to_chat(M, span_userdanger(pick("You feel tremendously weak!", "Your body trembles as exhaustion creeps over you."))) + M.Weaken(20) + if(M.weakened > 60 && !M.stat) + M.visible_message(span_warning("[M] faints!"), span_userdanger("You swoon and faint...")) + M.AdjustSleeping(10) + return diff --git a/code/datums/diseases/advance/symptoms/weigh.dm b/code/datums/diseases/advance/symptoms/weigh.dm new file mode 100644 index 0000000000..ceca8a77f5 --- /dev/null +++ b/code/datums/diseases/advance/symptoms/weigh.dm @@ -0,0 +1,37 @@ +/* +////////////////////////////////////// + +Weight Loss + + Very Very Noticable. + Decreases resistance. + Decreases stage speed. + Reduced Transmittable. + High level. + +Bonus + Decreases the weight of the mob, + forcing it to be skinny. + +////////////////////////////////////// +*/ + +/datum/symptom/weight_loss + name = "Weight Loss" + stealth = -3 + resistance = -2 + stage_speed = -2 + transmittable = -2 + level = 3 + severity = 1 + +/datum/symptom/weight_loss/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + switch(A.stage) + if(1, 2, 3, 4) + to_chat(M, span_warning(pick("You feel hungry.", "You crave for food."))) + else + to_chat(M, span_warning(pick("So hungry...", "You'd kill someone for a bite of food...", "Hunger cramps seize you..."))) + M.adjust_nutrition(-20) diff --git a/code/datums/diseases/anxiety.dm b/code/datums/diseases/anxiety.dm new file mode 100644 index 0000000000..78b630bc15 --- /dev/null +++ b/code/datums/diseases/anxiety.dm @@ -0,0 +1,53 @@ +/datum/disease/anxiety + name = "Severe Anxiety" + form = "Infection" + max_stages = 4 + spread_text = "On contact" + spread_flags = CONTACT_GENERAL + cure_text = "Ethanol" + cures = list("ethanol") + agent = "Excess Lepdopticides" + viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/monkey) + desc = "If left untreated subject will regurgitate butterflies." + severity = MINOR + +/datum/disease/anxiety/stage_act() + if(!..()) + return FALSE + switch(stage) + if(2) + if(prob(15)) + to_chat(affected_mob, span_notice("You feel anxious.")) + if(3) + if(prob(10)) + to_chat(affected_mob, span_notice("Your stomach flutters.")) + if(prob(5)) + to_chat(affected_mob, span_notice("You feel panicky.")) + if(prob(2)) + to_chat(affected_mob, span_danger("You're overtaken with panic!")) + affected_mob.AdjustConfused(rand(4, 6)) + if(4) + if(prob(10)) + to_chat(affected_mob, span_danger("You feel butterflies in your stomach.")) + if(prob(5)) + affected_mob.visible_message( + span_danger("[affected_mob] stumbles around in a panic"), + span_userdanger("You have a panic attack!") + ) + affected_mob.AdjustConfused(rand(12, 16)) + affected_mob.jitteriness = rand(12, 16) + if(prob(2)) + affected_mob.visible_message( + span_danger("[affected_mob] coughs up butterflies!"), + span_userdanger("You cough up butterflies!") + ) + affected_mob.emote("cough") + for(var/i in 1 to 2) + var/mob/living/simple_mob/animal/sif/glitterfly/B = new(affected_mob.loc) + addtimer(CALLBACK(B, TYPE_PROC_REF(/mob/living/simple_mob/animal/sif/glitterfly, decompose)), rand(5, 25) SECONDS) + +/mob/living/simple_mob/animal/sif/glitterfly/proc/decompose() + visible_message( + span_notice("[src] decomposes due to being outside of its original habitat for too long!"), + span_userdanger("You decompose for being too long out of your habitat!")) + dust() diff --git a/code/datums/diseases/beesease.dm b/code/datums/diseases/beesease.dm new file mode 100644 index 0000000000..a867c8d9d9 --- /dev/null +++ b/code/datums/diseases/beesease.dm @@ -0,0 +1,36 @@ +/datum/disease/beesease + name = "Beesease" + form = "Infection" + max_stages = 4 + spread_text = "On contact" + spread_flags = CONTACT_GENERAL + cure_text = "Sugar" + cures = list("sugar") + agent = "Apidae Infection" + viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/monkey) + desc = "If left untreated, subject will regurgitate bees." + severity = BIOHAZARD + +/datum/disease/beesease/stage_act() + if(!..()) + return FALSE + switch(stage) + if(2) + if(prob(2)) + to_chat(affected_mob, span_notice("You tastey hone in your mouth.")) + if(3) + if(prob(10)) + to_chat(affected_mob, span_notice("Your stomach rumbles")) + if(prob(2)) + to_chat(affected_mob, span_notice("Your stomach stings painfully.")) + if(prob(20)) + affected_mob.adjustToxLoss(2) + if(4) + if(prob(10)) + affected_mob.visible_message(span_danger("[affected_mob] buzzles loudly"), span_userdanger("Your stomach buzzles violently!")) + if(prob(5)) + to_chat(affected_mob, span_danger("You feel something moving in your throat.")) + if(prob(1)) + affected_mob.visible_message(span_danger("[affected_mob] coughs up a swarm of bees!"), span_userdanger("You cough up a swarm of bees!")) + new /mob/living/simple_mob/vore/bee(affected_mob.loc) + return diff --git a/code/datums/diseases/brainrot.dm b/code/datums/diseases/brainrot.dm new file mode 100644 index 0000000000..57899ef201 --- /dev/null +++ b/code/datums/diseases/brainrot.dm @@ -0,0 +1,43 @@ +/datum/disease/brainrot + name = "Brainrot" + max_stages = 4 + spread_text = "On contact" + spread_flags = CONTACT_GENERAL + cure_text = "Alkysine" + cures = list("alkysine") + agent = "Cryptococcus Cosmosis" + viable_mobtypes = list(/mob/living/carbon/human) + cure_chance = 15 + desc = "This disease destroys the braincells, causing brain fever, brain necrosis and general intoxication." + required_organs = list(/obj/item/organ/internal/brain) + severity = HARMFUL + +/datum/disease/brainrot/stage_act() + if(!..()) + return FALSE + switch(stage) + if(2) + if(prob(2)) + affected_mob.say("*blink") + if(prob(2)) + affected_mob.say("*yawn") + if(prob(2)) + to_chat(affected_mob, span_danger("You don't feel like yourself.")) + if(prob(5)) + affected_mob.adjustBrainLoss(1) + if(3) + if(prob(2)) + affected_mob.say("*stare") + if(prob(3)) + affected_mob.say("*drool") + if(prob(10) && affected_mob.getBrainLoss() < 100) + affected_mob.adjustBrainLoss(3) + if(prob(2)) + to_chat(affected_mob, span_danger("Strange buzzing fills your head, removing all thoughts.")) + if(prob(3)) + to_chat(affected_mob, span_danger("You lose consciousness...")) + affected_mob.Sleeping(rand(5, 10)) + if(prob(1)) + affected_mob.emote("snore") + if(prob(15)) + affected_mob.apply_effect(5, STUTTER) diff --git a/code/datums/diseases/choreomania.dm b/code/datums/diseases/choreomania.dm new file mode 100644 index 0000000000..9fd41c4cd6 --- /dev/null +++ b/code/datums/diseases/choreomania.dm @@ -0,0 +1,38 @@ +/datum/disease/choreomania + name = "Choreomania" + max_stages = 3 + spread_text = "Airborne" + cure_text = "Adranol" + cures = list("adranol") + cure_chance = 10 + agent = "TAP-DAnC3" + viable_mobtypes = list(/mob/living/carbon/human) + permeability_mod = 0.75 + desc = "If left untreated the subject... Won't stop dancing!" + severity = MINOR + + var/list/dance = list(2,4,8,2,4,8,2,4,8,2,4,8,1,4,1,4,1,4,2,4,8,2) + +/datum/disease/choreomania/stage_act() + if(!..()) + return FALSE + switch(stage) + if(2) + if(prob(1)) + to_chat(affected_mob, span_notice("You feel like dancing like a maniac, maniac...")) + if(prob(1)) + affected_mob.emote("whistle") + if(3) + if(prob(1)) + to_chat(affected_mob, span_notice("You feel like dancing like a maniac, maniac...")) + if(prob(1)) + to_chat(affected_mob, span_notice("You really want to start a conga line!")) + if(prob(2)) + for(var/D in dance) + affected_mob.dir = D + animate(affected_mob, pixel_x = 5, time = 5) + sleep(3) + animate(affected_mob, pixel_x = -5, time = 5) + animate(pixel_x = affected_mob.default_pixel_x, pixel_y = affected_mob.default_pixel_x, time = 2) + sleep(3) + return diff --git a/code/datums/diseases/cold.dm b/code/datums/diseases/cold.dm new file mode 100644 index 0000000000..c6b6cf0f17 --- /dev/null +++ b/code/datums/diseases/cold.dm @@ -0,0 +1,64 @@ +/datum/disease/cold + name = "The Cold" + max_stages = 3 + spread_text = "Airborne" + spread_flags = AIRBORNE + cure_text = "Rest & Spaceacilin" + cures = list("spaceacilin") + agent = "XY-rhinovirus" + viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/monkey) + permeability_mod = 0.5 + desc = "If left untreated the subject will contract the flu." + severity = MINOR + +/datum/disease/cold/stage_act() + if(!..()) + return FALSE + switch(stage) + if(2) + if(affected_mob.stat == UNCONSCIOUS && prob(40)) + to_chat(affected_mob, span_notice("You feel better.")) + cure() + return + if(affected_mob.lying && prob(10)) + to_chat(affected_mob, span_notice("You feel better.")) + cure() + return + if(prob(1) && prob(5)) + to_chat(affected_mob, span_notice("You feel better.")) + cure() + return + if(prob(1)) + affected_mob.emote("sneeze") + if(prob(1)) + affected_mob.emote("cough") + if(prob(1)) + to_chat(affected_mob, span_notice("Your throat feels sore.")) + if(prob(1)) + to_chat(affected_mob, span_notice("Mucous runs down the back of your throat.")) + if(3) + if(affected_mob.stat == UNCONSCIOUS && prob(25)) + to_chat(affected_mob, span_notice("You feel better.")) + cure() + return + if(affected_mob.lying && prob(5)) + to_chat(affected_mob, span_notice("You feel better.")) + cure() + return + if(prob(1) && prob(1)) + to_chat(affected_mob, span_notice("You feel better.")) + cure() + return + if(prob(1)) + affected_mob.emote("sneeze") + if(prob(1)) + affected_mob.emote("cough") + if(prob(1)) + to_chat(affected_mob, span_notice("Your throat feels sore.")) + if(prob(1)) + to_chat(affected_mob, span_notice("Mucous runs down the back of your throat.")) + if(prob(1) && prob(50)) + if(!affected_mob.resistances.Find(/datum/disease/flu)) + var/datum/disease/Flu = new /datum/disease/flu(0) + affected_mob.ContractDisease(Flu) + cure() diff --git a/code/datums/diseases/cold9.dm b/code/datums/diseases/cold9.dm new file mode 100644 index 0000000000..a0fa691976 --- /dev/null +++ b/code/datums/diseases/cold9.dm @@ -0,0 +1,30 @@ +/datum/disease/cold9 + name = "The Cold" + medical_name = "ICE9 Cold" + max_stages = 3 + spread_text = "On contact" + spread_flags = CONTACT_GENERAL + cure_text = "Spaceacillin" + cures = list("spaceacillin") + agent = "ICE9-rhinovirus" + viable_mobtypes = list(/mob/living/carbon/human) + desc = "If left untreated the subject will slow, as if partly frozen." + severity = HARMFUL + +/datum/disease/cold9/stage_act() + if(!..()) + return FALSE + if(stage < 2) + return + + var/stage_factor = stage - 1 + affected_mob.bodytemperature -= 7.5 * stage_factor + if(prob(2 * stage_factor)) + affected_mob.say("*sneeze") + if(prob(2 * stage_factor)) + affected_mob.say("*cough") + if(prob(3 * stage_factor)) + to_chat(affected_mob, span_danger("Your throat feels sore.")) + if(prob(5 * stage_factor)) + to_chat(affected_mob, span_danger("You feel stiff.")) + affected_mob.adjustFireLoss(1) diff --git a/code/datums/diseases/darkness.dm b/code/datums/diseases/darkness.dm new file mode 100644 index 0000000000..b340ca5d45 --- /dev/null +++ b/code/datums/diseases/darkness.dm @@ -0,0 +1,10 @@ +/datum/disease/darkness + name = "Dark Exposure" + form = "Bluespace Micro-fissures" + max_stages = 4 + spread = NON_CONTAGIOUS + cure_text = "Exposure to light and the real world" + agent = "Bluespace Exposure" + viable_mobtypes = list(/mob/living/carbon/human) + desc = "If left untreated, subject will lose grip on reality." + severity = HARMFUL diff --git a/code/datums/diseases/flu.dm b/code/datums/diseases/flu.dm new file mode 100644 index 0000000000..6a30af6f85 --- /dev/null +++ b/code/datums/diseases/flu.dm @@ -0,0 +1,50 @@ +/datum/disease/flu + name = "The Flu" + max_stages = 3 + spread_text = "Airborne" + cure_text = "Spaceacilin" + cures = list("spaceacilin") + cure_chance = 10 + agent = "H13N1 flu virion" + viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/monkey) + permeability_mod = 0.75 + desc = "If left untreated the subject will feel quite unwell." + severity = MINOR + +/datum/disease/flu/stage_act() + if(!..()) + return FALSE + switch(stage) + if(2) + if(affected_mob.lying && prob(20)) + to_chat(affected_mob, span_notice("You feel better.")) + stage-- + return + if(prob(1)) + affected_mob.emote("sneeze") + if(prob(1)) + affected_mob.emote("cough") + if(prob(1)) + to_chat(affected_mob, span_danger("Your muscles ache.")) + if(prob(20)) + affected_mob.apply_damage(1) + if(prob(1)) + to_chat(affected_mob, span_danger("Your stomach hurts.")) + affected_mob.adjustToxLoss(1) + if(3) + if(affected_mob.lying && prob(15)) + to_chat(affected_mob, span_notice("You feel better.")) + stage-- + return + if(prob(1)) + affected_mob.emote("sneeze") + if(prob(1)) + affected_mob.emote("cough") + if(prob(1)) + to_chat(affected_mob, span_danger("Your muscles ache.")) + if(prob(20)) + affected_mob.apply_damage(1) + if(prob(1)) + to_chat(affected_mob, span_danger("Your stomach hurts.")) + affected_mob.adjustToxLoss(1) + return diff --git a/code/datums/diseases/food_poisoning.dm b/code/datums/diseases/food_poisoning.dm new file mode 100644 index 0000000000..cbb7a0c804 --- /dev/null +++ b/code/datums/diseases/food_poisoning.dm @@ -0,0 +1,67 @@ +/datum/disease/food_poisoning + name = "Food Poisoning" + max_stages = 3 + stage_prob = 5 + spread_text = "Non-Contagious" + spread_flags = NON_CONTAGIOUS + cure_text = "Sleep" + agent = "Salmonella" + cures = list("chicken_soup") + cure_chance = 10 + viable_mobtypes = list(/mob/living/carbon/human) + desc = "Nausea, sickness, and vomitting." + severity = MINOR + disease_flags = CURABLE + virus_heal_resistant = TRUE + +/datum/disease/food_poisoning/stage_act() + if(!..()) + return FALSE + if(affected_mob.stat == UNCONSCIOUS && prob(33)) + to_chat(affected_mob, span_notice("You feel better.")) + cure() + return + switch(stage) + if(1) + if(prob(5)) + to_chat(affected_mob, span_danger("Your stomach feels weird.")) + if(prob(5)) + to_chat(affected_mob, span_danger("You feel queasy.")) + if(2) + if(affected_mob.stat == UNCONSCIOUS && prob(40)) + to_chat(affected_mob, span_notice("You feel better.")) + cure() + return + if(prob(1) && prob(10)) + to_chat(affected_mob, span_notice("You feel better.")) + if(prob(10)) + affected_mob.emote("groan") + if(prob(5)) + to_chat(affected_mob, span_danger("Your stomach aches.")) + if(prob(5)) + to_chat(affected_mob, span_danger("You feel nauseous")) + if(3) + if(affected_mob.stat == UNCONSCIOUS && prob(25)) + to_chat(affected_mob, span_notice("You feel better.")) + cure() + return + if(prob(1) && prob(10)) + to_chat(affected_mob, span_notice("You feel better.")) + cure() + return + if(prob(10)) + affected_mob.emote("moan") + if(prob(10)) + affected_mob.emote("groan") + if(prob(1)) + to_chat(affected_mob, span_danger("Your stomach hurts.")) + if(prob(1)) + to_chat(affected_mob, span_danger("You feel sick.")) + if(prob(5)) + if(affected_mob.nutrition > 10) + affected_mob.emote("vomit") + else + to_chat(affected_mob, span_danger("Your stomach lurches painfully")) + affected_mob.visible_message(span_danger("[affected_mob] gags and retches!")) + affected_mob.Stun(rand(4, 8)) + affected_mob.Weaken(rand(4, 8)) diff --git a/code/datums/diseases/lycancoughy.dm b/code/datums/diseases/lycancoughy.dm new file mode 100644 index 0000000000..6d8f106163 --- /dev/null +++ b/code/datums/diseases/lycancoughy.dm @@ -0,0 +1,64 @@ +/datum/disease/lycan + name = "Lycancoughy" + form = "Infection" + max_stages = 4 + spread_text = "On contact" + spread_flags = CONTACT_GENERAL + cure_text = "Ethanol" + cures = list("ethanol") + agent = "Excess Snuggles" + viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/monkey) + desc = "If left untreated subject will regurgitate... puppies." + severity = HARMFUL + var/barklimit + var/list/puppy_types = list(/mob/living/simple_mob/animal/passive/dog/corgi/puppy) + var/list/plush_types = list(/obj/item/toy/plushie/orange_fox, /obj/item/toy/plushie/corgi, /obj/item/toy/plushie/robo_corgi, /obj/item/toy/plushie/pink_fox) + +/datum/disease/lycan/stage_act() + if(!..()) + return FALSE + + var/mob/living/carbon/human/H = affected_mob + + switch(stage) + if(2) + if(prob(2)) + H.emote("cough") + if(prob(3)) + to_chat(H, span_notice("You itch.")) + H.adjustBruteLoss(rand(4, 6)) + if(3) + var/obj/item/organ/external/stomach = H.organs_by_name[pick("torso", "groin")] + + if(prob(3)) + H.emote("cough") + stomach.take_damage(BRUTE, rand(0, 5)) + if(prob(3)) + to_chat(H, span_notice("You hear a faint barking.")) + stomach.take_damage(BRUTE, rand(4, 6)) + if(prob(2)) + to_chat(H, span_notice("You crave meat.")) + if(prob(3)) + to_chat(H, span_danger("Your stomach growls!")) + stomach.take_damage(BRUTE, rand(5, 10)) + if(4) + var/obj/item/organ/external/stomach = H.organs_by_name[pick("torso", "groin")] + + if(prob(5)) + H.emote("cough") + stomach.take_damage(BRUTE, rand(0, 5)) + if(prob(5)) + H.emote("awoo2") + H.Confuse(rand(12, 16)) + stomach.take_damage(rand(0, 5)) + if(prob(5)) + if(!barklimit) + to_chat(H, span_danger("Your stomach growls!")) + stomach.take_damage(BRUTE, rand(5, 10)) + else + var/atom/hairball = pick(prob(50) ? puppy_types : plush_types) + H.visible_message(span_danger("[H] coughs up \a [initial(hairball.name)]!"), span_userdanger("You cough up \a [initial(hairball.name)]?!")) + H.emote("cough") + new hairball(H.loc) + barklimit-- + stomach.take_damage(BRUTE, rand(10, 15)) diff --git a/code/datums/diseases/magnitis.dm b/code/datums/diseases/magnitis.dm new file mode 100644 index 0000000000..24b2261cda --- /dev/null +++ b/code/datums/diseases/magnitis.dm @@ -0,0 +1,63 @@ +/datum/disease/magnitis + name = "Magnitis" + max_stages = 4 + spread_text = "Airbone" + cure_text = "Iron" + cures = list("iron") + agent = "Fukkos Miracos" + viable_mobtypes = list(/mob/living/carbon/human) + permeability_mod = 0.75 + desc = "This disease disrupts the magnetic field of your body, making it act as if a powerful magnet. Injections of iron help stabilize the field." + severity = MINOR + +/datum/disease/magnitis/stage_act() + if(!..()) + return FALSE + switch(stage) + if(2) + if(prob(2)) + to_chat(affected_mob, span_danger("You feel a slight shock course through your body.")) + if(prob(2)) + for(var/obj/M in orange(2, affected_mob)) + if(!M.anchored && prob(5)) + INVOKE_ASYNC(M, TYPE_PROC_REF(/atom/movable, throw_at), affected_mob, rand(3, 10), rand(1, 3), src) + for(var/mob/living/silicon/S in orange(2, affected_mob)) + if(isAI(S)) continue + INVOKE_ASYNC(S, TYPE_PROC_REF(/atom/movable, throw_at), affected_mob, rand(3, 10), rand(1, 3), src) + if(3) + if(prob(2)) + to_chat(affected_mob, span_danger("You feel a strong shock course through your body.")) + if(prob(2)) + to_chat(affected_mob, span_danger("You feel like clowning aound.")) + if(prob(4)) + for(var/obj/M in orange(4, affected_mob)) + if(!M.anchored && prob(5)) + var/i + var/iter = rand(1,2) + for(i=0,i (occupant.getMaxHealth() / 2) ? span_blue(health_text) : span_red(health_text)) dat += "
" - if(occupant.virus2.len) - dat += span_red("Viral pathogen detected in blood stream.") + "
" + if(occupant.viruses.len) + for(var/datum/disease/D in occupant.GetViruses()) + if(D.visibility_flags & HIDDEN_SCANNER) + continue + else + dat += span_red("Viral pathogen detected in blood stream.") + "
" var/damage_string = null damage_string = "\t-Brute Damage %: [occupant.getBruteLoss()]" diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 1fb0455476..00339ac273 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -172,8 +172,10 @@ medical["empty"] = 1 if(MED_DATA_V_DATA) data["virus"] = list() - for(var/ID in virusDB) - var/datum/data/record/v = virusDB[ID] + for(var/datum/disease/D in active_diseases) + if(!D.discovered) + continue + var/datum/data/record/v = active_diseases[D] data["virus"] += list(list("name" = v.fields["name"], "D" = "\ref[v]")) if(MED_DATA_MEDBOT) data["medbots"] = list() diff --git a/code/game/machinery/pandemic.dm b/code/game/machinery/pandemic.dm new file mode 100644 index 0000000000..ae8687d665 --- /dev/null +++ b/code/game/machinery/pandemic.dm @@ -0,0 +1,377 @@ +/obj/machinery/computer/pandemic + name = "PanD.E.M.I.C 2200" + desc = "Used to work with viruses." + density = TRUE + anchored = TRUE + icon = 'icons/obj/pandemic.dmi' + icon_state = "pandemic0" + var/temp_html = "" + var/printing = null + var/wait = null + var/selected_strain_index = 1 + var/obj/item/reagent_containers/beaker = null + +/obj/machinery/computer/pandemic/Initialize(mapload) + . = ..() + update_icon() + +/obj/machinery/computer/pandemic/set_broken() + stat |= BROKEN + update_icon() + +/obj/machinery/computer/pandemic/proc/GetViruses() + if(beaker && beaker.reagents) + if(length(beaker.reagents.reagent_list)) + var/datum/reagent/blood/BL = locate() in beaker.reagents.reagent_list + if(BL) + if(BL.data && BL.data["viruses"]) + var/list/viruses = BL.data["viruses"] + return viruses + +/obj/machinery/computer/pandemic/proc/GetVirusByIndex(index) + var/list/viruses = GetViruses() + if(viruses && index > 0 && index <= length(viruses)) + return viruses[index] + +/obj/machinery/computer/pandemic/proc/GetResistances() + if(beaker && beaker.reagents) + if(length(beaker.reagents.reagent_list)) + var/datum/reagent/blood/BL = locate() in beaker.reagents.reagent_list + if(BL) + if(BL.data && BL.data["resistances"]) + var/list/resistances = BL.data["resistances"] + return resistances + +/obj/machinery/computer/pandemic/proc/GetResistancesByIndex(index) + var/list/resistances = GetResistances() + if(resistances && index > 0 && index <= length(resistances)) + return resistances[index] + +/obj/machinery/computer/pandemic/proc/GetVirusTypeByIndex(index) + var/datum/disease/D = GetVirusByIndex(index) + if(D) + return D.GetDiseaseID() + +/obj/machinery/computer/pandemic/proc/replicator_cooldown(waittime) + wait = 1 + update_icon() + spawn(waittime) + wait = null + update_icon() + playsound(loc, 'sound/machines/ping.ogg', 30, 1) + +/obj/machinery/computer/pandemic/update_icon() + if(stat & BROKEN) + icon_state = (beaker ? "pandemic1_b" : "pandemic0_b") + return + icon_state = "pandemic[(beaker)?"1":"0"][!(stat & NOPOWER) ? "" : "_nopower"]" + +/obj/machinery/computer/pandemic/proc/create_culture(name, bottle_type = "culture", cooldown = 50) + var/obj/item/reagent_containers/glass/bottle/B = new/obj/item/reagent_containers/glass/bottle(loc) + B.icon_state = "bottle10" + B.pixel_x = rand(-3, 3) + B.pixel_y = rand(-3, 3) + replicator_cooldown(cooldown) + B.name = "[name] [bottle_type] bottle" + return B + +/obj/machinery/computer/pandemic/tgui_act(action, params, datum/tgui/ui, datum/tgui_state/state) + if(..()) + return + if(inoperable()) + return + + . = TRUE + + switch(action) + if("clone_strain") + if(wait) + atom_say("The replicator is not ready yet.") + return + + var/strain_index = text2num(params["strain_index"]) + if(isnull(strain_index)) + atom_say("Unable to respond to command.") + return + var/datum/disease/virus = GetVirusByIndex(strain_index) + var/datum/disease/D = null + if(!virus) + atom_say("Unable to find requested strain.") + return + var/type = virus.GetDiseaseID() + if(!ispath(type)) + var/datum/disease/advance/A = GLOB.archive_diseases[type] + if(A) + D = new A.type(0, A) + else if(type) + if(type in GLOB.diseases) // Make sure this is a disease + D = new type(0, null) + if(!D) + atom_say("Unable to synthesize requested strain.") + return + var/default_name = "" + if(D.name == "Unknown" || D.name == "") + default_name = replacetext(beaker.name, new/regex(" culture bottle\\Z", "g"), "") + else + default_name = D.name + var/name = tgui_input_text(usr, "Name:", "Name the culture", default_name, MAX_NAME_LEN) + if(name == null || wait) + return + var/obj/item/reagent_containers/glass/bottle/B = create_culture(name) + B.desc = "A small bottle. Contains [D.agent] culture in synthblood medium." + B.reagents.add_reagent("blood", 20, list("viruses" = list(D))) + if("clone_vaccine") + if(wait) + atom_say("The replicator is not ready yet.") + return + + var/resistance_index = text2num(params["resistance_index"]) + if(isnull(resistance_index)) + atom_say("Unable to find requested antibody.") + return + var/vaccine_type = GetResistancesByIndex(resistance_index) + var/vaccine_name = "Unknown" + if(!ispath(vaccine_type)) + if(GLOB.archive_diseases[vaccine_type]) + var/datum/disease/D = GLOB.archive_diseases[vaccine_type] + if(D) + vaccine_name = D.name + else if(vaccine_type) + var/datum/disease/D = new vaccine_type(0, null) + if(D) + vaccine_name = D.name + + if(!vaccine_type) + atom_say("Unable to synthesize requested antibody.") + return + + var/obj/item/reagent_containers/glass/bottle/B = create_culture(vaccine_name, "vaccine", 200) + B.reagents.add_reagent("vaccine", 15, list(vaccine_type)) + if("eject_beaker") + eject_beaker() + update_tgui_static_data(ui.user) + if("destroy_eject_beaker") + beaker.reagents.clear_reagents() + eject_beaker() + update_tgui_static_data(ui.user) + if("print_release_forms") + var/strain_index = text2num(params["strain_index"]) + if(isnull(strain_index)) + atom_say("Unable to respond to command.") + return + var/type = GetVirusTypeByIndex(strain_index) + if(!type) + atom_say("Unable to find requested strain.") + return + var/datum/disease/advance/A = GLOB.archive_diseases[type] + if(!A) + atom_say("Unable to find requested strain.") + return + print_form(A, usr) + if("name_strain") + var/strain_index = text2num(params["strain_index"]) + if(isnull(strain_index)) + atom_say("Unable to respond to command.") + return + var/type = GetVirusTypeByIndex(strain_index) + if(!type) + atom_say("Unable to find requested strain.") + return + var/datum/disease/advance/A = GLOB.archive_diseases[type] + if(!A) + atom_say("Unable to find requested strain.") + return + if(A.name != "Unknown") + atom_say("Request rejected. Strain already has a name.") + return + var/new_name = tgui_input_text(usr, "Name the Strain", "New Name", max_length = MAX_NAME_LEN) + if(!new_name) + return + A.AssignName(new_name) + for(var/datum/disease/advance/AD in active_diseases) + AD.Refresh() + update_tgui_static_data(ui.user) + if("switch_strain") + var/strain_index = text2num(params["strain_index"]) + if(isnull(strain_index) || strain_index < 1) + atom_say("Unable to respond to command.") + return + var/list/viruses = GetViruses() + if(strain_index > length(viruses)) + atom_say("Unable to find requested strain.") + return + selected_strain_index = strain_index; + else + return FALSE + +/obj/machinery/computer/pandemic/tgui_state(mob/user) + return GLOB.tgui_default_state + +/obj/machinery/computer/pandemic/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui = null) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "PanDEMIC", name) + ui.open() + +/obj/machinery/computer/pandemic/tgui_data(mob/user) + var/datum/reagent/blood/Blood = null + if(beaker) + var/datum/reagents/R = beaker.reagents + for(var/datum/reagent/blood/B in R.reagent_list) + if(B) + Blood = B + break + + var/list/data = list( + "synthesisCooldown" = wait ? TRUE : FALSE, + "beakerLoaded" = beaker ? TRUE : FALSE, + "beakerContainsBlood" = Blood ? TRUE : FALSE, + "beakerContainsVirus" = length(Blood?.data["viruses"]) != 0, + "selectedStrainIndex" = selected_strain_index, + ) + + return data + +/obj/machinery/computer/pandemic/tgui_static_data(mob/user) + var/list/data = list() + . = data + + var/datum/reagent/blood/Blood = null + if(beaker) + var/datum/reagents/R = beaker.reagents + for(var/datum/reagent/blood/B in R.reagent_list) + if(B) + Blood = B + break + + var/list/strains = list() + for(var/datum/disease/D in GetViruses()) + if(D.visibility_flags & HIDDEN_PANDEMIC) + continue + + var/list/symptoms = list() + if(istype(D, /datum/disease/advance)) + var/datum/disease/advance/A = D + D = GLOB.archive_diseases[A.GetDiseaseID()] + if(!D) + CRASH("We weren't able to get the advance disease from the archive.") + for(var/datum/symptom/S in A.symptoms) + symptoms += list(list( + "name" = S.name, + "stealth" = S.stealth, + "resistance" = S.resistance, + "stageSpeed" = S.stage_speed, + "transmissibility" = S.transmittable, + "complexity" = S.level, + )) + + strains += list(list( + "commonName" = D.name, + "description" = D.desc, + "bloodDNA" = Blood.data["blood_DNA"], + "bloodType" = Blood.data["blood_type"], + "diseaseAgent" = D.agent, + "possibleTreatments" = D.cure_text, + "transmissionRoute" = D.spread_text, + "symptoms" = symptoms, + "isAdvanced" = istype(D, /datum/disease/advance), + )) + data["strains"] = strains + + var/list/resistances = list() + for(var/resistance in GetResistances()) + if(!ispath(resistance)) + var/datum/disease/D = GLOB.archive_diseases[resistance] + if(D) + resistances += list(D.name) + else if(resistance) + var/datum/disease/D = new resistance(0, null) + if(D) + resistances += list(D.name) + data["resistances"] = resistances + +/obj/machinery/computer/pandemic/proc/eject_beaker() + set name = "Eject Beaker" + set category = "Object" + set src in oview(1) + + if(usr.stat != 0) + return + + beaker.forceMove(loc) + beaker = null + icon_state = "pandemic0" + selected_strain_index = 1 + +/obj/machinery/computer/pandemic/proc/print_form(datum/disease/advance/D, mob/living/user) + D = GLOB.archive_diseases[D.GetDiseaseID()] + if(!(printing) && D) + var/reason = tgui_input_text(user,"Enter a reason for the release", "Write", multiline = TRUE) + if(!reason) + return + reason += "" + var/english_symptoms = list() + for(var/I in D.symptoms) + var/datum/symptom/S = I + english_symptoms += S.name + var/symtoms = english_list(english_symptoms) + + var/signature + if(tgui_alert(user, "Would you like to add your signature?", "Signature", list("Yes","No")) == "Yes") + signature = "[user ? user.real_name : "Anonymous"]" + else + signature = "" + + printing = 1 + var/obj/item/paper/P = new /obj/item/paper(loc) + visible_message(span_notice("[src] rattles and prints out a sheet of paper.")) + // playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1) + + P.info = "
Releasing Virus
" + P.info += "
" + P.info += "Name of the Virus: [D.name]
" + P.info += "Symptoms: [symtoms]
" + P.info += "Spreads by: [D.spread_text]
" + P.info += "Cured by: [D.cure_text]
" + P.info += "
" + P.info += "Reason for releasing: [reason]" + P.info += "
" + P.info += "The Virologist is responsible for any biohazards caused by the virus released.
" + P.info += "Virologist's sign: [signature]
" + P.info += "If approved, stamp below with the Chief Medical Officer's stamp, and/or the Captain's stamp if required:" + P.updateinfolinks() + P.name = "Releasing Virus - [D.name]" + printing = null + +/obj/machinery/computer/pandemic/attack_ai(mob/user) + return attack_hand(user) + +/obj/machinery/computer/pandemic/attack_hand(mob/user) + if(..()) + return + tgui_interact(user) + +/obj/machinery/computer/pandemic/attack_ghost(mob/user) + tgui_interact(user) + +/obj/machinery/computer/pandemic/attackby(obj/item/I, mob/user, params) + if(default_unfasten_wrench(user, I, 4 SECONDS)) + return + if(I.has_tool_quality(TOOL_SCREWDRIVER)) + eject_beaker() + return + if(istype(I, /obj/item/reagent_containers/glass) && I.is_open_container()) + if(stat & (NOPOWER|BROKEN)) + return + if(beaker) + to_chat(user, span_warning("A beaker is already loaded into the machine!")) + return + + user.drop_item() + beaker = I + beaker.loc = src + to_chat(user, span_notice("You add the beaker to the machine.")) + update_tgui_static_data(user) + icon_state = "pandemic1" + else + return ..() diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 18660273f7..84b47051aa 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -19,7 +19,7 @@ var/global/list/image/splatter_cache=list() blood_DNA = list() var/basecolor="#A10808" // Color when wet. var/synthblood = 0 - var/list/datum/disease2/disease/virus2 = list() + var/list/datum/disease/viruses = list() var/amount = 5 generic_filth = TRUE persistent = FALSE @@ -242,7 +242,7 @@ var/global/list/image/splatter_cache=list() icon_state = "mucus" random_icon_states = list("mucus") - var/list/datum/disease2/disease/virus2 = list() + var/list/datum/disease/viruses = list() var/dry = 0 // Keeps the lag down /obj/effect/decal/cleanable/mucus/Initialize() @@ -252,11 +252,10 @@ var/global/list/image/splatter_cache=list() //This version should be used for admin spawns and pre-mapped virus vectors (e.g. in PoIs), this version does not dry /obj/effect/decal/cleanable/mucus/mapped/Initialize() . = ..() - virus2 |= new /datum/disease2/disease - virus2[1].makerandom() + viruses |= new /datum/disease/advance /obj/effect/decal/cleanable/mucus/mapped/Destroy() - virus2.Cut() + viruses.Cut() return ..() #undef DRYING_TIME diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm index c15734b89d..e8a6083fed 100644 --- a/code/game/objects/effects/decals/Cleanable/misc.dm +++ b/code/game/objects/effects/decals/Cleanable/misc.dm @@ -113,7 +113,7 @@ icon = 'icons/effects/blood.dmi' icon_state = "vomit_1" random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4") - var/list/datum/disease2/disease/virus2 = list() + var/list/datum/disease/viruses = list() /obj/effect/decal/cleanable/tomato_smudge name = "tomato smudge" diff --git a/code/game/objects/items/devices/scanners/guide.dm b/code/game/objects/items/devices/scanners/guide.dm index de728cd854..403a81f974 100644 --- a/code/game/objects/items/devices/scanners/guide.dm +++ b/code/game/objects/items/devices/scanners/guide.dm @@ -97,8 +97,12 @@ dat += span_bold("Genetic damage") + " - Utilize cryogenic pod with appropriate chemicals (i.e. Cryoxadone) and below 70 K, or give Rezadone.
" if(bone) dat += span_bold("Bone fracture") + " - Splint damaged area. Treat with bone repair surgery or Osteodaxon after treating brute damage.
" - if(M.virus2.len) - dat += span_bold("Viral infection") + " - Proceed with virology pathogen curing procedures or apply antiviral chemicals (i.e. Corophizine).
" + if(M.viruses.len) + for(var/datum/disease/D in M.GetViruses()) + if(D.visibility_flags & HIDDEN_SCANNER) + continue + else + dat += span_bold("Viral Infection") + " - Inform a Virologist or the Chief Medical Officer and administer antiviral chemicals such as Spaceacilin. Limit exposure to other personnel.
" if(robotparts) dat += span_bold("Robotic body parts") + " - Should not be repaired by medical personnel, refer to robotics if damaged." diff --git a/code/game/objects/items/devices/scanners/health.dm b/code/game/objects/items/devices/scanners/health.dm index ec9a6b257c..c992702430 100644 --- a/code/game/objects/items/devices/scanners/health.dm +++ b/code/game/objects/items/devices/scanners/health.dm @@ -248,14 +248,14 @@ else dat += span_warning("Unknown substance[(unknown > 1)?"s":""] found in subject's dermis.") dat += "
" - if(C.virus2.len) - for (var/ID in C.virus2) - if (ID in virusDB) - var/datum/data/record/V = virusDB[ID] - dat += span_warning("Warning: Pathogen [V.fields["name"]] detected in subject's blood. Known antigen : [V.fields["antigen"]]") + if(C.resistances.len) + for (var/datum/disease/virus in C.GetViruses()) + if(virus.visibility_flags & HIDDEN_SCANNER || virus.visibility_flags & HIDDEN_PANDEMIC) + continue + if(virus.discovered) + dat += span_warning("Warning: [virus.name] detected in subject's blood.") dat += "
" - else - dat += span_warning("Warning: Unknown pathogen detected in subject's blood.") + dat += span_warning("Severity: [virus.severity]") dat += "
" if (M.getCloneLoss()) dat += span_warning("Subject appears to have been imperfectly cloned.") diff --git a/code/game/objects/items/weapons/circuitboards/computer/computer.dm b/code/game/objects/items/weapons/circuitboards/computer/computer.dm index c340f4958a..09535b45f5 100644 --- a/code/game/objects/items/weapons/circuitboards/computer/computer.dm +++ b/code/game/objects/items/weapons/circuitboards/computer/computer.dm @@ -154,14 +154,6 @@ build_path = /obj/machinery/computer/operating origin_tech = list(TECH_DATA = 2, TECH_BIO = 2) -/obj/item/circuitboard/curefab - name = T_BOARD("cure fabricator") - build_path = /obj/machinery/computer/curer - -/obj/item/circuitboard/splicer - name = T_BOARD("disease splicer") - build_path = /obj/machinery/computer/diseasesplicer - /obj/item/circuitboard/mining_shuttle name = T_BOARD("mining shuttle console") build_path = /obj/machinery/computer/shuttle_control/mining @@ -226,4 +218,4 @@ /obj/item/circuitboard/stockexchange name = T_BOARD("stock exchange console") build_path = /obj/machinery/computer/stockexchange - origin_tech = list(TECH_DATA = 2, TECH_MAGNET = 1) \ No newline at end of file + origin_tech = list(TECH_DATA = 2, TECH_MAGNET = 1) diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index e27d9ade0c..0e51b19eec 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -453,7 +453,7 @@ max_storage_space = ITEMSIZE_COST_SMALL * 12 max_w_class = ITEMSIZE_NORMAL w_class = ITEMSIZE_SMALL - can_hold = list(/obj/item/reagent_containers/glass/beaker/vial/,/obj/item/virusdish/) + can_hold = list(/obj/item/reagent_containers/glass/beaker/vial/) // ----------------------------- // Food Bag diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 4412b8af01..36f22f6f45 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -244,7 +244,6 @@ /obj/item/flashlight, /obj/item/cell/device, /obj/item/extinguisher/mini, - /obj/item/antibody_scanner, // VOREstation edit start /obj/item/sleevemate, /obj/item/mass_spectrometer, /obj/item/surgical, diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index 3704524cf1..d1df404333 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -300,7 +300,7 @@ /obj/item/storage/box/syndie_kit/viral starts_with = list( - /obj/item/virusdish/random = 3 + // /obj/item/virusdish/random = 3 ) /obj/item/storage/secure/briefcase/rifle diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 841ab7286b..6b46ba2acb 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -174,7 +174,7 @@ B.blood_DNA = list() if(!B.blood_DNA[M.dna.unique_enzymes]) B.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type - B.virus2 = virus_copylist(M.virus2) + B.viruses = M.viruses.Copy() return 1 //we bloodied the floor blood_splatter(src,M.get_blood(M.vessel),1) return 1 //we bloodied the floor diff --git a/code/modules/admin/admin_verb_lists_vr.dm b/code/modules/admin/admin_verb_lists_vr.dm index 28c9550ef8..4b29645516 100644 --- a/code/modules/admin/admin_verb_lists_vr.dm +++ b/code/modules/admin/admin_verb_lists_vr.dm @@ -187,7 +187,6 @@ var/list/admin_verbs_spawn = list( /client/proc/cmd_admin_droppod_spawn, /client/proc/respawn_character, /client/proc/spawn_character_mob, //VOREStation Add, - /client/proc/virus2_editor, /client/proc/spawn_chemdisp_cartridge, /client/proc/map_template_load, /client/proc/map_template_upload, @@ -196,7 +195,9 @@ var/list/admin_verbs_spawn = list( /client/proc/generic_structure, //VOREStation Add /client/proc/generic_item, //VOREStation Add /client/proc/create_gm_message, - /client/proc/remove_gm_message + /client/proc/remove_gm_message, + /client/proc/AdminCreateVirus, + /client/proc/ReleaseVirus ) var/list/admin_verbs_server = list( @@ -563,8 +564,9 @@ var/list/admin_verbs_event_manager = list( /client/proc/toggle_random_events, /client/proc/modify_server_news, /client/proc/toggle_spawning_with_recolour, - /client/proc/start_vote - + /client/proc/start_vote, + /client/proc/AdminCreateVirus, + /client/proc/ReleaseVirus ) /client/proc/add_admin_verbs() diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 65b85e4aa4..7bd3b1e4c1 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -283,37 +283,6 @@ message_admins(span_blue("[ckey] creating an admin explosion at [epicenter.loc].")) feedback_add_details("admin_verb","DB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/client/proc/give_disease2(mob/T as mob in mob_list) // -- Giacom - set category = "Fun.Event Kit" - set name = "Give Disease" - set desc = "Gives a Disease to a mob." - - var/datum/disease2/disease/D = new /datum/disease2/disease() - - var/severity = 1 - var/greater = tgui_input_list(usr, "Is this a lesser, greater, or badmin disease?", "Give Disease", list("Lesser", "Greater", "Badmin")) - switch(greater) - if ("Lesser") severity = 1 - if ("Greater") severity = 2 - if ("Badmin") severity = 99 - - D.makerandom(severity) - D.infectionchance = tgui_input_number(usr, "How virulent is this disease? (1-100)", "Give Disease", D.infectionchance, 100, 1) - - if(istype(T,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = T - if (H.species) - D.affected_species = list(H.species.get_bodytype()) - if(H.species.primitive_form) - D.affected_species |= H.species.primitive_form - if(H.species.greater_form) - D.affected_species |= H.species.greater_form - infect_virus2(T,D,1) - - feedback_add_details("admin_verb","GD2") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - log_admin("[key_name(usr)] gave [key_name(T)] a [greater] disease2 with infection chance [D.infectionchance].") - message_admins(span_blue("[key_name_admin(usr)] gave [key_name(T)] a [greater] disease2 with infection chance [D.infectionchance]."), 1) - /client/proc/admin_give_modifier(var/mob/living/L) set category = "Debug.Game" set name = "Give Modifier" diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm index fc2b918989..e59daf02ef 100644 --- a/code/modules/admin/view_variables/topic.dm +++ b/code/modules/admin/view_variables/topic.dm @@ -129,18 +129,6 @@ href_list["datumrefresh"] = href_list["give_wound_internal"] - - else if(href_list["give_disease2"]) - if(!check_rights(R_ADMIN|R_FUN|R_EVENT)) return - - var/mob/M = locate(href_list["give_disease2"]) - if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob") - return - - src.give_disease2(M) - href_list["datumrefresh"] = href_list["give_spell"] - else if(href_list["godmode"]) if(!check_rights(R_REJUVINATE)) return diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm new file mode 100644 index 0000000000..25e1ea5c4f --- /dev/null +++ b/code/modules/events/disease_outbreak.dm @@ -0,0 +1,98 @@ +GLOBAL_LIST_EMPTY(current_pending_diseases) +/datum/event/disease_outbreak + var/datum/disease/chosen_disease + var/list/disease_blacklist = list( + /datum/disease/advance, + /datum/disease/food_poisoning + ) + var/static/list/transmissable_symptoms = list() + var/static/list/diseases_minor = list() + var/static/list/diseases_moderate_major = list() + +/datum/event/disease_outbreak/setup() + if(isemptylist(diseases_minor) && isemptylist(diseases_moderate_major)) + populate_diseases() + if(isemptylist(transmissable_symptoms)) + populate_symptoms() + var/datum/disease/virus + if(prob(50)) + switch(severity) + if(EVENT_LEVEL_MODERATE) + virus = pick(diseases_minor) + if(EVENT_LEVEL_MAJOR) + virus = pick(diseases_moderate_major) + else + stack_trace("Disease Outbreak: Invalid Event Level [severity]. Expected: 1-2") + virus = /datum/disease/cold + chosen_disease = new virus() + else + if(severity == EVENT_LEVEL_MAJOR) + chosen_disease = create_virus(severity * pick(2,3)) //50% chance for a major disease instead of a moderate one + else + chosen_disease = create_virus(severity * 2) + + chosen_disease.carrier = TRUE + +/datum/event/disease_outbreak/start() + GLOB.current_pending_diseases += chosen_disease + + var/list/candidates = list() + for(var/mob/living/carbon/human/G in player_list) + if(G.mind && G.stat != DEAD && G.is_client_active(5) && !player_is_antag(G.mind)) + var/area/A = get_area(G) + if(!A) + continue + if(!(A.z in using_map.station_levels)) + continue + if(A.flags & RAD_SHIELDED) + continue + if(isbelly(G.loc)) + continue + if(!G.CanContractDisease()) + continue + candidates += G + + var/chosen_infect = rand(3, 5) + + while(chosen_infect) + var/mob/living/carbon/human/H = pick(candidates) + H.ContractDisease(chosen_disease) + candidates -= H + + +//Creates a virus with a harmful effect, guaranteed to be spreadable by contact or airborne +/datum/event/disease_outbreak/proc/create_virus(max_severity = 6) + var/datum/disease/advance/A = new /datum/disease/advance + A.symptoms = A.GenerateSymptomsBySeverity(max_severity - 1, max_severity, 2) //Choose "Payload" symptoms + A.AssignProperties(A.GenerateProperties()) + var/list/symptoms_to_try = transmissable_symptoms.Copy() + while(length(symptoms_to_try)) + if(A.spread_text != "Blood") + break + if(length(A.symptoms) < VIRUS_SYMPTOM_LIMIT) //Ensure the virus is spreadable by adding symptoms that boost transmission + var/datum/symptom/TS = pick_n_take(symptoms_to_try) + A.AddSymptom(new TS) + else + popleft(A.symptoms) //We have a full symptom list but are still not transmittable. Try removing one of the "payloads" + + A.AssignProperties(A.GenerateProperties()) + A.name = pick(alphabet_uppercase) + num2text(rand(1,9)) + pick(alphabet_uppercase) + num2text(rand(1,9)) + pick("v", "V", "-" + num2text(game_year), "") + A.Refresh() + return A + +/datum/event/disease_outbreak/proc/populate_diseases() + for(var/candidate in subtypesof(/datum/disease)) + var/datum/disease/CD = new candidate + if(is_type_in_list(CD, disease_blacklist)) + continue + switch(CD.severity) + if(NONTHREAT, MINOR) + diseases_minor += candidate + if(MEDIUM, HARMFUL, DANGEROUS, BIOHAZARD) + diseases_moderate_major += candidate + +/datum/event/disease_outbreak/proc/populate_symptoms() + for(var/candidate in subtypesof(/datum/symptom)) + var/datum/symptom/CS = candidate + if(initial(CS.transmittable) > 1) + transmissable_symptoms += candidate diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm index 96c14683b0..08d40416da 100644 --- a/code/modules/food/food/snacks.dm +++ b/code/modules/food/food/snacks.dm @@ -6892,6 +6892,7 @@ "zombiepowder", "cryptobiolin", "psilocybin")), 5) + reagents.add_reagent("salmonella", 5) /obj/item/reagent_containers/food/snacks/old/pizza name = "\improper Pizza!" diff --git a/code/modules/food/kitchen/smartfridge/medical.dm b/code/modules/food/kitchen/smartfridge/medical.dm index 0e7f17663f..1f9091bd36 100644 --- a/code/modules/food/kitchen/smartfridge/medical.dm +++ b/code/modules/food/kitchen/smartfridge/medical.dm @@ -31,9 +31,7 @@ icon_contents = "viro" /obj/machinery/smartfridge/virology/accept_check(var/obj/item/O as obj) - if(istype(O,/obj/item/reagent_containers/glass/beaker/vial/)) - return 1 - if(istype(O,/obj/item/virusdish/)) + if(istype(O,/obj/item/storage/pill_bottle) || istype(O,/obj/item/reagent_containers) || istype(O,/obj/item/reagent_containers/glass/)) return 1 return 0 @@ -44,9 +42,7 @@ req_access = list(access_virology) /obj/machinery/smartfridge/secure/virology/accept_check(var/obj/item/O as obj) - if(istype(O,/obj/item/reagent_containers/glass/beaker/vial/)) - return 1 - if(istype(O,/obj/item/virusdish/)) + if(istype(O,/obj/item/storage/pill_bottle) || istype(O,/obj/item/reagent_containers) || istype(O,/obj/item/reagent_containers/glass/)) return 1 return 0 diff --git a/code/modules/food/recipes_microwave.dm b/code/modules/food/recipes_microwave.dm index 9d5ea0cc5e..90af4ee63f 100644 --- a/code/modules/food/recipes_microwave.dm +++ b/code/modules/food/recipes_microwave.dm @@ -508,14 +508,6 @@ I said no! ) result = /obj/item/reagent_containers/food/snacks/icecreamsandwich -// Fuck Science! -/datum/recipe/ruinedvirusdish - items = list( - /obj/item/virusdish - ) - result = /obj/item/ruinedvirusdish - - /datum/recipe/onionsoup fruit = list("onion" = 1) reagents = list("water" = 10) diff --git a/code/modules/gamemaster/event2/events/medical/virus.dm b/code/modules/gamemaster/event2/events/medical/virus.dm deleted file mode 100644 index ad221c0d04..0000000000 --- a/code/modules/gamemaster/event2/events/medical/virus.dm +++ /dev/null @@ -1,69 +0,0 @@ -/datum/event2/meta/virus - name = "viral infection" - event_class = "virus" - departments = list(DEPARTMENT_MEDICAL, DEPARTMENT_EVERYONE) - chaos = 40 - chaotic_threshold = EVENT_CHAOS_THRESHOLD_HIGH_IMPACT - event_type = /datum/event2/event/virus - -/datum/event2/meta/virus/superbug - name = "viral superbug" - chaos = 60 - event_type = /datum/event2/event/virus/superbug - -/datum/event2/meta/virus/outbreak - name = "viral outbreak" - chaos = 60 - event_type = /datum/event2/event/virus/outbreak - -/datum/event2/meta/virus/get_weight() - var/list/virologists = metric.get_people_with_alt_title(/datum/job/doctor, /datum/alt_title/virologist) - virologists += metric.get_people_with_job(/datum/job/cmo) - - return virologists.len * 25 - - - -/datum/event2/event/virus - announce_delay_lower_bound = 1 MINUTE - announce_delay_upper_bound = 3 MINUTES - var/number_of_viruses = 1 - var/virus_power = 2 // Ranges from 1 to 3, with 1 being the weakest. - var/list/candidates = list() - -// A single powerful virus. -/datum/event2/event/virus/superbug - virus_power = 3 - -// A lot of weaker viruses. -/datum/event2/event/virus/outbreak - virus_power = 1 - number_of_viruses = 3 - - - -/datum/event2/event/virus/set_up() - for(var/mob/living/carbon/human/H in player_list) - if(H.client && !H.isSynthetic() && H.stat != DEAD && !player_is_antag(H.mind) && !isbelly(H.loc)) - candidates += H - candidates = shuffle(candidates) - -/datum/event2/event/virus/announce() - command_announcement.Announce("Confirmed outbreak of level 7 biohazard aboard \the [location_name()]. \ - All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg') - -/datum/event2/event/virus/start() - if(!candidates.len) - log_debug("Virus event could not find any valid targets to infect. Aborting.") - abort() - return - - for(var/i = 1 to number_of_viruses) - var/mob/living/carbon/human/H = LAZYACCESS(candidates, 1) - if(!H) - return - var/datum/disease2/disease/D = new() - D.makerandom(virus_power) - log_debug("Virus event is now infecting \the [H] with a new random virus.") - infect_mob(H, D) - candidates -= H diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index fbf72f59bb..9b6f1210c8 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -11,8 +11,6 @@ /mob/living/carbon/Life() ..() - handle_viruses() - // Increase germ_level regularly if(germ_level < GERM_LEVEL_AMBIENT && prob(30)) //if you're just standing there, you shouldn't get more germs beyond an ambient level germ_level++ @@ -398,7 +396,10 @@ return ..() if(istype(A, /mob/living/carbon) && prob(10)) - spread_disease_to(A, "Contact") + var/mob/living/carbon/human/H = A + for(var/datum/disease/D in GetViruses()) + if(D.spread_flags & CONTACT_GENERAL) + H.ContractDisease(D) /mob/living/carbon/cannot_use_vents() return @@ -542,3 +543,12 @@ if(allergen_type in species.food_preference) return species.food_preference_bonus return 0 + +/mob/living/carbon/handle_diseases() + for(var/thing in GetViruses()) + var/datum/disease/D = thing + if(prob(D.infectivity)) + D.spread() + + if(stat != DEAD || D.allow_dead) + D.stage_act() diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 8dc29e6d3b..24a0359297 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -3,7 +3,6 @@ blocks_emissive = EMISSIVE_BLOCK_UNIQUE // BLEH, this could be improved for transparent species and stuff! And blocks glowing eyes?! var/datum/species/species //Contains icon generation and language information, set during New(). var/list/stomach_contents = list() - var/list/datum/disease2/disease/virus2 = list() var/list/antibodies = list() var/last_eating = 0 //Not sure what this does... I found it hidden in food.dm @@ -29,4 +28,4 @@ //these two help govern taste. The first is the last time a taste message was shown to the plaer. //the second is the message in question. var/last_taste_time = 0 - var/last_taste_text = "" \ No newline at end of file + var/last_taste_text = "" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index eb89d07364..5756af7e0a 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1062,10 +1062,6 @@ sync_organ_dna() // end vorestation addition - for (var/ID in virus2) - var/datum/disease2/disease/V = virus2[ID] - V.cure(src) - losebreath = 0 ..() diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index ddcc522f21..542dafb6f6 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -44,6 +44,17 @@ if(!temp || !temp.is_usable()) to_chat(H, span_warning("You can't use your hand.")) return + + for(var/thing in GetViruses()) + var/datum/disease/D = thing + if(D.IsSpreadByTouch()) + H.ContractDisease(D) + + for(var/thing in H.GetViruses()) + var/datum/disease/D = thing + if(D.IsSpreadByTouch()) + ContractDisease(D) + if(H.lying) return M.break_cloak() @@ -65,8 +76,9 @@ return FALSE if(istype(M,/mob/living/carbon)) - var/mob/living/carbon/C = M - C.spread_disease_to(src, "Contact") + for(var/datum/disease/D in M.GetViruses()) + if(D.spread_flags & CONTACT_HANDS) + ContractDisease(D) switch(M.a_intent) if(I_HELP) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 7d64ac51cf..3d07155996 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -504,9 +504,12 @@ /mob/living/carbon/human/handle_post_breath(datum/gas_mixture/breath) ..() //spread some viruses while we are at it - if(breath && virus2.len > 0 && prob(10)) - for(var/mob/living/carbon/M in view(1,src)) - src.spread_disease_to(M) + if(breath && !isnull(viruses) && prob(10)) + for(var/datum/disease/D in GetViruses()) + if((D.spread_flags & SPECIAL) || (D.spread_flags & NON_CONTAGIOUS)) + continue + for(var/mob/living/carbon/M in view(1,src)) + ContractDisease(D) /mob/living/carbon/human/get_breath_from_internal(volume_needed=BREATH_VOLUME) @@ -2031,8 +2034,8 @@ if (BITTEST(hud_updateflag, STATUS_HUD)) var/foundVirus = 0 - for (var/ID in virus2) - if (ID in virusDB) + for (var/datum/disease/D in GetViruses()) + if(D.discovered) foundVirus = 1 break @@ -2054,8 +2057,10 @@ holder2.icon_state = "hudbrainworm" else holder.icon_state = "hudhealthy" - if(virus2.len) - holder2.icon_state = "hudill" + if(viruses.len) + for(var/datum/disease/D in GetViruses()) + if(D.discovered) + holder2.icon_state = "hudill" else holder2.icon_state = "hudhealthy" if(block_hud) diff --git a/code/modules/mob/living/carbon/viruses.dm b/code/modules/mob/living/carbon/viruses.dm deleted file mode 100644 index f57bc878a0..0000000000 --- a/code/modules/mob/living/carbon/viruses.dm +++ /dev/null @@ -1,48 +0,0 @@ -/mob/living/carbon/proc/handle_viruses() - - if(status_flags & GODMODE) return 0 //godmode - - if(bodytemperature > 406) - for (var/ID in virus2) - var/datum/disease2/disease/V = virus2[ID] - V.cure(src) - - if(life_tick % 3) //don't spam checks over all objects in view every tick. - for(var/obj/effect/decal/cleanable/O in view(1,src)) - if(istype(O,/obj/effect/decal/cleanable/blood)) - var/obj/effect/decal/cleanable/blood/B = O - if(B.virus2.len) - for (var/ID in B.virus2) - var/datum/disease2/disease/V = B.virus2[ID] - infect_virus2(src,V) - - else if(istype(O,/obj/effect/decal/cleanable/mucus)) - var/obj/effect/decal/cleanable/mucus/M = O - if(M.virus2.len) - for (var/ID in M.virus2) - var/datum/disease2/disease/V = M.virus2[ID] - infect_virus2(src,V) - - else if(istype(O,/obj/effect/decal/cleanable/vomit)) - var/obj/effect/decal/cleanable/vomit/Vom = O - if(Vom.virus2.len) - for (var/ID in Vom.virus2) - var/datum/disease2/disease/V = Vom.virus2[ID] - infect_virus2(src,V) - - if(virus2.len) - for (var/ID in virus2) - var/datum/disease2/disease/V = virus2[ID] - if(isnull(V)) // Trying to figure out a runtime error that keeps repeating - CRASH("virus2 nulled before calling activate()") - else - V.activate(src) - // activate may have deleted the virus - if(!V) continue - - // check if we're immune - var/list/common_antibodies = V.antigen & src.antibodies - if(common_antibodies.len) - V.dead = 1 - - return \ No newline at end of file diff --git a/code/modules/mob/living/default_language.dm b/code/modules/mob/living/default_language.dm index fba38e21f5..66cdcb28ad 100644 --- a/code/modules/mob/living/default_language.dm +++ b/code/modules/mob/living/default_language.dm @@ -1,10 +1,28 @@ /mob/living var/datum/language/default_language -/mob/living/verb/set_default_language(language as null|anything in languages) +/mob/living/verb/set_default_language() set name = "Set Default Language" set category = "IC.Settings" + var/language = tgui_input_list(usr, "Select your default language", "Available languages", languages) + + apply_default_language(language) + +// Silicons can't neccessarily speak everything in their languages list +/mob/living/silicon/set_default_language() + var/language = tgui_input_list(usr, "Select your default language", "Available languages", speech_synthesizer_langs) + // Silicons have no species language usually. So let's default them to GALCOM + if(!language) + to_chat(src, span_notice("You will now speak your standard default language, common, if you do not specify a language when speaking.")) + for(var/datum/language/lang in speech_synthesizer_langs) + if(lang.name == LANGUAGE_GALCOM) + default_language = lang + break + return + apply_default_language(language) + +/mob/living/proc/apply_default_language(var/language) if (only_species_language && language != GLOB.all_languages[src.species_language]) to_chat(src, span_notice("You can only speak your species language, [src.species_language].")) return 0 @@ -22,10 +40,6 @@ to_chat(src, span_notice("You will now speak whatever your standard default language is if you do not specify one when speaking.")) default_language = language -// Silicons can't neccessarily speak everything in their languages list -/mob/living/silicon/set_default_language(language as null|anything in speech_synthesizer_langs) - ..() - /mob/living/verb/check_default_language() set name = "Check Default Language" set category = "IC.Game" diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index a15b0e115e..a599ff38e2 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -51,6 +51,10 @@ //Chemicals in the body, this is moved over here so that blood can be added after death handle_chemicals_in_body() + // Handle viruses - Dead or not! + if(LAZYLEN(viruses)) + handle_diseases() + //Handle temperature/pressure differences between body and environment if(environment) handle_environment(environment) diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/macrophage.dm b/code/modules/mob/living/simple_mob/subtypes/vore/macrophage.dm new file mode 100644 index 0000000000..dacbebb57d --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/vore/macrophage.dm @@ -0,0 +1,63 @@ +/mob/living/simple_mob/vore/aggressive/macrophage + name = "Germ" + desc = "A giant virus!" + icon = 'icons/mob/macrophage.dmi' + icon_state = "macrophage-1" + + faction = FACTION_MACROBACTERIA + maxHealth = 60 + health = 60 + + var/datum/disease/base_disease = null + var/list/infections = list() + + melee_damage_lower = 1 + melee_damage_upper = 5 + grab_resist = 100 + see_in_dark = 8 + + response_help = "shoos" + response_disarm = "swats away" + response_harm = "squashes" + attacktext = list("squashed") + friendly = list("shoos", "rubs") + + vore_bump_chance = "attempts to absorb" + + vore_active = TRUE + vore_capacity = 1 + + can_be_drop_prey = FALSE + allow_mind_transfer = TRUE + + ai_holder_type = /datum/ai_holder/simple_mob/melee + +/mob/living/simple_mob/vore/aggressive/macrophage/green + icon_state = "macrophage-2" + +/mob/living/simple_mob/vore/aggressive/macrophage/pink + icon_state = "macrophage-3" + +/mob/living/simple_mob/vore/aggressive/macrophage/blue + icon_state = "macrophage-4" + +/obj/belly/macrophage + name = "capsid" + fancy_vore = TRUE + contamination_color = "green" + vore_verb = "absorb" + escapable = TRUE + escapable = 5 + desc = "In an attempt to get away from the giant virus, it's oversized envelope proteins dragged you right past it's matrix, encapsulating you deep inside it's capsid... The strange walls kneading and keeping you tight along within it's nucleoprotein." + belly_fullscreen = "VBO_gematically_angular" + belly_fullscreen_color = "#87d8d8" + digest_mode = DM_ABSORB + affects_vore_sprites = FALSE + +/mob/living/simple_mob/vore/aggressive/macrophage/init_vore() + + if(LAZYLEN(vore_organs)) + return TRUE + + var/obj/belly/B = new /obj/belly/macrophage(src) + vore_selected = B diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 26118480b0..1b06902325 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -239,3 +239,6 @@ var/list/list/misc_tabs = list() var/list/datum/action/actions + + var/list/viruses + var/list/resistances diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index 74894542c5..72b24602f9 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -246,10 +246,19 @@ var/const/CE_STABLE_THRESHOLD = 0.5 //set reagent data B.data["donor"] = src - if (!B.data["virus2"]) - B.data["virus2"] = list() - B.data["virus2"] |= virus_copylist(src.virus2) - B.data["antibodies"] = src.antibodies + if(!B.data["viruses"]) + B.data["viruses"] = list() + + for(var/datum/disease/D in GetViruses()) + if(D.spread_flags & SPECIAL || D.spread_flags & NON_CONTAGIOUS) + continue + B.data["viruses"] |= D.Copy() + + if(!B.data["resistances"]) + B.data["resistances"] = list() + + if(B.data["resistances"]) + B.data["resistances"] |= GetResistances() B.data["blood_DNA"] = copytext(src.dna.unique_enzymes,1,0) B.data["blood_type"] = copytext(src.dna.b_type,1,0) @@ -282,10 +291,14 @@ var/const/CE_STABLE_THRESHOLD = 0.5 /mob/living/carbon/proc/inject_blood(var/datum/reagent/blood/injected, var/amount) if (!injected || !istype(injected)) return - var/list/sniffles = virus_copylist(injected.data["virus2"]) + var/list/sniffles = injected.data["viruses"] for(var/ID in sniffles) - var/datum/disease2/disease/sniffle = sniffles[ID] - infect_virus2(src,sniffle,1) + var/datum/disease/D = ID + if((D.spread_flags & SPECIAL) || (D.spread_flags & NON_CONTAGIOUS)) // You can't put non-contagius diseases in blood, but just in case + continue + ContractDisease(D) + if (injected.data["resistances"] && prob(5)) + antibodies |= injected.data["resistances"] if (injected.data["antibodies"] && prob(5)) antibodies |= injected.data["antibodies"] var/list/chems = list() @@ -426,8 +439,8 @@ var/const/CE_STABLE_THRESHOLD = 0.5 B.blood_DNA[source.data["blood_DNA"]] = "O+" // Update virus information. - if(source.data["virus2"]) - B.virus2 = virus_copylist(source.data["virus2"]) + if(source.data["viruses"]) + B.viruses = source.data["viruses"] B.fluorescent = 0 B.invisibility = 0 diff --git a/code/modules/reagents/reactions/instant/virology.dm b/code/modules/reagents/reactions/instant/virology.dm new file mode 100644 index 0000000000..f8d5038326 --- /dev/null +++ b/code/modules/reagents/reactions/instant/virology.dm @@ -0,0 +1,133 @@ +/decl/chemical_reaction/instant/virus_food_mutagen + name = "mutagenic agar" + id = "mutagenvirusfood" + result = "mutagenvirusfood" + required_reagents = list("mutagen" = 1, "virusfood" = 1) + result_amount = 1 + +/decl/chemical_reaction/instant/virus_food_adranol + name = "virus rations" + id = "adranolvirusfood" + result = "adranolvirusfood" + required_reagents = list("adranol" = 1, "virusfood" = 1) + result_amount = 1 + +/decl/chemical_reaction/instant/virus_food_phoron + name = "phoronic virus food" + id = "phoronvirusfood" + result = "phoronvirusfood" + required_reagents = list("phoron" = 1, "virusfood" = 1) + result_amount = 1 + +/decl/chemical_reaction/instant/virus_food_phoron_adranol + name = "weakened phoronic virus food" + id = "weakphoronvirusfood" + result = "weakphoronvirusfood" + required_reagents = list("adranol" = 1, "phoronvirusfood" = 1) + result_amount = 2 + +/decl/chemical_reaction/instant/virus_food_mutagen_sugar + name = "sucrose agar" + id = "sugarvirusfood" + result = "sugarvirusfood" + required_reagents = list("sugar" = 1, "mutagenvirusfood" = 1) + result_amount = 2 + +/decl/chemical_reaction/instant/virus_food_mutagen_inaprovaline + name = "sucrose agar" + id = "inaprovalinevirusfood" + result = "sugarvirusfood" + required_reagents = list("inaprovaline" = 1, "mutagenvirusfood" = 1) + result_amount = 2 + +/decl/chemical_reaction/instant/mix_virus + name = "Mix Virus" + id = "mixvirus" + required_reagents = list("virusfood" = 1) + catalysts = list("blood" = 1) + var/level_min = 0 + var/level_max = 2 + +/decl/chemical_reaction/instant/mix_virus/on_reaction(datum/reagents/holder) + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list + if(B && B.data) + var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] + if(D) + D.Evolve(level_min, level_max) + +/decl/chemical_reaction/instant/mix_virus/mix_virus_2 + name = "Mix Virus 2" + id = "mixvirus2" + required_reagents = list("mutagen" = 1) + level_min = 2 + level_max = 4 + +/decl/chemical_reaction/instant/mix_virus/mix_virus_3 + name = "Mix Virus 3" + id = "mixvirus3" + required_reagents = list("phoron" = 1) + level_min = 4 + level_max = 6 + +/decl/chemical_reaction/instant/mix_virus/mix_virus_4 + name = "Mix Virus 4" + id = "mixvirus4" + required_reagents = list("uranium" = 1) + level_min = 5 + level_max = 6 + +/decl/chemical_reaction/instant/mix_virus/mix_virus_5 + name = "Mix Virus 5" + id = "mixvirus5" + required_reagents = list("mutagenvirusfood" = 1) + level_min = 3 + level_max = 3 + +/decl/chemical_reaction/instant/mix_virus/mix_virus_6 + name = "Mix Virus 6" + id = "mixvirus6" + required_reagents = list("sugarvirusfood" = 1) + level_min = 4 + level_max = 4 + +/decl/chemical_reaction/instant/mix_virus/mix_virus_7 + name = "Mix Virus 7" + id = "mixvirus7" + required_reagents = list("weakphoronvirusfood" = 1) + level_min = 5 + level_max = 5 + +/decl/chemical_reaction/instant/mix_virus/mix_virus_8 + name = "Mix Virus 8" + id = "mixvirus8" + required_reagents = list("phoronvirusfood" = 1) + level_min = 6 + level_max = 6 + +/decl/chemical_reaction/instant/mix_virus/mix_virus_9 + name = "Mix Virus 9" + id = "mixvirus9" + required_reagents = list("adranolvirusfood" = 1) + level_min = 1 + level_max = 1 + +/decl/chemical_reaction/instant/mix_virus/rem_virus + name = "Devolve Virus" + id = "remvirus" + required_reagents = list("adranol" = 1) + catalysts = list("blood" = 1) + +/decl/chemical_reaction/instant/mix_virus/rem_virus/on_reaction(var/datum/reagents/holder) + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list + if(B && B.data) + var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] + if(D) + D.Devolve() + +/decl/chemical_reaction/instant/antibodies + name = "Antibodies" + id = "antibodiesmix" + result = "antibodies" + required_reagents = list("vaccine") + catalysts = list("inaprovaline" = 0.1) + result_amount = 0.5 diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index cc4229e389..0298998d7f 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -39,17 +39,16 @@ /obj/item/storage/secure/safe, /obj/machinery/iv_drip, /obj/structure/medical_stand, //VOREStation Add, - /obj/machinery/disease2/incubator, /obj/machinery/disposal, /mob/living/simple_mob/animal/passive/cow, /mob/living/simple_mob/animal/goat, - /obj/machinery/computer/centrifuge, /obj/machinery/sleeper, /obj/machinery/smartfridge/, /obj/machinery/biogenerator, /obj/structure/frame, /obj/machinery/radiocarbon_spectrometer, - /obj/machinery/portable_atmospherics/powered/reagent_distillery + /obj/machinery/portable_atmospherics/powered/reagent_distillery, + /obj/machinery/computer/pandemic ) /obj/item/reagent_containers/glass/Initialize() diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index fb98d48483..0ba2319418 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -381,5 +381,4 @@ /obj/item/reagent_containers/hypospray/autoinjector/biginjector/contaminated/do_injection(mob/living/carbon/human/H, mob/living/user) . = ..() if(.) // Will occur if successfully injected. - infect_mob_random_lesser(H) add_attack_logs(user, H, "Infected \the [H] with \the [src], by \the [user].") diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index bc472d3424..7c5c3cc9c6 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -32,7 +32,7 @@ var/used = FALSE var/dirtiness = 0 var/list/targets - var/list/datum/disease2/disease/viruses + var/list/datum/disease/viruses drop_sound = 'sound/items/drop/glass.ogg' pickup_sound = 'sound/items/pickup/glass.ogg' @@ -402,10 +402,10 @@ targets |= hash //Grab any viruses they have - if(iscarbon(target) && LAZYLEN(target.virus2.len)) + if(iscarbon(target) && LAZYLEN(target.viruses.len)) LAZYINITLIST(viruses) - var/datum/disease2/disease/virus = pick(target.virus2.len) - viruses[hash] = virus.getcopy() + var/datum/disease/virus = pick(target.viruses.len) + viruses[hash] = virus.Copy() //Dirtiness should be very low if you're the first injectee. If you're spam-injecting 4 people in a row around you though, //This gives the last one a 30% chance of infection. @@ -421,8 +421,8 @@ if(LAZYLEN(viruses) && prob(75)) var/old_hash = pick(viruses) if(hash != old_hash) //Same virus you already had? - var/datum/disease2/disease/virus = viruses[old_hash] - infect_virus2(target,virus.getcopy()) + var/datum/disease/virus = viruses[old_hash] + target.ContractDisease(virus) if(!used) START_PROCESSING(SSobj, src) diff --git a/code/modules/reagents/reagent_containers/virology.dm b/code/modules/reagents/reagent_containers/virology.dm new file mode 100644 index 0000000000..a1d4403900 --- /dev/null +++ b/code/modules/reagents/reagent_containers/virology.dm @@ -0,0 +1,26 @@ +/obj/item/reagent_containers/glass/bottle/culture + name = "virus culture" + desc = "A bottle with a virus culture" + icon_state = "bottle-1" + var/list/data = list("donor" = null, "viruses" = null, "blood_DNA" = null, "blood_type" = null, "resistances" = null, "trace_chems" = null) + var/list/diseases = list() + +/obj/item/reagent_containers/glass/bottle/culture/cold + name = "cold virus culture" + desc = "A bottle with the common cold culture" + +/obj/item/reagent_containers/glass/bottle/culture/cold/Initialize() + . = ..() + diseases += new /datum/disease/advance/cold + data["viruses"] = diseases + reagents.add_reagent("blood", 10, data) + +/obj/item/reagent_containers/glass/bottle/culture/flu + name = "flu virus culture" + desc = "A bottle with the flu culture" + +/obj/item/reagent_containers/glass/bottle/culture/flu/Initialize() + . = ..() + diseases += new /datum/disease/advance/flu + data["viruses"] = diseases + reagents.add_reagent("blood", 10, data) diff --git a/code/modules/reagents/reagents/core.dm b/code/modules/reagents/reagents/core.dm index 10a50a3b98..8157632742 100644 --- a/code/modules/reagents/reagents/core.dm +++ b/code/modules/reagents/reagents/core.dm @@ -23,9 +23,9 @@ /datum/reagent/blood/get_data() // Just in case you have a reagent that handles data differently. var/t = data.Copy() - if(t["virus2"]) - var/list/v = t["virus2"] - t["virus2"] = v.Copy() + if(t["viruses"]) + var/list/v = t["viruses"] + t["viruses"] = v.Copy() return t /datum/reagent/blood/touch_turf(var/turf/simulated/T) @@ -70,13 +70,16 @@ if(effective_dose > 15) if(!is_vampire) //VOREStation Edit. M.adjustToxLoss(removed) //VOREStation Edit. - if(data && data["virus2"]) - var/list/vlist = data["virus2"] + if(data && data["viruses"]) + var/list/vlist = data["viruses"] if(vlist.len) for(var/ID in vlist) - var/datum/disease2/disease/V = vlist[ID] - if(V.spreadtype == "Contact") - infect_virus2(M, V.getcopy()) + if(!ID) + continue + var/datum/disease/D = ID + if((D.spread_flags & SPECIAL) || (D.spread_flags & NON_CONTAGIOUS)) + continue + M.ContractDisease(D) /datum/reagent/blood/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) if(ishuman(M)) @@ -86,15 +89,59 @@ if(alien == IS_SLIME) affect_ingest(M, alien, removed) return - if(data && data["virus2"]) - var/list/vlist = data["virus2"] + if(data && data["viruses"]) + var/list/vlist = data["viruses"] if(vlist.len) for(var/ID in vlist) - var/datum/disease2/disease/V = vlist[ID] - if(V.spreadtype == "Contact") - infect_virus2(M, V.getcopy()) - if(data && data["antibodies"]) - M.antibodies |= data["antibodies"] + var/datum/disease/D = ID + if((D.spread_flags & SPECIAL) || (D.spread_flags & NON_CONTAGIOUS)) + continue + M.ContractDisease(D) + if(data && data["resistances"]) + M.resistances |= data["resistances"] + +/datum/reagent/blood/mix_data(newdata, newamount) + if(!data || !newdata) + return + + if(data["viruses"] || newdata["viruses"]) + var/list/mix1 = data["viruses"] + var/list/mix2 = newdata["viruses"] + + var/list/to_mix = list() + var/list/preserve = list() + + for(var/datum/disease/advance/AD in mix1) + to_mix += AD + for(var/datum/disease/advance/AD in mix2) + to_mix += AD + + var/datum/disease/advance/mixed_AD = Advance_Mix(to_mix) + + if(mixed_AD) + preserve += mixed_AD + + for(var/datum/disease/D1 in mix1) + if(!istype(D1, /datum/disease/advance)) + var/keep = TRUE + for(var/datum/disease/D2 in preserve) + if(D1.IsSame(D2)) + keep = FALSE + break + if(keep) + preserve += D1 + + for(var/datum/disease/D1 in mix2) + if(!istype(D1, /datum/disease/advance)) + var/keep = TRUE + for(var/datum/disease/D2 in preserve) + if(D1.IsSame(D2)) + keep = FALSE + break + if(keep) + preserve += D1 + + data["viruses"] = preserve /datum/reagent/blood/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_SLIME) //They don't have blood, so it seems weird that they would instantly 'process' the chemical like another species does. diff --git a/code/modules/reagents/reagents/dispenser.dm b/code/modules/reagents/reagents/dispenser.dm index add0a75156..dcdc0f7c50 100644 --- a/code/modules/reagents/reagents/dispenser.dm +++ b/code/modules/reagents/reagents/dispenser.dm @@ -319,20 +319,7 @@ /datum/reagent/radium/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(issmall(M)) removed *= 2 - M.apply_effect(10 * removed, IRRADIATE, 0) // Radium may increase your chances to cure a disease - if(M.virus2.len) - for(var/ID in M.virus2) - var/datum/disease2/disease/V = M.virus2[ID] - if(prob(5)) - M.antibodies |= V.antigen - if(prob(50)) - M.apply_effect(50, IRRADIATE, check_protection = 0) // curing it that way may kill you instead - var/absorbed = 0 - var/obj/item/organ/internal/diona/nutrients/rad_organ = locate() in M.internal_organs - if(rad_organ && !rad_organ.is_broken()) - absorbed = 1 - if(!absorbed) - M.adjustToxLoss(100) + M.apply_effect(10 * removed, IRRADIATE, 0) /datum/reagent/radium/touch_turf(var/turf/T) ..() diff --git a/code/modules/reagents/reagents/toxins.dm b/code/modules/reagents/reagents/toxins.dm index 26b7012330..c0545b8b06 100644 --- a/code/modules/reagents/reagents/toxins.dm +++ b/code/modules/reagents/reagents/toxins.dm @@ -973,3 +973,15 @@ /datum/reagent/neurophage_nanites/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) M.adjustBrainLoss(2 * removed) // Their job is to give you a bad time. M.adjustBruteLoss(2 * removed) + +/datum/reagent/salmonella + name = "Salmonella" + id = "salmonella" + description = "A nasty bacteria found in spoiled food." + reagent_state = LIQUID + color = "#1E4600" + taste_mult = 0 + +/datum/reagent/salmonella/on_mob_life(mob/living/carbon/M) + M.ForceContractDisease(new /datum/disease/food_poisoning(0)) + return ..() diff --git a/code/modules/reagents/reagents/virology.dm b/code/modules/reagents/reagents/virology.dm new file mode 100644 index 0000000000..4556b1ed09 --- /dev/null +++ b/code/modules/reagents/reagents/virology.dm @@ -0,0 +1,47 @@ +/datum/reagent/vaccine + name = "Vaccine" + id = "vaccine" + color = "#C81040" + taste_description = "antibodies" + +/datum/reagent/vaccine/affect_blood(mob/living/carbon/M, alien, removed) + if(islist(data)) + for(var/thing in M.GetViruses()) + var/datum/disease/D = thing + if(D.GetDiseaseID() in data) + D.cure() + M.resistances |= data + +/datum/reagent/vaccines/mix_data(newdata, newamount) + if(islist(newdata)) + var/list/newdatalist = newdata + data |= newdatalist.Copy() + +/datum/reagent/mutagen/mutagenvirusfood + name = "Mutagenic agar" + id = "mutagenvirusfood" + description = "mutates blood" + color = "#A3C00F" + +/datum/reagent/mutagen/mutagenvirusfood/sugar + name = "Sucrose agar" + id = "sugarvirusfood" + color = "#41B0C0" + taste_mult = 1.5 + +/datum/reagent/medicine/adranol/adranolvirusfood + name = "Virus rations" + id = "adranolvirusfood" + description = "mutates blood" + color = "#D18AA5" + +/datum/reagent/phoron_dust/phoronvirusfood + name = "Phoronic virus food" + id = "phoronvirusfood" + description = "mutates blood" + color = "#A69DA9" + +/datum/reagent/phoron_dust/phoronvirusfood/weak + name = "Weakened phoronic virus food" + id = "weakphoronvirusfood" + color = "#CEC3C6" diff --git a/code/modules/virus2/admin.dm b/code/modules/virus2/admin.dm deleted file mode 100644 index e08d7e5957..0000000000 --- a/code/modules/virus2/admin.dm +++ /dev/null @@ -1,222 +0,0 @@ -/datum/disease2/disease/Topic(href, href_list) - . = ..() - if(.) return - - if(href_list["info"]) - // spawn or admin privileges to see info about viruses - if(!check_rights(R_ADMIN|R_SPAWN|R_EVENT)) return - - to_chat(usr, "Infection chance: [infectionchance]; Speed: [speed]; Spread type: [spreadtype]") - to_chat(usr, "Affected species: [english_list(affected_species)]") - to_chat(usr, "Effects:") - for(var/datum/disease2/effectholder/E in effects) - to_chat(usr, "[E.stage]: [E.effect.name]; chance=[E.chance]; multiplier=[E.multiplier]") - to_chat(usr, "Antigens: [antigens2string(antigen)]; Resistance: [resistance]") - - return 1 - -/datum/disease2/disease/vv_get_header() - . = list() - for(var/datum/disease2/effectholder/E in effects) - . += "[E.stage]: [E.effect.name]" - . = list({" - [name()]
- [jointext(., "
")]
- "}) - -/datum/disease2/disease/get_view_variables_options() - return ..() + {" - - "} - -/datum/admins/var/datum/virus2_editor/virus2_editor_datum = new -/client/proc/virus2_editor() - set name = "Virus Editor" - set category = "Admin.Events" - if(!holder || !check_rights(R_SPAWN)) return // spawn privileges to create viruses - - holder.virus2_editor_datum.show_ui(src) - -/datum/virus2_editor - var/list/s = list(/datum/disease2/effect/invisible,/datum/disease2/effect/invisible,/datum/disease2/effect/invisible,/datum/disease2/effect/invisible) - var/list/s_chance = list(1,1,1,1) - var/list/s_multiplier = list(1,1,1,1) - var/species = list() - var/infectionchance = 70 - var/spreadtype = "Contact" - var/list/antigens = list() - var/speed = 1 - var/resistance = 10 - var/mob/living/carbon/infectee = null - - // this holds spawned viruses so that the "Info" links work after the proc exits - var/list/spawned_viruses = list() - -/datum/virus2_editor/proc/select(mob/user, stage) - if(stage < 1 || stage > 4) return - - var/list/L = list() - - for(var/datum/disease2/effect/f as anything in subtypesof(/datum/disease2/effect)) - if(initial(f.stage) <= stage) - L[initial(f.name)] = f - - var/datum/disease2/effect/Eff = s[stage] - - var/C = tgui_input_list(usr, "Select effect for stage [stage]:", "Stage [stage]", L, Eff) - if(!C) return - return L[C] - -/datum/virus2_editor/proc/show_ui(mob/user) - var/H = {" -

Virus2 Virus Editor


- Effects:
- "} - for(var/i = 1 to 4) - var/datum/disease2/effect/Eff = s[i] - H += {" -
[initial(Eff.name)] - Chance: [s_chance[i]] - Multiplier: [s_multiplier[i]] -
- "} - H += {" -
- Infectable Species:
- "} - var/f = 1 - for(var/k in GLOB.all_species) - var/datum/species/S = GLOB.all_species[k] - if(S.get_virus_immune()) - continue - if(!f) H += " | " - else f = 0 - H += "[k]" - H += {" - Reset -
- Infection Chance: [infectionchance]
- Spread Type: [spreadtype]
- Speed: [speed]
- Resistance: [resistance]
-
- "} - f = 1 - for(var/k in ALL_ANTIGENS) - if(!f) H += " | " - else f = 0 - H += "[k]" - H += {" - Reset -
-
- Initial infectee: [infectee ? infectee : "(choose)"] - RELEASE - "} - - user << browse(H, "window=virus2edit") - -/datum/virus2_editor/Topic(href, href_list) - switch(href_list["what"]) - if("effect") - var/stage = text2num(href_list["stage"]) - if(href_list["effect"]) - var/datum/disease2/effect/E = select(usr,stage) - if(!E) return - s[stage] = E - // set a default chance and multiplier of half the maximum (roughly average) - s_chance[stage] = max(1, round(initial(E.chance_maxm)/2)) - s_multiplier[stage] = max(1, round(initial(E.maxm)/2)) - else if(href_list["chance"]) - var/datum/disease2/effect/Eff = s[stage] - var/I = tgui_input_number(usr, "Chance, per tick, of this effect happening (min 0, max [initial(Eff.chance_maxm)])", "Effect Chance", s_chance[stage], initial(Eff.chance_maxm), 0) - if(I == null || I < 0 || I > initial(Eff.chance_maxm)) return - s_chance[stage] = I - else if(href_list["multiplier"]) - var/datum/disease2/effect/Eff = s[stage] - var/I = tgui_input_number(usr, "Multiplier for this effect (min 1, max [initial(Eff.maxm)])", "Effect Multiplier", s_multiplier[stage], initial(Eff.maxm), 1) - if(I == null || I < 1 || I > initial(Eff.maxm)) return - s_multiplier[stage] = I - if("species") - if(href_list["toggle"]) - var/T = href_list["toggle"] - if(T in species) - species -= T - else - species |= T - else if(href_list["reset"]) - species = list() - if(infectee) - if(!infectee.species || !(infectee.species.get_bodytype() in species)) - infectee = null - if("ichance") - var/I = tgui_input_number(usr, "Input infection chance", "Infection Chance", infectionchance, 100) - if(!I) return - infectionchance = I - if("stype") - var/S = tgui_alert(usr, "Which spread type?", "Spread Type", list("Contact", "Airborne", "Blood")) - if(!S) return - spreadtype = S - if("speed") - var/S = tgui_input_number(usr, "Input speed", "Speed", speed) - if(!S) return - speed = S - if("antigen") - if(href_list["toggle"]) - var/T = href_list["toggle"] - if(length(T) != 1) return - if(T in antigens) - antigens -= T - else - antigens |= T - else if(href_list["reset"]) - antigens = list() - if("resistance") - var/S = tgui_input_number(usr, "Input % resistance to antibiotics", "Resistance", resistance, 100) - if(!S) return - resistance = S - if("infectee") - var/list/candidates = list() - for(var/mob/living/carbon/G in living_mob_list) - if(G.stat != DEAD && G.species && !isbelly(G.loc)) - if(G.species.get_bodytype() in species) - candidates["[G.name][G.client ? "" : " (no client)"]"] = G - else - candidates["[G.name] ([G.species.get_bodytype()])[G.client ? "" : " (no client)"]"] = G - if(!candidates.len) - to_chat(usr, "No possible candidates found!") - - var/I = tgui_input_list(usr, "Choose initial infectee", "Infectee", candidates) - if(!I || !candidates[I]) return - infectee = candidates[I] - species |= infectee.species.get_bodytype() - if("go") - if(!antigens.len) - var/a = tgui_alert(usr, "This disease has no antigens; it will be impossible to permanently immunise anyone without them.\ - It is strongly recommended to set at least one antigen. Do you want to go back and edit your virus?", "Antigens", list("Yes", "No")) - if(!a || a == "Yes") return - var/datum/disease2/disease/D = new - D.infectionchance = infectionchance - D.spreadtype = spreadtype - D.antigen = antigens - D.affected_species = species - D.speed = speed - D.resistance = resistance - for(var/i in 1 to 4) - var/datum/disease2/effectholder/E = new - var/Etype = s[i] - E.effect = new Etype() - E.effect.generate() - E.chance = s_chance[i] - E.multiplier = s_multiplier[i] - E.stage = i - - D.effects += E - - spawned_viruses += D - - message_admins(span_danger("[key_name_admin(usr)] infected [key_name_admin(infectee)] with a virus (Info)")) - log_admin("[key_name_admin(usr)] infected [key_name_admin(infectee)] with a virus!") - infect_virus2(infectee, D, forced=1) - - show_ui(usr) diff --git a/code/modules/virus2/analyser.dm b/code/modules/virus2/analyser.dm deleted file mode 100644 index f9522caea8..0000000000 --- a/code/modules/virus2/analyser.dm +++ /dev/null @@ -1,73 +0,0 @@ -/obj/machinery/disease2/diseaseanalyser - name = "disease analyser" - desc = "Analyzes diseases to find out information about them!" - icon = 'icons/obj/virology_vr.dmi' //VOREStation Edit - icon_state = "analyser" - anchored = TRUE - density = TRUE - - var/scanning = 0 - var/pause = 0 - - var/obj/item/virusdish/dish = null - -/obj/machinery/disease2/diseaseanalyser/attackby(var/obj/O as obj, var/mob/user as mob) - if(default_unfasten_wrench(user, O, 20)) - return - - else if(!istype(O,/obj/item/virusdish)) return - - if(dish) - to_chat(user, "\The [src] is already loaded.") - return - - dish = O - user.drop_item() - O.loc = src - - user.visible_message("[user] adds \a [O] to \the [src]!", "You add \a [O] to \the [src]!") - -/obj/machinery/disease2/diseaseanalyser/process() - if(stat & (NOPOWER|BROKEN)) - return - - if(scanning) - scanning -= 1 - if(scanning == 0) - if (dish.virus2.addToDB()) - ping("\The [src] pings, \"New pathogen added to data bank.\"") - - var/obj/item/paper/P = new /obj/item/paper(src.loc) - P.name = "paper - [dish.virus2.name()]" - - var/r = dish.virus2.get_info() - P.info = {" - [virology_letterhead("Post-Analysis Memo")] - [r] -
- Additional Notes:  -"} - dish.basic_info = dish.virus2.get_basic_info() - dish.info = r - dish.name = "[initial(dish.name)] ([dish.virus2.name()])" - dish.analysed = 1 - dish.loc = src.loc - dish = null - - icon_state = "analyser" - src.state("\The [src] prints a sheet of paper.") - - else if(dish && !scanning && !pause) - if(dish.virus2 && dish.growth > 50) - dish.growth -= 10 - scanning = 5 - icon_state = "analyser_processing" - else - pause = 1 - spawn(25) - dish.loc = src.loc - dish = null - - src.state("\The [src] buzzes, \"Insufficient growth density to complete analysis.\"") - pause = 0 - return diff --git a/code/modules/virus2/antibodies.dm b/code/modules/virus2/antibodies.dm deleted file mode 100644 index cecb070940..0000000000 --- a/code/modules/virus2/antibodies.dm +++ /dev/null @@ -1,26 +0,0 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33 - -var/global/list/ALL_ANTIGENS = list( - "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" - ) - -/hook/startup/proc/randomise_antigens_order() - ALL_ANTIGENS = shuffle(ALL_ANTIGENS) - return 1 - -// iterate over the list of antigens and see what matches -/proc/antigens2string(list/antigens, none="None") - if(!istype(antigens)) - CRASH("Illegal type!") - if(!antigens.len) - return none - - var/code = "" - for(var/V in ALL_ANTIGENS) - if(V in antigens) - code += V - - if(!code) - return none - - return code diff --git a/code/modules/virus2/biohazard destroyer.dm b/code/modules/virus2/biohazard destroyer.dm deleted file mode 100644 index 37eaf06561..0000000000 --- a/code/modules/virus2/biohazard destroyer.dm +++ /dev/null @@ -1,20 +0,0 @@ -/obj/machinery/disease2/biodestroyer - name = "Biohazard destroyer" - icon = 'icons/obj/pipes/disposal.dmi' - icon_state = "disposalbio" - var/list/accepts = list(/obj/item/clothing,/obj/item/virusdish/,/obj/item/cureimplanter,/obj/item/diseasedisk,/obj/item/reagent_containers) - density = TRUE - anchored = TRUE - -/obj/machinery/disease2/biodestroyer/attackby(var/obj/I as obj, var/mob/user as mob) - for(var/path in accepts) - if(I.type in typesof(path)) - user.drop_item() - qdel(I) - add_overlay("dispover-handle") - return - user.drop_item() - I.loc = src.loc - - for(var/mob/O in hearers(src, null)) - O.show_message(span_blue("[icon2html(src, O.client)] The [src.name] beeps."), 2) diff --git a/code/modules/virus2/centrifuge.dm b/code/modules/virus2/centrifuge.dm deleted file mode 100644 index 7c17ea24e9..0000000000 --- a/code/modules/virus2/centrifuge.dm +++ /dev/null @@ -1,208 +0,0 @@ -/obj/machinery/computer/centrifuge - name = "isolation centrifuge" - desc = "Used to separate things with different weight. Spin 'em round, round, right round." - icon = 'icons/obj/virology_vr.dmi' //VOREStation Edit - icon_state = "centrifuge" - var/curing - var/isolating - - var/obj/item/reagent_containers/glass/beaker/vial/sample = null - var/datum/disease2/disease/virus2 = null - -/obj/machinery/computer/centrifuge/attackby(var/obj/item/O as obj, var/mob/user as mob) - if(O.has_tool_quality(TOOL_SCREWDRIVER)) - return ..(O,user) - - if(default_unfasten_wrench(user, O, 20)) - return - - if(istype(O,/obj/item/reagent_containers/glass/beaker/vial)) - if(sample) - to_chat(user, "\The [src] is already loaded.") - return - - sample = O - user.drop_item() - O.loc = src - - user.visible_message("[user] adds \a [O] to \the [src]!", "You add \a [O] to \the [src]!") - SStgui.update_uis(src) - - src.attack_hand(user) - -/obj/machinery/computer/centrifuge/update_icon() - ..() - if(! (stat & (BROKEN|NOPOWER)) && (isolating || curing)) - icon_state = "centrifuge_moving" - -/obj/machinery/computer/centrifuge/attack_hand(var/mob/user as mob) - if(..()) - return - tgui_interact(user) - -/obj/machinery/computer/centrifuge/tgui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "IsolationCentrifuge", name) - ui.open() - -/obj/machinery/computer/centrifuge/tgui_data(mob/user) - var/list/data = list() - data["antibodies"] = null - data["pathogens"] = list() - data["is_antibody_sample"] = null - data["busy"] = null - data["sample_inserted"] = !!sample - - if(curing) - data["busy"] = "Isolating antibodies..." - else if(isolating) - data["busy"] = "Isolating pathogens..." - else - if(sample) - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in sample.reagents.reagent_list - if(B) - data["antibodies"] = antigens2string(B.data["antibodies"], none=null) - - var/list/pathogens[0] - var/list/virus = B.data["virus2"] - for (var/ID in virus) - var/datum/disease2/disease/V = virus[ID] - pathogens.Add(list(list("name" = V.name(), "spread_type" = V.spreadtype, "reference" = "\ref[V]"))) - - data["pathogens"] = pathogens - - else - var/datum/reagent/antibodies/A = locate(/datum/reagent/antibodies) in sample.reagents.reagent_list - if(A) - data["antibodies"] = antigens2string(A.data["antibodies"], none=null) - data["is_antibody_sample"] = 1 - - return data - -/obj/machinery/computer/centrifuge/process() - ..() - if(stat & (NOPOWER|BROKEN)) return - - if(curing) - curing -= 1 - if(curing == 0) - cure() - - if(isolating) - isolating -= 1 - if(isolating == 0) - isolate() - -/obj/machinery/computer/centrifuge/tgui_act(action, params) - if(..()) - return TRUE - - var/mob/user = usr - add_fingerprint(user) - - - switch(action) - if("print") - print(user) - . = TRUE - if("isolate") - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in sample.reagents.reagent_list - if(B) - var/datum/disease2/disease/virus = locate(params["isolate"]) - virus2 = virus.getcopy() - isolating = 40 - update_icon() - . = TRUE - if("antibody") - var/delay = 20 - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in sample.reagents.reagent_list - if(!B) - state("\The [src] buzzes, \"No antibody carrier detected.\"", "blue") - return TRUE - - var/has_toxins = locate(/datum/reagent/toxin) in sample.reagents.reagent_list - var/has_radium = sample.reagents.has_reagent("radium") - if(has_toxins || has_radium) - state("\The [src] beeps, \"Pathogen purging speed above nominal.\"", "blue") - if(has_toxins) - delay = delay/2 - if(has_radium) - delay = delay/2 - - curing = round(delay) - playsound(src, 'sound/machines/juicer.ogg', 50, 1) - update_icon() - . = TRUE - if("sample") - if(sample) - sample.loc = src.loc - sample = null - . = TRUE - - -/obj/machinery/computer/centrifuge/proc/cure() - if(!sample) return - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in sample.reagents.reagent_list - if(!B) return - - var/list/data = list("antibodies" = B.data["antibodies"]) - var/amt= sample.reagents.get_reagent_amount("blood") - sample.reagents.remove_reagent("blood", amt) - sample.reagents.add_reagent("antibodies", amt, data) - - SStgui.update_uis(src) - update_icon() - ping("\The [src] pings, \"Antibody isolated.\"") - -/obj/machinery/computer/centrifuge/proc/isolate() - if(!sample) return - var/obj/item/virusdish/dish = new/obj/item/virusdish(loc) - dish.virus2 = virus2 - virus2 = null - - SStgui.update_uis(src) - update_icon() - ping("\The [src] pings, \"Pathogen isolated.\"") - -/obj/machinery/computer/centrifuge/proc/print(var/mob/user) - var/obj/item/paper/P = new /obj/item/paper(loc) - P.name = "paper - Pathology Report" - P.info = {" - [virology_letterhead("Pathology Report")] - Sample: [sample.name]
-"} - - if(user) - P.info += "Generated By: [user.name]
" - - P.info += "
" - - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in sample.reagents.reagent_list - if(B) - P.info += "Antibodies: " - P.info += antigens2string(B.data["antibodies"]) - P.info += "
" - - var/list/virus = B.data["virus2"] - P.info += "Pathogens:
" - if(virus.len > 0) - for (var/ID in virus) - var/datum/disease2/disease/V = virus[ID] - P.info += "[V.name()]
" - else - P.info += "None
" - - else - var/datum/reagent/antibodies/A = locate(/datum/reagent/antibodies) in sample.reagents.reagent_list - if(A) - P.info += "The following antibodies have been isolated from the blood sample: " - P.info += antigens2string(A.data["antibodies"]) - P.info += "
" - - P.info += {" -
- Additional Notes: -"} - - state("The nearby computer prints out a pathology report.") diff --git a/code/modules/virus2/curer.dm b/code/modules/virus2/curer.dm deleted file mode 100644 index fda185f15f..0000000000 --- a/code/modules/virus2/curer.dm +++ /dev/null @@ -1,105 +0,0 @@ -/obj/machinery/computer/curer - name = "cure research machine" - icon_keyboard = "med_key" - icon_screen = "dna" - circuit = /obj/item/circuitboard/curefab - var/curing - var/virusing - - var/obj/item/reagent_containers/container = null - -/obj/machinery/computer/curer/attackby(var/obj/I as obj, var/mob/user as mob) - if(istype(I,/obj/item/reagent_containers)) - var/mob/living/carbon/C = user - if(!container) - container = I - C.drop_item() - I.loc = src - return - if(istype(I,/obj/item/virusdish)) - if(virusing) - to_chat(user, span_infoplain(span_bold("The pathogen materializer is still recharging..."))) - return - var/obj/item/reagent_containers/glass/beaker/product = new(src.loc) - - var/list/data = list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"virus2"=list(),"antibodies"=list()) - data["virus2"] |= I:virus2 - product.reagents.add_reagent("blood",30,data) - - virusing = 1 - spawn(1200) virusing = 0 - - state("The [src.name] Buzzes", "blue") - return - ..() - return - -/obj/machinery/computer/curer/attack_ai(var/mob/user as mob) - return src.attack_hand(user) - -/obj/machinery/computer/curer/attack_hand(var/mob/user as mob) - if(..()) - return - user.machine = src - var/dat - if(curing) - dat = "Antibody production in progress" - else if(virusing) - dat = "Virus production in progress" - else if(container) - // see if there's any blood in the container - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in container.reagents.reagent_list - - if(B) - dat = "Blood sample inserted." - dat += "
Antibodies: [antigens2string(B.data["antibodies"])]" - dat += "
Begin antibody production" - else - dat += "
Please check container contents." - dat += "
Eject container" - else - dat = "Please insert a container." - - user << browse(dat, "window=computer;size=400x500") - onclose(user, "computer") - return - -/obj/machinery/computer/curer/process() - ..() - - if(stat & (NOPOWER|BROKEN)) - return - use_power(500) - - if(curing) - curing -= 1 - if(curing == 0) - if(container) - createcure(container) - return - -/obj/machinery/computer/curer/Topic(href, href_list) - if(..()) - return 1 - usr.machine = src - - if (href_list["antibody"]) - curing = 10 - else if(href_list["eject"]) - container.loc = src.loc - container = null - - src.add_fingerprint(usr) - src.updateUsrDialog() - - -/obj/machinery/computer/curer/proc/createcure(var/obj/item/reagent_containers/container) - var/obj/item/reagent_containers/glass/beaker/product = new(src.loc) - - var/datum/reagent/blood/B = locate() in container.reagents.reagent_list - - var/list/data = list() - data["antibodies"] = B.data["antibodies"] - product.reagents.add_reagent("antibodies",30,data) - - state("\The [src.name] buzzes", "blue") diff --git a/code/modules/virus2/disease2.dm b/code/modules/virus2/disease2.dm deleted file mode 100644 index e8a275e838..0000000000 --- a/code/modules/virus2/disease2.dm +++ /dev/null @@ -1,320 +0,0 @@ -/datum/disease2/disease - var/infectionchance = 70 - var/speed = 1 - var/spreadtype = "Blood" // Can also be "Contact" or "Airborne" - var/stage = 1 - var/stageprob = 10 - var/dead = 0 - var/clicks = 0 - var/uniqueID = 0 - var/list/datum/disease2/effectholder/effects = list() - var/antigen = list() // 16 bits describing the antigens, when one bit is set, a cure with that bit can dock here - var/max_stage = 4 - var/list/affected_species = list(SPECIES_HUMAN,SPECIES_UNATHI,SPECIES_SKRELL,SPECIES_TAJ) - var/resistance = 10 // % chance a disease will resist cure, up to 100 - -/datum/disease2/disease/New() - uniqueID = rand(0,10000) - ..() - -/datum/disease2/disease/proc/makerandom(var/severity=1) - var/list/excludetypes = list() - for(var/i=1 ; i <= max_stage ; i++ ) - var/datum/disease2/effectholder/holder = new /datum/disease2/effectholder - holder.stage = i - holder.getrandomeffect(severity, excludetypes) - excludetypes += holder.effect.type - effects += holder - uniqueID = rand(0,10000) - switch(severity) - if(1) - infectionchance = 1 - if(2) - infectionchance = rand(10,20) - else - infectionchance = rand(60,90) - - antigen = list(pick(ALL_ANTIGENS)) - antigen |= pick(ALL_ANTIGENS) - spreadtype = prob(70) ? "Airborne" : "Contact" - resistance = rand(15,70) - - if(severity >= 2 && prob(33)) - resistance += 10 - - if(GLOB.all_species.len) - affected_species = get_infectable_species() - -/proc/get_infectable_species() - var/list/meat = list() - var/list/res = list() - for (var/specie in GLOB.all_species) - var/datum/species/S = GLOB.all_species[specie] - if(!S.get_virus_immune()) - meat += S - if(meat.len) - var/num = rand(1,meat.len) - for(var/i=0,i 50) - if(prob(1)) - majormutate() - - //Space antibiotics have a good chance to stop disease completely - if(mob.chem_effects[CE_ANTIBIOTIC]) - if(stage == 1 && prob(70-resistance)) - src.cure(mob) - else - resistance += rand(1,9) - - //VOREStation Add Start - Corophazine can treat higher stages - var/antibiotics = mob.chem_effects[CE_ANTIBIOTIC] - if(antibiotics == ANTIBIO_SUPER) - if(prob(70)) - src.cure(mob) - //VOREStation Add End - - //Resistance is capped at 90 without being manually set to 100 - if(resistance > 90 && resistance < 100) - resistance = 90 - - - //Virus food speeds up disease progress - if(mob.reagents.has_reagent("virusfood")) - mob.reagents.remove_reagent("virusfood",0.1) - clicks += 10 - - if(prob(1) && prob(stage)) // Increasing chance of curing as the virus progresses - src.cure(mob) - mob.antibodies |= src.antigen - - //Moving to the next stage - if(clicks > max(stage*100, 200) && prob(10)) - if((stage <= max_stage) && prob(5)) // ~20% of viruses will be cured by the end of S4 with this - src.cure(mob) - mob.antibodies |= src.antigen - stage++ - clicks = 0 - - //Do nasty effects - for(var/datum/disease2/effectholder/e in effects) - if(prob(33)) - e.runeffect(mob,stage) - - //Short airborne spread - if(src.spreadtype == "Airborne") - for(var/mob/living/carbon/M in oview(1,mob)) - if(airborne_can_reach(get_turf(mob), get_turf(M))) - infect_virus2(M,src) - - //fever - mob.bodytemperature = max(mob.bodytemperature, min(310+5*min(stage,max_stage) ,mob.bodytemperature+5*min(stage,max_stage))) - clicks+=speed - -/datum/disease2/disease/proc/cure(var/mob/living/carbon/mob) - for(var/datum/disease2/effectholder/e in effects) - e.effect.deactivate(mob) - mob.virus2.Remove("[uniqueID]") - BITSET(mob.hud_updateflag, STATUS_HUD) - -/datum/disease2/disease/proc/minormutate() - //uniqueID = rand(0,10000) - var/datum/disease2/effectholder/holder = pick(effects) - holder.minormutate() - //infectionchance = min(50,infectionchance + rand(0,10)) - -/datum/disease2/disease/proc/majormutate() - uniqueID = rand(0,10000) - var/datum/disease2/effectholder/holder = pick(effects) - var/list/exclude = list() - for(var/datum/disease2/effectholder/D in effects) - if(D != holder) - exclude += D.effect.type - holder.majormutate(exclude) - if (prob(5) && prob(100-resistance)) // The more resistant the disease,the lower the chance of randomly developing the antibodies - antigen = list(pick(ALL_ANTIGENS)) - antigen |= pick(ALL_ANTIGENS) - if (prob(5) && GLOB.all_species.len) - affected_species = get_infectable_species() - if (prob(10)) - resistance += rand(1,9) - if(resistance > 90 && resistance < 100) - resistance = 90 - -/datum/disease2/disease/proc/getcopy() - var/datum/disease2/disease/disease = new /datum/disease2/disease - disease.infectionchance = infectionchance - disease.spreadtype = spreadtype - disease.stageprob = stageprob - disease.antigen = antigen - disease.uniqueID = uniqueID - disease.resistance = resistance - disease.affected_species = affected_species.Copy() - for(var/datum/disease2/effectholder/holder in effects) - var/datum/disease2/effectholder/newholder = new /datum/disease2/effectholder - newholder.effect = new holder.effect.type - newholder.effect.generate(holder.effect.data) - newholder.chance = holder.chance - newholder.cure = holder.cure - newholder.multiplier = holder.multiplier - newholder.happensonce = holder.happensonce - newholder.stage = holder.stage - disease.effects += newholder - return disease - -/datum/disease2/disease/proc/issame(var/datum/disease2/disease/disease) - var/list/types = list() - var/list/types2 = list() - for(var/datum/disease2/effectholder/d in effects) - types += d.effect.type - var/equal = 1 - - for(var/datum/disease2/effectholder/d in disease.effects) - types2 += d.effect.type - - for(var/type in types) - if(!(type in types2)) - equal = 0 - - if (antigen != disease.antigen) - equal = 0 - return equal - -/proc/virus_copylist(var/list/datum/disease2/disease/viruses) - var/list/res = list() - for (var/ID in viruses) - var/datum/disease2/disease/V = viruses[ID] - res["[V.uniqueID]"] = V.getcopy() - return res - - -var/global/list/virusDB = list() - -/datum/disease2/disease/proc/name() - .= "stamm #[add_zero("[uniqueID]", 4)]" - if ("[uniqueID]" in virusDB) - var/datum/data/record/V = virusDB["[uniqueID]"] - .= V.fields["name"] - -/datum/disease2/disease/proc/get_basic_info() - var/t = "" - for(var/datum/disease2/effectholder/E in effects) - t += ", [E.effect.name]" - return "[name()] ([copytext(t,3)])" - -/datum/disease2/disease/proc/get_info() - var/r = {" - Analysis determined the existence of a GNAv2-based viral lifeform.
- Designation: [name()]
- Antigen: [antigens2string(antigen)]
- Transmitted By: [spreadtype]
- Rate of Progression: [stageprob * 10]
- Antibiotic Resistance [resistance]%
- Species Affected: [jointext(affected_species, ", ")]
-"} - - r += "Symptoms:
" - for(var/datum/disease2/effectholder/E in effects) - r += "([E.stage]) [E.effect.name] " - r += "Strength: [E.multiplier >= 3 ? "Severe" : E.multiplier > 1 ? "Above Average" : "Average"] " - r += "Aggressiveness: [E.chance * 15]
" - - return r - -/datum/disease2/disease/proc/get_tgui_info() - . = list( - "name" = name(), - "spreadtype" = spreadtype, - "antigen" = antigens2string(antigen), - "rate" = stageprob * 10, - "resistance" = resistance, - "species" = jointext(affected_species, ", "), - "ref" = "\ref[src]", - ) - - var/list/symptoms = list() - for(var/datum/disease2/effectholder/E in effects) - symptoms.Add(list(list( - "stage" = E.stage, - "name" = E.effect.name, - "strength" = "[E.multiplier >= 3 ? "Severe" : E.multiplier > 1 ? "Above Average" : "Average"]", - "aggressiveness" = E.chance * 15, - ))) - .["symptoms"] = symptoms - -/datum/disease2/disease/proc/addToDB() - if ("[uniqueID]" in virusDB) - return 0 - var/datum/data/record/v = new() - v.fields["id"] = uniqueID - v.fields["name"] = name() - v.fields["description"] = get_info() - v.fields["tgui_description"] = get_tgui_info() - v.fields["tgui_description"]["record"] = "\ref[v]" - v.fields["antigen"] = antigens2string(antigen) - v.fields["spread type"] = spreadtype - virusDB["[uniqueID]"] = v - return 1 - -/proc/virus2_lesser_infection() - var/list/candidates = list() //list of candidate keys - - for(var/mob/living/carbon/human/G in player_list) - if(G.client && G.stat != DEAD && !isbelly(G.loc)) - candidates += G - - if(!candidates.len) return - - candidates = shuffle(candidates) - - infect_mob_random_lesser(candidates[1]) - -/proc/virus2_greater_infection() - var/list/candidates = list() //list of candidate keys - - for(var/mob/living/carbon/human/G in player_list) - if(G.client && G.stat != DEAD && !isbelly(G.loc)) - candidates += G - if(!candidates.len) return - - candidates = shuffle(candidates) - - infect_mob_random_greater(candidates[1]) - -/proc/virology_letterhead(var/report_name) - return {" -

[report_name]

-
[station_name()] Virology Lab
-
-"} - -/datum/disease2/disease/proc/can_add_symptom(type) - for(var/datum/disease2/effectholder/H in effects) - if(H.effect.type == type) - return 0 - - return 1 diff --git a/code/modules/virus2/diseasesplicer.dm b/code/modules/virus2/diseasesplicer.dm deleted file mode 100644 index 74f9ad43d4..0000000000 --- a/code/modules/virus2/diseasesplicer.dm +++ /dev/null @@ -1,193 +0,0 @@ -/obj/machinery/computer/diseasesplicer - name = "disease splicer" - icon_keyboard = "med_key" - icon_screen = "crew" - - var/datum/disease2/effectholder/memorybank = null - var/list/species_buffer = null - var/analysed = 0 - var/obj/item/virusdish/dish = null - var/burning = 0 - var/splicing = 0 - var/scanning = 0 - -/obj/machinery/computer/diseasesplicer/attackby(var/obj/item/I as obj, var/mob/user as mob) - if(I.has_tool_quality(TOOL_SCREWDRIVER)) - return ..(I,user) - - if(default_unfasten_wrench(user, I, 20)) - return - - if(istype(I,/obj/item/virusdish)) - var/mob/living/carbon/c = user - if(dish) - to_chat(user, "\The [src] is already loaded.") - return - - dish = I - c.drop_item() - I.loc = src - - if(istype(I,/obj/item/diseasedisk)) - to_chat(user, "You upload the contents of the disk onto the buffer.") - memorybank = I:effect - species_buffer = I:species - analysed = I:analysed - - src.attack_hand(user) - -/obj/machinery/computer/diseasesplicer/attack_ai(var/mob/user as mob) - return src.attack_hand(user) - -/obj/machinery/computer/diseasesplicer/attack_hand(var/mob/user as mob) - if(..()) - return TRUE - tgui_interact(user) - -/obj/machinery/computer/diseasesplicer/tgui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "DiseaseSplicer", name) - ui.open() - -/obj/machinery/computer/diseasesplicer/tgui_data(mob/user) - var/list/data = list() - data["dish_inserted"] = !!dish - - data["buffer"] = null - if(memorybank) - data["buffer"] = list("name" = (analysed ? memorybank.effect.name : "Unknown Symptom"), "stage" = memorybank.effect.stage) - data["species_buffer"] = null - if(species_buffer) - data["species_buffer"] = analysed ? jointext(species_buffer, ", ") : "Unknown Species" - - data["effects"] = null - data["info"] = null - data["growth"] = 0 - data["affected_species"] = null - data["busy"] = null - if(splicing) - data["busy"] = "Splicing..." - else if(scanning) - data["busy"] = "Scanning..." - else if(burning) - data["busy"] = "Copying data to disk..." - else if(dish) - data["growth"] = min(dish.growth, 100) - - if(dish.virus2) - if(dish.virus2.affected_species) - data["affected_species"] = dish.analysed ? dish.virus2.affected_species : list() - - if(dish.growth >= 50) - var/list/effects[0] - for (var/datum/disease2/effectholder/e in dish.virus2.effects) - effects.Add(list(list("name" = (dish.analysed ? e.effect.name : "Unknown"), "stage" = (e.stage), "reference" = "\ref[e]", "badness" = e.effect.badness))) - data["effects"] = effects - else - data["info"] = "Insufficient cell growth for gene splicing." - else - data["info"] = "No virus detected." - else - data["info"] = "No dish loaded." - - return data - -/obj/machinery/computer/diseasesplicer/process() - if(stat & (NOPOWER|BROKEN)) - return - - if(scanning) - scanning -= 1 - if(!scanning) - ping("\The [src] pings, \"Analysis complete.\"") - SStgui.update_uis(src) - if(splicing) - splicing -= 1 - if(!splicing) - ping("\The [src] pings, \"Splicing operation complete.\"") - SStgui.update_uis(src) - if(burning) - burning -= 1 - if(!burning) - var/obj/item/diseasedisk/d = new /obj/item/diseasedisk(src.loc) - d.analysed = analysed - if(analysed) - if(memorybank) - d.name = "[memorybank.effect.name] GNA disk (Stage: [memorybank.effect.stage])" - d.effect = memorybank - else if(species_buffer) - d.name = "[jointext(species_buffer, ", ")] GNA disk" - d.species = species_buffer - else - if(memorybank) - d.name = "Unknown GNA disk (Stage: [memorybank.effect.stage])" - d.effect = memorybank - else if(species_buffer) - d.name = "Unknown Species GNA disk" - d.species = species_buffer - - ping("\The [src] pings, \"Backup disk saved.\"") - SStgui.update_uis(src) - -/obj/machinery/computer/diseasesplicer/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state) - if(..()) - return TRUE - - var/mob/user = usr - add_fingerprint(user) - - switch(action) - if("grab") - if(dish) - memorybank = locate(params["grab"]) - species_buffer = null - analysed = dish.analysed - dish = null - scanning = 10 - . = TRUE - - if("affected_species") - if(dish) - memorybank = null - species_buffer = dish.virus2.affected_species - analysed = dish.analysed - dish = null - scanning = 10 - . = TRUE - - if("eject") - if(dish) - dish.loc = src.loc - dish = null - . = TRUE - - if("splice") - if(dish) - var/target = text2num(params["splice"]) // target = 1 to 4 for effects, 5 for species - if(memorybank && 0 < target && target <= 4) - if(target < memorybank.effect.stage) return // too powerful, catching this for href exploit prevention - - var/datum/disease2/effectholder/target_holder - var/list/illegal_types = list() - for(var/datum/disease2/effectholder/e in dish.virus2.effects) - if(e.stage == target) - target_holder = e - else - illegal_types += e.effect.type - if(memorybank.effect.type in illegal_types) return - target_holder.effect = memorybank.effect - - else if(species_buffer && target == 5) - dish.virus2.affected_species = species_buffer - - else - return - - splicing = 10 - dish.virus2.uniqueID = rand(0,10000) - . = TRUE - - if("disk") - burning = 10 - . = TRUE diff --git a/code/modules/virus2/dishincubator.dm b/code/modules/virus2/dishincubator.dm deleted file mode 100644 index d6a84991d1..0000000000 --- a/code/modules/virus2/dishincubator.dm +++ /dev/null @@ -1,201 +0,0 @@ -/obj/machinery/disease2/incubator/ - name = "pathogenic incubator" - desc = "Encourages the growth of diseases. This model comes with a dispenser system and a small radiation generator." - density = TRUE - anchored = TRUE - icon = 'icons/obj/virology_vr.dmi' //VOREStation Edit - icon_state = "incubator" - var/obj/item/virusdish/dish - var/obj/item/reagent_containers/glass/beaker = null - var/radiation = 0 - - var/on = 0 - var/power = 0 - - var/foodsupply = 0 - var/toxins = 0 - -/obj/machinery/disease2/incubator/attackby(var/obj/O as obj, var/mob/user as mob) - if(default_unfasten_wrench(user, O, 20)) - return - - if(istype(O, /obj/item/reagent_containers/glass) || istype(O,/obj/item/reagent_containers/syringe)) - - if(beaker) - to_chat(user, "\The [src] is already loaded.") - return - - beaker = O - user.drop_item() - O.loc = src - - user.visible_message("[user] adds \a [O] to \the [src]!", "You add \a [O] to \the [src]!") - SStgui.update_uis(src) - - src.attack_hand(user) - return - - if(istype(O, /obj/item/virusdish)) - - if(dish) - to_chat(user, "The dish tray is aleady full!") - return - - dish = O - user.drop_item() - O.loc = src - - user.visible_message("[user] adds \a [O] to \the [src]!", "You add \a [O] to \the [src]!") - SStgui.update_uis(src) - - src.attack_hand(user) - -/obj/machinery/disease2/incubator/attack_hand(mob/user as mob) - if(stat & (NOPOWER|BROKEN)) - return - tgui_interact(user) - -/obj/machinery/disease2/incubator/tgui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "DishIncubator", name) - ui.set_autoupdate(FALSE) - ui.open() - -/obj/machinery/disease2/incubator/tgui_data(mob/user) - var/data[0] - data["chemicals_inserted"] = !!beaker - data["dish_inserted"] = !!dish - data["food_supply"] = foodsupply - data["radiation"] = radiation - data["toxins"] = min(toxins, 100) - data["on"] = on - data["system_in_use"] = foodsupply > 0 || radiation > 0 || toxins > 0 - data["chemical_volume"] = beaker ? beaker.reagents.total_volume : 0 - data["max_chemical_volume"] = beaker ? beaker.volume : 1 - data["virus"] = dish ? dish.virus2 : null - data["growth"] = dish ? min(dish.growth, 100) : 0 - data["infection_rate"] = dish && dish.virus2 ? dish.virus2.infectionchance * 10 : 0 - data["analysed"] = dish && dish.analysed ? 1 : 0 - data["can_breed_virus"] = null - data["blood_already_infected"] = null - - if(beaker) - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in beaker.reagents.reagent_list - data["can_breed_virus"] = dish && dish.virus2 && B - - if(B) - if(!B.data["virus2"]) - B.data["virus2"] = list() - - var/list/virus = B.data["virus2"] - for (var/ID in virus) - data["blood_already_infected"] = virus[ID] - - return data - -/obj/machinery/disease2/incubator/process() - if(dish && on && dish.virus2) - use_power(50,EQUIP) - if(!powered(EQUIP)) - on = 0 - icon_state = "incubator" - - if(foodsupply) - if(dish.growth + 3 >= 100 && dish.growth < 100) - ping("\The [src] pings, \"Sufficient viral growth density achieved.\"") - - foodsupply -= 1 - dish.growth += 3 - SStgui.update_uis(src) - - if(radiation) - if(radiation > 50 & prob(5)) - dish.virus2.majormutate() - if(dish.info) - dish.info = "OUTDATED : [dish.info]" - dish.basic_info = "OUTDATED: [dish.basic_info]" - dish.analysed = 0 - ping("\The [src] pings, \"Mutant viral strain detected.\"") - else if(prob(5)) - dish.virus2.minormutate() - radiation -= 1 - SStgui.update_uis(src) - if(toxins && prob(5)) - dish.virus2.infectionchance -= 1 - SStgui.update_uis(src) - if(toxins > 50) - dish.growth = 0 - dish.virus2 = null - SStgui.update_uis(src) - else if(!dish) - on = 0 - icon_state = "incubator" - SStgui.update_uis(src) - - if(beaker) - if(foodsupply < 100 && beaker.reagents.remove_reagent("virusfood",5)) - if(foodsupply + 10 <= 100) - foodsupply += 10 - SStgui.update_uis(src) - - if(locate(/datum/reagent/toxin) in beaker.reagents.reagent_list && toxins < 100) - for(var/datum/reagent/toxin/T in beaker.reagents.reagent_list) - toxins += max(T.strength,1) - beaker.reagents.remove_reagent(T.id,1) - if(toxins > 100) - toxins = 100 - break - SStgui.update_uis(src) - -/obj/machinery/disease2/incubator/tgui_act(action, params) - if(..()) - return TRUE - - var/mob/user = usr - add_fingerprint(user) - switch(action) - if("ejectchem") - if(beaker) - beaker.loc = src.loc - beaker = null - . = TRUE - - if("power") - if(dish) - on = !on - icon_state = on ? "incubator_on" : "incubator" - . = TRUE - - if("ejectdish") - if(dish) - dish.loc = src.loc - dish = null - . = TRUE - - if("rad") - radiation = min(100, radiation + 10) - . = TRUE - - if("flush") - radiation = 0 - toxins = 0 - foodsupply = 0 - . = TRUE - - if("virus") - if(!dish) - return TRUE - - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in beaker.reagents.reagent_list - if(!B) - return TRUE - - if(!B.data["virus2"]) - B.data["virus2"] = list() - - var/list/virus = list("[dish.virus2.uniqueID]" = dish.virus2.getcopy()) - B.data["virus2"] += virus - - ping("\The [src] pings, \"Injection complete.\"") - . = TRUE diff --git a/code/modules/virus2/effect.dm b/code/modules/virus2/effect.dm deleted file mode 100644 index 8f088ee0e6..0000000000 --- a/code/modules/virus2/effect.dm +++ /dev/null @@ -1,520 +0,0 @@ -/datum/disease2/effectholder - var/name = "Holder" - var/datum/disease2/effect/effect - var/chance = 0 //Chance in percentage each tick - var/cure = "" //Type of cure it requires - var/happensonce = 0 - var/multiplier = 1 //The chance the effects are WORSE - var/stage = 0 - -/datum/disease2/effectholder/proc/runeffect(var/mob/living/carbon/human/mob,var/stage) - if(happensonce > -1 && effect.stage <= stage && prob(chance)) - effect.activate(mob, multiplier) - if(happensonce == 1) - happensonce = -1 - -/datum/disease2/effectholder/proc/getrandomeffect(var/badness = 1, exclude_types=list()) - var/list/datum/disease2/effect/list = list() - for(var/datum/disease2/effect/f as anything in subtypesof(/datum/disease2/effect)) - if(f in exclude_types) - continue - if(initial(f.badness) > badness) //we don't want such strong effects - continue - if(initial(f.stage) <= src.stage) - list += f - var/type = pick(list) - effect = new type() - effect.generate() - chance = rand(0,effect.chance_maxm) - multiplier = rand(1,effect.maxm) - -/datum/disease2/effectholder/proc/minormutate() - switch(pick(1,2,3,4,5)) - if(1) - chance = rand(0,effect.chance_maxm) - if(2) - multiplier = rand(1,effect.maxm) - -/datum/disease2/effectholder/proc/majormutate(exclude_types=list()) - getrandomeffect(3, exclude_types) - -//////////////////////////////////////////////////////////////// -////////////////////////EFFECTS///////////////////////////////// -//////////////////////////////////////////////////////////////// - -/datum/disease2/effect - var/chance_maxm = 50 //note that disease effects only proc once every 3 ticks for humans - var/name = "Blanking effect" - var/stage = 4 - var/maxm = 1 - var/badness = 1 - var/data = null // For semi-procedural effects; this should be generated in generate() if used - -/datum/disease2/effect/proc/activate(var/mob/living/carbon/mob,var/multiplier) -/datum/disease2/effect/proc/deactivate(var/mob/living/carbon/mob) -/datum/disease2/effect/proc/generate(copy_data) // copy_data will be non-null if this is a copy; it should be used to initialise the data for this effect if present - -/datum/disease2/effect/invisible - name = "Waiting Syndrome" - stage = 1 - badness = 3 - -/datum/disease2/effect/invisible/activate(var/mob/living/carbon/mob,var/multiplier) - return - -////////////////////////STAGE 4///////////////////////////////// - -/datum/disease2/effect/nothing - name = "Nil Syndrome" - stage = 4 - badness = 1 - chance_maxm = 0 - -/datum/disease2/effect/gibbingtons - name = "Gibbington's Syndrome" - stage = 4 - badness = 3 - -/datum/disease2/effect/gibbingtons/activate(var/mob/living/carbon/mob,var/multiplier) - // Probabilities have been tweaked to kill in ~2-3 minutes, giving 5-10 messages. - // Probably needs more balancing, but it's better than LOL U GIBBED NOW, especially now that viruses can potentially have no signs up until Gibbingtons. - mob.adjustBruteLoss(10*multiplier) - if(istype(mob, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = mob - var/obj/item/organ/external/O = pick(H.organs) - if(prob(25)) - to_chat(mob, span_warning("Your [O.name] feels as if it might burst!")) - if(prob(10)) - spawn(50) - if(O) - O.droplimb(0,DROPLIMB_BLUNT) - else - if(prob(75)) - to_chat(mob, span_warning("Your whole body feels like it might fall apart!")) - if(prob(10)) - mob.adjustBruteLoss(25*multiplier) - -/datum/disease2/effect/radian - name = "Radian's Syndrome" - stage = 4 - maxm = 3 - badness = 2 - -/datum/disease2/effect/radian/activate(var/mob/living/carbon/mob,var/multiplier) - mob.apply_effect(2*multiplier, IRRADIATE, check_protection = 0) - -/datum/disease2/effect/deaf - name = "Deafness" - stage = 4 - badness = 2 - -/datum/disease2/effect/deaf/activate(var/mob/living/carbon/mob,var/multiplier) - mob.ear_deaf += 20 - -/datum/disease2/effect/monkey - name = "Genome Regression" - stage = 4 - badness = 3 - -/datum/disease2/effect/monkey/activate(var/mob/living/carbon/mob,var/multiplier) - if(istype(mob,/mob/living/carbon/human)) - var/mob/living/carbon/human/h = mob - h.monkeyize() - -/datum/disease2/effect/killertoxins - name = "Autoimmune Response" - stage = 4 - badness = 2 - -/datum/disease2/effect/killertoxins/activate(var/mob/living/carbon/mob,var/multiplier) - mob.adjustToxLoss(15*multiplier) - -/datum/disease2/effect/dna - name = "Catastrophic DNA Degeneration" - stage = 4 - badness = 2 - -/datum/disease2/effect/dna/activate(var/mob/living/carbon/mob,var/multiplier) - mob.bodytemperature = max(mob.bodytemperature, 350) - scramble(0,mob,10) - mob.apply_damage(10, CLONE) - -/datum/disease2/effect/organs - name = "Limb Paralysis" - stage = 4 - badness = 2 - -/datum/disease2/effect/organs/activate(var/mob/living/carbon/mob,var/multiplier) - if(istype(mob, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = mob - var/organ = pick(list("r_arm","l_arm","r_leg","l_leg")) - var/obj/item/organ/external/E = H.organs_by_name[organ] - if (!(E.status & ORGAN_DEAD)) - E.status |= ORGAN_DEAD - to_chat(H, span_notice("You can't feel your [E.name] anymore...")) - for (var/obj/item/organ/external/C in E.children) - C.status |= ORGAN_DEAD - H.update_icons_body() - mob.adjustToxLoss(15*multiplier) - -/datum/disease2/effect/organs/deactivate(var/mob/living/carbon/mob,var/multiplier) - if(istype(mob, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = mob - for (var/obj/item/organ/external/E in H.organs) - E.status &= ~ORGAN_DEAD - for (var/obj/item/organ/external/C in E.children) - C.status &= ~ORGAN_DEAD - H.update_icons_body() - -/datum/disease2/effect/internalorgan - name = "Organ Shutdown" - stage = 4 - badness = 2 - -/datum/disease2/effect/internalorgan/activate(var/mob/living/carbon/mob,var/multiplier) - if(istype(mob, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = mob - var/organ = pick(list("heart","kidney","liver", "lungs")) - var/obj/item/organ/internal/O = H.organs_by_name[organ] - if (O.robotic != ORGAN_ROBOT) - O.damage += (5*multiplier) - to_chat(H, span_notice("You feel a cramp in your guts.")) - -/datum/disease2/effect/immortal - name = "Hyperaccelerated Aging" - stage = 4 - badness = 2 - -/datum/disease2/effect/immortal/activate(var/mob/living/carbon/mob,var/multiplier) - if(istype(mob, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = mob - for (var/obj/item/organ/external/E in H.organs) - if (E.status & ORGAN_BROKEN && prob(30)) - E.status ^= ORGAN_BROKEN - var/heal_amt = -5*multiplier - mob.apply_damages(heal_amt,heal_amt,heal_amt,heal_amt) - -/datum/disease2/effect/immortal/deactivate(var/mob/living/carbon/mob,var/multiplier) - if(istype(mob, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = mob - to_chat(H, span_notice("You suddenly feel hurt and old...")) - H.age += 8 - var/backlash_amt = 5*multiplier - mob.apply_damages(backlash_amt,backlash_amt,backlash_amt,backlash_amt) - -/datum/disease2/effect/bones - name = "Brittle Bones" - stage = 4 - badness = 2 -/datum/disease2/effect/bones/activate(var/mob/living/carbon/mob,var/multiplier) - if(istype(mob, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = mob - for (var/obj/item/organ/external/E in H.organs) - E.min_broken_damage = max(5, E.min_broken_damage - 30) - -/datum/disease2/effect/bones/deactivate(var/mob/living/carbon/mob,var/multiplier) - if(istype(mob, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = mob - for (var/obj/item/organ/external/E in H.organs) - E.min_broken_damage = initial(E.min_broken_damage) - -/datum/disease2/effect/combustion - name = "Organic Ignition" - stage = 4 - badness = 3 - -/datum/disease2/effect/combustion/activate(var/mob/living/carbon/mob,var/multiplier) - if(istype(mob, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = mob - var/obj/item/organ/external/O = pick(H.organs) - if(prob(25)) - to_chat(mob, span_warning("It feels like your [O.name] is on fire and your blood is boiling!")) - H.adjust_fire_stacks(1) - if(prob(10)) - to_chat(mob, span_warning("Flames erupt from your skin, your entire body is burning!")) - H.adjust_fire_stacks(2) - H.IgniteMob() - - -////////////////////////STAGE 3///////////////////////////////// - -/datum/disease2/effect/toxins - name = "Hyperacidity" - stage = 3 - maxm = 3 - -/datum/disease2/effect/toxins/activate(var/mob/living/carbon/mob,var/multiplier) - mob.adjustToxLoss((2*multiplier)) - -/datum/disease2/effect/shakey - name = "Nervous Motor Instability" - stage = 3 - maxm = 3 - -/datum/disease2/effect/shakey/activate(var/mob/living/carbon/mob,var/multiplier) - shake_camera(mob,5*multiplier) - -/datum/disease2/effect/telepathic - name = "Pineal Gland Decalcification" - stage = 3 - -/datum/disease2/effect/telepathic/activate(var/mob/living/carbon/mob,var/multiplier) - mob.dna.SetSEState(REMOTETALKBLOCK,1) - domutcheck(mob, null, MUTCHK_FORCED) - -/datum/disease2/effect/mind - name = "Neurodegeneration" - stage = 3 - -/datum/disease2/effect/mind/activate(var/mob/living/carbon/mob,var/multiplier) - if(istype(mob, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = mob - var/obj/item/organ/internal/brain/B = H.internal_organs_by_name["brain"] - if (B && B.damage < B.min_broken_damage) - B.take_damage(5) - else - mob.setBrainLoss(10) - -/datum/disease2/effect/hallucinations - name = "Hallucination" - stage = 3 - -/datum/disease2/effect/hallucinations/activate(var/mob/living/carbon/mob,var/multiplier) - mob.hallucination += 25 - -/datum/disease2/effect/minordeaf - name = "Hearing Loss" - stage = 3 - -/datum/disease2/effect/minordeaf/activate(var/mob/living/carbon/mob,var/multiplier) - mob.ear_deaf = 5 - -/datum/disease2/effect/giggle - name = "Uncontrolled Laughter" - stage = 3 - chance_maxm = 20 - -/datum/disease2/effect/giggle/activate(var/mob/living/carbon/mob,var/multiplier) - if(prob(66)) - mob.say("*giggle") - else - to_chat(mob, span_notice("What's so funny?")) - -/datum/disease2/effect/confusion - name = "Topographical Cretinism" - stage = 3 - -/datum/disease2/effect/confusion/activate(var/mob/living/carbon/mob,var/multiplier) - to_chat(mob, span_notice("You have trouble telling right and left apart all of a sudden.")) - mob.Confuse(10) - -/datum/disease2/effect/mutation - name = "DNA Degradation" - stage = 3 - -/datum/disease2/effect/mutation/activate(var/mob/living/carbon/mob,var/multiplier) - mob.apply_damage(2, CLONE) - -/datum/disease2/effect/groan - name = "Phantom Aches" - stage = 3 - chance_maxm = 20 - -/datum/disease2/effect/groan/activate(var/mob/living/carbon/mob,var/multiplier) - if(prob(66)) - mob.say("*groan") - else if(istype(mob, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = mob - var/obj/item/organ/external/E = pick(H.organs) - to_chat(mob, span_warning("Your [E] aches.")) - -/datum/disease2/effect/chem_synthesis - name = "Chemical Synthesis" - stage = 3 - chance_maxm = 25 - -/datum/disease2/effect/chem_synthesis/generate(c_data) - if(c_data) - data = c_data - else - data = pick("bicaridine", "kelotane", "anti_toxin", "inaprovaline", "bliss", "sugar", - "tramadol", "dexalin", "cryptobiolin", "impedrezene", "hyperzine", "ethylredoxrazine", - "mindbreaker", "glucose") - var/datum/reagent/R = SSchemistry.chemical_reagents[data] - name = "[initial(name)] ([initial(R.name)])" - -/datum/disease2/effect/chem_synthesis/activate(var/mob/living/carbon/mob,var/multiplier) - if (mob.reagents.get_reagent_amount(data) < 5) - mob.reagents.add_reagent(data, 2) - -/datum/disease2/effect/nonrejection - name = "Genetic Chameleonism" - stage = 3 - -/datum/disease2/effect/nonrejection/activate(var/mob/living/carbon/mob,var/multiplier) - if(istype(mob, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = mob - var/obj/item/organ/internal/O = H.organs_by_name - for (var/organ in H.organs_by_name) - if (O.robotic != ORGAN_ROBOT) - O.rejecting = 0 - - -////////////////////////STAGE 2///////////////////////////////// - -/datum/disease2/effect/scream - name = "Involuntary Vocalization" - stage = 2 - chance_maxm = 10 - -/datum/disease2/effect/scream/activate(var/mob/living/carbon/mob,var/multiplier) - mob.say("*scream") - -/datum/disease2/effect/drowsness - name = "Excessive Sleepiness" - stage = 2 - -/datum/disease2/effect/drowsness/activate(var/mob/living/carbon/mob,var/multiplier) - mob.drowsyness += 10 - -/datum/disease2/effect/sleepy - name = "Narcolepsy" - stage = 2 - chance_maxm = 15 - -/datum/disease2/effect/sleepy/activate(var/mob/living/carbon/mob,var/multiplier) - mob.say("*collapse") - -/datum/disease2/effect/blind - name = "Vision Loss" - stage = 2 - -/datum/disease2/effect/blind/activate(var/mob/living/carbon/mob,var/multiplier) - mob.SetBlinded(4) - -/datum/disease2/effect/cough - name = "Severe Cough" - stage = 2 - chance_maxm = 20 - -/datum/disease2/effect/cough/activate(var/mob/living/carbon/mob,var/multiplier) - if(prob(60)) - mob.say("*cough") - for(var/mob/living/carbon/M in oview(2,mob)) - mob.spread_disease_to(M) - else - to_chat(mob, span_warning("Something gets caught in your throat.")) - -/datum/disease2/effect/hungry - name = "Digestive Inefficiency" - stage = 2 - -/datum/disease2/effect/hungry/activate(var/mob/living/carbon/mob,var/multiplier) - mob.adjust_nutrition(-200) - -/datum/disease2/effect/fridge - name = "Reduced Circulation" - stage = 2 - chance_maxm = 25 - -/datum/disease2/effect/fridge/activate(var/mob/living/carbon/mob,var/multiplier) - mob.say("*shiver") - -/datum/disease2/effect/hair - name = "Hair Loss" - stage = 2 - -/datum/disease2/effect/hair/activate(var/mob/living/carbon/mob,var/multiplier) - if(istype(mob, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = mob - if(H.species.name == SPECIES_HUMAN && !(H.h_style == "Bald") && !(H.h_style == "Balding Hair")) - to_chat(H, span_danger("Your hair starts to fall out in clumps...")) - spawn(50) - H.h_style = "Balding Hair" - H.update_hair() - -/datum/disease2/effect/stimulant - name = "Overactive Adrenal Gland" - stage = 2 - -/datum/disease2/effect/stimulant/activate(var/mob/living/carbon/mob,var/multiplier) - to_chat(mob, span_notice("You feel a rush of energy inside you!")) - if (mob.reagents.get_reagent_amount("hyperzine") < 10) - mob.reagents.add_reagent("hyperzine", 4) - if (prob(30)) - mob.jitteriness += 10 - -/datum/disease2/effect/ringing - name = "Tinnitus" - stage = 2 - chance_maxm = 25 - -/datum/disease2/effect/ringing/activate(var/mob/living/carbon/mob,var/multiplier) - if(istype(mob, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = mob - to_chat(H, span_notice("You hear an awful ringing in your ears.")) - H << 'sound/weapons/flash.ogg' - -/datum/disease2/effect/vomiting - name = "Vomiting" - stage = 2 - chance_maxm = 15 - -/datum/disease2/effect/vomiting/activate(var/mob/living/carbon/mob,var/multiplier) - to_chat(mob, span_notice("Your stomach churns!")) - if (prob(50)) - mob.say("*vomit") - -////////////////////////STAGE 1///////////////////////////////// - -/datum/disease2/effect/sneeze - name = "Sneezing" - stage = 1 - chance_maxm = 20 - -/datum/disease2/effect/sneeze/activate(var/mob/living/carbon/mob,var/multiplier) - if(prob(20)) - to_chat(mob, span_warning("You go to sneeze, but it gets caught in your sinuses!")) - else if(prob(80)) - if(prob(30)) - to_chat(mob, span_warning("You feel like you are about to sneeze!")) - spawn(5) //Sleep may have been hanging Mob controller. - mob.say("*sneeze") - for(var/mob/living/carbon/M in get_step(mob,mob.dir)) - mob.spread_disease_to(M) - if (prob(50)) - var/obj/effect/decal/cleanable/mucus/M = new(get_turf(mob)) - M.virus2 = virus_copylist(mob.virus2) - -/datum/disease2/effect/gunck - name = "Mucus Buildup" - stage = 1 - -/datum/disease2/effect/gunck/activate(var/mob/living/carbon/mob,var/multiplier) - to_chat(mob, span_warning("Mucous runs down the back of your throat.")) - -/datum/disease2/effect/drool - name = "Salivary Gland Stimulation" - stage = 1 - chance_maxm = 15 - -/datum/disease2/effect/drool/activate(var/mob/living/carbon/mob,var/multiplier) - mob.say("*drool") - if (prob(30)) - var/obj/effect/decal/cleanable/mucus/M = new(get_turf(mob)) - M.virus2 = virus_copylist(mob.virus2) - -/datum/disease2/effect/twitch - name = "Involuntary Twitching" - stage = 1 - chance_maxm = 15 - -/datum/disease2/effect/twitch/activate(var/mob/living/carbon/mob,var/multiplier) - mob.say("*twitch") - -/datum/disease2/effect/headache - name = "Headache" - stage = 1 - -/datum/disease2/effect/headache/activate(var/mob/living/carbon/mob,var/multiplier) - to_chat(mob, span_warning("Your head hurts a bit.")) diff --git a/code/modules/virus2/effect_vr.dm b/code/modules/virus2/effect_vr.dm deleted file mode 100644 index 307111f44e..0000000000 --- a/code/modules/virus2/effect_vr.dm +++ /dev/null @@ -1,63 +0,0 @@ -/////////////////////////////////////////////// -/////////////////// Stage 1 /////////////////// - -/datum/disease2/effect/mlem - name = "Mlemington's Syndrome" - stage = 1 - chance_maxm = 25 - -/datum/disease2/effect/mlem/activate(var/mob/living/carbon/mob,var/multiplier) - mob.say("[pick("Mlem.","MLEM!","Mlem?")]") - -/datum/disease2/effect/spin - name = "Spyndrome" - stage = 1 - chance_maxm = 7 - var/list/directions = list(2,4,1,8,2,4,1,8,2,4,1,8,2,4,1,8,2,4,1,8) - -/datum/disease2/effect/spin/activate(var/mob/living/carbon/mob,var/multiplier) - if(mob.buckled()) - to_chat(viewers(mob),span_warning("[mob.name] struggles violently against their restraints!")) - else - to_chat(viewers(mob),span_warning("[mob.name] spins around violently!")) - for(var/D in directions) - mob.dir = D - sleep(1) - mob.dir = pick(2,4,1,8) //For that added annoyance - -/////////////////////////////////////////////// -/////////////////// Stage 2 /////////////////// - -/datum/disease2/effect/lang - name = "Lingual Dissocation" - stage = 2 - chance_maxm = 2 - -/datum/disease2/effect/lang/activate(var/mob/living/carbon/mob,var/multiplier) - mob.set_default_language(pick(mob.languages)) - -/////////////////////////////////////////////// -/////////////////// Stage 3 /////////////////// - -/datum/disease2/effect/size - name = "Mass Revectoring" - stage = 3 - chance_maxm = 1 - -/datum/disease2/effect/size/activate(var/mob/living/carbon/mob,var/multiplier) - var/newsize = rand (25, 200) - mob.resize(newsize/100) - to_chat(viewers(mob),span_warning("[mob.name] suddenly changes size!")) - -/datum/disease2/effect/flip - name = "Flipponov's Disease" - stage = 3 - chance_maxm = 5 - -/datum/disease2/effect/flip/activate(var/mob/living/carbon/mob,var/multiplier) //Remind me why mob is carbon...? - if(ishuman(mob)) - var/mob/living/carbon/human/H = mob - H.emote("flip") - else - to_chat(viewers(mob),span_warning("[mob.name] does a backflip!")) - mob.SpinAnimation(7,1) diff --git a/code/modules/virus2/helpers.dm b/code/modules/virus2/helpers.dm deleted file mode 100644 index 053498042e..0000000000 --- a/code/modules/virus2/helpers.dm +++ /dev/null @@ -1,181 +0,0 @@ -//Returns 1 if mob can be infected, 0 otherwise. -/proc/infection_check(var/mob/living/carbon/M, var/vector = "Airborne") - if (!istype(M)) - return 0 - - var/mob/living/carbon/human/H = M - if(istype(H) && H.species.get_virus_immune(H)) - return 0 - - var/protection = M.getarmor(null, "bio") //gets the full body bio armour value, weighted by body part coverage. - var/score = round(0.06*protection) //scales 100% protection to 6. - - switch(vector) - if("Airborne") - if(M.internal) //not breathing infected air helps greatly - return 0 - var/obj/item/I = M.wear_mask - //masks provide a small bonus and can replace overall bio protection - if(I) - score = max(score, round(0.06*I.armor["bio"])) - if (istype(I, /obj/item/clothing/mask)) - score += 1 //this should be added after - - if("Contact") - if(istype(H)) - //gloves provide a larger bonus - if (istype(H.gloves, /obj/item/clothing/gloves)) - score += 2 - - if(score >= 6) - return 0 - else if(score >= 5 && prob(99)) - return 0 - else if(score >= 4 && prob(95)) - return 0 - else if(score >= 3 && prob(75)) - return 0 - else if(score >= 2 && prob(55)) - return 0 - else if(score >= 1 && prob(35)) - return 0 - return 1 - -//Similar to infection check, but used for when M is spreading the virus. -/proc/infection_spreading_check(var/mob/living/carbon/M, var/vector = "Airborne") - if (!istype(M)) - return 0 - - var/protection = M.getarmor(null, "bio") //gets the full body bio armour value, weighted by body part coverage. - - if (vector == "Airborne") - var/obj/item/I = M.wear_mask - if (istype(I)) - protection = max(protection, I.armor["bio"]) - - return prob(protection) - -//Checks if table-passing table can reach target (5 tile radius) -/proc/airborne_can_reach(turf/source, turf/target) - var/obj/dummy = new(source) - dummy.pass_flags = PASSTABLE - - for(var/i=0, i<5, i++) if(!step_towards(dummy, target)) break - - var/rval = dummy.Adjacent(target) - dummy.loc = null - dummy = null - return rval - -//Attemptes to infect mob M with virus. Set forced to 1 to ignore protective clothnig -/proc/infect_virus2(var/mob/living/carbon/M,var/datum/disease2/disease/disease,var/forced = 0) - if(!istype(disease)) -// log_debug("Bad virus") - return - if(!istype(M)) -// log_debug("Bad mob") - return - if ("[disease.uniqueID]" in M.virus2) - return - // if one of the antibodies in the mob's body matches one of the disease's antigens, don't infect - var/list/antibodies_in_common = M.antibodies & disease.antigen - if(antibodies_in_common.len) - return - if(M.chem_effects[CE_ANTIBIOTIC]) - if(prob(disease.resistance)) - var/datum/disease2/disease/D = disease.getcopy() - D.minormutate() - D.resistance += rand(1,9) -// log_debug("Adding virus") - M.virus2["[D.uniqueID]"] = D - BITSET(M.hud_updateflag, STATUS_HUD) - else - return //Virus prevented by antibiotics - - if(!disease.affected_species.len) - return - - if (!(M.species.get_bodytype() in disease.affected_species)) - if (forced) - disease.affected_species[1] = M.species.get_bodytype() - else - return //not compatible with this species - -// log_debug("Infecting [M]") - - if(forced || (infection_check(M, disease.spreadtype) && prob(disease.infectionchance))) - var/datum/disease2/disease/D = disease.getcopy() - D.minormutate() -// log_debug("Adding virus") - M.virus2["[D.uniqueID]"] = D - BITSET(M.hud_updateflag, STATUS_HUD) - - -//Infects mob M with disease D -/proc/infect_mob(var/mob/living/carbon/M, var/datum/disease2/disease/D) - infect_virus2(M,D,1) - M.hud_updateflag |= 1 << STATUS_HUD - -//Infects mob M with random lesser disease, if he doesn't have one -/proc/infect_mob_random_lesser(var/mob/living/carbon/M) - var/datum/disease2/disease/D = new /datum/disease2/disease - - D.makerandom(1) - infect_mob(M, D) - -//Infects mob M with random greated disease, if he doesn't have one -/proc/infect_mob_random_greater(var/mob/living/carbon/M) - var/datum/disease2/disease/D = new /datum/disease2/disease - - D.makerandom(2) - infect_mob(M, D) - -//Fancy prob() function. -/proc/dprob(var/p) - return(prob(sqrt(p)) && prob(sqrt(p))) - -/mob/living/carbon/proc/spread_disease_to(var/mob/living/carbon/victim, var/vector = "Airborne") - if (src == victim) - return "Neurodegeneration" - -// log_debug("Spreading [vector] diseases from [src] to [victim]") - if (virus2.len > 0) - for (var/ID in virus2) -// log_debug("Attempting virus [ID]") - var/datum/disease2/disease/V = virus2[ID] - if(V.spreadtype != vector) continue - - //It's hard to get other people sick if you're in an airtight suit. - if(!infection_spreading_check(src, V.spreadtype)) continue - - if (vector == "Airborne") - if(airborne_can_reach(get_turf(src), get_turf(victim))) -// log_debug("In range, infecting") - infect_virus2(victim,V) -// else -// log_debug("Could not reach target") - - if (vector == "Contact") - if (Adjacent(victim)) -// log_debug("In range, infecting") - infect_virus2(victim,V) - - //contact goes both ways - if (victim.virus2.len > 0 && vector == "Contact" && Adjacent(victim)) -// log_debug("Spreading [vector] diseases from [victim] to [src]") - var/nudity = 1 - - if (ishuman(victim)) - var/mob/living/carbon/human/H = victim - var/obj/item/organ/external/select_area = H.get_organ(src.zone_sel.selecting) - var/list/clothes = list(H.head, H.wear_mask, H.wear_suit, H.w_uniform, H.gloves, H.shoes) - for(var/obj/item/clothing/C in clothes) - if(C && istype(C)) - if(C.body_parts_covered & select_area.body_part) - nudity = 0 - if (nudity) - for (var/ID in victim.virus2) - var/datum/disease2/disease/V = victim.virus2[ID] - if(V && V.spreadtype != vector) continue - if(!infection_spreading_check(victim, V.spreadtype)) continue - infect_virus2(src,V) diff --git a/code/modules/virus2/isolator.dm b/code/modules/virus2/isolator.dm deleted file mode 100644 index 7e4dc12972..0000000000 --- a/code/modules/virus2/isolator.dm +++ /dev/null @@ -1,211 +0,0 @@ -/obj/machinery/disease2/isolator/ - name = "pathogenic isolator" - desc = "Used to isolate and identify diseases, allowing for comparison with a remote database." - density = TRUE - anchored = TRUE - icon = 'icons/obj/virology_vr.dmi' //VOREStation Edit - icon_state = "isolator" - var/isolating = 0 - var/datum/disease2/disease/virus2 = null - var/obj/item/reagent_containers/syringe/sample = null - -/obj/machinery/disease2/isolator/update_icon() - if (stat & (BROKEN|NOPOWER)) - icon_state = "isolator" - return - - if (isolating) - icon_state = "isolator_processing" - else if (sample) - icon_state = "isolator_in" - else - icon_state = "isolator" - -/obj/machinery/disease2/isolator/attackby(var/obj/O as obj, var/mob/user) - if(default_unfasten_wrench(user, O, 20)) - return - - else if(!istype(O,/obj/item/reagent_containers/syringe)) return - var/obj/item/reagent_containers/syringe/S = O - - if(sample) - to_chat(user, "\The [src] is already loaded.") - return - - sample = S - user.drop_item() - S.loc = src - - user.visible_message("[user] adds \a [O] to \the [src]!", "You add \a [O] to \the [src]!") - SStgui.update_uis(src) - update_icon() - - src.attack_hand(user) - -/obj/machinery/disease2/isolator/attack_hand(mob/user as mob) - if(stat & (NOPOWER|BROKEN)) - return - tgui_interact(user) - -/obj/machinery/disease2/isolator/tgui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "PathogenicIsolator", name) - ui.open() - - -/obj/machinery/disease2/isolator/tgui_data(mob/user) - var/list/data = list() - data["syringe_inserted"] = !!sample - data["isolating"] = isolating - data["pathogen_pool"] = null - data["can_print"] = !isolating - - var/list/pathogen_pool = list() - if(sample) - for(var/datum/reagent/blood/B in sample.reagents.reagent_list) - var/list/virus = B.data["virus2"] - for (var/ID in virus) - var/datum/disease2/disease/V = virus[ID] - var/datum/data/record/R = null - if (ID in virusDB) - R = virusDB[ID] - - var/mob/living/carbon/human/D = B.data["donor"] - pathogen_pool.Add(list(list(\ - "name" = "[istype(D) ? "[D.get_species()] " : ""][B.name]", \ - "dna" = B.data["blood_DNA"], \ - "unique_id" = V.uniqueID, \ - "reference" = "\ref[V]", \ - "is_in_database" = !!R, \ - "record" = "\ref[R]"))) - data["pathogen_pool"] = pathogen_pool - - var/list/db = list() - for(var/ID in virusDB) - var/datum/data/record/r = virusDB[ID] - db.Add(list(list("name" = r.fields["name"], "record" = "\ref[r]"))) - data["database"] = db - data["modal"] = tgui_modal_data(src) - return data - -/obj/machinery/disease2/isolator/process() - if (isolating > 0) - isolating -= 1 - if (isolating == 0) - if (virus2) - var/obj/item/virusdish/d = new /obj/item/virusdish(src.loc) - d.virus2 = virus2.getcopy() - virus2 = null - ping("\The [src] pings, \"Viral strain isolated.\"") - - SStgui.update_uis(src) - update_icon() - -/obj/machinery/disease2/isolator/tgui_act(action, list/params) - if(..()) - return TRUE - - var/mob/user = usr - add_fingerprint(user) - - . = TRUE - switch(tgui_modal_act(src, action, params)) - if(TGUI_MODAL_ANSWER) - return - - switch(action) - if("view_entry") - var/datum/data/record/v = locate(params["vir"]) - if(!istype(v)) - return FALSE - tgui_modal_message(src, "virus", "", null, v.fields["tgui_description"]) - return TRUE - - if("print") - print(user, params) - return TRUE - - if("isolate") - var/datum/disease2/disease/V = locate(params["isolate"]) - if (V) - virus2 = V - isolating = 20 - update_icon() - return TRUE - - if("eject") - if(!sample) - return FALSE - sample.forceMove(loc) - sample = null - update_icon() - return TRUE - -/obj/machinery/disease2/isolator/proc/print(mob/user, list/params) - var/obj/item/paper/P = new /obj/item/paper(loc) - - switch(params["type"]) - if("patient_diagnosis") - if (!sample) return - P.name = "paper - Patient Diagnostic Report" - P.info = {" - [virology_letterhead("Patient Diagnostic Report")] -
CONFIDENTIAL MEDICAL REPORT

- Sample: [sample.name]
-"} - - if (user) - P.info += "Generated By: [user.name]
" - - P.info += "
" - - for(var/datum/reagent/blood/B in sample.reagents.reagent_list) - var/mob/living/carbon/human/D = B.data["donor"] - P.info += "[D.get_species()] [B.name]:
[B.data["blood_DNA"]]
" - - var/list/virus = B.data["virus2"] - P.info += "Pathogens:
" - if (virus.len > 0) - for (var/ID in virus) - var/datum/disease2/disease/V = virus[ID] - P.info += "[V.name()]
" - else - P.info += "None
" - - P.info += {" -
- Additional Notes:  -"} - - if("virus_list") - P.name = "paper - Virus List" - P.info = {" - [virology_letterhead("Virus List")] -"} - - var/i = 0 - for (var/ID in virusDB) - i++ - var/datum/data/record/r = virusDB[ID] - P.info += "[i]. " + r.fields["name"] - P.info += "
" - - P.info += {" -
- Additional Notes:  -"} - - if("virus_record") - var/datum/data/record/v = locate(params["vir"]) - if(!istype(v)) - return FALSE - P.name = "paper - Viral Profile" - P.info = {" - [virology_letterhead("Viral Profile")] - [v.fields["description"]] -
- Additional Notes:  -"} - - state("The nearby computer prints out a report.") diff --git a/code/modules/virus2/items_devices.dm b/code/modules/virus2/items_devices.dm deleted file mode 100644 index ee9d4b6377..0000000000 --- a/code/modules/virus2/items_devices.dm +++ /dev/null @@ -1,114 +0,0 @@ -///////////////ANTIBODY SCANNER/////////////// - -/obj/item/antibody_scanner - name = "antibody scanner" - desc = "Scans living beings for antibodies in their blood." - icon = 'icons/obj/device_vr.dmi' - icon_state = "antibody" - w_class = ITEMSIZE_SMALL - item_state = "electronic" - -/obj/item/antibody_scanner/attack(mob/M as mob, mob/user as mob) - if(!istype(M,/mob/living/carbon/)) - report("Scan aborted: Incompatible target.", user) - return - - var/mob/living/carbon/C = M - if (istype(C,/mob/living/carbon/human/)) - var/mob/living/carbon/human/H = C - if(!H.should_have_organ(O_HEART)) - report("Scan aborted: The target does not have blood.", user) - return - - if(!C.antibodies.len) - report("Scan Complete: No antibodies detected.", user) - return - - if (CLUMSY in user.mutations && prob(50)) - // I was tempted to be really evil and rot13 the output. - report("Antibodies detected: [reverse_text(antigens2string(C.antibodies))]", user) - else - report("Antibodies detected: [antigens2string(C.antibodies)]", user) - -/obj/item/antibody_scanner/proc/report(var/text, mob/user as mob) - to_chat(user, "[span_blue("[icon2html(src, user.client)] \The [src] beeps,")] \"[span_blue("[text]")]\"") - -///////////////VIRUS DISH/////////////// - -/obj/item/virusdish - name = "virus dish" - icon = 'icons/obj/items.dmi' - icon_state = "virussample" - var/datum/disease2/disease/virus2 = null - var/growth = 0 - var/basic_info = null - var/info = 0 - var/analysed = 0 - -/obj/item/virusdish/random - name = "virus sample" - -/obj/item/virusdish/random/New() - ..() - src.virus2 = new /datum/disease2/disease - src.virus2.makerandom() - growth = rand(5, 50) - -/obj/item/virusdish/attackby(var/obj/item/W as obj,var/mob/living/carbon/user as mob) - if(istype(W,/obj/item/hand_labeler) || istype(W,/obj/item/reagent_containers/syringe)) - //VOREstation edit - Actually functional virus dishes - // Originally this returns, THEN calls ..() instead of returning the value of ..() - return ..() - //VOREstation edit end - if(prob(50)) - to_chat(user, span_danger("\The [src] shatters!")) - if(virus2.infectionchance > 0) - for(var/mob/living/carbon/target in view(1, get_turf(src))) - if(airborne_can_reach(get_turf(src), get_turf(target))) - infect_virus2(target, src.virus2) - qdel(src) - -/obj/item/virusdish/examine(mob/user) - . = ..() - if(basic_info) - . += "[basic_info] : More Information" - -/obj/item/virusdish/Topic(href, href_list) - . = ..() - if(.) return 1 - - if(href_list["info"]) - usr << browse(info, "window=info_\ref[src]") - return 1 - -/obj/item/ruinedvirusdish - name = "ruined virus sample" - icon = 'icons/obj/items.dmi' - icon_state = "virussample-ruined" - desc = "The bacteria in the dish are completely dead." - -/obj/item/ruinedvirusdish/attackby(var/obj/item/W as obj,var/mob/living/carbon/user as mob) - if(istype(W,/obj/item/hand_labeler) || istype(W,/obj/item/reagent_containers/syringe)) - return ..() - - if(prob(50)) - to_chat(user, "\The [src] shatters!") - qdel(src) - -///////////////GNA DISK/////////////// - -/obj/item/diseasedisk - name = "blank GNA disk" - icon = 'icons/obj/cloning.dmi' - icon_state = "datadisk0" - w_class = ITEMSIZE_TINY - var/datum/disease2/effectholder/effect = null - var/list/species = null - var/stage = 1 - var/analysed = 1 - -/obj/item/diseasedisk/premade/New() - name = "blank GNA disk (stage: [stage])" - effect = new /datum/disease2/effectholder - effect.effect = new /datum/disease2/effect/invisible - effect.stage = stage diff --git a/icons/mob/macrophage.dmi b/icons/mob/macrophage.dmi new file mode 100644 index 0000000000000000000000000000000000000000..4b7518bfc64a15e2ec408cafeadcd22b8f2a1006 GIT binary patch literal 4509 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 Z0dJ&XBJ{fHuzG<3UhYIUj!W3N{{RlEx|#q0 literal 0 HcmV?d00001 diff --git a/maps/expedition_vr/beach/submaps/quarantineshuttle.dmm b/maps/expedition_vr/beach/submaps/quarantineshuttle.dmm index 83694ffdc0..8b7ac40dd5 100644 --- a/maps/expedition_vr/beach/submaps/quarantineshuttle.dmm +++ b/maps/expedition_vr/beach/submaps/quarantineshuttle.dmm @@ -141,6 +141,7 @@ /area/submap/cave/qShuttle) "au" = ( /obj/structure/closet/crate/secure/loot, +/obj/item/reagent_containers/glass/bottle/culture/cold, /turf/simulated/shuttle/floor{ icon_state = "floor_yellow" }, @@ -332,7 +333,8 @@ }, /area/submap/cave/qShuttle) "aV" = ( -/obj/item/virusdish/random, +/obj/structure/closet/crate/secure/loot, +/obj/item/reagent_containers/glass/bottle/culture/flu, /turf/simulated/shuttle/floor{ icon_state = "floor_yellow" }, @@ -472,9 +474,6 @@ name = "Virus Samples - FRAGILE"; opened = 1 }, -/obj/item/virusdish/random, -/obj/item/virusdish/random, -/obj/item/virusdish/random, /turf/simulated/shuttle/floor{ icon_state = "floor_yellow" }, @@ -1311,7 +1310,7 @@ ab ad au aF -aV +aA bj bv bE @@ -1363,7 +1362,7 @@ aa aa ab ad -au +aV aH aW bk @@ -1394,7 +1393,7 @@ ad ad aX aA -aV +aA ad ad ad diff --git a/maps/groundbase/gb-z2.dmm b/maps/groundbase/gb-z2.dmm index 537bcba1d8..ac234c6828 100644 --- a/maps/groundbase/gb-z2.dmm +++ b/maps/groundbase/gb-z2.dmm @@ -312,11 +312,6 @@ /area/groundbase/level2/nw) "aH" = ( /obj/structure/table/glass, -/obj/item/antibody_scanner, -/obj/item/antibody_scanner{ - pixel_x = 2; - pixel_y = 2 - }, /turf/simulated/floor/tiled/white, /area/medical/virology) "aI" = ( @@ -3839,12 +3834,7 @@ }, /turf/simulated/floor/outdoors/sidewalk/slab, /area/groundbase/level2/nw) -"kb" = ( -/obj/machinery/disease2/diseaseanalyser, -/turf/simulated/floor/tiled/white, -/area/medical/virology) "kc" = ( -/obj/machinery/disease2/incubator, /obj/structure/reagent_dispensers/virusfood{ pixel_y = 27 }, @@ -4980,9 +4970,7 @@ /turf/simulated/floor/tiled, /area/groundbase/science/hall) "nx" = ( -/obj/machinery/computer/diseasesplicer{ - dir = 1 - }, +/obj/machinery/computer/pandemic, /turf/simulated/floor/tiled/white, /area/medical/virology) "ny" = ( @@ -7017,10 +7005,15 @@ /turf/simulated/floor/tiled/eris/cafe, /area/groundbase/civilian/kitchen) "tk" = ( -/obj/machinery/disease2/isolator, /obj/machinery/light{ dir = 1 }, +/obj/structure/closet/crate/medical, +/obj/item/reagent_containers/glass/bottle/culture/cold{ + pixel_x = -5; + pixel_y = 5 + }, +/obj/item/reagent_containers/glass/bottle/culture/flu, /turf/simulated/floor/tiled/white, /area/medical/virology) "tm" = ( @@ -9340,7 +9333,6 @@ "Ag" = ( /obj/structure/table/glass, /obj/item/book/manual/virology, -/obj/item/antibody_scanner, /obj/item/reagent_containers/glass/beaker, /obj/item/paper_bin, /obj/item/folder/white, @@ -18186,10 +18178,6 @@ /obj/structure/closet/secure_closet/personal/patient, /turf/simulated/floor/tiled/white, /area/medical/virology) -"Zd" = ( -/obj/machinery/computer/centrifuge, -/turf/simulated/floor/tiled/white, -/area/medical/virology) "Ze" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -36335,8 +36323,8 @@ QA pe lj RW -Zd -kb +cG +cG aZ mb pe @@ -36477,7 +36465,7 @@ pe pe tk OH -cG +nx Qr cG xf @@ -36622,7 +36610,7 @@ OH aH bC cG -nx +cG pe fk UH diff --git a/maps/stellar_delight/stellar_delight1.dmm b/maps/stellar_delight/stellar_delight1.dmm index 10c6715388..4a75431dda 100644 --- a/maps/stellar_delight/stellar_delight1.dmm +++ b/maps/stellar_delight/stellar_delight1.dmm @@ -8914,7 +8914,6 @@ /turf/simulated/floor/tiled/techmaint, /area/stellardelight/deck1/starboard) "sf" = ( -/obj/machinery/disease2/isolator, /obj/machinery/light/floortube{ dir = 8; pixel_x = -6 @@ -8924,6 +8923,12 @@ dir = 8; pixel_x = -24 }, +/obj/structure/closet/crate/medical, +/obj/item/reagent_containers/glass/bottle/culture/cold{ + pixel_x = -5; + pixel_y = 5 + }, +/obj/item/reagent_containers/glass/bottle/culture/flu, /turf/simulated/floor/tiled/eris/white/bluecorner, /area/medical/virology) "sg" = ( @@ -11002,9 +11007,6 @@ /turf/simulated/floor, /area/maintenance/stellardelight/deck1/portaft) "wR" = ( -/obj/machinery/computer/diseasesplicer{ - dir = 1 - }, /turf/simulated/floor/tiled/eris/white/bluecorner, /area/medical/virology) "wS" = ( @@ -13403,7 +13405,6 @@ /turf/simulated/wall/bay/black, /area/chapel/main) "BV" = ( -/obj/machinery/disease2/incubator, /obj/structure/reagent_dispensers/virusfood{ pixel_y = 27 }, @@ -13734,7 +13735,6 @@ "CJ" = ( /obj/structure/table/glass, /obj/item/book/manual/virology, -/obj/item/antibody_scanner, /obj/item/reagent_containers/glass/beaker, /obj/item/paper_bin, /obj/item/folder/white, @@ -15325,11 +15325,11 @@ /turf/simulated/floor/tiled/steel_ridged, /area/prison/cell_block) "Gn" = ( -/obj/machinery/disease2/diseaseanalyser, /obj/machinery/light/floortube{ dir = 8; pixel_x = -6 }, +/obj/machinery/computer/pandemic, /turf/simulated/floor/tiled/eris/white/bluecorner, /area/medical/virology) "Go" = ( @@ -22433,7 +22433,6 @@ /turf/simulated/floor/wood, /area/library) "Vq" = ( -/obj/machinery/computer/centrifuge, /obj/machinery/embedded_controller/radio/airlock/access_controller{ dir = 4; id_tag = "virology_airlock_control"; diff --git a/maps/tether/tether-01-surface1.dmm b/maps/tether/tether-01-surface1.dmm index 413088b4ad..2768b3e8c6 100644 --- a/maps/tether/tether-01-surface1.dmm +++ b/maps/tether/tether-01-surface1.dmm @@ -12580,10 +12580,6 @@ /obj/structure/catwalk, /turf/simulated/floor/plating, /area/maintenance/lower/solars) -"avQ" = ( -/obj/machinery/disease2/isolator, -/turf/simulated/floor/tiled/white, -/area/medical/virology) "avR" = ( /obj/machinery/atmospherics/pipe/simple/hidden/yellow, /obj/structure/disposalpipe/segment, @@ -14214,11 +14210,6 @@ /obj/machinery/atmospherics/pipe/simple/hidden/yellow, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/table/glass, -/obj/item/antibody_scanner, -/obj/item/antibody_scanner{ - pixel_x = 2; - pixel_y = 2 - }, /turf/simulated/floor/tiled/white, /area/medical/virology) "ayk" = ( @@ -30657,7 +30648,6 @@ /turf/simulated/floor/tiled, /area/tether/surfacebase/security/brig) "cdl" = ( -/obj/machinery/disease2/diseaseanalyser, /obj/item/radio/intercom{ dir = 1; name = "Station Intercom (General)"; @@ -30669,6 +30659,7 @@ /obj/effect/floor_decal/corner/lime/border{ dir = 9 }, +/obj/structure/table/standard, /turf/simulated/floor/tiled/white, /area/medical/virology) "cdO" = ( @@ -34892,10 +34883,11 @@ dir = 1 }, /obj/structure/closet/crate/freezer, -/obj/item/virusdish/random, -/obj/item/virusdish/random, -/obj/item/virusdish/random, -/obj/item/virusdish/random, +/obj/item/reagent_containers/glass/bottle/culture/cold{ + pixel_x = -5; + pixel_y = 5 + }, +/obj/item/reagent_containers/glass/bottle/culture/flu, /turf/simulated/floor/tiled/white, /area/medical/virology) "nMH" = ( @@ -36544,7 +36536,6 @@ /turf/simulated/floor/plating, /area/maintenance/lower/vacant_site) "sLf" = ( -/obj/machinery/computer/diseasesplicer, /obj/machinery/light{ dir = 1 }, @@ -36554,6 +36545,7 @@ /obj/effect/floor_decal/corner/lime/border{ dir = 1 }, +/obj/machinery/computer/pandemic, /turf/simulated/floor/tiled/white, /area/medical/virology) "sLi" = ( @@ -37426,7 +37418,7 @@ /obj/effect/floor_decal/corner/lime/border{ dir = 1 }, -/obj/machinery/computer/centrifuge, +/obj/structure/table/standard, /turf/simulated/floor/tiled/white, /area/medical/virology) "vBy" = ( @@ -37545,10 +37537,6 @@ /obj/machinery/computer/arcade/orion_trail, /turf/simulated/floor/tiled, /area/tether/surfacebase/security/brig) -"vXS" = ( -/obj/machinery/disease2/incubator, -/turf/simulated/floor/tiled/white, -/area/medical/virology) "waR" = ( /turf/simulated/floor/tiled/dark, /area/tether/surfacebase/security/weaponsrange) @@ -54128,7 +54116,7 @@ aeE vwM avl afB -avQ +avl axj ayk ayK @@ -54270,7 +54258,7 @@ aeE nLm avl afD -vXS +avl axF ayl avl diff --git a/tgui/packages/tgui/interfaces/PanDEMIC.tsx b/tgui/packages/tgui/interfaces/PanDEMIC.tsx new file mode 100644 index 0000000000..ff8c718529 --- /dev/null +++ b/tgui/packages/tgui/interfaces/PanDEMIC.tsx @@ -0,0 +1,315 @@ +import { useBackend } from '../backend'; +import { + Button, + Flex, + LabeledList, + NoticeBox, + Section, + Stack, + Table, + Tabs, +} from '../components'; +import { Window } from '../layouts'; + +type Data = { + beakerLoaded: boolean; + beakerContainsBlood: boolean; + beakerContainsVirus: boolean; + resistances: string[]; + selectedStrainIndex: number; + strains: Strain[]; + synthesisCooldown: boolean; +}; + +type Strain = { + commonName: string; + description: string; + diseaseAgent: string; + bloodDNA: string; + bloodType: string; + possibleTreatments: string; + transmissionRoute: string; + isAdvanced: boolean; + symptoms: Symptom[]; +}; + +type Symptom = { + name: string; + stealth: number; + resistance: number; + stageSpeed: number; + transmissibility: number; +}; + +export const PanDEMIC = () => { + const { data } = useBackend(); + const { + beakerLoaded, + beakerContainsBlood, + beakerContainsVirus, + resistances, + } = data; + + let emptyPlaceholder: JSX.Element | null = null; + if (!beakerLoaded) { + emptyPlaceholder = <>No container loaded.; + } else if (!beakerContainsBlood) { + emptyPlaceholder = <>No blood sample found in the loaded container.; + } else if (beakerContainsBlood && !beakerContainsVirus) { + emptyPlaceholder = <>No disease detected in provided blood sample.; + } + + return ( + + + + {emptyPlaceholder && !beakerContainsVirus ? ( +
} + > + {emptyPlaceholder} +
+ ) : ( + + )} + {resistances.length > 0 && } +
+
+
+ ); +}; + +const CommonCultureActions = () => { + const { act, data } = useBackend(); + const { beakerLoaded } = data; + return ( + <> + + act('destroy_eject_beaker')} + > + Destroy + + + ); +}; + +const CultureInformationSection = () => { + const { act, data } = useBackend(); + const { selectedStrainIndex, strains, synthesisCooldown } = data; + + if (strains.length === 0) { + return ( +
}> + No disease detected in provided blood sample. +
+ ); + } + + return ( + +
+ + + + } + > + + + +
+
+ ); +}; + +const StrainInformationSection = ({ + strains, + selectedStrainIndex, +}: { + strains: Strain[]; + selectedStrainIndex: number; +}) => { + const { act } = useBackend(); + const selectedStrain = strains[selectedStrainIndex - 1]; + + return ( + + + {strains.map((strain, index) => ( + act('switch_strain', { strain_index: index + 1 })} + > + {strain.commonName} + + ))} + + +
+ {selectedStrain ? ( + + ) : ( + No strain information available. + )} +
+ + {selectedStrain && selectedStrain.symptoms.length > 0 && ( + + )} +
+ ); +}; + +const StrainSymptomsSection = ({ strain }: { strain: Strain }) => { + const symptoms = strain.symptoms; + + return ( + +
+

+ + Name + Stealth + Resistance + Stage Speed + Transmissibility + + {symptoms.map((symptom, index) => ( + + {symptom.name} + {symptom.stealth} + {symptom.resistance} + {symptom.stageSpeed} + {symptom.transmissibility} + + ))} +
+
+ + ); +}; + +const StrainInformation = ({ + strain, + strainIndex, +}: { + strain: Strain; + strainIndex: number; +}) => { + const { act } = useBackend(); + const { + commonName, + description, + diseaseAgent, + bloodDNA, + bloodType, + possibleTreatments, + transmissionRoute, + isAdvanced, + } = strain; + + return ( + + + + {commonName ?? 'Unknown'} + {isAdvanced && ( + <> + + + + )} + + + {description && ( + {description} + )} + {diseaseAgent} + + {bloodDNA || 'Undetectable'} + + + {bloodType || 'Undetectable'} + + + {transmissionRoute || 'None'} + + + {possibleTreatments || 'None'} + + + ); +}; + +const ResistancesSection = () => { + const { act, data } = useBackend(); + const { resistances, synthesisCooldown } = data; + const vaccineIcons = ['flask', 'vial', 'eye-dropper']; + + return ( + +
+ + {resistances.map((resistance, index) => ( + +
+
+ ); +}; diff --git a/vorestation.dme b/vorestation.dme index da8a2da180..efa6a21a29 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -55,6 +55,7 @@ #include "code\__defines\cooldowns.dm" #include "code\__defines\crafting.dm" #include "code\__defines\damage_organs.dm" +#include "code\__defines\diseases.dm" #include "code\__defines\dna.dm" #include "code\__defines\economy_misc.dm" #include "code\__defines\equipment_vendor.dm" @@ -455,6 +456,49 @@ #include "code\datums\components\crafting\recipes\primitive.dm" #include "code\datums\components\crafting\recipes\survival.dm" #include "code\datums\components\crafting\recipes\weapons.dm" +#include "code\datums\diseases\_disease.dm" +#include "code\datums\diseases\_MobProcs.dm" +#include "code\datums\diseases\anxiety.dm" +#include "code\datums\diseases\beesease.dm" +#include "code\datums\diseases\brainrot.dm" +#include "code\datums\diseases\choreomania.dm" +#include "code\datums\diseases\cold.dm" +#include "code\datums\diseases\cold9.dm" +#include "code\datums\diseases\flu.dm" +#include "code\datums\diseases\food_poisoning.dm" +#include "code\datums\diseases\lycancoughy.dm" +#include "code\datums\diseases\magnitis.dm" +#include "code\datums\diseases\advance\advance.dm" +#include "code\datums\diseases\advance\disease_preset.dm" +#include "code\datums\diseases\advance\symptoms\choking.dm" +#include "code\datums\diseases\advance\symptoms\confusion.dm" +#include "code\datums\diseases\advance\symptoms\cough.dm" +#include "code\datums\diseases\advance\symptoms\damage_converter.dm" +#include "code\datums\diseases\advance\symptoms\dizzy.dm" +#include "code\datums\diseases\advance\symptoms\fever.dm" +#include "code\datums\diseases\advance\symptoms\fire.dm" +#include "code\datums\diseases\advance\symptoms\flesh_eating.dm" +#include "code\datums\diseases\advance\symptoms\hallucigen.dm" +#include "code\datums\diseases\advance\symptoms\headache.dm" +#include "code\datums\diseases\advance\symptoms\heal.dm" +#include "code\datums\diseases\advance\symptoms\itching.dm" +#include "code\datums\diseases\advance\symptoms\language.dm" +#include "code\datums\diseases\advance\symptoms\macrophage.dm" +#include "code\datums\diseases\advance\symptoms\mlem.dm" +#include "code\datums\diseases\advance\symptoms\necrotic_agent.dm" +#include "code\datums\diseases\advance\symptoms\oxygen.dm" +#include "code\datums\diseases\advance\symptoms\sensory.dm" +#include "code\datums\diseases\advance\symptoms\shivering.dm" +#include "code\datums\diseases\advance\symptoms\sneeze.dm" +#include "code\datums\diseases\advance\symptoms\spin.dm" +#include "code\datums\diseases\advance\symptoms\symptoms.dm" +#include "code\datums\diseases\advance\symptoms\synthetic_infection.dm" +#include "code\datums\diseases\advance\symptoms\telepathy.dm" +#include "code\datums\diseases\advance\symptoms\viral.dm" +#include "code\datums\diseases\advance\symptoms\vision.dm" +#include "code\datums\diseases\advance\symptoms\vomit.dm" +#include "code\datums\diseases\advance\symptoms\weakness.dm" +#include "code\datums\diseases\advance\symptoms\weigh.dm" #include "code\datums\elements\_element.dm" #include "code\datums\elements\conflict_checking.dm" #include "code\datums\elements\light_blocking.dm" @@ -933,6 +977,7 @@ #include "code\game\machinery\overview.dm" #include "code\game\machinery\oxygen_pump.dm" #include "code\game\machinery\painter_vr.dm" +#include "code\game\machinery\pandemic.dm" #include "code\game\machinery\partslathe_vr.dm" #include "code\game\machinery\pda_multicaster.dm" #include "code\game\machinery\pointdefense.dm" @@ -2352,6 +2397,7 @@ #include "code\modules\events\carp_migration.dm" #include "code\modules\events\comms_blackout.dm" #include "code\modules\events\communications_blackout.dm" +#include "code\modules\events\disease_outbreak.dm" #include "code\modules\events\drone_pod_vr.dm" #include "code\modules\events\dust.dm" #include "code\modules\events\electrical_storm.dm" @@ -2513,7 +2559,6 @@ #include "code\modules\gamemaster\event2\events\everyone\sudden_weather_shift.dm" #include "code\modules\gamemaster\event2\events\legacy\legacy.dm" #include "code\modules\gamemaster\event2\events\medical\appendicitis.dm" -#include "code\modules\gamemaster\event2\events\medical\virus.dm" #include "code\modules\gamemaster\event2\events\security\carp_migration.dm" #include "code\modules\gamemaster\event2\events\security\drill_announcement.dm" #include "code\modules\gamemaster\event2\events\security\prison_break.dm" @@ -2934,7 +2979,6 @@ #include "code\modules\mob\living\carbon\resist.dm" #include "code\modules\mob\living\carbon\shock.dm" #include "code\modules\mob\living\carbon\taste.dm" -#include "code\modules\mob\living\carbon\viruses.dm" #include "code\modules\mob\living\carbon\alien\alien.dm" #include "code\modules\mob\living\carbon\alien\alien_attacks.dm" #include "code\modules\mob\living\carbon\alien\alien_damage.dm" @@ -3346,6 +3390,7 @@ #include "code\modules\mob\living\simple_mob\subtypes\vore\jelly.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\lamia.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\leopardmander.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\macrophage.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\meowl.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\mimic.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\oregrub.dm" @@ -3885,6 +3930,7 @@ #include "code\modules\reagents\reactions\instant\food_vr.dm" #include "code\modules\reagents\reactions\instant\instant.dm" #include "code\modules\reagents\reactions\instant\instant_vr.dm" +#include "code\modules\reagents\reactions\instant\virology.dm" #include "code\modules\reagents\reagent_containers\_reagent_containers.dm" #include "code\modules\reagents\reagent_containers\blood_pack.dm" #include "code\modules\reagents\reagent_containers\blood_pack_vr.dm" @@ -3901,6 +3947,7 @@ #include "code\modules\reagents\reagent_containers\spray_vr.dm" #include "code\modules\reagents\reagent_containers\syringes.dm" #include "code\modules\reagents\reagent_containers\unidentified_hypospray.dm" +#include "code\modules\reagents\reagent_containers\virology.dm" #include "code\modules\reagents\reagents\_helpers.dm" #include "code\modules\reagents\reagents\_reagents.dm" #include "code\modules\reagents\reagents\core.dm" @@ -3914,6 +3961,7 @@ #include "code\modules\reagents\reagents\other.dm" #include "code\modules\reagents\reagents\other_vr.dm" #include "code\modules\reagents\reagents\toxins.dm" +#include "code\modules\reagents\reagents\virology.dm" #include "code\modules\reagents\reagents\vore_vr.dm" #include "code\modules\recycling\conveyor2.dm" #include "code\modules\recycling\disposal-construction.dm" @@ -4202,19 +4250,6 @@ #include "code\modules\ventcrawl\ventcrawl_atmospherics.dm" #include "code\modules\ventcrawl\ventcrawl_multiz.dm" #include "code\modules\ventcrawl\ventcrawl_verb.dm" -#include "code\modules\virus2\admin.dm" -#include "code\modules\virus2\analyser.dm" -#include "code\modules\virus2\antibodies.dm" -#include "code\modules\virus2\centrifuge.dm" -#include "code\modules\virus2\curer.dm" -#include "code\modules\virus2\disease2.dm" -#include "code\modules\virus2\diseasesplicer.dm" -#include "code\modules\virus2\dishincubator.dm" -#include "code\modules\virus2\effect.dm" -#include "code\modules\virus2\effect_vr.dm" -#include "code\modules\virus2\helpers.dm" -#include "code\modules\virus2\isolator.dm" -#include "code\modules\virus2\items_devices.dm" #include "code\modules\vore\chat_healthbars.dm" #include "code\modules\vore\hook-defs_vr.dm" #include "code\modules\vore\mouseray.dm" From aea42effe549c637faf9a866c015e11bc0d5a9ff Mon Sep 17 00:00:00 2001 From: SatinIsle <98125273+SatinIsle@users.noreply.github.com> Date: Tue, 5 Nov 2024 11:42:15 +0000 Subject: [PATCH 18/36] Restricts ahelp ticket view (#16551) * Restricts ahelp ticket view Fixed non-staff being able to view the ahelp ticket panel. * Update statpanel.dm Adds R_MOD --- code/controllers/subsystems/statpanel.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/controllers/subsystems/statpanel.dm b/code/controllers/subsystems/statpanel.dm index 42c1ecd5f2..6e97b99229 100644 --- a/code/controllers/subsystems/statpanel.dm +++ b/code/controllers/subsystems/statpanel.dm @@ -173,7 +173,9 @@ SUBSYSTEM_DEF(statpanels) target.stat_panel.send_message("update_examine", examine_update) /datum/controller/subsystem/statpanels/proc/set_tickets_tab(client/target) - var/list/tickets = GLOB.ahelp_tickets.stat_entry(target) + var/list/tickets = list() + if(check_rights(R_ADMIN|R_SERVER|R_MOD,FALSE,target)) //Prevents non-staff from opening the list of ahelp tickets + tickets += GLOB.ahelp_tickets.stat_entry(target) tickets += GLOB.mhelp_tickets.stat_entry(target) target.stat_panel.send_message("update_tickets", tickets) From 1cd571ce8f9ef023756bac32cbff96c2d4919638 Mon Sep 17 00:00:00 2001 From: Killian <49700375+KillianKirilenko@users.noreply.github.com> Date: Wed, 6 Nov 2024 13:20:42 +0000 Subject: [PATCH 19/36] More small hacktool tweaks (#16571) * mini hacktool expansion * hacktool tweaks * Update contraband.dm --- code/datums/supplypacks/contraband.dm | 2 +- code/game/objects/items/devices/hacktool.dm | 17 +++++++++++++++-- code/modules/mining/abandonedcrates_vr.dm | 1 + icons/obj/device.dmi | Bin 93344 -> 94472 bytes 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/code/datums/supplypacks/contraband.dm b/code/datums/supplypacks/contraband.dm index bf763f33ec..8bc4a190fa 100644 --- a/code/datums/supplypacks/contraband.dm +++ b/code/datums/supplypacks/contraband.dm @@ -97,7 +97,7 @@ /obj/item/clothing/glasses/thermal/syndi, /obj/item/ammo_magazine/m45/ap, /obj/item/material/knife/tacknife/combatknife, - /obj/item/multitool/hacktool + /obj/item/multitool/hacktool/modified ), list( //the professional, /obj/item/gun/projectile/silenced, diff --git a/code/game/objects/items/devices/hacktool.dm b/code/game/objects/items/devices/hacktool.dm index ce097cdfd6..3545ff3486 100644 --- a/code/game/objects/items/devices/hacktool.dm +++ b/code/game/objects/items/devices/hacktool.dm @@ -1,8 +1,8 @@ /obj/item/multitool/hacktool var/is_hacking = 0 var/max_known_targets - var/hackspeed = 1 - var/max_level = 4 //what's the max door security_level we can handle? + var/hackspeed = 1 //time taken to hack: lower is faster + var/max_level = 4 //what's the max door security_level we can handle? default is 1, med/eng/atmos are 1.5, sec/sci are 2, command is 3, vault is 5 var/full_override = FALSE //can we override door bolts too? defaults to false for event/safety reasons var/in_hack_mode = 0 @@ -155,3 +155,16 @@ if(!hacktool || !hacktool.in_hack_mode || !(src_object in hacktool.known_targets)) return STATUS_CLOSE return ..() + +/obj/item/multitool/hacktool/modified + name = "modified multitool" + desc = "Used for pulsing wires to test which to cut. Not recommended by doctors. This ones seems a bit larger and heavier than the usual model, for some reason. Maybe it's an older version?" + description_info = "You can use this on airlocks or APCs to try to hack them without cutting wires." + icon_state = "multitool_modified" + +/obj/item/multitool/hacktool/obvious + name = "non-standard multitool" + desc = "Used for pulsing wires to test which to cut. Not recommended by doctors. This one doesn't look like the usual model at all!" + description_info = "You can use this on airlocks or APCs to try to hack them without cutting wires." + icon_state = "multitool_suspicious" + in_hack_mode = 1 //start in hackmode diff --git a/code/modules/mining/abandonedcrates_vr.dm b/code/modules/mining/abandonedcrates_vr.dm index 7d7ed2ad98..a443839f9b 100644 --- a/code/modules/mining/abandonedcrates_vr.dm +++ b/code/modules/mining/abandonedcrates_vr.dm @@ -30,6 +30,7 @@ list(/obj/item/melee/classic_baton, 6) = 3, list(/obj/item/rig/industrial, 6) = 3, list(/obj/item/multitool/hacktool, 5) = 3, + list(/obj/item/multitool/hacktool/modified, 4) = 4, list(/obj/item/toy/katana, 1) = 2, list(/obj/item/clothing/head/kitty, 1) = 2, list(pick(subtypesof(/obj/item/soap)), 1) = 2, diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index a538ec2b6092ddaa8c13685be12dcac204b8efbe..2a817ae4e0e453196a2a0ed5c72d01b5e609cf57 100644 GIT binary patch literal 94472 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
  • t}16?aouD4cWz%ws5K>n}T-EkCB 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%0AdI8pLu1ihjXpeV1!H-;pDab$j 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%0AdubIW{JF_Yx_nG*ydh+W0P%z$^G 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 i$$rYMB44 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 literal 93344 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 From 5a5c59ac74cffbf6ac9ad2d8e17763f4eb7153d4 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Wed, 6 Nov 2024 08:21:18 -0500 Subject: [PATCH 20/36] makes ashtrays visible in SDMM (#16570) --- code/game/objects/items/weapons/material/ashtray.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/material/ashtray.dm b/code/game/objects/items/weapons/material/ashtray.dm index 33c4c82e9e..847ddd6efa 100644 --- a/code/game/objects/items/weapons/material/ashtray.dm +++ b/code/game/objects/items/weapons/material/ashtray.dm @@ -3,7 +3,7 @@ var/global/list/ashtray_cache = list() /obj/item/material/ashtray name = "ashtray" icon = 'icons/obj/objects.dmi' - icon_state = "blank" + icon_state = "ashtray" randpixel = 5 force_divisor = 0.1 thrown_force_divisor = 0.1 @@ -16,6 +16,7 @@ var/global/list/ashtray_cache = list() if(!material) qdel(src) return + icon_state = "blank" max_butts = round(material.hardness/5) //This is arbitrary but whatever. randpixel_xy() update_icon() From 3db918717bc2dfe47c8ad8e8d785bd1d9df2bdb6 Mon Sep 17 00:00:00 2001 From: Selis <12716288+ItsSelis@users.noreply.github.com> Date: Wed, 6 Nov 2024 14:22:46 +0100 Subject: [PATCH 21/36] New -> Init for Vending Machines (#16566) --- code/modules/economy/vending_machines_vr.dm | 32 ++++++++++----------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/code/modules/economy/vending_machines_vr.dm b/code/modules/economy/vending_machines_vr.dm index c62361aee9..41e3645f00 100644 --- a/code/modules/economy/vending_machines_vr.dm +++ b/code/modules/economy/vending_machines_vr.dm @@ -1,40 +1,40 @@ //Tweaked existing vendors -/obj/machinery/vending/hydroseeds/New() +/obj/machinery/vending/hydroseeds/Initialize() + . = ..() products += list(/obj/item/seeds/shrinkshroom = 3,/obj/item/seeds/megashroom = 3) - ..() -/obj/machinery/vending/security/New() +/obj/machinery/vending/security/Initialize() + . = ..() products += list(/obj/item/gun/energy/taser = 8,/obj/item/gun/energy/stunrevolver = 4, /obj/item/reagent_containers/spray/pepper = 6,/obj/item/taperoll/police = 6, /obj/item/clothing/glasses/omnihud/sec = 6) contraband += list(/obj/item/implanter/compliance = 1) - ..() -/obj/machinery/vending/tool/New() +/obj/machinery/vending/tool/Initialize() + . = ..() products += list(/obj/item/reagent_containers/spray/windowsealant = 5) - ..() -/obj/machinery/vending/engivend/New() +/obj/machinery/vending/engivend/Initialize() + . = ..() products += list(/obj/item/clothing/glasses/omnihud/eng = 6) contraband += list(/obj/item/rms = 5) - ..() -/obj/machinery/vending/medical/New() +/obj/machinery/vending/medical/Initialize() + . = ..() products += list(/obj/item/storage/box/khcrystal = 4,/obj/item/backup_implanter = 3, /obj/item/clothing/glasses/omnihud/med = 4, /obj/item/glasses_kit = 1, /obj/item/storage/quickdraw/syringe_case = 4) - ..() -/obj/machinery/vending/wallmed1/New() +/obj/machinery/vending/wallmed1/Initialize() + . = ..() products += list(/obj/item/bodybag/cryobag = 2) - ..() -/obj/machinery/vending/wallmed2/New() +/obj/machinery/vending/wallmed2/Initialize() + . = ..() products += list(/obj/item/bodybag/cryobag = 3) - ..() -/obj/machinery/vending/wallmed1/public/New() +/obj/machinery/vending/wallmed1/public/Initialize() + . = ..() products += list(/obj/item/bodybag/cryobag = 4) - ..() // Food Machines (for event/away maps) From 2c11b12814f2546bd6d362a94a46eda786641510 Mon Sep 17 00:00:00 2001 From: Killian <49700375+KillianKirilenko@users.noreply.github.com> Date: Wed, 6 Nov 2024 17:49:11 +0000 Subject: [PATCH 22/36] Headset Refactor and Selection (#16568) * headset refactor and selection * Update headset.dm formatting * Update code/modules/client/preference_setup/general/04_equipment.dm Co-authored-by: Selis <12716288+ItsSelis@users.noreply.github.com> * Update code/_helpers/global_lists.dm Co-authored-by: Selis <12716288+ItsSelis@users.noreply.github.com> * Update code/modules/client/preference_setup/general/04_equipment.dm Co-authored-by: Selis <12716288+ItsSelis@users.noreply.github.com> * Update code/modules/client/preference_setup/general/04_equipment.dm Co-authored-by: Selis <12716288+ItsSelis@users.noreply.github.com> * Update code/modules/client/preference_setup/general/04_equipment.dm Co-authored-by: Selis <12716288+ItsSelis@users.noreply.github.com> * Update code/modules/client/preference_setup/general/04_equipment.dm Co-authored-by: Selis <12716288+ItsSelis@users.noreply.github.com> --------- Co-authored-by: Selis <12716288+ItsSelis@users.noreply.github.com> --- code/_helpers/global_lists.dm | 5 +- code/datums/outfits/jobs/cargo.dm | 15 +- code/datums/outfits/jobs/civilian.dm | 15 +- code/datums/outfits/jobs/command.dm | 16 +- code/datums/outfits/jobs/engineering.dm | 11 +- code/datums/outfits/jobs/job.dm | 5 +- code/datums/outfits/jobs/medical.dm | 11 +- code/datums/outfits/jobs/science.dm | 11 +- code/datums/outfits/jobs/security.dm | 11 +- code/datums/outfits/outfit.dm | 10 +- code/datums/outfits/outfit_vr.dm | 20 +- code/datums/supplypacks/medical.dm | 2 +- code/datums/supplypacks/security.dm | 2 +- code/datums/supplypacks/supply.dm | 4 +- .../objects/items/devices/radio/headset.dm | 687 +++++++++++------- .../objects/items/devices/radio/headset_vr.dm | 131 ---- code/game/objects/random/mapping.dm | 4 +- .../crates_lockers/closets/job_closets.dm | 12 +- .../crates_lockers/closets/misc_vr.dm | 8 +- .../crates_lockers/closets/secure/cargo.dm | 12 +- .../closets/secure/engineering.dm | 9 +- .../closets/secure/hydroponics.dm | 4 +- .../crates_lockers/closets/secure/medical.dm | 10 +- .../closets/secure/scientist.dm | 3 +- .../crates_lockers/closets/secure/security.dm | 18 +- .../closets/secure/security_vr.dm | 15 +- .../crates_lockers/closets/wardrobe.dm | 2 +- .../crates_lockers/closets/wardrobe_vr.dm | 9 +- code/modules/awaymissions/corpse.dm | 2 +- .../preference_setup/general/04_equipment.dm | 14 + code/modules/client/preferences.dm | 1 + code/modules/economy/vending_machines.dm | 2 +- code/modules/economy/vending_machines_vr.dm | 2 +- .../human/ai_controlled/ai_controlled.dm | 2 +- .../mob/living/carbon/human/human_defines.dm | 1 + .../mob/new_player/preferences_setup.dm | 1 + icons/inventory/ears/mob.dmi | Bin 19096 -> 19037 bytes icons/inventory/ears/mob_teshari.dmi | Bin 2642 -> 2750 bytes icons/obj/radio_vr.dmi | Bin 24928 -> 25687 bytes maps/cynosure/cynosure-6.dmm | 8 +- maps/submaps/admin_use_vr/kk_mercship.dmm | 8 +- maps/submaps/depreciated_vr/mercbase.dmm | 8 +- vorestation.dme | 1 - 43 files changed, 645 insertions(+), 467 deletions(-) delete mode 100644 code/game/objects/items/devices/radio/headset_vr.dm diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm index 72bed469c9..80abfae652 100644 --- a/code/_helpers/global_lists.dm +++ b/code/_helpers/global_lists.dm @@ -52,8 +52,9 @@ GLOBAL_LIST_INIT(custom_species_bases, new) // Species that can be used for a Cu //Underwear var/datum/category_collection/underwear/global_underwear = new() - //Backpacks -var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Alt", "Messenger Bag", "Sports Bag", "Strapless Satchel") //VOREStation edit + //Customizables +GLOBAL_LIST_INIT(headsetlist, list("Standard","Bowman","Earbud")) +var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Alt", "Messenger Bag", "Sports Bag", "Strapless Satchel") var/global/list/pdachoicelist = list("Default", "Slim", "Old", "Rugged", "Holographic", "Wrist-Bound","Slider", "Vintage") var/global/list/exclude_jobs = list(/datum/job/ai,/datum/job/cyborg) diff --git a/code/datums/outfits/jobs/cargo.dm b/code/datums/outfits/jobs/cargo.dm index 30955983df..bed1308f39 100644 --- a/code/datums/outfits/jobs/cargo.dm +++ b/code/datums/outfits/jobs/cargo.dm @@ -1,17 +1,23 @@ /decl/hierarchy/outfit/job/cargo - l_ear = /obj/item/radio/headset/headset_cargo hierarchy_type = /decl/hierarchy/outfit/job/cargo + headset = /obj/item/radio/headset/cargo + headset_alt = /obj/item/radio/headset/alt/cargo + headset_earbud = /obj/item/radio/headset/earbud/cargo + /decl/hierarchy/outfit/job/cargo/qm name = OUTFIT_JOB_NAME("Cargo") uniform = /obj/item/clothing/under/rank/cargo - l_ear = /obj/item/radio/headset/headset_qm //VOREStation Add shoes = /obj/item/clothing/shoes/brown glasses = /obj/item/clothing/glasses/sunglasses l_hand = /obj/item/clipboard id_type = /obj/item/card/id/cargo/head pda_type = /obj/item/pda/quartermaster + headset = /obj/item/radio/headset/qm + headset_alt = /obj/item/radio/headset/alt/qm + headset_earbud = /obj/item/radio/headset/earbud/qm + /decl/hierarchy/outfit/job/cargo/cargo_tech name = OUTFIT_JOB_NAME("Cargo technician") uniform = /obj/item/clothing/under/rank/cargotech @@ -21,10 +27,13 @@ /decl/hierarchy/outfit/job/cargo/mining name = OUTFIT_JOB_NAME("Shaft miner") uniform = /obj/item/clothing/under/rank/miner - l_ear = /obj/item/radio/headset/headset_mine backpack = /obj/item/storage/backpack/industrial satchel_one = /obj/item/storage/backpack/satchel/eng id_type = /obj/item/card/id/cargo/miner pda_type = /obj/item/pda/shaftminer backpack_contents = list(/obj/item/tool/crowbar = 1, /obj/item/storage/bag/ore = 1) flags = OUTFIT_HAS_BACKPACK|OUTFIT_EXTENDED_SURVIVAL + + headset = /obj/item/radio/headset/miner + headset_alt = /obj/item/radio/headset/miner + headset_earbud = /obj/item/radio/headset/miner diff --git a/code/datums/outfits/jobs/civilian.dm b/code/datums/outfits/jobs/civilian.dm index a62600a6ee..829e6f9c64 100644 --- a/code/datums/outfits/jobs/civilian.dm +++ b/code/datums/outfits/jobs/civilian.dm @@ -19,9 +19,12 @@ uniform = /obj/item/clothing/under/color/white /decl/hierarchy/outfit/job/service - l_ear = /obj/item/radio/headset/headset_service hierarchy_type = /decl/hierarchy/outfit/job/service + headset = /obj/item/radio/headset/service + headset_alt = /obj/item/radio/headset/alt/service + headset_earbud = /obj/item/radio/headset/earbud/service + /decl/hierarchy/outfit/job/service/bartender name = OUTFIT_JOB_NAME(JOB_BARTENDER) uniform = /obj/item/clothing/under/rank/bartender @@ -91,7 +94,6 @@ /decl/hierarchy/outfit/job/internal_affairs_agent name = OUTFIT_JOB_NAME("Internal affairs agent") - l_ear = /obj/item/radio/headset/ia uniform = /obj/item/clothing/under/rank/internalaffairs suit = /obj/item/clothing/suit/storage/toggle/internalaffairs shoes = /obj/item/clothing/shoes/brown @@ -100,6 +102,10 @@ id_type = /obj/item/card/id/civilian/internal_affairs pda_type = /obj/item/pda/lawyer + headset = /obj/item/radio/headset/ia + headset_alt = /obj/item/radio/headset/alt/ia + headset_earbud = /obj/item/radio/headset/earbud/ia + /decl/hierarchy/outfit/job/chaplain name = OUTFIT_JOB_NAME(JOB_CHAPLAIN) uniform = /obj/item/clothing/under/rank/chaplain @@ -114,10 +120,13 @@ mask = /obj/item/clothing/mask/gas/explorer suit = /obj/item/clothing/suit/storage/hooded/explorer gloves = /obj/item/clothing/gloves/black - l_ear = /obj/item/radio/headset id_slot = slot_wear_id id_type = /obj/item/card/id/exploration //VOREStation Edit pda_slot = slot_belt pda_type = /obj/item/pda/cargo // Brown looks more rugged r_pocket = /obj/item/gps/explorer id_pda_assignment = JOB_EXPLORER + + headset = /obj/item/radio/headset + headset_alt = /obj/item/radio/headset/alt + headset_earbud = /obj/item/radio/headset/earbud diff --git a/code/datums/outfits/jobs/command.dm b/code/datums/outfits/jobs/command.dm index 149020e4fe..e5a869d9dd 100644 --- a/code/datums/outfits/jobs/command.dm +++ b/code/datums/outfits/jobs/command.dm @@ -2,7 +2,7 @@ name = OUTFIT_JOB_NAME(JOB_ALT_CAPTAIN) // Keep Captain for now, not JOB_SITE_MANAGER glasses = /obj/item/clothing/glasses/sunglasses uniform = /obj/item/clothing/under/rank/captain - l_ear = /obj/item/radio/headset/heads/captain + shoes = /obj/item/clothing/shoes/brown backpack = /obj/item/storage/backpack/captain satchel_one = /obj/item/storage/backpack/satchel/cap @@ -10,6 +10,10 @@ id_type = /obj/item/card/id/gold pda_type = /obj/item/pda/captain + headset = /obj/item/radio/headset/heads/captain + headset_alt = /obj/item/radio/headset/alt/heads/captain + headset_earbud = /obj/item/radio/headset/earbud/heads/captain + /decl/hierarchy/outfit/job/captain/post_equip(var/mob/living/carbon/human/H) ..() if(H.age>49) @@ -26,19 +30,25 @@ /decl/hierarchy/outfit/job/hop name = OUTFIT_JOB_NAME(JOB_HEAD_OF_PERSONNEL) uniform = /obj/item/clothing/under/rank/head_of_personnel - l_ear = /obj/item/radio/headset/heads/hop shoes = /obj/item/clothing/shoes/brown id_type = /obj/item/card/id/silver/hop pda_type = /obj/item/pda/heads/hop + headset = /obj/item/radio/headset/heads/hop + headset_alt = /obj/item/radio/headset/alt/heads/hop + headset_earbud = /obj/item/radio/headset/earbud/heads/hop + /decl/hierarchy/outfit/job/secretary name = OUTFIT_JOB_NAME(JOB_COMMAND_SECRETARY) - l_ear = /obj/item/radio/headset/headset_com shoes = /obj/item/clothing/shoes/brown id_type = /obj/item/card/id/silver/secretary pda_type = /obj/item/pda/heads r_hand = /obj/item/clipboard + headset = /obj/item/radio/headset/headset_com + headset_alt = /obj/item/radio/headset/alt/headset_com + headset_earbud = /obj/item/radio/headset/earbud/headset_com + /decl/hierarchy/outfit/job/secretary/pre_equip(mob/living/carbon/human/H) ..() if(H.gender == FEMALE) diff --git a/code/datums/outfits/jobs/engineering.dm b/code/datums/outfits/jobs/engineering.dm index 16de1539c3..11c4a4cd3c 100644 --- a/code/datums/outfits/jobs/engineering.dm +++ b/code/datums/outfits/jobs/engineering.dm @@ -1,7 +1,6 @@ /decl/hierarchy/outfit/job/engineering hierarchy_type = /decl/hierarchy/outfit/job/engineering belt = /obj/item/storage/belt/utility/full/multitool - l_ear = /obj/item/radio/headset/headset_eng shoes = /obj/item/clothing/shoes/boots/workboots r_pocket = /obj/item/t_scanner backpack = /obj/item/storage/backpack/industrial @@ -10,15 +9,23 @@ pda_slot = slot_l_store flags = OUTFIT_HAS_BACKPACK|OUTFIT_EXTENDED_SURVIVAL + headset = /obj/item/radio/headset/headset_eng + headset_alt = /obj/item/radio/headset/alt/headset_eng + headset_earbud = /obj/item/radio/headset/earbud/headset_eng + /decl/hierarchy/outfit/job/engineering/chief_engineer name = OUTFIT_JOB_NAME(JOB_CHIEF_ENGINEER) head = /obj/item/clothing/head/hardhat/white uniform = /obj/item/clothing/under/rank/chief_engineer - l_ear = /obj/item/radio/headset/heads/ce + gloves = /obj/item/clothing/gloves/black id_type = /obj/item/card/id/engineering/head pda_type = /obj/item/pda/heads/ce + headset = /obj/item/radio/headset/heads/ce + headset_alt = /obj/item/radio/headset/alt/heads/ce + headset_earbud = /obj/item/radio/headset/earbud/heads/ce + /decl/hierarchy/outfit/job/engineering/engineer name = OUTFIT_JOB_NAME(JOB_ENGINEER) head = /obj/item/clothing/head/hardhat diff --git a/code/datums/outfits/jobs/job.dm b/code/datums/outfits/jobs/job.dm index adfa938bf3..fdb7af5dbe 100644 --- a/code/datums/outfits/jobs/job.dm +++ b/code/datums/outfits/jobs/job.dm @@ -3,7 +3,6 @@ hierarchy_type = /decl/hierarchy/outfit/job uniform = /obj/item/clothing/under/color/grey - l_ear = /obj/item/radio/headset shoes = /obj/item/clothing/shoes/black id_slot = slot_wear_id @@ -13,6 +12,10 @@ flags = OUTFIT_HAS_BACKPACK + headset = /obj/item/radio/headset + headset_alt = /obj/item/radio/headset/alt + headset_earbud = /obj/item/radio/headset/earbud + /decl/hierarchy/outfit/job/equip_id(mob/living/carbon/human/H, rank, assignment) var/obj/item/card/id/C = ..() var/datum/job/J = job_master.GetJob(rank) diff --git a/code/datums/outfits/jobs/medical.dm b/code/datums/outfits/jobs/medical.dm index a78636ea63..6a4d120d37 100644 --- a/code/datums/outfits/jobs/medical.dm +++ b/code/datums/outfits/jobs/medical.dm @@ -1,16 +1,19 @@ /decl/hierarchy/outfit/job/medical hierarchy_type = /decl/hierarchy/outfit/job/medical - l_ear = /obj/item/radio/headset/headset_med shoes = /obj/item/clothing/shoes/white pda_type = /obj/item/pda/medical pda_slot = slot_l_store + backpack = /obj/item/storage/backpack/medic satchel_one = /obj/item/storage/backpack/satchel/med messenger_bag = /obj/item/storage/backpack/messenger/med + headset = /obj/item/radio/headset/headset_med + headset_alt = /obj/item/radio/headset/alt/headset_med + headset_earbud = /obj/item/radio/headset/earbud/headset_med + /decl/hierarchy/outfit/job/medical/cmo name = OUTFIT_JOB_NAME(JOB_CHIEF_MEDICAL_OFFICER) - l_ear =/obj/item/radio/headset/heads/cmo uniform = /obj/item/clothing/under/rank/chief_medical_officer suit = /obj/item/clothing/suit/storage/toggle/labcoat/cmo shoes = /obj/item/clothing/shoes/brown @@ -19,6 +22,10 @@ id_type = /obj/item/card/id/medical/head pda_type = /obj/item/pda/heads/cmo + headset = /obj/item/radio/headset/heads/cmo + headset_alt = /obj/item/radio/headset/alt/heads/cmo + headset_earbud = /obj/item/radio/headset/earbud/heads/cmo + /decl/hierarchy/outfit/job/medical/doctor name = OUTFIT_JOB_NAME(JOB_MEDICAL_DOCTOR) uniform = /obj/item/clothing/under/rank/medical diff --git a/code/datums/outfits/jobs/science.dm b/code/datums/outfits/jobs/science.dm index a9fe8a4437..eeeb84951d 100644 --- a/code/datums/outfits/jobs/science.dm +++ b/code/datums/outfits/jobs/science.dm @@ -1,23 +1,30 @@ /decl/hierarchy/outfit/job/science hierarchy_type = /decl/hierarchy/outfit/job/science - l_ear = /obj/item/radio/headset/headset_sci suit = /obj/item/clothing/suit/storage/toggle/labcoat shoes = /obj/item/clothing/shoes/white pda_type = /obj/item/pda/science + backpack = /obj/item/storage/backpack/toxins satchel_one = /obj/item/storage/backpack/satchel/tox messenger_bag = /obj/item/storage/backpack/messenger/tox sports_bag = /obj/item/storage/backpack/sport/tox + headset = /obj/item/radio/headset/headset_sci + headset_alt = /obj/item/radio/headset/alt/headset_sci + headset_earbud = /obj/item/radio/headset/earbud/headset_sci + /decl/hierarchy/outfit/job/science/rd name = OUTFIT_JOB_NAME("Research Director") - l_ear = /obj/item/radio/headset/heads/rd uniform = /obj/item/clothing/under/rank/research_director shoes = /obj/item/clothing/shoes/brown l_hand = /obj/item/clipboard id_type = /obj/item/card/id/science/head pda_type = /obj/item/pda/heads/rd + headset = /obj/item/radio/headset/heads/rd + headset_alt = /obj/item/radio/headset/alt/heads/rd + headset_earbud = /obj/item/radio/headset/earbud/heads/rd + /decl/hierarchy/outfit/job/science/scientist name = OUTFIT_JOB_NAME(JOB_SCIENTIST) uniform = /obj/item/clothing/under/rank/scientist diff --git a/code/datums/outfits/jobs/security.dm b/code/datums/outfits/jobs/security.dm index e73b45e06b..595601bbcd 100644 --- a/code/datums/outfits/jobs/security.dm +++ b/code/datums/outfits/jobs/security.dm @@ -1,22 +1,29 @@ /decl/hierarchy/outfit/job/security hierarchy_type = /decl/hierarchy/outfit/job/security glasses = /obj/item/clothing/glasses/sunglasses/sechud - l_ear = /obj/item/radio/headset/headset_sec gloves = /obj/item/clothing/gloves/black shoes = /obj/item/clothing/shoes/boots/jackboots + backpack = /obj/item/storage/backpack/security satchel_one = /obj/item/storage/backpack/satchel/sec backpack_contents = list(/obj/item/handcuffs = 1) messenger_bag = /obj/item/storage/backpack/messenger/sec sports_bag = /obj/item/storage/backpack/sport/sec + headset = /obj/item/radio/headset/headset_sec + headset_alt = /obj/item/radio/headset/alt/headset_sec + headset_earbud = /obj/item/radio/headset/earbud/headset_sec + /decl/hierarchy/outfit/job/security/hos name = OUTFIT_JOB_NAME(JOB_HEAD_OF_SECURITY) - l_ear = /obj/item/radio/headset/heads/hos uniform = /obj/item/clothing/under/rank/head_of_security id_type = /obj/item/card/id/security/head pda_type = /obj/item/pda/heads/hos + headset = /obj/item/radio/headset/heads/hos + headset_alt = /obj/item/radio/headset/alt/heads/hos + headset_earbud = /obj/item/radio/headset/earbud/heads/hos + /decl/hierarchy/outfit/job/security/warden name = OUTFIT_JOB_NAME(JOB_WARDEN) uniform = /obj/item/clothing/under/rank/warden diff --git a/code/datums/outfits/outfit.dm b/code/datums/outfits/outfit.dm index ed8e81f992..43fe69f0f2 100644 --- a/code/datums/outfits/outfit.dm +++ b/code/datums/outfits/outfit.dm @@ -52,6 +52,10 @@ var/list/outfits_decls_by_type_ var/id_pda_assignment + var/headset = /obj/item/radio/headset + var/headset_alt = /obj/item/radio/headset/alt + var/headset_earbud = /obj/item/radio/headset/earbud + var/backpack = /obj/item/storage/backpack var/satchel_one = /obj/item/storage/backpack/satchel/norm var/satchel_two = /obj/item/storage/backpack/satchel @@ -72,7 +76,11 @@ var/list/outfits_decls_by_type_ dd_insertObjectList(outfits_decls_, src) /decl/hierarchy/outfit/proc/pre_equip(mob/living/carbon/human/H) - if(flags & OUTFIT_HAS_BACKPACK) + switch(H.headset) + if(1) l_ear = headset + if(2) l_ear = headset_alt + if(3) l_ear = headset_earbud + if(flags && OUTFIT_HAS_BACKPACK) switch(H.backbag) if(2) back = backpack if(3) back = satchel_one diff --git a/code/datums/outfits/outfit_vr.dm b/code/datums/outfits/outfit_vr.dm index 97281f1a56..537f13d834 100644 --- a/code/datums/outfits/outfit_vr.dm +++ b/code/datums/outfits/outfit_vr.dm @@ -112,7 +112,6 @@ Keep outfits simple. Spawn with basic uniforms and minimal gear. Gear instead go name = OUTFIT_JOB_NAME(JOB_EXPLORER) shoes = /obj/item/clothing/shoes/boots/winter/explorer uniform = /obj/item/clothing/under/explorer - l_ear = /obj/item/radio/headset/explorer id_slot = slot_wear_id pda_slot = slot_l_store pda_type = /obj/item/pda/explorer @@ -123,6 +122,10 @@ Keep outfits simple. Spawn with basic uniforms and minimal gear. Gear instead go messenger_bag = /obj/item/storage/backpack/messenger/explorer flags = OUTFIT_HAS_BACKPACK|OUTFIT_COMPREHENSIVE_SURVIVAL + headset = /obj/item/radio/headset/explorer + headset_alt = /obj/item/radio/headset/alt/explorer + headset_earbud = /obj/item/radio/headset/explorer + /decl/hierarchy/outfit/job/pilot name = OUTFIT_JOB_NAME(JOB_PILOT) shoes = /obj/item/clothing/shoes/black @@ -130,7 +133,6 @@ Keep outfits simple. Spawn with basic uniforms and minimal gear. Gear instead go suit = /obj/item/clothing/suit/storage/toggle/bomber/pilot gloves = /obj/item/clothing/gloves/fingerless glasses = /obj/item/clothing/glasses/fakesunglasses/aviator - l_ear = /obj/item/radio/headset/pilot/alt uniform_accessories = list(/obj/item/clothing/accessory/storage/webbing/pilot1 = 1) id_slot = slot_wear_id pda_slot = slot_belt @@ -139,12 +141,15 @@ Keep outfits simple. Spawn with basic uniforms and minimal gear. Gear instead go id_pda_assignment = JOB_PILOT flags = OUTFIT_HAS_BACKPACK|OUTFIT_COMPREHENSIVE_SURVIVAL + headset = /obj/item/radio/headset/pilot + headset_alt = /obj/item/radio/headset/alt/pilot + headset_earbud = /obj/item/radio/headset/alt/pilot + /decl/hierarchy/outfit/job/medical/sar name = OUTFIT_JOB_NAME(JOB_FIELD_MEDIC) uniform = /obj/item/clothing/under/utility/blue //suit = /obj/item/clothing/suit/storage/hooded/wintercoat/medical/sar shoes = /obj/item/clothing/shoes/boots/winter/explorer - l_ear = /obj/item/radio/headset/sar l_hand = /obj/item/storage/firstaid/regular belt = /obj/item/storage/belt/medical/emt pda_slot = slot_l_store @@ -156,11 +161,14 @@ Keep outfits simple. Spawn with basic uniforms and minimal gear. Gear instead go messenger_bag = /obj/item/storage/backpack/messenger/explorer flags = OUTFIT_HAS_BACKPACK|OUTFIT_EXTENDED_SURVIVAL|OUTFIT_COMPREHENSIVE_SURVIVAL + headset = /obj/item/radio/headset/sar + headset_alt = /obj/item/radio/headset/alt/sar + headset_earbud = /obj/item/radio/headset/sar + /decl/hierarchy/outfit/job/pathfinder name = OUTFIT_JOB_NAME(JOB_PATHFINDER) shoes = /obj/item/clothing/shoes/boots/winter/explorer uniform = /obj/item/clothing/under/explorer //TODO: Uniforms. - l_ear = /obj/item/radio/headset/pathfinder id_slot = slot_wear_id pda_slot = slot_l_store pda_type = /obj/item/pda/pathfinder @@ -168,6 +176,10 @@ Keep outfits simple. Spawn with basic uniforms and minimal gear. Gear instead go id_pda_assignment = JOB_PATHFINDER flags = OUTFIT_HAS_BACKPACK|OUTFIT_EXTENDED_SURVIVAL|OUTFIT_COMPREHENSIVE_SURVIVAL + headset = /obj/item/radio/headset/pathfinder + headset_alt = /obj/item/radio/headset/alt/pathfinder + headset_earbud = /obj/item/radio/headset/pathfinder + /decl/hierarchy/outfit/job/assistant/explorer id_type = /obj/item/card/id/exploration flags = OUTFIT_HAS_BACKPACK|OUTFIT_COMPREHENSIVE_SURVIVAL diff --git a/code/datums/supplypacks/medical.dm b/code/datums/supplypacks/medical.dm index 0c099b3231..2e498c92f1 100644 --- a/code/datums/supplypacks/medical.dm +++ b/code/datums/supplypacks/medical.dm @@ -112,7 +112,7 @@ contains = list( /obj/item/storage/belt/medical = 3, /obj/item/clothing/glasses/hud/health = 3, - /obj/item/radio/headset/headset_med/alt = 3, + /obj/item/radio/headset/alt/headset_med = 3, /obj/item/clothing/suit/storage/hooded/wintercoat/medical = 3 ) cost = 10 diff --git a/code/datums/supplypacks/security.dm b/code/datums/supplypacks/security.dm index 1404b06e42..1f2cf06f89 100644 --- a/code/datums/supplypacks/security.dm +++ b/code/datums/supplypacks/security.dm @@ -444,7 +444,7 @@ contains = list( /obj/item/storage/belt/security = 3, /obj/item/clothing/glasses/sunglasses/sechud = 3, - /obj/item/radio/headset/headset_sec/alt = 3, + /obj/item/radio/headset/alt/headset_sec = 3, /obj/item/clothing/suit/storage/hooded/wintercoat/security = 3, /obj/item/clothing/glasses/sunglasses/sechud/tactical_sec_vis = 3 ) diff --git a/code/datums/supplypacks/supply.dm b/code/datums/supplypacks/supply.dm index 0629a55d8e..68a6b420c0 100644 --- a/code/datums/supplypacks/supply.dm +++ b/code/datums/supplypacks/supply.dm @@ -118,7 +118,7 @@ /obj/item/storage/backpack/industrial, /obj/item/storage/backpack/satchel/eng, /obj/item/clothing/suit/storage/hooded/wintercoat/miner, - /obj/item/radio/headset/headset_cargo, + /obj/item/radio/headset/miner, /obj/item/clothing/under/rank/miner, /obj/item/clothing/gloves/black, /obj/item/clothing/shoes/black, @@ -187,7 +187,7 @@ contains = list ( /obj/item/storage/backpack/parachute, /obj/item/radio/headset/pilot, - /obj/item/radio/headset/pilot/alt, + /obj/item/radio/headset/alt/pilot, /obj/item/clothing/mask/gas/half, /obj/item/flashlight/glowstick, /obj/item/stack/marker_beacon/thirty, diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index f6af18a4aa..24728cee21 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -8,7 +8,8 @@ subspace_transmission = 1 canhear_range = 0 // can't hear headsets from very far away slot_flags = SLOT_EARS - sprite_sheets = list(SPECIES_TESHARI = 'icons/inventory/ears/mob_teshari.dmi') + sprite_sheets = list(SPECIES_TESHARI = 'icons/inventory/ears/mob_teshari.dmi', + SPECIES_WEREBEAST = 'icons/inventory/ears/mob_vr_werebeast.dmi') var/translate_binary = 0 var/translate_hive = 0 @@ -83,254 +84,6 @@ /obj/item/radio/headset/tgui_state(mob/user) return GLOB.tgui_inventory_state -/obj/item/radio/headset/syndicate - origin_tech = list(TECH_ILLEGAL = 3) - syndie = 1 - ks1type = /obj/item/encryptionkey/syndicate - -/obj/item/radio/headset/syndicate/alt - icon_state = "syndie_headset" - item_state = "headset" - origin_tech = list(TECH_ILLEGAL = 3) - syndie = 1 - ks1type = /obj/item/encryptionkey/syndicate - -/obj/item/radio/headset/raider - origin_tech = list(TECH_ILLEGAL = 2) - syndie = 1 - ks1type = /obj/item/encryptionkey/raider - -/obj/item/radio/headset/raider/Initialize() - . = ..() - set_frequency(RAID_FREQ) - -/obj/item/radio/headset/binary - origin_tech = list(TECH_ILLEGAL = 3) - ks1type = /obj/item/encryptionkey/binary - -/obj/item/radio/headset/headset_sec - name = "security radio headset" - desc = "This is used by your elite security force." - icon_state = "sec_headset" - ks2type = /obj/item/encryptionkey/headset_sec - -/obj/item/radio/headset/headset_sec/alt - name = "security bowman headset" - desc = "This is used by your elite security force." - icon_state = "sec_headset_alt" - ks2type = /obj/item/encryptionkey/headset_sec - -/obj/item/radio/headset/headset_eng - name = "engineering radio headset" - desc = "When the engineers wish to chat like girls." - icon_state = "eng_headset" - ks2type = /obj/item/encryptionkey/headset_eng - -/obj/item/radio/headset/headset_eng/alt - name = "engineering bowman headset" - desc = "When the engineers wish to chat like girls." - icon_state = "eng_headset_alt" - ks2type = /obj/item/encryptionkey/headset_eng - -/obj/item/radio/headset/headset_rob - name = "robotics radio headset" - desc = "Made specifically for the roboticists who cannot decide between departments." - icon_state = "rob_headset" - ks2type = /obj/item/encryptionkey/headset_rob - -/obj/item/radio/headset/headset_med - name = "medical radio headset" - desc = "A headset for the trained staff of the medbay." - icon_state = "med_headset" - ks2type = /obj/item/encryptionkey/headset_med - -/obj/item/radio/headset/headset_med/alt - name = "medical bowman headset" - desc = "A headset for the trained staff of the medbay." - icon_state = "med_headset_alt" - ks2type = /obj/item/encryptionkey/headset_med - -/obj/item/radio/headset/headset_sci - name = "science radio headset" - desc = "A sciency headset. Like usual." - icon_state = "com_headset" - ks2type = /obj/item/encryptionkey/headset_sci - -/obj/item/radio/headset/headset_medsci - name = "medical research radio headset" - desc = "A headset that is a result of the mating between medical and science." - icon_state = "med_headset" - ks2type = /obj/item/encryptionkey/headset_medsci - -/obj/item/radio/headset/headset_com - name = "command radio headset" - desc = "A headset with a commanding channel." - icon_state = "com_headset" - ks2type = /obj/item/encryptionkey/headset_com - -/obj/item/radio/headset/headset_com/alt - name = "command bowman headset" - desc = "A headset with a commanding channel." - icon_state = "com_headset_alt" - ks2type = /obj/item/encryptionkey/headset_com - - -/obj/item/radio/headset/heads/captain - name = "site manager's headset" - desc = "The headset of the boss." - icon_state = "com_headset" - ks2type = /obj/item/encryptionkey/heads/captain - -/obj/item/radio/headset/heads/captain/alt - name = "site manager's bowman headset" - desc = "The headset of the boss." - icon_state = "com_headset_alt" - ks2type = /obj/item/encryptionkey/heads/captain - -/obj/item/radio/headset/heads/captain/sfr - name = "SFR headset" - desc = "A headset belonging to a Sif Free Radio DJ. SFR, best tunes in the wilderness." - icon_state = "com_headset_alt" - ks2type = /obj/item/encryptionkey/heads/captain - -/obj/item/radio/headset/heads/ai_integrated //No need to care about icons, it should be hidden inside the AI anyway. - name = "\improper AI subspace transceiver" - desc = "Integrated AI radio transceiver." - icon = 'icons/obj/robot_component.dmi' - icon_state = "radio" - item_state = "headset" - ks2type = /obj/item/encryptionkey/heads/ai_integrated - var/myAi = null // Atlantis: Reference back to the AI which has this radio. - var/disabledAi = 0 // Atlantis: Used to manually disable AI's integrated radio via intellicard menu. - -/obj/item/radio/headset/heads/ai_integrated/receive_range(freq, level) - if (disabledAi) - return -1 //Transciever Disabled. - return ..(freq, level, 1) - -/obj/item/radio/headset/heads/rd - name = "research director's headset" - desc = "Headset of the eccentric-in-chief." - icon_state = "com_headset" - ks2type = /obj/item/encryptionkey/heads/rd - -/obj/item/radio/headset/heads/rd/alt - name = "research director's bowman headset" - desc = "Headset of the eccentric-in-chief." - icon_state = "com_headset_alt" - ks2type = /obj/item/encryptionkey/heads/rd - -/obj/item/radio/headset/heads/hos - name = "head of security's headset" - desc = "The headset of the hardass who protects your worthless lives." - icon_state = "com_headset" - ks2type = /obj/item/encryptionkey/heads/hos - -/obj/item/radio/headset/heads/hos/alt - name = "head of security's bowman headset" - desc = "The headset of the hardass who protects your worthless lives." - icon_state = "com_headset_alt" - ks2type = /obj/item/encryptionkey/heads/hos - -/obj/item/radio/headset/heads/ce - name = "chief engineer's headset" - desc = "The headset of the clown who is in charge of the circus." - icon_state = "com_headset" - ks2type = /obj/item/encryptionkey/heads/ce - -/obj/item/radio/headset/heads/ce/alt - name = "chief engineer's bowman headset" - desc = "The headset of the clown who is in charge of the circus." - icon_state = "com_headset_alt" - ks2type = /obj/item/encryptionkey/heads/ce - -/obj/item/radio/headset/heads/cmo - name = "chief medical officer's headset" - desc = "The headset of the highly trained medical chief." - icon_state = "com_headset" - ks2type = /obj/item/encryptionkey/heads/cmo - -/obj/item/radio/headset/heads/cmo/alt - name = "chief medical officer's bowman headset" - desc = "The headset of the highly trained medical chief." - icon_state = "com_headset_alt" - ks2type = /obj/item/encryptionkey/heads/cmo - -/obj/item/radio/headset/heads/hop - name = "head of personnel's headset" - desc = "The headset of the poor fool who will one day be " + JOB_SITE_MANAGER + "." - icon_state = "com_headset" - ks2type = /obj/item/encryptionkey/heads/hop - -/obj/item/radio/headset/heads/hop/alt - name = "head of personnel's bowman headset" - desc = "The headset of the poor fool who will one day be " + JOB_SITE_MANAGER + "." - icon_state = "com_headset_alt" - ks2type = /obj/item/encryptionkey/heads/hop - -/obj/item/radio/headset/headset_mine - name = "mining radio headset" - desc = "Headset used by miners. Has inbuilt short-band radio for when comms are down." - icon_state = "mine_headset" - adhoc_fallback = TRUE - ks2type = /obj/item/encryptionkey/headset_cargo - -/obj/item/radio/headset/headset_cargo - name = "supply radio headset" - desc = "A headset used by the QM and their cronies." - icon_state = "cargo_headset" - ks2type = /obj/item/encryptionkey/headset_cargo - -/obj/item/radio/headset/headset_cargo/alt - name = "supply bowman headset" - desc = "A bowman headset used by the QM and their cronies." - icon_state = "cargo_headset_alt" - ks2type = /obj/item/encryptionkey/headset_cargo - -/obj/item/radio/headset/headset_service - name = "service radio headset" - desc = "Headset used by the service staff, tasked with keeping the station full, happy and clean." - icon_state = "srv_headset" - ks2type = /obj/item/encryptionkey/headset_service - -/obj/item/radio/headset/ert - name = "emergency response team radio headset" - desc = "The headset of the boss's boss." - icon_state = "com_headset" - centComm = 1 -// freerange = 1 - ks2type = /obj/item/encryptionkey/ert - -/obj/item/radio/headset/ert/alt - name = "emergency response team bowman headset" - desc = "The headset of the boss's boss." - icon_state = "com_headset_alt" -// freerange = 1 - ks2type = /obj/item/encryptionkey/ert - -/obj/item/radio/headset/omni //Only for the admin intercoms - ks2type = /obj/item/encryptionkey/omni - -/obj/item/radio/headset/ia - name = "internal affair's headset" - desc = "The headset of your worst enemy." - icon_state = "com_headset" - ks2type = /obj/item/encryptionkey/heads/hos - -/obj/item/radio/headset/mmi_radio - name = "brain-integrated radio" - desc = "MMIs and synthetic brains are often equipped with these." - icon = 'icons/obj/robot_component.dmi' - icon_state = "radio" - item_state = "headset" - var/mmiowner = null - var/radio_enabled = 1 - -/obj/item/radio/headset/mmi_radio/receive_range(freq, level) - if (!radio_enabled || istype(src.loc.loc, /mob/living/silicon) || istype(src.loc.loc, /obj/item/organ/internal)) - return -1 //Transciever Disabled. - return ..(freq, level, 1) - /obj/item/radio/headset/attackby(obj/item/W as obj, mob/user as mob) // ..() user.set_machine(src) @@ -361,15 +114,15 @@ keyslot2 = null recalculateChannels() - to_chat(user, "You pop out the encryption keys in the headset!") + to_chat(user, span_notice("You pop out the encryption keys in the headset!")) playsound(src, W.usesound, 50, 1) else - to_chat(user, "This headset doesn't have any encryption keys! How useless...") + to_chat(user, span_notice("This headset doesn't have any encryption keys! How useless...")) if(istype(W, /obj/item/encryptionkey/)) if(keyslot1 && keyslot2) - to_chat(user, "The headset can't hold another key!") + to_chat(user, span_notice("The headset can't hold another key!")) return if(!keyslot1) @@ -387,7 +140,6 @@ return - /obj/item/radio/headset/recalculateChannels(var/setDescription = 0) src.channels = list() src.translate_binary = 0 @@ -451,3 +203,432 @@ radio_text += ", " radio_desc = radio_text + +/obj/item/radio/headset/mob_headset/receive_range(freq, level) + if(ismob(src.loc)) + return ..(freq, level, 1) + return -1 + +/obj/item/radio/headset/mob_headset/afterattack(var/atom/movable/target, mob/living/user, proximity) + if(!proximity) + return + if(istype(target,/mob/living/simple_mob)) + var/mob/living/simple_mob/M = target + if(!M.mob_radio) + user.drop_item() + forceMove(M) + M.mob_radio = src + return + if(M.mob_radio) + M.mob_radio.forceMove(M.loc) + M.mob_radio = null + return + ..() + +/obj/item/radio/headset/alt + name = "bowman radio headset" + desc = "A larger, sturdier radio headset. A bit bulky, but guaranteed to stay on no matter what." + icon_state = "headset_alt" + +/obj/item/radio/headset/earbud + name = "radio earbud" + desc = "A discreet radio earbud and low-profile mic. Simple and unobtrusive." + icon_state = "headset_earbud" + +/obj/item/radio/headset/headset_sec + name = "security radio headset" + icon_state = "sec_headset" + ks2type = /obj/item/encryptionkey/headset_sec + +/obj/item/radio/headset/alt/headset_sec + name = "security bowman headset" + icon_state = "sec_headset_alt" + ks2type = /obj/item/encryptionkey/headset_sec + +/obj/item/radio/headset/earbud/headset_sec + name = "security earbud" + icon_state = "sec_earbud" + ks2type = /obj/item/encryptionkey/headset_sec + +/obj/item/radio/headset/headset_eng + name = "engineering radio headset" + icon_state = "eng_headset" + ks2type = /obj/item/encryptionkey/headset_eng + +/obj/item/radio/headset/alt/headset_eng + name = "engineering bowman headset" + icon_state = "eng_headset_alt" + ks2type = /obj/item/encryptionkey/headset_eng + +/obj/item/radio/headset/earbud/headset_eng + name = "engineering earbud" + icon_state = "eng_earbud" + ks2type = /obj/item/encryptionkey/headset_eng + +/obj/item/radio/headset/headset_med + name = "medical radio headset" + icon_state = "med_headset" + ks2type = /obj/item/encryptionkey/headset_med + +/obj/item/radio/headset/alt/headset_med + name = "medical bowman headset" + icon_state = "med_headset_alt" + ks2type = /obj/item/encryptionkey/headset_med + +/obj/item/radio/headset/earbud/headset_med + name = "medical earbud" + icon_state = "med_earbud" + ks2type = /obj/item/encryptionkey/headset_med + +/obj/item/radio/headset/headset_sci + name = "science radio headset" + icon_state = "com_headset" + ks2type = /obj/item/encryptionkey/headset_sci + +/obj/item/radio/headset/alt/headset_sci + name = "science bowman headset" + icon_state = "com_headset_alt" + ks2type = /obj/item/encryptionkey/headset_sci + +/obj/item/radio/headset/earbud/headset_sci + name = "science earbud" + icon_state = "com_earbud" + ks2type = /obj/item/encryptionkey/headset_sci + +/obj/item/radio/headset/headset_com + name = "command radio headset" + icon_state = "com_headset" + ks2type = /obj/item/encryptionkey/headset_com + +/obj/item/radio/headset/alt/headset_com + name = "command bowman headset" + icon_state = "com_headset_alt" + ks2type = /obj/item/encryptionkey/headset_com + +/obj/item/radio/headset/earbud/headset_com + name = "command earbud" + icon_state = "com_earbud" + ks2type = /obj/item/encryptionkey/headset_com + +/obj/item/radio/headset/heads/captain + name = "site manager's headset" + icon_state = "com_headset" + ks2type = /obj/item/encryptionkey/heads/captain + +/obj/item/radio/headset/heads/captain/sfr + name = "SFR headset" + desc = "A headset belonging to a Sif Free Radio DJ. SFR, best tunes in the wilderness." + icon_state = "com_headset_alt" + +/obj/item/radio/headset/alt/heads/captain + name = "site manager's bowman headset" + icon_state = "com_headset_alt" + ks2type = /obj/item/encryptionkey/heads/captain + +/obj/item/radio/headset/earbud/heads/captain + name = "site manager's earbud" + icon_state = "com_earbud" + ks2type = /obj/item/encryptionkey/heads/captain + +/obj/item/radio/headset/heads/rd + name = "research director's headset" + icon_state = "com_headset" + ks2type = /obj/item/encryptionkey/heads/rd + +/obj/item/radio/headset/alt/heads/rd + name = "research director's bowman headset" + icon_state = "com_headset_alt" + ks2type = /obj/item/encryptionkey/heads/rd + +/obj/item/radio/headset/earbud/heads/rd + name = "research director's earbud" + icon_state = "com_earbud" + ks2type = /obj/item/encryptionkey/heads/rd + +/obj/item/radio/headset/heads/hos + name = "head of security's headset" + icon_state = "com_headset" + ks2type = /obj/item/encryptionkey/heads/hos + +/obj/item/radio/headset/alt/heads/hos + name = "head of security's bowman headset" + icon_state = "com_headset_alt" + ks2type = /obj/item/encryptionkey/heads/hos + +/obj/item/radio/headset/earbud/heads/hos + name = "head of security's earbud" + icon_state = "com_earbud" + ks2type = /obj/item/encryptionkey/heads/hos + +/obj/item/radio/headset/heads/ce + name = "chief engineer's headset" + icon_state = "com_headset" + ks2type = /obj/item/encryptionkey/heads/ce + +/obj/item/radio/headset/alt/heads/ce + name = "chief engineer's bowman headset" + icon_state = "com_headset_alt" + ks2type = /obj/item/encryptionkey/heads/ce + +/obj/item/radio/headset/earbud/heads/ce + name = "chief engineer's earbud" + icon_state = "com_earbud" + ks2type = /obj/item/encryptionkey/heads/ce + +/obj/item/radio/headset/heads/cmo + name = "chief medical officer's headset" + icon_state = "com_headset" + ks2type = /obj/item/encryptionkey/heads/cmo + +/obj/item/radio/headset/alt/heads/cmo + name = "chief medical officer's bowman headset" + icon_state = "com_headset_alt" + ks2type = /obj/item/encryptionkey/heads/cmo + +/obj/item/radio/headset/earbud/heads/cmo + name = "chief medical officer's earbud" + icon_state = "com_earbud" + ks2type = /obj/item/encryptionkey/heads/cmo + +/obj/item/radio/headset/heads/hop + name = "head of personnel's headset" + icon_state = "com_headset" + ks2type = /obj/item/encryptionkey/heads/hop + +/obj/item/radio/headset/alt/heads/hop + name = "head of personnel's bowman headset" + icon_state = "com_headset_alt" + ks2type = /obj/item/encryptionkey/heads/hop + +/obj/item/radio/headset/earbud/heads/hop + name = "head of personnel's earbud" + icon_state = "com_earbud" + ks2type = /obj/item/encryptionkey/heads/hop + +/obj/item/radio/headset/miner + name = "mining radio headset" + desc = "Headset used by miners. Has inbuilt short-band radio for when comms are down." + icon_state = "mine_headset" + adhoc_fallback = TRUE + ks2type = /obj/item/encryptionkey/headset_cargo + +/obj/item/radio/headset/cargo + name = "supply radio headset" + icon_state = "cargo_headset" + ks2type = /obj/item/encryptionkey/headset_cargo + +/obj/item/radio/headset/alt/cargo + name = "supply bowman headset" + icon_state = "cargo_headset_alt" + ks2type = /obj/item/encryptionkey/headset_cargo + +/obj/item/radio/headset/earbud/cargo + name = "supply earbud" + icon_state = "cargo_earbud" + ks2type = /obj/item/encryptionkey/headset_cargo + +/obj/item/radio/headset/qm + name = "qm radio headset" + icon_state = "cargo_headset" + ks2type = /obj/item/encryptionkey/qm + +/obj/item/radio/headset/alt/qm + name = "qm bowman headset" + icon_state = "cargo_headset_alt" + ks2type = /obj/item/encryptionkey/qm + +/obj/item/radio/headset/earbud/qm + name = "qm earbud" + icon_state = "cargo_earbud" + ks2type = /obj/item/encryptionkey/qm + +/obj/item/radio/headset/service + name = "service radio headset" + icon_state = "srv_headset" + ks2type = /obj/item/encryptionkey/headset_service + +/obj/item/radio/headset/alt/service + name = "service bowman headset" + icon_state = "srv_headset_alt" + ks2type = /obj/item/encryptionkey/headset_service + +/obj/item/radio/headset/earbud/service + name = "service earbud" + icon_state = "srv_earbud" + ks2type = /obj/item/encryptionkey/headset_service + +/obj/item/radio/headset/ert + name = "emergency response team radio headset" + icon_state = "com_headset" + centComm = 1 + ks2type = /obj/item/encryptionkey/ert + +/obj/item/radio/headset/alt/ert + name = "emergency response team bowman headset" + icon_state = "com_headset_alt" + ks2type = /obj/item/encryptionkey/ert + +/obj/item/radio/headset/ia + name = "internal affairs headset" + icon_state = "com_headset" + ks2type = /obj/item/encryptionkey/heads/hos + +/obj/item/radio/headset/alt/ia + name = "internal affairs bowman headset" + icon_state = "com_headset_alt" + ks2type = /obj/item/encryptionkey/heads/hos + +/obj/item/radio/headset/earbud/ia + name = "internal affairs earbud" + icon_state = "com_earbud" + ks2type = /obj/item/encryptionkey/heads/hos + +/obj/item/radio/headset/centcom + name = "centcom radio headset" + icon_state = "cent_headset" + item_state = "headset" + centComm = 1 + ks2type = /obj/item/encryptionkey/ert + +/obj/item/radio/headset/alt/centcom + name = "centcom bowman headset" + icon_state = "com_headset_alt" + +/obj/item/radio/headset/nanotrasen + name = "\improper NT radio headset" + icon_state = "nt_headset" + centComm = 1 + ks2type = /obj/item/encryptionkey/ert + +/obj/item/radio/headset/alt/nanotrasen + name = "\improper NT bowman headset" + icon_state = "nt_headset_alt" + +/obj/item/radio/headset/pathfinder + name = "pathfinder's headset" + icon_state = "exp_headset" + adhoc_fallback = TRUE + ks2type = /obj/item/encryptionkey/pathfinder + +/obj/item/radio/headset/alt/pathfinder + name = "pathfinder's bowman headset" + icon_state = "exp_headset_alt" + +/obj/item/radio/headset/pilot + name = "pilot's headset" + icon_state = "pilot_headset" + adhoc_fallback = TRUE + +/obj/item/radio/headset/alt/pilot + name = "pilot's bowman headset" + icon_state = "pilot_headset_alt" + +/obj/item/radio/headset/explorer + name = "away team member's headset" + icon_state = "exp_headset" + adhoc_fallback = TRUE + ks2type = /obj/item/encryptionkey/explorer + +/obj/item/radio/headset/alt/explorer + name = "away team's bowman headset" + icon_state = "exp_headset_alt" + +/obj/item/radio/headset/sar + name = "search and rescue headset" + icon_state = "sar_headset" + adhoc_fallback = TRUE + ks2type = /obj/item/encryptionkey/sar + +/obj/item/radio/headset/alt/sar + name = "search and rescue bowman headset" + icon_state = "sar_headset_alt" + adhoc_fallback = TRUE + ks2type = /obj/item/encryptionkey/sar + +/obj/item/radio/headset/talon + name = "talon headset" + adhoc_fallback = TRUE + icon_state = "pilot_headset" + ks2type = /obj/item/encryptionkey/talon + +/obj/item/radio/headset/alt/talon + name = "talon bowman headset" + adhoc_fallback = TRUE + icon_state = "pilot_headset" + ks2type = /obj/item/encryptionkey/talon + +/obj/item/radio/headset/earbud/talon + name = "talon earbud" + adhoc_fallback = TRUE + icon_state = "pilot_headset" + ks2type = /obj/item/encryptionkey/talon + +/obj/item/radio/headset/headset_rob + name = "robotics radio headset" + icon_state = "rob_headset" + ks2type = /obj/item/encryptionkey/headset_rob + +// Special Antag/Admin/Event/Other headsets + +/obj/item/radio/headset/syndicate + origin_tech = list(TECH_ILLEGAL = 3) + syndie = 1 + ks1type = /obj/item/encryptionkey/syndicate + +/obj/item/radio/headset/alt/syndicate + origin_tech = list(TECH_ILLEGAL = 3) + syndie = 1 + ks1type = /obj/item/encryptionkey/syndicate + +/obj/item/radio/headset/earbud/syndicate + origin_tech = list(TECH_ILLEGAL = 3) + syndie = 1 + ks1type = /obj/item/encryptionkey/syndicate + +/obj/item/radio/headset/raider + origin_tech = list(TECH_ILLEGAL = 2) + syndie = 1 + ks1type = /obj/item/encryptionkey/raider + +/obj/item/radio/headset/raider/Initialize() + . = ..() + set_frequency(RAID_FREQ) + +/obj/item/radio/headset/binary + origin_tech = list(TECH_ILLEGAL = 3) + ks1type = /obj/item/encryptionkey/binary + +/obj/item/radio/headset/omni //Only for the admin intercoms + ks2type = /obj/item/encryptionkey/omni + +/obj/item/radio/headset/mmi_radio + name = "brain-integrated radio" + icon = 'icons/obj/robot_component.dmi' + icon_state = "radio" + item_state = "headset" + var/mmiowner = null + var/radio_enabled = 1 + +/obj/item/radio/headset/mmi_radio/receive_range(freq, level) + if (!radio_enabled || istype(src.loc.loc, /mob/living/silicon) || istype(src.loc.loc, /obj/item/organ/internal)) + return -1 //Transciever Disabled. + return ..(freq, level, 1) + +/obj/item/radio/headset/mob_headset //Adminbus headset for simplemob shenanigans. + name = "nonhuman radio receiver" + desc = "An updated, self-adhesive modular intercom that requires no hands to operate or ears to hold, just stick it on. Takes encryption keys" + +/obj/item/radio/headset/heads/ai_integrated //No need to care about icons, it should be hidden inside the AI anyway. + name = "\improper AI subspace transceiver" + desc = "Integrated AI radio transceiver." + icon = 'icons/obj/robot_component.dmi' + icon_state = "radio" + item_state = "headset" + ks2type = /obj/item/encryptionkey/heads/ai_integrated + var/myAi = null // Atlantis: Reference back to the AI which has this radio. + var/disabledAi = 0 // Atlantis: Used to manually disable AI's integrated radio via intellicard menu. + +/obj/item/radio/headset/heads/ai_integrated/receive_range(freq, level) + if (disabledAi) + return -1 //Transciever Disabled. + return ..(freq, level, 1) \ No newline at end of file diff --git a/code/game/objects/items/devices/radio/headset_vr.dm b/code/game/objects/items/devices/radio/headset_vr.dm deleted file mode 100644 index bad15ccd48..0000000000 --- a/code/game/objects/items/devices/radio/headset_vr.dm +++ /dev/null @@ -1,131 +0,0 @@ -/obj/item/radio/headset/centcom - name = "centcom radio headset" - desc = "The headset of the boss's boss." - icon_state = "cent_headset" - item_state = "headset" - centComm = 1 - ks2type = /obj/item/encryptionkey/ert - -/obj/item/radio/headset/centcom/alt - name = "centcom bowman headset" - icon_state = "com_headset_alt" - -/obj/item/radio/headset/nanotrasen - name = "\improper NT radio headset" - desc = "The headset of a Nanotrasen corporate employee." - icon_state = "nt_headset" - centComm = 1 - ks2type = /obj/item/encryptionkey/ert - -/obj/item/radio/headset/nanotrasen/alt - name = "\improper NT bowman headset" - icon_state = "nt_headset_alt" - -/obj/item/radio/headset - sprite_sheets = list(SPECIES_TESHARI = 'icons/inventory/ears/mob_teshari.dmi', - SPECIES_WEREBEAST = 'icons/inventory/ears/mob_vr_werebeast.dmi') - -/obj/item/radio/headset/mob_headset //Adminbus headset for simplemob shenanigans. - name = "nonhuman radio receiver" - desc = "An updated, self-adhesive modular intercom that requires no hands to operate or ears to hold, just stick it on. Takes encryption keys" - -/obj/item/radio/headset/mob_headset/receive_range(freq, level) - if(ismob(src.loc)) - return ..(freq, level, 1) - return -1 - -/obj/item/radio/headset/mob_headset/afterattack(var/atom/movable/target, mob/living/user, proximity) - if(!proximity) - return - if(istype(target,/mob/living/simple_mob)) - var/mob/living/simple_mob/M = target - if(!M.mob_radio) - user.drop_item() - forceMove(M) - M.mob_radio = src - return - if(M.mob_radio) - M.mob_radio.forceMove(M.loc) - M.mob_radio = null - return - ..() - -/obj/item/radio/headset/headset_cargo - desc = "A headset used by the QM's slaves." - -/obj/item/radio/headset/headset_cargo/alt - desc = "A bowman headset used by the QM's slaves." - -/obj/item/radio/headset/headset_qm - name = "qm radio headset" - desc = "A headset used by the QM." - icon_state = "cargo_headset" - ks2type = /obj/item/encryptionkey/qm - -/obj/item/radio/headset/headset_qm/alt - name = "qm bowman headset" - desc = "A bowman headset used by the QM." - icon_state = "cargo_headset_alt" - -/obj/item/radio/headset/pathfinder - name = "pathfinder's headset" - desc = "Headset used by pathfinders for exploring. Access to the explorer and command channels." - icon_state = "exp_headset" - adhoc_fallback = TRUE - ks2type = /obj/item/encryptionkey/pathfinder - -/obj/item/radio/headset/pathfinder/alt - name = "pathfinder's bowman headset" - desc = "Bowman headset used by pathfinders for exploring. Access to the explorer and command channels." - icon_state = "exp_headset_alt" - -/obj/item/radio/headset/pilot - name = "pilot's headset" - desc = "A headset used by pilots." - icon_state = "pilot_headset" - adhoc_fallback = TRUE - -/obj/item/radio/headset/pilot/alt - name = "pilot's bowman headset" - desc = "A bowman headset used by pilots." - icon_state = "pilot_headset_alt" - -/obj/item/radio/headset/explorer - name = "away team member's headset" - desc = "Headset used by the away team for exploring. Access to the away team channel." - icon_state = "exp_headset" - adhoc_fallback = TRUE - ks2type = /obj/item/encryptionkey/explorer - -/obj/item/radio/headset/explorer/alt - name = "away team's bowman headset" - desc = "Bowman headset used by the away team for exploring. Access to the away team channel." - icon_state = "exp_headset_alt" - -/obj/item/radio/headset/sar - name = "fm radio headset" - desc = "A headset for field medics." - icon_state = "sar_headset" - adhoc_fallback = TRUE - ks2type = /obj/item/encryptionkey/sar - -/obj/item/radio/headset/sar/alt - name = "fm radio bowman headset" - desc = "A bowman headset for field medics." - icon_state = "sar_headset_alt" - -/* //They're all volunteers now. -/obj/item/radio/headset/volunteer - name = "volunteer's headset" - desc = "A headset used by volunteers to expedition teams, has access to the Away Team channel." - icon_state = "pilot_headset" - adhoc_fallback = TRUE - ks2type = /obj/item/encryptionkey/explorer -*/ - -/obj/item/radio/headset/talon - name = "talon headset" - desc = "A headset for communication between the crew of the ITV Talon." - adhoc_fallback = TRUE - icon_state = "pilot_headset" - ks2type = /obj/item/encryptionkey/talon diff --git a/code/game/objects/random/mapping.dm b/code/game/objects/random/mapping.dm index 3496fe8bb0..aa2a1bb880 100644 --- a/code/game/objects/random/mapping.dm +++ b/code/game/objects/random/mapping.dm @@ -223,8 +223,8 @@ /obj/random/sfr/item_to_spawn() return pick(prob(25);/obj/item/radio/headset/heads/captain/sfr, - prob(25);/obj/item/radio/headset/headset_cargo/alt, - prob(25);/obj/item/radio/headset/headset_com/alt, + prob(25);/obj/item/radio/headset/alt/cargo, + prob(25);/obj/item/radio/headset/alt/headset_com, prob(25);/obj/item/radio/headset) // Mining Goodies diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm index aa09e9fc5b..cb8732ecba 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -23,7 +23,9 @@ starts_with = list( /obj/item/clothing/head/that = 2, - /obj/item/radio/headset/headset_service = 2, + /obj/item/radio/headset/service = 2, + /obj/item/radio/headset/alt/service = 2, + /obj/item/radio/headset/earbud/service = 2, /obj/item/clothing/head/pin/flower, /obj/item/clothing/head/pin/flower/pink, /obj/item/clothing/head/pin/flower/yellow, @@ -51,7 +53,9 @@ starts_with = list( /obj/item/clothing/under/sundress, /obj/item/clothing/under/waiter = 2, - /obj/item/radio/headset/headset_service = 2, + /obj/item/radio/headset/service = 2, + /obj/item/radio/headset/alt/service = 2, + /obj/item/radio/headset/earbud/service = 2, /obj/item/storage/box/mousetraps = 2, /obj/item/clothing/under/rank/chef, /obj/item/clothing/head/chefhat, @@ -69,7 +73,9 @@ starts_with = list( /obj/item/clothing/under/rank/janitor, /obj/item/clothing/under/dress/maid/janitor, - /obj/item/radio/headset/headset_service, + /obj/item/radio/headset/service, + /obj/item/radio/headset/alt/service, + /obj/item/radio/headset/earbud/service, /obj/item/cartridge/janitor, /obj/item/clothing/suit/storage/hooded/wintercoat/janitor, /obj/item/clothing/gloves/black, diff --git a/code/game/objects/structures/crates_lockers/closets/misc_vr.dm b/code/game/objects/structures/crates_lockers/closets/misc_vr.dm index d8ccfd6025..1aba1626ec 100644 --- a/code/game/objects/structures/crates_lockers/closets/misc_vr.dm +++ b/code/game/objects/structures/crates_lockers/closets/misc_vr.dm @@ -63,7 +63,7 @@ /obj/item/clothing/shoes/boots/winter/explorer, /obj/item/clothing/gloves/black, /obj/item/radio/headset/explorer, - /obj/item/radio/headset/explorer/alt, + /obj/item/radio/headset/alt/explorer, /obj/item/cartridge/explorer, /obj/item/flashlight, /obj/item/gps/explorer, @@ -104,7 +104,7 @@ /obj/item/clothing/shoes/boots/winter/explorer, /obj/item/clothing/gloves/black, /obj/item/radio/headset/pathfinder, - /obj/item/radio/headset/pathfinder/alt, + /obj/item/radio/headset/alt/pathfinder, /obj/item/cartridge/explorer, /obj/item/flashlight, /obj/item/gps/explorer, @@ -153,7 +153,7 @@ /obj/item/clothing/suit/storage/hooded/wintercoat/medical/sar, /obj/item/clothing/shoes/boots/winter/explorer, /obj/item/radio/headset/sar, - /obj/item/radio/headset/sar/alt, + /obj/item/radio/headset/alt/sar, /obj/item/cartridge/sar, /obj/item/flashlight, /obj/item/tank/emergency/oxygen/engi, @@ -201,7 +201,7 @@ /obj/item/clothing/shoes/black, /obj/item/clothing/gloves/fingerless, /obj/item/radio/headset/pilot, - /obj/item/radio/headset/pilot/alt, + /obj/item/radio/headset/alt/pilot, /obj/item/flashlight, /obj/item/reagent_containers/food/snacks/liquidfood, /obj/item/reagent_containers/food/snacks/liquidprotein, diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm index 34810bfe42..9ede8e655c 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm @@ -11,8 +11,9 @@ /obj/item/clothing/suit/storage/hooded/wintercoat/cargo, /obj/item/clothing/shoes/boots/winter/supply, /obj/item/clothing/shoes/black, - /obj/item/radio/headset/headset_cargo, - /obj/item/radio/headset/headset_cargo/alt, + /obj/item/radio/headset/cargo, + /obj/item/radio/headset/alt/cargo, + /obj/item/radio/headset/earbud/cargo, /obj/item/clothing/gloves/black, /obj/item/clothing/gloves/fingerless, /obj/item/clothing/head/soft) @@ -37,8 +38,9 @@ /obj/item/clothing/under/rank/cargo/jeans, /obj/item/clothing/under/rank/cargo/jeans/female, /obj/item/clothing/shoes/brown, - /obj/item/radio/headset/headset_qm, //VOREStation Edit, - /obj/item/radio/headset/headset_qm/alt, //VOREStation Edit, + /obj/item/radio/headset/qm, + /obj/item/radio/headset/alt/qm, + /obj/item/radio/headset/earbud/qm, /obj/item/clothing/under/rank/neo_qm, /obj/item/clothing/under/rank/neo_qm_skirt, /obj/item/clothing/under/rank/neo_qm_jacket, @@ -73,7 +75,7 @@ closet_appearance = /decl/closet_appearance/secure_closet/mining starts_with = list( - /obj/item/radio/headset/headset_mine, + /obj/item/radio/headset/miner, /obj/item/clothing/under/rank/miner, /obj/item/clothing/gloves/black, /obj/item/clothing/shoes/black, diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index 7186779efe..78018e247e 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -20,7 +20,8 @@ /obj/item/clothing/shoes/brown, /obj/item/cartridge/ce, /obj/item/radio/headset/heads/ce, - /obj/item/radio/headset/heads/ce/alt, + /obj/item/radio/headset/alt/heads/ce, + /obj/item/radio/headset/earbud/heads/ce, /obj/item/storage/toolbox/mechanical, /obj/item/clothing/suit/storage/hazardvest, ///obj/item/clothing/mask/gas, //VOREStation Removal: Locker bloat, grr. The fancy one below functions as a mask & helmet combined. @@ -92,7 +93,8 @@ /obj/item/clothing/accessory/storage/brown_vest, /obj/item/storage/toolbox/mechanical, /obj/item/radio/headset/headset_eng, - /obj/item/radio/headset/headset_eng/alt, + /obj/item/radio/headset/alt/headset_eng, + /obj/item/radio/headset/earbud/headset_eng, /obj/item/clothing/suit/storage/hazardvest, /obj/item/clothing/mask/gas, /obj/item/clothing/glasses/meson, @@ -129,7 +131,8 @@ /obj/item/extinguisher/atmo, ///obj/item/clamp, //VOREStation Removal: without leaks those are pointless, /obj/item/radio/headset/headset_eng, - /obj/item/radio/headset/headset_eng/alt, + /obj/item/radio/headset/alt/headset_eng, + /obj/item/radio/headset/earbud/headset_eng, /obj/item/clothing/suit/storage/hazardvest/atmos, //VOREStation edit. Eng locker gets regular haz-vest, atmos gets the themed one of their own /obj/item/clothing/mask/gas, /obj/item/cartridge/atmos, diff --git a/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm b/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm index e5fc9ce56e..5e4389f0ef 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm @@ -8,7 +8,9 @@ /obj/item/clothing/under/rank/hydroponics, /obj/item/clothing/gloves/botanic_leather, /obj/item/analyzer/plant_analyzer, - /obj/item/radio/headset/headset_service, + /obj/item/radio/headset/service, + /obj/item/radio/headset/alt/service, + /obj/item/radio/headset/earbud/service, /obj/item/clothing/head/greenbandana, /obj/item/shovel/spade, /obj/item/material/minihoe, diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index a747bf9e3e..231b17b610 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -39,7 +39,8 @@ /obj/item/clothing/shoes/white, /obj/item/cartridge/medical, /obj/item/radio/headset/headset_med, - /obj/item/radio/headset/headset_med/alt, + /obj/item/radio/headset/alt/headset_med, + /obj/item/radio/headset/earbud/headset_med, /obj/item/clothing/suit/storage/hooded/wintercoat/medical, /obj/item/clothing/suit/storage/hooded/wintercoat/medical/alt, /obj/item/clothing/shoes/boots/winter/medical, @@ -108,7 +109,9 @@ /obj/item/clothing/suit/storage/toggle/labcoat/emt, /obj/item/clothing/suit/storage/hooded/wintercoat/medical/para, /obj/item/clothing/shoes/boots/winter/medical, - /obj/item/radio/headset/headset_med/alt, + /obj/item/radio/headset/headset_med, + /obj/item/radio/headset/alt/headset_med, + /obj/item/radio/headset/earbud/headset_med, /obj/item/cartridge/medical, /obj/item/storage/briefcase/inflatable, /obj/item/flashlight, @@ -143,7 +146,8 @@ /obj/item/clothing/under/rank/neo_cmo_turtle_skirt, /obj/item/clothing/under/rank/neo_cmo_gorka, /obj/item/radio/headset/heads/cmo, - /obj/item/radio/headset/heads/cmo/alt, + /obj/item/radio/headset/alt/heads/cmo, + /obj/item/radio/headset/earbud/heads/cmo, /obj/item/flash, /obj/item/reagent_containers/hypospray/vial, /obj/item/clothing/suit/storage/hooded/wintercoat/medical, diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm index 5b5d4c42f2..f33d9ba9ae 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm @@ -45,7 +45,8 @@ /obj/item/clothing/shoes/laceup/brown, /obj/item/clothing/gloves/sterile/latex, /obj/item/radio/headset/heads/rd, - /obj/item/radio/headset/heads/rd/alt, + /obj/item/radio/headset/alt/heads/rd, + /obj/item/radio/headset/earbud/heads/rd, /obj/item/tank/air, /obj/item/clothing/mask/gas, /obj/item/flash, diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 80d3bb90eb..90661f4dd4 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -10,7 +10,8 @@ /obj/item/cartridge/captain, /obj/item/storage/lockbox/medal, /obj/item/radio/headset/heads/captain, - /obj/item/radio/headset/heads/captain/alt, + /obj/item/radio/headset/alt/heads/captain, + /obj/item/radio/headset/earbud/heads/captain, /obj/item/gun/energy/gun, /obj/item/melee/telebaton, /obj/item/flash, @@ -27,7 +28,8 @@ /obj/item/clothing/head/helmet, /obj/item/cartridge/hop, /obj/item/radio/headset/heads/hop, - /obj/item/radio/headset/heads/hop/alt, + /obj/item/radio/headset/alt/heads/hop, + /obj/item/radio/headset/earbud/heads/hop, /obj/item/storage/box/ids = 2, /obj/item/gun/energy/gun/compact, /obj/item/storage/box/commandkeys, @@ -90,7 +92,8 @@ /obj/item/clothing/head/helmet/dermal, /obj/item/cartridge/hos, /obj/item/radio/headset/heads/hos, - /obj/item/radio/headset/heads/hos/alt, + /obj/item/radio/headset/alt/heads/hos, + /obj/item/radio/headset/earbud/heads/hos, /obj/item/clothing/glasses/sunglasses/sechud, /obj/item/taperoll/police, /obj/item/shield/riot, @@ -151,7 +154,8 @@ /obj/item/clothing/under/rank/neo_sec_gorka, /obj/item/cartridge/security, /obj/item/radio/headset/headset_sec, - /obj/item/radio/headset/headset_sec/alt, + /obj/item/radio/headset/alt/headset_sec, + /obj/item/radio/headset/earbud/headset_sec, /obj/item/clothing/glasses/sunglasses/sechud, /obj/item/taperoll/police, /obj/item/clothing/accessory/badge/holo/warden, @@ -189,7 +193,8 @@ /obj/item/clothing/head/helmet, /obj/item/cartridge/security, /obj/item/radio/headset/headset_sec, - /obj/item/radio/headset/headset_sec/alt, + /obj/item/radio/headset/alt/headset_sec, + /obj/item/radio/headset/earbud/headset_sec, /obj/item/storage/belt/security, /obj/item/flash, /obj/item/reagent_containers/spray/pepper, @@ -257,7 +262,8 @@ /obj/item/storage/belt/detective, /obj/item/storage/box/evidence, /obj/item/radio/headset/headset_sec, - /obj/item/radio/headset/headset_sec/alt, + /obj/item/radio/headset/alt/headset_sec, + /obj/item/radio/headset/earbud/headset_sec, /obj/item/clothing/suit/storage/vest/detective, /obj/item/taperoll/police, /obj/item/clothing/accessory/holster/armpit, diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security_vr.dm b/code/game/objects/structures/crates_lockers/closets/secure/security_vr.dm index 7761b7f03f..e627ad4a49 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security_vr.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security_vr.dm @@ -31,7 +31,8 @@ /obj/item/clothing/head/helmet/HoS/hat/blue, /obj/item/clothing/head/helmet/dermal, /obj/item/radio/headset/heads/hos, - /obj/item/radio/headset/heads/hos/alt, + /obj/item/radio/headset/alt/heads/hos, + /obj/item/radio/headset/earbud/heads/hos, /obj/item/clothing/glasses/sunglasses/sechud, /obj/item/storage/belt/security, /obj/item/clothing/accessory/holster/waist, @@ -76,7 +77,8 @@ /obj/item/clothing/head/helmet, /obj/item/cartridge/security, /obj/item/radio/headset/headset_sec, - /obj/item/radio/headset/headset_sec/alt, + /obj/item/radio/headset/alt/headset_sec, + /obj/item/radio/headset/earbud/headset_sec, /obj/item/storage/belt/security, /obj/item/flash, /obj/item/reagent_containers/spray/pepper, @@ -122,7 +124,8 @@ /obj/item/clothing/head/helmet/dermal, /obj/item/cartridge/hos, /obj/item/radio/headset/heads/hos, - /obj/item/radio/headset/heads/hos/alt, + /obj/item/radio/headset/alt/heads/hos, + /obj/item/radio/headset/earbud/heads/hos, /obj/item/clothing/glasses/sunglasses/sechud, /obj/item/taperoll/police, /obj/item/shield/riot, @@ -169,7 +172,8 @@ /obj/item/clothing/head/helmet/warden, /obj/item/cartridge/security, /obj/item/radio/headset/headset_sec, - /obj/item/radio/headset/headset_sec/alt, + /obj/item/radio/headset/alt/headset_sec, + /obj/item/radio/headset/earbud/headset_sec, /obj/item/clothing/glasses/sunglasses/sechud, /obj/item/taperoll/police, /obj/item/clothing/accessory/badge/holo/warden, @@ -204,7 +208,8 @@ /obj/item/cartridge/captain, /obj/item/storage/lockbox/medal, /obj/item/radio/headset/heads/captain, - /obj/item/radio/headset/heads/captain/alt, + /obj/item/radio/headset/alt/heads/captain, + /obj/item/radio/headset/earbud/heads/captain, /obj/item/gunbox/captain, /obj/item/melee/telebaton, /obj/item/flash, diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index b920ecd8b7..f010c116e9 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -410,7 +410,7 @@ /obj/item/clothing/under/rank/centcom, /obj/item/clothing/under/ert, /obj/item/clothing/under/syndicate/combat, - /obj/item/radio/headset/ert/alt, + /obj/item/radio/headset/alt/ert, /obj/item/clothing/glasses/sunglasses, /obj/item/clothing/shoes/boots/swat, /obj/item/clothing/gloves/swat, diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe_vr.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe_vr.dm index 67deb1eec8..7f9956a855 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe_vr.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe_vr.dm @@ -3,13 +3,14 @@ closet_appearance = /decl/closet_appearance/tactical/alt //because ert lockers are red for some dumb reason starts_with = list( /obj/item/clothing/under/ert, - /obj/item/radio/headset/ert/alt, + /obj/item/radio/headset/ert, + /obj/item/radio/headset/alt/ert, /obj/item/clothing/glasses/sunglasses, /obj/item/clothing/shoes/boots/swat, /obj/item/clothing/gloves/swat, /obj/item/clothing/mask/balaclava/tactical, /obj/item/clothing/mask/balaclava) - + //would you believe mercs have no official locker? well, now they do. basically just a rebranded ERT locker but hey, it's an option. -Killian /obj/structure/closet/wardrobe/merc name = "mercenary equipment" @@ -18,7 +19,9 @@ starts_with = list( /obj/item/clothing/under/tactical, /obj/item/clothing/under/syndicate/combat, - /obj/item/radio/headset/syndicate/alt, + /obj/item/radio/headset/syndicate, + /obj/item/radio/headset/alt/syndicate, + /obj/item/radio/headset/earbud/syndicate, /obj/item/clothing/glasses/sunglasses, /obj/item/clothing/shoes/boots/combat, /obj/item/clothing/gloves/combat, diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index c61f8cd792..95a17a4f71 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -237,7 +237,7 @@ random_species = TRUE /obj/effect/landmark/corpse/miner - corpseradio = /obj/item/radio/headset/headset_cargo + corpseradio = /obj/item/radio/headset/miner corpseuniform = /obj/item/clothing/under/rank/miner corpsegloves = /obj/item/clothing/gloves/black corpseback = /obj/item/storage/backpack/industrial diff --git a/code/modules/client/preference_setup/general/04_equipment.dm b/code/modules/client/preference_setup/general/04_equipment.dm index 14c56354f9..b76ff9ee38 100644 --- a/code/modules/client/preference_setup/general/04_equipment.dm +++ b/code/modules/client/preference_setup/general/04_equipment.dm @@ -11,6 +11,7 @@ pref.all_underwear_metadata = check_list_copy(save_data["all_underwear_metadata"]) for(var/i in pref.all_underwear_metadata) pref.all_underwear_metadata[i] = path2text_list(pref.all_underwear_metadata[i]) + pref.headset = save_data["headset"] pref.backbag = save_data["backbag"] pref.pdachoice = save_data["pdachoice"] pref.communicator_visibility = save_data["communicator_visibility"] @@ -23,6 +24,7 @@ for(var/i in pref.all_underwear_metadata) underwear[i] = check_list_copy(pref.all_underwear_metadata[i]) save_data["all_underwear_metadata"] = underwear + save_data["headset"] = pref.headset save_data["backbag"] = pref.backbag save_data["pdachoice"] = pref.pdachoice save_data["communicator_visibility"] = pref.communicator_visibility @@ -72,6 +74,10 @@ var/global/list/valid_ringtones = list( pref.all_underwear -= underwear_category_name // TODO - Looks like this is duplicating the work of sanitize_character() if so, remove + if(pref.headset > GLOB.headsetlist.len || pref.headset < 1) + pref.headset = 1 //Same as above + character.headset = pref.headset + if(pref.backbag > backbaglist.len || pref.backbag < 1) pref.backbag = 2 //Same as above character.backbag = pref.backbag @@ -107,6 +113,7 @@ var/global/list/valid_ringtones = list( for(var/underwear_metadata in pref.all_underwear_metadata) if(!(underwear_metadata in pref.all_underwear)) pref.all_underwear_metadata -= underwear_metadata + pref.headset = sanitize_integer(pref.headset, 1, GLOB.headsetlist.len, initial(pref.headset)) pref.backbag = sanitize_integer(pref.backbag, 1, backbaglist.len, initial(pref.backbag)) pref.pdachoice = sanitize_integer(pref.pdachoice, 1, pdachoicelist.len, initial(pref.pdachoice)) pref.ringtone = sanitize(pref.ringtone, 20) @@ -123,6 +130,7 @@ var/global/list/valid_ringtones = list( . += " [gt.get_contents(get_metadata(UWC.name, gt))]" . += "
    " + . += "Headset Type: [GLOB.headsetlist[pref.headset]]
    " . += "Backpack Type: [backbaglist[pref.backbag]]
    " . += "PDA Type: [pdachoicelist[pref.pdachoice]]
    " . += "Communicator Visibility: [(pref.communicator_visibility) ? "Yes" : "No"]
    " @@ -149,6 +157,12 @@ var/global/list/valid_ringtones = list( /datum/category_item/player_setup_item/general/equipment/OnTopic(var/href,var/list/href_list, var/mob/user) + if(href_list["change_headset"]) + var/new_headset = tgui_input_list(user, "Choose your character's style of headset:", "Character Preference", GLOB.headsetlist, GLOB.headsetlist[pref.headset]) + if(!isnull(new_headset) && CanUseTopic(user)) + pref.headset = GLOB.headsetlist.Find(new_headset) + return TOPIC_REFRESH_UPDATE_PREVIEW + if(href_list["change_backpack"]) var/new_backbag = tgui_input_list(user, "Choose your character's style of bag:", "Character Preference", backbaglist, backbaglist[pref.backbag]) if(!isnull(new_backbag) && CanUseTopic(user)) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index a6fbe93881..31899796a2 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -47,6 +47,7 @@ var/list/preferences_datums = list() var/spawnpoint = "Arrivals Shuttle" //where this character will spawn (0-2). var/b_type = "A+" //blood type (not-chooseable) var/blood_reagents = "default" //blood restoration reagents + var/headset = 1 //headset type var/backbag = 2 //backpack type var/pdachoice = 1 //PDA type var/shoe_hater = FALSE //RS ADD - if true, will spawn with no shoes diff --git a/code/modules/economy/vending_machines.dm b/code/modules/economy/vending_machines.dm index 7942381c9d..052cab2a26 100644 --- a/code/modules/economy/vending_machines.dm +++ b/code/modules/economy/vending_machines.dm @@ -1615,7 +1615,7 @@ /obj/item/clothing/head/soft/purple = 5, /obj/item/clothing/head/beret/purple = 5, /obj/item/clothing/head/headband/maid = 5, - /obj/item/radio/headset/headset_service = 5, + /obj/item/radio/headset/service = 5, /obj/item/clothing/under/rank/janitor = 5, /obj/item/clothing/under/dress/maid/janitor = 5, /obj/item/clothing/suit/storage/hooded/wintercoat/janitor = 5, diff --git a/code/modules/economy/vending_machines_vr.dm b/code/modules/economy/vending_machines_vr.dm index 41e3645f00..fa8331cc34 100644 --- a/code/modules/economy/vending_machines_vr.dm +++ b/code/modules/economy/vending_machines_vr.dm @@ -343,7 +343,7 @@ /obj/item/storage/box/syndie_kit/chameleon = 1, /obj/item/clothing/mask/bandana = 1, /obj/item/clothing/glasses/sunglasses = 1, - /obj/item/radio/headset/syndicate/alt = 1, + /obj/item/radio/headset/syndicate = 1, /obj/item/pda = 1, /obj/item/communicator = 1, /obj/item/tape_roll = 2, diff --git a/code/modules/mob/living/carbon/human/ai_controlled/ai_controlled.dm b/code/modules/mob/living/carbon/human/ai_controlled/ai_controlled.dm index 7beb027663..82243467c8 100644 --- a/code/modules/mob/living/carbon/human/ai_controlled/ai_controlled.dm +++ b/code/modules/mob/living/carbon/human/ai_controlled/ai_controlled.dm @@ -126,7 +126,7 @@ to_wear_helmet = /obj/item/clothing/head/helmet/dermal to_wear_glasses = /obj/item/clothing/glasses/goggles to_wear_mask = /obj/item/clothing/mask/gas/half - to_wear_l_radio = /obj/item/radio/headset/headset_rob + to_wear_l_radio = /obj/item/radio/headset to_wear_r_radio = null to_wear_uniform = /obj/item/clothing/under/color/grey to_wear_suit = /obj/item/clothing/suit/armor/vest diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index d182593d1f..8dca9ab08f 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -54,6 +54,7 @@ var/list/all_underwear = list() var/list/all_underwear_metadata = list() var/list/hide_underwear = list() + var/headset = 1 //Which headset type the player has chosen. var/backbag = 2 //Which backpack type the player has chosen. var/pdachoice = 1 //Which PDA type the player has chosen. diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index 54a5f2cf29..b2a03e9cf9 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -29,6 +29,7 @@ all_underwear[WRC.name] = WRI.name + headset = rand(1,3) backbag = rand(1,6) pdachoice = rand(1,7) age = rand(current_species.min_age, current_species.max_age) diff --git a/icons/inventory/ears/mob.dmi b/icons/inventory/ears/mob.dmi index 95ec0e9c8a954c4865e18051e65bb2de6ecf3540..016c3d081d25304cbc40cf231e4847ae0f734bcf 100644 GIT binary patch literal 19037 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 IRqL1k3-yi@_W%F@ literal 19096 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 diff --git a/icons/inventory/ears/mob_teshari.dmi b/icons/inventory/ears/mob_teshari.dmi index d41f5d871f28ee1c3acce50994b548f47721ebf0..69b6b42b0bc36f69546ca7e7fb3bfa3b5041e22d 100644 GIT binary patch literal 2750 zcma)7cTm&W8vVgq0Clk-0!mXbvVaLiK!k)Y5ed>3R1idIQW7ZwK?%F;%0|Jgv`CTY zf*_~_q(lNFKqwD2AfZGlB9JIWKp`Q7l;6Ymhi`m;y>I5u{k}72=ALuz%)R(CsFOPs z)D!>!*nxC*@Bjdr2j7<5PaDYSjD5t$HhJc>mt$*dYh+}kySsb6x~u>qi{C5bBq#S; zTQ-N@0D(X<6%;P++=<8I;c)nc-Mg!+tBs6|Iw1gWNFAI6?>+9Q)53KbA_&8uP=B_vZ`T6+`cSrB4)NDX9aULj7z~*X8g5FC3cCL9wNj*bR^#G*&Jw$Ti&osR5Py{DHWyj_Fz#^XG7E1!o|rD9aJD{R?@ z@tdH1I9gPRWISFDu^|w^d+5B*QK*rNGwq5%=ZxK+O`H{GUi2@$F%l4$Pf)eiU|p zh;6@7&iwLRzT*`Wt*2S%_!vUpA786XYD%6&HR_@DGae{K_o3!uuMp(D38L*(ZI$<# z1xT$5Qh%GgF3#BS7W%hIUPaXQUReDRTK3DtqOBD&p|YmYTSK8oG~g$c(5{&SV4~|t z$8YKVO?xAh8*0&4%oEBc5~6>7=0<^ebJqv!A9TM6k82tid3F{=CYXa&b>@YsEiIM& zS>+QqEBy%bp=_qX);F{K<)tgGFFKADhbtclb*6U6Y>4@9sXd%nB7>L-+F~?J#bU^O z>=`eDDUF(^Hl^_*kaWLsI)h)&o^E}Xl8*%vSma;$Z-k_` z!V=-ytwZfqi}QTV_s6|Zsa}fr!HNQerKROBYy>WqD4pMt)gD|;Hh`+iO}p@qCw*OQ zsID9JBX+Tem&yWOO_Ti|?gOchLlwWU5IFlIG+JkHbt0A9hZb6M0s|MJLr}ah=Q4$D z;`NAXN^3}o6U;2WTuaEi08U~59vayClw_AH3PsCxvWa~z(wp9iDK1OeMD*2lsmBde zZ#fTJR_R6Tg7)M13f3etOtNCWNyH|>FE6lR0(QWJE=qEu)QfNpA9WfWd8&DVJ16I| zf!t7U9cn;}eHFo&96WJd)ql6Qo8Vu_h$x<)3Wz_+m4;QTf36`=gSImcA z)*8mi7*uHJgE@WoK2E+XocVfnwN~uk{3WI4v4}arQIO~l-dKe;M=43q1%SF61dOTL z(PHn(%6z8xuYy8)kJ38S&}uY*?4v^W0^3KOq--_OlT44H`9&eIeXa9R>O14M_4R%B z|0E5Ucd^Nn3%g7Fw&@RTn}$NiUx&C%fH0!~yA1wkpDiLbdEM}kSoghVxZzVl{c{w) zWVs?)LRR%jt1B22U5PF4aL;W~7lWm#`cVsr$TXap`&>yQQ_=Yp8N)A;6Ef6%g5g$C zwsszG)z=9J?er*p=I~2nzuWKp9=h(|^l*!1bEdL2F3p>z@JGRl`MvX;fV$g>QylcI z6r;UMcttY&nu)3Dl-*Wq;fFE`}M&!~=l-3oilt84Y{-ds6r2FHB+o4(hKRo0XdVQSUQI%V0* z2fN-Olvi;gC9jJAtl~{I#^M+=p3^${_vW&DU)5Z_Zd7>j{fD9XJ2l{7_JoE@p~c@P zaZ*ujs>INV6z4YhXZ9i|m-oTEOHZZO43>Nh`M!XXXrMlg;`EbL30HlTOCkhc-dtZj z-Qq&e2p<3ZsjEDQm^Z*=_%^4sxX7RX>yl27p2_7hMA}%lMgrHCvr;#1bvo@LCW-ez zLWbYAo`E%V@?ePX>c2Iq%J}=ZhxA7HY_l1}z;6ZWAq{Demkhl>9M1{J>Jcf2$Ems{{S67T>j%RR{Qr{zeZYv_?IC@%!fFOa zjlkVaxX}+D!*b}5)kqb)E7k$wpC)B$yW9oMMQJt}qz{HRy$Ot~&xr_j76<Zw&U_u=dLPl)twJY>w={v35v8m9_m*d1tyffa2Fq#A-7oee z@h-f%G-kR^cfsY5A>G71mo4NQphq(x_q@^z-}N55P&x*^`qwRCc-^Hc^p9cyAkewY xH%f;ITDml2yxhi4uoO^Cm-k&Y;bD!ahn{|&ugT<8D* literal 2642 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 literal 24928 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 diff --git a/maps/cynosure/cynosure-6.dmm b/maps/cynosure/cynosure-6.dmm index 56fe694d8c..95ac6376a5 100644 --- a/maps/cynosure/cynosure-6.dmm +++ b/maps/cynosure/cynosure-6.dmm @@ -10652,10 +10652,10 @@ /area/beach) "lQh" = ( /obj/structure/table/standard, -/obj/item/radio/headset/syndicate/alt, -/obj/item/radio/headset/syndicate/alt, -/obj/item/radio/headset/syndicate/alt, -/obj/item/radio/headset/syndicate/alt, +/obj/item/radio/headset/alt/syndicate, +/obj/item/radio/headset/alt/syndicate, +/obj/item/radio/headset/alt/syndicate, +/obj/item/radio/headset/alt/syndicate, /turf/unsimulated/floor{ icon_state = "lino" }, diff --git a/maps/submaps/admin_use_vr/kk_mercship.dmm b/maps/submaps/admin_use_vr/kk_mercship.dmm index 79a61b4b31..899fd7f736 100644 --- a/maps/submaps/admin_use_vr/kk_mercship.dmm +++ b/maps/submaps/admin_use_vr/kk_mercship.dmm @@ -6594,10 +6594,10 @@ /obj/item/radio/headset/syndicate, /obj/item/radio/headset/syndicate, /obj/item/radio/headset/syndicate, -/obj/item/radio/headset/syndicate/alt, -/obj/item/radio/headset/syndicate/alt, -/obj/item/radio/headset/syndicate/alt, -/obj/item/radio/headset/syndicate/alt, +/obj/item/radio/headset/alt/syndicate, +/obj/item/radio/headset/alt/syndicate, +/obj/item/radio/headset/alt/syndicate, +/obj/item/radio/headset/alt/syndicate, /obj/effect/floor_decal/techfloor{ dir = 10 }, diff --git a/maps/submaps/depreciated_vr/mercbase.dmm b/maps/submaps/depreciated_vr/mercbase.dmm index 097b6bf8a4..ca3b40f71b 100644 --- a/maps/submaps/depreciated_vr/mercbase.dmm +++ b/maps/submaps/depreciated_vr/mercbase.dmm @@ -419,10 +419,10 @@ /obj/item/radio/headset/syndicate, /obj/item/radio/headset/syndicate, /obj/item/radio/headset/syndicate, -/obj/item/radio/headset/syndicate/alt, -/obj/item/radio/headset/syndicate/alt, -/obj/item/radio/headset/syndicate/alt, -/obj/item/radio/headset/syndicate/alt, +/obj/item/radio/headset/alt/syndicate, +/obj/item/radio/headset/alt/syndicate, +/obj/item/radio/headset/alt/syndicate, +/obj/item/radio/headset/alt/syndicate, /turf/unsimulated/floor{ icon_state = "lino" }, diff --git a/vorestation.dme b/vorestation.dme index efa6a21a29..b16e5b01f8 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -1356,7 +1356,6 @@ #include "code\game\objects\items\devices\radio\encryptionkey.dm" #include "code\game\objects\items\devices\radio\encryptionkey_vr.dm" #include "code\game\objects\items\devices\radio\headset.dm" -#include "code\game\objects\items\devices\radio\headset_vr.dm" #include "code\game\objects\items\devices\radio\intercom.dm" #include "code\game\objects\items\devices\radio\jammer.dm" #include "code\game\objects\items\devices\radio\jammer_vr.dm" From caa6f83e14d8129de80f45906fe89acce7f7e330 Mon Sep 17 00:00:00 2001 From: Kashargul <144968721+Kashargul@users.noreply.github.com> Date: Wed, 6 Nov 2024 22:07:54 +0100 Subject: [PATCH 23/36] fixes an invisibility exploit (#16573) --- code/modules/vehicles/rover_vr.dm | 7 +++++-- code/modules/vehicles/vehicle.dm | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/code/modules/vehicles/rover_vr.dm b/code/modules/vehicles/rover_vr.dm index 12094f58c6..9ad03c25bf 100644 --- a/code/modules/vehicles/rover_vr.dm +++ b/code/modules/vehicles/rover_vr.dm @@ -292,12 +292,15 @@ if(!istype(C, /mob/living/carbon/human)) return 0 + . = ..(C) + + if(!.) + return + if(ismob(C)) buckle_mob(C) C.alpha = 0 - return ..() - /obj/vehicle/train/rover/engine/unload(var/mob/user, var/direction) var/mob/living/carbon/human/C = load diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm index 97e9dfa746..963faa32f8 100644 --- a/code/modules/vehicles/vehicle.dm +++ b/code/modules/vehicles/vehicle.dm @@ -340,7 +340,7 @@ C.pixel_y += load_offset_y C.layer = layer + 0.1 - if(ismob(C)) + if(ismob(C) && user) user_buckle_mob(C, user) return 1 From 7175a48c8dea532cdea8a00b0e04db34c19a4bb8 Mon Sep 17 00:00:00 2001 From: Guti <32563288+TheCaramelion@users.noreply.github.com> Date: Sat, 9 Nov 2024 01:18:07 +0100 Subject: [PATCH 24/36] Virology Patch 1 (#16581) * Update * Small oopsies --- .../effects/decals/Cleanable/humans.dm | 19 +++++++++++++++++++ .../objects/items/devices/scanners/health.dm | 2 +- code/modules/reagents/reagents/virology.dm | 12 ++++++------ 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 84b47051aa..184bee8bed 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -112,6 +112,10 @@ var/global/list/image/splatter_cache=list() var/obj/structure/bed/chair/wheelchair/W = perp.buckled W.bloodiness = 4 + if(viruses) + for(var/datum/disease/D in viruses) + perp.ContractDisease(D) + amount-- /obj/effect/decal/cleanable/blood/proc/dry() @@ -124,6 +128,11 @@ var/global/list/image/splatter_cache=list() ..() if (amount && istype(user)) add_fingerprint(user) + + if(viruses) + for(var/datum/disease/D in viruses) + user.ContractDisease(D) + if (user.gloves) return var/taken = rand(1,amount) @@ -258,4 +267,14 @@ var/global/list/image/splatter_cache=list() viruses.Cut() return ..() +/obj/effect/decal/cleanable/mucus/Crossed(mob/living/carbon/human/perp) + if(viruses) + for(var/datum/disease/D in viruses) + perp.ContractDisease(D) + +/obj/effect/decal/cleanable/vomit/Crossed(mob/living/carbon/human/perp) + if(viruses) + for(var/datum/disease/D in viruses) + perp.ContractDisease(D) + #undef DRYING_TIME diff --git a/code/game/objects/items/devices/scanners/health.dm b/code/game/objects/items/devices/scanners/health.dm index c992702430..348d8b55e6 100644 --- a/code/game/objects/items/devices/scanners/health.dm +++ b/code/game/objects/items/devices/scanners/health.dm @@ -248,7 +248,7 @@ else dat += span_warning("Unknown substance[(unknown > 1)?"s":""] found in subject's dermis.") dat += "
    " - if(C.resistances.len) + if(LAZYLEN(C.resistances)) for (var/datum/disease/virus in C.GetViruses()) if(virus.visibility_flags & HIDDEN_SCANNER || virus.visibility_flags & HIDDEN_PANDEMIC) continue diff --git a/code/modules/reagents/reagents/virology.dm b/code/modules/reagents/reagents/virology.dm index 4556b1ed09..e2147f401d 100644 --- a/code/modules/reagents/reagents/virology.dm +++ b/code/modules/reagents/reagents/virology.dm @@ -20,7 +20,7 @@ /datum/reagent/mutagen/mutagenvirusfood name = "Mutagenic agar" id = "mutagenvirusfood" - description = "mutates blood" + description = "Mutates viruses when mixed in blood. This one seems rather alright." color = "#A3C00F" /datum/reagent/mutagen/mutagenvirusfood/sugar @@ -32,16 +32,16 @@ /datum/reagent/medicine/adranol/adranolvirusfood name = "Virus rations" id = "adranolvirusfood" - description = "mutates blood" + description = "Mutates viruses when mixed in blood. This one seems rather weak." color = "#D18AA5" -/datum/reagent/phoron_dust/phoronvirusfood +/datum/reagent/toxin/phoron/phoronvirusfood name = "Phoronic virus food" id = "phoronvirusfood" - description = "mutates blood" + description = "Mutates viruses when mixed in blood. This one seems to be the strongest." color = "#A69DA9" -/datum/reagent/phoron_dust/phoronvirusfood/weak - name = "Weakened phoronic virus food" +/datum/reagent/toxin/phoron/phoronvirusfood/weak + name = "Weakened phoronic virus food. This one seems to have been weakened, but still strong." id = "weakphoronvirusfood" color = "#CEC3C6" From e784285462348fa73010ec98572715090168331a Mon Sep 17 00:00:00 2001 From: SatinIsle <98125273+SatinIsle@users.noreply.github.com> Date: Sat, 9 Nov 2024 01:00:05 +0000 Subject: [PATCH 25/36] Fixed virology themed redgate maps (#16577) * Fixed virology themed redgate maps Added 4 new props based on the old virology machines for decoration. Fixed the missing virology equipment in the city and facility redgate maps. * Update facility.dmm --- .../game/objects/structures/props/machines.dm | 108 ++++++++++++++++-- maps/redgate/cybercity.dmm | 28 +++-- maps/redgate/facility.dmm | 28 +---- 3 files changed, 121 insertions(+), 43 deletions(-) diff --git a/code/game/objects/structures/props/machines.dm b/code/game/objects/structures/props/machines.dm index 9e9e0d7714..a7aa684edf 100644 --- a/code/game/objects/structures/props/machines.dm +++ b/code/game/objects/structures/props/machines.dm @@ -556,9 +556,9 @@ * This one is a bit more fancy than others. Anything in the contents (PLEASE LIMIT TO ONE THING) * will show up inside it! Also if you map in an item on it, it will grab that at mapload and start * in the 'closed, full of fluid' state, so you can put a body on it or whatever. - * + * * As an aghost you can also dragdrop something into it (you have to be ghosted next to it) - * + * * Possible 'state' options for change_state(state) are: * open: Open, no fluid or anything. At the end the contents are ejected. * closed: Closed, full of liquid @@ -582,7 +582,7 @@ /obj/structure/prop/machine/nt_pod/Initialize(mapload) // Our non-map-preview state icon_state = "nt_pod" - + // Alpha mask to make sure things don't sneak out var/obj/effect/overlay/vis/mask = new mask.icon = icon @@ -607,7 +607,7 @@ // Save old settings contents_vis_flags = AM.vis_flags contents_original_pixel_y = AM.pixel_y - + // Arrange AM.add_filter("podmask", 1, alpha_mask_filter(render_source = "nt_podmask[REF(src)]", flags = MASK_INVERSE)) AM.pixel_y = 12 @@ -616,7 +616,7 @@ if(ismob(AM)) var/mob/M = AM buckle_mob(M, TRUE, FALSE) - + // TRAP THEM change_state("closed") @@ -639,7 +639,7 @@ return if(!user.client?.holder) return - + AM.forceMove(src) /obj/structure/prop/machine/nt_pod/change_state(state) @@ -648,17 +648,17 @@ if("open") cut_overlay("nt_pod_top_on") cut_overlay("nt_pod_under") - + // Fluid drains fluid.icon_state = "nothing" flick("nt_pod_emptying", fluid) // 8ds sleep(8) - + // Door opens door.icon_state = "nothing" flick("nt_pod_opening", door) // 9ds sleep(9) - + // GET OUT outside.layer = BELOW_MOB_LAYER if(contents.len) @@ -670,7 +670,7 @@ cut_overlay("nt_pod_top_on") add_overlay("nt_pod_top_on") add_overlay("nt_pod_under") - + // Door closes door.icon_state = "nt_pod_glass" flick("nt_pod_closing", door) // 9ds @@ -683,4 +683,90 @@ cut_overlay("nt_pod_panel") add_overlay("nt_pod_panel") if("panel_closed") - cut_overlay("nt_pod_panel") \ No newline at end of file + cut_overlay("nt_pod_panel") + +// Old Virology stuff + +/obj/structure/prop/machine/centrifuge + name = "centrifuge" + desc = "Used to separate things with different weight. Spin 'em round, round, right round." + icon = 'icons/obj/virology_vr.dmi' + icon_state = "centrifuge" + var/on = FALSE + +/obj/structure/prop/machine/centrifuge/attack_hand(mob/user as mob) + ..() + + if(!on) + on = TRUE + user.visible_message("\The [user] turns on \the [src].") + icon_state = "centrifuge_moving" + else + on = FALSE + user.visible_message("\The [user] turns off \the [src].") + icon_state = "centrifuge" + + update_icon() + +/obj/structure/prop/machine/incubator + name = "incubator" + desc = "Encourages the growth of diseases. This model comes with a dispenser system and a small radiation generator." + icon = 'icons/obj/virology_vr.dmi' + icon_state = "incubator" + var/on = FALSE + +/obj/structure/prop/machine/incubator/attack_hand(mob/user as mob) + ..() + + if(!on) + on = TRUE + user.visible_message("\The [user] turns on \the [src].") + icon_state = "incubator_on" + else + on = FALSE + user.visible_message("\The [user] turns off \the [src].") + icon_state = "incubator" + + update_icon() + +/obj/structure/prop/machine/disease_analyser + name = "disease analyser" + desc = "Analyzes diseases to find out information about them!" + icon = 'icons/obj/virology_vr.dmi' + icon_state = "analyser" + var/on = FALSE + +/obj/structure/prop/machine/disease_analyser/attack_hand(mob/user as mob) + ..() + + if(!on) + on = TRUE + user.visible_message("\The [user] turns on \the [src].") + icon_state = "analyser_" + else + on = FALSE + user.visible_message("\The [user] turns off \the [src].") + icon_state = "analyser" + + update_icon() + +/obj/structure/prop/machine/isolator + name = "disease isolator" + desc = "Used to isolate and identify diseases, allowing for comparison with a remote database." + icon = 'icons/obj/virology_vr.dmi' + icon_state = "isolator_in" + var/on = FALSE + +/obj/structure/prop/machine/isolator/attack_hand(mob/user as mob) + ..() + + if(!on) + on = TRUE + user.visible_message("\The [user] turns on \the [src].") + icon_state = "isolator_" + else + on = FALSE + user.visible_message("\The [user] turns off \the [src].") + icon_state = "isolator_in" + + update_icon() diff --git a/maps/redgate/cybercity.dmm b/maps/redgate/cybercity.dmm index b6ee042216..8c1f1046b0 100644 --- a/maps/redgate/cybercity.dmm +++ b/maps/redgate/cybercity.dmm @@ -3641,10 +3641,8 @@ /turf/simulated/floor/water/digestive_enzymes, /area/redgate/city/waterworks) "eSM" = ( -/obj/machinery/disease2/incubator, -/obj/machinery/light{ - dir = 1 - }, +/obj/structure/table/standard, +/obj/item/book/manual/virology, /turf/simulated/floor/tiled/white, /area/redgate/city/science) "eTR" = ( @@ -11034,6 +11032,13 @@ /obj/structure/undies_wardrobe, /turf/simulated/floor/tiled/freezer, /area/redgate/city/laundry) +"ozN" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/prop/machine/disease_analyser, +/turf/simulated/floor/tiled/white, +/area/redgate/city/science) "ozW" = ( /obj/machinery/light{ dir = 1 @@ -14361,8 +14366,8 @@ /turf/simulated/floor/tiled/neutral, /area/redgate/city/house10) "sLw" = ( -/obj/machinery/computer/centrifuge, /obj/machinery/light, +/obj/machinery/computer/pandemic, /turf/simulated/floor/tiled/white, /area/redgate/city/science) "sLB" = ( @@ -17015,7 +17020,7 @@ /turf/simulated/floor/tiled/eris/dark/gray_platform, /area/redgate/city/engine) "wgN" = ( -/obj/machinery/disease2/diseaseanalyser, +/obj/structure/prop/machine/centrifuge, /turf/simulated/floor/tiled/white, /area/redgate/city/science) "wgO" = ( @@ -17388,7 +17393,10 @@ /turf/simulated/floor/tiled/steel_dirty, /area/redgate/city/dodgypharmacy) "wIw" = ( -/obj/machinery/computer/diseasesplicer, +/obj/structure/reagent_dispensers/virusfood{ + pixel_y = 29 + }, +/obj/structure/prop/machine/incubator, /turf/simulated/floor/tiled/white, /area/redgate/city/science) "wIy" = ( @@ -23051,10 +23059,10 @@ lyJ jNE kfL rdM +ozN +fpI +fpI eSM -fpI -fpI -uEa rdM btI kWt diff --git a/maps/redgate/facility.dmm b/maps/redgate/facility.dmm index bff1c55fc6..5c0259ff98 100644 --- a/maps/redgate/facility.dmm +++ b/maps/redgate/facility.dmm @@ -3246,10 +3246,6 @@ /obj/item/bone, /turf/simulated/floor/grass, /area/redgate/facility/cell27) -"eFo" = ( -/obj/machinery/computer/centrifuge, -/turf/simulated/floor/tiled/white, -/area/redgate/facility/cell20) "eGK" = ( /turf/simulated/wall/tgmc/whitewall, /area/redgate/facility/cell27) @@ -4471,7 +4467,7 @@ /turf/simulated/floor/tiled/white, /area/redgate/facility/cell2) "gmR" = ( -/obj/machinery/computer/centrifuge, +/obj/structure/prop/machine/disease_analyser, /turf/simulated/floor/tiled/white, /area/redgate/facility/sw) "gmU" = ( @@ -4913,13 +4909,6 @@ /obj/random/forgotten_tram, /turf/simulated/floor/tiled/white, /area/redgate/facility/nw) -"gQm" = ( -/obj/machinery/disease2/isolator, -/obj/machinery/light{ - dir = 1 - }, -/turf/simulated/floor/tiled/white, -/area/redgate/facility/sw) "gQy" = ( /obj/effect/floor_decal/corner/black/border{ dir = 4 @@ -11648,7 +11637,7 @@ /turf/simulated/floor/tiled/white, /area/redgate/facility/cell15) "qsU" = ( -/obj/machinery/disease2/diseaseanalyser, +/obj/structure/prop/machine/centrifuge, /turf/simulated/floor/tiled/white, /area/redgate/facility/sw) "qtt" = ( @@ -11908,7 +11897,7 @@ /turf/simulated/floor/tiled/techfloor, /area/redgate/facility/cell9) "qMo" = ( -/obj/machinery/disease2/incubator, +/obj/structure/closet/l3closet/virology, /turf/simulated/floor/tiled/white, /area/redgate/facility/sw) "qNh" = ( @@ -11950,10 +11939,10 @@ /turf/simulated/floor/tiled/white, /area/redgate/facility/sw) "qQL" = ( -/obj/machinery/computer/diseasesplicer, /obj/machinery/light{ dir = 1 }, +/obj/machinery/computer/pandemic, /turf/simulated/floor/tiled/white, /area/redgate/facility/sw) "qQY" = ( @@ -14775,12 +14764,7 @@ "uMq" = ( /obj/structure/closet/walllocker_double/science/east, /obj/item/book/manual/virology, -/obj/item/antibody_scanner, -/obj/item/antibody_scanner, /obj/item/reagent_containers/glass/beaker, -/obj/item/virusdish/random, -/obj/item/virusdish/random, -/obj/item/virusdish/random, /turf/simulated/floor/tiled/white, /area/redgate/facility/sw) "uNl" = ( @@ -19788,7 +19772,7 @@ pLg fPE mzU aOv -gQm +xRG vrp oWf aOv @@ -30193,7 +30177,7 @@ aKz ehw lnw sCO -eFo +ehw hgj hgj hgj From 887700472d53dd5adaa2c2171a50b2d09c21f2bc Mon Sep 17 00:00:00 2001 From: Killian <49700375+KillianKirilenko@users.noreply.github.com> Date: Sat, 9 Nov 2024 01:00:52 +0000 Subject: [PATCH 26/36] Syndicate Headset Icons (#16578) * Update headset.dm * syndie headset fixes * Update radio_vr.dmi --- .../objects/items/devices/radio/headset.dm | 4 ++++ icons/inventory/ears/mob.dmi | Bin 19037 -> 18939 bytes icons/obj/radio_vr.dmi | Bin 25687 -> 25507 bytes 3 files changed, 4 insertions(+) diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 24728cee21..ead212defa 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -572,21 +572,25 @@ /obj/item/radio/headset/syndicate origin_tech = list(TECH_ILLEGAL = 3) + icon_state = "syndie_headset" syndie = 1 ks1type = /obj/item/encryptionkey/syndicate /obj/item/radio/headset/alt/syndicate origin_tech = list(TECH_ILLEGAL = 3) + icon_state = "syndie_headset_alt" syndie = 1 ks1type = /obj/item/encryptionkey/syndicate /obj/item/radio/headset/earbud/syndicate origin_tech = list(TECH_ILLEGAL = 3) + icon_state = "syndie_earbud" syndie = 1 ks1type = /obj/item/encryptionkey/syndicate /obj/item/radio/headset/raider origin_tech = list(TECH_ILLEGAL = 2) + icon_state = "syndie_headset" syndie = 1 ks1type = /obj/item/encryptionkey/raider diff --git a/icons/inventory/ears/mob.dmi b/icons/inventory/ears/mob.dmi index 016c3d081d25304cbc40cf231e4847ae0f734bcf..6071bf0efaa96eabd2443081e5bf80d93d08aea9 100644 GIT binary patch literal 18939 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 HY~K7IoQic| literal 19037 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 IRqL1k3-yi@_W%F@ diff --git a/icons/obj/radio_vr.dmi b/icons/obj/radio_vr.dmi index a4e69892f607b704f2f88f71ec0a637aeaa8a160..482f9c09f03932a9108b9dfca2f10fe8a8c76f8b 100644 GIT binary patch literal 25507 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 From 25da9801238e92fbe944ed673f5d971807803ecc Mon Sep 17 00:00:00 2001 From: Kashargul <144968721+Kashargul@users.noreply.github.com> Date: Sat, 9 Nov 2024 02:29:12 +0100 Subject: [PATCH 27/36] we really don't need initialize here (#16583) --- code/modules/economy/vending_machines.dm | 42 ++++++++++++++++----- code/modules/economy/vending_machines_vr.dm | 38 ------------------- 2 files changed, 32 insertions(+), 48 deletions(-) diff --git a/code/modules/economy/vending_machines.dm b/code/modules/economy/vending_machines.dm index 052cab2a26..4663e9bb54 100644 --- a/code/modules/economy/vending_machines.dm +++ b/code/modules/economy/vending_machines.dm @@ -415,7 +415,12 @@ /obj/item/stack/medical/advanced/ointment = 6, /obj/item/stack/medical/splint = 4, /obj/item/storage/pill_bottle/carbon = 2, - /obj/item/clothing/mask/chewable/candy/lolli = 15) + /obj/item/clothing/mask/chewable/candy/lolli = 15, + /obj/item/storage/box/khcrystal = 4, + /obj/item/backup_implanter = 3, + /obj/item/clothing/glasses/omnihud/med = 4, + /obj/item/glasses_kit = 1, + /obj/item/storage/quickdraw/syringe_case = 4) contraband = list(/obj/item/reagent_containers/pill/tox = 3, /obj/item/reagent_containers/pill/stox = 4, /obj/item/reagent_containers/pill/antitox = 6) @@ -448,7 +453,8 @@ products = list(/obj/item/stack/medical/bruise_pack = 2, /obj/item/stack/medical/ointment = 2, /obj/item/reagent_containers/hypospray/autoinjector = 4, - /obj/item/healthanalyzer = 1) + /obj/item/healthanalyzer = 1, + /obj/item/bodybag/cryobag = 2) contraband = list(/obj/item/reagent_containers/syringe/antitoxin = 4, /obj/item/reagent_containers/syringe/antiviral = 4, /obj/item/reagent_containers/pill/tox = 1) @@ -467,14 +473,19 @@ /obj/item/reagent_containers/syringe/antitoxin = 3, /obj/item/stack/medical/bruise_pack = 3, /obj/item/stack/medical/ointment =3, - /obj/item/healthanalyzer = 3) + /obj/item/healthanalyzer = 3, + /obj/item/bodybag/cryobag = 3) contraband = list(/obj/item/reagent_containers/pill/tox = 3) req_log_access = access_cmo has_logs = 1 can_rotate = 0 /obj/machinery/vending/wallmed1/public - products = list(/obj/item/stack/medical/bruise_pack = 8,/obj/item/stack/medical/ointment = 8,/obj/item/reagent_containers/hypospray/autoinjector = 16,/obj/item/healthanalyzer = 4) + products = list(/obj/item/stack/medical/bruise_pack = 8, + /obj/item/stack/medical/ointment = 8, + /obj/item/reagent_containers/hypospray/autoinjector = 16, + /obj/item/healthanalyzer = 4, + /obj/item/bodybag/cryobag = 4) /obj/machinery/vending/security name = "SecTech" @@ -488,9 +499,15 @@ /obj/item/flash = 5, /obj/item/reagent_containers/food/snacks/donut/plain = 6, /obj/item/reagent_containers/food/snacks/donut/plain/jelly = 6, - /obj/item/storage/box/evidence = 6) + /obj/item/storage/box/evidence = 6, + /obj/item/gun/energy/taser = 8, + /obj/item/gun/energy/stunrevolver = 4, + /obj/item/reagent_containers/spray/pepper = 6, + /obj/item/taperoll/police = 6, + /obj/item/clothing/glasses/omnihud/sec = 6) contraband = list(/obj/item/clothing/glasses/sunglasses = 2, - /obj/item/storage/box/donut = 2) + /obj/item/storage/box/donut = 2, + /obj/item/implanter/compliance = 1) req_log_access = access_armory has_logs = 1 @@ -553,7 +570,9 @@ /obj/item/seeds/pumpkinseed = 3, /obj/item/seeds/cherryseed = 3, /obj/item/seeds/plastiseed = 3, - /obj/item/seeds/riceseed = 3) + /obj/item/seeds/riceseed = 3, + /obj/item/seeds/shrinkshroom = 3, + /obj/item/seeds/megashroom = 3) contraband = list(/obj/item/seeds/amanitamycelium = 2, /obj/item/seeds/glowshroom = 2, /obj/item/seeds/libertymycelium = 2, @@ -652,7 +671,8 @@ /obj/item/flashlight/glowstick/red = 3, /obj/item/flashlight/glowstick/blue = 3, /obj/item/flashlight/glowstick/orange =3, - /obj/item/flashlight/glowstick/yellow = 3) + /obj/item/flashlight/glowstick/yellow = 3, + /obj/item/reagent_containers/spray/windowsealant = 5) contraband = list(/obj/item/weldingtool/hugetank = 2, /obj/item/clothing/gloves/fyellow = 2) premium = list(/obj/item/clothing/gloves/heavy_engineer = 1) //VOREStation Edit - yellow gloves are common in engineering, let's make "premium" actually mean something @@ -695,8 +715,10 @@ /obj/item/circuitboard/body_scanner, /obj/item/circuitboard/medical_kiosk, /obj/item/circuitboard/sleeper, - /obj/item/circuitboard/dna_analyzer) - contraband = list(/obj/item/cell/potato = 3) + /obj/item/circuitboard/dna_analyzer, + /obj/item/clothing/glasses/omnihud/eng = 6) + contraband = list(/obj/item/cell/potato = 3, + /obj/item/rms = 5) premium = list(/obj/item/storage/belt/utility = 3) product_records = list() req_log_access = access_ce diff --git a/code/modules/economy/vending_machines_vr.dm b/code/modules/economy/vending_machines_vr.dm index fa8331cc34..8d0cbff234 100644 --- a/code/modules/economy/vending_machines_vr.dm +++ b/code/modules/economy/vending_machines_vr.dm @@ -1,41 +1,3 @@ -//Tweaked existing vendors -/obj/machinery/vending/hydroseeds/Initialize() - . = ..() - products += list(/obj/item/seeds/shrinkshroom = 3,/obj/item/seeds/megashroom = 3) - -/obj/machinery/vending/security/Initialize() - . = ..() - products += list(/obj/item/gun/energy/taser = 8,/obj/item/gun/energy/stunrevolver = 4, - /obj/item/reagent_containers/spray/pepper = 6,/obj/item/taperoll/police = 6, - /obj/item/clothing/glasses/omnihud/sec = 6) - contraband += list(/obj/item/implanter/compliance = 1) - -/obj/machinery/vending/tool/Initialize() - . = ..() - products += list(/obj/item/reagent_containers/spray/windowsealant = 5) - -/obj/machinery/vending/engivend/Initialize() - . = ..() - products += list(/obj/item/clothing/glasses/omnihud/eng = 6) - contraband += list(/obj/item/rms = 5) - -/obj/machinery/vending/medical/Initialize() - . = ..() - products += list(/obj/item/storage/box/khcrystal = 4,/obj/item/backup_implanter = 3, - /obj/item/clothing/glasses/omnihud/med = 4, /obj/item/glasses_kit = 1, /obj/item/storage/quickdraw/syringe_case = 4) - -/obj/machinery/vending/wallmed1/Initialize() - . = ..() - products += list(/obj/item/bodybag/cryobag = 2) - -/obj/machinery/vending/wallmed2/Initialize() - . = ..() - products += list(/obj/item/bodybag/cryobag = 3) - -/obj/machinery/vending/wallmed1/public/Initialize() - . = ..() - products += list(/obj/item/bodybag/cryobag = 4) - // Food Machines (for event/away maps) //I want this not just as part of the zoo. ;v From dd77c3ff6b0eb7c3ba12ff6fd2db9e10ae967e78 Mon Sep 17 00:00:00 2001 From: Killian <49700375+KillianKirilenko@users.noreply.github.com> Date: Sat, 9 Nov 2024 14:34:44 +0000 Subject: [PATCH 28/36] Contraband Scanner (#16492) * contraband scanner * Update contraband_scanner.dm --- code/game/machinery/contraband_scanner.dm | 67 +++++++++++++++++++++++ vorestation.dme | 1 + 2 files changed, 68 insertions(+) create mode 100644 code/game/machinery/contraband_scanner.dm diff --git a/code/game/machinery/contraband_scanner.dm b/code/game/machinery/contraband_scanner.dm new file mode 100644 index 0000000000..265cad9bd8 --- /dev/null +++ b/code/game/machinery/contraband_scanner.dm @@ -0,0 +1,67 @@ +/obj/machinery/contraband_scanner + name = "contraband scanner" + gender = PLURAL + icon = 'icons/obj/atm_fieldgen.dmi' + icon_state = "arfg_off" + desc = "A simple scanner that analyzes those who pass over it, and sounds an alarm if it detects any items that are programmed into its contraband list." + anchored = TRUE + opacity = FALSE + density = FALSE + power_channel = EQUIP + use_power = USE_POWER_IDLE + idle_power_usage = 10 + active_power_usage = 250 + + var/deep_scan = TRUE //check more than just their hands/pockets? + var/contraband_count = 0 //how many items have we detected? only one actually needs to be found to set off the alarm + var/area_lockdown = TRUE //do we set off the fire alarm for our area when triggered? + var/close_blastdoors = TRUE //close all blast doors in the area when triggered? + var/power_fields = TRUE //do we activate all ARFs when triggered? use w/ impassable fieldgens. requires area_lockdown = TRUE to do anything. + + var/last_trigger //when were we last triggered? combined with the cooldown below for sanity reasons + var/cooldown = 15 SECONDS //minimum time between retriggers, so people can't spam trigger the scanner to be obnoxious + var/auto_cancel = TRUE //automatically cancel alarm states after a delay? same duration as the cooldown for sanity + var/trigger_message = "The contraband scanner has been tripped!" + var/trigger_sound = 'sound/machines/airalarm.ogg' //sound that plays when we're set off + + var/list/contraband = list(/obj/item/melee,/obj/item/gun,/obj/item/material) + +/obj/machinery/contraband_scanner/Crossed(mob/living/M as mob) + if(M.is_incorporeal()) + return + if(isliving(M)) + var/area/A = src.loc.loc + if(last_trigger > world.time - cooldown) + return + for(var/obj/O in M.contents) + if(is_type_in_list(O,contraband)) + contraband_count++ + if(deep_scan) + for(var/obj/O2 in O.contents) //one layer deep is fine for now I think + if(is_type_in_list(O2,contraband)) + contraband_count++ + if(contraband_count && last_trigger < world.time - cooldown) + visible_message(span_danger(trigger_message)) + playsound(src, trigger_sound, 25, 0, 4, volume_channel = VOLUME_CHANNEL_ALARMS) + for(var/obj/machinery/contraband_scanner/CS in A) + CS.last_trigger = world.time //set everyone's trigger time at once, to cut down on spam + CS.contraband_count = 0 //clear all our contraband counts too + if(area_lockdown) + if(close_blastdoors) + for(var/obj/machinery/door/blast/B in A) + if(!B.density) + spawn(0) + B.close() + if(power_fields) + A.arfgs_activate() + if(auto_cancel) + spawn(cooldown) + if(close_blastdoors) + for(var/obj/machinery/door/blast/B in A) + if(B.density) + spawn(0) + B.open() + if(power_fields) + A.arfgs_deactivate() + + ..() diff --git a/vorestation.dme b/vorestation.dme index b16e5b01f8..6edc021168 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -941,6 +941,7 @@ #include "code\game\machinery\cell_charger.dm" #include "code\game\machinery\clawmachine.dm" #include "code\game\machinery\cloning.dm" +#include "code\game\machinery\contraband_scanner.dm" #include "code\game\machinery\cryo.dm" #include "code\game\machinery\cryopod.dm" #include "code\game\machinery\cryopod_vr.dm" From b7d77d7245701dd6fac749260aa6c18f590452af Mon Sep 17 00:00:00 2001 From: SatinIsle <98125273+SatinIsle@users.noreply.github.com> Date: Sat, 9 Nov 2024 14:36:15 +0000 Subject: [PATCH 29/36] Hammers for hurting people (#16569) * Hammers for hurting people Added a new dark variant of the squish hammer that breaks every bone in the targets body and shoots out blood. Unfortunately they will become unsquished when they fall over, but still gets a nice initial squeeze! Added a simple claw hammer weapon that I have plans for in an upcoming event. Strong melee weapon that easily breaks down windows and barricades, but also has a high chance of breaking any bones that it hits. * Just a friendly little warning to my fellow staff :) --- code/game/objects/items/weapons/joke.dm | 22 +++++++++- .../objects/items/weapons/melee/misc_vr.dm | 40 +++++++++++++++++- icons/mob/items/lefthand_melee.dmi | Bin 37304 -> 37501 bytes icons/mob/items/righthand_melee.dmi | Bin 35989 -> 36122 bytes icons/obj/items.dmi | Bin 73998 -> 74655 bytes icons/obj/weapons.dmi | Bin 51342 -> 52897 bytes 6 files changed, 60 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/weapons/joke.dm b/code/game/objects/items/weapons/joke.dm index feba68dbc7..efe530e5f9 100644 --- a/code/game/objects/items/weapons/joke.dm +++ b/code/game/objects/items/weapons/joke.dm @@ -16,4 +16,24 @@ else M.ClearTransform() M.update_transform() - return ..() \ No newline at end of file + return ..() + +// Do not ever just leave this laying about, it will go horribly wrong! +/obj/item/squishhammer/dark + name = "The Dark Short Stacker" + desc = "Wield the power of this weapon with responsibility (God knows you won't)." + icon = 'icons/obj/items.dmi' + icon_state = "dark_hammer" + attack_verb = list("stacked") + force = 0 + throwforce = 0 + +/obj/item/squishhammer/dark/attack(mob/M as mob, mob/user as mob) + ..() + var/mob/living/carbon/human/H = M + if(istype(H)) + for(var/obj/item/organ/external/E in H.organs) + E.fracture() // Oof, ouch, owie + var/turf/T = M.loc + if(isturf(T)) + new /obj/effect/gibspawner/generic(T) diff --git a/code/game/objects/items/weapons/melee/misc_vr.dm b/code/game/objects/items/weapons/melee/misc_vr.dm index 5e9f318aa6..092ec05891 100644 --- a/code/game/objects/items/weapons/melee/misc_vr.dm +++ b/code/game/objects/items/weapons/melee/misc_vr.dm @@ -13,4 +13,42 @@ sharp = TRUE edge = FALSE attack_verb = list("stabbed", "lunged at", "dextrously struck", "sliced", "lacerated", "impaled", "diced", "charioted") - hitsound = 'sound/weapons/bladeslice.ogg' \ No newline at end of file + hitsound = 'sound/weapons/bladeslice.ogg' + +/obj/item/melee/hammer + name = "claw hammer" + desc = "A simple claw hammer for hitting things or people with, and the claw part probably does something too." + icon = 'icons/obj/weapons.dmi' + icon_state = "claw_hammer" + force = 15 + throwforce = 10 + w_class = ITEMSIZE_SMALL + attack_verb = list("smashed", "swung at", "pummelled", "nailed", "crushed", "bonked", "hammered", "cracked") + defend_chance = 0 + +/obj/item/melee/hammer/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone, var/attack_modifier) + if(istype(target,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = target + if(prob(50)) + var/obj/item/organ/external/affecting = H.get_organ(hit_zone) + affecting.fracture() + return ..() + +/obj/item/melee/hammer/afterattack(atom/A as mob|obj|turf|area, mob/user as mob, proximity) + if(!proximity) return + ..() + if(A) + if(istype(A,/obj/structure/window)) + var/obj/structure/window/W = A + if(prob(50)) + W.visible_message(span_warning("\The [W] shatters under the force of the impact!")) + W.shatter() + else if(istype(A,/obj/structure/barricade)) + var/obj/structure/barricade/B = A + if(prob(50)) + B.visible_message(span_warning("\The [B] is broken apart with ease!")) + B.dismantle() + else if(istype(A,/obj/structure/grille)) + if(prob(50)) + A.visible_message(span_warning("\The [A] is smashed open!")) + qdel(A) diff --git a/icons/mob/items/lefthand_melee.dmi b/icons/mob/items/lefthand_melee.dmi index da3401ccedf55a2e960d0c2092f1552edc07f2e4..bc4ea4cdc347d334c42870b25e6a5e4b16b94c75 100644 GIT binary patch delta 14881 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

    OpQVU9%7;oSh(@*b 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 Jm8e+0{y$w8c)tJu From 4c7425865dda071a56520038c36ce3f78ac4a5e6 Mon Sep 17 00:00:00 2001 From: Guti <32563288+TheCaramelion@users.noreply.github.com> Date: Sat, 9 Nov 2024 15:36:45 +0100 Subject: [PATCH 30/36] Fix (#16584) --- code/modules/organs/blood.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index 72b24602f9..3364d33068 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -250,7 +250,7 @@ var/const/CE_STABLE_THRESHOLD = 0.5 B.data["viruses"] = list() for(var/datum/disease/D in GetViruses()) - if(D.spread_flags & SPECIAL || D.spread_flags & NON_CONTAGIOUS) + if(D.spread_flags & SPECIAL) continue B.data["viruses"] |= D.Copy() From 8557359c750c7b8e88d2065156ec4267e7b2e40c Mon Sep 17 00:00:00 2001 From: Kashargul <144968721+Kashargul@users.noreply.github.com> Date: Sat, 9 Nov 2024 15:38:16 +0100 Subject: [PATCH 31/36] refactors chameleon projector (#16582) --- .../objects/items/devices/chameleonproj.dm | 40 +++++++++++-------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index 14cd916ea8..e85308b5dd 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -28,10 +28,10 @@ disrupt() ..() -/obj/item/chameleon/attack_self() - toggle() +/obj/item/chameleon/attack_self(mob/user) + toggle(user) -/obj/item/chameleon/afterattack(atom/target, mob/user , proximity) +/obj/item/chameleon/afterattack(atom/target, mob/user, proximity) if(!proximity) return if(!active_dummy) if(istype(target,/obj/item) && !istype(target, /obj/item/disk/nuclear)) @@ -42,30 +42,32 @@ saved_icon_state = target.icon_state saved_overlays = target.overlays -/obj/item/chameleon/proc/toggle() +/obj/item/chameleon/proc/toggle(mob/user) if(!can_use || !saved_item) return if(active_dummy) eject_all() playsound(src, 'sound/effects/pop.ogg', 100, 1, -6) qdel(active_dummy) active_dummy = null - to_chat(usr, span_notice("You deactivate the [src].")) + to_chat(user, span_notice("You deactivate the [src].")) var/obj/effect/overlay/T = new /obj/effect/overlay(get_turf(src)) T.icon = 'icons/effects/effects.dmi' flick("emppulse",T) - spawn(8) qdel(T) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), T), 0.8 SECONDS, TIMER_DELETE_ME) else playsound(src, 'sound/effects/pop.ogg', 100, 1, -6) var/obj/O = new saved_item(src) if(!O) return - var/obj/effect/dummy/chameleon/C = new /obj/effect/dummy/chameleon(usr.loc) - C.activate(O, usr, saved_icon, saved_icon_state, saved_overlays, src) + if(istype(user.loc, /obj/item/holder)) // This doesn't go well... + return + var/obj/effect/dummy/chameleon/C = new /obj/effect/dummy/chameleon(user.loc) + C.activate(O, user, saved_icon, saved_icon_state, saved_overlays, src) qdel(O) - to_chat(usr, span_notice("You activate the [src].")) + to_chat(user, span_notice("You activate the [src].")) var/obj/effect/overlay/T = new/obj/effect/overlay(get_turf(src)) T.icon = 'icons/effects/effects.dmi' flick("emppulse",T) - spawn(8) qdel(T) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), T), 0.8 SECONDS, TIMER_DELETE_ME) /obj/item/chameleon/proc/disrupt(var/delete_dummy = 1) if(active_dummy) @@ -78,7 +80,10 @@ qdel(active_dummy) active_dummy = null can_use = 0 - spawn(50) can_use = 1 + addtimer(CALLBACK(src, PROC_REF(allow_use)), 5 SECONDS, TIMER_DELETE_ME) + +/obj/item/chameleon/proc/allow_use() + can_use = 1 /obj/item/chameleon/proc/eject_all() for(var/atom/movable/A in active_dummy) @@ -127,6 +132,9 @@ ..() master.disrupt() +/obj/effect/dummy/chameleon/proc/allow_move() + can_move = 1 + /obj/effect/dummy/chameleon/relaymove(var/mob/user, direction) if(istype(loc, /turf/space)) return //No magical space movement! @@ -134,15 +142,15 @@ can_move = 0 switch(user.bodytemperature) if(300 to INFINITY) - spawn(10) can_move = 1 + addtimer(CALLBACK(src, PROC_REF(allow_move)), 1 SECOND, TIMER_DELETE_ME) if(295 to 300) - spawn(13) can_move = 1 + addtimer(CALLBACK(src, PROC_REF(allow_move)), 1.3 SECONDS, TIMER_DELETE_ME) if(280 to 295) - spawn(16) can_move = 1 + addtimer(CALLBACK(src, PROC_REF(allow_move)), 1.6 SECONDS, TIMER_DELETE_ME) if(260 to 280) - spawn(20) can_move = 1 + addtimer(CALLBACK(src, PROC_REF(allow_move)), 2 SECONDS, TIMER_DELETE_ME) else - spawn(25) can_move = 1 + addtimer(CALLBACK(src, PROC_REF(allow_move)), 2.5 SECONDS, TIMER_DELETE_ME) step(src, direction) return From 7117658a33663dad56bc0dd5ee3840a07c833e0f Mon Sep 17 00:00:00 2001 From: Killian <49700375+KillianKirilenko@users.noreply.github.com> Date: Sat, 9 Nov 2024 14:41:06 +0000 Subject: [PATCH 32/36] lockpicks (#16580) --- code/game/objects/items/lockpicks.dm | 54 +++++++++++++++++++ code/game/objects/structures/simple_doors.dm | 3 ++ icons/obj/lockpicks.dmi | Bin 0 -> 725 bytes vorestation.dme | 1 + 4 files changed, 58 insertions(+) create mode 100644 code/game/objects/items/lockpicks.dm create mode 100644 icons/obj/lockpicks.dmi diff --git a/code/game/objects/items/lockpicks.dm b/code/game/objects/items/lockpicks.dm new file mode 100644 index 0000000000..0af583a173 --- /dev/null +++ b/code/game/objects/items/lockpicks.dm @@ -0,0 +1,54 @@ +//For bypassing locked /obj/structure/simple_doors + +/obj/item/lockpick + name = "set of lockpicks" + desc = "A set of picks and tension wrenches, ideal for picking old-style mechanical locks... not that any of those exist on most NT facilities these days. Still, it might be useful elsewhere?" + icon = 'icons/obj/lockpicks.dmi' + icon_state = "lockpicks" + w_class = ITEMSIZE_SMALL + var/pick_type = "simple" + var/pick_time = 10 SECONDS + var/pick_verb = "pick" + +/obj/item/lockpick/afterattack(atom/A, mob/user) + if(!user.IsAdvancedToolUser()) //no lockpicking for monkeys + return + if(istype(A, /obj/structure/simple_door)) + var/obj/structure/simple_door/D = A + if(!D.locked) //you can pick your nose, but you can't pick an unlocked door + to_chat(user, span_notice("\The [D] isn't locked.")) + return + else if(D.lock_type != pick_type) //make sure our types match + to_chat(user, span_warning("\The [src] can't pick \the [D]. Another tool might work?")) + return + else if(!D.can_pick) //make sure we're actually allowed to bypass it at all + to_chat(user, span_warning("\The [D] can't be [pick_verb]ed.")) + return + else //finally, we can assume that they do match + to_chat(user, span_notice("You start to [pick_verb] the lock on \the [D]...")) + playsound(src, D.keysound,100, 1) + if(do_after(user, pick_time * D.lock_difficulty)) + to_chat(user, span_notice("Success!")) + D.locked = FALSE + else if(istype(A,/mob/living/carbon/human)) //you can pick your friends, and you can pick your nose, but you can't pick your friend's nose + var/mob/living/carbon/human/H = A + if(user.zone_sel.selecting == BP_HEAD) + if(H == user) + to_chat(user, span_notice("Your nose isn't locked. If you're feeling stuffy, maybe you should talk to a doctor..?")) + else + user.visible_message(span_notice("[user] tries to [pick_verb] [H]'s nose with \the [src]! They don't seem to be having much success."),span_notice("You try to [pick_verb] [H]'s nose. It doesn't seem to be working.")) + return + +/obj/item/lockpick/pick_gun + name = "pick gun" + desc = "A more sophisticated and automated alternative to traditional lockpicking methods. Contains a dazzling array of tools in a simple-to-use housing: just press the face plate against the lock face and hold the trigger down until it goes click." + icon_state = "pick_gun" + pick_time = 3 SECONDS + +/obj/item/lockpick/mag_sequencer + name = "magnetic sequencer" + desc = "A deceptively simple gadget that brute-forces magnetic locks using a small electromagnet. A predecessor to the cryptographic sequencer, a more complicated device that is considered contraband in most jurisdictions. Not that these aren't illegal either, mind you!" + icon_state = "mag_sequencer" + pick_type = "maglock" + pick_time = 5 SECONDS + pick_verb = "bypass" diff --git a/code/game/objects/structures/simple_doors.dm b/code/game/objects/structures/simple_doors.dm index db06f7fea8..c68d08208b 100644 --- a/code/game/objects/structures/simple_doors.dm +++ b/code/game/objects/structures/simple_doors.dm @@ -18,6 +18,9 @@ var/locked = FALSE //has the door been locked? var/lock_id = null //does the door have an associated key? + var/lock_type = "simple" //string matched to "pick_type" on /obj/item/lockpick + var/can_pick = TRUE //can it be picked/bypassed? + var/lock_difficulty = 1 //multiplier to picking/bypassing time var/keysound = 'sound/items/toolbelt_equip.ogg' /obj/structure/simple_door/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) diff --git a/icons/obj/lockpicks.dmi b/icons/obj/lockpicks.dmi new file mode 100644 index 0000000000000000000000000000000000000000..11880cd0f52a5d2f8b724bb87ecaf39e0ed2cc79 GIT binary patch literal 725 zcmV;`0xJE9P){t^IiBLle1%2QqD&^NdsgH{Id@jGSvdGG@vK!OlT z2r-+_I6e5fAOj&mYKaQd6thK^&9fxy8wA(B1BI7&&LF?f^F{u!T!j@Rhs&@6sX;zU zG?*gh>%3SOPs`Oaw+Bad0wkq?Mj14wcqz))GTepX>MCj8DYU3PjQVhHZgGX!(RwLk zj6DJsXgPx}epdvA#uVP(d4o1?GrhC)Hq+|$alLQgf8!g_SsvHBfL_o*Z$Qfv1{fqfg=t!eQG)OVIYjb zhVc}1qi61wg(LhM`wk-yqS7&@pO~1KxCPsQs-jU<=juN>mc*G3+b@n7gKv(1l|lW( z5oJ)df-TxpQh91*=RF>y7&V5~O!xs&X500000NkvXX Hu0mjfogX<7 literal 0 HcmV?d00001 diff --git a/vorestation.dme b/vorestation.dme index 6edc021168..07be19acdd 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -1292,6 +1292,7 @@ #include "code\game\objects\items\gunbox.dm" #include "code\game\objects\items\gunbox_vr.dm" #include "code\game\objects\items\latexballoon.dm" +#include "code\game\objects\items\lockpicks.dm" #include "code\game\objects\items\magazine.dm" #include "code\game\objects\items\paintkit.dm" #include "code\game\objects\items\pizza_voucher_vr.dm" From 6c8fa2dba105fb597535474050b34db5d520054a Mon Sep 17 00:00:00 2001 From: Kashargul <144968721+Kashargul@users.noreply.github.com> Date: Sat, 9 Nov 2024 15:42:44 +0100 Subject: [PATCH 33/36] maptest redgate (#16579) * maptest redgate * . * . * . * . * . --- code/game/machinery/camera/camera.dm | 4 ++-- .../objects/items/weapons/material/kitchen.dm | 4 ++-- code/modules/power/singularity/singularity.dm | 4 ++-- maps/offmap_vr/common_offmaps.dm | 23 +++++++++++++++++++ maps/redgate/eggnogtown.dmm | 2 +- 5 files changed, 30 insertions(+), 7 deletions(-) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 383a96868b..1f89fdbe98 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -254,19 +254,19 @@ if (!(src.status)) if(user) visible_message(span_notice(" [user] has deactivated [src]!")) + add_hiddenprint(user) else visible_message(span_notice(" [src] clicks and shuts down. ")) playsound(src, 'sound/items/Wirecutter.ogg', 100, 1) icon_state = "[initial(icon_state)]1" - add_hiddenprint(user) else if(user) visible_message(span_notice(" [user] has reactivated [src]!")) + add_hiddenprint(user) else visible_message(span_notice(" [src] clicks and reactivates itself. ")) playsound(src, 'sound/items/Wirecutter.ogg', 100, 1) icon_state = initial(icon_state) - add_hiddenprint(user) /obj/machinery/camera/take_damage(var/force, var/message) //prob(25) gives an average of 3-4 hits diff --git a/code/game/objects/items/weapons/material/kitchen.dm b/code/game/objects/items/weapons/material/kitchen.dm index 43c524b51f..cb5458c936 100644 --- a/code/game/objects/items/weapons/material/kitchen.dm +++ b/code/game/objects/items/weapons/material/kitchen.dm @@ -108,12 +108,12 @@ if(M == user) if(!M.can_eat(loaded)) return - M.visible_message(span_bold("\The [user]") + "eats some of [loaded] with \the [src].") + M.visible_message(span_bold("\The [user]") + " eats some of [loaded] with \the [src].") else user.visible_message(span_warning("\The [user] begins to feed \the [M]!")) if(!(M.can_force_feed(user, loaded) && do_mob(user, M, 5 SECONDS))) return - M.visible_message(span_bold("\The [user]") + "feeds some of [loaded] to \the [M] with \the [src].") + M.visible_message(span_bold("\The [user]") + " feeds some of [loaded] to \the [M] with \the [src].") playsound(src,'sound/items/eatfood.ogg', rand(10,40), 1) loaded = null update_icon() diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index e8ffacc8f5..6d7da776df 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -445,10 +445,10 @@ GLOBAL_LIST_BOILERPLATE(all_singularities, /obj/singularity) /obj/singularity/proc/smwave() for(var/mob/living/M in view(10, src.loc)) if(prob(67)) - to_chat(M, span_warning("You hear an uneartly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat.")) + to_chat(M, span_warning("You hear an unearthly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat.")) to_chat(M, span_notice("Miraculously, it fails to kill you.")) else - to_chat(M, span_danger("You hear an uneartly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat.")) + to_chat(M, span_danger("You hear an unearthly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat.")) to_chat(M, span_danger("You don't even have a moment to react as you are reduced to ashes by the intense radiation.")) M.dust() SSradiation.radiate(src, rand(energy)) diff --git a/maps/offmap_vr/common_offmaps.dm b/maps/offmap_vr/common_offmaps.dm index 2d7bacc46b..b0bac955da 100644 --- a/maps/offmap_vr/common_offmaps.dm +++ b/maps/offmap_vr/common_offmaps.dm @@ -226,6 +226,29 @@ ////////////////////////////////////////////////////////////////////////////////////// +#ifdef AWAY_MISSION_TEST +#include "../redgate/falls/falls.dmm" +#include "../redgate/abandonedisland.dmm" +#include "../redgate/cybercity.dmm" +#include "../redgate/darkadventure.dmm" +#include "../redgate/eggnogtown.dmm" +#include "../redgate/eggnogtownunderground.dmm" +#include "../redgate/facility.dmm" +#include "../redgate/fantasy_dungeon.dmm" +#include "../redgate/fantasy.dmm" +#include "../redgate/hotsprings.dmm" +#include "../redgate/innland.dmm" +#include "../redgate/islands_underwater.dmm" +#include "../redgate/islands.dmm" +#include "../redgate/jungle_underground.dmm" +#include "../redgate/jungle.dmm" +#include "../redgate/laserdome.dmm" +#include "../redgate/stardog.dmm" +#include "../redgate/teppiranch.dmm" +#include "../redgate/train_upper.dmm" +#include "../redgate/train.dmm" +#endif + /datum/map_template/common_lateload/redgate name = "Redgate Submap" desc = "Please do not use this." diff --git a/maps/redgate/eggnogtown.dmm b/maps/redgate/eggnogtown.dmm index 9dc3ed22d0..3771a88096 100644 --- a/maps/redgate/eggnogtown.dmm +++ b/maps/redgate/eggnogtown.dmm @@ -4090,7 +4090,7 @@ "XK" = ( /obj/effect/map_effect/perma_light/gateway{ light_color = "#fc8c03"; - light_power = .5 + light_power = 0.5 }, /turf/simulated/floor/wood, /area/redgate/eggnogtown/bar) From 7106b4a2b9a6d32167f26b7a9f0d176eb7d43acf Mon Sep 17 00:00:00 2001 From: Killian <49700375+KillianKirilenko@users.noreply.github.com> Date: Sat, 9 Nov 2024 14:46:06 +0000 Subject: [PATCH 34/36] choker tweak (#16575) --- .../clothing/under/accessories/accessory_vr.dm | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/code/modules/clothing/under/accessories/accessory_vr.dm b/code/modules/clothing/under/accessories/accessory_vr.dm index 4c8e2c6143..db12dc815c 100644 --- a/code/modules/clothing/under/accessories/accessory_vr.dm +++ b/code/modules/clothing/under/accessories/accessory_vr.dm @@ -5,7 +5,7 @@ /obj/item/clothing/accessory/choker //A colorable, tagless choker name = "plain choker" slot_flags = SLOT_TIE | SLOT_OCLOTHING - desc = "A simple, plain choker. Or maybe it's a collar? Use in-hand to customize it." + desc = "A simple, plain choker. Or maybe it's a collar?" icon = 'icons/inventory/accessory/item_vr.dmi' icon_override = 'icons/inventory/accessory/mob_vr.dmi' icon_state = "choker_cst" @@ -44,18 +44,6 @@ /obj/item/clothing/accessory/choker/dropped() icon_override = icon_previous_override -/obj/item/clothing/accessory/choker/attack_self(mob/user as mob) - if(!customized) - var/design = tgui_input_list(user,"Descriptor?","Pick descriptor","Descriptor", list("plain","simple","ornate","elegant","opulent")) - var/material = tgui_input_list(user,"Material?","Pick material","Material", list("leather","velvet","lace","fabric","latex","plastic","metal","chain","silver","gold","platinum","steel","bead","ruby","sapphire","emerald","diamond")) - var/type = tgui_input_list(user,"Type?","Pick type","Type", list("choker","collar","necklace")) - name = "[design] [material] [type]" - desc = "A [type], made of [material]. It's rather [design]." - customized = 1 - to_chat(usr,span_notice("[src] has now been customized.")) - else - to_chat(usr,span_notice("[src] has already been customized!")) - /obj/item/clothing/accessory/collar slot_flags = SLOT_TIE | SLOT_OCLOTHING icon = 'icons/inventory/accessory/item_vr.dmi' From 7013ff1e53edf0f93a33257c46f7a962359fd54a Mon Sep 17 00:00:00 2001 From: SatinIsle <98125273+SatinIsle@users.noreply.github.com> Date: Sat, 9 Nov 2024 14:48:35 +0000 Subject: [PATCH 35/36] Allow pouring stuff into tanks (#16576) Added the ability to alt-click a reagent dispenser (such as a water or fuel tank) to open the input. When the input is open, reagent containers (such as buckets and beakers) will pour their contents into the dispenser to refill it. --- .../reagents/machinery/dispenser/reagent_tank.dm | 16 ++++++++++++++++ .../reagent_containers/_reagent_containers.dm | 3 +++ 2 files changed, 19 insertions(+) diff --git a/code/modules/reagents/machinery/dispenser/reagent_tank.dm b/code/modules/reagents/machinery/dispenser/reagent_tank.dm index 058cbe26ea..9e823fb51a 100644 --- a/code/modules/reagents/machinery/dispenser/reagent_tank.dm +++ b/code/modules/reagents/machinery/dispenser/reagent_tank.dm @@ -1,6 +1,7 @@ /obj/structure/reagent_dispensers name = "Dispenser" desc = "..." + description_info = "The input can be opened by Alt-clicking it, allowing you to pour reagents inside." icon = 'icons/obj/chemical_tanks.dmi' icon_state = "tank" layer = TABLE_LAYER @@ -16,6 +17,8 @@ var/amount_per_transfer_from_this = 10 var/possible_transfer_amounts = list(10,25,50,100) + var/open_top = FALSE + /obj/structure/reagent_dispensers/attackby(obj/item/W as obj, mob/user as mob) return @@ -79,6 +82,19 @@ /obj/structure/reagent_dispensers/blob_act() qdel(src) +/obj/structure/reagent_dispensers/AltClick(mob/user) + if(!Adjacent(user)) + return + + if(flags & OPENCONTAINER) + to_chat(user, span_notice("You close the input on \the [src]")) + flags -= OPENCONTAINER + open_top = FALSE + else + to_chat(user, span_notice("You open the input on \the [src], allowing you to pour reagents in.")) + flags |= OPENCONTAINER + open_top = TRUE + /* * Tanks */ diff --git a/code/modules/reagents/reagent_containers/_reagent_containers.dm b/code/modules/reagents/reagent_containers/_reagent_containers.dm index 33128f94a1..2c40ca03cc 100644 --- a/code/modules/reagents/reagent_containers/_reagent_containers.dm +++ b/code/modules/reagents/reagent_containers/_reagent_containers.dm @@ -48,6 +48,9 @@ if(!istype(target)) return 0 + if(target.open_top) + return 0 + if(!target.reagents || !target.reagents.total_volume) to_chat(user, span_notice("[target] is empty.")) return 1 From f1207e8fd2445e284e74044f5a9418e4d4305b0c Mon Sep 17 00:00:00 2001 From: Casey Date: Sun, 10 Nov 2024 13:34:08 -0500 Subject: [PATCH 36/36] Map swap --- maps/~map_system/_map_selection.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/maps/~map_system/_map_selection.dm b/maps/~map_system/_map_selection.dm index 47ff0d984d..879f058f54 100644 --- a/maps/~map_system/_map_selection.dm +++ b/maps/~map_system/_map_selection.dm @@ -5,8 +5,8 @@ /* FOR LIVE SERVER */ /*********************/ -//#define USE_MAP_TETHER -#define USE_MAP_STELLARDELIGHT +#define USE_MAP_TETHER +//#define USE_MAP_STELLARDELIGHT //#define USE_MAP_GROUNDBASE // Debug

    Xw?-bXA#p@^fNM7@HuXwSR>j4ULq}EX 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 RXq76drJ<`{eDm3>{{zJrIKBV? diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index b09963ba6db98e62da2837021a26f39a8be056bf..80566ece9e43373a6ac60d448e03097ad2643b02 100644 GIT binary patch delta 15422 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 delta 14786 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 U?yb)&2z<#sQ`@W5R z&AtrAHe;6O==1&lUccx0^Ld@Yapv6jxwq?my|4FuooKy>cNx#}oCN@Y@t&6YBLJWP zPbmOeYVgm#-!L8ks0srfKlM_#@wD=AaPx9-bpZgs4^`kD4*>w7%U;gY2h;`t_kkp4{wvcmC5HE>pt0DePPj-L>%} zI#HOW;V91I_#8H!KBq@+yo)h~nd?X`XAU3ND|cmBIosFh5Ut_%5Si)tNhKrOQLUQ) zNBzus^nBw1?(3t~&y;1nqD9v(f1`4A%him%Wd@br7sE(hYRep;?Vx=&&REl(nyOS; z6|oaaZ%Aep`(!b$`t^@v7xjytjrhPaQ8#hg-g@0fkIryvG5Cs4k8hM$ygO7=7?Th6 zbC$ihBOp1UkRI6N8Bc)`^t#HG?HlWGExPbaCS3zB^*iY_DqfpOj_5K=>Vt>b5?_L) z!#v@0RCf)wlGMg?U=hVK|Bm{E3IQ&FVsylbn9D`L0;O@u7vNo5CJ4A3sR zl+J0eVsh4aYU6_ckA=YLna5_)jXIrtB60n>*+St#L}KaK7+f9cS7e-5bj#)E`#*3^#M zaixop7QESKz8&97ijSkeUMrkEXzeq_T{B-QPQP3jS zmC%N7Le#BKO>{i>-VP#dn&!s!ANA*Z-{V#@cHHpI&+S+FbzeLZ!VzcI;BTWUnfy6k z;LJ6RYgdbm-!=!YQP`_FO-+32mV2As$y}6uy}HW!V&wguZxHpc#O$-d4v5MMrKC?W zoTSX`swxXT-mlt0OA<0P6F!6zaep>)*;R@iI@$=CPs)wH^wd0%Zsceof|;&jHSAC0N5P}wX;@E7LOMGwSaNAifzepFGWC}i6g+Yn{Cl*yfO1c!F<5W_r2S zrItLN_^!qJtc&*SyKJT?ft$78 zZyTTS=f(K-T(MjFX>ewFS5As#2v|Ts@v6=;#u4!fK<%Rj>_2=8aw&hRGGsjThcG<~ z%?1zxisvznNBp8!=N}Z*MvbgO)x^(H1D~0N#M}v(Yx+J4(nrN`_inT2c z{Buf#KD|&H;pRfy%ax6)J4U~d=$_@&&sag)xT|7f>UZu?cH359gEEzT#V2dsg;mu6 z){C_na6>~5pRI{M^$baV8-dbf=N5!Jtd@MC6Y#T`sLXu2f!xdT-cZTyt)ayJYGJPE ziqjlMj|vHiP$yDTZpOv+s0c&edMQ3OGR$2azRCv+I7jc{`6C#!%|NO`KTmoflJvzn zU4Y`e?lLkt*~`@c->A1ihuH2mA4RX@QOwJ53BENruJBgPuSYr%1g|w#SLdG566X8| zl}LvnmluxIkaVj!7o`KDxpBl99=qN#F2D=J|0|zC_ZI%j#!Lxs@4533fFHhoRmThZ z1EVrp?CTnvDGBjDIG~M-LQLDMBuJZk$(lq; zhxOm5&Q^ASFKsC4Z@6YfBxSsdk7{>|c(u;jd7G7um%`)~qXnCQR6<|zR(zdwAQtt+ z4WD*xY0sL_dDO+NcYGeDswzj?U6h~%Ud|A*mP4DBeW(A3uaC1UcrMTF?Jh!q$p<0@ z58%ZbB|V0jsi~Y&Bi3Ppf)MwPj&DC=N#2SVzI1l#Ju+pu^Z49zzeUE?+rQh;o-4gi zg7@Kl`yDRiWfLcPHwVv85{57qLF~~iA(SbI&f;i$x;M$X)BRCxQ3sb=ZAOsaPQ}!xtNz(3Y2+_C)8v?2hgfnOUT)A>Z)6r2{ z{KqHxM+Qls{K3gRy*_+_oh{vBxe~o(C?rxd40SwP<|5p>1uCB5QI?$)rP619a>SIV!2-H z#Z^H6Chl|DXtm!=zLRvo{zfD}u}-jLQbX(EL&JQrrVRLx1q0>M{ViX@Qa3lRl4omc zYXXWP)pU>-c$<+CJ3MT?vKSWj!qnrQYb+F=j>Q@$FZCx11AN>NfXjC&<%`pAk&DeN z(1fTot_WU+{@1SsFW%xi5To`!d>Rq)N*MgdQeQvnP24L%IgYvl0kw1AakIfk(_b>l zpG@M$YEUfPcf>VY-^P@?!UaX99e?-aQ3vv6y$fkWGpn}~CS6FXqTGnXPsGgWGYI;; zg=!(*AWco`I`56q%|@5$x}2h-b{uz=G{s6UhcE@}D&1U=zkdZe@VUYTn5)|``T&=2 zq_|GPMy6c3t}?sLfGAs*SmdE9N}+SRuuJKd(X{vD1KrySiq2Ss@i+o)?*A(5miPUT zx+AcYmW~87--w9FuzPI1=Q+d2w=Cl4VZVOyy|X!gVDTXAlhrrbF^h`H9L_Y7Q3iQ) zyyA%rxiak>&};{Ny3?2C->bh0^L<{sC3#&$BPsF9TFl75F4>V(X=#xhG6i{)-@k2oN>mN)MiG~psg5rJ3L`Mb;Va;<8VujyHT8GM zR>p&Kk++|==z7@Tp$OciRwbcUP4z2QUeUz3HLPAd%gmtw<>ch7DWtuwNp^pC)VAG? zDoLf7%EupVDTM`}#NWJ3xN1O_&XkA01{dJwq%ReCx)Rg~C#yJLjWm&FYjMA0D<8YY zk)Rf!j9=%|!8Q3~Z+M&Cdr`Yx+$ZG{Gme|6?a6d6v8fs<)2MnhpuT2F(qH2Xr@moYKB zl$_n>nxw|*df$p_TZ-Iwxe%aD{_Ab65B$}8n!lS72IeKNO7#=k`|Z^Q*$SJCW4O4o zF}ZhdOXf+9BqJP;Se->nD3yzcRlqk_Ow3_R=ONQE_I@lk<$%0CD6LKNqBVC z7aL&o{o}k__kSgdZP)0fBi(`=b3rqR= zMdii{$(^C2%jD4s#z7D#D!@6Tk>QbY<<|>33IUo)y1=4=W}4##Vg2iaeWzfkCxA8T zBZLAds=23j?iOM6+@IAqDmgIYD6 zPA{B$+Dfv@Nvu>ms@Y}IfspsfbOeQAsy7R3WF3uhoZD=NXQIQ$P?q}sqr!eV08#?GkmfoseDC-Y>Kc2U!V zZ^Py{z?sVcXD$`6wwnFnS!j|ZaqXIi(t2tSs;G!o$#?sAwp#dvY2@F()(jbq!1Rev zTlP3TOS*k?R6U19|K=GkcQnQRDw;9eR*94f8)|g*U9kg!vtYsuC~a@WbP$R&HIbw= z81Q!m+GCNgz|BVj0pPU|+n=72Py2Y|eCl;efR&uoOhbcIS%qE!0kH{vOugOIT!$-BOOp-|5+jZyJJbK2hqDm}9& z`40Zc%g8Q=j(PvS2X;yDM%vl?ciyI_(*a{BIEE5$hr?7x}f<0qZZ%bGTB@P>JQ>KY2i$_K@2R6cAX)ZRj67Jj=M6_QG8sr zq>ltXJ@m0nCzk~c%L`w=21Q>AR#wrWPavI?$@Yv`{&cl{_h}>>6p0|Es z+iBb3Fu>MUL|R5hFyD1>I6}+(YZGnQ6am86^RKxGVcOHd_t~C`24_cs5;DHJ)CHWb zuz|e0g0oWJKpx_g33Ib-MFqi8g)1vvUDHj}+0!7V9PQLUC;MtV#2JZ-e0*Y3QdDg$ zctLr(V6h(shn^w<{s^0h^f4o)&uSD2f?6;UR6_W_h17p1EeW>J5~&+^auSeBV-*eC}y~B z!Iu`n8CV=Pa+=J70LIWY(IG8$J&PPPH(FfAX#btm(om1GGJ!vdH{k}`Kj zO`6lBtN>uL#`Se_6WwbpFYux5K;CD>`eFbv&dg*4MQSZ|yiY;9jqlQSaw`8_E%8+B zeIElgCA%eQW?vy4<{>JETx#V>=U8S2z_{h`xS*r5c|5#I6!80DSQS~}FeG9pAdpwR ztDEV=uB~(Lb=4O(I?Kc&CxoXVs-E13Mho13`bbbdS4#YIvy)MQ*fGrm_K=hmKPS#0;mWXgy`7k;!j!DDudIzyShI z){>Q#)hyufW%U_1D`DVX*uxjS3h-E|$I0&(7GfEaO-fRZdXUg!Lk0CTRP4(zCd#wk zC)~J3U9vZaV0hDAj5+c5LO${rm$O^U8*zMYOVM0*BzdUnZF%(hoAf|yE&gs(gsMu0 zq}MkchsBgWEDSGQt5(T+@ff3ZqTRp7n`!gRD?s^+lcPmRkzNUdP!AbP#Bu|s(qfQi z{{-a55bRtkgLZQvSuv*XsLzgFI<@%G!$HoxvIn@BPN4m1iQ!dIQ71O4G}I&W2ppxV z%PTqFdjB4PN@l2F`jaE6S~(AXNlf_FpSGhNeEMM;N+~%M5STgkPx3^Y$+9LUvMN6^ z7#JH{eagcHGPNnazbB+VPR=~-RPmy(Mc^p7t4}C|(&6x;O zSl;NB=~DpR>$^WCSYZ{H+Ao+>DG z?W|9#0?oUJukjPc!%v=sN<}{B=C&*TI+~IIBNG<41~{Ba(w))HA7lTd_Pq_6+epIE zFrNch)J3QKu{|pgb;(v14*vM4)z$Y9#KoM_0&3YOPw?OR`xm;k#nX+50gy^}@ZdmPUfJ^cA=p*tMFy}VnCJhhc4V7L?n4>%cP_bI)k zQn=GH^W5_u3P670er*P7z&Znr|D`fteO>8h*H{t#gf&V-?aWEYkB)7g^p(ujf2@f* zy!=1UKDH0Zs0lahHkSz=I5_%4fShw=1N>N0SuIJw_H|m9vryx?!7G?SoCk(r)@^RT zgSIBAjgZul@Z3qH_On_f{63SoD}T^ori85w_s3()kc{dx&~9_~)9OYDIU2y6{uCrN zIU!ffV?|UQ^%=`Ljq@1swIcoMHnJqC4gH_0BB6k|k5^5M1OT-I^(JEy1 z8d&OgHyAnjO1F7b6YYdWNJcm1n(A_yBatWz2bR8^0i0RU>l~jrvdV5F+YXFuR$2tA zu}k?NDZxBz(`e!@T`s$Y^D`xL4*Z|?opv>OSt6H6|62mvRiZ~07tmjxjabE>1e1!{ zfT-;t(@r+MWr_K)CPOr|(Yxt>@E_eD88sIEGUS?qpCwI(HNZO@&3hcy9xiS(A40n7 zE(^CgVGi3M|9nY8%;D?TPdrF9N&w3=t~U8qH}c;BTkV05etkwTfWGJ{dlDSigL)F| z_7zpO0Joo>))4m73yYOdo{x$TyZBND@!xH05*215so(i*Dhde(}NJAL~yL|yy z#|zR2vUBf$4Zgjs`|p5OE=vf5<}Xn5ODI|zri*Xr2C?zx=ZV z%l{5$N33~+pOonJ>u0POWbAs+C6avKnOG(YG!v%Qus7hocosc4XeGC2hj5sqOTa)@ zg7&j^LdU-&e1>4~=+QTuE{?Cy8;!?Sk*j{kRV;5;d)xBGtV#bJYObXG{QR+cUx{?s zyu6Az#s7CuV3#hPdG+d*HAy{l=PIQ@9oGFSeLC#l0q@U*#Sx+p2OX(Zy;c?dO`FW#*hM36@@%G#QX2|B2z00p?`) ze9b059?4C-`5(J3{fXir#!7gej>S(G5@M`3wcGsV33~`BwA;KEN7>xM3=`X$tV!r< zpPg=%`%$jBUBh`T^=Roc2nyTMaLuH9-obDRMD`7`hGklM0D9Wh!C{(~WR z0(qBcAq_{&3c+T4suo}Vx;}cia*8K2;wPUkP#sq?Ay8fPU*eR4DGKF#^0eFb$^K*&uK*~34wUbr3E2Y^hZp`3ay*C{GwYMf(*TIIQSov1ScBy7 zZu8~{^MB%JSZcN`IA&<`RYfT1DyY<`B>vZCuuYS%DFCq0oW>_y)t9nzT+J8e_ybP& zVhIra)mVPUXkoEm`hF4`*Tb!d8YNgYP}pQq-w_%l+*n=l}8-gD@ZnU714i#U0vX(EajY~)p-}cu_q6lbP}>8n1fxHXDb`7ayE1yE=5Ki zuCxR{)X;q z&T$Zevm|AC7)e|bnm|UGH70}8`yYPo+LDBP4mOI~mnC3@r$rqA)#X{omEr)J%|e`$ zEdcrU%jm8od?W$2dOAE{`0*B`T0hDcx>G>$4Xa)OAi8G@duvQ}h;nJDFL-Hdl1e7( zOPjgZi6>~zaHTQ1ZcFvhY>Xm)r9^^a0PpxVD{ER*NvS@yrq7-YpvuF^&l{~cRTqUI z3(c2jT|){@CrzwR*z3w)D+Tv%F$3xFz{EaoeUW4koQ#Li(pPpg%(c}wiq(>Kp)_t& zCM?+j0L$-X<|s^12jNdOEOB}EHnJPFn2w6IXMePgZ8AeYG4~=io>2?E$t-mGV291I z#m}EVmxLIO00QkjP?jm&?QC5AI!z9a@(=f9RE%H@w zUxu%?vz|M54p5!wOcB-f!#AvpLU?pUM2fIyfV5Z<5TTUU!xM0n0F$`9GzeDB?zvH> zGX~&L6f&zUGph!j+Tsr<@`Vn`4HEaeiOBB9zLTLG3?LrxjlE;+d zTUyV%qFzp*o1^057p!|Bb9|Nru%GFgsGbgU6LgFOur$AGV4yp=0so(BtI6@!q>r?f ziGJCuSf1eeF7+t6K%;x(JZYQ#kR`YKT)G`H;P`=6YsO%Tzm9_u$CO7x8|B zvdDpifI?JPYNxoo-F}p}{ak9D*NOQ+D=0sD^On5f z2Ni(=BDYS#mAsDO7JF&NQ%(q4xkgb_`ysU5PezTuVqc@Lm-%Aw^>9hmU@T1#1Mv6! zXsk%m+w%#3&$m9%48d>98P0#kxL6^>yUyHj`?J@SJNk!XfHdX2*<$dYbsS-JqZ@u9 zqYh_T=bXd#Zc*A@`&`TQrUbkm_o-Bg+Wd!?} zm0b^l6w(5;=NdDj-)hYN8nnCFOpP!#B!*MM7W~=n7j_@_OL1^nI>{n>Ae`oMKDarQ zKfQSUph_B^odO2kXSX_ROdK26lEYnUHP)-sEWd0l9nYb3WrJbs(xNnJ|GS>?JJcBuPC33_+yHy;h`7^jUiP za$n4IRt+IV;MNf7{_RugBo)$|3WX<(*hAAOA@N<*6+uv|^zz@hZUXp%I zB3H2q-AG#73|5l_v}dtS*uRUb?8hBIRGM#sChEyly>a1TvzqyPg>(wjx{u2b?9) z%_tR8?m_s4fj09>m4VQHApqc$32e++GhU_+x2&x>Dlse`Mc2L>HLq+Mu-*$GfJj)- zHfz0K>RN4IoFG6ZWsbhzAv7J$3+D=ElNYAk`V`xoeU82^UXu|1O6viHJG&YHHv&Qyyb_P^jrL|9_>%Ry9h_7G8KvTT;o0`?I*toxs6rmT*J9<3)=v21@lrAQXTp4)F|*$^Qd0;L+YC) z-nyo$QcApYm7^%OKhqGPuu&w6KI&g=8piBGfe1``_s++&p1zsgu(*mP{(MoG$N4W) zXJh*DCf&=~;JTDD`OQxb!Tza6S={}%JXj|d`&OaZJ&4mBf!vnGp9JN25~Pcpx;(DGUa&dI5J2xa zXpiRI|9cQT+RcxxH1woSNkcQ}GDiaESbcsPoSyv#7J&7KN~ZodHk&YciGKKkonk^MW>n zohs*Q>p;PC9p;$pO5G!$`gD97Y+n0&3an9bS&duHbQd$|EYWsiW;yLoLFaMX&53g( z`;xeB?u(SFN84AZ3m;0V?zaJBm|SE>3lRJn^|C*AUv@AhoJkiC@gz_}>Znv%BEHo6 zgs_V+&UhaMqqiK_X_L-loJwGtpP2=cDo7#n2eW3lxkFz+lnaVAvS$IJ;3I2`#sdt z&oGB|Z)BH9`yHriK{h@ibY;=}Yf4B`j;m|H`ql}Q(w+n1M?N8BVqrbx8{nJD?-9!enmr{pbAmrRWkP?aO=!if7iv}Y;aUpJ8>4C%tAHBOT| zDpv{B=?HgQ3k{A`g|;5e8H#!R^iPE$kf4-bP#^6 zu)cB>so*K1{qTMm;f@+mZkrRGRZMZ;@z|lWM(L7>$cvCQi-atsVMTW18t?3wvf8H* z17cFR>8w9tVO!ZFA`BsL*MX$lPJ!#?JH@?1#qc~^>F0Sk}?OffWHD3H}WEZlAWWF7O?BW;u` z-9M7cnKeop-aLRydm!?6X(HQFSn)_*W|AR2{%|W$0x?a`DSqxzWK-~ot;6TWfCEPdkSuNX%rx%W z4mtg~bg7+3@tlMT`BvbZE}YF4vFWW^$K32E%+5-6bN|m72#C(l#DXd*I|xQ!p9*?o zT-I&IEmacXH){{-ebFvIFPQIVuETGCQ;E&f5juE!!QG=Vw{sQJ~bU& z2OC3$x-wX(l8+dm$I{;sj!?Y;AG{pQef0UEKHAnk%(xd{bhX^))XCNPArfV=jk3T<@yElz`?T^ZtkYp{f-5&TA&ikuOg^>Ec}mgbrpC*P-qB ztrgA$>1vn8p^ELRsTV9^tZ32n1(?t2rriR+2)@V(D| zgD37m9rK*~U4%niqW|EEEO);wt-ZG1&e)d7`*U<&(bT5lfHZs%6NPu&R9!7=nyBaZ z`MZd@pGgVi?@}W6KsN6t2`>asyJX?2R#+n*R7?m55Oo92ZPSTd$pShBzzs686v|P3 zYG5lPRfCBl8Q*}R(kmcLX0W<(Qboy;hld}7`3CeG1TE0-n_nQxodG=RpmRw+@^LoY=6oc?K1O?d|aD37ex1dwbsqf8iotg$2K2>&|=Cy_0itZ9Im9- zOcxfeYU9CCpS4hR2LU#emQP_RhDg;>@&5+gugV3~P85nPB( zb@+1t)fG@n6-Z19;mer#`37KuIY#H+9?$#EzDhuCey_97-aq;E zi=CdCuiq3Y5Y_y88L)5W$&;FoLy^3HXG16hVz&l_8|?Z%a&d8Um(m1GQO7>Dx*=l! znH)Nh=Jw~jQEU`dz~kYOS8%2|{72=MuCA`YAY%iWg{qu8vLob4o779Dfd?bPv6@y1 zIjYB;K1v0^Jh;!jxqBdiimjcr9ePa0H3hS8^GLl=x3aQI2tI#)-bwzYssam%SZb!+ zbTh!~cZrQn#=1OD9G$`KJ9i0-S-t_*kolDmJe|?@B&UkyuL%A!m7V4&`Ma_GkI67i zt6$(I`d!KFHoL&1NX~QT1Tep&cO;mh+c`sPnuOrLS~>@GVXIuLnA%0A0h`swU!{12 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