diff --git a/aurora.dme b/aurora.dme
index c1df4764..d823f29d 100644
--- a/aurora.dme
+++ b/aurora.dme
@@ -1275,6 +1275,7 @@
#include "code\modules\projectiles\guns\projectile\bow.dm"
#include "code\modules\projectiles\guns\projectile\pistol.dm"
#include "code\modules\projectiles\guns\projectile\pneumatic.dm"
+#include "code\modules\projectiles\guns\projectile\reloadlaser.dm"
#include "code\modules\projectiles\guns\projectile\revolver.dm"
#include "code\modules\projectiles\guns\projectile\rocket.dm"
#include "code\modules\projectiles\guns\projectile\shotgun.dm"
diff --git a/code/modules/projectiles/guns/energy/erifles.dm b/code/modules/projectiles/guns/energy/erifles.dm
index 96eadadf..4d12c857 100644
--- a/code/modules/projectiles/guns/energy/erifles.dm
+++ b/code/modules/projectiles/guns/energy/erifles.dm
@@ -52,7 +52,7 @@
///////////LASER RIFLE//////////////
/obj/item/weapon/gun/energy/rifle/laser
name = "laser rifle"
- desc = "a basic weapon designed kill with concentrated energy bolts"
+ desc = "a basic weapon designed to kill with concentrated energy bolts"
icon_state = "laser"
item_state = "laser"
fire_sound = 'sound/weapons/Laser.ogg'
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index a9b5b86c..e912275a 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -1,6 +1,6 @@
/obj/item/weapon/gun/energy/laser
name = "laser rifle"
- desc = "a basic weapon designed kill with concentrated energy bolts"
+ desc = "a basic weapon designed to kill with concentrated energy bolts"
icon_state = "laser"
item_state = "laser"
fire_sound = 'sound/weapons/Laser.ogg'
diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm
index 2ce69211..7172382e 100644
--- a/code/modules/projectiles/guns/projectile.dm
+++ b/code/modules/projectiles/guns/projectile.dm
@@ -38,12 +38,14 @@
loaded -= AC //Remove casing from loaded list.
if(isnull(AC) || !istype(AC))
return 0
- AC.loc = get_turf(src) //Eject casing onto ground.
+ if(ejectshell == 1)
+ AC.loc = get_turf(src) //Eject casing onto ground. If 0, casings stay in the gun. Totally a good idea trust me okay.
if(AC.BB)
AC.desc += " This one is spent." //descriptions are magic - only when there's a projectile in the casing
in_chamber = AC.BB //Load projectile into chamber.
AC.BB.loc = src //Set projectile loc to gun.
return 1
+
return 0
diff --git a/code/modules/projectiles/guns/projectile/reloadlaser.dm b/code/modules/projectiles/guns/projectile/reloadlaser.dm
new file mode 100644
index 00000000..39da20cd
--- /dev/null
+++ b/code/modules/projectiles/guns/projectile/reloadlaser.dm
@@ -0,0 +1,179 @@
+/obj/item/weapon/gun/projectile/laser //butts
+ desc = "a basic weapon designed to kill with concentrated energy bolts."
+ name = "laser rifle"
+ caliber = "laser"
+ w_class = 3.0
+ recoil = 0
+ ammo_type = "/obj/item/ammo_casing/laser"
+ max_shells = 100
+ load_method = 2 //0 = Single shells or quick loader, 1 = box, 2 = magazine
+ fire_delay = 6
+ ejectshell = 0
+ slot_flags = SLOT_BACK
+ var/modded = 0
+ var/obj/item/weapon/reloadlasermodkit/mod
+
+ //placeholders//
+ icon_state = "laser"
+ item_state = "laser"
+ fire_sound = 'sound/weapons/Laser.ogg'
+ //placeholders// Well, okay, not the sound.
+
+ New()
+ for(var/i = 1, i <= 30, i++)
+ loaded += new ammo_type(src)
+ update_icon()
+
+ empty_mag = new /obj/item/ammo_magazine/laser/empty(src)
+ update_icon()
+ return
+
+
+
+
+/obj/item/ammo_magazine/laser/empty
+ max_ammo = 0
+
+/obj/item/ammo_magazine/laser
+ name = "charge cell (laser)"
+ desc = "A standard 30-shot cell."
+ icon_state = "12mm"
+ origin_tech = "combat=2"
+ ammo_type = "/obj/item/ammo_casing/laser"
+ max_ammo = 30
+// multiple_sprites = 1
+
+/obj/item/ammo_magazine/laser/pulse
+ name = "charge cell (pulse)"
+ desc = "A heavy-duty 15-shot pulse cell."
+ ammo_type = "/obj/item/ammo_casing/laser/pulse"
+ max_ammo = 15
+
+/obj/item/ammo_magazine/laser/heavy
+ name = "charge cell (heavy)"
+ desc = "A 15-shot cell designed to overload your projectiles with an extremely heavy charge."
+ ammo_type = "/obj/item/ammo_casing/laser/heavy"
+ max_ammo = 15
+
+/obj/item/ammo_magazine/laser/practice
+ name = "charge cell (practice)"
+ desc = "A hundred-shot cell keyed in to a harmless wavelength for practice shooting."
+ ammo_type = "/obj/item/ammo_casing/laser/practice"
+ max_ammo = 100
+
+/obj/item/ammo_magazine/laser/light
+ name = "charge cell (light)"
+ desc = "A 60-shot cell designed with capacity in mind. The lasers are weaker, though."
+ ammo_type = "/obj/item/ammo_casing/laser/light"
+ max_ammo = 60
+
+/obj/item/ammo_magazine/laser/stun
+ name = "charge cell (stun)"
+ desc = "A 20-shot cell that fires lethal incapacitating bolts. Not standard issue."
+ ammo_type = "/obj/item/ammo_casing/laser/stun"
+ max_ammo = 20
+
+////////////////////////////
+//Shells for the magazines//
+////////////////////////////
+
+//don't spawn these you butts//
+
+/obj/item/ammo_casing/laser
+ desc = "A LASER SHELL. You shouldn't be seeing this."
+ caliber = "laser"
+ projectile_type = "/obj/item/projectile/beam"
+
+/obj/item/ammo_casing/laser/pulse
+ desc = "A PULSE SHELL. You shouldn't be seeing this."
+ caliber = "laser"
+ projectile_type = "/obj/item/projectile/beam/pulse"
+
+/obj/item/ammo_casing/laser/heavy
+ desc = "A LASER CANNON SHELL. You shouldn't be seeing this."
+ caliber = "laser"
+ projectile_type = "/obj/item/projectile/beam/heavylaser"
+
+/obj/item/ammo_casing/laser/practice
+ desc = "A PRACTICE BLANK FAKE LASER SHELL. You shouldn't be seeing this."
+ caliber = "laser"
+ projectile_type = "/obj/item/projectile/beam/practice"
+
+/obj/item/ammo_casing/laser/light
+ desc = "A LIGHT LASER XRAY SHELL. You shouldn't be seeing this."
+ caliber = "laser"
+ projectile_type = "/obj/item/projectile/beam/xray/burst"
+
+/obj/item/ammo_casing/laser/stun
+ desc = "A STUN LASER SHELL. You shouldn't be seeing this."
+ caliber = "laser"
+ projectile_type = "/obj/item/projectile/beam/stun"
+
+
+////////////////////////////////
+//////////////mods//////////////
+////////////////////////////////
+
+/obj/item/weapon/reloadlasermodkit
+ desc = "A cheap, disposable modkit designed to rapidly and permanently augment NT-standard laser rifles."
+ name = "rifle nanokit"
+ var/modtype = 0
+ var/uses = 1
+ var/emagged
+ icon = 'icons/obj/assemblies.dmi'
+ icon_state = "posibrain" //the placeholders are real
+
+/* Not sure about this yet.
+/obj/item/device/megaphone/attackby(obj/item/I, mob/user)
+ if(istype(I, /obj/item/weapon/card/emag) && !emagged)
+ user << "\red You sneakily unlock the highly illegal military-grade burstfire augment."
+ emagged = 1
+ return
+ return
+*/
+/obj/item/weapon/reloadlasermodkit/attack_self(var/mob/user as mob)
+
+ if (!emagged)
+ if (modtype == 0)
+ user << "Size modification selected."
+ modtype = 1
+ else if (modtype == 1)
+ user << "Rapid-fire modification selected."
+ modtype = 2
+ else if (modtype == 2)
+ user << "Silencer modification selected."
+ modtype = 0
+ else if (emagged) //We'll see. Burst is ridiculous, especially on a full-power laser.
+ user << "Burstfire modification selected."
+ modtype = 3
+
+/obj/item/weapon/gun/projectile/laser/attackby(obj/item/I as obj, mob/user as mob)
+ if(istype(I, /obj/item/weapon/reloadlasermodkit))
+ if(user.l_hand != src && user.r_hand != src) //if we're not in his hands
+ user << "You'll need [src] in your hands to do that."
+ return
+ if(src.modded == 1)
+ user << "The frame can only handle one mod."
+ return
+ user.drop_item()
+ user << "You activate the modkit and watch the nanites swarm over [src]."
+ I.loc = src.mod
+ src.mod = I
+ src.modded = 1
+ if (mod.modtype == 0)
+ user << "[src]'s firerate has been increased."
+ src.fire_delay = 4
+ else if (mod.modtype == 1)
+ user << "[src]'s shape changes rapidly, becoming smaller and more economical."
+ src.w_class = 3
+ else if (mod.modtype == 2)
+ user << "[src] sprouts wave-cancelling emitters. Its shots are now silenced."
+ src.silenced = 1
+ else if (mod.modtype == 3)
+ user << "[src] rapidly reshapes its firing mechanism. It now fires in bursts."
+ src.fire_delay = 0
+ src.projectiles_per_shot = 3
+ src.fire_cooldown = 1
+ fire_sound = 'sound/weapons/Gunshot_smg.ogg'
+ return
+ ..()
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index e57d13e6..439bce57 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -87,7 +87,7 @@
return 0// nope.avi
var/distance = get_dist(starting,loc)
- var/miss_modifier = -30
+ var/miss_modifier = -60
if (istype(shot_from,/obj/item/weapon/gun)) //If you aim at someone beforehead, it'll hit more often.
var/obj/item/weapon/gun/daddy = shot_from //Kinda balanced by fact you need like 2 seconds to aim
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index 236517f3..063cbc7b 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -99,12 +99,13 @@ var/list/beam_master = list()
name = "xray beam"
icon_state = "xray"
damage = 30
+// forcedodge = -1
/obj/item/projectile/beam/xray/burst
name = "xray beam"
icon_state = "xray"
// damage = 15 this makes rapidlasers kill almost exactly as fast as the rifle, but since they do a tripleburst, armor is much more effective. plus. rng miss.
- damage = 20 //hence 20 damage. slight advantage over regular lasers. half-capacity for damage. use for coolness. use laser cannons for powergame.
+ damage = 25 //hence 25 damage. slight advantage over regular lasers. half-capacity for damage. use for coolness. use laser cannons for powergame.
/obj/item/projectile/beam/pulse
name = "pulse"
@@ -122,10 +123,10 @@ var/list/beam_master = list()
icon_state = "emitter"
damage = 30
-/obj/item/projectile/beam/stunrevolver
+/obj/item/projectile/beam/stun
name = "stun beam"
icon_state = "stun"
- damage = 10
+ damage = 20
agony = 45
/obj/item/projectile/beam/lastertag/blue
diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm
index a9175887..d30d0217 100644
--- a/code/modules/projectiles/projectile/energy.dm
+++ b/code/modules/projectiles/projectile/energy.dm
@@ -88,3 +88,30 @@
*/
agony = 70
damage_type = HALLOSS
+
+
+/obj/item/projectile/energy/mining //not in the game. i'll play with it later probably.
+ name = "electrode"
+ icon_state = "spark"
+ damage = 5
+ kill_count = 3
+ var/life = 5
+
+ Bump(atom/A)
+ A.bullet_act(src, def_zone)
+ src.life -= 1
+ if(life <= 0)
+ del(src)
+ return
+
+/turf/simulated/mineral/bullet_act(var/obj/item/projectile/Proj)
+ if(istype(Proj ,/obj/item/projectile/energy/mining))
+ src.GetDrilled()
+ ..()
+ return 0
+
+/obj/structure/boulder/bullet_act(var/obj/item/projectile/Proj)
+ if(istype(Proj ,/obj/item/projectile/energy/mining))
+ del(src)
+ ..()
+ return 0
\ No newline at end of file
diff --git a/code/modules/vehicles/cargo_train.dm b/code/modules/vehicles/cargo_train.dm
index ea3f7b72..cc416aa3 100644
--- a/code/modules/vehicles/cargo_train.dm
+++ b/code/modules/vehicles/cargo_train.dm
@@ -53,7 +53,7 @@
update_stats()
if(load && is_train_head())
load << "The drive motor briefly whines, then drones to a stop."
-
+
if(is_train_head() && !on)
return 0
@@ -118,7 +118,7 @@
verbs -= /obj/vehicle/train/cargo/engine/verb/stop_engine
verbs -= /obj/vehicle/train/cargo/engine/verb/start_engine
-
+
if(on)
verbs += /obj/vehicle/train/cargo/engine/verb/stop_engine
else
@@ -129,7 +129,7 @@
verbs -= /obj/vehicle/train/cargo/engine/verb/stop_engine
verbs -= /obj/vehicle/train/cargo/engine/verb/start_engine
-
+
if(!on)
verbs += /obj/vehicle/train/cargo/engine/verb/start_engine
else
@@ -180,7 +180,7 @@
if(!istype(usr, /mob/living/carbon/human))
return
-
+
if(get_dist(usr,src) <= 1)
usr << "The power light is [on ? "on" : "off"].\nThere are[key ? "" : " no"] keys in the ignition."
usr << "The charge meter reads [cell? round(cell.percent(), 0.01) : 0]%"
@@ -192,7 +192,7 @@
if(!istype(usr, /mob/living/carbon/human))
return
-
+
if(on)
usr << "The engine is already running."
return
@@ -210,10 +210,10 @@
set name = "Stop engine"
set category = "Object"
set src in view(1)
-
+
if(!istype(usr, /mob/living/carbon/human))
return
-
+
if(!on)
usr << "The engine is already stopped."
return
@@ -229,10 +229,10 @@
if(!istype(usr, /mob/living/carbon/human))
return
-
+
if(!key || (load && load != usr))
return
-
+
if(on)
turn_off()
@@ -291,7 +291,7 @@
/obj/vehicle/train/cargo/trolley/update_car(var/train_length, var/active_engines)
src.train_length = train_length
src.active_engines = active_engines
-
+
if(!lead && !tow)
anchored = 0
if(verbs.Find(/atom/movable/verb/pull))
diff --git a/code/modules/vehicles/train.dm b/code/modules/vehicles/train.dm
index d8e372d8..c5ca6329 100644
--- a/code/modules/vehicles/train.dm
+++ b/code/modules/vehicles/train.dm
@@ -116,7 +116,7 @@
set desc = "Unhitches this train from the one in front of it."
set category = "Object"
set src in view(1)
-
+
if(!istype(usr, /mob/living/carbon/human))
return
@@ -139,11 +139,11 @@
if (lead)
user << "\red [src] is already hitched to something."
return
-
+
if (T.tow)
user << "\red [T] is already towing something."
return
-
+
//check for cycles.
var/obj/vehicle/train/next_car = T
while (next_car)
@@ -151,15 +151,15 @@
user << "\red That seems very silly."
return
next_car = next_car.lead
-
+
//latch with src as the follower
lead = T
T.tow = src
dir = lead.dir
-
+
if(user)
user << "\blue You hitch [src] to [T]."
-
+
update_stats()
@@ -168,10 +168,10 @@
if (!lead)
user << "\red [src] is not hitched to anything."
return
-
+
lead.tow = null
lead.update_stats()
-
+
user << "\blue You unhitch [src] from [lead]."
lead = null
@@ -190,7 +190,7 @@
//returns 1 if this is the lead car of the train
/obj/vehicle/train/proc/is_train_head()
- if (lead)
+ if (lead)
return 0
return 1
@@ -209,7 +209,7 @@
if (T.tow == src)
lead.tow = null
lead.update_stats()
-
+
lead = null
update_stats()
return
diff --git a/data/investigate/gravity.html b/data/investigate/gravity.html
index 7166030e..df50bfda 100644
--- a/data/investigate/gravity.html
+++ b/data/investigate/gravity.html
@@ -1,18 +1,6 @@
-23:57 [0x200793a] (92,152,1) || the gravitational generator has regained power.
-23:57 [0x200793a] (92,152,1) || the gravitational generator is now charging.
-23:57 [0x200793a] (92,152,1) || the gravitational generator has regained power.
-23:57 [0x200793a] (92,152,1) || the gravitational generator is now charging.
-23:58 [0x200793a] (92,152,1) || the gravitational generator has regained power.
-23:58 [0x200793a] (92,152,1) || the gravitational generator is now charging.
-00:03 [0x200793a] (92,152,1) || the gravitational generator has regained power.
-00:03 [0x200793a] (92,152,1) || the gravitational generator is now charging.
-00:08 [0x200793a] (92,152,1) || the gravitational generator has regained power.
-00:08 [0x200793a] (92,152,1) || the gravitational generator is now charging.
-00:12 [0x200793a] (92,152,1) || the gravitational generator has regained power.
-00:12 [0x200793a] (92,152,1) || the gravitational generator is now charging.
-00:17 [0x200793a] (92,152,1) || the gravitational generator has regained power.
-00:17 [0x200793a] (92,152,1) || the gravitational generator is now charging.
-00:22 [0x200793a] (92,152,1) || the gravitational generator has regained power.
-00:22 [0x200793a] (92,152,1) || the gravitational generator is now charging.
-00:27 [0x200793a] (92,152,1) || the gravitational generator has regained power.
-00:27 [0x200793a] (92,152,1) || the gravitational generator is now charging.
+00:42 [0x20078ca] (92,152,1) || the gravitational generator has regained power.
+00:42 [0x20078ca] (92,152,1) || the gravitational generator is now charging.
+00:43 [0x20078ca] (92,152,1) || the gravitational generator has regained power.
+00:43 [0x20078ca] (92,152,1) || the gravitational generator is now charging.
+00:43 [0x20078ca] (92,152,1) || the gravitational generator has regained power.
+00:43 [0x20078ca] (92,152,1) || the gravitational generator is now charging.