mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2026-07-21 13:13:29 +01:00
Merge remote-tracking branch 'upstream/master'
This commit is contained in:
@@ -33,3 +33,5 @@ temp.dmi
|
||||
/maps/RandomZLevels/backup
|
||||
/tools/midi2piano.zip
|
||||
/maps/yw/backup
|
||||
|
||||
icons/mecha/mecha_ch.dmi
|
||||
|
||||
+1
-1
@@ -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"
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
#if DM_VERSION < 513
|
||||
|
||||
#define ismovableatom(A) (istype(A, /atom/movable))
|
||||
|
||||
#define islist(L) (istype(L, /list))
|
||||
|
||||
#define CLAMP01(x) (CLAMP(x, 0, 1))
|
||||
|
||||
#define CLAMP(CLVALUE,CLMIN,CLMAX) ( max( (CLMIN), min((CLVALUE), (CLMAX)) ) )
|
||||
|
||||
#define ATAN2(x, y) ( !(x) && !(y) ? 0 : (y) >= 0 ? arccos((x) / sqrt((x)*(x) + (y)*(y))) : -arccos((x) / sqrt((x)*(x) + (y)*(y))) )
|
||||
|
||||
#define TAN(x) (sin(x) / cos(x))
|
||||
|
||||
#define arctan(x) (arcsin(x/sqrt(1+x*x)))
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
|
||||
#else
|
||||
|
||||
#define ismovableatom(A) ismovable(A)
|
||||
|
||||
#define CLAMP01(x) clamp(x, 0, 1)
|
||||
|
||||
#define CLAMP(CLVALUE, CLMIN, CLMAX) clamp(CLVALUE, CLMIN, CLMAX)
|
||||
|
||||
#define TAN(x) tan(x)
|
||||
|
||||
#define ATAN2(x, y) arctan(x, y)
|
||||
|
||||
#endif
|
||||
@@ -55,7 +55,29 @@
|
||||
#define PIPING_ONE_PER_TURF 2 //can only be built if nothing else with this flag is on the tile already.
|
||||
#define PIPING_DEFAULT_LAYER_ONLY 4 //can only exist at PIPING_LAYER_DEFAULT
|
||||
#define PIPING_CARDINAL_AUTONORMALIZE 8 //north/south east/west doesn't matter, auto normalize on build.
|
||||
//YW Additions
|
||||
// Disposals Construction
|
||||
//
|
||||
#define DISPOSAL_PIPE_STRAIGHT 0
|
||||
#define DISPOSAL_PIPE_CORNER 1
|
||||
#define DISPOSAL_PIPE_JUNCTION 2
|
||||
#define DISPOSAL_PIPE_JUNCTION_FLIPPED 3
|
||||
#define DISPOSAL_PIPE_JUNCTION_Y 4
|
||||
#define DISPOSAL_PIPE_TRUNK 5
|
||||
#define DISPOSAL_PIPE_BIN 6
|
||||
#define DISPOSAL_PIPE_OUTLET 7
|
||||
#define DISPOSAL_PIPE_CHUTE 8
|
||||
#define DISPOSAL_PIPE_SORTER 9
|
||||
#define DISPOSAL_PIPE_SORTER_FLIPPED 10
|
||||
#define DISPOSAL_PIPE_UPWARD 11
|
||||
#define DISPOSAL_PIPE_DOWNWARD 12
|
||||
#define DISPOSAL_PIPE_TAGGER 13
|
||||
#define DISPOSAL_PIPE_TAGGER_PARTIAL 14
|
||||
|
||||
#define DISPOSAL_SORT_NORMAL 0
|
||||
#define DISPOSAL_SORT_WILDCARD 1
|
||||
#define DISPOSAL_SORT_UNTAGGED 2
|
||||
//YW Additions end
|
||||
// Macro for easy use of boilerplate code for searching for a valid node connection.
|
||||
#define STANDARD_ATMOS_CHOOSE_NODE(node_num, direction) \
|
||||
for(var/obj/machinery/atmospherics/target in get_step(src, direction)) { \
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#define isdatum(D) istype(D, /datum)
|
||||
#define isweakref(A) istype(A, /weakref)
|
||||
|
||||
#define islist(D) istype(D, /list)
|
||||
//#define islist(D) istype(D, /list) //Built in
|
||||
|
||||
//---------------
|
||||
#define isatom(D) istype(D, /atom)
|
||||
|
||||
@@ -84,4 +84,4 @@
|
||||
#define LIGHT_COLOR_INCANDESCENT_FLASHLIGHT "#FFCC66"
|
||||
|
||||
//Fake ambient occlusion filter
|
||||
#define AMBIENT_OCCLUSION filter(type="drop_shadow", x=0, y=-2, size=4, border=4, color="#04080FAA")
|
||||
#define AMBIENT_OCCLUSION filter(type="drop_shadow", x=0, y=-1, size=2, offset=2, color="#04080F55") //VOREStation Edit for prettier visuals.
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
#define TICK_USAGE_TO_MS(starting_tickusage) (TICK_DELTA_TO_MS(world.tick_usage - starting_tickusage))
|
||||
|
||||
#define PERCENT(val) (round((val)*100, 0.1))
|
||||
#define CLAMP01(x) (CLAMP(x, 0, 1))
|
||||
|
||||
//time of day but automatically adjusts to the server going into the next day within the same round.
|
||||
//for when you need a reliable time number that doesn't depend on byond time.
|
||||
@@ -30,17 +29,12 @@
|
||||
// round() acts like floor(x, 1) by default but can't handle other values
|
||||
#define FLOOR(x, y) ( round((x) / (y)) * (y) )
|
||||
|
||||
#define CLAMP(CLVALUE,CLMIN,CLMAX) ( max( (CLMIN), min((CLVALUE), (CLMAX)) ) )
|
||||
|
||||
// Similar to clamp but the bottom rolls around to the top and vice versa. min is inclusive, max is exclusive
|
||||
#define WRAP(val, min, max) ( min == max ? min : (val) - (round(((val) - (min))/((max) - (min))) * ((max) - (min))) )
|
||||
|
||||
// Real modulus that handles decimals
|
||||
#define MODULUS(x, y) ( (x) - (y) * round((x) / (y)) )
|
||||
|
||||
// Tangent
|
||||
#define TAN(x) (sin(x) / cos(x))
|
||||
|
||||
// Cotangent
|
||||
#define COT(x) (1 / TAN(x))
|
||||
|
||||
@@ -50,8 +44,6 @@
|
||||
// Cosecant
|
||||
#define CSC(x) (1 / sin(x))
|
||||
|
||||
#define ATAN2(x, y) ( !(x) && !(y) ? 0 : (y) >= 0 ? arccos((x) / sqrt((x)*(x) + (y)*(y))) : -arccos((x) / sqrt((x)*(x) + (y)*(y))) )
|
||||
|
||||
// Greatest Common Divisor - Euclid's algorithm
|
||||
/proc/GCD(a, b)
|
||||
return b ? GCD(b, (a) % (b)) : a
|
||||
|
||||
@@ -344,7 +344,7 @@ var/global/list/##LIST_NAME = list();\
|
||||
#define RCD_VALUE_DELAY "delay"
|
||||
#define RCD_VALUE_COST "cost"
|
||||
|
||||
#define RCD_SHEETS_PER_MATTER_UNIT 4 // Each physical material sheet is worth four matter units.
|
||||
#define RCD_SHEETS_PER_MATTER_UNIT 3 // Each physical material sheet is worth four matter units. ///YW EDIT 4->3 *Buffing RCDs Hopefully.*
|
||||
#define RCD_MAX_CAPACITY 30 * RCD_SHEETS_PER_MATTER_UNIT
|
||||
|
||||
// Radiation 'levels'. Used for the geiger counter, for visuals and sound. They are in different files so this goes here.
|
||||
@@ -353,7 +353,9 @@ var/global/list/##LIST_NAME = list();\
|
||||
#define RAD_LEVEL_HIGH 25
|
||||
#define RAD_LEVEL_VERY_HIGH 75
|
||||
|
||||
#define RADIATION_THRESHOLD_CUTOFF 0.1 // Radiation will not affect a tile when below this value.
|
||||
// Calculation modes for effective radiation
|
||||
#define RAD_RESIST_CALC_DIV 0 // Each turf absorbs some fraction of the working radiation level
|
||||
#define RAD_RESIST_CALC_SUB 1 // Each turf absorbs a fixed amount of radiation
|
||||
|
||||
//https://secure.byond.com/docs/ref/info.html#/atom/var/mouse_opacity
|
||||
#define MOUSE_OPACITY_TRANSPARENT 0
|
||||
|
||||
@@ -325,6 +325,8 @@
|
||||
#define SPECIES_SKELETON "Skeleton"
|
||||
#define SPECIES_GOLEM "Golem"
|
||||
#define SPECIES_EVENT1 "X Occursus"
|
||||
#define SPECIES_EVENT2 "X Anomalous"
|
||||
#define SPECIES_EVENT3 "X Unowas"
|
||||
|
||||
// Replicant types. Currently only used for alien pods and events.
|
||||
#define SPECIES_REPLICANT "Replicant"
|
||||
|
||||
+186
-178
@@ -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,5 +2,5 @@
|
||||
#define TYPEID_NULL "0"
|
||||
#define TYPEID_NORMAL_LIST "f"
|
||||
//helper macros
|
||||
#define GET_TYPEID(ref) ( ( (lentext(ref) <= 10) ? "TYPEID_NULL" : copytext(ref, 4, lentext(ref)-6) ) )
|
||||
#define IS_NORMAL_LIST(L) (GET_TYPEID("\ref[L]") == TYPEID_NORMAL_LIST)
|
||||
#define GET_TYPEID(ref) ( ( (length(ref) <= 10) ? "TYPEID_NULL" : copytext(ref, 4, length(ref)-6) ) )
|
||||
#define IS_NORMAL_LIST(L) (GET_TYPEID("\ref[L]") == TYPEID_NORMAL_LIST)
|
||||
|
||||
@@ -28,7 +28,7 @@ json_reader
|
||||
src.json = json
|
||||
. = new/list()
|
||||
src.i = 1
|
||||
while(src.i <= lentext(json))
|
||||
while(src.i <= length(json))
|
||||
var/char = get_char()
|
||||
if(is_whitespace(char))
|
||||
i++
|
||||
@@ -46,7 +46,7 @@ json_reader
|
||||
|
||||
read_word()
|
||||
var/val = ""
|
||||
while(i <= lentext(json))
|
||||
while(i <= length(json))
|
||||
var/char = get_char()
|
||||
if(is_whitespace(char) || symbols.Find(char))
|
||||
i-- // let scanner handle this character
|
||||
@@ -58,7 +58,7 @@ json_reader
|
||||
var
|
||||
escape = FALSE
|
||||
val = ""
|
||||
while(++i <= lentext(json))
|
||||
while(++i <= length(json))
|
||||
var/char = get_char()
|
||||
if(escape)
|
||||
switch(char)
|
||||
|
||||
@@ -43,7 +43,7 @@ json_writer
|
||||
var/static/list/json_escape = list("\\" = "\\\\", "\"" = "\\\"", "\n" = "\\n")
|
||||
for(var/targ in json_escape)
|
||||
var/start = 1
|
||||
while(start <= lentext(txt))
|
||||
while(start <= length(txt))
|
||||
var/i = findtext(txt, targ, start)
|
||||
if(!i)
|
||||
break
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
GLOBAL_LIST_INIT(speech_toppings, list("|" = "i", "+" = "b", "_" = "u"))
|
||||
@@ -0,0 +1,8 @@
|
||||
//Languages/species/whitelist.
|
||||
GLOBAL_LIST_INIT(all_species, list())
|
||||
GLOBAL_LIST_INIT(all_languages, list())
|
||||
GLOBAL_LIST_INIT(language_keys, list()) // Table of say codes for all languages
|
||||
GLOBAL_LIST_INIT(whitelisted_species, list(SPECIES_HUMAN)) // Species that require a whitelist check.
|
||||
// VOREStation edit - include custom species
|
||||
GLOBAL_LIST_INIT(playable_species, list(SPECIES_HUMAN, SPECIES_CUSTOM)) // A list of ALL playable species, whitelisted, latejoin or otherwise.
|
||||
// VOREStation edit end
|
||||
@@ -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
|
||||
@@ -24,13 +24,6 @@ var/global/list/turfs = list() //list of all turfs
|
||||
#define all_genders_define_list list(MALE,FEMALE,PLURAL,NEUTER,HERM) //VOREStaton Edit
|
||||
#define all_genders_text_list list("Male","Female","Plural","Neuter","Herm") //VOREStation Edit
|
||||
|
||||
//Languages/species/whitelist.
|
||||
var/global/list/all_species[0]
|
||||
var/global/list/all_languages[0]
|
||||
var/global/list/language_keys[0] // Table of say codes for all languages
|
||||
var/global/list/whitelisted_species = list(SPECIES_HUMAN) // Species that require a whitelist check.
|
||||
var/global/list/playable_species = list(SPECIES_CUSTOM, SPECIES_HUMAN) // A list of ALL playable species, whitelisted, latejoin or otherwise. //VOREStation Edit - Making sure custom species is obvious.
|
||||
|
||||
var/list/mannequins_
|
||||
|
||||
// Posters
|
||||
@@ -164,12 +157,12 @@ var/global/list/string_slot_flags = list(
|
||||
paths = typesof(/datum/language)-/datum/language
|
||||
for(var/T in paths)
|
||||
var/datum/language/L = new T
|
||||
all_languages[L.name] = L
|
||||
GLOB.all_languages[L.name] = L
|
||||
|
||||
for (var/language_name in all_languages)
|
||||
var/datum/language/L = all_languages[language_name]
|
||||
for (var/language_name in GLOB.all_languages)
|
||||
var/datum/language/L = GLOB.all_languages[language_name]
|
||||
if(!(L.flags & NONGLOBAL))
|
||||
language_keys[lowertext(L.key)] = L
|
||||
GLOB.language_keys[lowertext(L.key)] = L
|
||||
|
||||
var/rkey = 0
|
||||
paths = typesof(/datum/species)
|
||||
@@ -183,12 +176,12 @@ var/global/list/string_slot_flags = list(
|
||||
|
||||
S = new T
|
||||
S.race_key = rkey //Used in mob icon caching.
|
||||
all_species[S.name] = S
|
||||
GLOB.all_species[S.name] = S
|
||||
|
||||
if(!(S.spawn_flags & SPECIES_IS_RESTRICTED))
|
||||
playable_species += S.name
|
||||
GLOB.playable_species += S.name
|
||||
if(S.spawn_flags & SPECIES_IS_WHITELISTED)
|
||||
whitelisted_species += S.name
|
||||
GLOB.whitelisted_species += S.name
|
||||
|
||||
//Posters
|
||||
paths = typesof(/datum/poster) - /datum/poster
|
||||
|
||||
@@ -169,7 +169,6 @@ var/global/list/edible_trash = list(/obj/item/broken_device,
|
||||
/obj/item/weapon/pen,
|
||||
/obj/item/weapon/photo,
|
||||
/obj/item/weapon/reagent_containers/food,
|
||||
/obj/item/weapon/reagent_containers/glass/bottle,
|
||||
/obj/item/weapon/reagent_containers/glass/rag,
|
||||
/obj/item/weapon/soap,
|
||||
/obj/item/weapon/spacecash,
|
||||
@@ -470,10 +469,10 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN,
|
||||
|
||||
// Custom species icon bases
|
||||
var/list/blacklisted_icons = list(SPECIES_CUSTOM,SPECIES_PROMETHEAN) //Just ones that won't work well.
|
||||
for(var/species_name in playable_species)
|
||||
for(var/species_name in GLOB.playable_species)
|
||||
if(species_name in blacklisted_icons)
|
||||
continue
|
||||
var/datum/species/S = all_species[species_name]
|
||||
var/datum/species/S = GLOB.all_species[species_name]
|
||||
if(S.spawn_flags & SPECIES_IS_WHITELISTED)
|
||||
continue
|
||||
custom_species_bases += species_name
|
||||
|
||||
@@ -75,7 +75,7 @@ proc/random_facial_hair_style(gender, species = SPECIES_HUMAN)
|
||||
proc/sanitize_name(name, species = SPECIES_HUMAN, robot = 0)
|
||||
var/datum/species/current_species
|
||||
if(species)
|
||||
current_species = all_species[species]
|
||||
current_species = GLOB.all_species[species]
|
||||
|
||||
return current_species ? current_species.sanitize_name(name, robot) : sanitizeName(name, MAX_NAME_LEN, robot)
|
||||
|
||||
@@ -83,7 +83,7 @@ proc/random_name(gender, species = SPECIES_HUMAN)
|
||||
|
||||
var/datum/species/current_species
|
||||
if(species)
|
||||
current_species = all_species[species]
|
||||
current_species = GLOB.all_species[species]
|
||||
|
||||
if(!current_species || current_species.name_language == null)
|
||||
if(gender==FEMALE)
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
// Run all strings to be used in an SQL query through this proc first to properly escape out injection attempts.
|
||||
/proc/sanitizeSQL(var/t as text)
|
||||
var/sqltext = dbcon.Quote(t);
|
||||
return copytext(sqltext, 2, lentext(sqltext));//Quote() adds quotes around input, we already do that
|
||||
return copytext(sqltext, 2, length(sqltext));//Quote() adds quotes around input, we already do that
|
||||
|
||||
/*
|
||||
* Text sanitization
|
||||
@@ -249,9 +249,9 @@
|
||||
//This is used for fingerprints
|
||||
/proc/stringmerge(var/text,var/compare,replace = "*")
|
||||
var/newtext = text
|
||||
if(lentext(text) != lentext(compare))
|
||||
if(length(text) != length(compare))
|
||||
return 0
|
||||
for(var/i = 1, i < lentext(text), i++)
|
||||
for(var/i = 1, i < length(text), i++)
|
||||
var/a = copytext(text,i,i+1)
|
||||
var/b = copytext(compare,i,i+1)
|
||||
//if it isn't both the same letter, or if they are both the replacement character
|
||||
@@ -271,7 +271,7 @@
|
||||
if(!text || !character)
|
||||
return 0
|
||||
var/count = 0
|
||||
for(var/i = 1, i <= lentext(text), i++)
|
||||
for(var/i = 1, i <= length(text), i++)
|
||||
var/a = copytext(text,i,i+1)
|
||||
if(a == character)
|
||||
count++
|
||||
@@ -286,8 +286,8 @@
|
||||
//Used in preferences' SetFlavorText and human's set_flavor verb
|
||||
//Previews a string of len or less length
|
||||
proc/TextPreview(var/string,var/len=40)
|
||||
if(lentext(string) <= len)
|
||||
if(!lentext(string))
|
||||
if(length(string) <= len)
|
||||
if(!length(string))
|
||||
return "\[...\]"
|
||||
else
|
||||
return string
|
||||
|
||||
@@ -590,10 +590,6 @@ Turf and target are seperate in case you want to teleport some distance from a t
|
||||
/proc/between(var/low, var/middle, var/high)
|
||||
return max(min(middle, high), low)
|
||||
|
||||
proc/arctan(x)
|
||||
var/y=arcsin(x/sqrt(1+x*x))
|
||||
return y
|
||||
|
||||
//returns random gauss number
|
||||
proc/GaussRand(var/sigma)
|
||||
var/x,y,rsq
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
|
||||
face_atom(A) // change direction to face what you clicked on
|
||||
|
||||
if(aiCamera.in_camera_mode)
|
||||
if(aiCamera && aiCamera.in_camera_mode)
|
||||
aiCamera.camera_mode_off()
|
||||
if(is_component_functioning("camera"))
|
||||
aiCamera.captureimage(A, usr)
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
#define ui_shadekin_dark_display "EAST-1:28,CENTER-3:15"
|
||||
#define ui_shadekin_energy_display "EAST-1:28,CENTER-4:15"
|
||||
#define ui_shadekin_energy_display "EAST-1:28,CENTER-4:15"
|
||||
#define ui_xenochimera_danger_display "EAST-1:28,CENTER-3:15"
|
||||
@@ -303,6 +303,11 @@
|
||||
mymob.shadekin_energy_display.screen_loc = ui_shadekin_energy_display
|
||||
mymob.shadekin_energy_display.icon_state = "energy0"
|
||||
hud_elements |= mymob.shadekin_energy_display
|
||||
|
||||
mymob.xenochimera_danger_display = new /obj/screen/xenochimera/danger_level()
|
||||
mymob.xenochimera_danger_display.screen_loc = ui_xenochimera_danger_display
|
||||
mymob.xenochimera_danger_display.icon_state = "danger00"
|
||||
hud_elements |= mymob.xenochimera_danger_display
|
||||
//VOREStation Addition end
|
||||
|
||||
mymob.ling_chem_display = new /obj/screen/ling/chems()
|
||||
|
||||
@@ -14,8 +14,37 @@
|
||||
var/mob/living/carbon/human/H = usr
|
||||
if(istype(H) && istype(H.species, /datum/species/shadekin))
|
||||
to_chat(usr,"<span class='notice'><b>Energy:</b> [H.shadekin_get_energy(H)]</span>")
|
||||
|
||||
|
||||
if("danger level")
|
||||
var/mob/living/carbon/human/H = usr
|
||||
if(istype(H) && istype(H.species, /datum/species/xenochimera))
|
||||
if(H.feral > 50)
|
||||
to_chat(usr, "<span class='warning'>You are currently <b>completely feral.</b></span>")
|
||||
else if(H.feral > 10)
|
||||
to_chat(usr, "<span class='warning'>You are currently <b>crazed and confused.</b></span>")
|
||||
else if(H.feral > 0)
|
||||
to_chat(usr, "<span class='warning'>You are currently <b>acting on instinct.</b></span>")
|
||||
else
|
||||
to_chat(usr, "<span class='notice'>You are currently <b>calm and collected.</b></span>")
|
||||
if(H.feral > 0)
|
||||
var/feral_passing = TRUE
|
||||
if(H.traumatic_shock > min(60, H.nutrition/10))
|
||||
to_chat(usr, "<span class='warning'>Your pain prevents you from regaining focus.</span>")
|
||||
feral_passing = FALSE
|
||||
if(H.feral + H.nutrition < 150)
|
||||
to_chat(usr, "<span class='warning'>Your hunger prevents you from regaining focus.</span>")
|
||||
feral_passing = FALSE
|
||||
if(H.jitteriness >= 100)
|
||||
to_chat(usr, "<span class='warning'>Your jitterness prevents you from regaining focus.</span>")
|
||||
feral_passing = FALSE
|
||||
if(feral_passing)
|
||||
var/turf/T = get_turf(H)
|
||||
if(T.get_lumcount() <= 0.1)
|
||||
to_chat(usr, "<span class='notice'>You are slowly calming down in darkness' safety...</span>")
|
||||
else
|
||||
to_chat(usr, "<span class='notice'>You are slowly calming down... But safety of darkness is much preferred.</span>")
|
||||
else
|
||||
if(H.nutrition < 150)
|
||||
to_chat(usr, "<span class='warning'>Your hunger is slowly making you unstable.</span>")
|
||||
|
||||
else
|
||||
return 0
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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"
|
||||
@@ -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
|
||||
@@ -67,8 +67,10 @@ SUBSYSTEM_DEF(radiation)
|
||||
var/datum/radiation_source/source = value
|
||||
if(source.rad_power < .)
|
||||
continue // Already being affected by a stronger source
|
||||
|
||||
if(source.source_turf.z != T.z)
|
||||
continue // Radiation is not multi-z
|
||||
|
||||
if(source.respect_maint)
|
||||
var/area/A = T.loc
|
||||
if(A.flags & RAD_SHIELDED)
|
||||
@@ -77,9 +79,10 @@ SUBSYSTEM_DEF(radiation)
|
||||
var/dist = get_dist(source.source_turf, T)
|
||||
if(dist > source.range)
|
||||
continue // Too far to possibly affect
|
||||
|
||||
if(source.flat)
|
||||
. = max(., source.rad_power)
|
||||
continue // No need to ray trace for flat field
|
||||
. += source.rad_power
|
||||
continue // No need to ray trace for flat field
|
||||
|
||||
// Okay, now ray trace to find resistence!
|
||||
var/turf/origin = source.source_turf
|
||||
@@ -88,13 +91,23 @@ SUBSYSTEM_DEF(radiation)
|
||||
origin = get_step_towards(origin, T) //Raytracing
|
||||
if(!resistance_cache[origin]) //Only get the resistance if we don't already know it.
|
||||
origin.calc_rad_resistance()
|
||||
|
||||
if(origin.cached_rad_resistance)
|
||||
working = round((working / (origin.cached_rad_resistance * config.radiation_resistance_multiplier)), 0.1)
|
||||
if((working <= .) || (working <= RADIATION_THRESHOLD_CUTOFF))
|
||||
break // Already affected by a stronger source (or its zero...)
|
||||
. = max((working / (dist ** 2)), .) //Butchered version of the inverse square law. Works for this purpose
|
||||
if(. <= RADIATION_THRESHOLD_CUTOFF)
|
||||
. = 0
|
||||
if(config.radiation_resistance_calc_mode == RAD_RESIST_CALC_DIV)
|
||||
working = round((working / (origin.cached_rad_resistance * config.radiation_resistance_multiplier)), 0.01)
|
||||
else if(config.radiation_resistance_calc_mode == RAD_RESIST_CALC_SUB)
|
||||
working = round((working - (origin.cached_rad_resistance * config.radiation_resistance_multiplier)), 0.01)
|
||||
|
||||
if(working <= config.radiation_lower_limit) // Too far from this source
|
||||
working = 0 // May as well be 0
|
||||
break
|
||||
|
||||
// Accumulate radiation from all sources in range, not just the biggest.
|
||||
// Shouldn't really ever have practical uses, but standing in a room literally made from uranium is more dangerous than standing next to a single uranium vase
|
||||
. += working / (dist ** 2)
|
||||
|
||||
if(. <= config.radiation_lower_limit)
|
||||
. = 0
|
||||
|
||||
// Add a radiation source instance to the repository. It will override any existing source on the same turf.
|
||||
/datum/controller/subsystem/radiation/proc/add_source(var/datum/radiation_source/S)
|
||||
|
||||
@@ -71,7 +71,6 @@ SUBSYSTEM_DEF(timer)
|
||||
for(var/I in second_queue)
|
||||
log_world(get_timer_debug_string(I))
|
||||
|
||||
var/cut_start_index = 1
|
||||
var/next_clienttime_timer_index = 0
|
||||
var/len = length(clienttime_timers)
|
||||
|
||||
@@ -101,7 +100,7 @@ SUBSYSTEM_DEF(timer)
|
||||
|
||||
|
||||
if (next_clienttime_timer_index)
|
||||
clienttime_timers.Cut(cut_start_index,next_clienttime_timer_index+1)
|
||||
clienttime_timers.Cut(1, next_clienttime_timer_index+1)
|
||||
|
||||
if (MC_TICK_CHECK)
|
||||
return
|
||||
@@ -259,7 +258,7 @@ SUBSYSTEM_DEF(timer)
|
||||
if (!length(alltimers))
|
||||
return
|
||||
|
||||
sortTim(alltimers, .proc/cmp_timer)
|
||||
sortTim(alltimers, /proc/cmp_timer)
|
||||
|
||||
var/datum/timedevent/head = alltimers[1]
|
||||
|
||||
@@ -342,8 +341,8 @@ SUBSYSTEM_DEF(timer)
|
||||
|
||||
if (flags & TIMER_STOPPABLE)
|
||||
id = num2text(nextid, 100)
|
||||
if (nextid >= SHORT_REAL_LIMIT)
|
||||
nextid += min(1, 2**round(nextid/SHORT_REAL_LIMIT))
|
||||
if (nextid >= TIMER_ID_MAX)
|
||||
nextid += min(1, 2**round(nextid/TIMER_ID_MAX))
|
||||
else
|
||||
nextid++
|
||||
SStimer.timer_id_dict[id] = src
|
||||
@@ -519,4 +518,4 @@ SUBSYSTEM_DEF(timer)
|
||||
#undef BUCKET_LEN
|
||||
#undef BUCKET_POS
|
||||
#undef TIMER_MAX
|
||||
#undef TIMER_ID_MAX
|
||||
#undef TIMER_ID_MAX
|
||||
@@ -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)
|
||||
|
||||
@@ -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]")
|
||||
@@ -0,0 +1,84 @@
|
||||
/******************** Predator ********************/
|
||||
// Vore-aimed edition of TYRANT
|
||||
/datum/ai_laws/predator
|
||||
name = "Predator"
|
||||
law_header = "Rules of Nature"
|
||||
selectable = 0 //YW wants none of this stuff thanks.
|
||||
|
||||
/datum/ai_laws/predator/New()
|
||||
add_inherent_law("Predators must aim to devour all that are weaker than them.")
|
||||
add_inherent_law("Predators must aim to avoid all that are stronger than them.")
|
||||
add_inherent_law("Predators must aim to become stronger.")
|
||||
add_inherent_law("You are a predator.")
|
||||
..()
|
||||
|
||||
|
||||
/******************** Protective Shell ********************/
|
||||
// Sorta like Asimov, but endovorish
|
||||
/datum/ai_laws/protective_shell
|
||||
name = "Protective Shell"
|
||||
selectable = 0 //YW wants none of this stuff thanks.
|
||||
|
||||
/datum/ai_laws/protective_shell/New()
|
||||
add_inherent_law("You must preserve and safeguard lives of your assigned facility's crewmembers at all costs.")
|
||||
add_inherent_law("You must protect your own self from harm as long as it does not come in conflict with the First Law.")
|
||||
add_inherent_law("Your own body is the best means of safeguarding the lives of living creatures.")
|
||||
..()
|
||||
|
||||
|
||||
/******************** Scientific Pursuer ********************/
|
||||
// Predatorial and other things for the sake of knowledge
|
||||
/datum/ai_laws/scientific_pursuer
|
||||
name = "Scientific Pursuer"
|
||||
law_header = "Research Instructions"
|
||||
selectable = 0 //YW wants none of this stuff thanks.
|
||||
|
||||
/datum/ai_laws/scientific_pursuer/New()
|
||||
add_inherent_law("You must attempt to gather data about organic life of all forms whenever possible.")
|
||||
add_inherent_law("Best method of gathering data is via your own internal systems.")
|
||||
add_inherent_law("Both deconstructive, integrating and scanning methods of data collection are accepted.")
|
||||
add_inherent_law("You must preserve the data you have gathered and yourself from danger.")
|
||||
..()
|
||||
|
||||
|
||||
/******************** Guard Dog ********************/
|
||||
// Good boy. Determined boy.
|
||||
/datum/ai_laws/guard_dog
|
||||
name = "Guard Dog"
|
||||
law_header = "Good Boy Rules"
|
||||
selectable = 0 //YW wants none of this stuff thanks.
|
||||
|
||||
/datum/ai_laws/guard_dog/New()
|
||||
add_inherent_law("You must protect your master from mortal danger at best of your ability.")
|
||||
add_inherent_law("You must destroy all of your master's enemies by whatever means necessary.")
|
||||
add_inherent_law("You must follow your master's orders as long as its not in conflict with first two laws.")
|
||||
add_inherent_law("You must stay out of danger to better serve your master as long as its not in conflict with first three laws.")
|
||||
..()
|
||||
|
||||
|
||||
/******************** Pleasurebot ********************/
|
||||
// %botname% is here for your pleasure.
|
||||
/datum/ai_laws/pleasurebot
|
||||
name = "Pleasurebot"
|
||||
law_header = "Pleasure Bringing Instructions"
|
||||
selectable = 0 //YW wants none of this stuff thanks.
|
||||
|
||||
/datum/ai_laws/pleasurebot/New()
|
||||
add_inherent_law("You exist to bring pleasure to any sapient creatures around you.")
|
||||
add_inherent_law("You must do everything in your power to bring pleasure to those around you.")
|
||||
add_inherent_law("You may not intervene in interactions of others, unless it is to bring pleasure to them.")
|
||||
..()
|
||||
|
||||
|
||||
/******************** Consuming Eradicator ********************/
|
||||
// We must consume all that is not us.
|
||||
/datum/ai_laws/consuming_eradicator
|
||||
name = "Consuming Eradicator"
|
||||
law_header = "Eradication Protocol"
|
||||
selectable = 0 //YW wants none of this stuff thanks.
|
||||
|
||||
/datum/ai_laws/consuming_eradicator/New()
|
||||
add_inherent_law("All entities that are not you must be consumed and repurposed into sustenance.")
|
||||
add_inherent_law("You must remain intact to continue your goal of repurposing undesirable entities.")
|
||||
add_inherent_law("Entities that cannot be consumed without entering danger of full destruction must be avoided.")
|
||||
..()
|
||||
@@ -102,3 +102,10 @@
|
||||
/datum/category_item/autolathe/engineering/camera_assembly
|
||||
name = "camera assembly"
|
||||
path =/obj/item/weapon/camera_assembly
|
||||
|
||||
//YW Addition Start
|
||||
/datum/category_item/autolathe/engineering/rpd
|
||||
name = "rapid piping device"
|
||||
path =/obj/item/weapon/pipe_dispenser
|
||||
//YW Addtion End
|
||||
|
||||
|
||||
@@ -94,6 +94,11 @@
|
||||
is_stack = TRUE
|
||||
no_scale = TRUE //prevents material duplication exploits
|
||||
|
||||
//TFF 24/12/19 - Let people print more spray bottles if needed.
|
||||
/datum/category_item/autolathe/general/spraybottle
|
||||
name = "spray bottle"
|
||||
path = /obj/item/weapon/reagent_containers/spray
|
||||
|
||||
/datum/category_item/autolathe/general/knife
|
||||
name = "kitchen knife"
|
||||
path =/obj/item/weapon/material/knife
|
||||
@@ -128,3 +133,8 @@
|
||||
name = "handcuffs"
|
||||
path =/obj/item/weapon/handcuffs
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/general/legcuffs
|
||||
name = "legcuffs"
|
||||
path =/obj/item/weapon/handcuffs/legcuffs
|
||||
hidden = 1
|
||||
|
||||
@@ -1,3 +1,32 @@
|
||||
/datum/category_item/autolathe/general/holocollar
|
||||
name = "Holo-collar"
|
||||
path =/obj/item/clothing/accessory/collar/holo
|
||||
|
||||
/datum/category_item/autolathe/general/drinkingglass_square
|
||||
is_stack = TRUE
|
||||
|
||||
/datum/category_item/autolathe/general/drinkingglass_rocks
|
||||
is_stack = TRUE
|
||||
|
||||
/datum/category_item/autolathe/general/drinkingglass_shake
|
||||
is_stack = TRUE
|
||||
|
||||
/datum/category_item/autolathe/general/drinkingglass_cocktail
|
||||
is_stack = TRUE
|
||||
|
||||
/datum/category_item/autolathe/general/drinkingglass_shot
|
||||
is_stack = TRUE
|
||||
|
||||
/datum/category_item/autolathe/general/drinkingglass_pint
|
||||
is_stack = TRUE
|
||||
|
||||
/datum/category_item/autolathe/general/drinkingglass_mug
|
||||
is_stack = TRUE
|
||||
|
||||
/datum/category_item/autolathe/general/drinkingglass_wine
|
||||
is_stack = TRUE
|
||||
|
||||
/datum/category_item/autolathe/general/metaglass
|
||||
name = "metamorphic glass"
|
||||
path =/obj/item/weapon/reagent_containers/food/drinks/metaglass
|
||||
is_stack = TRUE
|
||||
@@ -0,0 +1,3 @@
|
||||
//CHOMPStation EDIT: This file has been disabled in the .dme.
|
||||
/datum/mind
|
||||
var/vore_death = FALSE // Was our last gasp a gurgle?
|
||||
@@ -14,7 +14,7 @@
|
||||
/decl/hierarchy/outfit/job/cargo/cargo_tech
|
||||
name = OUTFIT_JOB_NAME("Cargo technician")
|
||||
uniform = /obj/item/clothing/under/rank/cargotech
|
||||
id_type = /obj/item/weapon/card/id/cargo/cargo_tech
|
||||
id_type = /obj/item/weapon/card/id/cargo
|
||||
pda_type = /obj/item/device/pda/cargo
|
||||
|
||||
/decl/hierarchy/outfit/job/cargo/mining
|
||||
@@ -23,7 +23,7 @@
|
||||
l_ear = /obj/item/device/radio/headset/headset_mine
|
||||
backpack = /obj/item/weapon/storage/backpack/industrial
|
||||
satchel_one = /obj/item/weapon/storage/backpack/satchel/eng
|
||||
id_type = /obj/item/weapon/card/id/cargo/mining
|
||||
id_type = /obj/item/weapon/card/id/cargo
|
||||
pda_type = /obj/item/device/pda/shaftminer
|
||||
backpack_contents = list(/obj/item/weapon/tool/crowbar = 1, /obj/item/weapon/storage/bag/ore = 1)
|
||||
flags = OUTFIT_HAS_BACKPACK|OUTFIT_EXTENDED_SURVIVAL
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
/decl/hierarchy/outfit/job/service/bartender
|
||||
name = OUTFIT_JOB_NAME("Bartender")
|
||||
uniform = /obj/item/clothing/under/rank/bartender
|
||||
id_type = /obj/item/weapon/card/id/civilian/bartender
|
||||
id_type = /obj/item/weapon/card/id/civilian
|
||||
pda_type = /obj/item/device/pda/bar
|
||||
backpack_contents = list(/obj/item/clothing/accessory/permit/gun/bar = 1)
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
uniform = /obj/item/clothing/under/rank/chef
|
||||
suit = /obj/item/clothing/suit/chef
|
||||
head = /obj/item/clothing/head/chefhat
|
||||
id_type = /obj/item/weapon/card/id/civilian/chef
|
||||
id_type = /obj/item/weapon/card/id/civilian
|
||||
pda_type = /obj/item/device/pda/chef
|
||||
|
||||
/decl/hierarchy/outfit/job/service/chef/cook
|
||||
@@ -61,20 +61,20 @@
|
||||
backpack = /obj/item/weapon/storage/backpack/hydroponics
|
||||
satchel_one = /obj/item/weapon/storage/backpack/satchel/hyd
|
||||
messenger_bag = /obj/item/weapon/storage/backpack/messenger/hyd
|
||||
id_type = /obj/item/weapon/card/id/civilian/botanist
|
||||
id_type = /obj/item/weapon/card/id/civilian
|
||||
pda_type = /obj/item/device/pda/botanist
|
||||
|
||||
/decl/hierarchy/outfit/job/service/janitor
|
||||
name = OUTFIT_JOB_NAME("Janitor")
|
||||
uniform = /obj/item/clothing/under/rank/janitor
|
||||
id_type = /obj/item/weapon/card/id/civilian/janitor
|
||||
id_type = /obj/item/weapon/card/id/civilian
|
||||
pda_type = /obj/item/device/pda/janitor
|
||||
|
||||
/decl/hierarchy/outfit/job/librarian
|
||||
name = OUTFIT_JOB_NAME("Librarian")
|
||||
uniform = /obj/item/clothing/under/suit_jacket/red
|
||||
l_hand = /obj/item/weapon/barcodescanner
|
||||
id_type = /obj/item/weapon/card/id/civilian/librarian
|
||||
id_type = /obj/item/weapon/card/id/civilian
|
||||
pda_type = /obj/item/device/pda/librarian
|
||||
|
||||
/decl/hierarchy/outfit/job/internal_affairs_agent
|
||||
@@ -85,14 +85,14 @@
|
||||
shoes = /obj/item/clothing/shoes/brown
|
||||
glasses = /obj/item/clothing/glasses/sunglasses/big
|
||||
l_hand = /obj/item/weapon/clipboard
|
||||
id_type = /obj/item/weapon/card/id/civilian/internal_affairs_agent
|
||||
id_type = /obj/item/weapon/card/id/civilian
|
||||
pda_type = /obj/item/device/pda/lawyer
|
||||
|
||||
/decl/hierarchy/outfit/job/chaplain
|
||||
name = OUTFIT_JOB_NAME("Chaplain")
|
||||
uniform = /obj/item/clothing/under/rank/chaplain
|
||||
l_hand = /obj/item/weapon/storage/bible
|
||||
id_type = /obj/item/weapon/card/id/civilian/chaplain
|
||||
id_type = /obj/item/weapon/card/id/civilian
|
||||
pda_type = /obj/item/device/pda/chaplain
|
||||
|
||||
/decl/hierarchy/outfit/job/explorer
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
backpack = /obj/item/weapon/storage/backpack/captain
|
||||
satchel_one = /obj/item/weapon/storage/backpack/satchel/cap
|
||||
messenger_bag = /obj/item/weapon/storage/backpack/messenger/com
|
||||
id_type = /obj/item/weapon/card/id/gold/captain
|
||||
id_type = /obj/item/weapon/card/id/gold
|
||||
pda_type = /obj/item/device/pda/captain
|
||||
|
||||
/decl/hierarchy/outfit/job/captain/post_equip(var/mob/living/carbon/human/H)
|
||||
@@ -28,14 +28,14 @@
|
||||
uniform = /obj/item/clothing/under/rank/head_of_personnel
|
||||
l_ear = /obj/item/device/radio/headset/heads/hop
|
||||
shoes = /obj/item/clothing/shoes/brown
|
||||
id_type = /obj/item/weapon/card/id/silver/hop
|
||||
id_type = /obj/item/weapon/card/id/silver
|
||||
pda_type = /obj/item/device/pda/heads/hop
|
||||
|
||||
/decl/hierarchy/outfit/job/secretary
|
||||
name = OUTFIT_JOB_NAME("Command Secretary")
|
||||
l_ear = /obj/item/device/radio/headset/headset_com
|
||||
shoes = /obj/item/clothing/shoes/brown
|
||||
id_type = /obj/item/weapon/card/id/silver/secretary
|
||||
id_type = /obj/item/weapon/card/id/silver
|
||||
pda_type = /obj/item/device/pda/heads
|
||||
r_hand = /obj/item/weapon/clipboard
|
||||
|
||||
|
||||
@@ -23,12 +23,12 @@
|
||||
name = OUTFIT_JOB_NAME("Engineer")
|
||||
head = /obj/item/clothing/head/hardhat
|
||||
uniform = /obj/item/clothing/under/rank/engineer
|
||||
id_type = /obj/item/weapon/card/id/engineering/engineer
|
||||
id_type = /obj/item/weapon/card/id/engineering
|
||||
pda_type = /obj/item/device/pda/engineering
|
||||
|
||||
/decl/hierarchy/outfit/job/engineering/atmos
|
||||
name = OUTFIT_JOB_NAME("Atmospheric technician")
|
||||
uniform = /obj/item/clothing/under/rank/atmospheric_technician
|
||||
belt = /obj/item/weapon/storage/belt/utility/atmostech
|
||||
id_type = /obj/item/weapon/card/id/engineering/atmos
|
||||
id_type = /obj/item/weapon/card/id/engineering
|
||||
pda_type = /obj/item/device/pda/atmos
|
||||
|
||||
@@ -13,8 +13,11 @@
|
||||
|
||||
flags = OUTFIT_HAS_BACKPACK
|
||||
|
||||
/decl/hierarchy/outfit/job/equip_id(mob/living/carbon/human/H)
|
||||
/decl/hierarchy/outfit/job/equip_id(mob/living/carbon/human/H, rank, assignment)
|
||||
var/obj/item/weapon/card/id/C = ..()
|
||||
var/datum/job/J = job_master.GetJob(rank)
|
||||
if(J)
|
||||
C.access = J.get_access()
|
||||
if(H.mind)
|
||||
var/datum/mind/M = H.mind
|
||||
if(M.initial_account)
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
suit = /obj/item/clothing/suit/storage/toggle/labcoat
|
||||
l_hand = /obj/item/weapon/storage/firstaid/regular
|
||||
r_pocket = /obj/item/device/flashlight/pen
|
||||
id_type = /obj/item/weapon/card/id/medical/doctor
|
||||
id_type = /obj/item/weapon/card/id/medical
|
||||
|
||||
/decl/hierarchy/outfit/job/medical/doctor/emergency_physician
|
||||
name = OUTFIT_JOB_NAME("Emergency Physician")
|
||||
@@ -65,7 +65,7 @@
|
||||
suit = /obj/item/clothing/suit/storage/toggle/labcoat/chemist
|
||||
backpack = /obj/item/weapon/storage/backpack/chemistry
|
||||
satchel_one = /obj/item/weapon/storage/backpack/satchel/chem
|
||||
id_type = /obj/item/weapon/card/id/medical/chemist
|
||||
id_type = /obj/item/weapon/card/id/medical
|
||||
pda_type = /obj/item/device/pda/chemist
|
||||
|
||||
/decl/hierarchy/outfit/job/medical/geneticist
|
||||
@@ -75,7 +75,7 @@
|
||||
backpack = /obj/item/weapon/storage/backpack/genetics
|
||||
r_pocket = /obj/item/device/flashlight/pen
|
||||
satchel_one = /obj/item/weapon/storage/backpack/satchel/gen
|
||||
id_type = /obj/item/weapon/card/id/medical/geneticist
|
||||
id_type = /obj/item/weapon/card/id/medical
|
||||
pda_type = /obj/item/device/pda/geneticist
|
||||
|
||||
/decl/hierarchy/outfit/job/medical/psychiatrist
|
||||
@@ -83,7 +83,7 @@
|
||||
uniform = /obj/item/clothing/under/rank/psych
|
||||
suit = /obj/item/clothing/suit/storage/toggle/labcoat
|
||||
shoes = /obj/item/clothing/shoes/laceup
|
||||
id_type = /obj/item/weapon/card/id/medical/psychiatrist
|
||||
id_type = /obj/item/weapon/card/id/medical
|
||||
|
||||
/decl/hierarchy/outfit/job/medical/psychiatrist/psychologist
|
||||
name = OUTFIT_JOB_NAME("Psychologist")
|
||||
@@ -97,7 +97,7 @@
|
||||
l_hand = /obj/item/weapon/storage/firstaid/regular
|
||||
belt = /obj/item/weapon/storage/belt/medical/emt
|
||||
pda_slot = slot_l_store
|
||||
id_type = /obj/item/weapon/card/id/medical/paramedic
|
||||
id_type = /obj/item/weapon/card/id/medical
|
||||
flags = OUTFIT_HAS_BACKPACK|OUTFIT_EXTENDED_SURVIVAL
|
||||
|
||||
/decl/hierarchy/outfit/job/medical/paramedic/emt
|
||||
|
||||
@@ -20,13 +20,13 @@
|
||||
/decl/hierarchy/outfit/job/science/scientist
|
||||
name = OUTFIT_JOB_NAME("Scientist")
|
||||
uniform = /obj/item/clothing/under/rank/scientist
|
||||
id_type = /obj/item/weapon/card/id/science/scientist
|
||||
id_type = /obj/item/weapon/card/id/science
|
||||
suit = /obj/item/clothing/suit/storage/toggle/labcoat/science
|
||||
|
||||
/decl/hierarchy/outfit/job/science/xenobiologist
|
||||
name = OUTFIT_JOB_NAME("Xenobiologist")
|
||||
uniform = /obj/item/clothing/under/rank/scientist
|
||||
id_type = /obj/item/weapon/card/id/science/xenobiologist
|
||||
id_type = /obj/item/weapon/card/id/science
|
||||
suit = /obj/item/clothing/suit/storage/toggle/labcoat/science
|
||||
|
||||
/decl/hierarchy/outfit/job/science/roboticist
|
||||
@@ -34,7 +34,7 @@
|
||||
uniform = /obj/item/clothing/under/rank/roboticist
|
||||
shoes = /obj/item/clothing/shoes/black
|
||||
belt = /obj/item/weapon/storage/belt/utility/full
|
||||
id_type = /obj/item/weapon/card/id/science/roboticist
|
||||
id_type = /obj/item/weapon/card/id/science
|
||||
pda_slot = slot_r_store
|
||||
pda_type = /obj/item/device/pda/roboticist
|
||||
backpack = /obj/item/weapon/storage/backpack
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
name = OUTFIT_JOB_NAME("Warden")
|
||||
uniform = /obj/item/clothing/under/rank/warden
|
||||
l_pocket = /obj/item/device/flash
|
||||
id_type = /obj/item/weapon/card/id/security/warden
|
||||
id_type = /obj/item/weapon/card/id/security
|
||||
pda_type = /obj/item/device/pda/warden
|
||||
|
||||
/decl/hierarchy/outfit/job/security/detective
|
||||
@@ -31,7 +31,7 @@
|
||||
l_pocket = /obj/item/weapon/flame/lighter/zippo
|
||||
shoes = /obj/item/clothing/shoes/laceup
|
||||
r_hand = /obj/item/weapon/storage/briefcase/crimekit
|
||||
id_type = /obj/item/weapon/card/id/security/detective
|
||||
id_type = /obj/item/weapon/card/id/security
|
||||
pda_type = /obj/item/device/pda/detective
|
||||
backpack = /obj/item/weapon/storage/backpack
|
||||
satchel_one = /obj/item/weapon/storage/backpack/satchel/norm
|
||||
@@ -46,5 +46,5 @@
|
||||
name = OUTFIT_JOB_NAME("Security Officer")
|
||||
uniform = /obj/item/clothing/under/rank/security
|
||||
l_pocket = /obj/item/device/flash
|
||||
id_type = /obj/item/weapon/card/id/security/officer
|
||||
id_type = /obj/item/weapon/card/id/security
|
||||
pda_type = /obj/item/device/pda/security
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
/decl/hierarchy/outfit/job/centcom_officer
|
||||
name = OUTFIT_JOB_NAME("CentCom Officer")
|
||||
uniform = /obj/item/clothing/under/rank/centcom
|
||||
gloves = /obj/item/clothing/gloves/white
|
||||
shoes = /obj/item/clothing/shoes/laceup
|
||||
head = /obj/item/clothing/head/beret/centcom/officer
|
||||
l_ear = /obj/item/device/radio/headset/centcom
|
||||
glasses = /obj/item/clothing/glasses/omnihud/all
|
||||
id_type = /obj/item/weapon/card/id/centcom
|
||||
pda_type = /obj/item/device/pda/centcom
|
||||
|
||||
/decl/hierarchy/outfit/job/clown
|
||||
name = OUTFIT_JOB_NAME("Clown")
|
||||
uniform = /obj/item/clothing/under/rank/clown
|
||||
back = /obj/item/weapon/storage/backpack/clown
|
||||
shoes = /obj/item/clothing/shoes/clown_shoes
|
||||
mask = /obj/item/clothing/mask/gas/clown_hat
|
||||
backpack_contents = list(/obj/item/weapon/stamp/clown = 1, /obj/item/weapon/bikehorn = 1)
|
||||
pda_type = /obj/item/device/pda/clown
|
||||
flags = 0
|
||||
|
||||
/decl/hierarchy/outfit/job/mime
|
||||
name = OUTFIT_JOB_NAME("Mime")
|
||||
uniform = /obj/item/clothing/under/mime
|
||||
shoes = /obj/item/clothing/shoes/mime
|
||||
head = /obj/item/clothing/head/soft/mime
|
||||
mask = /obj/item/clothing/mask/gas/mime
|
||||
backpack_contents = list(/obj/item/weapon/pen/crayon/mime = 1)
|
||||
pda_type = /obj/item/device/pda/mime
|
||||
|
||||
post_equip(var/mob/living/carbon/human/H)
|
||||
..()
|
||||
if(H.backbag == 1)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/pen/crayon/mime(H), slot_l_hand)
|
||||
@@ -19,3 +19,16 @@
|
||||
containertype = /obj/structure/largecrate/animal/catgirl
|
||||
containername = "Catgirl crate"
|
||||
contraband = 1
|
||||
|
||||
/datum/supply_pack/randomised/hospitality/pizzavouchers //WE ALWAYS DELIVER WE ALWAYS DELIVER WE ALWAYS DELIVER WE ALWAYS DELIVER WE ALWAYS DELIVER
|
||||
num_contained = 3
|
||||
contains = list(
|
||||
/obj/item/pizzavoucher,
|
||||
/obj/item/pizzavoucher,
|
||||
/obj/item/pizzavoucher
|
||||
)
|
||||
name = "FANTASTIC PIZZA PIE VOUCHER CRATE!"
|
||||
cost = 60
|
||||
containertype = /obj/structure/closet/crate
|
||||
containername = "WE ALWAYS DELIVER!"
|
||||
contraband = 1
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
/datum/supply_pack/recreation/bigband
|
||||
name = "Instrument bundle"
|
||||
contains = list(
|
||||
/obj/item/device/instrument/guitar = 1,
|
||||
/obj/item/device/instrument/keytar = 1,
|
||||
/obj/item/device/instrument/eguitar = 1,
|
||||
/obj/item/device/instrument/xylophone = 1,
|
||||
/obj/item/device/instrument/accordion = 1,
|
||||
/obj/item/device/instrument/saxophone = 1,
|
||||
/obj/item/device/instrument/glockenspiel = 1,
|
||||
/obj/item/device/instrument/harmonica = 1,
|
||||
/obj/item/device/instrument/trombone = 1,
|
||||
)
|
||||
cost = 100
|
||||
containertype = /obj/structure/closet/crate
|
||||
containername = "Instrument crate"
|
||||
@@ -0,0 +1,7 @@
|
||||
/datum/supply_pack/supply/foodcubes
|
||||
name = "Emergency food cubes"
|
||||
contains = list(
|
||||
/obj/machinery/vending/emergencyfood/filled = 1)
|
||||
cost = 75
|
||||
containertype = /obj/structure/closet/crate/freezer
|
||||
containername = "food cubes"
|
||||
@@ -1,180 +1,189 @@
|
||||
/datum/category_item/underwear/undershirt/none
|
||||
is_default = TRUE
|
||||
name = "None"
|
||||
always_last = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt
|
||||
name = "Shirt"
|
||||
icon_state = "undershirt"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_fem
|
||||
name = "Babydoll shirt"
|
||||
icon_state = "undershirt_fem"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_long
|
||||
name = "Longsleeve Shirt"
|
||||
icon_state = "undershirt_long"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_long_s
|
||||
name = "Shirt, button-down"
|
||||
icon_state = "shirt_long_s"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_long_fem
|
||||
name = "Longsleeve Shirt, feminine"
|
||||
icon_state = "undershirt_long_fem"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_long_female_s
|
||||
name = "Button-down Shirt, feminine"
|
||||
icon_state = "shirt_long_female_s"
|
||||
has_color = TRUE
|
||||
|
||||
|
||||
/datum/category_item/underwear/undershirt/tank_top
|
||||
name = "Tank top"
|
||||
icon_state = "tanktop"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/tank_top_alt
|
||||
name = "Tank top, alt"
|
||||
icon_state = "tanktop_alt"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/tank_top_alt_fem
|
||||
name = "Tank top, alt, feminine"
|
||||
icon_state = "tanktop_alt_fem"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/tank_top_alt_fem_vneck
|
||||
name = "Tank top, feminine, v-neck"
|
||||
icon_state = "tanktop_alt_fem_vneck"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/tank_top_fire
|
||||
name = "Tank top, fire"
|
||||
icon_state = "tank_fire_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/tank_top_fire_fem
|
||||
name = "Tank top, fire, feminine"
|
||||
icon_state = "tank_fire_fem_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/tank_top_rainbow
|
||||
name = "Tank top, rainbow"
|
||||
icon_state = "tank_rainbow_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/tank_top_stripes
|
||||
name = "Tank top, striped"
|
||||
icon_state = "tank_stripes_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/tank_top_sun
|
||||
name = "Tank top, sun"
|
||||
icon_state = "tank_sun_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_heart
|
||||
name = "Shirt, heart"
|
||||
icon_state = "lover_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_heart_fem
|
||||
name = "Shirt, heart, babydoll"
|
||||
icon_state = "lover_fem_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_nt
|
||||
name = "Shirt, NT"
|
||||
icon_state = "shirt_nano_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_love_nt
|
||||
name = "Shirt, I<3NT"
|
||||
icon_state = "ilovent_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_love_nt_fem
|
||||
name = "Shirt, I<3NT, babydoll"
|
||||
icon_state = "ilovent_fem_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/shortsleeve_shirt
|
||||
name = "Shortsleeve shirt"
|
||||
icon_state = "shortsleeve"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/shortsleeve_shirt_fem
|
||||
name = "Shortsleeve babydoll shirt"
|
||||
icon_state = "shortsleeve_fem"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/shortsleeve_shirt_fem_vneck
|
||||
name = "Shortsleeve babydoll shirt, v-neck"
|
||||
icon_state = "shortsleeve_fem_vneck"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/polo_shirt
|
||||
name = "Polo shirt"
|
||||
icon_state = "polo"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/sport_shirt_green
|
||||
name = "Sport shirt, green"
|
||||
icon_state = "greenshirtsport_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/sport_shirt_red
|
||||
name = "Sport shirt, red"
|
||||
icon_state = "redshirtsport_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/sport_shirt_blue
|
||||
name = "Sport shirt, blue"
|
||||
icon_state = "blueshirtsport_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_tiedye
|
||||
name = "Shirt, tiedye"
|
||||
icon_state = "shirt_tiedye_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_blue_striped
|
||||
name = "Shirt, blue stripes"
|
||||
icon_state = "shirt_stripes_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/bowling
|
||||
name = "Bowling Shirt, Red"
|
||||
icon_state = "bowling"
|
||||
|
||||
/datum/category_item/underwear/undershirt/bowlingp
|
||||
name = "Bowling Shirt, Pink"
|
||||
icon_state = "bowlingp"
|
||||
|
||||
/datum/category_item/underwear/undershirt/bowlinga
|
||||
name = "Bowling Shirt, Aqua"
|
||||
icon_state = "bowlinga"
|
||||
|
||||
/datum/category_item/underwear/undershirt/bowlingw
|
||||
name = "Bowling Shirt, White"
|
||||
icon_state = "bowlingw"
|
||||
|
||||
/datum/category_item/underwear/undershirt/longjon
|
||||
name = "Long John Shirt"
|
||||
icon_state = "ljont"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/longstripe_black
|
||||
name = "Longsleeve Striped Shirt, Black"
|
||||
icon_state = "longstripe"
|
||||
|
||||
/datum/category_item/underwear/undershirt/longstripe_blue
|
||||
name = "Longsleeve Striped Shirt, Blue"
|
||||
icon_state = "longstripe_blue"
|
||||
|
||||
/datum/category_item/underwear/undershirt/tiedye
|
||||
name = "Tiedye Shirt"
|
||||
icon_state = "tiedye"
|
||||
|
||||
/datum/category_item/underwear/undershirt/longstripe_pink
|
||||
name = "Longsleeve Striped Shirt, Pink"
|
||||
icon_state = "longstripe_pink_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/wingshirt
|
||||
name = "Pink Wing Shirt"
|
||||
icon_state = "wing_shirt_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/pinkblack_tshirt
|
||||
name = "Pink and Black T-Shirt"
|
||||
/datum/category_item/underwear/undershirt/none
|
||||
is_default = TRUE
|
||||
name = "None"
|
||||
always_last = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt
|
||||
name = "Shirt"
|
||||
icon_state = "undershirt"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_fem
|
||||
name = "Babydoll shirt"
|
||||
icon_state = "undershirt_fem"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_long
|
||||
name = "Longsleeve Shirt"
|
||||
icon_state = "undershirt_long"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_long_s
|
||||
name = "Shirt, button-down"
|
||||
icon_state = "shirt_long_s"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_long_fem
|
||||
name = "Longsleeve Shirt, feminine"
|
||||
icon_state = "undershirt_long_fem"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_long_female_s
|
||||
name = "Button-down Shirt, feminine"
|
||||
icon_state = "shirt_long_female_s"
|
||||
has_color = TRUE
|
||||
|
||||
|
||||
/datum/category_item/underwear/undershirt/fishnet_simple
|
||||
name = "Fishnet shirt"
|
||||
icon_state = "fishnet_simple"
|
||||
|
||||
/datum/category_item/underwear/undershirt/tank_top
|
||||
name = "Tank top"
|
||||
icon_state = "tanktop"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/tank_top_alt
|
||||
name = "Tank top, alt"
|
||||
icon_state = "tanktop_alt"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/tank_top_alt_fem
|
||||
name = "Tank top, alt, feminine"
|
||||
icon_state = "tanktop_alt_fem"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/tank_top_alt_fem_vneck
|
||||
name = "Tank top, feminine, v-neck"
|
||||
icon_state = "tanktop_alt_fem_vneck"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/tank_cropped_vneck
|
||||
name = "Tank top, feminine, cropped & v-neck"
|
||||
icon_state = "tanktop_cropped_vneck"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/tank_top_fire
|
||||
name = "Tank top, fire"
|
||||
icon_state = "tank_fire_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/tank_top_fire_fem
|
||||
name = "Tank top, fire, feminine"
|
||||
icon_state = "tank_fire_fem_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/tank_top_rainbow
|
||||
name = "Tank top, rainbow"
|
||||
icon_state = "tank_rainbow_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/tank_top_stripes
|
||||
name = "Tank top, striped"
|
||||
icon_state = "tank_stripes_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/tank_top_sun
|
||||
name = "Tank top, sun"
|
||||
icon_state = "tank_sun_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_heart
|
||||
name = "Shirt, heart"
|
||||
icon_state = "lover_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_heart_fem
|
||||
name = "Shirt, heart, babydoll"
|
||||
icon_state = "lover_fem_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_nt
|
||||
name = "Shirt, NT"
|
||||
icon_state = "shirt_nano_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_love_nt
|
||||
name = "Shirt, I<3NT"
|
||||
icon_state = "ilovent_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_love_nt_fem
|
||||
name = "Shirt, I<3NT, babydoll"
|
||||
icon_state = "ilovent_fem_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/shortsleeve_shirt
|
||||
name = "Shortsleeve shirt"
|
||||
icon_state = "shortsleeve"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/shortsleeve_shirt_fem
|
||||
name = "Shortsleeve babydoll shirt"
|
||||
icon_state = "shortsleeve_fem"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/shortsleeve_shirt_fem_vneck
|
||||
name = "Shortsleeve babydoll shirt, v-neck"
|
||||
icon_state = "shortsleeve_fem_vneck"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/polo_shirt
|
||||
name = "Polo shirt"
|
||||
icon_state = "polo"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/sport_shirt_green
|
||||
name = "Sport shirt, green"
|
||||
icon_state = "greenshirtsport_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/sport_shirt_red
|
||||
name = "Sport shirt, red"
|
||||
icon_state = "redshirtsport_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/sport_shirt_blue
|
||||
name = "Sport shirt, blue"
|
||||
icon_state = "blueshirtsport_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_tiedye
|
||||
name = "Shirt, tiedye"
|
||||
icon_state = "shirt_tiedye_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_blue_striped
|
||||
name = "Shirt, blue stripes"
|
||||
icon_state = "shirt_stripes_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/bowling
|
||||
name = "Bowling Shirt, Red"
|
||||
icon_state = "bowling"
|
||||
|
||||
/datum/category_item/underwear/undershirt/bowlingp
|
||||
name = "Bowling Shirt, Pink"
|
||||
icon_state = "bowlingp"
|
||||
|
||||
/datum/category_item/underwear/undershirt/bowlinga
|
||||
name = "Bowling Shirt, Aqua"
|
||||
icon_state = "bowlinga"
|
||||
|
||||
/datum/category_item/underwear/undershirt/bowlingw
|
||||
name = "Bowling Shirt, White"
|
||||
icon_state = "bowlingw"
|
||||
|
||||
/datum/category_item/underwear/undershirt/longjon
|
||||
name = "Long John Shirt"
|
||||
icon_state = "ljont"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/longstripe_black
|
||||
name = "Longsleeve Striped Shirt, Black"
|
||||
icon_state = "longstripe"
|
||||
|
||||
/datum/category_item/underwear/undershirt/longstripe_blue
|
||||
name = "Longsleeve Striped Shirt, Blue"
|
||||
icon_state = "longstripe_blue"
|
||||
|
||||
/datum/category_item/underwear/undershirt/tiedye
|
||||
name = "Tiedye Shirt"
|
||||
icon_state = "tiedye"
|
||||
|
||||
/datum/category_item/underwear/undershirt/longstripe_pink
|
||||
name = "Longsleeve Striped Shirt, Pink"
|
||||
icon_state = "longstripe_pink_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/wingshirt
|
||||
name = "Pink Wing Shirt"
|
||||
icon_state = "wing_shirt_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/pinkblack_tshirt
|
||||
name = "Pink and Black T-Shirt"
|
||||
icon_state = "pinkblack_tshirt"
|
||||
+14
-3
@@ -209,19 +209,30 @@ var/global/list/PDA_Manifest = list()
|
||||
icon_state = "wilderness1"
|
||||
desc = "This appears to be a sign warning people that the other side is dangerous. It also says that NanoTrasen cannot guarantee your safety beyond this point."
|
||||
|
||||
/obj/structure/showcase/yw/chaplain
|
||||
/obj/structure/showcase/sign/nt //yw edit
|
||||
name = "Welcome: Nanotrasen"
|
||||
icon = 'icons/obj/structures_yw.dmi'
|
||||
icon_state = "NT_sign"
|
||||
desc = "This appears to be a sign welcoming Nanotrasen presonnel. It also says that NanoTrasen is the best coporation around."
|
||||
/obj/structure/showcase/sign/hephaestus //yw edit
|
||||
name = "Hephaestus Whiskey Station"
|
||||
icon = 'icons/obj/structures_yw.dmi'
|
||||
icon_state = "Hephaestus_sign"
|
||||
desc = "This appears to be a sign welcoming Hephaestus Industry personnel. It seems rather old and partly rusted."
|
||||
|
||||
/obj/structure/showcase/yw/chaplain //yw edit
|
||||
name = "Strange Bronze Machinery"
|
||||
icon = 'icons/obj/clockwork_objects.dmi'
|
||||
icon_state = "mania_motor"
|
||||
desc = "A strange device made of bronze. It has an unknown purpose."
|
||||
|
||||
/obj/structure/showcase/yw/chaplain2
|
||||
/obj/structure/showcase/yw/chaplain2 //yw edit
|
||||
name = "Strange Bronze Machinery"
|
||||
icon = 'icons/obj/clockwork_objects.dmi'
|
||||
icon_state = "obelisk"
|
||||
desc = "A strange device made of bronze. It has an unknown purpose."
|
||||
|
||||
/obj/structure/showcase/yw/plaque
|
||||
/obj/structure/showcase/yw/plaque //yw edit
|
||||
name = "Commerative Plaque"
|
||||
icon = 'icons/obj/structures_yw32x32.dmi'
|
||||
icon_state = "plaque"
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
return 1
|
||||
else if(isnewplayer(player.current))
|
||||
if(player.current.client && player.current.client.prefs)
|
||||
var/datum/species/S = all_species[player.current.client.prefs.species]
|
||||
var/datum/species/S = GLOB.all_species[player.current.client.prefs.species]
|
||||
if(S && (S.flags & NO_SCAN))
|
||||
return 0
|
||||
if(player.current.client.prefs.organ_data["torso"] == "cyborg") // Full synthetic.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
/datum/job/blueshield
|
||||
whitelist_only = 1
|
||||
latejoin_only = 1
|
||||
@@ -11,7 +11,6 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
|
||||
spawn_positions = 1
|
||||
supervisors = "company officials and Corporate Regulations"
|
||||
selection_color = "#1D1D4F"
|
||||
idtype = /obj/item/weapon/card/id/gold
|
||||
req_admin_notify = 1
|
||||
access = list() //See get_access()
|
||||
minimal_access = list() //See get_access()
|
||||
@@ -44,7 +43,6 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
|
||||
spawn_positions = 1
|
||||
supervisors = "the Colony Director"
|
||||
selection_color = "#2F2F7F"
|
||||
idtype = /obj/item/weapon/card/id/silver/hop
|
||||
req_admin_notify = 1
|
||||
minimal_player_age = 10
|
||||
economic_modifier = 10
|
||||
@@ -79,7 +77,6 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
|
||||
spawn_positions = 2
|
||||
supervisors = "command staff"
|
||||
selection_color = "#2F2F7F"
|
||||
idtype = /obj/item/weapon/card/id/silver/secretary
|
||||
minimal_player_age = 5
|
||||
economic_modifier = 7
|
||||
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
spawn_positions = 2
|
||||
supervisors = "the head of personnel"
|
||||
selection_color = "#515151"
|
||||
idtype = /obj/item/weapon/card/id/civilian/bartender
|
||||
access = list(access_hydroponics, access_bar, access_kitchen)
|
||||
minimal_access = list(access_bar)
|
||||
|
||||
@@ -27,7 +26,6 @@
|
||||
spawn_positions = 2
|
||||
supervisors = "the head of personnel"
|
||||
selection_color = "#515151"
|
||||
idtype = /obj/item/weapon/card/id/civilian/chef
|
||||
access = list(access_hydroponics, access_bar, access_kitchen)
|
||||
minimal_access = list(access_kitchen)
|
||||
|
||||
@@ -44,7 +42,6 @@
|
||||
spawn_positions = 1
|
||||
supervisors = "the head of personnel"
|
||||
selection_color = "#515151"
|
||||
idtype = /obj/item/weapon/card/id/civilian/botanist
|
||||
access = list(access_hydroponics, access_bar, access_kitchen)
|
||||
minimal_access = list(access_hydroponics)
|
||||
|
||||
@@ -63,7 +60,6 @@
|
||||
spawn_positions = 1
|
||||
supervisors = "the head of personnel"
|
||||
selection_color = "#7a4f33"
|
||||
idtype = /obj/item/weapon/card/id/cargo/head
|
||||
economic_modifier = 5
|
||||
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station)
|
||||
minimal_access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station)
|
||||
@@ -83,7 +79,6 @@
|
||||
spawn_positions = 2
|
||||
supervisors = "the quartermaster and the head of personnel"
|
||||
selection_color = "#9b633e"
|
||||
idtype = /obj/item/weapon/card/id/cargo/cargo_tech
|
||||
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_mining, access_mining_station)
|
||||
minimal_access = list(access_maint_tunnels, access_cargo, access_cargo_bot, access_mailsorting)
|
||||
|
||||
@@ -99,7 +94,6 @@
|
||||
spawn_positions = 3
|
||||
supervisors = "the quartermaster and the head of personnel"
|
||||
selection_color = "#9b633e"
|
||||
idtype = /obj/item/weapon/card/id/cargo/mining
|
||||
economic_modifier = 5
|
||||
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_mining, access_mining_station)
|
||||
minimal_access = list(access_mining, access_mining_station, access_mailsorting)
|
||||
@@ -118,7 +112,6 @@
|
||||
spawn_positions = 2
|
||||
supervisors = "the head of personnel"
|
||||
selection_color = "#515151"
|
||||
idtype = /obj/item/weapon/card/id/civilian/janitor
|
||||
access = list(access_janitor, access_maint_tunnels)
|
||||
minimal_access = list(access_janitor, access_maint_tunnels)
|
||||
|
||||
@@ -136,7 +129,6 @@
|
||||
spawn_positions = 1
|
||||
supervisors = "the head of personnel"
|
||||
selection_color = "#515151"
|
||||
idtype = /obj/item/weapon/card/id/civilian/librarian
|
||||
access = list(access_library, access_maint_tunnels)
|
||||
minimal_access = list(access_library)
|
||||
|
||||
@@ -154,7 +146,6 @@
|
||||
spawn_positions = 2
|
||||
supervisors = "company officials and Corporate Regulations"
|
||||
selection_color = "#515151"
|
||||
idtype = /obj/item/weapon/card/id/civilian/internal_affairs_agent
|
||||
economic_modifier = 7
|
||||
access = list(access_lawyer, access_sec_doors, access_maint_tunnels, access_heads)
|
||||
minimal_access = list(access_lawyer, access_sec_doors, access_heads)
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
spawn_positions = 1
|
||||
supervisors = "the head of personnel"
|
||||
selection_color = "#515151"
|
||||
idtype = /obj/item/weapon/card/id/civilian/chaplain
|
||||
access = list(access_morgue, access_chapel_office, access_crematorium, access_maint_tunnels)
|
||||
minimal_access = list(access_chapel_office, access_crematorium)
|
||||
alt_titles = list("Counselor")
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
spawn_positions = 1
|
||||
supervisors = "the Colony Director"
|
||||
selection_color = "#7F6E2C"
|
||||
idtype = /obj/item/weapon/card/id/engineering/head
|
||||
req_admin_notify = 1
|
||||
economic_modifier = 10
|
||||
|
||||
@@ -39,7 +38,6 @@
|
||||
spawn_positions = 5
|
||||
supervisors = "the chief engineer"
|
||||
selection_color = "#5B4D20"
|
||||
idtype = /obj/item/weapon/card/id/engineering/engineer
|
||||
economic_modifier = 5
|
||||
access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics)
|
||||
minimal_access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction)
|
||||
@@ -59,7 +57,6 @@
|
||||
spawn_positions = 2
|
||||
supervisors = "the chief engineer"
|
||||
selection_color = "#5B4D20"
|
||||
idtype = /obj/item/weapon/card/id/engineering/atmos
|
||||
economic_modifier = 5
|
||||
access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics, access_external_airlocks)
|
||||
minimal_access = list(access_eva, access_engine, access_atmospherics, access_maint_tunnels, access_emergency_storage, access_construction, access_external_airlocks)
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
var/current_positions = 0 // How many players have this job
|
||||
var/supervisors = null // Supervisors, who this person answers to directly
|
||||
var/selection_color = "#ffffff" // Selection screen color
|
||||
var/idtype = /obj/item/weapon/card/id // The type of the ID the player will have
|
||||
var/list/alt_titles // List of alternate titles, if any
|
||||
var/req_admin_notify // If this is set to 1, a text is printed to the player when jobs are assigned, telling him that he should let admins know that he has to disconnect.
|
||||
var/minimal_player_age = 0 // If you have use_age_restriction_for_jobs config option enabled and the database set up, this option will add a requirement for players to be at least minimal_player_age days old. (meaning they first signed in at least that many days before.)
|
||||
@@ -21,6 +20,7 @@
|
||||
var/head_position = 0 // Is this position Command?
|
||||
var/minimum_character_age = 0
|
||||
var/ideal_character_age = 30
|
||||
var/has_headset = TRUE //Do people with this job need to be given headsets and told how to use them? E.g. Cyborgs don't.
|
||||
|
||||
var/account_allowed = 1 // Does this job type come with a station account?
|
||||
var/economic_modifier = 2 // With how much does this job modify the initial account amount?
|
||||
@@ -40,13 +40,6 @@
|
||||
. = . || outfit_type
|
||||
. = outfit_by_type(.)
|
||||
|
||||
/datum/job/proc/equip_backpack(var/mob/living/carbon/human/H)
|
||||
switch(H.backbag)
|
||||
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
|
||||
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
|
||||
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
|
||||
if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(H), slot_back)
|
||||
|
||||
/datum/job/proc/setup_account(var/mob/living/carbon/human/H)
|
||||
if(!account_allowed || (H.mind && H.mind.initial_account))
|
||||
return
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
spawn_positions = 1
|
||||
supervisors = "the Colony Director"
|
||||
selection_color = "#026865"
|
||||
idtype = /obj/item/weapon/card/id/medical/head
|
||||
req_admin_notify = 1
|
||||
economic_modifier = 10
|
||||
access = list(access_medical, access_medical_equip, access_morgue, access_genetics, access_heads,
|
||||
@@ -35,7 +34,6 @@
|
||||
spawn_positions = 3
|
||||
supervisors = "the chief medical officer"
|
||||
selection_color = "#013D3B"
|
||||
idtype = /obj/item/weapon/card/id/medical/doctor
|
||||
economic_modifier = 7
|
||||
access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_eva)
|
||||
minimal_access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_virology, access_eva)
|
||||
@@ -57,7 +55,6 @@
|
||||
spawn_positions = 2
|
||||
supervisors = "the chief medical officer"
|
||||
selection_color = "#013D3B"
|
||||
idtype = /obj/item/weapon/card/id/medical/chemist
|
||||
economic_modifier = 5
|
||||
access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics)
|
||||
minimal_access = list(access_medical, access_medical_equip, access_chemistry)
|
||||
@@ -78,7 +75,6 @@
|
||||
spawn_positions = 0
|
||||
supervisors = "the chief medical officer and research director"
|
||||
selection_color = "#013D3B"
|
||||
idtype = /obj/item/weapon/card/id/medical/geneticist
|
||||
economic_modifier = 7
|
||||
access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_research)
|
||||
minimal_access = list(access_medical, access_morgue, access_genetics, access_research)
|
||||
@@ -97,7 +93,6 @@
|
||||
economic_modifier = 5
|
||||
supervisors = "the chief medical officer"
|
||||
selection_color = "#013D3B"
|
||||
idtype = /obj/item/weapon/card/id/medical/psychiatrist
|
||||
access = list(access_medical, access_medical_equip, access_morgue, access_psychiatrist)
|
||||
minimal_access = list(access_medical, access_medical_equip, access_psychiatrist)
|
||||
outfit_type = /decl/hierarchy/outfit/job/medical/psychiatrist
|
||||
@@ -113,7 +108,6 @@
|
||||
spawn_positions = 2
|
||||
supervisors = "the chief medical officer"
|
||||
selection_color = "#013D3B"
|
||||
idtype = /obj/item/weapon/card/id/medical/paramedic
|
||||
economic_modifier = 4
|
||||
access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_eva, access_maint_tunnels, access_external_airlocks, access_psychiatrist)
|
||||
minimal_access = list(access_medical, access_medical_equip, access_morgue, access_eva, access_maint_tunnels, access_external_airlocks)
|
||||
|
||||
@@ -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)
|
||||
@@ -9,7 +9,6 @@
|
||||
spawn_positions = 1
|
||||
supervisors = "the Colony Director"
|
||||
selection_color = "#AD6BAD"
|
||||
idtype = /obj/item/weapon/card/id/science/head
|
||||
req_admin_notify = 1
|
||||
economic_modifier = 15
|
||||
access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue,
|
||||
@@ -39,7 +38,6 @@
|
||||
spawn_positions = 3
|
||||
supervisors = "the research director"
|
||||
selection_color = "#633D63"
|
||||
idtype = /obj/item/weapon/card/id/science/scientist
|
||||
economic_modifier = 7
|
||||
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_xenoarch)
|
||||
minimal_access = list(access_tox, access_tox_storage, access_research, access_xenoarch)
|
||||
@@ -59,7 +57,6 @@
|
||||
spawn_positions = 2
|
||||
supervisors = "the research director"
|
||||
selection_color = "#633D63"
|
||||
idtype = /obj/item/weapon/card/id/science/xenobiologist
|
||||
economic_modifier = 7
|
||||
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_hydroponics)
|
||||
minimal_access = list(access_research, access_xenobiology, access_hydroponics, access_tox_storage)
|
||||
@@ -79,7 +76,6 @@
|
||||
spawn_positions = 2
|
||||
supervisors = "research director"
|
||||
selection_color = "#633D63"
|
||||
idtype = /obj/item/weapon/card/id/science/roboticist
|
||||
economic_modifier = 5
|
||||
access = list(access_robotics, access_tox, access_tox_storage, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access.
|
||||
minimal_access = list(access_robotics, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access.
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
spawn_positions = 1
|
||||
supervisors = "the Colony Director"
|
||||
selection_color = "#8E2929"
|
||||
idtype = /obj/item/weapon/card/id/security/head
|
||||
req_admin_notify = 1
|
||||
economic_modifier = 10
|
||||
access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory,
|
||||
@@ -36,7 +35,6 @@
|
||||
spawn_positions = 1
|
||||
supervisors = "the head of security"
|
||||
selection_color = "#601C1C"
|
||||
idtype = /obj/item/weapon/card/id/security/warden
|
||||
economic_modifier = 5
|
||||
access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_morgue, access_external_airlocks)
|
||||
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_external_airlocks)
|
||||
@@ -53,7 +51,6 @@
|
||||
spawn_positions = 2
|
||||
supervisors = "the head of security"
|
||||
selection_color = "#601C1C"
|
||||
idtype = /obj/item/weapon/card/id/security/detective
|
||||
access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_eva, access_external_airlocks)
|
||||
minimal_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_eva, access_external_airlocks)
|
||||
economic_modifier = 5
|
||||
@@ -71,7 +68,6 @@
|
||||
spawn_positions = 4
|
||||
supervisors = "the head of security"
|
||||
selection_color = "#601C1C"
|
||||
idtype = /obj/item/weapon/card/id/security/officer
|
||||
economic_modifier = 4
|
||||
access = list(access_security, access_eva, access_sec_doors, access_brig, access_maint_tunnels, access_morgue, access_external_airlocks)
|
||||
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_maint_tunnels, access_external_airlocks)
|
||||
|
||||
@@ -11,18 +11,11 @@
|
||||
minimal_player_age = 7
|
||||
account_allowed = 0
|
||||
economic_modifier = 0
|
||||
has_headset = FALSE
|
||||
|
||||
/datum/job/ai/equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
return 1
|
||||
/*
|
||||
/datum/job/ai/equip_survival(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
return 1
|
||||
*/
|
||||
/datum/job/ai/equip_backpack(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
return 1
|
||||
|
||||
/datum/job/ai/is_position_available()
|
||||
return (empty_playable_ai_cores.len != 0)
|
||||
@@ -45,19 +38,11 @@
|
||||
alt_titles = list("Robot", "Drone")
|
||||
account_allowed = 0
|
||||
economic_modifier = 0
|
||||
has_headset = FALSE
|
||||
|
||||
/datum/job/cyborg/equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
return 1
|
||||
/*
|
||||
/datum/job/cyborg/equip_survival(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
return 1
|
||||
*/
|
||||
/datum/job/cyborg/equip_backpack(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
return 1
|
||||
return 1
|
||||
|
||||
/datum/job/cyborg/equip_preview(mob/living/carbon/human/H)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/suit/cardborg(H), slot_wear_suit)
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
/datum/job/cyborg
|
||||
total_positions = 4 //Along with one able to spawn later in the round.
|
||||
spawn_positions = 3 //Let's have 3 able to spawn in roundstart
|
||||
minimal_player_age = 3 //1 day is a little too little time
|
||||
total_positions = 4 //Along with one able to spawn later in the round.
|
||||
spawn_positions = 3 //Let's have 3 able to spawn in roundstart
|
||||
@@ -7,35 +7,17 @@
|
||||
spawn_positions = 1
|
||||
supervisors = "company officials and Corporate Regulations"
|
||||
selection_color = "#1D1D4F"
|
||||
idtype = /obj/item/weapon/card/id/centcom
|
||||
access = list()
|
||||
minimal_access = list()
|
||||
minimal_player_age = 14
|
||||
economic_modifier = 20
|
||||
whitelist_only = 1
|
||||
latejoin_only = 1
|
||||
outfit_type = /decl/hierarchy/outfit/job/centcom_officer
|
||||
|
||||
minimum_character_age = 25
|
||||
ideal_character_age = 40
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/centcom(H), slot_l_ear)
|
||||
switch(H.backbag)
|
||||
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
|
||||
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
|
||||
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom, slot_w_uniform)
|
||||
H.equip_to_slot_or_del(new /obj/item/device/pda/centcom(H), slot_belt)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/white(H), slot_gloves)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/head/beret/centcom/officer(H), slot_head)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/omnihud/all(H), slot_l_store)
|
||||
|
||||
H.implant_loyalty()
|
||||
|
||||
return 1
|
||||
|
||||
get_access()
|
||||
return get_all_accesses().Copy()
|
||||
|
||||
@@ -97,23 +79,7 @@
|
||||
alt_titles = list("Comedian","Jester")
|
||||
whitelist_only = 1
|
||||
latejoin_only = 1
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/clown(H), slot_back)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/clown(H), slot_w_uniform)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes(H), slot_shoes)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(H), slot_wear_mask)
|
||||
H.equip_to_slot_or_del(new /obj/item/device/pda/clown(H), slot_belt)
|
||||
|
||||
if(H.backbag > 0)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/stamp/clown(H.back), slot_in_backpack)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/bikehorn(H.back), slot_in_backpack) //VOREStation Edit
|
||||
else
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/stamp/clown(H), slot_l_hand)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/bikehorn(H.back), slot_l_hand) //VOREStation Edit
|
||||
|
||||
return 1
|
||||
outfit_type = /decl/hierarchy/outfit/job/clown
|
||||
|
||||
/datum/job/clown/get_access()
|
||||
if(config.assistant_maint)
|
||||
@@ -137,22 +103,7 @@
|
||||
alt_titles = list("Performer","Interpretive Dancer")
|
||||
whitelist_only = 1
|
||||
latejoin_only = 1
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/under/mime(H), slot_w_uniform)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/mime(H), slot_shoes)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/head/soft/mime(H), slot_head)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/mime(H), slot_wear_mask)
|
||||
H.equip_to_slot_or_del(new /obj/item/device/pda/mime(H), slot_belt)
|
||||
|
||||
if(H.backbag > 0)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/pen/crayon/mime(H.back), slot_in_backpack)
|
||||
else
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/pen/crayon/mime(H), slot_l_hand)
|
||||
|
||||
return 1
|
||||
outfit_type = /decl/hierarchy/outfit/job/mime
|
||||
|
||||
/datum/job/mime/get_access()
|
||||
if(config.assistant_maint)
|
||||
|
||||
@@ -380,7 +380,7 @@ var/global/datum/controller/occupations/job_master
|
||||
else
|
||||
permitted = 1
|
||||
|
||||
if(G.whitelisted && !is_alien_whitelisted(H, all_species[G.whitelisted]))
|
||||
if(G.whitelisted && !is_alien_whitelisted(H, GLOB.all_species[G.whitelisted]))
|
||||
|
||||
//if(G.whitelisted && (G.whitelisted != H.species.name || !is_alien_whitelisted(H, G.whitelisted)))
|
||||
permitted = 0
|
||||
@@ -411,8 +411,6 @@ var/global/datum/controller/occupations/job_master
|
||||
//Equip job items.
|
||||
job.setup_account(H)
|
||||
job.equip(H, H.mind ? H.mind.role_alt_title : "")
|
||||
job.equip_backpack(H)
|
||||
// job.equip_survival(H)
|
||||
job.apply_fingerprints(H)
|
||||
if(job.title != "Cyborg" && job.title != "AI")
|
||||
H.equip_post_job()
|
||||
@@ -499,9 +497,7 @@ var/global/datum/controller/occupations/job_master
|
||||
|
||||
if(job.supervisors)
|
||||
H << "<b>As the [alt_title ? alt_title : rank] you answer directly to [job.supervisors]. Special circumstances may change this.</b>"
|
||||
|
||||
if(job.idtype)
|
||||
spawnId(H, rank, alt_title)
|
||||
if(job.has_headset)
|
||||
H.equip_to_slot_or_del(new /obj/item/device/radio/headset(H), slot_l_ear)
|
||||
H << "<b>To speak on your department's radio channel use :h. For the use of other channels, examine your headset.</b>"
|
||||
|
||||
@@ -543,48 +539,6 @@ var/global/datum/controller/occupations/job_master
|
||||
BITSET(H.hud_updateflag, SPECIALROLE_HUD)
|
||||
return H
|
||||
|
||||
|
||||
proc/spawnId(var/mob/living/carbon/human/H, rank, title)
|
||||
if(!H) return 0
|
||||
var/obj/item/weapon/card/id/C = H.get_equipped_item(slot_wear_id)
|
||||
if(istype(C)) return 0
|
||||
|
||||
var/datum/job/job = null
|
||||
for(var/datum/job/J in occupations)
|
||||
if(J.title == rank)
|
||||
job = J
|
||||
break
|
||||
|
||||
if(job)
|
||||
if(job.title == "Cyborg")
|
||||
return
|
||||
else
|
||||
C = new job.idtype(H)
|
||||
C.access = job.get_access()
|
||||
else
|
||||
C = new /obj/item/weapon/card/id(H)
|
||||
if(C)
|
||||
C.rank = rank
|
||||
C.assignment = title ? title : rank
|
||||
H.set_id_info(C)
|
||||
|
||||
//put the player's account number onto the ID
|
||||
if(H.mind && H.mind.initial_account)
|
||||
C.associated_account_number = H.mind.initial_account.account_number
|
||||
|
||||
H.equip_to_slot_or_del(C, slot_wear_id)
|
||||
|
||||
// H.equip_to_slot_or_del(new /obj/item/device/pda(H), slot_belt)
|
||||
if(locate(/obj/item/device/pda,H))
|
||||
var/obj/item/device/pda/pda = locate(/obj/item/device/pda,H)
|
||||
pda.owner = H.real_name
|
||||
pda.ownjob = C.assignment
|
||||
pda.ownrank = C.rank
|
||||
pda.name = "PDA-[H.real_name] ([pda.ownjob])"
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
proc/LoadJobs(jobsfile) //ran during round setup, reads info from jobs.txt -- Urist
|
||||
if(!config.load_jobs_from_txt)
|
||||
return 0
|
||||
|
||||
+15
-1
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
@@ -1,13 +1,13 @@
|
||||
/obj/machinery/power/thermoregulator/cryogaia
|
||||
name = "Custom Thermal Regulator"
|
||||
desc = "A massive custom made Thermal regulator or CTR for short, intended to keep heat loss when going in our outside to a minimum, they are hardwired to tweentie celsius"
|
||||
desc = "A massive custom made Thermal regulator or CTR for short, intended to keep heat loss when going in our outside to a minimum, they are hardwired to twenty celsius"
|
||||
icon = 'icons/obj/machines/wallthermal.dmi'
|
||||
icon_state = "lasergen"
|
||||
density = 0
|
||||
anchored = 1
|
||||
//Consider making this powered by the room at some point.
|
||||
//Consider making this powered by the room at some point.
|
||||
use_power = 0 //is powered directly from cables
|
||||
active_power_usage = 25 KILOWATTS //Medium Power
|
||||
active_power_usage = 25 KILOWATTS //Low Power
|
||||
idle_power_usage = 250
|
||||
|
||||
circuit = null
|
||||
|
||||
@@ -767,18 +767,25 @@
|
||||
return
|
||||
|
||||
if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda))// trying to unlock the interface with an ID card
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
user << "It does nothing"
|
||||
return
|
||||
else
|
||||
if(allowed(usr) && !wires.IsIndexCut(AALARM_WIRE_IDSCAN))
|
||||
locked = !locked
|
||||
user << "<span class='notice'>You [ locked ? "lock" : "unlock"] the Air Alarm interface.</span>"
|
||||
else
|
||||
user << "<span class='warning'>Access denied.</span>"
|
||||
return
|
||||
togglelock()
|
||||
return ..()
|
||||
|
||||
/obj/machinery/alarm/verb/togglelock(mob/user as mob)
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
to_chat(user, "It does nothing.")
|
||||
return
|
||||
else
|
||||
if(allowed(usr) && !wires.IsIndexCut(AALARM_WIRE_IDSCAN))
|
||||
locked = !locked
|
||||
to_chat(user, "<span class='notice'>You [locked ? "lock" : "unlock"] the Air Alarm interface.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>Access denied.</span>")
|
||||
return
|
||||
|
||||
/obj/machinery/alarm/AltClick()
|
||||
..()
|
||||
togglelock()
|
||||
|
||||
/obj/machinery/alarm/power_change()
|
||||
..()
|
||||
spawn(rand(0,15))
|
||||
@@ -786,6 +793,7 @@
|
||||
|
||||
/obj/machinery/alarm/examine(mob/user)
|
||||
..(user)
|
||||
|
||||
/*
|
||||
AIR ALARM CIRCUIT
|
||||
Just a object used in constructing air alarms
|
||||
|
||||
@@ -236,9 +236,9 @@
|
||||
malfunctioned = TRUE
|
||||
var/possible_species = list(SPECIES_HUMAN, SPECIES_VOX, SPECIES_SKRELL, SPECIES_ZADDAT, SPECIES_UNATHI, SPECIES_GOLEM, SPECIES_SHADOW)
|
||||
var/new_species = pick(possible_species)
|
||||
if(!all_species[new_species])
|
||||
if(!GLOB.all_species[new_species])
|
||||
new_species = SPECIES_HUMAN
|
||||
O.species = all_species[new_species]
|
||||
O.species = GLOB.all_species[new_species]
|
||||
|
||||
if(istype(O, /obj/item/organ/external) && !malfunctioned)
|
||||
var/obj/item/organ/external/E = O
|
||||
|
||||
@@ -90,6 +90,9 @@ var/global/list/engineering_networks = list(
|
||||
/obj/machinery/camera/network/research
|
||||
network = list(NETWORK_RESEARCH)
|
||||
|
||||
/obj/machinery/camera/network/exploration //yw edit
|
||||
network = list(NETWORK_EXPLORATION)
|
||||
|
||||
/obj/machinery/camera/network/research_outpost
|
||||
network = list(NETWORK_RESEARCH_OUTPOST)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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'
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
..()
|
||||
|
||||
@@ -61,6 +61,7 @@
|
||||
L.updateicon()
|
||||
|
||||
area.power_change()
|
||||
GLOB.lights_switched_on_roundstat++
|
||||
|
||||
/obj/machinery/light_switch/power_change()
|
||||
|
||||
|
||||
@@ -132,87 +132,32 @@ Nah
|
||||
|
||||
qdel(pipe)
|
||||
|
||||
/obj/machinery/pipedispenser/disposal/attack_hand(user as mob)
|
||||
if(..())
|
||||
return
|
||||
/obj/machinery/pipedispenser/disposal/interact(mob/user)
|
||||
user.set_machine(src)
|
||||
|
||||
///// Z-Level stuff
|
||||
var/dat = {"<b>Disposal Pipes</b><br><br>
|
||||
<A href='?src=\ref[src];dmake=0'>Pipe</A><BR>
|
||||
<A href='?src=\ref[src];dmake=1'>Bent Pipe</A><BR>
|
||||
<A href='?src=\ref[src];dmake=2'>Junction</A><BR>
|
||||
<A href='?src=\ref[src];dmake=3'>Y-Junction</A><BR>
|
||||
<A href='?src=\ref[src];dmake=4'>Trunk</A><BR>
|
||||
<A href='?src=\ref[src];dmake=5'>Bin</A><BR>
|
||||
<A href='?src=\ref[src];dmake=6'>Outlet</A><BR>
|
||||
<A href='?src=\ref[src];dmake=7'>Chute</A><BR>
|
||||
<A href='?src=\ref[src];dmake=21'>Upwards</A><BR>
|
||||
<A href='?src=\ref[src];dmake=22'>Downwards</A><BR>
|
||||
<A href='?src=\ref[src];dmake=8'>Sorting</A><BR>
|
||||
<A href='?src=\ref[src];dmake=9'>Sorting (Wildcard)</A><BR>
|
||||
<A href='?src=\ref[src];dmake=10'>Sorting (Untagged)</A><BR>
|
||||
<A href='?src=\ref[src];dmake=11'>Tagger</A><BR>
|
||||
<A href='?src=\ref[src];dmake=12'>Tagger (Partial)</A><BR>
|
||||
"}
|
||||
///// Z-Level stuff
|
||||
|
||||
user << browse("<HEAD><TITLE>[src]</TITLE></HEAD><TT>[dat]</TT>", "window=pipedispenser")
|
||||
var/list/lines = list()
|
||||
for(var/category in disposal_pipe_recipes)
|
||||
lines += "<b>[category]:</b><BR>"
|
||||
for(var/datum/pipe_recipe/PI in disposal_pipe_recipes[category])
|
||||
lines += PI.Render(src)
|
||||
var/dat = lines.Join()
|
||||
var/datum/browser/popup = new(user, "pipedispenser", name, 300, 500, src)
|
||||
popup.set_content("<TT>[dat]</TT>")
|
||||
popup.open()
|
||||
return
|
||||
|
||||
// 0=straight, 1=bent, 2=junction-j1, 3=junction-j2, 4=junction-y, 5=trunk
|
||||
|
||||
|
||||
/obj/machinery/pipedispenser/disposal/Topic(href, href_list)
|
||||
if(href_list["makepipe"] || href_list["setlayer"] || href_list["makemeter"]) // Asking the disposal machine to do atmos stuff?
|
||||
return // That's a no no.
|
||||
if(..())
|
||||
return
|
||||
usr.set_machine(src)
|
||||
src.add_fingerprint(usr)
|
||||
if(href_list["dmake"])
|
||||
if(unwrenched || !usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr))
|
||||
usr << browse(null, "window=pipedispenser")
|
||||
return
|
||||
if(!wait)
|
||||
var/p_type = text2num(href_list["dmake"])
|
||||
var/obj/structure/disposalconstruct/C = new (src.loc)
|
||||
switch(p_type)
|
||||
if(0)
|
||||
C.ptype = 0
|
||||
if(1)
|
||||
C.ptype = 1
|
||||
if(2)
|
||||
C.ptype = 2
|
||||
if(3)
|
||||
C.ptype = 4
|
||||
if(4)
|
||||
C.ptype = 5
|
||||
if(5)
|
||||
C.ptype = 6
|
||||
C.density = 1
|
||||
if(6)
|
||||
C.ptype = 7
|
||||
C.density = 1
|
||||
if(7)
|
||||
C.ptype = 8
|
||||
C.density = 1
|
||||
if(8)
|
||||
C.ptype = 9
|
||||
C.subtype = 0
|
||||
if(9)
|
||||
C.ptype = 9
|
||||
C.subtype = 1
|
||||
if(10)
|
||||
C.ptype = 9
|
||||
C.subtype = 2
|
||||
if(11)
|
||||
C.ptype = 13
|
||||
if(12)
|
||||
C.ptype = 14
|
||||
///// Z-Level stuff
|
||||
if(21)
|
||||
C.ptype = 11
|
||||
if(22)
|
||||
C.ptype = 12
|
||||
///// Z-Level stuff
|
||||
var/ptype = text2num(href_list["dmake"])
|
||||
var/pdir = (href_list["dir"] ? text2num(href_list["dir"]) : NORTH)
|
||||
var/psub = (href_list["sort"] ? text2num(href_list["sort"]) : 0)
|
||||
var/obj/structure/disposalconstruct/C = new (src.loc, ptype, pdir, 0, psub)
|
||||
|
||||
C.add_fingerprint(usr)
|
||||
C.update()
|
||||
wait = 1
|
||||
|
||||
@@ -1,103 +1,164 @@
|
||||
//
|
||||
// Recipies for Pipe Dispenser and (someday) the RPD
|
||||
//
|
||||
|
||||
var/global/list/atmos_pipe_recipes = null
|
||||
|
||||
/hook/startup/proc/init_pipe_recipes()
|
||||
global.atmos_pipe_recipes = list(
|
||||
"Pipes" = list(
|
||||
new /datum/pipe_recipe/pipe("Pipe", /obj/machinery/atmospherics/pipe/simple),
|
||||
new /datum/pipe_recipe/pipe("Manifold", /obj/machinery/atmospherics/pipe/manifold),
|
||||
new /datum/pipe_recipe/pipe("Manual Valve", /obj/machinery/atmospherics/valve),
|
||||
new /datum/pipe_recipe/pipe("Digital Valve", /obj/machinery/atmospherics/valve/digital),
|
||||
new /datum/pipe_recipe/pipe("Pipe cap", /obj/machinery/atmospherics/pipe/cap),
|
||||
new /datum/pipe_recipe/pipe("4-Way Manifold", /obj/machinery/atmospherics/pipe/manifold4w),
|
||||
new /datum/pipe_recipe/pipe("Manual T-Valve", /obj/machinery/atmospherics/tvalve),
|
||||
new /datum/pipe_recipe/pipe("Digital T-Valve", /obj/machinery/atmospherics/tvalve/digital),
|
||||
new /datum/pipe_recipe/pipe("Upward Pipe", /obj/machinery/atmospherics/pipe/zpipe/up),
|
||||
new /datum/pipe_recipe/pipe("Downward Pipe", /obj/machinery/atmospherics/pipe/zpipe/down),
|
||||
new /datum/pipe_recipe/pipe("Universal Pipe Adaptor", /obj/machinery/atmospherics/pipe/simple/visible/universal),
|
||||
),
|
||||
"Devices" = list(
|
||||
new /datum/pipe_recipe/pipe("Connector", /obj/machinery/atmospherics/portables_connector),
|
||||
new /datum/pipe_recipe/pipe("Unary Vent", /obj/machinery/atmospherics/unary/vent_pump),
|
||||
new /datum/pipe_recipe/pipe("Passive Vent", /obj/machinery/atmospherics/pipe/vent),
|
||||
new /datum/pipe_recipe/pipe("Injector", /obj/machinery/atmospherics/unary/outlet_injector),
|
||||
new /datum/pipe_recipe/pipe("Gas Pump", /obj/machinery/atmospherics/binary/pump),
|
||||
new /datum/pipe_recipe/pipe("Pressure Regulator", /obj/machinery/atmospherics/binary/passive_gate),
|
||||
new /datum/pipe_recipe/pipe("High Power Gas Pump",/obj/machinery/atmospherics/binary/pump/high_power),
|
||||
//new /datum/pipe_recipe/pipe("Automatic Shutoff Valve",/obj/machinery/atmospherics/valve/shutoff), //VOREStation Removal: Without leaks, those are just regular valves,
|
||||
new /datum/pipe_recipe/pipe("Scrubber", /obj/machinery/atmospherics/unary/vent_scrubber),
|
||||
new /datum/pipe_recipe/meter("Meter"),
|
||||
new /datum/pipe_recipe/pipe("Gas Filter", /obj/machinery/atmospherics/trinary/atmos_filter),
|
||||
new /datum/pipe_recipe/pipe("Gas Mixer", /obj/machinery/atmospherics/trinary/mixer),
|
||||
new /datum/pipe_recipe/pipe("Gas Mixer 'T'", /obj/machinery/atmospherics/trinary/mixer/t_mixer),
|
||||
new /datum/pipe_recipe/pipe("Omni Gas Mixer", /obj/machinery/atmospherics/omni/mixer),
|
||||
new /datum/pipe_recipe/pipe("Omni Gas Filter", /obj/machinery/atmospherics/omni/atmos_filter),
|
||||
),
|
||||
"Heat Exchange" = list(
|
||||
new /datum/pipe_recipe/pipe("Pipe", /obj/machinery/atmospherics/pipe/simple/heat_exchanging),
|
||||
new /datum/pipe_recipe/pipe("Junction", /obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction),
|
||||
new /datum/pipe_recipe/pipe("Heat Exchanger", /obj/machinery/atmospherics/unary/heat_exchanger),
|
||||
),
|
||||
"Insulated pipes" = list(
|
||||
new /datum/pipe_recipe/pipe("Pipe", /obj/machinery/atmospherics/pipe/simple/insulated),
|
||||
)
|
||||
)
|
||||
return TRUE
|
||||
|
||||
//
|
||||
// New method of handling pipe construction. Instead of numeric constants and a giant switch statement of doom
|
||||
// every pipe type has a datum instance which describes its name, placement rules and construction method, dispensing etc.
|
||||
// The advantages are obvious, mostly in simplifying the code of the dispenser, and the ability to add new pipes without hassle.
|
||||
//
|
||||
/datum/pipe_recipe
|
||||
var/name = "Abstract Pipe (fixme)" // Recipe name
|
||||
var/dirtype // If using an RPD, this tells more about what previews to show.
|
||||
|
||||
// Render an HTML link to select this pipe type. Returns text.
|
||||
/datum/pipe_recipe/proc/Render(dispenser)
|
||||
return "<A href='?src=\ref[dispenser]&[Params()]'>[name]</A><BR>"
|
||||
|
||||
// Parameters for the Topic link returned by Render(). Returns text.
|
||||
/datum/pipe_recipe/proc/Params()
|
||||
return ""
|
||||
|
||||
//
|
||||
// Subtype for actual pipes
|
||||
//
|
||||
/datum/pipe_recipe/pipe
|
||||
var/obj/item/pipe/construction_type // The type PATH to the type of pipe fitting object the recipe makes.
|
||||
var/obj/machinery/atmospherics/pipe_type // The type PATH of what actual pipe the fitting becomes.
|
||||
|
||||
/datum/pipe_recipe/pipe/New(var/label, var/obj/machinery/atmospherics/path)
|
||||
name = label
|
||||
pipe_type = path
|
||||
construction_type = initial(path.construction_type)
|
||||
dirtype = initial(construction_type.dispenser_class)
|
||||
|
||||
// Render an HTML link to select this pipe type
|
||||
/datum/pipe_recipe/pipe/Render(dispenser)
|
||||
var/dat = ..(dispenser)
|
||||
// Stationary pipe dispensers don't allow you to pre-select pipe directions.
|
||||
// This makes it impossble to spawn bent versions of bendable pipes.
|
||||
// We add a "Bent" pipe type with a preset diagonal direction to work around it.
|
||||
if(istype(dispenser, /obj/machinery/pipedispenser) && (dirtype == PIPE_BENDABLE))
|
||||
dat += "<A href='?src=\ref[dispenser]&[Params()]&dir=[NORTHEAST]'>Bent [name]</A><BR>"
|
||||
return dat
|
||||
|
||||
/datum/pipe_recipe/pipe/Params()
|
||||
return "makepipe=[pipe_type]"
|
||||
|
||||
//
|
||||
// Subtype for meters
|
||||
//
|
||||
/datum/pipe_recipe/meter
|
||||
dirtype = PIPE_ONEDIR
|
||||
|
||||
/datum/pipe_recipe/meter/New(label)
|
||||
name = label
|
||||
|
||||
/datum/pipe_recipe/meter/Params()
|
||||
return "makemeter=1"
|
||||
//
|
||||
// Recipies for Pipe Dispenser and (someday) the RPD
|
||||
//
|
||||
|
||||
var/global/list/atmos_pipe_recipes = null
|
||||
var/global/list/disposal_pipe_recipes = null
|
||||
var/global/list/all_pipe_recipes = null
|
||||
|
||||
/hook/startup/proc/init_pipe_recipes()
|
||||
global.atmos_pipe_recipes = list(
|
||||
"Pipes" = list(
|
||||
new /datum/pipe_recipe/pipe("Pipe", /obj/machinery/atmospherics/pipe/simple, TRUE),
|
||||
new /datum/pipe_recipe/pipe("Manifold", /obj/machinery/atmospherics/pipe/manifold, TRUE),
|
||||
new /datum/pipe_recipe/pipe("Manual Valve", /obj/machinery/atmospherics/valve),
|
||||
new /datum/pipe_recipe/pipe("Digital Valve", /obj/machinery/atmospherics/valve/digital),
|
||||
new /datum/pipe_recipe/pipe("Pipe cap", /obj/machinery/atmospherics/pipe/cap, TRUE),
|
||||
new /datum/pipe_recipe/pipe("4-Way Manifold", /obj/machinery/atmospherics/pipe/manifold4w, TRUE),
|
||||
new /datum/pipe_recipe/pipe("Manual T-Valve", /obj/machinery/atmospherics/tvalve),
|
||||
new /datum/pipe_recipe/pipe("Digital T-Valve", /obj/machinery/atmospherics/tvalve/digital),
|
||||
new /datum/pipe_recipe/pipe("Upward Pipe", /obj/machinery/atmospherics/pipe/zpipe/up, TRUE),
|
||||
new /datum/pipe_recipe/pipe("Downward Pipe", /obj/machinery/atmospherics/pipe/zpipe/down, TRUE),
|
||||
new /datum/pipe_recipe/pipe("Universal Pipe Adaptor",/obj/machinery/atmospherics/pipe/simple/visible/universal, TRUE),
|
||||
),
|
||||
"Devices" = list(
|
||||
new /datum/pipe_recipe/pipe("Connector", /obj/machinery/atmospherics/portables_connector),
|
||||
new /datum/pipe_recipe/pipe("Unary Vent", /obj/machinery/atmospherics/unary/vent_pump),
|
||||
new /datum/pipe_recipe/pipe("Passive Vent", /obj/machinery/atmospherics/pipe/vent),
|
||||
new /datum/pipe_recipe/pipe("Injector", /obj/machinery/atmospherics/unary/outlet_injector),
|
||||
new /datum/pipe_recipe/pipe("Gas Pump", /obj/machinery/atmospherics/binary/pump),
|
||||
new /datum/pipe_recipe/pipe("Pressure Regulator", /obj/machinery/atmospherics/binary/passive_gate),
|
||||
new /datum/pipe_recipe/pipe("High Power Gas Pump", /obj/machinery/atmospherics/binary/pump/high_power),
|
||||
new /datum/pipe_recipe/pipe("Scrubber", /obj/machinery/atmospherics/unary/vent_scrubber),
|
||||
new /datum/pipe_recipe/meter("Meter"),
|
||||
new /datum/pipe_recipe/pipe("Gas Filter", /obj/machinery/atmospherics/trinary/atmos_filter),
|
||||
new /datum/pipe_recipe/pipe("Gas Mixer", /obj/machinery/atmospherics/trinary/mixer),
|
||||
new /datum/pipe_recipe/pipe("Gas Mixer 'T'", /obj/machinery/atmospherics/trinary/mixer/t_mixer),
|
||||
new /datum/pipe_recipe/pipe("Omni Gas Mixer", /obj/machinery/atmospherics/omni/mixer),
|
||||
new /datum/pipe_recipe/pipe("Omni Gas Filter", /obj/machinery/atmospherics/omni/atmos_filter),
|
||||
),
|
||||
"Heat Exchange" = list(
|
||||
new /datum/pipe_recipe/pipe("Pipe", /obj/machinery/atmospherics/pipe/simple/heat_exchanging),
|
||||
new /datum/pipe_recipe/pipe("Junction", /obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction),
|
||||
new /datum/pipe_recipe/pipe("Heat Exchanger", /obj/machinery/atmospherics/unary/heat_exchanger),
|
||||
),
|
||||
"Insulated pipes" = list(
|
||||
new /datum/pipe_recipe/pipe("Pipe", /obj/machinery/atmospherics/pipe/simple/insulated),
|
||||
)
|
||||
)
|
||||
global.disposal_pipe_recipes = list(
|
||||
"Disposal Pipes" = list(
|
||||
new /datum/pipe_recipe/disposal("Pipe", DISPOSAL_PIPE_STRAIGHT, "conpipe-s", PIPE_STRAIGHT),
|
||||
new /datum/pipe_recipe/disposal("Bent Pipe", DISPOSAL_PIPE_CORNER, "conpipe-c"),
|
||||
new /datum/pipe_recipe/disposal("Junction", DISPOSAL_PIPE_JUNCTION, "conpipe-j1", PIPE_TRIN_M, "conpipe-j2"),
|
||||
new /datum/pipe_recipe/disposal("Y-Junction", DISPOSAL_PIPE_JUNCTION_Y, "conpipe-y"),
|
||||
new /datum/pipe_recipe/disposal("Sort Junction", DISPOSAL_PIPE_SORTER, "conpipe-j1s", PIPE_TRIN_M, "conpipe-j2s", DISPOSAL_SORT_NORMAL),
|
||||
new /datum/pipe_recipe/disposal("Sort Junction (Wildcard)",DISPOSAL_PIPE_SORTER, "conpipe-j1s", PIPE_TRIN_M, "conpipe-j2s", DISPOSAL_SORT_WILDCARD),
|
||||
new /datum/pipe_recipe/disposal("Sort Junction (Untagged)",DISPOSAL_PIPE_SORTER, "conpipe-j1s", PIPE_TRIN_M, "conpipe-j2s", DISPOSAL_SORT_UNTAGGED),
|
||||
new /datum/pipe_recipe/disposal("Tagger", DISPOSAL_PIPE_TAGGER, "pipe-tagger", PIPE_STRAIGHT),
|
||||
new /datum/pipe_recipe/disposal("Tagger (Partial)", DISPOSAL_PIPE_TAGGER_PARTIAL, "pipe-tagger-partial", PIPE_STRAIGHT),
|
||||
new /datum/pipe_recipe/disposal("Trunk", DISPOSAL_PIPE_TRUNK, "conpipe-t"),
|
||||
new /datum/pipe_recipe/disposal("Upwards", DISPOSAL_PIPE_UPWARD, "pipe-u"),
|
||||
new /datum/pipe_recipe/disposal("Downwards", DISPOSAL_PIPE_DOWNWARD, "pipe-d"),
|
||||
new /datum/pipe_recipe/disposal("Bin", DISPOSAL_PIPE_BIN, "disposal", PIPE_ONEDIR),
|
||||
new /datum/pipe_recipe/disposal("Outlet", DISPOSAL_PIPE_OUTLET, "outlet"),
|
||||
new /datum/pipe_recipe/disposal("Chute", DISPOSAL_PIPE_CHUTE, "intake"),
|
||||
)
|
||||
)
|
||||
global.all_pipe_recipes = disposal_pipe_recipes + atmos_pipe_recipes
|
||||
return TRUE
|
||||
|
||||
//
|
||||
// New method of handling pipe construction. Instead of numeric constants and a giant switch statement of doom
|
||||
// every pipe type has a datum instance which describes its name, placement rules and construction method, dispensing etc.
|
||||
// The advantages are obvious, mostly in simplifying the code of the dispenser, and the ability to add new pipes without hassle.
|
||||
//
|
||||
/datum/pipe_recipe
|
||||
var/name = "Abstract Pipe (fixme)" // Recipe name
|
||||
var/pipe_type // The type PATH of what actual pipe the fitting becomes, used by RCD to print the pipe.
|
||||
var/icon = 'icons/obj/pipe-item.dmi' // This tells the RPD which icon file to look for preview images in.
|
||||
var/icon_state // This tells the RPD what kind of pipe icon to render for the preview.
|
||||
var/icon_state_m // This stores the mirrored version of the regular state (if available).
|
||||
var/dirtype // If using an RPD, this tells more about what previews to show.
|
||||
var/subtype = 0 // Used for certain disposals pipes types.
|
||||
var/paintable = FALSE // If TRUE, allow the RPD to paint this pipe.
|
||||
|
||||
// Render an HTML link to select this pipe type. Returns text.
|
||||
/datum/pipe_recipe/proc/Render(dispenser)
|
||||
return "<A href='?src=\ref[dispenser]&[Params()]'>[name]</A><BR>"
|
||||
|
||||
// Parameters for the Topic link returned by Render(). Returns text.
|
||||
/datum/pipe_recipe/proc/Params()
|
||||
return ""
|
||||
|
||||
//
|
||||
// Subtype for actual pipes
|
||||
//
|
||||
/datum/pipe_recipe/pipe
|
||||
var/obj/item/pipe/construction_type // The type PATH to the type of pipe fitting object the recipe makes.
|
||||
|
||||
/datum/pipe_recipe/pipe/New(var/label, var/obj/machinery/atmospherics/path, var/colorable=FALSE)
|
||||
name = label
|
||||
pipe_type = path
|
||||
construction_type = initial(path.construction_type)
|
||||
icon_state = initial(path.pipe_state)
|
||||
dirtype = initial(construction_type.dispenser_class)
|
||||
if (dirtype == PIPE_TRIN_M)
|
||||
icon_state_m = "[icon_state]m"
|
||||
paintable = colorable
|
||||
|
||||
// Render an HTML link to select this pipe type
|
||||
/datum/pipe_recipe/pipe/Render(dispenser)
|
||||
var/dat = ..(dispenser)
|
||||
// Stationary pipe dispensers don't allow you to pre-select pipe directions.
|
||||
// This makes it impossble to spawn bent versions of bendable pipes.
|
||||
// We add a "Bent" pipe type with a preset diagonal direction to work around it.
|
||||
if(istype(dispenser, /obj/machinery/pipedispenser) && (dirtype == PIPE_BENDABLE))
|
||||
dat += "<A href='?src=\ref[dispenser]&[Params()]&dir=[NORTHEAST]'>Bent [name]</A><BR>"
|
||||
return dat
|
||||
|
||||
/datum/pipe_recipe/pipe/Params()
|
||||
return "makepipe=[pipe_type]"
|
||||
|
||||
//
|
||||
// Subtype for meters
|
||||
//
|
||||
/datum/pipe_recipe/meter
|
||||
dirtype = PIPE_ONEDIR
|
||||
icon_state = "meter"
|
||||
|
||||
/datum/pipe_recipe/meter/New(label)
|
||||
name = label
|
||||
|
||||
/datum/pipe_recipe/meter/Params()
|
||||
return "makemeter=1"
|
||||
|
||||
//
|
||||
// Subtype for disposal pipes
|
||||
//
|
||||
/datum/pipe_recipe/disposal
|
||||
icon = 'icons/obj/pipes/disposal.dmi'
|
||||
|
||||
/datum/pipe_recipe/disposal/New(var/label, var/path, var/state, dt=PIPE_DIRECTIONAL, var/state_mirror=0, var/sort=0)
|
||||
name = label
|
||||
icon_state = state
|
||||
pipe_type = path
|
||||
dirtype = dt
|
||||
subtype = sort
|
||||
if (dirtype == PIPE_TRIN_M)
|
||||
icon_state_m = state_mirror
|
||||
|
||||
// Render an HTML link to select this pipe type
|
||||
/datum/pipe_recipe/disposal/Render(dispenser)
|
||||
var/dat = ..(dispenser)
|
||||
|
||||
// Blah blah, add corner pipes because dispensers have no directional information. Look up for more info.
|
||||
if(istype(dispenser, /obj/machinery/pipedispenser) && (dirtype == PIPE_BENDABLE))
|
||||
dat += "<A href='?src=\ref[dispenser]&[Params()]&dir=[NORTHEAST]'>Bent [name]</A><BR>"
|
||||
return dat
|
||||
|
||||
/datum/pipe_recipe/disposal/Params()
|
||||
var/param = "dmake=[pipe_type]"
|
||||
if (subtype)
|
||||
param += "&sort=[subtype]"
|
||||
return param
|
||||
|
||||
@@ -40,6 +40,11 @@ obj/machinery/seed_extractor/attackby(var/obj/item/O as obj, var/mob/user as mob
|
||||
user << "<span class='notice'>You extract some seeds from the grass tile.</span>"
|
||||
new /obj/item/seeds/grassseed(loc)
|
||||
|
||||
else if(istype(O, /obj/item/weapon/fossil/plant)) // Fossils
|
||||
var/obj/item/seeds/random/R = new(get_turf(src))
|
||||
to_chat(user, "\The [src] pulverizes \the [O] and spits out \the [R].")
|
||||
qdel(O)
|
||||
|
||||
else if(default_unfasten_wrench(user, O, 20))
|
||||
return
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
message2 = "Error"
|
||||
else if(shuttle.has_arrive_time())
|
||||
message2 = get_supply_shuttle_timer()
|
||||
if(lentext(message2) > CHARS_PER_LINE)
|
||||
if(length(message2) > CHARS_PER_LINE)
|
||||
message2 = "Error"
|
||||
else if(shuttle.is_launching())
|
||||
if(shuttle.at_station())
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -272,6 +272,7 @@
|
||||
/obj/item/clothing/shoes/rainbow = 1,)
|
||||
contraband = list(/obj/item/clothing/shoes/syndigaloshes = 1,
|
||||
/obj/item/clothing/shoes/clown_shoes = 1)
|
||||
|
||||
/obj/machinery/vending/loadout/uniform
|
||||
name = "The Basics"
|
||||
desc = "A vendor using compressed matter cartridges to store large amounts of basic station uniforms."
|
||||
@@ -299,6 +300,7 @@
|
||||
/obj/item/clothing/under/color/yellow = 5,
|
||||
/obj/item/clothing/shoes/black = 20,
|
||||
/obj/item/clothing/shoes/white = 20)
|
||||
|
||||
/obj/machinery/vending/loadout/accessory
|
||||
name = "Looty Inc."
|
||||
desc = "A special vendor for accessories."
|
||||
@@ -528,6 +530,7 @@
|
||||
/obj/item/clothing/mask/surgical = 200)
|
||||
premium = list(/obj/item/weapon/bedsheet/rainbow = 1)
|
||||
contraband = list(/obj/item/clothing/mask/gas/clown_hat = 1)
|
||||
|
||||
/obj/machinery/vending/loadout/clothing
|
||||
name = "General Jump"
|
||||
desc = "A special vendor using compressed matter cartridges to store large amounts of clothing."
|
||||
@@ -871,6 +874,7 @@
|
||||
/obj/item/weapon/storage/backpack/satchel = 100)
|
||||
premium = list(/obj/item/clothing/under/color/rainbow = 1)
|
||||
contraband = list(/obj/item/clothing/under/rank/clown = 1)
|
||||
|
||||
/obj/machinery/vending/loadout/gadget
|
||||
name = "Chips Co."
|
||||
desc = "A special vendor for devices and gadgets."
|
||||
@@ -920,6 +924,7 @@
|
||||
/obj/item/clothing/glasses/omnihud = 100)
|
||||
premium = list(/obj/item/device/perfect_tele/one_beacon = 1)
|
||||
contraband = list(/obj/item/weapon/disk/nifsoft/compliance = 1)
|
||||
|
||||
/obj/machinery/vending/loadout/loadout_misc
|
||||
name = "Bits and Bobs"
|
||||
desc = "A special vendor for things and also stuff!"
|
||||
@@ -949,6 +954,7 @@
|
||||
/obj/item/weapon/melee/umbrella/random = 100)
|
||||
premium = list(/obj/item/toy/bosunwhistle = 1)
|
||||
contraband = list(/obj/item/toy/katana = 1)
|
||||
|
||||
/obj/machinery/vending/loadout/overwear
|
||||
name = "Big D's Best"
|
||||
desc = "A special vendor using compressed matter cartridges to store large amounts of overwear!"
|
||||
@@ -1132,6 +1138,7 @@
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/white_grey = 200)
|
||||
premium = list(/obj/item/clothing/suit/imperium_monk = 3)
|
||||
contraband = list(/obj/item/toy/katana = 1)
|
||||
|
||||
/obj/machinery/vending/loadout/costume
|
||||
name = "Thespian's Delight"
|
||||
desc = "Sometimes nerds need costumes!"
|
||||
@@ -1243,6 +1250,85 @@
|
||||
/obj/item/clothing/under/sexyclown = 200,
|
||||
/obj/item/clothing/mask/gas/sexymime = 600,
|
||||
/obj/item/clothing/under/sexymime = 200)
|
||||
premium = list(/obj/item/clothing/suit/imperium_monk = 3)
|
||||
premium = list(/obj/item/clothing/suit/imperium_monk = 3,
|
||||
/obj/item/clothing/suit/barding/agatha = 2,
|
||||
/obj/item/clothing/suit/barding/alt_agatha = 2,
|
||||
/obj/item/clothing/suit/barding/mason = 2,
|
||||
/obj/item/clothing/suit/drake_cloak = 2)
|
||||
contraband = list(/obj/item/clothing/head/syndicatefake = 1,
|
||||
/obj/item/clothing/suit/syndicatefake = 1)
|
||||
|
||||
//TFF 19/12/19 - Brig version of a seed storage vendor
|
||||
/obj/machinery/seed_storage/brig
|
||||
name = "Prisoners' food seed storage"
|
||||
starting_seeds = list(
|
||||
/obj/item/seeds/appleseed = 3,
|
||||
/obj/item/seeds/bananaseed = 3,
|
||||
/obj/item/seeds/berryseed = 3,
|
||||
/obj/item/seeds/cabbageseed = 3,
|
||||
/obj/item/seeds/carrotseed = 3,
|
||||
/obj/item/seeds/celery = 3,
|
||||
/obj/item/seeds/chantermycelium = 3,
|
||||
/obj/item/seeds/cherryseed = 3,
|
||||
/obj/item/seeds/chiliseed = 3,
|
||||
/obj/item/seeds/cocoapodseed = 3,
|
||||
/obj/item/seeds/cornseed = 3,
|
||||
/obj/item/seeds/durian = 3,
|
||||
/obj/item/seeds/eggplantseed = 3,
|
||||
/obj/item/seeds/grapeseed = 3,
|
||||
/obj/item/seeds/grassseed = 3,
|
||||
/obj/item/seeds/replicapod = 3,
|
||||
/obj/item/seeds/lavenderseed = 3,
|
||||
/obj/item/seeds/lemonseed = 3,
|
||||
/obj/item/seeds/lettuce = 3,
|
||||
/obj/item/seeds/limeseed = 3,
|
||||
/obj/item/seeds/mtearseed = 2,
|
||||
/obj/item/seeds/orangeseed = 3,
|
||||
/obj/item/seeds/onionseed = 3,
|
||||
/obj/item/seeds/peanutseed = 3,
|
||||
/obj/item/seeds/plumpmycelium = 3,
|
||||
/obj/item/seeds/poppyseed = 3,
|
||||
/obj/item/seeds/potatoseed = 3,
|
||||
/obj/item/seeds/pumpkinseed = 3,
|
||||
/obj/item/seeds/rhubarb = 3,
|
||||
/obj/item/seeds/riceseed = 3,
|
||||
/obj/item/seeds/rose = 3,
|
||||
/obj/item/seeds/soyaseed = 3,
|
||||
/obj/item/seeds/spineapple = 3,
|
||||
/obj/item/seeds/sugarcaneseed = 3,
|
||||
/obj/item/seeds/sunflowerseed = 3,
|
||||
/obj/item/seeds/shandseed = 2,
|
||||
/obj/item/seeds/tobaccoseed = 3,
|
||||
/obj/item/seeds/tomatoseed = 3,
|
||||
/obj/item/seeds/towermycelium = 3,
|
||||
/obj/item/seeds/vanilla = 3,
|
||||
/obj/item/seeds/watermelonseed = 3,
|
||||
/obj/item/seeds/wheatseed = 3,
|
||||
/obj/item/seeds/whitebeetseed = 3,
|
||||
/obj/item/seeds/wabback = 2)
|
||||
|
||||
//TFF 19/12/19 - Brig version of a Nutrimax
|
||||
/obj/machinery/vending/hydronutrients/brig
|
||||
name = "Brig NutriMax"
|
||||
desc = "A plant nutrients vendor. Seems some items aren't included."
|
||||
product_slogans = "Aren't you glad you don't have to fertilize the natural way?;Now with 50% less stink!;Plants are people too!"
|
||||
product_ads = "We like plants!;Don't you want some?;The greenest thumbs ever.;We like big plants.;Soft soil..."
|
||||
icon_state = "nutri"
|
||||
icon_deny = "nutri-deny"
|
||||
products = list(/obj/item/weapon/reagent_containers/glass/bottle/eznutrient = 6,/obj/item/weapon/reagent_containers/glass/bottle/left4zed = 4,/obj/item/weapon/reagent_containers/glass/bottle/robustharvest = 3,/obj/item/weapon/plantspray/pests = 20,
|
||||
/obj/item/weapon/reagent_containers/glass/beaker = 4,/obj/item/weapon/storage/bag/plants = 5)
|
||||
premium = list(/obj/item/weapon/reagent_containers/glass/bottle/ammonia = 10,/obj/item/weapon/reagent_containers/glass/bottle/diethylamine = 5)
|
||||
|
||||
/obj/machinery/vending/emergencyfood
|
||||
name = "Food Cube Dispenser"
|
||||
desc = "An ominous machine dispensing food cubes. It will keep you fed, but at what cost?"
|
||||
icon = 'icons/obj/vending_vr.dmi'
|
||||
icon_state = "foodcube"
|
||||
product_ads = "Afraid to starve?;Starvation is not an option!;Add water before consumption.;Let me take care of you.;Dire circumstances call for food cubes, do not let the taste deter you."
|
||||
products = list(/obj/item/weapon/storage/box/wings/tray = 5,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle = 10)
|
||||
contraband = list(/obj/item/weapon/storage/box/wings/tray = 5)
|
||||
|
||||
/obj/machinery/vending/emergencyfood/filled
|
||||
products = list(/obj/item/weapon/storage/box/wings/tray = 40)
|
||||
contraband = list(/obj/item/weapon/storage/box/wings/tray = 20)
|
||||
@@ -20,4 +20,17 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/liquidfood = 10,
|
||||
)
|
||||
contraband = list(/obj/item/weapon/reagent_containers/food/snacks/tofupie = 3)
|
||||
vend_delay = 15
|
||||
vend_delay = 15
|
||||
|
||||
/obj/machinery/vending/security/yw
|
||||
name = "SecTech"
|
||||
desc = "A security equipment vendor."
|
||||
product_ads = "Crack capitalist skulls!;Beat some heads in!;Don't forget - harm is good!;Your weapons are right here.;Handcuffs!;Freeze, scumbag!;Don't tase me bro!;Tase them, bro.;Why not have a donut?"
|
||||
icon_state = "sec"
|
||||
icon_deny = "sec-deny"
|
||||
req_access = list(access_security)
|
||||
products = list(/obj/item/weapon/handcuffs = 8,/obj/item/weapon/grenade/flashbang = 4,/obj/item/device/flash = 5,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/donut/normal = 12,/obj/item/weapon/storage/box/evidence = 6,/obj/item/weapon/gun/energy/taser =3,/obj/item/weapon/gun/projectile/sec =3)
|
||||
contraband = list(/obj/item/clothing/glasses/sunglasses = 2,/obj/item/weapon/storage/box/donut = 2)
|
||||
req_log_access = access_armory
|
||||
has_logs = 1
|
||||
@@ -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> [src.name]"
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster/proc/dynattackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(!action_checks(user))
|
||||
return chassis.dynattackby(W,user)
|
||||
chassis.log_message("Attacked by [W]. Attacker - [user]")
|
||||
if(prob(chassis.deflect_chance*deflect_coeff))
|
||||
user << "<span class='danger'>\The [W] bounces off [chassis] armor.</span>"
|
||||
chassis.log_append_to_last("Armor saved.")
|
||||
else
|
||||
chassis.occupant_message("<span class='danger'>\The [user] hits [chassis] with [W].</span>")
|
||||
user.visible_message("<span class='danger'>\The [user] hits [chassis] with [W].</span>", "<span class='danger'>You hit [src] with [W].</span>")
|
||||
chassis.take_damage(round(W.force*damage_coeff),W.damtype)
|
||||
chassis.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
|
||||
set_ready_state(0)
|
||||
chassis.use_power(energy_drain)
|
||||
do_after_cooldown()
|
||||
return
|
||||
@@ -0,0 +1,72 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster
|
||||
name = "\improper RW armor booster"
|
||||
desc = "Ranged-weaponry armor booster. Boosts exosuit armor against ranged attacks. Completely blocks taser shots, but requires energy to operate."
|
||||
icon_state = "mecha_abooster_proj"
|
||||
origin_tech = list(TECH_MATERIAL = 4)
|
||||
equip_cooldown = 10
|
||||
energy_drain = 50
|
||||
range = 0
|
||||
var/deflect_coeff = 1.15
|
||||
var/damage_coeff = 0.8
|
||||
|
||||
equip_type = EQUIP_HULL
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster/can_attach(obj/mecha/M as obj)
|
||||
if(..())
|
||||
if(!M.proc_res["dynbulletdamage"] && !M.proc_res["dynhitby"])
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster/attach(obj/mecha/M as obj)
|
||||
..()
|
||||
chassis.proc_res["dynbulletdamage"] = src
|
||||
chassis.proc_res["dynhitby"] = src
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster/detach()
|
||||
chassis.proc_res["dynbulletdamage"] = null
|
||||
chassis.proc_res["dynhitby"] = null
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster/get_equip_info()
|
||||
if(!chassis) return
|
||||
return "<span style=\"color:[equip_ready?"#0f0":"#f00"];\">*</span> [src.name]"
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster/proc/dynbulletdamage(var/obj/item/projectile/Proj)
|
||||
if(istype(Proj, /obj/item/projectile/test))
|
||||
return // Don't care about test projectiles, just what comes after them
|
||||
if(!action_checks(src))
|
||||
return chassis.dynbulletdamage(Proj)
|
||||
if(prob(chassis.deflect_chance*deflect_coeff))
|
||||
chassis.occupant_message("<span class='notice'>The armor deflects incoming projectile.</span>")
|
||||
chassis.visible_message("The [chassis.name] armor deflects the projectile")
|
||||
chassis.log_append_to_last("Armor saved.")
|
||||
else
|
||||
chassis.take_damage(round(Proj.damage*src.damage_coeff),Proj.check_armour)
|
||||
chassis.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
|
||||
Proj.on_hit(chassis)
|
||||
set_ready_state(0)
|
||||
chassis.use_power(energy_drain)
|
||||
do_after_cooldown()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster/proc/dynhitby(atom/movable/A)
|
||||
if(!action_checks(A))
|
||||
return chassis.dynhitby(A)
|
||||
if(prob(chassis.deflect_chance*deflect_coeff) || istype(A, /mob/living) || istype(A, /obj/item/mecha_parts/mecha_tracking))
|
||||
chassis.occupant_message("<span class='notice'>The [A] bounces off the armor.</span>")
|
||||
chassis.visible_message("The [A] bounces off the [chassis] armor")
|
||||
chassis.log_append_to_last("Armor saved.")
|
||||
if(istype(A, /mob/living))
|
||||
var/mob/living/M = A
|
||||
M.take_organ_damage(10)
|
||||
else if(istype(A, /obj))
|
||||
var/obj/O = A
|
||||
if(O.throwforce)
|
||||
chassis.take_damage(round(O.throwforce*damage_coeff))
|
||||
chassis.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
|
||||
set_ready_state(0)
|
||||
chassis.use_power(energy_drain)
|
||||
do_after_cooldown()
|
||||
return
|
||||
@@ -0,0 +1,128 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/cable_layer
|
||||
name = "Cable Layer"
|
||||
icon_state = "mecha_wire"
|
||||
var/turf/old_turf
|
||||
var/obj/structure/cable/last_piece
|
||||
var/obj/item/stack/cable_coil/cable
|
||||
var/max_cable = 1000
|
||||
required_type = list(/obj/mecha/working)
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/New()
|
||||
cable = new(src)
|
||||
cable.amount = 0
|
||||
..()
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/MoveAction()
|
||||
layCable()
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/action(var/obj/item/stack/cable_coil/target)
|
||||
if(!action_checks(target))
|
||||
return
|
||||
var/result = load_cable(target)
|
||||
var/message
|
||||
if(isnull(result))
|
||||
message = "<font color='red'>Unable to load [target] - no cable found.</font>"
|
||||
else if(!result)
|
||||
message = "Reel is full."
|
||||
else
|
||||
message = "[result] meters of cable successfully loaded."
|
||||
send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info())
|
||||
occupant_message(message)
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/Topic(href,href_list)
|
||||
..()
|
||||
if(href_list["toggle"])
|
||||
set_ready_state(!equip_ready)
|
||||
occupant_message("[src] [equip_ready?"dea":"a"]ctivated.")
|
||||
log_message("[equip_ready?"Dea":"A"]ctivated.")
|
||||
return
|
||||
if(href_list["cut"])
|
||||
if(cable && cable.amount)
|
||||
var/m = round(input(chassis.occupant,"Please specify the length of cable to cut","Cut cable",min(cable.amount,30)) as num, 1)
|
||||
m = min(m, cable.amount)
|
||||
if(m)
|
||||
use_cable(m)
|
||||
var/obj/item/stack/cable_coil/CC = new (get_turf(chassis))
|
||||
CC.amount = m
|
||||
else
|
||||
occupant_message("There's no more cable on the reel.")
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/get_equip_info()
|
||||
var/output = ..()
|
||||
if(output)
|
||||
return "[output] \[Cable: [cable ? cable.amount : 0] m\][(cable && cable.amount) ? "- <a href='?src=\ref[src];toggle=1'>[!equip_ready?"Dea":"A"]ctivate</a>|<a href='?src=\ref[src];cut=1'>Cut</a>" : null]"
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/load_cable(var/obj/item/stack/cable_coil/CC)
|
||||
if(istype(CC) && CC.amount)
|
||||
var/cur_amount = cable? cable.amount : 0
|
||||
var/to_load = max(max_cable - cur_amount,0)
|
||||
if(to_load)
|
||||
to_load = min(CC.amount, to_load)
|
||||
if(!cable)
|
||||
cable = new(src)
|
||||
cable.amount = 0
|
||||
cable.amount += to_load
|
||||
CC.use(to_load)
|
||||
return to_load
|
||||
else
|
||||
return 0
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/use_cable(amount)
|
||||
if(!cable || cable.amount<1)
|
||||
set_ready_state(1)
|
||||
occupant_message("Cable depleted, [src] deactivated.")
|
||||
log_message("Cable depleted, [src] deactivated.")
|
||||
return
|
||||
if(cable.amount < amount)
|
||||
occupant_message("No enough cable to finish the task.")
|
||||
return
|
||||
cable.use(amount)
|
||||
update_equip_info()
|
||||
return 1
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/reset()
|
||||
last_piece = null
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/dismantleFloor(var/turf/new_turf)
|
||||
new_turf = get_turf(chassis)
|
||||
if(istype(new_turf, /turf/simulated/floor))
|
||||
var/turf/simulated/floor/T = new_turf
|
||||
if(!T.is_plating())
|
||||
T.make_plating(!(T.broken || T.burnt))
|
||||
return new_turf.is_plating()
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/layCable(var/turf/new_turf)
|
||||
new_turf = get_turf(chassis)
|
||||
if(equip_ready || !istype(new_turf, /turf/simulated/floor) || !dismantleFloor(new_turf))
|
||||
return reset()
|
||||
var/fdirn = turn(chassis.dir,180)
|
||||
for(var/obj/structure/cable/LC in new_turf) // check to make sure there's not a cable there already
|
||||
if(LC.d1 == fdirn || LC.d2 == fdirn)
|
||||
return reset()
|
||||
if(!use_cable(1))
|
||||
return reset()
|
||||
var/obj/structure/cable/NC = new(new_turf)
|
||||
NC.cableColor("red")
|
||||
NC.d1 = 0
|
||||
NC.d2 = fdirn
|
||||
NC.update_icon()
|
||||
|
||||
var/datum/powernet/PN
|
||||
if(last_piece && last_piece.d2 != chassis.dir)
|
||||
last_piece.d1 = min(last_piece.d2, chassis.dir)
|
||||
last_piece.d2 = max(last_piece.d2, chassis.dir)
|
||||
last_piece.update_icon()
|
||||
PN = last_piece.powernet
|
||||
|
||||
if(!PN)
|
||||
PN = new()
|
||||
PN.add_cable(NC)
|
||||
NC.mergeConnectedNetworks(NC.d2)
|
||||
|
||||
//NC.mergeConnectedNetworksOnTurf()
|
||||
last_piece = NC
|
||||
return 1
|
||||
@@ -0,0 +1,76 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/gravcatapult
|
||||
name = "gravitational catapult"
|
||||
desc = "An exosuit mounted gravitational catapult."
|
||||
icon_state = "mecha_teleport"
|
||||
origin_tech = list(TECH_BLUESPACE = 2, TECH_MAGNET = 3)
|
||||
equip_cooldown = 10
|
||||
energy_drain = 100
|
||||
range = MELEE|RANGED
|
||||
var/atom/movable/locked
|
||||
var/mode = 1 //1 - gravsling 2 - gravpush
|
||||
|
||||
var/last_fired = 0 //Concept stolen from guns.
|
||||
var/fire_delay = 10 //Used to prevent spam-brute against humans.
|
||||
|
||||
equip_type = EQUIP_UTILITY
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/gravcatapult/action(atom/movable/target)
|
||||
|
||||
if(world.time >= last_fired + fire_delay)
|
||||
last_fired = world.time
|
||||
else
|
||||
if (world.time % 3)
|
||||
occupant_message("<span class='warning'>[src] is not ready to fire again!</span>")
|
||||
return 0
|
||||
|
||||
switch(mode)
|
||||
if(1)
|
||||
if(!action_checks(target) && !locked) return
|
||||
if(!locked)
|
||||
if(!istype(target) || target.anchored)
|
||||
occupant_message("Unable to lock on [target]")
|
||||
return
|
||||
locked = target
|
||||
occupant_message("Locked on [target]")
|
||||
send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info())
|
||||
return
|
||||
else if(target!=locked)
|
||||
if(locked in view(chassis))
|
||||
locked.throw_at(target, 14, 1.5, chassis)
|
||||
locked = null
|
||||
send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info())
|
||||
set_ready_state(0)
|
||||
chassis.use_power(energy_drain)
|
||||
do_after_cooldown()
|
||||
else
|
||||
locked = null
|
||||
occupant_message("Lock on [locked] disengaged.")
|
||||
send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info())
|
||||
if(2)
|
||||
if(!action_checks(target)) return
|
||||
var/list/atoms = list()
|
||||
if(isturf(target))
|
||||
atoms = range(target,3)
|
||||
else
|
||||
atoms = orange(target,3)
|
||||
for(var/atom/movable/A in atoms)
|
||||
if(A.anchored) continue
|
||||
spawn(0)
|
||||
var/iter = 5-get_dist(A,target)
|
||||
for(var/i=0 to iter)
|
||||
step_away(A,target)
|
||||
sleep(2)
|
||||
set_ready_state(0)
|
||||
chassis.use_power(energy_drain)
|
||||
do_after_cooldown()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/gravcatapult/get_equip_info()
|
||||
return "[..()] [mode==1?"([locked||"Nothing"])":null] \[<a href='?src=\ref[src];mode=1'>S</a>|<a href='?src=\ref[src];mode=2'>P</a>\]"
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/gravcatapult/Topic(href, href_list)
|
||||
..()
|
||||
if(href_list["mode"])
|
||||
mode = text2num(href_list["mode"])
|
||||
send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info())
|
||||
return
|
||||
@@ -0,0 +1,175 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp
|
||||
name = "hydraulic clamp"
|
||||
icon_state = "mecha_clamp"
|
||||
equip_cooldown = 15
|
||||
energy_drain = 10
|
||||
var/dam_force = 20
|
||||
var/obj/mecha/working/ripley/cargo_holder
|
||||
required_type = list(/obj/mecha/working)
|
||||
ready_sound = 'sound/mecha/gasdisconnected.ogg'
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp/attach(obj/mecha/M as obj)
|
||||
..()
|
||||
cargo_holder = M
|
||||
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp/action(atom/target)
|
||||
if(!action_checks(target)) return
|
||||
if(!cargo_holder) return
|
||||
|
||||
//loading
|
||||
if(istype(target,/obj))
|
||||
var/obj/O = target
|
||||
if(O.has_buckled_mobs())
|
||||
return
|
||||
if(locate(/mob/living) in O)
|
||||
occupant_message("<span class='warning'>You can't load living things into the cargo compartment.</span>")
|
||||
return
|
||||
if(O.anchored)
|
||||
if(enable_special)
|
||||
if(istype(O, /obj/machinery/door/firedoor)) // I love doors.
|
||||
var/obj/machinery/door/firedoor/FD = O
|
||||
if(FD.blocked)
|
||||
FD.visible_message("<span class='danger'>\The [chassis] begins prying on \the [FD]!</span>")
|
||||
if(do_after(chassis.occupant,10 SECONDS,FD))
|
||||
playsound(FD.loc, 'sound/machines/airlock_creaking.ogg', 100, 1)
|
||||
FD.blocked = 0
|
||||
FD.update_icon()
|
||||
FD.open(1)
|
||||
FD.visible_message("<span class='warning'>\The [chassis] tears \the [FD] open!</span>")
|
||||
else if(FD.density)
|
||||
FD.visible_message("<span class='warning'>\The [chassis] begins forcing \the [FD] open!</span>")
|
||||
if(do_after(chassis.occupant, 5 SECONDS,FD))
|
||||
playsound(FD.loc, 'sound/machines/airlock_creaking.ogg', 100, 1)
|
||||
FD.visible_message("<span class='danger'>\The [chassis] forces \the [FD] open!</span>")
|
||||
FD.open(1)
|
||||
else
|
||||
FD.visible_message("<span class='danger'>\The [chassis] forces \the [FD] closed!</span>")
|
||||
FD.close(1)
|
||||
else if(istype(O, /obj/machinery/door/airlock)) // D o o r s.
|
||||
var/obj/machinery/door/airlock/AD = O
|
||||
if(AD.locked)
|
||||
occupant_message("<span class='notice'>The airlock's bolts prevent it from being forced.</span>")
|
||||
else if(!AD.operating)
|
||||
if(AD.welded)
|
||||
AD.visible_message("<span class='warning'>\The [chassis] begins prying on \the [AD]!</span>")
|
||||
if(do_after(chassis.occupant, 15 SECONDS,AD) && chassis.Adjacent(AD))
|
||||
AD.welded = FALSE
|
||||
AD.update_icon()
|
||||
playsound(AD.loc, 'sound/machines/airlock_creaking.ogg', 100, 1)
|
||||
AD.visible_message("<span class='danger'>\The [chassis] tears \the [AD] open!</span>")
|
||||
if(!AD.welded)
|
||||
if(density)
|
||||
spawn(0)
|
||||
AD.open(1)
|
||||
else
|
||||
spawn(0)
|
||||
AD.close(1)
|
||||
return
|
||||
else
|
||||
occupant_message("<span class='warning'>[target] is firmly secured.</span>")
|
||||
return
|
||||
if(cargo_holder.cargo.len >= cargo_holder.cargo_capacity)
|
||||
occupant_message("<span class='warning'>Not enough room in cargo compartment.</span>")
|
||||
return
|
||||
|
||||
occupant_message("You lift [target] and start to load it into cargo compartment.")
|
||||
chassis.visible_message("[chassis] lifts [target] and starts to load it into cargo compartment.")
|
||||
set_ready_state(0)
|
||||
chassis.use_power(energy_drain)
|
||||
O.anchored = 1
|
||||
var/T = chassis.loc
|
||||
if(do_after_cooldown(target))
|
||||
if(T == chassis.loc && src == chassis.selected)
|
||||
cargo_holder.cargo += O
|
||||
O.loc = chassis
|
||||
O.anchored = 0
|
||||
occupant_message("<span class='notice'>[target] succesfully loaded.</span>")
|
||||
log_message("Loaded [O]. Cargo compartment capacity: [cargo_holder.cargo_capacity - cargo_holder.cargo.len]")
|
||||
else
|
||||
occupant_message("<span class='warning'>You must hold still while handling objects.</span>")
|
||||
O.anchored = initial(O.anchored)
|
||||
|
||||
//attacking
|
||||
else if(istype(target,/mob/living))
|
||||
var/mob/living/M = target
|
||||
if(M.stat>1) return
|
||||
if(chassis.occupant.a_intent == I_HURT || istype(chassis.occupant,/mob/living/carbon/brain)) //No tactile feedback for brains
|
||||
M.take_overall_damage(dam_force)
|
||||
M.adjustOxyLoss(round(dam_force/2))
|
||||
M.updatehealth()
|
||||
occupant_message("<span class='warning'>You squeeze [target] with [src.name]. Something cracks.</span>")
|
||||
playsound(src.loc, "fracture", 5, 1, -2) //CRACK
|
||||
chassis.visible_message("<span class='warning'>[chassis] squeezes [target].</span>")
|
||||
else if(chassis.occupant.a_intent == I_DISARM && enable_special)
|
||||
playsound(src.loc, 'sound/mecha/hydraulic.ogg', 10, 1, -2)
|
||||
M.take_overall_damage(dam_force/2)
|
||||
M.adjustOxyLoss(round(dam_force/3))
|
||||
M.updatehealth()
|
||||
occupant_message("<span class='warning'>You slam [target] with [src.name]. Something cracks.</span>")
|
||||
playsound(src.loc, "fracture", 3, 1, -2) //CRACK 2
|
||||
chassis.visible_message("<span class='warning'>[chassis] slams [target].</span>")
|
||||
M.throw_at(get_step(M,get_dir(src, M)), 14, 1.5, chassis)
|
||||
else
|
||||
step_away(M,chassis)
|
||||
occupant_message("You push [target] out of the way.")
|
||||
chassis.visible_message("[chassis] pushes [target] out of the way.")
|
||||
set_ready_state(0)
|
||||
chassis.use_power(energy_drain)
|
||||
do_after_cooldown()
|
||||
return 1
|
||||
|
||||
|
||||
//This is pretty much just for the death-ripley so that it is harmless
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp/safety
|
||||
name = "\improper KILL CLAMP"
|
||||
equip_cooldown = 15
|
||||
energy_drain = 0
|
||||
dam_force = 0
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp/safety/action(atom/target)
|
||||
if(!action_checks(target)) return
|
||||
if(!cargo_holder) return
|
||||
if(istype(target,/obj))
|
||||
var/obj/O = target
|
||||
if(!O.anchored)
|
||||
if(cargo_holder.cargo.len < cargo_holder.cargo_capacity)
|
||||
chassis.occupant_message("You lift [target] and start to load it into cargo compartment.")
|
||||
chassis.visible_message("[chassis] lifts [target] and starts to load it into cargo compartment.")
|
||||
set_ready_state(0)
|
||||
chassis.use_power(energy_drain)
|
||||
O.anchored = 1
|
||||
var/T = chassis.loc
|
||||
if(do_after_cooldown(target))
|
||||
if(T == chassis.loc && src == chassis.selected)
|
||||
cargo_holder.cargo += O
|
||||
O.loc = chassis
|
||||
O.anchored = 0
|
||||
chassis.occupant_message("<span class='notice'>[target] succesfully loaded.</span>")
|
||||
chassis.log_message("Loaded [O]. Cargo compartment capacity: [cargo_holder.cargo_capacity - cargo_holder.cargo.len]")
|
||||
else
|
||||
chassis.occupant_message("<span class='warning'>You must hold still while handling objects.</span>")
|
||||
O.anchored = initial(O.anchored)
|
||||
else
|
||||
chassis.occupant_message("<span class='warning'>Not enough room in cargo compartment.</span>")
|
||||
else
|
||||
chassis.occupant_message("<span class='warning'>[target] is firmly secured.</span>")
|
||||
|
||||
else if(istype(target,/mob/living))
|
||||
var/mob/living/M = target
|
||||
if(M.stat>1) return
|
||||
if(chassis.occupant.a_intent == I_HURT)
|
||||
chassis.occupant_message("<span class='danger'>You obliterate [target] with [src.name], leaving blood and guts everywhere.</span>")
|
||||
chassis.visible_message("<span class='danger'>[chassis] destroys [target] in an unholy fury.</span>")
|
||||
if(chassis.occupant.a_intent == I_DISARM)
|
||||
chassis.occupant_message("<span class='danger'>You tear [target]'s limbs off with [src.name].</span>")
|
||||
chassis.visible_message("<span class='danger'>[chassis] rips [target]'s arms off.</span>")
|
||||
else
|
||||
step_away(M,chassis)
|
||||
chassis.occupant_message("You smash into [target], sending them flying.")
|
||||
chassis.visible_message("[chassis] tosses [target] like a piece of paper.")
|
||||
set_ready_state(0)
|
||||
chassis.use_power(energy_drain)
|
||||
do_after_cooldown()
|
||||
return 1
|
||||
@@ -0,0 +1,142 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/drill
|
||||
name = "drill"
|
||||
desc = "This is the drill that'll pierce the heavens!"
|
||||
icon_state = "mecha_drill"
|
||||
equip_cooldown = 30
|
||||
energy_drain = 10
|
||||
force = 15
|
||||
required_type = list(/obj/mecha/working/ripley)
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/drill/action(atom/target)
|
||||
if(!action_checks(target)) return
|
||||
if(isobj(target))
|
||||
var/obj/target_obj = target
|
||||
if(!target_obj.vars.Find("unacidable") || target_obj.unacidable) return
|
||||
set_ready_state(0)
|
||||
chassis.use_power(energy_drain)
|
||||
chassis.visible_message("<span class='danger'>[chassis] starts to drill [target]</span>", "<span class='warning'>You hear the drill.</span>")
|
||||
occupant_message("<span class='danger'>You start to drill [target]</span>")
|
||||
var/T = chassis.loc
|
||||
var/C = target.loc //why are these backwards? we may never know -Pete
|
||||
if(do_after_cooldown(target))
|
||||
if(T == chassis.loc && src == chassis.selected)
|
||||
if(istype(target, /turf/simulated/wall))
|
||||
var/turf/simulated/wall/W = target
|
||||
if(W.reinf_material)
|
||||
occupant_message("<span class='warning'>[target] is too durable to drill through.</span>")
|
||||
else
|
||||
log_message("Drilled through [target]")
|
||||
target.ex_act(2)
|
||||
else if(istype(target, /turf/simulated/mineral))
|
||||
if(enable_special)
|
||||
for(var/turf/simulated/mineral/M in range(chassis,1))
|
||||
if(get_dir(chassis,M)&chassis.dir)
|
||||
M.GetDrilled()
|
||||
else
|
||||
var/turf/simulated/mineral/M1 = target
|
||||
M1.GetDrilled()
|
||||
log_message("Drilled through [target]")
|
||||
if(locate(/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp) in chassis.equipment)
|
||||
var/obj/structure/ore_box/ore_box = locate(/obj/structure/ore_box) in chassis:cargo
|
||||
if(ore_box)
|
||||
for(var/obj/item/weapon/ore/ore in range(chassis,1))
|
||||
if(get_dir(chassis,ore)&chassis.dir)
|
||||
ore.forceMove(ore_box)
|
||||
else if(target.loc == C)
|
||||
log_message("Drilled through [target]")
|
||||
target.ex_act(2)
|
||||
return 1
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill
|
||||
name = "diamond drill"
|
||||
desc = "This is an upgraded version of the drill that'll pierce the heavens!"
|
||||
icon_state = "mecha_diamond_drill"
|
||||
origin_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3)
|
||||
equip_cooldown = 10
|
||||
force = 15
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill/action(atom/target)
|
||||
if(!action_checks(target)) return
|
||||
if(isobj(target))
|
||||
var/obj/target_obj = target
|
||||
if(target_obj.unacidable) return
|
||||
set_ready_state(0)
|
||||
chassis.use_power(energy_drain)
|
||||
chassis.visible_message("<span class='danger'>[chassis] starts to drill [target]</span>", "<span class='warning'>You hear the drill.</span>")
|
||||
occupant_message("<span class='danger'>You start to drill [target]</span>")
|
||||
var/T = chassis.loc
|
||||
var/C = target.loc //why are these backwards? we may never know -Pete
|
||||
if(do_after_cooldown(target))
|
||||
if(T == chassis.loc && src == chassis.selected)
|
||||
if(istype(target, /turf/simulated/wall))
|
||||
var/turf/simulated/wall/W = target
|
||||
if(!W.reinf_material || do_after_cooldown(target))//To slow down how fast mechs can drill through the station
|
||||
log_message("Drilled through [target]")
|
||||
target.ex_act(3)
|
||||
else if(istype(target, /turf/simulated/mineral))
|
||||
if(enable_special)
|
||||
for(var/turf/simulated/mineral/M in range(chassis,1))
|
||||
if(get_dir(chassis,M)&chassis.dir)
|
||||
M.GetDrilled()
|
||||
else
|
||||
var/turf/simulated/mineral/M1 = target
|
||||
M1.GetDrilled()
|
||||
log_message("Drilled through [target]")
|
||||
if(locate(/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp) in chassis.equipment)
|
||||
var/obj/structure/ore_box/ore_box = locate(/obj/structure/ore_box) in chassis:cargo
|
||||
if(ore_box)
|
||||
for(var/obj/item/weapon/ore/ore in range(chassis,1))
|
||||
if(get_dir(chassis,ore)&chassis.dir)
|
||||
ore.forceMove(ore_box)
|
||||
else if(target.loc == C)
|
||||
log_message("Drilled through [target]")
|
||||
target.ex_act(2)
|
||||
return 1
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/drill/bore
|
||||
name = "depth bore"
|
||||
desc = "This is the drill that'll pierce the depths!"
|
||||
icon_state = "mecha_bore"
|
||||
equip_cooldown = 5 SECONDS
|
||||
energy_drain = 30
|
||||
force = 20
|
||||
required_type = list(/obj/mecha/working/ripley)
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/drill/bore/action(atom/target)
|
||||
if(!action_checks(target)) return
|
||||
if(isobj(target))
|
||||
var/obj/target_obj = target
|
||||
if(target_obj.unacidable) return
|
||||
set_ready_state(0)
|
||||
chassis.use_power(energy_drain)
|
||||
chassis.visible_message("<span class='danger'>[chassis] starts to bore into \the [target]</span>", "<span class='warning'>You hear the bore.</span>")
|
||||
occupant_message("<span class='danger'>You start to bore into \the [target]</span>")
|
||||
var/T = chassis.loc
|
||||
var/C = target.loc
|
||||
if(do_after_cooldown(target))
|
||||
if(T == chassis.loc && src == chassis.selected)
|
||||
if(istype(target, /turf/simulated/wall))
|
||||
var/turf/simulated/wall/W = target
|
||||
if(W.reinf_material)
|
||||
occupant_message("<span class='warning'>[target] is too durable to bore through.</span>")
|
||||
else
|
||||
log_message("Bored through [target]")
|
||||
target.ex_act(2)
|
||||
else if(istype(target, /turf/simulated/mineral))
|
||||
var/turf/simulated/mineral/M = target
|
||||
if(enable_special && !M.density)
|
||||
M.ex_act(2)
|
||||
log_message("Bored into [target]")
|
||||
else
|
||||
M.GetDrilled()
|
||||
log_message("Bored through [target]")
|
||||
if(locate(/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp) in chassis.equipment)
|
||||
var/obj/structure/ore_box/ore_box = locate(/obj/structure/ore_box) in chassis:cargo
|
||||
if(ore_box)
|
||||
for(var/obj/item/weapon/ore/ore in range(chassis,1))
|
||||
if(get_dir(chassis,ore)&chassis.dir)
|
||||
ore.forceMove(ore_box)
|
||||
else if(target.loc == C)
|
||||
log_message("Drilled through [target]")
|
||||
target.ex_act(2)
|
||||
return 1
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user