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"