Merge branch 'master' into upstream-merge-29615
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.<br>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
|
||||
|
||||
@@ -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
|
||||
|
||||
31
code/datums/datum.dm
Normal file
@@ -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
|
||||
@@ -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]
|
||||
|
||||
@@ -73,12 +73,14 @@
|
||||
return ""
|
||||
. = header ? "The following pull requests are currently test merged:<br>" : ""
|
||||
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
|
||||
. += "<a href=\"[config.githuburl]/pull/[line]\">#[line][details]</a><br>"
|
||||
|
||||
/client/verb/showrevinfo()
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -85,6 +85,7 @@
|
||||
charge_max = 0
|
||||
panel = "Revenant Abilities"
|
||||
message = "<span class='revennotice'>You toggle your night vision.</span>"
|
||||
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"
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
..()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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 "<img class='icon misc' src='data:image/png;base64,[bicon_cache["\ref[obj]"]]'>"*/
|
||||
return "<img class='icon misc' src='data:image/png;base64,[icon2base64(thing)]'>"
|
||||
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 "<img class='icon misc' src='data:image/png;base64,[bicon_cache[icon_md5]]'>"
|
||||
|
||||
// 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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -680,7 +680,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
to_chat(src, "<span class='notice'>Data HUDs enabled.</span>")
|
||||
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."
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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, "<span class='warning'>You are no longer near a potential signer.</span>")
|
||||
|
||||
|
||||
else
|
||||
to_chat(user, "<span class='warning'>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"
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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
|
||||
*
|
||||
|
||||
@@ -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 = ""
|
||||
4
html/changelogs/AutoChangeLog-pr-2233.yml
Normal file
@@ -0,0 +1,4 @@
|
||||
author: "CitadelStationBot"
|
||||
delete-after: True
|
||||
changes:
|
||||
- rscadd: "Adds the \"seedling\" planetstation mob to the backend"
|
||||
|
Before Width: | Height: | Size: 110 KiB After Width: | Height: | Size: 110 KiB |
BIN
icons/mob/actions/actions_AI.dmi
Normal file
|
After Width: | Height: | Size: 8.0 KiB |
BIN
icons/mob/actions/actions_clockcult.dmi
Normal file
|
After Width: | Height: | Size: 73 KiB |
BIN
icons/mob/actions/actions_construction.dmi
Normal file
|
After Width: | Height: | Size: 7.6 KiB |
BIN
icons/mob/actions/actions_cult.dmi
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
icons/mob/actions/actions_flightsuit.dmi
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
icons/mob/actions/actions_items.dmi
Normal file
|
After Width: | Height: | Size: 7.2 KiB |
BIN
icons/mob/actions/actions_mecha.dmi
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
BIN
icons/mob/actions/actions_minor_antag.dmi
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
icons/mob/actions/actions_revenant.dmi
Normal file
|
After Width: | Height: | Size: 8.2 KiB |
BIN
icons/mob/actions/actions_silicon.dmi
Normal file
|
After Width: | Height: | Size: 5.8 KiB |
BIN
icons/mob/actions/actions_slime.dmi
Normal file
|
After Width: | Height: | Size: 3.0 KiB |
BIN
icons/mob/actions/actions_spells.dmi
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
icons/mob/actions/actions_xeno.dmi
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
icons/mob/actions/backgrounds.dmi
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 6.7 KiB |
|
Before Width: | Height: | Size: 57 KiB After Width: | Height: | Size: 65 KiB |
|
Before Width: | Height: | Size: 112 KiB After Width: | Height: | Size: 111 KiB |
BIN
sound/effects/seedling_chargeup.ogg
Normal file
@@ -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"
|
||||
|
||||