Robotics Expansion: RIG-ged and Ready

This commit is contained in:
Atermonera
2020-03-11 12:55:36 -07:00
committed by VirgoBot
parent 74ad3b1d25
commit e45a95d365
47 changed files with 2211 additions and 29 deletions

View File

@@ -177,6 +177,7 @@
#define MAT_SUPERMATTER "supermatter" #define MAT_SUPERMATTER "supermatter"
#define MAT_METALHYDROGEN "mhydrogen" #define MAT_METALHYDROGEN "mhydrogen"
#define MAT_OSMIUM "osmium" #define MAT_OSMIUM "osmium"
#define MAT_GRAPHITE "graphite"
#define SHARD_SHARD "shard" #define SHARD_SHARD "shard"
#define SHARD_SHRAPNEL "shrapnel" #define SHARD_SHRAPNEL "shrapnel"

View File

@@ -13,8 +13,8 @@
var/speed = 1 var/speed = 1
var/mat_efficiency = 1 var/mat_efficiency = 1
var/list/materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, "plastic" = 0, MAT_PLASTEEL = 0, "gold" = 0, "silver" = 0, MAT_LEAD = 0, "osmium" = 0, "diamond" = 0, MAT_DURASTEEL = 0, "phoron" = 0, "uranium" = 0, MAT_VERDANTIUM = 0, MAT_MORPHIUM = 0, MAT_METALHYDROGEN = 0, MAT_SUPERMATTER = 0) var/list/materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, "plastic" = 0, MAT_GRAPHITE = 0, MAT_PLASTEEL = 0, "gold" = 0, "silver" = 0, MAT_LEAD = 0, "osmium" = 0, "diamond" = 0, MAT_DURASTEEL = 0, "phoron" = 0, "uranium" = 0, MAT_VERDANTIUM = 0, MAT_MORPHIUM = 0, MAT_METALHYDROGEN = 0, MAT_SUPERMATTER = 0)
var/list/hidden_materials = list(MAT_PLASTEEL, MAT_DURASTEEL, MAT_VERDANTIUM, MAT_MORPHIUM, MAT_METALHYDROGEN, MAT_SUPERMATTER) var/list/hidden_materials = list(MAT_PLASTEEL, MAT_DURASTEEL, MAT_GRAPHITE, MAT_VERDANTIUM, MAT_MORPHIUM, MAT_METALHYDROGEN, MAT_SUPERMATTER)
var/res_max_amount = 200000 var/res_max_amount = 200000
var/datum/research/files var/datum/research/files

View File

@@ -13,8 +13,8 @@
var/speed = 1 var/speed = 1
var/mat_efficiency = 1 var/mat_efficiency = 1
var/list/materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, "plastic" = 0, MAT_PLASTEEL = 0, "gold" = 0, "silver" = 0, MAT_LEAD = 0, "osmium" = 0, "diamond" = 0, MAT_DURASTEEL = 0, "phoron" = 0, "uranium" = 0, MAT_VERDANTIUM = 0, MAT_MORPHIUM = 0) var/list/materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, "plastic" = 0, MAT_GRAPHITE = 0, MAT_PLASTEEL = 0, "gold" = 0, "silver" = 0, MAT_LEAD = 0, "osmium" = 0, "diamond" = 0, MAT_DURASTEEL = 0, "phoron" = 0, "uranium" = 0, MAT_VERDANTIUM = 0, MAT_MORPHIUM = 0)
var/list/hidden_materials = list(MAT_DURASTEEL, MAT_VERDANTIUM, MAT_MORPHIUM) var/list/hidden_materials = list(MAT_DURASTEEL, MAT_GRAPHITE, MAT_VERDANTIUM, MAT_MORPHIUM)
var/res_max_amount = 200000 var/res_max_amount = 200000
var/datum/research/files var/datum/research/files

View File

@@ -0,0 +1,216 @@
/obj/item/ai_verbs
name = "AI verb holder"
/obj/item/ai_verbs/verb/hardsuit_interface()
set category = "Hardsuit"
set name = "Open Hardsuit Interface"
set src in usr
if(!usr.loc || !usr.loc.loc || !istype(usr.loc.loc, /obj/item/rig_module))
to_chat(usr, "You are not loaded into a hardsuit.")
return
var/obj/item/rig_module/module = usr.loc.loc
if(!module.holder)
to_chat(usr, "Your module is not installed in a hardsuit.")
return
module.holder.ui_interact(usr, nano_state = contained_state)
/obj/item/rig_module/ai_container
name = "IIS module"
desc = "An integrated intelligence system module suitable for most hardsuits."
icon_state = "IIS"
toggleable = 1
usable = 1
disruptive = 0
activates_on_touch = 1
engage_string = "Eject AI"
activate_string = "Enable Core Transfer"
deactivate_string = "Disable Core Transfer"
interface_name = "integrated intelligence system"
interface_desc = "A socket that supports a range of artificial intelligence systems."
var/mob/integrated_ai // Direct reference to the actual mob held in the suit.
var/obj/item/ai_card // Reference to the MMI, posibrain, intellicard or pAI card previously holding the AI.
var/obj/item/ai_verbs/verb_holder
/obj/item/rig_module/ai_container/process()
if(integrated_ai)
var/obj/item/weapon/rig/rig = get_rig()
if(rig && rig.ai_override_enabled)
integrated_ai.get_rig_stats = 1
else
integrated_ai.get_rig_stats = 0
/mob/living/Stat()
. = ..()
if(. && get_rig_stats)
var/obj/item/weapon/rig/rig = get_rig()
if(rig)
SetupStat(rig)
/obj/item/rig_module/ai_container/proc/update_verb_holder()
if(!verb_holder)
verb_holder = new(src)
if(integrated_ai)
verb_holder.forceMove(integrated_ai)
else
verb_holder.forceMove(src)
/obj/item/rig_module/ai_container/accepts_item(var/obj/item/input_device, var/mob/living/user)
// Check if there's actually an AI to deal with.
var/mob/living/silicon/ai/target_ai
if(istype(input_device, /mob/living/silicon/ai))
target_ai = input_device
else
target_ai = locate(/mob/living/silicon/ai) in input_device.contents
var/obj/item/device/aicard/card = ai_card
// Downloading from/loading to a terminal.
if(istype(input_device,/obj/machinery/computer/aifixer) || istype(input_device,/mob/living/silicon/ai) || istype(input_device,/obj/structure/AIcore/deactivated))
// If we're stealing an AI, make sure we have a card for it.
if(!card)
card = new /obj/item/device/aicard(src)
// Terminal interaction only works with an intellicarded AI.
if(!istype(card))
return 0
// Since we've explicitly checked for three types, this should be safe.
input_device.attackby(card,user)
// If the transfer failed we can delete the card.
if(locate(/mob/living/silicon/ai) in card)
ai_card = card
integrated_ai = locate(/mob/living/silicon/ai) in card
else
eject_ai()
update_verb_holder()
return 1
if(istype(input_device,/obj/item/device/aicard))
// We are carding the AI in our suit.
if(integrated_ai)
integrated_ai.attackby(input_device,user)
// If the transfer was successful, we can clear out our vars.
if(integrated_ai.loc != src)
integrated_ai = null
eject_ai()
else
// You're using an empty card on an empty suit, idiot.
if(!target_ai)
return 0
integrate_ai(input_device,user)
return 1
// Okay, it wasn't a terminal being touched, check for all the simple insertions.
if(input_device.type in list(/obj/item/device/paicard, /obj/item/device/mmi, /obj/item/device/mmi/digital/posibrain))
if(integrated_ai)
integrated_ai.attackby(input_device,user)
// If the transfer was successful, we can clear out our vars.
if(integrated_ai.loc != src)
integrated_ai = null
eject_ai()
else
integrate_ai(input_device,user)
return 1
return 0
/obj/item/rig_module/ai_container/engage(atom/target)
if(!..())
return 0
var/mob/living/carbon/human/H = holder.wearer
if(!target)
if(ai_card)
if(istype(ai_card,/obj/item/device/aicard))
ai_card.ui_interact(H, state = deep_inventory_state)
else
eject_ai(H)
update_verb_holder()
return 1
if(accepts_item(target,H))
return 1
return 0
/obj/item/rig_module/ai_container/removed()
eject_ai()
..()
/obj/item/rig_module/ai_container/proc/eject_ai(var/mob/user)
if(ai_card)
if(istype(ai_card, /obj/item/device/aicard))
if(integrated_ai && !integrated_ai.stat)
if(user)
to_chat(user, "<span class='danger'>You cannot eject your currently stored AI. Purge it manually.</span>")
return 0
to_chat(user, "<span class='danger'>You purge the previous AI from your Integrated Intelligence System, freeing it for use.</span>")
if(integrated_ai)
integrated_ai.ghostize()
qdel(integrated_ai)
integrated_ai = null
if(ai_card)
qdel(ai_card)
ai_card = null
else if(user)
user.put_in_hands(ai_card)
else
ai_card.forceMove(get_turf(src))
ai_card = null
integrated_ai = null
update_verb_holder()
/obj/item/rig_module/ai_container/proc/integrate_ai(var/obj/item/ai,var/mob/user)
if(!ai) return
// The ONLY THING all the different AI systems have in common is that they all store the mob inside an item.
var/mob/living/ai_mob = locate(/mob/living) in ai.contents
if(ai_mob)
if(ai_mob.key && ai_mob.client)
if(istype(ai, /obj/item/device/aicard))
if(!ai_card)
ai_card = new /obj/item/device/aicard(src)
var/obj/item/device/aicard/source_card = ai
var/obj/item/device/aicard/target_card = ai_card
if(istype(source_card) && istype(target_card))
if(target_card.grab_ai(ai_mob, user))
source_card.clear()
else
return 0
else
return 0
else
user.drop_from_inventory(ai)
ai.forceMove(src)
ai_card = ai
to_chat(ai_mob, "<font color='blue'>You have been transferred to \the [holder]'s [src].</font>")
to_chat(user, "<font color='blue'>You load [ai_mob] into \the [holder]'s [src].</font>")
integrated_ai = ai_mob
if(!(locate(integrated_ai) in ai_card))
integrated_ai = null
eject_ai()
else
to_chat(user, "<span class='warning'>There is no active AI within \the [ai].</span>")
else
to_chat(user, "<span class='warning'>There is no active AI within \the [ai].</span>")
update_verb_holder()
return

View File

