mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-10 18:22:39 +00:00
Refactors shadekin
This commit is contained in:
@@ -1,2 +1,3 @@
|
||||
// More for our custom races
|
||||
#define IS_CHIMERA 12
|
||||
#define IS_CHIMERA 12
|
||||
#define IS_SHADEKIN 13
|
||||
@@ -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)
|
||||
|
||||
@@ -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//
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
|
||||
var/obj/screen/lingchemdisplay
|
||||
var/obj/screen/wiz_instability_display
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
/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
|
||||
@@ -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, "<span class='warning'>Only a shadekin can use that!</span>")
|
||||
return FALSE
|
||||
else if(stat)
|
||||
to_chat(src, "<span class='warning'>Can't use that ability in your state!</span>")
|
||||
return FALSE
|
||||
else if(shadekin_get_energy() < ability_cost && !(ability_flags & AB_PHASE_SHIFTED))
|
||||
to_chat(src, "<span class='warning'>Not enough energy for that ability!</span>")
|
||||
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,"<span class='warning'>You can't use that here!</span>")
|
||||
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,"<span class='warning'>\The [src] phases in around you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!</span>")
|
||||
|
||||
//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, "<span class='warning'>Only a shadekin can use that!</span>")
|
||||
return FALSE
|
||||
else if(stat)
|
||||
to_chat(src, "<span class='warning'>Can't use that ability in your state!</span>")
|
||||
return FALSE
|
||||
else if(shadekin_get_energy() < ability_cost)
|
||||
to_chat(src, "<span class='warning'>Not enough energy for that ability!</span>")
|
||||
return FALSE
|
||||
else if(ability_flags & AB_PHASE_SHIFTED)
|
||||
to_chat(src, "<span class='warning'>You can't use that while phase shifted!</span>")
|
||||
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,"<span class='warning'>Nobody nearby to mend!</span>")
|
||||
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("<span class='notice'>\The [src] gently places a hand on \the [target]...</span>")
|
||||
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 = "<span class='notice'>Sparkles begin to appear around you, and all your ills seem to fade away.</span>"
|
||||
on_expired_text = "<span class='notice'>The sparkles have faded, although you feel much healthier than before.</span>"
|
||||
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, "<span class='warning'>Only a shadekin can use that!</span>")
|
||||
return FALSE
|
||||
else if(stat)
|
||||
to_chat(src, "<span class='warning'>Can't use that ability in your state!</span>")
|
||||
return FALSE
|
||||
else if(shadekin_get_energy() < ability_cost)
|
||||
to_chat(src, "<span class='warning'>Not enough energy for that ability!</span>")
|
||||
return FALSE
|
||||
else if(ability_flags & AB_PHASE_SHIFTED)
|
||||
to_chat(src, "<span class='warning'>You can't use that while phase shifted!</span>")
|
||||
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 = "<span class='notice'>You drag part of The Dark into realspace, enveloping yourself.</span>"
|
||||
on_expired_text = "<span class='warning'>You lose your grasp on The Dark and realspace reasserts itself.</span>"
|
||||
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
|
||||
@@ -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,"<span class='notice'><b>[name]</b> (Cost: [cost]%) - [desc]</span>")
|
||||
else
|
||||
do_ability(my_kin)
|
||||
|
||||
/obj/effect/shadekin_ability/proc/do_ability()
|
||||
if(my_kin.stat)
|
||||
to_chat(my_kin,"<span class='warning'>Can't use that ability in your state!</span>")
|
||||
return FALSE
|
||||
if(!istype(my_kin.species, datum/species/shadekin))
|
||||
to_chat(my_kin,"<span class='warning'>Only shadekin can use this!</span>")
|
||||
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,"<span class='warning'>Can't use that ability while phase shifted!</span>")
|
||||
return FALSE
|
||||
else if(shift_mode == ONLY_WHILE_SHIFTED && !(my_kin.ability_flags & AB_PHASE_SHIFTED))
|
||||
to_chat(my_kin,"<span class='warning'>Can only use that ability while phase shifted!</span>")
|
||||
return FALSE
|
||||
else if(current_energy < cost)
|
||||
to_chat(my_kin,"<span class='warning'>Not enough energy for that ability!</span>")
|
||||
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 = "<span class='notice'>Sparkles begin to appear around you, and all your ills seem to fade away.</span>"
|
||||
on_expired_text = "<span class='notice'>The sparkles have faded, although you feel much healthier than before.</span>"
|
||||
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 = "<span class='notice'>You drag part of The Dark into realspace, enveloping yourself.</span>"
|
||||
on_expired_text = "<span class='warning'>You lose your grasp on The Dark and realspace reasserts itself.</span>"
|
||||
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
|
||||
*/
|
||||
@@ -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,"<span class='warning'>You can't use that here!</span>")
|
||||
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,"<span class='warning'>\The [src] phases in around you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!</span>")
|
||||
|
||||
// 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,"<span class='warning'>Nobody nearby to mend!</span>")
|
||||
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("<span class='notice'>\The [src] gently places a hand on \the [target]...</span>")
|
||||
face_atom(target)
|
||||
return TRUE
|
||||
@@ -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
|
||||
@@ -43,4 +43,29 @@
|
||||
if(5)
|
||||
user.visible_message("<span class='danger'>[user]'s fangs sink deep into [target]'s [affecting.name], one of their veins bulging outwards from the sudden fluid pumped into it!</span>")
|
||||
to_chat(target, "<font color='red'><b>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!</b></font>")
|
||||
target.bloodstr.add_reagent("numbenzyme",attack_damage)
|
||||
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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -2,6 +2,4 @@
|
||||
can_assist = FALSE
|
||||
|
||||
var/dark_energy = 100
|
||||
var/max_dark_energy = 100
|
||||
|
||||
organ_verbs = list()
|
||||
var/max_dark_energy = 100
|
||||
@@ -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"
|
||||
@@ -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
|
||||
|
||||
BIN
icons/mob/species/shadekin/tail.dmi
Normal file
BIN
icons/mob/species/shadekin/tail.dmi
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 985 B |
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user