Merge branch 'master' of https://github.com/PolarisSS13/Polaris into flan

This commit is contained in:
Cerebulon
2022-10-09 18:56:50 +01:00
133 changed files with 11158 additions and 1478 deletions
+12 -1
View File
@@ -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
+29
View File
@@ -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))
+47 -3
View File
@@ -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"
+17 -2
View File
@@ -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
+7 -5
View File
@@ -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)
+10 -5
View File
@@ -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"
*
*/
*/
+1 -1
View File
@@ -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
+21 -44
View File
@@ -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
+77 -16
View File
@@ -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?"
+14 -2
View File
@@ -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"
+23 -23
View File
@@ -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"
+4 -6
View File
@@ -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 += "?"
+40
View File
@@ -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)
+42
View File
@@ -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.
+49
View File
@@ -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(" ")
+9 -3
View File
@@ -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
+1 -1
View File
@@ -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
+11 -1
View File
@@ -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)
+3 -1
View File
@@ -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)
+1
View File
@@ -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
+16 -1
View File
@@ -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))
+12 -10
View File
@@ -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
+19
View File
@@ -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"