Files
Bubberstation/code/modules/surgery/surgery_helpers.dm
Lucy 8a409ebe19 Alien operating tables now have a 20% surgery speed bonus (#87665)
## About The Pull Request

Alien operating tables (made by making a table frame with alien alloy,
then adding silver) now have a 20% surgery speed bonus, as compared to
normal operating tables.

I also refactored the `get_location_modifier` proc, it now uses a
"typecache" rather than a else-if locate tower.

## Why It's Good For The Game

Medbaymaxxing with alien tech is nice - and this somewhat cursed code is
still better than the else-if locate tower, honestly.

## Changelog
🆑
balance: Alien operating tables now have a 20% surgery speed bonus.
refactor: Refactored how table/bed surgery speed modifiers are
calculated, so it's hopefully more efficient now.
/🆑

---------

Co-authored-by: Kapu1178 <75460809+Kapu1178@users.noreply.github.com>
2024-11-04 22:42:13 -07:00

77 lines
2.6 KiB
Plaintext

/*
* Gets the surgery speed modifier for a given mob, based off what sort of table/bed/whatever is on their turf.
*/
/proc/get_location_modifier(mob/located_mob)
// Technically this IS a typecache, just not the usual kind :3
var/static/list/modifiers = zebra_typecacheof(list(
/obj/structure/table = 0.8,
/obj/structure/table/optable = 1,
/obj/structure/table/optable/abductor = 1.2,
/obj/machinery/stasis = 0.9,
/obj/structure/bed = 0.7,
))
. = 0.5
for(var/obj/thingy in get_turf(located_mob))
. = max(., modifiers[thingy.type])
/proc/get_location_accessible(mob/located_mob, location)
var/covered_locations = 0 //based on body_parts_covered
var/face_covered = 0 //based on flags_inv
var/eyesmouth_covered = 0 //based on flags_cover
if(iscarbon(located_mob))
var/mob/living/carbon/clothed_carbon = located_mob
for(var/obj/item/clothing/clothes in list(clothed_carbon.back, clothed_carbon.wear_mask, clothed_carbon.head))
covered_locations |= clothes.body_parts_covered
face_covered |= clothes.flags_inv
eyesmouth_covered |= clothes.flags_cover
if(ishuman(clothed_carbon))
var/mob/living/carbon/human/clothed_human = clothed_carbon
for(var/obj/item/clothes in list(clothed_human.wear_suit, clothed_human.w_uniform, clothed_human.shoes, clothed_human.belt, clothed_human.gloves, clothed_human.glasses, clothed_human.ears))
covered_locations |= clothes.body_parts_covered
face_covered |= clothes.flags_inv
eyesmouth_covered |= clothes.flags_cover
switch(location)
if(BODY_ZONE_HEAD)
if(covered_locations & HEAD)
return FALSE
if(BODY_ZONE_PRECISE_EYES)
if((face_covered & HIDEEYES) || (eyesmouth_covered & (MASKCOVERSEYES|HEADCOVERSEYES|GLASSESCOVERSEYES)))
return FALSE
if(BODY_ZONE_PRECISE_MOUTH)
if((face_covered & HIDEFACE) || (eyesmouth_covered & (MASKCOVERSMOUTH|HEADCOVERSMOUTH)))
return FALSE
if(BODY_ZONE_CHEST)
if(covered_locations & CHEST)
return FALSE
if(BODY_ZONE_PRECISE_GROIN)
if(covered_locations & GROIN)
return FALSE
if(BODY_ZONE_L_ARM)
if(covered_locations & ARM_LEFT)
return FALSE
if(BODY_ZONE_R_ARM)
if(covered_locations & ARM_RIGHT)
return FALSE
if(BODY_ZONE_L_LEG)
if(covered_locations & LEG_LEFT)
return FALSE
if(BODY_ZONE_R_LEG)
if(covered_locations & LEG_RIGHT)
return FALSE
if(BODY_ZONE_PRECISE_L_HAND)
if(covered_locations & HAND_LEFT)
return FALSE
if(BODY_ZONE_PRECISE_R_HAND)
if(covered_locations & HAND_RIGHT)
return FALSE
if(BODY_ZONE_PRECISE_L_FOOT)
if(covered_locations & FOOT_LEFT)
return FALSE
if(BODY_ZONE_PRECISE_R_FOOT)
if(covered_locations & FOOT_RIGHT)
return FALSE
return TRUE