mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-11 18:22:14 +00:00
Emitter: The Emitting (#92327)
## About The Pull Request Adds Diode Disks, installable disks that when fitted into an emitter can change its function. * Healing * Stamina damage, and heals the SM slightly at the cost of internal energy * Traitor engi only explosive that damages and supercharges the SM if used that way. Firerate is halved. * Incendiary that slightly damages the SM but has lots of energy * Sanity damaging one that improves SM psi coeff * Magnetic item attracting one that improves SM mol absorption. ## Why It's Good For The Game Fun and unique ways for Engi to use excess power or improve their SM setups. Could also lead to neat engi inventions such as, say, a circuit device that aims and fires a healing emitter at anyone nearby who is damaged. Should also incentivize the researching of useful techs, hence why important medium tier techs are what lock the different disks. ## Changelog 🆑 add: New Diode Disks which allow you to configurate emitters with special functions. add: New Engi & CE exclusive traitor item, a diode disk that causes an emitter to create low radius explosions when it hits things. Note that this will reduce the fire-rate of your emitter. /🆑 --------- Co-authored-by: ThrowawayUseless <notarealemail@emailservice.fake> Co-authored-by: necromanceranne <40847847+necromanceranne@users.noreply.github.com>
This commit is contained in:
@@ -37,6 +37,26 @@
|
|||||||
/obj/effect/projectile/impact/wormhole
|
/obj/effect/projectile/impact/wormhole
|
||||||
icon_state = "wormhole_g"
|
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
|
/obj/effect/projectile/impact/laser/emitter
|
||||||
name = "emitter impact"
|
name = "emitter impact"
|
||||||
icon_state = "impact_emitter"
|
icon_state = "impact_emitter"
|
||||||
|
|||||||
@@ -29,6 +29,26 @@
|
|||||||
/obj/effect/projectile/muzzle/wormhole
|
/obj/effect/projectile/muzzle/wormhole
|
||||||
icon_state = "wormhole_g"
|
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
|
/obj/effect/projectile/muzzle/laser/emitter
|
||||||
name = "emitter flash"
|
name = "emitter flash"
|
||||||
icon_state = "muzzle_emitter"
|
icon_state = "muzzle_emitter"
|
||||||
|
|||||||
@@ -58,6 +58,38 @@
|
|||||||
name = "emitter beam"
|
name = "emitter beam"
|
||||||
icon_state = "emitter"
|
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
|
/obj/effect/projectile/tracer/sniper
|
||||||
icon_state = "sniper"
|
icon_state = "sniper"
|
||||||
|
|
||||||
|
|||||||
@@ -27,6 +27,10 @@
|
|||||||
var/maximum_fire_delay = 10 SECONDS
|
var/maximum_fire_delay = 10 SECONDS
|
||||||
///Min delay before firing
|
///Min delay before firing
|
||||||
var/minimum_fire_delay = 2 SECONDS
|
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
|
///When was the last shot
|
||||||
var/last_shot = 0
|
var/last_shot = 0
|
||||||
///Number of shots made (gets reset every few shots)
|
///Number of shots made (gets reset every few shots)
|
||||||
@@ -57,6 +61,8 @@
|
|||||||
var/charge = 0
|
var/charge = 0
|
||||||
///stores the direction and orientation of the last projectile
|
///stores the direction and orientation of the last projectile
|
||||||
var/last_projectile_params
|
var/last_projectile_params
|
||||||
|
//the disk in the gun
|
||||||
|
var/obj/item/emitter_disk/diskie
|
||||||
|
|
||||||
/obj/machinery/power/emitter/Initialize(mapload)
|
/obj/machinery/power/emitter/Initialize(mapload)
|
||||||
. = ..()
|
. = ..()
|
||||||
@@ -125,7 +131,7 @@
|
|||||||
else if(!powered)
|
else if(!powered)
|
||||||
. += span_notice("Its status display is glowing faintly.")
|
. += span_notice("Its status display is glowing faintly.")
|
||||||
else
|
else
|
||||||
. += span_notice("Its status display reads: Emitting one beam between <b>[DisplayTimeText(minimum_fire_delay)]</b> and <b>[DisplayTimeText(maximum_fire_delay)]</b>.")
|
. += span_notice("Its status display reads: Emitting one beam between <b>[DisplayTimeText(minimum_fire_delay * fire_rate_mod)]</b> and <b>[DisplayTimeText(maximum_fire_delay * fire_rate_mod)]</b>.")
|
||||||
. += span_notice("Power consumption at <b>[display_power(active_power_usage, convert = FALSE)]</b>.")
|
. += span_notice("Power consumption at <b>[display_power(active_power_usage, convert = FALSE)]</b>.")
|
||||||
|
|
||||||
/obj/machinery/power/emitter/should_have_node()
|
/obj/machinery/power/emitter/should_have_node()
|
||||||
@@ -246,11 +252,11 @@
|
|||||||
projectile.fire(dir2angle(dir))
|
projectile.fire(dir2angle(dir))
|
||||||
if(!manual)
|
if(!manual)
|
||||||
last_shot = world.time
|
last_shot = world.time
|
||||||
if(shot_number < 3)
|
if(shot_number < 3 || no_shot_counter)
|
||||||
fire_delay = 20
|
fire_delay = 20 * fire_rate_mod
|
||||||
shot_number ++
|
shot_number ++
|
||||||
else
|
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
|
shot_number = 0
|
||||||
return projectile
|
return projectile
|
||||||
|
|
||||||
@@ -311,6 +317,8 @@
|
|||||||
/obj/machinery/power/emitter/crowbar_act(mob/living/user, obj/item/item)
|
/obj/machinery/power/emitter/crowbar_act(mob/living/user, obj/item/item)
|
||||||
if(panel_open && gun)
|
if(panel_open && gun)
|
||||||
return remove_gun(user)
|
return remove_gun(user)
|
||||||
|
if(panel_open && diskie)
|
||||||
|
return remove_disk(user)
|
||||||
default_deconstruction_crowbar(item)
|
default_deconstruction_crowbar(item)
|
||||||
return TRUE
|
return TRUE
|
||||||
|
|
||||||
@@ -343,8 +351,30 @@
|
|||||||
wires.interact(user)
|
wires.interact(user)
|
||||||
return
|
return
|
||||||
if(panel_open && !gun && istype(item,/obj/item/gun/energy))
|
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))
|
if(integrate(item,user))
|
||||||
return
|
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 ..()
|
return ..()
|
||||||
|
|
||||||
|
|
||||||
@@ -371,6 +401,19 @@
|
|||||||
set_projectile()
|
set_projectile()
|
||||||
return TRUE
|
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()
|
/obj/machinery/power/emitter/proc/set_projectile()
|
||||||
if(LAZYLEN(gun_properties))
|
if(LAZYLEN(gun_properties))
|
||||||
if(mode || !gun_properties["lethal_projectile"])
|
if(mode || !gun_properties["lethal_projectile"])
|
||||||
@@ -382,6 +425,8 @@
|
|||||||
return
|
return
|
||||||
projectile_type = initial(projectile_type)
|
projectile_type = initial(projectile_type)
|
||||||
projectile_sound = initial(projectile_sound)
|
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)
|
/obj/machinery/power/emitter/emag_act(mob/user, obj/item/card/emag/emag_card)
|
||||||
if(obj_flags & EMAGGED)
|
if(obj_flags & EMAGGED)
|
||||||
@@ -567,3 +612,58 @@
|
|||||||
req_access = list("science")
|
req_access = list("science")
|
||||||
welded = TRUE
|
welded = TRUE
|
||||||
use_power = NO_POWER_USE
|
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
|
||||||
|
|||||||
@@ -366,6 +366,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
|
|||||||
update_appearance()
|
update_appearance()
|
||||||
delamination_strategy.lights(src)
|
delamination_strategy.lights(src)
|
||||||
delamination_strategy.filters(src)
|
delamination_strategy.filters(src)
|
||||||
|
absorption_ratio = clamp(absorption_ratio - 0.05, 0.15, 1)
|
||||||
return TRUE
|
return TRUE
|
||||||
|
|
||||||
// SupermatterMonitor UI for ghosts only. Inherited attack_ghost will call this.
|
// SupermatterMonitor UI for ghosts only. Inherited attack_ghost will call this.
|
||||||
|
|||||||
@@ -24,7 +24,6 @@
|
|||||||
if(projectile.armor_flag != BULLET || kiss_power)
|
if(projectile.armor_flag != BULLET || kiss_power)
|
||||||
if(kiss_power)
|
if(kiss_power)
|
||||||
psy_coeff = 1
|
psy_coeff = 1
|
||||||
external_power_immediate += projectile.damage * bullet_energy + kiss_power
|
|
||||||
log_activation(who = projectile.firer, how = projectile.fired_from)
|
log_activation(who = projectile.firer, how = projectile.fired_from)
|
||||||
else
|
else
|
||||||
external_damage_immediate += projectile.damage * bullet_energy * 0.1
|
external_damage_immediate += projectile.damage * bullet_energy * 0.1
|
||||||
@@ -34,6 +33,17 @@
|
|||||||
if(damage_to_be > danger_point)
|
if(damage_to_be > danger_point)
|
||||||
visible_message(span_notice("[src] compresses under stress, resisting further impacts!"))
|
visible_message(span_notice("[src] compresses under stress, resisting further impacts!"))
|
||||||
playsound(src, 'sound/effects/supermatter.ogg', 50, TRUE)
|
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)
|
qdel(projectile)
|
||||||
return COMPONENT_BULLET_BLOCKED
|
return COMPONENT_BULLET_BLOCKED
|
||||||
|
|||||||
@@ -243,6 +243,124 @@
|
|||||||
impact_light_intensity = 7
|
impact_light_intensity = 7
|
||||||
impact_light_range = 2.5
|
impact_light_range = 2.5
|
||||||
impact_light_color_override = COLOR_LIME
|
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
|
/obj/projectile/beam/lasertag
|
||||||
name = "laser tag beam"
|
name = "laser tag beam"
|
||||||
|
|||||||
@@ -212,3 +212,68 @@
|
|||||||
RND_CATEGORY_STOCK_PARTS + RND_SUBCATEGORY_STOCK_PARTS_TURBINE
|
RND_CATEGORY_STOCK_PARTS + RND_SUBCATEGORY_STOCK_PARTS_TURBINE
|
||||||
)
|
)
|
||||||
departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING
|
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
|
||||||
|
|||||||
@@ -63,6 +63,7 @@
|
|||||||
"pacman",
|
"pacman",
|
||||||
"mech_generator",
|
"mech_generator",
|
||||||
"plasmacutter",
|
"plasmacutter",
|
||||||
|
"diode_disk_incendiary",
|
||||||
)
|
)
|
||||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS)
|
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS)
|
||||||
discount_experiments = list(/datum/experiment/ordnance/gaseous/plasma = TECHWEB_TIER_2_POINTS)
|
discount_experiments = list(/datum/experiment/ordnance/gaseous/plasma = TECHWEB_TIER_2_POINTS)
|
||||||
|
|||||||
@@ -179,6 +179,7 @@
|
|||||||
"welding_goggles",
|
"welding_goggles",
|
||||||
"tray_goggles",
|
"tray_goggles",
|
||||||
"geigercounter",
|
"geigercounter",
|
||||||
|
"diode_disk_stamina"
|
||||||
)
|
)
|
||||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS)
|
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS)
|
||||||
announce_channels = list(RADIO_CHANNEL_ENGINEERING)
|
announce_channels = list(RADIO_CHANNEL_ENGINEERING)
|
||||||
@@ -227,6 +228,7 @@
|
|||||||
"modular_shield_charger",
|
"modular_shield_charger",
|
||||||
"modular_shield_well",
|
"modular_shield_well",
|
||||||
"modular_shield_console",
|
"modular_shield_console",
|
||||||
|
"diode_disk_magnetic",
|
||||||
)
|
)
|
||||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS)
|
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS)
|
||||||
|
|
||||||
|
|||||||
@@ -81,6 +81,8 @@
|
|||||||
"defibmount",
|
"defibmount",
|
||||||
"medicalbed_emergency",
|
"medicalbed_emergency",
|
||||||
"piercesyringe",
|
"piercesyringe",
|
||||||
|
"diode_disk_healing",
|
||||||
|
"diode_disk_sanity",
|
||||||
)
|
)
|
||||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS)
|
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS)
|
||||||
required_experiments = list(/datum/experiment/scanning/reagent/haloperidol)
|
required_experiments = list(/datum/experiment/scanning/reagent/haloperidol)
|
||||||
|
|||||||
@@ -397,3 +397,10 @@
|
|||||||
progression_minimum = 30 MINUTES
|
progression_minimum = 30 MINUTES
|
||||||
purchasable_from = parent_type::purchasable_from & ~UPLINK_SPY
|
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)
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 26 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 28 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 5.5 KiB |
Reference in New Issue
Block a user