@@ -0,0 +1,174 @@
/obj/item/rig_module/chem_dispenser
name = "mounted chemical dispenser"
desc = "A complex web of tubing and needles suitable for hardsuit use."
icon_state = "injector"
usable = 1
selectable = 0
toggleable = 0
disruptive = 0
engage_string = "Inject"
interface_name = "integrated chemical dispenser"
interface_desc = "Dispenses loaded chemicals directly into the wearer's bloodstream."
charges = list(
list("tricordrazine", "tricordrazine", 0, 80),
list("tramadol", "tramadol", 0, 80),
list("dexalin plus", "dexalinp", 0, 80),
list("antibiotics", "spaceacillin", 0, 80),
list("antitoxins", "anti_toxin", 0, 80),
list("nutrients", "glucose", 0, 80),
list("hyronalin", "hyronalin", 0, 80),
list("radium", "radium", 0, 80)
)
var/max_reagent_volume = 80 //Used when refilling.
/obj/item/rig_module/chem_dispenser/ninja
interface_desc = "Dispenses loaded chemicals directly into the wearer's bloodstream. This variant is made to be extremely light and flexible."
//Want more? Go refill. Gives the ninja another reason to have to show their face.
charges = list(
list("tricordrazine", "tricordrazine", 0, 30),
list("tramadol", "tramadol", 0, 30),
list("dexalin plus", "dexalinp", 0, 30),
list("antibiotics", "spaceacillin", 0, 30),
list("antitoxins", "anti_toxin", 0, 60),
list("nutrients", "glucose", 0, 80),
list("bicaridine", "bicaridine", 0, 30),
list("clotting agent", "myelamine", 0, 30),
list("peridaxon", "peridaxon", 0, 30),
list("hyronalin", "hyronalin", 0, 30),
list("radium", "radium", 0, 30)
)
/obj/item/rig_module/chem_dispenser/accepts_item(var/obj/item/input_item, var/mob/living/user)
if(!input_item.is_open_container())
return 0
if(!input_item.reagents || !input_item.reagents.total_volume)
to_chat(user, "\The [input_item] is empty.")
return 0
// Magical chemical filtration system, do not question it.
var/total_transferred = 0
for(var/datum/reagent/R in input_item.reagents.reagent_list)
for(var/chargetype in charges)
var/datum/rig_charge/charge = charges[chargetype]
if(charge.display_name == R.id)
var/chems_to_transfer = R.volume
if((charge.charges + chems_to_transfer) > max_reagent_volume)
chems_to_transfer = max_reagent_volume - charge.charges
charge.charges += chems_to_transfer
input_item.reagents.remove_reagent(R.id, chems_to_transfer)
total_transferred += chems_to_transfer
break
if(total_transferred)
to_chat(user, "<font color='blue'>You transfer [total_transferred] units into the suit reservoir.</font>")
else
to_chat(user, "<span class='danger'>None of the reagents seem suitable.</span>")
return 1
/obj/item/rig_module/chem_dispenser/engage(atom/target)
if(!..())
return 0
var/mob/living/carbon/human/H = holder.wearer
if(!charge_selected)
to_chat(H, "<span class='danger'>You have not selected a chemical type.</span>")
return 0
var/datum/rig_charge/charge = charges[charge_selected]
if(!charge)
return 0
var/chems_to_use = 10
if(charge.charges <= 0)
to_chat(H, "<span class='danger'>Insufficient chems!</span>")
return 0
else if(charge.charges < chems_to_use)
chems_to_use = charge.charges
var/mob/living/carbon/target_mob
if(target)
if(istype(target,/mob/living/carbon))
target_mob = target
else
return 0
else
target_mob = H
if(target_mob != H)
to_chat(H, "<span class='danger'>You inject [target_mob] with [chems_to_use] unit\s of [charge.display_name].</span>")
to_chat(target_mob, "<span class='danger'>You feel a rushing in your veins as [chems_to_use] unit\s of [charge.display_name] [chems_to_use == 1 ? "is" : "are"] injected.</span>")
target_mob.reagents.add_reagent(charge.display_name, chems_to_use)
charge.charges -= chems_to_use
if(charge.charges < 0) charge.charges = 0
return 1
/obj/item/rig_module/chem_dispenser/combat
name = "combat chemical injector"
desc = "A complex web of tubing and needles suitable for hardsuit use."
charges = list(
list("synaptizine", "synaptizine", 0, 30),
list("hyperzine", "hyperzine", 0, 30),
list("oxycodone", "oxycodone", 0, 30),
list("nutrients", "glucose", 0, 80),
list("clotting agent", "myelamine", 0, 80)
)
interface_name = "combat chem dispenser"
interface_desc = "Dispenses loaded chemicals directly into the bloodstream."
/obj/item/rig_module/chem_dispenser/injector
name = "mounted chemical injector"
desc = "A complex web of tubing and a large needle suitable for hardsuit use."
usable = 0
selectable = 1
disruptive = 1
interface_name = "mounted chem injector"
interface_desc = "Dispenses loaded chemicals via an arm-mounted injector."
/obj/item/rig_module/chem_dispenser/injector/advanced
charges = list(
list("tricordrazine", "tricordrazine", 0, 80),
list("tramadol", "tramadol", 0, 80),
list("dexalin plus", "dexalinp", 0, 80),
list("antibiotics", "spaceacillin", 0, 80),
list("antitoxins", "anti_toxin", 0, 80),
list("nutrients", "glucose", 0, 80),
list("hyronalin", "hyronalin", 0, 80),
list("radium", "radium", 0, 80),
list("clotting agent", "myelamine", 0, 80)
)
/obj/item/rig_module/chem_dispenser/injector/advanced/empty
charges = list(
list("tricordrazine", "tricordrazine", 0, 0),
list("tramadol", "tramadol", 0, 0),
list("dexalin plus", "dexalinp", 0, 0),
list("antibiotics", "spaceacillin", 0, 0),
list("antitoxins", "anti_toxin", 0, 0),
list("nutrients", "glucose", 0, 0),
list("hyronalin", "hyronalin", 0, 0),
list("radium", "radium", 0, 0),
list("clotting agent", "myelamine", 0, 0)
)

View File

@@ -0,0 +1,70 @@
/obj/item/rig_module/cleaner_launcher
name = "mounted space cleaner launcher"
desc = "A shoulder-mounted micro-cleaner dispenser."
selectable = 1
icon_state = "grenade_launcher"
interface_name = "integrated cleaner launcher"
interface_desc = "Discharges loaded cleaner grenades against the wearer's location."
var/fire_force = 30
var/fire_distance = 10
charges = list(
list("cleaner grenade", "cleaner grenade", /obj/item/weapon/grenade/chem_grenade/cleaner, 9),
)
/obj/item/rig_module/cleaner_launcher/accepts_item(var/obj/item/input_device, var/mob/living/user)
if(!istype(input_device) || !istype(user))
return 0
var/datum/rig_charge/accepted_item
for(var/charge in charges)
var/datum/rig_charge/charge_datum = charges[charge]
if(input_device.type == charge_datum.product_type)
accepted_item = charge_datum
break
if(!accepted_item)
return 0
if(accepted_item.charges >= 5)
to_chat(user, "<span class='danger'>Another grenade of that type will not fit into the module.</span>")
return 0
to_chat(user, "<font color='blue'><b>You slot \the [input_device] into the suit module.</b></font>")
user.drop_from_inventory(input_device)
qdel(input_device)
accepted_item.charges++
return 1
/obj/item/rig_module/cleaner_launcher/engage(atom/target)
if(!..())
return 0
if(!target)
return 0
var/mob/living/carbon/human/H = holder.wearer
if(!charge_selected)
to_chat(H, "<span class='danger'>You have not selected a grenade type.</span>")
return 0
var/datum/rig_charge/charge = charges[charge_selected]
if(!charge)
return 0
if(charge.charges <= 0)
to_chat(H, "<span class='danger'>Insufficient grenades!</span>")
return 0
charge.charges--
var/obj/item/weapon/grenade/new_grenade = new charge.product_type(get_turf(H))
H.visible_message("<span class='danger'>[H] launches \a [new_grenade]!</span>")
new_grenade.activate(H)
new_grenade.throw_at(target,fire_force,fire_distance)

View File

@@ -0,0 +1,53 @@
/obj/item/rig_module/stealth_field
name = "active camouflage module"
desc = "A robust hardsuit-integrated stealth module."
icon_state = "cloak"
toggleable = 1
disruptable = 1
disruptive = 0
use_power_cost = 50
active_power_cost = 10
passive_power_cost = 0
module_cooldown = 30
activate_string = "Enable Cloak"
deactivate_string = "Disable Cloak"
interface_name = "integrated stealth system"
interface_desc = "An integrated active camouflage system."
suit_overlay_active = "stealth_active"
suit_overlay_inactive = "stealth_inactive"
/obj/item/rig_module/stealth_field/activate()
if(!..())
return 0
var/mob/living/carbon/human/H = holder.wearer
to_chat(H, "<font color='blue'><b>You are now nearly invisible to normal detection.</b></font>")
H.alpha = 5
anim(get_turf(H), H, 'icons/effects/effects.dmi', "electricity",null,20,null)
H.visible_message("[H.name] vanishes into thin air!")
/obj/item/rig_module/stealth_field/deactivate()
if(!..())
return 0
var/mob/living/carbon/human/H = holder.wearer
to_chat(H, "<span class='danger'>You are now visible.</span>")
anim(get_turf(H), H,'icons/mob/mob.dmi',,"uncloak",,H.dir)
anim(get_turf(H), H, 'icons/effects/effects.dmi', "electricity",null,20,null)
H.alpha = initial(H.alpha)
H.visible_message("[H.name] appears from thin air!")
playsound(get_turf(H), 'sound/effects/stealthoff.ogg', 75, 1)

View File

@@ -0,0 +1,86 @@
/obj/item/rig_module/datajack
name = "datajack module"
desc = "A simple induction datalink module."
icon_state = "datajack"
toggleable = 1
activates_on_touch = 1
usable = 0
activate_string = "Enable Datajack"
deactivate_string = "Disable Datajack"
interface_name = "contact datajack"
interface_desc = "An induction-powered high-throughput datalink suitable for hacking encrypted networks."
var/list/stored_research
/obj/item/rig_module/datajack/New()
..()
stored_research = list()
/obj/item/rig_module/datajack/engage(atom/target)
if(!..())
return 0
if(target)
var/mob/living/carbon/human/H = holder.wearer
if(!accepts_item(target,H))
return 0
return 1
/obj/item/rig_module/datajack/accepts_item(var/obj/item/input_device, var/mob/living/user)
if(istype(input_device,/obj/item/weapon/disk/tech_disk))
to_chat(user, "You slot the disk into [src].")
var/obj/item/weapon/disk/tech_disk/disk = input_device
if(disk.stored)
if(load_data(disk.stored))
to_chat(user, "<font color='blue'>Download successful; disk erased.</font>")
disk.stored = null
else
to_chat(user, "<span class='warning'>The disk is corrupt. It is useless to you.</span>")
else
to_chat(user, "<span class='warning'>The disk is blank. It is useless to you.</span>")
return 1
// I fucking hate R&D code. This typecheck spam would be totally unnecessary in a sane setup. Sanity? This is BYOND.
else if(istype(input_device,/obj/machinery))
var/datum/research/incoming_files
if(istype(input_device,/obj/machinery/computer/rdconsole) ||\
istype(input_device,/obj/machinery/r_n_d/server) ||\
istype(input_device,/obj/machinery/mecha_part_fabricator))
incoming_files = input_device:files
if(!incoming_files || !incoming_files.known_tech || !incoming_files.known_tech.len)
to_chat(user, "<span class='warning'>Memory failure. There is nothing accessible stored on this terminal.</span>")
else
// Maybe consider a way to drop all your data into a target repo in the future.
if(load_data(incoming_files.known_tech))
to_chat(user, "<font color='blue'>Download successful; local and remote repositories synchronized.</font>")
else
to_chat(user, "<span class='warning'>Scan complete. There is nothing useful stored on this terminal.</span>")
return 1
return 0
/obj/item/rig_module/datajack/proc/load_data(var/incoming_data)
if(islist(incoming_data))
for(var/entry in incoming_data)
load_data(entry)
return 1
if(istype(incoming_data, /datum/tech))
var/data_found
var/datum/tech/new_data = incoming_data
for(var/datum/tech/current_data in stored_research)
if(current_data.id == new_data.id)
data_found = 1
if(current_data.level < new_data.level)
current_data.level = new_data.level
break
if(!data_found)
stored_research += incoming_data
return 1
return 0

