diff --git a/code/datums/uplink/announcements.dm b/code/datums/uplink/announcements.dm
index 86a9567a8d..1c4a448cee 100644
--- a/code/datums/uplink/announcements.dm
+++ b/code/datums/uplink/announcements.dm
@@ -13,7 +13,7 @@
/datum/uplink_item/abstract/announcements/fake_centcom
name = "Command Update Announcement"
desc = "Causes a falsified Command Update. Triggers immediately after supplying additional data."
- item_cost = 40
+ item_cost = 20
/datum/uplink_item/abstract/announcements/fake_centcom/extra_args(var/mob/user)
var/title = sanitize(input("Enter your announcement title.", "Announcement Title") as null|text)
@@ -41,7 +41,7 @@
/datum/uplink_item/abstract/announcements/fake_crew_arrival
name = "Crew Arrival Announcement/Records"
desc = "Creates a fake crew arrival announcement as well as fake crew records, using your current appearance (including held items!) and worn id card. Trigger with care!"
- item_cost = 30
+ item_cost = 15
/datum/uplink_item/abstract/announcements/fake_crew_arrival/get_goods(var/obj/item/device/uplink/U, var/loc, var/mob/user, var/list/args)
if(!user)
diff --git a/code/datums/uplink/armor.dm b/code/datums/uplink/armor.dm
index 20367f3989..0d7d814310 100644
--- a/code/datums/uplink/armor.dm
+++ b/code/datums/uplink/armor.dm
@@ -13,3 +13,18 @@
name = "Heavy Armor Vest"
item_cost = 40
path = /obj/item/clothing/suit/storage/vest/heavy/merc
+
+/datum/uplink_item/item/armor/gorlexsuit
+ name = "Mercenary Voidsuit"
+ item_cost = 40
+ path = /obj/item/weapon/storage/box/syndie_kit/voidsuit
+
+/datum/uplink_item/item/armor/gorlexsuit_fire
+ name = "Mercenary Voidsuit (Fire)"
+ item_cost = 40
+ path = /obj/item/weapon/storage/box/syndie_kit/voidsuit/fire
+
+/datum/uplink_item/item/armor/combat
+ name = "Combat Platecarrier Set"
+ item_cost = 60
+ path = /obj/item/clothing/suit/armor/pcarrier/merc
diff --git a/code/datums/uplink/implants.dm b/code/datums/uplink/implants.dm
index e36396c9cd..bbbeaf9e7e 100644
--- a/code/datums/uplink/implants.dm
+++ b/code/datums/uplink/implants.dm
@@ -25,51 +25,51 @@
path = /obj/item/weapon/storage/box/syndie_kit/imp_uplink
/datum/uplink_item/item/implants/imp_shades
- name = "Integrated Thermal-Shades Implant (Organic)"
+ name = "Integrated Thermal-Shades Implant"
item_cost = 80
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug
/datum/uplink_item/item/implants/imp_taser
- name = "Integrated Taser Implant (Organic)"
+ name = "Integrated Taser Implant"
item_cost = 30
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/taser
/datum/uplink_item/item/implants/imp_laser
- name = "Integrated Laser Implant (Organic)"
+ name = "Integrated Laser Implant"
item_cost = 50
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/laser
/datum/uplink_item/item/implants/imp_dart
- name = "Integrated Dart Implant (Organic)"
+ name = "Integrated Dart Implant"
item_cost = 60
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/dart
/datum/uplink_item/item/implants/imp_toolkit
- name = "Integrated Toolkit Implant (Organic)"
+ name = "Integrated Toolkit Implant"
item_cost = 80
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/toolkit
/datum/uplink_item/item/implants/imp_medkit
- name = "Integrated Medkit Implant (Organic)"
+ name = "Integrated Medkit Implant"
item_cost = 60
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/medkit
/datum/uplink_item/item/implants/imp_analyzer
- name = "Integrated Research Scanner Implant (Organic)"
+ name = "Integrated Research Scanner Implant"
item_cost = 20
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/analyzer
/datum/uplink_item/item/implants/imp_sword
- name = "Integrated Sword Implant (Organic)"
+ name = "Integrated Sword Implant"
item_cost = 40
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/sword
/datum/uplink_item/item/implants/imp_sprinter
- name = "Integrated Sprinter Implant (Organic)"
+ name = "Integrated Sprinter Implant"
item_cost = 40
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/sprinter
/datum/uplink_item/item/implants/imp_sprinter
- name = "Integrated Surge Implant (Organic)"
+ name = "Integrated Surge Implant"
item_cost = 40
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/surge
diff --git a/code/datums/uplink/medical.dm b/code/datums/uplink/medical.dm
index c28fed46b9..0657b62b2e 100644
--- a/code/datums/uplink/medical.dm
+++ b/code/datums/uplink/medical.dm
@@ -24,11 +24,23 @@
item_cost = 10
path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/clotting
+/datum/uplink_item/item/medical/clotting_case
+ name = "Clotting Medicine case"
+ item_cost = 20
+ desc = "A case of three myelamine injectors. Can rapidly remove and stow up to six injectors."
+ path = /obj/item/weapon/storage/quickdraw/syringe_case/clotting
+
/datum/uplink_item/item/medical/bonemeds
name = "Bone Repair injector"
item_cost = 10
path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/bonemed
+/datum/uplink_item/item/medical/bonemeds_case
+ name = "Bone Repair case"
+ item_cost = 20
+ desc = "A case of three osteodaxon injectors. Can rapidly remove and stow up to six injectors."
+ path = /obj/item/weapon/storage/quickdraw/syringe_case/bonemed
+
/datum/uplink_item/item/medical/ambrosiadeusseeds
name = "Box of 7x ambrosia deus seed packets"
item_cost = 10
diff --git a/code/datums/uplink/resources.dm b/code/datums/uplink/resources.dm
new file mode 100644
index 0000000000..a544cab728
--- /dev/null
+++ b/code/datums/uplink/resources.dm
@@ -0,0 +1,48 @@
+
+/datum/uplink_item/crated/resources
+ name = "Resource Crate"
+ desc = "A crate routed from an in-system trading post, containing various valuable materials."
+ item_cost = 60
+ category = /datum/uplink_category/services
+
+ paths = list(\
+ /obj/fiftyspawner/uranium,\
+ /obj/fiftyspawner/phoron,\
+ /obj/fiftyspawner/gold,\
+ /obj/fiftyspawner/silver,\
+ /obj/fiftyspawner/osmium,\
+ /obj/fiftyspawner/plasteel\
+ )
+
+/datum/uplink_item/crated/seeds
+ name = "Exotic Plantlife Crate"
+ desc = "A crate routed from an in-system trading post, containing various exotic plants."
+ item_cost = 20
+ category = /datum/uplink_category/services
+
+ paths = list(\
+ /obj/item/seeds/random,\
+ /obj/item/seeds/random,\
+ /obj/item/seeds/random,\
+ /obj/item/seeds/random,\
+ /obj/item/seeds/random,\
+ /obj/item/seeds/random,\
+ /obj/item/seeds/random,\
+ /obj/item/seeds/random\
+ )
+
+/datum/uplink_item/crated/spare_organs
+ name = "Spare Organ Crate"
+ desc = "A crate stolen from a medical relief ship, containing various bioprinted organs."
+ item_cost = 20
+ category = /datum/uplink_category/services
+ crate_path = /obj/structure/closet/crate/freezer
+
+ paths = list(\
+ /obj/item/organ/internal/eyes/replicant,\
+ /obj/item/organ/internal/heart/replicant,\
+ /obj/item/organ/internal/kidneys/replicant,\
+ /obj/item/organ/internal/liver/replicant,\
+ /obj/item/organ/internal/lungs/replicant,\
+ /obj/item/organ/internal/voicebox/replicant\
+ )
diff --git a/code/datums/uplink/stealth_items.dm b/code/datums/uplink/stealth_items.dm
index 0a17e659a6..973e851b02 100644
--- a/code/datums/uplink/stealth_items.dm
+++ b/code/datums/uplink/stealth_items.dm
@@ -37,4 +37,16 @@
/datum/uplink_item/item/stealth_items/makeover
name = "Makeover Kit"
item_cost = 5
- path = /obj/item/weapon/makeover
\ No newline at end of file
+ path = /obj/item/weapon/makeover
+
+/datum/uplink_item/item/stealth_items/thievesgloves
+ name = "Thieve's Gloves"
+ desc = "A pair of sterile gloves that allow the wearer to inspect the backpacks of other players, and swap pocket items."
+ item_cost = 30
+ path = /obj/item/clothing/gloves/sterile/thieves
+
+/datum/uplink_item/item/stealth_items/deadringer
+ name = "Stealth Watch"
+ desc = "A strange watch which can be used to create a fake corpse if you are injured when it is active, as it projects a cloaking field around your person."
+ item_cost = 50
+ path = /obj/item/weapon/deadringer
diff --git a/code/datums/uplink/stealthy_weapons.dm b/code/datums/uplink/stealthy_weapons.dm
index 5576ebcac5..2f4cab5ff7 100644
--- a/code/datums/uplink/stealthy_weapons.dm
+++ b/code/datums/uplink/stealthy_weapons.dm
@@ -33,3 +33,51 @@
name = "Random Toxin - Beaker"
item_cost = 10
path = /obj/item/weapon/storage/box/syndie_kit/toxin
+
+/datum/uplink_item/item/stealthy_weapons/penblade
+ name = "Energy Penblade, Black"
+ desc = "A concealed energy dagger with the functional casing of a pen. Makes an impressive throwing weapon."
+ item_cost = 20
+ path = /obj/item/weapon/pen/blade
+
+/datum/uplink_item/item/stealthy_weapons/penblade_red
+ name = "Energy Penblade, Red"
+ desc = "A concealed energy dagger with the functional casing of a pen. Makes an impressive throwing weapon."
+ item_cost = 20
+ path = /obj/item/weapon/pen/blade/red
+
+/datum/uplink_item/item/stealthy_weapons/penblade_blue
+ name = "Energy Penblade, Blue"
+ desc = "A concealed energy dagger with the functional casing of a pen. Makes an impressive throwing weapon."
+ item_cost = 20
+ path = /obj/item/weapon/pen/blade/blue
+
+/datum/uplink_item/item/stealthy_weapons/penblade_fancy
+ name = "Energy Penblade, Fountain"
+ desc = "A concealed energy dagger with the functional casing of a pen. Makes an impressive throwing weapon."
+ item_cost = 20
+ path = /obj/item/weapon/pen/blade/fountain
+
+/datum/uplink_item/item/stealthy_weapons/angrybuzzer
+ name = "Morphium Shock Ring"
+ desc = "An enigmatic ring used to create powerful electric shocks when punching. Can be used as a brute-force method of defibrillation."
+ item_cost = 40
+ path = /obj/item/clothing/gloves/ring/buzzer
+
+/datum/uplink_item/item/stealthy_weapons/huntingtrap
+ name = "Camonetted Beartraps"
+ desc = "A box of unique beartraps which will partially cloak when deployed, allowing for more effective hunting."
+ item_cost = 30
+ path = /obj/item/weapon/storage/box/syndie_kit/deadliest_game
+
+/datum/uplink_item/item/stealthy_weapons/virus
+ name = "Virus Cultures"
+ desc = "A box of three unique virus cultures. As dangerous to you as anyone else if handled improperly."
+ item_cost = 40
+ path = /obj/item/weapon/storage/box/syndie_kit/viral
+
+/datum/uplink_item/item/stealthy_weapons/syringe_case
+ name = "Quickdraw Syringe Case"
+ desc = "A small box capable of holding six syringes for rapid deployment. Fits in your pocket."
+ item_cost = 20
+ path = /obj/item/weapon/storage/quickdraw/syringe_case
diff --git a/code/datums/uplink/tools.dm b/code/datums/uplink/tools.dm
index 6c340385b0..6f70c1111c 100644
--- a/code/datums/uplink/tools.dm
+++ b/code/datums/uplink/tools.dm
@@ -91,6 +91,12 @@
item_cost = 30
path = /obj/item/weapon/card/emag
+/datum/uplink_item/item/tools/graviton
+ name = "Graviton Goggles"
+ desc = "An obvious, if useful pair of advanced imaging goggles that allow you to see objects and turfs through walls."
+ item_cost = 15
+ path = /obj/item/clothing/glasses/graviton
+
/datum/uplink_item/item/tools/thermal
name = "Thermal Imaging Glasses"
item_cost = 30
@@ -111,6 +117,11 @@
item_cost = 60
path = /obj/item/weapon/storage/box/syndie_kit/demolitions_heavy
+/datum/uplink_item/item/tools/integratedcircuitprinter
+ name = "Integrated Circuit Printer (Upgraded)"
+ item_cost = 10
+ path = /obj/item/device/integrated_circuit_printer/upgraded
+
/*
/datum/uplink_item/item/tools/packagebomb/huge
name = "Package Bomb (Huge)
diff --git a/code/datums/uplink/uplink_categories.dm b/code/datums/uplink/uplink_categories.dm
index 2776085594..d9e6d84db7 100644
--- a/code/datums/uplink/uplink_categories.dm
+++ b/code/datums/uplink/uplink_categories.dm
@@ -52,4 +52,4 @@ datum/uplink_category/ammunition
name = "Telecrystals"
/datum/uplink_category/backup
- name = "Backup"
\ No newline at end of file
+ name = "Backup"
diff --git a/code/datums/uplink/uplink_items.dm b/code/datums/uplink/uplink_items.dm
index 94b1281dd3..b6c8cf9952 100644
--- a/code/datums/uplink/uplink_items.dm
+++ b/code/datums/uplink/uplink_items.dm
@@ -162,6 +162,36 @@ datum/uplink_item/dd_SortValue()
return "\icon[default_abstract_uplink_icon]"
+/*
+ * Crated goods.
+ */
+
+/datum/uplink_item/crated
+ var/crate_path = /obj/structure/largecrate
+ var/list/paths = list() // List of paths to be spawned into the crate.
+
+/datum/uplink_item/crated/get_goods(var/obj/item/device/uplink/U, var/loc)
+ var/obj/L = new crate_path(get_turf(loc))
+
+ L.adjust_scale(rand(9, 12) / 10, rand(9, 12) / 10) // Some variation in the crate / locker size.
+
+ for(var/path in paths)
+ var/obj/O = new path(L)
+ O.forceMove(L)
+
+ return L
+
+/datum/uplink_item/crated/description()
+ if(!desc)
+ // Fallback description
+ var/obj/temp = crate_path
+ desc = initial(temp.desc)
+ return ..()
+
+/datum/uplink_item/crated/log_icon()
+ var/obj/I = crate_path
+ return "\icon[I]"
+
/****************
* Support procs *
****************/
diff --git a/code/datums/uplink/visible_weapons.dm b/code/datums/uplink/visible_weapons.dm
index e4c27752f0..0ed9b26226 100644
--- a/code/datums/uplink/visible_weapons.dm
+++ b/code/datums/uplink/visible_weapons.dm
@@ -61,7 +61,7 @@
/datum/uplink_item/item/visible_weapons/riggedlaser
name = "Exosuit Rigged Laser"
- item_cost = 60
+ item_cost = 30
path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/riggedlaser
/datum/uplink_item/item/visible_weapons/revolver
@@ -146,7 +146,7 @@
/datum/uplink_item/item/visible_weapons/egun
name = "Energy Gun"
- item_cost = 60
+ item_cost = 30
path = /obj/item/weapon/gun/energy/gun
/datum/uplink_item/item/visible_weapons/lasercannon
@@ -171,5 +171,17 @@
/datum/uplink_item/item/visible_weapons/xray
name = "Xray Gun"
- item_cost = 85
+ item_cost = 60
path = /obj/item/weapon/gun/energy/xray
+
+/datum/uplink_item/item/visible_weapons/flamethrower
+ name = "Heavy Flamethrower"
+ desc = "A large flamethrower that runs on pressurized, gaseous phoron and electric charge."
+ item_cost = 60
+ path = /obj/item/weapon/storage/secure/briefcase/flamer
+
+/datum/uplink_item/item/visible_weapons/concussion_grenades
+ name = "Concussion Grenades (8)"
+ desc = "A box of eight concussion grenades."
+ item_cost = 30
+ path = /obj/item/weapon/storage/box/syndie_kit/concussion_grenade
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index ec178a7709..02161a4db6 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -634,6 +634,8 @@ modules/mob/mob_movement.dm if you move you will be zoomed out
modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
*/
//Looking through a scope or binoculars should /not/ improve your periphereal vision. Still, increase viewsize a tiny bit so that sniping isn't as restricted to NSEW
+/obj/item/var/ignore_visor_zoom_restriction = FALSE
+
/obj/item/proc/zoom(var/tileoffset = 14,var/viewsize = 9) //tileoffset is client view offset in the direction the user is facing. viewsize is how far out this thing zooms. 7 is normal view
var/devicename
@@ -682,7 +684,8 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
H.client.pixel_y = 0
H.visible_message("[usr] peers through the [zoomdevicename ? "[zoomdevicename] of the [src.name]" : "[src.name]"].")
- H.looking_elsewhere = TRUE
+ if(!ignore_visor_zoom_restriction)
+ H.looking_elsewhere = TRUE
H.handle_vision()
else
diff --git a/code/game/objects/items/weapons/implants/implantaugment.dm b/code/game/objects/items/weapons/implants/implantaugment.dm
index 10873d1d06..be6c8721ee 100644
--- a/code/game/objects/items/weapons/implants/implantaugment.dm
+++ b/code/game/objects/items/weapons/implants/implantaugment.dm
@@ -75,12 +75,12 @@
var/obj/item/organ/external/E = setup_augment_slots(H, NewOrgan)
to_chat(H, "You feel a tingling sensation in your [part].")
- if(E && istype(E) && !(H.internal_organs_by_name[NewOrgan.organ_tag]))
+ NewOrgan.forceMove(H)
+ NewOrgan.owner = H
+ if(E && istype(E) && !(H.internal_organs_by_name[NewOrgan.organ_tag]) && NewOrgan.check_verb_compatability())
spawn(rand(1 SECONDS, 30 SECONDS))
to_chat(H, "You feel a pressure in your [E] as the tingling fades, the lump caused by the implant now gone.")
- NewOrgan.forceMove(H)
- NewOrgan.owner = H
if(E.internal_organs == null)
E.internal_organs = list()
E.internal_organs |= NewOrgan
diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm
index 4e89372ec1..744a92e370 100644
--- a/code/game/objects/items/weapons/shields.dm
+++ b/code/game/objects/items/weapons/shields.dm
@@ -186,15 +186,22 @@
var/mutable_appearance/blade_overlay = mutable_appearance(icon, "[icon_state]_blade")
if(lcolor)
blade_overlay.color = lcolor
+ color = lcolor
cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other
if(active)
add_overlay(blade_overlay)
item_state = "[icon_state]_blade"
set_light(lrange, lpower, lcolor)
else
+ color = "FFFFFF"
set_light(0)
item_state = "[icon_state]"
+ if(istype(usr,/mob/living/carbon/human))
+ var/mob/living/carbon/human/H = usr
+ H.update_inv_l_hand()
+ H.update_inv_r_hand()
+
/obj/item/weapon/shield/energy/AltClick(mob/living/user)
if(!in_range(src, user)) //Basic checks to prevent abuse
return
@@ -204,7 +211,7 @@
if(alert("Are you sure you want to recolor your shield?", "Confirm Recolor", "Yes", "No") == "Yes")
var/energy_color_input = input(usr,"","Choose Energy Color",lcolor) as color|null
if(energy_color_input)
- lcolor = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1)
+ lcolor = sanitize_hexcolor(energy_color_input)
update_icon()
/obj/item/weapon/shield/energy/examine(mob/user)
diff --git a/code/game/objects/items/weapons/storage/quickdraw.dm b/code/game/objects/items/weapons/storage/quickdraw.dm
index 86d7c76ca2..a2094f50fd 100644
--- a/code/game/objects/items/weapons/storage/quickdraw.dm
+++ b/code/game/objects/items/weapons/storage/quickdraw.dm
@@ -77,4 +77,22 @@
/obj/item/weapon/reagent_containers/syringe,
/obj/item/weapon/reagent_containers/syringe,
/obj/item/weapon/reagent_containers/syringe
- )
\ No newline at end of file
+ )
+
+/obj/item/weapon/storage/quickdraw/syringe_case/clotting
+ desc = "A small case for safely carrying sharps around. This one is deluxe!"
+ max_w_class = ITEMSIZE_SMALL
+ starts_with = list(
+ /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/clotting,
+ /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/clotting,
+ /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/clotting
+ )
+
+/obj/item/weapon/storage/quickdraw/syringe_case/bonemed
+ desc = "A small case for safely carrying sharps around. This one is deluxe!"
+ max_w_class = ITEMSIZE_SMALL
+ starts_with = list(
+ /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/bonemed,
+ /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/bonemed,
+ /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/bonemed
+ )
diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm
index 2144a1e394..abae12ed8a 100644
--- a/code/game/objects/items/weapons/storage/uplink_kits.dm
+++ b/code/game/objects/items/weapons/storage/uplink_kits.dm
@@ -266,6 +266,37 @@
/obj/item/weapon/tool/screwdriver
)
+/obj/item/weapon/storage/box/syndie_kit/voidsuit
+ starts_with = list(
+ /obj/item/clothing/suit/space/void/merc,
+ /obj/item/clothing/head/helmet/space/void/merc,
+ /obj/item/clothing/shoes/magboots,
+ /obj/item/weapon/tank/jetpack/oxygen
+ )
+
+/obj/item/weapon/storage/box/syndie_kit/voidsuit/fire
+ starts_with = list(
+ /obj/item/clothing/suit/space/void/merc/fire,
+ /obj/item/clothing/head/helmet/space/void/merc/fire,
+ /obj/item/clothing/shoes/magboots,
+ /obj/item/weapon/tank/jetpack/oxygen
+ )
+
+/obj/item/weapon/storage/box/syndie_kit/concussion_grenade
+ starts_with = list(
+ /obj/item/weapon/grenade/concussion = 8
+ )
+
+/obj/item/weapon/storage/box/syndie_kit/deadliest_game
+ starts_with = list(
+ /obj/item/weapon/beartrap/hunting = 4
+ )
+
+/obj/item/weapon/storage/box/syndie_kit/viral
+ starts_with = list(
+ /obj/item/weapon/virusdish/random = 3
+ )
+
/obj/item/weapon/storage/secure/briefcase/rifle
name = "secure briefcase"
starts_with = list(
@@ -275,6 +306,15 @@
/obj/item/ammo_casing/a145 = 4
)
+/obj/item/weapon/storage/secure/briefcase/flamer
+ name = "secure briefcase"
+ starts_with = list(
+ /obj/item/weapon/gun/magnetic/gasthrower,
+ /obj/item/weapon/cell/super,
+ /obj/item/weapon/stock_parts/capacitor/adv,
+ /obj/item/weapon/tank/phoron/pressurized = 2
+ )
+
/obj/item/weapon/storage/secure/briefcase/fuelrod
name = "heavy briefcase"
desc = "A heavy, locked briefcase."
diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm
index 9e984ba05f..6d6839a4a5 100644
--- a/code/game/objects/items/weapons/tanks/tank_types.dm
+++ b/code/game/objects/items/weapons/tanks/tank_types.dm
@@ -113,6 +113,19 @@
air_contents.adjust_gas("phoron", (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
return
+/obj/item/weapon/tank/phoron/pressurized
+ name = "fuel can"
+ icon_state = "phoron_vox"
+ w_class = ITEMSIZE_NORMAL
+
+/obj/item/weapon/tank/phoron/pressurized/Initialize()
+ ..()
+
+ adjust_scale(0.8)
+
+ air_contents.adjust_gas("phoron", (7*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
+ return
+
/*
* Emergency Oxygen
*/
diff --git a/code/game/objects/items/weapons/traps.dm b/code/game/objects/items/weapons/traps.dm
index 1f9397e705..8e6667c759 100644
--- a/code/game/objects/items/weapons/traps.dm
+++ b/code/game/objects/items/weapons/traps.dm
@@ -105,6 +105,7 @@
L.Stun(stun_length)
to_chat(L, "The steel jaws of \the [src] bite into you, trapping you in place!")
deployed = 0
+ anchored = FALSE
can_buckle = initial(can_buckle)
/obj/item/weapon/beartrap/Crossed(atom/movable/AM as mob|obj)
diff --git a/code/modules/clothing/gloves/antagonist.dm b/code/modules/clothing/gloves/antagonist.dm
new file mode 100644
index 0000000000..b11a29313d
--- /dev/null
+++ b/code/modules/clothing/gloves/antagonist.dm
@@ -0,0 +1,157 @@
+/*
+ * Antagonist-specific gloves, such as traitor or ling-only types.
+ */
+
+// Thief - Traitor / Merc
+/obj/item/clothing/gloves/sterile/thieves
+ name = "sterile gloves"
+ desc = "Sterile gloves."
+ description_antag = "These gloves are uniquely suited for stealing, as well as breaking and entering. They have minor insulation.\
+ Attempting to 'help' someone will open their backpack, if it exists, or their belt if they have no backpack, allowing you to deposit\
+ items into the inventories. Be careful about making too much noise.\
+ Disarm intent will swap the items in your LEFT pockets. Grab will swap RIGHT pockets."
+ icon_state = "latex"
+ item_state_slots = list(slot_r_hand_str = "white", slot_l_hand_str = "white")
+ siemens_coefficient = 0.5 // Not perfect, but slightly more protective than nothing.
+ permeability_coefficient = 0.01
+ germ_level = 0
+ fingerprint_chance = 10 // They're thieves' gloves. What do you think?
+
+/obj/item/clothing/gloves/sterile/thieves/proc/pickpocket(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/proximity)
+ if(!proximity || !user || !target)
+ return 0
+
+ if(!istype(target))
+ return 0
+
+ if(user.a_intent != I_HURT && (turn(target.dir, 180) == get_dir(user, target)))
+ to_chat(target, "[user] rifles in your pockets!")
+
+ if(user.a_intent == I_HELP)
+ if(istype(target.back,/obj/item/weapon/storage) && do_after(user, 3 SECONDS, target))
+ var/obj/item/weapon/storage/Backpack = target.back
+ Backpack.open(user)
+ else if(istype(target.belt, /obj/item/weapon/storage) && do_after(user, 5 SECONDS, target))
+ var/obj/item/weapon/storage/Belt = target.belt
+ Belt.open(user)
+ return 1
+
+ if(user.a_intent == I_DISARM)
+ var/obj/item/LTarg = target.l_store
+ var/obj/item/LUser = user.l_store
+
+ if(do_after(user, 1 SECOND, target))
+ if(istype(LTarg) && do_after(user, 1 SECOND, target))
+ target.drop_from_inventory(LTarg)
+ target.l_store = null
+ user.l_store = LTarg
+ LTarg.forceMove(user)
+ LTarg.equipped(user, slot_l_store)
+ else
+ target.drop_from_inventory(LTarg)
+
+ if(istype(LUser) && do_after(user, 1 SECOND, target))
+ user.drop_from_inventory(LUser)
+ target.l_store = LUser
+ LUser.forceMove(target)
+ LUser.equipped(target, slot_l_store)
+ else if(istype(LUser) && LUser != user.l_store) // We've taken something, so drop the one that's in bluespace.
+ user.drop_from_inventory(LUser)
+
+ return 1
+
+ if(user.a_intent == I_GRAB)
+ var/obj/item/RTarg = target.r_store
+ var/obj/item/RUser = user.r_store
+
+ if(do_after(user, 1 SECOND, target))
+ if(istype(RTarg) && do_after(user, 1 SECOND, target))
+ target.drop_from_inventory(RTarg)
+ target.r_store = null
+ user.r_store = RTarg
+ RTarg.forceMove(user)
+ RTarg.equipped(user, slot_r_store)
+ else
+ target.drop_from_inventory(RTarg)
+
+ if(istype(RUser) && do_after(user, 1 SECOND, target))
+ user.drop_from_inventory(RUser)
+ target.r_store = RUser
+ RUser.forceMove(target)
+ RUser.equipped(target, slot_r_store)
+ else if(istype(RUser) && RUser != user.r_store) // We've taken something, so drop the one that's in bluespace.
+ user.drop_from_inventory(RUser)
+
+ return 1
+
+/obj/item/clothing/gloves/sterile/thieves/Touch(var/atom/A, var/proximity)
+ if(proximity && istype(usr, /mob/living/carbon/human) && do_after(usr, 1 SECOND, A))
+ return pickpocket(usr, A, proximity)
+ return 0
+
+// Buzzer Ring - Traitor, Merc.
+/obj/item/clothing/gloves/ring/buzzer
+ name = "ring"
+ desc = "A plain metal band."
+ description_antag = "This morphium-alloy ring continually generates an electric field, capable of electrocuting a target while not injuring the wearer.\
+ The device is also capable of 'frankenstein'-ing a corpse, long after normal technology would be able to save them. The body will still be tied to the\
+ normal damage limits for survival, however, so care must be taken."
+ icon_state = "material"
+ var/battery_type = /obj/item/weapon/cell/device/weapon/recharge
+ var/obj/item/weapon/cell/battery = null
+
+/obj/item/clothing/gloves/ring/buzzer/get_cell()
+ return battery
+
+/obj/item/clothing/gloves/ring/buzzer/Initialize()
+ ..()
+ if(!battery)
+ battery = new battery_type(src)
+
+/obj/item/clothing/gloves/ring/buzzer/Touch(var/atom/A, var/proximity)
+ if(proximity && istype(usr, /mob/living/carbon/human))
+ return zap(usr, A, proximity)
+ return 0
+
+/obj/item/clothing/gloves/ring/buzzer/proc/zap(var/mob/living/carbon/human/user, var/atom/movable/target, var/proximity)
+ . = FALSE
+ if(user.a_intent == I_HURT && battery.percent() >= 50)
+ if(isliving(target))
+ var/mob/living/L = target
+
+ if(ishuman(L) && battery.percent() >= 90) // Silent text-wise, for maximum potential for gimmicks.
+ var/mob/living/carbon/human/H = L
+
+ if(H.stat == DEAD)
+ . = TRUE
+
+ do_defib(H)
+
+ to_chat(L, "You feel a powerful shock!")
+ if(!.)
+ playsound(L, 'sound/effects/sparks7.ogg', 40, 1)
+ L.electrocute_act(battery.percent() * 0.25, src)
+ battery.emp_act(2)
+ return .
+
+ return 0
+
+/obj/item/clothing/gloves/ring/buzzer/proc/do_defib(var/mob/living/carbon/human/H = null)
+ if(!istype(H))
+ return 0
+
+ dead_mob_list.Remove(H)
+ if((H in living_mob_list) || (H in dead_mob_list))
+ WARNING("Mob [H] was ring-defibbed but already in the living or dead list still!")
+ living_mob_list += H
+
+ H.timeofdeath = 0
+ H.stat = UNCONSCIOUS
+ H.failed_last_breath = 0
+ H.reload_fullscreen()
+
+ H.emote("gasp")
+ H.Weaken(rand(10,25))
+ H.updatehealth()
+
+ battery.emp_act(1)
diff --git a/code/modules/mob/_modifiers/fire.dm b/code/modules/mob/_modifiers/fire.dm
index d69a35c2ec..7f0cb81c4c 100644
--- a/code/modules/mob/_modifiers/fire.dm
+++ b/code/modules/mob/_modifiers/fire.dm
@@ -17,6 +17,9 @@
/datum/modifier/fire/tick()
holder.inflict_heat_damage(damage_per_tick)
+/datum/modifier/fire/weak
+ damage_per_tick = 1
+
/*
* Modifier used by projectiles, like the flamethrower, that rely heavily on fire_stacks to persist.
*/
diff --git a/code/modules/organs/internal/augment.dm b/code/modules/organs/internal/augment.dm
index d134ad12ca..569b5dda44 100644
--- a/code/modules/organs/internal/augment.dm
+++ b/code/modules/organs/internal/augment.dm
@@ -12,7 +12,7 @@
organ_verbs = list(/mob/living/carbon/human/proc/augment_menu) // Verbs added by the organ when present in the body.
target_parent_classes = list() // Is the parent supposed to be organic, robotic, assisted?
- forgiving_class = FALSE // Will the organ give its verbs when it isn't a perfect match? I.E., assisted in organic, synthetic in organic.
+ forgiving_class = TRUE // Will the organ give its verbs when it isn't a perfect match? I.E., assisted in organic, synthetic in organic.
var/obj/item/integrated_object // Objects held by the organ, used for re-usable, deployable things.
var/integrated_object_type // Object type the organ will spawn.
diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm
index 088e36c31b..dbfd7855ff 100644
--- a/code/modules/paperwork/pen.dm
+++ b/code/modules/paperwork/pen.dm
@@ -48,6 +48,11 @@
var/selectedColor = 1
var/colors = list("black","blue","red")
+/obj/item/weapon/pen/AltClick(mob/user)
+ to_chat(user, "Click.")
+ playsound(loc, 'sound/items/penclick.ogg', 50, 1)
+ return
+
/obj/item/weapon/pen/multi/attack_self(mob/user)
if(++selectedColor > 3)
selectedColor = 1
@@ -92,6 +97,98 @@
var/trans = reagents.trans_to_mob(M, 30, CHEM_BLOOD)
add_attack_logs(user,M,"Injected with [src.name] containing [contained], trasferred [trans] units")
+/*
+ * Blade pens.
+ */
+
+/obj/item/weapon/pen/blade
+ desc = "It's a normal black ink pen."
+ description_antag = "This pen can be transformed into a dangerous melee and thrown assassination weapon with an Alt-Click.\
+ When active, it cannot be caught safely."
+ name = "pen"
+ icon = 'icons/obj/bureaucracy.dmi'
+ icon_state = "pen"
+ item_state = "pen"
+ slot_flags = SLOT_BELT | SLOT_EARS
+ throwforce = 3
+ w_class = ITEMSIZE_TINY
+ throw_speed = 7
+ throw_range = 15
+ armor_penetration = 20
+
+ var/active = 0
+ var/active_embed_chance = 0
+ var/active_force = 15
+ var/active_throwforce = 30
+ var/active_w_class = ITEMSIZE_NORMAL
+ var/active_icon_state
+ var/default_icon_state
+
+/obj/item/weapon/pen/blade/Initialize()
+ ..()
+ active_icon_state = "[icon_state]-x"
+ default_icon_state = icon_state
+
+/obj/item/weapon/pen/blade/AltClick(mob/user)
+ ..()
+ if(active)
+ deactivate(user)
+ else
+ activate(user)
+
+ to_chat(user, "You [active ? "de" : ""]activate \the [src]'s blade.")
+
+/obj/item/weapon/pen/blade/proc/activate(mob/living/user)
+ if(active)
+ return
+ active = 1
+ icon_state = active_icon_state
+ embed_chance = active_embed_chance
+ force = active_force
+ throwforce = active_throwforce
+ sharp = 1
+ edge = 1
+ w_class = active_w_class
+ playsound(user, 'sound/weapons/saberon.ogg', 15, 1)
+ damtype = SEARING
+ catchable = FALSE
+
+ attack_verb |= list(\
+ "slashed",\
+ "cut",\
+ "shredded",\
+ "stabbed"\
+ )
+
+/obj/item/weapon/pen/blade/proc/deactivate(mob/living/user)
+ if(!active)
+ return
+ playsound(user, 'sound/weapons/saberoff.ogg', 15, 1)
+ active = 0
+ icon_state = default_icon_state
+ embed_chance = initial(embed_chance)
+ force = initial(force)
+ throwforce = initial(throwforce)
+ sharp = initial(sharp)
+ edge = initial(edge)
+ w_class = initial(w_class)
+ damtype = BRUTE
+ catchable = TRUE
+
+/obj/item/weapon/pen/blade/blue
+ desc = "It's a normal blue ink pen."
+ icon_state = "pen_blue"
+ colour = "blue"
+
+/obj/item/weapon/pen/blade/red
+ desc = "It's a normal red ink pen."
+ icon_state = "pen_red"
+ colour = "red"
+
+/obj/item/weapon/pen/blade/fountain
+ desc = "A well made fountain pen."
+ icon_state = "pen_fountain"
+
/*
* Sleepy Pens
*/
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index f939faa461..a851816c8f 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -76,12 +76,17 @@
var/start_nutrition = H.nutrition
var/end_nutrition = 0
- H.nutrition -= rechargeamt / 10
+ H.nutrition -= rechargeamt / 15
end_nutrition = H.nutrition
- if(start_nutrition - max(0, end_nutrition) < rechargeamt / 10)
- H.remove_blood((rechargeamt / 10) - (start_nutrition - max(0, end_nutrition)))
+ if(start_nutrition - max(0, end_nutrition) < rechargeamt / 15)
+
+ if(H.isSynthetic())
+ H.adjustToxLoss((rechargeamt / 15) - (start_nutrition - max(0, end_nutrition)))
+
+ else
+ H.remove_blood((rechargeamt / 15) - (start_nutrition - max(0, end_nutrition)))
power_supply.give(rechargeamt) //... to recharge 1/5th the battery
update_icon()
diff --git a/code/modules/projectiles/guns/magnetic/gasthrower.dm b/code/modules/projectiles/guns/magnetic/gasthrower.dm
new file mode 100644
index 0000000000..f42ae95061
--- /dev/null
+++ b/code/modules/projectiles/guns/magnetic/gasthrower.dm
@@ -0,0 +1,77 @@
+/obj/item/weapon/gun/magnetic/gasthrower
+ name = "phoronthrower"
+ desc = "A modernized flamethrower utilizing pressurized phoron gas as both a propellant and combustion medium."
+ description_fluff = "A weapon designed to effectively combat the threat posed by Almachi soldiers without the danger of other forms of flamethrower."
+ icon_state = "gasthrower"
+ item_state = "bore"
+ wielded_item_state = "bore-wielded"
+ icon = 'icons/obj/railgun.dmi'
+ one_handed_penalty = 20
+ origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 4, TECH_ILLEGAL = 2, TECH_PHORON = 4)
+ w_class = ITEMSIZE_LARGE
+
+ burst = 3
+ burst_delay = 1
+
+ fire_sound = 'sound/weapons/towelwipe.ogg'
+
+ removable_components = TRUE
+ gun_unreliable = 0
+
+ load_type = /obj/item/weapon/tank
+ projectile_type = /obj/item/projectile/scatter/flamethrower
+
+ power_cost = 250
+
+/obj/item/weapon/gun/magnetic/gasthrower/check_ammo()
+ if(!loaded || !istype(loaded, load_type))
+ return 0
+
+ var/obj/item/weapon/tank/Tank = loaded
+
+ Tank.air_contents.update_values() // Safety
+
+ var/turf/T = get_turf(src)
+
+ var/phoron_amt = Tank.air_contents.gas["phoron"]
+ var/co2_amt = Tank.air_contents.gas["carbon_dioxide"]
+ var/oxy_amt = Tank.air_contents.gas["oxygen"]
+ var/n2o_amt = Tank.air_contents.gas["sleeping_agent"]
+
+ if(isnull(co2_amt))
+ co2_amt = 0
+
+ if(isnull(oxy_amt))
+ oxy_amt = 0
+
+ if(isnull(n2o_amt))
+ n2o_amt = 0
+
+ var/phoron_mix_proper = TRUE
+ if(!phoron_amt || phoron_amt < max(0.25, 3 + co2_amt - oxy_amt - (n2o_amt / 2)))
+ phoron_mix_proper = FALSE
+
+ if(Tank.air_contents.return_pressure() >= T.air.return_pressure() && phoron_mix_proper)
+ return 1
+
+ return 0
+
+/obj/item/weapon/gun/magnetic/gasthrower/use_ammo()
+ var/obj/item/weapon/tank/Tank = loaded
+
+ var/moles_to_pull = 0.25
+
+ Tank.air_contents.remove(moles_to_pull)
+
+/obj/item/weapon/gun/magnetic/gasthrower/show_ammo(var/mob/user)
+ ..()
+
+ if(loaded)
+ var/obj/item/weapon/tank/T = loaded
+ to_chat(user, "\The [T]'s pressure meter shows: [T.air_contents.return_pressure()] kpa.")
+
+ switch(check_ammo())
+ if(TRUE)
+ to_chat(user, "\The [src]'s display registers a proper fuel mixture.")
+ if(FALSE)
+ to_chat(user, "\The [src]'s display registers an improper fuel mixture.")
diff --git a/code/modules/projectiles/guns/projectile/sniper.dm b/code/modules/projectiles/guns/projectile/sniper.dm
index e68bb620ba..2ee5afefdc 100644
--- a/code/modules/projectiles/guns/projectile/sniper.dm
+++ b/code/modules/projectiles/guns/projectile/sniper.dm
@@ -18,6 +18,7 @@
projectile_type = /obj/item/projectile/bullet/rifle/a145
accuracy = -75
scoped_accuracy = 75
+ ignore_visor_zoom_restriction = TRUE // Ignore the restriction on vision modifiers when using this gun's scope.
// one_handed_penalty = 90
var/bolt_open = 0
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 3b96846ecf..6c27eae011 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -95,7 +95,7 @@
var/spread_submunition_damage = FALSE // Do we assign damage to our sub projectiles based on our main projectile damage?
var/damage = 10
- var/damage_type = BRUTE //BRUTE, BURN, TOX, OXY, CLONE, HALLOSS, ELECTROCUTE, BIOACID are the only things that should be in here
+ var/damage_type = BRUTE //BRUTE, BURN, TOX, OXY, CLONE, HALLOSS, ELECTROCUTE, BIOACID, SEARING are the only things that should be in here
var/SA_bonus_damage = 0 // Some bullets inflict extra damage on simple animals.
var/SA_vulnerability = null // What kind of simple animal the above bonus damage should be applied to. Set to null to apply to all SAs.
var/nodamage = 0 //Determines if the projectile will skip any damage inflictions
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index d25b0e5fee..11912bb13f 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -266,6 +266,14 @@
flammability = 2
range = 6
+/obj/item/projectile/bullet/incendiary/flamethrower/tiny
+ damage = 2
+ incendiary = 0
+ modifier_type_to_apply = /datum/modifier/fire/weak
+ modifier_duration = 20 SECONDS
+ range = 7
+ agony = 3
+
/* Practice rounds and blanks */
/obj/item/projectile/bullet/practice
diff --git a/code/modules/projectiles/projectile/scatter.dm b/code/modules/projectiles/projectile/scatter.dm
index 0aa6ad5719..4b0511d0b4 100644
--- a/code/modules/projectiles/projectile/scatter.dm
+++ b/code/modules/projectiles/projectile/scatter.dm
@@ -60,3 +60,13 @@
submunitions = list(
/obj/item/projectile/bullet/shotgun/ion = 3
)
+
+/obj/item/projectile/scatter/flamethrower
+ damage = 5
+ submunition_spread_max = 100
+ submunition_spread_min = 30
+ force_max_submunition_spread = TRUE
+
+ submunitions = list(
+ /obj/item/projectile/bullet/incendiary/flamethrower/tiny = 7
+ )
diff --git a/html/changelogs/mechoid - antaguplink.yml b/html/changelogs/mechoid - antaguplink.yml
new file mode 100644
index 0000000000..8018619f6e
--- /dev/null
+++ b/html/changelogs/mechoid - antaguplink.yml
@@ -0,0 +1,58 @@
+################################
+# 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: "Energy Daggerpens (20): Disguised energy-knives, which do 15 searing on melee, or 30 when thrown."
+ - rscadd: "Thieves gloves (30): Special gloves that allow you to peep in others' backpacks and belts, and plant items in their bags / pockets."
+ - rscadd: "Buzzer Ring (30): Makes your first two punches electrically charged, first with 25 damage in a shock, then approximately 12.5 damage in the second. If the charge is over 90%, you can force-defib a corpse, even if it's a mindless one. Damage rules still apply, however time-of-death does not."
+ - rscadd: "Resource Crate (60): A crate of uranium, phoron, gold, silver, osmium, and plasteel."
+ - rscadd: "Exotic Plantlife Crate (20): A crate of numerous random seeds."
+ - rscadd: "Spare Organ Crate (20): A crate of bioprinted organs."
+ - rscadd: "Graviton goggles (15): A pair of combined meson/material goggles."
+ - rscadd: "Integrated Circuit Printer (10): An upgraded circuit printer used to make integrated machine."
+ - rscadd: "Flamethrower (60): A large, flame-based weapon."
+ - rscadd: "8 Concussion Grenades (30): A box of eight concussion grenades."
+ - rscadd: "4 Hunting Traps (30): A box of four hunting-traps, similar to those found in the explorer vendor."
+ - rscadd: "3 Virus Samples (40): A box of three unique virus samples."
+ - rscadd: "Quickdraw Syringe Case (20): A case that can hold six syringes, and rapidly deploy them. Fits in your pocket."
+ - rscadd: "Clotting Injector Case (20): A case like above which starts with 3 clotting med injectors instead."
+ - rscadd: "Bonemed Injector Case (20): The same as above, but with bonemeds."
+ - tweak: "Announcement costs lowered to be more equivalent."
+ - tweak: "Egun changed from 60 to 30 TC. It is nowhere near as powerful as a lascannon."
+ - tweak: "Exosuit rigged laser from 60 to 30 TC."
+ - tweak: "Xray gun from 85 to 60 TC."
+ - tweak: "Augments can now be used by everyone, as robot-specific ones will require FBP organ revamp."
+ - tweak: "Anti-Materiel Rifle can once again be used with thermals."
+ - tweak: "Augment guns use slightly less blood / system instability to charge, so it doesn't kill you dead in moments."
+ - bugfix: "Energy Shields work again, and can be colored."
diff --git a/icons/mob/items/lefthand_melee.dmi b/icons/mob/items/lefthand_melee.dmi
index 7df4b09d86..eff1850a3d 100644
Binary files a/icons/mob/items/lefthand_melee.dmi and b/icons/mob/items/lefthand_melee.dmi differ
diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi
index e32b870d99..5348b4091f 100644
Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ
diff --git a/icons/obj/railgun.dmi b/icons/obj/railgun.dmi
index 0143f9053e..b47d8671a3 100644
Binary files a/icons/obj/railgun.dmi and b/icons/obj/railgun.dmi differ
diff --git a/polaris.dme b/polaris.dme
index 498de062eb..33d64e5d5f 100644
--- a/polaris.dme
+++ b/polaris.dme
@@ -357,6 +357,7 @@
#include "code\datums\uplink\hardsuit_modules.dm"
#include "code\datums\uplink\implants.dm"
#include "code\datums\uplink\medical.dm"
+#include "code\datums\uplink\resources.dm"
#include "code\datums\uplink\stealth_items.dm"
#include "code\datums\uplink\stealthy_weapons.dm"
#include "code\datums\uplink\telecrystals.dm"
@@ -1491,6 +1492,7 @@
#include "code\modules\clothing\ears\ears.dm"
#include "code\modules\clothing\glasses\glasses.dm"
#include "code\modules\clothing\glasses\hud.dm"
+#include "code\modules\clothing\gloves\antagonist.dm"
#include "code\modules\clothing\gloves\arm_guards.dm"
#include "code\modules\clothing\gloves\boxing.dm"
#include "code\modules\clothing\gloves\color.dm"
@@ -2513,6 +2515,7 @@
#include "code\modules\projectiles\guns\launcher\rocket.dm"
#include "code\modules\projectiles\guns\launcher\syringe_gun.dm"
#include "code\modules\projectiles\guns\magnetic\bore.dm"
+#include "code\modules\projectiles\guns\magnetic\gasthrower.dm"
#include "code\modules\projectiles\guns\magnetic\magnetic.dm"
#include "code\modules\projectiles\guns\magnetic\magnetic_construction.dm"
#include "code\modules\projectiles\guns\magnetic\magnetic_railgun.dm"