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:
izac112
2020-05-06 21:53:03 +02:00
1099 changed files with 63850 additions and 118586 deletions
+1 -1
View File
@@ -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:
+39
View File
@@ -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>
+2
View File
@@ -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()
+2 -2
View File
@@ -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."
+12 -11
View File
@@ -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."
+2 -2
View File
@@ -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"]."
+2
View File
@@ -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
View File
@@ -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
+7
View File
@@ -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 -3
View File
@@ -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)
-6
View File
@@ -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.
+19 -1
View File
@@ -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)) { \
+14 -4
View File
@@ -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
)
+2
View File
@@ -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)
+1
View File
@@ -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
View File
@@ -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
+4
View File
@@ -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
+5
View File
@@ -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"
+4 -1
View File
@@ -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
+1 -1
View File
@@ -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(); }
+2 -1
View File
@@ -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.
+6 -3
View File
@@ -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
+3 -3
View File
@@ -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
+7
View File
@@ -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.
+1 -1
View File
@@ -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
View File
@@ -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)
+1 -1
View File
@@ -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
+1 -7
View File
@@ -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
View File
@@ -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
View File
@@ -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)
+3 -5
View File
@@ -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)
+1 -1
View File
@@ -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
+2
View File
@@ -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
+6
View File
@@ -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)
. = ..()
+3 -3
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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,
+6
View File
@@ -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
+3 -7
View File
@@ -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
+32
View File
@@ -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
+5 -3
View File
@@ -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
+1 -1
View File
@@ -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)
+2 -4
View File
@@ -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)
+70
View File
@@ -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
+7 -7
View File
@@ -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)
+27 -27
View File
@@ -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.
+1 -1
View File
@@ -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
+2
View File
@@ -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
-3
View File
@@ -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()
+1
View File
@@ -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
+78 -5
View File
@@ -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
View File
@@ -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
+4 -2
View File
@@ -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()
+3
View File
@@ -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,
+11 -2
View File
@@ -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
+4
View File
@@ -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
+30 -5
View File
@@ -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
+10
View File
@@ -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
+1 -1
View File
@@ -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
-18
View File
@@ -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"
-7
View File
@@ -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"
+56 -29
View File
@@ -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
View File
@@ -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
+13 -6
View File
@@ -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
View File
@@ -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
View File
@@ -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
-10
View File
@@ -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
+5 -4
View File
@@ -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
+1 -1
View File
@@ -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))
+7 -8
View File
@@ -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
+2 -2
View File
@@ -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.
+2
View File
@@ -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)
@@ -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
+2 -2
View File
@@ -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
+2 -2
View File
@@ -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
+5 -5
View File
@@ -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)
+7 -1
View File
@@ -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"
+2 -4
View File
@@ -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)
+3 -2
View File
@@ -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())
+7 -9
View File
@@ -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)]&deg;C)"
. += "The pressure gauge reads [round(environment.return_pressure(), 0.01)] kPa; [round(environment.temperature,0.01)]K ([round(environment.temperature-T0C,0.01)]&deg;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()
+20 -3
View File
@@ -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