View File

@@ -0,0 +1,176 @@
/obj/item/rig_module/device
name = "mounted device"
desc = "Some kind of hardsuit mount."
usable = 0
selectable = 1
toggleable = 0
disruptive = 0
var/device_type
var/obj/item/device
/obj/item/rig_module/device/New()
..()
if(device_type) device = new device_type(src)
/obj/item/rig_module/device/engage(atom/target)
if(!..() || !device)
return 0
if(!target)
device.attack_self(holder.wearer)
return 1
var/turf/T = get_turf(target)
if(istype(T) && !T.Adjacent(get_turf(src)))
return 0
var/resolved = target.attackby(device,holder.wearer)
if(!resolved && device && target)
device.afterattack(target,holder.wearer,1)
return 1
/obj/item/rig_module/device/flash
name = "mounted flash"
desc = "You are the law."
icon_state = "flash"
interface_name = "mounted flash"
interface_desc = "Stuns your target by blinding them with a bright light."
device_type = /obj/item/device/flash
/obj/item/rig_module/device/plasmacutter
name = "hardsuit plasma cutter"
desc = "A lethal-looking industrial cutter."
icon_state = "plasmacutter"
interface_name = "plasma cutter"
interface_desc = "A self-sustaining plasma arc capable of cutting through walls."
suit_overlay_active = "plasmacutter"
suit_overlay_inactive = "plasmacutter"
use_power_cost = 0.5
device_type = /obj/item/weapon/pickaxe/plasmacutter
/obj/item/rig_module/device/healthscanner
name = "health scanner module"
desc = "A hardsuit-mounted health scanner."
icon_state = "scanner"
interface_name = "health scanner"
interface_desc = "Shows an informative health readout when used on a subject."
device_type = /obj/item/device/healthanalyzer
/obj/item/rig_module/device/drill
name = "hardsuit drill mount"
desc = "A very heavy diamond-tipped drill."
icon_state = "drill"
interface_name = "mounted drill"
interface_desc = "A diamond-tipped industrial drill."
suit_overlay_active = "mounted-drill"
suit_overlay_inactive = "mounted-drill"
use_power_cost = 0.1
device_type = /obj/item/weapon/pickaxe/diamonddrill
/obj/item/rig_module/device/anomaly_scanner
name = "hardsuit anomaly scanner"
desc = "You think it's called an Elder Sarsparilla or something."
icon_state = "eldersasparilla"
interface_name = "Alden-Saraspova counter"
interface_desc = "An exotic particle detector commonly used by xenoarchaeologists."
engage_string = "Begin Scan"
usable = 1
selectable = 0
device_type = /obj/item/device/ano_scanner
/obj/item/rig_module/device/orescanner
name = "ore scanner module"
desc = "A clunky old ore scanner."
icon_state = "scanner"
interface_name = "ore detector"
interface_desc = "A sonar system for detecting large masses of ore."
engage_string = "Begin Scan"
usable = 1
selectable = 0
device_type = /obj/item/weapon/mining_scanner
/obj/item/rig_module/device/rcd
name = "RCD mount"
desc = "A cell-powered rapid construction device for a hardsuit."
icon_state = "rcd"
interface_name = "mounted RCD"
interface_desc = "A device for building or removing walls. Cell-powered."
usable = 1
engage_string = "Configure RCD"
device_type = /obj/item/weapon/rcd/electric/mounted/rig
/obj/item/rig_module/device/arch_drill
name = "archaeology drill mount"
desc = "A cell-powered fine-excavation device for a hardsuit."
icon_state = "exdrill"
interface_name = "mounted excavation tool"
interface_desc = "A device for excavating ancient relics."
usable = 1
engage_string = "Configure Drill Depth"
device_type = /obj/item/weapon/pickaxe/excavationdrill
/obj/item/rig_module/device/paperdispenser
name = "hardsuit paper dispenser"
desc = "Crisp sheets."
icon_state = "paper"
interface_name = "paper dispenser"
interface_desc = "Dispenses warm, clean, and crisp sheets of paper."
engage_string = "Dispense"
usable = 1
selectable = 0
device_type = /obj/item/weapon/paper_bin
/obj/item/rig_module/device/paperdispenser/engage(atom/target)
if(!..() || !device)
return 0
if(!target)
device.attack_hand(holder.wearer)
return 1
/obj/item/rig_module/device/pen
name = "mounted pen"
desc = "For mecha John Hancocks."
icon_state = "pen"
interface_name = "mounted pen"
interface_desc = "Signatures with style(tm)."
engage_string = "Change color"
usable = 1
device_type = /obj/item/weapon/pen/multi
/obj/item/rig_module/device/stamp
name = "mounted internal affairs stamp"
desc = "DENIED."
icon_state = "stamp"
interface_name = "mounted stamp"
interface_desc = "Leave your mark."
engage_string = "Toggle stamp type"
usable = 1
var/iastamp
var/deniedstamp
/obj/item/rig_module/device/stamp/New()
..()
iastamp = new /obj/item/weapon/stamp/internalaffairs(src)
deniedstamp = new /obj/item/weapon/stamp/denied(src)
device = iastamp
/obj/item/rig_module/device/stamp/engage(atom/target)
if(!..() || !device)
return 0
if(!target)
if(device == iastamp)
device = deniedstamp
to_chat(holder.wearer, "<span class='notice'>Switched to denied stamp.</span>")
else if(device == deniedstamp)
device = iastamp
to_chat(holder.wearer, "<span class='notice'>Switched to internal affairs stamp.</span>")
return 1

View File

@@ -0,0 +1,30 @@
/obj/item/rig_module/electrowarfare_suite
name = "electrowarfare module"
desc = "A bewilderingly complex bundle of fiber optics and chips."
icon_state = "ewar"
toggleable = 1
usable = 0
activate_string = "Enable Countermeasures"
deactivate_string = "Disable Countermeasures"
interface_name = "electrowarfare system"
interface_desc = "An active counter-electronic warfare suite that disrupts AI tracking."
/obj/item/rig_module/electrowarfare_suite/activate()
if(!..())
return
// This is not the best way to handle this, but I don't want it to mess with ling camo
var/mob/living/M = holder.wearer
M.digitalcamo++
/obj/item/rig_module/electrowarfare_suite/deactivate()
if(!..())
return
var/mob/living/M = holder.wearer
M.digitalcamo = max(0,(M.digitalcamo-1))

View File

@@ -0,0 +1,98 @@
/obj/item/rig_module/grenade_launcher
name = "mounted grenade launcher"
desc = "A shoulder-mounted micro-explosive dispenser."
selectable = 1
icon_state = "grenadelauncher"
interface_name = "integrated grenade launcher"
interface_desc = "Discharges loaded grenades against the wearer's location."
var/fire_force = 30
var/fire_distance = 10
charges = list(
list("flashbang", "flashbang", /obj/item/weapon/grenade/flashbang, 3),
list("smoke bomb", "smoke bomb", /obj/item/weapon/grenade/smokebomb, 3),
list("EMP grenade", "EMP grenade", /obj/item/weapon/grenade/empgrenade, 3),
)
/obj/item/rig_module/grenade_launcher/accepts_item(var/obj/item/input_device, var/mob/living/user)
if(!istype(input_device) || !istype(user))
return 0
var/datum/rig_charge/accepted_item
for(var/charge in charges)
var/datum/rig_charge/charge_datum = charges[charge]
if(input_device.type == charge_datum.product_type)
accepted_item = charge_datum
break
if(!accepted_item)
return 0
if(accepted_item.charges >= 5)
to_chat(user, "<span class='danger'>Another grenade of that type will not fit into the module.</span>")
return 0
to_chat(user, "<font color='blue'><b>You slot \the [input_device] into the suit module.</b></font>")
user.drop_from_inventory(input_device)
qdel(input_device)
accepted_item.charges++
return 1
/obj/item/rig_module/grenade_launcher/engage(atom/target)
if(!..())
return 0
if(!target)
return 0
var/mob/living/carbon/human/H = holder.wearer
if(!charge_selected)
to_chat(H, "<span class='danger'>You have not selected a grenade type.</span>")
return 0
var/datum/rig_charge/charge = charges[charge_selected]
if(!charge)
return 0
if(charge.charges <= 0)
to_chat(H, "<span class='danger'>Insufficient grenades!</span>")
return 0
charge.charges--
var/obj/item/weapon/grenade/new_grenade = new charge.product_type(get_turf(H))
H.visible_message("<span class='danger'>[H] launches \a [new_grenade]!</span>")
new_grenade.activate(H)
new_grenade.throw_at(target,fire_force,fire_distance)
/obj/item/rig_module/grenade_launcher/smoke
name = "mounted smoke-bomb launcher"
desc = "A shoulder-mounted smoke-bomb dispenser."
interface_name = "integrated smoke-bomb launcher"
interface_desc = "Discharges loaded smoke-bombs against the wearer's location."
fire_force = 15
charges = list(
list("smoke bomb", "smoke bomb", /obj/item/weapon/grenade/smokebomb, 6)
)
/obj/item/rig_module/grenade_launcher/flash
name = "mounted flashbang launcher"
desc = "A shoulder-mounted flashbang dispenser."
selectable = 1
icon_state = "grenadelauncher"
interface_name = "integrated flashbang launcher"
interface_desc = "Discharges loaded grenades against the wearer's location."
charges = list(
list("flashbang", "flashbang", /obj/item/weapon/grenade/flashbang, 3)
)

View File

