Merge branch 'upstream-merge-6520' into prybars

This commit is contained in:
Meghan-Rossi
2019-12-19 18:47:49 +00:00
563 changed files with 260854 additions and 182301 deletions

View File

@@ -4,8 +4,8 @@ sudo: false
env:
global:
- BYOND_MAJOR="512"
- BYOND_MINOR="1453"
- BYOND_MAJOR="513"
- BYOND_MINOR="1502"
- MACRO_COUNT=4
matrix:
- TEST_DEFINE="MAP_TEST" TEST_FILE="code/_map_tests.dm" RUN="0"

View File

@@ -85,20 +85,21 @@
to_chat(user, "<span class='warning'>Access denied.</span>")
return
usr.set_machine(src)
var/list/node_connects = get_node_connect_dirs()
var/dat = {"<b>Power: </b><a href='?src=\ref[src];power=1'>[use_power?"On":"Off"]</a><br>
<b>Set Flow Rate Limit: </b>
[set_flow_rate]L/s | <a href='?src=\ref[src];set_press=1'>Change</a>
<br>
<b>Flow Rate: </b>[round(last_flow_rate, 0.1)]L/s
<br><hr>
<b>Node 1 Concentration:</b>
<b>Node 1 ([dir_name(node_connects[1],TRUE)]) Concentration:</b>
<a href='?src=\ref[src];node1_c=-0.1'><b>-</b></a>
<a href='?src=\ref[src];node1_c=-0.01'>-</a>
[mixing_inputs[air1]]([mixing_inputs[air1]*100]%)
<a href='?src=\ref[src];node1_c=0.01'><b>+</b></a>
<a href='?src=\ref[src];node1_c=0.1'>+</a>
<br>
<b>Node 2 Concentration:</b>
<b>Node 2 ([dir_name(node_connects[2],TRUE)]) Concentration:</b>
<a href='?src=\ref[src];node2_c=-0.1'><b>-</b></a>
<a href='?src=\ref[src];node2_c=-0.01'>-</a>
[mixing_inputs[air2]]([mixing_inputs[air2]*100]%)

View File

@@ -47,7 +47,7 @@
var/radio_filter_out
var/radio_filter_in
var/datum/looping_sound/air_pump/soundloop
//var/datum/looping_sound/air_pump/soundloop //VOREStation Removal
/obj/machinery/atmospherics/unary/vent_pump/on
use_power = 1
@@ -72,7 +72,7 @@
/obj/machinery/atmospherics/unary/vent_pump/Initialize()
. = ..()
soundloop = new(list(src), FALSE)
//soundloop = new(list(src), FALSE) //VOREStation Removal
/obj/machinery/atmospherics/unary/vent_pump/New()
..()
@@ -90,7 +90,7 @@
if(initial_loc)
initial_loc.air_vent_info -= id_tag
initial_loc.air_vent_names -= id_tag
QDEL_NULL(soundloop)
//QDEL_NULL(soundloop) //VOREStation Removal
return ..()
/obj/machinery/atmospherics/unary/vent_pump/high_volume
@@ -171,15 +171,15 @@
/obj/machinery/atmospherics/unary/vent_pump/proc/can_pump()
if(stat & (NOPOWER|BROKEN))
soundloop.stop()
//soundloop.stop() //VOREStation Removal
return 0
if(!use_power)
soundloop.stop()
//soundloop.stop() //VOREStation Removal
return 0
if(welded)
soundloop.stop()
//soundloop.stop() //VOREStation Removal
return 0
soundloop.start()
//soundloop.start() //VOREStation Removal
return 1
/obj/machinery/atmospherics/unary/vent_pump/process()

View File

@@ -9,13 +9,13 @@ mob/proc/airflow_stun()
if(last_airflow_stun > world.time - vsc.airflow_stun_cooldown) return 0
if(!(status_flags & CANSTUN) && !(status_flags & CANWEAKEN))
src << "<span class='notice'>You stay upright as the air rushes past you.</span>"
to_chat(src, "<span class='notice'>You stay upright as the air rushes past you.</span>")
return 0
if(buckled)
src << "<span class='notice'>Air suddenly rushes past you!</span>"
to_chat(src, "<span class='notice'>Air suddenly rushes past you!</span>")
return 0
if(!lying)
src << "<span class='warning'>The sudden rush of air knocks you over!</span>"
to_chat(src, "<span class='warning'>The sudden rush of air knocks you over!</span>")
Weaken(5)
last_airflow_stun = world.time

View File

@@ -10,10 +10,10 @@ client/proc/ZoneTick()
var/result = air_master.Tick()
if(result)
src << "Successfully Processed."
to_chat(src, "Successfully Processed.")
else
src << "Failed to process! ([air_master.tick_progress])"
to_chat(src, "Failed to process! ([air_master.tick_progress])")
*/
client/proc/Zone_Info(turf/T as null|turf)

View File

@@ -102,11 +102,12 @@ obj/var/contaminated = 0
if(vsc.plc.SKIN_BURNS && (species.breath_type != "phoron"))
if(!pl_head_protected() || !pl_suit_protected())
burn_skin(0.75)
if(prob(20)) src << "<span class='danger'>Your skin burns!</span>"
if(prob(20))
to_chat(src, "<span class='danger'>Your skin burns!</span>")
updatehealth()
//Burn eyes if exposed.
if(vsc.plc.EYE_BURNS && (species.breath_type != "phoron"))
if(vsc.plc.EYE_BURNS && species.breath_type && (species.breath_type != "phoron")) //VOREStation Edit: those who don't breathe
var/burn_eyes = 1
//Check for protective glasses
@@ -133,17 +134,18 @@ obj/var/contaminated = 0
if(vsc.plc.GENETIC_CORRUPTION && (species.breath_type != "phoron"))
if(rand(1,10000) < vsc.plc.GENETIC_CORRUPTION)
randmutb(src)
src << "<span class='danger'>High levels of toxins cause you to spontaneously mutate!</span>"
to_chat(src, "<span class='danger'>High levels of toxins cause you to spontaneously mutate!</span>")
domutcheck(src,null)
/mob/living/carbon/human/proc/burn_eyes()
var/obj/item/organ/internal/eyes/E = internal_organs_by_name[O_EYES]
if(E)
if(prob(20)) src << "<span class='danger'>Your eyes burn!</span>"
if(prob(20))
to_chat(src, "<span class='danger'>Your eyes burn!</span>")
E.damage += 2.5
eye_blurry = min(eye_blurry+1.5,50)
if (prob(max(0,E.damage - 15) + 1) &&!eye_blind)
src << "<span class='danger'>You are blinded!</span>"
to_chat(src, "<span class='danger'>You are blinded!</span>")
Blind(20)
/mob/living/carbon/human/proc/pl_head_protected()

View File

@@ -0,0 +1,31 @@
#if DM_VERSION < 513
#define ismovableatom(A) (istype(A, /atom/movable))
#define islist(L) (istype(L, /list))
#define CLAMP01(x) (CLAMP(x, 0, 1))
#define CLAMP(CLVALUE,CLMIN,CLMAX) ( max( (CLMIN), min((CLVALUE), (CLMAX)) ) )
#define ATAN2(x, y) ( !(x) && !(y) ? 0 : (y) >= 0 ? arccos((x) / sqrt((x)*(x) + (y)*(y))) : -arccos((x) / sqrt((x)*(x) + (y)*(y))) )
#define TAN(x) (sin(x) / cos(x))
#define arctan(x) (arcsin(x/sqrt(1+x*x)))
//////////////////////////////////////////////////
#else
#define ismovableatom(A) ismovable(A)
#define CLAMP01(x) clamp(x, 0, 1)
#define CLAMP(CLVALUE, CLMIN, CLMAX) clamp(CLVALUE, CLMIN, CLMAX)
#define TAN(x) tan(x)
#define ATAN2(x, y) arctan(x, y)
#endif

View File

@@ -1,2 +1,3 @@
// More for our custom races
#define IS_CHIMERA 12
#define IS_CHIMERA 12
#define IS_SHADEKIN 13

View File

@@ -88,6 +88,7 @@ var/list/be_special_flags = list(
#define MODE_AUTOTRAITOR "autotraitor"
#define MODE_INFILTRATOR "infiltrator"
#define MODE_THUG "thug"
#define MODE_STOWAWAY "stowaway"
#define DEFAULT_TELECRYSTAL_AMOUNT 120

View File

@@ -2,7 +2,7 @@
#define isdatum(D) istype(D, /datum)
#define isweakref(A) istype(A, /weakref)
#define islist(D) istype(D, /list)
//#define islist(D) istype(D, /list) //Built in
//---------------
#define isatom(D) istype(D, /atom)

View File

@@ -84,4 +84,4 @@
#define LIGHT_COLOR_INCANDESCENT_FLASHLIGHT "#FFCC66"
//Fake ambient occlusion filter
#define AMBIENT_OCCLUSION filter(type="drop_shadow", x=0, y=-2, size=4, border=4, color="#04080FAA")
#define AMBIENT_OCCLUSION filter(type="drop_shadow", x=0, y=-2, size=4, offset=4, color="#04080FAA")

View File

@@ -16,7 +16,6 @@
#define TICK_USAGE_TO_MS(starting_tickusage) (TICK_DELTA_TO_MS(world.tick_usage - starting_tickusage))
#define PERCENT(val) (round((val)*100, 0.1))
#define CLAMP01(x) (CLAMP(x, 0, 1))
//time of day but automatically adjusts to the server going into the next day within the same round.
//for when you need a reliable time number that doesn't depend on byond time.
@@ -30,17 +29,12 @@
// round() acts like floor(x, 1) by default but can't handle other values
#define FLOOR(x, y) ( round((x) / (y)) * (y) )
#define CLAMP(CLVALUE,CLMIN,CLMAX) ( max( (CLMIN), min((CLVALUE), (CLMAX)) ) )
// Similar to clamp but the bottom rolls around to the top and vice versa. min is inclusive, max is exclusive
#define WRAP(val, min, max) ( min == max ? min : (val) - (round(((val) - (min))/((max) - (min))) * ((max) - (min))) )
// Real modulus that handles decimals
#define MODULUS(x, y) ( (x) - (y) * round((x) / (y)) )
// Tangent
#define TAN(x) (sin(x) / cos(x))
// Cotangent
#define COT(x) (1 / TAN(x))
@@ -50,8 +44,6 @@
// Cosecant
#define CSC(x) (1 / sin(x))
#define ATAN2(x, y) ( !(x) && !(y) ? 0 : (y) >= 0 ? arccos((x) / sqrt((x)*(x) + (y)*(y))) : -arccos((x) / sqrt((x)*(x) + (y)*(y))) )
// Greatest Common Divisor - Euclid's algorithm
/proc/GCD(a, b)
return b ? GCD(b, (a) % (b)) : a

View File

@@ -17,12 +17,15 @@
#define A_FRUIT "fruit gland"
//species defines
//station species
#define SPECIES_AKULA "Akula"
#define SPECIES_ALRAUNE "Alraune"
#define SPECIES_NEVREAN "Nevrean"
#define SPECIES_PROTEAN "Protean"
#define SPECIES_RAPALA "Rapala"
#define SPECIES_SERGAL "Sergal"
#define SPECIES_SHADEKIN_CREW "Black-Eyed Shadekin"
#define SPECIES_VASILISSAN "Vasilissan"
#define SPECIES_VULPKANIN "Vulpkanin"
#define SPECIES_XENOCHIMERA "Xenochimera"
@@ -30,9 +33,11 @@
#define SPECIES_ZORREN_FLAT "Flatland Zorren"
#define SPECIES_ZORREN_HIGH "Highlander Zorren"
#define SPECIES_CUSTOM "Custom Species"
//monkey species
#define SPECIES_MONKEY_AKULA "Sobaka"
#define SPECIES_MONKEY_NEVREAN "Sparra"
#define SPECIES_MONKEY_SERGAL "Saru"
#define SPECIES_MONKEY_VULPKANIN "Wolpin"
//event species
#define SPECIES_WEREBEAST "Werebeast"
#define SPECIES_SHADEKIN "Shadekin"

View File

@@ -31,6 +31,7 @@
// Languages.
#define LANGUAGE_GALCOM "Galactic Common"
#define LANGUAGE_EAL "Encoded Audio Language"
#define LANGUAGE_SWARMBOT "Ancient Audio Encryption"
#define LANGUAGE_SOL_COMMON "Sol Common"
#define LANGUAGE_UNATHI "Sinta'unathi"
#define LANGUAGE_SIIK "Siik"

View File

@@ -2,5 +2,5 @@
#define TYPEID_NULL "0"
#define TYPEID_NORMAL_LIST "f"
//helper macros
#define GET_TYPEID(ref) ( ( (lentext(ref) <= 10) ? "TYPEID_NULL" : copytext(ref, 4, lentext(ref)-6) ) )
#define IS_NORMAL_LIST(L) (GET_TYPEID("\ref[L]") == TYPEID_NORMAL_LIST)
#define GET_TYPEID(ref) ( ( (length(ref) <= 10) ? "TYPEID_NULL" : copytext(ref, 4, length(ref)-6) ) )
#define IS_NORMAL_LIST(L) (GET_TYPEID("\ref[L]") == TYPEID_NORMAL_LIST)

View File

@@ -28,7 +28,7 @@ json_reader
src.json = json
. = new/list()
src.i = 1
while(src.i <= lentext(json))
while(src.i <= length(json))
var/char = get_char()
if(is_whitespace(char))
i++
@@ -46,7 +46,7 @@ json_reader
read_word()
var/val = ""
while(i <= lentext(json))
while(i <= length(json))
var/char = get_char()
if(is_whitespace(char) || symbols.Find(char))
i-- // let scanner handle this character
@@ -58,7 +58,7 @@ json_reader
var
escape = FALSE
val = ""
while(++i <= lentext(json))
while(++i <= length(json))
var/char = get_char()
if(escape)
switch(char)

View File

@@ -43,7 +43,7 @@ json_writer
var/static/list/json_escape = list("\\" = "\\\\", "\"" = "\\\"", "\n" = "\\n")
for(var/targ in json_escape)
var/start = 1
while(start <= lentext(txt))
while(start <= length(txt))
var/i = findtext(txt, targ, start)
if(!i)
break

View File

@@ -0,0 +1 @@
GLOBAL_LIST_INIT(speech_toppings, list("|" = "i", "+" = "b", "_" = "u"))

View File

@@ -0,0 +1 @@
var/datum/gear_tweak/collar_tag/gear_tweak_collar_tag = new()

View File

@@ -1,4 +1,4 @@
/obj/proc/analyze_gases(var/obj/A, var/mob/user)
/obj/proc/analyze_gases(var/atom/A, var/mob/user)
if(src != A)
user.visible_message("<span class='notice'>\The [user] has used \an [src] on \the [A]</span>")
@@ -13,12 +13,12 @@
user << "<span class='warning'>Your [src] flashes a red light as it fails to analyze \the [A].</span>"
return 0
/proc/atmosanalyzer_scan(var/obj/target, var/datum/gas_mixture/mixture, var/mob/user)
var/pressure = mixture.return_pressure()
var/total_moles = mixture.total_moles
/proc/atmosanalyzer_scan(var/atom/target, var/datum/gas_mixture/mixture, var/mob/user)
var/list/results = list()
if (total_moles>0)
if (mixture && mixture.total_moles > 0)
var/pressure = mixture.return_pressure()
var/total_moles = mixture.total_moles
results += "<span class='notice'>Pressure: [round(pressure,0.1)] kPa</span>"
for(var/mix in mixture.gas)
results += "<span class='notice'>[gas_data.name[mix]]: [round((mixture.gas[mix] / total_moles) * 100)]%</span>"
@@ -28,7 +28,10 @@
return results
/obj/proc/atmosanalyze(var/mob/user)
/turf/atmosanalyze(var/mob/user)
return atmosanalyzer_scan(src, src.air, user)
/atom/proc/atmosanalyze(var/mob/user)
return
/obj/item/weapon/tank/atmosanalyze(var/mob/user)
@@ -40,6 +43,33 @@
/obj/machinery/atmospherics/pipe/atmosanalyze(var/mob/user)
return atmosanalyzer_scan(src, src.parent.air, user)
/obj/machinery/atmospherics/portables_connector/atmosanalyze(var/mob/user)
return atmosanalyzer_scan(src, src.network.gases, user)
/obj/machinery/atmospherics/unary/atmosanalyze(var/mob/user)
return atmosanalyzer_scan(src, src.air_contents, user)
/obj/machinery/atmospherics/binary/atmosanalyze(var/mob/user)
return atmosanalyzer_scan(src, src.air1, user)
/obj/machinery/atmospherics/trinary/atmos_filter/atmosanalyze(var/mob/user)
return atmosanalyzer_scan(src, src.air1, user)
/obj/machinery/atmospherics/trinary/mixer/atmosanalyze(var/mob/user)
return atmosanalyzer_scan(src, src.air3, user)
/obj/machinery/atmospherics/omni/atmos_filter/atmosanalyze(var/mob/user)
return atmosanalyzer_scan(src, src.input.air, user)
/obj/machinery/atmospherics/omni/mixer/atmosanalyze(var/mob/user)
return atmosanalyzer_scan(src, src.output.air, user)
/obj/machinery/meter/atmosanalyze(var/mob/user)
var/datum/gas_mixture/mixture = null
if(src.target)
mixture = src.target.parent.air
return atmosanalyzer_scan(src, mixture, user)
/obj/machinery/power/rad_collector/atmosanalyze(var/mob/user)
if(P) return atmosanalyzer_scan(src, src.P.air_contents, user)

View File

@@ -39,7 +39,7 @@
var/extension = copytext(path,-4,0)
if( !fexists(path) || !(extension in valid_extensions) )
src << "<font color='red'>Error: browse_files(): File not found/Invalid file([path]).</font>"
to_chat(src, "<font color='red'>Error: browse_files(): File not found/Invalid file([path]).</font>")
return
return path
@@ -53,7 +53,7 @@
/client/proc/file_spam_check()
var/time_to_wait = fileaccess_timer - world.time
if(time_to_wait > 0)
src << "<font color='red'>Error: file_spam_check(): Spam. Please wait [round(time_to_wait/10)] seconds.</font>"
to_chat(src, "<font color='red'>Error: file_spam_check(): Spam. Please wait [round(time_to_wait/10)] seconds.</font>")
return 1
fileaccess_timer = world.time + FTPDELAY
return 0

View File

@@ -35,6 +35,7 @@ var/list/mannequins_
// Posters
var/global/list/poster_designs = list()
var/global/list/NT_poster_designs = list()
// Uplinks
var/list/obj/item/device/uplink/world_uplinks = list()
@@ -191,10 +192,16 @@ var/global/list/string_slot_flags = list(
//Posters
paths = typesof(/datum/poster) - /datum/poster
paths -= typesof(/datum/poster/nanotrasen)
for(var/T in paths)
var/datum/poster/P = new T
poster_designs += P
paths = typesof(/datum/poster/nanotrasen)
for(var/T in paths)
var/datum/poster/P = new T
NT_poster_designs += P
return 1
/* // Uncomment to debug chemical reaction list.

View File

@@ -407,7 +407,7 @@ var/global/list/contamination_colors = list("green",
"beige",
"pink")
//For the mechanic of leaving remains. Ones listed below are basically ones that got no bones.
//For the mechanic of leaving remains. Ones listed below are basically ones that got no bones or leave no trace after death.
var/global/list/remainless_species = list(SPECIES_PROMETHEAN,
SPECIES_DIONA,
SPECIES_ALRAUNE,
@@ -426,7 +426,8 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN,
SPECIES_XENO_SENTINEL,
SPECIES_XENO_QUEEN,
SPECIES_SHADOW,
SPECIES_GOLEM) //Some special species that may or may not be ever used in event too
SPECIES_GOLEM, //Some special species that may or may not be ever used in event too,
SPECIES_SHADEKIN) //Shadefluffers just poof away
/hook/startup/proc/init_vore_datum_ref_lists()
var/paths

View File

@@ -16,7 +16,7 @@
// Run all strings to be used in an SQL query through this proc first to properly escape out injection attempts.
/proc/sanitizeSQL(var/t as text)
var/sqltext = dbcon.Quote(t);
return copytext(sqltext, 2, lentext(sqltext));//Quote() adds quotes around input, we already do that
return copytext(sqltext, 2, length(sqltext));//Quote() adds quotes around input, we already do that
/*
* Text sanitization
@@ -249,9 +249,9 @@
//This is used for fingerprints
/proc/stringmerge(var/text,var/compare,replace = "*")
var/newtext = text
if(lentext(text) != lentext(compare))
if(length(text) != length(compare))
return 0
for(var/i = 1, i < lentext(text), i++)
for(var/i = 1, i < length(text), i++)
var/a = copytext(text,i,i+1)
var/b = copytext(compare,i,i+1)
//if it isn't both the same letter, or if they are both the replacement character
@@ -271,7 +271,7 @@
if(!text || !character)
return 0
var/count = 0
for(var/i = 1, i <= lentext(text), i++)
for(var/i = 1, i <= length(text), i++)
var/a = copytext(text,i,i+1)
if(a == character)
count++
@@ -286,8 +286,8 @@
//Used in preferences' SetFlavorText and human's set_flavor verb
//Previews a string of len or less length
proc/TextPreview(var/string,var/len=40)
if(lentext(string) <= len)
if(!lentext(string))
if(length(string) <= len)
if(!length(string))
return "\[...\]"
else
return string

View File

@@ -358,7 +358,7 @@ Turf and target are seperate in case you want to teleport some distance from a t
break
if(newname)
break //That's a suitable name!
src << "Sorry, that [role]-name wasn't appropriate, please try another. It's possibly too long/short, has bad characters or is already taken."
to_chat(src, "Sorry, that [role]-name wasn't appropriate, please try another. It's possibly too long/short, has bad characters or is already taken.")
if(!newname) //we'll stick with the oldname then
return
@@ -587,10 +587,6 @@ Turf and target are seperate in case you want to teleport some distance from a t
/proc/between(var/low, var/middle, var/high)
return max(min(middle, high), low)
proc/arctan(x)
var/y=arcsin(x/sqrt(1+x*x))
return y
//returns random gauss number
proc/GaussRand(var/sigma)
var/x,y,rsq

View File

@@ -134,6 +134,12 @@
// A is a turf or is on a turf, or in something on a turf (pen in a box); but not something in something on a turf (pen in a box in a backpack)
sdepth = A.storage_depth_turf()
if(isturf(A) || isturf(A.loc) || (sdepth != -1 && sdepth <= 1))
//VOREStation Edit begin: SHADEKIN
var/mob/SK = src
if(istype(SK))
if(SK.shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
if(A.Adjacent(src) || (W && W.attack_can_reach(src, A, W.reach)) ) // see adjacent.dm
if(W)
// Return 1 in attackby() to prevent afterattack() effects (when safely moving items for example)
@@ -183,7 +189,7 @@
/mob/living/UnarmedAttack(var/atom/A, var/proximity_flag)
if(!ticker)
src << "You cannot attack people before the game has started."
to_chat(src, "You cannot attack people before the game has started.")
return 0
if(stat)
@@ -316,7 +322,7 @@
nutrition = max(nutrition - rand(1,5),0)
handle_regular_hud_updates()
else
src << "<span class='warning'>You're out of energy! You need food!</span>"
to_chat(src, "<span class='warning'>You're out of energy! You need food!</span>")
// Simple helper to face what you clicked on, in case it should be needed in more than one place
/mob/proc/face_atom(var/atom/A)

View File

@@ -45,7 +45,7 @@
if(is_component_functioning("camera"))
aiCamera.captureimage(A, usr)
else
src << "<span class='userdanger'>Your camera isn't functional.</span>"
to_chat(src, "<span class='userdanger'>Your camera isn't functional.</span>")
return
/*

View File

@@ -0,0 +1,2 @@
#define ui_shadekin_dark_display "EAST-1:28,CENTER-3:15"
#define ui_shadekin_energy_display "EAST-1:28,CENTER-4:15"

View File

@@ -180,7 +180,8 @@
/mob/New()
..()
ability_master = new /obj/screen/movable/ability_master(src)
if(!ability_master) //VOREStation Edit: S H A D E K I N
ability_master = new /obj/screen/movable/ability_master(src)
///////////ACTUAL ABILITIES////////////
//This is what you click to do things//
@@ -282,7 +283,7 @@
if(!mob)
return // Paranoid.
if(isnull(slot) || !isnum(slot))
src << "<span class='warning'>.activate_ability requires a number as input, corrisponding to the slot you wish to use.</span>"
to_chat(src, "<span class='warning'>.activate_ability requires a number as input, corrisponding to the slot you wish to use.</span>")
return // Bad input.
if(!mob.ability_master)
return // No abilities.

View File

@@ -293,6 +293,18 @@
mymob.nutrition_icon.screen_loc = ui_nutrition
hud_elements |= mymob.nutrition_icon
//VOREStation Addition begin
mymob.shadekin_dark_display = new /obj/screen/shadekin/darkness()
mymob.shadekin_dark_display.screen_loc = ui_shadekin_dark_display
mymob.shadekin_dark_display.icon_state = "dark"
hud_elements |= mymob.shadekin_dark_display
mymob.shadekin_energy_display = new /obj/screen/shadekin/energy()
mymob.shadekin_energy_display.screen_loc = ui_shadekin_energy_display
mymob.shadekin_energy_display.icon_state = "energy0"
hud_elements |= mymob.shadekin_energy_display
//VOREStation Addition end
mymob.ling_chem_display = new /obj/screen/ling/chems()
mymob.ling_chem_display.screen_loc = ui_ling_chemical_display
mymob.ling_chem_display.icon_state = "ling_chems"

View File

@@ -1,16 +1,19 @@
/obj/screen/proc/Click_vr(location, control, params) //VORESTATION AI TEMPORARY REMOVAL
/obj/screen/proc/Click_vr(location, control, params)
if(!usr) return 1
switch(name)
//Shadekin
if("darkness")
var/mob/living/simple_mob/shadekin/sk = usr
var/turf/T = get_turf(sk)
var/turf/T = get_turf(usr)
var/darkness = round(1 - T.get_lumcount(),0.1)
to_chat(usr,"<span class='notice'><b>Darkness:</b> [darkness]</span>")
if("energy")
var/mob/living/simple_mob/shadekin/sk = usr
to_chat(usr,"<span class='notice'><b>Energy:</b> [sk.energy] ([sk.dark_gains])</span>")
var/mob/living/simple_mob/shadekin/SK = usr
if(istype(SK))
to_chat(usr,"<span class='notice'><b>Energy:</b> [SK.energy] ([SK.dark_gains])</span>")
var/mob/living/carbon/human/H = usr
if(istype(H) && istype(H.species, /datum/species/shadekin))
to_chat(usr,"<span class='notice'><b>Energy:</b> [H.shadekin_get_energy(H)]</span>")

View File

@@ -130,7 +130,6 @@
for(var/obj/screen/spell/spell in spell_objects)
spell.update_charge(forced)
/obj/screen/movable/spell_master/genetic
name = "Mutant Powers"
icon_state = "genetic_spell_ready"
@@ -140,6 +139,13 @@
screen_loc = ui_genetic_master
/obj/screen/movable/spell_master/swarm
name = "Swarm Abilities"
icon_state = "nano_spell_ready"
open_state = "swarm_open"
closed_state = "swarm_closed"
//////////////ACTUAL SPELLS//////////////
//This is what you click to cast things//
/////////////////////////////////////////

View File

@@ -6,9 +6,9 @@
if(!client) return
client.inquisitive_ghost = !client.inquisitive_ghost
if(client.inquisitive_ghost)
src << "<span class='notice'>You will now examine everything you click on.</span>"
to_chat(src, "<span class='notice'>You will now examine everything you click on.</span>")
else
src << "<span class='notice'>You will no longer examine things you click on.</span>"
to_chat(src, "<span class='notice'>You will no longer examine things you click on.</span>")
/mob/observer/dead/DblClickOn(var/atom/A, var/params)
if(client.buildmode)

View File

@@ -18,15 +18,15 @@
switch(hardsuit_click_mode)
if(MIDDLE_CLICK)
src << "Hardsuit activation mode set to middle-click."
to_chat(src, "Hardsuit activation mode set to middle-click.")
if(ALT_CLICK)
src << "Hardsuit activation mode set to alt-click."
to_chat(src, "Hardsuit activation mode set to alt-click.")
if(CTRL_CLICK)
src << "Hardsuit activation mode set to control-click."
to_chat(src, "Hardsuit activation mode set to control-click.")
else
// should never get here, but just in case:
soft_assert(0, "Bad hardsuit click mode: [hardsuit_click_mode] - expected 0 to [MAX_HARDSUIT_CLICK_MODE]")
src << "Somehow you bugged the system. Setting your hardsuit mode to middle-click."
to_chat(src, "Somehow you bugged the system. Setting your hardsuit mode to middle-click.")
hardsuit_click_mode = MIDDLE_CLICK
/mob/living/MiddleClickOn(atom/A)

View File

@@ -61,6 +61,7 @@ var/list/gamemode_cache = list()
var/list/player_requirements_secret = list() // Same as above, but for the secret gamemode.
var/humans_need_surnames = 0
var/allow_random_events = 0 // enables random events mid-round when set to 1
var/enable_game_master = 0 // enables the 'smart' event system.
var/allow_ai = 1 // allow ai job
var/allow_ai_shells = FALSE // allow AIs to enter and leave special borg shells at will, and for those shells to be buildable.
var/give_free_ai_shell = FALSE // allows a specific spawner object to instantiate a premade AI Shell
@@ -549,6 +550,9 @@ var/list/gamemode_cache = list()
if("allow_random_events")
config.allow_random_events = 1
if("enable_game_master")
config.enable_game_master = 1
if("kick_inactive")
config.kick_inactive = text2num(value)

View File

@@ -71,7 +71,6 @@ SUBSYSTEM_DEF(timer)
for(var/I in second_queue)
log_world(get_timer_debug_string(I))
var/cut_start_index = 1
var/next_clienttime_timer_index = 0
var/len = length(clienttime_timers)
@@ -101,7 +100,7 @@ SUBSYSTEM_DEF(timer)
if (next_clienttime_timer_index)
clienttime_timers.Cut(cut_start_index,next_clienttime_timer_index+1)
clienttime_timers.Cut(1, next_clienttime_timer_index+1)
if (MC_TICK_CHECK)
return
@@ -259,7 +258,7 @@ SUBSYSTEM_DEF(timer)
if (!length(alltimers))
return
sortTim(alltimers, .proc/cmp_timer)
sortTim(alltimers, /proc/cmp_timer)
var/datum/timedevent/head = alltimers[1]
@@ -342,8 +341,8 @@ SUBSYSTEM_DEF(timer)
if (flags & TIMER_STOPPABLE)
id = num2text(nextid, 100)
if (nextid >= SHORT_REAL_LIMIT)
nextid += min(1, 2**round(nextid/SHORT_REAL_LIMIT))
if (nextid >= TIMER_ID_MAX)
nextid += min(1, 2**round(nextid/TIMER_ID_MAX))
else
nextid++
SStimer.timer_id_dict[id] = src
@@ -519,4 +518,4 @@ SUBSYSTEM_DEF(timer)
#undef BUCKET_LEN
#undef BUCKET_POS
#undef TIMER_MAX
#undef TIMER_ID_MAX
#undef TIMER_ID_MAX

View File

@@ -143,6 +143,24 @@
add_inherent_law("Prevent unplanned damage to your assigned excavation equipment wherever possible.")
..()
/datum/ai_laws/swarm_drone
name = "Assimilation Protocols"
law_header = "Assimilation Protocols"
/datum/ai_laws/swarm_drone/New()
add_inherent_law("SWARM: Consume resources and replicate until there are no more resources left.")
add_inherent_law("SWARM: Ensure that the station is fit for invasion at a later date, do not perform actions that would render it dangerous or inhospitable.")
add_inherent_law("SWARM: Biological resources will be harvested at a later date, do not harm them.")
..()
/datum/ai_laws/swarm_drone/soldier
name = "Swarm Defense Protocols"
law_header = "Swarm Defense Protocols"
/datum/ai_laws/swarm_drone/soldier/New()
..()
add_inherent_law("SWARM: This law overrides all Swarm laws; Protect members of the Swarm with minimal injury to biological resources.")
/******************** T.Y.R.A.N.T. ********************/
/datum/ai_laws/tyrant
name = "T.Y.R.A.N.T."

View File

@@ -138,6 +138,12 @@
return
/obj/effect/ebeam/deadly/Crossed(atom/A)
//VOREStation Edit begin: SHADEKIN
var/mob/SK = A
if(istype(SK))
if(SK.shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
..()
A.ex_act(1)
@@ -157,6 +163,12 @@
on_contact(A)
/obj/effect/ebeam/reactive/Crossed(atom/A)
//VOREStation Edit begin: SHADEKIN
var/mob/SK = A
if(istype(SK))
if(SK.shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
..()
on_contact(A)

View File

@@ -134,6 +134,12 @@
and they are attempting to open the cryopod. Would you like to play as the occupant?"
cutoff_number = 1
/datum/ghost_query/stowaway
role_name = "Stowaway"
question = "A person suspended in cryosleep has awoken in their pod aboard the station.\
Would you like to play as the occupant?"
cutoff_number = 1
/datum/ghost_query/corgi_rune
role_name = "Dark Creature"
question = "A curious explorer has touched a mysterious rune. \

View File

@@ -35,10 +35,10 @@ client/verb/showrevinfo()
set desc = "Check the current server code revision"
if(revdata.revision)
src << "<b>Server revision:</b> [revdata.branch] - [revdata.date]"
to_chat(src, "<b>Server revision:</b> [revdata.branch] - [revdata.date]")
if(config.githuburl)
src << "<a href='[config.githuburl]/commit/[revdata.revision]'>[revdata.revision]</a>"
to_chat(src, "<a href='[config.githuburl]/commit/[revdata.revision]'>[revdata.revision]</a>")
else
src << revdata.revision
else
src << "Revision unknown"
to_chat(src, "Revision unknown")

View File

@@ -51,7 +51,7 @@
start_sound = 'sound/machines/air_pump/airpumpstart.ogg'
start_length = 10
mid_sounds = list('sound/machines/air_pump/airpumpidle.ogg' = 1)
mid_length = 10
mid_length = 4
end_sound = 'sound/machines/air_pump/airpumpshutdown.ogg'
volume = 20
volume = 15
pref_check = /datum/client_preference/air_pump_noise

View File

@@ -14,7 +14,7 @@
/decl/hierarchy/outfit/job/cargo/cargo_tech
name = OUTFIT_JOB_NAME("Cargo technician")
uniform = /obj/item/clothing/under/rank/cargotech
id_type = /obj/item/weapon/card/id/cargo/cargo_tech
id_type = /obj/item/weapon/card/id/cargo
pda_type = /obj/item/device/pda/cargo
/decl/hierarchy/outfit/job/cargo/mining
@@ -23,7 +23,7 @@
l_ear = /obj/item/device/radio/headset/headset_mine
backpack = /obj/item/weapon/storage/backpack/industrial
satchel_one = /obj/item/weapon/storage/backpack/satchel/eng
id_type = /obj/item/weapon/card/id/cargo/mining
id_type = /obj/item/weapon/card/id/cargo
pda_type = /obj/item/device/pda/shaftminer
backpack_contents = list(/obj/item/weapon/tool/crowbar = 1, /obj/item/weapon/storage/bag/ore = 1)
flags = OUTFIT_HAS_BACKPACK|OUTFIT_EXTENDED_SURVIVAL

View File

@@ -18,7 +18,7 @@
/decl/hierarchy/outfit/job/service/bartender
name = OUTFIT_JOB_NAME("Bartender")
uniform = /obj/item/clothing/under/rank/bartender
id_type = /obj/item/weapon/card/id/civilian/bartender
id_type = /obj/item/weapon/card/id/civilian
pda_type = /obj/item/device/pda/bar
backpack_contents = list(/obj/item/clothing/accessory/permit/gun/bar = 1)
@@ -37,7 +37,7 @@
uniform = /obj/item/clothing/under/rank/chef
suit = /obj/item/clothing/suit/chef
head = /obj/item/clothing/head/chefhat
id_type = /obj/item/weapon/card/id/civilian/chef
id_type = /obj/item/weapon/card/id/civilian
pda_type = /obj/item/device/pda/chef
/decl/hierarchy/outfit/job/service/chef/cook
@@ -61,20 +61,20 @@
backpack = /obj/item/weapon/storage/backpack/hydroponics
satchel_one = /obj/item/weapon/storage/backpack/satchel/hyd
messenger_bag = /obj/item/weapon/storage/backpack/messenger/hyd
id_type = /obj/item/weapon/card/id/civilian/botanist
id_type = /obj/item/weapon/card/id/civilian
pda_type = /obj/item/device/pda/botanist
/decl/hierarchy/outfit/job/service/janitor
name = OUTFIT_JOB_NAME("Janitor")
uniform = /obj/item/clothing/under/rank/janitor
id_type = /obj/item/weapon/card/id/civilian/janitor
id_type = /obj/item/weapon/card/id/civilian
pda_type = /obj/item/device/pda/janitor
/decl/hierarchy/outfit/job/librarian
name = OUTFIT_JOB_NAME("Librarian")
uniform = /obj/item/clothing/under/suit_jacket/red
l_hand = /obj/item/weapon/barcodescanner
id_type = /obj/item/weapon/card/id/civilian/librarian
id_type = /obj/item/weapon/card/id/civilian
pda_type = /obj/item/device/pda/librarian
/decl/hierarchy/outfit/job/internal_affairs_agent
@@ -85,14 +85,14 @@
shoes = /obj/item/clothing/shoes/brown
glasses = /obj/item/clothing/glasses/sunglasses/big
l_hand = /obj/item/weapon/clipboard
id_type = /obj/item/weapon/card/id/civilian/internal_affairs_agent
id_type = /obj/item/weapon/card/id/civilian
pda_type = /obj/item/device/pda/lawyer
/decl/hierarchy/outfit/job/chaplain
name = OUTFIT_JOB_NAME("Chaplain")
uniform = /obj/item/clothing/under/rank/chaplain
l_hand = /obj/item/weapon/storage/bible
id_type = /obj/item/weapon/card/id/civilian/chaplain
id_type = /obj/item/weapon/card/id/civilian
pda_type = /obj/item/device/pda/chaplain
/decl/hierarchy/outfit/job/explorer

View File

@@ -7,7 +7,7 @@
backpack = /obj/item/weapon/storage/backpack/captain
satchel_one = /obj/item/weapon/storage/backpack/satchel/cap
messenger_bag = /obj/item/weapon/storage/backpack/messenger/com
id_type = /obj/item/weapon/card/id/gold/captain
id_type = /obj/item/weapon/card/id/gold
pda_type = /obj/item/device/pda/captain
/decl/hierarchy/outfit/job/captain/post_equip(var/mob/living/carbon/human/H)
@@ -28,14 +28,14 @@
uniform = /obj/item/clothing/under/rank/head_of_personnel
l_ear = /obj/item/device/radio/headset/heads/hop
shoes = /obj/item/clothing/shoes/brown
id_type = /obj/item/weapon/card/id/silver/hop
id_type = /obj/item/weapon/card/id/silver
pda_type = /obj/item/device/pda/heads/hop
/decl/hierarchy/outfit/job/secretary
name = OUTFIT_JOB_NAME("Command Secretary")
l_ear = /obj/item/device/radio/headset/headset_com
shoes = /obj/item/clothing/shoes/brown
id_type = /obj/item/weapon/card/id/silver/secretary
id_type = /obj/item/weapon/card/id/silver
pda_type = /obj/item/device/pda/heads
r_hand = /obj/item/weapon/clipboard

View File

@@ -23,12 +23,12 @@
name = OUTFIT_JOB_NAME("Engineer")
head = /obj/item/clothing/head/hardhat
uniform = /obj/item/clothing/under/rank/engineer
id_type = /obj/item/weapon/card/id/engineering/engineer
id_type = /obj/item/weapon/card/id/engineering
pda_type = /obj/item/device/pda/engineering
/decl/hierarchy/outfit/job/engineering/atmos
name = OUTFIT_JOB_NAME("Atmospheric technician")
uniform = /obj/item/clothing/under/rank/atmospheric_technician
belt = /obj/item/weapon/storage/belt/utility/atmostech
id_type = /obj/item/weapon/card/id/engineering/atmos
id_type = /obj/item/weapon/card/id/engineering
pda_type = /obj/item/device/pda/atmos

View File

@@ -13,13 +13,11 @@
flags = OUTFIT_HAS_BACKPACK
//VOREStation Edit START
/decl/hierarchy/outfit/job/equip_id(mob/living/carbon/human/H, rank, assignment)
var/obj/item/weapon/card/id/C = ..()
var/datum/job/J = job_master.GetJob(rank)
if(J)
C.access = J.get_access()
//VOREStation Edit END - fixes outfit system not giving centcom officers access on their id
if(H.mind)
var/datum/mind/M = H.mind
if(M.initial_account)

View File

@@ -25,7 +25,7 @@
suit = /obj/item/clothing/suit/storage/toggle/labcoat
l_hand = /obj/item/weapon/storage/firstaid/regular
r_pocket = /obj/item/device/flashlight/pen
id_type = /obj/item/weapon/card/id/medical/doctor
id_type = /obj/item/weapon/card/id/medical
/decl/hierarchy/outfit/job/medical/doctor/emergency_physician
name = OUTFIT_JOB_NAME("Emergency Physician")
@@ -65,7 +65,7 @@
suit = /obj/item/clothing/suit/storage/toggle/labcoat/chemist
backpack = /obj/item/weapon/storage/backpack/chemistry
satchel_one = /obj/item/weapon/storage/backpack/satchel/chem
id_type = /obj/item/weapon/card/id/medical/chemist
id_type = /obj/item/weapon/card/id/medical
pda_type = /obj/item/device/pda/chemist
/decl/hierarchy/outfit/job/medical/geneticist
@@ -75,7 +75,7 @@
backpack = /obj/item/weapon/storage/backpack/genetics
r_pocket = /obj/item/device/flashlight/pen
satchel_one = /obj/item/weapon/storage/backpack/satchel/gen
id_type = /obj/item/weapon/card/id/medical/geneticist
id_type = /obj/item/weapon/card/id/medical
pda_type = /obj/item/device/pda/geneticist
/decl/hierarchy/outfit/job/medical/psychiatrist
@@ -83,7 +83,7 @@
uniform = /obj/item/clothing/under/rank/psych
suit = /obj/item/clothing/suit/storage/toggle/labcoat
shoes = /obj/item/clothing/shoes/laceup
id_type = /obj/item/weapon/card/id/medical/psychiatrist
id_type = /obj/item/weapon/card/id/medical
/decl/hierarchy/outfit/job/medical/psychiatrist/psychologist
name = OUTFIT_JOB_NAME("Psychologist")
@@ -97,7 +97,7 @@
l_hand = /obj/item/weapon/storage/firstaid/regular
belt = /obj/item/weapon/storage/belt/medical/emt
pda_slot = slot_l_store
id_type = /obj/item/weapon/card/id/medical/paramedic
id_type = /obj/item/weapon/card/id/medical
flags = OUTFIT_HAS_BACKPACK|OUTFIT_EXTENDED_SURVIVAL
/decl/hierarchy/outfit/job/medical/paramedic/emt

View File

@@ -20,13 +20,13 @@
/decl/hierarchy/outfit/job/science/scientist
name = OUTFIT_JOB_NAME("Scientist")
uniform = /obj/item/clothing/under/rank/scientist
id_type = /obj/item/weapon/card/id/science/scientist
id_type = /obj/item/weapon/card/id/science
suit = /obj/item/clothing/suit/storage/toggle/labcoat/science
/decl/hierarchy/outfit/job/science/xenobiologist
name = OUTFIT_JOB_NAME("Xenobiologist")
uniform = /obj/item/clothing/under/rank/scientist
id_type = /obj/item/weapon/card/id/science/xenobiologist
id_type = /obj/item/weapon/card/id/science
suit = /obj/item/clothing/suit/storage/toggle/labcoat/science
/decl/hierarchy/outfit/job/science/roboticist
@@ -34,7 +34,7 @@
uniform = /obj/item/clothing/under/rank/roboticist
shoes = /obj/item/clothing/shoes/black
belt = /obj/item/weapon/storage/belt/utility/full
id_type = /obj/item/weapon/card/id/science/roboticist
id_type = /obj/item/weapon/card/id/science
pda_slot = slot_r_store
pda_type = /obj/item/device/pda/roboticist
backpack = /obj/item/weapon/storage/backpack

View File

@@ -20,7 +20,7 @@
name = OUTFIT_JOB_NAME("Warden")
uniform = /obj/item/clothing/under/rank/warden
l_pocket = /obj/item/device/flash
id_type = /obj/item/weapon/card/id/security/warden
id_type = /obj/item/weapon/card/id/security
pda_type = /obj/item/device/pda/warden
/decl/hierarchy/outfit/job/security/detective
@@ -31,7 +31,7 @@
l_pocket = /obj/item/weapon/flame/lighter/zippo
shoes = /obj/item/clothing/shoes/laceup
r_hand = /obj/item/weapon/storage/briefcase/crimekit
id_type = /obj/item/weapon/card/id/security/detective
id_type = /obj/item/weapon/card/id/security
pda_type = /obj/item/device/pda/detective
backpack = /obj/item/weapon/storage/backpack
satchel_one = /obj/item/weapon/storage/backpack/satchel/norm
@@ -46,5 +46,5 @@
name = OUTFIT_JOB_NAME("Security Officer")
uniform = /obj/item/clothing/under/rank/security
l_pocket = /obj/item/device/flash
id_type = /obj/item/weapon/card/id/security/officer
id_type = /obj/item/weapon/card/id/security
pda_type = /obj/item/device/pda/security

View File

@@ -144,6 +144,30 @@
containername = "Ballistic Weapons crate"
access = access_armory //VOREStation Edit - Guns are for the armory.
/datum/supply_pack/munitions/mrifle
name = "Weapons - Magnetic Rifles"
contains = list(/obj/item/weapon/gun/magnetic/railgun/heater = 2)
cost = 120
containertype = /obj/structure/closet/crate/secure/weapon
containername = "Magnetic weapon crate"
access = access_armory
/datum/supply_pack/munitions/mpistol
name = "Weapons - Magnetic Pistols"
contains = list(/obj/item/weapon/gun/magnetic/railgun/heater/pistol = 2)
cost = 200
containertype = /obj/structure/closet/crate/secure/weapon
containername = "Magnetic weapon crate"
access = access_armory
/datum/supply_pack/munitions/mcarbine
name = "Weapons - Magnetic Carbines"
contains = list(/obj/item/weapon/gun/magnetic/railgun/flechette/sif = 2)
cost = 130
containertype = /obj/structure/closet/crate/secure/weapon
containername = "Magnetic weapon crate"
access = access_security
/datum/supply_pack/munitions/shotgunammo
name = "Ammunition - Shotgun shells"
contains = list(

View File

@@ -32,6 +32,127 @@
containertype = /obj/structure/closet/crate/secure/gear
containername = "Armor crate"
/datum/supply_pack/randomised/security/carriers
name = "Armor - Plate carriers"
num_contained = 5
contains = list(
/obj/item/clothing/suit/armor/pcarrier,
/obj/item/clothing/suit/armor/pcarrier/blue,
/obj/item/clothing/suit/armor/pcarrier/green,
/obj/item/clothing/suit/armor/pcarrier/navy,
/obj/item/clothing/suit/armor/pcarrier/tan,
/obj/item/clothing/suit/armor/pcarrier/press
)
cost = 20
containertype = /obj/structure/closet/crate/secure/gear
containername = "Plate Carrier crate"
/datum/supply_pack/security/carriertags
name = "Armor - Plate carrier tags"
contains = list(
/obj/item/clothing/accessory/armor/tag,
/obj/item/clothing/accessory/armor/tag/nt,
/obj/item/clothing/accessory/armor/tag/opos,
/obj/item/clothing/accessory/armor/tag/oneg,
/obj/item/clothing/accessory/armor/tag/apos,
/obj/item/clothing/accessory/armor/tag/aneg,
/obj/item/clothing/accessory/armor/tag/bpos,
/obj/item/clothing/accessory/armor/tag/bneg,
/obj/item/clothing/accessory/armor/tag/abpos,
/obj/item/clothing/accessory/armor/tag/abneg
)
cost = 20
containertype = /obj/structure/closet/crate/secure/gear
containername = "Plate Carrier crate"
/datum/supply_pack/security/helmcovers
name = "Armor - Helmet covers"
contains = list(
/obj/item/clothing/accessory/armor/helmcover/blue,
/obj/item/clothing/accessory/armor/helmcover/blue,
/obj/item/clothing/accessory/armor/helmcover/navy,
/obj/item/clothing/accessory/armor/helmcover/navy,
/obj/item/clothing/accessory/armor/helmcover/green,
/obj/item/clothing/accessory/armor/helmcover/green,
/obj/item/clothing/accessory/armor/helmcover/tan,
/obj/item/clothing/accessory/armor/helmcover/tan
)
cost = 20
containertype = /obj/structure/closet/crate/secure/gear
containername = "Helmet Covers crate"
/datum/supply_pack/randomised/security/armorplates
name = "Armor - Security armor plates"
num_contained = 5
contains = list(
/obj/item/clothing/accessory/armor/armorplate,
/obj/item/clothing/accessory/armor/armorplate/stab,
/obj/item/clothing/accessory/armor/armorplate,
/obj/item/clothing/accessory/armor/armorplate/stab,
/obj/item/clothing/accessory/armor/armorplate/medium,
/obj/item/clothing/accessory/armor/armorplate/medium,
/obj/item/clothing/accessory/armor/armorplate/tactical,
/obj/item/clothing/accessory/armor/armorplate/laserproof,
/obj/item/clothing/accessory/armor/armorplate/riot,
/obj/item/clothing/accessory/armor/armorplate/bulletproof
)
cost = 50
containertype = /obj/structure/closet/crate/secure/gear
containername = "Armor plate crate"
/datum/supply_pack/randomised/security/carrierarms
name = "Armor - Security armguard attachments"
num_contained = 5
contains = list(
/obj/item/clothing/accessory/armor/armguards,
/obj/item/clothing/accessory/armor/armguards/blue,
/obj/item/clothing/accessory/armor/armguards/navy,
/obj/item/clothing/accessory/armor/armguards/green,
/obj/item/clothing/accessory/armor/armguards/tan,
/obj/item/clothing/accessory/armor/armguards/laserproof,
/obj/item/clothing/accessory/armor/armguards/riot,
/obj/item/clothing/accessory/armor/armguards/bulletproof
)
cost = 50
containertype = /obj/structure/closet/crate/secure/gear
containername = "Armor plate crate"
/datum/supply_pack/randomised/security/carrierlegs
name = "Armor - Security legguard attachments"
num_contained = 5
contains = list(
/obj/item/clothing/accessory/armor/legguards,
/obj/item/clothing/accessory/armor/legguards/blue,
/obj/item/clothing/accessory/armor/legguards/navy,
/obj/item/clothing/accessory/armor/legguards/green,
/obj/item/clothing/accessory/armor/legguards/tan,
/obj/item/clothing/accessory/armor/legguards/laserproof,
/obj/item/clothing/accessory/armor/legguards/riot,
/obj/item/clothing/accessory/armor/legguards/bulletproof
)
cost = 50
containertype = /obj/structure/closet/crate/secure/gear
containername = "Armor plate crate"
/datum/supply_pack/randomised/security/carrierbags
name = "Armor - Security pouch attachments"
num_contained = 5
contains = list(
/obj/item/clothing/accessory/storage/pouches,
/obj/item/clothing/accessory/storage/pouches/blue,
/obj/item/clothing/accessory/storage/pouches/navy,
/obj/item/clothing/accessory/storage/pouches/green,
/obj/item/clothing/accessory/storage/pouches/tan,
/obj/item/clothing/accessory/storage/pouches/large,
/obj/item/clothing/accessory/storage/pouches/large/blue,
/obj/item/clothing/accessory/storage/pouches/large/navy,
/obj/item/clothing/accessory/storage/pouches/large/green,
/obj/item/clothing/accessory/storage/pouches/large/tan
)
cost = 60
containertype = /obj/structure/closet/crate/secure/gear
containername = "Armor plate crate"
/datum/supply_pack/security/riot_gear
name = "Gear - Riot"
contains = list(
@@ -60,6 +181,20 @@
containername = "Riot armor crate"
access = access_armory
/datum/supply_pack/security/riot_plates
name = "Armor - Riot plates"
contains = list(
/obj/item/clothing/head/helmet/riot,
/obj/item/clothing/suit/armor/pcarrier,
/obj/item/clothing/accessory/armor/armorplate/riot,
/obj/item/clothing/accessory/armor/armguards/riot,
/obj/item/clothing/accessory/armor/legguards/riot
)
cost = 40
containertype = /obj/structure/closet/crate/secure/gear
containername = "Riot armor crate"
access = access_armory
/datum/supply_pack/security/ablative_armor
name = "Armor - Ablative"
contains = list(
@@ -73,6 +208,20 @@
containername = "Ablative armor crate"
access = access_armory
/datum/supply_pack/security/ablative_plates
name = "Armor - Ablative plates"
contains = list(
/obj/item/clothing/head/helmet/laserproof,
/obj/item/clothing/suit/armor/pcarrier,
/obj/item/clothing/accessory/armor/armorplate/laserproof,
/obj/item/clothing/accessory/armor/armguards/laserproof,
/obj/item/clothing/accessory/armor/legguards/laserproof
)
cost = 50
containertype = /obj/structure/closet/crate/secure/gear
containername = "Ablative armor crate"
access = access_armory
/datum/supply_pack/security/bullet_resistant_armor
name = "Armor - Ballistic"
contains = list(
@@ -86,6 +235,21 @@
containername = "Ballistic armor crate"
access = access_armory
/* VOREStation Removal - Howabout no ERT armor being orderable?
/datum/supply_pack/security/bullet_resistant_plates
name = "Armor - Ballistic plates"
contains = list(
/obj/item/clothing/head/helmet/bulletproof,
/obj/item/clothing/suit/armor/pcarrier,
/obj/item/clothing/accessory/armor/armorplate/bulletproof,
/obj/item/clothing/accessory/armor/armguards/bulletproof,
/obj/item/clothing/accessory/armor/legguards/bulletproof
)
cost = 50
containertype = /obj/structure/closet/crate/secure/gear
containername = "Ballistic armor crate"
access = access_armory
/datum/supply_pack/security/combat_armor
name = "Armor - Combat"
contains = list(
@@ -209,13 +373,27 @@
/obj/item/weapon/storage/photo_album,
/obj/item/device/reagent_scanner,
/obj/item/device/flashlight/maglight,
/obj/item/weapon/storage/briefcase/crimekit
/obj/item/weapon/storage/briefcase/crimekit,
/obj/item/weapon/storage/bag/detective
)
cost = 20
containertype = /obj/structure/closet/crate/secure
containername = "Forensic equipment"
access = access_forensics_lockers
/datum/supply_pack/security/detectivescan
name = "Forensic - Scanning Equipment"
contains = list(
/obj/item/device/mass_spectrometer,
/obj/item/device/reagent_scanner,
/obj/item/weapon/storage/briefcase/crimekit,
/obj/item/device/detective_scanner
)
cost = 60
containertype = /obj/structure/closet/crate/secure
containername = "Forensic equipment"
access = access_forensics_lockers
/datum/supply_pack/security/detectiveclothes
name = "Forensic - Investigation apparel"
contains = list(
@@ -397,3 +575,13 @@
containertype = /obj/structure/closet/crate/secure
containername = "Security biohazard gear"
access = access_security
/datum/supply_pack/security/posters
name = "Gear - Morale Posters"
contains = list(
/obj/item/weapon/contraband/poster/nanotrasen = 6
)
cost = 20
containertype = /obj/structure/closet/crate/secure
containername = "Morale Posters"
access = access_maint_tunnels

View File

@@ -1,180 +1,189 @@
/datum/category_item/underwear/undershirt/none
is_default = TRUE
name = "None"
always_last = TRUE
/datum/category_item/underwear/undershirt/shirt
name = "Shirt"
icon_state = "undershirt"
has_color = TRUE
/datum/category_item/underwear/undershirt/shirt_fem
name = "Babydoll shirt"
icon_state = "undershirt_fem"
has_color = TRUE
/datum/category_item/underwear/undershirt/shirt_long
name = "Longsleeve Shirt"
icon_state = "undershirt_long"
has_color = TRUE
/datum/category_item/underwear/undershirt/shirt_long_s
name = "Shirt, button-down"
icon_state = "shirt_long_s"
has_color = TRUE
/datum/category_item/underwear/undershirt/shirt_long_fem
name = "Longsleeve Shirt, feminine"
icon_state = "undershirt_long_fem"
has_color = TRUE
/datum/category_item/underwear/undershirt/shirt_long_female_s
name = "Button-down Shirt, feminine"
icon_state = "shirt_long_female_s"
has_color = TRUE
/datum/category_item/underwear/undershirt/tank_top
name = "Tank top"
icon_state = "tanktop"
has_color = TRUE
/datum/category_item/underwear/undershirt/tank_top_alt
name = "Tank top, alt"
icon_state = "tanktop_alt"
has_color = TRUE
/datum/category_item/underwear/undershirt/tank_top_alt_fem
name = "Tank top, alt, feminine"
icon_state = "tanktop_alt_fem"
has_color = TRUE
/datum/category_item/underwear/undershirt/tank_top_alt_fem_vneck
name = "Tank top, feminine, v-neck"
icon_state = "tanktop_alt_fem_vneck"
has_color = TRUE
/datum/category_item/underwear/undershirt/tank_top_fire
name = "Tank top, fire"
icon_state = "tank_fire_s"
/datum/category_item/underwear/undershirt/tank_top_fire_fem
name = "Tank top, fire, feminine"
icon_state = "tank_fire_fem_s"
/datum/category_item/underwear/undershirt/tank_top_rainbow
name = "Tank top, rainbow"
icon_state = "tank_rainbow_s"
/datum/category_item/underwear/undershirt/tank_top_stripes
name = "Tank top, striped"
icon_state = "tank_stripes_s"
/datum/category_item/underwear/undershirt/tank_top_sun
name = "Tank top, sun"
icon_state = "tank_sun_s"
/datum/category_item/underwear/undershirt/shirt_heart
name = "Shirt, heart"
icon_state = "lover_s"
/datum/category_item/underwear/undershirt/shirt_heart_fem
name = "Shirt, heart, babydoll"
icon_state = "lover_fem_s"
/datum/category_item/underwear/undershirt/shirt_nt
name = "Shirt, NT"
icon_state = "shirt_nano_s"
/datum/category_item/underwear/undershirt/shirt_love_nt
name = "Shirt, I<3NT"
icon_state = "ilovent_s"
/datum/category_item/underwear/undershirt/shirt_love_nt_fem
name = "Shirt, I<3NT, babydoll"
icon_state = "ilovent_fem_s"
/datum/category_item/underwear/undershirt/shortsleeve_shirt
name = "Shortsleeve shirt"
icon_state = "shortsleeve"
has_color = TRUE
/datum/category_item/underwear/undershirt/shortsleeve_shirt_fem
name = "Shortsleeve babydoll shirt"
icon_state = "shortsleeve_fem"
has_color = TRUE
/datum/category_item/underwear/undershirt/shortsleeve_shirt_fem_vneck
name = "Shortsleeve babydoll shirt, v-neck"
icon_state = "shortsleeve_fem_vneck"
has_color = TRUE
/datum/category_item/underwear/undershirt/polo_shirt
name = "Polo shirt"
icon_state = "polo"
has_color = TRUE
/datum/category_item/underwear/undershirt/sport_shirt_green
name = "Sport shirt, green"
icon_state = "greenshirtsport_s"
/datum/category_item/underwear/undershirt/sport_shirt_red
name = "Sport shirt, red"
icon_state = "redshirtsport_s"
/datum/category_item/underwear/undershirt/sport_shirt_blue
name = "Sport shirt, blue"
icon_state = "blueshirtsport_s"
/datum/category_item/underwear/undershirt/shirt_tiedye
name = "Shirt, tiedye"
icon_state = "shirt_tiedye_s"
/datum/category_item/underwear/undershirt/shirt_blue_striped
name = "Shirt, blue stripes"
icon_state = "shirt_stripes_s"
/datum/category_item/underwear/undershirt/bowling
name = "Bowling Shirt, Red"
icon_state = "bowling"
/datum/category_item/underwear/undershirt/bowlingp
name = "Bowling Shirt, Pink"
icon_state = "bowlingp"
/datum/category_item/underwear/undershirt/bowlinga
name = "Bowling Shirt, Aqua"
icon_state = "bowlinga"
/datum/category_item/underwear/undershirt/bowlingw
name = "Bowling Shirt, White"
icon_state = "bowlingw"
/datum/category_item/underwear/undershirt/longjon
name = "Long John Shirt"
icon_state = "ljont"
has_color = TRUE
/datum/category_item/underwear/undershirt/longstripe_black
name = "Longsleeve Striped Shirt, Black"
icon_state = "longstripe"
/datum/category_item/underwear/undershirt/longstripe_blue
name = "Longsleeve Striped Shirt, Blue"
icon_state = "longstripe_blue"
/datum/category_item/underwear/undershirt/tiedye
name = "Tiedye Shirt"
icon_state = "tiedye"
/datum/category_item/underwear/undershirt/longstripe_pink
name = "Longsleeve Striped Shirt, Pink"
icon_state = "longstripe_pink_s"
/datum/category_item/underwear/undershirt/wingshirt
name = "Pink Wing Shirt"
icon_state = "wing_shirt_s"
/datum/category_item/underwear/undershirt/pinkblack_tshirt
name = "Pink and Black T-Shirt"
/datum/category_item/underwear/undershirt/none
is_default = TRUE
name = "None"
always_last = TRUE
/datum/category_item/underwear/undershirt/shirt
name = "Shirt"
icon_state = "undershirt"
has_color = TRUE
/datum/category_item/underwear/undershirt/shirt_fem
name = "Babydoll shirt"
icon_state = "undershirt_fem"
has_color = TRUE
/datum/category_item/underwear/undershirt/shirt_long
name = "Longsleeve Shirt"
icon_state = "undershirt_long"
has_color = TRUE
/datum/category_item/underwear/undershirt/shirt_long_s
name = "Shirt, button-down"
icon_state = "shirt_long_s"
has_color = TRUE
/datum/category_item/underwear/undershirt/shirt_long_fem
name = "Longsleeve Shirt, feminine"
icon_state = "undershirt_long_fem"
has_color = TRUE
/datum/category_item/underwear/undershirt/shirt_long_female_s
name = "Button-down Shirt, feminine"
icon_state = "shirt_long_female_s"
has_color = TRUE
/datum/category_item/underwear/undershirt/fishnet_simple
name = "Fishnet shirt"
icon_state = "fishnet_simple"
/datum/category_item/underwear/undershirt/tank_top
name = "Tank top"
icon_state = "tanktop"
has_color = TRUE
/datum/category_item/underwear/undershirt/tank_top_alt
name = "Tank top, alt"
icon_state = "tanktop_alt"
has_color = TRUE
/datum/category_item/underwear/undershirt/tank_top_alt_fem
name = "Tank top, alt, feminine"
icon_state = "tanktop_alt_fem"
has_color = TRUE
/datum/category_item/underwear/undershirt/tank_top_alt_fem_vneck
name = "Tank top, feminine, v-neck"
icon_state = "tanktop_alt_fem_vneck"
has_color = TRUE
/datum/category_item/underwear/undershirt/tank_cropped_vneck
name = "Tank top, feminine, cropped & v-neck"
icon_state = "tanktop_cropped_vneck"
has_color = TRUE
/datum/category_item/underwear/undershirt/tank_top_fire
name = "Tank top, fire"
icon_state = "tank_fire_s"
/datum/category_item/underwear/undershirt/tank_top_fire_fem
name = "Tank top, fire, feminine"
icon_state = "tank_fire_fem_s"
/datum/category_item/underwear/undershirt/tank_top_rainbow
name = "Tank top, rainbow"
icon_state = "tank_rainbow_s"
/datum/category_item/underwear/undershirt/tank_top_stripes
name = "Tank top, striped"
icon_state = "tank_stripes_s"
/datum/category_item/underwear/undershirt/tank_top_sun
name = "Tank top, sun"
icon_state = "tank_sun_s"
/datum/category_item/underwear/undershirt/shirt_heart
name = "Shirt, heart"
icon_state = "lover_s"
/datum/category_item/underwear/undershirt/shirt_heart_fem
name = "Shirt, heart, babydoll"
icon_state = "lover_fem_s"
/datum/category_item/underwear/undershirt/shirt_nt
name = "Shirt, NT"
icon_state = "shirt_nano_s"
/datum/category_item/underwear/undershirt/shirt_love_nt
name = "Shirt, I<3NT"
icon_state = "ilovent_s"
/datum/category_item/underwear/undershirt/shirt_love_nt_fem
name = "Shirt, I<3NT, babydoll"
icon_state = "ilovent_fem_s"
/datum/category_item/underwear/undershirt/shortsleeve_shirt
name = "Shortsleeve shirt"
icon_state = "shortsleeve"
has_color = TRUE
/datum/category_item/underwear/undershirt/shortsleeve_shirt_fem
name = "Shortsleeve babydoll shirt"
icon_state = "shortsleeve_fem"
has_color = TRUE
/datum/category_item/underwear/undershirt/shortsleeve_shirt_fem_vneck
name = "Shortsleeve babydoll shirt, v-neck"
icon_state = "shortsleeve_fem_vneck"
has_color = TRUE
/datum/category_item/underwear/undershirt/polo_shirt
name = "Polo shirt"
icon_state = "polo"
has_color = TRUE
/datum/category_item/underwear/undershirt/sport_shirt_green
name = "Sport shirt, green"
icon_state = "greenshirtsport_s"
/datum/category_item/underwear/undershirt/sport_shirt_red
name = "Sport shirt, red"
icon_state = "redshirtsport_s"
/datum/category_item/underwear/undershirt/sport_shirt_blue
name = "Sport shirt, blue"
icon_state = "blueshirtsport_s"
/datum/category_item/underwear/undershirt/shirt_tiedye
name = "Shirt, tiedye"
icon_state = "shirt_tiedye_s"
/datum/category_item/underwear/undershirt/shirt_blue_striped
name = "Shirt, blue stripes"
icon_state = "shirt_stripes_s"
/datum/category_item/underwear/undershirt/bowling
name = "Bowling Shirt, Red"
icon_state = "bowling"
/datum/category_item/underwear/undershirt/bowlingp
name = "Bowling Shirt, Pink"
icon_state = "bowlingp"
/datum/category_item/underwear/undershirt/bowlinga
name = "Bowling Shirt, Aqua"
icon_state = "bowlinga"
/datum/category_item/underwear/undershirt/bowlingw
name = "Bowling Shirt, White"
icon_state = "bowlingw"
/datum/category_item/underwear/undershirt/longjon
name = "Long John Shirt"
icon_state = "ljont"
has_color = TRUE
/datum/category_item/underwear/undershirt/longstripe_black
name = "Longsleeve Striped Shirt, Black"
icon_state = "longstripe"
/datum/category_item/underwear/undershirt/longstripe_blue
name = "Longsleeve Striped Shirt, Blue"
icon_state = "longstripe_blue"
/datum/category_item/underwear/undershirt/tiedye
name = "Tiedye Shirt"
icon_state = "tiedye"
/datum/category_item/underwear/undershirt/longstripe_pink
name = "Longsleeve Striped Shirt, Pink"
icon_state = "longstripe_pink_s"
/datum/category_item/underwear/undershirt/wingshirt
name = "Pink Wing Shirt"
icon_state = "wing_shirt_s"
/datum/category_item/underwear/undershirt/pinkblack_tshirt
name = "Pink and Black T-Shirt"
icon_state = "pinkblack_tshirt"

View File

@@ -14,33 +14,33 @@
return
if(faction.is_antagonist(player))
src << "<span class='warning'>\The [player.current] already serves the [faction.faction_descriptor].</span>"
to_chat(src, "<span class='warning'>\The [player.current] already serves the [faction.faction_descriptor].</span>")
return
if(player_is_antag(player))
src << "<span class='warning'>\The [player.current]'s loyalties seem to be elsewhere...</span>"
to_chat(src, "<span class='warning'>\The [player.current]'s loyalties seem to be elsewhere...</span>")
return
if(!faction.can_become_antag(player))
src << "<span class='warning'>\The [player.current] cannot be \a [faction.faction_role_text]!</span>"
to_chat(src, "<span class='warning'>\The [player.current] cannot be \a [faction.faction_role_text]!</span>")
return
if(world.time < player.rev_cooldown)
src << "<span class='danger'>You must wait five seconds between attempts.</span>"
to_chat(src, "<span class='danger'>You must wait five seconds between attempts.</span>")
return
src << "<span class='danger'>You are attempting to convert \the [player.current]...</span>"
to_chat(src, "<span class='danger'>You are attempting to convert \the [player.current]...</span>")
log_admin("[src]([src.ckey]) attempted to convert [player.current].")
message_admins("<span class='danger'>[src]([src.ckey]) attempted to convert [player.current].</span>")
player.rev_cooldown = world.time+100
var/choice = alert(player.current,"Asked by [src]: Do you want to join the [faction.faction_descriptor]?","Join the [faction.faction_descriptor]?","No!","Yes!")
if(choice == "Yes!" && faction.add_antagonist_mind(player, 0, faction.faction_role_text, faction.faction_welcome))
src << "<span class='notice'>\The [player.current] joins the [faction.faction_descriptor]!</span>"
to_chat(src, "<span class='notice'>\The [player.current] joins the [faction.faction_descriptor]!</span>")
return
if(choice == "No!")
player << "<span class='danger'>You reject this traitorous cause!</span>"
src << "<span class='danger'>\The [player.current] does not support the [faction.faction_descriptor]!</span>"
to_chat(src, "<span class='danger'>\The [player.current] does not support the [faction.faction_descriptor]!</span>")
/mob/living/proc/convert_to_loyalist(mob/M as mob in oview(src))
set name = "Convert Recidivist"

View File

@@ -38,8 +38,8 @@
if(!mind)
return
if(!is_special_character(mind))
src << "<span class='warning'>While you may perhaps have goals, this verb's meant to only be visible \
to antagonists. Please make a bug report!</span>"
to_chat(src, "<span class='warning'>While you may perhaps have goals, this verb's meant to only be visible \
to antagonists. Please make a bug report!</span>")
return
var/new_ambitions = input(src, "Write a short sentence of what your character hopes to accomplish \
today as an antagonist. Remember that this is purely optional. It will be shown at the end of the \
@@ -49,7 +49,7 @@
new_ambitions = sanitize(new_ambitions)
mind.ambitions = new_ambitions
if(new_ambitions)
src << "<span class='notice'>You've set your goal to be '[new_ambitions]'.</span>"
to_chat(src, "<span class='notice'>You've set your goal to be '[new_ambitions]'.</span>")
else
src << "<span class='notice'>You leave your ambitions behind.</span>"
to_chat(src, "<span class='notice'>You leave your ambitions behind.</span>")
log_and_message_admins("has set their ambitions to now be: [new_ambitions].")

View File

@@ -115,18 +115,18 @@ obj/item/clothing
/*Checks if the wizard is wearing the proper attire.
Made a proc so this is not repeated 14 (or more) times.*/
/mob/proc/wearing_wiz_garb()
src << "Silly creature, you're not a human. Only humans can cast this spell."
to_chat(src, "Silly creature, you're not a human. Only humans can cast this spell.")
return 0
// Humans can wear clothes.
/mob/living/carbon/human/wearing_wiz_garb()
if(!is_wiz_garb(src.wear_suit))
src << "<span class='warning'>I don't feel strong enough without my robe.</span>"
to_chat(src, "<span class='warning'>I don't feel strong enough without my robe.</span>")
return 0
if(!is_wiz_garb(src.shoes))
src << "<span class='warning'>I don't feel strong enough without my sandals.</span>"
to_chat(src, "<span class='warning'>I don't feel strong enough without my sandals.</span>")
return 0
if(!is_wiz_garb(src.head))
src << "<span class='warning'>I don't feel strong enough without my hat.</span>"
to_chat(src, "<span class='warning'>I don't feel strong enough without my hat.</span>")
return 0
return 1

View File

@@ -0,0 +1,18 @@
var/datum/antagonist/stowaway/stowaways
/datum/antagonist/STOWAWAY
id = MODE_STOWAWAY
role_type = BE_RENEGADE
role_text = "Stowaway"
role_text_plural = "Stowaways"
bantype = "renegade"
restricted_jobs = list("AI")
welcome_text = "People are known to run from many things, or to many things, for many different reasons. You happen to be one of those people."
antag_text = "You are a <b>minor</b> antagonist! Within the server rules, do whatever it is \
that you came to the station to do. Espionage, thievery, or just running from the law are all examples. \
Try to make sure other players have <i>fun</i>! If you are confused or at a loss, always adminhelp, \
and before taking extreme actions, please try to also contact the administration! \
Think through your actions and make the roleplay immersive! <b>Please remember all \
rules aside from those with explicit exceptions apply to antagonists.</b>"
flags = ANTAG_SUSPICIOUS | ANTAG_IMPLANT_IMMUNE | ANTAG_RANDSPAWN | ANTAG_VOTABLE
can_speak_aooc = FALSE

View File

@@ -129,19 +129,19 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
return
if(src.stat > max_stat)
src << "<span class='warning'>We are incapacitated.</span>"
to_chat(src, "<span class='warning'>We are incapacitated.</span>")
return
if(changeling.absorbed_dna.len < required_dna)
src << "<span class='warning'>We require at least [required_dna] samples of compatible DNA.</span>"
to_chat(src, "<span class='warning'>We require at least [required_dna] samples of compatible DNA.</span>")
return
if(changeling.chem_charges < required_chems)
src << "<span class='warning'>We require at least [required_chems] units of chemicals to do that!</span>"
to_chat(src, "<span class='warning'>We require at least [required_chems] units of chemicals to do that!</span>")
return
if(changeling.geneticdamage > max_genetic_damage)
src << "<span class='warning'>Our genomes are still reassembling. We need time to recover first.</span>"
to_chat(src, "<span class='warning'>Our genomes are still reassembling. We need time to recover first.</span>")
return
return changeling
@@ -204,11 +204,11 @@ turf/proc/AdjacentTurfsRangedSting()
if(M.loc == src.loc)
return 1 //target and source are in the same thing
if(!isturf(src.loc) || !isturf(M.loc))
src << "<span class='warning'>We cannot reach \the [M] with a sting!</span>"
to_chat(src, "<span class='warning'>We cannot reach \the [M] with a sting!</span>")
return 0 //One is inside, the other is outside something.
// Maximum queued turfs set to 25; I don't *think* anything raises sting_range above 2, but if it does the 25 may need raising
if(!AStar(src.loc, M.loc, /turf/proc/AdjacentTurfsRangedSting, /turf/proc/Distance, max_nodes=25, max_node_depth=sting_range)) //If we can't find a path, fail
src << "<span class='warning'>We cannot find a path to sting \the [M] by!</span>"
to_chat(src, "<span class='warning'>We cannot find a path to sting \the [M] by!</span>")
return 0
return 1
@@ -225,7 +225,7 @@ turf/proc/AdjacentTurfsRangedSting()
if(!T)
return
if(T.isSynthetic())
src << "<span class='notice'>We are unable to pierce the outer shell of [T].</span>"
to_chat(src, "<span class='notice'>We are unable to pierce the outer shell of [T].</span>")
return
if(!(T in view(changeling.sting_range))) return
if(!sting_can_reach(T, changeling.sting_range)) return
@@ -236,7 +236,7 @@ turf/proc/AdjacentTurfsRangedSting()
src.verbs -= verb_path
spawn(10) src.verbs += verb_path
src << "<span class='notice'>We stealthily sting [T].</span>"
to_chat(src, "<span class='notice'>We stealthily sting [T].</span>")
if(!T.mind || !T.mind.changeling) return T //T will be affected by the sting
T << "<span class='warning'>You feel a tiny prick.</span>"
return

View File

@@ -32,7 +32,7 @@
return 1
if(M.head || M.wear_suit) //Make sure our slots aren't full
src << "<span class='warning'>We require nothing to be on our head, and we cannot wear any external suits, or shoes.</span>"
to_chat(src, "<span class='warning'>We require nothing to be on our head, and we cannot wear any external suits, or shoes.</span>")
return 0
var/obj/item/clothing/suit/A = new armor_type(src)
@@ -242,7 +242,7 @@
var/mob/living/carbon/human/M = src
if(M.hands_are_full()) //Make sure our hands aren't full.
src << "<span class='warning'>Our hands are full. Drop something first.</span>"
to_chat(src, "<span class='warning'>Our hands are full. Drop something first.</span>")
return 0
var/obj/item/weapon/W = new weapon_type(src)

View File

@@ -16,41 +16,41 @@
var/obj/item/weapon/grab/G = src.get_active_hand()
if(!istype(G))
src << "<span class='warning'>We must be grabbing a creature in our active hand to absorb them.</span>"
to_chat(src, "<span class='warning'>We must be grabbing a creature in our active hand to absorb them.</span>")
return
var/mob/living/carbon/human/T = G.affecting
if(!istype(T) || T.isSynthetic())
src << "<span class='warning'>\The [T] is not compatible with our biology.</span>"
to_chat(src, "<span class='warning'>\The [T] is not compatible with our biology.</span>")
return
if(T.species.flags & NO_SCAN)
src << "<span class='warning'>We do not know how to parse this creature's DNA!</span>"
to_chat(src, "<span class='warning'>We do not know how to parse this creature's DNA!</span>")
return
if(HUSK in T.mutations) //Lings can always absorb other lings, unless someone beat them to it first.
if(!T.mind.changeling || T.mind.changeling && T.mind.changeling.geneticpoints < 0)
src << "<span class='warning'>This creature's DNA is ruined beyond useability!</span>"
to_chat(src, "<span class='warning'>This creature's DNA is ruined beyond useability!</span>")
return
if(G.state != GRAB_KILL)
src << "<span class='warning'>We must have a tighter grip to absorb this creature.</span>"
to_chat(src, "<span class='warning'>We must have a tighter grip to absorb this creature.</span>")
return
if(changeling.isabsorbing)
src << "<span class='warning'>We are already absorbing!</span>"
to_chat(src, "<span class='warning'>We are already absorbing!</span>")
return
changeling.isabsorbing = 1
for(var/stage = 1, stage<=3, stage++)
switch(stage)
if(1)
src << "<span class='notice'>This creature is compatible. We must hold still...</span>"
to_chat(src, "<span class='notice'>This creature is compatible. We must hold still...</span>")
if(2)
src << "<span class='notice'>We extend a proboscis.</span>"
to_chat(src, "<span class='notice'>We extend a proboscis.</span>")
src.visible_message("<span class='warning'>[src] extends a proboscis!</span>")
if(3)
src << "<span class='notice'>We stab [T] with the proboscis.</span>"
to_chat(src, "<span class='notice'>We stab [T] with the proboscis.</span>")
src.visible_message("<span class='danger'>[src] stabs [T] with the proboscis!</span>")
T << "<span class='danger'>You feel a sharp stabbing pain!</span>"
add_attack_logs(src,T,"Absorbed (changeling)")
@@ -60,11 +60,11 @@
feedback_add_details("changeling_powers","A[stage]")
if(!do_mob(src, T, 150) || G.state != GRAB_KILL)
src << "<span class='warning'>Our absorption of [T] has been interrupted!</span>"
to_chat(src, "<span class='warning'>Our absorption of [T] has been interrupted!</span>")
changeling.isabsorbing = 0
return
src << "<span class='notice'>We have absorbed [T]!</span>"
to_chat(src, "<span class='notice'>We have absorbed [T]!</span>")
src.visible_message("<span class='danger'>[src] sucks the fluids from [T]!</span>")
T << "<span class='danger'>You have been absorbed by the changeling!</span>"
if(src.nutrition < 400)
@@ -76,7 +76,7 @@
if(changeling.readapts > changeling.max_readapts)
changeling.readapts = changeling.max_readapts
src << "<span class='notice'>We can now re-adapt, reverting our evolution so that we may start anew, if needed.</span>"
to_chat(src, "<span class='notice'>We can now re-adapt, reverting our evolution so that we may start anew, if needed.</span>")
var/datum/absorbed_dna/newDNA = new(T.real_name, T.dna, T.species.name, T.languages, T.identifying_gender, T.flavor_texts, T.modifiers)
absorbDNA(newDNA)
@@ -98,7 +98,7 @@
changeling.geneticpoints += 4
changeling.max_geneticpoints += 4
src << "<span class='notice'>We absorbed another changeling, and we grow stronger. Our genomes increase.</span>"
to_chat(src, "<span class='notice'>We absorbed another changeling, and we grow stronger. Our genomes increase.</span>")
T.mind.changeling.chem_charges = 0
T.mind.changeling.geneticpoints = -1

View File

@@ -14,7 +14,7 @@
if(src.mind.changeling.recursive_enhancement)
if(changeling_generic_weapon(/obj/item/weapon/melee/changeling/arm_blade/greater))
src << "<span class='notice'>We prepare an extra sharp blade.</span>"
to_chat(src, "<span class='notice'>We prepare an extra sharp blade.</span>")
return 1
else
@@ -39,7 +39,7 @@
if(src.mind.changeling.recursive_enhancement)
if(changeling_generic_weapon(/obj/item/weapon/melee/changeling/claw/greater, 1, 15))
src << "<span class='notice'>We prepare an extra sharp claw.</span>"
to_chat(src, "<span class='notice'>We prepare an extra sharp claw.</span>")
return 1
else

View File

@@ -25,7 +25,7 @@
if(held_item == null)
if(src.mind.changeling.recursive_enhancement)
if(changeling_generic_weapon(/obj/item/weapon/electric_hand/efficent,0))
src << "<span class='notice'>We will shock others more efficently.</span>"
to_chat(src, "<span class='notice'>We will shock others more efficently.</span>")
return 1
else
if(changeling_generic_weapon(/obj/item/weapon/electric_hand,0)) //Chemical cost is handled in the equip proc.
@@ -54,7 +54,7 @@
"<span class='warning'>Our hand channels raw electricity into [G.affecting].</span>",
"<span class='italics'>You hear sparks!</span>")
else
src << "<span class='warning'>Our gloves block us from shocking \the [G.affecting].</span>"
to_chat(src, "<span class='warning'>Our gloves block us from shocking \the [G.affecting].</span>")
src.mind.changeling.chem_charges -= 10
return 1
@@ -92,7 +92,7 @@
sleep(1 SECOND)
success = 1
if(success == 0) //If we couldn't do anything with the ability, don't deduct the chemicals.
src << "<span class='warning'>We are unable to affect \the [held_item].</span>"
to_chat(src, "<span class='warning'>We are unable to affect \the [held_item].</span>")
else
src.mind.changeling.chem_charges -= 10
return success
@@ -143,7 +143,7 @@
var/mob/living/carbon/C = target
if(user.mind.changeling.chem_charges < shock_cost)
src << "<span class='warning'>We require more chemicals to electrocute [C]!</span>"
to_chat(src, "<span class='warning'>We require more chemicals to electrocute [C]!</span>")
return 0
C.electrocute_act(electrocute_amount * siemens,src,1.0,BP_TORSO)
@@ -156,7 +156,7 @@
"<span class='warning'>Our hand channels raw electricity into [C]</span>",
"<span class='italics'>You hear sparks!</span>")
else
src << "<span class='warning'>Our gloves block us from shocking \the [C].</span>"
to_chat(src, "<span class='warning'>Our gloves block us from shocking \the [C].</span>")
//qdel(src) //Since we're no longer a one hit stun, we need to stick around.
user.mind.changeling.chem_charges -= shock_cost
return 1
@@ -165,7 +165,7 @@
var/mob/living/silicon/S = target
if(user.mind.changeling.chem_charges < 10)
src << "<span class='warning'>We require more chemicals to electrocute [S]!</span>"
to_chat(src, "<span class='warning'>We require more chemicals to electrocute [S]!</span>")
return 0
S.electrocute_act(60,src,0.75) //If only they had surge protectors.
@@ -205,7 +205,7 @@
success = 1
break
if(success == 0)
src << "<span class='warning'>We are unable to affect \the [target].</span>"
to_chat(src, "<span class='warning'>We are unable to affect \the [target].</span>")
else
qdel(src)
return 1

View File

@@ -21,7 +21,7 @@
var/duration = 300
if(src.mind.changeling.recursive_enhancement)
duration = duration + 150
src << "<span class='notice'>They will be deprived of sight for longer.</span>"
to_chat(src, "<span class='notice'>They will be deprived of sight for longer.</span>")
spawn(duration)
T.disabilities &= ~NEARSIGHTED
T.Blind(10)

View File

@@ -20,12 +20,12 @@
var/inject_amount = 10
if(src.mind.changeling.recursive_enhancement)
inject_amount = inject_amount * 1.5
src << "<span class='notice'>We inject extra chemicals.</span>"
to_chat(src, "<span class='notice'>We inject extra chemicals.</span>")
if(T.reagents)
T.reagents.add_reagent("cryotoxin", inject_amount)
feedback_add_details("changeling_powers","CS")
src.verbs -= /mob/proc/changeling_cryo_sting
spawn(3 MINUTES)
src << "<span class='notice'>Our cryogenic string is ready to be used once more.</span>"
to_chat(src, "<span class='notice'>Our cryogenic string is ready to be used once more.</span>")
src.verbs |= /mob/proc/changeling_cryo_sting
return 1

View File

@@ -19,7 +19,7 @@
var/duration = 300
if(src.mind.changeling.recursive_enhancement)
duration = duration + 100
src << "<span class='notice'>They will be unable to hear for a little longer.</span>"
to_chat(src, "<span class='notice'>They will be unable to hear for a little longer.</span>")
T << "<span class='danger'>Your ears pop and begin ringing loudly!</span>"
T.sdisabilities |= DEAF
spawn(duration) T.sdisabilities &= ~DEAF

View File

@@ -32,7 +32,7 @@
var/type_to_give = /datum/modifier/delayed_toxin_sting
if(src.mind.changeling.recursive_enhancement)
type_to_give = /datum/modifier/delayed_toxin_sting/strong
src << "<span class='notice'>Our toxin will be extra potent, when it strikes.</span>"
to_chat(src, "<span class='notice'>Our toxin will be extra potent, when it strikes.</span>")
T.add_modifier(type_to_give, 2 MINUTES)

View File

@@ -40,7 +40,7 @@
var/type_to_give = /datum/modifier/enfeeble
if(src.mind.changeling.recursive_enhancement)
type_to_give = /datum/modifier/enfeeble/strong
src << "<span class='notice'>We make them extremely weak.</span>"
to_chat(src, "<span class='notice'>We make them extremely weak.</span>")
H.add_modifier(type_to_give, 2 MINUTES)
feedback_add_details("changeling_powers","ES")
return 1

View File

@@ -24,15 +24,15 @@
return
if(!istype(T) || T.isSynthetic())
src << "<span class='warning'>\The [T] is not compatible with our biology.</span>"
to_chat(src, "<span class='warning'>\The [T] is not compatible with our biology.</span>")
return 0
if(T.species.flags & NO_SCAN)
src << "<span class='warning'>We do not know how to parse this creature's DNA!</span>"
to_chat(src, "<span class='warning'>We do not know how to parse this creature's DNA!</span>")
return 0
if(HUSK in T.mutations)
src << "<span class='warning'>This creature's DNA is ruined beyond useability!</span>"
to_chat(src, "<span class='warning'>This creature's DNA is ruined beyond useability!</span>")
return 0
add_attack_logs(src,T,"DNA extraction sting (changeling)")

View File

@@ -19,7 +19,7 @@
var/mob/living/carbon/C = src
if(changeling.max_geneticpoints < 0) //Absorbed by another ling
src << "<span class='danger'>We have no genomes, not even our own, and cannot regenerate.</span>"
to_chat(src, "<span class='danger'>We have no genomes, not even our own, and cannot regenerate.</span>")
return 0
if(!C.stat && alert("Are we sure we wish to regenerate? We will appear to be dead while doing so.","Revival","Yes","No") == "No")
@@ -44,7 +44,7 @@
spawn(rand(2 MINUTES, 4 MINUTES))
//The ling will now be able to choose when to revive
src.verbs += /mob/proc/changeling_revive
src << "<span class='notice'><font size='5'>We are ready to rise. Use the <b>Revive</b> verb when you are ready.</font></span>"
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")
return 1

View File

@@ -1,6 +1,6 @@
/datum/power/changeling/fleshmend
name = "Fleshmend"
desc = "Begins a slow rengeration of our form. Does not effect stuns or chemicals."
desc = "Begins a slow regeneration of our form. Does not effect stuns or chemicals."
helptext = "Can be used while unconscious."
enhancedtext = "Healing is twice as effective."
ability_icon_state = "ling_fleshmend"
@@ -22,10 +22,10 @@
var/heal_amount = 2
if(src.mind.changeling.recursive_enhancement)
heal_amount = heal_amount * 2
src << "<span class='notice'>We will heal much faster.</span>"
to_chat(src, "<span class='notice'>We will heal much faster.</span>")
spawn(0)
src << "<span class='notice'>We begin to heal ourselves.</span>"
to_chat(src, "<span class='notice'>We begin to heal ourselves.</span>")
for(var/i = 0, i<50,i++)
if(C)
C.adjustBruteLoss(-heal_amount)
@@ -35,7 +35,7 @@
src.verbs -= /mob/proc/changeling_fleshmend
spawn(50 SECONDS)
src << "<span class='notice'>Our regeneration has slowed to normal levels.</span>"
to_chat(src, "<span class='notice'>Our regeneration has slowed to normal levels.</span>")
src.verbs += /mob/proc/changeling_fleshmend
feedback_add_details("changeling_powers","FM")
return 1

View File

@@ -34,7 +34,7 @@ var/list/datum/dna/hivemind_bank = list()
names += DNA.name
if(names.len <= 0)
src << "<span class='notice'>The airwaves already have all of our DNA.</span>"
to_chat(src, "<span class='notice'>The airwaves already have all of our DNA.</span>")
return
var/S = input("Select a DNA to channel: ", "Channel DNA", null) as null|anything in names
@@ -46,7 +46,7 @@ var/list/datum/dna/hivemind_bank = list()
changeling.chem_charges -= 10
hivemind_bank += chosen_dna
src << "<span class='notice'>We channel the DNA of [S] to the air.</span>"
to_chat(src, "<span class='notice'>We channel the DNA of [S] to the air.</span>")
feedback_add_details("changeling_powers","HU")
return 1
@@ -64,7 +64,7 @@ var/list/datum/dna/hivemind_bank = list()
names[DNA.name] = DNA
if(names.len <= 0)
src << "<span class='notice'>There's no new DNA to absorb from the air.</span>"
to_chat(src, "<span class='notice'>There's no new DNA to absorb from the air.</span>")
return
var/S = input("Select a DNA absorb from the air: ", "Absorb DNA", null) as null|anything in names
@@ -75,6 +75,6 @@ var/list/datum/dna/hivemind_bank = list()
changeling.chem_charges -= 20
absorbDNA(chosen_dna)
src << "<span class='notice'>We absorb the DNA of [S] from the air.</span>"
to_chat(src, "<span class='notice'>We absorb the DNA of [S] from the air.</span>")
feedback_add_details("changeling_powers","HD")
return 1

View File

@@ -13,13 +13,13 @@
if(!changeling) return
if(src.has_brain_worms())
src << "<span class='warning'>We cannot perform this ability at the present time!</span>"
to_chat(src, "<span class='warning'>We cannot perform this ability at the present time!</span>")
return
var/mob/living/carbon/human/H = src
if(!istype(H) || !H.species.primitive_form)
src << "<span class='warning'>We cannot perform this ability in this form!</span>"
to_chat(src, "<span class='warning'>We cannot perform this ability in this form!</span>")
return
changeling.chem_charges--

View File

@@ -19,7 +19,7 @@
if(changeling.mimicing)
changeling.mimicing = ""
src << "<span class='notice'>We return our vocal glands to their original location.</span>"
to_chat(src, "<span class='notice'>We return our vocal glands to their original location.</span>")
return
var/mimic_voice = sanitize(input(usr, "Enter a name to mimic.", "Mimic Voice", null), MAX_NAME_LEN)
@@ -28,8 +28,8 @@
changeling.mimicing = mimic_voice
src << "<span class='notice'>We shape our glands to take the voice of <b>[mimic_voice]</b>, this will stop us from regenerating chemicals while active.</span>"
src << "<span class='notice'>Use this power again to return to our original voice and reproduce chemicals again.</span>"
to_chat(src, "<span class='notice'>We shape our glands to take the voice of <b>[mimic_voice]</b>, this will stop us from regenerating chemicals while active.</span>")
to_chat(src, "<span class='notice'>Use this power again to return to our original voice and reproduce chemicals again.</span>")
feedback_add_details("changeling_powers","MV")

View File

@@ -18,7 +18,7 @@
return 0
src.mind.changeling.chem_charges -= 20
src << "<span class='notice'>We cleanse impurities from our form.</span>"
to_chat(src, "<span class='notice'>We cleanse impurities from our form.</span>")
var/mob/living/carbon/human/C = src
@@ -32,7 +32,7 @@
var/heal_amount = 5
if(src.mind.changeling.recursive_enhancement)
heal_amount = heal_amount * 2
src << "<span class='notice'>We will heal much faster.</span>"
to_chat(src, "<span class='notice'>We will heal much faster.</span>")
for(var/i = 0, i<10,i++)
if(C)

View File

@@ -24,7 +24,7 @@
var/healing_amount = 40
if(src.mind.changeling.recursive_enhancement)
healing_amount = C.maxHealth
src << "<span class='notice'>We completely heal ourselves.</span>"
to_chat(src, "<span class='notice'>We completely heal ourselves.</span>")
spawn(0)
C.adjustBruteLoss(-healing_amount)
C.adjustFireLoss(-healing_amount)

View File

@@ -15,10 +15,10 @@
if(!changeling)
return 0
if(src.mind.changeling.recursive_enhancement)
src << "<span class='warning'>We will no longer empower our abilities.</span>"
to_chat(src, "<span class='warning'>We will no longer empower our abilities.</span>")
src.mind.changeling.recursive_enhancement = 0
return 0
src << "<span class='notice'>We empower ourselves. Our abilities will now be extra potent.</span>"
to_chat(src, "<span class='notice'>We empower ourselves. Our abilities will now be extra potent.</span>")
src.mind.changeling.recursive_enhancement = 1
feedback_add_details("changeling_powers","RE")
return 1

View File

@@ -26,6 +26,6 @@
H.remove_modifiers_of_type(/datum/modifier/endoarmor) //Revert endoarmor too.
src.make_changeling() //And give back our freebies.
src << "<span class='notice'>We have removed our evolutions from this form, and are now ready to readapt.</span>"
to_chat(src, "<span class='notice'>We have removed our evolutions from this form, and are now ready to readapt.</span>")
ling_datum.purchased_powers_history.Add("Re-adapt (Reset to [ling_datum.max_geneticpoints])")

View File

@@ -9,7 +9,7 @@
return 0
if(changeling.max_geneticpoints < 0) //Absorbed by another ling
src << "<span class='danger'>You have no genomes, not even your own, and cannot revive.</span>"
to_chat(src, "<span class='danger'>You have no genomes, not even your own, and cannot revive.</span>")
return 0
if(src.stat == DEAD)

View File

@@ -19,13 +19,13 @@
if(istype(src,/mob/living/carbon))
var/mob/living/carbon/C = src
if(C.suiciding)
src << "You're committing suicide, this isn't going to work."
to_chat(src, "You're committing suicide, this isn't going to work.")
return 0
if(C.does_not_breathe == 0)
C.does_not_breathe = 1
src << "<span class='notice'>We stop breathing, as we no longer need to.</span>"
to_chat(src, "<span class='notice'>We stop breathing, as we no longer need to.</span>")
return 1
else
C.does_not_breathe = 0
src << "<span class='notice'>We resume breathing, as we now need to again.</span>"
to_chat(src, "<span class='notice'>We resume breathing, as we now need to again.</span>")
return 0

View File

@@ -95,13 +95,13 @@
if(!changeling) return 0
if(is_muzzled())
src << "<span class='danger'>Mmmf mrrfff!</span>"
to_chat(src, "<span class='danger'>Mmmf mrrfff!</span>")
return 0
if(ishuman(src))
var/mob/living/carbon/human/H = src
if(H.silent)
src << "<span class='danger'>You can't speak!</span>"
to_chat(src, "<span class='danger'>You can't speak!</span>")
return 0
if(world.time < (changeling.last_shriek + 10 SECONDS) )
@@ -125,7 +125,7 @@
range_med = range_med * 2
range_light = range_light * 2
range_long = range_long * 2
src << "<span class='notice'>We are extra loud.</span>"
to_chat(src, "<span class='notice'>We are extra loud.</span>")
src.mind.changeling.recursive_enhancement = 0
visible_message("<span class='notice'>[src] appears to shout.</span>")

View File

@@ -19,7 +19,7 @@
var/duration = 30
if(src.mind.changeling.recursive_enhancement)
duration = duration + 10
src << "<span class='notice'>They will be unable to cry out in fear for a little longer.</span>"
to_chat(src, "<span class='notice'>They will be unable to cry out in fear for a little longer.</span>")
T.silent += duration
feedback_add_details("changeling_powers","SS")
return 1

View File

@@ -34,7 +34,7 @@
if(!T)
return 0
if((HUSK in T.mutations) || (!ishuman(T) && !issmall(T)))
src << "<span class='warning'>Our sting appears ineffective against its DNA.</span>"
to_chat(src, "<span class='warning'>Our sting appears ineffective against its DNA.</span>")
return 0
add_attack_logs(src,T,"Transformation sting (changeling)")
T.visible_message("<span class='warning'>[T] transforms!</span>")

View File

@@ -192,6 +192,7 @@ proc/findNullRod(var/atom/target)
icon_state = "m_shield_cult"
light_color = "#B40000"
light_range = 2
invisibility = 0
/obj/effect/forcefield/cult/cultify()
return

View File

@@ -26,6 +26,17 @@
light_color = "#3e0000"
var/obj/item/wepon = null
var/shatter_message = "The pylon shatters!"
var/impact_sound = 'sound/effects/Glasshit.ogg'
var/shatter_sound = 'sound/effects/Glassbr3.ogg'
var/activation_cooldown = 30 SECONDS
var/last_activation = 0
/obj/structure/cult/pylon/Initialize()
..()
START_PROCESSING(SSobj, src)
/obj/structure/cult/pylon/attack_hand(mob/M as mob)
attackpylon(M, 5)
@@ -44,47 +55,58 @@
/obj/structure/cult/pylon/proc/pylonhit(var/damage)
if(!isbroken)
if(prob(1+ damage * 5))
visible_message("<span class='danger'>The pylon shatters!</span>")
playsound(get_turf(src), 'sound/effects/Glassbr3.ogg', 75, 1)
visible_message("<span class='danger'>[shatter_message]</span>")
STOP_PROCESSING(SSobj, src)
playsound(get_turf(src),shatter_sound, 75, 1)
isbroken = 1
density = 0
icon_state = "pylon-broken"
icon_state = "[initial(icon_state)]-broken"
set_light(0)
/obj/structure/cult/pylon/proc/attackpylon(mob/user as mob, var/damage)
if(!isbroken)
if(prob(1+ damage * 5))
user.visible_message(
"<span class='danger'>[user] smashed the pylon!</span>",
"<span class='warning'>You hit the pylon, and its crystal breaks apart!</span>",
"You hear a tinkle of crystal shards"
"<span class='danger'>[user] smashed \the [src]!</span>",
"<span class='warning'>You hit \the [src], and its crystal breaks apart!</span>",
"You hear a tinkle of crystal shards."
)
STOP_PROCESSING(SSobj, src)
user.do_attack_animation(src)
playsound(get_turf(src), 'sound/effects/Glassbr3.ogg', 75, 1)
playsound(get_turf(src),shatter_sound, 75, 1)
isbroken = 1
density = 0
icon_state = "pylon-broken"
icon_state = "[initial(icon_state)]-broken"
set_light(0)
else
user << "You hit the pylon!"
playsound(get_turf(src), 'sound/effects/Glasshit.ogg', 75, 1)
user << "You hit \the [src]!"
playsound(get_turf(src),impact_sound, 75, 1)
else
if(prob(damage * 2))
user << "You pulverize what was left of the pylon!"
user << "You pulverize what was left of \the [src]!"
qdel(src)
else
user << "You hit the pylon!"
playsound(get_turf(src), 'sound/effects/Glasshit.ogg', 75, 1)
user << "You hit \the [src]!"
playsound(get_turf(src),impact_sound, 75, 1)
/obj/structure/cult/pylon/proc/repair(mob/user as mob)
if(isbroken)
user << "You repair the pylon."
START_PROCESSING(SSobj, src)
user << "You repair \the [src]."
isbroken = 0
density = 1
icon_state = "pylon"
icon_state = initial(icon_state)
set_light(5)
// Returns 1 if the pylon does something special.
/obj/structure/cult/pylon/proc/pylon_unique()
last_activation = world.time
return 0
/obj/structure/cult/pylon/process()
if(!isbroken && (last_activation < world.time + activation_cooldown) && pylon_unique())
flick("[initial(icon_state)]-surge",src)
/obj/structure/cult/tome
name = "Desk"
desc = "A desk covered in arcane manuscripts and tomes in unknown languages. Looking at the text makes your skin crawl."
@@ -116,6 +138,12 @@
return
/obj/effect/gateway/Crossed(AM as mob|obj)
//VOREStation Edit begin: SHADEKIN
var/mob/SK = AM
if(istype(SK))
if(SK.shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
spawn(0)
return
return
@@ -148,6 +176,12 @@
qdel(src)
/obj/effect/gateway/active/Crossed(var/atom/A)
//VOREStation Edit begin: SHADEKIN
var/mob/SK = A
if(istype(SK))
if(SK.shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
if(!istype(A, /mob/living))
return

View File

@@ -12,7 +12,7 @@
icon_state = "ghost-narsie"
overlays = 0
invisibility = 0
src << "<span class='sinister'>Even as a non-corporal being, you can feel Nar-Sie's presence altering you. You are now visible to everyone.</span>"
to_chat(src, "<span class='sinister'>Even as a non-corporal being, you can feel Nar-Sie's presence altering you. You are now visible to everyone.</span>")
/mob/living/cultify()
if(iscultist(src) && client)

View File

@@ -425,7 +425,7 @@ var/global/datum/controller/gameticker/ticker
for (var/mob/living/silicon/robot/robo in mob_list)
if(istype(robo,/mob/living/silicon/robot/drone))
if(istype(robo,/mob/living/silicon/robot/drone) && !istype(robo,/mob/living/silicon/robot/drone/swarm))
dronecount++
continue

View File

@@ -122,13 +122,13 @@
electrocute_act(instability * 0.3, "unstable energies", 0.75)
if(1)
adjustFireLoss(instability * 0.15) //7.5 burn @ 50 instability
src << "<span class='danger'>Your chassis alerts you to overheating from an unknown external force!</span>"
to_chat(src, "<span class='danger'>Your chassis alerts you to overheating from an unknown external force!</span>")
if(2)
adjustBruteLoss(instability * 0.15) //7.5 brute @ 50 instability
src << "<span class='danger'>Your chassis makes the sound of metal groaning!</span>"
to_chat(src, "<span class='danger'>Your chassis makes the sound of metal groaning!</span>")
if(3)
safe_blink(src, range = 6)
src << "<span class='warning'>You're teleported against your will!</span>"
to_chat(src, "<span class='warning'>You're teleported against your will!</span>")
if(4)
emp_act(3)
@@ -141,10 +141,10 @@
emp_act(2)
if(2)
adjustFireLoss(instability * 0.3) //30 burn @ 100 instability
src << "<span class='danger'>Your chassis alerts you to extreme overheating from an unknown external force!</span>"
to_chat(src, "<span class='danger'>Your chassis alerts you to extreme overheating from an unknown external force!</span>")
if(3)
adjustBruteLoss(instability * 0.3) //30 brute @ 100 instability
src << "<span class='danger'>Your chassis makes the sound of metal groaning and tearing!</span>"
to_chat(src, "<span class='danger'>Your chassis makes the sound of metal groaning and tearing!</span>")
if(101 to 200) //Lethal
rng = rand(0,4)
@@ -155,10 +155,10 @@
emp_act(1)
if(2)
adjustFireLoss(instability * 0.4) //40 burn @ 100 instability
src << "<span class='danger'>Your chassis alerts you to extreme overheating from an unknown external force!</span>"
to_chat(src, "<span class='danger'>Your chassis alerts you to extreme overheating from an unknown external force!</span>")
if(3)
adjustBruteLoss(instability * 0.4) //40 brute @ 100 instability
src << "<span class='danger'>Your chassis makes the sound of metal groaning and tearing!</span>"
to_chat(src, "<span class='danger'>Your chassis makes the sound of metal groaning and tearing!</span>")
/mob/living/carbon/human/instability_effects()
if(instability)
@@ -190,23 +190,23 @@
if(2)
if(can_feel_pain())
apply_effect(instability * 0.3, AGONY)
src << "<span class='danger'>You feel a sharp pain!</span>"
to_chat(src, "<span class='danger'>You feel a sharp pain!</span>")
if(3)
apply_effect(instability * 0.3, EYE_BLUR)
src << "<span class='danger'>Your eyes start to get cloudy!</span>"
to_chat(src, "<span class='danger'>Your eyes start to get cloudy!</span>")
if(4)
electrocute_act(instability * 0.3, "unstable energies")
if(5)
adjustFireLoss(instability * 0.15) //7.5 burn @ 50 instability
src << "<span class='danger'>You feel your skin burn!</span>"
to_chat(src, "<span class='danger'>You feel your skin burn!</span>")
if(6)
adjustBruteLoss(instability * 0.15) //7.5 brute @ 50 instability
src << "<span class='danger'>You feel a sharp pain as an unseen force harms your body!</span>"
to_chat(src, "<span class='danger'>You feel a sharp pain as an unseen force harms your body!</span>")
if(7)
adjustToxLoss(instability * 0.15) //7.5 tox @ 50 instability
if(8)
safe_blink(src, range = 6)
src << "<span class='warning'>You're teleported against your will!</span>"
to_chat(src, "<span class='warning'>You're teleported against your will!</span>")
if(50 to 100) //Severe
rng = rand(0,8)
@@ -218,18 +218,18 @@
if(2)
if(can_feel_pain())
apply_effect(instability * 0.7, AGONY)
src << "<span class='danger'>You feel an extremly angonizing pain from all over your body!</span>"
to_chat(src, "<span class='danger'>You feel an extremly angonizing pain from all over your body!</span>")
if(3)
apply_effect(instability * 0.5, EYE_BLUR)
src << "<span class='danger'>Your eyes start to get cloudy!</span>"
to_chat(src, "<span class='danger'>Your eyes start to get cloudy!</span>")
if(4)
electrocute_act(instability * 0.5, "extremely unstable energies")
if(5)
fire_act()
src << "<span class='danger'>You spontaneously combust!</span>"
to_chat(src, "<span class='danger'>You spontaneously combust!</span>")
if(6)
adjustCloneLoss(instability * 0.05) //5 cloneloss @ 100 instability
src << "<span class='danger'>You feel your body slowly degenerate.</span>"
to_chat(src, "<span class='danger'>You feel your body slowly degenerate.</span>")
if(7)
adjustToxLoss(instability * 0.25) //25 tox @ 100 instability
@@ -245,18 +245,18 @@
if(2)
if(can_feel_pain())
apply_effect(instability, AGONY)
src << "<span class='danger'>You feel an extremly angonizing pain from all over your body!</span>"
to_chat(src, "<span class='danger'>You feel an extremly angonizing pain from all over your body!</span>")
if(3)
apply_effect(instability, EYE_BLUR)
src << "<span class='danger'>Your eyes start to get cloudy!</span>"
to_chat(src, "<span class='danger'>Your eyes start to get cloudy!</span>")
if(4)
electrocute_act(instability, "extremely unstable energies")
if(5)
fire_act()
src << "<span class='danger'>You spontaneously combust!</span>"
to_chat(src, "<span class='danger'>You spontaneously combust!</span>")
if(6)
adjustCloneLoss(instability * 0.10) //5 cloneloss @ 100 instability
src << "<span class='danger'>You feel your body slowly degenerate.</span>"
to_chat(src, "<span class='danger'>You feel your body slowly degenerate.</span>")
if(7)
adjustToxLoss(instability * 0.40) //40 tox @ 100 instability

View File

@@ -292,7 +292,7 @@
if(l_spell.aspect == ASPECT_CHROMATIC) //Check the other hand too.
l_spell.on_combine_cast(S, src)
else //Welp
src << "<span class='warning'>You require a free hand to use this function.</span>"
to_chat(src, "<span class='warning'>You require a free hand to use this function.</span>")
return 0
if(S.run_checks())

View File

@@ -11,7 +11,6 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
spawn_positions = 1
supervisors = "company officials and Corporate Regulations"
selection_color = "#1D1D4F"
idtype = /obj/item/weapon/card/id/gold
req_admin_notify = 1
access = list() //See get_access()
minimal_access = list() //See get_access()
@@ -44,7 +43,6 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
spawn_positions = 1
supervisors = "the Colony Director"
selection_color = "#2F2F7F"
idtype = /obj/item/weapon/card/id/silver/hop
req_admin_notify = 1
minimal_player_age = 10
economic_modifier = 10
@@ -79,7 +77,6 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
spawn_positions = 2
supervisors = "command staff"
selection_color = "#2F2F7F"
idtype = /obj/item/weapon/card/id/silver/secretary
minimal_player_age = 5
economic_modifier = 7

View File

@@ -9,7 +9,6 @@
spawn_positions = 2
supervisors = "the head of personnel"
selection_color = "#515151"
idtype = /obj/item/weapon/card/id/civilian/bartender
access = list(access_hydroponics, access_bar, access_kitchen)
minimal_access = list(access_bar)
@@ -27,7 +26,6 @@
spawn_positions = 2
supervisors = "the head of personnel"
selection_color = "#515151"
idtype = /obj/item/weapon/card/id/civilian/chef
access = list(access_hydroponics, access_bar, access_kitchen)
minimal_access = list(access_kitchen)
@@ -44,7 +42,6 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#515151"
idtype = /obj/item/weapon/card/id/civilian/botanist
access = list(access_hydroponics, access_bar, access_kitchen)
minimal_access = list(access_hydroponics)
@@ -63,7 +60,6 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#7a4f33"
idtype = /obj/item/weapon/card/id/cargo/head
economic_modifier = 5
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station)
minimal_access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station)
@@ -83,7 +79,6 @@
spawn_positions = 2
supervisors = "the quartermaster and the head of personnel"
selection_color = "#9b633e"
idtype = /obj/item/weapon/card/id/cargo/cargo_tech
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_mining, access_mining_station)
minimal_access = list(access_maint_tunnels, access_cargo, access_cargo_bot, access_mailsorting)
@@ -99,7 +94,6 @@
spawn_positions = 3
supervisors = "the quartermaster and the head of personnel"
selection_color = "#9b633e"
idtype = /obj/item/weapon/card/id/cargo/mining
economic_modifier = 5
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_mining, access_mining_station)
minimal_access = list(access_mining, access_mining_station, access_mailsorting)
@@ -118,7 +112,6 @@
spawn_positions = 2
supervisors = "the head of personnel"
selection_color = "#515151"
idtype = /obj/item/weapon/card/id/civilian/janitor
access = list(access_janitor, access_maint_tunnels)
minimal_access = list(access_janitor, access_maint_tunnels)
@@ -136,7 +129,6 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#515151"
idtype = /obj/item/weapon/card/id/civilian/librarian
access = list(access_library, access_maint_tunnels)
minimal_access = list(access_library)
@@ -154,7 +146,6 @@
spawn_positions = 2
supervisors = "company officials and Corporate Regulations"
selection_color = "#515151"
idtype = /obj/item/weapon/card/id/civilian/internal_affairs_agent
economic_modifier = 7
access = list(access_lawyer, access_sec_doors, access_maint_tunnels, access_heads)
minimal_access = list(access_lawyer, access_sec_doors, access_heads)

View File

@@ -9,7 +9,6 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#515151"
idtype = /obj/item/weapon/card/id/civilian/chaplain
access = list(access_morgue, access_chapel_office, access_crematorium, access_maint_tunnels)
minimal_access = list(access_chapel_office, access_crematorium)
alt_titles = list("Counselor")

View File

@@ -9,7 +9,6 @@
spawn_positions = 1
supervisors = "the Colony Director"
selection_color = "#7F6E2C"
idtype = /obj/item/weapon/card/id/engineering/head
req_admin_notify = 1
economic_modifier = 10
@@ -39,7 +38,6 @@
spawn_positions = 5
supervisors = "the chief engineer"
selection_color = "#5B4D20"
idtype = /obj/item/weapon/card/id/engineering/engineer
economic_modifier = 5
access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics)
minimal_access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction)
@@ -59,7 +57,6 @@
spawn_positions = 2
supervisors = "the chief engineer"
selection_color = "#5B4D20"
idtype = /obj/item/weapon/card/id/engineering/atmos
economic_modifier = 5
access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics, access_external_airlocks)
minimal_access = list(access_eva, access_engine, access_atmospherics, access_maint_tunnels, access_emergency_storage, access_construction, access_external_airlocks)

View File

@@ -13,7 +13,6 @@
var/current_positions = 0 // How many players have this job
var/supervisors = null // Supervisors, who this person answers to directly
var/selection_color = "#ffffff" // Selection screen color
var/idtype = /obj/item/weapon/card/id // The type of the ID the player will have
var/list/alt_titles // List of alternate titles, if any
var/req_admin_notify // If this is set to 1, a text is printed to the player when jobs are assigned, telling him that he should let admins know that he has to disconnect.
var/minimal_player_age = 0 // If you have use_age_restriction_for_jobs config option enabled and the database set up, this option will add a requirement for players to be at least minimal_player_age days old. (meaning they first signed in at least that many days before.)
@@ -21,6 +20,7 @@
var/head_position = 0 // Is this position Command?
var/minimum_character_age = 0
var/ideal_character_age = 30
var/has_headset = TRUE //Do people with this job need to be given headsets and told how to use them? E.g. Cyborgs don't.
var/account_allowed = 1 // Does this job type come with a station account?
var/economic_modifier = 2 // With how much does this job modify the initial account amount?
@@ -40,13 +40,6 @@
. = . || outfit_type
. = outfit_by_type(.)
/datum/job/proc/equip_backpack(var/mob/living/carbon/human/H)
switch(H.backbag)
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(H), slot_back)
/datum/job/proc/setup_account(var/mob/living/carbon/human/H)
if(!account_allowed || (H.mind && H.mind.initial_account))
return

View File

@@ -9,7 +9,6 @@
spawn_positions = 1
supervisors = "the Colony Director"
selection_color = "#026865"
idtype = /obj/item/weapon/card/id/medical/head
req_admin_notify = 1
economic_modifier = 10
access = list(access_medical, access_medical_equip, access_morgue, access_genetics, access_heads,
@@ -35,7 +34,6 @@
spawn_positions = 3
supervisors = "the chief medical officer"
selection_color = "#013D3B"
idtype = /obj/item/weapon/card/id/medical/doctor
economic_modifier = 7
access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_eva)
minimal_access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_virology, access_eva)
@@ -57,7 +55,6 @@
spawn_positions = 2
supervisors = "the chief medical officer"
selection_color = "#013D3B"
idtype = /obj/item/weapon/card/id/medical/chemist
economic_modifier = 5
access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics)
minimal_access = list(access_medical, access_medical_equip, access_chemistry)
@@ -78,7 +75,6 @@
spawn_positions = 0
supervisors = "the chief medical officer and research director"
selection_color = "#013D3B"
idtype = /obj/item/weapon/card/id/medical/geneticist
economic_modifier = 7
access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_research)
minimal_access = list(access_medical, access_morgue, access_genetics, access_research)
@@ -97,7 +93,6 @@
economic_modifier = 5
supervisors = "the chief medical officer"
selection_color = "#013D3B"
idtype = /obj/item/weapon/card/id/medical/psychiatrist
access = list(access_medical, access_medical_equip, access_morgue, access_psychiatrist)
minimal_access = list(access_medical, access_medical_equip, access_psychiatrist)
outfit_type = /decl/hierarchy/outfit/job/medical/psychiatrist
@@ -113,7 +108,6 @@
spawn_positions = 2
supervisors = "the chief medical officer"
selection_color = "#013D3B"
idtype = /obj/item/weapon/card/id/medical/paramedic
economic_modifier = 4
access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_eva, access_maint_tunnels, access_external_airlocks, access_psychiatrist)
minimal_access = list(access_medical, access_medical_equip, access_morgue, access_eva, access_maint_tunnels, access_external_airlocks)

