From 24adc2268ba6e63047c1d8fe5f4984f85eef58d7 Mon Sep 17 00:00:00 2001 From: AlaunusLux <89751433+AlaunusLux@users.noreply.github.com> Date: Thu, 5 Feb 2026 05:33:56 -0600 Subject: [PATCH] Various player greimorian fixes, gives greimorian queen an attack reach of two (#21166) Most of these are self explanatory. Servants should be able to see in the dark. They should not speak TCB. The user should get feedback if a skill fails. The icon state shouldn't be set to resting if the simple mob AI will take back over (which it does), though I'm not a huge fan of the way I solved that one - should it be a more generic var like `should_not_sleep` on simple mobs? Then it would need a typecast as well. The first big change here is removing `environment_smash` from the `attack_generic` proc. As far as I can tell, this variable is almost entirely deprecated. I only saw one check relying on it, in `/obj/structure/closet/statue/attack_generic(var/mob/user, damage, attacktext, environment_smash)`, but when I tried to spawn one it was invisible, so I assume that is also something that is mostly deprecated. As such, I removed the variable from the function call, lining its arguments back up with what the function is expecting. Maybe I should've done named arguments here, but given that there's only that one function that expects it, I just removed it. The second big change is giving the Greimorian Queen reach on its melee attacks. I was mostly trying to fix the case where the queen can't attack a mob to its north, due to the mob being covered by the queen's icon. Attacking two tiles away looks fine when the queen is facing north, but facing south it looks not great. Directly East and West are usually okay, though it depends exactly which tile is being attacked. I did also duplicate a function, which I'm not a fan of. Perhaps `attack_can_reach` should be made more generic. Let me know the best place to do that, if so. I'm not completely sold on adding the reach in its current form: Aside from the top center 3 and the two furthest east and west, it reaches way too far without good visual feedback that it can/is doing so, especially the bottom ones and corners. https://github.com/user-attachments/assets/a2b95cee-fe2d-4bc6-bf43-2e5b6e2e8f86 --- code/_onclick/click.dm | 3 +- code/game/objects/effects/spiders.dm | 2 +- .../mob/abstract/ghost/observer/observer.dm | 3 +- .../simple_animal/hostile/giant_spider.dm | 10 +++ .../simple_animal/hostile/spider_queen.dm | 1 + .../mob/living/simple_animal/simple_animal.dm | 11 ++++ .../AlaunusLux-various-greimorian-fixes.yml | 63 +++++++++++++++++++ 7 files changed, 90 insertions(+), 3 deletions(-) create mode 100644 html/changelogs/AlaunusLux-various-greimorian-fixes.yml diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 9dc2e47db3b..7f989b82c03 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -173,11 +173,12 @@ if(!isturf(loc)) // This is going to stop you from telekinesing from inside a closet, but I don't shed many tears for that return + var/mob/living/simple_animal/simple_mob = istype(src, /mob/living/simple_animal) ? src : null //Atoms on turfs (not on your person) // A is a turf or is on a turf, or in something on a turf (pen in a box); but not something in something on a turf (pen in a box in a backpack) sdepth = A.storage_depth_turf() if(isturf(A) || isturf(A.loc) || (sdepth != -1 && sdepth <= 1)) - if(A.Adjacent(src) || (W && W.attack_can_reach(src, A, W.reach)) ) // see adjacent.dm + if(A.Adjacent(src) || (W && W.attack_can_reach(src, A, W.reach)) || (simple_mob && simple_mob.attack_can_reach(src, A, simple_mob.melee_reach))) // see adjacent.dm if(W) // Return 1 in attackby() to prevent afterattack() effects (when safely moving items for example) var/resolved = W.resolve_attackby(A,src, params) diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 384f0507e1c..533c33f3a3b 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -74,7 +74,7 @@ return TRUE if(mover?.movement_type & PHASING) return TRUE - if(istype(mover, /mob/living/simple_animal/hostile/giant_spider)) + if(istype(mover, /mob/living/simple_animal/hostile/giant_spider) || (mover.pulledby && istype(mover.pulledby, /mob/living/simple_animal/hostile/giant_spider))) return TRUE else if(istype(mover, /mob/living)) if(prob(50)) diff --git a/code/modules/mob/abstract/ghost/observer/observer.dm b/code/modules/mob/abstract/ghost/observer/observer.dm index a360afa2762..ab84dec686f 100644 --- a/code/modules/mob/abstract/ghost/observer/observer.dm +++ b/code/modules/mob/abstract/ghost/observer/observer.dm @@ -188,7 +188,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost, you won't be able to play this round for another [GLOB.config.respawn_delay] minutes! You can't change your mind so choose wisely!)", "Are you sure you want to ghost?", "Ghost", "Stay in body") if(response != "Ghost") return - resting = 1 + if(!istype(usr, /mob/living/simple_animal/hostile/giant_spider/nurse/spider_queen)) + resting = 1 var/turf/location = get_turf(src) message_admins("[key_name_admin(usr)] has ghosted. (JMP)") log_game("[key_name_admin(usr)] has ghosted.") diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index d21ac777071..67e18c6dd58 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -86,6 +86,7 @@ speed = -2 venom_type = /singleton/reagent/toxin/greimorian_eggs fed = 1 + lighting_alpha = LIGHTING_PLANE_ALPHA_SOMEWHAT_INVISIBLE var/playable = TRUE sample_data = list("Genetic markers identified as being linked with stem cell differentiaton", "Cellular structures indicative of high offspring production", "Tissue sample contains high neural cell content") @@ -165,6 +166,8 @@ get_light_and_color(parent) add_language(LANGUAGE_GREIMORIAN) add_language(LANGUAGE_GREIMORIAN_HIVEMIND) + remove_language(LANGUAGE_TCB) + default_language = GLOB.all_languages[LANGUAGE_GREIMORIAN] /mob/living/simple_animal/hostile/giant_spider/nurse/servant/Initialize() . = ..() @@ -418,6 +421,10 @@ set desc = "Lay a clutch of eggs to make new spiderlings. This will cost one food point." set category = "Greimorian" + if(fed <= 0) + to_chat(src, SPAN_WARNING("You do not have the nutrients to do this. Try cocooning a corpse!")) + return + var/obj/effect/spider/eggcluster/E = locate() in get_turf(src) if(!E && fed > 0) src.visible_message("\The [src] begins to lay a cluster of eggs.") @@ -433,6 +440,9 @@ set desc = "Lay a greimorian servant, which can be player-controlled. This will cost one food point." set category = "Greimorian" + if(fed <= 0) + to_chat(src, SPAN_WARNING("You do not have the nutrients to do this. Try cocooning a corpse!")) + return var/obj/effect/spider/eggcluster/E = locate() in get_turf(src) if(!E && fed > 0) diff --git a/code/modules/mob/living/simple_animal/hostile/spider_queen.dm b/code/modules/mob/living/simple_animal/hostile/spider_queen.dm index ecad360d847..a7732fdaa5c 100644 --- a/code/modules/mob/living/simple_animal/hostile/spider_queen.dm +++ b/code/modules/mob/living/simple_animal/hostile/spider_queen.dm @@ -26,6 +26,7 @@ health = 1000 melee_damage_lower = 35 melee_damage_upper = 40 + melee_reach = 2 armor_penetration = 30 resist_mod = 15 // LOL good luck pal heat_damage_per_tick = 20 diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 61227d41fbe..0f92e9e049a 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -118,6 +118,7 @@ //LETTING SIMPLE ANIMALS ATTACK? WHAT COULD GO WRONG. Defaults to zero so Ian can still be cuddly var/melee_damage_lower = 0 var/melee_damage_upper = 0 + var/melee_reach = 1 var/armor_penetration = 0 var/attack_flags = 0 var/attacktext = "attacked" @@ -1121,6 +1122,16 @@ visible_message(SPAN_NOTICE("\The [src] fades away!")) qdel(src) +//Taken from /obj/item/proc/attack_can_reach +/mob/living/simple_animal/proc/attack_can_reach(var/atom/us, var/atom/them, var/range) + if(us.Adjacent(them)) + return TRUE // Already adjacent. + else if(range <= 1) + return FALSE + if(AStar(get_turf(us), get_turf(them), /turf/proc/AdjacentTurfsRanged, /turf/proc/Distance, max_nodes=25, max_node_depth=range)) + return TRUE + return FALSE + #undef BLOOD_NONE #undef BLOOD_LIGHT #undef BLOOD_MEDIUM diff --git a/html/changelogs/AlaunusLux-various-greimorian-fixes.yml b/html/changelogs/AlaunusLux-various-greimorian-fixes.yml new file mode 100644 index 00000000000..8bf5f6ea5d1 --- /dev/null +++ b/html/changelogs/AlaunusLux-various-greimorian-fixes.yml @@ -0,0 +1,63 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# - (fixes bugs) +# wip +# - (work in progress) +# qol +# - (quality of life) +# soundadd +# - (adds a sound) +# sounddel +# - (removes a sound) +# rscadd +# - (adds a feature) +# rscdel +# - (removes a feature) +# imageadd +# - (adds an image or sprite) +# imagedel +# - (removes an image or sprite) +# spellcheck +# - (fixes spelling or grammar) +# experiment +# - (experimental change) +# balance +# - (balance changes) +# code_imp +# - (misc internal code change) +# refactor +# - (refactors code) +# config +# - (makes a change to the config files) +# admin +# - (makes changes to administrator tools) +# server +# - (miscellaneous changes to server) +################################# + +# Your name. +author: AlaunusLux + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. +# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. +changes: + - balance: "Greimorian servants can now see in the dark." + - balance: "Things pulled by greimorians will always pass through webs." + - qol: "Greimorians attempting to lay eggs or a servant now get feedback if it fails." + - experiment: "Gives Greimorian Queens a melee attack reach of two tiles." + - bugfix: "Greimorian servants can no longer speak Tau Ceti Basic." + - bugfix: "Fixes Greimorian Queen icon state being set to resting if the controlling player ghosts."