From 2ef841da6e11a93ee853d0754594077928d2be04 Mon Sep 17 00:00:00 2001 From: Cael_Aislinn Date: Sun, 10 Mar 2013 18:43:41 +1000 Subject: [PATCH] overhaul/cleanup to ano utilizers: they're now consistent with modern ss13 interactions + process more cleanly and operate more robustly, they properly interact with the rest of the updated xenoarch content, activating them should also give a message to anyone watching Signed-off-by: Cael_Aislinn --- .../xenoarchaeology/unknown/unknown_effect.dm | 5 +- .../unknown/unknown_synthetic.dm | 184 +++++++++++------- 2 files changed, 122 insertions(+), 67 deletions(-) diff --git a/code/modules/research/xenoarchaeology/unknown/unknown_effect.dm b/code/modules/research/xenoarchaeology/unknown/unknown_effect.dm index 829e7afd353..db0c6128fe1 100644 --- a/code/modules/research/xenoarchaeology/unknown/unknown_effect.dm +++ b/code/modules/research/xenoarchaeology/unknown/unknown_effect.dm @@ -61,7 +61,10 @@ display_msg = pick("momentarily glows brightly!","distorts slightly for a moment!","flickers slightly!","vibrates!","shimmers slightly for a moment!") else display_msg = pick("grows dull!","fades in intensity!","suddenly becomes very still!","suddenly becomes very quiet!") - holder.visible_message("\red \icon[holder] [holder] [display_msg]") + var/atom/toplevelholder = holder + while(!istype(toplevelholder.loc, /turf)) + toplevelholder = holder.loc + toplevelholder.visible_message("\red \icon[holder] [holder] [display_msg]") /datum/artifact_effect/proc/DoEffectTouch(var/mob/user) /datum/artifact_effect/proc/DoEffectAura(var/atom/holder) diff --git a/code/modules/research/xenoarchaeology/unknown/unknown_synthetic.dm b/code/modules/research/xenoarchaeology/unknown/unknown_synthetic.dm index 1ef39c7cf74..7c446f76074 100644 --- a/code/modules/research/xenoarchaeology/unknown/unknown_synthetic.dm +++ b/code/modules/research/xenoarchaeology/unknown/unknown_synthetic.dm @@ -1,17 +1,19 @@ /obj/item/weapon/anobattery name = "Anomaly power battery" - icon = 'xenoarchaeology.dmi' + icon = 'icons/obj/xenoarchaeology.dmi' icon_state = "anobattery0" var/datum/artifact_effect/battery_effect var/capacity = 200 var/stored_charge = 0 + var/effect_id = "" /obj/item/weapon/anobattery/New() battery_effect = new() /obj/item/weapon/anobattery/proc/UpdateSprite() var/p = (stored_charge/capacity)*100 + p = min(p, 100) icon_state = "anobattery[round(p,25)]" /obj/item/weapon/anodevice @@ -20,48 +22,15 @@ icon_state = "anodev" var/cooldown = 0 var/activated = 0 + var/timing = 0 var/time = 50 + var/archived_time = 50 var/obj/item/weapon/anobattery/inserted_battery + var/turf/archived_loc /obj/item/weapon/anodevice/New() - spawn(10) - pulse() - -/obj/item/weapon/anodevice/proc/UpdateSprite() - if(!inserted_battery) - icon_state = "anodev" - return - var/p = (inserted_battery.stored_charge/inserted_battery.capacity)*100 - var/s = round(p,25) - icon_state = "anodev[s]" - -/obj/item/weapon/anodevice/interact(var/mob/user) - user.machine = src - var/dat = "Anomalous Materials Energy Utiliser
" - if(activated) - dat += "Device active, stand by.
" - else if(cooldown) - dat += "Cooldown in progress, please wait.
" - else - if(!inserted_battery) - dat += "Please insert battery
" - else - dat += "[inserted_battery] inserted, anomaly ID: [inserted_battery.battery_effect.artifact_id == "" ? "???" : "[inserted_battery.battery_effect.artifact_id]"]
" - dat += "Total Power: [inserted_battery.stored_charge]/[inserted_battery.capacity]