@@ -0,0 +1,63 @@
/obj/item/rig_module/fabricator
name = "matter fabricator"
desc = "A self-contained microfactory system for hardsuit integration."
selectable = 1
usable = 1
use_power_cost = 15
icon_state = "enet"
engage_string = "Fabricate Star"
interface_name = "death blossom launcher"
interface_desc = "An integrated microfactory that produces poisoned throwing stars from thin air and electricity."
var/fabrication_type = /obj/item/weapon/material/star/ninja
var/fire_force = 30
var/fire_distance = 10
/obj/item/rig_module/fabricator/engage(atom/target)
if(!..())
return 0
var/mob/living/H = holder.wearer
if(target)
var/obj/item/firing = new fabrication_type()
firing.forceMove(get_turf(src))
H.visible_message("<span class='danger'>[H] launches \a [firing]!</span>")
firing.throw_at(target,fire_force,fire_distance)
else
if(H.l_hand && H.r_hand)
to_chat(H, "<span class='danger'>Your hands are full.</span>")
else
var/obj/item/new_weapon = new fabrication_type()
new_weapon.forceMove(H)
to_chat(H, "<font color='blue'><b>You quickly fabricate \a [new_weapon].</b></font>")
H.put_in_hands(new_weapon)
return 1
/obj/item/rig_module/fabricator/energy_net
name = "net projector"
desc = "Some kind of complex energy projector with a hardsuit mount."
icon_state = "enet"
interface_name = "energy net launcher"
interface_desc = "An advanced energy-patterning projector used to capture targets."
engage_string = "Fabricate Net"
fabrication_type = /obj/item/weapon/energy_net
use_power_cost = 70
/obj/item/rig_module/fabricator/energy_net/engage(atom/target)
if(holder && holder.wearer)
if(..(target) && target)
set_dir(get_dir(src,target)) // Face the target
holder.wearer.Beam(target,"n_beam",,10)
return 1
return 0

View File

@@ -0,0 +1,66 @@
/obj/item/rig_module/maneuvering_jets
name = "hardsuit maneuvering jets"
desc = "A compact gas thruster system for a hardsuit."
icon_state = "thrusters"
usable = 1
toggleable = 1
selectable = 0
disruptive = 0
suit_overlay_active = "maneuvering_active"
suit_overlay_inactive = null //"maneuvering_inactive"
engage_string = "Toggle Stabilizers"
activate_string = "Activate Thrusters"
deactivate_string = "Deactivate Thrusters"
interface_name = "maneuvering jets"
interface_desc = "An inbuilt EVA maneuvering system that runs off the rig air supply."
var/obj/item/weapon/tank/jetpack/rig/jets
/obj/item/rig_module/maneuvering_jets/engage()
if(!..())
return 0
jets.toggle_rockets()
return 1
/obj/item/rig_module/maneuvering_jets/activate()
if(active)
return 0
active = 1
spawn(1)
if(suit_overlay_active)
suit_overlay = suit_overlay_active
else
suit_overlay = null
holder.update_icon()
if(!jets.on)
jets.toggle()
return 1
/obj/item/rig_module/maneuvering_jets/deactivate()
if(!..())
return 0
if(jets.on)
jets.toggle()
return 1
/obj/item/rig_module/maneuvering_jets/New()
..()
jets = new(src)
/obj/item/rig_module/maneuvering_jets/installed()
..()
jets.holder = holder
jets.ion_trail.set_up(holder)
/obj/item/rig_module/maneuvering_jets/removed()
..()
jets.holder = null
jets.ion_trail.set_up(jets)

View File

@@ -0,0 +1,15 @@
/obj/item/rig_module/grenade_launcher/metalfoam
name = "mounted metalfoam grenade launcher"
desc = "A shoulder-mounted foam-bomb dispenser."
selectable = 1
icon_state = "grenadelauncher"
interface_name = "integrated metalfoam grenade launcher"
interface_desc = "Discharges loaded grenades against the wearer's location."
fire_force = 15
charges = list(
list("metalfoam", "metalfoam", /obj/item/weapon/grenade/chem_grenade/metalfoam, 5)
)

View File

@@ -0,0 +1,175 @@
/obj/item/rig_module/mounted
name = "mounted laser cannon"
desc = "A shoulder-mounted battery-powered laser cannon mount."
selectable = 1
usable = 1
module_cooldown = 0
icon_state = "lcannon"
engage_string = "Configure"
interface_name = "mounted laser cannon"
interface_desc = "A shoulder-mounted cell-powered laser cannon."
var/gun_type = /obj/item/weapon/gun/energy/lasercannon/mounted
var/obj/item/weapon/gun/gun
/obj/item/rig_module/mounted/New()
..()
gun = new gun_type(src)
/obj/item/rig_module/mounted/engage(atom/target)
if(!..())
return 0
if(!target)
gun.attack_self(holder.wearer)
return
gun.Fire(target,holder.wearer)
return 1
/obj/item/rig_module/mounted/egun
name = "mounted energy gun"
desc = "A forearm-mounted energy projector."
icon_state = "egun"
interface_name = "mounted energy gun"
interface_desc = "A forearm-mounted suit-powered energy gun."
gun_type = /obj/item/weapon/gun/energy/gun/mounted
/obj/item/rig_module/mounted/taser
name = "mounted taser"
desc = "A palm-mounted nonlethal energy projector."
icon_state = "taser"
usable = 0
suit_overlay_active = "mounted-taser"
suit_overlay_inactive = "mounted-taser"
interface_name = "mounted taser"
interface_desc = "A shoulder-mounted cell-powered taser."
gun_type = /obj/item/weapon/gun/energy/taser/mounted
/obj/item/rig_module/mounted/energy_blade
name = "energy blade projector"
desc = "A powerful cutting beam projector."
icon_state = "eblade"
activate_string = "Project Blade"
deactivate_string = "Cancel Blade"
interface_name = "spider fang blade"
interface_desc = "A lethal energy projector that can shape a blade projected from the hand of the wearer or launch radioactive darts."
usable = 0
selectable = 1
toggleable = 1
use_power_cost = 50
active_power_cost = 10
passive_power_cost = 0
gun_type = /obj/item/weapon/gun/energy/crossbow/ninja
/obj/item/rig_module/mounted/energy_blade/process()
if(holder && holder.wearer)
if(!(locate(/obj/item/weapon/melee/energy/blade) in holder.wearer))
deactivate()
return 0
return ..()
/obj/item/rig_module/mounted/energy_blade/activate()
..()
var/mob/living/M = holder.wearer
if(M.l_hand && M.r_hand)
to_chat(M, "<span class='danger'>Your hands are full.</span>")
deactivate()
return
var/obj/item/weapon/melee/energy/blade/blade = new(M)
blade.creator = M
M.put_in_hands(blade)
/obj/item/rig_module/mounted/energy_blade/deactivate()
..()
var/mob/living/M = holder.wearer
if(!M)
return
for(var/obj/item/weapon/melee/energy/blade/blade in M.contents)
M.drop_from_inventory(blade)
qdel(blade)
/obj/item/rig_module/mounted/mop
name = "mop projector"
desc = "A powerful mop projector."
icon_state = "mop"
activate_string = "Project Mop"
deactivate_string = "Cancel Mop"
interface_name = "mop projector"
interface_desc = "A mop that can be deployed from the hand of the wearer."
usable = 1
selectable = 1
toggleable = 1
use_power_cost = 5
active_power_cost = 0
passive_power_cost = 0
gun_type = /obj/item/weapon/gun/energy/temperature/mounted
/obj/item/rig_module/mounted/mop/process()
if(holder && holder.wearer)
if(!(locate(/obj/item/weapon/mop_deploy) in holder.wearer))
deactivate()
return 0
return ..()
/obj/item/rig_module/mounted/mop/activate()
..()
var/mob/living/M = holder.wearer
if(M.l_hand && M.r_hand)
to_chat(M, "<span class='danger'>Your hands are full.</span>")
deactivate()
return
var/obj/item/weapon/mop_deploy/blade = new(M)
blade.creator = M
M.put_in_hands(blade)
/obj/item/rig_module/mounted/mop/deactivate()
..()
var/mob/living/M = holder.wearer
if(!M)
return
for(var/obj/item/weapon/mop_deploy/blade in M.contents)
M.drop_from_inventory(blade)
qdel(blade)

View File

@@ -0,0 +1,129 @@
/obj/item/rig_module/power_sink
name = "hardsuit power sink"
desc = "An heavy-duty power sink."
icon_state = "powersink"
toggleable = 1
activates_on_touch = 1
disruptive = 0
activate_string = "Enable Power Sink"
deactivate_string = "Disable Power Sink"
interface_name = "niling d-sink"
interface_desc = "Colloquially known as a power siphon, this module drains power through the suit hands into the suit battery."
var/atom/interfaced_with // Currently draining power from this device.
var/total_power_drained = 0
var/drain_loc
/obj/item/rig_module/power_sink/deactivate()
if(interfaced_with)
if(holder && holder.wearer)
to_chat(holder.wearer, "<span class = 'warning'>Your power sink retracts as the module deactivates.</span>")
drain_complete()
interfaced_with = null
total_power_drained = 0
return ..()
/obj/item/rig_module/power_sink/activate()
interfaced_with = null
total_power_drained = 0
return ..()
/obj/item/rig_module/power_sink/engage(atom/target)
if(!..())
return 0
//Target wasn't supplied or we're already draining.
if(interfaced_with)
return 0
if(!target)
return 1
// Are we close enough?
var/mob/living/carbon/human/H = holder.wearer
if(!target.Adjacent(H))
return 0
// Is it a valid power source?
if(target.drain_power(1) <= 0)
return 0
to_chat(H, "<span class = 'danger'>You begin draining power from [target]!</span>")
interfaced_with = target
drain_loc = interfaced_with.loc
holder.spark_system.start()
playsound(H.loc, 'sound/effects/sparks2.ogg', 50, 1)
return 1
/obj/item/rig_module/power_sink/accepts_item(var/obj/item/input_device, var/mob/living/user)
var/can_drain = input_device.drain_power(1)
if(can_drain > 0)
engage(input_device)
return 1
return 0
/obj/item/rig_module/power_sink/process()
if(!interfaced_with)
return ..()
var/mob/living/carbon/human/H
if(holder && holder.wearer)
H = holder.wearer
if(!H || !istype(H))
return 0
holder.spark_system.start()
playsound(H.loc, 'sound/effects/sparks2.ogg', 50, 1)
H.break_cloak()
if(!holder.cell)
to_chat(H, "<span class = 'danger'>Your power sink flashes an error; there is no cell in your rig.</span>")
drain_complete(H)
return
if(!interfaced_with || !interfaced_with.Adjacent(H) || !(interfaced_with.loc == drain_loc))
to_chat(H, "<span class = 'warning'>Your power sink retracts into its casing.</span>")
drain_complete(H)
return
if(holder.cell.fully_charged())
to_chat(H, "<span class = 'warning'>Your power sink flashes an amber light; your rig cell is full.</span>")
drain_complete(H)
return
// Attempts to drain up to 12.5*cell-capacity kW, determines this value from remaining cell capacity to ensure we don't drain too much.
// 1Ws/(12.5*CELLRATE) = 40s to charge
var/to_drain = min(12.5*holder.cell.maxcharge, ((holder.cell.maxcharge - holder.cell.charge) / CELLRATE))
var/target_drained = interfaced_with.drain_power(0,0,to_drain)
if(target_drained <= 0)
to_chat(H, "<span class = 'danger'>Your power sink flashes a red light; there is no power left in [interfaced_with].</span>")
drain_complete(H)
return
holder.cell.give(target_drained * CELLRATE)
total_power_drained += target_drained
return
/obj/item/rig_module/power_sink/proc/drain_complete(var/mob/living/M)
if(!interfaced_with)
if(M)
to_chat(M, "<font color='blue'><b>Total power drained:</b> [round(total_power_drained*CELLRATE)] cell units.</font>")
else
if(M)
to_chat(M, "<font color='blue'><b>Total power drained from [interfaced_with]:</b> [round(total_power_drained*CELLRATE)] cell units.</font>")
interfaced_with.drain_power(0,1,0) // Damage the victim.
drain_loc = null
interfaced_with = null
total_power_drained = 0

