diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index 78cc872c62..5a4e7c0380 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -62,6 +62,7 @@ #define COMSIG_ATOM_NO_UPDATE_ICON_STATE 1 #define COMSIG_ATOM_NO_UPDATE_OVERLAYS 2 #define COMSIG_ATOM_UPDATE_OVERLAYS "atom_update_overlays" //from base of atom/update_overlays(): (list/new_overlays) +#define COMSIG_ATOM_UPDATED_ICON "atom_updated_icon" //from base of atom/update_icon(): (signalOut, did_anything) #define COMSIG_ATOM_ENTERED "atom_entered" //from base of atom/Entered(): (atom/movable/entering, /atom) #define COMSIG_ATOM_EXIT "atom_exit" //from base of atom/Exit(): (/atom/movable/exiting, /atom/newloc) #define COMPONENT_ATOM_BLOCK_EXIT 1 diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm index 858b8dbd06..0ed3a9cf26 100644 --- a/code/_onclick/hud/action_button.dm +++ b/code/_onclick/hud/action_button.dm @@ -72,6 +72,22 @@ var/hide_icon = 'icons/mob/actions.dmi' var/hide_state = "hide" var/show_state = "show" + var/mutable_appearance/hide_appearance + var/mutable_appearance/show_appearance + +/obj/screen/movable/action_button/hide_toggle/Initialize() + . = ..() + var/static/list/icon_cache = list() + + var/cache_key = "[hide_icon][hide_state]" + hide_appearance = icon_cache[cache_key] + if(!hide_appearance) + hide_appearance = icon_cache[cache_key] = mutable_appearance(hide_icon, hide_state) + + cache_key = "[hide_icon][show_state]" + show_appearance = icon_cache[cache_key] + if(!show_appearance) + show_appearance = icon_cache[cache_key] = mutable_appearance(hide_icon, show_state) /obj/screen/movable/action_button/hide_toggle/Click(location,control,params) if (!can_use(usr)) @@ -137,9 +153,12 @@ show_state = settings["toggle_show"] update_icon() -/obj/screen/movable/action_button/hide_toggle/update_icon() - cut_overlays() - add_overlay(mutable_appearance(hide_icon, hidden ? show_state : hide_state)) +/obj/screen/movable/action_button/hide_toggle/update_overlays() + . = ..() + if(hidden) + . += show_appearance + else + . += hide_appearance /obj/screen/movable/action_button/MouseEntered(location,control,params) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 15d1d3b717..f5eb8535a5 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -166,29 +166,27 @@ var/static/mutable_appearance/blocked_overlay = mutable_appearance('icons/mob/screen_gen.dmi', "blocked") var/held_index = 0 -/obj/screen/inventory/hand/update_icon() +/obj/screen/inventory/hand/update_overlays() . = ..() if(!handcuff_overlay) var/state = (!(held_index % 2)) ? "markus" : "gabrielle" handcuff_overlay = mutable_appearance('icons/mob/screen_gen.dmi', state) - cut_overlay(list(handcuff_overlay, blocked_overlay, "hand_active")) - if(!hud?.mymob) return if(iscarbon(hud.mymob)) var/mob/living/carbon/C = hud.mymob if(C.handcuffed) - add_overlay(handcuff_overlay) + . += handcuff_overlay if(held_index) if(!C.has_hand_for_held_index(held_index)) - add_overlay(blocked_overlay) + . += blocked_overlay if(held_index == hud.mymob.active_hand_index) - add_overlay("hand_active") + . += "hand_active" /obj/screen/inventory/hand/Click(location, control, params) diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index ecd34b7840..6cf01ec8ff 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -76,8 +76,8 @@ layer = ABOVE_HUD_LAYER plane = ABOVE_HUD_PLANE - var/atom/movable/focus = null - var/mob/living/carbon/tk_user = null + var/atom/movable/focus + var/mob/living/carbon/tk_user /obj/item/tk_grab/Initialize() . = ..() @@ -85,6 +85,8 @@ /obj/item/tk_grab/Destroy() STOP_PROCESSING(SSfastprocess, src) + focus = null + tk_user = null return ..() /obj/item/tk_grab/process() @@ -179,16 +181,14 @@ return new /obj/effect/temp_visual/telekinesis(get_turf(focus)) -/obj/item/tk_grab/update_icon() - cut_overlays() - if(focus) - var/old_layer = focus.layer - var/old_plane = focus.plane - focus.layer = layer+0.01 - focus.plane = ABOVE_HUD_PLANE - add_overlay(focus) //this is kind of ick, but it's better than using icon() - focus.layer = old_layer - focus.plane = old_plane +/obj/item/tk_grab/update_overlays() + . = ..() + if(!focus) + return + var/mutable_appearance/focus_overlay = new(focus) + focus_overlay.layer = layer + 0.01 + focus_overlay.plane = ABOVE_HUD_PLANE + . += focus_overlay /obj/item/tk_grab/suicide_act(mob/user) user.visible_message("[user] is using [user.p_their()] telekinesis to choke [user.p_them()]self! It looks like [user.p_theyre()] trying to commit suicide!") diff --git a/code/datums/action.dm b/code/datums/action.dm index 602dd2c37a..264b2a56e4 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -31,6 +31,7 @@ /datum/action/proc/link_to(Target) target = Target + RegisterSignal(Target, COMSIG_ATOM_UPDATED_ICON, .proc/OnUpdatedIcon) /datum/action/Destroy() if(owner) @@ -153,6 +154,9 @@ var/mob/M = target M.ghostize(1) +/datum/action/proc/OnUpdatedIcon() + UpdateButtonIcon() + //Presets for item actions /datum/action/item_action check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUN|AB_CHECK_LYING|AB_CHECK_CONSCIOUS @@ -824,4 +828,4 @@ for(var/datum/action/A in M.actions) if(istype(A, action_type)) return A - return + return diff --git a/code/datums/components/armor_plate.dm b/code/datums/components/armor_plate.dm index 975b52dcb9..f026c89c60 100644 --- a/code/datums/components/armor_plate.dm +++ b/code/datums/components/armor_plate.dm @@ -12,6 +12,8 @@ RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examine) RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/applyplate) RegisterSignal(parent, COMSIG_PARENT_PREQDELETED, .proc/dropplates) + if(istype(parent, /obj/mecha/working/ripley)) + RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, .proc/apply_mech_overlays) if(_maxamount) maxamount = _maxamount @@ -75,4 +77,13 @@ /datum/component/armor_plate/proc/dropplates(datum/source, force) if(ismecha(parent)) //items didn't drop the plates before and it causes erroneous behavior for the time being with collapsible helmets for(var/i in 1 to amount) - new upgrade_item(get_turf(parent)) \ No newline at end of file + new upgrade_item(get_turf(parent)) + +/datum/component/armor_plate/proc/apply_mech_overlays(obj/mecha/mech, list/overlays) + if(amount) + var/overlay_string = "ripley-g" + if(amount >= 3) + overlay_string += "-full" + if(!mech.occupant) + overlay_string += "-open" + overlays += overlay_string diff --git a/code/datums/elements/update_icon_blocker.dm b/code/datums/elements/update_icon_blocker.dm new file mode 100644 index 0000000000..c30dc9efad --- /dev/null +++ b/code/datums/elements/update_icon_blocker.dm @@ -0,0 +1,10 @@ +//Prevents calling anything in update_icon() like update_icon_state() or update_overlays() + +/datum/element/update_icon_blocker/Attach(datum/target) + . = ..() + if(!istype(target, /atom)) + return ELEMENT_INCOMPATIBLE + RegisterSignal(target, COMSIG_ATOM_UPDATE_ICON, .proc/block_update_icon) + +/datum/element/update_icon_blocker/proc/block_update_icon() + return COMSIG_ATOM_NO_UPDATE_ICON_STATE | COMSIG_ATOM_NO_UPDATE_OVERLAYS \ No newline at end of file diff --git a/code/datums/elements/update_icon_updates_onmob.dm b/code/datums/elements/update_icon_updates_onmob.dm new file mode 100644 index 0000000000..ca0e8b1641 --- /dev/null +++ b/code/datums/elements/update_icon_updates_onmob.dm @@ -0,0 +1,16 @@ +//update_icon() may change the onmob icons +//Very good name, I know + +/datum/element/update_icon_updates_onmob/Attach(datum/target) + . = ..() + if(!istype(target, /obj/item)) + return ELEMENT_INCOMPATIBLE + RegisterSignal(target, COMSIG_ATOM_UPDATED_ICON, .proc/update_onmob) + +/datum/element/update_icon_updates_onmob/proc/update_onmob(obj/item/target) + if(ismob(target.loc)) + var/mob/M = target.loc + if(M.is_holding(target)) + M.update_inv_hands() + else + M.regenerate_icons() //yeah this is shit, but we don't know which update_foo() proc to call instead so we'll call them all diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 4adfdf72d2..6439fd1cfc 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -334,9 +334,11 @@ /atom/proc/update_icon() // I expect we're going to need more return flags and options in this proc var/signalOut = SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_ICON) + . = FALSE if(!(signalOut & COMSIG_ATOM_NO_UPDATE_ICON_STATE)) update_icon_state() + . = TRUE if(!(signalOut & COMSIG_ATOM_NO_UPDATE_OVERLAYS)) var/list/new_overlays = update_overlays() @@ -346,6 +348,9 @@ if(length(new_overlays)) managed_overlays = new_overlays add_overlay(new_overlays) + . = TRUE + + SEND_SIGNAL(src, COMSIG_ATOM_UPDATED_ICON, signalOut, .) /// Updates the icon state of the atom /atom/proc/update_icon_state() diff --git a/code/game/gamemodes/clown_ops/bananium_bomb.dm b/code/game/gamemodes/clown_ops/bananium_bomb.dm index b63d5b2e79..baecd6a1de 100644 --- a/code/game/gamemodes/clown_ops/bananium_bomb.dm +++ b/code/game/gamemodes/clown_ops/bananium_bomb.dm @@ -4,23 +4,17 @@ icon = 'icons/obj/machines/nuke.dmi' icon_state = "bananiumbomb_base" -/obj/machinery/nuclearbomb/syndicate/bananium/update_icon() - if(deconstruction_state == NUKESTATE_INTACT) - switch(get_nuke_state()) - if(NUKE_OFF_LOCKED, NUKE_OFF_UNLOCKED) - icon_state = "bananiumbomb_base" - update_icon_interior() - update_icon_lights() - if(NUKE_ON_TIMING) - cut_overlays() - icon_state = "bananiumbomb_timing" - if(NUKE_ON_EXPLODING) - cut_overlays() - icon_state = "bananiumbomb_exploding" - else +/obj/machinery/nuclearbomb/syndicate/bananium/update_icon_state() + if(deconstruction_state != NUKESTATE_INTACT) icon_state = "bananiumbomb_base" - update_icon_interior() - update_icon_lights() + return + switch(get_nuke_state()) + if(NUKE_OFF_LOCKED, NUKE_OFF_UNLOCKED) + icon_state = "bananiumbomb_base" + if(NUKE_ON_TIMING) + icon_state = "bananiumbomb_timing" + if(NUKE_ON_EXPLODING) + icon_state = "bananiumbomb_exploding" /obj/machinery/nuclearbomb/syndicate/bananium/get_cinematic_type(off_station) switch(off_station) diff --git a/code/game/machinery/Beacon.dm b/code/game/machinery/Beacon.dm index 84eda82ef5..e9968dadd4 100644 --- a/code/game/machinery/Beacon.dm +++ b/code/game/machinery/Beacon.dm @@ -28,7 +28,7 @@ update_icon() // update the icon_state -/obj/machinery/bluespace_beacon/update_icon() +/obj/machinery/bluespace_beacon/update_icon_state() var/state="floor_beacon" if(invisibility) diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm index 20efee9420..88dc0ebb56 100644 --- a/code/game/machinery/PDApainter.dm +++ b/code/game/machinery/PDApainter.dm @@ -9,16 +9,12 @@ var/list/colorlist = list() -/obj/machinery/pdapainter/update_icon() - cut_overlays() +/obj/machinery/pdapainter/update_icon_state() if(stat & BROKEN) icon_state = "[initial(icon_state)]-broken" return - if(storedpda) - add_overlay("[initial(icon_state)]-closed") - if(powered()) icon_state = initial(icon_state) else @@ -26,6 +22,15 @@ return +/obj/machinery/pdapainter/update_overlays() + . = ..() + + if(stat & BROKEN) + return + + if(storedpda) + . += "[initial(icon_state)]-closed" + /obj/machinery/pdapainter/Initialize() . = ..() var/list/blocked = list( diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 19a20f0cfa..cdae0ea713 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -71,7 +71,7 @@ reagents.maximum_volume = (500*E) -/obj/machinery/sleeper/update_icon() +/obj/machinery/sleeper/update_icon_state() icon_state = initial(icon_state) if(state_open) icon_state += "-open" diff --git a/code/game/machinery/airlock_control.dm b/code/game/machinery/airlock_control.dm index 69dbdcd50c..557adf488b 100644 --- a/code/game/machinery/airlock_control.dm +++ b/code/game/machinery/airlock_control.dm @@ -113,7 +113,7 @@ id_tag = INCINERATOR_SYNDICATELAVA_AIRLOCK_SENSOR master_tag = INCINERATOR_SYNDICATELAVA_AIRLOCK_CONTROLLER -/obj/machinery/airlock_sensor/update_icon() +/obj/machinery/airlock_sensor/update_icon_state() if(on) if(alert) icon_state = "airlock_sensor_alert" diff --git a/code/game/machinery/announcement_system.dm b/code/game/machinery/announcement_system.dm index 84e5910731..7eef48ebdd 100644 --- a/code/game/machinery/announcement_system.dm +++ b/code/game/machinery/announcement_system.dm @@ -32,22 +32,22 @@ GLOBAL_LIST_EMPTY(announcement_systems) radio = new /obj/item/radio/headset/silicon/ai(src) update_icon() -/obj/machinery/announcement_system/update_icon() +/obj/machinery/announcement_system/update_icon_state() if(is_operational()) icon_state = (panel_open ? "AAS_On_Open" : "AAS_On") else icon_state = (panel_open ? "AAS_Off_Open" : "AAS_Off") - - cut_overlays() +/obj/machinery/announcement_system/update_overlays() + . =..() if(arrivalToggle) - add_overlay(greenlight) + . += greenlight if(newheadToggle) - add_overlay(pinklight) + . += pinklight if(stat & BROKEN) - add_overlay(errorlight) + . += errorlight /obj/machinery/announcement_system/Destroy() QDEL_NULL(radio) diff --git a/code/game/machinery/aug_manipulator.dm b/code/game/machinery/aug_manipulator.dm index b41910f010..b95e3149ea 100644 --- a/code/game/machinery/aug_manipulator.dm +++ b/code/game/machinery/aug_manipulator.dm @@ -19,21 +19,21 @@ initial_icon_state = initial(icon_state) return ..() -/obj/machinery/aug_manipulator/update_icon() - cut_overlays() - +/obj/machinery/aug_manipulator/update_icon_state() if(stat & BROKEN) icon_state = "[initial_icon_state]-broken" return - if(storedpart) - add_overlay("[initial_icon_state]-closed") - if(powered()) icon_state = initial_icon_state else icon_state = "[initial_icon_state]-off" +/obj/machinery/aug_manipulator/update_overlays() + . = ..() + if(storedpart) + . += "[initial_icon_state]-closed" + /obj/machinery/aug_manipulator/Destroy() QDEL_NULL(storedpart) return ..() diff --git a/code/game/machinery/bloodbankgen.dm b/code/game/machinery/bloodbankgen.dm index 19632711fc..31fac02d83 100644 --- a/code/game/machinery/bloodbankgen.dm +++ b/code/game/machinery/bloodbankgen.dm @@ -54,16 +54,17 @@ efficiency = E productivity = P -/obj/machinery/bloodbankgen/update_icon() - cut_overlays() +/obj/machinery/bloodbankgen/update_icon_state() if(is_operational()) - icon_state = "bloodbank-on" + icon_state = "bloodbank-[is_operational() ? "on" : "off"]" +/obj/machinery/bloodbankgen/update_overlays() + . = ..() if(panel_open) - add_overlay("bloodbank-panel") + . += "bloodbank-panel" - if(src.bag) - add_overlay("bloodbag-input") + if(bag) + . += "bloodbag-input" if(bag.reagents.total_volume) var/mutable_appearance/filling_overlay = mutable_appearance(icon, "input-reagent") @@ -85,10 +86,10 @@ filling_overlay.icon_state = "input-reagent100" filling_overlay.color = list(mix_color_from_reagents(bag.reagents.reagent_list)) - add_overlay(filling_overlay) + . += filling_overlay - if(src.outbag) - add_overlay("bloodbag-output") + if(outbag) + . += "bloodbag-output" if(outbag.reagents.total_volume) var/mutable_appearance/filling_overlay = mutable_appearance(icon, "output-reagent") @@ -110,8 +111,7 @@ filling_overlay.icon_state = "output-reagent100" filling_overlay.color = list(mix_color_from_reagents(outbag.reagents.reagent_list)) - add_overlay(filling_overlay) - return + . += filling_overlay /obj/machinery/bloodbankgen/process() if(!is_operational()) diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index 991577e123..670efa929e 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -10,18 +10,19 @@ circuit = /obj/item/circuitboard/machine/cell_charger pass_flags = PASSTABLE var/obj/item/stock_parts/cell/charging = null - var/chargelevel = -1 var/charge_rate = 500 -/obj/machinery/cell_charger/update_icon() - cut_overlays() - if(charging) - add_overlay(image(charging.icon, charging.icon_state)) - add_overlay("ccharger-on") - if(!(stat & (BROKEN|NOPOWER))) - var/newlevel = round(charging.percent() * 4 / 100) - chargelevel = newlevel - add_overlay("ccharger-o[newlevel]") +/obj/machinery/cell_charger/update_overlays() + . += ..() + + if(!charging) + return + + . += image(charging.icon, charging.icon_state) + . += "ccharger-on" + if(!(stat & (BROKEN|NOPOWER))) + var/newlevel = round(charging.percent() * 4 / 100) + . += "ccharger-o[newlevel]" /obj/machinery/cell_charger/examine(mob/user) . = ..() @@ -54,7 +55,6 @@ charging = W user.visible_message("[user] inserts a cell into [src].", "You insert a cell into [src].") - chargelevel = -1 update_icon() else if(!charging && default_deconstruction_screwdriver(user, icon_state, icon_state, W)) @@ -77,7 +77,6 @@ /obj/machinery/cell_charger/proc/removecell() charging.update_icon() charging = null - chargelevel = -1 update_icon() /obj/machinery/cell_charger/attack_hand(mob/user) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 62304112b2..b42b5cf41f 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -477,24 +477,30 @@ flesh_number = unattached_flesh.len -/obj/machinery/clonepod/update_icon() - cut_overlays() - +/obj/machinery/clonepod/update_icon_state() if(mess) icon_state = "pod_g" + else if(occupant) + icon_state = "pod_1" + else + icon_state = "pod_0" + + if(panel_open) + icon_state = "pod_0_maintenance" + +/obj/machinery/clonepod/update_overlays() + . = ..() + if(mess) var/image/gib1 = image(CRYOMOBS, "gibup") var/image/gib2 = image(CRYOMOBS, "gibdown") gib1.pixel_y = 27 + round(sin(world.time) * 3) gib1.pixel_x = round(sin(world.time * 3)) gib2.pixel_y = 27 + round(cos(world.time) * 3) gib2.pixel_x = round(cos(world.time * 3)) - add_overlay(gib2) - add_overlay(gib1) - add_overlay("cover-on") - + . += gib2 + . += gib1 + . += "cover-on" else if(occupant) - icon_state = "pod_1" - var/image/occupant_overlay var/completion = (flesh_number - unattached_flesh.len) / flesh_number @@ -513,15 +519,9 @@ occupant_overlay.pixel_y = 27 + round(sin(world.time) * 3) occupant_overlay.pixel_x = round(sin(world.time * 3)) - add_overlay(occupant_overlay) - add_overlay("cover-on") - else - icon_state = "pod_0" - - if(panel_open) - icon_state = "pod_0_maintenance" - - add_overlay("panel") + . += occupant_overlay + . += "cover-on" + . += "panel" /* * Manual -- A big ol' manual. diff --git a/code/game/machinery/computer/_computer.dm b/code/game/machinery/computer/_computer.dm index c748270793..675fbcf288 100644 --- a/code/game/machinery/computer/_computer.dm +++ b/code/game/machinery/computer/_computer.dm @@ -48,13 +48,13 @@ icon_state = initial(icon_state) update_icon() -/obj/machinery/computer/update_icon() - cut_overlays() +/obj/machinery/computer/update_overlays() + . = ..() SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) if(stat & NOPOWER) - add_overlay("[icon_keyboard]_off") + . += "[icon_keyboard]_off" return - add_overlay(icon_keyboard) + . += icon_keyboard // This whole block lets screens ignore lighting and be visible even in the darkest room // We can't do this for many things that emit light unfortunately because it layers over things that would be on top of it diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index 8bb0894cdb..9ff46c021b 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -103,21 +103,20 @@ add_fingerprint(usr) updateUsrDialog() -/obj/machinery/computer/aifixer/update_icon() - ..() +/obj/machinery/computer/aifixer/update_overlays() + . = ..() if(stat & (NOPOWER|BROKEN)) return + if(active) + . += "ai-fixer-on" + if (occupier) + switch (occupier.stat) + if (0) + . += "ai-fixer-full" + if (2) + . += "ai-fixer-404" else - if(active) - add_overlay("ai-fixer-on") - if (occupier) - switch (occupier.stat) - if (0) - add_overlay("ai-fixer-full") - if (2) - add_overlay("ai-fixer-404") - else - add_overlay("ai-fixer-empty") + . += "ai-fixer-empty" /obj/machinery/computer/aifixer/transfer_ai(interaction, mob/user, mob/living/silicon/ai/AI, obj/item/aicard/card) if(!..()) diff --git a/code/game/machinery/computer/atmos_alert.dm b/code/game/machinery/computer/atmos_alert.dm index 4c9e9aed19..679f112bff 100644 --- a/code/game/machinery/computer/atmos_alert.dm +++ b/code/game/machinery/computer/atmos_alert.dm @@ -78,23 +78,20 @@ update_icon() return -/obj/machinery/computer/atmos_alert/update_icon() - ..() - cut_overlays() +/obj/machinery/computer/atmos_alert/update_overlays() + . = ..() SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) var/overlay_state = icon_screen if(stat & (NOPOWER|BROKEN)) - add_overlay("[icon_keyboard]_off") + . |= "[icon_keyboard]_off" return - add_overlay(icon_keyboard) + . |= icon_keyboard if(priority_alarms.len) overlay_state = "alert:2" - add_overlay("alert:2") else if(minor_alarms.len) overlay_state = "alert:1" - add_overlay("alert:1") else overlay_state = "alert:0" - add_overlay("alert:0") + . |= overlay_state SSvis_overlays.add_vis_overlay(src, icon, overlay_state, layer, plane, dir) SSvis_overlays.add_vis_overlay(src, icon, overlay_state, ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir, alpha=128) diff --git a/code/game/machinery/computer/atmos_control.dm b/code/game/machinery/computer/atmos_control.dm index d6ce850da8..22e102b54b 100644 --- a/code/game/machinery/computer/atmos_control.dm +++ b/code/game/machinery/computer/atmos_control.dm @@ -41,7 +41,7 @@ name = "incinerator chamber gas sensor" id_tag = ATMOS_GAS_MONITOR_SENSOR_INCINERATOR -/obj/machinery/air_sensor/update_icon() +/obj/machinery/air_sensor/update_icon_state() icon_state = "gsensor[on]" /obj/machinery/air_sensor/process_atmos() diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 211ff13486..47c761fa52 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -175,11 +175,10 @@ clockwork = TRUE //it'd look very weird light_power = 0 -/obj/machinery/computer/security/telescreen/update_icon() +/obj/machinery/computer/security/telescreen/update_icon_state() icon_state = initial(icon_state) if(stat & BROKEN) icon_state += "b" - return /obj/machinery/computer/security/telescreen/entertainment name = "entertainment monitor" diff --git a/code/game/machinery/computer/station_alert.dm b/code/game/machinery/computer/station_alert.dm index c3fef3ff92..f3e27d650e 100644 --- a/code/game/machinery/computer/station_alert.dm +++ b/code/game/machinery/computer/station_alert.dm @@ -75,25 +75,23 @@ L -= I return !cleared -/obj/machinery/computer/station_alert/update_icon() - ..() - cut_overlays() +/obj/machinery/computer/station_alert/update_overlays() + . = ..() SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) var/overlay_state = icon_screen if(stat & (NOPOWER|BROKEN)) - add_overlay("[icon_keyboard]_off") + . |= "[icon_keyboard]_off" return - add_overlay(icon_keyboard) + . |= icon_keyboard var/active_alarms = FALSE for(var/cat in alarms) - var/list/L = alarms[cat] - if(L.len) + if(length(alarms[cat])) active_alarms = TRUE + break if(active_alarms) overlay_state = "alert:2" - add_overlay("alert:2") else overlay_state = "alert:0" - add_overlay("alert:0") + . |= overlay_state SSvis_overlays.add_vis_overlay(src, icon, overlay_state, layer, plane, dir) - SSvis_overlays.add_vis_overlay(src, icon, overlay_state, ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir, alpha=128) + SSvis_overlays.add_vis_overlay(src, icon, overlay_state, ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir, alpha=128) \ No newline at end of file diff --git a/code/game/machinery/computer/telecrystalconsoles.dm b/code/game/machinery/computer/telecrystalconsoles.dm index 72c8979006..82e8f46ab6 100644 --- a/code/game/machinery/computer/telecrystalconsoles.dm +++ b/code/game/machinery/computer/telecrystalconsoles.dm @@ -44,8 +44,8 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E else to_chat(user, "[I] doesn't appear to be an uplink...") -/obj/machinery/computer/telecrystals/uplinker/update_icon() - ..() +/obj/machinery/computer/telecrystals/uplinker/update_overlays() + . = ..() if(uplinkholder) add_overlay("[initial(icon_state)]-closed") diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm index 6b62d18d01..ea14031603 100644 --- a/code/game/machinery/dance_machine.dm +++ b/code/game/machinery/dance_machine.dm @@ -45,7 +45,7 @@ return return ..() -/obj/machinery/jukebox/update_icon() +/obj/machinery/jukebox/update_icon_state() if(active) icon_state = "[initial(icon_state)]-active" else diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm index 60b5a52a10..ed61e13596 100644 --- a/code/game/machinery/dna_scanner.dm +++ b/code/game/machinery/dna_scanner.dm @@ -34,7 +34,7 @@ if(scan_level >= 3) . += "Scanner has been upgraded to support autoprocessing." -/obj/machinery/dna_scannernew/update_icon() +/obj/machinery/dna_scannernew/update_icon_state() //no power or maintenance if(stat & (NOPOWER|BROKEN)) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index d626c76aca..85063b27c5 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -428,7 +428,7 @@ else return FALSE -/obj/machinery/door/airlock/update_icon(state=0, override=0) +/obj/machinery/door/airlock/update_icon_state(state=0, override=0) if(operating && !override) return switch(state) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 9db98b8314..d2f98a868b 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -230,7 +230,7 @@ /obj/machinery/door/proc/unelectrify() secondsElectrified = 0 -/obj/machinery/door/update_icon() +/obj/machinery/door/update_icon_state() if(density) icon_state = "door1" else diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index cb133978b2..1b83bb4b96 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -171,16 +171,20 @@ if("closing") flick("door_closing", src) -/obj/machinery/door/firedoor/update_icon() - cut_overlays() +/obj/machinery/door/firedoor/update_icon_state() if(density) icon_state = "door_closed" - if(welded) - add_overlay("welded") else icon_state = "door_open" - if(welded) - add_overlay("welded_open") + +/obj/machinery/door/firedoor/update_overlays() + . = ..() + if(!welded) + return + if(density) + . += "welded" + else + . += "welded_open" /obj/machinery/door/firedoor/open() . = ..() @@ -283,8 +287,7 @@ if(CONSTRUCTION_NOCIRCUIT) . += "There are no firelock electronics in the frame. The frame could be cut apart." -/obj/structure/firelock_frame/update_icon() - ..() +/obj/structure/firelock_frame/update_icon_state() icon_state = "frame[constructionStep]" /obj/structure/firelock_frame/attackby(obj/item/C, mob/user) diff --git a/code/game/machinery/doors/passworddoor.dm b/code/game/machinery/doors/passworddoor.dm index 2ce2711cb4..60652981cf 100644 --- a/code/game/machinery/doors/passworddoor.dm +++ b/code/game/machinery/doors/passworddoor.dm @@ -42,7 +42,7 @@ else do_animate("deny") -/obj/machinery/door/password/update_icon() +/obj/machinery/door/password/update_icon_state() if(density) icon_state = "closed" else diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index af95ee230c..c032ded6b0 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -77,7 +77,7 @@ flick("closing", src) playsound(src, 'sound/machines/blastdoor.ogg', 30, 1) -/obj/machinery/door/poddoor/update_icon() +/obj/machinery/door/poddoor/update_icon_state() if(density) icon_state = "closed" else diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index bd9b7325fb..492e90720c 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -48,7 +48,7 @@ electronics = null return ..() -/obj/machinery/door/window/update_icon() +/obj/machinery/door/window/update_icon_state() if(density) icon_state = base_state else diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/droneDispenser.dm index 54be67f3c1..33ea273e9d 100644 --- a/code/game/machinery/droneDispenser.dm +++ b/code/game/machinery/droneDispenser.dm @@ -199,7 +199,7 @@ if(istype(a, dispense_type)) .++ -/obj/machinery/droneDispenser/update_icon() +/obj/machinery/droneDispenser/update_icon_state() if(stat & (BROKEN|NOPOWER)) icon_state = icon_off else if(mode == DRONE_RECHARGING) diff --git a/code/game/machinery/embedded_controller/access_controller.dm b/code/game/machinery/embedded_controller/access_controller.dm index ad49abb398..f74de23171 100644 --- a/code/game/machinery/embedded_controller/access_controller.dm +++ b/code/game/machinery/embedded_controller/access_controller.dm @@ -84,7 +84,7 @@ busy = FALSE update_icon() -/obj/machinery/doorButtons/access_button/update_icon() +/obj/machinery/doorButtons/access_button/update_icon_state() if(stat & NOPOWER) icon_state = "access_button_off" else @@ -249,7 +249,7 @@ else if(A.id_tag == idExterior) exteriorAirlock = A -/obj/machinery/doorButtons/airlock_controller/update_icon() +/obj/machinery/doorButtons/airlock_controller/update_icon_state() if(stat & NOPOWER) icon_state = "access_control_off" return diff --git a/code/game/machinery/embedded_controller/airlock_controller.dm b/code/game/machinery/embedded_controller/airlock_controller.dm index 9f1ebe67a9..ea39133112 100644 --- a/code/game/machinery/embedded_controller/airlock_controller.dm +++ b/code/game/machinery/embedded_controller/airlock_controller.dm @@ -255,7 +255,7 @@ new_prog.master = src program = new_prog -/obj/machinery/embedded_controller/radio/airlock_controller/update_icon() +/obj/machinery/embedded_controller/radio/airlock_controller/update_icon_state() if(on && program) if(program.memory["processing"]) icon_state = "airlock_control_process" diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm index f1a2ef9acc..6fd351bcff 100644 --- a/code/game/machinery/embedded_controller/embedded_controller_base.dm +++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm @@ -33,8 +33,6 @@ popup.set_content(return_text()) popup.open() -/obj/machinery/embedded_controller/update_icon() - /obj/machinery/embedded_controller/proc/return_text() /obj/machinery/embedded_controller/proc/post_signal(datum/signal/signal, comm_line) diff --git a/code/game/machinery/embedded_controller/simple_vent_controller.dm b/code/game/machinery/embedded_controller/simple_vent_controller.dm index 33be1e3f79..6c8467dbd3 100644 --- a/code/game/machinery/embedded_controller/simple_vent_controller.dm +++ b/code/game/machinery/embedded_controller/simple_vent_controller.dm @@ -54,7 +54,7 @@ new_prog.master = src program = new_prog -/obj/machinery/embedded_controller/radio/simple_vent_controller/update_icon() +/obj/machinery/embedded_controller/radio/simple_vent_controller/update_icon_state() if(on && program) icon_state = "airlock_control_standby" else diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index 83bc055cd7..befa9545ed 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -55,10 +55,7 @@ ..() update_icon() -/obj/machinery/firealarm/update_icon() - cut_overlays() - SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) - +/obj/machinery/firealarm/update_icon_state() if(panel_open) icon_state = "fire_b[buildstage]" return @@ -72,26 +69,30 @@ if(stat & NOPOWER) return - add_overlay("fire_overlay") +/obj/machinery/firealarm/update_overlays() + . = ..() + SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) + + . += "fire_overlay" if(is_station_level(z)) - add_overlay("fire_[GLOB.security_level]") + . += "fire_[GLOB.security_level]" SSvis_overlays.add_vis_overlay(src, icon, "fire_[GLOB.security_level]", ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir) else - add_overlay("fire_[SEC_LEVEL_GREEN]") + . += "fire_[SEC_LEVEL_GREEN]" SSvis_overlays.add_vis_overlay(src, icon, "fire_[SEC_LEVEL_GREEN]", ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir) var/area/A = src.loc A = A.loc if(!detecting || !A.fire) - add_overlay("fire_off") + . += "fire_off" SSvis_overlays.add_vis_overlay(src, icon, "fire_off", ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir) else if(obj_flags & EMAGGED) - add_overlay("fire_emagged") + . += "fire_emagged" SSvis_overlays.add_vis_overlay(src, icon, "fire_emagged", ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir) else - add_overlay("fire_on") + . += "fire_on" SSvis_overlays.add_vis_overlay(src, icon, "fire_on", ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir) /obj/machinery/firealarm/emp_act(severity) diff --git a/code/game/machinery/gulag_teleporter.dm b/code/game/machinery/gulag_teleporter.dm index a2d0460d25..fb41ac986d 100644 --- a/code/game/machinery/gulag_teleporter.dm +++ b/code/game/machinery/gulag_teleporter.dm @@ -68,7 +68,7 @@ The console is located at computer/gulag_teleporter.dm return ..() -/obj/machinery/gulag_teleporter/update_icon() +/obj/machinery/gulag_teleporter/update_icon_state() icon_state = initial(icon_state) + (state_open ? "_open" : "") //no power or maintenance if(stat & (NOPOWER|BROKEN)) diff --git a/code/game/machinery/harvester.dm b/code/game/machinery/harvester.dm index 8275e981de..244c300905 100644 --- a/code/game/machinery/harvester.dm +++ b/code/game/machinery/harvester.dm @@ -11,6 +11,7 @@ light_color = LIGHT_COLOR_BLUE var/interval = 20 var/harvesting = FALSE + var/warming_up = FALSE var/list/operation_order = list() //Order of wich we harvest limbs. var/allow_clothing = FALSE var/allow_living = FALSE @@ -27,12 +28,11 @@ max_time -= L.rating interval = max(max_time,1) -/obj/machinery/harvester/update_icon(warming_up) - if(warming_up) - icon_state = initial(icon_state)+"-charging" - return +/obj/machinery/harvester/update_icon_state() if(state_open) icon_state = initial(icon_state)+"-open" + else if(warming_up) + icon_state = initial(icon_state)+"-charging" else if(harvesting) icon_state = initial(icon_state)+"-active" else @@ -43,6 +43,7 @@ return . = ..() harvesting = FALSE + warming_up = FALSE /obj/machinery/harvester/attack_hand(mob/user) if(state_open) @@ -86,13 +87,15 @@ return var/mob/living/carbon/C = occupant operation_order = reverseList(C.bodyparts) //Chest and head are first in bodyparts, so we invert it to make them suffer more + warming_up = TRUE harvesting = TRUE visible_message("The [name] begins warming up!") say("Initializing harvest protocol.") - update_icon(TRUE) + update_icon() addtimer(CALLBACK(src, .proc/harvest), interval) /obj/machinery/harvester/proc/harvest() + warming_up = FALSE update_icon() if(!harvesting || state_open || !powered(EQUIP) || !occupant || !iscarbon(occupant)) return @@ -127,6 +130,7 @@ addtimer(CALLBACK(src, .proc/harvest), interval) /obj/machinery/harvester/proc/end_harvesting() + warming_up = FALSE harvesting = FALSE open_machine() say("Subject has been successfully harvested.") diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index f3e446c686..067f10fa0f 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -441,7 +441,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ set_light(0) update_icon() -/obj/machinery/holopad/update_icon() +/obj/machinery/holopad/update_icon_state() var/total_users = LAZYLEN(masters) + LAZYLEN(holo_calls) if(ringing) icon_state = "holopad_ringing" diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index b3f0ce9693..ad5df7cea0 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -24,7 +24,7 @@ QDEL_NULL(beaker) return ..() -/obj/machinery/iv_drip/update_icon() +/obj/machinery/iv_drip/update_icon_state() if(attached) if(mode) icon_state = "injecting" @@ -36,13 +36,14 @@ else icon_state = "donateidle" - cut_overlays() +/obj/machinery/iv_drip/update_overlays() + . = ..() if(beaker) if(attached) - add_overlay("beakeractive") + . += "beakeractive" else - add_overlay("beakeridle") + . += "beakeridle" if(beaker.reagents.total_volume) var/mutable_appearance/filling_overlay = mutable_appearance('icons/obj/iv_drip.dmi', "reagent") @@ -64,7 +65,7 @@ filling_overlay.icon_state = "reagent100" filling_overlay.color = mix_color_from_reagents(beaker.reagents.reagent_list) - add_overlay(filling_overlay) + . += filling_overlay /obj/machinery/iv_drip/MouseDrop(mob/living/target) . = ..() @@ -227,9 +228,9 @@ desc = "An IV drip with an advanced infusion pump that can both drain blood into and inject liquids from attached containers. Blood packs are processed at an accelerated rate. This one is telescopic, and can be picked up and put down." icon_state = "iv_drip" -/obj/machinery/iv_drip/telescopic/update_icon() +/obj/machinery/iv_drip/telescopic/update_icon_state() ..() - icon_state = icon_state + "_tele" + icon_state += "_tele" /obj/machinery/iv_drip/telescopic/AltClick(mob/user) if (attached || beaker || !user.canUseTopic(src, BE_CLOSE)) diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index e14033a959..b2a35dcf41 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -23,7 +23,7 @@ on = area.lightswitch update_icon() -/obj/machinery/light_switch/update_icon() +/obj/machinery/light_switch/update_icon_state() if(stat & NOPOWER) icon_state = "light-p" else diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm index b010f77cac..50edbe5891 100644 --- a/code/game/machinery/magnet.dm +++ b/code/game/machinery/magnet.dm @@ -49,7 +49,7 @@ update_icon() // update the icon_state -/obj/machinery/magnetic_module/update_icon() +/obj/machinery/magnetic_module/update_icon_state() var/state="floor_magnet" var/onstate="" if(!on) diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index 93c94ae8b6..766943de36 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -75,7 +75,7 @@ update_icon() // update the icon_state -/obj/machinery/navbeacon/update_icon() +/obj/machinery/navbeacon/update_icon_state() var/state="navbeacon[open]" if(invisibility) diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 3d0fdb06da..f07f946d0f 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -99,8 +99,7 @@ if(!has_cover) INVOKE_ASYNC(src, .proc/popUp) -/obj/machinery/porta_turret/update_icon() - cut_overlays() +/obj/machinery/porta_turret/update_icon_state() if(!anchored) icon_state = "turretCover" return @@ -970,8 +969,7 @@ ..() update_icon() -/obj/machinery/turretid/update_icon() - ..() +/obj/machinery/turretid/update_icon_state() if(stat & NOPOWER) icon_state = "control_off" else if (enabled) diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index aa97aa821a..24fd956677 100755 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -10,6 +10,7 @@ pass_flags = PASSTABLE var/obj/item/charging = null var/recharge_coeff = 1 + var/using_power = FALSE //Did we put power into "charging" last process()? var/static/list/allowed_devices = typecacheof(list( /obj/item/gun/energy, @@ -45,9 +46,11 @@ if (new_charging) START_PROCESSING(SSmachines, src) use_power = ACTIVE_POWER_USE - update_icon(scan = TRUE) + using_power = TRUE + update_icon() else use_power = IDLE_POWER_USE + using_power = FALSE update_icon() /obj/machinery/recharger/attackby(obj/item/G, mob/user, params) @@ -120,23 +123,23 @@ if(stat & (NOPOWER|BROKEN) || !anchored) return PROCESS_KILL - var/using_power = 0 + using_power = FALSE if(charging) var/obj/item/stock_parts/cell/C = charging.get_cell() if(C) if(C.charge < C.maxcharge) C.give(C.chargerate * recharge_coeff) use_power(250 * recharge_coeff) - using_power = 1 - update_icon(using_power) + using_power = TRUE + update_icon() if(istype(charging, /obj/item/ammo_box/magazine/recharge)) var/obj/item/ammo_box/magazine/recharge/R = charging if(R.stored_ammo.len < R.max_ammo) R.stored_ammo += new R.ammo_type(R) use_power(200 * recharge_coeff) - using_power = 1 - update_icon(using_power) + using_power = TRUE + update_icon() return else return PROCESS_KILL @@ -161,20 +164,15 @@ B.cell.charge = 0 -/obj/machinery/recharger/update_icon(using_power = 0, scan) //we have an update_icon() in addition to the stuff in process to make it feel a tiny bit snappier. +/obj/machinery/recharger/update_icon_state() if(stat & (NOPOWER|BROKEN) || !anchored) icon_state = "rechargeroff" - return - if(scan) - icon_state = "rechargeroff" - return - if(panel_open) + else if(panel_open) icon_state = "rechargeropen" - return - if(charging) + else if(charging) if(using_power) icon_state = "recharger1" else icon_state = "recharger2" - return - icon_state = "recharger0" + else + icon_state = "recharger0" diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index 374c0c71b9..bbafe99006 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -112,7 +112,7 @@ use_power = ACTIVE_POWER_USE add_fingerprint(occupant) -/obj/machinery/recharge_station/update_icon() +/obj/machinery/recharge_station/update_icon_state() if(is_operational()) if(state_open) icon_state = "borgcharger0" diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index c14e70f831..a2c128437f 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -77,8 +77,7 @@ to_chat(user, "You use the cryptographic sequencer on [src].") return TRUE -/obj/machinery/recycler/update_icon() - ..() +/obj/machinery/recycler/update_icon_state() var/is_powered = !(stat & (BROKEN|NOPOWER)) if(safety_mode) is_powered = FALSE diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index 6b191ef14d..c05fbe229c 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -60,7 +60,7 @@ GLOBAL_LIST_EMPTY(allConsoles) ..() update_icon() -/obj/machinery/requests_console/update_icon() +/obj/machinery/requests_console/update_icon_state() if(stat & NOPOWER) set_light(0) else diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index b4288310b0..c152e302fe 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -208,7 +208,7 @@ to_chat(user, "You short out the access controller.") return TRUE -/obj/machinery/shieldgen/update_icon() +/obj/machinery/shieldgen/update_icon_state() if(active) icon_state = (stat & BROKEN) ? "shieldonbr":"shieldon" else diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm index 115c61e9b9..84b205b585 100644 --- a/code/game/machinery/slotmachine.dm +++ b/code/game/machinery/slotmachine.dm @@ -56,7 +56,7 @@ money++ //SPESSH MAJICKS -/obj/machinery/computer/slot_machine/update_icon() +/obj/machinery/computer/slot_machine/update_icon_state() if(stat & NOPOWER) icon_state = "slots0" diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 6eca52aa0e..41dfe8e3ac 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -53,17 +53,18 @@ else . += "There is no power cell installed." if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Temperature range at [settableTemperatureRange]°C.
Heating power at [heatingPower*0.001]kJ.
Power consumption at [(efficiency*-0.0025)+150]%." //100%, 75%, 50%, 25% + . += "The status display reads: Temperature range at [settableTemperatureRange]°C.
Heating power at [heatingPower*0.001]kJ.
Power consumption at [(efficiency*-0.0025)+150]%." //100%, 75%, 50%, 25% -/obj/machinery/space_heater/update_icon() +/obj/machinery/space_heater/update_icon_state() if(on) icon_state = "sheater-[mode]" else icon_state = "sheater-off" - cut_overlays() +/obj/machinery/space_heater/update_overlays() + . = ..() if(panel_open) - add_overlay("sheater-open") + . += "sheater-open" /obj/machinery/space_heater/process() if(!on || !is_operational()) diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 3a2ce43315..14fd7fbb6d 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -134,29 +134,28 @@ QDEL_NULL(storage) return ..() -/obj/machinery/suit_storage_unit/update_icon() - cut_overlays() - +/obj/machinery/suit_storage_unit/update_overlays() + . = ..() if(uv) if(uv_super) - add_overlay("super") + . += "super" else if(occupant) - add_overlay("uvhuman") + . += "uvhuman" else - add_overlay("uv") + . += "uv" else if(state_open) if(stat & BROKEN) - add_overlay("broken") + . += "broken" else - add_overlay("open") + . += "open" if(suit) - add_overlay("suit") + . += "suit" if(helmet) - add_overlay("helm") + . += "helm" if(storage) - add_overlay("storage") + . += "storage" else if(occupant) - add_overlay("human") + . += "human" /obj/machinery/suit_storage_unit/power_change() ..() diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index 221e35118e..b8d4ef26e8 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -102,7 +102,7 @@ . = ..() . += "A digital display on it reads \"[seconds_remaining()]\"." -/obj/machinery/syndicatebomb/update_icon() +/obj/machinery/syndicatebomb/update_icon_state() icon_state = "[initial(icon_state)][active ? "-active" : "-inactive"][open_panel ? "-wires" : ""]" /obj/machinery/syndicatebomb/proc/seconds_remaining() diff --git a/code/game/machinery/telecomms/machines/message_server.dm b/code/game/machinery/telecomms/machines/message_server.dm index 1960080856..a6c2a0f126 100644 --- a/code/game/machinery/telecomms/machines/message_server.dm +++ b/code/game/machinery/telecomms/machines/message_server.dm @@ -74,7 +74,7 @@ if(!relay_information(signal, /obj/machinery/telecomms/hub)) relay_information(signal, /obj/machinery/telecomms/broadcaster) -/obj/machinery/telecomms/message_server/update_icon() +/obj/machinery/telecomms/message_server/update_icon_state() if((stat & (BROKEN|NOPOWER))) icon_state = "server-nopower" else if (!toggled) diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm index 7a9f682d34..70b785ea21 100644 --- a/code/game/machinery/telecomms/telecomunications.dm +++ b/code/game/machinery/telecomms/telecomunications.dm @@ -109,7 +109,7 @@ GLOBAL_LIST_EMPTY(telecomms_list) links |= T T.links |= src -/obj/machinery/telecomms/update_icon() +/obj/machinery/telecomms/update_icon_state() if(on) if(panel_open) icon_state = "[initial(icon_state)]_o" diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 3cc71df0f1..985c1166b7 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -85,7 +85,7 @@ calibrated = FALSE return -/obj/machinery/teleport/hub/update_icon() +/obj/machinery/teleport/hub/update_icon_state() if(panel_open) icon_state = "tele-o" else if(is_ready()) @@ -218,7 +218,7 @@ if(teleporter_hub) teleporter_hub.update_icon() -/obj/machinery/teleport/station/update_icon() +/obj/machinery/teleport/station/update_icon_state() if(panel_open) icon_state = "controller-o" else if(stat & (BROKEN|NOPOWER)) diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm index 4ed2473260..a2d4b9eb7e 100644 --- a/code/game/machinery/transformer.dm +++ b/code/game/machinery/transformer.dm @@ -38,8 +38,7 @@ ..() update_icon() -/obj/machinery/transformer/update_icon() - ..() +/obj/machinery/transformer/update_icon_state() if(stat & (BROKEN|NOPOWER) || cooldown == 1) icon_state = "separator-AO0" else diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index b5eed68ab0..ff5ba14810 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -199,8 +199,7 @@ -/obj/machinery/washing_machine/update_icon() - cut_overlays() +/obj/machinery/washing_machine/update_icon_state() if(busy) icon_state = "wm_running_[bloody_mess]" else if(bloody_mess) @@ -208,8 +207,11 @@ else var/full = contents.len ? 1 : 0 icon_state = "wm_[state_open]_[full]" + +/obj/machinery/washing_machine/update_overlays() + . = ..() if(panel_open) - add_overlay("wm_panel") + . += "wm_panel" /obj/machinery/washing_machine/attackby(obj/item/W, mob/user, params) if(panel_open && !busy && default_unfasten_wrench(user, W)) diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm index facf687cc4..bcf1b948e2 100644 --- a/code/game/mecha/mech_bay.dm +++ b/code/game/mecha/mech_bay.dm @@ -128,11 +128,11 @@ else recharge_port = null -/obj/machinery/computer/mech_bay_power_console/update_icon() - ..() +/obj/machinery/computer/mech_bay_power_console/update_overlays() + . = ..() if(!recharge_port || !recharge_port.recharging_mech || !recharge_port.recharging_mech.cell || !(recharge_port.recharging_mech.cell.charge < recharge_port.recharging_mech.cell.maxcharge) || stat & (NOPOWER|BROKEN)) return - add_overlay("recharge_comp_on") + . += "recharge_comp_on" /obj/machinery/computer/mech_bay_power_console/Initialize() . = ..() diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index 845b208db1..5f54f0c93d 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -45,16 +45,6 @@ ..() update_icon() -/obj/mecha/working/ripley/update_icon() - ..() - var/datum/component/armor_plate/C = GetComponent(/datum/component/armor_plate) - if (C.amount) - cut_overlays() - if(C.amount < 3) - add_overlay(occupant ? "ripley-g" : "ripley-g-open") - else - add_overlay(occupant ? "ripley-g-full" : "ripley-g-full-open") - /obj/mecha/working/ripley/Initialize() . = ..() AddComponent(/datum/component/armor_plate,3,/obj/item/stack/sheet/animalhide/goliath_hide,list("melee" = 10, "bullet" = 5, "laser" = 5)) diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm index cdf6b77a76..53adc46239 100644 --- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm +++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm @@ -139,13 +139,6 @@ /obj/effect/temp_visual/dir_setting/curse/hand icon_state = "cursehand" -/obj/effect/temp_visual/dir_setting/curse/hand/Initialize(mapload, set_dir, handedness) - . = ..() - update_icon() - -/obj/item/projectile/curse_hand/update_icon() - icon_state = "[icon_state][handedness]" - /obj/effect/temp_visual/wizard name = "water" icon = 'icons/mob/mob.dmi' @@ -474,7 +467,7 @@ else update_icon() -/obj/effect/constructing_effect/update_icon() +/obj/effect/constructing_effect/update_icon_state() icon_state = "rcd" if (delay < 10) icon_state += "_shortest" diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index 9f1d425d6c..d248556a9c 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -552,8 +552,8 @@ RLD explosion(src, 0, 0, 3, 1, flame_range = 1) qdel(src) -/obj/item/construction/rcd/update_icon() - ..() +/obj/item/construction/rcd/update_overlays() + . = ..() if(has_ammobar) var/ratio = CEILING((matter / max_matter) * ammo_sections, 1) cut_overlays() //To prevent infinite stacking of overlays @@ -707,11 +707,10 @@ RLD else ..() -/obj/item/construction/rld/update_icon() - ..() +/obj/item/construction/rld/update_overlays() + . = ..() var/ratio = CEILING((matter / max_matter) * ammo_sections, 1) - cut_overlays() //To prevent infinite stacking of overlays - add_overlay("rld_light[ratio]") + . += "rld_light[ratio]" /obj/item/construction/rld/attack_self(mob/user) ..() diff --git a/code/game/objects/items/RCL.dm b/code/game/objects/items/RCL.dm index 0eb97a8dee..e4c7382b3b 100644 --- a/code/game/objects/items/RCL.dm +++ b/code/game/objects/items/RCL.dm @@ -23,6 +23,10 @@ var/datum/radial_menu/persistent/wiring_gui_menu var/mob/listeningTo +/obj/item/twohanded/rcl/ComponentInitialize() + . = ..() + AddElement(/datum/element/update_icon_updates_onmob) + /obj/item/twohanded/rcl/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/C = W @@ -90,34 +94,20 @@ QDEL_NULL(wiring_gui_menu) return ..() -/obj/item/twohanded/rcl/update_icon() - if(!loaded) - icon_state = "rcl-empty" - item_state = "rcl-empty" +/obj/item/twohanded/rcl/update_icon_state() + icon_state = initial(icon_state) + item_state = initial(item_state) + if(!loaded || !loaded.amount) + icon_state += "-empty" + item_state += "-0" + +/obj/item/twohanded/rcl/update_overlays() + . = ..() + if(!loaded || !loaded.amount) return - cut_overlays() - var/cable_amount = 0 - switch(loaded.amount) - if(61 to INFINITY) - cable_amount = 3 - if(31 to 60) - cable_amount = 2 - if(1 to 30) - cable_amount = 1 - else - cable_amount = 0 - - var/mutable_appearance/cable_overlay = mutable_appearance(icon, "rcl-[cable_amount]") + var/mutable_appearance/cable_overlay = mutable_appearance(icon, "rcl-[max(CEILING(loaded.amount/(max_amount/3), 1), 3)]") cable_overlay.color = GLOB.cable_colors[colors[current_color_index]] - if(cable_amount >= 1) - icon_state = "rcl" - item_state = "rcl" - add_overlay(cable_overlay) - else - icon_state = "rcl-empty" - item_state = "rcl-0" - add_overlay(cable_overlay) - + . += cable_overlay /obj/item/twohanded/rcl/proc/is_empty(mob/user, loud = 1) update_icon() @@ -323,33 +313,6 @@ obj/item/twohanded/rcl/proc/getMobhook(mob/to_hook) actions_types = list() max_amount = 30 name = "makeshift rapid cable layer" + icon_state = "rclg" + item_state = "rclg" ghetto = TRUE - -/obj/item/twohanded/rcl/ghetto/update_icon() - if(!loaded) - icon_state = "rclg-empty" - item_state = "rclg-0" - return - cut_overlays() - var/cable_amount = 0 - switch(loaded.amount) - if(20 to INFINITY) - cable_amount = 3 - if(10 to 19) - cable_amount = 2 - if(1 to 9) - cable_amount = 1 - else - cable_amount = 0 - - var/mutable_appearance/cable_overlay = mutable_appearance(icon, "rcl-[cable_amount]") - cable_overlay.color = GLOB.cable_colors[colors[current_color_index]] - if(cable_amount >= 1) - icon_state = "rclg" - item_state = "rclg" - add_overlay(cable_overlay) - else - icon_state = "rclg-empty" - item_state = "rclg-0" - add_overlay(cable_overlay) - diff --git a/code/game/objects/items/boombox.dm b/code/game/objects/items/boombox.dm index 3b93480e43..49e2375c1a 100644 --- a/code/game/objects/items/boombox.dm +++ b/code/game/objects/items/boombox.dm @@ -37,7 +37,7 @@ SSjukeboxes.removejukebox(SSjukeboxes.findjukeboxindex(src)) . = ..() -/obj/item/boombox/update_icon() +/obj/item/boombox/update_icon_state() icon_state = "[baseiconstate]_[boomingandboxing ? "on" : "off"]" return @@ -48,8 +48,11 @@ baseiconstate = "raiqbawks" availabletrackids = list("hotline.ogg","chiptune.ogg","genesis.ogg") -/obj/item/boombox/raiq/update_icon() +/obj/item/boombox/raiq/Initialize() . = ..() + RegisterSignal(src, COMSIG_ATOM_UPDATED_ICON, .proc/start_party) + +/obj/item/boombox/raiq/proc/start_party() if(boomingandboxing) START_PROCESSING(SSobj, src) else @@ -58,4 +61,3 @@ /obj/item/boombox/raiq/process() set_light(5,0.95,pick("#d87aff","#7a7aff","#89ecff","#b88eff","#ff59ad")) - return diff --git a/code/game/objects/items/candle.dm b/code/game/objects/items/candle.dm index 78be7f78e8..11ab008c41 100644 --- a/code/game/objects/items/candle.dm +++ b/code/game/objects/items/candle.dm @@ -19,7 +19,7 @@ if(start_lit) light() -/obj/item/candle/update_icon() +/obj/item/candle/update_icon_state() icon_state = "candle[(wax > 400) ? ((wax > 750) ? 1 : 2) : 3][lit ? "_lit" : ""]" /obj/item/candle/attackby(obj/item/W, mob/user, params) diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 4de3e4ff96..20e0b09d26 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -40,13 +40,13 @@ .=..() update_icon() -/obj/item/card/data/update_icon() - cut_overlays() +/obj/item/card/data/update_overlays() + . = ..() if(detail_color == COLOR_FLOORTILE_GRAY) return var/mutable_appearance/detail_overlay = mutable_appearance('icons/obj/card.dmi', "[icon_state]-color") detail_overlay.color = detail_color - add_overlay(detail_overlay) + . += detail_overlay /obj/item/card/data/attackby(obj/item/I, mob/living/user) if(istype(I, /obj/item/integrated_electronics/detailer)) @@ -517,10 +517,16 @@ update_label("John Doe", "Clowny") //Polychromatic Knight Badge /obj/item/card/id/knight - var/id_color = "#00FF00" //defaults to green name = "knight badge" icon_state = "knight" desc = "A badge denoting the owner as a knight! It has a strip for swiping like an ID" + var/id_color = "#00FF00" //defaults to green + var/mutable_appearance/id_overlay + +/obj/item/card/id/knight/Initialize() + . = ..() + id_overlay = mutable_appearance(icon, "knight_overlay") + update_icon() /obj/item/card/id/knight/update_label(newname, newjob) if(newname || newjob) @@ -529,14 +535,10 @@ update_label("John Doe", "Clowny") name = "[(!registered_name) ? "knight badge" : "[registered_name]'s Knight Badge"][(!assignment) ? "" : " ([assignment])"]" -/obj/item/card/id/knight/update_icon() - var/mutable_appearance/id_overlay = mutable_appearance(icon, "knight_overlay") - - if(id_color) - id_overlay.color = id_color - cut_overlays() - - add_overlay(id_overlay) +/obj/item/card/id/knight/update_overlays() + . = ..() + id_overlay.color = id_color + . += id_overlay /obj/item/card/id/knight/AltClick(mob/living/user) . = ..() @@ -556,10 +558,6 @@ update_label("John Doe", "Clowny") update_icon() return TRUE -/obj/item/card/id/knight/Initialize() - . = ..() - update_icon() - /obj/item/card/id/knight/examine(mob/user) . = ..() . += "Alt-click to recolor it." diff --git a/code/game/objects/items/chrono_eraser.dm b/code/game/objects/items/chrono_eraser.dm index 2dcb495701..7b8c53484a 100644 --- a/code/game/objects/items/chrono_eraser.dm +++ b/code/game/objects/items/chrono_eraser.dm @@ -65,8 +65,9 @@ TED = new(src.loc) return INITIALIZE_HINT_QDEL -/obj/item/gun/energy/chrono_gun/update_icon() - return +/obj/item/gun/energy/chrono_gun/ComponentInitialize() + . = ..() + AddElement(/datum/element/update_icon_blocker) /obj/item/gun/energy/chrono_gun/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) if(field) diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index cd163e90a4..ac666f04db 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -522,11 +522,13 @@ CIGARETTE PACKETS ARE IN FANCY.DM user.visible_message("[user] begins whacking [user.p_them()]self with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!") return BRUTELOSS -/obj/item/lighter/update_icon() - cut_overlays() - var/mutable_appearance/lighter_overlay = mutable_appearance(icon,"lighter_overlay_[overlay_state][lit ? "-on" : ""]") +/obj/item/lighter/update_icon_state() icon_state = "[initial(icon_state)][lit ? "-on" : ""]" - add_overlay(lighter_overlay) + +/obj/item/lighter/update_overlays() + . = ..() + var/mutable_appearance/lighter_overlay = mutable_appearance(icon,"lighter_overlay_[overlay_state][lit ? "-on" : ""]") + . += lighter_overlay /obj/item/lighter/ignition_effect(atom/A, mob/user) if(get_temperature()) @@ -645,12 +647,14 @@ CIGARETTE PACKETS ARE IN FANCY.DM lighter_color = pick(color_list) update_icon() -/obj/item/lighter/greyscale/update_icon() - cut_overlays() - var/mutable_appearance/lighter_overlay = mutable_appearance(icon,"lighter_overlay_[overlay_state][lit ? "-on" : ""]") +/obj/item/lighter/greyscale/update_icon_state() icon_state = "[initial(icon_state)][lit ? "-on" : ""]" + +/obj/item/lighter/greyscale/update_overlays() + . = ..() + var/mutable_appearance/lighter_overlay = mutable_appearance(icon,"lighter_overlay_[overlay_state][lit ? "-on" : ""]") lighter_overlay.color = lighter_color - add_overlay(lighter_overlay) + . += lighter_overlay /obj/item/lighter/greyscale/ignition_effect(atom/A, mob/user) if(get_temperature()) diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 49f8a90901..f81268f1dc 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -577,8 +577,8 @@ new /obj/item/toy/crayon/black(src) update_icon() -/obj/item/storage/crayons/update_icon() - cut_overlays() +/obj/item/storage/crayons/update_overlays() + . = ..() for(var/obj/item/toy/crayon/crayon in contents) add_overlay(mutable_appearance('icons/obj/crayons.dmi', crayon.item_color)) @@ -735,13 +735,15 @@ . = ..() -/obj/item/toy/crayon/spraycan/update_icon() +/obj/item/toy/crayon/spraycan/update_icon_state() icon_state = is_capped ? icon_capped : icon_uncapped + +/obj/item/toy/crayon/spraycan/update_overlays() + . = ..() if(use_overlays) - cut_overlays() var/mutable_appearance/spray_overlay = mutable_appearance('icons/obj/crayons.dmi', "[is_capped ? "spraycan_cap_colors" : "spraycan_colors"]") spray_overlay.color = paint_color - add_overlay(spray_overlay) + . += spray_overlay /obj/item/toy/crayon/spraycan/borg name = "cyborg spraycan" diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index e35d398021..a28166606e 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -20,7 +20,7 @@ var/safety = TRUE //if you can zap people with the defibs on harm mode var/powered = FALSE //if there's a cell in the defib with enough power for a revive, blocks paddles from reviving otherwise var/obj/item/twohanded/shockpaddles/paddles - var/obj/item/stock_parts/cell/high/cell + var/obj/item/stock_parts/cell/cell var/combat = FALSE //can we revive through space suits? var/grab_ghost = FALSE // Do we pull the ghost back into their body? var/healdisk = FALSE // Will we shock people dragging the body? @@ -35,19 +35,14 @@ /obj/item/defibrillator/Initialize() //starts without a cell for rnd . = ..() + if(cell) + cell = new cell(src) paddles = make_paddles() - update_icon() - return - -/obj/item/defibrillator/loaded/Initialize() //starts with hicap - . = ..() - cell = new(src) - update_icon() - return - -/obj/item/defibrillator/update_icon() update_power() - return ..() + return + +/obj/item/defibrillator/loaded + cell = /obj/item/stock_parts/cell/high /obj/item/defibrillator/proc/update_power() if(!QDELETED(cell)) @@ -57,6 +52,7 @@ powered = TRUE else powered = FALSE + update_icon() /obj/item/defibrillator/update_overlays() . = ..() @@ -76,7 +72,7 @@ /obj/item/defibrillator/CheckParts(list/parts_list) ..() cell = locate(/obj/item/stock_parts/cell) in contents - update_icon() + update_power() /obj/item/defibrillator/ui_action_click() toggle_paddles() @@ -124,7 +120,7 @@ return cell = W to_chat(user, "You install a cell in [src].") - update_icon() + update_power() else if(istype(W, /obj/item/screwdriver)) if(cell) @@ -132,7 +128,7 @@ cell.forceMove(get_turf(src)) cell = null to_chat(user, "You remove the cell from [src].") - update_icon() + update_power() else return ..() @@ -157,7 +153,7 @@ safety = TRUE visible_message("[src] beeps: Safety protocols enabled!") playsound(src, 'sound/machines/defib_saftyOn.ogg', 50, 0) - update_icon() + update_power() /obj/item/defibrillator/proc/toggle_paddles() set name = "Toggle Paddles" @@ -170,14 +166,14 @@ if(!usr.put_in_hands(paddles)) on = FALSE to_chat(user, "You need a free hand to hold the paddles!") - update_icon() + update_power() return else //Remove from their hands and back onto the defib unit paddles.unwield() remove_paddles(user) - update_icon() + update_power() for(var/X in actions) var/datum/action/A = X A.UpdateButtonIcon() @@ -189,7 +185,7 @@ ..() if((slot_flags == ITEM_SLOT_BACK && slot != SLOT_BACK) || (slot_flags == ITEM_SLOT_BELT && slot != SLOT_BELT)) remove_paddles(user) - update_icon() + update_power() /obj/item/defibrillator/item_action_slot_check(slot, mob/user, datum/action/A) if(slot == user.getBackSlot()) @@ -213,12 +209,12 @@ if(cell) if(cell.charge < (paddles.revivecost+chrgdeductamt)) powered = FALSE - update_icon() + update_power() if(cell.use(chrgdeductamt)) - update_icon() + update_power() return TRUE else - update_icon() + update_power() return FALSE /obj/item/defibrillator/proc/cooldowncheck(mob/user) @@ -232,7 +228,7 @@ playsound(src, 'sound/machines/defib_failed.ogg', 50, 0) paddles.cooldown = FALSE paddles.update_icon() - update_icon() + update_power() /obj/item/defibrillator/compact name = "compact defibrillator" @@ -249,7 +245,7 @@ /obj/item/defibrillator/compact/loaded/Initialize() . = ..() cell = new(src) - update_icon() + update_power() /obj/item/defibrillator/compact/combat name = "combat defibrillator" @@ -258,17 +254,12 @@ safety = FALSE always_emagged = TRUE disarm_shock_time = 0 - -/obj/item/defibrillator/compact/combat/loaded/Initialize() - . = ..() - cell = new /obj/item/stock_parts/cell/infinite(src) - update_icon() + cell = /obj/item/stock_parts/cell/infinite /obj/item/defibrillator/compact/combat/loaded/attackby(obj/item/W, mob/user, params) if(W == paddles) paddles.unwield() toggle_paddles() - update_icon() return //paddles @@ -298,6 +289,10 @@ var/mob/listeningTo +/obj/item/twohanded/shockpaddles/ComponentInitialize() + . = ..() + AddElement(/datum/element/update_icon_updates_onmob) + /obj/item/twohanded/shockpaddles/equipped(mob/user, slot) . = ..() if(!req_defib) @@ -339,14 +334,11 @@ busy = FALSE update_icon() -/obj/item/twohanded/shockpaddles/update_icon() +/obj/item/twohanded/shockpaddles/update_icon_state() icon_state = "defibpaddles[wielded]" item_state = "defibpaddles[wielded]" if(cooldown) icon_state = "defibpaddles[wielded]_cooldown" - if(iscarbon(loc)) - var/mob/living/carbon/C = loc - C.update_inv_hands() /obj/item/twohanded/shockpaddles/suicide_act(mob/user) user.visible_message("[user] is putting the live paddles on [user.p_their()] chest! It looks like [user.p_theyre()] trying to commit suicide!") @@ -373,7 +365,7 @@ return defib.on = FALSE forceMove(defib) - defib.update_icon() + defib.update_power() /obj/item/twohanded/shockpaddles/proc/check_defib_exists(mainunit, mob/living/carbon/M, obj/O) if(!req_defib) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index fe8f3ca626..eed4f2ce80 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -41,6 +41,11 @@ GLOBAL_LIST_EMPTY(PDAs) var/mode = 0 //Controls what menu the PDA will display. 0 is hub; the rest are either built in or based on cartridge. var/list/overlays_icons = list('icons/obj/pda_alt.dmi' = list("pda-r", "screen_default", "id_overlay", "insert_overlay", "light_overlay", "pai_overlay")) var/current_overlays = PDA_STANDARD_OVERLAYS + + //variables exclusively used on 'update_overlays' (which should never be called directly, and 'update_icon' doesn't use args anyway) + var/new_overlays = FALSE + var/new_alert = FALSE + var/font_index = 0 //This int tells DM which font is currently selected and lets DM know when the last font has been selected so that it can cycle back to the first font when "toggle font" is pressed again. var/font_mode = "font-family:monospace;" //The currently selected font. var/background_color = "#808000" //The currently selected background color. @@ -123,7 +128,8 @@ GLOBAL_LIST_EMPTY(PDAs) inserted_item = new inserted_item(src) else inserted_item = new /obj/item/pen(src) - update_icon(FALSE, TRUE) + new_overlays = TRUE + update_icon() /obj/item/pda/CtrlShiftClick(mob/living/user) . = ..() @@ -144,7 +150,8 @@ GLOBAL_LIST_EMPTY(PDAs) if(QDELETED(src) || isnull(new_icon) || new_icon == icon || !M.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) return icon = new_icon - update_icon(FALSE, TRUE) + new_overlays = TRUE + update_icon() to_chat(M, "[src] is now skinned as '[choice]'.") /obj/item/pda/proc/set_new_overlays() @@ -188,7 +195,8 @@ GLOBAL_LIST_EMPTY(PDAs) var/pref_skin = GLOB.pda_reskins[C.prefs.pda_skin] if(icon != pref_skin) icon = pref_skin - update_icon(FALSE, TRUE) + new_overlays = TRUE + update_icon() equipped = TRUE /obj/item/pda/proc/update_label() @@ -215,25 +223,27 @@ GLOBAL_LIST_EMPTY(PDAs) return TRUE return FALSE -/obj/item/pda/update_icon(alert = FALSE, new_overlays = FALSE) +/obj/item/pda/update_overlays() + . = ..() if(new_overlays) set_new_overlays() - cut_overlays() - add_overlay(alert ? current_overlays[PDA_OVERLAY_ALERT] : current_overlays[PDA_OVERLAY_SCREEN]) + . += new_alert ? current_overlays[PDA_OVERLAY_ALERT] : current_overlays[PDA_OVERLAY_SCREEN] var/mutable_appearance/overlay = new() overlay.pixel_x = overlays_x_offset if(id) overlay.icon_state = current_overlays[PDA_OVERLAY_ID] - add_overlay(new /mutable_appearance(overlay)) + . += new /mutable_appearance(overlay) if(inserted_item) overlay.icon_state = current_overlays[PDA_OVERLAY_ITEM] - add_overlay(new /mutable_appearance(overlay)) + . += new /mutable_appearance(overlay) if(fon) overlay.icon_state = current_overlays[PDA_OVERLAY_LIGHT] - add_overlay(new /mutable_appearance(overlay)) + . += new /mutable_appearance(overlay) if(pai) overlay.icon_state = "[current_overlays[PDA_OVERLAY_PAI]][pai.pai ? "" : "_off"]" - add_overlay(new /mutable_appearance(overlay)) + . += new /mutable_appearance(overlay) + new_overlays = FALSE + new_alert = FALSE /obj/item/pda/MouseDrop(mob/over, src_location, over_location) var/mob/M = usr @@ -849,6 +859,7 @@ GLOBAL_LIST_EMPTY(PDAs) to_chat(L, "[icon2html(src)] Message from [hrefstart][signal.data["name"]] ([signal.data["job"]])[hrefend], [inbound_message] (Reply) (BLOCK/UNBLOCK)") + new_alert = TRUE update_icon(TRUE) /obj/item/pda/proc/send_to_all(mob/living/U) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 82644cb0fe..bf023c2c07 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -454,7 +454,7 @@ on = FALSE update_icon() -/obj/item/flashlight/glowstick/update_icon() +/obj/item/flashlight/glowstick/update_icon_state() item_state = "glowstick" cut_overlays() if(!fuel) diff --git a/code/game/objects/items/devices/geiger_counter.dm b/code/game/objects/items/devices/geiger_counter.dm index 6168e2dabe..9eb51ffaeb 100644 --- a/code/game/objects/items/devices/geiger_counter.dm +++ b/code/game/objects/items/devices/geiger_counter.dm @@ -87,27 +87,25 @@ . += "The last radiation amount detected was [last_tick_amount]" -/obj/item/geiger_counter/update_icon() +/obj/item/geiger_counter/update_icon_state() if(!scanning) icon_state = "geiger_off" - return 1 - if(obj_flags & EMAGGED) + else if(obj_flags & EMAGGED) icon_state = "geiger_on_emag" - return 1 - switch(radiation_count) - if(-INFINITY to RAD_LEVEL_NORMAL) - icon_state = "geiger_on_1" - if(RAD_LEVEL_NORMAL + 1 to RAD_LEVEL_MODERATE) - icon_state = "geiger_on_2" - if(RAD_LEVEL_MODERATE + 1 to RAD_LEVEL_HIGH) - icon_state = "geiger_on_3" - if(RAD_LEVEL_HIGH + 1 to RAD_LEVEL_VERY_HIGH) - icon_state = "geiger_on_4" - if(RAD_LEVEL_VERY_HIGH + 1 to RAD_LEVEL_CRITICAL) - icon_state = "geiger_on_4" - if(RAD_LEVEL_CRITICAL + 1 to INFINITY) - icon_state = "geiger_on_5" - ..() + else + switch(radiation_count) + if(-INFINITY to RAD_LEVEL_NORMAL) + icon_state = "geiger_on_1" + if(RAD_LEVEL_NORMAL + 1 to RAD_LEVEL_MODERATE) + icon_state = "geiger_on_2" + if(RAD_LEVEL_MODERATE + 1 to RAD_LEVEL_HIGH) + icon_state = "geiger_on_3" + if(RAD_LEVEL_HIGH + 1 to RAD_LEVEL_VERY_HIGH) + icon_state = "geiger_on_4" + if(RAD_LEVEL_VERY_HIGH + 1 to RAD_LEVEL_CRITICAL) + icon_state = "geiger_on_4" + if(RAD_LEVEL_CRITICAL + 1 to INFINITY) + icon_state = "geiger_on_5" /obj/item/geiger_counter/proc/update_sound() var/datum/looping_sound/geiger/loop = soundloop diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index 30eaca2ba2..bee59b254c 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -158,7 +158,7 @@ /obj/item/lightreplacer/attack_self(mob/user) to_chat(user, status_string()) -/obj/item/lightreplacer/update_icon() +/obj/item/lightreplacer/update_icon_state() icon_state = "lightreplacer[(obj_flags & EMAGGED ? 1 : 0)]" /obj/item/lightreplacer/proc/status_string() diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index 65c3a96572..63092b5a13 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -67,7 +67,7 @@ to_chat(user, "You clear the wired connection from the multitool.") update_icon() -/obj/item/multitool/update_icon() +/obj/item/multitool/update_icon_state() if(selected_io) icon_state = "multitool_red" else @@ -149,7 +149,7 @@ /obj/item/multitool/ai_detect/ui_action_click() return -/obj/item/multitool/ai_detect/update_icon() +/obj/item/multitool/ai_detect/update_icon_state() if(selected_io) icon_state = "multitool_red" else diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index ba877f1dd7..352c998699 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -26,7 +26,7 @@ var/obj/structure/cable/attached // the attached cable -/obj/item/powersink/update_icon() +/obj/item/powersink/update_icon_state() icon_state = "powersink[mode == OPERATING]" /obj/item/powersink/proc/set_mode(value) diff --git a/code/game/objects/items/devices/quantum_keycard.dm b/code/game/objects/items/devices/quantum_keycard.dm index 33f839fa39..33f6dc877a 100644 --- a/code/game/objects/items/devices/quantum_keycard.dm +++ b/code/game/objects/items/devices/quantum_keycard.dm @@ -27,7 +27,7 @@ qpad = null return TRUE -/obj/item/quantum_keycard/update_icon() +/obj/item/quantum_keycard/update_icon_state() if(qpad) icon_state = "quantum_keycard_on" else diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index fc8679aa03..78a1a3bfda 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -83,7 +83,7 @@ eject(usr) -/obj/item/taperecorder/update_icon() +/obj/item/taperecorder/update_icon_state() if(!mytape) icon_state = "taperecorder_empty" else if(recording) diff --git a/code/game/objects/items/dice.dm b/code/game/objects/items/dice.dm index b1dd9be376..f572d0a841 100644 --- a/code/game/objects/items/dice.dm +++ b/code/game/objects/items/dice.dm @@ -134,8 +134,9 @@ w_class = WEIGHT_CLASS_SMALL sides = 100 -/obj/item/dice/d100/update_icon() - return +/obj/item/dice/d100/ComponentInitialize() + . = ..() + AddElement(/datum/element/update_icon_blocker) /obj/item/dice/eightbd20 name = "strange d20" @@ -144,8 +145,9 @@ sides = 20 special_faces = list("It is certain","It is decidedly so","Without a doubt","Yes, definitely","You may rely on it","As I see it, yes","Most likely","Outlook good","Yes","Signs point to yes","Reply hazy try again","Ask again later","Better not tell you now","Cannot predict now","Concentrate and ask again","Don't count on it","My reply is no","My sources say no","Outlook not so good","Very doubtful") -/obj/item/dice/eightbd20/update_icon() - return +/obj/item/dice/eightbd20/ComponentInitialize() + . = ..() + AddElement(/datum/element/update_icon_blocker) /obj/item/dice/fourdd6 name = "4d d6" @@ -154,8 +156,9 @@ sides = 48 special_faces = list("Cube-Side: 1-1","Cube-Side: 1-2","Cube-Side: 1-3","Cube-Side: 1-4","Cube-Side: 1-5","Cube-Side: 1-6","Cube-Side: 2-1","Cube-Side: 2-2","Cube-Side: 2-3","Cube-Side: 2-4","Cube-Side: 2-5","Cube-Side: 2-6","Cube-Side: 3-1","Cube-Side: 3-2","Cube-Side: 3-3","Cube-Side: 3-4","Cube-Side: 3-5","Cube-Side: 3-6","Cube-Side: 4-1","Cube-Side: 4-2","Cube-Side: 4-3","Cube-Side: 4-4","Cube-Side: 4-5","Cube-Side: 4-6","Cube-Side: 5-1","Cube-Side: 5-2","Cube-Side: 5-3","Cube-Side: 5-4","Cube-Side: 5-5","Cube-Side: 5-6","Cube-Side: 6-1","Cube-Side: 6-2","Cube-Side: 6-3","Cube-Side: 6-4","Cube-Side: 6-5","Cube-Side: 6-6","Cube-Side: 7-1","Cube-Side: 7-2","Cube-Side: 7-3","Cube-Side: 7-4","Cube-Side: 7-5","Cube-Side: 7-6","Cube-Side: 8-1","Cube-Side: 8-2","Cube-Side: 8-3","Cube-Side: 8-4","Cube-Side: 8-5","Cube-Side: 8-6") -/obj/item/dice/fourdd6/update_icon() - return +/obj/item/dice/fourdd6/ComponentInitialize() + . = ..() + AddElement(/datum/element/update_icon_blocker) /obj/item/dice/attack_self(mob/user) diceroll(user) @@ -187,9 +190,9 @@ else if(!src.throwing) //Dice was thrown and is coming to rest visible_message("[src] rolls to a stop, landing on [result]. [comment]") -/obj/item/dice/update_icon() - cut_overlays() - add_overlay("[src.icon_state]-[src.result]") +/obj/item/dice/update_overlays() + . = ..() + . += "[icon_state]-[result]" /obj/item/dice/microwave_act(obj/machinery/microwave/M) if(can_be_rigged) diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm index e307b9d626..b0882b6e5d 100644 --- a/code/game/objects/items/flamethrower.dm +++ b/code/game/objects/items/flamethrower.dm @@ -27,6 +27,10 @@ var/igniter_type = /obj/item/assembly/igniter trigger_guard = TRIGGER_GUARD_NORMAL +/obj/item/flamethrower/ComponentInitialize() + . = ..() + AddElement(/datum/element/update_icon_updates_onmob) + /obj/item/flamethrower/Destroy() if(weldtool) qdel(weldtool) @@ -48,22 +52,17 @@ if(isturf(location)) //start a fire if possible igniter.flamethrower_process(location) +/obj/item/flamethrower/update_icon_state() + item_state = "flamethrower_[lit]" -/obj/item/flamethrower/update_icon() - cut_overlays() +/obj/item/flamethrower/update_overlays() + . = ..() if(igniter) - add_overlay("+igniter[status]") + . += "+igniter[status]" if(ptank) - add_overlay("+ptank") + . += "+ptank" if(lit) - add_overlay("+lit") - item_state = "flamethrower_1" - else - item_state = "flamethrower_0" - if(ismob(loc)) - var/mob/M = loc - M.update_inv_hands() - return + . += "+lit" /obj/item/flamethrower/afterattack(atom/target, mob/user, flag) . = ..() diff --git a/code/game/objects/items/grenades/plastic.dm b/code/game/objects/items/grenades/plastic.dm index 75e4e0b477..eaecae5a92 100644 --- a/code/game/objects/items/grenades/plastic.dm +++ b/code/game/objects/items/grenades/plastic.dm @@ -158,7 +158,7 @@ user.gib(1, 1) qdel(src) -/obj/item/grenade/plastic/update_icon() +/obj/item/grenade/plastic/update_icon_state() if(nadeassembly) icon_state = "[item_state]1" else diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index f458fe7e63..b4074737e5 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -128,9 +128,6 @@ item_color = param_color || item_color || pick(cable_colors) if(cable_colors[item_color]) item_color = cable_colors[item_color] - update_icon() - -/obj/item/restraints/handcuffs/cable/update_icon() color = null add_atom_colour(item_color, FIXED_COLOUR_PRIORITY) diff --git a/code/game/objects/items/hot_potato.dm b/code/game/objects/items/hot_potato.dm index 02ac894e64..8f1d968991 100644 --- a/code/game/objects/items/hot_potato.dm +++ b/code/game/objects/items/hot_potato.dm @@ -154,7 +154,7 @@ colorize(null) active = FALSE -/obj/item/hot_potato/update_icon() +/obj/item/hot_potato/update_icon_state() icon_state = active? icon_on : icon_off /obj/item/hot_potato/syndicate diff --git a/code/game/objects/items/implants/implantcase.dm b/code/game/objects/items/implants/implantcase.dm index c1734cb24e..481f1a4181 100644 --- a/code/game/objects/items/implants/implantcase.dm +++ b/code/game/objects/items/implants/implantcase.dm @@ -10,18 +10,14 @@ throw_range = 5 w_class = WEIGHT_CLASS_TINY custom_materials = list(/datum/material/glass=500) - var/obj/item/implant/imp = null + var/obj/item/implant/imp var/imp_type - -/obj/item/implantcase/update_icon() +/obj/item/implantcase/update_icon_state() if(imp) icon_state = "implantcase-[imp.item_color]" - reagents = imp.reagents else icon_state = "implantcase-0" - reagents = null - /obj/item/implantcase/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/pen)) @@ -46,6 +42,7 @@ imp = I.imp I.imp = null update_icon() + reagents = imp.reagents I.update_icon() else if(imp) @@ -54,6 +51,7 @@ imp.forceMove(I) I.imp = imp imp = null + reagents = null update_icon() I.update_icon() diff --git a/code/game/objects/items/implants/implantchair.dm b/code/game/objects/items/implants/implantchair.dm index 46a6cb2c35..3ea27c84bb 100644 --- a/code/game/objects/items/implants/implantchair.dm +++ b/code/game/objects/items/implants/implantchair.dm @@ -96,16 +96,17 @@ visible_message("[M] has been implanted by [src].") return TRUE -/obj/machinery/implantchair/update_icon() +/obj/machinery/implantchair/update_icon_state() icon_state = initial(icon_state) if(state_open) icon_state += "_open" if(occupant) icon_state += "_occupied" + +/obj/machinery/implantchair/update_overlays() + . = ..() if(ready) - add_overlay("ready") - else - cut_overlays() + . += "ready" /obj/machinery/implantchair/proc/replenish() if(ready_implants < max_implants) diff --git a/code/game/objects/items/implants/implanter.dm b/code/game/objects/items/implants/implanter.dm index 414bb3ea69..b57ffa27c0 100644 --- a/code/game/objects/items/implants/implanter.dm +++ b/code/game/objects/items/implants/implanter.dm @@ -14,13 +14,12 @@ var/imp_type = null -/obj/item/implanter/update_icon() +/obj/item/implanter/update_icon_state() if(imp) icon_state = "implanter1" else icon_state = "implanter0" - /obj/item/implanter/attack(mob/living/M, mob/user) if(!istype(M)) return diff --git a/code/game/objects/items/implants/implantpad.dm b/code/game/objects/items/implants/implantpad.dm index c49e4d8d42..7c863017a1 100644 --- a/code/game/objects/items/implants/implantpad.dm +++ b/code/game/objects/items/implants/implantpad.dm @@ -18,7 +18,7 @@ if(case) . += "Alt-click [src] to remove the inserted implant case." -/obj/item/implantpad/update_icon() +/obj/item/implantpad/update_icon_state() icon_state = "implantpad-[case ? TRUE : FALSE]" /obj/item/implantpad/AltClick(mob/user) diff --git a/code/game/objects/items/inducer.dm b/code/game/objects/items/inducer.dm index 079e0d79e9..8a596b2e6e 100644 --- a/code/game/objects/items/inducer.dm +++ b/code/game/objects/items/inducer.dm @@ -163,13 +163,14 @@ if(opened) . += "Its battery compartment is open." -/obj/item/inducer/update_icon() - cut_overlays() - if(opened) - if(!cell) - add_overlay("inducer-nobat") - else - add_overlay("inducer-bat") +/obj/item/inducer/update_overlays() + . = ..() + if(!opened) + return + if(!cell) + . += "inducer-nobat" + else + . += "inducer-bat" /obj/item/inducer/sci icon_state = "inducer-sci" diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm index 3ca489542f..405e3737d0 100644 --- a/code/game/objects/items/melee/energy.dm +++ b/code/game/objects/items/melee/energy.dm @@ -259,6 +259,10 @@ light_color = "#37FFF7" actions_types = list() +/obj/item/melee/transforming/energy/sword/cx/ComponentInitialize() + . = ..() + AddElement(/datum/element/update_icon_updates_onmob) + /obj/item/melee/transforming/energy/sword/cx/alt_pre_attack(atom/A, mob/living/user, params) //checks if it can do right click memes altafterattack(A, user, TRUE, params) return TRUE @@ -301,7 +305,8 @@ if(!supress_message_text) to_chat(user, "[src] [active ? "is now active":"can now be concealed"].") -/obj/item/melee/transforming/energy/sword/cx/update_icon() +/obj/item/melee/transforming/energy/sword/cx/update_overlays() + . = ..() var/mutable_appearance/blade_overlay = mutable_appearance(icon, "cxsword_blade") var/mutable_appearance/gem_overlay = mutable_appearance(icon, "cxsword_gem") @@ -309,15 +314,10 @@ blade_overlay.color = light_color gem_overlay.color = light_color - cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other - - add_overlay(gem_overlay) + . += gem_overlay if(active) - add_overlay(blade_overlay) - if(ismob(loc)) - var/mob/M = loc - M.update_inv_hands() + . += blade_overlay /obj/item/melee/transforming/energy/sword/cx/AltClick(mob/living/user) . = ..() diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index a71e82d865..9c544a34ef 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -453,12 +453,10 @@ held_sausage = null update_icon() -/obj/item/melee/roastingstick/update_icon() +/obj/item/melee/roastingstick/update_overlays() . = ..() - cut_overlays() if (held_sausage) - var/mutable_appearance/sausage = mutable_appearance(icon, "roastingstick_sausage") - add_overlay(sausage) + . += mutable_appearance(icon, "roastingstick_sausage") /obj/item/melee/roastingstick/proc/extend(user) to_chat(user, "You extend [src].") diff --git a/code/game/objects/items/pet_carrier.dm b/code/game/objects/items/pet_carrier.dm index 5f49f6b06d..9d9409acf0 100644 --- a/code/game/objects/items/pet_carrier.dm +++ b/code/game/objects/items/pet_carrier.dm @@ -143,14 +143,16 @@ update_icon() remove_occupant(user) -/obj/item/pet_carrier/update_icon() - cut_overlay("unlocked") - cut_overlay("locked") +/obj/item/pet_carrier/update_icon_state() if(open) icon_state = initial(icon_state) else icon_state = "pet_carrier_[!occupants.len ? "closed" : "occupied"]" - add_overlay("[locked ? "" : "un"]locked") + +/obj/item/pet_carrier/update_overlays() + . = ..() + if(!open) + . += "[locked ? "" : "un"]locked" /obj/item/pet_carrier/MouseDrop(atom/over_atom) if(isopenturf(over_atom) && usr.canUseTopic(src, BE_CLOSE, ismonkey(usr)) && usr.Adjacent(over_atom) && open && occupants.len) diff --git a/code/game/objects/items/pinpointer.dm b/code/game/objects/items/pinpointer.dm index 57f247cdb2..65eb7ab658 100644 --- a/code/game/objects/items/pinpointer.dm +++ b/code/game/objects/items/pinpointer.dm @@ -49,29 +49,29 @@ /obj/item/pinpointer/proc/scan_for_target() return -/obj/item/pinpointer/update_icon() - cut_overlays() +/obj/item/pinpointer/update_overlays() + . = ..() if(!active) return if(!target) - add_overlay("pinon[alert ? "alert" : ""]null") + . += "pinon[alert ? "alert" : ""]null" return var/turf/here = get_turf(src) var/turf/there = get_turf(target) if(!here || !there || here.z != there.z) - add_overlay("pinon[alert ? "alert" : ""]null") + . += "pinon[alert ? "alert" : ""]null" return if(get_dist_euclidian(here,there) <= minimum_range) - add_overlay("pinon[alert ? "alert" : ""]direct") + . += "pinon[alert ? "alert" : ""]direct" else setDir(get_dir(here, there)) switch(get_dist(here, there)) if(1 to 8) - add_overlay("pinon[alert ? "alert" : "close"]") + . += "pinon[alert ? "alert" : "close"]" if(9 to 16) - add_overlay("pinon[alert ? "alert" : "medium"]") + . += "pinon[alert ? "alert" : "medium"]" if(16 to INFINITY) - add_overlay("pinon[alert ? "alert" : "far"]") + . += "pinon[alert ? "alert" : "far"]" /obj/item/pinpointer/crew // A replacement for the old crew monitoring consoles name = "crew pinpointer" diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm index e63b4d7a3a..dae4c9a137 100644 --- a/code/game/objects/items/pneumaticCannon.dm +++ b/code/game/objects/items/pneumaticCannon.dm @@ -241,11 +241,11 @@ tank = thetank update_icon() -/obj/item/pneumatic_cannon/update_icon() - cut_overlays() +/obj/item/pneumatic_cannon/update_overlays() + . = ..() if(!tank) return - add_overlay(tank.icon_state) + . += tank.icon_state /obj/item/pneumatic_cannon/proc/fill_with_type(type, amount) if(!ispath(type, /obj) && !ispath(type, /mob)) diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index 056d9e4677..48c16190d9 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -154,11 +154,7 @@ var/static/list/charge_machines = typecacheof(list(/obj/machinery/cell_charger, /obj/machinery/recharger, /obj/machinery/recharge_station, /obj/machinery/mech_bay_recharge_port)) var/static/list/charge_items = typecacheof(list(/obj/item/stock_parts/cell, /obj/item/gun/energy)) -/obj/item/borg/charger/Initialize() - . = ..() - -/obj/item/borg/charger/update_icon() - ..() +/obj/item/borg/charger/update_icon_state() icon_state = "charger_[mode]" /obj/item/borg/charger/attack_self(mob/user) @@ -596,7 +592,7 @@ update_icon() to_chat(user, "You [active? "activate":"deactivate"] [src].") -/obj/item/borg/projectile_dampen/update_icon() +/obj/item/borg/projectile_dampen/update_icon_state() icon_state = "[initial(icon_state)][active]" /obj/item/borg/projectile_dampen/proc/activate_field() diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 2bf9ead4ea..54f0dc600d 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -39,20 +39,20 @@ chest.cell = new /obj/item/stock_parts/cell/high/plus(chest) ..() -/obj/item/robot_suit/update_icon() - cut_overlays() +/obj/item/robot_suit/update_overlays() + . = ..() if(l_arm) - add_overlay("[l_arm.icon_state]+o") + . += "[l_arm.icon_state]+o" if(r_arm) - add_overlay("[r_arm.icon_state]+o") + . += "[r_arm.icon_state]+o" if(chest) - add_overlay("[chest.icon_state]+o") + . += "[chest.icon_state]+o" if(l_leg) - add_overlay("[l_leg.icon_state]+o") + . += "[l_leg.icon_state]+o" if(r_leg) - add_overlay("[r_leg.icon_state]+o") + . += "[r_leg.icon_state]+o" if(head) - add_overlay("[head.icon_state]+o") + . += "[head.icon_state]+o" /obj/item/robot_suit/proc/check_completion() if(src.l_arm && src.r_arm) diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 09c2d442e8..18568b3d0f 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -364,12 +364,9 @@ to_chat(toggle_action.owner, "You activate the self-repair module.") activate_sr() -/obj/item/borg/upgrade/selfrepair/update_icon() +/obj/item/borg/upgrade/selfrepair/update_icon_state() if(toggle_action) icon_state = "selfrepair_[on ? "on" : "off"]" - for(var/X in actions) - var/datum/action/A = X - A.UpdateButtonIcon() else icon_state = "cyborg_upgrade5" diff --git a/code/game/objects/items/singularityhammer.dm b/code/game/objects/items/singularityhammer.dm index 86f0ad4936..4c64ed9dd4 100644 --- a/code/game/objects/items/singularityhammer.dm +++ b/code/game/objects/items/singularityhammer.dm @@ -31,7 +31,7 @@ charged++ return -/obj/item/twohanded/singularityhammer/update_icon() //Currently only here to fuck with the on-mob icons. +/obj/item/twohanded/singularityhammer/update_icon_state() //Currently only here to fuck with the on-mob icons. icon_state = "mjollnir[wielded]" return @@ -110,6 +110,6 @@ if(isliving(hit_atom)) shock(hit_atom) -/obj/item/twohanded/mjollnir/update_icon() //Currently only here to fuck with the on-mob icons. +/obj/item/twohanded/mjollnir/update_icon_state() //Currently only here to fuck with the on-mob icons. icon_state = "mjollnir[wielded]" return diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index fb5adea3b0..e919f3fe02 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -35,9 +35,9 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ . = ..() . += GLOB.rod_recipes -/obj/item/stack/rods/update_icon() +/obj/item/stack/rods/update_icon_state() var/amount = get_amount() - if((amount <= 5) && (amount > 0)) + if(amount <= 5) icon_state = "rods-[amount]" else icon_state = "rods" @@ -77,8 +77,9 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ is_cyborg = 1 cost = 250 -/obj/item/stack/rods/cyborg/update_icon() - return +/obj/item/stack/rods/cyborg/ComponentInitialize() + . = ..() + AddElement(/datum/element/update_icon_blocker) /obj/item/stack/rods/ten amount = 10 diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 131980e43a..f07b9bfd33 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -77,16 +77,15 @@ else w_class = full_w_class -/obj/item/stack/update_icon() +/obj/item/stack/update_icon_state() if(novariants) - return ..() + return if(amount <= (max_amount * (1/3))) icon_state = initial(icon_state) else if (amount <= (max_amount * (2/3))) icon_state = "[initial(icon_state)]_2" else icon_state = "[initial(icon_state)]_3" - ..() /obj/item/stack/Destroy() diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm index 643e426c9d..b2fbbc8117 100644 --- a/code/game/objects/items/storage/bags.dm +++ b/code/game/objects/items/storage/bags.dm @@ -57,14 +57,16 @@ playsound(loc, 'sound/items/eatfood.ogg', 50, 1, -1) return (TOXLOSS) -/obj/item/storage/bag/trash/update_icon() - if(contents.len == 0) - icon_state = "[initial(icon_state)]" - else if(contents.len < 12) - icon_state = "[initial(icon_state)]1" - else if(contents.len < 21) - icon_state = "[initial(icon_state)]2" - else icon_state = "[initial(icon_state)]3" +/obj/item/storage/bag/trash/update_icon_state() + switch(contents.len) + if(0) + icon_state = "[initial(icon_state)]" + if(0 to 11) + icon_state = "[initial(icon_state)]1" + if(11 to 20) + icon_state = "[initial(icon_state)]2" + else + icon_state = "[initial(icon_state)]3" /obj/item/storage/bag/trash/cyborg insertable = FALSE @@ -354,10 +356,13 @@ M.Knockdown(40) update_icon() -/obj/item/storage/bag/tray/update_icon() - cut_overlays() +/obj/item/storage/bag/tray/update_overlays() + . = ..() for(var/obj/item/I in contents) - add_overlay(new /mutable_appearance(I)) + var/mutable_appearance/I_copy = new(I) + I_copy.plane = FLOAT_PLANE + I_copy.layer = FLOAT_LAYER + . += I_copy /obj/item/storage/bag/tray/Entered() . = ..() diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 829c89be0e..4e03d029a8 100755 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -10,23 +10,21 @@ attack_verb = list("whipped", "lashed", "disciplined") max_integrity = 300 var/content_overlays = FALSE //If this is true, the belt will gain overlays based on what it's holding - var/worn_overlays = FALSE //worn counterpart of the above. + var/onmob_overlays = FALSE //worn counterpart of the above. /obj/item/storage/belt/suicide_act(mob/living/carbon/user) user.visible_message("[user] begins belting [user.p_them()]self with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!") return BRUTELOSS -/obj/item/storage/belt/update_icon() - cut_overlays() +/obj/item/storage/belt/update_overlays() + . = ..() if(content_overlays) for(var/obj/item/I in contents) - var/mutable_appearance/M = I.get_belt_overlay() - add_overlay(M) - ..() + . += I.get_belt_overlay() /obj/item/storage/belt/worn_overlays(isinhands, icon_file, style_flags = NONE) . = ..() - if(!isinhands && worn_overlays) + if(!isinhands && onmob_overlays) for(var/obj/item/I in contents) . += I.get_worn_belt_overlay(icon_file) @@ -34,6 +32,11 @@ . = ..() update_icon() +/obj/item/storage/belt/ComponentInitialize() + . = ..() + if(onmob_overlays) + AddElement(/datum/element/update_icon_updates_onmob) + /obj/item/storage/belt/utility name = "toolbelt" //Carn: utility belt is nicer, but it bamboozles the text parsing. desc = "Holds tools." @@ -769,7 +772,7 @@ item_state = "sheath" w_class = WEIGHT_CLASS_BULKY content_overlays = TRUE - worn_overlays = TRUE + onmob_overlays = TRUE var/list/fitting_swords = list(/obj/item/melee/sabre, /obj/item/melee/baton/stunsword) var/starting_sword = /obj/item/melee/sabre @@ -787,12 +790,6 @@ if(length(contents)) . += "Alt-click it to quickly draw the blade." -/obj/item/storage/belt/sabre/update_icon() - . = ..() - if(isliving(loc)) - var/mob/living/L = loc - L.regenerate_icons() - /obj/item/storage/belt/sabre/PopulateContents() new starting_sword(src) diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index c4e6c57318..01a4f03108 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -50,11 +50,10 @@ user.visible_message("[user] beating [user.p_them()]self with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!") return BRUTELOSS -/obj/item/storage/box/update_icon() +/obj/item/storage/box/update_overlays() . = ..() if(illustration) - cut_overlays() - add_overlay(illustration) + . += illustration /obj/item/storage/box/attack_self(mob/user) ..() @@ -866,10 +865,11 @@ foldable = null var/design = NODESIGN -/obj/item/storage/box/papersack/update_icon() +/obj/item/storage/box/papersack/update_icon_state() if(contents.len == 0) icon_state = "[item_state]" - else icon_state = "[item_state]_closed" + else + icon_state = "[item_state]_closed" /obj/item/storage/box/papersack/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/pen)) diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm index 92e09022b2..b4fe6b8f85 100644 --- a/code/game/objects/items/storage/fancy.dm +++ b/code/game/objects/items/storage/fancy.dm @@ -30,7 +30,7 @@ for(var/i = 1 to STR.max_items) new spawn_type(src) -/obj/item/storage/fancy/update_icon() +/obj/item/storage/fancy/update_icon_state() if(fancy_open) icon_state = "[icon_type]box[contents.len]" else @@ -160,30 +160,31 @@ to_chat(user, "There are no [icon_type]s left in the pack.") return TRUE -/obj/item/storage/fancy/cigarettes/update_icon() - if(fancy_open || !contents.len) - cut_overlays() - if(!contents.len) - icon_state = "[initial(icon_state)]_empty" +/obj/item/storage/fancy/cigarettes/update_icon_state() + if(!contents.len) + icon_state = "[initial(icon_state)]_empty" + else if(fancy_open) + icon_state = initial(icon_state) + +/obj/item/storage/fancy/cigarettes/update_overlays() + . = ..() + if(!fancy_open || !contents.len) + return + . *= "[icon_state]_open" + var/cig_position = 1 + for(var/C in contents) + var/mutable_appearance/inserted_overlay = mutable_appearance(icon) + + if(istype(C, /obj/item/lighter/greyscale)) + inserted_overlay.icon_state = "lighter_in" + else if(istype(C, /obj/item/lighter)) + inserted_overlay.icon_state = "zippo_in" else - icon_state = initial(icon_state) - add_overlay("[icon_state]_open") - var/cig_position = 1 - for(var/C in contents) - var/mutable_appearance/inserted_overlay = mutable_appearance(icon) + inserted_overlay.icon_state = "cigarette" - if(istype(C, /obj/item/lighter/greyscale)) - inserted_overlay.icon_state = "lighter_in" - else if(istype(C, /obj/item/lighter)) - inserted_overlay.icon_state = "zippo_in" - else - inserted_overlay.icon_state = "cigarette" - - inserted_overlay.icon_state = "[inserted_overlay.icon_state]_[cig_position]" - add_overlay(inserted_overlay) - cig_position++ - else - cut_overlays() + inserted_overlay.icon_state = "[inserted_overlay.icon_state]_[cig_position]" + . += inserted_overlay + cig_position++ /obj/item/storage/fancy/cigarettes/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) if(!ismob(M)) @@ -282,10 +283,10 @@ STR.max_items = 10 STR.can_hold = typecacheof(list(/obj/item/rollingpaper)) -/obj/item/storage/fancy/rollingpapers/update_icon() - cut_overlays() +/obj/item/storage/fancy/rollingpapers/update_overlays() + . = ..() if(!contents.len) - add_overlay("[icon_state]_empty") + . += "[icon_state]_empty" ///////////// //CIGAR BOX// @@ -306,21 +307,23 @@ STR.max_items = 5 STR.can_hold = typecacheof(list(/obj/item/clothing/mask/cigarette/cigar)) -/obj/item/storage/fancy/cigarettes/cigars/update_icon() - cut_overlays() +/obj/item/storage/fancy/cigarettes/cigars/update_icon_state() if(fancy_open) icon_state = "[initial(icon_state)]_open" - - var/cigar_position = 0 //to keep track of the pixel_x offset of each new overlay. - for(var/obj/item/clothing/mask/cigarette/cigar/smokes in contents) - var/mutable_appearance/cigar_overlay = mutable_appearance(icon, "[smokes.icon_off]") - cigar_overlay.pixel_x = 3 * cigar_position - add_overlay(cigar_overlay) - cigar_position++ - else icon_state = "[initial(icon_state)]" +/obj/item/storage/fancy/cigarettes/cigars/update_overlays() + . = ..() + if(!fancy_open) + return + var/cigar_position = 0 //to keep track of the pixel_x offset of each new overlay. + for(var/obj/item/clothing/mask/cigarette/cigar/smokes in contents) + var/mutable_appearance/cigar_overlay = mutable_appearance(icon, "[smokes.icon_off]") + cigar_overlay.pixel_x = 3 * cigar_position + . += cigar_overlay + cigar_position++ + /obj/item/storage/fancy/cigarettes/cigars/cohiba name = "\improper Cohiba Robusto cigar case" desc = "A case of imported Cohiba cigars, renowned for their strong flavor." @@ -382,4 +385,4 @@ icon_state = "silver ringbox" icon_type = "silver ring" spawn_type = /obj/item/clothing/gloves/ring/silver - + diff --git a/code/game/objects/items/storage/lockbox.dm b/code/game/objects/items/storage/lockbox.dm index 454942f00b..5b6089d430 100644 --- a/code/game/objects/items/storage/lockbox.dm +++ b/code/game/objects/items/storage/lockbox.dm @@ -132,29 +132,34 @@ for(var/i in 1 to 3) new /obj/item/clothing/accessory/medal/conduct(src) -/obj/item/storage/lockbox/medal/update_icon() - cut_overlays() +/obj/item/storage/lockbox/medal/update_icon_state() var/locked = SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED) if(locked) icon_state = "medalbox+l" - open = FALSE else icon_state = "medalbox" if(open) icon_state += "open" if(broken) icon_state += "+b" - if(contents && open) - for (var/i in 1 to contents.len) - var/obj/item/clothing/accessory/medal/M = contents[i] - var/mutable_appearance/medalicon = mutable_appearance(initial(icon), M.medaltype) - if(i > 1 && i <= 5) - medalicon.pixel_x += ((i-1)*3) - else if(i > 5) - medalicon.pixel_y -= 7 - medalicon.pixel_x -= 2 - medalicon.pixel_x += ((i-6)*3) - add_overlay(medalicon) + +/obj/item/storage/lockbox/medal/update_overlays() + . = ..() + if(!contents || !open) + return + var/locked = SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED) + if(locked) + return + for (var/i in 1 to contents.len) + var/obj/item/clothing/accessory/medal/M = contents[i] + var/mutable_appearance/medalicon = mutable_appearance(initial(icon), M.medaltype) + if(i > 1 && i <= 5) + medalicon.pixel_x += ((i-1)*3) + else if(i > 5) + medalicon.pixel_y -= 7 + medalicon.pixel_x -= 2 + medalicon.pixel_x += ((i-6)*3) + . += medalicon /obj/item/storage/lockbox/medal/sec name = "security medal box" diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm index f1db164b31..4f7948c738 100644 --- a/code/game/objects/items/storage/toolbox.dm +++ b/code/game/objects/items/storage/toolbox.dm @@ -33,14 +33,11 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons) . = ..() update_icon() -/obj/item/storage/toolbox/update_icon() - ..() - cut_overlays() - if(length(blood_DNA)) - add_blood_overlay() +/obj/item/storage/toolbox/update_overlays() + . = ..() if(has_latches) var/icon/I = icon('icons/obj/storage.dmi', latches) - add_overlay(I) + . += I /obj/item/storage/toolbox/suicide_act(mob/user) diff --git a/code/game/objects/items/storage/wallets.dm b/code/game/objects/items/storage/wallets.dm index 2dbe42c159..27cd9c8908 100644 --- a/code/game/objects/items/storage/wallets.dm +++ b/code/game/objects/items/storage/wallets.dm @@ -66,7 +66,7 @@ . = ..() refreshID() -/obj/item/storage/wallet/update_icon() +/obj/item/storage/wallet/update_icon_state() var/new_state = "wallet" if(front_id) new_state = "wallet_id" diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm index 52f082fa5c..c48122fb0e 100644 --- a/code/game/objects/items/stunbaton.dm +++ b/code/game/objects/items/stunbaton.dm @@ -84,7 +84,7 @@ /obj/item/melee/baton/process() deductcharge(round(hitcost * STUNBATON_DEPLETION_RATE), FALSE, FALSE) -/obj/item/melee/baton/update_icon() +/obj/item/melee/baton/update_icon_state() if(status) icon_state = "[initial(name)]_active" else if(!cell) @@ -195,7 +195,7 @@ L.adjustStaminaLoss(stunpwr) else L.drop_all_held_items() //no knockdown/stamina damage, instead disarm. - + L.apply_effect(EFFECT_STUTTER, stamforce) SEND_SIGNAL(L, COMSIG_LIVING_MINOR_SHOCK) if(user) diff --git a/code/game/objects/items/theft_tools.dm b/code/game/objects/items/theft_tools.dm index 9b9fae7c8f..6fbf9316ed 100644 --- a/code/game/objects/items/theft_tools.dm +++ b/code/game/objects/items/theft_tools.dm @@ -246,7 +246,7 @@ QDEL_NULL(sliver) return ..() -/obj/item/hemostat/supermatter/update_icon() +/obj/item/hemostat/supermatter/update_icon_state() if(sliver) icon_state = "supermatter_tongs_loaded" else diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm index a36314ccb7..0d2892cb4a 100644 --- a/code/game/objects/items/tools/screwdriver.dm +++ b/code/game/objects/items/tools/screwdriver.dm @@ -45,13 +45,13 @@ if(prob(75)) pixel_y = rand(0, 16) -/obj/item/screwdriver/update_icon() +/obj/item/screwdriver/update_overlays() + . = ..() if(!random_color) //icon override return - cut_overlays() var/mutable_appearance/base_overlay = mutable_appearance(icon, "screwdriver_screwybits") base_overlay.appearance_flags = RESET_COLOR - add_overlay(base_overlay) + . += base_overlay /obj/item/screwdriver/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE) . = list() diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index b172cc25dd..9560f7fab3 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -40,24 +40,24 @@ reagents.add_reagent(/datum/reagent/fuel, max_fuel) update_icon() +/obj/item/weldingtool/ComponentInitialize() + . = ..() + AddElement(/datum/element/update_icon_updates_onmob) -/obj/item/weldingtool/proc/update_torch() +/obj/item/weldingtool/update_icon_state() if(welding) - add_overlay("[initial(icon_state)]-on") item_state = "[initial(item_state)]1" else item_state = "[initial(item_state)]" - -/obj/item/weldingtool/update_icon() - cut_overlays() +/obj/item/weldingtool/update_overlays() + . = ..() if(change_icons) var/ratio = get_fuel() / max_fuel ratio = CEILING(ratio*4, 1) * 25 - add_overlay("[initial(icon_state)][ratio]") - update_torch() - return - + . += "[initial(icon_state)][ratio]" + if(welding) + . += "[initial(icon_state)]-on" /obj/item/weldingtool/process() switch(welding) @@ -177,11 +177,6 @@ if(get_fuel() <= 0 && welding) switched_on(user) update_icon() - //mob icon update - if(ismob(loc)) - var/mob/M = loc - M.update_inv_hands(0) - return 0 return 1 diff --git a/code/game/objects/items/tools/wirecutters.dm b/code/game/objects/items/tools/wirecutters.dm index 37d8fe8824..ac5a02b9fc 100644 --- a/code/game/objects/items/tools/wirecutters.dm +++ b/code/game/objects/items/tools/wirecutters.dm @@ -40,13 +40,13 @@ add_atom_colour(wirecutter_colors[our_color], FIXED_COLOUR_PRIORITY) update_icon() -/obj/item/wirecutters/update_icon() +/obj/item/wirecutters/update_overlays() + . = ..() if(!random_color) //icon override return - cut_overlays() var/mutable_appearance/base_overlay = mutable_appearance(icon, "cutters_cutty_thingy") base_overlay.appearance_flags = RESET_COLOR - add_overlay(base_overlay) + . += base_overlay /obj/item/wirecutters/attack(mob/living/carbon/C, mob/user) if(istype(C) && C.handcuffed && istype(C.handcuffed, /obj/item/restraints/handcuffs/cable)) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index fd897174cf..1a5f97c4e0 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -44,9 +44,13 @@ item_state = "balloon-empty" -/obj/item/toy/balloon/New() +/obj/item/toy/balloon/Initialize() + . = ..() create_reagents(10) - ..() + +/obj/item/toy/balloon/ComponentInitialize() + . = ..() + AddElement(/datum/element/update_icon_updates_onmob) /obj/item/toy/balloon/attack(mob/living/carbon/human/M, mob/user) return @@ -102,7 +106,7 @@ icon_state = "burst" qdel(src) -/obj/item/toy/balloon/update_icon() +/obj/item/toy/balloon/update_icon_state() if(src.reagents.total_volume >= 1) icon_state = "waterballoon" item_state = "balloon" @@ -200,8 +204,8 @@ custom_materials = list(/datum/material/iron=10, /datum/material/glass=10) var/amount_left = 7 -/obj/item/toy/ammo/gun/update_icon() - src.icon_state = text("357OLD-[]", src.amount_left) +/obj/item/toy/ammo/gun/update_icon_state() + icon_state = "357OLD-[amount_left]" /obj/item/toy/ammo/gun/examine(mob/user) . = ..() @@ -319,7 +323,8 @@ add_fingerprint(user) -/obj/item/toy/sword/cx/update_icon() +/obj/item/toy/sword/cx/update_overlays() + . = ..() var/mutable_appearance/blade_overlay = mutable_appearance(icon, "cxsword_blade") var/mutable_appearance/gem_overlay = mutable_appearance(icon, "cxsword_gem") @@ -327,15 +332,10 @@ blade_overlay.color = light_color gem_overlay.color = light_color - cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other - - add_overlay(gem_overlay) + . += gem_overlay if(active) - add_overlay(blade_overlay) - if(ismob(loc)) - var/mob/M = loc - M.update_inv_hands() + . += blade_overlay /obj/item/toy/sword/cx/AltClick(mob/living/user) . = ..() @@ -843,15 +843,16 @@ user.visible_message("[user] draws a card from the deck.", "You draw a card from the deck.") update_icon() -/obj/item/toy/cards/deck/update_icon() - if(cards.len > 26) - icon_state = "deck_[deckstyle]_full" - else if(cards.len > 10) - icon_state = "deck_[deckstyle]_half" - else if(cards.len > 0) - icon_state = "deck_[deckstyle]_low" - else if(cards.len == 0) - icon_state = "deck_[deckstyle]_empty" +/obj/item/toy/cards/deck/update_icon_state() + switch(cards.len) + if(27 to INFINITY) + icon_state = "deck_[deckstyle]_full" + if(11 to 27) + icon_state = "deck_[deckstyle]_half" + if(1 to 11) + icon_state = "deck_[deckstyle]_low" + else + icon_state = "deck_[deckstyle]_empty" /obj/item/toy/cards/deck/attack_self(mob/user) if(cooldown < world.time - 50) diff --git a/code/game/objects/items/twohanded.dm b/code/game/objects/items/twohanded.dm index 06b81a424d..2b1bb1f5d0 100644 --- a/code/game/objects/items/twohanded.dm +++ b/code/game/objects/items/twohanded.dm @@ -97,9 +97,6 @@ return unwield(user) -/obj/item/twohanded/update_icon() - return - /obj/item/twohanded/attack_self(mob/user) . = ..() if(wielded) //Trying to unwield it @@ -241,7 +238,7 @@ . = ..() AddComponent(/datum/component/butchering, 100, 80, 0 , hitsound) //axes are not known for being precision butchering tools -/obj/item/twohanded/fireaxe/update_icon() //Currently only here to fuck with the on-mob icons. +/obj/item/twohanded/fireaxe/update_icon_state() //Currently only here to fuck with the on-mob icons. icon_state = "fireaxe[wielded]" return @@ -342,7 +339,7 @@ STOP_PROCESSING(SSobj, src) . = ..() -/obj/item/twohanded/dualsaber/update_icon() +/obj/item/twohanded/dualsaber/update_icon_state() if(wielded) icon_state = "dualsaber[item_color][wielded]" else @@ -492,23 +489,9 @@ spinnable = FALSE total_mass_on = 4 -/obj/item/twohanded/dualsaber/hypereutactic/chaplain - name = "\improper divine lightblade" - desc = "A giant blade of bright and holy light, said to cut down the wicked with ease." - force = 5 - force_unwielded = 5 - force_wielded = 20 - block_chance = 50 - armour_penetration = 0 - var/chaplain_spawnable = TRUE - obj_flags = UNIQUE_RENAME - -/obj/item/twohanded/dualsaber/hypereutactic/chaplain/Initialize() +/obj/item/twohanded/dualsaber/hypereutactic/ComponentInitialize() . = ..() - AddComponent(/datum/component/anti_magic, TRUE, TRUE, FALSE, null, null, FALSE) - -/obj/item/twohanded/dualsaber/hypereutactic/chaplain/IsReflect() - return FALSE + AddElement(/datum/element/update_icon_updates_onmob) /obj/item/twohanded/dualsaber/hypereutactic/alt_pre_attack(atom/A, mob/living/user, params) //checks if it can do right click memes altafterattack(A, user, TRUE, params) @@ -519,7 +502,11 @@ user.visible_message("[user] points the tip of [src] at [target].", "You point the tip of [src] at [target].") return TRUE -/obj/item/twohanded/dualsaber/hypereutactic/update_icon() +/obj/item/twohanded/dualsaber/hypereutactic/update_icon_state() + return + +/obj/item/twohanded/dualsaber/hypereutactic/update_overlays() + . = ..() var/mutable_appearance/blade_overlay = mutable_appearance(icon, "hypereutactic_blade") var/mutable_appearance/gem_overlay = mutable_appearance(icon, "hypereutactic_gem") @@ -527,15 +514,10 @@ blade_overlay.color = light_color gem_overlay.color = light_color - cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other - - add_overlay(gem_overlay) + . += gem_overlay if(wielded) - add_overlay(blade_overlay) - if(ismob(loc)) - var/mob/M = loc - M.update_inv_hands() + . += blade_overlay clean_blood() @@ -576,6 +558,24 @@ update_icon() update_light() +/obj/item/twohanded/dualsaber/hypereutactic/chaplain + name = "divine lightblade" + desc = "A giant blade of bright and holy light, said to cut down the wicked with ease." + force = 5 + force_unwielded = 5 + force_wielded = 20 + block_chance = 50 + armour_penetration = 0 + var/chaplain_spawnable = TRUE + obj_flags = UNIQUE_RENAME + +/obj/item/twohanded/dualsaber/hypereutactic/chaplain/ComponentInitialize() + . = ..() + AddComponent(/datum/component/anti_magic, TRUE, TRUE, FALSE, null, null, FALSE) + +/obj/item/twohanded/dualsaber/hypereutactic/chaplain/IsReflect() + return FALSE + //spears /obj/item/twohanded/spear icon_state = "spearglass0" @@ -639,7 +639,7 @@ if(explosive) . += "Use in your hands to activate the attached explosive.
Alt-click to set your war cry.
Right-click in combat mode to wield" -/obj/item/twohanded/spear/update_icon() +/obj/item/twohanded/spear/update_icon_state() if(explosive) icon_state = "spearbomb[wielded]" else @@ -717,9 +717,10 @@ tool_behaviour = TOOL_SAW toolspeed = 0.5 -/obj/item/twohanded/required/chainsaw/Initialize() +/obj/item/twohanded/required/chainsaw/ComponentInitialize() . = ..() AddComponent(/datum/component/butchering, 30, 100, 0, 'sound/weapons/chainsawhit.ogg', TRUE) + AddElement(/datum/element/update_icon_updates_onmob) /obj/item/twohanded/required/chainsaw/suicide_act(mob/living/carbon/user) if(on) @@ -738,7 +739,7 @@ to_chat(user, "As you pull the starting cord dangling from [src], [on ? "it begins to whirr." : "the chain stops moving."]") force = on ? force_on : initial(force) throwforce = on ? force_on : force - icon_state = "chainsaw_[on ? "on" : "off"]" + update_icon() var/datum/component/butchering/butchering = src.GetComponent(/datum/component/butchering) butchering.butchering_enabled = on @@ -747,11 +748,8 @@ else hitsound = "swing_hit" - if(src == user.get_active_held_item()) //update inhands - user.update_inv_hands() - for(var/X in actions) - var/datum/action/A = X - A.UpdateButtonIcon() +/obj/item/twohanded/required/chainsaw/update_icon_state() + icon_state = "chainsaw_[on ? "on" : "off"]" /obj/item/twohanded/required/chainsaw/get_dismemberment_chance() if(wielded) @@ -844,7 +842,7 @@ force_unwielded = 100 force_wielded = 500000 // Kills you DEAD. -/obj/item/twohanded/pitchfork/update_icon() +/obj/item/twohanded/pitchfork/update_icon_state() icon_state = "pitchfork[wielded]" /obj/item/twohanded/pitchfork/suicide_act(mob/user) @@ -918,7 +916,7 @@ return 1 return 0 -/obj/item/twohanded/vibro_weapon/update_icon() +/obj/item/twohanded/vibro_weapon/update_icon_state() icon_state = "hfrequency[wielded]" /* @@ -930,7 +928,7 @@ desc = "A large, vicious axe crafted out of several sharpened bone plates and crudely tied together. Made of monsters, by killing monsters, for killing monsters." force_wielded = 23 -/obj/item/twohanded/fireaxe/boneaxe/update_icon() +/obj/item/twohanded/fireaxe/boneaxe/update_icon_state() icon_state = "bone_axe[wielded]" /* @@ -956,7 +954,7 @@ attack_verb = list("attacked", "poked", "jabbed", "torn", "gored") sharpness = IS_SHARP -/obj/item/twohanded/bonespear/update_icon() +/obj/item/twohanded/bonespear/update_icon_state() icon_state = "bone_spear[wielded]" /obj/item/twohanded/binoculars @@ -1120,7 +1118,7 @@ turn_off(user) add_fingerprint(user) -/obj/item/twohanded/electrostaff/update_icon() +/obj/item/twohanded/electrostaff/update_icon_state() . = ..() if(!wielded) icon_state = "electrostaff_3" diff --git a/code/modules/NTNet/relays.dm b/code/modules/NTNet/relays.dm index 373f6451b9..0d855f15bb 100644 --- a/code/modules/NTNet/relays.dm +++ b/code/modules/NTNet/relays.dm @@ -35,7 +35,7 @@ return FALSE return TRUE -/obj/machinery/ntnet_relay/update_icon() +/obj/machinery/ntnet_relay/update_icon_state() if(is_operational()) icon_state = "bus" else diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm index 0d815703c5..c6c29a385b 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm @@ -178,23 +178,22 @@ else return NUKE_OFF_UNLOCKED -/obj/machinery/nuclearbomb/update_icon() - if(deconstruction_state == NUKESTATE_INTACT) - switch(get_nuke_state()) - if(NUKE_OFF_LOCKED, NUKE_OFF_UNLOCKED) - icon_state = "nuclearbomb_base" - update_icon_interior() - update_icon_lights() - if(NUKE_ON_TIMING) - cut_overlays() - icon_state = "nuclearbomb_timing" - if(NUKE_ON_EXPLODING) - cut_overlays() - icon_state = "nuclearbomb_exploding" - else +/obj/machinery/nuclearbomb/update_icon_state() + if(deconstruction_state != NUKESTATE_INTACT) icon_state = "nuclearbomb_base" - update_icon_interior() - update_icon_lights() + return + switch(get_nuke_state()) + if(NUKE_OFF_LOCKED, NUKE_OFF_UNLOCKED) + icon_state = "nuclearbomb_base" + if(NUKE_ON_TIMING) + icon_state = "nuclearbomb_timing" + if(NUKE_ON_EXPLODING) + icon_state = "nuclearbomb_exploding" + +/obj/machinery/nuclearbomb/update_overlays() + . = ..() + update_icon_interior() + update_icon_lights() /obj/machinery/nuclearbomb/proc/update_icon_interior() cut_overlay(interior) diff --git a/code/modules/newscaster/newscaster_machine.dm b/code/modules/newscaster/newscaster_machine.dm index 46dc52e286..38230840ec 100644 --- a/code/modules/newscaster/newscaster_machine.dm +++ b/code/modules/newscaster/newscaster_machine.dm @@ -54,7 +54,6 @@ GLOBAL_LIST_EMPTY(allCasters) return ..() /obj/machinery/newscaster/update_icon() - cut_overlays() if(stat & (NOPOWER|BROKEN)) icon_state = "newscaster_off" else @@ -62,19 +61,23 @@ GLOBAL_LIST_EMPTY(allCasters) icon_state = "newscaster_wanted" else icon_state = "newscaster_normal" - if(alert) - add_overlay("newscaster_alert") + +/obj/machinery/newscaster/update_overlays() + . = ..() + + if(!(stat & (NOPOWER|BROKEN)) && !GLOB.news_network.wanted_issue.active && alert) + . += "newscaster_alert" + var/hp_percent = obj_integrity * 100 /max_integrity switch(hp_percent) if(75 to 100) return if(50 to 75) - add_overlay("crack1") + . += "crack1" if(25 to 50) - add_overlay("crack2") + . += "crack2" else - add_overlay("crack3") - + . += "crack3" /obj/machinery/newscaster/power_change() if(stat & BROKEN) diff --git a/code/modules/projectiles/projectile/special/curse.dm b/code/modules/projectiles/projectile/special/curse.dm index 062623689b..99aa922622 100644 --- a/code/modules/projectiles/projectile/special/curse.dm +++ b/code/modules/projectiles/projectile/special/curse.dm @@ -21,6 +21,9 @@ handedness = prob(50) icon_state = "cursehand[handedness]" +/obj/item/projectile/curse_hand/update_icon_state() + icon_state = "[initial(icon_state)][handedness]" + /obj/item/projectile/curse_hand/fire(setAngle) if(starting) arm = starting.Beam(src, icon_state = "curse[handedness]", time = INFINITY, maxdistance = INFINITY, beam_type=/obj/effect/ebeam/curse_arm) @@ -40,7 +43,8 @@ if(CHECK_BITFIELD(movement_type, UNSTOPPABLE)) playsound(src, 'sound/effects/curse3.ogg', 25, 1, -1) var/turf/T = get_step(src, dir) - new/obj/effect/temp_visual/dir_setting/curse/hand(T, dir, handedness) + var/obj/effect/temp_visual/dir_setting/curse/hand/leftover = new(T, dir) + leftover.icon_state = icon_state for(var/obj/effect/temp_visual/dir_setting/curse/grasp_portal/G in starting) qdel(G) new /obj/effect/temp_visual/dir_setting/curse/grasp_portal/fading(starting, dir) diff --git a/tgstation.dme b/tgstation.dme index 9ecf1ddd5e..6fe8ead35b 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -502,6 +502,8 @@ #include "code\datums\elements\ghost_role_eligibility.dm" #include "code\datums\elements\mob_holder.dm" #include "code\datums\elements\swimming.dm" +#include "code\datums\elements\update_icon_blocker.dm" +#include "code\datums\elements\update_icon_updates_onmob.dm" #include "code\datums\elements\wuv.dm" #include "code\datums\helper_datums\events.dm" #include "code\datums\helper_datums\getrev.dm"