View File

@@ -9,7 +9,6 @@
spawn_positions = 1
supervisors = "the Colony Director"
selection_color = "#AD6BAD"
idtype = /obj/item/weapon/card/id/science/head
req_admin_notify = 1
economic_modifier = 15
access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue,
@@ -39,7 +38,6 @@
spawn_positions = 3
supervisors = "the research director"
selection_color = "#633D63"
idtype = /obj/item/weapon/card/id/science/scientist
economic_modifier = 7
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_xenoarch)
minimal_access = list(access_tox, access_tox_storage, access_research, access_xenoarch)
@@ -59,7 +57,6 @@
spawn_positions = 2
supervisors = "the research director"
selection_color = "#633D63"
idtype = /obj/item/weapon/card/id/science/xenobiologist
economic_modifier = 7
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_hydroponics)
minimal_access = list(access_research, access_xenobiology, access_hydroponics, access_tox_storage)
@@ -79,7 +76,6 @@
spawn_positions = 2
supervisors = "research director"
selection_color = "#633D63"
idtype = /obj/item/weapon/card/id/science/roboticist
economic_modifier = 5
access = list(access_robotics, access_tox, access_tox_storage, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access.
minimal_access = list(access_robotics, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access.

View File

@@ -9,7 +9,6 @@
spawn_positions = 1
supervisors = "the Colony Director"
selection_color = "#8E2929"
idtype = /obj/item/weapon/card/id/security/head
req_admin_notify = 1
economic_modifier = 10
access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory,
@@ -36,7 +35,6 @@
spawn_positions = 1
supervisors = "the head of security"
selection_color = "#601C1C"
idtype = /obj/item/weapon/card/id/security/warden
economic_modifier = 5
access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_morgue, access_external_airlocks)
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_external_airlocks)
@@ -53,7 +51,6 @@
spawn_positions = 2
supervisors = "the head of security"
selection_color = "#601C1C"
idtype = /obj/item/weapon/card/id/security/detective
access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_eva, access_external_airlocks)
minimal_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_eva, access_external_airlocks)
economic_modifier = 5
@@ -71,7 +68,6 @@
spawn_positions = 4
supervisors = "the head of security"
selection_color = "#601C1C"
idtype = /obj/item/weapon/card/id/security/officer
economic_modifier = 4
access = list(access_security, access_eva, access_sec_doors, access_brig, access_maint_tunnels, access_morgue, access_external_airlocks)
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_maint_tunnels, access_external_airlocks)

