Merge branch 'master' of https://github.com/PolarisSS13/Polaris into flan
@@ -11,6 +11,9 @@
|
||||
//#define ZASDBG // Uncomment to turn on super detailed ZAS debugging that probably won't even compile.
|
||||
#define MULTIZAS // Uncomment to turn on Multi-Z ZAS Support!
|
||||
|
||||
// Movement Compile Options
|
||||
//#define CARDINAL_INPUT_ONLY // Uncomment to disable diagonal player movement (restore previous cardinal-moves-only behavior)
|
||||
|
||||
// Comment/Uncomment this to turn off/on shuttle code debugging logs
|
||||
#define DEBUG_SHUTTLES
|
||||
|
||||
|
||||
@@ -13,6 +13,10 @@
|
||||
|
||||
GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768))
|
||||
|
||||
/* Directions */
|
||||
///All the cardinal direction bitflags.
|
||||
#define ALL_CARDINALS (NORTH|SOUTH|EAST|WEST)
|
||||
|
||||
// datum_flags
|
||||
#define DF_VAR_EDITED (1<<0)
|
||||
#define DF_ISPROCESSING (1<<1)
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
// Bitflags for the move_keys_held bitfield.
|
||||
#define NORTH_KEY (1<<0)
|
||||
#define SOUTH_KEY (1<<1)
|
||||
#define EAST_KEY (1<<2)
|
||||
#define WEST_KEY (1<<3)
|
||||
#define W_KEY (1<<4)
|
||||
#define S_KEY (1<<5)
|
||||
#define D_KEY (1<<6)
|
||||
#define A_KEY (1<<7)
|
||||
// Combine the held WASD and arrow keys together (OR) into byond N/S/E/W dir
|
||||
#define MOVEMENT_KEYS_TO_DIR(MK) ((((MK)>>4)|(MK))&(ALL_CARDINALS))
|
||||
|
||||
// Bitflags for pressed modifier keys.
|
||||
// Values chosen specifically to not conflict with dir bitfield, in case we want to smoosh them together.
|
||||
#define CTRL_KEY (1<<8)
|
||||
#define SHIFT_KEY (1<<9)
|
||||
#define ALT_KEY (1<<10)
|
||||
|
||||
// Uncomment to get a lot of debug logging for movement keys.
|
||||
// #define DEBUG_INPUT(A) to_world_log(A)
|
||||
#define DEBUG_INPUT(A)
|
||||
@@ -55,6 +55,7 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G
|
||||
// The numbers just define the ordering, they are meaningless otherwise.
|
||||
#define INIT_ORDER_WEBHOOKS 50
|
||||
#define INIT_ORDER_SQLITE 40
|
||||
#define INIT_ORDER_INPUT 37
|
||||
#define INIT_ORDER_CHEMISTRY 35
|
||||
#define INIT_ORDER_SKYBOX 30
|
||||
#define INIT_ORDER_MAPPING 25
|
||||
@@ -108,3 +109,4 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G
|
||||
#define FIRE_PRIORITY_PROJECTILES 150
|
||||
#define FIRE_PRIORITY_CHAT 400
|
||||
#define FIRE_PRIORITY_OVERLAYS 500
|
||||
#define FIRE_PRIORITY_INPUT 1000 // This must always always be the max highest priority. Player input must never be lost.
|
||||
@@ -44,6 +44,25 @@
|
||||
if ("SOUTHEAST") return 6
|
||||
if ("SOUTHWEST") return 10
|
||||
|
||||
// Turns a direction into text showing all bits set
|
||||
/proc/dirs2text(direction)
|
||||
if(!direction)
|
||||
return ""
|
||||
var/list/dirs = list()
|
||||
if(direction & NORTH)
|
||||
dirs += "NORTH"
|
||||
if(direction & SOUTH)
|
||||
dirs += "SOUTH"
|
||||
if(direction & EAST)
|
||||
dirs += "EAST"
|
||||
if(direction & WEST)
|
||||
dirs += "WEST"
|
||||
if(direction & UP)
|
||||
dirs += "UP"
|
||||
if(direction & DOWN)
|
||||
dirs += "DOWN"
|
||||
return dirs.Join(" ")
|
||||
|
||||
// Converts an angle (degrees) into an ss13 direction
|
||||
/proc/angle2dir(var/degree)
|
||||
degree = (degree + 22.5) % 365 // 22.5 = 45 / 2
|
||||
@@ -99,6 +118,25 @@
|
||||
if (rights & R_EVENT) . += "[seperator]+EVENT"
|
||||
return .
|
||||
|
||||
// Converts a hexadecimal color (e.g. #FF0050) to a list of numbers for red, green, and blue (e.g. list(255,0,80) ).
|
||||
/proc/hex2rgb(hex)
|
||||
// Strips the starting #, in case this is ever supplied without one, so everything doesn't break.
|
||||
if(findtext(hex,"#",1,2))
|
||||
hex = copytext(hex, 2)
|
||||
return list(hex2rgb_r(hex), hex2rgb_g(hex), hex2rgb_b(hex))
|
||||
|
||||
// The three procs below require that the '#' part of the hex be stripped, which hex2rgb() does automatically.
|
||||
/proc/hex2rgb_r(hex)
|
||||
var/hex_to_work_on = copytext(hex,1,3)
|
||||
return hex2num(hex_to_work_on)
|
||||
|
||||
/proc/hex2rgb_g(hex)
|
||||
var/hex_to_work_on = copytext(hex,3,5)
|
||||
return hex2num(hex_to_work_on)
|
||||
|
||||
/proc/hex2rgb_b(hex)
|
||||
var/hex_to_work_on = copytext(hex,5,7)
|
||||
return hex2num(hex_to_work_on)
|
||||
|
||||
// heat2color functions. Adapted from: http://www.tannerhelland.com/4435/convert-temperature-rgb-algorithm-code/
|
||||
/proc/heat2color(temp)
|
||||
@@ -318,9 +356,9 @@
|
||||
switch(child)
|
||||
if(/datum)
|
||||
return null
|
||||
if(/obj, /mob)
|
||||
if(/obj || /mob)
|
||||
return /atom/movable
|
||||
if(/area, /turf)
|
||||
if(/area || /turf)
|
||||
return /atom
|
||||
else
|
||||
return /datum
|
||||
@@ -339,4 +377,4 @@
|
||||
error("File not found ([filename])")
|
||||
catch(var/exception/E)
|
||||
if(error_on_invalid_return)
|
||||
error("Exception when loading file as string: [E]")
|
||||
error("Exception when loading file as string: [E]")
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
SUBSYSTEM_DEF(input)
|
||||
name = "Input"
|
||||
wait = 1 // SS_TICKER means this runs every tick
|
||||
init_order = INIT_ORDER_INPUT
|
||||
flags = SS_TICKER
|
||||
priority = FIRE_PRIORITY_INPUT
|
||||
runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY
|
||||
|
||||
/datum/controller/subsystem/input/fire()
|
||||
var/list/clients = GLOB.clients // Let's sing the list cache song
|
||||
for(var/i in 1 to clients.len)
|
||||
var/client/C = clients[i]
|
||||
C?.keyLoop()
|
||||
@@ -23,6 +23,28 @@
|
||||
name = "Boxers, green & blue striped"
|
||||
icon_state = "boxers_green_and_blue"
|
||||
|
||||
/datum/category_item/underwear/bottom/boxers_red_and_yellow
|
||||
name = "Boxers, red & yellow striped"
|
||||
icon_state = "redyellow"
|
||||
|
||||
/datum/category_item/underwear/bottom/boxers_rwb
|
||||
name = "Boxers, red, white & blue"
|
||||
icon_state = "redwhiteblue"
|
||||
|
||||
/datum/category_item/underwear/bottom/boxers_stripe
|
||||
name = "Boxers, striped"
|
||||
icon_state = "stripe"
|
||||
|
||||
/datum/category_item/underwear/bottom/boxers_midway
|
||||
name = "Boxers, midway"
|
||||
icon_state = "midway"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/bottom/jockstrap
|
||||
name = "Jockstrap"
|
||||
icon_state = "jock"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/bottom/panties
|
||||
name = "Panties"
|
||||
icon_state = "panties"
|
||||
@@ -45,6 +67,11 @@
|
||||
icon_state = "panties_alt"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/bottom/boyshorts
|
||||
name = "Boyshorts"
|
||||
icon_state = "boyshorts"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/bottom/compression_shorts
|
||||
name = "Compression shorts"
|
||||
icon_state = "compression_shorts"
|
||||
@@ -59,6 +86,10 @@
|
||||
name = "Fishnets"
|
||||
icon_state = "fishnet_lower"
|
||||
|
||||
/datum/category_item/underwear/bottom/sheer_slip
|
||||
name = "Sheer slip"
|
||||
icon_state = "sheer"
|
||||
|
||||
/datum/category_item/underwear/bottom/striped_panties
|
||||
name = "Striped Panties"
|
||||
icon_state = "striped_panties"
|
||||
@@ -67,4 +98,4 @@
|
||||
/datum/category_item/underwear/bottom/longjon
|
||||
name = "Long John Bottoms"
|
||||
icon_state = "ljonb"
|
||||
has_color = TRUE
|
||||
has_color = TRUE
|
||||
|
||||
@@ -37,11 +37,26 @@
|
||||
name = "Lacy bra, alt, stripe"
|
||||
icon_state = "lacy_bra_alt_stripe"
|
||||
|
||||
/datum/category_item/underwear/top/bralette
|
||||
name = "Bralette"
|
||||
icon_state = "Bralette"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/top/halterneck_bra
|
||||
name = "Halterneck bra"
|
||||
icon_state = "halterneck_bra"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/top/straplessbra
|
||||
name = "Strapless bra"
|
||||
icon_state = "strapless_bra"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/top/tubebra
|
||||
name = "Tube Bra"
|
||||
icon_state = "tube_bra"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/top/tubetop
|
||||
name = "Tube Top"
|
||||
icon_state = "tubetop"
|
||||
@@ -70,4 +85,4 @@
|
||||
|
||||
/datum/category_item/underwear/top/straplessbinder
|
||||
name = "Binder Strapless"
|
||||
icon_state = "straplessbinder_s"
|
||||
icon_state = "straplessbinder_s"
|
||||
|
||||
@@ -33,7 +33,6 @@
|
||||
icon_state = "shirt_long_female_s"
|
||||
has_color = TRUE
|
||||
|
||||
|
||||
/datum/category_item/underwear/undershirt/fishnet_simple
|
||||
name = "Fishnet shirt"
|
||||
icon_state = "fishnet_simple"
|
||||
@@ -58,6 +57,11 @@
|
||||
icon_state = "tanktop_alt_fem_vneck"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/tank_cropped
|
||||
name = "Tank top, feminine, cropped"
|
||||
icon_state = "tanktop_cropped"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/tank_cropped_vneck
|
||||
name = "Tank top, feminine, cropped & v-neck"
|
||||
icon_state = "tanktop_cropped_vneck"
|
||||
@@ -79,6 +83,10 @@
|
||||
name = "Tank top, striped"
|
||||
icon_state = "tank_stripes_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/tank_top_stripes_alt
|
||||
name = "Tank top, striped alt"
|
||||
icon_state = "tank_stripes_alt_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/tank_top_sun
|
||||
name = "Tank top, sun"
|
||||
icon_state = "tank_sun_s"
|
||||
@@ -135,6 +143,14 @@
|
||||
name = "Sport shirt, blue"
|
||||
icon_state = "blueshirtsport_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/jersey_blue
|
||||
name = "Sports jersey, blue"
|
||||
icon_state = "jersey_blue"
|
||||
|
||||
/datum/category_item/underwear/undershirt/jersey_red
|
||||
name = "Sports jersey, red"
|
||||
icon_state = "jersey_red"
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_tiedye
|
||||
name = "Shirt, tiedye"
|
||||
icon_state = "shirt_tiedye_s"
|
||||
@@ -143,6 +159,27 @@
|
||||
name = "Shirt, blue stripes"
|
||||
icon_state = "shirt_stripes_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_band
|
||||
name = "Shirt, band"
|
||||
icon_state = "band"
|
||||
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_question
|
||||
name = "Shirt, question mark"
|
||||
icon_state = "shirt_question"
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_peace
|
||||
name = "Shirt, peace"
|
||||
icon_state = "peace"
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_alien
|
||||
name = "Shirt, little grey man"
|
||||
icon_state = "shirt_alien"
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_skull
|
||||
name = "Shirt, red with skull"
|
||||
icon_state = "shirt_skull"
|
||||
|
||||
/datum/category_item/underwear/undershirt/bowling
|
||||
name = "Bowling Shirt, Red"
|
||||
icon_state = "bowling"
|
||||
@@ -206,4 +243,4 @@
|
||||
/datum/category_item/underwear/undershirt/dress_shirt
|
||||
name = "Dress shirt, masculine"
|
||||
icon_state = "undershirt_dress"
|
||||
has_color = TRUE
|
||||
has_color = TRUE
|
||||
|
||||
@@ -29,9 +29,9 @@
|
||||
|
||||
/obj/item/soap
|
||||
name = "soap"
|
||||
desc = "A cheap bar of soap. Doesn't smell."
|
||||
desc = "A cheap bar of soap. Smells of lye."
|
||||
gender = PLURAL
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon = 'icons/obj/soap.dmi'
|
||||
icon_state = "soap"
|
||||
flags = NOCONDUCT
|
||||
w_class = ITEMSIZE_SMALL
|
||||
@@ -41,20 +41,96 @@
|
||||
throw_range = 20
|
||||
|
||||
/obj/item/soap/nanotrasen
|
||||
desc = "A NanoTrasen-brand bar of soap. Smells of phoron."
|
||||
desc = "A NanoTrasen-brand bar of soap. Smells of phoron, a years-old marketing gimmick."
|
||||
icon_state = "soapnt"
|
||||
|
||||
/obj/item/soap/deluxe
|
||||
icon_state = "soapdeluxe"
|
||||
|
||||
/obj/item/soap/deluxe/Initialize()
|
||||
desc = "A deluxe Waffle Co. brand bar of soap. Smells of [pick("lavender", "vanilla", "strawberry", "chocolate" ,"space")]."
|
||||
desc = "A deluxe NanoLux brand bar of soap. Smells of [pick("lavender", "vanilla", "strawberry", "chocolate" ,"space")]."
|
||||
. = ..()
|
||||
|
||||
/obj/item/soap/syndie
|
||||
desc = "An untrustworthy bar of soap. Smells of fear."
|
||||
desc = "An dubious bar of soap. Smells of lyes."
|
||||
icon_state = "soapsyndie"
|
||||
|
||||
/obj/item/soap/space_soap
|
||||
desc = "Smells like hot metal and walnuts."
|
||||
icon_state = "space_soap"
|
||||
|
||||
/obj/item/soap/water_soap
|
||||
desc = "Smells like chlorine."
|
||||
icon_state = "water_soap"
|
||||
|
||||
/obj/item/soap/fire_soap
|
||||
desc = "Smells like a campfire."
|
||||
icon_state = "fire_soap"
|
||||
|
||||
/obj/item/soap/rainbow_soap
|
||||
desc = "Smells sickly sweet."
|
||||
icon_state = "rainbow_soap"
|
||||
|
||||
/obj/item/soap/diamond_soap
|
||||
desc = "Smells like saffron and vanilla."
|
||||
icon_state = "diamond_soap"
|
||||
|
||||
/obj/item/soap/uranium_soap
|
||||
desc = "Smells not great... Not terrible."
|
||||
icon_state = "uranium_soap"
|
||||
|
||||
/obj/item/soap/silver_soap
|
||||
desc = "Smells like birch and amaranth."
|
||||
icon_state = "silver_soap"
|
||||
|
||||
/obj/item/soap/brown_soap
|
||||
desc = "Smells like cinnamon and cognac."
|
||||
icon_state = "brown_soap"
|
||||
|
||||
/obj/item/soap/white_soap
|
||||
desc = "Smells like nutmeg and oats."
|
||||
icon_state = "white_soap"
|
||||
|
||||
/obj/item/soap/grey_soap
|
||||
desc = "Smells like bergamot and lilies."
|
||||
icon_state = "grey_soap"
|
||||
|
||||
/obj/item/soap/pink_soap
|
||||
desc = "Smells like bubblegum."
|
||||
icon_state = "pink_soap"
|
||||
|
||||
/obj/item/soap/purple_soap
|
||||
desc = "Smells like lavender."
|
||||
icon_state = "purple_soap"
|
||||
|
||||
/obj/item/soap/blue_soap
|
||||
desc = "Smells like cardamom."
|
||||
icon_state = "blue_soap"
|
||||
|
||||
/obj/item/soap/cyan_soap
|
||||
desc = "Smells like bluebells and peaches."
|
||||
icon_state = "cyan_soap"
|
||||
|
||||
/obj/item/soap/green_soap
|
||||
desc = "Smells like a freshly mowed lawn."
|
||||
icon_state = "green_soap"
|
||||
|
||||
/obj/item/soap/yellow_soap
|
||||
desc = "Smells like citron and ginger."
|
||||
icon_state = "yellow_soap"
|
||||
|
||||
/obj/item/soap/orange_soap
|
||||
desc = "Smells like oranges and dark chocolate."
|
||||
icon_state = "orange_soap"
|
||||
|
||||
/obj/item/soap/red_soap
|
||||
desc = "Smells like cherries."
|
||||
icon_state = "red_soap"
|
||||
|
||||
/obj/item/soap/golden_soap
|
||||
desc = "Smells like honey."
|
||||
icon_state = "golden_soap"
|
||||
|
||||
/obj/item/bikehorn
|
||||
name = "bike horn"
|
||||
desc = "A horn off of a bicycle."
|
||||
@@ -354,7 +430,7 @@
|
||||
if(B.rped_rating() > lowest_rating)
|
||||
continue
|
||||
remove_from_storage(B, T)
|
||||
|
||||
|
||||
/obj/item/stock_parts
|
||||
name = "stock part"
|
||||
desc = "What?"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/atom/movable
|
||||
layer = OBJ_LAYER
|
||||
appearance_flags = TILE_BOUND|PIXEL_SCALE|KEEP_TOGETHER
|
||||
appearance_flags = TILE_BOUND|PIXEL_SCALE|KEEP_TOGETHER|LONG_GLIDE
|
||||
glide_size = 8
|
||||
var/last_move = null //The direction the atom last moved
|
||||
var/anchored = 0
|
||||
@@ -103,7 +103,8 @@
|
||||
var/dest_z = get_z(newloc)
|
||||
|
||||
// Do The Move
|
||||
glide_for(movetime)
|
||||
if(movetime)
|
||||
glide_for(movetime) // First attempt, lets let the diag do it.
|
||||
loc = newloc
|
||||
. = TRUE
|
||||
|
||||
@@ -145,7 +146,7 @@
|
||||
// place due to a Crossed, Bumped, etc. call will interrupt
|
||||
// the second half of the diagonal movement, or the second attempt
|
||||
// at a first half if step() fails because we hit something.
|
||||
glide_for(movetime)
|
||||
glide_for(movetime * 2)
|
||||
if (direct & NORTH)
|
||||
if (direct & EAST)
|
||||
if (step(src, NORTH) && moving_diagonally)
|
||||
@@ -198,7 +199,7 @@
|
||||
|
||||
// If we moved, call Moved() on ourselves
|
||||
if(.)
|
||||
Moved(oldloc, direct, FALSE, movetime)
|
||||
Moved(oldloc, direct, FALSE, movetime ? movetime : ( (TICKS2DS(WORLD_ICON_SIZE/glide_size)) * (moving_diagonally ? (0.5) : 1) ) )
|
||||
|
||||
// Update timers/cooldown stuff
|
||||
move_speed = world.time - l_move_time
|
||||
@@ -697,4 +698,4 @@
|
||||
return selfimage
|
||||
|
||||
/atom/movable/proc/get_cell()
|
||||
return
|
||||
return
|
||||
@@ -198,6 +198,9 @@
|
||||
open_sound_powered = 'sound/machines/door/space1o.ogg'
|
||||
close_sound_powered = 'sound/machines/door/space1c.ogg'
|
||||
|
||||
/obj/machinery/door/airlock/external/white
|
||||
icon = 'icons/obj/doors/Doorextwhite.dmi'
|
||||
|
||||
/obj/machinery/door/airlock/external/glass/bolted
|
||||
icon_state = "door_locked" // So it looks visibly bolted in map editor
|
||||
locked = 1
|
||||
|
||||
@@ -622,7 +622,7 @@
|
||||
name = "Nonstandard suit cycler"
|
||||
model_text = "Nonstandard"
|
||||
req_access = list(access_syndicate)
|
||||
departments = list("Mercenary", "Charring","No Change")
|
||||
departments = list("Mercenary", "Light Boarding", "Charring","No Change")
|
||||
can_repair = 1
|
||||
|
||||
/obj/machinery/suit_cycler/exploration
|
||||
@@ -1100,6 +1100,9 @@
|
||||
if("Charring")
|
||||
parent_helmet = /obj/item/clothing/head/helmet/space/void/merc/fire
|
||||
parent_suit = /obj/item/clothing/suit/space/void/merc/fire
|
||||
if("Light Boarding")
|
||||
parent_helmet = /obj/item/clothing/head/helmet/space/void/boarding_ops
|
||||
parent_suit = /obj/item/clothing/suit/space/void/boarding_ops
|
||||
if("Gem-Encrusted", "Wizard")
|
||||
parent_helmet = /obj/item/clothing/head/helmet/space/void/wizard
|
||||
parent_suit = /obj/item/clothing/suit/space/void/wizard
|
||||
@@ -1149,9 +1152,9 @@
|
||||
var/suit_check = ((suit!=null && (initial(parent_suit.icon_state) in icon_states(suit.sprite_sheets_obj[target_species],1))) || suit==null)
|
||||
var/suit_helmet_check = ((suit!=null && suit.helmet!=null && (initial(parent_helmet.icon_state) in icon_states(suit.helmet.sprite_sheets_obj[target_species],1))) || suit==null || suit.helmet==null)
|
||||
if(helmet_check && suit_check && suit_helmet_check)
|
||||
if(helmet)
|
||||
if(helmet)
|
||||
helmet.refit_for_species(target_species)
|
||||
if(suit)
|
||||
if(suit)
|
||||
suit.refit_for_species(target_species)
|
||||
if(suit.helmet)
|
||||
suit.helmet.refit_for_species(target_species)
|
||||
@@ -1160,9 +1163,9 @@
|
||||
T.visible_message("[bicon(src)]<span class='warning'>Unable to apply specified cosmetics with specified species. Please try again with a different species or cosmetic option selected.</span>")
|
||||
return
|
||||
else
|
||||
if(helmet)
|
||||
if(helmet)
|
||||
helmet.refit_for_species(target_species)
|
||||
if(suit)
|
||||
if(suit)
|
||||
suit.refit_for_species(target_species)
|
||||
if(suit.helmet)
|
||||
suit.helmet.refit_for_species(target_species)
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
/obj/item/grenade/chem_grenade
|
||||
name = "grenade casing"
|
||||
icon_state = "chemg"
|
||||
item_state = "grenade"
|
||||
desc = "A hand made chemical grenade."
|
||||
w_class = ITEMSIZE_SMALL
|
||||
force = 2.0
|
||||
@@ -193,6 +192,7 @@
|
||||
name = "large chem grenade"
|
||||
desc = "An oversized grenade that affects a larger area."
|
||||
icon_state = "large_grenade"
|
||||
item_state = "largechemg"
|
||||
allowed_containers = list(/obj/item/reagent_containers/glass)
|
||||
origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3)
|
||||
affected_area = 4
|
||||
@@ -305,4 +305,4 @@
|
||||
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
icon_state = initial(icon_state) +"_locked"
|
||||
icon_state = initial(icon_state) +"_locked"
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
/obj/item/grenade/empgrenade
|
||||
name = "emp grenade"
|
||||
icon = 'icons/obj/device.dmi'
|
||||
pickup_sound = 'sound/items/pickup/device.ogg'
|
||||
drop_sound = 'sound/items/drop/device.ogg'
|
||||
icon_state = "emp"
|
||||
@@ -21,8 +20,9 @@
|
||||
name = "low yield emp grenade"
|
||||
desc = "A weaker variant of the EMP grenade"
|
||||
icon_state = "lyemp"
|
||||
item_state = "lyemp"
|
||||
origin_tech = list(TECH_MATERIAL = 2, TECH_MAGNET = 3)
|
||||
emp_heavy = 1
|
||||
emp_med = 2
|
||||
emp_light = 3
|
||||
emp_long = 4
|
||||
emp_long = 4
|
||||
|
||||
@@ -309,10 +309,30 @@
|
||||
icon_state = "soap"
|
||||
|
||||
/obj/random/soap/item_to_spawn()
|
||||
return pick(prob(3);/obj/item/soap,
|
||||
prob(2);/obj/item/soap/nanotrasen,
|
||||
prob(2);/obj/item/soap/deluxe,
|
||||
prob(1);/obj/item/soap/syndie)
|
||||
return pick(/obj/item/soap,
|
||||
/obj/item/soap/nanotrasen,
|
||||
/obj/item/soap/deluxe,
|
||||
/obj/item/soap/syndie,
|
||||
/obj/item/soap/space_soap,
|
||||
/obj/item/soap/space_soap,
|
||||
/obj/item/soap/water_soap,
|
||||
/obj/item/soap/fire_soap,
|
||||
/obj/item/soap/rainbow_soap,
|
||||
/obj/item/soap/diamond_soap,
|
||||
/obj/item/soap/uranium_soap,
|
||||
/obj/item/soap/silver_soap,
|
||||
/obj/item/soap/brown_soap,
|
||||
/obj/item/soap/white_soap,
|
||||
/obj/item/soap/grey_soap,
|
||||
/obj/item/soap/pink_soap,
|
||||
/obj/item/soap/purple_soap,
|
||||
/obj/item/soap/blue_soap,
|
||||
/obj/item/soap/cyan_soap,
|
||||
/obj/item/soap/green_soap,
|
||||
/obj/item/soap/yellow_soap,
|
||||
/obj/item/soap/orange_soap,
|
||||
/obj/item/soap/red_soap,
|
||||
/obj/item/soap/golden_soap)
|
||||
|
||||
/obj/random/drinkbottle
|
||||
name = "random drink"
|
||||
@@ -969,3 +989,44 @@
|
||||
/obj/item/reagent_containers/food/drinks/glass2/coffeemug/green/dark,
|
||||
/obj/item/reagent_containers/food/drinks/glass2/coffeemug/rainbow,
|
||||
/obj/item/reagent_containers/food/drinks/glass2/coffeemug/metal)
|
||||
|
||||
/obj/random/helmet
|
||||
name = "Random Armour Helmet"
|
||||
desc = "This is a random helmet that protects your head."
|
||||
|
||||
/obj/random/helmet/item_to_spawn()
|
||||
return pick(prob(5);/obj/item/clothing/head/helmet/space/void/boarding_ops/mk2,
|
||||
prob(5);/obj/item/clothing/head/helmet/space/void/boarding_ops,
|
||||
prob(20);/obj/item/clothing/head/helmet/riot/sifcop,
|
||||
prob(20);/obj/item/clothing/head/helmet,
|
||||
prob(10);/obj/item/clothing/head/helmet/bulletproof,
|
||||
prob(10);/obj/item/clothing/head/helmet/flexitac,
|
||||
prob(15);/obj/item/clothing/head/helmet/solgov,
|
||||
prob(15);/obj/item/clothing/head/helmet/pcrc,
|
||||
prob(10);/obj/item/clothing/head/helmet/space/void/scg,
|
||||
prob(10);/obj/item/clothing/head/helmet/tac,
|
||||
prob(10);/obj/item/clothing/head/helmet/merc,
|
||||
prob(15);/obj/item/clothing/head/helmet/riot,
|
||||
prob(10);/obj/item/clothing/head/helmet/space/void/grayson,
|
||||
prob(10);/obj/item/clothing/head/helmet/space/void/hedberg,
|
||||
prob(10);/obj/item/clothing/head/helmet/heavy,
|
||||
prob(10);/obj/item/clothing/head/helmet/heavy/knight,
|
||||
prob(5);/obj/item/clothing/head/helmet/newkyoto,
|
||||
prob(5);/obj/item/clothing/head/helmet/space/void/scg/heavy
|
||||
)
|
||||
|
||||
/obj/random/helmet/highend
|
||||
desc = "This is a random actually good helmet that protects your head."
|
||||
|
||||
/obj/random/helmet/highend/item_to_spawn()
|
||||
return pick(
|
||||
prob(10);/obj/item/clothing/head/helmet/bulletproof,
|
||||
prob(10);/obj/item/clothing/head/helmet/space/void/scg,
|
||||
prob(10);/obj/item/clothing/head/helmet/merc,
|
||||
prob(10);/obj/item/clothing/head/helmet/space/void/grayson,
|
||||
prob(10);/obj/item/clothing/head/helmet/space/void/hedberg,
|
||||
prob(10);/obj/item/clothing/head/helmet/heavy,
|
||||
prob(10);/obj/item/clothing/head/helmet/heavy/knight,
|
||||
prob(5);/obj/item/clothing/head/helmet/newkyoto,
|
||||
prob(5);/obj/item/clothing/head/helmet/space/void/scg/heavy
|
||||
)
|
||||
|
||||
@@ -92,6 +92,26 @@
|
||||
prob(5);list(
|
||||
/obj/item/clothing/suit/space/void/pilot,
|
||||
/obj/item/clothing/head/helmet/space/void/pilot
|
||||
),
|
||||
prob(2);list(
|
||||
/obj/item/clothing/suit/space/void/boarding_ops,
|
||||
/obj/item/clothing/head/helmet/space/void/boarding_ops
|
||||
),
|
||||
prob(2);list(
|
||||
/obj/item/clothing/suit/space/void/boarding_ops,
|
||||
/obj/item/clothing/head/helmet/space/void/boarding_ops/mk2
|
||||
),
|
||||
prob(2);list(
|
||||
/obj/item/clothing/suit/space/void/scg,
|
||||
/obj/item/clothing/head/helmet/space/void/scg
|
||||
),
|
||||
prob(2);list(
|
||||
/obj/item/clothing/suit/space/void/scg,
|
||||
/obj/item/clothing/head/helmet/space/void/scg/heavy
|
||||
),
|
||||
prob(1);list(
|
||||
/obj/item/clothing/suit/space/void/pearlshield,
|
||||
/obj/item/clothing/head/helmet/space/void/pearlshield
|
||||
)
|
||||
)
|
||||
|
||||
@@ -110,6 +130,10 @@
|
||||
prob(1);list(
|
||||
/obj/item/clothing/suit/space/void/mining/alt,
|
||||
/obj/item/clothing/head/helmet/space/void/mining/alt
|
||||
),
|
||||
prob(1);list(
|
||||
/obj/item/clothing/suit/space/void/mining/alt,
|
||||
/obj/item/clothing/head/helmet/space/void/grayson
|
||||
)
|
||||
)
|
||||
|
||||
@@ -257,4 +281,4 @@
|
||||
prob(5);/obj/item/rig/eva,
|
||||
prob(4);/obj/item/rig/light/stealth,
|
||||
prob(3);/obj/item/rig/hazard,
|
||||
prob(1);/obj/item/rig/merc/empty)
|
||||
prob(1);/obj/item/rig/merc/empty)
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "extinguisher cabinet"
|
||||
desc = "A small wall mounted cabinet designed to hold a fire extinguisher."
|
||||
icon = 'icons/obj/closet.dmi'
|
||||
icon_state = "extinguisher_closed"
|
||||
icon_state = "fire_cabinet"
|
||||
layer = ABOVE_WINDOW_LAYER
|
||||
anchored = 1
|
||||
density = 0
|
||||
@@ -14,9 +14,9 @@
|
||||
if(building)
|
||||
pixel_x = (dir & 3)? 0 : (dir == 4 ? -27 : 27)
|
||||
pixel_y = (dir & 3)? (dir ==1 ? -27 : 27) : 0
|
||||
update_icon()
|
||||
else
|
||||
has_extinguisher = new/obj/item/extinguisher(src)
|
||||
update_icon()
|
||||
|
||||
/obj/structure/extinguisher_cabinet/attackby(obj/item/O, mob/user)
|
||||
if(isrobot(user))
|
||||
@@ -74,13 +74,13 @@
|
||||
update_icon()
|
||||
|
||||
/obj/structure/extinguisher_cabinet/update_icon()
|
||||
if(!opened)
|
||||
icon_state = "extinguisher_closed"
|
||||
return
|
||||
cut_overlays()
|
||||
if(has_extinguisher)
|
||||
if(istype(has_extinguisher, /obj/item/extinguisher/mini))
|
||||
icon_state = "extinguisher_mini"
|
||||
add_overlay("extinguisher_mini")
|
||||
else
|
||||
icon_state = "extinguisher_full"
|
||||
add_overlay("extinguisher_full")
|
||||
if(opened)
|
||||
add_overlay("fire_cabinet_door_open")
|
||||
else
|
||||
icon_state = "extinguisher_empty"
|
||||
add_overlay("fire_cabinet_door_closed")
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
//I still dont think this should be a closet but whatever
|
||||
/obj/structure/fireaxecabinet
|
||||
name = "fire axe cabinet"
|
||||
desc = "There is small label that reads \"For Emergency use only\" along with details for safe use of the axe. As if."
|
||||
var/obj/item/material/twohanded/fireaxe/fireaxe
|
||||
icon = 'icons/obj/closet.dmi' //Not bothering to move icons out for now. But its dumb still.
|
||||
icon_state = "fireaxe1000"
|
||||
icon = 'icons/obj/axecabinet.dmi'
|
||||
icon_state = "fireaxe"
|
||||
layer = ABOVE_WINDOW_LAYER
|
||||
anchored = 1
|
||||
density = 0
|
||||
@@ -16,6 +15,7 @@
|
||||
/obj/structure/fireaxecabinet/Initialize()
|
||||
. = ..()
|
||||
fireaxe = new /obj/item/material/twohanded/fireaxe()
|
||||
update_icon()
|
||||
|
||||
/obj/structure/fireaxecabinet/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri
|
||||
//..() //That's very useful, Erro
|
||||
@@ -179,8 +179,19 @@
|
||||
to_chat(user, "<span class='notice'>Cabinet unlocked.</span>")
|
||||
return
|
||||
|
||||
/obj/structure/fireaxecabinet/update_icon() //Template: fireaxe[has fireaxe][is opened][hits taken][is smashed]. If you want the opening or closing animations, add "opening" or "closing" right after the numbers
|
||||
var/hasaxe = 0
|
||||
/obj/structure/fireaxecabinet/update_icon()
|
||||
cut_overlays()
|
||||
if(fireaxe)
|
||||
hasaxe = 1
|
||||
icon_state = text("fireaxe[][][][]",hasaxe,open,hitstaken,smashed)
|
||||
add_overlay("axe")
|
||||
if(smashed)
|
||||
add_overlay("glass_broken")
|
||||
if(locked)
|
||||
add_overlay("locked")
|
||||
else
|
||||
add_overlay("unlocked")
|
||||
if(open)
|
||||
add_overlay("glass_raised")
|
||||
else
|
||||
add_overlay("glass")
|
||||
if(hitstaken)
|
||||
add_overlay("crack[hitstaken]")
|
||||
|
||||
@@ -7,34 +7,25 @@
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
|
||||
/obj/structure/sign/ex_act(severity)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
qdel(src)
|
||||
return
|
||||
if(2.0)
|
||||
qdel(src)
|
||||
return
|
||||
if(3.0)
|
||||
qdel(src)
|
||||
return
|
||||
else
|
||||
return
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/sign/attackby(obj/item/tool as obj, mob/user as mob) //deconstruction
|
||||
/obj/structure/sign/attackby(obj/item/tool, mob/user) //deconstruction
|
||||
if(tool.is_screwdriver() && !istype(src, /obj/structure/sign/scenery) && !istype(src, /obj/structure/sign/double))
|
||||
playsound(src, tool.usesound, 50, 1)
|
||||
to_chat(user, "You unfasten the sign with your [tool].")
|
||||
var/obj/item/sign/S = new(src.loc)
|
||||
S.name = name
|
||||
S.desc = desc
|
||||
S.icon_state = icon_state
|
||||
//var/icon/I = icon('icons/obj/decals.dmi', icon_state)
|
||||
//S.icon = I.Scale(24, 24)
|
||||
S.sign_state = icon_state
|
||||
S.original_type = type
|
||||
qdel(src)
|
||||
unfasten(user)
|
||||
else ..()
|
||||
|
||||
/obj/structure/sign/proc/unfasten(mob/user)
|
||||
user.visible_message(SPAN_NOTICE("\The [user] unfastens \the [src]."), SPAN_NOTICE("You unfasten \the [src]."))
|
||||
var/obj/item/sign/S = new(src.loc)
|
||||
S.name = name
|
||||
S.desc = desc
|
||||
S.icon_state = icon_state
|
||||
S.sign_state = icon_state
|
||||
S.original_type = type
|
||||
qdel(src)
|
||||
|
||||
|
||||
/obj/item/sign
|
||||
name = "sign"
|
||||
desc = ""
|
||||
@@ -1148,4 +1139,443 @@
|
||||
/obj/structure/sign/chemdiamond
|
||||
name = "\improper HAZARDOUS CHEMICALS sign"
|
||||
desc = "A sign that warns of potentially hazardous chemicals nearby, indicating health risk, flash point, and reactivity."
|
||||
icon_state = "chemdiamond"
|
||||
icon_state = "chemdiamond"
|
||||
|
||||
//Here be Flags
|
||||
|
||||
//Flag item
|
||||
/obj/item/flag
|
||||
name = "boxed flag"
|
||||
desc = "A flag neatly folded into a wooden container."
|
||||
icon = 'icons/obj/flags.dmi'
|
||||
icon_state = "flag_boxed"
|
||||
var/flag_path = "flag"
|
||||
var/flag_size = 0
|
||||
|
||||
//Flag on wall
|
||||
/obj/structure/sign/flag
|
||||
name = "blank flag"
|
||||
desc = "Nothing to see here."
|
||||
icon = 'icons/obj/flags.dmi'
|
||||
icon_state = "flag"
|
||||
var/icon/ripped_outline = icon('icons/obj/flags.dmi', "ripped")
|
||||
var/obj/structure/sign/flag/linked_flag //For double flags
|
||||
var/obj/item/flag/flagtype //For returning your flag
|
||||
var/ripped = FALSE //If we've been torn down
|
||||
|
||||
/obj/structure/sign/flag/blank
|
||||
name = "blank banner"
|
||||
desc = "A blank white flag."
|
||||
icon_state = "flag"
|
||||
flagtype = /obj/item/flag
|
||||
|
||||
/obj/item/flag/afterattack(var/atom/A, var/mob/user, var/adjacent, var/clickparams)
|
||||
if (!adjacent)
|
||||
return
|
||||
|
||||
if((!iswall(A) && !istype(A, /obj/structure/window)) || !isturf(user.loc))
|
||||
to_chat(user, SPAN_WARNING("You can't place this here!"))
|
||||
return
|
||||
|
||||
var/placement_dir = get_dir(user, A)
|
||||
if (!(placement_dir in cardinal))
|
||||
to_chat(user, SPAN_WARNING("You must stand directly in front of the location you wish to place that on."))
|
||||
return
|
||||
|
||||
var/obj/structure/sign/flag/P = new(user.loc)
|
||||
|
||||
switch(placement_dir)
|
||||
if(NORTH)
|
||||
P.pixel_y = 32
|
||||
if(SOUTH)
|
||||
P.pixel_y = -32
|
||||
if(EAST)
|
||||
P.pixel_x = 32
|
||||
if(WEST)
|
||||
P.pixel_x = -32
|
||||
|
||||
P.dir = placement_dir
|
||||
if(flag_size)
|
||||
P.icon_state = "[flag_path]_l"
|
||||
var/obj/structure/sign/flag/P2 = new(user.loc)
|
||||
P.linked_flag = P2
|
||||
P2.linked_flag = P
|
||||
P2.icon_state = "[flag_path]_r"
|
||||
P2.dir = P.dir
|
||||
switch(P2.dir)
|
||||
if(NORTH)
|
||||
P2.pixel_y = P.pixel_y
|
||||
P2.pixel_x = 32
|
||||
if(SOUTH)
|
||||
P2.pixel_y = P.pixel_y
|
||||
P2.pixel_x = 32
|
||||
if(EAST)
|
||||
P2.pixel_x = P.pixel_x
|
||||
P2.pixel_y = -32
|
||||
if(WEST)
|
||||
P2.pixel_x = P.pixel_x
|
||||
P2.pixel_y = 32
|
||||
P2.name = name
|
||||
P2.desc = desc
|
||||
P2.description_info = description_info
|
||||
P2.description_fluff = description_fluff
|
||||
P2.flagtype = type
|
||||
else
|
||||
P.icon_state = "[flag_path]"
|
||||
P.name = name
|
||||
P.desc = desc
|
||||
P.description_info = description_info
|
||||
P.description_fluff = description_fluff
|
||||
P.flagtype = type
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/sign/flag/Destroy()
|
||||
if(linked_flag?.linked_flag == src) //Catches other instances where one half might be destroyed, say by a broken wall, to avoid runtimes.
|
||||
linked_flag.linked_flag = null //linked_flag
|
||||
. = ..()
|
||||
|
||||
/obj/structure/sign/flag/ex_act(severity)
|
||||
switch(severity)
|
||||
if(1)
|
||||
qdel(src)
|
||||
if(2)
|
||||
if(prob(50))
|
||||
qdel(src)
|
||||
else
|
||||
rip()
|
||||
if(3)
|
||||
rip()
|
||||
|
||||
/obj/structure/sign/flag/unfasten(mob/user)
|
||||
if(!ripped)
|
||||
user.visible_message(SPAN_NOTICE("\The [user] unfastens \the [src] and folds it back up."), SPAN_NOTICE("You unfasten \the [src] and fold it back up."))
|
||||
var/obj/item/flag/F = new flagtype(get_turf(user))
|
||||
user.put_in_hands(F)
|
||||
else
|
||||
user.visible_message(SPAN_NOTICE("\The [user] unfastens the tattered remnants of \the [src]."), SPAN_NOTICE("You unfasten the tattered remains of \the [src]."))
|
||||
if(linked_flag)
|
||||
qdel(linked_flag) //otherwise you're going to get weird duping nonsense
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/sign/flag/attack_hand(mob/user)
|
||||
if(alert("Do you want to rip \the [src] from its place?","You think...","Yes","No") == "Yes")
|
||||
if(!Adjacent(user)) //Cannot bring up dialogue and walk away
|
||||
return FALSE
|
||||
visible_message(SPAN_WARNING("\The [user] rips \the [src] in a single, decisive motion!" ))
|
||||
playsound(src.loc, 'sound/items/poster_ripped.ogg', 100, 1)
|
||||
add_fingerprint(user)
|
||||
rip()
|
||||
|
||||
/obj/structure/sign/flag/proc/rip(var/rip_linked = TRUE)
|
||||
var/icon/I = new('icons/obj/flags.dmi', icon_state)
|
||||
var/icon/mask = new('icons/obj/flags.dmi', "ripped")
|
||||
I.AddAlphaMask(mask)
|
||||
icon = I
|
||||
name = "ripped flag"
|
||||
desc = "You can't make out anything from the flag's original print. It's ruined."
|
||||
ripped = TRUE
|
||||
if(linked_flag && rip_linked)
|
||||
linked_flag.rip(FALSE) //Prevents an infinite ripping loop
|
||||
|
||||
/obj/structure/sign/flag/attackby(obj/item/W, mob/user)
|
||||
..()
|
||||
if(istype(W, /obj/item/flame/lighter) || istype(W, /obj/item/weldingtool))
|
||||
visible_message(SPAN_WARNING("\The [user] starts to burn \the [src] down!"))
|
||||
if(!do_after(user, 2 SECONDS))
|
||||
return FALSE
|
||||
visible_message(SPAN_WARNING("\The [user] burns \the [src] down!"))
|
||||
playsound(src.loc, 'sound/items/cigs_lighters/cig_light.ogg', 100, 1)
|
||||
new /obj/effect/decal/cleanable/ash(src.loc)
|
||||
if(linked_flag)
|
||||
qdel(linked_flag)
|
||||
qdel(src)
|
||||
return TRUE
|
||||
|
||||
/obj/structure/sign/flag/blank/left
|
||||
icon_state = "flag_l"
|
||||
|
||||
/obj/structure/sign/flag/blank/right
|
||||
icon_state = "flag_r"
|
||||
|
||||
//SolGov
|
||||
/obj/structure/sign/flag/sol
|
||||
name = "Solar Confederate Government flag"
|
||||
desc = "The bright blue flag of the Solar Confederate Government."
|
||||
icon_state = "solgov"
|
||||
flagtype = /obj/item/flag/sol
|
||||
|
||||
/obj/structure/sign/flag/sol/left
|
||||
icon_state = "solgov_l"
|
||||
|
||||
/obj/structure/sign/flag/sol/right
|
||||
icon_state = "solgov_r"
|
||||
|
||||
/obj/item/flag/sol
|
||||
name = "Solar Confederate Government flag"
|
||||
desc = "The bright blue flag of the Solar Confederate Government."
|
||||
flag_path = "solgov"
|
||||
|
||||
/obj/item/flag/sol/l
|
||||
name = "large Solar Confederate Government flag"
|
||||
flag_size = 1
|
||||
|
||||
//NanoTrasen
|
||||
/obj/structure/sign/flag/nt
|
||||
name = "NanoTrasen corporate flag"
|
||||
desc = "A flag portraying the logo of the NanoTrasen corporation."
|
||||
icon_state = "nanotrasen"
|
||||
flagtype = /obj/item/flag/nt
|
||||
|
||||
/obj/structure/sign/flag/nt/left
|
||||
icon_state = "nanotrasen_l"
|
||||
|
||||
/obj/structure/sign/flag/nt/right
|
||||
icon_state = "nanotrasen_r"
|
||||
|
||||
/obj/item/flag/nt
|
||||
name = "NanoTrasen corporate flag"
|
||||
desc = "A flag portraying the logo of the NanoTrasen corporation."
|
||||
flag_path = "nanotrasen"
|
||||
|
||||
/obj/item/flag/nt/l
|
||||
name = "large NanoTrasen corporate flag"
|
||||
flag_size = 1
|
||||
|
||||
//Vir
|
||||
/obj/structure/sign/flag/vir
|
||||
name = "Vir Governmental Authority flag"
|
||||
desc = "The two-tone flag of the Vir Governmental Authority."
|
||||
description_fluff = "Commonly referred to as VirGov, the Vir Governmental Authority was formed in 2412 as a unified system government following \
|
||||
a half century of war between the Sif Planetary Government - or SifGov - and corporate interests in Kara orbit, in order to qualify for full membership \
|
||||
in the Solar Confederate Government. Following the Karan Wars it would be almost a century before Trans-Stellar Corporations were allowed their typical \
|
||||
freedom to operate unobstructed in the Vir system."
|
||||
icon_state = "vir"
|
||||
flagtype = /obj/item/flag/vir
|
||||
|
||||
/obj/structure/sign/flag/vir/left
|
||||
icon_state = "vir_l"
|
||||
|
||||
/obj/structure/sign/flag/vir/right
|
||||
icon_state = "vir_r"
|
||||
|
||||
/obj/item/flag/vir
|
||||
name = "Vir Governmental Authority flag"
|
||||
desc = "The two-tone flag of the Vir Governmental Authority."
|
||||
description_fluff = "Commonly referred to as VirGov, the Vir Governmental Authority was formed in 2412 as a unified system government following \
|
||||
a half century of war between the Sif Planetary Government - or SifGov - and corporate interests in Kara orbit, in order to qualify for full membership \
|
||||
in the Solar Confederate Government. Following the Karan Wars it would be almost a century before Trans-Stellar Corporations were allowed their typical \
|
||||
freedom to operate unobstructed in the Vir system."
|
||||
flag_path = "vir"
|
||||
|
||||
/obj/item/flag/vir/l
|
||||
name = "large Vir Governmental Authority flag"
|
||||
flag_size = 1
|
||||
|
||||
//Almach Association
|
||||
|
||||
/obj/structure/sign/flag/almach_a
|
||||
name = "Almach Association flag"
|
||||
desc = "The black and grey flag of the now-defunct Almach Association."
|
||||
description_fluff = "The Almach Association was a short lived (February 2562 - April 2564) governmental entity formed as an alliance of disparate radical mercurial \
|
||||
states in an effort to secede from the Solar Confederate Government. Though the Association were defeated, and ultimately annexed by the Skrellian Far Kingdoms, \
|
||||
the Association flag remains a popular symbol with mercurials and secessionists alike. To some, the Almach Association is seen as the first step towards the SCG's \
|
||||
\"inevitable\" dissolution."
|
||||
icon_state = "almach_a"
|
||||
flagtype = /obj/item/flag/almach_a
|
||||
|
||||
/obj/structure/sign/flag/almach_a/left
|
||||
icon_state = "almach_a_l"
|
||||
|
||||
/obj/structure/sign/flag/almach_a/right
|
||||
icon_state = "almach_a_r"
|
||||
|
||||
/obj/item/flag/almach_a
|
||||
name = "Almach Association flag"
|
||||
desc = "The black and grey flag of the now-defunct Almach Association."
|
||||
description_fluff = "The Almach Association was a short lived (February 2562 - April 2564) governmental entity formed as an alliance of disparate radical mercurial \
|
||||
states in an effort to secede from the Solar Confederate Government. Though the Association were defeated, and ultimately annexed by the Skrellian Far Kingdoms, \
|
||||
the Association flag remains a popular symbol with mercurials and secessionists alike. To some, the Almach Association is seen as the first step towards the SCG's \
|
||||
\"inevitable\" dissolution."
|
||||
flag_path = "almach_a"
|
||||
|
||||
/obj/item/flag/almach_a/l
|
||||
name = "large Almach Association flag"
|
||||
flag_size = 1
|
||||
|
||||
//Almach Protectorate
|
||||
/obj/structure/sign/flag/almach_p
|
||||
name = "Almach Protectorate flag"
|
||||
desc = "The purple flag of the Almach Protectorate."
|
||||
description_fluff = "The Almach Protectorate was formed from the territory of the Almach Association as a condition of the 2564 Treaty of Whythe. \
|
||||
Intended to be closely overseen by the Skrellian Far Kingdom, the Skathari Incursion left the Protectorate functionally independent in many regards, \
|
||||
leading to the proliferation of previously restricted genetic modification technology into SolGov territory. However, the Protectorate was also left \
|
||||
without meaningful military support, and has suffered sorely in the years since as the Relan-led government has struggled to remilitarize."
|
||||
icon_state = "almach_p"
|
||||
flagtype = /obj/item/flag/almach_p
|
||||
|
||||
/obj/structure/sign/flag/almach_p/left
|
||||
icon_state = "almach_p_l"
|
||||
|
||||
/obj/structure/sign/flag/almach_p/right
|
||||
icon_state = "almach_p_r"
|
||||
|
||||
/obj/item/flag/almach_p
|
||||
name = "Almach Protectorate flag"
|
||||
desc = "The purple flag of the Almach Protectorate."
|
||||
description_fluff = "The Almach Protectorate was formed from the territory of the Almach Association as a condition of the 2564 Treaty of Whythe. \
|
||||
Intended to be closely overseen by the Skrellian Far Kingdom, the Skathari Incursion left the Protectorate functionally independent in many regards, \
|
||||
leading to the proliferation of previously restricted genetic modification technology into SolGov territory. However, the Protectorate was also left \
|
||||
without meaningful military support, and has suffered sorely in the years since as the Relan-led government has struggled to remilitarize."
|
||||
flag_path = "almach_p"
|
||||
|
||||
/obj/item/flag/almach_p/l
|
||||
name = "large Almach Protectorate flag"
|
||||
flag_size = 1
|
||||
|
||||
//Vystholm
|
||||
/obj/structure/sign/flag/vystholm
|
||||
name = "Vystholm flag"
|
||||
desc = "The black and gold flag of Vystholm."
|
||||
description_fluff = "Vystholm is a faction of xenophobic humans who constructed an ark ship, the VHS Rodnakya, in response to the abolition of the hostile \
|
||||
First Contact Policy in the early 24th century. Thought to have long departed known space, the Vystholm returned to within range of human territory in response \
|
||||
to the Skathari Incursion and has since undertaken a campaign of raiding, terrorism and espionage against established governments, particularly the Tajaran \
|
||||
Pearlshield Coalition."
|
||||
icon_state = "vystholm"
|
||||
flagtype = /obj/item/flag/vystholm
|
||||
|
||||
/obj/structure/sign/flag/vystholm/left
|
||||
icon_state = "vystholm_l"
|
||||
|
||||
/obj/structure/sign/flag/vystholm/right
|
||||
icon_state = "vystholm_r"
|
||||
|
||||
/obj/item/flag/vystholm
|
||||
name = "Vystholm flag"
|
||||
desc = "The black and gold flag of Vystholm."
|
||||
description_fluff = "Vystholm is a faction of xenophobic humans who constructed an ark ship, the VHS Rodnakya, in response to the abolition of the hostile \
|
||||
First Contact Policy in the early 24th century. Thought to have long departed known space, the Vystholm returned to within range of human territory in response \
|
||||
to the Skathari Incursion and has since undertaken a campaign of raiding, terrorism and espionage against established governments, particularly the Tajaran \
|
||||
Pearlshield Coalition."
|
||||
flag_path = "vystholm"
|
||||
|
||||
/obj/item/flag/vystholm/l
|
||||
name = "large Vystholm flag"
|
||||
flag_size = 1
|
||||
|
||||
//Five Arrows
|
||||
/obj/structure/sign/flag/fivearrows
|
||||
name = "Five Arrows flag"
|
||||
desc = "The red flag of the Five Arrows."
|
||||
description_fluff = "The Five Arrows is an independent government entity that seceded from the Solar Confederate Government in 2570, in response to percieved \
|
||||
failures in aiding the Sagittarius Heights during the Skathari Incursion. The success of the government in achieving effective local defense and prosperity has \
|
||||
since attracted the membership of Kauq'xum, a remote Skrellian colony. \The Five Arrows formed the model for SolGov's own semi-autonomous \"Regional Blocs\"."
|
||||
icon_state = "fivearrows"
|
||||
flagtype = /obj/item/flag/fivearrows
|
||||
|
||||
/obj/structure/sign/flag/fivearrows/left
|
||||
icon_state = "fivearrows_l"
|
||||
|
||||
/obj/structure/sign/flag/fivearrows/right
|
||||
icon_state = "fivearrows_r"
|
||||
|
||||
/obj/item/flag/fivearrows
|
||||
name = "Five Arrows flag"
|
||||
desc = "The red flag of the Five Arrows."
|
||||
description_fluff = "The Five Arrows is an independent government entity that seceded from the Solar Confederate Government in 2570, in response to percieved \
|
||||
failures in aiding the Sagittarius Heights during the Skathari Incursion. The success of the government in achieving effective local defense and prosperity has \
|
||||
since attracted the membership of Kauq'xum, a remote Skrellian colony. \The Five Arrows formed the model for SolGov's own semi-autonomous \"Regional Blocs\"."
|
||||
flag_path = "fivearrows"
|
||||
|
||||
/obj/item/flag/fivearrows/l
|
||||
name = "large Five Arrows flag"
|
||||
flag_size = 1
|
||||
|
||||
//Pirates
|
||||
/obj/structure/sign/flag/pirate
|
||||
name = "pirate flag"
|
||||
desc = "Shiver me timbers, hoist the black!"
|
||||
icon_state = "pirate"
|
||||
flagtype = /obj/item/flag/pirate
|
||||
|
||||
/obj/structure/sign/flag/pirate/left
|
||||
icon_state = "pirate_l"
|
||||
|
||||
/obj/structure/sign/flag/pirate/right
|
||||
icon_state = "pirate_r"
|
||||
|
||||
/obj/item/flag/pirate
|
||||
name = "pirate flag"
|
||||
desc = "Shiver me timbers, hoist the black!"
|
||||
flag_path = "pirate"
|
||||
|
||||
|
||||
/obj/item/flag/pirate/l
|
||||
name = "large pirate flag"
|
||||
flag_size = 1
|
||||
|
||||
//Catpirate
|
||||
/obj/structure/sign/flag/catpirate
|
||||
name = "Tajaran pirate flag"
|
||||
desc = "Shiver me whiskers, hoist the black!"
|
||||
icon_state = "catpirate"
|
||||
flagtype = /obj/item/flag/catpirate
|
||||
|
||||
/obj/structure/sign/flag/catpirate/left
|
||||
icon_state = "catpirate_l"
|
||||
|
||||
/obj/structure/sign/flag/catpirate/right
|
||||
icon_state = "catpirate_r"
|
||||
|
||||
/obj/item/flag/catpirate
|
||||
name = "Tajaran pirate flag"
|
||||
desc = "Shiver me whiskers, hoist the black!"
|
||||
flag_path = "catpirate"
|
||||
|
||||
/obj/item/flag/catpirate/l
|
||||
name = "large Tajaran pirate flag"
|
||||
flag_size = 1
|
||||
|
||||
//Political Parties
|
||||
/obj/structure/sign/flag/icarus
|
||||
name = "Icarus Front flag"
|
||||
desc = "The flag of the right-populist Icarus Front political party."
|
||||
icon_state = "icarus"
|
||||
flagtype = /obj/item/flag/icarus
|
||||
|
||||
/obj/item/flag/icarus
|
||||
name = "Icarus Front flag"
|
||||
desc = "The flag of the right-populist Icarus Front political party."
|
||||
flag_path = "icarus"
|
||||
|
||||
/obj/structure/sign/flag/shadowcoalition
|
||||
name = "Shadow Coalition flag"
|
||||
desc = "The flag of the neoliberal Shadow Coalition political party."
|
||||
icon_state = "shadowcoalition"
|
||||
flagtype = /obj/item/flag/shadowcoalition
|
||||
|
||||
/obj/item/flag/shadowcoalition
|
||||
name = "Shadow Coalition flag"
|
||||
desc = "The flag of the neoliberal Shadow Coalition political party."
|
||||
flag_path = "shadowcoalition"
|
||||
|
||||
/obj/structure/sign/flag/seo
|
||||
name = "Sol Economic Organization flag"
|
||||
desc = "The flag of the protectionist Sol Economic Organization political party."
|
||||
icon_state = "seo"
|
||||
flagtype = /obj/item/flag/seo
|
||||
|
||||
/obj/item/flag/seo
|
||||
name = "Sol Economic Organization flag"
|
||||
desc = "The flag of the protectionist Sol Economic Organization political party."
|
||||
flag_path = "seo"
|
||||
|
||||
/obj/structure/sign/flag/gap
|
||||
name = "Galactic Autonomy Party flag"
|
||||
desc = "The flag of the libertarian Galactic Autonomy Party political party."
|
||||
icon_state = "gap"
|
||||
flagtype = /obj/item/flag/seo
|
||||
|
||||
/obj/item/flag/gap
|
||||
name = "Galactic Autonomy Party flag"
|
||||
desc = "The flag of the libertarian Galactic Autonomy Party political party."
|
||||
flag_path = "gap"
|
||||
|
||||
@@ -154,7 +154,7 @@
|
||||
|
||||
/obj/machinery/shower
|
||||
name = "shower"
|
||||
desc = "The HS-451. Installed in the 2550s by the Hygiene Division."
|
||||
desc = "The HS-451. Graciously provided by the Hygiene Division."
|
||||
icon = 'icons/obj/watercloset.dmi'
|
||||
icon_state = "shower"
|
||||
density = 0
|
||||
@@ -214,7 +214,7 @@
|
||||
add_fingerprint(user)
|
||||
|
||||
/obj/machinery/shower/update_icon() //this is terribly unreadable, but basically it makes the shower mist up
|
||||
cut_overlay() //once it's been on for a while, in addition to handling the water overlay.
|
||||
cut_overlays() //once it's been on for a while, in addition to handling the water overlay.
|
||||
if(mymist)
|
||||
qdel(mymist)
|
||||
mymist = null
|
||||
|
||||
@@ -1238,3 +1238,90 @@ var/global/list/floor_decals = list()
|
||||
name = "floor arrows"
|
||||
icon_state = "arrows"
|
||||
|
||||
/obj/effect/floor_decal/emblem/nt1
|
||||
icon_state = "nt1"
|
||||
/obj/effect/floor_decal/emblem/nt2
|
||||
icon_state = "nt2"
|
||||
/obj/effect/floor_decal/emblem/nt3
|
||||
icon_state = "nt3"
|
||||
|
||||
/obj/effect/floor_decal/milspec/stripe
|
||||
icon_state = "ms_plating_striped"
|
||||
/obj/effect/floor_decal/milspec/hatchmarks
|
||||
icon_state = "ms_test_floor4"
|
||||
/obj/effect/floor_decal/milspec/box
|
||||
icon_state = "ms_test_floor5"
|
||||
/obj/effect/floor_decal/milspec/cargo
|
||||
icon_state = "ms_cargo"
|
||||
/obj/effect/floor_decal/milspec/cargo_arrow
|
||||
icon_state = "ms_cargo_arrow"
|
||||
/obj/effect/floor_decal/milspec/monotile
|
||||
icon_state = "ms_mono"
|
||||
|
||||
/obj/effect/floor_decal/milspec/color/blue
|
||||
icon_state = "ms_bluefull"
|
||||
/obj/effect/floor_decal/milspec/color/blue/corner
|
||||
icon_state = "ms_bluecorner"
|
||||
/obj/effect/floor_decal/milspec/color/blue/half
|
||||
icon_state = "ms_blue"
|
||||
/obj/effect/floor_decal/milspec/color/red
|
||||
icon_state = "ms_redfull"
|
||||
/obj/effect/floor_decal/milspec/color/red/corner
|
||||
icon_state = "ms_redcorner"
|
||||
/obj/effect/floor_decal/milspec/color/red/half
|
||||
icon_state = "ms_red"
|
||||
/obj/effect/floor_decal/milspec/color/purple
|
||||
icon_state = "ms_purplefull"
|
||||
/obj/effect/floor_decal/milspec/color/purple/corner
|
||||
icon_state = "ms_purplecorner"
|
||||
/obj/effect/floor_decal/milspec/color/purple/half
|
||||
icon_state = "ms_purple"
|
||||
/obj/effect/floor_decal/milspec/color/emerald
|
||||
icon_state = "ms_emeraldfull"
|
||||
/obj/effect/floor_decal/milspec/color/emerald/corner
|
||||
icon_state = "ms_emeraldcorner"
|
||||
/obj/effect/floor_decal/milspec/color/emerald/half
|
||||
icon_state = "ms_emerald"
|
||||
/obj/effect/floor_decal/milspec/color/orange
|
||||
icon_state = "ms_orangefull"
|
||||
/obj/effect/floor_decal/milspec/color/orange/corner
|
||||
icon_state = "ms_orangecorner"
|
||||
/obj/effect/floor_decal/milspec/color/orange/half
|
||||
icon_state = "ms_orange"
|
||||
/obj/effect/floor_decal/milspec/color/green
|
||||
icon_state = "ms_greenfull"
|
||||
/obj/effect/floor_decal/milspec/color/green/corner
|
||||
icon_state = "ms_greencorner"
|
||||
/obj/effect/floor_decal/milspec/color/green/half
|
||||
icon_state = "ms_green"
|
||||
/obj/effect/floor_decal/milspec/color/black
|
||||
icon_state = "ms_blackfull"
|
||||
/obj/effect/floor_decal/milspec/color/black/corner
|
||||
icon_state = "ms_blackcorner"
|
||||
/obj/effect/floor_decal/milspec/color/black/half
|
||||
icon_state = "ms_black"
|
||||
/obj/effect/floor_decal/milspec/color/silver
|
||||
icon_state = "ms_silverfull"
|
||||
/obj/effect/floor_decal/milspec/color/silver/corner
|
||||
icon_state = "ms_silvercorner"
|
||||
/obj/effect/floor_decal/milspec/color/silver/half
|
||||
icon_state = "ms_silver"
|
||||
/obj/effect/floor_decal/milspec/color/white
|
||||
icon_state = "ms_whitefull"
|
||||
/obj/effect/floor_decal/milspec/color/white/corner
|
||||
icon_state = "ms_whitecorner"
|
||||
/obj/effect/floor_decal/milspec/color/white/half
|
||||
icon_state = "ms_white"
|
||||
|
||||
/obj/effect/floor_decal/milspec_sterile/purple
|
||||
icon_state = "mss_purple"
|
||||
/obj/effect/floor_decal/milspec_sterile/purple/corner
|
||||
icon_state = "mss_purple_corner"
|
||||
/obj/effect/floor_decal/milspec_sterile/purple/half
|
||||
icon_state = "mss_purple_side"
|
||||
/obj/effect/floor_decal/milspec_sterile/green
|
||||
icon_state = "mss_green"
|
||||
/obj/effect/floor_decal/milspec_sterile/green/corner
|
||||
icon_state = "mss_green_corner"
|
||||
/obj/effect/floor_decal/milspec_sterile/green/half
|
||||
icon_state = "mss_green_side"
|
||||
|
||||
@@ -476,3 +476,62 @@
|
||||
icon = 'icons/turf/concrete.dmi'
|
||||
icon_state = "concrete"
|
||||
initial_flooring = /decl/flooring/concrete
|
||||
|
||||
/decl/flooring/tiling/milspec
|
||||
name = "riveted floor"
|
||||
icon = 'icons/turf/flooring/tiles.dmi'
|
||||
icon_base = "milspec"
|
||||
has_damage_range = 2
|
||||
damage_temperature = T0C+1400
|
||||
flags = TURF_REMOVE_CROWBAR | TURF_CAN_BREAK | TURF_CAN_BURN
|
||||
build_type = /obj/item/stack/tile/floor/milspec
|
||||
can_paint = 1
|
||||
can_engrave = TRUE
|
||||
|
||||
/turf/simulated/floor/tiled/milspec
|
||||
name = "riveted floor"
|
||||
icon = 'icons/turf/flooring/tiles.dmi'
|
||||
icon_state = "milspec"
|
||||
initial_flooring = /decl/flooring/tiling/milspec
|
||||
|
||||
/obj/item/stack/tile/floor/milspec
|
||||
name = "riveted floor tile"
|
||||
|
||||
/decl/flooring/tiling/milspec/sterile
|
||||
name = "sterile welded floor"
|
||||
icon_base = "dark_sterile"
|
||||
build_type = /obj/item/stack/tile/floor/milspec/sterile
|
||||
|
||||
/turf/simulated/floor/tiled/milspec/sterile
|
||||
name = "sterile welded floor"
|
||||
icon_state = "dark_sterile"
|
||||
initial_flooring = /decl/flooring/tiling/milspec/sterile
|
||||
|
||||
/obj/item/stack/tile/floor/milspec/sterile
|
||||
name = "sterile welded floor tile"
|
||||
|
||||
/decl/flooring/tiling/milspec/raised
|
||||
name = "raised welded floor"
|
||||
icon_base = "milspec_tcomms"
|
||||
build_type = /obj/item/stack/tile/floor/milspec/raised
|
||||
|
||||
/turf/simulated/floor/tiled/milspec/raised
|
||||
name = "raised welded floor"
|
||||
icon_state = "milspec_tcomms"
|
||||
initial_flooring = /decl/flooring/tiling/milspec/raised
|
||||
|
||||
/obj/item/stack/tile/floor/milspec/raised
|
||||
name = "raised welded floor tile"
|
||||
|
||||
/decl/flooring/tiling/milspec/dark
|
||||
name = "dark welded floor"
|
||||
icon_base = "milspec_office_tile"
|
||||
build_type = /obj/item/stack/tile/floor/milspec/dark
|
||||
|
||||
/turf/simulated/floor/tiled/milspec/dark
|
||||
name = "dark welded floor"
|
||||
icon_state = "milspec_office_tile"
|
||||
initial_flooring = /decl/flooring/tiling/milspec/dark
|
||||
|
||||
/obj/item/stack/tile/floor/milspec/dark
|
||||
name = "dark welded floor tile"
|
||||
|
||||
@@ -300,6 +300,7 @@
|
||||
// Fake corners for making hulls look pretty
|
||||
/obj/structure/hull_corner
|
||||
name = "hull corner"
|
||||
plane = OBJ_PLANE - 1
|
||||
|
||||
icon = 'icons/turf/wall_masks.dmi'
|
||||
icon_state = "hull_corner"
|
||||
@@ -325,7 +326,7 @@
|
||||
var/turf/simulated/wall/T
|
||||
for(var/direction in get_dirs_to_test())
|
||||
T = get_step(src, direction)
|
||||
if(!istype(T))
|
||||
if(!istype(T) || T.material?.icon_base != "hull")
|
||||
continue
|
||||
|
||||
name = T.name
|
||||
@@ -358,3 +359,271 @@
|
||||
|
||||
/obj/structure/hull_corner/long_horiz/get_dirs_to_test()
|
||||
return list(dir, turn(dir,90), turn(dir,-90))
|
||||
|
||||
/turf/simulated/wall/tgmc
|
||||
icon = 'icons/turf/wall_masks_tgmc.dmi'
|
||||
icon_state = "metal0"
|
||||
|
||||
var/list/blend_objects = list(/obj/machinery/door)
|
||||
var/list/noblend_objects = list(/obj/machinery/door/window, /obj/machinery/door/firedoor)
|
||||
|
||||
var/wall_base_state = "metal"
|
||||
var/wall_blend_category = "metal"
|
||||
var/force_icon
|
||||
var/list/blend_log = list()
|
||||
var/strict_blending = FALSE
|
||||
var/diagonal_blending = FALSE
|
||||
|
||||
// *INHALE
|
||||
/turf/simulated/wall/tgmc/update_icon()
|
||||
if(!damage_overlays[1]) //list hasn't been populated
|
||||
generate_overlays()
|
||||
|
||||
cut_overlays()
|
||||
|
||||
if(force_icon)
|
||||
icon_state = "[wall_base_state][force_icon]"
|
||||
else
|
||||
icon_state = "[wall_base_state][wall_connections]"
|
||||
|
||||
if(damage != 0)
|
||||
var/integrity = material.integrity
|
||||
if(reinf_material)
|
||||
integrity += reinf_material.integrity
|
||||
|
||||
var/overlay = round(damage / integrity * damage_overlays.len) + 1
|
||||
if(overlay > damage_overlays.len)
|
||||
overlay = damage_overlays.len
|
||||
|
||||
add_overlay(damage_overlays[overlay])
|
||||
|
||||
/turf/simulated/wall/tgmc/update_connections(propagate)
|
||||
if(!material)
|
||||
return
|
||||
var/dirs = 0
|
||||
var/list_to_use = diagonal_blending ? alldirs : cardinal
|
||||
main_direction_loop:
|
||||
for(var/direction in list_to_use)
|
||||
var/turf/simulated/wall/tgmc/W = get_step(src, direction)
|
||||
if(strict_blending)
|
||||
if(istype(W, src))
|
||||
dirs |= direction
|
||||
continue main_direction_loop
|
||||
|
||||
var/decided_to_blend = FALSE
|
||||
for(var/obj/O in W)
|
||||
for(var/b_type in blend_objects)
|
||||
if(istype(O, b_type))
|
||||
decided_to_blend = TRUE
|
||||
for(var/obj/structure/S in W)
|
||||
if(istype(S, src))
|
||||
decided_to_blend = FALSE
|
||||
for(var/nb_type in noblend_objects)
|
||||
if(istype(O, nb_type))
|
||||
decided_to_blend = FALSE
|
||||
|
||||
if(decided_to_blend)
|
||||
blend_log += "Blending with [O] at [direction] because special said to"
|
||||
dirs |= direction
|
||||
continue main_direction_loop
|
||||
|
||||
// Needs to be our type of wall to blend from this point
|
||||
if(!istype(W))
|
||||
continue
|
||||
if(propagate)
|
||||
W.update_connections()
|
||||
W.update_icon()
|
||||
if(W.wall_blend_category == wall_blend_category)
|
||||
dirs |= direction
|
||||
blend_log += "Blending with [W] at [get_dir(src, W)] because blend category is the same"
|
||||
|
||||
wall_connections = dirs
|
||||
|
||||
/turf/simulated/wall/tgmc/rwall
|
||||
icon_state = "rwall0"
|
||||
wall_base_state = "rwall"
|
||||
wall_blend_category = "rwall"
|
||||
/turf/simulated/wall/tgmc/rwall/Initialize(mapload)
|
||||
. = ..(mapload, MAT_PLASTEEL,MAT_PLASTEEL)
|
||||
|
||||
/turf/simulated/wall/tgmc/gray
|
||||
icon_state = "gray0"
|
||||
wall_base_state = "gray"
|
||||
wall_blend_category = "gray"
|
||||
/turf/simulated/wall/tgmc/gwall/Initialize(mapload)
|
||||
. = ..(mapload, MAT_PLASTEEL,MAT_PLASTEEL)
|
||||
|
||||
/turf/simulated/wall/tgmc/darkwall
|
||||
icon_state = "darkwall0"
|
||||
wall_base_state = "darkwall"
|
||||
wall_blend_category = "darkwall"
|
||||
/turf/simulated/wall/tgmc/darkwall/Initialize(mapload)
|
||||
. = ..(mapload, MAT_PLASTEEL,MAT_PLASTEEL)
|
||||
/turf/simulated/wall/tgmc/darkwall/deco0
|
||||
icon_state = "darkwall_deco0"
|
||||
force_icon = "_deco0"
|
||||
/turf/simulated/wall/tgmc/darkwall/deco1
|
||||
icon_state = "darkwall_deco1"
|
||||
force_icon = "_deco1"
|
||||
/turf/simulated/wall/tgmc/darkwall/deco2
|
||||
icon_state = "darkwall_deco2"
|
||||
force_icon = "_deco2"
|
||||
/turf/simulated/wall/tgmc/darkwall/deco3
|
||||
icon_state = "darkwall_deco3"
|
||||
force_icon = "_deco3"
|
||||
|
||||
/turf/simulated/wall/tgmc/whitewall
|
||||
icon_state = "white0"
|
||||
wall_base_state = "white"
|
||||
wall_blend_category = "white"
|
||||
/turf/simulated/wall/tgmc/whitewall/Initialize(mapload)
|
||||
. = ..(mapload, MAT_STEEL,MAT_PLASTIC)
|
||||
|
||||
/turf/simulated/wall/tgmc/durawall
|
||||
icon_state = "darkband0"
|
||||
wall_base_state = "darkband"
|
||||
wall_blend_category = "darkband"
|
||||
/turf/simulated/wall/tgmc/durawall/Initialize(mapload)
|
||||
. = ..(mapload, MAT_DURASTEEL,MAT_DURASTEEL)
|
||||
/turf/simulated/wall/tgmc/durawall/deco0
|
||||
icon_state = "darkband_deco0"
|
||||
force_icon = "_deco0"
|
||||
/turf/simulated/wall/tgmc/durawall/deco1
|
||||
icon_state = "darkband_deco1"
|
||||
force_icon = "_deco1"
|
||||
/turf/simulated/wall/tgmc/durawall/deco2
|
||||
icon_state = "darkband_deco2"
|
||||
force_icon = "_deco2"
|
||||
/turf/simulated/wall/tgmc/durawall/deco3
|
||||
icon_state = "darkband_deco3"
|
||||
force_icon = "_deco3"
|
||||
|
||||
/turf/simulated/wall/tgmc/sanitary
|
||||
icon_state = "whiteband0"
|
||||
wall_base_state = "whiteband"
|
||||
wall_blend_category = "whiteband"
|
||||
/turf/simulated/wall/tgmc/sanitary/Initialize(mapload)
|
||||
. = ..(mapload, MAT_PLASTEEL,MAT_PLASTEEL)
|
||||
|
||||
/turf/simulated/wall/tgmc/chigusa
|
||||
icon_state = "chigusa0"
|
||||
wall_base_state = "chigusa"
|
||||
wall_blend_category = "chigusa"
|
||||
/turf/simulated/wall/tgmc/chigusa/Initialize(mapload)
|
||||
. = ..(mapload, MAT_CHITIN,MAT_CHITIN)
|
||||
/turf/simulated/wall/tgmc/chigusa/deco0
|
||||
icon_state = "chigusa_deco0"
|
||||
force_icon = "_deco0"
|
||||
/turf/simulated/wall/tgmc/chigusa/deco1
|
||||
icon_state = "chigusa_deco1"
|
||||
force_icon = "_deco1"
|
||||
/turf/simulated/wall/tgmc/chigusa/deco2
|
||||
icon_state = "chigusa_deco2"
|
||||
force_icon = "_deco2"
|
||||
|
||||
/turf/simulated/wall/tgmc/redstripe
|
||||
icon_state = "redstripe0"
|
||||
wall_base_state = "redstripe"
|
||||
wall_blend_category = "redstripe"
|
||||
/turf/simulated/wall/tgmc/redstripe/Initialize(mapload)
|
||||
. = ..(mapload, MAT_PLASTEELHULL,MAT_PLASTEELHULL)
|
||||
|
||||
/turf/simulated/wall/tgmc/redstripe_r
|
||||
icon_state = "redstriper0"
|
||||
wall_base_state = "redstriper"
|
||||
wall_blend_category = "redstriper"
|
||||
/turf/simulated/wall/tgmc/redstripe_r/Initialize(mapload)
|
||||
. = ..(mapload, MAT_DURASTEELHULL,MAT_DURASTEELHULL)
|
||||
|
||||
/turf/simulated/wall/tgmc/plain_redstripe
|
||||
icon_state = "predstripe0"
|
||||
wall_base_state = "predstripe"
|
||||
wall_blend_category = "predstripe"
|
||||
/turf/simulated/wall/tgmc/plain_redstripe/Initialize(mapload)
|
||||
. = ..(mapload, MAT_PLASTEEL,MAT_PLASTEEL)
|
||||
|
||||
/turf/simulated/wall/tgmc/plain_redstripe_r
|
||||
icon_state = "predstriper0"
|
||||
wall_base_state = "predstriper"
|
||||
wall_blend_category = "predstriper"
|
||||
/turf/simulated/wall/tgmc/plain_redstripe_r/Initialize(mapload)
|
||||
. = ..(mapload, MAT_DURASTEEL,MAT_DURASTEEL)
|
||||
|
||||
#define WINDOW_GLASS 0x1
|
||||
#define WINDOW_RGLASS 0x2
|
||||
/turf/simulated/wall/tgmc/window
|
||||
name = "window"
|
||||
icon = 'icons/turf/wall_masks_tgmc_win.dmi'
|
||||
icon_state = "metal_window0"
|
||||
wall_base_state = "metal_window"
|
||||
wall_blend_category = "metal"
|
||||
|
||||
opacity = 0
|
||||
var/window_types = WINDOW_GLASS
|
||||
strict_blending = TRUE
|
||||
diagonal_blending = TRUE
|
||||
|
||||
/turf/simulated/wall/tgmc/window/rwall
|
||||
icon_state = "rwall_window0"
|
||||
wall_base_state = "rwall_window"
|
||||
wall_blend_category = "rwall"
|
||||
window_types = WINDOW_RGLASS
|
||||
|
||||
/turf/simulated/wall/tgmc/window/rwall
|
||||
icon_state = "rwall_rwindow0"
|
||||
wall_base_state = "rwall_rwindow"
|
||||
wall_blend_category = "rwall"
|
||||
window_types = WINDOW_RGLASS
|
||||
|
||||
/turf/simulated/wall/tgmc/window/gray
|
||||
icon_state = "gray_window0"
|
||||
wall_base_state = "gray_window"
|
||||
wall_blend_category = "gray"
|
||||
window_types = WINDOW_GLASS|WINDOW_RGLASS
|
||||
|
||||
/turf/simulated/wall/tgmc/window/gray/reinf
|
||||
icon_state = "gray_rwindow0"
|
||||
wall_base_state = "gray_rwindow"
|
||||
|
||||
/turf/simulated/wall/tgmc/window/white
|
||||
icon_state = "white_window0"
|
||||
wall_base_state = "white_window"
|
||||
wall_blend_category = "white"
|
||||
window_types = WINDOW_GLASS|WINDOW_RGLASS
|
||||
diagonal_blending = FALSE
|
||||
|
||||
/turf/simulated/wall/tgmc/window/white/reinf
|
||||
icon_state = "white_rwindow0"
|
||||
wall_base_state = "white_rwindow"
|
||||
|
||||
/turf/simulated/wall/tgmc/window/chigusa
|
||||
icon_state = "chigusa_rwindow0"
|
||||
wall_base_state = "chigusa_rwindow"
|
||||
wall_blend_category = "chigusa"
|
||||
window_types = WINDOW_RGLASS
|
||||
diagonal_blending = FALSE
|
||||
|
||||
/turf/simulated/wall/tgmc/window/redstripe_r
|
||||
icon_state = "predstriper_window0"
|
||||
wall_base_state = "predstriper_window"
|
||||
wall_blend_category = "predstriper"
|
||||
window_types = WINDOW_GLASS|WINDOW_RGLASS
|
||||
|
||||
/turf/simulated/wall/tgmc/window/redstripe_r/reinf
|
||||
icon_state = "predstriper_rwindow0"
|
||||
wall_base_state = "predstriper_rwindow"
|
||||
wall_blend_category = "predstriper"
|
||||
|
||||
/turf/simulated/wall/tgmc/window/darkwall
|
||||
icon_state = "darkwall_window0"
|
||||
wall_base_state = "darkwall_window"
|
||||
wall_blend_category = "darkwall"
|
||||
window_types = WINDOW_GLASS|WINDOW_RGLASS
|
||||
diagonal_blending = FALSE
|
||||
|
||||
/turf/simulated/wall/tgmc/window/darkwall/reinf
|
||||
icon_state = "darkwall_rwindow0"
|
||||
wall_base_state = "darkwall_rwindow"
|
||||
|
||||
#undef WINDOW_GLASS
|
||||
#undef WINDOW_RGLASS
|
||||
|
||||
@@ -86,6 +86,7 @@ var/global/list/reverse_dir = list( // reverse_dir[dir] = reverse of dir
|
||||
41, 43, 36, 38, 37, 39, 44, 46, 45, 47, 16, 18, 17, 19, 24, 26, 25, 27, 20, 22, 21,
|
||||
23, 28, 30, 29, 31, 48, 50, 49, 51, 56, 58, 57, 59, 52, 54, 53, 55, 60, 62, 61, 63
|
||||
)
|
||||
var/global/const/SQRT_TWO = 1.41421356237
|
||||
|
||||
var/global/datum/configuration/config = null
|
||||
|
||||
|
||||
@@ -357,6 +357,17 @@
|
||||
corpseid = 1
|
||||
corpseidjob = "Sif Defense Force Patrolman"
|
||||
|
||||
/obj/effect/landmark/corpse/sifcop
|
||||
name = "SGPD Officer"
|
||||
corpseuniform = /obj/item/clothing/under/sifcop
|
||||
corpsebelt = /obj/item/storage/belt/security/tactical
|
||||
corpseglasses = /obj/item/clothing/glasses/sunglasses/sechud
|
||||
corpsehelmet = /obj/item/clothing/head/helmet/riot/sifcop
|
||||
corpsegloves = /obj/item/clothing/gloves/duty
|
||||
corpseshoes = /obj/item/clothing/shoes/boots/jackboots
|
||||
corpseid = 1
|
||||
corpseidjob = "SifGuard Police Division Officer"
|
||||
|
||||
/obj/effect/landmark/corpse/hedberg
|
||||
name = "Hedberg-Hammarstrom Mercenary"
|
||||
corpseuniform = /obj/item/clothing/under/solgov/utility/sifguard
|
||||
@@ -372,7 +383,7 @@
|
||||
name = "Hedberg-Hammarstrom Mercenary"
|
||||
corpsebelt = /obj/item/storage/belt/security/tactical
|
||||
corpseglasses = /obj/item/clothing/glasses/sunglasses/sechud
|
||||
corpsehelmet = /obj/item/clothing/head/helmet/flexitac
|
||||
corpsehelmet = /obj/item/clothing/head/helmet/space/void/hedberg
|
||||
corpsegloves = /obj/item/clothing/gloves/combat
|
||||
corpseshoes = /obj/item/clothing/shoes/boots/tactical
|
||||
corpseid = 1
|
||||
|
||||
@@ -77,3 +77,32 @@
|
||||
|
||||
// Runechat messages
|
||||
var/list/seen_messages
|
||||
|
||||
///////////
|
||||
// INPUT //
|
||||
///////////
|
||||
|
||||
/// Bitfield of modifier keys (Shift, Ctrl, Alt) held currently.
|
||||
var/mod_keys_held = 0
|
||||
/// Bitfield of movement keys (WASD/Cursor Keys) held currently.
|
||||
var/move_keys_held = 0
|
||||
|
||||
/// These next two vars are to apply movement for keypresses and releases made while move delayed.
|
||||
/// Because discarding that input makes the game less responsive.
|
||||
|
||||
/// Bitfield of movement dirs that were pressed down *this* cycle (even if not currently held).
|
||||
/// Note that only dirs that actually are first pressed down during this cycle are included, if it was still held from last cycle it won't be in here.
|
||||
/// On next move, add this dir to the move that would otherwise be done
|
||||
var/next_move_dir_add
|
||||
|
||||
/// Bitfield of movement dirs that were released *this* cycle (even if currently held).
|
||||
/// Note that only dirs that were already held at the start of this cycle are included, if it pressed then released it won't be in here.
|
||||
/// On next move, subtract this dir from the move that would otherwise be done
|
||||
var/next_move_dir_sub
|
||||
|
||||
#ifdef CARDINAL_INPUT_ONLY
|
||||
|
||||
/// Movement dir of the most recently pressed movement key. Used in cardinal-only movement mode.
|
||||
var/last_move_dir_pressed = NONE
|
||||
|
||||
#endif
|
||||
@@ -161,9 +161,12 @@
|
||||
webbingtype["webbing, brown"] = /obj/item/clothing/accessory/storage/brown_vest
|
||||
webbingtype["webbing, black"] = /obj/item/clothing/accessory/storage/black_vest
|
||||
webbingtype["webbing, white"] = /obj/item/clothing/accessory/storage/white_vest
|
||||
webbingtype["webbing, simple"] = /obj/item/clothing/accessory/storage/webbing
|
||||
gear_tweaks += new/datum/gear_tweak/path(webbingtype)
|
||||
|
||||
/datum/gear/accessory/webbing_simple
|
||||
display_name = "webbing, simple"
|
||||
path = /obj/item/clothing/accessory/storage/webbing
|
||||
|
||||
/datum/gear/accessory/drop_pouches
|
||||
display_name = "drop pouches selection (Engineering, Security, Medical)"
|
||||
path = /obj/item/clothing/accessory/storage/brown_drop_pouches
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
glassestype["glasses, thin frame"] = /obj/item/clothing/glasses/thin
|
||||
gear_tweaks += new/datum/gear_tweak/path(glassestype)
|
||||
|
||||
/datum/gear/eyes/glasses/monocle
|
||||
/datum/gear/eyes/monocle
|
||||
display_name = "monocle"
|
||||
path = /obj/item/clothing/glasses/monocle
|
||||
|
||||
@@ -130,12 +130,11 @@
|
||||
display_name = "optical material scanners, prescription (Mining)"
|
||||
path = /obj/item/clothing/glasses/material/prescription
|
||||
|
||||
|
||||
/datum/gear/eyes/glasses/fakesun
|
||||
/datum/gear/eyes/fakesun
|
||||
display_name = "sunglasses, stylish"
|
||||
path = /obj/item/clothing/glasses/fakesunglasses
|
||||
|
||||
/datum/gear/eyes/glasses/fakeaviator
|
||||
/datum/gear/eyes/fakeaviator
|
||||
display_name = "sunglasses, stylish aviators"
|
||||
path = /obj/item/clothing/glasses/fakesunglasses/aviator
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
path = /obj/item/clothing/gloves/sterile/nitrile
|
||||
cost = 2
|
||||
/datum/gear/gloves/evening
|
||||
display_name = "gloves, evening"
|
||||
display_name = "gloves, evening (colorable)"
|
||||
path = /obj/item/clothing/gloves/evening
|
||||
cost = 1
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
cost = 1
|
||||
|
||||
/datum/gear/gloves/fingerless
|
||||
display_name = "gloves, fingerless"
|
||||
display_name = "gloves, fingerless (colorable)"
|
||||
path = /obj/item/clothing/gloves/fingerless
|
||||
cost = 1
|
||||
|
||||
|
||||
@@ -81,20 +81,20 @@
|
||||
caps[initial(cap_type.name)] = cap_type
|
||||
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(caps))
|
||||
|
||||
/datum/gear/head/cap/flat
|
||||
/datum/gear/head/cap_flat
|
||||
display_name = "cap, flat brown"
|
||||
path = /obj/item/clothing/head/flatcap
|
||||
|
||||
/datum/gear/head/cap/med
|
||||
/datum/gear/head/cap_med
|
||||
display_name = "cap, medical (Medical)"
|
||||
path = /obj/item/clothing/head/soft/med
|
||||
allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic","Search and Rescue")
|
||||
|
||||
/datum/gear/head/cap/white
|
||||
/datum/gear/head/cap_colorable
|
||||
display_name = "cap (colorable)"
|
||||
path = /obj/item/clothing/head/soft/mime
|
||||
|
||||
/datum/gear/head/cap/white/New()
|
||||
/datum/gear/head/cap_colorable/New()
|
||||
..()
|
||||
gear_tweaks += gear_tweak_free_color_choice
|
||||
|
||||
@@ -298,11 +298,11 @@
|
||||
welding_helmets[initial(welding_helmet_type.name)] = welding_helmet_type
|
||||
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(welding_helmets))
|
||||
|
||||
/datum/gear/head/beret/solgov
|
||||
/datum/gear/head/beret_gov
|
||||
display_name = "beret, government selection"
|
||||
path = /obj/item/clothing/head/beret/solgov
|
||||
|
||||
/datum/gear/head/beret/solgov/New()
|
||||
/datum/gear/head/beret_gov/New()
|
||||
..()
|
||||
var/list/sols = list()
|
||||
for(var/sol_style in typesof(/obj/item/clothing/head/beret/solgov))
|
||||
@@ -368,3 +368,32 @@
|
||||
/datum/gear/head/plaguedoctor2
|
||||
display_name = "hat, golden plague doctor"
|
||||
path = /obj/item/clothing/head/plaguedoctorhat/gold
|
||||
|
||||
/datum/gear/head/nonla
|
||||
display_name = "non la"
|
||||
path = /obj/item/clothing/head/nonla
|
||||
|
||||
/datum/gear/head/buckethat
|
||||
display_name = "hat, bucket"
|
||||
path = /obj/item/clothing/head/buckethat
|
||||
|
||||
/datum/gear/head/buckethat/New()
|
||||
..()
|
||||
gear_tweaks += gear_tweak_free_color_choice
|
||||
|
||||
/datum/gear/head/redcoat
|
||||
display_name = "hat, tricorne"
|
||||
path =/obj/item/clothing/head/redcoat
|
||||
|
||||
/datum/gear/head/tanker
|
||||
display_name = "tanker cap selection"
|
||||
path = /obj/item/clothing/head/hardhat
|
||||
cost = 2
|
||||
|
||||
/datum/gear/head/tanker/New()
|
||||
..()
|
||||
var/list/tankercaps = list()
|
||||
for(var/tankercap in typesof(/obj/item/clothing/head/helmet/tank))
|
||||
var/obj/item/clothing/head/helmet/tank/cap_type = tankercap
|
||||
tankercaps[initial(cap_type.name)] = cap_type
|
||||
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(tankercaps))
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
/datum/gear/shoes/workboots/toeless
|
||||
display_name = "workboots, toe-less"
|
||||
path = /obj/item/clothing/shoes/boots/workboots/toeless
|
||||
cost = 2
|
||||
|
||||
/datum/gear/shoes/colored
|
||||
display_name = "shoes, colored selection"
|
||||
@@ -73,7 +72,7 @@
|
||||
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(hitops))
|
||||
|
||||
/datum/gear/shoes/flipflops
|
||||
display_name = "flip flops"
|
||||
display_name = "flip flops (colorable)"
|
||||
path = /obj/item/clothing/shoes/flipflop
|
||||
|
||||
/datum/gear/shoes/flipflops/New()
|
||||
@@ -81,7 +80,7 @@
|
||||
gear_tweaks += gear_tweak_free_color_choice
|
||||
|
||||
/datum/gear/shoes/athletic
|
||||
display_name = "shoes, athletic"
|
||||
display_name = "shoes, athletic (colorable)"
|
||||
path = /obj/item/clothing/shoes/athletic
|
||||
|
||||
/datum/gear/shoes/athletic/New()
|
||||
@@ -89,7 +88,7 @@
|
||||
gear_tweaks += gear_tweak_free_color_choice
|
||||
|
||||
/datum/gear/shoes/skater
|
||||
display_name = "shoes, skater"
|
||||
display_name = "shoes, skater (colorable)"
|
||||
path = /obj/item/clothing/shoes/skater
|
||||
|
||||
/datum/gear/shoes/skater/New()
|
||||
@@ -135,7 +134,7 @@
|
||||
path = /obj/item/clothing/shoes/dress/white
|
||||
|
||||
/datum/gear/shoes/heels
|
||||
display_name = "high heels"
|
||||
display_name = "high heels (colorable)"
|
||||
path = /obj/item/clothing/shoes/heels
|
||||
|
||||
/datum/gear/shoes/heels/New()
|
||||
@@ -146,11 +145,11 @@
|
||||
display_name = "bunny slippers"
|
||||
path = /obj/item/clothing/shoes/slippers
|
||||
|
||||
/datum/gear/shoes/boots/winter
|
||||
/datum/gear/shoes/winter_boots
|
||||
display_name = "boots, winter selection"
|
||||
path = /obj/item/clothing/shoes/boots/winter
|
||||
|
||||
/datum/gear/shoes/boots/winter/New()
|
||||
/datum/gear/shoes/winter_boots/New()
|
||||
..()
|
||||
var/boottype = list()
|
||||
boottype["winter boots, atmospherics"] = /obj/item/clothing/shoes/boots/winter/atmos
|
||||
|
||||
@@ -151,21 +151,21 @@
|
||||
labcoattype["labcoat, yellow"] = /obj/item/clothing/suit/storage/toggle/labcoat/yellow
|
||||
gear_tweaks += new/datum/gear_tweak/path(labcoattype)
|
||||
|
||||
/datum/gear/suit/labcoat/rd
|
||||
/datum/gear/suit/labcoat_rd
|
||||
display_name = "labcoat, research director (RD)"
|
||||
path = /obj/item/clothing/suit/storage/toggle/labcoat/rd
|
||||
allowed_roles = list("Research Director")
|
||||
|
||||
/datum/gear/suit/labcoat/emt
|
||||
/datum/gear/suit/labcoat_emt
|
||||
display_name = "labcoat, EMT (Medical)"
|
||||
path = /obj/item/clothing/suit/storage/toggle/labcoat/emt
|
||||
allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist")
|
||||
|
||||
/datum/gear/suit/miscellaneous/labcoat
|
||||
/datum/gear/suit/plague_coat
|
||||
display_name = "plague doctor's coat"
|
||||
path = /obj/item/clothing/suit/storage/toggle/labcoat/plaguedoctor
|
||||
|
||||
/datum/gear/suit/roles/surgical_apron
|
||||
/datum/gear/suit/surgical_apron
|
||||
display_name = "apron, surgical"
|
||||
path = /obj/item/clothing/suit/surgicalapron
|
||||
allowed_roles = list("Medical Doctor","Chief Medical Officer")
|
||||
@@ -187,11 +187,11 @@
|
||||
ponchos[initial(poncho.name)] = poncho
|
||||
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(ponchos))
|
||||
|
||||
/datum/gear/suit/roles/poncho/cloak
|
||||
/datum/gear/suit/cloak
|
||||
display_name = "cloak, departmental selection"
|
||||
path = /obj/item/clothing/accessory/poncho/roles/cloak/cargo
|
||||
|
||||
/datum/gear/suit/roles/poncho/cloak/New()
|
||||
/datum/gear/suit/cloak/New()
|
||||
..()
|
||||
var/list/cloaks = list()
|
||||
for(var/cloak_style in (typesof(/obj/item/clothing/accessory/poncho/roles/cloak)))
|
||||
@@ -199,7 +199,7 @@
|
||||
cloaks[initial(cloak.name)] = cloak
|
||||
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(cloaks))
|
||||
|
||||
/datum/gear/suit/roles/poncho/cloak/custom //A colorable cloak
|
||||
/datum/gear/suit/cloak_custom //A colorable cloak
|
||||
display_name = "cloak (colorable)"
|
||||
path = /obj/item/clothing/accessory/poncho/roles/cloak/custom
|
||||
|
||||
@@ -302,19 +302,19 @@
|
||||
denim_jackets[initial(denim_jacket.name)] = denim_jacket
|
||||
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(denim_jackets))
|
||||
|
||||
/datum/gear/suit/miscellaneous/kimono
|
||||
/datum/gear/suit/kimono
|
||||
display_name = "kimono"
|
||||
path = /obj/item/clothing/suit/kimono
|
||||
|
||||
/datum/gear/suit/miscellaneous/kimono/New()
|
||||
/datum/gear/suit/kimono/New()
|
||||
..()
|
||||
gear_tweaks += gear_tweak_free_color_choice
|
||||
|
||||
/datum/gear/suit/miscellaneous/dep_jacket
|
||||
/datum/gear/suit/dep_jacket
|
||||
display_name = "jacket, departmental selection"
|
||||
path = /obj/item/clothing/suit/storage/toggle/sec_dep_jacket
|
||||
|
||||
/datum/gear/suit/miscellaneous/dep_jacket/New()
|
||||
/datum/gear/suit/dep_jacket/New()
|
||||
..()
|
||||
var/jackettype = list()
|
||||
jackettype["department jacket, engineering"] = /obj/item/clothing/suit/storage/toggle/engi_dep_jacket
|
||||
@@ -324,11 +324,11 @@
|
||||
jackettype["department jacket, supply"] = /obj/item/clothing/suit/storage/toggle/supply_dep_jacket
|
||||
gear_tweaks += new/datum/gear_tweak/path(jackettype)
|
||||
|
||||
/datum/gear/suit/miscellaneous/light_jacket
|
||||
/datum/gear/suit/light_jacket
|
||||
display_name = "jacket, light selection"
|
||||
path = /obj/item/clothing/suit/storage/toggle/light_jacket
|
||||
|
||||
/datum/gear/suit/miscellaneous/light_jacket/New()
|
||||
/datum/gear/suit/light_jacket/New()
|
||||
..()
|
||||
var/list/jacket = list(
|
||||
"grey light jacket" = /obj/item/clothing/suit/storage/toggle/light_jacket,
|
||||
@@ -336,20 +336,20 @@
|
||||
)
|
||||
gear_tweaks += new/datum/gear_tweak/path(jacket)
|
||||
|
||||
/datum/gear/suit/miscellaneous/peacoat
|
||||
display_name = "peacoat"
|
||||
/datum/gear/suit/peacoat
|
||||
display_name = "peacoat (colorable)"
|
||||
path = /obj/item/clothing/suit/storage/toggle/peacoat
|
||||
|
||||
/datum/gear/suit/miscellaneous/peacoat/New()
|
||||
/datum/gear/suit/peacoat/New()
|
||||
..()
|
||||
gear_tweaks += gear_tweak_free_color_choice
|
||||
|
||||
/datum/gear/suit/miscellaneous/kamishimo
|
||||
/datum/gear/suit/kamishimo
|
||||
display_name = "kamishimo"
|
||||
path = /obj/item/clothing/suit/kamishimo
|
||||
|
||||
/datum/gear/suit/insulted
|
||||
display_name = "insulted jacket selection"
|
||||
/datum/gear/suit/insulated
|
||||
display_name = "jacket, insulated selection"
|
||||
path = /obj/item/clothing/suit/storage/insulated
|
||||
cost = 2
|
||||
|
||||
@@ -361,10 +361,10 @@
|
||||
insulated_jackets[initial(insulated_jacket.name)] = insulated_jacket
|
||||
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(insulated_jackets))
|
||||
|
||||
/datum/gear/suit/miscellaneous/cardigan
|
||||
display_name = "cardigan"
|
||||
/datum/gear/suit/cardigan
|
||||
display_name = "cardigan (colorable)"
|
||||
path = /obj/item/clothing/suit/storage/toggle/cardigan
|
||||
|
||||
/datum/gear/suit/miscellaneous/cardigan/New()
|
||||
/datum/gear/suit/cardigan/New()
|
||||
..()
|
||||
gear_tweaks += gear_tweak_free_color_choice
|
||||
|
||||
@@ -61,6 +61,14 @@
|
||||
jumpclothes[initial(jumps.name)] = jumps
|
||||
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(jumpclothes))
|
||||
|
||||
/datum/gear/uniform/colorable_jumpsuit
|
||||
display_name = "jumpsuit, colorable"
|
||||
path = /obj/item/clothing/under/colorable
|
||||
|
||||
/datum/gear/uniform/colorable_jumpsuit/New()
|
||||
..()
|
||||
gear_tweaks += gear_tweak_free_color_choice
|
||||
|
||||
/datum/gear/uniform/qipao
|
||||
display_name = "qipao"
|
||||
path = /obj/item/clothing/under/qipao
|
||||
@@ -134,21 +142,6 @@
|
||||
skirttype["skirt, quartermaster"] = /obj/item/clothing/under/rank/cargotech/skirt
|
||||
gear_tweaks += new/datum/gear_tweak/path(skirttype)
|
||||
|
||||
/datum/gear/uniform/job_skirt/warden
|
||||
display_name = "skirt, warden"
|
||||
path = /obj/item/clothing/under/rank/warden/skirt
|
||||
allowed_roles = list("Head of Security", "Warden")
|
||||
|
||||
/datum/gear/uniform/job_skirt/security
|
||||
display_name = "skirt, security"
|
||||
path = /obj/item/clothing/under/rank/security/skirt
|
||||
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer")
|
||||
|
||||
/datum/gear/uniform/job_skirt/head_of_security
|
||||
display_name = "skirt, hos"
|
||||
path = /obj/item/clothing/under/rank/head_of_security/skirt
|
||||
allowed_roles = list("Head of Security")
|
||||
|
||||
/datum/gear/uniform/job_turtle
|
||||
display_name = "turtleneck, departmental selection"
|
||||
path = /obj/item/clothing/under/rank/scientist/turtleneck
|
||||
@@ -182,11 +175,11 @@
|
||||
path = /obj/item/clothing/under/rank/cargotech/jeans/female
|
||||
allowed_roles = list("Quartermaster","Cargo Technician")
|
||||
|
||||
/datum/gear/uniform/suit/lawyer
|
||||
/datum/gear/uniform/suit_lawyer
|
||||
display_name = "suit, one-piece selection"
|
||||
path = /obj/item/clothing/under/lawyer
|
||||
|
||||
/datum/gear/uniform/suit/lawyer/New()
|
||||
/datum/gear/uniform/suit_lawyer/New()
|
||||
..()
|
||||
var/list/lsuits = list()
|
||||
for(var/lsuit in typesof(/obj/item/clothing/under/lawyer, /obj/item/clothing/under/sl_suit, /obj/item/clothing/under/gentlesuit))
|
||||
@@ -194,11 +187,11 @@
|
||||
lsuits[initial(lsuit_type.name)] = lsuit_type
|
||||
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(lsuits))
|
||||
|
||||
/datum/gear/uniform/suit/suit_jacket
|
||||
/datum/gear/uniform/suit_jacket
|
||||
display_name = "suit, modular selection"
|
||||
path = /obj/item/clothing/under/suit_jacket
|
||||
|
||||
/datum/gear/uniform/suit/suit_jacket/New()
|
||||
/datum/gear/uniform/suit_jacket/New()
|
||||
..()
|
||||
var/list/msuits = list()
|
||||
for(var/msuit in typesof(/obj/item/clothing/under/suit_jacket))
|
||||
@@ -206,22 +199,22 @@
|
||||
msuits[initial(msuit_type.name)] = msuit_type
|
||||
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(msuits))
|
||||
|
||||
/datum/gear/uniform/suit/detectiveblack
|
||||
/datum/gear/uniform/detectiveblack
|
||||
display_name = "suit, detective black (Detective)"
|
||||
path = /obj/item/clothing/under/det/black_alt
|
||||
allowed_roles = list("Detective")
|
||||
|
||||
/datum/gear/uniform/suit/detectiveskirt
|
||||
/datum/gear/uniform/detectiveskirt
|
||||
display_name = "suit, detective skirt (Detective)"
|
||||
path = /obj/item/clothing/under/det/skirt
|
||||
allowed_roles = list("Detective")
|
||||
|
||||
/datum/gear/uniform/suit/iaskirt
|
||||
/datum/gear/uniform/iaskirt
|
||||
display_name = "suit, Internal Affairs skirt (Internal Affairs)"
|
||||
path = /obj/item/clothing/under/rank/internalaffairs/skirt
|
||||
allowed_roles = list("Internal Affairs Agent")
|
||||
|
||||
/datum/gear/uniform/suit/bartenderskirt
|
||||
/datum/gear/uniform/bartenderskirt
|
||||
display_name = "suit, bartender skirt (Bartender)"
|
||||
path = /obj/item/clothing/under/rank/bartender/skirt
|
||||
allowed_roles = list("Bartender")
|
||||
@@ -278,6 +271,7 @@
|
||||
secunitype["officer uniform, corporate"] = /obj/item/clothing/under/rank/security/corp
|
||||
secunitype["officer uniform, navy"] = /obj/item/clothing/under/rank/security/navyblue
|
||||
secunitype["officer uniform, hedberg-hammarstrom"] = /obj/item/clothing/under/hedberg
|
||||
secunitype["officer uniform, red skirt"] = /obj/item/clothing/under/rank/security/skirt
|
||||
secunitype["detective uniform, corporate"] = /obj/item/clothing/under/det/corporate
|
||||
gear_tweaks += new/datum/gear_tweak/path(secunitype)
|
||||
|
||||
@@ -291,6 +285,7 @@
|
||||
var/warunitype = list()
|
||||
warunitype["warden uniform, corporate"] = /obj/item/clothing/under/rank/warden/corp
|
||||
warunitype["warden uniform, navy"] = /obj/item/clothing/under/rank/warden/navyblue
|
||||
warunitype["warden uniform, red skirt"] = /obj/item/clothing/under/rank/warden/skirt
|
||||
gear_tweaks += new/datum/gear_tweak/path(warunitype)
|
||||
|
||||
/datum/gear/uniform/uniform_hos
|
||||
@@ -303,6 +298,7 @@
|
||||
var/hosunitype = list()
|
||||
hosunitype["HoS uniform, corporate"] = /obj/item/clothing/under/rank/head_of_security/corp
|
||||
hosunitype["HoS uniform, navy"] = /obj/item/clothing/under/rank/head_of_security/navyblue
|
||||
hosunitype["HoS Uniform, red skirt"] = /obj/item/clothing/under/rank/head_of_security/skirt
|
||||
gear_tweaks += new/datum/gear_tweak/path(hosunitype)
|
||||
|
||||
/datum/gear/uniform/uniform_hop
|
||||
@@ -381,6 +377,11 @@
|
||||
utils[initial(util_type.name)] = util_type
|
||||
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(utils))
|
||||
|
||||
/datum/gear/uniform/utility/medical
|
||||
display_name = "utility, medical"
|
||||
path = /obj/item/clothing/under/rank/medical/utility
|
||||
allowed_roles = list("Chief Medical Officer", "Paramedic", "Medical Doctor", "Psychiatrist", "Search and Rescue", "Chemist")
|
||||
|
||||
/datum/gear/uniform/sweater
|
||||
display_name = "sweater, grey"
|
||||
path = /obj/item/clothing/under/rank/psych/turtleneck/sweater
|
||||
@@ -405,6 +406,9 @@
|
||||
display_name = "outfit, frontier"
|
||||
path = /obj/item/clothing/under/frontier
|
||||
|
||||
/datum/gear/uniform/retro_outdoors
|
||||
display_name = "outfit, retro outdoors"
|
||||
path = /obj/item/clothing/under/retro_outdoors
|
||||
/datum/gear/uniform/yogapants
|
||||
display_name = "pants, yoga (colorable)"
|
||||
path = /obj/item/clothing/under/pants/yogapants
|
||||
@@ -530,7 +534,7 @@
|
||||
path = /obj/item/clothing/under/dress/revealingdress
|
||||
|
||||
/datum/gear/uniform/rippedpunk
|
||||
display_name = "jeans, ripped punk"
|
||||
display_name = "outfit, ripped punk"
|
||||
path = /obj/item/clothing/under/rippedpunk
|
||||
|
||||
/datum/gear/uniform/gothic
|
||||
@@ -557,6 +561,10 @@
|
||||
display_name = "outfit, cyberpunk strapped harness"
|
||||
path = /obj/item/clothing/under/cyberpunkharness
|
||||
|
||||
/datum/gear/uniform/cyberpunkpants
|
||||
display_name = "cyberpunk split-side ensemble"
|
||||
path = /obj/item/clothing/under/cyberpunkpants
|
||||
|
||||
/datum/gear/uniform/whitegown
|
||||
display_name = "white gown"
|
||||
path = /obj/item/clothing/under/wedding/whitegown
|
||||
@@ -608,3 +616,8 @@
|
||||
/datum/gear/uniform/vampire
|
||||
display_name = "pants, high-waisted trousers"
|
||||
path = /obj/item/clothing/under/hightrousers
|
||||
|
||||
/datum/gear/uniform/chaplain_stripe
|
||||
display_name = "jumpsuit, chaplain striped"
|
||||
path = /obj/item/clothing/under/rank/chaplain/alt
|
||||
allowed_roles = list("Chaplain")
|
||||
|
||||
@@ -162,15 +162,13 @@
|
||||
cohesionsuits[initial(cohesion_type.name)] = cohesion_type
|
||||
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(cohesionsuits))
|
||||
|
||||
/datum/gear/uniform/dept
|
||||
/datum/gear/uniform/teshundercoat
|
||||
display_name = "Teshari undercoat selection"
|
||||
path = /obj/item/clothing/under/teshari/undercoat/jobs/hop
|
||||
whitelisted = SPECIES_TESHARI
|
||||
sort_category = "Xenowear"
|
||||
|
||||
/datum/gear/uniform/dept/undercoat
|
||||
display_name = "Teshari undercoat selection"
|
||||
path = /obj/item/clothing/under/teshari/undercoat/jobs/hop
|
||||
|
||||
/datum/gear/uniform/dept/undercoat/New()
|
||||
/datum/gear/uniform/teshundercoat/New()
|
||||
..()
|
||||
var/list/teshundercoats = list()
|
||||
for(var/teshundercoat_style in typesof(/obj/item/clothing/under/teshari/undercoat/jobs))
|
||||
@@ -178,12 +176,12 @@
|
||||
teshundercoats[initial(teshundercoat.name)] = teshundercoat
|
||||
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(teshundercoats))
|
||||
|
||||
/datum/gear/suit/dept/cloak
|
||||
/datum/gear/suit/teshcloak
|
||||
display_name = "Teshari cloak selection, jobs"
|
||||
whitelisted = SPECIES_TESHARI
|
||||
sort_category = "Xenowear"
|
||||
|
||||
/datum/gear/suit/dept/cloak/New()
|
||||
/datum/gear/suit/teshcloak/New()
|
||||
..()
|
||||
var/list/teshcloaks = list()
|
||||
for(var/teshcloak_style in typesof(/obj/item/clothing/suit/storage/teshari/cloak/jobs, /obj/item/clothing/suit/storage/teshari/beltcloak/jobs))
|
||||
|
||||
@@ -71,12 +71,18 @@
|
||||
/obj/item/clothing/head/helmet/riot/attack_self(mob/user as mob)
|
||||
if(src.icon_state == initial(icon_state))
|
||||
src.icon_state = "[icon_state]up"
|
||||
to_chat(user, "You raise the visor on the riot helmet.")
|
||||
to_chat(user, "You raise the visor on the [src].")
|
||||
else
|
||||
src.icon_state = initial(icon_state)
|
||||
to_chat(user, "You lower the visor on the riot helmet.")
|
||||
to_chat(user, "You lower the visor on the [src].")
|
||||
update_clothing_icon() //so our mob-overlays update
|
||||
|
||||
/obj/item/clothing/head/helmet/riot/sifcop
|
||||
name = "\improper SifGuard police helmet"
|
||||
desc = "A visored helmet printed with the livery of the SifGuard Police Division."
|
||||
icon_state = "sifcop_helmet"
|
||||
armor = list(melee = 40, bullet = 30, laser = 30, energy = 10, bomb = 10, bio = 0, rad = 0)
|
||||
|
||||
/obj/item/clothing/head/helmet/laserproof
|
||||
name = "ablative helmet"
|
||||
desc = "It's a helmet specifically designed to protect against energy projectiles."
|
||||
@@ -136,6 +142,44 @@
|
||||
min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE
|
||||
siemens_coefficient = 0.5
|
||||
|
||||
/obj/item/clothing/head/helmet/heavy
|
||||
name = "heavy combat helmet"
|
||||
desc = "A heavily armoured helmet with built-in faceplate, built to withstand the rigours of modern combat."
|
||||
description_fluff = "Though a darling of Proxima Centuari Risk Control operatives, this type of high-grade enclosed combat helmet has two key drawbacks: 1. A somewhat limited field of view, which is often compensated for with cybernetics, and 2. It costs more than most mercenaries make in a year."
|
||||
icon_state = "heavy_combat"
|
||||
armor = list(melee = 70, bullet = 80, laser = 60, energy = 25, bomb = 40, bio = 0, rad = 0)
|
||||
siemens_coefficient = 0.5
|
||||
|
||||
/obj/item/clothing/head/helmet/heavy/knight
|
||||
desc = "An enclosed, heavily armoured ablative helmet modeled after a medieval greathelm."
|
||||
description_fluff = "The early 23rd century saw a surge in popularity for faux-medieval combat fashions, which was soon abandoned due to practical concerns and a growing desire for unified corporate security brand identities."
|
||||
flags_inv = HIDEEARS|HIDEEYES|BLOCKHEADHAIR
|
||||
icon_state = "knight_grey"
|
||||
armor = list(melee = 80, bullet = 50, laser = 40, energy = 20, bomb = 30, bio = 0, rad = 0)
|
||||
|
||||
/obj/item/clothing/head/helmet/newkyoto
|
||||
name = "\improper New Kyotan combat helmet"
|
||||
desc = "An armoured helmet. Pride of New Kyoto lawmen, dread of foreign spies."
|
||||
description_fluff = "Authentic examples of New Kyotan security gear are rare due to the independent nation's strict export restrictions. Fortunately, ubiquitous replicas are often equally effective."
|
||||
icon_state = "nkyoto"
|
||||
armor = list(melee = 50, bullet = 50, laser = 50, energy = 25, bomb = 20, bio = 0, rad = 0)
|
||||
siemens_coefficient = 0.5
|
||||
|
||||
/obj/item/clothing/head/helmet/tank
|
||||
name = "black tanker cap"
|
||||
desc = "A padded skullcup for those prone to bumping their heads against hard surfaces."
|
||||
icon_state = "tank"
|
||||
color = "#5f5f5f"
|
||||
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
|
||||
/obj/item/clothing/head/helmet/tank/olive
|
||||
name = "olive tanker cap"
|
||||
color = "#727c58"
|
||||
|
||||
/obj/item/clothing/head/helmet/tank/tan
|
||||
name = "tan tanker cap"
|
||||
color = "#ae9f79"
|
||||
|
||||
/obj/item/clothing/head/helmet/alien
|
||||
name = "alien helmet"
|
||||
desc = "It's quite larger than your head, but it might still protect it."
|
||||
@@ -175,7 +219,6 @@
|
||||
SPECIES_TAJ = 'icons/mob/species/tajaran/helmet.dmi',
|
||||
SPECIES_UNATHI = 'icons/mob/species/unathi/helmet.dmi',
|
||||
)
|
||||
|
||||
armor = list(melee = 60, bullet = 60, laser = 60, energy = 40, bomb = 40, bio = 0, rad = 0)
|
||||
flags_inv = HIDEEARS|BLOCKHAIR
|
||||
siemens_coefficient = 0.7
|
||||
@@ -224,3 +267,4 @@
|
||||
name = "emergency response team medical helmet"
|
||||
desc = "A set of armor worn by medical members of the NanoTrasen Emergency Response Team. Has red and white highlights."
|
||||
icon_state = "erthelmet_med"
|
||||
|
||||
|
||||
@@ -109,10 +109,10 @@
|
||||
desc = "Columbian Pure."
|
||||
|
||||
/obj/item/clothing/head/redcoat
|
||||
name = "redcoat's hat"
|
||||
name = "tricorne hat"
|
||||
icon_state = "redcoat"
|
||||
item_state_slots = list(slot_r_hand_str = "pirate", slot_l_hand_str = "pirate")
|
||||
desc = "<i>'I guess it's a redhead.'</i>"
|
||||
desc = "Stand and deliver!"
|
||||
body_parts_covered = 0
|
||||
|
||||
/obj/item/clothing/head/mailman
|
||||
@@ -463,6 +463,21 @@
|
||||
flags_inv = HIDEEYES
|
||||
body_parts_covered = HEAD|EYES
|
||||
|
||||
/obj/item/clothing/head/nonla
|
||||
name = "non la"
|
||||
desc = "A conical straw hat, used by those in tropical climates to protect the head from sweltering suns and heavy rains."
|
||||
icon_state = "nonla"
|
||||
item_state = "nonla"
|
||||
|
||||
/obj/item/clothing/head/buckethat
|
||||
name = "bucket hat"
|
||||
desc = "A hat with an all-around visor. Only slightly better than wearing an actual bucket."
|
||||
icon_state = "buckethat"
|
||||
icon_state = "buckethat"
|
||||
sprite_sheets = list(
|
||||
SPECIES_TAJARAN = 'icons/mob/species/tajaran/helmet.dmi'
|
||||
)
|
||||
|
||||
//Corporate Berets
|
||||
|
||||
/obj/item/clothing/head/beret/corp/saare
|
||||
|
||||
@@ -147,8 +147,10 @@
|
||||
/obj/item/clothing/head/ushanka
|
||||
name = "ushanka"
|
||||
desc = "Perfect for those cold winter nights."
|
||||
icon_state = "ushankadown"
|
||||
icon_state = "ushanka"
|
||||
flags_inv = HIDEEARS
|
||||
body_parts_covered = HEAD
|
||||
cold_protection = HEAD
|
||||
|
||||
/obj/item/clothing/head/ushanka/attack_self(mob/user as mob)
|
||||
if(src.icon_state == initial(icon_state))
|
||||
@@ -159,17 +161,17 @@
|
||||
to_chat(user, "You lower the ear flaps on the ushanka.")
|
||||
|
||||
/obj/item/clothing/head/ushanka/black
|
||||
icon_state = "blkushankadown"
|
||||
icon_state = "blkushanka"
|
||||
|
||||
/obj/item/clothing/head/ushanka/soviet
|
||||
name = "soviet ushanka"
|
||||
desc = "Perfect for winter in Siberia, da?"
|
||||
icon_state = "sovushankadown"
|
||||
icon_state = "sovushanka"
|
||||
|
||||
/obj/item/clothing/head/ushanka/hedberg
|
||||
name = "\improper Hedberg-Hammarstrom fur hat"
|
||||
desc = "An Hedberg-Hammarstrom private security ushanka."
|
||||
icon_state = "hedbergushankadown"
|
||||
icon_state = "hedbergushanka"
|
||||
|
||||
/*
|
||||
* Pumpkin head
|
||||
@@ -319,4 +321,4 @@
|
||||
w_class = 2
|
||||
body_parts_covered = HEAD
|
||||
attack_verb = list("warned", "cautioned", "smashed")
|
||||
armor = list("melee" = 5, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
armor = list("melee" = 5, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
|
||||
@@ -265,6 +265,11 @@
|
||||
desc = "An Sif Defense Force beret carrying insignia of the Anti-Piracy taskforce. For personnel that are more inclined towards style than safety."
|
||||
icon_state = "beret_black_patrol"
|
||||
|
||||
/obj/item/clothing/head/beret/solgov/sifguard/sifcop
|
||||
name = "\improper SifGuard Police Division beret"
|
||||
desc = "An Sif Defense Force beret carrying insignia of the civilian law enforcement division (SGPD). Standard issue."
|
||||
icon_state = "beret_sifcop"
|
||||
|
||||
/*
|
||||
* Fleet (Berets)
|
||||
*/
|
||||
@@ -325,22 +330,22 @@
|
||||
/obj/item/clothing/head/ushanka/solgov
|
||||
name = "\improper SifGuard fur hat"
|
||||
desc = "An Sif Defense Force synthfur-lined hat for operating in cold environments."
|
||||
icon_state = "sifguardushankadown"
|
||||
icon_state = "sifguardushanka"
|
||||
|
||||
/obj/item/clothing/head/ushanka/solgov/fleet
|
||||
name = "fleet fur hat"
|
||||
desc = "An SCG Fleet synthfur-lined hat for operating in cold environments."
|
||||
icon_state = "flushankadown"
|
||||
icon_state = "flushanka"
|
||||
|
||||
/obj/item/clothing/head/ushanka/solgov/marine
|
||||
name = "marine fur hat"
|
||||
desc = "An SCG Marine synthfur-lined hat for operating in cold environments."
|
||||
icon_state = "mar1ushankadown"
|
||||
icon_state = "mar1ushanka"
|
||||
|
||||
/obj/item/clothing/head/ushanka/solgov/marine/green
|
||||
name = "green marine fur hat"
|
||||
desc = "An SCG Marine synthfur-lined hat for operating in cold environments."
|
||||
icon_state = "mar2ushankadown"
|
||||
icon_state = "mar2ushanka"
|
||||
|
||||
/*
|
||||
* Almachi
|
||||
@@ -389,4 +394,4 @@
|
||||
desc = "An SCG Fleet beret carrying insignia of Fifth Fleet, the Quick Reaction Force, recently formed and outfited with last tech. For personnel that are more inclined towards style than safety."
|
||||
icon_state = "beret_navy_fifth"
|
||||
*
|
||||
*/
|
||||
*/
|
||||
|
||||
@@ -86,4 +86,4 @@
|
||||
/obj/item/clothing/suit/space/vox/medic
|
||||
name = "alien armour"
|
||||
icon_state = "vox-medic"
|
||||
desc = "An almost organic looking nonhuman pressure suit."
|
||||
desc = "An almost organic looking nonhuman pressure suit."
|
||||
|
||||
@@ -102,3 +102,17 @@
|
||||
icon_state = "syndicate-orange"
|
||||
desc = "A thin, ungainly softsuit colored in blaze orange for rescuers to easily locate, looks pretty fragile."
|
||||
slowdown = 2
|
||||
|
||||
//civilian recreational spacesuit
|
||||
|
||||
/obj/item/clothing/head/helmet/space/sports
|
||||
name = "performance sports space helmet"
|
||||
icon_state = "sports_void"
|
||||
desc = "A sleek space helmet for the civilian extra-vehicular extreme sports market. Please replace after any impact!"
|
||||
|
||||
/obj/item/clothing/suit/space/sports
|
||||
name = "performance sports spacesuit"
|
||||
desc = "A high-dexterity spacesuit for the civilian extra-vehicular extreme sports market, for when zero-g sports in controlled environments are just too tame."
|
||||
description_fluff = "Ward-Takahashi zero-gravity performance sportswear does not require an EVA certification to purchase, though user manuals do list it as 'recommended' on condition of a 2550 lawsuit."
|
||||
icon_state = "sports_void"
|
||||
slowdown = 0
|
||||
@@ -147,7 +147,7 @@
|
||||
|
||||
//Officer Crewsuit (GOLD, X)
|
||||
//The best of the bunch - at the time, this would have been almost cutting edge
|
||||
//Now it's good, but it's badly outclassed by the hot shit that the TSCs and such can get
|
||||
//Now it's good, but it's badly outclassed by the hot shit that the TSCs and such can get
|
||||
/obj/item/clothing/head/helmet/space/void/refurb/officer
|
||||
name = "vintage officer's voidsuit helmet"
|
||||
desc = "A refurbished early contact era voidsuit helmet of human design. These things aren't especially good against modern weapons but they're sturdy, incredibly easy to come by, and there are lots of spare parts for repairs. The visor has a bad habit of fogging up and collecting condensation, but it beats sucking hard vacuum. This variant appears to be an officer's, and has the best protection of all the old models."
|
||||
@@ -214,7 +214,7 @@
|
||||
/obj/item/gps,
|
||||
/obj/item/radio/beacon,
|
||||
)
|
||||
|
||||
|
||||
//Scientist Crewsuit (PURPLE, O)
|
||||
//Baseline values are slightly worse than the gray crewsuit, but it has significantly better Energy protection and is the only other suit with 100% rad immunity besides the engi suit
|
||||
/obj/item/clothing/head/helmet/space/void/refurb/research
|
||||
|
||||
@@ -43,4 +43,4 @@
|
||||
allowed = list(/obj/item/flashlight,/obj/item/tank,/obj/item/suit_cooling_unit,/obj/item/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/melee/energy/sword,/obj/item/handcuffs,/obj/item/material/twohanded/fireaxe,/obj/item/flamethrower)
|
||||
siemens_coefficient = 0.7
|
||||
breach_threshold = 18 //Super Extra Thicc
|
||||
slowdown = 1
|
||||
slowdown = 1
|
||||
@@ -0,0 +1,104 @@
|
||||
//Misc voidsuits
|
||||
|
||||
//Boarding ops.
|
||||
/obj/item/clothing/head/helmet/space/void/boarding_ops
|
||||
name = "boarding operations voidsuit helmet"
|
||||
desc = "A first generation armoured voidsuit helmet designed for variable-gravity boarding operations where heavier combat suits would leave the user vulnerable once within a pressurized environment."
|
||||
icon_state = "light_ops"
|
||||
armor = list(melee = 30, bullet = 35, laser = 35, energy = 5, bomb = 30, bio = 100, rad = 50)
|
||||
siemens_coefficient = 0.8
|
||||
|
||||
/obj/item/clothing/head/helmet/space/void/boarding_ops/mk2
|
||||
desc = "A second generation armoured voidsuit helmet designed for variable-gravity boarding operations where heavier combat suits would leave the user vulnerable once within a pressurized environment. This one has improved visibility at the cost of some plating."
|
||||
icon_state = "light_ops_mk2"
|
||||
armor = list(melee = 20, bullet = 30, laser = 40, energy = 5, bomb = 30, bio = 100, rad = 50)
|
||||
|
||||
/obj/item/clothing/suit/space/void/boarding_ops
|
||||
name = "boarding operations voidsuit"
|
||||
desc = "A moderately armoured voidsuit designed for variable-gravity boarding operations where heavier combat suits would leave the user vulnerable once within a pressurized environment."
|
||||
description_fluff = "Originally an Aether Atmospherics design intended for hazardous environment EVA, these lightweight armoured suits were adapted for combat use and for easy re-fabrication, making them a hit with pirates of both varieties."
|
||||
icon_state = "light_ops"
|
||||
armor = list(melee = 30, bullet = 35, laser = 35, energy = 5, bomb = 30, bio = 100, rad = 50)
|
||||
breach_threshold = 14 //These are kinda thicc
|
||||
resilience = 0.15 //Armored
|
||||
siemens_coefficient = 0.8
|
||||
allowed = list(/obj/item/gun,
|
||||
/obj/item/flashlight,
|
||||
/obj/item/tank,
|
||||
/obj/item/suit_cooling_unit,
|
||||
/obj/item/melee,
|
||||
/obj/item/grenade,
|
||||
/obj/item/flash,
|
||||
/obj/item/gps,
|
||||
/obj/item/radio/beacon,
|
||||
/obj/item/handcuffs,
|
||||
/obj/item/hailer,
|
||||
/obj/item/holowarrant,
|
||||
/obj/item/megaphone,
|
||||
/obj/item/ammo_magazine,
|
||||
/obj/item/cell
|
||||
)
|
||||
|
||||
//Tajaran Pearlshield Coalition Spacesuit
|
||||
/obj/item/clothing/head/helmet/space/void/pearlshield
|
||||
name = "Pearlshield Coalition space helmet"
|
||||
desc = "A rugged, utilitarian space helmet designed for the Pearlshield Coalition military by PCA."
|
||||
description_fluff = "Pearlshield Consolidated Armories is a collaborative organization of Tajaran arms manufacturers tasked with producing equipment for the intergovernmental Pearlshield Coalition, the Tajaran representative body on the galactic stage."
|
||||
icon_state = "pearlshield_void"
|
||||
armor = list(melee = 30, bullet = 40, laser = 40, energy = 20, bomb = 30, bio = 100, rad = 50)
|
||||
species_restricted = list(SPECIES_TAJ)
|
||||
|
||||
/obj/item/clothing/suit/space/void/pearlshield
|
||||
name = "Pearlshield Coalition voidsuit"
|
||||
desc = "A rugged, utilitarian spacesuit designed for the Pearlshield Coalition military by PCA."
|
||||
description_fluff = "Pearlshield Consolidated Armories is a collaborative organization of Tajaran arms manufacturers tasked with producing equipment for the intergovernmental Pearlshield Coalition, the Tajaran representative body on the galactic stage."
|
||||
icon_state = "pearlshield_void"
|
||||
armor = list(melee = 20, bullet = 20, laser = 20, energy = 50, bomb = 50, bio = 100, rad = 50)
|
||||
allowed = list(/obj/item/flashlight,/obj/item/tank,/obj/item/suit_cooling_unit,/obj/item/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/melee/energy/sword,/obj/item/handcuffs)
|
||||
species_restricted = list(SPECIES_TAJ)
|
||||
|
||||
//SCG Fleet Voidsuit(s)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/void/scg
|
||||
name = "Fleet voidsuit helmet"
|
||||
desc = "A standard issue SCG Marine armoured voidsuit helmet for use in hazardous environment combat scenarios."
|
||||
icon_state = "scg_void"
|
||||
armor = list(melee = 50, bullet = 50, laser = 30,energy = 15, bomb = 35, bio = 100, rad = 70)
|
||||
siemens_coefficient = 0.6
|
||||
|
||||
/obj/item/clothing/head/helmet/space/void/scg/heavy
|
||||
name = "heavy Fleet voidsuit helmet"
|
||||
desc = "A heavier version of the standard issue SCG Marine armoured voidsuit helmet for use in hazardous environment combat scenarios."
|
||||
icon_state = "scg_voidcombat"
|
||||
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 35, bio = 100, rad = 70)
|
||||
siemens_coefficient = 0.6
|
||||
|
||||
/obj/item/clothing/suit/space/void/scg
|
||||
name = "Fleet voidsuit"
|
||||
desc = "A standard issue SCG Marine armoured voidsuit for use in hazardous environment combat scenarios."
|
||||
icon_state = "scg_void"
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
armor = list(melee = 50, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 70)
|
||||
allowed = list(/obj/item/flashlight,/obj/item/tank,/obj/item/suit_cooling_unit,/obj/item/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/melee/energy/sword,/obj/item/handcuffs)
|
||||
siemens_coefficient = 0.6
|
||||
breach_threshold = 16 //Extra Thicc
|
||||
resilience = 0.05 //Military Armor
|
||||
|
||||
//Misc Armoured Space helmets
|
||||
|
||||
/obj/item/clothing/head/helmet/space/void/grayson
|
||||
name = "heavy mining helmet"
|
||||
desc = "An older model heavy-duty atmosphere-controlled mining helmet."
|
||||
description_fluff = "This armoured mining helmet was one of Grayson's best selling models before the advent rigsuit technology, and due to its relatively simple construction the design has remained in use for well over a century and is often adapted to function with the latest suits."
|
||||
icon_state = "grayson_helm"
|
||||
armor = list(melee = 60, bullet = 20, laser = 25, energy = 15, bomb = 55, bio = 100, rad = 50)
|
||||
siemens_coefficient = 0.8
|
||||
|
||||
/obj/item/clothing/head/helmet/space/void/hedberg
|
||||
name = "Hedberg-Hammarstrom combat helmet"
|
||||
desc = "A heavily armoured helmet with built-in faceplate, built to withstand the rigours of modern combat and equipped for space use."
|
||||
description_fluff = "The Hedberg-Hammarstrom company has operated Vir's military forces privately since 2566, but retains many of its unique armour designs exclusively for use in the private sector."
|
||||
icon_state = "hedberg_helmet"
|
||||
armor = list(melee = 70, bullet = 80, laser = 60, energy = 25, bomb = 40, bio = 100, rad = 0)
|
||||
siemens_coefficient = 0.8
|
||||
no_cycle = TRUE
|
||||
@@ -1,39 +1,47 @@
|
||||
/obj/item/clothing/under/color
|
||||
name = "purple jumpsuit"
|
||||
desc = "The latest in utilitarian fashion."
|
||||
icon_state = "purple"
|
||||
rolled_sleeves = 0
|
||||
rolled_down = 0
|
||||
|
||||
/obj/item/clothing/under/color/black
|
||||
name = "black jumpsuit"
|
||||
icon_state = "black"
|
||||
rolled_sleeves = 0
|
||||
|
||||
/obj/item/clothing/under/color/blackf
|
||||
name = "feminine black jumpsuit"
|
||||
name = "short black jumpsuit"
|
||||
desc = "It's very smart and in a ladies size!"
|
||||
icon_state = "black"
|
||||
icon_state = "blackf"
|
||||
worn_state = "blackf"
|
||||
rolled_sleeves = -1
|
||||
rolled_down = -1
|
||||
index = 1
|
||||
|
||||
/obj/item/clothing/under/color/blackjumpskirt
|
||||
name = "black jumpskirt"
|
||||
desc = "A slimming black jumpskirt."
|
||||
icon_state = "blackjumpskirt"
|
||||
item_state_slots = list(slot_r_hand_str = "black", slot_l_hand_str = "black")
|
||||
rolled_sleeves = -1
|
||||
rolled_down = -1
|
||||
index = 1
|
||||
|
||||
/obj/item/clothing/under/color/blue
|
||||
name = "blue jumpsuit"
|
||||
icon_state = "blue"
|
||||
rolled_sleeves = 0
|
||||
|
||||
/obj/item/clothing/under/color/green
|
||||
name = "green jumpsuit"
|
||||
icon_state = "green"
|
||||
rolled_sleeves = 0
|
||||
|
||||
/obj/item/clothing/under/color/grey
|
||||
name = "grey jumpsuit"
|
||||
icon_state = "grey"
|
||||
rolled_sleeves = 0
|
||||
|
||||
/obj/item/clothing/under/color/orange
|
||||
name = "orange jumpsuit"
|
||||
icon_state = "orange"
|
||||
rolled_sleeves = 0
|
||||
|
||||
/obj/item/clothing/under/color/prison
|
||||
name = "prison jumpsuit"
|
||||
@@ -45,22 +53,18 @@
|
||||
/obj/item/clothing/under/color/pink
|
||||
name = "pink jumpsuit"
|
||||
icon_state = "pink"
|
||||
rolled_sleeves = 0
|
||||
|
||||
/obj/item/clothing/under/color/red
|
||||
name = "red jumpsuit"
|
||||
icon_state = "red"
|
||||
rolled_sleeves = 0
|
||||
|
||||
/obj/item/clothing/under/color/white
|
||||
name = "white jumpsuit"
|
||||
icon_state = "white"
|
||||
rolled_sleeves = 0
|
||||
|
||||
/obj/item/clothing/under/color/yellow
|
||||
name = "yellow jumpsuit"
|
||||
icon_state = "yellow"
|
||||
rolled_sleeves = 0
|
||||
|
||||
/obj/item/clothing/under/psyche
|
||||
name = "psychedelic jumpsuit"
|
||||
@@ -69,75 +73,48 @@
|
||||
|
||||
/obj/item/clothing/under/color/lightblue
|
||||
name = "lightblue jumpsuit"
|
||||
desc = "A light blue jumpsuit."
|
||||
icon_state = "lightblue"
|
||||
item_state_slots = list(slot_r_hand_str = "blue", slot_l_hand_str = "blue")
|
||||
rolled_sleeves = 0
|
||||
|
||||
/obj/item/clothing/under/color/aqua
|
||||
name = "aqua jumpsuit"
|
||||
desc = "An aqua jumpsuit."
|
||||
icon_state = "aqua"
|
||||
item_state_slots = list(slot_r_hand_str = "blue", slot_l_hand_str = "blue")
|
||||
rolled_sleeves = 0
|
||||
|
||||
/obj/item/clothing/under/color
|
||||
name = "purple jumpsuit"
|
||||
desc = "The latest in space fashion."
|
||||
icon_state = "purple"
|
||||
rolled_sleeves = 0
|
||||
|
||||
/obj/item/clothing/under/color/lightpurple
|
||||
name = "lightpurple jumpsuit"
|
||||
desc = "A light purple jumpsuit."
|
||||
icon_state = "lightpurple"
|
||||
item_state_slots = list(slot_r_hand_str = "purple", slot_l_hand_str = "purple")
|
||||
rolled_sleeves = 0
|
||||
|
||||
/obj/item/clothing/under/color/lightgreen
|
||||
name = "lightgreen jumpsuit"
|
||||
desc = "A light green jumpsuit."
|
||||
icon_state = "lightgreen"
|
||||
item_state_slots = list(slot_r_hand_str = "green", slot_l_hand_str = "green")
|
||||
rolled_sleeves = 0
|
||||
|
||||
/obj/item/clothing/under/color/lightbrown
|
||||
name = "lightbrown jumpsuit"
|
||||
desc = "A light brown jumpsuit."
|
||||
icon_state = "lightbrown"
|
||||
rolled_sleeves = 0
|
||||
|
||||
/obj/item/clothing/under/color/brown
|
||||
name = "brown jumpsuit"
|
||||
desc = "A brown jumpsuit."
|
||||
icon_state = "brown"
|
||||
item_state_slots = list(slot_r_hand_str = "lightbrown", slot_l_hand_str = "lightbrown")
|
||||
rolled_sleeves = 0
|
||||
|
||||
/obj/item/clothing/under/color/yellowgreen
|
||||
name = "yellowgreen jumpsuit"
|
||||
desc = "A... yellow green jumpsuit?"
|
||||
icon_state = "yellowgreen"
|
||||
item_state_slots = list(slot_r_hand_str = "yellow", slot_l_hand_str = "yellow")
|
||||
rolled_sleeves = 0
|
||||
|
||||
/obj/item/clothing/under/color/darkblue
|
||||
name = "darkblue jumpsuit"
|
||||
desc = "A dark blue jumpsuit."
|
||||
icon_state = "darkblue"
|
||||
item_state_slots = list(slot_r_hand_str = "blue", slot_l_hand_str = "blue")
|
||||
rolled_sleeves = 0
|
||||
|
||||
/obj/item/clothing/under/color/lightred
|
||||
name = "lightred jumpsuit"
|
||||
desc = "A light red jumpsuit."
|
||||
icon_state = "lightred"
|
||||
item_state_slots = list(slot_r_hand_str = "red", slot_l_hand_str = "red")
|
||||
rolled_sleeves = 0
|
||||
|
||||
/obj/item/clothing/under/color/darkred
|
||||
name = "darkred jumpsuit"
|
||||
desc = "A dark red jumpsuit."
|
||||
icon_state = "darkred"
|
||||
item_state_slots = list(slot_r_hand_str = "red", slot_l_hand_str = "red")
|
||||
|
||||
/obj/item/clothing/under/colorable
|
||||
name = "plain jumpsuit"
|
||||
desc = "The latest in utilitarian fashion."
|
||||
icon_state = "colorable"
|
||||
rolled_sleeves = 0
|
||||
rolled_down = 0
|
||||
|
||||
@@ -56,12 +56,18 @@
|
||||
icon_state = "cargojf"
|
||||
|
||||
/obj/item/clothing/under/rank/chaplain
|
||||
desc = "It's a black jumpsuit, often worn by religious folk."
|
||||
desc = "It's a black jumpsuit, often worn by guidance staff."
|
||||
name = "chaplain's jumpsuit"
|
||||
icon_state = "chaplain"
|
||||
item_state_slots = list(slot_r_hand_str = "black", slot_l_hand_str = "black")
|
||||
rolled_sleeves = 0
|
||||
|
||||
/obj/item/clothing/under/rank/chaplain/alt
|
||||
name = "chaplain's striped jumpsuit"
|
||||
icon_state = "chaplain_alt"
|
||||
rolled_sleeves = -1
|
||||
index = 1
|
||||
|
||||
/obj/item/clothing/under/rank/chef
|
||||
desc = "It's an apron which is given only to the most <b>hardcore</b> chefs in space."
|
||||
name = "chef's uniform"
|
||||
@@ -116,15 +122,18 @@
|
||||
rolled_sleeves = 0
|
||||
|
||||
/obj/item/clothing/under/lawyer
|
||||
name = "baby blue suit"
|
||||
desc = "Slick threads."
|
||||
name = "lawyer suit"
|
||||
icon_state = "ress_suit"
|
||||
item_state_slots = list(slot_r_hand_str = "lightblue", slot_l_hand_str = "lightblue")
|
||||
|
||||
/obj/item/clothing/under/lawyer/black
|
||||
name = "black lawyer suit"
|
||||
name = "tacky black lawyer suit"
|
||||
icon_state = "lawyer_black"
|
||||
item_state_slots = list(slot_r_hand_str = "lawyer_black", slot_l_hand_str = "lawyer_black")
|
||||
|
||||
/obj/item/clothing/under/lawyer/black/skirt
|
||||
name = "black lawyer skirt"
|
||||
name = "tacky black lawyer skirt"
|
||||
icon_state = "lawyer_black_skirt"
|
||||
item_state_slots = list(slot_r_hand_str = "lawyer_black", slot_l_hand_str = "lawyer_black")
|
||||
|
||||
@@ -137,32 +146,36 @@
|
||||
name = "black modern suit"
|
||||
icon_state = "modern_suit_m"
|
||||
index = 1
|
||||
item_state_slots = list(slot_r_hand_str = "black", slot_l_hand_str = "black")
|
||||
|
||||
/obj/item/clothing/under/lawyer/modern/skirt
|
||||
name = "black modern skirt"
|
||||
icon_state = "modern_suit_f"
|
||||
index = 1
|
||||
item_state_slots = list(slot_r_hand_str = "black", slot_l_hand_str = "black")
|
||||
|
||||
/obj/item/clothing/under/lawyer/trimskirt
|
||||
name = "blue-trim skirt"
|
||||
icon_state = "trim_skirtsuit"
|
||||
index = 1
|
||||
|
||||
item_state_slots = list(slot_r_hand_str = "black", slot_l_hand_str = "black")
|
||||
/obj/item/clothing/under/lawyer/red
|
||||
name = "red lawyer suit"
|
||||
name = "tacky red suit"
|
||||
icon_state = "lawyer_red"
|
||||
item_state_slots = list(slot_r_hand_str = "lawyer_red", slot_l_hand_str = "lawyer_red")
|
||||
|
||||
/obj/item/clothing/under/lawyer/red/skirt
|
||||
name = "red lawyer skirt"
|
||||
name = "tacky red skirt"
|
||||
icon_state = "lawyer_red_skirt"
|
||||
item_state_slots = list(slot_r_hand_str = "lawyer_red", slot_l_hand_str = "lawyer_red")
|
||||
|
||||
/obj/item/clothing/under/lawyer/blue
|
||||
name = "blue lawyer suit"
|
||||
name = "tacky blue suit"
|
||||
icon_state = "lawyer_blue"
|
||||
item_state_slots = list(slot_r_hand_str = "lawyer_blue", slot_l_hand_str = "lawyer_blue")
|
||||
|
||||
/obj/item/clothing/under/lawyer/blue/skirt
|
||||
name = "blue lawyer skirt"
|
||||
name = "tacky blue skirt"
|
||||
icon_state = "lawyer_blue_skirt"
|
||||
item_state_slots = list(slot_r_hand_str = "lawyer_blue", slot_l_hand_str = "lawyer_blue")
|
||||
|
||||
@@ -170,12 +183,13 @@
|
||||
name = "blue suit"
|
||||
desc = "A classy suit."
|
||||
icon_state = "bluesuit"
|
||||
item_state_slots = list(slot_r_hand_str = "lawyer_blue", slot_l_hand_str = "lawyer_blue")
|
||||
item_state_slots = list(slot_r_hand_str = "blue", slot_l_hand_str = "blue")
|
||||
starting_accessories = list(/obj/item/clothing/accessory/tie/red)
|
||||
|
||||
/obj/item/clothing/under/lawyer/bluesuit/skirt
|
||||
name = "blue skirt suit"
|
||||
icon_state = "bluesuit_skirt"
|
||||
item_state_slots = list(slot_r_hand_str = "blue", slot_l_hand_str = "blue")
|
||||
|
||||
/obj/item/clothing/under/lawyer/purpsuit
|
||||
name = "purple suit"
|
||||
@@ -185,6 +199,7 @@
|
||||
/obj/item/clothing/under/lawyer/purpsuit/skirt
|
||||
name = "purple skirt suit"
|
||||
icon_state = "lawyer_purp_skirt"
|
||||
item_state_slots = list(slot_r_hand_str = "purple", slot_l_hand_str = "purple")
|
||||
|
||||
/obj/item/clothing/under/lawyer/oldman
|
||||
name = "Old Man's Suit"
|
||||
@@ -192,18 +207,64 @@
|
||||
icon_state = "oldman"
|
||||
item_state_slots = list(slot_r_hand_str = "johnny", slot_l_hand_str = "johnny")
|
||||
|
||||
/obj/item/clothing/under/lawyer/librarian
|
||||
name = "sensible suit"
|
||||
desc = "It's very... sensible."
|
||||
icon_state = "red_suit"
|
||||
item_state_slots = list(slot_r_hand_str = "red", slot_l_hand_str = "red")
|
||||
|
||||
/obj/item/clothing/under/lawyer/retro_tan
|
||||
name = "retro tan suit"
|
||||
desc = "Just one more thing."
|
||||
icon_state = "liaison_regular"
|
||||
item_state_slots = list(slot_r_hand_str = "lightbrown", slot_l_hand_str = "lightbrown")
|
||||
index = 1
|
||||
|
||||
/obj/item/clothing/under/lawyer/retro_white
|
||||
name = "retro white suit"
|
||||
desc = "Snappy!"
|
||||
icon_state = "liaison_formal"
|
||||
item_state_slots = list(slot_r_hand_str = "white", slot_l_hand_str = "white")
|
||||
index = 1
|
||||
|
||||
/obj/item/clothing/under/lawyer/retro_waistcoat
|
||||
name = "retro waistcoat"
|
||||
desc = "The spectre of CEOs past."
|
||||
icon_state = "manager_uniform"
|
||||
index = 1
|
||||
|
||||
/obj/item/clothing/under/lawyer/retro_suspenders
|
||||
name = "retro suspenders"
|
||||
desc = "The spectre of CEOs past."
|
||||
icon_state = "liaison_suspenders"
|
||||
index = 1
|
||||
|
||||
/obj/item/clothing/under/lawyer/retro_clerk
|
||||
name = "retro clerk's suit"
|
||||
desc = "The spectre of toadies past."
|
||||
icon_state = "trainee_uniform"
|
||||
index = 1
|
||||
|
||||
/obj/item/clothing/under/lawyer/powersuit_black
|
||||
name = "black and gold powersuit"
|
||||
desc = "Resonates corporate energy."
|
||||
icon_state = "director_uniform"
|
||||
item_state_slots = list(slot_r_hand_str = "lawyer_black", slot_l_hand_str = "lawyer_black")
|
||||
index = 1
|
||||
|
||||
/obj/item/clothing/under/lawyer/powersuit_grey
|
||||
name = "grey powersuit"
|
||||
desc = "Resonates corporate energy."
|
||||
icon_state = "stowaway_uniform"
|
||||
item_state_slots = list(slot_r_hand_str = "white", slot_l_hand_str = "white")
|
||||
index = 1
|
||||
|
||||
/obj/item/clothing/under/oldwoman
|
||||
name = "Old Woman's Attire"
|
||||
desc = "A typical outfit for the older woman, a lovely cardigan and comfortable skirt."
|
||||
icon_state = "oldwoman"
|
||||
item_state_slots = list(slot_r_hand_str = "johnny", slot_l_hand_str = "johnny")
|
||||
|
||||
/obj/item/clothing/under/librarian
|
||||
name = "sensible suit"
|
||||
desc = "It's very... sensible."
|
||||
icon_state = "red_suit"
|
||||
item_state_slots = list(slot_r_hand_str = "lawyer_red", slot_l_hand_str = "lawyer_red")
|
||||
|
||||
/obj/item/clothing/under/mime
|
||||
name = "mime's outfit"
|
||||
desc = "It's not very colourful."
|
||||
|
||||
@@ -114,6 +114,10 @@
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
|
||||
rolled_sleeves = 0
|
||||
|
||||
/obj/item/clothing/under/rank/medical/utility
|
||||
name = "medical utility jumpsuit"
|
||||
desc = "A hard-wearing version of the standard medical uniform, made with the same bioresistant lining. Designed for long term medical postings."
|
||||
icon_state = "medical_util"
|
||||
/obj/item/clothing/under/rank/medical/turtleneck
|
||||
name = "medical turtleneck"
|
||||
desc = "It's a stylish turtleneck made of bioresistant fiber. Look good, save lives- what more could you want?"
|
||||
|
||||
@@ -926,6 +926,12 @@ Uniforms and such
|
||||
icon_state = "cyberhell"
|
||||
index = 1
|
||||
|
||||
/obj/item/clothing/under/cyberpunkpants
|
||||
name = "cyberpunk split-side ensemble"
|
||||
desc = "Cyberpunk styled split-side pants and matching top. Just in time for the dystopian future."
|
||||
icon_state = "hart_jumpsuit"
|
||||
index = 1
|
||||
|
||||
/obj/item/clothing/under/blackngold
|
||||
name = "black and gold gown"
|
||||
desc = "A black and gold gown. You get the impression this is typically worn for religious purposes."
|
||||
@@ -1190,7 +1196,7 @@ Uniforms and such
|
||||
rolled_sleeves = 0
|
||||
|
||||
/obj/item/clothing/under/sifcop
|
||||
name = "\improper SifGuard law enforcement uniform"
|
||||
name = "\improper SifGuard Police Division uniform"
|
||||
desc = "A sturdy law enforcement uniform typical of Vir's civilian law enforcement officers."
|
||||
icon_state = "sifcop"
|
||||
worn_state = "sifcop"
|
||||
@@ -1211,6 +1217,12 @@ Uniforms and such
|
||||
icon_state = "retro_sweater"
|
||||
worn_state = "retro_sweater"
|
||||
|
||||
/obj/item/clothing/under/retro_outdoors
|
||||
name = "retro outsdoorwear"
|
||||
desc = "A puffer vest over utility pants, for when you're really rustic and want everybody to know it."
|
||||
icon_state = "liaison_outing"
|
||||
index = 1
|
||||
|
||||
/obj/item/clothing/under/hightrousers
|
||||
name = "high-waisted trousers"
|
||||
desc = "A waistline this high is just made for ripping bodices, swashing buckles, or - just occasionally - sucking blood."
|
||||
@@ -1307,4 +1319,4 @@ Uniforms and such
|
||||
unicolor = "orange"
|
||||
|
||||
/obj/item/clothing/under/ranger/yellow
|
||||
unicolor = "yellow"
|
||||
unicolor = "yellow"
|
||||
|
||||
@@ -133,7 +133,7 @@
|
||||
|
||||
/obj/item/clothing/under/teshari/undercoat
|
||||
name = "Undercoat"
|
||||
desc = "A Teshari traditional garb, with a modern twist! Made of micro and nanofibres to make it light and billowy, perfect for going fast and stylishly!"
|
||||
desc = "Teshari traditional garb, with a modern twist! Made of nanofibres to make it light and billowy, perfect for going fast and stylishly!"
|
||||
icon = 'icons/mob/species/teshari/teshari_uniform.dmi'
|
||||
icon_override = 'icons/mob/species/teshari/teshari_uniform.dmi'
|
||||
icon_state = "tesh_uniform_bo"
|
||||
@@ -263,126 +263,126 @@
|
||||
|
||||
/obj/item/clothing/under/teshari/undercoat/jobs/cap
|
||||
name = "facility director undercoat"
|
||||
desc = "A traditional Teshari garb made for the Facility Director"
|
||||
desc = "Traditional-style Teshari garb made for a Facility Director"
|
||||
icon_state = "tesh_uniform_cap"
|
||||
item_state = "tesh_uniform_cap"
|
||||
|
||||
/obj/item/clothing/under/teshari/undercoat/jobs/hop
|
||||
name = "head of personnel undercoat"
|
||||
desc = "A traditional Teshari garb made for the Head of Personnel"
|
||||
desc = "Traditional-style Teshari garb made for a Head of Personnel"
|
||||
icon_state = "tesh_uniform_hop"
|
||||
item_state = "tesh_uniform_hop"
|
||||
|
||||
/obj/item/clothing/under/teshari/undercoat/jobs/ce
|
||||
name = "cheif engineer undercoat"
|
||||
desc = "A traditional Teshari garb made for the Chief Engineer"
|
||||
name = "chief engineer undercoat"
|
||||
desc = "Traditional-style Teshari garb made for a Chief Engineer"
|
||||
icon_state = "tesh_uniform_ce"
|
||||
item_state = "tesh_uniform_ce"
|
||||
|
||||
/obj/item/clothing/under/teshari/undercoat/jobs/hos
|
||||
name = "head of security undercoat"
|
||||
desc = "A traditional Teshari garb made for the Head of Security"
|
||||
desc = "Traditional-style Teshari garb made for a Head of Security"
|
||||
icon_state = "tesh_uniform_hos"
|
||||
item_state = "tesh_uniform_hos"
|
||||
|
||||
/obj/item/clothing/under/teshari/undercoat/jobs/rd
|
||||
name = "research director undercoat"
|
||||
desc = "A traditional Teshari garb made for the Research Director"
|
||||
desc = "Traditional-style Teshari garb made for a Research Director"
|
||||
icon_state = "tesh_uniform_rd"
|
||||
item_state = "tesh_uniform_rd"
|
||||
|
||||
/obj/item/clothing/under/teshari/undercoat/jobs/engineer
|
||||
name = "engineering undercoat"
|
||||
desc = "A traditional Teshari garb made for the Engineering department"
|
||||
desc = "Traditional-style Teshari garb made for the Engineering department"
|
||||
icon_state = "tesh_uniform_engie"
|
||||
item_state = "tesh_uniform_engie"
|
||||
|
||||
/obj/item/clothing/under/teshari/undercoat/jobs/atmos
|
||||
name = "atmospherics undercoat"
|
||||
desc = "A traditional Teshari garb made for the Atmospheric Technician"
|
||||
desc = "Traditional-style Teshari garb made for an Atmospheric Technician"
|
||||
icon_state = "tesh_uniform_atmos"
|
||||
item_state = "tesh_uniform_atmos"
|
||||
|
||||
/obj/item/clothing/under/teshari/undercoat/jobs/cmo
|
||||
name = "chief medical officer undercoat"
|
||||
desc = "A traditional Teshari garb made for the Cheif Medical Officer"
|
||||
desc = "Traditional-style Teshari garb made for a Chief Medical Officer"
|
||||
icon_state = "tesh_uniform_cmo"
|
||||
item_state = "tesh_uniform_cmo"
|
||||
|
||||
/obj/item/clothing/under/teshari/undercoat/jobs/qm
|
||||
name = "quartermaster undercoat"
|
||||
desc = "A traditional Teshari garb made for the Quartermaster"
|
||||
desc = "Traditional-style Teshari garb made for a Quartermaster"
|
||||
icon_state = "tesh_uniform_qm"
|
||||
item_state = "tesh_uniform_qm"
|
||||
|
||||
/obj/item/clothing/under/teshari/undercoat/jobs/cargo
|
||||
name = "cargo undercoat"
|
||||
desc = "A traditional Teshari garb made for the Cargo department"
|
||||
desc = "Traditional-style Teshari garb made for the Cargo department"
|
||||
icon_state = "tesh_uniform_car"
|
||||
item_state = "tesh_uniform_car"
|
||||
|
||||
/obj/item/clothing/under/teshari/undercoat/jobs/mining
|
||||
name = "mining undercoat"
|
||||
desc = "A traditional Teshari garb made for Mining"
|
||||
desc = "Traditional-style Teshari garb made for Mining"
|
||||
icon_state = "tesh_uniform_mine"
|
||||
item_state = "tesh_uniform_mine"
|
||||
|
||||
/obj/item/clothing/under/teshari/undercoat/jobs/medical
|
||||
name = "medical undercoat"
|
||||
desc = "A traditional Teshari garb made for the Medical department"
|
||||
desc = "Traditional-style Teshari garb made for the Medical department"
|
||||
icon_state = "tesh_uniform_doc"
|
||||
item_state = "tesh_uniform_doc"
|
||||
|
||||
/obj/item/clothing/under/teshari/undercoat/jobs/chemistry
|
||||
name = "chemist undercoat"
|
||||
desc = "A traditional Teshari garb made for the Chemist"
|
||||
desc = "Traditional-style Teshari garb made for a Chemist"
|
||||
icon_state = "tesh_uniform_chem"
|
||||
item_state = "tesh_uniform_chem"
|
||||
|
||||
/obj/item/clothing/under/teshari/undercoat/jobs/viro
|
||||
name = "virologist undercoat"
|
||||
desc = "A traditional Teshari garb made for the Virologist"
|
||||
desc = "Traditional-style Teshari garb made for a Virologist"
|
||||
icon_state = "tesh_uniform_viro"
|
||||
item_state = "tesh_uniform_viro"
|
||||
|
||||
/obj/item/clothing/under/teshari/undercoat/jobs/psych
|
||||
name = "psychiatrist undercoat"
|
||||
desc = "A traditional Teshari garb made for the Psychiatrist"
|
||||
desc = "Traditional-style Teshari garb made for a Psychiatrist"
|
||||
icon_state = "tesh_uniform_psych"
|
||||
item_state = "tesh_uniform_psych"
|
||||
|
||||
/obj/item/clothing/under/teshari/undercoat/jobs/para
|
||||
name = "paramedic undercoat"
|
||||
desc = "A traditional Teshari garb made for the Paramedic"
|
||||
desc = "Traditional-style Teshari garb made for a Paramedic"
|
||||
icon_state = "tesh_uniform_para"
|
||||
item_state = "tesh_uniform_para"
|
||||
|
||||
/obj/item/clothing/under/teshari/undercoat/jobs/sci
|
||||
name = "scientist undercoat"
|
||||
desc = "A traditional Teshari garb made for the Science department"
|
||||
desc = "Traditional-style Teshari garb made for the Science department"
|
||||
icon_state = "tesh_uniform_sci"
|
||||
item_state = "tesh_uniform_sci"
|
||||
|
||||
/obj/item/clothing/under/teshari/undercoat/jobs/robo
|
||||
name = "roboticist undercoat"
|
||||
desc = "A traditional Teshari garb made for the Roboticist"
|
||||
desc = "Traditional-style Teshari garb made for the Roboticist"
|
||||
icon_state = "tesh_uniform_robo"
|
||||
item_state = "tesh_uniform_robo"
|
||||
|
||||
/obj/item/clothing/under/teshari/undercoat/jobs/sec
|
||||
name = "security undercoat"
|
||||
desc = "A traditional Teshari garb made for the Security department"
|
||||
desc = "Traditional-style Teshari garb made for the Security department"
|
||||
icon_state = "tesh_uniform_sec"
|
||||
item_state = "tesh_uniform_sec"
|
||||
|
||||
/obj/item/clothing/under/teshari/undercoat/jobs/service
|
||||
name = "service undercoat"
|
||||
desc = "A traditional Teshari garb made for the Service department"
|
||||
desc = "Traditional-style Teshari garb made for the Service department"
|
||||
icon_state = "tesh_uniform_serv"
|
||||
item_state = "tesh_uniform_serv"
|
||||
|
||||
/obj/item/clothing/under/teshari/undercoat/jobs/iaa
|
||||
name = "internal affairs undercoat"
|
||||
desc = "A traditional Teshari garb made for the Internal Affairs Agent"
|
||||
desc = "Traditional-style Teshari garb made for an Internal Affairs Agent"
|
||||
icon_state = "tesh_uniform_iaa"
|
||||
item_state = "tesh_uniform_iaa"
|
||||
|
||||
@@ -812,12 +812,10 @@
|
||||
product = new has_item_product(get_turf(user))
|
||||
else
|
||||
product = new /obj/item/reagent_containers/food/snacks/grown(get_turf(user),name)
|
||||
if(get_trait(TRAIT_PRODUCT_COLOUR))
|
||||
if(!istype(product, /mob))
|
||||
product.color = get_trait(TRAIT_PRODUCT_COLOUR)
|
||||
if(istype(product,/obj/item/reagent_containers/food))
|
||||
var/obj/item/reagent_containers/food/food = product
|
||||
food.filling_color = get_trait(TRAIT_PRODUCT_COLOUR)
|
||||
if (get_trait(TRAIT_PRODUCT_COLOUR))
|
||||
if (istype(product,/obj/item/reagent_containers/food))
|
||||
var/obj/item/reagent_containers/food/food = product
|
||||
food.filling_color = get_trait(TRAIT_PRODUCT_COLOUR)
|
||||
|
||||
if(mysterious)
|
||||
product.name += "?"
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
// You might be wondering why this isn't client level. If focus is null, we don't want you to move.
|
||||
// Only way to do that is to tie the behavior into the focus's keyLoop().
|
||||
|
||||
// THE TRADITIONAL STYLE FROM /TG (modified)
|
||||
|
||||
/atom/movable/keyLoop(client/user)
|
||||
var/must_call_move = FALSE
|
||||
var/movement_dir = MOVEMENT_KEYS_TO_DIR(user.move_keys_held)
|
||||
if(user.next_move_dir_add)
|
||||
must_call_move = TRUE // So that next_move_dir_add gets cleared if its time.
|
||||
movement_dir |= user.next_move_dir_add
|
||||
if(user.next_move_dir_sub)
|
||||
DEBUG_INPUT("[(user.next_move_dir_sub & movement_dir) ? "Actually" : "Want to"] subtract [dirs2text(user.next_move_dir_sub)] from [dirs2text(movement_dir)]")
|
||||
must_call_move = TRUE // So that next_move_dir_sub gets cleared if its time.
|
||||
movement_dir &= ~user.next_move_dir_sub
|
||||
|
||||
// Sanity checks in case you hold left and right and up to make sure you only go up
|
||||
if((movement_dir & (NORTH|SOUTH)) == (NORTH|SOUTH))
|
||||
movement_dir &= ~(NORTH|SOUTH)
|
||||
if((movement_dir & (EAST|WEST)) == (EAST|WEST))
|
||||
movement_dir &= ~(EAST|WEST)
|
||||
|
||||
#ifdef CARDINAL_INPUT_ONLY
|
||||
if(movement_dir & user.last_move_dir_pressed)
|
||||
movement_dir = user.last_move_dir_pressed
|
||||
else if (movement_dir == NORTHEAST || movement_dir == NORTHWEST)
|
||||
DEBUG_INPUT("overriding to NORTH: movement_dir=[dirs2text(movement_dir)] last=[dirs2text(user.last_move_dir_pressed)]")
|
||||
movement_dir = NORTH
|
||||
else if (movement_dir == SOUTHEAST || movement_dir == SOUTHWEST)
|
||||
DEBUG_INPUT("overriding to SOUTH: movement_dir=[dirs2text(movement_dir)] last=[dirs2text(user.last_move_dir_pressed)]")
|
||||
movement_dir = SOUTH
|
||||
#endif
|
||||
|
||||
// Compensate for client camera spinning (client.dir) so our movement still makes sense I guess.
|
||||
if(movement_dir) // Only compensate if non-zero, as byond will auto-fill dir otherwise
|
||||
movement_dir = turn(movement_dir, -dir2angle(user.dir))
|
||||
|
||||
// Move, but only if we actually are planing to move, or we need to clear the next move vars
|
||||
if(movement_dir || must_call_move)
|
||||
user.Move(get_step(src, movement_dir), movement_dir)
|
||||
@@ -0,0 +1,77 @@
|
||||
// TODO - Optimize this into numerics if this ends up working out
|
||||
var/global/list/MOVE_KEY_MAPPINGS = list(
|
||||
"North" = NORTH_KEY,
|
||||
"South" = SOUTH_KEY,
|
||||
"East" = EAST_KEY,
|
||||
"West" = WEST_KEY,
|
||||
"W" = W_KEY,
|
||||
"A" = A_KEY,
|
||||
"S" = S_KEY,
|
||||
"D" = D_KEY,
|
||||
"Shift" = SHIFT_KEY,
|
||||
"Ctrl" = CTRL_KEY,
|
||||
"Alt" = ALT_KEY,
|
||||
)
|
||||
|
||||
// These verbs are called for all movemen key press and release events
|
||||
/client/verb/moveKeyDown(movekeyName as text)
|
||||
set instant = TRUE
|
||||
set hidden = TRUE
|
||||
// set name = ".movekeydown"
|
||||
set name = "KeyDown"
|
||||
|
||||
// Map text sent by skin.dmf to our numeric codes. (This can be optimized away once we update skin.dmf)
|
||||
var/movekey = MOVE_KEY_MAPPINGS[movekeyName]
|
||||
|
||||
// Validate input. Must be one (and only one) of the key codes)
|
||||
if(isnull(movekey) || (movekey & ~0xFFF) || (movekey & (movekey - 1)))
|
||||
log_debug("Client [ckey] sent an illegal movement key down: [movekeyName] ([movekey])")
|
||||
return
|
||||
|
||||
// Record that we are now holding the key!
|
||||
move_keys_held |= (movekey & 0x0FF)
|
||||
mod_keys_held |= (movekey & 0xF00)
|
||||
|
||||
// If we were NOT holding at the start of this move cycle and pressed it, remember that.
|
||||
var/movement = MOVEMENT_KEYS_TO_DIR(movekey)
|
||||
if(movement && !(next_move_dir_sub & movement) && !(mod_keys_held & CTRL_KEY)) // TODO-LESHANA - Possibly not holding Alt either
|
||||
DEBUG_INPUT("Saving [dirs2text(movement)] into next_move_dir_ADD")
|
||||
next_move_dir_add |= movement
|
||||
|
||||
#ifdef CARDINAL_INPUT_ONLY
|
||||
if(movement)
|
||||
DEBUG_INPUT("set last=[dirs2text(movement)]")
|
||||
last_move_dir_pressed = movement
|
||||
#endif
|
||||
|
||||
mob.focus?.key_down(movekey, src)
|
||||
|
||||
/client/verb/moveKeyUp(movekeyName as text)
|
||||
set instant = TRUE
|
||||
set hidden = TRUE
|
||||
// set name = ".movekeyup"
|
||||
set name = "KeyUp"
|
||||
|
||||
// Map text sent by skin.dmf to our numeric codes. (This can be optimized away once we update skin.dmf)
|
||||
var/movekey = MOVE_KEY_MAPPINGS[movekeyName]
|
||||
|
||||
// Validate input. Must be one (and only one) of the key codes)
|
||||
if(isnull(movekey) || (movekey & ~0xFFF) || (movekey & (movekey - 1)))
|
||||
log_debug("Client [ckey] sent an illegal movement key up: [movekeyName] ([movekey])")
|
||||
return
|
||||
|
||||
// Clear bit indicating we were holding the key
|
||||
move_keys_held &= ~movekey
|
||||
mod_keys_held &= ~movekey
|
||||
|
||||
// If we were holding at the start of this move cycle and now relased it, remember that.
|
||||
var/movement = MOVEMENT_KEYS_TO_DIR(movekey)
|
||||
if(movement && !(next_move_dir_add & movement))
|
||||
DEBUG_INPUT("Saving [dirs2text(movement)] into next_move_dir_SUB")
|
||||
next_move_dir_sub |= movement
|
||||
|
||||
mob.focus?.key_up(movekey, src)
|
||||
|
||||
// Called every game tick
|
||||
/client/keyLoop()
|
||||
mob.focus?.keyLoop(src)
|
||||
@@ -0,0 +1,42 @@
|
||||
# In-code keypress handling system
|
||||
|
||||
This whole system is heavily based off of forum_account's keyboard library.
|
||||
Thanks to forum_account for saving the day, the library can be found
|
||||
[here](https://secure.byond.com/developer/Forum_account/Keyboard)!
|
||||
|
||||
.dmf macros have some very serious shortcomings. For example, they do not allow reusing parts
|
||||
of one macro in another, so giving cyborgs their own shortcuts to swap active module couldn't
|
||||
inherit the movement that all mobs should have anyways. The webclient only supports one macro,
|
||||
so having more than one was problematic. Additionally each keybind has to call an actual
|
||||
verb, which meant a lot of hidden verbs that just call one other proc. Also our existing
|
||||
macro was really bad and tied unrelated behavior into `Northeast()`, `Southeast()`, `Northwest()`,
|
||||
and `Southwest()`.
|
||||
|
||||
The basic premise of this system is to not screw with .dmf macro setup at all and handle
|
||||
pressing those keys in the code instead. We have every key call `client.keyDown()`
|
||||
or `client.keyUp()` with the pressed key as an argument. Certain keys get processed
|
||||
directly by the client because they should be doable at any time, then we call
|
||||
`keyDown()` or `keyUp()` on the client's holder and the client's mob's focus.
|
||||
By default `mob.focus` is the mob itself, but you can set it to any datum to give control of a
|
||||
client's keypresses to another object. This would be a good way to handle a menu or driving
|
||||
a mech. You can also set it to null to disregard input from a certain user.
|
||||
|
||||
Movement is handled by having each client call `client.keyLoop()` every game tick.
|
||||
As above, this calls holder and `focus.keyLoop()`. `atom/movable/keyLoop()` handles movement
|
||||
Try to keep the calculations in this proc light. It runs every tick for every client after all!
|
||||
|
||||
You can also tell which keys are being held down now. Each client a list of keys pressed called
|
||||
`keys_held`. Each entry is a key as a text string associated with the world.time when it was
|
||||
pressed.
|
||||
|
||||
No client-set keybindings at this time, but it shouldn't be too hard if someone wants.
|
||||
|
||||
Notes about certain keys:
|
||||
|
||||
* `Tab` has client-sided behavior but acts normally
|
||||
* `T`, `O`, and `M` move focus to the input when pressed. This fires the keyUp macro right away.
|
||||
* `\` needs to be escaped in the dmf so any usage is `\\`
|
||||
|
||||
You cannot `TICK_CHECK` or check `world.tick_usage` inside of procs called by key down and up
|
||||
events. They happen outside of a byond tick and have no meaning there. Key looping
|
||||
works correctly since it's part of a subsystem, not direct input.
|
||||
@@ -0,0 +1,49 @@
|
||||
// Set a client's focus to an object and override these procs on that object to let it handle keypresses
|
||||
|
||||
/// Called when a key is pressed down initially
|
||||
/datum/proc/key_down(key, client/user)
|
||||
return
|
||||
|
||||
/// Called when a key is released
|
||||
/datum/proc/key_up(key, client/user)
|
||||
return
|
||||
|
||||
/// Called once every server tick
|
||||
/datum/proc/keyLoop(client/user)
|
||||
set waitfor = FALSE
|
||||
return
|
||||
|
||||
/// Set mob's focus. TODO: Decide if required.
|
||||
/mob/proc/set_focus(datum/new_focus)
|
||||
if(focus == new_focus)
|
||||
return
|
||||
focus = new_focus
|
||||
|
||||
/// Turns a keys bitfield into text showing all bits set
|
||||
/proc/keys2text(keys)
|
||||
if(!keys)
|
||||
return ""
|
||||
var/list/out = list()
|
||||
if(keys & NORTH_KEY)
|
||||
out += "NORTH"
|
||||
if(keys & SOUTH_KEY)
|
||||
out += "SOUTH"
|
||||
if(keys & EAST_KEY)
|
||||
out += "EAST"
|
||||
if(keys & WEST_KEY)
|
||||
out += "WEST"
|
||||
if(keys & W_KEY)
|
||||
out += "W"
|
||||
if(keys & A_KEY)
|
||||
out += "A"
|
||||
if(keys & S_KEY)
|
||||
out += "S"
|
||||
if(keys & D_KEY)
|
||||
out += "D"
|
||||
if(keys & CTRL_KEY)
|
||||
out += "CTRL"
|
||||
if(keys & SHIFT_KEY)
|
||||
out += "SHIFT"
|
||||
if(keys & ALT_KEY)
|
||||
out += "ALT"
|
||||
return out.Join(" ")
|
||||
@@ -249,11 +249,17 @@
|
||||
++frustration
|
||||
return
|
||||
|
||||
/mob/living/bot/proc/handleFrustrated(var/targ)
|
||||
obstacle = targ ? target_path[1] : patrol_path[1]
|
||||
|
||||
/mob/living/bot/proc/handleFrustrated(has_target)
|
||||
obstacle = null
|
||||
if (has_target)
|
||||
if (length(target_path))
|
||||
obstacle = target_path[1]
|
||||
else if (length(patrol_path))
|
||||
obstacle = patrol_path[1]
|
||||
target_path = list()
|
||||
patrol_path = list()
|
||||
return
|
||||
|
||||
|
||||
/mob/living/bot/proc/lookForTargets()
|
||||
return
|
||||
|
||||
@@ -187,7 +187,7 @@
|
||||
flick("mulebot-emagged", src)
|
||||
update_icons()
|
||||
|
||||
/mob/living/bot/mulebot/handleFrustrated()
|
||||
/mob/living/bot/mulebot/handleFrustrated(has_target)
|
||||
custom_emote(2, "makes a sighing buzz.")
|
||||
playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 0)
|
||||
..()
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
/mob/living
|
||||
see_invisible = SEE_INVISIBLE_LIVING
|
||||
|
||||
appearance_flags = TILE_BOUND|PIXEL_SCALE|KEEP_TOGETHER|LONG_GLIDE
|
||||
|
||||
//Health and life related vars
|
||||
var/maxHealth = 100 //Maximum health that should be possible. Avoid adjusting this if you can, and instead use modifiers datums.
|
||||
var/health = 100 //A mob's health
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
|
||||
|
||||
/mob/CanPass(atom/movable/mover, turf/target)
|
||||
if(ismob(mover))
|
||||
var/mob/moving_mob = mover
|
||||
@@ -147,7 +149,15 @@ default behaviour is:
|
||||
now_pushing = 0
|
||||
return
|
||||
|
||||
step(AM, t)
|
||||
var/turf/T = AM.loc
|
||||
var/turf/T2 = get_step(AM,t)
|
||||
if(!T2) // Map edge
|
||||
now_pushing = 0
|
||||
return
|
||||
var/move_time = movement_delay(loc, t) * SQRT_TWO
|
||||
move_time = DS2NEARESTTICK(move_time)
|
||||
if(AM.Move(T2, t, move_time))
|
||||
Move(T, t, move_time)
|
||||
|
||||
if(ishuman(AM) && AM:grabbed_by)
|
||||
for(var/obj/item/grab/G in AM:grabbed_by)
|
||||
|
||||
@@ -40,6 +40,7 @@
|
||||
else
|
||||
living_mob_list += src
|
||||
lastarea = get_area(src)
|
||||
set_focus(src) // Key Handling
|
||||
update_transform() // Some mobs may start bigger or smaller than normal.
|
||||
return ..()
|
||||
|
||||
@@ -691,6 +692,7 @@
|
||||
|
||||
/mob/proc/facedir(var/ndir)
|
||||
if(!canface() || (client && (client.moving || !checkMoveCooldown())))
|
||||
DEBUG_INPUT("Denying Facedir for [src] (moving=[client?.moving])")
|
||||
return 0
|
||||
set_dir(ndir)
|
||||
if(buckled && buckled.buckle_movable)
|
||||
@@ -1192,4 +1194,4 @@
|
||||
/mob/proc/handle_reagent_transfer(var/datum/reagents/holder, var/amount = 1, var/chem_type = CHEM_BLOOD, var/multiplier = 1, var/copy = 0)
|
||||
var/datum/reagents/R = new /datum/reagents(amount)
|
||||
. = holder.trans_to_holder(R, amount, multiplier, copy)
|
||||
R.touch_mob(src)
|
||||
R.touch_mob(src)
|
||||
@@ -223,3 +223,4 @@
|
||||
var/registered_z
|
||||
|
||||
var/in_enclosed_vehicle = 0 //For mechs and fighters ambiance. Can be used in other cases.
|
||||
var/datum/focus //What receives our keyboard inputs. src by default
|
||||
@@ -137,25 +137,36 @@
|
||||
// Used many times below, faster reference.
|
||||
var/atom/loc = my_mob.loc
|
||||
|
||||
// We're controlling an object which is SOMEHOW DIFFERENT FROM AN EYE??
|
||||
// We're controlling an object which is when admins possess an object.
|
||||
if(my_mob.control_object)
|
||||
Move_object(direct)
|
||||
|
||||
// Ghosty mob movement
|
||||
if(my_mob.incorporeal_move && isobserver(my_mob))
|
||||
Process_Incorpmove(direct)
|
||||
DEBUG_INPUT("--------")
|
||||
next_move_dir_add = 0 // This one I *think* exists so you can tap move and it will move even if delay isn't quite up.
|
||||
next_move_dir_sub = 0 // I'm not really sure why next_move_dir_sub even exists.
|
||||
return
|
||||
|
||||
// We're in the middle of another move we've already decided to do
|
||||
if(moving)
|
||||
log_debug("Client [src] attempted to move while moving=[moving]")
|
||||
return 0
|
||||
|
||||
// We're still cooling down from the last move
|
||||
if(!my_mob.checkMoveCooldown())
|
||||
return
|
||||
DEBUG_INPUT("--------")
|
||||
next_move_dir_add = 0 // This one I *think* exists so you can tap move and it will move even if delay isn't quite up.
|
||||
next_move_dir_sub = 0 // I'm not really sure why next_move_dir_sub even exists.
|
||||
|
||||
if(!n || !direct)
|
||||
return
|
||||
|
||||
// If dead and we try to move in our mob, it leaves our body
|
||||
if(my_mob.stat == DEAD && isliving(my_mob) && !my_mob.forbid_seeing_deadchat)
|
||||
my_mob.setMoveCooldown(my_mob.movement_delay(n, direct))
|
||||
my_mob.ghostize()
|
||||
return
|
||||
|
||||
@@ -284,6 +295,10 @@
|
||||
else
|
||||
. = my_mob.SelfMove(n, direct, total_delay)
|
||||
|
||||
// If we ended up moving diagonally, increase delay.
|
||||
if((direct & (direct - 1)) && mob.loc == n)
|
||||
my_mob.setMoveCooldown(total_delay * 2)
|
||||
|
||||
// If we have a grab
|
||||
var/list/grablist = my_mob.ret_grab()
|
||||
if(LAZYLEN(grablist))
|
||||
|
||||
@@ -208,7 +208,7 @@
|
||||
if(throwing)
|
||||
return
|
||||
|
||||
if(can_fall())
|
||||
if(can_fall() && can_fall_to(below))
|
||||
// We spawn here to let the current move operation complete before we start falling. fall() is normally called from
|
||||
// Entered() which is part of Move(), by spawn()ing we let that complete. But we want to preserve if we were in client movement
|
||||
// or normal movement so other move behavior can continue.
|
||||
@@ -278,6 +278,17 @@
|
||||
/obj/structure/catwalk/CheckFall(var/atom/movable/falling_atom)
|
||||
return falling_atom.fall_impact(src)
|
||||
|
||||
/atom/movable/proc/can_fall_to(turf/landing)
|
||||
// Check if there is anything in our turf we are standing on to prevent falling.
|
||||
for(var/obj/O in loc)
|
||||
if(!O.CanFallThru(src, landing))
|
||||
return FALSE
|
||||
// See if something in turf below prevents us from falling into it.
|
||||
for(var/atom/A in landing)
|
||||
if(!A.CanPass(src, src.loc, 1, 0))
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/structure/lattice/CanFallThru(atom/movable/mover as mob|obj, turf/target as turf)
|
||||
if(target.z >= z)
|
||||
return TRUE // We don't block sideways or upward movement.
|
||||
@@ -298,15 +309,6 @@
|
||||
/atom/movable/proc/handle_fall(var/turf/landing)
|
||||
var/turf/oldloc = loc
|
||||
|
||||
// Check if there is anything in our turf we are standing on to prevent falling.
|
||||
for(var/obj/O in loc)
|
||||
if(!O.CanFallThru(src, landing))
|
||||
return FALSE
|
||||
// See if something in turf below prevents us from falling into it.
|
||||
for(var/atom/A in landing)
|
||||
if(!A.CanPass(src, src.loc, 1, 0))
|
||||
return FALSE
|
||||
|
||||
// Now lets move there!
|
||||
if(!Move(landing))
|
||||
return 1
|
||||
|
||||
@@ -445,6 +445,25 @@ var/global/const/standard_monitor_styles = "blank=ipc_blank;\
|
||||
parts = list(BP_L_ARM, BP_R_ARM, BP_L_HAND, BP_R_HAND, BP_L_LEG, BP_R_LEG, BP_L_FOOT, BP_R_FOOT)
|
||||
modular_bodyparts = MODULAR_BODYPART_PROSTHETIC
|
||||
|
||||
/datum/robolimb/wooden/teshari
|
||||
company = "Morgan Trading Co - Teshari"
|
||||
icon = 'icons/mob/human_races/cyberlimbs/prosthesis/wooden_teshari.dmi'
|
||||
species_cannot_use = list(SPECIES_UNATHI, SPECIES_PROMETHEAN, SPECIES_DIONA, SPECIES_HUMAN, SPECIES_VOX, SPECIES_HUMAN_VATBORN, SPECIES_TAJ, SPECIES_SKRELL, SPECIES_ZADDAT)
|
||||
species_alternates = list(SPECIES_HUMAN = "Morgan Trading Co")
|
||||
suggested_species = SPECIES_TESHARI
|
||||
|
||||
/datum/robolimb/wooden/sif
|
||||
company = "Morgan Trading Co - Sif wood"
|
||||
desc = "A simplistic, metal-banded, wood-panelled prosthetic. This one is covered in Sivian wood!"
|
||||
icon = 'icons/mob/human_races/cyberlimbs/prosthesis/wooden_sif.dmi'
|
||||
|
||||
/datum/robolimb/wooden/sif/teshari
|
||||
company = "Morgan Trading Co - Sif wood - Teshari"
|
||||
icon = 'icons/mob/human_races/cyberlimbs/prosthesis/wooden_sif_teshari.dmi'
|
||||
species_cannot_use = list(SPECIES_UNATHI, SPECIES_PROMETHEAN, SPECIES_DIONA, SPECIES_HUMAN, SPECIES_VOX, SPECIES_HUMAN_VATBORN, SPECIES_TAJ, SPECIES_SKRELL, SPECIES_ZADDAT)
|
||||
species_alternates = list(SPECIES_HUMAN = "Morgan Trading Co")
|
||||
suggested_species = SPECIES_TESHARI
|
||||
|
||||
/obj/item/disk/limb
|
||||
name = "Limb Blueprints"
|
||||
desc = "A disk containing the blueprints for prosthetics."
|
||||
|
||||
@@ -244,6 +244,7 @@
|
||||
/obj/item/crossbowframe
|
||||
name = "crossbow frame"
|
||||
desc = "A half-finished crossbow."
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon_state = "crossbowframe0"
|
||||
item_state = "crossbow-solid"
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 243 KiB After Width: | Height: | Size: 255 KiB |
|
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 55 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 760 B |
|
After Width: | Height: | Size: 763 B |
|
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 77 KiB |
|
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 78 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 196 KiB After Width: | Height: | Size: 205 KiB |
|
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 65 KiB |
|
Before Width: | Height: | Size: 120 KiB After Width: | Height: | Size: 122 KiB |
|
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 102 KiB After Width: | Height: | Size: 103 KiB |
|
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 63 KiB |
|
Before Width: | Height: | Size: 114 KiB After Width: | Height: | Size: 116 KiB |
|
Before Width: | Height: | Size: 364 KiB After Width: | Height: | Size: 357 KiB |
|
Before Width: | Height: | Size: 83 KiB After Width: | Height: | Size: 96 KiB |
|
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 47 KiB |
|
Before Width: | Height: | Size: 148 KiB After Width: | Height: | Size: 139 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 83 KiB After Width: | Height: | Size: 67 KiB |
|
Before Width: | Height: | Size: 113 KiB After Width: | Height: | Size: 127 KiB |
|
Before Width: | Height: | Size: 71 KiB After Width: | Height: | Size: 73 KiB |
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 73 KiB After Width: | Height: | Size: 71 KiB |
|
Before Width: | Height: | Size: 100 KiB After Width: | Height: | Size: 107 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 14 KiB |