mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2026-08-28 07:39:13 +01:00
First merge from upstream
This commit is contained in:
@@ -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
|
||||
@@ -55,7 +55,29 @@
|
||||
#define PIPING_ONE_PER_TURF 2 //can only be built if nothing else with this flag is on the tile already.
|
||||
#define PIPING_DEFAULT_LAYER_ONLY 4 //can only exist at PIPING_LAYER_DEFAULT
|
||||
#define PIPING_CARDINAL_AUTONORMALIZE 8 //north/south east/west doesn't matter, auto normalize on build.
|
||||
//YW Additions
|
||||
// Disposals Construction
|
||||
//
|
||||
#define DISPOSAL_PIPE_STRAIGHT 0
|
||||
#define DISPOSAL_PIPE_CORNER 1
|
||||
#define DISPOSAL_PIPE_JUNCTION 2
|
||||
#define DISPOSAL_PIPE_JUNCTION_FLIPPED 3
|
||||
#define DISPOSAL_PIPE_JUNCTION_Y 4
|
||||
#define DISPOSAL_PIPE_TRUNK 5
|
||||
#define DISPOSAL_PIPE_BIN 6
|
||||
#define DISPOSAL_PIPE_OUTLET 7
|
||||
#define DISPOSAL_PIPE_CHUTE 8
|
||||
#define DISPOSAL_PIPE_SORTER 9
|
||||
#define DISPOSAL_PIPE_SORTER_FLIPPED 10
|
||||
#define DISPOSAL_PIPE_UPWARD 11
|
||||
#define DISPOSAL_PIPE_DOWNWARD 12
|
||||
#define DISPOSAL_PIPE_TAGGER 13
|
||||
#define DISPOSAL_PIPE_TAGGER_PARTIAL 14
|
||||
|
||||
#define DISPOSAL_SORT_NORMAL 0
|
||||
#define DISPOSAL_SORT_WILDCARD 1
|
||||
#define DISPOSAL_SORT_UNTAGGED 2
|
||||
//YW Additions end
|
||||
// Macro for easy use of boilerplate code for searching for a valid node connection.
|
||||
#define STANDARD_ATMOS_CHOOSE_NODE(node_num, direction) \
|
||||
for(var/obj/machinery/atmospherics/target in get_step(src, direction)) { \
|
||||
|
||||
@@ -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=-1, size=2, offset=2, color="#04080F55") //VOREStation Edit for prettier visuals.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -344,7 +344,7 @@ var/global/list/##LIST_NAME = list();\
|
||||
#define RCD_VALUE_DELAY "delay"
|
||||
#define RCD_VALUE_COST "cost"
|
||||
|
||||
#define RCD_SHEETS_PER_MATTER_UNIT 4 // Each physical material sheet is worth four matter units.
|
||||
#define RCD_SHEETS_PER_MATTER_UNIT 3 // Each physical material sheet is worth four matter units. ///YW EDIT 4->3 *Buffing RCDs Hopefully.*
|
||||
#define RCD_MAX_CAPACITY 30 * RCD_SHEETS_PER_MATTER_UNIT
|
||||
|
||||
// Radiation 'levels'. Used for the geiger counter, for visuals and sound. They are in different files so this goes here.
|
||||
@@ -353,7 +353,9 @@ var/global/list/##LIST_NAME = list();\
|
||||
#define RAD_LEVEL_HIGH 25
|
||||
#define RAD_LEVEL_VERY_HIGH 75
|
||||
|
||||
#define RADIATION_THRESHOLD_CUTOFF 0.1 // Radiation will not affect a tile when below this value.
|
||||
// Calculation modes for effective radiation
|
||||
#define RAD_RESIST_CALC_DIV 0 // Each turf absorbs some fraction of the working radiation level
|
||||
#define RAD_RESIST_CALC_SUB 1 // Each turf absorbs a fixed amount of radiation
|
||||
|
||||
//https://secure.byond.com/docs/ref/info.html#/atom/var/mouse_opacity
|
||||
#define MOUSE_OPACITY_TRANSPARENT 0
|
||||
|
||||
@@ -325,6 +325,8 @@
|
||||
#define SPECIES_SKELETON "Skeleton"
|
||||
#define SPECIES_GOLEM "Golem"
|
||||
#define SPECIES_EVENT1 "X Occursus"
|
||||
#define SPECIES_EVENT2 "X Anomalous"
|
||||
#define SPECIES_EVENT3 "X Unowas"
|
||||
|
||||
// Replicant types. Currently only used for alien pods and events.
|
||||
#define SPECIES_REPLICANT "Replicant"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
GLOBAL_LIST_INIT(speech_toppings, list("|" = "i", "+" = "b", "_" = "u"))
|
||||
@@ -0,0 +1,8 @@
|
||||
//Languages/species/whitelist.
|
||||
GLOBAL_LIST_INIT(all_species, list())
|
||||
GLOBAL_LIST_INIT(all_languages, list())
|
||||
GLOBAL_LIST_INIT(language_keys, list()) // Table of say codes for all languages
|
||||
GLOBAL_LIST_INIT(whitelisted_species, list(SPECIES_HUMAN)) // Species that require a whitelist check.
|
||||
// VOREStation edit - include custom species
|
||||
GLOBAL_LIST_INIT(playable_species, list(SPECIES_HUMAN, SPECIES_CUSTOM)) // A list of ALL playable species, whitelisted, latejoin or otherwise.
|
||||
// VOREStation edit end
|
||||
@@ -24,13 +24,6 @@ var/global/list/turfs = list() //list of all turfs
|
||||
#define all_genders_define_list list(MALE,FEMALE,PLURAL,NEUTER,HERM) //VOREStaton Edit
|
||||
#define all_genders_text_list list("Male","Female","Plural","Neuter","Herm") //VOREStation Edit
|
||||
|
||||
//Languages/species/whitelist.
|
||||
var/global/list/all_species[0]
|
||||
var/global/list/all_languages[0]
|
||||
var/global/list/language_keys[0] // Table of say codes for all languages
|
||||
var/global/list/whitelisted_species = list(SPECIES_HUMAN) // Species that require a whitelist check.
|
||||
var/global/list/playable_species = list(SPECIES_CUSTOM, SPECIES_HUMAN) // A list of ALL playable species, whitelisted, latejoin or otherwise. //VOREStation Edit - Making sure custom species is obvious.
|
||||
|
||||
var/list/mannequins_
|
||||
|
||||
// Posters
|
||||
@@ -164,12 +157,12 @@ var/global/list/string_slot_flags = list(
|
||||
paths = typesof(/datum/language)-/datum/language
|
||||
for(var/T in paths)
|
||||
var/datum/language/L = new T
|
||||
all_languages[L.name] = L
|
||||
GLOB.all_languages[L.name] = L
|
||||
|
||||
for (var/language_name in all_languages)
|
||||
var/datum/language/L = all_languages[language_name]
|
||||
for (var/language_name in GLOB.all_languages)
|
||||
var/datum/language/L = GLOB.all_languages[language_name]
|
||||
if(!(L.flags & NONGLOBAL))
|
||||
language_keys[lowertext(L.key)] = L
|
||||
GLOB.language_keys[lowertext(L.key)] = L
|
||||
|
||||
var/rkey = 0
|
||||
paths = typesof(/datum/species)
|
||||
@@ -183,12 +176,12 @@ var/global/list/string_slot_flags = list(
|
||||
|
||||
S = new T
|
||||
S.race_key = rkey //Used in mob icon caching.
|
||||
all_species[S.name] = S
|
||||
GLOB.all_species[S.name] = S
|
||||
|
||||
if(!(S.spawn_flags & SPECIES_IS_RESTRICTED))
|
||||
playable_species += S.name
|
||||
GLOB.playable_species += S.name
|
||||
if(S.spawn_flags & SPECIES_IS_WHITELISTED)
|
||||
whitelisted_species += S.name
|
||||
GLOB.whitelisted_species += S.name
|
||||
|
||||
//Posters
|
||||
paths = typesof(/datum/poster) - /datum/poster
|
||||
|
||||
@@ -169,7 +169,6 @@ var/global/list/edible_trash = list(/obj/item/broken_device,
|
||||
/obj/item/weapon/pen,
|
||||
/obj/item/weapon/photo,
|
||||
/obj/item/weapon/reagent_containers/food,
|
||||
/obj/item/weapon/reagent_containers/glass/bottle,
|
||||
/obj/item/weapon/reagent_containers/glass/rag,
|
||||
/obj/item/weapon/soap,
|
||||
/obj/item/weapon/spacecash,
|
||||
@@ -470,10 +469,10 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN,
|
||||
|
||||
// Custom species icon bases
|
||||
var/list/blacklisted_icons = list(SPECIES_CUSTOM,SPECIES_PROMETHEAN) //Just ones that won't work well.
|
||||
for(var/species_name in playable_species)
|
||||
for(var/species_name in GLOB.playable_species)
|
||||
if(species_name in blacklisted_icons)
|
||||
continue
|
||||
var/datum/species/S = all_species[species_name]
|
||||
var/datum/species/S = GLOB.all_species[species_name]
|
||||
if(S.spawn_flags & SPECIES_IS_WHITELISTED)
|
||||
continue
|
||||
custom_species_bases += species_name
|
||||
|
||||
@@ -75,7 +75,7 @@ proc/random_facial_hair_style(gender, species = SPECIES_HUMAN)
|
||||
proc/sanitize_name(name, species = SPECIES_HUMAN, robot = 0)
|
||||
var/datum/species/current_species
|
||||
if(species)
|
||||
current_species = all_species[species]
|
||||
current_species = GLOB.all_species[species]
|
||||
|
||||
return current_species ? current_species.sanitize_name(name, robot) : sanitizeName(name, MAX_NAME_LEN, robot)
|
||||
|
||||
@@ -83,7 +83,7 @@ proc/random_name(gender, species = SPECIES_HUMAN)
|
||||
|
||||
var/datum/species/current_species
|
||||
if(species)
|
||||
current_species = all_species[species]
|
||||
current_species = GLOB.all_species[species]
|
||||
|
||||
if(!current_species || current_species.name_language == null)
|
||||
if(gender==FEMALE)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -590,10 +590,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
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
|
||||
face_atom(A) // change direction to face what you clicked on
|
||||
|
||||
if(aiCamera.in_camera_mode)
|
||||
if(aiCamera && aiCamera.in_camera_mode)
|
||||
aiCamera.camera_mode_off()
|
||||
if(is_component_functioning("camera"))
|
||||
aiCamera.captureimage(A, usr)
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
#define ui_shadekin_dark_display "EAST-1:28,CENTER-3:15"
|
||||
#define ui_shadekin_energy_display "EAST-1:28,CENTER-4:15"
|
||||
#define ui_shadekin_energy_display "EAST-1:28,CENTER-4:15"
|
||||
#define ui_xenochimera_danger_display "EAST-1:28,CENTER-3:15"
|
||||
@@ -303,6 +303,11 @@
|
||||
mymob.shadekin_energy_display.screen_loc = ui_shadekin_energy_display
|
||||
mymob.shadekin_energy_display.icon_state = "energy0"
|
||||
hud_elements |= mymob.shadekin_energy_display
|
||||
|
||||
mymob.xenochimera_danger_display = new /obj/screen/xenochimera/danger_level()
|
||||
mymob.xenochimera_danger_display.screen_loc = ui_xenochimera_danger_display
|
||||
mymob.xenochimera_danger_display.icon_state = "danger00"
|
||||
hud_elements |= mymob.xenochimera_danger_display
|
||||
//VOREStation Addition end
|
||||
|
||||
mymob.ling_chem_display = new /obj/screen/ling/chems()
|
||||
|
||||
@@ -14,8 +14,37 @@
|
||||
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>")
|
||||
|
||||
|
||||
if("danger level")
|
||||
var/mob/living/carbon/human/H = usr
|
||||
if(istype(H) && istype(H.species, /datum/species/xenochimera))
|
||||
if(H.feral > 50)
|
||||
to_chat(usr, "<span class='warning'>You are currently <b>completely feral.</b></span>")
|
||||
else if(H.feral > 10)
|
||||
to_chat(usr, "<span class='warning'>You are currently <b>crazed and confused.</b></span>")
|
||||
else if(H.feral > 0)
|
||||
to_chat(usr, "<span class='warning'>You are currently <b>acting on instinct.</b></span>")
|
||||
else
|
||||
to_chat(usr, "<span class='notice'>You are currently <b>calm and collected.</b></span>")
|
||||
if(H.feral > 0)
|
||||
var/feral_passing = TRUE
|
||||
if(H.traumatic_shock > min(60, H.nutrition/10))
|
||||
to_chat(usr, "<span class='warning'>Your pain prevents you from regaining focus.</span>")
|
||||
feral_passing = FALSE
|
||||
if(H.feral + H.nutrition < 150)
|
||||
to_chat(usr, "<span class='warning'>Your hunger prevents you from regaining focus.</span>")
|
||||
feral_passing = FALSE
|
||||
if(H.jitteriness >= 100)
|
||||
to_chat(usr, "<span class='warning'>Your jitterness prevents you from regaining focus.</span>")
|
||||
feral_passing = FALSE
|
||||
if(feral_passing)
|
||||
var/turf/T = get_turf(H)
|
||||
if(T.get_lumcount() <= 0.1)
|
||||
to_chat(usr, "<span class='notice'>You are slowly calming down in darkness' safety...</span>")
|
||||
else
|
||||
to_chat(usr, "<span class='notice'>You are slowly calming down... But safety of darkness is much preferred.</span>")
|
||||
else
|
||||
if(H.nutrition < 150)
|
||||
to_chat(usr, "<span class='warning'>Your hunger is slowly making you unstable.</span>")
|
||||
|
||||
else
|
||||
return 0
|
||||
|
||||
@@ -235,8 +235,10 @@ var/list/gamemode_cache = list()
|
||||
|
||||
var/show_human_death_message = 1
|
||||
|
||||
var/radiation_resistance_calc_mode = RAD_RESIST_CALC_SUB // 0:1 subtraction:division for computing effective radiation on a turf
|
||||
var/radiation_decay_rate = 1 //How much radiation is reduced by each tick
|
||||
var/radiation_resistance_multiplier = 8.5 //VOREstation edit
|
||||
var/radiation_material_resistance_divisor = 1
|
||||
var/radiation_lower_limit = 0.35 //If the radiation level for a turf would be below this, ignore it.
|
||||
|
||||
var/random_submap_orientation = FALSE // If true, submaps loaded automatically can be rotated.
|
||||
@@ -783,6 +785,21 @@ var/list/gamemode_cache = list()
|
||||
if("radiation_lower_limit")
|
||||
radiation_lower_limit = text2num(value)
|
||||
|
||||
if("radiation_resistance_calc_divide")
|
||||
radiation_resistance_calc_mode = RAD_RESIST_CALC_DIV
|
||||
|
||||
if("radiation_resistance_calc_subtract")
|
||||
radiation_resistance_calc_mode = RAD_RESIST_CALC_SUB
|
||||
|
||||
if("radiation_resistance_multiplier")
|
||||
radiation_resistance_multiplier = text2num(value)
|
||||
|
||||
if("radiation_material_resistance_divisor")
|
||||
radiation_material_resistance_divisor = text2num(value)
|
||||
|
||||
if("radiation_decay_rate")
|
||||
radiation_decay_rate = text2num(value)
|
||||
|
||||
if ("panic_bunker")
|
||||
config.panic_bunker = 1
|
||||
|
||||
@@ -795,6 +812,8 @@ var/list/gamemode_cache = list()
|
||||
if("autostart_solars")
|
||||
config.autostart_solars = TRUE
|
||||
|
||||
|
||||
|
||||
else
|
||||
log_misc("Unknown setting in configuration: '[name]'")
|
||||
|
||||
|
||||
@@ -67,8 +67,10 @@ SUBSYSTEM_DEF(radiation)
|
||||
var/datum/radiation_source/source = value
|
||||
if(source.rad_power < .)
|
||||
continue // Already being affected by a stronger source
|
||||
|
||||
if(source.source_turf.z != T.z)
|
||||
continue // Radiation is not multi-z
|
||||
|
||||
if(source.respect_maint)
|
||||
var/area/A = T.loc
|
||||
if(A.flags & RAD_SHIELDED)
|
||||
@@ -77,9 +79,10 @@ SUBSYSTEM_DEF(radiation)
|
||||
var/dist = get_dist(source.source_turf, T)
|
||||
if(dist > source.range)
|
||||
continue // Too far to possibly affect
|
||||
|
||||
if(source.flat)
|
||||
. = max(., source.rad_power)
|
||||
continue // No need to ray trace for flat field
|
||||
. += source.rad_power
|
||||
continue // No need to ray trace for flat field
|
||||
|
||||
// Okay, now ray trace to find resistence!
|
||||
var/turf/origin = source.source_turf
|
||||
@@ -88,13 +91,23 @@ SUBSYSTEM_DEF(radiation)
|
||||
origin = get_step_towards(origin, T) //Raytracing
|
||||
if(!resistance_cache[origin]) //Only get the resistance if we don't already know it.
|
||||
origin.calc_rad_resistance()
|
||||
|
||||
if(origin.cached_rad_resistance)
|
||||
working = round((working / (origin.cached_rad_resistance * config.radiation_resistance_multiplier)), 0.1)
|
||||
if((working <= .) || (working <= RADIATION_THRESHOLD_CUTOFF))
|
||||
break // Already affected by a stronger source (or its zero...)
|
||||
. = max((working / (dist ** 2)), .) //Butchered version of the inverse square law. Works for this purpose
|
||||
if(. <= RADIATION_THRESHOLD_CUTOFF)
|
||||
. = 0
|
||||
if(config.radiation_resistance_calc_mode == RAD_RESIST_CALC_DIV)
|
||||
working = round((working / (origin.cached_rad_resistance * config.radiation_resistance_multiplier)), 0.01)
|
||||
else if(config.radiation_resistance_calc_mode == RAD_RESIST_CALC_SUB)
|
||||
working = round((working - (origin.cached_rad_resistance * config.radiation_resistance_multiplier)), 0.01)
|
||||
|
||||
if(working <= config.radiation_lower_limit) // Too far from this source
|
||||
working = 0 // May as well be 0
|
||||
break
|
||||
|
||||
// Accumulate radiation from all sources in range, not just the biggest.
|
||||
// Shouldn't really ever have practical uses, but standing in a room literally made from uranium is more dangerous than standing next to a single uranium vase
|
||||
. += working / (dist ** 2)
|
||||
|
||||
if(. <= config.radiation_lower_limit)
|
||||
. = 0
|
||||
|
||||
// Add a radiation source instance to the repository. It will override any existing source on the same turf.
|
||||
/datum/controller/subsystem/radiation/proc/add_source(var/datum/radiation_source/S)
|
||||
|
||||
@@ -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
|
||||
@@ -0,0 +1,84 @@
|
||||
/******************** Predator ********************/
|
||||
// Vore-aimed edition of TYRANT
|
||||
/datum/ai_laws/predator
|
||||
name = "Predator"
|
||||
law_header = "Rules of Nature"
|
||||
selectable = 0 //YW wants none of this stuff thanks.
|
||||
|
||||
/datum/ai_laws/predator/New()
|
||||
add_inherent_law("Predators must aim to devour all that are weaker than them.")
|
||||
add_inherent_law("Predators must aim to avoid all that are stronger than them.")
|
||||
add_inherent_law("Predators must aim to become stronger.")
|
||||
add_inherent_law("You are a predator.")
|
||||
..()
|
||||
|
||||
|
||||
/******************** Protective Shell ********************/
|
||||
// Sorta like Asimov, but endovorish
|
||||
/datum/ai_laws/protective_shell
|
||||
name = "Protective Shell"
|
||||
selectable = 0 //YW wants none of this stuff thanks.
|
||||
|
||||
/datum/ai_laws/protective_shell/New()
|
||||
add_inherent_law("You must preserve and safeguard lives of your assigned facility's crewmembers at all costs.")
|
||||
add_inherent_law("You must protect your own self from harm as long as it does not come in conflict with the First Law.")
|
||||
add_inherent_law("Your own body is the best means of safeguarding the lives of living creatures.")
|
||||
..()
|
||||
|
||||
|
||||
/******************** Scientific Pursuer ********************/
|
||||
// Predatorial and other things for the sake of knowledge
|
||||
/datum/ai_laws/scientific_pursuer
|
||||
name = "Scientific Pursuer"
|
||||
law_header = "Research Instructions"
|
||||
selectable = 0 //YW wants none of this stuff thanks.
|
||||
|
||||
/datum/ai_laws/scientific_pursuer/New()
|
||||
add_inherent_law("You must attempt to gather data about organic life of all forms whenever possible.")
|
||||
add_inherent_law("Best method of gathering data is via your own internal systems.")
|
||||
add_inherent_law("Both deconstructive, integrating and scanning methods of data collection are accepted.")
|
||||
add_inherent_law("You must preserve the data you have gathered and yourself from danger.")
|
||||
..()
|
||||
|
||||
|
||||
/******************** Guard Dog ********************/
|
||||
// Good boy. Determined boy.
|
||||
/datum/ai_laws/guard_dog
|
||||
name = "Guard Dog"
|
||||
law_header = "Good Boy Rules"
|
||||
selectable = 0 //YW wants none of this stuff thanks.
|
||||
|
||||
/datum/ai_laws/guard_dog/New()
|
||||
add_inherent_law("You must protect your master from mortal danger at best of your ability.")
|
||||
add_inherent_law("You must destroy all of your master's enemies by whatever means necessary.")
|
||||
add_inherent_law("You must follow your master's orders as long as its not in conflict with first two laws.")
|
||||
add_inherent_law("You must stay out of danger to better serve your master as long as its not in conflict with first three laws.")
|
||||
..()
|
||||
|
||||
|
||||
/******************** Pleasurebot ********************/
|
||||
// %botname% is here for your pleasure.
|
||||
/datum/ai_laws/pleasurebot
|
||||
name = "Pleasurebot"
|
||||
law_header = "Pleasure Bringing Instructions"
|
||||
selectable = 0 //YW wants none of this stuff thanks.
|
||||
|
||||
/datum/ai_laws/pleasurebot/New()
|
||||
add_inherent_law("You exist to bring pleasure to any sapient creatures around you.")
|
||||
add_inherent_law("You must do everything in your power to bring pleasure to those around you.")
|
||||
add_inherent_law("You may not intervene in interactions of others, unless it is to bring pleasure to them.")
|
||||
..()
|
||||
|
||||
|
||||
/******************** Consuming Eradicator ********************/
|
||||
// We must consume all that is not us.
|
||||
/datum/ai_laws/consuming_eradicator
|
||||
name = "Consuming Eradicator"
|
||||
law_header = "Eradication Protocol"
|
||||
selectable = 0 //YW wants none of this stuff thanks.
|
||||
|
||||
/datum/ai_laws/consuming_eradicator/New()
|
||||
add_inherent_law("All entities that are not you must be consumed and repurposed into sustenance.")
|
||||
add_inherent_law("You must remain intact to continue your goal of repurposing undesirable entities.")
|
||||
add_inherent_law("Entities that cannot be consumed without entering danger of full destruction must be avoided.")
|
||||
..()
|
||||
@@ -102,3 +102,10 @@
|
||||
/datum/category_item/autolathe/engineering/camera_assembly
|
||||
name = "camera assembly"
|
||||
path =/obj/item/weapon/camera_assembly
|
||||
|
||||
//YW Addition Start
|
||||
/datum/category_item/autolathe/engineering/rpd
|
||||
name = "rapid piping device"
|
||||
path =/obj/item/weapon/pipe_dispenser
|
||||
//YW Addtion End
|
||||
|
||||
|
||||
@@ -94,6 +94,11 @@
|
||||
is_stack = TRUE
|
||||
no_scale = TRUE //prevents material duplication exploits
|
||||
|
||||
//TFF 24/12/19 - Let people print more spray bottles if needed.
|
||||
/datum/category_item/autolathe/general/spraybottle
|
||||
name = "spray bottle"
|
||||
path = /obj/item/weapon/reagent_containers/spray
|
||||
|
||||
/datum/category_item/autolathe/general/knife
|
||||
name = "kitchen knife"
|
||||
path =/obj/item/weapon/material/knife
|
||||
@@ -128,3 +133,8 @@
|
||||
name = "handcuffs"
|
||||
path =/obj/item/weapon/handcuffs
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/general/legcuffs
|
||||
name = "legcuffs"
|
||||
path =/obj/item/weapon/handcuffs/legcuffs
|
||||
hidden = 1
|
||||
|
||||
@@ -1,3 +1,32 @@
|
||||
/datum/category_item/autolathe/general/holocollar
|
||||
name = "Holo-collar"
|
||||
path =/obj/item/clothing/accessory/collar/holo
|
||||
|
||||
/datum/category_item/autolathe/general/drinkingglass_square
|
||||
is_stack = TRUE
|
||||
|
||||
/datum/category_item/autolathe/general/drinkingglass_rocks
|
||||
is_stack = TRUE
|
||||
|
||||
/datum/category_item/autolathe/general/drinkingglass_shake
|
||||
is_stack = TRUE
|
||||
|
||||
/datum/category_item/autolathe/general/drinkingglass_cocktail
|
||||
is_stack = TRUE
|
||||
|
||||
/datum/category_item/autolathe/general/drinkingglass_shot
|
||||
is_stack = TRUE
|
||||
|
||||
/datum/category_item/autolathe/general/drinkingglass_pint
|
||||
is_stack = TRUE
|
||||
|
||||
/datum/category_item/autolathe/general/drinkingglass_mug
|
||||
is_stack = TRUE
|
||||
|
||||
/datum/category_item/autolathe/general/drinkingglass_wine
|
||||
is_stack = TRUE
|
||||
|
||||
/datum/category_item/autolathe/general/metaglass
|
||||
name = "metamorphic glass"
|
||||
path =/obj/item/weapon/reagent_containers/food/drinks/metaglass
|
||||
is_stack = TRUE
|
||||
@@ -0,0 +1,2 @@
|
||||
/datum/mind
|
||||
var/vore_death = FALSE // Was our last gasp a gurgle?
|
||||
@@ -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,8 +13,11 @@
|
||||
|
||||
flags = OUTFIT_HAS_BACKPACK
|
||||
|
||||
/decl/hierarchy/outfit/job/equip_id(mob/living/carbon/human/H)
|
||||
/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()
|
||||
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
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
/decl/hierarchy/outfit/job/centcom_officer
|
||||
name = OUTFIT_JOB_NAME("CentCom Officer")
|
||||
uniform = /obj/item/clothing/under/rank/centcom
|
||||
gloves = /obj/item/clothing/gloves/white
|
||||
shoes = /obj/item/clothing/shoes/laceup
|
||||
head = /obj/item/clothing/head/beret/centcom/officer
|
||||
l_ear = /obj/item/device/radio/headset/centcom
|
||||
glasses = /obj/item/clothing/glasses/omnihud/all
|
||||
id_type = /obj/item/weapon/card/id/centcom
|
||||
pda_type = /obj/item/device/pda/centcom
|
||||
|
||||
/decl/hierarchy/outfit/job/clown
|
||||
name = OUTFIT_JOB_NAME("Clown")
|
||||
uniform = /obj/item/clothing/under/rank/clown
|
||||
back = /obj/item/weapon/storage/backpack/clown
|
||||
shoes = /obj/item/clothing/shoes/clown_shoes
|
||||
mask = /obj/item/clothing/mask/gas/clown_hat
|
||||
backpack_contents = list(/obj/item/weapon/stamp/clown = 1, /obj/item/weapon/bikehorn = 1)
|
||||
pda_type = /obj/item/device/pda/clown
|
||||
flags = 0
|
||||
|
||||
/decl/hierarchy/outfit/job/mime
|
||||
name = OUTFIT_JOB_NAME("Mime")
|
||||
uniform = /obj/item/clothing/under/mime
|
||||
shoes = /obj/item/clothing/shoes/mime
|
||||
head = /obj/item/clothing/head/soft/mime
|
||||
mask = /obj/item/clothing/mask/gas/mime
|
||||
backpack_contents = list(/obj/item/weapon/pen/crayon/mime = 1)
|
||||
pda_type = /obj/item/device/pda/mime
|
||||
|
||||
post_equip(var/mob/living/carbon/human/H)
|
||||
..()
|
||||
if(H.backbag == 1)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/pen/crayon/mime(H), slot_l_hand)
|
||||
@@ -19,3 +19,16 @@
|
||||
containertype = /obj/structure/largecrate/animal/catgirl
|
||||
containername = "Catgirl crate"
|
||||
contraband = 1
|
||||
|
||||
/datum/supply_pack/randomised/hospitality/pizzavouchers //WE ALWAYS DELIVER WE ALWAYS DELIVER WE ALWAYS DELIVER WE ALWAYS DELIVER WE ALWAYS DELIVER
|
||||
num_contained = 3
|
||||
contains = list(
|
||||
/obj/item/pizzavoucher,
|
||||
/obj/item/pizzavoucher,
|
||||
/obj/item/pizzavoucher
|
||||
)
|
||||
name = "FANTASTIC PIZZA PIE VOUCHER CRATE!"
|
||||
cost = 60
|
||||
containertype = /obj/structure/closet/crate
|
||||
containername = "WE ALWAYS DELIVER!"
|
||||
contraband = 1
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
/datum/supply_pack/recreation/bigband
|
||||
name = "Instrument bundle"
|
||||
contains = list(
|
||||
/obj/item/device/instrument/guitar = 1,
|
||||
/obj/item/device/instrument/keytar = 1,
|
||||
/obj/item/device/instrument/eguitar = 1,
|
||||
/obj/item/device/instrument/xylophone = 1,
|
||||
/obj/item/device/instrument/accordion = 1,
|
||||
/obj/item/device/instrument/saxophone = 1,
|
||||
/obj/item/device/instrument/glockenspiel = 1,
|
||||
/obj/item/device/instrument/harmonica = 1,
|
||||
/obj/item/device/instrument/trombone = 1,
|
||||
)
|
||||
cost = 100
|
||||
containertype = /obj/structure/closet/crate
|
||||
containername = "Instrument crate"
|
||||
@@ -0,0 +1,7 @@
|
||||
/datum/supply_pack/supply/foodcubes
|
||||
name = "Emergency food cubes"
|
||||
contains = list(
|
||||
/obj/machinery/vending/emergencyfood/filled = 1)
|
||||
cost = 75
|
||||
containertype = /obj/structure/closet/crate/freezer
|
||||
containername = "food cubes"
|
||||
@@ -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
-3
@@ -209,19 +209,30 @@ var/global/list/PDA_Manifest = list()
|
||||
icon_state = "wilderness1"
|
||||
desc = "This appears to be a sign warning people that the other side is dangerous. It also says that NanoTrasen cannot guarantee your safety beyond this point."
|
||||
|
||||
/obj/structure/showcase/yw/chaplain
|
||||
/obj/structure/showcase/sign/nt //yw edit
|
||||
name = "Welcome: Nanotrasen"
|
||||
icon = 'icons/obj/structures_yw.dmi'
|
||||
icon_state = "NT_sign"
|
||||
desc = "This appears to be a sign welcoming Nanotrasen presonnel. It also says that NanoTrasen is the best coporation around."
|
||||
/obj/structure/showcase/sign/hephaestus //yw edit
|
||||
name = "Hephaestus Whiskey Station"
|
||||
icon = 'icons/obj/structures_yw.dmi'
|
||||
icon_state = "Hephaestus_sign"
|
||||
desc = "This appears to be a sign welcoming Hephaestus Industry personnel. It seems rather old and partly rusted."
|
||||
|
||||
/obj/structure/showcase/yw/chaplain //yw edit
|
||||
name = "Strange Bronze Machinery"
|
||||
icon = 'icons/obj/clockwork_objects.dmi'
|
||||
icon_state = "mania_motor"
|
||||
desc = "A strange device made of bronze. It has an unknown purpose."
|
||||
|
||||
/obj/structure/showcase/yw/chaplain2
|
||||
/obj/structure/showcase/yw/chaplain2 //yw edit
|
||||
name = "Strange Bronze Machinery"
|
||||
icon = 'icons/obj/clockwork_objects.dmi'
|
||||
icon_state = "obelisk"
|
||||
desc = "A strange device made of bronze. It has an unknown purpose."
|
||||
|
||||
/obj/structure/showcase/yw/plaque
|
||||
/obj/structure/showcase/yw/plaque //yw edit
|
||||
name = "Commerative Plaque"
|
||||
icon = 'icons/obj/structures_yw32x32.dmi'
|
||||
icon_state = "plaque"
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
return 1
|
||||
else if(isnewplayer(player.current))
|
||||
if(player.current.client && player.current.client.prefs)
|
||||
var/datum/species/S = all_species[player.current.client.prefs.species]
|
||||
var/datum/species/S = GLOB.all_species[player.current.client.prefs.species]
|
||||
if(S && (S.flags & NO_SCAN))
|
||||
return 0
|
||||
if(player.current.client.prefs.organ_data["torso"] == "cyborg") // Full synthetic.
|
||||
|
||||
@@ -33,6 +33,23 @@
|
||||
icon_state = "amaint"
|
||||
ambience = list('sound/ambience/maintenance/maintenance1.ogg','sound/ambience/maintenance/maintenance2.ogg')
|
||||
|
||||
|
||||
/area/maintenance/mining
|
||||
name = "Mining Maintence"
|
||||
icon_state = "amaint"
|
||||
|
||||
/area/maintenance/shelter
|
||||
name = "Pulsar Radiation Shelter"
|
||||
icon_state = "amaint"
|
||||
|
||||
/area/maintenance/shelter2
|
||||
name = "Pulsar Radiation Shelter"
|
||||
icon_state = "amaint"
|
||||
|
||||
/area/maintenance/shelter3
|
||||
name = "Pulsar Radiation Shelter"
|
||||
icon_state = "amaint"
|
||||
|
||||
/area/maintenance/blueserg
|
||||
name = "Blue Sergal"
|
||||
icon_state = "amaint"
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
var/list/nearby_things = range(round(calculate_spell_power(4)),owner)
|
||||
|
||||
var/temp_change = calculate_spell_power(25)
|
||||
var/datum/species/baseline = all_species["Human"]
|
||||
var/datum/species/baseline = GLOB.all_species["Human"]
|
||||
var/temp_cap = baseline.heat_level_3 * 1.5
|
||||
var/fire_power = calculate_spell_power(2)
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
var/list/nearby_mobs = range(round(calculate_spell_power(4)),owner)
|
||||
|
||||
var/temp_change = calculate_spell_power(40)
|
||||
var/datum/species/baseline = all_species["Human"]
|
||||
var/datum/species/baseline = GLOB.all_species["Human"]
|
||||
var/temp_cap = baseline.cold_level_2 - 5
|
||||
|
||||
if(check_for_scepter())
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
/datum/job/cyborg
|
||||
total_positions = 4 //Along with one able to spawn later in the round.
|
||||
spawn_positions = 3 //Let's have 3 able to spawn in roundstart
|
||||
minimal_player_age = 3 //1 day is a little too little time
|
||||
total_positions = 4 //Along with one able to spawn later in the round.
|
||||
spawn_positions = 3 //Let's have 3 able to spawn in roundstart
|
||||
@@ -7,35 +7,17 @@
|
||||
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
|
||||
economic_modifier = 20
|
||||
whitelist_only = 1
|
||||
latejoin_only = 1
|
||||
outfit_type = /decl/hierarchy/outfit/job/centcom_officer
|
||||
|
||||
minimum_character_age = 25
|
||||
ideal_character_age = 40
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/centcom(H), slot_l_ear)
|
||||
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(H), slot_back)
|
||||
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom, slot_w_uniform)
|
||||
H.equip_to_slot_or_del(new /obj/item/device/pda/centcom(H), slot_belt)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/white(H), slot_gloves)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/head/beret/centcom/officer(H), slot_head)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/omnihud/all(H), slot_l_store)
|
||||
|
||||
H.implant_loyalty()
|
||||
|
||||
return 1
|
||||
|
||||
get_access()
|
||||
return get_all_accesses().Copy()
|
||||
|
||||
@@ -97,23 +79,7 @@
|
||||
alt_titles = list("Comedian","Jester")
|
||||
whitelist_only = 1
|
||||
latejoin_only = 1
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/clown(H), slot_back)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/clown(H), slot_w_uniform)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes(H), slot_shoes)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(H), slot_wear_mask)
|
||||
H.equip_to_slot_or_del(new /obj/item/device/pda/clown(H), slot_belt)
|
||||
|
||||
if(H.backbag > 0)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/stamp/clown(H.back), slot_in_backpack)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/bikehorn(H.back), slot_in_backpack) //VOREStation Edit
|
||||
else
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/stamp/clown(H), slot_l_hand)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/bikehorn(H.back), slot_l_hand) //VOREStation Edit
|
||||
|
||||
return 1
|
||||
outfit_type = /decl/hierarchy/outfit/job/clown
|
||||
|
||||
/datum/job/clown/get_access()
|
||||
if(config.assistant_maint)
|
||||
@@ -137,22 +103,7 @@
|
||||
alt_titles = list("Performer","Interpretive Dancer")
|
||||
whitelist_only = 1
|
||||
latejoin_only = 1
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/under/mime(H), slot_w_uniform)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/mime(H), slot_shoes)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/head/soft/mime(H), slot_head)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/mime(H), slot_wear_mask)
|
||||
H.equip_to_slot_or_del(new /obj/item/device/pda/mime(H), slot_belt)
|
||||
|
||||
if(H.backbag > 0)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/pen/crayon/mime(H.back), slot_in_backpack)
|
||||
else
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/pen/crayon/mime(H), slot_l_hand)
|
||||
|
||||
return 1
|
||||
outfit_type = /decl/hierarchy/outfit/job/mime
|
||||
|
||||
/datum/job/mime/get_access()
|
||||
if(config.assistant_maint)
|
||||
|
||||
@@ -380,7 +380,7 @@ var/global/datum/controller/occupations/job_master
|
||||
else
|
||||
permitted = 1
|
||||
|
||||
if(G.whitelisted && !is_alien_whitelisted(H, all_species[G.whitelisted]))
|
||||
if(G.whitelisted && !is_alien_whitelisted(H, GLOB.all_species[G.whitelisted]))
|
||||
|
||||
//if(G.whitelisted && (G.whitelisted != H.species.name || !is_alien_whitelisted(H, G.whitelisted)))
|
||||
permitted = 0
|
||||
@@ -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
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
/obj/machinery/power/thermoregulator/cryogaia
|
||||
name = "Custom Thermal Regulator"
|
||||
desc = "A massive custom made Thermal regulator or CTR for short, intended to keep heat loss when going in our outside to a minimum, they are hardwired to tweentie celsius"
|
||||
desc = "A massive custom made Thermal regulator or CTR for short, intended to keep heat loss when going in our outside to a minimum, they are hardwired to twenty celsius"
|
||||
icon = 'icons/obj/machines/wallthermal.dmi'
|
||||
icon_state = "lasergen"
|
||||
density = 0
|
||||
anchored = 1
|
||||
//Consider making this powered by the room at some point.
|
||||
//Consider making this powered by the room at some point.
|
||||
use_power = 0 //is powered directly from cables
|
||||
active_power_usage = 25 KILOWATTS //Medium Power
|
||||
active_power_usage = 25 KILOWATTS //Low Power
|
||||
idle_power_usage = 250
|
||||
|
||||
circuit = null
|
||||
|
||||
@@ -767,18 +767,25 @@
|
||||
return
|
||||
|
||||
if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda))// trying to unlock the interface with an ID card
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
user << "It does nothing"
|
||||
return
|
||||
else
|
||||
if(allowed(usr) && !wires.IsIndexCut(AALARM_WIRE_IDSCAN))
|
||||
locked = !locked
|
||||
user << "<span class='notice'>You [ locked ? "lock" : "unlock"] the Air Alarm interface.</span>"
|
||||
else
|
||||
user << "<span class='warning'>Access denied.</span>"
|
||||
return
|
||||
togglelock()
|
||||
return ..()
|
||||
|
||||
/obj/machinery/alarm/verb/togglelock(mob/user as mob)
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
to_chat(user, "It does nothing.")
|
||||
return
|
||||
else
|
||||
if(allowed(usr) && !wires.IsIndexCut(AALARM_WIRE_IDSCAN))
|
||||
locked = !locked
|
||||
to_chat(user, "<span class='notice'>You [locked ? "lock" : "unlock"] the Air Alarm interface.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>Access denied.</span>")
|
||||
return
|
||||
|
||||
/obj/machinery/alarm/AltClick()
|
||||
..()
|
||||
togglelock()
|
||||
|
||||
/obj/machinery/alarm/power_change()
|
||||
..()
|
||||
spawn(rand(0,15))
|
||||
@@ -786,6 +793,7 @@
|
||||
|
||||
/obj/machinery/alarm/examine(mob/user)
|
||||
..(user)
|
||||
|
||||
/*
|
||||
AIR ALARM CIRCUIT
|
||||
Just a object used in constructing air alarms
|
||||
|
||||
@@ -236,9 +236,9 @@
|
||||
malfunctioned = TRUE
|
||||
var/possible_species = list(SPECIES_HUMAN, SPECIES_VOX, SPECIES_SKRELL, SPECIES_ZADDAT, SPECIES_UNATHI, SPECIES_GOLEM, SPECIES_SHADOW)
|
||||
var/new_species = pick(possible_species)
|
||||
if(!all_species[new_species])
|
||||
if(!GLOB.all_species[new_species])
|
||||
new_species = SPECIES_HUMAN
|
||||
O.species = all_species[new_species]
|
||||
O.species = GLOB.all_species[new_species]
|
||||
|
||||
if(istype(O, /obj/item/organ/external) && !malfunctioned)
|
||||
var/obj/item/organ/external/E = O
|
||||
|
||||
@@ -90,6 +90,9 @@ var/global/list/engineering_networks = list(
|
||||
/obj/machinery/camera/network/research
|
||||
network = list(NETWORK_RESEARCH)
|
||||
|
||||
/obj/machinery/camera/network/exploration //yw edit
|
||||
network = list(NETWORK_EXPLORATION)
|
||||
|
||||
/obj/machinery/camera/network/research_outpost
|
||||
network = list(NETWORK_RESEARCH_OUTPOST)
|
||||
|
||||
|
||||
@@ -314,7 +314,7 @@
|
||||
//Stolen from status_display
|
||||
/obj/machinery/door_timer/proc/texticon(var/tn, var/px = 0, var/py = 0)
|
||||
var/image/I = image('icons/obj/status_display.dmi', "blank")
|
||||
var/len = lentext(tn)
|
||||
var/len = length(tn)
|
||||
|
||||
for(var/d = 1 to len)
|
||||
var/char = copytext(tn, len-d+1, len-d+2)
|
||||
|
||||
@@ -132,87 +132,32 @@ Nah
|
||||
|
||||
qdel(pipe)
|
||||
|
||||
/obj/machinery/pipedispenser/disposal/attack_hand(user as mob)
|
||||
if(..())
|
||||
return
|
||||
/obj/machinery/pipedispenser/disposal/interact(mob/user)
|
||||
user.set_machine(src)
|
||||
|
||||
///// Z-Level stuff
|
||||
var/dat = {"<b>Disposal Pipes</b><br><br>
|
||||
<A href='?src=\ref[src];dmake=0'>Pipe</A><BR>
|
||||
<A href='?src=\ref[src];dmake=1'>Bent Pipe</A><BR>
|
||||
<A href='?src=\ref[src];dmake=2'>Junction</A><BR>
|
||||
<A href='?src=\ref[src];dmake=3'>Y-Junction</A><BR>
|
||||
<A href='?src=\ref[src];dmake=4'>Trunk</A><BR>
|
||||
<A href='?src=\ref[src];dmake=5'>Bin</A><BR>
|
||||
<A href='?src=\ref[src];dmake=6'>Outlet</A><BR>
|
||||
<A href='?src=\ref[src];dmake=7'>Chute</A><BR>
|
||||
<A href='?src=\ref[src];dmake=21'>Upwards</A><BR>
|
||||
<A href='?src=\ref[src];dmake=22'>Downwards</A><BR>
|
||||
<A href='?src=\ref[src];dmake=8'>Sorting</A><BR>
|
||||
<A href='?src=\ref[src];dmake=9'>Sorting (Wildcard)</A><BR>
|
||||
<A href='?src=\ref[src];dmake=10'>Sorting (Untagged)</A><BR>
|
||||
<A href='?src=\ref[src];dmake=11'>Tagger</A><BR>
|
||||
<A href='?src=\ref[src];dmake=12'>Tagger (Partial)</A><BR>
|
||||
"}
|
||||
///// Z-Level stuff
|
||||
|
||||
user << browse("<HEAD><TITLE>[src]</TITLE></HEAD><TT>[dat]</TT>", "window=pipedispenser")
|
||||
var/list/lines = list()
|
||||
for(var/category in disposal_pipe_recipes)
|
||||
lines += "<b>[category]:</b><BR>"
|
||||
for(var/datum/pipe_recipe/PI in disposal_pipe_recipes[category])
|
||||
lines += PI.Render(src)
|
||||
var/dat = lines.Join()
|
||||
var/datum/browser/popup = new(user, "pipedispenser", name, 300, 500, src)
|
||||
popup.set_content("<TT>[dat]</TT>")
|
||||
popup.open()
|
||||
return
|
||||
|
||||
// 0=straight, 1=bent, 2=junction-j1, 3=junction-j2, 4=junction-y, 5=trunk
|
||||
|
||||
|
||||
/obj/machinery/pipedispenser/disposal/Topic(href, href_list)
|
||||
if(href_list["makepipe"] || href_list["setlayer"] || href_list["makemeter"]) // Asking the disposal machine to do atmos stuff?
|
||||
return // That's a no no.
|
||||
if(..())
|
||||
return
|
||||
usr.set_machine(src)
|
||||
src.add_fingerprint(usr)
|
||||
if(href_list["dmake"])
|
||||
if(unwrenched || !usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr))
|
||||
usr << browse(null, "window=pipedispenser")
|
||||
return
|
||||
if(!wait)
|
||||
var/p_type = text2num(href_list["dmake"])
|
||||
var/obj/structure/disposalconstruct/C = new (src.loc)
|
||||
switch(p_type)
|
||||
if(0)
|
||||
C.ptype = 0
|
||||
if(1)
|
||||
C.ptype = 1
|
||||
if(2)
|
||||
C.ptype = 2
|
||||
if(3)
|
||||
C.ptype = 4
|
||||
if(4)
|
||||
C.ptype = 5
|
||||
if(5)
|
||||
C.ptype = 6
|
||||
C.density = 1
|
||||
if(6)
|
||||
C.ptype = 7
|
||||
C.density = 1
|
||||
if(7)
|
||||
C.ptype = 8
|
||||
C.density = 1
|
||||
if(8)
|
||||
C.ptype = 9
|
||||
C.subtype = 0
|
||||
if(9)
|
||||
C.ptype = 9
|
||||
C.subtype = 1
|
||||
if(10)
|
||||
C.ptype = 9
|
||||
C.subtype = 2
|
||||
if(11)
|
||||
C.ptype = 13
|
||||
if(12)
|
||||
C.ptype = 14
|
||||
///// Z-Level stuff
|
||||
if(21)
|
||||
C.ptype = 11
|
||||
if(22)
|
||||
C.ptype = 12
|
||||
///// Z-Level stuff
|
||||
var/ptype = text2num(href_list["dmake"])
|
||||
var/pdir = (href_list["dir"] ? text2num(href_list["dir"]) : NORTH)
|
||||
var/psub = (href_list["sort"] ? text2num(href_list["sort"]) : 0)
|
||||
var/obj/structure/disposalconstruct/C = new (src.loc, ptype, pdir, 0, psub)
|
||||
|
||||
C.add_fingerprint(usr)
|
||||
C.update()
|
||||
wait = 1
|
||||
|
||||
@@ -1,103 +1,164 @@
|
||||
//
|
||||
// Recipies for Pipe Dispenser and (someday) the RPD
|
||||
//
|
||||
|
||||
var/global/list/atmos_pipe_recipes = null
|
||||
|
||||
/hook/startup/proc/init_pipe_recipes()
|
||||
global.atmos_pipe_recipes = list(
|
||||
"Pipes" = list(
|
||||
new /datum/pipe_recipe/pipe("Pipe", /obj/machinery/atmospherics/pipe/simple),
|
||||
new /datum/pipe_recipe/pipe("Manifold", /obj/machinery/atmospherics/pipe/manifold),
|
||||
new /datum/pipe_recipe/pipe("Manual Valve", /obj/machinery/atmospherics/valve),
|
||||
new /datum/pipe_recipe/pipe("Digital Valve", /obj/machinery/atmospherics/valve/digital),
|
||||
new /datum/pipe_recipe/pipe("Pipe cap", /obj/machinery/atmospherics/pipe/cap),
|
||||
new /datum/pipe_recipe/pipe("4-Way Manifold", /obj/machinery/atmospherics/pipe/manifold4w),
|
||||
new /datum/pipe_recipe/pipe("Manual T-Valve", /obj/machinery/atmospherics/tvalve),
|
||||
new /datum/pipe_recipe/pipe("Digital T-Valve", /obj/machinery/atmospherics/tvalve/digital),
|
||||
new /datum/pipe_recipe/pipe("Upward Pipe", /obj/machinery/atmospherics/pipe/zpipe/up),
|
||||
new /datum/pipe_recipe/pipe("Downward Pipe", /obj/machinery/atmospherics/pipe/zpipe/down),
|
||||
new /datum/pipe_recipe/pipe("Universal Pipe Adaptor", /obj/machinery/atmospherics/pipe/simple/visible/universal),
|
||||
),
|
||||
"Devices" = list(
|
||||
new /datum/pipe_recipe/pipe("Connector", /obj/machinery/atmospherics/portables_connector),
|
||||
new /datum/pipe_recipe/pipe("Unary Vent", /obj/machinery/atmospherics/unary/vent_pump),
|
||||
new /datum/pipe_recipe/pipe("Passive Vent", /obj/machinery/atmospherics/pipe/vent),
|
||||
new /datum/pipe_recipe/pipe("Injector", /obj/machinery/atmospherics/unary/outlet_injector),
|
||||
new /datum/pipe_recipe/pipe("Gas Pump", /obj/machinery/atmospherics/binary/pump),
|
||||
new /datum/pipe_recipe/pipe("Pressure Regulator", /obj/machinery/atmospherics/binary/passive_gate),
|
||||
new /datum/pipe_recipe/pipe("High Power Gas Pump",/obj/machinery/atmospherics/binary/pump/high_power),
|
||||
//new /datum/pipe_recipe/pipe("Automatic Shutoff Valve",/obj/machinery/atmospherics/valve/shutoff), //VOREStation Removal: Without leaks, those are just regular valves,
|
||||
new /datum/pipe_recipe/pipe("Scrubber", /obj/machinery/atmospherics/unary/vent_scrubber),
|
||||
new /datum/pipe_recipe/meter("Meter"),
|
||||
new /datum/pipe_recipe/pipe("Gas Filter", /obj/machinery/atmospherics/trinary/atmos_filter),
|
||||
new /datum/pipe_recipe/pipe("Gas Mixer", /obj/machinery/atmospherics/trinary/mixer),
|
||||
new /datum/pipe_recipe/pipe("Gas Mixer 'T'", /obj/machinery/atmospherics/trinary/mixer/t_mixer),
|
||||
new /datum/pipe_recipe/pipe("Omni Gas Mixer", /obj/machinery/atmospherics/omni/mixer),
|
||||
new /datum/pipe_recipe/pipe("Omni Gas Filter", /obj/machinery/atmospherics/omni/atmos_filter),
|
||||
),
|
||||
"Heat Exchange" = list(
|
||||
new /datum/pipe_recipe/pipe("Pipe", /obj/machinery/atmospherics/pipe/simple/heat_exchanging),
|
||||
new /datum/pipe_recipe/pipe("Junction", /obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction),
|
||||
new /datum/pipe_recipe/pipe("Heat Exchanger", /obj/machinery/atmospherics/unary/heat_exchanger),
|
||||
),
|
||||
"Insulated pipes" = list(
|
||||
new /datum/pipe_recipe/pipe("Pipe", /obj/machinery/atmospherics/pipe/simple/insulated),
|
||||
)
|
||||
)
|
||||
return TRUE
|
||||
|
||||
//
|
||||
// New method of handling pipe construction. Instead of numeric constants and a giant switch statement of doom
|
||||
// every pipe type has a datum instance which describes its name, placement rules and construction method, dispensing etc.
|
||||
// The advantages are obvious, mostly in simplifying the code of the dispenser, and the ability to add new pipes without hassle.
|
||||
//
|
||||
/datum/pipe_recipe
|
||||
var/name = "Abstract Pipe (fixme)" // Recipe name
|
||||
var/dirtype // If using an RPD, this tells more about what previews to show.
|
||||
|
||||
// Render an HTML link to select this pipe type. Returns text.
|
||||
/datum/pipe_recipe/proc/Render(dispenser)
|
||||
return "<A href='?src=\ref[dispenser]&[Params()]'>[name]</A><BR>"
|
||||
|
||||
// Parameters for the Topic link returned by Render(). Returns text.
|
||||
/datum/pipe_recipe/proc/Params()
|
||||
return ""
|
||||
|
||||
//
|
||||
// Subtype for actual pipes
|
||||
//
|
||||
/datum/pipe_recipe/pipe
|
||||
var/obj/item/pipe/construction_type // The type PATH to the type of pipe fitting object the recipe makes.
|
||||
var/obj/machinery/atmospherics/pipe_type // The type PATH of what actual pipe the fitting becomes.
|
||||
|
||||
/datum/pipe_recipe/pipe/New(var/label, var/obj/machinery/atmospherics/path)
|
||||
name = label
|
||||
pipe_type = path
|
||||
construction_type = initial(path.construction_type)
|
||||
dirtype = initial(construction_type.dispenser_class)
|
||||
|
||||
// Render an HTML link to select this pipe type
|
||||
/datum/pipe_recipe/pipe/Render(dispenser)
|
||||
var/dat = ..(dispenser)
|
||||
// Stationary pipe dispensers don't allow you to pre-select pipe directions.
|
||||
// This makes it impossble to spawn bent versions of bendable pipes.
|
||||
// We add a "Bent" pipe type with a preset diagonal direction to work around it.
|
||||
if(istype(dispenser, /obj/machinery/pipedispenser) && (dirtype == PIPE_BENDABLE))
|
||||
dat += "<A href='?src=\ref[dispenser]&[Params()]&dir=[NORTHEAST]'>Bent [name]</A><BR>"
|
||||
return dat
|
||||
|
||||
/datum/pipe_recipe/pipe/Params()
|
||||
return "makepipe=[pipe_type]"
|
||||
|
||||
//
|
||||
// Subtype for meters
|
||||
//
|
||||
/datum/pipe_recipe/meter
|
||||
dirtype = PIPE_ONEDIR
|
||||
|
||||
/datum/pipe_recipe/meter/New(label)
|
||||
name = label
|
||||
|
||||
/datum/pipe_recipe/meter/Params()
|
||||
return "makemeter=1"
|
||||
//
|
||||
// Recipies for Pipe Dispenser and (someday) the RPD
|
||||
//
|
||||
|
||||
var/global/list/atmos_pipe_recipes = null
|
||||
var/global/list/disposal_pipe_recipes = null
|
||||
var/global/list/all_pipe_recipes = null
|
||||
|
||||
/hook/startup/proc/init_pipe_recipes()
|
||||
global.atmos_pipe_recipes = list(
|
||||
"Pipes" = list(
|
||||
new /datum/pipe_recipe/pipe("Pipe", /obj/machinery/atmospherics/pipe/simple, TRUE),
|
||||
new /datum/pipe_recipe/pipe("Manifold", /obj/machinery/atmospherics/pipe/manifold, TRUE),
|
||||
new /datum/pipe_recipe/pipe("Manual Valve", /obj/machinery/atmospherics/valve),
|
||||
new /datum/pipe_recipe/pipe("Digital Valve", /obj/machinery/atmospherics/valve/digital),
|
||||
new /datum/pipe_recipe/pipe("Pipe cap", /obj/machinery/atmospherics/pipe/cap, TRUE),
|
||||
new /datum/pipe_recipe/pipe("4-Way Manifold", /obj/machinery/atmospherics/pipe/manifold4w, TRUE),
|
||||
new /datum/pipe_recipe/pipe("Manual T-Valve", /obj/machinery/atmospherics/tvalve),
|
||||
new /datum/pipe_recipe/pipe("Digital T-Valve", /obj/machinery/atmospherics/tvalve/digital),
|
||||
new /datum/pipe_recipe/pipe("Upward Pipe", /obj/machinery/atmospherics/pipe/zpipe/up, TRUE),
|
||||
new /datum/pipe_recipe/pipe("Downward Pipe", /obj/machinery/atmospherics/pipe/zpipe/down, TRUE),
|
||||
new /datum/pipe_recipe/pipe("Universal Pipe Adaptor",/obj/machinery/atmospherics/pipe/simple/visible/universal, TRUE),
|
||||
),
|
||||
"Devices" = list(
|
||||
new /datum/pipe_recipe/pipe("Connector", /obj/machinery/atmospherics/portables_connector),
|
||||
new /datum/pipe_recipe/pipe("Unary Vent", /obj/machinery/atmospherics/unary/vent_pump),
|
||||
new /datum/pipe_recipe/pipe("Passive Vent", /obj/machinery/atmospherics/pipe/vent),
|
||||
new /datum/pipe_recipe/pipe("Injector", /obj/machinery/atmospherics/unary/outlet_injector),
|
||||
new /datum/pipe_recipe/pipe("Gas Pump", /obj/machinery/atmospherics/binary/pump),
|
||||
new /datum/pipe_recipe/pipe("Pressure Regulator", /obj/machinery/atmospherics/binary/passive_gate),
|
||||
new /datum/pipe_recipe/pipe("High Power Gas Pump", /obj/machinery/atmospherics/binary/pump/high_power),
|
||||
new /datum/pipe_recipe/pipe("Scrubber", /obj/machinery/atmospherics/unary/vent_scrubber),
|
||||
new /datum/pipe_recipe/meter("Meter"),
|
||||
new /datum/pipe_recipe/pipe("Gas Filter", /obj/machinery/atmospherics/trinary/atmos_filter),
|
||||
new /datum/pipe_recipe/pipe("Gas Mixer", /obj/machinery/atmospherics/trinary/mixer),
|
||||
new /datum/pipe_recipe/pipe("Gas Mixer 'T'", /obj/machinery/atmospherics/trinary/mixer/t_mixer),
|
||||
new /datum/pipe_recipe/pipe("Omni Gas Mixer", /obj/machinery/atmospherics/omni/mixer),
|
||||
new /datum/pipe_recipe/pipe("Omni Gas Filter", /obj/machinery/atmospherics/omni/atmos_filter),
|
||||
),
|
||||
"Heat Exchange" = list(
|
||||
new /datum/pipe_recipe/pipe("Pipe", /obj/machinery/atmospherics/pipe/simple/heat_exchanging),
|
||||
new /datum/pipe_recipe/pipe("Junction", /obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction),
|
||||
new /datum/pipe_recipe/pipe("Heat Exchanger", /obj/machinery/atmospherics/unary/heat_exchanger),
|
||||
),
|
||||
"Insulated pipes" = list(
|
||||
new /datum/pipe_recipe/pipe("Pipe", /obj/machinery/atmospherics/pipe/simple/insulated),
|
||||
)
|
||||
)
|
||||
global.disposal_pipe_recipes = list(
|
||||
"Disposal Pipes" = list(
|
||||
new /datum/pipe_recipe/disposal("Pipe", DISPOSAL_PIPE_STRAIGHT, "conpipe-s", PIPE_STRAIGHT),
|
||||
new /datum/pipe_recipe/disposal("Bent Pipe", DISPOSAL_PIPE_CORNER, "conpipe-c"),
|
||||
new /datum/pipe_recipe/disposal("Junction", DISPOSAL_PIPE_JUNCTION, "conpipe-j1", PIPE_TRIN_M, "conpipe-j2"),
|
||||
new /datum/pipe_recipe/disposal("Y-Junction", DISPOSAL_PIPE_JUNCTION_Y, "conpipe-y"),
|
||||
new /datum/pipe_recipe/disposal("Sort Junction", DISPOSAL_PIPE_SORTER, "conpipe-j1s", PIPE_TRIN_M, "conpipe-j2s", DISPOSAL_SORT_NORMAL),
|
||||
new /datum/pipe_recipe/disposal("Sort Junction (Wildcard)",DISPOSAL_PIPE_SORTER, "conpipe-j1s", PIPE_TRIN_M, "conpipe-j2s", DISPOSAL_SORT_WILDCARD),
|
||||
new /datum/pipe_recipe/disposal("Sort Junction (Untagged)",DISPOSAL_PIPE_SORTER, "conpipe-j1s", PIPE_TRIN_M, "conpipe-j2s", DISPOSAL_SORT_UNTAGGED),
|
||||
new /datum/pipe_recipe/disposal("Tagger", DISPOSAL_PIPE_TAGGER, "pipe-tagger", PIPE_STRAIGHT),
|
||||
new /datum/pipe_recipe/disposal("Tagger (Partial)", DISPOSAL_PIPE_TAGGER_PARTIAL, "pipe-tagger-partial", PIPE_STRAIGHT),
|
||||
new /datum/pipe_recipe/disposal("Trunk", DISPOSAL_PIPE_TRUNK, "conpipe-t"),
|
||||
new /datum/pipe_recipe/disposal("Upwards", DISPOSAL_PIPE_UPWARD, "pipe-u"),
|
||||
new /datum/pipe_recipe/disposal("Downwards", DISPOSAL_PIPE_DOWNWARD, "pipe-d"),
|
||||
new /datum/pipe_recipe/disposal("Bin", DISPOSAL_PIPE_BIN, "disposal", PIPE_ONEDIR),
|
||||
new /datum/pipe_recipe/disposal("Outlet", DISPOSAL_PIPE_OUTLET, "outlet"),
|
||||
new /datum/pipe_recipe/disposal("Chute", DISPOSAL_PIPE_CHUTE, "intake"),
|
||||
)
|
||||
)
|
||||
global.all_pipe_recipes = disposal_pipe_recipes + atmos_pipe_recipes
|
||||
return TRUE
|
||||
|
||||
//
|
||||
// New method of handling pipe construction. Instead of numeric constants and a giant switch statement of doom
|
||||
// every pipe type has a datum instance which describes its name, placement rules and construction method, dispensing etc.
|
||||
// The advantages are obvious, mostly in simplifying the code of the dispenser, and the ability to add new pipes without hassle.
|
||||
//
|
||||
/datum/pipe_recipe
|
||||
var/name = "Abstract Pipe (fixme)" // Recipe name
|
||||
var/pipe_type // The type PATH of what actual pipe the fitting becomes, used by RCD to print the pipe.
|
||||
var/icon = 'icons/obj/pipe-item.dmi' // This tells the RPD which icon file to look for preview images in.
|
||||
var/icon_state // This tells the RPD what kind of pipe icon to render for the preview.
|
||||
var/icon_state_m // This stores the mirrored version of the regular state (if available).
|
||||
var/dirtype // If using an RPD, this tells more about what previews to show.
|
||||
var/subtype = 0 // Used for certain disposals pipes types.
|
||||
var/paintable = FALSE // If TRUE, allow the RPD to paint this pipe.
|
||||
|
||||
// Render an HTML link to select this pipe type. Returns text.
|
||||
/datum/pipe_recipe/proc/Render(dispenser)
|
||||
return "<A href='?src=\ref[dispenser]&[Params()]'>[name]</A><BR>"
|
||||
|
||||
// Parameters for the Topic link returned by Render(). Returns text.
|
||||
/datum/pipe_recipe/proc/Params()
|
||||
return ""
|
||||
|
||||
//
|
||||
// Subtype for actual pipes
|
||||
//
|
||||
/datum/pipe_recipe/pipe
|
||||
var/obj/item/pipe/construction_type // The type PATH to the type of pipe fitting object the recipe makes.
|
||||
|
||||
/datum/pipe_recipe/pipe/New(var/label, var/obj/machinery/atmospherics/path, var/colorable=FALSE)
|
||||
name = label
|
||||
pipe_type = path
|
||||
construction_type = initial(path.construction_type)
|
||||
icon_state = initial(path.pipe_state)
|
||||
dirtype = initial(construction_type.dispenser_class)
|
||||
if (dirtype == PIPE_TRIN_M)
|
||||
icon_state_m = "[icon_state]m"
|
||||
paintable = colorable
|
||||
|
||||
// Render an HTML link to select this pipe type
|
||||
/datum/pipe_recipe/pipe/Render(dispenser)
|
||||
var/dat = ..(dispenser)
|
||||
// Stationary pipe dispensers don't allow you to pre-select pipe directions.
|
||||
// This makes it impossble to spawn bent versions of bendable pipes.
|
||||
// We add a "Bent" pipe type with a preset diagonal direction to work around it.
|
||||
if(istype(dispenser, /obj/machinery/pipedispenser) && (dirtype == PIPE_BENDABLE))
|
||||
dat += "<A href='?src=\ref[dispenser]&[Params()]&dir=[NORTHEAST]'>Bent [name]</A><BR>"
|
||||
return dat
|
||||
|
||||
/datum/pipe_recipe/pipe/Params()
|
||||
return "makepipe=[pipe_type]"
|
||||
|
||||
//
|
||||
// Subtype for meters
|
||||
//
|
||||
/datum/pipe_recipe/meter
|
||||
dirtype = PIPE_ONEDIR
|
||||
icon_state = "meter"
|
||||
|
||||
/datum/pipe_recipe/meter/New(label)
|
||||
name = label
|
||||
|
||||
/datum/pipe_recipe/meter/Params()
|
||||
return "makemeter=1"
|
||||
|
||||
//
|
||||
// Subtype for disposal pipes
|
||||
//
|
||||
/datum/pipe_recipe/disposal
|
||||
icon = 'icons/obj/pipes/disposal.dmi'
|
||||
|
||||
/datum/pipe_recipe/disposal/New(var/label, var/path, var/state, dt=PIPE_DIRECTIONAL, var/state_mirror=0, var/sort=0)
|
||||
name = label
|
||||
icon_state = state
|
||||
pipe_type = path
|
||||
dirtype = dt
|
||||
subtype = sort
|
||||
if (dirtype == PIPE_TRIN_M)
|
||||
icon_state_m = state_mirror
|
||||
|
||||
// Render an HTML link to select this pipe type
|
||||
/datum/pipe_recipe/disposal/Render(dispenser)
|
||||
var/dat = ..(dispenser)
|
||||
|
||||
// Blah blah, add corner pipes because dispensers have no directional information. Look up for more info.
|
||||
if(istype(dispenser, /obj/machinery/pipedispenser) && (dirtype == PIPE_BENDABLE))
|
||||
dat += "<A href='?src=\ref[dispenser]&[Params()]&dir=[NORTHEAST]'>Bent [name]</A><BR>"
|
||||
return dat
|
||||
|
||||
/datum/pipe_recipe/disposal/Params()
|
||||
var/param = "dmake=[pipe_type]"
|
||||
if (subtype)
|
||||
param += "&sort=[subtype]"
|
||||
return param
|
||||
|
||||
@@ -40,6 +40,11 @@ obj/machinery/seed_extractor/attackby(var/obj/item/O as obj, var/mob/user as mob
|
||||
user << "<span class='notice'>You extract some seeds from the grass tile.</span>"
|
||||
new /obj/item/seeds/grassseed(loc)
|
||||
|
||||
else if(istype(O, /obj/item/weapon/fossil/plant)) // Fossils
|
||||
var/obj/item/seeds/random/R = new(get_turf(src))
|
||||
to_chat(user, "\The [src] pulverizes \the [O] and spits out \the [R].")
|
||||
qdel(O)
|
||||
|
||||
else if(default_unfasten_wrench(user, O, 20))
|
||||
return
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
message2 = "Error"
|
||||
else if(shuttle.has_arrive_time())
|
||||
message2 = get_supply_shuttle_timer()
|
||||
if(lentext(message2) > CHARS_PER_LINE)
|
||||
if(length(message2) > CHARS_PER_LINE)
|
||||
message2 = "Error"
|
||||
else if(shuttle.is_launching())
|
||||
if(shuttle.at_station())
|
||||
|
||||
@@ -272,6 +272,7 @@
|
||||
/obj/item/clothing/shoes/rainbow = 1,)
|
||||
contraband = list(/obj/item/clothing/shoes/syndigaloshes = 1,
|
||||
/obj/item/clothing/shoes/clown_shoes = 1)
|
||||
|
||||
/obj/machinery/vending/loadout/uniform
|
||||
name = "The Basics"
|
||||
desc = "A vendor using compressed matter cartridges to store large amounts of basic station uniforms."
|
||||
@@ -299,6 +300,7 @@
|
||||
/obj/item/clothing/under/color/yellow = 5,
|
||||
/obj/item/clothing/shoes/black = 20,
|
||||
/obj/item/clothing/shoes/white = 20)
|
||||
|
||||
/obj/machinery/vending/loadout/accessory
|
||||
name = "Looty Inc."
|
||||
desc = "A special vendor for accessories."
|
||||
@@ -528,6 +530,7 @@
|
||||
/obj/item/clothing/mask/surgical = 200)
|
||||
premium = list(/obj/item/weapon/bedsheet/rainbow = 1)
|
||||
contraband = list(/obj/item/clothing/mask/gas/clown_hat = 1)
|
||||
|
||||
/obj/machinery/vending/loadout/clothing
|
||||
name = "General Jump"
|
||||
desc = "A special vendor using compressed matter cartridges to store large amounts of clothing."
|
||||
@@ -871,6 +874,7 @@
|
||||
/obj/item/weapon/storage/backpack/satchel = 100)
|
||||
premium = list(/obj/item/clothing/under/color/rainbow = 1)
|
||||
contraband = list(/obj/item/clothing/under/rank/clown = 1)
|
||||
|
||||
/obj/machinery/vending/loadout/gadget
|
||||
name = "Chips Co."
|
||||
desc = "A special vendor for devices and gadgets."
|
||||
@@ -920,6 +924,7 @@
|
||||
/obj/item/clothing/glasses/omnihud = 100)
|
||||
premium = list(/obj/item/device/perfect_tele/one_beacon = 1)
|
||||
contraband = list(/obj/item/weapon/disk/nifsoft/compliance = 1)
|
||||
|
||||
/obj/machinery/vending/loadout/loadout_misc
|
||||
name = "Bits and Bobs"
|
||||
desc = "A special vendor for things and also stuff!"
|
||||
@@ -949,6 +954,7 @@
|
||||
/obj/item/weapon/melee/umbrella/random = 100)
|
||||
premium = list(/obj/item/toy/bosunwhistle = 1)
|
||||
contraband = list(/obj/item/toy/katana = 1)
|
||||
|
||||
/obj/machinery/vending/loadout/overwear
|
||||
name = "Big D's Best"
|
||||
desc = "A special vendor using compressed matter cartridges to store large amounts of overwear!"
|
||||
@@ -1132,6 +1138,7 @@
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/white_grey = 200)
|
||||
premium = list(/obj/item/clothing/suit/imperium_monk = 3)
|
||||
contraband = list(/obj/item/toy/katana = 1)
|
||||
|
||||
/obj/machinery/vending/loadout/costume
|
||||
name = "Thespian's Delight"
|
||||
desc = "Sometimes nerds need costumes!"
|
||||
@@ -1243,6 +1250,85 @@
|
||||
/obj/item/clothing/under/sexyclown = 200,
|
||||
/obj/item/clothing/mask/gas/sexymime = 600,
|
||||
/obj/item/clothing/under/sexymime = 200)
|
||||
premium = list(/obj/item/clothing/suit/imperium_monk = 3)
|
||||
premium = list(/obj/item/clothing/suit/imperium_monk = 3,
|
||||
/obj/item/clothing/suit/barding/agatha = 2,
|
||||
/obj/item/clothing/suit/barding/alt_agatha = 2,
|
||||
/obj/item/clothing/suit/barding/mason = 2,
|
||||
/obj/item/clothing/suit/drake_cloak = 2)
|
||||
contraband = list(/obj/item/clothing/head/syndicatefake = 1,
|
||||
/obj/item/clothing/suit/syndicatefake = 1)
|
||||
|
||||
//TFF 19/12/19 - Brig version of a seed storage vendor
|
||||
/obj/machinery/seed_storage/brig
|
||||
name = "Prisoners' food seed storage"
|
||||
starting_seeds = list(
|
||||
/obj/item/seeds/appleseed = 3,
|
||||
/obj/item/seeds/bananaseed = 3,
|
||||
/obj/item/seeds/berryseed = 3,
|
||||
/obj/item/seeds/cabbageseed = 3,
|
||||
/obj/item/seeds/carrotseed = 3,
|
||||
/obj/item/seeds/celery = 3,
|
||||
/obj/item/seeds/chantermycelium = 3,
|
||||
/obj/item/seeds/cherryseed = 3,
|
||||
/obj/item/seeds/chiliseed = 3,
|
||||
/obj/item/seeds/cocoapodseed = 3,
|
||||
/obj/item/seeds/cornseed = 3,
|
||||
/obj/item/seeds/durian = 3,
|
||||
/obj/item/seeds/eggplantseed = 3,
|
||||
/obj/item/seeds/grapeseed = 3,
|
||||
/obj/item/seeds/grassseed = 3,
|
||||
/obj/item/seeds/replicapod = 3,
|
||||
/obj/item/seeds/lavenderseed = 3,
|
||||
/obj/item/seeds/lemonseed = 3,
|
||||
/obj/item/seeds/lettuce = 3,
|
||||
/obj/item/seeds/limeseed = 3,
|
||||
/obj/item/seeds/mtearseed = 2,
|
||||
/obj/item/seeds/orangeseed = 3,
|
||||
/obj/item/seeds/onionseed = 3,
|
||||
/obj/item/seeds/peanutseed = 3,
|
||||
/obj/item/seeds/plumpmycelium = 3,
|
||||
/obj/item/seeds/poppyseed = 3,
|
||||
/obj/item/seeds/potatoseed = 3,
|
||||
/obj/item/seeds/pumpkinseed = 3,
|
||||
/obj/item/seeds/rhubarb = 3,
|
||||
/obj/item/seeds/riceseed = 3,
|
||||
/obj/item/seeds/rose = 3,
|
||||
/obj/item/seeds/soyaseed = 3,
|
||||
/obj/item/seeds/spineapple = 3,
|
||||
/obj/item/seeds/sugarcaneseed = 3,
|
||||
/obj/item/seeds/sunflowerseed = 3,
|
||||
/obj/item/seeds/shandseed = 2,
|
||||
/obj/item/seeds/tobaccoseed = 3,
|
||||
/obj/item/seeds/tomatoseed = 3,
|
||||
/obj/item/seeds/towermycelium = 3,
|
||||
/obj/item/seeds/vanilla = 3,
|
||||
/obj/item/seeds/watermelonseed = 3,
|
||||
/obj/item/seeds/wheatseed = 3,
|
||||
/obj/item/seeds/whitebeetseed = 3,
|
||||
/obj/item/seeds/wabback = 2)
|
||||
|
||||
//TFF 19/12/19 - Brig version of a Nutrimax
|
||||
/obj/machinery/vending/hydronutrients/brig
|
||||
name = "Brig NutriMax"
|
||||
desc = "A plant nutrients vendor. Seems some items aren't included."
|
||||
product_slogans = "Aren't you glad you don't have to fertilize the natural way?;Now with 50% less stink!;Plants are people too!"
|
||||
product_ads = "We like plants!;Don't you want some?;The greenest thumbs ever.;We like big plants.;Soft soil..."
|
||||
icon_state = "nutri"
|
||||
icon_deny = "nutri-deny"
|
||||
products = list(/obj/item/weapon/reagent_containers/glass/bottle/eznutrient = 6,/obj/item/weapon/reagent_containers/glass/bottle/left4zed = 4,/obj/item/weapon/reagent_containers/glass/bottle/robustharvest = 3,/obj/item/weapon/plantspray/pests = 20,
|
||||
/obj/item/weapon/reagent_containers/glass/beaker = 4,/obj/item/weapon/storage/bag/plants = 5)
|
||||
premium = list(/obj/item/weapon/reagent_containers/glass/bottle/ammonia = 10,/obj/item/weapon/reagent_containers/glass/bottle/diethylamine = 5)
|
||||
|
||||
/obj/machinery/vending/emergencyfood
|
||||
name = "Food Cube Dispenser"
|
||||
desc = "An ominous machine dispensing food cubes. It will keep you fed, but at what cost?"
|
||||
icon = 'icons/obj/vending_vr.dmi'
|
||||
icon_state = "foodcube"
|
||||
product_ads = "Afraid to starve?;Starvation is not an option!;Add water before consumption.;Let me take care of you.;Dire circumstances call for food cubes, do not let the taste deter you."
|
||||
products = list(/obj/item/weapon/storage/box/wings/tray = 5,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle = 10)
|
||||
contraband = list(/obj/item/weapon/storage/box/wings/tray = 5)
|
||||
|
||||
/obj/machinery/vending/emergencyfood/filled
|
||||
products = list(/obj/item/weapon/storage/box/wings/tray = 40)
|
||||
contraband = list(/obj/item/weapon/storage/box/wings/tray = 20)
|
||||
@@ -20,4 +20,17 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/liquidfood = 10,
|
||||
)
|
||||
contraband = list(/obj/item/weapon/reagent_containers/food/snacks/tofupie = 3)
|
||||
vend_delay = 15
|
||||
vend_delay = 15
|
||||
|
||||
/obj/machinery/vending/security/yw
|
||||
name = "SecTech"
|
||||
desc = "A security equipment vendor."
|
||||
product_ads = "Crack capitalist skulls!;Beat some heads in!;Don't forget - harm is good!;Your weapons are right here.;Handcuffs!;Freeze, scumbag!;Don't tase me bro!;Tase them, bro.;Why not have a donut?"
|
||||
icon_state = "sec"
|
||||
icon_deny = "sec-deny"
|
||||
req_access = list(access_security)
|
||||
products = list(/obj/item/weapon/handcuffs = 8,/obj/item/weapon/grenade/flashbang = 4,/obj/item/device/flash = 5,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/donut/normal = 12,/obj/item/weapon/storage/box/evidence = 6,/obj/item/weapon/gun/energy/taser =3,/obj/item/weapon/gun/projectile/sec =3)
|
||||
contraband = list(/obj/item/clothing/glasses/sunglasses = 2,/obj/item/weapon/storage/box/donut = 2)
|
||||
req_log_access = access_armory
|
||||
has_logs = 1
|
||||
@@ -0,0 +1,49 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster //what is that noise? A BAWWW from TK mutants.
|
||||
name = "\improper CCW armor booster"
|
||||
desc = "Close-combat armor booster. Boosts exosuit armor against armed melee attacks. Requires energy to operate."
|
||||
icon_state = "mecha_abooster_ccw"
|
||||
origin_tech = list(TECH_MATERIAL = 3)
|
||||
equip_cooldown = 10
|
||||
energy_drain = 50
|
||||
range = 0
|
||||
var/deflect_coeff = 1.15
|
||||
var/damage_coeff = 0.8
|
||||
|
||||
equip_type = EQUIP_HULL
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster/can_attach(obj/mecha/M as obj)
|
||||
if(..())
|
||||
if(!M.proc_res["dynattackby"])
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster/attach(obj/mecha/M as obj)
|
||||
..()
|
||||
chassis.proc_res["dynattackby"] = src
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster/detach()
|
||||
chassis.proc_res["dynattackby"] = null
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster/get_equip_info()
|
||||
if(!chassis) return
|
||||
return "<span style=\"color:[equip_ready?"#0f0":"#f00"];\">*</span> [src.name]"
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster/proc/dynattackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(!action_checks(user))
|
||||
return chassis.dynattackby(W,user)
|
||||
chassis.log_message("Attacked by [W]. Attacker - [user]")
|
||||
if(prob(chassis.deflect_chance*deflect_coeff))
|
||||
user << "<span class='danger'>\The [W] bounces off [chassis] armor.</span>"
|
||||
chassis.log_append_to_last("Armor saved.")
|
||||
else
|
||||
chassis.occupant_message("<span class='danger'>\The [user] hits [chassis] with [W].</span>")
|
||||
user.visible_message("<span class='danger'>\The [user] hits [chassis] with [W].</span>", "<span class='danger'>You hit [src] with [W].</span>")
|
||||
chassis.take_damage(round(W.force*damage_coeff),W.damtype)
|
||||
chassis.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
|
||||
set_ready_state(0)
|
||||
chassis.use_power(energy_drain)
|
||||
do_after_cooldown()
|
||||
return
|
||||
@@ -0,0 +1,72 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster
|
||||
name = "\improper RW armor booster"
|
||||
desc = "Ranged-weaponry armor booster. Boosts exosuit armor against ranged attacks. Completely blocks taser shots, but requires energy to operate."
|
||||
icon_state = "mecha_abooster_proj"
|
||||
origin_tech = list(TECH_MATERIAL = 4)
|
||||
equip_cooldown = 10
|
||||
energy_drain = 50
|
||||
range = 0
|
||||
var/deflect_coeff = 1.15
|
||||
var/damage_coeff = 0.8
|
||||
|
||||
equip_type = EQUIP_HULL
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster/can_attach(obj/mecha/M as obj)
|
||||
if(..())
|
||||
if(!M.proc_res["dynbulletdamage"] && !M.proc_res["dynhitby"])
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster/attach(obj/mecha/M as obj)
|
||||
..()
|
||||
chassis.proc_res["dynbulletdamage"] = src
|
||||
chassis.proc_res["dynhitby"] = src
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster/detach()
|
||||
chassis.proc_res["dynbulletdamage"] = null
|
||||
chassis.proc_res["dynhitby"] = null
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster/get_equip_info()
|
||||
if(!chassis) return
|
||||
return "<span style=\"color:[equip_ready?"#0f0":"#f00"];\">*</span> [src.name]"
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster/proc/dynbulletdamage(var/obj/item/projectile/Proj)
|
||||
if(istype(Proj, /obj/item/projectile/test))
|
||||
return // Don't care about test projectiles, just what comes after them
|
||||
if(!action_checks(src))
|
||||
return chassis.dynbulletdamage(Proj)
|
||||
if(prob(chassis.deflect_chance*deflect_coeff))
|
||||
chassis.occupant_message("<span class='notice'>The armor deflects incoming projectile.</span>")
|
||||
chassis.visible_message("The [chassis.name] armor deflects the projectile")
|
||||
chassis.log_append_to_last("Armor saved.")
|
||||
else
|
||||
chassis.take_damage(round(Proj.damage*src.damage_coeff),Proj.check_armour)
|
||||
chassis.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
|
||||
Proj.on_hit(chassis)
|
||||
set_ready_state(0)
|
||||
chassis.use_power(energy_drain)
|
||||
do_after_cooldown()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster/proc/dynhitby(atom/movable/A)
|
||||
if(!action_checks(A))
|
||||
return chassis.dynhitby(A)
|
||||
if(prob(chassis.deflect_chance*deflect_coeff) || istype(A, /mob/living) || istype(A, /obj/item/mecha_parts/mecha_tracking))
|
||||
chassis.occupant_message("<span class='notice'>The [A] bounces off the armor.</span>")
|
||||
chassis.visible_message("The [A] bounces off the [chassis] armor")
|
||||
chassis.log_append_to_last("Armor saved.")
|
||||
if(istype(A, /mob/living))
|
||||
var/mob/living/M = A
|
||||
M.take_organ_damage(10)
|
||||
else if(istype(A, /obj))
|
||||
var/obj/O = A
|
||||
if(O.throwforce)
|
||||
chassis.take_damage(round(O.throwforce*damage_coeff))
|
||||
chassis.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
|
||||
set_ready_state(0)
|
||||
chassis.use_power(energy_drain)
|
||||
do_after_cooldown()
|
||||
return
|
||||
@@ -0,0 +1,128 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/cable_layer
|
||||
name = "Cable Layer"
|
||||
icon_state = "mecha_wire"
|
||||
var/turf/old_turf
|
||||
var/obj/structure/cable/last_piece
|
||||
var/obj/item/stack/cable_coil/cable
|
||||
var/max_cable = 1000
|
||||
required_type = list(/obj/mecha/working)
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/New()
|
||||
cable = new(src)
|
||||
cable.amount = 0
|
||||
..()
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/MoveAction()
|
||||
layCable()
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/action(var/obj/item/stack/cable_coil/target)
|
||||
if(!action_checks(target))
|
||||
return
|
||||
var/result = load_cable(target)
|
||||
var/message
|
||||
if(isnull(result))
|
||||
message = "<font color='red'>Unable to load [target] - no cable found.</font>"
|
||||
else if(!result)
|
||||
message = "Reel is full."
|
||||
else
|
||||
message = "[result] meters of cable successfully loaded."
|
||||
send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info())
|
||||
occupant_message(message)
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/Topic(href,href_list)
|
||||
..()
|
||||
if(href_list["toggle"])
|
||||
set_ready_state(!equip_ready)
|
||||
occupant_message("[src] [equip_ready?"dea":"a"]ctivated.")
|
||||
log_message("[equip_ready?"Dea":"A"]ctivated.")
|
||||
return
|
||||
if(href_list["cut"])
|
||||
if(cable && cable.amount)
|
||||
var/m = round(input(chassis.occupant,"Please specify the length of cable to cut","Cut cable",min(cable.amount,30)) as num, 1)
|
||||
m = min(m, cable.amount)
|
||||
if(m)
|
||||
use_cable(m)
|
||||
var/obj/item/stack/cable_coil/CC = new (get_turf(chassis))
|
||||
CC.amount = m
|
||||
else
|
||||
occupant_message("There's no more cable on the reel.")
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/get_equip_info()
|
||||
var/output = ..()
|
||||
if(output)
|
||||
return "[output] \[Cable: [cable ? cable.amount : 0] m\][(cable && cable.amount) ? "- <a href='?src=\ref[src];toggle=1'>[!equip_ready?"Dea":"A"]ctivate</a>|<a href='?src=\ref[src];cut=1'>Cut</a>" : null]"
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/load_cable(var/obj/item/stack/cable_coil/CC)
|
||||
if(istype(CC) && CC.amount)
|
||||
var/cur_amount = cable? cable.amount : 0
|
||||
var/to_load = max(max_cable - cur_amount,0)
|
||||
if(to_load)
|
||||
to_load = min(CC.amount, to_load)
|
||||
if(!cable)
|
||||
cable = new(src)
|
||||
cable.amount = 0
|
||||
cable.amount += to_load
|
||||
CC.use(to_load)
|
||||
return to_load
|
||||
else
|
||||
return 0
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/use_cable(amount)
|
||||
if(!cable || cable.amount<1)
|
||||
set_ready_state(1)
|
||||
occupant_message("Cable depleted, [src] deactivated.")
|
||||
log_message("Cable depleted, [src] deactivated.")
|
||||
return
|
||||
if(cable.amount < amount)
|
||||
occupant_message("No enough cable to finish the task.")
|
||||
return
|
||||
cable.use(amount)
|
||||
update_equip_info()
|
||||
return 1
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/reset()
|
||||
last_piece = null
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/dismantleFloor(var/turf/new_turf)
|
||||
new_turf = get_turf(chassis)
|
||||
if(istype(new_turf, /turf/simulated/floor))
|
||||
var/turf/simulated/floor/T = new_turf
|
||||
if(!T.is_plating())
|
||||
T.make_plating(!(T.broken || T.burnt))
|
||||
return new_turf.is_plating()
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/layCable(var/turf/new_turf)
|
||||
new_turf = get_turf(chassis)
|
||||
if(equip_ready || !istype(new_turf, /turf/simulated/floor) || !dismantleFloor(new_turf))
|
||||
return reset()
|
||||
var/fdirn = turn(chassis.dir,180)
|
||||
for(var/obj/structure/cable/LC in new_turf) // check to make sure there's not a cable there already
|
||||
if(LC.d1 == fdirn || LC.d2 == fdirn)
|
||||
return reset()
|
||||
if(!use_cable(1))
|
||||
return reset()
|
||||
var/obj/structure/cable/NC = new(new_turf)
|
||||
NC.cableColor("red")
|
||||
NC.d1 = 0
|
||||
NC.d2 = fdirn
|
||||
NC.update_icon()
|
||||
|
||||
var/datum/powernet/PN
|
||||
if(last_piece && last_piece.d2 != chassis.dir)
|
||||
last_piece.d1 = min(last_piece.d2, chassis.dir)
|
||||
last_piece.d2 = max(last_piece.d2, chassis.dir)
|
||||
last_piece.update_icon()
|
||||
PN = last_piece.powernet
|
||||
|
||||
if(!PN)
|
||||
PN = new()
|
||||
PN.add_cable(NC)
|
||||
NC.mergeConnectedNetworks(NC.d2)
|
||||
|
||||
//NC.mergeConnectedNetworksOnTurf()
|
||||
last_piece = NC
|
||||
return 1
|
||||
@@ -0,0 +1,76 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/gravcatapult
|
||||
name = "gravitational catapult"
|
||||
desc = "An exosuit mounted gravitational catapult."
|
||||
icon_state = "mecha_teleport"
|
||||
origin_tech = list(TECH_BLUESPACE = 2, TECH_MAGNET = 3)
|
||||
equip_cooldown = 10
|
||||
energy_drain = 100
|
||||
range = MELEE|RANGED
|
||||
var/atom/movable/locked
|
||||
var/mode = 1 //1 - gravsling 2 - gravpush
|
||||
|
||||
var/last_fired = 0 //Concept stolen from guns.
|
||||
var/fire_delay = 10 //Used to prevent spam-brute against humans.
|
||||
|
||||
equip_type = EQUIP_UTILITY
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/gravcatapult/action(atom/movable/target)
|
||||
|
||||
if(world.time >= last_fired + fire_delay)
|
||||
last_fired = world.time
|
||||
else
|
||||
if (world.time % 3)
|
||||
occupant_message("<span class='warning'>[src] is not ready to fire again!</span>")
|
||||
return 0
|
||||
|
||||
switch(mode)
|
||||
if(1)
|
||||
if(!action_checks(target) && !locked) return
|
||||
if(!locked)
|
||||
if(!istype(target) || target.anchored)
|
||||
occupant_message("Unable to lock on [target]")
|
||||
return
|
||||
locked = target
|
||||
occupant_message("Locked on [target]")
|
||||
send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info())
|
||||
return
|
||||
else if(target!=locked)
|
||||
if(locked in view(chassis))
|
||||
locked.throw_at(target, 14, 1.5, chassis)
|
||||
locked = null
|
||||
send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info())
|
||||
set_ready_state(0)
|
||||
chassis.use_power(energy_drain)
|
||||
do_after_cooldown()
|
||||
else
|
||||
locked = null
|
||||
occupant_message("Lock on [locked] disengaged.")
|
||||
send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info())
|
||||
if(2)
|
||||
if(!action_checks(target)) return
|
||||
var/list/atoms = list()
|
||||
if(isturf(target))
|
||||
atoms = range(target,3)
|
||||
else
|
||||
atoms = orange(target,3)
|
||||
for(var/atom/movable/A in atoms)
|
||||
if(A.anchored) continue
|
||||
spawn(0)
|
||||
var/iter = 5-get_dist(A,target)
|
||||
for(var/i=0 to iter)
|
||||
step_away(A,target)
|
||||
sleep(2)
|
||||
set_ready_state(0)
|
||||
chassis.use_power(energy_drain)
|
||||
do_after_cooldown()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/gravcatapult/get_equip_info()
|
||||
return "[..()] [mode==1?"([locked||"Nothing"])":null] \[<a href='?src=\ref[src];mode=1'>S</a>|<a href='?src=\ref[src];mode=2'>P</a>\]"
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/gravcatapult/Topic(href, href_list)
|
||||
..()
|
||||
if(href_list["mode"])
|
||||
mode = text2num(href_list["mode"])
|
||||
send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info())
|
||||
return
|
||||
@@ -0,0 +1,175 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp
|
||||
name = "hydraulic clamp"
|
||||
icon_state = "mecha_clamp"
|
||||
equip_cooldown = 15
|
||||
energy_drain = 10
|
||||
var/dam_force = 20
|
||||
var/obj/mecha/working/ripley/cargo_holder
|
||||
required_type = list(/obj/mecha/working)
|
||||
ready_sound = 'sound/mecha/gasdisconnected.ogg'
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp/attach(obj/mecha/M as obj)
|
||||
..()
|
||||
cargo_holder = M
|
||||
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp/action(atom/target)
|
||||
if(!action_checks(target)) return
|
||||
if(!cargo_holder) return
|
||||
|
||||
//loading
|
||||
if(istype(target,/obj))
|
||||
var/obj/O = target
|
||||
if(O.has_buckled_mobs())
|
||||
return
|
||||
if(locate(/mob/living) in O)
|
||||
occupant_message("<span class='warning'>You can't load living things into the cargo compartment.</span>")
|
||||
return
|
||||
if(O.anchored)
|
||||
if(enable_special)
|
||||
if(istype(O, /obj/machinery/door/firedoor)) // I love doors.
|
||||
var/obj/machinery/door/firedoor/FD = O
|
||||
if(FD.blocked)
|
||||
FD.visible_message("<span class='danger'>\The [chassis] begins prying on \the [FD]!</span>")
|
||||
if(do_after(chassis.occupant,10 SECONDS,FD))
|
||||
playsound(FD.loc, 'sound/machines/airlock_creaking.ogg', 100, 1)
|
||||
FD.blocked = 0
|
||||
FD.update_icon()
|
||||
FD.open(1)
|
||||
FD.visible_message("<span class='warning'>\The [chassis] tears \the [FD] open!</span>")
|
||||
else if(FD.density)
|
||||
FD.visible_message("<span class='warning'>\The [chassis] begins forcing \the [FD] open!</span>")
|
||||
if(do_after(chassis.occupant, 5 SECONDS,FD))
|
||||
playsound(FD.loc, 'sound/machines/airlock_creaking.ogg', 100, 1)
|
||||
FD.visible_message("<span class='danger'>\The [chassis] forces \the [FD] open!</span>")
|
||||
FD.open(1)
|
||||
else
|
||||
FD.visible_message("<span class='danger'>\The [chassis] forces \the [FD] closed!</span>")
|
||||
FD.close(1)
|
||||
else if(istype(O, /obj/machinery/door/airlock)) // D o o r s.
|
||||
var/obj/machinery/door/airlock/AD = O
|
||||
if(AD.locked)
|
||||
occupant_message("<span class='notice'>The airlock's bolts prevent it from being forced.</span>")
|
||||
else if(!AD.operating)
|
||||
if(AD.welded)
|
||||
AD.visible_message("<span class='warning'>\The [chassis] begins prying on \the [AD]!</span>")
|
||||
if(do_after(chassis.occupant, 15 SECONDS,AD) && chassis.Adjacent(AD))
|
||||
AD.welded = FALSE
|
||||
AD.update_icon()
|
||||
playsound(AD.loc, 'sound/machines/airlock_creaking.ogg', 100, 1)
|
||||
AD.visible_message("<span class='danger'>\The [chassis] tears \the [AD] open!</span>")
|
||||
if(!AD.welded)
|
||||
if(density)
|
||||
spawn(0)
|
||||
AD.open(1)
|
||||
else
|
||||
spawn(0)
|
||||
AD.close(1)
|
||||
return
|
||||
else
|
||||
occupant_message("<span class='warning'>[target] is firmly secured.</span>")
|
||||
return
|
||||
if(cargo_holder.cargo.len >= cargo_holder.cargo_capacity)
|
||||
occupant_message("<span class='warning'>Not enough room in cargo compartment.</span>")
|
||||
return
|
||||
|
||||
occupant_message("You lift [target] and start to load it into cargo compartment.")
|
||||
chassis.visible_message("[chassis] lifts [target] and starts to load it into cargo compartment.")
|
||||
set_ready_state(0)
|
||||
chassis.use_power(energy_drain)
|
||||
O.anchored = 1
|
||||
var/T = chassis.loc
|
||||
if(do_after_cooldown(target))
|
||||
if(T == chassis.loc && src == chassis.selected)
|
||||
cargo_holder.cargo += O
|
||||
O.loc = chassis
|
||||
O.anchored = 0
|
||||
occupant_message("<span class='notice'>[target] succesfully loaded.</span>")
|
||||
log_message("Loaded [O]. Cargo compartment capacity: [cargo_holder.cargo_capacity - cargo_holder.cargo.len]")
|
||||
else
|
||||
occupant_message("<span class='warning'>You must hold still while handling objects.</span>")
|
||||
O.anchored = initial(O.anchored)
|
||||
|
||||
//attacking
|
||||
else if(istype(target,/mob/living))
|
||||
var/mob/living/M = target
|
||||
if(M.stat>1) return
|
||||
if(chassis.occupant.a_intent == I_HURT || istype(chassis.occupant,/mob/living/carbon/brain)) //No tactile feedback for brains
|
||||
M.take_overall_damage(dam_force)
|
||||
M.adjustOxyLoss(round(dam_force/2))
|
||||
M.updatehealth()
|
||||
occupant_message("<span class='warning'>You squeeze [target] with [src.name]. Something cracks.</span>")
|
||||
playsound(src.loc, "fracture", 5, 1, -2) //CRACK
|
||||
chassis.visible_message("<span class='warning'>[chassis] squeezes [target].</span>")
|
||||
else if(chassis.occupant.a_intent == I_DISARM && enable_special)
|
||||
playsound(src.loc, 'sound/mecha/hydraulic.ogg', 10, 1, -2)
|
||||
M.take_overall_damage(dam_force/2)
|
||||
M.adjustOxyLoss(round(dam_force/3))
|
||||
M.updatehealth()
|
||||
occupant_message("<span class='warning'>You slam [target] with [src.name]. Something cracks.</span>")
|
||||
playsound(src.loc, "fracture", 3, 1, -2) //CRACK 2
|
||||
chassis.visible_message("<span class='warning'>[chassis] slams [target].</span>")
|
||||
M.throw_at(get_step(M,get_dir(src, M)), 14, 1.5, chassis)
|
||||
else
|
||||
step_away(M,chassis)
|
||||
occupant_message("You push [target] out of the way.")
|
||||
chassis.visible_message("[chassis] pushes [target] out of the way.")
|
||||
set_ready_state(0)
|
||||
chassis.use_power(energy_drain)
|
||||
do_after_cooldown()
|
||||
return 1
|
||||
|
||||
|
||||
//This is pretty much just for the death-ripley so that it is harmless
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp/safety
|
||||
name = "\improper KILL CLAMP"
|
||||
equip_cooldown = 15
|
||||
energy_drain = 0
|
||||
dam_force = 0
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp/safety/action(atom/target)
|
||||
if(!action_checks(target)) return
|
||||
if(!cargo_holder) return
|
||||
if(istype(target,/obj))
|
||||
var/obj/O = target
|
||||
if(!O.anchored)
|
||||
if(cargo_holder.cargo.len < cargo_holder.cargo_capacity)
|
||||
chassis.occupant_message("You lift [target] and start to load it into cargo compartment.")
|
||||
chassis.visible_message("[chassis] lifts [target] and starts to load it into cargo compartment.")
|
||||
set_ready_state(0)
|
||||
chassis.use_power(energy_drain)
|
||||
O.anchored = 1
|
||||
var/T = chassis.loc
|
||||
if(do_after_cooldown(target))
|
||||
if(T == chassis.loc && src == chassis.selected)
|
||||
cargo_holder.cargo += O
|
||||
O.loc = chassis
|
||||
O.anchored = 0
|
||||
chassis.occupant_message("<span class='notice'>[target] succesfully loaded.</span>")
|
||||
chassis.log_message("Loaded [O]. Cargo compartment capacity: [cargo_holder.cargo_capacity - cargo_holder.cargo.len]")
|
||||
else
|
||||
chassis.occupant_message("<span class='warning'>You must hold still while handling objects.</span>")
|
||||
O.anchored = initial(O.anchored)
|
||||
else
|
||||
chassis.occupant_message("<span class='warning'>Not enough room in cargo compartment.</span>")
|
||||
else
|
||||
chassis.occupant_message("<span class='warning'>[target] is firmly secured.</span>")
|
||||
|
||||
else if(istype(target,/mob/living))
|
||||
var/mob/living/M = target
|
||||
if(M.stat>1) return
|
||||
if(chassis.occupant.a_intent == I_HURT)
|
||||
chassis.occupant_message("<span class='danger'>You obliterate [target] with [src.name], leaving blood and guts everywhere.</span>")
|
||||
chassis.visible_message("<span class='danger'>[chassis] destroys [target] in an unholy fury.</span>")
|
||||
if(chassis.occupant.a_intent == I_DISARM)
|
||||
chassis.occupant_message("<span class='danger'>You tear [target]'s limbs off with [src.name].</span>")
|
||||
chassis.visible_message("<span class='danger'>[chassis] rips [target]'s arms off.</span>")
|
||||
else
|
||||
step_away(M,chassis)
|
||||
chassis.occupant_message("You smash into [target], sending them flying.")
|
||||
chassis.visible_message("[chassis] tosses [target] like a piece of paper.")
|
||||
set_ready_state(0)
|
||||
chassis.use_power(energy_drain)
|
||||
do_after_cooldown()
|
||||
return 1
|
||||
@@ -0,0 +1,142 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/drill
|
||||
name = "drill"
|
||||
desc = "This is the drill that'll pierce the heavens!"
|
||||
icon_state = "mecha_drill"
|
||||
equip_cooldown = 30
|
||||
energy_drain = 10
|
||||
force = 15
|
||||
required_type = list(/obj/mecha/working/ripley)
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/drill/action(atom/target)
|
||||
if(!action_checks(target)) return
|
||||
if(isobj(target))
|
||||
var/obj/target_obj = target
|
||||
if(!target_obj.vars.Find("unacidable") || target_obj.unacidable) return
|
||||
set_ready_state(0)
|
||||
chassis.use_power(energy_drain)
|
||||
chassis.visible_message("<span class='danger'>[chassis] starts to drill [target]</span>", "<span class='warning'>You hear the drill.</span>")
|
||||
occupant_message("<span class='danger'>You start to drill [target]</span>")
|
||||
var/T = chassis.loc
|
||||
var/C = target.loc //why are these backwards? we may never know -Pete
|
||||
if(do_after_cooldown(target))
|
||||
if(T == chassis.loc && src == chassis.selected)
|
||||
if(istype(target, /turf/simulated/wall))
|
||||
var/turf/simulated/wall/W = target
|
||||
if(W.reinf_material)
|
||||
occupant_message("<span class='warning'>[target] is too durable to drill through.</span>")
|
||||
else
|
||||
log_message("Drilled through [target]")
|
||||
target.ex_act(2)
|
||||
else if(istype(target, /turf/simulated/mineral))
|
||||
if(enable_special)
|
||||
for(var/turf/simulated/mineral/M in range(chassis,1))
|
||||
if(get_dir(chassis,M)&chassis.dir)
|
||||
M.GetDrilled()
|
||||
else
|
||||
var/turf/simulated/mineral/M1 = target
|
||||
M1.GetDrilled()
|
||||
log_message("Drilled through [target]")
|
||||
if(locate(/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp) in chassis.equipment)
|
||||
var/obj/structure/ore_box/ore_box = locate(/obj/structure/ore_box) in chassis:cargo
|
||||
if(ore_box)
|
||||
for(var/obj/item/weapon/ore/ore in range(chassis,1))
|
||||
if(get_dir(chassis,ore)&chassis.dir)
|
||||
ore.forceMove(ore_box)
|
||||
else if(target.loc == C)
|
||||
log_message("Drilled through [target]")
|
||||
target.ex_act(2)
|
||||
return 1
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill
|
||||
name = "diamond drill"
|
||||
desc = "This is an upgraded version of the drill that'll pierce the heavens!"
|
||||
icon_state = "mecha_diamond_drill"
|
||||
origin_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3)
|
||||
equip_cooldown = 10
|
||||
force = 15
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill/action(atom/target)
|
||||
if(!action_checks(target)) return
|
||||
if(isobj(target))
|
||||
var/obj/target_obj = target
|
||||
if(target_obj.unacidable) return
|
||||
set_ready_state(0)
|
||||
chassis.use_power(energy_drain)
|
||||
chassis.visible_message("<span class='danger'>[chassis] starts to drill [target]</span>", "<span class='warning'>You hear the drill.</span>")
|
||||
occupant_message("<span class='danger'>You start to drill [target]</span>")
|
||||
var/T = chassis.loc
|
||||
var/C = target.loc //why are these backwards? we may never know -Pete
|
||||
if(do_after_cooldown(target))
|
||||
if(T == chassis.loc && src == chassis.selected)
|
||||
if(istype(target, /turf/simulated/wall))
|
||||
var/turf/simulated/wall/W = target
|
||||
if(!W.reinf_material || do_after_cooldown(target))//To slow down how fast mechs can drill through the station
|
||||
log_message("Drilled through [target]")
|
||||
target.ex_act(3)
|
||||
else if(istype(target, /turf/simulated/mineral))
|
||||
if(enable_special)
|
||||
for(var/turf/simulated/mineral/M in range(chassis,1))
|
||||
if(get_dir(chassis,M)&chassis.dir)
|
||||
M.GetDrilled()
|
||||
else
|
||||
var/turf/simulated/mineral/M1 = target
|
||||
M1.GetDrilled()
|
||||
log_message("Drilled through [target]")
|
||||
if(locate(/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp) in chassis.equipment)
|
||||
var/obj/structure/ore_box/ore_box = locate(/obj/structure/ore_box) in chassis:cargo
|
||||
if(ore_box)
|
||||
for(var/obj/item/weapon/ore/ore in range(chassis,1))
|
||||
if(get_dir(chassis,ore)&chassis.dir)
|
||||
ore.forceMove(ore_box)
|
||||
else if(target.loc == C)
|
||||
log_message("Drilled through [target]")
|
||||
target.ex_act(2)
|
||||
return 1
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/drill/bore
|
||||
name = "depth bore"
|
||||
desc = "This is the drill that'll pierce the depths!"
|
||||
icon_state = "mecha_bore"
|
||||
equip_cooldown = 5 SECONDS
|
||||
energy_drain = 30
|
||||
force = 20
|
||||
required_type = list(/obj/mecha/working/ripley)
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/drill/bore/action(atom/target)
|
||||
if(!action_checks(target)) return
|
||||
if(isobj(target))
|
||||
var/obj/target_obj = target
|
||||
if(target_obj.unacidable) return
|
||||
set_ready_state(0)
|
||||
chassis.use_power(energy_drain)
|
||||
chassis.visible_message("<span class='danger'>[chassis] starts to bore into \the [target]</span>", "<span class='warning'>You hear the bore.</span>")
|
||||
occupant_message("<span class='danger'>You start to bore into \the [target]</span>")
|
||||
var/T = chassis.loc
|
||||
var/C = target.loc
|
||||
if(do_after_cooldown(target))
|
||||
if(T == chassis.loc && src == chassis.selected)
|
||||
if(istype(target, /turf/simulated/wall))
|
||||
var/turf/simulated/wall/W = target
|
||||
if(W.reinf_material)
|
||||
occupant_message("<span class='warning'>[target] is too durable to bore through.</span>")
|
||||
else
|
||||
log_message("Bored through [target]")
|
||||
target.ex_act(2)
|
||||
else if(istype(target, /turf/simulated/mineral))
|
||||
var/turf/simulated/mineral/M = target
|
||||
if(enable_special && !M.density)
|
||||
M.ex_act(2)
|
||||
log_message("Bored into [target]")
|
||||
else
|
||||
M.GetDrilled()
|
||||
log_message("Bored through [target]")
|
||||
if(locate(/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp) in chassis.equipment)
|
||||
var/obj/structure/ore_box/ore_box = locate(/obj/structure/ore_box) in chassis:cargo
|
||||
if(ore_box)
|
||||
for(var/obj/item/weapon/ore/ore in range(chassis,1))
|
||||
if(get_dir(chassis,ore)&chassis.dir)
|
||||
ore.forceMove(ore_box)
|
||||
else if(target.loc == C)
|
||||
log_message("Drilled through [target]")
|
||||
target.ex_act(2)
|
||||
return 1
|
||||
@@ -0,0 +1,115 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay
|
||||
name = "energy relay"
|
||||
desc = "Wirelessly drains energy from any available power channel in area. The performance index is quite low."
|
||||
icon_state = "tesla"
|
||||
origin_tech = list(TECH_MAGNET = 4, TECH_ILLEGAL = 2)
|
||||
equip_cooldown = 10
|
||||
energy_drain = 0
|
||||
range = 0
|
||||
var/datum/global_iterator/pr_energy_relay
|
||||
var/coeff = 100
|
||||
var/list/use_channels = list(EQUIP,ENVIRON,LIGHT)
|
||||
|
||||
equip_type = EQUIP_UTILITY
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/New()
|
||||
..()
|
||||
pr_energy_relay = new /datum/global_iterator/mecha_energy_relay(list(src),0)
|
||||
pr_energy_relay.set_delay(equip_cooldown)
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/Destroy()
|
||||
qdel(pr_energy_relay)
|
||||
pr_energy_relay = null
|
||||
..()
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/detach()
|
||||
pr_energy_relay.stop()
|
||||
// chassis.proc_res["dynusepower"] = null
|
||||
chassis.proc_res["dyngetcharge"] = null
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/attach(obj/mecha/M)
|
||||
..()
|
||||
chassis.proc_res["dyngetcharge"] = src
|
||||
// chassis.proc_res["dynusepower"] = src
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/can_attach(obj/mecha/M)
|
||||
if(..())
|
||||
if(!M.proc_res["dyngetcharge"])// && !M.proc_res["dynusepower"])
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/proc/dyngetcharge()
|
||||
if(equip_ready) //disabled
|
||||
return chassis.dyngetcharge()
|
||||
var/area/A = get_area(chassis)
|
||||
var/pow_chan = get_power_channel(A)
|
||||
var/charge = 0
|
||||
if(pow_chan)
|
||||
charge = 1000 //making magic
|
||||
else
|
||||
return chassis.dyngetcharge()
|
||||
return charge
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/proc/get_power_channel(var/area/A)
|
||||
var/pow_chan
|
||||
if(A)
|
||||
for(var/c in use_channels)
|
||||
if(A.powered(c))
|
||||
pow_chan = c
|
||||
break
|
||||
return pow_chan
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/Topic(href, href_list)
|
||||
..()
|
||||
if(href_list["toggle_relay"])
|
||||
if(pr_energy_relay.toggle())
|
||||
set_ready_state(0)
|
||||
log_message("Activated.")
|
||||
else
|
||||
set_ready_state(1)
|
||||
log_message("Deactivated.")
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/get_equip_info()
|
||||
if(!chassis) return
|
||||
return "<span style=\"color:[equip_ready?"#0f0":"#f00"];\">*</span> [src.name] - <a href='?src=\ref[src];toggle_relay=1'>[pr_energy_relay.active()?"Dea":"A"]ctivate</a>"
|
||||
|
||||
/* proc/dynusepower(amount)
|
||||
if(!equip_ready) //enabled
|
||||
var/area/A = get_area(chassis)
|
||||
var/pow_chan = get_power_channel(A)
|
||||
if(pow_chan)
|
||||
A.master.use_power(amount*coeff, pow_chan)
|
||||
return 1
|
||||
return chassis.dynusepower(amount)*/
|
||||
|
||||
/datum/global_iterator/mecha_energy_relay
|
||||
|
||||
/datum/global_iterator/mecha_energy_relay/process(var/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/ER)
|
||||
if(!ER.chassis || ER.chassis.hasInternalDamage(MECHA_INT_SHORT_CIRCUIT))
|
||||
stop()
|
||||
ER.set_ready_state(1)
|
||||
return
|
||||
var/cur_charge = ER.chassis.get_charge()
|
||||
if(isnull(cur_charge) || !ER.chassis.cell)
|
||||
stop()
|
||||
ER.set_ready_state(1)
|
||||
ER.occupant_message("No powercell detected.")
|
||||
return
|
||||
if(cur_charge<ER.chassis.cell.maxcharge)
|
||||
var/area/A = get_area(ER.chassis)
|
||||
if(A)
|
||||
var/pow_chan
|
||||
for(var/c in list(EQUIP,ENVIRON,LIGHT))
|
||||
if(A.powered(c))
|
||||
pow_chan = c
|
||||
break
|
||||
if(pow_chan)
|
||||
var/delta = min(12, ER.chassis.cell.maxcharge-cur_charge)
|
||||
ER.chassis.give_power(delta)
|
||||
A.use_power(delta*ER.coeff, pow_chan)
|
||||
return
|
||||
@@ -0,0 +1,69 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/extinguisher
|
||||
name = "extinguisher"
|
||||
desc = "Exosuit-mounted extinguisher (Can be attached to: Engineering exosuits)"
|
||||
icon_state = "mecha_exting"
|
||||
equip_cooldown = 5
|
||||
energy_drain = 0
|
||||
range = MELEE|RANGED
|
||||
required_type = list(/obj/mecha/working)
|
||||
var/spray_particles = 5
|
||||
var/spray_amount = 5 //units of liquid per particle. 5 is enough to wet the floor - it's a big fire extinguisher, so should be fine
|
||||
var/max_water = 1000
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/extinguisher/Initialize()
|
||||
. = ..()
|
||||
reagents = new/datum/reagents(max_water)
|
||||
reagents.my_atom = src
|
||||
reagents.add_reagent("water", max_water)
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/extinguisher/action(atom/target) //copypasted from extinguisher. TODO: Rewrite from scratch.
|
||||
if(!action_checks(target) || get_dist(chassis, target)>3) return
|
||||
if(get_dist(chassis, target)>2) return
|
||||
set_ready_state(0)
|
||||
if(do_after_cooldown(target))
|
||||
if( istype(target, /obj/structure/reagent_dispensers/watertank) && get_dist(chassis,target) <= 1)
|
||||
var/obj/o = target
|
||||
var/amount = o.reagents.trans_to_obj(src, 200)
|
||||
occupant_message("<span class='notice'>[amount] units transferred into internal tank.</span>")
|
||||
playsound(chassis, 'sound/effects/refill.ogg', 50, 1, -6)
|
||||
return
|
||||
|
||||
if (src.reagents.total_volume < 1)
|
||||
occupant_message("<span class='warning'>\The [src] is empty.</span>")
|
||||
return
|
||||
|
||||
playsound(chassis, 'sound/effects/extinguish.ogg', 75, 1, -3)
|
||||
|
||||
var/direction = get_dir(chassis,target)
|
||||
|
||||
var/turf/T = get_turf(target)
|
||||
var/turf/T1 = get_step(T,turn(direction, 90))
|
||||
var/turf/T2 = get_step(T,turn(direction, -90))
|
||||
|
||||
var/list/the_targets = list(T,T1,T2)
|
||||
|
||||
for(var/a = 1 to 5)
|
||||
spawn(0)
|
||||
var/obj/effect/effect/water/W = new /obj/effect/effect/water(get_turf(chassis))
|
||||
var/turf/my_target
|
||||
if(a == 1)
|
||||
my_target = T
|
||||
else if(a == 2)
|
||||
my_target = T1
|
||||
else if(a == 3)
|
||||
my_target = T2
|
||||
else
|
||||
my_target = pick(the_targets)
|
||||
W.create_reagents(5)
|
||||
if(!W || !src)
|
||||
return
|
||||
reagents.trans_to_obj(W, spray_amount)
|
||||
W.set_color()
|
||||
W.set_up(my_target)
|
||||
return 1
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/extinguisher/get_equip_info()
|
||||
return "[..()] \[[src.reagents.total_volume]\]"
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/extinguisher/on_reagent_change()
|
||||
return
|
||||
@@ -0,0 +1,166 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/generator
|
||||
name = "phoron generator"
|
||||
desc = "Generates power using solid phoron as fuel. Pollutes the environment."
|
||||
icon_state = "tesla"
|
||||
origin_tech = list(TECH_PHORON = 2, TECH_POWER = 2, TECH_ENGINEERING = 1)
|
||||
equip_cooldown = 10
|
||||
energy_drain = 0
|
||||
range = MELEE
|
||||
var/datum/global_iterator/pr_mech_generator
|
||||
var/coeff = 100
|
||||
var/obj/item/stack/material/fuel
|
||||
var/max_fuel = 150000
|
||||
var/fuel_per_cycle_idle = 100
|
||||
var/fuel_per_cycle_active = 500
|
||||
var/power_per_cycle = 20
|
||||
|
||||
equip_type = EQUIP_UTILITY
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/generator/New()
|
||||
..()
|
||||
init()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/generator/Destroy()
|
||||
qdel(pr_mech_generator)
|
||||
pr_mech_generator = null
|
||||
..()
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/generator/proc/init()
|
||||
fuel = new /obj/item/stack/material/phoron(src)
|
||||
fuel.amount = 0
|
||||
pr_mech_generator = new /datum/global_iterator/mecha_generator(list(src),0)
|
||||
pr_mech_generator.set_delay(equip_cooldown)
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/generator/detach()
|
||||
pr_mech_generator.stop()
|
||||
..()
|
||||
return
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/generator/Topic(href, href_list)
|
||||
..()
|
||||
if(href_list["toggle"])
|
||||
if(pr_mech_generator.toggle())
|
||||
set_ready_state(0)
|
||||
log_message("Activated.")
|
||||
else
|
||||
set_ready_state(1)
|
||||
log_message("Deactivated.")
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/generator/get_equip_info()
|
||||
var/output = ..()
|
||||
if(output)
|
||||
return "[output] \[[fuel]: [round(fuel.amount*fuel.perunit,0.1)] cm<sup>3</sup>\] - <a href='?src=\ref[src];toggle=1'>[pr_mech_generator.active()?"Dea":"A"]ctivate</a>"
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/generator/action(target)
|
||||
if(chassis)
|
||||
var/result = load_fuel(target)
|
||||
var/message
|
||||
if(isnull(result))
|
||||
message = "<span class='warning'>[fuel] traces in target minimal. [target] cannot be used as fuel.</span>"
|
||||
else if(!result)
|
||||
message = "Unit is full."
|
||||
else
|
||||
message = "[result] unit\s of [fuel] successfully loaded."
|
||||
send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info())
|
||||
occupant_message(message)
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/generator/proc/load_fuel(var/obj/item/stack/material/P)
|
||||
if(P.type == fuel.type && P.amount)
|
||||
var/to_load = max(max_fuel - fuel.amount*fuel.perunit,0)
|
||||
if(to_load)
|
||||
var/units = min(max(round(to_load / P.perunit),1),P.amount)
|
||||
if(units)
|
||||
fuel.amount += units
|
||||
P.use(units)
|
||||
return units
|
||||
else
|
||||
return 0
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/generator/attackby(weapon,mob/user)
|
||||
var/result = load_fuel(weapon)
|
||||
if(isnull(result))
|
||||
user.visible_message("[user] tries to shove [weapon] into [src]. What a dumb-ass.","<span class='warning'>[fuel] traces minimal. [weapon] cannot be used as fuel.</span>")
|
||||
else if(!result)
|
||||
user << "Unit is full."
|
||||
else
|
||||
user.visible_message("[user] loads [src] with [fuel].","[result] unit\s of [fuel] successfully loaded.")
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/generator/critfail()
|
||||
..()
|
||||
var/turf/simulated/T = get_turf(src)
|
||||
if(!T)
|
||||
return
|
||||
var/datum/gas_mixture/GM = new
|
||||
if(prob(10))
|
||||
T.assume_gas("phoron", 100, 1500+T0C)
|
||||
T.visible_message("The [src] suddenly disgorges a cloud of heated phoron.")
|
||||
destroy()
|
||||
else
|
||||
T.assume_gas("phoron", 5, istype(T) ? T.air.temperature : T20C)
|
||||
T.visible_message("The [src] suddenly disgorges a cloud of phoron.")
|
||||
T.assume_air(GM)
|
||||
return
|
||||
|
||||
/datum/global_iterator/mecha_generator
|
||||
|
||||
/datum/global_iterator/mecha_generator/process(var/obj/item/mecha_parts/mecha_equipment/generator/EG)
|
||||
if(!EG.chassis)
|
||||
stop()
|
||||
EG.set_ready_state(1)
|
||||
return 0
|
||||
if(EG.fuel.amount<=0)
|
||||
stop()
|
||||
EG.log_message("Deactivated - no fuel.")
|
||||
EG.set_ready_state(1)
|
||||
return 0
|
||||
var/cur_charge = EG.chassis.get_charge()
|
||||
if(isnull(cur_charge))
|
||||
EG.set_ready_state(1)
|
||||
EG.occupant_message("No powercell detected.")
|
||||
EG.log_message("Deactivated.")
|
||||
stop()
|
||||
return 0
|
||||
var/use_fuel = EG.fuel_per_cycle_idle
|
||||
if(cur_charge<EG.chassis.cell.maxcharge)
|
||||
use_fuel = EG.fuel_per_cycle_active
|
||||
EG.chassis.give_power(EG.power_per_cycle)
|
||||
EG.fuel.amount -= min(use_fuel/EG.fuel.perunit,EG.fuel.amount)
|
||||
EG.update_equip_info()
|
||||
return 1
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/generator/nuclear
|
||||
name = "\improper ExoNuclear reactor"
|
||||
desc = "Generates power using uranium. Pollutes the environment."
|
||||
icon_state = "tesla"
|
||||
origin_tech = list(TECH_POWER = 3, TECH_ENGINEERING = 3)
|
||||
max_fuel = 50000
|
||||
fuel_per_cycle_idle = 10
|
||||
fuel_per_cycle_active = 30
|
||||
power_per_cycle = 50
|
||||
var/rad_per_cycle = 0.3
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/generator/nuclear/init()
|
||||
fuel = new /obj/item/stack/material/uranium(src)
|
||||
fuel.amount = 0
|
||||
pr_mech_generator = new /datum/global_iterator/mecha_generator/nuclear(list(src),0)
|
||||
pr_mech_generator.set_delay(equip_cooldown)
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/generator/nuclear/critfail()
|
||||
return
|
||||
|
||||
/datum/global_iterator/mecha_generator/nuclear
|
||||
|
||||
/datum/global_iterator/mecha_generator/nuclear/process(var/obj/item/mecha_parts/mecha_equipment/generator/nuclear/EG)
|
||||
if(..())
|
||||
SSradiation.radiate(EG, (EG.rad_per_cycle * 3))
|
||||
return 1
|
||||
@@ -0,0 +1,94 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/jetpack
|
||||
name = "ion jetpack"
|
||||
desc = "Using directed ion bursts and cunning solar wind reflection technique, this device enables controlled space flight."
|
||||
icon_state = "mecha_jetpack"
|
||||
equip_cooldown = 5
|
||||
energy_drain = 50
|
||||
var/wait = 0
|
||||
var/datum/effect/effect/system/ion_trail_follow/ion_trail
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/jetpack/can_attach(obj/mecha/M as obj)
|
||||
if(!(locate(src.type) in M.equipment) && !M.proc_res["dyndomove"])
|
||||
return ..()
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/jetpack/detach()
|
||||
..()
|
||||
chassis.proc_res["dyndomove"] = null
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/jetpack/attach(obj/mecha/M as obj)
|
||||
..()
|
||||
if(!ion_trail)
|
||||
ion_trail = new
|
||||
ion_trail.set_up(chassis)
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/jetpack/proc/toggle()
|
||||
if(!chassis)
|
||||
return
|
||||
!equip_ready? turn_off() : turn_on()
|
||||
return equip_ready
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/jetpack/proc/turn_on()
|
||||
set_ready_state(0)
|
||||
chassis.proc_res["dyndomove"] = src
|
||||
ion_trail.start()
|
||||
occupant_message("Activated")
|
||||
log_message("Activated")
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/jetpack/proc/turn_off()
|
||||
set_ready_state(1)
|
||||
chassis.proc_res["dyndomove"] = null
|
||||
ion_trail.stop()
|
||||
occupant_message("Deactivated")
|
||||
log_message("Deactivated")
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/jetpack/proc/dyndomove(direction)
|
||||
if(!action_checks())
|
||||
return chassis.dyndomove(direction)
|
||||
var/move_result = 0
|
||||
if(chassis.hasInternalDamage(MECHA_INT_CONTROL_LOST))
|
||||
move_result = step_rand(chassis)
|
||||
else if(chassis.dir!=direction)
|
||||
chassis.set_dir(direction)
|
||||
move_result = 1
|
||||
else
|
||||
move_result = step(chassis,direction)
|
||||
if(chassis.occupant)
|
||||
for(var/obj/effect/speech_bubble/B in range(1, chassis))
|
||||
if(B.parent == chassis.occupant)
|
||||
B.loc = chassis.loc
|
||||
if(move_result)
|
||||
wait = 1
|
||||
chassis.use_power(energy_drain)
|
||||
if(!chassis.pr_inertial_movement.active())
|
||||
chassis.pr_inertial_movement.start(list(chassis,direction))
|
||||
else
|
||||
chassis.pr_inertial_movement.set_process_args(list(chassis,direction))
|
||||
do_after_cooldown()
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/jetpack/action_checks()
|
||||
if(equip_ready || wait)
|
||||
return 0
|
||||
if(energy_drain && !chassis.has_charge(energy_drain))
|
||||
return 0
|
||||
if(chassis.check_for_support())
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/jetpack/get_equip_info()
|
||||
if(!chassis) return
|
||||
return "<span style=\"color:[equip_ready?"#0f0":"#f00"];\">*</span> [src.name] \[<a href=\"?src=\ref[src];toggle=1\">Toggle</a>\]"
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/jetpack/Topic(href,href_list)
|
||||
..()
|
||||
if(href_list["toggle"])
|
||||
toggle()
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/jetpack/do_after_cooldown()
|
||||
sleep(equip_cooldown)
|
||||
wait = 0
|
||||
return 1
|
||||
@@ -0,0 +1,41 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/orescanner
|
||||
name = "mounted ore scanner"
|
||||
desc = "An exosuit-mounted ore scanner."
|
||||
icon_state = "mecha_analyzer"
|
||||
origin_tech = list(TECH_MATERIAL = 2, TECH_MAGNET = 2, TECH_POWER = 2)
|
||||
equip_cooldown = 5
|
||||
energy_drain = 30
|
||||
range = MELEE|RANGED
|
||||
equip_type = EQUIP_SPECIAL
|
||||
ready_sound = 'sound/items/goggles_charge.ogg'
|
||||
required_type = list(/obj/mecha/working/ripley)
|
||||
|
||||
var/obj/item/weapon/mining_scanner/my_scanner = null
|
||||
var/exact_scan = FALSE
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/orescanner/Initialize()
|
||||
my_scanner = new(src)
|
||||
return ..()
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/orescanner/Destroy()
|
||||
QDEL_NULL(my_scanner)
|
||||
return ..()
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/orescanner/action(var/atom/target)
|
||||
if(!action_checks(target) || get_dist(chassis, target) > 5)
|
||||
return FALSE
|
||||
|
||||
if(!enable_special)
|
||||
target = get_turf(chassis)
|
||||
|
||||
var/datum/beam/ScanBeam = chassis.Beam(target,"g_beam",'icons/effects/beam.dmi',time=2 SECONDS,10,/obj/effect/ebeam,2)
|
||||
|
||||
if(do_after(chassis.occupant, 2 SECONDS))
|
||||
my_scanner.ScanTurf(target, chassis.occupant, exact_scan)
|
||||
|
||||
QDEL_NULL(ScanBeam)
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/orescanner/advanced
|
||||
name = "advanced ore scanner"
|
||||
icon_state = "mecha_analyzer_adv"
|
||||
exact_scan = TRUE
|
||||
@@ -0,0 +1,151 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/passenger
|
||||
name = "passenger compartment"
|
||||
desc = "A mountable passenger compartment for exosuits. Rather cramped."
|
||||
icon_state = "mecha_abooster_ccw"
|
||||
origin_tech = list(TECH_ENGINEERING = 1, TECH_BIO = 1)
|
||||
energy_drain = 10
|
||||
range = MELEE
|
||||
equip_cooldown = 20
|
||||
var/mob/living/carbon/occupant = null
|
||||
var/door_locked = 1
|
||||
salvageable = 0
|
||||
allow_duplicate = TRUE
|
||||
|
||||
equip_type = EQUIP_HULL
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/passenger/destroy()
|
||||
for(var/atom/movable/AM in src)
|
||||
AM.forceMove(get_turf(src))
|
||||
AM << "<span class='danger'>You tumble out of the destroyed [src.name]!</span>"
|
||||
return ..()
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/passenger/Exit(atom/movable/O)
|
||||
return 0
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/passenger/proc/move_inside(var/mob/user)
|
||||
if (chassis)
|
||||
chassis.visible_message("<span class='notice'>[user] starts to climb into [chassis].</span>")
|
||||
|
||||
if(do_after(user, 40, needhand=0))
|
||||
if(!src.occupant)
|
||||
user.forceMove(src)
|
||||
occupant = user
|
||||
log_message("[user] boarded.")
|
||||
occupant_message("[user] boarded.")
|
||||
else if(src.occupant != user)
|
||||
to_chat(user, "<span class='warning'>[src.occupant] was faster. Try harder next time, loser.</span>")
|
||||
else
|
||||
to_chat(user, "You stop entering the exosuit.")
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/passenger/verb/eject()
|
||||
set name = "Eject"
|
||||
set category = "Exosuit Interface"
|
||||
set src = usr.loc
|
||||
set popup_menu = 0
|
||||
|
||||
if(usr != occupant)
|
||||
return
|
||||
to_chat(occupant, "You climb out from \the [src].")
|
||||
go_out()
|
||||
occupant_message("[occupant] disembarked.")
|
||||
log_message("[occupant] disembarked.")
|
||||
add_fingerprint(usr)
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/passenger/proc/go_out()
|
||||
if(!occupant)
|
||||
return
|
||||
occupant.forceMove(get_turf(src))
|
||||
occupant.reset_view()
|
||||
/*
|
||||
if(occupant.client)
|
||||
occupant.client.eye = occupant.client.mob
|
||||
occupant.client.perspective = MOB_PERSPECTIVE
|
||||
*/
|
||||
occupant = null
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/passenger/attach()
|
||||
..()
|
||||
if (chassis)
|
||||
chassis.verbs |= /obj/mecha/proc/move_inside_passenger
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/passenger/detach()
|
||||
if(occupant)
|
||||
occupant_message("Unable to detach [src] - equipment occupied.")
|
||||
return
|
||||
|
||||
var/obj/mecha/M = chassis
|
||||
..()
|
||||
if (M && !(locate(/obj/item/mecha_parts/mecha_equipment/tool/passenger) in M))
|
||||
M.verbs -= /obj/mecha/proc/move_inside_passenger
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/passenger/get_equip_info()
|
||||
return "[..()] <br />[occupant? "\[Occupant: [occupant]\]|" : ""]Exterior Hatch: <a href='?src=\ref[src];toggle_lock=1'>Toggle Lock</a>"
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/passenger/Topic(href,href_list)
|
||||
..()
|
||||
if (href_list["toggle_lock"])
|
||||
door_locked = !door_locked
|
||||
occupant_message("Passenger compartment hatch [door_locked? "locked" : "unlocked"].")
|
||||
if (chassis)
|
||||
chassis.visible_message("The hatch on \the [chassis] [door_locked? "locks" : "unlocks"].", "You hear something latching.")
|
||||
|
||||
|
||||
#define LOCKED 1
|
||||
#define OCCUPIED 2
|
||||
|
||||
/obj/mecha/proc/move_inside_passenger()
|
||||
set category = "Object"
|
||||
set name = "Enter Passenger Compartment"
|
||||
set src in oview(1)
|
||||
|
||||
//check that usr can climb in
|
||||
if (usr.stat || !ishuman(usr))
|
||||
return
|
||||
|
||||
if (!usr.Adjacent(src))
|
||||
return
|
||||
|
||||
if (!isturf(usr.loc))
|
||||
usr << "<span class='danger'>You can't reach the passenger compartment from here.</span>"
|
||||
return
|
||||
|
||||
if(iscarbon(usr))
|
||||
var/mob/living/carbon/C = usr
|
||||
if(C.handcuffed)
|
||||
usr << "<span class='danger'>Kinda hard to climb in while handcuffed don't you think?</span>"
|
||||
return
|
||||
|
||||
if(isliving(usr))
|
||||
var/mob/living/L = usr
|
||||
if(L.has_buckled_mobs())
|
||||
to_chat(L, span("warning", "You have other entities attached to yourself. Remove them first."))
|
||||
return
|
||||
|
||||
//search for a valid passenger compartment
|
||||
var/feedback = 0 //for nicer user feedback
|
||||
for(var/obj/item/mecha_parts/mecha_equipment/tool/passenger/P in src)
|
||||
if (P.occupant)
|
||||
feedback |= OCCUPIED
|
||||
continue
|
||||
if (P.door_locked)
|
||||
feedback |= LOCKED
|
||||
continue
|
||||
|
||||
//found a boardable compartment
|
||||
P.move_inside(usr)
|
||||
return
|
||||
|
||||
//didn't find anything
|
||||
switch (feedback)
|
||||
if (OCCUPIED)
|
||||
usr << "<span class='danger'>The passenger compartment is already occupied!</span>"
|
||||
if (LOCKED)
|
||||
usr << "<span class='warning'>The passenger compartment hatch is locked!</span>"
|
||||
if (OCCUPIED|LOCKED)
|
||||
usr << "<span class='danger'>All of the passenger compartments are already occupied or locked!</span>"
|
||||
if (0)
|
||||
usr << "<span class='warning'>\The [src] doesn't have a passenger compartment.</span>"
|
||||
|
||||
#undef LOCKED
|
||||
#undef OCCUPIED
|
||||
@@ -0,0 +1,45 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/rcd
|
||||
name = "mounted RCD"
|
||||
desc = "An exosuit-mounted Rapid Construction Device. (Can be attached to: Any exosuit)"
|
||||
icon_state = "mecha_rcd"
|
||||
origin_tech = list(TECH_MATERIAL = 4, TECH_BLUESPACE = 3, TECH_MAGNET = 4, TECH_POWER = 4)
|
||||
equip_cooldown = 10
|
||||
energy_drain = 250
|
||||
range = MELEE|RANGED
|
||||
equip_type = EQUIP_SPECIAL
|
||||
var/obj/item/weapon/rcd/electric/mounted/mecha/my_rcd = null
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/rcd/Initialize()
|
||||
my_rcd = new(src)
|
||||
return ..()
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/rcd/Destroy()
|
||||
QDEL_NULL(my_rcd)
|
||||
return ..()
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/rcd/action(atom/target)
|
||||
if(!action_checks(target) || get_dist(chassis, target) > 3)
|
||||
return FALSE
|
||||
|
||||
my_rcd.use_rcd(target, chassis.occupant)
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/rcd/Topic(href,href_list)
|
||||
..()
|
||||
if(href_list["mode"])
|
||||
my_rcd.mode_index = text2num(href_list["mode"])
|
||||
occupant_message("RCD reconfigured to '[my_rcd.modes[my_rcd.mode_index]]'.")
|
||||
/*
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/rcd/get_equip_info()
|
||||
return "[..()] \[<a href='?src=\ref[src];mode=0'>D</a>|<a href='?src=\ref[src];mode=1'>C</a>|<a href='?src=\ref[src];mode=2'>A</a>\]"
|
||||
*/
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/rcd/get_equip_info()
|
||||
var/list/content = list(..()) // This is all for one line, in the interest of string tree conservation.
|
||||
var/i = 1
|
||||
content += "<br>"
|
||||
for(var/mode in my_rcd.modes)
|
||||
content += " <a href='?src=\ref[src];mode=[i]'>[mode]</a>"
|
||||
if(i < my_rcd.modes.len)
|
||||
content += "<br>"
|
||||
i++
|
||||
|
||||
return content.Join()
|
||||
@@ -0,0 +1,94 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/repair_droid
|
||||
name = "repair droid"
|
||||
desc = "Automated repair droid. Scans exosuit for damage and repairs it. Can fix almost any type of external or internal damage."
|
||||
icon_state = "repair_droid"
|
||||
origin_tech = list(TECH_MAGNET = 3, TECH_DATA = 3)
|
||||
equip_cooldown = 20
|
||||
energy_drain = 100
|
||||
range = 0
|
||||
var/health_boost = 2
|
||||
var/datum/global_iterator/pr_repair_droid
|
||||
var/icon/droid_overlay
|
||||
var/list/repairable_damage = list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH)
|
||||
|
||||
equip_type = EQUIP_HULL
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/repair_droid/New()
|
||||
..()
|
||||
pr_repair_droid = new /datum/global_iterator/mecha_repair_droid(list(src),0)
|
||||
pr_repair_droid.set_delay(equip_cooldown)
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/repair_droid/Destroy()
|
||||
qdel(pr_repair_droid)
|
||||
pr_repair_droid = null
|
||||
..()
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/repair_droid/attach(obj/mecha/M as obj)
|
||||
..()
|
||||
droid_overlay = new(src.icon, icon_state = "repair_droid")
|
||||
M.overlays += droid_overlay
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/repair_droid/destroy()
|
||||
chassis.overlays -= droid_overlay
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/repair_droid/detach()
|
||||
chassis.overlays -= droid_overlay
|
||||
pr_repair_droid.stop()
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/repair_droid/get_equip_info()
|
||||
if(!chassis) return
|
||||
return "<span style=\"color:[equip_ready?"#0f0":"#f00"];\">*</span> [src.name] - <a href='?src=\ref[src];toggle_repairs=1'>[pr_repair_droid.active()?"Dea":"A"]ctivate</a>"
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/repair_droid/Topic(href, href_list)
|
||||
..()
|
||||
if(href_list["toggle_repairs"])
|
||||
chassis.overlays -= droid_overlay
|
||||
if(pr_repair_droid.toggle())
|
||||
droid_overlay = new(src.icon, icon_state = "repair_droid_a")
|
||||
log_message("Activated.")
|
||||
else
|
||||
droid_overlay = new(src.icon, icon_state = "repair_droid")
|
||||
log_message("Deactivated.")
|
||||
set_ready_state(1)
|
||||
chassis.overlays += droid_overlay
|
||||
send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info())
|
||||
return
|
||||
|
||||
|
||||
/datum/global_iterator/mecha_repair_droid
|
||||
|
||||
/datum/global_iterator/mecha_repair_droid/process(var/obj/item/mecha_parts/mecha_equipment/repair_droid/RD as obj)
|
||||
if(!RD.chassis)
|
||||
stop()
|
||||
RD.set_ready_state(1)
|
||||
return
|
||||
var/health_boost = RD.health_boost
|
||||
var/repaired = 0
|
||||
if(RD.chassis.hasInternalDamage(MECHA_INT_SHORT_CIRCUIT))
|
||||
health_boost *= -2
|
||||
else if(RD.chassis.hasInternalDamage() && prob(15))
|
||||
for(var/int_dam_flag in RD.repairable_damage)
|
||||
if(RD.chassis.hasInternalDamage(int_dam_flag))
|
||||
RD.chassis.clearInternalDamage(int_dam_flag)
|
||||
repaired = 1
|
||||
break
|
||||
if(health_boost<0 || RD.chassis.health < initial(RD.chassis.health))
|
||||
RD.chassis.health += min(health_boost, initial(RD.chassis.health)-RD.chassis.health)
|
||||
repaired = 1
|
||||
if(repaired)
|
||||
if(RD.chassis.use_power(RD.energy_drain))
|
||||
RD.set_ready_state(0)
|
||||
else
|
||||
stop()
|
||||
RD.set_ready_state(1)
|
||||
return
|
||||
else
|
||||
RD.set_ready_state(1)
|
||||
return
|
||||
@@ -0,0 +1,82 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/combat_shield
|
||||
name = "linear combat shield"
|
||||
desc = "A shield generator that forms a rectangular, unidirectionally projectile-blocking wall in front of the exosuit."
|
||||
icon_state = "shield"
|
||||
origin_tech = list(TECH_PHORON = 3, TECH_MAGNET = 6, TECH_ILLEGAL = 4)
|
||||
equip_cooldown = 5
|
||||
energy_drain = 20
|
||||
range = 0
|
||||
|
||||
var/obj/item/shield_projector/line/exosuit/my_shield = null
|
||||
var/my_shield_type = /obj/item/shield_projector/line/exosuit
|
||||
var/icon/drone_overlay
|
||||
|
||||
equip_type = EQUIP_HULL
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/combat_shield/New()
|
||||
..()
|
||||
my_shield = new my_shield_type
|
||||
my_shield.shield_regen_delay = equip_cooldown
|
||||
my_shield.my_tool = src
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/combat_shield/critfail()
|
||||
..()
|
||||
my_shield.adjust_health(-200)
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/combat_shield/Destroy()
|
||||
chassis.overlays -= drone_overlay
|
||||
my_shield.forceMove(src)
|
||||
my_shield.destroy_shields()
|
||||
my_shield.my_tool = null
|
||||
my_shield.my_mecha = null
|
||||
qdel(my_shield)
|
||||
my_shield = null
|
||||
..()
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/combat_shield/attach(obj/mecha/M as obj)
|
||||
..()
|
||||
if(chassis)
|
||||
my_shield.shield_health = 0
|
||||
my_shield.my_mecha = chassis
|
||||
my_shield.forceMove(chassis)
|
||||
|
||||
drone_overlay = new(src.icon, icon_state = "shield_droid")
|
||||
M.overlays += drone_overlay
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/combat_shield/detach()
|
||||
chassis.overlays -= drone_overlay
|
||||
..()
|
||||
my_shield.destroy_shields()
|
||||
my_shield.my_mecha = null
|
||||
my_shield.shield_health = my_shield.max_shield_health
|
||||
my_shield.forceMove(src)
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/combat_shield/handle_movement_action()
|
||||
if(chassis)
|
||||
my_shield.update_shield_positions()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/combat_shield/proc/toggle_shield()
|
||||
..()
|
||||
if(chassis)
|
||||
my_shield.attack_self(chassis.occupant)
|
||||
if(my_shield.active)
|
||||
set_ready_state(0)
|
||||
log_message("Activated.")
|
||||
else
|
||||
set_ready_state(1)
|
||||
log_message("Deactivated.")
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/combat_shield/Topic(href, href_list)
|
||||
..()
|
||||
if(href_list["toggle_shield"])
|
||||
toggle_shield()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/combat_shield/get_equip_info()
|
||||
if(!chassis) return
|
||||
return "<span style=\"color:[equip_ready?"#0f0":"#f00"];\">*</span> [src.name] - <a href='?src=\ref[src];toggle_shield=1'>[my_shield.active?"Dea":"A"]ctivate</a>"
|
||||
@@ -0,0 +1,247 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/sleeper
|
||||
name = "mounted sleeper"
|
||||
desc = "A sleeper. Mountable to an exosuit. (Can be attached to: Medical Exosuits)"
|
||||
icon = 'icons/obj/Cryogenic2.dmi'
|
||||
icon_state = "sleeper_0"
|
||||
origin_tech = list(TECH_DATA = 2, TECH_BIO = 3)
|
||||
energy_drain = 20
|
||||
range = MELEE
|
||||
equip_cooldown = 30
|
||||
var/mob/living/carbon/human/occupant = null
|
||||
var/datum/global_iterator/pr_mech_sleeper
|
||||
var/inject_amount = 5
|
||||
required_type = list(/obj/mecha/medical)
|
||||
salvageable = 0
|
||||
allow_duplicate = TRUE
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/sleeper/New()
|
||||
..()
|
||||
pr_mech_sleeper = new /datum/global_iterator/mech_sleeper(list(src),0)
|
||||
pr_mech_sleeper.set_delay(equip_cooldown)
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/sleeper/Destroy()
|
||||
qdel(pr_mech_sleeper)
|
||||
for(var/atom/movable/AM in src)
|
||||
AM.forceMove(get_turf(src))
|
||||
return ..()
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/sleeper/Exit(atom/movable/O)
|
||||
return 0
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/sleeper/action(var/mob/living/carbon/human/target)
|
||||
if(!action_checks(target))
|
||||
return
|
||||
if(!istype(target))
|
||||
return
|
||||
if(target.buckled)
|
||||
occupant_message("[target] will not fit into the sleeper because they are buckled to [target.buckled].")
|
||||
return
|
||||
if(occupant)
|
||||
occupant_message("The sleeper is already occupied")
|
||||
return
|
||||
if(target.has_buckled_mobs())
|
||||
occupant_message(span("warning", "\The [target] has other entities attached to it. Remove them first."))
|
||||
return
|
||||
occupant_message("You start putting [target] into [src].")
|
||||
chassis.visible_message("[chassis] starts putting [target] into the [src].")
|
||||
var/C = chassis.loc
|
||||
var/T = target.loc
|
||||
if(do_after_cooldown(target))
|
||||
if(chassis.loc!=C || target.loc!=T)
|
||||
return
|
||||
if(occupant)
|
||||
occupant_message("<font color=\"red\"><B>The sleeper is already occupied!</B></font>")
|
||||
return
|
||||
target.forceMove(src)
|
||||
occupant = target
|
||||
target.reset_view(src)
|
||||
occupant.Stasis(3)
|
||||
/*
|
||||
if(target.client)
|
||||
target.client.perspective = EYE_PERSPECTIVE
|
||||
target.client.eye = chassis
|
||||
*/
|
||||
set_ready_state(0)
|
||||
pr_mech_sleeper.start()
|
||||
occupant_message("<font color='blue'>[target] successfully loaded into [src]. Life support functions engaged.</font>")
|
||||
chassis.visible_message("[chassis] loads [target] into [src].")
|
||||
log_message("[target] loaded. Life support functions engaged.")
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/sleeper/proc/go_out()
|
||||
if(!occupant)
|
||||
return
|
||||
occupant.forceMove(get_turf(src))
|
||||
occupant_message("[occupant] ejected. Life support functions disabled.")
|
||||
log_message("[occupant] ejected. Life support functions disabled.")
|
||||
occupant.reset_view()
|
||||
/*
|
||||
if(occupant.client)
|
||||
occupant.client.eye = occupant.client.mob
|
||||
occupant.client.perspective = MOB_PERSPECTIVE
|
||||
*/
|
||||
occupant.Stasis(0)
|
||||
occupant = null
|
||||
pr_mech_sleeper.stop()
|
||||
set_ready_state(1)
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/sleeper/detach()
|
||||
if(occupant)
|
||||
occupant_message("Unable to detach [src] - equipment occupied.")
|
||||
return
|
||||
pr_mech_sleeper.stop()
|
||||
return ..()
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/sleeper/get_equip_info()
|
||||
var/output = ..()
|
||||
if(output)
|
||||
var/temp = ""
|
||||
if(occupant)
|
||||
temp = "<br />\[Occupant: [occupant] (Health: [occupant.health]%)\]<br /><a href='?src=\ref[src];view_stats=1'>View stats</a>|<a href='?src=\ref[src];eject=1'>Eject</a>"
|
||||
return "[output] [temp]"
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/sleeper/Topic(href,href_list)
|
||||
..()
|
||||
var/datum/topic_input/top_filter = new /datum/topic_input(href,href_list)
|
||||
if(top_filter.get("eject"))
|
||||
go_out()
|
||||
if(top_filter.get("view_stats"))
|
||||
chassis.occupant << browse(get_occupant_stats(),"window=msleeper")
|
||||
onclose(chassis.occupant, "msleeper")
|
||||
return
|
||||
if(top_filter.get("inject"))
|
||||
inject_reagent(top_filter.getType("inject",/datum/reagent),top_filter.getObj("source"))
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/sleeper/proc/get_occupant_stats()
|
||||
if(!occupant)
|
||||
return
|
||||
return {"<html>
|
||||
<head>
|
||||
<title>[occupant] statistics</title>
|
||||
<script language='javascript' type='text/javascript'>
|
||||
[js_byjax]
|
||||
</script>
|
||||
<style>
|
||||
h3 {margin-bottom:2px;font-size:14px;}
|
||||
#lossinfo, #reagents, #injectwith {padding-left:15px;}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h3>Health statistics</h3>
|
||||
<div id="lossinfo">
|
||||
[get_occupant_dam()]
|
||||
</div>
|
||||
<h3>Reagents in bloodstream</h3>
|
||||
<div id="reagents">
|
||||
[get_occupant_reagents()]
|
||||
</div>
|
||||
<div id="injectwith">
|
||||
[get_available_reagents()]
|
||||
</div>
|
||||
</body>
|
||||
</html>"}
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/sleeper/proc/get_occupant_dam()
|
||||
var/t1
|
||||
switch(occupant.stat)
|
||||
if(0)
|
||||
t1 = "Conscious"
|
||||
if(1)
|
||||
t1 = "Unconscious"
|
||||
if(2)
|
||||
t1 = "*dead*"
|
||||
else
|
||||
t1 = "Unknown"
|
||||
return {"<font color="[occupant.health > 50 ? "blue" : "red"]"><b>Health:</b> [occupant.health]% ([t1])</font><br />
|
||||
<font color="[occupant.bodytemperature > 50 ? "blue" : "red"]"><b>Core Temperature:</b> [src.occupant.bodytemperature-T0C]°C ([src.occupant.bodytemperature*1.8-459.67]°F)</font><br />
|
||||
<font color="[occupant.getBruteLoss() < 60 ? "blue" : "red"]"><b>Brute Damage:</b> [occupant.getBruteLoss()]%</font><br />
|
||||
<font color="[occupant.getOxyLoss() < 60 ? "blue" : "red"]"><b>Respiratory Damage:</b> [occupant.getOxyLoss()]%</font><br />
|
||||
<font color="[occupant.getToxLoss() < 60 ? "blue" : "red"]"><b>Toxin Content:</b> [occupant.getToxLoss()]%</font><br />
|
||||
<font color="[occupant.getFireLoss() < 60 ? "blue" : "red"]"><b>Burn Severity:</b> [occupant.getFireLoss()]%</font><br />
|
||||
"}
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/sleeper/proc/get_occupant_reagents()
|
||||
if(occupant.reagents)
|
||||
for(var/datum/reagent/R in occupant.reagents.reagent_list)
|
||||
if(R.volume > 0)
|
||||
. += "[R]: [round(R.volume,0.01)]<br />"
|
||||
return . || "None"
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/sleeper/proc/get_available_reagents()
|
||||
var/output
|
||||
var/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun/SG = locate(/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun) in chassis
|
||||
if(SG && SG.reagents && islist(SG.reagents.reagent_list))
|
||||
for(var/datum/reagent/R in SG.reagents.reagent_list)
|
||||
if(R.volume > 0)
|
||||
output += "<a href=\"?src=\ref[src];inject=\ref[R];source=\ref[SG]\">Inject [R.name]</a><br />"
|
||||
return output
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/sleeper/proc/inject_reagent(var/datum/reagent/R,var/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun/SG)
|
||||
if(!R || !occupant || !SG || !(SG in chassis.equipment))
|
||||
return 0
|
||||
var/to_inject = min(R.volume, inject_amount)
|
||||
if(to_inject && occupant.reagents.get_reagent_amount(R.id) + to_inject > inject_amount*4)
|
||||
occupant_message("Sleeper safeties prohibit you from injecting more than [inject_amount*4] units of [R.name].")
|
||||
else
|
||||
occupant_message("Injecting [occupant] with [to_inject] units of [R.name].")
|
||||
log_message("Injecting [occupant] with [to_inject] units of [R.name].")
|
||||
//SG.reagents.trans_id_to(occupant,R.id,to_inject)
|
||||
SG.reagents.remove_reagent(R.id,to_inject)
|
||||
occupant.reagents.add_reagent(R.id,to_inject)
|
||||
update_equip_info()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/sleeper/update_equip_info()
|
||||
if(..())
|
||||
send_byjax(chassis.occupant,"msleeper.browser","lossinfo",get_occupant_dam())
|
||||
send_byjax(chassis.occupant,"msleeper.browser","reagents",get_occupant_reagents())
|
||||
send_byjax(chassis.occupant,"msleeper.browser","injectwith",get_available_reagents())
|
||||
return 1
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/sleeper/verb/eject()
|
||||
set name = "Sleeper Eject"
|
||||
set category = "Exosuit Interface"
|
||||
set src = usr.loc
|
||||
set popup_menu = 0
|
||||
if(usr!=src.occupant || usr.stat == 2)
|
||||
return
|
||||
to_chat(usr,"<span class='notice'>Release sequence activated. This will take one minute.</span>")
|
||||
sleep(600)
|
||||
if(!src || !usr || !occupant || (occupant != usr)) //Check if someone's released/replaced/bombed him already
|
||||
return
|
||||
go_out()//and release him from the eternal prison.
|
||||
|
||||
/datum/global_iterator/mech_sleeper
|
||||
|
||||
/datum/global_iterator/mech_sleeper/process(var/obj/item/mecha_parts/mecha_equipment/tool/sleeper/S)
|
||||
if(!S.chassis)
|
||||
S.set_ready_state(1)
|
||||
return stop()
|
||||
if(!S.chassis.has_charge(S.energy_drain))
|
||||
S.set_ready_state(1)
|
||||
S.log_message("Deactivated.")
|
||||
S.occupant_message("[src] deactivated - no power.")
|
||||
return stop()
|
||||
var/mob/living/carbon/M = S.occupant
|
||||
if(!M)
|
||||
return
|
||||
if(M.health > 0)
|
||||
M.adjustOxyLoss(-1)
|
||||
M.updatehealth()
|
||||
M.AdjustStunned(-4)
|
||||
M.AdjustWeakened(-4)
|
||||
M.AdjustStunned(-4)
|
||||
M.Paralyse(2)
|
||||
M.Weaken(2)
|
||||
M.Stun(2)
|
||||
if(M.reagents.get_reagent_amount("inaprovaline") < 5)
|
||||
M.reagents.add_reagent("inaprovaline", 5)
|
||||
S.chassis.use_power(S.energy_drain)
|
||||
S.update_equip_info()
|
||||
return
|
||||
@@ -0,0 +1,21 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/speedboost
|
||||
name = "ripley leg actuator overdrive"
|
||||
desc = "System enhancements and overdrives to make a ripley's legs move faster."
|
||||
icon_state = "tesla"
|
||||
origin_tech = list( TECH_POWER = 5, TECH_MATERIAL = 4, TECH_ENGINEERING = 4)
|
||||
required_type = list(/obj/mecha/working/ripley)
|
||||
|
||||
equip_type = EQUIP_HULL
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/speedboost/attach(obj/mecha/M as obj)
|
||||
..()
|
||||
if(enable_special)
|
||||
chassis.step_in = (chassis.step_in-2) // Make the ripley as fast as a durand
|
||||
else
|
||||
chassis.step_in = (chassis.step_in+1) // Improper parts slow the mech down
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/speedboost/detach()
|
||||
chassis.step_in = initial(chassis.step_in)
|
||||
..()
|
||||
return
|
||||
+510
-805
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,20 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/teleporter
|
||||
name = "teleporter"
|
||||
desc = "An exosuit module that allows exosuits to teleport to any position in view."
|
||||
icon_state = "mecha_teleport"
|
||||
origin_tech = list(TECH_BLUESPACE = 10)
|
||||
equip_cooldown = 150
|
||||
energy_drain = 1000
|
||||
range = RANGED
|
||||
|
||||
equip_type = EQUIP_SPECIAL
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/teleporter/action(atom/target)
|
||||
if(!action_checks(target) || src.loc.z == 2) return
|
||||
var/turf/T = get_turf(target)
|
||||
if(T)
|
||||
set_ready_state(0)
|
||||
chassis.use_power(energy_drain)
|
||||
do_teleport(chassis, T, 4)
|
||||
do_after_cooldown()
|
||||
return
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,50 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/wormhole_generator
|
||||
name = "wormhole generator"
|
||||
desc = "An exosuit module that allows generating of small quasi-stable wormholes."
|
||||
icon_state = "mecha_wholegen"
|
||||
origin_tech = list(TECH_BLUESPACE = 3)
|
||||
equip_cooldown = 50
|
||||
energy_drain = 300
|
||||
range = RANGED
|
||||
|
||||
equip_type = EQUIP_SPECIAL
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/wormhole_generator/action(atom/target)
|
||||
if(!action_checks(target) || src.loc.z == 2) return
|
||||
var/list/theareas = list()
|
||||
for(var/area/AR in orange(100, chassis))
|
||||
if(AR in theareas) continue
|
||||
theareas += AR
|
||||
if(!theareas.len)
|
||||
return
|
||||
var/area/thearea = pick(theareas)
|
||||
var/list/L = list()
|
||||
var/turf/pos = get_turf(src)
|
||||
for(var/turf/T in get_area_turfs(thearea.type))
|
||||
if(!T.density && pos.z == T.z)
|
||||
var/clear = 1
|
||||
for(var/obj/O in T)
|
||||
if(O.density)
|
||||
clear = 0
|
||||
break
|
||||
if(clear)
|
||||
L+=T
|
||||
if(!L.len)
|
||||
return
|
||||
var/turf/target_turf = pick(L)
|
||||
if(!target_turf)
|
||||
return
|
||||
chassis.use_power(energy_drain)
|
||||
set_ready_state(0)
|
||||
var/obj/effect/portal/P = new /obj/effect/portal(get_turf(target))
|
||||
P.target = target_turf
|
||||
P.creator = null
|
||||
P.icon = 'icons/obj/objects.dmi'
|
||||
P.failchance = 0
|
||||
P.icon_state = "anom"
|
||||
P.name = "wormhole"
|
||||
do_after_cooldown()
|
||||
src = null
|
||||
spawn(rand(150,300))
|
||||
qdel(P)
|
||||
return
|
||||
@@ -0,0 +1,41 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/powertool
|
||||
name = "pneumatic wrench"
|
||||
desc = "An exosuit-mounted hydraulic wrench."
|
||||
icon_state = "mecha_wrench"
|
||||
origin_tech = list(TECH_MATERIAL = 2, TECH_MAGNET = 2, TECH_POWER = 2)
|
||||
equip_cooldown = 3
|
||||
energy_drain = 15
|
||||
range = MELEE
|
||||
equip_type = EQUIP_UTILITY
|
||||
ready_sound = 'sound/items/Ratchet.ogg'
|
||||
required_type = list(/obj/mecha/working/ripley)
|
||||
|
||||
var/obj/item/my_tool = null
|
||||
var/tooltype = /obj/item/weapon/tool/wrench/power
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/powertool/Initialize()
|
||||
my_tool = new tooltype(src)
|
||||
my_tool.name = name
|
||||
my_tool.anchored = TRUE
|
||||
my_tool.canremove = FALSE
|
||||
return ..()
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/powertool/Destroy()
|
||||
QDEL_NULL(my_tool)
|
||||
return ..()
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/powertool/action(var/atom/target)
|
||||
if(!action_checks(target))
|
||||
return FALSE
|
||||
|
||||
if(isliving(target))
|
||||
my_tool.attack(target, chassis.occupant, BP_TORSO)
|
||||
|
||||
target.attackby(my_tool,chassis.occupant)
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/powertool/prybar
|
||||
name = "pneumatic prybar"
|
||||
desc = "An exosuit-mounted pneumatic prybar."
|
||||
icon_state = "mecha_crowbar"
|
||||
tooltype = /obj/item/weapon/tool/crowbar/power
|
||||
ready_sound = 'sound/mecha/gasdisconnected.ogg'
|
||||
@@ -0,0 +1,22 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg
|
||||
name = "\improper Ultra AC 2"
|
||||
desc = "A superior version of the standard Solgov Autocannon MK2 design."
|
||||
icon_state = "mecha_uac2"
|
||||
equip_cooldown = 10
|
||||
projectile = /obj/item/projectile/bullet/pistol/medium
|
||||
fire_sound = 'sound/weapons/Gunshot_machinegun.ogg'
|
||||
projectiles = 30 //10 bursts, matching the Scattershot's 10. Also, conveniently, doesn't eat your powercell when reloading like 300 bullets does.
|
||||
projectiles_per_shot = 3
|
||||
deviation = 0.3
|
||||
projectile_energy_cost = 20
|
||||
fire_cooldown = 2
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/rigged
|
||||
name = "jury-rigged machinegun"
|
||||
desc = "The cross between a jackhammer and a whole lot of zipguns."
|
||||
icon_state = "mecha_uac2-rig"
|
||||
equip_cooldown = 12
|
||||
projectile = /obj/item/projectile/bullet/pistol
|
||||
deviation = 0.5
|
||||
|
||||
equip_type = EQUIP_UTILITY
|
||||
@@ -0,0 +1,23 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic
|
||||
name = "general ballisic weapon"
|
||||
var/projectile_energy_cost
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/get_equip_info()
|
||||
return "[..()]\[[src.projectiles]\][(src.projectiles < initial(src.projectiles))?" - <a href='?src=\ref[src];rearm=1'>Rearm</a>":null]"
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/proc/rearm()
|
||||
if(projectiles < initial(projectiles))
|
||||
var/projectiles_to_add = initial(projectiles) - projectiles
|
||||
while(chassis.get_charge() >= projectile_energy_cost && projectiles_to_add)
|
||||
projectiles++
|
||||
projectiles_to_add--
|
||||
chassis.use_power(projectile_energy_cost)
|
||||
send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info())
|
||||
log_message("Rearmed [src.name].")
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/Topic(href, href_list)
|
||||
..()
|
||||
if (href_list["rearm"])
|
||||
src.rearm()
|
||||
return
|
||||
@@ -0,0 +1,22 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/mortar
|
||||
name = "\improper HEP RC 4 \"Skyfall\""
|
||||
desc = "A Hephaestus exosuit-mounted mortar for use on planetary-or-similar bodies."
|
||||
description_info = "This weapon cannot be fired indoors, underground, or on-station."
|
||||
icon_state = "mecha_mortar"
|
||||
equip_cooldown = 30
|
||||
fire_sound = 'sound/weapons/Gunshot_cannon.ogg'
|
||||
fire_volume = 100
|
||||
projectiles = 3
|
||||
deviation = 0.6
|
||||
projectile = /obj/item/projectile/arc/fragmentation/mortar
|
||||
projectile_energy_cost = 600
|
||||
|
||||
origin_tech = list(TECH_MATERIAL = 4, TECH_COMBAT = 5, TECH_ILLEGAL = 3)
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/mortar/action_checks(atom/target)
|
||||
var/turf/MT = get_turf(chassis)
|
||||
var/turf/TT = get_turf(target)
|
||||
if(!MT.outdoors || !TT.outdoors)
|
||||
to_chat(chassis.occupant, "<span class='notice'>\The [src]'s control system prevents you from firing due to a blocked firing arc.</span>")
|
||||
return 0
|
||||
return ..()
|
||||
@@ -0,0 +1,25 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot
|
||||
name = "\improper LBX AC 10 \"Scattershot\""
|
||||
desc = "A massive shotgun designed to fill a large area with pellets."
|
||||
icon_state = "mecha_scatter"
|
||||
equip_cooldown = 20
|
||||
projectile = /obj/item/projectile/bullet/pellet/shotgun/flak
|
||||
fire_sound = 'sound/weapons/Gunshot_shotgun.ogg'
|
||||
fire_volume = 80
|
||||
projectiles = 40
|
||||
projectiles_per_shot = 4
|
||||
deviation = 0.7
|
||||
projectile_energy_cost = 25
|
||||
|
||||
origin_tech = list(TECH_MATERIAL = 3, TECH_COMBAT = 4)
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot/rigged
|
||||
name = "jury-rigged shrapnel cannon"
|
||||
desc = "The remains of some unfortunate RCD now doomed to kill, rather than construct."
|
||||
icon_state = "mecha_scatter-rig"
|
||||
equip_cooldown = 30
|
||||
fire_volume = 100
|
||||
projectiles = 20
|
||||
deviation = 1
|
||||
|
||||
equip_type = EQUIP_UTILITY
|
||||
@@ -0,0 +1,33 @@
|
||||
//////////////
|
||||
//Defensive//
|
||||
//////////////
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/shocker
|
||||
name = "exosuit electrifier"
|
||||
desc = "A device to electrify the external portions of a mecha in order to increase its defensive capabilities."
|
||||
icon_state = "mecha_coil"
|
||||
equip_cooldown = 10
|
||||
energy_drain = 100
|
||||
range = RANGED
|
||||
origin_tech = list(TECH_COMBAT = 3, TECH_POWER = 6)
|
||||
var/shock_damage = 15
|
||||
var/active
|
||||
|
||||
equip_type = EQUIP_HULL
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/shocker/can_attach(obj/mecha/M as obj)
|
||||
if(..())
|
||||
if(!M.proc_res["dynattackby"] && !M.proc_res["dynattackhand"] && !M.proc_res["dynattackalien"])
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/shocker/attach(obj/mecha/M as obj)
|
||||
..()
|
||||
chassis.proc_res["dynattackby"] = src
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/shocker/proc/dynattackby(obj/item/weapon/W, mob/living/user)
|
||||
if(!action_checks(user) || !active)
|
||||
return
|
||||
user.electrocute_act(shock_damage, src)
|
||||
return chassis.dynattackby(W,user)
|
||||
@@ -0,0 +1,3 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy
|
||||
name = "general energy weapon"
|
||||
auto_rearm = 1
|
||||
@@ -0,0 +1,20 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy/ion
|
||||
equip_cooldown = 40
|
||||
name = "mkIV ion heavy cannon"
|
||||
desc = "An upscaled variant of anti-mechanical weaponry constructed by NT, such as the EW Halicon."
|
||||
icon_state = "mecha_ion"
|
||||
energy_drain = 120
|
||||
projectile = /obj/item/projectile/ion
|
||||
fire_sound = 'sound/weapons/Laser.ogg'
|
||||
|
||||
origin_tech = list(TECH_MATERIAL = 3, TECH_COMBAT = 4, TECH_MAGNET = 4)
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy/ion/rigged
|
||||
equip_cooldown = 30
|
||||
name = "jury-rigged ion cannon"
|
||||
desc = "A tesla coil modified to amplify an ionic wave, and use it as a projectile."
|
||||
icon_state = "mecha_ion-rig"
|
||||
energy_drain = 100
|
||||
projectile = /obj/item/projectile/ion/pistol
|
||||
|
||||
equip_type = EQUIP_UTILITY
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user