" - dat += "Timed activation: -- - [time >= 1000 ? "[time/10]" : time >= 100 ? " [time/10]" : " [time/10]" ] + ++
" - if(cooldown && !activated) - dat += "Cooldown in progress.
" - else if(activated) - dat += "Stop timer
" - else - dat += "Start timer
" - dat += "Eject battery
" - dat += "Refresh
" - dat += "Close
" - - user << browse(dat, "window=anodevice;size=400x500") - onclose(user, "anodevice") - return + ..() + processing_objects.Add(src) /obj/item/weapon/anodevice/attackby(var/obj/I as obj, var/mob/user as mob) if(istype(I, /obj/item/weapon/anobattery)) @@ -77,27 +46,95 @@ /obj/item/weapon/anodevice/attack_self(var/mob/user as mob) return src.interact(user) -/obj/item/weapon/anodevice/proc/pulse() - if(activated) - if(time <= 0 || !inserted_battery) - time = 0 - activated = 0 - var/turf/T = get_turf(src) - T.visible_message("\icon[src]\blue The utiliser device buzzes.", "\icon[src]\blue You hear something buzz.") +/obj/item/weapon/anodevice/interact(var/mob/user) + user.set_machine(src) + var/dat = "Anomalous Materials Energy Utiliser
" + if(inserted_battery) + if(cooldown) + dat += "Cooldown in progress, please wait.
" + else if(activated) + if(timing) + dat += "Device active.
" + else + dat += "Device active in timed mode.
" + + dat += "[inserted_battery] inserted, anomaly ID: [inserted_battery.battery_effect.artifact_id ? inserted_battery.battery_effect.artifact_id : "NA"]
" + dat += "Total Power: [inserted_battery.stored_charge]/[inserted_battery.capacity]

" + dat += "Timed activation: -- - [time >= 1000 ? "[time/10]" : time >= 100 ? " [time/10]" : " [time/10]" ] + ++
" + if(cooldown) + dat += "Cooldown in progress.
" + dat += "
" + else if(!activated) + dat += "Start
" + dat += "Start in timed mode
" else - inserted_battery.battery_effect.DoEffectPulse(src) - time -= 10 - inserted_battery.stored_charge -= 10 + rand(-1,1) - cooldown += 10 - else if(cooldown > 0) - cooldown -= 10 + dat += "Shutdown emission
" + dat += "
" + dat += "Eject battery
" + else + dat += "Please insert battery
" + + dat += "
" + dat += "
" + dat += "
" + + dat += "
" + dat += "
" + dat += "
" + + dat += "
" + dat += "Refresh Close" + + user << browse(dat, "window=anodevice;size=400x500") + onclose(user, "anodevice") + +/obj/item/weapon/anodevice/process() + if(cooldown > 0) + cooldown -= 1 if(cooldown <= 0) cooldown = 0 - var/turf/T = get_turf(src) - T.visible_message("\icon[src]\blue The utiliser device chimes.", "\icon[src]\blue You hear something chime.") + src.visible_message("\blue \icon[src] [src] chimes.", "\blue \icon[src] You hear something chime.") + else if(activated) + if(inserted_battery && inserted_battery.battery_effect) + //make sure the effect is active + if(!inserted_battery.battery_effect.activated) + inserted_battery.battery_effect.ToggleActivate(1) - spawn(10) - pulse() + //update the effect loc + var/turf/T = get_turf(src) + if(T != archived_loc) + archived_loc = T + inserted_battery.battery_effect.UpdateMove() + + //process the effect + inserted_battery.battery_effect.process() + //if someone is holding the device, do the effect on them + if(inserted_battery.battery_effect.effect == 0 && ismob(src.loc)) + inserted_battery.battery_effect.DoEffectTouch(src.loc) + + //handle charge + inserted_battery.stored_charge -= 1 + if(inserted_battery.stored_charge <= 0) + shutdown_emission() + + //handle timed mode + if(timing) + time -= 1 + if(time <= 0) + shutdown_emission() + else + shutdown() + +/obj/item/weapon/anodevice/proc/shutdown_emission() + if(activated) + activated = 0 + timing = 0 + src.visible_message("\blue \icon[src] [src] buzzes.", "\icon[src]\blue You hear something buzz.") + + cooldown = archived_time / 2 + + if(inserted_battery.battery_effect.activated) + inserted_battery.battery_effect.ToggleActivate() /obj/item/weapon/anodevice/Topic(href, href_list) @@ -125,20 +162,35 @@ time = inserted_battery.capacity else if (time < 0) time = 0 - - if(href_list["stoptimer"]) - activated = 0 - - if(href_list["starttimer"]) + if(href_list["startup"]) activated = 1 - + if(!inserted_battery.battery_effect.activated) + inserted_battery.battery_effect.ToggleActivate(1) + if(href_list["shutdown"]) + activated = 0 + if(href_list["starttimer"]) + timing = 1 + archived_time = time if(href_list["ejectbattery"]) + shutdown_emission() inserted_battery.loc = get_turf(src) inserted_battery = null UpdateSprite() - if(href_list["close"]) usr << browse(null, "window=anodevice") - usr.machine = null - else if(usr) - src.interact(usr) + usr.unset_machine(src) + + ..() + updateDialog() + +/obj/item/weapon/anodevice/proc/UpdateSprite() + if(!inserted_battery) + icon_state = "anodev" + return + var/p = (inserted_battery.stored_charge/inserted_battery.capacity)*100 + p = min(p, 100) + icon_state = "anodev[round(p,25)]" + +/obj/item/weapon/anodevice/Del() + processing_objects.Remove(src) + ..()