From c2263d59ee328677929c7bdd7388d9493b000b78 Mon Sep 17 00:00:00 2001
From: SatinIsle <98125273+SatinIsle@users.noreply.github.com>
Date: Tue, 2 Apr 2024 10:10:11 +0100
Subject: [PATCH 01/43] Ports "No Shoes" from RogueStar (#15893)
* Ports No Shoes from RogueStar
Added the ability to choose to spawn with no shoes in character setup. This was ported from RogueStar: https://github.com/TS-Rogue-Star/Rogue-Star/pull/196
* Small fix
---
code/datums/outfits/outfit.dm | 3 ++-
code/game/jobs/job_controller.dm | 4 ++++
.../client/preference_setup/general/04_equipment.dm | 8 ++++++++
code/modules/client/preferences.dm | 1 +
4 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/code/datums/outfits/outfit.dm b/code/datums/outfits/outfit.dm
index ef7e9ea8ee9..b27093934e0 100644
--- a/code/datums/outfits/outfit.dm
+++ b/code/datums/outfits/outfit.dm
@@ -127,7 +127,8 @@ var/list/outfits_decls_by_type_
if(gloves)
H.equip_to_slot_or_del(new gloves(H),slot_gloves)
if(shoes)
- H.equip_to_slot_or_del(new shoes(H),slot_shoes)
+ if(!(H.client?.prefs?.shoe_hater)) //RS ADD
+ H.equip_to_slot_or_del(new shoes(H),slot_shoes)
if(mask)
H.equip_to_slot_or_del(new mask(H),slot_wear_mask)
if(head)
diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm
index 8f1f409b66a..6091fc0e7b3 100644
--- a/code/game/jobs/job_controller.dm
+++ b/code/game/jobs/job_controller.dm
@@ -430,6 +430,8 @@ var/global/datum/controller/occupations/job_master
//if(G.slot == slot_wear_mask || G.slot == slot_wear_suit || G.slot == slot_head)
// custom_equip_leftovers += thing
//else
+ if(G.slot == slot_shoes && H.client?.prefs?.shoe_hater) //RS ADD
+ continue
if(H.equip_to_slot_or_del(G.spawn_item(H, metadata), G.slot))
to_chat(H, "Equipping you with \the [thing]!")
if(G.slot != slot_tie)
@@ -455,6 +457,8 @@ var/global/datum/controller/occupations/job_master
// If some custom items could not be equipped before, try again now.
for(var/thing in custom_equip_leftovers)
var/datum/gear/G = gear_datums[thing]
+ if(G.slot == slot_shoes && H.client?.prefs?.shoe_hater) //RS ADD
+ continue
if(G.slot in custom_equip_slots)
spawn_in_storage += thing
else
diff --git a/code/modules/client/preference_setup/general/04_equipment.dm b/code/modules/client/preference_setup/general/04_equipment.dm
index be0cc95a40a..692e4f7d57b 100644
--- a/code/modules/client/preference_setup/general/04_equipment.dm
+++ b/code/modules/client/preference_setup/general/04_equipment.dm
@@ -13,6 +13,7 @@
S["pdachoice"] >> pref.pdachoice
S["communicator_visibility"] >> pref.communicator_visibility
S["ringtone"] >> pref.ringtone
+ S["shoe_hater"] >> pref.shoe_hater //RS ADD
/datum/category_item/player_setup_item/general/equipment/save_character(var/savefile/S)
S["all_underwear"] << pref.all_underwear
@@ -21,6 +22,7 @@
S["pdachoice"] << pref.pdachoice
S["communicator_visibility"] << pref.communicator_visibility
S["ringtone"] << pref.ringtone
+ S["shoe_hater"] << pref.shoe_hater //RS ADD
var/global/list/valid_ringtones = list(
"beep",
@@ -120,6 +122,7 @@ var/global/list/valid_ringtones = list(
. += "PDA Type: [pdachoicelist[pref.pdachoice]]
"
. += "Communicator Visibility: [(pref.communicator_visibility) ? "Yes" : "No"]
"
. += "Ringtone (leave blank for job default): [pref.ringtone]
"
+ . += "Spawn With Shoes:[(pref.shoe_hater) ? "No" : "Yes"]
" //RS Addition
return jointext(.,null)
@@ -188,5 +191,10 @@ var/global/list/valid_ringtones = list(
else
pref.ringtone = choice
return TOPIC_REFRESH
+ else if(href_list["toggle_shoes"]) //RS ADD START
+ if(CanUseTopic(user))
+ pref.shoe_hater = !pref.shoe_hater
+ return TOPIC_REFRESH
+ //RS ADD END
return ..()
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 275c1b095cd..70a93c819bb 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -50,6 +50,7 @@ var/list/preferences_datums = list()
var/blood_reagents = "default" //blood restoration reagents
var/backbag = 2 //backpack type
var/pdachoice = 1 //PDA type
+ var/shoe_hater = FALSE //RS ADD - if true, will spawn with no shoes
var/h_style = "Bald" //Hair type
var/r_hair = 0 //Hair color
var/g_hair = 0 //Hair color
From 4a8b7c0067247b1bd475875eaba5e16f6cece93f Mon Sep 17 00:00:00 2001
From: SatinIsle <98125273+SatinIsle@users.noreply.github.com>
Date: Tue, 2 Apr 2024 10:12:53 +0100
Subject: [PATCH 02/43] Reduces the cost of the bluespace bracelet. (#15895)
Changed the cost of the bluespace bracelet in the loadout from 5 to 2.
---
.../client/preference_setup/loadout/loadout_utility_vr.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/client/preference_setup/loadout/loadout_utility_vr.dm b/code/modules/client/preference_setup/loadout/loadout_utility_vr.dm
index 2bd6fccfff7..b81ec92cc1b 100644
--- a/code/modules/client/preference_setup/loadout/loadout_utility_vr.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_utility_vr.dm
@@ -72,7 +72,7 @@
/datum/gear/utility/bs_bracelet
display_name = "bluespace bracelet"
path = /obj/item/clothing/gloves/bluespace
- cost = 5
+ cost = 2
/datum/gear/utility/walkpod
display_name = "podzu music player"
From e51e5281f5bb1967f35f04d025f9c313789ce508 Mon Sep 17 00:00:00 2001
From: Kashargul <144968721+Kashargul@users.noreply.github.com>
Date: Tue, 2 Apr 2024 11:14:13 +0200
Subject: [PATCH 03/43] robot outsider overhaul (#15894)
* robot outsider overhaul
* .
* adds icon and defines
---
code/__defines/admin_vr.dm | 2 +
code/modules/admin/verbs/modify_robot.dm | 41 +++++++++++++++---
.../modules/mob/living/silicon/robot/robot.dm | 27 ++++++++----
.../silicon/robot/subtypes/gravekeeper.dm | 1 +
.../silicon/robot/subtypes/lost_drone.dm | 3 +-
.../silicon/robot/subtypes/syndicate.dm | 14 +++++-
.../mob/living/silicon/robot/syndicate.dm | 27 ------------
icons/mob/screen1_robot.dmi | Bin 133200 -> 129902 bytes
vorestation.dme | 1 -
9 files changed, 72 insertions(+), 44 deletions(-)
delete mode 100644 code/modules/mob/living/silicon/robot/syndicate.dm
diff --git a/code/__defines/admin_vr.dm b/code/__defines/admin_vr.dm
index 83eb907f3c4..40e408d3ed7 100644
--- a/code/__defines/admin_vr.dm
+++ b/code/__defines/admin_vr.dm
@@ -16,5 +16,7 @@
#define MODIFIY_ROBOT_SWAP_MODULE "Swap a Robot Module"
#define MODIFIY_ROBOT_RESET_MODULE "Fully Reset Robot Module"
#define MODIFIY_ROBOT_TOGGLE_ERT "Toggle ERT Module Overwrite"
+#define MODIFIY_ROBOT_LIMIT_MODULES_ADD "Restrict Modules to"
+#define MODIFIY_ROBOT_LIMIT_MODULES_REMOVE "Remove from restricted Modules"
#define MODIFIY_ROBOT_TOGGLE_STATION_ACCESS "Toggle All Station Access Codes"
#define MODIFIY_ROBOT_TOGGLE_CENT_ACCESS "Toggle Central Access Codes"
diff --git a/code/modules/admin/verbs/modify_robot.dm b/code/modules/admin/verbs/modify_robot.dm
index 68a7263fa28..8ba307efac6 100644
--- a/code/modules/admin/verbs/modify_robot.dm
+++ b/code/modules/admin/verbs/modify_robot.dm
@@ -10,11 +10,42 @@
return
if(!target.module)
- if(tgui_alert(usr, "This robot has not yet selected a module. Would you like to toggle combat module override?","Confirm",list("Yes","No"))!="Yes")
- return
- target.crisis_override = !target.crisis_override
- to_chat(usr, "You [target.crisis_override? "enabled":"disabled"] [target]'s combat module overwrite.")
- return
+ var/list/pre_modification_options = list(MODIFIY_ROBOT_TOGGLE_ERT, MODIFIY_ROBOT_LIMIT_MODULES_ADD, MODIFIY_ROBOT_LIMIT_MODULES_REMOVE)
+ while(TRUE)
+ var/pre_modification_choice = tgui_input_list(usr, "Which pre module selection edits would you like to perform form [target]","Choice", pre_modification_options)
+ if(!pre_modification_choice || pre_modification_choice == "Cancel")
+ return
+ switch(pre_modification_choice)
+ if(MODIFIY_ROBOT_TOGGLE_ERT)
+ if(tgui_alert(usr, "This robot has not yet selected a module. Would you like to toggle combat module override?","Confirm",list("Yes","No"))!="Yes")
+ continue
+ target.crisis_override = !target.crisis_override
+ to_chat(usr, "You [target.crisis_override? "enabled":"disabled"] [target]'s combat module overwrite.")
+ continue
+ if(MODIFIY_ROBOT_LIMIT_MODULES_ADD)
+ if(target.restrict_modules_to.len)
+ to_chat(usr, "[target]'s modules are already restricted. For details you can use the remove verb to show all active restrictions.")
+ var/list/possible_options = list()
+ for(var/entry in robot_modules)
+ if(!target.restrict_modules_to.Find(entry))
+ possible_options += entry
+ while(TRUE)
+ var/selected_type = tgui_input_list(usr, "Please select the module type to add to the robot's restrictions. This will limit the module choices to the added types only.", "Module types", possible_options)
+ if(!selected_type || selected_type == "Cancel")
+ break
+ possible_options -= selected_type
+ target.restrict_modules_to += selected_type
+ to_chat(usr, "You added [selected_type] to [target]'s possible modules list.")
+ continue
+ if(MODIFIY_ROBOT_LIMIT_MODULES_REMOVE)
+ while(TRUE)
+ var/selected_type = tgui_input_list(usr, "Please select the module type to remove. Removing all module types here will allow default station module selection.", "Module types", target.restrict_modules_to)
+ if(!selected_type || selected_type == "Cancel")
+ to_chat(usr, "[target] uses the default module list without special restrictions.")
+ break
+ target.restrict_modules_to -= selected_type
+ to_chat(usr, "You removed [selected_type] from [target]'s possible modules list.")
+ continue
if(!target.module.modules)
return
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index bd7f419f7f6..0c0d39c4fdf 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -64,6 +64,9 @@
var/sleeper_state = 0 // 0 for empty, 1 for normal, 2 for mediborg-healthy
var/scrubbing = FALSE //Floor cleaning enabled
+ // Subtype limited modules or admin restrictions
+ var/list/restrict_modules_to = list()
+
// Components are basically robot organs.
var/list/components = list()
@@ -322,15 +325,21 @@
var/list/modules = list()
//VOREStatation Edit Start: shell restrictions
if(shell)
- modules.Add(shell_module_types)
+ if(restrict_modules_to.len > 0)
+ modules.Add(restrict_modules_to)
+ else
+ modules.Add(shell_module_types)
else
- modules.Add(robot_module_types)
- if(crisis || security_level == SEC_LEVEL_RED || crisis_override)
- to_chat(src, span_red("Crisis mode active. Combat module available."))
- modules |= emergency_module_types
- for(var/module_name in whitelisted_module_types)
- if(is_borg_whitelisted(src, module_name))
- modules |= module_name
+ if(restrict_modules_to.len > 0)
+ modules.Add(restrict_modules_to)
+ else
+ modules.Add(robot_module_types)
+ if(crisis || security_level == SEC_LEVEL_RED || crisis_override)
+ to_chat(src, span_red("Crisis mode active. Combat module available."))
+ modules |= emergency_module_types
+ for(var/module_name in whitelisted_module_types)
+ if(is_borg_whitelisted(src, module_name))
+ modules |= module_name
//VOREStatation Edit End: shell restrictions
modtype = tgui_input_list(usr, "Please, select a module!", "Robot module", modules)
@@ -1249,6 +1258,8 @@
icon_selected = 1
icon_selection_tries = 0
sprite_type = robot_species
+ if(hands)
+ update_hud()
to_chat(src, "Your icon has been set. You now require a module reset to change it.")
/mob/living/silicon/robot/proc/set_default_module_icon()
diff --git a/code/modules/mob/living/silicon/robot/subtypes/gravekeeper.dm b/code/modules/mob/living/silicon/robot/subtypes/gravekeeper.dm
index 684dd9feee8..92a0819878e 100644
--- a/code/modules/mob/living/silicon/robot/subtypes/gravekeeper.dm
+++ b/code/modules/mob/living/silicon/robot/subtypes/gravekeeper.dm
@@ -8,6 +8,7 @@
idcard_type = /obj/item/weapon/card/id
icon_selected = FALSE
can_be_antagged = FALSE
+ restrict_modules_to = list("Gravekeeper")
/mob/living/silicon/robot/gravekeeper/init()
aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src)
diff --git a/code/modules/mob/living/silicon/robot/subtypes/lost_drone.dm b/code/modules/mob/living/silicon/robot/subtypes/lost_drone.dm
index d943a4f0083..c32c8d92fcc 100644
--- a/code/modules/mob/living/silicon/robot/subtypes/lost_drone.dm
+++ b/code/modules/mob/living/silicon/robot/subtypes/lost_drone.dm
@@ -7,6 +7,7 @@
braintype = "Drone"
idcard_type = /obj/item/weapon/card/id
icon_selected = FALSE
+ restrict_modules_to = list("Lost")
/mob/living/silicon/robot/lost/init()
aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src)
@@ -298,4 +299,4 @@
- return
\ No newline at end of file
+ return
diff --git a/code/modules/mob/living/silicon/robot/subtypes/syndicate.dm b/code/modules/mob/living/silicon/robot/subtypes/syndicate.dm
index 96dffd26e70..398c49775c5 100644
--- a/code/modules/mob/living/silicon/robot/subtypes/syndicate.dm
+++ b/code/modules/mob/living/silicon/robot/subtypes/syndicate.dm
@@ -1,11 +1,13 @@
/mob/living/silicon/robot/syndicate
lawupdate = 0
scrambledcodes = 1
+ emagged = 1
modtype = "Syndicate"
lawchannel = "State"
braintype = "Drone"
idcard_type = /obj/item/weapon/card/id/syndicate
icon_selected = FALSE
+ restrict_modules_to = list("Protector", "Mechanist", "Combat Medic")
/mob/living/silicon/robot/syndicate/init()
aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src)
@@ -17,7 +19,9 @@
updatename("Syndicate")
if(!cell)
- cell = new /obj/item/weapon/cell/high(src) // 15k cell, because Antag.
+ cell = new /obj/item/weapon/cell/robot_syndi(src) // 25k cell, because Antag.
+
+ // new /obj/item/weapon/robot_module/robot/syndicate(src)
laws = new /datum/ai_laws/syndicate_override()
@@ -29,17 +33,23 @@
/mob/living/silicon/robot/syndicate/protector/init()
..()
module = new /obj/item/weapon/robot_module/robot/syndicate/protector(src)
+ modtype = "Protector"
+ restrict_modules_to = list("Protector")
updatename("Protector")
/mob/living/silicon/robot/syndicate/mechanist/init()
..()
module = new /obj/item/weapon/robot_module/robot/syndicate/mechanist(src)
+ modtype = "Mechanist"
+ restrict_modules_to = list("Mechanist")
updatename("Mechanist")
/mob/living/silicon/robot/syndicate/combat_medic/init()
..()
module = new /obj/item/weapon/robot_module/robot/syndicate/combat_medic(src)
+ modtype = "Combat Medic"
+ restrict_modules_to = list("Combat Medic")
updatename("Combat Medic")
/mob/living/silicon/robot/syndicate/speech_bubble_appearance()
- return "synthetic_evil"
\ No newline at end of file
+ return "synthetic_evil"
diff --git a/code/modules/mob/living/silicon/robot/syndicate.dm b/code/modules/mob/living/silicon/robot/syndicate.dm
deleted file mode 100644
index e7766089753..00000000000
--- a/code/modules/mob/living/silicon/robot/syndicate.dm
+++ /dev/null
@@ -1,27 +0,0 @@
-/mob/living/silicon/robot/syndicate
- lawupdate = 0
- scrambledcodes = 1
- emagged = 1
- icon_state = "securityrobot"
- modtype = "Security"
- lawchannel = "State"
- idcard_type = /obj/item/weapon/card/id/syndicate
-
-/mob/living/silicon/robot/syndicate/New()
- if(!cell)
- cell = new /obj/item/weapon/cell/robot_syndi(src)
-
- ..()
-
-/mob/living/silicon/robot/syndicate/init()
- aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src)
-
- laws = new /datum/ai_laws/syndicate_override
- cut_overlays()
- init_id()
- new /obj/item/weapon/robot_module/robot/syndicate(src)
-
- radio.keyslot = new /obj/item/device/encryptionkey/syndicate(radio)
- radio.recalculateChannels()
-
- playsound(src, 'sound/mecha/nominalsyndi.ogg', 75, 0)
diff --git a/icons/mob/screen1_robot.dmi b/icons/mob/screen1_robot.dmi
index ace46891695c4502e09d1793ef63e3c7e968b7ef..98f475349c8d563c7ba6817ae72937ae4c4792f5 100644
GIT binary patch
literal 129902
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