View File

@@ -0,0 +1,50 @@
/obj/item/rig_module/self_destruct
name = "self-destruct module"
desc = "Oh my God, a bomb!"
icon_state = "deadman"
usable = 1
active = 1
permanent = 1
var/datum/effect/effect/system/smoke_spread/bad/smoke
var/smoke_strength = 8
engage_string = "Detonate"
interface_name = "dead man's switch"
interface_desc = "An integrated self-destruct module. When the wearer dies, they vanish in smoke. Do not press this button."
/obj/item/rig_module/self_destruct/New()
..()
src.smoke = new /datum/effect/effect/system/smoke_spread/bad()
src.smoke.attach(src)
/obj/item/rig_module/self_destruct/Destroy()
qdel(smoke)
smoke = null
return ..()
/obj/item/rig_module/self_destruct/activate()
return
/obj/item/rig_module/self_destruct/deactivate()
return
/obj/item/rig_module/self_destruct/process()
// Not being worn, leave it alone.
if(!holder || !holder.wearer || !holder.wearer.wear_suit == holder)
return 0
//OH SHIT.
if(holder.wearer.stat == 2)
engage(1)
/obj/item/rig_module/self_destruct/engage(var/skip_check)
if(!skip_check && usr && alert(usr, "Are you sure you want to push that button?", "Self-destruct", "No", "Yes") == "No")
return
if(holder && holder.wearer)
smoke.set_up(10, 0, holder.loc)
for(var/i = 1 to smoke_strength)
smoke.start(272727)
holder.wearer.ash()

View File

@@ -0,0 +1,43 @@
/obj/item/rig_module/sprinter
name = "sprint module"
desc = "A robust hardsuit-integrated sprint module."
icon_state = "sprinter"
var/sprint_speed = 1
toggleable = 1
disruptable = 1
disruptive = 0
use_power_cost = 50
active_power_cost = 5
passive_power_cost = 0
module_cooldown = 30
activate_string = "Enable Sprint"
deactivate_string = "Disable Sprint"
interface_name = "sprint system"
interface_desc = "Increases power to the suit's actuators, allowing faster movement."
/obj/item/rig_module/sprinter/activate()
if(!..())
return 0
var/mob/living/carbon/human/H = holder.wearer
to_chat(H, "<font color='blue'><b>You activate the suit's sprint mode.</b></font>")
holder.slowdown = initial(holder.slowdown) - sprint_speed
/obj/item/rig_module/sprinter/deactivate()
if(!..())
return 0
var/mob/living/carbon/human/H = holder.wearer
to_chat(H, "<span class='danger'>Your hardsuit returns to normal speed.</span>")
holder.slowdown = initial(holder.slowdown)

View File

@@ -0,0 +1,80 @@
/obj/item/rig_module/teleporter
name = "teleportation module"
desc = "A complex, sleek-looking, hardsuit-integrated teleportation module."
icon_state = "teleporter"
use_power_cost = 200
redundant = 1
usable = 1
selectable = 1
engage_string = "Emergency Leap"
interface_name = "VOID-shift phase projector"
interface_desc = "An advanced teleportation system. It is capable of pinpoint precision or random leaps forward."
/obj/item/rig_module/teleporter/proc/phase_in(var/mob/M,var/turf/T)
if(!M || !T)
return
holder.spark_system.start()
playsound(T, 'sound/effects/phasein.ogg', 25, 1)
playsound(T, 'sound/effects/sparks2.ogg', 50, 1)
anim(T,M,'icons/mob/mob.dmi',,"phasein",,M.dir)
/obj/item/rig_module/teleporter/proc/phase_out(var/mob/M,var/turf/T)
if(!M || !T)
return
playsound(T, "sparks", 50, 1)
anim(T,M,'icons/mob/mob.dmi',,"phaseout",,M.dir)
/obj/item/rig_module/teleporter/engage(var/atom/target, var/notify_ai)
var/mob/living/carbon/human/H = holder.wearer
if(!istype(H.loc, /turf))
to_chat(H, "<span class='warning'>You cannot teleport out of your current location.</span>")
return 0
var/turf/T
if(target)
T = get_turf(target)
else
T = get_teleport_loc(get_turf(H), H, 6, 1, 1, 1)
if(!T)
to_chat(H, "<span class='warning'>No valid teleport target found.</span>")
return 0
if(T.density)
to_chat(H, "<span class='warning'>You cannot teleport into solid walls.</span>")
return 0
if(T.z in using_map.admin_levels)
to_chat(H, "<span class='warning'>You cannot use your teleporter on this Z-level.</span>")
return 0
if(T.contains_dense_objects())
to_chat(H, "<span class='warning'>You cannot teleport to a location with solid objects.</span>")
return 0
if(T.z != H.z || get_dist(T, get_turf(H)) > world.view)
to_chat(H, "<span class='warning'>You cannot teleport to such a distant object.</span>")
return 0
if(!..()) return 0
phase_out(H,get_turf(H))
H.forceMove(T)
phase_in(H,get_turf(H))
for(var/obj/item/weapon/grab/G in H.contents)
if(G.affecting)
phase_out(G.affecting,get_turf(G.affecting))
G.affecting.forceMove(locate(T.x+rand(-1,1),T.y+rand(-1,1),T.z))
phase_in(G.affecting,get_turf(G.affecting))
return 1

View File

@@ -0,0 +1,237 @@
/*
* Contains
* /obj/item/rig_module/vision
* /obj/item/rig_module/vision/multi
* /obj/item/rig_module/vision/meson
* /obj/item/rig_module/vision/thermal
* /obj/item/rig_module/vision/nvg
* /obj/item/rig_module/vision/medhud
* /obj/item/rig_module/vision/sechud
*/
/datum/rig_vision
var/mode
var/obj/item/clothing/glasses/glasses
/datum/rig_vision/nvg
mode = "night vision"
/datum/rig_vision/nvg/New()
glasses = new /obj/item/clothing/glasses/night
/datum/rig_vision/thermal
mode = "thermal scanner"
/datum/rig_vision/thermal/New()
glasses = new /obj/item/clothing/glasses/thermal
/datum/rig_vision/meson
mode = "meson scanner"
/datum/rig_vision/meson/New()
glasses = new /obj/item/clothing/glasses/meson
/datum/rig_vision/sechud
mode = "security HUD"
/datum/rig_vision/sechud/New()
glasses = new /obj/item/clothing/glasses/hud/security
/datum/rig_vision/medhud
mode = "medical HUD"
/datum/rig_vision/medhud/New()
glasses = new /obj/item/clothing/glasses/hud/health
/datum/rig_vision/material
mode = "material scanner"
/datum/rig_vision/material/New()
glasses = new /obj/item/clothing/glasses/material
/obj/item/rig_module/vision
name = "hardsuit visor"
desc = "A layered, translucent visor system for a hardsuit."
icon_state = "optics"
interface_name = "optical scanners"
interface_desc = "An integrated multi-mode vision system."
usable = 1
toggleable = 1
disruptive = 0
module_cooldown = 0
engage_string = "Cycle Visor Mode"
activate_string = "Enable Visor"
deactivate_string = "Disable Visor"
var/datum/rig_vision/vision
var/list/vision_modes = list(
/datum/rig_vision/nvg,
/datum/rig_vision/thermal,
/datum/rig_vision/meson
)
var/vision_index
/obj/item/rig_module/vision/multi
name = "hardsuit optical package"
desc = "A complete visor system of optical scanners and vision modes."
icon_state = "fulloptics"
interface_name = "multi optical visor"
interface_desc = "An integrated multi-mode vision system."
vision_modes = list(/datum/rig_vision/meson,
/datum/rig_vision/material,
/datum/rig_vision/nvg,
/datum/rig_vision/thermal,
/datum/rig_vision/sechud,
/datum/rig_vision/medhud)
/obj/item/rig_module/vision/meson
name = "hardsuit meson scanner"
desc = "A layered, translucent visor system for a hardsuit."
icon_state = "meson"
usable = 0
interface_name = "meson scanner"
interface_desc = "An integrated meson scanner."
vision_modes = list(/datum/rig_vision/meson)
/obj/item/rig_module/vision/material
name = "hardsuit material scanner"
desc = "A layered, translucent visor system for a hardsuit."
icon_state = "meson"
usable = 0
interface_name = "material scanner"
interface_desc = "An integrated material scanner."
vision_modes = list(/datum/rig_vision/material)
/obj/item/rig_module/vision/mining
name = "hardsuit mining scanners"
desc = "A layered, translucent visor system for a hardsuit."
icon_state = "optics"
usable = 0
interface_name = "mining scanners"
interface_desc = "An integrated mining scanner array."
vision_modes = list(/datum/rig_vision/material,
/datum/rig_vision/meson)
/obj/item/rig_module/vision/thermal
name = "hardsuit thermal scanner"
desc = "A layered, translucent visor system for a hardsuit."
icon_state = "thermal"
usable = 0
interface_name = "thermal scanner"
interface_desc = "An integrated thermal scanner."
vision_modes = list(/datum/rig_vision/thermal)
/obj/item/rig_module/vision/nvg
name = "hardsuit night vision interface"
desc = "A multi input night vision system for a hardsuit."
icon_state = "night"
usable = 0
interface_name = "night vision interface"
interface_desc = "An integrated night vision system."
vision_modes = list(/datum/rig_vision/nvg)
/obj/item/rig_module/vision/sechud
name = "hardsuit security hud"
desc = "A simple tactical information system for a hardsuit."
icon_state = "securityhud"
usable = 0
interface_name = "security HUD"
interface_desc = "An integrated security heads up display."
vision_modes = list(/datum/rig_vision/sechud)
/obj/item/rig_module/vision/medhud
name = "hardsuit medical hud"
desc = "A simple medical status indicator for a hardsuit."
icon_state = "healthhud"
usable = 0
interface_name = "medical HUD"
interface_desc = "An integrated medical heads up display."
vision_modes = list(/datum/rig_vision/medhud)
// There should only ever be one vision module installed in a suit.
/obj/item/rig_module/vision/installed()
..()
holder.visor = src
/obj/item/rig_module/vision/engage()
if(!..() || !vision_modes)
return 0
// Don't cycle if this engage() is being called by activate().
if(!active)
to_chat(holder.wearer, "<font color='blue'>You activate your visual sensors.</font>")
return 1
if(vision_modes.len > 1)
vision_index++
if(vision_index > vision_modes.len)
vision_index = 1
vision = vision_modes[vision_index]
to_chat(holder.wearer, "<font color='blue'>You cycle your sensors to <b>[vision.mode]</b> mode.</font>")
else
to_chat(holder.wearer, "<font color='blue'>Your sensors only have one mode.</font>")
return 1
/obj/item/rig_module/vision/activate()
if((. = ..()) && holder.wearer)
holder.wearer.recalculate_vis()
/obj/item/rig_module/vision/deactivate()
if((. = ..()) && holder.wearer)
holder.wearer.recalculate_vis()
/obj/item/rig_module/vision/New()
..()
if(!vision_modes)
return
vision_index = 1
var/list/processed_vision = list()
for(var/vision_mode in vision_modes)
var/datum/rig_vision/vision_datum = new vision_mode
if(!vision) vision = vision_datum
processed_vision += vision_datum
vision_modes = processed_vision

View File

@@ -0,0 +1,52 @@
/obj/item/rig_module/voice
name = "hardsuit voice synthesiser"
desc = "A speaker box and sound processor."
icon_state = "megaphone"
usable = 1
selectable = 0
toggleable = 0
disruptive = 0
engage_string = "Configure Synthesiser"
interface_name = "voice synthesiser"
interface_desc = "A flexible and powerful voice modulator system."
var/obj/item/voice_changer/voice_holder
/obj/item/rig_module/voice/New()
..()
voice_holder = new(src)
voice_holder.active = 0
/obj/item/rig_module/voice/installed()
..()
holder.speech = src
/obj/item/rig_module/voice/engage()
if(!..())
return 0
var/choice= input("Would you like to toggle the synthesiser or set the name?") as null|anything in list("Enable","Disable","Set Name")
if(!choice)
return 0
switch(choice)
if("Enable")
active = 1
voice_holder.active = 1
to_chat(usr, "<font color='blue'>You enable the speech synthesiser.</font>")
if("Disable")
active = 0
voice_holder.active = 0
to_chat(usr, "<font color='blue'>You disable the speech synthesiser.</font>")
if("Set Name")
var/raw_choice = sanitize(input(usr, "Please enter a new name.") as text|null, MAX_NAME_LEN)
if(!raw_choice)
return 0
voice_holder.voice = raw_choice
to_chat(usr, "<font color='blue'>You are now mimicking <B>[voice_holder.voice]</B>.</font>")
return 1

View File

@@ -5,6 +5,7 @@
* /obj/item/rig_module/device/drill * /obj/item/rig_module/device/drill
* /obj/item/rig_module/device/orescanner * /obj/item/rig_module/device/orescanner
* /obj/item/rig_module/device/rcd * /obj/item/rig_module/device/rcd
* /obj/item/rig_module/device/arch_drill
* /obj/item/rig_module/device/anomaly_scanner * /obj/item/rig_module/device/anomaly_scanner
* /obj/item/rig_module/maneuvering_jets * /obj/item/rig_module/maneuvering_jets
* /obj/item/rig_module/foam_sprayer * /obj/item/rig_module/foam_sprayer
@@ -96,6 +97,17 @@
device_type = /obj/item/weapon/rcd/electric/mounted/rig device_type = /obj/item/weapon/rcd/electric/mounted/rig
/obj/item/rig_module/device/arch_drill
name = "archaeology drill mount"
desc = "A cell-powered fine-excavation device for a hardsuit."
icon_state = "exdrill"
interface_name = "mounted excavation tool"
interface_desc = "A device for excavating ancient relics."
usable = 1
engage_string = "Configure Drill Depth"
device_type = /obj/item/weapon/pickaxe/excavationdrill
/obj/item/rig_module/device/New() /obj/item/rig_module/device/New()
..() ..()
if(device_type) device = new device_type(src) if(device_type) device = new device_type(src)
@@ -117,8 +129,6 @@
device.afterattack(target,holder.wearer,1) device.afterattack(target,holder.wearer,1)
return 1 return 1
/obj/item/rig_module/chem_dispenser /obj/item/rig_module/chem_dispenser
name = "mounted chemical dispenser" name = "mounted chemical dispenser"
desc = "A complex web of tubing and needles suitable for hardsuit use." desc = "A complex web of tubing and needles suitable for hardsuit use."
@@ -418,29 +428,14 @@
interface_name = "mop projector" interface_name = "mop projector"
interface_desc = "A mop that can be deployed from the hand of the wearer." interface_desc = "A mop that can be deployed from the hand of the wearer."
usable = 0 usable = 1
selectable = 1 selectable = 1
toggleable = 1 toggleable = 1
use_power_cost = 0 use_power_cost = 5
active_power_cost = 0 active_power_cost = 0
passive_power_cost = 0 passive_power_cost = 0
gun = /obj/item/weapon/reagent_containers/spray/cleaner gun_type = /obj/item/weapon/gun/energy/temperature/mounted
//obj/item/weapon/reagent_containers/spray/cleaner
// spary =
/obj/item/rig_module/mounted/engage(atom/target)
if(!..())
return 0
if(!target)
gun.attack_self(holder.wearer)
return 1
gun.Fire(target,holder.wearer)
return 1
/obj/item/rig_module/mounted/mop/process() /obj/item/rig_module/mounted/mop/process()
@@ -655,4 +650,4 @@
to_chat(H, "<span class='danger'>Your hardsuit returns to normal speed.</span>") to_chat(H, "<span class='danger'>Your hardsuit returns to normal speed.</span>")
holder.slowdown = initial(holder.slowdown) holder.slowdown = initial(holder.slowdown)

View File

@@ -0,0 +1,29 @@
//Mining suit
/obj/item/weapon/rig/robotics
name = "advanced suit control belt"
suit_type = "advanced suit"
desc = "A lightweight suit combining the utility of a RIG with the wearability of a voidsuit."
icon_state = "void_explorer2"
slot_flags = SLOT_BELT
armor = list(melee = 40, bullet = 30, laser = 20, energy = 15, bomb = 30, bio = 100, rad = 50)
slowdown = 1
offline_slowdown = 2
offline_vision_restriction = 0
emp_protection = -20
siemens_coefficient= 0.75
rigsuit_max_pressure = 8 * ONE_ATMOSPHERE
rigsuit_min_pressure = 0
chest_type = /obj/item/clothing/suit/space/rig
helm_type = /obj/item/clothing/head/helmet/space/rig
boot_type = null
glove_type = null
cell_type = null
allowed = list(
/obj/item/device/flashlight,
/obj/item/weapon/storage/box
)
req_access = list()
req_one_access = list()

View File

@@ -28,6 +28,10 @@
name = "stack of plastic" name = "stack of plastic"
type_to_spawn = /obj/item/stack/material/plastic type_to_spawn = /obj/item/stack/material/plastic
/obj/fiftyspawner/graphite
name = "stack of graphite"
type_to_spawn = /obj/item/stack/material/graphite
/obj/fiftyspawner/gold /obj/fiftyspawner/gold
name = "stack of gold" name = "stack of gold"
type_to_spawn = /obj/item/stack/material/gold type_to_spawn = /obj/item/stack/material/gold

View File

@@ -136,6 +136,13 @@
default_type = "plastic" default_type = "plastic"
no_variants = FALSE no_variants = FALSE
/obj/item/stack/material/graphite
name = "graphite"
icon_state = "sheet-silver"
default_type = MAT_GRAPHITE
apply_colour = 1
no_variants = FALSE
/obj/item/stack/material/gold /obj/item/stack/material/gold
name = "gold" name = "gold"
icon_state = "sheet-gold" icon_state = "sheet-gold"

View File

@@ -652,6 +652,22 @@ var/list/name_to_material
stack_type = null stack_type = null
shard_type = SHARD_NONE shard_type = SHARD_NONE
/material/graphite
name = MAT_GRAPHITE
stack_type = /obj/item/stack/material/graphite
flags = MATERIAL_BRITTLE
icon_base = "solid"
icon_reinf = "reinf_mesh"
icon_colour = "#333333"
hardness = 75
weight = 15
integrity = 175
protectiveness = 15
conductivity = 18
melting_point = T0C+3600
radiation_resistance = 15
stack_origin_tech = list(TECH_MATERIAL = 2, TECH_MAGNET = 2)
/material/osmium /material/osmium
name = "osmium" name = "osmium"
stack_type = /obj/item/stack/material/osmium stack_type = /obj/item/stack/material/osmium

View File

@@ -51,6 +51,7 @@ var/global/list/ore_data = list()
name = "carbon" name = "carbon"
display_name = "raw carbon" display_name = "raw carbon"
smelts_to = "plastic" smelts_to = "plastic"
compresses_to = "graphite"
alloy = 1 alloy = 1
result_amount = 5 result_amount = 5
spread_chance = 25 spread_chance = 25

View File

@@ -363,6 +363,11 @@
if(!rig.offline && (rig.air_supply && internal == rig.air_supply)) if(!rig.offline && (rig.air_supply && internal == rig.air_supply))
rig_supply = rig.air_supply rig_supply = rig.air_supply
else if(istype(belt,/obj/item/weapon/rig))
var/obj/item/weapon/rig/rig = belt
if(!rig.offline && (rig.air_supply && internal == rig.air_supply))
rig_supply = rig.air_supply
if ((!rig_supply && !contents.Find(internal)) || !((wear_mask && (wear_mask.item_flags & AIRTIGHT)) || (head && (head.item_flags & AIRTIGHT)))) if ((!rig_supply && !contents.Find(internal)) || !((wear_mask && (wear_mask.item_flags & AIRTIGHT)) || (head && (head.item_flags & AIRTIGHT))))
internal = null internal = null

View File

@@ -12,3 +12,7 @@
list(mode_name="endothermic beam", projectile_type = /obj/item/projectile/temp, charge_cost = 240), list(mode_name="endothermic beam", projectile_type = /obj/item/projectile/temp, charge_cost = 240),
list(mode_name="exothermic beam", projectile_type = /obj/item/projectile/temp/hot, charge_cost = 240), list(mode_name="exothermic beam", projectile_type = /obj/item/projectile/temp/hot, charge_cost = 240),
) )
/obj/item/weapon/gun/energy/temperature/mounted
self_recharge = 1
use_external_power = 1

View File

@@ -16,9 +16,9 @@ using metal and glass, it uses glass and reagents (usually sulphuric acid).
var/mat_efficiency = 1 var/mat_efficiency = 1
var/speed = 1 var/speed = 1
materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, MAT_PLASTEEL = 0, "plastic" = 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) 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)
hidden_materials = list(MAT_PLASTEEL, MAT_DURASTEEL, MAT_VERDANTIUM, MAT_MORPHIUM, MAT_METALHYDROGEN, MAT_SUPERMATTER) hidden_materials = list(MAT_PLASTEEL, MAT_DURASTEEL, MAT_GRAPHITE, MAT_VERDANTIUM, MAT_MORPHIUM, MAT_METALHYDROGEN, MAT_SUPERMATTER)
use_power = 1 use_power = 1
idle_power_usage = 30 idle_power_usage = 30

View File

