mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-08-30 00:21:11 +01:00
Technomancer Summoning Stone & Bracelet (#16252)
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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 |
Reference in New Issue
Block a user