Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Matica
2020-01-20 14:30:40 -05:00
807 changed files with 268698 additions and 73278 deletions
+2
View File
@@ -33,3 +33,5 @@ temp.dmi
/maps/RandomZLevels/backup
/tools/midi2piano.zip
/maps/yw/backup
icons/mecha/mecha_ch.dmi
+1 -1
View File
@@ -5,7 +5,7 @@ sudo: false
env:
global:
- BYOND_MAJOR="512"
- BYOND_MINOR="1453"
- BYOND_MINOR="1488"
- MACRO_COUNT=4
matrix:
- TEST_DEFINE="MAP_TEST" TEST_FILE="code/_map_tests.dm" RUN="0"
+31
View File
@@ -0,0 +1,31 @@
#if DM_VERSION < 513
#define ismovableatom(A) (istype(A, /atom/movable))
#define islist(L) (istype(L, /list))
#define CLAMP01(x) (CLAMP(x, 0, 1))
#define CLAMP(CLVALUE,CLMIN,CLMAX) ( max( (CLMIN), min((CLVALUE), (CLMAX)) ) )
#define ATAN2(x, y) ( !(x) && !(y) ? 0 : (y) >= 0 ? arccos((x) / sqrt((x)*(x) + (y)*(y))) : -arccos((x) / sqrt((x)*(x) + (y)*(y))) )
#define TAN(x) (sin(x) / cos(x))
#define arctan(x) (arcsin(x/sqrt(1+x*x)))
//////////////////////////////////////////////////
#else
#define ismovableatom(A) ismovable(A)
#define CLAMP01(x) clamp(x, 0, 1)
#define CLAMP(CLVALUE, CLMIN, CLMAX) clamp(CLVALUE, CLMIN, CLMAX)
#define TAN(x) tan(x)
#define ATAN2(x, y) arctan(x, y)
#endif
+22
View File
@@ -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)) { \
+1 -1
View File
@@ -2,7 +2,7 @@
#define isdatum(D) istype(D, /datum)
#define isweakref(A) istype(A, /weakref)
#define islist(D) istype(D, /list)
//#define islist(D) istype(D, /list) //Built in
//---------------
#define isatom(D) istype(D, /atom)
+1 -1
View File
@@ -84,4 +84,4 @@
#define LIGHT_COLOR_INCANDESCENT_FLASHLIGHT "#FFCC66"
//Fake ambient occlusion filter
#define AMBIENT_OCCLUSION filter(type="drop_shadow", x=0, y=-2, size=4, border=4, color="#04080FAA")
#define AMBIENT_OCCLUSION filter(type="drop_shadow", x=0, y=-1, size=2, offset=2, color="#04080F55") //VOREStation Edit for prettier visuals.
-8
View File
@@ -16,7 +16,6 @@
#define TICK_USAGE_TO_MS(starting_tickusage) (TICK_DELTA_TO_MS(world.tick_usage - starting_tickusage))
#define PERCENT(val) (round((val)*100, 0.1))
#define CLAMP01(x) (CLAMP(x, 0, 1))
//time of day but automatically adjusts to the server going into the next day within the same round.
//for when you need a reliable time number that doesn't depend on byond time.
@@ -30,17 +29,12 @@
// round() acts like floor(x, 1) by default but can't handle other values
#define FLOOR(x, y) ( round((x) / (y)) * (y) )
#define CLAMP(CLVALUE,CLMIN,CLMAX) ( max( (CLMIN), min((CLVALUE), (CLMAX)) ) )
// Similar to clamp but the bottom rolls around to the top and vice versa. min is inclusive, max is exclusive
#define WRAP(val, min, max) ( min == max ? min : (val) - (round(((val) - (min))/((max) - (min))) * ((max) - (min))) )
// Real modulus that handles decimals
#define MODULUS(x, y) ( (x) - (y) * round((x) / (y)) )
// Tangent
#define TAN(x) (sin(x) / cos(x))
// Cotangent
#define COT(x) (1 / TAN(x))
@@ -50,8 +44,6 @@
// Cosecant
#define CSC(x) (1 / sin(x))
#define ATAN2(x, y) ( !(x) && !(y) ? 0 : (y) >= 0 ? arccos((x) / sqrt((x)*(x) + (y)*(y))) : -arccos((x) / sqrt((x)*(x) + (y)*(y))) )
// Greatest Common Divisor - Euclid's algorithm
/proc/GCD(a, b)
return b ? GCD(b, (a) % (b)) : a
+4 -2
View File
@@ -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
+2
View File
@@ -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"
+186 -178
View File
@@ -1,179 +1,187 @@
//max channel is 1024. Only go lower from here, because byond tends to pick the first availiable channel to play sounds on
#define CHANNEL_LOBBYMUSIC 1024
#define CHANNEL_ADMIN 1023
#define CHANNEL_VOX 1022
#define CHANNEL_JUKEBOX 1021
#define CHANNEL_HEARTBEAT 1020 //sound channel for heartbeats
#define CHANNEL_AMBIENCE_FORCED 1019
#define CHANNEL_AMBIENCE 1018
#define CHANNEL_BUZZ 1017
#define CHANNEL_BICYCLE 1016
#define CHANNEL_PREYLOOP 1015 //VORESTATION ADD - Fancy Sound Loop channel
//THIS SHOULD ALWAYS BE THE LOWEST ONE!
//KEEP IT UPDATED
#define CHANNEL_HIGHEST_AVAILABLE 1014 //VORESTATION EDIT - Fancy Sound Loop channel from 1015
#define SOUND_MINIMUM_PRESSURE 10
#define FALLOFF_SOUNDS 0.5
//Sound environment defines. Reverb preset for sounds played in an area, see sound datum reference for more.
#define GENERIC 0
#define PADDED_CELL 1
#define ROOM 2
#define BATHROOM 3
#define LIVINGROOM 4
#define STONEROOM 5
#define AUDITORIUM 6
#define CONCERT_HALL 7
#define CAVE 8
#define ARENA 9
#define HANGAR 10
#define CARPETED_HALLWAY 11
#define HALLWAY 12
#define STONE_CORRIDOR 13
#define ALLEY 14
#define FOREST 15
#define CITY 16
#define MOUNTAINS 17
#define QUARRY 18
#define PLAIN 19
#define PARKING_LOT 20
#define SEWER_PIPE 21
#define UNDERWATER 22
#define DRUGGED 23
#define DIZZY 24
#define PSYCHOTIC 25
#define STANDARD_STATION STONEROOM
#define LARGE_ENCLOSED HANGAR
#define SMALL_ENCLOSED BATHROOM
#define TUNNEL_ENCLOSED CAVE
#define LARGE_SOFTFLOOR CARPETED_HALLWAY
#define MEDIUM_SOFTFLOOR LIVINGROOM
#define SMALL_SOFTFLOOR ROOM
#define ASTEROID CAVE
#define SPACE UNDERWATER
// Ambience presets.
// All you need to do to make an area play one of these is set their ambience var to one of these lists.
// You can even combine them by adding them together, since they're just lists, however you'd have to do that in initialization.
// For weird alien places like the crashed UFO.
#define AMBIENCE_OTHERWORLDLY list(\
'sound/ambience/otherworldly/otherworldly1.ogg',\
'sound/ambience/otherworldly/otherworldly2.ogg',\
'sound/ambience/otherworldly/otherworldly3.ogg'\
)
// Restricted, military, or mercenary aligned locations like the armory, the merc ship/base, BSD, etc.
#define AMBIENCE_HIGHSEC list(\
'sound/ambience/highsec/highsec1.ogg',\
'sound/ambience/highsec/highsec2.ogg'\
)
// Ruined structures found on the surface or in the caves.
#define AMBIENCE_RUINS list(\
'sound/ambience/ruins/ruins1.ogg',\
'sound/ambience/ruins/ruins2.ogg',\
'sound/ambience/ruins/ruins3.ogg',\
'sound/ambience/ruins/ruins4.ogg',\
'sound/ambience/ruins/ruins5.ogg',\
'sound/ambience/ruins/ruins6.ogg'\
)
// Similar to the above, but for more technology/signaling based ruins.
#define AMBIENCE_TECH_RUINS list(\
'sound/ambience/tech_ruins/tech_ruins1.ogg',\
'sound/ambience/tech_ruins/tech_ruins2.ogg',\
'sound/ambience/tech_ruins/tech_ruins3.ogg'\
)
// The actual chapel room, and maybe some other places of worship.
#define AMBIENCE_CHAPEL list(\
'sound/ambience/chapel/chapel1.ogg',\
'sound/ambience/chapel/chapel2.ogg',\
'sound/ambience/chapel/chapel3.ogg',\
'sound/ambience/chapel/chapel4.ogg'\
)
// For peaceful, serene areas, distinct from the Chapel.
#define AMBIENCE_HOLY list(\
'sound/ambience/holy/holy1.ogg',\
'sound/ambience/holy/holy2.ogg'\
)
// Generic sounds for less special rooms.
#define AMBIENCE_GENERIC list(\
'sound/ambience/generic/generic1.ogg',\
'sound/ambience/generic/generic2.ogg',\
'sound/ambience/generic/generic3.ogg',\
'sound/ambience/generic/generic4.ogg'\
)
// Sounds of PA announcements, presumably involving shuttles?
#define AMBIENCE_ARRIVALS list(\
'sound/ambience/arrivals/arrivals1.ogg',\
'sound/ambience/arrivals/arrivals2.ogg'\
)
// Sounds suitable for being inside dark, tight corridors in the underbelly of the station.
#define AMBIENCE_MAINTENANCE list(\
'sound/ambience/maintenance/maintenance1.ogg',\
'sound/ambience/maintenance/maintenance2.ogg',\
'sound/ambience/maintenance/maintenance3.ogg',\
'sound/ambience/maintenance/maintenance4.ogg',\
'sound/ambience/maintenance/maintenance5.ogg',\
'sound/ambience/maintenance/maintenance6.ogg'\
)
// Life support machinery at work, keeping everyone breathing.
#define AMBIENCE_ENGINEERING list(\
'sound/ambience/engineering/engineering1.ogg',\
'sound/ambience/engineering/engineering2.ogg',\
'sound/ambience/engineering/engineering3.ogg'\
)
// Creepy AI/borg stuff.
#define AMBIENCE_AI list(\
'sound/ambience/ai/ai1.ogg'\
)
// Peaceful sounds when floating in the void.
#define AMBIENCE_SPACE list(\
'sound/ambience/space/space_serithi.ogg',\
'sound/ambience/space/space1.ogg'\
)
// Vaguely spooky sounds when around dead things.
#define AMBIENCE_GHOSTLY list(\
'sound/ambience/ghostly/ghostly1.ogg',\
'sound/ambience/ghostly/ghostly2.ogg'\
)
// Concerning sounds, for when one discovers something horrible happened in a PoI.
#define AMBIENCE_FOREBODING list(\
'sound/ambience/foreboding/foreboding1.ogg',\
'sound/ambience/foreboding/foreboding2.ogg'\
)
// Ambience heard when aboveground on Sif and not in a Point of Interest.
#define AMBIENCE_SIF list(\
'sound/ambience/sif/sif1.ogg'\
)
// If we ever add geothermal PoIs or other places that are really hot, this will do.
#define AMBIENCE_LAVA list(\
'sound/ambience/lava/lava1.ogg'\
)
// Cult-y ambience, for some PoIs, and maybe when the cultists darken the world with the ritual.
#define AMBIENCE_UNHOLY list(\
'sound/ambience/unholy/unholy1.ogg'\
)
// For the memes.
#define AMBIENCE_AESTHETIC list(\
'sound/ambience/vaporwave.ogg'\
//max channel is 1024. Only go lower from here, because byond tends to pick the first availiable channel to play sounds on
#define CHANNEL_LOBBYMUSIC 1024
#define CHANNEL_ADMIN 1023
#define CHANNEL_VOX 1022
#define CHANNEL_JUKEBOX 1021
#define CHANNEL_HEARTBEAT 1020 //sound channel for heartbeats
#define CHANNEL_AMBIENCE_FORCED 1019
#define CHANNEL_AMBIENCE 1018
#define CHANNEL_BUZZ 1017
#define CHANNEL_BICYCLE 1016
#define CHANNEL_PREYLOOP 1015 //VORESTATION ADD - Fancy Sound Loop channel
//THIS SHOULD ALWAYS BE THE LOWEST ONE!
//KEEP IT UPDATED
#define CHANNEL_HIGHEST_AVAILABLE 1014 //VORESTATION EDIT - Fancy Sound Loop channel from 1015
#define SOUND_MINIMUM_PRESSURE 10
#define FALLOFF_SOUNDS 0.5
//Sound environment defines. Reverb preset for sounds played in an area, see sound datum reference for more.
#define GENERIC 0
#define PADDED_CELL 1
#define ROOM 2
#define BATHROOM 3
#define LIVINGROOM 4
#define STONEROOM 5
#define AUDITORIUM 6
#define CONCERT_HALL 7
#define CAVE 8
#define ARENA 9
#define HANGAR 10
#define CARPETED_HALLWAY 11
#define HALLWAY 12
#define STONE_CORRIDOR 13
#define ALLEY 14
#define FOREST 15
#define CITY 16
#define MOUNTAINS 17
#define QUARRY 18
#define PLAIN 19
#define PARKING_LOT 20
#define SEWER_PIPE 21
#define UNDERWATER 22
#define DRUGGED 23
#define DIZZY 24
#define PSYCHOTIC 25
#define STANDARD_STATION STONEROOM
#define LARGE_ENCLOSED HANGAR
#define SMALL_ENCLOSED BATHROOM
#define TUNNEL_ENCLOSED CAVE
#define LARGE_SOFTFLOOR CARPETED_HALLWAY
#define MEDIUM_SOFTFLOOR LIVINGROOM
#define SMALL_SOFTFLOOR ROOM
#define ASTEROID CAVE
#define SPACE UNDERWATER
// Ambience presets.
// All you need to do to make an area play one of these is set their ambience var to one of these lists.
// You can even combine them by adding them together, since they're just lists, however you'd have to do that in initialization.
// For weird alien places like the crashed UFO.
#define AMBIENCE_OTHERWORLDLY list(\
'sound/ambience/otherworldly/otherworldly1.ogg',\
'sound/ambience/otherworldly/otherworldly2.ogg',\
'sound/ambience/otherworldly/otherworldly3.ogg'\
)
// Restricted, military, or mercenary aligned locations like the armory, the merc ship/base, BSD, etc.
#define AMBIENCE_HIGHSEC list(\
'sound/ambience/highsec/highsec1.ogg',\
'sound/ambience/highsec/highsec2.ogg'\
)
// Ruined structures found on the surface or in the caves.
#define AMBIENCE_RUINS list(\
'sound/ambience/ruins/ruins1.ogg',\
'sound/ambience/ruins/ruins2.ogg',\
'sound/ambience/ruins/ruins3.ogg',\
'sound/ambience/ruins/ruins4.ogg',\
'sound/ambience/ruins/ruins5.ogg',\
'sound/ambience/ruins/ruins6.ogg'\
)
// Similar to the above, but for more technology/signaling based ruins.
#define AMBIENCE_TECH_RUINS list(\
'sound/ambience/tech_ruins/tech_ruins1.ogg',\
'sound/ambience/tech_ruins/tech_ruins2.ogg',\
'sound/ambience/tech_ruins/tech_ruins3.ogg'\
)
// The actual chapel room, and maybe some other places of worship.
#define AMBIENCE_CHAPEL list(\
'sound/ambience/chapel/chapel1.ogg',\
'sound/ambience/chapel/chapel2.ogg',\
'sound/ambience/chapel/chapel3.ogg',\
'sound/ambience/chapel/chapel4.ogg'\
)
// For peaceful, serene areas, distinct from the Chapel.
#define AMBIENCE_HOLY list(\
'sound/ambience/holy/holy1.ogg',\
'sound/ambience/holy/holy2.ogg'\
)
// Generic sounds for less special rooms.
#define AMBIENCE_GENERIC list(\
'sound/ambience/generic/generic1.ogg',\
'sound/ambience/generic/generic2.ogg',\
'sound/ambience/generic/generic3.ogg',\
'sound/ambience/generic/generic4.ogg'\
)
// Sounds of PA announcements, presumably involving shuttles?
#define AMBIENCE_ARRIVALS list(\
'sound/ambience/arrivals/arrivals1.ogg',\
'sound/ambience/arrivals/arrivals2.ogg'\
)
// Sounds suitable for being inside dark, tight corridors in the underbelly of the station.
#define AMBIENCE_MAINTENANCE list(\
'sound/ambience/maintenance/maintenance1.ogg',\
'sound/ambience/maintenance/maintenance2.ogg',\
'sound/ambience/maintenance/maintenance3.ogg',\
'sound/ambience/maintenance/maintenance4.ogg',\
'sound/ambience/maintenance/maintenance5.ogg',\
'sound/ambience/maintenance/maintenance6.ogg'\
)
// Life support machinery at work, keeping everyone breathing.
#define AMBIENCE_ENGINEERING list(\
'sound/ambience/engineering/engineering1.ogg',\
'sound/ambience/engineering/engineering2.ogg',\
'sound/ambience/engineering/engineering3.ogg'\
)
// Creepy AI/borg stuff.
#define AMBIENCE_AI list(\
'sound/ambience/ai/ai1.ogg'\
)
// Peaceful sounds when floating in the void.
#define AMBIENCE_SPACE list(\
'sound/ambience/space/space_serithi.ogg',\
'sound/ambience/space/space1.ogg'\
)
// Vaguely spooky sounds when around dead things.
#define AMBIENCE_GHOSTLY list(\
'sound/ambience/ghostly/ghostly1.ogg',\
'sound/ambience/ghostly/ghostly2.ogg'\
)
// Concerning sounds, for when one discovers something horrible happened in a PoI.
#define AMBIENCE_FOREBODING list(\
'sound/ambience/foreboding/foreboding1.ogg',\
'sound/ambience/foreboding/foreboding2.ogg'\
)
// Ambience heard when aboveground on Sif and not in a Point of Interest.
#define AMBIENCE_SIF list(\
'sound/ambience/sif/sif1.ogg'\
)
// If we ever add geothermal PoIs or other places that are really hot, this will do.
#define AMBIENCE_LAVA list(\
'sound/ambience/lava/lava1.ogg'\
)
// Cult-y ambience, for some PoIs, and maybe when the cultists darken the world with the ritual.
#define AMBIENCE_UNHOLY list(\
'sound/ambience/unholy/unholy1.ogg'\
)
// For the memes.
#define AMBIENCE_AESTHETIC list(\
'sound/ambience/vaporwave.ogg'\
)
//CHOMPedit: Exploration outpost ambience. Current tracks taken from Rainworld and Natural Selection 2.
#define AMBIENCE_EXPOUTPOST list(\
'sound/ambience/expoutpost/expoutpost1.ogg',\
'sound/ambience/expoutpost/expoutpost2.ogg',\
'sound/ambience/expoutpost/expoutpost3.ogg',\
'sound/ambience/expoutpost/expoutpost4.ogg'\
)
+2 -2
View File
@@ -2,5 +2,5 @@
#define TYPEID_NULL "0"
#define TYPEID_NORMAL_LIST "f"
//helper macros
#define GET_TYPEID(ref) ( ( (lentext(ref) <= 10) ? "TYPEID_NULL" : copytext(ref, 4, lentext(ref)-6) ) )
#define IS_NORMAL_LIST(L) (GET_TYPEID("\ref[L]") == TYPEID_NORMAL_LIST)
#define GET_TYPEID(ref) ( ( (length(ref) <= 10) ? "TYPEID_NULL" : copytext(ref, 4, length(ref)-6) ) )
#define IS_NORMAL_LIST(L) (GET_TYPEID("\ref[L]") == TYPEID_NORMAL_LIST)
+3 -3
View File
@@ -28,7 +28,7 @@ json_reader
src.json = json
. = new/list()
src.i = 1
while(src.i <= lentext(json))
while(src.i <= length(json))
var/char = get_char()
if(is_whitespace(char))
i++
@@ -46,7 +46,7 @@ json_reader
read_word()
var/val = ""
while(i <= lentext(json))
while(i <= length(json))
var/char = get_char()
if(is_whitespace(char) || symbols.Find(char))
i-- // let scanner handle this character
@@ -58,7 +58,7 @@ json_reader
var
escape = FALSE
val = ""
while(++i <= lentext(json))
while(++i <= length(json))
var/char = get_char()
if(escape)
switch(char)
+1 -1
View File
@@ -43,7 +43,7 @@ json_writer
var/static/list/json_escape = list("\\" = "\\\\", "\"" = "\\\"", "\n" = "\\n")
for(var/targ in json_escape)
var/start = 1
while(start <= lentext(txt))
while(start <= length(txt))
var/i = findtext(txt, targ, start)
if(!i)
break
+1
View File
@@ -0,0 +1 @@
GLOBAL_LIST_INIT(speech_toppings, list("|" = "i", "+" = "b", "_" = "u"))
+8
View File
@@ -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
+55
View File
@@ -0,0 +1,55 @@
//This is for the round end stats system.
//roundstat is used for easy finding of the variables, if you ever want to delete all of this,
//just search roundstat and you'll find everywhere this thing reaches into.
//It used to be bazinga but it only fly with microwaves.
GLOBAL_VAR_INIT(cans_opened_roundstat, 0)
GLOBAL_VAR_INIT(lights_switched_on_roundstat, 0)
GLOBAL_VAR_INIT(turbo_lift_floors_moved_roundstat, 0)
GLOBAL_VAR_INIT(lost_limbs_shift_roundstat, 0)
GLOBAL_VAR_INIT(seed_planted_shift_roundstat, 0)
GLOBAL_VAR_INIT(step_taken_shift_roundstat, 0)
GLOBAL_VAR_INIT(destroyed_research_items_roundstat, 0)
GLOBAL_VAR_INIT(items_sold_shift_roundstat, 0)
GLOBAL_VAR_INIT(disposals_flush_shift_roundstat, 0)
GLOBAL_VAR_INIT(rocks_drilled_roundstat, 0)
GLOBAL_VAR_INIT(mech_destroyed_roundstat, 0)
/hook/roundend/proc/RoundEnd()//bazinga
var/stats_printed_roundstat = 0 //Placeholder used as a counter.
var/list/valid_stats_list = list() //This is to be populated with the good shit
if(GLOB.cans_opened_roundstat > 0)
valid_stats_list.Add("[GLOB.cans_opened_roundstat] cans were drank today!")
if(GLOB.lights_switched_on_roundstat > 0)
valid_stats_list.Add("[GLOB.lights_switched_on_roundstat] light switches were flipped today!")
if(GLOB.turbo_lift_floors_moved_roundstat > 20)
valid_stats_list.Add("The elevator moved up [GLOB.turbo_lift_floors_moved_roundstat] floors today!")
if(GLOB.lost_limbs_shift_roundstat > 1)
valid_stats_list.Add("[GLOB.lost_limbs_shift_roundstat] limbs left their owners bodies this shift, oh no!")
if(GLOB.seed_planted_shift_roundstat > 20)
valid_stats_list.Add("[GLOB.seed_planted_shift_roundstat] were planted according to our sensors this shift.")
if(GLOB.step_taken_shift_roundstat > 900)
valid_stats_list.Add("The employees walked a total of [GLOB.step_taken_shift_roundstat] steps for this shift! It should put them on the road to fitness!")
if(GLOB.destroyed_research_items_roundstat > 13)
valid_stats_list.Add("[GLOB.destroyed_research_items_roundstat] objects were destroyed in the name of Science! Keep it up!")
if(GLOB.items_sold_shift_roundstat > 15)
valid_stats_list.Add("The vending machines sold [GLOB.items_sold_shift_roundstat] items today.")
if(GLOB.disposals_flush_shift_roundstat > 40)
valid_stats_list.Add("The disposal system flushed a whole [GLOB.disposals_flush_shift_roundstat] times for this shift. We should really invest in waste treatement.")
if(GLOB.rocks_drilled_roundstat > 80)
valid_stats_list.Add("Our strong miners pulverized a whole [GLOB.rocks_drilled_roundstat] into piles of pathetic rubble.")
if(GLOB.mech_destroyed_roundstat > 1)
valid_stats_list.Add("How did you guys manage to break a mech? Those are expensive!")
to_world("<B>Shift trivia!</B>")
while(stats_printed_roundstat < 6)
var/body = pick(valid_stats_list)
stats_printed_roundstat++
to_world("[body]")//line that deletes the thing you just posted.
valid_stats_list -= body
+7 -14
View File
@@ -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
+2 -3
View File
@@ -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
+2 -2
View File
@@ -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)
+6 -6
View File
@@ -16,7 +16,7 @@
// Run all strings to be used in an SQL query through this proc first to properly escape out injection attempts.
/proc/sanitizeSQL(var/t as text)
var/sqltext = dbcon.Quote(t);
return copytext(sqltext, 2, lentext(sqltext));//Quote() adds quotes around input, we already do that
return copytext(sqltext, 2, length(sqltext));//Quote() adds quotes around input, we already do that
/*
* Text sanitization
@@ -249,9 +249,9 @@
//This is used for fingerprints
/proc/stringmerge(var/text,var/compare,replace = "*")
var/newtext = text
if(lentext(text) != lentext(compare))
if(length(text) != length(compare))
return 0
for(var/i = 1, i < lentext(text), i++)
for(var/i = 1, i < length(text), i++)
var/a = copytext(text,i,i+1)
var/b = copytext(compare,i,i+1)
//if it isn't both the same letter, or if they are both the replacement character
@@ -271,7 +271,7 @@
if(!text || !character)
return 0
var/count = 0
for(var/i = 1, i <= lentext(text), i++)
for(var/i = 1, i <= length(text), i++)
var/a = copytext(text,i,i+1)
if(a == character)
count++
@@ -286,8 +286,8 @@
//Used in preferences' SetFlavorText and human's set_flavor verb
//Previews a string of len or less length
proc/TextPreview(var/string,var/len=40)
if(lentext(string) <= len)
if(!lentext(string))
if(length(string) <= len)
if(!length(string))
return "\[...\]"
else
return string
-4
View File
@@ -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
+1 -1
View File
@@ -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)
+2 -1
View File
@@ -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"
+5
View File
@@ -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()
+31 -2
View File
@@ -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
+3 -3
View File
@@ -7,7 +7,7 @@ datum/controller/transfer_controller
var/shift_last_vote = 0 //VOREStation Edit
datum/controller/transfer_controller/New()
timerbuffer = config.vote_autotransfer_initial
shift_hard_end = config.vote_autotransfer_initial + (config.vote_autotransfer_interval * 4) //VOREStation Edit //Change this "1" to how many extend votes you want there to be.
shift_hard_end = config.vote_autotransfer_initial + (config.vote_autotransfer_interval * 3) //CHOMPStation Edit //Change this "1" to how many extend votes you want there to be.
shift_last_vote = shift_hard_end - config.vote_autotransfer_interval //VOREStation Edit
START_PROCESSING(SSobj, src)
@@ -17,9 +17,9 @@ datum/controller/transfer_controller/Destroy()
datum/controller/transfer_controller/process()
currenttick = currenttick + 1
//VOREStation Edit START
if (round_duration_in_ticks >= shift_last_vote - 2 MINUTES)
if (round_duration_in_ticks >= shift_last_vote - 2 MINUTES)
shift_last_vote = 999999999999 //Setting to a stupidly high number since it'll be not used again.
world << "Warning: This upcoming round-extend vote will be your ONLY extend vote. Wrap up your scenes in the next 4 fuckin hours if the round is extended." //YAWN EDIT NIGGA VOREStation Edit
to_world("<b>Warning: This upcoming round-extend vote will be your last chance to vote for shift extension. Wrap up your scenes in the next 60 minutes if the round is extended.</b>") //CHOMPStation Edit
if (round_duration_in_ticks >= shift_hard_end - 1 MINUTE)
init_shift_change(null, 1)
shift_hard_end = timerbuffer + config.vote_autotransfer_interval //If shuttle somehow gets recalled, let's force it to call again next time a vote would occur.
+47 -3
View File
@@ -63,8 +63,8 @@ var/list/gamemode_cache = list()
var/allow_random_events = 0 // enables random events mid-round when set to 1
var/enable_game_master = 0 // enables the 'smart' event system.
var/allow_ai = 1 // allow ai job
var/allow_ai_shells = TRUE // allow AIs to enter and leave special borg shells at will, and for those shells to be buildable.
var/give_free_ai_shell = TRUE // allows a specific spawner object to instantiate a premade AI Shell
var/allow_ai_shells = FALSE // allow AIs to enter and leave special borg shells at will, and for those shells to be buildable.
var/give_free_ai_shell = FALSE // allows a specific spawner object to instantiate a premade AI Shell
var/hostedby = null
var/respawn = 1
var/guest_jobban = 1
@@ -104,6 +104,13 @@ var/list/gamemode_cache = list()
var/panic_bunker = 0
var/paranoia_logging = 0
var/ip_reputation = FALSE //Should we query IPs to get scores? Generates HTTP traffic to an API service.
var/ipr_email //Left null because you MUST specify one otherwise you're making the internet worse.
var/ipr_block_bad_ips = FALSE //Should we block anyone who meets the minimum score below? Otherwise we just log it (If paranoia logging is on, visibly in chat).
var/ipr_bad_score = 1 //The API returns a value between 0 and 1 (inclusive), with 1 being 'definitely VPN/Tor/Proxy'. Values equal/above this var are considered bad.
var/ipr_allow_existing = FALSE //Should we allow known players to use VPNs/Proxies? If the player is already banned then obviously they still can't connect.
var/ipr_minimum_age = 5 //How many days before a player is considered 'fine' for the purposes of allowing them to use VPNs.
var/serverurl
var/server
var/banappeals
@@ -235,8 +242,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,18 +792,53 @@ 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
if ("paranoia_logging")
config.paranoia_logging = 1
if("ip_reputation")
config.ip_reputation = 1
if("ipr_email")
config.ipr_email = value
if("ipr_block_bad_ips")
config.ipr_block_bad_ips = 1
if("ipr_bad_score")
config.ipr_bad_score = text2num(value)
if("ipr_allow_existing")
config.ipr_allow_existing = 1
if("ipr_minimum_age")
config.ipr_minimum_age = text2num(value)
if("random_submap_orientation")
config.random_submap_orientation = 1
if("autostart_solars")
config.autostart_solars = TRUE
else
log_misc("Unknown setting in configuration: '[name]'")
@@ -975,4 +1019,4 @@ var/list/gamemode_cache = list()
if(world.system_type == UNIX)
config.python_path = "/usr/bin/env python2"
else //probably windows, if not this should work anyway
config.python_path = "python"
config.python_path = "python"
+41
View File
@@ -0,0 +1,41 @@
// Making this file to allow us to easily understand the location of any modifications to the config file made by Chompers and to try and prevent any conflicts happening in the future.
// Basically a copy pasta from virgo's configuration.dm file but it'll make life easer for us to just toggle on/off.
/datum/configuration
var/discord_restriction = 0
var/use_jobwhitelist = 1
var/emojis = 1
/hook/startup/proc/read_ch_config()
var/list/Lines = file2list("config/config.txt")
for(var/t in Lines)
if(!t) continue
t = trim(t)
if (length(t) == 0)
continue
else if (copytext(t, 1, 2) == "#")
continue
var/pos = findtext(t, " ")
var/name = null
// var/value = null //Commenting out because config doesn't contain any values at the moment. - Jonathan
if (pos)
name = lowertext(copytext(t, 1, pos))
// value = copytext(t, pos + 1) //Commenting out because config doesn't contain any values at the moment. - Jonathan
else
name = lowertext(t)
if (!name)
continue
switch (name)
if ("discord_restriction")
config.discord_restriction = 1
if ("use_jobwhitelist")
config.use_jobwhitelist = 1
if ("disable_emojis")
config.emojis = 0
return 1
+21 -8
View File
@@ -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)
+5 -6
View File
@@ -71,7 +71,6 @@ SUBSYSTEM_DEF(timer)
for(var/I in second_queue)
log_world(get_timer_debug_string(I))
var/cut_start_index = 1
var/next_clienttime_timer_index = 0
var/len = length(clienttime_timers)
@@ -101,7 +100,7 @@ SUBSYSTEM_DEF(timer)
if (next_clienttime_timer_index)
clienttime_timers.Cut(cut_start_index,next_clienttime_timer_index+1)
clienttime_timers.Cut(1, next_clienttime_timer_index+1)
if (MC_TICK_CHECK)
return
@@ -259,7 +258,7 @@ SUBSYSTEM_DEF(timer)
if (!length(alltimers))
return
sortTim(alltimers, .proc/cmp_timer)
sortTim(alltimers, /proc/cmp_timer)
var/datum/timedevent/head = alltimers[1]
@@ -342,8 +341,8 @@ SUBSYSTEM_DEF(timer)
if (flags & TIMER_STOPPABLE)
id = num2text(nextid, 100)
if (nextid >= SHORT_REAL_LIMIT)
nextid += min(1, 2**round(nextid/SHORT_REAL_LIMIT))
if (nextid >= TIMER_ID_MAX)
nextid += min(1, 2**round(nextid/TIMER_ID_MAX))
else
nextid++
SStimer.timer_id_dict[id] = src
@@ -519,4 +518,4 @@ SUBSYSTEM_DEF(timer)
#undef BUCKET_LEN
#undef BUCKET_POS
#undef TIMER_MAX
#undef TIMER_ID_MAX
#undef TIMER_ID_MAX
+1 -1
View File
@@ -220,7 +220,7 @@ SUBSYSTEM_DEF(vote)
if(ticker.current_state <= GAME_STATE_SETTING_UP)
initiator_key << "The crew transfer button has been disabled!"
return 0
question = "Your PDA beeps with a message from Central. Would you like an additional four hours to finish ongoing projects?" //Yawn Wider Edit
question = "Your PDA beeps with a message from Central. Would you like an additional hour to finish ongoing projects?" //Yawn Wider Edit //CHOMP EDIT: Changed to 'one' hour.
choices.Add("Initiate Crew Transfer", "Extend the Shift") //VOREStation Edit
if(VOTE_ADD_ANTAGONIST)
if(!config.allow_extra_antags || ticker.current_state >= GAME_STATE_SETTING_UP)
+391
View File
@@ -0,0 +1,391 @@
SUBSYSTEM_DEF(vote)
name = "Vote"
wait = 10
priority = FIRE_PRIORITY_VOTE
runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
flags = SS_KEEP_TIMING | SS_NO_INIT
var/list/round_voters = list()
//Current vote
var/initiator
var/started_time
var/time_remaining
var/duration
var/mode
var/question
var/list/choices = list()
var/list/gamemode_names = list()
var/list/voted = list()
var/list/current_votes = list()
var/list/additional_text = list()
/datum/controller/subsystem/vote/fire(resumed)
if(mode)
time_remaining = round((started_time + duration - world.time)/10)
if(mode == VOTE_GAMEMODE && ticker.current_state >= GAME_STATE_SETTING_UP)
to_chat(world, "<b>Gamemode vote aborted: Game has already started.</b>")
reset()
return
if(time_remaining <= 0)
result()
reset()
/datum/controller/subsystem/vote/proc/autotransfer()
// Before doing the vote, see if anyone is playing.
// If not, just do the transfer.
var/players_are_in_round = FALSE
for(var/a in player_list) // Mobs with clients attached.
var/mob/living/L = a
if(!istype(L)) // Exclude ghosts and other weird things.
continue
if(L.stat == DEAD) // Dead mobs aren't playing.
continue
// Everything else is, however.
players_are_in_round = TRUE
break
if(!players_are_in_round)
log_debug("The crew transfer shuttle would have been called at vote time due to no players being present.") //YW Edit
// init_shift_change(null, 1) //YW Edit
return
initiate_vote(VOTE_CREW_TRANSFER, "the server", 1)
log_debug("The server has called a crew transfer vote.")
/datum/controller/subsystem/vote/proc/autogamemode()
initiate_vote(VOTE_GAMEMODE, "the server", 1)
log_debug("The server has called a gamemode vote.")
/datum/controller/subsystem/vote/proc/reset()
initiator = null
started_time = null
duration = null
time_remaining = null
mode = null
question = null
choices.Cut()
voted.Cut()
current_votes.Cut()
additional_text.Cut()
/datum/controller/subsystem/vote/proc/get_result() // Get the highest number of votes
var/greatest_votes = 0
var/total_votes = 0
for(var/option in choices)
var/votes = choices[option]
total_votes += votes
if(votes > greatest_votes)
greatest_votes = votes
if(!config.vote_no_default && choices.len) // Default-vote for everyone who didn't vote
var/non_voters = (GLOB.clients.len - total_votes)
if(non_voters > 0)
if(mode == VOTE_RESTART)
choices["Continue Playing"] += non_voters
if(choices["Continue Playing"] >= greatest_votes)
greatest_votes = choices["Continue Playing"]
else if(mode == VOTE_GAMEMODE)
if(master_mode in choices)
choices[master_mode] += non_voters
if(choices[master_mode] >= greatest_votes)
greatest_votes = choices[master_mode]
else if(mode == VOTE_CREW_TRANSFER)
var/factor = 0.5
switch(world.time / (10 * 60)) // minutes
if(0 to 60)
factor = 0.5
if(61 to 120)
factor = 0.8
if(121 to 240)
factor = 1
if(241 to 300)
factor = 1.2
else
factor = 1.4
choices["Initiate Crew Transfer"] = round(choices["Initiate Crew Transfer"] * factor)
world << "<font color='#AD5AAD'>Crew Transfer Factor: [factor]</font>"
greatest_votes = max(choices["Initiate Crew Transfer"], choices["Extend the Shift"]) //VOREStation Edit
. = list() // Get all options with that many votes and return them in a list
if(greatest_votes)
for(var/option in choices)
if(choices[option] == greatest_votes)
. += option
/datum/controller/subsystem/vote/proc/announce_result()
var/list/winners = get_result()
var/text
if(winners.len > 0)
if(winners.len > 1)
if(mode != VOTE_GAMEMODE || ticker.hide_mode == 0) // Here we are making sure we don't announce potential game modes
text = "<b>Vote Tied Between:</b>\n"
for(var/option in winners)
text += "\t[option]\n"
. = pick(winners)
for(var/key in current_votes)
if(choices[current_votes[key]] == .)
round_voters += key // Keep track of who voted for the winning round.
if(mode != VOTE_GAMEMODE || . == "Extended" || ticker.hide_mode == 0) // Announce Extended gamemode, but not other gamemodes
text += "<b>Vote Result: [mode == VOTE_GAMEMODE ? gamemode_names[.] : .]</b>"
else
text += "<b>The vote has ended.</b>"
else
text += "<b>Vote Result: Inconclusive - No Votes!</b>"
if(mode == VOTE_ADD_ANTAGONIST)
antag_add_failed = 1
log_vote(text)
to_chat(world, "<font color='#AD5AAD'>[text]</font>")
/datum/controller/subsystem/vote/proc/result()
. = announce_result()
var/restart = 0
if(.)
switch(mode)
if(VOTE_RESTART)
if(. == "Restart Round")
restart = 1
if(VOTE_GAMEMODE)
if(master_mode != .)
world.save_mode(.)
if(ticker && ticker.mode)
restart = 1
else
master_mode = .
if(VOTE_CREW_TRANSFER)
if(. == "Initiate Crew Transfer")
init_shift_change(null, 1)
if(VOTE_ADD_ANTAGONIST)
if(isnull(.) || . == "None")
antag_add_failed = 1
else
additional_antag_types |= antag_names_to_ids[.]
if(mode == VOTE_GAMEMODE) //fire this even if the vote fails.
if(!round_progressing)
round_progressing = 1
world << "<font color='red'><b>The round will start soon.</b></font>"
if(restart)
world << "World restarting due to vote..."
feedback_set_details("end_error", "restart vote")
if(blackbox)
blackbox.save_all_data_to_sql()
sleep(50)
log_game("Rebooting due to restart vote")
world.Reboot()
/datum/controller/subsystem/vote/proc/submit_vote(ckey, newVote)
if(mode)
if(config.vote_no_dead && usr.stat == DEAD && !usr.client.holder)
return
if(current_votes[ckey])
choices[choices[current_votes[ckey]]]--
if(newVote && newVote >= 1 && newVote <= choices.len)
choices[choices[newVote]]++
current_votes[ckey] = newVote
else
current_votes[ckey] = null
/datum/controller/subsystem/vote/proc/initiate_vote(vote_type, initiator_key, automatic = FALSE, time = config.vote_period)
if(!mode)
if(started_time != null && !(check_rights(R_ADMIN) || automatic))
var/next_allowed_time = (started_time + config.vote_delay)
if(next_allowed_time > world.time)
return 0
reset()
switch(vote_type)
if(VOTE_RESTART)
choices.Add("Restart Round", "Continue Playing")
if(VOTE_GAMEMODE)
if(ticker.current_state >= GAME_STATE_SETTING_UP)
return 0
choices.Add(config.votable_modes)
for(var/F in choices)
var/datum/game_mode/M = gamemode_cache[F]
if(!M)
continue
gamemode_names[M.config_tag] = capitalize(M.name) //It's ugly to put this here but it works
additional_text.Add("<td align = 'center'>[M.required_players]</td>")
gamemode_names["secret"] = "Secret"
if(VOTE_CREW_TRANSFER)
if(!check_rights(R_ADMIN|R_MOD, 0)) // The gods care not for the affairs of the mortals
if(get_security_level() == "red" || get_security_level() == "delta")
initiator_key << "The current alert status is too high to call for a crew transfer!"
return 0
if(ticker.current_state <= GAME_STATE_SETTING_UP)
initiator_key << "The crew transfer button has been disabled!"
return 0
question = "Your PDA beeps with a message from Central. Would you like an additional hour to finish ongoing projects?" //Yawn Wider Edit //CHOMP EDIT: Changed to 'one' hour.
choices.Add("Initiate Crew Transfer", "Extend the Shift") //VOREStation Edit
if(VOTE_ADD_ANTAGONIST)
if(!config.allow_extra_antags || ticker.current_state >= GAME_STATE_SETTING_UP)
return 0
for(var/antag_type in all_antag_types)
var/datum/antagonist/antag = all_antag_types[antag_type]
if(!(antag.id in additional_antag_types) && antag.is_votable())
choices.Add(antag.role_text)
choices.Add("None")
if(VOTE_CUSTOM)
question = sanitizeSafe(input(usr, "What is the vote for?") as text|null)
if(!question)
return 0
for(var/i = 1 to 10)
var/option = capitalize(sanitize(input(usr, "Please enter an option or hit cancel to finish") as text|null))
if(!option || mode || !usr.client)
break
choices.Add(option)
else
return 0
mode = vote_type
initiator = initiator_key
started_time = world.time
duration = time
var/text = "[capitalize(mode)] vote started by [initiator]."
if(mode == VOTE_CUSTOM)
text += "\n[question]"
log_vote(text)
world << "<font color='#AD5AAD'><b>[text]</b>\nType <b>vote</b> or click <a href='?src=\ref[src]'>here</a> to place your votes.\nYou have [config.vote_period / 10] seconds to vote.</font>"
if(vote_type == VOTE_CREW_TRANSFER || vote_type == VOTE_GAMEMODE || vote_type == VOTE_CUSTOM)
world << sound('sound/ambience/alarm4.ogg', repeat = 0, wait = 0, volume = 50, channel = 3)
if(mode == VOTE_GAMEMODE && round_progressing)
round_progressing = 0
world << "<font color='red'><b>Round start has been delayed.</b></font>"
time_remaining = round(config.vote_period / 10)
return 1
return 0
/datum/controller/subsystem/vote/proc/interface(var/client/C)
if(!istype(C))
return
var/admin = FALSE
if(C.holder)
if(C.holder.rights & R_ADMIN)
admin = TRUE
. = "<html><head><title>Voting Panel</title></head><body>"
if(mode)
if(question)
. += "<h2>Vote: '[question]'</h2>"
else
. += "<h2>Vote: [capitalize(mode)]</h2>"
. += "Time Left: [time_remaining] s<hr>"
. += "<table width = '100%'><tr><td align = 'center'><b>Choices</b></td><td align = 'center'><b>Votes</b></td>"
if(mode == VOTE_GAMEMODE)
.+= "<td align = 'center'><b>Minimum Players</b></td></tr>"
for(var/i = 1 to choices.len)
var/votes = choices[choices[i]]
if(!votes)
votes = 0
. += "<tr>"
var/thisVote = (current_votes[C.ckey] == i)
if(mode == VOTE_GAMEMODE)
. += "<td>[thisVote ? "<b>" : ""]<a href='?src=\ref[src];vote=[i]'>[gamemode_names[choices[i]]]</a>[thisVote ? "</b>" : ""]</td><td align = 'center'>[votes]</td>"
else
. += "<td>[thisVote ? "<b>" : ""]<a href='?src=\ref[src];vote=[i]'>[choices[i]]</a>[thisVote ? "</b>" : ""]</td><td align = 'center'>[votes]</td>"
if (additional_text.len >= i)
. += additional_text[i]
. += "</tr>"
. += "<tr><td><a href='?src=\ref[src];vote=unvote'>Unvote</a></td></tr>"
. += "</table><hr>"
if(admin)
. += "(<a href='?src=\ref[src];vote=cancel'>Cancel Vote</a>) "
else
. += "<h2>Start a vote:</h2><hr><ul><li>"
if(admin || config.allow_vote_restart)
. += "<a href='?src=\ref[src];vote=restart'>Restart</a>"
else
. += "<font color='grey'>Restart (Disallowed)</font>"
. += "</li><li>"
if(admin || config.allow_vote_restart)
. += "<a href='?src=\ref[src];vote=crew_transfer'>Crew Transfer</a>"
else
. += "<font color='grey'>Crew Transfer (Disallowed)</font>"
if(admin)
. += "\t(<a href='?src=\ref[src];vote=toggle_restart'>[config.allow_vote_restart ? "Allowed" : "Disallowed"]</a>)"
. += "</li><li>"
if(admin || config.allow_vote_mode)
. += "<a href='?src=\ref[src];vote=gamemode'>GameMode</a>"
else
. += "<font color='grey'>GameMode (Disallowed)</font>"
if(admin)
. += "\t(<a href='?src=\ref[src];vote=toggle_gamemode'>[config.allow_vote_mode ? "Allowed" : "Disallowed"]</a>)"
. += "</li><li>"
if(!antag_add_failed && config.allow_extra_antags)
. += "<a href='?src=\ref[src];vote=add_antagonist'>Add Antagonist Type</a>"
else
. += "<font color='grey'>Add Antagonist (Disallowed)</font>"
. += "</li>"
if(admin)
. += "<li><a href='?src=\ref[src];vote=custom'>Custom</a></li>"
. += "</ul><hr>"
. += "<a href='?src=\ref[src];vote=close' style='position:absolute;right:50px'>Close</a></body></html>"
/datum/controller/subsystem/vote/Topic(href, href_list[])
if(!usr || !usr.client)
return
switch(href_list["vote"])
if("close")
usr << browse(null, "window=vote")
return
if("cancel")
if(usr.client.holder)
reset()
if("toggle_restart")
if(usr.client.holder)
config.allow_vote_restart = !config.allow_vote_restart
if("toggle_gamemode")
if(usr.client.holder)
config.allow_vote_mode = !config.allow_vote_mode
if(VOTE_RESTART)
if(config.allow_vote_restart || usr.client.holder)
initiate_vote(VOTE_RESTART, usr.key)
if(VOTE_GAMEMODE)
if(config.allow_vote_mode || usr.client.holder)
initiate_vote(VOTE_GAMEMODE, usr.key)
if(VOTE_CREW_TRANSFER)
if(config.allow_vote_restart || usr.client.holder)
initiate_vote(VOTE_CREW_TRANSFER, usr.key)
if(VOTE_ADD_ANTAGONIST)
if(config.allow_extra_antags || usr.client.holder)
initiate_vote(VOTE_ADD_ANTAGONIST, usr.key)
if(VOTE_CUSTOM)
if(usr.client.holder)
initiate_vote(VOTE_CUSTOM, usr.key)
if("unvote")
submit_vote(usr.ckey, null)
else
var/t = round(text2num(href_list["vote"]))
if(t) // It starts from 1, so there's no problem
submit_vote(usr.ckey, t)
usr.client.vote()
/client/verb/vote()
set category = "OOC"
set name = "Vote"
if(SSvote)
src << browse(SSvote.interface(src), "window=vote;size=500x[300 + SSvote.choices.len * 25]")
+84
View File
@@ -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.")
..()
+7
View File
@@ -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
+10
View File
@@ -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
+29
View File
@@ -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
+3
View File
@@ -0,0 +1,3 @@
//CHOMPStation EDIT: This file has been disabled in the .dme.
/datum/mind
var/vore_death = FALSE // Was our last gasp a gurgle?
+2 -2
View File
@@ -14,7 +14,7 @@
/decl/hierarchy/outfit/job/cargo/cargo_tech
name = OUTFIT_JOB_NAME("Cargo technician")
uniform = /obj/item/clothing/under/rank/cargotech
id_type = /obj/item/weapon/card/id/cargo/cargo_tech
id_type = /obj/item/weapon/card/id/cargo
pda_type = /obj/item/device/pda/cargo
/decl/hierarchy/outfit/job/cargo/mining
@@ -23,7 +23,7 @@
l_ear = /obj/item/device/radio/headset/headset_mine
backpack = /obj/item/weapon/storage/backpack/industrial
satchel_one = /obj/item/weapon/storage/backpack/satchel/eng
id_type = /obj/item/weapon/card/id/cargo/mining
id_type = /obj/item/weapon/card/id/cargo
pda_type = /obj/item/device/pda/shaftminer
backpack_contents = list(/obj/item/weapon/tool/crowbar = 1, /obj/item/weapon/storage/bag/ore = 1)
flags = OUTFIT_HAS_BACKPACK|OUTFIT_EXTENDED_SURVIVAL
+7 -7
View File
@@ -18,7 +18,7 @@
/decl/hierarchy/outfit/job/service/bartender
name = OUTFIT_JOB_NAME("Bartender")
uniform = /obj/item/clothing/under/rank/bartender
id_type = /obj/item/weapon/card/id/civilian/bartender
id_type = /obj/item/weapon/card/id/civilian
pda_type = /obj/item/device/pda/bar
backpack_contents = list(/obj/item/clothing/accessory/permit/gun/bar = 1)
@@ -37,7 +37,7 @@
uniform = /obj/item/clothing/under/rank/chef
suit = /obj/item/clothing/suit/chef
head = /obj/item/clothing/head/chefhat
id_type = /obj/item/weapon/card/id/civilian/chef
id_type = /obj/item/weapon/card/id/civilian
pda_type = /obj/item/device/pda/chef
/decl/hierarchy/outfit/job/service/chef/cook
@@ -61,20 +61,20 @@
backpack = /obj/item/weapon/storage/backpack/hydroponics
satchel_one = /obj/item/weapon/storage/backpack/satchel/hyd
messenger_bag = /obj/item/weapon/storage/backpack/messenger/hyd
id_type = /obj/item/weapon/card/id/civilian/botanist
id_type = /obj/item/weapon/card/id/civilian
pda_type = /obj/item/device/pda/botanist
/decl/hierarchy/outfit/job/service/janitor
name = OUTFIT_JOB_NAME("Janitor")
uniform = /obj/item/clothing/under/rank/janitor
id_type = /obj/item/weapon/card/id/civilian/janitor
id_type = /obj/item/weapon/card/id/civilian
pda_type = /obj/item/device/pda/janitor
/decl/hierarchy/outfit/job/librarian
name = OUTFIT_JOB_NAME("Librarian")
uniform = /obj/item/clothing/under/suit_jacket/red
l_hand = /obj/item/weapon/barcodescanner
id_type = /obj/item/weapon/card/id/civilian/librarian
id_type = /obj/item/weapon/card/id/civilian
pda_type = /obj/item/device/pda/librarian
/decl/hierarchy/outfit/job/internal_affairs_agent
@@ -85,14 +85,14 @@
shoes = /obj/item/clothing/shoes/brown
glasses = /obj/item/clothing/glasses/sunglasses/big
l_hand = /obj/item/weapon/clipboard
id_type = /obj/item/weapon/card/id/civilian/internal_affairs_agent
id_type = /obj/item/weapon/card/id/civilian
pda_type = /obj/item/device/pda/lawyer
/decl/hierarchy/outfit/job/chaplain
name = OUTFIT_JOB_NAME("Chaplain")
uniform = /obj/item/clothing/under/rank/chaplain
l_hand = /obj/item/weapon/storage/bible
id_type = /obj/item/weapon/card/id/civilian/chaplain
id_type = /obj/item/weapon/card/id/civilian
pda_type = /obj/item/device/pda/chaplain
/decl/hierarchy/outfit/job/explorer
+3 -3
View File
@@ -7,7 +7,7 @@
backpack = /obj/item/weapon/storage/backpack/captain
satchel_one = /obj/item/weapon/storage/backpack/satchel/cap
messenger_bag = /obj/item/weapon/storage/backpack/messenger/com
id_type = /obj/item/weapon/card/id/gold/captain
id_type = /obj/item/weapon/card/id/gold
pda_type = /obj/item/device/pda/captain
/decl/hierarchy/outfit/job/captain/post_equip(var/mob/living/carbon/human/H)
@@ -28,14 +28,14 @@
uniform = /obj/item/clothing/under/rank/head_of_personnel
l_ear = /obj/item/device/radio/headset/heads/hop
shoes = /obj/item/clothing/shoes/brown
id_type = /obj/item/weapon/card/id/silver/hop
id_type = /obj/item/weapon/card/id/silver
pda_type = /obj/item/device/pda/heads/hop
/decl/hierarchy/outfit/job/secretary
name = OUTFIT_JOB_NAME("Command Secretary")
l_ear = /obj/item/device/radio/headset/headset_com
shoes = /obj/item/clothing/shoes/brown
id_type = /obj/item/weapon/card/id/silver/secretary
id_type = /obj/item/weapon/card/id/silver
pda_type = /obj/item/device/pda/heads
r_hand = /obj/item/weapon/clipboard
+2 -2
View File
@@ -23,12 +23,12 @@
name = OUTFIT_JOB_NAME("Engineer")
head = /obj/item/clothing/head/hardhat
uniform = /obj/item/clothing/under/rank/engineer
id_type = /obj/item/weapon/card/id/engineering/engineer
id_type = /obj/item/weapon/card/id/engineering
pda_type = /obj/item/device/pda/engineering
/decl/hierarchy/outfit/job/engineering/atmos
name = OUTFIT_JOB_NAME("Atmospheric technician")
uniform = /obj/item/clothing/under/rank/atmospheric_technician
belt = /obj/item/weapon/storage/belt/utility/atmostech
id_type = /obj/item/weapon/card/id/engineering/atmos
id_type = /obj/item/weapon/card/id/engineering
pda_type = /obj/item/device/pda/atmos
+4 -1
View File
@@ -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)
+5 -5
View File
@@ -25,7 +25,7 @@
suit = /obj/item/clothing/suit/storage/toggle/labcoat
l_hand = /obj/item/weapon/storage/firstaid/regular
r_pocket = /obj/item/device/flashlight/pen
id_type = /obj/item/weapon/card/id/medical/doctor
id_type = /obj/item/weapon/card/id/medical
/decl/hierarchy/outfit/job/medical/doctor/emergency_physician
name = OUTFIT_JOB_NAME("Emergency Physician")
@@ -65,7 +65,7 @@
suit = /obj/item/clothing/suit/storage/toggle/labcoat/chemist
backpack = /obj/item/weapon/storage/backpack/chemistry
satchel_one = /obj/item/weapon/storage/backpack/satchel/chem
id_type = /obj/item/weapon/card/id/medical/chemist
id_type = /obj/item/weapon/card/id/medical
pda_type = /obj/item/device/pda/chemist
/decl/hierarchy/outfit/job/medical/geneticist
@@ -75,7 +75,7 @@
backpack = /obj/item/weapon/storage/backpack/genetics
r_pocket = /obj/item/device/flashlight/pen
satchel_one = /obj/item/weapon/storage/backpack/satchel/gen
id_type = /obj/item/weapon/card/id/medical/geneticist
id_type = /obj/item/weapon/card/id/medical
pda_type = /obj/item/device/pda/geneticist
/decl/hierarchy/outfit/job/medical/psychiatrist
@@ -83,7 +83,7 @@
uniform = /obj/item/clothing/under/rank/psych
suit = /obj/item/clothing/suit/storage/toggle/labcoat
shoes = /obj/item/clothing/shoes/laceup
id_type = /obj/item/weapon/card/id/medical/psychiatrist
id_type = /obj/item/weapon/card/id/medical
/decl/hierarchy/outfit/job/medical/psychiatrist/psychologist
name = OUTFIT_JOB_NAME("Psychologist")
@@ -97,7 +97,7 @@
l_hand = /obj/item/weapon/storage/firstaid/regular
belt = /obj/item/weapon/storage/belt/medical/emt
pda_slot = slot_l_store
id_type = /obj/item/weapon/card/id/medical/paramedic
id_type = /obj/item/weapon/card/id/medical
flags = OUTFIT_HAS_BACKPACK|OUTFIT_EXTENDED_SURVIVAL
/decl/hierarchy/outfit/job/medical/paramedic/emt
+3 -3
View File
@@ -20,13 +20,13 @@
/decl/hierarchy/outfit/job/science/scientist
name = OUTFIT_JOB_NAME("Scientist")
uniform = /obj/item/clothing/under/rank/scientist
id_type = /obj/item/weapon/card/id/science/scientist
id_type = /obj/item/weapon/card/id/science
suit = /obj/item/clothing/suit/storage/toggle/labcoat/science
/decl/hierarchy/outfit/job/science/xenobiologist
name = OUTFIT_JOB_NAME("Xenobiologist")
uniform = /obj/item/clothing/under/rank/scientist
id_type = /obj/item/weapon/card/id/science/xenobiologist
id_type = /obj/item/weapon/card/id/science
suit = /obj/item/clothing/suit/storage/toggle/labcoat/science
/decl/hierarchy/outfit/job/science/roboticist
@@ -34,7 +34,7 @@
uniform = /obj/item/clothing/under/rank/roboticist
shoes = /obj/item/clothing/shoes/black
belt = /obj/item/weapon/storage/belt/utility/full
id_type = /obj/item/weapon/card/id/science/roboticist
id_type = /obj/item/weapon/card/id/science
pda_slot = slot_r_store
pda_type = /obj/item/device/pda/roboticist
backpack = /obj/item/weapon/storage/backpack
+3 -3
View File
@@ -20,7 +20,7 @@
name = OUTFIT_JOB_NAME("Warden")
uniform = /obj/item/clothing/under/rank/warden
l_pocket = /obj/item/device/flash
id_type = /obj/item/weapon/card/id/security/warden
id_type = /obj/item/weapon/card/id/security
pda_type = /obj/item/device/pda/warden
/decl/hierarchy/outfit/job/security/detective
@@ -31,7 +31,7 @@
l_pocket = /obj/item/weapon/flame/lighter/zippo
shoes = /obj/item/clothing/shoes/laceup
r_hand = /obj/item/weapon/storage/briefcase/crimekit
id_type = /obj/item/weapon/card/id/security/detective
id_type = /obj/item/weapon/card/id/security
pda_type = /obj/item/device/pda/detective
backpack = /obj/item/weapon/storage/backpack
satchel_one = /obj/item/weapon/storage/backpack/satchel/norm
@@ -46,5 +46,5 @@
name = OUTFIT_JOB_NAME("Security Officer")
uniform = /obj/item/clothing/under/rank/security
l_pocket = /obj/item/device/flash
id_type = /obj/item/weapon/card/id/security/officer
id_type = /obj/item/weapon/card/id/security
pda_type = /obj/item/device/pda/security
+34
View File
@@ -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)
+13
View File
@@ -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
+16
View File
@@ -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"
+7
View File
@@ -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"
+188 -179
View File
@@ -1,180 +1,189 @@
/datum/category_item/underwear/undershirt/none
is_default = TRUE
name = "None"
always_last = TRUE
/datum/category_item/underwear/undershirt/shirt
name = "Shirt"
icon_state = "undershirt"
has_color = TRUE
/datum/category_item/underwear/undershirt/shirt_fem
name = "Babydoll shirt"
icon_state = "undershirt_fem"
has_color = TRUE
/datum/category_item/underwear/undershirt/shirt_long
name = "Longsleeve Shirt"
icon_state = "undershirt_long"
has_color = TRUE
/datum/category_item/underwear/undershirt/shirt_long_s
name = "Shirt, button-down"
icon_state = "shirt_long_s"
has_color = TRUE
/datum/category_item/underwear/undershirt/shirt_long_fem
name = "Longsleeve Shirt, feminine"
icon_state = "undershirt_long_fem"
has_color = TRUE
/datum/category_item/underwear/undershirt/shirt_long_female_s
name = "Button-down Shirt, feminine"
icon_state = "shirt_long_female_s"
has_color = TRUE
/datum/category_item/underwear/undershirt/tank_top
name = "Tank top"
icon_state = "tanktop"
has_color = TRUE
/datum/category_item/underwear/undershirt/tank_top_alt
name = "Tank top, alt"
icon_state = "tanktop_alt"
has_color = TRUE
/datum/category_item/underwear/undershirt/tank_top_alt_fem
name = "Tank top, alt, feminine"
icon_state = "tanktop_alt_fem"
has_color = TRUE
/datum/category_item/underwear/undershirt/tank_top_alt_fem_vneck
name = "Tank top, feminine, v-neck"
icon_state = "tanktop_alt_fem_vneck"
has_color = TRUE
/datum/category_item/underwear/undershirt/tank_top_fire
name = "Tank top, fire"
icon_state = "tank_fire_s"
/datum/category_item/underwear/undershirt/tank_top_fire_fem
name = "Tank top, fire, feminine"
icon_state = "tank_fire_fem_s"
/datum/category_item/underwear/undershirt/tank_top_rainbow
name = "Tank top, rainbow"
icon_state = "tank_rainbow_s"
/datum/category_item/underwear/undershirt/tank_top_stripes
name = "Tank top, striped"
icon_state = "tank_stripes_s"
/datum/category_item/underwear/undershirt/tank_top_sun
name = "Tank top, sun"
icon_state = "tank_sun_s"
/datum/category_item/underwear/undershirt/shirt_heart
name = "Shirt, heart"
icon_state = "lover_s"
/datum/category_item/underwear/undershirt/shirt_heart_fem
name = "Shirt, heart, babydoll"
icon_state = "lover_fem_s"
/datum/category_item/underwear/undershirt/shirt_nt
name = "Shirt, NT"
icon_state = "shirt_nano_s"
/datum/category_item/underwear/undershirt/shirt_love_nt
name = "Shirt, I<3NT"
icon_state = "ilovent_s"
/datum/category_item/underwear/undershirt/shirt_love_nt_fem
name = "Shirt, I<3NT, babydoll"
icon_state = "ilovent_fem_s"
/datum/category_item/underwear/undershirt/shortsleeve_shirt
name = "Shortsleeve shirt"
icon_state = "shortsleeve"
has_color = TRUE
/datum/category_item/underwear/undershirt/shortsleeve_shirt_fem
name = "Shortsleeve babydoll shirt"
icon_state = "shortsleeve_fem"
has_color = TRUE
/datum/category_item/underwear/undershirt/shortsleeve_shirt_fem_vneck
name = "Shortsleeve babydoll shirt, v-neck"
icon_state = "shortsleeve_fem_vneck"
has_color = TRUE
/datum/category_item/underwear/undershirt/polo_shirt
name = "Polo shirt"
icon_state = "polo"
has_color = TRUE
/datum/category_item/underwear/undershirt/sport_shirt_green
name = "Sport shirt, green"
icon_state = "greenshirtsport_s"
/datum/category_item/underwear/undershirt/sport_shirt_red
name = "Sport shirt, red"
icon_state = "redshirtsport_s"
/datum/category_item/underwear/undershirt/sport_shirt_blue
name = "Sport shirt, blue"
icon_state = "blueshirtsport_s"
/datum/category_item/underwear/undershirt/shirt_tiedye
name = "Shirt, tiedye"
icon_state = "shirt_tiedye_s"
/datum/category_item/underwear/undershirt/shirt_blue_striped
name = "Shirt, blue stripes"
icon_state = "shirt_stripes_s"
/datum/category_item/underwear/undershirt/bowling
name = "Bowling Shirt, Red"
icon_state = "bowling"
/datum/category_item/underwear/undershirt/bowlingp
name = "Bowling Shirt, Pink"
icon_state = "bowlingp"
/datum/category_item/underwear/undershirt/bowlinga
name = "Bowling Shirt, Aqua"
icon_state = "bowlinga"
/datum/category_item/underwear/undershirt/bowlingw
name = "Bowling Shirt, White"
icon_state = "bowlingw"
/datum/category_item/underwear/undershirt/longjon
name = "Long John Shirt"
icon_state = "ljont"
has_color = TRUE
/datum/category_item/underwear/undershirt/longstripe_black
name = "Longsleeve Striped Shirt, Black"
icon_state = "longstripe"
/datum/category_item/underwear/undershirt/longstripe_blue
name = "Longsleeve Striped Shirt, Blue"
icon_state = "longstripe_blue"
/datum/category_item/underwear/undershirt/tiedye
name = "Tiedye Shirt"
icon_state = "tiedye"
/datum/category_item/underwear/undershirt/longstripe_pink
name = "Longsleeve Striped Shirt, Pink"
icon_state = "longstripe_pink_s"
/datum/category_item/underwear/undershirt/wingshirt
name = "Pink Wing Shirt"
icon_state = "wing_shirt_s"
/datum/category_item/underwear/undershirt/pinkblack_tshirt
name = "Pink and Black T-Shirt"
/datum/category_item/underwear/undershirt/none
is_default = TRUE
name = "None"
always_last = TRUE
/datum/category_item/underwear/undershirt/shirt
name = "Shirt"
icon_state = "undershirt"
has_color = TRUE
/datum/category_item/underwear/undershirt/shirt_fem
name = "Babydoll shirt"
icon_state = "undershirt_fem"
has_color = TRUE
/datum/category_item/underwear/undershirt/shirt_long
name = "Longsleeve Shirt"
icon_state = "undershirt_long"
has_color = TRUE
/datum/category_item/underwear/undershirt/shirt_long_s
name = "Shirt, button-down"
icon_state = "shirt_long_s"
has_color = TRUE
/datum/category_item/underwear/undershirt/shirt_long_fem
name = "Longsleeve Shirt, feminine"
icon_state = "undershirt_long_fem"
has_color = TRUE
/datum/category_item/underwear/undershirt/shirt_long_female_s
name = "Button-down Shirt, feminine"
icon_state = "shirt_long_female_s"
has_color = TRUE
/datum/category_item/underwear/undershirt/fishnet_simple
name = "Fishnet shirt"
icon_state = "fishnet_simple"
/datum/category_item/underwear/undershirt/tank_top
name = "Tank top"
icon_state = "tanktop"
has_color = TRUE
/datum/category_item/underwear/undershirt/tank_top_alt
name = "Tank top, alt"
icon_state = "tanktop_alt"
has_color = TRUE
/datum/category_item/underwear/undershirt/tank_top_alt_fem
name = "Tank top, alt, feminine"
icon_state = "tanktop_alt_fem"
has_color = TRUE
/datum/category_item/underwear/undershirt/tank_top_alt_fem_vneck
name = "Tank top, feminine, v-neck"
icon_state = "tanktop_alt_fem_vneck"
has_color = TRUE
/datum/category_item/underwear/undershirt/tank_cropped_vneck
name = "Tank top, feminine, cropped & v-neck"
icon_state = "tanktop_cropped_vneck"
has_color = TRUE
/datum/category_item/underwear/undershirt/tank_top_fire
name = "Tank top, fire"
icon_state = "tank_fire_s"
/datum/category_item/underwear/undershirt/tank_top_fire_fem
name = "Tank top, fire, feminine"
icon_state = "tank_fire_fem_s"
/datum/category_item/underwear/undershirt/tank_top_rainbow
name = "Tank top, rainbow"
icon_state = "tank_rainbow_s"
/datum/category_item/underwear/undershirt/tank_top_stripes
name = "Tank top, striped"
icon_state = "tank_stripes_s"
/datum/category_item/underwear/undershirt/tank_top_sun
name = "Tank top, sun"
icon_state = "tank_sun_s"
/datum/category_item/underwear/undershirt/shirt_heart
name = "Shirt, heart"
icon_state = "lover_s"
/datum/category_item/underwear/undershirt/shirt_heart_fem
name = "Shirt, heart, babydoll"
icon_state = "lover_fem_s"
/datum/category_item/underwear/undershirt/shirt_nt
name = "Shirt, NT"
icon_state = "shirt_nano_s"
/datum/category_item/underwear/undershirt/shirt_love_nt
name = "Shirt, I<3NT"
icon_state = "ilovent_s"
/datum/category_item/underwear/undershirt/shirt_love_nt_fem
name = "Shirt, I<3NT, babydoll"
icon_state = "ilovent_fem_s"
/datum/category_item/underwear/undershirt/shortsleeve_shirt
name = "Shortsleeve shirt"
icon_state = "shortsleeve"
has_color = TRUE
/datum/category_item/underwear/undershirt/shortsleeve_shirt_fem
name = "Shortsleeve babydoll shirt"
icon_state = "shortsleeve_fem"
has_color = TRUE
/datum/category_item/underwear/undershirt/shortsleeve_shirt_fem_vneck
name = "Shortsleeve babydoll shirt, v-neck"
icon_state = "shortsleeve_fem_vneck"
has_color = TRUE
/datum/category_item/underwear/undershirt/polo_shirt
name = "Polo shirt"
icon_state = "polo"
has_color = TRUE
/datum/category_item/underwear/undershirt/sport_shirt_green
name = "Sport shirt, green"
icon_state = "greenshirtsport_s"
/datum/category_item/underwear/undershirt/sport_shirt_red
name = "Sport shirt, red"
icon_state = "redshirtsport_s"
/datum/category_item/underwear/undershirt/sport_shirt_blue
name = "Sport shirt, blue"
icon_state = "blueshirtsport_s"
/datum/category_item/underwear/undershirt/shirt_tiedye
name = "Shirt, tiedye"
icon_state = "shirt_tiedye_s"
/datum/category_item/underwear/undershirt/shirt_blue_striped
name = "Shirt, blue stripes"
icon_state = "shirt_stripes_s"
/datum/category_item/underwear/undershirt/bowling
name = "Bowling Shirt, Red"
icon_state = "bowling"
/datum/category_item/underwear/undershirt/bowlingp
name = "Bowling Shirt, Pink"
icon_state = "bowlingp"
/datum/category_item/underwear/undershirt/bowlinga
name = "Bowling Shirt, Aqua"
icon_state = "bowlinga"
/datum/category_item/underwear/undershirt/bowlingw
name = "Bowling Shirt, White"
icon_state = "bowlingw"
/datum/category_item/underwear/undershirt/longjon
name = "Long John Shirt"
icon_state = "ljont"
has_color = TRUE
/datum/category_item/underwear/undershirt/longstripe_black
name = "Longsleeve Striped Shirt, Black"
icon_state = "longstripe"
/datum/category_item/underwear/undershirt/longstripe_blue
name = "Longsleeve Striped Shirt, Blue"
icon_state = "longstripe_blue"
/datum/category_item/underwear/undershirt/tiedye
name = "Tiedye Shirt"
icon_state = "tiedye"
/datum/category_item/underwear/undershirt/longstripe_pink
name = "Longsleeve Striped Shirt, Pink"
icon_state = "longstripe_pink_s"
/datum/category_item/underwear/undershirt/wingshirt
name = "Pink Wing Shirt"
icon_state = "wing_shirt_s"
/datum/category_item/underwear/undershirt/pinkblack_tshirt
name = "Pink and Black T-Shirt"
icon_state = "pinkblack_tshirt"
+14 -3
View File
@@ -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"
+1 -1
View File
@@ -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.
@@ -0,0 +1 @@
//placeholder
@@ -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"
@@ -237,11 +237,11 @@ var/global/list/Holiday = list() //Holidays are lists now, so we can have more t
holidays.Add(p)
holiday_blurbs.Add("[Holiday[p]]")
var/holidays_string = english_list(holidays, nothing_text = "nothing", and_text = " and ", comma_text = ", ", final_comma_text = "" )
world << "<font color='blue'>and...</font>"
world << "<font color='#6F6FE2'>and...</font>"
world << "<h4>Happy [holidays_string] Everybody!</h4>"
if(holiday_blurbs.len != 0)
for(var/blurb in holiday_blurbs)
world << "<div align='center'><font color='blue'>[blurb]</font></div>"
world << "<div align='center'><font color='#6F6FE2'>[blurb]</font></div>"
switch(Holiday) //special holidays
if("Easter")
//do easter stuff
+4 -4
View File
@@ -50,7 +50,7 @@ var/global/datum/controller/gameticker/ticker
do
pregame_timeleft = 180
to_chat(world, "<B><FONT color='blue'>Welcome to the pregame lobby!</FONT></B>")
to_chat(world, "<B><FONT color='#0544ff'>Welcome to the pregame lobby!</FONT></B>")
to_chat(world, "Please set up your character and select ready. The round will start in [pregame_timeleft] seconds.")
while(current_state == GAME_STATE_PREGAME)
if(round_progressing)
@@ -138,7 +138,7 @@ var/global/datum/controller/gameticker/ticker
//Deleting Startpoints but we need the ai point to AI-ize people later
if (S.name != "AI")
qdel(S)
to_chat(world, "<FONT color='blue'><B>Enjoy the game!</B></FONT>")
to_chat(world, "<FONT color='#0544ff'><B>Enjoy the game!</B></FONT>")
world << sound('sound/AI/welcome.ogg') // Skie
//Holiday Round-start stuff ~Carn
Holiday_Game_Start()
@@ -390,7 +390,7 @@ var/global/datum/controller/gameticker/ticker
var/turf/playerTurf = get_turf(Player)
if(emergency_shuttle.departed && emergency_shuttle.evac)
if(isNotAdminLevel(playerTurf.z))
Player << "<font color='blue'><b>You survived the round, but remained on [station_name()] as [Player.real_name].</b></font>"
Player << "<font color='#0544ff'><b>You survived the round, but remained on [station_name()] as [Player.real_name].</b></font>"
else
Player << "<font color='green'><b>You managed to survive the events on [station_name()] as [Player.real_name].</b></font>"
else if(isAdminLevel(playerTurf.z))
@@ -398,7 +398,7 @@ var/global/datum/controller/gameticker/ticker
else if(issilicon(Player))
Player << "<font color='green'><b>You remain operational after the events on [station_name()] as [Player.real_name].</b></font>"
else
Player << "<font color='blue'><b>You missed the crew transfer after the events on [station_name()] as [Player.real_name].</b></font>"
Player << "<font color='#0544ff'><b>You missed the crew transfer after the events on [station_name()] as [Player.real_name].</b></font>"
else
if(istype(Player,/mob/observer/dead))
var/mob/observer/dead/O = Player
+2 -2
View File
@@ -133,7 +133,7 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
dat += "<b>[spell.name]</b><br>"
dat += "<i>[spell.desc]</i><br>"
if(spell.spell_power_desc)
dat += "<font color='purple'>Spell Power: [spell.spell_power_desc]</font><br>"
dat += "<font color='#AD5AAD'>Spell Power: [spell.spell_power_desc]</font><br>"
if(spell.enhancement_desc)
dat += "<font color='blue'>Scepter Effect: [spell.enhancement_desc]</font><br>"
if(spell.cost <= budget)
@@ -255,7 +255,7 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
If a function is able to be boosted with it, it will be shown underneath the description of the function as \
<font color='blue'><i>'Scepter Effect:'</i></font>. Note that you must hold the scepter for it to work, so try to avoid losing it.<br>"
dat += "Functions can also be boosted with the core itself. A function that is able to benefit \
from this will have <font color='purple'><i>'Spell Power:'</i></font> underneath. Different Cores have different \
from this will have <font color='#AD5AAD'><i>'Spell Power:'</i></font> underneath. Different Cores have different \
amounts of spell power.<br>"
dat += "When a function refers to 'allies', it means you, your apprentices, currently controlled entities (with the \
Control function), and friendly simple-minded entities that you've summoned with the Scepter of Enhancement.<br>"
@@ -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())
+3
View File
@@ -0,0 +1,3 @@
/datum/job/blueshield
whitelist_only = 1
latejoin_only = 1
-3
View File
@@ -11,7 +11,6 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
spawn_positions = 1
supervisors = "company officials and Corporate Regulations"
selection_color = "#1D1D4F"
idtype = /obj/item/weapon/card/id/gold
req_admin_notify = 1
access = list() //See get_access()
minimal_access = list() //See get_access()
@@ -44,7 +43,6 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
spawn_positions = 1
supervisors = "the Colony Director"
selection_color = "#2F2F7F"
idtype = /obj/item/weapon/card/id/silver/hop
req_admin_notify = 1
minimal_player_age = 10
economic_modifier = 10
@@ -79,7 +77,6 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
spawn_positions = 2
supervisors = "command staff"
selection_color = "#2F2F7F"
idtype = /obj/item/weapon/card/id/silver/secretary
minimal_player_age = 5
economic_modifier = 7
-9
View File
@@ -9,7 +9,6 @@
spawn_positions = 2
supervisors = "the head of personnel"
selection_color = "#515151"
idtype = /obj/item/weapon/card/id/civilian/bartender
access = list(access_hydroponics, access_bar, access_kitchen)
minimal_access = list(access_bar)
@@ -27,7 +26,6 @@
spawn_positions = 2
supervisors = "the head of personnel"
selection_color = "#515151"
idtype = /obj/item/weapon/card/id/civilian/chef
access = list(access_hydroponics, access_bar, access_kitchen)
minimal_access = list(access_kitchen)
@@ -44,7 +42,6 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#515151"
idtype = /obj/item/weapon/card/id/civilian/botanist
access = list(access_hydroponics, access_bar, access_kitchen)
minimal_access = list(access_hydroponics)
@@ -63,7 +60,6 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#7a4f33"
idtype = /obj/item/weapon/card/id/cargo/head
economic_modifier = 5
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station)
minimal_access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station)
@@ -83,7 +79,6 @@
spawn_positions = 2
supervisors = "the quartermaster and the head of personnel"
selection_color = "#9b633e"
idtype = /obj/item/weapon/card/id/cargo/cargo_tech
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_mining, access_mining_station)
minimal_access = list(access_maint_tunnels, access_cargo, access_cargo_bot, access_mailsorting)
@@ -99,7 +94,6 @@
spawn_positions = 3
supervisors = "the quartermaster and the head of personnel"
selection_color = "#9b633e"
idtype = /obj/item/weapon/card/id/cargo/mining
economic_modifier = 5
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_mining, access_mining_station)
minimal_access = list(access_mining, access_mining_station, access_mailsorting)
@@ -118,7 +112,6 @@
spawn_positions = 2
supervisors = "the head of personnel"
selection_color = "#515151"
idtype = /obj/item/weapon/card/id/civilian/janitor
access = list(access_janitor, access_maint_tunnels)
minimal_access = list(access_janitor, access_maint_tunnels)
@@ -136,7 +129,6 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#515151"
idtype = /obj/item/weapon/card/id/civilian/librarian
access = list(access_library, access_maint_tunnels)
minimal_access = list(access_library)
@@ -154,7 +146,6 @@
spawn_positions = 2
supervisors = "company officials and Corporate Regulations"
selection_color = "#515151"
idtype = /obj/item/weapon/card/id/civilian/internal_affairs_agent
economic_modifier = 7
access = list(access_lawyer, access_sec_doors, access_maint_tunnels, access_heads)
minimal_access = list(access_lawyer, access_sec_doors, access_heads)
-1
View File
@@ -9,7 +9,6 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#515151"
idtype = /obj/item/weapon/card/id/civilian/chaplain
access = list(access_morgue, access_chapel_office, access_crematorium, access_maint_tunnels)
minimal_access = list(access_chapel_office, access_crematorium)
alt_titles = list("Counselor")
-3
View File
@@ -9,7 +9,6 @@
spawn_positions = 1
supervisors = "the Colony Director"
selection_color = "#7F6E2C"
idtype = /obj/item/weapon/card/id/engineering/head
req_admin_notify = 1
economic_modifier = 10
@@ -39,7 +38,6 @@
spawn_positions = 5
supervisors = "the chief engineer"
selection_color = "#5B4D20"
idtype = /obj/item/weapon/card/id/engineering/engineer
economic_modifier = 5
access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics)
minimal_access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction)
@@ -59,7 +57,6 @@
spawn_positions = 2
supervisors = "the chief engineer"
selection_color = "#5B4D20"
idtype = /obj/item/weapon/card/id/engineering/atmos
economic_modifier = 5
access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics, access_external_airlocks)
minimal_access = list(access_eva, access_engine, access_atmospherics, access_maint_tunnels, access_emergency_storage, access_construction, access_external_airlocks)
+1 -8
View File
@@ -13,7 +13,6 @@
var/current_positions = 0 // How many players have this job
var/supervisors = null // Supervisors, who this person answers to directly
var/selection_color = "#ffffff" // Selection screen color
var/idtype = /obj/item/weapon/card/id // The type of the ID the player will have
var/list/alt_titles // List of alternate titles, if any
var/req_admin_notify // If this is set to 1, a text is printed to the player when jobs are assigned, telling him that he should let admins know that he has to disconnect.
var/minimal_player_age = 0 // If you have use_age_restriction_for_jobs config option enabled and the database set up, this option will add a requirement for players to be at least minimal_player_age days old. (meaning they first signed in at least that many days before.)
@@ -21,6 +20,7 @@
var/head_position = 0 // Is this position Command?
var/minimum_character_age = 0
var/ideal_character_age = 30
var/has_headset = TRUE //Do people with this job need to be given headsets and told how to use them? E.g. Cyborgs don't.
var/account_allowed = 1 // Does this job type come with a station account?
var/economic_modifier = 2 // With how much does this job modify the initial account amount?
@@ -40,13 +40,6 @@
. = . || outfit_type
. = outfit_by_type(.)
/datum/job/proc/equip_backpack(var/mob/living/carbon/human/H)
switch(H.backbag)
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(H), slot_back)
/datum/job/proc/setup_account(var/mob/living/carbon/human/H)
if(!account_allowed || (H.mind && H.mind.initial_account))
return
-6
View File
@@ -9,7 +9,6 @@
spawn_positions = 1
supervisors = "the Colony Director"
selection_color = "#026865"
idtype = /obj/item/weapon/card/id/medical/head
req_admin_notify = 1
economic_modifier = 10
access = list(access_medical, access_medical_equip, access_morgue, access_genetics, access_heads,
@@ -35,7 +34,6 @@
spawn_positions = 3
supervisors = "the chief medical officer"
selection_color = "#013D3B"
idtype = /obj/item/weapon/card/id/medical/doctor
economic_modifier = 7
access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_eva)
minimal_access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_virology, access_eva)
@@ -57,7 +55,6 @@
spawn_positions = 2
supervisors = "the chief medical officer"
selection_color = "#013D3B"
idtype = /obj/item/weapon/card/id/medical/chemist
economic_modifier = 5
access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics)
minimal_access = list(access_medical, access_medical_equip, access_chemistry)
@@ -78,7 +75,6 @@
spawn_positions = 0
supervisors = "the chief medical officer and research director"
selection_color = "#013D3B"
idtype = /obj/item/weapon/card/id/medical/geneticist
economic_modifier = 7
access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_research)
minimal_access = list(access_medical, access_morgue, access_genetics, access_research)
@@ -97,7 +93,6 @@
economic_modifier = 5
supervisors = "the chief medical officer"
selection_color = "#013D3B"
idtype = /obj/item/weapon/card/id/medical/psychiatrist
access = list(access_medical, access_medical_equip, access_morgue, access_psychiatrist)
minimal_access = list(access_medical, access_medical_equip, access_psychiatrist)
outfit_type = /decl/hierarchy/outfit/job/medical/psychiatrist
@@ -113,7 +108,6 @@
spawn_positions = 2
supervisors = "the chief medical officer"
selection_color = "#013D3B"
idtype = /obj/item/weapon/card/id/medical/paramedic
economic_modifier = 4
access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_eva, access_maint_tunnels, access_external_airlocks, access_psychiatrist)
minimal_access = list(access_medical, access_medical_equip, access_morgue, access_eva, access_maint_tunnels, access_external_airlocks)
+4
View File
@@ -0,0 +1,4 @@
//TFF 7/1/20 - Add Chemistry access to Psychs. Backported from old Chompcode
/datum/job/psychiatrist
access = list(access_medical, access_chemistry, access_medical_equip, access_morgue, access_psychiatrist)
minimal_access = list(access_medical, access_chemistry, access_medical_equip, access_psychiatrist)
-4
View File
@@ -9,7 +9,6 @@
spawn_positions = 1
supervisors = "the Colony Director"
selection_color = "#AD6BAD"
idtype = /obj/item/weapon/card/id/science/head
req_admin_notify = 1
economic_modifier = 15
access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue,
@@ -39,7 +38,6 @@
spawn_positions = 3
supervisors = "the research director"
selection_color = "#633D63"
idtype = /obj/item/weapon/card/id/science/scientist
economic_modifier = 7
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_xenoarch)
minimal_access = list(access_tox, access_tox_storage, access_research, access_xenoarch)
@@ -59,7 +57,6 @@
spawn_positions = 2
supervisors = "the research director"
selection_color = "#633D63"
idtype = /obj/item/weapon/card/id/science/xenobiologist
economic_modifier = 7
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_hydroponics)
minimal_access = list(access_research, access_xenobiology, access_hydroponics, access_tox_storage)
@@ -79,7 +76,6 @@
spawn_positions = 2
supervisors = "research director"
selection_color = "#633D63"
idtype = /obj/item/weapon/card/id/science/roboticist
economic_modifier = 5
access = list(access_robotics, access_tox, access_tox_storage, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access.
minimal_access = list(access_robotics, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access.
-4
View File
@@ -9,7 +9,6 @@
spawn_positions = 1
supervisors = "the Colony Director"
selection_color = "#8E2929"
idtype = /obj/item/weapon/card/id/security/head
req_admin_notify = 1
economic_modifier = 10
access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory,
@@ -36,7 +35,6 @@
spawn_positions = 1
supervisors = "the head of security"
selection_color = "#601C1C"
idtype = /obj/item/weapon/card/id/security/warden
economic_modifier = 5
access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_morgue, access_external_airlocks)
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_external_airlocks)
@@ -53,7 +51,6 @@
spawn_positions = 2
supervisors = "the head of security"
selection_color = "#601C1C"
idtype = /obj/item/weapon/card/id/security/detective
access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_eva, access_external_airlocks)
minimal_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_eva, access_external_airlocks)
economic_modifier = 5
@@ -71,7 +68,6 @@
spawn_positions = 4
supervisors = "the head of security"
selection_color = "#601C1C"
idtype = /obj/item/weapon/card/id/security/officer
economic_modifier = 4
access = list(access_security, access_eva, access_sec_doors, access_brig, access_maint_tunnels, access_morgue, access_external_airlocks)
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_maint_tunnels, access_external_airlocks)
+2 -17
View File
@@ -11,18 +11,11 @@
minimal_player_age = 7
account_allowed = 0
economic_modifier = 0
has_headset = FALSE
/datum/job/ai/equip(var/mob/living/carbon/human/H)
if(!H) return 0
return 1
/*
/datum/job/ai/equip_survival(var/mob/living/carbon/human/H)
if(!H) return 0
return 1
*/
/datum/job/ai/equip_backpack(var/mob/living/carbon/human/H)
if(!H) return 0
return 1
/datum/job/ai/is_position_available()
return (empty_playable_ai_cores.len != 0)
@@ -45,19 +38,11 @@
alt_titles = list("Robot", "Drone")
account_allowed = 0
economic_modifier = 0
has_headset = FALSE
/datum/job/cyborg/equip(var/mob/living/carbon/human/H)
if(!H) return 0
return 1
/*
/datum/job/cyborg/equip_survival(var/mob/living/carbon/human/H)
if(!H) return 0
return 1
*/
/datum/job/cyborg/equip_backpack(var/mob/living/carbon/human/H)
if(!H) return 0
return 1
return 1
/datum/job/cyborg/equip_preview(mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/cardborg(H), slot_wear_suit)
+3 -2
View File
@@ -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
+3 -52
View File
@@ -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)
+2 -48
View File
@@ -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
+15 -1
View File
@@ -130,9 +130,23 @@ var/list/nonhuman_positions = list(
"pAI"
)
var/list/whitelisted_positions = list(
"Colony Director",
"Head of Personnel",
"Head of Security",
"Chief Engineer",
"Research Director",
"Chief Medical Officer",
"Command Secretary",
"Warden",
"AI",
"Cyborg",
"pAI"
)
/proc/guest_jobbans(var/job)
return ((job in command_positions) || (job in nonhuman_positions) || (job in security_positions))
return ((job in whitelisted_positions))
/proc/get_job_datums()
var/list/occupations = list()
+2
View File
@@ -12,6 +12,8 @@ var/list/whitelist = list()
if(!whitelist.len) whitelist = null
/proc/check_whitelist(mob/M /*, var/rank*/)
if(!config.usewhitelist)
return 1
if(!whitelist)
return 0
return ("[M.ckey]" in whitelist)
+5 -4
View File
@@ -1,7 +1,8 @@
var/list/job_whitelist = list()
/hook/startup/proc/loadJobWhitelist()
load_jobwhitelist()
if(config.use_jobwhitelist)
load_jobwhitelist()
return 1
/proc/load_jobwhitelist()
@@ -12,6 +13,8 @@ var/list/job_whitelist = list()
job_whitelist = splittext(text, "\n")
/proc/is_job_whitelisted(mob/M, var/rank)
if(!config.use_jobwhitelist)
return 1
var/datum/job/job = job_master.GetJob(rank)
if(!job.whitelist_only)
return 1
@@ -26,6 +29,4 @@ var/list/job_whitelist = list()
if(findtext(s,"[lowertext(M.ckey)] - [lowertext(rank)]"))
return 1
if(findtext(s,"[M.ckey] - All"))
return 1
return 0
return 1
+3 -3
View File
@@ -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
+18 -10
View File
@@ -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
+2 -2
View File
@@ -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
+3
View File
@@ -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)
@@ -53,7 +53,7 @@
if(..())
return 1
if (using_map && !(src.z in using_map.contact_levels))
usr << "<font color='red'><b>Unable to establish a connection:</b></font> <font color='black'>You're too far away from the station!</font>"
usr << "<font color='red'><b>Unable to establish a connection:</b></font> <font color='white'>You're too far away from the station!</font>"
return
usr.set_machine(src)
@@ -281,7 +281,7 @@
if(..())
return
if (using_map && !(src.z in using_map.contact_levels))
user << "<font color='red'><b>Unable to establish a connection:</b></font> <font color='black'>You're too far away from the station!</font>"
user << "<font color='red'><b>Unable to establish a connection:</b></font> <font color='white'>You're too far away from the station!</font>"
return
user.set_machine(src)
+64 -2
View File
@@ -39,9 +39,9 @@
var/secured_wires = 0
var/datum/wires/airlock/wires = null
var/open_sound_powered = 'sound/machines/airlock.ogg'
var/open_sound_powered = 'sound/machines/covert1o.ogg' //CHOMPEdit New airlock sounds throughout.
var/open_sound_unpowered = 'sound/machines/airlockforced.ogg'
var/close_sound_powered = 'sound/machines/airlockclose.ogg'
var/close_sound_powered = 'sound/machines/covert1c.ogg' //CHOMPEdit
var/denied_sound = 'sound/machines/deniedbeep.ogg'
var/bolt_up_sound = 'sound/machines/boltsup.ogg'
var/bolt_down_sound = 'sound/machines/boltsdown.ogg'
@@ -112,40 +112,54 @@
icon = 'icons/obj/doors/Doorcom.dmi'
req_one_access = list(access_heads)
assembly_type = /obj/structure/door_assembly/door_assembly_com
open_sound_powered = 'sound/machines/cmd3o.ogg' //CHOMPEdit
close_sound_powered = 'sound/machines/cmd3c.ogg' //CHOMPEdit
/obj/machinery/door/airlock/security
name = "Security Airlock"
icon = 'icons/obj/doors/Doorsec.dmi'
req_one_access = list(access_security)
assembly_type = /obj/structure/door_assembly/door_assembly_sec
open_sound_powered = 'sound/machines/sec1o.ogg' //CHOMPEdit
close_sound_powered = 'sound/machines/sec1c.ogg' //CHOMPEdit
/obj/machinery/door/airlock/engineering
name = "Engineering Airlock"
icon = 'icons/obj/doors/Dooreng.dmi'
req_one_access = list(access_engine)
assembly_type = /obj/structure/door_assembly/door_assembly_eng
open_sound_powered = 'sound/machines/eng1o.ogg' //CHOMPEdit
close_sound_powered = 'sound/machines/eng1c.ogg' //CHOMPEdit
/obj/machinery/door/airlock/engineeringatmos
name = "Atmospherics Airlock"
icon = 'icons/obj/doors/Doorengatmos.dmi'
req_one_access = list(access_atmospherics)
assembly_type = /obj/structure/door_assembly/door_assembly_eat
open_sound_powered = 'sound/machines/eng1o.ogg' //CHOMPEdit
close_sound_powered = 'sound/machines/eng1c.ogg' //CHOMPEdit
/obj/machinery/door/airlock/medical
name = "Medical Airlock"
icon = 'icons/obj/doors/Doormed.dmi'
req_one_access = list(access_medical)
assembly_type = /obj/structure/door_assembly/door_assembly_med
open_sound_powered = 'sound/machines/med1o.ogg' //CHOMPEdit
close_sound_powered = 'sound/machines/med1c.ogg' //CHOMPEdit
/obj/machinery/door/airlock/maintenance
name = "Maintenance Access"
icon = 'icons/obj/doors/Doormaint.dmi'
//req_one_access = list(access_maint_tunnels) //VOREStation Edit - Maintenance is open access
assembly_type = /obj/structure/door_assembly/door_assembly_mai
open_sound_powered = 'sound/machines/door2o.ogg' //CHOMPEdit
close_sound_powered = 'sound/machines/door2c.ogg' //CHOMPEdit
/obj/machinery/door/airlock/maintenance/cargo
icon = 'icons/obj/doors/Doormaint_cargo.dmi'
req_one_access = list(access_cargo)
open_sound_powered = 'sound/machines/door2o.ogg' //CHOMPEdit
close_sound_powered = 'sound/machines/door2c.ogg' //CHOMPEdit
/obj/machinery/door/airlock/maintenance/command
icon = 'icons/obj/doors/Doormaint_command.dmi'
@@ -153,6 +167,8 @@
/obj/machinery/door/airlock/maintenance/common
icon = 'icons/obj/doors/Doormaint_common.dmi'
open_sound_powered = 'sound/machines/hall3o.ogg' //CHOMPEdit
close_sound_powered = 'sound/machines/hall3c.ogg' //CHOMPEdit
/obj/machinery/door/airlock/maintenance/engi
icon = 'icons/obj/doors/Doormaint_engi.dmi'
@@ -177,6 +193,8 @@
name = "External Airlock"
icon = 'icons/obj/doors/Doorext.dmi'
assembly_type = /obj/structure/door_assembly/door_assembly_ext
open_sound_powered = 'sound/machines/space1o.ogg' //CHOMPEdit
close_sound_powered = 'sound/machines/space1c.ogg' //CHOMPEdit
/obj/machinery/door/airlock/glass_external
name = "External Airlock"
@@ -185,6 +203,8 @@
opacity = 0
glass = 1
req_one_access = list(access_external_airlocks)
open_sound_powered = 'sound/machines/space1o.ogg' //CHOMPEdit
close_sound_powered = 'sound/machines/space1c.ogg' //CHOMPEdit
/obj/machinery/door/airlock/glass
name = "Glass Airlock"
@@ -195,6 +215,8 @@
explosion_resistance = 5
opacity = 0
glass = 1
open_sound_powered = 'sound/machines/hall1o.ogg' //CHOMPEdit
close_sound_powered = 'sound/machines/hall1c.ogg' //CHOMPEdit
/obj/machinery/door/airlock/centcom
name = "Centcom Airlock"
@@ -216,6 +238,8 @@
secured_wires = 1
assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity //Until somebody makes better sprites.
req_one_access = list(access_heads_vault)
open_sound_powered = 'sound/machines/vault1o.ogg' //CHOMPEdit
close_sound_powered = 'sound/machines/vault1c.ogg' //CHOMPEdit
/obj/machinery/door/airlock/vault/bolted
icon_state = "door_locked"
@@ -234,6 +258,9 @@
opacity = 1
assembly_type = /obj/structure/door_assembly/door_assembly_hatch
req_one_access = list(access_maint_tunnels)
open_sound_powered = 'sound/machines/hatchopen.ogg' //CHOMPEdit
close_sound_powered = 'sound/machines/hatchclose.ogg' //CHOMPEdit
open_sound_unpowered = 'sound/machines/hatchforced.ogg'//CHOMPEdit
/obj/machinery/door/airlock/maintenance_hatch
name = "Maintenance Hatch"
@@ -242,6 +269,9 @@
opacity = 1
assembly_type = /obj/structure/door_assembly/door_assembly_mhatch
req_one_access = list(access_maint_tunnels)
open_sound_powered = 'sound/machines/hatchopen.ogg' //CHOMPEdit
close_sound_powered = 'sound/machines/hatchclose.ogg' //CHOMPEdit
open_sound_unpowered = 'sound/machines/hatchforced.ogg' //CHOMPEdit
/obj/machinery/door/airlock/glass_command
name = "Command Airlock"
@@ -253,6 +283,8 @@
assembly_type = /obj/structure/door_assembly/door_assembly_com
glass = 1
req_one_access = list(access_heads)
open_sound_powered = 'sound/machines/cmd1o.ogg' //CHOMPEdit
close_sound_powered = 'sound/machines/cmd1c.ogg' //CHOMPEdit
/obj/machinery/door/airlock/glass_engineering
name = "Engineering Airlock"
@@ -264,6 +296,8 @@
assembly_type = /obj/structure/door_assembly/door_assembly_eng
glass = 1
req_one_access = list(access_engine)
open_sound_powered = 'sound/machines/eng1o.ogg' //CHOMPEdit
close_sound_powered = 'sound/machines/eng1c.ogg' //CHOMPEdit
/obj/machinery/door/airlock/glass_engineeringatmos
name = "Atmospherics Airlock"
@@ -275,6 +309,8 @@
assembly_type = /obj/structure/door_assembly/door_assembly_eat
glass = 1
req_one_access = list(access_atmospherics)
open_sound_powered = 'sound/machines/eng1o.ogg' //CHOMPEdit
close_sound_powered = 'sound/machines/eng1c.ogg' //CHOMPEdit
/obj/machinery/door/airlock/glass_security
name = "Security Airlock"
@@ -286,6 +322,8 @@
assembly_type = /obj/structure/door_assembly/door_assembly_sec
glass = 1
req_one_access = list(access_security)
open_sound_powered = 'sound/machines/sec1o.ogg' //CHOMPEdit
close_sound_powered = 'sound/machines/sec1c.ogg' //CHOMPEdit
/obj/machinery/door/airlock/glass_medical
name = "Medical Airlock"
@@ -297,23 +335,31 @@
assembly_type = /obj/structure/door_assembly/door_assembly_med
glass = 1
req_one_access = list(access_medical)
open_sound_powered = 'sound/machines/med1o.ogg' //CHOMPEdit
close_sound_powered = 'sound/machines/med1c.ogg' //CHOMPEdit
/obj/machinery/door/airlock/mining
name = "Mining Airlock"
icon = 'icons/obj/doors/Doormining.dmi'
assembly_type = /obj/structure/door_assembly/door_assembly_min
req_one_access = list(access_mining)
open_sound_powered = 'sound/machines/cgo1o.ogg' //CHOMPEdit
close_sound_powered = 'sound/machines/cgo1c.ogg' //CHOMPEdit
/obj/machinery/door/airlock/atmos
name = "Atmospherics Airlock"
icon = 'icons/obj/doors/Dooratmo.dmi'
assembly_type = /obj/structure/door_assembly/door_assembly_atmo
req_one_access = list(access_atmospherics)
open_sound_powered = 'sound/machines/eng1o.ogg' //CHOMPEdit
close_sound_powered = 'sound/machines/eng1c.ogg' //CHOMPEdit
/obj/machinery/door/airlock/research
name = "Research Airlock"
icon = 'icons/obj/doors/Doorresearch.dmi'
assembly_type = /obj/structure/door_assembly/door_assembly_research
open_sound_powered = 'sound/machines/sci1o.ogg' //CHOMPEdit
close_sound_powered = 'sound/machines/sci1c.ogg' //CHOMPEdit
/obj/machinery/door/airlock/glass_research
name = "Research Airlock"
@@ -325,6 +371,8 @@
assembly_type = /obj/structure/door_assembly/door_assembly_research
glass = 1
req_one_access = list(access_research)
open_sound_powered = 'sound/machines/sci1o.ogg' //CHOMPEdit
close_sound_powered = 'sound/machines/sci1c.ogg' //CHOMPEdit
/obj/machinery/door/airlock/glass_mining
name = "Mining Airlock"
@@ -336,6 +384,8 @@
assembly_type = /obj/structure/door_assembly/door_assembly_min
glass = 1
req_one_access = list(access_mining)
open_sound_powered = 'sound/machines/cgo1o.ogg' //CHOMPEdit
close_sound_powered = 'sound/machines/cgo1c.ogg' //CHOMPEdit
/obj/machinery/door/airlock/glass_atmos
name = "Atmospherics Airlock"
@@ -347,6 +397,8 @@
assembly_type = /obj/structure/door_assembly/door_assembly_atmo
glass = 1
req_one_access = list(access_atmospherics)
open_sound_powered = 'sound/machines/eng1o.ogg' //CHOMPEdit
close_sound_powered = 'sound/machines/eng1c.ogg' //CHOMPEdit
/obj/machinery/door/airlock/gold
name = "Gold Airlock"
@@ -426,6 +478,8 @@
icon = 'icons/obj/doors/Doorsci.dmi'
assembly_type = /obj/structure/door_assembly/door_assembly_science
req_one_access = list(access_research)
open_sound_powered = 'sound/machines/sci1o.ogg' //CHOMPEdit
close_sound_powered = 'sound/machines/sci1c.ogg' //CHOMPEdit
/obj/machinery/door/airlock/glass_science
name = "Glass Airlocks"
@@ -434,6 +488,8 @@
assembly_type = /obj/structure/door_assembly/door_assembly_science
glass = 1
req_one_access = list(access_research)
open_sound_powered = 'sound/machines/sci1o.ogg' //CHOMPEdit
close_sound_powered = 'sound/machines/sci1c.ogg' //CHOMPEdit
/obj/machinery/door/airlock/highsecurity
name = "Secure Airlock"
@@ -442,6 +498,8 @@
secured_wires = 1
assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity
req_one_access = list(access_heads_vault)
open_sound_powered = 'sound/machines/secure1o.ogg' //CHOMPEdit
close_sound_powered = 'sound/machines/secure1c.ogg' //CHOMPEdit
/obj/machinery/door/airlock/voidcraft
name = "voidcraft hatch"
@@ -451,11 +509,15 @@
opacity = 0
glass = 1
assembly_type = /obj/structure/door_assembly/door_assembly_voidcraft
open_sound_powered = 'sound/machines/shuttle1o.ogg' //CHOMPEdit
close_sound_powered = 'sound/machines/shuttle1c.ogg' //CHOMPEdit
// Airlock opens from top-bottom instead of left-right.
/obj/machinery/door/airlock/voidcraft/vertical
icon = 'icons/obj/doors/shuttledoors_vertical.dmi'
assembly_type = /obj/structure/door_assembly/door_assembly_voidcraft/vertical
open_sound_powered = 'sound/machines/shuttle1o.ogg' //CHOMPEdit
close_sound_powered = 'sound/machines/shuttle1c.ogg' //CHOMPEdit
/datum/category_item/catalogue/anomalous/precursor_a/alien_airlock
+6
View File
@@ -0,0 +1,6 @@
/obj/machinery/door/airlock/scp
name = "SCP Access"
icon = 'icons/obj/doors/SCPdoor.dmi'
//req_one_access = list(access_maint_tunnels)
open_sound_powered = 'sound/machines/scp1o.ogg'
close_sound_powered = 'sound/machines/scp1c.ogg'
+1 -1
View File
@@ -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)
+2
View File
@@ -4,6 +4,8 @@
appearance_flags = 0
var/obj/machinery/filler_object/filler1
var/obj/machinery/filler_object/filler2
open_sound_powered = 'sound/machines/WideOpen.ogg' //CHOMPEdit
close_sound_powered = 'sound/machines/WideClose.ogg' //CHOMPEdit
/obj/machinery/door/airlock/multi_tile/New()
..()
+1
View File
@@ -61,6 +61,7 @@
L.updateicon()
area.power_change()
GLOB.lights_switched_on_roundstat++
/obj/machinery/light_switch/power_change()
+18 -73
View File
@@ -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
+164 -103
View File
@@ -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
+5
View File
@@ -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
+1 -1
View File
@@ -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())
+1
View File
@@ -507,6 +507,7 @@
visible_message("<span class='notice'>\The [src] clunks as it vends an additional item.</span>")
playsound(src, 'sound/items/vending.ogg', 50, 1, 1)
GLOB.items_sold_shift_roundstat++
status_message = ""
status_error = 0
+87 -1
View File
@@ -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)
+14 -1
View File
@@ -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
+2 -2
View File
@@ -239,9 +239,9 @@
if(EQUIP_SPECIAL)
chassis.special_equipment -= src
//VOREStation Addition begin: MICROMECHS
if(EQUIP_UTILITY)
if(EQUIP_MICRO_UTILITY)//CHOMPstation edit - This was improperly named bugging detaching on my equipment fix.
chassis.micro_utility_equipment -= src
if(EQUIP_SPECIAL)
if(EQUIP_MICRO_WEAPON)
chassis.micro_weapon_equipment -= src
//VOREStation Addition end: MICROMECHS
if(chassis.selected == src)
@@ -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>&nbsp;[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>&nbsp;[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
+175
View File
@@ -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
+142
View File
@@ -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

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