mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-11 10:43:20 +00:00
Merge branch 'upstream-merge-6520' into prybars
This commit is contained in:
@@ -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"
|
||||
|
||||
@@ -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]%)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
31
code/__defines/__513_compatibility.dm
Normal file
31
code/__defines/__513_compatibility.dm
Normal 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
|
||||
@@ -1,2 +1,3 @@
|
||||
// More for our custom races
|
||||
#define IS_CHIMERA 12
|
||||
#define IS_CHIMERA 12
|
||||
#define IS_SHADEKIN 13
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
1
code/_global_vars/lists/misc.dm
Normal file
1
code/_global_vars/lists/misc.dm
Normal file
@@ -0,0 +1 @@
|
||||
GLOBAL_LIST_INIT(speech_toppings, list("|" = "i", "+" = "b", "_" = "u"))
|
||||
1
code/_helpers/_global_objects_vr.dm
Normal file
1
code/_helpers/_global_objects_vr.dm
Normal file
@@ -0,0 +1 @@
|
||||
var/datum/gear_tweak/collar_tag/gear_tweak_collar_tag = new()
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
/*
|
||||
|
||||
2
code/_onclick/hud/_defines_vr.dm
Normal file
2
code/_onclick/hud/_defines_vr.dm
Normal 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"
|
||||
@@ -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.
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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>")
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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//
|
||||
/////////////////////////////////////////
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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."
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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. \
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
@@ -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"
|
||||
|
||||
@@ -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].")
|
||||
|
||||
@@ -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
|
||||
|
||||
18
code/game/antagonist/station/stowaway.dm
Normal file
18
code/game/antagonist/station/stowaway.dm
Normal 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
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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)")
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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--
|
||||
|
||||
@@ -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")
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
@@ -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])")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
@@ -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>")
|
||||
|
||||
@@ -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
|
||||
@@ -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>")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user