From 87f2e5aaedf218d5210d0673c95e41c11dac1ce0 Mon Sep 17 00:00:00 2001 From: ihatethisengine <115417687+ihatethisengine@users.noreply.github.com> Date: Sun, 13 Aug 2023 01:31:59 +0300 Subject: [PATCH] More Xeno Alliances Tweaks (#4053) # About the pull request 1) xeno_message no longer sends the message to allied hives. 2) All hive's alliances break on Queen's death (instead of essentially just ceasing to function). 3) If another hive breaks alliance with you, you break alliance with them automatically. 4) Some code improvements. # Explain why it's good for the game 1) Less confusing. I meant to add a "notify_allies" var to the proc, but I haven't found a single message that should be sent to allies. 2) Less confusing. Essentially all alliances already don't function if queen is dead, so this way it's just more clear for everyone. 3) You don't have to keep hive alliance status open all the time in case allied queen decides to betray you. Simply a QoL. 4) Just good # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: ihatethisengine add: All hive's alliances break on Queen's death. qol: If a hive breaks an alliance with another, the second hive also breaks the alliance. fix: xeno_message no longer sends the message to allied hives /:cl: --------- Co-authored-by: ihatethisengine Co-authored-by: harryob --- .../mob/living/carbon/xenomorph/XenoProcs.dm | 2 +- .../mob/living/carbon/xenomorph/death.dm | 1 + .../living/carbon/xenomorph/hive_faction.dm | 3 +- .../living/carbon/xenomorph/xeno_defines.dm | 40 ++++++++++++++----- 4 files changed, 34 insertions(+), 12 deletions(-) diff --git a/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm b/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm index 667367339698..37b0aa037cd1 100644 --- a/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm +++ b/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm @@ -18,7 +18,7 @@ if(SSticker.mode && SSticker.mode.xenomorphs.len) //Send to only xenos in our gamemode list. This is faster than scanning all mobs for(var/datum/mind/L in SSticker.mode.xenomorphs) var/mob/living/carbon/M = L.current - if(M && istype(M) && !M.stat && M.client && (!hivenumber || M.ally_of_hivenumber(hivenumber))) //Only living and connected xenos + if(M && istype(M) && !M.stat && M.client && (!hivenumber || M.hivenumber == hivenumber)) //Only living and connected xenos to_chat(M, SPAN_XENODANGER(" [message]")) //Sends a maptext alert to our currently selected squad. Does not make sound. diff --git a/code/modules/mob/living/carbon/xenomorph/death.dm b/code/modules/mob/living/carbon/xenomorph/death.dm index ea73f8999e6c..56f9460f5c71 100644 --- a/code/modules/mob/living/carbon/xenomorph/death.dm +++ b/code/modules/mob/living/carbon/xenomorph/death.dm @@ -69,6 +69,7 @@ if(!QDELETED(Q) && Q != src && Q.hivenumber == hivenumber) hive.set_living_xeno_queen(Q) break + hive.on_queen_death() hive.handle_xeno_leader_pheromones() if(SSticker.mode) INVOKE_ASYNC(SSticker.mode, TYPE_PROC_REF(/datum/game_mode, check_queen_status), hivenumber) diff --git a/code/modules/mob/living/carbon/xenomorph/hive_faction.dm b/code/modules/mob/living/carbon/xenomorph/hive_faction.dm index 10af37b8d8e8..e16a5cccd915 100644 --- a/code/modules/mob/living/carbon/xenomorph/hive_faction.dm +++ b/code/modules/mob/living/carbon/xenomorph/hive_faction.dm @@ -56,6 +56,5 @@ GLOBAL_LIST_INIT(hive_alliable_factions, generate_alliable_factions()) return var/should_ally = text2num(params["should_ally"]) - assoc_hive.allies[params["target_faction"]] = should_ally - assoc_hive.on_stance_change(params["target_faction"]) + assoc_hive.change_stance(params["target_faction"], should_ally) . = TRUE diff --git a/code/modules/mob/living/carbon/xenomorph/xeno_defines.dm b/code/modules/mob/living/carbon/xenomorph/xeno_defines.dm index 8a1f0ce00f3b..c2bf91edde6e 100644 --- a/code/modules/mob/living/carbon/xenomorph/xeno_defines.dm +++ b/code/modules/mob/living/carbon/xenomorph/xeno_defines.dm @@ -1390,13 +1390,32 @@ /datum/hive_status/corrupted/renegade/faction_is_ally(faction, ignore_queen_check = TRUE) return ..() -/datum/hive_status/proc/on_stance_change(faction) - if(!living_xeno_queen) +/datum/hive_status/proc/on_queen_death() //break alliances on queen's death + if(allow_no_queen_actions || living_xeno_queen) return - if(allies[faction]) - xeno_message(SPAN_XENOANNOUNCE("Your Queen set up an alliance with [faction]!"), 3, hivenumber) - else - xeno_message(SPAN_XENOANNOUNCE("Your Queen broke the alliance with [faction]!"), 3, hivenumber) + var/broken_alliances = FALSE + for(var/faction in allies) + if(!allies[faction]) + continue + change_stance(faction, FALSE) + broken_alliances = TRUE + + + if(broken_alliances) + xeno_message(SPAN_XENOANNOUNCE("With the death of the Queen, all alliances have been broken."), 3, hivenumber) + +/datum/hive_status/proc/change_stance(faction, should_ally) + if(faction == name) + return + if(allies[faction] == should_ally) + return + allies[faction] = should_ally + + if(living_xeno_queen) + if(allies[faction]) + xeno_message(SPAN_XENOANNOUNCE("Your Queen set up an alliance with [faction]!"), 3, hivenumber) + else + xeno_message(SPAN_XENOANNOUNCE("Your Queen broke the alliance with [faction]!"), 3, hivenumber) for(var/number in GLOB.hive_datum) var/datum/hive_status/target_hive = GLOB.hive_datum[number] @@ -1405,12 +1424,15 @@ if(!target_hive.living_xeno_queen && !target_hive.allow_no_queen_actions) return if(allies[faction]) - xeno_message(SPAN_XENOANNOUNCE("You sense that [name] Queen set up an alliance with us!"), 3, target_hive.hivenumber) + xeno_message(SPAN_XENOANNOUNCE("You sense that [name] [living_xeno_queen ? "Queen " : ""]set up an alliance with us!"), 3, target_hive.hivenumber) return - xeno_message(SPAN_XENOANNOUNCE("You sense that [name] Queen broke the alliance with us!"), 3, target_hive.hivenumber) + xeno_message(SPAN_XENOANNOUNCE("You sense that [name] [living_xeno_queen ? "Queen " : ""]broke the alliance with us!"), 3, target_hive.hivenumber) + if(target_hive.allies[name]) //autobreak alliance on betrayal + target_hive.change_stance(name, FALSE) + -/datum/hive_status/corrupted/on_stance_change(faction) +/datum/hive_status/corrupted/change_stance(faction, should_ally) . = ..() if(allies[faction]) return