Skip to content

Commit

Permalink
Dissection tweaks: I'm tired of the corpse pile (shiptest-ss13#2722)
Browse files Browse the repository at this point in the history
<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may
not be viewable. -->
<!-- You can view Contributing.MD for a detailed description of the pull
request process. -->

## About The Pull Request

Problem: people are dissecting well-documented life like common animals
and, distressingly, _human corpses._ Not only is this behavior odd,
cadaver disposal methods can end up being quite concerning. Or quite
concerningly non-instanced.

Solution: Dissections no longer provide points as a default for
animal/humanoid corpses, massively shortening the list of dissectable
things. Pod and jellypeople have also been removed from the modified
dissections table as people since they are both playable (pods less but
still) and slimes can show up as legion corpses.
In their place, crystal mobs, ancient goliaths, and elites/megafauna can
be dissected, since they are both unique and rare (relatively)

I also switched the dissection variant scaling to be fractional of the
expected maximum at advanced surgery/experimental tier dissection, since
that's what is going to be used throughout the majority of a round and
having the commonly used numbers more directly present makes for easier
balance checks.

New dissectable things at experimental dissection research outputs,
halve and quarter for thorough and base outputs respectively:
Megafauna: 60k, on par with xeno bodies. Since you can't drag these, a
clinic would have to be prepared on-site for the ones that leave a body
(dragon) to extract the full value, and they are both rare and more than
capable of killing a crew
Elites: 12k, uncommon spawn on some planets, can be lethal
crystal goliath: 10k, likely less lethal than the crystal legion but
still dangerous
mega arachnid, 8k, Appears in one ruin as a miniboss, rare enough it'd
be something to peek at
forgotten watcher: 6k, rare but relatively harmless compared to the
other crystal mobs (unless I'm missing something)
watcher variants: 4k, uncommon subspecies of watchers
ancient goliath: 4k, it's a remarkably old goliath, probably some value
there

## Why It's Good For The Game

Five. Hundred. Human bodies. In my medbay.

## Changelog

:cl:
add: ancient goliaths, crystal fauna (aside from legion), elites and
megafauna now have boosted dissection outputs
del: human corpses, podpeople, jellypeople and animal corpses can no
longer be dissected. What did you expect to find, an extra pair of
lungs?
/:cl:

<!-- Both :cl:'s are required for the changelog to work! You can put
your name to the right of the first :cl: if you want to overwrite your
GitHub username as author ingame. -->
<!-- You can use multiple of the same prefix (they're only used for the
icon ingame) and delete the unneeded ones. Despite some of the tags,
changelogs should generally represent how a player might be affected by
the changes rather than a summary of the PR's contents. -->

---------

Signed-off-by: Theos <[email protected]>
Co-authored-by: Mark Suckerberg <[email protected]>
  • Loading branch information
2 people authored and MysticalFaceLesS committed Mar 5, 2024
1 parent 9ee141f commit 0f2e877
Showing 1 changed file with 28 additions and 22 deletions.
50 changes: 28 additions & 22 deletions code/modules/surgery/experimental_dissection.dm
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#define BASE_HUMAN_REWARD 500
#define MAX_DISSECTION_REWARD 2000
#define EXPDIS_FAIL_MSG "<span class='notice'>You dissect [target], but do not find anything particularly interesting.</span>"
#define PUBLIC_TECHWEB_GAIN 0.6 //how many research points go directly into the main pool
#define PRIVATE_TECHWEB_GAIN (1 - PUBLIC_TECHWEB_GAIN) //how many research points go directly into the main pool
Expand All @@ -16,7 +16,7 @@
target_mobtypes = list(/mob/living) //Feel free to dissect devils but they're magic.
replaced_by = /datum/surgery/advanced/experimental_dissection/adv
requires_tech = FALSE
var/value_multiplier = 1
var/value_multiplier = 0.25

/datum/surgery/advanced/experimental_dissection/can_start(mob/user, mob/living/target)
. = ..()
Expand Down Expand Up @@ -45,31 +45,37 @@
user.visible_message("<span class='notice'>[user] starts dissecting [target].</span>", "<span class='notice'>You start dissecting [target].</span>")

/datum/surgery_step/dissection/proc/check_value(mob/living/target, datum/surgery/advanced/experimental_dissection/ED)
var/cost = BASE_HUMAN_REWARD
var/cost = 0
var/multi_surgery_adjust = 0

//determine bonus applied
var/static/list/mob_mult_list = list(/mob/living/simple_animal/hostile/asteroid/elite = 6,
/mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient/crystal = 5,
/mob/living/simple_animal/hostile/jungle/mega_arachnid = 4,
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/forgotten = 3,
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/icewing = 2,
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/magmawing = 2,
/mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient = 2
)
if(isalienqueen(target) || isalienroyal(target))
cost = (BASE_HUMAN_REWARD*38)
cost = (MAX_DISSECTION_REWARD*38)
else if(isalienadult(target))
cost = (BASE_HUMAN_REWARD*30)
else if(ismonkey(target))
cost = (BASE_HUMAN_REWARD*0.5)
cost = (MAX_DISSECTION_REWARD*30)
else if(isalien(target))
cost = (MAX_DISSECTION_REWARD*14)
else if(ismegafauna(target))
cost = (MAX_DISSECTION_REWARD*30)
else if(ishuman(target))
var/mob/living/carbon/human/H = target
if(H?.dna?.species)
if(isabductor(H))
cost = (BASE_HUMAN_REWARD*24)
cost = (MAX_DISSECTION_REWARD*24)
else if(iszombie(H) || isshadow(H) || isandroid(H))
cost = (BASE_HUMAN_REWARD*20)
else if(isjellyperson(H) || ispodperson(H) || isalien(H))
cost = (BASE_HUMAN_REWARD*14)
else if(isskeleton(H))
cost = (BASE_HUMAN_REWARD * 0.5)
else
cost = (BASE_HUMAN_REWARD * 0.5)


cost = (MAX_DISSECTION_REWARD*20)
else for(var/type in mob_mult_list) // THIS. ELSE IF(). ENDS. HERE.
if(istype(target, type))
cost = (MAX_DISSECTION_REWARD*mob_mult_list[type])
break

//now we do math for surgeries already done (no double dipping!).
for(var/i in typesof(/datum/surgery/advanced/experimental_dissection))
Expand All @@ -96,7 +102,7 @@
target.apply_damage(80, BRUTE, L)
ADD_TRAIT(target, TRAIT_DISSECTED, "[surgery.name]")
repeatable = FALSE
experience_given = max(points_earned/(BASE_HUMAN_REWARD/MEDICAL_SKILL_MEDIUM),1)
experience_given = max(points_earned/(MAX_DISSECTION_REWARD/MEDICAL_SKILL_MEDIUM),1)
return ..()

/datum/surgery_step/dissection/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
Expand All @@ -114,24 +120,24 @@

/datum/surgery/advanced/experimental_dissection/adv
name = "Thorough Dissection"
value_multiplier = 2
value_multiplier = 0.5
replaced_by = /datum/surgery/advanced/experimental_dissection/exp
requires_tech = TRUE

/datum/surgery/advanced/experimental_dissection/exp
name = "Experimental Dissection"
value_multiplier = 4
value_multiplier = 1
replaced_by = /datum/surgery/advanced/experimental_dissection/alien
requires_tech = TRUE

/datum/surgery/advanced/experimental_dissection/alien
name = "Extraterrestrial Dissection"
value_multiplier = 8
value_multiplier = 2
requires_tech = TRUE
replaced_by = null


#undef BASE_HUMAN_REWARD
#undef MAX_DISSECTION_REWARD
#undef EXPDIS_FAIL_MSG
#undef PUBLIC_TECHWEB_GAIN
#undef PRIVATE_TECHWEB_GAIN

0 comments on commit 0f2e877

Please sign in to comment.