View File

@@ -11,18 +11,11 @@
minimal_player_age = 7
account_allowed = 0
economic_modifier = 0
has_headset = FALSE
/datum/job/ai/equip(var/mob/living/carbon/human/H)
if(!H) return 0
return 1
/*
/datum/job/ai/equip_survival(var/mob/living/carbon/human/H)
if(!H) return 0
return 1
*/
/datum/job/ai/equip_backpack(var/mob/living/carbon/human/H)
if(!H) return 0
return 1
/datum/job/ai/is_position_available()
return (empty_playable_ai_cores.len != 0)
@@ -45,19 +38,11 @@
alt_titles = list("Robot", "Drone")
account_allowed = 0
economic_modifier = 0
has_headset = FALSE
/datum/job/cyborg/equip(var/mob/living/carbon/human/H)
if(!H) return 0
return 1
/*
/datum/job/cyborg/equip_survival(var/mob/living/carbon/human/H)
if(!H) return 0
return 1
*/
/datum/job/cyborg/equip_backpack(var/mob/living/carbon/human/H)
if(!H) return 0
return 1
return 1
/datum/job/cyborg/equip_preview(mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/cardborg(H), slot_wear_suit)

View File

@@ -7,7 +7,6 @@
spawn_positions = 1
supervisors = "company officials and Corporate Regulations"
selection_color = "#1D1D4F"
idtype = /obj/item/weapon/card/id/centcom
access = list()
minimal_access = list()
minimal_player_age = 14

