From e4c3900e4f087444308138e9d05b4da9c774f6a9 Mon Sep 17 00:00:00 2001 From: riot <103988604+CapCamIII@users.noreply.github.com> Date: Fri, 20 Oct 2023 17:54:13 -0500 Subject: [PATCH 01/63] reduces timer on joining ert after death to 30 seconds (#4652) # About the pull request reduces timer # Explain why it's good for the game Having to wait a full minute to join an ERT is annoying, it was better b4 when timer from ERT was a minute as well, but 30 second ERT means if u die just b4 ERT goes you cant join regardless. if ppl are ghosting bc they want ert then they are stupid. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: balance: Timer on attempting to join ERT after death is now 30 seconds down from 1 minute /:cl: --- code/datums/emergency_calls/emergency_call.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/emergency_calls/emergency_call.dm b/code/datums/emergency_calls/emergency_call.dm index 6533086d98..79ba9fff97 100644 --- a/code/datums/emergency_calls/emergency_call.dm +++ b/code/datums/emergency_calls/emergency_call.dm @@ -168,7 +168,7 @@ return var/deathtime = world.time - usr.timeofdeath - if(deathtime < 1 MINUTES) //Nice try, ghosting right after the announcement + if(deathtime < 30 SECONDS) //Nice try, ghosting right after the announcement if(SSmapping.configs[GROUND_MAP].map_name != MAP_WHISKEY_OUTPOST) // people ghost so often on whiskey outpost. to_chat(src, SPAN_WARNING("You ghosted too recently.")) return From c7283e84a71b7255c6ade28048c809b844a95a13 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 21 Oct 2023 00:08:01 +0100 Subject: [PATCH 02/63] Automatic changelog for PR #4652 [ci skip] --- html/changelogs/AutoChangeLog-pr-4652.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4652.yml diff --git a/html/changelogs/AutoChangeLog-pr-4652.yml b/html/changelogs/AutoChangeLog-pr-4652.yml new file mode 100644 index 0000000000..e356ef9f6e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4652.yml @@ -0,0 +1,4 @@ +author: "CapCamIII" +delete-after: True +changes: + - balance: "Timer on attempting to join ERT after death is now 30 seconds down from 1 minute" \ No newline at end of file From 66285595258c24740b5c683db48cd7fee4411765 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sat, 21 Oct 2023 01:06:34 +0000 Subject: [PATCH 03/63] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-4652.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4657.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4693.yml | 5 ---- html/changelogs/AutoChangeLog-pr-4703.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4713.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4721.yml | 5 ---- html/changelogs/AutoChangeLog-pr-4724.yml | 6 ----- html/changelogs/AutoChangeLog-pr-4725.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4727.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4730.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4731.yml | 4 ---- html/changelogs/archive/2023-10.yml | 29 +++++++++++++++++++++++ 12 files changed, 29 insertions(+), 48 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4652.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4657.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4693.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4703.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4713.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4721.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4724.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4725.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4727.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4730.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4731.yml diff --git a/html/changelogs/AutoChangeLog-pr-4652.yml b/html/changelogs/AutoChangeLog-pr-4652.yml deleted file mode 100644 index e356ef9f6e..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4652.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CapCamIII" -delete-after: True -changes: - - balance: "Timer on attempting to join ERT after death is now 30 seconds down from 1 minute" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4657.yml b/html/changelogs/AutoChangeLog-pr-4657.yml deleted file mode 100644 index 4641f99bb6..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4657.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CapCamIII" -delete-after: True -changes: - - balance: "Crawling now only takes 1 second to move and no longer has an overhead icon when doing it." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4693.yml b/html/changelogs/AutoChangeLog-pr-4693.yml deleted file mode 100644 index e13e912459..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4693.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "fira" -delete-after: True -changes: - - bugfix: "Fixed Rangefinders/Designators preventing you from lazing if you looked up/down them without moving." - - bugfix: "Fixed Rangefinders/Designators forcing you to look up/down again if you had moved while using them." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4703.yml b/html/changelogs/AutoChangeLog-pr-4703.yml deleted file mode 100644 index c140f3ea46..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4703.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CapCamIII" -delete-after: True -changes: - - spellcheck: "UPP Synth Survivor on the Trijent Dam nightmare is now called a Support Synthetic instead of a Combat Synthetic, as its not a combat synthetic" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4713.yml b/html/changelogs/AutoChangeLog-pr-4713.yml deleted file mode 100644 index 71a3a8cfd0..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4713.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Steelpoint" -delete-after: True -changes: - - rscadd: "UPP ERT's have a chance to be neutral to the USCM." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4721.yml b/html/changelogs/AutoChangeLog-pr-4721.yml deleted file mode 100644 index 5c78dc4499..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4721.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "SpartanBobby" -delete-after: True -changes: - - maptweak: "Fixes incorrect DIR on fireshutters in memorial" - - maptweak: "Corrects lack of warning stripe tile under door in north brig maint" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4724.yml b/html/changelogs/AutoChangeLog-pr-4724.yml deleted file mode 100644 index 326c78aea2..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4724.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "foxtrot1322" -delete-after: True -changes: - - rscadd: "Added splints to the survival pouch" - - rscadd: "Increased survival pouch storage space by 1" - - spellcheck: "Updates the survival pouch's description" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4725.yml b/html/changelogs/AutoChangeLog-pr-4725.yml deleted file mode 100644 index 4bd068d532..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4725.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "fira" -delete-after: True -changes: - - bugfix: "Xeno and Megaphone abovehead chat speech should now properly be centered horizontally." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4727.yml b/html/changelogs/AutoChangeLog-pr-4727.yml deleted file mode 100644 index e8bed292d8..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4727.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Birdtalon" -delete-after: True -changes: - - rscadd: "USCM Service Jacket to SEA Vendor" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4730.yml b/html/changelogs/AutoChangeLog-pr-4730.yml deleted file mode 100644 index b275429f33..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4730.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Drathek" -delete-after: True -changes: - - bugfix: "Fixed imaginary friends not initializing correctly and throwing a runtime" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4731.yml b/html/changelogs/AutoChangeLog-pr-4731.yml deleted file mode 100644 index 44d62ec78b..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4731.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Drathek" -delete-after: True -changes: - - ui: "Tweaked the position of some ghost alerts" \ No newline at end of file diff --git a/html/changelogs/archive/2023-10.yml b/html/changelogs/archive/2023-10.yml index dda0958c93..94c9527348 100644 --- a/html/changelogs/archive/2023-10.yml +++ b/html/changelogs/archive/2023-10.yml @@ -286,3 +286,32 @@ VileBeggar: - rscadd: Dartboards are now functional and can be crafted with cardboard. - bugfix: Fixed an issue with some deconstructed signs losing their icon. +2023-10-21: + Birdtalon: + - rscadd: USCM Service Jacket to SEA Vendor + CapCamIII: + - balance: Crawling now only takes 1 second to move and no longer has an overhead + icon when doing it. + - balance: Timer on attempting to join ERT after death is now 30 seconds down from + 1 minute + - spellcheck: UPP Synth Survivor on the Trijent Dam nightmare is now called a Support + Synthetic instead of a Combat Synthetic, as its not a combat synthetic + Drathek: + - bugfix: Fixed imaginary friends not initializing correctly and throwing a runtime + - ui: Tweaked the position of some ghost alerts + SpartanBobby: + - maptweak: Fixes incorrect DIR on fireshutters in memorial + - maptweak: Corrects lack of warning stripe tile under door in north brig maint + Steelpoint: + - rscadd: UPP ERT's have a chance to be neutral to the USCM. + fira: + - bugfix: Xeno and Megaphone abovehead chat speech should now properly be centered + horizontally. + - bugfix: Fixed Rangefinders/Designators preventing you from lazing if you looked + up/down them without moving. + - bugfix: Fixed Rangefinders/Designators forcing you to look up/down again if you + had moved while using them. + foxtrot1322: + - rscadd: Added splints to the survival pouch + - rscadd: Increased survival pouch storage space by 1 + - spellcheck: Updates the survival pouch's description From 174e387bc30dc3211880d43e2a1e354b48173f84 Mon Sep 17 00:00:00 2001 From: forest2001 <41653574+realforest2001@users.noreply.github.com> Date: Sat, 21 Oct 2023 05:18:44 +0100 Subject: [PATCH 04/63] JAS Precautionary Charges (#4733) # About the pull request Adds Discretionary Arrest to JAS Moves above to new category, Precautionary Charges. Also moves Insanity and POW to this category. # Explain why it's good for the game Consistency with ML page. # 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 Discretionary Arrest to JAS. add: Added a new category to JAS, Precautionary Charges. Moves Insanity and POW to this category. /:cl: --- code/controllers/subsystem/init/law.dm | 22 +++++++++++-------- code/game/machinery/computer/sentencing.dm | 1 + code/modules/law/law.dm | 17 +++++++------- code/modules/law/laws/capital_crime.dm | 8 ------- code/modules/law/laws/precautionary_charge.dm | 18 +++++++++++++++ colonialmarines.dme | 1 + 6 files changed, 42 insertions(+), 25 deletions(-) create mode 100644 code/modules/law/laws/precautionary_charge.dm diff --git a/code/controllers/subsystem/init/law.dm b/code/controllers/subsystem/init/law.dm index 52fbbbeadf..c7ade81597 100644 --- a/code/controllers/subsystem/init/law.dm +++ b/code/controllers/subsystem/init/law.dm @@ -8,20 +8,24 @@ SUBSYSTEM_DEF(law_init) var/list/minor_law = list() var/list/major_law = list() var/list/capital_law = list() + var/list/precautionary_law = list() /datum/controller/subsystem/law_init/Initialize() - for(var/L in subtypesof(/datum/law/optional_law)) - optional_law += new L + for(var/law in subtypesof(/datum/law/optional_law)) + optional_law += new law - for(var/L in subtypesof(/datum/law/minor_law)) - minor_law += new L + for(var/law in subtypesof(/datum/law/minor_law)) + minor_law += new law - for(var/L in subtypesof(/datum/law/major_law)) - major_law += new L + for(var/law in subtypesof(/datum/law/major_law)) + major_law += new law - for(var/L in subtypesof(/datum/law/capital_law)) - capital_law += new L + for(var/law in subtypesof(/datum/law/capital_law)) + capital_law += new law - laws = optional_law + minor_law + major_law + capital_law + for(var/law in subtypesof(/datum/law/precautionary_charge)) + precautionary_law += new law + + laws = optional_law + minor_law + major_law + capital_law + precautionary_law return SS_INIT_SUCCESS diff --git a/code/game/machinery/computer/sentencing.dm b/code/game/machinery/computer/sentencing.dm index 52a4159a2a..3aa9b5a032 100644 --- a/code/game/machinery/computer/sentencing.dm +++ b/code/game/machinery/computer/sentencing.dm @@ -78,6 +78,7 @@ data["laws"] += list(create_law_data("Major Laws", SSlaw_init.major_law)) data["laws"] += list(create_law_data("Capital Laws", SSlaw_init.capital_law)) data["laws"] += list(create_law_data("Optional Laws", SSlaw_init.optional_law)) + data["laws"] += list(create_law_data("Precautionary Laws", SSlaw_init.precautionary_law)) return data diff --git a/code/modules/law/law.dm b/code/modules/law/law.dm index 7d59060470..20245beda3 100644 --- a/code/modules/law/law.dm +++ b/code/modules/law/law.dm @@ -13,13 +13,14 @@ var/special_punishment = "" //This is for special punishments //These are bitflags to indicate the type of crime it is. -#define OPTIONAL_CRIME 1 -#define MINOR_CRIME 2 -#define MAJOR_CRIME 4 -#define CAPITAL_CRIME 8 +#define OPTIONAL_CRIME (1<<0) +#define MINOR_CRIME (1<<1) +#define MAJOR_CRIME (1<<2) +#define CAPITAL_CRIME (1<<3) +#define PRECAUTIONARY_CHARGE (1<<4) //These are bitflags for special punishments -#define PERMABRIG 1 -#define DOUBLE_TIME 2 -#define SAME_AS_ACCUSED 4 -#define DEMOTION 8 +#define PERMABRIG (1<<0) +#define DOUBLE_TIME (1<<1) +#define SAME_AS_ACCUSED (1<<2) +#define DEMOTION (1<<3) diff --git a/code/modules/law/laws/capital_crime.dm b/code/modules/law/laws/capital_crime.dm index 8329374e91..687c483c65 100644 --- a/code/modules/law/laws/capital_crime.dm +++ b/code/modules/law/laws/capital_crime.dm @@ -10,10 +10,6 @@ name = "Desertion" desc = "Refusing to carry out the duties essential to one’s post or abandoning post unauthorized, without intent to return. (Retreating from the planet when the FOB is breached is not Desertion, refusing to return when ordered is)." -/datum/law/capital_law/insanity - name = "Insanity" - desc = "Acting in such a manner which makes the offender not sound clear of mind. The CMO or Synthetic can declare insanity on a Marine if the Marine is believed to not be of sound mind. The Marine once cleared to be of sound mind may be released from this particular charge." - /datum/law/capital_law/jailbreak_escape name = "Jailbreak/Escape" desc = "To escape, assist in an escape, attempt escape, or be willfully and knowingly broken out." @@ -30,7 +26,3 @@ /datum/law/capital_law/crimes_against_humanity name = "Crimes against Humanity" desc = "To engage in actions that violate human rights or otherwise are heinous acts against humans. Examples are torture, cannibalism and forced infection with Xenomorph larva." - -/datum/law/capital_law/prisoner_of_war - name = "Prisoner of War" - desc = "Being a member of a currently hostile faction to the USCM." diff --git a/code/modules/law/laws/precautionary_charge.dm b/code/modules/law/laws/precautionary_charge.dm new file mode 100644 index 0000000000..c06cd6ca52 --- /dev/null +++ b/code/modules/law/laws/precautionary_charge.dm @@ -0,0 +1,18 @@ +/datum/law/precautionary_charge + severity = PRECAUTIONARY_CHARGE + brig_time = PERMABRIG_SENTENCE + special_punishment = "Not inclusive for execution criteria." + +/datum/law/precautionary_charge/discretionary_arrest + name = "Discretionary Detainment" + desc = "A discretionary charge used by Commanding Officers to detain personnel for any reason, for the safety and benefit of the operation or security. The duration of this charge is variable and may be pardoned/lifted at any time by the Commanding Officer." + special_punishment = "Not inclusive for execution criteria. May only be appealed to the Acting Commander or Provost/USCM HC." + +/datum/law/precautionary_charge/insanity + name = "Insanity" + desc = "Acting in such a manner which makes the offender not sound clear of mind. The CMO or Synthetic can declare insanity on a Marine if the Marine is believed to not be of sound mind. The Marine once cleared to be of sound mind may be released from this particular charge." + +/datum/law/precautionary_charge/prisoner_of_war + name = "Prisoner of War" + desc = "Being a member of a legitimate and recognised faction currently hostile to the USCM." + special_punishment = "Execution is forbidden barring exceptional circumstances." diff --git a/colonialmarines.dme b/colonialmarines.dme index be463ce8a2..b6967c2df5 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -1748,6 +1748,7 @@ s// DM Environment file for colonialmarines.dme. #include "code\modules\law\laws\major_crime.dm" #include "code\modules\law\laws\minor_crime.dm" #include "code\modules\law\laws\optional.dm" +#include "code\modules\law\laws\precautionary_charge.dm" #include "code\modules\lighting\emissive_blocker.dm" #include "code\modules\lighting\lighting_area.dm" #include "code\modules\lighting\lighting_atom.dm" From 7cda2d4b3696d15c5f19f6ae9f2bccb4b4a270de Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 21 Oct 2023 05:28:26 +0100 Subject: [PATCH 05/63] Automatic changelog for PR #4733 [ci skip] --- html/changelogs/AutoChangeLog-pr-4733.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4733.yml diff --git a/html/changelogs/AutoChangeLog-pr-4733.yml b/html/changelogs/AutoChangeLog-pr-4733.yml new file mode 100644 index 0000000000..43d1d2b92e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4733.yml @@ -0,0 +1,5 @@ +author: "realforest2001" +delete-after: True +changes: + - rscadd: "Added Discretionary Arrest to JAS." + - rscadd: "Added a new category to JAS, Precautionary Charges. Moves Insanity and POW to this category." \ No newline at end of file From de5c69661f8d33425123894028702f64239f861b Mon Sep 17 00:00:00 2001 From: kiVts <48099872+kiVts@users.noreply.github.com> Date: Sat, 21 Oct 2023 02:44:13 -0400 Subject: [PATCH 06/63] DFB property changes. (#4590) # About the pull request part 2 out of 4 This does a **big** touch up on defibrillation property in research Well, to start off, max_level = 1 was removed. It appears warcrimes forgot to remove it since process proc has benefits explicitly for higher levels. I would call it a bug(oversight rather). Second: Ghosts get notified when the chem starts to try and defib you, so you dont just wonder how did you stand up, and pretty neat too. Third: The >6 level of defib to apply healing like with actual item defib is too high, so we move requirement down to >1 but make it heal much, much worse at levels lower than 5. eg it took 20 units to heal ~20 brute at level 3(you will literally perma lmao), at level 5, however, this will go at around 2.5 per life tick, level 8 will give 4 damage heal. This is a balance change(buff) But hardly so since its research, Research is already neglecting most of the time this property. Fourth: removes one letter var, This whole file is entombed with them but Im not doing that for now. # Explain why it's good for the game Defib property is way too underused and crudely made. This fixes it, partially. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: kiVts add: Ghosts get notified when they are being revived by DFB property balance: DFB property healing threshold lowered, You can create DFB property higher than one. /:cl: --------- Co-authored-by: Zonespace <41448081+Zonespace27@users.noreply.github.com> --- .../chemistry_properties/prop_positive.dm | 42 ++++++++++++------ ...rt Beat Short.ogg => heart_beat_short.ogg} | Bin 2 files changed, 28 insertions(+), 14 deletions(-) rename sound/effects/{Heart Beat Short.ogg => heart_beat_short.ogg} (100%) diff --git a/code/modules/reagents/chemistry_properties/prop_positive.dm b/code/modules/reagents/chemistry_properties/prop_positive.dm index 7f476cecf2..971051e9bf 100644 --- a/code/modules/reagents/chemistry_properties/prop_positive.dm +++ b/code/modules/reagents/chemistry_properties/prop_positive.dm @@ -548,7 +548,7 @@ rarity = PROPERTY_RARE category = PROPERTY_TYPE_REACTANT value = 3 - max_level = 1 + COOLDOWN_DECLARE(ghost_notif) /datum/chem_property/positive/defibrillating/on_delete(mob/living/M) ..() @@ -574,19 +574,33 @@ /datum/chem_property/positive/defibrillating/process_dead(mob/living/M, potency = 1, delta_time) if(!ishuman(M)) return - var/mob/living/carbon/human/H = M - H.apply_damage(-H.getOxyLoss(), OXY) - if(H.check_tod() && H.is_revivable() && H.health > HEALTH_THRESHOLD_DEAD) - to_chat(H, SPAN_NOTICE("You feel your heart struggling as you suddenly feel a spark, making it desperately try to continue pumping.")) - playsound_client(H.client, 'sound/effects/Heart Beat Short.ogg', 35) - addtimer(CALLBACK(H, TYPE_PROC_REF(/mob/living/carbon/human, handle_revive)), 50, TIMER_UNIQUE) - else if (potency > POTENCY_MAX_TIER_1 && H.check_tod() && H.is_revivable() && H.health < HEALTH_THRESHOLD_DEAD) //Will heal if level is 7 or greater - to_chat(H, SPAN_NOTICE("You feel a faint spark in your chest.")) - H.apply_damage(-potency * POTENCY_MULTIPLIER_LOW, BRUTE) - H.apply_damage(-potency * POTENCY_MULTIPLIER_LOW, BURN) - H.apply_damage(-potency * POTENCY_MULTIPLIER_LOW, TOX) - H.apply_damage(-potency * POTENCY_MULTIPLIER_LOW, CLONE) - H.apply_damage(-H.getOxyLoss(), OXY) + var/mob/living/carbon/human/dead = M + var/revivable = dead.check_tod() && dead.is_revivable() + if(revivable && (dead.health > HEALTH_THRESHOLD_DEAD)) + addtimer(CALLBACK(dead, TYPE_PROC_REF(/mob/living/carbon/human, handle_revive)), 5 SECONDS) + to_chat(dead, SPAN_NOTICE("You feel your heart struggling as you suddenly feel a spark, making it desperately try to continue pumping.")) + playsound_client(dead.client, 'sound/effects/heart_beat_short.ogg', 35) + else if ((potency >= 1) && revivable && dead.health <= HEALTH_THRESHOLD_DEAD) //heals on all level above 1. This is however, minimal. + to_chat(dead, SPAN_NOTICE("You feel a faint spark in your chest.")) + dead.apply_damage(-potency * POTENCY_MULTIPLIER_VLOW, BRUTE) + dead.apply_damage(-potency * POTENCY_MULTIPLIER_VLOW, BURN) + dead.apply_damage(-potency * POTENCY_MULTIPLIER_VLOW, TOX) + dead.apply_damage(-potency * POTENCY_MULTIPLIER_VLOW, CLONE) + dead.apply_damage(-dead.getOxyLoss(), OXY) + if(potency > CREATE_MAX_TIER_1) //heal more if higher levels + dead.apply_damage(-potency * POTENCY_MULTIPLIER_LOW, BRUTE) + dead.apply_damage(-potency * POTENCY_MULTIPLIER_LOW, BURN) + dead.apply_damage(-potency * POTENCY_MULTIPLIER_LOW, TOX) + dead.apply_damage(-potency * POTENCY_MULTIPLIER_LOW, CLONE) + if(dead.health < HEALTH_THRESHOLD_DEAD) + return + if(!COOLDOWN_FINISHED(src, ghost_notif)) + return + var/mob/dead/observer/ghost = dead.get_ghost() + if(ghost?.client) + COOLDOWN_START(src, ghost_notif, 30 SECONDS) + playsound_client(ghost.client, 'sound/effects/adminhelp_new.ogg') + to_chat(ghost, SPAN_BOLDNOTICE("Your heart is struggling to pump! There is a chance you might get up!(Verbs -> Ghost -> Re-enter corpse, or click here!)")) return TRUE /datum/chem_property/positive/hyperdensificating diff --git a/sound/effects/Heart Beat Short.ogg b/sound/effects/heart_beat_short.ogg similarity index 100% rename from sound/effects/Heart Beat Short.ogg rename to sound/effects/heart_beat_short.ogg From 1dc52fd06efe52e224c8d24158654c415d09f888 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 21 Oct 2023 07:52:50 +0100 Subject: [PATCH 07/63] Automatic changelog for PR #4590 [ci skip] --- html/changelogs/AutoChangeLog-pr-4590.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4590.yml diff --git a/html/changelogs/AutoChangeLog-pr-4590.yml b/html/changelogs/AutoChangeLog-pr-4590.yml new file mode 100644 index 0000000000..df23394b92 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4590.yml @@ -0,0 +1,5 @@ +author: "kiVts" +delete-after: True +changes: + - rscadd: "Ghosts get notified when they are being revived by DFB property" + - balance: "DFB property healing threshold lowered, You can create DFB property higher than one." \ No newline at end of file From 7928c2eb0e6edbfa2cf11f4be3f86ef6d8c00d62 Mon Sep 17 00:00:00 2001 From: fira Date: Sat, 21 Oct 2023 11:16:44 +0200 Subject: [PATCH 08/63] Hotfixes Megaphone X Offset (#4741) # About the pull request Insufficient testing made me once more commit this mistake, because the langchat image is not regenerated the text keeps offsetting every time, drifting away and offscreen. This hotfixes it. closes #4742 # Changelog :cl: fix: Re-fixed Megaphone above-head-chat drifting to the left. /:cl: --- code/datums/langchat/langchat.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/datums/langchat/langchat.dm b/code/datums/langchat/langchat.dm index af51a71960..3f00c26b6d 100644 --- a/code/datums/langchat/langchat.dm +++ b/code/datums/langchat/langchat.dm @@ -102,6 +102,7 @@ langchat_image.maptext = text_to_display langchat_image.maptext_width = LANGCHAT_WIDTH + langchat_image.maptext_x = - world.icon_size - get_pixel_position_x(src, TRUE) langchat_listeners = listeners for(var/mob/M in langchat_listeners) @@ -148,7 +149,7 @@ langchat_image.maptext = text_to_display langchat_image.maptext_width = LANGCHAT_WIDTH * 2 - langchat_image.maptext_x -= LANGCHAT_WIDTH / 2 + langchat_image.maptext_x = - world.icon_size - get_pixel_position_x(src, TRUE) - LANGCHAT_WIDTH / 2 langchat_listeners = listeners for(var/mob/M in langchat_listeners) From 3a0cccec36c55b51c0b6b9969bde7e7292ce4930 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 21 Oct 2023 10:25:29 +0100 Subject: [PATCH 09/63] Automatic changelog for PR #4741 [ci skip] --- html/changelogs/AutoChangeLog-pr-4741.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4741.yml diff --git a/html/changelogs/AutoChangeLog-pr-4741.yml b/html/changelogs/AutoChangeLog-pr-4741.yml new file mode 100644 index 0000000000..ec52d20b80 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4741.yml @@ -0,0 +1,4 @@ +author: "fira" +delete-after: True +changes: + - bugfix: "Re-fixed Megaphone above-head-chat drifting to the left." \ No newline at end of file From 34ee2403613620c666877a01e4055578e16a997b Mon Sep 17 00:00:00 2001 From: fira Date: Sat, 21 Oct 2023 23:49:52 +0200 Subject: [PATCH 10/63] Unbinds ahelp due to it being doubled up (#4749) # About the pull request This removes the default bind for AdminHelp because SSinput already has an hardcoded bind for it, causing it to fire twice. You're still welcome to also bind ahelp to another key. This does not affect existing users because it only changes the default preset. # Explain why it's good for the game It's less of an issue with the new tgui ahelp box but has been a thing forever and still doubles up the chat help message. # Testing Photographs and Procedure Reset keybinds, pressed F1, tried reloading game etc # Changelog :cl: fix: Removed redundant double binding for F1 to AdminHelp from default keybinds. This does not affect existing users or their settings. /:cl: --- code/datums/keybinding/client.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/datums/keybinding/client.dm b/code/datums/keybinding/client.dm index a5baf09a13..7522878822 100644 --- a/code/datums/keybinding/client.dm +++ b/code/datums/keybinding/client.dm @@ -4,8 +4,8 @@ /datum/keybinding/client/admin_help - hotkey_keys = list("F1") - classic_keys = list("F1") + hotkey_keys = list("Unbound") + classic_keys = list("Unbound") name = "admin_help" full_name = "Admin Help" description = "Ask an admin for help." From cfa842ec19654eab70060f0120fe7dc1633e7227 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 21 Oct 2023 22:58:00 +0100 Subject: [PATCH 11/63] Automatic changelog for PR #4749 [ci skip] --- html/changelogs/AutoChangeLog-pr-4749.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4749.yml diff --git a/html/changelogs/AutoChangeLog-pr-4749.yml b/html/changelogs/AutoChangeLog-pr-4749.yml new file mode 100644 index 0000000000..1e75689c0a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4749.yml @@ -0,0 +1,4 @@ +author: "fira" +delete-after: True +changes: + - bugfix: "Removed redundant double binding for F1 to AdminHelp from default keybinds. This does not affect existing users or their settings." \ No newline at end of file From f9c27bb785012eefdac4f3744432fcdf7fc1e01d Mon Sep 17 00:00:00 2001 From: fira Date: Sat, 21 Oct 2023 23:50:54 +0200 Subject: [PATCH 12/63] Add a noise to paper stamping (#4748) # About the pull request Adds a paper stamping noise. Reuses Predalien stomp noise because frankly it's just very fitting. # Explain why it's good for the game Increases Reqs Productivity by 400% thanks to auditive feedback. Stamping the papers has never felt so satisfying. # Testing Photographs and Procedure This PR has been stamped by the System Administrators Cabal. # Changelog :cl: add: Stamping papers now makes a noise. /:cl: --- code/modules/paperwork/paper.dm | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 71d1090b20..bde60ef3a3 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -382,9 +382,6 @@ /obj/item/paper/attackby(obj/item/P, mob/user) ..() - var/clown = 0 - if(user.mind && (user.job == "Clown")) - clown = 1 if(istype(P, /obj/item/paper) || istype(P, /obj/item/photo)) if (istype(P, /obj/item/paper/carbon)) @@ -424,6 +421,7 @@ return stamps += (stamps=="" ? "
" : "
") + "This paper has been stamped with the [P.name]." + playsound(src, 'sound/effects/alien_footstep_medium3.ogg', 20, TRUE, 6) var/image/stampoverlay = image('icons/obj/items/paper.dmi') var/x @@ -439,11 +437,6 @@ stampoverlay.pixel_x = x stampoverlay.pixel_y = y - if(istype(P, /obj/item/tool/stamp/clown)) - if(!clown) - to_chat(user, SPAN_NOTICE("You are totally unable to use the stamp. HONK!")) - return - if(!ico) ico = new ico += "paper_[P.icon_state]" From 30455997a78aeecdd5ecb59cabcd3ec093a7cda5 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 21 Oct 2023 23:13:06 +0100 Subject: [PATCH 13/63] Automatic changelog for PR #4748 [ci skip] --- html/changelogs/AutoChangeLog-pr-4748.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4748.yml diff --git a/html/changelogs/AutoChangeLog-pr-4748.yml b/html/changelogs/AutoChangeLog-pr-4748.yml new file mode 100644 index 0000000000..5b188fdc38 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4748.yml @@ -0,0 +1,4 @@ +author: "fira" +delete-after: True +changes: + - rscadd: "Stamping papers now makes a noise." \ No newline at end of file From 8666c6e22c8e35f52a954febd180121d62b632d4 Mon Sep 17 00:00:00 2001 From: Zonespace <41448081+Zonespace27@users.noreply.github.com> Date: Sat, 21 Oct 2023 14:51:49 -0700 Subject: [PATCH 14/63] Mentors can now unmark mhelps (#4747) # About the pull request Changes the "Mark" button into a "Mark/Unmark" button, allowing mentors to unmark Mhelps. Ideally Mhelps should get a status tab or UI like adminhelps, but this is a good-enough stopgap # Explain why it's good for the game Unmarking mhelps is a fairly important thing because of all the reasons why a question may not be answered by the current mentor (AFK, accidentally clicked, etc.) that can currently only be solved by VV. # Changelog :cl: add: Mentors can now unmark mhelps /:cl: --- code/modules/mentor/mentorhelp.dm | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/code/modules/mentor/mentorhelp.dm b/code/modules/mentor/mentorhelp.dm index 7746e90d96..bd40af9cbf 100644 --- a/code/modules/mentor/mentorhelp.dm +++ b/code/modules/mentor/mentorhelp.dm @@ -169,10 +169,7 @@ if(sender == author) message_title = "MentorHelp" // If there's a mentor, let them mark it. If not, let them unmark it - if(mentor) - message_sender_options = " (Unmark" - else - message_sender_options = " (Mark" + message_sender_options = " (Mark/Unmark" message_sender_options += " | Close | AutoResponse)" var/message_header = SPAN_MENTORHELP("[message_title] from [message_sender_key]: [message_sender_options]
") @@ -274,9 +271,10 @@ if("autorespond") autoresponse(C) if("mark") - mark(C) - if("unmark") - unmark(C) + if(!mentor) + mark(C) + else + unmark(C) if("close") if(C == author || C == mentor || CLIENT_IS_STAFF(C)) close(C) From 7c1c20f37ff872707722da06c4eedf9e6d77b67e Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 21 Oct 2023 23:27:22 +0100 Subject: [PATCH 15/63] Automatic changelog for PR #4747 [ci skip] --- html/changelogs/AutoChangeLog-pr-4747.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4747.yml diff --git a/html/changelogs/AutoChangeLog-pr-4747.yml b/html/changelogs/AutoChangeLog-pr-4747.yml new file mode 100644 index 0000000000..0b876d3bac --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4747.yml @@ -0,0 +1,4 @@ +author: "Zonespace27" +delete-after: True +changes: + - rscadd: "Mentors can now unmark mhelps" \ No newline at end of file From c61e36b81bb056a164c3217a38ea20b4a732cf20 Mon Sep 17 00:00:00 2001 From: fira Date: Sat, 21 Oct 2023 23:52:17 +0200 Subject: [PATCH 16/63] Fixes OB Warheads deletions (#4740) # About the pull request `runtime error: addtimer called with a callback assigned to a qdeleted object. In the future such timers will not be supported and may refuse to run or run with a 0 wait` Makes OB Warheads and especially cluster delete timely (after their explosion) saving us incertainties for most warheads, and a few hundreds of runtimes for cluster. # Explain why it's good for the game Cleaner logs, i can't see what's going on in there geez # Testing Photographs and Procedure Fired a cluster checking runtimes. That's it. # Changelog No player facing changes --- code/modules/admin/tabs/event_tab.dm | 7 +------ code/modules/cm_marines/orbital_cannon.dm | 23 ++++++++++++++++------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/code/modules/admin/tabs/event_tab.dm b/code/modules/admin/tabs/event_tab.dm index 2bd20b14ab..b3e40af66e 100644 --- a/code/modules/admin/tabs/event_tab.dm +++ b/code/modules/admin/tabs/event_tab.dm @@ -931,13 +931,8 @@ message_admins("[key_name(usr)] has fired \an [warhead.name] at ([target.x],[target.y],[target.z]).") warhead.warhead_impact(target) - if(istype(warhead, /obj/structure/ob_ammo/warhead/cluster)) - // so the user's screen can shake for the duration of the cluster, otherwise we get a runtime. - QDEL_IN(warhead, OB_CLUSTER_DURATION) - else - QDEL_IN(warhead, OB_CRASHING_DOWN) else - warhead.loc = target + warhead.forceMove(target) /client/proc/change_taskbar_icon() set name = "Set Taskbar Icon" diff --git a/code/modules/cm_marines/orbital_cannon.dm b/code/modules/cm_marines/orbital_cannon.dm index 8d80f80860..5a3cad590c 100644 --- a/code/modules/cm_marines/orbital_cannon.dm +++ b/code/modules/cm_marines/orbital_cannon.dm @@ -217,15 +217,16 @@ var/list/ob_type_fuel_requirements if(user) tray.warhead.source_mob = user - tray.warhead.warhead_impact(target) + var/obj/structure/ob_ammo/warhead/warhead = tray.warhead + tray.warhead = null + warhead.moveToNullspace() + warhead.warhead_impact(target) sleep(OB_CRASHING_DOWN) ob_cannon_busy = FALSE - chambered_tray = FALSE tray.fuel_amt = 0 - QDEL_NULL(tray.warhead) tray.update_icon() update_icon() @@ -357,6 +358,9 @@ var/list/ob_type_fuel_requirements var/max_shake_factor var/max_knockdown_time + // Note that the warhead should be cleared of location by the firing proc, + // then auto-delete at the end of the warhead_impact implementation + /obj/structure/ob_ammo/warhead/proc/warhead_impact(turf/target) // make damn sure everyone hears it playsound(target, 'sound/weapons/gun_orbital_travel.ogg', 100, 1, 75) @@ -366,7 +370,7 @@ var/list/ob_type_fuel_requirements message_admins(FONT_SIZE_XL("CLICK TO CANCEL THIS OB")) var/relative_dir - for(var/mob/M in range(30, target)) + for(var/mob/M in urange(30, target)) if(get_turf(M) == target) relative_dir = 0 else @@ -377,7 +381,7 @@ var/list/ob_type_fuel_requirements ) sleep(OB_TRAVEL_TIMING/3) - for(var/mob/M in range(25, target)) + for(var/mob/M in urange(25, target)) if(get_turf(M) == target) relative_dir = 0 else @@ -388,7 +392,7 @@ var/list/ob_type_fuel_requirements ) sleep(OB_TRAVEL_TIMING/3) - for(var/mob/M in range(15, target)) + for(var/mob/M in urange(15, target)) M.show_message( \ SPAN_HIGHDANGER("OH GOD THE SKY WILL EXPLODE!!!"), SHOW_MESSAGE_VISIBLE, \ SPAN_HIGHDANGER("YOU SHOULDN'T BE HERE!"), SHOW_MESSAGE_AUDIBLE \ @@ -455,6 +459,7 @@ var/list/ob_type_fuel_requirements handle_ob_shake(target) sleep(double_explosion_delay) cell_explosion(target, standard_power, standard_falloff, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, cause_data) + qdel(src) return // Checks turf around the target @@ -464,8 +469,11 @@ var/list/ob_type_fuel_requirements handle_ob_shake(target) sleep(double_explosion_delay) cell_explosion(target, standard_power, standard_falloff, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, cause_data) + qdel(src) return + qdel(src) + /obj/structure/ob_ammo/warhead/incendiary name = "\improper Incendiary orbital warhead" warhead_kind = "incendiary" @@ -497,6 +505,7 @@ var/list/ob_type_fuel_requirements sleep(clear_delay) fire_spread(target, cause_data, distance, fire_level, burn_level, fire_color, fire_type, TURF_PROTECTION_OB) + qdel(src) /obj/structure/ob_ammo/warhead/cluster name = "\improper Cluster orbital warhead" @@ -533,8 +542,8 @@ var/list/ob_type_fuel_requirements if(protected_by_pylon(TURF_PROTECTION_OB, U)) //If the turf somehow gained OB protection while the cluster was firing continue fire_in_a_hole(U) - sleep(delay_between_clusters) + QDEL_IN(src, 5 SECONDS) // Leave time for last handle_ob_shake below /obj/structure/ob_ammo/warhead/cluster/proc/fire_in_a_hole(turf/loc) new /obj/effect/overlay/temp/blinking_laser (loc) From 13f73056cb6c8b32b4e8cb4f1e44e9a6286dd19a Mon Sep 17 00:00:00 2001 From: AndroBetel <44546836+AndroBetel@users.noreply.github.com> Date: Sun, 22 Oct 2023 00:53:32 +0300 Subject: [PATCH 17/63] small 'typo' fix (#4744) # About the pull request fixes smartgunner far sight's log mentioning action name instead of head mounted sight's name # Explain why it's good for the game it was probably a mistype # Testing Photographs and Procedure
Screenshots & Videos before You enable Toggle Far Sight's far sight system. and after You enable M56 head mounted sight's far sight system.
# Changelog spellcheck: Tweaked message when using the M56 far sight system --- code/modules/clothing/glasses/night.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/clothing/glasses/night.dm b/code/modules/clothing/glasses/night.dm index afb711c3ca..2a3780832e 100644 --- a/code/modules/clothing/glasses/night.dm +++ b/code/modules/clothing/glasses/night.dm @@ -187,7 +187,7 @@ if(target) var/obj/item/clothing/glasses/night/m56_goggles/G = target G.set_far_sight(owner, !G.far_sight) - to_chat(owner, SPAN_NOTICE("You [G.far_sight ? "enable" : "disable"] \the [src]'s far sight system.")) + to_chat(owner, SPAN_NOTICE("You [G.far_sight ? "enable" : "disable"] \the [G]'s far sight system.")) /datum/action/item_action/m56_goggles/far_sight/update_button_icon() if(!target) From 33456c17735d8faeedde72340cf6780b2625360f Mon Sep 17 00:00:00 2001 From: fira Date: Sat, 21 Oct 2023 23:54:42 +0200 Subject: [PATCH 18/63] fix reqs vendors sprites (#4745) # About the pull request Snowflake Reqs sprites for vendors are instanciated in map rather than using the dedicated subtypes. This causes the sprite to revert to normal vendor rack when you use it. Bleh. Witness: ![image](https://github.com/cmss13-devs/cmss13/assets/604624/c80d6182-2bc5-4776-88f3-be6caf5bf70e) ![image](https://github.com/cmss13-devs/cmss13/assets/604624/8e8da429-8514-4169-bf28-ccd8437652d5) The attachie vendor just wasn't messed up. I'm pretty sure this already got fixed before and was just reverted by sloppy map merging. # Explain why it's good for the game CM Dev gave me these cool sprites, I'm going to use all the cool sprites!!! # Testing Photographs and Procedure See above. # Changelog :cl: fix: Fixed incorrect Reqs vendors visuals on the Almayer. They now blend in with the walls again. /:cl: --- code/game/machinery/vending/vendor_types/requisitions.dm | 4 ++-- code/game/turfs/walls/wall_types.dm | 4 ++-- maps/map_files/USS_Almayer/USS_Almayer.dmm | 8 ++------ 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/code/game/machinery/vending/vendor_types/requisitions.dm b/code/game/machinery/vending/vendor_types/requisitions.dm index 07284e7f8e..8558019839 100644 --- a/code/game/machinery/vending/vendor_types/requisitions.dm +++ b/code/game/machinery/vending/vendor_types/requisitions.dm @@ -192,7 +192,7 @@ turf_to_vent_to = H.loc return turf_to_vent_to -/obj/structure/machinery/cm_vending/sorted/cargo_guns/blend +/obj/structure/machinery/cm_vending/sorted/cargo_guns/cargo/blend icon_state = "req_guns_wall" tiles_with = list( /obj/structure/window/framed/almayer, @@ -296,7 +296,7 @@ updateUsrDialog() return //We found our item, no reason to go on. -/obj/structure/machinery/cm_vending/sorted/cargo_ammo/blend +/obj/structure/machinery/cm_vending/sorted/cargo_ammo/cargo/blend icon_state = "req_ammo_wall" tiles_with = list( /obj/structure/window/framed/almayer, diff --git a/code/game/turfs/walls/wall_types.dm b/code/game/turfs/walls/wall_types.dm index 22979858ce..1b4091eb2a 100644 --- a/code/game/turfs/walls/wall_types.dm +++ b/code/game/turfs/walls/wall_types.dm @@ -24,8 +24,8 @@ /obj/structure/girder, /obj/structure/machinery/door, /obj/structure/machinery/cm_vending/sorted/attachments/blend, - /obj/structure/machinery/cm_vending/sorted/cargo_ammo/blend, - /obj/structure/machinery/cm_vending/sorted/cargo_guns/blend, + /obj/structure/machinery/cm_vending/sorted/cargo_ammo/cargo/blend, + /obj/structure/machinery/cm_vending/sorted/cargo_guns/cargo/blend, ) /turf/closed/wall/almayer/update_icon() diff --git a/maps/map_files/USS_Almayer/USS_Almayer.dmm b/maps/map_files/USS_Almayer/USS_Almayer.dmm index 3740158c7e..b2b300133d 100644 --- a/maps/map_files/USS_Almayer/USS_Almayer.dmm +++ b/maps/map_files/USS_Almayer/USS_Almayer.dmm @@ -22749,9 +22749,7 @@ /turf/closed/wall/almayer, /area/almayer/squads/req) "bQS" = ( -/obj/structure/machinery/cm_vending/sorted/cargo_ammo/cargo{ - icon_state = "req_ammo_wall" - }, +/obj/structure/machinery/cm_vending/sorted/cargo_ammo/cargo/blend, /turf/open/floor/almayer{ icon_state = "green" }, @@ -24366,9 +24364,7 @@ /turf/open/floor/almayer, /area/almayer/hallways/vehiclehangar) "bYa" = ( -/obj/structure/machinery/cm_vending/sorted/cargo_guns/cargo{ - icon_state = "req_guns_wall" - }, +/obj/structure/machinery/cm_vending/sorted/cargo_guns/cargo/blend, /turf/open/floor/almayer{ dir = 10; icon_state = "green" From bed5fd967489dc56d0697a7356f0655eeefd5edd Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 22 Oct 2023 00:01:24 +0100 Subject: [PATCH 19/63] Automatic changelog for PR #4745 [ci skip] --- html/changelogs/AutoChangeLog-pr-4745.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4745.yml diff --git a/html/changelogs/AutoChangeLog-pr-4745.yml b/html/changelogs/AutoChangeLog-pr-4745.yml new file mode 100644 index 0000000000..b4e23e494b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4745.yml @@ -0,0 +1,4 @@ +author: "fira" +delete-after: True +changes: + - bugfix: "Fixed incorrect Reqs vendors visuals on the Almayer. They now blend in with the walls again." \ No newline at end of file From 7683b08631b86b2a608b455e756c9cef11e459d5 Mon Sep 17 00:00:00 2001 From: harryob Date: Sat, 21 Oct 2023 23:06:06 +0100 Subject: [PATCH 20/63] prevents a href token error when changing gamemode (#4739) they were trying to recall topic but without providing a href token. i could provide a href token so this panel updated correctly, but i also don't think it matters that much (given it never worked, anyway) :cl: admin: no more href token errors when changing the game mode via game panel /:cl: --- code/modules/admin/topic/topic.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/admin/topic/topic.dm b/code/modules/admin/topic/topic.dm index 8bbc999252..8308d9c564 100644 --- a/code/modules/admin/topic/topic.dm +++ b/code/modules/admin/topic/topic.dm @@ -697,7 +697,6 @@ to_world(SPAN_NOTICE("The mode is now: [GLOB.master_mode]!")) Game() // updates the main game menu SSticker.save_mode(GLOB.master_mode) - .(href, list("c_mode"=1)) else if(href_list["f_secret2"]) From 9eead96223ee77d86686c61631b19f3f628b2811 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 22 Oct 2023 00:23:55 +0100 Subject: [PATCH 21/63] Automatic changelog for PR #4739 [ci skip] --- html/changelogs/AutoChangeLog-pr-4739.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4739.yml diff --git a/html/changelogs/AutoChangeLog-pr-4739.yml b/html/changelogs/AutoChangeLog-pr-4739.yml new file mode 100644 index 0000000000..5d99c028a1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4739.yml @@ -0,0 +1,4 @@ +author: "harryob" +delete-after: True +changes: + - admin: "no more href token errors when changing the game mode via game panel" \ No newline at end of file From c32d56d928c0424f9a55823f116298c0dd1b39bb Mon Sep 17 00:00:00 2001 From: harryob Date: Sat, 21 Oct 2023 23:06:21 +0100 Subject: [PATCH 22/63] adds a round id box to the issue template (#4737) so we can look at logs a little easier no playerfacing changes --- .github/ISSUE_TEMPLATE/bug_report.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 49eda07616..5eb8f0219e 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -10,6 +10,12 @@ body: placeholder: "#1, #2, #3, etc" validations: required: true + - type: input + id: round-id + attributes: + label: Round ID + description: If known, what was the Round ID this bug was found on? Can be left blank if unknown or occured across multiple rounds. + placeholder: "12345" - type: textarea id: what-happened attributes: From 497f0d5a39edebff4bb0a8c03f41f9fe1970a5bc Mon Sep 17 00:00:00 2001 From: harryob Date: Sat, 21 Oct 2023 23:07:00 +0100 Subject: [PATCH 23/63] removes hard coded discord links (#4736) i hate hardcoded urls :cl: fix: mentorhelp response no longer gives a dead discord link /:cl: --- code/modules/mentor/mentorhelp.dm | 2 +- interface/interface.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mentor/mentorhelp.dm b/code/modules/mentor/mentorhelp.dm index bd40af9cbf..695ec60463 100644 --- a/code/modules/mentor/mentorhelp.dm +++ b/code/modules/mentor/mentorhelp.dm @@ -325,7 +325,7 @@ var/msg = SPAN_MENTORSAY("Autoresponse: [choice]") switch(choice) if("L: Discord") - msg += "You can join our Discord server by using this link!" + msg += "You can join our Discord server by using this link!" if("L: Xeno Quickstart Guide") msg += "Your answer can be found on the Xeno Quickstart Guide on our wiki. Check it out here." if("L: Marine Quickstart Guide") diff --git a/interface/interface.dm b/interface/interface.dm index a37ab648b7..c9112160d9 100644 --- a/interface/interface.dm +++ b/interface/interface.dm @@ -55,7 +55,7 @@ if(tgui_alert(src, "This will open the discord in your browser. Are you sure?", "Confirm", list("Yes", "No")) != "Yes") return - src << link("https://discord.gg/cmss13") + src << link("[CONFIG_GET(string/discordurl)]") return /client/verb/submitbug() From d6bdc1200065c019dfbe244bb51d93ebd029374a Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 22 Oct 2023 00:50:22 +0100 Subject: [PATCH 24/63] Automatic changelog for PR #4736 [ci skip] --- html/changelogs/AutoChangeLog-pr-4736.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4736.yml diff --git a/html/changelogs/AutoChangeLog-pr-4736.yml b/html/changelogs/AutoChangeLog-pr-4736.yml new file mode 100644 index 0000000000..3efd380ae2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4736.yml @@ -0,0 +1,4 @@ +author: "harryob" +delete-after: True +changes: + - bugfix: "mentorhelp response no longer gives a dead discord link" \ No newline at end of file From 972d3f3c6b41a6b93b41c1dc5aa46df8b25fcb8d Mon Sep 17 00:00:00 2001 From: harryob Date: Sat, 21 Oct 2023 23:08:20 +0100 Subject: [PATCH 25/63] backports mariadb compatibility (#4735) thanks morrow https://github.com/PvE-CMSS13/PvE-CMSS13/pull/9 :cl: Morrow server: the rustg mysql driver is now properly compatible with mariadb /:cl: Co-authored-by: morrowwolf --- code/datums/_ndatabase/code/brsql_adapter.dm | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/code/datums/_ndatabase/code/brsql_adapter.dm b/code/datums/_ndatabase/code/brsql_adapter.dm index 345ddfe005..a424b3fd6f 100644 --- a/code/datums/_ndatabase/code/brsql_adapter.dm +++ b/code/datums/_ndatabase/code/brsql_adapter.dm @@ -530,7 +530,7 @@ if(first && !is_id) if(!items_first) update_items+="," - update_items+="`[table_name]`.[esfield]=`__prep_update`.[esfield]" + update_items+="`[table_name]`.[esfield]=`subquery`.[esfield]" items_first = FALSE local_first = FALSE calltext += "SELECT [local_text]" @@ -539,9 +539,7 @@ issue_log += "No ID passed to update query." return "" // AAAAAAAAAAAAAH FUCK DON'T JUST KILL THE ENTIRE FUCKING TABLE BRUH return {" - WITH __prep_update as ( - [calltext] - ) UPDATE `[connection.database]`.`[table_name]` INNER JOIN `__prep_update` ON `[table_name]`.id = `__prep_update`.id SET [update_items] + UPDATE `[connection.database]`.`[table_name]` JOIN (WITH `__prep_update` AS ( [calltext] ) SELECT * FROM `__prep_update`) subquery ON `[table_name]`.id = subquery.id SET [update_items] "} /datum/db/adapter/brsql_adapter/proc/getquery_delete_table(table_name, list/ids) From ef3c179ade04bc59281750914a9f142605aaae18 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 22 Oct 2023 01:06:28 +0100 Subject: [PATCH 26/63] Automatic changelog for PR #4735 [ci skip] --- html/changelogs/AutoChangeLog-pr-4735.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4735.yml diff --git a/html/changelogs/AutoChangeLog-pr-4735.yml b/html/changelogs/AutoChangeLog-pr-4735.yml new file mode 100644 index 0000000000..a92d5015c3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4735.yml @@ -0,0 +1,4 @@ +author: "Morrow" +delete-after: True +changes: + - server: "the rustg mysql driver is now properly compatible with mariadb" \ No newline at end of file From 5d2771b4e2b62279faa9a846a4bc0477fbff0044 Mon Sep 17 00:00:00 2001 From: Drathek <76988376+Drulikar@users.noreply.github.com> Date: Sat, 21 Oct 2023 15:08:36 -0700 Subject: [PATCH 27/63] Disables code in icon2html that causes bad icon operations (#4732) # About the pull request This PR disables MrStonedOne's workaround in icon2html specifically for humans. Rather than throwing a bad icon operation, the resulting icon will just be blank. # Explain why it's good for the game Situations that cause tens of thousands of runtimes in a round need to be eliminated. # Testing Photographs and Procedure
Screenshots & Videos 1. Inject Carbon and Nitrogen into self 2. Inject Oxygen into self 3. Observe a reaction for a blank icon (you) rather than throwing errors. ![image](https://github.com/cmss13-devs/cmss13/assets/76988376/efbd7eea-69c5-4968-8c24-8f79c66970df)
# Changelog :cl: Drathek fix: Disabled code in icon2html that is causing bad icon operations /:cl: --- code/__HELPERS/icons.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index edc711d25b..1116f1acb2 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -732,11 +732,12 @@ world if (isnull(dir)) dir = thing.dir - if (ishuman(thing)) // Shitty workaround for a BYOND issue. + // Commented out because this is seemingly our source of bad icon operations + /* if (ishuman(thing)) // Shitty workaround for a BYOND issue. var/icon/temp = icon2collapse icon2collapse = icon() icon2collapse.Insert(temp, dir = SOUTH) - dir = SOUTH + dir = SOUTH*/ else if (isnull(dir)) dir = SOUTH From ca47702875ebadecfe0e2a104e26bfbb42515702 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 22 Oct 2023 01:25:50 +0100 Subject: [PATCH 28/63] Automatic changelog for PR #4732 [ci skip] --- html/changelogs/AutoChangeLog-pr-4732.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4732.yml diff --git a/html/changelogs/AutoChangeLog-pr-4732.yml b/html/changelogs/AutoChangeLog-pr-4732.yml new file mode 100644 index 0000000000..afe968b3a5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4732.yml @@ -0,0 +1,4 @@ +author: "Drathek" +delete-after: True +changes: + - bugfix: "Disabled code in icon2html that is causing bad icon operations" \ No newline at end of file From 23e0d1d0cbbf60b08b3d124104ccf2e7d1fdd05c Mon Sep 17 00:00:00 2001 From: harryob Date: Sat, 21 Oct 2023 23:11:47 +0100 Subject: [PATCH 29/63] od linter (#4645) uses opendream's compiler for a bit of extended linting, i guess we'll see how many extra errors this'll pick up heavy lifting down by aa07 on https://github.com/ParadiseSS13/Paradise/pull/21099 so far as wrestling OD into CI and the #include tricks --------- Co-authored-by: Zonespace <41448081+Zonespace27@users.noreply.github.com> --- .github/workflows/ci_suite.yml | 28 +++++++ .gitignore | 3 + code/__DEFINES/bullet_traits.dm | 2 +- code/__HELPERS/type2type.dm | 5 +- code/__odlint.dm | 11 +++ code/__pragmas.dm | 27 +++++++ code/_byond_version_compat.dm | 2 +- code/_compile_options.dm | 2 +- code/controllers/subsystem/atoms.dm | 2 +- code/controllers/subsystem/vote.dm | 2 +- code/datums/_ndatabase/code/brsql_adapter.dm | 4 +- code/datums/_ndatabase/code/native_adapter.dm | 3 +- code/game/machinery/OpTable.dm | 2 - code/game/machinery/air_alarm.dm | 2 - code/game/machinery/bots/mulebot.dm | 2 +- code/game/machinery/computer/computer.dm | 2 - code/game/machinery/computer/medical.dm | 7 -- code/game/machinery/computer/pod.dm | 1 - code/game/machinery/computer/robot.dm | 3 +- code/game/machinery/computer/skills.dm | 45 +++++------ code/game/machinery/deployable.dm | 1 - .../game/machinery/medical_pod/bodyscanner.dm | 4 - code/game/machinery/medical_pod/sleeper.dm | 1 - code/game/machinery/vending/vending.dm | 35 ++++---- code/game/objects/effects/glowshroom.dm | 2 - code/game/objects/explosion_recursive.dm | 2 +- code/game/objects/items.dm | 1 - .../items/reagent_containers/food/snacks.dm | 3 +- code/game/objects/items/stacks/nanopaste.dm | 2 +- .../objects/items/storage/large_holster.dm | 2 +- .../objects/structures/barricade/barricade.dm | 2 +- .../objects/structures/barricade/handrail.dm | 2 +- code/game/objects/structures/bookcase.dm | 2 - .../crates_lockers/closets/utility_closets.dm | 2 - .../structures/crates_lockers/crates.dm | 2 - code/game/objects/structures/lattice.dm | 2 - .../objects/structures/reagent_dispensers.dm | 2 - code/modules/admin/topic/topic.dm | 80 ------------------- code/modules/asset_cache/asset_list_items.dm | 2 +- code/modules/client/preferences.dm | 7 +- code/modules/clothing/suits/armor.dm | 2 +- .../modules/desert_dam/filtration/consoles.dm | 2 - code/modules/flufftext/Chinese.dm | 4 +- code/modules/mob/living/carbon/human/say.dm | 1 - .../modules/projectiles/guns/flamer/flamer.dm | 2 - .../reagents/chemistry_reagents/drink.dm | 8 +- colonialmarines.dme | 3 +- dependencies.sh | 2 + tools/ci/download_od.sh | 11 +++ tools/ci/run_od.sh | 4 + tools/ci/setup_od.sh | 7 ++ tools/ci/validate_dme.py | 3 + 52 files changed, 161 insertions(+), 199 deletions(-) create mode 100644 code/__odlint.dm create mode 100644 code/__pragmas.dm create mode 100644 tools/ci/download_od.sh create mode 100644 tools/ci/run_od.sh create mode 100644 tools/ci/setup_od.sh diff --git a/.github/workflows/ci_suite.yml b/.github/workflows/ci_suite.yml index 683f3909b4..0488055312 100644 --- a/.github/workflows/ci_suite.yml +++ b/.github/workflows/ci_suite.yml @@ -60,6 +60,34 @@ jobs: with: outputFile: output-annotations.txt + + odlint: + name: Lint with OpenDream + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v3 + - name: Get OpenDream Version + run: | + source dependencies.sh + echo "OPENDREAM_VERSION=$OPENDREAM_VERSION" >> $GITHUB_ENV + - name: Restore OpenDream cache + uses: actions/cache@v3 + id: cache-od + with: + path: ~/OpenDream + key: ${{ runner.os }}-opendream-${{ env.OPENDREAM_VERSION }} + - name: Download OpenDream + if: steps.cache-od.outputs.cache-hit != 'true' + run: | + bash tools/ci/download_od.sh + - name: Setup OpenDream + if: steps.cache-od.outputs.cache-hit != 'true' + run: | + bash tools/ci/setup_od.sh + - name: Run OpenDream + run: | + bash tools/ci/run_od.sh + compile_all_maps: if: "!contains(github.event.head_commit.message, '[ci skip]')" name: Compile Maps diff --git a/.gitignore b/.gitignore index 210efc84d7..4d2b7e810d 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,6 @@ test_environment.txt # byond-tracy backend, not shipped with the codebase so it shouldn't be maintained prof.dll libprof.so + +# OpenDream compatibility stuff +colonialmarines.json diff --git a/code/__DEFINES/bullet_traits.dm b/code/__DEFINES/bullet_traits.dm index 0ca3bce2e6..40e250cd0d 100644 --- a/code/__DEFINES/bullet_traits.dm +++ b/code/__DEFINES/bullet_traits.dm @@ -3,7 +3,7 @@ // list of args if there are any args /// An entry to a list for giving projectiles bullet traits /// Must be placed inside of a list -#define BULLET_TRAIT_ENTRY(trait, args...) trait = #args ? list(##args) : null +#define BULLET_TRAIT_ENTRY(trait, args...) trait = list(##args) /// An entry to a list for giving projectiles bullet traits with a unique ID /// Must be placed inside of a list #define BULLET_TRAIT_ENTRY_ID(id, trait, args...) id = list(trait, ##args) diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index 4e4a1b3ff3..5d0d113b0c 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -21,7 +21,7 @@ var/char = copytext(hex, i, i + 1) switch(char) if("0") - //Apparently, switch works with empty statements, yay! If that doesn't work, blame me, though. -- Urist + pass() if("9", "8", "7", "6", "5", "4", "3", "2", "1") num += text2num(char) * 16 ** power if("a", "A") @@ -77,7 +77,6 @@ hex += "E" if(15.0) hex += "F" - else power-- while(length(hex) < placeholder) hex = text("0[]", hex) @@ -165,8 +164,6 @@ return 6 if("SOUTHWEST") return 10 - else - return //Converts an angle (degrees) into an ss13 direction /proc/angle2dir(degree) diff --git a/code/__odlint.dm b/code/__odlint.dm new file mode 100644 index 0000000000..f425171337 --- /dev/null +++ b/code/__odlint.dm @@ -0,0 +1,11 @@ +// This file is included right at the start of the DME. +// Its purpose is to enable multiple lints (pragmas) that are supported by OpenDream to better validate the codebase +// These are essentially nitpicks the DM compiler should pick up on but doesnt + +#ifndef SPACEMAN_DMM +#ifdef OPENDREAM +// These are in their own file as you need to do it with an include as a hack to avoid +// SpacemanDMM evaluating the #pragma lines, even if its outside a block it cares about +#include "__pragmas.dm" +#endif +#endif diff --git a/code/__pragmas.dm b/code/__pragmas.dm new file mode 100644 index 0000000000..39c14e1bbc --- /dev/null +++ b/code/__pragmas.dm @@ -0,0 +1,27 @@ +//1000-1999 +#pragma FileAlreadyIncluded error +#pragma MissingIncludedFile error +#pragma MisplacedDirective error +#pragma UndefineMissingDirective error +#pragma DefinedMissingParen error +#pragma ErrorDirective error +#pragma WarningDirective error +#pragma MiscapitalizedDirective error + +//2000-2999 +#pragma SoftReservedKeyword error +#pragma DuplicateVariable error +#pragma DuplicateProcDefinition error +#pragma TooManyArguments error +#pragma PointlessParentCall error +#pragma PointlessBuiltinCall error +#pragma SuspiciousMatrixCall error +#pragma MalformedRange error +#pragma InvalidRange error +#pragma InvalidSetStatement error +#pragma InvalidOverride error +#pragma DanglingVarType error +#pragma MissingInterpolatedExpression error + +//3000-3999 +#pragma EmptyBlock error diff --git a/code/_byond_version_compat.dm b/code/_byond_version_compat.dm index 719d85654b..26968f0f83 100644 --- a/code/_byond_version_compat.dm +++ b/code/_byond_version_compat.dm @@ -3,7 +3,7 @@ //Update this whenever you need to take advantage of more recent byond features #define MIN_COMPILER_VERSION 514 #define MIN_COMPILER_BUILD 1588 -#if (DM_VERSION < MIN_COMPILER_VERSION || DM_BUILD < MIN_COMPILER_BUILD) && !defined(SPACEMAN_DMM) +#if (DM_VERSION < MIN_COMPILER_VERSION || DM_BUILD < MIN_COMPILER_BUILD) && !defined(SPACEMAN_DMM) && !defined(OPENDREAM) //Don't forget to update this part #error Your version of BYOND is too out-of-date to compile this project. Go to https://secure.byond.com/download and update. #error You need version 514.1588 or higher diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 0f81b0173a..20aa208131 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -30,7 +30,7 @@ #define CBT #endif -#if !defined(CBT) && !defined(SPACEMAN_DMM) +#if !defined(CBT) && !defined(SPACEMAN_DMM) && !defined(OPENDREAM) #warn Building with Dream Maker is no longer supported and will result in errors. #warn In order to build, run BUILD.bat in the bin directory. #warn Consider switching to VSCode editor instead, where you can press Ctrl+Shift+B to build. diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm index 23da8cc8c9..3d544dca13 100644 --- a/code/controllers/subsystem/atoms.dm +++ b/code/controllers/subsystem/atoms.dm @@ -131,7 +131,7 @@ SUBSYSTEM_DEF(atoms) switch(result) if (INITIALIZE_HINT_NORMAL) - // pass + pass() if(INITIALIZE_HINT_LATELOAD) if(arguments[1]) //mapload late_loaders += A diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 3882228a5a..a56e10636a 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -273,7 +273,7 @@ SUBSYSTEM_DEF(vote) question = "Gamemode vote" randomize_entries = TRUE for(var/mode_type in config.gamemode_cache) - var/datum/game_mode/M = initial(mode_type) + var/datum/game_mode/M = mode_type if(initial(M.config_tag)) var/vote_cycle_met = !initial(M.vote_cycle) || (text2num(SSperf_logging?.round?.id) % initial(M.vote_cycle) == 0) if(initial(M.votable) && vote_cycle_met) diff --git a/code/datums/_ndatabase/code/brsql_adapter.dm b/code/datums/_ndatabase/code/brsql_adapter.dm index a424b3fd6f..251267a04f 100644 --- a/code/datums/_ndatabase/code/brsql_adapter.dm +++ b/code/datums/_ndatabase/code/brsql_adapter.dm @@ -101,8 +101,8 @@ SSdatabase.create_parametric_query(query_updatetable, qpars, CB) /datum/db/adapter/brsql_adapter/insert_table(table_name, list/values, datum/callback/CB, sync = FALSE) - if(!sync) - set waitfor = 0 + set waitfor = FALSE + var/length = values.len var/list/qpars = list() var/query_inserttable = getquery_insert_table(table_name, values, qpars) diff --git a/code/datums/_ndatabase/code/native_adapter.dm b/code/datums/_ndatabase/code/native_adapter.dm index a5e4d41fb6..1c23a6ceab 100644 --- a/code/datums/_ndatabase/code/native_adapter.dm +++ b/code/datums/_ndatabase/code/native_adapter.dm @@ -83,8 +83,7 @@ SSdatabase.create_query(query_gettable, CB) /datum/db/adapter/native_adapter/update_table(table_name, list/values, datum/callback/CB, sync = FALSE) - if(!sync) - set waitfor = 0 + set waitfor = FALSE for(var/list/vals in values) var/list/qpars = list() diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm index 3c4104b6c2..c9092a750f 100644 --- a/code/game/machinery/OpTable.dm +++ b/code/game/machinery/OpTable.dm @@ -59,8 +59,6 @@ if(EXPLOSION_THRESHOLD_MEDIUM to INFINITY) deconstruct(FALSE) return - else - return /obj/structure/machinery/optable/get_examine_text(mob/user) . = ..() diff --git a/code/game/machinery/air_alarm.dm b/code/game/machinery/air_alarm.dm index 16512a944b..e6fc0c8de7 100644 --- a/code/game/machinery/air_alarm.dm +++ b/code/game/machinery/air_alarm.dm @@ -431,8 +431,6 @@ var/wireIndex = AAlarmWireColorToIndex[wireColor] //not used in this function AAlarmwires |= wireFlag switch(wireIndex) - if(AALARM_WIRE_IDSCAN) - if(AALARM_WIRE_POWER) shorted = 0 shock(usr, 50) diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm index b70829c708..d82591994e 100644 --- a/code/game/machinery/bots/mulebot.dm +++ b/code/game/machinery/bots/mulebot.dm @@ -551,7 +551,7 @@ var/speed = ((wires & WIRE_MOTOR1) ? 1:0) + ((wires & WIRE_MOTOR2) ? 2:0) switch(speed) if(0) - // do nothing + pass() if(1) process_bot() spawn(2) diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index adce72f7d8..304b24a14f 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -53,8 +53,6 @@ if(EXPLOSION_THRESHOLD_MEDIUM to INFINITY) deconstruct(FALSE) return - else - return /obj/structure/machinery/computer/bullet_act(obj/projectile/Proj) if(exproof) diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index b68ca41d6f..fe85599018 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -123,7 +123,6 @@ else dat += "
[bdat]" - else else dat += text("{Log In}", src) show_browser(user, dat, "Medical Records", "med_rec") @@ -365,8 +364,6 @@ for(var/datum/data/record/E in GLOB.data_core.medical) if ((E.fields["ref"] == R.fields["ref"] || E.fields["id"] == R.fields["id"])) M = E - else - //Foreach continue //goto(2540) src.active1 = R src.active2 = M src.screen = 4 @@ -417,16 +414,12 @@ for(var/datum/data/record/R as anything in GLOB.data_core.medical) if ((lowertext(R.fields["name"]) == t1 || t1 == lowertext(R.fields["id"]))) src.active2 = R - else - //Foreach continue //goto(3229) if (!active2) temp = "Could not locate record [t1]." else for(var/datum/data/record/E in GLOB.data_core.general) if ((E.fields["name"] == src.active2.fields["name"] || E.fields["id"] == src.active2.fields["id"])) src.active1 = E - else - //Foreach continue //goto(3334) src.screen = 4 if (href_list["print_p"]) diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm index 3858230a08..f6adaa8edd 100644 --- a/code/game/machinery/computer/pod.dm +++ b/code/game/machinery/computer/pod.dm @@ -20,7 +20,6 @@ for(var/obj/structure/machinery/mass_driver/M in machines) if(M.id == id) connected = M - else return return diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm index 12f4faedc9..c5a13e2c3e 100644 --- a/code/game/machinery/computer/robot.dm +++ b/code/game/machinery/computer/robot.dm @@ -55,8 +55,7 @@ dat += " Locked Down |" else dat += " Operating Normally |" - if (!R.canmove) - else if(R.cell) + if(R.canmove && R.cell) dat += " Battery Installed ([R.cell.charge]/[R.cell.maxcharge]) |" else dat += " No Cell Installed |" diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm index f891d46bc3..a20d344b53 100644 --- a/code/game/machinery/computer/skills.dm +++ b/code/game/machinery/computer/skills.dm @@ -43,16 +43,16 @@ var/dat if (temp) - dat = text("[]

Clear Screen", temp, src) + dat = "[temp]

Clear Screen" else - dat = text("Confirm Identity: []
", src, (scan ? text("[]", scan.name) : "----------")) + dat = "Confirm Identity: [scan ? scan.name : "----------"]
" if (authenticated) switch(screen) if(1.0) dat += {"

"} - dat += text("Search Records
", src) - dat += text("New Record
", src) + dat += "Search Records
" + dat += "New Record
" dat += {"

@@ -70,20 +70,19 @@ if(!isnull(GLOB.data_core.general)) for(var/datum/data/record/R in sortRecord(GLOB.data_core.general, sortBy, order)) for(var/datum/data/record/E in GLOB.data_core.security) - var/background - dat += text("", background, src, R, R.fields["name"]) - dat += text("", R.fields["id"]) - dat += text("", R.fields["rank"]) + dat += "" + dat += "" + dat += "" dat += "
[][][]
[R.fields["name"]][R.fields["id"]][R.fields["rank"]]

" - dat += text("Record Maintenance

", src) - dat += text("{Log Out}",src) + dat += "Record Maintenance

" + dat += "{Log Out}" if(2.0) dat += "Records Maintenance
" dat += "
Delete All Records

Back" if(3.0) dat += "
Employment Record

" if ((istype(active1, /datum/data/record) && GLOB.data_core.general.Find(active1))) - dat += text("
\ + dat += " \
\ Name: [active1.fields["name"]]
\ ID: [active1.fields["id"]]
\n \ Sex: [active1.fields["sex"]]
\n \ @@ -93,18 +92,18 @@ Mental Status: [active1.fields["m_stat"]]

\n \ Employment/skills summary:
[decode(active1.fields["notes"])]
Photo:
\ -
") +
" else dat += "General Record Lost!
" - dat += text("\nDelete Record (ALL)

\nPrint Record
\nBack
", src, src, src) + dat += "\nDelete Record (ALL)

\nPrint Record
\nBack
" if(4.0) if(!Perp.len) - dat += text("ERROR. String could not be located.

Back", src) + dat += "ERROR. String could not be located.

Back" else dat += {" "} - dat += text("", tempname) + dat += "" dat += {"
Search Results for '[]':Search Results for '[tempname]':
@@ -121,17 +120,14 @@ if(istype(Perp[i+1],/datum/data/record/)) var/datum/data/record/E = Perp[i+1] crimstat = E.fields["criminal"] - var/background - background = "'background-color:#00FF7F;'" - dat += text("[]", background, src, R, R.fields["name"]) - dat += text("[]", R.fields["id"]) - dat += text("[]", R.fields["rank"]) - dat += text("[]", crimstat) + dat += "[R.fields["name"]]" + dat += "[R.fields["id"]]" + dat += "[R.fields["rank"]]" + dat += "[crimstat]" dat += "
" - dat += text("
Return to index.", src) - else + dat += "
Return to index." else - dat += text("{Log In}", src) + dat += "{Log In}" show_browser(user, dat, "Employment Records", "secure_rec", "size=600x400") onclose(user, "secure_rec") return @@ -342,7 +338,6 @@ What a mess.*/ if ((R.fields["name"] == active1.fields["name"] || R.fields["id"] == active1.fields["id"])) GLOB.data_core.medical -= R qdel(R) - else QDEL_NULL(active1) else temp = "This function does not appear to be working at the moment. Our apologies." diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index e6df92d258..99996bea89 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -54,7 +54,6 @@ src.health -= W.force * 0.75 if("brute") src.health -= W.force * 0.5 - else if (src.health <= 0) src.explode() ..() diff --git a/code/game/machinery/medical_pod/bodyscanner.dm b/code/game/machinery/medical_pod/bodyscanner.dm index 4756121e50..fdcd0ceb62 100644 --- a/code/game/machinery/medical_pod/bodyscanner.dm +++ b/code/game/machinery/medical_pod/bodyscanner.dm @@ -62,8 +62,6 @@ if(EXPLOSION_THRESHOLD_MEDIUM to INFINITY) deconstruct(FALSE) return - else - return #ifdef OBJECTS_PROXY_SPEECH // Transfers speech to occupant @@ -124,8 +122,6 @@ if(EXPLOSION_THRESHOLD_MEDIUM to INFINITY) deconstruct(FALSE) return - else - return /obj/structure/machinery/body_scanconsole/power_change() ..() diff --git a/code/game/machinery/medical_pod/sleeper.dm b/code/game/machinery/medical_pod/sleeper.dm index 805fedb292..35d9a44863 100644 --- a/code/game/machinery/medical_pod/sleeper.dm +++ b/code/game/machinery/medical_pod/sleeper.dm @@ -385,7 +385,6 @@ t1 = "Unconscious" if(2) t1 = "*dead*" - else to_chat(user, "[]\t Health %: [] ([])", (occupant.health > 50 ? SPAN_NOTICE("") : SPAN_DANGER("")), occupant.health, t1) to_chat(user, "[]\t -Core Temperature: []°C ([]°F)
", (occupant.bodytemperature > 50 ? "" : ""), occupant.bodytemperature-T0C, occupant.bodytemperature*1.8-459.67) to_chat(user, "[]\t -Brute Damage %: []", (occupant.getBruteLoss() < 60 ? SPAN_NOTICE("") : SPAN_DANGER("")), occupant.getBruteLoss()) diff --git a/code/game/machinery/vending/vending.dm b/code/game/machinery/vending/vending.dm index a74dd923cb..414ab4a562 100644 --- a/code/game/machinery/vending/vending.dm +++ b/code/game/machinery/vending/vending.dm @@ -398,28 +398,25 @@ GLOBAL_LIST_EMPTY_TYPED(total_vending_machines, /obj/structure/machinery/vending /obj/structure/machinery/vending/proc/GetProductIndex(datum/data/vending_product/product) var/list/plist - switch(product.category) - if(CAT_NORMAL) - plist=product_records - if(CAT_HIDDEN) - plist=hidden_records - if(CAT_COIN) - plist=coin_records - else - warning("UNKNOWN CATEGORY [product.category] IN TYPE [product.product_path] INSIDE [type]!") + if(product.category == CAT_NORMAL) + plist = product_records + else if(product.category == CAT_HIDDEN) + plist = hidden_records + else if(product.category == CAT_COIN) + plist = coin_records + else + warning("UNKNOWN CATEGORY [product.category] IN TYPE [product.product_path] INSIDE [type]!") return plist.Find(product) /obj/structure/machinery/vending/proc/GetProductByID(pid, category) - switch(category) - if(CAT_NORMAL) - return product_records[pid] - if(CAT_HIDDEN) - return hidden_records[pid] - if(CAT_COIN) - return coin_records[pid] - else - warning("UNKNOWN PRODUCT: PID: [pid], CAT: [category] INSIDE [type]!") - return null + if(category == CAT_NORMAL) + return product_records[pid] + else if(category == CAT_HIDDEN) + return hidden_records[pid] + else if(category == CAT_COIN) + return coin_records[pid] + else + warning("UNKNOWN PRODUCT: PID: [pid], CAT: [category] INSIDE [type]!") /obj/structure/machinery/vending/attack_hand(mob/user) if(is_tipped_over) diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm index bebe0ec8b2..56c6ae45cd 100644 --- a/code/game/objects/effects/glowshroom.dm +++ b/code/game/objects/effects/glowshroom.dm @@ -95,8 +95,6 @@ if(EXPLOSION_THRESHOLD_MEDIUM to INFINITY) deconstruct(FALSE) return - else - return /obj/effect/glowshroom/fire_act(exposed_temperature, exposed_volume) if(exposed_temperature > 300) diff --git a/code/game/objects/explosion_recursive.dm b/code/game/objects/explosion_recursive.dm index 1f52901c21..82566c8030 100644 --- a/code/game/objects/explosion_recursive.dm +++ b/code/game/objects/explosion_recursive.dm @@ -149,7 +149,7 @@ explosion resistance exactly as much as their health switch(angle) //this reduces power when the explosion is going around corners if (0) - //no change + pass() if (45) if(spread_power >= 0) spread_power *= 0.75 diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 2d142789fd..9dbe33e051 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -268,7 +268,6 @@ cases. Override_icon_state should be a list.*/ size = "huge" if(SIZE_MASSIVE) size = "massive" - else . += "This is a [blood_color ? blood_color != "#030303" ? "bloody " : "oil-stained " : ""][icon2html(src, user)][src.name]. It is a [size] item." if(desc) . += desc diff --git a/code/game/objects/items/reagent_containers/food/snacks.dm b/code/game/objects/items/reagent_containers/food/snacks.dm index 06a4d785e6..179e2014f8 100644 --- a/code/game/objects/items/reagent_containers/food/snacks.dm +++ b/code/game/objects/items/reagent_containers/food/snacks.dm @@ -182,8 +182,7 @@ return 0 var/inaccurate = 0 - if(W.sharp == IS_SHARP_ITEM_ACCURATE) - else if(W.sharp == IS_SHARP_ITEM_BIG) + if(W.sharp == IS_SHARP_ITEM_BIG) inaccurate = 1 else return 1 diff --git a/code/game/objects/items/stacks/nanopaste.dm b/code/game/objects/items/stacks/nanopaste.dm index 32e9a03046..754a36c601 100644 --- a/code/game/objects/items/stacks/nanopaste.dm +++ b/code/game/objects/items/stacks/nanopaste.dm @@ -40,7 +40,7 @@ H.pain.recalculate_pain() H.updatehealth() use(1) - var/others_msg = "\The [user] applies some nanite paste at[user != M ? " \the [M]'s" : " \the"] [S.display_name] with \the [src]." // Needs to create vars for these messages because macro doesn't work otherwise + var/others_msg = "\The [user] applies some nanite paste at[user != M ? " \the [M]'s" : " the"] [S.display_name] with \the [src]." // Needs to create vars for these messages because macro doesn't work otherwise var/user_msg = "You apply some nanite paste at [user == M ? "your" : "[M]'s"] [S.display_name]." user.visible_message(SPAN_NOTICE("[others_msg]"),\ SPAN_NOTICE("[user_msg]")) diff --git a/code/game/objects/items/storage/large_holster.dm b/code/game/objects/items/storage/large_holster.dm index ef2bcfb721..b4a6c3a8c1 100644 --- a/code/game/objects/items/storage/large_holster.dm +++ b/code/game/objects/items/storage/large_holster.dm @@ -326,7 +326,7 @@ /obj/item/storage/large_holster/fuelpack/get_examine_text(mob/user) . = ..() if(contents.len) - . += "It is storing \a M240-T incinerator unit." + . += "It is storing a M240-T incinerator unit." if (get_dist(user, src) <= 1) if(fuel) . += "The [fuel.caliber] currently contains: [round(fuel.get_ammo_percent())]% fuel." diff --git a/code/game/objects/structures/barricade/barricade.dm b/code/game/objects/structures/barricade/barricade.dm index 0ca2ccb1dd..5a72ec33ea 100644 --- a/code/game/objects/structures/barricade/barricade.dm +++ b/code/game/objects/structures/barricade/barricade.dm @@ -78,7 +78,7 @@ switch(dir) if(SOUTH) layer = ABOVE_MOB_LAYER - else if(NORTH) + if(NORTH) layer = initial(layer) - 0.01 else layer = initial(layer) diff --git a/code/game/objects/structures/barricade/handrail.dm b/code/game/objects/structures/barricade/handrail.dm index ea10dc7256..ae166dbbf9 100644 --- a/code/game/objects/structures/barricade/handrail.dm +++ b/code/game/objects/structures/barricade/handrail.dm @@ -24,7 +24,7 @@ switch(dir) if(SOUTH) layer = ABOVE_MOB_LAYER - else if(NORTH) + if(NORTH) layer = initial(layer) - 0.01 else layer = initial(layer) diff --git a/code/game/objects/structures/bookcase.dm b/code/game/objects/structures/bookcase.dm index c71b2853ea..becb0906e3 100644 --- a/code/game/objects/structures/bookcase.dm +++ b/code/game/objects/structures/bookcase.dm @@ -58,8 +58,6 @@ contents_explosion(severity) deconstruct(FALSE) return - else - return /obj/structure/bookcase/update_icon() if(contents.len < 5) diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm index 7848aaba48..b000fd5733 100644 --- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm @@ -51,8 +51,6 @@ new /obj/item/clothing/mask/gas(src) new /obj/item/clothing/mask/gas(src) new /obj/item/storage/firstaid/o2(src) - if ("nothing") - // doot // teehee - Ah, tg coders... if ("delete") diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 7c9faaf1a0..9f0417ccb3 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -130,8 +130,6 @@ contents_explosion(severity) deconstruct(FALSE) return - else - return /obj/structure/closet/crate/alpha name = "alpha squad crate" diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 38201e052c..d2b3d36b59 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -43,8 +43,6 @@ if(EXPLOSION_THRESHOLD_MEDIUM to INFINITY) deconstruct(FALSE) return - else - return /obj/structure/lattice/attackby(obj/item/C as obj, mob/user as mob) diff --git a/code/game/objects/structures/reagent_dispensers.dm b/code/game/objects/structures/reagent_dispensers.dm index 7dc6d883a2..6471dfa215 100644 --- a/code/game/objects/structures/reagent_dispensers.dm +++ b/code/game/objects/structures/reagent_dispensers.dm @@ -119,8 +119,6 @@ if(EXPLOSION_THRESHOLD_MEDIUM to INFINITY) deconstruct(FALSE) return - else - return /obj/structure/reagent_dispensers/attack_hand() if(!reagents || reagents.locked) diff --git a/code/modules/admin/topic/topic.dm b/code/modules/admin/topic/topic.dm index 8308d9c564..27e457be6d 100644 --- a/code/modules/admin/topic/topic.dm +++ b/code/modules/admin/topic/topic.dm @@ -336,86 +336,6 @@ /////////////////////////////////////new ban stuff - else if(href_list["jobban2"]) -// if(!check_rights(R_BAN)) return - /* - var/mob/M = locate(href_list["jobban2"]) - if(!ismob(M)) - to_chat(usr, "This can only be used on instances of type /mob") - return - - if(!M.ckey) //sanity - to_chat(usr, "This mob has no ckey") - return - if(!RoleAuthority) - to_chat(usr, "The Role Authority is not set up!") - return - - var/datum/entity/player/P = get_player_from_key(M.ckey) - - var/dat = "" - var/body - var/jobs = "" - - /***********************************WARNING!************************************ - The jobban stuff looks mangled and disgusting - But it looks beautiful in-game - -Nodrak - ************************************WARNING!***********************************/ -//Regular jobs - //Command (Blue) - jobs += generate_job_ban_list(M, ROLES_CIC, "CIC", "ddddff") - jobs += "
" - // SUPPORT - jobs += generate_job_ban_list(M, ROLES_AUXIL_SUPPORT, "Support", "ccccff") - jobs += "
" - // MPs - jobs += generate_job_ban_list(M, ROLES_POLICE, "Police", "ffdddd") - jobs += "
" - //Engineering (Yellow) - jobs += generate_job_ban_list(M, ROLES_ENGINEERING, "Engineering", "fff5cc") - jobs += "
" - //Cargo (Yellow) //Copy paste, yada, yada. Hopefully Snail can rework this in the future. - jobs += generate_job_ban_list(M, ROLES_REQUISITION, "Requisition", "fff5cc") - jobs += "
" - //Medical (White) - jobs += generate_job_ban_list(M, ROLES_MEDICAL, "Medical", "ffeef0") - jobs += "
" - //Marines - jobs += generate_job_ban_list(M, ROLES_MARINES, "Marines", "ffeeee") - jobs += "
" - // MISC - jobs += generate_job_ban_list(M, ROLES_MISC, "Misc", "aaee55") - jobs += "
" - // Xenos (Orange) - jobs += generate_job_ban_list(M, ROLES_XENO, "Xenos", "a268b1") - jobs += "
" - //Extra (Orange) - var/isbanned_dept = jobban_isbanned(M, "Syndicate", P) - jobs += "" - jobs += "" - - //ERT - if(jobban_isbanned(M, "Emergency Response Team", P) || isbanned_dept) - jobs += "" - else - jobs += "" - - //Survivor - if(jobban_isbanned(M, "Survivor", P) || isbanned_dept) - jobs += "" - else - jobs += "" - - if(jobban_isbanned(M, "Agent", P) || isbanned_dept) - jobs += "" - else - jobs += "" - - body = "[jobs]" - dat = "[body]" - show_browser(usr, dat, "Job-Ban Panel: [M.name]", "jobban2", "size=800x490") - return*/ // DEPRECATED //JOBBAN'S INNARDS else if(href_list["jobban3"]) if(!check_rights(R_MOD,0) && !check_rights(R_ADMIN)) return diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm index d5d44a0479..d1e7f83dac 100644 --- a/code/modules/asset_cache/asset_list_items.dm +++ b/code/modules/asset_cache/asset_list_items.dm @@ -321,7 +321,7 @@ I = icon(icon_file, icon_state, SOUTH) var/c = initial(item.color) if (!isnull(c) && c != "#FFFFFF") - I.Blend(initial(c), ICON_MULTIPLY) + I.Blend(c, ICON_MULTIPLY) else if (ispath(k, /obj/effect/essentials_set)) var/obj/effect/essentials_set/es_set = new k() diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 1da30d6e47..04b82628e3 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -1414,11 +1414,8 @@ var/const/MAX_SAVE_SLOTS = 10 var/all_ok = TRUE for(var/i=1, i<=length(new_xeno_prefix), i++) var/ascii_char = text2ascii(new_xeno_prefix,i) - switch(ascii_char) - // A .. Z - if(65 to 90) //Uppercase Letters will work - else - all_ok = FALSE //everything else - won't + if(ascii_char < 65 || ascii_char > 90) + all_ok = FALSE //everything else - won't if(all_ok) xeno_prefix = new_xeno_prefix owner.load_xeno_name() diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index d969587e32..cc7fee7724 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -423,7 +423,7 @@ return var/obj/item/weapon/gun/W = usr.get_active_hand() if (W.w_class > SIZE_MEDIUM) - to_chat(usr, SPAN_DANGER("This gun won't fit in \the belt!")) + to_chat(usr, SPAN_DANGER("This gun won't fit in the belt!")) return holstered = usr.get_active_hand() usr.drop_held_item() diff --git a/code/modules/desert_dam/filtration/consoles.dm b/code/modules/desert_dam/filtration/consoles.dm index 038b96eb47..8c2814fafd 100644 --- a/code/modules/desert_dam/filtration/consoles.dm +++ b/code/modules/desert_dam/filtration/consoles.dm @@ -35,8 +35,6 @@ var/global/river_activated = FALSE if (prob(10)) get_broken() return - else - return /obj/structure/machinery/filtration/console/proc/get_broken() if(damaged) diff --git a/code/modules/flufftext/Chinese.dm b/code/modules/flufftext/Chinese.dm index 36da1d307a..6b19dd61fc 100644 --- a/code/modules/flufftext/Chinese.dm +++ b/code/modules/flufftext/Chinese.dm @@ -62,12 +62,12 @@ //remove complex/simple -u- glide final_syllables if(initial.initial_sound_flags & SIMPLE_U_ONLY) for(var/datum/chinese_sound/final_syllable/final_syllable as anything in possible_final_syllables) - if(initial(initial(final_syllable.vowel_class)) == VOWEL_CLASS_BACK_CLOSE) + if(initial(final_syllable.vowel_class) == VOWEL_CLASS_BACK_CLOSE) possible_final_syllables -= final_syllable possible_final_syllables += /datum/chinese_sound/final_syllable/u else if(initial.initial_sound_flags & HALF_U) for(var/datum/chinese_sound/final_syllable/final_syllable as anything in possible_final_syllables) - if(initial(initial(final_syllable.vowel_class)) == VOWEL_CLASS_BACK_CLOSE && initial(final_syllable.final_syllable_sound_flags) & U_GROUP_FULL) + if(initial(final_syllable.vowel_class) == VOWEL_CLASS_BACK_CLOSE && initial(final_syllable.final_syllable_sound_flags) & U_GROUP_FULL) possible_final_syllables -= final_syllable //check for if the sound is alveolo-palatal or sibilant/retroflex - then remove or keep front close vowels accordingly diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 4b86c827a0..069392f2c9 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -132,7 +132,6 @@ for(var/message_mode in parsed["modes"]) var/list/obj/item/used_radios = list() switch(message_mode) - if(MESSAGE_MODE_LOCAL) if(RADIO_MODE_WHISPER) whisper_say(message, speaking, alt_name) return diff --git a/code/modules/projectiles/guns/flamer/flamer.dm b/code/modules/projectiles/guns/flamer/flamer.dm index 13ccd03c3e..1091df3391 100644 --- a/code/modules/projectiles/guns/flamer/flamer.dm +++ b/code/modules/projectiles/guns/flamer/flamer.dm @@ -737,8 +737,6 @@ GLOBAL_LIST_EMPTY(flamer_particles) var/angle = 180 - abs( abs( direction_angle - spread_direction_angle ) - 180 ) // the angle difference between the spread direction and initial direction switch(angle) //this reduces power when the explosion is going around corners - if (0) - //no change if (45) spread_power *= 0.75 else //turns out angles greater than 90 degrees almost never happen. This bit also prevents trying to spread backwards diff --git a/code/modules/reagents/chemistry_reagents/drink.dm b/code/modules/reagents/chemistry_reagents/drink.dm index 468243a0cc..3bd7336c32 100644 --- a/code/modules/reagents/chemistry_reagents/drink.dm +++ b/code/modules/reagents/chemistry_reagents/drink.dm @@ -85,13 +85,13 @@ /datum/reagent/drink/carrotjuice/on_mob_life(mob/living/M) . = ..() - if(!.) return + if(!.) + return M.ReduceEyeBlur(1) M.ReduceEyeBlind(1) - if(!data) data = 1 + if(!data) + data = 1 switch(data) - if(1 to 20) - //nothing if(21 to INFINITY) if(prob(data-10)) M.disabilities &= ~NEARSIGHTED diff --git a/colonialmarines.dme b/colonialmarines.dme index b6967c2df5..0853abf66b 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -1,4 +1,4 @@ -s// DM Environment file for colonialmarines.dme. +// DM Environment file for colonialmarines.dme. // All manual changes should be made outside the BEGIN_ and END_ blocks. // New source code should be placed in .dm files: choose File/New --> Code File. // BEGIN_INTERNALS @@ -11,6 +11,7 @@ s// DM Environment file for colonialmarines.dme. #define DEBUG // END_PREFERENCES // BEGIN_INCLUDE +#include "code\__odlint.dm" #include "code\_byond_version_compat.dm" #include "code\_compile_options.dm" #include "code\_experiments.dm" diff --git a/dependencies.sh b/dependencies.sh index 2889751d36..f88c2f9b0a 100644 --- a/dependencies.sh +++ b/dependencies.sh @@ -19,3 +19,5 @@ export SPACEMAN_DMM_VERSION=suite-1.7.2 # Python version for mapmerge and other tools export PYTHON_VERSION=3.7.9 + +export OPENDREAM_VERSION=0.2.0 diff --git a/tools/ci/download_od.sh b/tools/ci/download_od.sh new file mode 100644 index 0000000000..024f93f928 --- /dev/null +++ b/tools/ci/download_od.sh @@ -0,0 +1,11 @@ +#!/bin/bash +set -eo pipefail + +if [ -z "${OPENDREAM_VERSION+x}" ]; then + source dependencies.sh +fi + +git clone https://github.com/OpenDreamProject/OpenDream.git ~/OpenDream +cd ~/OpenDream +git checkout tags/v${OPENDREAM_VERSION} +git submodule update --init --recursive diff --git a/tools/ci/run_od.sh b/tools/ci/run_od.sh new file mode 100644 index 0000000000..3eeac59073 --- /dev/null +++ b/tools/ci/run_od.sh @@ -0,0 +1,4 @@ +#!/bin/bash +set -eo pipefail + +dotnet ~/OpenDream/DMCompiler/bin/Release/net7.0/DMCompiler.dll --suppress-unimplemented colonialmarines.dme diff --git a/tools/ci/setup_od.sh b/tools/ci/setup_od.sh new file mode 100644 index 0000000000..6d2ec17068 --- /dev/null +++ b/tools/ci/setup_od.sh @@ -0,0 +1,7 @@ +#!/bin/bash +set -eo pipefail + +cd ~/OpenDream + +dotnet restore +dotnet build -c Release diff --git a/tools/ci/validate_dme.py b/tools/ci/validate_dme.py index 33066f72e7..5566648042 100644 --- a/tools/ci/validate_dme.py +++ b/tools/ci/validate_dme.py @@ -17,6 +17,9 @@ # Included by BSQL/includes.dm r'code/__HELPERS/BSQL/**/*.dm', + + # Included as part of OD lints + r'code/__pragmas.dm' ] lines = [] From 47f8a6e7d394b89566075f9c711bc67bc82f5118 Mon Sep 17 00:00:00 2001 From: harryob Date: Sat, 21 Oct 2023 23:12:59 +0100 Subject: [PATCH 30/63] fixes missing href token in admin noting (#4738) because we have two different panels for noting ?? anyway :cl: admin: view-target-records now allows you to note people properly /:cl: --- code/game/verbs/records.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/verbs/records.dm b/code/game/verbs/records.dm index f09de72da2..18ed35ee63 100644 --- a/code/game/verbs/records.dm +++ b/code/game/verbs/records.dm @@ -143,7 +143,7 @@ dat += "" var/color = "#008800" - var/add_dat = "Add Admin Note
Add Confidential Admin Note
" + var/add_dat = "Add Admin Note
Add Confidential Admin Note
" switch(note_category) if(NOTE_MERIT) color = "#9e3dff" From 04de099194f99f0b692051e1728f2186e71be544 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 22 Oct 2023 01:53:31 +0100 Subject: [PATCH 31/63] Automatic changelog for PR #4738 [ci skip] --- html/changelogs/AutoChangeLog-pr-4738.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4738.yml diff --git a/html/changelogs/AutoChangeLog-pr-4738.yml b/html/changelogs/AutoChangeLog-pr-4738.yml new file mode 100644 index 0000000000..248817ba60 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4738.yml @@ -0,0 +1,4 @@ +author: "harryob" +delete-after: True +changes: + - admin: "view-target-records now allows you to note people properly" \ No newline at end of file From 3971a14e34d43f1b280f6f5a7bd57975060f99c9 Mon Sep 17 00:00:00 2001 From: Drathek <76988376+Drulikar@users.noreply.github.com> Date: Sat, 21 Oct 2023 17:16:31 -0700 Subject: [PATCH 32/63] Fix cluster and incend OB not respecting ceiling protections (#4746) # About the pull request This PR makes it so incend and cluster OBs actually respect ceiling protections (not just pylon protections). HE already is respecting closed areas, so your fault for leaving the doors open. # Explain why it's good for the game Dropships ceilings were changed fairly long ago to protect against OBs, but the implementation I guess was never tested thoroughly. # Testing Photographs and Procedure
Screenshots & Videos ![incend](https://github.com/cmss13-devs/cmss13/assets/76988376/76907e59-d95d-4ddd-8165-864fa688e8c6) https://youtu.be/Fc0q9p6hmeE
# Changelog :cl: Drathek fix: Fix incend and cluster OBs not respecting ceiling OB protections. /:cl: --- code/__DEFINES/__game.dm | 13 ++++- code/modules/cm_marines/orbital_cannon.dm | 10 ++-- .../modules/projectiles/guns/flamer/flamer.dm | 50 +++++++++++-------- 3 files changed, 48 insertions(+), 25 deletions(-) diff --git a/code/__DEFINES/__game.dm b/code/__DEFINES/__game.dm index 113b78dbad..f1424f5560 100644 --- a/code/__DEFINES/__game.dm +++ b/code/__DEFINES/__game.dm @@ -283,7 +283,6 @@ block( \ /// Only use the CEILING_PROTECTION_TIER_X defines for `protection_level` #define CEILING_IS_PROTECTED(ceiling, protection_level) (ceiling >= protection_level) - // Default font settings #define FONT_SIZE "5pt" #define DEFAULT_FONT_COLOR "#09f" @@ -493,6 +492,18 @@ block( \ #define TURF_PROTECTION_CAS 2 #define TURF_PROTECTION_OB 3 +/// Convert a turf protection level to a ceiling protection level +/proc/get_ceiling_protection_level(turf_protection_level) + switch(turf_protection_level) + if(TURF_PROTECTION_OB) + return CEILING_PROTECTION_TIER_4 + if(TURF_PROTECTION_CAS) + return CEILING_PROTECTION_TIER_3 + if(TURF_PROTECTION_MORTAR) + return CEILING_PROTECTION_TIER_2 + else + return CEILING_NO_PROTECTION + // Anything above the deck boundary is the upper deck, anything below is the lower deck // This is exclusive, so anything ON the boundary is an edge case that's neither on the upper nor the lower deck #define ALMAYER_DECK_BOUNDARY 101 diff --git a/code/modules/cm_marines/orbital_cannon.dm b/code/modules/cm_marines/orbital_cannon.dm index 5a3cad590c..78bdfc3d77 100644 --- a/code/modules/cm_marines/orbital_cannon.dm +++ b/code/modules/cm_marines/orbital_cannon.dm @@ -538,10 +538,14 @@ var/list/ob_type_fuel_requirements for(var/i = 1 to total_amount) for(var/k = 1 to instant_amount) - var/turf/U = pick(turf_list) - if(protected_by_pylon(TURF_PROTECTION_OB, U)) //If the turf somehow gained OB protection while the cluster was firing + var/turf/selected_turf = pick(turf_list) + if(protected_by_pylon(TURF_PROTECTION_OB, selected_turf)) continue - fire_in_a_hole(U) + var/area/selected_area = get_area(selected_turf) + if(CEILING_IS_PROTECTED(selected_area?.ceiling, CEILING_PROTECTION_TIER_4)) + continue + fire_in_a_hole(selected_turf) + sleep(delay_between_clusters) QDEL_IN(src, 5 SECONDS) // Leave time for last handle_ob_shake below diff --git a/code/modules/projectiles/guns/flamer/flamer.dm b/code/modules/projectiles/guns/flamer/flamer.dm index 1091df3391..d562d305c2 100644 --- a/code/modules/projectiles/guns/flamer/flamer.dm +++ b/code/modules/projectiles/guns/flamer/flamer.dm @@ -719,12 +719,12 @@ GLOBAL_LIST_EMPTY(flamer_particles) var/direction_angle = dir2angle(direction) var/obj/flamer_fire/foundflame = locate() in target if(!foundflame) - var/datum/reagent/R = new() - R.intensityfire = burn_lvl - R.durationfire = fire_lvl - R.burn_sprite = burn_sprite - R.burncolor = f_color - new/obj/flamer_fire(target, cause_data, R) + var/datum/reagent/fire_reag = new() + fire_reag.intensityfire = burn_lvl + fire_reag.durationfire = fire_lvl + fire_reag.burn_sprite = burn_sprite + fire_reag.burncolor = f_color + new/obj/flamer_fire(target, cause_data, fire_reag) if(target.density) return @@ -751,25 +751,29 @@ GLOBAL_LIST_EMPTY(flamer_particles) if (spread_power < 1) continue - var/turf/T = get_step(target, spread_direction) + var/turf/picked_turf = get_step(target, spread_direction) - if(!T) //prevents trying to spread into "null" (edge of the map?) + if(!picked_turf) //prevents trying to spread into "null" (edge of the map?) continue - if(aerial_flame_level && (T.get_pylon_protection_level() >= aerial_flame_level)) - break + if(aerial_flame_level) + if(picked_turf.get_pylon_protection_level() >= aerial_flame_level) + break + var/area/picked_area = get_area(picked_turf) + if(CEILING_IS_PROTECTED(picked_area?.ceiling, get_ceiling_protection_level(aerial_flame_level))) + break spawn(0) - fire_spread_recur(T, cause_data, spread_power, spread_direction, fire_lvl, burn_lvl, f_color, burn_sprite, aerial_flame_level) + fire_spread_recur(picked_turf, cause_data, spread_power, spread_direction, fire_lvl, burn_lvl, f_color, burn_sprite, aerial_flame_level) /proc/fire_spread(turf/target, datum/cause_data/cause_data, range, fire_lvl, burn_lvl, f_color, burn_sprite = "dynamic", aerial_flame_level = TURF_PROTECTION_NONE) - var/datum/reagent/R = new() - R.intensityfire = burn_lvl - R.durationfire = fire_lvl - R.burn_sprite = burn_sprite - R.burncolor = f_color + var/datum/reagent/fire_reag = new() + fire_reag.intensityfire = burn_lvl + fire_reag.durationfire = fire_lvl + fire_reag.burn_sprite = burn_sprite + fire_reag.burncolor = f_color - new/obj/flamer_fire(target, cause_data, R) + new/obj/flamer_fire(target, cause_data, fire_reag) for(var/direction in alldirs) var/spread_power = range switch(direction) @@ -777,7 +781,11 @@ GLOBAL_LIST_EMPTY(flamer_particles) spread_power-- else spread_power -= 1.414 //diagonal spreading - var/turf/T = get_step(target, direction) - if(aerial_flame_level && (T.get_pylon_protection_level() >= aerial_flame_level)) - continue - fire_spread_recur(T, cause_data, spread_power, direction, fire_lvl, burn_lvl, f_color, burn_sprite, aerial_flame_level) + var/turf/picked_turf = get_step(target, direction) + if(aerial_flame_level) + if(picked_turf.get_pylon_protection_level() >= aerial_flame_level) + continue + var/area/picked_area = get_area(picked_turf) + if(CEILING_IS_PROTECTED(picked_area?.ceiling, get_ceiling_protection_level(aerial_flame_level))) + continue + fire_spread_recur(picked_turf, cause_data, spread_power, direction, fire_lvl, burn_lvl, f_color, burn_sprite, aerial_flame_level) From c4e4072e85f4e57137adc634f9f9fc6d9fac96eb Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 22 Oct 2023 02:08:02 +0100 Subject: [PATCH 33/63] Automatic changelog for PR #4746 [ci skip] --- html/changelogs/AutoChangeLog-pr-4746.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4746.yml diff --git a/html/changelogs/AutoChangeLog-pr-4746.yml b/html/changelogs/AutoChangeLog-pr-4746.yml new file mode 100644 index 0000000000..9b13c70d9b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4746.yml @@ -0,0 +1,4 @@ +author: "Drathek" +delete-after: True +changes: + - bugfix: "Fix incend and cluster OBs not respecting ceiling OB protections." \ No newline at end of file From 3b00860df93a882f62ec2b0d3e58481c12cbcc42 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 22 Oct 2023 01:12:34 +0000 Subject: [PATCH 34/63] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-4590.yml | 5 ----- html/changelogs/AutoChangeLog-pr-4732.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4733.yml | 5 ----- html/changelogs/AutoChangeLog-pr-4735.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4736.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4738.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4739.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4741.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4745.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4746.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4747.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4748.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4749.yml | 4 ---- html/changelogs/archive/2023-10.yml | 27 +++++++++++++++++++++++ 14 files changed, 27 insertions(+), 54 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4590.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4732.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4733.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4735.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4736.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4738.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4739.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4741.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4745.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4746.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4747.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4748.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4749.yml diff --git a/html/changelogs/AutoChangeLog-pr-4590.yml b/html/changelogs/AutoChangeLog-pr-4590.yml deleted file mode 100644 index df23394b92..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4590.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "kiVts" -delete-after: True -changes: - - rscadd: "Ghosts get notified when they are being revived by DFB property" - - balance: "DFB property healing threshold lowered, You can create DFB property higher than one." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4732.yml b/html/changelogs/AutoChangeLog-pr-4732.yml deleted file mode 100644 index afe968b3a5..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4732.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Drathek" -delete-after: True -changes: - - bugfix: "Disabled code in icon2html that is causing bad icon operations" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4733.yml b/html/changelogs/AutoChangeLog-pr-4733.yml deleted file mode 100644 index 43d1d2b92e..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4733.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "realforest2001" -delete-after: True -changes: - - rscadd: "Added Discretionary Arrest to JAS." - - rscadd: "Added a new category to JAS, Precautionary Charges. Moves Insanity and POW to this category." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4735.yml b/html/changelogs/AutoChangeLog-pr-4735.yml deleted file mode 100644 index a92d5015c3..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4735.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Morrow" -delete-after: True -changes: - - server: "the rustg mysql driver is now properly compatible with mariadb" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4736.yml b/html/changelogs/AutoChangeLog-pr-4736.yml deleted file mode 100644 index 3efd380ae2..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4736.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "harryob" -delete-after: True -changes: - - bugfix: "mentorhelp response no longer gives a dead discord link" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4738.yml b/html/changelogs/AutoChangeLog-pr-4738.yml deleted file mode 100644 index 248817ba60..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4738.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "harryob" -delete-after: True -changes: - - admin: "view-target-records now allows you to note people properly" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4739.yml b/html/changelogs/AutoChangeLog-pr-4739.yml deleted file mode 100644 index 5d99c028a1..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4739.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "harryob" -delete-after: True -changes: - - admin: "no more href token errors when changing the game mode via game panel" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4741.yml b/html/changelogs/AutoChangeLog-pr-4741.yml deleted file mode 100644 index ec52d20b80..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4741.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "fira" -delete-after: True -changes: - - bugfix: "Re-fixed Megaphone above-head-chat drifting to the left." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4745.yml b/html/changelogs/AutoChangeLog-pr-4745.yml deleted file mode 100644 index b4e23e494b..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4745.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "fira" -delete-after: True -changes: - - bugfix: "Fixed incorrect Reqs vendors visuals on the Almayer. They now blend in with the walls again." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4746.yml b/html/changelogs/AutoChangeLog-pr-4746.yml deleted file mode 100644 index 9b13c70d9b..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4746.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Drathek" -delete-after: True -changes: - - bugfix: "Fix incend and cluster OBs not respecting ceiling OB protections." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4747.yml b/html/changelogs/AutoChangeLog-pr-4747.yml deleted file mode 100644 index 0b876d3bac..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4747.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Zonespace27" -delete-after: True -changes: - - rscadd: "Mentors can now unmark mhelps" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4748.yml b/html/changelogs/AutoChangeLog-pr-4748.yml deleted file mode 100644 index 5b188fdc38..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4748.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "fira" -delete-after: True -changes: - - rscadd: "Stamping papers now makes a noise." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4749.yml b/html/changelogs/AutoChangeLog-pr-4749.yml deleted file mode 100644 index 1e75689c0a..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4749.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "fira" -delete-after: True -changes: - - bugfix: "Removed redundant double binding for F1 to AdminHelp from default keybinds. This does not affect existing users or their settings." \ No newline at end of file diff --git a/html/changelogs/archive/2023-10.yml b/html/changelogs/archive/2023-10.yml index 94c9527348..2e3ce59495 100644 --- a/html/changelogs/archive/2023-10.yml +++ b/html/changelogs/archive/2023-10.yml @@ -315,3 +315,30 @@ - rscadd: Added splints to the survival pouch - rscadd: Increased survival pouch storage space by 1 - spellcheck: Updates the survival pouch's description +2023-10-22: + Drathek: + - bugfix: Fix incend and cluster OBs not respecting ceiling OB protections. + - bugfix: Disabled code in icon2html that is causing bad icon operations + Morrow: + - server: the rustg mysql driver is now properly compatible with mariadb + Zonespace27: + - rscadd: Mentors can now unmark mhelps + fira: + - bugfix: Removed redundant double binding for F1 to AdminHelp from default keybinds. + This does not affect existing users or their settings. + - rscadd: Stamping papers now makes a noise. + - bugfix: Fixed incorrect Reqs vendors visuals on the Almayer. They now blend in + with the walls again. + - bugfix: Re-fixed Megaphone above-head-chat drifting to the left. + harryob: + - admin: no more href token errors when changing the game mode via game panel + - bugfix: mentorhelp response no longer gives a dead discord link + - admin: view-target-records now allows you to note people properly + kiVts: + - rscadd: Ghosts get notified when they are being revived by DFB property + - balance: DFB property healing threshold lowered, You can create DFB property higher + than one. + realforest2001: + - rscadd: Added Discretionary Arrest to JAS. + - rscadd: Added a new category to JAS, Precautionary Charges. Moves Insanity and + POW to this category. From 1e890af39d7c4b6233439fbaa8693a3918e35f5c Mon Sep 17 00:00:00 2001 From: Steelpoint <6595389+Steelpoint@users.noreply.github.com> Date: Mon, 23 Oct 2023 02:03:20 +0800 Subject: [PATCH 35/63] Revolver Heavy Ammo Effect Change (#4706) # About the pull request This PR changes heavy ammo for the Revolver to knockback a mob and slow them down instead of stunning it. # Explain why it's good for the game Combat balance is a precarious and often difficult conversation to hold, ergo I'll lay my biases out on the table at first. I'm a marine main at heart, but I have played a lot of xeno recently to gain a better understanding of their side of the story, enough that I feel confident to make these assertions. My belief is that the heavy ammo of the revolver is a negative concept for the game, and it needs to be removed, due to its stun factor. The issue here is readability and prediction. When you see a RPG, you know that it can fire a devastating warhead that can stun and kill T3s. When you see a Warrior, you know it can leap to 4 tiles to stun and drag a Human, when you hear a CAS strike you know exactly what is about to drop. When you see a Queen you know she can stun screech and neuro stun you. But the issue with the Revolver is it has no obvious tell. It is a small item, that can be fit inside backpacks, holsters, pouches, belts, armour slots. It has no obvious advance warning when you are going to fire it. There is no special uniform requirement making a revolver user standout amongst the crowd. There is no tell. The problem with the stun revolver is simply that is is a hard counter to all T1s and most T2s. Its ability to stun allows it to perform an attack that is uncounterable to a xeno as a xeno has no way to predict who may be carrying one. A xeno can tell who a Specialist is, a xeno can tell who has a shotgun or flamer or sniper or RPG, you can tell when a mortar is being prepared, or a CAS strike or even an OB. You can see the smartgunner. Even the Scout, a literal cloaked Marine, has to uncloak to fire. You can not tell who has a revolver until they pull it out and stun you. Once you are stunned you die. A xeno equilivant would be if any Xeno could be carrying a special tool that lets them grab a marine from 7 tiles away and pull them in plus stun them for 2 seconds. But any xenomorph could be using it, including a Lesser Drone. Perhaps the heavy revolver could be reworked to do something else, but ultimately the only reason anyone takes this ammo is for the stun. Anything else is beating around the bush. Those are my reasoning's, I'll leave the rest to the powers' that be. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: balance: Revolver Heavy ammo no longer stuns targets it strikes, it will instead knock them back and slow them down for a short time. /:cl: --------- Co-authored-by: Steelpoint --- code/datums/ammo/ammo.dm | 9 +++++++++ code/datums/ammo/bullet/revolver.dm | 5 +++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/code/datums/ammo/ammo.dm b/code/datums/ammo/ammo.dm index c536ac8348..a858c6b1f5 100644 --- a/code/datums/ammo/ammo.dm +++ b/code/datums/ammo/ammo.dm @@ -171,6 +171,15 @@ else living_mob.apply_stamina_damage(fired_projectile.ammo.damage, fired_projectile.def_zone, ARMOR_BULLET) +/datum/ammo/proc/slowdown(mob/living/living_mob, obj/projectile/fired_projectile) + if(iscarbonsizexeno(living_mob)) + var/mob/living/carbon/xenomorph/target = living_mob + target.apply_effect(1, SUPERSLOW) + target.apply_effect(2, SLOW) + to_chat(target, SPAN_XENODANGER("You are slowed by the sudden impact!")) + else + living_mob.apply_stamina_damage(fired_projectile.ammo.damage, fired_projectile.def_zone, ARMOR_BULLET) + /datum/ammo/proc/pushback(mob/target_mob, obj/projectile/fired_projectile, max_range = 2) if(!target_mob || target_mob == fired_projectile.firer || fired_projectile.distance_travelled > max_range || target_mob.lying) return diff --git a/code/datums/ammo/bullet/revolver.dm b/code/datums/ammo/bullet/revolver.dm index 339609f57b..633bf3e2f7 100644 --- a/code/datums/ammo/bullet/revolver.dm +++ b/code/datums/ammo/bullet/revolver.dm @@ -27,8 +27,9 @@ penetration = ARMOR_PENETRATION_TIER_4 accuracy = HIT_ACCURACY_TIER_3 -/datum/ammo/bullet/revolver/heavy/on_hit_mob(mob/M, obj/projectile/P) - knockback(M, P, 4) +/datum/ammo/bullet/revolver/heavy/on_hit_mob(mob/entity, obj/projectile/bullet) + slowdown(entity, bullet) + pushback(entity, bullet, 4) /datum/ammo/bullet/revolver/incendiary name = "incendiary revolver bullet" From 81f90df92c06f7182e671c942155ed89b1ad19aa Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 22 Oct 2023 19:17:21 +0100 Subject: [PATCH 36/63] Automatic changelog for PR #4706 [ci skip] --- html/changelogs/AutoChangeLog-pr-4706.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4706.yml diff --git a/html/changelogs/AutoChangeLog-pr-4706.yml b/html/changelogs/AutoChangeLog-pr-4706.yml new file mode 100644 index 0000000000..8d6c934a5c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4706.yml @@ -0,0 +1,4 @@ +author: "Steelpoint" +delete-after: True +changes: + - balance: "Revolver Heavy ammo no longer stuns targets it strikes, it will instead knock them back and slow them down for a short time." \ No newline at end of file From b02c8445b85796e1647d1e423697bdf0dc007bf0 Mon Sep 17 00:00:00 2001 From: harryob Date: Sun, 22 Oct 2023 19:04:12 +0100 Subject: [PATCH 37/63] removes hardcoded server name from latejoiners (#4753) latejoiners were always shown the default skin in the .dmf as the custom title based on config was only shown if you happened to be connected when SSmapping was initializing :cl: server: the server now respects /string/title for late joiners /:cl: --- code/controllers/subsystem/mapping.dm | 4 +--- interface/skin.dmf | 1 - 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index afecabd74b..be69bdad1b 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -29,9 +29,7 @@ SUBSYSTEM_DEF(mapping) /datum/controller/subsystem/mapping/proc/HACK_LoadMapConfig() if(!configs) configs = load_map_configs(ALL_MAPTYPES, error_if_missing = FALSE) - for(var/i in GLOB.clients) - var/client/C = i - winset(C, null, "mainwindow.title='[CONFIG_GET(string/title)] - [SSmapping.configs[SHIP_MAP].map_name]'") + world.name = "[CONFIG_GET(string/title)] - [SSmapping.configs[SHIP_MAP].map_name]" /datum/controller/subsystem/mapping/Initialize(timeofday) HACK_LoadMapConfig() diff --git a/interface/skin.dmf b/interface/skin.dmf index 5d06bb40e8..e31c42938c 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -164,7 +164,6 @@ window "mainwindow" anchor2 = -1,-1 is-default = true saved-params = "pos;size;is-minimized;is-maximized" - title = "CM-SS13 - USS Almayer" is-maximized = true statusbar = false icon = 'icons\\taskbar\\gml_distress.png' From 9703d4cd7407b5e6a32ee8c6b487f697b8acd078 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 22 Oct 2023 19:35:53 +0100 Subject: [PATCH 38/63] Automatic changelog for PR #4753 [ci skip] --- html/changelogs/AutoChangeLog-pr-4753.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4753.yml diff --git a/html/changelogs/AutoChangeLog-pr-4753.yml b/html/changelogs/AutoChangeLog-pr-4753.yml new file mode 100644 index 0000000000..961d6e35c2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4753.yml @@ -0,0 +1,4 @@ +author: "harryob" +delete-after: True +changes: + - server: "the server now respects /string/title for late joiners" \ No newline at end of file From 3d2b2ed59547b3786ab65336bc78276e8d28a4bf Mon Sep 17 00:00:00 2001 From: QuickLode <63271983+QuickLode@users.noreply.github.com> Date: Sun, 22 Oct 2023 11:04:32 -0700 Subject: [PATCH 39/63] Nerfs Colony Synthetic Pouch (#4752) # About the pull request nerfs synth surv pouch by 1 slot # Explain why it's good for the game Feel like it holds a little much so this is a step in the right direction. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: balance: Nerfs synth surv pouch by removing 1 storage slot. /:cl: --- code/game/objects/items/storage/pouch.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/game/objects/items/storage/pouch.dm b/code/game/objects/items/storage/pouch.dm index f24c0c3f31..48eb322f20 100644 --- a/code/game/objects/items/storage/pouch.dm +++ b/code/game/objects/items/storage/pouch.dm @@ -168,7 +168,7 @@ name = "synth survival pouch" desc = "An emergency pouch given to synthetics in the event of an emergency." icon_state = "tools" - storage_slots = 7 + storage_slots = 6 max_w_class = SIZE_MEDIUM can_hold = list( /obj/item/device/flashlight, @@ -181,7 +181,6 @@ ) /obj/item/storage/pouch/survival/synth/full/fill_preset_inventory() - new /obj/item/device/flashlight(src) new /obj/item/tool/crowbar/red(src) new /obj/item/tool/weldingtool(src) new /obj/item/stack/cable_coil(src) From 14319cf2222148f10d6fa59bd128d77ddb3d8540 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 22 Oct 2023 20:01:28 +0100 Subject: [PATCH 40/63] Automatic changelog for PR #4752 [ci skip] --- html/changelogs/AutoChangeLog-pr-4752.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4752.yml diff --git a/html/changelogs/AutoChangeLog-pr-4752.yml b/html/changelogs/AutoChangeLog-pr-4752.yml new file mode 100644 index 0000000000..b6417f410e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4752.yml @@ -0,0 +1,4 @@ +author: "QuickLode" +delete-after: True +changes: + - balance: "Nerfs synth surv pouch by removing 1 storage slot." \ No newline at end of file From 5a48d2c38271fcc61e14491095756676a1aeaca6 Mon Sep 17 00:00:00 2001 From: stalkerino <66872447+irakligabunia@users.noreply.github.com> Date: Sun, 22 Oct 2023 22:07:21 +0400 Subject: [PATCH 41/63] M39 being able to use vertical grip again [BUFF] (#4627) # About the pull request M39 receives a buff, which allows it to use a attachment that make sit viable. # Explain why it's good for the game M39 as it stands is quite useless, the vertical grip might help it become a viable choice over the M4RA, the MK2 and the M37 :) # Testing Photographs and Procedure Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: stalkerino balance: m39 is able to use vertigrip /:cl: --- code/modules/projectiles/guns/smgs.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/modules/projectiles/guns/smgs.dm b/code/modules/projectiles/guns/smgs.dm index 89e6594c64..24eddf3159 100644 --- a/code/modules/projectiles/guns/smgs.dm +++ b/code/modules/projectiles/guns/smgs.dm @@ -11,7 +11,7 @@ aim_slowdown = SLOWDOWN_ADS_QUICK wield_delay = WIELD_DELAY_VERY_FAST attachable_allowed = list( - /obj/item/attachable/suppressor, + /obj/item/attachable/suppressor, /obj/item/attachable/reddot, /obj/item/attachable/reflex, /obj/item/attachable/flashlight, @@ -50,7 +50,8 @@ /obj/item/attachable/suppressor, /obj/item/attachable/reddot, /obj/item/attachable/reflex, - /obj/item/attachable/angledgrip, + /obj/item/attachable/angledgrip, + /obj/item/attachable/verticalgrip, /obj/item/attachable/flashlight/grip, /obj/item/attachable/stock/smg, /obj/item/attachable/stock/smg/collapsible, From 6fdb79b32114f1ce5ed59f044498819028074e68 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 22 Oct 2023 20:41:08 +0100 Subject: [PATCH 42/63] Automatic changelog for PR #4627 [ci skip] --- html/changelogs/AutoChangeLog-pr-4627.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4627.yml diff --git a/html/changelogs/AutoChangeLog-pr-4627.yml b/html/changelogs/AutoChangeLog-pr-4627.yml new file mode 100644 index 0000000000..69b88c7358 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4627.yml @@ -0,0 +1,4 @@ +author: "stalkerino" +delete-after: True +changes: + - balance: "m39 is able to use vertigrip" \ No newline at end of file From 34878a19fa8f942b60f8742fb48db9255d1da9fc Mon Sep 17 00:00:00 2001 From: Spy <31124786+SpypigDev@users.noreply.github.com> Date: Mon, 23 Oct 2023 05:08:46 +1100 Subject: [PATCH 43/63] SO CIC vendor quality of life tweaks (#4707) # About the pull request Brings more cohesion to the SO vendor system, as well as CIC Armory. Reworking the gear/prep aspect of SOs to better reflect what gear would be reasonable for them to have IC (no machetes right out of cryo for example). - SO spawn vendors majorly cut back, with webbing, combat helmet, machete, all belts, and RTO pack removed, moving each to the _SO Armory Vendor_. The SO spawn vendor should provide purely for SO activity _within_ CIC, and I feel this is more appropriate - Added a new vendor in CIC's Armory called the 'SO Armory Vendor' to serve as a new location for the deployment gear set required by SOs. - On top of already already-mentioned moved gear, the Armory vendor adds combat gear, aviator shades (because of course), an option to specialize as either an Engineer or a Medic with their essential kit, an engineer belt! (as well as all the other belts removed from the SO spawn room) - Adds some extra items to the Armory vendor point-buy section to **finally** give SOs a reason to chew up their 45 points, notably including the RTO pack # Explain why it's good for the game I've always found it really unusual how SO spawn vendors are a bit all over the place in terms of supplied gear. With this PR, SO gear has been split into two distinct vendors, with one being firmly behind the Armory shutters to ensure that SOs aren't allowed to continually roll around the Almayer with a full combat set minus the chest piece and rifle. This way, SOs can still get basic gear needed for CIC operation from their regular vendor, but can also access a full combat set _and more_ once the Armory shutters go up, whether it's from XO deployment or code red. # Testing Photographs and Procedure
Screenshots & Videos New SO spawn vend: https://cdn.discordapp.com/attachments/1100833406314618880/1163812305352528015/image.png?ex=6540efac&is=652e7aac&hm=5a4db3d47b2a0f6416e7b0181ad135913203512f7fb7b5c5600394d75e9856aa& Armory Vendor, the typo has since been repaired (1/2): https://cdn.discordapp.com/attachments/1100833406314618880/1163812464232775690/image.png?ex=6540efd2&is=652e7ad2&hm=b6040e631260ef77f502903b1cf65a59d18f7b2a896d45d0d0e9ce0493e2887e& Armory Vendor (2/2): https://cdn.discordapp.com/attachments/1100833406314618880/1163812566569582632/image.png?ex=6540efea&is=652e7aea&hm=186a90a37c2b6b8821de93ae476aa02733db22a9360e050900beb81d4b412a7a& New CIC Armory setup: https://cdn.discordapp.com/attachments/1100833406314618880/1163812692696498226/image.png?ex=6540f008&is=652e7b08&hm=7434e1a665e87af3683be853a388c97039f3c790ba1c17e9482347c532fca2e9&
# Changelog :cl: add: CIC Armory SO vendor balance: Moved most combat-themed gear from SO spawn vendors, to CIC Armory vendor balance: Made RTO pack a point-buy item in CIC Armory vendor for SOs /:cl: --- code/game/machinery/vending/cm_vending.dm | 2 +- .../vendor_types/crew/staff_officer.dm | 55 ++---------- .../vendor_types/crew/staff_officer_armory.dm | 83 +++++++++++++++++++ colonialmarines.dme | 1 + maps/map_files/USS_Almayer/USS_Almayer.dmm | 8 +- 5 files changed, 92 insertions(+), 57 deletions(-) create mode 100644 code/game/machinery/vending/vendor_types/crew/staff_officer_armory.dm diff --git a/code/game/machinery/vending/cm_vending.dm b/code/game/machinery/vending/cm_vending.dm index bf7c4fffee..861f5b37eb 100644 --- a/code/game/machinery/vending/cm_vending.dm +++ b/code/game/machinery/vending/cm_vending.dm @@ -774,8 +774,8 @@ GLOBAL_LIST_EMPTY(vending_products) desc = "An automated closet hooked up to a colossal storage of standard-issue uniform and armor." icon_state = "clothing" use_points = TRUE + show_points = TRUE vendor_theme = VENDOR_THEME_USCM - show_points = FALSE vend_flags = VEND_CLUTTER_PROTECTION | VEND_UNIFORM_RANKS | VEND_UNIFORM_AUTOEQUIP | VEND_CATEGORY_CHECK /obj/structure/machinery/cm_vending/clothing/ui_static_data(mob/user) diff --git a/code/game/machinery/vending/vendor_types/crew/staff_officer.dm b/code/game/machinery/vending/vendor_types/crew/staff_officer.dm index 85a8a58d16..50b83ccdc5 100644 --- a/code/game/machinery/vending/vendor_types/crew/staff_officer.dm +++ b/code/game/machinery/vending/vendor_types/crew/staff_officer.dm @@ -13,13 +13,13 @@ GLOBAL_LIST_INIT(cm_vending_clothing_staff_officer, list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), list("Boots", 0, /obj/item/clothing/shoes/marine/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), list("Headset", 0, /obj/item/device/radio/headset/almayer/mcom, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), - list("Helmet", 0, /obj/item/clothing/head/helmet/marine/MP/SO, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_MANDATORY), list("MRE", 0, /obj/item/storage/box/MRE, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), list("Service Uniform", 0, /obj/item/clothing/under/marine/officer/bridge, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR), list("Operations Uniform", 0, /obj/item/clothing/under/marine/officer/boiler, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_RECOMMENDED), + list("Gloves", 0, /obj/item/clothing/gloves/marine, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_REGULAR), list("JACKET (CHOOSE 1)", 0, null, null, null), list("Service Jacket", 0, /obj/item/clothing/suit/storage/jacket/marine/service, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_RECOMMENDED), @@ -33,66 +33,21 @@ GLOBAL_LIST_INIT(cm_vending_clothing_staff_officer, list( list("PERSONAL SIDEARM (CHOOSE 1)", 0, null, null, null), - list("M44 Revolver", 0, /obj/item/storage/belt/gun/m44/mp, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), - list("M4A3 Pistol", 0, /obj/item/storage/belt/gun/m4a3/commander, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), - list("VP78 Pistol", 0, /obj/item/storage/belt/gun/m4a3/vp78, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("M44 Revolver", 0, /obj/item/storage/belt/gun/m44/mp, MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_RECOMMENDED), + list("M4A3 Pistol", 0, /obj/item/storage/belt/gun/m4a3/commander, MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_RECOMMENDED), + list("VP78 Pistol", 0, /obj/item/storage/belt/gun/m4a3/vp78, MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_RECOMMENDED), list("BACKPACK (CHOOSE 1)", 0, null, null, null), list("Backpack", 0, /obj/item/storage/backpack/marine, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_REGULAR), list("Satchel", 0, /obj/item/storage/backpack/marine/satchel, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_REGULAR), - list("Radio Telephone Pack", 0, /obj/item/storage/backpack/marine/satchel/rto, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_RECOMMENDED), - list("BELT (CHOOSE 1)", 0, null, null, null), - list("G8-A General Utility Pouch", 0, /obj/item/storage/backpack/general_belt, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), - list("M276 Ammo Load Rig", 0, /obj/item/storage/belt/marine, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), - list("M276 Lifesaver Bag (Full)", 0, /obj/item/storage/belt/medical/lifesaver/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 Medical Storage Rig (Full)", 0, /obj/item/storage/belt/medical/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 M39 Holster Rig", 0, /obj/item/storage/belt/gun/m39, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 M82F Holster Rig", 0, /obj/item/storage/belt/gun/flaregun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 Shotgun Shell Loading Rig", 0, /obj/item/storage/belt/shotgun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 M40 Grenade Rig", 0, /obj/item/storage/belt/grenade, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - - list("POUCHES (CHOOSE 2)", 0, null, null, null), - list("Autoinjector Pouch", 0, /obj/item/storage/pouch/autoinjector, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Construction Pouch", 0, /obj/item/storage/pouch/construction, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Document Pouch", 0, /obj/item/storage/pouch/document, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Electronics Pouch (Full)", 0, /obj/item/storage/pouch/electronics/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("First-Aid Pouch (Refillable Injectors)", 0, /obj/item/storage/pouch/firstaid/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("First-Aid Pouch (Splints, Gauze, Ointment)", 0, /obj/item/storage/pouch/firstaid/full/alternate, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("First-Aid Pouch (Pill Packets)", 0, /obj/item/storage/pouch/firstaid/full/pills, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("First Responder Pouch", 0, /obj/item/storage/pouch/first_responder, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Flare Pouch (Full)", 0, /obj/item/storage/pouch/flare/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Fuel Tank Strap Pouch", 0, /obj/item/storage/pouch/flamertank, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Large General Pouch", 0, /obj/item/storage/pouch/general/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED), - list("Large Magazine Pouch", 0, /obj/item/storage/pouch/magazine/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Large Shotgun Shell Pouch", 0, /obj/item/storage/pouch/shotgun/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Large Pistol Magazine Pouch", 0, /obj/item/storage/pouch/magazine/pistol/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Medical Pouch", 0, /obj/item/storage/pouch/medical, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Medical Kit Pouch", 0, /obj/item/storage/pouch/medkit, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Pistol Pouch", 0, /obj/item/storage/pouch/pistol, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Sling Pouch", 0, /obj/item/storage/pouch/sling, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Tools Pouch (Full)", 0, /obj/item/storage/pouch/tools/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - - list("ACCESSORIES (CHOOSE 1)", 0, null, null, null), - list("Black Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), - list("Brown Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest/brown_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_RECOMMENDED), - list("Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), - list("Webbing", 0, /obj/item/clothing/accessory/storage/webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), - list("Shoulder Holster", 0, /obj/item/clothing/accessory/storage/holster, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), - - list("MASK (CHOOSE 1)", 0, null, null, null), - list("Gas Mask", 0, /obj/item/clothing/mask/gas, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR), - list("Heat Absorbent Coif", 0, /obj/item/clothing/mask/rebreather/scarf, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR), list("OTHER SUPPLIES", 0, null, null, null), list("Binoculars", 5,/obj/item/device/binoculars, null, VENDOR_ITEM_REGULAR), list("Rangefinder", 8, /obj/item/device/binoculars/range, null, VENDOR_ITEM_REGULAR), list("Laser Designator", 12, /obj/item/device/binoculars/range/designator, null, VENDOR_ITEM_RECOMMENDED), - list("Data Detector", 5, /obj/item/device/motiondetector/intel, null, VENDOR_ITEM_REGULAR), list("Flashlight", 1, /obj/item/device/flashlight, null, VENDOR_ITEM_RECOMMENDED), - list("Fulton Recovery Device", 5, /obj/item/stack/fulton, null, VENDOR_ITEM_REGULAR), - list("Motion Detector", 5, /obj/item/device/motiondetector, null, VENDOR_ITEM_REGULAR), + list("Motion Detector", 5, /obj/item/device/motiondetector, null, VENDOR_ITEM_RECOMMENDED), list("Space Cleaner", 2, /obj/item/reagent_container/spray/cleaner, null, VENDOR_ITEM_REGULAR), list("Whistle", 5, /obj/item/device/whistle, null, VENDOR_ITEM_REGULAR), - list("Machete Scabbard (Full)", 2, /obj/item/storage/large_holster/machete/full, null, VENDOR_ITEM_REGULAR) )) diff --git a/code/game/machinery/vending/vendor_types/crew/staff_officer_armory.dm b/code/game/machinery/vending/vendor_types/crew/staff_officer_armory.dm new file mode 100644 index 0000000000..ac7b22b4e0 --- /dev/null +++ b/code/game/machinery/vending/vendor_types/crew/staff_officer_armory.dm @@ -0,0 +1,83 @@ +/obj/structure/machinery/cm_vending/clothing/staff_officer_armory + name = "\improper ColMarTech Staff Officer Armory Equipment Rack" + desc = "An automated combat equipment vendor for Staff Officers." + req_access = list(ACCESS_MARINE_COMMAND) + icon_state = "mar_rack" + vendor_role = list(JOB_SO) + +/obj/structure/machinery/cm_vending/clothing/staff_officer_armory/get_listed_products(mob/user) + return GLOB.cm_vending_clothing_staff_officer_armory + +//------------GEAR--------------- + +GLOBAL_LIST_INIT(cm_vending_clothing_staff_officer_armory, list( + list("COMBAT EQUIPMENT (TAKE ALL)", 0, null, null, null), + list("Officer M3 Armor", 0, /obj/item/clothing/suit/storage/marine/MP/SO, MARINE_CAN_BUY_COMBAT_ARMOR, VENDOR_ITEM_MANDATORY), + list("Officer M10 Helmet", 0, /obj/item/clothing/head/helmet/marine/MP/SO, MARINE_CAN_BUY_COMBAT_HELMET, VENDOR_ITEM_MANDATORY), + list("Marine Combat Boots", 0, /obj/item/clothing/shoes/marine/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), + list("Marine Combat Gloves", 0, /obj/item/clothing/gloves/marine, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), + list("MRE", 0, /obj/item/storage/box/MRE, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), + list("Aviator Shades", 0, /obj/item/clothing/glasses/sunglasses/aviator, MARINE_CAN_BUY_GLASSES, VENDOR_ITEM_REGULAR), + + list("SPECIALISATION KIT (CHOOSE 1)", 0, null, null, null), + list("Essential Engineer Set", 0, /obj/effect/essentials_set/engi, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_RECOMMENDED), + list("Essential Medical Set", 0, /obj/effect/essentials_set/medic, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_RECOMMENDED), + + list("BELT (CHOOSE 1)", 0, null, null, null), + list("G8-A General Utility Pouch", 0, /obj/item/storage/backpack/general_belt, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("M276 Ammo Load Rig", 0, /obj/item/storage/belt/marine, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("M276 Toolbelt Rig (Full)", 0, /obj/item/storage/belt/utility/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("M276 Lifesaver Bag (Full)", 0, /obj/item/storage/belt/medical/lifesaver/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 Medical Storage Rig (Full)", 0, /obj/item/storage/belt/medical/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 M39 Holster Rig", 0, /obj/item/storage/belt/gun/m39, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 M82F Holster Rig", 0, /obj/item/storage/belt/gun/flaregun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 Shotgun Shell Loading Rig", 0, /obj/item/storage/belt/shotgun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 M40 Grenade Rig", 0, /obj/item/storage/belt/grenade, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + + list("POUCHES (CHOOSE 2)", 0, null, null, null), + list("Autoinjector Pouch", 0, /obj/item/storage/pouch/autoinjector, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Construction Pouch", 0, /obj/item/storage/pouch/construction, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Document Pouch", 0, /obj/item/storage/pouch/document, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Electronics Pouch (Full)", 0, /obj/item/storage/pouch/electronics/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("First-Aid Pouch (Refillable Injectors)", 0, /obj/item/storage/pouch/firstaid/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("First-Aid Pouch (Splints, Gauze, Ointment)", 0, /obj/item/storage/pouch/firstaid/full/alternate, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("First-Aid Pouch (Pill Packets)", 0, /obj/item/storage/pouch/firstaid/full/pills, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("First Responder Pouch", 0, /obj/item/storage/pouch/first_responder, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Flare Pouch (Full)", 0, /obj/item/storage/pouch/flare/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Fuel Tank Strap Pouch", 0, /obj/item/storage/pouch/flamertank, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Large General Pouch", 0, /obj/item/storage/pouch/general/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED), + list("Large Magazine Pouch", 0, /obj/item/storage/pouch/magazine/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Large Shotgun Shell Pouch", 0, /obj/item/storage/pouch/shotgun/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Large Pistol Magazine Pouch", 0, /obj/item/storage/pouch/magazine/pistol/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Medical Pouch", 0, /obj/item/storage/pouch/medical, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Medical Kit Pouch", 0, /obj/item/storage/pouch/medkit, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Pistol Pouch", 0, /obj/item/storage/pouch/pistol, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Sling Pouch", 0, /obj/item/storage/pouch/sling, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Tools Pouch (Full)", 0, /obj/item/storage/pouch/tools/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + + list("ACCESSORIES (CHOOSE 1)", 0, null, null, null), + list("Black Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Brown Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest/brown_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_RECOMMENDED), + list("Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Webbing", 0, /obj/item/clothing/accessory/storage/webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Shoulder Holster", 0, /obj/item/clothing/accessory/storage/holster, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + + list("MASK (CHOOSE 1)", 0, null, null, null), + list("Gas Mask", 0, /obj/item/clothing/mask/gas, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR), + list("Heat Absorbent Coif", 0, /obj/item/clothing/mask/rebreather/scarf, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR), + + list("OTHER SUPPLIES", 0, null, null, null), + list("Medical Helmet Optic", 5, /obj/item/device/helmet_visor/medical, null, VENDOR_ITEM_REGULAR), + list("Magnetic Harness", 12, /obj/item/attachable/magnetic_harness, null, VENDOR_ITEM_REGULAR), + list("Radio Telephone Pack", 15, /obj/item/storage/backpack/marine/satchel/rto, null, VENDOR_ITEM_RECOMMENDED), + list("Binoculars", 5,/obj/item/device/binoculars, null, VENDOR_ITEM_REGULAR), + list("Rangefinder", 8, /obj/item/device/binoculars/range, null, VENDOR_ITEM_REGULAR), + list("Laser Designator", 12, /obj/item/device/binoculars/range/designator, null, VENDOR_ITEM_RECOMMENDED), + list("Data Detector", 5, /obj/item/device/motiondetector/intel, null, VENDOR_ITEM_REGULAR), + list("Flashlight", 1, /obj/item/device/flashlight, null, VENDOR_ITEM_RECOMMENDED), + list("Fulton Recovery Device", 5, /obj/item/stack/fulton, null, VENDOR_ITEM_REGULAR), + list("Motion Detector", 5, /obj/item/device/motiondetector, null, VENDOR_ITEM_REGULAR), + list("Space Cleaner", 2, /obj/item/reagent_container/spray/cleaner, null, VENDOR_ITEM_REGULAR), + list("Whistle", 5, /obj/item/device/whistle, null, VENDOR_ITEM_REGULAR), + list("Machete Scabbard (Full)", 5, /obj/item/storage/large_holster/machete/full, null, VENDOR_ITEM_REGULAR) + )) diff --git a/colonialmarines.dme b/colonialmarines.dme index 0853abf66b..fe2fadba5c 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -939,6 +939,7 @@ #include "code\game\machinery\vending\vendor_types\crew\sea.dm" #include "code\game\machinery\vending\vendor_types\crew\senior_officers.dm" #include "code\game\machinery\vending\vendor_types\crew\staff_officer.dm" +#include "code\game\machinery\vending\vendor_types\crew\staff_officer_armory.dm" #include "code\game\machinery\vending\vendor_types\crew\synthetic.dm" #include "code\game\machinery\vending\vendor_types\crew\vehicle_crew.dm" #include "code\game\machinery\vending\vendor_types\squad_prep\squad_engineer.dm" diff --git a/maps/map_files/USS_Almayer/USS_Almayer.dmm b/maps/map_files/USS_Almayer/USS_Almayer.dmm index b2b300133d..12227cacc5 100644 --- a/maps/map_files/USS_Almayer/USS_Almayer.dmm +++ b/maps/map_files/USS_Almayer/USS_Almayer.dmm @@ -530,14 +530,12 @@ }, /area/almayer/hallways/aft_hallway) "abQ" = ( -/obj/structure/surface/rack, -/obj/item/clothing/suit/storage/marine/light/vest, -/obj/item/clothing/suit/storage/marine/light/vest, /obj/item/device/radio/intercom{ freerange = 1; name = "General Listening Channel"; pixel_y = 28 }, +/obj/structure/machinery/cm_vending/clothing/staff_officer_armory, /turf/open/floor/almayer{ icon_state = "redfull" }, @@ -63674,9 +63672,7 @@ }, /area/almayer/lifeboat_pumps/north1) "ryR" = ( -/obj/structure/machinery/cm_vending/sorted/uniform_supply/squad_prep{ - req_access = list(1) - }, +/obj/structure/machinery/cm_vending/clothing/staff_officer_armory, /turf/open/floor/almayer{ icon_state = "redfull" }, From b511436086cf3a8e25846d615193803a5399d6e5 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 22 Oct 2023 20:59:03 +0100 Subject: [PATCH 44/63] Automatic changelog for PR #4707 [ci skip] --- html/changelogs/AutoChangeLog-pr-4707.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4707.yml diff --git a/html/changelogs/AutoChangeLog-pr-4707.yml b/html/changelogs/AutoChangeLog-pr-4707.yml new file mode 100644 index 0000000000..d609bd7feb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4707.yml @@ -0,0 +1,6 @@ +author: "SpypigDev" +delete-after: True +changes: + - rscadd: "CIC Armory SO vendor" + - balance: "Moved most combat-themed gear from SO spawn vendors, to CIC Armory vendor" + - balance: "Made RTO pack a point-buy item in CIC Armory vendor for SOs" \ No newline at end of file From 9961f9b450f035060b83d3f49f83f90cefe4410a Mon Sep 17 00:00:00 2001 From: Changelogs Date: Mon, 23 Oct 2023 01:08:30 +0000 Subject: [PATCH 45/63] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-4627.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4706.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4707.yml | 6 ------ html/changelogs/AutoChangeLog-pr-4752.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4753.yml | 4 ---- html/changelogs/archive/2023-10.yml | 14 ++++++++++++++ 6 files changed, 14 insertions(+), 22 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4627.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4706.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4707.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4752.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4753.yml diff --git a/html/changelogs/AutoChangeLog-pr-4627.yml b/html/changelogs/AutoChangeLog-pr-4627.yml deleted file mode 100644 index 69b88c7358..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4627.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "stalkerino" -delete-after: True -changes: - - balance: "m39 is able to use vertigrip" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4706.yml b/html/changelogs/AutoChangeLog-pr-4706.yml deleted file mode 100644 index 8d6c934a5c..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4706.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Steelpoint" -delete-after: True -changes: - - balance: "Revolver Heavy ammo no longer stuns targets it strikes, it will instead knock them back and slow them down for a short time." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4707.yml b/html/changelogs/AutoChangeLog-pr-4707.yml deleted file mode 100644 index d609bd7feb..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4707.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "SpypigDev" -delete-after: True -changes: - - rscadd: "CIC Armory SO vendor" - - balance: "Moved most combat-themed gear from SO spawn vendors, to CIC Armory vendor" - - balance: "Made RTO pack a point-buy item in CIC Armory vendor for SOs" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4752.yml b/html/changelogs/AutoChangeLog-pr-4752.yml deleted file mode 100644 index b6417f410e..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4752.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "QuickLode" -delete-after: True -changes: - - balance: "Nerfs synth surv pouch by removing 1 storage slot." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4753.yml b/html/changelogs/AutoChangeLog-pr-4753.yml deleted file mode 100644 index 961d6e35c2..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4753.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "harryob" -delete-after: True -changes: - - server: "the server now respects /string/title for late joiners" \ No newline at end of file diff --git a/html/changelogs/archive/2023-10.yml b/html/changelogs/archive/2023-10.yml index 2e3ce59495..91ac923f0b 100644 --- a/html/changelogs/archive/2023-10.yml +++ b/html/changelogs/archive/2023-10.yml @@ -342,3 +342,17 @@ - rscadd: Added Discretionary Arrest to JAS. - rscadd: Added a new category to JAS, Precautionary Charges. Moves Insanity and POW to this category. +2023-10-23: + QuickLode: + - balance: Nerfs synth surv pouch by removing 1 storage slot. + SpypigDev: + - rscadd: CIC Armory SO vendor + - balance: Moved most combat-themed gear from SO spawn vendors, to CIC Armory vendor + - balance: Made RTO pack a point-buy item in CIC Armory vendor for SOs + Steelpoint: + - balance: Revolver Heavy ammo no longer stuns targets it strikes, it will instead + knock them back and slow them down for a short time. + harryob: + - server: the server now respects /string/title for late joiners + stalkerino: + - balance: m39 is able to use vertigrip From b7aafd1ef82c1fcc9d4ca0577600399311576b12 Mon Sep 17 00:00:00 2001 From: Segrain Date: Tue, 24 Oct 2023 02:54:45 +0400 Subject: [PATCH 46/63] Fix for slicing food. (#4770) # About the pull request Followup to #4645. And also a fix for ancient math mistake few lines below. # Explain why it's good for the game Is fix. # Changelog :cl: fix: Slicing food once again works as intended. /:cl: --- code/game/objects/items/reagent_containers/food/snacks.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/reagent_containers/food/snacks.dm b/code/game/objects/items/reagent_containers/food/snacks.dm index 179e2014f8..2892eb1113 100644 --- a/code/game/objects/items/reagent_containers/food/snacks.dm +++ b/code/game/objects/items/reagent_containers/food/snacks.dm @@ -184,7 +184,7 @@ var/inaccurate = 0 if(W.sharp == IS_SHARP_ITEM_BIG) inaccurate = 1 - else + else if(W.sharp != IS_SHARP_ITEM_ACCURATE) return 1 if ( !istype(loc, /obj/structure/surface/table) && \ (!isturf(src.loc) || \ @@ -205,7 +205,7 @@ SPAN_NOTICE("[user] crudely slices \the [src] with [W]!"), \ SPAN_NOTICE("You crudely slice \the [src] with your [W]!") \ ) - slices_lost = rand(1,min(1,round(slices_num/2))) + slices_lost = rand(1,max(1,round(slices_num/2))) var/reagents_per_slice = reagents.total_volume/slices_num for(var/i=1 to (slices_num-slices_lost)) var/obj/slice = new slice_path (src.loc) From 004cd863319b7a483ef71fb3e01541187d9f5806 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Tue, 24 Oct 2023 00:04:49 +0100 Subject: [PATCH 47/63] Automatic changelog for PR #4770 [ci skip] --- html/changelogs/AutoChangeLog-pr-4770.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4770.yml diff --git a/html/changelogs/AutoChangeLog-pr-4770.yml b/html/changelogs/AutoChangeLog-pr-4770.yml new file mode 100644 index 0000000000..c805c6a63c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4770.yml @@ -0,0 +1,4 @@ +author: "Segrain" +delete-after: True +changes: + - bugfix: "Slicing food once again works as intended." \ No newline at end of file From 78c89745a61388f3b59b9d6c540528cd6cf75271 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Tue, 24 Oct 2023 01:07:47 +0000 Subject: [PATCH 48/63] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-4770.yml | 4 ---- html/changelogs/archive/2023-10.yml | 3 +++ 2 files changed, 3 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4770.yml diff --git a/html/changelogs/AutoChangeLog-pr-4770.yml b/html/changelogs/AutoChangeLog-pr-4770.yml deleted file mode 100644 index c805c6a63c..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4770.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Segrain" -delete-after: True -changes: - - bugfix: "Slicing food once again works as intended." \ No newline at end of file diff --git a/html/changelogs/archive/2023-10.yml b/html/changelogs/archive/2023-10.yml index 91ac923f0b..82d6376591 100644 --- a/html/changelogs/archive/2023-10.yml +++ b/html/changelogs/archive/2023-10.yml @@ -356,3 +356,6 @@ - server: the server now respects /string/title for late joiners stalkerino: - balance: m39 is able to use vertigrip +2023-10-24: + Segrain: + - bugfix: Slicing food once again works as intended. From 62aac19f76773033ecd3f04e5132a310c7d67ec2 Mon Sep 17 00:00:00 2001 From: fira Date: Tue, 24 Oct 2023 05:04:01 +0200 Subject: [PATCH 49/63] hotfix for radio talking (#4769) # About the pull request Hotfix for #4645 - removing the switch clause makes normal talk fall through into radio speech and makes everyone talk on radio all the time # Testing Photographs and Procedure Very basic testing # Changelog :cl: fix: Fixed people talking in radios all the time. Finally some quiet. /:cl: --- code/modules/mob/living/carbon/human/say.dm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 069392f2c9..28e45dcb2f 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -141,9 +141,10 @@ used_radios += I break // remove this if we EVER have two different intercomms with DIFFERENT frequencies IN ONE ROOM else - var/earpiece = get_type_in_ears(/obj/item/device/radio) - if(earpiece) - used_radios += earpiece + if(message_mode != MESSAGE_MODE_LOCAL) + var/earpiece = get_type_in_ears(/obj/item/device/radio) + if(earpiece) + used_radios += earpiece var/sound/speech_sound var/sound_vol From b4e6d9145173054104c94417f5f58e57e14360ff Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Tue, 24 Oct 2023 04:12:35 +0100 Subject: [PATCH 50/63] Automatic changelog for PR #4769 [ci skip] --- html/changelogs/AutoChangeLog-pr-4769.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4769.yml diff --git a/html/changelogs/AutoChangeLog-pr-4769.yml b/html/changelogs/AutoChangeLog-pr-4769.yml new file mode 100644 index 0000000000..f91f0bc5b2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4769.yml @@ -0,0 +1,4 @@ +author: "fira" +delete-after: True +changes: + - bugfix: "Fixed people talking in radios all the time. Finally some quiet." \ No newline at end of file From e31a1d21ee9aa87a84b4d639bea4139bd859d8f5 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Tue, 24 Oct 2023 08:50:23 +0100 Subject: [PATCH 51/63] Automatic TGS DMAPI Update (#4773) This pull request updates the TGS DMAPI to the latest version. Please note any breaking or unimplemented changes before merging. Co-authored-by: tgstation-server --- code/__DEFINES/tgs.dm | 13 ++++++++++++- code/modules/tgs/core/core.dm | 7 ++++++- code/modules/tgs/core/datum.dm | 3 +++ code/modules/tgs/v5/__interop_version.dm | 2 +- code/modules/tgs/v5/_defines.dm | 1 + code/modules/tgs/v5/api.dm | 6 ++++++ code/modules/tgs/v5/undefs.dm | 1 + 7 files changed, 30 insertions(+), 3 deletions(-) diff --git a/code/__DEFINES/tgs.dm b/code/__DEFINES/tgs.dm index 6187a67825..9825cd118b 100644 --- a/code/__DEFINES/tgs.dm +++ b/code/__DEFINES/tgs.dm @@ -1,6 +1,6 @@ // tgstation-server DMAPI -#define TGS_DMAPI_VERSION "6.5.3" +#define TGS_DMAPI_VERSION "6.6.0" // All functions and datums outside this document are subject to change with any version and should not be relied on. @@ -129,6 +129,13 @@ /// DreamDaemon Ultrasafe security level. #define TGS_SECURITY_ULTRASAFE 2 +/// DreamDaemon public visibility level. +#define TGS_VISIBILITY_PUBLIC 0 +/// DreamDaemon private visibility level. +#define TGS_VISIBILITY_PRIVATE 1 +/// DreamDaemon invisible visibility level. +#define TGS_VISIBILITY_INVISIBLE 2 + //REQUIRED HOOKS /** @@ -458,6 +465,10 @@ /world/proc/TgsSecurityLevel() return +/// Returns the current BYOND visibility level as a TGS_VISIBILITY_ define if TGS is present, null otherwise. Requires TGS to be using interop API version 5 or higher otherwise the string "___unimplemented" wil be returned. This function may sleep if the call to [/world/proc/TgsNew] is sleeping! +/world/proc/TgsVisibility() + return + /// Returns a list of active [/datum/tgs_revision_information/test_merge]s if TGS is present, null otherwise. This function may sleep if the call to [/world/proc/TgsNew] is sleeping! /world/proc/TgsTestMerges() return diff --git a/code/modules/tgs/core/core.dm b/code/modules/tgs/core/core.dm index 41a0473394..b9a9f27a28 100644 --- a/code/modules/tgs/core/core.dm +++ b/code/modules/tgs/core/core.dm @@ -153,4 +153,9 @@ /world/TgsSecurityLevel() var/datum/tgs_api/api = TGS_READ_GLOBAL(tgs) if(api) - api.SecurityLevel() + return api.SecurityLevel() + +/world/TgsVisibility() + var/datum/tgs_api/api = TGS_READ_GLOBAL(tgs) + if(api) + return api.Visibility() diff --git a/code/modules/tgs/core/datum.dm b/code/modules/tgs/core/datum.dm index 68b0330fe8..93377079aa 100644 --- a/code/modules/tgs/core/datum.dm +++ b/code/modules/tgs/core/datum.dm @@ -57,3 +57,6 @@ TGS_PROTECT_DATUM(/datum/tgs_api) /datum/tgs_api/proc/SecurityLevel() return TGS_UNIMPLEMENTED + +/datum/tgs_api/proc/Visibility() + return TGS_UNIMPLEMENTED diff --git a/code/modules/tgs/v5/__interop_version.dm b/code/modules/tgs/v5/__interop_version.dm index 5d3d491a73..1b52b31d6a 100644 --- a/code/modules/tgs/v5/__interop_version.dm +++ b/code/modules/tgs/v5/__interop_version.dm @@ -1 +1 @@ -"5.6.1" +"5.6.2" diff --git a/code/modules/tgs/v5/_defines.dm b/code/modules/tgs/v5/_defines.dm index f973338daa..bdcd4e4dd5 100644 --- a/code/modules/tgs/v5/_defines.dm +++ b/code/modules/tgs/v5/_defines.dm @@ -48,6 +48,7 @@ #define DMAPI5_RUNTIME_INFORMATION_REVISION "revision" #define DMAPI5_RUNTIME_INFORMATION_TEST_MERGES "testMerges" #define DMAPI5_RUNTIME_INFORMATION_SECURITY_LEVEL "securityLevel" +#define DMAPI5_RUNTIME_INFORMATION_VISIBILITY "visibility" #define DMAPI5_CHAT_UPDATE_CHANNELS "channels" diff --git a/code/modules/tgs/v5/api.dm b/code/modules/tgs/v5/api.dm index 34cc43f876..45250efc46 100644 --- a/code/modules/tgs/v5/api.dm +++ b/code/modules/tgs/v5/api.dm @@ -4,6 +4,7 @@ var/instance_name var/security_level + var/visibility var/reboot_mode = TGS_REBOOT_MODE_NORMAL @@ -54,6 +55,7 @@ version = new /datum/tgs_version(runtime_information[DMAPI5_RUNTIME_INFORMATION_SERVER_VERSION]) security_level = runtime_information[DMAPI5_RUNTIME_INFORMATION_SECURITY_LEVEL] + visibility = runtime_information[DMAPI5_RUNTIME_INFORMATION_VISIBILITY] instance_name = runtime_information[DMAPI5_RUNTIME_INFORMATION_INSTANCE_NAME] var/list/revisionData = runtime_information[DMAPI5_RUNTIME_INFORMATION_REVISION] @@ -252,3 +254,7 @@ /datum/tgs_api/v5/SecurityLevel() RequireInitialBridgeResponse() return security_level + +/datum/tgs_api/v5/Visibility() + RequireInitialBridgeResponse() + return visibility diff --git a/code/modules/tgs/v5/undefs.dm b/code/modules/tgs/v5/undefs.dm index c679737dfc..f163adaaaf 100644 --- a/code/modules/tgs/v5/undefs.dm +++ b/code/modules/tgs/v5/undefs.dm @@ -48,6 +48,7 @@ #undef DMAPI5_RUNTIME_INFORMATION_REVISION #undef DMAPI5_RUNTIME_INFORMATION_TEST_MERGES #undef DMAPI5_RUNTIME_INFORMATION_SECURITY_LEVEL +#undef DMAPI5_RUNTIME_INFORMATION_VISIBILITY #undef DMAPI5_CHAT_UPDATE_CHANNELS From 336625688585418f3123387467f4eb8ba469f732 Mon Sep 17 00:00:00 2001 From: fira Date: Tue, 24 Oct 2023 13:52:23 +0200 Subject: [PATCH 52/63] Fixes Observer Death Messages being delayed (#4775) # About the pull request Long standing bug - due to waiting for not one but two full database entities loading, the death message in dchat is delayed. It's also symptomatic of a scheduling problem with DBQM as you can see deaths occuring in "batches" every couple seconds, indicating the queries are not processed timely - but this is out of scope for this PR. Instead it just moves the observer logging to take place before DB ops. # Explain why it's good for the game Feels less clunky. # Testing Photographs and Procedure Just spawned stuff and abombed it. # Changelog :cl: fix: deadchat death messages should now display immediately rather than being delayed a couple seconds. /:cl: --- code/datums/statistics/entities/death_stats.dm | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/code/datums/statistics/entities/death_stats.dm b/code/datums/statistics/entities/death_stats.dm index 4a01e4e9d7..cb3053a334 100644 --- a/code/datums/statistics/entities/death_stats.dm +++ b/code/datums/statistics/entities/death_stats.dm @@ -84,6 +84,10 @@ if(!mind || statistic_exempt) return + var/area/area = get_area(death_loc) + handle_observer_message(cause_data, cause_mob, death_loc, area) + + // Perform logging above before get_player_from_key to avoid delays var/datum/entity/statistic/death/new_death = DB_ENTITY(/datum/entity/statistic/death) var/datum/entity/player/player_entity = get_player_from_key(mind.ckey) if(player_entity) @@ -95,11 +99,8 @@ new_death.role_name = get_role_name() new_death.mob_name = real_name new_death.faction_name = faction - new_death.is_xeno = FALSE - - var/area/A = get_area(death_loc) - new_death.area_name = A.name + new_death.area_name = area.name new_death.cause_name = cause_data?.cause_name var/datum/entity/player/cause_player = get_player_from_key(cause_data?.ckey) @@ -132,8 +133,6 @@ new_death.total_damage_taken = life_damage_taken_total new_death.total_revives_done = life_revives_total - handle_observer_message(cause_data, cause_mob, death_loc, A) - if(round_statistics) round_statistics.track_death(new_death) From bfe6e4e0a94d2f9e7d593ef7f0eaca5d93ff29f6 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Tue, 24 Oct 2023 13:02:36 +0100 Subject: [PATCH 53/63] Automatic changelog for PR #4775 [ci skip] --- html/changelogs/AutoChangeLog-pr-4775.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4775.yml diff --git a/html/changelogs/AutoChangeLog-pr-4775.yml b/html/changelogs/AutoChangeLog-pr-4775.yml new file mode 100644 index 0000000000..c142696105 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4775.yml @@ -0,0 +1,4 @@ +author: "fira" +delete-after: True +changes: + - bugfix: "deadchat death messages should now display immediately rather than being delayed a couple seconds." \ No newline at end of file From 7cfbe6f482edd510dca8b2b363e32b4c8ea18482 Mon Sep 17 00:00:00 2001 From: fira Date: Tue, 24 Oct 2023 13:53:10 +0200 Subject: [PATCH 54/63] Fixes pounces targeting unliving on the landing turf (#4776) # About the pull request Fixes #1053 Stops pounce landing from scanning ghosts/holograms and targeting them in place of a living target. It was pretty obvious for Queen Eye but apparently seemed to actually happen with Ghosts aswell - since there was no message due to checks further down, it was overlooked # Explain why it's good for the game Invisible bugs aren't so fun # Changelog :cl: fix: Fixed Ghosts and Queen Eye occasionally "eating" pounces in place of a mob on the same turf. /:cl: --- code/modules/mob/living/carbon/xenomorph/XenoProcs.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm b/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm index fa9036bd83..3fd8e53024 100644 --- a/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm +++ b/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm @@ -357,8 +357,8 @@ /mob/living/carbon/xenomorph/proc/pounced_turf(turf/T) if(!T.density) - for(var/mob/M in T) - pounced_mob(M) + for(var/mob/living/mob in T) + pounced_mob(mob) break else turf_launch_collision(T) From 9bbd25e667934db3de0c1a3feeefb36461103739 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Tue, 24 Oct 2023 13:18:04 +0100 Subject: [PATCH 55/63] Automatic changelog for PR #4776 [ci skip] --- html/changelogs/AutoChangeLog-pr-4776.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4776.yml diff --git a/html/changelogs/AutoChangeLog-pr-4776.yml b/html/changelogs/AutoChangeLog-pr-4776.yml new file mode 100644 index 0000000000..0be7bf1080 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4776.yml @@ -0,0 +1,4 @@ +author: "fira" +delete-after: True +changes: + - bugfix: "Fixed Ghosts and Queen Eye occasionally \"eating\" pounces in place of a mob on the same turf." \ No newline at end of file From a1681d59bd2a5bcbff370186d2d4488bcd8f35a0 Mon Sep 17 00:00:00 2001 From: fira Date: Tue, 24 Oct 2023 13:53:50 +0200 Subject: [PATCH 56/63] Fixed Lagnchat Xeno offsets again, final edition i swear (#4771) # About the pull request Fixes for Xeno langchat offsets, AGAIN. My math keeps being wrong and failing under specific cases... It turns out it's a lot simpler than what i've been trying to do too. AGH! # Testing Photographs and Procedure I brought PROPER photos of PROPER testing which hopefully means that it's a PROPER fix this time ### CLF are not very good at briefings ![image](https://github.com/cmss13-devs/cmss13/assets/604624/ba9c96b3-1d86-4a9a-8a35-c486fad73bfe) ### Bad CLF but with megaphone ![image](https://github.com/cmss13-devs/cmss13/assets/604624/19ace90b-6b36-4470-a0e8-07897c640d01) ### Queen (icon_size=64) has joined the chat ![image](https://github.com/cmss13-devs/cmss13/assets/604624/02e88372-b881-4b21-866e-f9562e644ea5) ### Queen but offset by pixel_x ![image](https://github.com/cmss13-devs/cmss13/assets/604624/4319d02a-cf69-4f16-a5a1-01b2fcacaea7) # Changelog :cl: fix: Re-Re-Fixed Xeno Above Head Chat offsets, for real this time /:cl: --- code/datums/langchat/langchat.dm | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/code/datums/langchat/langchat.dm b/code/datums/langchat/langchat.dm index 3f00c26b6d..83b9be0ac0 100644 --- a/code/datums/langchat/langchat.dm +++ b/code/datums/langchat/langchat.dm @@ -47,6 +47,13 @@ M.client.images -= langchat_image langchat_listeners = null +/atom/proc/langchat_set_x_offset() + langchat_image.maptext_x = world.icon_size / 2 - langchat_image.maptext_width / 2 +/atom/movable/langchat_set_x_offset() + langchat_image.maptext_x = bound_width / 2 - langchat_image.maptext_width / 2 +/mob/langchat_set_x_offset() + langchat_image.maptext_x = icon_size / 2 - langchat_image.maptext_width / 2 + ///Creates the image if one does not exist, resets settings that are modified by speech procs. /atom/proc/langchat_make_image(override_color = null) if(!langchat_image) @@ -56,8 +63,8 @@ langchat_image.appearance_flags = NO_CLIENT_COLOR|KEEP_APART|RESET_COLOR|RESET_TRANSFORM langchat_image.maptext_y = langchat_height langchat_image.maptext_height = 64 - langchat_image.maptext_x = - world.icon_size - get_pixel_position_x(src, TRUE) langchat_image.maptext_y -= LANGCHAT_MESSAGE_POP_Y_SINK + langchat_set_x_offset() langchat_image.pixel_y = 0 langchat_image.alpha = 0 @@ -102,7 +109,7 @@ langchat_image.maptext = text_to_display langchat_image.maptext_width = LANGCHAT_WIDTH - langchat_image.maptext_x = - world.icon_size - get_pixel_position_x(src, TRUE) + langchat_set_x_offset() langchat_listeners = listeners for(var/mob/M in langchat_listeners) @@ -149,7 +156,7 @@ langchat_image.maptext = text_to_display langchat_image.maptext_width = LANGCHAT_WIDTH * 2 - langchat_image.maptext_x = - world.icon_size - get_pixel_position_x(src, TRUE) - LANGCHAT_WIDTH / 2 + langchat_set_x_offset() langchat_listeners = listeners for(var/mob/M in langchat_listeners) From 747b99c3bbc7b67f4df8e5f2a77c582bc4258df7 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Tue, 24 Oct 2023 13:32:52 +0100 Subject: [PATCH 57/63] Automatic changelog for PR #4771 [ci skip] --- html/changelogs/AutoChangeLog-pr-4771.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4771.yml diff --git a/html/changelogs/AutoChangeLog-pr-4771.yml b/html/changelogs/AutoChangeLog-pr-4771.yml new file mode 100644 index 0000000000..c0d2caca39 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4771.yml @@ -0,0 +1,4 @@ +author: "fira" +delete-after: True +changes: + - bugfix: "Re-Re-Fixed Xeno Above Head Chat offsets, for real this time" \ No newline at end of file From 990bd14115406bfbe8b1e5ffecee00ba7986681f Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 25 Oct 2023 01:08:03 +0000 Subject: [PATCH 58/63] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-4769.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4771.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4775.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4776.yml | 4 ---- html/changelogs/archive/2023-10.yml | 8 ++++++++ 5 files changed, 8 insertions(+), 16 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4769.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4771.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4775.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4776.yml diff --git a/html/changelogs/AutoChangeLog-pr-4769.yml b/html/changelogs/AutoChangeLog-pr-4769.yml deleted file mode 100644 index f91f0bc5b2..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4769.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "fira" -delete-after: True -changes: - - bugfix: "Fixed people talking in radios all the time. Finally some quiet." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4771.yml b/html/changelogs/AutoChangeLog-pr-4771.yml deleted file mode 100644 index c0d2caca39..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4771.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "fira" -delete-after: True -changes: - - bugfix: "Re-Re-Fixed Xeno Above Head Chat offsets, for real this time" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4775.yml b/html/changelogs/AutoChangeLog-pr-4775.yml deleted file mode 100644 index c142696105..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4775.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "fira" -delete-after: True -changes: - - bugfix: "deadchat death messages should now display immediately rather than being delayed a couple seconds." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4776.yml b/html/changelogs/AutoChangeLog-pr-4776.yml deleted file mode 100644 index 0be7bf1080..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4776.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "fira" -delete-after: True -changes: - - bugfix: "Fixed Ghosts and Queen Eye occasionally \"eating\" pounces in place of a mob on the same turf." \ No newline at end of file diff --git a/html/changelogs/archive/2023-10.yml b/html/changelogs/archive/2023-10.yml index 82d6376591..1cb7c4597d 100644 --- a/html/changelogs/archive/2023-10.yml +++ b/html/changelogs/archive/2023-10.yml @@ -359,3 +359,11 @@ 2023-10-24: Segrain: - bugfix: Slicing food once again works as intended. +2023-10-25: + fira: + - bugfix: Fixed Ghosts and Queen Eye occasionally "eating" pounces in place of a + mob on the same turf. + - bugfix: Re-Re-Fixed Xeno Above Head Chat offsets, for real this time + - bugfix: Fixed people talking in radios all the time. Finally some quiet. + - bugfix: deadchat death messages should now display immediately rather than being + delayed a couple seconds. From c6e17e22f9b76d6de7ec48fd41c2d6432c558874 Mon Sep 17 00:00:00 2001 From: 4hands44 <107715181+4hands44@users.noreply.github.com> Date: Wed, 25 Oct 2023 16:58:10 -0500 Subject: [PATCH 59/63] CO Vendor Tweaks (#4751) # About the pull request CO's only having one belt and satchel to choose from is weird and dumb. This PR seeks to Fix this by adding a variety of existing belts to the CO vendor, as well as touches the Weapon Vendor, by adding a variety attachments and equipment, to bring CO in line with SLs, IOs and other Field officer roles. # Explain why it's good for the game Gives COs more options for their loadouts # 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 more attachments, and belts to the CO arsenal. add: CO now has an Essentials Kit like other roles, containing his Designator, and other useful tools. add: Re-Adds Bridgecoat to some Officer Dress vendors. (Limited to CO(+) and XO currently.) del: Removed Laser Designator from CO spawn Preset. balance: CO can now vend welding Helmet visors. balance: Adds grenade packets to CO Vendor. /:cl: --------- Co-authored-by: Zonespace <41448081+Zonespace27@users.noreply.github.com> --- .../vendor_types/crew/commanding_officer.dm | 43 ++++++++++++++++--- code/modules/gear_presets/uscm_ship.dm | 7 +-- 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/code/game/machinery/vending/vendor_types/crew/commanding_officer.dm b/code/game/machinery/vending/vendor_types/crew/commanding_officer.dm index 830511ad4b..d7d49a8ae0 100644 --- a/code/game/machinery/vending/vendor_types/crew/commanding_officer.dm +++ b/code/game/machinery/vending/vendor_types/crew/commanding_officer.dm @@ -1,9 +1,9 @@ //------------GEAR VENDOR--------------- GLOBAL_LIST_INIT(cm_vending_gear_commanding_officer, list( - list("COMMANDING OFFICER'S PRIMARY (CHOOSE 1)", 0, null, null, null), - list("M46C pulse rifle", 0, /obj/effect/essentials_set/co/riflepreset, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_MANDATORY), - list("M56C Smartgun", 0, /obj/item/storage/box/m56c_system, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_MANDATORY), + list("COMMANDER'S PRIMARY (CHOOSE 1)", 0, null, null, null), + list("M46C Pulse Rifle", 0, /obj/effect/essentials_set/co/riflepreset, MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_MANDATORY), + list("M56C Smartgun", 0, /obj/item/storage/box/m56c_system, MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_MANDATORY), list("PRIMARY AMMUNITION", 0, null, null, null), list("M41A MK1 Magazine", 30, /obj/item/ammo_magazine/rifle/m41aMK1, null, VENDOR_ITEM_RECOMMENDED), @@ -28,11 +28,19 @@ GLOBAL_LIST_INIT(cm_vending_gear_commanding_officer, list( list("M41A Rubber Shot Magazine", 10, /obj/item/ammo_magazine/rifle/rubber, null, VENDOR_ITEM_REGULAR), list("Beanbag Slugs", 10, /obj/item/ammo_magazine/shotgun/beanbag, null, VENDOR_ITEM_REGULAR), + list("EXPLOSIVES", 0, null, null, null), + list("HEDP Grenade Pack", 15, /obj/item/storage/box/packet/high_explosive, null, VENDOR_ITEM_REGULAR), + list("HEFA Grenade Pack", 15, /obj/item/storage/box/packet/hefa, null, VENDOR_ITEM_REGULAR), + list("WP Grenade Pack", 15, /obj/item/storage/box/packet/phosphorus, null, VENDOR_ITEM_REGULAR), + list("RAIL ATTACHMENTS", 0, null, null, null), list("Red-Dot Sight", 15, /obj/item/attachable/reddot, null, VENDOR_ITEM_REGULAR), list("Reflex Sight", 15, /obj/item/attachable/reflex, null, VENDOR_ITEM_REGULAR), list("S4 2x Telescopic Mini-Scope", 15, /obj/item/attachable/scope/mini, null, VENDOR_ITEM_REGULAR), + list("Helmet Visors", 0, null, null, null), + list("Welding Visor", 5, /obj/item/device/helmet_visor/welding_visor, null, VENDOR_ITEM_RECOMMENDED), + list("UNDERBARREL ATTACHMENTS", 0, null, null, null), list("Laser Sight", 15, /obj/item/attachable/lasersight, null, VENDOR_ITEM_REGULAR), list("Angled Grip", 15, /obj/item/attachable/angledgrip, null, VENDOR_ITEM_REGULAR), @@ -40,12 +48,13 @@ GLOBAL_LIST_INIT(cm_vending_gear_commanding_officer, list( list("Underbarrel Shotgun", 15, /obj/item/attachable/attached_gun/shotgun, null, VENDOR_ITEM_REGULAR), list("Underbarrel Extinguisher", 15, /obj/item/attachable/attached_gun/extinguisher, null, VENDOR_ITEM_REGULAR), list("Underbarrel Flamethrower", 15, /obj/item/attachable/attached_gun/flamer, null, VENDOR_ITEM_REGULAR), + list("Underbarrel Grenade Launcher", 5, /obj/item/attachable/attached_gun/grenade, null, VENDOR_ITEM_REGULAR), list("BARREL ATTACHMENTS", 0, null, null, null), - list("Suppressor", 15, /obj/item/attachable/suppressor, null, VENDOR_ITEM_REGULAR), list("Extended Barrel", 15, /obj/item/attachable/extended_barrel, null, VENDOR_ITEM_REGULAR), list("Recoil Compensator", 15, /obj/item/attachable/compensator, null, VENDOR_ITEM_REGULAR), - )) + list("Suppressor", 15, /obj/item/attachable/suppressor, null, VENDOR_ITEM_REGULAR), + )) /obj/structure/machinery/cm_vending/gear/commanding_officer name = "\improper ColMarTech Commanding Officer Weapon Rack" @@ -63,9 +72,15 @@ GLOBAL_LIST_INIT(cm_vending_gear_commanding_officer, list( GLOBAL_LIST_INIT(cm_vending_clothing_commanding_officer, list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), list("Headset", 0, /obj/item/device/radio/headset/almayer/mcom/cdrcom, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), - list("Satchel", 0, /obj/item/storage/backpack/satchel/lockable, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_MANDATORY), list("MRE", 0, /obj/item/storage/box/MRE, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), + list("COMMANDING OFFICER ESSENTIALS KIT (TAKE ALL)", 0, null, null, null), + list("Commanding Officer Essentials Kit", 0, /obj/effect/essentials_set/commanding_officer, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_MANDATORY), + + list("BAGS (CHOOSE 1)", 0, null, null, null), + list("Commanding Officer Backpack", 0, /obj/item/storage/backpack/mcommander, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_MANDATORY), + list("Secure Satchel", 0, /obj/item/storage/backpack/satchel/lockable, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_MANDATORY), + list("COMBAT EQUIPMENT (TAKE ALL)", 0, null, null, null), list("Commanding Officer's M3 Armor", 0, /obj/item/clothing/suit/storage/marine/MP/CO, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), list("Commanding Officer's M10 Helmet", 0, /obj/item/clothing/head/helmet/marine/CO, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_MANDATORY), @@ -84,8 +99,13 @@ GLOBAL_LIST_INIT(cm_vending_clothing_commanding_officer, list( list("Medical HUD Glasses", 0, /obj/item/clothing/glasses/hud/health, MARINE_CAN_BUY_GLASSES, VENDOR_ITEM_RECOMMENDED), list("Security HUD Glasses", 0, /obj/item/clothing/glasses/sunglasses/sechud, MARINE_CAN_BUY_GLASSES, VENDOR_ITEM_REGULAR), - list("BELTS (TAKE ALL)", 0, null, null, null), + list("BELTS (CHOOSE 1)", 0, null, null, null), list("G8-A General Utility Pouch", 0, /obj/item/storage/backpack/general_belt, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("Military Police Belt", 0, /obj/item/storage/belt/security/MP/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("M276 Medical Storage Rig", 0, /obj/item/storage/belt/medical/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("M276 Ammo Load Rig", 0, /obj/item/storage/belt/marine, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("M276 Holster Toolrig", 0, /obj/item/storage/belt/gun/utility/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("M276 M82F Holster Rig", 0, /obj/item/storage/belt/gun/flaregun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("POUCHES (CHOOSE 2)", 0, null, null, null), list("First-Aid Pouch (Refillable Injectors)", 0, /obj/item/storage/pouch/firstaid/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), @@ -110,6 +130,15 @@ GLOBAL_LIST_INIT(cm_vending_clothing_commanding_officer, list( /obj/structure/machinery/cm_vending/clothing/commanding_officer/get_listed_products(mob/user) return GLOB.cm_vending_clothing_commanding_officer +/obj/effect/essentials_set/commanding_officer + spawned_gear_list = list( + /obj/item/device/binoculars/range/designator, + /obj/item/map/current_map, + /obj/item/device/whistle, + /obj/item/weapon/gun/energy/taser, + /obj/item/device/megaphone, + ) + // This gets around the COs' weapon not spawning without incendiary mag. /obj/effect/essentials_set/co/riflepreset spawned_gear_list = list( diff --git a/code/modules/gear_presets/uscm_ship.dm b/code/modules/gear_presets/uscm_ship.dm index 4c383cfed6..5ea860b05e 100644 --- a/code/modules/gear_presets/uscm_ship.dm +++ b/code/modules/gear_presets/uscm_ship.dm @@ -417,7 +417,7 @@ dress_extra = list(/obj/item/storage/large_holster/ceremonial_sword/full) dress_hat = list(/obj/item/clothing/head/marine/peaked/captain/white, /obj/item/clothing/head/marine/peaked/captain/black, /obj/item/clothing/head/marine/peaked) dress_shoes = list(/obj/item/clothing/shoes/dress/commander) - dress_over = list(/obj/item/clothing/suit/storage/jacket/marine/dress/officer/white, /obj/item/clothing/suit/storage/jacket/marine/dress/officer/black, /obj/item/clothing/suit/storage/jacket/marine/dress/officer/suit, /obj/item/clothing/suit/storage/jacket/marine/dress) + dress_over = list(/obj/item/clothing/suit/storage/jacket/marine/dress/officer/white, /obj/item/clothing/suit/storage/jacket/marine/dress/officer/black, /obj/item/clothing/suit/storage/jacket/marine/dress/officer/suit, /obj/item/clothing/suit/storage/jacket/marine/dress, /obj/item/clothing/suit/storage/jacket/marine/dress/bridge_coat_grey, ) /datum/equipment_preset/uscm_ship/commander/New() . = ..() @@ -458,7 +458,6 @@ new_human.equip_to_slot_or_del(new back_item(new_human), WEAR_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/general/large(new_human), WEAR_R_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/pistol/command(new_human), WEAR_L_STORE) - new_human.equip_to_slot_or_del(new /obj/item/device/binoculars/range/designator(new_human), WEAR_L_HAND) if(kit) new_human.equip_to_slot_or_del(new kit(new_human), WEAR_IN_BACK) @@ -479,6 +478,8 @@ /obj/item/clothing/suit/storage/jacket/marine/dress/officer/black, /obj/item/clothing/suit/storage/jacket/marine/dress/officer/suit, /obj/item/clothing/suit/storage/jacket/marine/dress/officer/falcon, + /obj/item/clothing/suit/storage/jacket/marine/dress/bridge_coat_grey, + /obj/item/clothing/suit/storage/jacket/marine/dress/bridge_coat, ) /datum/equipment_preset/uscm_ship/commander/council/load_gear(mob/living/carbon/human/new_human) @@ -512,7 +513,7 @@ minimap_icon = list("cic" = MINIMAP_ICON_COLOR_HEAD) minimap_background = MINIMAP_ICON_BACKGROUND_CIC - dress_extra = list(/obj/item/storage/large_holster/ceremonial_sword/full) + dress_extra = list(/obj/item/storage/large_holster/ceremonial_sword/full, /obj/item/clothing/suit/storage/jacket/marine/dress/bridge_coat_grey,) /datum/equipment_preset/uscm_ship/xo/New() . = ..() From 9ad1550bb2d387746c3a1d734df9253b467fc7b6 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 25 Oct 2023 23:11:11 +0100 Subject: [PATCH 60/63] Automatic changelog for PR #4751 [ci skip] --- html/changelogs/AutoChangeLog-pr-4751.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4751.yml diff --git a/html/changelogs/AutoChangeLog-pr-4751.yml b/html/changelogs/AutoChangeLog-pr-4751.yml new file mode 100644 index 0000000000..876d9b32a5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4751.yml @@ -0,0 +1,9 @@ +author: "4hands44" +delete-after: True +changes: + - rscadd: "Added more attachments, and belts to the CO arsenal." + - rscadd: "CO now has an Essentials Kit like other roles, containing his Designator, and other useful tools." + - rscadd: "Re-Adds Bridgecoat to some Officer Dress vendors. (Limited to CO(+) and XO currently.)" + - rscdel: "Removed Laser Designator from CO spawn Preset." + - balance: "CO can now vend welding Helmet visors." + - balance: "Adds grenade packets to CO Vendor." \ No newline at end of file From dec69dd6e3bda50216cd5669c0e37ffcf87caade Mon Sep 17 00:00:00 2001 From: Paladina <82751385+XDinka@users.noreply.github.com> Date: Thu, 26 Oct 2023 04:23:59 +0500 Subject: [PATCH 61/63] 4 New Haircuts (#4728) # About the pull request ## Some new haicuts Looking at the current sheet it occurred to me to add a few current popular hairstyles that have passed the community evaluation. It's a bit hard for me to write text and descriptions due to my poor language skills, but I'll try to describe as much as I can. # Explain why it's good for the game First of all, playing on the server we try to associate ourselves with the character, try to be in his skin. His appearance plays an important role. A couple of beautiful hairstyles will please the eye of players and add a little more variety # Photographs
Screenshots & Videos ## Gentle Ponytail ![image](https://github.com/cmss13-devs/cmss13/assets/82751385/340409c0-28ac-494b-935e-b21eed177468) ![hair_gentleponytail](https://github.com/cmss13-devs/cmss13/assets/82751385/f58b4fe0-3bb4-41be-b016-77edfa26b22e) ## Edgar haircut ![image](https://github.com/cmss13-devs/cmss13/assets/82751385/69020adb-bc87-4f68-9f56-e3334bf5b741) ![hair_edgar](https://github.com/cmss13-devs/cmss13/assets/82751385/c0477be4-f10c-4622-a496-b3d405631df3) ## Emo Bun ![image](https://github.com/cmss13-devs/cmss13/assets/82751385/605352c2-c35c-49da-bbc1-2dbf472fde44) ![hair_emobun](https://github.com/cmss13-devs/cmss13/assets/82751385/93432acf-2116-403e-9cc7-7ffd772fb6b0) ## Taper haircut ![image](https://github.com/cmss13-devs/cmss13/assets/82751385/18378922-f72b-4060-b66d-b3aae4e16a23) ![hair_taper](https://github.com/cmss13-devs/cmss13/assets/82751385/15e72936-c981-4e0e-9834-ac0f4740c605)
# Changelog :cl: XDinka add: Added four new haircuts: gentle ponytail, edgar haircut, emo bun, taper haircut. /:cl: --- .../mob/new_player/sprite_accessories/hair.dm | 17 +++++++++++++++++ icons/mob/humans/human_hair.dmi | Bin 49242 -> 58422 bytes 2 files changed, 17 insertions(+) diff --git a/code/modules/mob/new_player/sprite_accessories/hair.dm b/code/modules/mob/new_player/sprite_accessories/hair.dm index 3f624b8d3b..3dfe8bebd5 100644 --- a/code/modules/mob/new_player/sprite_accessories/hair.dm +++ b/code/modules/mob/new_player/sprite_accessories/hair.dm @@ -738,3 +738,20 @@ /datum/sprite_accessory/hair/aviator name = "Aviator" icon_state = "hair_aviator" + +/datum/sprite_accessory/hair/gantleponytail + name = "Gentle Ponytail" + icon_state = "hair_gantleponytail" + gender = FEMALE + +/datum/sprite_accessory/hair/edgar + name = "Edgar" + icon_state = "hair_edgar" + +/datum/sprite_accessory/hair/emobun + name = "Emo Little Bun" + icon_state = "hair_emobun" + +/datum/sprite_accessory/hair/taper + name = "Taper" + icon_state = "hair_taper" diff --git a/icons/mob/humans/human_hair.dmi b/icons/mob/humans/human_hair.dmi index ca4a20bcafbdfa02a53cfac18801df9dc668f62b..9634a2543aa44fc25120de838b04a53ecabc5e67 100644 GIT binary patch literal 58422 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≫L?RJOaCcsca($ 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 z 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 VJcpL@r=rKcXl8Y;#Pr6){{!?c|62e6 From 7ef46d06198935b5c98f44ec5949b2d8e5f081a4 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Thu, 26 Oct 2023 00:32:52 +0100 Subject: [PATCH 62/63] Automatic changelog for PR #4728 [ci skip] --- html/changelogs/AutoChangeLog-pr-4728.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4728.yml diff --git a/html/changelogs/AutoChangeLog-pr-4728.yml b/html/changelogs/AutoChangeLog-pr-4728.yml new file mode 100644 index 0000000000..9eac7be429 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4728.yml @@ -0,0 +1,4 @@ +author: "XDinka" +delete-after: True +changes: + - rscadd: "Added four new haircuts: gentle ponytail, edgar haircut, emo bun, taper haircut." \ No newline at end of file From c590d113d8a0f804f3952f042c3cab153ebd0fe4 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Thu, 26 Oct 2023 01:06:41 +0000 Subject: [PATCH 63/63] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-4728.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4751.yml | 9 --------- html/changelogs/archive/2023-10.yml | 13 +++++++++++++ 3 files changed, 13 insertions(+), 13 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4728.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4751.yml diff --git a/html/changelogs/AutoChangeLog-pr-4728.yml b/html/changelogs/AutoChangeLog-pr-4728.yml deleted file mode 100644 index 9eac7be429..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4728.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "XDinka" -delete-after: True -changes: - - rscadd: "Added four new haircuts: gentle ponytail, edgar haircut, emo bun, taper haircut." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4751.yml b/html/changelogs/AutoChangeLog-pr-4751.yml deleted file mode 100644 index 876d9b32a5..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4751.yml +++ /dev/null @@ -1,9 +0,0 @@ -author: "4hands44" -delete-after: True -changes: - - rscadd: "Added more attachments, and belts to the CO arsenal." - - rscadd: "CO now has an Essentials Kit like other roles, containing his Designator, and other useful tools." - - rscadd: "Re-Adds Bridgecoat to some Officer Dress vendors. (Limited to CO(+) and XO currently.)" - - rscdel: "Removed Laser Designator from CO spawn Preset." - - balance: "CO can now vend welding Helmet visors." - - balance: "Adds grenade packets to CO Vendor." \ No newline at end of file diff --git a/html/changelogs/archive/2023-10.yml b/html/changelogs/archive/2023-10.yml index 1cb7c4597d..fb4ed664fd 100644 --- a/html/changelogs/archive/2023-10.yml +++ b/html/changelogs/archive/2023-10.yml @@ -367,3 +367,16 @@ - bugfix: Fixed people talking in radios all the time. Finally some quiet. - bugfix: deadchat death messages should now display immediately rather than being delayed a couple seconds. +2023-10-26: + 4hands44: + - rscadd: Added more attachments, and belts to the CO arsenal. + - rscadd: CO now has an Essentials Kit like other roles, containing his Designator, + and other useful tools. + - rscadd: Re-Adds Bridgecoat to some Officer Dress vendors. (Limited to CO(+) and + XO currently.) + - rscdel: Removed Laser Designator from CO spawn Preset. + - balance: CO can now vend welding Helmet visors. + - balance: Adds grenade packets to CO Vendor. + XDinka: + - rscadd: 'Added four new haircuts: gentle ponytail, edgar haircut, emo bun, taper + haircut.'
Extras
Emergency Response TeamEmergency Response TeamSurvivorSurvivorAgentAgent