From f656e97ed23012048c3a31c354765897447c46ea Mon Sep 17 00:00:00 2001
From: Zonespace <41448081+Zonespace27@users.noreply.github.com>
Date: Fri, 19 Jul 2024 22:24:07 +0200
Subject: [PATCH 01/48] Fixes Abom tutorial softlock (#6754)
# About the pull request
Closes https://github.com/cmss13-devs/cmss13/issues/6741
# Explain why it's good for the game
Being able to softlock a tutorial is bad.
# Testing Photographs and Procedure
Screenshots & Videos
![image](https://github.com/user-attachments/assets/8e4614ff-7d99-4601-9524-85bc08264db9)
# Changelog
:cl:
fix: Fixed a potential softlock in the abomination tutorial.
/:cl:
Co-authored-by: John Doe
---
code/datums/tutorial/xenomorph/abomination.dm | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/code/datums/tutorial/xenomorph/abomination.dm b/code/datums/tutorial/xenomorph/abomination.dm
index db9b77cf2e75..83ac86b8f09e 100644
--- a/code/datums/tutorial/xenomorph/abomination.dm
+++ b/code/datums/tutorial/xenomorph/abomination.dm
@@ -147,6 +147,7 @@
/datum/tutorial/xenomorph/abomination/proc/frenzy_tutorial_4()
var/mob/living/carbon/human/marine = new(loc_from_corner(4, 2))
add_to_tracking_atoms(marine)
+ RegisterSignal(marine, COMSIG_MOB_DEATH, PROC_REF(on_marine_early_death))
arm_equipment(marine, /datum/equipment_preset/uscm/private_equipped)
var/datum/action/frenzy = give_action(xeno, /datum/action/xeno_action/activable/feralfrenzy)
@@ -202,6 +203,7 @@
return
UnregisterSignal(frenzy, COMSIG_XENO_ACTION_USED)
+ UnregisterSignal(marine, COMSIG_MOB_DEATH)
remove_highlight(frenzy.button)
message_to_player("Good. As you may have noticed, the AOE version of Feral Frenzy takes longer to wind up, in addition to doing less overall damage.")
addtimer(CALLBACK(src, PROC_REF(kill_marines)), 6 SECONDS)
@@ -245,3 +247,10 @@
tutorial_end_in(7 SECONDS, TRUE)
// END OF SCRIPTING
+
+/// In case a marine dies early to prevent softlocks
+/datum/tutorial/xenomorph/abomination/proc/on_marine_early_death(datum/source)
+ SIGNAL_HANDLER
+
+ TUTORIAL_ATOM_FROM_TRACKING(/mob/living/carbon/human, marine)
+ marine.rejuvenate()
From b5b7ac3dcda9ed5812f4737b8b3c8ec4e0de17a4 Mon Sep 17 00:00:00 2001
From: cm13-github <128137806+cm13-github@users.noreply.github.com>
Date: Fri, 19 Jul 2024 21:29:36 +0100
Subject: [PATCH 02/48] Automatic changelog for PR #6754 [ci skip]
---
html/changelogs/AutoChangeLog-pr-6754.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-6754.yml
diff --git a/html/changelogs/AutoChangeLog-pr-6754.yml b/html/changelogs/AutoChangeLog-pr-6754.yml
new file mode 100644
index 000000000000..087fa7337c87
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-6754.yml
@@ -0,0 +1,4 @@
+author: "Zonespace27"
+delete-after: True
+changes:
+ - bugfix: "Fixed a potential softlock in the abomination tutorial."
\ No newline at end of file
From ea6d249cd764ed7daa5711535e1bf2e8cc448b15 Mon Sep 17 00:00:00 2001
From: Zonespace <41448081+Zonespace27@users.noreply.github.com>
Date: Fri, 19 Jul 2024 22:24:14 +0200
Subject: [PATCH 03/48] Fixes item actions not working properly (#6756)
# About the pull request
Calling the parent of all actions
(https://github.com/cmss13-devs/cmss13/pull/6442) caused a lot of bugs,
this fixes that.
Closes https://github.com/cmss13-devs/cmss13/issues/6755
Closes https://github.com/cmss13-devs/cmss13/issues/6753
Closes #6732
Closes https://github.com/cmss13-devs/cmss13/pull/6742
# Explain why it's good for the game
Bugs are bad
# Testing Photographs and Procedure
Screenshots & Videos
Tested on practically every object that has a use-in-hand functionality
with an action button.
# Changelog
:cl:
fix: Fixed a large amount of objects activating erroneous functionality
(like an armor light) when using action buttons tied to that object.
/:cl:
Co-authored-by: John Doe
---
code/datums/action.dm | 17 +++++++++++------
code/game/objects/items/devices/flashlight.dm | 2 +-
.../objects/items/devices/motion_detector.dm | 2 +-
code/game/objects/items/devices/whistle.dm | 3 +--
code/modules/clothing/gloves/boom_glove.dm | 2 +-
code/modules/cm_preds/yaut_weapons.dm | 2 +-
6 files changed, 16 insertions(+), 12 deletions(-)
diff --git a/code/datums/action.dm b/code/datums/action.dm
index 8dbf6c9df5a5..e6c87eca6a0d 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -187,12 +187,6 @@
holder_item = null
return ..()
-/datum/action/item_action/action_activate()
- . = ..()
- if(target)
- var/obj/item/I = target
- I.ui_action_click(owner, holder_item)
-
/datum/action/item_action/can_use_action()
if(ishuman(owner) && !owner.is_mob_incapacitated())
var/mob/living/carbon/human/human = owner
@@ -213,6 +207,17 @@
name = "Toggle [target]"
button.name = name
+/datum/action/item_action/toggle/action_activate()
+ . = ..()
+ if(target)
+ var/obj/item/I = target
+ I.ui_action_click(owner, holder_item)
+
+/datum/action/item_action/toggle/use/New(target)
+ . = ..()
+ name = "Use [target]"
+ button.name = name
+
//This is the proc used to update all the action buttons.
/mob/proc/update_action_buttons(reload_screen)
if(!client)
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index 8d5e3cc752ff..e506f51ce21c 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -15,7 +15,7 @@
ground_offset_x = 2
ground_offset_y = 6
- actions_types = list(/datum/action/item_action)
+ actions_types = list(/datum/action/item_action/toggle)
var/on = FALSE
var/raillight_compatible = TRUE //Can this be turned into a rail light ?
var/toggleable = TRUE
diff --git a/code/game/objects/items/devices/motion_detector.dm b/code/game/objects/items/devices/motion_detector.dm
index dcbcc0dd8bc7..f68295001f92 100644
--- a/code/game/objects/items/devices/motion_detector.dm
+++ b/code/game/objects/items/devices/motion_detector.dm
@@ -33,7 +33,7 @@
var/long_range_cooldown = 2
var/blip_type = "detector"
var/iff_signal = FACTION_MARINE
- actions_types = list(/datum/action/item_action)
+ actions_types = list(/datum/action/item_action/toggle)
var/scanning = FALSE // controls if MD is in process of scan
var/datum/shape/rectangle/square/range_bounds
var/long_range_locked = FALSE //only long-range MD
diff --git a/code/game/objects/items/devices/whistle.dm b/code/game/objects/items/devices/whistle.dm
index 331df3ffa006..07196a3e1bb9 100644
--- a/code/game/objects/items/devices/whistle.dm
+++ b/code/game/objects/items/devices/whistle.dm
@@ -5,7 +5,7 @@
w_class = SIZE_TINY
flags_atom = FPRINT|CONDUCT
flags_equip_slot = SLOT_FACE
- actions_types = list(/datum/action/item_action)
+ actions_types = list(/datum/action/item_action/toggle/use)
var/volume = 60
var/spam_cooldown_time = 10 SECONDS
@@ -51,7 +51,6 @@
usr.put_in_l_hand(src)
add_fingerprint(usr)
-
/obj/item/device/hailer
name = "hailer"
desc = "Used by obese officers to save their breath for running."
diff --git a/code/modules/clothing/gloves/boom_glove.dm b/code/modules/clothing/gloves/boom_glove.dm
index 8cc3e8d910f6..ddddc5ecef5e 100644
--- a/code/modules/clothing/gloves/boom_glove.dm
+++ b/code/modules/clothing/gloves/boom_glove.dm
@@ -12,7 +12,7 @@
var/cooldown = 50
var/last_use = 0
- actions_types = list(/datum/action/item_action)
+ actions_types = list(/datum/action/item_action/toggle/use)
/obj/item/clothing/gloves/marine/boom_glove/item_action_slot_check(mob/user, slot)
if(!ishuman(user)) return FALSE
diff --git a/code/modules/cm_preds/yaut_weapons.dm b/code/modules/cm_preds/yaut_weapons.dm
index b6d595c37b96..3bbbd11c0784 100644
--- a/code/modules/cm_preds/yaut_weapons.dm
+++ b/code/modules/cm_preds/yaut_weapons.dm
@@ -486,7 +486,7 @@
throw_range = 6
hitsound = 'sound/weapons/slash.ogg'
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
- actions_types = list(/datum/action/item_action)
+ actions_types = list(/datum/action/item_action/toggle/use)
unacidable = TRUE
/obj/item/weapon/yautja/knife/attack(mob/living/target, mob/living/carbon/human/user)
From e1690a98b2545409a3e206e5190ad8ef5baf1713 Mon Sep 17 00:00:00 2001
From: cm13-github <128137806+cm13-github@users.noreply.github.com>
Date: Fri, 19 Jul 2024 21:39:07 +0100
Subject: [PATCH 04/48] Automatic changelog for PR #6756 [ci skip]
---
html/changelogs/AutoChangeLog-pr-6756.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-6756.yml
diff --git a/html/changelogs/AutoChangeLog-pr-6756.yml b/html/changelogs/AutoChangeLog-pr-6756.yml
new file mode 100644
index 000000000000..377afb6eb5ea
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-6756.yml
@@ -0,0 +1,4 @@
+author: "Zonespace27"
+delete-after: True
+changes:
+ - bugfix: "Fixed a large amount of objects activating erroneous functionality (like an armor light) when using action buttons tied to that object."
\ No newline at end of file
From 75a29856c8d3c8673544852cc5dd263538090abe Mon Sep 17 00:00:00 2001
From: cuberound <122645057+cuberound@users.noreply.github.com>
Date: Fri, 19 Jul 2024 22:24:35 +0200
Subject: [PATCH 05/48] trade destination removal (more never used stuff)
(#6758)
# About the pull request
less mess, removes trade destinations that were... I do not know used
for trading on old SS13
# Explain why it's good for the game
no impact on normal rounds hopefuly
Screenshots & Videos
Put screenshots and videos here with an empty line between the
screenshots and the `` tags.
# Changelog
:cl:
del: removes trade destinations (they were never used)
/:cl:
---------
Co-authored-by: vincibrv
---
code/modules/economy/TradeDestinations.dm | 110 ----------------------
code/modules/economy/economy_misc.dm | 5 -
colonialmarines.dme | 1 -
3 files changed, 116 deletions(-)
delete mode 100644 code/modules/economy/TradeDestinations.dm
diff --git a/code/modules/economy/TradeDestinations.dm b/code/modules/economy/TradeDestinations.dm
deleted file mode 100644
index 94ead45bf13e..000000000000
--- a/code/modules/economy/TradeDestinations.dm
+++ /dev/null
@@ -1,110 +0,0 @@
-
-GLOBAL_LIST_EMPTY(weighted_randomevent_locations)
-GLOBAL_LIST_EMPTY(weighted_mundaneevent_locations)
-
-/datum/trade_destination
- var/name = ""
- var/description = ""
- var/distance = 0
- var/list/willing_to_buy = list()
- var/list/willing_to_sell = list()
- var/can_shuttle_here = 0 //one day crew from the exodus will be able to travel to this destination
- var/list/viable_random_events = list()
- var/list/temp_price_change[BIOMEDICAL]
- var/list/viable_mundane_events = list()
-
-/datum/trade_destination/proc/get_custom_eventstring(event_type)
- return null
-
-//distance is measured in AU and co-relates to travel time
-/datum/trade_destination/centcomm
- name = "CentComm"
- description = "Weyland-Yutani's administrative centre for Tau Ceti."
- distance = 1.2
- willing_to_buy = list()
- willing_to_sell = list()
- viable_random_events = list(SECURITY_BREACH, CORPORATE_ATTACK, AI_LIBERATION)
- viable_mundane_events = list(ELECTION, RESIGNATION, CELEBRITY_DEATH)
-
-/datum/trade_destination/anansi
- name = "NSS Anansi"
- description = "Medical station ran by Second Red Cross (but owned by WY) for handling emergency cases from nearby colonies."
- distance = 1.7
- willing_to_buy = list()
- willing_to_sell = list()
- viable_random_events = list(SECURITY_BREACH, CULT_CELL_REVEALED, BIOHAZARD_OUTBREAK, PIRATES, ALIEN_RAIDERS)
- viable_mundane_events = list(RESEARCH_BREAKTHROUGH, RESEARCH_BREAKTHROUGH, BARGAINS, GOSSIP)
-
-/datum/trade_destination/anansi/get_custom_eventstring(event_type)
- if(event_type == RESEARCH_BREAKTHROUGH)
- return "Thanks to research conducted on the NSS Anansi, Second Red Cross Society wishes to announce a major breakthough in the field of \
- [pick("mind-machine interfacing","neuroscience","nano-augmentation","genetics")]. Weyland-Yutani is expected to announce a co-exploitation deal within the fortnight."
- return null
-
-/datum/trade_destination/icarus
- name = "NMV Icarus"
- description = "Corvette assigned to patrol NSS Exodus local space."
- distance = 0.1
- willing_to_buy = list()
- willing_to_sell = list()
- viable_random_events = list(SECURITY_BREACH, AI_LIBERATION, PIRATES)
-
-/datum/trade_destination/redolant
- name = "OAV Redolant"
- description = "Osiris Atmospherics station in orbit around the only gas giant insystem. They retain tight control over shipping rights, and Osiris warships protecting their prize are not an uncommon sight in Tau Ceti."
- distance = 0.6
- willing_to_buy = list()
- willing_to_sell = list()
- viable_random_events = list(INDUSTRIAL_ACCIDENT, PIRATES, CORPORATE_ATTACK)
- viable_mundane_events = list(RESEARCH_BREAKTHROUGH, RESEARCH_BREAKTHROUGH)
-
-/datum/trade_destination/redolant/get_custom_eventstring(event_type)
- if(event_type == RESEARCH_BREAKTHROUGH)
- return "Thanks to research conducted on the OAV Redolant, Osiris Atmospherics wishes to announce a major breakthough in the field of \
- [pick("phoron research","high energy flux capacitance","super-compressed materials","theoretical particle physics")]. Weyland-Yutani is expected to announce a co-exploitation deal within the fortnight."
- return null
-
-/datum/trade_destination/beltway
- name = "Beltway mining chain"
- description = "A co-operative effort between Beltway and Weyland-Yutani to exploit the rich outer asteroid belt of the Tau Ceti system."
- distance = 7.5
- willing_to_buy = list()
- willing_to_sell = list()
- viable_random_events = list(PIRATES, INDUSTRIAL_ACCIDENT)
- viable_mundane_events = list(TOURISM)
-
-/datum/trade_destination/biesel
- name = "Biesel"
- description = "Large ship yards, strong economy and a stable, well-educated populace, Biesel largely owes allegiance to Sol / Vessel Contracting and begrudgingly tolerates WY. Capital is Lowell City."
- distance = 2.3
- willing_to_buy = list()
- willing_to_sell = list()
- viable_random_events = list(RIOTS, INDUSTRIAL_ACCIDENT, BIOHAZARD_OUTBREAK, CULT_CELL_REVEALED, FESTIVAL, MOURNING)
- viable_mundane_events = list(BARGAINS, GOSSIP, SONG_DEBUT, MOVIE_RELEASE, ELECTION, TOURISM, RESIGNATION, CELEBRITY_DEATH)
-
-/datum/trade_destination/new_gibson
- name = "New Gibson"
- description = "Heavily industrialised rocky planet containing the majority of the planet-bound resources in the system, New Gibson is torn by unrest and has very little wealth to call it's own except in the hands of the corporations who jostle with WY for control."
- distance = 6.6
- willing_to_buy = list()
- willing_to_sell = list()
- viable_random_events = list(RIOTS, INDUSTRIAL_ACCIDENT, BIOHAZARD_OUTBREAK, CULT_CELL_REVEALED, FESTIVAL, MOURNING)
- viable_mundane_events = list(ELECTION, TOURISM, RESIGNATION)
-
-/datum/trade_destination/luthien
- name = "Luthien"
- description = "A small colony established on a feral, untamed world (largely jungle). Savages and wild beasts attack the outpost regularly, although WY maintains tight military control."
- distance = 8.9
- willing_to_buy = list()
- willing_to_sell = list()
- viable_random_events = list(WILD_ANIMAL_ATTACK, CULT_CELL_REVEALED, FESTIVAL, MOURNING, ANIMAL_RIGHTS_RAID, ALIEN_RAIDERS)
- viable_mundane_events = list(ELECTION, TOURISM, BIG_GAME_HUNTERS, RESIGNATION)
-
-/datum/trade_destination/reade
- name = "Reade"
- description = "A cold, metal-deficient world, WY maintains large pastures in whatever available space in an attempt to salvage something from this profitless colony."
- distance = 7.5
- willing_to_buy = list()
- willing_to_sell = list()
- viable_random_events = list(WILD_ANIMAL_ATTACK, CULT_CELL_REVEALED, FESTIVAL, MOURNING, ANIMAL_RIGHTS_RAID, ALIEN_RAIDERS)
- viable_mundane_events = list(ELECTION, TOURISM, BIG_GAME_HUNTERS, RESIGNATION)
diff --git a/code/modules/economy/economy_misc.dm b/code/modules/economy/economy_misc.dm
index d65799f8f96f..afd2b1b8ad36 100644
--- a/code/modules/economy/economy_misc.dm
+++ b/code/modules/economy/economy_misc.dm
@@ -75,11 +75,6 @@ GLOBAL_VAR_INIT(economy_init, FALSE)
if(GLOB.economy_init)
return 2
- for(var/loc_type in typesof(/datum/trade_destination) - /datum/trade_destination)
- var/datum/trade_destination/D = new loc_type
- GLOB.weighted_randomevent_locations[D] = length(D.viable_random_events)
- GLOB.weighted_mundaneevent_locations[D] = length(D.viable_mundane_events)
-
create_station_account()
create_department_account("Vendor")
diff --git a/colonialmarines.dme b/colonialmarines.dme
index a3cf03cc79a3..c7d4a8957987 100644
--- a/colonialmarines.dme
+++ b/colonialmarines.dme
@@ -1737,7 +1737,6 @@
#include "code\modules\economy\cash.dm"
#include "code\modules\economy\economy_misc.dm"
#include "code\modules\economy\EFTPOS.dm"
-#include "code\modules\economy\TradeDestinations.dm"
#include "code\modules\emoji\emoji_parse.dm"
#include "code\modules\escape_menu\admin_buttons.dm"
#include "code\modules\escape_menu\details.dm"
From dbb3dead686af6d8d1aedf60c464bab20b9b9411 Mon Sep 17 00:00:00 2001
From: cm13-github <128137806+cm13-github@users.noreply.github.com>
Date: Fri, 19 Jul 2024 21:46:09 +0100
Subject: [PATCH 06/48] Automatic changelog for PR #6758 [ci skip]
---
html/changelogs/AutoChangeLog-pr-6758.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-6758.yml
diff --git a/html/changelogs/AutoChangeLog-pr-6758.yml b/html/changelogs/AutoChangeLog-pr-6758.yml
new file mode 100644
index 000000000000..e5d0d1045439
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-6758.yml
@@ -0,0 +1,4 @@
+author: "cuberound"
+delete-after: True
+changes:
+ - rscdel: "removes trade destinations (they were never used)"
\ No newline at end of file
From c840bb91b1f8e7d7da1349adf63658f1081a8e38 Mon Sep 17 00:00:00 2001
From: Doubleumc
Date: Fri, 19 Jul 2024 16:25:07 -0400
Subject: [PATCH 07/48] pick_weight over pickweight (#6760)
# About the pull request
Removes `pickweight` and switches over to `pick_weight`. The only
difference is that `pickweight` treated weight 0 as weight 1, and
`pick_weight` does not. Only `utility_closets` and `flow` had 0-weight
entries, and I corrected those.
Updates `pick_weight` to TG's version, which fixes a statistical error:
https://github.com/tgstation/tgstation/issues/71271
https://github.com/tgstation/tgstation/pull/71273
# Explain why it's good for the game
Less redundant code. More statistical accuracy.
# Testing Photographs and Procedure
Boots.
# Changelog
:cl:
code: Fixed and refactored probability weighting for pick_weight
/:cl:
---
code/__HELPERS/_lists.dm | 18 ++++++++++++------
code/__HELPERS/lists.dm | 16 ----------------
code/game/machinery/computer/arcade.dm | 4 ++--
.../crates_lockers/closets/utility_closets.dm | 2 +-
code/game/supplyshuttle.dm | 2 +-
code/modules/nightmare/nmnodes/flow.dm | 5 ++---
6 files changed, 18 insertions(+), 29 deletions(-)
diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm
index e46c92df543a..aa73d6008e02 100644
--- a/code/__HELPERS/_lists.dm
+++ b/code/__HELPERS/_lists.dm
@@ -128,17 +128,23 @@
* You should only pass integers in.
*/
/proc/pick_weight(list/list_to_pick)
+ if(length(list_to_pick) == 0)
+ return null
+
var/total = 0
- var/item
- for(item in list_to_pick)
+ for(var/item in list_to_pick)
if(!list_to_pick[item])
list_to_pick[item] = 0
total += list_to_pick[item]
- total = rand(0, total)
- for(item in list_to_pick)
- total -= list_to_pick[item]
- if(total <= 0 && list_to_pick[item])
+ total = rand(1, total)
+ for(var/item in list_to_pick)
+ var/item_weight = list_to_pick[item]
+ if(item_weight == 0)
+ continue
+
+ total -= item_weight
+ if(total <= 0)
return item
return null
diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm
index d5212611a04b..32ea0f5ec32e 100644
--- a/code/__HELPERS/lists.dm
+++ b/code/__HELPERS/lists.dm
@@ -87,22 +87,6 @@
result = first ^ second
return result
-//Pretends to pick an element based on its weight but really just seems to pick a random element.
-/proc/pickweight(list/L)
- var/total = 0
- var/item
- for (item in L)
- if (!L[item])
- L[item] = 1
- total += L[item]
-
- total = rand(1, total)
- for (item in L)
- total -=L [item]
- if (total <= 0)
- return item
- return null
-
/// Pick a random element from the list and remove it from the list.
/proc/pick_n_take(list/L)
RETURN_TYPE(L[_].type)
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index ff8f3959d64e..4f6f4df4ef08 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -123,7 +123,7 @@
src.temp = "[src.enemy_name] has fallen! Rejoice!"
if(!length(contents))
- var/prizeselect = pickweight(prizes)
+ var/prizeselect = pick_weight(prizes)
new prizeselect(src.loc)
if(istype(prizeselect, /obj/item/toy/gun)) //Ammo comes with the gun
@@ -176,5 +176,5 @@
if(2)
num_of_prizes = rand(0,2)
for(num_of_prizes; num_of_prizes > 0; num_of_prizes--)
- empprize = pickweight(prizes)
+ empprize = pick_weight(prizes)
new empprize(src.loc)
diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
index b000fd5733a2..0bf39322d107 100644
--- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
@@ -23,7 +23,7 @@
. = ..()
#ifndef UNIT_TESTS
- switch (pickweight(list("small" = 55, "aid" = 25, "tank" = 10, "both" = 10, "nothing" = 0, "delete" = 0)))
+ switch (pick_weight(list("small" = 55, "aid" = 25, "tank" = 10, "both" = 10, "nothing" = 1, "delete" = 1)))
#else
var/test = "both"
switch (test) // We don't want randomness in tests
diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm
index 53b64cbedfad..8974eb36187f 100644
--- a/code/game/supplyshuttle.dm
+++ b/code/game/supplyshuttle.dm
@@ -532,7 +532,7 @@ GLOBAL_DATUM_INIT(supply_controller, /datum/controller/supply, new())
for(var/datum/supply_packs_asrs/crate in cratelist)
var/weight = (floor(10000/crate.cost))
weighted_crate_list[crate] = weight
- return pickweight(weighted_crate_list)
+ return pick_weight(weighted_crate_list)
//To stop things being sent to centcomm which should not be sent to centcomm. Recursively checks for these types.
/datum/controller/supply/proc/forbidden_atoms_check(atom/A)
diff --git a/code/modules/nightmare/nmnodes/flow.dm b/code/modules/nightmare/nmnodes/flow.dm
index 1ca8c48f88b8..5f94326bbcaa 100644
--- a/code/modules/nightmare/nmnodes/flow.dm
+++ b/code/modules/nightmare/nmnodes/flow.dm
@@ -67,15 +67,14 @@
if(!.) return
var/list/datum/nmnode/pickables = choices.Copy()
for(var/datum/nmnode/node as anything in pickables)
- if(isnum(node.raw["weight"]))
- pickables[node] = node.raw["weight"]
+ pickables[node] = isnum(node.raw["weight"]) ? node.raw["weight"] : 1
var/list/datum/nmnode/picked = list()
var/remaining = src.amount
#if defined(UNIT_TESTS)
remaining = length(pickables) // Force all to be picked for testing (this could potentially make false positives though)
#endif
while(length(pickables) && remaining > 0)
- var/datum/nmnode/node = pickweight(pickables)
+ var/datum/nmnode/node = pick_weight(pickables)
remaining--
pickables -= node
picked += node
From ab66f213cc5840c0a7942d8b00cce2151481b15a Mon Sep 17 00:00:00 2001
From: cm13-github <128137806+cm13-github@users.noreply.github.com>
Date: Fri, 19 Jul 2024 21:53:53 +0100
Subject: [PATCH 08/48] Automatic changelog for PR #6760 [ci skip]
---
html/changelogs/AutoChangeLog-pr-6760.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-6760.yml
diff --git a/html/changelogs/AutoChangeLog-pr-6760.yml b/html/changelogs/AutoChangeLog-pr-6760.yml
new file mode 100644
index 000000000000..de6cafc23005
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-6760.yml
@@ -0,0 +1,4 @@
+author: "Doubleumc"
+delete-after: True
+changes:
+ - code_imp: "Fixed and refactored probability weighting for pick_weight"
\ No newline at end of file
From cd1b4e7bdaed999038541f398b94e482c0e42892 Mon Sep 17 00:00:00 2001
From: Steelpoint <6595389+Steelpoint@users.noreply.github.com>
Date: Sat, 20 Jul 2024 04:27:15 +0800
Subject: [PATCH 09/48] HPR Starts With Bipod Attached (#6715)
# About the pull request
See title. The HPR will now spawn in with a Bipod attached to it.
# Explain why it's good for the game
The concept of the HPR having access to a unique auto-fire function,
with a very high ROF, is not at all advertised to the average player,
this is a concept wherein many people are left unaware of this function
until it is revealed to them by a third party. This is common testimony
from those who discuss the HPR and its bipod function.
Forcing the HPR to spawn with a bipod attached to it, will resolve the
manner as it will expose far more people to the ability for the weapon
to fire on auto-fire and thus reveal an entirely new and unique way to
make usage of the firearm to people who may never have discovered it.
Considering the bipod is a fairly common attachment that is not often
selected, and the Almayer has a very limited supply of HPRs, I do not
believe this will have any real impact on attachment availability.
# Testing Photographs and Procedure
Screenshots & Videos
Put screenshots and videos here with an empty line between the
screenshots and the `` tags.
# Changelog
:cl:
add: The Heavy Pulse Rifle (M41AE2) will now start with a pre-attached
bipod. To better inform players of its unique auto-fire function.
/:cl:
---------
Co-authored-by: Steelpoint
---
code/modules/cm_marines/equipment/guncases.dm | 1 -
code/modules/cm_marines/equipment/kit_boxes.dm | 1 -
code/modules/projectiles/guns/rifles.dm | 1 +
3 files changed, 1 insertion(+), 2 deletions(-)
diff --git a/code/modules/cm_marines/equipment/guncases.dm b/code/modules/cm_marines/equipment/guncases.dm
index 22999e97fda2..cbbb791f8f0b 100644
--- a/code/modules/cm_marines/equipment/guncases.dm
+++ b/code/modules/cm_marines/equipment/guncases.dm
@@ -67,7 +67,6 @@
new /obj/item/ammo_magazine/rifle/lmg(src)
new /obj/item/ammo_magazine/rifle/lmg/holo_target(src)
new /obj/item/attachable/flashlight
- new /obj/item/attachable/bipod
//------------
/obj/item/storage/box/guncase/m41aMK1
diff --git a/code/modules/cm_marines/equipment/kit_boxes.dm b/code/modules/cm_marines/equipment/kit_boxes.dm
index 951cd30f84ff..2a2c2d450523 100644
--- a/code/modules/cm_marines/equipment/kit_boxes.dm
+++ b/code/modules/cm_marines/equipment/kit_boxes.dm
@@ -423,7 +423,6 @@
new /obj/item/weapon/gun/rifle/lmg(src)
new /obj/item/ammo_magazine/rifle/lmg(src)
new /obj/item/ammo_magazine/rifle/lmg/holo_target(src)
- new /obj/item/attachable/bipod(src)
new /obj/item/stack/folding_barricade/three(src)
new /obj/item/clothing/glasses/welding(src)
new /obj/item/tool/weldingtool(src)
diff --git a/code/modules/projectiles/guns/rifles.dm b/code/modules/projectiles/guns/rifles.dm
index fbe24434d542..44d6ef845b94 100644
--- a/code/modules/projectiles/guns/rifles.dm
+++ b/code/modules/projectiles/guns/rifles.dm
@@ -1228,6 +1228,7 @@
fire_sound = 'sound/weapons/gun_hpr.ogg'
aim_slowdown = SLOWDOWN_ADS_LMG
current_mag = /obj/item/ammo_magazine/rifle/lmg
+ starting_attachment_types = list(/obj/item/attachable/bipod)
attachable_allowed = list(
/obj/item/attachable/suppressor,
/obj/item/attachable/reddot,
From dcea328bcc9f481f6ab85201a145d9b7e1633a5d Mon Sep 17 00:00:00 2001
From: cm13-github <128137806+cm13-github@users.noreply.github.com>
Date: Fri, 19 Jul 2024 22:01:52 +0100
Subject: [PATCH 10/48] Automatic changelog for PR #6715 [ci skip]
---
html/changelogs/AutoChangeLog-pr-6715.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-6715.yml
diff --git a/html/changelogs/AutoChangeLog-pr-6715.yml b/html/changelogs/AutoChangeLog-pr-6715.yml
new file mode 100644
index 000000000000..2badcedfc520
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-6715.yml
@@ -0,0 +1,4 @@
+author: "Steelpoint"
+delete-after: True
+changes:
+ - rscadd: "The Heavy Pulse Rifle (M41AE2) will now start with a pre-attached bipod. To better inform players of its unique auto-fire function."
\ No newline at end of file
From f335e9a3b54102bb69d03e6d31d4d1d8261e12ce Mon Sep 17 00:00:00 2001
From: cuberound <122645057+cuberound@users.noreply.github.com>
Date: Fri, 19 Jul 2024 22:29:52 +0200
Subject: [PATCH 11/48] m56d ammo for m56 cupola (#6578)
# About the pull request
changes ammo of m56 cupola of a tank to m56d ammo rather then normal
smartgun ammo. it was leftover propably from some super old smartgun
behavior. current ammo was 30 dmg 0 ap with 2 shots per second, for
reference m4ra with iff scope has slightly better firerate with 36 dmg
40 ap with ap ammo and 48 dmg with 5 ap with normal ammo and you can
hold it in hand not have it mounted on a tank. now it has 35 dmg with 50
ap,
# Explain why it's good for the game
with other stats still worse then if you were to move m56d around but it
is not COMPLETE trap anymore, you are still better off leaving the tank
and carring m56d around but at least it can harm the enemy
# Testing Photographs and Procedure
Screenshots & Videos
Put screenshots and videos here with an empty line between the
screenshots and the `` tags.
# Changelog
:cl:
balance: m56 cupola uses m56d ammo rather then standard sg ammo
/:cl:
---------
Co-authored-by: vincibrv
Co-authored-by: harryob <55142896+harryob@users.noreply.github.com>
---
.../vehicles/hardpoints/hardpoint_ammo/cupola_ammo.dm | 2 +-
code/modules/vehicles/hardpoints/secondary/cupola.dm | 6 ------
2 files changed, 1 insertion(+), 7 deletions(-)
diff --git a/code/modules/vehicles/hardpoints/hardpoint_ammo/cupola_ammo.dm b/code/modules/vehicles/hardpoints/hardpoint_ammo/cupola_ammo.dm
index cadb760bd644..7eecc7d04511 100644
--- a/code/modules/vehicles/hardpoints/hardpoint_ammo/cupola_ammo.dm
+++ b/code/modules/vehicles/hardpoints/hardpoint_ammo/cupola_ammo.dm
@@ -5,7 +5,7 @@
icon = 'icons/obj/items/weapons/guns/ammo_by_faction/uscm.dmi'
icon_state = "cupola_1"
w_class = SIZE_LARGE
- default_ammo = /datum/ammo/bullet/smartgun
+ default_ammo = /datum/ammo/bullet/machinegun
max_rounds = 500
gun_type = /obj/item/hardpoint/secondary/m56cupola
diff --git a/code/modules/vehicles/hardpoints/secondary/cupola.dm b/code/modules/vehicles/hardpoints/secondary/cupola.dm
index a4b40c7dd3a1..70b9f9a4889f 100644
--- a/code/modules/vehicles/hardpoints/secondary/cupola.dm
+++ b/code/modules/vehicles/hardpoints/secondary/cupola.dm
@@ -28,9 +28,3 @@
burst_amount = 3
burst_delay = 0.3 SECONDS
extra_delay = 0.6 SECONDS
-
-/obj/item/hardpoint/secondary/m56cupola/set_bullet_traits()
- ..()
- LAZYADD(traits_to_give, list(
- BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_iff)
- ))
From a6f45fc571d46709ff06b8efc2ce12abbd4d3089 Mon Sep 17 00:00:00 2001
From: cm13-github <128137806+cm13-github@users.noreply.github.com>
Date: Fri, 19 Jul 2024 22:09:44 +0100
Subject: [PATCH 12/48] Automatic changelog for PR #6578 [ci skip]
---
html/changelogs/AutoChangeLog-pr-6578.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-6578.yml
diff --git a/html/changelogs/AutoChangeLog-pr-6578.yml b/html/changelogs/AutoChangeLog-pr-6578.yml
new file mode 100644
index 000000000000..60b8c86635aa
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-6578.yml
@@ -0,0 +1,4 @@
+author: "cuberound"
+delete-after: True
+changes:
+ - balance: "m56 cupola uses m56d ammo rather then standard sg ammo"
\ No newline at end of file
From 9d74e72aa5a379fd41eb4e31c54888e6d342d0e7 Mon Sep 17 00:00:00 2001
From: Changelogs
Date: Sat, 20 Jul 2024 01:16:49 +0000
Subject: [PATCH 13/48] Automatic changelog compile [ci skip]
---
html/changelogs/AutoChangeLog-pr-6578.yml | 4 ----
html/changelogs/AutoChangeLog-pr-6651.yml | 4 ----
html/changelogs/AutoChangeLog-pr-6679.yml | 4 ----
html/changelogs/AutoChangeLog-pr-6683.yml | 4 ----
html/changelogs/AutoChangeLog-pr-6715.yml | 4 ----
html/changelogs/AutoChangeLog-pr-6754.yml | 4 ----
html/changelogs/AutoChangeLog-pr-6756.yml | 4 ----
html/changelogs/AutoChangeLog-pr-6758.yml | 4 ----
html/changelogs/AutoChangeLog-pr-6760.yml | 4 ----
html/changelogs/archive/2024-07.yml | 17 +++++++++++++++++
10 files changed, 17 insertions(+), 36 deletions(-)
delete mode 100644 html/changelogs/AutoChangeLog-pr-6578.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-6651.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-6679.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-6683.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-6715.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-6754.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-6756.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-6758.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-6760.yml
diff --git a/html/changelogs/AutoChangeLog-pr-6578.yml b/html/changelogs/AutoChangeLog-pr-6578.yml
deleted file mode 100644
index 60b8c86635aa..000000000000
--- a/html/changelogs/AutoChangeLog-pr-6578.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "cuberound"
-delete-after: True
-changes:
- - balance: "m56 cupola uses m56d ammo rather then standard sg ammo"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-6651.yml b/html/changelogs/AutoChangeLog-pr-6651.yml
deleted file mode 100644
index 7284c2a463c4..000000000000
--- a/html/changelogs/AutoChangeLog-pr-6651.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Doubleumc"
-delete-after: True
-changes:
- - rscdel: "Removed facial disfigurement"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-6679.yml b/html/changelogs/AutoChangeLog-pr-6679.yml
deleted file mode 100644
index 7ffa71d87dd5..000000000000
--- a/html/changelogs/AutoChangeLog-pr-6679.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Doubleumc"
-delete-after: True
-changes:
- - bugfix: "no longer stab with utensil when trying to feed while target full"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-6683.yml b/html/changelogs/AutoChangeLog-pr-6683.yml
deleted file mode 100644
index ce51876eb9e6..000000000000
--- a/html/changelogs/AutoChangeLog-pr-6683.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Drathek"
-delete-after: True
-changes:
- - admin: "Added causes for explosion starts to attack logs"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-6715.yml b/html/changelogs/AutoChangeLog-pr-6715.yml
deleted file mode 100644
index 2badcedfc520..000000000000
--- a/html/changelogs/AutoChangeLog-pr-6715.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Steelpoint"
-delete-after: True
-changes:
- - rscadd: "The Heavy Pulse Rifle (M41AE2) will now start with a pre-attached bipod. To better inform players of its unique auto-fire function."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-6754.yml b/html/changelogs/AutoChangeLog-pr-6754.yml
deleted file mode 100644
index 087fa7337c87..000000000000
--- a/html/changelogs/AutoChangeLog-pr-6754.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Zonespace27"
-delete-after: True
-changes:
- - bugfix: "Fixed a potential softlock in the abomination tutorial."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-6756.yml b/html/changelogs/AutoChangeLog-pr-6756.yml
deleted file mode 100644
index 377afb6eb5ea..000000000000
--- a/html/changelogs/AutoChangeLog-pr-6756.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Zonespace27"
-delete-after: True
-changes:
- - bugfix: "Fixed a large amount of objects activating erroneous functionality (like an armor light) when using action buttons tied to that object."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-6758.yml b/html/changelogs/AutoChangeLog-pr-6758.yml
deleted file mode 100644
index e5d0d1045439..000000000000
--- a/html/changelogs/AutoChangeLog-pr-6758.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "cuberound"
-delete-after: True
-changes:
- - rscdel: "removes trade destinations (they were never used)"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-6760.yml b/html/changelogs/AutoChangeLog-pr-6760.yml
deleted file mode 100644
index de6cafc23005..000000000000
--- a/html/changelogs/AutoChangeLog-pr-6760.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Doubleumc"
-delete-after: True
-changes:
- - code_imp: "Fixed and refactored probability weighting for pick_weight"
\ No newline at end of file
diff --git a/html/changelogs/archive/2024-07.yml b/html/changelogs/archive/2024-07.yml
index f50a667cbefd..5b2844998cbc 100644
--- a/html/changelogs/archive/2024-07.yml
+++ b/html/changelogs/archive/2024-07.yml
@@ -193,3 +193,20 @@
realforest2001:
- rscadd: The Combat Correspondant's civilian equipment is now in it's own category
to make it easier to tell why you can't click it as the military version.
+2024-07-20:
+ Doubleumc:
+ - rscdel: Removed facial disfigurement
+ - code_imp: Fixed and refactored probability weighting for pick_weight
+ - bugfix: no longer stab with utensil when trying to feed while target full
+ Drathek:
+ - admin: Added causes for explosion starts to attack logs
+ Steelpoint:
+ - rscadd: The Heavy Pulse Rifle (M41AE2) will now start with a pre-attached bipod.
+ To better inform players of its unique auto-fire function.
+ Zonespace27:
+ - bugfix: Fixed a large amount of objects activating erroneous functionality (like
+ an armor light) when using action buttons tied to that object.
+ - bugfix: Fixed a potential softlock in the abomination tutorial.
+ cuberound:
+ - rscdel: removes trade destinations (they were never used)
+ - balance: m56 cupola uses m56d ammo rather then standard sg ammo
From edc335ffe59f10810f9185b9a8a00e07f6902511 Mon Sep 17 00:00:00 2001
From: zzzmike <85382350+zzzmike@users.noreply.github.com>
Date: Sat, 20 Jul 2024 20:06:06 -0700
Subject: [PATCH 14/48] Fixes lifeboat launch console being slashable /
acidable (#6763)
# About the pull request
Lifeboat launch console is clearly meant to not be slashable / acidable
(especially since it already has breakable=false flag and the lifepods
are already properly flagged unacidable / unslashable. This fixes the
problem.
# Explain why it's good for the game
Fixes a bug.
# Testing Photographs and Procedure
Screenshots & Videos
Put screenshots and videos here with an empty line between the
screenshots and the `` tags.
# Changelog
:cl:
fix: lifeboat launch console is no longer slashable / acidable
/:cl:
---
code/modules/shuttle/computer.dm | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/code/modules/shuttle/computer.dm b/code/modules/shuttle/computer.dm
index 00dcd987f089..a8ca94ba0aa5 100644
--- a/code/modules/shuttle/computer.dm
+++ b/code/modules/shuttle/computer.dm
@@ -364,9 +364,14 @@
icon_state = "terminal"
req_access = list()
breakable = FALSE
+ unslashable = TRUE
+ unacidable = TRUE
///If true, the lifeboat is in the process of launching, and so the code will not allow another launch.
var/launch_initiated = FALSE
+/obj/structure/machinery/computer/shuttle/lifeboat/ex_act(severity)
+ return
+
/obj/structure/machinery/computer/shuttle/lifeboat/attack_hand(mob/user)
. = ..()
var/obj/docking_port/mobile/crashable/lifeboat/lifeboat = SSshuttle.getShuttle(shuttleId)
From d9596cc8ef541b530752508ca56dc8c5ce7154b0 Mon Sep 17 00:00:00 2001
From: cm13-github <128137806+cm13-github@users.noreply.github.com>
Date: Sun, 21 Jul 2024 04:11:26 +0100
Subject: [PATCH 15/48] Automatic changelog for PR #6763 [ci skip]
---
html/changelogs/AutoChangeLog-pr-6763.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-6763.yml
diff --git a/html/changelogs/AutoChangeLog-pr-6763.yml b/html/changelogs/AutoChangeLog-pr-6763.yml
new file mode 100644
index 000000000000..f5189e8d7550
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-6763.yml
@@ -0,0 +1,4 @@
+author: "zzzmike"
+delete-after: True
+changes:
+ - bugfix: "lifeboat launch console is no longer slashable / acidable"
\ No newline at end of file
From 5bc7388ef8d7e5fcad724223aa5b687c2b139bd2 Mon Sep 17 00:00:00 2001
From: Crystalic <39885003+blackcrystall@users.noreply.github.com>
Date: Sun, 21 Jul 2024 08:29:31 +0500
Subject: [PATCH 16/48] Port WHO to TGUI (#6583)
# About the pull request
Just QoL
# Explain why it's good for the game
Argghhh. just TGUI new panel? No benefits on round, but for visual and
maybe a little bit server, because it don't generate every time for you
who list
# Changelog
:cl: Blackcrystalic
qol: port who/staffwho to TGUI
/:cl:
---------
Co-authored-by: Deleted user
---
code/__DEFINES/subsystems.dm | 1 +
code/controllers/subsystem/who.dm | 312 +++++++++++++++++++++
code/game/verbs/who.dm | 209 --------------
colonialmarines.dme | 2 +-
tgui/packages/tgui/interfaces/StaffWho.jsx | 78 ++++++
tgui/packages/tgui/interfaces/Who.jsx | 189 +++++++++++++
6 files changed, 581 insertions(+), 210 deletions(-)
create mode 100644 code/controllers/subsystem/who.dm
delete mode 100644 code/game/verbs/who.dm
create mode 100644 tgui/packages/tgui/interfaces/StaffWho.jsx
create mode 100644 tgui/packages/tgui/interfaces/Who.jsx
diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm
index 47aa0e732c76..88496c79d630 100644
--- a/code/__DEFINES/subsystems.dm
+++ b/code/__DEFINES/subsystems.dm
@@ -123,6 +123,7 @@
#define SS_INIT_NIGHTMARE 21.5
#define SS_INIT_TIMETRACK 21.1
#define SS_INIT_HUMANS 21
+#define SS_INIT_WHO 20
#define SS_INIT_POWER 19
#define SS_INIT_INFLUXMCSTATS 12
#define SS_INIT_INFLUXSTATS 11
diff --git a/code/controllers/subsystem/who.dm b/code/controllers/subsystem/who.dm
new file mode 100644
index 000000000000..43ecbb435587
--- /dev/null
+++ b/code/controllers/subsystem/who.dm
@@ -0,0 +1,312 @@
+SUBSYSTEM_DEF(who)
+ name = "Who"
+ flags = SS_BACKGROUND
+ runlevels = RUNLEVELS_DEFAULT|RUNLEVEL_LOBBY
+ init_order = SS_INIT_WHO
+ wait = 5 SECONDS
+
+ var/datum/player_list/who = new
+ var/datum/player_list/staff/staff_who = new
+
+/datum/controller/subsystem/who/Initialize()
+ who.update_data()
+ staff_who.update_data()
+ return SS_INIT_SUCCESS
+
+/datum/controller/subsystem/who/fire(resumed = TRUE)
+ who.update_data()
+ staff_who.update_data()
+
+//datum
+/datum/player_list
+ var/tgui_name = "Who"
+ var/tgui_interface_name = "Who"
+ var/list/mobs_ckey = list()
+ var/list/list_data = list()
+
+/datum/player_list/proc/update_data()
+ var/list/new_list_data = list()
+ var/list/new_mobs_ckey = list()
+ var/list/additional_data = list(
+ "lobby" = 0,
+ "admin_observers" = 0,
+ "observers" = 0,
+ "yautja" = 0,
+ "infected_preds" = 0,
+ "humans" = 0,
+ "infected_humans" = 0,
+ "uscm" = 0,
+ "uscm_marines" = 0,
+ )
+ new_list_data["additional_info"] = list()
+ var/list/counted_factions = list()
+ for(var/client/client as anything in sortTim(GLOB.clients, GLOBAL_PROC_REF(cmp_ckey_asc)))
+ CHECK_TICK
+ new_list_data["all_clients"]++
+ var/list/client_payload = list()
+ client_payload["ckey"] = "[client.key]"
+ client_payload["text"] = "[client.key]"
+ client_payload["ckey_color"] = "white"
+ var/mob/client_mob = client.mob
+ new_mobs_ckey[client.key] = client_mob
+ if(client_mob)
+ if(istype(client_mob, /mob/new_player))
+ client_payload["text"] += " - in Lobby"
+ additional_data["lobby"]++
+
+ else if(isobserver(client_mob))
+ client_payload["text"] += " - Playing as [client_mob.real_name]"
+ if(CLIENT_IS_STAFF(client))
+ additional_data["admin_observers"]++
+ else
+ additional_data["observers"]++
+
+ var/mob/dead/observer/observer = client_mob
+ if(observer.started_as_observer)
+ client_payload["color"] += "#ce89cd"
+ client_payload["text"] += " - Spectating"
+ else
+ client_payload["color"] += "#A000D0"
+ client_payload["text"] += " - DEAD"
+
+ else
+ client_payload["text"] += " - Playing as [client_mob.real_name]"
+
+ switch(client_mob.stat)
+ if(UNCONSCIOUS)
+ client_payload["color"] += "#B0B0B0"
+ client_payload["text"] += " - Unconscious"
+ if(DEAD)
+ client_payload["color"] += "#A000D0"
+ client_payload["text"] += " - DEAD"
+
+ if(client_mob.stat != DEAD)
+ if(isxeno(client_mob))
+ client_payload["color"] += "#ec3535"
+ client_payload["text"] += " - Xenomorph"
+
+ else if(ishuman(client_mob))
+ if(client_mob.faction == FACTION_ZOMBIE)
+ counted_factions[FACTION_ZOMBIE]++
+ client_payload["color"] += "#2DACB1"
+ client_payload["text"] += " - Zombie"
+ else if(client_mob.faction == FACTION_YAUTJA)
+ client_payload["color"] += "#7ABA19"
+ client_payload["text"] += " - Yautja"
+ additional_data["yautja"]++
+ if(client_mob.status_flags & XENO_HOST)
+ additional_data["infected_preds"]++
+ else
+ additional_data["humans"]++
+ if(client_mob.status_flags & XENO_HOST)
+ additional_data["infected_humans"]++
+ if(client_mob.faction == FACTION_MARINE)
+ additional_data["uscm"]++
+ if(client_mob.job in (GLOB.ROLES_MARINES))
+ additional_data["uscm_marines"]++
+ else
+ counted_factions[client_mob.faction]++
+
+ new_list_data["total_players"] += list(client_payload)
+
+ new_list_data["additional_info"] += list(list(
+ "content" = "In Lobby: [additional_data["lobby"]]",
+ "color" = "#777",
+ "text" = "Player in lobby",
+ ))
+
+ new_list_data["additional_info"] += list(list(
+ "content" = "Spectating Players: [additional_data["observers"]]",
+ "color" = "#777",
+ "text" = "Spectating players",
+ ))
+
+ new_list_data["additional_info"] += list(list(
+ "content" = "Spectating Admins: [additional_data["admin_observers"]]",
+ "color" = "#777",
+ "text" = "Spectating administrators",
+ ))
+
+ new_list_data["additional_info"] += list(list(
+ "content" = "Humans: [additional_data["humans"]]",
+ "color" = "#2C7EFF",
+ "text" = "Players playing as Human",
+ ))
+
+ new_list_data["additional_info"] += list(list(
+ "content" = "Infected Humans: [additional_data["infected_humans"]]",
+ "color" = "#ec3535",
+ "text" = "Players playing as Infected Human",
+ ))
+
+ new_list_data["additional_info"] += list(list(
+ "content" = "[MAIN_SHIP_NAME] Personnel: [additional_data["uscm"]]",
+ "color" = "#5442bd",
+ "text" = "Players playing as [MAIN_SHIP_NAME] Personnel",
+ ))
+
+ new_list_data["additional_info"] += list(list(
+ "content" = "Marines: [additional_data["uscm_marines"]]",
+ "color" = "#5442bd",
+ "text" = "Players playing as Marines",
+ ))
+
+ new_list_data["additional_info"] += list(list(
+ "content" = "Yautjas: [additional_data["yautja"]]",
+ "color" = "#7ABA19",
+ "text" = "Players playing as Yautja",
+ ))
+
+ new_list_data["additional_info"] += list(list(
+ "content" = "Infected Predators: [additional_data["infected_preds"]]",
+ "color" = "#7ABA19",
+ "text" = "Players playing as Infected Yautja",
+ ))
+
+ for(var/i in 1 to length(counted_factions))
+ if(counted_factions[counted_factions[i]])
+ new_list_data["factions"] += list(list(
+ "content" = "[counted_factions[i]]: [counted_factions[counted_factions[i]]]",
+ "color" = "#2C7EFF",
+ "text" = "Other",
+ ))
+ if(counted_factions[FACTION_NEUTRAL])
+ new_list_data["factions"] += list(list(
+ "content" = "[FACTION_NEUTRAL] Humans: [counted_factions[FACTION_NEUTRAL]]",
+ "color" = "#688944",
+ "text" = "Neutrals",
+ ))
+
+ for(var/faction_to_get in ALL_XENO_HIVES)
+ var/datum/hive_status/hive = GLOB.hive_datum[faction_to_get]
+ if(hive && length(hive.totalXenos))
+ new_list_data["xenomorphs"] += list(list(
+ "content" = "[hive.name]: [length(hive.totalXenos)]",
+ "color" = hive.color ? hive.color : "#8200FF",
+ "text" = "Queen: [hive.living_xeno_queen ? "Alive" : "Dead"]",
+ ))
+
+ list_data = new_list_data
+ mobs_ckey = new_mobs_ckey
+
+/datum/player_list/tgui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, tgui_name, tgui_interface_name)
+ ui.open()
+ ui.set_autoupdate(TRUE)
+
+/datum/player_list/ui_data(mob/user)
+ . = list_data
+
+/datum/player_list/ui_static_data(mob/user)
+ . = list()
+
+ .["admin"] = CLIENT_IS_STAFF(user.client)
+
+/datum/player_list/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
+ . = ..()
+ if(.)
+ return
+
+ switch(action)
+ if("get_player_panel")
+ if(mobs_ckey[params["ckey"]])
+ GLOB.admin_datums[usr.client.ckey].show_player_panel(mobs_ckey[params["ckey"]])
+
+/datum/player_list/ui_status(mob/user, datum/ui_state/state)
+ return UI_INTERACTIVE
+
+
+/datum/player_list/staff
+ tgui_name = "StaffWho"
+ tgui_interface_name = "Staff Who"
+
+ var/list/category_colors = list(
+ "Management" = "purple",
+ "Maintainers" = "blue",
+ "Administrators" = "red",
+ "Moderators" = "orange",
+ "Mentors" = "green"
+ )
+
+/datum/player_list/staff/update_data()
+ var/list/new_list_data = list()
+ mobs_ckey = list()
+
+ var/list/listings
+ var/list/mappings
+ if(CONFIG_GET(flag/show_manager))
+ LAZYSET(mappings, "Management", R_PERMISSIONS)
+ if(CONFIG_GET(flag/show_devs))
+ LAZYSET(mappings, "Maintainers", R_PROFILER)
+ LAZYSET(mappings, "Administrators", R_ADMIN)
+ if(CONFIG_GET(flag/show_mods))
+ LAZYSET(mappings, "Moderators", R_MOD && R_BAN)
+ if(CONFIG_GET(flag/show_mentors))
+ LAZYSET(mappings, "Mentors", R_MENTOR)
+
+ for(var/category in mappings)
+ LAZYSET(listings, category, list())
+
+ for(var/client/client as anything in GLOB.admins)
+ if(client.admin_holder?.fakekey && !CLIENT_IS_STAFF(client))
+ continue
+
+ for(var/category in mappings)
+ if(CLIENT_HAS_RIGHTS(client, mappings[category]))
+ LAZYADD(listings[category], client)
+ break
+
+ for(var/category in listings)
+ var/list/admins = list()
+ for(var/client/entry as anything in listings[category])
+ var/list/admin = list()
+ var/rank = entry.admin_holder.rank
+ if(entry.admin_holder.extra_titles?.len)
+ for(var/srank in entry.admin_holder.extra_titles)
+ rank += " & [srank]"
+
+ admin["content"] = "[entry.key] ([rank])"
+ admin["text"] = ""
+
+ if(entry.admin_holder?.fakekey)
+ admin["text"] += " (HIDDEN)"
+
+ if(istype(entry.mob, /mob/dead/observer))
+ admin["color"] = "#808080"
+ admin["text"] += " Spectating"
+
+ else if(istype(entry.mob, /mob/new_player))
+ admin["color"] = "#688944"
+ admin["text"] += " in Lobby"
+ else
+ admin["color"] = "#688944"
+ admin["text"] += " Playing"
+
+ if(entry.is_afk())
+ admin["color"] = "#A040D0"
+ admin["text"] += " (AFK)"
+
+ admins += list(admin)
+
+ new_list_data["administrators"] += list(list(
+ "category" = category,
+ "category_color" = category_colors[category],
+ "category_administrators" = length(listings[category]),
+ "admins" = admins,
+ ))
+
+ list_data = new_list_data
+
+/mob/verb/who()
+ set category = "OOC"
+ set name = "Who"
+
+ SSwho.who.tgui_interact(src)
+
+/mob/verb/staffwho()
+ set category = "Admin"
+ set name = "StaffWho"
+
+ SSwho.staff_who.tgui_interact(src)
diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm
deleted file mode 100644
index 3a9274dbec62..000000000000
--- a/code/game/verbs/who.dm
+++ /dev/null
@@ -1,209 +0,0 @@
-/client/verb/who()//likely don't touch any... this is easy can die. (:troll_fale:)
- set name = "Who"
- set category = "OOC"
-
- var/list/counted_humanoids = list(
- "Observers" = 0,
- "Admin observers" = 0,
- "Humans" = 0,
- "Infected humans" = 0,
- FACTION_MARINE = 0,
- "USCM Marines" = 0,
- "Lobby" = 0,
-
- FACTION_YAUTJA = 0,
- "Infected preds" = 0,
-
- FACTION_PMC = 0,
- FACTION_CLF = 0,
- FACTION_UPP = 0,
- FACTION_TWE = 0,
- FACTION_FREELANCER = 0,
- FACTION_SURVIVOR = 0,
- FACTION_WY_DEATHSQUAD = 0,
- FACTION_COLONIST = 0,
- FACTION_MERCENARY = 0,
- FACTION_DUTCH = 0,
- FACTION_HEFA = 0,
- FACTION_GLADIATOR = 0,
- FACTION_PIRATE = 0,
- FACTION_PIZZA = 0,
- FACTION_SOUTO = 0,
-
- FACTION_NEUTRAL = 0,
-
- FACTION_ZOMBIE = 0
- )
-
- var/list/counted_xenos = list()
-
- var/players = length(GLOB.clients)
-
- var/dat = "Current Players:
"
- var/list/Lines = list()
- if(admin_holder && ((R_ADMIN & admin_holder.rights) || (R_MOD & admin_holder.rights)))
- for(var/client/C in GLOB.clients)
- if(!CLIENT_HAS_RIGHTS(src, R_STEALTH) && (CLIENT_IS_STEALTHED(C)))
- continue
- var/entry = "[C.key]"
- if(C.mob) //Juuuust in case
- if(istype(C.mob, /mob/new_player))
- entry += " - In Lobby"
- counted_humanoids["Lobby"]++
- else
- entry += " - Playing as [C.mob.real_name]"
-
- if(isobserver(C.mob))
- counted_humanoids["Observers"]++
- if(C.admin_holder?.rights & R_MOD)
- counted_humanoids["Admin observers"]++
- counted_humanoids["Observers"]--
- var/mob/dead/observer/O = C.mob
- if(O.started_as_observer)
- entry += " - Observing"
- else
- entry += " - DEAD"
- else
- switch(C.mob.stat)
- if(UNCONSCIOUS)
- entry += " - Unconscious"
- if(DEAD)
- entry += " - DEAD"
-
- if(C.mob && C.mob.stat != DEAD)
- if(ishuman(C.mob))
- if(C.mob.faction == FACTION_ZOMBIE)
- counted_humanoids[FACTION_ZOMBIE]++
- entry += " - Zombie"
- else if(C.mob.faction == FACTION_YAUTJA)
- counted_humanoids[FACTION_YAUTJA]++
- entry += " - Predator"
- if(C.mob.status_flags & XENO_HOST)
- counted_humanoids["Infected preds"]++
- else
- counted_humanoids["Humans"]++
- if(C.mob.status_flags & XENO_HOST)
- counted_humanoids["Infected humans"]++
- if(C.mob.faction == FACTION_MARINE)
- counted_humanoids[FACTION_MARINE]++
- if(C.mob.job in (GLOB.ROLES_MARINES))
- counted_humanoids["USCM Marines"]++
- else
- counted_humanoids[C.mob.faction]++
- else if(isxeno(C.mob))
- var/mob/living/carbon/xenomorph/X = C.mob
- counted_xenos[X.hivenumber]++
- if(X.faction == FACTION_PREDALIEN)
- counted_xenos[FACTION_PREDALIEN]++
- entry += " - Xenomorph"
- entry += " (?)"
- Lines += entry
-
- for(var/line in sortList(Lines))
- dat += "[line]
"
- dat += "Total Players: [players]"
- dat += "
In Lobby: [counted_humanoids["Lobby"]]"
- dat += "
Observers: [counted_humanoids["Observers"]] players and [counted_humanoids["Admin observers"]] staff members"
- dat += "
Humans: [counted_humanoids["Humans"]] (Infected: [counted_humanoids["Infected humans"]])"
- if(counted_humanoids[FACTION_MARINE])
- dat += "
USCM personnel: [counted_humanoids[FACTION_MARINE]] (Marines: [counted_humanoids["USCM Marines"]])"
- if(counted_humanoids[FACTION_YAUTJA])
- dat += "
Predators: [counted_humanoids[FACTION_YAUTJA]] [counted_humanoids["Infected preds"] ? "(Infected: [counted_humanoids["Infected preds"]])" : ""]"
- if(counted_humanoids[FACTION_ZOMBIE])
- dat += "
Zombies: [counted_humanoids[FACTION_ZOMBIE]]"
-
- var/show_fact = TRUE
- for(var/i in 10 to LAZYLEN(counted_humanoids) - 2)
- if(counted_humanoids[counted_humanoids[i]])
- if(show_fact)
- dat += "
Other factions:"
- show_fact = FALSE
- dat += "
[counted_humanoids[i]]: [counted_humanoids[counted_humanoids[i]]]"
- if(counted_humanoids[FACTION_NEUTRAL])
- dat += "
[FACTION_NEUTRAL] Humans: [counted_humanoids[FACTION_NEUTRAL]]"
-
- show_fact = TRUE
- var/datum/hive_status/hive
- for(var/hivenumber in counted_xenos)
- // Print predalien counts last
- if(hivenumber == FACTION_PREDALIEN)
- continue
- if(show_fact)
- dat += "
Xenomorphs:"
- show_fact = FALSE
- hive = GLOB.hive_datum[hivenumber]
- if(hive)
- dat += "
[hive.name]: [counted_xenos[hivenumber]] (Queen: [hive.living_xeno_queen ? "Alive" : "Dead"])"
- else
- dat += "
Error: no hive datum detected for [hivenumber]."
- hive = null
- if(counted_xenos[FACTION_PREDALIEN])
- dat += "
Predaliens: [counted_xenos[FACTION_PREDALIEN]]"
-
- else
- for(var/client/C in GLOB.clients)
- if((C.admin_holder && C.admin_holder.fakekey) || (CLIENT_IS_STEALTHED(C)))
- continue
-
- Lines += C.key
- for(var/line in sortList(Lines))
- dat += "[line]
"
- dat += "Total Players: [players]
"
-
- dat += ""
- show_browser(usr, dat, "Who", "who", "size=600x800")
-
-
-/client/verb/staffwho()
- set name = "Staffwho"
- set category = "Admin"
-
- var/dat = ""
- var/list/mappings
- if(CONFIG_GET(flag/show_manager))
- LAZYSET(mappings, "Management", R_PERMISSIONS)
- if(CONFIG_GET(flag/show_devs))
- LAZYSET(mappings, "Maintainers", R_PROFILER)
- LAZYSET(mappings, "Admins", R_ADMIN)
- if(CONFIG_GET(flag/show_mods))
- LAZYSET(mappings, "Moderators", R_MOD)
- if(CONFIG_GET(flag/show_mentors))
- LAZYSET(mappings, "Mentors", R_MENTOR)
-
- var/list/listings
- for(var/category in mappings)
- LAZYSET(listings, category, list())
-
- for(var/client/C in GLOB.admins)
- if(CLIENT_IS_STEALTHED(C) && !CLIENT_HAS_RIGHTS(src, R_STEALTH))
- continue
- if(C.admin_holder?.fakekey && !CLIENT_IS_STAFF(src))
- continue
- for(var/category in mappings)
- if(CLIENT_HAS_RIGHTS(C, mappings[category]))
- LAZYADD(listings[category], C)
- break
-
- for(var/category in listings)
- dat += "
Current [category] ([length(listings[category])]):
\n"
- for(var/client/entry in listings[category])
- dat += "\t[entry.key] is \a [entry.admin_holder.rank]"
- if(LAZYLEN(entry.admin_holder.extra_titles))
- for(var/srank in entry.admin_holder.extra_titles)
- dat += " & [srank]"
- if(CLIENT_IS_STAFF(src))
- if(CLIENT_IS_STEALTHED(entry))
- dat += " (STEALTHED)"
- else if(entry.admin_holder?.fakekey)
- dat += " (HIDDEN)"
- if(istype(entry.mob, /mob/dead/observer))
- dat += " - Observing"
- else if(istype(entry.mob, /mob/new_player))
- dat += " - Lobby"
- else
- dat += " - Playing"
- if(entry.is_afk())
- dat += " (AFK)"
- dat += "
"
- dat += "