diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm
index 0fe73bad6e..6ed126cf37 100644
--- a/code/_onclick/cyborg.dm
+++ b/code/_onclick/cyborg.dm
@@ -56,8 +56,7 @@
var/obj/item/W = get_active_held_item()
- // Cyborgs have no range-checking unless there is item use
- if(!W)
+ if(!W && get_dist(src,A) <= remote_range)
A.attack_robot(src)
return
@@ -106,38 +105,59 @@
/atom/proc/BorgCtrlShiftClick(mob/living/silicon/robot/user) //forward to human click if not overriden
CtrlShiftClick(user)
-/obj/machinery/door/airlock/BorgCtrlShiftClick() // Sets/Unsets Emergency Access Override Forwards to AI code.
- AICtrlShiftClick()
+/obj/machinery/door/airlock/BorgCtrlShiftClick(mob/living/silicon/robot/user) // Sets/Unsets Emergency Access Override Forwards to AI code.
+ if(get_dist(src,user) <= user.remote_range)
+ AICtrlShiftClick()
+ else
+ ..()
/atom/proc/BorgShiftClick(mob/living/silicon/robot/user) //forward to human click if not overriden
ShiftClick(user)
-/obj/machinery/door/airlock/BorgShiftClick() // Opens and closes doors! Forwards to AI code.
- AIShiftClick()
+/obj/machinery/door/airlock/BorgShiftClick(mob/living/silicon/robot/user) // Opens and closes doors! Forwards to AI code.
+ if(get_dist(src,user) <= user.remote_range)
+ AIShiftClick()
+ else
+ ..()
/atom/proc/BorgCtrlClick(mob/living/silicon/robot/user) //forward to human click if not overriden
CtrlClick(user)
-/obj/machinery/door/airlock/BorgCtrlClick() // Bolts doors. Forwards to AI code.
- AICtrlClick()
+/obj/machinery/door/airlock/BorgCtrlClick(mob/living/silicon/robot/user) // Bolts doors. Forwards to AI code.
+ if(get_dist(src,user) <= user.remote_range)
+ AICtrlClick()
+ else
+ ..()
-/obj/machinery/power/apc/BorgCtrlClick() // turns off/on APCs. Forwards to AI code.
- AICtrlClick()
+/obj/machinery/power/apc/BorgCtrlClick(mob/living/silicon/robot/user) // turns off/on APCs. Forwards to AI code.
+ if(get_dist(src,user) <= user.remote_range)
+ AICtrlClick()
+ else
+ ..()
-/obj/machinery/turretid/BorgCtrlClick() //turret control on/off. Forwards to AI code.
- AICtrlClick()
+/obj/machinery/turretid/BorgCtrlClick(mob/living/silicon/robot/user) //turret control on/off. Forwards to AI code.
+ if(get_dist(src,user) <= user.remote_range)
+ AICtrlClick()
+ else
+ ..()
/atom/proc/BorgAltClick(mob/living/silicon/robot/user)
AltClick(user)
return
-/obj/machinery/door/airlock/BorgAltClick() // Eletrifies doors. Forwards to AI code.
- AIAltClick()
+/obj/machinery/door/airlock/BorgAltClick(mob/living/silicon/robot/user) // Eletrifies doors. Forwards to AI code.
+ if(get_dist(src,user) <= user.remote_range)
+ AIAltClick()
+ else
+ ..()
-/obj/machinery/turretid/BorgAltClick() //turret lethal on/off. Forwards to AI code.
- AIAltClick()
+/obj/machinery/turretid/BorgAltClick(mob/living/silicon/robot/user) //turret lethal on/off. Forwards to AI code.
+ if(get_dist(src,user) <= user.remote_range)
+ AIAltClick()
+ else
+ ..()
/*
As with AI, these are not used in click code,
diff --git a/code/controllers/master.dm b/code/controllers/master.dm
index c71e34fce3..5ca7b15f72 100644
--- a/code/controllers/master.dm
+++ b/code/controllers/master.dm
@@ -124,7 +124,8 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
var/FireHim = FALSE
if(istype(BadBoy))
msg = null
- switch(++BadBoy.failure_strikes)
+ LAZYINITLIST(BadBoy.failure_strikes)
+ switch(++BadBoy.failure_strikes[BadBoy.type])
if(2)
msg = "The [BadBoy.name] subsystem was the last to fire for 2 controller restarts. It will be recovered now and disabled if it happens again."
FireHim = TRUE
diff --git a/code/controllers/subsystem.dm b/code/controllers/subsystem.dm
index 3024c24c15..eee6945c41 100644
--- a/code/controllers/subsystem.dm
+++ b/code/controllers/subsystem.dm
@@ -31,7 +31,7 @@
var/runlevels = RUNLEVELS_DEFAULT //points of the game at which the SS can fire
- var/static/failure_strikes = 0 //How many times we suspect this subsystem has crashed the MC, 3 strikes and you're out!
+ var/static/list/failure_strikes //How many times we suspect a subsystem type has crashed the MC, 3 strikes and you're out!
//Do not override
/datum/controller/subsystem/New()
diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm
index 67846d019d..55132cba28 100644
--- a/code/controllers/subsystem/garbage.dm
+++ b/code/controllers/subsystem/garbage.dm
@@ -234,33 +234,7 @@ SUBSYSTEM_DEF(garbage)
else if(D.gc_destroyed == GC_CURRENTLY_BEING_QDELETED)
CRASH("[D.type] destroy proc was called multiple times, likely due to a qdel loop in the Destroy logic")
-// Default implementation of clean-up code.
-// This should be overridden to remove all references pointing to the object being destroyed.
-// Return the appropriate QDEL_HINT; in most cases this is QDEL_HINT_QUEUE.
-// TODO: Move this and all datum var definitions into code/datums/datum.dm
-/datum/proc/Destroy(force=FALSE)
- tag = null
- var/list/timers = active_timers
- active_timers = null
- for(var/thing in timers)
- var/datum/timedevent/timer = thing
- if (timer.spent)
- continue
- qdel(timer)
- var/list/dc = datum_components
- for(var/I in dc)
- var/datum/component/C = I
- C._RemoveNoSignal()
- qdel(C)
- if(dc)
- dc.Cut()
- return QDEL_HINT_QUEUE
-
-/datum/var/gc_destroyed //Time when this object was destroyed.
-
#ifdef TESTING
-/datum/var/running_find_references
-/datum/var/last_find_references = 0
/datum/verb/find_refs()
set category = "Debug"
diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm
index 5696fa09e7..daf0eb324d 100644
--- a/code/controllers/subsystem/timer.dm
+++ b/code/controllers/subsystem/timer.dm
@@ -210,7 +210,6 @@ SUBSYSTEM_DEF(timer)
timer_id_dict |= SStimer.timer_id_dict
bucket_list |= SStimer.bucket_list
-/datum/var/list/active_timers
/datum/timedevent
var/id
var/datum/callback/callBack
diff --git a/code/datums/action.dm b/code/datums/action.dm
index a1048b86bf..d369b08f93 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -10,12 +10,13 @@
var/check_flags = 0
var/processing = FALSE
var/obj/screen/movable/action_button/button = null
- var/button_icon = 'icons/mob/actions.dmi'
- var/background_icon_state = ACTION_BUTTON_DEFAULT_BACKGROUND
var/buttontooltipstyle = ""
- var/icon_icon = 'icons/mob/actions.dmi'
- var/button_icon_state = "default"
+ var/button_icon = 'icons/mob/actions/backgrounds.dmi' //This is the file for the BACKGROUND icon
+ var/background_icon_state = ACTION_BUTTON_DEFAULT_BACKGROUND //And this is the state for the background icon
+
+ var/icon_icon = 'icons/mob/actions.dmi' //This is the file for the ACTION icon
+ var/button_icon_state = "default" //And this is the state for the action icon
var/mob/owner
/datum/action/New(Target)
@@ -225,6 +226,7 @@
/datum/action/item_action/toggle_unfriendly_fire
name = "Toggle Friendly Fire \[ON\]"
desc = "Toggles if the club's blasts cause friendly fire."
+ icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "vortex_ff_on"
/datum/action/item_action/toggle_unfriendly_fire/Trigger()
@@ -258,6 +260,7 @@
/datum/action/item_action/vortex_recall
name = "Vortex Recall"
desc = "Recall yourself, and anyone nearby, to an attuned hierophant beacon at any time.
If the beacon is still attached, will detach it."
+ icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "vortex_recall"
/datum/action/item_action/vortex_recall/IsAvailable()
@@ -268,6 +271,7 @@
return ..()
/datum/action/item_action/clock
+ icon_icon = 'icons/mob/actions/actions_clockcult.dmi'
background_icon_state = "bg_clock"
buttontooltipstyle = "clockcult"
@@ -367,6 +371,7 @@
/datum/action/item_action/toggle_research_scanner
name = "Toggle Research Scanner"
+ icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "scan_mode"
var/active = FALSE
@@ -403,6 +408,7 @@
/datum/action/item_action/ninjajaunt
name = "Phase Jaunt (10E)"
desc = "Utilizes the internal VOID-shift device to rapidly transit in direction facing."
+ icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "ninja_phase"
/datum/action/item_action/ninjasmoke
@@ -441,6 +447,7 @@
/datum/action/item_action/ninja_stealth
name = "Toggle Stealth"
desc = "Toggles stealth mode on and off."
+ icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "ninja_cloak"
/datum/action/item_action/toggle_glove
@@ -558,12 +565,14 @@
/datum/action/item_action/stickmen
name = "Summon Stick Minions"
desc = "Allows you to summon faithful stickmen allies to aide you in battle."
+ icon_icon = 'icons/mob/actions/actions_minor_antag.dmi'
button_icon_state = "art_summon"
//surf_ss13
/datum/action/item_action/bhop
name = "Activate Jump Boots"
desc = "Activates the jump boot's internal propulsion system, allowing the user to dash over 4-wide gaps."
+ icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "jetboot"
/datum/action/language_menu
diff --git a/code/datums/components/component.dm b/code/datums/components/component.dm
index 6af3039217..20e2a6e9ac 100644
--- a/code/datums/components/component.dm
+++ b/code/datums/components/component.dm
@@ -66,8 +66,6 @@
/datum/component/proc/OnTransfer(datum/new_parent)
return
-/datum/var/list/datum_components //list of /datum/component
-
/datum/proc/SendSignal(sigtype, ...)
var/list/comps = datum_components
. = FALSE
diff --git a/code/datums/datum.dm b/code/datums/datum.dm
new file mode 100644
index 0000000000..3bedbe87cf
--- /dev/null
+++ b/code/datums/datum.dm
@@ -0,0 +1,31 @@
+/datum
+ var/gc_destroyed //Time when this object was destroyed.
+ var/list/active_timers //for SStimer
+ var/list/datum_components //for /datum/components
+ var/ui_screen = "home" //for tgui
+
+#ifdef TESTING
+ var/running_find_references
+ var/last_find_references = 0
+#endif
+
+// Default implementation of clean-up code.
+// This should be overridden to remove all references pointing to the object being destroyed.
+// Return the appropriate QDEL_HINT; in most cases this is QDEL_HINT_QUEUE.
+/datum/proc/Destroy(force=FALSE)
+ tag = null
+ var/list/timers = active_timers
+ active_timers = null
+ for(var/thing in timers)
+ var/datum/timedevent/timer = thing
+ if (timer.spent)
+ continue
+ qdel(timer)
+ var/list/dc = datum_components
+ for(var/I in dc)
+ var/datum/component/C = I
+ C._RemoveNoSignal()
+ qdel(C)
+ if(dc)
+ dc.Cut()
+ return QDEL_HINT_QUEUE
\ No newline at end of file
diff --git a/code/datums/explosion.dm b/code/datums/explosion.dm
index c22829b5d3..5e381c0322 100644
--- a/code/datums/explosion.dm
+++ b/code/datums/explosion.dm
@@ -68,7 +68,7 @@ GLOBAL_LIST_EMPTY(explosions)
//I would make this not ex_act the thing that triggered the explosion,
//but everything that explodes gives us their loc or a get_turf()
//and somethings expect us to ex_act them so they can qdel()
- stoplag() //tldr, let the calling proc call qdel(src) before we explode
+ sleep(1) //tldr, let the calling proc call qdel(src) before we explode
EX_PREPROCESS_EXIT_CHECK
@@ -275,7 +275,7 @@ GLOBAL_LIST_EMPTY(explosions)
. = list()
var/processed = 0
- while(!stopped && running)
+ while(running)
var/I
for(I in (processed + 1) to affected_turfs.len) // we cache the explosion block rating of every turf in the explosion area
var/turf/T = affected_turfs[I]
diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm
index f6296bc0c9..806f48a24f 100644
--- a/code/datums/helper_datums/getrev.dm
+++ b/code/datums/helper_datums/getrev.dm
@@ -73,12 +73,14 @@
return ""
. = header ? "The following pull requests are currently test merged:
" : ""
for(var/line in testmerge)
- var/details
+ var/details
if(world.RunningService())
var/cm = testmerge[line]["commit"]
details = ": '" + html_encode(testmerge[line]["title"]) + "' by " + html_encode(testmerge[line]["author"]) + " at commit " + html_encode(copytext(cm, 1, min(length(cm), 7)))
else if(has_pr_details) //tgs2 support
details = ": '" + html_encode(testmerge[line]["title"]) + "' by " + html_encode(testmerge[line]["user"]["login"])
+ if(details && findtext(details, "\[s\]") && (!usr || !usr.client.holder))
+ continue
. += "#[line][details]
"
/client/verb/showrevinfo()
diff --git a/code/datums/holocall.dm b/code/datums/holocall.dm
index 4e7490f8ee..abad0dba1d 100644
--- a/code/datums/holocall.dm
+++ b/code/datums/holocall.dm
@@ -38,7 +38,7 @@
calling_pad.say("Connection failure.")
qdel(src)
return
-
+
testing("Holocall started")
//cleans up ALL references :)
@@ -49,16 +49,16 @@
if(user_good)
user.reset_perspective()
user.remote_control = null
-
+
if(!QDELETED(eye))
if(user_good && user.client)
for(var/datum/camerachunk/chunk in eye.visibleCameraChunks)
chunk.remove(eye)
qdel(eye)
eye = null
-
+
user = null
-
+
if(hologram)
hologram.HC = null
hologram = null
@@ -75,7 +75,7 @@
if(connected_holopad)
connected_holopad.SetLightsAndPower()
connected_holopad = null
-
+
testing("Holocall destroyed")
return ..()
@@ -123,7 +123,7 @@
if(I == H)
continue
Disconnect(I)
-
+
for(var/I in H.holo_calls)
var/datum/holocall/HC = I
if(HC != src)
@@ -155,7 +155,7 @@
var/obj/machinery/holopad/H = I
if(!H.is_operational())
ConnectionFailure(H)
-
+
if(QDELETED(src))
return FALSE
@@ -174,6 +174,7 @@
/datum/action/innate/end_holocall
name = "End Holocall"
+ icon_icon = 'icons/mob/actions/actions_silicon.dmi'
button_icon_state = "camera_off"
var/datum/holocall/hcall
diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm
index 94637f10e3..6ce082bd2a 100644
--- a/code/datums/martial/krav_maga.dm
+++ b/code/datums/martial/krav_maga.dm
@@ -6,6 +6,7 @@
/datum/action/neck_chop
name = "Neck Chop - Injures the neck, stopping the victim from speaking for a while."
+ icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "neckchop"
/datum/action/neck_chop/Trigger()
@@ -22,6 +23,7 @@
/datum/action/leg_sweep
name = "Leg Sweep - Trips the victim, knocking them down for a brief moment."
+ icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "legsweep"
/datum/action/leg_sweep/Trigger()
@@ -38,6 +40,7 @@
/datum/action/lung_punch//referred to internally as 'quick choke'
name = "Lung Punch - Delivers a strong punch just above the victim's abdomen, constraining the lungs. The victim will be unable to breathe for a short time."
+ icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "lungpunch"
/datum/action/lung_punch/Trigger()
diff --git a/code/game/gamemodes/changeling/cellular_emporium.dm b/code/game/gamemodes/changeling/cellular_emporium.dm
index 67d15c677c..aaba09c87c 100644
--- a/code/game/gamemodes/changeling/cellular_emporium.dm
+++ b/code/game/gamemodes/changeling/cellular_emporium.dm
@@ -68,7 +68,8 @@
/datum/action/innate/cellular_emporium
name = "Cellular Emporium"
- button_icon_state = "cellular_emporium"
+ icon_icon = 'icons/obj/drinks.dmi'
+ button_icon_state = "changelingsting"
background_icon_state = "bg_alien"
var/datum/cellular_emporium/cellular_emporium
diff --git a/code/game/gamemodes/cult/cult_comms.dm b/code/game/gamemodes/cult/cult_comms.dm
index f6dab6c9cc..a7fb90d253 100644
--- a/code/game/gamemodes/cult/cult_comms.dm
+++ b/code/game/gamemodes/cult/cult_comms.dm
@@ -2,6 +2,7 @@
#define MARK_COOLDOWN
/datum/action/innate/cult
+ icon_icon = 'icons/mob/actions/actions_cult.dmi'
background_icon_state = "bg_demon"
buttontooltipstyle = "cult"
check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUN|AB_CHECK_CONSCIOUS
@@ -305,6 +306,7 @@
/datum/action/innate/cult/master/pulse
name = "Eldritch Pulse"
desc = "Seize upon a fellow cultist or cult structure and teleport it to a nearby location."
+ icon_icon = 'icons/mob/actions/actions_spells.dmi'
button_icon_state = "arcane_barrage"
var/obj/effect/proc_holder/pulse/PM
var/cooldown = 0
diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm
index c5baed144e..8c8108962e 100644
--- a/code/game/gamemodes/malfunction/Malf_Modules.dm
+++ b/code/game/gamemodes/malfunction/Malf_Modules.dm
@@ -20,7 +20,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list(
name = "AI Action"
desc = "You aren't entirely sure what this does, but it's very beepy and boopy."
background_icon_state = "bg_tech_blue"
- icon_icon = 'icons/mob/actions_AI.dmi'
+ icon_icon = 'icons/mob/actions/actions_AI.dmi'
var/mob/living/silicon/ai/owner_AI //The owner AI, so we don't have to typecast every time
var/uses //If we have multiple uses of the same power
var/auto_use_uses = TRUE //If we automatically use up uses on each activation
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm
index 4e74d11be1..ffd1b88d25 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm
@@ -65,6 +65,7 @@
/datum/action/innate/teleport_in
name = "Send To"
+ icon_icon = 'icons/mob/actions/actions_minor_antag.dmi'
button_icon_state = "beam_down"
/datum/action/innate/teleport_in/Activate()
@@ -79,6 +80,7 @@
/datum/action/innate/teleport_out
name = "Retrieve"
+ icon_icon = 'icons/mob/actions/actions_minor_antag.dmi'
button_icon_state = "beam_up"
/datum/action/innate/teleport_out/Activate()
@@ -90,6 +92,7 @@
/datum/action/innate/teleport_self
name = "Send Self"
+ icon_icon = 'icons/mob/actions/actions_minor_antag.dmi'
button_icon_state = "beam_down"
/datum/action/innate/teleport_self/Activate()
@@ -104,6 +107,7 @@
/datum/action/innate/vest_mode_swap
name = "Switch Vest Mode"
+ icon_icon = 'icons/mob/actions/actions_minor_antag.dmi'
button_icon_state = "vest_mode"
/datum/action/innate/vest_mode_swap/Activate()
@@ -115,6 +119,7 @@
/datum/action/innate/vest_disguise_swap
name = "Switch Vest Disguise"
+ icon_icon = 'icons/mob/actions/actions_minor_antag.dmi'
button_icon_state = "vest_disguise"
/datum/action/innate/vest_disguise_swap/Activate()
@@ -125,6 +130,7 @@
/datum/action/innate/set_droppoint
name = "Set Experiment Release Point"
+ icon_icon = 'icons/mob/actions/actions_minor_antag.dmi'
button_icon_state = "set_drop"
/datum/action/innate/set_droppoint/Activate()
diff --git a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm
index 2bbe2cae5f..184564b024 100644
--- a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm
+++ b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm
@@ -85,6 +85,7 @@
charge_max = 0
panel = "Revenant Abilities"
message = "You toggle your night vision."
+ action_icon = 'icons/mob/actions/actions_revenant.dmi'
action_icon_state = "r_nightvision"
action_background_icon_state = "bg_revenant"
@@ -97,6 +98,7 @@
clothes_req = 0
range = 7
include_user = 0
+ action_icon = 'icons/mob/actions/actions_revenant.dmi'
action_icon_state = "r_transmit"
action_background_icon_state = "bg_revenant"
@@ -120,6 +122,7 @@
/obj/effect/proc_holder/spell/aoe_turf/revenant
clothes_req = 0
+ action_icon = 'icons/mob/actions/actions_revenant.dmi'
action_background_icon_state = "bg_revenant"
panel = "Revenant Abilities (Locked)"
name = "Report this to a coder"
diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm
index edce17b82a..3d5b8f026b 100644
--- a/code/game/machinery/computer/camera_advanced.dm
+++ b/code/game/machinery/computer/camera_advanced.dm
@@ -175,6 +175,7 @@
/datum/action/innate/camera_off
name = "End Camera View"
+ icon_icon = 'icons/mob/actions/actions_silicon.dmi'
button_icon_state = "camera_off"
/datum/action/innate/camera_off/Activate()
@@ -187,6 +188,7 @@
/datum/action/innate/camera_jump
name = "Jump To Camera"
+ icon_icon = 'icons/mob/actions/actions_silicon.dmi'
button_icon_state = "camera_jump"
/datum/action/innate/camera_jump/Activate()
diff --git a/code/game/mecha/mecha_actions.dm b/code/game/mecha/mecha_actions.dm
index df96c78e8c..050498d8f1 100644
--- a/code/game/mecha/mecha_actions.dm
+++ b/code/game/mecha/mecha_actions.dm
@@ -22,6 +22,7 @@
/datum/action/innate/mecha
check_flags = AB_CHECK_RESTRAINED | AB_CHECK_STUN | AB_CHECK_CONSCIOUS
+ icon_icon = 'icons/mob/actions/actions_mecha.dmi'
var/obj/mecha/chassis
/datum/action/innate/mecha/Grant(mob/living/L, obj/mecha/M)
diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm
index f7d396f9ee..e798a0c0ad 100644
--- a/code/modules/clothing/chameleon.dm
+++ b/code/modules/clothing/chameleon.dm
@@ -2,6 +2,7 @@
/datum/action/item_action/chameleon/drone/randomise
name = "Randomise Headgear"
+ icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "random"
/datum/action/item_action/chameleon/drone/randomise/Trigger()
@@ -21,6 +22,7 @@
/datum/action/item_action/chameleon/drone/togglehatmask
name = "Toggle Headgear Mode"
+ icon_icon = 'icons/mob/actions/actions_silicon.dmi'
/datum/action/item_action/chameleon/drone/togglehatmask/New()
..()
diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm
index 45b7ccb61f..23ea5bc5ff 100644
--- a/code/modules/clothing/spacesuits/chronosuit.dm
+++ b/code/modules/clothing/spacesuits/chronosuit.dm
@@ -320,6 +320,7 @@
/datum/action/innate/chrono_teleport
name = "Teleport Now"
+ icon_icon = 'icons/mob/actions/actions_minor_antag.dmi'
button_icon_state = "chrono_phase"
check_flags = AB_CHECK_CONSCIOUS //|AB_CHECK_INSIDE
var/obj/item/clothing/suit/space/chronos/chronosuit = null
diff --git a/code/modules/clothing/spacesuits/flightsuit.dm b/code/modules/clothing/spacesuits/flightsuit.dm
index c1c2733b71..9888be0494 100644
--- a/code/modules/clothing/spacesuits/flightsuit.dm
+++ b/code/modules/clothing/spacesuits/flightsuit.dm
@@ -1266,6 +1266,9 @@
//ITEM actionS------------------------------------------------------------------------------------------------------------------------------------------------------
//TODO: TOGGLED BUTTON SPRITES
+/datum/action/item_action/flightsuit
+ icon_icon = 'icons/mob/actions/actions_flightsuit.dmi'
+
/datum/action/item_action/flightsuit/toggle_boots
name = "Toggle Boots"
button_icon_state = "flightsuit_shoes"
@@ -1286,6 +1289,9 @@
button_icon_state = "flightsuit_lock"
background_icon_state = "bg_tech"
+/datum/action/item_action/flightpack
+ icon_icon = 'icons/mob/actions/actions_flightsuit.dmi'
+
/datum/action/item_action/flightpack/toggle_flight
name = "Toggle Flight"
button_icon_state = "flightpack_fly"
@@ -1313,5 +1319,7 @@
/datum/action/item_action/flightpack/zoom
name = "Helmet Smart Zoom"
+ icon_icon = 'icons/mob/actions.dmi'
background_icon_state = "bg_tech_blue"
+ icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "sniper_zoom"
diff --git a/code/modules/goonchat/browserOutput.dm b/code/modules/goonchat/browserOutput.dm
index 407c6c2846..7b236ea56f 100644
--- a/code/modules/goonchat/browserOutput.dm
+++ b/code/modules/goonchat/browserOutput.dm
@@ -180,21 +180,24 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic
/proc/bicon(thing)
if (!thing)
return
-
+ var/static/list/bicon_cache = list()
if (isicon(thing))
- //Icons get pooled constantly, references are no good here.
- /*if (!bicon_cache["\ref[obj]"]) // Doesn't exist yet, make it.
- bicon_cache["\ref[obj]"] = icon2base64(obj)
- return "
"*/
- return "
"
+ var/icon/I = thing
+ var/icon_md5 = md5(I)
+ if (!bicon_cache[icon_md5]) // Doesn't exist yet, make it.
+ I = icon(I) //copy it
+ I.Scale(16,16) //scale it
+ bicon_cache[icon_md5] = icon2base64(thing) //base64 it
+ return "
"
// Either an atom or somebody fucked up and is gonna get a runtime, which I'm fine with.
var/atom/A = thing
var/key = "[istype(A.icon, /icon) ? "\ref[A.icon]" : A.icon]:[A.icon_state]"
- var/static/list/bicon_cache = list()
+
if (!bicon_cache[key]) // Doesn't exist, make it.
var/icon/I = icon(A.icon, A.icon_state, SOUTH, 1)
+ I.Scale(16,16)
if (ishuman(thing)) // Shitty workaround for a BYOND issue.
var/icon/temp = I
I = icon()
diff --git a/code/modules/mining/aux_base_camera.dm b/code/modules/mining/aux_base_camera.dm
index d629be13ee..62702fc202 100644
--- a/code/modules/mining/aux_base_camera.dm
+++ b/code/modules/mining/aux_base_camera.dm
@@ -128,6 +128,7 @@
eyeobj.invisibility = INVISIBILITY_MAXIMUM //Hide the eye when not in use.
/datum/action/innate/aux_base //Parent aux base action
+ icon_icon = 'icons/mob/actions/actions_construction.dmi'
var/mob/living/C //Mob using the action
var/mob/camera/aiEye/remote/base_construction/remote_eye //Console's eye mob
var/obj/machinery/computer/camera_advanced/base_construction/B //Console itself
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 430ee65179..0c098256cb 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -680,7 +680,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
to_chat(src, "Data HUDs enabled.")
data_huds_on = 1
-/mob/dead/observer/verb/restore_ghost_apperance()
+/mob/dead/observer/verb/restore_ghost_appearance()
set name = "Restore Ghost Character"
set desc = "Sets your deadchat name and ghost appearance to your \
roundstart character."
diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
index 83971dac05..e6a5f58d69 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
@@ -13,7 +13,7 @@ Doesn't work on other aliens/AI.*/
var/check_turf = 0
var/has_action = 1
var/datum/action/spell_action/alien/action = null
- var/action_icon = 'icons/mob/actions.dmi'
+ var/action_icon = 'icons/mob/actions/actions_xeno.dmi'
var/action_icon_state = "spell_default"
var/action_background_icon_state = "bg_alien"
diff --git a/code/modules/mob/living/carbon/human/species_types/angel.dm b/code/modules/mob/living/carbon/human/species_types/angel.dm
index 7247509557..7c58ecbf86 100644
--- a/code/modules/mob/living/carbon/human/species_types/angel.dm
+++ b/code/modules/mob/living/carbon/human/species_types/angel.dm
@@ -66,6 +66,7 @@
/datum/action/innate/flight
name = "Toggle Flight"
check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_STUN
+ icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "flight"
/datum/action/innate/flight/Activate()
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index f31b339bf5..fd17f123b8 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -963,6 +963,7 @@
/datum/action/innate/deploy_shell
name = "Deploy to AI Shell"
desc = "Wirelessly control a specialized cyborg shell."
+ icon_icon = 'icons/mob/actions/actions_AI.dmi'
button_icon_state = "ai_shell"
/datum/action/innate/deploy_shell/Trigger()
@@ -974,6 +975,7 @@
/datum/action/innate/deploy_last_shell
name = "Reconnect to shell"
desc = "Reconnect to the most recently used AI shell."
+ icon_icon = 'icons/mob/actions/actions_AI.dmi'
button_icon_state = "ai_last_shell"
var/mob/living/silicon/robot/last_used_shell
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index e1aab0d1be..c6dd372532 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -161,6 +161,7 @@
/datum/action/innate/pai
name = "PAI Action"
+ icon_icon = 'icons/mob/actions/actions_silicon.dmi'
var/mob/living/silicon/pai/P
/datum/action/innate/pai/Trigger()
@@ -197,8 +198,10 @@
/datum/action/innate/pai/rest/Trigger()
..()
P.lay_down()
+
/datum/action/innate/pai/light
name = "Toggle Integrated Lights"
+ icon_icon = 'icons/mob/actions/actions_spells.dmi'
button_icon_state = "emp"
background_icon_state = "bg_tech"
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index f083f6c5f5..93f88bdfee 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -93,6 +93,8 @@
/obj/item/clothing/head/sombrero,
/obj/item/clothing/head/witchunter_hat)
+ var/remote_range = 7 //How far can you interact with machines.
+
can_buckle = TRUE
buckle_lying = FALSE
can_ride_typecache = list(/mob/living/carbon/human)
@@ -1079,6 +1081,7 @@
/datum/action/innate/undeployment
name = "Disconnect from shell"
desc = "Stop controlling your shell and resume normal core operations."
+ icon_icon = 'icons/mob/actions/actions_AI.dmi'
button_icon_state = "ai_core"
/datum/action/innate/undeployment/Trigger()
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index fd31f7537c..74f855bf8c 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -383,6 +383,7 @@
/datum/action/innate/seek_prey
name = "Seek the Harvest"
desc = "None can hide from Nar'Sie, activate to track a survivor attempting to flee the red harvest!"
+ icon_icon = 'icons/mob/actions/actions_cult.dmi'
background_icon_state = "bg_demon"
buttontooltipstyle = "cult"
button_icon_state = "cult_mark"
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm
index aaad3176e2..b827950d79 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm
@@ -196,5 +196,6 @@
/datum/action/generic/drone/select_filter
name = "Select Vision Filter"
+ icon_icon = 'icons/mob/actions/actions_silicon.dmi'
button_icon_state = "drone_vision"
procname = /mob/living/simple_animal/drone/verb/toggle_statics
diff --git a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm b/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm
index 280ccd6c26..2fa2101aa2 100644
--- a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm
@@ -27,6 +27,7 @@
//Lets the wizard summon his art to fight for him
/datum/action/boss/wizard_summon_minions
name = "Summon Minions"
+ icon_icon = 'icons/mob/actions/actions_minor_antag.dmi'
button_icon_state = "art_summon"
usage_probability = 40
boss_cost = 30
@@ -54,6 +55,7 @@
//Hitting the wizard himself destroys all decoys
/datum/action/boss/wizard_mimic
name = "Craft Mimicry"
+ icon_icon = 'icons/mob/actions/actions_minor_antag.dmi'
button_icon_state = "mimic_summon"
usage_probability = 30
boss_cost = 40
diff --git a/code/modules/mob/living/simple_animal/hostile/jungle_mobs.dm b/code/modules/mob/living/simple_animal/hostile/jungle_mobs.dm
index 2e39ab9b82..169a95f157 100644
--- a/code/modules/mob/living/simple_animal/hostile/jungle_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/jungle_mobs.dm
@@ -585,3 +585,249 @@
#undef MOOK_ATTACK_ACTIVE
#undef MOOK_ATTACK_RECOVERY
#undef ATTACK_INTERMISSION_TIME
+
+////Jungle Seedling////
+
+#define SEEDLING_STATE_NEUTRAL 0
+#define SEEDLING_STATE_WARMUP 1
+#define SEEDLING_STATE_ACTIVE 2
+#define SEEDLING_STATE_RECOVERY 3
+
+
+/mob/living/simple_animal/hostile/jungle/seedling
+ name = "seedling"
+ desc = "This oversized, predatory flower conceals what can only be described as an organic energy cannon, and it will not die until its hidden vital organs are sliced out. \
+ The concentrated streams of energy it sometimes produces require its full attention, attacking it during this time will prevent it from finishing its attack."
+ maxHealth = 100
+ health = 100
+ melee_damage_lower = 30
+ melee_damage_upper = 30
+ icon = 'icons/mob/jungle/arachnid.dmi'
+ icon_state = "seedling"
+ icon_living = "seedling"
+ icon_dead = "seedling_dead"
+ pixel_x = -16
+ pixel_y = -14
+ minimum_distance = 3
+ move_to_delay = 20
+ vision_range = 9
+ aggro_vision_range = 15
+ ranged = TRUE
+ ranged_cooldown_time = 10
+ projectiletype = /obj/item/projectile/seedling
+ projectilesound = 'sound/weapons/pierce.ogg'
+ robust_searching = TRUE
+ stat_attack = UNCONSCIOUS
+ anchored = TRUE
+ var/combatant_state = SEEDLING_STATE_NEUTRAL
+ var/obj/seedling_weakpoint/weak_point
+ var/mob/living/beam_debuff_target
+ var/solar_beam_identifier = 0
+
+/obj/item/projectile/seedling
+ name = "solar energy"
+ icon_state = "seedling"
+ damage = 10
+ damage_type = BURN
+ light_range = 2
+ flag = "energy"
+ light_color = LIGHT_COLOR_YELLOW
+ hitsound = 'sound/weapons/sear.ogg'
+ hitsound_wall = 'sound/weapons/effects/searwall.ogg'
+ nondirectional_sprite = TRUE
+
+/obj/item/projectile/seedling/Collide(atom/A)//Stops seedlings from destroying other jungle mobs through FF
+ if(isliving(A))
+ var/mob/living/L = A
+ if("jungle" in L.faction)
+ return FALSE
+ return ..()
+
+/obj/effect/temp_visual/solarbeam_killsat
+ name = "beam of solar energy"
+ icon_state = "solar_beam"
+ icon = 'icons/effects/beam.dmi'
+ layer = LIGHTING_LAYER
+ duration = 5
+ randomdir = FALSE
+
+/datum/status_effect/seedling_beam_indicator
+ id = "seedling beam indicator"
+ duration = 30
+ status_type = STATUS_EFFECT_MULTIPLE
+ alert_type = null
+ tick_interval = 1
+ var/obj/screen/seedling/seedling_screen_object
+ var/atom/target
+
+
+/datum/status_effect/seedling_beam_indicator/on_creation(mob/living/new_owner, target_plant)
+ . = ..()
+ if(.)
+ target = target_plant
+ tick()
+
+/datum/status_effect/seedling_beam_indicator/on_apply()
+ if(owner.client)
+ seedling_screen_object = new /obj/screen/seedling()
+ owner.client.screen += seedling_screen_object
+ tick()
+ return ..()
+
+/datum/status_effect/seedling_beam_indicator/Destroy()
+ if(owner)
+ if(owner.client)
+ owner.client.screen -= seedling_screen_object
+ return ..()
+
+/datum/status_effect/seedling_beam_indicator/tick()
+ var/target_angle = Get_Angle(owner, target)
+ var/matrix/final = matrix()
+ final.Turn(target_angle)
+ seedling_screen_object.transform = final
+
+/obj/screen/seedling
+ icon = 'icons/mob/jungle/arachnid.dmi'
+ icon_state = "seedling_beam_indicator"
+ screen_loc = "CENTER:-16,CENTER:-16"
+
+/mob/living/simple_animal/hostile/jungle/seedling/Goto()
+ if(combatant_state != SEEDLING_STATE_NEUTRAL)
+ return
+ return ..()
+
+/mob/living/simple_animal/hostile/jungle/seedling/AttackingTarget()
+ if(isliving(target))
+ if(ranged_cooldown <= world.time && combatant_state == SEEDLING_STATE_NEUTRAL)
+ OpenFire(target)
+ return
+ return ..()
+
+/mob/living/simple_animal/hostile/jungle/seedling/OpenFire()
+ WarmupAttack()
+
+/mob/living/simple_animal/hostile/jungle/seedling/proc/WarmupAttack()
+ if(combatant_state == SEEDLING_STATE_NEUTRAL)
+ combatant_state = SEEDLING_STATE_WARMUP
+ walk(src,0)
+ update_icons()
+ var/target_dist = get_dist(src,target)
+ var/living_target_check = isliving(target)
+ if(living_target_check)
+ if(target_dist > 7)//Offscreen check
+ SolarBeamStartup(target)
+ return
+ if(get_dist(src,target) >= 4 && prob(40))
+ SolarBeamStartup(target)
+ return
+ addtimer(CALLBACK(src, .proc/Volley), 5)
+
+/mob/living/simple_animal/hostile/jungle/seedling/proc/SolarBeamStartup(mob/living/living_target)//It's more like requiem than final spark
+ if(combatant_state == SEEDLING_STATE_WARMUP && target)
+ combatant_state = SEEDLING_STATE_ACTIVE
+ living_target.apply_status_effect(/datum/status_effect/seedling_beam_indicator, src)
+ beam_debuff_target = living_target
+ playsound(src,'sound/effects/seedling_chargeup.ogg', 100, 0)
+ if(get_dist(src,living_target) > 7)
+ playsound(living_target,'sound/effects/seedling_chargeup.ogg', 100, 0)
+ solar_beam_identifier = world.time
+ addtimer(CALLBACK(src, .proc/Beamu, living_target, solar_beam_identifier), 35)
+
+/mob/living/simple_animal/hostile/jungle/seedling/proc/Beamu(mob/living/living_target, beam_id = 0)
+ if(combatant_state == SEEDLING_STATE_ACTIVE && living_target && beam_id == solar_beam_identifier)
+ if(living_target.z == z)
+ update_icons()
+ var/obj/effect/temp_visual/solarbeam_killsat/S = new (get_turf(src))
+ var/matrix/starting = matrix()
+ starting.Scale(1,32)
+ starting.Translate(0,520)
+ S.transform = starting
+ var/obj/effect/temp_visual/solarbeam_killsat/K = new (get_turf(living_target))
+ var/matrix/final = matrix()
+ final.Scale(1,32)
+ final.Translate(0,512)
+ K.transform = final
+ living_target.adjustFireLoss(30)
+ living_target.adjust_fire_stacks(0.2)//Just here for the showmanship
+ living_target.IgniteMob()
+ playsound(living_target,'sound/weapons/sear.ogg', 50, 1)
+ addtimer(CALLBACK(src, .proc/AttackRecovery), 5)
+ return
+ AttackRecovery()
+
+/mob/living/simple_animal/hostile/jungle/seedling/proc/Volley()
+ if(combatant_state == SEEDLING_STATE_WARMUP && target)
+ combatant_state = SEEDLING_STATE_ACTIVE
+ update_icons()
+ var/datum/callback/cb = CALLBACK(src, .proc/InaccurateShot)
+ for(var/i in 1 to 13)
+ addtimer(cb, i)
+ addtimer(CALLBACK(src, .proc/AttackRecovery), 14)
+
+/mob/living/simple_animal/hostile/jungle/seedling/proc/InaccurateShot()
+ if(!QDELETED(target) && combatant_state == SEEDLING_STATE_ACTIVE && !stat)
+ if(get_dist(src,target) <= 3)//If they're close enough just aim straight at them so we don't miss at point blank ranges
+ Shoot(target)
+ return
+ var/turf/our_turf = get_turf(src)
+ var/obj/item/projectile/seedling/readied_shot = new /obj/item/projectile/seedling(our_turf)
+ readied_shot.current = our_turf
+ readied_shot.starting = our_turf
+ readied_shot.firer = src
+ readied_shot.original = target
+ readied_shot.yo = target.y - our_turf.y + rand(-1,1)
+ readied_shot.xo = target.x - our_turf.x + rand(-1,1)
+ readied_shot.fire()
+ playsound(src, projectilesound, 100, 1)
+
+/mob/living/simple_animal/hostile/jungle/seedling/proc/AttackRecovery()
+ if(combatant_state == SEEDLING_STATE_ACTIVE)
+ combatant_state = SEEDLING_STATE_RECOVERY
+ update_icons()
+ ranged_cooldown = world.time + ranged_cooldown_time
+ if(target)
+ face_atom(target)
+ addtimer(CALLBACK(src, .proc/ResetNeutral), 10)
+
+/mob/living/simple_animal/hostile/jungle/seedling/proc/ResetNeutral()
+ combatant_state = SEEDLING_STATE_NEUTRAL
+ if(target && !stat)
+ update_icons()
+ Goto(target, move_to_delay, minimum_distance)
+
+/mob/living/simple_animal/hostile/jungle/seedling/adjustHealth()
+ . = ..()
+ if(combatant_state == SEEDLING_STATE_ACTIVE && beam_debuff_target)
+ beam_debuff_target.remove_status_effect(/datum/status_effect/seedling_beam_indicator)
+ beam_debuff_target = null
+ solar_beam_identifier = 0
+ AttackRecovery()
+
+/mob/living/simple_animal/hostile/jungle/seedling/update_icons()
+ . = ..()
+ if(!stat)
+ switch(combatant_state)
+ if(SEEDLING_STATE_NEUTRAL)
+ icon_state = "seedling"
+ if(SEEDLING_STATE_WARMUP)
+ icon_state = "seedling_charging"
+ if(SEEDLING_STATE_ACTIVE)
+ icon_state = "seedling_fire"
+ if(SEEDLING_STATE_RECOVERY)
+ icon_state = "seedling"
+
+/mob/living/simple_animal/hostile/jungle/seedling/GiveTarget()
+ if(target)
+ if(combatant_state == SEEDLING_STATE_WARMUP || combatant_state == SEEDLING_STATE_ACTIVE)//So it doesn't 180 and blast you in the face while it's firing at someone else
+ return
+ return ..()
+
+/mob/living/simple_animal/hostile/jungle/seedling/LoseTarget()
+ if(combatant_state == SEEDLING_STATE_WARMUP || combatant_state == SEEDLING_STATE_ACTIVE)
+ return
+ return ..()
+
+#undef SEEDLING_STATE_NEUTRAL
+#undef SEEDLING_STATE_WARMUP
+#undef SEEDLING_STATE_ACTIVE
+#undef SEEDLING_STATE_RECOVERY
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
index 1e47342416..6cebdd9500 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
@@ -754,6 +754,7 @@ Difficulty: Very Hard
range = -1
include_user = 1
selection_type = "view"
+ action_icon = 'icons/mob/actions/actions_spells.dmi'
action_icon_state = "exit_possession"
sound = null
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
index 43c9197edc..f9a6575d1e 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
@@ -293,7 +293,7 @@ Difficulty: Medium
animate(src, pixel_z = 0, time = duration)
/obj/effect/temp_visual/target
- icon = 'icons/mob/actions.dmi'
+ icon = 'icons/mob/actions/actions_items.dmi'
icon_state = "sniper_zoom"
layer = BELOW_MOB_LAYER
light_range = 2
diff --git a/code/modules/mob/living/simple_animal/slime/powers.dm b/code/modules/mob/living/simple_animal/slime/powers.dm
index dab6b717a4..2b817a7f96 100644
--- a/code/modules/mob/living/simple_animal/slime/powers.dm
+++ b/code/modules/mob/living/simple_animal/slime/powers.dm
@@ -7,6 +7,7 @@
/datum/action/innate/slime
check_flags = AB_CHECK_CONSCIOUS
+ icon_icon = 'icons/mob/actions/actions_slime.dmi'
background_icon_state = "bg_alien"
var/needs_growth = NO_GROWTH_NEEDED
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 84f730f833..9542f6af1a 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -446,6 +446,7 @@
/datum/action/toggle_scope_zoom
name = "Toggle Scope"
check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_RESTRAINED|AB_CHECK_STUN|AB_CHECK_LYING
+ icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "sniper_zoom"
var/obj/item/weapon/gun/gun = null
diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm
index f2546ea465..ae20aa45d1 100644
--- a/code/modules/research/xenobiology/xenobio_camera.dm
+++ b/code/modules/research/xenobiology/xenobio_camera.dm
@@ -88,6 +88,7 @@
/datum/action/innate/slime_place
name = "Place Slimes"
+ icon_icon = 'icons/mob/actions/actions_silicon.dmi'
button_icon_state = "slime_down"
/datum/action/innate/slime_place/Activate()
@@ -107,6 +108,7 @@
/datum/action/innate/slime_pick_up
name = "Pick up Slime"
+ icon_icon = 'icons/mob/actions/actions_silicon.dmi'
button_icon_state = "slime_up"
/datum/action/innate/slime_pick_up/Activate()
@@ -132,6 +134,7 @@
/datum/action/innate/feed_slime
name = "Feed Slimes"
+ icon_icon = 'icons/mob/actions/actions_silicon.dmi'
button_icon_state = "monkey_down"
/datum/action/innate/feed_slime/Activate()
@@ -153,6 +156,7 @@
/datum/action/innate/monkey_recycle
name = "Recycle Monkeys"
+ icon_icon = 'icons/mob/actions/actions_silicon.dmi'
button_icon_state = "monkey_up"
/datum/action/innate/monkey_recycle/Activate()
diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm
index e4466972a2..ea113ba4fd 100644
--- a/code/modules/spells/spell.dm
+++ b/code/modules/spells/spell.dm
@@ -118,7 +118,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th
var/critfailchance = 0
var/centcom_cancast = 1 //Whether or not the spell should be allowed on z2
- var/action_icon = 'icons/mob/actions.dmi'
+ var/action_icon = 'icons/mob/actions/actions_spells.dmi'
var/action_icon_state = "spell_default"
var/action_background_icon_state = "bg_spell"
var/datum/action/spell_action/action
diff --git a/code/modules/spells/spell_types/bloodcrawl.dm b/code/modules/spells/spell_types/bloodcrawl.dm
index d7c5221e3d..e4c33380b2 100644
--- a/code/modules/spells/spell_types/bloodcrawl.dm
+++ b/code/modules/spells/spell_types/bloodcrawl.dm
@@ -9,6 +9,7 @@
range = 1
cooldown_min = 0
overlay = null
+ action_icon = 'icons/mob/actions/actions_minor_antag.dmi'
action_icon_state = "bloodcrawl"
action_background_icon_state = "bg_demon"
var/phased = 0
diff --git a/code/modules/spells/spell_types/construct_spells.dm b/code/modules/spells/spell_types/construct_spells.dm
index c8a7c387ee..5c28ff5029 100644
--- a/code/modules/spells/spell_types/construct_spells.dm
+++ b/code/modules/spells/spell_types/construct_spells.dm
@@ -2,6 +2,7 @@
/obj/effect/proc_holder/spell/aoe_turf/conjure/construct/lesser
charge_max = 1800
+ action_icon = 'icons/mob/actions/actions_cult.dmi'
action_icon_state = "artificer"
action_background_icon_state = "bg_demon"
@@ -20,6 +21,7 @@
invocation = "none"
invocation_type = "none"
range = 2
+ action_icon = 'icons/mob/actions/actions_cult.dmi'
action_icon_state = "areaconvert"
action_background_icon_state = "bg_cult"
@@ -40,6 +42,7 @@
invocation_type = "none"
range = 0
summon_type = list(/turf/open/floor/engine/cult)
+ action_icon = 'icons/mob/actions/actions_cult.dmi'
action_icon_state = "floorconstruct"
action_background_icon_state = "bg_cult"
@@ -54,6 +57,7 @@
invocation = "none"
invocation_type = "none"
range = 0
+ action_icon = 'icons/mob/actions/actions_cult.dmi'
action_icon_state = "lesserconstruct"
action_background_icon_state = "bg_cult"
@@ -83,6 +87,7 @@
invocation = "none"
invocation_type = "none"
range = 0
+ action_icon = 'icons/mob/actions/actions_cult.dmi'
action_icon_state = "summonsoulstone"
action_background_icon_state = "bg_demon"
@@ -109,6 +114,7 @@
range = 0
summon_type = list(/obj/effect/forcefield/cult)
summon_lifespan = 200
+ action_icon = 'icons/mob/actions/actions_cult.dmi'
action_icon_state = "cultforcewall"
action_background_icon_state = "bg_demon"
@@ -125,6 +131,7 @@
range = -1
include_user = 1
jaunt_duration = 50 //in deciseconds
+ action_icon = 'icons/mob/actions/actions_cult.dmi'
action_icon_state = "phaseshift"
action_background_icon_state = "bg_demon"
jaunt_in_time = 12
@@ -164,7 +171,7 @@
smoke_spread = 3
smoke_amt = 4
- action_icon_state = "parasmoke"
+ action_icon_state = "smoke"
action_background_icon_state = "bg_cult"
@@ -182,6 +189,7 @@
clothes_req = FALSE
invocation = "none"
invocation_type = "none"
+ action_icon = 'icons/mob/actions/actions_cult.dmi'
action_background_icon_state = "bg_demon"
action_icon_state = "abyssal_gaze"
@@ -222,6 +230,7 @@
clothes_req = FALSE
invocation = "none"
invocation_type = "none"
+ action_icon = 'icons/mob/actions/actions_cult.dmi'
action_background_icon_state = "bg_demon"
action_icon_state = "dominate"
diff --git a/code/modules/spells/spell_types/devil.dm b/code/modules/spells/spell_types/devil.dm
index 78d568c39e..ca9764af1f 100644
--- a/code/modules/spells/spell_types/devil.dm
+++ b/code/modules/spells/spell_types/devil.dm
@@ -10,6 +10,7 @@
school = "conjuration"
charge_max = 150
cooldown_min = 10
+ action_icon = 'icons/mob/actions/actions_minor_antag.dmi'
action_icon_state = "pitchfork"
action_background_icon_state = "bg_demon"
@@ -26,6 +27,7 @@
invocation = "I aint have this much fun since Georgia."
action_icon_state = "golden_violin"
name = "Summon golden violin"
+ action_icon = 'icons/mob/actions/actions_minor_antag.dmi'
action_background_icon_state = "bg_demon"
/obj/effect/proc_holder/spell/targeted/summon_contract
@@ -110,7 +112,7 @@
user.infernalphasein()
else
to_chat(user, "You are no longer near a potential signer.")
-
+
else
to_chat(user, "You can only re-appear near a potential signer.")
revert_cast()
@@ -178,6 +180,7 @@
cooldown_min = 0
overlay = null
include_user = 0
+ action_icon = 'icons/mob/actions/actions_cult.dmi'
action_icon_state = "sintouch"
action_background_icon_state = "bg_demon"
phase_allowed = 0
@@ -213,6 +216,7 @@
school = "conjuration"
charge_max = 10
cooldown_min = 50 //5 seconds, so the smoke can't be spammed
+ action_icon = 'icons/mob/actions/actions_minor_antag.dmi'
action_icon_state = "funk"
action_background_icon_state = "bg_demon"
diff --git a/code/modules/spells/spell_types/devil_boons.dm b/code/modules/spells/spell_types/devil_boons.dm
index 75b6597f07..192a15e96c 100644
--- a/code/modules/spells/spell_types/devil_boons.dm
+++ b/code/modules/spells/spell_types/devil_boons.dm
@@ -8,6 +8,7 @@
school = "conjuration"
charge_max = 100
cooldown_min = 10
+ action_icon = 'icons/mob/actions/actions_minor_antag.dmi'
action_icon_state = "moneybag"
@@ -34,6 +35,7 @@
clothes_req = 0
charge_max = 50
cooldown_min = 10
+ action_icon = 'icons/mob/actions/actions_silicon.dmi'
action_icon_state = "camera_jump"
var/ranges = list(7,8,9,10)
@@ -52,6 +54,7 @@
clothes_req = 0
charge_max = 50
cooldown_min = 10
+ action_icon = 'icons/mob/actions/actions_spells.dmi'
action_icon_state = "sacredflame"
var/mob/living/friend
var/obj/effect/mob_spawn/human/demonic_friend/friendShell
diff --git a/code/modules/spells/spell_types/lichdom.dm b/code/modules/spells/spell_types/lichdom.dm
index bc5ce48c7b..cc728f942e 100644
--- a/code/modules/spells/spell_types/lichdom.dm
+++ b/code/modules/spells/spell_types/lichdom.dm
@@ -17,6 +17,7 @@
cooldown_min = 10
include_user = 1
+ action_icon = 'icons/mob/actions/actions_spells.dmi'
action_icon_state = "skeleton"
/obj/effect/proc_holder/spell/targeted/lichdom/cast(list/targets,mob/user = usr)
diff --git a/code/modules/spells/spell_types/voice_of_god.dm b/code/modules/spells/spell_types/voice_of_god.dm
index 6636c920f2..a5b44b8e0f 100644
--- a/code/modules/spells/spell_types/voice_of_god.dm
+++ b/code/modules/spells/spell_types/voice_of_god.dm
@@ -5,6 +5,7 @@
cooldown_min = 0
level_max = 1
clothes_req = 0
+ action_icon = 'icons/mob/actions/actions_items.dmi'
action_icon_state = "voice_of_god"
var/command
var/cooldown_mod = 1
diff --git a/code/modules/spells/spell_types/wizard.dm b/code/modules/spells/spell_types/wizard.dm
index b9eae51f79..73995ab018 100644
--- a/code/modules/spells/spell_types/wizard.dm
+++ b/code/modules/spells/spell_types/wizard.dm
@@ -301,6 +301,7 @@
cooldown_min = 150
invocation_type = "none"
sparkle_path = /obj/effect/temp_visual/dir_setting/tailsweep
+ action_icon = 'icons/mob/actions/actions_xeno.dmi'
action_icon_state = "tailsweep"
action_background_icon_state = "bg_alien"
diff --git a/code/modules/tgui/external.dm b/code/modules/tgui/external.dm
index a45b4a7daf..2d75ebab6a 100644
--- a/code/modules/tgui/external.dm
+++ b/code/modules/tgui/external.dm
@@ -60,13 +60,6 @@
/datum/proc/ui_host()
return src // Default src.
- /**
- * global
- *
- * Used to track the current screen.
- **/
-/datum/var/ui_screen = "home"
-
/**
* global
*
diff --git a/goon/code/datums/browserOutput.dm b/goon/code/datums/browserOutput.dm
index a6cabcba87..d928397728 100644
--- a/goon/code/datums/browserOutput.dm
+++ b/goon/code/datums/browserOutput.dm
@@ -2,9 +2,6 @@
For the main html chat area
*********************************/
-#define BICON_X_MAX 96
-#define BICON_Y_MAX 96
-
//Precaching a bunch of shit
GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of icons for the browser output
@@ -191,10 +188,6 @@ GLOBAL_LIST_EMPTY(bicon_cache)
/proc/icon2base64(icon/icon, iconKey = "misc")
if (!isicon(icon))
return FALSE
- //DOS exploit
- if(icon.Width() > BICON_X_MAX || icon.Length() > BICON_Y_MAX)
- return FALSE
- //
GLOB.iconCache[iconKey] << icon
var/iconData = GLOB.iconCache.ExportText(iconKey)
var/list/partial = splittext(iconData, "{")
@@ -293,4 +286,4 @@ GLOBAL_LIST_EMPTY(bicon_cache)
return M.current.client
/datum/log //exists purely to capture to_chat() output
- var/log = ""
+ var/log = ""
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-2233.yml b/html/changelogs/AutoChangeLog-pr-2233.yml
new file mode 100644
index 0000000000..4a8109664b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2233.yml
@@ -0,0 +1,4 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - rscadd: "Adds the \"seedling\" planetstation mob to the backend"
diff --git a/icons/effects/beam.dmi b/icons/effects/beam.dmi
index 71fdb96a85..e7f61d605d 100644
Binary files a/icons/effects/beam.dmi and b/icons/effects/beam.dmi differ
diff --git a/icons/mob/actions/actions_AI.dmi b/icons/mob/actions/actions_AI.dmi
new file mode 100644
index 0000000000..c6e4e1dae7
Binary files /dev/null and b/icons/mob/actions/actions_AI.dmi differ
diff --git a/icons/mob/actions/actions_clockcult.dmi b/icons/mob/actions/actions_clockcult.dmi
new file mode 100644
index 0000000000..251e387f50
Binary files /dev/null and b/icons/mob/actions/actions_clockcult.dmi differ
diff --git a/icons/mob/actions/actions_construction.dmi b/icons/mob/actions/actions_construction.dmi
new file mode 100644
index 0000000000..43fe0b48c4
Binary files /dev/null and b/icons/mob/actions/actions_construction.dmi differ
diff --git a/icons/mob/actions/actions_cult.dmi b/icons/mob/actions/actions_cult.dmi
new file mode 100644
index 0000000000..f96242ea9e
Binary files /dev/null and b/icons/mob/actions/actions_cult.dmi differ
diff --git a/icons/mob/actions/actions_flightsuit.dmi b/icons/mob/actions/actions_flightsuit.dmi
new file mode 100644
index 0000000000..3121c24355
Binary files /dev/null and b/icons/mob/actions/actions_flightsuit.dmi differ
diff --git a/icons/mob/actions/actions_items.dmi b/icons/mob/actions/actions_items.dmi
new file mode 100644
index 0000000000..266c197ad3
Binary files /dev/null and b/icons/mob/actions/actions_items.dmi differ
diff --git a/icons/mob/actions/actions_mecha.dmi b/icons/mob/actions/actions_mecha.dmi
new file mode 100644
index 0000000000..c064441ed2
Binary files /dev/null and b/icons/mob/actions/actions_mecha.dmi differ
diff --git a/icons/mob/actions/actions_minor_antag.dmi b/icons/mob/actions/actions_minor_antag.dmi
new file mode 100644
index 0000000000..4e5806f2fb
Binary files /dev/null and b/icons/mob/actions/actions_minor_antag.dmi differ
diff --git a/icons/mob/actions/actions_revenant.dmi b/icons/mob/actions/actions_revenant.dmi
new file mode 100644
index 0000000000..3f664d5c27
Binary files /dev/null and b/icons/mob/actions/actions_revenant.dmi differ
diff --git a/icons/mob/actions/actions_silicon.dmi b/icons/mob/actions/actions_silicon.dmi
new file mode 100644
index 0000000000..5b198649ba
Binary files /dev/null and b/icons/mob/actions/actions_silicon.dmi differ
diff --git a/icons/mob/actions/actions_slime.dmi b/icons/mob/actions/actions_slime.dmi
new file mode 100644
index 0000000000..94cf319958
Binary files /dev/null and b/icons/mob/actions/actions_slime.dmi differ
diff --git a/icons/mob/actions/actions_spells.dmi b/icons/mob/actions/actions_spells.dmi
new file mode 100644
index 0000000000..8935bd993b
Binary files /dev/null and b/icons/mob/actions/actions_spells.dmi differ
diff --git a/icons/mob/actions/actions_xeno.dmi b/icons/mob/actions/actions_xeno.dmi
new file mode 100644
index 0000000000..0a96fea8c4
Binary files /dev/null and b/icons/mob/actions/actions_xeno.dmi differ
diff --git a/icons/mob/actions/backgrounds.dmi b/icons/mob/actions/backgrounds.dmi
new file mode 100644
index 0000000000..6af3b98728
Binary files /dev/null and b/icons/mob/actions/backgrounds.dmi differ
diff --git a/icons/mob/actions_AI.dmi b/icons/mob/actions_AI.dmi
deleted file mode 100644
index 3a789984e6..0000000000
Binary files a/icons/mob/actions_AI.dmi and /dev/null differ
diff --git a/icons/mob/jungle/arachnid.dmi b/icons/mob/jungle/arachnid.dmi
index 342509a79e..ccd52eeb7d 100644
Binary files a/icons/mob/jungle/arachnid.dmi and b/icons/mob/jungle/arachnid.dmi differ
diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi
index 98ac40f0c3..def7a71bd3 100644
Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ
diff --git a/sound/effects/seedling_chargeup.ogg b/sound/effects/seedling_chargeup.ogg
new file mode 100644
index 0000000000..155cc36c67
Binary files /dev/null and b/sound/effects/seedling_chargeup.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index 8fc6e297d5..9e09f17fdb 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -247,6 +247,7 @@
#include "code\datums\browser.dm"
#include "code\datums\callback.dm"
#include "code\datums\datacore.dm"
+#include "code\datums\datum.dm"
#include "code\datums\datumvars.dm"
#include "code\datums\dna.dm"
#include "code\datums\dog_fashion.dm"