Files
Bubberstation/code/modules/admin/verbs/SDQL2/SDQL_spells/spells.dm
SkyratBot 5169789861 [MIRROR] Refactors and improves SDQL spells (#7854)
* Refactors and improves SDQL spells (#60972)

SDQL spells have been improved in several ways:

- The behavior of executing SDQL spell queries using datums has been migrated to a component
- Projectile SDQL spells can now fire any subtype of /obj/projectile
- Touch SDQL spells can use any subtype of /obj/item/melee/touch_attack
- More robust parse error detection
- Parse errors while loading a file from json are displayed in a modal window, with the option to load whatever parts of the spell were correctly parsed (be forewarned, scrollable sections are scuffed, and the ones that appear in the parse error modal can only be scrolled through by drag-selecting the text within them)
- Fixes a bug with the names of variables within lists
- Compartmentalizes SDQL spell code into several .dm files.

Co-authored-by: Aleksej Komarov <stylemistake@ gmail.com>

* Refactors and improves SDQL spells

Co-authored-by: Y0SH1M4S73R <legoboyo@earthlink.net>
Co-authored-by: Aleksej Komarov <stylemistake@ gmail.com>
2021-08-29 23:00:33 +01:00

147 lines
6.3 KiB
Plaintext

/obj/effect/proc_holder/spell/aimed/sdql
name = "Aimed SDQL Spell"
desc = "If you are reading this outside of the \"Give SDQL Spell\" menu, tell the admin that gave this spell to you to use said menu."
projectile_type = /obj/projectile
/obj/effect/proc_holder/spell/aimed/sdql/Initialize(mapload, new_owner, giver)
. = ..()
AddComponent(/datum/component/sdql_executor, giver)
RegisterSignal(src, COMSIG_PROJECTILE_ON_HIT, .proc/on_projectile_hit)
/obj/effect/proc_holder/spell/aimed/sdql/proc/on_projectile_hit(source, firer, target)
var/datum/component/sdql_executor/executor = GetComponent(/datum/component/sdql_executor)
if(!executor)
CRASH("[src]'s SDQL executor component went missing!")
executor.execute(list(target), owner.resolve())
/obj/effect/proc_holder/spell/aoe_turf/sdql
name = "AoE SDQL Spell"
desc = "If you are reading this outside of the \"Give SDQL Spell\" menu, tell the admin that gave this spell to you to use said menu."
/obj/effect/proc_holder/spell/aoe_turf/sdql/Initialize(mapload, new_owner, giver)
. = ..()
AddComponent(/datum/component/sdql_executor, giver)
/obj/effect/proc_holder/spell/aoe_turf/sdql/cast(list/targets, mob/user)
var/datum/component/sdql_executor/executor = GetComponent(/datum/component/sdql_executor)
if(!executor)
CRASH("[src]'s SDQL executor component went missing!")
executor.execute(targets, user)
/obj/effect/proc_holder/spell/cone/sdql
name = "Cone SDQL Spell"
desc = "If you are reading this outside of the \"Give SDQL Spell\" menu, tell the admin that gave this spell to you to use said menu."
var/list/targets = list()
/obj/effect/proc_holder/spell/cone/sdql/Initialize(mapload, new_owner, giver)
. = ..()
AddComponent(/datum/component/sdql_executor, giver)
/obj/effect/proc_holder/spell/cone/sdql/do_mob_cone_effect(mob/living/target_mob, level)
targets |= target_mob
/obj/effect/proc_holder/spell/cone/sdql/do_obj_cone_effect(obj/target_obj, level)
targets |= target_obj
/obj/effect/proc_holder/spell/cone/sdql/do_turf_cone_effect(turf/target_turf, level)
targets |= target_turf
/obj/effect/proc_holder/spell/cone/sdql/cast(list/targets, mob/user)
. = ..()
var/datum/component/sdql_executor/executor = GetComponent(/datum/component/sdql_executor)
if(!executor)
CRASH("[src]'s SDQL executor component went missing!")
executor.execute(targets, user)
targets = list()
/obj/effect/proc_holder/spell/cone/staggered/sdql
name = "Staggered Cone SDQL Spell"
desc = "If you are reading this outside of the \"Give SDQL Spell\" menu, tell the admin that gave this spell to you to use said menu."
var/list/targets = list()
/obj/effect/proc_holder/spell/cone/staggered/sdql/Initialize(mapload, new_owner, giver)
. = ..()
AddComponent(/datum/component/sdql_executor, giver)
/obj/effect/proc_holder/spell/cone/staggered/sdql/do_mob_cone_effect(mob/living/target_mob, level)
targets |= target_mob
/obj/effect/proc_holder/spell/cone/staggered/sdql/do_obj_cone_effect(obj/target_obj, level)
targets |= target_obj
/obj/effect/proc_holder/spell/cone/staggered/sdql/do_turf_cone_effect(turf/target_turf, level)
targets |= target_turf
/obj/effect/proc_holder/spell/cone/staggered/sdql/do_cone_effects(list/target_turf_list, level)
. = ..()
var/datum/component/sdql_executor/executor = GetComponent(/datum/component/sdql_executor)
if(!executor)
CRASH("[src]'s SDQL executor component went missing!")
executor.execute(target_turf_list, owner.resolve())
targets = list()
/obj/effect/proc_holder/spell/pointed/sdql
name = "Pointed SDQL Spell"
desc = "If you are reading this outside of the \"Give SDQL Spell\" menu, tell the admin that gave this spell to you to use said menu."
/obj/effect/proc_holder/spell/pointed/sdql/Initialize(mapload, new_owner, giver)
. = ..()
AddComponent(/datum/component/sdql_executor, giver)
/obj/effect/proc_holder/spell/pointed/sdql/cast(list/targets, mob/user)
var/datum/component/sdql_executor/executor = GetComponent(/datum/component/sdql_executor)
if(!executor)
CRASH("[src]'s SDQL executor component went missing!")
executor.execute(targets, user)
/obj/effect/proc_holder/spell/self/sdql
name = "Self SDQL Spell"
desc = "If you are reading this outside of the \"Give SDQL Spell\" menu, tell the admin that gave this spell to you to use said menu."
/obj/effect/proc_holder/spell/self/sdql/Initialize(mapload, new_owner, giver)
. = ..()
AddComponent(/datum/component/sdql_executor, giver)
/obj/effect/proc_holder/spell/self/sdql/cast(list/targets, mob/user)
var/datum/component/sdql_executor/executor = GetComponent(/datum/component/sdql_executor)
if(!executor)
CRASH("[src]'s SDQL executor component went missing!")
executor.execute(targets, user)
/obj/effect/proc_holder/spell/targeted/sdql
name = "Targeted SDQL Spell"
desc = "If you are reading this outside of the \"Give SDQL Spell\" menu, tell the admin that gave this spell to you to use said menu."
/obj/effect/proc_holder/spell/targeted/sdql/Initialize(mapload, new_owner, giver)
. = ..()
AddComponent(/datum/component/sdql_executor, giver)
/obj/effect/proc_holder/spell/targeted/sdql/cast(list/targets, mob/user)
var/datum/component/sdql_executor/executor = GetComponent(/datum/component/sdql_executor)
if(!executor)
CRASH("[src]'s SDQL executor component went missing!")
executor.execute(targets, user)
/obj/effect/proc_holder/spell/targeted/touch/sdql
name = "Touch SDQL Spell"
desc = "If you are reading this outside of the \"Give SDQL Spell\" menu, tell the admin that gave this spell to you to use said menu."
var/list/hand_var_overrides = list() //The touch attack has its vars changed to the ones put in this list.
/obj/effect/proc_holder/spell/targeted/touch/sdql/Initialize(mapload, new_owner, giver)
. = ..()
AddComponent(/datum/component/sdql_executor, giver)
/obj/effect/proc_holder/spell/targeted/touch/sdql/ChargeHand(mob/living/carbon/user)
if(..())
for(var/V in hand_var_overrides)
if(attached_hand.vars[V])
attached_hand.vv_edit_var(V, hand_var_overrides[V])
RegisterSignal(attached_hand, COMSIG_ITEM_AFTERATTACK, .proc/on_touch_attack)
user.update_inv_hands()
/obj/effect/proc_holder/spell/targeted/touch/sdql/proc/on_touch_attack(source, target, user)
var/datum/component/sdql_executor/executor = GetComponent(/datum/component/sdql_executor)
if(!executor)
CRASH("[src]'s SDQL executor component went missing!")
executor.execute(list(target), user)