@@ -769,3 +769,249 @@
req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 6, TECH_MAGNET = 3, TECH_POWER = 2) req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 6, TECH_MAGNET = 3, TECH_POWER = 2)
materials = list(DEFAULT_WALL_MATERIAL = 15000, "silver" = 3000, "plastic" = 3000, "osmium" = 1000) materials = list(DEFAULT_WALL_MATERIAL = 15000, "silver" = 3000, "plastic" = 3000, "osmium" = 1000)
build_path = /obj/item/weapon/vehicle_assembly/quadbike build_path = /obj/item/weapon/vehicle_assembly/quadbike
/*
* Rigsuits
*/
/datum/design/item/mechfab/rigsuit
category = "Rigsuit"
req_tech = list(TECH_MATERIAL = 6, TECH_ENGINEERING = 5, TECH_PHORON = 3, TECH_MAGNET = 4, TECH_POWER = 6)
/datum/design/item/mechfab/rigsuit/basic_belt
name = "Advanced Suit Control Belt"
desc = "A belt holding a compressed space-suit."
id = "rigmodule_belt_basic"
materials = list(MAT_PLASTEEL = 12000, MAT_GOLD = 3000, MAT_GRAPHITE = 3000, MAT_OSMIUM = 1000, MAT_PLASTIC = 5000)
build_path = /obj/item/weapon/rig/robotics
/datum/design/item/mechfab/rigsuit/jetpack
name = "hardsuit maneuvering jets"
desc = "A compact gas thruster system for a hardsuit."
id = "rig_thrusters"
materials = list(MAT_PLASTEEL = 1000, MAT_GOLD = 1000, MAT_GRAPHITE = 1000, MAT_PLASTIC = 500)
build_path = /obj/item/rig_module/maneuvering_jets
/datum/design/item/mechfab/rigsuit/powersink
name = "hardsuit power siphon"
desc = "A complex device used to pull power from machines."
id = "rig_siphon"
req_tech = list(TECH_MATERIAL = 7, TECH_ENGINEERING = 5, TECH_PHORON = 4, TECH_MAGNET = 5, TECH_POWER = 6, TECH_ILLEGAL = 3)
materials = list(MAT_PLASTEEL = 3000, MAT_METALHYDROGEN = 1000, MAT_GRAPHITE = 1000, MAT_PLASTIC = 5000, MAT_PHORON = 2000, MAT_VERDANTIUM = 1500)
build_path = /obj/item/rig_module/power_sink
/datum/design/item/mechfab/rigsuit/flash
name = "hardsuit mounted flash"
desc = "A suit-mounted flash."
id = "rig_device_flash"
req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 3, TECH_MAGNET = 4, TECH_POWER = 4)
materials = list(MAT_PLASTEEL = 2000, MAT_PLASTIC = 3000, MAT_METALHYDROGEN = 200, MAT_GRAPHITE = 500)
build_path = /obj/item/rig_module/device/flash
/datum/design/item/mechfab/rigsuit/plasmacutter
name = "hardsuit mounted plasmacutter"
desc = "A suit-mounted plasmacutter."
id = "rig_device_plasmacutter"
req_tech = list(TECH_MATERIAL = 6, TECH_ENGINEERING = 3, TECH_MAGNET = 4, TECH_PHORON = 3, TECH_POWER = 4)
materials = list(MAT_PLASTEEL = 3000, MAT_PLASTIC = 3000, MAT_PHORON = 2500, MAT_GRAPHITE = 500)
build_path = /obj/item/rig_module/device/plasmacutter
/datum/design/item/mechfab/rigsuit/healthanalyzer
name = "hardsuit health analyzer"
desc = "A hardsuit mounted health analyzer."
id = "rig_device_healthanalyzer"
req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3, TECH_BIO = 4, TECH_POWER = 4)
materials = list(MAT_PLASTEEL = 1000, MAT_SILVER = 1000, MAT_GRAPHITE = 1000, MAT_PLASTIC = 500)
build_path = /obj/item/rig_module/device/healthscanner
/datum/design/item/mechfab/rigsuit/drill
name = "hardsuit mounted drill"
desc = "A hardsuit mounted drill."
id = "rig_device_drill"
req_tech = list(TECH_MATERIAL = 7, TECH_ENGINEERING = 5, TECH_MAGNET = 5, TECH_POWER = 4)
materials = list(MAT_PLASTEEL = 1500, MAT_DIAMOND = 2500, MAT_GRAPHITE = 1000, MAT_PLASTIC = 500)
build_path = /obj/item/rig_module/device/drill
/datum/design/item/mechfab/rigsuit/excdrill
name = "hardsuit mounted excavation drill"
desc = "A hardsuit mounted excavation drill."
id = "rig_device_excdrill"
req_tech = list(TECH_MATERIAL = 7, TECH_ENGINEERING = 6, TECH_MAGNET = 5, TECH_POWER = 5, TECH_ARCANE = 1)
materials = list(MAT_PLASTEEL = 1500, MAT_DIAMOND = 2000, MAT_GRAPHITE = 1500, MAT_PLASTIC = 1000)
build_path = /obj/item/rig_module/device/arch_drill
/datum/design/item/mechfab/rigsuit/anomscanner
name = "hardsuit mounted anomaly scanner"
desc = "A suit-mounted anomaly scanner."
id = "rig_device_anomscanner"
req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 3, TECH_MAGNET = 4, TECH_POWER = 4)
materials = list(MAT_PLASTEEL = 2000, MAT_PLASTIC = 3000, MAT_METALHYDROGEN = 200, MAT_GRAPHITE = 500)
build_path = /obj/item/rig_module/device/anomaly_scanner
/datum/design/item/mechfab/rigsuit/orescanner
name = "hardsuit mounted ore scanner"
desc = "A suit-mounted ore scanner."
id = "rig_device_orescanner"
req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3, TECH_MAGNET = 3, TECH_POWER = 3)
materials = list(MAT_PLASTEEL = 2000, MAT_PLASTIC = 2000, MAT_GRAPHITE = 500)
build_path = /obj/item/rig_module/device/orescanner
/datum/design/item/mechfab/rigsuit/rcd
name = "hardsuit mounted rcd"
desc = "A suit-mounted rcd."
id = "rig_device_rcd"
req_tech = list(TECH_MATERIAL = 7, TECH_ENGINEERING = 3, TECH_MAGNET = 4, TECH_PHORON = 3, TECH_POWER = 4)
materials = list(MAT_PLASTEEL = 5000, MAT_URANIUM = 3000, MAT_PHORON = 2000, MAT_GRAPHITE = 1500)
build_path = /obj/item/rig_module/device/rcd
/datum/design/item/mechfab/rigsuit/paperdispenser
name = "hardsuit mounted paper dispenser"
desc = "A suit-mounted paper dispenser."
id = "rig_device_paperdispenser"
req_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 2, TECH_MAGNET = 2, TECH_BIO = 2, TECH_POWER = 2)
materials = list(MAT_PLASTEEL = 1000, MAT_PLASTIC = 500, MAT_PHORON = 500, MAT_GRAPHITE = 100)
build_path = /obj/item/rig_module/device/paperdispenser
/datum/design/item/mechfab/rigsuit/pen
name = "hardsuit mounted pen"
desc = "A suit-mounted pen."
id = "rig_device_pen"
req_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 2, TECH_MAGNET = 2, TECH_BIO = 2, TECH_POWER = 2)
materials = list(MAT_PLASTEEL = 1000, MAT_PLASTIC = 500, MAT_PHORON = 500, MAT_GRAPHITE = 100)
build_path = /obj/item/rig_module/device/pen
/datum/design/item/mechfab/rigsuit/grenade_metalfoam
name = "hardsuit metalfoam-bomb launcher"
desc = "A compact metalfoam grenade system for a hardsuit."
id = "rig_grenade_metalfoam"
req_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 3, TECH_MAGNET = 2, TECH_POWER = 3)
materials = list(MAT_PLASTEEL = 2000, MAT_OSMIUM = 1000, MAT_GRAPHITE = 1500, MAT_PLASTIC = 500)
build_path = /obj/item/rig_module/grenade_launcher/metalfoam
/datum/design/item/mechfab/rigsuit/grenade_flash
name = "hardsuit flashbang launcher"
desc = "A compact flashbang grenade system for a hardsuit."
id = "rig_grenade_flashbang"
req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 5, TECH_PHORON = 3, TECH_MAGNET = 4, TECH_POWER = 5, TECH_COMBAT = 4)
materials = list(MAT_PLASTEEL = 2000, MAT_OSMIUM = 1500, MAT_GRAPHITE = 1000, MAT_PLASTIC = 1000)
build_path = /obj/item/rig_module/grenade_launcher/flash
/datum/design/item/mechfab/rigsuit/grenade_cleanfoam
name = "hardsuit cleaning-foam-bomb launcher"
desc = "A compact cleaning-foam grenade system for a hardsuit."
id = "rig_grenade_cleanfoam"
req_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 3, TECH_BIO = 2, TECH_POWER = 2)
materials = list(MAT_PLASTEEL = 2000, MAT_GLASS = 1000, MAT_GRAPHITE = 1500, MAT_PLASTIC = 750)
build_path = /obj/item/rig_module/cleaner_launcher
/datum/design/item/mechfab/rigsuit/taser
name = "hardsuit taser"
desc = "A compact taser system for a hardsuit."
id = "rig_gun_taser"
req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 3, TECH_MAGNET = 2, TECH_POWER = 3, TECH_COMBAT = 2)
materials = list(MAT_PLASTEEL = 2000, MAT_GRAPHITE = 1500, MAT_PLASTIC = 500)
build_path = /obj/item/rig_module/mounted/taser
/datum/design/item/mechfab/rigsuit/egun
name = "hardsuit egun"
desc = "A compact egun system for a hardsuit."
id = "rig_gun_egun"
req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 4, TECH_MAGNET = 3, TECH_POWER = 4, TECH_COMBAT = 4)
materials = list(MAT_PLASTEEL = 2000, MAT_GOLD = 1250, MAT_GRAPHITE = 1500, MAT_PLASTIC = 500)
build_path = /obj/item/rig_module/mounted/egun
/datum/design/item/mechfab/rigsuit/mop
name = "hardsuit intense cleaning device"
desc = "An advanced cleaning device."
id = "rig_gun_tempgun"
req_tech = list(TECH_MATERIAL = 6, TECH_ENGINEERING = 4, TECH_MAGNET = 5, TECH_POWER = 4, TECH_COMBAT = 6)
materials = list(MAT_PLASTEEL = 2000, MAT_GOLD = 1750, MAT_URANIUM = 1500, MAT_GRAPHITE = 1500, MAT_PLASTIC = 1000)
build_path = /obj/item/rig_module/mounted/mop
/datum/design/item/mechfab/rigsuit/sprinter
name = "hardsuit overclocker"
desc = "A compact overclocking system for a hardsuit."
id = "rig_component_sprinter"
req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 5, TECH_BIO = 4, TECH_POWER = 4)
materials = list(MAT_PLASTEEL = 2000, MAT_GRAPHITE = 1500, MAT_PLASTIC = 500, MAT_VERDANTIUM = 1000)
build_path = /obj/item/rig_module/sprinter
/datum/design/item/mechfab/rigsuit/meson
name = "hardsuit meson visor"
desc = "A compact meson visor for a hardsuit."
id = "rig_component_meson"
req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 5, TECH_MAGNET = 3, TECH_POWER = 4)
materials = list(MAT_PLASTEEL = 2000, MAT_GRAPHITE = 1500, MAT_OSMIUM = 500)
build_path = /obj/item/rig_module/vision/meson
/datum/design/item/mechfab/rigsuit/material
name = "hardsuit material visor"
desc = "A compact material visor for a hardsuit."
id = "rig_component_material"
req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 5, TECH_MAGNET = 3, TECH_POWER = 4)
materials = list(MAT_PLASTEEL = 2000, MAT_GRAPHITE = 1500, MAT_OSMIUM = 500)
build_path = /obj/item/rig_module/vision/material
/datum/design/item/mechfab/rigsuit/nvg
name = "hardsuit night-vision visor"
desc = "A compact night-vision visor for a hardsuit."
id = "rig_component_nvg"
req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 6, TECH_MAGNET = 4, TECH_POWER = 5)
materials = list(MAT_PLASTEEL = 2000, MAT_GRAPHITE = 1500, MAT_OSMIUM = 500, MAT_URANIUM = 1000)
build_path = /obj/item/rig_module/vision/nvg
/datum/design/item/mechfab/rigsuit/sechud
name = "hardsuit security visor"
desc = "A compact security visor for a hardsuit."
id = "rig_component_sechud"
req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3, TECH_MAGNET = 3, TECH_POWER = 2)
materials = list(MAT_PLASTEEL = 2000, MAT_GRAPHITE = 1500, MAT_PLASTIC = 500, MAT_SILVER = 500)
build_path = /obj/item/rig_module/vision/sechud
/datum/design/item/mechfab/rigsuit/medhud
name = "hardsuit medical visor"
desc = "A compact medical visor for a hardsuit."
id = "rig_component_medhud"
req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3, TECH_MAGNET = 3, TECH_BIO = 2)
materials = list(MAT_PLASTEEL = 2000, MAT_GRAPHITE = 1500, MAT_PLASTIC = 500, MAT_SILVER = 500)
build_path = /obj/item/rig_module/vision/medhud
/datum/design/item/mechfab/rigsuit/voice
name = "hardsuit voice-changer"
desc = "A compact voice-changer for a hardsuit."
id = "rig_component_voice"
req_tech = list(TECH_MATERIAL = 6, TECH_ENGINEERING = 4, TECH_MAGNET = 4, TECH_BIO = 4, TECH_ILLEGAL = 3)
materials = list(MAT_PLASTEEL = 2000, MAT_GRAPHITE = 1500, MAT_PLASTIC = 1000, MAT_SILVER = 500, MAT_PHORON = 1000)
build_path = /obj/item/rig_module/voice
/datum/design/item/mechfab/rigsuit/aicontainer
name = "hardsuit intelligence storage system"
desc = "A compact AI network system for a hardsuit."
id = "rig_component_aicontainer"
req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 5, TECH_BIO = 4, TECH_POWER = 4)
materials = list(MAT_PLASTEEL = 2000, MAT_GRAPHITE = 1500, MAT_DIAMOND = 1000, MAT_GOLD = 500, MAT_SILVER = 750, MAT_VERDANTIUM = 1000)
build_path = /obj/item/rig_module/ai_container
/datum/design/item/mechfab/rigsuit/datajack
name = "hardsuit datajack"
desc = "A compact datajack for a hardsuit."
id = "rig_component_datajack"
req_tech = list(TECH_MATERIAL = 7, TECH_ENGINEERING = 5, TECH_MAGNET = 5, TECH_POWER = 5)
materials = list(MAT_PLASTEEL = 2000, MAT_GRAPHITE = 1500, MAT_METALHYDROGEN = 1000, MAT_GOLD = 500, MAT_SILVER = 750, MAT_VERDANTIUM = 1000)
build_path = /obj/item/rig_module/datajack
/datum/design/item/mechfab/rigsuit/cheminjector
name = "hardsuit chemical injector"
desc = "A compact chemical injector network for a hardsuit."
id = "rig_component_chemicals"
req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 5, TECH_MAGNET = 5, TECH_BIO = 4)
materials = list(MAT_PLASTEEL = 3000, MAT_GRAPHITE = 2000, MAT_PLASTIC = 3500, MAT_SILVER = 1750, MAT_GOLD = 1250)
build_path = /obj/item/rig_module/chem_dispenser/injector/advanced/empty
/datum/design/item/mechfab/rigsuit/teleporter
name = "hardsuit teleporter system"
desc = "An enigmatic teleporter system for a hardsuit."
id = "rig_component_teleport"
req_tech = list(TECH_MATERIAL = 7, TECH_ENGINEERING = 5, TECH_MAGNET = 5, TECH_POWER = 6, TECH_ILLEGAL = 3, TECH_BLUESPACE = 4, TECH_ARCANE = 2, TECH_PRECURSOR = 3)
materials = list(MAT_DURASTEEL = 5000, MAT_GRAPHITE = 3000, MAT_MORPHIUM = 1500, MAT_OSMIUM = 1500, MAT_PHORON = 1750, MAT_VERDANTIUM = 3000, MAT_SUPERMATTER = 2000)
build_path = /obj/item/rig_module/teleporter

