diff --git a/code/game/gamemodes/technomancer/catalog.dm b/code/game/gamemodes/technomancer/catalog.dm
index f86f89779b1..7d0ddc6c2ef 100644
--- a/code/game/gamemodes/technomancer/catalog.dm
+++ b/code/game/gamemodes/technomancer/catalog.dm
@@ -25,7 +25,7 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
/obj/item/weapon/technomancer_catalog
name = "catalog"
desc = "A \"book\" featuring a holographic display, metal cover, and miniaturized teleportation device, allowing the user to \
- requisition various things from.. where ever they came from."
+ requisition various things from... wherever they came from."
icon = 'icons/obj/storage.dmi'
icon_state ="scientology" //placeholder
w_class = ITEMSIZE_SMALL
@@ -40,6 +40,7 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
var/tab = 4 // Info tab, so new players can read it before doing anything.
var/spell_tab = ALL_SPELLS
var/show_scepter_text = 0
+ var/universal = FALSE //VOREStation Add - Allows non-technomancers to use this catalog
/obj/item/weapon/technomancer_catalog/apprentice
name = "apprentice's catalog"
@@ -51,12 +52,22 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
budget = 2000
max_budget = 2000
+//VOREStation Add
+/obj/item/weapon/technomancer_catalog/universal
+ name = "universal catalog"
+ desc = "A catalog to be used with the KHI 'Universal Core', shamelessly \
+ copied by a Kitsuhana designer from some group of 'technomancers' or another.
\
+ The back of the book has 'Export Edition' stamped on it."
+ budget = 700
+ max_budget = 700
+ universal = TRUE
+//VOREStation Add End
// Proc: bind_to_owner()
// Parameters: 1 (new_owner - mob that the book is trying to bind to)
// Description: Links the catalog to hopefully the technomancer, so that only they can access it.
/obj/item/weapon/technomancer_catalog/proc/bind_to_owner(var/mob/living/carbon/human/new_owner)
- if(!owner && technomancers.is_antagonist(new_owner.mind))
+ if(!owner && (technomancers.is_antagonist(new_owner.mind) || universal)) //VOREStation Edit - Universal catalogs
owner = new_owner
// Proc: New()
diff --git a/code/game/gamemodes/technomancer/core_obj.dm b/code/game/gamemodes/technomancer/core_obj.dm
index e5a2c5902dc..42fb58e6625 100644
--- a/code/game/gamemodes/technomancer/core_obj.dm
+++ b/code/game/gamemodes/technomancer/core_obj.dm
@@ -35,6 +35,7 @@
var/list/summoned_mobs = list() // Maintained horribly with maintain_summon_list().
var/list/wards_in_use = list() // Wards don't count against the cap for other summons.
var/max_summons = 10 // Maximum allowed summoned entities. Some cores will have different caps.
+ var/universal = FALSE // Allows non-technomancers to use the core - VOREStation Add
/obj/item/weapon/technomancer_core/New()
..()
@@ -88,7 +89,7 @@
if(world.time % 5 == 0) // Maintaining fat lists is expensive, I imagine.
maintain_summon_list()
if(wearer && wearer.mind)
- if(!(technomancers.is_antagonist(wearer.mind))) // In case someone tries to wear a stolen core.
+ if(!(technomancers.is_antagonist(wearer.mind)) && !universal) // In case someone tries to wear a stolen core. //VOREStation Edit - Add universal cores
wearer.adjust_instability(20)
if(!wearer || wearer.stat == DEAD) // Unlock if we're dead or not worn.
canremove = TRUE
@@ -349,4 +350,19 @@
set desc = "Toggles the locking mechanism on your manipulation core."
canremove = !canremove
- to_chat(usr, "You [canremove ? "de" : ""]activate the locking mechanism on \the [src].")
\ No newline at end of file
+ to_chat(usr, "You [canremove ? "de" : ""]activate the locking mechanism on \the [src].")
+
+//For the adminbuse! VOREStation Add
+/obj/item/weapon/technomancer_core/universal
+ name = "universal core"
+ desc = "A bewilderingly complex 'black box' that allows the wearer to accomplish amazing feats. \
+ This one is a copy of a 'technomancer' core, shamelessly ripped off by a Kitsuhana pattern designer \
+ for fun, so that he could perform impressive 'magic'. The pack sloshes slightly if you shake it.
\
+ Under the straps, 'Export Edition' is printed."
+ energy = 7000
+ max_energy = 7000
+ regen_rate = 30 //233 seconds to full
+ instability_modifier = 0.3
+ spell_power_modifier = 0.7
+ universal = TRUE
+//VOREStation Add End
\ No newline at end of file
diff --git a/code/game/gamemodes/technomancer/spell_objs.dm b/code/game/gamemodes/technomancer/spell_objs.dm
index 6d55f80cb4c..2c80ac39fd9 100644
--- a/code/game/gamemodes/technomancer/spell_objs.dm
+++ b/code/game/gamemodes/technomancer/spell_objs.dm
@@ -188,7 +188,7 @@
if(core.loc != owner || owner.back != core) //Make sure the core's being worn.
to_chat(owner, "You need to be wearing a core on your back!")
return 0
- if(!technomancers.is_antagonist(owner.mind)) //Now make sure the person using this is the actual antag.
+ if(!technomancers.is_antagonist(owner.mind) && !core.universal) //Now make sure the person using this is the actual antag. //VOREStation Edit - Universal cores
to_chat(owner, "You can't seem to figure out how to make the machine work properly.")
return 0
return 1
diff --git a/code/game/gamemodes/technomancer/spells/mark_recall.dm b/code/game/gamemodes/technomancer/spells/mark_recall.dm
index b082a33e3de..0d35bce53a1 100644
--- a/code/game/gamemodes/technomancer/spells/mark_recall.dm
+++ b/code/game/gamemodes/technomancer/spells/mark_recall.dm
@@ -8,16 +8,30 @@
ability_icon_state = "tech_mark"
category = UTILITY_SPELLS
-//The object to teleport to when Recall is used.
-/obj/effect/mark_spell
- name = "mark"
- desc = "This is a strange looking disturbance."
- opacity = 0
- density = 0
- anchored = 1
+/datum/technomancer_marker
+ var/weakref/U
+ var/image/I
+ var/turf/T
+
+/datum/technomancer_marker/New(var/mob/user)
+ U = weakref(user)
+ T = get_turf(user)
+ I = image('icons/goonstation/featherzone.dmi', T, "spawn-wall")
+ I.plane = TURF_PLANE
+ I.layer = ABOVE_TURF_LAYER
+ user.client?.images |= I
+ spawn(23) //That's just how long the animation is
+ I.icon_state = "spawn-wall-loop"
+
+/datum/technomancer_marker/Destroy()
+ var/mob/user = U?.resolve()
+ user?.client?.images -= I
+ I?.loc = null
+ U = T = I = null
+ return ..()
//This is global, to avoid looping through a list of all objects, or god forbid, looping through world.
-/var/global/obj/effect/mark_spell/mark_spell_ref = null
+GLOBAL_LIST_INIT(mark_spells, list())
/obj/item/weapon/spell/mark
name = "mark"
@@ -26,17 +40,20 @@
cast_methods = CAST_USE
aspect = ASPECT_TELE
-/obj/item/weapon/spell/mark/on_use_cast(mob/living/user)
+/obj/item/weapon/spell/mark/on_use_cast(var/mob/living/user)
if(!allowed_to_teleport()) // Otherwise you could teleport back to the admin Z-level.
to_chat(user, "You can't teleport here!")
return 0
if(pay_energy(1000))
- if(!mark_spell_ref)
- mark_spell_ref = new(get_turf(user))
- to_chat(user, "You mark \the [get_turf(user)] under you.")
- else
- mark_spell_ref.forceMove(get_turf(user))
+ var/datum/technomancer_marker/marker = GLOB.mark_spells[weakref(user)]
+ //They have one in the list
+ if(istype(marker))
+ qdel(marker)
to_chat(user, "Your mark is moved from its old position to \the [get_turf(user)] under you.")
+ //They don't have one yet
+ else
+ to_chat(user, "You mark \the [get_turf(user)] under you.")
+ GLOB.mark_spells[weakref(user)] = new /datum/technomancer_marker(user)
adjust_instability(5)
return 1
else
@@ -62,9 +79,10 @@
cast_methods = CAST_USE
aspect = ASPECT_TELE
-/obj/item/weapon/spell/recall/on_use_cast(mob/living/user)
+/obj/item/weapon/spell/recall/on_use_cast(var/mob/living/user)
if(pay_energy(3000))
- if(!mark_spell_ref)
+ var/datum/technomancer_marker/marker = GLOB.mark_spells[weakref(user)]
+ if(!istype(marker))
to_chat(user, "There's no Mark!")
return 0
else
@@ -86,7 +104,7 @@
time_left--
sleep(1 SECOND)
- var/turf/target_turf = get_turf(mark_spell_ref)
+ var/turf/target_turf = marker.T
var/turf/old_turf = get_turf(user)
for(var/obj/item/weapon/grab/G in user.contents) // People the Technomancer is grabbing come along for the ride.
diff --git a/maps/tether/submaps/om_ships/aro.dmm b/maps/tether/submaps/om_ships/aro.dmm
index 01469910a79..65903eee224 100644
--- a/maps/tether/submaps/om_ships/aro.dmm
+++ b/maps/tether/submaps/om_ships/aro.dmm
@@ -3501,6 +3501,12 @@
/obj/effect/floor_decal/industrial/outline/blue,
/turf/simulated/floor/tiled/techfloor,
/area/ship/aro/midshipshangars)
+"CT" = (
+/obj/structure/table/rack/shelf/steel,
+/obj/item/weapon/technomancer_core/universal,
+/obj/item/weapon/technomancer_catalog/universal,
+/turf/simulated/floor/tiled/techfloor,
+/area/ship/aro/centralarea)
"GH" = (
/obj/effect/floor_decal/techfloor/orange{
icon_state = "techfloororange_edges";
@@ -12705,7 +12711,7 @@ ds
bv
dG
dP
-Rs
+CT
cH
si
ek