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

Adds the Super Syndie-Kitty Ears for 16 TC (+ minor super kitty ear changes) #5290

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
9 changes: 8 additions & 1 deletion code/__DEFINES/is_helpers.dm
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,14 @@ GLOBAL_LIST_INIT(turfs_openspace, typecacheof(list(

#define isdrone(A) (istype(A, /mob/living/basic/drone))

#define iscat(A) (istype(A, /mob/living/simple_animal/pet/cat))
GLOBAL_LIST_INIT(cat_typecache, typecacheof(list(
/mob/living/simple_animal/pet/cat,
/mob/living/simple_animal/hostile/syndicat,
/mob/living/simple_animal/hostile/feral,
/mob/living/simple_animal/hostile/feraltabby,
)))

#define iscat(A) (is_type_in_typecache(A, GLOB.cat_typecache))

#define isdog(A) (istype(A, /mob/living/basic/pet/dog))

Expand Down
3 changes: 3 additions & 0 deletions code/__DEFINES/~monkestation/lighting.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#define LIGHTING_CUTOFF_FELINE_RED 45
#define LIGHTING_CUTOFF_FELINE_GREEN 50
#define LIGHTING_CUTOFF_FELINE_BLUE 40
2 changes: 1 addition & 1 deletion code/_onclick/hud/fullscreen.dm
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@

screens -= category

if(animated)
if(!QDELETED(src) && animated)
animate(screen, alpha = 0, time = animated)
addtimer(CALLBACK(src, PROC_REF(clear_fullscreen_after_animate), screen), animated, TIMER_CLIENT_TIME)
else
Expand Down
4 changes: 4 additions & 0 deletions code/modules/spells/spell_types/shapeshift/_shape_status.dm
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@
return ..()

/datum/status_effect/shapechange_mob/on_apply()
// monkestation start: always use caster's gender for the mob
owner.gender = caster_mob.gender
owner.regenerate_icons()
// monkestation end
caster_mob.mind?.transfer_to(owner)
caster_mob.forceMove(owner)
ADD_TRAIT(caster_mob, TRAIT_NO_TRANSFORM, TRAIT_STATUS_EFFECT(id))
Expand Down
3 changes: 2 additions & 1 deletion code/modules/unit_tests/simple_animal_freeze.dm
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@
/mob/living/simple_animal/pet/gondola/virtual_domain,
/mob/living/simple_animal/soulscythe,

//MONKESTATION-SPECIFIC ENTRIES END
//MONKESTATION-SPECIFIC ENTRIES START
/mob/living/simple_animal/bot/buttbot,
/mob/living/simple_animal/bot/secbot/beepsky/big,
/mob/living/simple_animal/fish,
Expand All @@ -109,6 +109,7 @@
/mob/living/simple_animal/hostile/illusion/khan_warrior,
/mob/living/simple_animal/hostile/megafauna/wendigo/monkestation_override,
/mob/living/simple_animal/hostile/syndicat,
/mob/living/simple_animal/hostile/syndicat/super,
/mob/living/simple_animal/pet/cat/breadcat/super,
/mob/living/simple_animal/pet/cat/original/super,
/mob/living/simple_animal/pet/cat/super,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,59 +1,124 @@
/// How much health super kitties have by default.
#define SUPER_KITTY_HEALTH 50
/// How much health syndicate super kitties have by default.
#define SYNDIE_SUPER_KITTY_HEALTH 80

/obj/item/organ/internal/ears/cat/super
name = "Super Kitty Ears"
desc = "A pair of kitty ears that harvest the true energy of cats. Mrow!"
icon_state = "superkitty"
decay_factor = 0 // Space ruin item
damage_multiplier = 0.5 // SUPER
organ_flags = ORGAN_HIDDEN
organ_traits = list(TRAIT_CAT)
/// The instance of kitty form spell given to the user.
/// The spell will be initialized using the initial typepath.
var/datum/action/cooldown/spell/shapeshift/kitty/kitty_spell = /datum/action/cooldown/spell/shapeshift/kitty

/datum/action/cooldown/spell/shapeshift/kitty
name = "KITTY POWER!!"
desc = "Take on the shape of a kitty cat! Gain their powers at a loss of vitality."
/obj/item/organ/internal/ears/cat/super/Initialize(mapload)
if(ispath(kitty_spell))
kitty_spell = new kitty_spell(src)
else
stack_trace("kitty_spell is invalid typepath ([kitty_spell || "null"])")
return ..()

cooldown_time = 20 SECONDS
invocation = "MRR MRRRW!!"
invocation_type = INVOCATION_SHOUT
spell_requirements = SPELL_REQUIRES_NO_ANTIMAGIC
/obj/item/organ/internal/ears/cat/super/Destroy()
QDEL_NULL(kitty_spell)
return ..()

possible_shapes = list(
/mob/living/simple_animal/pet/cat/super,
/mob/living/simple_animal/pet/cat/super,
/mob/living/simple_animal/pet/cat/super,
)

// Stole this from demon heart hard, but hey it works
/obj/item/organ/internal/ears/cat/super/attack(mob/target_mob, mob/living/carbon/user, obj/target)
if(target_mob != user)
if(target_mob != user || !implant_on_use(user))
return ..()

/obj/item/organ/internal/ears/cat/super/attack_self(mob/user, modifiers)
implant_on_use(user)
return ..()

/obj/item/organ/internal/ears/cat/super/on_insert(mob/living/carbon/ear_owner)
. = ..()
kitty_spell.Grant(ear_owner)

/obj/item/organ/internal/ears/cat/super/on_remove(mob/living/carbon/ear_owner, special = FALSE)
. = ..()
kitty_spell.Remove(ear_owner)

// Stole this from demon heart hard, but hey it works
/obj/item/organ/internal/ears/cat/super/proc/implant_on_use(mob/living/carbon/user)
if(!iscarbon(user) || !user.is_holding(src))
return FALSE
user.visible_message(
span_warning("[user] raises the [src] to [user.p_their()] head and genetly places it on [user.p_their()] head!"),
span_danger("A strange feline comes over you. You place the [src] on your head!"),
span_warning("[user] raises \the [src] to [user.p_their()] head and gently places it on [user.p_their()] head!"),
span_danger("A strange feline comes over you. You place \the [src] on your head!"),
)
playsound(user, 'sound/effects/meow1.ogg', 50, TRUE)

user.visible_message(
span_warning("The [src] melt into [user]'s head!"),
span_warning("\The [src] melt into [user]'s head!"),
span_userdanger("Everything is so much louder!"),
)

user.temporarilyRemoveItemFromInventory(src, TRUE)
src.Insert(user)
user.temporarilyRemoveItemFromInventory(src, force = TRUE)
Insert(user)
return TRUE

/obj/item/organ/internal/ears/cat/super/on_insert(mob/living/carbon/heart_owner)
. = ..()
var/datum/action/cooldown/spell/shapeshift/kitty/heart = new(heart_owner)
heart.Grant(heart_owner)
/datum/action/cooldown/spell/shapeshift/kitty
name = "KITTY POWER!!"
desc = "Take on the shape of a kitty cat! Gain their powers at a loss of vitality."

/obj/item/organ/internal/ears/cat/super/on_remove(mob/living/carbon/heart_owner, special = FALSE)
. = ..()
var/datum/action/cooldown/spell/shapeshift/kitty/heart = locate() in heart_owner.actions
qdel(heart)
cooldown_time = 20 SECONDS
invocation = "MRR MRRRW!!"
invocation_type = INVOCATION_SHOUT
spell_requirements = SPELL_REQUIRES_NO_ANTIMAGIC

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If this does what i think it does (makes it so you can't cast it whilst you have an antimagic item such as a null rod) it might make it incompatible with being a chaplain. Since it's a self-transformation spell, wouldn't it be better to make it ignore antimagic?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I left that intentionally since for cat ears since I thought it'd be a nice way for people to stop them from transforming (without ripping the ears out or killing them)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I left that intentionally since for cat ears since I thought it'd be a nice way for people to stop them from transforming (without ripping the ears out or killing them)

The chaplain is never going to part with their null rod to let that happen and unless there is some other form of antimagic that i'm not aware of (that's not holymelons since those have to be held in hand) the only real way that you are containing someone with these is removing them. Also, i don't think sec would ever let them keep the ears if they are caught and known to have them either way.

Overall i think the benefit of making it so they ignore antimagic so chaplain traitors can use them outweighs the negatives of making them magic immune


possible_shapes = list(
/mob/living/simple_animal/pet/cat/super,
/mob/living/simple_animal/pet/cat/breadcat/super,
/mob/living/simple_animal/pet/cat/original/super,
)
keep_name = TRUE

/mob/living/simple_animal/pet/cat/super
health = 50
maxHealth = SUPER_KITTY_HEALTH
health = SUPER_KITTY_HEALTH
speed = 0
gold_core_spawnable = NO_SPAWN

/mob/living/simple_animal/pet/cat/breadcat/super
health = 50
maxHealth = SUPER_KITTY_HEALTH
health = SUPER_KITTY_HEALTH
speed = 0
gold_core_spawnable = NO_SPAWN

/mob/living/simple_animal/pet/cat/original/super
health = 50
maxHealth = SUPER_KITTY_HEALTH
health = SUPER_KITTY_HEALTH
speed = 0
gold_core_spawnable = NO_SPAWN

/obj/item/organ/internal/ears/cat/super/syndie
kitty_spell = /datum/action/cooldown/spell/shapeshift/kitty/syndie

/datum/action/cooldown/spell/shapeshift/kitty/syndie
name = "SYNDICATE KITTY POWER!!"
desc = "Take on the shape of an kitty cat, clad in blood-red armor! Gain their powers at a loss of vitality."
possible_shapes = list(/mob/living/simple_animal/hostile/syndicat/super)

/mob/living/simple_animal/hostile/syndicat/super
maxHealth = SYNDIE_SUPER_KITTY_HEALTH
health = SYNDIE_SUPER_KITTY_HEALTH
speed = 0
// it's clad in blood-red armor
damage_coeff = list(BRUTE = 0.8, BURN = 0.9, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
bodytemp_cold_damage_limit = -1
bodytemp_heat_damage_limit = INFINITY
unsuitable_atmos_damage = 0

/mob/living/simple_animal/hostile/syndicat/super/Initialize(mapload)
. = ..()
// get rid of the microbomb normal syndie cats have
for(var/obj/item/implant/explosive/implant_to_remove in implants)
qdel(implant_to_remove)

#undef SYNDIE_SUPER_KITTY_HEALTH
#undef SUPER_KITTY_HEALTH
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
/mob/living/simple_animal/pet/cat
lighting_cutoff_red = LIGHTING_CUTOFF_FELINE_RED
lighting_cutoff_green = LIGHTING_CUTOFF_FELINE_GREEN
lighting_cutoff_blue = LIGHTING_CUTOFF_FELINE_RED
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,13 @@
attack_sound = 'sound/weapons/slash.ogg'
attack_vis_effect = ATTACK_EFFECT_CLAW
footstep_type = FOOTSTEP_MOB_CLAW
lighting_cutoff_red = LIGHTING_CUTOFF_FELINE_RED
lighting_cutoff_green = LIGHTING_CUTOFF_FELINE_GREEN
lighting_cutoff_blue = LIGHTING_CUTOFF_FELINE_RED

/mob/living/simple_animal/hostile/syndicat/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT)
var/obj/item/implant/toinstall = list(/obj/item/implant/weapons_auth, /obj/item/implant/explosive)
for(var/obj/item/implant/original_implants as anything in toinstall)
var/obj/item/implant/copied_implant = new original_implants.type
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
/datum/action/cooldown/spell/shapeshift
/// If TRUE, the mob will keep the name of the caster.
var/keep_name = FALSE

/datum/action/cooldown/spell/shapeshift/do_shapeshift(mob/living/caster)
. = ..()
var/mob/living/new_form = .
if(istype(new_form) && keep_name)
new_form.real_name = caster.real_name
new_form.name = caster.real_name
new_form.update_name_tag()
12 changes: 12 additions & 0 deletions monkestation/code/modules/uplink/uplink_items/misc.dm
Original file line number Diff line number Diff line change
Expand Up @@ -36,3 +36,15 @@
purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
item = /obj/item/card/plasma_license
cost = 20

/datum/uplink_item/device_tools/super_kitty_ears
name = "Super Syndie-Kitty Ears"
desc = "Developed by several Interdyne Pharmaceutics scientists and Wizard Federation archmages during a record-breaking rager, \
this set of feline ears combines the finest of bio-engineering and thamaturgy to allow the user to transform to and from a cat at will, \
granting them all the benefits (and downsides) of being a true feline, such as ventcrawling. \
However, this form will be clad in blood-red Syndicate armor, making its origin somewhat obvious."
purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
item = /obj/item/organ/internal/ears/cat/super/syndie
cost = 16 // double the price of stealth implant
surplus = 5
limited_stock = 1
3 changes: 3 additions & 0 deletions tgstation.dme
Original file line number Diff line number Diff line change
Expand Up @@ -437,6 +437,7 @@
#include "code\__DEFINES\~monkestation\jobs.dm"
#include "code\__DEFINES\~monkestation\keybinding.dm"
#include "code\__DEFINES\~monkestation\level_traits.dm"
#include "code\__DEFINES\~monkestation\lighting.dm"
#include "code\__DEFINES\~monkestation\living.dm"
#include "code\__DEFINES\~monkestation\logging.dm"
#include "code\__DEFINES\~monkestation\maps.dm"
Expand Down Expand Up @@ -7710,6 +7711,7 @@
#include "monkestation\code\modules\mob\living\carbon\human\species_type\tundra_moths\tundramoths.dm"
#include "monkestation\code\modules\mob\living\silicon\death.dm"
#include "monkestation\code\modules\mob\living\simple_animal\bot\secbot.dm"
#include "monkestation\code\modules\mob\living\simple_animal\friendly\cat.dm"
#include "monkestation\code\modules\mob\living\simple_animal\hostile\feral.dm"
#include "monkestation\code\modules\mob\living\simple_animal\hostile\syndicat.dm"
#include "monkestation\code\modules\mob\living\simple_animal\megafauna\wendigo.dm"
Expand Down Expand Up @@ -8235,6 +8237,7 @@
#include "monkestation\code\modules\spells\spell_types\conjure_item\summon_mjollnir.dm"
#include "monkestation\code\modules\spells\spell_types\pointed\fire_ball.dm"
#include "monkestation\code\modules\spells\spell_types\pointed\smite.dm"
#include "monkestation\code\modules\spells\spell_types\shapeshift\_shapeshift.dm"
#include "monkestation\code\modules\spells\spell_types\touch\_touch.dm"
#include "monkestation\code\modules\store\admin\admin_coin_modification.dm"
#include "monkestation\code\modules\store\atm\_atm.dm"
Expand Down
Loading