mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-18 19:44:58 +01:00
MODsuits (#59109)
This commit is contained in:
@@ -650,7 +650,6 @@ GLOBAL_PROTECT(admin_verbs_hideable)
|
||||
|
||||
if(robeless)
|
||||
new_spell.clothes_req = FALSE
|
||||
new_spell.cult_req = FALSE
|
||||
|
||||
if(spell_recipient.mind)
|
||||
spell_recipient.mind.AddSpell(new_spell)
|
||||
|
||||
@@ -33,7 +33,6 @@ GLOBAL_LIST_INIT_TYPED(sdql_spells, /obj/effect/proc_holder/spell, list())
|
||||
"charge_type",
|
||||
"clothes_req",
|
||||
"cone_level",
|
||||
"cult_req",
|
||||
"deactive_msg",
|
||||
"desc",
|
||||
"drawmessage",
|
||||
@@ -211,7 +210,6 @@ GLOBAL_LIST_INIT_TYPED(sdql_spells, /obj/effect/proc_holder/spell, list())
|
||||
If this is set to anything else, the variable with the appropriate name will be modified.",
|
||||
"holder_var_amount" = "The amount of damage taken, the duration of status effect inflicted, or the change made to any other variable.",
|
||||
"clothes_req" = "Whether the user has to be wearing wizard robes to cast the spell.",
|
||||
"cult_req" = "Whether the user has to be wearing cult robes to cast the spell.",
|
||||
"human_req" = "Whether the user has to be a human to cast the spell. Redundant when clothes_req is true.",
|
||||
"nonabstract_req" = "If this is true, the spell cannot be cast by brains and pAIs.",
|
||||
"stat_allowed" = "Whether the spell can be cast if the user is unconscious or dead.",
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
//Strained Muscles: Temporary speed boost at the cost of rapid damage
|
||||
//Limited because of hardsuits and such; ideally, used for a quick getaway
|
||||
//Limited because of space suits and such; ideally, used for a quick getaway
|
||||
|
||||
/datum/action/changeling/strained_muscles
|
||||
name = "Strained Muscles"
|
||||
desc = "We evolve the ability to reduce the acid buildup in our muscles, allowing us to move much faster."
|
||||
helptext = "The strain will make us tired, and we will rapidly become fatigued. Standard weight restrictions, like hardsuits, still apply. Cannot be used in lesser form."
|
||||
helptext = "The strain will make us tired, and we will rapidly become fatigued. Standard weight restrictions, like space suits, still apply. Cannot be used in lesser form."
|
||||
button_icon_state = "strained_muscles"
|
||||
chemical_cost = 0
|
||||
dna_cost = 1
|
||||
|
||||
@@ -390,28 +390,34 @@ Striking a noncultist, however, will tear their flesh."}
|
||||
armor = list(MELEE = 50, BULLET = 30, LASER = 50,ENERGY = 50, BOMB = 25, BIO = 10, FIRE = 10, ACID = 10)
|
||||
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/cult
|
||||
/obj/item/clothing/suit/hooded/cultrobes/hardened
|
||||
name = "\improper Nar'Sien hardened armor"
|
||||
desc = "A heavily-armored exosuit worn by warriors of the Nar'Sien cult. It can withstand hard vacuum."
|
||||
icon_state = "cult_armor"
|
||||
inhand_icon_state = "cult_armor"
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
allowed = list(/obj/item/tome, /obj/item/melee/cultblade, /obj/item/tank/internals)
|
||||
armor = list(MELEE = 50, BULLET = 40, LASER = 50, ENERGY = 60, BOMB = 50, BIO = 30, FIRE = 100, ACID = 100)
|
||||
hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/hardened
|
||||
clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL
|
||||
flags_inv = HIDEGLOVES | HIDESHOES | HIDEJUMPSUIT
|
||||
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
|
||||
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
|
||||
resistance_flags = NONE
|
||||
|
||||
/obj/item/clothing/head/hooded/cult_hoodie/hardened
|
||||
name = "\improper Nar'Sien hardened helmet"
|
||||
desc = "A heavily-armored helmet worn by warriors of the Nar'Sien cult. It can withstand hard vacuum."
|
||||
icon_state = "cult_helmet"
|
||||
inhand_icon_state = "cult_helmet"
|
||||
armor = list(MELEE = 50, BULLET = 40, LASER = 50, ENERGY = 60, BOMB = 50, BIO = 30, FIRE = 100, ACID = 100)
|
||||
light_system = NO_LIGHT_SUPPORT
|
||||
light_range = 0
|
||||
actions_types = list()
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/cult
|
||||
name = "\improper Nar'Sien hardened armor"
|
||||
icon_state = "cult_armor"
|
||||
inhand_icon_state = "cult_armor"
|
||||
desc = "A heavily-armored exosuit worn by warriors of the Nar'Sien cult. It can withstand hard vacuum."
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
allowed = list(/obj/item/tome, /obj/item/melee/cultblade, /obj/item/tank/internals/)
|
||||
armor = list(MELEE = 50, BULLET = 40, LASER = 50, ENERGY = 60, BOMB = 50, BIO = 30, FIRE = 100, ACID = 100)
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/cult
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/cult/real
|
||||
slowdown = 0
|
||||
clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | SNUG_FIT | PLASMAMAN_HELMET_EXEMPT
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
|
||||
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
|
||||
max_heat_protection_temperature = SPACE_HELM_MAX_TEMP_PROTECT
|
||||
flash_protect = FLASH_PROTECTION_WELDER
|
||||
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF
|
||||
resistance_flags = NONE
|
||||
|
||||
/obj/item/sharpener/cult
|
||||
name = "eldritch whetstone"
|
||||
|
||||
@@ -149,7 +149,7 @@
|
||||
var/list/pickedtype = list()
|
||||
switch(choice)
|
||||
if("Nar'Sien Hardened Armor")
|
||||
pickedtype += /obj/item/clothing/suit/space/hardsuit/cult/real
|
||||
pickedtype += /obj/item/clothing/suit/hooded/cultrobes/hardened
|
||||
if("Flagellant's Robe")
|
||||
pickedtype += /obj/item/clothing/suit/hooded/cultrobes/berserker
|
||||
if("Eldritch Longsword")
|
||||
|
||||
@@ -68,13 +68,21 @@
|
||||
/datum/outfit/clown_operative
|
||||
name = "Clown Operative (Preview only)"
|
||||
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/syndi
|
||||
gloves = /obj/item/clothing/gloves/color/black
|
||||
back = /obj/item/mod/control/pre_equipped/syndicate_empty
|
||||
mask = /obj/item/clothing/mask/gas/clown_hat
|
||||
|
||||
/datum/outfit/clown_operative/post_equip(mob/living/carbon/human/H, visualsOnly)
|
||||
var/obj/item/mod/module/armor_booster/booster = locate() in H.back
|
||||
booster.active = TRUE
|
||||
H.update_inv_back()
|
||||
|
||||
/datum/outfit/clown_operative_elite
|
||||
name = "Clown Operative (Elite, Preview only)"
|
||||
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/syndi/elite
|
||||
gloves = /obj/item/clothing/gloves/color/black
|
||||
back = /obj/item/mod/control/pre_equipped/syndicate_empty/elite
|
||||
mask = /obj/item/clothing/mask/gas/clown_hat
|
||||
|
||||
/datum/outfit/clown_operative_elite/post_equip(mob/living/carbon/human/H, visualsOnly)
|
||||
var/obj/item/mod/module/armor_booster/elite/booster = locate() in H.back
|
||||
booster.active = TRUE
|
||||
H.update_inv_back()
|
||||
|
||||
@@ -172,18 +172,24 @@
|
||||
/datum/outfit/nuclear_operative
|
||||
name = "Nuclear Operative (Preview only)"
|
||||
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/syndi
|
||||
head = /obj/item/clothing/head/helmet/space/hardsuit/syndi
|
||||
back = /obj/item/mod/control/pre_equipped/syndicate_empty
|
||||
|
||||
/datum/outfit/nuclear_operative/post_equip(mob/living/carbon/human/H, visualsOnly)
|
||||
var/obj/item/mod/module/armor_booster/booster = locate() in H.back
|
||||
booster.active = TRUE
|
||||
H.update_inv_back()
|
||||
|
||||
/datum/outfit/nuclear_operative_elite
|
||||
name = "Nuclear Operative (Elite, Preview only)"
|
||||
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/syndi/elite
|
||||
head = /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite
|
||||
back = /obj/item/mod/control/pre_equipped/syndicate_empty/elite
|
||||
l_hand = /obj/item/modular_computer/tablet/nukeops
|
||||
r_hand = /obj/item/shield/energy
|
||||
|
||||
/datum/outfit/nuclear_operative_elite/post_equip(mob/living/carbon/human/H, visualsOnly)
|
||||
var/obj/item/mod/module/armor_booster/elite/booster = locate() in H.back
|
||||
booster.active = TRUE
|
||||
H.update_inv_back()
|
||||
var/obj/item/shield/energy/shield = locate() in H.held_items
|
||||
shield.icon_state = "[shield.base_icon_state]1"
|
||||
H.update_inv_hands()
|
||||
|
||||
@@ -54,12 +54,11 @@
|
||||
|
||||
glasses = /obj/item/clothing/glasses/night
|
||||
mask = /obj/item/clothing/mask/gas/syndicate
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/syndi
|
||||
back = /obj/item/mod/control/pre_equipped/nuclear
|
||||
r_pocket = /obj/item/tank/internals/emergency_oxygen/engi
|
||||
internals_slot = ITEM_SLOT_RPOCKET
|
||||
belt = /obj/item/storage/belt/military
|
||||
r_hand = /obj/item/gun/ballistic/shotgun/bulldog
|
||||
backpack_contents = list(/obj/item/storage/box/survival/syndie=1,\
|
||||
/obj/item/tank/jetpack/oxygen/harness=1,\
|
||||
/obj/item/gun/ballistic/automatic/pistol=1,\
|
||||
/obj/item/knife/combat/survival)
|
||||
|
||||
@@ -342,14 +342,14 @@
|
||||
name = "Buy Item"
|
||||
refundable = FALSE
|
||||
buy_word = "Summon"
|
||||
var/item_path= null
|
||||
var/item_path = null
|
||||
|
||||
|
||||
/datum/spellbook_entry/item/Buy(mob/living/carbon/human/user,obj/item/spellbook/book)
|
||||
new item_path(get_turf(user))
|
||||
var/atom/spawned_path = new item_path(get_turf(user))
|
||||
log_spellbook("[key_name(user)] bought [src] for [cost] points")
|
||||
SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name)
|
||||
return TRUE
|
||||
return spawned_path
|
||||
|
||||
/datum/spellbook_entry/item/staffchange
|
||||
name = "Staff of Change"
|
||||
@@ -424,16 +424,34 @@
|
||||
|
||||
/datum/spellbook_entry/item/armor
|
||||
name = "Mastercrafted Armor Set"
|
||||
desc = "An artefact suit of armor that allows you to cast spells while providing more protection against attacks and the void of space."
|
||||
item_path = /obj/item/clothing/suit/space/hardsuit/wizard
|
||||
desc = "An artefact suit of armor that allows you to cast spells while providing more protection against attacks and the void of space, also grants a battlemage shield."
|
||||
item_path = /obj/item/mod/control/pre_equipped/enchanted
|
||||
category = "Defensive"
|
||||
|
||||
/datum/spellbook_entry/item/armor/Buy(mob/living/carbon/human/user,obj/item/spellbook/book)
|
||||
/datum/spellbook_entry/item/armor/Buy(mob/living/carbon/human/user, obj/item/spellbook/book)
|
||||
. = ..()
|
||||
if(.)
|
||||
new /obj/item/tank/internals/oxygen(get_turf(user)) //i need to BREATHE
|
||||
new /obj/item/clothing/shoes/sandal/magic(get_turf(user)) //In case they've lost them.
|
||||
new /obj/item/clothing/gloves/combat/wizard(get_turf(user))//To complete the outfit
|
||||
if(!.)
|
||||
return
|
||||
var/obj/item/mod/control/mod = .
|
||||
var/obj/item/mod/module/storage/storage = locate() in mod.modules
|
||||
var/obj/item/back = user.back
|
||||
if(back)
|
||||
if(!user.dropItemToGround(back))
|
||||
return
|
||||
for(var/obj/item/item as anything in back.contents)
|
||||
item.forceMove(storage)
|
||||
if(!user.equip_to_slot_if_possible(mod, mod.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE))
|
||||
return
|
||||
if(!user.dropItemToGround(user.wear_suit) || !user.dropItemToGround(user.head))
|
||||
return
|
||||
mod.quick_activation()
|
||||
|
||||
/datum/spellbook_entry/item/battlemage_charge
|
||||
name = "Battlemage Armour Charges"
|
||||
desc = "A powerful defensive rune, it will grant eight additional charges to a battlemage shield."
|
||||
item_path = /obj/item/wizard_armour_charge
|
||||
category = "Defensive"
|
||||
cost = 1
|
||||
|
||||
/datum/spellbook_entry/item/contract
|
||||
name = "Contract of Apprenticeship"
|
||||
@@ -484,26 +502,6 @@
|
||||
desc = "A hammer that creates an intensely powerful field of gravity where it strikes, pulling everything nearby to the point of impact."
|
||||
item_path = /obj/item/singularityhammer
|
||||
|
||||
/datum/spellbook_entry/item/battlemage
|
||||
name = "Battlemage Armour"
|
||||
desc = "An ensorceled suit of armour, protected by a powerful shield. The shield can completely negate sixteen attacks before being permanently depleted."
|
||||
item_path = /obj/item/clothing/suit/space/hardsuit/shielded/wizard
|
||||
limit = 1
|
||||
category = "Defensive"
|
||||
|
||||
/datum/spellbook_entry/item/battlemage/Buy(mob/living/carbon/human/user,obj/item/spellbook/book)
|
||||
. = ..()
|
||||
if(.)
|
||||
new /obj/item/clothing/shoes/sandal/magic(get_turf(user)) //In case they've lost them.
|
||||
new /obj/item/clothing/gloves/combat/wizard(get_turf(user))//To complete the outfit
|
||||
|
||||
/datum/spellbook_entry/item/battlemage_charge
|
||||
name = "Battlemage Armour Charges"
|
||||
desc = "A powerful defensive rune, it will grant eight additional charges to a suit of battlemage armour."
|
||||
item_path = /obj/item/wizard_armour_charge
|
||||
category = "Defensive"
|
||||
cost = 1
|
||||
|
||||
/datum/spellbook_entry/item/warpwhistle
|
||||
name = "Warp Whistle"
|
||||
desc = "A strange whistle that will transport you to a distant safe place on the station. There is a window of vulnerability at the beginning of every use."
|
||||
|
||||
@@ -132,6 +132,6 @@ GLOBAL_VAR_INIT(sc_safecode5, "[rand(0,9)]")
|
||||
l_set = 1
|
||||
new /obj/item/gun/energy/mindflayer(src)
|
||||
new /obj/item/soulstone(src)
|
||||
new /obj/item/clothing/suit/space/hardsuit/cult(src)
|
||||
new /obj/item/clothing/suit/hooded/cultrobes/hardened(src)
|
||||
//new /obj/item/teleportation_scroll(src)
|
||||
new /obj/item/stack/ore/diamond(src)
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
ears = /obj/item/radio/headset
|
||||
uniform = /obj/item/clothing/under/syndicate
|
||||
suit = /obj/item/clothing/suit/armor/vest/ctf
|
||||
toggle_helmet = FALSE // see the whites of their eyes
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
gloves = /obj/item/clothing/gloves/combat
|
||||
id = /obj/item/card/id/away
|
||||
|
||||
@@ -59,16 +59,6 @@
|
||||
stock_max = 2
|
||||
availability_prob = 70
|
||||
|
||||
/datum/blackmarket_item/clothing/combatmedic_suit
|
||||
name = "Combat Medic hardsuit"
|
||||
desc = "A discarded combat medic hardsuit, found in the ruins of a carpet bombed xeno hive. Definately used, but as sturdy as an anchor."
|
||||
item = /obj/item/clothing/suit/space/hardsuit/combatmedic
|
||||
|
||||
price_min = 5500
|
||||
price_max = 7000
|
||||
stock_max = 1
|
||||
availability_prob = 10
|
||||
|
||||
/datum/blackmarket_item/clothing/rocket_boots
|
||||
name = "Rocket Boots"
|
||||
desc = "We found a pair of jump boots and overclocked the hell out of them. No liability for grevious harm to or with a body."
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
/obj/item/knife/envy,
|
||||
/obj/item/gun/ballistic/revolver/russian/soul,
|
||||
/obj/item/veilrender/vealrender,
|
||||
/obj/item/clothing/suit/space/hardsuit/berserker,
|
||||
/obj/item/clothing/suit/hooded/berserker,
|
||||
/obj/item/freeze_cube,
|
||||
/obj/item/soulstone/anybody/mining,
|
||||
/obj/item/clothing/gloves/gauntlets,
|
||||
@@ -48,7 +48,7 @@
|
||||
/obj/item/mayhem,
|
||||
/obj/item/gun/magic/staff/spellblade,
|
||||
/obj/item/storm_staff,
|
||||
/obj/item/clothing/suit/space/hardsuit/hostile_environment,
|
||||
/obj/item/clothing/suit/hooded/hostile_environment,
|
||||
)
|
||||
|
||||
/datum/export/lavaland/megafauna/total_printout(datum/export_report/ex, notes = TRUE) //in the unlikely case a miner feels like selling megafauna loot
|
||||
|
||||
@@ -1456,6 +1456,18 @@
|
||||
/obj/item/construction/plumbing/research)
|
||||
crate_name = "cytology supplies crate"
|
||||
|
||||
/datum/supply_pack/science/mod_core
|
||||
name = "MOD core Crate"
|
||||
desc = "Three cores, perfect for any MODsuit construction! Naturally harvested™, of course."
|
||||
cost = CARGO_CRATE_VALUE * 3
|
||||
access = ACCESS_ROBOTICS
|
||||
access_view = ACCESS_ROBOTICS
|
||||
contains = list(/obj/item/mod/construction/core,
|
||||
/obj/item/mod/construction/core,
|
||||
/obj/item/mod/construction/core)
|
||||
crate_name = "MOD core crate"
|
||||
crate_type = /obj/structure/closet/crate/secure/science
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////// Service //////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
/// Switches between mouse buttons for MODsuit active modules
|
||||
/datum/preference/choiced/mod_select
|
||||
category = PREFERENCE_CATEGORY_GAME_PREFERENCES
|
||||
savefile_key = "mod_select"
|
||||
savefile_identifier = PREFERENCE_PLAYER
|
||||
|
||||
/datum/preference/choiced/mod_select/init_possible_values()
|
||||
return list(MIDDLE_CLICK, ALT_CLICK)
|
||||
|
||||
/datum/preference/choiced/mod_select/create_default_value()
|
||||
return MIDDLE_CLICK
|
||||
|
||||
/datum/preference/choiced/mod_select/apply_to_client_updated(client/client, value)
|
||||
if(!ishuman(client.mob))
|
||||
return
|
||||
var/mob/living/carbon/human/client_owner = client.mob
|
||||
if(!istype(client_owner.back, /obj/item/mod/control))
|
||||
return
|
||||
var/obj/item/mod/control/mod = client_owner.back
|
||||
if(!mod.selected_module)
|
||||
return
|
||||
UnregisterSignal(mod.wearer, mod.selected_module.used_signal)
|
||||
mod.selected_module.update_signal(value)
|
||||
@@ -117,19 +117,15 @@
|
||||
if(done)
|
||||
break
|
||||
|
||||
//hardsuit helmets/suit hoods
|
||||
if(O.toggle_helmet && (ispath(O.suit, /obj/item/clothing/suit/space/hardsuit) || ispath(O.suit, /obj/item/clothing/suit/hooded)) && ishuman(user))
|
||||
//suit hoods
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
//make sure they are actually wearing the suit, not just holding it, and that they have a chameleon hat
|
||||
if(istype(H.wear_suit, /obj/item/clothing/suit/chameleon) && istype(H.head, /obj/item/clothing/head/chameleon))
|
||||
var/helmet_type
|
||||
if(ispath(O.suit, /obj/item/clothing/suit/space/hardsuit))
|
||||
var/obj/item/clothing/suit/space/hardsuit/hardsuit = O.suit
|
||||
helmet_type = initial(hardsuit.helmettype)
|
||||
else
|
||||
if(ispath(O.suit, /obj/item/clothing/suit/hooded))
|
||||
var/obj/item/clothing/suit/hooded/hooded = O.suit
|
||||
helmet_type = initial(hooded.hoodtype)
|
||||
|
||||
if(helmet_type)
|
||||
var/obj/item/clothing/head/chameleon/hat = H.head
|
||||
hat.chameleon_action.update_look(user, helmet_type)
|
||||
|
||||
@@ -142,11 +142,11 @@
|
||||
desc = "A pair of snazzy goggles used to protect against chemical spills. Fitted with an analyzer for scanning items and reagents."
|
||||
icon_state = "purple"
|
||||
inhand_icon_state = "glasses"
|
||||
clothing_flags = SCAN_REAGENTS //You can see reagents while wearing science goggles
|
||||
actions_types = list(/datum/action/item_action/toggle_research_scanner)
|
||||
glass_colour_type = /datum/client_colour/glass_colour/purple
|
||||
resistance_flags = ACID_PROOF
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 80, ACID = 100)
|
||||
clothing_traits = list(TRAIT_REAGENT_SCANNER)
|
||||
|
||||
/obj/item/clothing/glasses/science/item_action_slot_check(slot)
|
||||
if(slot == ITEM_SLOT_EYES)
|
||||
@@ -297,14 +297,13 @@
|
||||
name = "beer goggles"
|
||||
icon_state = "sunhudbeer"
|
||||
desc = "A pair of sunglasses outfitted with apparatus to scan reagents, as well as providing an innate understanding of liquid viscosity while in motion."
|
||||
clothing_flags = SCAN_REAGENTS
|
||||
clothing_traits = list(TRAIT_BOOZE_SLIDER)
|
||||
clothing_traits = list(TRAIT_BOOZE_SLIDER, TRAIT_REAGENT_SCANNER)
|
||||
|
||||
/obj/item/clothing/glasses/sunglasses/chemical
|
||||
name = "science glasses"
|
||||
icon_state = "sunhudsci"
|
||||
desc = "A pair of tacky purple sunglasses that allow the wearer to recognize various chemical compounds with only a glance."
|
||||
clothing_flags = SCAN_REAGENTS
|
||||
clothing_traits = list(TRAIT_REAGENT_SCANNER)
|
||||
|
||||
/obj/item/clothing/glasses/sunglasses/gar
|
||||
name = "black gar glasses"
|
||||
@@ -527,8 +526,8 @@
|
||||
flash_protect = FLASH_PROTECTION_WELDER
|
||||
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
|
||||
glass_colour_type = FALSE
|
||||
clothing_flags = SCAN_REAGENTS
|
||||
vision_flags = SEE_TURFS
|
||||
clothing_traits = list(TRAIT_REAGENT_SCANNER)
|
||||
var/list/hudlist = list(DATA_HUD_MEDICAL_ADVANCED, DATA_HUD_DIAGNOSTIC_ADVANCED, DATA_HUD_SECURITY_ADVANCED)
|
||||
var/xray = FALSE
|
||||
|
||||
|
||||
@@ -523,14 +523,13 @@
|
||||
AddElement(/datum/element/update_icon_updates_onmob)
|
||||
|
||||
/obj/item/clothing/head/helmet/update_icon_state()
|
||||
var/state = "[initial(icon_state)]"
|
||||
if(attached_light)
|
||||
var/state = "[initial(icon_state)]"
|
||||
if(attached_light.on)
|
||||
state += "-flight-on" //"helmet-flight-on" // "helmet-cam-flight-on"
|
||||
else
|
||||
state += "-flight" //etc.
|
||||
|
||||
icon_state = state
|
||||
icon_state = state
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/head/helmet/ui_action_click(mob/user, action)
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
gloves = /obj/item/clothing/gloves/combat
|
||||
mask = /obj/item/clothing/mask/gas/sechailer
|
||||
shoes = /obj/item/clothing/shoes/combat/swat
|
||||
toggle_helmet = FALSE
|
||||
|
||||
/datum/outfit/centcom/ert/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
if(visualsOnly)
|
||||
@@ -34,13 +33,13 @@
|
||||
name = "ERT Commander"
|
||||
|
||||
id = /obj/item/card/id/advanced/centcom/ert
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/ert
|
||||
suit_store = /obj/item/gun/energy/e_gun
|
||||
back = /obj/item/storage/backpack/ert
|
||||
suit_store = /obj/item/tank/internals/oxygen
|
||||
back = /obj/item/mod/control/pre_equipped/responsory/commander
|
||||
l_hand = /obj/item/gun/energy/e_gun
|
||||
backpack_contents = list(
|
||||
/obj/item/melee/baton/security/loaded = 1,
|
||||
/obj/item/storage/box/survival/engineer = 1,
|
||||
)
|
||||
)
|
||||
belt = /obj/item/storage/belt/security/full
|
||||
glasses = /obj/item/clothing/glasses/hud/security/sunglasses
|
||||
l_pocket = /obj/item/switchblade
|
||||
@@ -61,7 +60,7 @@
|
||||
/obj/item/gun/energy/pulse/pistol/loyalpin = 1,
|
||||
/obj/item/melee/baton/security/loaded = 1,
|
||||
/obj/item/storage/box/survival/engineer = 1,
|
||||
)
|
||||
)
|
||||
glasses = /obj/item/clothing/glasses/thermal/eyepatch
|
||||
l_pocket = /obj/item/melee/energy/sword/saber
|
||||
|
||||
@@ -69,14 +68,14 @@
|
||||
name = "ERT Security"
|
||||
|
||||
id = /obj/item/card/id/advanced/centcom/ert/security
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/ert/sec
|
||||
suit_store = /obj/item/gun/energy/e_gun/stun
|
||||
back = /obj/item/storage/backpack/ert/security
|
||||
suit_store = /obj/item/tank/internals/oxygen
|
||||
back = /obj/item/mod/control/pre_equipped/responsory/security
|
||||
l_hand = /obj/item/gun/energy/e_gun/stun
|
||||
backpack_contents = list(
|
||||
/obj/item/melee/baton/security/loaded = 1,
|
||||
/obj/item/storage/box/handcuffs = 1,
|
||||
/obj/item/storage/box/survival/engineer = 1,
|
||||
)
|
||||
)
|
||||
belt = /obj/item/storage/belt/security/full
|
||||
glasses = /obj/item/clothing/glasses/hud/security/sunglasses
|
||||
gloves = /obj/item/clothing/gloves/tackler/combat/insulated
|
||||
@@ -94,31 +93,31 @@
|
||||
/datum/outfit/centcom/ert/security/alert
|
||||
name = "ERT Security - High Alert"
|
||||
|
||||
belt = /obj/item/gun/energy/pulse/carbine/loyalpin
|
||||
l_hand = /obj/item/gun/energy/pulse/carbine/loyalpin
|
||||
backpack_contents = list(
|
||||
/obj/item/melee/baton/security/loaded = 1,
|
||||
/obj/item/storage/belt/security/full = 1,
|
||||
/obj/item/storage/box/handcuffs = 1,
|
||||
/obj/item/storage/box/survival/engineer = 1,
|
||||
)
|
||||
)
|
||||
|
||||
/datum/outfit/centcom/ert/medic
|
||||
name = "ERT Medic"
|
||||
|
||||
id = /obj/item/card/id/advanced/centcom/ert/medical
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/ert/med
|
||||
suit_store = /obj/item/gun/energy/e_gun
|
||||
back = /obj/item/storage/backpack/ert/medical
|
||||
suit_store = /obj/item/tank/internals/oxygen
|
||||
back = /obj/item/mod/control/pre_equipped/responsory/medic
|
||||
backpack_contents = list(
|
||||
/obj/item/gun/medbeam = 1,
|
||||
/obj/item/melee/baton/security/loaded = 1,
|
||||
/obj/item/reagent_containers/hypospray/combat = 1,
|
||||
/obj/item/storage/box/hug/plushes = 1,
|
||||
/obj/item/storage/box/survival/engineer = 1,
|
||||
)
|
||||
)
|
||||
belt = /obj/item/storage/belt/medical
|
||||
glasses = /obj/item/clothing/glasses/hud/health
|
||||
l_hand = /obj/item/storage/firstaid/regular
|
||||
r_hand = /obj/item/gun/energy/e_gun
|
||||
|
||||
/datum/outfit/centcom/ert/medic/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
..()
|
||||
@@ -140,22 +139,22 @@
|
||||
/obj/item/reagent_containers/hypospray/combat/nanites = 1,
|
||||
/obj/item/storage/box/hug/plushes = 1,
|
||||
/obj/item/storage/box/survival/engineer = 1,
|
||||
)
|
||||
)
|
||||
mask = /obj/item/clothing/mask/gas/sechailer/swat
|
||||
|
||||
/datum/outfit/centcom/ert/engineer
|
||||
name = "ERT Engineer"
|
||||
|
||||
id = /obj/item/card/id/advanced/centcom/ert/engineer
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/ert/engi
|
||||
suit_store = /obj/item/gun/energy/e_gun
|
||||
back = /obj/item/storage/backpack/ert/engineer
|
||||
suit_store = /obj/item/tank/internals/oxygen
|
||||
back = /obj/item/mod/control/pre_equipped/responsory/engineer
|
||||
l_hand = /obj/item/gun/energy/e_gun
|
||||
backpack_contents = list(
|
||||
/obj/item/construction/rcd/loaded/upgraded = 1,
|
||||
/obj/item/melee/baton/security/loaded = 1,
|
||||
/obj/item/pipe_dispenser = 1,
|
||||
/obj/item/storage/box/survival/engineer = 1,
|
||||
)
|
||||
)
|
||||
belt = /obj/item/storage/belt/utility/full/powertools
|
||||
glasses = /obj/item/clothing/glasses/meson/engine
|
||||
l_pocket = /obj/item/rcd_ammo/large
|
||||
@@ -179,7 +178,7 @@
|
||||
/obj/item/melee/baton/security/loaded = 1,
|
||||
/obj/item/pipe_dispenser = 1,
|
||||
/obj/item/storage/box/survival/engineer = 1,
|
||||
)
|
||||
)
|
||||
|
||||
/datum/outfit/centcom/centcom_official
|
||||
name = "CentCom Official"
|
||||
@@ -191,7 +190,7 @@
|
||||
backpack_contents = list(
|
||||
/obj/item/stamp/centcom = 1,
|
||||
/obj/item/storage/box/survival = 1,
|
||||
)
|
||||
)
|
||||
belt = /obj/item/gun/energy/e_gun
|
||||
ears = /obj/item/radio/headset/headset_cent
|
||||
glasses = /obj/item/clothing/glasses/sunglasses
|
||||
@@ -219,49 +218,51 @@
|
||||
/datum/outfit/centcom/ert/commander/inquisitor
|
||||
name = "Inquisition Commander"
|
||||
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal
|
||||
suit_store = /obj/item/tank/internals/oxygen
|
||||
back = /obj/item/mod/control/pre_equipped/responsory/inquisitory/commander
|
||||
r_hand = /obj/item/nullrod/scythe/talking/chainsword
|
||||
backpack_contents = list(
|
||||
/obj/item/storage/box/survival = 1,
|
||||
)
|
||||
l_hand = /obj/item/nullrod/scythe/talking/chainsword
|
||||
)
|
||||
|
||||
/datum/outfit/centcom/ert/security/inquisitor
|
||||
name = "Inquisition Security"
|
||||
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor
|
||||
suit_store = /obj/item/gun/energy/e_gun/stun
|
||||
suit_store = /obj/item/tank/internals/oxygen
|
||||
back = /obj/item/mod/control/pre_equipped/responsory/inquisitory/security
|
||||
backpack_contents = list(
|
||||
/obj/item/construction/rcd/loaded = 1,
|
||||
/obj/item/melee/baton/security/loaded = 1,
|
||||
/obj/item/storage/box/handcuffs = 1,
|
||||
/obj/item/storage/box/survival/engineer = 1,
|
||||
)
|
||||
)
|
||||
|
||||
/datum/outfit/centcom/ert/medic/inquisitor
|
||||
name = "Inquisition Medic"
|
||||
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor
|
||||
suit_store = /obj/item/tank/internals/oxygen
|
||||
back = /obj/item/mod/control/pre_equipped/responsory/inquisitory/medic
|
||||
backpack_contents = list(
|
||||
/obj/item/gun/medbeam = 1,
|
||||
/obj/item/melee/baton/security/loaded = 1,
|
||||
/obj/item/storage/box/survival/engineer = 1,
|
||||
/obj/item/reagent_containers/hypospray/combat = 1,
|
||||
/obj/item/reagent_containers/hypospray/combat/heresypurge = 1,
|
||||
)
|
||||
)
|
||||
|
||||
/datum/outfit/centcom/ert/chaplain
|
||||
name = "ERT Chaplain"
|
||||
|
||||
id = /obj/item/card/id/advanced/centcom/ert/chaplain
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor // Chap role always gets this suit
|
||||
suit_store = /obj/item/gun/energy/e_gun
|
||||
back = /obj/item/storage/backpack/cultpack
|
||||
suit_store = /obj/item/tank/internals/oxygen
|
||||
back = /obj/item/mod/control/pre_equipped/responsory/chaplain
|
||||
l_hand = /obj/item/gun/energy/e_gun
|
||||
belt = /obj/item/storage/belt/soulstone
|
||||
glasses = /obj/item/clothing/glasses/hud/health
|
||||
backpack_contents = list(
|
||||
/obj/item/nullrod = 1,
|
||||
/obj/item/storage/box/survival/engineer = 1,
|
||||
)
|
||||
belt = /obj/item/storage/belt/soulstone
|
||||
glasses = /obj/item/clothing/glasses/hud/health
|
||||
)
|
||||
|
||||
/datum/outfit/centcom/ert/chaplain/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
..()
|
||||
@@ -274,19 +275,20 @@
|
||||
/datum/outfit/centcom/ert/chaplain/inquisitor
|
||||
name = "Inquisition Chaplain"
|
||||
|
||||
back = /obj/item/mod/control/pre_equipped/responsory/inquisitory/chaplain
|
||||
backpack_contents = list(
|
||||
/obj/item/grenade/chem_grenade/holy = 1,
|
||||
/obj/item/nullrod = 1,
|
||||
/obj/item/storage/box/survival/engineer = 1,
|
||||
)
|
||||
)
|
||||
belt = /obj/item/storage/belt/soulstone/full/chappy
|
||||
|
||||
/datum/outfit/centcom/ert/janitor
|
||||
name = "ERT Janitor"
|
||||
|
||||
id = /obj/item/card/id/advanced/centcom/ert/janitor
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/ert/jani
|
||||
back = /obj/item/storage/backpack/ert/janitor
|
||||
suit_store = /obj/item/tank/internals/oxygen
|
||||
back = /obj/item/mod/control/pre_equipped/responsory/janitor
|
||||
backpack_contents = list(
|
||||
/obj/item/grenade/clusterbuster/cleaner = 1,
|
||||
/obj/item/melee/baton/security/loaded = 1,
|
||||
@@ -294,7 +296,7 @@
|
||||
/obj/item/reagent_containers/glass/bucket = 1,
|
||||
/obj/item/storage/box/lights/mixed = 1,
|
||||
/obj/item/storage/box/survival/engineer = 1,
|
||||
)
|
||||
)
|
||||
belt = /obj/item/storage/belt/janitor/full
|
||||
glasses = /obj/item/clothing/glasses/night
|
||||
l_pocket = /obj/item/grenade/chem_grenade/cleaner
|
||||
@@ -319,21 +321,21 @@
|
||||
/obj/item/melee/baton/security/loaded = 1,
|
||||
/obj/item/storage/box/lights/mixed = 1,
|
||||
/obj/item/storage/box/survival/engineer = 1,
|
||||
)
|
||||
l_hand = /obj/item/reagent_containers/spray/chemsprayer/janitor
|
||||
)
|
||||
r_hand = /obj/item/reagent_containers/spray/chemsprayer/janitor
|
||||
|
||||
/datum/outfit/centcom/ert/clown
|
||||
name = "ERT Clown"
|
||||
|
||||
id = /obj/item/card/id/advanced/centcom/ert/clown
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/ert/clown
|
||||
back = /obj/item/storage/backpack/ert/clown
|
||||
suit_store = /obj/item/tank/internals/oxygen
|
||||
back = /obj/item/mod/control/pre_equipped/responsory/clown
|
||||
backpack_contents = list(
|
||||
/obj/item/gun/ballistic/revolver/reverse = 1,
|
||||
/obj/item/melee/energy/sword/bananium = 1,
|
||||
/obj/item/shield/energy/bananium = 1,
|
||||
/obj/item/storage/box/survival/engineer = 1,
|
||||
)
|
||||
)
|
||||
belt = /obj/item/storage/belt/champion
|
||||
glasses = /obj/item/clothing/glasses/trickblindfold
|
||||
mask = /obj/item/clothing/mask/gas/clown_hat
|
||||
@@ -362,7 +364,7 @@
|
||||
back = /obj/item/storage/backpack/satchel
|
||||
backpack_contents = list(
|
||||
/obj/item/storage/box/survival = 1,
|
||||
)
|
||||
)
|
||||
belt = /obj/item/melee/baton
|
||||
ears = /obj/item/radio/headset/headset_cent
|
||||
glasses = /obj/item/clothing/glasses/sunglasses
|
||||
@@ -412,12 +414,13 @@
|
||||
uniform = /obj/item/clothing/under/misc/overalls
|
||||
suit = /obj/item/clothing/suit/apron
|
||||
suit_store = null
|
||||
back = /obj/item/storage/backpack/ert/janitor
|
||||
backpack_contents = list(
|
||||
/obj/item/mop/advanced = 1,
|
||||
/obj/item/reagent_containers/glass/bucket = 1,
|
||||
/obj/item/storage/box/lights/mixed = 1,
|
||||
/obj/item/storage/box/survival/engineer = 1,
|
||||
)
|
||||
)
|
||||
belt = /obj/item/storage/belt/janitor/full
|
||||
glasses = /obj/item/clothing/glasses/meson
|
||||
mask = /obj/item/clothing/mask/bandana/blue
|
||||
@@ -431,11 +434,12 @@
|
||||
uniform = /obj/item/clothing/under/misc/bouncer
|
||||
suit = /obj/item/clothing/suit/armor/vest
|
||||
suit_store = null
|
||||
back = /obj/item/storage/backpack/ert/security
|
||||
backpack_contents = list(
|
||||
/obj/item/clothing/head/helmet/police = 1,
|
||||
/obj/item/storage/box/handcuffs = 1,
|
||||
/obj/item/storage/box/survival/engineer = 1,
|
||||
)
|
||||
)
|
||||
belt = /obj/item/melee/baton/telescopic
|
||||
l_pocket = /obj/item/assembly/flash
|
||||
r_pocket = /obj/item/storage/wallet
|
||||
@@ -446,6 +450,7 @@
|
||||
uniform = /obj/item/clothing/under/rank/engineering/engineer/hazard
|
||||
suit = /obj/item/clothing/suit/hazardvest
|
||||
suit_store = null
|
||||
back = /obj/item/storage/backpack/ert/engineer
|
||||
backpack_contents = list(
|
||||
/obj/item/construction/rcd/loaded = 1,
|
||||
/obj/item/etherealballdeployer = 1,
|
||||
@@ -454,7 +459,7 @@
|
||||
/obj/item/stack/sheet/iron/fifty = 1,
|
||||
/obj/item/stack/sheet/plasteel/twenty = 1,
|
||||
/obj/item/storage/box/survival/engineer = 1,
|
||||
)
|
||||
)
|
||||
head = /obj/item/clothing/head/hardhat/weldhat
|
||||
mask = /obj/item/clothing/mask/gas/atmos
|
||||
l_hand = /obj/item/areaeditor/blueprints
|
||||
@@ -465,11 +470,12 @@
|
||||
uniform = /obj/item/clothing/under/rank/civilian/clown
|
||||
suit = /obj/item/clothing/suit/chameleon
|
||||
suit_store = null
|
||||
back = /obj/item/storage/backpack/ert/clown
|
||||
backpack_contents = list(
|
||||
/obj/item/instrument/piano_synth = 1,
|
||||
/obj/item/shield/energy/bananium = 1,
|
||||
/obj/item/storage/box/survival/engineer = 1,
|
||||
)
|
||||
)
|
||||
glasses = /obj/item/clothing/glasses/chameleon
|
||||
head = /obj/item/clothing/head/chameleon
|
||||
|
||||
@@ -479,11 +485,12 @@
|
||||
uniform = /obj/item/clothing/under/misc/coordinator
|
||||
suit = /obj/item/clothing/suit/coordinator
|
||||
suit_store = null
|
||||
back = /obj/item/storage/backpack/ert
|
||||
backpack_contents = list(
|
||||
/obj/item/food/cake/birthday = 1,
|
||||
/obj/item/storage/box/fireworks = 3,
|
||||
/obj/item/storage/box/survival/engineer = 1,
|
||||
)
|
||||
)
|
||||
belt = /obj/item/storage/belt/sabre
|
||||
head = /obj/item/clothing/head/coordinator
|
||||
l_pocket = /obj/item/knife/kitchen
|
||||
@@ -495,9 +502,8 @@
|
||||
id = /obj/item/card/id/advanced/black/deathsquad
|
||||
id_trim = /datum/id_trim/centcom/deathsquad
|
||||
uniform = /obj/item/clothing/under/rank/centcom/commander
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/deathsquad
|
||||
suit_store = /obj/item/tank/internals/emergency_oxygen/double
|
||||
back = /obj/item/storage/backpack/security
|
||||
suit_store = /obj/item/tank/internals/oxygen
|
||||
back = /obj/item/mod/control/pre_equipped/apocryphal
|
||||
backpack_contents = list(
|
||||
/obj/item/ammo_box/a357 = 1,
|
||||
/obj/item/flashlight = 1,
|
||||
@@ -505,7 +511,7 @@
|
||||
/obj/item/storage/box/flashbangs = 1,
|
||||
/obj/item/storage/box/survival/engineer = 1,
|
||||
/obj/item/storage/firstaid/regular = 1,
|
||||
)
|
||||
)
|
||||
belt = /obj/item/gun/ballistic/revolver/mateba
|
||||
ears = /obj/item/radio/headset/headset_cent/alt
|
||||
glasses = /obj/item/clothing/glasses/hud/toggle/thermal
|
||||
@@ -518,7 +524,7 @@
|
||||
|
||||
skillchips = list(
|
||||
/obj/item/skillchip/disk_verifier,
|
||||
)
|
||||
)
|
||||
|
||||
/datum/outfit/centcom/death_commando/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
if(visualsOnly)
|
||||
@@ -593,7 +599,7 @@
|
||||
/obj/item/reagent_containers/hypospray/combat = 1,
|
||||
/obj/item/storage/firstaid/regular = 1,
|
||||
/obj/item/storage/firstaid/advanced = 1,
|
||||
)
|
||||
)
|
||||
belt = /obj/item/storage/belt/medical/paramedic
|
||||
glasses = /obj/item/clothing/glasses/hud/health/sunglasses
|
||||
|
||||
|
||||
@@ -406,14 +406,13 @@
|
||||
head = /obj/item/clothing/head/helmet/space/chronos
|
||||
mask = /obj/item/clothing/mask/breath
|
||||
|
||||
/datum/outfit/debug //Debug objs plus hardsuit
|
||||
/datum/outfit/debug //Debug objs plus MODsuit
|
||||
name = "Debug outfit"
|
||||
|
||||
id = /obj/item/card/id/advanced/debug
|
||||
uniform = /obj/item/clothing/under/misc/patriotsuit
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/syndi/elite/debug
|
||||
suit_store = /obj/item/tank/internals/oxygen
|
||||
back = /obj/item/storage/backpack/holding
|
||||
back = /obj/item/mod/control/pre_equipped/debug
|
||||
backpack_contents = list(
|
||||
/obj/item/melee/energy/axe = 1,
|
||||
/obj/item/storage/part_replacer/bluespace/tier4 = 1,
|
||||
@@ -443,9 +442,8 @@
|
||||
|
||||
id = /obj/item/card/id/advanced/debug
|
||||
uniform = /obj/item/clothing/under/misc/patriotsuit
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/syndi/elite/admin
|
||||
suit_store = /obj/item/tank/internals/oxygen
|
||||
back = /obj/item/storage/backpack/holding
|
||||
back = /obj/item/mod/control/pre_equipped/administrative
|
||||
backpack_contents = list(
|
||||
/obj/item/melee/energy/axe = 1,
|
||||
/obj/item/storage/part_replacer/bluespace/tier4 = 1,
|
||||
|
||||
@@ -98,9 +98,6 @@
|
||||
var/mob/M = loc
|
||||
M.update_inv_shoes()
|
||||
|
||||
/obj/item/proc/negates_gravity()
|
||||
return FALSE
|
||||
|
||||
/**
|
||||
* adjust_laces adjusts whether our shoes (assuming they can_be_tied) and tied, untied, or knotted
|
||||
*
|
||||
|
||||
@@ -11,6 +11,17 @@
|
||||
equip_delay_other = 70
|
||||
resistance_flags = FIRE_PROOF
|
||||
|
||||
/obj/item/clothing/shoes/magboots/equipped(mob/user, slot)
|
||||
. = ..()
|
||||
if(slot == ITEM_SLOT_FEET)
|
||||
update_gravity_trait(user)
|
||||
else
|
||||
REMOVE_TRAIT(user, TRAIT_NEGATES_GRAVITY, type)
|
||||
|
||||
/obj/item/clothing/shoes/magboots/dropped(mob/user)
|
||||
. = ..()
|
||||
REMOVE_TRAIT(user, TRAIT_NEGATES_GRAVITY, type)
|
||||
|
||||
/obj/item/clothing/shoes/magboots/verb/toggle()
|
||||
set name = "Toggle Magboots"
|
||||
set category = "Object"
|
||||
@@ -19,7 +30,6 @@
|
||||
return
|
||||
attack_self(usr)
|
||||
|
||||
|
||||
/obj/item/clothing/shoes/magboots/attack_self(mob/user)
|
||||
if(magpulse)
|
||||
clothing_flags &= ~NOSLIP
|
||||
@@ -30,18 +40,22 @@
|
||||
magpulse = !magpulse
|
||||
icon_state = "[magboot_state][magpulse]"
|
||||
to_chat(user, span_notice("You [magpulse ? "enable" : "disable"] the mag-pulse traction system."))
|
||||
update_gravity_trait(user)
|
||||
user.update_inv_shoes() //so our mob-overlays update
|
||||
user.update_gravity(user.has_gravity())
|
||||
user.update_equipment_speed_mods() //we want to update our speed so we arent running at max speed in regular magboots
|
||||
update_action_buttons()
|
||||
|
||||
/obj/item/clothing/shoes/magboots/negates_gravity()
|
||||
return clothing_flags & NOSLIP
|
||||
|
||||
/obj/item/clothing/shoes/magboots/examine(mob/user)
|
||||
. = ..()
|
||||
. += "Its mag-pulse traction system appears to be [magpulse ? "enabled" : "disabled"]."
|
||||
|
||||
///Adds/removes the gravity negation trait from the wearer depending on if the magpulse system is turned on.
|
||||
/obj/item/clothing/shoes/magboots/proc/update_gravity_trait(mob/user)
|
||||
if(magpulse)
|
||||
ADD_TRAIT(user, TRAIT_NEGATES_GRAVITY, type)
|
||||
else
|
||||
REMOVE_TRAIT(user, TRAIT_NEGATES_GRAVITY, type)
|
||||
|
||||
/obj/item/clothing/shoes/magboots/advance
|
||||
desc = "Advanced magnetic boots that have a lighter magnetic pull, placing less burden on the wearer."
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -33,7 +33,7 @@
|
||||
new /obj/effect/particle_effect/water(get_turf(H))
|
||||
|
||||
|
||||
//I just want the light feature of the hardsuit helmet
|
||||
//I just want the light feature of helmets
|
||||
/obj/item/clothing/head/helmet/space/plasmaman
|
||||
name = "plasma envirosuit helmet"
|
||||
desc = "A special containment helmet that allows plasma-based lifeforms to exist safely in an oxygenated environment. It is space-worthy, and may be worn in tandem with other EVA gear."
|
||||
@@ -259,7 +259,7 @@
|
||||
icon_state = "atmos_envirohelm"
|
||||
inhand_icon_state = "atmos_envirohelm"
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 100, ACID = 75)
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT // Same protection as the Atmospherics hardsuit Helmet
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT // Same protection as the Atmospherics Hardhat
|
||||
|
||||
/obj/item/clothing/head/helmet/space/plasmaman/chief_engineer
|
||||
name = "chief engineer's plasma envirosuit helmet"
|
||||
@@ -267,7 +267,7 @@
|
||||
icon_state = "ce_envirohelm"
|
||||
inhand_icon_state = "ce_envirohelm"
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 100, ACID = 75)
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT // Same protection as the CE's hardsuit Helmet
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT // Same protection as the Atmospherics Hardhat
|
||||
|
||||
|
||||
/obj/item/clothing/head/helmet/space/plasmaman/cargo
|
||||
|
||||
@@ -230,23 +230,6 @@
|
||||
|
||||
//All of the armor below is mostly unused
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/swat/centcom
|
||||
name = "\improper CentCom SWAT helmet"
|
||||
icon = 'icons/obj/clothing/hats.dmi'
|
||||
worn_icon = 'icons/mob/clothing/head.dmi'
|
||||
worn_icon_state = "centcomspace"
|
||||
icon_state = "centcomspace"
|
||||
inhand_icon_state = "centcomspacehelmet"
|
||||
desc = "A tactical MK.II SWAT helmet boasting better protection and a reasonable fashion sense."
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/swat/centcom
|
||||
name = "\improper CentCom SWAT armor"
|
||||
desc = "A MK.II SWAT suit with streamlined joints and armor made out of superior materials, insulated against intense heat with the complementary gas mask. Usually given to station Captains, this one has been painted CC green with complimentary gold accents."
|
||||
icon_state = "centcom"
|
||||
inhand_icon_state = "centcomspacesuit"
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/swat/centcom
|
||||
cell = /obj/item/stock_parts/cell/super
|
||||
|
||||
/obj/item/clothing/suit/armor/heavy
|
||||
name = "heavy armor"
|
||||
desc = "A heavily armored suit that protects against moderate damage."
|
||||
|
||||
@@ -242,6 +242,47 @@
|
||||
if (user.head == src)
|
||||
user.faction -= "carp"
|
||||
|
||||
/obj/item/clothing/suit/hooded/carp_costume/spaceproof
|
||||
name = "carp space suit"
|
||||
desc = "A slimming piece of dubious space carp technology, you suspect it won't stand up to hand-to-hand blows."
|
||||
icon_state = "carp_suit"
|
||||
inhand_icon_state = "space_suit_syndicate"
|
||||
armor = list(MELEE = -20, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 60, ACID = 75) //As whimpy whimpy whoo
|
||||
allowed = list(/obj/item/tank/internals, /obj/item/gun/ballistic/rifle/boltaction/harpoon) //I'm giving you a hint here
|
||||
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
|
||||
cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
|
||||
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
|
||||
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
|
||||
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
|
||||
clothing_flags = STOPSPRESSUREDAMAGE|THICKMATERIAL
|
||||
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
|
||||
hoodtype = /obj/item/clothing/head/hooded/carp_hood/spaceproof
|
||||
resistance_flags = NONE
|
||||
|
||||
/obj/item/clothing/head/hooded/carp_hood/spaceproof
|
||||
name = "carp helmet"
|
||||
desc = "Spaceworthy and it looks like a space carp's head, smells like one too."
|
||||
icon_state = "carp_helm"
|
||||
armor = list(MELEE = -20, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 60, ACID = 75) //As whimpy as a space carp
|
||||
flags_inv = HIDEEARS|HIDEHAIR|HIDEFACIALHAIR //facial hair will clip with the helm, this'll need a dynamic_fhair_suffix at some point.
|
||||
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
|
||||
heat_protection = HEAD
|
||||
max_heat_protection_temperature = SPACE_HELM_MAX_TEMP_PROTECT
|
||||
clothing_flags = STOPSPRESSUREDAMAGE|THICKMATERIAL|SNUG_FIT|PLASMAMAN_HELMET_EXEMPT
|
||||
body_parts_covered = HEAD
|
||||
resistance_flags = NONE
|
||||
flash_protect = FLASH_PROTECTION_WELDER
|
||||
flags_cover = HEADCOVERSEYES|HEADCOVERSMOUTH|PEPPERPROOF
|
||||
|
||||
/obj/item/clothing/head/hooded/carp_hood/spaceproof/Initialize(mapload)
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, LOCKED_HELMET_TRAIT)
|
||||
|
||||
/obj/item/clothing/suit/hooded/carp_costume/spaceproof/old
|
||||
name = "battered carp space suit"
|
||||
desc = "It's covered in bite marks and scratches, yet seems to be still perfectly functional."
|
||||
slowdown = 1
|
||||
|
||||
/obj/item/clothing/suit/hooded/ian_costume //It's Ian, rub his bell- oh god what happened to his inside parts?
|
||||
name = "corgi costume"
|
||||
desc = "A costume that looks like someone made a human-like corgi, it won't guarantee belly rubs."
|
||||
|
||||
@@ -114,83 +114,3 @@
|
||||
/obj/item/clothing/suit/toggle/Initialize(mapload)
|
||||
. = ..()
|
||||
AddComponent(/datum/component/toggle_icon, toggle_noun)
|
||||
|
||||
//Hardsuit toggle code
|
||||
/obj/item/clothing/suit/space/hardsuit/Initialize(mapload)
|
||||
MakeHelmet()
|
||||
. = ..()
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/Destroy()
|
||||
if(!QDELETED(helmet))
|
||||
helmet.suit = null
|
||||
qdel(helmet)
|
||||
helmet = null
|
||||
if (isatom(jetpack))
|
||||
QDEL_NULL(jetpack)
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/Destroy()
|
||||
if(suit)
|
||||
suit.helmet = null
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/proc/MakeHelmet()
|
||||
if(!helmettype)
|
||||
return
|
||||
if(!helmet)
|
||||
var/obj/item/clothing/head/helmet/space/hardsuit/W = new helmettype(src)
|
||||
W.suit = src
|
||||
helmet = W
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/ui_action_click()
|
||||
..()
|
||||
ToggleHelmet()
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/equipped(mob/user, slot)
|
||||
if(!helmettype)
|
||||
return
|
||||
if(slot != ITEM_SLOT_OCLOTHING)
|
||||
RemoveHelmet()
|
||||
..()
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/proc/RemoveHelmet()
|
||||
if(!helmet)
|
||||
return
|
||||
helmet_on = FALSE
|
||||
if(ishuman(helmet.loc))
|
||||
var/mob/living/carbon/H = helmet.loc
|
||||
if(helmet.on)
|
||||
helmet.attack_self(H)
|
||||
H.transferItemToLoc(helmet, src, TRUE)
|
||||
H.update_inv_wear_suit()
|
||||
to_chat(H, span_notice("The helmet on the hardsuit disengages."))
|
||||
playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, TRUE)
|
||||
else
|
||||
helmet.forceMove(src)
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/dropped()
|
||||
..()
|
||||
RemoveHelmet()
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/proc/ToggleHelmet()
|
||||
var/mob/living/carbon/human/H = src.loc
|
||||
if(!helmettype)
|
||||
return
|
||||
if(!helmet)
|
||||
to_chat(H, span_warning("The helmet's lightbulb seems to be damaged! You'll need a replacement bulb."))
|
||||
return
|
||||
if(!helmet_on)
|
||||
if(ishuman(src.loc))
|
||||
if(H.wear_suit != src)
|
||||
to_chat(H, span_warning("You must be wearing [src] to engage the helmet!"))
|
||||
return
|
||||
if(H.head)
|
||||
to_chat(H, span_warning("You're already wearing something on your head!"))
|
||||
return
|
||||
else if(H.equip_to_slot_if_possible(helmet,ITEM_SLOT_HEAD,0,0,1))
|
||||
to_chat(H, span_notice("You engage the helmet on the hardsuit."))
|
||||
helmet_on = TRUE
|
||||
H.update_inv_wear_suit()
|
||||
playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, TRUE)
|
||||
else
|
||||
RemoveHelmet()
|
||||
|
||||
@@ -171,43 +171,9 @@
|
||||
robe_charge = TRUE
|
||||
to_chat(usr, span_notice("The robe hums, its internal magic supply restored."))
|
||||
|
||||
|
||||
//Shielded Armour
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/shielded/wizard
|
||||
name = "battlemage armour"
|
||||
desc = "Not all wizards are afraid of getting up close and personal."
|
||||
icon_state = "battlemage"
|
||||
inhand_icon_state = "battlemage"
|
||||
min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT
|
||||
max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/wizard
|
||||
armor = list(MELEE = 30, BULLET = 20, LASER = 20, ENERGY = 30, BOMB = 20, BIO = 20, FIRE = 100, ACID = 100)
|
||||
slowdown = 0
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/shielded/wizard/setup_shielding()
|
||||
AddComponent(/datum/component/shielded, max_charges = 15, recharge_start_delay = 0 SECONDS, charge_increment_delay = 1 SECONDS, charge_recovery = 1, lose_multiple_charges = FALSE, shield_icon = "shield-red")
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/shielded/wizard
|
||||
name = "battlemage helmet"
|
||||
desc = "A suitably impressive helmet."
|
||||
icon_state = "battlemage"
|
||||
inhand_icon_state = "battlemage"
|
||||
min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT
|
||||
max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT
|
||||
armor = list(MELEE = 30, BULLET = 20, LASER = 20, ENERGY = 30, BOMB = 20, BIO = 20, FIRE = 100, ACID = 100)
|
||||
actions_types = null //No inbuilt light
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/shielded/wizard/attack_self(mob/user)
|
||||
return
|
||||
|
||||
// The actual code for this is handled in the shielded component, see [/datum/component/shielded/proc/check_recharge_rune]
|
||||
/obj/item/wizard_armour_charge
|
||||
name = "battlemage shield charges"
|
||||
desc = "A powerful rune that will increase the number of hits a suit of battlemage armour can take before failing.."
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "electricity2"
|
||||
/// How many charges get restored
|
||||
var/restored_charges = 8
|
||||
|
||||
@@ -128,7 +128,7 @@
|
||||
return TRUE
|
||||
|
||||
///Override to prevent storage dumping onto the griddle until I figure out how to navigate the mess that is storage code to allow me to nicely move the dumped objects onto the griddle.
|
||||
/obj/machinery/griddle/get_dumping_location(obj/item/storage/source, mob/user)
|
||||
/obj/machinery/griddle/get_dumping_location()
|
||||
return
|
||||
|
||||
/obj/machinery/griddle/process(delta_time)
|
||||
|
||||
@@ -258,21 +258,22 @@
|
||||
var/pda_slot = ITEM_SLOT_BELT
|
||||
|
||||
/datum/outfit/job/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
switch(H.backpack)
|
||||
if(GBACKPACK)
|
||||
back = /obj/item/storage/backpack //Grey backpack
|
||||
if(GSATCHEL)
|
||||
back = /obj/item/storage/backpack/satchel //Grey satchel
|
||||
if(GDUFFELBAG)
|
||||
back = /obj/item/storage/backpack/duffelbag //Grey Duffel bag
|
||||
if(LSATCHEL)
|
||||
back = /obj/item/storage/backpack/satchel/leather //Leather Satchel
|
||||
if(DSATCHEL)
|
||||
back = satchel //Department satchel
|
||||
if(DDUFFELBAG)
|
||||
back = duffelbag //Department duffel bag
|
||||
else
|
||||
back = backpack //Department backpack
|
||||
if(ispath(back, /obj/item/storage/backpack))
|
||||
switch(H.backpack)
|
||||
if(GBACKPACK)
|
||||
back = /obj/item/storage/backpack //Grey backpack
|
||||
if(GSATCHEL)
|
||||
back = /obj/item/storage/backpack/satchel //Grey satchel
|
||||
if(GDUFFELBAG)
|
||||
back = /obj/item/storage/backpack/duffelbag //Grey Duffel bag
|
||||
if(LSATCHEL)
|
||||
back = /obj/item/storage/backpack/satchel/leather //Leather Satchel
|
||||
if(DSATCHEL)
|
||||
back = satchel //Department satchel
|
||||
if(DDUFFELBAG)
|
||||
back = duffelbag //Department duffel bag
|
||||
else
|
||||
back = backpack //Department backpack
|
||||
|
||||
//converts the uniform string into the path we'll wear, whether it's the skirt or regular variant
|
||||
var/holder
|
||||
|
||||
@@ -59,10 +59,10 @@
|
||||
box = /obj/item/storage/box/survival/engineer
|
||||
pda_slot = ITEM_SLOT_LPOCKET
|
||||
|
||||
/datum/outfit/job/atmos/rig
|
||||
name = "Atmospheric Technician (Hardsuit)"
|
||||
/datum/outfit/job/atmos/mod
|
||||
name = "Atmospheric Technician (MODsuit)"
|
||||
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/atmos
|
||||
suit_store = /obj/item/tank/internals/oxygen
|
||||
back = /obj/item/mod/control/pre_equipped/atmospheric
|
||||
mask = /obj/item/clothing/mask/gas/atmos
|
||||
internals_slot = ITEM_SLOT_SUITSTORE
|
||||
|
||||
@@ -104,9 +104,11 @@
|
||||
return
|
||||
celestial_charter.name_type = special_charter
|
||||
|
||||
/datum/outfit/job/captain/hardsuit
|
||||
name = "Captain (Hardsuit)"
|
||||
/datum/outfit/job/captain/mod
|
||||
name = "Captain (MODsuit)"
|
||||
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/swat/captain
|
||||
suit_store = /obj/item/tank/internals/oxygen
|
||||
back = /obj/item/mod/control/pre_equipped/magnate
|
||||
suit = null
|
||||
head = null
|
||||
mask = /obj/item/clothing/mask/gas/atmos/captain
|
||||
|
||||
@@ -79,15 +79,14 @@
|
||||
skillchips = list(/obj/item/skillchip/job/engineer)
|
||||
pda_slot = ITEM_SLOT_LPOCKET
|
||||
|
||||
/datum/outfit/job/ce/rig
|
||||
name = "Chief Engineer (Hardsuit)"
|
||||
/datum/outfit/job/ce/mod
|
||||
name = "Chief Engineer (MODsuit)"
|
||||
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/engine/elite
|
||||
suit_store = /obj/item/tank/internals/oxygen
|
||||
back = /obj/item/mod/control/pre_equipped/advanced
|
||||
glasses = /obj/item/clothing/glasses/meson/engine
|
||||
gloves = /obj/item/clothing/gloves/color/yellow
|
||||
head = null
|
||||
mask = /obj/item/clothing/mask/breath
|
||||
shoes = /obj/item/clothing/shoes/magboots/advance
|
||||
|
||||
internals_slot = ITEM_SLOT_SUITSTORE
|
||||
|
||||
@@ -79,10 +79,12 @@
|
||||
)
|
||||
skillchips = list(/obj/item/skillchip/entrails_reader)
|
||||
|
||||
/datum/outfit/job/cmo/hardsuit
|
||||
name = "Chief Medical Officer (Hardsuit)"
|
||||
/datum/outfit/job/cmo/mod
|
||||
name = "Chief Medical Officer (MODsuit)"
|
||||
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/medical
|
||||
suit_store = /obj/item/tank/internals/oxygen
|
||||
back = /obj/item/mod/control/pre_equipped/rescue
|
||||
suit = null
|
||||
mask = /obj/item/clothing/mask/breath/medical
|
||||
r_pocket = /obj/item/flashlight/pen/paramedic
|
||||
internals_slot = ITEM_SLOT_SUITSTORE
|
||||
|
||||
@@ -77,9 +77,11 @@
|
||||
)
|
||||
implants = list(/obj/item/implant/mindshield)
|
||||
|
||||
/datum/outfit/job/hos/hardsuit
|
||||
name = "Head of Security (Hardsuit)"
|
||||
/datum/outfit/job/hos/mod
|
||||
name = "Head of Security (MODsuit)"
|
||||
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/security/hos
|
||||
suit_store = /obj/item/tank/internals/oxygen
|
||||
back = /obj/item/mod/control/pre_equipped/safeguard
|
||||
suit = null
|
||||
head = null
|
||||
mask = /obj/item/clothing/mask/gas/sechailer
|
||||
|
||||
@@ -59,3 +59,13 @@
|
||||
box = /obj/item/storage/box/survival/medical
|
||||
chameleon_extras = /obj/item/gun/syringe
|
||||
skillchips = list(/obj/item/skillchip/entrails_reader)
|
||||
|
||||
/datum/outfit/job/doctor/mod
|
||||
name = "Medical Doctor (MODsuit)"
|
||||
|
||||
suit_store = /obj/item/tank/internals/oxygen
|
||||
back = /obj/item/mod/control/pre_equipped/medical
|
||||
suit = null
|
||||
mask = /obj/item/clothing/mask/breath/medical
|
||||
r_pocket = /obj/item/flashlight/pen
|
||||
internals_slot = ITEM_SLOT_SUITSTORE
|
||||
|
||||
@@ -75,11 +75,12 @@
|
||||
chameleon_extras = /obj/item/stamp/rd
|
||||
skillchips = list(/obj/item/skillchip/job/research_director)
|
||||
|
||||
/datum/outfit/job/rd/rig
|
||||
name = "Research Director (Hardsuit)"
|
||||
/datum/outfit/job/rd/mod
|
||||
name = "Research Director (MODsuit)"
|
||||
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/rd
|
||||
suit_store = /obj/item/tank/internals/oxygen
|
||||
back = /obj/item/mod/control/pre_equipped/research
|
||||
suit = null
|
||||
mask = /obj/item/clothing/mask/breath
|
||||
l_hand = null
|
||||
internals_slot = ITEM_SLOT_SUITSTORE
|
||||
|
||||
@@ -58,3 +58,11 @@
|
||||
|
||||
pda_slot = ITEM_SLOT_LPOCKET
|
||||
skillchips = list(/obj/item/skillchip/job/roboticist)
|
||||
|
||||
/datum/outfit/job/roboticist/mod
|
||||
name = "Roboticist (MODsuit)"
|
||||
suit_store = /obj/item/tank/internals/oxygen
|
||||
back = /obj/item/mod/control/pre_equipped/standard
|
||||
suit = null
|
||||
mask = /obj/item/clothing/mask/breath
|
||||
internals_slot = ITEM_SLOT_SUITSTORE
|
||||
|
||||
@@ -78,7 +78,8 @@
|
||||
var/obj/item/clothing/suit/hooded/S = H.wear_suit
|
||||
S.ToggleHood()
|
||||
|
||||
/datum/outfit/job/miner/equipped/hardsuit
|
||||
name = "Shaft Miner (Equipment + Hardsuit)"
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/mining
|
||||
/datum/outfit/job/miner/equipped/mod
|
||||
name = "Shaft Miner (Equipment + MODsuit)"
|
||||
back = /obj/item/mod/control/pre_equipped/mining
|
||||
suit = null
|
||||
mask = /obj/item/clothing/mask/breath
|
||||
|
||||
@@ -67,17 +67,11 @@
|
||||
|
||||
gloves = /obj/item/clothing/gloves/color/yellow
|
||||
|
||||
/datum/outfit/job/engineer/gloved/rig
|
||||
name = "Station Engineer (Hardsuit)"
|
||||
/datum/outfit/job/engineer/mod
|
||||
name = "Station Engineer (MODsuit)"
|
||||
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/engine
|
||||
suit_store = /obj/item/tank/internals/oxygen
|
||||
back = /obj/item/mod/control/pre_equipped/engineering
|
||||
head = null
|
||||
mask = /obj/item/clothing/mask/breath
|
||||
internals_slot = ITEM_SLOT_SUITSTORE
|
||||
|
||||
/datum/outfit/job/engineer/gloved/gunner
|
||||
id_trim = /datum/id_trim/job/station_engineer/gunner
|
||||
|
||||
/datum/outfit/job/engineer/gloved/rig/gunner
|
||||
id_trim = /datum/id_trim/job/station_engineer/gunner
|
||||
|
||||
@@ -260,23 +260,26 @@
|
||||
user.log_message("activated a bottle of mayhem", LOG_ATTACK)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/hostile_environment
|
||||
/obj/item/clothing/suit/hooded/hostile_environment
|
||||
name = "H.E.C.K. suit"
|
||||
desc = "Hostile Environment Cross-Kinetic Suit: A suit designed to withstand the wide variety of hazards from Lavaland. It wasn't enough for its last owner."
|
||||
icon_state = "hostile_env"
|
||||
inhand_icon_state = "hostile_env"
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
resistance_flags = FIRE_PROOF | LAVA_PROOF | ACID_PROOF
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/hostile_environment
|
||||
slowdown = 0
|
||||
hoodtype = /obj/item/clothing/head/hooded/hostile_environment
|
||||
armor = list(MELEE = 70, BULLET = 40, LASER = 10, ENERGY = 20, BOMB = 50, BIO = 100, FIRE = 100, ACID = 100)
|
||||
cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
|
||||
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
|
||||
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
|
||||
clothing_flags = THICKMATERIAL
|
||||
resistance_flags = FIRE_PROOF|LAVA_PROOF|ACID_PROOF
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe)
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/hostile_environment/Initialize(mapload)
|
||||
/obj/item/clothing/suit/hooded/hostile_environment/Initialize(mapload)
|
||||
. = ..()
|
||||
AddElement(/datum/element/radiation_protected_clothing)
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/hostile_environment/process(delta_time)
|
||||
/obj/item/clothing/suit/hooded/hostile_environment/process(delta_time)
|
||||
. = ..()
|
||||
var/mob/living/carbon/wearer = loc
|
||||
if(istype(wearer) && DT_PROB(1, delta_time)) //cursed by bubblegum
|
||||
@@ -286,45 +289,47 @@
|
||||
else
|
||||
to_chat(wearer, span_warning("[pick("You hear faint whispers.","You smell ash.","You feel hot.","You hear a roar in the distance.")]"))
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/hostile_environment
|
||||
/obj/item/clothing/head/hooded/hostile_environment
|
||||
name = "H.E.C.K. helmet"
|
||||
desc = "Hostile Environiment Cross-Kinetic Helmet: A helmet designed to withstand the wide variety of hazards from Lavaland. It wasn't enough for its last owner."
|
||||
icon_state = "hardsuit0-heck"
|
||||
inhand_icon_state = "hostile_env"
|
||||
hardsuit_type = "heck"
|
||||
icon_state = "hostile_env"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
armor = list(MELEE = 70, BULLET = 40, LASER = 10, ENERGY = 20, BOMB = 50, BIO = 100, FIRE = 100, ACID = 100)
|
||||
resistance_flags = FIRE_PROOF | LAVA_PROOF | ACID_PROOF
|
||||
cold_protection = HEAD
|
||||
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
|
||||
heat_protection = HEAD
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
clothing_flags = SNUG_FIT|THICKMATERIAL
|
||||
resistance_flags = FIRE_PROOF|LAVA_PROOF|ACID_PROOF
|
||||
actions_types = list()
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/hostile_environment/Initialize(mapload)
|
||||
/obj/item/clothing/head/hooded/hostile_environment/Initialize(mapload)
|
||||
. = ..()
|
||||
update_appearance()
|
||||
AddComponent(/datum/component/butchering, 5, 150, null, null, null, TRUE, CALLBACK(src, .proc/consume))
|
||||
AddElement(/datum/element/radiation_protected_clothing)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/hostile_environment/equipped(mob/user, slot, initial = FALSE)
|
||||
/obj/item/clothing/head/hooded/hostile_environment/equipped(mob/user, slot, initial = FALSE)
|
||||
. = ..()
|
||||
RegisterSignal(user, COMSIG_HUMAN_EARLY_UNARMED_ATTACK, .proc/butcher_target)
|
||||
var/datum/component/butchering/butchering = GetComponent(/datum/component/butchering)
|
||||
butchering.butchering_enabled = TRUE
|
||||
to_chat(user, span_notice("You feel a bloodlust. You can now butcher corpses with your bare arms."))
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/hostile_environment/dropped(mob/user, silent = FALSE)
|
||||
/obj/item/clothing/head/hooded/hostile_environment/dropped(mob/user, silent = FALSE)
|
||||
. = ..()
|
||||
UnregisterSignal(user, COMSIG_HUMAN_EARLY_UNARMED_ATTACK)
|
||||
var/datum/component/butchering/butchering = GetComponent(/datum/component/butchering)
|
||||
butchering.butchering_enabled = FALSE
|
||||
to_chat(user, span_notice("You lose your bloodlust."))
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/hostile_environment/proc/butcher_target(mob/user, atom/target, proximity)
|
||||
/obj/item/clothing/head/hooded/hostile_environment/proc/butcher_target(mob/user, atom/target, proximity)
|
||||
SIGNAL_HANDLER
|
||||
if(!isliving(target))
|
||||
return
|
||||
return SEND_SIGNAL(src, COMSIG_ITEM_ATTACK, target, user)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/hostile_environment/proc/consume(mob/living/user, mob/living/butchered)
|
||||
/obj/item/clothing/head/hooded/hostile_environment/proc/consume(mob/living/user, mob/living/butchered)
|
||||
if(butchered.mob_biotypes & (MOB_ROBOTIC | MOB_SPIRIT))
|
||||
return
|
||||
var/health_consumed = butchered.maxHealth * 0.1
|
||||
@@ -333,13 +338,13 @@
|
||||
var/datum/client_colour/color = user.add_client_colour(/datum/client_colour/bloodlust)
|
||||
QDEL_IN(color, 1 SECONDS)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/hostile_environment/update_overlays()
|
||||
/obj/item/clothing/head/hooded/hostile_environment/update_overlays()
|
||||
. = ..()
|
||||
var/mutable_appearance/glass_overlay = mutable_appearance(icon, "hostile_env_glass")
|
||||
glass_overlay.appearance_flags = RESET_COLOR
|
||||
. += glass_overlay
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/hostile_environment/worn_overlays(mutable_appearance/standing, isinhands)
|
||||
/obj/item/clothing/head/hooded/hostile_environment/worn_overlays(mutable_appearance/standing, isinhands)
|
||||
. = ..()
|
||||
if(!isinhands)
|
||||
var/mutable_appearance/glass_overlay = mutable_appearance('icons/mob/clothing/head.dmi', "hostile_env_glass")
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
if(10)
|
||||
new /obj/item/ship_in_a_bottle(src)
|
||||
if(11)
|
||||
new /obj/item/clothing/suit/space/hardsuit/berserker(src)
|
||||
new /obj/item/clothing/suit/hooded/berserker(src)
|
||||
if(12)
|
||||
new /obj/item/jacobs_ladder(src)
|
||||
if(13)
|
||||
@@ -112,7 +112,7 @@
|
||||
name = "bubblegum chest"
|
||||
|
||||
/obj/structure/closet/crate/necropolis/bubblegum/PopulateContents()
|
||||
new /obj/item/clothing/suit/space/hardsuit/hostile_environment(src)
|
||||
new /obj/item/clothing/suit/hooded/hostile_environment(src)
|
||||
var/loot = rand(1,2)
|
||||
switch(loot)
|
||||
if(1)
|
||||
|
||||
@@ -581,29 +581,25 @@
|
||||
A.attackby(src, H)
|
||||
return COMPONENT_CANCEL_ATTACK_CHAIN
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/berserker
|
||||
name = "berserker hardsuit"
|
||||
desc = "Voices echo from the hardsuit, driving the user insane."
|
||||
icon_state = "hardsuit-berserker"
|
||||
inhand_icon_state = "hardsuit-berserker"
|
||||
slowdown = 0
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/berserker
|
||||
/obj/item/clothing/suit/hooded/berserker
|
||||
name = "berserker armor"
|
||||
desc = "Voices echo from the armor, driving the user insane. Is not space-proof."
|
||||
icon_state = "berserker"
|
||||
hoodtype = /obj/item/clothing/head/hooded/berserker
|
||||
armor = list(MELEE = 30, BULLET = 30, LASER = 10, ENERGY = 20, BOMB = 50, BIO = 100, FIRE = 100, ACID = 100)
|
||||
cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
|
||||
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
|
||||
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
|
||||
resistance_flags = FIRE_PROOF
|
||||
clothing_flags = THICKMATERIAL
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/pickaxe, /obj/item/spear, /obj/item/organ/regenerative_core/legion, /obj/item/knife, /obj/item/kinetic_crusher, /obj/item/resonator, /obj/item/melee/cleaving_saw)
|
||||
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/berserker/Initialize(mapload)
|
||||
/obj/item/clothing/suit/hooded/berserker/Initialize(mapload)
|
||||
. = ..()
|
||||
AddComponent(/datum/component/anti_magic, TRUE, TRUE, TRUE, ITEM_SLOT_OCLOTHING)
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/berserker/RemoveHelmet()
|
||||
var/obj/item/clothing/head/helmet/space/hardsuit/berserker/helm = helmet
|
||||
if(helm?.berserk_active)
|
||||
return
|
||||
return ..()
|
||||
|
||||
#define MAX_BERSERK_CHARGE 100
|
||||
#define PROJECTILE_HIT_MULTIPLIER 1.5
|
||||
#define DAMAGE_TO_CHARGE_SCALE 0.75
|
||||
@@ -611,30 +607,32 @@
|
||||
#define BERSERK_MELEE_ARMOR_ADDED 50
|
||||
#define BERSERK_ATTACK_SPEED_MODIFIER 0.25
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/berserker
|
||||
/obj/item/clothing/head/hooded/berserker
|
||||
name = "berserker helmet"
|
||||
desc = "Peering into the eyes of the helmet is enough to seal damnation."
|
||||
icon_state = "hardsuit0-berserker"
|
||||
inhand_icon_state = "hardsuit0-berserker"
|
||||
hardsuit_type = "berserker"
|
||||
icon_state = "berserker"
|
||||
armor = list(MELEE = 30, BULLET = 30, LASER = 10, ENERGY = 20, BOMB = 50, BIO = 100, FIRE = 100, ACID = 100)
|
||||
actions_types = list(/datum/action/item_action/berserk_mode)
|
||||
cold_protection = HEAD
|
||||
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
|
||||
heat_protection = HEAD
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
resistance_flags = FIRE_PROOF
|
||||
clothing_flags = SNUG_FIT|THICKMATERIAL
|
||||
/// Current charge of berserk, goes from 0 to 100
|
||||
var/berserk_charge = 0
|
||||
/// Status of berserk
|
||||
var/berserk_active = FALSE
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/berserker/Initialize(mapload)
|
||||
/obj/item/clothing/head/hooded/berserker/Initialize(mapload)
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, LOCKED_HELMET_TRAIT)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/berserker/examine()
|
||||
/obj/item/clothing/head/hooded/berserker/examine()
|
||||
. = ..()
|
||||
. += span_notice("Berserk mode is [berserk_charge]% charged.")
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/berserker/process(delta_time)
|
||||
/obj/item/clothing/head/hooded/berserker/process(delta_time)
|
||||
. = ..()
|
||||
if(berserk_active)
|
||||
berserk_charge = clamp(berserk_charge - CHARGE_DRAINED_PER_SECOND * delta_time, 0, MAX_BERSERK_CHARGE)
|
||||
@@ -642,11 +640,11 @@
|
||||
if(ishuman(loc))
|
||||
end_berserk(loc)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/berserker/dropped(mob/user)
|
||||
/obj/item/clothing/head/hooded/berserker/dropped(mob/user)
|
||||
. = ..()
|
||||
end_berserk(user)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/berserker/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
|
||||
/obj/item/clothing/head/hooded/berserker/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
|
||||
if(berserk_active)
|
||||
return
|
||||
var/berserk_value = damage * DAMAGE_TO_CHARGE_SCALE
|
||||
@@ -657,12 +655,12 @@
|
||||
to_chat(owner, span_notice("Berserk mode is fully charged."))
|
||||
balloon_alert(owner, "berserk charged")
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/berserker/IsReflect()
|
||||
/obj/item/clothing/head/hooded/berserker/IsReflect()
|
||||
if(berserk_active)
|
||||
return TRUE
|
||||
|
||||
/// Starts berserk, giving the wearer 50 melee armor, doubled attacking speed, NOGUNS trait, adding a color and giving them the berserk movespeed modifier
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/berserker/proc/berserk_mode(mob/living/carbon/human/user)
|
||||
/obj/item/clothing/head/hooded/berserker/proc/berserk_mode(mob/living/carbon/human/user)
|
||||
to_chat(user, span_warning("You enter berserk mode."))
|
||||
playsound(user, 'sound/magic/staff_healing.ogg', 50)
|
||||
user.add_movespeed_modifier(/datum/movespeed_modifier/berserk)
|
||||
@@ -672,11 +670,15 @@
|
||||
ADD_TRAIT(user, TRAIT_NOGUNS, BERSERK_TRAIT)
|
||||
ADD_TRAIT(src, TRAIT_NODROP, BERSERK_TRAIT)
|
||||
berserk_active = TRUE
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
/// Ends berserk, reverting the changes from the proc [berserk_mode]
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/berserker/proc/end_berserk(mob/living/carbon/human/user)
|
||||
/obj/item/clothing/head/hooded/berserker/proc/end_berserk(mob/living/carbon/human/user)
|
||||
if(!berserk_active)
|
||||
return
|
||||
berserk_active = FALSE
|
||||
if(QDELETED(user))
|
||||
return
|
||||
to_chat(user, span_warning("You exit berserk mode."))
|
||||
playsound(user, 'sound/magic/summonitems_generic.ogg', 50)
|
||||
user.remove_movespeed_modifier(/datum/movespeed_modifier/berserk)
|
||||
@@ -685,7 +687,7 @@
|
||||
user.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, COLOR_BUBBLEGUM_RED)
|
||||
REMOVE_TRAIT(user, TRAIT_NOGUNS, BERSERK_TRAIT)
|
||||
REMOVE_TRAIT(src, TRAIT_NODROP, BERSERK_TRAIT)
|
||||
berserk_active = FALSE
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
|
||||
#undef MAX_BERSERK_CHARGE
|
||||
#undef PROJECTILE_HIT_MULTIPLIER
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
new /datum/data/mining_equipment("Explorer's Webbing", /obj/item/storage/belt/mining, 500),
|
||||
new /datum/data/mining_equipment("Point Transfer Card", /obj/item/card/mining_point_card, 500),
|
||||
new /datum/data/mining_equipment("Survival Medipen", /obj/item/reagent_containers/hypospray/medipen/survival, 500),
|
||||
new /datum/data/mining_equipment("Mining Plates", /obj/item/mod/construction/armor/mining, 500),
|
||||
new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/storage/firstaid/brute, 600),
|
||||
new /datum/data/mining_equipment("Tracking Implant Kit", /obj/item/storage/box/minertracker, 600),
|
||||
new /datum/data/mining_equipment("Jaunter", /obj/item/wormhole_jaunter, 750),
|
||||
@@ -40,9 +41,7 @@
|
||||
new /datum/data/mining_equipment("Lazarus Injector", /obj/item/lazarus_injector, 1000),
|
||||
new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/pickaxe/silver, 1000),
|
||||
new /datum/data/mining_equipment("Mining Conscription Kit", /obj/item/storage/backpack/duffelbag/mining_conscript, 1500),
|
||||
new /datum/data/mining_equipment("Jetpack Upgrade", /obj/item/tank/jetpack/suit, 2000),
|
||||
new /datum/data/mining_equipment("Space Cash", /obj/item/stack/spacecash/c1000, 2000),
|
||||
new /datum/data/mining_equipment("Mining Hardsuit", /obj/item/clothing/suit/space/hardsuit/mining, 2000),
|
||||
new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/pickaxe/diamond, 2000),
|
||||
new /datum/data/mining_equipment("Super Resonator", /obj/item/resonator/upgraded, 2500),
|
||||
new /datum/data/mining_equipment("Jump Boots", /obj/item/clothing/shoes/bhop, 2500),
|
||||
|
||||
@@ -583,12 +583,20 @@
|
||||
if(!isnull(G.lighting_alpha))
|
||||
lighting_alpha = min(lighting_alpha, G.lighting_alpha)
|
||||
|
||||
if(HAS_TRAIT(src, TRAIT_TRUE_NIGHT_VISION))
|
||||
lighting_alpha = min(lighting_alpha, LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE)
|
||||
see_in_dark = max(see_in_dark, 8)
|
||||
|
||||
if(HAS_TRAIT(src, TRAIT_MESON_VISION))
|
||||
sight |= SEE_TURFS
|
||||
lighting_alpha = min(lighting_alpha, LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE)
|
||||
|
||||
if(HAS_TRAIT(src, TRAIT_THERMAL_VISION))
|
||||
sight |= (SEE_MOBS)
|
||||
sight |= SEE_MOBS
|
||||
lighting_alpha = min(lighting_alpha, LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE)
|
||||
|
||||
if(HAS_TRAIT(src, TRAIT_XRAY_VISION))
|
||||
sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS)
|
||||
sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS
|
||||
see_in_dark = max(see_in_dark, 8)
|
||||
|
||||
if(see_override)
|
||||
|
||||
@@ -6,22 +6,6 @@
|
||||
..()
|
||||
return loc.handle_slip(src, knockdown_amount, O, lube, paralyze, force_drop)
|
||||
|
||||
/mob/living/carbon/Process_Spacemove(movement_dir = 0)
|
||||
if(!isturf(loc))
|
||||
return FALSE
|
||||
|
||||
// Do we have a jetpack implant (and is it on)?
|
||||
var/obj/item/organ/cyberimp/chest/thrusters/T = getorganslot(ORGAN_SLOT_THRUSTERS)
|
||||
if(istype(T) && movement_dir && T.on)
|
||||
return TRUE
|
||||
|
||||
var/obj/item/tank/jetpack/J = get_jetpack()
|
||||
if(istype(J) && (movement_dir || J.stabilizers) && J.on)
|
||||
return TRUE
|
||||
|
||||
if(..())
|
||||
return TRUE
|
||||
|
||||
/mob/living/carbon/Move(NewLoc, direct)
|
||||
. = ..()
|
||||
if(. && !(movement_type & FLOATING)) //floating is easy
|
||||
|
||||
@@ -51,7 +51,7 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy)
|
||||
///Travel to the bottom of the contents chain, expanding it out
|
||||
for(var/i = 1; i <= length(items_to_check); i++) //Needs to be a c style loop since it can expand
|
||||
var/obj/item/checking = items_to_check[i]
|
||||
if(!checking) //Nulls in the list, depressing
|
||||
if(QDELETED(checking)) //Nulls in the list, depressing
|
||||
continue
|
||||
if(!isitem(checking)) //What the fuck are you on
|
||||
to_nuke += checking
|
||||
|
||||
@@ -444,7 +444,7 @@
|
||||
threatcount += 2
|
||||
|
||||
//Check for dresscode violations
|
||||
if(istype(head, /obj/item/clothing/head/wizard) || istype(head, /obj/item/clothing/head/helmet/space/hardsuit/wizard))
|
||||
if(istype(head, /obj/item/clothing/head/wizard))
|
||||
threatcount += 2
|
||||
|
||||
//Check for nonhuman scum
|
||||
|
||||
@@ -137,6 +137,8 @@
|
||||
var/final_block_chance = head.block_chance - (clamp((armour_penetration-head.armour_penetration)/2,0,100)) + block_chance_modifier
|
||||
if(head.hit_reaction(src, AM, attack_text, final_block_chance, damage, attack_type))
|
||||
return TRUE
|
||||
if(SEND_SIGNAL(src, COMSIG_HUMAN_CHECK_SHIELDS, AM, damage, attack_text, attack_type, armour_penetration) & SHIELD_BLOCK)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/mob/living/carbon/human/proc/check_block()
|
||||
|
||||
@@ -111,17 +111,6 @@
|
||||
. = ..()
|
||||
. += "[dna.species.type]"
|
||||
|
||||
/mob/living/carbon/human/can_see_reagents()
|
||||
. = ..()
|
||||
if(.) //No need to run through all of this if it's already true.
|
||||
return
|
||||
if(isclothing(glasses) && (glasses.clothing_flags & SCAN_REAGENTS))
|
||||
return TRUE
|
||||
if(isclothing(head) && (head.clothing_flags & SCAN_REAGENTS))
|
||||
return TRUE
|
||||
if(isclothing(wear_mask) && (wear_mask.clothing_flags & SCAN_REAGENTS))
|
||||
return TRUE
|
||||
|
||||
/// When we're joining the game in [/mob/dead/new_player/proc/create_character], we increment our scar slot then store the slot in our mind datum.
|
||||
/mob/living/carbon/human/proc/increment_scar_slot()
|
||||
var/check_ckey = ckey || client?.ckey
|
||||
|
||||
@@ -26,22 +26,8 @@
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/human/experience_pressure_difference()
|
||||
playsound(src, 'sound/effects/space_wind.ogg', 50, TRUE)
|
||||
if(shoes && istype(shoes, /obj/item/clothing))
|
||||
var/obj/item/clothing/S = shoes
|
||||
if (S.clothing_flags & NOSLIP)
|
||||
return 0
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/human/mob_has_gravity()
|
||||
. = ..()
|
||||
if(!.)
|
||||
if(mob_negates_gravity())
|
||||
. = 1
|
||||
|
||||
/mob/living/carbon/human/mob_negates_gravity()
|
||||
return ((shoes?.negates_gravity()) || (dna.species.negates_gravity(src)))
|
||||
return dna.species.negates_gravity(src) || ..()
|
||||
|
||||
/mob/living/carbon/human/Move(NewLoc, direct)
|
||||
. = ..()
|
||||
|
||||
@@ -321,7 +321,8 @@
|
||||
if(equip_to_slot_if_possible(thing, slot_type))
|
||||
update_inv_hands()
|
||||
return
|
||||
if(!SEND_SIGNAL(equipped_item, COMSIG_CONTAINS_STORAGE)) // not a storage item
|
||||
var/datum/component/storage/storage = equipped_item.GetComponent(/datum/component/storage)
|
||||
if(!storage)
|
||||
if(!thing)
|
||||
equipped_item.attack_hand(src)
|
||||
else
|
||||
@@ -331,10 +332,11 @@
|
||||
if(!SEND_SIGNAL(equipped_item, COMSIG_TRY_STORAGE_INSERT, thing, src))
|
||||
to_chat(src, span_warning("You can't fit [thing] into your [equipped_item.name]!"))
|
||||
return
|
||||
if(!equipped_item.contents.len) // nothing to take out
|
||||
var/atom/real_location = storage.real_location()
|
||||
if(!real_location.contents.len) // nothing to take out
|
||||
to_chat(src, span_warning("There's nothing in your [equipped_item.name] to take out!"))
|
||||
return
|
||||
var/obj/item/stored = equipped_item.contents[equipped_item.contents.len]
|
||||
var/obj/item/stored = real_location.contents[real_location.contents.len]
|
||||
if(!stored || stored.on_found(src))
|
||||
return
|
||||
stored.attack_hand(src) // take out thing from item in storage slot
|
||||
|
||||
@@ -1089,7 +1089,7 @@ GLOBAL_LIST_EMPTY(features_by_species)
|
||||
if(ITEM_SLOT_FEET)
|
||||
if(H.num_legs < 2)
|
||||
return FALSE
|
||||
if(DIGITIGRADE in species_traits)
|
||||
if((DIGITIGRADE in species_traits) && !(I.item_flags & IGNORE_DIGITIGRADE))
|
||||
if(!disable_warning)
|
||||
to_chat(H, span_warning("The footwear around here isn't compatible with your feet!"))
|
||||
return FALSE
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
if(environment.gases[/datum/gas/hypernoblium] && (environment.gases[/datum/gas/hypernoblium][MOLES]) >= 5)
|
||||
if(H.on_fire && H.fire_stacks > 0)
|
||||
H.adjust_fire_stacks(-10 * delta_time)
|
||||
else if(!HAS_TRAIT(H, TRAIT_NOFIRE))
|
||||
else if(!HAS_TRAIT(H, TRAIT_NOFIRE) && !HAS_TRAIT(H, TRAIT_NOSELFIGNITION))
|
||||
if(environment.gases[/datum/gas/oxygen] && (environment.gases[/datum/gas/oxygen][MOLES]) >= 1) //Same threshhold that extinguishes fire
|
||||
H.adjust_fire_stacks(0.25 * delta_time)
|
||||
if(!H.on_fire && H.fire_stacks > 0)
|
||||
|
||||
@@ -182,7 +182,7 @@
|
||||
return
|
||||
|
||||
/mob/living/proc/handle_gravity(delta_time, times_fired)
|
||||
var/gravity = mob_has_gravity()
|
||||
var/gravity = has_gravity()
|
||||
update_gravity(gravity)
|
||||
|
||||
if(gravity > STANDARD_GRAVITY)
|
||||
|
||||
@@ -49,6 +49,8 @@
|
||||
return ..()
|
||||
|
||||
/mob/living/proc/ZImpactDamage(turf/T, levels)
|
||||
if(SEND_SIGNAL(src, COMSIG_LIVING_Z_IMPACT, levels, T) & NO_Z_IMPACT_DAMAGE)
|
||||
return
|
||||
visible_message(span_danger("[src] crashes into [T] with a sickening noise!"), \
|
||||
span_userdanger("You crash into [T] with a sickening noise!"))
|
||||
adjustBruteLoss((levels * 5) ** 1.5)
|
||||
@@ -79,6 +81,7 @@
|
||||
|
||||
//Called when we bump onto a mob
|
||||
/mob/living/proc/MobBump(mob/M)
|
||||
SEND_SIGNAL(src, COMSIG_LIVING_MOB_BUMP, M)
|
||||
//Even if we don't push/swap places, we "touched" them, so spread fire
|
||||
spreadFire(M)
|
||||
|
||||
@@ -883,7 +886,8 @@
|
||||
return pick("trails_1", "trails_2")
|
||||
|
||||
/mob/living/experience_pressure_difference(pressure_difference, direction, pressure_resistance_prob_delta = 0)
|
||||
if(buckled)
|
||||
playsound(src, 'sound/effects/space_wind.ogg', 50, TRUE)
|
||||
if(buckled || mob_negates_gravity())
|
||||
return
|
||||
if(client && client.move_delay >= world.time + world.tick_lag*2)
|
||||
pressure_resistance_prob_delta -= 30
|
||||
@@ -1289,13 +1293,6 @@
|
||||
G.Recall()
|
||||
to_chat(G, span_holoparasite("Your summoner has changed form!"))
|
||||
|
||||
/mob/living/anti_magic_check(magic = TRUE, holy = FALSE, tinfoil = FALSE, chargecost = 1, self = FALSE)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
if((magic && HAS_TRAIT(src, TRAIT_ANTIMAGIC)) || (holy && HAS_TRAIT(src, TRAIT_HOLY)))
|
||||
return src
|
||||
|
||||
/mob/living/proc/fakefireextinguish()
|
||||
return
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
var/requires_power = POWER_REQ_ALL
|
||||
var/can_be_carded = TRUE
|
||||
var/icon/holo_icon //Default is assigned when AI is created.
|
||||
var/obj/vehicle/sealed/mecha/controlled_mech //For controlled_mech a mech, to determine whether to relaymove or use the AI eye.
|
||||
var/obj/controlled_equipment //A piece of equipment, to determine whether to relaymove or use the AI eye.
|
||||
var/radio_enabled = TRUE //Determins if a carded AI can speak with its built in radio or not.
|
||||
radiomod = ";" //AIs will, by default, state their laws on the internal radio.
|
||||
///Used as a fake multitoool in tcomms machinery
|
||||
@@ -221,7 +221,7 @@
|
||||
malfhack = null
|
||||
current = null
|
||||
Bot = null
|
||||
controlled_mech = null
|
||||
controlled_equipment = null
|
||||
linked_core = null
|
||||
apc_override = null
|
||||
return ..()
|
||||
@@ -452,7 +452,7 @@
|
||||
log_game("Warning: possible href exploit by [key_name(usr)] - attempted control of a mecha without can_dominate_mechs or a control beacon in the mech.")
|
||||
return
|
||||
|
||||
if(controlled_mech)
|
||||
if(controlled_equipment)
|
||||
to_chat(src, span_warning("You are already loaded into an onboard computer!"))
|
||||
return
|
||||
if(!GLOB.cameranet.checkCameraVis(M))
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
return
|
||||
//Being dead doesn't mean your temperature never changes
|
||||
|
||||
update_gravity(mob_has_gravity())
|
||||
update_gravity(has_gravity())
|
||||
|
||||
handle_status_effects(delta_time, times_fired)
|
||||
|
||||
|
||||
@@ -718,7 +718,6 @@
|
||||
|
||||
hat_offset = model.hat_offset
|
||||
|
||||
magpulse = model.magpulsing
|
||||
INVOKE_ASYNC(src, .proc/updatename)
|
||||
|
||||
|
||||
|
||||
@@ -105,8 +105,6 @@
|
||||
///So they can initialize sparks whenever/N
|
||||
var/datum/effect_system/spark_spread/spark_system
|
||||
|
||||
///Magboot-like effect.
|
||||
var/magpulse = FALSE
|
||||
///Jetpack-like effect.
|
||||
var/ionpulse = FALSE
|
||||
///Jetpack-like effect.
|
||||
@@ -209,7 +207,7 @@
|
||||
playstyle_string = "<span class='big bold'>You are a Syndicate medical cyborg!</span><br>\
|
||||
<b>You are armed with powerful medical tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \
|
||||
Your hypospray will produce Restorative Nanites, a wonder-drug that will heal most types of bodily damages, including clone and brain damage. It also produces morphine for offense. \
|
||||
Your defibrillator paddles can revive operatives through their hardsuits, or can be used on harm intent to shock enemies! \
|
||||
Your defibrillator paddles can revive operatives through their suits, or can be used on harm intent to shock enemies! \
|
||||
Your energy saw functions as a circular saw, but can be activated to deal more damage, and your operative pinpointer will find and locate fellow nuclear operatives. \
|
||||
<i>Help the operatives secure the disk at all costs!</i></b>"
|
||||
set_model = /obj/item/robot_model/syndicate_medical
|
||||
|
||||
@@ -37,8 +37,6 @@
|
||||
var/list/model_traits = null
|
||||
///List of radio channels added to the cyborg
|
||||
var/list/radio_channels = list()
|
||||
///Do we have a magboot effect
|
||||
var/magpulsing = FALSE
|
||||
///Do we clean when we move
|
||||
var/clean_on_move = FALSE
|
||||
///Whether the borg loses tool slots with damage.
|
||||
@@ -330,7 +328,7 @@
|
||||
emag_modules = list(/obj/item/borg/stun)
|
||||
cyborg_base_icon = "engineer"
|
||||
model_select_icon = "engineer"
|
||||
magpulsing = TRUE
|
||||
model_traits = list(TRAIT_NEGATES_GRAVITY)
|
||||
hat_offset = -4
|
||||
|
||||
/obj/item/robot_model/janitor
|
||||
@@ -631,8 +629,7 @@
|
||||
|
||||
cyborg_base_icon = "synd_engi"
|
||||
model_select_icon = "malf"
|
||||
model_traits = list(TRAIT_PUSHIMMUNE)
|
||||
magpulsing = TRUE
|
||||
model_traits = list(TRAIT_PUSHIMMUNE, TRAIT_NEGATES_GRAVITY)
|
||||
hat_offset = -4
|
||||
canDispose = TRUE
|
||||
|
||||
|
||||
@@ -5,13 +5,3 @@
|
||||
if(ionpulse())
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/mob/living/silicon/robot/mob_negates_gravity()
|
||||
return magpulse
|
||||
|
||||
/mob/living/silicon/robot/mob_has_gravity()
|
||||
return ..() || mob_negates_gravity()
|
||||
|
||||
/mob/living/silicon/robot/experience_pressure_difference(pressure_difference, direction)
|
||||
if(!magpulse)
|
||||
return ..()
|
||||
|
||||
@@ -180,6 +180,7 @@
|
||||
diag_hud.add_to_hud(src)
|
||||
|
||||
ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT)
|
||||
ADD_TRAIT(src, TRAIT_NEGATES_GRAVITY, INNATE_TRAIT)
|
||||
|
||||
listener = new(list(ALARM_ATMOS, ALARM_FIRE, ALARM_POWER), list(z))
|
||||
RegisterSignal(listener, COMSIG_ALARM_TRIGGERED, .proc/alarm_triggered)
|
||||
@@ -353,15 +354,6 @@
|
||||
if(affect_silicon)
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/drone/mob_negates_gravity()
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_animal/drone/mob_has_gravity()
|
||||
return ..() || mob_negates_gravity()
|
||||
|
||||
/mob/living/simple_animal/drone/experience_pressure_difference(pressure_difference, direction)
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/drone/bee_friendly()
|
||||
// Why would bees pay attention to drones?
|
||||
return TRUE
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
"2. Kill.\n"+\
|
||||
"3. Destroy."
|
||||
default_storage = /obj/item/uplink
|
||||
default_hatmask = /obj/item/clothing/head/helmet/space/hardsuit/syndi
|
||||
default_hatmask = /obj/item/clothing/head/helmet/swat
|
||||
hacked = TRUE
|
||||
shy = FALSE
|
||||
flavortext = null
|
||||
@@ -39,7 +39,6 @@
|
||||
|
||||
/mob/living/simple_animal/drone/syndrone/badass
|
||||
name = "Badass Syndrone"
|
||||
default_hatmask = /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite
|
||||
default_storage = /obj/item/uplink/nuclear
|
||||
|
||||
/mob/living/simple_animal/drone/syndrone/badass/Initialize(mapload)
|
||||
|
||||
@@ -86,7 +86,7 @@
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/giant_spider/mob_negates_gravity()
|
||||
return ..() || (locate(/obj/structure/spider/stickyweb) in loc)
|
||||
return (locate(/obj/structure/spider/stickyweb) in loc) || ..()
|
||||
|
||||
/**
|
||||
* # Spider Hunter
|
||||
|
||||
@@ -882,7 +882,7 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list(
|
||||
/mob/living/simple_animal/parrot/poly
|
||||
name = "Poly"
|
||||
desc = "Poly the Parrot. An expert on quantum cracker theory."
|
||||
speak = list("Poly wanna cracker!", ":e Check the crystal, you chucklefucks!",":e Wire the solars, you lazy bums!",":e WHO TOOK THE DAMN HARDSUITS?",":e OH GOD ITS ABOUT TO DELAMINATE CALL THE SHUTTLE")
|
||||
speak = list("Poly wanna cracker!", ":e Check the crystal, you chucklefucks!",":e Wire the solars, you lazy bums!",":e WHO TOOK THE DAMN MODSUITS?",":e OH GOD ITS ABOUT TO DELAMINATE CALL THE SHUTTLE")
|
||||
gold_core_spawnable = NO_SPAWN
|
||||
speak_chance = 3
|
||||
var/memory_saved = FALSE
|
||||
|
||||
@@ -928,7 +928,7 @@
|
||||
return pick(protection_sources)
|
||||
else
|
||||
return src
|
||||
if((magic && HAS_TRAIT(src, TRAIT_ANTIMAGIC)) || (holy && HAS_TRAIT(src, TRAIT_HOLY)))
|
||||
if((magic && HAS_TRAIT(src, TRAIT_ANTIMAGIC)) || (!self && magic && HAS_TRAIT(src, TRAIT_ANTIMAGIC_NO_SELFBLOCK)) || (holy && HAS_TRAIT(src, TRAIT_HOLY)))
|
||||
return src
|
||||
|
||||
/**
|
||||
|
||||
@@ -525,7 +525,7 @@
|
||||
|
||||
///Can the mob see reagents inside of containers?
|
||||
/mob/proc/can_see_reagents()
|
||||
return stat == DEAD || has_unlimited_silicon_privilege //Dead guys and silicons can always see reagents
|
||||
return stat == DEAD || has_unlimited_silicon_privilege || HAS_TRAIT(src, TRAIT_REAGENT_SCANNER) //Dead guys and silicons can always see reagents
|
||||
|
||||
///Can this mob hold items
|
||||
/mob/proc/can_hold_items(obj/item/I)
|
||||
|
||||
@@ -320,19 +320,15 @@
|
||||
continue
|
||||
. = AM
|
||||
|
||||
/**
|
||||
* Returns true if a mob has gravity
|
||||
*
|
||||
* I hate that this exists
|
||||
*/
|
||||
/mob/proc/mob_has_gravity()
|
||||
return has_gravity()
|
||||
/mob/has_gravity()
|
||||
return mob_negates_gravity() || ..()
|
||||
|
||||
/**
|
||||
* Does this mob ignore gravity
|
||||
*/
|
||||
/mob/proc/mob_negates_gravity()
|
||||
return FALSE
|
||||
var/turf/turf = get_turf(src)
|
||||
return !isgroundlessturf(turf) && HAS_TRAIT(src, TRAIT_NEGATES_GRAVITY)
|
||||
|
||||
/// Called when this mob slips over, override as needed
|
||||
/mob/proc/slip(knockdown_amount, obj/O, lube, paralyze, force_drop)
|
||||
|
||||
@@ -26,11 +26,8 @@
|
||||
outfit = /datum/outfit/job/engineer/gloved
|
||||
icon_state = "corpseengineer"
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/engineer/rig
|
||||
outfit = /datum/outfit/job/engineer/gloved/rig
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/engineer/rig/gunner
|
||||
outfit = /datum/outfit/job/engineer/gloved/rig/gunner
|
||||
/obj/effect/mob_spawn/corpse/human/engineer/mod
|
||||
outfit = /datum/outfit/job/engineer/mod
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/clown
|
||||
name = "Clown"
|
||||
@@ -47,8 +44,8 @@
|
||||
outfit = /datum/outfit/job/miner
|
||||
icon_state = "corpseminer"
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/miner/rig
|
||||
outfit = /datum/outfit/job/miner/equipped/hardsuit
|
||||
/obj/effect/mob_spawn/corpse/human/miner/mod
|
||||
outfit = /datum/outfit/job/miner/equipped/mod
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/miner/explorer
|
||||
outfit = /datum/outfit/job/miner/equipped
|
||||
|
||||
@@ -29,12 +29,11 @@
|
||||
/datum/outfit/syndicatecommandocorpse
|
||||
name = "Syndicate Commando Corpse"
|
||||
uniform = /obj/item/clothing/under/syndicate
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/syndi
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
gloves = /obj/item/clothing/gloves/tackler/combat/insulated
|
||||
ears = /obj/item/radio/headset
|
||||
mask = /obj/item/clothing/mask/gas/syndicate
|
||||
back = /obj/item/tank/jetpack/oxygen
|
||||
back = /obj/item/mod/control/pre_equipped/nuclear
|
||||
r_pocket = /obj/item/tank/internals/emergency_oxygen
|
||||
id = /obj/item/card/id/advanced/chameleon
|
||||
id_trim = /datum/id_trim/chameleon/operative
|
||||
@@ -49,12 +48,11 @@
|
||||
/datum/outfit/syndicatestormtroopercorpse
|
||||
name = "Syndicate Stormtrooper Corpse"
|
||||
uniform = /obj/item/clothing/under/syndicate
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/syndi/elite
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
gloves = /obj/item/clothing/gloves/tackler/combat
|
||||
ears = /obj/item/radio/headset
|
||||
mask = /obj/item/clothing/mask/gas/syndicate
|
||||
back = /obj/item/tank/jetpack/oxygen/harness
|
||||
back = /obj/item/mod/control/pre_equipped/elite
|
||||
id = /obj/item/card/id/advanced/chameleon
|
||||
id_trim = /datum/id_trim/chameleon/operative
|
||||
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
/datum/action/item_action/mod
|
||||
background_icon_state = "bg_tech_blue"
|
||||
icon_icon = 'icons/mob/actions/actions_mod.dmi'
|
||||
check_flags = AB_CHECK_CONSCIOUS
|
||||
var/obj/item/mod/control/mod
|
||||
|
||||
/datum/action/item_action/mod/New(Target)
|
||||
..()
|
||||
mod = Target
|
||||
|
||||
/datum/action/item_action/mod/Grant(mob/M)
|
||||
if(owner)
|
||||
Share(M)
|
||||
return
|
||||
..()
|
||||
|
||||
/datum/action/item_action/mod/Remove(mob/M)
|
||||
var/mob_to_grant
|
||||
for(var/datum/weakref/reference as anything in sharers)
|
||||
var/mob/freeloader = reference.resolve()
|
||||
if(!freeloader)
|
||||
continue
|
||||
mob_to_grant = freeloader
|
||||
break
|
||||
..()
|
||||
if(mob_to_grant)
|
||||
Grant(mob_to_grant)
|
||||
|
||||
/datum/action/item_action/mod/deploy
|
||||
name = "Deploy MODsuit"
|
||||
desc = "Deploy/Conceal a part of the MODsuit."
|
||||
button_icon_state = "deploy"
|
||||
|
||||
/datum/action/item_action/mod/deploy/Trigger()
|
||||
if(!IsAvailable())
|
||||
return FALSE
|
||||
mod.choose_deploy(usr)
|
||||
return TRUE
|
||||
|
||||
/datum/action/item_action/mod/activate
|
||||
name = "Activate MODsuit"
|
||||
desc = "Activate/Deactivate the MODsuit."
|
||||
button_icon_state = "activate"
|
||||
|
||||
/datum/action/item_action/mod/activate/Trigger()
|
||||
if(!IsAvailable())
|
||||
return FALSE
|
||||
mod.toggle_activate(usr)
|
||||
return TRUE
|
||||
|
||||
/datum/action/item_action/mod/module
|
||||
name = "Toggle Module"
|
||||
desc = "Toggle a MODsuit module."
|
||||
button_icon_state = "module"
|
||||
|
||||
/datum/action/item_action/mod/module/Trigger()
|
||||
if(!IsAvailable())
|
||||
return FALSE
|
||||
mod.quick_module(usr)
|
||||
return TRUE
|
||||
|
||||
/datum/action/item_action/mod/panel
|
||||
name = "MODsuit Panel"
|
||||
desc = "Open the MODsuit's panel."
|
||||
button_icon_state = "panel"
|
||||
|
||||
/datum/action/item_action/mod/panel/Trigger()
|
||||
if(!IsAvailable())
|
||||
return FALSE
|
||||
mod.ui_interact(usr)
|
||||
return TRUE
|
||||
@@ -0,0 +1,217 @@
|
||||
#define MOD_ACTIVATION_STEP_TIME 2 SECONDS
|
||||
#define MOD_ACTIVATION_STEP_FLAGS IGNORE_USER_LOC_CHANGE|IGNORE_TARGET_LOC_CHANGE|IGNORE_HELD_ITEM|IGNORE_INCAPACITATED
|
||||
|
||||
/// Creates a radial menu from which the user chooses parts of the suit to deploy/retract. Repeats until all parts are extended or retracted.
|
||||
/obj/item/mod/control/proc/choose_deploy(mob/user)
|
||||
if(!length(mod_parts))
|
||||
return
|
||||
var/list/display_names = list()
|
||||
var/list/items = list()
|
||||
for(var/obj/item/piece as anything in mod_parts)
|
||||
display_names[piece.name] = REF(piece)
|
||||
var/image/piece_image = image(icon = piece.icon, icon_state = piece.icon_state)
|
||||
items += list(piece.name = piece_image)
|
||||
var/pick = show_radial_menu(user, src, items, custom_check = FALSE, require_near = TRUE, tooltips = TRUE)
|
||||
if(!pick)
|
||||
return
|
||||
var/part_reference = display_names[pick]
|
||||
var/obj/item/part = locate(part_reference) in mod_parts
|
||||
if(!istype(part) || user.incapacitated())
|
||||
return
|
||||
if(active || activating)
|
||||
balloon_alert(user, "deactivate the suit first!")
|
||||
playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
|
||||
return
|
||||
var/parts_to_check = mod_parts - part
|
||||
if(part.loc == src)
|
||||
deploy(user, part)
|
||||
for(var/obj/item/piece as anything in parts_to_check)
|
||||
if(piece.loc != src)
|
||||
continue
|
||||
choose_deploy(user)
|
||||
break
|
||||
else
|
||||
conceal(user, part)
|
||||
for(var/obj/item/piece as anything in parts_to_check)
|
||||
if(piece.loc == src)
|
||||
continue
|
||||
choose_deploy(user)
|
||||
break
|
||||
|
||||
/// Deploys a part of the suit onto the user.
|
||||
/obj/item/mod/control/proc/deploy(mob/user, part)
|
||||
var/obj/item/piece = part
|
||||
if(piece == gauntlets && wearer.gloves)
|
||||
gauntlets.overslot = wearer.gloves
|
||||
wearer.transferItemToLoc(gauntlets.overslot, gauntlets, force = TRUE)
|
||||
if(piece == boots && wearer.shoes)
|
||||
boots.overslot = wearer.shoes
|
||||
wearer.transferItemToLoc(boots.overslot, boots, force = TRUE)
|
||||
if(wearer.equip_to_slot_if_possible(piece, piece.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE))
|
||||
ADD_TRAIT(piece, TRAIT_NODROP, MOD_TRAIT)
|
||||
if(!user)
|
||||
return TRUE
|
||||
wearer.visible_message(span_notice("[wearer]'s [piece] deploy[piece.p_s()] with a mechanical hiss."),
|
||||
span_notice("[piece] deploy[piece.p_s()] with a mechanical hiss."),
|
||||
span_hear("You hear a mechanical hiss."))
|
||||
playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
|
||||
return TRUE
|
||||
else if(piece.loc != src)
|
||||
if(!user)
|
||||
return FALSE
|
||||
balloon_alert(user, "[piece] already deployed!")
|
||||
playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
|
||||
else
|
||||
if(!user)
|
||||
return FALSE
|
||||
balloon_alert(user, "bodypart clothed!")
|
||||
playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
|
||||
return FALSE
|
||||
|
||||
/// Retract a part of the suit from the user
|
||||
/obj/item/mod/control/proc/conceal(mob/user, part)
|
||||
var/obj/item/piece = part
|
||||
REMOVE_TRAIT(piece, TRAIT_NODROP, MOD_TRAIT)
|
||||
wearer.transferItemToLoc(piece, src, force = TRUE)
|
||||
if(piece == gauntlets)
|
||||
gauntlets.show_overslot()
|
||||
if(piece == boots)
|
||||
boots.show_overslot()
|
||||
if(!user)
|
||||
return
|
||||
wearer.visible_message(span_notice("[wearer]'s [piece] retract[piece.p_s()] back into [src] with a mechanical hiss."),
|
||||
span_notice("[piece] retract[piece.p_s()] back into [src] with a mechanical hiss."),
|
||||
span_hear("You hear a mechanical hiss."))
|
||||
playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
|
||||
|
||||
/// Starts the activation sequence, where parts of the suit activate one by one until the whole suit is on
|
||||
/obj/item/mod/control/proc/toggle_activate(mob/user, force_deactivate = FALSE)
|
||||
if(!wearer)
|
||||
if(!force_deactivate)
|
||||
balloon_alert(user, "put suit on back!")
|
||||
playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
|
||||
return FALSE
|
||||
if(!force_deactivate && (SEND_SIGNAL(src, COMSIG_MOD_ACTIVATE, user) & MOD_CANCEL_ACTIVATE))
|
||||
playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
|
||||
return FALSE
|
||||
for(var/obj/item/part as anything in mod_parts)
|
||||
if(!force_deactivate && part.loc == src)
|
||||
balloon_alert(user, "deploy all parts first!")
|
||||
playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
|
||||
return FALSE
|
||||
if(locked && !active && !allowed(user) && !force_deactivate)
|
||||
balloon_alert(user, "access insufficient!")
|
||||
playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
|
||||
return FALSE
|
||||
if(!cell?.charge && !force_deactivate)
|
||||
balloon_alert(user, "suit not powered!")
|
||||
playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
|
||||
return FALSE
|
||||
if(open && !force_deactivate)
|
||||
balloon_alert(user, "close the suit panel!")
|
||||
playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
|
||||
return FALSE
|
||||
if(activating)
|
||||
if(!force_deactivate)
|
||||
balloon_alert(user, "suit already [active ? "shutting down" : "starting up"]!")
|
||||
playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
|
||||
return FALSE
|
||||
for(var/obj/item/mod/module/module as anything in modules)
|
||||
if(!module.active)
|
||||
continue
|
||||
module.on_deactivation()
|
||||
activating = TRUE
|
||||
to_chat(wearer, span_notice("MODsuit [active ? "shutting down" : "starting up"]."))
|
||||
if(do_after(wearer, MOD_ACTIVATION_STEP_TIME, wearer, MOD_ACTIVATION_STEP_FLAGS))
|
||||
to_chat(wearer, span_notice("[boots] [active ? "relax their grip on your legs" : "seal around your feet"]."))
|
||||
playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
|
||||
seal_part(boots, seal = !active)
|
||||
if(do_after(wearer, MOD_ACTIVATION_STEP_TIME, wearer, MOD_ACTIVATION_STEP_FLAGS))
|
||||
to_chat(wearer, span_notice("[gauntlets] [active ? "become loose around your fingers" : "tighten around your fingers and wrists"]."))
|
||||
playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
|
||||
seal_part(gauntlets, seal = !active)
|
||||
if(do_after(wearer, MOD_ACTIVATION_STEP_TIME, wearer, MOD_ACTIVATION_STEP_FLAGS))
|
||||
to_chat(wearer, span_notice("[chestplate] [active ? "releases your chest" : "cinches tightly against your chest"]."))
|
||||
playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
|
||||
seal_part(chestplate,seal = !active)
|
||||
if(do_after(wearer, MOD_ACTIVATION_STEP_TIME, wearer, MOD_ACTIVATION_STEP_FLAGS))
|
||||
to_chat(wearer, span_notice("[helmet] hisses [active ? "open" : "closed"]."))
|
||||
playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
|
||||
seal_part(helmet, seal = !active)
|
||||
if(do_after(wearer, MOD_ACTIVATION_STEP_TIME, wearer, MOD_ACTIVATION_STEP_FLAGS))
|
||||
to_chat(wearer, span_notice("Systems [active ? "shut down. Parts unsealed. Goodbye" : "started up. Parts sealed. Welcome"], [wearer]."))
|
||||
if(ai)
|
||||
to_chat(ai, span_notice("<b>SYSTEMS [active ? "DEACTIVATED. GOODBYE" : "ACTIVATED. WELCOME"]: \"[ai]\"</b>"))
|
||||
finish_activation(on = !active)
|
||||
if(active)
|
||||
playsound(src, 'sound/machines/synth_yes.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, frequency = 6000)
|
||||
SEND_SOUND(wearer, sound('sound/mecha/nominal.ogg',volume=50))
|
||||
else
|
||||
playsound(src, 'sound/machines/synth_no.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, frequency = 6000)
|
||||
activating = FALSE
|
||||
return TRUE
|
||||
|
||||
///Seals or unseals the given part
|
||||
/obj/item/mod/control/proc/seal_part(obj/item/clothing/part, seal)
|
||||
if(seal)
|
||||
part.clothing_flags |= part.visor_flags
|
||||
part.flags_inv |= part.visor_flags_inv
|
||||
part.flags_cover |= part.visor_flags_cover
|
||||
part.heat_protection = initial(part.heat_protection)
|
||||
part.cold_protection = initial(part.cold_protection)
|
||||
else
|
||||
part.flags_cover &= ~part.visor_flags_cover
|
||||
part.flags_inv &= ~part.visor_flags_inv
|
||||
part.clothing_flags &= ~part.visor_flags
|
||||
part.heat_protection = NONE
|
||||
part.cold_protection = NONE
|
||||
if(part == boots)
|
||||
boots.icon_state = "[skin]-boots[seal ? "-sealed" : ""]"
|
||||
wearer.update_inv_shoes()
|
||||
if(part == gauntlets)
|
||||
gauntlets.icon_state = "[skin]-gauntlets[seal ? "-sealed" : ""]"
|
||||
wearer.update_inv_gloves()
|
||||
if(part == chestplate)
|
||||
chestplate.icon_state = "[skin]-chestplate[seal ? "-sealed" : ""]"
|
||||
wearer.update_inv_wear_suit()
|
||||
wearer.update_inv_w_uniform()
|
||||
if(part == helmet)
|
||||
helmet.icon_state = "[skin]-helmet[seal ? "-sealed" : ""]"
|
||||
if(seal)
|
||||
helmet.alternate_worn_layer = null
|
||||
else
|
||||
helmet.alternate_worn_layer = helmet.alternate_layer
|
||||
wearer.update_inv_head()
|
||||
wearer.update_inv_wear_mask()
|
||||
wearer.update_hair()
|
||||
|
||||
/// Finishes the suit's activation, starts processing
|
||||
/obj/item/mod/control/proc/finish_activation(on)
|
||||
icon_state = "[skin]-control[on ? "-sealed" : ""]"
|
||||
slowdown = on ? slowdown_active : slowdown_inactive
|
||||
if(on)
|
||||
for(var/obj/item/mod/module/module as anything in modules)
|
||||
module.on_suit_activation()
|
||||
START_PROCESSING(SSobj, src)
|
||||
else
|
||||
for(var/obj/item/mod/module/module as anything in modules)
|
||||
module.on_suit_deactivation()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
wearer.update_equipment_speed_mods()
|
||||
active = on
|
||||
wearer.update_inv_back()
|
||||
|
||||
/// Quickly deploys all the suit parts and if successful, seals them and turns on the suit. Intended mostly for outfits.
|
||||
/obj/item/mod/control/proc/quick_activation()
|
||||
var/seal = TRUE
|
||||
for(var/obj/item/part in mod_parts)
|
||||
if(!deploy(null, part))
|
||||
seal = FALSE
|
||||
if(!seal)
|
||||
return
|
||||
for(var/obj/item/part in mod_parts)
|
||||
seal_part(part, seal = TRUE)
|
||||
finish_activation(on = TRUE)
|
||||
|
||||
#undef MOD_ACTIVATION_STEP_TIME
|
||||
#undef MOD_ACTIVATION_STEP_FLAGS
|
||||
@@ -0,0 +1,88 @@
|
||||
/obj/item/mod/control/transfer_ai(interaction, mob/user, mob/living/silicon/ai/intAI, obj/item/aicard/card)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
if(!open) //mod must be open
|
||||
balloon_alert(user, "suit must be open to transfer!")
|
||||
return
|
||||
switch(interaction)
|
||||
if(AI_TRANS_TO_CARD)
|
||||
if(!ai)
|
||||
balloon_alert(user, "no AI in suit!")
|
||||
return
|
||||
balloon_alert(user, "transferring to card...")
|
||||
if(!do_after(user, 5 SECONDS, target = src))
|
||||
balloon_alert(user, "interrupted!")
|
||||
return
|
||||
intAI = ai
|
||||
intAI.ai_restore_power()//So the AI initially has power.
|
||||
intAI.control_disabled = TRUE
|
||||
intAI.radio_enabled = FALSE
|
||||
intAI.disconnect_shell()
|
||||
intAI.forceMove(card)
|
||||
card.AI = intAI
|
||||
for(var/datum/action/action as anything in actions)
|
||||
if(action.owner == intAI)
|
||||
action.Remove(intAI)
|
||||
else
|
||||
action.Unshare(intAI)
|
||||
intAI.controlled_equipment = null
|
||||
intAI.remote_control = null
|
||||
balloon_alert(intAI, "transferred to a card")
|
||||
balloon_alert(user, "AI transferred to card")
|
||||
ai = null
|
||||
|
||||
if(AI_TRANS_FROM_CARD) //Using an AI card to upload to the suit.
|
||||
intAI = card.AI
|
||||
if(!intAI)
|
||||
balloon_alert(user, "no AI in card!")
|
||||
return
|
||||
if(intAI.deployed_shell) //Recall AI if shelled so it can be checked for a client
|
||||
intAI.disconnect_shell()
|
||||
if(intAI.stat || !intAI.client)
|
||||
balloon_alert(user, "AI unresponsive!")
|
||||
return
|
||||
balloon_alert(user, "transferring to suit...")
|
||||
if(!do_after(user, 5 SECONDS, target = src))
|
||||
balloon_alert(user, "interrupted!")
|
||||
return
|
||||
balloon_alert(user, "AI transferred to suit")
|
||||
ai_enter_mod(intAI)
|
||||
card.AI = null
|
||||
|
||||
/obj/item/mod/control/proc/ai_enter_mod(mob/living/silicon/ai/new_ai)
|
||||
new_ai.control_disabled = FALSE
|
||||
new_ai.radio_enabled = TRUE
|
||||
new_ai.ai_restore_power()
|
||||
new_ai.cancel_camera()
|
||||
new_ai.controlled_equipment = src
|
||||
new_ai.remote_control = src
|
||||
new_ai.forceMove(src)
|
||||
ai = new_ai
|
||||
balloon_alert(new_ai, "transferred to a suit")
|
||||
for(var/datum/action/action as anything in actions)
|
||||
action.Grant(new_ai)
|
||||
|
||||
#define MOVE_DELAY 2
|
||||
#define WEARER_DELAY 1
|
||||
#define LONE_DELAY 5
|
||||
#define CELL_PER_STEP DEFAULT_CELL_DRAIN * 2.5
|
||||
|
||||
/obj/item/mod/control/relaymove(mob/user, direction)
|
||||
if((!active && wearer) || !cell || cell.charge < CELL_PER_STEP || user != ai || !COOLDOWN_FINISHED(src, cooldown_mod_move) || (wearer?.pulledby?.grab_state > GRAB_PASSIVE))
|
||||
return FALSE
|
||||
var/timemodifier = MOVE_DELAY * (ISDIAGONALDIR(direction) ? SQRT_2 : 1) * (wearer ? WEARER_DELAY : LONE_DELAY)
|
||||
COOLDOWN_START(src, cooldown_mod_move, movedelay * timemodifier + slowdown)
|
||||
playsound(src, 'sound/mecha/mechmove01.ogg', 25, TRUE)
|
||||
cell.charge = max(0, cell.charge - CELL_PER_STEP)
|
||||
if(ismovable(wearer?.loc))
|
||||
return wearer.loc.relaymove(wearer, direction)
|
||||
if(wearer && !wearer.Process_Spacemove(direction))
|
||||
return FALSE
|
||||
var/atom/movable/mover = wearer || src
|
||||
return step(mover, direction)
|
||||
|
||||
#undef MOVE_DELAY
|
||||
#undef WEARER_DELAY
|
||||
#undef LONE_DELAY
|
||||
#undef CELL_PER_STEP
|
||||
@@ -0,0 +1,123 @@
|
||||
/obj/item/clothing/head/helmet/space/mod
|
||||
name = "MOD helmet"
|
||||
desc = "A helmet for a MODsuit."
|
||||
icon = 'icons/obj/mod.dmi'
|
||||
icon_state = "helmet"
|
||||
worn_icon = 'icons/mob/mod.dmi'
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10)
|
||||
body_parts_covered = HEAD
|
||||
heat_protection = HEAD
|
||||
cold_protection = HEAD
|
||||
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
|
||||
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
|
||||
clothing_flags = THICKMATERIAL
|
||||
resistance_flags = NONE
|
||||
flash_protect = FLASH_PROTECTION_NONE
|
||||
clothing_flags = SNUG_FIT
|
||||
flags_inv = HIDEFACIALHAIR
|
||||
flags_cover = NONE
|
||||
visor_flags = THICKMATERIAL|STOPSPRESSUREDAMAGE
|
||||
visor_flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT
|
||||
visor_flags_cover = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF
|
||||
var/alternate_layer = NECK_LAYER
|
||||
var/obj/item/mod/control/mod
|
||||
|
||||
/obj/item/clothing/head/helmet/space/mod/Destroy()
|
||||
if(!QDELETED(mod))
|
||||
mod.helmet = null
|
||||
mod.mod_parts -= src
|
||||
QDEL_NULL(mod)
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/suit/armor/mod
|
||||
name = "MOD chestplate"
|
||||
desc = "A chestplate for a MODsuit."
|
||||
icon = 'icons/obj/mod.dmi'
|
||||
icon_state = "chestplate"
|
||||
worn_icon = 'icons/mob/mod.dmi'
|
||||
blood_overlay_type = "armor"
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10)
|
||||
body_parts_covered = CHEST|GROIN
|
||||
heat_protection = CHEST|GROIN
|
||||
cold_protection = CHEST|GROIN
|
||||
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
|
||||
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
|
||||
clothing_flags = THICKMATERIAL
|
||||
visor_flags = STOPSPRESSUREDAMAGE
|
||||
visor_flags_inv = HIDEJUMPSUIT
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank/internals)
|
||||
resistance_flags = NONE
|
||||
var/obj/item/mod/control/mod
|
||||
|
||||
/obj/item/clothing/suit/armor/mod/Destroy()
|
||||
if(!QDELETED(mod))
|
||||
mod.chestplate = null
|
||||
mod.mod_parts -= src
|
||||
QDEL_NULL(mod)
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/gloves/mod
|
||||
name = "MOD gauntlets"
|
||||
desc = "A pair of gauntlets for a MODsuit."
|
||||
icon = 'icons/obj/mod.dmi'
|
||||
icon_state = "gauntlets"
|
||||
worn_icon = 'icons/mob/mod.dmi'
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10)
|
||||
body_parts_covered = HANDS|ARMS
|
||||
heat_protection = HANDS|ARMS
|
||||
cold_protection = HANDS|ARMS
|
||||
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
|
||||
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
|
||||
clothing_flags = THICKMATERIAL
|
||||
resistance_flags = NONE
|
||||
var/obj/item/mod/control/mod
|
||||
var/obj/item/clothing/overslot
|
||||
|
||||
/obj/item/clothing/gloves/mod/Destroy()
|
||||
if(!QDELETED(mod))
|
||||
mod.gauntlets = null
|
||||
mod.mod_parts -= src
|
||||
QDEL_NULL(mod)
|
||||
return ..()
|
||||
|
||||
/// Replaces these gloves on the wearer with the overslot ones
|
||||
|
||||
/obj/item/clothing/gloves/mod/proc/show_overslot()
|
||||
if(!overslot)
|
||||
return
|
||||
if(!mod.wearer.equip_to_slot_if_possible(overslot, overslot.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE))
|
||||
mod.wearer.dropItemToGround(overslot, force = TRUE, silent = TRUE)
|
||||
overslot = null
|
||||
|
||||
/obj/item/clothing/shoes/mod
|
||||
name = "MOD boots"
|
||||
desc = "A pair of boots for a MODsuit."
|
||||
icon = 'icons/obj/mod.dmi'
|
||||
icon_state = "boots"
|
||||
worn_icon = 'icons/mob/mod.dmi'
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10)
|
||||
body_parts_covered = FEET|LEGS
|
||||
heat_protection = FEET|LEGS
|
||||
cold_protection = FEET|LEGS
|
||||
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
|
||||
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
|
||||
clothing_flags = THICKMATERIAL
|
||||
resistance_flags = NONE
|
||||
item_flags = IGNORE_DIGITIGRADE
|
||||
var/obj/item/mod/control/mod
|
||||
var/obj/item/clothing/overslot
|
||||
|
||||
/obj/item/clothing/shoes/mod/Destroy()
|
||||
if(!QDELETED(mod))
|
||||
mod.boots = null
|
||||
mod.mod_parts -= src
|
||||
QDEL_NULL(mod)
|
||||
return ..()
|
||||
|
||||
/// Replaces these shoes on the wearer with the overslot ones
|
||||
/obj/item/clothing/shoes/mod/proc/show_overslot()
|
||||
if(!overslot)
|
||||
return
|
||||
if(!mod.wearer.equip_to_slot_if_possible(overslot, overslot.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE))
|
||||
mod.wearer.dropItemToGround(overslot, force = TRUE, silent = TRUE)
|
||||
overslot = null
|
||||
@@ -0,0 +1,278 @@
|
||||
/obj/item/mod/construction
|
||||
desc = "A part used in MOD construction."
|
||||
inhand_icon_state = "rack_parts"
|
||||
|
||||
/obj/item/mod/construction/helmet
|
||||
name = "MOD helmet"
|
||||
icon_state = "helmet"
|
||||
|
||||
/obj/item/mod/construction/chestplate
|
||||
name = "MOD chestplate"
|
||||
icon_state = "chestplate"
|
||||
|
||||
/obj/item/mod/construction/gauntlets
|
||||
name = "MOD gauntlets"
|
||||
icon_state = "gauntlets"
|
||||
|
||||
/obj/item/mod/construction/boots
|
||||
name = "MOD boots"
|
||||
icon_state = "boots"
|
||||
|
||||
/obj/item/mod/construction/core
|
||||
name = "MOD core"
|
||||
icon_state = "mod-core"
|
||||
desc = "Growing in the most lush, fertile areas of the planet Sprout, there is a crystal known as the Heartbloom. \
|
||||
These rare, organic piezoelectric crystals are of incredible cultural significance to the artist castes of the Ethereals, \
|
||||
owing to their appearance; which is exactly similar to that of an Ethereal's heart. \n\
|
||||
Which one you have in your suit is unclear, but either way, \
|
||||
it's been repurposed to be an internal power source for a Modular Outerwear Device."
|
||||
|
||||
/obj/item/mod/construction/broken_core
|
||||
name = "broken MOD core"
|
||||
icon_state = "mod-core-broken"
|
||||
desc = "An internal power source for a Modular Outerwear Device. You don't seem to be able to source any power from this one, though."
|
||||
|
||||
/obj/item/mod/construction/broken_core/examine(mob/user)
|
||||
. = ..()
|
||||
. += span_notice("You could repair it with a <b>screwdriver</b>...")
|
||||
|
||||
/obj/item/mod/construction/broken_core/screwdriver_act(mob/living/user, obj/item/tool)
|
||||
. = ..()
|
||||
if(!tool.use_tool(src, user, 5 SECONDS, volume = 30))
|
||||
return
|
||||
new /obj/item/mod/construction/core(drop_location())
|
||||
qdel(src)
|
||||
|
||||
/obj/item/mod/construction/armor
|
||||
name = "MOD armor plates"
|
||||
desc = "Armor plates used to finish a MOD."
|
||||
icon_state = "standard-armor"
|
||||
var/datum/mod_theme/theme = /datum/mod_theme
|
||||
|
||||
/obj/item/mod/construction/armor/Initialize(mapload)
|
||||
. = ..()
|
||||
var/datum/mod_theme/used_theme = GLOB.mod_themes[theme]
|
||||
name = "MOD [used_theme.name] armor plates"
|
||||
desc = "[desc] [used_theme.desc]"
|
||||
icon_state = "[used_theme.default_skin]-armor"
|
||||
|
||||
/obj/item/mod/construction/armor/engineering
|
||||
theme = /datum/mod_theme/engineering
|
||||
|
||||
/obj/item/mod/construction/armor/atmospheric
|
||||
theme = /datum/mod_theme/atmospheric
|
||||
|
||||
/obj/item/mod/construction/armor/mining
|
||||
theme = /datum/mod_theme/mining
|
||||
|
||||
/obj/item/mod/construction/armor/medical
|
||||
theme = /datum/mod_theme/medical
|
||||
|
||||
/obj/item/mod/construction/armor/security
|
||||
theme = /datum/mod_theme/security
|
||||
|
||||
/obj/item/mod/construction/armor/cosmohonk
|
||||
theme = /datum/mod_theme/cosmohonk
|
||||
|
||||
/obj/item/mod/paint
|
||||
name = "MOD paint kit"
|
||||
desc = "This kit will repaint your MODsuit to something unique."
|
||||
icon = 'icons/obj/mod.dmi'
|
||||
icon_state = "paintkit"
|
||||
|
||||
#define START_STEP "start"
|
||||
#define CORE_STEP "core"
|
||||
#define SCREWED_CORE_STEP "screwed_core"
|
||||
#define HELMET_STEP "helmet"
|
||||
#define CHESTPLATE_STEP "chestplate"
|
||||
#define GAUNTLETS_STEP "gauntlets"
|
||||
#define BOOTS_STEP "boots"
|
||||
#define WRENCHED_ASSEMBLY_STEP "wrenched_assembly"
|
||||
#define SCREWED_ASSEMBLY_STEP "screwed_assembly"
|
||||
|
||||
/obj/item/mod/construction/shell
|
||||
name = "MOD shell"
|
||||
icon_state = "mod-construction_start"
|
||||
desc = "A MOD shell."
|
||||
var/obj/item/core
|
||||
var/obj/item/helmet
|
||||
var/obj/item/chestplate
|
||||
var/obj/item/gauntlets
|
||||
var/obj/item/boots
|
||||
var/step = START_STEP
|
||||
|
||||
/obj/item/mod/construction/shell/examine(mob/user)
|
||||
. = ..()
|
||||
var/display_text
|
||||
switch(step)
|
||||
if(START_STEP)
|
||||
display_text = "It looks like it's missing a <b>MOD core</b>..."
|
||||
if(CORE_STEP)
|
||||
display_text = "The core seems <b>loose</b>..."
|
||||
if(SCREWED_CORE_STEP)
|
||||
display_text = "It looks like it's missing a <b>helmet</b>..."
|
||||
if(HELMET_STEP)
|
||||
display_text = "It looks like it's missing a <b>chestplate</b>..."
|
||||
if(CHESTPLATE_STEP)
|
||||
display_text = "It looks like it's missing <b>gauntlets</b>..."
|
||||
if(GAUNTLETS_STEP)
|
||||
display_text = "It looks like it's missing <b>boots</b>..."
|
||||
if(BOOTS_STEP)
|
||||
display_text = "The assembly seems <b>unsecured</b>..."
|
||||
if(WRENCHED_ASSEMBLY_STEP)
|
||||
display_text = "The assembly seems <b>loose</b>..."
|
||||
if(SCREWED_ASSEMBLY_STEP)
|
||||
display_text = "All it's missing is <b>external armor</b>..."
|
||||
. += span_notice(display_text)
|
||||
|
||||
/obj/item/mod/construction/shell/attackby(obj/item/part, mob/user, params)
|
||||
. = ..()
|
||||
switch(step)
|
||||
if(START_STEP)
|
||||
if(!istype(part, /obj/item/mod/construction/core))
|
||||
return
|
||||
if(!user.transferItemToLoc(part, src))
|
||||
balloon_alert(user, "core stuck to your hand!")
|
||||
return
|
||||
playsound(src, 'sound/machines/click.ogg', 30, TRUE)
|
||||
balloon_alert(user, "core inserted")
|
||||
core = part
|
||||
step = CORE_STEP
|
||||
if(CORE_STEP)
|
||||
if(part.tool_behaviour == TOOL_SCREWDRIVER) //Construct
|
||||
if(part.use_tool(src, user, 0, volume=30))
|
||||
balloon_alert(user, "core screwed")
|
||||
step = SCREWED_CORE_STEP
|
||||
else if(part.tool_behaviour == TOOL_CROWBAR) //Deconstruct
|
||||
if(part.use_tool(src, user, 0, volume=30))
|
||||
core.forceMove(drop_location())
|
||||
balloon_alert(user, "core taken out")
|
||||
step = START_STEP
|
||||
if(SCREWED_CORE_STEP)
|
||||
if(istype(part, /obj/item/mod/construction/helmet)) //Construct
|
||||
if(!user.transferItemToLoc(part, src))
|
||||
balloon_alert(user, "helmet stuck to your hand!")
|
||||
return
|
||||
playsound(src, 'sound/machines/click.ogg', 30, TRUE)
|
||||
balloon_alert(user, "helmet added")
|
||||
helmet = part
|
||||
step = HELMET_STEP
|
||||
else if(part.tool_behaviour == TOOL_SCREWDRIVER) //Deconstruct
|
||||
if(part.use_tool(src, user, 0, volume=30))
|
||||
balloon_alert(user, "core unscrewed")
|
||||
step = CORE_STEP
|
||||
if(HELMET_STEP)
|
||||
if(istype(part, /obj/item/mod/construction/chestplate)) //Construct
|
||||
if(!user.transferItemToLoc(part, src))
|
||||
balloon_alert(user, "chestplate stuck to your hand!")
|
||||
return
|
||||
playsound(src, 'sound/machines/click.ogg', 30, TRUE)
|
||||
balloon_alert(user, "chestplate added")
|
||||
chestplate = part
|
||||
step = CHESTPLATE_STEP
|
||||
else if(part.tool_behaviour == TOOL_CROWBAR) //Deconstruct
|
||||
if(part.use_tool(src, user, 0, volume=30))
|
||||
helmet.forceMove(drop_location())
|
||||
balloon_alert(user, "helmet removed")
|
||||
helmet = null
|
||||
step = SCREWED_CORE_STEP
|
||||
if(CHESTPLATE_STEP)
|
||||
if(istype(part, /obj/item/mod/construction/gauntlets)) //Construct
|
||||
if(!user.transferItemToLoc(part, src))
|
||||
balloon_alert(user, "gauntlets stuck to your hand!")
|
||||
return
|
||||
playsound(src, 'sound/machines/click.ogg', 30, TRUE)
|
||||
balloon_alert(user, "gauntlets added")
|
||||
gauntlets = part
|
||||
step = GAUNTLETS_STEP
|
||||
else if(part.tool_behaviour == TOOL_CROWBAR) //Deconstruct
|
||||
if(part.use_tool(src, user, 0, volume=30))
|
||||
chestplate.forceMove(drop_location())
|
||||
balloon_alert(user, "chestplate removed")
|
||||
chestplate = null
|
||||
step = HELMET_STEP
|
||||
if(GAUNTLETS_STEP)
|
||||
if(istype(part, /obj/item/mod/construction/boots)) //Construct
|
||||
if(!user.transferItemToLoc(part, src))
|
||||
balloon_alert(user, "boots added")
|
||||
return
|
||||
playsound(src, 'sound/machines/click.ogg', 30, TRUE)
|
||||
balloon_alert(user, "You fit [part] onto [src].")
|
||||
boots = part
|
||||
step = BOOTS_STEP
|
||||
else if(part.tool_behaviour == TOOL_CROWBAR) //Deconstruct
|
||||
if(part.use_tool(src, user, 0, volume=30))
|
||||
gauntlets.forceMove(drop_location())
|
||||
balloon_alert(user, "gauntlets removed")
|
||||
gauntlets = null
|
||||
step = CHESTPLATE_STEP
|
||||
if(BOOTS_STEP)
|
||||
if(part.tool_behaviour == TOOL_WRENCH) //Construct
|
||||
if(part.use_tool(src, user, 0, volume=30))
|
||||
balloon_alert(user, "assembly secured")
|
||||
step = WRENCHED_ASSEMBLY_STEP
|
||||
else if(part.tool_behaviour == TOOL_CROWBAR) //Deconstruct
|
||||
if(part.use_tool(src, user, 0, volume=30))
|
||||
boots.forceMove(drop_location())
|
||||
balloon_alert(user, "boots removed")
|
||||
boots = null
|
||||
step = GAUNTLETS_STEP
|
||||
if(WRENCHED_ASSEMBLY_STEP)
|
||||
if(part.tool_behaviour == TOOL_SCREWDRIVER) //Construct
|
||||
if(part.use_tool(src, user, 0, volume=30))
|
||||
balloon_alert(user, "assembly screwed")
|
||||
step = SCREWED_ASSEMBLY_STEP
|
||||
else if(part.tool_behaviour == TOOL_WRENCH) //Deconstruct
|
||||
if(part.use_tool(src, user, 0, volume=30))
|
||||
balloon_alert(user, "assembly unsecured")
|
||||
step = BOOTS_STEP
|
||||
if(SCREWED_ASSEMBLY_STEP)
|
||||
if(istype(part, /obj/item/mod/construction/armor)) //Construct
|
||||
var/obj/item/mod/construction/armor/external_armor = part
|
||||
if(!user.transferItemToLoc(part, src))
|
||||
return
|
||||
playsound(src, 'sound/machines/click.ogg', 30, TRUE)
|
||||
balloon_alert(user, "suit finished")
|
||||
var/obj/item/modsuit = new /obj/item/mod/control(drop_location(), external_armor.theme)
|
||||
qdel(src)
|
||||
user.put_in_hands(modsuit)
|
||||
else if(part.tool_behaviour == TOOL_SCREWDRIVER) //Construct
|
||||
if(part.use_tool(src, user, 0, volume=30))
|
||||
balloon_alert(user, "assembly unscrewed")
|
||||
step = SCREWED_ASSEMBLY_STEP
|
||||
update_icon_state()
|
||||
|
||||
/obj/item/mod/construction/shell/update_icon_state()
|
||||
. = ..()
|
||||
icon_state = "mod-construction_[step]"
|
||||
|
||||
/obj/item/mod/construction/shell/Destroy()
|
||||
QDEL_NULL(core)
|
||||
QDEL_NULL(helmet)
|
||||
QDEL_NULL(chestplate)
|
||||
QDEL_NULL(gauntlets)
|
||||
QDEL_NULL(boots)
|
||||
return ..()
|
||||
|
||||
/obj/item/mod/construction/shell/handle_atom_del(atom/deleted_atom)
|
||||
if(deleted_atom == core)
|
||||
core = null
|
||||
if(deleted_atom == helmet)
|
||||
helmet = null
|
||||
if(deleted_atom == chestplate)
|
||||
chestplate = null
|
||||
if(deleted_atom == gauntlets)
|
||||
gauntlets = null
|
||||
if(deleted_atom == boots)
|
||||
boots = null
|
||||
return ..()
|
||||
|
||||
#undef START_STEP
|
||||
#undef CORE_STEP
|
||||
#undef SCREWED_CORE_STEP
|
||||
#undef HELMET_STEP
|
||||
#undef CHESTPLATE_STEP
|
||||
#undef GAUNTLETS_STEP
|
||||
#undef BOOTS_STEP
|
||||
#undef WRENCHED_ASSEMBLY_STEP
|
||||
#undef SCREWED_ASSEMBLY_STEP
|
||||
@@ -0,0 +1,559 @@
|
||||
/// MODsuits, trade-off between armor and utility
|
||||
/obj/item/mod
|
||||
name = "Base MOD"
|
||||
desc = "You should not see this, yell at a coder!"
|
||||
icon = 'icons/obj/mod.dmi'
|
||||
icon_state = "standard-control"
|
||||
worn_icon = 'icons/mob/mod.dmi'
|
||||
|
||||
/obj/item/mod/control
|
||||
name = "MOD control unit"
|
||||
desc = "The control unit of a Modular Outerwear Device, a powered, back-mounted suit that protects against various environments."
|
||||
icon_state = "control"
|
||||
inhand_icon_state = "mod_control"
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
slot_flags = ITEM_SLOT_BACK
|
||||
strip_delay = 10 SECONDS
|
||||
slowdown = 2
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10)
|
||||
actions_types = list(/datum/action/item_action/mod/deploy, /datum/action/item_action/mod/activate, /datum/action/item_action/mod/module, /datum/action/item_action/mod/panel)
|
||||
resistance_flags = NONE
|
||||
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
|
||||
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
|
||||
permeability_coefficient = 0.01
|
||||
siemens_coefficient = 0.5
|
||||
alternate_worn_layer = BODY_FRONT_LAYER
|
||||
/// The MOD's theme, decides on some stuff like armor and statistics.
|
||||
var/datum/mod_theme/theme = /datum/mod_theme
|
||||
/// Looks of the MOD.
|
||||
var/skin = "standard"
|
||||
/// Theme of the MOD TGUI
|
||||
var/ui_theme = "ntos"
|
||||
/// If the suit is deployed and turned on.
|
||||
var/active = FALSE
|
||||
/// If the suit wire/module hatch is open.
|
||||
var/open = FALSE
|
||||
/// If the suit is ID locked.
|
||||
var/locked = FALSE
|
||||
/// If the suit is malfunctioning.
|
||||
var/malfunctioning = FALSE
|
||||
/// If the suit is currently activating/deactivating.
|
||||
var/activating = FALSE
|
||||
/// How long the MOD is electrified for.
|
||||
var/seconds_electrified = MACHINE_NOT_ELECTRIFIED
|
||||
/// If the suit interface is broken.
|
||||
var/interface_break = FALSE
|
||||
/// How much module complexity can this MOD carry.
|
||||
var/complexity_max = DEFAULT_MAX_COMPLEXITY
|
||||
/// How much module complexity this MOD is carrying.
|
||||
var/complexity = 0
|
||||
/// Power usage of the MOD.
|
||||
var/cell_drain = DEFAULT_CELL_DRAIN
|
||||
/// Slowdown of the MOD when not active.
|
||||
var/slowdown_inactive = 2
|
||||
/// Slowdown of the MOD when active.
|
||||
var/slowdown_active = 1
|
||||
/// MOD cell.
|
||||
var/obj/item/stock_parts/cell/cell
|
||||
/// MOD helmet.
|
||||
var/obj/item/clothing/head/helmet/space/mod/helmet
|
||||
/// MOD chestplate.
|
||||
var/obj/item/clothing/suit/armor/mod/chestplate
|
||||
/// MOD gauntlets.
|
||||
var/obj/item/clothing/gloves/mod/gauntlets
|
||||
/// MOD boots.
|
||||
var/obj/item/clothing/shoes/mod/boots
|
||||
/// List of parts (helmet, chestplate, gauntlets, boots).
|
||||
var/list/mod_parts = list()
|
||||
/// Modules the MOD should spawn with.
|
||||
var/list/initial_modules = list()
|
||||
/// Modules the MOD currently possesses.
|
||||
var/list/modules = list()
|
||||
/// Currently used module.
|
||||
var/obj/item/mod/module/selected_module
|
||||
/// AI mob inhabiting the MOD.
|
||||
var/mob/living/silicon/ai/ai
|
||||
/// Delay between moves as AI.
|
||||
var/movedelay = 0
|
||||
/// Cooldown for AI moves.
|
||||
COOLDOWN_DECLARE(cooldown_mod_move)
|
||||
/// Person wearing the MODsuit.
|
||||
var/mob/living/carbon/human/wearer
|
||||
|
||||
/obj/item/mod/control/Initialize(mapload, new_theme, new_skin)
|
||||
. = ..()
|
||||
if(new_theme)
|
||||
theme = new_theme
|
||||
theme = GLOB.mod_themes[theme]
|
||||
slowdown_inactive = theme.slowdown_inactive
|
||||
slowdown_active = theme.slowdown_active
|
||||
slowdown = slowdown_inactive
|
||||
complexity_max = theme.complexity_max
|
||||
skin = new_skin || theme.default_skin
|
||||
ui_theme = theme.ui_theme
|
||||
cell_drain = theme.cell_drain
|
||||
initial_modules += theme.inbuilt_modules
|
||||
wires = new /datum/wires/mod(src)
|
||||
if(length(req_access))
|
||||
locked = TRUE
|
||||
if(ispath(cell))
|
||||
cell = new cell(src)
|
||||
helmet = new /obj/item/clothing/head/helmet/space/mod(src)
|
||||
helmet.mod = src
|
||||
mod_parts += helmet
|
||||
chestplate = new /obj/item/clothing/suit/armor/mod(src)
|
||||
chestplate.mod = src
|
||||
mod_parts += chestplate
|
||||
gauntlets = new /obj/item/clothing/gloves/mod(src)
|
||||
gauntlets.mod = src
|
||||
mod_parts += gauntlets
|
||||
boots = new /obj/item/clothing/shoes/mod(src)
|
||||
boots.mod = src
|
||||
mod_parts += boots
|
||||
var/list/all_parts = mod_parts.Copy() + src
|
||||
for(var/obj/item/piece as anything in all_parts)
|
||||
piece.name = "[theme.name] [piece.name]"
|
||||
piece.desc = "[piece.desc] [theme.desc]"
|
||||
piece.armor = getArmor(arglist(theme.armor))
|
||||
piece.resistance_flags = theme.resistance_flags
|
||||
piece.heat_protection = NONE
|
||||
piece.cold_protection = NONE
|
||||
piece.max_heat_protection_temperature = theme.max_heat_protection_temperature
|
||||
piece.min_cold_protection_temperature = theme.min_cold_protection_temperature
|
||||
piece.permeability_coefficient = theme.permeability_coefficient
|
||||
piece.siemens_coefficient = theme.siemens_coefficient
|
||||
piece.icon_state = "[skin]-[initial(piece.icon_state)]"
|
||||
update_flags()
|
||||
for(var/obj/item/mod/module/module as anything in initial_modules)
|
||||
module = new module(src)
|
||||
install(module)
|
||||
RegisterSignal(src, COMSIG_ATOM_EXITED, .proc/on_exit)
|
||||
movedelay = CONFIG_GET(number/movedelay/run_delay)
|
||||
|
||||
/obj/item/mod/control/Destroy()
|
||||
if(active)
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
var/atom/deleting_atom
|
||||
if(!QDELETED(helmet))
|
||||
deleting_atom = helmet
|
||||
helmet.mod = null
|
||||
helmet = null
|
||||
mod_parts -= deleting_atom
|
||||
qdel(deleting_atom)
|
||||
if(!QDELETED(chestplate))
|
||||
deleting_atom = chestplate
|
||||
chestplate.mod = null
|
||||
chestplate = null
|
||||
mod_parts -= deleting_atom
|
||||
qdel(deleting_atom)
|
||||
if(!QDELETED(gauntlets))
|
||||
deleting_atom = gauntlets
|
||||
gauntlets.mod = null
|
||||
gauntlets = null
|
||||
mod_parts -= deleting_atom
|
||||
qdel(deleting_atom)
|
||||
if(!QDELETED(boots))
|
||||
deleting_atom = boots
|
||||
boots.mod = null
|
||||
boots = null
|
||||
mod_parts -= deleting_atom
|
||||
qdel(deleting_atom)
|
||||
for(var/obj/item/mod/module/module as anything in modules)
|
||||
module.mod = null
|
||||
modules -= module
|
||||
QDEL_NULL(wires)
|
||||
QDEL_NULL(cell)
|
||||
return ..()
|
||||
|
||||
/obj/item/mod/control/process(delta_time)
|
||||
if(seconds_electrified > MACHINE_NOT_ELECTRIFIED)
|
||||
seconds_electrified--
|
||||
if((!cell || !cell.charge) && active && !activating)
|
||||
power_off()
|
||||
return PROCESS_KILL
|
||||
var/malfunctioning_charge_drain = 0
|
||||
if(malfunctioning)
|
||||
malfunctioning_charge_drain = rand(1,20)
|
||||
cell.charge = max(0, cell.charge - (cell_drain + malfunctioning_charge_drain)*delta_time)
|
||||
update_cell_alert()
|
||||
for(var/obj/item/mod/module/module as anything in modules)
|
||||
if(malfunctioning && module.active && DT_PROB(5, delta_time))
|
||||
module.on_deactivation()
|
||||
module.on_process(delta_time)
|
||||
|
||||
/obj/item/mod/control/equipped(mob/user, slot)
|
||||
..()
|
||||
if(slot == ITEM_SLOT_BACK)
|
||||
set_wearer(user)
|
||||
else if(wearer)
|
||||
unset_wearer()
|
||||
|
||||
/obj/item/mod/control/dropped(mob/user)
|
||||
. = ..()
|
||||
if(wearer)
|
||||
unset_wearer()
|
||||
|
||||
/obj/item/mod/control/item_action_slot_check(slot)
|
||||
if(slot == ITEM_SLOT_BACK)
|
||||
return TRUE
|
||||
|
||||
/obj/item/mod/control/allow_attack_hand_drop(mob/user)
|
||||
var/mob/living/carbon/carbon_user = user
|
||||
if(!istype(carbon_user) || src != carbon_user.back)
|
||||
return ..()
|
||||
for(var/obj/item/part in mod_parts)
|
||||
if(part.loc != src)
|
||||
balloon_alert(carbon_user, "retract parts first!")
|
||||
playsound(src, 'sound/machines/scanbuzz.ogg', 25, FALSE, SILENCED_SOUND_EXTRARANGE)
|
||||
return FALSE
|
||||
|
||||
/obj/item/mod/control/MouseDrop(atom/over_object)
|
||||
if(src != wearer?.back || !istype(over_object, /atom/movable/screen/inventory/hand))
|
||||
return ..()
|
||||
for(var/obj/item/part in mod_parts)
|
||||
if(part.loc != src)
|
||||
balloon_alert(wearer, "retract parts first!")
|
||||
playsound(src, 'sound/machines/scanbuzz.ogg', 25, FALSE, SILENCED_SOUND_EXTRARANGE)
|
||||
return
|
||||
if(!wearer.incapacitated())
|
||||
var/atom/movable/screen/inventory/hand/ui_hand = over_object
|
||||
if(wearer.putItemFromInventoryInHandIfPossible(src, ui_hand.held_index))
|
||||
add_fingerprint(usr)
|
||||
return ..()
|
||||
|
||||
/obj/item/mod/control/attack_hand(mob/user)
|
||||
if(seconds_electrified && cell?.charge)
|
||||
if(shock(user))
|
||||
return
|
||||
if(open && loc == user)
|
||||
if(!cell)
|
||||
balloon_alert(user, "no cell!")
|
||||
return
|
||||
balloon_alert(user, "removing cell...")
|
||||
if(!do_after(user, 1.5 SECONDS, target = src))
|
||||
balloon_alert(user, "interrupted!")
|
||||
return
|
||||
balloon_alert(user, "cell removed")
|
||||
playsound(src, 'sound/machines/click.ogg', 50, TRUE, SILENCED_SOUND_EXTRARANGE)
|
||||
if(!user.put_in_hands(cell))
|
||||
cell.forceMove(drop_location())
|
||||
update_cell_alert()
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/item/mod/control/screwdriver_act(mob/living/user, obj/item/screwdriver)
|
||||
if(..())
|
||||
return TRUE
|
||||
if(active || activating || ai_controller)
|
||||
balloon_alert(user, "deactivate suit first!")
|
||||
playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
|
||||
return FALSE
|
||||
balloon_alert(user, "[open ? "closing" : "opening"] panel...")
|
||||
screwdriver.play_tool_sound(src, 100)
|
||||
if(screwdriver.use_tool(src, user, 1 SECONDS))
|
||||
if(active || activating)
|
||||
balloon_alert(user, "deactivate suit first!")
|
||||
screwdriver.play_tool_sound(src, 100)
|
||||
balloon_alert(user, "panel [open ? "closed" : "opened"]")
|
||||
open = !open
|
||||
else
|
||||
balloon_alert(user, "interrupted!")
|
||||
return TRUE
|
||||
|
||||
/obj/item/mod/control/crowbar_act(mob/living/user, obj/item/crowbar)
|
||||
. = ..()
|
||||
if(!open)
|
||||
balloon_alert(user, "open the panel first!")
|
||||
playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
|
||||
return FALSE
|
||||
if(!allowed(user))
|
||||
balloon_alert(user, "insufficient access!")
|
||||
playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
|
||||
return
|
||||
if(length(modules))
|
||||
var/list/removable_modules = list()
|
||||
for(var/obj/item/mod/module/module as anything in modules)
|
||||
if(!module.removable)
|
||||
continue
|
||||
removable_modules += module
|
||||
var/obj/item/mod/module/module_to_remove = tgui_input_list(user, "Which module to remove?", "Module Removal", removable_modules)
|
||||
if(!module_to_remove?.mod)
|
||||
return FALSE
|
||||
uninstall(module_to_remove)
|
||||
module_to_remove.forceMove(drop_location())
|
||||
crowbar.play_tool_sound(src, 100)
|
||||
return TRUE
|
||||
balloon_alert(user, "no modules!")
|
||||
playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
|
||||
return FALSE
|
||||
|
||||
/obj/item/mod/control/attackby(obj/item/attacking_item, mob/living/user, params)
|
||||
if(istype(attacking_item, /obj/item/mod/module))
|
||||
if(!open)
|
||||
balloon_alert(user, "open the panel first!")
|
||||
playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
|
||||
return FALSE
|
||||
install(attacking_item, user)
|
||||
return TRUE
|
||||
else if(istype(attacking_item, /obj/item/stock_parts/cell))
|
||||
if(!open)
|
||||
balloon_alert(user, "open the panel first!")
|
||||
playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
|
||||
return FALSE
|
||||
if(cell)
|
||||
balloon_alert(user, "cell already installed!")
|
||||
playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
|
||||
return FALSE
|
||||
attacking_item.forceMove(src)
|
||||
cell = attacking_item
|
||||
balloon_alert(user, "cell installed")
|
||||
playsound(src, 'sound/machines/click.ogg', 50, TRUE, SILENCED_SOUND_EXTRARANGE)
|
||||
update_cell_alert()
|
||||
return TRUE
|
||||
else if(is_wire_tool(attacking_item) && open)
|
||||
wires.interact(user)
|
||||
return TRUE
|
||||
else if(istype(attacking_item, /obj/item/mod/paint))
|
||||
if(active || activating)
|
||||
balloon_alert(user, "suit is active!")
|
||||
else if(paint(user, attacking_item))
|
||||
balloon_alert(user, "suit painted")
|
||||
else
|
||||
balloon_alert(user, "not painted!")
|
||||
return TRUE
|
||||
else if(open && attacking_item.GetID())
|
||||
update_access(user, attacking_item)
|
||||
return TRUE
|
||||
return ..()
|
||||
|
||||
/obj/item/mod/control/get_cell()
|
||||
if(open)
|
||||
return cell
|
||||
|
||||
/obj/item/mod/control/GetAccess()
|
||||
if(ai_controller)
|
||||
return req_access.Copy()
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/mod/control/emag_act(mob/user)
|
||||
locked = !locked
|
||||
balloon_alert(user, "[locked ? "locked" : "unlocked"]")
|
||||
|
||||
/obj/item/mod/control/emp_act(severity)
|
||||
. = ..()
|
||||
to_chat(wearer, span_notice("[severity > 1 ? "Light" : "Strong"] electromagnetic pulse detected!"))
|
||||
if(!active || !wearer || . & EMP_PROTECT_CONTENTS)
|
||||
return
|
||||
selected_module = null
|
||||
wearer.apply_damage(10 / severity, BURN, spread_damage=TRUE)
|
||||
to_chat(wearer, span_danger("You feel [src] heat up from the EMP, burning you slightly."))
|
||||
if (wearer.stat < UNCONSCIOUS && prob(10))
|
||||
wearer.emote("scream")
|
||||
|
||||
/obj/item/mod/control/on_outfit_equip(mob/living/carbon/human/outfit_wearer, visuals_only, item_slot)
|
||||
if(visuals_only)
|
||||
set_wearer(outfit_wearer) //we need to set wearer manually since it doesnt call equipped
|
||||
quick_activation()
|
||||
|
||||
/obj/item/mod/control/doStrip(mob/stripper, mob/owner)
|
||||
if(active && !toggle_activate(stripper, force_deactivate = TRUE))
|
||||
return
|
||||
for(var/obj/item/part in mod_parts)
|
||||
conceal(null, part)
|
||||
return ..()
|
||||
|
||||
/obj/item/mod/control/worn_overlays(mutable_appearance/standing, isinhands = FALSE, icon_file)
|
||||
. = ..()
|
||||
if(!active)
|
||||
return
|
||||
for(var/obj/item/mod/module/module as anything in modules)
|
||||
var/list/module_icons = module.generate_worn_overlay(standing)
|
||||
if(!length(module_icons))
|
||||
continue
|
||||
. += module_icons
|
||||
|
||||
/obj/item/mod/control/proc/set_wearer(mob/user)
|
||||
wearer = user
|
||||
RegisterSignal(wearer, COMSIG_ATOM_EXITED, .proc/on_exit)
|
||||
RegisterSignal(wearer, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, .proc/on_borg_charge)
|
||||
update_cell_alert()
|
||||
for(var/obj/item/mod/module/module as anything in modules)
|
||||
module.on_equip()
|
||||
|
||||
/obj/item/mod/control/proc/unset_wearer()
|
||||
for(var/obj/item/mod/module/module as anything in modules)
|
||||
module.on_unequip()
|
||||
UnregisterSignal(wearer, list(COMSIG_ATOM_EXITED, COMSIG_PROCESS_BORGCHARGER_OCCUPANT))
|
||||
wearer.clear_alert("mod_charge")
|
||||
wearer = null
|
||||
|
||||
/obj/item/mod/control/proc/update_flags()
|
||||
var/list/used_skin = theme.skins[skin]
|
||||
for(var/obj/item/clothing/part as anything in mod_parts)
|
||||
var/used_category
|
||||
if(part == helmet)
|
||||
used_category = HELMET_FLAGS
|
||||
helmet.alternate_worn_layer = used_skin[HELMET_LAYER]
|
||||
helmet.alternate_layer = used_skin[HELMET_LAYER]
|
||||
if(part == chestplate)
|
||||
used_category = CHESTPLATE_FLAGS
|
||||
if(part == gauntlets)
|
||||
used_category = GAUNTLETS_FLAGS
|
||||
if(part == boots)
|
||||
used_category = BOOTS_FLAGS
|
||||
var/list/category = used_skin[used_category]
|
||||
part.clothing_flags = category[UNSEALED_CLOTHING] || NONE
|
||||
part.visor_flags = category[SEALED_CLOTHING] || NONE
|
||||
part.flags_inv = category[UNSEALED_INVISIBILITY] || NONE
|
||||
part.visor_flags_inv = category[SEALED_INVISIBILITY] || NONE
|
||||
part.flags_cover = category[UNSEALED_COVER] || NONE
|
||||
part.visor_flags_cover = category[SEALED_COVER] || NONE
|
||||
|
||||
/obj/item/mod/control/proc/quick_module(mob/user)
|
||||
if(!length(modules))
|
||||
return
|
||||
var/list/display_names = list()
|
||||
var/list/items = list()
|
||||
for(var/obj/item/mod/module/module as anything in modules)
|
||||
if(module.module_type == MODULE_PASSIVE)
|
||||
continue
|
||||
display_names[module.name] = REF(module)
|
||||
var/image/module_image = image(icon = module.icon, icon_state = module.icon_state)
|
||||
items += list(module.name = module_image)
|
||||
if(!length(items))
|
||||
return
|
||||
var/pick = show_radial_menu(user, src, items, custom_check = FALSE, require_near = TRUE)
|
||||
if(!pick)
|
||||
return
|
||||
var/module_reference = display_names[pick]
|
||||
var/obj/item/mod/module/selected_module = locate(module_reference) in modules
|
||||
if(!istype(selected_module) || user.incapacitated())
|
||||
return
|
||||
selected_module.on_select()
|
||||
|
||||
/obj/item/mod/control/proc/paint(mob/user, obj/item/paint)
|
||||
if(length(theme.skins) <= 1)
|
||||
return FALSE
|
||||
var/list/skins = list()
|
||||
for(var/mod_skin in theme.skins)
|
||||
skins[mod_skin] = image(icon = icon, icon_state = "[mod_skin]-control")
|
||||
var/pick = show_radial_menu(user, src, skins, custom_check = FALSE, require_near = TRUE)
|
||||
if(!pick || !user.is_holding(paint))
|
||||
return FALSE
|
||||
skin = pick
|
||||
var/list/skin_updating = mod_parts.Copy() + src
|
||||
for(var/obj/item/piece as anything in skin_updating)
|
||||
piece.icon_state = "[skin]-[initial(piece.icon_state)]"
|
||||
update_flags()
|
||||
wearer?.regenerate_icons()
|
||||
return TRUE
|
||||
|
||||
/obj/item/mod/control/proc/shock(mob/living/user)
|
||||
if(!istype(user) || cell?.charge < 1)
|
||||
return FALSE
|
||||
do_sparks(5, TRUE, src)
|
||||
var/check_range = TRUE
|
||||
return electrocute_mob(user, cell, src, 0.7, check_range)
|
||||
|
||||
/obj/item/mod/control/proc/install(module, mob/user)
|
||||
var/obj/item/mod/module/new_module = module
|
||||
for(var/obj/item/mod/module/old_module as anything in modules)
|
||||
if(is_type_in_list(new_module, old_module.incompatible_modules) || is_type_in_list(old_module, new_module.incompatible_modules))
|
||||
if(user)
|
||||
balloon_alert(user, "[new_module] incompatible with [old_module]!")
|
||||
playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
|
||||
return
|
||||
if(is_type_in_list(module, theme.module_blacklist))
|
||||
if(user)
|
||||
balloon_alert(user, "[src] doesn't accept [new_module]!")
|
||||
playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
|
||||
return
|
||||
var/complexity_with_module = complexity
|
||||
complexity_with_module += new_module.complexity
|
||||
if(complexity_with_module > complexity_max)
|
||||
if(user)
|
||||
balloon_alert(user, "[new_module] would make [src] too complex!")
|
||||
playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
|
||||
return
|
||||
new_module.forceMove(src)
|
||||
modules += new_module
|
||||
complexity += new_module.complexity
|
||||
new_module.mod = src
|
||||
new_module.on_install()
|
||||
if(wearer)
|
||||
new_module.on_equip()
|
||||
if(user)
|
||||
balloon_alert(user, "[new_module] added")
|
||||
playsound(src, 'sound/machines/click.ogg', 50, TRUE, SILENCED_SOUND_EXTRARANGE)
|
||||
|
||||
/obj/item/mod/control/proc/uninstall(module)
|
||||
var/obj/item/mod/module/old_module = module
|
||||
modules -= old_module
|
||||
complexity -= old_module.complexity
|
||||
if(active)
|
||||
old_module.on_suit_deactivation()
|
||||
if(old_module.active)
|
||||
old_module.on_deactivation()
|
||||
if(wearer)
|
||||
old_module.on_unequip()
|
||||
old_module.on_uninstall()
|
||||
old_module.mod = null
|
||||
|
||||
/obj/item/mod/control/proc/update_access(mob/user, obj/item/card/id/card)
|
||||
if(!allowed(user))
|
||||
balloon_alert(user, "insufficient access!")
|
||||
playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
|
||||
return
|
||||
req_access = card.access.Copy()
|
||||
balloon_alert(user, "access updated")
|
||||
|
||||
/obj/item/mod/control/proc/update_cell_alert()
|
||||
if(!wearer)
|
||||
return
|
||||
if(!cell)
|
||||
wearer.throw_alert("mod_charge", /atom/movable/screen/alert/nocell)
|
||||
return
|
||||
var/remaining_cell = cell.charge/cell.maxcharge
|
||||
switch(remaining_cell)
|
||||
if(0.75 to INFINITY)
|
||||
wearer.clear_alert("mod_charge")
|
||||
if(0.5 to 0.75)
|
||||
wearer.throw_alert("mod_charge", /atom/movable/screen/alert/lowcell, 1)
|
||||
if(0.25 to 0.5)
|
||||
wearer.throw_alert("mod_charge", /atom/movable/screen/alert/lowcell, 2)
|
||||
if(0.01 to 0.25)
|
||||
wearer.throw_alert("mod_charge", /atom/movable/screen/alert/lowcell, 3)
|
||||
else
|
||||
wearer.throw_alert("mod_charge", /atom/movable/screen/alert/emptycell)
|
||||
|
||||
/obj/item/mod/control/proc/power_off()
|
||||
balloon_alert(wearer, "no power!")
|
||||
toggle_activate(wearer, force_deactivate = TRUE)
|
||||
|
||||
/obj/item/mod/control/proc/on_exit(datum/source, atom/movable/part, direction)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
if(part.loc == src)
|
||||
return
|
||||
if(part == cell)
|
||||
cell = null
|
||||
update_cell_alert()
|
||||
return
|
||||
if(part.loc == wearer)
|
||||
return
|
||||
if(modules.Find(part))
|
||||
uninstall(part)
|
||||
return
|
||||
if(mod_parts.Find(part))
|
||||
conceal(wearer, part)
|
||||
if(active)
|
||||
INVOKE_ASYNC(src, .proc/toggle_activate, wearer, TRUE)
|
||||
return
|
||||
|
||||
/obj/item/mod/control/proc/on_borg_charge(datum/source, amount)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
if(!cell)
|
||||
return
|
||||
cell.give(amount)
|
||||
@@ -0,0 +1,854 @@
|
||||
/// Global proc that sets up all MOD themes as singletons in a list and returns it.
|
||||
/proc/setup_mod_themes()
|
||||
. = list()
|
||||
for(var/path in typesof(/datum/mod_theme))
|
||||
var/datum/mod_theme/new_theme = new path()
|
||||
.[path] = new_theme
|
||||
|
||||
/// MODsuit theme, instanced once and then used by MODsuits to grab various statistics.
|
||||
/datum/mod_theme
|
||||
/// Theme name for the MOD.
|
||||
var/name = "standard"
|
||||
/// Description added to the MOD.
|
||||
var/desc = "A civilian class suit by Nakamura Engineering, doesn't offer much other than slightly quicker movement."
|
||||
/// Default skin of the MOD.
|
||||
var/default_skin = "standard"
|
||||
/// Armor shared across the MOD pieces.
|
||||
var/armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10)
|
||||
/// Resistance flags shared across the MOD pieces.
|
||||
var/resistance_flags = NONE
|
||||
/// Max heat protection shared across the MOD pieces.
|
||||
var/max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
|
||||
/// Max cold protection shared across the MOD pieces.
|
||||
var/min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
|
||||
/// Permeability shared across the MOD pieces.
|
||||
var/permeability_coefficient = 0.01
|
||||
/// Siemens shared across the MOD pieces.
|
||||
var/siemens_coefficient = 0.5
|
||||
/// How much modules can the MOD carry without malfunctioning.
|
||||
var/complexity_max = DEFAULT_MAX_COMPLEXITY
|
||||
/// How much battery power the MOD uses by just being on
|
||||
var/cell_drain = DEFAULT_CELL_DRAIN
|
||||
/// Slowdown of the MOD when not active.
|
||||
var/slowdown_inactive = 1.25
|
||||
/// Slowdown of the MOD when active.
|
||||
var/slowdown_active = 0.75
|
||||
/// Theme used by the MOD TGUI.
|
||||
var/ui_theme = "ntos"
|
||||
/// List of inbuilt modules. These are different from the pre-equipped suits, you should mainly use these for unremovable modules with 0 complexity.
|
||||
var/list/inbuilt_modules = list()
|
||||
/// Modules blacklisted from the MOD.
|
||||
var/list/module_blacklist = list()
|
||||
/// List of skins with their appropriate clothing flags.
|
||||
var/list/skins = list(
|
||||
"standard" = list(
|
||||
HELMET_LAYER = NECK_LAYER,
|
||||
HELMET_FLAGS = list(
|
||||
UNSEALED_CLOTHING = SNUG_FIT,
|
||||
SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
|
||||
UNSEALED_INVISIBILITY = HIDEFACIALHAIR,
|
||||
SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
|
||||
SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
|
||||
),
|
||||
CHESTPLATE_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
SEALED_INVISIBILITY = HIDEJUMPSUIT,
|
||||
),
|
||||
GAUNTLETS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
BOOTS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
),
|
||||
"civilian" = list(
|
||||
HELMET_LAYER = null,
|
||||
HELMET_FLAGS = list(
|
||||
UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
|
||||
UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
|
||||
),
|
||||
CHESTPLATE_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
SEALED_INVISIBILITY = HIDEJUMPSUIT,
|
||||
),
|
||||
GAUNTLETS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
BOOTS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
/datum/mod_theme/engineering
|
||||
name = "engineering"
|
||||
desc = "An engineer-fit suit with heat and shock resistance. Nakamura Engineering's classic."
|
||||
default_skin = "engineering"
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 100, ACID = 25, WOUND = 10)
|
||||
resistance_flags = FIRE_PROOF
|
||||
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
|
||||
siemens_coefficient = 0
|
||||
slowdown_inactive = 1.5
|
||||
slowdown_active = 1
|
||||
skins = list(
|
||||
"engineering" = list(
|
||||
HELMET_LAYER = NECK_LAYER,
|
||||
HELMET_FLAGS = list(
|
||||
UNSEALED_CLOTHING = SNUG_FIT,
|
||||
SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
|
||||
UNSEALED_INVISIBILITY = HIDEFACIALHAIR,
|
||||
SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
|
||||
SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
|
||||
),
|
||||
CHESTPLATE_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
SEALED_INVISIBILITY = HIDEJUMPSUIT,
|
||||
),
|
||||
GAUNTLETS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
BOOTS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
/datum/mod_theme/atmospheric
|
||||
name = "atmospheric"
|
||||
desc = "An atmospheric-resistant suit by Nakamura Engineering, offering extreme heat resistance compared to the engineer suit."
|
||||
default_skin = "atmospheric"
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 100, ACID = 75, WOUND = 10)
|
||||
resistance_flags = FIRE_PROOF
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
slowdown_inactive = 1.5
|
||||
slowdown_active = 1
|
||||
skins = list(
|
||||
"atmospheric" = list(
|
||||
HELMET_LAYER = NECK_LAYER,
|
||||
HELMET_FLAGS = list(
|
||||
UNSEALED_CLOTHING = SNUG_FIT,
|
||||
SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
|
||||
UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDESNOUT,
|
||||
SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR,
|
||||
UNSEALED_COVER = HEADCOVERSMOUTH,
|
||||
SEALED_COVER = HEADCOVERSEYES|PEPPERPROOF,
|
||||
),
|
||||
CHESTPLATE_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
SEALED_INVISIBILITY = HIDEJUMPSUIT,
|
||||
),
|
||||
GAUNTLETS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
BOOTS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
/datum/mod_theme/advanced
|
||||
name = "advanced"
|
||||
desc = "An advanced version of Nakamura Engineering's classic suit, shining with a white, acid and fire resistant polish."
|
||||
default_skin = "advanced"
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 90, WOUND = 10)
|
||||
resistance_flags = FIRE_PROOF
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
siemens_coefficient = 0
|
||||
slowdown_inactive = 1
|
||||
slowdown_active = 0.5
|
||||
inbuilt_modules = list(/obj/item/mod/module/magboot/advanced)
|
||||
skins = list(
|
||||
"advanced" = list(
|
||||
HELMET_LAYER = NECK_LAYER,
|
||||
HELMET_FLAGS = list(
|
||||
UNSEALED_CLOTHING = SNUG_FIT,
|
||||
SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
|
||||
UNSEALED_INVISIBILITY = HIDEFACIALHAIR,
|
||||
SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
|
||||
SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
|
||||
),
|
||||
CHESTPLATE_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
SEALED_INVISIBILITY = HIDEJUMPSUIT,
|
||||
),
|
||||
GAUNTLETS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
BOOTS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
/datum/mod_theme/mining
|
||||
name = "mining"
|
||||
desc = "A high-power Nanotrasen mining suit, supporting more complexity at a bigger drain."
|
||||
default_skin = "mining"
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 75, WOUND = 15)
|
||||
resistance_flags = FIRE_PROOF
|
||||
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
|
||||
cell_drain = DEFAULT_CELL_DRAIN * 2
|
||||
complexity_max = DEFAULT_MAX_COMPLEXITY + 5
|
||||
skins = list(
|
||||
"mining" = list(
|
||||
HELMET_LAYER = null,
|
||||
HELMET_FLAGS = list(
|
||||
UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT,
|
||||
SEALED_INVISIBILITY = HIDEMASK|HIDEEYES|HIDEFACE,
|
||||
SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
|
||||
),
|
||||
CHESTPLATE_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
SEALED_INVISIBILITY = HIDEJUMPSUIT,
|
||||
),
|
||||
GAUNTLETS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
BOOTS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
/datum/mod_theme/medical
|
||||
name = "medical"
|
||||
desc = "A lightweight suit by DeForest Medical Corporation, allows for easier movement."
|
||||
default_skin = "medical"
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 60, ACID = 75, WOUND = 10)
|
||||
cell_drain = DEFAULT_CELL_DRAIN * 1.5
|
||||
slowdown_inactive = 1
|
||||
slowdown_active = 0.5
|
||||
skins = list(
|
||||
"medical" = list(
|
||||
HELMET_LAYER = NECK_LAYER,
|
||||
HELMET_FLAGS = list(
|
||||
UNSEALED_CLOTHING = SNUG_FIT,
|
||||
SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
|
||||
UNSEALED_INVISIBILITY = HIDEFACIALHAIR,
|
||||
SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
|
||||
SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
|
||||
),
|
||||
CHESTPLATE_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
SEALED_INVISIBILITY = HIDEJUMPSUIT,
|
||||
),
|
||||
GAUNTLETS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
BOOTS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
),
|
||||
"corpsman" = list(
|
||||
HELMET_LAYER = NECK_LAYER,
|
||||
HELMET_FLAGS = list(
|
||||
UNSEALED_CLOTHING = SNUG_FIT,
|
||||
SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
|
||||
UNSEALED_INVISIBILITY = HIDEFACIALHAIR,
|
||||
SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
|
||||
SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
|
||||
),
|
||||
CHESTPLATE_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
SEALED_INVISIBILITY = HIDEJUMPSUIT,
|
||||
),
|
||||
GAUNTLETS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
BOOTS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
/datum/mod_theme/rescue
|
||||
name = "rescue"
|
||||
desc = "An advanced version of DeForest Medical Corporation's medical suit, designed for quick rescue of bodies from the most dangerous environments."
|
||||
default_skin = "rescue"
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 100, ACID = 100, WOUND = 10)
|
||||
resistance_flags = FIRE_PROOF|ACID_PROOF
|
||||
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
|
||||
cell_drain = DEFAULT_CELL_DRAIN * 1.5
|
||||
slowdown_inactive = 0.75
|
||||
slowdown_active = 0.25
|
||||
inbuilt_modules = list(/obj/item/mod/module/quick_carry/advanced)
|
||||
skins = list(
|
||||
"rescue" = list(
|
||||
HELMET_LAYER = NECK_LAYER,
|
||||
HELMET_FLAGS = list(
|
||||
UNSEALED_CLOTHING = SNUG_FIT,
|
||||
SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
|
||||
UNSEALED_INVISIBILITY = HIDEFACIALHAIR,
|
||||
SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
|
||||
SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
|
||||
),
|
||||
CHESTPLATE_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
SEALED_INVISIBILITY = HIDEJUMPSUIT,
|
||||
),
|
||||
GAUNTLETS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
BOOTS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
/datum/mod_theme/research
|
||||
name = "research"
|
||||
desc = "A private military EOD suit by Aussec Armory, intended for explosive research. Bulky, but expansive."
|
||||
default_skin = "research"
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 15)
|
||||
resistance_flags = FIRE_PROOF|ACID_PROOF
|
||||
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
|
||||
complexity_max = DEFAULT_MAX_COMPLEXITY + 5
|
||||
slowdown_inactive = 2
|
||||
slowdown_active = 1.5
|
||||
inbuilt_modules = list(/obj/item/mod/module/reagent_scanner/advanced)
|
||||
skins = list(
|
||||
"research" = list(
|
||||
HELMET_LAYER = null,
|
||||
HELMET_FLAGS = list(
|
||||
UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
|
||||
UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
|
||||
),
|
||||
CHESTPLATE_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
SEALED_INVISIBILITY = HIDEJUMPSUIT,
|
||||
),
|
||||
GAUNTLETS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
BOOTS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
/datum/mod_theme/security
|
||||
name = "security"
|
||||
desc = "An Apadyne Technologies security suit, offering shock protection and quicker speed, at the cost of carrying capacity."
|
||||
default_skin = "security"
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 75, ACID = 75, WOUND = 20)
|
||||
siemens_coefficient = 0
|
||||
complexity_max = DEFAULT_MAX_COMPLEXITY - 5
|
||||
slowdown_inactive = 1
|
||||
slowdown_active = 0.5
|
||||
skins = list(
|
||||
"security" = list(
|
||||
HELMET_LAYER = null,
|
||||
HELMET_FLAGS = list(
|
||||
UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT,
|
||||
SEALED_INVISIBILITY = HIDEMASK|HIDEEYES|HIDEFACE,
|
||||
UNSEALED_COVER = HEADCOVERSMOUTH,
|
||||
SEALED_COVER = HEADCOVERSEYES|PEPPERPROOF,
|
||||
),
|
||||
CHESTPLATE_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
SEALED_INVISIBILITY = HIDEJUMPSUIT,
|
||||
),
|
||||
GAUNTLETS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
BOOTS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
/datum/mod_theme/safeguard
|
||||
name = "safeguard"
|
||||
desc = "An Apadyne Technologies advanced security suit, offering greater speed and fire protection than the standard security model."
|
||||
default_skin = "safeguard"
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 25, BIO = 100, FIRE = 100, ACID = 95, WOUND = 25)
|
||||
resistance_flags = FIRE_PROOF
|
||||
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
|
||||
siemens_coefficient = 0
|
||||
complexity_max = DEFAULT_MAX_COMPLEXITY - 5
|
||||
slowdown_inactive = 0.75
|
||||
slowdown_active = 0.25
|
||||
skins = list(
|
||||
"safeguard" = list(
|
||||
HELMET_LAYER = null,
|
||||
HELMET_FLAGS = list(
|
||||
UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
|
||||
UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
|
||||
),
|
||||
CHESTPLATE_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
SEALED_INVISIBILITY = HIDEJUMPSUIT,
|
||||
),
|
||||
GAUNTLETS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
BOOTS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
/datum/mod_theme/magnate
|
||||
name = "magnate"
|
||||
desc = "A fancy, very protective suit for Nanotrasen's captains. Shock, fire and acid-proof while also having a large capacity and high speed."
|
||||
default_skin = "magnate"
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 100, WOUND = 20)
|
||||
resistance_flags = FIRE_PROOF|ACID_PROOF
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
siemens_coefficient = 0
|
||||
complexity_max = DEFAULT_MAX_COMPLEXITY + 5
|
||||
slowdown_inactive = 0.75
|
||||
slowdown_active = 0.25
|
||||
skins = list(
|
||||
"magnate" = list(
|
||||
HELMET_LAYER = NECK_LAYER,
|
||||
HELMET_FLAGS = list(
|
||||
UNSEALED_CLOTHING = SNUG_FIT,
|
||||
SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
|
||||
UNSEALED_INVISIBILITY = HIDEFACIALHAIR,
|
||||
SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
|
||||
SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
|
||||
),
|
||||
CHESTPLATE_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
SEALED_INVISIBILITY = HIDEJUMPSUIT,
|
||||
),
|
||||
GAUNTLETS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
BOOTS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
/datum/mod_theme/cosmohonk
|
||||
name = "cosmohonk"
|
||||
desc = "A suit by Honk Ltd. Protects against low humor environments. Most of the tech went to lower the power cost."
|
||||
default_skin = "cosmohonk"
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 60, ACID = 30, WOUND = 5)
|
||||
cell_drain = DEFAULT_CELL_DRAIN * 0.25
|
||||
slowdown_inactive = 1.75
|
||||
slowdown_active = 1.25
|
||||
skins = list(
|
||||
"cosmohonk" = list(
|
||||
HELMET_LAYER = NECK_LAYER,
|
||||
HELMET_FLAGS = list(
|
||||
UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
UNSEALED_INVISIBILITY = HIDEEARS|HIDEHAIR,
|
||||
SEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEYES|HIDEFACE|HIDESNOUT,
|
||||
SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
|
||||
),
|
||||
CHESTPLATE_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
SEALED_INVISIBILITY = HIDEJUMPSUIT,
|
||||
),
|
||||
GAUNTLETS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
BOOTS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
/datum/mod_theme/syndicate
|
||||
name = "syndicate"
|
||||
desc = "A suit designed by Gorlex Marauders, offering armor ruled illegal in most of Spinward Stellar."
|
||||
default_skin = "syndicate"
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 35, BIO = 100, FIRE = 50, ACID = 90, WOUND = 25)
|
||||
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
|
||||
siemens_coefficient = 0
|
||||
slowdown_inactive = 1
|
||||
slowdown_active = 0.5
|
||||
ui_theme = "syndicate"
|
||||
inbuilt_modules = list(/obj/item/mod/module/armor_booster)
|
||||
skins = list(
|
||||
"syndicate" = list(
|
||||
HELMET_LAYER = NECK_LAYER,
|
||||
HELMET_FLAGS = list(
|
||||
UNSEALED_CLOTHING = SNUG_FIT,
|
||||
SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
|
||||
UNSEALED_INVISIBILITY = HIDEFACIALHAIR,
|
||||
SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
|
||||
SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
|
||||
),
|
||||
CHESTPLATE_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
SEALED_INVISIBILITY = HIDEJUMPSUIT,
|
||||
),
|
||||
GAUNTLETS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
BOOTS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
/datum/mod_theme/elite
|
||||
name = "elite"
|
||||
desc = "An elite suit upgraded by Cybersun Industries, offering upgraded armor values."
|
||||
default_skin = "elite"
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 55, BIO = 100, FIRE = 100, ACID = 100, WOUND = 25)
|
||||
resistance_flags = FIRE_PROOF|ACID_PROOF
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
siemens_coefficient = 0
|
||||
slowdown_inactive = 0.75
|
||||
slowdown_active = 0.25
|
||||
ui_theme = "syndicate"
|
||||
inbuilt_modules = list(/obj/item/mod/module/armor_booster/elite)
|
||||
skins = list(
|
||||
"elite" = list(
|
||||
HELMET_LAYER = null,
|
||||
HELMET_FLAGS = list(
|
||||
UNSEALED_CLOTHING = SNUG_FIT,
|
||||
SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
|
||||
UNSEALED_INVISIBILITY = HIDEFACIALHAIR,
|
||||
SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
|
||||
SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
|
||||
),
|
||||
CHESTPLATE_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
SEALED_INVISIBILITY = HIDEJUMPSUIT,
|
||||
),
|
||||
GAUNTLETS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
BOOTS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
/datum/mod_theme/enchanted
|
||||
name = "enchanted"
|
||||
desc = "The Wizard Federation's relatively low-tech MODsuit. Is very protective, though."
|
||||
default_skin = "enchanted"
|
||||
armor = list(MELEE = 40, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 35, BIO = 100, FIRE = 100, ACID = 100, WOUND = 30)
|
||||
resistance_flags = FIRE_PROOF|ACID_PROOF
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
siemens_coefficient = 0
|
||||
complexity_max = DEFAULT_MAX_COMPLEXITY - 5
|
||||
slowdown_inactive = 0.75
|
||||
slowdown_active = 0.25
|
||||
ui_theme = "wizard"
|
||||
inbuilt_modules = list(/obj/item/mod/module/anti_magic/wizard)
|
||||
skins = list(
|
||||
"enchanted" = list(
|
||||
HELMET_LAYER = null,
|
||||
HELMET_FLAGS = list(
|
||||
UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
|
||||
UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
|
||||
),
|
||||
CHESTPLATE_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
SEALED_INVISIBILITY = HIDEJUMPSUIT,
|
||||
),
|
||||
GAUNTLETS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
BOOTS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
/datum/mod_theme/prototype
|
||||
name = "prototype"
|
||||
desc = "A prototype modular suit powered by locomotives. While it is comfortable and has a big capacity, it remains very bulky and power-inefficient."
|
||||
default_skin = "prototype"
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 75, WOUND = 5)
|
||||
resistance_flags = FIRE_PROOF
|
||||
complexity_max = DEFAULT_MAX_COMPLEXITY + 10
|
||||
slowdown_inactive = 2.5
|
||||
slowdown_active = 2
|
||||
ui_theme = "hackerman"
|
||||
inbuilt_modules = list(/obj/item/mod/module/kinesis)
|
||||
skins = list(
|
||||
"prototype" = list(
|
||||
HELMET_LAYER = null,
|
||||
HELMET_FLAGS = list(
|
||||
UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
|
||||
UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
|
||||
),
|
||||
CHESTPLATE_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
SEALED_INVISIBILITY = HIDEJUMPSUIT,
|
||||
),
|
||||
GAUNTLETS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
BOOTS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
/datum/mod_theme/responsory
|
||||
name = "responsory"
|
||||
desc = "A high-speed rescue suit by Nanotrasen, intended for its' emergency response teams."
|
||||
default_skin = "responsory"
|
||||
armor = list(MELEE = 35, BULLET = 30, LASER = 30, ENERGY = 40, BOMB = 50, BIO = 100, FIRE = 100, ACID = 90, WOUND = 15)
|
||||
resistance_flags = FIRE_PROOF
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
siemens_coefficient = 0
|
||||
slowdown_inactive = 0.5
|
||||
slowdown_active = 0
|
||||
skins = list(
|
||||
"responsory" = list(
|
||||
HELMET_LAYER = NECK_LAYER,
|
||||
HELMET_FLAGS = list(
|
||||
UNSEALED_CLOTHING = SNUG_FIT,
|
||||
SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
|
||||
UNSEALED_INVISIBILITY = HIDEFACIALHAIR,
|
||||
SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
|
||||
SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
|
||||
),
|
||||
CHESTPLATE_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
SEALED_INVISIBILITY = HIDEJUMPSUIT,
|
||||
),
|
||||
GAUNTLETS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
BOOTS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
),
|
||||
"inquisitory" = list(
|
||||
HELMET_LAYER = null,
|
||||
HELMET_FLAGS = list(
|
||||
UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
|
||||
UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
|
||||
),
|
||||
CHESTPLATE_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
SEALED_INVISIBILITY = HIDEJUMPSUIT,
|
||||
),
|
||||
GAUNTLETS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
BOOTS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
/datum/mod_theme/apocryphal
|
||||
name = "apocryphal"
|
||||
desc = "A high-tech, only technically legal, armored suit created by a collaboration effort between Nanotrasen and Apadyne Technologies."
|
||||
default_skin = "apocryphal"
|
||||
armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 60, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 25)
|
||||
resistance_flags = FIRE_PROOF|ACID_PROOF
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
siemens_coefficient = 0
|
||||
complexity_max = DEFAULT_MAX_COMPLEXITY + 10
|
||||
skins = list(
|
||||
"apocryphal" = list(
|
||||
HELMET_LAYER = null,
|
||||
HELMET_FLAGS = list(
|
||||
UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
UNSEALED_INVISIBILITY = HIDEEARS|HIDEHAIR,
|
||||
SEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEYES|HIDEFACE|HIDESNOUT,
|
||||
SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
|
||||
),
|
||||
CHESTPLATE_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
SEALED_INVISIBILITY = HIDEJUMPSUIT,
|
||||
),
|
||||
GAUNTLETS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
BOOTS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
/datum/mod_theme/corporate
|
||||
name = "corporate"
|
||||
desc = "A fancy, high-tech suit for Nanotrasen's high ranking officers."
|
||||
default_skin = "corporate"
|
||||
armor = list(MELEE = 35, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 50, BIO = 100, FIRE = 100, ACID = 100, WOUND = 15)
|
||||
resistance_flags = FIRE_PROOF|ACID_PROOF
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
siemens_coefficient = 0
|
||||
slowdown_inactive = 0.5
|
||||
slowdown_active = 0
|
||||
skins = list(
|
||||
"corporate" = list(
|
||||
HELMET_LAYER = null,
|
||||
HELMET_FLAGS = list(
|
||||
UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT,
|
||||
SEALED_INVISIBILITY = HIDEMASK|HIDEEYES|HIDEFACE,
|
||||
SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
|
||||
),
|
||||
CHESTPLATE_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
SEALED_INVISIBILITY = HIDEJUMPSUIT,
|
||||
),
|
||||
GAUNTLETS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
BOOTS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
/datum/mod_theme/debug
|
||||
name = "debug"
|
||||
desc = "Strangely nostalgic."
|
||||
default_skin = "debug"
|
||||
armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 0)
|
||||
resistance_flags = FIRE_PROOF|ACID_PROOF
|
||||
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
|
||||
complexity_max = 50
|
||||
slowdown_inactive = 0.5
|
||||
slowdown_active = 0
|
||||
skins = list(
|
||||
"debug" = list(
|
||||
HELMET_LAYER = null,
|
||||
HELMET_FLAGS = list(
|
||||
UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT,
|
||||
SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE,
|
||||
UNSEALED_COVER = HEADCOVERSMOUTH,
|
||||
SEALED_COVER = HEADCOVERSEYES|PEPPERPROOF,
|
||||
),
|
||||
CHESTPLATE_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
SEALED_INVISIBILITY = HIDEJUMPSUIT,
|
||||
),
|
||||
GAUNTLETS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
BOOTS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL,
|
||||
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
/datum/mod_theme/administrative
|
||||
name = "administrative"
|
||||
desc = "A suit made of adminium. Who comes up with these stupid mineral names?"
|
||||
default_skin = "debug"
|
||||
armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 100)
|
||||
resistance_flags = INDESTRUCTIBLE|LAVA_PROOF|FIRE_PROOF|UNACIDABLE|ACID_PROOF
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
complexity_max = 1000
|
||||
cell_drain = DEFAULT_CELL_DRAIN * 0
|
||||
slowdown_inactive = 0
|
||||
slowdown_active = 0
|
||||
skins = list(
|
||||
"debug" = list(
|
||||
HELMET_LAYER = null,
|
||||
HELMET_FLAGS = list(
|
||||
UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL|STOPSPRESSUREDAMAGE,
|
||||
UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT,
|
||||
SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE,
|
||||
UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
|
||||
),
|
||||
CHESTPLATE_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|BLOCKS_SHOVE_KNOCKDOWN,
|
||||
SEALED_INVISIBILITY = HIDEJUMPSUIT,
|
||||
),
|
||||
GAUNTLETS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
BOOTS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
|
||||
),
|
||||
),
|
||||
)
|
||||
@@ -0,0 +1,157 @@
|
||||
/obj/item/mod/control/pre_equipped
|
||||
cell = /obj/item/stock_parts/cell/high
|
||||
var/applied_skin
|
||||
|
||||
/obj/item/mod/control/pre_equipped/Initialize(mapload, new_theme, new_skin)
|
||||
new_skin = applied_skin
|
||||
return ..()
|
||||
|
||||
/obj/item/mod/control/pre_equipped/standard
|
||||
initial_modules = list(/obj/item/mod/module/storage, /obj/item/mod/module/welding, /obj/item/mod/module/flashlight)
|
||||
|
||||
/obj/item/mod/control/pre_equipped/engineering
|
||||
theme = /datum/mod_theme/engineering
|
||||
initial_modules = list(/obj/item/mod/module/storage, /obj/item/mod/module/welding, /obj/item/mod/module/rad_protection, /obj/item/mod/module/flashlight, /obj/item/mod/module/magboot)
|
||||
|
||||
/obj/item/mod/control/pre_equipped/atmospheric
|
||||
theme = /datum/mod_theme/atmospheric
|
||||
initial_modules = list(/obj/item/mod/module/storage, /obj/item/mod/module/welding, /obj/item/mod/module/rad_protection, /obj/item/mod/module/flashlight, /obj/item/mod/module/t_ray)
|
||||
|
||||
/obj/item/mod/control/pre_equipped/advanced
|
||||
theme = /datum/mod_theme/advanced
|
||||
cell = /obj/item/stock_parts/cell/super
|
||||
initial_modules = list(/obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, /obj/item/mod/module/rad_protection, /obj/item/mod/module/jetpack, /obj/item/mod/module/flashlight)
|
||||
|
||||
/obj/item/mod/control/pre_equipped/mining
|
||||
theme = /datum/mod_theme/mining
|
||||
cell = /obj/item/stock_parts/cell/high/plus
|
||||
initial_modules = list(/obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, /obj/item/mod/module/orebag, /obj/item/mod/module/flashlight, /obj/item/mod/module/magboot, /obj/item/mod/module/drill)
|
||||
|
||||
/obj/item/mod/control/pre_equipped/medical
|
||||
theme = /datum/mod_theme/medical
|
||||
initial_modules = list(/obj/item/mod/module/storage, /obj/item/mod/module/flashlight, /obj/item/mod/module/health_analyzer, /obj/item/mod/module/quick_carry)
|
||||
|
||||
/obj/item/mod/control/pre_equipped/rescue
|
||||
theme = /datum/mod_theme/rescue
|
||||
cell = /obj/item/stock_parts/cell/super
|
||||
initial_modules = list(/obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/flashlight, /obj/item/mod/module/health_analyzer, /obj/item/mod/module/injector)
|
||||
|
||||
/obj/item/mod/control/pre_equipped/research
|
||||
theme = /datum/mod_theme/research
|
||||
cell = /obj/item/stock_parts/cell/super
|
||||
initial_modules = list(/obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, /obj/item/mod/module/flashlight, /obj/item/mod/module/circuit, /obj/item/mod/module/t_ray)
|
||||
|
||||
/obj/item/mod/control/pre_equipped/security
|
||||
theme = /datum/mod_theme/security
|
||||
initial_modules = list(/obj/item/mod/module/storage, /obj/item/mod/module/welding, /obj/item/mod/module/flashlight, /obj/item/mod/module/holster)
|
||||
|
||||
/obj/item/mod/control/pre_equipped/safeguard
|
||||
theme = /datum/mod_theme/safeguard
|
||||
cell = /obj/item/stock_parts/cell/super
|
||||
initial_modules = list(/obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, /obj/item/mod/module/flashlight, /obj/item/mod/module/jetpack, /obj/item/mod/module/holster)
|
||||
|
||||
/obj/item/mod/control/pre_equipped/magnate
|
||||
theme = /datum/mod_theme/magnate
|
||||
cell = /obj/item/stock_parts/cell/hyper
|
||||
initial_modules = list(/obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, /obj/item/mod/module/holster, /obj/item/mod/module/pathfinder)
|
||||
|
||||
/obj/item/mod/control/pre_equipped/traitor
|
||||
theme = /datum/mod_theme/syndicate
|
||||
cell = /obj/item/stock_parts/cell/super
|
||||
initial_modules = list(/obj/item/mod/module/storage/syndicate, /obj/item/mod/module/welding, /obj/item/mod/module/tether, /obj/item/mod/module/pathfinder, /obj/item/mod/module/flashlight, /obj/item/mod/module/dna_lock)
|
||||
|
||||
/obj/item/mod/control/pre_equipped/nuclear
|
||||
theme = /datum/mod_theme/syndicate
|
||||
cell = /obj/item/stock_parts/cell/hyper
|
||||
initial_modules = list(/obj/item/mod/module/storage/syndicate, /obj/item/mod/module/welding, /obj/item/mod/module/jetpack, /obj/item/mod/module/visor/thermal, /obj/item/mod/module/flashlight, /obj/item/mod/module/holster)
|
||||
|
||||
/obj/item/mod/control/pre_equipped/elite
|
||||
theme = /datum/mod_theme/elite
|
||||
cell = /obj/item/stock_parts/cell/bluespace
|
||||
initial_modules = list(/obj/item/mod/module/storage/syndicate, /obj/item/mod/module/welding, /obj/item/mod/module/emp_shield, /obj/item/mod/module/jetpack, /obj/item/mod/module/visor/thermal, /obj/item/mod/module/flashlight, /obj/item/mod/module/holster)
|
||||
|
||||
/obj/item/mod/control/pre_equipped/enchanted
|
||||
theme = /datum/mod_theme/enchanted
|
||||
cell = /obj/item/stock_parts/cell/crystal_cell/wizard
|
||||
initial_modules = list(/obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/energy_shield/wizard, /obj/item/mod/module/emp_shield)
|
||||
|
||||
/obj/item/mod/control/pre_equipped/prototype
|
||||
theme = /datum/mod_theme/prototype
|
||||
cell = /obj/item/stock_parts/cell/high/plus
|
||||
initial_modules = list(/obj/item/mod/module/storage, /obj/item/mod/module/welding, /obj/item/mod/module/rad_protection, /obj/item/mod/module/flashlight, /obj/item/mod/module/tether)
|
||||
|
||||
/obj/item/mod/control/pre_equipped/responsory
|
||||
theme = /datum/mod_theme/responsory
|
||||
cell = /obj/item/stock_parts/cell/hyper
|
||||
initial_modules = list(/obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, /obj/item/mod/module/emp_shield, /obj/item/mod/module/flashlight, /obj/item/mod/module/holster)
|
||||
var/insignia_type = /obj/item/mod/module/insignia
|
||||
|
||||
/obj/item/mod/control/pre_equipped/responsory/Initialize(mapload, new_theme, new_skin)
|
||||
initial_modules.Insert(1, insignia_type)
|
||||
return ..()
|
||||
|
||||
/obj/item/mod/control/pre_equipped/responsory/commander
|
||||
insignia_type = /obj/item/mod/module/insignia/commander
|
||||
|
||||
/obj/item/mod/control/pre_equipped/responsory/security
|
||||
insignia_type = /obj/item/mod/module/insignia/security
|
||||
|
||||
/obj/item/mod/control/pre_equipped/responsory/engineer
|
||||
insignia_type = /obj/item/mod/module/insignia/engineer
|
||||
|
||||
/obj/item/mod/control/pre_equipped/responsory/medic
|
||||
insignia_type = /obj/item/mod/module/insignia/medic
|
||||
|
||||
/obj/item/mod/control/pre_equipped/responsory/janitor
|
||||
insignia_type = /obj/item/mod/module/insignia/janitor
|
||||
|
||||
/obj/item/mod/control/pre_equipped/responsory/clown
|
||||
insignia_type = /obj/item/mod/module/insignia/clown
|
||||
|
||||
/obj/item/mod/control/pre_equipped/responsory/chaplain
|
||||
insignia_type = /obj/item/mod/module/insignia/chaplain
|
||||
|
||||
/obj/item/mod/control/pre_equipped/responsory/inquisitory
|
||||
initial_modules = list(/obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/anti_magic, /obj/item/mod/module/welding, /obj/item/mod/module/emp_shield, /obj/item/mod/module/flashlight, /obj/item/mod/module/holster)
|
||||
applied_skin = "inquisitory"
|
||||
|
||||
/obj/item/mod/control/pre_equipped/responsory/inquisitory/commander
|
||||
insignia_type = /obj/item/mod/module/insignia/commander
|
||||
|
||||
/obj/item/mod/control/pre_equipped/responsory/inquisitory/security
|
||||
insignia_type = /obj/item/mod/module/insignia/security
|
||||
|
||||
/obj/item/mod/control/pre_equipped/responsory/inquisitory/medic
|
||||
insignia_type = /obj/item/mod/module/insignia/medic
|
||||
|
||||
/obj/item/mod/control/pre_equipped/responsory/inquisitory/chaplain
|
||||
insignia_type = /obj/item/mod/module/insignia/chaplain
|
||||
|
||||
/obj/item/mod/control/pre_equipped/apocryphal
|
||||
theme = /datum/mod_theme/apocryphal
|
||||
cell = /obj/item/stock_parts/cell/bluespace
|
||||
initial_modules = list(/obj/item/mod/module/storage/bluespace, /obj/item/mod/module/welding, /obj/item/mod/module/emp_shield, /obj/item/mod/module/jetpack, /obj/item/mod/module/holster)
|
||||
|
||||
/obj/item/mod/control/pre_equipped/corporate
|
||||
theme = /datum/mod_theme/corporate
|
||||
cell = /obj/item/stock_parts/cell/bluespace
|
||||
initial_modules = list(/obj/item/mod/module/storage/bluespace, /obj/item/mod/module/holster)
|
||||
|
||||
/obj/item/mod/control/pre_equipped/debug
|
||||
theme = /datum/mod_theme/debug
|
||||
cell = /obj/item/stock_parts/cell/bluespace
|
||||
initial_modules = list(/obj/item/mod/module/storage/bluespace, /obj/item/mod/module/welding, /obj/item/mod/module/flashlight, /obj/item/mod/module/bikehorn, /obj/item/mod/module/rad_protection, /obj/item/mod/module/tether, /obj/item/mod/module/injector) //one of every type of module, for testing if they all work correctly
|
||||
|
||||
/obj/item/mod/control/pre_equipped/administrative
|
||||
theme = /datum/mod_theme/administrative
|
||||
cell = /obj/item/stock_parts/cell/infinite/abductor
|
||||
initial_modules = list(/obj/item/mod/module/storage/bluespace, /obj/item/mod/module/welding, /obj/item/mod/module/stealth/ninja, /obj/item/mod/module/quick_carry/advanced, /obj/item/mod/module/magboot/advanced, /obj/item/mod/module/jetpack)
|
||||
|
||||
//these exist for the prefs menu
|
||||
/obj/item/mod/control/pre_equipped/syndicate_empty
|
||||
theme = /datum/mod_theme/syndicate
|
||||
|
||||
/obj/item/mod/control/pre_equipped/syndicate_empty/elite
|
||||
theme = /datum/mod_theme/elite
|
||||
|
||||
INITIALIZE_IMMEDIATE(/obj/item/mod/control/pre_equipped/syndicate_empty)
|
||||
@@ -0,0 +1,80 @@
|
||||
/obj/item/mod/control/ui_interact(mob/user, datum/tgui/ui)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if(!ui)
|
||||
ui = new(user, src, "MODsuit", name)
|
||||
ui.open()
|
||||
|
||||
/obj/item/mod/control/ui_data()
|
||||
var/data = list()
|
||||
data["interface_break"] = interface_break
|
||||
data["malfunctioning"] = malfunctioning
|
||||
data["open"] = open
|
||||
data["active"] = active
|
||||
data["locked"] = locked
|
||||
data["complexity"] = complexity
|
||||
data["selected_module"] = selected_module?.name
|
||||
data["wearer_name"] = wearer ? (wearer.get_authentification_name("Unknown") || "Unknown") : "No Occupant"
|
||||
data["wearer_job"] = wearer ? wearer.get_assignment("Unknown", "Unknown", FALSE) : "No Job"
|
||||
data["AI"] = ai?.name
|
||||
data["cell"] = cell?.name
|
||||
data["charge"] = cell ? round(cell.percent(), 1) : 0
|
||||
data["modules"] = list()
|
||||
for(var/obj/item/mod/module/module as anything in modules)
|
||||
var/list/module_data = list(
|
||||
name = module.name,
|
||||
description = module.desc,
|
||||
module_type = module.module_type,
|
||||
active = module.active,
|
||||
idle_power = module.idle_power_cost,
|
||||
active_power = module.active_power_cost,
|
||||
use_power = module.use_power_cost,
|
||||
complexity = module.complexity,
|
||||
cooldown_time = module.cooldown_time,
|
||||
cooldown = round(COOLDOWN_TIMELEFT(module, cooldown_timer), 1 SECONDS),
|
||||
id = module.tgui_id,
|
||||
ref = REF(module),
|
||||
configuration_data = module.get_configuration()
|
||||
)
|
||||
module_data += module.add_ui_data()
|
||||
data["modules"] += list(module_data)
|
||||
return data
|
||||
|
||||
/obj/item/mod/control/ui_static_data(mob/user)
|
||||
var/data = list()
|
||||
data["ui_theme"] = ui_theme
|
||||
data["control"] = name
|
||||
data["complexity_max"] = complexity_max
|
||||
data["helmet"] = helmet?.name
|
||||
data["chestplate"] = chestplate?.name
|
||||
data["gauntlets"] = gauntlets?.name
|
||||
data["boots"] = boots?.name
|
||||
return data
|
||||
|
||||
/obj/item/mod/control/ui_act(action, params)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
if(!allowed(usr) && locked)
|
||||
balloon_alert(usr, "insufficient access!")
|
||||
playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
|
||||
return
|
||||
if(malfunctioning && prob(75))
|
||||
balloon_alert(usr, "button malfunctions!")
|
||||
return
|
||||
switch(action)
|
||||
if("lock")
|
||||
locked = !locked
|
||||
balloon_alert(usr, "[locked ? "locked" : "unlocked"]!")
|
||||
if("activate")
|
||||
toggle_activate(usr)
|
||||
if("select")
|
||||
var/obj/item/mod/module/module = locate(params["ref"]) in modules
|
||||
if(!module)
|
||||
return
|
||||
module.on_select()
|
||||
if("configure")
|
||||
var/obj/item/mod/module/module = locate(params["ref"]) in modules
|
||||
if(!module)
|
||||
return
|
||||
module.configure_edit(params["key"], params["value"])
|
||||
return TRUE
|
||||
@@ -0,0 +1,252 @@
|
||||
/obj/item/mod/module
|
||||
name = "MOD module"
|
||||
icon_state = "module"
|
||||
/// If it can be removed
|
||||
var/removable = TRUE
|
||||
/// If it's passive, togglable, usable or active
|
||||
var/module_type = MODULE_PASSIVE
|
||||
/// Is the module active
|
||||
var/active = FALSE
|
||||
/// How much space it takes up in the MOD
|
||||
var/complexity = 0
|
||||
/// Power use when idle
|
||||
var/idle_power_cost = DEFAULT_CELL_DRAIN * 0
|
||||
/// Power use when active
|
||||
var/active_power_cost = DEFAULT_CELL_DRAIN * 0
|
||||
/// Power use when used, we call it manually
|
||||
var/use_power_cost = DEFAULT_CELL_DRAIN * 0
|
||||
/// ID used by their TGUI
|
||||
var/tgui_id
|
||||
/// Linked MODsuit
|
||||
var/obj/item/mod/control/mod
|
||||
/// If we're an active module, what item are we?
|
||||
var/obj/item/device
|
||||
/// Overlay given to the user when the module is inactive
|
||||
var/overlay_state_inactive
|
||||
/// Overlay given to the user when the module is active
|
||||
var/overlay_state_active
|
||||
/// Overlay given to the user when the module is used, lasts until cooldown finishes
|
||||
var/overlay_state_use
|
||||
/// What modules are we incompatible with?
|
||||
var/list/incompatible_modules = list()
|
||||
/// Cooldown after use
|
||||
var/cooldown_time = 0
|
||||
/// The mouse button needed to use this module
|
||||
var/used_signal
|
||||
/// Timer for the cooldown
|
||||
COOLDOWN_DECLARE(cooldown_timer)
|
||||
|
||||
/obj/item/mod/module/Initialize(mapload)
|
||||
. = ..()
|
||||
if(module_type != MODULE_ACTIVE)
|
||||
return
|
||||
if(ispath(device))
|
||||
device = new device(src)
|
||||
ADD_TRAIT(device, TRAIT_NODROP, MOD_TRAIT)
|
||||
RegisterSignal(device, COMSIG_PARENT_PREQDELETED, .proc/on_device_deletion)
|
||||
RegisterSignal(src, COMSIG_ATOM_EXITED, .proc/on_exit)
|
||||
|
||||
/obj/item/mod/module/Destroy()
|
||||
mod?.uninstall(src)
|
||||
if(device)
|
||||
UnregisterSignal(device, COMSIG_PARENT_PREQDELETED)
|
||||
QDEL_NULL(device)
|
||||
return ..()
|
||||
|
||||
/obj/item/mod/module/examine(mob/user)
|
||||
. = ..()
|
||||
if(HAS_TRAIT(user, TRAIT_DIAGNOSTIC_HUD))
|
||||
. += span_notice("Complexity level: [complexity]")
|
||||
|
||||
/// Called from MODsuit's install() proc, so when the module is installed.
|
||||
/obj/item/mod/module/proc/on_install()
|
||||
return
|
||||
|
||||
/// Called from MODsuit's uninstall() proc, so when the module is uninstalled.
|
||||
/obj/item/mod/module/proc/on_uninstall()
|
||||
return
|
||||
|
||||
/// Called when the MODsuit is activated
|
||||
/obj/item/mod/module/proc/on_suit_activation()
|
||||
return
|
||||
|
||||
/// Called when the MODsuit is deactivated
|
||||
/obj/item/mod/module/proc/on_suit_deactivation()
|
||||
return
|
||||
|
||||
/// Called when the MODsuit is equipped
|
||||
/obj/item/mod/module/proc/on_equip()
|
||||
return
|
||||
|
||||
/// Called when the MODsuit is unequipped
|
||||
/obj/item/mod/module/proc/on_unequip()
|
||||
return
|
||||
|
||||
/// Called when the module is selected from the TGUI
|
||||
/obj/item/mod/module/proc/on_select()
|
||||
if(!mod.active || mod.activating || module_type == MODULE_PASSIVE)
|
||||
return
|
||||
if(module_type != MODULE_USABLE)
|
||||
if(active)
|
||||
on_deactivation()
|
||||
else
|
||||
on_activation()
|
||||
else
|
||||
on_use()
|
||||
SEND_SIGNAL(mod, COMSIG_MOD_MODULE_SELECTED)
|
||||
|
||||
/// Called when the module is activated
|
||||
/obj/item/mod/module/proc/on_activation()
|
||||
if(!COOLDOWN_FINISHED(src, cooldown_timer))
|
||||
balloon_alert(mod.wearer, "on cooldown!")
|
||||
return FALSE
|
||||
if(!mod.active || mod.activating || !mod.cell?.charge)
|
||||
balloon_alert(mod.wearer, "unpowered!")
|
||||
return FALSE
|
||||
if(module_type == MODULE_ACTIVE)
|
||||
if(mod.selected_module && !mod.selected_module.on_deactivation())
|
||||
return
|
||||
mod.selected_module = src
|
||||
if(device)
|
||||
if(mod.wearer.put_in_hands(device))
|
||||
balloon_alert(mod.wearer, "[device] extended")
|
||||
RegisterSignal(mod.wearer, COMSIG_ATOM_EXITED, .proc/on_exit)
|
||||
else
|
||||
balloon_alert(mod.wearer, "can't extend [device]!")
|
||||
return
|
||||
else
|
||||
var/used_button = mod.wearer.client?.prefs.read_preference(/datum/preference/choiced/mod_select) || MIDDLE_CLICK
|
||||
update_signal(used_button)
|
||||
balloon_alert(mod.wearer, "[src] activated, [used_button]-click to use")
|
||||
active = TRUE
|
||||
COOLDOWN_START(src, cooldown_timer, cooldown_time)
|
||||
mod.wearer.update_inv_back()
|
||||
return TRUE
|
||||
|
||||
/// Called when the module is deactivated
|
||||
/obj/item/mod/module/proc/on_deactivation()
|
||||
active = FALSE
|
||||
if(module_type == MODULE_ACTIVE)
|
||||
mod.selected_module = null
|
||||
if(device)
|
||||
mod.wearer.transferItemToLoc(device, src, TRUE)
|
||||
balloon_alert(mod.wearer, "[device] retracted")
|
||||
UnregisterSignal(mod.wearer, COMSIG_ATOM_EXITED)
|
||||
else
|
||||
balloon_alert(mod.wearer, "[src] deactivated")
|
||||
UnregisterSignal(mod.wearer, used_signal)
|
||||
used_signal = null
|
||||
mod.wearer.update_inv_back()
|
||||
return TRUE
|
||||
|
||||
/// Called when the module is used
|
||||
/obj/item/mod/module/proc/on_use()
|
||||
if(!COOLDOWN_FINISHED(src, cooldown_timer))
|
||||
return FALSE
|
||||
if(!check_power(use_power_cost))
|
||||
return FALSE
|
||||
COOLDOWN_START(src, cooldown_timer, cooldown_time)
|
||||
addtimer(CALLBACK(mod.wearer, /mob.proc/update_inv_back), cooldown_time)
|
||||
mod.wearer.update_inv_back()
|
||||
return TRUE
|
||||
|
||||
/// Called when an activated module without a device is used
|
||||
/obj/item/mod/module/proc/on_select_use(atom/target)
|
||||
mod.wearer.face_atom(target)
|
||||
if(!on_use())
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/// Called when an activated module without a device is active and the user alt/middle-clicks
|
||||
/obj/item/mod/module/proc/on_special_click(mob/source, atom/target)
|
||||
SIGNAL_HANDLER
|
||||
on_select_use(target)
|
||||
return COMSIG_MOB_CANCEL_CLICKON
|
||||
|
||||
/// Called on the MODsuit's process
|
||||
/obj/item/mod/module/proc/on_process(delta_time)
|
||||
if(active)
|
||||
if(!drain_power(active_power_cost * delta_time))
|
||||
on_deactivation()
|
||||
return FALSE
|
||||
on_active_process(delta_time)
|
||||
else
|
||||
drain_power(idle_power_cost * delta_time)
|
||||
return TRUE
|
||||
|
||||
/// Called on the MODsuit's process if it is an active module
|
||||
/obj/item/mod/module/proc/on_active_process(delta_time)
|
||||
return
|
||||
|
||||
/// Drains power from the suit cell
|
||||
/obj/item/mod/module/proc/drain_power(amount)
|
||||
if(!check_power(amount))
|
||||
return FALSE
|
||||
mod.cell.charge = max(0, mod.cell.charge - amount)
|
||||
return TRUE
|
||||
|
||||
/obj/item/mod/module/proc/check_power(amount)
|
||||
if(!mod.cell || (mod.cell.charge < amount))
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/// Adds additional things to the MODsuit ui_data()
|
||||
/obj/item/mod/module/proc/add_ui_data()
|
||||
return list()
|
||||
|
||||
/// Creates a list of configuring options for this module
|
||||
/obj/item/mod/module/proc/get_configuration()
|
||||
return list()
|
||||
|
||||
/// Generates an element of the get_configuration list with a display name, type and value
|
||||
/obj/item/mod/module/proc/add_ui_configuration(display_name, type, value, list/values)
|
||||
return list("display_name" = display_name, "type" = type, "value" = value, "values" = values)
|
||||
|
||||
/// Receives configure edits from the TGUI and edits the vars
|
||||
/obj/item/mod/module/proc/configure_edit(key, value)
|
||||
return
|
||||
|
||||
/// Called when the device moves to a different place on active modules
|
||||
/obj/item/mod/module/proc/on_exit(datum/source, atom/movable/part, direction)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
if(!active)
|
||||
return
|
||||
if(part.loc == src)
|
||||
return
|
||||
if(part.loc == mod.wearer)
|
||||
return
|
||||
if(part == device)
|
||||
on_deactivation()
|
||||
|
||||
/// Called when the device gets deleted on active modules
|
||||
/obj/item/mod/module/proc/on_device_deletion(datum/source)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
if(source == device)
|
||||
device = null
|
||||
qdel(src)
|
||||
|
||||
/// Generates an icon to be used for the suit's worn overlays
|
||||
/obj/item/mod/module/proc/generate_worn_overlay(mutable_appearance/standing)
|
||||
. = list()
|
||||
var/used_overlay
|
||||
if(overlay_state_use && !COOLDOWN_FINISHED(src, cooldown_timer))
|
||||
used_overlay = overlay_state_use
|
||||
else if(overlay_state_active && active)
|
||||
used_overlay = overlay_state_active
|
||||
else if(overlay_state_inactive)
|
||||
used_overlay = overlay_state_inactive
|
||||
else
|
||||
return
|
||||
var/mutable_appearance/module_icon = mutable_appearance('icons/mob/mod.dmi', used_overlay, layer = standing.layer + 0.1)
|
||||
. += module_icon
|
||||
|
||||
/// Updates the signal used by active modules to be activated
|
||||
/obj/item/mod/module/proc/update_signal(value)
|
||||
switch(value)
|
||||
if(MIDDLE_CLICK)
|
||||
mod.selected_module.used_signal = COMSIG_MOB_MIDDLECLICKON
|
||||
if(ALT_CLICK)
|
||||
mod.selected_module.used_signal = COMSIG_MOB_ALTCLICKON
|
||||
RegisterSignal(mod.wearer, mod.selected_module.used_signal, /obj/item/mod/module.proc/on_special_click)
|
||||
File diff suppressed because it is too large
Load Diff
@@ -426,6 +426,10 @@
|
||||
. = ..()
|
||||
charge = 50000
|
||||
|
||||
/obj/item/stock_parts/cell/crystal_cell/wizard
|
||||
desc = "A very high power cell made from crystallized magic."
|
||||
chargerate = 5000
|
||||
|
||||
/obj/item/stock_parts/cell/inducer_supply
|
||||
maxcharge = 5000
|
||||
charge = 5000
|
||||
|
||||
@@ -399,7 +399,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
|
||||
var/mob/M = i
|
||||
if(M.z != z && !(SSmapping.level_trait(z, ZTRAITS_STATION) && SSmapping.level_trait(M.z, ZTRAITS_STATION)))
|
||||
continue
|
||||
M.update_gravity(M.mob_has_gravity())
|
||||
M.update_gravity(M.has_gravity())
|
||||
if(M.client)
|
||||
shake_camera(M, 15, 1)
|
||||
M.playsound_local(T, null, 100, 1, 0.5, S = alert_sound)
|
||||
|
||||
@@ -65,16 +65,16 @@
|
||||
*/
|
||||
/obj/item/ammo_casing/proc/add_notes_ammo()
|
||||
// Try to get a projectile to derive stats from
|
||||
var/obj/projectile/exam_proj = GLOB.proj_by_path_key[projectile_type]
|
||||
if(!istype(exam_proj) || pellets == 0)
|
||||
var/obj/projectile/exam_proj = projectile_type
|
||||
if(!ispath(exam_proj) || pellets == 0)
|
||||
return
|
||||
|
||||
var/list/readout = list()
|
||||
// No dividing by 0
|
||||
if(exam_proj.damage > 0)
|
||||
readout += "Most monkeys our legal team subjected to these [span_warning(caliber)] rounds succumbed to their wounds after [span_warning("[HITS_TO_CRIT(exam_proj.damage * pellets)] shot\s")] at point-blank, taking [span_warning("[pellets] shot\s")] per round"
|
||||
if(exam_proj.stamina > 0)
|
||||
readout += "[!readout.len ? "Most monkeys" : "More fortunate monkeys"] collapsed from exhaustion after [span_warning("[HITS_TO_CRIT(exam_proj.stamina * pellets)] impact\s")] of these [span_warning("[caliber]")] rounds"
|
||||
if(initial(exam_proj.damage) > 0)
|
||||
readout += "Most monkeys our legal team subjected to these [span_warning(caliber)] rounds succumbed to their wounds after [span_warning("[HITS_TO_CRIT(initial(exam_proj.damage) * pellets)] shot\s")] at point-blank, taking [span_warning("[pellets] shot\s")] per round"
|
||||
if(initial(exam_proj.stamina) > 0)
|
||||
readout += "[!readout.len ? "Most monkeys" : "More fortunate monkeys"] collapsed from exhaustion after [span_warning("[HITS_TO_CRIT(initial(exam_proj.stamina) * pellets)] impact\s")] of these [span_warning("[caliber]")] rounds"
|
||||
if(!readout.len) // Everything else failed, give generic text
|
||||
return "Our legal team has determined the offensive nature of these [span_warning(caliber)] rounds to be esoteric"
|
||||
return readout.Join("\n") // Sending over a single string, rather than the whole list
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
S.reagents.trans_to(loaded_projectile, S.reagents.total_volume, transfered_by = user)
|
||||
loaded_projectile.name = S.name
|
||||
var/obj/projectile/bullet/dart/D = loaded_projectile
|
||||
D.piercing = S.proj_piercing
|
||||
D.inject_flags = S.inject_flags
|
||||
SG.syringes.Remove(S)
|
||||
qdel(S)
|
||||
else if(istype(loc, /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun))
|
||||
@@ -27,7 +27,7 @@
|
||||
var/obj/projectile/bullet/dart/shot_dart = loaded_projectile
|
||||
syringe_gun.reagents.trans_to(shot_dart, min(loaded_syringe.volume, syringe_gun.reagents.total_volume), transfered_by = user)
|
||||
shot_dart.name = loaded_syringe.name
|
||||
shot_dart.piercing = loaded_syringe.proj_piercing
|
||||
shot_dart.inject_flags = loaded_syringe.inject_flags
|
||||
LAZYREMOVE(syringe_gun.syringes, loaded_syringe)
|
||||
qdel(loaded_syringe)
|
||||
return ..()
|
||||
|
||||
@@ -79,14 +79,14 @@
|
||||
readout += "\nStandard models of this projectile weapon have [span_warning("[ammo_type.len] mode\s")]"
|
||||
readout += "Our heroic interns have shown that one can theoretically stay standing after..."
|
||||
for(var/obj/item/ammo_casing/energy/for_ammo as anything in ammo_type)
|
||||
exam_proj = GLOB.proj_by_path_key[for_ammo?.projectile_type]
|
||||
if(!istype(exam_proj))
|
||||
exam_proj = for_ammo.projectile_type
|
||||
if(!ispath(exam_proj))
|
||||
continue
|
||||
|
||||
if(exam_proj.damage > 0) // Don't divide by 0!!!!!
|
||||
readout += "[span_warning("[HITS_TO_CRIT(exam_proj.damage * for_ammo.pellets)] shot\s")] on [span_warning("[for_ammo.select_name]")] mode before collapsing from [exam_proj.damage_type == STAMINA ? "immense pain" : "their wounds"]."
|
||||
if(exam_proj.stamina > 0) // In case a projectile does damage AND stamina damage (Energy Crossbow)
|
||||
readout += "[span_warning("[HITS_TO_CRIT(exam_proj.stamina * for_ammo.pellets)] shot\s")] on [span_warning("[for_ammo.select_name]")] mode before collapsing from immense pain."
|
||||
if(initial(exam_proj.damage) > 0) // Don't divide by 0!!!!!
|
||||
readout += "[span_warning("[HITS_TO_CRIT(initial(exam_proj.damage) * for_ammo.pellets)] shot\s")] on [span_warning("[for_ammo.select_name]")] mode before collapsing from [initial(exam_proj.damage_type) == STAMINA ? "immense pain" : "their wounds"]."
|
||||
if(initial(exam_proj.stamina) > 0) // In case a projectile does damage AND stamina damage (Energy Crossbow)
|
||||
readout += "[span_warning("[HITS_TO_CRIT(initial(exam_proj.stamina) * for_ammo.pellets)] shot\s")] on [span_warning("[for_ammo.select_name]")] mode before collapsing from immense pain."
|
||||
else
|
||||
readout += "a theoretically infinite number of shots on [span_warning("[for_ammo.select_name]")] mode."
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
damage = 6
|
||||
embedding = null
|
||||
shrapnel_type = null
|
||||
var/piercing = FALSE
|
||||
var/inject_flags = null
|
||||
|
||||
/obj/projectile/bullet/dart/Initialize(mapload)
|
||||
. = ..()
|
||||
@@ -14,7 +14,7 @@
|
||||
if(iscarbon(target))
|
||||
var/mob/living/carbon/M = target
|
||||
if(blocked != 100) // not completely blocked
|
||||
if(M.can_inject(target_zone = def_zone, injection_flags = piercing ? INJECT_CHECK_PENETRATE_THICK : null)) // Pass the hit zone to see if it can inject by whether it hit the head or the body.
|
||||
if(M.can_inject(target_zone = def_zone, injection_flags = inject_flags)) // Pass the hit zone to see if it can inject by whether it hit the head or the body.
|
||||
..()
|
||||
reagents.trans_to(M, reagents.total_volume, methods = INJECT)
|
||||
return BULLET_ACT_HIT
|
||||
@@ -47,4 +47,4 @@
|
||||
reagents.flags &= ~NO_REACT
|
||||
|
||||
/obj/projectile/bullet/dart/piercing
|
||||
piercing = TRUE
|
||||
inject_flags = INJECT_CHECK_PENETRATE_THICK
|
||||
|
||||
@@ -110,7 +110,7 @@
|
||||
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
|
||||
amount_per_transfer_from_this = 15
|
||||
volume = 15
|
||||
ignore_flags = 1 //so you can medipen through hardsuits
|
||||
ignore_flags = 1 //so you can medipen through spacesuits
|
||||
reagent_flags = DRAWABLE
|
||||
flags_1 = null
|
||||
list_reagents = list(/datum/reagent/medicine/epinephrine = 10, /datum/reagent/toxin/formaldehyde = 3, /datum/reagent/medicine/coagulant = 2)
|
||||
@@ -279,7 +279,7 @@
|
||||
|
||||
/obj/item/reagent_containers/hypospray/medipen/magillitis
|
||||
name = "experimental autoinjector"
|
||||
desc = "A custom-frame needle injector with a small single-use reservoir, containing an experimental serum. Unlike the more common medipen frame, it cannot pierce through protective armor or hardsuits, nor can the chemical inside be extracted."
|
||||
desc = "A custom-frame needle injector with a small single-use reservoir, containing an experimental serum. Unlike the more common medipen frame, it cannot pierce through protective armor or space suits, nor can the chemical inside be extracted."
|
||||
icon_state = "gorillapen"
|
||||
inhand_icon_state = "gorillapen"
|
||||
base_icon_state = "gorillapen"
|
||||
|
||||
@@ -10,12 +10,12 @@
|
||||
amount_per_transfer_from_this = 5
|
||||
possible_transfer_amounts = list(5, 10, 15)
|
||||
volume = 15
|
||||
var/busy = FALSE // needed for delayed drawing of blood
|
||||
var/proj_piercing = 0 //does it pierce through thick clothes when shot with syringe gun
|
||||
custom_materials = list(/datum/material/iron=10, /datum/material/glass=20)
|
||||
reagent_flags = TRANSPARENT
|
||||
custom_price = PAYCHECK_EASY * 0.5
|
||||
sharpness = SHARP_POINTY
|
||||
/// Flags used by the injection
|
||||
var/inject_flags = NONE
|
||||
|
||||
/obj/item/reagent_containers/syringe/Initialize(mapload)
|
||||
. = ..()
|
||||
@@ -25,8 +25,6 @@
|
||||
return
|
||||
|
||||
/obj/item/reagent_containers/syringe/proc/try_syringe(atom/target, mob/user, proximity)
|
||||
if(busy)
|
||||
return FALSE
|
||||
if(!proximity)
|
||||
return FALSE
|
||||
if(!target.reagents)
|
||||
@@ -34,7 +32,7 @@
|
||||
|
||||
if(isliving(target))
|
||||
var/mob/living/living_target = target
|
||||
if(!living_target.try_inject(user, injection_flags = INJECT_TRY_SHOW_ERROR_MESSAGE))
|
||||
if(!living_target.try_inject(user, injection_flags = INJECT_TRY_SHOW_ERROR_MESSAGE|inject_flags))
|
||||
return FALSE
|
||||
|
||||
// chance of monkey retaliation
|
||||
@@ -64,12 +62,12 @@
|
||||
|
||||
if(isliving(target))
|
||||
var/mob/living/living_target = target
|
||||
if(!living_target.try_inject(user, injection_flags = INJECT_TRY_SHOW_ERROR_MESSAGE))
|
||||
if(!living_target.try_inject(user, injection_flags = INJECT_TRY_SHOW_ERROR_MESSAGE|inject_flags))
|
||||
return
|
||||
if(living_target != user)
|
||||
living_target.visible_message(span_danger("[user] is trying to inject [living_target]!"), \
|
||||
span_userdanger("[user] is trying to inject you!"))
|
||||
if(!do_mob(user, living_target, CHEM_INTERACT_DELAY(3 SECONDS, user), extra_checks = CALLBACK(living_target, /mob/living/proc/try_inject, user, null, INJECT_TRY_SHOW_ERROR_MESSAGE)))
|
||||
if(!do_mob(user, living_target, CHEM_INTERACT_DELAY(3 SECONDS, user), extra_checks = CALLBACK(living_target, /mob/living/proc/try_inject, user, null, INJECT_TRY_SHOW_ERROR_MESSAGE|inject_flags)))
|
||||
return
|
||||
if(!reagents.total_volume)
|
||||
return
|
||||
@@ -99,13 +97,10 @@
|
||||
if(target != user)
|
||||
target.visible_message(span_danger("[user] is trying to take a blood sample from [target]!"), \
|
||||
span_userdanger("[user] is trying to take a blood sample from you!"))
|
||||
busy = TRUE
|
||||
if(!do_mob(user, target, CHEM_INTERACT_DELAY(3 SECONDS, user), extra_checks = CALLBACK(living_target, /mob/living/proc/try_inject, user, null, INJECT_TRY_SHOW_ERROR_MESSAGE)))
|
||||
busy = FALSE
|
||||
if(!do_mob(user, target, CHEM_INTERACT_DELAY(3 SECONDS, user), extra_checks = CALLBACK(living_target, /mob/living/proc/try_inject, user, null, INJECT_TRY_SHOW_ERROR_MESSAGE|inject_flags)))
|
||||
return SECONDARY_ATTACK_CONTINUE_CHAIN
|
||||
if(reagents.total_volume >= reagents.maximum_volume)
|
||||
return SECONDARY_ATTACK_CONTINUE_CHAIN
|
||||
busy = FALSE
|
||||
if(living_target.transfer_blood_to(src, drawn_amount))
|
||||
user.visible_message(span_notice("[user] takes a blood sample from [living_target]."))
|
||||
else
|
||||
@@ -234,7 +229,7 @@
|
||||
base_icon_state = "piercing"
|
||||
volume = 10
|
||||
possible_transfer_amounts = list(5, 10)
|
||||
proj_piercing = 1
|
||||
inject_flags = INJECT_CHECK_PENETRATE_THICK
|
||||
|
||||
/obj/item/reagent_containers/syringe/spider_extract
|
||||
name = "spider extract syringe"
|
||||
|
||||
@@ -255,7 +255,7 @@
|
||||
AM.forceMove(T)
|
||||
..()
|
||||
|
||||
/obj/machinery/disposal/get_dumping_location(obj/item/storage/source,mob/user)
|
||||
/obj/machinery/disposal/get_dumping_location()
|
||||
return src
|
||||
|
||||
//How disposal handles getting a storage dump from a storage object
|
||||
|
||||
@@ -167,7 +167,7 @@
|
||||
/datum/religion_rites/fireproof/invoke_effect(mob/living/user, atom/religious_tool)
|
||||
..()
|
||||
if(!QDELETED(chosen_clothing) && get_turf(religious_tool) == chosen_clothing.loc) //check if the same clothing is still there
|
||||
if(istype(chosen_clothing,/obj/item/clothing/suit/hooded) || istype(chosen_clothing,/obj/item/clothing/suit/space/hardsuit ))
|
||||
if(istype(chosen_clothing,/obj/item/clothing/suit/hooded))
|
||||
for(var/obj/item/clothing/head/integrated_helmet in chosen_clothing.contents) //check if the clothing has a hood/helmet integrated and fireproof it if there is one.
|
||||
apply_fireproof(integrated_helmet)
|
||||
apply_fireproof(chosen_clothing)
|
||||
|
||||
@@ -887,7 +887,7 @@
|
||||
category = list("Cyborg Upgrade Modules")
|
||||
|
||||
/datum/design/boris_ai_controller
|
||||
name = "B.O.R.I.S. AI-Cyborg Remote Control Module"
|
||||
name = "B.O.R.I.S. AI-Cyborg Remote Control"
|
||||
id = "borg_ai_control"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/borg/upgrade/ai
|
||||
@@ -969,3 +969,336 @@
|
||||
construction_time = 100
|
||||
build_path = /obj/item/assembly/flash/handheld
|
||||
category = list("Misc")
|
||||
|
||||
//MODsuit stuff
|
||||
|
||||
/datum/design/mod_shell
|
||||
name = "MOD shell"
|
||||
desc = "A 'Nakamura Engineering' designed shell for a Modular Suit."
|
||||
id = "mod_shell"
|
||||
build_type = MECHFAB
|
||||
materials = list(/datum/material/iron = 10000, /datum/material/plasma = 5000)
|
||||
construction_time = 25 SECONDS
|
||||
build_path = /obj/item/mod/construction/shell
|
||||
category = list("MOD Construction")
|
||||
|
||||
/datum/design/mod_helmet
|
||||
name = "MOD helmet"
|
||||
desc = "A 'Nakamura Engineering' designed helmet for a Modular Suit."
|
||||
id = "mod_helmet"
|
||||
build_type = MECHFAB
|
||||
materials = list(/datum/material/iron = 5000)
|
||||
construction_time = 10 SECONDS
|
||||
build_path = /obj/item/mod/construction/helmet
|
||||
category = list("MOD Construction")
|
||||
|
||||
/datum/design/mod_chestplate
|
||||
name = "MOD chestplate"
|
||||
desc = "A 'Nakamura Engineering' designed chestplate for a Modular Suit."
|
||||
id = "mod_chestplate"
|
||||
build_type = MECHFAB
|
||||
materials = list(/datum/material/iron = 5000)
|
||||
construction_time = 10 SECONDS
|
||||
build_path = /obj/item/mod/construction/chestplate
|
||||
category = list("MOD Construction")
|
||||
|
||||
/datum/design/mod_gauntlets
|
||||
name = "MOD gauntlets"
|
||||
desc = "'Nakamura Engineering' designed gauntlets for a Modular Suit."
|
||||
id = "mod_gauntlets"
|
||||
build_type = MECHFAB
|
||||
materials = list(/datum/material/iron = 5000)
|
||||
construction_time = 10 SECONDS
|
||||
build_path = /obj/item/mod/construction/gauntlets
|
||||
category = list("MOD Construction")
|
||||
|
||||
/datum/design/mod_boots
|
||||
name = "MOD boots"
|
||||
desc = "'Nakamura Engineering' designed boots for a Modular Suit."
|
||||
id = "mod_boots"
|
||||
build_type = MECHFAB
|
||||
materials = list(/datum/material/iron = 5000)
|
||||
construction_time = 10 SECONDS
|
||||
build_path = /obj/item/mod/construction/boots
|
||||
category = list("MOD Construction")
|
||||
|
||||
/datum/design/mod_armor
|
||||
name = "MOD armor"
|
||||
desc = "External armor for a Modular Suit."
|
||||
id = "mod_armor_standard"
|
||||
build_type = MECHFAB|PROTOLATHE
|
||||
materials = list(/datum/material/iron = 6000, /datum/material/glass = 3000, /datum/material/plasma = 1000)
|
||||
construction_time = 15 SECONDS
|
||||
build_path = /obj/item/mod/construction/armor
|
||||
category = list("MOD Construction", "Equipment")
|
||||
research_icon = 'icons/obj/mod.dmi'
|
||||
research_icon_state = "standard-armor"
|
||||
|
||||
/datum/design/mod_armor/New()
|
||||
. = ..()
|
||||
var/obj/item/mod/construction/armor/armor_type = build_path
|
||||
var/datum/mod_theme/theme = GLOB.mod_themes[initial(armor_type.theme)]
|
||||
name = "MOD [theme.name] armor"
|
||||
desc = "External armor for a Modular Suit. [theme.desc]"
|
||||
|
||||
/datum/design/mod_armor/engineering
|
||||
id = "mod_armor_engineering"
|
||||
build_path = /obj/item/mod/construction/armor/engineering
|
||||
materials = list(/datum/material/iron = 6000, /datum/material/gold = 2000, /datum/material/glass = 1000, /datum/material/plasma = 1000)
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
|
||||
research_icon_state = "engineering-armor"
|
||||
|
||||
/datum/design/mod_armor/atmospheric
|
||||
id = "mod_armor_atmospheric"
|
||||
build_path = /obj/item/mod/construction/armor/atmospheric
|
||||
materials = list(/datum/material/iron = 6000, /datum/material/titanium = 2000, /datum/material/glass = 1000, /datum/material/plasma = 1000)
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
|
||||
research_icon_state = "atmospheric-armor"
|
||||
|
||||
/datum/design/mod_armor/medical
|
||||
id = "mod_armor_medical"
|
||||
build_path = /obj/item/mod/construction/armor/medical
|
||||
materials = list(/datum/material/iron = 6000, /datum/material/silver = 2000, /datum/material/glass = 1000, /datum/material/plasma = 1000)
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||
research_icon_state = "medical-armor"
|
||||
|
||||
/datum/design/mod_armor/security
|
||||
id = "mod_armor_security"
|
||||
build_path = /obj/item/mod/construction/armor/security
|
||||
materials = list(/datum/material/iron = 6000, /datum/material/uranium = 2000, /datum/material/glass = 1000, /datum/material/plasma = 1000)
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
|
||||
research_icon_state = "security-armor"
|
||||
|
||||
/datum/design/mod_armor/cosmohonk
|
||||
id = "mod_armor_cosmohonk"
|
||||
build_path = /obj/item/mod/construction/armor/cosmohonk
|
||||
materials = list(/datum/material/iron = 6000, /datum/material/bananium = 2000, /datum/material/glass = 1000, /datum/material/plasma = 1000)
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SERVICE
|
||||
research_icon_state = "cosmohonk-armor"
|
||||
|
||||
/datum/design/mod_paint_kit
|
||||
name = "MOD paint kit"
|
||||
desc = "A paint kit for Modular Suits."
|
||||
id = "mod_paint_kit"
|
||||
build_type = MECHFAB
|
||||
materials = list(/datum/material/iron = 1000, /datum/material/plastic = 500)
|
||||
construction_time = 5 SECONDS
|
||||
build_path = /obj/item/mod/paint
|
||||
category = list("Misc")
|
||||
|
||||
/datum/design/module
|
||||
name = "MOD Module"
|
||||
build_type = MECHFAB
|
||||
construction_time = 1 SECONDS
|
||||
materials = list(/datum/material/iron = 1000, /datum/material/glass = 1000)
|
||||
build_path = /obj/item/mod/module
|
||||
category = list("MOD Modules")
|
||||
|
||||
/datum/design/module/New()
|
||||
. = ..()
|
||||
var/obj/item/mod/module/module = build_path
|
||||
desc = "[initial(module.desc)] It uses [initial(module.complexity)] complexity."
|
||||
|
||||
/datum/design/module/mod_storage
|
||||
name = "MOD Module: Storage"
|
||||
id = "mod_storage"
|
||||
materials = list(/datum/material/iron = 2500, /datum/material/glass = 500)
|
||||
build_path = /obj/item/mod/module/storage
|
||||
|
||||
/datum/design/module/mod_visor_medhud
|
||||
name = "MOD Module: Medical Visor"
|
||||
id = "mod_visor_medhud"
|
||||
materials = list(/datum/material/silver = 500, /datum/material/glass = 1000)
|
||||
build_path = /obj/item/mod/module/visor/medhud
|
||||
|
||||
/datum/design/module/mod_visor_diaghud
|
||||
name = "MOD Module: Diagnostic Visor"
|
||||
id = "mod_visor_diaghud"
|
||||
materials = list(/datum/material/gold = 500, /datum/material/glass = 1000)
|
||||
build_path = /obj/item/mod/module/visor/diaghud
|
||||
|
||||
/datum/design/module/mod_visor_sechud
|
||||
name = "MOD Module: Security Visor"
|
||||
id = "mod_visor_sechud"
|
||||
materials = list(/datum/material/titanium = 500, /datum/material/glass = 1000)
|
||||
build_path = /obj/item/mod/module/visor/sechud
|
||||
|
||||
/datum/design/module/mod_visor_meson
|
||||
name = "MOD Module: Meson Visor"
|
||||
id = "mod_visor_meson"
|
||||
materials = list(/datum/material/uranium = 500, /datum/material/glass = 1000)
|
||||
build_path = /obj/item/mod/module/visor/meson
|
||||
|
||||
/datum/design/module/mod_visor_welding
|
||||
name = "MOD Module: Welding Protection"
|
||||
id = "mod_welding"
|
||||
materials = list(/datum/material/iron = 500, /datum/material/glass = 500)
|
||||
build_path = /obj/item/mod/module/welding
|
||||
|
||||
/datum/design/module/mod_t_ray
|
||||
name = "MOD Module: T-Ray Scanner"
|
||||
id = "mod_t_ray"
|
||||
materials = list(/datum/material/iron = 500, /datum/material/glass = 1000)
|
||||
build_path = /obj/item/mod/module/t_ray
|
||||
|
||||
/datum/design/module/mod_health_analyzer
|
||||
name = "MOD Module: Health Analyzer"
|
||||
id = "mod_health_analyzer"
|
||||
materials = list(/datum/material/iron = 500, /datum/material/glass = 1000)
|
||||
build_path = /obj/item/mod/module/health_analyzer
|
||||
|
||||
/datum/design/module/mod_stealth
|
||||
name = "MOD Module: Cloak"
|
||||
id = "mod_stealth"
|
||||
materials = list(/datum/material/iron = 1000, /datum/material/bluespace = 500)
|
||||
build_path = /obj/item/mod/module/stealth
|
||||
|
||||
/datum/design/module/mod_jetpack
|
||||
name = "MOD Module: Ion Jetpack"
|
||||
id = "mod_jetpack"
|
||||
materials = list(/datum/material/iron = 1500, /datum/material/plasma = 1000)
|
||||
build_path = /obj/item/mod/module/jetpack
|
||||
|
||||
/datum/design/module/mod_magboot
|
||||
name = "MOD Module: Magnetic Stabilizator"
|
||||
id = "mod_magboot"
|
||||
materials = list(/datum/material/iron = 1000, /datum/material/gold = 500)
|
||||
build_path = /obj/item/mod/module/magboot
|
||||
|
||||
/datum/design/module/mod_holster
|
||||
name = "MOD Module: Holster"
|
||||
id = "mod_holster"
|
||||
materials = list(/datum/material/iron = 1500, /datum/material/glass = 500)
|
||||
build_path = /obj/item/mod/module/holster
|
||||
|
||||
/datum/design/module/mod_tether
|
||||
name = "MOD Module: Emergency Tether"
|
||||
id = "mod_tether"
|
||||
materials = list(/datum/material/iron = 1000, /datum/material/silver = 500)
|
||||
build_path = /obj/item/mod/module/tether
|
||||
|
||||
/datum/design/module/mod_mouthhole
|
||||
name = "MOD Module: Eating Apparatus"
|
||||
id = "mod_mouthhole"
|
||||
materials = list(/datum/material/iron = 1500)
|
||||
build_path = /obj/item/mod/module/mouthhole
|
||||
|
||||
/datum/design/module/mod_rad_protection
|
||||
name = "MOD Module: Radiation Protection"
|
||||
id = "mod_rad_protection"
|
||||
materials = list(/datum/material/iron = 1000, /datum/material/uranium = 1000)
|
||||
build_path = /obj/item/mod/module/rad_protection
|
||||
|
||||
/datum/design/module/mod_emp_shield
|
||||
name = "MOD Module: EMP Shield"
|
||||
id = "mod_emp_shield"
|
||||
materials = list(/datum/material/iron = 1000, /datum/material/plasma = 1000)
|
||||
build_path = /obj/item/mod/module/emp_shield
|
||||
|
||||
/datum/design/module/mod_flashlight
|
||||
name = "MOD Module: Flashlight"
|
||||
id = "mod_flashlight"
|
||||
materials = list(/datum/material/iron = 500, /datum/material/glass = 1000)
|
||||
build_path = /obj/item/mod/module/flashlight
|
||||
|
||||
/datum/design/module/mod_reagent_scanner
|
||||
name = "MOD Module: Reagent Scanner"
|
||||
id = "mod_reagent_scanner"
|
||||
materials = list(/datum/material/glass = 1000)
|
||||
build_path = /obj/item/mod/module/reagent_scanner
|
||||
|
||||
/datum/design/module/mod_gps
|
||||
name = "MOD Module: Internal GPS"
|
||||
id = "mod_gps"
|
||||
materials = list(/datum/material/iron = 500, /datum/material/glass = 500)
|
||||
build_path = /obj/item/mod/module/gps
|
||||
|
||||
/datum/design/module/mod_constructor
|
||||
name = "MOD Module: Constructor"
|
||||
id = "mod_constructor"
|
||||
materials = list(/datum/material/iron = 1000, /datum/material/titanium = 500)
|
||||
build_path = /obj/item/mod/module/constructor
|
||||
|
||||
/datum/design/module/mod_quick_carry
|
||||
name = "MOD Module: Quick Carry"
|
||||
id = "mod_quick_carry"
|
||||
materials = list(/datum/material/iron = 1000, /datum/material/titanium = 500)
|
||||
build_path = /obj/item/mod/module/quick_carry
|
||||
|
||||
/datum/design/module/mod_longfall
|
||||
name = "MOD Module: Longfall"
|
||||
id = "mod_longfall"
|
||||
materials = list(/datum/material/iron = 1000)
|
||||
build_path = /obj/item/mod/module/longfall
|
||||
|
||||
/datum/design/module/mod_thermal_regulator
|
||||
name = "MOD Module: Thermal Regulator"
|
||||
id = "mod_thermal_regulator"
|
||||
materials = list(/datum/material/iron = 500, /datum/material/glass = 1000)
|
||||
build_path = /obj/item/mod/module/thermal_regulator
|
||||
|
||||
/datum/design/module/mod_injector
|
||||
name = "MOD Module: Injector"
|
||||
id = "mod_injector"
|
||||
materials = list(/datum/material/iron = 1000, /datum/material/diamond = 500)
|
||||
build_path = /obj/item/mod/module/injector
|
||||
|
||||
/datum/design/module/mod_microwave_beam
|
||||
name = "MOD Module: Microwave Beam"
|
||||
id = "mod_microwave_beam"
|
||||
materials = list(/datum/material/iron = 1000, /datum/material/uranium = 500)
|
||||
build_path = /obj/item/mod/module/microwave_beam
|
||||
|
||||
/datum/design/module/mod_bikehorn
|
||||
name = "MOD Module: Bike Horn"
|
||||
id = "mod_bikehorn"
|
||||
materials = list(/datum/material/plastic = 500, /datum/material/iron = 500)
|
||||
build_path = /obj/item/mod/module/bikehorn
|
||||
|
||||
/datum/design/module/mod_clamp
|
||||
name = "MOD Module: Crate Clamp"
|
||||
id = "mod_clamp"
|
||||
materials = list(/datum/material/iron = 2000)
|
||||
build_path = /obj/item/mod/module/clamp
|
||||
|
||||
/datum/design/module/mod_drill
|
||||
name = "MOD Module: Drill"
|
||||
id = "mod_drill"
|
||||
materials = list(/datum/material/silver = 1000, /datum/material/iron = 2000)
|
||||
build_path = /obj/item/mod/module/drill
|
||||
|
||||
/datum/design/module/mod_orebag
|
||||
name = "MOD Module: Ore Bag"
|
||||
id = "mod_orebag"
|
||||
materials = list(/datum/material/iron = 1500)
|
||||
build_path = /obj/item/mod/module/orebag
|
||||
|
||||
/datum/design/module/mod_organ_thrower
|
||||
name = "MOD Module: Organ Thrower"
|
||||
id = "mod_organ_thrower"
|
||||
materials = list(/datum/material/iron = 1000, /datum/material/glass = 1000)
|
||||
build_path = /obj/item/mod/module/organ_thrower
|
||||
|
||||
/datum/design/module/mod_pathfinder
|
||||
name = "MOD Module: Pathfinder"
|
||||
id = "mod_pathfinder"
|
||||
materials = list(/datum/material/uranium = 1000, /datum/material/iron = 1000)
|
||||
build_path = /obj/item/mod/module/pathfinder
|
||||
|
||||
/datum/design/module/mod_dna_lock
|
||||
name = "MOD Module: DNA Lock"
|
||||
id = "mod_dna_lock"
|
||||
materials = list(/datum/material/diamond = 500, /datum/material/glass = 1000)
|
||||
build_path = /obj/item/mod/module/dna_lock
|
||||
|
||||
/datum/design/module/mod_circuit
|
||||
name = "MOD Module: Circuit Adapter"
|
||||
id = "mod_circuit"
|
||||
materials = list(/datum/material/glass = 2000)
|
||||
build_path = /obj/item/mod/module/circuit
|
||||
|
||||
/datum/design/module/mod_plasma_stabilizer
|
||||
name = "MOD Module: Plasma Stabilizer"
|
||||
id = "mod_plasma"
|
||||
materials = list(/datum/material/plasma = 1000, /datum/material/glass = 1000)
|
||||
build_path = /obj/item/mod/module/plasma_stabilizer
|
||||
|
||||
@@ -112,6 +112,28 @@
|
||||
"ripleyupgrade",
|
||||
)
|
||||
|
||||
/datum/techweb_node/mod_basic
|
||||
id = "mod"
|
||||
starting_node = TRUE
|
||||
display_name = "Basic Modular Suits"
|
||||
description = "Specialized back mounted power suits with various different modules."
|
||||
design_ids = list(
|
||||
"mod_armor_standard",
|
||||
"mod_boots",
|
||||
"mod_chestplate",
|
||||
"mod_gauntlets",
|
||||
"mod_helmet",
|
||||
"mod_paint_kit",
|
||||
"mod_shell",
|
||||
"mod_storage",
|
||||
"mod_welding",
|
||||
"mod_mouthhole",
|
||||
"mod_flashlight",
|
||||
"mod_longfall",
|
||||
"mod_thermal_regulator",
|
||||
"mod_plasma",
|
||||
)
|
||||
|
||||
/datum/techweb_node/mech_tools
|
||||
id = "mech_tools"
|
||||
starting_node = TRUE
|
||||
@@ -691,6 +713,7 @@
|
||||
"dispenser_shell",
|
||||
"door_shell",
|
||||
"gun_shell",
|
||||
"mod_circuit",
|
||||
"money_bot_shell",
|
||||
"scanner_gate_shell",
|
||||
"scanner_shell",
|
||||
@@ -1419,6 +1442,96 @@
|
||||
)
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
|
||||
|
||||
//MODsuit tech
|
||||
|
||||
/datum/techweb_node/mod_advanced
|
||||
id = "mod_advanced"
|
||||
display_name = "Advanced Modular Suits"
|
||||
description = "More advanced modules, to improve modular suits."
|
||||
prereq_ids = list("robotics")
|
||||
design_ids = list(
|
||||
"mod_visor_diaghud",
|
||||
"mod_stealth",
|
||||
"mod_holster",
|
||||
"mod_gps",
|
||||
"mod_reagent_scanner",
|
||||
"mod_clamp",
|
||||
"mod_drill",
|
||||
"mod_orebag",
|
||||
"mod_pathfinder",
|
||||
)
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
|
||||
|
||||
/datum/techweb_node/mod_engineering
|
||||
id = "mod_engineering"
|
||||
display_name = "Engineering Modular Suits"
|
||||
description = "Engineering suits, for powered engineers."
|
||||
prereq_ids = list("mod_advanced", "engineering")
|
||||
design_ids = list(
|
||||
"mod_armor_engineering",
|
||||
"mod_visor_meson",
|
||||
"mod_t_ray",
|
||||
"mod_magboot",
|
||||
"mod_tether",
|
||||
"mod_constructor",
|
||||
)
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
|
||||
|
||||
/datum/techweb_node/mod_advanced_engineering
|
||||
id = "mod_advanced_engineering"
|
||||
display_name = "Advanced Engineering Modular Suits"
|
||||
description = "Advanced Engineering suits, for advanced powered engineers."
|
||||
prereq_ids = list("mod_engineering", "adv_engi")
|
||||
design_ids = list(
|
||||
"mod_armor_atmospheric",
|
||||
"mod_jetpack",
|
||||
"mod_rad_protection",
|
||||
"mod_emp_shield",
|
||||
)
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500)
|
||||
|
||||
/datum/techweb_node/mod_medical
|
||||
id = "mod_medical"
|
||||
display_name = "Medical Modular Suits"
|
||||
description = "Medical suits for quick rescue purposes."
|
||||
prereq_ids = list("mod_advanced", "biotech")
|
||||
design_ids = list(
|
||||
"mod_armor_medical",
|
||||
"mod_visor_medhud",
|
||||
"mod_health_analyzer",
|
||||
"mod_quick_carry",
|
||||
"mod_injector",
|
||||
"mod_organ_thrower",
|
||||
"mod_dna_lock",
|
||||
)
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
|
||||
|
||||
/datum/techweb_node/mod_security
|
||||
id = "mod_security"
|
||||
display_name = "Security Modular Suits"
|
||||
description = "Security suits for space crime handling."
|
||||
prereq_ids = list("mod_advanced", "sec_basic")
|
||||
design_ids = list(
|
||||
"mod_armor_security",
|
||||
"mod_visor_sechud",
|
||||
"mod_stealth",
|
||||
"mod_holster",
|
||||
"mod_pathfinder",
|
||||
)
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
|
||||
|
||||
/datum/techweb_node/mod_entertainment
|
||||
id = "mod_entertainment"
|
||||
display_name = "Entertainment Modular Suits"
|
||||
description = "Powered suits for protection against low-humor environments."
|
||||
prereq_ids = list("mod_advanced", "clown")
|
||||
design_ids = list(
|
||||
"mod_armor_cosmohonk",
|
||||
"mod_bikehorn",
|
||||
"mod_microwave_beam",
|
||||
)
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
|
||||
|
||||
////////////////////////mech technology////////////////////////
|
||||
/datum/techweb_node/adv_mecha
|
||||
id = "adv_mecha"
|
||||
|
||||
@@ -125,31 +125,6 @@ GLOBAL_VAR_INIT(fscpassword, generate_password())
|
||||
ambientsounds = list('sound/ambience/ambitech2.ogg', 'sound/ambience/ambitech3.ogg')
|
||||
area_flags = NOTELEPORT | UNIQUE_AREA
|
||||
|
||||
//Cybersun hardsuit
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/cybersun
|
||||
name = "Cybersun hardsuit helmet"
|
||||
desc = "Prototype hardsuit helmet with experimental armor plates, protecting from laser-based weapons very well, while giving limited protection against anything else."
|
||||
icon_state = "cybersun"
|
||||
inhand_icon_state = "cybersun"
|
||||
hardsuit_type = "cybersun"
|
||||
armor = list(MELEE = 30, BULLET = 40, LASER = 55, ENERGY = 55, BOMB = 30, BIO = 100, FIRE = 60, ACID = 60)
|
||||
strip_delay = 600
|
||||
actions_types = list()
|
||||
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/cybersun
|
||||
icon_state = "cybersun"
|
||||
inhand_icon_state = "cybersun"
|
||||
hardsuit_type = "cybersun"
|
||||
name = "Cybersun hardsuit"
|
||||
desc = "Prototype hardsuit with experimental armor plates, protecting from laser-based weapons very well, while giving limited protection against anything else."
|
||||
armor = list(MELEE = 30, BULLET = 40, LASER = 55, ENERGY = 55, BOMB = 30, BIO = 100, FIRE = 60, ACID = 60)
|
||||
slowdown = 0
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/cybersun
|
||||
actions_types = list(/datum/action/item_action/toggle_helmet, /datum/action/item_action/toggle_spacesuit)
|
||||
jetpack = /obj/item/tank/jetpack/suit
|
||||
|
||||
//Special NT NPCs
|
||||
|
||||
/mob/living/simple_animal/hostile/nanotrasen/ranged/assault
|
||||
|
||||
@@ -9,11 +9,15 @@
|
||||
info = "<b>*Damage Report*</b><br><br><b>Alpha Station</b> - Destroyed<br><br><b>Beta Station</b> - Catastrophic Damage. Medical, destroyed. Atmospherics, partially destroyed. Engine Core, destroyed.<br><br><b>Charlie Station</b> - Multiple asteroid impacts, no loss in air pressure.<br><br><b>Delta Station</b> - Intact. <b>WARNING</b>: Unknown force occupying Delta Station. Intent unknown. Species unknown. Numbers unknown.<br><br>Recommendation - Reestablish station powernet via solar array. Reestablish station atmospherics system to restore air."
|
||||
|
||||
/obj/item/paper/fluff/ruins/oldstation/protosuit
|
||||
name = "B01-RIG Hardsuit Report"
|
||||
info = "<b>*Prototype Hardsuit*</b><br><br>The B01-RIG Hardsuit is a prototype powered exoskeleton. Based off a recovered pre-void war era united Earth government powered military \
|
||||
exosuit, the RIG Hardsuit is a breakthrough in Hardsuit technology, and is the first post-void war era Hardsuit that can be safely used by an operator.<br><br>The B01 however suffers \
|
||||
a myriad of constraints. It is slow and bulky to move around, it lacks any significant armor plating against direct attacks and its internal heads up display is unfinished, \
|
||||
resulting in the user being unable to see long distances.<br><br>The B01 is unlikely to see any form of mass production, but will serve as a base for future Hardsuit developments."
|
||||
name = "B01-MOD modular suit Report"
|
||||
info = "<b>*Prototype MODsuit*</b><br><br>This is a prototype powered exoskeleton, a design not seen in hundreds of years, \
|
||||
the first post-void war era modular suit to ever be safely utilized by an operator. \
|
||||
This ancient clunker is still functional, though it's missing several modern-day luxuries from \
|
||||
updated Nakamura Engineering designs. Primarily, the suit's myoelectric suit layer is entirely non-existant, \
|
||||
and the servos do very little to help distribute the weight evenly across the wearer's body, \
|
||||
making it slow and bulky to move in. Additionally, the armor plating never finished production aside from the shoulders, \
|
||||
forearms, and helmet; making it useless against direct attacks. The internal heads-up display is rendered entirely in \
|
||||
monochromatic cyan, leaving the user unable to see long distances. However, the way the helmet retracts is pretty cool."
|
||||
|
||||
/obj/item/paper/fluff/ruins/oldstation/protohealth
|
||||
name = "Health Analyser Report"
|
||||
@@ -41,7 +45,7 @@
|
||||
|
||||
/obj/item/paper/fluff/ruins/oldstation/protoinv
|
||||
name = "Laboratory Inventory"
|
||||
info = "<b>*Inventory*</b><br><br>(1) Prototype Hardsuit<br><br>(1)Health Analyser<br><br>(1)Prototype Energy Gun<br><br>(1)Singularity Generation Disk<br><br><b>DO NOT REMOVE WITHOUT \
|
||||
info = "<b>*Inventory*</b><br><br>(1) Prototype MODsuit<br><br>(1)Health Analyser<br><br>(1)Prototype Energy Gun<br><br>(1)Singularity Generation Disk<br><br><b>DO NOT REMOVE WITHOUT \
|
||||
THE CAPTAIN AND RESEARCH DIRECTOR'S AUTHORISATION</b>"
|
||||
|
||||
/obj/item/paper/fluff/ruins/oldstation/report
|
||||
@@ -66,3 +70,116 @@
|
||||
I have no fucking idea what they are, all I know is that they don't like me. On occasion I hear them hissing and clawing on the airlock... good idea I barricaded the way in. Bad news: the transit tube is still broken, the damn engineers never fixed it. \
|
||||
So basically, I'm stuck here until someone comes to rescue us. And I have no food or water. <br>If you're reading this, I'm probably dead. These things have taken over part of Delta station, and I think they somehow came from the AI core... \
|
||||
Whatever you do, DON'T OPEN THE FIRELOCKS unless you have something to kill them. Look in security, maybe there might be some gear left in there. <br><br>So hungry... I don't want to go out like this..."
|
||||
|
||||
/obj/machinery/mod_installer
|
||||
name = "modular outerwear device installator"
|
||||
desc = "An ancient machine that mounts a MOD unit onto the occupant."
|
||||
icon = 'icons/obj/machines/mod_installer.dmi'
|
||||
icon_state = "mod_installer"
|
||||
base_icon_state = "mod_installer"
|
||||
layer = ABOVE_WINDOW_LAYER
|
||||
use_power = IDLE_POWER_USE
|
||||
anchored = TRUE
|
||||
density = TRUE
|
||||
obj_flags = NO_BUILD // Becomes undense when the door is open
|
||||
idle_power_usage = 50
|
||||
active_power_usage = 300
|
||||
|
||||
var/busy = FALSE
|
||||
var/busy_icon_state
|
||||
|
||||
var/obj/item/mod/control/mod_unit = /obj/item/mod/control/pre_equipped/prototype
|
||||
|
||||
COOLDOWN_DECLARE(message_cooldown)
|
||||
|
||||
/obj/machinery/mod_installer/Initialize(mapload)
|
||||
. = ..()
|
||||
occupant_typecache = typecacheof(/mob/living/carbon/human)
|
||||
if(ispath(mod_unit))
|
||||
mod_unit = new mod_unit()
|
||||
|
||||
/obj/machinery/mod_installer/Destroy()
|
||||
QDEL_NULL(mod_unit)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/mod_installer/proc/set_busy(status, working_icon)
|
||||
busy = status
|
||||
busy_icon_state = working_icon
|
||||
update_appearance()
|
||||
|
||||
/obj/machinery/mod_installer/proc/play_install_sound()
|
||||
playsound(src, 'sound/items/rped.ogg', 30, FALSE)
|
||||
|
||||
/obj/machinery/mod_installer/update_icon_state()
|
||||
icon_state = busy ? busy_icon_state : "[base_icon_state][state_open ? "_open" : null]"
|
||||
return ..()
|
||||
|
||||
/obj/machinery/mod_installer/update_overlays()
|
||||
var/list/overlays = ..()
|
||||
if(machine_stat & (NOPOWER|BROKEN))
|
||||
return overlays
|
||||
overlays += busy ? "red" : "green"
|
||||
return overlays
|
||||
|
||||
/obj/machinery/mod_installer/proc/start_process()
|
||||
if(machine_stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
if(!occupant || !mod_unit || busy)
|
||||
return
|
||||
set_busy(TRUE, "[initial(icon_state)]_raising")
|
||||
addtimer(CALLBACK(src, .proc/set_busy, TRUE, "[initial(icon_state)]_active"), 2.5 SECONDS)
|
||||
addtimer(CALLBACK(src, .proc/play_install_sound), 2.5 SECONDS)
|
||||
addtimer(CALLBACK(src, .proc/set_busy, TRUE, "[initial(icon_state)]_falling"), 5 SECONDS)
|
||||
addtimer(CALLBACK(src, .proc/complete_process), 7.5 SECONDS)
|
||||
|
||||
/obj/machinery/mod_installer/proc/complete_process()
|
||||
set_busy(FALSE)
|
||||
var/mob/living/carbon/human/human_occupant = occupant
|
||||
if(!istype(human_occupant))
|
||||
return
|
||||
if(!human_occupant.dropItemToGround(human_occupant.back))
|
||||
return
|
||||
if(!human_occupant.equip_to_slot_if_possible(mod_unit, mod_unit.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE))
|
||||
return
|
||||
human_occupant.update_action_buttons(TRUE)
|
||||
playsound(src, 'sound/machines/ping.ogg', 30, FALSE)
|
||||
if(!human_occupant.dropItemToGround(human_occupant.wear_suit) || !human_occupant.dropItemToGround(human_occupant.head))
|
||||
open_machine()
|
||||
return
|
||||
mod_unit.quick_activation()
|
||||
open_machine()
|
||||
|
||||
/obj/machinery/mod_installer/open_machine()
|
||||
if(state_open)
|
||||
return FALSE
|
||||
..()
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/mod_installer/close_machine(mob/living/carbon/user)
|
||||
if(!state_open)
|
||||
return FALSE
|
||||
..()
|
||||
addtimer(CALLBACK(src, .proc/start_process), 1 SECONDS)
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/mod_installer/relaymove(mob/living/user, direction)
|
||||
var/message
|
||||
if(busy)
|
||||
message = "it won't budge!"
|
||||
else if(user.stat != CONSCIOUS)
|
||||
message = "you don't have the energy!"
|
||||
if(!isnull(message))
|
||||
if (COOLDOWN_FINISHED(src, message_cooldown))
|
||||
COOLDOWN_START(src, message_cooldown, 5 SECONDS)
|
||||
balloon_alert(user, message)
|
||||
return
|
||||
open_machine()
|
||||
|
||||
/obj/machinery/mod_installer/interact(mob/user)
|
||||
if(state_open)
|
||||
close_machine(null, user)
|
||||
return
|
||||
else if(busy)
|
||||
balloon_alert(user, "it's locked!")
|
||||
return
|
||||
open_machine()
|
||||
|
||||
@@ -120,7 +120,6 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th
|
||||
var/holder_var_amount = 20 //same. The amount adjusted with the mob's var when the spell is used
|
||||
|
||||
var/clothes_req = TRUE //see if it requires clothes
|
||||
var/cult_req = FALSE //SPECIAL SNOWFLAKE clothes required for cult only spells
|
||||
var/human_req = FALSE //spell can only be cast by humans
|
||||
var/nonabstract_req = FALSE //spell can only be cast by mobs that are physical entities
|
||||
var/stat_allowed = FALSE //see if it requires being conscious/alive, need to set to 1 for ghostpells
|
||||
@@ -198,27 +197,19 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th
|
||||
|
||||
var/mob/living/carbon/human/H = user
|
||||
|
||||
var/static/list/casting_clothes = typecacheof(list(/obj/item/clothing/suit/wizrobe,
|
||||
/obj/item/clothing/suit/space/hardsuit/wizard,
|
||||
/obj/item/clothing/head/wizard,
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/wizard,
|
||||
/obj/item/clothing/suit/space/hardsuit/shielded/wizard,
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/shielded/wizard))
|
||||
|
||||
var/static/list/casting_clothes = typecacheof(list(/obj/item/clothing/suit/wizrobe, /obj/item/clothing/head/wizard))
|
||||
if(clothes_req) //clothes check
|
||||
if(!is_type_in_typecache(H.wear_suit, casting_clothes))
|
||||
var/passes_req = FALSE
|
||||
if(istype(H.back, /obj/item/mod/control))
|
||||
var/obj/item/mod/control/mod = H.back
|
||||
if(istype(mod.theme, /datum/mod_theme/enchanted))
|
||||
passes_req = TRUE
|
||||
if(!passes_req && !is_type_in_typecache(H.wear_suit, casting_clothes))
|
||||
to_chat(H, span_warning("You don't feel strong enough without your robe!"))
|
||||
return FALSE
|
||||
if(!is_type_in_typecache(H.head, casting_clothes))
|
||||
if(!passes_req && !is_type_in_typecache(H.head, casting_clothes))
|
||||
to_chat(H, span_warning("You don't feel strong enough without your hat!"))
|
||||
return FALSE
|
||||
if(cult_req) //CULT_REQ CLOTHES CHECK
|
||||
if(!istype(H.wear_suit, /obj/item/clothing/suit/magusred) && !istype(H.wear_suit, /obj/item/clothing/suit/space/hardsuit/cult))
|
||||
to_chat(H, span_warning("You don't feel strong enough without your armor."))
|
||||
return FALSE
|
||||
if(!istype(H.head, /obj/item/clothing/head/magus) && !istype(H.head, /obj/item/clothing/head/helmet/space/hardsuit/cult))
|
||||
to_chat(H, span_warning("You don't feel strong enough without your helmet."))
|
||||
return FALSE
|
||||
else
|
||||
if(clothes_req || human_req)
|
||||
to_chat(user, span_warning("This spell can only be cast by humans!"))
|
||||
@@ -595,11 +586,6 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th
|
||||
else
|
||||
VV_DROPDOWN_OPTION(VV_HK_SPELL_UNSET_ROBELESS, "Unset Robeless")
|
||||
|
||||
if(cult_req)
|
||||
VV_DROPDOWN_OPTION(VV_HK_SPELL_SET_CULT, "Set Cult Robeless")
|
||||
else
|
||||
VV_DROPDOWN_OPTION(VV_HK_SPELL_UNSET_CULT, "Unset Cult Robeless")
|
||||
|
||||
if(human_req)
|
||||
VV_DROPDOWN_OPTION(VV_HK_SPELL_UNSET_HUMANONLY, "Unset Require Humanoid Mob")
|
||||
else
|
||||
@@ -618,12 +604,6 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th
|
||||
if(href_list[VV_HK_SPELL_UNSET_ROBELESS])
|
||||
clothes_req = TRUE
|
||||
return
|
||||
if(href_list[VV_HK_SPELL_SET_CULT])
|
||||
cult_req = FALSE
|
||||
return
|
||||
if(href_list[VV_HK_SPELL_UNSET_CULT])
|
||||
cult_req = TRUE
|
||||
return
|
||||
if(href_list[VV_HK_SPELL_UNSET_HUMANONLY])
|
||||
human_req = FALSE
|
||||
return
|
||||
|
||||
@@ -74,7 +74,6 @@ GLOBAL_LIST_INIT(summoned_magic, list(
|
||||
/obj/item/gun/magic/staff/door,
|
||||
/obj/item/scrying,
|
||||
/obj/item/warpwhistle,
|
||||
/obj/item/clothing/suit/space/hardsuit/shielded/wizard,
|
||||
/obj/item/immortality_talisman,
|
||||
/obj/item/melee/ghost_sword))
|
||||
|
||||
@@ -89,7 +88,6 @@ GLOBAL_LIST_INIT(summoned_special_magic, list(
|
||||
//everything above except for single use spellbooks, because they are counted separately (and are for basic bitches anyways)
|
||||
GLOBAL_LIST_INIT(summoned_magic_objectives, list(
|
||||
/obj/item/antag_spawner/contract,
|
||||
/obj/item/clothing/suit/space/hardsuit/shielded/wizard,
|
||||
/obj/item/gun/magic,
|
||||
/obj/item/immortality_talisman,
|
||||
/obj/item/melee/ghost_sword,
|
||||
|
||||
@@ -247,5 +247,5 @@
|
||||
else
|
||||
uniform.adjusted = DIGITIGRADE_STYLE
|
||||
leg_owner.update_inv_w_uniform()
|
||||
if(leg_owner.shoes && !swap_back)
|
||||
if(leg_owner.shoes && !(leg_owner.shoes.item_flags & IGNORE_DIGITIGRADE) && !swap_back)
|
||||
leg_owner.dropItemToGround(leg_owner.shoes)
|
||||
|
||||
@@ -155,15 +155,17 @@
|
||||
on = TRUE
|
||||
ion_trail.start()
|
||||
RegisterSignal(owner, COMSIG_MOVABLE_MOVED, .proc/move_react)
|
||||
owner.add_movespeed_modifier(/datum/movespeed_modifier/jetpack/cybernetic)
|
||||
RegisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE, .proc/pre_move_react)
|
||||
RegisterSignal(owner, COMSIG_MOVABLE_SPACEMOVE, .proc/spacemove_react)
|
||||
owner.add_movespeed_modifier(/datum/movespeed_modifier/jetpack/cybernetic)
|
||||
if(!silent)
|
||||
to_chat(owner, span_notice("You turn your thrusters set on."))
|
||||
else
|
||||
ion_trail.stop()
|
||||
UnregisterSignal(owner, COMSIG_MOVABLE_MOVED)
|
||||
owner.remove_movespeed_modifier(/datum/movespeed_modifier/jetpack/cybernetic)
|
||||
UnregisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE)
|
||||
UnregisterSignal(owner, COMSIG_MOVABLE_SPACEMOVE)
|
||||
owner.remove_movespeed_modifier(/datum/movespeed_modifier/jetpack/cybernetic)
|
||||
if(!silent)
|
||||
to_chat(owner, span_notice("You turn your thrusters set off."))
|
||||
on = FALSE
|
||||
@@ -194,6 +196,12 @@
|
||||
SIGNAL_HANDLER
|
||||
ion_trail.oldposition = get_turf(owner)
|
||||
|
||||
/obj/item/organ/cyberimp/chest/thrusters/proc/spacemove_react(mob/user, movement_dir)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
if(on && movement_dir)
|
||||
return COMSIG_MOVABLE_STOP_SPACEMOVE
|
||||
|
||||
/obj/item/organ/cyberimp/chest/thrusters/proc/allow_thrust(num)
|
||||
if(!owner)
|
||||
return FALSE
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user