Skip to content

Scaling cap of sentient zombies to alive marines#18608

Open
mudzbe wants to merge 9 commits into
tgstation:masterfrom
mudzbe:zentient_scaling
Open

Scaling cap of sentient zombies to alive marines#18608
mudzbe wants to merge 9 commits into
tgstation:masterfrom
mudzbe:zentient_scaling

Conversation

@mudzbe

@mudzbe mudzbe commented Mar 21, 2026

Copy link
Copy Markdown
Contributor

About The Pull Request

Adds a scaling cap of sentient zombies to alive marines, there cannot be more than one possessed zombie for every 7 marines. So if there are less than 7, zombies cannot be possessed, at 7 marines there can be one zentient, at 14 there can be 2 zentients, etc.

Specifics of implementation:

  • Once a zombie is permad it's slot in the zentient count is removed, this means even if the zombie is dead they still count towards the cap until they are permad, giving in effect another cooldown towards possessing another zombie.
  • Ghosting removes them from the zentient list
  • Zombifying marines count towards the cap but can go over so they are not completely removed from the round if they want

Why It's Good For The Game

Having too many sentient zombies increases the difficulty, however sentient zombies by themselves increase the fun of the gamemode, they add a layer of dynamism that is unable to be replicated by AI. Possessing zombies is also fun in of itself. Therefore the gamemode should be balanced around having an acceptable amount of zentients without removing them entirely.

Changelog

🆑
balance: Adds a scaling cap of sentient zombies to alive marines, there cannot be more than one possessed zombie for every 7 marines
/:cl:

@github-actions github-actions Bot added the Balance Changes to functionality that modifies how effective certain methods are at powergaming. label Mar 21, 2026
@mudzbe mudzbe changed the title Scaling cap of SSD zombies to alive marines Scaling cap of sentient zombies to alive marines Mar 21, 2026

@Lumipharon Lumipharon left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Idea is good but there looks like there's a huge number of ways for this list to stop tracking accurately.
This should really be handled by signals or something, this is very snowflake right now.

Comment on lines +408 to +409
if(!iszombie(src) && !should_zombify)
offer_mob()

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't get this, shouldn't you just be setting should_offer_to_ghost to false if we don't want to offer it?

Comment on lines +416 to +417
if(client)
GLOB.possessed_sentient_zombie_list += src

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Isn't this going to trigger multiple times for the same mob?

Comment on lines +136 to +137
if(H in GLOB.possessed_sentient_zombie_list)
GLOB.possessed_sentient_zombie_list -= H

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

afaik there's no point in checking with in, since -= H will already search the list anyway, so this is just doing it twice.

Comment thread code/modules/mob/living/living_verbs.dm Outdated
Comment on lines +65 to +66
if(src in GLOB.possessed_sentient_zombie_list)
GLOB.possessed_sentient_zombie_list -= src

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same as above, also this is cursed because you're putting it in the verb instead of the actual ghostize proc.

@mudzbe mudzbe requested a review from Lumipharon April 18, 2026 13:22
@Lumipharon Lumipharon added the Do Not Merge Pull request should not be merged due to design conflict or being a temporary change. label Apr 20, 2026

@Lumipharon Lumipharon left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As mentioned on discord, this needs to be reworked to be clean, as this is adding mode specific code all over the place and has various missed scenarios that will break the functionality.

@mudzbe mudzbe requested a review from Lumipharon May 1, 2026 10:25
Comment on lines +415 to +416
if(client)
SEND_SIGNAL(SSdcs, COMSIG_MOB_POSSESSED, src)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you cannot send the same signal from different places.

/mob/proc/get_liquid_slowdown()
return MOB_WATER_SLOWDOWN

/mob/proc/can_take_mob(mob/M)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

autodoc

/// We start fading out the human and qdel them in set time
/datum/species/zombie/proc/fade_out_and_qdel_in(mob/living/carbon/human/H, time = 5 SECONDS)
GLOB.round_statistics.zombies_permad++
SEND_SIGNAL(SSdcs, COMSIG_MOB_GHOSTIZE, src, FALSE)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you cannot send the same signal from multiple places.

/datum/game_mode/infestation/crash/zombie/proc/on_attempt_possess_mob(datum/source, mob/possession, mob/M)
SIGNAL_HANDLER
if(!iszombie(possession))
return

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

return NONE, since this is a signal proc explicitly expecting a return value


message_admins(span_adminnotice("[owner.key] took control of [new_mob.name] as [new_mob.p_they()] was ssd."))
log_admin("[owner.key] took control of [new_mob.name] as [new_mob.p_they()] was ssd.")
SEND_SIGNAL(SSdcs, COMSIG_MOB_POSSESSED, new_mob)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this seems like either the wrong place to put this signal (i.e. why is it not on transfer_mob), or its incorrectly labelled.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Balance Changes to functionality that modifies how effective certain methods are at powergaming. Do Not Merge Pull request should not be merged due to design conflict or being a temporary change.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants