mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-11 02:34:00 +00:00
Exosuit Modular Internals, The Squeakening
This commit is contained in:
@@ -41,3 +41,11 @@
|
||||
|
||||
// 5 10 20 40 80 160
|
||||
// 10 40 160 640 2560
|
||||
|
||||
// Defines for Exosuit components.
|
||||
|
||||
#define MECH_HULL "Hull"
|
||||
#define MECH_ACTUATOR "Actuator"
|
||||
#define MECH_ARMOR "Plating"
|
||||
#define MECH_GAS "Life Support"
|
||||
#define MECH_ELECTRIC "Firmware"
|
||||
|
||||
@@ -33,6 +33,12 @@
|
||||
path =/obj/item/ammo_casing/a12g/stunshell
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/arms/flechetteshell
|
||||
name = "ammunition (flechette cartridge, shotgun)"
|
||||
path =/obj/item/ammo_casing/a12g/flechette
|
||||
hidden = 1
|
||||
man_rating = 2
|
||||
|
||||
//////////////////
|
||||
/*Ammo magazines*/
|
||||
//////////////////
|
||||
@@ -64,6 +70,18 @@
|
||||
name = "pistol magazine (.45 flash)"
|
||||
path =/obj/item/ammo_magazine/m45/flash
|
||||
|
||||
/datum/category_item/autolathe/arms/pistol_45ap
|
||||
name = "pistol magazine (.45 armor piercing)"
|
||||
path =/obj/item/ammo_magazine/m45/ap
|
||||
hidden = 1
|
||||
resources = list(DEFAULT_WALL_MATERIAL = 500, MAT_PLASTEEL = 300)
|
||||
|
||||
/datum/category_item/autolathe/arms/pistol_45hp
|
||||
name = "pistol magazine (.45 hollowpoint)"
|
||||
path =/obj/item/ammo_magazine/m45/hp
|
||||
hidden = 1
|
||||
resources = list(DEFAULT_WALL_MATERIAL = 500, MAT_PLASTIC = 200)
|
||||
|
||||
/datum/category_item/autolathe/arms/pistol_45uzi
|
||||
name = "uzi magazine (.45)"
|
||||
path =/obj/item/ammo_magazine/m45uzi
|
||||
@@ -138,6 +156,12 @@
|
||||
name = "top-mounted SMG magazine (9mm flash)"
|
||||
path =/obj/item/ammo_magazine/m9mmt/flash
|
||||
|
||||
/datum/category_item/autolathe/arms/smg_9mmap
|
||||
name = "top-mounted SMG magazine (9mm armor piercing)"
|
||||
path =/obj/item/ammo_magazine/m9mmt/ap
|
||||
hidden = 1
|
||||
man_rating = 2
|
||||
|
||||
/////// 10mm
|
||||
/datum/category_item/autolathe/arms/smg_10mm
|
||||
name = "SMG magazine (10mm)"
|
||||
|
||||
@@ -71,6 +71,7 @@ var/datum/category_collection/autolathe/autolathe_recipes
|
||||
var/is_stack // Creates multiple of an item if applied to non-stack items
|
||||
var/max_stack
|
||||
var/no_scale
|
||||
var/man_rating = 0
|
||||
|
||||
/datum/category_item/autolathe/dd_SortValue()
|
||||
return name
|
||||
@@ -98,6 +98,18 @@
|
||||
is_stack = TRUE
|
||||
no_scale = TRUE //prevents material duplication exploits
|
||||
|
||||
/datum/category_item/autolathe/general/plasteel
|
||||
name = "plasteel sheets"
|
||||
path =/obj/item/stack/material/plasteel
|
||||
is_stack = TRUE
|
||||
no_scale = TRUE //prevents material duplication exploits
|
||||
|
||||
/datum/category_item/autolathe/general/plastic
|
||||
name = "plastic sheets"
|
||||
path =/obj/item/stack/material/plastic
|
||||
is_stack = TRUE
|
||||
no_scale = TRUE //prevents material duplication exploits
|
||||
|
||||
//TFF 24/12/19 - Let people print more spray bottles if needed.
|
||||
/datum/category_item/autolathe/general/spraybottle
|
||||
name = "spray bottle"
|
||||
@@ -133,6 +145,19 @@
|
||||
name = "maglight"
|
||||
path =/obj/item/device/flashlight/maglight
|
||||
|
||||
<<<<<<< HEAD
|
||||
=======
|
||||
/datum/category_item/autolathe/general/ecigcartridge
|
||||
name = "ecigarette cartridge"
|
||||
path = /obj/item/weapon/reagent_containers/ecig_cartridge/blank
|
||||
|
||||
/datum/category_item/autolathe/general/idcard
|
||||
name = "ID Card"
|
||||
path = /obj/item/weapon/card/id
|
||||
resources = list(DEFAULT_WALL_MATERIAL = 100, MAT_GLASS = 100, MAT_PLASTIC = 300)
|
||||
man_rating = 2
|
||||
|
||||
>>>>>>> 282b42d... Exosuit Modular Internals, The Squeakening (#7329)
|
||||
/datum/category_item/autolathe/general/handcuffs
|
||||
name = "handcuffs"
|
||||
path =/obj/item/weapon/handcuffs
|
||||
|
||||
@@ -12,8 +12,8 @@
|
||||
|
||||
circuit = /obj/item/weapon/circuitboard/autolathe
|
||||
var/datum/category_collection/autolathe/machine_recipes
|
||||
var/list/stored_material = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0)
|
||||
var/list/storage_capacity = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0)
|
||||
var/list/stored_material = list(DEFAULT_WALL_MATERIAL = 0, MAT_GLASS = 0, MAT_PLASTEEL = 0, MAT_PLASTIC = 0)
|
||||
var/list/storage_capacity = list(DEFAULT_WALL_MATERIAL = 0, MAT_GLASS = 0, MAT_PLASTEEL = 0, MAT_PLASTIC = 0)
|
||||
var/datum/category_group/autolathe/current_category
|
||||
|
||||
var/hacked = 0
|
||||
@@ -26,6 +26,9 @@
|
||||
|
||||
var/datum/wires/autolathe/wires = null
|
||||
|
||||
var/mb_rating = 0
|
||||
var/man_rating = 0
|
||||
|
||||
var/filtertext
|
||||
|
||||
/obj/machinery/autolathe/Initialize()
|
||||
@@ -64,6 +67,9 @@
|
||||
var/list/material_bottom = list("<tr>")
|
||||
|
||||
for(var/material in stored_material)
|
||||
if(material != DEFAULT_WALL_MATERIAL && material != MAT_GLASS) // Don't show the Extras unless people care enough to put them in.
|
||||
if(stored_material[material] <= 0)
|
||||
continue
|
||||
material_top += "<td width = '25%' align = center><b>[material]</b></td>"
|
||||
material_bottom += "<td width = '25%' align = center>[stored_material[material]]<b>/[storage_capacity[material]]</b></td>"
|
||||
|
||||
@@ -72,7 +78,9 @@
|
||||
dat += "<h2>Printable Designs</h2><h3>Showing: <a href='?src=\ref[src];change_category=1'>[current_category]</a>.</h3></center><table width = '100%'>"
|
||||
|
||||
for(var/datum/category_item/autolathe/R in current_category.items)
|
||||
if(R.hidden && !hacked)
|
||||
if(R.hidden && !hacked) // Illegal or nonstandard.
|
||||
continue
|
||||
if(R.man_rating > man_rating) // Advanced parts.
|
||||
continue
|
||||
if(filtertext && findtext(R.name, filtertext) == 0)
|
||||
continue
|
||||
@@ -311,14 +319,16 @@
|
||||
//Updates overall lathe storage size.
|
||||
/obj/machinery/autolathe/RefreshParts()
|
||||
..()
|
||||
var/mb_rating = 0
|
||||
var/man_rating = 0
|
||||
mb_rating = 0
|
||||
man_rating = 0
|
||||
for(var/obj/item/weapon/stock_parts/matter_bin/MB in component_parts)
|
||||
mb_rating += MB.rating
|
||||
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
|
||||
man_rating += M.rating
|
||||
|
||||
storage_capacity[DEFAULT_WALL_MATERIAL] = mb_rating * 25000
|
||||
storage_capacity[MAT_PLASTIC] = mb_rating * 20000
|
||||
storage_capacity[MAT_PLASTEEL] = mb_rating * 16250
|
||||
storage_capacity["glass"] = mb_rating * 12500
|
||||
build_time = 50 / man_rating
|
||||
mat_efficiency = 1.1 - man_rating * 0.1// Normally, price is 1.25 the amount of material, so this shouldn't go higher than 0.6. Maximum rating of parts is 5
|
||||
|
||||
@@ -17,6 +17,14 @@
|
||||
max_special_equip = 1
|
||||
cargo_capacity = 1
|
||||
|
||||
starting_components = list(
|
||||
/obj/item/mecha_parts/component/hull/durable,
|
||||
/obj/item/mecha_parts/component/actuator,
|
||||
/obj/item/mecha_parts/component/armor/reinforced,
|
||||
/obj/item/mecha_parts/component/gas,
|
||||
/obj/item/mecha_parts/component/electrical
|
||||
)
|
||||
|
||||
/*
|
||||
/obj/mecha/combat/range_action(target as obj|mob|turf)
|
||||
if(internal_damage&MECHA_INT_CONTROL_LOST)
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
initial_icon = "durand"
|
||||
step_in = 4
|
||||
dir_in = 1 //Facing North.
|
||||
health = 400
|
||||
maxhealth = 400 //Don't forget to update the /old variant if you change this number.
|
||||
health = 300
|
||||
maxhealth = 300 //Don't forget to update the /old variant if you change this number.
|
||||
deflect_chance = 20
|
||||
damage_absorption = list("brute"=0.5,"fire"=1.1,"bullet"=0.65,"laser"=0.85,"energy"=0.9,"bomb"=0.8)
|
||||
max_temperature = 30000
|
||||
@@ -23,6 +23,14 @@
|
||||
max_universal_equip = 1
|
||||
max_special_equip = 1
|
||||
|
||||
starting_components = list(
|
||||
/obj/item/mecha_parts/component/hull/durable,
|
||||
/obj/item/mecha_parts/component/actuator,
|
||||
/obj/item/mecha_parts/component/armor/military,
|
||||
/obj/item/mecha_parts/component/gas,
|
||||
/obj/item/mecha_parts/component/electrical
|
||||
)
|
||||
|
||||
defence_mode_possible = 1
|
||||
|
||||
/*
|
||||
@@ -73,5 +81,5 @@
|
||||
/obj/mecha/combat/durand/old/New()
|
||||
..()
|
||||
health = 25
|
||||
maxhealth = 350 //Just slightly worse.
|
||||
maxhealth = 250 //Just slightly worse.
|
||||
cell.charge = rand(0, (cell.charge/2))
|
||||
@@ -5,8 +5,8 @@
|
||||
initial_icon = "gygax"
|
||||
step_in = 3
|
||||
dir_in = 1 //Facing North.
|
||||
health = 300
|
||||
maxhealth = 300 //Don't forget to update the /old variant if you change this number.
|
||||
health = 250
|
||||
maxhealth = 250 //Don't forget to update the /old variant if you change this number.
|
||||
deflect_chance = 15
|
||||
damage_absorption = list("brute"=0.75,"fire"=1,"bullet"=0.8,"laser"=0.7,"energy"=0.85,"bomb"=1)
|
||||
max_temperature = 25000
|
||||
@@ -21,6 +21,14 @@
|
||||
max_universal_equip = 1
|
||||
max_special_equip = 1
|
||||
|
||||
starting_components = list(
|
||||
/obj/item/mecha_parts/component/hull/lightweight,
|
||||
/obj/item/mecha_parts/component/actuator,
|
||||
/obj/item/mecha_parts/component/armor/marshal,
|
||||
/obj/item/mecha_parts/component/gas,
|
||||
/obj/item/mecha_parts/component/electrical
|
||||
)
|
||||
|
||||
overload_possible = 1
|
||||
|
||||
//Not quite sure how to move those yet.
|
||||
@@ -58,17 +66,12 @@
|
||||
max_universal_equip = 1
|
||||
max_special_equip = 2
|
||||
|
||||
/obj/mecha/combat/gygax/dark/Initialize()
|
||||
..()
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/grenade/clusterbang
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/teleporter
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay
|
||||
ME.attach(src)
|
||||
return
|
||||
starting_equipment = list(
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot,
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/grenade/clusterbang,
|
||||
/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay,
|
||||
/obj/item/mecha_parts/mecha_equipment/teleporter
|
||||
)
|
||||
|
||||
/obj/mecha/combat/gygax/dark/add_cell(var/obj/item/weapon/cell/C=null)
|
||||
if(C)
|
||||
@@ -101,6 +104,14 @@
|
||||
max_universal_equip = 1
|
||||
max_special_equip = 1
|
||||
|
||||
starting_components = list(
|
||||
/obj/item/mecha_parts/component/hull,
|
||||
/obj/item/mecha_parts/component/actuator,
|
||||
/obj/item/mecha_parts/component/armor/lightweight,
|
||||
/obj/item/mecha_parts/component/gas,
|
||||
/obj/item/mecha_parts/component/electrical
|
||||
)
|
||||
|
||||
var/obj/item/clothing/glasses/hud/health/mech/hud
|
||||
|
||||
/obj/mecha/combat/gygax/serenity/New()
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
icon_state = "marauder"
|
||||
initial_icon = "marauder"
|
||||
step_in = 5
|
||||
health = 500
|
||||
maxhealth = 500 //Don't forget to update the /old variant if you change this number.
|
||||
health = 350
|
||||
maxhealth = 350 //Don't forget to update the /old variant if you change this number.
|
||||
deflect_chance = 25
|
||||
damage_absorption = list("brute"=0.5,"fire"=0.7,"bullet"=0.45,"laser"=0.6,"energy"=0.7,"bomb"=0.7)
|
||||
max_temperature = 60000
|
||||
@@ -29,6 +29,21 @@
|
||||
zoom_possible = 1
|
||||
thrusters_possible = 1
|
||||
|
||||
starting_components = list(
|
||||
/obj/item/mecha_parts/component/hull/durable,
|
||||
/obj/item/mecha_parts/component/actuator,
|
||||
/obj/item/mecha_parts/component/armor/military,
|
||||
/obj/item/mecha_parts/component/gas,
|
||||
/obj/item/mecha_parts/component/electrical
|
||||
)
|
||||
|
||||
starting_equipment = list(
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse,
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/explosive,
|
||||
/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay,
|
||||
/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster
|
||||
)
|
||||
|
||||
/obj/mecha/combat/marauder/seraph
|
||||
desc = "Heavy-duty, command-type exosuit. This is a custom model, utilized only by high-ranking military personnel."
|
||||
name = "Seraph"
|
||||
@@ -37,12 +52,20 @@
|
||||
initial_icon = "seraph"
|
||||
operation_req_access = list(access_cent_creed)
|
||||
step_in = 3
|
||||
health = 550
|
||||
health = 450
|
||||
wreckage = /obj/effect/decal/mecha_wreckage/seraph
|
||||
internal_damage_threshold = 20
|
||||
force = 55
|
||||
max_equip = 5
|
||||
|
||||
starting_equipment = list(
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot,
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/explosive,
|
||||
/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay,
|
||||
/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster,
|
||||
/obj/item/mecha_parts/mecha_equipment/teleporter
|
||||
)
|
||||
|
||||
//Note that is the Mauler
|
||||
/obj/mecha/combat/marauder/mauler
|
||||
desc = "Heavy-duty, combat exosuit, developed off of the existing Marauder model."
|
||||
@@ -53,40 +76,6 @@
|
||||
wreckage = /obj/effect/decal/mecha_wreckage/mauler
|
||||
mech_faction = MECH_FACTION_SYNDI
|
||||
|
||||
//Note that is the default Marauder
|
||||
/obj/mecha/combat/marauder/Initialize()
|
||||
..()
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/explosive
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src)
|
||||
ME.attach(src)
|
||||
return
|
||||
|
||||
//Note that this is the seraph.
|
||||
/obj/mecha/combat/marauder/seraph/Initialize()
|
||||
..()//Let it equip whatever is needed.
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME
|
||||
if(equipment.len)//Now to remove it and equip anew.
|
||||
for(ME in equipment)
|
||||
ME.detach()
|
||||
qdel(ME)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/explosive(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/teleporter(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src)
|
||||
ME.attach(src)
|
||||
return
|
||||
|
||||
|
||||
//I'll break this down later
|
||||
/obj/mecha/combat/marauder/relaymove(mob/user,direction)
|
||||
if(user != src.occupant) //While not "realistic", this piece is player friendly.
|
||||
@@ -150,17 +139,10 @@
|
||||
/obj/mecha/combat/marauder/old
|
||||
desc = "Heavy-duty, combat exosuit, developed after the Durand model. Rarely found among civilian populations. This one is particularly worn looking and likely isn't as sturdy."
|
||||
|
||||
starting_equipment = null
|
||||
|
||||
/obj/mecha/combat/marauder/old/New()
|
||||
..()
|
||||
health = 25
|
||||
maxhealth = 400 //Just slightly worse.
|
||||
maxhealth = 300 //Just slightly worse.
|
||||
cell.charge = rand(0, (cell.charge/2))
|
||||
|
||||
/obj/mecha/combat/marauder/old/Initialize()
|
||||
..()
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME
|
||||
if(equipment.len)
|
||||
for(ME in equipment)
|
||||
ME.detach()
|
||||
qdel(ME)
|
||||
return
|
||||
@@ -25,15 +25,24 @@
|
||||
max_universal_equip = 3
|
||||
max_special_equip = 4
|
||||
|
||||
phasing_possible = 1
|
||||
switch_dmg_type_possible = 1
|
||||
starting_components = list(
|
||||
/obj/item/mecha_parts/component/hull/durable,
|
||||
/obj/item/mecha_parts/component/actuator,
|
||||
/obj/item/mecha_parts/component/armor/alien,
|
||||
/obj/item/mecha_parts/component/gas,
|
||||
/obj/item/mecha_parts/component/electrical
|
||||
)
|
||||
|
||||
cloak_possible = TRUE
|
||||
phasing_possible = TRUE
|
||||
switch_dmg_type_possible = TRUE
|
||||
|
||||
/obj/mecha/combat/phazon/equipped/Initialize()
|
||||
..()
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tool/rcd
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/gravcatapult
|
||||
ME.attach(src)
|
||||
starting_equipment = list(
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/rcd,
|
||||
/obj/item/mecha_parts/mecha_equipment/gravcatapult
|
||||
)
|
||||
return
|
||||
|
||||
/* Leaving this until we are really sure we don't need it for reference.
|
||||
@@ -95,8 +104,9 @@
|
||||
max_universal_equip = 2
|
||||
max_special_equip = 2
|
||||
|
||||
phasing_possible = 1
|
||||
switch_dmg_type_possible = 1
|
||||
phasing_possible = TRUE
|
||||
switch_dmg_type_possible = TRUE
|
||||
cloak_possible = FALSE
|
||||
|
||||
/obj/mecha/combat/phazon/janus/take_damage(amount, type="brute")
|
||||
..()
|
||||
|
||||
155
code/game/mecha/components/_component.dm
Normal file
155
code/game/mecha/components/_component.dm
Normal file
@@ -0,0 +1,155 @@
|
||||
|
||||
/obj/item/mecha_parts/component
|
||||
name = "mecha component"
|
||||
icon = 'icons/mecha/mech_component.dmi'
|
||||
icon_state = "component"
|
||||
w_class = ITEMSIZE_HUGE
|
||||
origin_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2)
|
||||
|
||||
var/component_type = null
|
||||
|
||||
var/obj/mecha/chassis = null
|
||||
var/start_damaged = FALSE
|
||||
|
||||
var/emp_resistance = 0 // Amount of emp 'levels' removed.
|
||||
|
||||
var/list/required_type = null // List, if it exists. Exosuits meant to use the component (Unique var changes / effects)
|
||||
|
||||
var/integrity
|
||||
var/integrity_danger_mod = 0.5 // Multiplier for comparison to max_integrity before problems start.
|
||||
var/max_integrity = 100
|
||||
|
||||
var/step_delay = 0
|
||||
|
||||
var/relative_size = 30 // Percent chance for the component to be hit.
|
||||
|
||||
var/internal_damage_flag // If set, the component will toggle the flag on or off if it is destroyed / severely damaged.
|
||||
|
||||
/obj/item/mecha_parts/component/examine(mob/user)
|
||||
. = ..()
|
||||
var/show_integrity = round(integrity/max_integrity*100, 0.1)
|
||||
switch(show_integrity)
|
||||
if(85 to 100)
|
||||
. += "It's fully intact."
|
||||
if(65 to 85)
|
||||
. += "It's slightly damaged."
|
||||
if(45 to 65)
|
||||
. += "<span class='notice'>It's badly damaged.</span>"
|
||||
if(25 to 45)
|
||||
. += "<span class='warning'>It's heavily damaged.</span>"
|
||||
if(2 to 25)
|
||||
. += "<span class='warning'><b>It's falling apart.</b></span>"
|
||||
if(0 to 1)
|
||||
. += "<span class='warning'><b>It is completely destroyed.</b></span>"
|
||||
|
||||
/obj/item/mecha_parts/component/Initialize()
|
||||
..()
|
||||
integrity = max_integrity
|
||||
|
||||
if(start_damaged)
|
||||
integrity = round(integrity * integrity_danger_mod)
|
||||
|
||||
/obj/item/mecha_parts/component/Destroy()
|
||||
detach()
|
||||
return ..()
|
||||
|
||||
// Damage code.
|
||||
|
||||
/obj/item/mecha_parts/component/emp_act(var/severity = 4)
|
||||
if(severity + emp_resistance > 4)
|
||||
return
|
||||
|
||||
severity = clamp(severity + emp_resistance, 1, 4)
|
||||
|
||||
take_damage((4 - severity) * round(integrity * 0.1, 0.1))
|
||||
|
||||
/obj/item/mecha_parts/component/proc/adjust_integrity(var/amt = 0)
|
||||
integrity = clamp(integrity + amt, 0, max_integrity)
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/component/proc/damage_part(var/dam_amt = 0, var/type = BRUTE)
|
||||
if(dam_amt <= 0)
|
||||
return FALSE
|
||||
|
||||
adjust_integrity(-1 * dam_amt)
|
||||
|
||||
if(chassis && internal_damage_flag)
|
||||
if(get_efficiency() < 0.5)
|
||||
chassis.check_for_internal_damage(list(internal_damage_flag), TRUE)
|
||||
|
||||
return TRUE
|
||||
|
||||
/obj/item/mecha_parts/component/proc/get_efficiency()
|
||||
var/integ_limit = round(max_integrity * integrity_danger_mod)
|
||||
|
||||
if(integrity < integ_limit)
|
||||
var/int_percent = round(integrity / integ_limit, 0.1)
|
||||
|
||||
return int_percent
|
||||
|
||||
return 1
|
||||
|
||||
// Attach/Detach code.
|
||||
|
||||
/obj/item/mecha_parts/component/proc/attach(var/obj/mecha/target, var/mob/living/user)
|
||||
if(target)
|
||||
if(!(component_type in target.internal_components))
|
||||
if(user)
|
||||
to_chat(user, "<span class='notice'>\The [target] doesn't seem to have anywhere to put \the [src].</span>")
|
||||
return FALSE
|
||||
if(target.internal_components[component_type])
|
||||
if(user)
|
||||
to_chat(user, "<span class='notice'>\The [target] already has a [component_type] installed!</span>")
|
||||
return FALSE
|
||||
chassis = target
|
||||
if(user)
|
||||
user.drop_from_inventory(src)
|
||||
forceMove(target)
|
||||
|
||||
if(internal_damage_flag)
|
||||
if(integrity > (max_integrity * integrity_danger_mod))
|
||||
if(chassis.hasInternalDamage(internal_damage_flag))
|
||||
chassis.clearInternalDamage(internal_damage_flag)
|
||||
|
||||
else
|
||||
chassis.check_for_internal_damage(list(internal_damage_flag))
|
||||
|
||||
chassis.internal_components[component_type] = src
|
||||
|
||||
if(user)
|
||||
chassis.visible_message("<span class='notice'>[user] installs \the [src] in \the [chassis].</span>")
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/item/mecha_parts/component/proc/detach()
|
||||
if(chassis)
|
||||
chassis.internal_components[component_type] = null
|
||||
|
||||
if(internal_damage_flag && chassis.hasInternalDamage(internal_damage_flag)) // If the module has been removed, it's kind of unfair to keep it causing problems by being damaged. It's nonfunctional either way.
|
||||
chassis.clearInternalDamage(internal_damage_flag)
|
||||
|
||||
forceMove(get_turf(chassis))
|
||||
chassis = null
|
||||
return TRUE
|
||||
|
||||
|
||||
/obj/item/mecha_parts/component/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(istype(W,/obj/item/stack/nanopaste))
|
||||
var/obj/item/stack/nanopaste/NP = W
|
||||
|
||||
if(integrity < max_integrity)
|
||||
while(integrity < max_integrity && NP)
|
||||
if(do_after(user, 1 SECOND, src) && NP.use(1))
|
||||
adjust_integrity(10)
|
||||
|
||||
return
|
||||
|
||||
return ..()
|
||||
|
||||
// Various procs to handle different calls by Exosuits. IE, movement actions, damage actions, etc.
|
||||
|
||||
/obj/item/mecha_parts/component/proc/get_step_delay()
|
||||
return step_delay
|
||||
|
||||
/obj/item/mecha_parts/component/proc/handle_move()
|
||||
return
|
||||
37
code/game/mecha/components/actuators.dm
Normal file
37
code/game/mecha/components/actuators.dm
Normal file
@@ -0,0 +1,37 @@
|
||||
|
||||
/obj/item/mecha_parts/component/actuator
|
||||
name = "mecha actuator"
|
||||
icon = 'icons/mecha/mech_component.dmi'
|
||||
icon_state = "motor"
|
||||
w_class = ITEMSIZE_HUGE
|
||||
origin_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2)
|
||||
|
||||
component_type = MECH_ACTUATOR
|
||||
|
||||
start_damaged = FALSE
|
||||
|
||||
emp_resistance = 1
|
||||
|
||||
required_type = null // List, if it exists. Exosuits meant to use the component.
|
||||
|
||||
integrity_danger_mod = 0.6 // Multiplier for comparison to max_integrity before problems start.
|
||||
max_integrity = 50
|
||||
|
||||
internal_damage_flag = MECHA_INT_CONTROL_LOST
|
||||
|
||||
var/strafing_multiplier = 1.5
|
||||
|
||||
/obj/item/mecha_parts/component/actuator/get_step_delay()
|
||||
return step_delay
|
||||
|
||||
/obj/item/mecha_parts/component/actuator/hispeed
|
||||
name = "overclocked mecha actuator"
|
||||
|
||||
step_delay = -1
|
||||
|
||||
emp_resistance = -1
|
||||
|
||||
integrity_danger_mod = 0.7
|
||||
max_integrity = 60
|
||||
|
||||
strafing_multiplier = 1.2
|
||||
238
code/game/mecha/components/armor.dm
Normal file
238
code/game/mecha/components/armor.dm
Normal file
@@ -0,0 +1,238 @@
|
||||
|
||||
/obj/item/mecha_parts/component/armor
|
||||
name = "mecha plating"
|
||||
icon = 'icons/mecha/mech_component.dmi'
|
||||
icon_state = "armor"
|
||||
w_class = ITEMSIZE_HUGE
|
||||
origin_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 2)
|
||||
|
||||
component_type = MECH_ARMOR
|
||||
|
||||
start_damaged = FALSE
|
||||
|
||||
emp_resistance = 4
|
||||
|
||||
required_type = null // List, if it exists. Exosuits meant to use the component.
|
||||
|
||||
integrity_danger_mod = 0.4 // Multiplier for comparison to max_integrity before problems start.
|
||||
max_integrity = 120
|
||||
|
||||
internal_damage_flag = MECHA_INT_TEMP_CONTROL
|
||||
|
||||
step_delay = 1
|
||||
|
||||
var/deflect_chance = 10
|
||||
var/list/damage_absorption = list(
|
||||
"brute"= 0.8,
|
||||
"fire"= 1.2,
|
||||
"bullet"= 0.9,
|
||||
"laser"= 1,
|
||||
"energy"= 1,
|
||||
"bomb"= 1,
|
||||
"bio"= 1,
|
||||
"rad"= 1
|
||||
)
|
||||
|
||||
var/damage_minimum = 10
|
||||
var/minimum_penetration = 0
|
||||
var/fail_penetration_value = 0.66
|
||||
|
||||
/obj/item/mecha_parts/component/armor/mining
|
||||
name = "blast-resistant mecha plating"
|
||||
|
||||
step_delay = 2
|
||||
max_integrity = 80
|
||||
|
||||
damage_absorption = list(
|
||||
"brute"=0.8,
|
||||
"fire"=0.8,
|
||||
"bullet"=1.2,
|
||||
"laser"=1.2,
|
||||
"energy"=1,
|
||||
"bomb"=0.5,
|
||||
"bio"=1,
|
||||
"rad"=1
|
||||
)
|
||||
|
||||
/obj/item/mecha_parts/component/armor/lightweight
|
||||
name = "lightweight mecha plating"
|
||||
|
||||
max_integrity = 50
|
||||
step_delay = 0
|
||||
|
||||
damage_absorption = list(
|
||||
"brute"=1,
|
||||
"fire"=1.4,
|
||||
"bullet"=1.1,
|
||||
"laser"=1.2,
|
||||
"energy"=1,
|
||||
"bomb"=1,
|
||||
"bio"=1,
|
||||
"rad"=1
|
||||
)
|
||||
|
||||
/obj/item/mecha_parts/component/armor/reinforced
|
||||
name = "reinforced mecha plating"
|
||||
|
||||
step_delay = 4
|
||||
|
||||
max_integrity = 80
|
||||
|
||||
minimum_penetration = 10
|
||||
|
||||
damage_absorption = list(
|
||||
"brute"=0.7,
|
||||
"fire"=1,
|
||||
"bullet"=0.7,
|
||||
"laser"=0.85,
|
||||
"energy"=1,
|
||||
"bomb"=0.8
|
||||
)
|
||||
|
||||
/obj/item/mecha_parts/component/armor/military
|
||||
name = "military grade mecha plating"
|
||||
|
||||
step_delay = 6
|
||||
|
||||
max_integrity = 100
|
||||
|
||||
emp_resistance = 2
|
||||
|
||||
required_type = list(/obj/mecha/combat)
|
||||
|
||||
damage_minimum = 15
|
||||
minimum_penetration = 25
|
||||
|
||||
damage_absorption = list(
|
||||
"brute"=0.5,
|
||||
"fire"=1.1,
|
||||
"bullet"=0.65,
|
||||
"laser"=0.85,
|
||||
"energy"=0.9,
|
||||
"bomb"=0.8
|
||||
)
|
||||
|
||||
/obj/item/mecha_parts/component/armor/military/attach(var/obj/mecha/target, var/mob/living/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
var/typepass = FALSE
|
||||
for(var/type in required_type)
|
||||
if(istype(chassis, type))
|
||||
typepass = TRUE
|
||||
|
||||
if(typepass)
|
||||
step_delay = 3
|
||||
else
|
||||
step_delay = initial(step_delay)
|
||||
|
||||
/obj/item/mecha_parts/component/armor/marshal
|
||||
name = "marshal mecha plating"
|
||||
|
||||
step_delay = 5
|
||||
|
||||
max_integrity = 100
|
||||
|
||||
emp_resistance = 3
|
||||
|
||||
deflect_chance = 15
|
||||
|
||||
minimum_penetration = 10
|
||||
|
||||
required_type = list(/obj/mecha/combat)
|
||||
|
||||
damage_absorption = list(
|
||||
"brute"=0.75,
|
||||
"fire"=1,
|
||||
"bullet"=0.8,
|
||||
"laser"=0.7,
|
||||
"energy"=0.85,
|
||||
"bomb"=1
|
||||
)
|
||||
|
||||
/obj/item/mecha_parts/component/armor/marshal/attach(var/obj/mecha/target, var/mob/living/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
var/typepass = FALSE
|
||||
for(var/type in required_type)
|
||||
if(istype(chassis, type))
|
||||
typepass = TRUE
|
||||
|
||||
if(typepass)
|
||||
step_delay = 2
|
||||
else
|
||||
step_delay = initial(step_delay)
|
||||
|
||||
/obj/item/mecha_parts/component/armor/marshal/reinforced
|
||||
name = "blackops mecha plating"
|
||||
|
||||
step_delay = 5
|
||||
|
||||
damage_absorption = list(
|
||||
"brute"=0.6,
|
||||
"fire"=0.8,
|
||||
"bullet"=0.6,
|
||||
"laser"=0.5,
|
||||
"energy"=0.65,
|
||||
"bomb"=0.8
|
||||
)
|
||||
|
||||
/obj/item/mecha_parts/component/armor/military/marauder
|
||||
name = "cutting edge mecha plating"
|
||||
|
||||
step_delay = 4
|
||||
|
||||
max_integrity = 150
|
||||
|
||||
emp_resistance = 3
|
||||
|
||||
required_type = list(/obj/mecha/combat/marauder)
|
||||
|
||||
deflect_chance = 25
|
||||
damage_minimum = 30
|
||||
minimum_penetration = 25
|
||||
|
||||
damage_absorption = list(
|
||||
"brute"=0.5,
|
||||
"fire"=0.7,
|
||||
"bullet"=0.45,
|
||||
"laser"=0.6,
|
||||
"energy"=0.7,
|
||||
"bomb"=0.7
|
||||
)
|
||||
|
||||
/obj/item/mecha_parts/component/armor/military/marauder/attach(var/obj/mecha/target, var/mob/living/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
var/typepass = FALSE
|
||||
for(var/type in required_type)
|
||||
if(istype(chassis, type))
|
||||
typepass = TRUE
|
||||
|
||||
if(typepass)
|
||||
step_delay = 1
|
||||
else
|
||||
step_delay = initial(step_delay)
|
||||
|
||||
/obj/item/mecha_parts/component/armor/alien
|
||||
name = "strange mecha plating"
|
||||
step_delay = 3
|
||||
damage_absorption = list(
|
||||
"brute"=0.7,
|
||||
"fire"=0.7,
|
||||
"bullet"=0.7,
|
||||
"laser"=0.7,
|
||||
"energy"=0.7,
|
||||
"bomb"=0.7
|
||||
)
|
||||
|
||||
/obj/item/mecha_parts/component/armor/alien/attach(var/obj/mecha/target, var/mob/living/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
if(istype(target, /obj/mecha/combat/phazon/janus))
|
||||
step_delay = -1
|
||||
|
||||
else if(istype(target, /obj/mecha/combat/phazon))
|
||||
step_delay = -3
|
||||
|
||||
else
|
||||
step_delay = initial(step_delay)
|
||||
31
code/game/mecha/components/electrical.dm
Normal file
31
code/game/mecha/components/electrical.dm
Normal file
@@ -0,0 +1,31 @@
|
||||
|
||||
/obj/item/mecha_parts/component/electrical
|
||||
name = "mecha electrical harness"
|
||||
icon = 'icons/mecha/mech_component.dmi'
|
||||
icon_state = "board"
|
||||
w_class = ITEMSIZE_HUGE
|
||||
origin_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2)
|
||||
|
||||
component_type = MECH_ELECTRIC
|
||||
|
||||
emp_resistance = 1
|
||||
|
||||
integrity_danger_mod = 0.4
|
||||
max_integrity = 40
|
||||
|
||||
step_delay = 0
|
||||
|
||||
relative_size = 20
|
||||
|
||||
internal_damage_flag = MECHA_INT_SHORT_CIRCUIT
|
||||
|
||||
var/charge_cost_mod = 1
|
||||
|
||||
/obj/item/mecha_parts/component/electrical/high_current
|
||||
name = "efficient mecha electrical harness"
|
||||
|
||||
emp_resistance = 0
|
||||
max_integrity = 30
|
||||
|
||||
relative_size = 10
|
||||
charge_cost_mod = 0.6
|
||||
33
code/game/mecha/components/hull.dm
Normal file
33
code/game/mecha/components/hull.dm
Normal file
@@ -0,0 +1,33 @@
|
||||
|
||||
/obj/item/mecha_parts/component/hull
|
||||
name = "mecha hull"
|
||||
icon = 'icons/mecha/mech_component.dmi'
|
||||
icon_state = "hull"
|
||||
w_class = ITEMSIZE_HUGE
|
||||
origin_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2)
|
||||
|
||||
component_type = MECH_HULL
|
||||
|
||||
emp_resistance = 0 // Amount of emp 'levels' removed.
|
||||
|
||||
required_type = null // List, if it exists. Exosuits meant to use the component.
|
||||
|
||||
integrity_danger_mod = 0.5 // Multiplier for comparison to max_integrity before problems start.
|
||||
max_integrity = 50
|
||||
|
||||
internal_damage_flag = MECHA_INT_FIRE
|
||||
|
||||
step_delay = 2
|
||||
|
||||
/obj/item/mecha_parts/component/hull/durable
|
||||
name = "durable mecha hull"
|
||||
|
||||
step_delay = 4
|
||||
integrity_danger_mod = 0.3
|
||||
max_integrity = 100
|
||||
|
||||
/obj/item/mecha_parts/component/hull/lightweight
|
||||
name = "lightweight mecha hull"
|
||||
|
||||
step_delay = 1
|
||||
integrity_danger_mod = 0.3
|
||||
28
code/game/mecha/components/lifesupport.dm
Normal file
28
code/game/mecha/components/lifesupport.dm
Normal file
@@ -0,0 +1,28 @@
|
||||
|
||||
/obj/item/mecha_parts/component/gas
|
||||
name = "mecha life-support"
|
||||
icon = 'icons/mecha/mech_component.dmi'
|
||||
icon_state = "lifesupport"
|
||||
w_class = ITEMSIZE_HUGE
|
||||
origin_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2)
|
||||
|
||||
component_type = MECH_GAS
|
||||
|
||||
emp_resistance = 1
|
||||
|
||||
integrity_danger_mod = 0.4
|
||||
max_integrity = 40
|
||||
|
||||
step_delay = 0
|
||||
|
||||
relative_size = 20
|
||||
|
||||
internal_damage_flag = MECHA_INT_TANK_BREACH
|
||||
|
||||
/obj/item/mecha_parts/component/gas/reinforced
|
||||
name = "reinforced mecha life-support"
|
||||
|
||||
emp_resistance = 2
|
||||
max_integrity = 80
|
||||
|
||||
relative_size = 40
|
||||
@@ -28,6 +28,8 @@
|
||||
var/ready_sound = 'sound/mecha/mech_reload_default.ogg' //Sound to play once the fire delay passed.
|
||||
var/enable_special = FALSE // Will the tool do its special?
|
||||
|
||||
var/step_delay = 0 // Does the component slow/speed up the suit?
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/proc/do_after_cooldown(target=1)
|
||||
sleep(equip_cooldown)
|
||||
set_ready_state(1)
|
||||
@@ -273,3 +275,6 @@
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/proc/MoveAction() //Allows mech equipment to do an action upon the mech moving
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/proc/get_step_delay() // Equipment returns its slowdown or speedboost.
|
||||
return step_delay
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
var/deflect_coeff = 1.15
|
||||
var/damage_coeff = 0.8
|
||||
|
||||
step_delay = 1
|
||||
|
||||
equip_type = EQUIP_HULL
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster/get_equip_info()
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
var/deflect_coeff = 1.15
|
||||
var/damage_coeff = 0.8
|
||||
|
||||
step_delay = 2
|
||||
|
||||
equip_type = EQUIP_HULL
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster/handle_projectile_contact(var/obj/item/projectile/Proj, var/inc_damage)
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
var/icon/droid_overlay
|
||||
var/list/repairable_damage = list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH)
|
||||
|
||||
step_delay = 1
|
||||
|
||||
equip_type = EQUIP_HULL
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/repair_droid/New()
|
||||
@@ -79,8 +81,23 @@
|
||||
RD.chassis.clearInternalDamage(int_dam_flag)
|
||||
repaired = 1
|
||||
break
|
||||
if(health_boost<0 || RD.chassis.health < initial(RD.chassis.health))
|
||||
|
||||
var/obj/item/mecha_parts/component/AC = RD.chassis.internal_components[MECH_ARMOR]
|
||||
var/obj/item/mecha_parts/component/HC = RD.chassis.internal_components[MECH_HULL]
|
||||
|
||||
var/damaged_armor = AC.integrity < AC.max_integrity
|
||||
|
||||
var/damaged_hull = HC.integrity < HC.max_integrity
|
||||
|
||||
if(health_boost<0 || RD.chassis.health < initial(RD.chassis.health) || damaged_armor || damaged_hull)
|
||||
RD.chassis.health += min(health_boost, initial(RD.chassis.health)-RD.chassis.health)
|
||||
|
||||
if(AC)
|
||||
AC.adjust_integrity(round(health_boost * 0.5, 0.5))
|
||||
|
||||
if(HC)
|
||||
HC.adjust_integrity(round(health_boost * 0.5, 0.5))
|
||||
|
||||
repaired = 1
|
||||
if(repaired)
|
||||
if(RD.chassis.use_power(RD.energy_drain))
|
||||
|
||||
@@ -7,6 +7,8 @@
|
||||
energy_drain = 20
|
||||
range = 0
|
||||
|
||||
step_delay = 1
|
||||
|
||||
var/obj/item/shield_projector/line/exosuit/my_shield = null
|
||||
var/my_shield_type = /obj/item/shield_projector/line/exosuit
|
||||
var/icon/drone_overlay
|
||||
@@ -66,9 +68,11 @@
|
||||
my_shield.attack_self(chassis.occupant)
|
||||
if(my_shield.active)
|
||||
set_ready_state(0)
|
||||
step_delay = 4
|
||||
log_message("Activated.")
|
||||
else
|
||||
set_ready_state(1)
|
||||
step_delay = 1
|
||||
log_message("Deactivated.")
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/combat_shield/Topic(href, href_list)
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
energy_drain = OMNI_SHIELD_DRAIN
|
||||
range = 0
|
||||
|
||||
step_delay = 1
|
||||
|
||||
var/obj/item/shield_projector/shields = null
|
||||
var/shield_type = /obj/item/shield_projector/rectangle/mecha
|
||||
|
||||
@@ -42,9 +44,11 @@
|
||||
shields.set_on(!shields.active)
|
||||
if(shields.active)
|
||||
set_ready_state(0)
|
||||
step_delay = 4
|
||||
log_message("Activated.")
|
||||
else
|
||||
set_ready_state(1)
|
||||
step_delay = 1
|
||||
log_message("Deactivated.")
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/omni_shield/Topic(href, href_list)
|
||||
|
||||
@@ -7,6 +7,9 @@
|
||||
|
||||
equip_type = EQUIP_HULL
|
||||
|
||||
var/slowdown_multiplier = 0.75 // How much does the exosuit multiply its slowdown by if it's the proper type?
|
||||
|
||||
/*
|
||||
/obj/item/mecha_parts/mecha_equipment/speedboost/attach(obj/mecha/M as obj)
|
||||
..()
|
||||
if(enable_special)
|
||||
@@ -14,6 +17,13 @@
|
||||
else
|
||||
chassis.step_in = 6 // Improper parts slow the mech down
|
||||
return
|
||||
*/
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/speedboost/get_step_delay()
|
||||
if(enable_special)
|
||||
return -1
|
||||
else
|
||||
return 3
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/speedboost/detach()
|
||||
chassis.step_in = initial(chassis.step_in)
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
projectile = /obj/item/projectile/arc/fragmentation/mortar
|
||||
projectile_energy_cost = 600
|
||||
|
||||
step_delay = 2
|
||||
|
||||
origin_tech = list(TECH_MATERIAL = 4, TECH_COMBAT = 5, TECH_ILLEGAL = 3)
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/mortar/action_checks(atom/target)
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
deviation = 0.7
|
||||
projectile_energy_cost = 25
|
||||
|
||||
step_delay = 2
|
||||
|
||||
origin_tech = list(TECH_MATERIAL = 3, TECH_COMBAT = 4)
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot/rigged
|
||||
|
||||
@@ -52,6 +52,8 @@
|
||||
projectile = /obj/item/projectile/beam/heavylaser
|
||||
fire_sound = 'sound/weapons/lasercannonfire.ogg'
|
||||
|
||||
step_delay = 2
|
||||
|
||||
origin_tech = list(TECH_MATERIAL = 3, TECH_COMBAT = 4, TECH_MAGNET = 4)
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy/rigged
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
var/missile_speed = 2
|
||||
var/missile_range = 30
|
||||
|
||||
step_delay = 2
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/Fire(atom/movable/AM, atom/target, turf/aimloc)
|
||||
AM.throw_at(target,missile_range, missile_speed, chassis)
|
||||
|
||||
@@ -19,6 +21,8 @@
|
||||
missile_range = 15
|
||||
required_type = /obj/mecha //Why restrict it to just mining or combat mechs?
|
||||
|
||||
step_delay = 0
|
||||
|
||||
equip_type = EQUIP_UTILITY
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flare/Fire(atom/movable/AM, atom/target, turf/aimloc)
|
||||
|
||||
@@ -7,6 +7,8 @@
|
||||
|
||||
energy_drain = 30
|
||||
|
||||
step_delay = 2
|
||||
|
||||
projectile = /obj/item/projectile/bullet/incendiary/flamethrower/large
|
||||
fire_sound = 'sound/weapons/towelwipe.ogg'
|
||||
|
||||
|
||||
@@ -16,3 +16,5 @@
|
||||
projectile_energy_cost = 40
|
||||
fire_cooldown = 3
|
||||
origin_tech = list(TECH_MATERIAL = 4, TECH_COMBAT = 5, TECH_PHORON = 2, TECH_ILLEGAL = 1)
|
||||
|
||||
step_delay = 1
|
||||
|
||||
@@ -12,6 +12,8 @@
|
||||
var/auto_rearm = 0 //Does the weapon reload itself after each shot?
|
||||
required_type = list(/obj/mecha/combat, /obj/mecha/working/hoverpod/combatpod)
|
||||
|
||||
step_delay = 1
|
||||
|
||||
equip_type = EQUIP_WEAPON
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/action_checks(atom/target)
|
||||
|
||||
@@ -7,6 +7,11 @@
|
||||
#define MELEE 1
|
||||
#define RANGED 2
|
||||
|
||||
#define MECHA_OPERATING 0
|
||||
#define MECHA_BOLTS_SECURED 1
|
||||
#define MECHA_PANEL_LOOSE 2
|
||||
#define MECHA_CELL_OPEN 3
|
||||
#define MECHA_CELL_OUT 4
|
||||
|
||||
#define MECH_FACTION_NT "nano"
|
||||
#define MECH_FACTION_SYNDI "syndi"
|
||||
@@ -48,7 +53,7 @@
|
||||
var/fail_penetration_value = 0.66 //By how much failing to penetrate reduces your shit. 66% by default.
|
||||
|
||||
var/obj/item/weapon/cell/cell
|
||||
var/state = 0
|
||||
var/state = MECHA_OPERATING
|
||||
var/list/log = new
|
||||
var/last_message = 0
|
||||
var/add_req_access = 1
|
||||
@@ -108,6 +113,24 @@
|
||||
var/max_universal_equip = 2
|
||||
var/max_special_equip = 1
|
||||
|
||||
var/list/starting_equipment = null // List containing starting tools.
|
||||
|
||||
// Mech Components, similar to Cyborg, but Bigger.
|
||||
var/list/internal_components = list(
|
||||
MECH_HULL = null,
|
||||
MECH_ACTUATOR = null,
|
||||
MECH_ARMOR = null,
|
||||
MECH_GAS = null,
|
||||
MECH_ELECTRIC = null
|
||||
)
|
||||
var/list/starting_components = list(
|
||||
/obj/item/mecha_parts/component/hull,
|
||||
/obj/item/mecha_parts/component/actuator,
|
||||
/obj/item/mecha_parts/component/armor,
|
||||
/obj/item/mecha_parts/component/gas,
|
||||
/obj/item/mecha_parts/component/electrical
|
||||
)
|
||||
|
||||
//Working exosuit vars
|
||||
var/list/cargo = list()
|
||||
var/cargo_capacity = 3
|
||||
@@ -148,6 +171,8 @@
|
||||
var/smoke_cooldown = 100 //How long you have between uses.
|
||||
var/datum/effect/effect/system/smoke_spread/smoke_system = new
|
||||
|
||||
var/cloak_possible = FALSE // Can this exosuit innately cloak?
|
||||
|
||||
////All of those are for the HUD buttons in the top left. See Grant and Remove procs in mecha_actions.
|
||||
|
||||
var/datum/action/innate/mecha/mech_eject/eject_action = new
|
||||
@@ -164,10 +189,20 @@
|
||||
var/datum/action/innate/mecha/mech_cycle_equip/cycle_action = new
|
||||
var/datum/action/innate/mecha/mech_switch_damtype/switch_damtype_action = new
|
||||
var/datum/action/innate/mecha/mech_toggle_phasing/phasing_action = new
|
||||
var/datum/action/innate/mecha/mech_toggle_cloaking/cloak_action = new
|
||||
|
||||
var/weapons_only_cycle = FALSE //So combat mechs don't switch to their equipment at times.
|
||||
/obj/mecha/Initialize()
|
||||
..()
|
||||
|
||||
for(var/path in starting_components)
|
||||
var/obj/item/mecha_parts/component/C = new path(src)
|
||||
C.attach(src)
|
||||
|
||||
if(starting_equipment && LAZYLEN(starting_equipment))
|
||||
for(var/path in starting_equipment)
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new path(src)
|
||||
ME.attach(src)
|
||||
|
||||
/obj/mecha/drain_power(var/drain_check)
|
||||
|
||||
@@ -245,6 +280,15 @@
|
||||
else
|
||||
E.forceMove(loc)
|
||||
E.destroy()
|
||||
|
||||
for(var/slot in internal_components)
|
||||
var/obj/item/mecha_parts/component/C = internal_components[slot]
|
||||
if(istype(C))
|
||||
C.damage_part(rand(10, 20))
|
||||
C.detach()
|
||||
WR.crowbar_salvage += C
|
||||
C.forceMove(WR)
|
||||
|
||||
if(cell)
|
||||
WR.crowbar_salvage += cell
|
||||
cell.forceMove(WR)
|
||||
@@ -256,6 +300,11 @@
|
||||
for(var/obj/item/mecha_parts/mecha_equipment/E in equipment)
|
||||
E.detach(loc)
|
||||
E.destroy()
|
||||
for(var/slot in internal_components)
|
||||
var/obj/item/mecha_parts/component/C = internal_components[slot]
|
||||
if(istype(C))
|
||||
C.detach()
|
||||
qdel(C)
|
||||
if(cell)
|
||||
qdel(cell)
|
||||
if(internal_tank)
|
||||
@@ -351,6 +400,26 @@
|
||||
|
||||
/obj/mecha/examine(mob/user)
|
||||
. = ..()
|
||||
|
||||
var/obj/item/mecha_parts/component/armor/AC = internal_components[MECH_ARMOR]
|
||||
|
||||
var/obj/item/mecha_parts/component/hull/HC = internal_components[MECH_HULL]
|
||||
|
||||
if(AC)
|
||||
. += "It has [AC] attached. [AC.get_efficiency()<0.5?"It is severely damaged.":""]"
|
||||
else
|
||||
. += "It has no armor plating."
|
||||
|
||||
if(HC)
|
||||
if(!AC || AC.get_efficiency() < 0.7)
|
||||
. += "It has [HC] attached. [HC.get_efficiency()<0.5?"It is severely damaged.":""]"
|
||||
else
|
||||
. += "You cannot tell what type of hull it has."
|
||||
|
||||
else
|
||||
. += "It does not seem to have a completed hull."
|
||||
|
||||
|
||||
var/integrity = health/initial(health)*100
|
||||
switch(integrity)
|
||||
if(85 to 100)
|
||||
@@ -536,6 +605,12 @@
|
||||
user.forceMove(get_turf(src))
|
||||
to_chat(user, "You climb out from [src]")
|
||||
return 0
|
||||
|
||||
var/obj/item/mecha_parts/component/hull/HC = internal_components[MECH_HULL]
|
||||
if(!HC)
|
||||
occupant_message("<span class='notice'>You can't operate an exosuit that doesn't have a hull!</span>")
|
||||
return
|
||||
|
||||
if(connected_port)
|
||||
if(world.time - last_message > 20)
|
||||
src.occupant_message("<span class='warning'>Unable to move while connected to the air system port</span>")
|
||||
@@ -562,6 +637,44 @@
|
||||
|
||||
return call((proc_res["dyndomove"]||src), "dyndomove")(direction)
|
||||
|
||||
/obj/mecha/proc/get_step_delay()
|
||||
var/tally = 0
|
||||
|
||||
if(overload)
|
||||
tally = min(1, round(step_in/2))
|
||||
|
||||
for(var/slot in internal_components)
|
||||
var/obj/item/mecha_parts/component/C = internal_components[slot]
|
||||
if(C && C.get_step_delay())
|
||||
tally += C.get_step_delay()
|
||||
|
||||
for(var/obj/item/mecha_parts/mecha_equipment/ME in equipment)
|
||||
if(ME.get_step_delay())
|
||||
tally += ME.get_step_delay()
|
||||
|
||||
var/obj/item/mecha_parts/component/actuator/actuator = internal_components[MECH_ACTUATOR]
|
||||
|
||||
if(!actuator) // Relying purely on hydraulic pumps. You're going nowhere fast.
|
||||
tally = 2 SECONDS
|
||||
|
||||
return tally
|
||||
|
||||
tally += 0.5 SECONDS * (1 - actuator.get_efficiency()) // Damaged actuators run slower, slowing as damage increases beyond its threshold.
|
||||
|
||||
if(strafing)
|
||||
tally = round(tally * actuator.strafing_multiplier)
|
||||
|
||||
for(var/obj/item/mecha_parts/mecha_equipment/ME in equipment)
|
||||
if(istype(ME, /obj/item/mecha_parts/mecha_equipment/speedboost))
|
||||
var/obj/item/mecha_parts/mecha_equipment/speedboost/SB = ME
|
||||
for(var/path in ME.required_type)
|
||||
if(istype(src, path))
|
||||
tally = round(tally * SB.slowdown_multiplier)
|
||||
break
|
||||
break
|
||||
|
||||
return max(1, round(tally))
|
||||
|
||||
/obj/mecha/proc/dyndomove(direction)
|
||||
if(!can_move)
|
||||
return 0
|
||||
@@ -600,7 +713,6 @@
|
||||
health--
|
||||
if(health < initial(health) - initial(health)/3)
|
||||
overload = 0
|
||||
step_in = initial(step_in)
|
||||
step_energy_drain = initial(step_energy_drain)
|
||||
src.occupant_message("<font color='red'>Leg actuators damage threshold exceded. Disabling overload.</font>")
|
||||
|
||||
@@ -656,7 +768,7 @@
|
||||
if(!src.check_for_support())
|
||||
src.pr_inertial_movement.start(list(src,direction))
|
||||
src.log_message("<span class='warning'>Movement control lost. Inertial movement started.</span>")
|
||||
if(do_after(step_in))
|
||||
if(do_after(get_step_delay()))
|
||||
can_move = 1
|
||||
return 1
|
||||
return 0
|
||||
@@ -708,7 +820,7 @@
|
||||
flick("[initial_icon]-phase", src)
|
||||
src.loc = get_step(src,src.dir)
|
||||
src.use_power(phasing_energy_drain)
|
||||
sleep(step_in*3)
|
||||
sleep(get_step_delay() * 3)
|
||||
can_phase = TRUE
|
||||
occupant_message("Phazed.")
|
||||
. = ..(obstacle)
|
||||
@@ -785,16 +897,57 @@
|
||||
update_damage_alerts()
|
||||
if(amount)
|
||||
var/damage = absorbDamage(amount,type)
|
||||
|
||||
damage = components_handle_damage(damage,type)
|
||||
|
||||
health -= damage
|
||||
|
||||
update_health()
|
||||
log_append_to_last("Took [damage] points of damage. Damage type: \"[type]\".",1)
|
||||
return
|
||||
|
||||
/obj/mecha/proc/components_handle_damage(var/damage, var/type = BRUTE)
|
||||
var/obj/item/mecha_parts/component/armor/AC = internal_components[MECH_ARMOR]
|
||||
|
||||
if(AC)
|
||||
var/armor_efficiency = AC.get_efficiency()
|
||||
var/damage_change = armor_efficiency * (damage * 0.5) * AC.damage_absorption[type]
|
||||
AC.damage_part(damage_change, type)
|
||||
damage -= damage_change
|
||||
|
||||
var/obj/item/mecha_parts/component/hull/HC = internal_components[MECH_HULL]
|
||||
|
||||
if(HC)
|
||||
if(HC.integrity)
|
||||
var/hull_absorb = round(rand(5, 10) / 10, 0.1) * damage
|
||||
HC.damage_part(hull_absorb, type)
|
||||
damage -= hull_absorb
|
||||
|
||||
for(var/obj/item/mecha_parts/component/C in (internal_components - list(MECH_HULL, MECH_ARMOR)))
|
||||
if(prob(C.relative_size))
|
||||
var/damage_part_amt = round(damage / 4, 0.1)
|
||||
C.damage_part(damage_part_amt)
|
||||
damage -= damage_part_amt
|
||||
|
||||
return damage
|
||||
|
||||
/obj/mecha/proc/get_damage_absorption()
|
||||
var/obj/item/mecha_parts/component/armor/AC = internal_components[MECH_ARMOR]
|
||||
|
||||
if(!istype(AC))
|
||||
return
|
||||
|
||||
else
|
||||
if(AC.get_efficiency() > 0.25)
|
||||
return AC.damage_absorption
|
||||
|
||||
return
|
||||
|
||||
/obj/mecha/proc/absorbDamage(damage,damage_type)
|
||||
return call((proc_res["dynabsorbdamage"]||src), "dynabsorbdamage")(damage,damage_type)
|
||||
|
||||
/obj/mecha/proc/dynabsorbdamage(damage,damage_type)
|
||||
return damage*(listgetindex(damage_absorption,damage_type) || 1)
|
||||
return damage*(listgetindex(get_damage_absorption(),damage_type) || 1)
|
||||
|
||||
/obj/mecha/airlock_crush(var/crush_damage)
|
||||
..()
|
||||
@@ -818,10 +971,20 @@
|
||||
user.setClickCooldown(user.get_attack_speed())
|
||||
src.log_message("Attack by hand/paw. Attacker - [user].",1)
|
||||
|
||||
var/obj/item/mecha_parts/component/armor/ArmC = internal_components[MECH_ARMOR]
|
||||
|
||||
var/temp_deflect_chance = deflect_chance
|
||||
|
||||
if(!ArmC)
|
||||
temp_deflect_chance = 1
|
||||
|
||||
else
|
||||
temp_deflect_chance = round(ArmC.get_efficiency() * ArmC.deflect_chance + (defence_mode ? 25 : 0))
|
||||
|
||||
if(istype(user,/mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(H.species.can_shred(user))
|
||||
if(!prob(src.deflect_chance))
|
||||
if(!prob(temp_deflect_chance))
|
||||
src.take_damage(15) //The take_damage() proc handles armor values
|
||||
if(prob(25)) //Why would they get free internal damage. At least make it a bit RNG.
|
||||
src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
|
||||
@@ -838,7 +1001,7 @@
|
||||
user.visible_message("<span class='danger'>\The [user] hits \the [src]. Nothing happens.</span>","<span class='danger'>You hit \the [src] with no visible effect.</span>")
|
||||
src.log_append_to_last("Armor saved.")
|
||||
return
|
||||
else if ((HULK in user.mutations) && !prob(src.deflect_chance))
|
||||
else if ((HULK in user.mutations) && !prob(temp_deflect_chance))
|
||||
src.take_damage(15) //The take_damage() proc handles armor values
|
||||
if(prob(25)) //Hulks punch hard but lets not give them consistent internal damage.
|
||||
src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
|
||||
@@ -856,11 +1019,30 @@
|
||||
|
||||
//I think this is relative to throws.
|
||||
/obj/mecha/proc/dynhitby(atom/movable/A)
|
||||
var/obj/item/mecha_parts/component/armor/ArmC = internal_components[MECH_ARMOR]
|
||||
|
||||
var/temp_deflect_chance = deflect_chance
|
||||
var/temp_damage_minimum = damage_minimum
|
||||
var/temp_minimum_penetration = minimum_penetration
|
||||
var/temp_fail_penetration_value = fail_penetration_value
|
||||
|
||||
if(!ArmC)
|
||||
temp_deflect_chance = 0
|
||||
temp_damage_minimum = 0
|
||||
temp_minimum_penetration = 0
|
||||
temp_fail_penetration_value = 1
|
||||
|
||||
else
|
||||
temp_deflect_chance = round(ArmC.get_efficiency() * ArmC.deflect_chance + (defence_mode ? 25 : 0))
|
||||
temp_damage_minimum = round(ArmC.get_efficiency() * ArmC.damage_minimum)
|
||||
temp_minimum_penetration = round(ArmC.get_efficiency() * ArmC.minimum_penetration)
|
||||
temp_fail_penetration_value = round(ArmC.get_efficiency() * ArmC.fail_penetration_value)
|
||||
|
||||
if(istype(A, /obj/item/mecha_parts/mecha_tracking))
|
||||
A.forceMove(src)
|
||||
src.visible_message("The [A] fastens firmly to [src].")
|
||||
return
|
||||
if(prob(src.deflect_chance) || istype(A, /mob))
|
||||
if(prob(temp_deflect_chance) || istype(A, /mob))
|
||||
src.occupant_message("<span class='notice'>\The [A] bounces off the armor.</span>")
|
||||
src.visible_message("\The [A] bounces off \the [src] armor")
|
||||
src.log_append_to_last("Armor saved.")
|
||||
@@ -873,18 +1055,18 @@
|
||||
|
||||
var/pass_damage = O.throwforce
|
||||
var/pass_damage_reduc_mod
|
||||
if(pass_damage <= damage_minimum)//Too little to go through.
|
||||
if(pass_damage <= temp_damage_minimum)//Too little to go through.
|
||||
src.occupant_message("<span class='notice'>\The [A] bounces off the armor.</span>")
|
||||
src.visible_message("\The [A] bounces off \the [src] armor")
|
||||
return
|
||||
|
||||
else if(O.armor_penetration < minimum_penetration) //If you don't have enough pen, you won't do full damage
|
||||
else if(O.armor_penetration < temp_minimum_penetration) //If you don't have enough pen, you won't do full damage
|
||||
src.occupant_message("<span class='notice'>\The [A] struggles to bypass \the [src] armor.</span>")
|
||||
src.visible_message("\The [A] struggles to bypass \the [src] armor")
|
||||
pass_damage_reduc_mod = fail_penetration_value //This will apply to reduce damage to 2/3 or 66% by default
|
||||
pass_damage_reduc_mod = temp_fail_penetration_value //This will apply to reduce damage to 2/3 or 66% by default
|
||||
else
|
||||
src.occupant_message("<span class='notice'>\The [A] manages to pierces \the [src] armor.</span>")
|
||||
src.visible_message("\The [A] manages to pierces \the [src] armor")
|
||||
src.occupant_message("<span class='notice'>\The [A] manages to pierce \the [src] armor.</span>")
|
||||
// src.visible_message("\The [A] manages to pierce \the [src] armor")
|
||||
pass_damage_reduc_mod = 1
|
||||
|
||||
|
||||
@@ -911,7 +1093,26 @@
|
||||
return
|
||||
|
||||
/obj/mecha/proc/dynbulletdamage(var/obj/item/projectile/Proj)
|
||||
if(prob(src.deflect_chance))
|
||||
var/obj/item/mecha_parts/component/armor/ArmC = internal_components[MECH_ARMOR]
|
||||
|
||||
var/temp_deflect_chance = deflect_chance
|
||||
var/temp_damage_minimum = damage_minimum
|
||||
var/temp_minimum_penetration = minimum_penetration
|
||||
var/temp_fail_penetration_value = fail_penetration_value
|
||||
|
||||
if(!ArmC)
|
||||
temp_deflect_chance = 0
|
||||
temp_damage_minimum = 0
|
||||
temp_minimum_penetration = 0
|
||||
temp_fail_penetration_value = 1
|
||||
|
||||
else
|
||||
temp_deflect_chance = round(ArmC.get_efficiency() * ArmC.deflect_chance + (defence_mode ? 25 : 0))
|
||||
temp_damage_minimum = round(ArmC.get_efficiency() * ArmC.damage_minimum)
|
||||
temp_minimum_penetration = round(ArmC.get_efficiency() * ArmC.minimum_penetration)
|
||||
temp_fail_penetration_value = round(ArmC.get_efficiency() * ArmC.fail_penetration_value)
|
||||
|
||||
if(prob(temp_deflect_chance))
|
||||
src.occupant_message("<span class='notice'>The armor deflects incoming projectile.</span>")
|
||||
src.visible_message("The [src.name] armor deflects the projectile")
|
||||
src.log_append_to_last("Armor saved.")
|
||||
@@ -930,19 +1131,19 @@
|
||||
for(var/obj/item/mecha_parts/mecha_equipment/ME in equipment)
|
||||
pass_damage = ME.handle_projectile_contact(Proj, pass_damage)
|
||||
|
||||
if(pass_damage < damage_minimum)//too pathetic to really damage you.
|
||||
if(pass_damage < temp_damage_minimum)//too pathetic to really damage you.
|
||||
src.occupant_message("<span class='notice'>The armor deflects incoming projectile.</span>")
|
||||
src.visible_message("The [src.name] armor deflects\the [Proj]")
|
||||
return
|
||||
|
||||
else if(Proj.armor_penetration < minimum_penetration) //If you don't have enough pen, you won't do full damage
|
||||
else if(Proj.armor_penetration < temp_minimum_penetration) //If you don't have enough pen, you won't do full damage
|
||||
src.occupant_message("<span class='notice'>\The [Proj] struggles to pierce \the [src] armor.</span>")
|
||||
src.visible_message("\The [Proj] struggles to pierce \the [src] armor")
|
||||
pass_damage_reduc_mod = fail_penetration_value //This will apply to reduce damage to 2/3 or 66% by default
|
||||
pass_damage_reduc_mod = temp_fail_penetration_value //This will apply to reduce damage to 2/3 or 66% by default
|
||||
|
||||
else //You go through completely because you use AP. Nice.
|
||||
src.occupant_message("<span class='notice'>\The [Proj] manages to pierce \the [src] armor.</span>")
|
||||
src.visible_message("\The [Proj] manages to pierce \the [src] armor")
|
||||
// src.visible_message("\The [Proj] manages to pierce \the [src] armor")
|
||||
pass_damage_reduc_mod = 1
|
||||
|
||||
pass_damage = (pass_damage_reduc_mod*pass_damage)//Apply damage reduction before usage.
|
||||
@@ -974,24 +1175,34 @@
|
||||
|
||||
//This refer to whenever you are caught in an explosion.
|
||||
/obj/mecha/ex_act(severity)
|
||||
var/obj/item/mecha_parts/component/armor/ArmC = internal_components[MECH_ARMOR]
|
||||
|
||||
var/temp_deflect_chance = deflect_chance
|
||||
|
||||
if(!ArmC)
|
||||
temp_deflect_chance = 0
|
||||
|
||||
else
|
||||
temp_deflect_chance = round(ArmC.get_efficiency() * ArmC.deflect_chance + (defence_mode ? 25 : 0))
|
||||
|
||||
src.log_message("Affected by explosion of severity: [severity].",1)
|
||||
if(prob(src.deflect_chance))
|
||||
if(prob(temp_deflect_chance))
|
||||
severity++
|
||||
src.log_append_to_last("Armor saved, changing severity to [severity].")
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
qdel(src)
|
||||
src.take_damage(initial(src.health), "bomb")
|
||||
if(2.0)
|
||||
if (prob(30))
|
||||
qdel(src)
|
||||
src.take_damage(initial(src.health), "bomb")
|
||||
else
|
||||
src.take_damage(initial(src.health)/2) //The take_damage() proc handles armor values
|
||||
src.take_damage(initial(src.health)/2, "bomb")
|
||||
src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),1)
|
||||
if(3.0)
|
||||
if (prob(5))
|
||||
qdel(src)
|
||||
else
|
||||
src.take_damage(initial(src.health)/5) //The take_damage() proc handles armor values
|
||||
src.take_damage(initial(src.health)/5, "bomb")
|
||||
src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),1)
|
||||
return
|
||||
|
||||
@@ -1038,20 +1249,39 @@
|
||||
src.log_message("Attacked by [W]. Attacker - [user]")
|
||||
var/pass_damage_reduc_mod //Modifer for failing to bring AP.
|
||||
|
||||
if(prob(src.deflect_chance)) //Does your attack get deflected outright.
|
||||
var/obj/item/mecha_parts/component/armor/ArmC = internal_components[MECH_ARMOR]
|
||||
|
||||
var/temp_deflect_chance = deflect_chance
|
||||
var/temp_damage_minimum = damage_minimum
|
||||
var/temp_minimum_penetration = minimum_penetration
|
||||
var/temp_fail_penetration_value = fail_penetration_value
|
||||
|
||||
if(!ArmC)
|
||||
temp_deflect_chance = 0
|
||||
temp_damage_minimum = 0
|
||||
temp_minimum_penetration = 0
|
||||
temp_fail_penetration_value = 1
|
||||
|
||||
else
|
||||
temp_deflect_chance = round(ArmC.get_efficiency() * ArmC.deflect_chance + (defence_mode ? 25 : 0))
|
||||
temp_damage_minimum = round(ArmC.get_efficiency() * ArmC.damage_minimum)
|
||||
temp_minimum_penetration = round(ArmC.get_efficiency() * ArmC.minimum_penetration)
|
||||
temp_fail_penetration_value = round(ArmC.get_efficiency() * ArmC.fail_penetration_value)
|
||||
|
||||
if(prob(temp_deflect_chance)) //Does your attack get deflected outright.
|
||||
src.occupant_message("<span class='notice'>\The [W] bounces off [src.name].</span>")
|
||||
to_chat(user, "<span class='danger'>\The [W] bounces off [src.name].</span>")
|
||||
src.log_append_to_last("Armor saved.")
|
||||
|
||||
else if(W.force < damage_minimum) //Is your attack too PATHETIC to do anything. 3 damage to a person shouldn't do anything to a mech.
|
||||
else if(W.force < temp_damage_minimum) //Is your attack too PATHETIC to do anything. 3 damage to a person shouldn't do anything to a mech.
|
||||
src.occupant_message("<span class='notice'>\The [W] bounces off the armor.</span>")
|
||||
src.visible_message("\The [W] bounces off \the [src] armor")
|
||||
return
|
||||
|
||||
else if(W.armor_penetration < minimum_penetration) //If you don't have enough pen, you won't do full damage
|
||||
else if(W.armor_penetration < temp_minimum_penetration) //If you don't have enough pen, you won't do full damage
|
||||
src.occupant_message("<span class='notice'>\The [W] struggles to bypass \the [src] armor.</span>")
|
||||
src.visible_message("\The [W] struggles to bypass \the [src] armor")
|
||||
pass_damage_reduc_mod = fail_penetration_value //This will apply to reduce damage to 2/3 or 66% by default
|
||||
pass_damage_reduc_mod = temp_fail_penetration_value //This will apply to reduce damage to 2/3 or 66% by default
|
||||
|
||||
else
|
||||
pass_damage_reduc_mod = 1 //Just making sure.
|
||||
@@ -1080,6 +1310,11 @@
|
||||
to_chat(user, "[src]-MMI interface initialization failed.")
|
||||
return
|
||||
|
||||
if(istype(W, /obj/item/device/robotanalyzer))
|
||||
var/obj/item/device/robotanalyzer/RA = W
|
||||
RA.do_scan(src, user)
|
||||
return
|
||||
|
||||
if(istype(W, /obj/item/mecha_parts/mecha_equipment))
|
||||
var/obj/item/mecha_parts/mecha_equipment/E = W
|
||||
spawn()
|
||||
@@ -1090,6 +1325,20 @@
|
||||
else
|
||||
to_chat(user, "You were unable to attach [W] to [src]")
|
||||
return
|
||||
|
||||
if(istype(W, /obj/item/mecha_parts/component) && state == MECHA_CELL_OUT)
|
||||
var/obj/item/mecha_parts/component/MC = W
|
||||
spawn()
|
||||
if(MC.attach(src))
|
||||
user.drop_item()
|
||||
MC.forceMove(src)
|
||||
user.visible_message("[user] installs \the [W] in \the [src]", "You install \the [W] in \the [src].")
|
||||
return
|
||||
|
||||
if(istype(W, /obj/item/weapon/card/robot))
|
||||
var/obj/item/weapon/card/robot/RoC = W
|
||||
return attackby(RoC.dummy_card, user)
|
||||
|
||||
if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
|
||||
if(add_req_access || maint_access)
|
||||
if(internals_access_allowed(usr))
|
||||
@@ -1106,23 +1355,39 @@
|
||||
else
|
||||
to_chat(user, "<span class='warning'>Maintenance protocols disabled by operator.</span>")
|
||||
else if(W.is_wrench())
|
||||
if(state==1)
|
||||
state = 2
|
||||
if(state==MECHA_BOLTS_SECURED)
|
||||
state = MECHA_PANEL_LOOSE
|
||||
to_chat(user, "You undo the securing bolts.")
|
||||
else if(state==2)
|
||||
state = 1
|
||||
else if(state==MECHA_PANEL_LOOSE)
|
||||
state = MECHA_BOLTS_SECURED
|
||||
to_chat(user, "You tighten the securing bolts.")
|
||||
return
|
||||
else if(W.is_crowbar())
|
||||
if(state==2)
|
||||
state = 3
|
||||
if(state==MECHA_PANEL_LOOSE)
|
||||
state = MECHA_CELL_OPEN
|
||||
to_chat(user, "You open the hatch to the power unit")
|
||||
else if(state==3)
|
||||
state=2
|
||||
else if(state==MECHA_CELL_OPEN)
|
||||
state=MECHA_PANEL_LOOSE
|
||||
to_chat(user, "You close the hatch to the power unit")
|
||||
else if(state==MECHA_CELL_OUT)
|
||||
var/list/removable_components = list()
|
||||
for(var/slot in internal_components)
|
||||
var/obj/item/mecha_parts/component/MC = internal_components[slot]
|
||||
if(istype(MC))
|
||||
removable_components[MC.name] = MC
|
||||
else
|
||||
to_chat(user, "<span class='notice'>\The [src] appears to be missing \the [slot].</span>")
|
||||
|
||||
var/remove = input(user, "Which component do you want to pry out?", "Remove Component") as null|anything in removable_components
|
||||
if(!remove)
|
||||
return
|
||||
|
||||
var/obj/item/mecha_parts/component/RmC = removable_components[remove]
|
||||
RmC.detach()
|
||||
|
||||
return
|
||||
else if(istype(W, /obj/item/stack/cable_coil))
|
||||
if(state == 3 && hasInternalDamage(MECHA_INT_SHORT_CIRCUIT))
|
||||
if(state >= MECHA_CELL_OPEN && hasInternalDamage(MECHA_INT_SHORT_CIRCUIT))
|
||||
var/obj/item/stack/cable_coil/CC = W
|
||||
if(CC.use(2))
|
||||
clearInternalDamage(MECHA_INT_SHORT_CIRCUIT)
|
||||
@@ -1134,19 +1399,19 @@
|
||||
if(hasInternalDamage(MECHA_INT_TEMP_CONTROL))
|
||||
clearInternalDamage(MECHA_INT_TEMP_CONTROL)
|
||||
to_chat(user, "You repair the damaged temperature controller.")
|
||||
else if(state==3 && src.cell)
|
||||
else if(state==MECHA_CELL_OPEN && src.cell)
|
||||
src.cell.forceMove(src.loc)
|
||||
src.cell = null
|
||||
state = 4
|
||||
state = MECHA_CELL_OUT
|
||||
to_chat(user, "You unscrew and pry out the powercell.")
|
||||
src.log_message("Powercell removed")
|
||||
else if(state==4 && src.cell)
|
||||
state=3
|
||||
else if(state==MECHA_CELL_OUT && src.cell)
|
||||
state=MECHA_CELL_OPEN
|
||||
to_chat(user, "You screw the cell in place")
|
||||
return
|
||||
|
||||
else if(istype(W, /obj/item/device/multitool))
|
||||
if(state>=3 && src.occupant)
|
||||
if(state>=MECHA_CELL_OPEN && src.occupant)
|
||||
to_chat(user, "You attempt to eject the pilot using the maintenance controls.")
|
||||
if(src.occupant.stat)
|
||||
src.go_out()
|
||||
@@ -1158,7 +1423,7 @@
|
||||
return
|
||||
|
||||
else if(istype(W, /obj/item/weapon/cell))
|
||||
if(state==4)
|
||||
if(state==MECHA_CELL_OUT)
|
||||
if(!src.cell)
|
||||
to_chat(user, "You install the powercell")
|
||||
user.drop_item()
|
||||
@@ -1191,6 +1456,28 @@
|
||||
user.visible_message("[user] attaches [W] to [src].", "You attach [W] to [src]")
|
||||
return
|
||||
|
||||
else if(istype(W,/obj/item/stack/nanopaste))
|
||||
if(state >= MECHA_PANEL_LOOSE)
|
||||
var/obj/item/stack/nanopaste/NP = W
|
||||
|
||||
for(var/slot in internal_components)
|
||||
var/obj/item/mecha_parts/component/C = internal_components[slot]
|
||||
|
||||
if(C)
|
||||
|
||||
if(C.integrity < C.max_integrity)
|
||||
while(C.integrity < C.max_integrity && NP && do_after(user, 1 SECOND, src))
|
||||
if(NP.use(1))
|
||||
C.adjust_integrity(10)
|
||||
|
||||
to_chat(user, "<span class='notice'>You repair damage to \the [C].</span>")
|
||||
|
||||
return
|
||||
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You can't reach \the [src]'s internal components.</span>")
|
||||
return
|
||||
|
||||
else
|
||||
call((proc_res["dynattackby"]||src), "dynattackby")(W,user)
|
||||
/*
|
||||
@@ -1299,7 +1586,8 @@
|
||||
return
|
||||
|
||||
/obj/mecha/remove_air(amount)
|
||||
if(use_internal_tank)
|
||||
var/obj/item/mecha_parts/component/gas/GC = internal_components[MECH_GAS]
|
||||
if(use_internal_tank && (GC && prob(GC.get_efficiency() * 100)))
|
||||
return cabin_air.remove(amount)
|
||||
else
|
||||
var/turf/T = get_turf(src)
|
||||
@@ -1314,7 +1602,8 @@
|
||||
|
||||
/obj/mecha/proc/return_pressure()
|
||||
. = 0
|
||||
if(use_internal_tank)
|
||||
var/obj/item/mecha_parts/component/gas/GC = internal_components[MECH_GAS]
|
||||
if(use_internal_tank && (GC && prob(GC.get_efficiency() * 100)))
|
||||
. = cabin_air.return_pressure()
|
||||
else
|
||||
var/datum/gas_mixture/t_air = get_turf_air()
|
||||
@@ -1325,7 +1614,8 @@
|
||||
//skytodo: //No idea what you want me to do here, mate.
|
||||
/obj/mecha/proc/return_temperature()
|
||||
. = 0
|
||||
if(use_internal_tank)
|
||||
var/obj/item/mecha_parts/component/gas/GC = internal_components[MECH_GAS]
|
||||
if(use_internal_tank && (GC && prob(GC.get_efficiency() * 100)))
|
||||
. = cabin_air.temperature
|
||||
else
|
||||
var/datum/gas_mixture/t_air = get_turf_air()
|
||||
@@ -1387,6 +1677,10 @@
|
||||
if(usr != occupant)
|
||||
return
|
||||
|
||||
var/obj/item/mecha_parts/component/gas/GC = internal_components[MECH_GAS]
|
||||
if(!GC)
|
||||
return
|
||||
|
||||
for(var/turf/T in locs)
|
||||
var/obj/machinery/atmospherics/portables_connector/possible_port = locate(/obj/machinery/atmospherics/portables_connector) in T
|
||||
if(possible_port)
|
||||
@@ -1449,6 +1743,16 @@
|
||||
/obj/mecha/proc/internal_tank()
|
||||
if(usr!=src.occupant)
|
||||
return
|
||||
|
||||
var/obj/item/mecha_parts/component/gas/GC = internal_components[MECH_GAS]
|
||||
if(!GC)
|
||||
to_chat(occupant, "<span class='warning'>The life support systems don't seem to respond.</span>")
|
||||
return
|
||||
|
||||
if(!prob(GC.get_efficiency() * 100))
|
||||
to_chat(occupant, "<span class='warning'>\The [GC] shudders and barks, before returning to how it was before.</span>")
|
||||
return
|
||||
|
||||
use_internal_tank = !use_internal_tank
|
||||
src.occupant_message("Now taking air from [use_internal_tank?"internal airtank":"environment"].")
|
||||
src.log_message("Now taking air from [use_internal_tank?"internal airtank":"environment"].")
|
||||
@@ -1579,6 +1883,8 @@
|
||||
verbs -= /obj/mecha/verb/toggle_phasing
|
||||
if(!switch_dmg_type_possible)
|
||||
verbs -= /obj/mecha/verb/switch_damtype
|
||||
if(!cloak_possible)
|
||||
verbs -= /obj/mecha/verb/toggle_cloak
|
||||
|
||||
occupant.in_enclosed_vehicle = 1 //Useful for when you need to know if someone is in a mecho.
|
||||
update_cell_alerts()
|
||||
@@ -1697,9 +2003,14 @@
|
||||
|
||||
|
||||
/obj/mecha/proc/internals_access_allowed(mob/living/carbon/human/H)
|
||||
if(istype(H))
|
||||
for(var/atom/ID in list(H.get_active_hand(), H.wear_id, H.belt))
|
||||
if(src.check_access(ID,src.internals_req_access))
|
||||
return 1
|
||||
else if(istype(H, /mob/living/silicon/robot))
|
||||
var/mob/living/silicon/robot/R = H
|
||||
if(src.check_access(R.idcard,src.internals_req_access))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
@@ -1799,9 +2110,15 @@
|
||||
var/tank_pressure = internal_tank ? round(internal_tank.return_pressure(),0.01) : "None"
|
||||
var/tank_temperature = internal_tank ? internal_tank.return_temperature() : "Unknown"
|
||||
var/cabin_pressure = round(return_pressure(),0.01)
|
||||
|
||||
var/obj/item/mecha_parts/component/hull/HC = internal_components[MECH_HULL]
|
||||
var/obj/item/mecha_parts/component/armor/AC = internal_components[MECH_ARMOR]
|
||||
|
||||
var/output = {"[report_internal_damage()]
|
||||
<b>Armor Integrity: </b>[AC?"[round(AC.integrity / AC.max_integrity * 100, 0.1)]%":"<span class='warning'>ARMOR MISSING</span>"]<br>
|
||||
<b>Hull Integrity: </b>[HC?"[round(HC.integrity / HC.max_integrity * 100, 0.1)]%":"<span class='warning'>HULL MISSING</span>"]<br>
|
||||
[integrity<30?"<font color='red'><b>DAMAGE LEVEL CRITICAL</b></font><br>":null]
|
||||
<b>Integrity: </b> [integrity]%<br>
|
||||
<b>Chassis Integrity: </b> [integrity]%<br>
|
||||
<b>Powercell charge: </b>[isnull(cell_charge)?"No powercell installed":"[cell.percent()]%"]<br>
|
||||
<b>Air source: </b>[use_internal_tank?"Internal Airtank":"Environment"]<br>
|
||||
<b>Airtank pressure: </b>[tank_pressure]kPa<br>
|
||||
@@ -1888,6 +2205,7 @@
|
||||
output += "Universal Module: [W.name] <a href='?src=\ref[W];detach=1'>Detach</a><br>"
|
||||
for(var/obj/item/mecha_parts/mecha_equipment/W in special_equipment)
|
||||
output += "Special Module: [W.name] <a href='?src=\ref[W];detach=1'>Detach</a><br>"
|
||||
<<<<<<< HEAD
|
||||
for(var/obj/item/mecha_parts/mecha_equipment/W in micro_utility_equipment) // VOREstation Edit - Adds micro equipent to the menu
|
||||
output += "Micro Utility Module: [W.name] <a href='?src=\ref[W];detach=1'>Detach</a><br>"
|
||||
for(var/obj/item/mecha_parts/mecha_equipment/W in micro_weapon_equipment)
|
||||
@@ -1901,6 +2219,15 @@
|
||||
<b>Available special slots:</b> [max_special_equip-special_equipment.len]<br>
|
||||
</div></div>
|
||||
"}
|
||||
=======
|
||||
output += {"<b>Available hull slots:</b> [max_hull_equip-hull_equipment.len]<br>
|
||||
<b>Available weapon slots:</b> [max_weapon_equip-weapon_equipment.len]<br>
|
||||
<b>Available utility slots:</b> [max_utility_equip-utility_equipment.len]<br>
|
||||
<b>Available universal slots:</b> [max_universal_equip-universal_equipment.len]<br>
|
||||
<b>Available special slots:</b> [max_special_equip-special_equipment.len]<br>
|
||||
</div></div>
|
||||
"}
|
||||
>>>>>>> 282b42d... Exosuit Modular Internals, The Squeakening (#7329)
|
||||
return output
|
||||
|
||||
/obj/mecha/proc/get_equipment_list() //outputs mecha equipment list in html
|
||||
@@ -2109,15 +2436,15 @@
|
||||
if(!in_range(src, usr)) return
|
||||
var/mob/user = top_filter.getMob("user")
|
||||
if(user)
|
||||
if(state==0)
|
||||
state = 1
|
||||
if(state==MECHA_OPERATING)
|
||||
state = MECHA_BOLTS_SECURED
|
||||
to_chat(user, "The securing bolts are now exposed.")
|
||||
else if(state==1)
|
||||
state = 0
|
||||
else if(state==MECHA_BOLTS_SECURED)
|
||||
state = MECHA_OPERATING
|
||||
to_chat(user, "The securing bolts are now hidden.")
|
||||
output_maintenance_dialog(top_filter.getObj("id_card"),user)
|
||||
return
|
||||
if(href_list["set_internal_tank_valve"] && state >=1)
|
||||
if(href_list["set_internal_tank_valve"] && state >=MECHA_BOLTS_SECURED)
|
||||
if(!in_range(src, usr)) return
|
||||
var/mob/user = top_filter.getMob("user")
|
||||
if(user)
|
||||
@@ -2125,7 +2452,7 @@
|
||||
if(new_pressure)
|
||||
internal_tank_valve = new_pressure
|
||||
to_chat(user, "The internal pressure valve has been set to [internal_tank_valve]kPa.")
|
||||
if(href_list["remove_passenger"] && state >= 1)
|
||||
if(href_list["remove_passenger"] && state >= MECHA_BOLTS_SECURED)
|
||||
var/mob/user = top_filter.getMob("user")
|
||||
var/list/passengers = list()
|
||||
for (var/obj/item/mecha_parts/mecha_equipment/tool/passenger/P in contents)
|
||||
@@ -2284,6 +2611,13 @@
|
||||
|
||||
/obj/mecha/proc/dynusepower(amount)
|
||||
update_cell_alerts()
|
||||
var/obj/item/mecha_parts/component/electrical/EC = internal_components[MECH_ELECTRIC]
|
||||
|
||||
if(EC)
|
||||
amount = amount * (2 - EC.get_efficiency()) * EC.charge_cost_mod
|
||||
else
|
||||
amount *= 5
|
||||
|
||||
if(get_charge())
|
||||
cell.use(amount)
|
||||
return 1
|
||||
@@ -2291,6 +2625,13 @@
|
||||
|
||||
/obj/mecha/proc/give_power(amount)
|
||||
update_cell_alerts()
|
||||
var/obj/item/mecha_parts/component/electrical/EC = internal_components[MECH_ELECTRIC]
|
||||
|
||||
if(!EC)
|
||||
amount /= 4
|
||||
else
|
||||
amount *= EC.get_efficiency()
|
||||
|
||||
if(!isnull(get_charge()))
|
||||
cell.give(amount)
|
||||
return 1
|
||||
@@ -2306,6 +2647,19 @@
|
||||
//This is for mobs mostly.
|
||||
/obj/mecha/attack_generic(var/mob/user, var/damage, var/attack_message)
|
||||
|
||||
var/obj/item/mecha_parts/component/armor/ArmC = internal_components[MECH_ARMOR]
|
||||
|
||||
var/temp_deflect_chance = deflect_chance
|
||||
var/temp_damage_minimum = damage_minimum
|
||||
|
||||
if(!ArmC)
|
||||
temp_deflect_chance = 1
|
||||
temp_damage_minimum = 0
|
||||
|
||||
else
|
||||
temp_deflect_chance = round(ArmC.get_efficiency() * ArmC.deflect_chance + (defence_mode ? 25 : 0))
|
||||
temp_damage_minimum = round(ArmC.get_efficiency() * ArmC.damage_minimum)
|
||||
|
||||
user.setClickCooldown(user.get_attack_speed())
|
||||
if(!damage)
|
||||
return 0
|
||||
@@ -2313,14 +2667,14 @@
|
||||
src.log_message("Attacked. Attacker - [user].",1)
|
||||
user.do_attack_animation(src)
|
||||
|
||||
if(prob(src.deflect_chance))//Deflected
|
||||
if(prob(temp_deflect_chance))//Deflected
|
||||
src.log_append_to_last("Armor saved.")
|
||||
src.occupant_message("<span class='notice'>\The [user]'s attack is stopped by the armor.</span>")
|
||||
visible_message("<span class='notice'>\The [user] rebounds off [src.name]'s armor!</span>")
|
||||
user.attack_log += text("\[[time_stamp()]\] <font color='red'>attacked [src.name]</font>")
|
||||
playsound(src, 'sound/weapons/slash.ogg', 50, 1, -1)
|
||||
|
||||
else if(damage < damage_minimum)//Pathetic damage levels just don't harm MECH.
|
||||
else if(damage < temp_damage_minimum)//Pathetic damage levels just don't harm MECH.
|
||||
src.occupant_message("<span class='notice'>\The [user]'s doesn't dent \the [src] paint.</span>")
|
||||
src.visible_message("\The [user]'s attack doesn't dent \the [src] armor")
|
||||
src.log_append_to_last("Armor saved.")
|
||||
|
||||
@@ -35,6 +35,8 @@
|
||||
phasing_action.Grant(user, src)
|
||||
if(switch_dmg_type_possible)
|
||||
switch_damtype_action.Grant(user, src)
|
||||
if(cloak_possible)
|
||||
cloak_action.Grant(user, src)
|
||||
|
||||
/obj/mecha/proc/RemoveActions(mob/living/user, human_occupant = 0)
|
||||
if(human_occupant)
|
||||
@@ -52,7 +54,7 @@
|
||||
phasing_action.Remove(user, src)
|
||||
switch_damtype_action.Remove(user, src)
|
||||
overload_action.Remove(user, src)
|
||||
|
||||
cloak_action.Remove(user, src)
|
||||
|
||||
|
||||
//
|
||||
@@ -242,6 +244,15 @@
|
||||
|
||||
|
||||
|
||||
/datum/action/innate/mecha/mech_toggle_cloaking
|
||||
name = "Toggle Mech phasing"
|
||||
button_icon_state = "mech_phasing_off"
|
||||
|
||||
/datum/action/innate/mecha/mech_toggle_cloaking/Activate()
|
||||
button_icon_state = "mech_phasing_[chassis.cloaked ? "off" : "on"]"
|
||||
button.UpdateIcon()
|
||||
chassis.toggle_cloaking()
|
||||
|
||||
|
||||
|
||||
/////
|
||||
@@ -293,12 +304,10 @@
|
||||
return
|
||||
if(overload)
|
||||
overload = 0
|
||||
step_in = initial(step_in)
|
||||
step_energy_drain = initial(step_energy_drain)
|
||||
src.occupant_message("<font color='blue'>You disable leg actuators overload.</font>")
|
||||
else
|
||||
overload = 1
|
||||
step_in = min(1, round(step_in/2))
|
||||
step_energy_drain = step_energy_drain*overload_coeff
|
||||
src.occupant_message("<font color='red'>You enable leg actuators overload.</font>")
|
||||
src.log_message("Toggled leg actuators overload.")
|
||||
@@ -422,6 +431,25 @@
|
||||
return
|
||||
|
||||
|
||||
/obj/mecha/verb/toggle_cloak()
|
||||
set category = "Exosuit Interface"
|
||||
set name = "Toggle cloaking"
|
||||
set src = usr.loc
|
||||
set popup_menu = 0
|
||||
toggle_cloaking()
|
||||
|
||||
/obj/mecha/proc/toggle_cloaking()
|
||||
if(usr!=src.occupant)
|
||||
return
|
||||
|
||||
if(cloaked)
|
||||
uncloak()
|
||||
else
|
||||
cloak()
|
||||
|
||||
src.occupant_message("<font color=\"[cloaked?"#00f\">En":"#f00\">Dis"]abled cloaking.</font>")
|
||||
return
|
||||
|
||||
/obj/mecha/verb/toggle_weapons_only_cycle()
|
||||
set category = "Exosuit Interface"
|
||||
set name = "Toggle weapons only cycling"
|
||||
@@ -435,4 +463,3 @@
|
||||
weapons_only_cycle = !weapons_only_cycle
|
||||
src.occupant_message("<font color=\"[weapons_only_cycle?"#00f\">En":"#f00\">Dis"]abled weapons only cycling.</font>")
|
||||
return
|
||||
|
||||
|
||||
@@ -9,6 +9,14 @@
|
||||
|
||||
cargo_capacity = 1
|
||||
|
||||
starting_components = list(
|
||||
/obj/item/mecha_parts/component/hull,
|
||||
/obj/item/mecha_parts/component/actuator,
|
||||
/obj/item/mecha_parts/component/armor/lightweight,
|
||||
/obj/item/mecha_parts/component/gas,
|
||||
/obj/item/mecha_parts/component/electrical
|
||||
)
|
||||
|
||||
/obj/mecha/medical/Initialize()
|
||||
. = ..()
|
||||
var/turf/T = get_turf(src)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/obj/mecha/medical/odysseus/
|
||||
/obj/mecha/medical/odysseus
|
||||
desc = "These exosuits are developed and produced by Vey-Med. (© All rights reserved)."
|
||||
name = "Odysseus"
|
||||
catalogue_data = list(
|
||||
@@ -9,8 +9,8 @@
|
||||
initial_icon = "odysseus"
|
||||
step_in = 2
|
||||
max_temperature = 15000
|
||||
health = 120
|
||||
maxhealth = 120
|
||||
health = 70
|
||||
maxhealth = 70
|
||||
wreckage = /obj/effect/decal/mecha_wreckage/odysseus
|
||||
internal_damage_threshold = 35
|
||||
deflect_chance = 15
|
||||
@@ -139,5 +139,5 @@
|
||||
/obj/mecha/medical/odysseus/old/New()
|
||||
..()
|
||||
health = 25
|
||||
maxhealth = 100 //Just slightly worse.
|
||||
maxhealth = 50 //Just slightly worse.
|
||||
cell.charge = rand(0, (cell.charge/2))
|
||||
@@ -14,6 +14,14 @@
|
||||
|
||||
minimum_penetration = 10
|
||||
|
||||
starting_components = list(
|
||||
/obj/item/mecha_parts/component/hull/durable,
|
||||
/obj/item/mecha_parts/component/actuator,
|
||||
/obj/item/mecha_parts/component/armor/mining,
|
||||
/obj/item/mecha_parts/component/gas,
|
||||
/obj/item/mecha_parts/component/electrical
|
||||
)
|
||||
|
||||
/obj/mecha/working/ripley/Destroy()
|
||||
for(var/atom/movable/A in src.cargo)
|
||||
A.loc = loc
|
||||
|
||||
@@ -199,6 +199,16 @@
|
||||
/obj/item/weapon/storage/box/empshells/large
|
||||
starts_with = list(/obj/item/ammo_casing/a12g/emp = 16)
|
||||
|
||||
/obj/item/weapon/storage/box/flechetteshells
|
||||
name = "box of shotgun flechettes"
|
||||
desc = "It has a picture of a gun and several warning symbols on the front.<br>WARNING: Live ammunition. Misuse may result in serious injury or death."
|
||||
icon_state = "lethalslug_box"
|
||||
item_state_slots = list(slot_r_hand_str = "syringe_kit", slot_l_hand_str = "syringe_kit")
|
||||
starts_with = list(/obj/item/ammo_casing/a12g/flechette = 8)
|
||||
|
||||
/obj/item/weapon/storage/box/flechetteshells/large
|
||||
starts_with = list(/obj/item/ammo_casing/a12g/flechette = 16)
|
||||
|
||||
/obj/item/weapon/storage/box/sniperammo
|
||||
name = "box of 14.5mm shells"
|
||||
desc = "It has a picture of a gun and several warning symbols on the front.<br>WARNING: Live ammunition. Misuse may result in serious injury or death."
|
||||
|
||||
@@ -34,6 +34,8 @@
|
||||
scan_type = "robot"
|
||||
else if(istype(M, /mob/living/carbon/human))
|
||||
scan_type = "prosthetics"
|
||||
else if(istype(M, /obj/mecha))
|
||||
scan_type = "mecha"
|
||||
else
|
||||
to_chat(user, "<font color='red'>You can't analyze non-robotic things!</font>")
|
||||
return
|
||||
@@ -95,5 +97,37 @@
|
||||
if(!organ_found)
|
||||
to_chat(user, "No prosthetics located.")
|
||||
|
||||
if("mecha")
|
||||
|
||||
var/obj/mecha/Mecha = M
|
||||
|
||||
var/integrity = Mecha.health/initial(Mecha.health)*100
|
||||
var/cell_charge = Mecha.get_charge()
|
||||
var/tank_pressure = Mecha.internal_tank ? round(Mecha.internal_tank.return_pressure(),0.01) : "None"
|
||||
var/tank_temperature = Mecha.internal_tank ? Mecha.internal_tank.return_temperature() : "Unknown"
|
||||
var/cabin_pressure = round(Mecha.return_pressure(),0.01)
|
||||
|
||||
var/output = {"<span class='notice'>Analyzing Results for \the [Mecha]:</span><br>
|
||||
<b>Chassis Integrity: </b> [integrity]%<br>
|
||||
<b>Powercell charge: </b>[isnull(cell_charge)?"No powercell installed":"[Mecha.cell.percent()]%"]<br>
|
||||
<b>Air source: </b>[Mecha.use_internal_tank?"Internal Airtank":"Environment"]<br>
|
||||
<b>Airtank pressure: </b>[tank_pressure]kPa<br>
|
||||
<b>Airtank temperature: </b>[tank_temperature]K|[tank_temperature - T0C]°C<br>
|
||||
<b>Cabin pressure: </b>[cabin_pressure>WARNING_HIGH_PRESSURE ? "<font color='red'>[cabin_pressure]</font>": cabin_pressure]kPa<br>
|
||||
<b>Cabin temperature: </b> [Mecha.return_temperature()]K|[Mecha.return_temperature() - T0C]°C<br>
|
||||
<b>DNA Lock: </b> [Mecha.dna?"Mecha.dna":"Not Found"]<br>
|
||||
"}
|
||||
|
||||
to_chat(user, output)
|
||||
to_chat(user, "<hr>")
|
||||
to_chat(user, "<span class='notice'>Internal Diagnostics:</span>")
|
||||
for(var/slot in Mecha.internal_components)
|
||||
var/obj/item/mecha_parts/component/MC = Mecha.internal_components[slot]
|
||||
to_chat(user, "[MC?"[slot]: [MC] <span class='notice'>[round((MC.integrity / MC.max_integrity) * 100, 0.1)]%</span> integrity. [MC.get_efficiency() * 100] Operational capacity.":"<span class='warning'>[slot]: Component Not Found</span>"]")
|
||||
|
||||
to_chat(user, "<hr>")
|
||||
to_chat(user, "<span class='notice'>General Statistics:</span>")
|
||||
to_chat(user, "<span class='notice'>Movement Weight: [Mecha.get_step_delay()]</span><br>")
|
||||
|
||||
src.add_fingerprint(user)
|
||||
return
|
||||
|
||||
@@ -88,6 +88,10 @@
|
||||
name = "magazine (.45 AP)"
|
||||
ammo_type = /obj/item/ammo_casing/a45/ap
|
||||
|
||||
/obj/item/ammo_magazine/m45/hp
|
||||
name = "magazine (.45 HP)"
|
||||
ammo_type = /obj/item/ammo_casing/a45/hp
|
||||
|
||||
/obj/item/ammo_magazine/box/emp/b45
|
||||
name = "ammunition box (.45 haywire)"
|
||||
ammo_type = /obj/item/ammo_casing/a45/emp
|
||||
@@ -293,6 +297,11 @@
|
||||
name = "top mounted magazine (9mm practice)"
|
||||
ammo_type = /obj/item/ammo_casing/a9mm/practice
|
||||
|
||||
/obj/item/ammo_magazine/m9mmt/ap
|
||||
name = "top mounted magazine (9mm armor piercing)"
|
||||
ammo_type = /obj/item/ammo_casing/a9mm/ap
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 1000, MAT_PLASTEEL = 2000)
|
||||
|
||||
/obj/item/ammo_magazine/m9mmp90
|
||||
name = "large capacity top mounted magazine (9mm armor-piercing)"
|
||||
icon_state = "p90"
|
||||
|
||||
@@ -131,6 +131,7 @@
|
||||
desc = "A .45 Armor-Piercing bullet casing."
|
||||
icon_state = "r-casing"
|
||||
projectile_type = /obj/item/projectile/bullet/pistol/medium/ap
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 50, MAT_PLASTEEL = 25)
|
||||
|
||||
/obj/item/ammo_casing/a45/practice
|
||||
desc = "A .45 practice bullet casing."
|
||||
@@ -160,6 +161,7 @@
|
||||
/obj/item/ammo_casing/a45/hp
|
||||
desc = "A .45 hollow-point bullet casing."
|
||||
projectile_type = /obj/item/projectile/bullet/pistol/medium/hp
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 60, MAT_PLASTIC = 15)
|
||||
|
||||
/*
|
||||
* 10mm
|
||||
@@ -246,6 +248,14 @@
|
||||
// projectile_type = /obj/item/projectile/bullet/shotgun/ion
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 360, "uranium" = 240)
|
||||
|
||||
/obj/item/ammo_casing/a12g/flechette
|
||||
name = "shotgun flechette"
|
||||
desc = "A 12 gauge flechette cartidge, also known as nailshot."
|
||||
icon_state = "slshell"
|
||||
caliber = "12g"
|
||||
projectile_type = /obj/item/projectile/scatter/flechette
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 360, MAT_PLASTEEL = 100)
|
||||
|
||||
/*
|
||||
* 7.62mm
|
||||
*/
|
||||
|
||||
@@ -27,6 +27,10 @@
|
||||
/obj/item/projectile/bullet/pellet/shotgun/flak = 3
|
||||
)
|
||||
|
||||
/*
|
||||
* Energy
|
||||
*/
|
||||
|
||||
/obj/item/projectile/scatter/laser
|
||||
damage = 40
|
||||
|
||||
@@ -61,6 +65,12 @@
|
||||
/obj/item/projectile/bullet/shotgun/ion = 3
|
||||
)
|
||||
|
||||
|
||||
/*
|
||||
* Flame
|
||||
*/
|
||||
|
||||
|
||||
/obj/item/projectile/scatter/flamethrower
|
||||
damage = 5
|
||||
submunition_spread_max = 100
|
||||
@@ -70,3 +80,19 @@
|
||||
submunitions = list(
|
||||
/obj/item/projectile/bullet/incendiary/flamethrower/tiny = 7
|
||||
)
|
||||
|
||||
|
||||
/*
|
||||
* Ballistic
|
||||
*/
|
||||
|
||||
|
||||
/obj/item/projectile/scatter/flechette
|
||||
damage = 60
|
||||
|
||||
submunition_spread_max = 40
|
||||
submunition_spread_min = 10
|
||||
|
||||
submunitions = list(
|
||||
/obj/item/projectile/bullet/magnetic/flechette/small = 4
|
||||
)
|
||||
|
||||
@@ -16,7 +16,7 @@ using metal and glass, it uses glass and reagents (usually sulphuric acid).
|
||||
var/mat_efficiency = 1
|
||||
var/speed = 1
|
||||
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, MAT_PLASTEEL = 0, "plastic" = 0, MAT_GRAPHITE, "gold" = 0, "silver" = 0, "osmium" = 0, MAT_LEAD = 0, "phoron" = 0, "uranium" = 0, "diamond" = 0, MAT_DURASTEEL = 0, MAT_VERDANTIUM = 0, MAT_MORPHIUM = 0, MAT_METALHYDROGEN = 0, MAT_SUPERMATTER = 0)
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, MAT_PLASTEEL = 0, "plastic" = 0, MAT_GRAPHITE = 0, "gold" = 0, "silver" = 0, "osmium" = 0, MAT_LEAD = 0, "phoron" = 0, "uranium" = 0, "diamond" = 0, MAT_DURASTEEL = 0, MAT_VERDANTIUM = 0, MAT_MORPHIUM = 0, MAT_METALHYDROGEN = 0, MAT_SUPERMATTER = 0)
|
||||
|
||||
hidden_materials = list(MAT_PLASTEEL, MAT_DURASTEEL, MAT_GRAPHITE, MAT_VERDANTIUM, MAT_MORPHIUM, MAT_METALHYDROGEN, MAT_SUPERMATTER)
|
||||
|
||||
|
||||
@@ -493,6 +493,8 @@ CIRCUITS BELOW
|
||||
name = "'Durand' central control"
|
||||
id = "durand_main"
|
||||
req_tech = list(TECH_DATA = 4)
|
||||
materials = list("glass" = 2000, MAT_GRAPHITE = 1250)
|
||||
chemicals = list("pacid" = 20)
|
||||
build_path = /obj/item/weapon/circuitboard/mecha/durand/main
|
||||
sort_string = "NAADA"
|
||||
|
||||
@@ -500,6 +502,8 @@ CIRCUITS BELOW
|
||||
name = "'Durand' peripherals control"
|
||||
id = "durand_peri"
|
||||
req_tech = list(TECH_DATA = 4)
|
||||
materials = list("glass" = 2000, MAT_GRAPHITE = 1250)
|
||||
chemicals = list("pacid" = 20)
|
||||
build_path = /obj/item/weapon/circuitboard/mecha/durand/peripherals
|
||||
sort_string = "NAADB"
|
||||
|
||||
@@ -507,6 +511,8 @@ CIRCUITS BELOW
|
||||
name = "'Durand' weapon control and targeting"
|
||||
id = "durand_targ"
|
||||
req_tech = list(TECH_DATA = 4, TECH_COMBAT = 2)
|
||||
materials = list("glass" = 2000, MAT_GRAPHITE = 1250)
|
||||
chemicals = list("pacid" = 20)
|
||||
build_path = /obj/item/weapon/circuitboard/mecha/durand/targeting
|
||||
sort_string = "NAADC"
|
||||
|
||||
|
||||
@@ -100,14 +100,23 @@
|
||||
sort_string = "MABBA"
|
||||
|
||||
/datum/design/item/weapon/ballistic/ammo/stunshell
|
||||
name = "stun shell"
|
||||
name = "stun shells"
|
||||
desc = "A stunning shell for a shotgun."
|
||||
id = "stunshell"
|
||||
req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3)
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 4000)
|
||||
build_path = /obj/item/ammo_casing/a12g/stunshell
|
||||
build_path = /obj/item/weapon/storage/box/stunshells
|
||||
sort_string = "MABBB"
|
||||
|
||||
/datum/design/item/weapon/ballistic/ammo/empshell
|
||||
name = "emp shells"
|
||||
desc = "An electromagnetic shell for a shotgun."
|
||||
id = "empshell"
|
||||
req_tech = list(TECH_COMBAT = 4, TECH_MAGNET = 3)
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 4000, MAT_URANIUM = 1000)
|
||||
build_path = /obj/item/weapon/storage/box/empshells
|
||||
sort_string = "MABBC"
|
||||
|
||||
// Phase weapons
|
||||
|
||||
/datum/design/item/weapon/phase/AssembleDesignName()
|
||||
|
||||
@@ -177,57 +177,57 @@
|
||||
name = "Durand Chassis"
|
||||
id = "durand_chassis"
|
||||
build_path = /obj/item/mecha_parts/chassis/durand
|
||||
time = 10
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 18750)
|
||||
time = 20
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 18750, MAT_PLASTEEL = 20000)
|
||||
|
||||
/datum/design/item/mechfab/durand/torso
|
||||
name = "Durand Torso"
|
||||
id = "durand_torso"
|
||||
build_path = /obj/item/mecha_parts/part/durand_torso
|
||||
time = 30
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 41250, "glass" = 15000, "silver" = 7500)
|
||||
time = 60
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 41250, MAT_PLASTEEL = 15000, "silver" = 7500)
|
||||
|
||||
/datum/design/item/mechfab/durand/head
|
||||
name = "Durand Head"
|
||||
id = "durand_head"
|
||||
build_path = /obj/item/mecha_parts/part/durand_head
|
||||
time = 20
|
||||
time = 40
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 18750, "glass" = 7500, "silver" = 2250)
|
||||
|
||||
/datum/design/item/mechfab/durand/left_arm
|
||||
name = "Durand Left Arm"
|
||||
id = "durand_left_arm"
|
||||
build_path = /obj/item/mecha_parts/part/durand_left_arm
|
||||
time = 20
|
||||
time = 40
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 26250, "silver" = 2250)
|
||||
|
||||
/datum/design/item/mechfab/durand/right_arm
|
||||
name = "Durand Right Arm"
|
||||
id = "durand_right_arm"
|
||||
build_path = /obj/item/mecha_parts/part/durand_right_arm
|
||||
time = 20
|
||||
time = 40
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 26250, "silver" = 2250)
|
||||
|
||||
/datum/design/item/mechfab/durand/left_leg
|
||||
name = "Durand Left Leg"
|
||||
id = "durand_left_leg"
|
||||
build_path = /obj/item/mecha_parts/part/durand_left_leg
|
||||
time = 20
|
||||
time = 40
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 30000, "silver" = 2250)
|
||||
|
||||
/datum/design/item/mechfab/durand/right_leg
|
||||
name = "Durand Right Leg"
|
||||
id = "durand_right_leg"
|
||||
build_path = /obj/item/mecha_parts/part/durand_right_leg
|
||||
time = 20
|
||||
time = 40
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 30000, "silver" = 2250)
|
||||
|
||||
/datum/design/item/mechfab/durand/armour
|
||||
name = "Durand Armour Plates"
|
||||
id = "durand_armour"
|
||||
build_path = /obj/item/mecha_parts/part/durand_armour
|
||||
time = 60
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 37500, "uranium" = 7500)
|
||||
time = 90
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 27500, MAT_PLASTEEL = 10000, "uranium" = 7500)
|
||||
|
||||
/datum/design/item/mechfab/janus
|
||||
category = "Janus"
|
||||
@@ -1039,3 +1039,150 @@
|
||||
req_tech = list(TECH_MATERIAL = 6, TECH_ENGINEERING = 5, TECH_PHORON = 3, TECH_MAGNET = 4, TECH_POWER = 6)
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 6000, "silver" = 4000)
|
||||
|
||||
// Exosuit Internals
|
||||
|
||||
/datum/design/item/mechfab/exointernal
|
||||
category = "Exosuit Internals"
|
||||
time = 120
|
||||
req_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 3)
|
||||
|
||||
/datum/design/item/mechfab/exointernal/stan_armor
|
||||
name = "Armor Plate (Standard)"
|
||||
category = "Exosuit Internals"
|
||||
id = "exo_int_armor_standard"
|
||||
req_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2)
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 10000)
|
||||
build_path = /obj/item/mecha_parts/component/armor
|
||||
|
||||
/datum/design/item/mechfab/exointernal/light_armor
|
||||
name = "Armor Plate (Lightweight)"
|
||||
category = "Exosuit Internals"
|
||||
id = "exo_int_armor_lightweight"
|
||||
req_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 3)
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 5000, MAT_PLASTIC = 3000)
|
||||
build_path = /obj/item/mecha_parts/component/armor/lightweight
|
||||
|
||||
/datum/design/item/mechfab/exointernal/reinf_armor
|
||||
name = "Armor Plate (Reinforced)"
|
||||
category = "Exosuit Internals"
|
||||
id = "exo_int_armor_reinforced"
|
||||
req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 4)
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 20000, MAT_PLASTEEL = 10000)
|
||||
build_path = /obj/item/mecha_parts/component/armor/reinforced
|
||||
|
||||
/datum/design/item/mechfab/exointernal/mining_armor
|
||||
name = "Armor Plate (Blast)"
|
||||
category = "Exosuit Internals"
|
||||
id = "exo_int_armor_blast"
|
||||
req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 4)
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 20000, MAT_PLASTEEL = 10000)
|
||||
build_path = /obj/item/mecha_parts/component/armor/mining
|
||||
|
||||
/datum/design/item/mechfab/exointernal/gygax_armor
|
||||
name = "Armor Plate (Marshal)"
|
||||
category = "Exosuit Internals"
|
||||
id = "exo_int_armor_gygax"
|
||||
req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 4, TECH_COMBAT = 2)
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 40000, MAT_DIAMOND = 8000)
|
||||
build_path = /obj/item/mecha_parts/component/armor/marshal
|
||||
|
||||
/datum/design/item/mechfab/exointernal/darkgygax_armor
|
||||
name = "Armor Plate (Blackops)"
|
||||
category = "Exosuit Internals"
|
||||
id = "exo_int_armor_dgygax"
|
||||
req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 5, TECH_COMBAT = 4, TECH_ILLEGAL = 2)
|
||||
materials = list(MAT_PLASTEEL = 20000, MAT_DIAMOND = 10000, MAT_GRAPHITE = 20000)
|
||||
build_path = /obj/item/mecha_parts/component/armor/marshal/reinforced
|
||||
|
||||
/datum/design/item/mechfab/exointernal/durand_armour
|
||||
name = "Armor Plate (Military)"
|
||||
id = "exo_int_armor_durand"
|
||||
req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 4, TECH_COMBAT = 2)
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 40000, MAT_PLASTEEL = 9525, "uranium" = 8000)
|
||||
build_path = /obj/item/mecha_parts/component/armor/military
|
||||
|
||||
/datum/design/item/mechfab/exointernal/marauder_armour
|
||||
name = "Armor Plate (Cutting Edge)"
|
||||
id = "exo_int_armor_marauder"
|
||||
req_tech = list(TECH_MATERIAL = 8, TECH_ENGINEERING = 7, TECH_COMBAT = 6, TECH_ILLEGAL = 4)
|
||||
materials = list(MAT_DURASTEEL = 40000, MAT_GRAPHITE = 8000, MAT_OSMIUM = 8000)
|
||||
build_path = /obj/item/mecha_parts/component/armor/military/marauder
|
||||
|
||||
/datum/design/item/mechfab/exointernal/phazon_armour
|
||||
name = "Armor Plate (Janus)"
|
||||
id = "exo_int_armor_phazon"
|
||||
req_tech = list(TECH_MATERIAL = 6, TECH_ENGINEERING = 6, TECH_COMBAT = 6, TECH_ILLEGAL = 4)
|
||||
materials = list(MAT_MORPHIUM = 40000, MAT_DURASTEEL = 8000, MAT_OSMIUM = 8000)
|
||||
build_path = /obj/item/mecha_parts/component/armor/alien
|
||||
|
||||
/datum/design/item/mechfab/exointernal/stan_hull
|
||||
name = "Hull (Standard)"
|
||||
category = "Exosuit Internals"
|
||||
id = "exo_int_hull_standard"
|
||||
req_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2)
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 10000)
|
||||
build_path = /obj/item/mecha_parts/component/hull
|
||||
|
||||
/datum/design/item/mechfab/exointernal/durable_hull
|
||||
name = "Hull (Durable)"
|
||||
category = "Exosuit Internals"
|
||||
id = "exo_int_hull_durable"
|
||||
req_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2)
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 8000, MAT_PLASTEEL = 5000)
|
||||
build_path = /obj/item/mecha_parts/component/hull/durable
|
||||
|
||||
/datum/design/item/mechfab/exointernal/light_hull
|
||||
name = "Hull (Lightweight)"
|
||||
category = "Exosuit Internals"
|
||||
id = "exo_int_hull_light"
|
||||
req_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 4)
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 5000, MAT_PLASTIC = 3000)
|
||||
build_path = /obj/item/mecha_parts/component/hull/lightweight
|
||||
|
||||
/datum/design/item/mechfab/exointernal/stan_gas
|
||||
name = "Life-Support (Standard)"
|
||||
category = "Exosuit Internals"
|
||||
id = "exo_int_lifesup_standard"
|
||||
req_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2)
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 10000)
|
||||
build_path = /obj/item/mecha_parts/component/gas
|
||||
|
||||
/datum/design/item/mechfab/exointernal/reinf_gas
|
||||
name = "Life-Support (Reinforced)"
|
||||
category = "Exosuit Internals"
|
||||
id = "exo_int_lifesup_reinforced"
|
||||
req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 4)
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 8000, MAT_PLASTEEL = 8000, MAT_GRAPHITE = 1000)
|
||||
build_path = /obj/item/mecha_parts/component/gas/reinforced
|
||||
|
||||
/datum/design/item/mechfab/exointernal/stan_electric
|
||||
name = "Electrical Harness (Standard)"
|
||||
category = "Exosuit Internals"
|
||||
id = "exo_int_electric_standard"
|
||||
req_tech = list(TECH_POWER = 2, TECH_ENGINEERING = 2)
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 5000, MAT_PLASTIC = 1000)
|
||||
build_path = /obj/item/mecha_parts/component/electrical
|
||||
|
||||
/datum/design/item/mechfab/exointernal/efficient_electric
|
||||
name = "Electrical Harness (High)"
|
||||
category = "Exosuit Internals"
|
||||
id = "exo_int_electric_efficient"
|
||||
req_tech = list(TECH_POWER = 4, TECH_ENGINEERING = 4, TECH_DATA = 2)
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 5000, MAT_PLASTIC = 3000, MAT_SILVER = 3000)
|
||||
build_path = /obj/item/mecha_parts/component/electrical/high_current
|
||||
|
||||
/datum/design/item/mechfab/exointernal/stan_actuator
|
||||
name = "Actuator Lattice (Standard)"
|
||||
category = "Exosuit Internals"
|
||||
id = "exo_int_actuator_standard"
|
||||
req_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2)
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 10000)
|
||||
build_path = /obj/item/mecha_parts/component/actuator
|
||||
|
||||
/datum/design/item/mechfab/exointernal/hispeed_actuator
|
||||
name = "Actuator Lattice (Overclocked)"
|
||||
category = "Exosuit Internals"
|
||||
id = "exo_int_actuator_overclock"
|
||||
req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 4, TECH_POWER = 4)
|
||||
materials = list(MAT_PLASTEEL = 10000, MAT_OSMIUM = 3000, MAT_GOLD = 5000)
|
||||
build_path = /obj/item/mecha_parts/component/actuator/hispeed
|
||||
39
html/changelogs/mechoid - exointernals.yml
Normal file
39
html/changelogs/mechoid - exointernals.yml
Normal file
@@ -0,0 +1,39 @@
|
||||
################################
|
||||
# Example Changelog File
|
||||
#
|
||||
# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
|
||||
#
|
||||
# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
|
||||
# When it is, any changes listed below will disappear.
|
||||
#
|
||||
# Valid Prefixes:
|
||||
# bugfix
|
||||
# wip (For works in progress)
|
||||
# tweak
|
||||
# soundadd
|
||||
# sounddel
|
||||
# rscadd (general adding of nice things)
|
||||
# rscdel (general deleting of nice things)
|
||||
# imageadd
|
||||
# imagedel
|
||||
# maptweak
|
||||
# spellcheck (typo fixes)
|
||||
# experiment
|
||||
#################################
|
||||
|
||||
# Your name.
|
||||
author: Mechoid
|
||||
|
||||
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
|
||||
delete-after: True
|
||||
|
||||
# Any changes you've made. See valid prefix list above.
|
||||
# INDENT WITH TWO SPACES. NOT TABS. SPACES.
|
||||
# SCREW THIS UP AND IT WON'T WORK.
|
||||
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
|
||||
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
|
||||
changes:
|
||||
- rscadd: "Exosuits now have internal components."
|
||||
- rscadd: "Autolathes can use plastic and plasteel."
|
||||
- rscadd: "Autolathes can have tiered recipes, based on their manipulator rating."
|
||||
- tweak: "Exosuit base health has been lowered due to the changes to damage processing."
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 8.0 KiB |
BIN
icons/mecha/mech_component.dmi
Normal file
BIN
icons/mecha/mech_component.dmi
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.2 KiB |
@@ -941,6 +941,12 @@
|
||||
#include "code\game\mecha\combat\gygax.dm"
|
||||
#include "code\game\mecha\combat\marauder.dm"
|
||||
#include "code\game\mecha\combat\phazon.dm"
|
||||
#include "code\game\mecha\components\_component.dm"
|
||||
#include "code\game\mecha\components\actuators.dm"
|
||||
#include "code\game\mecha\components\armor.dm"
|
||||
#include "code\game\mecha\components\electrical.dm"
|
||||
#include "code\game\mecha\components\hull.dm"
|
||||
#include "code\game\mecha\components\lifesupport.dm"
|
||||
#include "code\game\mecha\equipment\mecha_equipment.dm"
|
||||
#include "code\game\mecha\equipment\mecha_equipment_dynamicprocs.dm"
|
||||
#include "code\game\mecha\equipment\tools\armor_melee.dm"
|
||||
|
||||
Reference in New Issue
Block a user