diff --git a/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm b/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm
index 6c56295c05..4f45b473ae 100644
--- a/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm
+++ b/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm
@@ -202,6 +202,21 @@
and [structure_number] Clockwork Structure[structure_number == 1 ? "":"s"] [structure_number == 1 ? "is":"are"] in range.")
if(iscyborg(user))
to_chat(user, "You can recharge from the [sigil_name] by crossing it.")
+ else if(!GLOB.ratvar_awakens)
+ to_chat(user, "Hitting the [sigil_name] with brass sheets will convert them to power at a rate of 1 brass sheet to [POWER_FLOOR]W power.")
+ if(!GLOB.ratvar_awakens)
+ to_chat(user, "You can recharge Clockwork Proselytizers from the [sigil_name].")
+
+/obj/effect/clockwork/sigil/transmission/attackby(obj/item/I, mob/living/user, params)
+ if(is_servant_of_ratvar(user) && istype(I, /obj/item/stack/tile/brass) && !GLOB.ratvar_awakens)
+ var/obj/item/stack/tile/brass/B = I
+ user.visible_message("[user] places [B] on [src], causing it to disintegrate into glowing orange energy!", \
+ "You charge the [sigil_name] with [B], providing it with [B.amount * POWER_FLOOR]W of power.")
+ modify_charge(-(B.amount * POWER_FLOOR))
+ playsound(src, 'sound/effects/light_flicker.ogg', (B.amount * POWER_FLOOR) * 0.01, 1)
+ qdel(B)
+ return TRUE
+ return ..()
/obj/effect/clockwork/sigil/transmission/sigil_effects(mob/living/L)
if(is_servant_of_ratvar(L))
@@ -214,9 +229,7 @@
if(!cyborg_checks(cyborg))
return
to_chat(cyborg, "You start to charge from the [sigil_name]...")
- if(!do_after(cyborg, 50, target = src))
- return
- if(!cyborg_checks(cyborg))
+ if(!do_after(cyborg, 50, target = src, extra_checks = CALLBACK(src, .proc/cyborg_checks, cyborg, TRUE)))
return
var/giving_power = min(Floor(cyborg.cell.maxcharge - cyborg.cell.charge, MIN_CLOCKCULT_POWER), power_charge) //give the borg either all our power or their missing power floored to MIN_CLOCKCULT_POWER
if(modify_charge(giving_power))
@@ -228,23 +241,27 @@
animate(cyborg, color = previous_color, time = 100)
addtimer(CALLBACK(cyborg, /atom/proc/update_atom_colour), 100)
-/obj/effect/clockwork/sigil/transmission/proc/cyborg_checks(mob/living/silicon/robot/cyborg)
+/obj/effect/clockwork/sigil/transmission/proc/cyborg_checks(mob/living/silicon/robot/cyborg, silent)
if(!cyborg.cell)
- to_chat(cyborg, "You have no cell!")
+ if(!silent)
+ to_chat(cyborg, "You have no cell!")
return FALSE
if(!power_charge)
- to_chat(cyborg, "The [sigil_name] has no stored power!")
+ if(!silent)
+ to_chat(cyborg, "The [sigil_name] has no stored power!")
return FALSE
if(cyborg.cell.charge > cyborg.cell.maxcharge - MIN_CLOCKCULT_POWER)
- to_chat(cyborg, "You are already at maximum charge!")
+ if(!silent)
+ to_chat(cyborg, "You are already at maximum charge!")
return FALSE
if(cyborg.has_status_effect(STATUS_EFFECT_POWERREGEN))
- to_chat(cyborg, "You are already regenerating power!")
+ if(!silent)
+ to_chat(cyborg, "You are already regenerating power!")
return FALSE
return TRUE
-/obj/effect/clockwork/sigil/transmission/New()
- ..()
+/obj/effect/clockwork/sigil/transmission/Initialize()
+ . = ..()
update_glow()
/obj/effect/clockwork/sigil/transmission/proc/modify_charge(amount)
@@ -299,8 +316,7 @@
if((is_servant_of_ratvar(L) && L.suiciding) || sigil_active)
return
visible_message("[src] begins to glow bright blue!")
- animate(src, alpha = 255, time = 10)
- addtimer(CALLBACK(src, .proc/update_alpha), 10)
+ animate(src, alpha = 255, time = 10, flags = ANIMATION_END_NOW) //we may have a previous animation going. finish it first, then do this one without delay.
sleep(10)
//as long as they're still on the sigil and are either not a servant or they're a servant AND it has remaining vitality
while(L && (!is_servant_of_ratvar(L) || (is_servant_of_ratvar(L) && (GLOB.ratvar_awakens || vitality))) && get_turf(L) == get_turf(src))
@@ -369,12 +385,4 @@
animation_number = initial(animation_number)
sigil_active = FALSE
visible_message("[src] slowly stops glowing!")
- if(sigil_active || alpha == 255)
- animate(src, alpha = initial(alpha), time = 10)
- addtimer(CALLBACK(src, .proc/update_alpha), 10)
-
-/obj/effect/clockwork/sigil/vitality/proc/update_alpha()
- if(sigil_active)
- alpha = 255
- else
- alpha = initial(alpha)
+ animate(src, alpha = initial(alpha), time = 10, flags = ANIMATION_END_NOW)
diff --git a/code/game/gamemodes/clock_cult/clock_helpers/proselytizer_helpers.dm b/code/game/gamemodes/clock_cult/clock_helpers/proselytizer_helpers.dm
index c6954bb67e..529f38d832 100644
--- a/code/game/gamemodes/clock_cult/clock_helpers/proselytizer_helpers.dm
+++ b/code/game/gamemodes/clock_cult/clock_helpers/proselytizer_helpers.dm
@@ -286,6 +286,28 @@
user.visible_message("[user]'s [proselytizer.name] stops covering [src] with glowing orange energy.", \
"You finish repairing [src]. It is now at [obj_integrity]/[max_integrity] integrity.")
+//Hitting a sigil of transmission will try to charge from it.
+/obj/effect/clockwork/sigil/transmission/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+ . = TRUE
+ var/list/charge_values = list()
+ if(!proselytizer.sigil_charge_checks(charge_values, src, user))
+ return
+ user.visible_message("[user]'s [proselytizer.name] starts draining glowing orange energy from [src]...", \
+ "You start recharging your [proselytizer.name]...")
+ proselytizer.recharging = src
+ while(proselytizer && user && src)
+ if(!do_after(user, 10, target = src, extra_checks = CALLBACK(proselytizer, /obj/item/clockwork/clockwork_proselytizer.proc/sigil_charge_checks, charge_values, src, user, TRUE)))
+ break
+ modify_charge(charge_values["power_gain"])
+ proselytizer.modify_stored_power(charge_values["power_gain"])
+ playsound(src, 'sound/effects/light_flicker.ogg', charge_values["power_gain"] * 0.1, 1)
+
+ if(proselytizer)
+ proselytizer.recharging = null
+ if(user)
+ user.visible_message("[user]'s [proselytizer.name] stops draining glowing orange energy from [src].", \
+ "You finish recharging your [proselytizer.name]. It now contains [proselytizer.get_power()]W/[proselytizer.get_max_power()]W power.")
+
//Proselytizer mob heal proc, to avoid as much copypaste as possible.
/mob/living/proc/proselytizer_heal(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
var/list/repair_values = list()
diff --git a/code/game/gamemodes/clock_cult/clock_items/clockwork_proselytizer.dm b/code/game/gamemodes/clock_cult/clock_items/clockwork_proselytizer.dm
index 25e2138b81..60df56b6ef 100644
--- a/code/game/gamemodes/clock_cult/clock_items/clockwork_proselytizer.dm
+++ b/code/game/gamemodes/clock_cult/clock_items/clockwork_proselytizer.dm
@@ -12,6 +12,7 @@
var/uses_power = TRUE
var/metal_to_power = FALSE
var/repairing = null //what we're currently repairing, if anything
+ var/obj/effect/clockwork/sigil/transmission/recharging = null //the sigil we're charging from, if any
var/speed_multiplier = 1 //how fast this proselytizer works
var/charge_rate = MIN_CLOCKCULT_POWER //how much power we gain every two seconds
var/charge_delay = 2 //how many proccess ticks remain before we can start to charge
@@ -140,10 +141,11 @@
/obj/item/clockwork/clockwork_proselytizer/attack_self(mob/living/user)
if(is_servant_of_ratvar(user))
- if(!can_use_power(POWER_WALL_TOTAL))
- to_chat(user, "[src] requires [POWER_WALL_TOTAL]W of power to produce brass sheets!")
- return
- modify_stored_power(-POWER_WALL_TOTAL)
+ if(uses_power)
+ if(!can_use_power(POWER_WALL_TOTAL))
+ to_chat(user, "[src] requires [POWER_WALL_TOTAL]W of power to produce brass sheets!")
+ return
+ modify_stored_power(-POWER_WALL_TOTAL)
playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
new/obj/item/stack/tile/brass(user.loc, 5)
to_chat(user, "You user [stored_power ? "some":"all"] of [src]'s power to produce some brass sheets. It now stores [get_power()]W/[get_max_power()]W of power.")
@@ -182,6 +184,9 @@
if(repairing)
to_chat(user, "You are currently repairing [repairing] with [src]!")
return FALSE
+ if(recharging)
+ to_chat(user, "You are currently recharging [src] from the [recharging.sigil_name]!")
+ return FALSE
var/list/proselytize_values = target.proselytize_vals(user, src) //relevant values for proselytizing stuff, given as an associated list
if(!islist(proselytize_values))
if(proselytize_values != TRUE) //if we get true, fail, but don't send a message for whatever reason
@@ -237,7 +242,7 @@
/obj/item/clockwork/clockwork_proselytizer/proc/proselytize_checks(list/proselytize_values, atom/target, expected_type, mob/user, silent) //checked constantly while proselytizing
if(!islist(proselytize_values) || !target || QDELETED(target) || !user)
return FALSE
- if(repairing)
+ if(repairing || recharging)
return FALSE
if(target.type != expected_type)
return FALSE
@@ -296,3 +301,20 @@
[round(repair_values["amount_to_heal"]*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)]W to fully repair [target == user ? "yourself" : "[target.p_them()]"]!")
return FALSE
return TRUE
+
+//checked constantly while charging from a sigil
+/obj/item/clockwork/clockwork_proselytizer/proc/sigil_charge_checks(list/charge_values, obj/effect/clockwork/sigil/transmission/sigil, mob/user, silent)
+ if(!islist(charge_values) || !sigil || QDELETED(sigil) || !user)
+ return FALSE
+ if(can_use_power(RATVAR_POWER_CHECK))
+ return FALSE
+ charge_values["power_gain"] = Clamp(sigil.power_charge, 0, POWER_WALL_MINUS_FLOOR)
+ if(!charge_values["power_gain"])
+ if(!silent)
+ to_chat(user, "The [sigil.sigil_name] contains no power!")
+ return FALSE
+ if(stored_power + charge_values["power_gain"] > max_power)
+ if(!silent)
+ to_chat(user, "Your [name] contains too much power to charge from the [sigil.sigil_name]!")
+ return FALSE
+ return TRUE
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index a007dd4545..4700f81d82 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -328,7 +328,7 @@ GLOBAL_LIST_INIT(brass_recipes, list ( \
/obj/item/stack/tile/brass/Initialize(mapload, new_amount, merge = TRUE)
recipes = GLOB.brass_recipes
- ..()
+ . = ..()
pixel_x = 0
pixel_y = 0
diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm
index f2432cee3d..aecee4e070 100644
--- a/code/game/objects/items/stacks/tiles/tile_types.dm
+++ b/code/game/objects/items/stacks/tiles/tile_types.dm
@@ -13,8 +13,8 @@
var/turf_type = null
var/mineralType = null
-/obj/item/stack/tile/New(loc, amount)
- ..()
+/obj/item/stack/tile/Initialize(mapload, amount)
+ . = ..()
pixel_x = rand(-3, 3)
pixel_y = rand(-3, 3) //randomize a little