This commit is contained in:
Fikou
2021-12-24 21:00:24 +01:00
committed by GitHub
parent fc5c9e2900
commit 7b38dd4ff7
191 changed files with 6749 additions and 2189 deletions
-1
View File
@@ -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
+23 -17
View File
@@ -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")
+12 -4
View File
@@ -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()
+10 -4
View File
@@ -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()
+1 -2
View File
@@ -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."
+2 -2
View File
@@ -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
+12
View File
@@ -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)
+3 -7
View File
@@ -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)
+4 -5
View File
@@ -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
+2 -3
View File
@@ -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)
+64 -58
View File
@@ -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
+3 -5
View File
@@ -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,
-3
View File
@@ -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
*
+18 -4
View File
@@ -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
-17
View File
@@ -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."
+41
View File
@@ -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."
-80
View File
@@ -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()
-34
View File
@@ -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)
+16 -15
View File
@@ -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
+5 -3
View File
@@ -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
+4 -3
View File
@@ -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
+26 -21
View File
@@ -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)
+30 -28
View File
@@ -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
+1 -2
View File
@@ -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),
+10 -2
View File
@@ -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)
+1 -1
View File
@@ -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)
+5 -8
View File
@@ -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
+3 -3
View File
@@ -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))
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
/**
+1 -1
View File
@@ -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)
+4 -8
View File
@@ -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
+71
View File
@@ -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
+217
View File
@@ -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
+88
View File
@@ -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
+123
View File
@@ -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
+278
View File
@@ -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
+559
View File
@@ -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)
+854
View File
@@ -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,
),
),
)
+157
View File
@@ -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)
+80
View File
@@ -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
+252
View File
@@ -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
+4
View File
@@ -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
+1 -1
View File
@@ -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 ..()
+6 -6
View File
@@ -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"
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+113
View File
@@ -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
+123 -6
View File
@@ -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()
+8 -28
View File
@@ -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,
+1 -1
View File
@@ -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)
+10 -2
View File
@@ -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