Buff wizard apprentice, limits to one per wizard (The Sequel) (#23258)

* Buff wizard apprentice, limits to one per wizard

* Update restoration apprentice

* fix name of staff of healing

* rebuild tgui

* Apply suggestions from code review

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>

* Apply snake case

* Update tgui.bundle.js

* Update code/game/gamemodes/wizard/artefact.dm

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>

* remove forcewall from stealth

* tgui update and useless comment removal

* Update code/datums/spells/wizard_spells.dm

Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com>

* update tgui

---------

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com>
This commit is contained in:
datlo
2023-12-14 21:35:21 +01:00
committed by GitHub
parent 5a163d7f7a
commit ff53bdd87f
7 changed files with 149 additions and 51 deletions
+11
View File
@@ -19,6 +19,17 @@
icon_state = "banana_touch"
item_state = "banana_touch"
/obj/effect/proc_holder/spell/touch/banana/apprentice
hand_path = /obj/item/melee/touch_attack/banana/apprentice
/obj/item/melee/touch_attack/banana/apprentice
/obj/item/melee/touch_attack/banana/apprentice/afterattack(atom/target, mob/living/carbon/user, proximity)
if(iswizard(target) && target != user)
to_chat(user, "<span class='danger'>Seriously?! Honk THEM, not me!</span>")
return
..()
/obj/item/melee/touch_attack/banana/afterattack(atom/target, mob/living/carbon/user, proximity)
if(!proximity || target == user || !ishuman(target) || !iscarbon(user) || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED))
return
+26
View File
@@ -190,6 +190,29 @@
/obj/effect/proc_holder/spell/area_teleport/teleport/create_new_targeting()
return new /datum/spell_targeting/self
/obj/effect/proc_holder/spell/return_to_teacher
name = "Return to Teacher"
desc = "This spell teleports you back to your teacher."
school = "abjuration"
base_cooldown = 30 SECONDS
clothes_req = TRUE
invocation = "SCYAR TESO"
invocation_type = "shout"
cooldown_min = 10 SECONDS
action_icon_state = "spell_teleport"
var/datum/mind/teacher
/obj/effect/proc_holder/spell/return_to_teacher/create_new_targeting()
return new /datum/spell_targeting/self
/obj/effect/proc_holder/spell/return_to_teacher/cast(list/targets, mob/living/user = usr)
if(!(teacher && teacher.current))
to_chat(user, "<span class='danger'>The link to your teacher is broken!</span>")
return
do_teleport(user, teacher.current, 1, sound_in = 'sound/magic/blink.ogg', sound_out = 'sound/magic/blink.ogg', safe_turf_pick = TRUE)
/obj/effect/proc_holder/spell/forcewall
name = "Force Wall"
desc = "This spell creates a 3 tile wide unbreakable wall that only you can pass through, and does not need wizard garb. Lasts 30 seconds."
@@ -332,6 +355,9 @@
active = FALSE
/obj/effect/proc_holder/spell/fireball/apprentice
centcom_cancast = FALSE
/obj/effect/proc_holder/spell/fireball/create_new_targeting()
var/datum/spell_targeting/clicked_atom/C = new()
C.range = 20
+65 -30
View File
@@ -40,34 +40,8 @@
new /obj/effect/particle_effect/smoke(H.loc)
var/mob/living/carbon/human/M = new/mob/living/carbon/human(H.loc)
M.key = C.key
to_chat(M, "<B>You are the [H.real_name]'s apprentice! You are bound by magic contract to follow [H.p_their()] orders and help [H.p_them()] in accomplishing their goals.")
switch(action)
if("destruction")
M.mind.AddSpell(new /obj/effect/proc_holder/spell/projectile/magic_missile(null))
M.mind.AddSpell(new /obj/effect/proc_holder/spell/fireball(null))
to_chat(M, "<B>Your service has not gone unrewarded, however. Studying under [H.real_name], you have learned powerful, destructive spells. You are able to cast magic missile and fireball.")
if("bluespace")
M.mind.AddSpell(new /obj/effect/proc_holder/spell/area_teleport/teleport(null))
M.mind.AddSpell(new /obj/effect/proc_holder/spell/ethereal_jaunt(null))
to_chat(M, "<B>Your service has not gone unrewarded, however. Studying under [H.real_name], you have learned reality bending mobility spells. You are able to cast teleport and ethereal jaunt.")
if("healing")
M.mind.AddSpell(new /obj/effect/proc_holder/spell/charge(null))
M.mind.AddSpell(new /obj/effect/proc_holder/spell/forcewall(null))
M.equip_to_slot_or_del(new /obj/item/gun/magic/staff/healing(M), SLOT_HUD_RIGHT_HAND)
to_chat(M, "<B>Your service has not gone unrewarded, however. Studying under [H.real_name], you have learned livesaving survival spells. You are able to cast charge and forcewall.")
if("robeless")
M.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe/knock(null))
M.mind.AddSpell(new /obj/effect/proc_holder/spell/mind_transfer(null))
to_chat(M, "<B>Your service has not gone unrewarded, however. Studying under [H.real_name], you have learned stealthy, robeless spells. You are able to cast knock and mindswap.")
M.equip_to_slot_or_del(new /obj/item/radio/headset(M), SLOT_HUD_LEFT_EAR)
M.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(M), SLOT_HUD_JUMPSUIT)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(M), SLOT_HUD_SHOES)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(M), SLOT_HUD_OUTER_SUIT)
M.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(M), SLOT_HUD_HEAD)
M.equip_to_slot_or_del(new /obj/item/storage/backpack(M), SLOT_HUD_BACK)
M.equip_to_slot_or_del(new /obj/item/storage/box(M), SLOT_HUD_IN_BACKPACK)
M.equip_to_slot_or_del(new /obj/item/teleportation_scroll/apprentice(M), SLOT_HUD_RIGHT_STORE)
to_chat(M, "<b>You are [H.real_name]'s apprentice! You are bound by magic contract to follow [H.p_their()] orders and help [H.p_them()] in accomplishing [H.p_their()] goals.</b>")
equip_apprentice(action, M, H)
var/wizard_name_first = pick(GLOB.wizard_first)
var/wizard_name_second = pick(GLOB.wizard_second)
var/randomname = "[wizard_name_first] [wizard_name_second]"
@@ -80,9 +54,8 @@
M.name = newname
var/datum/objective/protect/new_objective = new /datum/objective/protect
new_objective.owner = M.mind
new_objective.target = H.mind
new_objective.explanation_text = "Protect [H.real_name], the wizard."
new_objective.explanation_text = "Protect and obey [H.real_name], your teacher."
M.mind.add_mind_objective(new_objective)
SSticker.mode.apprentices += M.mind
@@ -105,6 +78,68 @@
ui_interact(user)
/obj/item/contract/proc/equip_apprentice(action, mob/living/carbon/human/M, mob/living/carbon/human/H)
M.equip_to_slot_or_del(new /obj/item/radio/headset(M), SLOT_HUD_LEFT_EAR)
if(action == "stealth")
M.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(M), SLOT_HUD_JUMPSUIT)
else
M.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(M), SLOT_HUD_JUMPSUIT)
M.equip_to_slot_or_del(new /obj/item/storage/backpack(M), SLOT_HUD_BACK)
M.equip_to_slot_or_del(new /obj/item/storage/box(M), SLOT_HUD_IN_BACKPACK)
M.equip_to_slot_or_del(new /obj/item/teleportation_scroll/apprentice(M), SLOT_HUD_RIGHT_STORE)
switch(action)
if("fire")
M.mind.AddSpell(new /obj/effect/proc_holder/spell/fireball/apprentice(null))
M.mind.AddSpell(new /obj/effect/proc_holder/spell/sacred_flame(null))
ADD_TRAIT(M, TRAIT_RESISTHEAT, MAGIC_TRAIT)
ADD_TRAIT(M, TRAIT_RESISTHIGHPRESSURE, MAGIC_TRAIT)
M.mind.AddSpell(new /obj/effect/proc_holder/spell/ethereal_jaunt(null))
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(M), SLOT_HUD_SHOES)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/red(M), SLOT_HUD_OUTER_SUIT)
M.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/red(M), SLOT_HUD_HEAD)
to_chat(M, "<b>Your service has not gone unrewarded. Under the tutelage of [H.real_name], you've acquired proficiency in the fundamentals of Firebending, enabling you to cast spells like Fireball, Sacred Flame, and Ethereal Jaunt.</b>")
to_chat(M, "<b>You are immune to fire, but you are NOT immune to the explosions caused by your fireballs. Neither is your teacher, for that matter. Be careful!</b>")
if("translocation")
M.mind.AddSpell(new /obj/effect/proc_holder/spell/area_teleport/teleport(null))
M.mind.AddSpell(new /obj/effect/proc_holder/spell/turf_teleport/blink(null))
M.mind.AddSpell(new /obj/effect/proc_holder/spell/ethereal_jaunt(null))
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(M), SLOT_HUD_SHOES)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(M), SLOT_HUD_OUTER_SUIT)
M.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(M), SLOT_HUD_HEAD)
to_chat(M, "<b>Your service has not gone unrewarded. While studying under [H.real_name], you mastered reality-bending mobility spells, allowing you to cast Teleport, Blink, and Ethereal Jaunt.</b>")
if("restoration")
M.mind.AddSpell(new /obj/effect/proc_holder/spell/charge(null))
M.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe/knock(null))
var/obj/effect/proc_holder/spell/return_to_teacher/S = new /obj/effect/proc_holder/spell/return_to_teacher(null)
S.teacher = H.mind
M.mind.AddSpell(S)
M.equip_to_slot_or_del(new /obj/item/gun/magic/staff/healing(M), SLOT_HUD_RIGHT_HAND)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/marisa(M), SLOT_HUD_SHOES)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/marisa(M), SLOT_HUD_OUTER_SUIT)
M.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/marisa(M), SLOT_HUD_HEAD)
to_chat(M, "<b>Your service has not gone unrewarded. Under the guidance of [H.real_name], you've acquired life-saving survival spells. You can now cast Charge and Knock, and possess the ability to teleport back to your mentor.</b>")
to_chat(M, "<b>Your Charge spell can be used to recharge your Staff of Healing or reduce the cooldowns of your teacher, if you are grabbing them with empty hands.</b>")
if("stealth")
M.mind.AddSpell(new /obj/effect/proc_holder/spell/mind_transfer(null))
M.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe/knock(null))
M.mind.AddSpell(new /obj/effect/proc_holder/spell/fireball/toolbox(null))
M.mind.AddSpell(new /obj/effect/proc_holder/spell/summonitem(null))
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), SLOT_HUD_SHOES)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(M), SLOT_HUD_WEAR_MASK)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow(M), SLOT_HUD_GLOVES)
M.equip_to_slot_or_del(new /obj/item/storage/belt/utility/full(M), SLOT_HUD_BELT)
to_chat(M, "<b>Your service has not gone unrewarded. Under the mentorship of [H.real_name], you've mastered stealthy, robeless spells. You can now cast Mindswap, Knock, Homing Toolbox, Forcewall, and Instant Summons without the need for wizard robes.</b>")
if("honk")
M.mind.AddSpell(new /obj/effect/proc_holder/spell/touch/banana/apprentice(null))
M.mind.AddSpell(new /obj/effect/proc_holder/spell/ethereal_jaunt(null))
M.mind.AddSpell(new /obj/effect/proc_holder/spell/summonitem(null))
M.equip_to_slot_or_del(new /obj/item/gun/magic/staff/slipping(M), SLOT_HUD_RIGHT_HAND)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes/magical/nodrop(M), SLOT_HUD_SHOES)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/clown(M), SLOT_HUD_OUTER_SUIT)
M.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/clown(M), SLOT_HUD_HEAD)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clownwiz(M), SLOT_HUD_WEAR_MASK)
to_chat(M, "<b>Your dedication pays off! Under [H.real_name]'s guidance, you've mastered magical honkings, seamlessly casting spells like Banana Touch, Ethereal Jaunt, and Instant Summons, while skillfully wielding a Staff of Slipping. Honk!</b>")
///////////////////////////Veil Render//////////////////////
/obj/item/veilrender
+2
View File
@@ -615,6 +615,8 @@
desc = "A magical contract binding an apprentice wizard to your service, using it will summon them to your side."
item_path = /obj/item/contract
category = "Summons"
limit = 1
is_ragin_restricted = TRUE //We have enough wizards already! Sheesh!
/datum/spellbook_entry/item/tarotdeck
name = "Guardian Deck"
@@ -119,6 +119,10 @@
desc = "Standard-issue shoes of the wizarding class clown. Damn they're huge! And powerful! Somehow."
magical = TRUE
/obj/item/clothing/shoes/clown_shoes/magical/nodrop
desc = "Standard-issue shoes of the wizarding class clown. Damn they're huge! And stuck to your feet!"
flags = NODROP
/obj/item/clothing/shoes/clown_shoes/slippers
actions_types = list(/datum/action/item_action/slipping)
enabled_waddle = FALSE
@@ -26,49 +26,69 @@ export const WizardApprenticeContract = (props, context) => {
</Section>
<Section title="Which school of magic is your apprentice studying?">
<LabeledList>
<LabeledList.Item label="Destruction">
Your apprentice is skilled in offensive magic. They know Magic
Missile and Fireball.
<LabeledList.Item label="Fire">
Your apprentice is skilled in bending fire. <br />
They know Fireball, Sacred Flame, and Ethereal Jaunt.
<br />
<Button
content="Select"
disabled={used}
onClick={() => act('destruction')}
onClick={() => act('fire')}
/>
</LabeledList.Item>
<LabeledList.Divider />
<LabeledList.Item label="Bluespace Manipulation">
Your apprentice is able to defy physics, melting through solid
objects and travelling great distances in the blink of an eye.
They know Teleport and Ethereal Jaunt.
<LabeledList.Item label="Translocation">
Your apprentice is able to defy physics, learning how to move
through bluespace. <br />
They know Teleport, Blink and Ethereal Jaunt.
<br />
<Button
content="Select"
disabled={used}
onClick={() => act('bluespace')}
onClick={() => act('translocation')}
/>
</LabeledList.Item>
<LabeledList.Divider />
<LabeledList.Item label="Healing">
Your apprentice is training to cast spells that will aid your
survival. They know Forcewall and Charge and come with a Staff of
Healing.
<LabeledList.Item label="Restoration">
Your apprentice is dedicated to supporting your magical prowess.
<br />
They come equipped with a Staff of Healing, have the unique
ability to teleport back to you, and know Charge and Knock.
<br />
<Button
content="Select"
disabled={used}
onClick={() => act('healing')}
onClick={() => act('restoration')}
/>
</LabeledList.Item>
<LabeledList.Divider />
<LabeledList.Item label="Robeless">
Your apprentice is training to cast spells without their robes.
They know Knock and Mindswap.
<LabeledList.Item label="Stealth">
Your apprentice is learning the art of infiltrating mundane
facilities. <br />
They know Mindswap, Knock, Homing Toolbox, and Instant Summons,
all of which can be cast without robes. They also join you in a
Maintenance Dweller disguise, complete with Gloves of Shock
Immunity and a Belt of Tools.
<br />
<Button
content="Select"
disabled={used}
onClick={() => act('robeless')}
onClick={() => act('stealth')}
/>
</LabeledList.Item>
<LabeledList.Divider />
<LabeledList.Item label="Honk">
Your apprentice is here to spread the Honkmother&apos;s blessings.
<br />
They know Banana Touch, Instant Summons, Ethereal Jaunt, and come
equipped with a Staff of Slipping. <br />
While under your tutelage, they have been &apos;blessed&apos; with
clown shoes that are impossible to remove.
<br />
<Button
content="Select"
disabled={used}
onClick={() => act('honk')}
/>
</LabeledList.Item>
<LabeledList.Divider />
File diff suppressed because one or more lines are too long