Merge pull request #760 from Razgriz1032/Razgriz1032-Egg-Update

Razgriz1032 egg update
This commit is contained in:
Razgriz
2019-08-12 01:02:32 -07:00
committed by GitHub
12 changed files with 737 additions and 0 deletions
@@ -0,0 +1,661 @@
/mob/living/simple_animal/shadekin/initialize()
var/list/ability_types = subtypesof(/obj/effect/shadekin_ability)
ability_types += subtypesof(/obj/effect/rakshasa_ability)
shadekin_abilities = list()
for(var/type in ability_types)
shadekin_abilities += new type(src)
update_icon()
return ..()
/obj/effect/rakshasa_ability
name = ""
desc = ""
icon = 'icons/mob/screen_spells.dmi'
var/ability_name = "FIX ME"
var/cost = 50
var/mob/living/simple_animal/shadekin/my_kin
var/shift_mode = NOT_WHILE_SHIFTED
var/ab_sound
/obj/effect/rakshasa_ability/New(var/new_kin)
..()
my_kin = new_kin
loc = null
/obj/effect/rakshasa_ability/Destroy()
my_kin = null
return ..()
/obj/effect/rakshasa_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/rakshasa_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/rakshasa_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(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(my_kin.energy < cost)
to_chat(my_kin,"<span class='warning'>Not enough energy for that ability!</span>")
return FALSE
my_kin.energy -= cost
if(ab_sound)
playsound(src,ab_sound,75,1)
return TRUE
/obj/effect/rakshasa_ability/phase_shift2
ability_name = "Goo Shift"
desc = "Shift yourself with goopy effects."
icon_state = "tech_passwall"
cost = 100
shift_mode = SHIFTED_OR_NOT
ab_sound = 'sound/effects/stealthoff.ogg'
/obj/effect/rakshasa_ability/phase_shift2/do_ability()
if(!..())
return
new /obj/effect/decal/cleanable/blood/oil(loc, src)
playsound(src, 'sound/rakshasa/Corrosion1.ogg', 100, 1)
my_kin.phase_shift()
if(my_kin.ability_flags & AB_PHASE_SHIFTED)
cost = 0 //Shifting back is free (but harmful in light)
new /obj/effect/decal/cleanable/blood/oil(my_kin.loc)
var/goo_sounds = list (
'sound/rakshasa/Decay1.ogg',
'sound/rakshasa/Decay2.ogg',
'sound/rakshasa/Decay3.ogg'
)
var/sound = pick(goo_sounds)
playsound(my_kin.loc, sound, 100, 1)
else
cost = initial(cost)
new /obj/effect/decal/cleanable/blood/oil(my_kin.loc)
playsound(my_kin.loc, 'sound/rakshasa/Emerge0.ogg', 100, 1)
/////////////////////////////////////////////////////////////////
/obj/effect/rakshasa_ability/phase_shift3
ability_name = "Goo Shift No Emerge"
desc = "Shift yourself with goopy effects."
icon_state = "tech_passwall"
cost = 100
shift_mode = SHIFTED_OR_NOT
ab_sound = 'sound/effects/stealthoff.ogg'
/obj/effect/rakshasa_ability/phase_shift3/do_ability()
if(!..())
return
new /obj/effect/decal/cleanable/blood/oil(loc, src)
playsound(src, 'sound/rakshasa/Corrosion1.ogg', 100, 1)
my_kin.phase_shift()
if(my_kin.ability_flags & AB_PHASE_SHIFTED)
cost = 0 //Shifting back is free (but harmful in light)
new /obj/effect/decal/cleanable/blood/oil(my_kin.loc)
var/goo_sounds = list (
'sound/rakshasa/Decay1.ogg',
'sound/rakshasa/Decay2.ogg',
'sound/rakshasa/Decay3.ogg'
)
var/sound = pick(goo_sounds)
playsound(my_kin.loc, sound, 100, 1)
else
cost = initial(cost)
new /obj/effect/decal/cleanable/blood/oil(my_kin.loc)
var/goo_sounds = list (
'sound/rakshasa/Decay1.ogg',
'sound/rakshasa/Decay2.ogg',
'sound/rakshasa/Decay3.ogg'
)
var/sound = pick(goo_sounds)
playsound(my_kin.loc, sound, 100, 1)
/////////////////////////////////////////////////////////////////
/obj/effect/rakshasa_ability/drip_oil
ability_name = "Goo Drip"
desc = "Drip some goo."
icon_state = ""
cost = 0
shift_mode = SHIFTED_OR_NOT
ab_sound = 'sound/effects/stealthoff.ogg'
/obj/effect/rakshasa_ability/drip_oil/do_ability()
if(!..())
return
new /obj/effect/decal/cleanable/blood/oil(my_kin.loc)
var/goo_sounds = list (
'sound/rakshasa/Decay1.ogg',
'sound/rakshasa/Decay2.ogg',
'sound/rakshasa/Decay3.ogg'
)
var/sound = pick(goo_sounds)
playsound(my_kin.loc, sound, 100, 1)
/////////////////////////////////////////////////////////////////
/obj/effect/rakshasa_ability/laugh
ability_name = "Laugh"
desc = "Laugh."
icon_state = ""
cost = 0
shift_mode = SHIFTED_OR_NOT
ab_sound = 'sound/effects/stealthoff.ogg'
/obj/effect/rakshasa_ability/laugh/do_ability()
if(!..())
return
playsound(my_kin.loc, 'sound/rakshasa/Laugh.ogg', 100, 1)
/////////////////////////////////////////////////////////////////
/obj/effect/rakshasa_ability/no
ability_name = "Say No"
desc = "Say no!"
icon_state = ""
cost = 0
shift_mode = SHIFTED_OR_NOT
ab_sound = 'sound/effects/stealthoff.ogg'
/obj/effect/rakshasa_ability/no/do_ability()
if(!..())
return
playsound(my_kin.loc, 'sound/rakshasa/No.ogg', 100, 1)
/////////////////////////////////////////////////////////////////
/obj/effect/rakshasa_ability/trap
ability_name = "Lay Trap"
desc = "Lay a trap that will notify you when someone steps in it."
icon_state = ""
cost = 0
shift_mode = SHIFTED_OR_NOT
ab_sound = 'sound/effects/stealthoff.ogg'
/obj/effect/rakshasa_ability/trap/do_ability()
if(!..())
return
var/goo_sounds = list (
'sound/rakshasa/Corrosion1.ogg',
'sound/rakshasa/Corrosion2.ogg',
'sound/rakshasa/Corrosion3.ogg'
)
var/sound = pick(goo_sounds)
playsound(my_kin.loc, sound, 100, 1)
new /obj/structure/gootrap (my_kin.loc)
/*
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// //
// Starting Stuff //
// //
// //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
var/list/rakshasa_abilities
/mob/living/simple_animal/shadekin/rakshasa/initialize()
//You spawned the prototype, and want a totally random one.
if(type == /mob/living/simple_animal/shadekin/rakshasa)
//I'm told by VerySoft these are the liklihood values
var/list/sk_types = list(
/mob/living/simple_animal/shadekin/red = 20, //Actively seek people out to nom, so fairly common to see (relatively speaking),
/mob/living/simple_animal/shadekin/blue = 15, //Explorers that like to interact with people, so still fairly common,
/mob/living/simple_animal/shadekin/purple = 15, //Also explorers that may or may not homf people,
/mob/living/simple_animal/shadekin/yellow = 1 //Very rare, usually never leaves their home
)
var/new_type = pickweight(sk_types)
new new_type(loc)
initialized = TRUE
return INITIALIZE_HINT_QDEL
if(icon_state == "map_example")
icon_state = pick("white","dark","brown")
icon_living = icon_state
switch(eye_state)
if(BLUE_EYES)
eye_icon_state = "e_blue"
if(RED_EYES)
eye_icon_state = "e_red"
if(PURPLE_EYES)
eye_icon_state = "e_purple"
if(YELLOW_EYES)
eye_icon_state = "e_yellow"
if(GREEN_EYES)
eye_icon_state = "e_green"
if(ORANGE_EYES)
eye_icon_state = "e_orange"
else
eye_icon_state = "e_red"
tailimage = image('icons/mob/vore_shadekin64.dmi',null,icon_state)
tailimage.pixel_x = -16
if(eye_desc)
desc += " This one has [eye_desc]!"
var/list/ability_types = subtypesof(/obj/effect/rakshasa_ability)
rakshasa_abilities = list()
for(var/type in ability_types)
rakshasa_abilities += new type(src)
update_icon()
return ..()
/mob/living/simple_animal/shadekin/Destroy()
qdel_null_list(rakshasa_abilities)
. = ..()
/mob/living/simple_animal/shadekin/rakshasa/Stat()
. = ..()
if(statpanel("Rakshasa"))
rakshasa_abilities_stat()
/mob/living/simple_animal/shadekin/rakshasa/proc/rakshasa_abilities_stat()
for(var/A in rakshasa_abilities)
var/obj/effect/rakshasa_ability/ability = A
stat("[ability.ability_name]",ability.atom_button_text())
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// //
// Some Procs for Abilities //
// //
// //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Phase shifting procs (and related procs)
/mob/living/simple_animal/shadekin/rakshasa/proc/rak_phase_shift()
var/turf/T = get_turf(src)
if(!T.CanPass(null,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_animal/shadekin/Rakshasa/UnarmedAttack()
if(ability_flags & AB_PHASE_SHIFTED)
return FALSE //Nope.
. = ..()
/mob/living/simple_animal/shadekin/rakshasa/can_fall()
if(ability_flags & AB_PHASE_SHIFTED)
return FALSE //Nope!
return ..()
/mob/living/simple_animal/shadekin/rakshasa/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_animal/shadekin/rakshasa/proc/rak_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/rakshasa/heal_boop,1 MINUTE)
visible_message("<span class='notice'>\The [src] gently places a hand on \the [target]...</span>")
face_atom(target)
return TRUE
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// //
// Actual Abilities //
// //
// //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/obj/effect/rakshasa_ability
name = ""
desc = ""
icon = 'icons/mob/screen_spells.dmi'
var/ability_name = "FIX ME"
var/cost = 50
var/mob/living/simple_animal/rakshasa/my_rak
var/shift_mode = NOT_WHILE_SHIFTED
var/ab_sound
/obj/effect/rakshasa_ability/New(var/new_rak)
..()
my_rak = new_rak
loc = null
/obj/effect/rakshasa_ability/Destroy()
my_rak = null
return ..()
/obj/effect/rakshasa_ability/proc/atom_button_text()
var/shift_denial
if(shift_mode == NOT_WHILE_SHIFTED && (my_rak.ability_flags & AB_PHASE_SHIFTED))
shift_denial = "Physical Only"
else if(shift_mode == ONLY_WHILE_SHIFTED && !(my_rak.ability_flags & AB_PHASE_SHIFTED))
shift_denial = "Shifted Only"
if(shift_denial)
name = shift_denial
else
name = my_rak.energy >= cost ? "Activate" : "No Energy"
return src
/obj/effect/rakshasa_ability/Click(var/location, var/control, var/params)
if(my_rak.stat) return
var/list/clickprops = params2list(params)
var/opts = clickprops["shift"]
if(opts)
to_chat(my_rak,"<span class='notice'><b>[name]</b> (Cost: [cost]%) - [desc]</span>")
else
do_ability(my_rak)
/obj/effect/rakshasa_ability/proc/do_ability()
if(my_rak.stat)
to_chat(my_rak,"<span class='warning'>Can't use that ability in your state!</span>")
return FALSE
if(shift_mode == NOT_WHILE_SHIFTED && (my_rak.ability_flags & AB_PHASE_SHIFTED))
to_chat(my_rak,"<span class='warning'>Can't use that ability while phase shifted!</span>")
return FALSE
else if(shift_mode == ONLY_WHILE_SHIFTED && !(my_rak.ability_flags & AB_PHASE_SHIFTED))
to_chat(my_rak,"<span class='warning'>Can only use that ability while phase shifted!</span>")
return FALSE
else if(my_rak.energy < cost)
to_chat(my_rak,"<span class='warning'>Not enough energy for that ability!</span>")
return FALSE
my_rak.energy -= cost
if(ab_sound)
playsound(src,ab_sound,75,1)
return TRUE
/////////////////////////////////////////////////////////////////
/obj/effect/rakshasa_ability/rak_phase_shift
ability_name = "Phase Shift"
desc = "Shift yourself out of alignment with realspace to travel quickly between areas."
icon_state = "tech_passwall"
cost = 100
shift_mode = SHIFTED_OR_NOT
ab_sound = 'sound/effects/stealthoff.ogg'
/obj/effect/rakshasa_ability/rak_phase_shift/do_ability()
if(!..())
return
my_rak.rak_phase_shift()
if(my_rak.ability_flags & AB_PHASE_SHIFTED)
cost = 0 //Shifting back is free (but harmful in light)
else
cost = initial(cost)
/////////////////////////////////////////////////////////////////
/obj/effect/rakshasa_ability/goo_phase_shift
ability_name = "Goo Shift"
desc = "Shift yourself with goopy effects."
icon_state = "tech_passwall"
cost = 100
shift_mode = SHIFTED_OR_NOT
ab_sound = 'sound/effects/stealthoff.ogg'
/obj/effect/rakshasa_ability/rak_phase_shift/do_ability()
if(!..())
return
new /obj/effect/decal/cleanable/blood/oil(loc, src)
playsound(src, 'sound/rakshasa/Corrosion1.ogg', 100, 1)
my_rak.rak_phase_shift()
if(my_rak.ability_flags & AB_PHASE_SHIFTED)
cost = 0 //Shifting back is free (but harmful in light)
else
cost = initial(cost)
/////////////////////////////////////////////////////////////////
/obj/effect/rakshasa_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/rakshasa_ability/heal_boop/do_ability()
if(!..())
return
if(!my_rak.rak_mend_other())
my_rak.energy += cost //Refund due to abort
/datum/modifier/rakshasa/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/rakshasa/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/rakshasa_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/rakshasa_ability/create_shade/do_ability()
if(!..())
return
my_rak.add_modifier(/datum/modifier/rakshasa/create_shade,20 SECONDS)
/datum/modifier/rakshasa/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_animal/rakshasa/my_rak
/datum/modifier/rakshasa/create_shade/tick()
if(my_rak.ability_flags & AB_PHASE_SHIFTED)
expire()
/datum/modifier/rakshasa/create_shade/on_applied()
my_rak = 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/rakshasa/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_rak = null
/*
/////////////////////////////////////////////////////////////////
/obj/effect/rakshasa_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/rakshasa_ability/energy_feast/do_ability()
if(!..())
return
*/
*/
@@ -0,0 +1,76 @@
/obj/structure/gootrap
name = "goo"
throw_speed = 2
throw_range = 1
gender = PLURAL
icon = 'icons/effects/blood.dmi'
var/base_icon = 'icons/effects/blood.dmi'
icon_state = "mfloor1"
var/basecolor="#030303"
desc = ""
throwforce = 0
w_class = ITEMSIZE_NORMAL
matter = list(DEFAULT_WALL_MATERIAL = 18750)
var/deployed = 1
anchored = 1
/obj/structure/gootrap/proc/can_use(mob/user)
return (user.IsAdvancedToolUser() && !issilicon(user) && !user.stat && !user.restrained())
/obj/structure/gootrap/update_icon()
..()
color = basecolor
/obj/structure/gootrap/New()
..()
update_icon()
return
/obj/structure/gootrap/attack_hand(mob/user as mob)
if(has_buckled_mobs() && can_use(user))
var/victim = english_list(buckled_mobs)
user.visible_message(
"<span class='notice'>[user] begins freeing [victim] from \the [src].</span>",
"<span class='notice'>You carefully begin to free [victim] from \the [src].</span>",
)
if(do_after(user, 5))
user.visible_message("<span class='notice'>[victim] has been freed from \the [src] by [user].</span>")
for(var/A in buckled_mobs)
unbuckle_mob(A)
anchored = 0
else
..()
/obj/structure/gootrap/proc/attack_mob(mob/living/L)
//trap the victim in place
set_dir(L.dir)
can_buckle = 1
buckle_mob(L)
var/goo_sounds = list (
'sound/rakshasa/Decay1.ogg',
'sound/rakshasa/Decay2.ogg',
'sound/rakshasa/Decay3.ogg'
)
var/sound = pick(goo_sounds)
playsound(src, sound, 100, 1)
L << "<span class='danger'>You hear a gooey schlorp as \the [src] ensnares your leg, trapping you in place!</span>"
deployed = 0
can_buckle = initial(can_buckle)
/obj/structure/gootrap/Crossed(AM as mob|obj)
if(deployed && isliving(AM))
var/mob/living/L = AM
if(L.m_intent == "run")
L.visible_message(
"<span class='danger'>[L] steps on \the [src].</span>",
"<span class='danger'>You step on \the [src]!</span>",
"<b>You hear a gooey schlorp as the goo ensnares your leg!</b>"
)
attack_mob(L)
if(!has_buckled_mobs())
anchored = 0
deployed = 0
message_admins("[key_name(usr)] has stepped in the goo trap.")
..()