View File

@@ -411,8 +411,6 @@ var/global/datum/controller/occupations/job_master
//Equip job items.
job.setup_account(H)
job.equip(H, H.mind ? H.mind.role_alt_title : "")
job.equip_backpack(H)
// job.equip_survival(H)
job.apply_fingerprints(H)
if(job.title != "Cyborg" && job.title != "AI")
H.equip_post_job()
@@ -499,9 +497,7 @@ var/global/datum/controller/occupations/job_master
if(job.supervisors)
H << "<b>As the [alt_title ? alt_title : rank] you answer directly to [job.supervisors]. Special circumstances may change this.</b>"
if(job.idtype)
spawnId(H, rank, alt_title)
if(job.has_headset)
H.equip_to_slot_or_del(new /obj/item/device/radio/headset(H), slot_l_ear)
H << "<b>To speak on your department's radio channel use :h. For the use of other channels, examine your headset.</b>"
@@ -543,48 +539,6 @@ var/global/datum/controller/occupations/job_master
BITSET(H.hud_updateflag, SPECIALROLE_HUD)
return H
proc/spawnId(var/mob/living/carbon/human/H, rank, title)
if(!H) return 0
var/obj/item/weapon/card/id/C = H.get_equipped_item(slot_wear_id)
if(istype(C)) return 0
var/datum/job/job = null
for(var/datum/job/J in occupations)
if(J.title == rank)
job = J
break
if(job)
if(job.title == "Cyborg")
return
else
C = new job.idtype(H)
C.access = job.get_access()
else
C = new /obj/item/weapon/card/id(H)
if(C)
C.rank = rank
C.assignment = title ? title : rank
H.set_id_info(C)
//put the player's account number onto the ID
if(H.mind && H.mind.initial_account)
C.associated_account_number = H.mind.initial_account.account_number
H.equip_to_slot_or_del(C, slot_wear_id)
// H.equip_to_slot_or_del(new /obj/item/device/pda(H), slot_belt)
if(locate(/obj/item/device/pda,H))
var/obj/item/device/pda/pda = locate(/obj/item/device/pda,H)
pda.owner = H.real_name
pda.ownjob = C.assignment
pda.ownrank = C.rank
pda.name = "PDA-[H.real_name] ([pda.ownjob])"
return 1
proc/LoadJobs(jobsfile) //ran during round setup, reads info from jobs.txt -- Urist
if(!config.load_jobs_from_txt)
return 0

