diff --git a/code/game/gamemodes/technomancer/assistance/assistance.dm b/code/game/gamemodes/technomancer/assistance/assistance.dm
index 3ec95a1f5c7..9ed25aa0fa0 100644
--- a/code/game/gamemodes/technomancer/assistance/assistance.dm
+++ b/code/game/gamemodes/technomancer/assistance/assistance.dm
@@ -27,4 +27,38 @@
functions. It also has a large storage capacity for energy, and due to it's synthetic nature, instability is less of an issue for them."
cost = 350
obj_path = /obj/item/antag_spawner/technomancer_apprentice/golem
- one_use_only = TRUE
\ No newline at end of file
+ one_use_only = TRUE
+
+/datum/technomancer/assistance/summoning_stone
+ name = "Summoning Stone"
+ desc = "A summoning stone is a small bluespace stone that's intra-dimensionally linked to a Core Bracelet, a miniaturized version of a manipulation core. \
+ Upon crushing the crystal in one's hand, the bracelet will appear on their wrist and a catalog in their hand. You can give this to anyone you deem worthy to bring them into the fold. \
+ NOTE: The agent will in no way have their free will modified, they can do whatever they wish with their power."
+ cost = 150
+ obj_path = /obj/item/summoning_stone
+
+/obj/item/summoning_stone
+ name = "small bluespace crystal"
+ desc = "A smaller variant of the bluespace crystal. This one probably isn't big enough to teleport you around."
+ icon = 'icons/obj/telescience.dmi'
+ icon_state = "bluespace_crystal_small"
+
+/obj/item/summoning_stone/attack_self(mob/living/carbon/human/user)
+ if(!ishuman(user) || !user.mind)
+ return
+ // since this gives us a catalogue with more points than it costs, prevent the antag from farming points by using this
+ if(technomancers.is_technomancer(user.mind))
+ to_chat(user, SPAN_WARNING("You're already in the fold, you can't use this!"))
+ return
+ var/turf/user_turf = get_turf(user)
+ user.drop_from_inventory(src, user_turf)
+ user.visible_message(SPAN_DANGER("[user] crushes \the [src] in their hand with a shower of sparks! A small bracelet appears on their wrist, and a catalog flies into their hand."), SPAN_DANGER("You crush \the [src] in your hand with a shower of sparks! A small bracelet appears on your wrist, and a catalog flies into your hand."))
+ spark(user_turf, 4, alldirs)
+ if(user.wrists)
+ user.drop_from_inventory(user.wrists, get_turf(user_turf))
+ var/obj/item/technomancer_core/bracelet/bracelet = new(user_turf)
+ user.equip_to_slot_if_possible(bracelet, slot_wrists, assisted_equip = TRUE)
+ var/obj/item/technomancer_catalog/initiate/catalog = new(user_turf)
+ catalog.owner = user
+ user.put_in_active_hand(catalog)
+ qdel(src)
diff --git a/code/game/gamemodes/technomancer/catalog.dm b/code/game/gamemodes/technomancer/catalog.dm
index 7532aa41319..712f57d380f 100644
--- a/code/game/gamemodes/technomancer/catalog.dm
+++ b/code/game/gamemodes/technomancer/catalog.dm
@@ -45,15 +45,25 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
var/spell_tab = ALL_SPELLS
var/show_scepter_text = 0
+ var/has_assistance_items = TRUE
+
/obj/item/technomancer_catalog/apprentice
name = "apprentice's catalog"
budget = 700
max_budget = 700
+ has_assistance_items = FALSE
/obj/item/technomancer_catalog/golem
name = "golem's catalog"
budget = 500
max_budget = 500
+ has_assistance_items = FALSE
+
+/obj/item/technomancer_catalog/initiate
+ name = "initiate's catalog"
+ budget = 300
+ max_budget = 300
+ has_assistance_items = FALSE
/obj/item/technomancer_catalog/master //for badmins, I suppose
name = "master's catalog"
@@ -88,19 +98,10 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
if(!consumable_instances.len)
for(var/C in all_technomancer_consumables)
consumable_instances += new C()
- if(!assistance_instances.len)
- for(var/A in all_technomancer_assistance)
- assistance_instances += new A()
-
-/obj/item/technomancer_catalog/apprentice/set_up()
- ..()
- for(var/datum/technomancer/assistance/A in assistance_instances)
- assistance_instances.Remove(A)
-
-/obj/item/technomancer_catalog/golem/set_up()
- ..()
- for(var/datum/technomancer/assistance/A in assistance_instances)
- assistance_instances.Remove(A)
+ if(has_assistance_items)
+ if(!assistance_instances.len)
+ for(var/A in all_technomancer_assistance)
+ assistance_instances += new A()
// Proc: show_categories()
// Parameters: 1 (category - the category link to display)
@@ -132,7 +133,8 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
dat += "Functions | "
dat += "Equipment | "
dat += "Consumables | "
- dat += "Assistance | "
+ if(length(assistance_instances))
+ dat += "Assistance | "
dat += "Info
"
dat += "You currently have a budget of [budget]/[max_budget].
"
dat += "Refund Functions
"
@@ -164,7 +166,8 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
dat += "Functions | "
dat += "Equipment | "
dat += "Consumables | "
- dat += "Assistance | "
+ if(length(assistance_instances))
+ dat += "Assistance | "
dat += "Info
"
dat += "You currently have a budget of [budget]/[max_budget].
"
for(var/datum/technomancer/equipment/E in equipment_instances)
@@ -184,7 +187,8 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
dat += "Functions | "
dat += "Equipment | "
dat += "Consumables | "
- dat += "Assistance | "
+ if(length(assistance_instances))
+ dat += "Assistance | "
dat += "Info
"
dat += "You currently have a budget of [budget]/[max_budget].
"
for(var/datum/technomancer/consumable/C in consumable_instances)
@@ -224,7 +228,8 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
dat += "Functions | "
dat += "Equipment | "
dat += "Consumables | "
- dat += "Assistance | "
+ if(length(assistance_instances))
+ dat += "Assistance | "
dat += "Info
"
dat += "You currently have a budget of [budget]/[max_budget].
"
dat += "
"
@@ -316,10 +321,7 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
new_spell = spell
break
- var/obj/item/technomancer_core/core = null
- if(istype(H.back, /obj/item/technomancer_core))
- core = H.back
-
+ var/obj/item/technomancer_core/core = H.get_technomancer_core()
if(new_spell && core)
if(new_spell.cost <= budget)
if(!core.has_spell(new_spell))
@@ -358,9 +360,7 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
if(T.z in current_map.player_levels)
to_chat(H, "You can only refund at your base, it's too late now!")
return
- var/obj/item/technomancer_core/core = null
- if(istype(H.back, /obj/item/technomancer_core))
- core = H.back
+ var/obj/item/technomancer_core/core = H.get_technomancer_core()
if(core)
for(var/obj/spellbutton/spell in core.spells)
for(var/datum/technomancer/spell/spell_datum in spell_instances)
diff --git a/code/game/gamemodes/technomancer/core_obj.dm b/code/game/gamemodes/technomancer/core_obj.dm
index eae508e6b64..161ce105889 100644
--- a/code/game/gamemodes/technomancer/core_obj.dm
+++ b/code/game/gamemodes/technomancer/core_obj.dm
@@ -31,7 +31,9 @@
var/max_summons = 10 // Maximum allowed summoned entities. Some cores will have different caps.
var/never_remove = FALSE // whether it can ever be removed
+ var/simple_operation = FALSE // whether anyone can use this core
+ var/can_chameleon = TRUE
var/global/list/chameleon_options
/obj/item/technomancer_core/Initialize()
@@ -41,10 +43,11 @@
verbs += /obj/item/technomancer_core/proc/toggle_lock
else
canremove = FALSE
- if(!chameleon_options)
+ if(can_chameleon && !chameleon_options)
var/list/blocked = list(/obj/item/storage/backpack/satchel/leather/withwallet) + typesof(/obj/item/technomancer_core)
chameleon_options = list("Reset")
chameleon_options += generate_chameleon_choices(/obj/item/storage/backpack, blocked)
+ verbs += /obj/item/technomancer_core/proc/change_appearance
/obj/item/technomancer_core/Destroy()
dismiss_all_summons()
@@ -69,11 +72,8 @@
// 'pay_energy' is too vague of a name for a proc at the mob level.
/mob/proc/technomancer_pay_energy(amount)
- return FALSE
-
-/mob/living/carbon/human/technomancer_pay_energy(amount)
- if(istype(back, /obj/item/technomancer_core))
- var/obj/item/technomancer_core/TC = back
+ var/obj/item/technomancer_core/TC = get_technomancer_core()
+ if(TC)
return TC.pay_energy(amount)
return FALSE
@@ -144,7 +144,7 @@
wards_in_use -= ward
qdel(ward)
-/obj/item/technomancer_core/verb/change_appearance(picked in chameleon_options)
+/obj/item/technomancer_core/proc/change_appearance(picked in chameleon_options)
set name = "Change Core Appearance"
set category = "Chameleon Items"
set src in usr
@@ -202,8 +202,8 @@
/mob/living/carbon/human/Stat()
. = ..()
- if(. && istype(back,/obj/item/technomancer_core))
- var/obj/item/technomancer_core/core = back
+ var/obj/item/technomancer_core/core = get_technomancer_core()
+ if(core)
setup_technomancer_stat(core)
/mob/living/carbon/human/proc/setup_technomancer_stat(var/obj/item/technomancer_core/core)
@@ -249,8 +249,9 @@
/mob/living/carbon/human/proc/wiz_energy_update_hud()
if(client && hud_used)
- if(istype(back, /obj/item/technomancer_core)) //I reckon there's a better way of doing this.
- var/obj/item/technomancer_core/core = back
+ //I reckon there's a better way of doing this.
+ var/obj/item/technomancer_core/core = get_technomancer_core()
+ if(core)
energy_display.set_invisibility(0)
instability_display.set_invisibility(0)
var/ratio = core.energy / core.max_energy
@@ -386,6 +387,22 @@
instability_modifier = 0.75
never_remove = TRUE
+/obj/item/technomancer_core/bracelet
+ name = "bracelet core"
+ desc = "A bewilderingly complex 'black box' that allows the wearer to accomplish amazing feats. This variant is miniaturized and made to be simple to use, even though the internals are... nearly impossible to decipher."
+ icon_state = "bracelet_core"
+ item_state = "bracelet_core"
+ contained_sprite = TRUE
+ w_class = ITEMSIZE_SMALL
+ slot_flags = SLOT_WRISTS
+ energy = 5000
+ max_energy = 5000
+ regen_rate = 50 // 100 seconds to full
+ instability_modifier = 0.6
+ energy_cost_modifier = 0.6
+ spell_power_modifier = 0.6
+ can_chameleon = FALSE
+ simple_operation = TRUE
/obj/item/technomancer_core/proc/toggle_lock()
set name = "Toggle Core Lock"
diff --git a/code/game/gamemodes/technomancer/equipment.dm b/code/game/gamemodes/technomancer/equipment.dm
index e7d0ec12336..f5fc5245a4d 100644
--- a/code/game/gamemodes/technomancer/equipment.dm
+++ b/code/game/gamemodes/technomancer/equipment.dm
@@ -101,6 +101,18 @@
cost = 100
obj_path = /obj/item/technomancer_core/overcharged
+/datum/technomancer/equipment/bracelet
+ name = "Bracelet Core"
+ desc = "A core created for those unable to master the art of technomancy, or for those that desire a more incognito approach. \
+ This variant of the core goes onto the wrists instead of onto the back.
\
+ Capacity: 5k
\
+ Recharge: 50/s
\
+ Instability Modifier: 60%
\
+ Energy Cost Modifier: 60%
\
+ Spell Power: 60%"
+ cost = 50
+ obj_path = /obj/item/technomancer_core/bracelet
+
/datum/technomancer/equipment/hypo_belt
name = "Hypo Belt"
desc = "A medical belt designed to carry autoinjectors and other medical equipment. Comes with one of each hypo."
diff --git a/code/game/gamemodes/technomancer/spell_objs.dm b/code/game/gamemodes/technomancer/spell_objs.dm
index 0464a10f73a..82923c8e35a 100644
--- a/code/game/gamemodes/technomancer/spell_objs.dm
+++ b/code/game/gamemodes/technomancer/spell_objs.dm
@@ -32,8 +32,7 @@
)
throwforce = 0
force = 0
-// var/mob/living/carbon/human/owner = null
- var/mob/living/owner = null
+ var/mob/living/carbon/human/owner = null
var/obj/item/technomancer_core/core = null
var/cast_methods = null // Controls how the spell is casted.
var/aspect = null // Used for combining spells.
@@ -123,14 +122,16 @@
// Proc: get_technomancer_core()
// Parameters: 0
// Description: Returns the technomancer's core, assuming it is being worn properly.
-/mob/living/proc/get_technomancer_core()
+/mob/proc/get_technomancer_core()
+ if(istype(back, /obj/item/technomancer_core))
+ return back
return null
/mob/living/carbon/human/get_technomancer_core()
- var/obj/item/technomancer_core/core = back
- if(istype(core))
- return core
- return null
+ . = ..()
+ if(!.)
+ if(istype(wrists, /obj/item/technomancer_core))
+ return wrists
// Proc: New()
// Parameters: 0
@@ -183,12 +184,12 @@
if(!core)
core = locate(/obj/item/technomancer_core) in owner
if(!core)
- to_chat(owner, "You need to be wearing a core on your back!")
+ to_chat(owner, "You need to be wearing a core on your back or your wrists!")
return 0
- 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!")
+ if(core.loc != owner || (owner.back != core && owner.wrists != core)) //Make sure the core's being worn.
+ to_chat(owner, "You need to be wearing a core on your back or your wrists!")
return 0
- if(!technomancers.is_technomancer(owner.mind)) //Now make sure the person using this is the actual antag.
+ if(!core.simple_operation && !technomancers.is_technomancer(owner.mind)) //Now make sure the person using this is the actual antag.
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/energy_siphon.dm b/code/game/gamemodes/technomancer/spells/energy_siphon.dm
index b8ddc544943..70613fcc86b 100644
--- a/code/game/gamemodes/technomancer/spells/energy_siphon.dm
+++ b/code/game/gamemodes/technomancer/spells/energy_siphon.dm
@@ -61,7 +61,7 @@
else
stop_siphoning()
-/obj/item/spell/energy_siphon/proc/populate_siphon_list(atom/movable/target)
+/obj/item/spell/energy_siphon/proc/populate_siphon_list(atom/movable/target)
things_to_siphon.Cut()
things_to_siphon |= target.GetAllContents()
for(var/atom/movable/AM in things_to_siphon)
@@ -124,9 +124,9 @@
charge_to_give += nutrition_delta * SIPHON_FBP_TO_ENERGY
flow_remaining = flow_remaining - nutrition_to_steal / 0.025
// Let's steal some energy from another Technomancer.
- if(istype(H.back, /obj/item/technomancer_core) && H != user)
- var/obj/item/technomancer_core/their_core = H.back
- if(their_core.pay_energy(flow_remaining / 2)) // Don't give energy from nothing.
+ if(H != user)
+ var/obj/item/technomancer_core/their_core = H.get_technomancer_core()
+ if(their_core && their_core.pay_energy(flow_remaining / 2)) // Don't give energy from nothing.
charge_to_give += flow_remaining * SIPHON_CORE_TO_ENERGY
flow_remaining = 0
diff --git a/html/changelogs/geeves-techno_bracelet.yml b/html/changelogs/geeves-techno_bracelet.yml
new file mode 100644
index 00000000000..83d7a08d9ea
--- /dev/null
+++ b/html/changelogs/geeves-techno_bracelet.yml
@@ -0,0 +1,7 @@
+author: Geeves
+
+delete-after: True
+
+changes:
+ - rscadd: "Added a summoning stone to the Technomancer assistance category. You can give this to anyone to grant them a core and an initiate's catalogue, effectively making them a mini-technomancer."
+ - rscadd: "Added a Bracelet Core, a wrist mounted variant of the technomancer manipulation core."
diff --git a/icons/obj/clothing/technomancer.dmi b/icons/obj/clothing/technomancer.dmi
index ec94a9b03dd..a4b73343679 100644
Binary files a/icons/obj/clothing/technomancer.dmi and b/icons/obj/clothing/technomancer.dmi differ
diff --git a/icons/obj/telescience.dmi b/icons/obj/telescience.dmi
index 03ae1799474..bd8ed1da51e 100644
Binary files a/icons/obj/telescience.dmi and b/icons/obj/telescience.dmi differ