diff --git a/code/modules/spells/roguetown/arcane/blindness.dm b/code/modules/spells/roguetown/arcane/blindness.dm new file mode 100644 index 00000000..dbce6704 --- /dev/null +++ b/code/modules/spells/roguetown/arcane/blindness.dm @@ -0,0 +1,23 @@ +// BLINDNESS-------------- + +/obj/effect/proc_holder/spell/arcane/blindness + name = "Blindness" + desc = "" + overlay_state = "blindness" + releasedrain = 40 + chargedrain = 0 + chargetime = 0 + charge_max = 10 SECONDS + range = 7 + movement_interrupt = FALSE + sound = 'sound/magic/churn.ogg' + antimagic_allowed = TRUE + +/obj/effect/proc_holder/spell/arcane/blindness/cast(list/targets, mob/user = usr) + if(isliving(targets[1])) + var/mob/living/target = targets[1] + if(target.anti_magic_check(TRUE, TRUE)) + return FALSE + target.visible_message(span_warning("[user] points at [target]'s eyes!"),span_warning("My eyes are covered in darkness!")) + target.blind_eyes(2) + return TRUE \ No newline at end of file diff --git a/code/modules/spells/roguetown/arcane/blink.dm b/code/modules/spells/roguetown/arcane/blink.dm new file mode 100644 index 00000000..b5f8f9d5 --- /dev/null +++ b/code/modules/spells/roguetown/arcane/blink.dm @@ -0,0 +1,30 @@ +//BLINK----------------- + +/obj/effect/proc_holder/spell/arcane/blink + name = "Blink" + desc = "" + overlay_state = "blink" + sound = 'sound/magic/magic_nulled.ogg' + range = 8 + releasedrain = 50 + chargedrain = 0 + chargetime = 0 + charge_max = 15 SECONDS + var/include_space = FALSE //whether it includes space tiles in possible teleport locations + var/include_dense = FALSE //whether it includes dense tiles in possible teleport locations + +/obj/effect/temp_visual/blink + icon_state = "anom" + layer = ABOVE_MOB_LAYER + plane = GAME_PLANE_UPPER + +/obj/effect/proc_holder/spell/arcane/blink/cast(list/targets,mob/user = usr) + . = ..() + if(isopenturf(targets[1])) + var/atom/location = get_turf(targets[1]) + new /obj/effect/temp_visual/swap(get_turf(user)) + new /obj/effect/temp_visual/swap(get_turf(location)) + do_teleport(user, location, forceMove = TRUE, channel = TELEPORT_CHANNEL_MAGIC) + return TRUE + else + return FALSE \ No newline at end of file diff --git a/code/modules/spells/roguetown/arcane/fetch.dm b/code/modules/spells/roguetown/arcane/fetch.dm new file mode 100644 index 00000000..f17f4a07 --- /dev/null +++ b/code/modules/spells/roguetown/arcane/fetch.dm @@ -0,0 +1,26 @@ +//FETCH------------------------- + +/obj/effect/proc_holder/spell/arcane/projectile/fetch + name = "Fetch" + desc = "" + range = 15 + projectile_type = /obj/projectile/magic/fetch + overlay_state = "fetch" + sound = list('sound/magic/magnet.ogg') + releasedrain = 5 + chargedrain = 0 + chargetime = 0 + charge_max = 5 SECONDS + warnie = "spellwarning" + no_early_release = TRUE + charging_slowdown = 1 + +/obj/projectile/magic/fetch/on_hit(target) + . = ..() + if(ismob(target)) + var/mob/M = target + if(M.anti_magic_check()) + visible_message(span_warning("[target] repells the fetch!")) + playsound(get_turf(target), 'sound/magic/magic_nulled.ogg', 100) + qdel(src) + return BULLET_ACT_BLOCK \ No newline at end of file diff --git a/code/modules/spells/roguetown/arcane/fireball.dm b/code/modules/spells/roguetown/arcane/fireball.dm new file mode 100644 index 00000000..b7037c02 --- /dev/null +++ b/code/modules/spells/roguetown/arcane/fireball.dm @@ -0,0 +1,72 @@ +//FIREBALL------------------------- + +/obj/effect/proc_holder/spell/arcane/projectile/fireball + name = "Fireball" + desc = "" + clothes_req = FALSE + range = 8 + projectile_type = /obj/projectile/magic/aoe/fireball/rogue + overlay_state = "fireball" + sound = list('sound/magic/fireball.ogg') + active = FALSE + releasedrain = 30 + chargedrain = 1 + chargetime = 15 + charge_max = 10 SECONDS + warnie = "spellwarning" + no_early_release = TRUE + movement_interrupt = FALSE + charging_slowdown = 3 + +/obj/effect/proc_holder/spell/arcane/projectile/fireball/fire_projectile(list/targets, mob/living/user) + projectile_var_overrides = list("range" = 8) + return ..() + +/obj/projectile/magic/aoe/fireball/rogue + name = "fireball" + exp_heavy = 0 + exp_light = 0 + exp_flash = 0 + exp_fire = 1 + damage = 10 + damage_type = BURN + nodamage = FALSE + flag = "magic" + hitsound = 'sound/blank.ogg' + +/obj/projectile/magic/aoe/fireball/rogue/on_hit(target) + . = ..() + if(ismob(target)) + var/mob/M = target + if(M.anti_magic_check()) + visible_message(span_warning("[src] fizzles on contact with [target]!")) + playsound(get_turf(target), 'sound/magic/magic_nulled.ogg', 100) + qdel(src) + return BULLET_ACT_BLOCK + +//GREATER FIREBALL------------------------- + +/obj/effect/proc_holder/spell/arcane/projectile/fireball/greater + name = "Greater Fireball" + desc = "" + clothes_req = FALSE + range = 8 + projectile_type = /obj/projectile/magic/aoe/fireball/rogue/great + overlay_state = "greaterfireball" + sound = list('sound/magic/fireball.ogg') + releasedrain = 50 + chargedrain = 1 + chargetime = 15 + charge_max = 10 SECONDS + warnie = "spellwarning" + no_early_release = TRUE + movement_interrupt = TRUE + chargedloop = /datum/looping_sound/invokegen + +/obj/projectile/magic/aoe/fireball/rogue/great + name = "fireball" + exp_heavy = 0 + exp_light = 1 + exp_flash = 2 + exp_fire = 2 + flag = "magic" \ No newline at end of file diff --git a/code/modules/spells/roguetown/arcane/ignite.dm b/code/modules/spells/roguetown/arcane/ignite.dm new file mode 100644 index 00000000..6c08ccda --- /dev/null +++ b/code/modules/spells/roguetown/arcane/ignite.dm @@ -0,0 +1,35 @@ +//IGNITE------------------ + +/obj/effect/proc_holder/spell/arcane/ignite + name = "Ignite" + desc = "" + overlay_state = "flame" + sound = 'sound/items/firelight.ogg' + range = 4 + releasedrain = 30 + chargedrain = 0 + chargetime = 0 + charge_max = 10 SECONDS + +/obj/effect/proc_holder/spell/arcane/ignite/cast(list/targets, mob/user = usr) + . = ..() + if(isliving(targets[1])) + var/mob/living/L = targets[1] + user.visible_message("[user] points at [L]!") + if(L.anti_magic_check(TRUE, TRUE)) + return FALSE + L.adjust_fire_stacks(5) + L.IgniteMob() + addtimer(CALLBACK(L, TYPE_PROC_REF(/mob/living, ExtinguishMob)), 5 SECONDS) + return TRUE + + // Spell interaction with ignitable objects (burn wooden things, light torches up) + else if(isobj(targets[1])) + var/obj/O = targets[1] + if(O.fire_act()) + user.visible_message("[user] points at [O], igniting it in flames!") + return TRUE + else + to_chat(user, span_warning("You point at [O], but it fails to catch fire.")) + return FALSE + return FALSE \ No newline at end of file diff --git a/code/modules/spells/roguetown/arcane/invisibility.dm b/code/modules/spells/roguetown/arcane/invisibility.dm new file mode 100644 index 00000000..6d157993 --- /dev/null +++ b/code/modules/spells/roguetown/arcane/invisibility.dm @@ -0,0 +1,26 @@ +// INVISIBILITY-------------- + +/obj/effect/proc_holder/spell/arcane/invisibility + name = "Invisibility" + desc = "" + overlay_state = "invisibility" + releasedrain = 50 + chargedrain = 0 + chargetime = 0 + charge_max = 30 SECONDS + range = 3 + movement_interrupt = FALSE + sound = 'sound/misc/area.ogg' //This sound doesnt play for some reason. Fix me. + antimagic_allowed = TRUE + +/obj/effect/proc_holder/spell/arcane/invisibility/cast(list/targets, mob/living/user) + if(isliving(targets[1])) + var/mob/living/target = targets[1] + if(target.anti_magic_check(TRUE, TRUE)) + return FALSE + target.visible_message(span_warning("[target] starts to fade into thin air!"), span_notice("You start to become invisible!")) + animate(target, alpha = 0, time = 1 SECONDS, easing = EASE_IN) + target.mob_timers[MT_INVISIBILITY] = world.time + 15 SECONDS + addtimer(CALLBACK(target, TYPE_PROC_REF(/mob/living, update_sneak_invis), TRUE), 15 SECONDS) + addtimer(CALLBACK(target, TYPE_PROC_REF(/atom/movable, visible_message), span_warning("[target] fades back into view."), span_notice("You become visible again.")), 15 SECONDS) + return FALSE \ No newline at end of file diff --git a/code/modules/spells/roguetown/arcane/lightning.dm b/code/modules/spells/roguetown/arcane/lightning.dm new file mode 100644 index 00000000..1476cdfc --- /dev/null +++ b/code/modules/spells/roguetown/arcane/lightning.dm @@ -0,0 +1,48 @@ +//LIGHTNING--------------- + +/obj/effect/proc_holder/spell/arcane/projectile/lightningbolt + name = "Bolt of Lightning" + desc = "" + overlay_state = "lightning" + sound = 'sound/magic/lightning.ogg' + range = 8 + projectile_type = /obj/projectile/magic/lightning + releasedrain = 30 + chargedrain = 1 + chargetime = 15 + charge_max = 10 SECONDS + movement_interrupt = FALSE + charging_slowdown = 3 + +/obj/projectile/magic/lightning + name = "bolt of lightning" + tracer_type = /obj/effect/projectile/tracer/stun + muzzle_type = null + impact_type = null + hitscan = TRUE + movement_type = UNSTOPPABLE + light_color = LIGHT_COLOR_WHITE + damage = 15 + damage_type = BURN + nodamage = FALSE + speed = 0.3 + flag = "magic" + light_color = "#ffffff" + light_range = 7 + +/obj/projectile/magic/lightning/on_hit(target) + . = ..() + if(ismob(target)) + var/mob/M = target + if(M.anti_magic_check()) + visible_message(span_warning("[src] fizzles on contact with [target]!")) + playsound(get_turf(target), 'sound/magic/magic_nulled.ogg', 100) + qdel(src) + return BULLET_ACT_BLOCK + if(isliving(target)) + var/mob/living/L = target +// for(var/obj/item/I in L.get_equipped_items()) //Maybe add 5 damage for each metal gear in the target? +// if(I.smeltresult == /obj/item/ingot/iron) //More damage if the target is on water tuff too? +// damage += 5 //(dont know it that code work tho) + L.electrocute_act(1, src) + qdel(src) \ No newline at end of file diff --git a/code/modules/spells/roguetown/arcane/smokescreen.dm b/code/modules/spells/roguetown/arcane/smokescreen.dm new file mode 100644 index 00000000..d1b30d5a --- /dev/null +++ b/code/modules/spells/roguetown/arcane/smokescreen.dm @@ -0,0 +1,68 @@ +//SMOKESCREEN----------------- + +/obj/effect/proc_holder/spell/arcane/smokescreen + name = "Smokescreen" + desc = "" + overlay_state = "smoke" + sound = 'sound/items/firesnuff.ogg' + range = 8 + releasedrain = 30 + chargedrain = 0 + chargetime = 0 + charge_max = 10 SECONDS + smoke_spread = 1 //Just Smoke + smoke_amt = 2 + +/obj/effect/proc_holder/spell/arcane/smokescreen/cast(list/targets,mob/user = usr) + . = ..() + if(isliving(targets[1])) + return TRUE + else if(isopenturf(targets[1])) + return TRUE + return FALSE + +//DENSE SMOKE------------------- + +/obj/effect/proc_holder/spell/arcane/densesmoke + name = "Dense Smoke" + desc = "" + overlay_state = "smoke" + sound = 'sound/items/firesnuff.ogg' + range = 8 + releasedrain = 40 + chargedrain = 1 + chargetime = 10 + charge_max = 15 SECONDS + smoke_spread = 2 //Now it makes the target cough and drop items in hand + smoke_amt = 1 + +/obj/effect/proc_holder/spell/arcane/densesmoke/cast(list/targets,mob/user = usr) + . = ..() + if(isliving(targets[1])) + return TRUE + else if(isopenturf(targets[1])) + return TRUE + return FALSE + +//SLEEPING GAS------------------- + +/obj/effect/proc_holder/spell/arcane/sleepgas + name = "Sleeping Gas" + desc = "" + overlay_state = "smoke" + sound = 'sound/items/firesnuff.ogg' + range = 8 + releasedrain = 60 + chargedrain = 1 + chargetime = 30 + charge_max = 30 SECONDS + smoke_spread = 3 //Now this will make the target to fall asleep + smoke_amt = 2 + +/obj/effect/proc_holder/spell/arcane/sleepgas/cast(list/targets,mob/user = usr) + . = ..() + if(isliving(targets[1])) + return TRUE + else if(isopenturf(targets[1])) + return TRUE + return FALSE \ No newline at end of file diff --git a/code/modules/spells/roguetown/arcane/swap.dm b/code/modules/spells/roguetown/arcane/swap.dm new file mode 100644 index 00000000..2ef5e107 --- /dev/null +++ b/code/modules/spells/roguetown/arcane/swap.dm @@ -0,0 +1,35 @@ +//SWAP PLACES----------------- + +/obj/effect/proc_holder/spell/arcane/swap + name = "Location Swap" + desc = "" + overlay_state = "swap" + sound = 'sound/magic/magic_nulled.ogg' + range = 8 + releasedrain = 50 + chargedrain = 1 + chargetime = 15 + charge_max = 20 SECONDS + charging_slowdown = 3 + var/include_space = FALSE //whether it includes space tiles in possible teleport locations + var/include_dense = FALSE //whether it includes dense tiles in possible teleport locations + +/obj/effect/temp_visual/swap + icon_state = "anom" + layer = ABOVE_MOB_LAYER + plane = GAME_PLANE_UPPER + +/obj/effect/proc_holder/spell/arcane/swap/cast(list/targets, mob/living/user) + if(isliving(targets[1])) + var/mob/living/target = targets[1] + if(target.anti_magic_check(TRUE, TRUE)) + return FALSE + new /obj/effect/temp_visual/swap(get_turf(user)) + new /obj/effect/temp_visual/swap(get_turf(target)) + var/atom/targl = get_turf(target) + if(do_teleport(target, user, forceMove = TRUE, channel = TELEPORT_CHANNEL_MAGIC)) + do_teleport(user, targl, forceMove = TRUE, channel = TELEPORT_CHANNEL_MAGIC) + if(ismob(target)) + var/mob/M = target + to_chat(M, span_warning("You find myself somewhere else...")) + return TRUE \ No newline at end of file diff --git a/code/modules/spells/roguetown/arcane/telepathy.dm b/code/modules/spells/roguetown/arcane/telepathy.dm new file mode 100644 index 00000000..ed70c87c --- /dev/null +++ b/code/modules/spells/roguetown/arcane/telepathy.dm @@ -0,0 +1,28 @@ +//TELEPATHY--------------------------- + +/obj/effect/proc_holder/spell/arcane/telepathy + name = "telepathy" + desc = "" + range = 15 + overlay_state = "psy" + sound = list('sound/magic/magnet.ogg') + releasedrain = 20 + chargedrain = 0 + chargetime = 0 + charge_max = 15 SECONDS + warnie = "spellwarning" + no_early_release = TRUE + charging_slowdown = 1 + +/obj/effect/proc_holder/spell/arcane/telepathy/cast(list/targets,mob/user = usr) + . = ..() + if(isliving(targets[1])) + var/mob/living/target = targets[1] + if(target.anti_magic_check(TRUE, TRUE)) + return FALSE + var/input = stripped_input(user, "What message are you sending?", null, "") + if(!input) + return FALSE + to_chat(user, span_warning("I transmit to [target]: " + "[input]")) + to_chat(target, span_warning("You hear a voice in your head saying: ") + span_boldwarning("[input]")) + return TRUE \ No newline at end of file