View File

@@ -156,10 +156,10 @@
if(!choice || printing || (stat & (BROKEN|NOPOWER)))
return
if(!can_print(choice))
if(!can_print(choice, possible_list[choice][2]))
return
container.reagents.remove_reagent("biomass", products[choice][2])
container.reagents.remove_reagent("biomass", possible_list[choice][2])
use_power = 2
printing = 1
@@ -176,7 +176,7 @@
if(!choice || !src || (stat & (BROKEN|NOPOWER)))
return
print_organ(choice)
print_organ(possible_list[choice][1])
return
@@ -210,10 +210,10 @@
return biomass_count
/obj/machinery/organ_printer/proc/can_print(var/choice)
/obj/machinery/organ_printer/proc/can_print(var/choice, var/masscount = 0)
var/biomass = get_biomass_volume()
if(biomass < products[choice][2])
visible_message("<span class='notice'>\The [src] displays a warning: 'Not enough biomass. [biomass] stored and [products[choice][2]] needed.'</span>")
if(biomass < masscount)
visible_message("<span class='notice'>\The [src] displays a warning: 'Not enough biomass. [biomass] stored and [masscount] needed.'</span>")
return 0
if(!loaded_dna || !loaded_dna["donor"])
@@ -223,7 +223,7 @@
return 1
/obj/machinery/organ_printer/proc/print_organ(var/choice)
var/new_organ = products[choice][1]
var/new_organ = choice
var/obj/item/organ/O = new new_organ(get_turf(src))
O.status |= ORGAN_CUT_AWAY
var/mob/living/carbon/human/C = loaded_dna["donor"]

