diff --git a/code/game/objects/effects/temporary_visuals/projectiles/impact.dm b/code/game/objects/effects/temporary_visuals/projectiles/impact.dm index 879fd3c0093..e4c45d83deb 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/impact.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/impact.dm @@ -37,6 +37,26 @@ /obj/effect/projectile/impact/wormhole icon_state = "wormhole_g" +/obj/effect/projectile/impact/laser/emitter/psy + name = "psychosiphoning impact" + icon_state = "impact_greyscale" + color = COLOR_PINK + +/obj/effect/projectile/impact/laser/emitter/magnetic + name = "magnetogenerative impact" + icon_state = "impact_greyscale" + color = COLOR_SILVER + +/obj/effect/projectile/impact/laser/emitter/quake + name = "seismodisintegrating impact" + icon_state = "impact_greyscale" + color = COLOR_BROWNER_BROWN + +/obj/effect/projectile/impact/laser/emitter/blast + name = "hyperconcussive impact" + icon_state = "impact_greyscale" + color = COLOR_ORANGE + /obj/effect/projectile/impact/laser/emitter name = "emitter impact" icon_state = "impact_emitter" diff --git a/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm b/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm index a68f58e1709..ec996ad6ad8 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm @@ -29,6 +29,26 @@ /obj/effect/projectile/muzzle/wormhole icon_state = "wormhole_g" +/obj/effect/projectile/muzzle/laser/emitter/psy + name = "psychosiphoning flash" + icon_state = "muzzle_greyscale" + color = COLOR_PINK + +/obj/effect/projectile/muzzle/laser/emitter/magnetic + name = "magnetogenerative flash" + icon_state = "muzzle_greyscale" + color = COLOR_SILVER + +/obj/effect/projectile/muzzle/laser/emitter/quake + name = "seismodisintegrating flash" + icon_state = "muzzle_greyscale" + color = COLOR_BROWNER_BROWN + +/obj/effect/projectile/muzzle/laser/emitter/blast + name = "hyperconcussive flash" + icon_state = "muzzle_greyscale" + color = COLOR_ORANGE + /obj/effect/projectile/muzzle/laser/emitter name = "emitter flash" icon_state = "muzzle_emitter" diff --git a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm index 4c8f46b7fd4..6cbaf65311a 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm @@ -58,6 +58,38 @@ name = "emitter beam" icon_state = "emitter" +/obj/effect/projectile/tracer/laser/emitter/bluelens + name = "electrodisruptive emitter beam" + icon_state = "u_laser" + +/obj/effect/projectile/tracer/laser/emitter/redlens + name = "hyperenergetic emitter beam" + icon_state = "beam_heavy" + +/obj/effect/projectile/tracer/laser/emitter/bioregen + name = "bioregenerative emitter beam" + icon_state = "solar" + +/obj/effect/projectile/tracer/laser/emitter/psy + name = "psychosiphoning emitter beam" + icon_state = "tracer_greyscale" + color = COLOR_PINK + +/obj/effect/projectile/tracer/laser/emitter/magnetic + name = "magnetogenerative emitter beam" + icon_state = "tracer_greyscale" + color = COLOR_SILVER + +/obj/effect/projectile/tracer/laser/emitter/quake + name = "seismodisintegrating emitter beam" + icon_state = "tracer_greyscale" + color = COLOR_BROWNER_BROWN + +/obj/effect/projectile/tracer/laser/emitter/blast + name = "hyperconcussive emitter beam" + icon_state = "tracer_greyscale" + color = COLOR_ORANGE + /obj/effect/projectile/tracer/sniper icon_state = "sniper" diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 5ffcef77c79..ef80fc16174 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -27,6 +27,10 @@ var/maximum_fire_delay = 10 SECONDS ///Min delay before firing var/minimum_fire_delay = 2 SECONDS + ///Modifier to the preceeding two numbers + var/fire_rate_mod = 1 + ///Deactivates the "pause every 3 shots" system + var/no_shot_counter = FALSE ///When was the last shot var/last_shot = 0 ///Number of shots made (gets reset every few shots) @@ -57,6 +61,8 @@ var/charge = 0 ///stores the direction and orientation of the last projectile var/last_projectile_params + //the disk in the gun + var/obj/item/emitter_disk/diskie /obj/machinery/power/emitter/Initialize(mapload) . = ..() @@ -125,7 +131,7 @@ else if(!powered) . += span_notice("Its status display is glowing faintly.") else - . += span_notice("Its status display reads: Emitting one beam between [DisplayTimeText(minimum_fire_delay)] and [DisplayTimeText(maximum_fire_delay)].") + . += span_notice("Its status display reads: Emitting one beam between [DisplayTimeText(minimum_fire_delay * fire_rate_mod)] and [DisplayTimeText(maximum_fire_delay * fire_rate_mod)].") . += span_notice("Power consumption at [display_power(active_power_usage, convert = FALSE)].") /obj/machinery/power/emitter/should_have_node() @@ -246,11 +252,11 @@ projectile.fire(dir2angle(dir)) if(!manual) last_shot = world.time - if(shot_number < 3) - fire_delay = 20 + if(shot_number < 3 || no_shot_counter) + fire_delay = 20 * fire_rate_mod shot_number ++ else - fire_delay = rand(minimum_fire_delay,maximum_fire_delay) + fire_delay = rand(minimum_fire_delay,maximum_fire_delay) * fire_rate_mod shot_number = 0 return projectile @@ -311,6 +317,8 @@ /obj/machinery/power/emitter/crowbar_act(mob/living/user, obj/item/item) if(panel_open && gun) return remove_gun(user) + if(panel_open && diskie) + return remove_disk(user) default_deconstruction_crowbar(item) return TRUE @@ -343,8 +351,30 @@ wires.interact(user) return if(panel_open && !gun && istype(item,/obj/item/gun/energy)) + if(diskie) + to_chat(user, span_warning("Remove the Diode Disk before inserting a gun.")) + return if(integrate(item,user)) return + if(panel_open && !gun && istype(item,/obj/item/emitter_disk)) + var/obj/item/emitter_disk/config_disk = item + if(!user.transferItemToLoc(config_disk, src)) + balloon_alert(user, "stuck in hand!") + return + if(diskie) + user.put_in_hands(diskie) + balloon_alert(user, "disks swapped!") + else + balloon_alert(user, "disk inserted") + diskie = config_disk + projectile_type = diskie.stored_proj + projectile_sound = diskie.stored_sound + fire_rate_mod = diskie.fire_rate_mod + no_shot_counter = diskie.no_shot_counter + playsound(src, 'sound/machines/card_slide.ogg', 50) + to_chat(user, span_notice("You update the [src]'s diode configuration with the [config_disk].")) + if(diskie.consumable) + qdel(diskie) return ..() @@ -373,6 +403,19 @@ set_projectile() return TRUE +/obj/machinery/power/emitter/proc/remove_disk(mob/user) + if(!diskie) + return + if(diskie.consumed_on_removal) + qdel(diskie) + else + user.put_in_hands(diskie) + diskie = null + playsound(src, 'sound/machines/card_slide.ogg', 50, TRUE) + set_projectile() + return TRUE + + /obj/machinery/power/emitter/proc/set_projectile() if(LAZYLEN(gun_properties)) if(mode || !gun_properties["lethal_projectile"]) @@ -384,6 +427,8 @@ return projectile_type = initial(projectile_type) projectile_sound = initial(projectile_sound) + fire_rate_mod = initial(fire_rate_mod) + no_shot_counter = initial(no_shot_counter) /obj/machinery/power/emitter/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) @@ -569,3 +614,58 @@ req_access = list("science") welded = TRUE use_power = NO_POWER_USE + +/obj/item/emitter_disk + name = "/improper Diode Disk: Debugger" + desc = "This disk can be used on an emitter with an open panel to reset its projectile. Unless this was handed to you by an admin, you should report this on github." + icon = 'icons/obj/devices/circuitry_n_data.dmi' + icon_state = "datadisk6" + var/stored_proj = /obj/projectile/beam/emitter/hitscan + var/stored_sound = 'sound/items/weapons/emitter.ogg' + var/consumed_on_removal = TRUE + var/consumable = TRUE + var/fire_rate_mod = 1 + var/no_shot_counter = FALSE + +/obj/item/emitter_disk/stamina + name = "/improper Diode Disk: Electrodisruptive" + desc = "This disk can be used on an emitter with an open panel to make it shoot lasers which will increase the integrity of supermatter crystals and exhaust living creatures. The disk will be consumed in the process." + stored_proj = /obj/projectile/beam/emitter/hitscan/bluelens + consumed_on_removal = FALSE + consumable = FALSE + +/obj/item/emitter_disk/healing + name = "/improper Diode Disk: Bioregenerative" + desc = "This disk can be installed into an emitter with an open panel to make it shoot lasers which will heal the physical damages of living creatures." + stored_proj = /obj/projectile/beam/emitter/hitscan/bioregen + consumed_on_removal = FALSE + consumable = FALSE + +/obj/item/emitter_disk/incendiary + name = "/improper Diode Disk: Conflagratory" + desc = "This disk can be used on an emitter with an open panel to make it shoot lasers which will set living creatures ablaze." + stored_proj = /obj/projectile/beam/emitter/hitscan/incend + consumed_on_removal = FALSE + consumable = FALSE + +/obj/item/emitter_disk/sanity + name = "/improper Diode Disk: Psychosiphoning" + desc = "This disk can be used on an emitter with an open panel to make it shoot lasers which will depress living creatures and calm supermatter crystals." + stored_proj = /obj/projectile/beam/emitter/hitscan/psy + consumed_on_removal = FALSE + consumable = FALSE + +/obj/item/emitter_disk/magnetic + name = "/improper Diode Disk: Magnetogenerative" + desc = "This disk can be used on an emitter with an open panel to make it shoot lasers which will attract nearby objects." + stored_proj = /obj/projectile/beam/emitter/hitscan/magnetic + consumed_on_removal = FALSE + consumable = FALSE + +/obj/item/emitter_disk/blast + name = "/improper Diode Disk: Hyperconcussive" + desc = "This disk, loaded with proprietary syndicate firmware, can be used on an emitter with an open panel to make it shoot beams of concussive force which will cause small explosions." + stored_proj = /obj/projectile/beam/emitter/hitscan/blast + consumed_on_removal = FALSE + consumable = FALSE + fire_rate_mod = 2 diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 1e4e4b361b5..3b92fb6aba3 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -391,6 +391,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) update_appearance() delamination_strategy.lights(src) delamination_strategy.filters(src) + absorption_ratio = clamp(absorption_ratio - 0.05, 0.15, 1) return TRUE // SupermatterMonitor UI for ghosts only. Inherited attack_ghost will call this. diff --git a/code/modules/power/supermatter/supermatter_hit_procs.dm b/code/modules/power/supermatter/supermatter_hit_procs.dm index 1f929ba0ed2..056081bda7e 100644 --- a/code/modules/power/supermatter/supermatter_hit_procs.dm +++ b/code/modules/power/supermatter/supermatter_hit_procs.dm @@ -24,7 +24,6 @@ if(projectile.armor_flag != BULLET || kiss_power) if(kiss_power) psy_coeff = 1 - external_power_immediate += projectile.damage * bullet_energy + kiss_power log_activation(who = projectile.firer, how = projectile.fired_from) else external_damage_immediate += projectile.damage * bullet_energy * 0.1 @@ -34,6 +33,17 @@ if(damage_to_be > danger_point) visible_message(span_notice("[src] compresses under stress, resisting further impacts!")) playsound(src, 'sound/effects/supermatter.ogg', 50, TRUE) + if(istype(projectile, /obj/projectile/beam/emitter/hitscan)) + var/obj/projectile/beam/emitter/hitscan/mahlaser = projectile + if(mahlaser?.integrity_heal) + damage = max(0, damage - mahlaser?.integrity_heal) + if(mahlaser?.energy_reduction) + internal_energy = max(0, internal_energy - mahlaser?.energy_reduction) + if(mahlaser?.psi_change) + psy_coeff = clamp(psy_coeff + mahlaser?.psi_change, 0, 1) + external_power_immediate += projectile.damage * bullet_energy + kiss_power + if(istype(projectile, /obj/projectile/beam/emitter/hitscan/magnetic)) + absorption_ratio = clamp(absorption_ratio + 0.05, 0.15, 1) qdel(projectile) return COMPONENT_BULLET_BLOCKED diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 27ac40c62b9..fe4f9c47d39 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -243,6 +243,124 @@ impact_light_intensity = 7 impact_light_range = 2.5 impact_light_color_override = COLOR_LIME + // Subtract this from SM damage on hit for lasers + var/integrity_heal + // Subtract this from SM energy on hit for lasers + var/energy_reduction + // Add this to SM psi coefficient on hit for lasers + var/psi_change + +/obj/projectile/beam/emitter/hitscan/bluelens + name = "electrodisruptive beam" + light_color = LIGHT_COLOR_BLUE + muzzle_type = /obj/effect/projectile/muzzle/pulse + tracer_type = /obj/effect/projectile/tracer/laser/emitter/bluelens + impact_type = /obj/effect/projectile/impact/pulse + hitscan_light_color_override = COLOR_BLUE_LIGHT + muzzle_flash_color_override = COLOR_BLUE_LIGHT + impact_light_color_override = COLOR_BLUE_LIGHT + damage_type = STAMINA + integrity_heal = 0.25 + energy_reduction = 60 + +/obj/projectile/beam/emitter/hitscan/bioregen + name = "bioregenerative beam" + light_color = LIGHT_COLOR_BRIGHT_YELLOW + muzzle_type = /obj/effect/projectile/muzzle/solar + tracer_type = /obj/effect/projectile/tracer/laser/emitter/bioregen + impact_type = /obj/effect/projectile/impact/solar + hitscan_light_color_override = COLOR_LIGHT_YELLOW + muzzle_flash_color_override = COLOR_LIGHT_YELLOW + impact_light_color_override = COLOR_LIGHT_YELLOW + damage_type = STAMINA + damage = 0 + var/healing_done = 5 + +/obj/projectile/beam/emitter/hitscan/bioregen/on_hit(atom/target, blocked, pierce_hit) + . = ..() + if(!iscarbon(target)) + return + var/mob/living/carbon/healed_guy = target + healed_guy.heal_bodypart_damage(brute = healing_done, burn = healing_done, updating_health = FALSE) + +/obj/projectile/beam/emitter/hitscan/incend + name = "conflagratory beam" + light_color = LIGHT_COLOR_ORANGE + muzzle_type = /obj/effect/projectile/muzzle/heavy_laser + tracer_type = /obj/effect/projectile/tracer/laser/emitter/redlens + impact_type = /obj/effect/projectile/impact/heavy_laser + hitscan_light_color_override = COLOR_ORANGE + muzzle_flash_color_override = COLOR_ORANGE + impact_light_color_override = COLOR_ORANGE + damage = 20 + integrity_heal = -0.15 + energy_reduction = -150 + psi_change = -0.1 + +/obj/projectile/beam/emitter/hitscan/incend/on_hit(atom/target, blocked, pierce_hit) + . = ..() + if(!isliving(target)) + return + var/mob/living/burnt_guy = target + burnt_guy.adjust_fire_stacks(5) + burnt_guy.ignite_mob() + +/obj/projectile/beam/emitter/hitscan/psy + name = "psychosiphoning beam" + light_color = LIGHT_COLOR_PINK + muzzle_type = /obj/effect/projectile/muzzle/laser/emitter/psy + tracer_type = /obj/effect/projectile/tracer/laser/emitter/psy + impact_type = /obj/effect/projectile/impact/laser/emitter/psy + hitscan_light_color_override = COLOR_BLUSH_PINK + muzzle_flash_color_override = COLOR_BLUSH_PINK + impact_light_color_override = COLOR_BLUSH_PINK + damage = 0 + energy_reduction = -25 + psi_change = 0.25 + +/obj/projectile/beam/emitter/hitscan/psy/on_hit(atom/target, blocked, pierce_hit) + . = ..() + if(!isliving(target)) + return + var/mob/living/siphoned = target + siphoned.mob_mood.adjust_sanity(-25) + to_chat(siphoned, span_warning("Suddenly, everything feels just a little bit worse!")) + +/obj/projectile/beam/emitter/hitscan/magnetic + name = "magnetogenerative beam" + light_color = COLOR_SILVER + muzzle_type = /obj/effect/projectile/muzzle/laser/emitter/magnetic + tracer_type = /obj/effect/projectile/tracer/laser/emitter/magnetic + impact_type = /obj/effect/projectile/impact/laser/emitter/magnetic + hitscan_light_color_override = COLOR_SILVER + muzzle_flash_color_override = COLOR_SILVER + impact_light_color_override = COLOR_SILVER + damage = 0 + +/obj/projectile/beam/emitter/hitscan/magnetic/on_hit(atom/target, blocked, pierce_hit) + . = ..() + var/turf/turf_to_magnet = get_turf(target) + goonchem_vortex(turf_to_magnet, FALSE, 4) + +/obj/projectile/beam/emitter/hitscan/blast + name = "hyperconcussive beam" + light_color = LIGHT_COLOR_ORANGE + muzzle_type = /obj/effect/projectile/muzzle/laser/emitter/magnetic + tracer_type = /obj/effect/projectile/tracer/laser/emitter/magnetic + impact_type = /obj/effect/projectile/impact/laser/emitter/magnetic + hitscan_light_color_override = COLOR_ORANGE + muzzle_flash_color_override = COLOR_ORANGE + impact_light_color_override = COLOR_ORANGE + damage = 0 + integrity_heal = -2 + energy_reduction = -500 + + +/obj/projectile/beam/emitter/hitscan/blast/on_hit(atom/target, blocked, pierce_hit) + . = ..() + var/turf/turf_to_explode = get_turf(target) + explosion(turf_to_explode, 0, 1, 2) + /obj/projectile/beam/lasertag name = "laser tag beam" diff --git a/code/modules/research/designs/power_designs.dm b/code/modules/research/designs/power_designs.dm index eed1eb9a8b6..8b4d7074987 100644 --- a/code/modules/research/designs/power_designs.dm +++ b/code/modules/research/designs/power_designs.dm @@ -212,3 +212,68 @@ RND_CATEGORY_STOCK_PARTS + RND_SUBCATEGORY_STOCK_PARTS_TURBINE ) departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING + +/datum/design/diode_disk_stamina + name = "Electrodisruptive Diode Disk" + desc = "A stamina damaging and supermatter crystal healing Diode Disk." + id = "diode_disk_stamina" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.5, /datum/material/glass =SMALL_MATERIAL_AMOUNT, /datum/material/gold =SMALL_MATERIAL_AMOUNT) + construction_time = 0.5 SECONDS + build_path = /obj/item/emitter_disk/stamina + category = list( + RND_CATEGORY_EQUIPMENT + ) + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_ENGINEERING + +/datum/design/diode_disk_healing + name = "Bioregenerative Diode Disk" + desc = "A living creature healing Diode Disk." + id = "diode_disk_healing" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.5, /datum/material/glass =SMALL_MATERIAL_AMOUNT, /datum/material/silver =SMALL_MATERIAL_AMOUNT) //silver is medical metal. Why? who knows. + construction_time = 0.5 SECONDS + build_path = /obj/item/emitter_disk/healing + category = list( + RND_CATEGORY_EQUIPMENT + ) + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_ENGINEERING + +/datum/design/diode_disk_incendiary + name = "Conflagratory Diode Disk" + desc = "A high energy incendiary Diode Disk." + id = "diode_disk_incendiary" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.5, /datum/material/glass =SMALL_MATERIAL_AMOUNT, /datum/material/diamond =SMALL_MATERIAL_AMOUNT * 0.5, /datum/material/plasma =SMALL_MATERIAL_AMOUNT * 2) + construction_time = 0.5 SECONDS + build_path = /obj/item/emitter_disk/incendiary + category = list( + RND_CATEGORY_EQUIPMENT + ) + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_ENGINEERING + +/datum/design/diode_disk_sanity + name = "Psychosiphoning Diode Disk" + desc = "An supermatter comforting creature depressing Diode Disk." + id = "diode_disk_sanity" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.5, /datum/material/glass =SMALL_MATERIAL_AMOUNT, /datum/material/uranium =SMALL_MATERIAL_AMOUNT * 0.5) //Uranium, the metal of love and warmth (from decay heat). + construction_time = 0.5 SECONDS + build_path = /obj/item/emitter_disk/sanity + category = list( + RND_CATEGORY_EQUIPMENT + ) + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_ENGINEERING + +/datum/design/diode_disk_magnetic + name = "Magnetogenerative Diode Disk" + desc = "A mol absorbing item attracting Diode Disk." + id = "diode_disk_magnetic" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.5, /datum/material/glass =SMALL_MATERIAL_AMOUNT, /datum/material/titanium =SMALL_MATERIAL_AMOUNT * 0.5) + construction_time = 0.5 SECONDS + build_path = /obj/item/emitter_disk/magnetic + category = list( + RND_CATEGORY_EQUIPMENT + ) + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_ENGINEERING diff --git a/code/modules/research/techweb/nodes/atmos_nodes.dm b/code/modules/research/techweb/nodes/atmos_nodes.dm index e063629af97..3da5b00ec40 100644 --- a/code/modules/research/techweb/nodes/atmos_nodes.dm +++ b/code/modules/research/techweb/nodes/atmos_nodes.dm @@ -63,6 +63,7 @@ "pacman", "mech_generator", "plasmacutter", + "diode_disk_incendiary", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) discount_experiments = list(/datum/experiment/ordnance/gaseous/plasma = TECHWEB_TIER_2_POINTS) diff --git a/code/modules/research/techweb/nodes/engi_nodes.dm b/code/modules/research/techweb/nodes/engi_nodes.dm index 9a4d6cf6439..19c925eb8c2 100644 --- a/code/modules/research/techweb/nodes/engi_nodes.dm +++ b/code/modules/research/techweb/nodes/engi_nodes.dm @@ -179,6 +179,7 @@ "welding_goggles", "tray_goggles", "geigercounter", + "diode_disk_stamina" ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) announce_channels = list(RADIO_CHANNEL_ENGINEERING) @@ -227,6 +228,7 @@ "modular_shield_charger", "modular_shield_well", "modular_shield_console", + "diode_disk_magnetic", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) diff --git a/code/modules/research/techweb/nodes/medbay_nodes.dm b/code/modules/research/techweb/nodes/medbay_nodes.dm index bd74b5b653c..0e16f9cacbd 100644 --- a/code/modules/research/techweb/nodes/medbay_nodes.dm +++ b/code/modules/research/techweb/nodes/medbay_nodes.dm @@ -81,6 +81,8 @@ "defibmount", "medicalbed_emergency", "piercesyringe", + "diode_disk_healing", + "diode_disk_sanity", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) required_experiments = list(/datum/experiment/scanning/reagent/haloperidol) diff --git a/code/modules/uplink/uplink_items/job.dm b/code/modules/uplink/uplink_items/job.dm index cb10a3aa39f..7554ab74eb5 100644 --- a/code/modules/uplink/uplink_items/job.dm +++ b/code/modules/uplink/uplink_items/job.dm @@ -408,3 +408,10 @@ BUBBER REMOVE END*/ progression_minimum = 30 MINUTES purchasable_from = parent_type::purchasable_from & ~UPLINK_SPY +/datum/uplink_item/role_restricted/concussivedisk + name = "Hyperconcussive Diode Disk" + desc = "A diode configuration disk that allows an emitter to shoot potent explosive lasers. \ + Please note that this will halve the fire-rate of the emitter." + item = /obj/item/emitter_disk/blast + cost = 5 + restricted_roles = list(JOB_STATION_ENGINEER, JOB_CHIEF_ENGINEER) diff --git a/icons/obj/weapons/guns/projectiles_impact.dmi b/icons/obj/weapons/guns/projectiles_impact.dmi index 710507d4c85..5aea86fa8dc 100644 Binary files a/icons/obj/weapons/guns/projectiles_impact.dmi and b/icons/obj/weapons/guns/projectiles_impact.dmi differ diff --git a/icons/obj/weapons/guns/projectiles_muzzle.dmi b/icons/obj/weapons/guns/projectiles_muzzle.dmi index 9bf78ba4a53..095102f6d89 100644 Binary files a/icons/obj/weapons/guns/projectiles_muzzle.dmi and b/icons/obj/weapons/guns/projectiles_muzzle.dmi differ diff --git a/icons/obj/weapons/guns/projectiles_tracer.dmi b/icons/obj/weapons/guns/projectiles_tracer.dmi index ba3bd1f9377..d7246394e68 100644 Binary files a/icons/obj/weapons/guns/projectiles_tracer.dmi and b/icons/obj/weapons/guns/projectiles_tracer.dmi differ