diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm
index 011a2e4f..14d2dbaa 100644
--- a/code/modules/power/generator.dm
+++ b/code/modules/power/generator.dm
@@ -11,7 +11,26 @@
var/lastgen = 0
var/lastgenlev = -1
var/lastcirc = "00"
-
+ var/overloaded = 0
+ var/running = 0
+ var/boost = 0
+ var/grump = 0 // best var 2013
+ var/grumping = 0 // is the engine currently doing grumpy things
+ var/list/grump_prefix = list("an upsetting", "an unsettling",
+ "a scary", "a loud", "a sassy", "a grouchy", "a grumpy",
+ "an awful", "a horrible", "a despicable", "a pretty rad", "a godawful")
+ var/list/grump_suffix = list("noise", "racket", "ruckus", "sound", "clatter", "fracas", "hubbub")
+ var/sound_engine1 = 'sound/machines/tractor_running.ogg'
+ var/sound_engine2 = 'sound/machines/engine_highpower.ogg'
+ var/sound_tractorrev = 'sound/machines/tractorrev.ogg'
+ var/sound_engine_alert1 = 'sound/machines/engine_alert1.ogg'
+ var/sound_engine_alert2 = 'sound/machines/engine_alert2.ogg'
+ var/sound_engine_alert3 = 'sound/machines/engine_alert3.ogg'
+ var/sound_bigzap = 'sound/effects/elec_bigzap.ogg'
+ var/sound_bellalert = 'sound/machines/bellalert.ogg'
+ var/sound_warningbuzzer = 'sound/machines/warning-buzzer.ogg'
+ var/list/sounds_engine = list(sound('sound/machines/tractor_running2.ogg'),sound('sound/machines/tractor_running3.ogg'))
+ var/list/sounds_enginegrump = list(sound('sound/machines/engine_grump1.ogg'),sound('sound/machines/engine_grump2.ogg'),sound('sound/machines/engine_grump3.ogg'),sound('sound/machines/engine_grump4.ogg'))
/obj/machinery/power/generator/Initialize(mapload)
. = ..()
@@ -101,6 +120,108 @@
add_avail(power_output)
lastgenlev = power_output
lastgen -= power_output
+ if (lastgenlev > 0)
+ if(grump < 0) // grumpcode
+ grump = 0 // no negative grump plz
+ grump++ // get grump'd
+ if(grump >= 100 && prob(5))
+ playsound(src.loc, pick(sounds_enginegrump), 70, 0)
+ src.visible_message("[src] makes [pick(grump_prefix)] [pick(grump_suffix)]!")
+ grump -= 5
+ if(!running)
+ playsound(src.loc, sound_tractorrev, 55, 0)
+ running = 1
+ else
+ running = 0
+ var/genlev = (lastgenlev/1000000)
+ switch(genlev)
+ if(0)
+ return
+ if(0.2 to 1)
+ playsound(src.loc, sound_engine1, 60, 0)
+ if(prob(5))
+ playsound(src.loc, pick(sounds_engine), 70, 0)
+ if(1 to 10)
+ playsound(src.loc, sound_engine1, 60, 0)
+ if(11 to 100)
+ playsound(src.loc, sound_engine2, 60, 0)
+ if(101 to 500)
+ playsound(src.loc, sound_bellalert, 60, 0)
+ if(prob(5))
+ do_sparks(5,FALSE,src)
+ if(501 to 1000)
+ playsound(src.loc, sound_warningbuzzer, 50, 0)
+ if (prob(5))
+ src.visible_message("[src] starts smoking!")
+ if (!grumping && grump >= 100 && prob(5))
+ grumping = 1
+ playsound(src.loc, "sound/machines/engine_grump1.ogg", 50, 0)
+ grumping = 0
+ grump -= 10
+ if(1001 to 5000)
+ if (prob(5))
+ playsound(src.loc, sound_engine_alert1, 55, 0)
+ if (prob(5))
+ playsound(src.loc, 'sound/weapons/emitter2.ogg', 100, 1, extrarange = 10)
+ zapStuff(src, 5, min(genlev, 20000))
+ if (!grumping && grump >= 100 && prob(5))
+ grumping = 1
+ playsound(src.loc, "sound/machines/engine_grump1.ogg", 50, 0)
+ grumping = 0
+ grump -= 30
+
+ if(5001 to 10000)
+ if (prob(15))
+ playsound(src.loc, sound_engine_alert2, 55, 0)
+ if (prob(10)) // lowering a bit more
+ playsound(src.loc, 'sound/weapons/emitter2.ogg', 100, 1, extrarange = 10)
+ zapStuff(src, 5, min(genlev, 20000))
+ if (prob(5))
+ src.visible_message("[src] starts smoking!")
+ if (!grumping && grump >= 100 && prob(10)) // probably not good if this happens several times in a row
+ grumping = 1
+ playsound(src.loc, "sound/weapons/rocket.ogg", 50, 0)
+ var/firesize = rand(1,4)
+ for(var/atom/movable/M in view(firesize, src.loc)) // fuck up those jerkbag engineers
+ if(M.anchored) continue
+ if(ismob(M))
+ var/mob/living/L = M
+ L.adjustBruteLoss(10)
+ if(ismob(M))
+ var/atom/targetTurf = get_edge_target_turf(M, get_dir(src, get_step_away(M, src)))
+ M.throw_at(targetTurf, 200, 4)
+ else if (prob(15)) // cut down the number of other junk things that get blown around
+ var/atom/targetTurf = get_edge_target_turf(M, get_dir(src, get_step_away(M, src)))
+ M.throw_at(targetTurf, 200, 4)
+ grumping = 0
+ grump -= 30
+ if(10001 to INFINITY)
+ playsound(src.loc, sound_engine_alert3, 55, 0)
+ if(!grumping && grump >= 100 && prob(6))
+ grumping = 1
+ src.visible_message("[src] [pick("resonates", "shakes", "rumbles", "grumbles", "vibrates", "roars")] [pick("dangerously", "strangely", "ominously", "frighteningly", "grumpily")]!")
+ playsound(src.loc, "sound/effects/explosionfar.ogg", 65, 1)
+ for (var/obj/structure/window/W in range(6, src.loc)) // smash nearby windows
+ if (W.max_integrity >= 80) // plasma glass or better, no break please and thank you
+ continue
+ if (prob(get_dist(W,src.loc)*6))
+ continue
+ W.deconstruct(FALSE)
+ for (var/mob/living/M in range(6, src.loc))
+ shake_camera(M, 3, 16)
+ grumping = 0
+ grump -= 30
+ if (prob(33)) // lowered because all the DEL procs related to zap are stacking up in the profiler
+ if(prob(5))
+ playsound(src.loc, sound_bigzap, 100, 1, extrarange = 10)
+ zapStuff(src, 5, min(genlev, 30000)) //BIG ZAP
+ else
+ playsound(src.loc, 'sound/weapons/emitter2.ogg', 100, 1, extrarange = 10)
+ zapStuff(src, 5, min(genlev, 20000))
+ if(prob(5))
+ src.visible_message("[src] [pick("rumbles", "groans", "shudders", "grustles", "hums", "thrums")] [pick("ominously", "oddly", "strangely", "oddly", "worringly", "softly", "loudly")]!")
+ else if (prob(2))
+ src.visible_message("[src] hungers!")
..()
/obj/machinery/power/generator/proc/get_menu(include_link = TRUE)
@@ -232,3 +353,71 @@
if(cold_circ)
cold_circ.generator = null
cold_circ = null
+
+/obj/machinery/power/generator/proc/zapStuff(atom/zapstart, range = 3, power)
+ . = zapstart.dir
+ if(power < 1000)
+ return
+
+ var/target_atom
+ var/mob/living/target_mob
+ var/obj/machinery/target_machine
+ var/obj/structure/target_structure
+ var/list/arctargetsmob = list()
+ var/list/arctargetsmachine = list()
+ var/list/arctargetsstructure = list()
+
+ if(prob(20)) //let's not hit all the engineers with every beam and/or segment of the arc
+ for(var/mob/living/Z in oview(zapstart, range+2))
+ arctargetsmob += Z
+ if(arctargetsmob.len)
+ var/mob/living/H = pick(arctargetsmob)
+ var/atom/A = H
+ target_mob = H
+ target_atom = A
+
+ else
+ for(var/obj/machinery/X in oview(zapstart, range+2))
+ arctargetsmachine += X
+ if(arctargetsmachine.len)
+ var/obj/machinery/M = pick(arctargetsmachine)
+ var/atom/A = M
+ target_machine = M
+ target_atom = A
+
+ else
+ for(var/obj/structure/Y in oview(zapstart, range+2))
+ arctargetsstructure += Y
+ if(arctargetsstructure.len)
+ var/obj/structure/O = pick(arctargetsstructure)
+ var/atom/A = O
+ target_structure = O
+ target_atom = A
+
+ if(target_atom)
+ zapstart.Beam(target_atom, icon_state="nzcrentrs_power", time=5)
+ var/zapdir = get_dir(zapstart, target_atom)
+ if(zapdir)
+ . = zapdir
+
+ if(target_mob)
+ target_mob.electrocute_act(rand(5,10), "Discharge Bolt", 1, stun = 0)
+ if(prob(15))
+ zapStuff(target_mob, 5, power / 2)
+ zapStuff(target_mob, 5, power / 2)
+ else
+ zapStuff(target_mob, 5, power / 1.5)
+
+ else if(target_machine)
+ if(prob(15))
+ zapStuff(target_machine, 5, power / 2)
+ zapStuff(target_machine, 5, power / 2)
+ else
+ zapStuff(target_machine, 5, power / 1.5)
+
+ else if(target_structure)
+ if(prob(15))
+ zapStuff(target_structure, 5, power / 2)
+ zapStuff(target_structure, 5, power / 2)
+ else
+ zapStuff(target_structure, 5, power / 1.5)
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index e34041ed..e6f9df71 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -87,7 +87,7 @@
var/boom_message = "[ADMIN_LOOKUPFLW(P.firer)] triggered a fueltank explosion via projectile."
GLOB.bombers += boom_message
message_admins(boom_message)
- P.firer.log_message("triggered a fueltank explosion via projectile.", LOG_ATTACK)
+ P.firer?.log_message("triggered a fueltank explosion via projectile.", LOG_ATTACK)
boom()
/obj/structure/reagent_dispensers/fueltank/attackby(obj/item/I, mob/living/user, params)
diff --git a/config/game_options.txt b/config/game_options.txt
index b7b0adf1..994ab780 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -574,7 +574,7 @@ BOX_RANDOM_ENGINE Box Singulo,3
BOX_RANDOM_ENGINE Box SM 1x3,1
BOX_RANDOM_ENGINE Box SM 5x5,1
BOX_RANDOM_ENGINE Box SM 3x,1
-BOX_RANDOM_ENGINE Box TEG,1
+BOX_RANDOM_ENGINE Box TEG,2
BOX_RANDOM_ENGINE Box Empty,0
-BOX_RANDOM_ENGINE Box Antimatter,1
+BOX_RANDOM_ENGINE Box Antimatter,0
BOX_RANDOM_ENGINE Box P.A.C.M.A.N,0
\ No newline at end of file
diff --git a/sound/effects/elec_bigzap.ogg b/sound/effects/elec_bigzap.ogg
new file mode 100644
index 00000000..727f3067
Binary files /dev/null and b/sound/effects/elec_bigzap.ogg differ
diff --git a/sound/machines/bellalert.ogg b/sound/machines/bellalert.ogg
new file mode 100644
index 00000000..063d85f1
Binary files /dev/null and b/sound/machines/bellalert.ogg differ
diff --git a/sound/machines/engine_alert3.ogg b/sound/machines/engine_alert3.ogg
new file mode 100644
index 00000000..d46ae68b
Binary files /dev/null and b/sound/machines/engine_alert3.ogg differ
diff --git a/sound/machines/engine_grump1.ogg b/sound/machines/engine_grump1.ogg
new file mode 100644
index 00000000..14251bcf
Binary files /dev/null and b/sound/machines/engine_grump1.ogg differ
diff --git a/sound/machines/engine_grump2.ogg b/sound/machines/engine_grump2.ogg
new file mode 100644
index 00000000..8f6bf824
Binary files /dev/null and b/sound/machines/engine_grump2.ogg differ
diff --git a/sound/machines/engine_grump3.ogg b/sound/machines/engine_grump3.ogg
new file mode 100644
index 00000000..f97b801d
Binary files /dev/null and b/sound/machines/engine_grump3.ogg differ
diff --git a/sound/machines/engine_grump4.ogg b/sound/machines/engine_grump4.ogg
new file mode 100644
index 00000000..d0864b58
Binary files /dev/null and b/sound/machines/engine_grump4.ogg differ
diff --git a/sound/machines/engine_highpower.ogg b/sound/machines/engine_highpower.ogg
new file mode 100644
index 00000000..fbe12f86
Binary files /dev/null and b/sound/machines/engine_highpower.ogg differ
diff --git a/sound/machines/tractor_running.ogg b/sound/machines/tractor_running.ogg
new file mode 100644
index 00000000..59932c1c
Binary files /dev/null and b/sound/machines/tractor_running.ogg differ
diff --git a/sound/machines/tractor_running2.ogg b/sound/machines/tractor_running2.ogg
new file mode 100644
index 00000000..68895273
Binary files /dev/null and b/sound/machines/tractor_running2.ogg differ
diff --git a/sound/machines/tractor_running3.ogg b/sound/machines/tractor_running3.ogg
new file mode 100644
index 00000000..96fe60ba
Binary files /dev/null and b/sound/machines/tractor_running3.ogg differ
diff --git a/sound/machines/tractorrev.ogg b/sound/machines/tractorrev.ogg
new file mode 100644
index 00000000..7e53bf94
Binary files /dev/null and b/sound/machines/tractorrev.ogg differ
diff --git a/sound/weapons/rocket.ogg b/sound/weapons/rocket.ogg
new file mode 100644
index 00000000..6569fe1c
Binary files /dev/null and b/sound/weapons/rocket.ogg differ