From 6dd5c2dbfdea310c2accf32515931a804d1f0c82 Mon Sep 17 00:00:00 2001 From: LordFowl Date: Sat, 20 Jan 2018 16:39:14 -0500 Subject: [PATCH] Unapologetic Scientist Buffs (#3957) Implements the long-promised modular RnD energy weapon system I embarked upon in the ancient days of August 2016. Currently just a basic framework based heavily on Printer's recent work. Relevant thread: https://forums.aurorastation.org/viewtopic.php?f=18&t=9755 --- aurorastation.dme | 4 + code/__defines/modular_guns.dm | 11 + code/modules/projectiles/gun.dm | 29 ++ code/modules/projectiles/guns/energy.dm | 4 +- .../projectiles/guns/energy/modular.dm | 301 +++++++++++++ .../projectiles/guns/energy/nuclear.dm | 50 ++- .../projectiles/guns/energy/special.dm | 33 +- .../modules/projectiles/modular/laser_base.dm | 208 +++++++++ .../projectiles/modular/laser_components.dm | 397 ++++++++++++++++++ code/modules/projectiles/projectile/beams.dm | 2 +- .../modules/projectiles/projectile/special.dm | 4 +- .../research/designs/weapon_designs.dm | 374 +++++++++++++---- html/changelogs/sciencebuffs.yml | 38 ++ icons/obj/modular_laser.dmi | Bin 0 -> 7557 bytes 14 files changed, 1327 insertions(+), 128 deletions(-) create mode 100644 code/__defines/modular_guns.dm create mode 100644 code/modules/projectiles/guns/energy/modular.dm create mode 100644 code/modules/projectiles/modular/laser_base.dm create mode 100644 code/modules/projectiles/modular/laser_components.dm create mode 100644 html/changelogs/sciencebuffs.yml create mode 100644 icons/obj/modular_laser.dmi diff --git a/aurorastation.dme b/aurorastation.dme index c53c7e1032b..eb29f1cc2b7 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -37,6 +37,7 @@ #include "code\__defines\mining.dm" #include "code\__defines\misc.dm" #include "code\__defines\mobs.dm" +#include "code\__defines\modular_guns.dm" #include "code\__defines\qdel.dm" #include "code\__defines\radio.dm" #include "code\__defines\regex.dm" @@ -1939,6 +1940,7 @@ #include "code\modules\projectiles\guns\energy\lawgiver.dm" #include "code\modules\projectiles\guns\energy\magic.dm" #include "code\modules\projectiles\guns\energy\mining.dm" +#include "code\modules\projectiles\guns\energy\modular.dm" #include "code\modules\projectiles\guns\energy\nuclear.dm" #include "code\modules\projectiles\guns\energy\pulse.dm" #include "code\modules\projectiles\guns\energy\rifle.dm" @@ -1958,6 +1960,8 @@ #include "code\modules\projectiles\guns\projectile\rifle.dm" #include "code\modules\projectiles\guns\projectile\shotgun.dm" #include "code\modules\projectiles\guns\projectile\sniper.dm" +#include "code\modules\projectiles\modular\laser_base.dm" +#include "code\modules\projectiles\modular\laser_components.dm" #include "code\modules\projectiles\projectile\animate.dm" #include "code\modules\projectiles\projectile\beams.dm" #include "code\modules\projectiles\projectile\bullets.dm" diff --git a/code/__defines/modular_guns.dm b/code/__defines/modular_guns.dm new file mode 100644 index 00000000000..bcd5b490dff --- /dev/null +++ b/code/__defines/modular_guns.dm @@ -0,0 +1,11 @@ +#define CHASSIS_SMALL 2 +#define CHASSIS_MEDIUM 3 +#define CHASSIS_LARGE 4 + +#define MOD_SILENCE 1 +#define MOD_NUCLEAR_CHARGE 2 + +#define islasercapacitor(A) istype(A, /obj/item/laser_components/capacitor) +#define ismodifier(A) istype(A, /obj/item/laser_components/modifier) +#define ismodulator(A) istype(A, /obj/item/laser_components/modulator) +#define isfocusinglens(A) istype(A, /obj/item/laser_components/focusing_lens) \ No newline at end of file diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index d33e36ee4da..ae99218a90a 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -63,6 +63,7 @@ var/scoped_accuracy = null var/list/burst_accuracy = list(0) //allows for different accuracies for each shot in a burst. Applied on top of accuracy var/list/dispersion = list(0) + var/reliability = 100 var/next_fire_time = 0 @@ -160,6 +161,11 @@ if(!special_check(user)) return + var/failure_chance = 100 - reliability + if(failure_chance && prob(failure_chance)) + handle_reliability_fail(user) + return + if(world.time < next_fire_time) if (world.time % 3) //to prevent spam user << "[src] is not ready to fire again!" @@ -597,3 +603,26 @@ mob_can_equip(M as mob, slot) return 0 + +/obj/item/weapon/gun/proc/handle_reliability_fail(var/mob/user) + var/severity = 1 + if(prob(100-reliability)) + severity = 2 + if(prob(100-reliability)) + severity = 3 + switch(severity) + if(1) + small_fail(user) + if(2) + medium_fail(user) + else + critical_fail(user) + +/obj/item/weapon/gun/proc/small_fail(var/mob/user) + return + +/obj/item/weapon/gun/proc/medium_fail(var/mob/user) + return + +/obj/item/weapon/gun/proc/critical_fail(var/mob/user) + return \ No newline at end of file diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 0d5ab24f2eb..0a13bdb333f 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -55,7 +55,7 @@ . = 1 if (!power_supply || power_supply.charge >= power_supply.maxcharge || !self_recharge) return 0 // check if we actually need to recharge - + if (use_external_power) var/obj/item/weapon/cell/external = get_external_power_supply() if(!external || !external.use(charge_cost)) //Take power from the borg... @@ -94,7 +94,7 @@ return /obj/item/weapon/gun/energy/update_icon() - if(charge_meter && power_supply) + if(charge_meter && power_supply && power_supply.maxcharge) var/ratio = power_supply.charge / power_supply.maxcharge //make sure that rounding down will not give us the empty state even if we have charge for a shot left. diff --git a/code/modules/projectiles/guns/energy/modular.dm b/code/modules/projectiles/guns/energy/modular.dm new file mode 100644 index 00000000000..473a99c40ed --- /dev/null +++ b/code/modules/projectiles/guns/energy/modular.dm @@ -0,0 +1,301 @@ +/obj/item/weapon/gun/energy/laser/prototype + name = "laser prototype" + desc = "A custom prototype laser weapon." + icon_state = "energykill" + item_state = "energykill" + fire_sound = 'sound/weapons/Laser.ogg' + slot_flags = SLOT_BELT|SLOT_BACK + w_class = 3 + force = 10 + origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 2) + matter = list(DEFAULT_WALL_MATERIAL = 2000) + can_turret = 0 + zoomdevicename = null + max_shots = 0 + burst_delay = 0 + var/origin_chassis + var/gun_type + var/list/gun_mods = list() + var/obj/item/laser_components/capacitor/capacitor + var/obj/item/laser_components/focusing_lens/focusing_lens + var/obj/item/laser_components/modulator/modulator + var/chargetime + var/is_charging + var/criticality = 1 //multiplier for the negative effects of capacitor failures. Not just limited to critical failures. + var/named = 0 + var/described = 0 + +/obj/item/weapon/gun/energy/laser/prototype/examine(mob/user) + ..(user) + if(gun_mods.len) + for(var/obj/item/laser_components/modifier/modifier in gun_mods) + user << "You can see \the [modifier] attached." + if(capacitor) + user << "You can see \the [capacitor] attached." + if(focusing_lens) + user << "You can see \the [focusing_lens] attached." + +/obj/item/weapon/gun/energy/laser/prototype/attackby(var/obj/item/weapon/D, var/mob/user) + if(!isscrewdriver(D)) + return ..() + user << "You disassemble \the [src]." + disassemble(user) + +/obj/item/weapon/gun/energy/laser/prototype/proc/reset_vars() + burst = initial(burst) + reliability = initial(reliability) + burst_delay = initial(burst_delay) + max_shots = initial(max_shots) + chargetime = initial(chargetime) + accuracy = initial(accuracy) + criticality = initial(criticality) + +/obj/item/weapon/gun/energy/laser/prototype/proc/updatetype(var/mob/user) + reset_vars() + if(!focusing_lens || !capacitor || !modulator) + disassemble(user) + return + + switch(origin_chassis) + if(CHASSIS_SMALL) + gun_type = CHASSIS_SMALL + slot_flags = SLOT_BELT | SLOT_HOLSTER + item_state = "retro" + if(CHASSIS_MEDIUM) + gun_type = CHASSIS_MEDIUM + slot_flags = SLOT_BELT | SLOT_BACK + item_state = "energystun" + if(CHASSIS_LARGE) + gun_type = CHASSIS_LARGE + slot_flags = SLOT_BACK + item_state = "lasercannon" + + if(capacitor.reliability - capacitor.condition <= 0) + if(prob(66)) + capacitor.small_fail(user) + else + capacitor.medium_fail(user) + qdel(capacitor) + capacitor = null + + if(focusing_lens.reliability - focusing_lens.condition <= 0) + qdel(focusing_lens) + focusing_lens = null + + if(!focusing_lens || !capacitor || !modulator) + disassemble(user) + return + + reliability = (capacitor.reliability - capacitor.condition) + (focusing_lens.reliability - focusing_lens.condition) + + if(modulator.projectile) + projectile_type = modulator.projectile + + fire_delay = capacitor.fire_delay + max_shots = capacitor.shots + power_supply.maxcharge = max_shots*charge_cost + dispersion = focusing_lens.dispersion + accuracy = focusing_lens.accuracy + burst += focusing_lens.burst + + if(gun_mods.len) + handle_mod() + + fire_delay_wielded = min(0,(fire_delay - fire_delay*3)) + accuracy_wielded = accuracy + accuracy/4 + scoped_accuracy = accuracy_wielded + accuracy/4 + max_shots = max_shots * burst + w_class = gun_type + reliability = max(reliability, 1) + +/obj/item/weapon/gun/energy/laser/prototype/proc/handle_mod() + for(var/obj/item/laser_components/modifier/modifier in gun_mods) + switch(modifier.mod_type) + if(MOD_SILENCE) + silenced = 1 + if(MOD_NUCLEAR_CHARGE) + self_recharge = 1 + criticality *= 2 + fire_delay *= modifier.fire_delay + reliability += modifier.reliability + burst += modifier.burst + burst_delay += modifier.burst_delay + max_shots *= modifier.shots + force += modifier.gun_force + chargetime += modifier.chargetime*10 + accuracy += modifier.accuracy + criticality *= modifier.criticality + if(modifier.scope_name) + zoomdevicename = modifier.scope_name + +/obj/item/weapon/gun/energy/laser/prototype/consume_next_projectile() + if(!power_supply) + return null + if(!ispath(projectile_type)) + return null + if(!power_supply.checked_use(charge_cost)) + return null + if (self_recharge) + addtimer(CALLBACK(src, .proc/try_recharge), recharge_time * 2 SECONDS, TIMER_UNIQUE) + var/obj/item/projectile/beam/A = new projectile_type(src) + A.damage = capacitor.damage + var/damage_coeff = 1 + for(var/obj/item/laser_components/modifier/modifier in gun_mods) + damage_coeff *= modifier.damage + if(burst > 1) + A.damage = A.damage/(burst - 1) + damage_coeff *= modulator.damage + A.damage *= damage_coeff + A.damage = min(A.damage, 60) //let's not get too ridiculous here + for(var/obj/item/laser_components/modifier/modifier in gun_mods) + if(prob((gun_mods.len * 10 * damage_coeff)/(max(1,(burst - 1))))) + capacitor.degrade(modifier.malus) + if(prob((gun_mods.len * 10 * damage_coeff)/(max(1,(burst - 1))))) + focusing_lens.degrade(modifier.malus) + if(prob((33 + capacitor.damage)/(max(1,(burst - 1))))) + modifier.degrade(1) + if((prob(A.damage)/burst)) + if(prob(A.damage/2)) + medium_fail(user) + else + small_fail(user) + + updatetype(user) + return A + +/obj/item/weapon/gun/energy/laser/prototype/proc/disassemble(var/mob/user) + var/atom/A + if (user && user.loc) + A = user.loc + else + A = get_turf(src) + if(gun_mods.len) + for(var/obj/item/laser_components/modifier/modifier in gun_mods) + modifier.forceMove(A) + gun_mods.Remove(modifier) + if(capacitor) + capacitor.forceMove(A) + capacitor = null + if(focusing_lens) + focusing_lens.forceMove(A) + focusing_lens = null + if(modulator) + modulator.forceMove(A) + modulator = null + switch(origin_chassis) + if(CHASSIS_SMALL) + new /obj/item/device/laser_assembly(A) + if(CHASSIS_MEDIUM) + new /obj/item/device/laser_assembly/medium(A) + if(CHASSIS_LARGE) + new /obj/item/device/laser_assembly/large(A) + qdel(src) + +/obj/item/weapon/gun/energy/laser/prototype/small_fail(var/mob/user) + if(capacitor) + user << "\The [src]'s [capacitor] short-circuits!" + capacitor.small_fail(user, src) + return + +/obj/item/weapon/gun/energy/laser/prototype/medium_fail(var/mob/user) + if(capacitor) + user << "\The [src]'s [capacitor] overloads!" + capacitor.medium_fail(user, src) + return + +/obj/item/weapon/gun/energy/laser/prototype/critical_fail(var/mob/user) + if(capacitor) + user << "\The [src]'s [capacitor] goes critical!" + capacitor.critical_fail(user, src) + return + +/obj/item/weapon/gun/energy/laser/prototype/can_wield() + if(origin_chassis >= CHASSIS_MEDIUM) + return 1 + else + return 0 + +/obj/item/weapon/gun/energy/laser/prototype/ui_action_click() + if(src in usr) + toggle_wield(usr) + +/obj/item/weapon/gun/energy/laser/prototype/verb/wield_shotgun() + set name = "Wield prototype" + set category = "Object" + set src in usr + + toggle_wield(usr) + +/obj/item/weapon/gun/energy/laser/prototype/verb/scope() + set category = "Object" + set name = "Use Scope" + set popup_menu = 1 + + if(zoomdevicename) + if(wielded) + toggle_scope(2.0, usr) + else + usr << "You can't look through the scope without stabilizing the rifle!" + else + usr << "This device does not have a scope installed!" + +/obj/item/weapon/gun/energy/laser/prototype/special_check(var/mob/user) + ..() + if(is_charging && chargetime) + user << "\The [src] is already charging!" + return 0 + if(!wielded && (origin_chassis == CHASSIS_LARGE)) + user << "You require both hands to fire this weapon!" + return 0 + if(chargetime) + user.visible_message( + "\The [user] begins charging the [src]!", + "You begin charging the [src]!", + "You hear a low pulsing roar!" + ) + is_charging = 1 + + if(!do_after(user, chargetime)) + is_charging = 0 + return 0 + + is_charging = 0 + + if(!istype(user.get_active_hand(), src)) + return 0 + + return 1 + +/obj/item/weapon/gun/energy/laser/prototype/verb/rename_gun() + set name = "Name Prototype" + set category = "Object" + set desc = "Name your invention so that its glory might be eternal" + + var/mob/M = usr + if(!M.mind) + return 0 + + var/input = sanitizeSafe(input("What do you want to name the gun?", ,""), MAX_NAME_LEN) + + if(src && input && !M.stat && in_range(M,src)) + name = input + M << "You name the gun [input]. Say hello to your new friend." + named = 1 + return 1 + +/obj/item/weapon/gun/energy/laser/prototype/verb/describe_gun() + set name = "Describe Prototype" + set category = "Object" + set desc = "Describe your invention so that its glory might be eternal" + + var/mob/M = usr + if(!M.mind) + return 0 + + var/input = sanitizeSafe(input("What do you want to name the gun?", ,"")) + + if(src && input && !M.stat && in_range(M,src)) + desc = input + M << "You describe the gun as [input]. Say hello to your new friend." + described = 1 + return 1 diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm index 9aa45b34bf9..bef654a4492 100644 --- a/code/modules/projectiles/guns/energy/nuclear.dm +++ b/code/modules/projectiles/guns/energy/nuclear.dm @@ -38,7 +38,7 @@ force = 8 //looks heavier than a pistol self_recharge = 1 modifystate = null - var/reliability = 95 + reliability = 95 turret_sprite_set = "nuclear" charge_failure_message = "'s charging socket was removed to make room for a minaturized reactor." @@ -52,27 +52,31 @@ /obj/item/weapon/gun/energy/gun/nuclear/get_cell() return DEVICE_NO_CELL -/obj/item/weapon/gun/energy/gun/nuclear/proc/failcheck() - lightfail = 0 - if (prob(src.reliability)) return 1 //No failure - if (prob(src.reliability)) - for (var/mob/living/M in range(0,src)) //Only a minor failure, enjoy your radiation if you're in the same tile or carrying it - if (src in M.contents) - M << "Your gun feels pleasantly warm for a moment." - else - M << "You feel a warm sensation." - M.apply_effect(rand(3,120), IRRADIATE) - lightfail = 1 +/obj/item/weapon/gun/energy/gun/nuclear/small_fail(var/mob/user) + for (var/mob/living/M in range(0,src)) //Only a minor failure, enjoy your radiation if you're in the same tile or carrying it + if (M == user) + M << "Your gun feels pleasantly warm for a moment." + else + M << "You feel a warm sensation." + M.apply_effect(rand(3,120), IRRADIATE) + return + +/obj/item/weapon/gun/energy/gun/nuclear/medium_fail(var/mob/user) + if(prob(50)) + critical_fail(user) else - for (var/mob/living/M in range(rand(1,4),src)) //Big failure, TIME FOR RADIATION BITCHES - if (src in M.contents) - M << "Your gun's reactor overloads!" - M << "You feel a wave of heat wash over you." - M.apply_effect(300, IRRADIATE) - crit_fail = 1 //break the gun so it stops recharging - self_recharge = FALSE - update_icon() - return 0 + small_fail(user) + return + +/obj/item/weapon/gun/energy/gun/nuclear/critical_fail(var/mob/user) + user << "Your gun's reactor overloads!" + for (var/mob/living/M in range(rand(1,4),src)) + M << "You feel a wave of heat wash over you." + M.apply_effect(300, IRRADIATE) + crit_fail = 1 //break the gun so it stops recharging + self_recharge = FALSE + update_icon() + return /obj/item/weapon/gun/energy/gun/nuclear/proc/update_charge() if (crit_fail) @@ -96,9 +100,9 @@ /obj/item/weapon/gun/energy/gun/nuclear/proc/update_mode() var/datum/firemode/current_mode = firemodes[sel_mode] switch(current_mode.name) - if("stun") + if("stun") add_overlay("nucgun-stun") - if("lethal") + if("lethal") add_overlay("nucgun-kill") /* /obj/item/weapon/gun/energy/gun/nuclear/emp_act(severity) diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index eacbe440843..0ad65be8261 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -111,8 +111,8 @@ w_class = 3.0 origin_tech = list(TECH_COMBAT = 5, TECH_PHORON = 4) projectile_type = /obj/item/projectile/energy/phoron - can_turret = 1 - turret_is_lethal = 0 + can_turret = 1 + turret_is_lethal = 0 turret_sprite_set = "net" /obj/item/weapon/gun/energy/beegun @@ -158,22 +158,8 @@ /obj/item/weapon/gun/energy/mousegun/handle_post_fire(mob/user, atom/target, var/pointblank=0, var/reflex=0, var/playemote = 1) var/T = get_turf(user) spark(T, 3, alldirs) - failcheck() ..() -/obj/item/weapon/gun/energy/mousegun/proc/failcheck() - lightfail = 0 - if (prob(5)) - for (var/mob/living/M in range(rand(1,4),src)) //Big failure, TIME FOR RADIATION BITCHES - if (src in M.contents) - M << "[src]'s reactor overloads!" - M << "You feel a wave of heat wash over you." - M.apply_effect(300, IRRADIATE) - //crit_fail = 1 //break the gun so it stops recharging - STOP_PROCESSING(SSprocessing, src) - update_icon() - return 0 - /obj/item/weapon/gun/energy/net name = "net gun" desc = "A gun designed to deploy energy nets to capture animals or unruly crew members." @@ -275,7 +261,8 @@ "You hear the spin of a rotary gun!" ) is_charging = 1 - sleep(30) + if(!do_after(user, 30)) + return 0 is_charging = 0 if(!istype(user.get_active_hand(), src)) return @@ -370,7 +357,8 @@ "You hear a low pulsing roar!" ) is_charging = 1 - sleep(20) + if(!do_after(user, 20)) + return 0 is_charging = 0 if(!istype(user.get_active_hand(), src)) return @@ -423,7 +411,8 @@ recharge_time = 1 charge_meter = 1 charge_cost = 50 - can_turret = 1 + dispersion = list(0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9) + can_turret = 1 turret_sprite_set = "thermaldrill" firemodes = list( @@ -462,7 +451,8 @@ "You hear a low pulsing roar!" ) is_charging = 1 - sleep(40) + if(!do_after(user, 40)) + return 0 is_charging = 0 if(!istype(user.get_active_hand(), src)) return @@ -505,7 +495,8 @@ "You hear a low pulsing roar!" ) is_charging = 1 - sleep(20) + if(!do_after(user, 20)) + return 0 is_charging = 0 msg_admin_attack("[key_name_admin(user)] shot with \a [src.type] [key_name_admin(src)]'s target (JMP)",ckey=key_name(user),ckey_target=key_name(src)) return 1 diff --git a/code/modules/projectiles/modular/laser_base.dm b/code/modules/projectiles/modular/laser_base.dm new file mode 100644 index 00000000000..81d9043257d --- /dev/null +++ b/code/modules/projectiles/modular/laser_base.dm @@ -0,0 +1,208 @@ +/obj/item/laser_components + icon = 'icons/obj/modular_laser.dmi' + icon_state = "bfg" + var/reliability = 0 + var/damage = 1 + var/fire_delay = 0 + var/condition = 0 //inverse health of the component. subtracted from reliability. + var/shots = 0 + var/burst = 0 + var/accuracy = 0 + var/obj/item/weapon/repair_item + var/gun_overlay + +/obj/item/laser_components/proc/degrade(var/increment = 1) + if(increment) + condition += increment + if(condition > reliability) + condition = reliability + +/obj/item/laser_components/attackby(var/obj/item/weapon/D as obj, var/mob/user as mob) + if(!istype(D,repair_item)) + return ..() + user << "You begin repairing \the [src]." + if(do_after(user,20) && repair_module(D)) + user << "You repair \the [src]." + else + user << "You fail to repair \the [src]." + +/obj/item/laser_components/proc/repair_module(var/obj/item/weapon/D) + return 1 + +/obj/item/laser_components/modifier + name = "modifier" + desc = "A basic laser weapon modifier." + reliability = -5 + var/mod_type + var/base_malus = 2 //when modifiers get damaged they do not break, but make other components break faster + var/malus = 2 //subtracted from weapon's overall reliability everytime it's fired + var/gun_force = 0 //melee damage of the gun + var/chargetime = 0 + var/burst_delay = 0 + var/scope_name + var/criticality + repair_item = /obj/item/weapon/weldingtool + +/obj/item/laser_components/modifier/examine(mob/user) + . = ..(user, 1) + if(.) + if(malus > base_malus) + user << "\The [src] appears damaged." + +/obj/item/laser_components/modifier/degrade(var/increment = 1) + if(increment) + malus += increment + if(malus > abs(base_malus*2)) + malus = abs(base_malus*2) + +/obj/item/laser_components/modifier/repair_module(var/obj/item/weapon/weldingtool/W) + if(istype(W)) + return + if(W.remove_fuel(5)) + malus = max(malus - 5, base_malus) + return 1 + return 0 + +/obj/item/laser_components/capacitor + name = "capacitor" + desc = "A basic laser weapon capacitor." + icon_state = "capacitor" + shots = 5 + damage = 10 + reliability = 50 + repair_item = /obj/item/stack/cable_coil + +/obj/item/laser_components/capacitor/repair_module(var/obj/item/stack/cable_coil/C) + if(istype(C)) + return + if(C.use(5)) + return 1 + return 0 + +/obj/item/laser_components/capacitor/examine(mob/user) + . = ..(user, 1) + if(.) + if(condition > 0) + user << "\The [src] appears damaged." + +/obj/item/laser_components/capacitor/proc/small_fail(var/mob/user, var/obj/item/weapon/gun/energy/laser/prototype/prototype) + return + +/obj/item/laser_components/capacitor/proc/medium_fail(var/mob/user, var/obj/item/weapon/gun/energy/laser/prototype/prototype) + return + +/obj/item/laser_components/capacitor/proc/critical_fail(var/mob/user, var/obj/item/weapon/gun/energy/laser/prototype/prototype) + qdel(src) + return + +/obj/item/laser_components/focusing_lens + name = "focusing lens" + desc = "A basic laser weapon focusing lens." + icon_state = "lens" + var/list/dispersion = list(0.6,1.0,1.0,1.0,1.2,0.6,1.0,1.0,1.0,1.2,0.6,1.0,1.0,1.0,1.2,0.6,1.0,1.0,1.0,1.2) + reliability = 25 + repair_item = /obj/item/stack/nanopaste + +/obj/item/laser_components/focusing_lens/repair_module(var/obj/item/stack/nanopaste/N) + if(istype(N)) + return + if(N.use(5)) + return 1 + return 0 + +/obj/item/laser_components/focusing_lens/examine(mob/user) + . = ..(user, 1) + if(.) + if(condition > 0) + user << "\The [src] appears damaged." + +/obj/item/laser_components/modulator + name = "laser modulator" + desc = "A modification that modulates the beam into a standard laser beam." + icon_state = "laser" + var/obj/item/projectile/beam/projectile = /obj/item/projectile/beam + +/obj/item/laser_components/modulator/degrade() + return + +/obj/item/device/laser_assembly + name = "laser assembly (small)" + desc = "A case for shoving things into. Hopefully they work." + w_class = 2 + icon = 'icons/obj/modular_laser.dmi' + icon_state = "small" + var/stage = 1 + var/size = CHASSIS_SMALL + var/modifier_cap = 1 + + var/list/gun_mods = list() + var/obj/item/laser_components/capacitor/capacitor + var/obj/item/laser_components/focusing_lens/focusing_lens + var/obj/item/laser_components/modulator/modulator + +/obj/item/device/laser_assembly/Initialize() + . = ..() + update_icon() + +/obj/item/device/laser_assembly/attackby(var/obj/item/weapon/D as obj, var/mob/user as mob) + var/obj/item/laser_components/A = D + if(!istype(A)) + return ..() + if(ismodifier(A) && gun_mods.len < modifier_cap) + gun_mods += A + user.drop_item() + A.forceMove(src) + else if(islasercapacitor(A) && stage == 1) + capacitor = A + user.drop_item() + A.forceMove(src) + stage = 2 + else if(isfocusinglens(A) && stage == 2) + focusing_lens = A + user.drop_item() + A.forceMove(src) + stage = 3 + else if(ismodulator(A) && stage == 3) + modulator = A + user.drop_item() + A.forceMove(src) + else + return ..() + user << "You insert \the [A] into the assembly." + update_icon() + check_completion() + +/obj/item/device/laser_assembly/update_icon() + ..() + underlays.Cut() + icon_state = "[initial(icon_state)]_[stage]" + if(gun_mods.len) + for(var/obj/item/laser_components/mod in gun_mods) + if(mod.gun_overlay) + underlays += mod.gun_overlay + + +/obj/item/device/laser_assembly/proc/check_completion() + if(capacitor && focusing_lens && modulator) + finish() + +/obj/item/device/laser_assembly/proc/finish() + var/obj/item/weapon/gun/energy/laser/prototype/A = new /obj/item/weapon/gun/energy/laser/prototype + A.origin_chassis = size + A.capacitor = capacitor + capacitor.forceMove(A) + A.focusing_lens = focusing_lens + focusing_lens.forceMove(A) + A.modulator = modulator + modulator.forceMove(A) + if(gun_mods.len) + for(var/obj/item/laser_components/modifier/mod in gun_mods) + A.gun_mods += mod + mod.forceMove(A) + A.forceMove(get_turf(src)) + A.icon = getFlatIcon(src) + A.updatetype() + gun_mods = null + focusing_lens = null + capacitor = null + qdel(src) diff --git a/code/modules/projectiles/modular/laser_components.dm b/code/modules/projectiles/modular/laser_components.dm new file mode 100644 index 00000000000..58c71cdf0b7 --- /dev/null +++ b/code/modules/projectiles/modular/laser_components.dm @@ -0,0 +1,397 @@ +//Assemblies + +/obj/item/device/laser_assembly/medium + name = "laser assembly (medium)" + icon_state = "medium" + w_class = 3 + size = CHASSIS_MEDIUM + modifier_cap = 2 + +/obj/item/device/laser_assembly/large + name = "laser assembly (large)" + icon_state = "large" + w_class = 4 + size = CHASSIS_LARGE + modifier_cap = 3 + +/obj/item/device/laser_assembly/admin + name = "laser assembly (obscene)" + icon_state = "large" + w_class = 4 + size = CHASSIS_LARGE + modifier_cap = 25 + +//Capacitors +/obj/item/laser_components/capacitor/potato + name = "starch capacitor" + desc = "A powercell composed of a primarily starch-based conductor." + icon_state = "starch_capacitor" + reliability = 5 + shots = 1 + damage = 5 + +/obj/item/laser_components/capacitor/reinforced + name = "reinforced capacitor" + desc = "A reinforced laser weapon capacitor." + icon_state = "reinforced_capacitor" + reliability = 75 + +/obj/item/laser_components/capacitor/nuclear + name = "uranium-enriched capacitor" + desc = "A capacitor built from uranium enriched materials." + icon_state = "uranium_capacitor" + damage = 20 + shots = 10 + reliability = 40 + +/obj/item/laser_components/capacitor/nuclear/small_fail(var/mob/user, var/obj/item/weapon/gun/energy/laser/prototype/prototype) + for (var/mob/living/M in range(0,src)) //Only a minor failure, enjoy your radiation if you're in the same tile or carrying it + if (M != user) + M << "You feel a warm sensation." + M.apply_effect(rand(1,10)*(prototype.criticality+1), IRRADIATE) + return + +/obj/item/laser_components/capacitor/nuclear/medium_fail(var/mob/user, var/obj/item/weapon/gun/energy/laser/prototype/prototype) + for (var/mob/living/M in range(round((prototype.criticality+1)),src)) //Only a minor failure, enjoy your radiation if you're in the same tile or carrying it + if (M != user) + M << "You feel a warm sensation." + M.apply_effect(rand(1,40)*(prototype.criticality+1), IRRADIATE) + return + +/obj/item/laser_components/capacitor/nuclear/critical_fail(var/mob/user, var/obj/item/weapon/gun/energy/laser/prototype/prototype) + for (var/mob/living/M in range(rand(2,6)*(prototype.criticality+1),src)) + M << "You feel a wave of heat wash over you." + M.apply_effect(300*(prototype.criticality+1), IRRADIATE) + ..() + +/obj/item/laser_components/capacitor/teranium + name = "teranium-enriched capacitor" + desc = "A capacitor built from teranium enriched materials." + icon_state = "teranium_capacitor" + damage = 25 + shots = 15 + reliability = 40 + +/obj/item/laser_components/capacitor/teranium/small_fail(var/mob/user, var/obj/item/weapon/gun/energy/laser/prototype/prototype) + tesla_zap(prototype, 3, 1000*(prototype.criticality+1)) + return + +/obj/item/laser_components/capacitor/teranium/medium_fail(var/mob/user, var/obj/item/weapon/gun/energy/laser/prototype/prototype) + tesla_zap(prototype, round((prototype.criticality+1)*2), 2000*(prototype.criticality+1)) + return + +/obj/item/laser_components/capacitor/teranium/critical_fail(var/mob/user, var/obj/item/weapon/gun/energy/laser/prototype/prototype) + for (var/i = 0 to round((prototype.criticality+1))) + tesla_zap(prototype, round((prototype.criticality+1)*2,1), 4000*(prototype.criticality+1)) + ..() + +/obj/item/laser_components/capacitor/phoron + name = "phoron-enriched capacitor" + desc = "A capacitor built from phoron enriched materials." + icon_state = "phoron_capacitor" + damage = 30 + shots = 25 + reliability = 30 + +/obj/item/laser_components/capacitor/phoron/small_fail(var/mob/user, var/obj/item/weapon/gun/energy/laser/prototype/prototype) + for (var/mob/living/M in range(0,src)) //Only a minor failure, enjoy your radiation if you're in the same tile or carrying it + if (M != user) + M << "You feel a warm sensation." + M.apply_effect(rand(1,10)*(prototype.criticality+1), IRRADIATE) + return + +/obj/item/laser_components/capacitor/phoron/medium_fail(var/mob/user, var/obj/item/weapon/gun/energy/laser/prototype/prototype) + empulse(get_turf(src), 0, round((prototype.criticality+1)*3,1)) + explosion(get_turf(prototype), 0, 0, round((prototype.criticality+1)*2,1)) + return + +/obj/item/laser_components/capacitor/phoron/critical_fail(var/mob/user, var/obj/item/weapon/gun/energy/laser/prototype/prototype) + empulse(get_turf(src), round((prototype.criticality+1),1), round((prototype.criticality+1)*4,1)) + explosion(get_turf(prototype), 0, round((prototype.criticality+1),1), round((prototype.criticality+1)*3,1)) + ..() + +/obj/item/laser_components/capacitor/bluespace + name = "bluespace-enriched capacitor" + desc = "A capacitor built from bluespace enriched materials." + icon_state = "bluespace_capacitor" + damage = 35 + shots = 30 + reliability = 30 + +/obj/item/laser_components/capacitor/bluespace/small_fail(var/mob/user, var/obj/item/weapon/gun/energy/laser/prototype/prototype) + for (var/mob/living/M in range(round((prototype.criticality+1),1),src)) + empulse(get_turf(M), 0, round((prototype.criticality+1)*2,1)) + return + +/obj/item/laser_components/capacitor/bluespace/medium_fail(var/mob/user, var/obj/item/weapon/gun/energy/laser/prototype/prototype) + for (var/mob/living/M in range(round(3*(prototype.criticality+1),1),src)) + empulse(get_turf(M), 0, round((prototype.criticality+1)*2,1)) + do_teleport(M, get_turf(M), rand(1,3)*round((prototype.criticality+1),1), asoundin = 'sound/effects/phasein.ogg') + return + +/obj/item/laser_components/capacitor/bluespace/critical_fail(var/mob/user, var/obj/item/weapon/gun/energy/laser/prototype/prototype) + for (var/mob/living/M in range(round(6*(prototype.criticality+1),1),src)) + empulse(get_turf(M), 0, round((prototype.criticality+1)*4,1)) + do_teleport(M, get_turf(M), rand(6,18)*round((prototype.criticality+1),1), asoundin = 'sound/effects/phasein.ogg') + ..() + +//Lenses +/obj/item/laser_components/focusing_lens/shotgun + name = "splitter lens" + desc = "A focusing lens that splits the beam into several sub-beams." + icon_state = "splitter_lens" + dispersion = list(1,-1,2,-2,3,-3,4,-4,5,-5,6,-6,7,-7,8,-8,9,-9,10,-10,11,-11,12,-12,13,-13,14,-14,15,-15) + burst = 4 + accuracy = -1 + reliability = 30 + +/obj/item/laser_components/focusing_lens/sniper + name = "precise lens" + desc = "A focusing lens that is made of refined crystal, providing enhanced clarity and precision." + icon_state = "precise_lens" + accuracy = 2 + reliability = 20 + dispersion = list(0) + +/obj/item/laser_components/focusing_lens/strong + name = "reinforced lens" + desc = "A focusing lens that is reinforced with stronger material." + icon_state = "reinforced_lens" + reliability = 50 + +//Modifiers + +/obj/item/laser_components/modifier/silencer + name = "energy suppressor" + desc = "A sophisticated audio dampener that negates much of the sound produced by an energy weapon." + mod_type = MOD_SILENCE + icon_state = "energy_silencer" + +/obj/item/laser_components/modifier/aeg + name = "miniaturized reactor" + desc = "An internal nuclear reactor which recharges the energy cell of the weapon. Feels tingly." + icon_state = "mini_reactor" + mod_type = MOD_NUCLEAR_CHARGE + reliability = -10 + criticality = 1.5 + +/obj/item/laser_components/modifier/surge + name = "surge protector" + desc = "A surge protector along the cell minimizes capacitor failure." + reliability = 0 + base_malus = 0 //when modifiers get damaged they do not break, but make other components break faster + malus = 0 //subtracted from weapon's overall reliability everytime it's fired + criticality = 0.5 + icon_state = "surge_protector" + +/obj/item/laser_components/modifier/repeater + name = "pulser" + desc = "A modification to the energy cell that permits rudimentary burst fire." + base_malus = 0.5 //when modifiers get damaged they do not break, but make other components break faster + malus = 0.5 //subtracted from weapon's overall reliability everytime it's fired + burst_delay = 1 + burst = 3 + fire_delay = 3 + accuracy = -1 + icon_state = "pulser" + +/obj/item/laser_components/modifier/auxiliarycap + name = "auxiliary capacitor" + desc = "A string of sub-capacitors along the central cell provide additional bang for your buck." + base_malus = 3 + malus = 3 + reliability = -10 + shots = 2 + damage = 1.5 + criticality = 1.25 + icon_state = "aux_capacitor" + +/obj/item/laser_components/modifier/overcharge + name = "capacitor overcharge" + desc = "A bypass to the internal cell's limiter, producing an explosive result." + base_malus = 5 + malus = 5 + reliability = -25 + shots = 0.5 + damage = 2.5 + criticality = 2 + icon_state = "capacitor_overcharge" + +/obj/item/laser_components/modifier/gatling + name = "gatling rotator" + desc = "A modification to the lens that permits rapid-fire for extended durations." + base_malus = 0.5 + malus = 0.5 + burst_delay = 1 + burst = 10 + fire_delay = 10 + chargetime = 3 + accuracy = -3 + icon_state = "rotating_lens" + +/obj/item/laser_components/modifier/scope + name = "telescopic sight" + desc = "A modification that adds a zoom function to the prototype." + scope_name = "proto-scope" + gun_overlay = "scope" + icon_state = "telescopic_sight" + +/obj/item/laser_components/modifier/barrel + name = "reinforced barrel" + desc = "Reinforcement along the barrel extends the longevity of the prototype." + reliability = 25 + base_malus = 0 + malus = 0 + icon_state = "reinforced_barrel" + +/obj/item/laser_components/modifier/vents + name = "exhaust venting" + desc = "More efficient exhaust venting reduces the impact of firing the prototype." + reliability = 0 + base_malus = -5 + malus = -5 + icon_state = "vents" + +/obj/item/laser_components/modifier/grip + name = "enhanced grip" + desc = "A modification that improves the fire delay of the prototype." + fire_delay = 0.5 + gun_overlay = "grip" + icon_state = "enhanced_grip" + +/obj/item/laser_components/modifier/stock + name = "improved stock" + desc = "A modification that improves the accuracy." + fire_delay = 0.5 + accuracy = 1 + gun_overlay = "stock" + icon_state = "improved_stock" + +/obj/item/laser_components/modifier/bayonet + name = "bayonet" + desc = "A modification that adds a big knife to your gun. Science." + gun_force = 10 + gun_overlay = "bayonet" + icon_state = "bayonet_item" + +/obj/item/laser_components/modifier/ebayonet + name = "energy bayonet" + desc = "A modification that adds a hardlight knife to your gun. Science!" + gun_force = 25 + gun_overlay = "ebayonet" + icon_state = "ebayonet_item" + +//Projectile modulators + +/obj/item/laser_components/modulator/taser + name = "TASER modulator" + desc = "A modification that modulates the beam into a nonlethal electrical arc." + damage = 0 + projectile = /obj/item/projectile/beam/stun + icon_state = "taser" + +/obj/item/laser_components/modulator/tesla + name = "tesla modulator" + desc = "A modification that modulates the beam into a lethal electrical arc." + projectile = /obj/item/projectile/energy/tesla + icon_state = "tesla" + +/obj/item/laser_components/modulator/pulse + name = "pulse modulator" + desc = "Amplifies the laser beam into a highly lethal pulse beam." + projectile = /obj/item/projectile/beam/pulse + damage = 1.5 + icon_state = "pulse" + +/obj/item/laser_components/modulator/xray + name = "xray modulator" + desc = "Modulates the beam into a concentrated x-ray blast." + projectile = /obj/item/projectile/beam/sniper + icon_state = "xray" + +/obj/item/laser_components/modulator/ion + name = "ion cannon" + desc = "Modulates the prototype to fire disparate ion projectiles." + projectile = /obj/item/projectile/ion + icon_state = "ion" + +/obj/item/laser_components/modulator/floramut + name = "floral somatomodulator" + desc = "Modulates the beam into firing controlled radiation which induces mutation in plant cells." + projectile = /obj/item/projectile/energy/floramut + icon_state = "somatoray" + +/obj/item/laser_components/modulator/floramut2 + name = "betaray modulator" + desc = "Modulates the beam into firing controlled radiation which induces enhanced reproduction in plant cells." + projectile = /obj/item/projectile/energy/florayield + icon_state = "betaray" + +/obj/item/laser_components/modulator/arodentia + name = "arodentia modulator" + desc = "Modulates the beam into firing precise electrical arcs designed for pest control." + projectile = /obj/item/projectile/beam/mousegun + damage = 0 + icon_state = "pesker" + +/obj/item/laser_components/modulator/red + name = "red team modulator" + desc = "Modulates the beam into firing red team tagger beams." + projectile = /obj/item/projectile/beam/lastertag/red + damage = 0 + icon_state = "red" + +/obj/item/laser_components/modulator/blue + name = "blue team modulator" + desc = "Modulates the beam into firing blue team tagger beams." + projectile = /obj/item/projectile/beam/lastertag/blue + damage = 0 + icon_state = "blue" + +/obj/item/laser_components/modulator/omni + name = "omni team modulator" + desc = "Modulates the beam into firing omni team tagger beams." + projectile = /obj/item/projectile/beam/lastertag/omni + damage = 0 + icon_state = "omni" + +/obj/item/laser_components/modulator/practice + name = "practice beam modulator" + desc = "Modulates the beam into firing nonlethal practice beams." + projectile = /obj/item/projectile/beam/practice + damage = 0 + icon_state = "practice" + +/obj/item/laser_components/modulator/mindflayer + name = "mind flayer modulator" + desc = "Modulates the beam into firing \"mind flayer\" beams." + projectile = /obj/item/projectile/beam/mindflayer + damage = 0.5 + icon_state = "flayer" + +/obj/item/laser_components/modulator/decloner + name = "decloner modulator" + desc = "Modulates the beam into firing highly radioactive particulates." + projectile = /obj/item/projectile/energy/declone + damage = 0.5 + icon_state = "decloner" + +/obj/item/laser_components/modulator/ebow + name = "dart modulator" + desc = "Modulates the beam into firing minute energy darts." + projectile = /obj/item/projectile/energy/dart + damage = 0.25 + icon_state = "dart" + +/obj/item/laser_components/modulator/blaster + name = "blaster-bolt modulator" + desc = "Modulates the beam into firing disparate energy bolts." + projectile = /obj/item/projectile/energy/blaster + icon_state = "lensatic" + +/obj/item/laser_components/modulator/bfg + name = "bioforce modulator" + desc = "Modulates the beam into firing big green balls of death." + projectile = /obj/item/projectile/energy/bfg + damage = 2 + icon_state = "bfg" \ No newline at end of file diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index fb4cc7d18fa..fc8a9b762b4 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -333,4 +333,4 @@ /obj/item/projectile/beam/energy_net/proc/do_net(var/mob/M) var/obj/item/weapon/energy_net/net = new (get_turf(M)) - net.throw_impact(M) + net.throw_impact(M) \ No newline at end of file diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 9b310546640..a6fb6e3d6fc 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -7,8 +7,8 @@ check_armour = "energy" var/pulse_range = 1 -/obj/item/projectile/ion/on_hit(var/atom/target, var/blocked = 0) - empulse(target, pulse_range, pulse_range) +/obj/item/projectile/ion/on_impact(var/atom/A) + empulse(A, pulse_range, pulse_range) return 1 /obj/item/projectile/ion/small diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index 5f5d3db203d..cd9016e9d43 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -13,19 +13,12 @@ desc = initial(I.desc) ..() -/datum/design/item/weapon/stunrevolver - id = "stunrevolver" - req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_POWER = 2) - materials = list(DEFAULT_WALL_MATERIAL = 4000) - build_path = /obj/item/weapon/gun/energy/stunrevolver - sort_string = "TAAAA" - -/datum/design/item/weapon/nuclear_gun - id = "nuclear_gun" - req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 5, TECH_POWER = 3) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000, "uranium" = 500) - build_path = /obj/item/weapon/gun/energy/gun/nuclear - sort_string = "TAAAB" +/datum/design/item/weapon/flora_gun + id = "flora_gun" + req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 3, TECH_POWER = 3) + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 500, "uranium" = 500) + build_path = /obj/item/weapon/gun/energy/floragun + sort_string = "TBAAA" /datum/design/item/weapon/phoronpistol id = "ppistol" @@ -34,13 +27,6 @@ build_path = /obj/item/weapon/gun/energy/toxgun sort_string = "TAAAD" -/datum/design/item/weapon/decloner - id = "decloner" - req_tech = list(TECH_COMBAT = 7, TECH_MATERIAL = 7, TECH_BIO = 5, TECH_POWER = 6) - materials = list("gold" = 5000,"uranium" = 10000) - build_path = /obj/item/weapon/gun/energy/decloner - sort_string = "TAAAE" - /datum/design/item/weapon/smg id = "smg" req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3) @@ -93,13 +79,6 @@ build_path = /obj/item/weapon/grenade/chem_grenade/large sort_string = "TACAA" -/datum/design/item/weapon/flora_gun - id = "flora_gun" - req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 3, TECH_POWER = 3) - materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 500, "uranium" = 500) - build_path = /obj/item/weapon/gun/energy/floragun - sort_string = "TBAAA" - /datum/design/item/weapon/eglaive id = "eglaive" name = "energy glaive" @@ -109,15 +88,6 @@ build_path = /obj/item/weapon/melee/energy/glaive sort_string = "TVAAA" -/datum/design/item/weapon/gatlinglaser - id = "gatlinglaser" - name = "gatling laser" - desc = "A higly sophisticated rapid-fire laser weapon." - req_tech = list(TECH_COMBAT = 6, TECH_PHORON = 5, TECH_MATERIAL = 6, TECH_POWER = 3) - materials = list(DEFAULT_WALL_MATERIAL = 18750, "glass" = 7500, "phoron" = 7500, "silver" = 7500, "diamond" = 3000) - build_path = /obj/item/weapon/gun/energy/vaurca/gatlinglaser - sort_string = "TVBAA" - /datum/design/item/weapon/railgun id = "railgun" name = "railgun" @@ -127,15 +97,6 @@ build_path = /obj/item/weapon/gun/projectile/automatic/railgun sort_string = "TVCAA" -/datum/design/item/weapon/zorablaster - id = "zorablaster" - name = "zo'ra blaster" - desc = "A personal defense weapon reverse-engineered from schematics aboard Titan Prime." - req_tech = list(TECH_COMBAT = 2, TECH_PHORON = 4, TECH_MATERIAL = 2) - materials = list(DEFAULT_WALL_MATERIAL = 8000, "glass" = 2000, "phoron" = 6000) - build_path = /obj/item/weapon/gun/energy/vaurca/blaster - sort_string = "TVDAA" - /datum/design/item/weapon/lawgiver name = "Lawgiver" desc = "A highly advanced firearm for the modern police force. It has multiple voice-activated firing modes." @@ -157,17 +118,6 @@ category = "Weapons" sort_string = "TVFAA" -/datum/design/item/ebow - name = "Energy Crossbow" - desc = "A weapon favoured by infiltration teams." - id = "ebow" - req_tech = list(TECH_COMBAT = 4, TECH_ENGINEERING = 3, TECH_MATERIAL = 5, TECH_ILLEGAL = 3, TECH_BIO = 4) - build_type = PROTOLATHE - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000, "uranium" = 1000, "silver" = 1000) - build_path = /obj/item/weapon/gun/energy/crossbow/largecrossbow - category = "Weapons" - sort_string = "TVGAA" - /datum/design/item/eshield name = "Energy Shield" desc = "A shield capable of stopping most projectile and melee attacks. It can be retracted, expanded, and stored anywhere." @@ -179,28 +129,6 @@ category = "Weapons" sort_string = "TVHAA" -/datum/design/item/weapon/lasshotgun - id = "laser_shotgun" - req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 5, TECH_POWER = 4) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1500, "uranium" = 500, "diamond" = 500) - build_path = /obj/item/weapon/gun/energy/laser/shotgun - sort_string = "TVIAA" - -/datum/design/item/weapon/lasercannon - desc = "The lasing medium of this prototype is enclosed in a tube lined with uranium-235 and subjected to high neutron flux in a nuclear reactor core." - id = "lasercannon" - req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3, TECH_POWER = 3) - materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 1000, "diamond" = 2000) - build_path = /obj/item/weapon/gun/energy/rifle/laser/heavy - sort_string = "TVJAA" - -/datum/design/item/weapon/mousegun - id = "mousegun" - req_tech = list(TECH_MATERIAL = 1, TECH_BIO = 4, TECH_POWER = 3) - materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "uranium" = 500) - build_path = /obj/item/weapon/gun/energy/mousegun - sort_string = "TVLAA" - /datum/design/item/weapon/beegun id = "beegun" req_tech = list(TECH_MATERIAL = 6, TECH_BIO = 4, TECH_POWER = 4, TECH_COMBAT = 6, TECH_MAGNET = 4) @@ -213,4 +141,292 @@ req_tech = list(TECH_COMBAT = 7, TECH_PHORON = 2, TECH_MATERIAL = 7, TECH_MAGNET = 4, TECH_POWER = 5, TECH_ILLEGAL = 3) materials = list(DEFAULT_WALL_MATERIAL = 15000, "glass" = 9750, "phoron" = 5250, "gold" = 1100) build_path = /obj/item/ammo_magazine/trodpack - sort_string = "TVNAA" \ No newline at end of file + sort_string = "TVNAA" + +///MODULAR WEAPON COMPONENTS +/datum/design/item/weapon/modular_small + id = "stock_small" + req_tech = list(TECH_MATERIAL = 1) + materials = list(DEFAULT_WALL_MATERIAL = 2000) + build_path = /obj/item/device/laser_assembly + sort_string = "TZZAA" + +/datum/design/item/weapon/modular_medium + id = "stock_medium" + req_tech = list(TECH_MATERIAL = 1) + materials = list(DEFAULT_WALL_MATERIAL = 4000) + build_path = /obj/item/device/laser_assembly/medium + sort_string = "TZZAB" + +/datum/design/item/weapon/modular_large + id = "stock_large" + req_tech = list(TECH_MATERIAL = 1, TECH_ENGINEERING = 2) + materials = list(DEFAULT_WALL_MATERIAL = 8000) + build_path = /obj/item/device/laser_assembly/large + sort_string = "TZZAC" + +/datum/design/item/weapon/modular_cap + id = "stock_capacitor" + req_tech = list(TECH_POWER = 2, TECH_ENGINEERING = 2) + materials = list(DEFAULT_WALL_MATERIAL = 1000) + build_path = /obj/item/laser_components/capacitor + sort_string = "TZZBA" + +/datum/design/item/weapon/modular_starch + id = "stock_starch" + req_tech = list(TECH_ENGINEERING = 2) + materials = list(DEFAULT_WALL_MATERIAL = 1000) + build_path = /obj/item/laser_components/capacitor + sort_string = "TZZBB" + +/datum/design/item/weapon/modular_reinforced + id = "stock_reinforced_cap" + req_tech = list(TECH_POWER = 5, TECH_ENGINEERING = 3) + materials = list(DEFAULT_WALL_MATERIAL = 4000) + build_path = /obj/item/laser_components/capacitor/reinforced + sort_string = "TZZBC" + +/datum/design/item/weapon/modular_nuke + id = "stock_nuke_cap" + req_tech = list(TECH_POWER = 5, TECH_ENGINEERING = 5) + materials = list(DEFAULT_WALL_MATERIAL = 4000, "uranium" = 1000) + build_path = /obj/item/laser_components/capacitor/nuclear + sort_string = "TZZBC" + +/datum/design/item/weapon/modular_teranium + id = "stock_teranium" + req_tech = list(TECH_POWER = 6, TECH_ENGINEERING = 4, TECH_MAGNET = 6) + materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 1000, "uranium" = 500) + build_path = /obj/item/laser_components/capacitor/teranium + sort_string = "TZZBD" + +/datum/design/item/weapon/modular_phoron + id = "stock_teranium" + req_tech = list(TECH_POWER = 8, TECH_ENGINEERING = 5, TECH_PHORON = 6) + materials = list(DEFAULT_WALL_MATERIAL = 4000, "phoron" = 3000, "uranium" = 500) + build_path = /obj/item/laser_components/capacitor/phoron + sort_string = "TZZBE" + +/datum/design/item/weapon/modular_bs + id = "stock_bs" + req_tech = list(TECH_POWER = 8, TECH_ENGINEERING = 8, TECH_PHORON = 7, TECH_BLUESPACE = 7) + materials = list(DEFAULT_WALL_MATERIAL = 4000, "phoron" = 3000, "uranium" = 500, "diamond" = 1000) + build_path = /obj/item/laser_components/capacitor/teranium + sort_string = "TZZBF" + +/datum/design/item/weapon/modular_lens + id = "stock_lens" + req_tech = list(TECH_MATERIAL = 1, TECH_ENGINEERING = 1) + materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 2000) + build_path = /obj/item/laser_components/focusing_lens + sort_string = "TZZCA" + +/datum/design/item/weapon/modular_splitter + id = "stock_splitter" + req_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 1) + materials = list(DEFAULT_WALL_MATERIAL = 750, "glass" = 2000) + build_path = /obj/item/laser_components/focusing_lens/shotgun + sort_string = "TZZCB" + +/datum/design/item/weapon/modular_sniper + id = "stock_sniper" + req_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 1) + materials = list(DEFAULT_WALL_MATERIAL = 750, "glass" = 2000) + build_path = /obj/item/laser_components/focusing_lens/sniper + sort_string = "TZZCC" + +/datum/design/item/weapon/modular_reinforced + id = "stock_strong" + req_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 1) + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000) + build_path = /obj/item/laser_components/focusing_lens/strong + sort_string = "TZZCD" + +/datum/design/item/weapon/modular_silent + id = "stock_silence" + req_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2) + materials = list(DEFAULT_WALL_MATERIAL = 2000) + build_path = /obj/item/laser_components/modifier/silencer + sort_string = "TZZDA" + +/datum/design/item/weapon/modular_aeg + id = "stock_aeg" + req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 5, TECH_POWER = 3) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000, "uranium" = 500) + build_path = /obj/item/laser_components/modifier/aeg + sort_string = "TZZDB" + +/datum/design/item/weapon/modular_surge + id = "stock_surge" + req_tech = list(TECH_MATERIAL = 5, TECH_POWER = 3) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000) + build_path = /obj/item/laser_components/modifier/surge + sort_string = "TZZDC" + +/datum/design/item/weapon/modular_repeater + id = "stock_repeater" + req_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 3) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000) + build_path = /obj/item/laser_components/modifier/repeater + sort_string = "TZZDD" + +/datum/design/item/weapon/modular_aux + id = "stock_aux" + req_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 3, TECH_POWER = 3) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000) + build_path = /obj/item/laser_components/modifier/auxiliarycap + sort_string = "TZZDE" + +/datum/design/item/weapon/modular_overcharge + id = "stock_repeater" + req_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 4, TECH_POWER = 4) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000) + build_path = /obj/item/laser_components/modifier/overcharge + sort_string = "TZZDF" + +/datum/design/item/weapon/modular_gatling + id = "stock_gat" + req_tech = list(TECH_COMBAT = 6, TECH_PHORON = 5, TECH_MATERIAL = 6, TECH_POWER = 3) + materials = list(DEFAULT_WALL_MATERIAL = 750, "glass" = 3000, "phoron" = 2000, "silver" = 2000, "diamond" = 1000) + build_path = /obj/item/laser_components/modifier/gatling + sort_string = "TZZDG" + +/datum/design/item/weapon/modular_scope + id = "stock_scope" + req_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2) + materials = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 500) + build_path = /obj/item/laser_components/modifier/scope + sort_string = "TZZDH" + +/datum/design/item/weapon/modular_barrel + id = "stock_barrel" + req_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2) + materials = list(DEFAULT_WALL_MATERIAL = 3000) + build_path = /obj/item/laser_components/modifier/barrel + sort_string = "TZZDI" + +/datum/design/item/weapon/modular_vents + id = "stock_vents" + req_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2) + materials = list(DEFAULT_WALL_MATERIAL = 3000) + build_path = /obj/item/laser_components/modifier/vents + sort_string = "TZZDJ" + +/datum/design/item/weapon/modular_stock + id = "stock_stock" + req_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2) + materials = list(DEFAULT_WALL_MATERIAL = 3000) + build_path = /obj/item/laser_components/modifier/stock + sort_string = "TZZDK" + +/datum/design/item/weapon/modular_bayonet + id = "stock_bayonet" + req_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2) + materials = list(DEFAULT_WALL_MATERIAL = 3000) + build_path = /obj/item/laser_components/modifier/bayonet + sort_string = "TZZDL" + +/datum/design/item/weapon/modular_ebayonet + id = "stock_ebayonet" + req_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2, TECH_POWER = 2) + materials = list(DEFAULT_WALL_MATERIAL = 3000, "silver" = 500, "phoron" = 500) + build_path = /obj/item/laser_components/modifier/ebayonet + sort_string = "TZZDM" + +/datum/design/item/weapon/modular_taser + id = "stock_taser" + req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_POWER = 2) + materials = list(DEFAULT_WALL_MATERIAL = 4000) + build_path = /obj/item/laser_components/modulator/taser + sort_string = "TZZEA" + +/datum/design/item/weapon/modular_tesla + id = "stock_supertaser" + req_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 6, TECH_POWER = 4) + materials = list(DEFAULT_WALL_MATERIAL = 4000, "silver" = 1000, "phoron" = 2000) + build_path = /obj/item/laser_components/modulator/tesla + sort_string = "TZZEB" + +/datum/design/item/weapon/modular_ion + id = "stock_ion" + req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_POWER = 5) + materials = list(DEFAULT_WALL_MATERIAL = 750, "glass" = 500, "phoron" = 2000) + build_path = /obj/item/laser_components/modulator/ion + sort_string = "TZZEC" + +/datum/design/item/weapon/modular_soma + id = "stock_soma" + req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 3, TECH_POWER = 3) + materials = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 250, "uranium" = 250) + build_path = /obj/item/laser_components/modulator/floramut + sort_string = "TZZED" + +/datum/design/item/weapon/modular_beta + id = "stock_beta" + req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 3, TECH_POWER = 3) + materials = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 250, "uranium" = 250) + build_path = /obj/item/laser_components/modulator/floramut2 + sort_string = "TZZEE" + +/datum/design/item/weapon/modular_pest + id = "stock_pest" + req_tech = list(TECH_MATERIAL = 1, TECH_BIO = 4, TECH_POWER = 3) + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "uranium" = 500) + build_path = /obj/item/laser_components/modulator/arodentia + sort_string = "TZZEF" + +/datum/design/item/weapon/modular_tag1 + id = "stock_tag1" + req_tech = list(TECH_COMBAT = 1, TECH_MATERIAL = 1) + materials = list(DEFAULT_WALL_MATERIAL = 2000) + build_path = /obj/item/laser_components/modulator/red + sort_string = "TZZEG" + +/datum/design/item/weapon/modular_tag2 + id = "stock_tag2" + req_tech = list(TECH_COMBAT = 1, TECH_MATERIAL = 1) + materials = list(DEFAULT_WALL_MATERIAL = 2000) + build_path = /obj/item/laser_components/modulator/blue + sort_string = "TZZEH" + +/datum/design/item/weapon/modular_tag3 + id = "stock_tag3" + req_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 1) + materials = list(DEFAULT_WALL_MATERIAL = 2000) + build_path = /obj/item/laser_components/modulator/omni + sort_string = "TZZEI" + +/datum/design/item/weapon/modular_practice + id = "stock_practice" + req_tech = list(TECH_MATERIAL = 1) + materials = list(DEFAULT_WALL_MATERIAL = 2000) + build_path = /obj/item/laser_components/modulator/practice + sort_string = "TZZEJ" + +/datum/design/item/weapon/modular_decloner + id = "stock_declone" + req_tech = list(TECH_COMBAT = 5, TECH_PHORON = 4) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000, "phoron" = 3000) + build_path = /obj/item/laser_components/modulator/mindflayer + sort_string = "TZZEK" + +/datum/design/item/weapon/modular_ebow + id = "stock_ebow" + req_tech = list(TECH_COMBAT = 5, TECH_PHORON = 4) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000, "phoron" = 3000) + build_path = /obj/item/laser_components/modulator/mindflayer + sort_string = "TZZEL" + +/datum/design/item/weapon/modular_blaster + id = "stock_blaster" + req_tech = list(TECH_COMBAT = 2, TECH_PHORON = 4, TECH_MATERIAL = 2) + materials = list(DEFAULT_WALL_MATERIAL = 8000, "glass" = 2000, "phoron" = 6000) + build_path = /obj/item/laser_components/modulator/blaster + sort_string = "TZZEM" + +/datum/design/item/weapon/modular_laser + id = "stock_laser" + req_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 3, TECH_POWER = 3) + materials = list(DEFAULT_WALL_MATERIAL = 750, "glass" = 500, "phoron" = 1000) + build_path = /obj/item/laser_components/modulator + sort_string = "TZZEN" \ No newline at end of file diff --git a/html/changelogs/sciencebuffs.yml b/html/changelogs/sciencebuffs.yml new file mode 100644 index 00000000000..42da19b970b --- /dev/null +++ b/html/changelogs/sciencebuffs.yml @@ -0,0 +1,38 @@ +################################ +# 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 +# balance +################################# + +# Your name. +author: LordFowl + +# 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: + - rscdel: "Removes energy weapons (except the Lawgiver MkII) from the RnD protolathe." + - rscadd: "Adds components for the construction of modular energy weapons to the RnD protolathe. An energy weapon can be constructed by adding a capacitor, a lens, and a modulator plus any number of modifiers to an appropriate chassis." diff --git a/icons/obj/modular_laser.dmi b/icons/obj/modular_laser.dmi new file mode 100644 index 0000000000000000000000000000000000000000..815f6e89852f11f3a2b4e76e335de80e3e59d1d0 GIT binary patch literal 7557 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 literal 0 HcmV?d00001