Technomancer Summoning Stone & Bracelet (#16252)

This commit is contained in:
Geeves
2023-05-28 16:17:59 +00:00
committed by GitHub
parent 020ed8e6d3
commit 96a527d04d
9 changed files with 122 additions and 51 deletions
@@ -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
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("<b>[user]</b> 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)
+24 -24
View File
@@ -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 += "<align='center'><b>Functions</b> | "
dat += "<a href='byond://?src=\ref[src];tab_choice=1'>Equipment</a> | "
dat += "<a href='byond://?src=\ref[src];tab_choice=2'>Consumables</a> | "
dat += "<a href='byond://?src=\ref[src];tab_choice=3'>Assistance</a> | "
if(length(assistance_instances))
dat += "<a href='byond://?src=\ref[src];tab_choice=3'>Assistance</a> | "
dat += "<a href='byond://?src=\ref[src];tab_choice=4'>Info</a></align><br>"
dat += "You currently have a budget of <b>[budget]/[max_budget]</b>.<br><br>"
dat += "<a href='byond://?src=\ref[src];refund_functions=1'>Refund Functions</a><br><br>"
@@ -164,7 +166,8 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
dat += "<align='center'><a href='byond://?src=\ref[src];tab_choice=0'>Functions</a> | "
dat += "<b>Equipment</b> | "
dat += "<a href='byond://?src=\ref[src];tab_choice=2'>Consumables</a> | "
dat += "<a href='byond://?src=\ref[src];tab_choice=3'>Assistance</a> | "
if(length(assistance_instances))
dat += "<a href='byond://?src=\ref[src];tab_choice=3'>Assistance</a> | "
dat += "<a href='byond://?src=\ref[src];tab_choice=4'>Info</a></align><br>"
dat += "You currently have a budget of <b>[budget]/[max_budget]</b>.<br><br>"
for(var/datum/technomancer/equipment/E in equipment_instances)
@@ -184,7 +187,8 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
dat += "<align='center'><a href='byond://?src=\ref[src];tab_choice=0'>Functions</a> | "
dat += "<a href='byond://?src=\ref[src];tab_choice=1'>Equipment</a> | "
dat += "<b>Consumables</b> | "
dat += "<a href='byond://?src=\ref[src];tab_choice=3'>Assistance</a> | "
if(length(assistance_instances))
dat += "<a href='byond://?src=\ref[src];tab_choice=3'>Assistance</a> | "
dat += "<a href='byond://?src=\ref[src];tab_choice=4'>Info</a></align><br>"
dat += "You currently have a budget of <b>[budget]/[max_budget]</b>.<br><br>"
for(var/datum/technomancer/consumable/C in consumable_instances)
@@ -224,7 +228,8 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
dat += "<align='center'><a href='byond://?src=\ref[src];tab_choice=0'>Functions</a> | "
dat += "<a href='byond://?src=\ref[src];tab_choice=1'>Equipment</a> | "
dat += "<a href='byond://?src=\ref[src];tab_choice=2'>Consumables</a> | "
dat += "<a href='byond://?src=\ref[src];tab_choice=3'>Assistance</a> | "
if(length(assistance_instances))
dat += "<a href='byond://?src=\ref[src];tab_choice=3'>Assistance</a> | "
dat += "<b>Info</b></align><br>"
dat += "You currently have a budget of <b>[budget]/[max_budget]</b>.<br><br>"
dat += "<br>"
@@ -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, "<span class='danger'>You can only refund at your base, it's too late now!</span>")
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)
+28 -11
View File
@@ -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"
@@ -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.<br>\
<font color='red'>Capacity: 5k</font><br>\
Recharge: 50/s<br>\
<font color='green'>Instability Modifier: 60%</font><br>\
<font color='green'>Energy Cost Modifier: 60%</font><br>\
<font color='red'><b>Spell Power: 60%</b></font>"
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."
+12 -11
View File
@@ -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, "<span class='danger'>You need to be wearing a core on your back!</span>")
to_chat(owner, "<span class='danger'>You need to be wearing a core on your back or your wrists!</span>")
return 0
if(core.loc != owner || owner.back != core) //Make sure the core's being worn.
to_chat(owner, "<span class='danger'>You need to be wearing a core on your back!</span>")
if(core.loc != owner || (owner.back != core && owner.wrists != core)) //Make sure the core's being worn.
to_chat(owner, "<span class='danger'>You need to be wearing a core on your back or your wrists!</span>")
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, "<span class='danger'>You can't seem to figure out how to make the machine work properly.</span>")
return 0
return 1
@@ -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
@@ -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."
Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 6.4 KiB