From a48f0364283526637b637542b432d91593b2bdf5 Mon Sep 17 00:00:00 2001 From: QuickLode <63271983+QuickLode@users.noreply.github.com> Date: Thu, 6 Jul 2023 18:25:45 -0700 Subject: [PATCH 01/21] Colony Synthetics have less resistance but are faster. (#3821) # About the pull request While exploring reasons why this role was underplayed one of the things that came up was its speed. It is dreadfully slow - to the point where defenders are able to force an engagement against Synthetics. There is no chance to run from anything faster as a Colony Synthetic. Making it have to fight often. Lowering the resistance is something devs wanted, and for gameplay this is good because a Synthetic shouldn't be forced into a fight unless they have no other option. Especially not by something as slow as a defender. Might tweak later but council generally is in agreement with this change. Little by little! For the CQC, a Colony Synthetic is not as advanced as a Shipside one, but still is more than capable of outmanuevering a human. As for the hilarious UPP Pvt being better than a Colony Synth in CQC I will make a separate PR For Fireman, a Synthetic can bend metal, move cars and do many other 'superhuman' feats of stength, they should not struggle at carrying people, especially shouldn't be worse at carrying people than a Marine. It's from 1 to 3, to represent the strength yet aging capabilities of the Colony Synthetic. @morrowwolf forgot this one - doesn't touch WJ # Explain why it's good for the game Less resistance is something devs wanted. Allows Colony Synthetics an option to avoid certain engagements as now they are able to outrun some types of Xenomorphs off-weeds. Defenders should not be able to catch them offweeds. A Synthetic should have no problem carrying something as light as a human being - they especially should not have MORE trouble carrying someone than your standard human doctor. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: QuickLoad balance: Colony Synthetics are faster but are less resistant. This allows for the option of avoiding engagements. balance: Colony Synthetics have slightly better CQC and can carry people better. /:cl: --- code/datums/skills.dm | 4 ++-- code/modules/mob/living/carbon/human/species/synthetic.dm | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/code/datums/skills.dm b/code/datums/skills.dm index ef86b726a3c1..16a2a20a57fd 100644 --- a/code/datums/skills.dm +++ b/code/datums/skills.dm @@ -851,7 +851,7 @@ SYNTHETIC /datum/skills/colonial_synthetic name = SYNTH_COLONY skills = list( - SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_CQC = SKILL_CQC_EXPERT, SKILL_ENGINEER = SKILL_ENGINEER_ENGI, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, @@ -862,7 +862,7 @@ SYNTHETIC SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, SKILL_PILOT = SKILL_PILOT_EXPERT, SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, + SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, SKILL_VEHICLE = SKILL_VEHICLE_LARGE, SKILL_JTAC = SKILL_JTAC_BEGINNER, diff --git a/code/modules/mob/living/carbon/human/species/synthetic.dm b/code/modules/mob/living/carbon/human/species/synthetic.dm index bdd0a994ed49..37654d0fa46c 100644 --- a/code/modules/mob/living/carbon/human/species/synthetic.dm +++ b/code/modules/mob/living/carbon/human/species/synthetic.dm @@ -75,12 +75,12 @@ name = SYNTH_COLONY name_plural = "Colonial Synthetics" uses_ethnicity = TRUE - burn_mod = 0.65 // made for hazardous environments, withstanding temperatures up to 1210 degrees + burn_mod = 0.8 mob_inherent_traits = list(TRAIT_SUPER_STRONG) pain_type = /datum/pain/synthetic/colonial rarity_value = 1.5 - slowdown = 0.45 + slowdown = 0.2 total_health = 200 //But more durable default_lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE @@ -110,8 +110,10 @@ name = SYNTH_WORKING_JOE name_plural = "Working Joes" uses_ethnicity = FALSE + burn_mod = 0.65 // made for hazardous environments, withstanding temperatures up to 1210 degrees mob_inherent_traits = list(TRAIT_SUPER_STRONG, TRAIT_INTENT_EYES, TRAIT_EMOTE_CD_EXEMPT) + slowdown = 0.45 hair_color = "#000000" icobase = 'icons/mob/humans/species/r_synthetic.dmi' deform = 'icons/mob/humans/species/r_synthetic.dmi' From 3ab12e12ec2d921701cc3cbc10c08d167107d3c8 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 7 Jul 2023 02:34:50 +0100 Subject: [PATCH 02/21] Automatic changelog for PR #3821 [ci skip] --- html/changelogs/AutoChangeLog-pr-3821.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3821.yml diff --git a/html/changelogs/AutoChangeLog-pr-3821.yml b/html/changelogs/AutoChangeLog-pr-3821.yml new file mode 100644 index 000000000000..cee76fee05c6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3821.yml @@ -0,0 +1,5 @@ +author: "QuickLoad" +delete-after: True +changes: + - balance: "Colony Synthetics are faster but are less resistant. This allows for the option of avoiding engagements." + - balance: "Colony Synthetics have slightly better CQC and can carry people better." \ No newline at end of file From a685b43dca72d637aa0e9d8e3dd4a619cb00a6ec Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 7 Jul 2023 01:46:49 +0000 Subject: [PATCH 03/21] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-3670.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3750.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3799.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3800.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3805.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3806.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3815.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3821.yml | 5 ----- html/changelogs/archive/2023-07.yml | 17 +++++++++++++++++ 9 files changed, 17 insertions(+), 33 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-3670.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3750.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3799.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3800.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3805.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3806.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3815.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3821.yml diff --git a/html/changelogs/AutoChangeLog-pr-3670.yml b/html/changelogs/AutoChangeLog-pr-3670.yml deleted file mode 100644 index fc4244e89668..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3670.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Morrow" -delete-after: True -changes: - - bugfix: "Burnt matches no longer permanently give you a light source if they naturally burn out" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-3750.yml b/html/changelogs/AutoChangeLog-pr-3750.yml deleted file mode 100644 index 5214ac3ea196..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3750.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Diegoflores31" -delete-after: True -changes: - - rscadd: "Defender Tail Slam has a 1% chance to do a BONK sound instead." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-3799.yml b/html/changelogs/AutoChangeLog-pr-3799.yml deleted file mode 100644 index 14b82028f334..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3799.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Morrow" -delete-after: True -changes: - - rscadd: "Added a visiting USASF Commander (CO survivor) to New Varadero" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-3800.yml b/html/changelogs/AutoChangeLog-pr-3800.yml deleted file mode 100644 index 254b8119f4dc..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3800.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Morrow" -delete-after: True -changes: - - rscdel: "Removes fountain pens from gear sets" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-3805.yml b/html/changelogs/AutoChangeLog-pr-3805.yml deleted file mode 100644 index ad481ab325af..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3805.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Drathek" -delete-after: True -changes: - - bugfix: "Fixed ghost icons for larva and ovi queen" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-3806.yml b/html/changelogs/AutoChangeLog-pr-3806.yml deleted file mode 100644 index 878e2fb11f7b..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3806.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Morrow" -delete-after: True -changes: - - rscdel: "Removed nesting the dead" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-3815.yml b/html/changelogs/AutoChangeLog-pr-3815.yml deleted file mode 100644 index 2de42a50c8f2..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3815.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "realforest2001" -delete-after: True -changes: - - bugfix: "Fixes Queen making footstep sounds while dead and being dragged." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-3821.yml b/html/changelogs/AutoChangeLog-pr-3821.yml deleted file mode 100644 index cee76fee05c6..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3821.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "QuickLoad" -delete-after: True -changes: - - balance: "Colony Synthetics are faster but are less resistant. This allows for the option of avoiding engagements." - - balance: "Colony Synthetics have slightly better CQC and can carry people better." \ No newline at end of file diff --git a/html/changelogs/archive/2023-07.yml b/html/changelogs/archive/2023-07.yml index c85f10798cf7..204efe627173 100644 --- a/html/changelogs/archive/2023-07.yml +++ b/html/changelogs/archive/2023-07.yml @@ -74,3 +74,20 @@ - admin: Adds logs for bioscans successfully completing. thatoneyeeter: - balance: metal foam now becomes solid faster +2023-07-07: + Diegoflores31: + - rscadd: Defender Tail Slam has a 1% chance to do a BONK sound instead. + Drathek: + - bugfix: Fixed ghost icons for larva and ovi queen + Morrow: + - rscdel: Removes fountain pens from gear sets + - rscdel: Removed nesting the dead + - rscadd: Added a visiting USASF Commander (CO survivor) to New Varadero + - bugfix: Burnt matches no longer permanently give you a light source if they naturally + burn out + QuickLoad: + - balance: Colony Synthetics are faster but are less resistant. This allows for + the option of avoiding engagements. + - balance: Colony Synthetics have slightly better CQC and can carry people better. + realforest2001: + - bugfix: Fixes Queen making footstep sounds while dead and being dragged. From d553fe655def2108124275142df25ba999587fd5 Mon Sep 17 00:00:00 2001 From: spartanbobby <71467726+spartanbobby@users.noreply.github.com> Date: Fri, 7 Jul 2023 02:26:08 +0100 Subject: [PATCH 04/21] Gives the M4A3 service pistol the correct lore accurate magazine size (#3808) # About the pull request This PR changes the M4A3 magazine size from 9 to 12 # Explain why it's good for the game https://i.imgur.com/fefeBtF.png # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: SpartanBobby balance: changes M4A3 magazine size from 9 to 12 /:cl: --- code/modules/projectiles/magazines/pistols.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/projectiles/magazines/pistols.dm b/code/modules/projectiles/magazines/pistols.dm index 16090d9f2b81..317124955cbc 100644 --- a/code/modules/projectiles/magazines/pistols.dm +++ b/code/modules/projectiles/magazines/pistols.dm @@ -8,7 +8,7 @@ caliber = "9mm" icon = 'icons/obj/items/weapons/guns/ammo_by_faction/uscm.dmi' icon_state = "m4a3" - max_rounds = 9 + max_rounds = 12 w_class = SIZE_SMALL default_ammo = /datum/ammo/bullet/pistol gun_type = /obj/item/weapon/gun/pistol/m4a3 From d8daff5cd38c9e12c612c7b66d59d3a6ad2d261b Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 7 Jul 2023 03:00:05 +0100 Subject: [PATCH 05/21] Automatic changelog for PR #3808 [ci skip] --- html/changelogs/AutoChangeLog-pr-3808.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3808.yml diff --git a/html/changelogs/AutoChangeLog-pr-3808.yml b/html/changelogs/AutoChangeLog-pr-3808.yml new file mode 100644 index 000000000000..d9494a1d7f8a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3808.yml @@ -0,0 +1,4 @@ +author: "SpartanBobby" +delete-after: True +changes: + - balance: "changes M4A3 magazine size from 9 to 12" \ No newline at end of file From 297d2a9ad30ced4bb916c1cbfed64af1af6f338f Mon Sep 17 00:00:00 2001 From: Zonespace <41448081+Zonespace27@users.noreply.github.com> Date: Fri, 7 Jul 2023 03:28:23 +0200 Subject: [PATCH 06/21] Fixes some tool checks (#3813) # About the pull request Converts some istype checks into tool trait checks # Explain why it's good for the game So stuff like maint jacks work properly. # Changelog :cl: fix: The maintenance jack should work a little better at crowbarring things. /:cl: --------- Co-authored-by: John Doe --- code/game/machinery/autolathe.dm | 2 +- code/game/machinery/computer/ai_core.dm | 6 +++--- code/game/machinery/computer/buildandrepair.dm | 4 ++-- code/game/machinery/constructable_frame.dm | 2 +- code/game/machinery/doors/windowdoor.dm | 2 +- code/game/machinery/telecomms/machine_interactions.dm | 2 +- code/game/objects/items/tools/maintenance_tools.dm | 4 +--- code/game/objects/structures/props.dm | 4 ++-- code/game/objects/structures/watercloset.dm | 2 +- code/game/turfs/floor.dm | 2 +- code/modules/power/port_gen.dm | 2 +- 11 files changed, 15 insertions(+), 17 deletions(-) diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 7a10a3ffa1df..6ccb0b5b18f7 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -284,7 +284,7 @@ return //Dismantle the frame. - if(istype(O, /obj/item/tool/crowbar)) + if(HAS_TRAIT(O, TRAIT_TOOL_CROWBAR)) dismantle() return diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm index fd246d2d640a..bb6972a58ac3 100644 --- a/code/game/machinery/computer/ai_core.dm +++ b/code/game/machinery/computer/ai_core.dm @@ -51,7 +51,7 @@ to_chat(user, SPAN_NOTICE(" You screw the circuit board into place.")) state = 2 icon_state = "2" - if(istype(P, /obj/item/tool/crowbar) && circuit) + if(HAS_TRAIT(P, TRAIT_TOOL_CROWBAR) && circuit) playsound(loc, 'sound/items/Crowbar.ogg', 25, 1) to_chat(user, SPAN_NOTICE(" You remove the circuit board.")) state = 1 @@ -121,7 +121,7 @@ to_chat(usr, "Added [mmi].") icon_state = "3b" - if(istype(P, /obj/item/tool/crowbar) && brain) + if(HAS_TRAIT(P, TRAIT_TOOL_CROWBAR) && brain) playsound(loc, 'sound/items/Crowbar.ogg', 25, 1) to_chat(user, SPAN_NOTICE(" You remove the brain.")) brain.forceMove(loc) @@ -129,7 +129,7 @@ icon_state = "3" if(4) - if(istype(P, /obj/item/tool/crowbar)) + if(HAS_TRAIT(P, TRAIT_TOOL_CROWBAR)) playsound(loc, 'sound/items/Crowbar.ogg', 25, 1) to_chat(user, SPAN_NOTICE(" You remove the glass panel.")) state = 3 diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index bd42b31ea573..07c960807205 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -52,7 +52,7 @@ to_chat(user, SPAN_NOTICE(" You screw the circuit board into place.")) src.state = 2 src.icon_state = "2" - if(istype(P, /obj/item/tool/crowbar) && circuit) + if(HAS_TRAIT(P, TRAIT_TOOL_CROWBAR) && circuit) playsound(src.loc, 'sound/items/Crowbar.ogg', 25, 1) to_chat(user, SPAN_NOTICE(" You remove the circuit board.")) src.state = 1 @@ -99,7 +99,7 @@ src.state = 4 src.icon_state = "4" if(4) - if(istype(P, /obj/item/tool/crowbar)) + if(HAS_TRAIT(P, TRAIT_TOOL_CROWBAR)) playsound(src.loc, 'sound/items/Crowbar.ogg', 25, 1) to_chat(user, SPAN_NOTICE(" You remove the glass panel.")) src.state = 3 diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 0288b7eb2426..357ef48fff37 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -114,7 +114,7 @@ A.amount = 5 if(CONSTRUCTION_STATE_FINISHED) - if(istype(P, /obj/item/tool/crowbar)) + if(HAS_TRAIT(P, TRAIT_TOOL_CROWBAR)) if(!skillcheck(user, SKILL_ENGINEER, required_dismantle_skill)) to_chat(user, SPAN_WARNING("You are not trained to dismantle machines...")) return diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 6d96daf3152f..e9006a9f2fb4 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -167,7 +167,7 @@ return //If it's emagged, crowbar can pry electronics out. - if (src.operating == -1 && istype(I, /obj/item/tool/crowbar)) + if (src.operating == -1 && HAS_TRAIT(I, TRAIT_TOOL_CROWBAR)) playsound(src.loc, 'sound/items/Crowbar.ogg', 25, 1) user.visible_message("[user] removes the electronics from the windoor.", "You start to remove electronics from the windoor.") if (do_after(user, 40, INTERRUPT_ALL, BUSY_ICON_BUILD)) diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index cded8a1148c7..a370356ad60b 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -62,7 +62,7 @@ stat &= ~BROKEN // the machine's not borked anymore! else to_chat(user, SPAN_WARNING("You need five coils of wire for this.")) - if(istype(P, /obj/item/tool/crowbar)) + if(HAS_TRAIT(P, TRAIT_TOOL_CROWBAR)) to_chat(user, "You begin prying out the circuit board other components...") playsound(src.loc, 'sound/items/Crowbar.ogg', 25, 1) if(do_after(user, 60 * user.get_skill_duration_multiplier(SKILL_ENGINEER), INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) diff --git a/code/game/objects/items/tools/maintenance_tools.dm b/code/game/objects/items/tools/maintenance_tools.dm index 25bcefc1cc34..2560c5ff91e8 100644 --- a/code/game/objects/items/tools/maintenance_tools.dm +++ b/code/game/objects/items/tools/maintenance_tools.dm @@ -557,8 +557,6 @@ if(attacked_door.locked) //Bolted to_chat(user, SPAN_DANGER("You can't pry open [attacked_door] while it is bolted shut.")) return - if(!attacked_door.arePowerSystemsOn()) //Opens like normal if unpowered - return FALSE if(requires_superstrength_pry) if(!HAS_TRAIT(user, TRAIT_SUPER_STRONG)) //basically IS_PRY_CAPABLE_CROWBAR @@ -645,7 +643,7 @@ resin_door.Open() return - if(istype(attacked_obj, /turf/open/floor)) + else if(istype(attacked_obj, /turf/open/floor)) var/turf/open/floor/flooring = attacked_obj if(crowbar_mode && user.a_intent == INTENT_HELP) //Only pry flooring on help intent diff --git a/code/game/objects/structures/props.dm b/code/game/objects/structures/props.dm index f6905d4d044d..1a91650c620a 100644 --- a/code/game/objects/structures/props.dm +++ b/code/game/objects/structures/props.dm @@ -24,7 +24,7 @@ . = ..() if(isxeno(user)) return - else if (ishuman(user) && istype(W, /obj/item/tool/wrench)) + else if (ishuman(user) && HAS_TRAIT(W, TRAIT_TOOL_WRENCH)) on = !on visible_message("You wrench the controls of \the [src]. The drill jumps to life." , "[user] wrenches the controls of \the [src]. The drill jumps to life.") @@ -501,7 +501,7 @@ . = ..() if(isxeno(user)) return - else if (ishuman(user) && istype(W, /obj/item/tool/crowbar)) + else if (ishuman(user) && HAS_TRAIT(W, TRAIT_TOOL_CROWBAR)) on = !on visible_message("You pry at the control valve on [src]. The machine shudders." , "[user] pries at the control valve on [src]. The entire machine shudders.") diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 5c084ce94cbc..cccc1211bfb0 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -121,7 +121,7 @@ cistern_overlay.icon_state = "cistern[cistern]" /obj/structure/toilet/attackby(obj/item/I, mob/living/user) - if(istype(I, /obj/item/tool/crowbar)) + if(HAS_TRAIT(I, TRAIT_TOOL_CROWBAR)) to_chat(user, SPAN_NOTICE("You start to [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"].")) playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 25, 1) if(do_after(user, 30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) diff --git a/code/game/turfs/floor.dm b/code/game/turfs/floor.dm index 4a600d4d033b..dc2cda0c2c2a 100644 --- a/code/game/turfs/floor.dm +++ b/code/game/turfs/floor.dm @@ -148,7 +148,7 @@ if(src.weeds) return weeds.attackby(hitting_item,user) - if(istype(hitting_item, /obj/item/tool/crowbar) && (tool_flags & (REMOVE_CROWBAR|BREAK_CROWBAR))) + if(HAS_TRAIT(hitting_item, TRAIT_TOOL_CROWBAR) && (tool_flags & (REMOVE_CROWBAR|BREAK_CROWBAR))) if(broken || burnt) to_chat(user, SPAN_WARNING("You remove the broken tiles.")) else diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 5a335002d71d..6a20e9cfe78e 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -264,7 +264,7 @@ display round(lastgen) and phorontank amount to_chat(user, SPAN_NOTICE(" You open the access panel.")) else to_chat(user, SPAN_NOTICE(" You close the access panel.")) - else if(istype(O, /obj/item/tool/crowbar) && open) + else if(HAS_TRAIT(O, TRAIT_TOOL_CROWBAR) && open) var/obj/structure/machinery/constructable_frame/new_frame = new /obj/structure/machinery/constructable_frame(src.loc) for(var/obj/item/I in component_parts) if(I.reliability < 100) From 44256a8eecdf7628ce56fc0da4bbe3c1b0339d2b Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 7 Jul 2023 03:22:02 +0100 Subject: [PATCH 07/21] Automatic changelog for PR #3813 [ci skip] --- html/changelogs/AutoChangeLog-pr-3813.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3813.yml diff --git a/html/changelogs/AutoChangeLog-pr-3813.yml b/html/changelogs/AutoChangeLog-pr-3813.yml new file mode 100644 index 000000000000..5faa054ec221 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3813.yml @@ -0,0 +1,4 @@ +author: "Zonespace27" +delete-after: True +changes: + - bugfix: "The maintenance jack should work a little better at crowbarring things." \ No newline at end of file From c5e68d28269914a2fb4d190622e84145c0f7bb64 Mon Sep 17 00:00:00 2001 From: morrowwolf Date: Fri, 7 Jul 2023 00:29:12 -0400 Subject: [PATCH 08/21] Create humans tweaks (#3812) # About the pull request This PR adds extra length to the create humans menu so you don't have to scroll every time. This PR sets the default "range to spawn" variable to 0 as we don't really want variance unless it is an active decision to do so. # Explain why it's good for the game Easier usage of admin tools good. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: Morrow qol: Create humans tab length increase qol: Create humans tab now defaults to 0 range to spawn /:cl: --- code/modules/admin/tabs/event_tab.dm | 2 +- html/create_humans.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/admin/tabs/event_tab.dm b/code/modules/admin/tabs/event_tab.dm index 4effbf3b26cb..febc1550fca0 100644 --- a/code/modules/admin/tabs/event_tab.dm +++ b/code/modules/admin/tabs/event_tab.dm @@ -744,7 +744,7 @@ create_humans_html = replacetext(create_humans_html, "null /* object types */", "\"[equipment_presets]\"") create_humans_html = replacetext(create_humans_html, "/* href token */", RawHrefToken(forceGlobal = TRUE)) - show_browser(user, replacetext(create_humans_html, "/* ref src */", "\ref[src]"), "Create Humans", "create_humans", "size=450x630") + show_browser(user, replacetext(create_humans_html, "/* ref src */", "\ref[src]"), "Create Humans", "create_humans", "size=450x720") /client/proc/create_humans() set name = "Create Humans" diff --git a/html/create_humans.html b/html/create_humans.html index ed9361fc6f25..06b92cba0c71 100644 --- a/html/create_humans.html +++ b/html/create_humans.html @@ -11,7 +11,7 @@ Amount of humans:
- Range to spawn in: + Range to spawn in:

Spawn mobs as:
Regular
From 7b8d9b190538354793c3d93fcdef85021f1ea777 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 7 Jul 2023 05:37:19 +0100 Subject: [PATCH 09/21] Automatic changelog for PR #3812 [ci skip] --- html/changelogs/AutoChangeLog-pr-3812.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3812.yml diff --git a/html/changelogs/AutoChangeLog-pr-3812.yml b/html/changelogs/AutoChangeLog-pr-3812.yml new file mode 100644 index 000000000000..e8990a528ec7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3812.yml @@ -0,0 +1,5 @@ +author: "Morrow" +delete-after: True +changes: + - qol: "Create humans tab length increase" + - qol: "Create humans tab now defaults to 0 range to spawn" \ No newline at end of file From ff659789647cc5b047e1c9a25693064d1facad2c Mon Sep 17 00:00:00 2001 From: Drathek <76988376+Drulikar@users.noreply.github.com> Date: Thu, 6 Jul 2023 23:43:24 -0700 Subject: [PATCH 10/21] The weeds are hungry: Bodies for the weeds (#3644) # About the pull request This PR adds Kugamo's sprites where bodies can be integrated into the weeds. The bodies lose their interactivity, examinability, and HUDs when merged with the weeds, and are anchored. Destroying the weeds though will restore the body to normal. Currently requires the body to not be grabbable by a xeno (as in not impregnated or bursted) as well as unrevivable. Once they are permadead it currently waits 5 minutes to start merging, then 1 minute on each sprite state (there are 5). Support is basically already in place for non-humans to also use this system (just uncomment two blocks of commented out code), but I am unsure what sprites or method to hide their corpses would be used instead. I also see no issues (visual or code) with this merging nested hosts, but it will not currently merge bursts until they are no longer considered grabbable. # Explain why it's good for the game Less clutter, and it just looks neat. ![image](https://github.com/cmss13-devs/cmss13/assets/76988376/9b8cde21-b12c-4340-b9f9-ecb48480f286) After fixing the flipped lighting: ![image](https://github.com/cmss13-devs/cmss13/assets/76988376/4a420b14-46d3-4586-afa2-9c4bbae9888e) # Testing Photographs and Procedure
Screenshots & Videos As an animation when it was fast: ![weeds](https://github.com/cmss13-devs/cmss13/assets/76988376/d4e6de2c-532c-451d-ab55-964ec54a5de4) Earlier testing: ![image](https://github.com/cmss13-devs/cmss13/assets/76988376/48bd6f9d-d14c-423b-aa87-1036b0a632d4) ![image](https://github.com/cmss13-devs/cmss13/assets/76988376/40b402fc-db1e-413d-b8e4-6da3804d7ef1) Tested with zombies (they don't have undefib set when they die so won't be consumed before revival, and revival removes the component off of them until they die again - if they decap they will get a undefib signal to cause them to be consumed), smols (look at that cute little tail), rollers, coffins (now they don't suck up anchored mobs), beds, chairs, and fulton: ![image](https://github.com/cmss13-devs/cmss13/assets/76988376/fa92e380-4e02-4377-9d7e-25fadcfd43ed)
# Changelog :cl: Drathek Kugamo add: Added the ability for weeds to merge with unrevivable corpses imageadd: Added human shaped weeds by Kugamo code: Added a signal for weeds sent to the turf to indicate it is now weeded, and added a signal for afterbuckle. fix: Closets (including coffins) can no longer move anchored mobs. /:cl: --- .../__DEFINES/dcs/signals/atom/signals_obj.dm | 5 + code/datums/components/weed_food.dm | 297 ++++++++++++++++++ code/game/objects/objs.dm | 1 + .../structures/crates_lockers/closets.dm | 10 +- code/modules/cm_aliens/weeds.dm | 9 +- code/modules/gear_presets/corpses.dm | 26 +- code/modules/mob/dead/observer/observer.dm | 2 +- code/modules/mob/living/carbon/human/death.dm | 25 +- .../mob/living/carbon/human/species/zombie.dm | 5 + .../mob/living/carbon/xenomorph/death.dm | 10 +- colonialmarines.dme | 1 + icons/mob/xenos/weeds.dmi | Bin 16470 -> 47070 bytes 12 files changed, 360 insertions(+), 31 deletions(-) create mode 100644 code/datums/components/weed_food.dm diff --git a/code/__DEFINES/dcs/signals/atom/signals_obj.dm b/code/__DEFINES/dcs/signals/atom/signals_obj.dm index df53558834f6..aebd0d09d0d2 100644 --- a/code/__DEFINES/dcs/signals/atom/signals_obj.dm +++ b/code/__DEFINES/dcs/signals/atom/signals_obj.dm @@ -4,6 +4,8 @@ /// From /obj/effect/alien/weeds/Initialize() #define COMSIG_WEEDNODE_GROWTH_COMPLETE "weednode_growth_complete" +/// From /obj/effect/alien/weeds/Initialize() +#define COMSIG_WEEDNODE_GROWTH "weednode_growth" /// From /obj/effect/alien/weeds/proc/on_weed_expand() #define COMSIG_WEEDNODE_CANNOT_EXPAND_FURTHER "weednode_cannot_expand_further" @@ -24,3 +26,6 @@ #define COMSIG_TRANSMITTER_UPDATE_ICON "transmitter_update_icon" #define COMSIG_TENT_COLLAPSING "tent_collapsing" + +/// from /obj/proc/afterbuckle() +#define COSMIG_OBJ_AFTER_BUCKLE "signal_obj_after_buckle" diff --git a/code/datums/components/weed_food.dm b/code/datums/components/weed_food.dm new file mode 100644 index 000000000000..0c578b661517 --- /dev/null +++ b/code/datums/components/weed_food.dm @@ -0,0 +1,297 @@ +#define WEED_FOOD_DELAY 5 MINUTES +#define WEED_FOOD_STATE_DELAY 1 MINUTES + +/atom/movable/vis_obj/weed_food + name = "weeds" + desc = "Weird black weeds in the shape of a body..." + gender = PLURAL + vis_flags = VIS_INHERIT_DIR|VIS_INHERIT_PLANE|VIS_INHERIT_LAYER + icon = 'icons/mob/xenos/weeds.dmi' + var/static/list/icon_states = list("human_1","human_2","human_3","human_4","human_5") + var/static/list/icon_states_flipped = list("human_1_f","human_2_f","human_3_f","human_4_f","human_5_f") + var/icon_state_idx = 0 + var/timer_id = null + var/flipped = FALSE + +/atom/movable/vis_obj/weed_food/Initialize(mapload, is_flipped, ...) + flipped = is_flipped + timer_id = addtimer(CALLBACK(src, PROC_REF(on_animation_timer)), WEED_FOOD_STATE_DELAY, TIMER_STOPPABLE|TIMER_UNIQUE|TIMER_LOOP|TIMER_DELETE_ME) + on_animation_timer() + return ..() + +/// Timer callback for changing the icon_state +/atom/movable/vis_obj/weed_food/proc/on_animation_timer() + icon_state_idx++ + if(icon_state_idx > length(icon_states)) + deltimer(timer_id) + timer_id = null + return + icon_state = flipped ? icon_states_flipped[icon_state_idx] : icon_states[icon_state_idx] + +/** + * A component that can be attached to a mob/living to be merged with weeds after a delay. + * Attempting to attach a new weed_food even if one already exists is equivalent to calling start(). + * + * Attach this to any mob/living that is dead (death or initialized dead) and it should handle the rest. + */ +/datum/component/weed_food + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + /// Whether we are waiting on timer to merge + var/active = FALSE + /// Whether we are merged with weeds + var/merged = FALSE + /// The time we were unmerged (just to handle weeds upgrading) + var/unmerged_time + /// Any active timer for a pending merge + var/timer_id = null + /// The living mob that we are bound to + var/mob/living/parent_mob + /// The turf that our parent is on + var/turf/parent_turf + /// The obj that our parent is buckled to and we have registered a signal + var/obj/parent_buckle + /// The weeds that we are merging/merged with + var/obj/effect/alien/weeds/absorbing_weeds + /// The overlay image when merged + var/atom/movable/vis_obj/weed_food/weed_appearance + +/datum/component/weed_food/Initialize(...) + parent_mob = parent + //if(!istype(parent_mob)) + //return COMPONENT_INCOMPATIBLE + if(!istype(parent_mob, /mob/living/carbon/human)) + return COMPONENT_INCOMPATIBLE // TODO: At the moment we only support humans + + parent_turf = get_turf(parent_mob) + if(parent_turf != parent_mob.loc) + parent_turf = null // if our location is actually a container, we want to be safe from weeds + + start() + +/datum/component/weed_food/InheritComponent(datum/component/C, i_am_original) + start() + +/datum/component/weed_food/Destroy(force, silent) + . = ..() + + unmerge_with_weeds() + QDEL_NULL(weed_appearance) + parent_mob = null + parent_turf = null + +/datum/component/weed_food/RegisterWithParent() + RegisterSignal(parent_mob, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) + RegisterSignal(parent_mob, list(COMSIG_LIVING_REJUVENATED, COMSIG_HUMAN_REVIVED), PROC_REF(on_rejuv)) + RegisterSignal(parent_mob, COMSIG_HUMAN_SET_UNDEFIBBABLE, PROC_REF(on_update)) + if(parent_turf) + RegisterSignal(parent_turf, COMSIG_WEEDNODE_GROWTH, PROC_REF(on_update)) + +/datum/component/weed_food/UnregisterFromParent() + if(parent_mob) + UnregisterSignal(parent_mob, list( + COMSIG_MOVABLE_MOVED, + COMSIG_LIVING_REJUVENATED, + COMSIG_HUMAN_REVIVED, + COMSIG_HUMAN_SET_UNDEFIBBABLE, + )) + if(absorbing_weeds) + UnregisterSignal(absorbing_weeds, COMSIG_PARENT_QDELETING) + if(parent_turf) + UnregisterSignal(parent_turf, COMSIG_WEEDNODE_GROWTH) + if(parent_buckle) + UnregisterSignal(parent_buckle, COSMIG_OBJ_AFTER_BUCKLE) + +/// SIGNAL_HANDLER for COMSIG_MOVABLE_MOVED +/datum/component/weed_food/proc/on_move() + SIGNAL_HANDLER + + if(absorbing_weeds) + UnregisterSignal(absorbing_weeds, COMSIG_PARENT_QDELETING) + absorbing_weeds = null + + if(parent_turf) + UnregisterSignal(parent_turf, COMSIG_WEEDNODE_GROWTH) + parent_turf = get_turf(parent_mob) + if(parent_turf != parent_mob.loc) + parent_turf = null // if our location is actually a container, we want to be safe from weeds + else + RegisterSignal(parent_turf, COMSIG_WEEDNODE_GROWTH, PROC_REF(on_update)) + + // We moved, restart or start the proccess + if(stop() || !merged) + start() + return + + // If we somehow moved when we were merged, handle that + absorbing_weeds = parent_turf?.weeds + if(absorbing_weeds) + RegisterSignal(absorbing_weeds, COMSIG_PARENT_QDELETING, PROC_REF(on_weed_deletion)) + return + unmerge_with_weeds() + +/// SIGNAL_HANDLER for COMSIG_LIVING_REJUVENATED and COMSIG_HUMAN_REVIVED +/datum/component/weed_food/proc/on_rejuv() + SIGNAL_HANDLER + + qdel(src) + +/// SIGNAL_HANDLER for COSMIG_OBJ_AFTER_BUCKLE +/datum/component/weed_food/proc/on_after_buckle(obj/source, mob/buckled) + SIGNAL_HANDLER + + if(buckled) + return + start() // We unbuckled, so lets try to start again + +/// SIGNAL_HANDLER for COMSIG_HUMAN_SET_UNDEFIBBABLE & COMSIG_WEEDNODE_GROWTH +/datum/component/weed_food/proc/on_update() + SIGNAL_HANDLER + + start() + +/// SIGNAL_HANDLER for COMSIG_PARENT_QDELETING of weeds +/datum/component/weed_food/proc/on_weed_deletion() + SIGNAL_HANDLER + + if(active) + stop() + return + if(merged) + unmerge_with_weeds() + return + +/** + * Try to start the process to turn into weeds + * Returns TRUE if started successfully + */ +/datum/component/weed_food/proc/start() + if(active) + return FALSE + if(merged) + return FALSE + if(QDELETED(parent_mob)) + return FALSE + + if(parent_mob.buckled) + if(parent_mob.buckled == parent_buckle) + return FALSE // Still buckled to the same thing + if(!istype(parent_mob.buckled, /obj/structure/bed/nest)) + if(parent_buckle) // Still have a lingering reference somehow? + UnregisterSignal(parent_buckle, COSMIG_OBJ_AFTER_BUCKLE) + parent_buckle = parent_mob.buckled + RegisterSignal(parent_mob.buckled, COSMIG_OBJ_AFTER_BUCKLE, PROC_REF(on_after_buckle)) + return FALSE + if(parent_buckle) + UnregisterSignal(parent_buckle, COSMIG_OBJ_AFTER_BUCKLE) + parent_buckle = null + + if(parent_mob.is_xeno_grabbable()) + return FALSE + if(!(parent_mob.status_flags & PERMANENTLY_DEAD)) + var/mob/living/carbon/human/parent_human = parent_mob + if(istype(parent_human) && !parent_human.undefibbable) + return FALSE + if(!parent_turf?.weeds) + return FALSE + + if(unmerged_time == world.time) + return merge_with_weeds() // Weeds upgraded, re-merge now re-using the apperance + QDEL_NULL(weed_appearance) + absorbing_weeds = parent_turf.weeds + RegisterSignal(parent_turf.weeds, COMSIG_PARENT_QDELETING, PROC_REF(on_weed_deletion)) + + active = TRUE + timer_id = addtimer(CALLBACK(src, PROC_REF(merge_with_weeds)), WEED_FOOD_DELAY, TIMER_STOPPABLE|TIMER_UNIQUE|TIMER_DELETE_ME|TIMER_OVERRIDE) + + return TRUE + +/** + * Try to stop the process turning into weeds + * Returns TRUE if stopped successfully (was active when called) + */ +/datum/component/weed_food/proc/stop() + if(!active) + return FALSE + + active = FALSE + deltimer(timer_id) + timer_id = null + + return TRUE + +/** + * Finish becomming one with the weeds + * Returns TRUE if merged successfully + */ +/datum/component/weed_food/proc/merge_with_weeds() + if(merged) + return FALSE + if(QDELETED(parent_mob)) + return FALSE + + if(absorbing_weeds) // Remove the signal that would call stop + UnregisterSignal(absorbing_weeds, COMSIG_PARENT_QDELETING) + + if(parent_mob.buckled) + if(parent_mob.buckled == parent_buckle) + return FALSE // Still buckled to the same thing somehow? + if(!istype(parent_mob.buckled, /obj/structure/bed/nest)) + if(parent_buckle) // Still have a lingering reference somehow? + UnregisterSignal(parent_buckle, COSMIG_OBJ_AFTER_BUCKLE) + parent_buckle = parent_mob.buckled + RegisterSignal(parent_mob.buckled, COSMIG_OBJ_AFTER_BUCKLE, PROC_REF(on_after_buckle)) + return FALSE + if(parent_buckle) + UnregisterSignal(parent_buckle, COSMIG_OBJ_AFTER_BUCKLE) + parent_buckle = null + + absorbing_weeds = parent_turf?.weeds + if(!absorbing_weeds) + return FALSE + RegisterSignal(absorbing_weeds, COMSIG_PARENT_QDELETING, PROC_REF(on_weed_deletion)) + // Technically we could have just left the signal alone, but both because of the posibility of other conditions preventing a merge or weeds somehow changing and on_move didn't catch it, this is less fragile + + active = FALSE + merged = TRUE + + parent_mob.density = FALSE + parent_mob.anchored = TRUE + parent_mob.mouse_opacity = MOUSE_OPACITY_TRANSPARENT + parent_mob.plane = FLOOR_PLANE + parent_mob.remove_from_all_mob_huds() + + if(!weed_appearance) // Make a new sprite if we aren't re-merging + var/is_flipped = parent_mob.transform.b == -1 // Technically we should check if d is 1 too, but corpses can only be rotated 90 or 270 (1/-1 or -1/1) + if(parent_mob.dir & WEST) + is_flipped = !is_flipped // The direction reversed the effect of the flip! + weed_appearance = new(null, is_flipped) + weed_appearance.color = absorbing_weeds.color + // TODO: For non-humans change the icon_state or something here + parent_mob.vis_contents += weed_appearance + + return TRUE + +/** + * Undo the weedening + * Returns TRUE if unmerged successfully (always) + */ +/datum/component/weed_food/proc/unmerge_with_weeds() + merged = FALSE + unmerged_time = world.time + + if(absorbing_weeds) + UnregisterSignal(absorbing_weeds, COMSIG_PARENT_QDELETING) + absorbing_weeds = null + + parent_mob.anchored = FALSE + parent_mob.mouse_opacity = MOUSE_OPACITY_ICON + parent_mob.plane = GAME_PLANE + parent_mob.vis_contents -= weed_appearance + + if(!QDELETED(parent_mob)) + parent_mob.add_to_all_mob_huds() + + return TRUE + +#undef WEED_FOOD_DELAY +#undef WEED_FOOD_STATE_DELAY diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index e98e3b527c5f..b92624cf4201 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -223,6 +223,7 @@ /obj/proc/afterbuckle(mob/M as mob) // Called after somebody buckled / unbuckled handle_rotation() + SEND_SIGNAL(src, COSMIG_OBJ_AFTER_BUCKLE, buckled_mob) return buckled_mob /obj/proc/unbuckle() diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index e6c215d0208f..cf0374c09ab4 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -135,15 +135,17 @@ return stored_units /obj/structure/closet/proc/store_mobs(stored_units) - for(var/mob/M in src.loc) + for(var/mob/cur_mob in src.loc) if(stored_units + mob_size > storage_capacity) break - if(istype (M, /mob/dead/observer)) + if(istype (cur_mob, /mob/dead/observer)) continue - if(M.buckled) + if(cur_mob.buckled) + continue + if(cur_mob.anchored) continue - M.forceMove(src) + cur_mob.forceMove(src) stored_units += mob_size return stored_units diff --git a/code/modules/cm_aliens/weeds.dm b/code/modules/cm_aliens/weeds.dm index 7ca73a5c2822..f42b8b1938f8 100644 --- a/code/modules/cm_aliens/weeds.dm +++ b/code/modules/cm_aliens/weeds.dm @@ -73,10 +73,11 @@ else if(!hibernate && do_spread) addtimer(CALLBACK(src, PROC_REF(weed_expand)), WEED_BASE_GROW_SPEED / max(weed_strength, 1)) - var/turf/T = get_turf(src) - if(T) - T.weeds = src - weeded_turf = T + var/turf/turf = get_turf(src) + if(turf) + turf.weeds = src + weeded_turf = turf + SEND_SIGNAL(turf, COMSIG_WEEDNODE_GROWTH) // Currently for weed_food wakeup RegisterSignal(src, list( COMSIG_ATOM_TURF_CHANGE, diff --git a/code/modules/gear_presets/corpses.dm b/code/modules/gear_presets/corpses.dm index 02671cc02a93..7e9dd5b841a0 100644 --- a/code/modules/gear_presets/corpses.dm +++ b/code/modules/gear_presets/corpses.dm @@ -16,28 +16,32 @@ /datum/equipment_preset/corpse/load_status(mob/living/carbon/human/new_human) . = ..(new_human) + + // These two values matter because they are checked on death for weed_food + new_human.undefibbable = TRUE + if(xenovictim) + new_human.chestburst = 2 + new_human.death(create_cause_data("existing"), TRUE) //Kills the new mob new_human.apply_damage(100, BRUTE) new_human.apply_damage(100, BRUTE) new_human.apply_damage(100, BRUTE) if(xenovictim) - var/datum/internal_organ/O + var/datum/internal_organ/organ var/i for(i in list("heart","lungs")) - O = new_human.internal_organs_by_name[i] + organ = new_human.internal_organs_by_name[i] new_human.internal_organs_by_name -= i - new_human.internal_organs -= O - new_human.chestburst = 2 + new_human.internal_organs -= organ new_human.update_burst() //buckle to nest - var/obj/structure/bed/nest/N = locate() in get_turf(src) - if(N) - new_human.buckled = N - new_human.setDir(N.dir) + var/obj/structure/bed/nest/nest = locate() in get_turf(src) + if(nest) + new_human.buckled = nest + new_human.setDir(nest.dir) new_human.update_canmove() - N.buckled_mob = new_human - N.afterbuckle(new_human) - new_human.undefibbable = TRUE + nest.buckled_mob = new_human + nest.afterbuckle(new_human) new_human.spawned_corpse = TRUE new_human.updatehealth() new_human.pulse = PULSE_NONE diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index d29b88ac8893..b0a1c1d15565 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -86,7 +86,6 @@ body.alter_ghost(src) apply_transform(matrix()) - own_orbit_size = body.get_orbit_size() desc = initial(desc) @@ -95,6 +94,7 @@ invisibility = INVISIBILITY_OBSERVER plane = GHOST_PLANE layer = ABOVE_FLY_LAYER + mouse_opacity = MOUSE_OPACITY_ICON // In case we were weed_food sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS|SEE_SELF see_invisible = INVISIBILITY_OBSERVER diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index becb5dcd6610..dbe00407d7ef 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -41,7 +41,9 @@ if(stat == DEAD) species?.handle_dead_death(src, gibbed) return + GLOB.alive_human_list -= src + if(!gibbed) if(HAS_TRAIT(src, TRAIT_HARDCORE) || MODE_HAS_TOGGLEABLE_FLAG(MODE_HARDCORE_PERMA)) if(!(species.flags & IS_SYNTHETIC)) // Synths wont perma @@ -50,8 +52,10 @@ disable_lights() disable_special_items() disable_headsets() //Disable radios for dead people to reduce load + if(pulledby && isxeno(pulledby)) // Xenos lose grab on dead humans pulledby.stop_pulling() + //Handle species-specific deaths. if(species) species.handle_death(src, gibbed) @@ -66,16 +70,14 @@ // Finding the last guy for anti-delay. if(SSticker.mode && SSticker.mode.is_in_endgame && SSticker.current_state != GAME_STATE_FINISHED && is_mainship_level(z)) var/mob/last_living_human - for(var/mob/living/carbon/human/H as anything in GLOB.alive_human_list) - if(!is_mainship_level(H.z)) + for(var/mob/living/carbon/human/cur_human as anything in GLOB.alive_human_list) + if(!is_mainship_level(cur_human.z)) continue if(last_living_human) last_living_human = null break - last_living_human = H - if(last_living_human) - if((last_qm_callout + 2 MINUTES) > world.time) - return + last_living_human = cur_human + if(last_living_human && (last_qm_callout + 2 MINUTES) < world.time) last_qm_callout = world.time // Tell the xenos where the human is. xeno_announcement("I sense the last tallhost hiding in [get_area(last_living_human)].", XENO_HIVE_NORMAL, SPAN_ANNOUNCEMENT_HEADER_BLUE("[QUEEN_MOTHER_ANNOUNCE]")) @@ -103,4 +105,13 @@ if(HAS_TRAIT(src, TRAIT_HARDCORE)) death_message = "valiantly falls to the ground, dead, unable to continue." - return ..(cause, gibbed, death_message) + . = ..(cause, gibbed, death_message) + + // stat is now set + var/datum/cause_data/death_data = cause + if(!gibbed && death_data?.cause_name != "gibbing") + // Hilariously the gibbing proc causes death via droplimb which means gibbed is false... + AddComponent(/datum/component/weed_food) + else if(death_data?.cause_name == "existing") + // Corpses spawn as gibbed true to avoid sfx, even though they aren't actually gibbed... + AddComponent(/datum/component/weed_food) diff --git a/code/modules/mob/living/carbon/human/species/zombie.dm b/code/modules/mob/living/carbon/human/species/zombie.dm index 2c9c423c671e..532d9413102c 100644 --- a/code/modules/mob/living/carbon/human/species/zombie.dm +++ b/code/modules/mob/living/carbon/human/species/zombie.dm @@ -102,6 +102,8 @@ if(zombie.client) zombie.play_screen_text("You are dead...
You lost your head. No reviving for you.", /atom/movable/screen/text/screen_text/command_order, rgb(155, 0, 200)) to_chat(zombie, SPAN_XENOWARNING("You fall... headless, you will no longer rise.")) + zombie.undefibbable = TRUE // really only for weed_food + SEND_SIGNAL(zombie, COMSIG_HUMAN_SET_UNDEFIBBABLE) /datum/species/zombie/handle_dead_death(mob/living/carbon/human/zombie, gibbed) if(gibbed) @@ -144,6 +146,9 @@ return static_tab_items /datum/species/zombie/handle_head_loss(mob/living/carbon/human/zombie) + if(!zombie.undefibbable) + zombie.undefibbable = TRUE // really only for weed_food + SEND_SIGNAL(zombie, COMSIG_HUMAN_SET_UNDEFIBBABLE) if(WEAKREF(zombie) in to_revive) remove_from_revive(zombie) var/client/receiving_client = zombie.client diff --git a/code/modules/mob/living/carbon/xenomorph/death.dm b/code/modules/mob/living/carbon/xenomorph/death.dm index fe4b4cca2fb1..e3a69da23262 100644 --- a/code/modules/mob/living/carbon/xenomorph/death.dm +++ b/code/modules/mob/living/carbon/xenomorph/death.dm @@ -50,7 +50,7 @@ new_xeno.generate_name() if(!SSticker.mode.transfer_xeno(xeno_candidate, new_xeno)) qdel(new_xeno) - return + break new_xeno.visible_message(SPAN_XENODANGER("A larva suddenly burrows out of the ground!"), SPAN_XENODANGER("You burrow out of the ground after feeling an immense tremor through the hive, which quickly fades into complete silence...")) @@ -105,6 +105,11 @@ GLOB.hive_datum[hivenumber].stored_larva++ GLOB.hive_datum[hivenumber].hive_ui.update_burrowed_larva() + if(hardcore) + QDEL_IN(src, 3 SECONDS) + //else if(!gibbed) // At the moment we only support humans + //AddComponent(/datum/component/weed_food) + if(hive) hive.remove_xeno(src) // Finding the last xeno for anti-delay. @@ -125,9 +130,6 @@ to_chat(X, SPAN_XENOANNOUNCE("Your carapace rattles with dread. You are all that remains of the hive!")) announce_dchat("There is only one Xenomorph left: [X.name].", X) - if(hardcore) - QDEL_IN(src, 3 SECONDS) - SEND_GLOBAL_SIGNAL(COMSIG_GLOB_XENO_DEATH, src, gibbed) /mob/living/carbon/xenomorph/gib(datum/cause_data/cause = create_cause_data("gibbing", src)) diff --git a/colonialmarines.dme b/colonialmarines.dme index 204c144c8916..dd22cc107b5f 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -370,6 +370,7 @@ #include "code\datums\components\speed_modifier.dm" #include "code\datums\components\toxin_buildup.dm" #include "code\datums\components\weed_damage_reduction.dm" +#include "code\datums\components\weed_food.dm" #include "code\datums\components\xeno\shield_slash.dm" #include "code\datums\construction\construction_template.dm" #include "code\datums\construction\xenomorph\construction_template_xenomorph.dm" diff --git a/icons/mob/xenos/weeds.dmi b/icons/mob/xenos/weeds.dmi index 8eb4b2203cf6f680305449a38bf3413921c4dabc..0b9403058109ed40a5cf445d2a223bc2dfa30ce6 100644 GIT binary patch literal 47070 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≺{smoBlSD45DSXU@{_vJs~QAyE? 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 literal 16470 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 bSRR%F%ZpG_!e#s$@c;uIQ|)R^$G86vO}RPT From ba18cc864d34e40e7ca803e329a775db10611b0d Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 7 Jul 2023 07:52:14 +0100 Subject: [PATCH 11/21] Automatic changelog for PR #3644 [ci skip] --- html/changelogs/AutoChangeLog-pr-3644.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3644.yml diff --git a/html/changelogs/AutoChangeLog-pr-3644.yml b/html/changelogs/AutoChangeLog-pr-3644.yml new file mode 100644 index 000000000000..3561afb407cf --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3644.yml @@ -0,0 +1,7 @@ +author: "Drathek Kugamo" +delete-after: True +changes: + - rscadd: "Added the ability for weeds to merge with unrevivable corpses" + - imageadd: "Added human shaped weeds by Kugamo" + - code_imp: "Added a signal for weeds sent to the turf to indicate it is now weeded, and added a signal for afterbuckle." + - bugfix: "Closets (including coffins) can no longer move anchored mobs." \ No newline at end of file From 45de3ce6a04fad846f225d2548e28b290a3ab0c9 Mon Sep 17 00:00:00 2001 From: morrowwolf Date: Fri, 7 Jul 2023 08:43:41 -0400 Subject: [PATCH 12/21] Fixes extraneous messages in regards to wall nests (#3807) # About the pull request Mouse drop was not checking for if you were actually grabbing something before passing to the proc like in the other areas it is called which caused extraneous messages. Also, mouse drop does not guarantee a mob being passed which was causing extraneous and confusing messages when dropping wall resin onto a wall while dragging something. # Explain why it's good for the game Confusing and extraneous messages bad. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: Morrow fix: Fixed extraneous messages in regards to wall nests /:cl: --- code/game/turfs/walls/walls.dm | 6 +++++- code/modules/cm_aliens/weeds.dm | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/code/game/turfs/walls/walls.dm b/code/game/turfs/walls/walls.dm index 411ff8182661..3599d5bb980b 100644 --- a/code/game/turfs/walls/walls.dm +++ b/code/game/turfs/walls/walls.dm @@ -98,11 +98,15 @@ qdel(found_nest) //nests are built on walls, no walls, no nest /turf/closed/wall/MouseDrop_T(mob/current_mob, mob/user) + if(!ismob(current_mob)) + return + if(acided_hole) if(current_mob == user && isxeno(user)) acided_hole.use_wall_hole(user) return - if(isxeno(user)) + + if(isxeno(user) && istype(user.get_active_hand(), /obj/item/grab)) var/mob/living/carbon/xenomorph/user_as_xenomorph = user user_as_xenomorph.do_nesting_host(current_mob, src) ..() diff --git a/code/modules/cm_aliens/weeds.dm b/code/modules/cm_aliens/weeds.dm index f42b8b1938f8..f20fa842e446 100644 --- a/code/modules/cm_aliens/weeds.dm +++ b/code/modules/cm_aliens/weeds.dm @@ -430,7 +430,11 @@ /obj/effect/alien/weeds/weedwall/MouseDrop_T(mob/current_mob, mob/user) . = ..() - if(isxeno(user)) + + if(!ismob(current_mob)) + return + + if(isxeno(user) && istype(user.get_active_hand(), /obj/item/grab)) var/mob/living/carbon/xenomorph/user_as_xenomorph = user user_as_xenomorph.do_nesting_host(current_mob, src) From 4133e4c0415e4533a32a1dd55489b5ca13d25fb7 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 7 Jul 2023 13:52:52 +0100 Subject: [PATCH 13/21] Automatic changelog for PR #3807 [ci skip] --- html/changelogs/AutoChangeLog-pr-3807.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3807.yml diff --git a/html/changelogs/AutoChangeLog-pr-3807.yml b/html/changelogs/AutoChangeLog-pr-3807.yml new file mode 100644 index 000000000000..ad651a4d4e80 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3807.yml @@ -0,0 +1,4 @@ +author: "Morrow" +delete-after: True +changes: + - bugfix: "Fixed extraneous messages in regards to wall nests" \ No newline at end of file From 564e60a8df54c6954a1a68898327523678a91aff Mon Sep 17 00:00:00 2001 From: Drathek <76988376+Drulikar@users.noreply.github.com> Date: Fri, 7 Jul 2023 05:46:35 -0700 Subject: [PATCH 14/21] Fix launch_towards ordering for facehuggers (#3826) # About the pull request This PR simply fixes the order of logic that is altering facehuggers so the launch_towards icon change occurs before launch_impact. # Explain why it's good for the game Fixes situations like https://media.discordapp.net/attachments/1069150999517868066/1126358950707728384/gank_chamber.mp4 # Testing Photographs and Procedure
Screenshots & Videos Example of two huggers: ![leap](https://github.com/cmss13-devs/cmss13/assets/76988376/86767e97-334f-4b52-b95d-2b5747fe7bd6) Order of events for three huggers: ![image](https://github.com/cmss13-devs/cmss13/assets/76988376/17cefebc-80e8-4a52-b606-3090e2fa3e57)
# Changelog :cl: Drathek fix: Fixed facehuggers incorrectly displaying thrown state when it has landed /:cl: --- code/modules/mob/living/carbon/xenomorph/Facehuggers.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/xenomorph/Facehuggers.dm b/code/modules/mob/living/carbon/xenomorph/Facehuggers.dm index 8b3b1d54f26d..5ef9626620b2 100644 --- a/code/modules/mob/living/carbon/xenomorph/Facehuggers.dm +++ b/code/modules/mob/living/carbon/xenomorph/Facehuggers.dm @@ -191,9 +191,9 @@ return FALSE /obj/item/clothing/mask/facehugger/launch_towards(datum/launch_metadata/LM) - ..() if(stat == CONSCIOUS) icon_state = "[initial(icon_state)]_thrown" + ..() /obj/item/clothing/mask/facehugger/launch_impact(atom/hit_atom) . = ..() @@ -240,8 +240,8 @@ if(!target) return FALSE - target.visible_message(SPAN_WARNING("\The scuttling [src] leaps at [target]!"), \ - SPAN_WARNING("The scuttling [src] leaps at [target]!")) + target.visible_message(SPAN_WARNING("[src] leaps at [target]!"), \ + SPAN_WARNING("[src] leaps at [target]!")) leaping = TRUE throw_atom(target, 3, SPEED_FAST) return TRUE From 761e101ed76c2a313caf5d48d55a86f0cb3216a8 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 7 Jul 2023 14:09:47 +0100 Subject: [PATCH 15/21] Automatic changelog for PR #3826 [ci skip] --- html/changelogs/AutoChangeLog-pr-3826.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3826.yml diff --git a/html/changelogs/AutoChangeLog-pr-3826.yml b/html/changelogs/AutoChangeLog-pr-3826.yml new file mode 100644 index 000000000000..556e83acdbba --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3826.yml @@ -0,0 +1,4 @@ +author: "Drathek" +delete-after: True +changes: + - bugfix: "Fixed facehuggers incorrectly displaying thrown state when it has landed" \ No newline at end of file From f4bbe82dc00075db3fdf0bd8d1cade2f17f62d92 Mon Sep 17 00:00:00 2001 From: Ben <91219575+Ben10083@users.noreply.github.com> Date: Fri, 7 Jul 2023 08:50:31 -0400 Subject: [PATCH 16/21] Working Joes no longer can have a gradient on their rare hair. (#3827) # About the pull request Resolves oversight that allows for a user to have their own hair color as a Working Joe by enabling Gradient in character select, to avoid accidently overriding the default hair color. Fixes #3820 # Explain why it's good for the game While WJs are whitelisted, this mechanical enforcement is more so to prevent accidents from when people join as Working Joe without removing gradients, as a person should not need to design a character to fit a role that should overwrite that in the first place. # Changelog :cl: fix: Working Joes can no longer have a gradient on their rare hair spawn. /:cl: --- code/modules/gear_presets/synths.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/gear_presets/synths.dm b/code/modules/gear_presets/synths.dm index f2a5283e2a26..823cfb4d69d4 100644 --- a/code/modules/gear_presets/synths.dm +++ b/code/modules/gear_presets/synths.dm @@ -532,6 +532,7 @@ new_human.h_style = "Bald" new_human.f_style = "Shaved" if(prob(5)) + new_human.grad_style = "None" //No gradients for Working Joes new_human.h_style = "Shoulder-length Hair" //Added the chance of hair as per Monkeyfist lore accuracy new_human.r_eyes = 0 new_human.g_eyes = 0 From 6cb1a177c3af1e588594d4089a20327a5b627acb Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 7 Jul 2023 14:26:06 +0100 Subject: [PATCH 17/21] Automatic changelog for PR #3827 [ci skip] --- html/changelogs/AutoChangeLog-pr-3827.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3827.yml diff --git a/html/changelogs/AutoChangeLog-pr-3827.yml b/html/changelogs/AutoChangeLog-pr-3827.yml new file mode 100644 index 000000000000..768cd30a9497 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3827.yml @@ -0,0 +1,4 @@ +author: "Ben10083" +delete-after: True +changes: + - bugfix: "Working Joes can no longer have a gradient on their rare hair spawn." \ No newline at end of file From 6aae27cdb051707fb328388d26cb208d0d63d84f Mon Sep 17 00:00:00 2001 From: Ben <91219575+Ben10083@users.noreply.github.com> Date: Fri, 7 Jul 2023 13:10:17 -0400 Subject: [PATCH 18/21] Working Joes can no longer eat (#3828) # About the pull request Mechanically prevents eating and being force-fed as a Joe # Explain why it's good for the game While not worried about the Joe itself eating the Burger, it physically does not have anything to feed the burger to (The mouth is mostly aesthetic with a speaker). As such, it makes no sense that you can feed food into a Working Joe, and should not be possible. # Changelog :cl: del: Working Joes can no longer be fed. code: New trait: Cannot eat. Self-explanatory. /:cl: --------- Co-authored-by: harryob --- code/__DEFINES/traits.dm | 5 ++++- code/game/objects/items/reagent_containers/food/snacks.dm | 4 ++++ code/modules/mob/living/carbon/human/species/synthetic.dm | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index dd700ccde996..4897a04fea82 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -123,7 +123,7 @@ #define TRAIT_SUPER_STRONG "t_super_strong" /// Foreign biology. Basic medHUDs won't show the mob. (Yautja, Zombies) #define TRAIT_FOREIGN_BIO "t_foreign_bio" -/// Eye color changes on intent. (G1 Synths) +/// Eye color changes on intent. (G1 Synths and WJs) #define TRAIT_INTENT_EYES "t_intent_eyes" /// Masked synthetic biology. Basic medHUDs will percieve the mob as human. (Infiltrator Synths) #define TRAIT_INFILTRATOR_SYNTH "t_infiltrator_synth" @@ -157,6 +157,8 @@ #define TRAIT_LEADERSHIP "t_leadership" /// If the mob can see the reagents contents of stuff #define TRAIT_REAGENT_SCANNER "reagent_scanner" +/// If the mob cannot eat/be fed +#define TRAIT_CANNOT_EAT "t_cannot_eat" /// If the mob is being lazed by a sniper spotter #define TRAIT_SPOTTER_LAZED "t_spotter_lazed" /// If the mob has ear protection. Protects from external ear damage effects. Includes explosions, firing the RPG, screeching DEAFNESS only, and flashbangs. @@ -261,6 +263,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_BIMEX" = TRAIT_BIMEX, "TRAIT_EMOTE_CD_EXEMPT" = TRAIT_EMOTE_CD_EXEMPT, "TRAIT_LISPING" = TRAIT_LISPING, + "TRAIT_CANNOT_EAT" = TRAIT_CANNOT_EAT, ), /mob/living/carbon/xenomorph = list( "TRAIT_ABILITY_NO_PLASMA_TRANSFER" = TRAIT_ABILITY_NO_PLASMA_TRANSFER, diff --git a/code/game/objects/items/reagent_containers/food/snacks.dm b/code/game/objects/items/reagent_containers/food/snacks.dm index 7dae94bfe4eb..c0e11dac8eb3 100644 --- a/code/game/objects/items/reagent_containers/food/snacks.dm +++ b/code/game/objects/items/reagent_containers/food/snacks.dm @@ -66,6 +66,10 @@ if(issynth(C)) fullness = 200 //Synths never get full + if(HAS_TRAIT(M, TRAIT_CANNOT_EAT)) //Do not feed the Working Joes + to_chat(user, SPAN_DANGER("[user == M ? "You are" : "[M] is"] unable to eat!")) + return + if(fullness > 540) C.overeat_cooldown = world.time + OVEREAT_TIME diff --git a/code/modules/mob/living/carbon/human/species/synthetic.dm b/code/modules/mob/living/carbon/human/species/synthetic.dm index 37654d0fa46c..a8646fa15807 100644 --- a/code/modules/mob/living/carbon/human/species/synthetic.dm +++ b/code/modules/mob/living/carbon/human/species/synthetic.dm @@ -111,7 +111,7 @@ name_plural = "Working Joes" uses_ethnicity = FALSE burn_mod = 0.65 // made for hazardous environments, withstanding temperatures up to 1210 degrees - mob_inherent_traits = list(TRAIT_SUPER_STRONG, TRAIT_INTENT_EYES, TRAIT_EMOTE_CD_EXEMPT) + mob_inherent_traits = list(TRAIT_SUPER_STRONG, TRAIT_INTENT_EYES, TRAIT_EMOTE_CD_EXEMPT, TRAIT_CANNOT_EAT) slowdown = 0.45 hair_color = "#000000" From 1a4a0eb9a4e1f0514cbe8e1ea72c9d886fb2fa58 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 7 Jul 2023 18:26:37 +0100 Subject: [PATCH 19/21] Automatic changelog for PR #3828 [ci skip] --- html/changelogs/AutoChangeLog-pr-3828.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3828.yml diff --git a/html/changelogs/AutoChangeLog-pr-3828.yml b/html/changelogs/AutoChangeLog-pr-3828.yml new file mode 100644 index 000000000000..f3cc0b8c3ee1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3828.yml @@ -0,0 +1,5 @@ +author: "Ben10083" +delete-after: True +changes: + - rscdel: "Working Joes can no longer be fed." + - code_imp: "New trait: Cannot eat. Self-explanatory." \ No newline at end of file From 629af7b0b020bfb0ebb186aa7ac7e702b9baf897 Mon Sep 17 00:00:00 2001 From: Cursor <102828457+theselfish@users.noreply.github.com> Date: Fri, 7 Jul 2023 22:08:23 +0100 Subject: [PATCH 20/21] Adds/Changes various machine descriptions (#3774) # About the pull request I dislike wordless or poorly written item descriptions. It saddens me to see them. # Explain why it's good for the game Having a description is good. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: Cursor spellcheck: Changed Chem Dispenser to Chemical Dispenser, added descriptions to the cryo cell, rail computer and chemical dispenser. Updated the descriptions for the Blood Dispenser and Dropship computer. /:cl: --------- Co-authored-by: BeagleGaming1 <56142455+BeagleGaming1@users.noreply.github.com> --- code/game/machinery/cryo.dm | 1 + code/game/machinery/vending/vendor_types/medical.dm | 2 +- code/modules/cm_tech/implements/railgun.dm | 1 + code/modules/reagents/chemistry_machinery/chem_dispenser.dm | 3 ++- code/modules/shuttle/computers/dropship_computer.dm | 2 +- 5 files changed, 6 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index 435976668577..afcc9686cff5 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -2,6 +2,7 @@ /obj/structure/machinery/cryo_cell name = "cryo cell" + desc = "A donation from the old A.W. project, using cryogenic technology. It slowly heals whoever is inside the tube." icon = 'icons/obj/structures/machinery/cryogenics2.dmi' icon_state = "cell" density = FALSE diff --git a/code/game/machinery/vending/vendor_types/medical.dm b/code/game/machinery/vending/vendor_types/medical.dm index 5815f60b2e0c..70ac7701973b 100644 --- a/code/game/machinery/vending/vendor_types/medical.dm +++ b/code/game/machinery/vending/vendor_types/medical.dm @@ -272,7 +272,7 @@ /obj/structure/machinery/cm_vending/sorted/medical/blood name = "\improper MM Blood Dispenser" - desc = "Marine Med brand Blood Pack Dispensary" + desc = "The Marine Med Brand Blood Pack Dispensary is the premier, top-of-the-line blood dispenser of 2105! Get yours today!" //Don't update this year, the joke is it's old. icon_state = "blood" wrenchable = TRUE hackable = TRUE diff --git a/code/modules/cm_tech/implements/railgun.dm b/code/modules/cm_tech/implements/railgun.dm index b0d91515419f..b69f9a9d13a8 100644 --- a/code/modules/cm_tech/implements/railgun.dm +++ b/code/modules/cm_tech/implements/railgun.dm @@ -6,6 +6,7 @@ GLOBAL_DATUM(railgun_eye_location, /datum/coords) /obj/effect/landmark/railgun_computer name = "Railgun computer landmark" + desc = "A computer with an orange interface, it's idly blinking, awaiting a password." /obj/effect/landmark/railgun_computer/Initialize(mapload, ...) . = ..() diff --git a/code/modules/reagents/chemistry_machinery/chem_dispenser.dm b/code/modules/reagents/chemistry_machinery/chem_dispenser.dm index 8de20ca2b79a..09d46aa8c053 100644 --- a/code/modules/reagents/chemistry_machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry_machinery/chem_dispenser.dm @@ -1,5 +1,6 @@ /obj/structure/machinery/chem_dispenser - name = "chem dispenser" + name = "chemical dispenser" + desc = "A complex machine for mixing elements into chemicals. A Wey-Yu product." density = TRUE anchored = TRUE icon = 'icons/obj/structures/machinery/science_machines.dmi' diff --git a/code/modules/shuttle/computers/dropship_computer.dm b/code/modules/shuttle/computers/dropship_computer.dm index ea4a7fdbc79d..50449b32fcb9 100644 --- a/code/modules/shuttle/computers/dropship_computer.dm +++ b/code/modules/shuttle/computers/dropship_computer.dm @@ -1,6 +1,6 @@ /obj/structure/machinery/computer/shuttle/dropship/flight name = "dropship navigation computer" - desc = "flight computer for dropship" + desc = "A flight computer that can be used for autopilot or long-range flights." icon = 'icons/obj/structures/machinery/shuttle-parts.dmi' icon_state = "console" req_one_access = list(ACCESS_MARINE_LEADER, ACCESS_MARINE_DROPSHIP) From b0277992acbb32863b56bcd0733ebce534c9546f Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 7 Jul 2023 22:17:23 +0100 Subject: [PATCH 21/21] Automatic changelog for PR #3774 [ci skip] --- html/changelogs/AutoChangeLog-pr-3774.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3774.yml diff --git a/html/changelogs/AutoChangeLog-pr-3774.yml b/html/changelogs/AutoChangeLog-pr-3774.yml new file mode 100644 index 000000000000..8c6454b7a0bf --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3774.yml @@ -0,0 +1,4 @@ +author: "Cursor" +delete-after: True +changes: + - spellcheck: "Changed Chem Dispenser to Chemical Dispenser, added descriptions to the cryo cell, rail computer and chemical dispenser. Updated the descriptions for the Blood Dispenser and Dropship computer." \ No newline at end of file