diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm
new file mode 100644
index 00000000000..83db83c329c
--- /dev/null
+++ b/code/__DEFINES/inventory.dm
@@ -0,0 +1,7 @@
+//ITEM INVENTORY WEIGHT, FOR w_class
+#define WEIGHT_CLASS_TINY 1 //Usually items smaller then a human hand, ex: Playing Cards, Lighter, Scalpel, Coins/Money
+#define WEIGHT_CLASS_SMALL 2 //Pockets can hold small and tiny items, ex: Flashlight, Multitool, Grenades, GPS Device
+#define WEIGHT_CLASS_NORMAL 3 //Standard backpacks can carry tiny, small & normal items, ex: Fire extinguisher, Stunbaton, Gas Mask, Metal Sheets
+#define WEIGHT_CLASS_BULKY 4 //Items that can be weilded or equipped but not stored in an inventory, ex: Defibrillator, Backpack, Space Suits
+#define WEIGHT_CLASS_HUGE 5 //Usually represents objects that require two hands to operate, ex: Shotgun, Two Handed Melee Weapons
+#define WEIGHT_CLASS_GIGANTIC 6 //Essentially means it cannot be picked up or placed in an inventory, ex: Mech Parts, Safe
\ No newline at end of file
diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm
new file mode 100644
index 00000000000..fa040bf866b
--- /dev/null
+++ b/code/__DEFINES/layers.dm
@@ -0,0 +1,73 @@
+//Defines for atom layers and planes
+//KEEP THESE IN A NICE ACSCENDING ORDER, PLEASE
+
+#define CLICKCATCHER_PLANE -99
+
+#define PLANE_SPACE -95
+#define PLANE_SPACE_PARALLAX -90
+
+#define GAME_PLANE 0
+//#define TURF_LAYER 2 //For easy recordkeeping; this is a byond define
+#define MID_TURF_LAYER 2.02
+#define HIGH_TURF_LAYER 2.03
+#define ABOVE_OPEN_TURF_LAYER 2.04
+#define CLOSED_TURF_LAYER 2.05
+#define ABOVE_NORMAL_TURF_LAYER 2.08
+#define LATTICE_LAYER 2.2
+#define DISPOSAL_PIPE_LAYER 2.3
+#define GAS_PIPE_LAYER 2.35
+#define WIRE_LAYER 2.4
+#define WIRE_TERMINAL_LAYER 2.45
+#define LOW_OBJ_LAYER 2.5
+
+#define BELOW_OPEN_DOOR_LAYER 2.6
+#define OPEN_DOOR_LAYER 2.7
+#define PROJECTILE_HIT_THRESHHOLD_LAYER 2.75 //projectiles won't hit objects at or below this layer if possible
+#define TABLE_LAYER 2.8
+#define BELOW_OBJ_LAYER 2.9
+#define LOW_ITEM_LAYER 2.95
+//#define OBJ_LAYER 3 //For easy recordkeeping; this is a byond define
+#define CLOSED_DOOR_LAYER 3.1
+#define CLOSED_FIREDOOR_LAYER 3.11
+#define ABOVE_OBJ_LAYER 3.2
+#define ABOVE_WINDOW_LAYER 3.3
+#define SIGN_LAYER 3.4
+#define NOT_HIGH_OBJ_LAYER 3.5
+#define HIGH_OBJ_LAYER 3.6
+
+#define BELOW_MOB_LAYER 3.7
+#define LYING_MOB_LAYER 3.8
+//#define MOB_LAYER 4 //For easy recordkeeping; this is a byond define
+#define ABOVE_MOB_LAYER 4.1
+#define WALL_OBJ_LAYER 4.25
+#define EDGED_TURF_LAYER 4.3
+#define ON_EDGED_TURF_LAYER 4.35
+#define LARGE_MOB_LAYER 4.4
+#define ABOVE_ALL_MOB_LAYER 4.5
+
+#define SPACEVINE_LAYER 4.8
+#define SPACEVINE_MOB_LAYER 4.9
+//#define FLY_LAYER 5 //For easy recordkeeping; this is a byond define
+#define RIPPLE_LAYER 5.1
+
+#define GHOST_LAYER 6
+#define AREA_LAYER 10
+#define MASSIVE_OBJ_LAYER 11
+#define POINT_LAYER 12
+
+#define LIGHTING_PLANE 15
+#define LIGHTING_LAYER 15
+
+//HUD layer defines
+
+#define FULLSCREEN_PLANE 18
+#define FLASH_LAYER 18
+#define FULLSCREEN_LAYER 18.1
+#define UI_DAMAGE_LAYER 18.2
+#define BLIND_LAYER 18.3
+#define CRIT_LAYER 18.4
+
+#define HUD_PLANE 19
+#define HUD_LAYER 19
+#define ABOVE_HUD_PLANE 20
+#define ABOVE_HUD_LAYER 20
diff --git a/code/game/asteroid.dm b/code/game/asteroid.dm
index c78037a73b4..77c3179adf5 100644
--- a/code/game/asteroid.dm
+++ b/code/game/asteroid.dm
@@ -88,7 +88,7 @@ var/global/max_secret_rooms = 6
theme = "cavein"
walltypes = list(/turf/simulated/mineral/random/high_chance=1)
floortypes = list(/turf/simulated/floor/plating/airless/asteroid, /turf/simulated/floor/beach/sand)
- treasureitems = list(/obj/mecha/working/ripley/mining=1, /obj/item/weapon/pickaxe/drill/diamonddrill=2,/obj/item/weapon/gun/energy/kinetic_accelerator/hyper=1,
+ treasureitems = list(/obj/mecha/working/ripley/mining=1, /obj/item/weapon/pickaxe/drill/diamonddrill=2,
/obj/item/weapon/resonator/upgraded=1, /obj/item/weapon/pickaxe/drill/jackhammer=5)
fluffitems = list(/obj/effect/decal/cleanable/blood=3,/obj/effect/decal/remains/human=1,/obj/item/clothing/under/overalls=1,
/obj/item/weapon/reagent_containers/food/snacks/grown/chili=1,/obj/item/weapon/tank/oxygen/red=2)
diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm
index fbfbbb12527..b04a3012fc3 100644
--- a/code/game/gamemodes/shadowling/shadowling_abilities.dm
+++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm
@@ -84,8 +84,8 @@
P.visible_message("[P]'s light fades and turns off.")
else if(istype(I, /obj/item/weapon/gun))
var/obj/item/weapon/gun/G = I
- if(G.F)
- var/obj/item/device/flashlight/F = G.F
+ if(G.gun_light)
+ var/obj/item/device/flashlight/F = G.gun_light
if(F.on)
G.toggle_gunlight()
G.visible_message("[G]'s light fades and turns off.")
diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm
index 140c013b270..0bb6278c0bc 100644
--- a/code/game/objects/effects/overlays.dm
+++ b/code/game/objects/effects/overlays.dm
@@ -113,6 +113,18 @@
layer = 4.1
duration = 4
+/obj/effect/overlay/temp/explosion
+ name = "explosion"
+ icon = 'icons/effects/96x96.dmi'
+ icon_state = "explosion"
+ pixel_x = -32
+ pixel_y = -32
+ duration = 8
+
+/obj/effect/overlay/temp/explosion/fast
+ icon_state = "explosionfast"
+ duration = 4
+
/obj/effect/overlay/temp/decoy
desc = "It's a decoy!"
duration = 15
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index bd6f3acfdee..40cc65da34a 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -196,25 +196,6 @@
return 1
-/obj/item/borg/upgrade/hyperka
- name = "mining cyborg hyper-kinetic accelerator"
- desc = "A satchel of holding replacement for mining cyborg's ore satchel module."
- icon_state = "cyborg_upgrade3"
- require_module = 1
- module_type = /obj/item/weapon/robot_module/miner
-
-/obj/item/borg/upgrade/hyperka/action(mob/living/silicon/robot/R)
- if(..())
- return
-
- for(var/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg/H in R.module.modules)
- qdel(H)
-
- R.module.modules += new /obj/item/weapon/gun/energy/kinetic_accelerator/hyper/cyborg(R.module)
- R.module.rebuild()
-
- return 1
-
/obj/item/borg/upgrade/syndicate
name = "illegal equipment module"
desc = "Unlocks the hidden, deadlier functions of a cyborg"
diff --git a/code/game/objects/items/weapons/powerfist.dm b/code/game/objects/items/weapons/powerfist.dm
index eefd3b7d0f6..0167ab589be 100644
--- a/code/game/objects/items/weapons/powerfist.dm
+++ b/code/game/objects/items/weapons/powerfist.dm
@@ -87,7 +87,7 @@
target.apply_damage(force * fisto_setting, BRUTE)
target.visible_message("[user]'s powerfist lets out a loud hiss as they punch [target.name]!", \
"You cry out in pain as [user]'s punch flings you backwards!")
- new/obj/effect/kinetic_blast(target.loc)
+ new /obj/effect/overlay/temp/kinetic_blast(target.loc)
playsound(loc, 'sound/weapons/resonator_blast.ogg', 50, 1)
playsound(loc, 'sound/weapons/genhit2.ogg', 50, 1)
diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm
index db641754240..c7212fe5a15 100644
--- a/code/modules/mining/abandonedcrates.dm
+++ b/code/modules/mining/abandonedcrates.dm
@@ -63,7 +63,7 @@
if(57 to 58)
new /obj/item/toy/syndicateballoon(src)
if(59 to 60)
- new /obj/item/weapon/gun/energy/kinetic_accelerator/hyper(src)
+ new /obj/item/borg/upgrade/modkit/aoe/mobs(src)
new /obj/item/clothing/suit/space(src)
new /obj/item/clothing/head/helmet/space(src)
if(61 to 62)
diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm
index 4e8274dac1e..56ca8ba9ff9 100644
--- a/code/modules/mining/equipment_locker.dm
+++ b/code/modules/mining/equipment_locker.dm
@@ -313,7 +313,7 @@
anchored = 1.0
var/obj/item/weapon/card/id/inserted_id
var/list/prize_list = list(
- new /datum/data/mining_equipment("Stimpack", /obj/item/weapon/reagent_containers/hypospray/autoinjector/stimpack, 50),
+ new /datum/data/mining_equipment("Stimpack", /obj/item/weapon/reagent_containers/hypospray/autoinjector/stimpack, 50),
new /datum/data/mining_equipment("Teporone MediPen", /obj/item/weapon/reagent_containers/hypospray/autoinjector/teporone, 50),
new /datum/data/mining_equipment("MediPen Bundle", /obj/item/weapon/storage/box/autoinjector/utility, 200),
new /datum/data/mining_equipment("Whiskey", /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey, 100),
@@ -327,7 +327,7 @@
new /datum/data/mining_equipment("Drone Melee Upgrade", /obj/item/device/mine_bot_ugprade, 400),
new /datum/data/mining_equipment("Drone Health Upgrade",/obj/item/device/mine_bot_ugprade/health, 400),
new /datum/data/mining_equipment("Drone Ranged Upgrade",/obj/item/device/mine_bot_ugprade/cooldown, 600),
- new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/weapon/twohanded/required/mining_hammer, 750),
+ new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/weapon/twohanded/required/mining_hammer, 750),
new /datum/data/mining_equipment("Drone AI Upgrade", /obj/item/slimepotion/sentience/mining, 1000),
new /datum/data/mining_equipment("GAR mesons", /obj/item/clothing/glasses/meson/gar, 500),
new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/weapon/storage/firstaid/brute, 600),
@@ -342,6 +342,14 @@
new /datum/data/mining_equipment("Space Cash", /obj/item/weapon/spacecash/c1000, 2000),
new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/weapon/pickaxe/diamond, 2000),
new /datum/data/mining_equipment("Super Resonator", /obj/item/weapon/resonator/upgraded, 2500),
+ new /datum/data/mining_equipment("KA White Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer, 100),
+ new /datum/data/mining_equipment("KA Adjustable Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer/adjustable, 150),
+ new /datum/data/mining_equipment("KA Super Chassis", /obj/item/borg/upgrade/modkit/chassis_mod, 250),
+ new /datum/data/mining_equipment("KA Hyper Chassis", /obj/item/borg/upgrade/modkit/chassis_mod/orange, 300),
+ new /datum/data/mining_equipment("KA Range Increase", /obj/item/borg/upgrade/modkit/range, 1000),
+ new /datum/data/mining_equipment("KA Damage Increase", /obj/item/borg/upgrade/modkit/damage, 1000),
+ new /datum/data/mining_equipment("KA Cooldown Decrease",/obj/item/borg/upgrade/modkit/cooldown, 1000),
+ new /datum/data/mining_equipment("KA AoE Damage", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000),
new /datum/data/mining_equipment("Point Transfer Card", /obj/item/weapon/card/mining_point_card, 500),
)
diff --git a/code/modules/mining/lavaland/loot/tendril_loot.dm b/code/modules/mining/lavaland/loot/tendril_loot.dm
index e489b35ad62..757c8dfc1d4 100644
--- a/code/modules/mining/lavaland/loot/tendril_loot.dm
+++ b/code/modules/mining/lavaland/loot/tendril_loot.dm
@@ -90,8 +90,8 @@
color = "#FFEBEB"
/datum/reagent/flightpotion/reaction_mob(mob/living/M, method = TOUCH, reac_volume, show_message = 1)
- return // This item currently does not work as we do not have the angel species.
- if(ishuman(M) && M.stat != DEAD)
+ to_chat(M, "This item is currently non-functional.")
+ /*if(ishuman(M) && M.stat != DEAD)
var/mob/living/carbon/human/H = M
if(H.species.name != "Human" || reac_volume < 5) // implying xenohumans are holy
if(method == INGEST && show_message)
@@ -103,7 +103,7 @@
playsound(H.loc, 'sound/items/poster_ripped.ogg', 50, 1, -1)
H.adjustBruteLoss(20)
H.emote("scream")
- ..()
+ ..()*/
//Boat
@@ -158,7 +158,7 @@
icon_state = "ship_bottle"
/obj/item/ship_in_a_bottle/attack_self(mob/user)
- user << "You're not sure how they get the ships in these things, but you're pretty sure you know how to get it out."
+ to_chat(user, "You're not sure how they get the ships in these things, but you're pretty sure you know how to get it out.")
playsound(user.loc, 'sound/effects/Glassbr1.ogg', 100, 1)
new /obj/vehicle/lavaboat/dragon(get_turf(src))
qdel(src)
@@ -170,4 +170,151 @@
icon_state = "dragon_boat"
generic_pixel_y = 2
generic_pixel_x = 1
- vehicle_move_delay = 1
\ No newline at end of file
+ vehicle_move_delay = 1
+
+// Wisp Lantern
+/obj/item/device/wisp_lantern
+ name = "spooky lantern"
+ desc = "This lantern gives off no light, but is home to a friendly wisp."
+ icon = 'icons/obj/lighting.dmi'
+ icon_state = "lantern-blue"
+ var/obj/effect/wisp/wisp
+
+/obj/item/device/wisp_lantern/attack_self(mob/user)
+ if(!wisp)
+ to_chat(user, "The wisp has gone missing!")
+ return
+ if(wisp.loc == src)
+ to_chat(user, "You release the wisp. It begins to bob around your head.")
+ user.sight |= SEE_MOBS
+ icon_state = "lantern"
+ wisp.orbit(user, 20)
+ feedback_add_details("wisp_lantern","F") // freed
+
+ else
+ to_chat(user, "You return the wisp to the lantern.")
+
+ if(wisp.orbiting)
+ var/atom/A = wisp.orbiting.orbiting
+ if(isliving(A))
+ var/mob/living/M = A
+ M.sight &= ~SEE_MOBS
+ to_chat(M, "Your vision returns to normal.")
+
+ wisp.stop_orbit()
+ wisp.loc = src
+ icon_state = "lantern-blue"
+ feedback_add_details("wisp_lantern","R") // returned
+
+/obj/item/device/wisp_lantern/New()
+ ..()
+ wisp = new(src)
+
+/obj/item/device/wisp_lantern/Destroy()
+ if(wisp)
+ if(wisp.loc == src)
+ qdel(wisp)
+ else
+ wisp.visible_message("[wisp] has a sad feeling for a moment, then it passes.")
+ ..()
+
+/obj/effect/wisp
+ name = "friendly wisp"
+ desc = "Happy to light your way."
+ icon = 'icons/obj/lighting.dmi'
+ icon_state = "orb"
+ luminosity = 7
+ layer = ABOVE_ALL_MOB_LAYER
+
+//Red/Blue Cubes
+
+/obj/item/device/warp_cube
+ name = "blue cube"
+ desc = "A mysterious blue cube."
+ icon = 'icons/obj/lavaland/artefacts.dmi'
+ icon_state = "blue_cube"
+ var/obj/item/device/warp_cube/linked
+
+/obj/item/device/warp_cube/Destroy()
+ if(linked)
+ linked.linked = null
+ linked = null
+ return ..()
+
+/obj/item/device/warp_cube/attack_self(mob/user)
+ if(!linked)
+ to_chat(user, "[src] fizzles uselessly.")
+ return
+
+ var/datum/effect/system/harmless_smoke_spread/smoke = new /datum/effect/system/harmless_smoke_spread()
+ smoke.set_up(1, 0, user.loc)
+ smoke.start()
+
+ user.forceMove(get_turf(linked))
+ feedback_add_details("warp_cube","[src.type]")
+
+ var/datum/effect/system/harmless_smoke_spread/smoke = new /datum/effect/system/harmless_smoke_spread()
+ smoke.set_up(1, 0, user.loc)
+ smoke.start()
+
+/obj/item/device/warp_cube/red
+ name = "red cube"
+ desc = "A mysterious red cube."
+ icon_state = "red_cube"
+
+/obj/item/device/warp_cube/red/New()
+ ..()
+ if(!linked)
+ var/obj/item/device/warp_cube/blue = new(src.loc)
+ linked = blue
+ blue.linked = src
+
+//Meat Hook
+
+/obj/item/weapon/gun/magic/hook
+ name = "meat hook"
+ desc = "Mid or feed."
+ ammo_type = /obj/item/ammo_casing/magic/hook
+ icon_state = "hook"
+ item_state = "chain"
+ fire_sound = 'sound/weapons/batonextend.ogg'
+ max_charges = 1
+ flags = NOBLUDGEON
+ force = 18
+
+/obj/item/ammo_casing/magic/hook
+ name = "hook"
+ desc = "a hook."
+ projectile_type = /obj/item/projectile/hook
+ caliber = "hook"
+ icon_state = "hook"
+
+/obj/item/projectile/hook
+ name = "hook"
+ icon_state = "hook"
+ icon = 'icons/obj/lavaland/artefacts.dmi'
+ pass_flags = PASSTABLE
+ damage = 25
+ armour_penetration = 100
+ damage_type = BRUTE
+ hitsound = 'sound/effects/splat.ogg'
+ weaken = 3
+ var/chain
+
+/obj/item/projectile/hook/fire(setAngle)
+ if(firer)
+ chain = firer.Beam(src, icon_state = "chain", time = INFINITY, maxdistance = INFINITY)
+ ..()
+ //TODO: root the firer until the chain returns
+
+/obj/item/projectile/hook/on_hit(atom/target)
+ . = ..()
+ if(isliving(target))
+ var/mob/living/L = target
+ if(!L.anchored)
+ L.visible_message("[L] is snagged by [firer]'s hook!")
+ L.forceMove(get_turf(firer))
+
+/obj/item/projectile/hook/Destroy()
+ qdel(chain)
+ return ..()
\ No newline at end of file
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 6cafcce56c3..22d45c51015 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -45,7 +45,7 @@
lefthand_file = 'icons/mob/inhands/guns_lefthand.dmi'
righthand_file = 'icons/mob/inhands/guns_righthand.dmi'
- var/obj/item/device/flashlight/F = null
+ var/obj/item/device/flashlight/gun_light = null
var/can_flashlight = 0
var/list/upgrades = list()
@@ -63,7 +63,7 @@
/obj/item/weapon/gun/New()
..()
- if(F)
+ if(gun_light)
verbs += /obj/item/weapon/gun/proc/toggle_gunlight
build_zooming()
@@ -241,27 +241,27 @@ obj/item/weapon/gun/proc/newshot()
if(istype(I, /obj/item/device/flashlight/seclite))
var/obj/item/device/flashlight/seclite/S = I
if(can_flashlight)
- if(!F)
+ if(!gun_light)
if(!user.unEquip(I))
return
to_chat(user, "You click [S] into place on [src].")
if(S.on)
set_light(0)
- F = S
+ gun_light = S
I.loc = src
update_icon()
- update_gunlight(user)
+ update_gun_light(user)
var/datum/action/A = new /datum/action/item_action/toggle_gunlight(src)
if(loc == user)
A.Grant(user)
if(istype(I, /obj/item/weapon/screwdriver))
- if(F && can_flashlight)
+ if(gun_light && can_flashlight)
for(var/obj/item/device/flashlight/seclite/S in src)
to_chat(user, "You unscrew the seclite from [src].")
- F = null
+ gun_light = null
S.loc = get_turf(user)
- update_gunlight(user)
+ update_gun_light(user)
S.update_brightness(user)
update_icon()
for(var/datum/action/item_action/toggle_gunlight/TGL in actions)
@@ -273,26 +273,26 @@ obj/item/weapon/gun/proc/newshot()
..()
/obj/item/weapon/gun/proc/toggle_gunlight()
- set name = "Toggle Gunlight"
+ set name = "Toggle gun_light"
set category = "Object"
set desc = "Click to toggle your weapon's attached flashlight."
- if(!F)
+ if(!gun_light)
return
var/mob/living/carbon/human/user = usr
if(!isturf(user.loc))
to_chat(user, "You cannot turn the light on while in this [user.loc]!")
- F.on = !F.on
- to_chat(user, "You toggle the gunlight [F.on ? "on":"off"].")
+ gun_light.on = !gun_light.on
+ to_chat(user, "You toggle the gun_light [gun_light.on ? "on":"off"].")
playsound(user, 'sound/weapons/empty.ogg', 100, 1)
- update_gunlight(user)
+ update_gun_light(user)
-/obj/item/weapon/gun/proc/update_gunlight(mob/user = null)
- if(F)
- if(F.on)
- set_light(F.brightness_on)
+/obj/item/weapon/gun/proc/update_gun_light(mob/user = null)
+ if(gun_light)
+ if(gun_light.on)
+ set_light(gun_light.brightness_on)
else
set_light(0)
update_icon()
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index 2d87a32be2b..4d94f96f4a2 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -30,6 +30,12 @@
else
power_supply = new(src)
power_supply.give(power_supply.maxcharge)
+ update_ammo_types()
+ if(selfcharge)
+ processing_objects.Add(src)
+ update_icon()
+
+/obj/item/weapon/gun/energy/proc/update_ammo_types()
var/obj/item/ammo_casing/energy/shot
for(var/i = 1, i <= ammo_type.len, i++)
var/shottype = ammo_type[i]
@@ -38,9 +44,6 @@
shot = ammo_type[select]
fire_sound = shot.fire_sound
fire_delay = shot.delay
- if(selfcharge)
- processing_objects.Add(src)
- update_icon()
/obj/item/weapon/gun/energy/Destroy()
if(selfcharge)
@@ -129,9 +132,9 @@
overlays += image(icon = icon, icon_state = iconState, pixel_x = ammo_x_offset * (i -1))
else
overlays += image(icon = icon, icon_state = "[icon_state]_[modifystate ? "[shot.select_name]_" : ""]charge[ratio]")
- if(F && can_flashlight)
+ if(gun_light && can_flashlight)
var/iconF = "flight"
- if(F.on)
+ if(gun_light.on)
iconF = "flight_on"
overlays += image(icon = icon, icon_state = iconF, pixel_x = flight_x_offset, pixel_y = flight_y_offset)
if(itemState)
diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
index af1f6593982..326df69b73b 100644
--- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
+++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
@@ -1,6 +1,6 @@
/obj/item/weapon/gun/energy/kinetic_accelerator
name = "proto-kinetic accelerator"
- desc = "A self recharging, "
+ desc = "A self recharging, ranged mining tool that does increased damage in low pressure. Capable of holding up to six slots worth of mod kits."
icon_state = "kineticgun"
item_state = "kineticgun"
ammo_type = list(/obj/item/ammo_casing/energy/kinetic)
@@ -17,44 +17,55 @@
var/unique_frequency = FALSE // modified by KA modkits
var/overheat = FALSE
- var/list/max_mod_capacity = 2
+ var/max_mod_capacity = 100
var/list/modkits = list()
+ var/empty_state = "kineticgun_empty"
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/examine(mob/user)
+ ..()
+ if(max_mod_capacity)
+ to_chat(user, "[get_remaining_mod_capacity()]% mod capacity remaining.")
+ for(var/A in get_modkits())
+ var/obj/item/borg/upgrade/modkit/M = A
+ to_chat(user, "There is a [M.name] mod installed, using [M.cost]% capacity.")
/obj/item/weapon/gun/energy/kinetic_accelerator/attackby(obj/item/A, mob/user)
if(istype(A, /obj/item/weapon/crowbar))
if(modkits.len)
- user << "You pry the modifications out."
- for(var/obj/item/modkit/M in modkits)
- M.forceMove(get_turf(user))
+ to_chat(user, "You pry the modifications out.")
+ playsound(loc, 'sound/items/Crowbar.ogg', 100, 1)
+ for(var/obj/item/borg/upgrade/modkit/M in modkits)
+ M.uninstall(src)
else
- user << "There are no modifications currently installed."
- else if(istype(A, /obj/item/modkit))
- var/obj/item/modkit/MK = A
- var/current_mod_capacity = 0
- for(var/obj/item/modkit/M in modkits)
- current_mod_capacity += M.cost
- if((current_mod_capacity + MK.cost) > max_mod_capacity)
- user << "You don't have room to install this modkit. Use a crowbar to remove existing modkits."
- return
- else
- user << "You install the modkit."
- MK.install(src)
+ to_chat(user, "There are no modifications currently installed.")
+ else if(istype(A, /obj/item/borg/upgrade/modkit))
+ var/obj/item/borg/upgrade/modkit/MK = A
+ MK.install(src, user)
else
..()
+/obj/item/weapon/gun/energy/kinetic_accelerator/proc/get_remaining_mod_capacity()
+ var/current_capacity_used = 0
+ for(var/A in get_modkits())
+ var/obj/item/borg/upgrade/modkit/M = A
+ current_capacity_used += M.cost
+ return max_mod_capacity - current_capacity_used
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/proc/get_modkits()
+ . = list()
+ for(var/A in modkits)
+ . += A
/obj/item/weapon/gun/energy/kinetic_accelerator/proc/modify_projectile(obj/item/projectile/kinetic/K)
- for(var/obj/item/modkit/M in src)
+ for(var/A in get_modkits())
+ var/obj/item/borg/upgrade/modkit/M = A
M.modify_projectile(K)
/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg
holds_charge = TRUE
unique_frequency = TRUE
-
-/obj/item/weapon/gun/energy/kinetic_accelerator/hyper/cyborg
- holds_charge = TRUE
- unique_frequency = TRUE
+ max_mod_capacity = 80
/obj/item/weapon/gun/energy/kinetic_accelerator/New()
. = ..()
@@ -75,9 +86,12 @@
if(!holds_charge)
// Put it on a delay because moving item from slot to hand
// calls dropped().
- sleep(1)
- if(!ismob(loc))
- empty()
+ spawn(2)
+ empty_if_not_held()
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/proc/empty_if_not_held()
+ if(!ismob(loc))
+ empty()
/obj/item/weapon/gun/energy/kinetic_accelerator/proc/empty()
power_supply.use(500)
@@ -99,7 +113,8 @@
else
carried = 1
- addtimer(src, "reload", overheat_time * carried)
+ spawn(overheat_time * carried)
+ reload()
/obj/item/weapon/gun/energy/kinetic_accelerator/emp_act(severity)
return
@@ -107,35 +122,25 @@
/obj/item/weapon/gun/energy/kinetic_accelerator/proc/reload()
power_supply.give(500)
if(!suppressed)
- playsound(src.loc, 'sound/weapons/kenetic_reload.ogg', 60, 1)
+ playsound(loc, 'sound/weapons/kenetic_reload.ogg', 60, 1)
else
- loc << "[src] silently charges up."
+ to_chat(loc, "[src] silently charges up.")
update_icon()
overheat = FALSE
/obj/item/weapon/gun/energy/kinetic_accelerator/update_icon()
- cut_overlays()
- if(!can_shoot())
- add_overlay("kineticgun_empty")
+ overlays.Cut()
+ if(empty_state && !can_shoot())
+ overlays += empty_state
- if(F && can_flashlight)
+ if(gun_light && can_flashlight)
var/iconF = "flight"
- if(F.on)
+ if(gun_light.on)
iconF = "flight_on"
- add_overlay(image(icon = icon, icon_state = iconF, pixel_x = flight_x_offset, pixel_y = flight_y_offset))
-
-
-
-
-
-
-
-
+ overlays += image(icon = icon, icon_state = iconF, pixel_x = flight_x_offset, pixel_y = flight_y_offset)
//Casing
-
-
/obj/item/ammo_casing/energy/kinetic
projectile_type = /obj/item/projectile/kinetic
select_name = "kinetic"
@@ -148,87 +153,262 @@
var/obj/item/weapon/gun/energy/kinetic_accelerator/KA = loc
KA.modify_projectile(BB)
-/obj/item/ammo_casing/energy/kinetic/hyper
- projectile_type = /obj/item/projectile/kinetic/hyper
-
+ var/turf/proj_turf = get_turf(BB)
+ if(!isturf(proj_turf))
+ return
+ var/datum/gas_mixture/environment = proj_turf.return_air()
+ var/pressure = environment.return_pressure()
+ if(pressure > 50)
+ BB.name = "weakened [BB.name]"
+ var/obj/item/projectile/kinetic/K = BB
+ K.damage *= K.pressure_decrease
//Projectiles
-
/obj/item/projectile/kinetic
name = "kinetic force"
icon_state = null
- damage = 10
+ damage = 40
damage_type = BRUTE
flag = "bomb"
range = 3
- var/damage_multiplier = 4
+ log_override = TRUE
-/obj/item/projectile/kinetic/super
- damage = 11
- range = 4
-
-/obj/item/projectile/kinetic/New()
- var/turf/proj_turf = get_turf(src)
- if(!istype(proj_turf, /turf))
- return
- var/datum/gas_mixture/environment = proj_turf.return_air()
- var/pressure = environment.return_pressure()
- if(pressure < 50)
- name = "full strength [name]"
- damage *= damage_multiplier
- ..()
+ var/pressure_decrease = 0.25
+ var/turf_aoe = FALSE
+ var/mob_aoe = 0
+ var/list/hit_overlays = list()
/obj/item/projectile/kinetic/on_range()
- PoolOrNew(/obj/effect/overlay/temp/kinetic_blast, loc)
+ strike_thing()
..()
/obj/item/projectile/kinetic/on_hit(atom/target)
- var/turf/target_turf= get_turf(target)
- if(istype(target_turf, /turf/closed/mineral))
- var/turf/closed/mineral/M = target_turf
- M.gets_drilled(firer)
- PoolOrNew(/obj/effect/overlay/temp/kinetic_blast, target_turf)
+ strike_thing(target)
. = ..()
-
-//AoE
-
-/obj/item/projectile/kinetic/hyper
- name = "kinetic explosion"
- damage = 10
- range = 3
-
-/obj/item/projectile/kinetic/hyper/proc/aoe_blast(atom/target)
+/obj/item/projectile/kinetic/proc/strike_thing(atom/target)
var/turf/target_turf = get_turf(target)
if(!target_turf)
target_turf = get_turf(src)
- PoolOrNew(/obj/effect/overlay/temp/explosion/fast, target_turf)
- for(var/T in RANGE_TURFS(1, target_turf) - target_turf)
- if(istype(T, /turf/closed/mineral))
- var/turf/closed/mineral/M = T
- M.gets_drilled(firer)
+ if(ismineralturf(target_turf))
+ var/turf/simulated/mineral/M = target_turf
+ M.gets_drilled(firer)
+ var/obj/effect/overlay/temp/kinetic_blast/K = new /obj/effect/overlay/temp/kinetic_blast(target_turf)
+ K.color = color
+ for(var/type in hit_overlays)
+ new type(target_turf)
+ if(turf_aoe)
+ for(var/T in RANGE_TURFS(1, target_turf) - target_turf)
+ if(ismineralturf(T))
+ var/turf/simulated/mineral/M = T
+ M.gets_drilled(firer)
+ if(mob_aoe)
+ for(var/mob/living/L in range(1, target_turf) - firer - target)
+ var/armor = L.run_armor_check(def_zone, flag, "", "", armour_penetration)
+ L.apply_damage(damage*mob_aoe, damage_type, def_zone, armor)
+ to_chat(L, "You're struck by a [name]!")
-/obj/item/projectile/kinetic/hyper/on_range()
- aoe_blast()
- ..()
-
-/obj/item/projectile/kinetic/hyper/on_hit(atom/target)
- aoe_blast(target)
- . = ..()
//Modkits
-
-/obj/item/modkit
+/obj/item/borg/upgrade/modkit
name = "modification kit"
- desc = "An upgrade for kinetic accelerators.."
+ desc = "An upgrade for kinetic accelerators."
icon = 'icons/obj/objects.dmi'
icon_state = "modkit"
origin_tech = "programming=2;materials=2;magnets=4"
- var/cost = 2
+ require_module = 1
+ module_type = /obj/item/weapon/robot_module/miner
+ var/denied_type = null
+ var/maximum_of_type = 1
+ var/cost = 30
+ var/modifier = 1 //For use in any mod kit that has numerical modifiers
-/obj/item/modkit/proc/install(obj/item/weapon/gun/energy/kinetic_accelerator/KA)
- return
+/obj/item/borg/upgrade/modkit/examine(mob/user)
+ ..()
+ to_chat(user, "Occupies [cost]% of mod capacity.")
-/obj/item/modkit/proc/modify_projectile(/obj/item/projectile/kinetic/K)
- return
\ No newline at end of file
+/obj/item/borg/upgrade/modkit/attackby(obj/item/A, mob/user)
+ if(istype(A, /obj/item/weapon/gun/energy/kinetic_accelerator) && !issilicon(user))
+ install(A, user)
+ else
+ ..()
+
+/obj/item/borg/upgrade/modkit/action(mob/living/silicon/robot/R)
+ if(..())
+ return
+
+ for(var/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg/H in R.module.modules)
+ return install(H, usr)
+
+/obj/item/borg/upgrade/modkit/proc/install(obj/item/weapon/gun/energy/kinetic_accelerator/KA, mob/user)
+ . = TRUE
+ if(denied_type)
+ var/number_of_denied = 0
+ for(var/A in KA.get_modkits())
+ var/obj/item/borg/upgrade/modkit/M = A
+ if(istype(M, denied_type))
+ number_of_denied++
+ if(number_of_denied >= maximum_of_type)
+ . = FALSE
+ break
+ if(KA.get_remaining_mod_capacity() >= cost)
+ if(.)
+ to_chat(user, "You install the modkit.")
+ playsound(loc, 'sound/items/Screwdriver.ogg', 100, 1)
+ user.unEquip(src)
+ forceMove(KA)
+ KA.modkits += src
+ else
+ to_chat(user, "The modkit you're trying to install would conflict with an already installed modkit. Use a crowbar to remove existing modkits.")
+ else
+ to_chat(user, "You don't have room([KA.get_remaining_mod_capacity()]% remaining, [cost]% needed) to install this modkit. Use a crowbar to remove existing modkits.")
+ . = FALSE
+
+
+
+/obj/item/borg/upgrade/modkit/proc/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA)
+ forceMove(get_turf(KA))
+ KA.modkits -= src
+
+/obj/item/borg/upgrade/modkit/proc/modify_projectile(obj/item/projectile/kinetic/K)
+
+
+//Range
+/obj/item/borg/upgrade/modkit/range
+ name = "range increase"
+ desc = "Increases the range of a kinetic accelerator when installed."
+ modifier = 1
+ cost = 24 //so you can fit four plus a tracer cosmetic
+
+/obj/item/borg/upgrade/modkit/range/modify_projectile(obj/item/projectile/kinetic/K)
+ K.range += modifier
+
+
+//Damage
+/obj/item/borg/upgrade/modkit/damage
+ name = "damage increase"
+ desc = "Increases the damage of kinetic accelerator when installed."
+ modifier = 10
+
+/obj/item/borg/upgrade/modkit/damage/modify_projectile(obj/item/projectile/kinetic/K)
+ K.damage += modifier
+
+
+//Cooldown
+/obj/item/borg/upgrade/modkit/cooldown
+ name = "cooldown decrease"
+ desc = "Decreases the cooldown of a kinetic accelerator."
+ modifier = 2.5
+
+/obj/item/borg/upgrade/modkit/cooldown/install(obj/item/weapon/gun/energy/kinetic_accelerator/KA, mob/user)
+ . = ..()
+ if(.)
+ KA.overheat_time -= modifier
+
+/obj/item/borg/upgrade/modkit/cooldown/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA)
+ KA.overheat_time += modifier
+ ..()
+
+
+//AoE blasts
+/obj/item/borg/upgrade/modkit/aoe
+ modifier = 0
+
+/obj/item/borg/upgrade/modkit/aoe/modify_projectile(obj/item/projectile/kinetic/K)
+ K.name = "kinetic explosion"
+ if(!K.turf_aoe && !K.mob_aoe)
+ K.hit_overlays += /obj/effect/overlay/temp/explosion/fast
+ K.mob_aoe += modifier
+
+/obj/item/borg/upgrade/modkit/aoe/turfs
+ name = "mining explosion"
+ desc = "Causes the kinetic accelerator to destroy rock in an AoE."
+ denied_type = /obj/item/borg/upgrade/modkit/aoe/turfs
+
+/obj/item/borg/upgrade/modkit/aoe/turfs/modify_projectile(obj/item/projectile/kinetic/K)
+ ..()
+ K.turf_aoe = TRUE
+
+/obj/item/borg/upgrade/modkit/aoe/turfs/andmobs
+ name = "offensive mining explosion"
+ desc = "Causes the kinetic accelerator to destroy rock and damage mobs in an AoE."
+ maximum_of_type = 3
+ modifier = 0.25
+
+/obj/item/borg/upgrade/modkit/aoe/mobs
+ name = "offensive explosion"
+ desc = "Causes the kinetic accelerator to damage mobs in an AoE."
+ modifier = 0.2
+
+
+//Indoors
+/obj/item/borg/upgrade/modkit/indoors
+ name = "decrease pressure penalty"
+ desc = "Increases the damage a kinetic accelerator does in a high pressure environment."
+ modifier = 2
+ denied_type = /obj/item/borg/upgrade/modkit/indoors
+ maximum_of_type = 2
+ cost = 40
+
+/obj/item/borg/upgrade/modkit/indoors/modify_projectile(obj/item/projectile/kinetic/K)
+ K.pressure_decrease *= modifier
+
+
+//Trigger Guard
+/obj/item/borg/upgrade/modkit/trigger_guard
+ name = "modified trigger guard"
+ desc = "Allows creatures normally incapable of firing guns to operate the weapon when installed."
+ cost = 20
+ denied_type = /obj/item/borg/upgrade/modkit/trigger_guard
+
+/obj/item/borg/upgrade/modkit/trigger_guard/install(obj/item/weapon/gun/energy/kinetic_accelerator/KA, mob/user)
+ . = ..()
+ if(.)
+ KA.trigger_guard = TRIGGER_GUARD_ALLOW_ALL
+
+/obj/item/borg/upgrade/modkit/trigger_guard/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA)
+ KA.trigger_guard = TRIGGER_GUARD_NORMAL
+ ..()
+
+
+//Cosmetic
+
+/obj/item/borg/upgrade/modkit/chassis_mod
+ name = "super chassis"
+ desc = "Makes your KA yellow. All the fun of having a more powerful KA without actually having a more powerful KA."
+ cost = 10
+ denied_type = /obj/item/borg/upgrade/modkit/chassis_mod
+ var/chassis_icon = "kineticgun_u"
+
+/obj/item/borg/upgrade/modkit/chassis_mod/install(obj/item/weapon/gun/energy/kinetic_accelerator/KA, mob/user)
+ . = ..()
+ if(.)
+ KA.icon_state = chassis_icon
+
+/obj/item/borg/upgrade/modkit/chassis_mod/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA)
+ KA.icon_state = initial(KA.icon_state)
+ ..()
+
+/obj/item/borg/upgrade/modkit/chassis_mod/orange
+ name = "hyper chassis"
+ desc = "Makes your KA orange. All the fun of having explosive blasts without actually having explosive blasts."
+ chassis_icon = "kineticgun_h"
+
+/obj/item/borg/upgrade/modkit/tracer
+ name = "white tracer bolts"
+ desc = "Causes kinetic accelerator bolts to have a white tracer trail and explosion."
+ cost = 4
+ denied_type = /obj/item/borg/upgrade/modkit/tracer
+ var/bolt_color = "#FFFFFF"
+
+/obj/item/borg/upgrade/modkit/tracer/modify_projectile(obj/item/projectile/kinetic/K)
+ K.icon_state = "ka_tracer"
+ K.color = bolt_color
+
+/obj/item/borg/upgrade/modkit/tracer/adjustable
+ name = "adjustable tracer bolts"
+ desc = "Causes kinetic accelerator bolts to have a adjustably-colored tracer trail and explosion. Use in-hand to change color."
+
+/obj/item/borg/upgrade/modkit/tracer/adjustable/attack_self(mob/user)
+ bolt_color = input(user,"Choose Color") as color
diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm
index 8d920a7e736..ef184bd8d5b 100644
--- a/code/modules/projectiles/guns/energy/nuclear.dm
+++ b/code/modules/projectiles/guns/energy/nuclear.dm
@@ -37,14 +37,14 @@
can_flashlight = 0 // Can't attach or detach the flashlight, and override it's icon update
/obj/item/weapon/gun/energy/gun/mini/New()
- F = new /obj/item/device/flashlight/seclite(src)
+ gun_light = new /obj/item/device/flashlight/seclite(src)
..()
power_supply.maxcharge = 6000
power_supply.charge = 6000
/obj/item/weapon/gun/energy/gun/mini/update_icon()
..()
- if(F && F.on)
+ if(gun_light && gun_light.on)
overlays += "mini-light"
/obj/item/weapon/gun/energy/gun/hos
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index 5818a0ee7a2..12eb34e8c54 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -99,6 +99,9 @@
overheat_time = 20
holds_charge = TRUE
unique_frequency = TRUE
+ can_flashlight = 0
+ max_mod_capacity = 0
+ empty_state = null
/obj/item/weapon/gun/energy/kinetic_accelerator/crossbow/ninja
name = "energy dart thrower"
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 7b0bcda17d0..4a3afd18684 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -52,7 +52,7 @@
var/forcedodge = 0 //to pass through everything
var/dismemberment = 0 //The higher the number, the greater the bonus to dismembering. 0 will not dismember at all.
- var/log = 1 //whether print to admin attack logs or just keep it in the diary
+ var/log_override = FALSE //whether print to admin attack logs or just keep it in the diary
/obj/item/projectile/New()
permutated = list()
@@ -90,7 +90,8 @@
for(var/datum/reagent/R in reagents.reagent_list)
reagent_note += R.id + " ("
reagent_note += num2text(R.volume) + ") "
- add_logs(firer, L, "shot", src, reagent_note, print_attack_log = log)
+ if(!log_override && firer && original)
+ add_logs(firer, L, "shot", src, reagent_note)
return L.apply_effects(stun, weaken, paralyze, irradiate, slur, stutter, eyeblur, drowsy, blocked, stamina, jitter)
/obj/item/projectile/proc/vol_by_damage()
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index 872ee7c3f26..6cddc1c1b91 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -20,7 +20,7 @@
name = "practice laser"
damage = 0
nodamage = 1
- log = 0
+ log_override = TRUE
/obj/item/projectile/beam/scatter
name = "laser pellet"
@@ -75,7 +75,7 @@
damage_type = STAMINA
flag = "laser"
var/suit_types = list(/obj/item/clothing/suit/redtag, /obj/item/clothing/suit/bluetag)
- log = 0
+ log_override = TRUE
/obj/item/projectile/beam/lasertag/on_hit(atom/target, blocked = 0)
. = ..()
diff --git a/code/modules/projectiles/projectile/reusable.dm b/code/modules/projectiles/projectile/reusable.dm
index 17aaad71a2a..cb0ee34ad75 100644
--- a/code/modules/projectiles/projectile/reusable.dm
+++ b/code/modules/projectiles/projectile/reusable.dm
@@ -37,7 +37,7 @@
var/obj/item/weapon/pen/pen = null
edge = 0
embed = 0
- log = 0//it won't log even when there's a pen inside, but since the damage will be so low, I don't think there's any point in making it any more complex
+ log_override = TRUE//it won't log even when there's a pen inside, but since the damage will be so low, I don't think there's any point in making it any more complex
/obj/item/projectile/bullet/reusable/foam_dart/handle_drop()
if(dropped)
@@ -65,4 +65,4 @@
icon_state = "foamdart_riot"
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
stamina = 25
- log = 1
+ log_override = FALSE
diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm
index 702afa68f2f..ff5708576cf 100644
--- a/code/modules/research/designs/mechfabricator_designs.dm
+++ b/code/modules/research/designs/mechfabricator_designs.dm
@@ -1038,16 +1038,6 @@
construction_time = 120
category = list("Cyborg Upgrade Modules")
-/datum/design/borg_upgrade_hyperka
- name = "Cyborg Upgrade (Hyper-Kinetic Accelerator)"
- id = "borg_upgrade_hyperka"
- req_tech = list("materials" = 7, "powerstorage" = 5, "engineering" = 5, "magnets" = 5, "combat" = 4)
- build_type = MECHFAB //Reqs same as human Hyper KA
- materials = list(MAT_METAL = 8000, MAT_GLASS = 1500, MAT_SILVER = 2000, MAT_GOLD = 2000, MAT_DIAMOND = 2000)
- build_path = /obj/item/borg/upgrade/hyperka
- construction_time = 120
- category = list("Cyborg Upgrade Modules")
-
/datum/design/borg_syndicate_module
name = "Cyborg Upgrade (Illegal Modules)"
id = "borg_syndicate_module"
diff --git a/code/modules/research/designs/mining_designs.dm b/code/modules/research/designs/mining_designs.dm
index 0ee8c58aa7e..aa3014e2825 100644
--- a/code/modules/research/designs/mining_designs.dm
+++ b/code/modules/research/designs/mining_designs.dm
@@ -72,4 +72,64 @@
build_type = PROTOLATHE
materials = list(MAT_METAL = 4000, MAT_GLASS = 1500, MAT_SILVER = 2000, MAT_URANIUM = 2000)
build_path = /obj/item/weapon/resonator/upgraded
- category = list("Mining")
\ No newline at end of file
+ category = list("Mining")
+
+/datum/design/trigger_guard_mod
+ name = "Kinetic Accelerator Trigger Guard Mod"
+ desc = "A device which allows kinetic accelerators to be wielded by any organism."
+ id = "triggermod"
+ req_tech = list("materials" = 5, "powerstorage" = 4, "engineering" = 4, "magnets" = 4, "combat" = 3)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 2000, MAT_GLASS = 1500, MAT_GOLD = 1500, MAT_URANIUM = 1000)
+ build_path = /obj/item/borg/upgrade/modkit/trigger_guard
+ category = list("Mining")
+
+/datum/design/damage_mod
+ name = "Kinetic Accelerator Damage Mod"
+ desc = "A device which allows kinetic accelerators to deal more damage."
+ id = "damagemod"
+ req_tech = list("materials" = 5, "powerstorage" = 4, "engineering" = 4, "magnets" = 4, "combat" = 3)
+ build_type = PROTOLATHE | MECHFAB
+ materials = list(MAT_METAL = 2000, MAT_GLASS = 1500, MAT_GOLD = 1500, MAT_URANIUM = 1000)
+ build_path = /obj/item/borg/upgrade/modkit/damage
+ category = list("Mining", "Cyborg Upgrade Modules")
+
+/datum/design/cooldown_mod
+ name = "Kinetic Accelerator Cooldown Mod"
+ desc = "A device which decreases the cooldown of a Kinetic Accelerator."
+ id = "cooldownmod"
+ req_tech = list("materials" = 5, "powerstorage" = 4, "engineering" = 4, "magnets" = 4, "combat" = 3)
+ build_type = PROTOLATHE | MECHFAB
+ materials = list(MAT_METAL = 2000, MAT_GLASS = 1500, MAT_GOLD = 1500, MAT_URANIUM = 1000)
+ build_path = /obj/item/borg/upgrade/modkit/cooldown
+ category = list("Mining", "Cyborg Upgrade Modules")
+
+/datum/design/range_mod
+ name = "Kinetic Accelerator Range Mod"
+ desc = "A device which allows kinetic accelerators to fire at a further range."
+ id = "rangemod"
+ req_tech = list("materials" = 5, "powerstorage" = 4, "engineering" = 4, "magnets" = 4, "combat" = 3)
+ build_type = PROTOLATHE | MECHFAB
+ materials = list(MAT_METAL = 2000, MAT_GLASS = 1500, MAT_GOLD = 1500, MAT_URANIUM = 1000)
+ build_path = /obj/item/borg/upgrade/modkit/range
+ category = list("Mining", "Cyborg Upgrade Modules")
+
+/datum/design/superaccelerator
+ name = "Kinetic Accelerator Pressure Mod"
+ desc = "A modification kit which allows Kinetic Accelerators to do more damage while indoors."
+ id = "indoormod"
+ req_tech = list("materials" = 5, "powerstorage" = 4, "engineering" = 4, "magnets" = 4, "combat" = 3)
+ build_type = PROTOLATHE | MECHFAB
+ materials = list(MAT_METAL = 2000, MAT_GLASS = 1500, MAT_SILVER = 2000, MAT_URANIUM = 2000)
+ build_path = /obj/item/borg/upgrade/modkit/indoors
+ category = list("Mining", "Cyborg Upgrade Modules")
+
+/datum/design/hyperaccelerator
+ name = "Kinetic Accelerator Mining AoE Mod"
+ desc = "A modification kit for Kinetic Accelerators which causes it to fire AoE blasts that destroy rock."
+ id = "hypermod"
+ req_tech = list("materials" = 7, "powerstorage" = 5, "engineering" = 5, "magnets" = 5, "combat" = 4)
+ build_type = PROTOLATHE | MECHFAB
+ materials = list(MAT_METAL = 8000, MAT_GLASS = 1500, MAT_SILVER = 2000, MAT_GOLD = 2000, MAT_DIAMOND = 2000)
+ build_path = /obj/item/borg/upgrade/modkit/aoe/turfs
+ category = list("Mining", "Cyborg Upgrade Modules")
\ No newline at end of file
diff --git a/icons/effects/96x96.dmi b/icons/effects/96x96.dmi
index 01729aa70af..9111297a266 100644
Binary files a/icons/effects/96x96.dmi and b/icons/effects/96x96.dmi differ
diff --git a/icons/effects/beam.dmi b/icons/effects/beam.dmi
index b20f8abf0b8..67da41362f8 100644
Binary files a/icons/effects/beam.dmi and b/icons/effects/beam.dmi differ
diff --git a/icons/obj/guns/magic.dmi b/icons/obj/guns/magic.dmi
index 05c8aa7794f..b057d644918 100644
Binary files a/icons/obj/guns/magic.dmi and b/icons/obj/guns/magic.dmi differ
diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi
index b0a35a3f35b..06afc67979c 100644
Binary files a/icons/obj/lighting.dmi and b/icons/obj/lighting.dmi differ
diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi
index ea68e3dbdbd..6fbc869583c 100644
Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ
diff --git a/paradise.dme b/paradise.dme
index 48fd64e1c6b..dba17381e54 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -29,8 +29,10 @@
#include "code\__DEFINES\genetics.dm"
#include "code\__DEFINES\hud.dm"
#include "code\__DEFINES\hydroponics.dm"
+#include "code\__DEFINES\inventory.dm"
#include "code\__DEFINES\is_helpers.dm"
#include "code\__DEFINES\language.dm"
+#include "code\__DEFINES\layers.dm"
#include "code\__DEFINES\lighting.dm"
#include "code\__DEFINES\machines.dm"
#include "code\__DEFINES\math.dm"
@@ -1862,6 +1864,7 @@
#include "code\modules\projectiles\guns\rocket.dm"
#include "code\modules\projectiles\guns\syringe_gun.dm"
#include "code\modules\projectiles\guns\throw.dm"
+#include "code\modules\projectiles\guns\energy\kinetic_accelerator.dm"
#include "code\modules\projectiles\guns\energy\laser.dm"
#include "code\modules\projectiles\guns\energy\nuclear.dm"
#include "code\modules\projectiles\guns\energy\pulse.dm"