diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
index 0c9db7dca3d..ef45b4800dc 100644
--- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
@@ -48,6 +48,8 @@
new /obj/item/clothing/under/sundress(src)
new /obj/item/clothing/under/waiter(src)
new /obj/item/clothing/under/waiter(src)
+ if(prob(1))
+ new /obj/item/weapon/gun/energy/mousegun(src)
new /obj/item/device/radio/headset/headset_service(src)
new /obj/item/device/radio/headset/headset_service(src)
new /obj/item/weapon/storage/box/gloves(src)
@@ -70,6 +72,8 @@
new /obj/item/weapon/cartridge/janitor(src)
new /obj/item/clothing/gloves/black(src)
new /obj/item/clothing/head/soft/purple(src)
+ new /obj/item/weapon/gun/energy/mousegun(src)
+ new /obj/item/clothing/accessory/holster/armpit(src)
new /obj/item/device/flashlight(src)
new /obj/item/weapon/caution(src)
new /obj/item/weapon/caution(src)
diff --git a/code/modules/mob/living/simple_animal/friendly/rat.dm b/code/modules/mob/living/simple_animal/friendly/rat.dm
index 1ceaaf201ee..39e00218e8e 100644
--- a/code/modules/mob/living/simple_animal/friendly/rat.dm
+++ b/code/modules/mob/living/simple_animal/friendly/rat.dm
@@ -18,21 +18,21 @@
'sound/effects/creatures/rat_squeaks_2.ogg',
'sound/effects/creatures/rat_squeaks_3.ogg',
'sound/effects/creatures/rat_squeaks_4.ogg')
- var/last_softsqueak = null//Used to prevent the same soft squeak twice in a row
- var/squeals = 5//Spam control.
- var/maxSqueals = 2//SPAM PROTECTION
- var/last_squealgain = 0// #TODO-FUTURE: Remove from life() once something else is created
+ var/last_softsqueak = null //Used to prevent the same soft squeak twice in a row
+ var/squeals = 5 //Spam control.
+ var/maxSqueals = 2 //SPAM PROTECTION
+ var/last_squealgain = 0 // #TODO-FUTURE: Remove from life() once something else is created
var/squeakcooldown = 0
pass_flags = PASSTABLE
speak_chance = 3
turns_per_move = 5
see_in_dark = 6
- maxHealth = 10
- health = 10
+ maxHealth = 5
+ health = 5
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/rat
- response_help = "pets"
+ response_help = "pets"
response_disarm = "gently pushes aside"
- response_harm = "stomps on"
+ response_harm = "stomps on"
density = 0
meat_amount = 2 // Rats are a bit bigger, so a bit more meat for dreg-feeding.
var/body_color //brown, gray, white, american irish, hooded leave blank for random
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index b20218bd088..34aa757e83d 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -158,8 +158,8 @@
dispersion = list(0, 8)
/obj/item/weapon/gun/energy/mousegun
- name = "\improper NT \"Arodentia\" Exterminator ray"
- desc = "A highly sophisticated and certainly experimental raygun designed for rapid pest-control."
+ name = "\improper NT \"Arodentia\" Pesti-Shock"
+ desc = "A highly sophisticated and probably safe beamgun designed for rapid pest-control."
icon_state = "floramut100"
item_state = "floramut"
charge_meter = 0
@@ -170,21 +170,21 @@
slot_flags = SLOT_HOLSTER | SLOT_BELT
max_shots = 6
sel_mode = 1
- burst = 3
- burst_delay = 1
- move_delay = 0
- fire_delay = 3
- dispersion = list(0, 15, 15)
-
+ var/emagged = FALSE
needspin = FALSE
- var/lightfail = 0
-
/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)
..()
+/obj/item/weapon/gun/energy/mousegun/emag_act(var/remaining_charges, var/mob/user)
+ if(!emagged)
+ to_chat(user, "You overload \the [src]'s shock modulator.")
+ projectile_type = /obj/item/projectile/beam/mousegun/emag
+ emagged = TRUE
+ return TRUE
+
/obj/item/weapon/gun/energy/net
name = "net gun"
desc = "A gun designed to deploy energy nets to capture animals or unruly crew members."
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index 0368657c51f..e8d7aebbd04 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -177,7 +177,7 @@
impact_type = /obj/effect/projectile/impact/disabler
/obj/item/projectile/beam/mousegun
- name = "diffuse electrical arc"
+ name = "electrical arc"
icon_state = "stun"
nodamage = 1
damage_type = HALLOSS
@@ -191,37 +191,78 @@
..()
/obj/item/projectile/beam/mousegun/proc/mousepulse(turf/epicenter, range, log=0)
- if (!epicenter)
+ if(!epicenter)
return
- if (!istype(epicenter, /turf))
+ if(!istype(epicenter, /turf))
epicenter = get_turf(epicenter.loc)
- for (var/mob/living/M in range(range, epicenter))
+ for(var/mob/living/M in range(range, epicenter))
var/distance = get_dist(epicenter, M)
- if (distance < 0)
+ if(distance < 0)
distance = 0
- if (distance <= range)
- if (M.mob_size <= 2 && (M.find_type() & TYPE_ORGANIC))
- M.visible_message("[M] bursts like a balloon!")
- M.gib()
+ if(distance <= range)
+ if (M.mob_size <= 3 && (M.find_type() & TYPE_ORGANIC))
+ M.visible_message("\The [M] gets fried!")
+ M.color = "#4d4d4d" //get fried
+ M.death()
spark(M, 3, alldirs)
- else if (iscarbon(M) && M.contents.len)
- for (var/obj/item/weapon/holder/H in M.contents)
- if (!H.contained)
+ else if(iscarbon(M) && M.contents.len)
+ for(var/obj/item/weapon/holder/H in M.contents)
+ if(!H.contained)
continue
var/mob/living/A = H.contained
- if (!istype(A))
+ if(!istype(A))
continue
- if (A.mob_size <= 2 && (A.find_type() & TYPE_ORGANIC))
+ if(A.mob_size <= 3 && (A.find_type() & TYPE_ORGANIC))
+ H.release_mob()
+ A.visible_message("\The [A] gets fried!")
+ A.color = "#4d4d4d" //get fried
+ A.death()
+
+ to_chat(M, 'sound/effects/basscannon.ogg')
+ return TRUE
+
+/obj/item/projectile/beam/mousegun/emag
+ name = "diffuse electrical arc"
+
+ taser_effect = 1
+ agony = 60
+
+/obj/item/projectile/beam/mousegun/emag/mousepulse(turf/epicenter, range, log=0)
+ if(!epicenter)
+ return
+
+ if(!istype(epicenter, /turf))
+ epicenter = get_turf(epicenter.loc)
+
+ for(var/mob/living/M in range(range, epicenter))
+ var/distance = get_dist(epicenter, M)
+ if(distance < 0)
+ distance = 0
+ if(distance <= range)
+ if(M.mob_size <= 4 && (M.find_type() & TYPE_ORGANIC))
+ M.visible_message("[M] bursts like a balloon!")
+ M.gib()
+ spark(M, 3, alldirs)
+ else if(iscarbon(M) && M.contents.len)
+ for(var/obj/item/weapon/holder/H in M.contents)
+ if(!H.contained)
+ continue
+
+ var/mob/living/A = H.contained
+ if(!istype(A))
+ continue
+
+ if(A.mob_size <= 4 && (A.find_type() & TYPE_ORGANIC))
H.release_mob()
A.visible_message("[A] bursts like a balloon!")
A.gib()
to_chat(M, 'sound/effects/basscannon.ogg')
- return 1
+ return TRUE
/obj/item/projectile/beam/shotgun
name = "diffuse laser"
diff --git a/html/changelogs/geeves - deathToRats.yml b/html/changelogs/geeves - deathToRats.yml
new file mode 100644
index 00000000000..b219144424f
--- /dev/null
+++ b/html/changelogs/geeves - deathToRats.yml
@@ -0,0 +1,10 @@
+
+author: Geeves
+
+delete-after: True
+
+changes:
+ - rscadd: "Janitorial staff are now equipped with an Arodentia gun, capable of keeping any well-meaning establishment clear of pests."
+ - rscadd: "Janitorial staff now have an armpit holster to keep their Arodentia gun in."
+ - tweak: "Arodentia guns have come out of the experimental phase, now featuring new abilities."
+ - tweak: "Rats now have their health reduced to reasonable levels."
\ No newline at end of file