Skip to content

Commit

Permalink
Replaces flesh spiders with teratomas! (#2894)
Browse files Browse the repository at this point in the history
* teratomas

* teratoma more work

* Don't let teratomas use mutation toxins

* yay they work

* Screenshot test

* fixy wixy

* misc

* bweh

* bleh bleh bleh

* no greyscaling them!!!

* fu89efvuhfveduhjerfverufhjv

* screenshit tests

* blacklist teratoma parts from bioscrambler

* no hair for teratomas (they are cursed to forever be ugly)

* oh shit i forgot to give them the actual antag datum

* BAZINGA

* hacky tm workaround

* fix roundend report

* Ah eto, bleh?

* fix teratoma screenshot test

* oops
  • Loading branch information
Absolucy committed Sep 26, 2024
1 parent b1c1a36 commit 80b4321
Show file tree
Hide file tree
Showing 13 changed files with 299 additions and 3 deletions.
1 change: 1 addition & 0 deletions code/__DEFINES/is_helpers.dm
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ GLOBAL_LIST_INIT(turfs_openspace, typecacheof(list(
#define isgoblin(A) (is_species(A, /datum/species/goblin)) //Monkestation Addition
#define isfloran(A) (is_species(A, /datum/species/floran)) //Monkestation Addition
#define isarachnid(A) (is_species(A, /datum/species/arachnid)) //Monkestation Addition
#define isteratoma(A) (is_species(A, /datum/species/teratoma)) //Monkestation Addition


//More carbon mobs
Expand Down
1 change: 1 addition & 0 deletions code/__DEFINES/mobs.dm
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@
#define SPECIES_GOBLIN "goblin" //Monkestation Addition
#define SPECIES_FLORAN "floran" //Monkestation Addition
#define SPECIES_SATYR "satyr" //Monkestation Addition
#define SPECIES_TERATOMA "teratoma" //Monkestation Addition
// Like species IDs, but not specifically attached a species.
#define BODYPART_ID_ALIEN "alien"
#define BODYPART_ID_ROBOTIC "robotic"
Expand Down
5 changes: 3 additions & 2 deletions code/__DEFINES/research/anomalies.dm
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,16 @@ GLOBAL_LIST_INIT(bioscrambler_parts_blacklist, typecacheof(list(
/obj/item/bodypart/leg/left/monkey,
/obj/item/bodypart/leg/right/monkey,
/obj/item/bodypart/leg/left/tallboy,
/obj/item/bodypart/leg/right/tallboy
/obj/item/bodypart/leg/right/tallboy,
)))

/// Blacklist of limb IDs which should not appear when bioscrambled, mostly because they looks awful and buggy.
GLOBAL_LIST_INIT(bioscrambler_limb_id_blacklist, list(
BODYPART_ID_PSYKER,
SPECIES_SIMIAN,
SPECIES_MONKEY,
SPECIES_GOBLIN
SPECIES_GOBLIN,
SPECIES_TERATOMA,
))

/// Blacklist of organs which should not appear when bioscrambled.
Expand Down
2 changes: 1 addition & 1 deletion code/__HELPERS/mobs.dm
Original file line number Diff line number Diff line change
Expand Up @@ -535,7 +535,7 @@ GLOBAL_LIST_EMPTY(species_list)

/proc/passtable_on(target, source)
var/mob/living/L = target
if (!HAS_TRAIT(L, TRAIT_PASSTABLE) && L.pass_flags & PASSTABLE)
if (!HAS_TRAIT(L, TRAIT_PASSTABLE) && (L.pass_flags & PASSTABLE))
ADD_TRAIT(L, TRAIT_PASSTABLE, INNATE_TRAIT)
ADD_TRAIT(L, TRAIT_PASSTABLE, source)
L.pass_flags |= PASSTABLE
Expand Down
2 changes: 2 additions & 0 deletions code/_globalvars/lists/poll_ignore.dm
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#define POLL_IGNORE_CONTRACTOR_SUPPORT "contractor_support"
#define POLL_IGNORE_CONSTRUCT "construct"
#define POLL_IGNORE_CORTICAL_BORER "cortical_borer" // MONKESTATION ADDITION -- CORTICAL_BORERS
#define POLL_IGNORE_TERATOMA "teratoma" // MONKESTATION ADDITION -- TERATOMAS
#define POLL_IGNORE_DRONE "drone"
#define POLL_IGNORE_FIRE_SHARK "fire_shark"
#define POLL_IGNORE_FUGITIVE "fugitive"
Expand Down Expand Up @@ -49,6 +50,7 @@ GLOBAL_LIST_INIT(poll_ignore_desc, list(
POLL_IGNORE_CONTRACTOR_SUPPORT = "Contractor Support Unit",
POLL_IGNORE_CONSTRUCT = "Construct",
POLL_IGNORE_CORTICAL_BORER = "Cortical Borer", // MONKESTATION ADDITION -- CORTICAL_BORERS
POLL_IGNORE_TERATOMA = "Teratoma", // MONKESTATION ADDITION -- TERATOMAS
POLL_IGNORE_DRONE = "Drone shells",
POLL_IGNORE_FIRE_SHARK = "Fire Shark",
POLL_IGNORE_FUGITIVE = "Fugitive Hunter",
Expand Down
2 changes: 2 additions & 0 deletions code/modules/antagonists/changeling/powers/spiders.dm
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
/* monkestation removal: replaced by teratomas in [monkestation\code\modules\antagonists\changeling\powers\teratomas.dm]
/datum/action/changeling/spiders
name = "Spread Infestation"
desc = "Our form divides, creating a cluster of eggs which will grow into a deadly arachnid. Costs 45 chemicals."
Expand All @@ -12,3 +13,4 @@
..()
new /obj/effect/mob_spawn/ghost_role/spider/bloody(user.loc)
return TRUE
*/
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
/datum/action/changeling/teratoma
name = "Birth Teratoma"
desc = "Our form divides, creating an egg that will soon hatch into a living tumor, fixated on causing mayhem."
helptext = "The tumor will not be loyal to us or our cause. Requires 3 changeling absorptions."
button_icon_state = "spread_infestation"
chemical_cost = 60
dna_cost = 2
req_absorbs = 3

/datum/action/changeling/teratoma/sting_action(mob/living/user)
..()
if(create_teratoma(user))
playsound(user.loc, 'sound/effects/blobattack.ogg', 50, 1)
user.spawn_gibs()
user.visible_message(span_danger("Something horrible bursts out of [user]'s chest!"), \
span_danger("Living teratoma bursts out of your chest!"), \
span_hear("You hear flesh tearing!"), COMBAT_MESSAGE_RANGE)
return FALSE //create_teratoma() handles the chemicals anyway so there is no reason to take them again

/datum/action/changeling/teratoma/proc/create_teratoma(mob/living/user)
var/datum/antagonist/changeling/ling = user?.mind?.has_antag_datum(/datum/antagonist/changeling)
if(!ling)
return FALSE
ling.adjust_chemicals(-chemical_cost)
var/list/candidates = SSpolling.poll_ghost_candidates(
"Do you want to play as a living teratoma?",
poll_time = 7.5 SECONDS,
ignore_category = POLL_IGNORE_TERATOMA,
alert_pic = /datum/antagonist/teratoma,
role_name_text = "living teratoma",
chat_text_border_icon = /datum/antagonist/teratoma,
)
if(!length(candidates)) //if we got at least one candidate, they're teratoma now
to_chat(user, span_warning("You fail at creating a tumor. Perhaps you should try again later?"))
ling.adjust_chemicals(chemical_cost)
return FALSE
var/mob/dead/observer/candidate = pick(candidates)
if(QDELETED(candidate))
to_chat(user, span_warning("You fail at creating a tumor. Perhaps you should try again later?"))
ling.adjust_chemicals(chemical_cost)
return FALSE
var/mob/living/carbon/human/species/teratoma/goober = new(user.drop_location())
goober.key = candidate.key
if(!goober.mind)
goober.mind_initialize()
goober.mind.add_antag_datum(/datum/antagonist/teratoma)
to_chat(goober, span_notice("You burst out from [user]'s chest!"))
SEND_SOUND(goober, sound('sound/effects/blobattack.ogg'))
return TRUE
54 changes: 54 additions & 0 deletions monkestation/code/modules/antagonists/teratoma/teratoma.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
/datum/team/teratoma
name = "Teratomas"
member_name = "teratoma"

/datum/antagonist/teratoma
name = "\improper Teratoma"
show_in_antagpanel = TRUE
antagpanel_category = ANTAG_GROUP_ABOMINATIONS
show_to_ghosts = TRUE
var/datum/team/teratoma/team

/datum/antagonist/teratoma/greet()
var/list/parts = list()
parts += span_big("You are a living teratoma!")
parts += span_changeling("By all means, you should not exist. <i>Your very existence is a sin against nature itself.</i>")
parts += span_changeling("You are loyal to <b>nobody</b>, except the forces of chaos itself.")
parts += span_info("You are able to easily vault tables and ventcrawl, however you cannot use many things like guns, batons, and you are also illiterate and quite fragile.")
parts += span_hypnophrase("<span style='font-size: 125%'>Spread misery and chaos upon the station.</span>")
to_chat(owner.current, examine_block(parts.Join("\n")), type = MESSAGE_TYPE_INFO)

/datum/antagonist/teratoma/can_be_owned(datum/mind/new_owner)
if(!isteratoma(new_owner.current))
return FALSE
return ..()

/datum/antagonist/teratoma/create_team(datum/team/teratoma/new_team)
var/static/datum/team/teratoma/main_teratoma_team
if(!new_team)
if(!main_teratoma_team)
main_teratoma_team = new
main_teratoma_team.add_objective(new /datum/objective/teratoma)
new_team = main_teratoma_team
if(!istype(new_team))
stack_trace("Wrong team type passed to [type] initialization.")
team = new_team
objectives |= team.objectives

/datum/antagonist/teratoma/get_team()
return team

/datum/antagonist/teratoma/get_base_preview_icon()
RETURN_TYPE(/icon)
var/static/icon/teratoma_icon
if(!teratoma_icon)
var/mob/living/carbon/human/species/teratoma/teratoma = new
teratoma.setDir(SOUTH)
teratoma_icon = getFlatIcon(teratoma, no_anim = TRUE)
QDEL_NULL(teratoma)
return teratoma_icon

/datum/objective/teratoma
name = "Spread misery and chaos"
explanation_text = "Spread misery and chaos upon the station."
completed = TRUE
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
/datum/species/teratoma
name = "Teratoma"
id = SPECIES_TERATOMA
bodytype = BODYTYPE_ORGANIC | BODYTYPE_MONKEY
mutanttongue = /obj/item/organ/internal/tongue/monkey
mutantbrain = /obj/item/organ/internal/brain/primate

species_traits = list(
NOAUGMENTS,
NOBLOODOVERLAY,
NOEYESPRITES,
NOTRANSSTING,
NOZOMBIE,
NO_DNA_COPY,
NO_UNDERWEAR,
)
inherent_traits = list(
TRAIT_BADDNA,
TRAIT_CAN_STRIP,
TRAIT_CHUNKYFINGERS,
TRAIT_EASILY_WOUNDED,
TRAIT_GENELESS,
TRAIT_ILLITERATE,
TRAIT_KLEPTOMANIAC,
TRAIT_NO_DNA_COPY,
TRAIT_NO_JUMPSUIT,
TRAIT_NO_ZOMBIFY,
TRAIT_PASSTABLE,
TRAIT_PRIMITIVE,
TRAIT_UNCONVERTABLE, // DEAR GOD NO
TRAIT_VAULTING,
TRAIT_VENTCRAWLER_ALWAYS,
TRAIT_WEAK_SOUL,
)

bodypart_overrides = list(
BODY_ZONE_CHEST = /obj/item/bodypart/chest/teratoma,
BODY_ZONE_HEAD = /obj/item/bodypart/head/teratoma,
BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/teratoma,
BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/teratoma,
BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/teratoma,
BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/teratoma,
)

maxhealthmod = 0.75
stunmod = 1.4
speedmod = -0.15 // stupid gremlins

no_equip_flags = ITEM_SLOT_ICLOTHING | ITEM_SLOT_OCLOTHING | ITEM_SLOT_GLOVES | ITEM_SLOT_FEET | ITEM_SLOT_SUITSTORE
changesource_flags = MIRROR_BADMIN
liked_food = MEAT | BUGS | GORE | GROSS | RAW
disliked_food = CLOTH
sexes = FALSE
species_language_holder = /datum/language_holder/monkey

fire_overlay = "monkey"
dust_anim = "dust-m"
gib_anim = "gibbed-m"

var/datum/component/omen/teratoma/misfortune

/datum/species/teratoma/on_species_gain(mob/living/carbon/human/idiot, datum/species/old_species, pref_load)
. = ..()
misfortune = idiot.AddComponent(/datum/component/omen/teratoma)
RegisterSignal(idiot, COMSIG_ATOM_EXPOSE_REAGENTS, PROC_REF(prevent_banned_reagent_exposure))

/datum/species/teratoma/on_species_loss(mob/living/carbon/human/idiot, datum/species/new_species, pref_load)
. = ..()
QDEL_NULL(misfortune)
UnregisterSignal(idiot, COMSIG_ATOM_EXPOSE_REAGENTS)

/datum/species/teratoma/random_name(gender, unique, lastname)
return "teratoma ([rand(1, 999)])"

// Don't let them use chems that could potential change them into something non-teratoma.
/datum/species/teratoma/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/goober, seconds_per_tick, times_fired)
if(is_banned_chem(chem))
chem.holder?.del_reagent(chem.type)
return TRUE
return ..()

// removes banned reagents from the list of reagents that'll be exposed
/datum/species/teratoma/proc/prevent_banned_reagent_exposure(datum/source, list/reagents, datum/reagents/holder, methods, volume_modifier, show_message)
SIGNAL_HANDLER
for(var/datum/reagent/reagent as anything in reagents)
if(is_banned_chem(reagent))
reagents -= reagent

/datum/species/teratoma/proc/is_banned_chem(reagent)
var/static/list/disallowed_chems_typecache
if(!disallowed_chems_typecache)
disallowed_chems_typecache = typecacheof(list(
/datum/reagent/aslimetoxin,
/datum/reagent/cyborg_mutation_nanomachines,
/datum/reagent/gluttonytoxin,
/datum/reagent/magillitis,
/datum/reagent/mulligan,
/datum/reagent/mutationtoxin,
/datum/reagent/xenomicrobes,
))
return is_type_in_typecache(reagent, disallowed_chems_typecache)

/datum/species/teratoma/get_scream_sound(mob/living/carbon/human/monkey)
return pick(
'sound/creatures/monkey/monkey_screech_1.ogg',
'sound/creatures/monkey/monkey_screech_2.ogg',
'sound/creatures/monkey/monkey_screech_3.ogg',
'sound/creatures/monkey/monkey_screech_4.ogg',
'sound/creatures/monkey/monkey_screech_5.ogg',
'sound/creatures/monkey/monkey_screech_6.ogg',
'sound/creatures/monkey/monkey_screech_7.ogg',
)

/datum/component/omen/teratoma
permanent = TRUE
luck_mod = 0.75
damage_mod = 0.2

/mob/living/carbon/human/species/teratoma
race = /datum/species/teratoma
62 changes: 62 additions & 0 deletions monkestation/code/modules/surgery/bodyparts/teratoma_bodyparts.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
/obj/item/bodypart/head/teratoma
icon_static = 'monkestation/icons/mob/species/teratoma/bodyparts.dmi'
icon_husk = 'icons/mob/species/monkey/bodyparts.dmi'
husk_type = "monkey"
limb_id = SPECIES_TERATOMA
is_dimorphic = FALSE
bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM
should_draw_greyscale = FALSE
head_flags = HEAD_LIPS | HEAD_DEBRAIN

dmg_overlay_type = "monkey"

/obj/item/bodypart/chest/teratoma
icon_static = 'monkestation/icons/mob/species/teratoma/bodyparts.dmi'
icon_husk = 'icons/mob/species/monkey/bodyparts.dmi'
husk_type = "monkey"
limb_id = SPECIES_TERATOMA
is_dimorphic = FALSE
bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM
should_draw_greyscale = FALSE

dmg_overlay_type = "monkey"

/obj/item/bodypart/arm/left/teratoma
icon_static = 'monkestation/icons/mob/species/teratoma/bodyparts.dmi'
icon_husk = 'icons/mob/species/monkey/bodyparts.dmi'
husk_type = "monkey"
limb_id = SPECIES_TERATOMA
bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM
should_draw_greyscale = FALSE

dmg_overlay_type = "monkey"

/obj/item/bodypart/arm/right/teratoma
icon_static = 'monkestation/icons/mob/species/teratoma/bodyparts.dmi'
icon_husk = 'icons/mob/species/monkey/bodyparts.dmi'
husk_type = "monkey"
limb_id = SPECIES_TERATOMA
bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM
should_draw_greyscale = FALSE

dmg_overlay_type = "monkey"

/obj/item/bodypart/leg/left/teratoma
icon_static = 'monkestation/icons/mob/species/teratoma/bodyparts.dmi'
icon_husk = 'icons/mob/species/monkey/bodyparts.dmi'
husk_type = "monkey"
limb_id = SPECIES_TERATOMA
bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM
should_draw_greyscale = FALSE
footprint_sprite = FOOTPRINT_SPRITE_PAWS

/obj/item/bodypart/leg/right/teratoma
icon_static = 'monkestation/icons/mob/species/teratoma/bodyparts.dmi'
icon_husk = 'icons/mob/species/monkey/bodyparts.dmi'
husk_type = "monkey"
limb_id = SPECIES_TERATOMA
bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM
should_draw_greyscale = FALSE
footprint_sprite = FOOTPRINT_SPRITE_PAWS

dmg_overlay_type = "monkey"
Binary file not shown.
4 changes: 4 additions & 0 deletions tgstation.dme
Original file line number Diff line number Diff line change
Expand Up @@ -6072,6 +6072,7 @@
#include "monkestation\code\modules\antagonists\brother\gear\_gear.dm"
#include "monkestation\code\modules\antagonists\brother\gear\misc.dm"
#include "monkestation\code\modules\antagonists\brother\gear\recipes.dm"
#include "monkestation\code\modules\antagonists\changeling\powers\teratomas.dm"
#include "monkestation\code\modules\antagonists\changeling\powers\tiny_prick.dm"
#include "monkestation\code\modules\antagonists\clock_cult\area.dm"
#include "monkestation\code\modules\antagonists\clock_cult\dynamic_ruleset.dm"
Expand Down Expand Up @@ -6210,6 +6211,7 @@
#include "monkestation\code\modules\antagonists\nukeop\nukeop.dm"
#include "monkestation\code\modules\antagonists\nukeop\equipment\nuclear_bomb\bee_nuke.dm"
#include "monkestation\code\modules\antagonists\space_ninja\space_ninja.dm"
#include "monkestation\code\modules\antagonists\teratoma\teratoma.dm"
#include "monkestation\code\modules\antagonists\traitor\traitor_objective.dm"
#include "monkestation\code\modules\antagonists\traitor\uplink_handler.dm"
#include "monkestation\code\modules\antagonists\traitor\objectives\kidnapping.dm"
Expand Down Expand Up @@ -7332,6 +7334,7 @@
#include "monkestation\code\modules\mob\living\carbon\human\species_type\shadowpeople.dm"
#include "monkestation\code\modules\mob\living\carbon\human\species_type\simian.dm"
#include "monkestation\code\modules\mob\living\carbon\human\species_type\skeletons.dm"
#include "monkestation\code\modules\mob\living\carbon\human\species_type\teratoma.dm"
#include "monkestation\code\modules\mob\living\carbon\human\species_type\zombies.dm"
#include "monkestation\code\modules\mob\living\silicon\death.dm"
#include "monkestation\code\modules\mob\living\simple_animal\megafauna\wendigo.dm"
Expand Down Expand Up @@ -7883,6 +7886,7 @@
#include "monkestation\code\modules\surgery\bodyparts\ethereal_bodyparts.dm"
#include "monkestation\code\modules\surgery\bodyparts\floran_bodyparts.dm"
#include "monkestation\code\modules\surgery\bodyparts\simian_bodyparts.dm"
#include "monkestation\code\modules\surgery\bodyparts\teratoma_bodyparts.dm"
#include "monkestation\code\modules\surgery\organs\augments.dm"
#include "monkestation\code\modules\surgery\organs\autosurgeon.dm"
#include "monkestation\code\modules\surgery\organs\external\anime.dm"
Expand Down

0 comments on commit 80b4321

Please sign in to comment.