mirror of
https://github.com/Yawn-Wider/YWPolarisVore.git
synced 2026-08-28 07:26:42 +01:00
Merge branch 'release' of https://github.com/VOREStation/VOREStation into izac-voreupdate
All conflicts resolved Signed-off-by: izac112 <izac10@live.com>
This commit is contained in:
+1
-1
@@ -5,7 +5,7 @@ env:
|
||||
global:
|
||||
- BASENAME="vorestation" # $BASENAME.dmb, $BASENAME.dme, etc.
|
||||
- BYOND_MAJOR="513"
|
||||
- BYOND_MINOR="1513"
|
||||
- BYOND_MINOR="1520"
|
||||
- MACRO_COUNT=4
|
||||
|
||||
cache:
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
**File:** `maps/tether/submaps/om_ships/aro2.dmi`<br>
|
||||
**Creator:** Nia Tahl, deriv by Aronai.<br>
|
||||
**License:** [CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/)<br>
|
||||
**URL:** [Forum Thread](http://fractalsoftworks.com/forum/index.php?topic=14935.0)<br>
|
||||
**Notes:** Permission to use assets also given in writing.<br>
|
||||
<br>
|
||||
**File:** `maps/tether/submaps/om_ships/cruiser.dmi`<br>
|
||||
**Creator:** Gwyvern & Tartiflette<br>
|
||||
**License:** [CC BY-NC-SA (Unspecified Version)](https://creativecommons.org/licenses/by-nc-sa/4.0/)<br>
|
||||
**URL:** [Forum Thread](http://fractalsoftworks.com/forum/index.php?topic=13667.0)<br>
|
||||
**Notes:** Permission to use assets also given in writing.<br>
|
||||
<br>
|
||||
**File:** `icons/mecha/fighters64x64.dmi`<br>
|
||||
**Icon-States:** `baron`, derivs by Aronai.<br>
|
||||
**Creator:** Gwyvern & Tartiflette<br>
|
||||
**License:** [CC BY-NC-SA (Unspecified Version)](https://creativecommons.org/licenses/by-nc-sa/4.0/)<br>
|
||||
**URL:** [Forum Thread](http://fractalsoftworks.com/forum/index.php?topic=13667.0)<br>
|
||||
**Notes:** Permission to use assets also given in writing.<br>
|
||||
<br>
|
||||
**File:** `icons/mecha/fighters64x64.dmi`<br>
|
||||
**Icon-States:** `pinnace`, derivs by Aronai.<br>
|
||||
**Creator:** Tartiflette<br>
|
||||
**License:** [CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/)<br>
|
||||
**URL:** [Forum Thread](http://fractalsoftworks.com/forum/index.php?topic=17856.0)<br>
|
||||
**Notes:** Permission to use assets also given in writing.<br>
|
||||
<br>
|
||||
**File:** `icons/mecha/fighters64x64.dmi`<br>
|
||||
**Icon-States:** `allure`, derivs by Aronai.<br>
|
||||
**Creator:** Tartiflette<br>
|
||||
**License:** [CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/)<br>
|
||||
**URL:** [Forum Thread](http://fractalsoftworks.com/forum/index.php?topic=11646.0)<br>
|
||||
**Notes:** Permission to use assets also given in writing.<br>
|
||||
<br>
|
||||
**File:** `icons/mecha/fighters64x64.dmi`<br>
|
||||
**Icon-States:** `scoralis`, derivs by Aronai.<br>
|
||||
**Creator:** Nia Tahl<br>
|
||||
**License:** [CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/)<br>
|
||||
**URL:** [Forum Thread](http://fractalsoftworks.com/forum/index.php?topic=14935.0)<br>
|
||||
**Notes:** Permission to use assets also given in writing.<br>
|
||||
@@ -31,6 +31,8 @@ Creative Commons 3.0 BY-NC-SA license
|
||||
|
||||
All assets including icons and sound are under a [CC BY-SA 3.0](http://creativecommons.org/licenses/by-sa/3.0/) license unless otherwise indicated.
|
||||
|
||||
Attributions and other licenses with links to original works are noted in [ATTRIBUTIONS.md](./ATTRIBUTIONS.md).
|
||||
|
||||
### GETTING THE CODE
|
||||
The simplest way to obtain the code is using the github .zip feature. If you do this, you won't be able to make a Pull Request later, though. You'll need to use the git method.
|
||||
|
||||
|
||||
@@ -200,8 +200,9 @@
|
||||
set_frequency(frequency)
|
||||
|
||||
/obj/machinery/atmospherics/binary/dp_vent_pump/examine(mob/user)
|
||||
if(..(user, 1))
|
||||
to_chat(user, "A small gauge in the corner reads [round(last_flow_rate, 0.1)] L/s; [round(last_power_draw)] W")
|
||||
. = ..()
|
||||
if(Adjacent(user))
|
||||
. += "A small gauge in the corner reads [round(last_flow_rate, 0.1)] L/s; [round(last_power_draw)] W"
|
||||
|
||||
|
||||
/obj/machinery/atmospherics/unary/vent_pump/power_change()
|
||||
|
||||
@@ -15,8 +15,8 @@ GLOBAL_LIST_EMPTY(shutoff_valves)
|
||||
icon_state = "vclamp[open]"
|
||||
|
||||
/obj/machinery/atmospherics/valve/shutoff/examine(var/mob/user)
|
||||
..()
|
||||
to_chat(user, "The automatic shutoff circuit is [close_on_leaks ? "enabled" : "disabled"].")
|
||||
. = ..()
|
||||
. += "The automatic shutoff circuit is [close_on_leaks ? "enabled" : "disabled"]."
|
||||
|
||||
/obj/machinery/atmospherics/valve/shutoff/Initialize()
|
||||
. = ..()
|
||||
|
||||
@@ -185,7 +185,7 @@
|
||||
var/new_flow_rate = input(usr,"Enter new flow rate (0-[air1.volume]L/s)","Flow Rate Control",src.set_flow_rate) as num
|
||||
src.set_flow_rate = max(0, min(air1.volume, new_flow_rate))
|
||||
if(href_list["power"])
|
||||
use_power=!use_power
|
||||
update_use_power(!use_power)
|
||||
src.update_icon()
|
||||
src.updateUsrDialog()
|
||||
/*
|
||||
|
||||
@@ -178,6 +178,6 @@
|
||||
..()
|
||||
|
||||
/obj/machinery/atmospherics/unary/freezer/examine(mob/user)
|
||||
..(user)
|
||||
. = ..()
|
||||
if(panel_open)
|
||||
to_chat(user, "The maintenance hatch is open.")
|
||||
. += "The maintenance hatch is open."
|
||||
|
||||
@@ -165,6 +165,6 @@
|
||||
..()
|
||||
|
||||
/obj/machinery/atmospherics/unary/heater/examine(mob/user)
|
||||
..(user)
|
||||
..()
|
||||
if(panel_open)
|
||||
to_chat(user, "The maintenance hatch is open.")
|
||||
. += "The maintenance hatch is open."
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
var/radio_filter_out
|
||||
var/radio_filter_in
|
||||
|
||||
var/datum/looping_sound/air_pump/soundloop //Yawn Edit
|
||||
var/datum/looping_sound/air_pump/soundloop
|
||||
|
||||
/obj/machinery/atmospherics/unary/vent_pump/on
|
||||
use_power = USE_POWER_IDLE
|
||||
@@ -77,7 +77,7 @@
|
||||
|
||||
/obj/machinery/atmospherics/unary/vent_pump/Initialize()
|
||||
. = ..()
|
||||
soundloop = new(list(src), FALSE) //Yawn Edit
|
||||
soundloop = new(list(src), FALSE)
|
||||
|
||||
/obj/machinery/atmospherics/unary/vent_pump/New()
|
||||
..()
|
||||
@@ -95,7 +95,7 @@
|
||||
if(initial_loc)
|
||||
initial_loc.air_vent_info -= id_tag
|
||||
initial_loc.air_vent_names -= id_tag
|
||||
QDEL_NULL(soundloop) //Yawn Edit
|
||||
QDEL_NULL(soundloop)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/atmospherics/unary/vent_pump/high_volume
|
||||
@@ -181,15 +181,15 @@
|
||||
|
||||
/obj/machinery/atmospherics/unary/vent_pump/proc/can_pump()
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
soundloop.stop() //Yawn Edit
|
||||
soundloop.stop()
|
||||
return 0
|
||||
if(!use_power)
|
||||
soundloop.stop() //Yawn Edit
|
||||
soundloop.stop()
|
||||
return 0
|
||||
if(welded)
|
||||
soundloop.stop() //Yawn Edit
|
||||
soundloop.stop()
|
||||
return 0
|
||||
soundloop.start() //Yawn Edit
|
||||
soundloop.start()
|
||||
return 1
|
||||
|
||||
/obj/machinery/atmospherics/unary/vent_pump/process()
|
||||
@@ -414,12 +414,13 @@
|
||||
..()
|
||||
|
||||
/obj/machinery/atmospherics/unary/vent_pump/examine(mob/user)
|
||||
if(..(user, 1))
|
||||
to_chat(user, "A small gauge in the corner reads [round(last_flow_rate, 0.1)] L/s; [round(last_power_draw)] W")
|
||||
. = ..()
|
||||
if(Adjacent(user))
|
||||
. += "A small gauge in the corner reads [round(last_flow_rate, 0.1)] L/s; [round(last_power_draw)] W"
|
||||
else
|
||||
to_chat(user, "You are too far away to read the gauge.")
|
||||
. += "You are too far away to read the gauge."
|
||||
if(welded)
|
||||
to_chat(user, "It seems welded shut.")
|
||||
. += "It seems welded shut."
|
||||
|
||||
/obj/machinery/atmospherics/unary/vent_pump/power_change()
|
||||
var/old_stat = stat
|
||||
|
||||
@@ -287,7 +287,8 @@
|
||||
deconstruct()
|
||||
|
||||
/obj/machinery/atmospherics/unary/vent_scrubber/examine(mob/user)
|
||||
if(..(user, 1))
|
||||
to_chat(user, "A small gauge in the corner reads [round(last_flow_rate, 0.1)] L/s; [round(last_power_draw)] W")
|
||||
. = ..()
|
||||
if(Adjacent(user))
|
||||
. += "A small gauge in the corner reads [round(last_flow_rate, 0.1)] L/s; [round(last_power_draw)] W"
|
||||
else
|
||||
to_chat(user, "You are too far away to read the gauge.")
|
||||
. += "You are too far away to read the gauge."
|
||||
|
||||
@@ -307,5 +307,5 @@
|
||||
deconstruct()
|
||||
|
||||
/obj/machinery/atmospherics/valve/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "It is [open ? "open" : "closed"].")
|
||||
. = ..()
|
||||
. += "It is [open ? "open" : "closed"]."
|
||||
|
||||
@@ -88,6 +88,8 @@
|
||||
if(!parent)
|
||||
..()
|
||||
else
|
||||
if(leaking)
|
||||
parent.mingle_with_turf(loc, volume)
|
||||
var/datum/gas_mixture/pipe_air = return_air()
|
||||
if(istype(loc, /turf/simulated/))
|
||||
var/environment_temperature = 0
|
||||
|
||||
+19
-4
@@ -16,13 +16,19 @@
|
||||
// Inputs: The turf the airflow is from, which may not be the same as loc. is_zone is for conditionally disallowing merging.
|
||||
// Outputs: Boolean if airflow can pass.
|
||||
/atom/proc/CanZASPass(turf/T, is_zone)
|
||||
// Behaviors defined here so when people directly call c_airblock it will still obey can_atmos_pass
|
||||
switch(can_atmos_pass)
|
||||
if(ATMOS_PASS_YES)
|
||||
return TRUE
|
||||
if(ATMOS_PASS_NO)
|
||||
return FALSE
|
||||
if(ATMOS_PASS_DENSITY)
|
||||
return !density
|
||||
if(ATMOS_PASS_PROC)
|
||||
// Cowardly refuse to recursively self-call CanZASPass. The hero BYOND needs?
|
||||
CRASH("can_atmos_pass = ATMOS_PASS_PROC but CanZASPass not overridden on [src] ([type])")
|
||||
else
|
||||
return can_atmos_pass
|
||||
|
||||
/turf/can_atmos_pass = ATMOS_PASS_NO
|
||||
CRASH("Invalid can_atmos_pass = [can_atmos_pass] on [src] ([type])")
|
||||
|
||||
/turf/CanPass(atom/movable/mover, turf/target)
|
||||
if(!target) return FALSE
|
||||
@@ -89,6 +95,15 @@ turf/c_airblock(turf/other)
|
||||
var/result = 0
|
||||
for(var/mm in contents)
|
||||
var/atom/movable/M = mm
|
||||
result |= M.c_airblock(other)
|
||||
switch(M.can_atmos_pass)
|
||||
if(ATMOS_PASS_YES)
|
||||
continue
|
||||
if(ATMOS_PASS_NO)
|
||||
return BLOCKED
|
||||
if(ATMOS_PASS_DENSITY)
|
||||
if(M.density)
|
||||
return BLOCKED
|
||||
if(ATMOS_PASS_PROC)
|
||||
result |= M.c_airblock(other)
|
||||
if(result == BLOCKED) return BLOCKED
|
||||
return result
|
||||
|
||||
@@ -4,3 +4,10 @@
|
||||
#define BLOCKED 3 // Blocked, zone boundaries will not cross even if opened.
|
||||
|
||||
#define ZONE_MIN_SIZE 14 // Zones with less than this many turfs will always merge, even if the connection is not direct
|
||||
|
||||
// Used for quickly making certain things allow airflow or not.
|
||||
// More complicated, conditional airflow should override CanZASPass().
|
||||
#define ATMOS_PASS_YES 1 // Always blocks air and zones.
|
||||
#define ATMOS_PASS_NO 2 // Never blocks air or zones.
|
||||
#define ATMOS_PASS_DENSITY 3 // Blocks air and zones if density = 1, allows both if density = 0
|
||||
#define ATMOS_PASS_PROC 4 // Call CanZASPass() using c_airblock
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#if DM_VERSION < 513
|
||||
|
||||
#define ismovableatom(A) (istype(A, /atom/movable))
|
||||
#define ismovable(A) (istype(A, /atom/movable))
|
||||
|
||||
#define islist(L) (istype(L, /list))
|
||||
|
||||
@@ -18,8 +18,6 @@
|
||||
|
||||
#else
|
||||
|
||||
#define ismovableatom(A) ismovable(A)
|
||||
|
||||
#define CLAMP01(x) clamp(x, 0, 1)
|
||||
|
||||
#define CLAMP(CLVALUE, CLMIN, CLMAX) clamp(CLVALUE, CLMIN, CLMAX)
|
||||
|
||||
@@ -94,9 +94,3 @@
|
||||
#define ATMOSTANK_CO2 25000 // CO2 and PH are not critically important for station, only for toxins and alternative coolants, no need to store a lot of those.
|
||||
#define ATMOSTANK_PHORON 25000
|
||||
#define ATMOSTANK_NITROUSOXIDE 10000 // N2O doesn't have a real useful use, i guess it's on station just to allow refilling of sec's riot control canisters?
|
||||
|
||||
// Used for quickly making certain things allow airflow or not.
|
||||
// More complicated, conditional airflow should override CanZASPass().
|
||||
#define ATMOS_PASS_YES 1
|
||||
#define ATMOS_PASS_NO 0
|
||||
#define ATMOS_PASS_DENSITY -1 // Just checks density.
|
||||
@@ -81,10 +81,28 @@
|
||||
#define DISPOSAL_PIPE_TAGGER 13
|
||||
#define DISPOSAL_PIPE_TAGGER_PARTIAL 14
|
||||
|
||||
// Disposals Construction
|
||||
// Future: Eliminate these type codes by adding disposals equivilent of pipe_state.
|
||||
#define DISPOSAL_PIPE_STRAIGHT 0
|
||||
#define DISPOSAL_PIPE_CORNER 1
|
||||
#define DISPOSAL_PIPE_JUNCTION 2
|
||||
#define DISPOSAL_PIPE_JUNCTION_FLIPPED 3
|
||||
#define DISPOSAL_PIPE_JUNCTION_Y 4
|
||||
#define DISPOSAL_PIPE_TRUNK 5
|
||||
#define DISPOSAL_PIPE_BIN 6
|
||||
#define DISPOSAL_PIPE_OUTLET 7
|
||||
#define DISPOSAL_PIPE_CHUTE 8
|
||||
#define DISPOSAL_PIPE_SORTER 9
|
||||
#define DISPOSAL_PIPE_SORTER_FLIPPED 10
|
||||
#define DISPOSAL_PIPE_UPWARD 11
|
||||
#define DISPOSAL_PIPE_DOWNWARD 12
|
||||
#define DISPOSAL_PIPE_TAGGER 13
|
||||
#define DISPOSAL_PIPE_TAGGER_PARTIAL 14
|
||||
|
||||
#define DISPOSAL_SORT_NORMAL 0
|
||||
#define DISPOSAL_SORT_WILDCARD 1
|
||||
#define DISPOSAL_SORT_UNTAGGED 2
|
||||
//YW Additions end
|
||||
|
||||
// Macro for easy use of boilerplate code for searching for a valid node connection.
|
||||
#define STANDARD_ATMOS_CHOOSE_NODE(node_num, direction) \
|
||||
for(var/obj/machinery/atmospherics/target in get_step(src, direction)) { \
|
||||
|
||||
@@ -35,8 +35,13 @@
|
||||
#define BE_RAIDER 0x800
|
||||
#define BE_PLANT 0x1000
|
||||
#define BE_MUTINEER 0x2000
|
||||
#define BE_PAI 0x4000
|
||||
#define BE_LOYALIST 0x8000
|
||||
#define BE_LOYALIST 0x4000
|
||||
#define BE_PAI 0x8000
|
||||
//VOREStation Add
|
||||
#define BE_LOSTDRONE 0x10000
|
||||
#define BE_MAINTPRED 0x20000
|
||||
#define BE_MORPH 0x40000
|
||||
//VOREStation Add End
|
||||
|
||||
var/list/be_special_flags = list(
|
||||
"Traitor" = BE_TRAITOR,
|
||||
@@ -45,7 +50,6 @@ var/list/be_special_flags = list(
|
||||
"Wizard" = BE_WIZARD,
|
||||
"Malf AI" = BE_MALF,
|
||||
"Revolutionary" = BE_REV,
|
||||
"Loyalist" = BE_LOYALIST,
|
||||
"Xenomorph" = BE_ALIEN,
|
||||
"Positronic Brain" = BE_AI,
|
||||
"Cultist" = BE_CULTIST,
|
||||
@@ -54,7 +58,13 @@ var/list/be_special_flags = list(
|
||||
"Raider" = BE_RAIDER,
|
||||
"Diona" = BE_PLANT,
|
||||
"Mutineer" = BE_MUTINEER,
|
||||
"pAI" = BE_PAI
|
||||
"Loyalist" = BE_LOYALIST,
|
||||
"pAI" = BE_PAI,
|
||||
//VOREStation Add
|
||||
"Lost Drone" = BE_LOSTDRONE,
|
||||
"Maint Pred" = BE_MAINTPRED,
|
||||
"Morph" = BE_MORPH,
|
||||
//VOREStation Add End
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -13,6 +13,8 @@
|
||||
|
||||
#define isitem(D) istype(D, /obj/item)
|
||||
|
||||
#define isradio(A) istype(A, /obj/item/device/radio)
|
||||
|
||||
#define isairlock(A) istype(A, /obj/machinery/door/airlock)
|
||||
|
||||
#define isorgan(A) istype(A, /obj/item/organ/external)
|
||||
|
||||
@@ -82,6 +82,7 @@
|
||||
#define LIGHT_COLOR_INCANDESCENT_TUBE "#FFFEB8"
|
||||
#define LIGHT_COLOR_INCANDESCENT_BULB "#FFDDBB"
|
||||
#define LIGHT_COLOR_INCANDESCENT_FLASHLIGHT "#FFCC66"
|
||||
#define LIGHT_COLOR_NIGHTSHIFT "#EFCC86"
|
||||
|
||||
//Fake ambient occlusion filter
|
||||
#define AMBIENT_OCCLUSION filter(type="drop_shadow", x=0, y=-1, size=2, offset=2, color="#04080F55") //VOREStation Edit for prettier visuals.
|
||||
|
||||
@@ -2,6 +2,7 @@ var/global/defer_powernet_rebuild = 0 // True if net rebuild will be called
|
||||
|
||||
#define CELLRATE 0.002 // Multiplier for watts per tick <> cell storage (e.g., 0.02 means if there is a load of 1000 watts, 20 units will be taken from a cell per second)
|
||||
// It's a conversion constant. power_used*CELLRATE = charge_provided, or charge_used/CELLRATE = power_provided
|
||||
#define SMESRATE 0.03333 // Same for SMESes. A different number for some reason.
|
||||
|
||||
#define KILOWATTS *1000
|
||||
#define MEGAWATTS *1000000
|
||||
@@ -17,6 +18,7 @@ var/global/defer_powernet_rebuild = 0 // True if net rebuild will be called
|
||||
#define USE_POWER_ACTIVE 2 // Machine is using power at its active power level
|
||||
|
||||
// Channel numbers for power.
|
||||
#define CURRENT_CHANNEL -1 // Passed as an argument this means "use whatever current channel is"
|
||||
#define EQUIP 1
|
||||
#define LIGHT 2
|
||||
#define ENVIRON 3
|
||||
|
||||
@@ -374,3 +374,7 @@ var/global/list/##LIST_NAME = list();\
|
||||
#define MOUSE_OPACITY_TRANSPARENT 0
|
||||
#define MOUSE_OPACITY_ICON 1
|
||||
#define MOUSE_OPACITY_OPAQUE 2
|
||||
|
||||
// Used by radios to indicate that they have sent a message via something other than subspace
|
||||
#define RADIO_CONNECTION_FAIL 0
|
||||
#define RADIO_CONNECTION_NON_SUBSPACE 1
|
||||
|
||||
@@ -48,6 +48,7 @@
|
||||
#define SHELTER_DEPLOY_BAD_TURFS "bad turfs"
|
||||
#define SHELTER_DEPLOY_BAD_AREA "bad area"
|
||||
#define SHELTER_DEPLOY_ANCHORED_OBJECTS "anchored objects"
|
||||
#define SHELTER_DEPLOY_SHIP_SPACE "ship not in space"
|
||||
|
||||
#define PTO_SECURITY "Security"
|
||||
#define PTO_MEDICAL "Medical"
|
||||
@@ -58,3 +59,7 @@
|
||||
#define PTO_CIVILIAN "Civilian"
|
||||
|
||||
#define DEPARTMENT_TALON "ITV Talon"
|
||||
|
||||
#define MAT_TITANIUMGLASS "ti-glass"
|
||||
#define MAT_PLASTITANIUM "plastitanium"
|
||||
#define MAT_PLASTANIUMGLASS "plastitanium glass"
|
||||
@@ -14,6 +14,7 @@
|
||||
#define GODMODE 0x1000
|
||||
#define FAKEDEATH 0x2000 // Replaces stuff like changeling.changeling_fakedeath.
|
||||
#define DISFIGURED 0x4000 // Set but never checked. Remove this sometime and replace occurences with the appropriate organ code
|
||||
#define DOING_TASK 0x8000 // Performing a do_after or do_mob that's exclusive
|
||||
|
||||
// Grab levels.
|
||||
#define GRAB_PASSIVE 1
|
||||
@@ -426,4 +427,6 @@
|
||||
#define EXAMINE_SKIPARMS 0x0020
|
||||
#define EXAMINE_SKIPHANDS 0x0040
|
||||
#define EXAMINE_SKIPLEGS 0x0080
|
||||
#define EXAMINE_SKIPFEET 0x0100
|
||||
#define EXAMINE_SKIPFEET 0x0100
|
||||
|
||||
#define MAX_NUTRITION 5000 //VOREStation Edit
|
||||
@@ -25,7 +25,7 @@
|
||||
//Qdel helper macros.
|
||||
#define QDEL_IN(item, time) addtimer(CALLBACK(GLOBAL_PROC, .proc/qdel, item), time, TIMER_STOPPABLE)
|
||||
#define QDEL_IN_CLIENT_TIME(item, time) addtimer(CALLBACK(GLOBAL_PROC, .proc/qdel, item), time, TIMER_STOPPABLE | TIMER_CLIENT_TIME)
|
||||
#define QDEL_NULL(item) qdel(item); item = null
|
||||
#define QDEL_NULL(item) if(item) {qdel(item); item = null}
|
||||
#define QDEL_NULL_LIST QDEL_LIST_NULL
|
||||
#define QDEL_LIST_NULL(x) if(x) { for(var/y in x) { qdel(y) } ; x = null }
|
||||
#define QDEL_LIST(L) if(L) { for(var/I in L) qdel(I); L.Cut(); }
|
||||
|
||||
@@ -54,13 +54,14 @@
|
||||
#define LANGUAGE_AKHANI "Akhani"
|
||||
#define LANGUAGE_ALAI "Alai"
|
||||
#define LANGUAGE_ZADDAT "Vedahq"
|
||||
#define LANGUAGE_PROMETHEAN "Promethean"
|
||||
#define LANGUAGE_BLOB "Blob"
|
||||
#define LANGUAGE_GIBBERISH "Babel"
|
||||
|
||||
// Language flags.
|
||||
#define WHITELISTED 1 // Language is available if the speaker is whitelisted.
|
||||
#define RESTRICTED 2 // Language can only be acquired by spawning or an admin.
|
||||
#define NONVERBAL 4 // Language has a significant non-verbal component. Speech is garbled without line-of-sight.
|
||||
#define NONVERBAL 4 // Language uses both verbal and non-verbal components completely to communicate. Out-of-sight speech is garbled.
|
||||
#define SIGNLANG 8 // Language is completely non-verbal. Speech is displayed through emotes for those who can understand.
|
||||
#define HIVEMIND 16 // Broadcast to all mobs with this language.
|
||||
#define NONGLOBAL 32 // Do not add to general languages list.
|
||||
|
||||
@@ -68,13 +68,15 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G
|
||||
#define INIT_ORDER_ASSETS -3
|
||||
#define INIT_ORDER_PLANETS -4
|
||||
#define INIT_ORDER_HOLOMAPS -5
|
||||
#define INIT_ORDER_OVERLAY -6
|
||||
#define INIT_ORDER_ALARM -7
|
||||
#define INIT_ORDER_NIGHTSHIFT -6
|
||||
#define INIT_ORDER_OVERLAY -7
|
||||
#define INIT_ORDER_ALARM -8
|
||||
#define INIT_ORDER_OPENSPACE -10
|
||||
#define INIT_ORDER_XENOARCH -20
|
||||
#define INIT_ORDER_CIRCUIT -21
|
||||
#define INIT_ORDER_AI -22
|
||||
#define INIT_ORDER_GAME_MASTER -24
|
||||
#define INIT_ORDER_AI_FAST -23
|
||||
#define INIT_ORDER_GAME_MASTER -24
|
||||
#define INIT_ORDER_TICKER -50
|
||||
#define INIT_ORDER_CHAT -100 //Should be last to ensure chat remains smooth during init.
|
||||
|
||||
@@ -83,6 +85,7 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G
|
||||
// If the subsystem isn't listed here it's either DEFAULT or PROCESS (if it's a processing subsystem child)
|
||||
#define FIRE_PRIORITY_SHUTTLES 5
|
||||
#define FIRE_PRIORITY_SUPPLY 5
|
||||
#define FIRE_PRIORITY_NIGHTSHIFT 5
|
||||
#define FIRE_PRIORITY_ORBIT 8
|
||||
#define FIRE_PRIORITY_VOTE 9
|
||||
#define FIRE_PRIORITY_AI 10
|
||||
|
||||
@@ -272,17 +272,17 @@
|
||||
var/list/hearturfs = list()
|
||||
|
||||
for(var/thing in hear)
|
||||
if(istype(thing,/obj))
|
||||
if(istype(thing, /obj)) //Can't use isobj() because /atom/movable returns true in that, and so lighting overlays would be included
|
||||
objs += thing
|
||||
hearturfs |= get_turf(thing)
|
||||
else if(istype(thing,/mob))
|
||||
if(ismob(thing))
|
||||
mobs += thing
|
||||
hearturfs |= get_turf(thing)
|
||||
|
||||
//A list of every mob with a client
|
||||
for(var/mob in player_list)
|
||||
//VOREStation Edit - Trying to fix some vorestation bug.
|
||||
if(!istype(mob, /mob))
|
||||
if(!ismob(mob))
|
||||
player_list -= mob
|
||||
crash_with("There is a null or non-mob reference inside player_list ([mob]).")
|
||||
continue
|
||||
|
||||
@@ -203,6 +203,13 @@ var/global/list/string_slot_flags = list(
|
||||
var/datum/poster/P = new T
|
||||
NT_poster_designs += P
|
||||
|
||||
// VOREStation Add - Vore Modes!
|
||||
paths = typesof(/datum/digest_mode) - /datum/digest_mode/transform
|
||||
for(var/T in paths)
|
||||
var/datum/digest_mode/DM = new T
|
||||
GLOB.digest_modes[DM.id] = DM
|
||||
// VOREStation Add End
|
||||
|
||||
return 1
|
||||
|
||||
/* // Uncomment to debug chemical reaction list.
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
|
||||
for(var/client/C in admins)
|
||||
if(C.is_preference_enabled(/datum/client_preference/debug/show_debug_logs))
|
||||
to_chat(C, "DEBUG: [text]")
|
||||
to_chat(C, "<span class='filter_debuglog'>DEBUG: [text]</span>")
|
||||
|
||||
/proc/log_game(text)
|
||||
if (config.log_game)
|
||||
|
||||
+24
-2
@@ -142,9 +142,14 @@ Proc for attack log creation, because really why not
|
||||
else
|
||||
return pick("chest", "groin")
|
||||
|
||||
/proc/do_mob(mob/user , mob/target, time = 30, target_zone = 0, uninterruptible = FALSE, progress = TRUE, ignore_movement = FALSE)
|
||||
/proc/do_mob(mob/user , mob/target, time = 30, target_zone = 0, uninterruptible = FALSE, progress = TRUE, ignore_movement = FALSE, exclusive = FALSE)
|
||||
if(!user || !target)
|
||||
return 0
|
||||
if(!time)
|
||||
return 1 //Done!
|
||||
if(user.status_flags & DOING_TASK)
|
||||
to_chat(user, "<span class='warning'>You're in the middle of doing something else already.</span>")
|
||||
return 0 //Performing an exclusive do_after or do_mob already
|
||||
var/user_loc = user.loc
|
||||
var/target_loc = target.loc
|
||||
|
||||
@@ -155,6 +160,10 @@ Proc for attack log creation, because really why not
|
||||
|
||||
var/endtime = world.time+time
|
||||
var/starttime = world.time
|
||||
|
||||
if(exclusive)
|
||||
user.status_flags |= DOING_TASK
|
||||
|
||||
. = TRUE
|
||||
while (world.time < endtime)
|
||||
stoplag(1)
|
||||
@@ -186,14 +195,20 @@ Proc for attack log creation, because really why not
|
||||
. = FALSE
|
||||
break
|
||||
|
||||
if(exclusive)
|
||||
user.status_flags &= ~DOING_TASK
|
||||
|
||||
if (progbar)
|
||||
qdel(progbar)
|
||||
|
||||
/proc/do_after(mob/user, delay, atom/target = null, needhand = TRUE, progress = TRUE, incapacitation_flags = INCAPACITATION_DEFAULT, ignore_movement = FALSE, max_distance = null)
|
||||
/proc/do_after(mob/user, delay, atom/target = null, needhand = TRUE, progress = TRUE, incapacitation_flags = INCAPACITATION_DEFAULT, ignore_movement = FALSE, max_distance = null, exclusive = FALSE)
|
||||
if(!user)
|
||||
return 0
|
||||
if(!delay)
|
||||
return 1 //Okay. Done.
|
||||
if(user.status_flags & DOING_TASK)
|
||||
to_chat(user, "<span class='warning'>You're in the middle of doing something else already.</span>")
|
||||
return 0 //Performing an exclusive do_after or do_mob already
|
||||
var/atom/target_loc = null
|
||||
if(target)
|
||||
target_loc = target.loc
|
||||
@@ -214,6 +229,10 @@ Proc for attack log creation, because really why not
|
||||
|
||||
var/endtime = world.time + delay
|
||||
var/starttime = world.time
|
||||
|
||||
if(exclusive)
|
||||
user.status_flags |= DOING_TASK
|
||||
|
||||
. = 1
|
||||
while (world.time < endtime)
|
||||
stoplag(1)
|
||||
@@ -250,6 +269,9 @@ Proc for attack log creation, because really why not
|
||||
. = FALSE
|
||||
break
|
||||
|
||||
if(exclusive)
|
||||
user.status_flags &= ~DOING_TASK
|
||||
|
||||
if(progbar)
|
||||
qdel(progbar)
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@ var/next_station_date_change = 1 DAY
|
||||
if(!station_date || update_time)
|
||||
var/extra_days = round(station_time_in_ticks / (1 DAY)) DAYS
|
||||
var/timeofday = world.timeofday + extra_days
|
||||
station_date = num2text((text2num(time2text(timeofday, "YYYY"))+544)) + "-" + time2text(timeofday, "MM-DD")
|
||||
station_date = num2text((text2num(time2text(timeofday, "YYYY"))+300)) + "-" + time2text(timeofday, "MM-DD") //VOREStation Edit
|
||||
return station_date
|
||||
|
||||
//ISO 8601
|
||||
|
||||
@@ -1276,14 +1276,8 @@ var/mob/dview/dview_mob = new
|
||||
if(!center)
|
||||
return
|
||||
|
||||
//VOREStation Add - Emergency Backup
|
||||
if(!dview_mob)
|
||||
dview_mob = new()
|
||||
WARNING("dview mob was lost, and had to be recreated!")
|
||||
//VOREStation Add End
|
||||
|
||||
dview_mob.loc = center
|
||||
|
||||
|
||||
dview_mob.see_invisible = invis_flags
|
||||
|
||||
. = view(range, dview_mob)
|
||||
|
||||
+7
-12
@@ -23,9 +23,10 @@
|
||||
|
||||
|
||||
/mob/living/silicon/ai/ClickOn(var/atom/A, params)
|
||||
if(world.time <= next_click)
|
||||
if(!checkClickCooldown())
|
||||
return
|
||||
next_click = world.time + 1
|
||||
|
||||
setClickCooldown(1)
|
||||
|
||||
if(client.buildmode) // comes after object.Click to allow buildmode gui objects to be clicked
|
||||
build_click(src, client.buildmode, params, A)
|
||||
@@ -34,6 +35,9 @@
|
||||
if(stat)
|
||||
return
|
||||
|
||||
if(control_disabled)
|
||||
return
|
||||
|
||||
var/list/modifiers = params2list(params)
|
||||
if(modifiers["shift"] && modifiers["ctrl"])
|
||||
CtrlShiftClickOn(A)
|
||||
@@ -44,27 +48,18 @@
|
||||
if(modifiers["shift"])
|
||||
ShiftClickOn(A)
|
||||
return
|
||||
if(modifiers["alt"]) // alt and alt-gr (rightalt)
|
||||
if(modifiers["alt"])
|
||||
AltClickOn(A)
|
||||
return
|
||||
if(modifiers["ctrl"])
|
||||
CtrlClickOn(A)
|
||||
return
|
||||
|
||||
if(control_disabled || !canClick())
|
||||
return
|
||||
|
||||
if(aiCamera.in_camera_mode)
|
||||
aiCamera.camera_mode_off()
|
||||
aiCamera.captureimage(A, usr)
|
||||
return
|
||||
|
||||
/*
|
||||
AI restrained() currently does nothing
|
||||
if(restrained())
|
||||
RestrainedClickOn(A)
|
||||
else
|
||||
*/
|
||||
A.add_hiddenprint(src)
|
||||
A.attack_ai(src)
|
||||
|
||||
|
||||
+7
-10
@@ -38,10 +38,10 @@
|
||||
* mob/RangedAttack(atom,params) - used only ranged, only used for tk and laser eyes but could be changed
|
||||
*/
|
||||
/mob/proc/ClickOn(var/atom/A, var/params)
|
||||
if(world.time <= next_click) // Hard check, before anything else, to avoid crashing
|
||||
if(!checkClickCooldown()) // Hard check, before anything else, to avoid crashing
|
||||
return
|
||||
|
||||
next_click = world.time + 1
|
||||
setClickCooldown(1)
|
||||
|
||||
if(client && client.buildmode)
|
||||
build_click(src, client.buildmode, params, A)
|
||||
@@ -69,9 +69,6 @@
|
||||
|
||||
face_atom(A) // change direction to face what you clicked on
|
||||
|
||||
if(!canClick()) // in the year 2000...
|
||||
return
|
||||
|
||||
if(istype(loc, /obj/mecha))
|
||||
if(!locate(/turf) in list(A, A.loc)) // Prevents inventory from being drilled
|
||||
return
|
||||
@@ -156,12 +153,12 @@
|
||||
return 1
|
||||
|
||||
/mob/proc/setClickCooldown(var/timeout)
|
||||
next_move = max(world.time + timeout, next_move)
|
||||
next_click = max(world.time + timeout, next_click)
|
||||
|
||||
/mob/proc/canClick()
|
||||
if(config.no_click_cooldown || next_move <= world.time)
|
||||
return 1
|
||||
return 0
|
||||
/mob/proc/checkClickCooldown()
|
||||
if(next_click > world.time && !config.no_click_cooldown)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
// Default behavior: ignore double clicks, the second click that makes the doubleclick call already calls for a normal click
|
||||
/mob/proc/DblClickOn(var/atom/A, var/params)
|
||||
|
||||
@@ -7,9 +7,10 @@
|
||||
*/
|
||||
|
||||
/mob/living/silicon/robot/ClickOn(var/atom/A, var/params)
|
||||
if(world.time <= next_click)
|
||||
if(!checkClickCooldown())
|
||||
return
|
||||
next_click = world.time + 1
|
||||
|
||||
setClickCooldown(1)
|
||||
|
||||
if(client.buildmode) // comes after object.Click to allow buildmode gui objects to be clicked
|
||||
build_click(src, client.buildmode, params, A)
|
||||
@@ -35,9 +36,6 @@
|
||||
if(stat || lockdown || weakened || stunned || paralysis)
|
||||
return
|
||||
|
||||
if(!canClick())
|
||||
return
|
||||
|
||||
face_atom(A) // change direction to face what you clicked on
|
||||
|
||||
if(aiCamera && aiCamera.in_camera_mode)
|
||||
|
||||
@@ -123,7 +123,7 @@
|
||||
if(modifiers["shift"])
|
||||
moved = 0
|
||||
return 1
|
||||
if(usr.next_move >= world.time) // Is this needed ?
|
||||
if(!usr.checkClickCooldown())
|
||||
return
|
||||
owner.Trigger()
|
||||
return 1
|
||||
|
||||
@@ -236,6 +236,8 @@
|
||||
mymob.internals = new /obj/screen()
|
||||
mymob.internals.icon = ui_style
|
||||
mymob.internals.icon_state = "internal0"
|
||||
if(istype(target.internal, /obj/item/weapon/tank)) //Internals on already? Iight, prove it
|
||||
mymob.internals.icon_state = "internal1"
|
||||
mymob.internals.name = "internal"
|
||||
mymob.internals.screen_loc = ui_internal
|
||||
hud_elements |= mymob.internals
|
||||
|
||||
@@ -17,6 +17,10 @@ GLOBAL_LIST_EMPTY(radial_menus)
|
||||
var/next_page = FALSE
|
||||
var/tooltips = FALSE
|
||||
|
||||
/obj/screen/radial/Destroy()
|
||||
parent = null
|
||||
return ..()
|
||||
|
||||
/obj/screen/radial/slice/MouseEntered(location, control, params)
|
||||
. = ..()
|
||||
icon_state = "radial_slice_focus"
|
||||
@@ -279,6 +283,8 @@ GLOBAL_LIST_EMPTY(radial_menus)
|
||||
/datum/radial_menu/Destroy()
|
||||
Reset()
|
||||
hide()
|
||||
QDEL_LIST_NULL(elements)
|
||||
QDEL_NULL(close_button)
|
||||
QDEL_NULL(custom_check_callback)
|
||||
. = ..()
|
||||
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
/obj/screen/item_action/Click()
|
||||
if(!usr || !owner)
|
||||
return 1
|
||||
if(!usr.canClick())
|
||||
if(!usr.checkClickCooldown())
|
||||
return
|
||||
|
||||
if(usr.stat || usr.restrained() || usr.stunned || usr.lying)
|
||||
@@ -85,7 +85,7 @@
|
||||
name = "storage"
|
||||
|
||||
/obj/screen/storage/Click()
|
||||
if(!usr.canClick())
|
||||
if(!usr.checkClickCooldown())
|
||||
return 1
|
||||
if(usr.stat || usr.paralysis || usr.stunned || usr.weakened)
|
||||
return 1
|
||||
@@ -494,7 +494,7 @@
|
||||
/obj/screen/inventory/Click()
|
||||
// At this point in client Click() code we have passed the 1/10 sec check and little else
|
||||
// We don't even know if it's a middle click
|
||||
if(!usr.canClick())
|
||||
if(!usr.checkClickCooldown())
|
||||
return 1
|
||||
if(usr.stat || usr.paralysis || usr.stunned || usr.weakened)
|
||||
return 1
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
if(client.buildmode)
|
||||
build_click(src, client.buildmode, params, A)
|
||||
return
|
||||
if(!canClick()) return
|
||||
if(!checkClickCooldown()) return
|
||||
setClickCooldown(4)
|
||||
// You are responsible for checking config.ghost_interaction when you override this function
|
||||
// Not all of them require checking, see below
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
return loc == card
|
||||
|
||||
/mob/living/proc/HardsuitClickOn(var/atom/A, var/alert_ai = 0)
|
||||
if(!can_use_rig() || !canClick())
|
||||
if(!can_use_rig())
|
||||
return 0
|
||||
var/obj/item/weapon/rig/rig = get_rig()
|
||||
if(istype(rig) && !rig.offline && rig.selected_module)
|
||||
|
||||
@@ -125,7 +125,7 @@ var/const/EXP_FREQ = 1361
|
||||
var/const/MED_I_FREQ = 1485
|
||||
var/const/SEC_I_FREQ = 1475
|
||||
|
||||
var/const/TALON_FREQ = 1481 //VOREStation Add
|
||||
var/const/TALON_FREQ = 1363 //VOREStation Add
|
||||
|
||||
var/list/radiochannels = list(
|
||||
"Common" = PUB_FREQ,
|
||||
|
||||
@@ -271,6 +271,9 @@ var/list/gamemode_cache = list()
|
||||
// disables the annoying "You have already logged in this round, disconnect or be banned" popup for multikeying, because it annoys the shit out of me when testing.
|
||||
var/static/disable_cid_warn_popup = FALSE
|
||||
|
||||
// whether or not to use the nightshift subsystem to perform lighting changes
|
||||
var/static/enable_night_shifts = FALSE
|
||||
|
||||
/datum/configuration/New()
|
||||
var/list/L = typesof(/datum/game_mode) - /datum/game_mode
|
||||
for (var/T in L)
|
||||
@@ -892,6 +895,9 @@ var/list/gamemode_cache = list()
|
||||
if("disable_cid_warn_popup")
|
||||
config.disable_cid_warn_popup = TRUE
|
||||
|
||||
if("enable_night_shifts")
|
||||
config.enable_night_shifts = TRUE
|
||||
|
||||
else
|
||||
log_misc("Unknown setting in configuration: '[name]'")
|
||||
|
||||
|
||||
@@ -58,7 +58,7 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle = new
|
||||
if (evac)
|
||||
emergency_shuttle_docked.Announce(replacetext(replacetext(using_map.emergency_shuttle_docked_message, "%dock_name%", "[using_map.dock_name]"), "%ETD%", "[estimated_time] minute\s"))
|
||||
else
|
||||
priority_announcement.Announce(replacetext(replacetext(using_map.shuttle_docked_message, "%dock_name%", "[using_map.dock_name]"), "%ETD%", "[estimated_time] minute\s"))
|
||||
priority_announcement.Announce(replacetext(replacetext(using_map.shuttle_docked_message, "%dock_name%", "[using_map.dock_name]"), "%ETD%", "[estimated_time] minute\s"), "Transfer System", 'sound/AI/tramarrived.ogg') //VOREStation Edit - TTS
|
||||
|
||||
//arm the escape pods
|
||||
if (evac)
|
||||
@@ -115,7 +115,7 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle = new
|
||||
shuttle.move_time = SHUTTLE_TRANSIT_DURATION
|
||||
var/estimated_time = round(estimate_arrival_time()/60,1)
|
||||
|
||||
priority_announcement.Announce(replacetext(replacetext(using_map.shuttle_called_message, "%dock_name%", "[using_map.dock_name]"), "%ETA%", "[estimated_time] minute\s"))
|
||||
priority_announcement.Announce(replacetext(replacetext(using_map.shuttle_called_message, "%dock_name%", "[using_map.dock_name]"), "%ETA%", "[estimated_time] minute\s"), "Transfer System", 'sound/AI/tramcalled.ogg') //VOREStation Edit - TTS
|
||||
atc.shift_ending()
|
||||
|
||||
//recalls the shuttle
|
||||
|
||||
@@ -2,8 +2,8 @@ SUBSYSTEM_DEF(ai)
|
||||
name = "AI"
|
||||
init_order = INIT_ORDER_AI
|
||||
priority = FIRE_PRIORITY_AI
|
||||
wait = 5 // This gets run twice a second, however this is technically two loops in one, with the second loop being run every four iterations.
|
||||
flags = SS_NO_INIT|SS_TICKER
|
||||
wait = 2 SECONDS
|
||||
flags = SS_NO_INIT
|
||||
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
|
||||
|
||||
var/list/processing = list()
|
||||
@@ -22,15 +22,11 @@ SUBSYSTEM_DEF(ai)
|
||||
var/list/currentrun = src.currentrun
|
||||
|
||||
while(currentrun.len)
|
||||
// var/mob/living/L = currentrun[currentrun.len]
|
||||
var/datum/ai_holder/A = currentrun[currentrun.len]
|
||||
--currentrun.len
|
||||
if(!A || QDELETED(A) || A.busy) // Doesn't exist or won't exist soon or not doing it this tick
|
||||
continue
|
||||
if(times_fired % 4 == 0 && A.holder.stat != DEAD)
|
||||
A.handle_strategicals()
|
||||
if(A.holder.stat != DEAD) // The /TG/ version checks stat twice, presumably in-case processing somehow got the mob killed in that instant.
|
||||
A.handle_tactics()
|
||||
A.handle_strategicals()
|
||||
|
||||
if(MC_TICK_CHECK)
|
||||
return
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
SUBSYSTEM_DEF(aifast)
|
||||
name = "AI (Fast)"
|
||||
init_order = INIT_ORDER_AI_FAST
|
||||
priority = FIRE_PRIORITY_AI
|
||||
wait = 0.25 SECONDS // Every quarter second
|
||||
flags = SS_NO_INIT
|
||||
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
|
||||
|
||||
var/list/processing = list()
|
||||
var/list/currentrun = list()
|
||||
|
||||
/datum/controller/subsystem/aifast/stat_entry(msg_prefix)
|
||||
var/list/msg = list(msg_prefix)
|
||||
msg += "P:[processing.len]"
|
||||
..(msg.Join())
|
||||
|
||||
/datum/controller/subsystem/aifast/fire(resumed = 0)
|
||||
if (!resumed)
|
||||
src.currentrun = processing.Copy()
|
||||
|
||||
//cache for sanic speed (lists are references anyways)
|
||||
var/list/currentrun = src.currentrun
|
||||
|
||||
while(currentrun.len)
|
||||
var/datum/ai_holder/A = currentrun[currentrun.len]
|
||||
--currentrun.len
|
||||
if(!A || QDELETED(A) || A.busy) // Doesn't exist or won't exist soon or not doing it this tick
|
||||
continue
|
||||
A.handle_tactics()
|
||||
|
||||
if(MC_TICK_CHECK)
|
||||
return
|
||||
@@ -6,9 +6,11 @@ SUBSYSTEM_DEF(assets)
|
||||
var/list/preload = list()
|
||||
|
||||
/datum/controller/subsystem/assets/Initialize(timeofday)
|
||||
for(var/type in typesof(/datum/asset) - list(/datum/asset, /datum/asset/simple))
|
||||
var/datum/asset/A = new type()
|
||||
A.register()
|
||||
for(var/type in typesof(/datum/asset))
|
||||
var/datum/asset/A = type
|
||||
if (type != initial(A._abstract))
|
||||
get_asset_datum(type)
|
||||
|
||||
|
||||
preload = cache.Copy() //don't preload assets generated during the round
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ SUBSYSTEM_DEF(inactivity)
|
||||
var/client/C = client_list[client_list.len]
|
||||
client_list.len--
|
||||
if(C.is_afk(config.kick_inactive MINUTES) && can_kick(C))
|
||||
to_chat(C, "<span class='warning'>You have been inactive for more than [config.kick_inactive] minute\s and have been disconnected.</span>")
|
||||
to_chat_immediate(C, world.time, "<span class='warning'>You have been inactive for more than [config.kick_inactive] minute\s and have been disconnected.</span>")
|
||||
|
||||
var/information
|
||||
if(C.mob)
|
||||
|
||||
@@ -121,10 +121,8 @@ SUBSYSTEM_DEF(machines)
|
||||
while(current_run.len)
|
||||
var/obj/machinery/M = current_run[current_run.len]
|
||||
current_run.len--
|
||||
if(istype(M) && !QDELETED(M) && !(M.process(wait) == PROCESS_KILL))
|
||||
if(M.use_power)
|
||||
M.auto_use_power()
|
||||
else
|
||||
|
||||
if(!istype(M) || QDELETED(M) || (M.process(wait) == PROCESS_KILL))
|
||||
global.processing_machines.Remove(M)
|
||||
if(!QDELETED(M))
|
||||
DISABLE_BITFIELD(M.datum_flags, DF_ISPROCESSING)
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
SUBSYSTEM_DEF(nightshift)
|
||||
name = "Night Shift"
|
||||
init_order = INIT_ORDER_NIGHTSHIFT
|
||||
priority = FIRE_PRIORITY_NIGHTSHIFT
|
||||
wait = 60 SECONDS
|
||||
flags = SS_NO_TICK_CHECK
|
||||
|
||||
var/nightshift_active = FALSE
|
||||
var/nightshift_first_check = 30 SECONDS
|
||||
|
||||
var/high_security_mode = FALSE
|
||||
|
||||
/datum/controller/subsystem/nightshift/Initialize()
|
||||
if(!config.enable_night_shifts)
|
||||
can_fire = FALSE
|
||||
/*
|
||||
if(config.randomize_shift_time)
|
||||
GLOB.gametime_offset = rand(0, 23) HOURS
|
||||
*/
|
||||
return ..()
|
||||
|
||||
/datum/controller/subsystem/nightshift/fire(resumed = FALSE)
|
||||
if(round_duration_in_ticks < nightshift_first_check)
|
||||
return
|
||||
check_nightshift()
|
||||
|
||||
/datum/controller/subsystem/nightshift/proc/announce(message)
|
||||
var/announce_z
|
||||
if(using_map.station_levels.len)
|
||||
announce_z = pick(using_map.station_levels)
|
||||
//VOREStation Edit - TTS
|
||||
var/pickedsound
|
||||
if(!high_security_mode)
|
||||
if(nightshift_active)
|
||||
pickedsound = 'sound/AI/dim_lights.ogg'
|
||||
else
|
||||
pickedsound = 'sound/AI/bright_lights.ogg'
|
||||
priority_announcement.Announce(message, new_title = "Automated Lighting System Announcement", new_sound = pickedsound, zlevel = announce_z)
|
||||
//VOREStation Edit End
|
||||
|
||||
/datum/controller/subsystem/nightshift/proc/check_nightshift(check_canfire=FALSE) //This is called from elsewhere, like setting the alert levels
|
||||
if(check_canfire && !can_fire)
|
||||
return
|
||||
var/emergency = security_level > SEC_LEVEL_GREEN
|
||||
var/announcing = TRUE
|
||||
var/night_time = using_map.get_nightshift()
|
||||
if(high_security_mode != emergency)
|
||||
high_security_mode = emergency
|
||||
if(night_time)
|
||||
announcing = FALSE
|
||||
if(!emergency)
|
||||
announce("Restoring night lighting configuration to normal operation.")
|
||||
else
|
||||
announce("Disabling night lighting: Station is in a state of emergency.")
|
||||
if(emergency)
|
||||
night_time = FALSE
|
||||
if(nightshift_active != night_time)
|
||||
update_nightshift(night_time, announcing)
|
||||
|
||||
/datum/controller/subsystem/nightshift/proc/update_nightshift(active, announce = TRUE)
|
||||
nightshift_active = active
|
||||
if(announce)
|
||||
if(active)
|
||||
announce("Good evening, crew. To reduce power consumption and stimulate the circadian rhythms of some species, all of the lights aboard the station have been dimmed for the night.")
|
||||
else
|
||||
announce("Good morning, crew. As it is now day time, all of the lights aboard the station have been restored to their former brightness.")
|
||||
for(var/obj/machinery/power/apc/apc in machines)
|
||||
if(apc.z in using_map.station_levels)
|
||||
apc.set_nightshift(active, TRUE)
|
||||
CHECK_TICK
|
||||
@@ -6,16 +6,16 @@ SUBSYSTEM_DEF(planets)
|
||||
flags = SS_BACKGROUND
|
||||
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
|
||||
|
||||
var/list/new_outdoor_turfs = list()
|
||||
var/list/new_outdoor_walls = list()
|
||||
var/static/list/new_outdoor_turfs = list()
|
||||
var/static/list/new_outdoor_walls = list()
|
||||
|
||||
var/list/planets = list()
|
||||
var/list/z_to_planet = list()
|
||||
var/static/list/planets = list()
|
||||
var/static/list/z_to_planet = list()
|
||||
|
||||
var/list/currentrun = list()
|
||||
var/static/list/currentrun = list()
|
||||
|
||||
var/list/needs_sun_update = list()
|
||||
var/list/needs_temp_update = list()
|
||||
var/static/list/needs_sun_update = list()
|
||||
var/static/list/needs_temp_update = list()
|
||||
|
||||
/datum/controller/subsystem/planets/Initialize(timeofday)
|
||||
admin_notice("<span class='danger'>Initializing planetary weather.</span>", R_DEBUG)
|
||||
|
||||
@@ -72,8 +72,8 @@ var/global/datum/controller/subsystem/ticker/ticker
|
||||
post_game_tick()
|
||||
|
||||
/datum/controller/subsystem/ticker/proc/pregame_welcome()
|
||||
to_chat(world, "<B><FONT color='blue'>Welcome to the pregame lobby!</FONT></B>")
|
||||
to_chat(world, "Please set up your character and select ready. The round will start in [pregame_timeleft] seconds.")
|
||||
to_world("<span class='boldannounce notice'><em>Welcome to the pregame lobby!</em></span>")
|
||||
to_world("<span class='boldannounce notice'>Please set up your character and select ready. The round will start in [pregame_timeleft] seconds.</span>")
|
||||
|
||||
// Called during GAME_STATE_PREGAME (RUNLEVEL_LOBBY)
|
||||
/datum/controller/subsystem/ticker/proc/pregame_tick()
|
||||
@@ -120,7 +120,7 @@ var/global/datum/controller/subsystem/ticker/ticker
|
||||
var/list/runnable_modes = config.get_runnable_modes()
|
||||
if((master_mode == "random") || (master_mode == "secret"))
|
||||
if(!runnable_modes.len)
|
||||
to_chat(world, "<B>Unable to choose playable game mode.</B> Reverting to pregame lobby.")
|
||||
to_world("<span class='danger'><B>Unable to choose playable game mode.</B> Reverting to pregame lobby.</span>")
|
||||
return 0
|
||||
if(secret_force_mode != "secret")
|
||||
src.mode = config.pick_mode(secret_force_mode)
|
||||
@@ -133,7 +133,7 @@ var/global/datum/controller/subsystem/ticker/ticker
|
||||
src.mode = config.pick_mode(master_mode)
|
||||
|
||||
if(!src.mode)
|
||||
to_chat(world, "<span class='danger'>Serious error in mode setup!</span> Reverting to pregame lobby.") //Uses setup instead of set up due to computational context.
|
||||
to_world("<span class='danger'>Serious error in mode setup! Reverting to pregame lobby.</span>") //Uses setup instead of set up due to computational context.
|
||||
return 0
|
||||
|
||||
job_master.ResetOccupations()
|
||||
@@ -142,21 +142,21 @@ var/global/datum/controller/subsystem/ticker/ticker
|
||||
job_master.DivideOccupations() // Apparently important for new antagonist system to register specific job antags properly.
|
||||
|
||||
if(!src.mode.can_start())
|
||||
to_world("<B>Unable to start [mode.name].</B> Not enough players readied, [config.player_requirements[mode.config_tag]] players needed. Reverting to pregame lobby.")
|
||||
to_world("<span class='danger'><B>Unable to start [mode.name].</B> Not enough players readied, [config.player_requirements[mode.config_tag]] players needed. Reverting to pregame lobby.</span>")
|
||||
mode.fail_setup()
|
||||
mode = null
|
||||
job_master.ResetOccupations()
|
||||
return 0
|
||||
|
||||
if(hide_mode)
|
||||
to_world("<B>The current game mode is - Secret!</B>")
|
||||
to_world("<span class='notice'><B>The current game mode is - Secret!</B></span>")
|
||||
if(runnable_modes.len)
|
||||
var/list/tmpmodes = new
|
||||
for (var/datum/game_mode/M in runnable_modes)
|
||||
tmpmodes+=M.name
|
||||
tmpmodes = sortList(tmpmodes)
|
||||
if(tmpmodes.len)
|
||||
to_chat(world, "<B>Possibilities:</B> [english_list(tmpmodes, and_text= "; ", comma_text = "; ")]")
|
||||
to_world("<span class='info'><B>Possibilities:</B> [english_list(tmpmodes, and_text= "; ", comma_text = "; ")]</span>")
|
||||
else
|
||||
src.mode.announce()
|
||||
return 1
|
||||
@@ -178,7 +178,7 @@ var/global/datum/controller/subsystem/ticker/ticker
|
||||
//Deleting Startpoints but we need the ai point to AI-ize people later
|
||||
if (S.name != "AI")
|
||||
qdel(S)
|
||||
to_chat(world, "<FONT color='blue'><B>Enjoy the game!</B></FONT>")
|
||||
to_world("<span class='boldannounce notice'><em>Enjoy the game!</em></span>")
|
||||
world << sound('sound/AI/welcome.ogg') // Skie
|
||||
//Holiday Round-start stuff ~Carn
|
||||
Holiday_Game_Start()
|
||||
@@ -227,7 +227,7 @@ var/global/datum/controller/subsystem/ticker/ticker
|
||||
end_game_state = END_GAME_MODE_FINISHED // Only do this cleanup once!
|
||||
mode.cleanup()
|
||||
//call a transfer shuttle vote
|
||||
to_chat(world, "<span class='danger'>The round has ended!</span>")
|
||||
to_world("<span class='danger'>The round has ended!</span>")
|
||||
SSvote.autotransfer()
|
||||
|
||||
// Called during GAME_STATE_FINISHED (RUNLEVEL_POSTGAME)
|
||||
@@ -240,7 +240,7 @@ var/global/datum/controller/subsystem/ticker/ticker
|
||||
feedback_set_details("end_proper", "nuke")
|
||||
restart_timeleft = 1 MINUTE // No point waiting five minutes if everyone's dead.
|
||||
if(!delay_end)
|
||||
to_chat(world, "<span class='notice'><b>Rebooting due to destruction of [station_name()] in [round(restart_timeleft/600)] minute\s.</b></span>")
|
||||
to_world("<span class='notice'><b>Rebooting due to destruction of [station_name()] in [round(restart_timeleft/600)] minute\s.</b></span>")
|
||||
last_restart_notify = world.time
|
||||
else
|
||||
feedback_set_details("end_proper", "proper completion")
|
||||
@@ -254,12 +254,12 @@ var/global/datum/controller/subsystem/ticker/ticker
|
||||
if(END_GAME_ENDING)
|
||||
restart_timeleft -= (world.time - last_fire)
|
||||
if(delay_end)
|
||||
to_chat(world, "<span class='notice'><b>An admin has delayed the round end.</b></span>")
|
||||
to_world("<span class='notice'><b>An admin has delayed the round end.</b></span>")
|
||||
end_game_state = END_GAME_DELAYED
|
||||
else if(restart_timeleft <= 0)
|
||||
world.Reboot()
|
||||
else if (world.time - last_restart_notify >= 1 MINUTE)
|
||||
to_chat(world, "<span class='notice'><b>Restarting in [round(restart_timeleft/600, 1)] minute\s.</b></span>")
|
||||
to_world("<span class='notice'><b>Restarting in [round(restart_timeleft/600, 1)] minute\s.</b></span>")
|
||||
last_restart_notify = world.time
|
||||
return
|
||||
if(END_GAME_DELAYED)
|
||||
@@ -430,47 +430,47 @@ var/global/datum/controller/subsystem/ticker/ticker
|
||||
if(captainless)
|
||||
for(var/mob/M in player_list)
|
||||
if(!istype(M,/mob/new_player))
|
||||
to_chat(M, "Colony Directorship not forced on anyone.")
|
||||
to_chat(M, "<span class='notice'>Colony Directorship not forced on anyone.</span>")
|
||||
|
||||
|
||||
/datum/controller/subsystem/ticker/proc/declare_completion()
|
||||
to_world("<br><br><br><H1>A round of [mode.name] has ended!</H1>")
|
||||
to_world("<span class='filter_system'><br><br><br><H1>A round of [mode.name] has ended!</H1></span>")
|
||||
for(var/mob/Player in player_list)
|
||||
if(Player.mind && !isnewplayer(Player))
|
||||
if(Player.stat != DEAD)
|
||||
var/turf/playerTurf = get_turf(Player)
|
||||
if(emergency_shuttle.departed && emergency_shuttle.evac)
|
||||
if(isNotAdminLevel(playerTurf.z))
|
||||
to_chat(Player, "<font color='blue'><b>You survived the round, but remained on [station_name()] as [Player.real_name].</b></font>")
|
||||
to_chat(Player, "<span class='filter_system'><font color='blue'><b>You survived the round, but remained on [station_name()] as [Player.real_name].</b></font></span>")
|
||||
else
|
||||
to_chat(Player, "<font color='green'><b>You managed to survive the events on [station_name()] as [Player.real_name].</b></font>")
|
||||
to_chat(Player, "<span class='filter_system'><font color='green'><b>You managed to survive the events on [station_name()] as [Player.real_name].</b></font></span>")
|
||||
else if(isAdminLevel(playerTurf.z))
|
||||
to_chat(Player, "<font color='green'><b>You successfully underwent crew transfer after events on [station_name()] as [Player.real_name].</b></font>")
|
||||
to_chat(Player, "<span class='filter_system'><font color='green'><b>You successfully underwent crew transfer after events on [station_name()] as [Player.real_name].</b></font></span>")
|
||||
else if(issilicon(Player))
|
||||
to_chat(Player, "<font color='green'><b>You remain operational after the events on [station_name()] as [Player.real_name].</b></font>")
|
||||
to_chat(Player, "<span class='filter_system'><font color='green'><b>You remain operational after the events on [station_name()] as [Player.real_name].</b></font></span>")
|
||||
else
|
||||
to_chat(Player, "<font color='blue'><b>You missed the crew transfer after the events on [station_name()] as [Player.real_name].</b></font>")
|
||||
to_chat(Player, "<span class='filter_system'><font color='blue'><b>You missed the crew transfer after the events on [station_name()] as [Player.real_name].</b></font></span>")
|
||||
else
|
||||
if(istype(Player,/mob/observer/dead))
|
||||
var/mob/observer/dead/O = Player
|
||||
if(!O.started_as_observer)
|
||||
to_chat(Player, "<font color='red'><b>You did not survive the events on [station_name()]...</b></font>")
|
||||
to_chat(Player, "<span class='filter_system'><font color='red'><b>You did not survive the events on [station_name()]...</b></font></span>")
|
||||
else
|
||||
to_chat(Player, "<font color='red'><b>You did not survive the events on [station_name()]...</b></font>")
|
||||
to_chat(Player, "<span class='filter_system'><font color='red'><b>You did not survive the events on [station_name()]...</b></font></span>")
|
||||
to_world("<br>")
|
||||
|
||||
for (var/mob/living/silicon/ai/aiPlayer in mob_list)
|
||||
if (aiPlayer.stat != 2)
|
||||
to_world("<b>[aiPlayer.name] (Played by: [aiPlayer.key])'s laws at the end of the round were:</b>")
|
||||
to_world("<span class='filter_system'><b>[aiPlayer.name] (Played by: [aiPlayer.key])'s laws at the end of the round were:</b></span>")
|
||||
else
|
||||
to_world("<b>[aiPlayer.name] (Played by: [aiPlayer.key])'s laws when it was deactivated were:</b>")
|
||||
to_world("<span class='filter_system'><b>[aiPlayer.name] (Played by: [aiPlayer.key])'s laws when it was deactivated were:</b></span>")
|
||||
aiPlayer.show_laws(1)
|
||||
|
||||
if (aiPlayer.connected_robots.len)
|
||||
var/robolist = "<b>The AI's loyal minions were:</b> "
|
||||
for(var/mob/living/silicon/robot/robo in aiPlayer.connected_robots)
|
||||
robolist += "[robo.name][robo.stat?" (Deactivated) (Played by: [robo.key]), ":" (Played by: [robo.key]), "]"
|
||||
to_world("[robolist]")
|
||||
to_world("<span class='filter_system'>[robolist]</span>")
|
||||
|
||||
var/dronecount = 0
|
||||
|
||||
@@ -482,15 +482,15 @@ var/global/datum/controller/subsystem/ticker/ticker
|
||||
|
||||
if (!robo.connected_ai)
|
||||
if (robo.stat != 2)
|
||||
to_world("<b>[robo.name] (Played by: [robo.key]) survived as an AI-less stationbound synthetic! Its laws were:</b>")
|
||||
to_world("<span class='filter_system'><b>[robo.name] (Played by: [robo.key]) survived as an AI-less stationbound synthetic! Its laws were:</b></span>")
|
||||
else
|
||||
to_world("<b>[robo.name] (Played by: [robo.key]) was unable to survive the rigors of being a stationbound synthetic without an AI. Its laws were:</b>")
|
||||
to_world("<span class='filter_system'><b>[robo.name] (Played by: [robo.key]) was unable to survive the rigors of being a stationbound synthetic without an AI. Its laws were:</b></span>")
|
||||
|
||||
if(robo) //How the hell do we lose robo between here and the world messages directly above this?
|
||||
robo.laws.show_laws(world)
|
||||
|
||||
if(dronecount)
|
||||
to_world("<b>There [dronecount>1 ? "were" : "was"] [dronecount] industrious maintenance [dronecount>1 ? "drones" : "drone"] at the end of this round.</b>")
|
||||
to_world("<span class='filter_system'><b>There [dronecount>1 ? "were" : "was"] [dronecount] industrious maintenance [dronecount>1 ? "drones" : "drone"] at the end of this round.</b></span>")
|
||||
|
||||
mode.declare_completion()//To declare normal completion.
|
||||
|
||||
|
||||
@@ -125,7 +125,7 @@
|
||||
/datum/ghost_query/lost_drone
|
||||
role_name = "Lost Drone"
|
||||
question = "A lost drone onboard has been discovered by a crewmember and they are attempting to reactivate it. Would you like to play as the drone?"
|
||||
//be_special_flag = BE_AI //VOREStation Removal: Positronic role is never used because intended purpose is unfitting, so remove the check
|
||||
be_special_flag = BE_LOSTDRONE //VOREStation Edit
|
||||
check_bans = list("AI", "Cyborg")
|
||||
cutoff_number = 1
|
||||
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
/datum/ghost_query/morph
|
||||
role_name = "Morph"
|
||||
be_special_flag = BE_MORPH
|
||||
question = "A weird morphic creature appears to have snuck onstation. Do you want to play as it? ((Expect to be treated as vore predator.))"
|
||||
cutoff_number = 1
|
||||
|
||||
/datum/ghost_query/maints_pred
|
||||
role_name = "Maintenance Predator"
|
||||
be_special_flag = BE_MAINTPRED
|
||||
question = "It appears a predatory critter is lurking in the maintenance. Do you want to play as it? ((You get to choose type of critter. Expect to be treated as vore predator.))"
|
||||
cutoff_number = 1
|
||||
@@ -98,7 +98,6 @@
|
||||
|
||||
var/turf/destturf
|
||||
var/turf/curturf = get_turf(teleatom)
|
||||
var/area/destarea = get_area(destination)
|
||||
if(precision)
|
||||
var/list/posturfs = circlerangeturfs(destination,precision)
|
||||
destturf = safepick(posturfs)
|
||||
@@ -125,8 +124,6 @@
|
||||
if(C)
|
||||
C.forceMove(destturf)
|
||||
|
||||
destarea.Entered(teleatom)
|
||||
|
||||
return 1
|
||||
|
||||
/datum/teleport/proc/teleport()
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
/decl/hierarchy/outfit/job/cargo/qm
|
||||
name = OUTFIT_JOB_NAME("Cargo")
|
||||
uniform = /obj/item/clothing/under/rank/cargo
|
||||
l_ear = /obj/item/device/radio/headset/headset_qm //VOREStation Add
|
||||
shoes = /obj/item/clothing/shoes/brown
|
||||
glasses = /obj/item/clothing/glasses/sunglasses
|
||||
l_hand = /obj/item/weapon/clipboard
|
||||
|
||||
@@ -48,8 +48,8 @@
|
||||
C.registered_name = H.real_name
|
||||
return C
|
||||
|
||||
/decl/hierarchy/outfit/solgov/representative
|
||||
name = "SolGov Representative"
|
||||
/decl/hierarchy/outfit/solcom/representative
|
||||
name = "SolCom Representative"
|
||||
shoes = /obj/item/clothing/shoes/laceup
|
||||
l_ear = /obj/item/device/radio/headset/centcom
|
||||
uniform = /obj/item/clothing/under/suit_jacket/navy
|
||||
@@ -59,13 +59,13 @@
|
||||
r_hand = /obj/item/device/pda/centcom
|
||||
l_hand = /obj/item/weapon/clipboard
|
||||
|
||||
/decl/hierarchy/outfit/solgov/representative/equip_id(mob/living/carbon/human/H)
|
||||
/decl/hierarchy/outfit/solcom/representative/equip_id(mob/living/carbon/human/H)
|
||||
var/obj/item/weapon/card/id/C = ..()
|
||||
C.name = "[H.real_name]'s SolGov ID Card"
|
||||
C.name = "[H.real_name]'s SolCom ID Card"
|
||||
C.icon_state = "lifetime"
|
||||
C.access = get_all_station_access()
|
||||
C.access += get_all_centcom_access()
|
||||
C.assignment = "SolGov Representative"
|
||||
C.assignment = "SolCom Representative"
|
||||
C.registered_name = H.real_name
|
||||
return C
|
||||
|
||||
@@ -101,3 +101,76 @@
|
||||
r_hand = /obj/item/weapon/melee/energy/sword/imperial
|
||||
l_hand = /obj/item/weapon/shield/energy/imperial
|
||||
suit_store = /obj/item/weapon/gun/energy/imperial
|
||||
|
||||
/*
|
||||
SOUTHERN CROSS OUTFITS
|
||||
Keep outfits simple. Spawn with basic uniforms and minimal gear. Gear instead goes in lockers. Keep this in mind if editing.
|
||||
*/
|
||||
|
||||
|
||||
/decl/hierarchy/outfit/job/explorer2
|
||||
name = OUTFIT_JOB_NAME("Explorer")
|
||||
shoes = /obj/item/clothing/shoes/boots/winter/explorer
|
||||
uniform = /obj/item/clothing/under/explorer
|
||||
l_ear = /obj/item/device/radio/headset/explorer
|
||||
id_slot = slot_wear_id
|
||||
pda_slot = slot_l_store
|
||||
pda_type = /obj/item/device/pda/explorer //VORESTation Edit - Better Brown
|
||||
id_type = /obj/item/weapon/card/id/explorer //VOREStation Edit
|
||||
id_pda_assignment = "Explorer"
|
||||
flags = OUTFIT_HAS_BACKPACK|OUTFIT_COMPREHENSIVE_SURVIVAL
|
||||
backpack_contents = list(/obj/item/clothing/accessory/permit/gun/planetside = 1)
|
||||
|
||||
/decl/hierarchy/outfit/job/explorer2/post_equip(mob/living/carbon/human/H)
|
||||
..()
|
||||
for(var/obj/item/clothing/accessory/permit/gun/planetside/permit in H.back.contents)
|
||||
permit.set_name(H.real_name)
|
||||
|
||||
/decl/hierarchy/outfit/job/pilot
|
||||
name = OUTFIT_JOB_NAME("Pilot")
|
||||
shoes = /obj/item/clothing/shoes/black
|
||||
uniform = /obj/item/clothing/under/rank/pilot1
|
||||
suit = /obj/item/clothing/suit/storage/toggle/bomber/pilot
|
||||
gloves = /obj/item/clothing/gloves/fingerless
|
||||
glasses = /obj/item/clothing/glasses/fakesunglasses/aviator
|
||||
l_ear = /obj/item/device/radio/headset/pilot/alt
|
||||
id_slot = slot_wear_id
|
||||
pda_slot = slot_belt
|
||||
pda_type = /obj/item/device/pda //VOREStation Edit - Civilian
|
||||
id_pda_assignment = "Pilot"
|
||||
flags = OUTFIT_HAS_BACKPACK|OUTFIT_COMPREHENSIVE_SURVIVAL
|
||||
|
||||
/decl/hierarchy/outfit/job/medical/sar
|
||||
name = OUTFIT_JOB_NAME("Field Medic") //VOREStation Edit
|
||||
uniform = /obj/item/clothing/under/utility/blue
|
||||
//suit = /obj/item/clothing/suit/storage/hooded/wintercoat/medical/sar //VOREStation Edit
|
||||
shoes = /obj/item/clothing/shoes/boots/winter/explorer
|
||||
l_ear = /obj/item/device/radio/headset/sar
|
||||
l_hand = /obj/item/weapon/storage/firstaid/regular
|
||||
belt = /obj/item/weapon/storage/belt/medical/emt
|
||||
pda_slot = slot_l_store
|
||||
pda_type = /obj/item/device/pda/sar //VOREStation Add
|
||||
id_pda_assignment = "Field Medic" //VOREStation Edit
|
||||
flags = OUTFIT_HAS_BACKPACK|OUTFIT_EXTENDED_SURVIVAL|OUTFIT_COMPREHENSIVE_SURVIVAL
|
||||
|
||||
/decl/hierarchy/outfit/job/pathfinder
|
||||
name = OUTFIT_JOB_NAME("Pathfinder")
|
||||
shoes = /obj/item/clothing/shoes/boots/winter/explorer
|
||||
uniform = /obj/item/clothing/under/explorer //TODO: Uniforms.
|
||||
l_ear = /obj/item/device/radio/headset/pathfinder
|
||||
id_slot = slot_wear_id
|
||||
pda_slot = slot_l_store
|
||||
pda_type = /obj/item/device/pda/pathfinder
|
||||
id_type = /obj/item/weapon/card/id/explorer/head
|
||||
id_pda_assignment = "Pathfinder"
|
||||
flags = OUTFIT_HAS_BACKPACK|OUTFIT_EXTENDED_SURVIVAL|OUTFIT_COMPREHENSIVE_SURVIVAL
|
||||
backpack_contents = list(/obj/item/clothing/accessory/permit/gun/planetside = 1)
|
||||
|
||||
/decl/hierarchy/outfit/job/pathfinder/post_equip(mob/living/carbon/human/H)
|
||||
..()
|
||||
for(var/obj/item/clothing/accessory/permit/gun/planetside/permit in H.back.contents)
|
||||
permit.set_name(H.real_name)
|
||||
|
||||
/decl/hierarchy/outfit/job/assistant/explorer
|
||||
id_type = /obj/item/weapon/card/id/explorer
|
||||
flags = OUTFIT_HAS_BACKPACK|OUTFIT_COMPREHENSIVE_SURVIVAL
|
||||
|
||||
+47
-23
@@ -1,46 +1,70 @@
|
||||
#define PROGRESSBAR_HEIGHT 6
|
||||
|
||||
/datum/progressbar
|
||||
var/goal = 1
|
||||
var/image/bar
|
||||
var/shown = 0
|
||||
var/mob/user
|
||||
var/client/client
|
||||
var/listindex
|
||||
|
||||
/datum/progressbar/New(mob/user, goal_number, atom/target)
|
||||
/datum/progressbar/New(mob/User, goal_number, atom/target)
|
||||
. = ..()
|
||||
if(!target) target = user
|
||||
if (!istype(target))
|
||||
EXCEPTION("Invalid target given")
|
||||
if (goal_number)
|
||||
if(!istype(target))
|
||||
target = User
|
||||
if(goal_number)
|
||||
goal = goal_number
|
||||
bar = image('icons/effects/progessbar.dmi', target, "prog_bar_0")
|
||||
bar.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA
|
||||
bar.pixel_y = 32
|
||||
bar = image('icons/effects/progressbar.dmi', target, "prog_bar_0")
|
||||
bar.alpha = 0
|
||||
bar.plane = PLANE_PLAYER_HUD
|
||||
src.user = user
|
||||
bar.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA
|
||||
user = User
|
||||
if(user)
|
||||
client = user.client
|
||||
|
||||
/datum/progressbar/Destroy()
|
||||
if (client)
|
||||
client.images -= bar
|
||||
QDEL_NULL(bar)
|
||||
user = null
|
||||
client = null
|
||||
return ..()
|
||||
LAZYINITLIST(user.progressbars)
|
||||
LAZYINITLIST(user.progressbars[bar.loc])
|
||||
var/list/bars = user.progressbars[bar.loc]
|
||||
bars.Add(src)
|
||||
listindex = bars.len
|
||||
animate(bar, pixel_y = 32 + (PROGRESSBAR_HEIGHT * (listindex - 1)), alpha = 255, time = 5, easing = SINE_EASING)
|
||||
|
||||
/datum/progressbar/proc/update(progress)
|
||||
//to_world("Update [progress] - [goal] - [(progress / goal)] - [((progress / goal) * 100)] - [round(((progress / goal) * 100), 5)]")
|
||||
if (!user || !user.client)
|
||||
if(!user || !user.client)
|
||||
shown = 0
|
||||
return
|
||||
if (user.client != client)
|
||||
if (client)
|
||||
if(user.client != client)
|
||||
if(client)
|
||||
client.images -= bar
|
||||
shown = 0
|
||||
client = user.client
|
||||
if(user.client)
|
||||
user.client.images += bar
|
||||
|
||||
progress = CLAMP(progress, 0, goal)
|
||||
bar.icon_state = "prog_bar_[round(((progress / goal) * 100), 5)]"
|
||||
if (!shown && user.is_preference_enabled(/datum/client_preference/show_progress_bar))
|
||||
if(!shown && user.is_preference_enabled(/datum/client_preference/show_progress_bar))
|
||||
user.client.images += bar
|
||||
shown = 1
|
||||
|
||||
/datum/progressbar/proc/shiftDown()
|
||||
--listindex
|
||||
var/shiftheight = bar.pixel_y - PROGRESSBAR_HEIGHT
|
||||
animate(bar, pixel_y = shiftheight, time = 5, easing = SINE_EASING)
|
||||
|
||||
/datum/progressbar/Destroy()
|
||||
for(var/I in user.progressbars[bar.loc])
|
||||
var/datum/progressbar/P = I
|
||||
if(P != src && P.listindex > listindex)
|
||||
P.shiftDown()
|
||||
|
||||
var/list/bars = user.progressbars[bar.loc]
|
||||
bars.Remove(src)
|
||||
if(!bars.len)
|
||||
LAZYREMOVE(user.progressbars, bar.loc)
|
||||
animate(bar, alpha = 0, time = 5)
|
||||
spawn(5)
|
||||
if(client)
|
||||
client.images -= bar
|
||||
qdel(bar)
|
||||
. = ..()
|
||||
|
||||
#undef PROGRESSBAR_HEIGHT
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
/datum/riding
|
||||
var/next_vehicle_move = 0 // Used for move delays
|
||||
var/vehicle_move_delay = 2 // Tick delay between movements, lower = faster, higher = slower
|
||||
var/vehicle_move_delay = 2 // Decisecond delay between movements, lower = faster, higher = slower
|
||||
var/keytype = null // Can give this a type to require the rider to hold the item type inhand to move the ridden atom.
|
||||
var/nonhuman_key_exemption = FALSE // If true, nonhumans who can't hold keys don't need them, like borgs and simplemobs.
|
||||
var/key_name = "the keys" // What the 'keys' for the thing being rided on would be called.
|
||||
@@ -97,11 +97,13 @@
|
||||
|
||||
if(world.time < next_vehicle_move)
|
||||
return
|
||||
|
||||
next_vehicle_move = world.time + vehicle_move_delay
|
||||
|
||||
if(keycheck(user))
|
||||
if(!Process_Spacemove(direction) || !isturf(ridden.loc))
|
||||
return
|
||||
ridden.Move(get_step(ridden, direction))
|
||||
ridden.Move(get_step(ridden, direction), direction, vehicle_move_delay)
|
||||
|
||||
handle_vehicle_layer()
|
||||
handle_vehicle_offsets()
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
/datum/supply_pack/med/medical
|
||||
cost = 15
|
||||
|
||||
/datum/supply_pack/med/medicalbiosuits
|
||||
contains = list(
|
||||
/obj/item/clothing/head/bio_hood/scientist = 3,
|
||||
|
||||
@@ -74,8 +74,17 @@
|
||||
/obj/item/toy/plushie/squid/blue,
|
||||
/obj/item/toy/plushie/squid/orange,
|
||||
/obj/item/toy/plushie/squid/yellow,
|
||||
/obj/item/toy/plushie/squid/pink
|
||||
)
|
||||
/obj/item/toy/plushie/squid/pink,
|
||||
//VOREStation Add Start
|
||||
/obj/item/toy/plushie/lizardplushie/kobold,
|
||||
/obj/item/toy/plushie/slimeplushie,
|
||||
/obj/item/toy/plushie/box,
|
||||
/obj/item/toy/plushie/borgplushie,
|
||||
/obj/item/toy/plushie/borgplushie/medihound,
|
||||
/obj/item/toy/plushie/borgplushie/scrubpuppy,
|
||||
/obj/item/toy/plushie/foxbear,
|
||||
/obj/item/toy/plushie/nukeplushie)
|
||||
//VOREStation Add End
|
||||
name = "Plushies Crate"
|
||||
cost = 15
|
||||
containertype = /obj/structure/closet/crate
|
||||
|
||||
@@ -65,6 +65,10 @@
|
||||
name = "Anti-Materiel Rifle ammo box (14.5mm)"
|
||||
path = /obj/item/weapon/storage/box/sniperammo
|
||||
|
||||
/datum/uplink_item/item/ammo/sniperammo_highvel
|
||||
name = "Anti-Materiel Rifle ammo box (14.5mm sabot)"
|
||||
path = /obj/item/weapon/storage/box/sniperammo/highvel
|
||||
|
||||
/datum/uplink_item/item/ammo/c545
|
||||
name = "Rifle Magazine (5.45mm)"
|
||||
path = /obj/item/ammo_magazine/m545
|
||||
|
||||
@@ -1,6 +1,26 @@
|
||||
/**********
|
||||
* Medical *
|
||||
**********/
|
||||
/datum/uplink_item/item/medical/fire
|
||||
name = "Fire medical kit"
|
||||
item_cost = 10
|
||||
path = /obj/item/weapon/storage/firstaid/fire
|
||||
|
||||
/datum/uplink_item/item/medical/toxin
|
||||
name = "Toxin medical kit"
|
||||
item_cost = 10
|
||||
path = /obj/item/weapon/storage/firstaid/toxin
|
||||
|
||||
/datum/uplink_item/item/medical/o2
|
||||
name = "Oxygen medical kit"
|
||||
item_cost = 10
|
||||
path = /obj/item/weapon/storage/firstaid/o2
|
||||
|
||||
/datum/uplink_item/item/medical/adv
|
||||
name = "Advanced medical kit"
|
||||
item_cost = 10
|
||||
path = /obj/item/weapon/storage/firstaid/adv
|
||||
|
||||
/datum/uplink_item/item/medical/mre
|
||||
name = "Meal, Ready to eat (Random)"
|
||||
item_cost = 5
|
||||
@@ -26,6 +46,11 @@
|
||||
item_cost = 5
|
||||
path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/purity
|
||||
|
||||
/datum/uplink_item/item/medical/pain
|
||||
name = "Pain injector"
|
||||
item_cost = 5
|
||||
path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/pain
|
||||
|
||||
/datum/uplink_item/item/medical/brute
|
||||
name = "Brute injector"
|
||||
item_cost = 5
|
||||
@@ -46,12 +71,12 @@
|
||||
item_cost = 5
|
||||
path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/oxy
|
||||
|
||||
/datum/uplink_item/item/medical/organ
|
||||
name = "Organ Repair injector"
|
||||
item_cost = 10
|
||||
path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/organ
|
||||
|
||||
/datum/uplink_item/item/medical/nanites
|
||||
name = "Healing Nanite pill bottle"
|
||||
item_cost = 30
|
||||
path = /obj/item/weapon/storage/pill_bottle/healing_nanites
|
||||
|
||||
/datum/uplink_item/item/medical/insiderepair
|
||||
name = "Combat organ kit"
|
||||
item_cost = 120
|
||||
path = /obj/item/weapon/storage/firstaid/insiderepair
|
||||
|
||||
@@ -26,6 +26,11 @@
|
||||
item_cost = 20
|
||||
path = /obj/item/modular_computer/laptop/preset/custom_loadout/elite
|
||||
|
||||
/datum/uplink_item/item/tools/inducer
|
||||
name = "Inducer"
|
||||
item_cost = 20
|
||||
path = /obj/item/weapon/inducer/syndicate
|
||||
|
||||
/datum/uplink_item/item/tools/luxurycapsule
|
||||
name = "Survival Capsule (Luxury)"
|
||||
item_cost = 40
|
||||
@@ -36,6 +41,11 @@
|
||||
item_cost = 40
|
||||
path = /obj/item/device/perfect_tele
|
||||
|
||||
/datum/uplink_item/item/tools/uav
|
||||
name = "Recon Skimmer"
|
||||
item_cost = 40
|
||||
path = /obj/item/device/uav
|
||||
|
||||
/datum/uplink_item/item/tools/barcapsule
|
||||
name = "Survival Capsule (Bar)"
|
||||
item_cost = 80
|
||||
|
||||
@@ -11,7 +11,7 @@ var/const/SMES_WIRE_FAILSAFES = 16 // Cut to disable failsafes, mend to reenable
|
||||
|
||||
/datum/wires/smes/CanUse(var/mob/living/L)
|
||||
var/obj/machinery/power/smes/buildable/S = holder
|
||||
if(S.open_hatch)
|
||||
if(S.panel_open)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
@@ -59,22 +59,11 @@
|
||||
var/damage = 0.0
|
||||
var/range = 10.0
|
||||
|
||||
|
||||
/obj/effect/list_container
|
||||
name = "list container"
|
||||
|
||||
/obj/effect/list_container/mobl
|
||||
name = "mobl"
|
||||
var/master = null
|
||||
|
||||
var/list/container = list( )
|
||||
|
||||
/obj/effect/projection
|
||||
name = "Projection"
|
||||
desc = "This looks like a projection of something."
|
||||
anchored = 1.0
|
||||
|
||||
|
||||
/obj/effect/shut_controller
|
||||
name = "shut controller"
|
||||
var/moving = null
|
||||
@@ -144,12 +133,5 @@
|
||||
user.drop_item()
|
||||
src.throw_at(target, throw_range, throw_speed, user)
|
||||
|
||||
/obj/effect/stop
|
||||
var/victim = null
|
||||
icon_state = "empty"
|
||||
name = "Geas"
|
||||
desc = "You can't resist."
|
||||
// name = ""
|
||||
|
||||
/obj/effect/spawner
|
||||
name = "object spawner"
|
||||
|
||||
@@ -230,13 +230,6 @@
|
||||
desc = "Heavy-duty switching circuits for power control."
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
|
||||
|
||||
/obj/item/weapon/module/power_control/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
|
||||
if (istype(W, /obj/item/device/multitool))
|
||||
var/obj/item/weapon/circuitboard/ghettosmes/newcircuit = new/obj/item/weapon/circuitboard/ghettosmes(user.loc)
|
||||
qdel(src)
|
||||
user.put_in_hands(newcircuit)
|
||||
|
||||
|
||||
/obj/item/weapon/module/id_auth
|
||||
name = "\improper ID authentication module"
|
||||
icon_state = "id_mod"
|
||||
|
||||
@@ -17,22 +17,22 @@
|
||||
log = do_log
|
||||
newscast = do_newscast
|
||||
|
||||
/datum/announcement/priority/New(var/do_log = 1, var/new_sound = 'sound/misc/notice2.ogg', var/do_newscast = 0)
|
||||
/datum/announcement/priority/New(var/do_log = 1, var/new_sound, var/do_newscast = 0)
|
||||
..(do_log, new_sound, do_newscast)
|
||||
title = "Priority Announcement"
|
||||
announcement_type = "Priority Announcement"
|
||||
|
||||
/datum/announcement/priority/command/New(var/do_log = 1, var/new_sound = 'sound/misc/notice2.ogg', var/do_newscast = 0)
|
||||
/datum/announcement/priority/command/New(var/do_log = 1, var/new_sound, var/do_newscast = 0)
|
||||
..(do_log, new_sound, do_newscast)
|
||||
title = "[command_name()] Update"
|
||||
announcement_type = "[command_name()] Update"
|
||||
|
||||
/datum/announcement/priority/security/New(var/do_log = 1, var/new_sound = 'sound/misc/notice2.ogg', var/do_newscast = 0)
|
||||
/datum/announcement/priority/security/New(var/do_log = 1, var/new_sound, var/do_newscast = 0)
|
||||
..(do_log, new_sound, do_newscast)
|
||||
title = "Security Announcement"
|
||||
announcement_type = "Security Announcement"
|
||||
|
||||
/datum/announcement/proc/Announce(var/message as text, var/new_title = "", var/new_sound = null, var/do_newscast = newscast, var/msg_sanitized = 0, zlevel)
|
||||
/datum/announcement/proc/Announce(var/message as text, var/new_title = "", var/new_sound = null, var/do_newscast = newscast, var/msg_sanitized = 0, var/zlevel)
|
||||
if(!message)
|
||||
return
|
||||
var/message_title = new_title ? new_title : title
|
||||
@@ -52,22 +52,49 @@
|
||||
Sound(message_sound, zlevels)
|
||||
Log(message, message_title)
|
||||
|
||||
datum/announcement/proc/Message(var/message as text, var/message_title as text, var/list/zlevels)
|
||||
global_announcer.autosay("<span class='alert'>[message_title]:</span> [message]", announcer ? announcer : ANNOUNCER_NAME, zlevels)
|
||||
/datum/announcement/proc/Message(message as text, message_title as text, var/list/zlevels)
|
||||
for(var/mob/M in player_list)
|
||||
if(!istype(M,/mob/new_player) && !isdeaf(M))
|
||||
to_chat(M, "<h2 class='alert'>[title]</h2>")
|
||||
to_chat(M, "<span class='alert'>[message]</span>")
|
||||
if (announcer)
|
||||
to_chat(M, "<span class='alert'> -[html_encode(announcer)]</span>")
|
||||
|
||||
datum/announcement/minor/Message(var/message as text, var/message_title as text, var/list/zlevels)
|
||||
global_announcer.autosay(message, announcer ? announcer : ANNOUNCER_NAME, zlevels)
|
||||
// You'll need to update these to_world usages if you want to make these z-level specific ~Aro
|
||||
/datum/announcement/minor/Message(message as text, message_title as text)
|
||||
to_world("<b>[message]</b>")
|
||||
|
||||
datum/announcement/priority/Message(var/message as text, var/message_title as text, var/list/zlevels)
|
||||
global_announcer.autosay("<span class='alert'>[message_title]:</span> [message]", announcer ? announcer : ANNOUNCER_NAME, zlevels)
|
||||
/datum/announcement/priority/Message(message as text, message_title as text)
|
||||
to_world("<h1 class='alert'>[message_title]</h1>")
|
||||
to_world("<span class='alert'>[message]</span>")
|
||||
if(announcer)
|
||||
to_world("<span class='alert'> -[html_encode(announcer)]</span>")
|
||||
to_world("<br>")
|
||||
|
||||
datum/announcement/priority/command/Message(var/message as text, var/message_title as text, var/list/zlevels)
|
||||
global_announcer.autosay("<span class='alert'>[command_name()] - [message_title]:</span> [message]", ANNOUNCER_NAME, zlevels)
|
||||
/datum/announcement/priority/command/Message(message as text, message_title as text, var/list/zlevels)
|
||||
var/command
|
||||
command += "<h1 class='alert'>[command_name()] Update</h1>"
|
||||
if (message_title)
|
||||
command += "<br><h2 class='alert'>[message_title]</h2>"
|
||||
|
||||
datum/announcement/priority/security/Message(var/message as text, var/message_title as text, var/list/zlevels)
|
||||
global_announcer.autosay("<span class='alert'>[message_title]:</span> [message]", ANNOUNCER_NAME, zlevels)
|
||||
command += "<br><span class='alert'>[message]</span><br>"
|
||||
command += "<br>"
|
||||
for(var/mob/M in player_list)
|
||||
if(zlevels && !(get_z(M) in zlevels))
|
||||
continue
|
||||
if(!istype(M,/mob/new_player) && !isdeaf(M))
|
||||
to_chat(M, command)
|
||||
|
||||
datum/announcement/proc/NewsCast(var/message as text, var/message_title as text)
|
||||
/datum/announcement/priority/Message(var/message as text, var/message_title as text, var/list/zlevels)
|
||||
global_announcer.autosay("<span class='alert'>[message_title]:</span> [message]", announcer ? announcer : ANNOUNCER_NAME, channel = "Common", zlevels = zlevels)
|
||||
|
||||
/datum/announcement/priority/command/Message(var/message as text, var/message_title as text, var/list/zlevels)
|
||||
global_announcer.autosay("<span class='alert'>[command_name()] - [message_title]:</span> [message]", ANNOUNCER_NAME, channel = "Common", zlevels = zlevels)
|
||||
|
||||
/datum/announcement/priority/security/Message(var/message as text, var/message_title as text, var/list/zlevels)
|
||||
global_announcer.autosay("<span class='alert'>[message_title]:</span> [message]", ANNOUNCER_NAME, channel = "Common", zlevels = zlevels)
|
||||
|
||||
/datum/announcement/proc/NewsCast(var/message as text, var/message_title as text)
|
||||
if(!newscast)
|
||||
return
|
||||
|
||||
@@ -79,27 +106,27 @@ datum/announcement/proc/NewsCast(var/message as text, var/message_title as text)
|
||||
news.can_be_redacted = 0
|
||||
announce_newscaster_news(news)
|
||||
|
||||
datum/announcement/proc/PlaySound(var/message_sound, var/list/zlevels)
|
||||
if(!message_sound)
|
||||
return
|
||||
|
||||
/datum/announcement/proc/PlaySound(var/message_sound, var/list/zlevels)
|
||||
for(var/mob/M in player_list)
|
||||
if(zlevels && !(M.z in zlevels))
|
||||
continue
|
||||
if(!istype(M,/mob/new_player) && !isdeaf(M))
|
||||
M << message_sound
|
||||
M << 'sound/AI/preamble.ogg'
|
||||
|
||||
datum/announcement/proc/Sound(var/message_sound, var/list/zlevels)
|
||||
if(!message_sound)
|
||||
return
|
||||
|
||||
spawn(22) // based on length of preamble.ogg + arbitrary delay
|
||||
for(var/mob/M in player_list)
|
||||
if(zlevels && !(M.z in zlevels))
|
||||
continue
|
||||
if(!istype(M,/mob/new_player) && !isdeaf(M))
|
||||
M << message_sound
|
||||
|
||||
/datum/announcement/proc/Sound(var/message_sound, var/list/zlevels)
|
||||
PlaySound(message_sound, zlevels)
|
||||
|
||||
datum/announcement/priority/Sound(var/message_sound)
|
||||
if(message_sound)
|
||||
world << message_sound
|
||||
|
||||
datum/announcement/priority/command/Sound(var/message_sound)
|
||||
PlaySound(message_sound)
|
||||
|
||||
datum/announcement/proc/Log(message as text, message_title as text)
|
||||
/datum/announcement/proc/Log(message as text, message_title as text)
|
||||
if(log)
|
||||
log_game("[key_name(usr)] has made \a [announcement_type]: [message_title] - [message] - [announcer]")
|
||||
message_admins("[key_name_admin(usr)] has made \a [announcement_type].", 1)
|
||||
|
||||
+104
-30
@@ -21,14 +21,22 @@
|
||||
var/requires_power = 1
|
||||
var/always_unpowered = 0 //this gets overriden to 1 for space in area/New()
|
||||
|
||||
var/power_equip = 1
|
||||
var/power_light = 1
|
||||
var/power_environ = 1
|
||||
var/music = null
|
||||
var/used_equip = 0
|
||||
var/used_light = 0
|
||||
var/used_environ = 0
|
||||
// Power channel status - Is it currently energized?
|
||||
var/power_equip = TRUE
|
||||
var/power_light = TRUE
|
||||
var/power_environ = TRUE
|
||||
|
||||
// Oneoff power usage - Used once and cleared each power cycle
|
||||
var/oneoff_equip = 0
|
||||
var/oneoff_light = 0
|
||||
var/oneoff_environ = 0
|
||||
|
||||
// Continuous "static" power usage - Do not update these directly!
|
||||
var/static_equip = 0
|
||||
var/static_light = 0
|
||||
var/static_environ = 0
|
||||
|
||||
var/music = null
|
||||
var/has_gravity = 1
|
||||
var/secret_name = FALSE // This tells certain things that display areas' names that they shouldn't display this area's name.
|
||||
var/obj/machinery/power/apc/apc = null
|
||||
@@ -47,7 +55,7 @@
|
||||
|
||||
luminosity = !(dynamic_lighting)
|
||||
icon_state = ""
|
||||
|
||||
|
||||
return INITIALIZE_HINT_LATELOAD // Areas tradiationally are initialized AFTER other atoms.
|
||||
|
||||
/area/LateInitialize()
|
||||
@@ -81,7 +89,7 @@
|
||||
for(var/atom/movable/AM in T)
|
||||
A.Entered(AM, old_area)
|
||||
for(var/obj/machinery/M in T)
|
||||
M.power_change()
|
||||
M.area_changed(old_area, A)
|
||||
|
||||
/area/proc/get_contents()
|
||||
return contents
|
||||
@@ -251,33 +259,96 @@
|
||||
if (fire || eject || party)
|
||||
updateicon()
|
||||
|
||||
/area/proc/usage(var/chan)
|
||||
/area/proc/usage(var/chan, var/include_static = TRUE)
|
||||
var/used = 0
|
||||
switch(chan)
|
||||
if(LIGHT)
|
||||
used += used_light
|
||||
used += oneoff_light + (include_static * static_light)
|
||||
if(EQUIP)
|
||||
used += used_equip
|
||||
used += oneoff_equip + (include_static * static_equip)
|
||||
if(ENVIRON)
|
||||
used += used_environ
|
||||
used += oneoff_environ + (include_static * static_environ)
|
||||
if(TOTAL)
|
||||
used += used_light + used_equip + used_environ
|
||||
used += oneoff_light + (include_static * static_light)
|
||||
used += oneoff_equip + (include_static * static_equip)
|
||||
used += oneoff_environ + (include_static * static_environ)
|
||||
return used
|
||||
|
||||
// Helper for APCs; will generally be called every tick.
|
||||
/area/proc/clear_usage()
|
||||
used_equip = 0
|
||||
used_light = 0
|
||||
used_environ = 0
|
||||
oneoff_equip = 0
|
||||
oneoff_light = 0
|
||||
oneoff_environ = 0
|
||||
|
||||
/area/proc/use_power(var/amount, var/chan)
|
||||
// Use this for a one-time power draw from the area, typically for non-machines.
|
||||
/area/proc/use_power_oneoff(var/amount, var/chan)
|
||||
switch(chan)
|
||||
if(EQUIP)
|
||||
used_equip += amount
|
||||
oneoff_equip += amount
|
||||
if(LIGHT)
|
||||
used_light += amount
|
||||
oneoff_light += amount
|
||||
if(ENVIRON)
|
||||
used_environ += amount
|
||||
oneoff_environ += amount
|
||||
return amount
|
||||
|
||||
// This is used by machines to properly update the area of power changes.
|
||||
/area/proc/power_use_change(old_amount, new_amount, chan)
|
||||
use_power_static(new_amount - old_amount, chan) // Simultaneously subtract old_amount and add new_amount.
|
||||
|
||||
// Not a proc you want to use directly unless you know what you are doing; see use_power_oneoff above instead.
|
||||
/area/proc/use_power_static(var/amount, var/chan)
|
||||
switch(chan)
|
||||
if(EQUIP)
|
||||
static_equip += amount
|
||||
if(LIGHT)
|
||||
static_light += amount
|
||||
if(ENVIRON)
|
||||
static_environ += amount
|
||||
|
||||
// This recomputes the continued power usage; can be used for testing or error recovery, but is not called every tick.
|
||||
/area/proc/retally_power()
|
||||
static_equip = 0
|
||||
static_light = 0
|
||||
static_environ = 0
|
||||
for(var/obj/machinery/M in src)
|
||||
switch(M.power_channel)
|
||||
if(EQUIP)
|
||||
static_equip += M.get_power_usage()
|
||||
if(LIGHT)
|
||||
static_light += M.get_power_usage()
|
||||
if(ENVIRON)
|
||||
static_environ += M.get_power_usage()
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
/area/vv_get_dropdown()
|
||||
. = ..()
|
||||
VV_DROPDOWN_OPTION("check_static_power", "Check Static Power")
|
||||
|
||||
/area/vv_do_topic(list/href_list)
|
||||
. = ..()
|
||||
IF_VV_OPTION("check_static_power")
|
||||
if(!check_rights(R_DEBUG))
|
||||
return
|
||||
src.check_static_power(usr)
|
||||
href_list["datumrefresh"] = "\ref[src]"
|
||||
|
||||
// Debugging proc to report if static power is correct or not.
|
||||
/area/proc/check_static_power(var/user)
|
||||
set name = "Check Static Power"
|
||||
var/actual_static_equip = static_equip
|
||||
var/actual_static_light = static_light
|
||||
var/actual_static_environ = static_environ
|
||||
retally_power()
|
||||
if(user)
|
||||
var/list/report = list("[src] ([type]) static power tally:")
|
||||
report += "EQUIP: Actual: [actual_static_equip] Correct: [static_equip] Difference: [actual_static_equip - static_equip]"
|
||||
report += "LIGHT: Actual: [actual_static_light] Correct: [static_light] Difference: [actual_static_light - static_light]"
|
||||
report += "ENVIRON: Actual: [actual_static_environ] Correct: [static_environ] Difference: [actual_static_environ - static_environ]"
|
||||
to_chat(user, report.Join("\n"))
|
||||
return (actual_static_equip == static_equip && actual_static_light == static_light && actual_static_environ == static_environ)
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
var/list/mob/living/forced_ambiance_list = new
|
||||
|
||||
@@ -350,17 +421,20 @@ var/list/mob/living/forced_ambiance_list = new
|
||||
to_chat(mob, "<span class='notice'>The sudden appearance of gravity makes you fall to the floor!</span>")
|
||||
playsound(get_turf(src), "bodyfall", 50, 1)
|
||||
|
||||
/area/proc/prison_break()
|
||||
/area/proc/prison_break(break_lights = TRUE, open_doors = TRUE, open_blast_doors = TRUE)
|
||||
var/obj/machinery/power/apc/theAPC = get_apc()
|
||||
if(theAPC.operating)
|
||||
for(var/obj/machinery/power/apc/temp_apc in src)
|
||||
temp_apc.overload_lighting(70)
|
||||
for(var/obj/machinery/door/airlock/temp_airlock in src)
|
||||
temp_airlock.prison_open()
|
||||
for(var/obj/machinery/door/window/temp_windoor in src)
|
||||
temp_windoor.open()
|
||||
for(var/obj/machinery/door/blast/temp_blast in src)
|
||||
temp_blast.open()
|
||||
if(break_lights)
|
||||
for(var/obj/machinery/power/apc/temp_apc in src)
|
||||
temp_apc.overload_lighting(70)
|
||||
if(open_doors)
|
||||
for(var/obj/machinery/door/airlock/temp_airlock in src)
|
||||
temp_airlock.prison_open()
|
||||
for(var/obj/machinery/door/window/temp_windoor in src)
|
||||
temp_windoor.open()
|
||||
if(open_blast_doors)
|
||||
for(var/obj/machinery/door/blast/temp_blast in src)
|
||||
temp_blast.open()
|
||||
|
||||
/area/has_gravity()
|
||||
return has_gravity
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
/area/shuttle_arrived()
|
||||
.=..()
|
||||
for(var/obj/machinery/telecomms/relay/R in contents)
|
||||
R.reset_z()
|
||||
for(var/obj/machinery/power/apc/A in contents)
|
||||
A.update_area()
|
||||
/area
|
||||
var/enter_message
|
||||
var/exit_message
|
||||
|
||||
/area/Entered(var/atom/movable/AM, oldLoc)
|
||||
. = ..()
|
||||
if(enter_message && isliving(AM))
|
||||
to_chat(AM, enter_message)
|
||||
|
||||
/area/Exited(var/atom/movable/AM, newLoc)
|
||||
. = ..()
|
||||
if(exit_message && isliving(AM))
|
||||
to_chat(AM, exit_message)
|
||||
|
||||
+6
-5
@@ -169,7 +169,7 @@
|
||||
return found
|
||||
|
||||
//All atoms
|
||||
/atom/proc/examine(mob/user, var/distance = -1, var/infix = "", var/suffix = "")
|
||||
/atom/proc/examine(mob/user, var/infix = "", var/suffix = "")
|
||||
//This reformat names to get a/an properly working on item descriptions when they are bloody
|
||||
var/f_name = "\a [src][infix]."
|
||||
if(src.blood_DNA && !istype(src, /obj/effect/decal))
|
||||
@@ -182,16 +182,15 @@
|
||||
else
|
||||
f_name += "oil-stained [name][infix]."
|
||||
|
||||
to_chat(user, "[bicon(src)] That's [f_name] [suffix]")
|
||||
to_chat(user,desc)
|
||||
var/list/output = list("[bicon(src)] That's [f_name] [suffix]", desc)
|
||||
|
||||
if(user.client?.examine_text_mode == EXAMINE_MODE_INCLUDE_USAGE)
|
||||
to_chat(user, description_info)
|
||||
output += description_info
|
||||
|
||||
if(user.client?.examine_text_mode == EXAMINE_MODE_SWITCH_TO_PANEL)
|
||||
user.client.statpanel = "Examine" // Switch to stat panel
|
||||
|
||||
return distance == -1 || (get_dist(src, user) <= distance)
|
||||
return output
|
||||
|
||||
// called by mobs when e.g. having the atom as their machine, pulledby, loc (AKA mob being inside the atom) or buckled var set.
|
||||
// see code/modules/mob/mob_movement.dm for more.
|
||||
@@ -587,3 +586,5 @@
|
||||
<a href='?_src_=vars;rotatedatum=\ref[src];rotatedir=right'>>></a>
|
||||
</font>
|
||||
"}
|
||||
var/turf/T = get_turf(src)
|
||||
. += "<br><font size='1'>[ADMIN_COORDJMP(T)]</font>"
|
||||
|
||||
+171
-109
@@ -1,13 +1,13 @@
|
||||
/atom/movable
|
||||
layer = OBJ_LAYER
|
||||
appearance_flags = TILE_BOUND|PIXEL_SCALE|KEEP_TOGETHER //VOREStation Edit
|
||||
var/last_move = null
|
||||
appearance_flags = TILE_BOUND|PIXEL_SCALE
|
||||
glide_size = 8
|
||||
var/last_move = null //The direction the atom last moved
|
||||
var/anchored = 0
|
||||
// var/elevation = 2 - not used anywhere
|
||||
var/moving_diagonally
|
||||
var/move_speed = 10
|
||||
var/l_move_time = 1
|
||||
var/m_flag = 1
|
||||
var/throwing = 0
|
||||
var/thrower
|
||||
var/turf/throw_source = null
|
||||
@@ -48,83 +48,105 @@
|
||||
pulledby = null
|
||||
QDEL_NULL(riding_datum) //VOREStation Add
|
||||
|
||||
|
||||
/atom/movable/vv_get_dropdown()
|
||||
. = ..()
|
||||
VV_DROPDOWN_OPTION("move_atom", "Move To Coordinate")
|
||||
|
||||
/atom/vv_do_topic(list/href_list)
|
||||
. = ..()
|
||||
IF_VV_OPTION("move_atom")
|
||||
usr.client.cmd_admin_move_atom(src)
|
||||
href_list["datumrefresh"] = "\ref[src]"
|
||||
|
||||
/atom/movable/vv_edit_var(var_name, var_value)
|
||||
if(var_name in GLOB.VVpixelmovement) //Pixel movement is not yet implemented, changing this will break everything irreversibly.
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
////////////////////////////////////////
|
||||
// Here's where we rewrite how byond handles movement except slightly different
|
||||
// To be removed on step_ conversion
|
||||
// All this work to prevent a second bump
|
||||
/atom/movable/Move(atom/newloc, direct=0)
|
||||
. = FALSE
|
||||
if(!newloc || newloc == loc)
|
||||
return
|
||||
|
||||
if(!direct)
|
||||
direct = get_dir(src, newloc)
|
||||
set_dir(direct)
|
||||
|
||||
if(!loc.Exit(src, newloc))
|
||||
return
|
||||
|
||||
if(!newloc.Enter(src, src.loc))
|
||||
return
|
||||
|
||||
if(!check_multi_tile_move_density_dir(direct, locs)) // We're big, and we can't move that way.
|
||||
return
|
||||
|
||||
// Past this is the point of no return
|
||||
if(!locs || locs.len <= 1) // We're not a multi-tile object.
|
||||
var/atom/oldloc = loc
|
||||
var/area/oldarea = get_area(oldloc)
|
||||
var/area/newarea = get_area(newloc)
|
||||
loc = newloc
|
||||
. = TRUE
|
||||
oldloc.Exited(src, newloc)
|
||||
if(oldarea != newarea)
|
||||
oldarea.Exited(src, newloc)
|
||||
|
||||
for(var/i in oldloc)
|
||||
if(i == src) // Multi tile objects
|
||||
continue
|
||||
var/atom/movable/thing = i
|
||||
thing.Uncrossed(src)
|
||||
|
||||
newloc.Entered(src, oldloc)
|
||||
if(oldarea != newarea)
|
||||
newarea.Entered(src, oldloc)
|
||||
|
||||
for(var/i in loc)
|
||||
if(i == src) // Multi tile objects
|
||||
continue
|
||||
var/atom/movable/thing = i
|
||||
thing.Crossed(src)
|
||||
|
||||
else if(newloc) // We're a multi-tile object.
|
||||
. = doMove(newloc)
|
||||
|
||||
//
|
||||
////////////////////////////////////////
|
||||
|
||||
/atom/movable/Move(atom/newloc, direct = 0)
|
||||
/atom/movable/Move(atom/newloc, direct = 0, movetime)
|
||||
// Didn't pass enough info
|
||||
if(!loc || !newloc)
|
||||
return FALSE
|
||||
|
||||
// Store this early before we might move, it's used several places
|
||||
var/atom/oldloc = loc
|
||||
|
||||
// If we're not moving to the same spot (why? does that even happen?)
|
||||
if(loc != newloc)
|
||||
if(!direct)
|
||||
direct = get_dir(oldloc, newloc)
|
||||
if (!(direct & (direct - 1))) //Cardinal move
|
||||
. = ..()
|
||||
else //Diagonal move, split it into cardinal moves
|
||||
if (IS_CARDINAL(direct)) //Cardinal move
|
||||
// Track our failure if any in this value
|
||||
. = TRUE
|
||||
|
||||
// Face the direction of movement
|
||||
set_dir(direct)
|
||||
|
||||
// Check to make sure we can leave
|
||||
if(!loc.Exit(src, newloc))
|
||||
. = FALSE
|
||||
|
||||
// Check to make sure we can enter, if we haven't already failed
|
||||
if(. && !newloc.Enter(src, src.loc))
|
||||
. = FALSE
|
||||
|
||||
// Check to make sure if we're multi-tile we can move, if we haven't already failed
|
||||
if(. && !check_multi_tile_move_density_dir(direct, locs))
|
||||
. = FALSE
|
||||
|
||||
// Definitely moving if you enter this, no failures so far
|
||||
if(. && locs.len <= 1) // We're not a multi-tile object.
|
||||
var/area/oldarea = get_area(oldloc)
|
||||
var/area/newarea = get_area(newloc)
|
||||
var/old_z = get_z(oldloc)
|
||||
var/dest_z = get_z(newloc)
|
||||
|
||||
// Do The Move
|
||||
glide_for(movetime)
|
||||
loc = newloc
|
||||
. = TRUE
|
||||
|
||||
// So objects can be informed of z-level changes
|
||||
if (old_z != dest_z)
|
||||
onTransitZ(old_z, dest_z)
|
||||
|
||||
// We don't call parent so we are calling this for byond
|
||||
oldloc.Exited(src, newloc)
|
||||
if(oldarea != newarea)
|
||||
oldarea.Exited(src, newloc)
|
||||
|
||||
// Multi-tile objects can't reach here, otherwise you'd need to avoid uncrossing yourself
|
||||
for(var/i in oldloc)
|
||||
var/atom/movable/thing = i
|
||||
// We don't call parent so we are calling this for byond
|
||||
thing.Uncrossed(src)
|
||||
|
||||
// We don't call parent so we are calling this for byond
|
||||
newloc.Entered(src, oldloc)
|
||||
if(oldarea != newarea)
|
||||
newarea.Entered(src, oldloc)
|
||||
|
||||
// Multi-tile objects can't reach here, otherwise you'd need to avoid uncrossing yourself
|
||||
for(var/i in loc)
|
||||
var/atom/movable/thing = i
|
||||
// We don't call parent so we are calling this for byond
|
||||
thing.Crossed(src)
|
||||
|
||||
// We're a multi-tile object (multiple locs)
|
||||
else if(. && newloc)
|
||||
. = doMove(newloc)
|
||||
|
||||
//Diagonal move, split it into cardinal moves
|
||||
else
|
||||
moving_diagonally = FIRST_DIAG_STEP
|
||||
var/first_step_dir
|
||||
// The `&& moving_diagonally` checks are so that a forceMove taking
|
||||
// place due to a Crossed, Bumped, etc. call will interrupt
|
||||
// the second half of the diagonal movement, or the second attempt
|
||||
// at a first half if step() fails because we hit something.
|
||||
glide_for(movetime)
|
||||
if (direct & NORTH)
|
||||
if (direct & EAST)
|
||||
if (step(src, NORTH) && moving_diagonally)
|
||||
@@ -163,52 +185,51 @@
|
||||
first_step_dir = WEST
|
||||
moving_diagonally = SECOND_DIAG_STEP
|
||||
. = step(src, SOUTH)
|
||||
if(moving_diagonally == SECOND_DIAG_STEP)
|
||||
if(!.)
|
||||
set_dir(first_step_dir)
|
||||
//else if (!inertia_moving)
|
||||
// inertia_next_move = world.time + inertia_move_delay
|
||||
// newtonian_move(direct)
|
||||
// If we failed, turn to face the direction of the first step at least
|
||||
if(!. && moving_diagonally == SECOND_DIAG_STEP)
|
||||
set_dir(first_step_dir)
|
||||
// Done, regardless!
|
||||
moving_diagonally = 0
|
||||
// We return because step above will call Move() and we don't want to do shenanigans back in here again
|
||||
return
|
||||
|
||||
if(!loc || (loc == oldloc && oldloc != newloc))
|
||||
else if(!loc || (loc == oldloc))
|
||||
last_move = 0
|
||||
return
|
||||
|
||||
// If we moved, call Moved() on ourselves
|
||||
if(.)
|
||||
Moved(oldloc, direct)
|
||||
Moved(oldloc, direct, FALSE, movetime)
|
||||
|
||||
//Polaris stuff
|
||||
// Update timers/cooldown stuff
|
||||
move_speed = world.time - l_move_time
|
||||
l_move_time = world.time
|
||||
m_flag = 1
|
||||
//End
|
||||
|
||||
last_move = direct
|
||||
set_dir(direct)
|
||||
if(. && has_buckled_mobs() && !handle_buckled_mob_movement(loc,direct)) //movement failed due to buckled mob(s)
|
||||
return FALSE
|
||||
//VOREStation Add
|
||||
else if(. && riding_datum)
|
||||
riding_datum.handle_vehicle_layer()
|
||||
riding_datum.handle_vehicle_offsets()
|
||||
//VOREStation Add End
|
||||
last_move = direct // The direction you last moved
|
||||
// set_dir(direct) //Don't think this is necessary
|
||||
|
||||
//Called after a successful Move(). By this point, we've already moved
|
||||
/atom/movable/proc/Moved(atom/OldLoc, Dir, Forced = FALSE)
|
||||
//if (!inertia_moving)
|
||||
// inertia_next_move = world.time + inertia_move_delay
|
||||
// newtonian_move(Dir)
|
||||
//if (length(client_mobs_in_contents))
|
||||
// update_parallax_contents()
|
||||
|
||||
/atom/movable/proc/Moved(atom/old_loc, direction, forced = FALSE, movetime)
|
||||
// Handle any buckled mobs on this movable
|
||||
if(has_buckled_mobs())
|
||||
handle_buckled_mob_movement(old_loc, direction, movetime)
|
||||
if(riding_datum)
|
||||
riding_datum.handle_vehicle_layer()
|
||||
riding_datum.handle_vehicle_offsets()
|
||||
return TRUE
|
||||
|
||||
/atom/movable/set_dir(newdir)
|
||||
. = ..(newdir)
|
||||
if(riding_datum)
|
||||
riding_datum.handle_vehicle_offsets()
|
||||
|
||||
/atom/movable/relaymove(mob/user, direction)
|
||||
. = ..()
|
||||
if(riding_datum)
|
||||
riding_datum.handle_ride(user, direction)
|
||||
|
||||
// Make sure you know what you're doing if you call this, this is intended to only be called by byond directly.
|
||||
// You probably want CanPass()
|
||||
/atom/movable/Cross(atom/movable/AM)
|
||||
. = TRUE
|
||||
return CanPass(AM, loc)
|
||||
|
||||
/atom/movable/CanPass(atom/movable/mover, turf/target)
|
||||
@@ -239,72 +260,113 @@
|
||||
A.Bumped(src)
|
||||
A.last_bumped = world.time
|
||||
|
||||
/atom/movable/proc/forceMove(atom/destination)
|
||||
/atom/movable/proc/forceMove(atom/destination, direction, movetime)
|
||||
. = FALSE
|
||||
if(destination)
|
||||
. = doMove(destination)
|
||||
. = doMove(destination, direction, movetime)
|
||||
else
|
||||
CRASH("No valid destination passed into forceMove")
|
||||
|
||||
/atom/movable/proc/moveToNullspace()
|
||||
return doMove(null)
|
||||
|
||||
/atom/movable/proc/doMove(atom/destination)
|
||||
. = FALSE
|
||||
/atom/movable/proc/doMove(atom/destination, direction, movetime)
|
||||
var/atom/oldloc = loc
|
||||
var/area/old_area = get_area(oldloc)
|
||||
var/same_loc = oldloc == destination
|
||||
|
||||
if(destination)
|
||||
var/atom/oldloc = loc
|
||||
var/same_loc = oldloc == destination
|
||||
var/area/old_area = get_area(oldloc)
|
||||
var/area/destarea = get_area(destination)
|
||||
|
||||
// Do The Move
|
||||
glide_for(movetime)
|
||||
last_move = isnull(direction) ? 0 : direction
|
||||
loc = destination
|
||||
|
||||
// Unset this in case it was set in some other proc. We're no longer moving diagonally for sure.
|
||||
moving_diagonally = 0
|
||||
|
||||
// We are moving to a different loc
|
||||
if(!same_loc)
|
||||
// Not moving out of nullspace
|
||||
if(oldloc)
|
||||
oldloc.Exited(src, destination)
|
||||
// If it's not the same area, Exited() it
|
||||
if(old_area && old_area != destarea)
|
||||
old_area.Exited(src, destination)
|
||||
for(var/atom/movable/AM in oldloc)
|
||||
|
||||
// Uncross everything where we left
|
||||
for(var/i in oldloc)
|
||||
var/atom/movable/AM = i
|
||||
if(AM == src)
|
||||
continue
|
||||
AM.Uncrossed(src)
|
||||
|
||||
// Information about turf and z-levels for source and dest collected
|
||||
var/turf/oldturf = get_turf(oldloc)
|
||||
var/turf/destturf = get_turf(destination)
|
||||
var/old_z = (oldturf ? oldturf.z : null)
|
||||
var/dest_z = (destturf ? destturf.z : null)
|
||||
|
||||
// So objects can be informed of z-level changes
|
||||
if (old_z != dest_z)
|
||||
onTransitZ(old_z, dest_z)
|
||||
|
||||
// Destination atom Entered
|
||||
destination.Entered(src, oldloc)
|
||||
|
||||
// Entered() the new area if it's not the same area
|
||||
if(destarea && old_area != destarea)
|
||||
destarea.Entered(src, oldloc)
|
||||
|
||||
for(var/atom/movable/AM in destination)
|
||||
// We ignore ourselves because if we're multi-tile we might be in both old and new locs
|
||||
for(var/i in destination)
|
||||
var/atom/movable/AM = i
|
||||
if(AM == src)
|
||||
continue
|
||||
AM.Crossed(src, oldloc)
|
||||
|
||||
// Call our thingy to inform everyone we moved
|
||||
Moved(oldloc, NONE, TRUE)
|
||||
|
||||
// Break pulling if we are too far to pull now.
|
||||
if(pulledby && (pulledby.z != src.z || get_dist(pulledby, src) > 1))
|
||||
pulledby.stop_pulling()
|
||||
|
||||
Moved(oldloc, NONE, TRUE)
|
||||
. = TRUE
|
||||
// We moved
|
||||
return TRUE
|
||||
|
||||
//If no destination, move the atom into nullspace (don't do this unless you know what you're doing)
|
||||
else
|
||||
. = TRUE
|
||||
if (loc)
|
||||
var/atom/oldloc = loc
|
||||
var/area/old_area = get_area(oldloc)
|
||||
oldloc.Exited(src, null)
|
||||
if(old_area)
|
||||
old_area.Exited(src, null)
|
||||
else if(oldloc)
|
||||
loc = null
|
||||
|
||||
// Uncross everything where we left (no multitile safety like above because we are definitely not still there)
|
||||
for(var/i in oldloc)
|
||||
var/atom/movable/AM = i
|
||||
AM.Uncrossed(src)
|
||||
|
||||
// Exited() our loc and area
|
||||
oldloc.Exited(src, null)
|
||||
if(old_area)
|
||||
old_area.Exited(src, null)
|
||||
|
||||
// We moved
|
||||
return TRUE
|
||||
|
||||
/atom/movable/proc/onTransitZ(old_z,new_z)
|
||||
GLOB.z_moved_event.raise_event(src, old_z, new_z)
|
||||
for(var/item in src) // Notify contents of Z-transition. This can be overridden IF we know the items contents do not care.
|
||||
var/atom/movable/AM = item
|
||||
AM.onTransitZ(old_z,new_z)
|
||||
|
||||
/atom/movable/proc/glide_for(movetime)
|
||||
if(movetime)
|
||||
glide_size = WORLD_ICON_SIZE/max(DS2TICKS(movetime), 1)
|
||||
spawn(movetime)
|
||||
glide_size = initial(glide_size)
|
||||
else
|
||||
glide_size = initial(glide_size)
|
||||
|
||||
/////////////////////////////////////////////////////////////////
|
||||
|
||||
//called when src is thrown into hit_atom
|
||||
|
||||
@@ -1,12 +1,2 @@
|
||||
/atom/movable/proc/Bump_vr(var/atom/A, yes)
|
||||
return
|
||||
|
||||
/atom/movable/set_dir(newdir)
|
||||
. = ..(newdir)
|
||||
if(riding_datum)
|
||||
riding_datum.handle_vehicle_offsets()
|
||||
|
||||
/atom/movable/relaymove(mob/user, direction)
|
||||
. = ..()
|
||||
if(riding_datum)
|
||||
riding_datum.handle_ride(user, direction)
|
||||
|
||||
@@ -24,6 +24,7 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
|
||||
var/list/purchased_powers_history = list() //Used for round-end report, includes respec uses too.
|
||||
var/last_shriek = null // world.time when the ling last used a shriek.
|
||||
var/next_escape = 0 // world.time when the ling can next use Escape Restraints
|
||||
var/thermal_sight = FALSE // Is our Vision Augmented? With thermals?
|
||||
|
||||
/datum/changeling/New(var/gender=FEMALE)
|
||||
..()
|
||||
@@ -64,8 +65,8 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
|
||||
if(!mind) return
|
||||
if(!mind.changeling) mind.changeling = new /datum/changeling(gender)
|
||||
|
||||
verbs += /datum/changeling/proc/EvolutionMenu
|
||||
verbs += /mob/proc/changeling_respec
|
||||
verbs.Add(/datum/changeling/proc/EvolutionMenu)
|
||||
verbs.Add(/mob/proc/changeling_respec)
|
||||
add_language("Changeling")
|
||||
|
||||
var/lesser_form = !ishuman(src)
|
||||
@@ -84,7 +85,7 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
|
||||
if(P.isVerb)
|
||||
if(lesser_form && !P.allowduringlesserform) continue
|
||||
if(!(P in src.verbs))
|
||||
src.verbs += P.verbpath
|
||||
verbs.Add(P.verbpath)
|
||||
if(P.make_hud_button)
|
||||
if(!src.ability_master)
|
||||
src.ability_master = new /obj/screen/movable/ability_master(src)
|
||||
@@ -111,7 +112,7 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
|
||||
if(!mind || !mind.changeling) return
|
||||
for(var/datum/power/changeling/P in mind.changeling.purchased_powers)
|
||||
if(P.isVerb)
|
||||
verbs -= P.verbpath
|
||||
verbs.Remove(P.verbpath)
|
||||
var/obj/screen/ability/verb_based/changeling/C = ability_master.get_ability_by_proc_ref(P.verbpath)
|
||||
if(C)
|
||||
ability_master.remove_ability(C)
|
||||
|
||||
@@ -3,11 +3,11 @@
|
||||
desc = "Permits us to syphon the DNA from a human. They become one with us, and we become stronger if they were of our kind."
|
||||
ability_icon_state = "ling_absorb_dna"
|
||||
genomecost = 0
|
||||
verbpath = /mob/proc/changeling_absorb_dna
|
||||
verbpath = /mob/living/proc/changeling_absorb_dna
|
||||
|
||||
//Absorbs the victim's DNA. Requires a strong grip on the victim.
|
||||
//Doesn't cost anything as it's the most basic ability.
|
||||
/mob/proc/changeling_absorb_dna()
|
||||
/mob/living/proc/changeling_absorb_dna()
|
||||
set category = "Changeling"
|
||||
set name = "Absorb DNA"
|
||||
|
||||
@@ -67,8 +67,7 @@
|
||||
to_chat(src, "<span class='notice'>We have absorbed [T]!</span>")
|
||||
src.visible_message("<span class='danger'>[src] sucks the fluids from [T]!</span>")
|
||||
to_chat(T, "<span class='danger'>You have been absorbed by the changeling!</span>")
|
||||
if(src.nutrition < 400)
|
||||
src.nutrition = min((src.nutrition + T.nutrition), 400)
|
||||
adjust_nutrition(T.nutrition)
|
||||
changeling.chem_charges += 10
|
||||
if(changeling.readapts <= 0)
|
||||
changeling.readapts = 0 //SANITYYYYYY
|
||||
|
||||
@@ -1,12 +1,11 @@
|
||||
//Augmented Eyesight: Gives you thermal and night vision - bye bye, flashlights. Also, high DNA cost because of how powerful it is.
|
||||
//Augmented Eyesight: Gives you thermal vision. Also, higher DNA cost because of how powerful it is.
|
||||
|
||||
/datum/power/changeling/augmented_eyesight
|
||||
name = "Augmented Eyesight"
|
||||
desc = "Creates heat receptors in our eyes and dramatically increases light sensing ability."
|
||||
helptext = "Grants us night vision and thermal vision. It may be toggled on or off. We will become more vulnerable to flash-based devices while active."
|
||||
helptext = "Grants us thermal vision. It may be toggled on or off. We will become more vulnerable to flash-based devices while active."
|
||||
ability_icon_state = "ling_augmented_eyesight"
|
||||
genomecost = 2
|
||||
var/active = 0 //Whether or not vision is enhanced
|
||||
verbpath = /mob/proc/changeling_augmented_eyesight
|
||||
|
||||
/mob/proc/changeling_augmented_eyesight()
|
||||
@@ -17,23 +16,22 @@
|
||||
var/datum/changeling/changeling = changeling_power(5,0,100,CONSCIOUS)
|
||||
if(!changeling)
|
||||
return 0
|
||||
src.mind.changeling.chem_charges -= 5
|
||||
src.sight |= SEE_MOBS
|
||||
/*
|
||||
|
||||
var/mob/living/carbon/human/C = src
|
||||
|
||||
active = !active
|
||||
changeling.thermal_sight = !changeling.thermal_sight
|
||||
|
||||
var/active = changeling.thermal_sight
|
||||
|
||||
if(active)
|
||||
to_chat(C, "<span class='notice'>We feel a minute twitch in our eyes, and darkness creeps away.</span>")
|
||||
C.sight |= SEE_MOBS
|
||||
C.permanent_sight_flags |= SEE_MOBS
|
||||
C.see_in_dark = 8
|
||||
C.dna.species.invis_sight = SEE_INVISIBLE_MINIMUM
|
||||
src.mind.changeling.chem_charges -= 5
|
||||
to_chat(C, "<span class='notice'>We feel a minute twitch in our eyes, and a hidden layer to the world is revealed.</span>")
|
||||
C.add_modifier(/datum/modifier/changeling/thermal_sight, 0, src)
|
||||
// C.permanent_sight_flags |= SEE_MOBS
|
||||
// C.dna.species.invis_sight = SEE_INVISIBLE_MINIMUM
|
||||
else
|
||||
to_chat(C, "<span class='notice'>Our vision dulls. Shadows gather.</span>")
|
||||
C.sight &= ~SEE_MOBS
|
||||
C.permanent_sight_flags &= ~SEE_MOBS
|
||||
C.see_in_dark = 0
|
||||
C.dna.species.invis_sight = initial(user.dna.species.invis_sight)
|
||||
to_chat(C, "<span class='notice'>Our vision dulls.</span>")
|
||||
C.remove_modifiers_of_type(/datum/modifier/changeling/thermal_sight)
|
||||
// C.permanent_sight_flags &= ~SEE_MOBS
|
||||
// C.dna.species.invis_sight = initial(user.dna.species.invis_sight)
|
||||
return 1
|
||||
*/
|
||||
@@ -14,7 +14,6 @@
|
||||
on_expired_text = "<span class='notice'>Our protective armor underneath our skin fades as we absorb it.</span>"
|
||||
max_health_flat = 50
|
||||
|
||||
//Increases macimum chemical storage
|
||||
/mob/proc/changeling_endoarmor()
|
||||
if(ishuman(src))
|
||||
var/mob/living/carbon/human/H = src
|
||||
|
||||
@@ -43,7 +43,10 @@
|
||||
|
||||
spawn(rand(2 MINUTES, 4 MINUTES))
|
||||
//The ling will now be able to choose when to revive
|
||||
src.verbs += /mob/proc/changeling_revive
|
||||
verbs.Add(/mob/proc/changeling_revive)
|
||||
|
||||
new /obj/changeling_revive_holder(src)
|
||||
|
||||
to_chat(src, "<span class='notice'><font size='5'>We are ready to rise. Use the <b>Revive</b> verb when you are ready.</font></span>")
|
||||
|
||||
feedback_add_details("changeling_powers","FD")
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
ling_datum.purchased_powers = list() //Then wipe all the powers we bought.
|
||||
ling_datum.geneticpoints = ling_datum.max_geneticpoints //Now refund our points to the maximum.
|
||||
ling_datum.chem_recharge_rate = 0.5 //If glands were bought, revert that upgrade.
|
||||
ling_datum.thermal_sight = FALSE
|
||||
src.mind.changeling.recursive_enhancement = 0 //Ensures this is cleared
|
||||
|
||||
ling_datum.chem_storage = 50
|
||||
|
||||
@@ -82,10 +82,28 @@
|
||||
C.set_stat(CONSCIOUS)
|
||||
C.forbid_seeing_deadchat = FALSE
|
||||
C.timeofdeath = null
|
||||
src.verbs -= /mob/proc/changeling_revive
|
||||
verbs.Remove(/mob/proc/changeling_revive)
|
||||
// re-add our changeling powers
|
||||
C.make_changeling()
|
||||
|
||||
|
||||
|
||||
return 1
|
||||
|
||||
//Revive from revival stasis, but one level removed, as the tab refuses to update. Placed in its own tab to avoid hyper-exploding the original tab through the same name being used.
|
||||
|
||||
/obj/changeling_revive_holder
|
||||
name = "strange object"
|
||||
desc = "Please report this object's existence to the dev team! You shouldn't see it."
|
||||
mouse_opacity = FALSE
|
||||
alpha = 1
|
||||
|
||||
/obj/changeling_revive_holder/verb/ling_revive()
|
||||
set src = usr.contents
|
||||
set category = "Regenerate"
|
||||
set name = "Revive"
|
||||
set desc = "We are ready to revive ourselves on command."
|
||||
|
||||
if(iscarbon(usr))
|
||||
var/mob/living/carbon/C = usr
|
||||
C.changeling_revive()
|
||||
|
||||
qdel(src)
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
if(!T) return 0
|
||||
add_attack_logs(src,T,"Unfat sting (changeling)")
|
||||
to_chat(T, "<span class='danger'>you feel a small prick as stomach churns violently and you become to feel skinnier.</span>")
|
||||
T.overeatduration = 0
|
||||
T.nutrition -= 100
|
||||
T.adjust_nutrition(-100)
|
||||
feedback_add_details("changeling_powers","US")
|
||||
return 1
|
||||
@@ -84,9 +84,9 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa","
|
||||
..()
|
||||
|
||||
examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if(iscultist(user))
|
||||
to_chat(user, "This spell circle reads: <i>[word1] [word2] [word3]</i>.")
|
||||
. += "This spell circle reads: <i>[word1] [word2] [word3]</i>."
|
||||
|
||||
|
||||
attackby(I as obj, user as mob)
|
||||
@@ -422,10 +422,11 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa","
|
||||
return
|
||||
|
||||
examine(mob/user)
|
||||
. = ..()
|
||||
if(!iscultist(user))
|
||||
to_chat(user, "An old, dusty tome with frayed edges and a sinister looking cover.")
|
||||
. += "An old, dusty tome with frayed edges and a sinister looking cover."
|
||||
else
|
||||
to_chat(user, "The scriptures of Nar-Sie, The One Who Sees, The Geometer of Blood. Contains the details of every ritual his followers could think of. Most of these are useless, though.")
|
||||
. += "The scriptures of Nar-Sie, The One Who Sees, The Geometer of Blood. Contains the details of every ritual his followers could think of. Most of these are useless, though."
|
||||
|
||||
/obj/item/weapon/book/tome/cultify()
|
||||
return
|
||||
|
||||
@@ -306,7 +306,7 @@ var/global/list/additional_antag_types = list()
|
||||
var/escaped_on_pod_5 = 0
|
||||
var/escaped_on_shuttle = 0
|
||||
|
||||
var/list/area/escape_locations = list(/area/shuttle/escape/centcom, /area/shuttle/escape_pod1/centcom, /area/shuttle/escape_pod2/centcom, /area/shuttle/escape_pod3/centcom, /area/shuttle/escape_pod5/centcom)
|
||||
var/list/area/escape_locations = list(/area/shuttle/escape, /area/shuttle/escape_pod1/centcom, /area/shuttle/escape_pod2/centcom, /area/shuttle/escape_pod3/centcom, /area/shuttle/escape_pod5/centcom) //VOREStation Edit
|
||||
|
||||
for(var/mob/M in player_list)
|
||||
if(M.client)
|
||||
|
||||
@@ -64,4 +64,4 @@
|
||||
T.maxhealth = round(initial(T.maxhealth) * 1.4)
|
||||
T.shot_delay = round(initial(T.shot_delay) / 2)
|
||||
T.auto_repair = 1
|
||||
T.active_power_usage = round(initial(T.active_power_usage) * 5)
|
||||
T.update_active_power_usage(round(initial(T.active_power_usage) * 5))
|
||||
@@ -55,7 +55,7 @@
|
||||
var/obj/effect/meteor/M = new Me(pickedstart)
|
||||
M.dest = pickedgoal
|
||||
spawn(0)
|
||||
walk_towards(M, M.dest, 1)
|
||||
walk_towards(M, M.dest, 3) //VOREStation Edit - Slower Meteors
|
||||
return
|
||||
|
||||
/proc/spaceDebrisStartLoc(startSide, Z)
|
||||
@@ -138,14 +138,13 @@
|
||||
|
||||
. = ..() //process movement...
|
||||
|
||||
if(.)//.. if did move, ram the turf we get in
|
||||
var/turf/T = get_turf(loc)
|
||||
ram_turf(T)
|
||||
/obj/effect/meteor/Moved(atom/old_loc, direction, forced = FALSE)
|
||||
. = ..()
|
||||
var/turf/T = get_turf(loc)
|
||||
ram_turf(T)
|
||||
|
||||
if(prob(10) && !istype(T, /turf/space))//randomly takes a 'hit' from ramming
|
||||
get_hit()
|
||||
|
||||
return .
|
||||
if(prob(10) && !istype(T, /turf/space)) //randomly takes a 'hit' from ramming
|
||||
get_hit()
|
||||
|
||||
/obj/effect/meteor/Destroy()
|
||||
walk(src,0) //this cancels the walk_towards() proc
|
||||
|
||||
@@ -51,10 +51,10 @@
|
||||
icon_state = "pinonfar"
|
||||
|
||||
/obj/item/weapon/pinpointer/examine(mob/user)
|
||||
..(user)
|
||||
. = ..()
|
||||
for(var/obj/machinery/nuclearbomb/bomb in machines)
|
||||
if(bomb.timing)
|
||||
to_chat(user, "Extreme danger. Arming signal detected. Time remaining: [bomb.timeleft]")
|
||||
. += "Extreme danger. Arming signal detected. Time remaining: [bomb.timeleft]"
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -23,8 +23,8 @@
|
||||
uses = 1
|
||||
|
||||
/obj/item/weapon/disposable_teleporter/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "[uses] uses remaining.")
|
||||
. = ..()
|
||||
. += "[uses] uses remaining."
|
||||
|
||||
/obj/item/weapon/disposable_teleporter/attack_self(mob/user as mob)
|
||||
if(!uses)
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
#define SIPHON_CORE_TO_ENERGY 0.5
|
||||
|
||||
// This is called every tick, so long as a link exists between the target and the Technomancer.
|
||||
/obj/item/weapon/spell/energy_siphon/proc/siphon(atom/movable/siphoning, mob/user)
|
||||
/obj/item/weapon/spell/energy_siphon/proc/siphon(atom/movable/siphoning, mob/living/user)
|
||||
var/list/things_to_drain = things_to_siphon // Temporary list copy of what we're gonna steal from.
|
||||
var/charge_to_give = 0 // How much energy to give to the Technomancer at the end.
|
||||
var/flow_remaining = calculate_spell_power(flow_rate)
|
||||
@@ -141,7 +141,7 @@
|
||||
if( (core.max_energy - core.energy) < charge_to_give ) // We have some overflow, if this is true.
|
||||
if(user.isSynthetic()) // Let's do something with it, if we're a robot.
|
||||
charge_to_give = charge_to_give - (core.max_energy - core.energy)
|
||||
user.nutrition = min(user.nutrition + (charge_to_give / SIPHON_FBP_TO_ENERGY), 400)
|
||||
user.adjust_nutrition(charge_to_give / SIPHON_FBP_TO_ENERGY)
|
||||
to_chat(user, "<span class='notice'>Redirected energy to internal microcell.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>Stolen [charge_to_give * CELLRATE] kJ.</span>")
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
obj_path = /obj/item/weapon/spell/mark
|
||||
ability_icon_state = "tech_mark"
|
||||
category = UTILITY_SPELLS
|
||||
|
||||
//VOREStation Add - Multiple technomancer support
|
||||
/datum/technomancer_marker
|
||||
var/weakref/U
|
||||
var/image/I
|
||||
@@ -32,7 +32,7 @@
|
||||
|
||||
//This is global, to avoid looping through a list of all objects, or god forbid, looping through world.
|
||||
GLOBAL_LIST_INIT(mark_spells, list())
|
||||
|
||||
//VOREStation Add End
|
||||
/obj/item/weapon/spell/mark
|
||||
name = "mark"
|
||||
icon_state = "mark"
|
||||
@@ -45,6 +45,7 @@ GLOBAL_LIST_INIT(mark_spells, list())
|
||||
to_chat(user, "<span class='warning'>You can't teleport here!</span>")
|
||||
return 0
|
||||
if(pay_energy(1000))
|
||||
//VOREStation Add - Multiple technomancer support
|
||||
var/datum/technomancer_marker/marker = GLOB.mark_spells[weakref(user)]
|
||||
//They have one in the list
|
||||
if(istype(marker))
|
||||
@@ -54,6 +55,7 @@ GLOBAL_LIST_INIT(mark_spells, list())
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You mark \the [get_turf(user)] under you.</span>")
|
||||
GLOB.mark_spells[weakref(user)] = new /datum/technomancer_marker(user)
|
||||
//VOREStation Add End
|
||||
adjust_instability(5)
|
||||
return 1
|
||||
else
|
||||
@@ -81,7 +83,7 @@ GLOBAL_LIST_INIT(mark_spells, list())
|
||||
|
||||
/obj/item/weapon/spell/recall/on_use_cast(var/mob/living/user)
|
||||
if(pay_energy(3000))
|
||||
var/datum/technomancer_marker/marker = GLOB.mark_spells[weakref(user)]
|
||||
var/datum/technomancer_marker/marker = GLOB.mark_spells[weakref(user)] //VOREStation Add - Multiple technomancer support
|
||||
if(!istype(marker))
|
||||
to_chat(user, "<span class='danger'>There's no Mark!</span>")
|
||||
return 0
|
||||
@@ -104,7 +106,7 @@ GLOBAL_LIST_INIT(mark_spells, list())
|
||||
time_left--
|
||||
sleep(1 SECOND)
|
||||
|
||||
var/turf/target_turf = marker.T
|
||||
var/turf/target_turf = marker.T //VOREStation Edit - Multiple technomancer support
|
||||
var/turf/old_turf = get_turf(user)
|
||||
|
||||
for(var/obj/item/weapon/grab/G in user.contents) // People the Technomancer is grabbing come along for the ride.
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
/datum/job/hop
|
||||
disallow_jobhop = TRUE
|
||||
pto_type = PTO_CIVILIAN
|
||||
departments = list(DEPARTMENT_COMMAND, DEPARTMENT_CIVILIAN)
|
||||
departments_managed = list(DEPARTMENT_CIVILIAN, DEPARTMENT_CARGO, DEPARTMENT_PLANET)
|
||||
|
||||
alt_titles = list("Crew Resources Officer" = /datum/alt_title/cro,
|
||||
"Deputy Director" = /datum/alt_title/deputy_director)
|
||||
|
||||
+13
-13
@@ -39,16 +39,16 @@ var/const/SAR =(1<<14)
|
||||
faction = "Station"
|
||||
total_positions = 1
|
||||
spawn_positions = 1
|
||||
supervisors = "the research director"
|
||||
supervisors = "the Head of Personnel"
|
||||
selection_color = "#d6d05c"
|
||||
economic_modifier = 7
|
||||
economic_modifier = 8
|
||||
minimal_player_age = 7
|
||||
pto_type = PTO_EXPLORATION
|
||||
|
||||
access = list(access_eva, access_maint_tunnels, access_external_airlocks, access_pilot, access_explorer, access_research, access_gateway)
|
||||
minimal_access = list(access_eva, access_maint_tunnels, access_external_airlocks, access_pilot, access_explorer, access_research, access_gateway)
|
||||
access = list(access_eva, access_maint_tunnels, access_external_airlocks, access_pilot, access_explorer, access_gateway)
|
||||
minimal_access = list(access_eva, access_maint_tunnels, access_external_airlocks, access_pilot, access_explorer, access_gateway)
|
||||
outfit_type = /decl/hierarchy/outfit/job/pathfinder
|
||||
job_description = " The Pathfinder's job is to lead and manage expeditions, and is the primary authority on all off-station expeditions."
|
||||
job_description = "The Pathfinder's job is to lead and manage expeditions, and is the primary authority on all off-station expeditions."
|
||||
|
||||
/datum/alt_title/pathfinder
|
||||
title = "Pathfinder"
|
||||
@@ -59,9 +59,9 @@ var/const/SAR =(1<<14)
|
||||
departments = list(DEPARTMENT_PLANET)
|
||||
department_flag = MEDSCI
|
||||
faction = "Station"
|
||||
total_positions = 2
|
||||
spawn_positions = 2
|
||||
supervisors = "the pathfinder and the head of personnel"
|
||||
total_positions = 4
|
||||
spawn_positions = 4
|
||||
supervisors = "the Pathfinder and the Head of Personnel"
|
||||
selection_color = "#999440"
|
||||
economic_modifier = 5
|
||||
minimal_player_age = 3
|
||||
@@ -82,12 +82,12 @@ var/const/SAR =(1<<14)
|
||||
faction = "Station"
|
||||
total_positions = 3
|
||||
spawn_positions = 3
|
||||
supervisors = "the pathfinder and the research director"
|
||||
supervisors = "the Pathfinder and the Head of Personnel"
|
||||
selection_color = "#999440"
|
||||
economic_modifier = 6
|
||||
pto_type = PTO_EXPLORATION
|
||||
access = list(access_explorer, access_research)
|
||||
minimal_access = list(access_explorer, access_research)
|
||||
access = list(access_explorer, access_external_airlocks, access_eva)
|
||||
minimal_access = list(access_explorer, access_external_airlocks, access_eva)
|
||||
outfit_type = /decl/hierarchy/outfit/job/explorer2
|
||||
job_description = "An Explorer searches for interesting things, and returns them to the station."
|
||||
|
||||
@@ -97,12 +97,12 @@ var/const/SAR =(1<<14)
|
||||
/datum/job/sar
|
||||
title = "Field Medic"
|
||||
flag = SAR
|
||||
departments = list(DEPARTMENT_PLANET)
|
||||
departments = list(DEPARTMENT_PLANET, DEPARTMENT_MEDICAL)
|
||||
department_flag = MEDSCI
|
||||
faction = "Station"
|
||||
total_positions = 2
|
||||
spawn_positions = 2
|
||||
supervisors = "the pathfinder and the chief medical officer"
|
||||
supervisors = "the Pathfinder and the Chief Medical Officer"
|
||||
selection_color = "#999440"
|
||||
economic_modifier = 6
|
||||
minimal_player_age = 3
|
||||
@@ -5,11 +5,11 @@
|
||||
access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue,
|
||||
access_tox_storage, access_teleporter, access_sec_doors,
|
||||
access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage,
|
||||
access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_eva, access_network, access_maint_tunnels) //Yawn added "access_maint_tunnels"
|
||||
access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_eva, access_network) //YW Edit access_gateway
|
||||
minimal_access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue,
|
||||
access_tox_storage, access_teleporter, access_sec_doors,
|
||||
access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage,
|
||||
access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_eva, access_network, access_maint_tunnels)
|
||||
access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_eva, access_network) //YW Edit access_gateway
|
||||
|
||||
/datum/job/scientist
|
||||
spawn_positions = 5
|
||||
|
||||
@@ -5,11 +5,11 @@
|
||||
access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory,
|
||||
access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
|
||||
access_research, access_engine, access_mining, access_construction, access_mailsorting,
|
||||
access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks)
|
||||
access_heads, access_hos, access_RC_announce, access_keycard_auth, access_external_airlocks)
|
||||
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory,
|
||||
access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
|
||||
access_research, access_engine, access_mining, access_construction, access_mailsorting,
|
||||
access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks)
|
||||
access_heads, access_hos, access_RC_announce, access_keycard_auth, access_external_airlocks)
|
||||
|
||||
/datum/job/warden
|
||||
pto_type = PTO_SECURITY
|
||||
|
||||
@@ -13,9 +13,9 @@
|
||||
cable.amount = 100
|
||||
..()
|
||||
|
||||
/obj/machinery/cablelayer/Move(new_turf,M_Dir)
|
||||
..()
|
||||
layCable(new_turf,M_Dir)
|
||||
/obj/machinery/cablelayer/Moved(atom/old_loc, direction, forced = FALSE)
|
||||
. = ..()
|
||||
layCable(loc,direction)
|
||||
|
||||
/obj/machinery/cablelayer/attack_hand(mob/user as mob)
|
||||
if(!cable&&!on)
|
||||
@@ -49,8 +49,8 @@
|
||||
to_chat(usr, "<span class='warning'>There's no more cable on the reel.</span>")
|
||||
|
||||
/obj/machinery/cablelayer/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "\The [src]'s cable reel has [cable.amount] length\s left.")
|
||||
. = ..()
|
||||
. += "[src]'s cable reel has [cable.amount] length\s left."
|
||||
|
||||
/obj/machinery/cablelayer/proc/load_cable(var/obj/item/stack/cable_coil/CC)
|
||||
if(istype(CC) && CC.amount)
|
||||
|
||||
@@ -67,7 +67,13 @@
|
||||
var/mob/living/carbon/human/M = locate(/mob/living/carbon/human, src.loc)
|
||||
if(M.lying)
|
||||
victim = M
|
||||
icon_state = M.pulse ? "table2-active" : "table2-idle"
|
||||
if(M.pulse)
|
||||
if(M.stat)
|
||||
icon_state = "table2-sleep"
|
||||
else
|
||||
icon_state = "table2-active"
|
||||
else
|
||||
icon_state = "table2-dead"
|
||||
return 1
|
||||
victim = null
|
||||
icon_state = "table2-idle"
|
||||
|
||||
@@ -207,8 +207,6 @@
|
||||
|
||||
available_chemicals.Cut()
|
||||
available_chemicals = base_chemicals.Copy()
|
||||
idle_power_usage = initial(idle_power_usage)
|
||||
active_power_usage = initial(active_power_usage)
|
||||
|
||||
for(var/obj/item/weapon/stock_parts/P in component_parts)
|
||||
if(istype(P, /obj/item/weapon/stock_parts/capacitor))
|
||||
@@ -216,8 +214,8 @@
|
||||
|
||||
cap_rating = max(1, round(cap_rating / 2))
|
||||
|
||||
idle_power_usage /= cap_rating
|
||||
active_power_usage /= cap_rating
|
||||
update_idle_power_usage(initial(idle_power_usage) / cap_rating)
|
||||
update_active_power_usage(initial(active_power_usage) / cap_rating)
|
||||
|
||||
if(!limited)
|
||||
for(var/obj/item/weapon/stock_parts/P in component_parts)
|
||||
|
||||
@@ -25,8 +25,9 @@
|
||||
default_apply_parts()
|
||||
|
||||
/obj/machinery/power/thermoregulator/examine(mob/user)
|
||||
if(..(user,2))
|
||||
to_chat(user, "There is a small display that reads \"[convert_k2c(target_temp)]C\".")
|
||||
. = ..()
|
||||
if(get_dist(user, src) <= 2)
|
||||
. += "There is a small display that reads \"[convert_k2c(target_temp)]C\"."
|
||||
|
||||
/obj/machinery/power/thermoregulator/attackby(obj/item/I, mob/user)
|
||||
if(I.is_screwdriver())
|
||||
|
||||
@@ -77,24 +77,22 @@
|
||||
radio_connection.post_signal(src, signal)
|
||||
|
||||
/obj/machinery/meter/examine(mob/user)
|
||||
var/t = "A gas flow meter. "
|
||||
. = ..()
|
||||
|
||||
if(get_dist(user, src) > 3 && !(istype(user, /mob/living/silicon/ai) || istype(user, /mob/observer/dead)))
|
||||
t += "<span class='warning'>You are too far away to read it.</span>"
|
||||
. += "<span class='warning'>You are too far away to read it.</span>"
|
||||
|
||||
else if(stat & (NOPOWER|BROKEN))
|
||||
t += "<span class='warning'>The display is off.</span>"
|
||||
. += "<span class='warning'>The display is off.</span>"
|
||||
|
||||
else if(src.target)
|
||||
else if(target)
|
||||
var/datum/gas_mixture/environment = target.return_air()
|
||||
if(environment)
|
||||
t += "The pressure gauge reads [round(environment.return_pressure(), 0.01)] kPa; [round(environment.temperature,0.01)]K ([round(environment.temperature-T0C,0.01)]°C)"
|
||||
. += "The pressure gauge reads [round(environment.return_pressure(), 0.01)] kPa; [round(environment.temperature,0.01)]K ([round(environment.temperature-T0C,0.01)]°C)"
|
||||
else
|
||||
t += "The sensor error light is blinking."
|
||||
. += "The sensor error light is blinking."
|
||||
else
|
||||
t += "The connect error light is blinking."
|
||||
|
||||
to_chat(user,t)
|
||||
. += "The connect error light is blinking."
|
||||
|
||||
/obj/machinery/meter/Click()
|
||||
|
||||
|
||||
@@ -27,6 +27,8 @@
|
||||
|
||||
var/datum/wires/autolathe/wires = null
|
||||
|
||||
var/filtertext
|
||||
|
||||
/obj/machinery/autolathe/New()
|
||||
..()
|
||||
wires = new(src)
|
||||
@@ -72,11 +74,14 @@
|
||||
material_bottom += "<td width = '25%' align = center>[stored_material[material]]<b>/[storage_capacity[material]]</b></td>"
|
||||
|
||||
dat += "[material_top.Join()]</tr>[material_bottom.Join()]</tr></table><hr>"
|
||||
dat += "<b>Filter:</b> <a href='?src=\ref[src];setfilter=1'>[filtertext ? filtertext : "None Set"]</a><br>"
|
||||
dat += "<h2>Printable Designs</h2><h3>Showing: <a href='?src=\ref[src];change_category=1'>[current_category]</a>.</h3></center><table width = '100%'>"
|
||||
|
||||
for(var/datum/category_item/autolathe/R in current_category.items)
|
||||
if(R.hidden && !hacked)
|
||||
continue
|
||||
if(filtertext && findtext(R.name, filtertext) == 0)
|
||||
continue
|
||||
var/can_make = 1
|
||||
var/list/material_string = list()
|
||||
var/list/multiplier_string = list()
|
||||
@@ -108,12 +113,14 @@
|
||||
multiplier_string += "<a href='?src=\ref[src];make=\ref[R];multiplier=[i]'>\[x[i]\]</a>"
|
||||
multiplier_string += "<a href='?src=\ref[src];make=\ref[R];multiplier=[max_sheets]'>\[x[max_sheets]\]</a>"
|
||||
|
||||
dat += "<tr><td width = 180>[R.hidden ? "<font color = 'red'>*</font>" : ""]<b>[can_make ? "<a href='?src=\ref[src];make=\ref[R];multiplier=1'>" : ""][R.name][can_make ? "</a>" : ""]</b>[R.hidden ? "<font color = 'red'>*</font>" : ""][multiplier_string.Join()]</td><td align = right>[material_string.Join()]</tr>"
|
||||
dat += "<tr><td width = 180>[R.hidden ? "<font color = 'red'>*</font>" : ""]<b>[can_make ? "<a href='?src=\ref[src];make=\ref[R];multiplier=1'>" : "<span class='linkOff'>"][R.name][can_make ? "</a>" : "</span>"]</b>[R.hidden ? "<font color = 'red'>*</font>" : ""][multiplier_string.Join()]</td><td align = right>[material_string.Join()]</tr>"
|
||||
|
||||
dat += "</table><hr>"
|
||||
|
||||
user << browse(dat.Join(), "window=autolathe")
|
||||
onclose(user, "autolathe")
|
||||
dat = jointext(dat, null)
|
||||
var/datum/browser/popup = new(user, "autolathe", "Autolathe Production Menu", 550, 700)
|
||||
popup.set_content(dat)
|
||||
popup.open()
|
||||
|
||||
/obj/machinery/autolathe/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
if(busy)
|
||||
@@ -229,6 +236,16 @@
|
||||
to_chat(usr, "<span class='notice'>The autolathe is busy. Please wait for completion of previous operation.</span>")
|
||||
return
|
||||
|
||||
else if(href_list["setfilter"])
|
||||
var/filterstring = input(usr, "Input a filter string, or blank to not filter:", "Design Filter", filtertext) as null|text
|
||||
if(!Adjacent(usr))
|
||||
return
|
||||
if(isnull(filterstring)) //Clicked Cancel
|
||||
return
|
||||
if(filterstring == "") //Cleared value
|
||||
filtertext = null
|
||||
filtertext = sanitize(filterstring, 25)
|
||||
|
||||
if(href_list["change_category"])
|
||||
|
||||
var/choice = input("Which category do you wish to display?") as null|anything in machine_recipes.categories
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user