View File

@@ -15,9 +15,9 @@
var/mat_efficiency = 1 var/mat_efficiency = 1
var/speed = 1 var/speed = 1
materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, MAT_PLASTEEL = 0, "plastic" = 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) 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_VERDANTIUM, MAT_MORPHIUM, MAT_METALHYDROGEN, MAT_SUPERMATTER) hidden_materials = list(MAT_PLASTEEL, MAT_DURASTEEL, MAT_GRAPHITE, MAT_VERDANTIUM, MAT_MORPHIUM, MAT_METALHYDROGEN, MAT_SUPERMATTER)
/obj/machinery/r_n_d/protolathe/Initialize() /obj/machinery/r_n_d/protolathe/Initialize()
. = ..() . = ..()

View File

@@ -0,0 +1,38 @@
################################
# 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:
- tweak: "Move Rig modules to more granular files"
- rscadd: "Add RIG components to robotics mechfab, plus incredibly basic belt-voidsuit RIG."
- rscadd: "Add Graphite, made by compressing coal, presently only used heavily in RIG components."

Binary file not shown.

Before

Width:  |  Height:  |  Size: 204 KiB

After

Width:  |  Height:  |  Size: 204 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 180 KiB

After

Width:  |  Height:  |  Size: 183 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 97 KiB

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 93 KiB

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

View File

@@ -1769,6 +1769,7 @@
#include "code\modules\clothing\spacesuits\rig\rig_pieces_vr.dm" #include "code\modules\clothing\spacesuits\rig\rig_pieces_vr.dm"
#include "code\modules\clothing\spacesuits\rig\rig_verbs.dm" #include "code\modules\clothing\spacesuits\rig\rig_verbs.dm"
#include "code\modules\clothing\spacesuits\rig\rig_wiring.dm" #include "code\modules\clothing\spacesuits\rig\rig_wiring.dm"
<<<<<<< HEAD:vorestation.dme
#include "code\modules\clothing\spacesuits\rig\modules\combat.dm" #include "code\modules\clothing\spacesuits\rig\modules\combat.dm"
#include "code\modules\clothing\spacesuits\rig\modules\combat_vr.dm" #include "code\modules\clothing\spacesuits\rig\modules\combat_vr.dm"
#include "code\modules\clothing\spacesuits\rig\modules\computer.dm" #include "code\modules\clothing\spacesuits\rig\modules\computer.dm"
@@ -1777,6 +1778,27 @@
#include "code\modules\clothing\spacesuits\rig\modules\utility.dm" #include "code\modules\clothing\spacesuits\rig\modules\utility.dm"
#include "code\modules\clothing\spacesuits\rig\modules\utility_vr.dm" #include "code\modules\clothing\spacesuits\rig\modules\utility_vr.dm"
#include "code\modules\clothing\spacesuits\rig\modules\vision.dm" #include "code\modules\clothing\spacesuits\rig\modules\vision.dm"
=======
#include "code\modules\clothing\spacesuits\rig\modules\modules.dm"
#include "code\modules\clothing\spacesuits\rig\modules\specific\ai_container.dm"
#include "code\modules\clothing\spacesuits\rig\modules\specific\chem_dispenser.dm"
#include "code\modules\clothing\spacesuits\rig\modules\specific\cleaner_launcher.dm"
#include "code\modules\clothing\spacesuits\rig\modules\specific\cloak.dm"
#include "code\modules\clothing\spacesuits\rig\modules\specific\datajack.dm"
#include "code\modules\clothing\spacesuits\rig\modules\specific\device.dm"
#include "code\modules\clothing\spacesuits\rig\modules\specific\electrowarfare.dm"
#include "code\modules\clothing\spacesuits\rig\modules\specific\grenade_launcher.dm"
#include "code\modules\clothing\spacesuits\rig\modules\specific\inhand_fabricator.dm"
#include "code\modules\clothing\spacesuits\rig\modules\specific\jetpack.dm"
#include "code\modules\clothing\spacesuits\rig\modules\specific\metalfoam_launcher.dm"
#include "code\modules\clothing\spacesuits\rig\modules\specific\mounted_gun.dm"
#include "code\modules\clothing\spacesuits\rig\modules\specific\powersink.dm"
#include "code\modules\clothing\spacesuits\rig\modules\specific\self_destruct.dm"
#include "code\modules\clothing\spacesuits\rig\modules\specific\sprinter.dm"
#include "code\modules\clothing\spacesuits\rig\modules\specific\teleporter.dm"
#include "code\modules\clothing\spacesuits\rig\modules\specific\vision.dm"
#include "code\modules\clothing\spacesuits\rig\modules\specific\voice.dm"
>>>>>>> 4d4a426... Merge pull request #6775 from Mechoid/Robotics_Expansion_RIG-ged_and_Ready:polaris.dme
#include "code\modules\clothing\spacesuits\rig\suits\alien.dm" #include "code\modules\clothing\spacesuits\rig\suits\alien.dm"
#include "code\modules\clothing\spacesuits\rig\suits\combat.dm" #include "code\modules\clothing\spacesuits\rig\suits\combat.dm"
#include "code\modules\clothing\spacesuits\rig\suits\ert.dm" #include "code\modules\clothing\spacesuits\rig\suits\ert.dm"
@@ -1784,6 +1806,7 @@
#include "code\modules\clothing\spacesuits\rig\suits\light.dm" #include "code\modules\clothing\spacesuits\rig\suits\light.dm"
#include "code\modules\clothing\spacesuits\rig\suits\merc.dm" #include "code\modules\clothing\spacesuits\rig\suits\merc.dm"
#include "code\modules\clothing\spacesuits\rig\suits\pmc.dm" #include "code\modules\clothing\spacesuits\rig\suits\pmc.dm"
#include "code\modules\clothing\spacesuits\rig\suits\robotics.dm"
#include "code\modules\clothing\spacesuits\rig\suits\station.dm" #include "code\modules\clothing\spacesuits\rig\suits\station.dm"
#include "code\modules\clothing\spacesuits\rig\suits\station_vr.dm" #include "code\modules\clothing\spacesuits\rig\suits\station_vr.dm"
#include "code\modules\clothing\spacesuits\void\merc.dm" #include "code\modules\clothing\spacesuits\void\merc.dm"