mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-18 18:44:48 +01:00
Code effeciency project: apc update_icons
Before: It updated the icons quite a bit at the start of the game. After: It updates more often and quicker, but now it isn't as expensive Conflicts: code/modules/power/apc.dm
This commit is contained in:
+184
-48
@@ -3,7 +3,33 @@
|
||||
#define APC_WIRE_MAIN_POWER2 3
|
||||
#define APC_WIRE_AI_CONTROL 4
|
||||
|
||||
#define APC_UPDATE_ICON_COOLDOWN 200 // 20 seconds
|
||||
//update_state
|
||||
#define UPSTATE_CELL_IN 1
|
||||
#define UPSTATE_OPENED1 2
|
||||
#define UPSTATE_OPENED2 4
|
||||
#define UPSTATE_MAINT 8
|
||||
#define UPSTATE_BROKE 16
|
||||
#define UPSTATE_BLUESCREEN 32
|
||||
#define UPSTATE_WIREEXP 64
|
||||
#define UPSTATE_ALLGOOD 128
|
||||
|
||||
//update_overlay
|
||||
#define APC_UPOVERLAY_CHARGEING0 1
|
||||
#define APC_UPOVERLAY_CHARGEING1 2
|
||||
#define APC_UPOVERLAY_CHARGEING2 4
|
||||
#define APC_UPOVERLAY_EQUIPMENT0 8
|
||||
#define APC_UPOVERLAY_EQUIPMENT1 16
|
||||
#define APC_UPOVERLAY_EQUIPMENT2 32
|
||||
#define APC_UPOVERLAY_LIGHTING0 64
|
||||
#define APC_UPOVERLAY_LIGHTING1 128
|
||||
#define APC_UPOVERLAY_LIGHTING2 256
|
||||
#define APC_UPOVERLAY_ENVIRON0 512
|
||||
#define APC_UPOVERLAY_ENVIRON1 1024
|
||||
#define APC_UPOVERLAY_ENVIRON2 2048
|
||||
#define APC_UPOVERLAY_LOCKED 4096
|
||||
|
||||
#define APC_UPDATE_ICON_COOLDOWN 100 // 10 seconds
|
||||
|
||||
|
||||
// the Area Power Controller (APC), formerly Power Distribution Unit (PDU)
|
||||
// one per area, needs wire conection to power network
|
||||
@@ -19,7 +45,6 @@
|
||||
/obj/machinery/power/apc
|
||||
name = "area power controller"
|
||||
desc = "A control terminal for the area electrical systems."
|
||||
|
||||
icon_state = "apc0"
|
||||
anchored = 1
|
||||
use_power = 0
|
||||
@@ -59,9 +84,17 @@
|
||||
var/beenhit = 0 // used for counting how many times it has been hit, used for Aliens at the moment
|
||||
var/mob/living/silicon/ai/occupant = null
|
||||
var/longtermpower = 10
|
||||
var/update_state = -1
|
||||
var/update_overlay = -1
|
||||
var/global/status_overlays = 0
|
||||
var/updating_icon = 0
|
||||
var/datum/wires/apc/wires = null
|
||||
//var/debug = 0
|
||||
var/global/list/status_overlays_lock
|
||||
var/global/list/status_overlays_charging
|
||||
var/global/list/status_overlays_equipment
|
||||
var/global/list/status_overlays_lighting
|
||||
var/global/list/status_overlays_environ
|
||||
|
||||
/obj/machinery/power/apc/updateDialog()
|
||||
if (stat & (BROKEN|MAINT))
|
||||
@@ -151,61 +184,162 @@
|
||||
else
|
||||
usr << "The cover is closed."
|
||||
|
||||
/*
|
||||
* return 0 (reached the proc code end)
|
||||
* 1 (wires is exposed)
|
||||
* 2 (something is wrong)
|
||||
* 3 (broken)
|
||||
* 4 (opened)
|
||||
*/
|
||||
// update the APC icon to show the three base states
|
||||
// also add overlays for indicator lights
|
||||
/obj/machinery/power/apc/update_icon()
|
||||
var/L[0]
|
||||
overlays = L
|
||||
|
||||
if (opened)
|
||||
// 2 = has cell, 1 = no cell
|
||||
var/basestate = "apc[cell ? "2" : "1"]"
|
||||
if (!status_overlays)
|
||||
status_overlays = 1
|
||||
status_overlays_lock = new
|
||||
status_overlays_charging = new
|
||||
status_overlays_equipment = new
|
||||
status_overlays_lighting = new
|
||||
status_overlays_environ = new
|
||||
|
||||
if (opened == 1)
|
||||
if (stat & (BROKEN | MAINT))
|
||||
//disassembled APC cannot hold cell
|
||||
icon_state = "apcmaint"
|
||||
else
|
||||
icon_state = basestate
|
||||
else if (opened == 2)
|
||||
icon_state = "[basestate]-nocover"
|
||||
status_overlays_lock.len = 2
|
||||
status_overlays_charging.len = 3
|
||||
status_overlays_equipment.len = 4
|
||||
status_overlays_lighting.len = 4
|
||||
status_overlays_environ.len = 4
|
||||
|
||||
basestate = null
|
||||
return 4
|
||||
else if (stat & BROKEN)
|
||||
icon_state = "apc-b"
|
||||
return 3
|
||||
else if (emagged || malfai || spooky)
|
||||
icon_state = "apcemag"
|
||||
return 2
|
||||
else if (wiresexposed)
|
||||
icon_state = "apcewires"
|
||||
return 1
|
||||
status_overlays_lock[1] = image(icon, "apcox-0") // 0=blue 1=red
|
||||
status_overlays_lock[2] = image(icon, "apcox-1")
|
||||
|
||||
icon_state = "apc0"
|
||||
status_overlays_charging[1] = image(icon, "apco3-0")
|
||||
status_overlays_charging[2] = image(icon, "apco3-1")
|
||||
status_overlays_charging[3] = image(icon, "apco3-2")
|
||||
|
||||
if(!(stat & (BROKEN|MAINT)))
|
||||
// 0 = green, 1 = red
|
||||
L += "apcox-[locked]"
|
||||
// 0 = red, 1 = blue, 2 = green
|
||||
L += "apco3-[charging]"
|
||||
status_overlays_equipment[1] = image(icon, "apco0-0") // 0=red, 1=green, 2=blue
|
||||
status_overlays_equipment[2] = image(icon, "apco0-1")
|
||||
status_overlays_equipment[3] = image(icon, "apco0-2")
|
||||
status_overlays_equipment[4] = image(icon, "apco0-3")
|
||||
|
||||
if (operating)
|
||||
// 0 = red, 1 = yellow, 2 = green, 3 = blue
|
||||
L += "apco0-[equipment]"
|
||||
L += "apco1-[lighting]"
|
||||
L += "apco2-[environ]"
|
||||
status_overlays_lighting[1] = image(icon, "apco1-0")
|
||||
status_overlays_lighting[2] = image(icon, "apco1-1")
|
||||
status_overlays_lighting[3] = image(icon, "apco1-2")
|
||||
status_overlays_lighting[4] = image(icon, "apco1-3")
|
||||
|
||||
overlays = L
|
||||
L = null
|
||||
return 0
|
||||
status_overlays_environ[1] = image(icon, "apco2-0")
|
||||
status_overlays_environ[2] = image(icon, "apco2-1")
|
||||
status_overlays_environ[3] = image(icon, "apco2-2")
|
||||
status_overlays_environ[4] = image(icon, "apco2-3")
|
||||
|
||||
|
||||
|
||||
var/update = check_updates() //returns 0 if no need to update icons.
|
||||
// 1 if we need to update the icon_state
|
||||
// 2 if we need to update the overlays
|
||||
if(!update)
|
||||
return
|
||||
|
||||
if(update & 1) // Updating the icon state
|
||||
if(update_state & UPSTATE_ALLGOOD)
|
||||
icon_state = "apc0"
|
||||
else if(update_state & (UPSTATE_OPENED1|UPSTATE_OPENED2))
|
||||
var/basestate = "apc[ cell ? "2" : "1" ]"
|
||||
if(update_state & UPSTATE_OPENED1)
|
||||
if(update_state & (UPSTATE_MAINT|UPSTATE_BROKE))
|
||||
icon_state = "apcmaint" //disabled APC cannot hold cell
|
||||
else
|
||||
icon_state = basestate
|
||||
else if(update_state & UPSTATE_OPENED2)
|
||||
icon_state = "[basestate]-nocover"
|
||||
else if(update_state & UPSTATE_BROKE)
|
||||
icon_state = "apc-b"
|
||||
else if(update_state & UPSTATE_BLUESCREEN)
|
||||
icon_state = "apcemag"
|
||||
else if(update_state & UPSTATE_WIREEXP)
|
||||
icon_state = "apcewires"
|
||||
|
||||
|
||||
|
||||
if(!(update_state & UPSTATE_ALLGOOD))
|
||||
if(overlays.len)
|
||||
overlays = 0
|
||||
return
|
||||
|
||||
|
||||
|
||||
if(update & 2)
|
||||
|
||||
if(overlays.len)
|
||||
overlays = 0
|
||||
|
||||
if(!(stat & (BROKEN|MAINT)) && update_state & UPSTATE_ALLGOOD)
|
||||
overlays += status_overlays_lock[locked+1]
|
||||
overlays += status_overlays_charging[charging+1]
|
||||
if(operating)
|
||||
overlays += status_overlays_equipment[equipment+1]
|
||||
overlays += status_overlays_lighting[lighting+1]
|
||||
overlays += status_overlays_environ[environ+1]
|
||||
|
||||
|
||||
/obj/machinery/power/apc/proc/check_updates()
|
||||
|
||||
var/last_update_state = update_state
|
||||
var/last_update_overlay = update_overlay
|
||||
update_state = 0
|
||||
update_overlay = 0
|
||||
|
||||
if(cell)
|
||||
update_state |= UPSTATE_CELL_IN
|
||||
if(stat & BROKEN)
|
||||
update_state |= UPSTATE_BROKE
|
||||
if(stat & MAINT)
|
||||
update_state |= UPSTATE_MAINT
|
||||
if(opened)
|
||||
if(opened==1)
|
||||
update_state |= UPSTATE_OPENED1
|
||||
if(opened==2)
|
||||
update_state |= UPSTATE_OPENED2
|
||||
else if(emagged || malfai)
|
||||
update_state |= UPSTATE_BLUESCREEN
|
||||
else if(wiresexposed)
|
||||
update_state |= UPSTATE_WIREEXP
|
||||
if(update_state <= 1)
|
||||
update_state |= UPSTATE_ALLGOOD
|
||||
|
||||
if(update_state & UPSTATE_ALLGOOD)
|
||||
if(locked)
|
||||
update_overlay |= APC_UPOVERLAY_LOCKED
|
||||
|
||||
if(!charging)
|
||||
update_overlay |= APC_UPOVERLAY_CHARGEING0
|
||||
else if(charging == 1)
|
||||
update_overlay |= APC_UPOVERLAY_CHARGEING1
|
||||
else if(charging == 2)
|
||||
update_overlay |= APC_UPOVERLAY_CHARGEING2
|
||||
|
||||
if (!equipment)
|
||||
update_overlay |= APC_UPOVERLAY_EQUIPMENT0
|
||||
else if(equipment == 1)
|
||||
update_overlay |= APC_UPOVERLAY_EQUIPMENT1
|
||||
else if(equipment == 2)
|
||||
update_overlay |= APC_UPOVERLAY_EQUIPMENT2
|
||||
|
||||
if(!lighting)
|
||||
update_overlay |= APC_UPOVERLAY_LIGHTING0
|
||||
else if(lighting == 1)
|
||||
update_overlay |= APC_UPOVERLAY_LIGHTING1
|
||||
else if(lighting == 2)
|
||||
update_overlay |= APC_UPOVERLAY_LIGHTING2
|
||||
|
||||
if(!environ)
|
||||
update_overlay |= APC_UPOVERLAY_ENVIRON0
|
||||
else if(environ==1)
|
||||
update_overlay |= APC_UPOVERLAY_ENVIRON1
|
||||
else if(environ==2)
|
||||
update_overlay |= APC_UPOVERLAY_ENVIRON2
|
||||
|
||||
var/results = 0
|
||||
if(last_update_state == update_state && last_update_overlay == update_overlay)
|
||||
return 0
|
||||
if(last_update_state != update_state)
|
||||
results += 1
|
||||
if(last_update_overlay != update_overlay && update_overlay != 0)
|
||||
results += 2
|
||||
return results
|
||||
|
||||
// Used in process so it doesn't update the icon too much
|
||||
/obj/machinery/power/apc/proc/queue_icon_update()
|
||||
|
||||
if(!updating_icon)
|
||||
@@ -223,6 +357,7 @@
|
||||
spooky=0
|
||||
update_icon()
|
||||
|
||||
|
||||
//attack with an item - open/close cover, insert cell, or (un)lock interface
|
||||
/obj/machinery/power/apc/attackby(obj/item/W, mob/user)
|
||||
|
||||
@@ -1054,6 +1189,7 @@
|
||||
update()
|
||||
else if (last_ch != charging)
|
||||
queue_icon_update()
|
||||
src.updateDialog()
|
||||
|
||||
// val 0=off, 1=off(auto) 2=on 3=on(auto)
|
||||
// on 0=off, 1=on, 2=autooff
|
||||
|
||||
Reference in New Issue
Block a user