From d9c2f8e016dd606185cb33e0420bb68f2fe77d7e Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sat, 15 Jun 2024 01:15:31 +0000 Subject: [PATCH 01/82] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-6327.yml | 5 ----- html/changelogs/AutoChangeLog-pr-6374.yml | 4 ---- html/changelogs/AutoChangeLog-pr-6383.yml | 9 -------- html/changelogs/AutoChangeLog-pr-6396.yml | 4 ---- html/changelogs/AutoChangeLog-pr-6437.yml | 4 ---- html/changelogs/AutoChangeLog-pr-6440.yml | 4 ---- html/changelogs/AutoChangeLog-pr-6445.yml | 4 ---- html/changelogs/AutoChangeLog-pr-6446.yml | 4 ---- html/changelogs/AutoChangeLog-pr-6448.yml | 4 ---- html/changelogs/AutoChangeLog-pr-6451.yml | 4 ---- html/changelogs/archive/2024-06.yml | 26 +++++++++++++++++++++++ 11 files changed, 26 insertions(+), 46 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-6327.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6374.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6383.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6396.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6437.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6440.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6445.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6446.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6448.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6451.yml diff --git a/html/changelogs/AutoChangeLog-pr-6327.yml b/html/changelogs/AutoChangeLog-pr-6327.yml deleted file mode 100644 index 60ce99f80c65..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6327.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Comxy" -delete-after: True -changes: - - rscadd: "Adds W-Y branded sentries." - - imageadd: "Adds W-Y defenses sprites." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6374.yml b/html/changelogs/AutoChangeLog-pr-6374.yml deleted file mode 100644 index 8e7517420a2a..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6374.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "AndroBetel" -delete-after: True -changes: - - balance: "Pistol mag pouch now has 4 slots instead of 3." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6383.yml b/html/changelogs/AutoChangeLog-pr-6383.yml deleted file mode 100644 index fbae59970bbe..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6383.yml +++ /dev/null @@ -1,9 +0,0 @@ -author: "Zonespace, Zydras" -delete-after: True -changes: - - bugfix: "Vehicle elevator no longer incorrectly rotates vehicles" - - rscadd: "New ARC exterior and interior" - - balance: "ARC now fits 5 humans instead of 7" - - balance: "ARC now fits 4 xenos intead of 5" - - balance: "ARC's RE700 turret armor pen 10->15" - - balance: "On account of the smaller size, the ARC no longer has a nanomed." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6396.yml b/html/changelogs/AutoChangeLog-pr-6396.yml deleted file mode 100644 index 72102a2279a9..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6396.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "harryob" -delete-after: True -changes: - - bugfix: "the preview window in character setup now remains visible when looking at it as a ghost" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6437.yml b/html/changelogs/AutoChangeLog-pr-6437.yml deleted file mode 100644 index 45618bc2b382..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6437.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Zonespace27" -delete-after: True -changes: - - bugfix: "Pyro spec flamer should be linked to its tank more consistently." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6440.yml b/html/changelogs/AutoChangeLog-pr-6440.yml deleted file mode 100644 index 4f64202d853f..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6440.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Blundir" -delete-after: True -changes: - - imageadd: "resprite of spearhead cmb revolver" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6445.yml b/html/changelogs/AutoChangeLog-pr-6445.yml deleted file mode 100644 index 694311d57f85..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6445.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Drathek" -delete-after: True -changes: - - bugfix: "Fixed Queen Mother being unable to award a Queen" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6446.yml b/html/changelogs/AutoChangeLog-pr-6446.yml deleted file mode 100644 index 501a49639c3a..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6446.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Drathek" -delete-after: True -changes: - - rscadd: "Added preference for toggling the fax machine received sound as an observer" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6448.yml b/html/changelogs/AutoChangeLog-pr-6448.yml deleted file mode 100644 index 02a85debf028..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6448.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Zonespace27" -delete-after: True -changes: - - qol: "Added some missing objectives to the xenomorph - basic tutorial." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6451.yml b/html/changelogs/AutoChangeLog-pr-6451.yml deleted file mode 100644 index 2879e1dd9836..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6451.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "TheGamerdk" -delete-after: True -changes: - - bugfix: "Fixes small issue allowing medals to teleport" \ No newline at end of file diff --git a/html/changelogs/archive/2024-06.yml b/html/changelogs/archive/2024-06.yml index 88cb6d1c551f..f8a21c842287 100644 --- a/html/changelogs/archive/2024-06.yml +++ b/html/changelogs/archive/2024-06.yml @@ -108,3 +108,29 @@ - balance: all OB 10 -> 5 intel points, one shell and five fuel fira: - rscadd: Added a Tutorial for tending to the Requisitions Line +2024-06-15: + AndroBetel: + - balance: Pistol mag pouch now has 4 slots instead of 3. + Blundir: + - imageadd: resprite of spearhead cmb revolver + Comxy: + - rscadd: Adds W-Y branded sentries. + - imageadd: Adds W-Y defenses sprites. + Drathek: + - bugfix: Fixed Queen Mother being unable to award a Queen + - rscadd: Added preference for toggling the fax machine received sound as an observer + TheGamerdk: + - bugfix: Fixes small issue allowing medals to teleport + Zonespace, Zydras: + - bugfix: Vehicle elevator no longer incorrectly rotates vehicles + - rscadd: New ARC exterior and interior + - balance: ARC now fits 5 humans instead of 7 + - balance: ARC now fits 4 xenos intead of 5 + - balance: ARC's RE700 turret armor pen 10->15 + - balance: On account of the smaller size, the ARC no longer has a nanomed. + Zonespace27: + - bugfix: Pyro spec flamer should be linked to its tank more consistently. + - qol: Added some missing objectives to the xenomorph - basic tutorial. + harryob: + - bugfix: the preview window in character setup now remains visible when looking + at it as a ghost From 46cc54bc468929f6844a61efc61feb0e116e74f5 Mon Sep 17 00:00:00 2001 From: Drathek <76988376+Drulikar@users.noreply.github.com> Date: Sat, 15 Jun 2024 07:05:58 -0700 Subject: [PATCH 02/82] Fix lots of problems with wallets as ID (#6411) # About the pull request This PR refactors all wear_id usages in favor of get_idcard() so that wallets can be suitable ID cards. I have not exhaustively tested all the areas of code that had to altered for this though. # Explain why it's good for the game Fixes #6409 # Testing Photographs and Procedure
Screenshots & Videos ![image](https://github.com/cmss13-devs/cmss13/assets/76988376/366594a0-29e7-40e5-a2f0-ee29aa9ed627)
# Changelog :cl: Drathek fix: Fixed wallets as IDs breaking many things /:cl: --- code/datums/medal_awards.dm | 8 ++-- code/defines/procs/announcement.dm | 3 +- code/game/jobs/job/job.dm | 2 +- code/game/jobs/job/marine/squads.dm | 10 ++--- code/game/machinery/ARES/ARES_interface.dm | 4 +- .../machinery/ARES/ARES_interface_apollo.dm | 8 ++-- .../game/machinery/ARES/ARES_step_triggers.dm | 11 +++-- code/game/machinery/ARES/apollo_pda.dm | 8 ++-- .../machinery/computer/almayer_control.dm | 6 +-- .../game/machinery/computer/communications.dm | 12 +++--- .../computer/groundside_operations.dm | 19 +++++---- code/game/machinery/vending/cm_vending.dm | 17 ++++---- .../machinery/vending/vendor_types/dress.dm | 12 +++--- code/game/objects/items/devices/cictablet.dm | 7 ++-- .../objects/items/devices/portable_vendor.dm | 4 +- .../objects/items/devices/radio/headset.dm | 6 +-- code/game/objects/items/pamphlets.dm | 6 +-- code/game/objects/items/storage/backpack.dm | 2 +- code/game/objects/items/storage/firstaid.dm | 4 +- .../closets/secure/secure_closets.dm | 30 +++++++------- .../admin/player_panel/actions/punish.dm | 11 ++--- code/modules/admin/tabs/event_tab.dm | 4 +- code/modules/admin/verbs/debug.dm | 12 +++--- code/modules/admin/verbs/mob_verbs.dm | 23 ++++++----- code/modules/admin/verbs/select_equipment.dm | 18 ++++----- .../modules/cm_marines/equipment/kit_boxes.dm | 8 ++-- code/modules/cm_marines/overwatch.dm | 39 +++++++++--------- code/modules/cm_marines/radar.dm | 12 +++--- code/modules/economy/ATM.dm | 40 ++++++++++--------- code/modules/gear_presets/uscm.dm | 4 +- .../mob/living/carbon/human/human_defines.dm | 2 +- .../mob/living/carbon/human/update_icons.dm | 7 +++- code/modules/shuttle/computer.dm | 8 +++- 33 files changed, 190 insertions(+), 177 deletions(-) diff --git a/code/datums/medal_awards.dm b/code/datums/medal_awards.dm index fcaef38c884c..6949951b7b61 100644 --- a/code/datums/medal_awards.dm +++ b/code/datums/medal_awards.dm @@ -256,7 +256,7 @@ GLOBAL_LIST_INIT(human_medals, list(MARINE_CONDUCT_MEDAL, MARINE_BRONZE_HEART_ME return TRUE /proc/open_medal_panel(mob/living/carbon/human/user, obj/printer) - var/obj/item/card/id/card = user.wear_id + var/obj/item/card/id/card = user?.get_idcard() if(!card) to_chat(user, SPAN_WARNING("You must have an authenticated ID Card to award medals.")) return @@ -580,9 +580,9 @@ GLOBAL_DATUM_INIT(ic_medals_panel, /datum/ic_medal_panel, new) . = ..() if(.) return - var/mob/living/carbon/human/user = usr - var/obj/item/card/id/card = user.wear_id - if(!card) + var/mob/living/carbon/human/user = ui.user + var/obj/item/card/id/card = user?.get_idcard() + if(card) to_chat(user, SPAN_WARNING("You must have an authenticated ID Card to award medals.")) return diff --git a/code/defines/procs/announcement.dm b/code/defines/procs/announcement.dm index bad07104db22..250c81dfc3dc 100644 --- a/code/defines/procs/announcement.dm +++ b/code/defines/procs/announcement.dm @@ -44,7 +44,8 @@ continue // If they have iff AND a marine headset they will recieve announcements - if ((FACTION_MARINE in H.wear_id?.faction_group) && (istype(H.wear_l_ear, /obj/item/device/radio/headset/almayer) || istype(H.wear_r_ear, /obj/item/device/radio/headset/almayer))) + var/obj/item/card/id/card = H.get_idcard() + if ((FACTION_MARINE in card?.faction_group) && (istype(H.wear_l_ear, /obj/item/device/radio/headset/almayer) || istype(H.wear_r_ear, /obj/item/device/radio/headset/almayer))) continue if((H.faction != faction_to_display && !add_PMCs) || (H.faction != faction_to_display && add_PMCs && !(H.faction in FACTION_LIST_WY)) && !(faction_to_display in H.faction_group)) //faction checks diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index 1a04c3cafeb5..d758e187ce70 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -176,7 +176,7 @@ var/datum/money_account/generated_account //Give them an account in the database. if(!(flags_startup_parameters & ROLE_NO_ACCOUNT)) - var/obj/item/card/id/card = account_user.wear_id + var/obj/item/card/id/card = account_user.get_idcard() var/user_has_preexisting_account = account_user.mind?.initial_account if(card && !user_has_preexisting_account) var/datum/paygrade/account_paygrade = GLOB.paygrades[card.paygrade] diff --git a/code/game/jobs/job/marine/squads.dm b/code/game/jobs/job/marine/squads.dm index 756369c8eb5b..3285e75e45c3 100644 --- a/code/game/jobs/job/marine/squads.dm +++ b/code/game/jobs/job/marine/squads.dm @@ -452,7 +452,7 @@ var/obj/item/card/id/C = ID if(!C) - C = M.wear_id + C = M.get_idcard() if(!C) C = M.get_active_hand() if(!istype(C)) @@ -554,7 +554,7 @@ return //not assigned to the correct squad var/obj/item/card/id/C = ID if(!istype(C)) - C = M.wear_id + C = M.get_idcard() if(!istype(C)) return FALSE //Abort, no ID found @@ -637,9 +637,9 @@ R.keys -= key qdel(key) R.recalculateChannels() - if(istype(old_lead.wear_id, /obj/item/card/id)) - var/obj/item/card/id/ID = old_lead.wear_id - ID.access -= ACCESS_MARINE_LEADER + var/obj/item/card/id/card = old_lead.get_idcard() + if(card) + card.access -= ACCESS_MARINE_LEADER REMOVE_TRAITS_IN(old_lead, TRAIT_SOURCE_SQUAD_LEADER) old_lead.hud_set_squad() old_lead.update_inv_head() //updating marine helmet leader overlays diff --git a/code/game/machinery/ARES/ARES_interface.dm b/code/game/machinery/ARES/ARES_interface.dm index 02695e2e6d4b..0316274774be 100644 --- a/code/game/machinery/ARES/ARES_interface.dm +++ b/code/game/machinery/ARES/ARES_interface.dm @@ -251,8 +251,8 @@ authentication = get_ares_access(idcard) last_login = idcard.registered_name else if(operator.wear_id) - idcard = operator.wear_id - if(istype(idcard)) + idcard = operator.get_idcard() + if(idcard) authentication = get_ares_access(idcard) last_login = idcard.registered_name else diff --git a/code/game/machinery/ARES/ARES_interface_apollo.dm b/code/game/machinery/ARES/ARES_interface_apollo.dm index 243ecdf1355f..93637f39d1a7 100644 --- a/code/game/machinery/ARES/ARES_interface_apollo.dm +++ b/code/game/machinery/ARES/ARES_interface_apollo.dm @@ -175,8 +175,8 @@ authentication = get_ares_access(idcard) last_login = idcard.registered_name else if(user.wear_id) - idcard = user.wear_id - if(istype(idcard)) + idcard = user.get_idcard() + if(idcard) authentication = get_ares_access(idcard) last_login = idcard.registered_name else @@ -317,8 +317,8 @@ if(istype(idcard)) has_id = TRUE else if(user.wear_id) - idcard = user.wear_id - if(istype(idcard)) + idcard = user.get_idcard() + if(idcard) has_id = TRUE if(!has_id) to_chat(user, SPAN_WARNING("You require an ID card to request an access ticket!")) diff --git a/code/game/machinery/ARES/ARES_step_triggers.dm b/code/game/machinery/ARES/ARES_step_triggers.dm index 2c6d605bcc9b..77a53200ddd3 100644 --- a/code/game/machinery/ARES/ARES_step_triggers.dm +++ b/code/game/machinery/ARES/ARES_step_triggers.dm @@ -33,9 +33,10 @@ return FALSE if(ishuman(passer)) var/mob/living/carbon/human/trespasser = passer - if(pass_accesses && (trespasser.wear_id)) + var/obj/item/card/id/card = trespasser.get_idcard() + if(pass_accesses && card) for(var/tag in pass_accesses) - if(tag in trespasser.wear_id.access) + if(tag in card.access) return FALSE Trigger(passer) return TRUE @@ -123,11 +124,9 @@ var/check_contents = TRUE if(ishuman(passer)) var/mob/living/carbon/human/human_passer = passer - idcard = human_passer.wear_id - if(istype(idcard)) + idcard = human_passer.get_idcard() + if(idcard) check_contents = FALSE - else - idcard = null if(istype(passer, /obj/item/card/id)) idcard = passer diff --git a/code/game/machinery/ARES/apollo_pda.dm b/code/game/machinery/ARES/apollo_pda.dm index 787b194ffb44..7b92b869daeb 100644 --- a/code/game/machinery/ARES/apollo_pda.dm +++ b/code/game/machinery/ARES/apollo_pda.dm @@ -198,8 +198,8 @@ authentication = get_ares_access(idcard) last_login = idcard.registered_name else if(user.wear_id) - idcard = user.wear_id - if(istype(idcard)) + idcard = user.get_idcard() + if(idcard) authentication = get_ares_access(idcard) last_login = idcard.registered_name else @@ -343,8 +343,8 @@ if(istype(idcard)) has_id = TRUE else if(user.wear_id) - idcard = user.wear_id - if(istype(idcard)) + idcard = user.get_idcard() + if(idcard) has_id = TRUE if(!has_id) to_chat(user, SPAN_WARNING("You require an ID card to request an access ticket!")) diff --git a/code/game/machinery/computer/almayer_control.dm b/code/game/machinery/computer/almayer_control.dm index 0090a6673961..8cd043e23998 100644 --- a/code/game/machinery/computer/almayer_control.dm +++ b/code/game/machinery/computer/almayer_control.dm @@ -139,7 +139,7 @@ var/obj/item/card/id/idcard = human_user.get_active_hand() var/bio_fail = FALSE if(!istype(idcard)) - idcard = human_user.wear_id + idcard = human_user.get_idcard() if(!istype(idcard)) bio_fail = TRUE else if(!idcard.check_biometrics(human_user)) @@ -198,8 +198,8 @@ var/obj/item/card/id/idcard = human_user.get_active_hand() var/bio_fail = FALSE if(!istype(idcard)) - idcard = human_user.wear_id - if(!istype(idcard)) + idcard = human_user.get_idcard() + if(!idcard) bio_fail = TRUE else if(!idcard.check_biometrics(human_user)) bio_fail = TRUE diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 6ed2a8c7be64..dec523ccc5b2 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -81,8 +81,8 @@ if(ACCESS_MARINE_SENIOR in I.access) authenticated = 2 else - I = C.wear_id - if(istype(I)) + I = C.get_idcard() + if(I) if(check_access(I)) authenticated = 1 if(ACCESS_MARINE_SENIOR in I.access) authenticated = 2 @@ -117,8 +117,8 @@ var/obj/item/card/id/idcard = human_user.get_active_hand() var/bio_fail = FALSE if(!istype(idcard)) - idcard = human_user.wear_id - if(!istype(idcard)) + idcard = human_user.get_idcard() + if(idcard) bio_fail = TRUE else if(!idcard.check_biometrics(human_user)) bio_fail = TRUE @@ -171,8 +171,8 @@ var/obj/item/card/id/idcard = human_user.get_active_hand() var/bio_fail = FALSE if(!istype(idcard)) - idcard = human_user.wear_id - if(!istype(idcard)) + idcard = human_user.get_idcard() + if(!idcard) bio_fail = TRUE else if(!idcard.check_biometrics(human_user)) bio_fail = TRUE diff --git a/code/game/machinery/computer/groundside_operations.dm b/code/game/machinery/computer/groundside_operations.dm index 6866905abc58..591c63a76bee 100644 --- a/code/game/machinery/computer/groundside_operations.dm +++ b/code/game/machinery/computer/groundside_operations.dm @@ -153,12 +153,11 @@ if(A) area_name = sanitize_area(A.name) + var/obj/item/card/id/card = H.get_idcard() if(H.job) role = H.job - else if(istype(H.wear_id, /obj/item/card/id)) //decapitated marine is mindless, - var/obj/item/card/id/ID = H.wear_id //we use their ID to get their role. - if(ID.rank) - role = ID.rank + else if(card?.rank) //decapitated marine is mindless, + role = card.rank switch(H.stat) if(CONSCIOUS) @@ -216,8 +215,8 @@ var/obj/item/card/id/idcard = human_user.get_active_hand() var/bio_fail = FALSE if(!istype(idcard)) - idcard = human_user.wear_id - if(!istype(idcard)) + idcard = human_user.get_idcard() + if(!idcard) bio_fail = TRUE else if(!idcard.check_biometrics(human_user)) bio_fail = TRUE @@ -244,8 +243,8 @@ var/signed = null if(ishuman(usr)) var/mob/living/carbon/human/H = usr - var/obj/item/card/id/id = H.wear_id - if(istype(id)) + var/obj/item/card/id/id = H.get_idcard() + if(id) var/paygrade = get_paygrades(id.paygrade, FALSE, H.gender) signed = "[paygrade] [id.registered_name]" @@ -322,8 +321,8 @@ var/obj/item/card/id/idcard = human_user.get_active_hand() var/bio_fail = FALSE if(!istype(idcard)) - idcard = human_user.wear_id - if(!istype(idcard)) + idcard = human_user.get_idcard() + if(!idcard) bio_fail = TRUE else if(!idcard.check_biometrics(human_user)) bio_fail = TRUE diff --git a/code/game/machinery/vending/cm_vending.dm b/code/game/machinery/vending/cm_vending.dm index 76a2b6df8e45..afce800b0af4 100644 --- a/code/game/machinery/vending/cm_vending.dm +++ b/code/game/machinery/vending/cm_vending.dm @@ -574,8 +574,8 @@ GLOBAL_LIST_EMPTY(vending_products) to_chat(user, SPAN_WARNING("That set is already taken.")) vend_fail() return FALSE - var/obj/item/card/id/ID = human_user.wear_id - if(!istype(ID) || !ID.check_biometrics(user)) + var/obj/item/card/id/card = human_user.get_idcard() + if(!card?.check_biometrics(user)) to_chat(user, SPAN_WARNING("You must be wearing your [SPAN_INFO("dog tags")] to select a specialization!")) return FALSE var/specialist_assignment @@ -604,8 +604,8 @@ GLOBAL_LIST_EMPTY(vending_products) to_chat(user, SPAN_WARNING("Something bad occurred with [src], tell a Dev.")) vend_fail() return FALSE - ID.set_assignment((human_user.assigned_squad ? (human_user.assigned_squad.name + " ") : "") + JOB_SQUAD_SPECIALIST + " ([specialist_assignment])") - GLOB.data_core.manifest_modify(user.real_name, WEAKREF(user), ID.assignment) + card.set_assignment((human_user.assigned_squad ? (human_user.assigned_squad.name + " ") : "") + JOB_SQUAD_SPECIALIST + " ([specialist_assignment])") + GLOB.data_core.manifest_modify(user.real_name, WEAKREF(user), card.assignment) GLOB.available_specialist_sets -= p_name else if(vendor_role.Find(JOB_SYNTH)) if(user.job != JOB_SYNTH) @@ -807,8 +807,8 @@ GLOBAL_LIST_EMPTY(vending_products) return FALSE var/mob/living/carbon/human/human_user = user - var/obj/item/card/id/idcard = human_user.wear_id - if(!istype(idcard)) + var/obj/item/card/id/idcard = human_user.get_idcard() + if(!idcard) if(display) to_chat(user, SPAN_WARNING("Access denied. No ID card detected")) vend_fail() @@ -1406,10 +1406,11 @@ GLOBAL_LIST_INIT(cm_vending_gear_corresponding_types_list, list( if(vend_flags & VEND_UNIFORM_RANKS) if(insignas_override) var/obj/item/clothing/under/underclothes = new_item + var/obj/item/card/id/card = user.get_idcard() //Gives ranks to the ranked - if(istype(underclothes) && user.wear_id && user.wear_id.paygrade) - var/rankpath = get_rank_pins(user.wear_id.paygrade) + if(istype(underclothes) && card?.paygrade) + var/rankpath = get_rank_pins(card.paygrade) if(rankpath) var/obj/item/clothing/accessory/ranks/rank_insignia = new rankpath() var/obj/item/clothing/accessory/patch/uscmpatch = new() diff --git a/code/game/machinery/vending/vendor_types/dress.dm b/code/game/machinery/vending/vendor_types/dress.dm index d49361d912a0..68809c10003f 100644 --- a/code/game/machinery/vending/vendor_types/dress.dm +++ b/code/game/machinery/vending/vendor_types/dress.dm @@ -45,11 +45,11 @@ return var/mob/living/carbon/human/H = user - var/obj/item/card/id/id_card = H.wear_id + var/obj/item/card/id/id_card = H.get_idcard() var/list/role_specific_uniforms var/list/vended_items var/list/display_list = list() - if(istype(id_card)) + if(id_card) role_specific_uniforms = id_card.uniform_sets vended_items = id_card.vended_items for(var/category_type in GLOB.uniform_categories) @@ -83,9 +83,9 @@ /obj/structure/machinery/cm_vending/clothing/dress/ui_data(mob/user) var/mob/living/carbon/human/H = user - var/obj/item/card/id/id_card = H.wear_id + var/obj/item/card/id/id_card = H.get_idcard() var/list/vended_items - if(istype(id_card)) + if(id_card) vended_items = id_card.vended_items var/list/data = list() @@ -120,9 +120,9 @@ var/item_path = L[3] - var/obj/item/card/id/id_card = H.wear_id + var/obj/item/card/id/id_card = H.get_idcard() - if(!istype(id_card)) //not wearing an ID + if(!id_card) //not wearing an ID to_chat(H, SPAN_WARNING("Access denied. No ID card detected")) return diff --git a/code/game/objects/items/devices/cictablet.dm b/code/game/objects/items/devices/cictablet.dm index de03f1779f2b..597886a0cb85 100644 --- a/code/game/objects/items/devices/cictablet.dm +++ b/code/game/objects/items/devices/cictablet.dm @@ -46,7 +46,8 @@ /obj/item/device/cotablet/attack_self(mob/living/carbon/human/user as mob) ..() - if(src.allowed(user) && user.wear_id?.check_biometrics(user)) + var/obj/item/card/id/card = user.get_idcard() + if(allowed(user) && card?.check_biometrics(user)) tgui_interact(user) else to_chat(user, SPAN_DANGER("Access denied.")) @@ -109,8 +110,8 @@ var/signed = null if(ishuman(user)) var/mob/living/carbon/human/human_user = user - var/obj/item/card/id/id = human_user.wear_id - if(istype(id)) + var/obj/item/card/id/id = human_user.get_idcard() + if(id) var/paygrade = get_paygrades(id.paygrade, FALSE, human_user.gender) signed = "[paygrade] [id.registered_name]" diff --git a/code/game/objects/items/devices/portable_vendor.dm b/code/game/objects/items/devices/portable_vendor.dm index f45eeadee5b7..3dd8533a046d 100644 --- a/code/game/objects/items/devices/portable_vendor.dm +++ b/code/game/objects/items/devices/portable_vendor.dm @@ -58,8 +58,8 @@ to_chat(user, SPAN_WARNING("Access denied.")) return - var/obj/item/card/id/idcard = human_user.wear_id - if(!istype(idcard)) //not wearing an ID + var/obj/item/card/id/idcard = human_user.get_idcard() + if(!idcard) //not wearing an ID to_chat(human_user, SPAN_WARNING("Access denied. No ID card detected")) return diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 52f8bd76e894..b9b7e94d9ae5 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -414,10 +414,10 @@ var/mob/living/carbon/human/wearer = usr if(!istype(wearer)) return - var/obj/item/card/id/id_card = wearer.wear_id?.GetID() - if(!istype(id_card)) + var/obj/item/card/id/id_card = wearer.get_idcard() + if(!id_card) return - + var/datum/paygrade/paygrade_actual = GLOB.paygrades[id_card.paygrade] if(!paygrade_actual) return diff --git a/code/game/objects/items/pamphlets.dm b/code/game/objects/items/pamphlets.dm index 027ea796c73b..d8bbb2a01432 100644 --- a/code/game/objects/items/pamphlets.dm +++ b/code/game/objects/items/pamphlets.dm @@ -80,8 +80,8 @@ to_chat(user, SPAN_WARNING("Only squad riflemen can use this.")) return - var/obj/item/card/id/ID = user.wear_id - if(!istype(ID)) //not wearing an ID + var/obj/item/card/id/ID = user.get_idcard() + if(!ID) //not wearing an ID to_chat(user, SPAN_WARNING("You should wear your ID before doing this.")) return FALSE if(!ID.check_biometrics(user)) @@ -95,7 +95,7 @@ user.rank_fallback = "ass" user.hud_set_squad() - var/obj/item/card/id/ID = user.wear_id + var/obj/item/card/id/ID = user.get_idcard() ID.set_assignment((user.assigned_squad ? (user.assigned_squad.name + " ") : "") + "Spotter") GLOB.data_core.manifest_modify(user.real_name, WEAKREF(user), "Spotter") diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 4882db3b83ea..baa91db19396 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -154,7 +154,7 @@ //Returns true if the user's id matches the lock's /obj/item/storage/backpack/proc/compare_id(mob/living/carbon/human/H) - var/obj/item/card/id/card = H.wear_id + var/obj/item/card/id/card = H.get_idcard() if(!card || locking_id.registered_name != card.registered_name) return FALSE else return TRUE diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index 314628bab9a3..f9f5983c925d 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -683,8 +683,8 @@ to_chat(user, SPAN_NOTICE("It must have some kind of ID lock...")) return FALSE - var/obj/item/card/id/idcard = human_user.wear_id - if(!istype(idcard)) //not wearing an ID + var/obj/item/card/id/idcard = human_user.get_idcard() + if(!idcard) //not wearing an ID to_chat(human_user, SPAN_NOTICE("It must have some kind of ID lock...")) return FALSE diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm index e65d28e96f33..6391eeefb498 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm @@ -45,37 +45,37 @@ src.req_access += pick(get_access(ACCESS_LIST_MARINE_MAIN)) /obj/structure/closet/secure_closet/proc/togglelock(mob/living/user) - if(src.opened) + if(opened) to_chat(user, SPAN_NOTICE("Close the locker first.")) return - if(src.broken) + if(broken) to_chat(user, SPAN_WARNING("The locker appears to be broken.")) return if(user.loc == src) to_chat(user, SPAN_NOTICE("You can't reach the lock from inside.")) return - if(src.allowed(user)) + if(allowed(user)) if(slotlocked && ishuman(user)) - var/mob/living/carbon/human/H = user - if(H.wear_id) - var/obj/item/card/id/I = H.wear_id - if(I.claimedgear) + var/mob/living/carbon/human/human = user + var/obj/item/card/id/card = human.get_idcard() + if(card) + if(card.claimedgear) return switch(slotlocktype) if("engi") - if(H.job != "Squad Combat Technician") + if(human.job != "Squad Combat Technician") return // stop people giving medics engineer prep access or IDs somehow if("medic") - if(H.job != "Squad Hospital Corpsman") + if(human.job != "Squad Hospital Corpsman") return // same here - I.claimedgear = 1 // you only get one locker, all other roles have this set 1 by default - slotlocked = 0 // now permanently unlockable + card.claimedgear = TRUE // you only get one locker, all other roles have this set 1 by default + slotlocked = FALSE // now permanently unlockable else return // they have no ID on, fuck them. - src.locked = !src.locked - for(var/mob/O in viewers(user, 3)) - if((O.client && !( O.blinded ))) - to_chat(O, SPAN_NOTICE("The locker has been [locked ? null : "un"]locked by [user].")) + locked = !locked + for(var/mob/mob in viewers(user, 3)) + if((mob.client && !( mob.blinded ))) + to_chat(mob, SPAN_NOTICE("The locker has been [locked ? null : "un"]locked by [user].")) update_icon() else to_chat(user, SPAN_NOTICE("Access Denied")) diff --git a/code/modules/admin/player_panel/actions/punish.dm b/code/modules/admin/player_panel/actions/punish.dm index 1b7d313b6121..5d2298fc8fc2 100644 --- a/code/modules/admin/player_panel/actions/punish.dm +++ b/code/modules/admin/player_panel/actions/punish.dm @@ -267,11 +267,12 @@ GLOB.data_core.manifest_modify(new_name, WEAKREF(target_mob)) if(ishuman(target_mob)) var/mob/living/carbon/human/target_human = target_mob - if(target_human.wear_id && target_human.wear_id.registered_ref == WEAKREF(target_human)) - target_human.wear_id.name = "[target_human.real_name]'s ID Card" - target_human.wear_id.registered_name = "[target_human.real_name]" - if(target_human.wear_id.assignment) - target_human.wear_id.name += " ([target_human.wear_id.assignment])" + var/obj/item/card/id/card = target_human.get_idcard() + if(card?.registered_ref == WEAKREF(target_human)) + card.name = "[target_human.real_name]'s ID Card" + card.registered_name = "[target_human.real_name]" + if(card.assignment) + card.name += " ([card.assignment])" target_mob.client.prefs.real_name = new_name target_mob.client.prefs.save_character() diff --git a/code/modules/admin/tabs/event_tab.dm b/code/modules/admin/tabs/event_tab.dm index 656314469066..69395e6e69e9 100644 --- a/code/modules/admin/tabs/event_tab.dm +++ b/code/modules/admin/tabs/event_tab.dm @@ -499,8 +499,8 @@ if(random_names) var/random_name = "[lowertext(H.species.name)] ([rand(1, 999)])" H.change_real_name(H, random_name) - if(H.wear_id) - var/obj/item/card/id/card = H.wear_id + var/obj/item/card/id/card = H.get_idcard() + if(card) card.registered_name = H.real_name card.name = "[card.registered_name]'s ID Card ([card.assignment])" diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 60c2092d8dc3..83e12be9c574 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -200,14 +200,14 @@ return if (istype(M, /mob/living/carbon/human)) var/mob/living/carbon/human/H = M - if (H.wear_id) - var/obj/item/card/id/id = H.wear_id + var/obj/item/card/id/id = H.get_idcard() + if(id) id.icon_state = "gold" - id:access = get_access(ACCESS_LIST_GLOBAL) + id.access = get_access(ACCESS_LIST_GLOBAL) else - var/obj/item/card/id/id = new/obj/item/card/id(M); + id = new(M) id.icon_state = "gold" - id:access = get_access(ACCESS_LIST_GLOBAL) + id.access = get_access(ACCESS_LIST_GLOBAL) id.registered_name = H.real_name id.registered_ref = WEAKREF(H) id.assignment = "Captain" @@ -266,7 +266,7 @@ var/datum/paygrade/account_paygrade = GLOB.paygrades[custom_paygrade] - var/obj/item/card/id/card = account_user.wear_id + var/obj/item/card/id/card = account_user.get_idcard() generated_account = create_account(account_user.real_name, starting_amount, account_paygrade) if(card) card.associated_account_number = generated_account.account_number diff --git a/code/modules/admin/verbs/mob_verbs.dm b/code/modules/admin/verbs/mob_verbs.dm index abb43461c2fe..3b4de192e78f 100644 --- a/code/modules/admin/verbs/mob_verbs.dm +++ b/code/modules/admin/verbs/mob_verbs.dm @@ -370,7 +370,7 @@ message_admins("[key_name(src)] changed hivenumber of [H] to [H.hivenumber].") -/client/proc/cmd_admin_change_their_name(mob/living/carbon/X) +/client/proc/cmd_admin_change_their_name(mob/living/carbon/carbon) set name = "Change Name" set category = null @@ -378,19 +378,20 @@ if(!newname) return - if(!X) + if(!carbon) to_chat(usr, "This mob no longer exists") return - var/old_name = X.name - X.change_real_name(X, newname) - if(istype(X, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = X - if(H.wear_id) - H.wear_id.name = "[H.real_name]'s ID Card" - H.wear_id.registered_name = "[H.real_name]" - if(H.wear_id.assignment) - H.wear_id.name += " ([H.wear_id.assignment])" + var/old_name = carbon.name + carbon.change_real_name(carbon, newname) + if(ishuman(carbon)) + var/mob/living/carbon/human/human = carbon + var/obj/item/card/id/card = human.get_idcard() + if(card) + card.name = "[human.real_name]'s ID Card" + card.registered_name = "[human.real_name]" + if(card.assignment) + card.name += " ([card.assignment])" message_admins("[key_name(src)] changed name of [old_name] to [newname].") diff --git a/code/modules/admin/verbs/select_equipment.dm b/code/modules/admin/verbs/select_equipment.dm index 7e78652c5c35..90269f70c1aa 100644 --- a/code/modules/admin/verbs/select_equipment.dm +++ b/code/modules/admin/verbs/select_equipment.dm @@ -10,15 +10,15 @@ var/newrank = tgui_input_list(usr, "Select new rank for [H]", "Change the mob's rank and skills", rank_list) if (!newrank) return - if(!H) + if(QDELETED(H)) return - var/obj/item/card/id/I = H.wear_id + var/obj/item/card/id/I = H.get_idcard() if(GLOB.RoleAuthority.roles_by_name[newrank]) var/datum/job/J = GLOB.RoleAuthority.roles_by_name[newrank] H.comm_title = J.get_comm_title() H.set_skills(J.get_skills()) - if(istype(I)) + if(I) I.access = J.get_access() I.rank = J.title I.assignment = J.disp_title @@ -48,7 +48,7 @@ if(!newskillset || newskillset == "Keep Skillset") return - if(!H) + if(QDELETED(H)) return var/datum/job/J = GLOB.RoleAuthority.roles_by_name[newskillset] @@ -58,25 +58,25 @@ var/newcommtitle = input("Write the custom title appearing on comms chat (e.g. Spc)", "Comms title") as null|text if(!newcommtitle) return - if(!H) + if(QDELETED(H)) return H.comm_title = newcommtitle - if(!istype(I) || I != H.wear_id) + if(!I || I != H.get_idcard()) to_chat(usr, "The mob has no id card, unable to modify ID and chat title.") else var/newchattitle = input("Write the custom title appearing in chat (e.g. SGT)", "Chat title") as null|text if(!newchattitle) return - if(!H || I != H.wear_id) + if(QDELETED(H) || I != H.get_idcard()) return I.paygrade = newchattitle var/IDtitle = input("Write the custom title on your ID (e.g. Squad Specialist)", "ID title") as null|text if(!IDtitle) return - if(!H || I != H.wear_id) + if(QDELETED(H) || I != H.get_idcard()) return I.rank = IDtitle @@ -92,7 +92,7 @@ if(!newskillset) return - if(!H) + if(QDELETED(H)) return var/datum/job/J = GLOB.RoleAuthority.roles_by_name[newskillset] diff --git a/code/modules/cm_marines/equipment/kit_boxes.dm b/code/modules/cm_marines/equipment/kit_boxes.dm index ebd9ca9dcbd9..149c68f2abda 100644 --- a/code/modules/cm_marines/equipment/kit_boxes.dm +++ b/code/modules/cm_marines/equipment/kit_boxes.dm @@ -257,8 +257,8 @@ if(!GLOB.available_specialist_kit_boxes[selection] || GLOB.available_specialist_kit_boxes[selection] <= 0) to_chat(user, SPAN_WARNING("No more kits of this type may be chosen!")) return FALSE - var/obj/item/card/id/ID = user.wear_id - if(!istype(ID) || ID.registered_ref != WEAKREF(user)) + var/obj/item/card/id/card = user.get_idcard() + if(!card || card.registered_ref != WEAKREF(user)) to_chat(user, SPAN_WARNING("You must be wearing your [SPAN_INFO("ID card")] or [SPAN_INFO("dog tags")] to select a specialization!")) return var/turf/T = get_turf(loc) @@ -297,8 +297,8 @@ user.skills.set_skill(SKILL_ENGINEER, SKILL_ENGINEER_TRAINED) if(specialist_assignment) user.put_in_hands(spec_box) - ID.set_assignment((user.assigned_squad && squad_assignment_update ? (user.assigned_squad.name + " ") : "") + ID.assignment + " ([specialist_assignment])") - GLOB.data_core.manifest_modify(user.real_name, WEAKREF(user), ID.assignment) + card.set_assignment((user.assigned_squad && squad_assignment_update ? (user.assigned_squad.name + " ") : "") + card.assignment + " ([specialist_assignment])") + GLOB.data_core.manifest_modify(user.real_name, WEAKREF(user), card.assignment) return TRUE return FALSE diff --git a/code/modules/cm_marines/overwatch.dm b/code/modules/cm_marines/overwatch.dm index 8dfd1dc3f929..84a27622959a 100644 --- a/code/modules/cm_marines/overwatch.dm +++ b/code/modules/cm_marines/overwatch.dm @@ -184,13 +184,11 @@ if(is_ground_level(current_turf.z)) continue + var/obj/item/card/id/card = marine_human.get_idcard() if(marine_human.job) role = marine_human.job - else if(istype(marine_human.wear_id, /obj/item/card/id)) //decapitated marine is mindless, - var/obj/item/card/id/ID = marine_human.wear_id //we use their ID to get their role. - if(ID.rank) - role = ID.rank - + else if(card?.rank) //decapitated marine is mindless, + role = card.rank if(current_squad.squad_leader) if(marine_human == current_squad.squad_leader) @@ -249,15 +247,14 @@ if(JOB_SQUAD_SPECIALIST) spec_count++ if(marine_human) - if(istype(marine_human.wear_id, /obj/item/card/id)) //decapitated marine is mindless, - var/obj/item/card/id/ID = marine_human.wear_id //we use their ID to get their role. - if(ID.assignment) - if(specialist_type) - specialist_type = "MULTIPLE" - else - var/list/spec_type = splittext(ID.assignment, "(") - if(islist(spec_type) && (length(spec_type) > 1)) - specialist_type = splittext(spec_type[2], ")")[1] + var/obj/item/card/id/card = marine_human.get_idcard() + if(card?.assignment) //decapitated marine is mindless, + if(specialist_type) + specialist_type = "MULTIPLE" + else + var/list/spec_type = splittext(card.assignment, "(") + if(islist(spec_type) && (length(spec_type) > 1)) + specialist_type = splittext(spec_type[2], ")")[1] else if(!specialist_type) specialist_type = "UNKNOWN" if(mob_state != "Dead") @@ -589,9 +586,9 @@ if(sl_headset) sl_headset.keys += new /obj/item/device/encryptionkey/squadlead/acting(sl_headset) sl_headset.recalculateChannels() - if(istype(selected_sl.wear_id, /obj/item/card/id)) - var/obj/item/card/id/ID = selected_sl.wear_id - ID.access += ACCESS_MARINE_LEADER + var/obj/item/card/id/card = selected_sl.get_idcard() + if(card) + card.access += ACCESS_MARINE_LEADER selected_sl.hud_set_squad() selected_sl.update_inv_head() //updating marine helmet leader overlays selected_sl.update_inv_wear_suit() @@ -696,7 +693,8 @@ to_chat(usr, "[icon2html(src, usr)] [SPAN_WARNING("[transfer_marine] is KIA.")]") return - if(!istype(transfer_marine.wear_id, /obj/item/card/id)) + var/obj/item/card/id/card = transfer_marine.get_idcard() + if(!card) to_chat(usr, "[icon2html(src, usr)] [SPAN_WARNING("Transfer aborted. [transfer_marine] isn't wearing an ID.")]") return @@ -713,7 +711,8 @@ to_chat(usr, "[icon2html(src, usr)] [SPAN_WARNING("[transfer_marine] is KIA.")]") return - if(!istype(transfer_marine.wear_id, /obj/item/card/id)) + card = transfer_marine.get_idcard() + if(!card) to_chat(usr, "[icon2html(src, usr)] [SPAN_WARNING("Transfer aborted. [transfer_marine] isn't wearing an ID.")]") return @@ -726,7 +725,7 @@ to_chat(usr, "[icon2html(src, usr)] [SPAN_WARNING("Transfer aborted. [new_squad] can't have another [transfer_marine.job].")]") return - . = transfer_marine_to_squad(transfer_marine, new_squad, old_squad) + . = transfer_marine_to_squad(transfer_marine, new_squad, old_squad, card) if(.) visible_message("[icon2html(src, viewers(src))] [SPAN_BOLDNOTICE("[transfer_marine] has been transfered from squad '[old_squad]' to squad '[new_squad]'. Logging to enlistment file.")]") to_chat(transfer_marine, "[icon2html(src, transfer_marine)] \[Overwatch\]: You've been transfered to [new_squad]!") diff --git a/code/modules/cm_marines/radar.dm b/code/modules/cm_marines/radar.dm index 80b3bb7bcb0c..aa332d601395 100644 --- a/code/modules/cm_marines/radar.dm +++ b/code/modules/cm_marines/radar.dm @@ -205,12 +205,12 @@ continue var/crewmember_name = "Unknown" var/crewmember_rank = "Unknown" - if(humanoid.wear_id) - var/obj/item/card/id/ID = humanoid.wear_id.GetID() - if(ID?.registered_name) - crewmember_name = ID.registered_name - if(ID?.assignment) - crewmember_rank = ID.assignment + var/obj/item/card/id/card = humanoid.get_idcard() + if(card) + if(card.registered_name) + crewmember_name = card.registered_name + if(card.assignment) + crewmember_rank = card.assignment switch(humanoid.stat) if(CONSCIOUS) crewmember_name = "[crewmember_name] ([crewmember_rank]) (Conscious)" diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm index f4aaf7c06560..e7ac5d767dab 100644 --- a/code/modules/economy/ATM.dm +++ b/code/modules/economy/ATM.dm @@ -428,26 +428,28 @@ log transactions //stolen wholesale and then edited a bit from newscasters, which are awesome and by Agouri /obj/structure/machinery/atm/proc/scan_user(mob/living/carbon/human/human_user as mob) + if(authenticated_account) + return + var/obj/item/card/id/card = human_user.get_idcard() + if(!card) + return + + authenticated_account = attempt_account_access(card.associated_account_number) if(!authenticated_account) - if(human_user.wear_id) - var/obj/item/card/id/I - if(istype(human_user.wear_id, /obj/item/card/id)) - I = human_user.wear_id - if(I) - authenticated_account = attempt_account_access(I.associated_account_number) - if(authenticated_account) - to_chat(human_user, SPAN_NOTICE("[icon2html(src, human_user)] Access granted. Welcome user '[authenticated_account.owner_name].'")) - - //create a transaction log entry - var/datum/transaction/T = new() - T.target_name = authenticated_account.owner_name - T.purpose = "Remote terminal access" - T.source_terminal = machine_id - T.date = GLOB.current_date_string - T.time = worldtime2text() - authenticated_account.transaction_log.Add(T) - - view_screen = NO_SCREEN + return + + to_chat(human_user, SPAN_NOTICE("[icon2html(src, human_user)] Access granted. Welcome user '[authenticated_account.owner_name].'")) + + //create a transaction log entry + var/datum/transaction/log = new() + log.target_name = authenticated_account.owner_name + log.purpose = "Remote terminal access" + log.source_terminal = machine_id + log.date = GLOB.current_date_string + log.time = worldtime2text() + authenticated_account.transaction_log.Add(log) + + view_screen = NO_SCREEN // put the currently held id on the ground or in the hand of the user /obj/structure/machinery/atm/proc/release_held_id(mob/living/carbon/human/human_user as mob) diff --git a/code/modules/gear_presets/uscm.dm b/code/modules/gear_presets/uscm.dm index eec3b6157877..b1a7fe48f9a9 100644 --- a/code/modules/gear_presets/uscm.dm +++ b/code/modules/gear_presets/uscm.dm @@ -35,13 +35,13 @@ if(!GLOB.data_core.manifest_modify(new_human.real_name, WEAKREF(new_human), assignment, rank)) GLOB.data_core.manifest_inject(new_human) - var/obj/item/card/id/ID = new_human.wear_id + var/obj/item/card/id/ID = new_human.get_idcard() var/datum/money_account/acct = create_account(new_human, rand(30, 50), GLOB.paygrades[ID.paygrade]) ID.associated_account_number = acct.account_number var/datum/squad/auto_squad = get_squad_by_name(auto_squad_name) if(auto_squad) - transfer_marine_to_squad(new_human, auto_squad, new_human.assigned_squad, new_human.wear_id) + transfer_marine_to_squad(new_human, auto_squad, new_human.assigned_squad, ID) if(!ert_squad && !auto_squad.active) auto_squad.engage_squad(FALSE) diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 9eac835dccba..ec8083da0d46 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -60,7 +60,7 @@ var/obj/item/head = null var/obj/item/wear_l_ear = null var/obj/item/wear_r_ear = null - var/obj/item/card/id/wear_id = null + var/obj/item/wear_id = null var/obj/item/r_store = null var/obj/item/l_store = null var/obj/item/s_store = null diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 9a0cd177e885..dfb903368503 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -345,8 +345,11 @@ Applied by gun suicide and high impact bullet executions, removed by rejuvenate, client.add_to_screen(wear_id) wear_id.screen_loc = hud_used.ui_datum.hud_slot_offset(wear_id, hud_used.ui_datum.ui_id) - if(!wear_id.pinned_on_uniform || (w_uniform && w_uniform.displays_id && !(w_uniform.flags_jumpsuit & UNIFORM_JACKET_REMOVED))) - var/image/id_overlay = wear_id.get_mob_overlay(src, WEAR_ID) + var/obj/item/card/id/card = get_idcard() + if(!card) + return + if(!card.pinned_on_uniform || (w_uniform && w_uniform.displays_id && !(w_uniform.flags_jumpsuit & UNIFORM_JACKET_REMOVED))) + var/image/id_overlay = card.get_mob_overlay(src, WEAR_ID) id_overlay.layer = -ID_LAYER overlays_standing[ID_LAYER] = id_overlay apply_overlay(ID_LAYER) diff --git a/code/modules/shuttle/computer.dm b/code/modules/shuttle/computer.dm index 2b3407fa9414..00dcd987f089 100644 --- a/code/modules/shuttle/computer.dm +++ b/code/modules/shuttle/computer.dm @@ -382,7 +382,13 @@ return var/mob/living/carbon/human/human_user = user - if(!(ACCESS_MARINE_SENIOR in human_user.wear_id?.access) && !(ACCESS_MARINE_DROPSHIP in human_user.wear_id?.access)) + var/obj/item/card/id/card = human_user.get_idcard() + + if(!card) + to_chat(user, SPAN_NOTICE("[src]'s screen says \"Unauthorized access. Please inform your supervisor\".")) + return + + if(!(ACCESS_MARINE_SENIOR in card.access) && !(ACCESS_MARINE_DROPSHIP in card.access)) to_chat(user, SPAN_NOTICE("[src]'s screen says \"Unauthorized access. Please inform your supervisor\".")) return From 48dd274cc8bfdf2e43961c83189a96f391031377 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 15 Jun 2024 15:10:30 +0100 Subject: [PATCH 03/82] Automatic changelog for PR #6411 [ci skip] --- html/changelogs/AutoChangeLog-pr-6411.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6411.yml diff --git a/html/changelogs/AutoChangeLog-pr-6411.yml b/html/changelogs/AutoChangeLog-pr-6411.yml new file mode 100644 index 000000000000..bc5d177db4ba --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6411.yml @@ -0,0 +1,4 @@ +author: "Drathek" +delete-after: True +changes: + - bugfix: "Fixed wallets as IDs breaking many things" \ No newline at end of file From 64bdcc4404e8bfbbe57c741f92fe247382548cf6 Mon Sep 17 00:00:00 2001 From: Drathek <76988376+Drulikar@users.noreply.github.com> Date: Sat, 15 Jun 2024 07:06:22 -0700 Subject: [PATCH 04/82] Adds niche logs to revival attempts (#6465) # About the pull request This PR simply adds niche admin logs for defib attempts. # Explain why it's good for the game More logs. # Testing Photographs and Procedure
Screenshots & Videos ![image](https://github.com/cmss13-devs/cmss13/assets/76988376/ec8bbc5a-657a-4756-8b5a-e53e9ccd4d87)
# Changelog :cl: Drathek admin: Added niche logging for revival attempts /:cl: --- code/game/objects/items/devices/defibrillator.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/game/objects/items/devices/defibrillator.dm b/code/game/objects/items/devices/defibrillator.dm index 4a5ad7cc13ed..518fdb1a9591 100644 --- a/code/game/objects/items/devices/defibrillator.dm +++ b/code/game/objects/items/devices/defibrillator.dm @@ -199,8 +199,10 @@ playsound(get_turf(src), 'sound/items/defib_failed.ogg', 25, 0) if(heart && heart.organ_status >= ORGAN_BROKEN) user.visible_message(SPAN_WARNING("[icon2html(src, viewers(src))] \The [src] buzzes: Defibrillation failed. Patient's heart is too damaged. Immediate surgery is advised.")) + msg_admin_niche("[key_name_admin(user)] failed an attempt to revive [key_name_admin(H)] with [src] because of heart damage.") return user.visible_message(SPAN_WARNING("[icon2html(src, viewers(src))] \The [src] buzzes: Defibrillation failed. Patient's general condition does not allow reviving.")) + msg_admin_niche("[key_name_admin(user)] failed an attempt to revive [key_name_admin(H)] with [src].") return if(!H.client) //Freak case, no client at all. This is a braindead mob (like a colonist) @@ -227,6 +229,7 @@ break if(H.health > HEALTH_THRESHOLD_DEAD) user.visible_message(SPAN_NOTICE("[icon2html(src, viewers(src))] \The [src] beeps: Defibrillation successful.")) + msg_admin_niche("[key_name_admin(user)] successfully revived [key_name_admin(H)] with [src].") playsound(get_turf(src), 'sound/items/defib_success.ogg', 25, 0) user.track_life_saved(user.job) user.life_revives_total++ @@ -239,6 +242,7 @@ window_flash(H.client) else user.visible_message(SPAN_WARNING("[icon2html(src, viewers(src))] \The [src] buzzes: Defibrillation failed. Vital signs are too weak, repair damage and try again.")) //Freak case + msg_admin_niche("[key_name_admin(user)] failed an attempt to revive [key_name_admin(H)] with [src] because of weak vitals.") playsound(get_turf(src), 'sound/items/defib_failed.ogg', 25, 0) if(heart && prob(25)) heart.take_damage(rand(min_heart_damage_dealt, max_heart_damage_dealt), TRUE) // Make death and revival leave lasting consequences From d9812d9fe5baed574d3f2a87aa75dc8f9f134080 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 15 Jun 2024 15:17:44 +0100 Subject: [PATCH 05/82] Automatic changelog for PR #6465 [ci skip] --- html/changelogs/AutoChangeLog-pr-6465.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6465.yml diff --git a/html/changelogs/AutoChangeLog-pr-6465.yml b/html/changelogs/AutoChangeLog-pr-6465.yml new file mode 100644 index 000000000000..585951e37493 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6465.yml @@ -0,0 +1,4 @@ +author: "Drathek" +delete-after: True +changes: + - admin: "Added niche logging for revival attempts" \ No newline at end of file From ea24776714c75a06e0b44b0e1e8ce809ce3ae2fc Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 16 Jun 2024 01:21:31 +0000 Subject: [PATCH 06/82] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-6411.yml | 4 ---- html/changelogs/AutoChangeLog-pr-6465.yml | 4 ---- html/changelogs/archive/2024-06.yml | 4 ++++ 3 files changed, 4 insertions(+), 8 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-6411.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6465.yml diff --git a/html/changelogs/AutoChangeLog-pr-6411.yml b/html/changelogs/AutoChangeLog-pr-6411.yml deleted file mode 100644 index bc5d177db4ba..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6411.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Drathek" -delete-after: True -changes: - - bugfix: "Fixed wallets as IDs breaking many things" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6465.yml b/html/changelogs/AutoChangeLog-pr-6465.yml deleted file mode 100644 index 585951e37493..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6465.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Drathek" -delete-after: True -changes: - - admin: "Added niche logging for revival attempts" \ No newline at end of file diff --git a/html/changelogs/archive/2024-06.yml b/html/changelogs/archive/2024-06.yml index f8a21c842287..a05fd3fb21f6 100644 --- a/html/changelogs/archive/2024-06.yml +++ b/html/changelogs/archive/2024-06.yml @@ -134,3 +134,7 @@ harryob: - bugfix: the preview window in character setup now remains visible when looking at it as a ghost +2024-06-16: + Drathek: + - bugfix: Fixed wallets as IDs breaking many things + - admin: Added niche logging for revival attempts From 8ee40aaddb3765c906e1241098d1c57fe1ecf367 Mon Sep 17 00:00:00 2001 From: Vero <73014819+vero5123@users.noreply.github.com> Date: Sun, 16 Jun 2024 02:34:16 -0700 Subject: [PATCH 07/82] fixes vampire executing nested marines (#6458) # About the pull request Resolves #6453 # Explain why it's good for the game bug bad # Changelog :cl: fix: fixes vampire being able to execute hugged marines /:cl: --------- Co-authored-by: DOOM --- .../carbon/xenomorph/abilities/lurker/lurker_powers.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/lurker/lurker_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/lurker/lurker_powers.dm index 51f23f22a09f..578cede8e979 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/lurker/lurker_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/lurker/lurker_powers.dm @@ -341,6 +341,12 @@ if(xeno.action_busy) return + if(target_carbon.status_flags & XENO_HOST) + for(var/obj/item/alien_embryo/embryo in target_carbon) + if(HIVE_ALLIED_TO_HIVE(xeno.hivenumber, embryo.hivenumber)) + to_chat(xeno, SPAN_WARNING("We should not harm this host! It has a sister inside.")) + return + xeno.visible_message(SPAN_DANGER("[xeno] grabs [target_carbon]’s head aggressively."), \ SPAN_XENOWARNING("We grab [target_carbon]’s head aggressively.")) From 9a85c1621c415c23b964e18ca8feed7b80bb67c1 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 16 Jun 2024 10:38:26 +0100 Subject: [PATCH 08/82] Automatic changelog for PR #6458 [ci skip] --- html/changelogs/AutoChangeLog-pr-6458.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6458.yml diff --git a/html/changelogs/AutoChangeLog-pr-6458.yml b/html/changelogs/AutoChangeLog-pr-6458.yml new file mode 100644 index 000000000000..c485379cd016 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6458.yml @@ -0,0 +1,4 @@ +author: "vero5123" +delete-after: True +changes: + - bugfix: "fixes vampire being able to execute hugged marines" \ No newline at end of file From e6e8507146e3478308aca9fd1c20800e7de8f476 Mon Sep 17 00:00:00 2001 From: TheGamerdk <5618080+TheGamerdk@users.noreply.github.com> Date: Sun, 16 Jun 2024 12:06:04 +0200 Subject: [PATCH 09/82] Allows most synthetics to access the marine synthetic vendor, provided they're given access on their ID (#6423) # About the pull request In regular play (non-ERT) this means that the following synthetics can get access to the vendor: PMC insert on Solaris Ridge UPP insert on Trijent CMB insert on Fiorina Technically also means ERT synths from the CMB, UPP and PMC would be able to access the vendors, provided they're given USCM synth access on their ID. (It's possible to accomplish this same change by setting their job to JOB_SYNTH_SURVIVOR, but then they lose the benefits of their current job, (Usually faction HUDs)) Every other # Explain why it's good for the game Synths of these 3 types are allowed to align with the USCM, but not being able to access the vendors to get essentials like a headset, makes this rather difficult. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: add: Special insert synthetics on most maps will now be able to gain access to synthetic equipment vendors, provided they're given access by USCM command staff. (Synth access on their ID) /:cl: --- code/game/machinery/vending/vendor_types/crew/synthetic.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/vending/vendor_types/crew/synthetic.dm b/code/game/machinery/vending/vendor_types/crew/synthetic.dm index a5e166451457..550a08473a4b 100644 --- a/code/game/machinery/vending/vendor_types/crew/synthetic.dm +++ b/code/game/machinery/vending/vendor_types/crew/synthetic.dm @@ -5,7 +5,7 @@ desc = "An automated gear rack hooked up to a colossal storage of various medical and engineering supplies. Can be accessed only by synthetic units." icon_state = "gear" req_access = list(ACCESS_MARINE_SYNTH) - vendor_role = list(JOB_SYNTH, JOB_SYNTH_SURVIVOR) + vendor_role = list(JOB_SYNTH, JOB_SYNTH_SURVIVOR, JOB_UPP_SUPPORT_SYNTH, JOB_CMB_SYN, JOB_PMC_SYNTH) listed_products = list( list("ENGINEER SUPPLIES", 0, null, null, null), @@ -178,7 +178,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_synth, list( name = "\improper ColMarTech Synthetic Equipment Rack" desc = "An automated rack hooked up to a colossal storage of various equipment. Can be accessed only by synthetic units." req_access = list(ACCESS_MARINE_SYNTH) - vendor_role = list(JOB_SYNTH, JOB_SYNTH_SURVIVOR) + vendor_role = list(JOB_SYNTH, JOB_SYNTH_SURVIVOR, JOB_UPP_SUPPORT_SYNTH, JOB_CMB_SYN, JOB_PMC_SYNTH) /obj/structure/machinery/cm_vending/clothing/synth/get_listed_products(mob/user) return GLOB.cm_vending_clothing_synth @@ -337,7 +337,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_synth_snowflake, list( use_snowflake_points = TRUE vendor_theme = VENDOR_THEME_COMPANY req_access = list(ACCESS_MARINE_SYNTH) - vendor_role = list(JOB_SYNTH, JOB_SYNTH_SURVIVOR, JOB_WORKING_JOE) + vendor_role = list(JOB_SYNTH, JOB_SYNTH_SURVIVOR, JOB_WORKING_JOE, JOB_UPP_SUPPORT_SYNTH, JOB_CMB_SYN, JOB_PMC_SYNTH) vend_delay = 1 SECONDS From ae7ee9fde0d754219004740ae2aebf6f5482c8bd Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 16 Jun 2024 11:10:50 +0100 Subject: [PATCH 10/82] Automatic changelog for PR #6423 [ci skip] --- html/changelogs/AutoChangeLog-pr-6423.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6423.yml diff --git a/html/changelogs/AutoChangeLog-pr-6423.yml b/html/changelogs/AutoChangeLog-pr-6423.yml new file mode 100644 index 000000000000..15cf78dfd8e7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6423.yml @@ -0,0 +1,4 @@ +author: "TheGamerdk" +delete-after: True +changes: + - rscadd: "Special insert synthetics on most maps will now be able to gain access to synthetic equipment vendors, provided they're given access by USCM command staff. (Synth access on their ID)" \ No newline at end of file From fd94bdd82455c40f6fa5a5d00a679c50817be9f3 Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Sun, 16 Jun 2024 06:07:51 -0400 Subject: [PATCH 11/82] grow boxes can now be destroyed by xenos (#6462) # About the pull request title # Explain why it's good for the game no more stupid crap made by silly mappers blocking your movement # Testing Photographs and Procedure https://github.com/cmss13-devs/cmss13/assets/140007537/87207bd1-5024-46df-93d2-8ab7163fd324 # Changelog :cl: qol: Grow boxes can now be destroyed by xenos. /:cl: --- code/game/objects/structures/props.dm | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/code/game/objects/structures/props.dm b/code/game/objects/structures/props.dm index 745dd7ed40fc..16ab0fed895f 100644 --- a/code/game/objects/structures/props.dm +++ b/code/game/objects/structures/props.dm @@ -686,6 +686,20 @@ health = 75 density = TRUE +/obj/structure/prop/ice_colony/dense/attack_alien(mob/living/carbon/xenomorph/xeno) + if(xeno.a_intent == INTENT_HARM) + if(unslashable) + return + xeno.animation_attack_on(src) + playsound(loc, 'sound/effects/metalhit.ogg', 25, 1) + xeno.visible_message(SPAN_DANGER("[xeno] slices [src] apart!"), + SPAN_DANGER("We slice [src] apart!"), null, 5, CHAT_TYPE_XENO_COMBAT) + deconstruct(FALSE) + return XENO_ATTACK_ACTION + else + attack_hand(xeno) + return XENO_NONCOMBAT_ACTION + /obj/structure/prop/ice_colony/dense/ice_tray name = "ice slab tray" icon_state = "ice_tray" From 59b74e54f28876bcc36661bbf869803a525cec58 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 16 Jun 2024 11:18:35 +0100 Subject: [PATCH 12/82] Automatic changelog for PR #6462 [ci skip] --- html/changelogs/AutoChangeLog-pr-6462.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6462.yml diff --git a/html/changelogs/AutoChangeLog-pr-6462.yml b/html/changelogs/AutoChangeLog-pr-6462.yml new file mode 100644 index 000000000000..ab9e321ce5f7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6462.yml @@ -0,0 +1,4 @@ +author: "iloveloopers" +delete-after: True +changes: + - qol: "Grow boxes can now be destroyed by xenos." \ No newline at end of file From 5725cd228d68cfd192f924539e67e778f3bb9615 Mon Sep 17 00:00:00 2001 From: GrrrKitten <158611449+GrrrKitten@users.noreply.github.com> Date: Sun, 16 Jun 2024 06:16:01 -0400 Subject: [PATCH 13/82] Fixes a bug that would jam guns entirely (#6470) # About the pull request I couldn't figure out what caused this bug but it was getting kinda bad, something about alternating akimbo would cause guns to be entirely disabled, with the current_mag having been ejected, but still marked as in the gun, but not in the contents, meaning the gun was entirely broke as you couldnt clear out the mag inside of it cause there was no mag. this pr just adds a failsafe to prevent this from ever happening # Explain why it's good for the game Having your gun becoming entirely unusable and having to just toss it out cause a bug broke it isnt fun # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: fix: fixes a bug that fully jammed guns being used in akimbo /:cl: --- code/modules/projectiles/gun.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 69a458a983d0..db7a163f7536 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -872,6 +872,8 @@ User can be passed as null, (a gun reloading itself for instance), so we need to if(!current_mag || QDELETED(current_mag) || (current_mag.loc != src && !loc_override)) cock(user) + current_mag = null + update_icon() return if(drop_override || !user) //If we want to drop it on the ground or there's no user. From be1138f2fb873a165f851c98cc24ac71647d6b67 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 16 Jun 2024 11:26:41 +0100 Subject: [PATCH 14/82] Automatic changelog for PR #6470 [ci skip] --- html/changelogs/AutoChangeLog-pr-6470.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6470.yml diff --git a/html/changelogs/AutoChangeLog-pr-6470.yml b/html/changelogs/AutoChangeLog-pr-6470.yml new file mode 100644 index 000000000000..e166b407e475 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6470.yml @@ -0,0 +1,4 @@ +author: "GrrrKitten" +delete-after: True +changes: + - bugfix: "fixes a bug that fully jammed guns being used in akimbo" \ No newline at end of file From 688a32141b0d63dae50e7859e4939684572dc531 Mon Sep 17 00:00:00 2001 From: Steelpoint <6595389+Steelpoint@users.noreply.github.com> Date: Sun, 16 Jun 2024 18:29:27 +0800 Subject: [PATCH 15/82] Personal Civilian Clothing Storage Unit For Marines (#6401) # About the pull request Adds a set of civilian clothing vendors on the Almayer in the Gym., these vendors can be used by anyone to vend civilian style clothing, the contents are almost identical to the Synthetic clothing vendor, minus the military themed clothing and unique backpack/similar options. These vendors are locked behind a set of shutters with the same high-level access requirements as the Dress uniform vendors, so CIC can determine when access is authorized. Anyone can access the vendor, each person has a 120 point limit to what they can buy. # Explain why it's good for the game Grants regular Marines the ability to vend their own personal civilian clothing, for events or whenever CIC authorizes it (Maybe a event where the marines are going on shore leave before something terrible happened?). The advantage here is to further allow regular players to craft their own characters apperance and roleplay what they might wear off-duty, in circumstances that allow for it. The area is locked thus CIC has control on when Marines can access it, and there is also the fact it is the job of the MPs to ensure Marines are wearing proper clothing. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: mapadd: Civilian Clothing Storage Vendors have been added to the Gym on the USS Almayer. These allow anyone to vend civilian clothes. These vendors require CIC access to unlock however. /:cl: Co-authored-by: Steelpoint --- .../vendor_types/squad_prep/squad_prep.dm | 102 ++++++++++++++++++ maps/map_files/USS_Almayer/USS_Almayer.dmm | 91 +++++++++------- 2 files changed, 156 insertions(+), 37 deletions(-) diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_prep.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_prep.dm index b703654cd51a..35b059ac9611 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_prep.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_prep.dm @@ -412,3 +412,105 @@ /obj/item/clothing/suit/storage/marine/heavy/skull, /obj/item/clothing/suit/storage/marine/heavy/smooth, ) + +//------------MARINE CIVILIAN CLOTHING--------------- + +GLOBAL_LIST_INIT(cm_vending_clothing_marine_snowflake, list( + list("SHIRTS AND UNIFORMS", 0, null, null, null), + list("White T-Shirt and Brown Jeans", 12, /obj/item/clothing/under/tshirt/w_br, null, VENDOR_ITEM_REGULAR), + list("Gray T-Shirt and Blue Jeans", 12, /obj/item/clothing/under/tshirt/gray_blu, null, VENDOR_ITEM_REGULAR), + list("Red T-Shirt and Black Jeans", 12, /obj/item/clothing/under/tshirt/r_bla, null, VENDOR_ITEM_REGULAR), + list("Frontier Jumpsuit", 12, /obj/item/clothing/under/rank/synthetic/frontier, null, VENDOR_ITEM_REGULAR), + list("UA Grey Jumpsuit", 12, /obj/item/clothing/under/colonist/ua_civvies, null, VENDOR_ITEM_REGULAR), + list("UA Brown Jumpsuit", 12, /obj/item/clothing/under/colonist/wy_davisone, null, VENDOR_ITEM_REGULAR), + list("UA Green Utility Uniform", 12, /obj/item/clothing/under/rank/synthetic/utility, null, VENDOR_ITEM_REGULAR), + list("Grey Utilities", 12, /obj/item/clothing/under/rank/synthetic/utility/yellow, null, VENDOR_ITEM_REGULAR), + list("Grey Utilities and Blue Jeans", 12, /obj/item/clothing/under/rank/synthetic/utility/red, null, VENDOR_ITEM_REGULAR), + list("Blue Utilities and Brown Jeans", 12, /obj/item/clothing/under/rank/synthetic/utility/blue, null, VENDOR_ITEM_REGULAR), + list("White Service Uniform", 12, /obj/item/clothing/under/colonist/white_service, null, VENDOR_ITEM_REGULAR), + list("Steward Clothes", 12, /obj/item/clothing/under/colonist/wy_joliet_shopsteward, null, VENDOR_ITEM_REGULAR), + list("Red Dress Skirt", 12, /obj/item/clothing/under/blackskirt, null, VENDOR_ITEM_REGULAR), + list("Blue Suit Pants", 12, /obj/item/clothing/under/liaison_suit/blue, null, VENDOR_ITEM_REGULAR), + list("Brown Suit Pants", 12, /obj/item/clothing/under/liaison_suit/brown, null, VENDOR_ITEM_REGULAR), + list("White Suit Pants", 12, /obj/item/clothing/under/liaison_suit/corporate_formal, null, VENDOR_ITEM_REGULAR), + list("Working Joe Uniform", 36, /obj/item/clothing/under/rank/synthetic/joe, null, VENDOR_ITEM_REGULAR), + + list("GLASSES", 0, null, null, null), + list("Marine RPG Glasses", 12, /obj/item/clothing/glasses/regular, null, VENDOR_ITEM_REGULAR), + list("Sunglasses", 12, /obj/item/clothing/glasses/sunglasses, null, VENDOR_ITEM_REGULAR), + + list("SHOES", 0, null, null, null), + list("Boots", 12, /obj/item/clothing/shoes/marine, null, VENDOR_ITEM_REGULAR), + list("Shoes, Black", 12, /obj/item/clothing/shoes/black, null, VENDOR_ITEM_REGULAR), + list("Shoes, Blue", 12, /obj/item/clothing/shoes/blue, null, VENDOR_ITEM_REGULAR), + list("Shoes, Brown", 12, /obj/item/clothing/shoes/brown, null, VENDOR_ITEM_REGULAR), + list("Shoes, Green", 12, /obj/item/clothing/shoes/green, null, VENDOR_ITEM_REGULAR), + list("Shoes, Purple", 12, /obj/item/clothing/shoes/purple, null, VENDOR_ITEM_REGULAR), + list("Shoes, Red", 12, /obj/item/clothing/shoes/red, null, VENDOR_ITEM_REGULAR), + list("Shoes, White", 12, /obj/item/clothing/shoes/white, null, VENDOR_ITEM_REGULAR), + list("Shoes, Yellow", 12, /obj/item/clothing/shoes/yellow, null, VENDOR_ITEM_REGULAR), + + list("HEADWEAR", 0, null, null, null), + list("Beanie", 12, /obj/item/clothing/head/beanie, null, VENDOR_ITEM_REGULAR), + list("Beret, Engineering", 12, /obj/item/clothing/head/beret/eng, null, VENDOR_ITEM_REGULAR), + list("Beret, Purple", 12, /obj/item/clothing/head/beret/jan, null, VENDOR_ITEM_REGULAR), + list("Beret, Red", 12, /obj/item/clothing/head/beret/cm/red, null, VENDOR_ITEM_REGULAR), + list("Beret, Standard", 12, /obj/item/clothing/head/beret/cm, null, VENDOR_ITEM_REGULAR), + list("Beret, Tan", 12, /obj/item/clothing/head/beret/cm/tan, null, VENDOR_ITEM_REGULAR), + list("Beret, Green", 12, /obj/item/clothing/head/beret/cm, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR), + list("Beret, Black", 12, /obj/item/clothing/head/beret/cm/black, null, VENDOR_ITEM_REGULAR), + list("Beret, White", 12, /obj/item/clothing/head/beret/cm/white, null, VENDOR_ITEM_REGULAR), + list("Ushanka", 12, /obj/item/clothing/head/ushanka, null, VENDOR_ITEM_REGULAR), + list("Cap", 12, /obj/item/clothing/head/cmcap, null, VENDOR_ITEM_REGULAR), + list("Fedora", 12, /obj/item/clothing/head/fedora, null, VENDOR_ITEM_REGULAR), + + list("SUIT", 0, null, null, null), + list("Bomber Jacket, Brown", 12, /obj/item/clothing/suit/storage/bomber, null, VENDOR_ITEM_REGULAR), + list("Bomber Jacket, Black", 12, /obj/item/clothing/suit/storage/bomber/alt, null, VENDOR_ITEM_REGULAR), + list("External Webbing", 12, /obj/item/clothing/suit/storage/webbing, null, VENDOR_ITEM_REGULAR), + list("Utility Vest", 12, /obj/item/clothing/suit/storage/utility_vest, null, VENDOR_ITEM_REGULAR), + list("Hazard Vest(Orange)", 12, /obj/item/clothing/suit/storage/hazardvest, null, VENDOR_ITEM_REGULAR), + list("Hazard Vest(Blue)", 12, /obj/item/clothing/suit/storage/hazardvest/blue, null, VENDOR_ITEM_REGULAR), + list("Hazard Vest(Yellow)", 12, /obj/item/clothing/suit/storage/hazardvest/yellow, null, VENDOR_ITEM_REGULAR), + list("Hazard Vest(Black)", 12, /obj/item/clothing/suit/storage/hazardvest/black, null, VENDOR_ITEM_REGULAR), + list("USCM Service Jacket", 12, /obj/item/clothing/suit/storage/jacket/marine/service, null, VENDOR_ITEM_REGULAR), + list("Windbreaker, Brown", 12, /obj/item/clothing/suit/storage/windbreaker/windbreaker_brown, null, VENDOR_ITEM_REGULAR), + list("Windbreaker, Grey", 12, /obj/item/clothing/suit/storage/windbreaker/windbreaker_gray, null, VENDOR_ITEM_REGULAR), + list("Windbreaker, Green", 12, /obj/item/clothing/suit/storage/windbreaker/windbreaker_green, null, VENDOR_ITEM_REGULAR), + list("Windbreaker, First Responder", 12, /obj/item/clothing/suit/storage/windbreaker/windbreaker_fr, null, VENDOR_ITEM_REGULAR), + list("Windbreaker, Exploration", 12, /obj/item/clothing/suit/storage/windbreaker/windbreaker_covenant, null, VENDOR_ITEM_REGULAR), + list("Black Suit Jacket", 12, /obj/item/clothing/suit/storage/jacket/marine/corporate/black, null, VENDOR_ITEM_REGULAR), + list("Brown Suit Jacket", 12, /obj/item/clothing/suit/storage/jacket/marine/corporate/brown, null, VENDOR_ITEM_REGULAR), + list("Blue Suit Jacket", 12, /obj/item/clothing/suit/storage/jacket/marine/corporate/blue, null, VENDOR_ITEM_REGULAR), + list("Brown Vest", 12, /obj/item/clothing/suit/storage/jacket/marine/vest, null, VENDOR_ITEM_REGULAR), + list("Tan Vest", 12, /obj/item/clothing/suit/storage/jacket/marine/vest/tan, null, VENDOR_ITEM_REGULAR), + list("Grey Vest", 12, /obj/item/clothing/suit/storage/jacket/marine/vest/grey, null, VENDOR_ITEM_REGULAR), + + list("BACKPACK", 0, null, null, null), + list("Backpack, Industrial", 12, /obj/item/storage/backpack/industrial, null, VENDOR_ITEM_REGULAR), + list("Satchel, Leather", 12, /obj/item/storage/backpack/satchel, null, VENDOR_ITEM_REGULAR), + list("Satchel, Medical", 12, /obj/item/storage/backpack/satchel/med, null, VENDOR_ITEM_REGULAR), + + list("OTHER", 0, null, null, null), + list("Red Armband", 6, /obj/item/clothing/accessory/armband, null, VENDOR_ITEM_REGULAR), + list("Purple Armband", 6, /obj/item/clothing/accessory/armband/science, null, VENDOR_ITEM_REGULAR), + list("Yellow Armband", 6, /obj/item/clothing/accessory/armband/engine, null, VENDOR_ITEM_REGULAR), + list("Green Armband", 6, /obj/item/clothing/accessory/armband/medgreen, null, VENDOR_ITEM_REGULAR), + list("Dress Gloves", 6, /obj/item/clothing/gloves/marine/dress, null, VENDOR_ITEM_REGULAR), + +)) + +/obj/structure/machinery/cm_vending/clothing/marine/snowflake + name = "\improper Personal Civilian Clothing Storage Unit" + desc = "The vendor where all of your personal civilian clothing is stored while you are on-duty." + icon_state = "snowflake" + show_points = TRUE + use_snowflake_points = TRUE + vendor_theme = VENDOR_THEME_COMPANY + req_access = list() + vendor_role = list() + + vend_delay = 1 SECONDS + +/obj/structure/machinery/cm_vending/clothing/marine/snowflake/get_listed_products(mob/user) + return GLOB.cm_vending_clothing_marine_snowflake diff --git a/maps/map_files/USS_Almayer/USS_Almayer.dmm b/maps/map_files/USS_Almayer/USS_Almayer.dmm index f15298111bf2..aaeb160aeef1 100644 --- a/maps/map_files/USS_Almayer/USS_Almayer.dmm +++ b/maps/map_files/USS_Almayer/USS_Almayer.dmm @@ -11041,6 +11041,12 @@ icon_state = "plate" }, /area/almayer/hallways/hangar) +"bjZ" = ( +/obj/structure/machinery/cm_vending/clothing/marine/snowflake, +/turf/open/floor/almayer{ + icon_state = "cargo" + }, +/area/almayer/living/gym) "bkb" = ( /turf/open/floor/almayer{ dir = 4; @@ -12003,12 +12009,6 @@ icon_state = "plate" }, /area/almayer/hallways/lower/starboard_fore_hallway) -"bqm" = ( -/obj/structure/closet/boxinggloves, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/living/gym) "bqF" = ( /obj/structure/dropship_equipment/fuel/fuel_enhancer, /turf/open/floor/almayer{ @@ -25272,6 +25272,19 @@ icon_state = "cargo" }, /area/almayer/engineering/upper_engineering/starboard) +"evC" = ( +/obj/structure/bed/chair{ + dir = 4 + }, +/obj/structure/machinery/door_control{ + id = "civ_uniforms"; + name = "Uniform Vendor Lockdown"; + pixel_x = -24; + pixel_y = -7; + req_access_txt = "31" + }, +/turf/open/floor/almayer, +/area/almayer/living/gym) "evM" = ( /obj/structure/machinery/status_display{ pixel_y = 30 @@ -26713,8 +26726,7 @@ icon_state = "ramptop" }, /turf/open/floor/almayer/aicore/glowing/no_build{ - icon_state = "ai_floor3"; - light_range = 3 + icon_state = "ai_floor3" }, /area/almayer/command/airoom) "eXD" = ( @@ -41904,6 +41916,16 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/maint/hull/lower/l_f_p) +"kox" = ( +/obj/structure/machinery/door/poddoor/shutters/almayer/uniform_vendors{ + dir = 4; + id = "civ_uniforms" + }, +/turf/open/floor/almayer{ + dir = 8; + icon_state = "cargo_arrow" + }, +/area/almayer/living/gym) "koB" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -44836,6 +44858,9 @@ icon_state = "silvercorner" }, /area/almayer/shipboard/brig/cic_hallway) +"lnu" = ( +/turf/closed/wall/almayer/reinforced/temphull, +/area/almayer/living/gym) "lnP" = ( /obj/structure/machinery/vending/cola, /obj/structure/window/reinforced, @@ -50514,8 +50539,7 @@ vector_y = -61 }, /turf/open/floor/almayer/aicore/glowing/no_build{ - icon_state = "ai_floor3"; - light_range = 3 + icon_state = "ai_floor3" }, /area/almayer/command/airoom) "nkX" = ( @@ -55845,8 +55869,7 @@ dir = 1 }, /turf/open/floor/almayer/aicore/glowing/no_build{ - icon_state = "ai_floor3"; - light_range = 3 + icon_state = "ai_floor3" }, /area/almayer/command/airoom) "oZp" = ( @@ -55967,8 +55990,7 @@ dir = 8 }, /turf/open/floor/almayer/aicore/glowing/no_build{ - icon_state = "ai_floor3"; - light_range = 3 + icon_state = "ai_floor3" }, /area/almayer/command/airoom) "paI" = ( @@ -69653,8 +69675,7 @@ dir = 8 }, /turf/open/floor/almayer/aicore/glowing/no_build{ - icon_state = "ai_floor3"; - light_range = 3 + icon_state = "ai_floor3" }, /area/almayer/command/airoom) "tIF" = ( @@ -73736,10 +73757,6 @@ }, /turf/open/floor/plating, /area/almayer/medical/lower_medical_medbay) -"vhY" = ( -/obj/structure/sign/goldenplaque, -/turf/closed/wall/almayer, -/area/almayer/living/gym) "vif" = ( /obj/structure/bed/chair/wood/normal{ dir = 1 @@ -108726,11 +108743,11 @@ sZc abj mUE coo -eWs -aRu -aRu -aRu -aRu +lnu +lnu +lnu +lnu +lnu aRu aRu bcm @@ -108929,12 +108946,12 @@ iOX kIl jmz hsK -wfE -wfE -wfE -wfE -wfE -wfE +lnu +bjZ +bjZ +bjZ +lnu +sGU wfE wfE yap @@ -109133,10 +109150,10 @@ wfE wfE wfE wfE -sGU -vhY +kox +kox +kox wfE -bqm bsD btr wfE @@ -109335,11 +109352,11 @@ jOo wrC mHx pqX -pqX +evC xbk wFR -bmF wFR +bmF wFR xbk aWw @@ -110344,7 +110361,7 @@ aad sGw xzB dvD -wfE +sGU iYx opD xbk From cb6fe0c3e39630ff6ed0b553a538173486d84f04 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 16 Jun 2024 11:34:11 +0100 Subject: [PATCH 16/82] Automatic changelog for PR #6401 [ci skip] --- html/changelogs/AutoChangeLog-pr-6401.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6401.yml diff --git a/html/changelogs/AutoChangeLog-pr-6401.yml b/html/changelogs/AutoChangeLog-pr-6401.yml new file mode 100644 index 000000000000..a5f0a2133c7a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6401.yml @@ -0,0 +1,4 @@ +author: "Steelpoint" +delete-after: True +changes: + - mapadd: "Civilian Clothing Storage Vendors have been added to the Gym on the USS Almayer. These allow anyone to vend civilian clothes. These vendors require CIC access to unlock however." \ No newline at end of file From 2f7b91246147c4b5957bc5cf2904156cb975368a Mon Sep 17 00:00:00 2001 From: TheGamerdk <5618080+TheGamerdk@users.noreply.github.com> Date: Sun, 16 Jun 2024 13:51:35 +0200 Subject: [PATCH 17/82] Normalises the HUD damage overlay so synths and predators HUD overlays trigger at the same %-wise damage as humans. (#6452) # About the pull request As human, you get the max damage overlay at 85 damage, i.e 15% health As synth, you get the max damage overlay also at 85 damage, but that's 43% health. Normalises this, so synths get it at 15%, and so on. # Explain why it's good for the game If you've still got gas left in the tank, there's no reason to overlay a large and disturbing overlay. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: fix: The game no longer tricks predators and synths into thinking they're more damaged than they actually are. /:cl: --------- Co-authored-by: Vero <73014819+vero5123@users.noreply.github.com> --- .../living/carbon/human/life/handle_regular_hud_updates.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/life/handle_regular_hud_updates.dm b/code/modules/mob/living/carbon/human/life/handle_regular_hud_updates.dm index 0d850a47f73e..0772d952d082 100644 --- a/code/modules/mob/living/carbon/human/life/handle_regular_hud_updates.dm +++ b/code/modules/mob/living/carbon/human/life/handle_regular_hud_updates.dm @@ -40,9 +40,9 @@ else clear_fullscreen("oxy") - //Fire and Brute damage overlay (BSSR) - var/hurtdamage = src.getBruteLoss() + src.getFireLoss() + damageoverlaytemp + var/max_health_normalisation = (species ? species.total_health : 100) / 100 + var/hurtdamage = (getBruteLoss() + getFireLoss()) / max_health_normalisation + damageoverlaytemp damageoverlaytemp = 0 // We do this so we can detect if someone hits us or not. if(hurtdamage) var/severity = 0 From fa8cd64a2f8b64fb0dee40e6cf32718ab3abba74 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 16 Jun 2024 12:55:48 +0100 Subject: [PATCH 18/82] Automatic changelog for PR #6452 [ci skip] --- html/changelogs/AutoChangeLog-pr-6452.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6452.yml diff --git a/html/changelogs/AutoChangeLog-pr-6452.yml b/html/changelogs/AutoChangeLog-pr-6452.yml new file mode 100644 index 000000000000..22d30528512d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6452.yml @@ -0,0 +1,4 @@ +author: "TheGamerdk" +delete-after: True +changes: + - bugfix: "The game no longer tricks predators and synths into thinking they're more damaged than they actually are." \ No newline at end of file From 484b313870d46e1a23ee107dd915ee1a3ddc7d69 Mon Sep 17 00:00:00 2001 From: forest2001 <41653574+realforest2001@users.noreply.github.com> Date: Sun, 16 Jun 2024 13:07:01 +0100 Subject: [PATCH 19/82] Fixes medical cryo tubes deleting occupants when destroyed. (#6405) # About the pull request As title. # Explain why it's good for the game People being sent to the void is not a good thing. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: fix: Medical cryo tubes no longer delete their occupant when destroyed. /:cl: --------- Co-authored-by: harryob <55142896+harryob@users.noreply.github.com> Co-authored-by: TheGamerdk <5618080+TheGamerdk@users.noreply.github.com> --- code/game/machinery/cryo.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index c2aac2cf9e75..61972f2f6c46 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -193,6 +193,11 @@ var/is_on = on && operable() icon_state = "[icon_state]-[is_on ? "on" : "off"]-[occupant ? "occupied" : "empty"]" +/obj/structure/machinery/cryo_cell/Destroy() + if(occupant) + go_out() + . = ..() + /obj/structure/machinery/cryo_cell/proc/process_occupant() if(!occupant) return From e3092127fa1cdbe7638b440988f12f9d951f3021 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 16 Jun 2024 13:11:54 +0100 Subject: [PATCH 20/82] Automatic changelog for PR #6405 [ci skip] --- html/changelogs/AutoChangeLog-pr-6405.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6405.yml diff --git a/html/changelogs/AutoChangeLog-pr-6405.yml b/html/changelogs/AutoChangeLog-pr-6405.yml new file mode 100644 index 000000000000..d88a19b19eb8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6405.yml @@ -0,0 +1,4 @@ +author: "realforest2001" +delete-after: True +changes: + - bugfix: "Medical cryo tubes no longer delete their occupant when destroyed." \ No newline at end of file From f09b3c20c4b959bd97076b63faa13175f3ac38e6 Mon Sep 17 00:00:00 2001 From: Vero <73014819+vero5123@users.noreply.github.com> Date: Sun, 16 Jun 2024 07:24:50 -0700 Subject: [PATCH 21/82] Fixes cas targeting incorrect signals (#6459) # About the pull request Closes #6447, untested. # Explain why it's good for the game bug bad # Changelog :cl: fix: fixes cas being able to target shipside signals /:cl: --------- Co-authored-by: DOOM --- code/game/machinery/computer/dropship_weapons.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/machinery/computer/dropship_weapons.dm b/code/game/machinery/computer/dropship_weapons.dm index 5d61ed536618..abd3ab50b75c 100644 --- a/code/game/machinery/computer/dropship_weapons.dm +++ b/code/game/machinery/computer/dropship_weapons.dm @@ -621,7 +621,8 @@ . = list() var/datum/cas_iff_group/cas_group = GLOB.cas_groups[faction] for(var/datum/cas_signal/LT as anything in cas_group.cas_signals) - if(!istype(LT) || !LT.valid_signal()) + var/obj/object = LT.signal_loc + if(!istype(LT) || !LT.valid_signal() || !is_ground_level(object.z)) continue var/area/laser_area = get_area(LT.signal_loc) . += list( From b66f89c6d555d753c89ff44c43003e3c62aec99e Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 16 Jun 2024 15:29:23 +0100 Subject: [PATCH 22/82] Automatic changelog for PR #6459 [ci skip] --- html/changelogs/AutoChangeLog-pr-6459.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6459.yml diff --git a/html/changelogs/AutoChangeLog-pr-6459.yml b/html/changelogs/AutoChangeLog-pr-6459.yml new file mode 100644 index 000000000000..8ae6f9acd32e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6459.yml @@ -0,0 +1,4 @@ +author: "vero5123" +delete-after: True +changes: + - bugfix: "fixes cas being able to target shipside signals" \ No newline at end of file From 704841a63623193af91d6ee33ec5ffb6f8db6719 Mon Sep 17 00:00:00 2001 From: ColdIronWarrior Date: Sun, 16 Jun 2024 11:33:51 -0400 Subject: [PATCH 23/82] changes fire color on incen OB to be blueish instead of orange (#6481) # About the pull request changes the fire light color on the incen OB to be blueish instead of orange # Explain why it's good for the game Fixes #6469 looks betterer # Testing Photographs and Procedure ![image](https://github.com/cmss13-devs/cmss13/assets/29965103/b84a9542-bea3-4644-99ef-8b880fc83a0c) doesn't inhibit custom admin incen OBs from being whatever color # Changelog :cl: fix: incen OB fire now makes blue light. /:cl: Co-authored-by: nefarious <72267018+nefarious6th@users.noreply.github.com> --- code/modules/cm_marines/orbital_cannon.dm | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/code/modules/cm_marines/orbital_cannon.dm b/code/modules/cm_marines/orbital_cannon.dm index ce69115cee48..a4286b043eba 100644 --- a/code/modules/cm_marines/orbital_cannon.dm +++ b/code/modules/cm_marines/orbital_cannon.dm @@ -512,15 +512,13 @@ GLOBAL_LIST_EMPTY(orbital_cannon_cancellation) var/distance = 18 var/fire_level = 70 var/burn_level = 80 - var/fire_color = null + var/fire_color = LIGHT_COLOR_CYAN var/fire_type = "white" /obj/structure/ob_ammo/warhead/incendiary/warhead_impact(turf/target) . = ..() if (!.) return - if(fire_color) - fire_type = "dynamic" new /obj/effect/overlay/temp/blinking_laser (target) sleep(10) From 62bb5cc7430283a7ef28dd0843b8d30658351ffd Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 16 Jun 2024 16:38:23 +0100 Subject: [PATCH 24/82] Automatic changelog for PR #6481 [ci skip] --- html/changelogs/AutoChangeLog-pr-6481.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6481.yml diff --git a/html/changelogs/AutoChangeLog-pr-6481.yml b/html/changelogs/AutoChangeLog-pr-6481.yml new file mode 100644 index 000000000000..5451f1e0ac1a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6481.yml @@ -0,0 +1,4 @@ +author: "coldironwarrior" +delete-after: True +changes: + - bugfix: "incen OB fire now makes blue light." \ No newline at end of file From 85e989c35d48cf483f2d6cb1005a4eeff27efe9c Mon Sep 17 00:00:00 2001 From: ColdIronWarrior Date: Sun, 16 Jun 2024 11:35:55 -0400 Subject: [PATCH 25/82] fix gloves and map being mutually exclusive in the corpsman vendor (#6479) # About the pull request gloves and the map are no longer mutually exclusive in the corpsman vendor because the gloves are now flagged as gloves instead of kit. the map is flagged as kit. # Explain why it's good for the game Fixes #6476 # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: fix: fixed corpsmen gloves and the map being mutually exclusive in the corpsman vendor /:cl: Co-authored-by: nefarious <72267018+nefarious6th@users.noreply.github.com> --- .../machinery/vending/vendor_types/squad_prep/squad_medic.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_medic.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_medic.dm index b1961ae9e75b..8fca3b5a0fdd 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_medic.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_medic.dm @@ -128,7 +128,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_medic, list( GLOBAL_LIST_INIT(cm_vending_clothing_medic, list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), list("Standard Marine Apparel", 0, list(/obj/item/clothing/under/marine/medic, /obj/item/clothing/shoes/marine/knife, /obj/item/clothing/gloves/marine, /obj/item/device/radio/headset/almayer/marine, /obj/item/clothing/head/helmet/marine/medic), MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), - list("Combat Sterile Gloves", 0, /obj/item/clothing/gloves/marine/medical, MARINE_CAN_BUY_KIT, VENDOR_ITEM_REGULAR), + list("Combat Sterile Gloves", 0, /obj/item/clothing/gloves/marine/medical, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_REGULAR), list("MRE", 0, /obj/item/storage/box/MRE, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), list("Map", 0, /obj/item/map/current_map, MARINE_CAN_BUY_KIT, VENDOR_ITEM_MANDATORY), From 0b23012e706fadaf84ec03c54842b03f71ee51ce Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 16 Jun 2024 16:45:02 +0100 Subject: [PATCH 26/82] Automatic changelog for PR #6479 [ci skip] --- html/changelogs/AutoChangeLog-pr-6479.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6479.yml diff --git a/html/changelogs/AutoChangeLog-pr-6479.yml b/html/changelogs/AutoChangeLog-pr-6479.yml new file mode 100644 index 000000000000..50dd81ec57e8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6479.yml @@ -0,0 +1,4 @@ +author: "coldironwarrior" +delete-after: True +changes: + - bugfix: "fixed corpsmen gloves and the map being mutually exclusive in the corpsman vendor" \ No newline at end of file From 73f64307849db5c37e426e6763c39f4ae4ad56b6 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Mon, 17 Jun 2024 01:18:21 +0000 Subject: [PATCH 27/82] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-6401.yml | 4 ---- html/changelogs/AutoChangeLog-pr-6405.yml | 4 ---- html/changelogs/AutoChangeLog-pr-6423.yml | 4 ---- html/changelogs/AutoChangeLog-pr-6452.yml | 4 ---- html/changelogs/AutoChangeLog-pr-6458.yml | 4 ---- html/changelogs/AutoChangeLog-pr-6459.yml | 4 ---- html/changelogs/AutoChangeLog-pr-6462.yml | 4 ---- html/changelogs/AutoChangeLog-pr-6470.yml | 4 ---- html/changelogs/AutoChangeLog-pr-6479.yml | 4 ---- html/changelogs/AutoChangeLog-pr-6481.yml | 4 ---- html/changelogs/archive/2024-06.yml | 24 +++++++++++++++++++++++ 11 files changed, 24 insertions(+), 40 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-6401.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6405.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6423.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6452.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6458.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6459.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6462.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6470.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6479.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6481.yml diff --git a/html/changelogs/AutoChangeLog-pr-6401.yml b/html/changelogs/AutoChangeLog-pr-6401.yml deleted file mode 100644 index a5f0a2133c7a..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6401.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Steelpoint" -delete-after: True -changes: - - mapadd: "Civilian Clothing Storage Vendors have been added to the Gym on the USS Almayer. These allow anyone to vend civilian clothes. These vendors require CIC access to unlock however." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6405.yml b/html/changelogs/AutoChangeLog-pr-6405.yml deleted file mode 100644 index d88a19b19eb8..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6405.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "realforest2001" -delete-after: True -changes: - - bugfix: "Medical cryo tubes no longer delete their occupant when destroyed." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6423.yml b/html/changelogs/AutoChangeLog-pr-6423.yml deleted file mode 100644 index 15cf78dfd8e7..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6423.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "TheGamerdk" -delete-after: True -changes: - - rscadd: "Special insert synthetics on most maps will now be able to gain access to synthetic equipment vendors, provided they're given access by USCM command staff. (Synth access on their ID)" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6452.yml b/html/changelogs/AutoChangeLog-pr-6452.yml deleted file mode 100644 index 22d30528512d..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6452.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "TheGamerdk" -delete-after: True -changes: - - bugfix: "The game no longer tricks predators and synths into thinking they're more damaged than they actually are." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6458.yml b/html/changelogs/AutoChangeLog-pr-6458.yml deleted file mode 100644 index c485379cd016..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6458.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "vero5123" -delete-after: True -changes: - - bugfix: "fixes vampire being able to execute hugged marines" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6459.yml b/html/changelogs/AutoChangeLog-pr-6459.yml deleted file mode 100644 index 8ae6f9acd32e..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6459.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "vero5123" -delete-after: True -changes: - - bugfix: "fixes cas being able to target shipside signals" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6462.yml b/html/changelogs/AutoChangeLog-pr-6462.yml deleted file mode 100644 index ab9e321ce5f7..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6462.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "iloveloopers" -delete-after: True -changes: - - qol: "Grow boxes can now be destroyed by xenos." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6470.yml b/html/changelogs/AutoChangeLog-pr-6470.yml deleted file mode 100644 index e166b407e475..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6470.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "GrrrKitten" -delete-after: True -changes: - - bugfix: "fixes a bug that fully jammed guns being used in akimbo" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6479.yml b/html/changelogs/AutoChangeLog-pr-6479.yml deleted file mode 100644 index 50dd81ec57e8..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6479.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "coldironwarrior" -delete-after: True -changes: - - bugfix: "fixed corpsmen gloves and the map being mutually exclusive in the corpsman vendor" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6481.yml b/html/changelogs/AutoChangeLog-pr-6481.yml deleted file mode 100644 index 5451f1e0ac1a..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6481.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "coldironwarrior" -delete-after: True -changes: - - bugfix: "incen OB fire now makes blue light." \ No newline at end of file diff --git a/html/changelogs/archive/2024-06.yml b/html/changelogs/archive/2024-06.yml index a05fd3fb21f6..ca8df2c851cc 100644 --- a/html/changelogs/archive/2024-06.yml +++ b/html/changelogs/archive/2024-06.yml @@ -138,3 +138,27 @@ Drathek: - bugfix: Fixed wallets as IDs breaking many things - admin: Added niche logging for revival attempts +2024-06-17: + GrrrKitten: + - bugfix: fixes a bug that fully jammed guns being used in akimbo + Steelpoint: + - mapadd: Civilian Clothing Storage Vendors have been added to the Gym on the USS + Almayer. These allow anyone to vend civilian clothes. These vendors require + CIC access to unlock however. + TheGamerdk: + - bugfix: The game no longer tricks predators and synths into thinking they're more + damaged than they actually are. + - rscadd: Special insert synthetics on most maps will now be able to gain access + to synthetic equipment vendors, provided they're given access by USCM command + staff. (Synth access on their ID) + coldironwarrior: + - bugfix: fixed corpsmen gloves and the map being mutually exclusive in the corpsman + vendor + - bugfix: incen OB fire now makes blue light. + iloveloopers: + - qol: Grow boxes can now be destroyed by xenos. + realforest2001: + - bugfix: Medical cryo tubes no longer delete their occupant when destroyed. + vero5123: + - bugfix: fixes vampire being able to execute hugged marines + - bugfix: fixes cas being able to target shipside signals From 16717688a14cd05e23f3509f3541c46b7a46eb81 Mon Sep 17 00:00:00 2001 From: Diegoflores31 <47069269+Diegoflores31@users.noreply.github.com> Date: Tue, 18 Jun 2024 10:13:24 -0500 Subject: [PATCH 28/82] Fixes Medals (#6489) # About the pull request GBP farming is so real # Explain why it's good for the game bug bad fixes #6488 # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: fix: Fixes CO being unable to award medals. /:cl: --- code/datums/medal_awards.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/medal_awards.dm b/code/datums/medal_awards.dm index 6949951b7b61..f2dfc6a5c1d5 100644 --- a/code/datums/medal_awards.dm +++ b/code/datums/medal_awards.dm @@ -582,7 +582,7 @@ GLOBAL_DATUM_INIT(ic_medals_panel, /datum/ic_medal_panel, new) return var/mob/living/carbon/human/user = ui.user var/obj/item/card/id/card = user?.get_idcard() - if(card) + if(!card) to_chat(user, SPAN_WARNING("You must have an authenticated ID Card to award medals.")) return From 43a38ff3056998f698647c95af8f9314df65e189 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Tue, 18 Jun 2024 16:18:34 +0100 Subject: [PATCH 29/82] Automatic changelog for PR #6489 [ci skip] --- html/changelogs/AutoChangeLog-pr-6489.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6489.yml diff --git a/html/changelogs/AutoChangeLog-pr-6489.yml b/html/changelogs/AutoChangeLog-pr-6489.yml new file mode 100644 index 000000000000..efb9f1750409 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6489.yml @@ -0,0 +1,4 @@ +author: "Diegoflores31" +delete-after: True +changes: + - bugfix: "Fixes CO being unable to award medals." \ No newline at end of file From eae623b83ab6a6831b82b18bc75429af85a9ba56 Mon Sep 17 00:00:00 2001 From: TheGamerdk <5618080+TheGamerdk@users.noreply.github.com> Date: Tue, 18 Jun 2024 21:58:19 +0200 Subject: [PATCH 30/82] Overwatch console now shows dead people by default (#6485) # About the pull request Pretty important to see who's dead. # Explain why it's good for the game # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: add: Overwatch console shows dead marines by default. /:cl: --- tgui/packages/tgui/interfaces/OverwatchConsole.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tgui/packages/tgui/interfaces/OverwatchConsole.jsx b/tgui/packages/tgui/interfaces/OverwatchConsole.jsx index 6f21c11c125f..ae8637e63c71 100644 --- a/tgui/packages/tgui/interfaces/OverwatchConsole.jsx +++ b/tgui/packages/tgui/interfaces/OverwatchConsole.jsx @@ -361,7 +361,7 @@ const SquadMonitor = (props) => { ); const [showDeadMarines, setShowDeadMarines] = useSharedState( 'showdead', - false, + true, ); const [marineSearch, setMarineSearch] = useSharedState('marinesearch', null); From 6b3231686e869d1e2a9c55410e89cc7d25a29850 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Tue, 18 Jun 2024 21:02:40 +0100 Subject: [PATCH 31/82] Automatic changelog for PR #6485 [ci skip] --- html/changelogs/AutoChangeLog-pr-6485.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6485.yml diff --git a/html/changelogs/AutoChangeLog-pr-6485.yml b/html/changelogs/AutoChangeLog-pr-6485.yml new file mode 100644 index 000000000000..8b72c6cf1f9b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6485.yml @@ -0,0 +1,4 @@ +author: "TheGamerdk" +delete-after: True +changes: + - rscadd: "Overwatch console shows dead marines by default." \ No newline at end of file From ed2fdace706dba045cb74757219a209b25cf8d22 Mon Sep 17 00:00:00 2001 From: Drathek <76988376+Drulikar@users.noreply.github.com> Date: Tue, 18 Jun 2024 15:46:36 -0700 Subject: [PATCH 32/82] Fix global list lookups by name for 3 GLOBs (#6421) # About the pull request This PR adds key uniqueness checks for `GLOB.gear_name_presets_list`, `GLOB.all_yautja_capes`, and `GLOB.all_species` and rectifies various `/datum/equipment_preset` that offended this check. Any that conflicted like this would just not get displayed or looked up correctly. This change applies to more than just the create_humans list. Species and predator cloaks had no offenders to correct. ~~This does make inheritance a bit weird (see changes needed for `/datum/equipment_preset/synth/survivor/wy` that wanted to share an access list), but should we want to address that we need to define when a type is abstract so `setup_gear_name_presets` knows to skip it and ensure all inherited types unset the abstract setting.~~ This relies on the equipment `flags` being set to `EQUIPMENT_PRESET_STUB` when abstract, and then unset for non-abstract types. I also applied this change to predator cloaks and species which do the same thing, but they had no offenders. # Explain why it's good for the game Fixes all these key collisions (and more if any had multiple collisions): ``` [22:39:26]RUNTIME: USCM Surgeon from /datum/equipment_preset/uscm_ship/uscm_medical/doctor/surgeon overlaps with /datum/equipment_preset/uscm_ship/uscm_medical/doctor! It must have a unique name for lookup! - code/__HELPERS/unsorted.dm@1467 [22:39:26]RUNTIME: Combat Correspondent from /datum/equipment_preset/uscm_ship/reporter_uscm overlaps with /datum/equipment_preset/uscm_ship/reporter! It must have a unique name for lookup! - code/__HELPERS/unsorted.dm@1467 [22:39:26]RUNTIME: USCM Senior Enlisted Advisor (SEA) from /datum/equipment_preset/uscm_ship/sea/access overlaps with /datum/equipment_preset/uscm_ship/sea! It must have a unique name for lookup! - code/__HELPERS/unsorted.dm@1467 [22:39:26]RUNTIME: USCM Squad Smartgunner from /datum/equipment_preset/uscm/sg/full overlaps with /datum/equipment_preset/uscm/sg! It must have a unique name for lookup! - code/__HELPERS/unsorted.dm@1467 [22:39:26]RUNTIME: Survivor - PMC from /datum/equipment_preset/survivor/pmc/miner overlaps with /datum/equipment_preset/survivor/pmc! It must have a unique name for lookup! - code/__HELPERS/unsorted.dm@1467 [22:39:26]RUNTIME: CLF Survivor from /datum/equipment_preset/survivor/clf/cold overlaps with /datum/equipment_preset/survivor/clf! It must have a unique name for lookup! - code/__HELPERS/unsorted.dm@1467 [22:39:26]RUNTIME: Corpse from /datum/equipment_preset/corpse/wy overlaps with /datum/equipment_preset/corpse! It must have a unique name for lookup! - code/__HELPERS/unsorted.dm@1467 [22:39:26]RUNTIME: Tutorial from /datum/equipment_preset/tutorial/fed overlaps with /datum/equipment_preset/tutorial! It must have a unique name for lookup! - code/__HELPERS/unsorted.dm@1467 [22:39:26]RUNTIME: Whiteout Team Medic from /datum/equipment_preset/pmc/w_y_whiteout/low_threat/medic overlaps with /datum/equipment_preset/pmc/w_y_whiteout/medic! It must have a unique name for lookup! - code/__HELPERS/unsorted.dm@1467 [22:39:26]RUNTIME: Survivor - Synthetic - Classic Joe from /datum/equipment_preset/synth/survivor/wy overlaps with /datum/equipment_preset/synth/survivor! It must have a unique name for lookup! - code/__HELPERS/unsorted.dm@1467 [22:39:26]RUNTIME: Survivor - Synthetic - Classic Joe from /datum/equipment_preset/synth/survivor/corporate_synth overlaps with /datum/equipment_preset/synth/survivor/wy! It must have a unique name for lookup! - code/__HELPERS/unsorted.dm@1467 [22:39:26]RUNTIME: Survivor - Synthetic - Classic Joe from /datum/equipment_preset/synth/survivor/cmb overlaps with /datum/equipment_preset/synth/survivor/corporate_synth! It must have a unique name for lookup! - code/__HELPERS/unsorted.dm@1467 [22:39:26]RUNTIME: USCM O-7 - Brigadier General (High Command) from /datum/equipment_preset/uscm_event/general/o7 overlaps with /datum/equipment_preset/uscm_event/general! It must have a unique name for lookup! - code/__HELPERS/unsorted.dm@1467 ``` # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: Drathek fix: Fixed various equipment_presets not getting cached or looked up correctly /:cl: --- code/_globalvars/global_lists.dm | 12 ++- code/modules/gear_presets/cmb.dm | 12 --- code/modules/gear_presets/corpses.dm | 3 + code/modules/gear_presets/other.dm | 1 + ...ot_in_progress_insert_fiorina_nightmare.dm | 5 +- code/modules/gear_presets/survivors/misc.dm | 7 +- .../crashlanding-offices_insert_bigred.dm | 74 +++++++++---------- code/modules/gear_presets/synths.dm | 9 +++ code/modules/gear_presets/uscm.dm | 2 +- code/modules/gear_presets/uscm_event.dm | 4 - code/modules/gear_presets/uscm_medical.dm | 4 +- code/modules/gear_presets/uscm_ship.dm | 3 +- code/modules/gear_presets/whiteout.dm | 2 +- 13 files changed, 74 insertions(+), 64 deletions(-) diff --git a/code/_globalvars/global_lists.dm b/code/_globalvars/global_lists.dm index 2bd24af5a0ff..2d07228e8e3d 100644 --- a/code/_globalvars/global_lists.dm +++ b/code/_globalvars/global_lists.dm @@ -311,6 +311,9 @@ GLOBAL_LIST_INIT(hj_emotes, setup_hazard_joe_emotes()) rkey++ var/datum/species/S = new T S.race_key = rkey //Used in mob icon caching. + var/datum/species/existing = all_species[S.name] + if(existing) + stack_trace("[S.name] from [T] overlaps with [existing.type]! It must have a unique name for lookup!") all_species[S.name] = S return all_species @@ -353,6 +356,9 @@ GLOBAL_LIST_INIT(hj_emotes, setup_hazard_joe_emotes()) if (!initial(EP.flags)) continue EP = new T + var/datum/equipment_preset/existing = gear_path_presets_list[EP.name] + if(existing) + stack_trace("[EP.name] from [T] overlaps with [existing.type]! It must have a unique name for lookup!") gear_path_presets_list[EP.name] = EP return sortAssoc(gear_path_presets_list) @@ -464,7 +470,11 @@ GLOBAL_LIST_INIT(hj_emotes, setup_hazard_joe_emotes()) /proc/setup_yautja_capes() var/list/cape_list = list() for(var/obj/item/clothing/yautja_cape/cape_type as anything in typesof(/obj/item/clothing/yautja_cape)) - cape_list[initial(cape_type.name)] = cape_type + var/cape_name = initial(cape_type.name) + var/obj/item/clothing/yautja_cape/existing = cape_list[cape_name] + if(existing) + stack_trace("[cape_name] from [cape_type] overlaps with [existing.type]! It must have a unique name for lookup!") + cape_list[cape_name] = cape_type return cape_list diff --git a/code/modules/gear_presets/cmb.dm b/code/modules/gear_presets/cmb.dm index 8be44f94a2e8..45c06776a4a8 100644 --- a/code/modules/gear_presets/cmb.dm +++ b/code/modules/gear_presets/cmb.dm @@ -460,9 +460,6 @@ /datum/equipment_preset/uscm/cmb/leader name = "USCM Anchorpoint Station Team Leader" flags = EQUIPMENT_PRESET_EXTRA|EQUIPMENT_PRESET_MARINE -/datum/equipment_preset/uscm/cmb/leader/New() - . = ..() - assignment = "Anchorpoint Station Marine Team Leader" rank = JOB_SQUAD_LEADER paygrade = PAY_SHORT_ME6 @@ -505,9 +502,6 @@ /datum/equipment_preset/uscm/cmb/rto name = "USCM Anchorpoint Station Technical Specialist" flags = EQUIPMENT_PRESET_EXTRA|EQUIPMENT_PRESET_MARINE -/datum/equipment_preset/uscm/cmb/rto/New() - . = ..() - assignment = "Anchorpoint Station Marine Technical Specialist" rank = JOB_SQUAD_TEAM_LEADER paygrade = PAY_SHORT_ME4 @@ -550,9 +544,6 @@ /datum/equipment_preset/uscm/cmb/medic name = "USCM Anchorpoint Station Corpsman" flags = EQUIPMENT_PRESET_EXTRA|EQUIPMENT_PRESET_MARINE -/datum/equipment_preset/uscm/cmb/medic/New() - . = ..() - assignment = "Anchorpoint Station Hospital Corpsman" rank = JOB_SQUAD_MEDIC paygrade = PAY_SHORT_ME3 @@ -611,9 +602,6 @@ /datum/equipment_preset/uscm/cmb/smartgunner name = "USCM Anchorpoint Station Smartgunner" flags = EQUIPMENT_PRESET_EXTRA|EQUIPMENT_PRESET_MARINE -/datum/equipment_preset/uscm/cmb/smartgunner/New() - . = ..() - assignment = "Anchorpoint Station Marine Smartgunner" rank = JOB_SQUAD_SMARTGUN paygrade = PAY_SHORT_ME3 diff --git a/code/modules/gear_presets/corpses.dm b/code/modules/gear_presets/corpses.dm index b8330e0e4c70..7bf9592a6209 100644 --- a/code/modules/gear_presets/corpses.dm +++ b/code/modules/gear_presets/corpses.dm @@ -529,6 +529,9 @@ //Colonial Supervisor +/datum/equipment_preset/corpse/wy + flags = EQUIPMENT_PRESET_STUB + /datum/equipment_preset/corpse/wy/manager name = "Corpse - Corporate Supervisor" assignment = "Colony Supervisor" diff --git a/code/modules/gear_presets/other.dm b/code/modules/gear_presets/other.dm index f51a5bfe5f76..9e4ca1472f08 100644 --- a/code/modules/gear_presets/other.dm +++ b/code/modules/gear_presets/other.dm @@ -968,6 +968,7 @@ new_human.nutrition = NUTRITION_LOW /datum/equipment_preset/tutorial/fed + name = "Tutorial (Fed)" underfed = FALSE diff --git a/code/modules/gear_presets/survivors/fiorina_sciannex/riot_in_progress_insert_fiorina_nightmare.dm b/code/modules/gear_presets/survivors/fiorina_sciannex/riot_in_progress_insert_fiorina_nightmare.dm index 3fdbe72c05be..c09e6eee9385 100644 --- a/code/modules/gear_presets/survivors/fiorina_sciannex/riot_in_progress_insert_fiorina_nightmare.dm +++ b/code/modules/gear_presets/survivors/fiorina_sciannex/riot_in_progress_insert_fiorina_nightmare.dm @@ -83,7 +83,10 @@ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/mp5, WEAR_IN_R_STORE) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/mp5, WEAR_IN_R_STORE) -// cmb synth +// cmb synth (of note /datum/equipment_preset/synth/survivor/cmb_synth also exists) +/datum/equipment_preset/synth/survivor/cmb + flags = EQUIPMENT_PRESET_STUB + /datum/equipment_preset/synth/survivor/cmb/synth name = "Survivor - Synthetic - CMB Investigative Synthetic(Riot Response)" paygrade = PAY_SHORT_CMBS diff --git a/code/modules/gear_presets/survivors/misc.dm b/code/modules/gear_presets/survivors/misc.dm index 5b010a8cb8ea..329bac97a89f 100644 --- a/code/modules/gear_presets/survivors/misc.dm +++ b/code/modules/gear_presets/survivors/misc.dm @@ -204,8 +204,8 @@ Everything below isn't used or out of place. // ----- Mercenary Survivors -// after double check pmc/miner/one isn't being used anywhere. -/datum/equipment_preset/survivor/pmc/miner/one +// after double check pmc/miner isn't being used anywhere. +/datum/equipment_preset/survivor/pmc/miner name = "Survivor - Mercenary" flags = EQUIPMENT_PRESET_START_OF_ROUND @@ -214,7 +214,7 @@ Everything below isn't used or out of place. flags = EQUIPMENT_PRESET_START_OF_ROUND access = list(ACCESS_CIVILIAN_PUBLIC) -/datum/equipment_preset/survivor/pmc/miner/one/load_gear(mob/living/carbon/human/new_human) +/datum/equipment_preset/survivor/pmc/miner/load_gear(mob/living/carbon/human/new_human) new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/veteran/mercenary/miner, WEAR_BODY) new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/veteran/mercenary/miner, WEAR_JACKET) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/veteran/mercenary/miner, WEAR_HEAD) @@ -293,6 +293,7 @@ Everything below isn't used or out of place. /// used in Shivas Snowball /datum/equipment_preset/survivor/clf/cold + name = "CLF Survivor (Cold)" //children of spawn rebel shoes proc /datum/equipment_preset/survivor/clf/cold/spawn_rebel_suit(mob/living/carbon/human/human) diff --git a/code/modules/gear_presets/survivors/solaris/crashlanding-offices_insert_bigred.dm b/code/modules/gear_presets/survivors/solaris/crashlanding-offices_insert_bigred.dm index 44d029d44c87..66992f2508c0 100644 --- a/code/modules/gear_presets/survivors/solaris/crashlanding-offices_insert_bigred.dm +++ b/code/modules/gear_presets/survivors/solaris/crashlanding-offices_insert_bigred.dm @@ -152,42 +152,42 @@ role_comm_title = "WY Syn" /datum/equipment_preset/synth/survivor/pmc/load_race(mob/living/carbon/human/new_human) - new_human.set_species(SYNTH_GEN_THREE) + new_human.set_species(SYNTH_GEN_THREE) /datum/equipment_preset/synth/survivor/pmc/load_gear(mob/living/carbon/human/new_human) - new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/veteran/pmc, WEAR_BODY) - new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/storage/droppouch, WEAR_ACCESSORY) - new_human.equip_to_slot_or_del(new /obj/item/tool/surgery/scalpel/manager, WEAR_IN_ACCESSORY) - new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/drinks/flask/weylandyutani, WEAR_IN_ACCESSORY) - new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs/zip, WEAR_IN_ACCESSORY) - new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/veteran/pmc/light/synth, WEAR_JACKET) - new_human.equip_to_slot_or_del(new /obj/item/weapon/telebaton, WEAR_IN_JACKET) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/nailgun, WEAR_IN_JACKET) - - new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/veteran/pmc, WEAR_HEAD) - new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/pmc/command/hvh, WEAR_L_EAR) - new_human.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/pmc, WEAR_FACE) - - new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran/pmc, WEAR_HANDS) - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/veteran/pmc/knife, WEAR_FEET) - - new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/smartpack/white, WEAR_BACK) - new_human.equip_to_slot_or_del(new /obj/item/roller, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/roller/surgical, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/device/defibrillator/upgraded, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/tool/crew_monitor, WEAR_IN_BACK) - - new_human.equip_to_slot_or_del(new /obj/item/storage/belt/medical/lifesaver/full/dutch, WEAR_WAIST) - new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/smg/nailgun/compact, WEAR_J_STORE) - - new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/tools/tactical, WEAR_L_STORE) - new_human.equip_to_slot_or_del(new /obj/item/tool/screwdriver/tactical, WEAR_IN_L_STORE) - new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar/tactical, WEAR_IN_L_STORE) - new_human.equip_to_slot_or_del(new /obj/item/tool/wirecutters/tactical, WEAR_IN_L_STORE) - new_human.equip_to_slot_or_del(new /obj/item/tool/wrench, WEAR_IN_L_STORE) - new_human.equip_to_slot_or_del(new /obj/item/stack/cable_coil, WEAR_IN_L_STORE) - new_human.equip_to_slot_or_del(new /obj/item/stack/cable_coil, WEAR_IN_L_STORE) - new_human.equip_to_slot_or_del(new /obj/item/device/multitool, WEAR_IN_L_STORE) - new_human.equip_to_slot_or_del(new /obj/item/tool/weldingtool/hugetank, WEAR_IN_L_STORE) - new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/construction/full_barbed_wire, WEAR_R_STORE) + new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/veteran/pmc, WEAR_BODY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/storage/droppouch, WEAR_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/tool/surgery/scalpel/manager, WEAR_IN_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/drinks/flask/weylandyutani, WEAR_IN_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs/zip, WEAR_IN_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/veteran/pmc/light/synth, WEAR_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/weapon/telebaton, WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/nailgun, WEAR_IN_JACKET) + + new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/veteran/pmc, WEAR_HEAD) + new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/pmc/command/hvh, WEAR_L_EAR) + new_human.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/pmc, WEAR_FACE) + + new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran/pmc, WEAR_HANDS) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/veteran/pmc/knife, WEAR_FEET) + + new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/smartpack/white, WEAR_BACK) + new_human.equip_to_slot_or_del(new /obj/item/roller, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/roller/surgical, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/device/defibrillator/upgraded, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/tool/crew_monitor, WEAR_IN_BACK) + + new_human.equip_to_slot_or_del(new /obj/item/storage/belt/medical/lifesaver/full/dutch, WEAR_WAIST) + new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/smg/nailgun/compact, WEAR_J_STORE) + + new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/tools/tactical, WEAR_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/tool/screwdriver/tactical, WEAR_IN_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar/tactical, WEAR_IN_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/tool/wirecutters/tactical, WEAR_IN_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/tool/wrench, WEAR_IN_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/stack/cable_coil, WEAR_IN_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/stack/cable_coil, WEAR_IN_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/device/multitool, WEAR_IN_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/tool/weldingtool/hugetank, WEAR_IN_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/construction/full_barbed_wire, WEAR_R_STORE) diff --git a/code/modules/gear_presets/synths.dm b/code/modules/gear_presets/synths.dm index 9bfa2335e94a..2fde67e931b9 100644 --- a/code/modules/gear_presets/synths.dm +++ b/code/modules/gear_presets/synths.dm @@ -147,6 +147,9 @@ . = ..() access = get_access(ACCESS_LIST_WY_PMC) +/datum/equipment_preset/synth/survivor/wy + flags = EQUIPMENT_PRESET_STUB + /datum/equipment_preset/synth/survivor/wy/New() . = ..() access = get_access(ACCESS_LIST_COLONIAL_ALL) + get_region_accesses(2) + get_region_accesses(4) + ACCESS_MARINE_RESEARCH + ACCESS_WY_GENERAL // for WY synths - admin building and wy fax machines access @@ -268,6 +271,9 @@ survivor_variant = ENGINEERING_SURVIVOR +/datum/equipment_preset/synth/survivor/corporate_synth + name = "Survivor - Synthetic - Corporate Synth" + /datum/equipment_preset/synth/survivor/corporate_synth/load_gear(mob/living/carbon/human/new_human) ..() add_random_cl_survivor_loot(new_human) @@ -473,6 +479,7 @@ ) survivor_variant = SECURITY_SURVIVOR + flags = EQUIPMENT_PRESET_EXTRA /datum/equipment_preset/synth/survivor/wy/protection_synth name = "Survivor - Synthetic - Corporate Protection Synth" @@ -495,6 +502,7 @@ ) survivor_variant = SECURITY_SURVIVOR + flags = EQUIPMENT_PRESET_EXTRA /datum/equipment_preset/synth/survivor/wy/corporate_synth name = "Survivor - Synthetic - Corporate Clerical Synth" @@ -517,6 +525,7 @@ ) survivor_variant = CORPORATE_SURVIVOR + flags = EQUIPMENT_PRESET_EXTRA /datum/equipment_preset/synth/survivor/icc_synth name = "Survivor - Synthetic - Interstellar Commerce Commission Synthetic" diff --git a/code/modules/gear_presets/uscm.dm b/code/modules/gear_presets/uscm.dm index b1a7fe48f9a9..c17aa2af3633 100644 --- a/code/modules/gear_presets/uscm.dm +++ b/code/modules/gear_presets/uscm.dm @@ -131,7 +131,7 @@ //*****************************************************************************************************/ /datum/equipment_preset/uscm/sg/full - name = "USCM Squad Smartgunner" + name = "USCM Squad Smartgunner (Full)" flags = EQUIPMENT_PRESET_EXTRA|EQUIPMENT_PRESET_MARINE /datum/equipment_preset/uscm/sg/full/load_gear(mob/living/carbon/human/new_human) diff --git a/code/modules/gear_presets/uscm_event.dm b/code/modules/gear_presets/uscm_event.dm index eb206c8259bf..1a03dc3f6b22 100644 --- a/code/modules/gear_presets/uscm_event.dm +++ b/code/modules/gear_presets/uscm_event.dm @@ -104,10 +104,6 @@ new_human.equip_if_possible(new /obj/item/clothing/glasses/sunglasses(new_human), WEAR_EYES) -/datum/equipment_preset/uscm_event/general/o7 - name = "USCM O-7 - Brigadier General (High Command)" - paygrade = PAY_SHORT_MO7 - /datum/equipment_preset/uscm_event/general/o8 name = "USCM O-8 - Major General (High Command)" paygrade = PAY_SHORT_MO8 diff --git a/code/modules/gear_presets/uscm_medical.dm b/code/modules/gear_presets/uscm_medical.dm index 019095f9ce38..75152268326c 100644 --- a/code/modules/gear_presets/uscm_medical.dm +++ b/code/modules/gear_presets/uscm_medical.dm @@ -62,7 +62,7 @@ //*****************************************************************************************************/ /datum/equipment_preset/uscm_ship/uscm_medical/doctor - name = "USCM Surgeon" + name = "USCM Doctor" assignment = JOB_DOCTOR rank = JOB_DOCTOR @@ -85,7 +85,7 @@ //Surgeon this part of the code is to change the name on your ID /datum/equipment_preset/uscm_ship/uscm_medical/doctor/surgeon - + name = "USCM Surgeon" assignment = JOB_SURGEON /datum/equipment_preset/uscm_ship/uscm_medical/doctor/surgeon/load_gear(mob/living/carbon/human/new_human) diff --git a/code/modules/gear_presets/uscm_ship.dm b/code/modules/gear_presets/uscm_ship.dm index 9bccf2a2ec78..a53504fec0c9 100644 --- a/code/modules/gear_presets/uscm_ship.dm +++ b/code/modules/gear_presets/uscm_ship.dm @@ -102,7 +102,7 @@ //*****************************************************************************************************/ /datum/equipment_preset/uscm_ship/reporter - name = "Combat Correspondent" + name = "Combat Correspondent (Press)" flags = EQUIPMENT_PRESET_START_OF_ROUND access = list( @@ -586,7 +586,6 @@ flags = EQUIPMENT_PRESET_START_OF_ROUND|EQUIPMENT_PRESET_MARINE idtype = /obj/item/card/id/silver - access assignment = JOB_SEA rank = JOB_SEA paygrade = PAY_SHORT_ME7 diff --git a/code/modules/gear_presets/whiteout.dm b/code/modules/gear_presets/whiteout.dm index b9ca1a6e02d4..75e8e013c03f 100644 --- a/code/modules/gear_presets/whiteout.dm +++ b/code/modules/gear_presets/whiteout.dm @@ -270,7 +270,7 @@ //*****************************************************************************************************/ /datum/equipment_preset/pmc/w_y_whiteout/low_threat/medic - name = "Whiteout Team Medic" + name = "Whiteout Team Operative Medic" /datum/equipment_preset/pmc/w_y_whiteout/low_threat/medic/load_gear(mob/living/carbon/human/new_human) // back From 8c300a4d06b722d489cb43763bde0a101b369c79 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Tue, 18 Jun 2024 23:50:58 +0100 Subject: [PATCH 33/82] Automatic changelog for PR #6421 [ci skip] --- html/changelogs/AutoChangeLog-pr-6421.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6421.yml diff --git a/html/changelogs/AutoChangeLog-pr-6421.yml b/html/changelogs/AutoChangeLog-pr-6421.yml new file mode 100644 index 000000000000..43f38828f648 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6421.yml @@ -0,0 +1,4 @@ +author: "Drathek" +delete-after: True +changes: + - bugfix: "Fixed various equipment_presets not getting cached or looked up correctly" \ No newline at end of file From 86f1566b5a108e413ea17aa7cf1437ede4eaa6c2 Mon Sep 17 00:00:00 2001 From: Git-Nivrak <59925169+Git-Nivrak@users.noreply.github.com> Date: Wed, 19 Jun 2024 02:28:23 +0300 Subject: [PATCH 34/82] Dir assist now prioritises non-xenos (#6461) # About the pull request This PR makes it so when using dir assist against a xeno and a non-xeno on the same tile the attack will prioritize the non-xeno over the xeno. # Explain why it's good for the game You are more likely to want to target the marine than shove\slash the xeno ontop of the marine. It is annoying when John runner stands ontop of the guy you are currently pulling and now you have to click the 3 remaining pixels visible. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: qol: Dir-assist will now prioritize non-xenos over xenos. /:cl: --- code/_onclick/xeno.dm | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/code/_onclick/xeno.dm b/code/_onclick/xeno.dm index 453539ff1c3f..1ef89999eea6 100644 --- a/code/_onclick/xeno.dm +++ b/code/_onclick/xeno.dm @@ -13,6 +13,7 @@ if(isturf(target) && tile_attack) //Attacks on turfs must be done indirectly through directional attacks or clicking own sprite. var/turf/T = target + var/mob/living/non_xeno_target for(var/mob/living/L in T) if (!iscarbon(L)) if (!alt) @@ -21,13 +22,19 @@ if (!L.is_xeno_grabbable() || L == src) //Xenos never attack themselves. continue + var/isxeno = isxeno(L) + if(!isxeno) + non_xeno_target = L if (L.body_position == LYING_DOWN) alt = L continue + else if (!isxeno) + break target = L - break if (target == T && alt) target = alt + if(non_xeno_target) + target = non_xeno_target if (T && ignores_resin) // Will not target resin walls and doors if this is set to true. This is normally only set to true through a directional attack. if(istype(T, /obj/structure/mineral_door/resin)) var/obj/structure/mineral_door/resin/attacked_door = T From f8319715299192d5e2af9ecbd35f672d7bf3a017 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 19 Jun 2024 00:32:41 +0100 Subject: [PATCH 35/82] Automatic changelog for PR #6461 [ci skip] --- html/changelogs/AutoChangeLog-pr-6461.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6461.yml diff --git a/html/changelogs/AutoChangeLog-pr-6461.yml b/html/changelogs/AutoChangeLog-pr-6461.yml new file mode 100644 index 000000000000..b3f9eeae44f2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6461.yml @@ -0,0 +1,4 @@ +author: "Git-Nivrak" +delete-after: True +changes: + - qol: "Dir-assist will now prioritize non-xenos over xenos." \ No newline at end of file From 6dd490aedf4373455066c5dee4efeae50b59e3e2 Mon Sep 17 00:00:00 2001 From: Vile Beggar Date: Wed, 19 Jun 2024 02:27:53 +0200 Subject: [PATCH 36/82] Changes the firing sound of the M44 combat revolver (#6356) # About the pull request changes the firing sound of the M44 revolver to a beefier one # Explain why it's good for the game after the damage buff the revolver has received, the gun feels notably more punchier but i feel as if the firing sound has stayed behind in that regard. it sounds like a peashooter. i think that with this change it's an objectively better sounding weapon. # Testing Photographs and Procedure
Screenshots & Videos old vs new comparison https://github.com/cmss13-devs/cmss13/assets/17518895/3886d975-2207-482c-93de-f85e90f45c19
# Changelog :cl: soundadd: The M44 combat revolver has had its firing sound changed. /:cl: --- code/modules/projectiles/guns/revolvers.dm | 2 +- sound/weapons/gun_44mag_v4.ogg | Bin 0 -> 24097 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 sound/weapons/gun_44mag_v4.ogg diff --git a/code/modules/projectiles/guns/revolvers.dm b/code/modules/projectiles/guns/revolvers.dm index d031074dabd7..1c2adc2360a3 100644 --- a/code/modules/projectiles/guns/revolvers.dm +++ b/code/modules/projectiles/guns/revolvers.dm @@ -6,7 +6,7 @@ w_class = SIZE_MEDIUM matter = list("metal" = 2000) - fire_sound = 'sound/weapons/gun_44mag_v3.ogg' + fire_sound = 'sound/weapons/gun_44mag_v4.ogg' reload_sound = 'sound/weapons/gun_44mag_speed_loader.wav' cocked_sound = 'sound/weapons/gun_revolver_spun.ogg' unload_sound = 'sound/weapons/gun_44mag_open_chamber.wav' diff --git a/sound/weapons/gun_44mag_v4.ogg b/sound/weapons/gun_44mag_v4.ogg new file mode 100644 index 0000000000000000000000000000000000000000..6c1ad1b32ef75234ba889361beef724f4d0adde9 GIT binary patch literal 24097 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 Xur(KE>sB%W*t*pTY~}OX`Sn= literal 0 HcmV?d00001 From 60008ea61d09e51622bc2e4b77732bd11ac235d2 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 19 Jun 2024 01:32:47 +0100 Subject: [PATCH 37/82] Automatic changelog for PR #6356 [ci skip] --- html/changelogs/AutoChangeLog-pr-6356.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6356.yml diff --git a/html/changelogs/AutoChangeLog-pr-6356.yml b/html/changelogs/AutoChangeLog-pr-6356.yml new file mode 100644 index 000000000000..4ae5d19f8048 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6356.yml @@ -0,0 +1,4 @@ +author: "VileBeggar" +delete-after: True +changes: + - soundadd: "The M44 combat revolver has had its firing sound changed." \ No newline at end of file From 07f5cbdc6b3c0a6df562138023f2fb0dec1a4f5c Mon Sep 17 00:00:00 2001 From: wshuwshuwshi <91352251+wshuwshuwshi@users.noreply.github.com> Date: Tue, 18 Jun 2024 18:57:35 -0600 Subject: [PATCH 38/82] Makes Anti-parasitic slightly more powerful to match larva gestation increases (#6407) # About the pull request Larva gestation was sped up at one point or another, and that made Anti-parasitic too slow to actually prevent gestation or remove parasites at all Applies a 1.5 multiplier to the potency removed from the larva timer. # Explain why it's good for the game Larva gestation was sped up at one point or another, and that made Anti-parasitic too slow to actually prevent gestation or remove parasites at all. In its current state, Anti-Parasitic is incapable of removing larvae at higher levels, due to it being too slow acting, with a slight increase, it may be viable (of note, I'm not sure if the 1.5 multiplier is actually high enough to be able to counter-act and remove larvae, and may need to be increased further) Of note, it still does potency burn damage, meaning that if it is at potency 8, it will do 8 burn damage to whatever the chemical is being metabolized in. Gives the Antiparasitic chemical property its niche back. At lower levels it's supposed to delay the inevitable and buy time for the marine to get to surgeons, and at higher levels it's supposed to cure larvae from the marine. Currently, it's not powerful enough to do either to a noticeable degree. # Testing Photographs and Procedure N/A. All that was done was add a 1.5 multiplier to the potency, when it is removed from the larva timer # Changelog :cl: fix: Adds a 1.5x modifier to the amount taken from larva timer based on chem property level fix: swaps the 1.5 multiplier for a delta_time multiplier fix: improved the formatting of the code to have proper spacing /:cl: --- code/modules/reagents/chemistry_properties/prop_positive.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry_properties/prop_positive.dm b/code/modules/reagents/chemistry_properties/prop_positive.dm index d469daff494c..bbbb7f27639f 100644 --- a/code/modules/reagents/chemistry_properties/prop_positive.dm +++ b/code/modules/reagents/chemistry_properties/prop_positive.dm @@ -492,7 +492,7 @@ var/obj/item/alien_embryo/embryo = content if(embryo && istype(embryo)) if(embryo.counter > 0) - embryo.counter = embryo.counter - potency + embryo.counter = embryo.counter - (potency * delta_time) current_human.take_limb_damage(0,POTENCY_MULTIPLIER_MEDIUM*potency) else embryo.stage-- From d818562302ec1fd4dbaafc3ae28d3d74c8236d26 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 19 Jun 2024 02:02:25 +0100 Subject: [PATCH 39/82] Automatic changelog for PR #6407 [ci skip] --- html/changelogs/AutoChangeLog-pr-6407.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6407.yml diff --git a/html/changelogs/AutoChangeLog-pr-6407.yml b/html/changelogs/AutoChangeLog-pr-6407.yml new file mode 100644 index 000000000000..f31700e4c1d7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6407.yml @@ -0,0 +1,6 @@ +author: "wshuwshuwshi" +delete-after: True +changes: + - bugfix: "Adds a 1.5x modifier to the amount taken from larva timer based on chem property level" + - bugfix: "swaps the 1.5 multiplier for a delta_time multiplier" + - bugfix: "improved the formatting of the code to have proper spacing" \ No newline at end of file From d7f26d7862bca5ca492c7e14245d584f2648e13c Mon Sep 17 00:00:00 2001 From: Red <47158596+Red-byte3D@users.noreply.github.com> Date: Wed, 19 Jun 2024 03:58:16 +0300 Subject: [PATCH 40/82] Ups protective form cost from 50 to 150 for synths (#6414) # About the pull request Increases the power requirement from 50 to 150 for protective form. # Explain why it's good for the game Synths shouldnt be able to use this ability 4 times without any cooldown to tank the entire hive. An ability that reduces the damage you take (up to %80 with base stats) should have some sort of a high requirement since the "power" is already refillable instantly anyways. This will make it so synths cant just rush into the entire hive and recover a marine. or atleast make them think on how they do it so they arent given free leeway due to the amount of times you can use it. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: balance: Synthetic Protective Form now takes 150 charge instead of 50. /:cl: Co-authored-by: InsaneRed --- code/game/objects/items/storage/smartpack.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/storage/smartpack.dm b/code/game/objects/items/storage/smartpack.dm index d012e773617b..3763064aa333 100644 --- a/code/game/objects/items/storage/smartpack.dm +++ b/code/game/objects/items/storage/smartpack.dm @@ -1,5 +1,5 @@ #define BACKPACK_LIGHT_LEVEL 6 -#define PROTECTIVE_COST 50 +#define PROTECTIVE_COST 150 #define REPAIR_COST 100 #define IMMOBILE_COST 20 From 04dad22b8f1f0eea59b25c3182acab06d4989c94 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 19 Jun 2024 02:09:53 +0100 Subject: [PATCH 41/82] Automatic changelog for PR #6414 [ci skip] --- html/changelogs/AutoChangeLog-pr-6414.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6414.yml diff --git a/html/changelogs/AutoChangeLog-pr-6414.yml b/html/changelogs/AutoChangeLog-pr-6414.yml new file mode 100644 index 000000000000..36da9f801ed6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6414.yml @@ -0,0 +1,4 @@ +author: "Red-byte3D" +delete-after: True +changes: + - balance: "Synthetic Protective Form now takes 150 charge instead of 50." \ No newline at end of file From 5da7a7f69a4d6cc95a17302f8c781a9d8a4428c5 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 19 Jun 2024 01:16:40 +0000 Subject: [PATCH 42/82] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-6356.yml | 4 ---- html/changelogs/AutoChangeLog-pr-6407.yml | 6 ------ html/changelogs/AutoChangeLog-pr-6414.yml | 4 ---- html/changelogs/AutoChangeLog-pr-6421.yml | 4 ---- html/changelogs/AutoChangeLog-pr-6461.yml | 4 ---- html/changelogs/AutoChangeLog-pr-6485.yml | 4 ---- html/changelogs/AutoChangeLog-pr-6489.yml | 4 ---- html/changelogs/archive/2024-06.yml | 18 ++++++++++++++++++ 8 files changed, 18 insertions(+), 30 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-6356.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6407.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6414.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6421.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6461.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6485.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6489.yml diff --git a/html/changelogs/AutoChangeLog-pr-6356.yml b/html/changelogs/AutoChangeLog-pr-6356.yml deleted file mode 100644 index 4ae5d19f8048..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6356.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "VileBeggar" -delete-after: True -changes: - - soundadd: "The M44 combat revolver has had its firing sound changed." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6407.yml b/html/changelogs/AutoChangeLog-pr-6407.yml deleted file mode 100644 index f31700e4c1d7..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6407.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "wshuwshuwshi" -delete-after: True -changes: - - bugfix: "Adds a 1.5x modifier to the amount taken from larva timer based on chem property level" - - bugfix: "swaps the 1.5 multiplier for a delta_time multiplier" - - bugfix: "improved the formatting of the code to have proper spacing" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6414.yml b/html/changelogs/AutoChangeLog-pr-6414.yml deleted file mode 100644 index 36da9f801ed6..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6414.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Red-byte3D" -delete-after: True -changes: - - balance: "Synthetic Protective Form now takes 150 charge instead of 50." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6421.yml b/html/changelogs/AutoChangeLog-pr-6421.yml deleted file mode 100644 index 43f38828f648..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6421.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Drathek" -delete-after: True -changes: - - bugfix: "Fixed various equipment_presets not getting cached or looked up correctly" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6461.yml b/html/changelogs/AutoChangeLog-pr-6461.yml deleted file mode 100644 index b3f9eeae44f2..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6461.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Git-Nivrak" -delete-after: True -changes: - - qol: "Dir-assist will now prioritize non-xenos over xenos." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6485.yml b/html/changelogs/AutoChangeLog-pr-6485.yml deleted file mode 100644 index 8b72c6cf1f9b..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6485.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "TheGamerdk" -delete-after: True -changes: - - rscadd: "Overwatch console shows dead marines by default." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6489.yml b/html/changelogs/AutoChangeLog-pr-6489.yml deleted file mode 100644 index efb9f1750409..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6489.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Diegoflores31" -delete-after: True -changes: - - bugfix: "Fixes CO being unable to award medals." \ No newline at end of file diff --git a/html/changelogs/archive/2024-06.yml b/html/changelogs/archive/2024-06.yml index ca8df2c851cc..e2d313f722e9 100644 --- a/html/changelogs/archive/2024-06.yml +++ b/html/changelogs/archive/2024-06.yml @@ -162,3 +162,21 @@ vero5123: - bugfix: fixes vampire being able to execute hugged marines - bugfix: fixes cas being able to target shipside signals +2024-06-19: + Diegoflores31: + - bugfix: Fixes CO being unable to award medals. + Drathek: + - bugfix: Fixed various equipment_presets not getting cached or looked up correctly + Git-Nivrak: + - qol: Dir-assist will now prioritize non-xenos over xenos. + Red-byte3D: + - balance: Synthetic Protective Form now takes 150 charge instead of 50. + TheGamerdk: + - rscadd: Overwatch console shows dead marines by default. + VileBeggar: + - soundadd: The M44 combat revolver has had its firing sound changed. + wshuwshuwshi: + - bugfix: Adds a 1.5x modifier to the amount taken from larva timer based on chem + property level + - bugfix: swaps the 1.5 multiplier for a delta_time multiplier + - bugfix: improved the formatting of the code to have proper spacing From 8f756b8655ad2a3deb7e50417cff4b3224e44206 Mon Sep 17 00:00:00 2001 From: Nomoresolvalou Date: Tue, 18 Jun 2024 20:24:30 -0500 Subject: [PATCH 43/82] Synthetic Vendor Mask Additions (#6426) # About the pull request Adds masks to the synthetic snowflake vendor # Explain why it's good for the game More synth drip is good # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: add: Added masks to synth snowflake vendor /:cl: --- .../vending/vendor_types/crew/synthetic.dm | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/code/game/machinery/vending/vendor_types/crew/synthetic.dm b/code/game/machinery/vending/vendor_types/crew/synthetic.dm index 550a08473a4b..1ece8d353d4f 100644 --- a/code/game/machinery/vending/vendor_types/crew/synthetic.dm +++ b/code/game/machinery/vending/vendor_types/crew/synthetic.dm @@ -273,6 +273,27 @@ GLOBAL_LIST_INIT(cm_vending_clothing_synth_snowflake, list( list("Corpsman Helmet", 12, /obj/item/clothing/head/helmet/marine/medic, null, VENDOR_ITEM_REGULAR), list("Attachable Helmet Shield", 12, /obj/item/prop/helmetgarb/riot_shield, null, VENDOR_ITEM_REGULAR), + list("MASK", 0, null, null, null), + list("Surgical Mask", 12, /obj/item/clothing/mask/surgical, null, VENDOR_ITEM_REGULAR), + list("Rebreather", 12, /obj/item/clothing/mask/rebreather, null, VENDOR_ITEM_REGULAR), + list("Skull Balaclava, Blue", 12, /obj/item/clothing/mask/rebreather/skull, null, VENDOR_ITEM_REGULAR), + list("Skull balaclava, Black", 12, /obj/item/clothing/mask/rebreather/skull/black, null, VENDOR_ITEM_REGULAR), + list("Balaclava", 12, /obj/item/clothing/mask/rebreather/scarf, null, VENDOR_ITEM_REGULAR), + list("Balaclava (Green)", 12, /obj/item/clothing/mask/rebreather/scarf/green, null, VENDOR_ITEM_REGULAR), + list("Balaclava (Tan)", 12, /obj/item/clothing/mask/rebreather/scarf/tan, null, VENDOR_ITEM_REGULAR), + list("Balaclava (Grey)", 12, /obj/item/clothing/mask/rebreather/scarf/gray, null, VENDOR_ITEM_REGULAR), + list("Wrap (Grey)", 12, /obj/item/clothing/mask/rebreather/scarf/tacticalmask, null, VENDOR_ITEM_REGULAR), + list("Wrap (Red)", 12, /obj/item/clothing/mask/rebreather/scarf/tacticalmask/red, null, VENDOR_ITEM_REGULAR), + list("Wrap (Green)", 12, /obj/item/clothing/mask/rebreather/scarf/tacticalmask/green, null, VENDOR_ITEM_REGULAR), + list("Wrap (Tan)", 12, /obj/item/clothing/mask/rebreather/scarf/tacticalmask/tan, null, VENDOR_ITEM_REGULAR), + list("Wrap (Black)", 12, /obj/item/clothing/mask/rebreather/scarf/tacticalmask/black, null, VENDOR_ITEM_REGULAR), + list("Scarf", 12, /obj/item/clothing/mask/tornscarf, null, VENDOR_ITEM_REGULAR), + list("Scarf (Green)", 12, /obj/item/clothing/mask/tornscarf/green, null, VENDOR_ITEM_REGULAR), + list("Scarf (Snow)", 12, /obj/item/clothing/mask/tornscarf/snow, null, VENDOR_ITEM_REGULAR), + list("Scarf (Desert)", 12, /obj/item/clothing/mask/tornscarf/desert, null, VENDOR_ITEM_REGULAR), + list("Scarf (Urban)", 12, /obj/item/clothing/mask/tornscarf/urban, null, VENDOR_ITEM_REGULAR), + list("Scarf (Black)", 12, /obj/item/clothing/mask/tornscarf/black, null, VENDOR_ITEM_REGULAR), + list("SUIT", 0, null, null, null), list("Bomber Jacket, Brown", 12, /obj/item/clothing/suit/storage/bomber, null, VENDOR_ITEM_REGULAR), list("Bomber Jacket, Black", 12, /obj/item/clothing/suit/storage/bomber/alt, null, VENDOR_ITEM_REGULAR), From 3aa0feef5391d794418cd5522d231997a1a9a73e Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 19 Jun 2024 02:28:55 +0100 Subject: [PATCH 44/82] Automatic changelog for PR #6426 [ci skip] --- html/changelogs/AutoChangeLog-pr-6426.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6426.yml diff --git a/html/changelogs/AutoChangeLog-pr-6426.yml b/html/changelogs/AutoChangeLog-pr-6426.yml new file mode 100644 index 000000000000..6efdd3183ee5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6426.yml @@ -0,0 +1,4 @@ +author: "Nomoresolvalou" +delete-after: True +changes: + - rscadd: "Added masks to synth snowflake vendor" \ No newline at end of file From 29c06e4a2e6bfb1553c4bff86f89a556260552a5 Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Tue, 18 Jun 2024 23:16:45 -0400 Subject: [PATCH 45/82] adds upgraded fuel tanks to the research biomass machine (#6415) # About the pull request adds new upgraded smoke and normal fuel tanks printable by the biomass machine upgraded smoke tank has a 200 unit capacity instead of 100 upgraded custom tank has 60 max intensity and 50 duration, 7 tile range and 200 unit capacity (you still have to make a flamer fuel that reaches these caps) i will be severely impressed if anyone manages to make a chem that even goes above 50 intensity # Explain why it's good for the game lets research reach the full potential of custom flamer chems while still putting it behind a reasonable paywall # Testing Photographs and Procedure it works # Changelog :cl: add: Added new upgraded incinerator fuel tanks printable by the biomass analyzer. /:cl: --------- Co-authored-by: Drathek <76988376+Drulikar@users.noreply.github.com> --- code/__DEFINES/misc.dm | 1 + code/datums/research_upgrade_datum.dm | 23 ++++++++++++++++++++ code/modules/projectiles/magazines/flamer.dm | 21 ++++++++++++++++++ 3 files changed, 45 insertions(+) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 3da1aa8d24c0..1c2cc990e830 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -162,6 +162,7 @@ #define MATRIX_NVG 1 #define MATRIX_WIDE 2 +#define RESEARCH_UPGRADE_NULL null #define RESEARCH_UPGRADE_EXCLUDE_BUY -2 #define RESEARCH_UPGRADE_CATEGORY -1 //lord forgive me #define RESEARCH_UPGRADE_TIER_1 1 diff --git a/code/datums/research_upgrade_datum.dm b/code/datums/research_upgrade_datum.dm index 1620543f6604..8b19bafad1cd 100644 --- a/code/datums/research_upgrade_datum.dm +++ b/code/datums/research_upgrade_datum.dm @@ -100,6 +100,7 @@ behavior = RESEARCH_UPGRADE_TIER_1 upgrade_type = ITEM_ACCESSORY_UPGRADE clearance_req = 4 + /datum/research_upgrades/item/nanosplints name = "Reinforced Fiber Splints" desc = "A set of splints made from durable carbon fiber sheets reinforced with flexible titanium lattice, comes in a stack of five." @@ -111,6 +112,28 @@ behavior = RESEARCH_UPGRADE_TIER_5 //adjust this to change amount of nanosplints in a stack, cant be higher than five, go change max_amount in the nanosplint itself, then change it. upgrade_type = ITEM_ACCESSORY_UPGRADE +/datum/research_upgrades/item/flamer_tank + name = "Upgraded Incinerator Tank" + desc = "An upgraded incinerator tank, with larger capacity and able to handle stronger fuels." + value_upgrade = 300 + clearance_req = 1 + change_purchase = 100 + minimum_price = 100 + maximum_price = 1000 + item_reference = /obj/item/ammo_magazine/flamer_tank/custom/upgraded + behavior = RESEARCH_UPGRADE_NULL + upgrade_type = ITEM_ACCESSORY_UPGRADE + +/datum/research_upgrades/item/flamer_tank/smoke + name = "Upgraded Incinerator Smoke Tank" + desc = "An upgraded incinerator smoke tank with a larger capacity." + value_upgrade = 100 //not useful enough to be expensive + clearance_req = 1 + item_reference = /obj/item/ammo_magazine/flamer_tank/smoke/upgraded + change_purchase = 50 + minimum_price = 100 + maximum_price = 500 + /datum/research_upgrades/armor name = "Armor" behavior = RESEARCH_UPGRADE_CATEGORY diff --git a/code/modules/projectiles/magazines/flamer.dm b/code/modules/projectiles/magazines/flamer.dm index feaaf7bc0a79..8a453beb90b4 100644 --- a/code/modules/projectiles/magazines/flamer.dm +++ b/code/modules/projectiles/magazines/flamer.dm @@ -249,3 +249,24 @@ matter = list("metal" = 3750) flamer_chem = null custom = TRUE + +//tanks printable by the research biomass machine +/obj/item/ammo_magazine/flamer_tank/custom/upgraded + name = "Upgraded custom incinerator tank" + desc = "A fuel tank used to store fuel for use in the M240 incinerator unit. This one has been modified with a larger and more sophisticated internal propellant tank, allowing for bigger capacity and stronger fuels." + matter = list("metal" = 50) // no free metal + flamer_chem = null + max_rounds = 200 + max_range = 7 + fuel_pressure = 1 + max_duration = 50 + max_intensity = 60 + custom = TRUE + +/obj/item/ammo_magazine/flamer_tank/smoke/upgraded + name = "Large custom incinerator smoke tank" + desc = "A tank holding powdered smoke that expands when exposed to an open flame and carries any chemicals along with it. This one has been outfitted with an upgraded internal compressor, allowing for bigger capacity." + matter = list("metal" = 50) //no free metal + flamer_chem = null + custom = TRUE + max_rounds = 150 From e5a9fe8579cd53acd523800cee3fe99cbed469cf Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 19 Jun 2024 04:21:20 +0100 Subject: [PATCH 46/82] Automatic changelog for PR #6415 [ci skip] --- html/changelogs/AutoChangeLog-pr-6415.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6415.yml diff --git a/html/changelogs/AutoChangeLog-pr-6415.yml b/html/changelogs/AutoChangeLog-pr-6415.yml new file mode 100644 index 000000000000..b5631686108a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6415.yml @@ -0,0 +1,4 @@ +author: "iloveloopers" +delete-after: True +changes: + - rscadd: "Added new upgraded incinerator fuel tanks printable by the biomass analyzer." \ No newline at end of file From b9a028679947c4a35b3fbcd1e2035c34167fbff8 Mon Sep 17 00:00:00 2001 From: Vero <73014819+vero5123@users.noreply.github.com> Date: Wed, 19 Jun 2024 06:17:36 -0700 Subject: [PATCH 47/82] Adds in-game bug reports without needing a GitHub account (#6392) # About the pull request title # Explain why it's good for the game Essentially, the idea is to allow for the creation of bug reports in-game without needing to own a Github account, this can help to incentivize issue reporting and be beneficial overall. TODO: - [x] Implement the Github API token to allow for anonymous bug reports - [x] Make in-game bug reports admin approval only to prevent abuse and to make sure only quality bug reports are approved. Notable changes from Goonstation's bug report system is that I migrated it to type script and it now requires admin approval. # Changelog Although I made alterations to meet our needs, all credit goes to Pali for their amazing work and to the devs at Goonstation. :cl: add: Adds the ability for users to make bug reports in-game ui: New bug report system ui /:cl: --------- Co-authored-by: DOOM Co-authored-by: harryob <55142896+harryob@users.noreply.github.com> Co-authored-by: Drathek <76988376+Drulikar@users.noreply.github.com> --- code/__DEFINES/admin.dm | 1 + code/__HELPERS/unsorted.dm | 21 +- code/_globalvars/global_lists.dm | 3 + .../configuration/entries/general.dm | 8 + code/datums/bug_report.dm | 202 ++++++++++++++++ code/modules/admin/topic/topic.dm | 15 ++ colonialmarines.dme | 1 + config/example/config.txt | 5 + interface/interface.dm | 9 +- .../tgui/interfaces/BugReportForm.tsx | 217 ++++++++++++++++++ .../tgui/styles/interfaces/BugReportForm.scss | 67 ++++++ tgui/packages/tgui/styles/main.scss | 1 + 12 files changed, 535 insertions(+), 15 deletions(-) create mode 100644 code/datums/bug_report.dm create mode 100644 tgui/packages/tgui/interfaces/BugReportForm.tsx create mode 100644 tgui/packages/tgui/styles/interfaces/BugReportForm.scss diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm index 3137088d1c90..29895088200c 100644 --- a/code/__DEFINES/admin.dm +++ b/code/__DEFINES/admin.dm @@ -48,6 +48,7 @@ GLOBAL_LIST_INIT(note_categories, list("Admin", "Merit", "Whitelist")) #define OBSERVER_JMP(observer, atom) atom ? "(JMP)" : "" #define ARES_MARK(user) "(MARK)" #define ARES_REPLY(user, ref) "(RPLY)" +#define ADMIN_VIEW_BUG_REPORT(datum) "VIEW REPORT" /atom/proc/Admin_Coordinates_Readable(area_name, admin_jump_ref) var/turf/T = get_turf(src) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 068d85a71ba5..5b9154eac655 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1503,15 +1503,18 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) /// Macro for cases where an UNTIL() may go on forever (such as for an http request) #define UNTIL_OR_TIMEOUT(X, __time) \ - do {\ - __time = max(__time, 0);\ - var/__start_time = world.time;\ - while(!(X)) {;\ - stoplag();\ - if(__start_time + __time <= world.time) {;\ - CRASH("UNTIL_OR_TIMEOUT hit timeout limit of [__time]");\ - };\ - };\ + do { \ + if(__time <= 0) {; \ + CRASH("UNTIL_OR_TIMEOUT given invalid time"); \ + } \ + var/__start_time = world.time; \ + do { \ + if(__start_time + __time <= world.time) {; \ + CRASH("UNTIL_OR_TIMEOUT hit timeout limit of [__time]"); \ + } else { \ + stoplag(); \ + } \ + } while(!(X)) \ } while(FALSE) //Repopulates sortedAreas list diff --git a/code/_globalvars/global_lists.dm b/code/_globalvars/global_lists.dm index 2d07228e8e3d..e663bc287946 100644 --- a/code/_globalvars/global_lists.dm +++ b/code/_globalvars/global_lists.dm @@ -9,6 +9,9 @@ GLOBAL_LIST_EMPTY(CLFFaxes) GLOBAL_LIST_EMPTY(GeneralFaxes) //Inter-machine faxes GLOBAL_LIST_EMPTY(fax_contents) //List of fax contents to maintain it even if source paper is deleted +// for all of our various bugs and runtimes +GLOBAL_LIST_EMPTY(bug_reports) + //datum containing a reference to the flattend map png url, the actual png is stored in the user's cache. GLOBAL_LIST_EMPTY(uscm_flat_tacmap_data) GLOBAL_LIST_EMPTY(xeno_flat_tacmap_data) diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index 1cf93e998a4e..627859369231 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -664,3 +664,11 @@ This maintains a list of ip addresses that are able to bypass topic filtering. /datum/config_entry/string/client_error_message default = "Your version of BYOND is too old, may have issues, and is blocked from accessing this server." + +// GitHub API, used for anonymous bug report handling. +/datum/config_entry/string/github_app_api + protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN + +/datum/config_entry/string/repo_name + +/datum/config_entry/string/org diff --git a/code/datums/bug_report.dm b/code/datums/bug_report.dm new file mode 100644 index 000000000000..fd82d4950b91 --- /dev/null +++ b/code/datums/bug_report.dm @@ -0,0 +1,202 @@ +// Datum for handling bug reports +#define STATUS_SUCCESS 201 + +/datum/tgui_bug_report_form + /// contains all the body text for the bug report. + var/list/bug_report_data = null + + /// client of the bug report author, needed to create the ticket + var/client/initial_user = null + // ckey of the author + var/initial_key = null // just incase they leave after creating the bug report + + /// client of the admin who is accessing the report, we don't want multiple admins unknowingly making changes at the same time. + var/client/admin_user = null + + /// value to determine if the bug report is submitted and awaiting admin approval, used for state purposes in tgui. + var/awaiting_admin_approval = FALSE + + // for garbage collection purposes. + var/selected_confirm = FALSE + +/datum/tgui_bug_report_form/New(mob/user) + initial_user = user.client + initial_key = user.client.key + +/datum/tgui_bug_report_form/proc/external_link_prompt(client/user) + tgui_alert(user, "Unable to create a bug report at this time, please create the issue directly through our GitHub repository instead") + var/url = CONFIG_GET(string/githuburl) + if(!url) + to_chat(user, SPAN_WARNING("The configuration is not properly set, unable to open external link")) + return + + if(tgui_alert(user, "This will open the GitHub in your browser. Are you sure?", "Confirm", list("Yes", "No")) == "Yes") + user << link(url) + +/datum/tgui_bug_report_form/ui_state() + return GLOB.always_state + +/datum/tgui_bug_report_form/tgui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "BugReportForm") + ui.open() + +/datum/tgui_bug_report_form/ui_close(mob/user) + . = ..() + if(!admin_user && user.client == initial_user && !selected_confirm) // user closes the ui without selecting confirm or approve. + qdel(src) + return + admin_user = null + selected_confirm = FALSE + +/datum/tgui_bug_report_form/Destroy() + GLOB.bug_reports -= src + return ..() + +/datum/tgui_bug_report_form/proc/sanitize_payload(list/params) + for(var/param in params) + params[param] = sanitize(params[param], list("\t"=" ","�"=" ")) + + return params + +// whether or not an admin can access the record at a given time. +/datum/tgui_bug_report_form/proc/assign_admin(mob/user) + if(!initial_key) + to_chat(user, SPAN_WARNING("Unable to identify the author of the bug report.")) + return FALSE + if(admin_user) + if(user.client == admin_user) + to_chat(user, SPAN_WARNING("This bug report review is already opened and accessed by you.")) + else + to_chat(user, SPAN_WARNING("Another administrator is currently accessing this report, please wait for them to finish before making any changes.")) + return FALSE + if(!CLIENT_IS_STAFF(user.client)) + message_admins("[user.ckey] has attempted to review [initial_key]'s bug report titled [bug_report_data["title"]] without proper authorization at [time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")].") + return FALSE + + admin_user = user.client + return TRUE + +// returns the body payload +/datum/tgui_bug_report_form/proc/create_form() + var/datum/getrev/revdata = GLOB.revdata + var/test_merges + if(length(revdata.testmerge)) + test_merges = revdata.GetTestMergeInfo(header = FALSE) + + var/desc = {" +## Testmerges +[test_merges ? test_merges : "N/A"] + +## Round ID +[GLOB.round_id ? GLOB.round_id : "N/A"] + +## Description of the bug +[bug_report_data["description"]] + +## What's the difference with what should have happened? +[bug_report_data["expected_behavior"]] + +## How do we reproduce this bug? +[bug_report_data["steps"]] + +## Attached logs +``` +[bug_report_data["log"] ? bug_report_data["log"] : "N/A"] +``` + +## Additional details +- Author: [initial_key] +- Admin: [admin_user] +- Note: [bug_report_data["admin_note"] ? bug_report_data["admin_note"] : "None"] + "} + + return desc + +// the real deal, we are sending the request through the api. +/datum/tgui_bug_report_form/proc/send_request(payload_body, client/user) + // for any future changes see https://docs.github.com/en/rest/issues/issues + var/repo_name = CONFIG_GET(string/repo_name) + var/org = CONFIG_GET(string/org) + var/token = CONFIG_GET(string/github_app_api) + + if(!token || !org || !repo_name) + tgui_alert(user, "The configuration is not set for the external API.", "Issue not reported!") + external_link_prompt(user) + qdel(src) + return + + var/url = "https://api.github.com/repos/[org]/[repo_name]/issues" + var/list/headers = list() + headers["Authorization"] = "Bearer [token]" + headers["Content-Type"] = "text/markdown; charset=utf-8" + headers["Accept"] = "application/vnd.github+json" + + var/datum/http_request/request = new() + var/list/payload = list( + "title" = bug_report_data["title"], + "body" = payload_body, + "labels" = list("Bug") + ) + + request.prepare(RUSTG_HTTP_METHOD_POST, url, json_encode(payload), headers) + request.begin_async() + UNTIL_OR_TIMEOUT(request.is_complete(), 5 SECONDS) + + var/datum/http_response/response = request.into_response() + if(response.errored || response.status_code != STATUS_SUCCESS) + message_admins(SPAN_ADMINNOTICE("The GitHub API has failed to create the bug report titled [bug_report_data["title"]] approved by [admin_user], status code:[response.status_code]. Please paste this error code into the development channel on discord.")) + external_link_prompt(user) + else + message_admins("[user.ckey] has approved a bug report from [initial_key] titled [bug_report_data["title"]] at [time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")].") + to_chat(initial_user, SPAN_WARNING("An admin has successfully submitted your report and it should now be visible on GitHub. Thanks again!")) + qdel(src)// approved and submitted, we no longer need the datum. + +// proc that creates a ticket for an admin to approve or deny a bug report request +/datum/tgui_bug_report_form/proc/bug_report_request() + to_chat(initial_user, SPAN_WARNING("Your bug report has been submitted, thank you!")) + GLOB.bug_reports += src + + var/general_message = "[initial_key] has created a bug report, you may find this report directly in the ticket panel. Feel free modify the issue to your liking before submitting it to GitHub." + GLOB.admin_help_ui_handler.perform_adminhelp(initial_user, general_message, urgent = FALSE) + + var/href_message = ADMIN_VIEW_BUG_REPORT(src) + initial_user.current_ticket.AddInteraction(href_message) + +/datum/tgui_bug_report_form/ui_act(action, list/params, datum/tgui/ui) + . = ..() + if (.) + return + var/mob/user = ui.user + switch(action) + if("confirm") + if(selected_confirm) // prevent someone from spamming the approve button + to_chat(user, SPAN_WARNING("you have already confirmed the submission, please wait a moment for the API to process your submission.")) + return + bug_report_data = sanitize_payload(params) + selected_confirm = TRUE + // bug report request is now waiting for admin approval + if(!awaiting_admin_approval) + bug_report_request() + awaiting_admin_approval = TRUE + else // otherwise it's been approved + var/payload_body = create_form() + send_request(payload_body, user.client) + if("cancel") + if(awaiting_admin_approval) // admin has chosen to reject the bug report + reject(user.client) + qdel(src) + ui.close() + . = TRUE + +/datum/tgui_bug_report_form/ui_data(mob/user) + . = list() + .["report_details"] = bug_report_data // only filled out once the user as submitted the form + .["awaiting_admin_approval"] = awaiting_admin_approval + +/datum/tgui_bug_report_form/proc/reject(client/user) + message_admins("[user.ckey] has rejected a bug report from [initial_key] titled [bug_report_data["title"]] at [time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")].") + to_chat(initial_user, SPAN_WARNING("An admin has rejected your bug report, this can happen for several reasons. They will most likely get back to you shortly regarding your issue.")) + +#undef STATUS_SUCCESS diff --git a/code/modules/admin/topic/topic.dm b/code/modules/admin/topic/topic.dm index 000d94e70866..f3af6ed440e9 100644 --- a/code/modules/admin/topic/topic.dm +++ b/code/modules/admin/topic/topic.dm @@ -2248,6 +2248,21 @@ return return remove_tagged_datum(datum_to_remove) + if(href_list["view_bug_report"]) + if(!check_rights(R_ADMIN|R_MOD)) + return + + var/datum/tgui_bug_report_form/bug_report = locate(href_list["view_bug_report"]) + if(!istype(bug_report) || QDELETED(bug_report)) + to_chat(usr, SPAN_WARNING("This bug report is no longer available.")) + return + + if(!bug_report.assign_admin(usr)) + return + + bug_report.tgui_interact(usr) + return + if(href_list["show_tags"]) if(!check_rights(R_ADMIN)) return diff --git a/colonialmarines.dme b/colonialmarines.dme index 9bce54ec30d8..69ed0d259384 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -332,6 +332,7 @@ #include "code\datums\ASRS.dm" #include "code\datums\beam.dm" #include "code\datums\browser.dm" +#include "code\datums\bug_report.dm" #include "code\datums\callback.dm" #include "code\datums\changelog.dm" #include "code\datums\combat_personalized.dm" diff --git a/config/example/config.txt b/config/example/config.txt index 0aff7ee6def9..d63e6822465c 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -253,3 +253,8 @@ GAMEMODE_DEFAULT Extended CLIENT_ERROR_VERSION 514 #CLIENT_ERROR_BUILD 1589 #CLIENT_ERROR_MESSAGE Your version of BYOND is too old, may have issues, and is blocked from accessing this server. + +## GITHUB API +#GITHUB_APP_API +#REPO_NAME cmss13 +#ORG cmss13-devs \ No newline at end of file diff --git a/interface/interface.dm b/interface/interface.dm index c9112160d94f..5b30eaa53bf7 100644 --- a/interface/interface.dm +++ b/interface/interface.dm @@ -62,14 +62,11 @@ set name = "Submit Bug" set desc = "Submit a bug." set hidden = TRUE - - if(tgui_alert(src, "Please search for the bug first to make sure you aren't posting a duplicate.", "No dupe bugs please", list("OK", "Cancel")) != "OK") - return - - if(tgui_alert(src, "This will open the GitHub in your browser. Are you sure?", "Confirm", list("Yes", "No")) != "Yes") + if(!usr) return + var/datum/tgui_bug_report_form/report = new(usr) - src << link(CONFIG_GET(string/githuburl)) + report.tgui_interact(usr) return /client/verb/set_fps() diff --git a/tgui/packages/tgui/interfaces/BugReportForm.tsx b/tgui/packages/tgui/interfaces/BugReportForm.tsx new file mode 100644 index 000000000000..fe0c26035fd6 --- /dev/null +++ b/tgui/packages/tgui/interfaces/BugReportForm.tsx @@ -0,0 +1,217 @@ +import { BooleanLike } from 'common/react'; +import React, { useState } from 'react'; + +import { useBackend } from '../backend'; +import { Flex, Section } from '../components'; +import { ButtonCheckbox } from '../components/Button'; +import { Window } from '../layouts'; +interface FormTypes { + awaiting_admin_approval: BooleanLike; + report_details: FormDetails; +} + +// all the information necessary to pass into the github api +type FormDetails = { + steps: string; + title: string; + description: string; + expected_behavior: string; + admin_note: string; + log: string; +}; + +const InputTitle = (props) => { + return ( +

+ {props.children} + {props.required && {' *'}} +

+ ); +}; + +export const BugReportForm = (props) => { + const { act, data } = useBackend(); + const { awaiting_admin_approval, report_details } = data; + const [checkBox, setCheckbox] = useState(false); + + const [title, setTitle] = useState(report_details?.title || ''); + const [steps, setSteps] = useState(report_details?.steps || ''); + const [description, setDescription] = useState( + report_details?.description || '', + ); + const [expected_behavior, setExpectedBehavior] = useState( + report_details?.expected_behavior || '', + ); + const [admin_note, setAdminNote] = useState(report_details?.admin_note || ''); + const [log, setLog] = useState(report_details?.log || ''); + + const submit = () => { + if (!title || !description || !expected_behavior || !steps || !checkBox) { + alert('Please fill out all required fields!'); + return; + } + const updatedReportDetails = { + title, + steps, + description, + expected_behavior, + admin_note, + log, + }; + act('confirm', updatedReportDetails); + }; + + return ( + + +
+ + + + GitHub Repository + + + +

+ { + 'TIP: please be as descriptive as possible, it really does help tremendously' + } +

+
+ + {'Title'} + setTitle(e.target.value)} + /> + + + {'Description'} + {'Give a description of the bug'} +