From e2c60c2bdb9703a13c328a674a9a9bc24b43b10b Mon Sep 17 00:00:00 2001 From: Markolie Date: Fri, 6 Jan 2017 17:02:38 +0100 Subject: [PATCH] Add shapeshift spell, human_req/nonabstract_req support and make Ashdrake reward a shapeshift. --- code/datums/spell.dm | 40 +++++---- code/datums/spells/area_teleport.dm | 3 +- code/datums/spells/ethereal_jaunt.dm | 1 + code/datums/spells/mime.dm | 2 + code/datums/spells/shapeshift.dm | 82 ++++++++++++++++++ code/datums/spells/turf_teleport.dm | 1 + .../mining/lavaland/necropolis_chests.dm | 7 +- .../simple_animal/hostile/megafauna/dragon.dm | 4 +- .../hostile/megafauna/megafauna.dm | 2 +- icons/mob/actions.dmi | Bin 83894 -> 84349 bytes paradise.dme | 1 + 11 files changed, 119 insertions(+), 24 deletions(-) create mode 100644 code/datums/spells/shapeshift.dm diff --git a/code/datums/spell.dm b/code/datums/spell.dm index fe2e7431cf3..f5356474019 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -70,6 +70,8 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin var/ghost = 0 // Skip life check. var/clothes_req = 1 //see if it requires clothes + var/human_req = 0 //spell can only be cast by humans + var/nonabstract_req = 0 //spell can only be cast by mobs that are physical entities var/stat_allowed = 0 //see if it requires being conscious/alive, need to set to 1 for ghostpells var/invocation = "HURP DURP" //what is uttered when the wizard casts the spell var/invocation_emote_self = null @@ -102,11 +104,11 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin var/sound = null //The sound the spell makes when it is cast /obj/effect/proc_holder/spell/proc/cast_check(skipcharge = 0, mob/living/user = usr) //checks if the spell can be cast based on its settings; skipcharge is used when an additional cast_check is called inside the spell - if(((!user.mind) || !(src in user.mind.spell_list)) && !(src in user.mob_spell_list)) to_chat(user, "You shouldn't have this spell! Something's wrong.") return 0 - if(istype(user, /mob/living/carbon/human)) + + if(ishuman(user)) var/mob/living/carbon/human/caster = user if(caster.remoteview_target) caster.remoteview_target = null @@ -129,26 +131,31 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin if(!ghost) if(user.stat && !stat_allowed) - to_chat(user, "Not when you're incapacitated.") + to_chat(user, "You can't cast this spell while incapacitated.") return 0 - if(ishuman(user) && (invocation_type == "whisper" || invocation_type == "shout") && user.is_muzzled()) to_chat(user, "Mmmf mrrfff!") return 0 - var/obj/effect/proc_holder/spell/noclothes/spell = locate() in (user.mob_spell_list | (user.mind ? user.mind.spell_list : list())) - if(clothes_req && !(spell && istype(spell)))//clothes check - if(!istype(user, /mob/living/carbon/human)) - to_chat(user, "You aren't a human, Why are you trying to cast a human spell, silly non-human? Casting human spells is for humans.") + + var/obj/effect/proc_holder/spell/noclothes/clothes_spell = locate() in (user.mob_spell_list | (user.mind ? user.mind.spell_list : list())) + if((ishuman(user) && clothes_req) && !(clothes_spell && istype(clothes_spell)))//clothes check + var/mob/living/carbon/human/H = user + if(!istype(H.wear_suit, /obj/item/clothing/suit/wizrobe) && !istype(H.wear_suit, /obj/item/clothing/suit/space/rig/wizard)) + to_chat(user, "I don't feel strong enough without my robe.") return 0 - if(!istype(user:wear_suit, /obj/item/clothing/suit/wizrobe) && !istype(user:wear_suit, /obj/item/clothing/suit/space/rig/wizard)) - to_chat(user, "I don't feel strong enough without my robe.") + if(!istype(H.shoes, /obj/item/clothing/shoes/sandal)) + to_chat(user, "I don't feel strong enough without my sandals.") return 0 - if(!istype(user:shoes, /obj/item/clothing/shoes/sandal)) - to_chat(user, "I don't feel strong enough without my sandals.") - return 0 - if(!istype(user:head, /obj/item/clothing/head/wizard) && !istype(user:head, /obj/item/clothing/head/helmet/space/rig/wizard)) + if(!istype(H.head, /obj/item/clothing/head/wizard) && !istype(H.head, /obj/item/clothing/head/helmet/space/rig/wizard)) to_chat(user, "I don't feel strong enough without my hat.") return 0 + else if(!ishuman(user)) + if(clothes_req || human_req) + to_chat(user, "This spell can only be cast by humans!") + return 0 + if(nonabstract_req && (isbrain(user) || ispAI(user))) + to_chat(user, "This spell can only be cast by physical beings!") + return 0 if(!skipcharge) switch(charge_type) @@ -426,7 +433,6 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin return 0 if(ishuman(user)) - var/mob/living/carbon/human/H = user if((invocation_type == "whisper" || invocation_type == "shout") && H.is_muzzled()) @@ -442,8 +448,8 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin if(!istype(H.head, /obj/item/clothing/head/wizard) && !istype(H.head, /obj/item/clothing/head/helmet/space/rig/wizard)) return 0 else - if(clothes_req) + if(clothes_req || human_req) return 0 - if(isbrain(user) || ispAI(user)) + if(nonabstract_req && (isbrain(user) || ispAI(user))) return 0 return 1 diff --git a/code/datums/spells/area_teleport.dm b/code/datums/spells/area_teleport.dm index badf94d60d6..c213828cf29 100644 --- a/code/datums/spells/area_teleport.dm +++ b/code/datums/spells/area_teleport.dm @@ -1,7 +1,8 @@ /obj/effect/proc_holder/spell/targeted/area_teleport name = "Area teleport" desc = "This spell teleports you to a type of area of your selection." - + nonabstract_req = 1 + var/randomise_selection = 0 //if it lets the usr choose the teleport loc or picks it from the list var/invocation_area = 1 //if the invocation appends the selected area diff --git a/code/datums/spells/ethereal_jaunt.dm b/code/datums/spells/ethereal_jaunt.dm index 9e8a6941f0b..b9ad3d22e70 100644 --- a/code/datums/spells/ethereal_jaunt.dm +++ b/code/datums/spells/ethereal_jaunt.dm @@ -10,6 +10,7 @@ range = -1 cooldown_min = 100 //50 deciseconds reduction per rank include_user = 1 + nonabstract_req = 1 centcom_cancast = 0 //Prevent people from getting to centcom var phaseshift = 0 diff --git a/code/datums/spells/mime.dm b/code/datums/spells/mime.dm index b0b85f4b47c..296521405a0 100644 --- a/code/datums/spells/mime.dm +++ b/code/datums/spells/mime.dm @@ -11,6 +11,7 @@ clothes_req = 0 range = 0 cast_sound = null + human_req = 1 action_icon_state = "mime" action_background_icon_state = "bg_mime" @@ -35,6 +36,7 @@ charge_max = 3000 range = -1 include_user = 1 + human_req = 1 action_icon_state = "mime" action_background_icon_state = "bg_mime" diff --git a/code/datums/spells/shapeshift.dm b/code/datums/spells/shapeshift.dm new file mode 100644 index 00000000000..a5f1de1baec --- /dev/null +++ b/code/datums/spells/shapeshift.dm @@ -0,0 +1,82 @@ +/obj/effect/proc_holder/spell/targeted/shapeshift + name = "Shapechange" + desc = "Take on the shape of another for a time to use their natural abilities. Once you've made your choice it cannot be changed." + clothes_req = 0 + human_req = 0 + charge_max = 200 + cooldown_min = 50 + range = -1 + include_user = 1 + invocation = "RAC'WA NO!" + invocation_type = "shout" + action_icon_state = "shapeshift" + + var/shapeshift_type + var/list/current_shapes = list() + var/list/current_casters = list() + var/list/possible_shapes = list(/mob/living/simple_animal/mouse,\ + /mob/living/simple_animal/pet/corgi,\ + /mob/living/simple_animal/bot/ed209,\ + /mob/living/simple_animal/hostile/construct/armoured) + +/obj/effect/proc_holder/spell/targeted/shapeshift/cast(list/targets, mob/user = usr) + for(var/mob/living/M in targets) + if(!shapeshift_type) + var/list/animal_list = list() + for(var/path in possible_shapes) + var/mob/living/simple_animal/A = path + animal_list[initial(A.name)] = path + shapeshift_type = input(M, "Choose Your Animal Form!", "It's Morphing Time!", null) as anything in animal_list + if(!shapeshift_type) //If you aren't gonna decide I am! + shapeshift_type = pick(animal_list) + shapeshift_type = animal_list[shapeshift_type] + if(M in current_shapes) + Restore(M) + else + Shapeshift(M) + +/obj/effect/proc_holder/spell/targeted/shapeshift/proc/Shapeshift(mob/living/caster) + for(var/mob/living/M in caster) + if(M.status_flags & GODMODE) + to_chat(caster, "You're already shapeshifted!") + return + + var/mob/living/shape = new shapeshift_type(caster.loc) + caster.loc = shape + caster.status_flags |= GODMODE + + current_shapes |= shape + current_casters |= caster + clothes_req = 0 + human_req = 0 + + caster.mind.transfer_to(shape) + +/obj/effect/proc_holder/spell/targeted/shapeshift/proc/Restore(mob/living/shape) + var/mob/living/caster + for(var/mob/living/M in shape) + if(M in current_casters) + caster = M + break + if(!caster) + return + caster.loc = shape.loc + caster.status_flags &= ~GODMODE + + clothes_req = initial(clothes_req) + human_req = initial(human_req) + current_casters.Remove(caster) + current_shapes.Remove(shape) + + shape.mind.transfer_to(caster) + qdel(shape) //Gib it maybe ? + +/obj/effect/proc_holder/spell/targeted/shapeshift/dragon + name = "Dragon Form" + desc = "Take on the shape a lesser ash drake." + invocation = "RAAAAAAAAWR!" + + shapeshift_type = /mob/living/simple_animal/hostile/megafauna/dragon/lesser + list/current_shapes = list(/mob/living/simple_animal/hostile/megafauna/dragon/lesser) + list/current_casters = list() + list/possible_shapes = list(/mob/living/simple_animal/hostile/megafauna/dragon/lesser) \ No newline at end of file diff --git a/code/datums/spells/turf_teleport.dm b/code/datums/spells/turf_teleport.dm index ce3f5720cf0..bcde1d0c2e9 100644 --- a/code/datums/spells/turf_teleport.dm +++ b/code/datums/spells/turf_teleport.dm @@ -1,6 +1,7 @@ /obj/effect/proc_holder/spell/targeted/turf_teleport name = "Turf Teleport" desc = "This spell teleports the target to the turf in range." + nonabstract_req = 1 var/inner_tele_radius = 1 var/outer_tele_radius = 2 diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index a2b11c8a214..84636fdf4fd 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -192,9 +192,10 @@ to_chat(user, "Your flesh begins to melt! Miraculously, you seem fine otherwise.") H.set_species("Skeleton") if(2) - to_chat(user, "You don't feel so good...") - message_admins("[key_name_admin(user)] has started transforming into a dragon via dragon's blood.") - H.ForceContractDisease(new /datum/disease/transformation/dragon(0)) + to_chat(user, "Power courses through you! You can now shift your form at will.") + if(user.mind) + var/obj/effect/proc_holder/spell/targeted/shapeshift/dragon/D = new + user.mind.AddSpell(D) if(3) to_chat(user, "You feel like you could walk straight through lava now.") H.weather_immunities |= "lava" diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm index 5832842b4ca..5ced32e8bfe 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm @@ -264,8 +264,8 @@ Difficulty: Medium /mob/living/simple_animal/hostile/megafauna/dragon/lesser name = "lesser ash drake" - maxHealth = 300 - health = 300 + maxHealth = 200 + health = 200 faction = list("neutral") melee_damage_upper = 30 melee_damage_lower = 30 diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm index c29a6e8a4f8..f939dbdc91f 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -73,7 +73,7 @@ if(isliving(target)) var/mob/living/L = target if(L.stat != DEAD) - if(ranged && ranged_cooldown <= world.time) + if(!client && ranged && ranged_cooldown <= world.time) OpenFire() else devour(L) diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi index 325d886af8a0dd12d449848fbc70c53e57ca932d..9bf1a315131b812c8e28edafce703440b9a096cd 100644 GIT binary patch delta 4885 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 Hu0mjfG!bqY delta 4426 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 diff --git a/paradise.dme b/paradise.dme index e7698d5eeed..d9b5b155bb0 100644 --- a/paradise.dme +++ b/paradise.dme @@ -304,6 +304,7 @@ #include "code\datums\spells\mind_transfer.dm" #include "code\datums\spells\projectile.dm" #include "code\datums\spells\rathens.dm" +#include "code\datums\spells\shapeshift.dm" #include "code\datums\spells\summonitem.dm" #include "code\datums\spells\touch_attacks.dm" #include "code\datums\spells\trigger.dm"