Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Replaces flesh spiders with teratomas! #2894

Merged
merged 31 commits into from
Sep 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
03fd28a
teratomas
Absolucy Jul 29, 2024
5ac63a2
Merge branch 'master' of https://github.com/Monkestation/Monkestation…
Absolucy Jul 31, 2024
ab54263
teratoma more work
Absolucy Jul 31, 2024
4bdcc31
Merge branch 'master' of https://github.com/Monkestation/Monkestation…
Absolucy Aug 9, 2024
420588c
Don't let teratomas use mutation toxins
Absolucy Aug 9, 2024
5efe5a8
yay they work
Absolucy Aug 9, 2024
d11714c
Screenshot test
Absolucy Aug 9, 2024
58916bb
Merge branch 'master' of https://github.com/Monkestation/Monkestation…
Absolucy Aug 23, 2024
5b2e4f5
fixy wixy
Absolucy Aug 23, 2024
8450df7
Merge branch 'master' of https://github.com/Monkestation/Monkestation…
Absolucy Sep 4, 2024
289eec1
Merge branch 'master' of https://github.com/Monkestation/Monkestation…
Absolucy Sep 5, 2024
30e8fac
misc
Absolucy Sep 5, 2024
a779315
bweh
Absolucy Sep 5, 2024
ce53013
bleh bleh bleh
Absolucy Sep 5, 2024
38bb783
no greyscaling them!!!
Absolucy Sep 5, 2024
8c76a21
fu89efvuhfveduhjerfverufhjv
Absolucy Sep 5, 2024
379e195
screenshit tests
Absolucy Sep 6, 2024
8eee35b
blacklist teratoma parts from bioscrambler
Absolucy Sep 8, 2024
4d714ff
Merge branch 'master' of https://github.com/Monkestation/Monkestation…
Absolucy Sep 10, 2024
5d7d68a
no hair for teratomas (they are cursed to forever be ugly)
Absolucy Sep 10, 2024
fd43651
oh shit i forgot to give them the actual antag datum
Absolucy Sep 10, 2024
96c7739
BAZINGA
Absolucy Sep 11, 2024
dc9e7ad
Merge branch 'master' of https://github.com/Monkestation/Monkestation…
Absolucy Sep 11, 2024
ad42bed
Merge branch 'master' of https://github.com/Monkestation/Monkestation…
Absolucy Sep 13, 2024
91aad01
hacky tm workaround
Absolucy Sep 13, 2024
09ceda2
fix roundend report
Absolucy Sep 13, 2024
e9424a5
Ah eto, bleh?
Absolucy Sep 15, 2024
1867647
Merge branch 'master' of https://github.com/Monkestation/Monkestation…
Absolucy Sep 15, 2024
efa4819
Merge branch 'master' of https://github.com/Monkestation/Monkestation…
Absolucy Sep 26, 2024
1e264d7
fix teratoma screenshot test
Absolucy Sep 26, 2024
c762614
oops
Absolucy Sep 26, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Absolucy marked this conversation as resolved.
Show resolved Hide resolved
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
Loading