diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index f06f7ac1b37..240cca4bdc7 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -9,6 +9,9 @@ var/list/doppler_arrays = list() anchored = 1 atom_say_verb = "states coldly" var/list/logged_explosions = list() + var/explosion_target + var/datum/tech/toxins/toxins_tech + var/max_toxins_tech = 7 /datum/explosion_log var/logged_time @@ -26,6 +29,8 @@ var/list/doppler_arrays = list() /obj/machinery/doppler_array/New() ..() doppler_arrays += src + explosion_target = rand(8, 20) + toxins_tech = new /datum/tech/toxins(src) /obj/machinery/doppler_array/Destroy() doppler_arrays -= src @@ -46,6 +51,10 @@ var/list/doppler_arrays = list() power_change() to_chat(user, "You unfasten [src].") playsound(loc, I.usesound, 50, 1) + if(istype(I, /obj/item/disk/tech_disk)) + var/obj/item/disk/tech_disk/disk = I + disk.load_tech(toxins_tech) + to_chat(user, "You swipe the disk into [src].") else return ..() @@ -142,6 +151,15 @@ var/list/doppler_arrays = list() messages += "Theoretical: Epicenter radius: [orig_dev_range]. Outer radius: [orig_heavy_range]. Shockwave radius: [orig_light_range]." logged_explosions.Insert(1, new /datum/explosion_log(station_time_timestamp(), "[x0],[y0]", "[devastation_range], [heavy_impact_range], [light_impact_range]", capped ? "[orig_dev_range], [orig_heavy_range], [orig_light_range]" : "n/a")) //Newer logs appear first messages += "Event successfully logged in internal database." + var/miss_by = abs(explosion_target - orig_light_range) + var/tmp_tech = max_toxins_tech - miss_by + if(!miss_by) + messages += "Explosion size matches target." + else + messages += "Target ([explosion_target]) missed by : [miss_by]." + if(tmp_tech > toxins_tech.level) + toxins_tech.level = tmp_tech + messages += "Toxins technology level upgraded to [toxins_tech.level]. Swipe a technology disk to save data." for(var/message in messages) atom_say(message) @@ -174,6 +192,8 @@ var/list/doppler_arrays = list() "actual_size_message" = E.actual_size_message, "theoretical_size_message" = E.theoretical_size_message, "unique_datum_id" = E.UID())) + data["explosion_target"] = explosion_target + data["toxins_tech"] = toxins_tech.level data["explosion_data"] = explosion_data data["printing"] = active_timers return data diff --git a/code/game/objects/items/weapons/rpd.dm b/code/game/objects/items/weapons/rpd.dm index 5fc6c38689a..63a3ffef0c5 100644 --- a/code/game/objects/items/weapons/rpd.dm +++ b/code/game/objects/items/weapons/rpd.dm @@ -30,6 +30,9 @@ var/whatdpipe = PIPE_DISPOSALS_STRAIGHT //What kind of disposals pipe is it? var/spawndelay = RPD_COOLDOWN_TIME var/walldelay = RPD_WALLBUILD_TIME + var/ranged = FALSE + var/primary_sound = 'sound/machines/click.ogg' + var/alt_sound = null /obj/item/rpd/New() ..() @@ -41,11 +44,24 @@ QDEL_NULL(spark_system) return ..() +/obj/item/rpd/bluespace + name = "bluespace rapid pipe dispenser" + desc = "This device can rapidly dispense atmospherics and disposals piping, manipulate loose piping, and recycle any detached pipes it is applied to, at any range." + icon_state = "brpd" + materials = list(MAT_METAL = 75000, MAT_GLASS = 37500, MAT_SILVER = 3000) + origin_tech = "engineering=4;materials=2;bluespace=3" + ranged = TRUE + primary_sound = 'sound/items/PSHOOM.ogg' + alt_sound = 'sound/items/PSHOOM_2.ogg' + //Procs /obj/item/rpd/proc/activate_rpd(delay) //Maybe makes sparks and activates cooldown if there is a delay - playsound(loc, "sound/machines/click.ogg", 50, 1) - if(prob(15)) + if(alt_sound && prob(3)) + playsound(src, alt_sound, 50, 1) + else + playsound(src, primary_sound, 50, 1) + if(prob(15) && !ranged) spark_system.start() if(delay) lastused = world.time @@ -188,7 +204,7 @@ var/list/pipemenu = list( ..() if(loc != user) return - if(!proximity) + if(!proximity && !ranged) return if(world.time < lastused + spawndelay) return @@ -201,6 +217,8 @@ var/list/pipemenu = list( if(target.rpd_act(user, src) == TRUE) // If the object we are clicking on has a valid RPD interaction for just that specific object, do that and nothing else. // Example: clicking on a pipe with a RPD in rotate mode should rotate that pipe and ignore everything else on the tile. + if(ranged) + user.Beam(T, icon_state="rped_upgrade", icon='icons/effects/effects.dmi', time=5) return // If we get this far, we have to check every object in the tile, to make sure that none of them block RPD usage on this tile. @@ -212,6 +230,8 @@ var/list/pipemenu = list( return // If we get here, then we're effectively acting on the turf, probably placing a pipe. + if(ranged) //woosh beam if bluespaced at a distance + user.Beam(T,icon_state="rped_upgrade", icon='icons/effects/effects.dmi', time=5) T.rpd_act(user, src) #undef RPD_COOLDOWN_TIME diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm index 90fb913c352..d3814b1af98 100644 --- a/code/game/objects/items/weapons/tanks/tank_types.dm +++ b/code/game/objects/items/weapons/tanks/tank_types.dm @@ -27,6 +27,9 @@ to_chat(user, text("The meter on the [src.name] indicates you are almost out of air!")) //playsound(usr, 'sound/effects/alert.ogg', 50, 1) +obj/item/tank/oxygen/empty/New() + ..() + air_contents.oxygen = null /obj/item/tank/oxygen/yellow desc = "A tank of oxygen, this one is yellow." @@ -142,11 +145,19 @@ to_chat(user, text("The meter on the [src.name] indicates you are almost out of air!")) user << sound('sound/effects/alert.ogg') +obj/item/tank/emergency_oxygen/empty/New() + ..() + air_contents.oxygen = null + /obj/item/tank/emergency_oxygen/engi name = "extended-capacity emergency oxygen tank" icon_state = "emergency_engi" volume = 6 +obj/item/tank/emergency_oxygen/engi/empty/New() + ..() + air_contents.oxygen = null + /obj/item/tank/emergency_oxygen/syndi name = "suspicious emergency oxygen tank" icon_state = "emergency_syndi" @@ -158,6 +169,10 @@ icon_state = "emergency_double" volume = 10 +obj/item/tank/emergency_oxygen/double/empty/New() + ..() + air_contents.oxygen = null + /obj/item/tank/emergency_oxygen/double/full name = "pressurized double emergency oxygen tank" desc = "Used for \"emergencies,\" it actually contains a fair amount of oxygen." diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 6008b093c5a..8d0b66fea3b 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -170,12 +170,13 @@ /turf/simulated/wall/rpd_act(mob/user, obj/item/rpd/our_rpd) if(our_rpd.mode == RPD_ATMOS_MODE) - playsound(src, "sound/weapons/circsawhit.ogg", 50, 1) - user.visible_message("[user] starts drilling a hole in [src]...", "You start drilling a hole in [src]...", "You hear drilling.") - if(!do_after(user, our_rpd.walldelay, target = src)) //Drilling into walls takes time - return + if(!our_rpd.ranged) + playsound(src, "sound/weapons/circsawhit.ogg", 50, 1) + user.visible_message("[user] starts drilling a hole in [src]...", "You start drilling a hole in [src]...", "You hear drilling.") + if(!do_after(user, our_rpd.walldelay, target = src)) //Drilling into walls takes time + return our_rpd.create_atmos_pipe(user, src) - else if(our_rpd.mode == RPD_DISPOSALS_MODE) + else if(our_rpd.mode == RPD_DISPOSALS_MODE && !our_rpd.ranged) return else ..() diff --git a/code/modules/research/designs/bluespace_designs.dm b/code/modules/research/designs/bluespace_designs.dm index 029936e1f3a..9a44b10d40c 100644 --- a/code/modules/research/designs/bluespace_designs.dm +++ b/code/modules/research/designs/bluespace_designs.dm @@ -80,3 +80,13 @@ materials = list(MAT_METAL = 150, MAT_GLASS = 100) build_path = /obj/item/radio/beacon category = list("Bluespace") + +/datum/design/rpd + name = "Bluespace Rapid Pipe Dispenser (BRPD)" + desc = "Similar to the Rapid Pipe Dispenser, lets you rapidly dispense pipes. Now at long range!" + req_tech = list("bluespace" = 3, "toxins" = 6) + id = "brpd" + build_type = PROTOLATHE + materials = list(MAT_METAL = 75000, MAT_GLASS = 37500, MAT_SILVER = 3000) + build_path = /obj/item/rpd/bluespace + category = list("Bluespace") \ No newline at end of file diff --git a/code/modules/research/designs/equipment_designs.dm b/code/modules/research/designs/equipment_designs.dm index 38dc2f19f7b..d0e06906f6b 100644 --- a/code/modules/research/designs/equipment_designs.dm +++ b/code/modules/research/designs/equipment_designs.dm @@ -101,11 +101,21 @@ build_path = /obj/item/bikehorn/airhorn category = list("Equipment") +/datum/design/breath_mask + name = "Breath mask" + desc = "A close-fitting mask that can be connected to an air supply." + id = "breathmask" + req_tech = list("toxins" = 3) + build_type = PROTOLATHE + materials = list(MAT_METAL = 300, MAT_GLASS = 200) + build_path = /obj/item/clothing/mask/breath + category = list("Equipment") + /datum/design/welding_mask name = "Welding Gas Mask" desc = "A gas mask with built in welding goggles and face shield. Looks like a skull, clearly designed by a nerd." id = "weldingmask" - req_tech = list("materials" = 2, "engineering" = 3) + req_tech = list("materials" = 2, "engineering" = 3, "toxins" = 3) build_type = PROTOLATHE materials = list(MAT_METAL = 3000, MAT_GLASS = 1000) build_path = /obj/item/clothing/mask/gas/welding diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index bbaae598fdb..7d8b50d21be 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -80,7 +80,7 @@ materials = list(MAT_METAL=500, MAT_GLASS=50) build_path = /obj/item/clothing/mask/muzzle/safety/shock category = list("Miscellaneous") - + /datum/design/data_disk name = "Genetics Data Disk" desc = "Disk that allows you to store genetic data." @@ -90,3 +90,43 @@ materials = list(MAT_METAL=300, MAT_GLASS=100) build_path = /obj/item/disk/data category = list("Miscellaneous") + +/datum/design/emergency_oxygen + name = "Empty Emergency Oxygen Tank" + desc = "Used for emergencies. Onl contains very little oxygen once filled up." + id = "emergencyoxygen" + req_tech = list("toxins" = 3) + build_type = PROTOLATHE + materials = list(MAT_METAL=500, MAT_GLASS=100) + build_path = /obj/item/tank/emergency_oxygen/empty + category = list("Miscellaneous") + +/datum/design/extended_oxygen + name = "Empty Extended Emergency Oxygen Tank" + desc = "Used for emergencies. Can contain a decent amount of oxygen once filled up." + id = "extendedoxygen" + req_tech = list("toxins" = 4) + build_type = PROTOLATHE + materials = list(MAT_METAL=800, MAT_GLASS=100) + build_path = /obj/item/tank/emergency_oxygen/engi/empty + category = list("Miscellaneous") + +/datum/design/double_oxygen + name = "Empty Double Emergency Oxygen Tank" + desc = "Used for emergencies. Can contain a good amount of oxygen once filled up." + id = "doubleoxygen" + req_tech = list("toxins" = 5) + build_type = PROTOLATHE + materials = list(MAT_METAL=1500, MAT_GLASS=200) + build_path = /obj/item/tank/emergency_oxygen/double/empty + category = list("Miscellaneous") + +/datum/design/oxygen_tank + name = "Empty Oxygen Tank" + desc = "A large, empty air tank." + id = "oxygentank" + req_tech = list("toxins" = 5) + build_type = PROTOLATHE + materials = list(MAT_METAL=3000, MAT_GLASS=500) + build_path = /obj/item/tank/oxygen/empty + category = list("Miscellaneous") diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm index 27497fcac9a..32f5ab879cd 100644 --- a/code/modules/research/research.dm +++ b/code/modules/research/research.dm @@ -271,6 +271,13 @@ research holder datum. id = "programming" max_level = 7 +/datum/tech/toxins //not meant to be raised by deconstruction, do not give objects toxins as an origin_tech + name = "Toxins Research" + desc = "Research into plasma based explosive devices. Upgrade through testing explosives in the toxins lab." + id = "toxins" + max_level = 7 + rare = 2 + /datum/tech/syndicate name = "Illegal Technologies Research" desc = "The study of technologies that violate standard Nanotrasen regulations." diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index 3d7ae0a4fb4..0f6ff11258b 100644 Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index a7ac19a5a6c..94609f65f00 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi index 1111dfb02ee..7ff4d229863 100644 Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ diff --git a/nano/templates/doppler_array.tmpl b/nano/templates/doppler_array.tmpl index d3bb40744b2..5747cd847a2 100644 --- a/nano/templates/doppler_array.tmpl +++ b/nano/templates/doppler_array.tmpl @@ -1,3 +1,5 @@ +
No explosions logged this shift.