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