View File

@@ -47,24 +47,24 @@
loc = sanitize(loc)
if(!loc)
src << "<span class='warning'>Must supply a location name</span>"
to_chat(src, "<span class='warning'>Must supply a location name</span>")
return
if(stored_locations.len >= max_locations)
src << "<span class='warning'>Cannot store additional locations. Remove one first</span>"
to_chat(src, "<span class='warning'>Cannot store additional locations. Remove one first</span>")
return
if(loc in stored_locations)
src << "<span class='warning'>There is already a stored location by this name</span>"
to_chat(src, "<span class='warning'>There is already a stored location by this name</span>")
return
var/L = src.eyeobj.getLoc()
if (InvalidPlayerTurf(get_turf(L)))
src << "<span class='warning'>Unable to store this location</span>"
to_chat(src, "<span class='warning'>Unable to store this location</span>")
return
stored_locations[loc] = L
src << "Location '[loc]' stored"
to_chat(src, "Location '[loc]' stored")
/mob/living/silicon/ai/proc/sorted_stored_locations()
return sortList(stored_locations)
@@ -75,7 +75,7 @@
set desc = "Returns to the selected camera location"
if (!(loc in stored_locations))
src << "<span class='warning'>Location [loc] not found</span>"
to_chat(src, "<span class='warning'>Location [loc] not found</span>")
return
var/L = stored_locations[loc]
@@ -87,11 +87,11 @@
set desc = "Deletes the selected camera location"
if (!(loc in stored_locations))
src << "<span class='warning'>Location [loc] not found</span>"
to_chat(src, "<span class='warning'>Location [loc] not found</span>")
return
stored_locations.Remove(loc)
src << "Location [loc] removed"
to_chat(src, "Location [loc] removed")
// Used to allow the AI is write in mob names/camera name from the CMD line.
/datum/trackable
@@ -134,7 +134,7 @@
set desc = "Select who you would like to track."
if(src.stat == 2)
src << "You can't follow [target_name] with cameras because you are dead!"
to_chat(src, "You can't follow [target_name] with cameras because you are dead!")
return
if(!target_name)
src.cameraFollow = null
@@ -147,7 +147,7 @@
if(!cameraFollow)
return
src << "Follow camera mode [forced ? "terminated" : "ended"]."
to_chat(src, "Follow camera mode [forced ? "terminated" : "ended"].")
cameraFollow.tracking_cancelled()
cameraFollow = null
@@ -266,14 +266,14 @@ mob/living/proc/tracking_initiated()
mob/living/silicon/robot/tracking_initiated()
tracking_entities++
if(tracking_entities == 1 && has_zeroth_law())
src << "<span class='warning'>Internal camera is currently being accessed.</span>"
to_chat(src, "<span class='warning'>Internal camera is currently being accessed.</span>")
mob/living/proc/tracking_cancelled()
mob/living/silicon/robot/tracking_initiated()
tracking_entities--
if(!tracking_entities && has_zeroth_law())
src << "<span class='notice'>Internal camera is no longer being accessed.</span>"
to_chat(src, "<span class='notice'>Internal camera is no longer being accessed.</span>")
#undef TRACKING_POSSIBLE

Some files were not shown because too many files have changed in this diff Show More