From 703c27da7e998bcfdd832fd18e2217c12e3953b4 Mon Sep 17 00:00:00 2001 From: Heroman Date: Sun, 28 Apr 2019 15:10:06 +1000 Subject: [PATCH] Refactors shadekin --- code/__defines/chemistry_vr.dm | 3 +- code/_onclick/click.dm | 6 + code/_onclick/hud/ability_screen_objects.dm | 3 +- code/_onclick/hud/hud_vr.dm | 3 - code/datums/beam.dm | 12 + code/game/gamemodes/cult/cult_structures.dm | 12 + code/game/objects/effects/chem/foam.dm | 6 + .../effects/decals/Cleanable/humans.dm | 8 +- code/game/objects/effects/effect_system.dm | 6 + code/game/objects/effects/mines.dm | 6 + code/game/objects/effects/portals.dm | 6 + code/game/objects/effects/step_triggers.dm | 6 + code/game/objects/items/devices/PDA/PDA.dm | 6 + code/game/objects/items/toys.dm | 6 + .../game/objects/items/weapons/clown_items.dm | 12 + .../objects/items/weapons/material/shards.dm | 6 + code/game/objects/items/weapons/traps.dm | 6 + code/game/objects/structures/catwalk.dm | 6 + code/modules/assembly/holder.dm | 6 + code/modules/assembly/infrared.dm | 8 +- code/modules/assembly/mousetrap.dm | 6 + code/modules/hydroponics/grown.dm | 6 + .../spreading/spreading_response.dm | 6 + code/modules/mob/living/carbon/human/human.dm | 6 + .../living/carbon/human/human_defines_vr.dm | 8 + .../mob/living/carbon/human/human_movement.dm | 4 + code/modules/mob/living/carbon/human/life.dm | 5 + .../carbon/human/species/shadekin/shadekin.dm | 127 +++++--- .../species/shadekin/shadekin_abilities.dm | 296 ++++++++++++++++++ .../shadekin/shadekin_ability_objects.dm | 169 ---------- .../shadekin/shadekin_ability_procs.dm | 133 -------- .../human/species/shadekin/shadekin_hud.dm | 83 +++++ .../carbon/human/species/species_attack_vr.dm | 27 +- .../living/carbon/human/species/species_vr.dm | 1 + .../mob/living/carbon/human/update_icons.dm | 13 +- .../subtypes/animal/passive/mouse.dm | 6 + .../subtypes/vore/shadekin/ability_objects.dm | 5 +- code/modules/mob/mob_movement.dm | 5 + code/modules/organs/subtypes/shadekin.dm | 4 +- code/modules/organs/subtypes/standard_vr.dm | 3 + code/modules/projectiles/projectile.dm | 6 + icons/mob/species/shadekin/tail.dmi | Bin 0 -> 985 bytes vorestation.dme | 2 + 43 files changed, 686 insertions(+), 368 deletions(-) delete mode 100644 code/_onclick/hud/hud_vr.dm create mode 100644 code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm delete mode 100644 code/modules/mob/living/carbon/human/species/shadekin/shadekin_ability_objects.dm delete mode 100644 code/modules/mob/living/carbon/human/species/shadekin/shadekin_ability_procs.dm create mode 100644 code/modules/mob/living/carbon/human/species/shadekin/shadekin_hud.dm create mode 100644 icons/mob/species/shadekin/tail.dmi diff --git a/code/__defines/chemistry_vr.dm b/code/__defines/chemistry_vr.dm index 094bfc2139..f15ebd4a56 100644 --- a/code/__defines/chemistry_vr.dm +++ b/code/__defines/chemistry_vr.dm @@ -1,2 +1,3 @@ // More for our custom races -#define IS_CHIMERA 12 \ No newline at end of file +#define IS_CHIMERA 12 +#define IS_SHADEKIN 13 \ No newline at end of file diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 643ab6d790..b9a07a60f2 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -121,6 +121,12 @@ // A is a turf or is on a turf, or in something on a turf (pen in a box); but not something in something on a turf (pen in a box in a backpack) sdepth = A.storage_depth_turf() if(isturf(A) || isturf(A.loc) || (sdepth != -1 && sdepth <= 1)) + //VOREStation Edit begin: SHADEKIN + var/mob/SK = src + if(istype(SK)) + if(SK.shadekin_phasing_check()) + return + //VOREStation Edit end: SHADEKIN if(A.Adjacent(src) || (W && W.attack_can_reach(src, A, W.reach)) ) // see adjacent.dm if(W) // Return 1 in attackby() to prevent afterattack() effects (when safely moving items for example) diff --git a/code/_onclick/hud/ability_screen_objects.dm b/code/_onclick/hud/ability_screen_objects.dm index d29ef9dd96..1fa58ff1ab 100644 --- a/code/_onclick/hud/ability_screen_objects.dm +++ b/code/_onclick/hud/ability_screen_objects.dm @@ -180,7 +180,8 @@ /mob/New() ..() - ability_master = new /obj/screen/movable/ability_master(src) + if(!ability_master) //VOREStation Edit: S H A D E K I N + ability_master = new /obj/screen/movable/ability_master(src) ///////////ACTUAL ABILITIES//////////// //This is what you click to do things// diff --git a/code/_onclick/hud/hud_vr.dm b/code/_onclick/hud/hud_vr.dm deleted file mode 100644 index e5d8289576..0000000000 --- a/code/_onclick/hud/hud_vr.dm +++ /dev/null @@ -1,3 +0,0 @@ - - var/obj/screen/lingchemdisplay - var/obj/screen/wiz_instability_display \ No newline at end of file diff --git a/code/datums/beam.dm b/code/datums/beam.dm index 24f5e6c91f..88fe9dbf1c 100644 --- a/code/datums/beam.dm +++ b/code/datums/beam.dm @@ -138,6 +138,12 @@ return /obj/effect/ebeam/deadly/Crossed(atom/A) + //VOREStation Edit begin: SHADEKIN + var/mob/SK = A + if(istype(SK)) + if(SK.shadekin_phasing_check()) + return + //VOREStation Edit end: SHADEKIN ..() A.ex_act(1) @@ -157,6 +163,12 @@ on_contact(A) /obj/effect/ebeam/reactive/Crossed(atom/A) + //VOREStation Edit begin: SHADEKIN + var/mob/SK = A + if(istype(SK)) + if(SK.shadekin_phasing_check()) + return + //VOREStation Edit end: SHADEKIN ..() on_contact(A) diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm index c87427bc44..6de539b878 100644 --- a/code/game/gamemodes/cult/cult_structures.dm +++ b/code/game/gamemodes/cult/cult_structures.dm @@ -100,6 +100,12 @@ return /obj/effect/gateway/Crossed(AM as mob|obj) + //VOREStation Edit begin: SHADEKIN + var/mob/SK = AM + if(istype(SK)) + if(SK.shadekin_phasing_check()) + return + //VOREStation Edit end: SHADEKIN spawn(0) return return @@ -132,6 +138,12 @@ qdel(src) /obj/effect/gateway/active/Crossed(var/atom/A) + //VOREStation Edit begin: SHADEKIN + var/mob/SK = A + if(istype(SK)) + if(SK.shadekin_phasing_check()) + return + //VOREStation Edit end: SHADEKIN if(!istype(A, /mob/living)) return diff --git a/code/game/objects/effects/chem/foam.dm b/code/game/objects/effects/chem/foam.dm index f32a75dcce..d3ee736251 100644 --- a/code/game/objects/effects/chem/foam.dm +++ b/code/game/objects/effects/chem/foam.dm @@ -74,6 +74,12 @@ qdel(src) /obj/effect/effect/foam/Crossed(var/atom/movable/AM) + //VOREStation Edit begin: SHADEKIN + var/mob/SK = AM + if(istype(SK)) + if(SK.shadekin_phasing_check()) + return + //VOREStation Edit end: SHADEKIN if(metal) return if(istype(AM, /mob/living)) diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 3b1584ca19..c71eec656f 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -53,7 +53,7 @@ var/global/list/image/splatter_cache=list() blood_DNA |= B.blood_DNA.Copy() qdel(B) drytime = world.time + DRYING_TIME * (amount+1) - START_PROCESSING(SSobj, src) + START_PROCESSING(SSobj, src) /obj/effect/decal/cleanable/blood/process() if(world.time > drytime) @@ -70,6 +70,12 @@ var/global/list/image/splatter_cache=list() desc = initial(desc) /obj/effect/decal/cleanable/blood/Crossed(mob/living/carbon/human/perp) + //VOREStation Edit begin: SHADEKIN + var/mob/SK = perp + if(istype(SK)) + if(SK.shadekin_phasing_check()) + return + //VOREStation Edit end: SHADEKIN if (!istype(perp)) return if(amount < 1) diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index f21d6443fb..a827393dfb 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -185,6 +185,12 @@ steam.start() -- spawns the effect qdel(src) /obj/effect/effect/smoke/Crossed(mob/living/carbon/M as mob ) + //VOREStation Edit begin: SHADEKIN + var/mob/SK = M + if(istype(SK)) + if(SK.shadekin_phasing_check()) + return + //VOREStation Edit end: SHADEKIN ..() if(istype(M)) affect(M) diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 87af3ec90b..fb4117ef44 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -36,6 +36,12 @@ ..() /obj/effect/mine/Crossed(AM as mob|obj) + //VOREStation Edit begin: SHADEKIN + var/mob/SK = AM + if(istype(SK)) + if(SK.shadekin_phasing_check()) + return + //VOREStation Edit end: SHADEKIN Bumped(AM) /obj/effect/mine/Bumped(mob/M as mob|obj) diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index 7dc82a0ffb..5ba58dc4e0 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -21,6 +21,12 @@ GLOBAL_LIST_BOILERPLATE(all_portals, /obj/effect/portal) return /obj/effect/portal/Crossed(AM as mob|obj) + //VOREStation Edit begin: SHADEKIN + var/mob/SK = AM + if(istype(SK)) + if(SK.shadekin_phasing_check()) + return + //VOREStation Edit end: SHADEKIN if(istype(AM,/mob) && !(istype(AM,/mob/living))) return //do not send ghosts, zshadows, ai eyes, etc spawn(0) diff --git a/code/game/objects/effects/step_triggers.dm b/code/game/objects/effects/step_triggers.dm index b5345cc8eb..f69cb901c2 100644 --- a/code/game/objects/effects/step_triggers.dm +++ b/code/game/objects/effects/step_triggers.dm @@ -11,6 +11,12 @@ return 0 /obj/effect/step_trigger/Crossed(H as mob|obj) + //VOREStation Edit begin: SHADEKIN + var/mob/SK = H + if(istype(SK)) + if(SK.shadekin_phasing_check()) + return + //VOREStation Edit end: SHADEKIN ..() if(!H) return diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index c2a77936c4..aef6825fdf 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -1480,6 +1480,12 @@ var/global/list/obj/item/device/pda/PDAs = list() return ..() /obj/item/device/pda/clown/Crossed(AM as mob|obj) //Clown PDA is slippery. + //VOREStation Edit begin: SHADEKIN + var/mob/SK = AM + if(istype(SK)) + if(SK.shadekin_phasing_check()) + return + //VOREStation Edit end: SHADEKIN if (istype(AM, /mob/living)) var/mob/living/M = AM diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 89182806db..92faf9e295 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -322,6 +322,12 @@ qdel(src) /obj/item/toy/snappop/Crossed(H as mob|obj) + //VOREStation Edit begin: SHADEKIN + var/mob/SK = H + if(istype(SK)) + if(SK.shadekin_phasing_check()) + return + //VOREStation Edit end: SHADEKIN if((ishuman(H))) //i guess carp and shit shouldn't set them off var/mob/living/carbon/M = H if(M.m_intent == "run") diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm index cb6a4e4a42..890e557f50 100644 --- a/code/game/objects/items/weapons/clown_items.dm +++ b/code/game/objects/items/weapons/clown_items.dm @@ -9,6 +9,12 @@ * Banana Peals */ /obj/item/weapon/bananapeel/Crossed(AM as mob|obj) + //VOREStation Edit begin: SHADEKIN + var/mob/SK = AM + if(istype(SK)) + if(SK.shadekin_phasing_check()) + return + //VOREStation Edit end: SHADEKIN if (istype(AM, /mob/living)) var/mob/living/M = AM M.slip("the [src.name]",4) @@ -24,6 +30,12 @@ reagents.add_reagent("cleaner", 5) /obj/item/weapon/soap/Crossed(AM as mob|obj) + //VOREStation Edit begin: SHADEKIN + var/mob/SK = AM + if(istype(SK)) + if(SK.shadekin_phasing_check()) + return + //VOREStation Edit end: SHADEKIN if (istype(AM, /mob/living)) var/mob/living/M = AM M.slip("the [src.name]",3) diff --git a/code/game/objects/items/weapons/material/shards.dm b/code/game/objects/items/weapons/material/shards.dm index ba7438a685..529e846621 100644 --- a/code/game/objects/items/weapons/material/shards.dm +++ b/code/game/objects/items/weapons/material/shards.dm @@ -63,6 +63,12 @@ /obj/item/weapon/material/shard/Crossed(AM as mob|obj) ..() + //VOREStation Edit begin: SHADEKIN + var/mob/SK = AM + if(istype(SK)) + if(SK.shadekin_phasing_check()) + return + //VOREStation Edit end: SHADEKIN if(isliving(AM)) var/mob/M = AM diff --git a/code/game/objects/items/weapons/traps.dm b/code/game/objects/items/weapons/traps.dm index 27927b8180..900887ce11 100644 --- a/code/game/objects/items/weapons/traps.dm +++ b/code/game/objects/items/weapons/traps.dm @@ -103,6 +103,12 @@ can_buckle = initial(can_buckle) /obj/item/weapon/beartrap/Crossed(AM as mob|obj) + //VOREStation Edit begin: SHADEKIN + var/mob/SK = AM + if(istype(SK)) + if(SK.shadekin_phasing_check()) + return + //VOREStation Edit end: SHADEKIN if(deployed && isliving(AM)) var/mob/living/L = AM if(L.m_intent == "run") diff --git a/code/game/objects/structures/catwalk.dm b/code/game/objects/structures/catwalk.dm index 68b9ccc787..6173bac9b4 100644 --- a/code/game/objects/structures/catwalk.dm +++ b/code/game/objects/structures/catwalk.dm @@ -87,6 +87,12 @@ return ..() /obj/structure/catwalk/Crossed() + //VOREStation Edit begin: SHADEKIN + var/mob/SK = usr + if(istype(SK)) + if(SK.shadekin_phasing_check()) + return + //VOREStation Edit end: SHADEKIN . = ..() if(isliving(usr)) playsound(src, pick('sound/effects/footstep/catwalk1.ogg', 'sound/effects/footstep/catwalk2.ogg', 'sound/effects/footstep/catwalk3.ogg', 'sound/effects/footstep/catwalk4.ogg', 'sound/effects/footstep/catwalk5.ogg'), 25, 1) diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index 930329fd93..7db2d4e827 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -104,6 +104,12 @@ /obj/item/device/assembly_holder/Crossed(atom/movable/AM as mob|obj) + //VOREStation Edit begin: SHADEKIN + var/mob/SK = AM + if(istype(SK)) + if(SK.shadekin_phasing_check()) + return + //VOREStation Edit end: SHADEKIN if(a_left) a_left.Crossed(AM) if(a_right) diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index a76dae8ec7..afec31665d 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -25,7 +25,7 @@ /obj/item/device/assembly/infra/toggle_secure() secured = !secured if(secured) - START_PROCESSING(SSobj, src) + START_PROCESSING(SSobj, src) else on = 0 if(first) qdel(first) @@ -242,6 +242,12 @@ return /obj/effect/beam/i_beam/Crossed(atom/movable/AM as mob|obj) + //VOREStation Edit begin: SHADEKIN + var/mob/SK = AM + if(istype(SK)) + if(SK.shadekin_phasing_check()) + return + //VOREStation Edit end: SHADEKIN if(istype(AM, /obj/effect/beam)) return spawn(0) diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index 7d1c5346c0..b54df46b54 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -83,6 +83,12 @@ /obj/item/device/assembly/mousetrap/Crossed(AM as mob|obj) + //VOREStation Edit begin: SHADEKIN + var/mob/SK = AM + if(istype(SK)) + if(SK.shadekin_phasing_check()) + return + //VOREStation Edit end: SHADEKIN if(armed) if(ishuman(AM)) var/mob/living/carbon/H = AM diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 4a37ae1ab4..48ac62af07 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -151,6 +151,12 @@ overlays |= plant_icon /obj/item/weapon/reagent_containers/food/snacks/grown/Crossed(var/mob/living/M) + //VOREStation Edit begin: SHADEKIN + var/mob/SK = M + if(istype(SK)) + if(SK.shadekin_phasing_check()) + return + //VOREStation Edit end: SHADEKIN if(seed && seed.get_trait(TRAIT_JUICY) == 2) if(istype(M)) diff --git a/code/modules/hydroponics/spreading/spreading_response.dm b/code/modules/hydroponics/spreading/spreading_response.dm index 8a8ceabfeb..1a2e46283e 100644 --- a/code/modules/hydroponics/spreading/spreading_response.dm +++ b/code/modules/hydroponics/spreading/spreading_response.dm @@ -20,6 +20,12 @@ manual_unbuckle(user) /obj/effect/plant/Crossed(atom/movable/O) + //VOREStation Edit begin: SHADEKIN + var/mob/SK = O + if(istype(SK)) + if(SK.shadekin_phasing_check()) + return + //VOREStation Edit end: SHADEKIN if(isliving(O)) trodden_on(O) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 389b24f19f..906e64a356 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -243,6 +243,12 @@ // this handles mulebots and vehicles // and now mobs on fire /mob/living/carbon/human/Crossed(var/atom/movable/AM) + //VOREStation Edit begin: SHADEKIN + var/mob/SK = AM + if(istype(SK)) + if(SK.shadekin_phasing_check()) + return + //VOREStation Edit end: SHADEKIN if(istype(AM, /mob/living/bot/mulebot)) var/mob/living/bot/mulebot/MB = AM MB.runOver(src) diff --git a/code/modules/mob/living/carbon/human/human_defines_vr.dm b/code/modules/mob/living/carbon/human/human_defines_vr.dm index 131f5be1f1..787499afe1 100644 --- a/code/modules/mob/living/carbon/human/human_defines_vr.dm +++ b/code/modules/mob/living/carbon/human/human_defines_vr.dm @@ -9,6 +9,14 @@ var/impersonate_bodytype //For impersonating a bodytype var/ability_flags = 0 //Shadekin stoof +/mob/living/carbon/human/proc/shadekin_get_eye_color() + var/datum/species/shadekin/SK = species + + if(!istype(SK)) + return 0 + + return SK.get_shadekin_eyecolor() + /mob/living/carbon/human/proc/shadekin_get_energy() var/datum/species/shadekin/SK = species diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 187ebd4e1e..3491cf3e1d 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -207,6 +207,10 @@ // Handle footstep sounds /mob/living/carbon/human/handle_footstep(var/turf/T) + //VOREStation Edit begin: SHADEKIN + if(shadekin_phasing_check()) + return + //VOREStation Edit end: SHADEKIN if(!config.footstep_volume || !T.footstep_sounds || !T.footstep_sounds.len) return // Future Upgrades - Multi species support diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 4697bbec06..daa19eee64 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -618,6 +618,11 @@ //Stuff like the xenomorph's plasma regen happens here. species.handle_environment_special(src) + //VOREStation Edit begin: SHADEKIN + if(shadekin_phasing_check()) + return + //VOREStation Edit end: SHADEKIN + //Moved pressure calculations here for use in skip-processing check. var/pressure = environment.return_pressure() var/adjusted_pressure = calculate_affecting_pressure(pressure) diff --git a/code/modules/mob/living/carbon/human/species/shadekin/shadekin.dm b/code/modules/mob/living/carbon/human/species/shadekin/shadekin.dm index f6eaf16722..0d6b8ed3e8 100644 --- a/code/modules/mob/living/carbon/human/species/shadekin/shadekin.dm +++ b/code/modules/mob/living/carbon/human/species/shadekin/shadekin.dm @@ -4,17 +4,21 @@ blurb = "Waow! A shaadefluffer!" catalogue_data = list(/datum/category_item/catalogue/fauna/shadekin) - //default_language = "Xenomorph" language = LANGUAGE_SHADEKIN assisted_langs = list() - unarmed_types = list() //TODO: shadekin-unique pawbings + unarmed_types = list(/datum/unarmed_attack/claws/shadekin/red) hud_type = /datum/hud_data/shadekin rarity_value = 15 //INTERDIMENSIONAL FLUFFERS + tail = "shadekintail" + tail_animation = 'icons/mob/species/shadekin/tail.dmi' + longtail = TRUE + has_fine_manipulation = 0 siemens_coefficient = 0 + darksight = 10 - slowdown = -1 + slowdown = -0.5 item_slowdown_mod = 0.5 brute_mod = 0.7 // Naturally sturdy. @@ -37,7 +41,7 @@ flags = NO_SCAN | NO_PAIN | NO_SLIP | NO_MINOR_CUT | NO_INFECT spawn_flags = SPECIES_IS_RESTRICTED - //reagent_tag = IS_SHADEKIN + reagent_tag = IS_SHADEKIN //TODO: shadekin-unqiue chem interactions flesh_color = "#34AF10" //TODO: set colors blood_color = "#b3cbc3" @@ -46,15 +50,11 @@ has_glowing_eyes = TRUE death_message = "lets out a waning guttural screech, green blood bubbling from its maw." - //death_sound = 'sound/voice/hiss6.ogg' male_cough_sounds = null female_cough_sounds = null male_sneeze_sound = null female_sneeze_sound = null - //speech_sounds = list('sound/voice/hiss1.ogg','sound/voice/hiss2.ogg','sound/voice/hiss3.ogg','sound/voice/hiss4.ogg') - //speech_chance = 100 - speech_bubble_appearance = "ghost" genders = list(PLURAL, NEUTER) //no sexual dymorphism @@ -72,7 +72,6 @@ has_organ = list( O_HEART = /obj/item/organ/internal/heart, - O_LUNGS = /obj/item/organ/internal/lungs, O_VOICE = /obj/item/organ/internal/voicebox, O_LIVER = /obj/item/organ/internal/liver, O_KIDNEYS = /obj/item/organ/internal/kidneys, @@ -82,6 +81,10 @@ //SHADEKIN-UNIQUE STUFF GOES HERE var/shadekin_eye_color = BLUE_EYES + var/list/shadekin_abilities = list(/datum/power/shadekin/phase_shift, + /datum/power/shadekin/regenerate_other, + /datum/power/shadekin/create_shade) + var/list/shadekin_ability_datums = list() has_limbs = list( BP_TORSO = list("path" = /obj/item/organ/external/chest), @@ -97,6 +100,18 @@ BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right) ) +/datum/species/shadekin/New() + ..() + for(var/power in shadekin_abilities) + var/datum/power/shadekin/SKP = new power(src) + shadekin_ability_datums.Add(SKP) + +/datum/species/shadekin/handle_death(var/mob/living/carbon/human/H) + spawn(1) + for(var/obj/item/W in H) + H.drop_from_inventory(W) + qdel(H) + /datum/species/shadekin/get_bodytype() return SPECIES_SHADEKIN @@ -109,6 +124,25 @@ /datum/species/shadekin/can_breathe_water() return TRUE //they dont quite breathe +/datum/species/shadekin/add_inherent_verbs(var/mob/living/carbon/human/H) + ..() + add_shadekin_abilities(H) + +/datum/species/shadekin/proc/add_shadekin_abilities(var/mob/living/carbon/human/H) + if(!H.ability_master || !istype(H.ability_master, /obj/screen/movable/ability_master/shadekin)) + H.ability_master = null + H.ability_master = new /obj/screen/movable/ability_master/shadekin(H) + for(var/datum/power/shadekin/P in shadekin_ability_datums) + if(!(P.verbpath in H.verbs)) + H.verbs += P.verbpath + H.ability_master.add_shadekin_ability( + object_given = H, + verb_given = P.verbpath, + name_given = P.name, + ability_icon_given = P.ability_icon_state, + arguments = list() + ) + /datum/species/shadekin/proc/get_shadekin_eyecolor() return shadekin_eye_color @@ -160,7 +194,7 @@ set_energy(H, get_energy(H) + dark_gains) //Update huds - update_shadekin_hud() + update_shadekin_hud(H) /datum/species/shadekin/proc/get_energy(var/mob/living/carbon/human/H) var/obj/item/organ/internal/brain/shadekin/shade_organ = H.internal_organs_by_name[O_BRAIN] @@ -194,43 +228,36 @@ shade_organ.max_dark_energy = new_max_energy -/datum/species/shadekin/proc/update_shadekin_hud() - return - -/datum/hud_data/shadekin - icon = 'icons/mob/shadekin_hud.dmi' - has_a_intent = 1 - has_m_intent = 1 - has_warnings = 1 - has_hands = 1 - has_drop = 1 - has_throw = 1 - has_resist = 1 - has_pressure = 1 - has_nutrition = 1 - has_bodytemp = 1 - has_internals = 0 - - gear = list( - "head" = list("loc" = ui_shoes, "name" = "Hat", "slot" = slot_head, "state" = "hair", "toggle" = 1), - "suit storage" = list("loc" = ui_sstore1, "name" = "Uniform", "slot" = slot_w_uniform, "state" = "center", "toggle" = 1), - "id" = list("loc" = ui_id, "name" = "ID", "slot" = slot_wear_id, "state" = "id"), - "belt" = list("loc" = ui_belt, "name" = "Belt", "slot" = slot_belt, "state" = "belt"), - "back" = list("loc" = ui_back, "name" = "Back", "slot" = slot_back, "state" = "back"), - "storage1" = list("loc" = ui_storage1, "name" = "Left Pocket", "slot" = slot_l_store, "state" = "pocket"), - "storage2" = list("loc" = ui_storage2, "name" = "Right Pocket", "slot" = slot_r_store, "state" = "pocket") - ) - -/obj/screen/shadekin - icon = 'icons/mob/shadekin_hud.dmi' - invisibility = 101 - -/obj/screen/shadekin/darkness - name = "darkness" - icon_state = "dark" - alpha = 150 - -/obj/screen/shadekin/energy - name = "energy" - icon_state = "energy0" - alpha = 150 \ No newline at end of file +/datum/species/shadekin/proc/update_shadekin_hud(var/mob/living/carbon/human/H) + var/turf/T = get_turf(H) + if(!T) + return + if(H.shadekin_energy_display) + H.shadekin_energy_display.invisibility = 0 + switch(get_energy(H)) + if(80 to INFINITY) + H.shadekin_energy_display.icon_state = "energy0" + if(60 to 80) + H.shadekin_energy_display.icon_state = "energy1" + if(40 to 60) + H.shadekin_energy_display.icon_state = "energy2" + if(20 to 40) + H.shadekin_energy_display.icon_state = "energy3" + if(0 to 20) + H.shadekin_energy_display.icon_state = "energy4" + if(H.shadekin_dark_display) + H.shadekin_dark_display.invisibility = 0 + var/brightness = T.get_lumcount() //Brightness in 0.0 to 1.0 + var/darkness = 1-brightness //Invert + switch(darkness) + if(0.80 to 1.00) + H.shadekin_dark_display.icon_state = "dark2" + if(0.60 to 0.80) + H.shadekin_dark_display.icon_state = "dark1" + if(0.40 to 0.60) + H.shadekin_dark_display.icon_state = "dark" + if(0.20 to 0.40) + H.shadekin_dark_display.icon_state = "dark-1" + if(0.00 to 0.20) + H.shadekin_dark_display.icon_state = "dark-2" + return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm b/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm new file mode 100644 index 0000000000..855acba0a7 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm @@ -0,0 +1,296 @@ +/datum/power/shadekin + +///////////////////// +/// PHASE SHIFT /// +///////////////////// +/datum/power/shadekin/phase_shift + name = "Phase Shift (100)" + desc = "Shift yourself out of alignment with realspace to travel quickly areas." + verbpath = /mob/living/carbon/human/proc/phase_shift + ability_icon_state = "tech_passwall" + +/mob/living/carbon/human/proc/phase_shift() + set name = "Phase Shift (100)" + set desc = "Shift yourself out of alignment with realspace to travel quickly areas." + set category = "Shadekin" + + var/ability_cost = 100 + + var/datum/species/shadekin/SK = species + if(!istype(SK)) + to_chat(src, "Only a shadekin can use that!") + return FALSE + else if(stat) + to_chat(src, "Can't use that ability in your state!") + return FALSE + else if(shadekin_get_energy() < ability_cost && !(ability_flags & AB_PHASE_SHIFTED)) + to_chat(src, "Not enough energy for that ability!") + return FALSE + + if(!(ability_flags & AB_PHASE_SHIFTED)) + shadekin_adjust_energy(-ability_cost) + playsound(src, 'sound/effects/stealthoff.ogg', 75, 1) + + var/turf/T = get_turf(src) + if(!T.CanPass(src,T) || loc != T) + to_chat(src,"You can't use that here!") + return FALSE + + forceMove(T) + var/original_canmove = canmove + SetStunned(0) + SetWeakened(0) + if(buckled) + buckled.unbuckle_mob() + if(pulledby) + pulledby.stop_pulling() + stop_pulling() + canmove = FALSE + + //Shifting in + if(ability_flags & AB_PHASE_SHIFTED) + ability_flags &= ~AB_PHASE_SHIFTED + name = real_name + for(var/belly in vore_organs) + var/obj/belly/B = belly + B.escapable = initial(B.escapable) + + //overlays.Cut() + alpha = initial(alpha) + invisibility = initial(invisibility) + see_invisible = initial(see_invisible) + incorporeal_move = initial(incorporeal_move) + density = initial(density) + force_max_speed = initial(force_max_speed) + update_icon() + + //Cosmetics mostly + flick("tp_in",src) + custom_emote(1,"phases in!") + sleep(5) //The duration of the TP animation + canmove = original_canmove + + //Potential phase-in vore + if(can_be_drop_pred) //Toggleable in vore panel + var/list/potentials = living_mobs(0) + if(potentials.len) + var/mob/living/target = pick(potentials) + if(istype(target) && vore_selected) + target.forceMove(vore_selected) + to_chat(target,"\The [src] phases in around you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!") + + //Affect nearby lights + var/sk_eyecolor = shadekin_get_eye_color() + var/destroy_lights = 0 + if(sk_eyecolor == RED_EYES) + destroy_lights = 80 + if(sk_eyecolor == PURPLE_EYES) + destroy_lights = 25 + + for(var/obj/machinery/light/L in machines) + if(L.z != z || get_dist(src,L) > 10) + continue + + if(prob(destroy_lights)) + spawn(rand(5,25)) + L.broken() + else + L.flicker(10) + //Shifting out + else + ability_flags |= AB_PHASE_SHIFTED + custom_emote(1,"phases out!") + name = "Something" + + for(var/belly in vore_organs) + var/obj/belly/B = belly + B.escapable = FALSE + + //flick("tp_out",src) + sleep(5) + invisibility = INVISIBILITY_LEVEL_TWO + see_invisible = INVISIBILITY_LEVEL_TWO + //overlays.Cut() + update_icon() + alpha = 127 + + canmove = original_canmove + incorporeal_move = TRUE + density = FALSE + force_max_speed = TRUE + +/mob/living/carbon/human/UnarmedAttack() + if(shadekin_phasing_check()) + return FALSE //Nope. + + . = ..() + +/mob/living/carbon/human/can_fall() + if(shadekin_phasing_check()) + return FALSE //Nope! + + return ..() + +/mob/living/carbon/human/zMove(direction) + if(shadekin_phasing_check()) + var/turf/destination = (direction == UP) ? GetAbove(src) : GetBelow(src) + if(destination) + forceMove(destination) + return TRUE //Yup. + + return ..() + +/mob/proc/shadekin_phasing_check() + var/mob/living/simple_mob/shadekin/s_SK = src + if(istype(s_SK)) + if(s_SK.ability_flags & AB_PHASE_SHIFTED) + return TRUE + var/mob/living/carbon/human/h_SK = src + if(istype(h_SK)) + if(h_SK.ability_flags & AB_PHASE_SHIFTED) + return TRUE + return FALSE + +/* +/mob/living/carbon/human/MouseDrop_T(atom/dropping, mob/user) + if(ability_flags & AB_PHASE_SHIFTED) + return FALSE //Nope! + + return ..() +*/ + + +////////////////////////// +/// REGENERATE OTHER /// +////////////////////////// +/datum/power/shadekin/regenerate_other + name = "Regenerate Other (50)" + desc = "Spend energy to heal physical wounds in another creature." + verbpath = /mob/living/carbon/human/proc/regenerate_other + ability_icon_state = "tech_biomedaura" + +/mob/living/carbon/human/proc/regenerate_other() + set name = "Regenerate Other (50)" + set desc = "Spend energy to heal physical wounds in another creature." + set category = "Shadekin" + + var/ability_cost = 50 + + var/datum/species/shadekin/SK = species + if(!istype(SK)) + to_chat(src, "Only a shadekin can use that!") + return FALSE + else if(stat) + to_chat(src, "Can't use that ability in your state!") + return FALSE + else if(shadekin_get_energy() < ability_cost) + to_chat(src, "Not enough energy for that ability!") + return FALSE + else if(ability_flags & AB_PHASE_SHIFTED) + to_chat(src, "You can't use that while phase shifted!") + return FALSE + + var/list/viewed = oview(1) + var/list/targets = list() + for(var/mob/living/L in viewed) + targets += L + if(!targets.len) + to_chat(src,"Nobody nearby to mend!") + return FALSE + + var/mob/living/target = input(src,"Pick someone to mend:","Mend Other") as null|anything in targets + if(!target) + return FALSE + + target.add_modifier(/datum/modifier/shadekin/heal_boop,1 MINUTE) + playsound(src, 'sound/effects/EMPulse.ogg', 75, 1) + shadekin_adjust_energy(-ability_cost) + visible_message("\The [src] gently places a hand on \the [target]...") + face_atom(target) + return TRUE + +/datum/modifier/shadekin/heal_boop + name = "Shadekin Regen" + desc = "You feel serene and well rested." + mob_overlay_state = "green_sparkles" + + on_created_text = "Sparkles begin to appear around you, and all your ills seem to fade away." + on_expired_text = "The sparkles have faded, although you feel much healthier than before." + stacks = MODIFIER_STACK_EXTEND + +/datum/modifier/shadekin/heal_boop/tick() + if(!holder.getBruteLoss() && !holder.getFireLoss() && !holder.getToxLoss() && !holder.getOxyLoss() && !holder.getCloneLoss()) // No point existing if the spell can't heal. + expire() + return + holder.adjustBruteLoss(-2) + holder.adjustFireLoss(-2) + holder.adjustToxLoss(-2) + holder.adjustOxyLoss(-2) + holder.adjustCloneLoss(-2) + + +////////////////////// +/// CREATE SHADE /// +////////////////////// +/datum/power/shadekin/create_shade + name = "Create Shade (25)" + desc = "Create a field of darkness that follows you." + verbpath = /mob/living/carbon/human/proc/create_shade + ability_icon_state = "tech_dispelold" + +/mob/living/carbon/human/proc/create_shade() + set name = "Create Shade (25)" + set desc = "Create a field of darkness that follows you." + set category = "Shadekin" + + var/ability_cost = 25 + + var/datum/species/shadekin/SK = species + if(!istype(SK)) + to_chat(src, "Only a shadekin can use that!") + return FALSE + else if(stat) + to_chat(src, "Can't use that ability in your state!") + return FALSE + else if(shadekin_get_energy() < ability_cost) + to_chat(src, "Not enough energy for that ability!") + return FALSE + else if(ability_flags & AB_PHASE_SHIFTED) + to_chat(src, "You can't use that while phase shifted!") + return FALSE + + playsound(src, 'sound/effects/bamf.ogg', 75, 1) + + add_modifier(/datum/modifier/shadekin/create_shade,20 SECONDS) + shadekin_adjust_energy(-ability_cost) + return TRUE + +/datum/modifier/shadekin/create_shade + name = "Shadekin Shadegen" + desc = "Darkness envelops you." + mob_overlay_state = "" + + on_created_text = "You drag part of The Dark into realspace, enveloping yourself." + on_expired_text = "You lose your grasp on The Dark and realspace reasserts itself." + stacks = MODIFIER_STACK_EXTEND + var/mob/living/simple_mob/shadekin/my_kin + +/datum/modifier/shadekin/create_shade/tick() + if(my_kin.ability_flags & AB_PHASE_SHIFTED) + expire() + +/datum/modifier/shadekin/create_shade/on_applied() + my_kin = holder + holder.glow_toggle = TRUE + holder.glow_range = 8 + holder.glow_intensity = -10 + holder.glow_color = "#FFFFFF" + holder.set_light(8, -10, "#FFFFFF") + +/datum/modifier/shadekin/create_shade/on_expire() + holder.glow_toggle = initial(holder.glow_toggle) + holder.glow_range = initial(holder.glow_range) + holder.glow_intensity = initial(holder.glow_intensity) + holder.glow_color = initial(holder.glow_color) + holder.set_light(0) + my_kin = null \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/shadekin/shadekin_ability_objects.dm b/code/modules/mob/living/carbon/human/species/shadekin/shadekin_ability_objects.dm deleted file mode 100644 index 02bdd61400..0000000000 --- a/code/modules/mob/living/carbon/human/species/shadekin/shadekin_ability_objects.dm +++ /dev/null @@ -1,169 +0,0 @@ -/obj/effect/shadekin_ability - name = "" - desc = "" - icon = 'icons/mob/screen_spells.dmi' - var/ability_name = "FIX ME" - var/cost = 50 - var/mob/living/carbon/human/my_kin - var/shift_mode = NOT_WHILE_SHIFTED - var/ab_sound - -/obj/effect/shadekin_ability/New(var/new_kin) - ..() - my_kin = new_kin - loc = null - -/obj/effect/shadekin_ability/Destroy() - my_kin = null - return ..() - -/obj/effect/shadekin_ability/proc/atom_button_text() - var/shift_denial - - if(shift_mode == NOT_WHILE_SHIFTED && (my_kin.ability_flags & AB_PHASE_SHIFTED)) - shift_denial = "Physical Only" - else if(shift_mode == ONLY_WHILE_SHIFTED && !(my_kin.ability_flags & AB_PHASE_SHIFTED)) - shift_denial = "Shifted Only" - - if(shift_denial) - name = shift_denial - else - name = my_kin.energy >= cost ? "Activate" : "No Energy" - return src - -/obj/effect/shadekin_ability/Click(var/location, var/control, var/params) - if(my_kin.stat) return - - var/list/clickprops = params2list(params) - var/opts = clickprops["shift"] - - if(opts) - to_chat(my_kin,"[name] (Cost: [cost]%) - [desc]") - else - do_ability(my_kin) - -/obj/effect/shadekin_ability/proc/do_ability() - if(my_kin.stat) - to_chat(my_kin,"Can't use that ability in your state!") - return FALSE - if(!istype(my_kin.species, datum/species/shadekin)) - to_chat(my_kin,"Only shadekin can use this!") - return FALSE - var/current_energy = my_kin.species.get_energy(my_kin) - if(shift_mode == NOT_WHILE_SHIFTED && (my_kin.ability_flags & AB_PHASE_SHIFTED)) - to_chat(my_kin,"Can't use that ability while phase shifted!") - return FALSE - else if(shift_mode == ONLY_WHILE_SHIFTED && !(my_kin.ability_flags & AB_PHASE_SHIFTED)) - to_chat(my_kin,"Can only use that ability while phase shifted!") - return FALSE - else if(current_energy < cost) - to_chat(my_kin,"Not enough energy for that ability!") - return FALSE - - my_kin.species.set_energy(my_kin, current_energy - cost) - if(ab_sound) - playsound(src,ab_sound,75,1) - - return TRUE - -///////////////////////////////////////////////////////////////// -/obj/effect/shadekin_ability/phase_shift - ability_name = "Phase Shift" - desc = "Shift yourself out of alignment with realspace to travel quickly between dark areas (or light areas, with a price)." - icon_state = "tech_passwall" - cost = 100 - shift_mode = SHIFTED_OR_NOT - ab_sound = 'sound/effects/stealthoff.ogg' -/obj/effect/shadekin_ability/phase_shift/do_ability() - if(!..()) - return - my_kin.phase_shift() - if(my_kin.ability_flags & AB_PHASE_SHIFTED) - cost = 0 //Shifting back is free (but harmful in light) - else - cost = initial(cost) -///////////////////////////////////////////////////////////////// -/obj/effect/shadekin_ability/heal_boop - ability_name = "Regenerate Other" - desc = "Spend energy to heal physical wounds in another creature." - icon_state = "tech_biomedaura" - cost = 50 - shift_mode = NOT_WHILE_SHIFTED - ab_sound = 'sound/effects/EMPulse.ogg' -/obj/effect/shadekin_ability/heal_boop/do_ability() - if(!..()) - return - if(!my_kin.mend_other()) - my_kin.energy += cost //Refund due to abort - -/datum/modifier/shadekin/heal_boop - name = "Shadekin Regen" - desc = "You feel serene and well rested." - mob_overlay_state = "green_sparkles" - - on_created_text = "Sparkles begin to appear around you, and all your ills seem to fade away." - on_expired_text = "The sparkles have faded, although you feel much healthier than before." - stacks = MODIFIER_STACK_EXTEND - -/datum/modifier/shadekin/heal_boop/tick() - if(!holder.getBruteLoss() && !holder.getFireLoss() && !holder.getToxLoss() && !holder.getOxyLoss() && !holder.getCloneLoss()) // No point existing if the spell can't heal. - expire() - return - holder.adjustBruteLoss(-2) - holder.adjustFireLoss(-2) - holder.adjustToxLoss(-2) - holder.adjustOxyLoss(-2) - holder.adjustCloneLoss(-2) -///////////////////////////////////////////////////////////////// -/obj/effect/shadekin_ability/create_shade - ability_name = "Create Shade" - desc = "Create a field of darkness that follows you." - icon_state = "tech_dispelold" - cost = 25 - shift_mode = NOT_WHILE_SHIFTED - ab_sound = 'sound/effects/bamf.ogg' -/obj/effect/shadekin_ability/create_shade/do_ability() - if(!..()) - return - my_kin.add_modifier(/datum/modifier/shadekin/create_shade,20 SECONDS) -/datum/modifier/shadekin/create_shade - name = "Shadekin Shadegen" - desc = "Darkness envelops you." - mob_overlay_state = "" - - on_created_text = "You drag part of The Dark into realspace, enveloping yourself." - on_expired_text = "You lose your grasp on The Dark and realspace reasserts itself." - stacks = MODIFIER_STACK_EXTEND - var/mob/living/simple_mob/shadekin/my_kin - -/datum/modifier/shadekin/create_shade/tick() - if(my_kin.ability_flags & AB_PHASE_SHIFTED) - expire() - -/datum/modifier/shadekin/create_shade/on_applied() - my_kin = holder - holder.glow_toggle = TRUE - holder.glow_range = 8 - holder.glow_intensity = -10 - holder.glow_color = "#FFFFFF" - holder.set_light(8, -10, "#FFFFFF") - -/datum/modifier/shadekin/create_shade/on_expire() - holder.glow_toggle = initial(holder.glow_toggle) - holder.glow_range = initial(holder.glow_range) - holder.glow_intensity = initial(holder.glow_intensity) - holder.glow_color = initial(holder.glow_color) - holder.set_light(0) - my_kin = null -/* -///////////////////////////////////////////////////////////////// -/obj/effect/shadekin_ability/energy_feast - ability_name = "Devour Energy" - desc = "Devour the energy from another creature (potentially fatal)." - icon_state = "gen_eat" - cost = 25 - shift_mode = NOT_WHILE_SHIFTED -/obj/effect/shadekin_ability/energy_feast/do_ability() - if(!..()) - return -*/ \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/shadekin/shadekin_ability_procs.dm b/code/modules/mob/living/carbon/human/species/shadekin/shadekin_ability_procs.dm deleted file mode 100644 index 42d97d17b2..0000000000 --- a/code/modules/mob/living/carbon/human/species/shadekin/shadekin_ability_procs.dm +++ /dev/null @@ -1,133 +0,0 @@ -// Phase shifting procs (and related procs) -/mob/living/simple_mob/shadekin/proc/phase_shift() - var/turf/T = get_turf(src) - if(!T.CanPass(src,T) || loc != T) - to_chat(src,"You can't use that here!") - return FALSE - - forceMove(T) - var/original_canmove = canmove - SetStunned(0) - SetWeakened(0) - if(buckled) - buckled.unbuckle_mob() - if(pulledby) - pulledby.stop_pulling() - stop_pulling() - canmove = FALSE - - //Shifting in - if(ability_flags & AB_PHASE_SHIFTED) - ability_flags &= ~AB_PHASE_SHIFTED - name = real_name - for(var/belly in vore_organs) - var/obj/belly/B = belly - B.escapable = initial(B.escapable) - - overlays.Cut() - alpha = initial(alpha) - invisibility = initial(invisibility) - see_invisible = initial(see_invisible) - incorporeal_move = initial(incorporeal_move) - density = initial(density) - force_max_speed = initial(force_max_speed) - - //Cosmetics mostly - flick("tp_in",src) - custom_emote(1,"phases in!") - sleep(5) //The duration of the TP animation - canmove = original_canmove - - //Potential phase-in vore - if(can_be_drop_pred) //Toggleable in vore panel - var/list/potentials = living_mobs(0) - if(potentials.len) - var/mob/living/target = pick(potentials) - if(istype(target) && vore_selected) - target.forceMove(vore_selected) - to_chat(target,"\The [src] phases in around you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!") - - // Do this after the potential vore, so we get the belly - update_icon() - - //Affect nearby lights - var/destroy_lights = 0 - if(eye_state == RED_EYES) - destroy_lights = 80 - if(eye_state == PURPLE_EYES) - destroy_lights = 25 - - for(var/obj/machinery/light/L in machines) - if(L.z != z || get_dist(src,L) > 10) - continue - - if(prob(destroy_lights)) - spawn(rand(5,25)) - L.broken() - else - L.flicker(10) - - //Shifting out - else - ability_flags |= AB_PHASE_SHIFTED - custom_emote(1,"phases out!") - real_name = name - name = "Something" - - for(var/belly in vore_organs) - var/obj/belly/B = belly - B.escapable = FALSE - - overlays.Cut() - flick("tp_out",src) - sleep(5) - invisibility = INVISIBILITY_LEVEL_TWO - see_invisible = INVISIBILITY_LEVEL_TWO - update_icon() - alpha = 127 - - canmove = original_canmove - incorporeal_move = TRUE - density = FALSE - force_max_speed = TRUE - -/mob/living/simple_mob/shadekin/UnarmedAttack() - if(ability_flags & AB_PHASE_SHIFTED) - return FALSE //Nope. - - . = ..() - -/mob/living/simple_mob/shadekin/can_fall() - if(ability_flags & AB_PHASE_SHIFTED) - return FALSE //Nope! - - return ..() - -/mob/living/simple_mob/shadekin/zMove(direction) - if(ability_flags & AB_PHASE_SHIFTED) - var/turf/destination = (direction == UP) ? GetAbove(src) : GetBelow(src) - if(destination) - forceMove(destination) - return TRUE - - return ..() - -// Healing others -/mob/living/simple_mob/shadekin/proc/mend_other() - //I hate to crunch a view() but I only want ones I can see - var/list/viewed = oview(1) - var/list/targets = list() - for(var/mob/living/L in viewed) - targets += L - if(!targets.len) - to_chat(src,"Nobody nearby to mend!") - return FALSE - - var/mob/living/target = input(src,"Pick someone to mend:","Mend Other") as null|anything in targets - if(!target) - return FALSE - - target.add_modifier(/datum/modifier/shadekin/heal_boop,1 MINUTE) - visible_message("\The [src] gently places a hand on \the [target]...") - face_atom(target) - return TRUE \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/shadekin/shadekin_hud.dm b/code/modules/mob/living/carbon/human/species/shadekin/shadekin_hud.dm new file mode 100644 index 0000000000..5cb002b222 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/shadekin/shadekin_hud.dm @@ -0,0 +1,83 @@ +/datum/hud_data/shadekin + icon = 'icons/mob/shadekin_hud.dmi' + has_a_intent = 1 + has_m_intent = 1 + has_warnings = 1 + has_hands = 1 + has_drop = 1 + has_throw = 1 + has_resist = 1 + has_pressure = 1 + has_nutrition = 1 + has_bodytemp = 1 + has_internals = 0 + + gear = list( + "head" = list("loc" = ui_shoes, "name" = "Hat", "slot" = slot_head, "state" = "hair", "toggle" = 1), + "suit storage" = list("loc" = ui_sstore1, "name" = "Uniform", "slot" = slot_w_uniform, "state" = "center", "toggle" = 1), + "id" = list("loc" = ui_id, "name" = "ID", "slot" = slot_wear_id, "state" = "id"), + "belt" = list("loc" = ui_belt, "name" = "Belt", "slot" = slot_belt, "state" = "belt"), + "back" = list("loc" = ui_back, "name" = "Back", "slot" = slot_back, "state" = "back"), + "storage1" = list("loc" = ui_storage1, "name" = "Left Pocket", "slot" = slot_l_store, "state" = "pocket"), + "storage2" = list("loc" = ui_storage2, "name" = "Right Pocket", "slot" = slot_r_store, "state" = "pocket") + ) + +/obj/screen/shadekin + icon = 'icons/mob/shadekin_hud.dmi' + invisibility = 101 + +/obj/screen/shadekin/darkness + name = "darkness" + icon_state = "dark" + alpha = 150 + +/obj/screen/shadekin/energy + name = "energy" + icon_state = "energy0" + alpha = 150 + + + + +/obj/screen/movable/ability_master/shadekin + name = "Shadekin Abilities" + icon = 'icons/mob/screen_spells.dmi' + icon_state = "grey_spell_ready" + ability_objects = list() + showing = 0 + + open_state = "master_open" + closed_state = "master_closed" + + screen_loc = ui_spell_master + +/obj/screen/movable/ability_master/shadekin/update_abilities(forced = 0, mob/user) //Different proc to prevent indexing + update_icon() + if(user && user.client) + if(!(src in user.client.screen)) + user.client.screen += src + for(var/obj/screen/ability/ability in ability_objects) + ability.update_icon(forced) + +/obj/screen/ability/verb_based/shadekin + icon_state = "grey_spell_base" + background_base_state = "grey" + +/obj/screen/movable/ability_master/proc/add_shadekin_ability(var/object_given, var/verb_given, var/name_given, var/ability_icon_given, var/arguments) + if(!object_given) + message_admins("ERROR: add_shadekin_ability() was not given an object in its arguments.") + if(!verb_given) + message_admins("ERROR: add_shadekin_ability() was not given a verb/proc in its arguments.") + if(get_ability_by_proc_ref(verb_given)) + return // Duplicate + var/obj/screen/ability/verb_based/shadekin/A = new /obj/screen/ability/verb_based/shadekin() + A.ability_master = src + A.object_used = object_given + A.verb_to_call = verb_given + A.ability_icon_state = ability_icon_given + A.name = name_given + if(arguments) + A.arguments_to_use = arguments + ability_objects.Add(A) + if(my_mob.client) + toggle_open(2) //forces the icons to refresh on screen \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/species_attack_vr.dm b/code/modules/mob/living/carbon/human/species/species_attack_vr.dm index 658a453afc..5f1950c578 100644 --- a/code/modules/mob/living/carbon/human/species/species_attack_vr.dm +++ b/code/modules/mob/living/carbon/human/species/species_attack_vr.dm @@ -43,4 +43,29 @@ if(5) user.visible_message("[user]'s fangs sink deep into [target]'s [affecting.name], one of their veins bulging outwards from the sudden fluid pumped into it!") to_chat(target, "Your [affecting.name] feels like it's going to burst! Moments later, you simply can't feel your [affecting.name] any longer, the numbness slowly spreading throughout your body!") - target.bloodstr.add_reagent("numbenzyme",attack_damage) \ No newline at end of file + target.bloodstr.add_reagent("numbenzyme",attack_damage) + +/datum/unarmed_attack/claws/shadekin + var/energy_gain = 0 + +/datum/unarmed_attack/claws/shadekin/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage) + ..() + user.shadekin_adjust_energy(energy_gain) + +/datum/unarmed_attack/claws/shadekin/blue + energy_gain = 1 + +/datum/unarmed_attack/claws/shadekin/red + energy_gain = 8 + +/datum/unarmed_attack/claws/shadekin/yellow + energy_gain = 3 + +/datum/unarmed_attack/claws/shadekin/purple + energy_gain = 4 + +/datum/unarmed_attack/claws/shadekin/orange + energy_gain = 5 + +/datum/unarmed_attack/claws/shadekin/green + energy_gain = 1 diff --git a/code/modules/mob/living/carbon/human/species/species_vr.dm b/code/modules/mob/living/carbon/human/species/species_vr.dm index 63f02a5af8..f231773f86 100644 --- a/code/modules/mob/living/carbon/human/species/species_vr.dm +++ b/code/modules/mob/living/carbon/human/species/species_vr.dm @@ -6,6 +6,7 @@ //This is for overriding tail rendering with a specific icon in icobase, for static //tails only, since tails would wag when dead if you used this var/icobase_tail = 0 + var/longtail = FALSE //This is so that if a race is using the chimera revive they can't use it more than once. //Shouldn't really be seen in play too often, but it's case an admin event happens and they give a non chimera the chimera revive. Only one person can use the chimera revive at a time per race. diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 6b8861d8ab..f12c5fbe95 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -868,7 +868,12 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() //This one is actually not that bad I guess. if(species_tail && !(wear_suit && wear_suit.flags_inv & HIDETAIL)) var/icon/tail_s = get_tail_icon() - overlays_standing[used_tail_layer] = image(icon = tail_s, icon_state = "[species_tail]_s", layer = BODY_LAYER+used_tail_layer) // VOREStation Edit - Alt Tail Layer + //VOREStation Edit start: SHADEKIN + if(species.longtail) + overlays_standing[used_tail_layer] = image(icon = tail_s, icon_state = "[species_tail]_s", layer = BODY_LAYER+used_tail_layer, pixel_x = -16) + else + overlays_standing[used_tail_layer] = image(icon = tail_s, icon_state = "[species_tail]_s", layer = BODY_LAYER+used_tail_layer) // VOREStation Edit - Alt Tail Layer + //VOREStation Edit end: SHADEKIN animate_tail_reset() //TODO: Is this the appropriate place for this, and not on species...? @@ -916,7 +921,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() var/t_state = "[species.get_tail(src)]_once" var/used_tail_layer = tail_alt ? TAIL_LAYER_ALT : TAIL_LAYER // VOREStation Edit - Alt Tail Layer - + var/image/tail_overlay = overlays_standing[used_tail_layer] // VOREStation Edit - Alt Tail Layer if(tail_overlay && tail_overlay.icon_state == t_state) return //let the existing animation finish @@ -926,7 +931,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() spawn(20) //check that the animation hasn't changed in the meantime if(overlays_standing[used_tail_layer] == tail_overlay && tail_overlay.icon_state == t_state) // VOREStation Edit - Alt Tail Layer - animate_tail_stop() + animate_tail_stop() /mob/living/carbon/human/proc/animate_tail_start() if(QDESTROYING(src)) @@ -967,7 +972,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() if(vr_wing_image) vr_wing_image.layer = BODY_LAYER+WING_LAYER overlays_standing[WING_LAYER] = vr_wing_image - + apply_layer(WING_LAYER) // VOREStation Edit end diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm index 70afdaf910..95af426799 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm @@ -55,6 +55,12 @@ desc = "A small [body_color] rodent, often seen hiding in maintenance areas and making a nuisance of itself." /mob/living/simple_mob/animal/passive/mouse/Crossed(AM as mob|obj) + //VOREStation Edit begin: SHADEKIN + var/mob/SK = AM + if(istype(SK)) + if(SK.shadekin_phasing_check()) + return + //VOREStation Edit end: SHADEKIN if( ishuman(AM) ) if(!stat) var/mob/M = AM diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/ability_objects.dm b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/ability_objects.dm index 6990623043..40355f7ab0 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/ability_objects.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/ability_objects.dm @@ -91,7 +91,7 @@ return if(!my_kin.mend_other()) my_kin.energy += cost //Refund due to abort - +/* /datum/modifier/shadekin/heal_boop name = "Shadekin Regen" desc = "You feel serene and well rested." @@ -110,6 +110,7 @@ holder.adjustToxLoss(-2) holder.adjustOxyLoss(-2) holder.adjustCloneLoss(-2) +*/ ///////////////////////////////////////////////////////////////// /obj/effect/shadekin_ability/create_shade ability_name = "Create Shade" @@ -122,6 +123,7 @@ if(!..()) return my_kin.add_modifier(/datum/modifier/shadekin/create_shade,20 SECONDS) +/* /datum/modifier/shadekin/create_shade name = "Shadekin Shadegen" desc = "Darkness envelops you." @@ -151,6 +153,7 @@ holder.glow_color = initial(holder.glow_color) holder.set_light(0) my_kin = null +*/ /* ///////////////////////////////////////////////////////////////// /obj/effect/shadekin_ability/energy_feast diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index fb26891af5..d06740bd8d 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -383,6 +383,11 @@ ///Return 1 for movement 0 for none /mob/proc/Process_Spacemove(var/check_drift = 0) + //VOREStation Edit begin: SHADEKIN + if(shadekin_phasing_check()) + return + //VOREStation Edit end: SHADEKIN + if(!Check_Dense_Object()) //Nothing to push off of so end here update_floating(0) return 0 diff --git a/code/modules/organs/subtypes/shadekin.dm b/code/modules/organs/subtypes/shadekin.dm index afba564a1d..d130102d91 100644 --- a/code/modules/organs/subtypes/shadekin.dm +++ b/code/modules/organs/subtypes/shadekin.dm @@ -2,6 +2,4 @@ can_assist = FALSE var/dark_energy = 100 - var/max_dark_energy = 100 - - organ_verbs = list() \ No newline at end of file + var/max_dark_energy = 100 \ No newline at end of file diff --git a/code/modules/organs/subtypes/standard_vr.dm b/code/modules/organs/subtypes/standard_vr.dm index 85aa025d08..1ad51c804c 100644 --- a/code/modules/organs/subtypes/standard_vr.dm +++ b/code/modules/organs/subtypes/standard_vr.dm @@ -7,5 +7,8 @@ eye_icon = "eyes_sergal" /obj/item/organ/external/head/shadekin + cannot_gib = 1 + cannot_amputate = 1 + eye_icon_location = 'icons/mob/human_face_vr.dmi' eye_icon = "eyes_shadekin_blue" \ No newline at end of file diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index e180ac271c..6c784b44ed 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -209,6 +209,12 @@ Range() /obj/item/projectile/Crossed(atom/movable/AM) //A mob moving on a tile with a projectile is hit by it. + //VOREStation Edit begin: SHADEKIN + var/mob/SK = AM + if(istype(SK)) + if(SK.shadekin_phasing_check()) + return + //VOREStation Edit end: SHADEKIN ..() if(isliving(AM) && !(pass_flags & PASSMOB)) var/mob/living/L = AM diff --git a/icons/mob/species/shadekin/tail.dmi b/icons/mob/species/shadekin/tail.dmi new file mode 100644 index 0000000000000000000000000000000000000000..4e0ca2346f39ac5624d2d663aa8aa17244108418 GIT binary patch literal 985 zcmV;~119{5P)C00015P)t-sz`(%G z&CS}{+U)G?+uGW^yu9x2?%LVg+u7RL+S-(ql+P}ZQ+S=K+wzj3ErP|xt^78VRmzOVg5K{mE00DGTPE!Ct=GbNc z004q|R9JLGWpiV4X>fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;Zh zDainG%uKjAGg33tGfIFQV!%b&x_{3bZ1DTfLHp$Gsg ztc^De!!QiPcwb<-r}4C%g=>d@+cC)*mGX;#&l0$HsO0>|_?}l&9FH?k6PVEzGxm=a zGM@OqXS_4e@u&^fXTHmq73&Ef805Am%Ee&BCGc4*@Ci2^jU}H$`gUnho)FHIGfV;` zD_c28e%;DY8Ok${+8s>-kTacOkxV<##dIzUS`{da(%LGZ-IVUi1aMj=S+T=T&Oy&b zKo9yBju&P&*eEdNOOK&C7qks@;@ER}3y(dOdO^+P*u7Kyc&T00000NkvXX Hu0mjf@x00b literal 0 HcmV?d00001 diff --git a/vorestation.dme b/vorestation.dme index 6ba2363d9d..8874ba9f26 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -2201,6 +2201,8 @@ #include "code\modules\mob\living\carbon\human\species\outsider\vox.dm" #include "code\modules\mob\living\carbon\human\species\shadekin\_defines.dm" #include "code\modules\mob\living\carbon\human\species\shadekin\shadekin.dm" +#include "code\modules\mob\living\carbon\human\species\shadekin\shadekin_abilities.dm" +#include "code\modules\mob\living\carbon\human\species\shadekin\shadekin_hud.dm" #include "code\modules\mob\living\carbon\human\species\station\alraune.dm" #include "code\modules\mob\living\carbon\human\species\station\blank_vr.dm" #include "code\modules\mob\living\carbon\human\species\station\golem.dm"