diff --git a/code/defines/mob/living/carbon/alien_larva.dm b/code/defines/mob/living/carbon/alien_larva.dm
index 4c62e4a40bd..c64451005f9 100644
--- a/code/defines/mob/living/carbon/alien_larva.dm
+++ b/code/defines/mob/living/carbon/alien_larva.dm
@@ -2,6 +2,7 @@
name = "alien larva"
icon_state = "larva"
pass_flags = PASSTABLE
+ swap_on_mobbump = 0
health = 25
diff --git a/code/defines/obj/supplypacks.dm b/code/defines/obj/supplypacks.dm
index ec150f41dd8..4d6ba8979fd 100755
--- a/code/defines/obj/supplypacks.dm
+++ b/code/defines/obj/supplypacks.dm
@@ -121,7 +121,7 @@
/datum/supply_packs/charge/toxins
name = "Toxins Research Charge"
contains = list("/obj/item/weapon/vending_charge/toxins")
- containername = "Toxins Reasearch charge crate"
+ containername = "Toxins Research charge crate"
/* removed these for now, as to not confuse people (the machines are in the tg map)
/datum/supply_packs/charge/genetics
@@ -551,7 +551,7 @@
"/obj/item/weapon/extinguisher",
"/obj/item/weapon/extinguisher")
cost = 20
- containertype = "/obj/structure/closet/crate/firefighting"
+ containertype = "/obj/structure/closet/crate"
containername = "Firefighting equipment crate"
group = "Engineering"
access = ACCESS_ATMOSPHERICS
@@ -644,12 +644,11 @@
name = "Sterile equipment crate"
contains = list("/obj/item/clothing/under/rank/medical/green",
"/obj/item/clothing/under/rank/medical/green",
- "/obj/item/store/stma_kit",
- "/obj/item/store/lglo_kit")
+ "/obj/item/weapon/storage/stma_kit",
+ "/obj/item/weapon/storage/lglo_kit")
cost = 10
- containertype = "/obj/structure/closet/crate/secure"
+ containertype = "/obj/structure/closet/crate"
containername = "Sterile equipment crate"
- access = ACCESS_MEDICAL
group = "Medical / Science"
/datum/supply_packs/mecha_odysseus
diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm
index 14948987199..986a0b314da 100644
--- a/code/game/gamemodes/gameticker.dm
+++ b/code/game/gamemodes/gameticker.dm
@@ -327,27 +327,28 @@ var/datum/roundinfo/roundinfo = new()
if(spawn_vermin && vermin_spawn_turfs && vermin_spawn_turfs.len)
if(!spawning_vermin)
spawning_vermin = 1
+
spawn(rand(vermin_min_spawntime, vermin_max_spawntime))
spawning_vermin = 0
var/cur_alive_vermin = 0
+
//check to see if there are too many already
for(var/obj/effect/critter/roach/R in world)
cur_alive_vermin++
for(var/mob/living/simple_animal/mouse/M in world)
if(!M.stat)
cur_alive_vermin++
- if(cur_alive_vermin <= max_vermin)
- return
- var/turf/T = pick(vermin_spawn_turfs)
- if(T)
- if(prob(50))
- new /mob/living/simple_animal/mouse(T)
+ if(cur_alive_vermin < max_vermin)
+ var/turf/T = pick(vermin_spawn_turfs)
+ if(T)
+ if(prob(50))
+ new /mob/living/simple_animal/mouse(T)
+ else
+ new /obj/effect/critter/roach(T)
else
- new /obj/effect/critter/roach(T)
- else
- //no turf, skip this time
- vermin_spawn_turfs.Remove(T)
+ //no turf, skip this time
+ vermin_spawn_turfs.Remove(T)
return 1
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index fbffa6ba00e..3376d5108f2 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -81,6 +81,13 @@
Bumped(atom/AM)
if(p_open || operating) return
+
+ if(issimpleanimal(AM))
+ var/mob/living/simple_animal/S = AM
+ if(S.can_open_doors)
+ bumpopen(AM)
+ return
+
if(ismob(AM))
var/mob/M = AM
if(world.time - AM.last_bumped <= 60) return //NOTE do we really need that?
diff --git a/code/game/master_controller.dm b/code/game/master_controller.dm
index ec4a0cabe34..d628bdfc195 100644
--- a/code/game/master_controller.dm
+++ b/code/game/master_controller.dm
@@ -177,7 +177,7 @@ datum/controller/game_controller
var/success = air_master.tick() //Changed so that a runtime does not crash the ticker.
if(!success) //Runtimed.
air_master.failed_ticks++
- if(air_master.failed_ticks > 5)
+ if(air_master.failed_ticks > 10)
world << "RUNTIMES IN ATMOS TICKER. Killing air simulation!"
kill_air = 1
air_master.failed_ticks = 0
diff --git a/code/modules/critters/critters.dm b/code/modules/critters/critters.dm
index ce763b38118..d0a6e890216 100644
--- a/code/modules/critters/critters.dm
+++ b/code/modules/critters/critters.dm
@@ -164,7 +164,7 @@
atkcarbon = 1
atksilicon = 0
attacktext = "bites"
- layer = 2.1 //so they can hide under objects
+ layer = 2.5 //so they can hide under objects
Bump(var/mob/M)
if(ishuman(M))
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 18b7eae9e53..dd9781c889f 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -4,6 +4,7 @@
see_invisible = 15
see_in_dark = 100
verbs += /mob/dead/observer/proc/dead_tele
+ verbs += /mob/dead/observer/proc/become_mouse
taj_talk_understand = 1
if(body)
@@ -76,6 +77,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
verbs -= /mob/proc/ghost
if (ghost.client)
ghost.client.eye = ghost
+ if(issimpleanimal(src))
+ ghost.name = ghost.name + " ([src.real_name])"
+ ghost.real_name = ghost.real_name + " ([src.real_name])"
return
/mob/proc/adminghostize()
@@ -156,16 +160,11 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
/mob/dead/observer/proc/become_mouse()
set category = "Ghost"
set name = "Become mouse"
- //locate an empty mouse
- if(client && client.holder && client.holder.state == 2)
- var/rank = client.holder.rank
- client.clear_admin_verbs()
- client.holder.state = 1
- client.update_admins(rank)
+ //locate an empty mouse
var/list/eligible_targets = new()
for(var/mob/living/simple_animal/mouse/M in world)
- if(!M.ckey)
+ if(!M.ckey && !M.stat)
eligible_targets.Add(M)
var/mob/living/simple_animal/mouse/target_mouse
@@ -178,12 +177,27 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
target_mouse = new(pick(ticker.vermin_spawn_turfs))
if(target_mouse)
+ //move player into mouse
+ //the mouse ai will deactivate itself
client.mob = target_mouse
- verbs += /mob/proc/ghost
- target_mouse.real_name = src.name + " (as mouse)"
+ target_mouse.real_name = src.name
+
+ //reset admin verbs
+ if(client && client.holder && client.holder.state == 2)
+ var/rank = client.holder.rank
+ client.clear_admin_verbs()
+ client.holder.state = 1
+ client.update_admins(rank)
+
+ //update allowed verbs
+ target_mouse.verbs += /mob/proc/ghost
+ target_mouse.verbs -= /client/verb/toggle_ghost_ears
+ target_mouse.verbs -= /client/verb/toggle_ghost_sight
+
+ del(src)
+
else
client << "\red Unable to become a mouse!"
- del(src)
/mob/dead/observer/proc/dead_tele()
set category = "Ghost"
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index e9eef75bc6e..5d2a1b26fa5 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -220,9 +220,10 @@
//BubbleWrap: people in handcuffs are always switched around as if they were on 'help' intent to prevent a person being pulled from being seperated from their puller
if((tmob.a_intent == "help" || tmob.restrained()) && (a_intent == "help" || src.restrained()) && tmob.canmove && canmove) // mutual brohugs all around!
- var/turf/oldloc = loc
- loc = tmob.loc
- tmob.loc = oldloc
+ if(tmob.swap_on_mobbump)
+ var/turf/oldloc = loc
+ loc = tmob.loc
+ tmob.loc = oldloc
now_pushing = 0
for(var/mob/living/carbon/metroid/Metroid in view(1,tmob))
if(Metroid.Victim == tmob)
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index 4417cdb9116..5b55ecfe231 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -294,3 +294,5 @@ the mob is also allowed to move without any sort of restriction. For instance, i
var/list/radar_blips = list() // list of screen objects, radar blips
var/radar_open = 0 // nonzero is radar is open
+ var/swap_on_mobbump = 1 //by default, mob collisions will swap the two mobs (if allowed)
+
diff --git a/code/modules/mob/simple_animal/mouse.dm b/code/modules/mob/simple_animal/mouse.dm
index 5207ea657b4..47efd59d3f6 100644
--- a/code/modules/mob/simple_animal/mouse.dm
+++ b/code/modules/mob/simple_animal/mouse.dm
@@ -5,8 +5,8 @@
icon_living = "mouse_gray"
icon_dead = "mouse_gray_dead"
speak = list("Squeek!","SQUEEK!","Squeek?")
- speak_emote = list("squeeks")
- emote_hear = list("squeeks")
+ speak_emote = list("squeeks","squeeks","squiks")
+ emote_hear = list("squeeks","squeaks","squiks")
emote_see = list("runs in a circle", "shakes", "scritches at something")
speak_chance = 1
turns_per_move = 5
@@ -18,15 +18,19 @@
response_harm = "splats the"
density = 0
var/color //brown, gray and white
- layer = 2.1 //so they can hide under objects
+ layer = 2.5 //so they can hide under objects
+ swap_on_mobbump = 0
/mob/living/simple_animal/mouse/Life()
..()
if(!stat && prob(speak_chance))
for(var/mob/M in view())
- M << "\blue \icon[src] Squeek!"
M << 'sound/effects/mousesqueek.ogg'
+/mob/living/simple_animal/mouse/gray
+ color = "gray"
+ icon_state = "mouse_gray"
+
/mob/living/simple_animal/mouse/white
color = "white"
icon_state = "mouse_white"
@@ -41,7 +45,7 @@
icon_state = "mouse_[color]"
icon_living = "mouse_[color]"
icon_dead = "mouse_[color]_dead"
- desc = "It's a small, [color], disease-ridden rodent."
+ desc = "It's a small [color] rodent, often seen hiding in maintenance areas."
/mob/living/simple_animal/mouse/proc/splat()
src.health = 0
diff --git a/code/modules/mob/simple_animal/simple_animal.dm b/code/modules/mob/simple_animal/simple_animal.dm
index 90e24dce6ba..c365f421029 100644
--- a/code/modules/mob/simple_animal/simple_animal.dm
+++ b/code/modules/mob/simple_animal/simple_animal.dm
@@ -51,6 +51,8 @@
var/friendly = "nuzzles" //If the mob does no damage with it's attack
var/wall_smash = 0 //if they can smash walls
- var/speed = 0 //LETS SEE IF I CAN SET SPEEDS FOR SIMPLE MOBS WITHOUT DESTROYING EVERYTHING. Higher speed is slower, negative speed is faster
+ var/speed = 5
+
+ var/can_open_doors = 0 //door opening kind of guy
var/obj/item/device/radio/headset/l_ear = null
diff --git a/code/modules/mob/simple_animal/simple_animal_life.dm b/code/modules/mob/simple_animal/simple_animal_life.dm
index 67af09099c0..e03984e6653 100644
--- a/code/modules/mob/simple_animal/simple_animal_life.dm
+++ b/code/modules/mob/simple_animal/simple_animal_life.dm
@@ -22,7 +22,7 @@
turns_since_move = 0
//Speaking
- if(prob(speak_chance))
+ if(!ckey && prob(speak_chance))
var/length = (speak ? speak.len : 0) + (emote_see ? emote_see.len : 0) + (emote_hear ? emote_hear.len : 0)
if(speak && speak.len && prob((speak.len / length) * 100))
say(pick(speak))
diff --git a/code/modules/mob/simple_animal/simple_animal_misc.dm b/code/modules/mob/simple_animal/simple_animal_misc.dm
index 37479c777da..3e96eda4a9d 100644
--- a/code/modules/mob/simple_animal/simple_animal_misc.dm
+++ b/code/modules/mob/simple_animal/simple_animal_misc.dm
@@ -29,9 +29,20 @@
if(speak_emote && speak_emote.len)
var/emote = pick(speak_emote)
if(emote)
- return "[emote], \"[text]\""
+ return "[src] [emote], \"[text]\""
return "says, \"[text]\"";
+//swhen talking, simple_animals can only understand each other
+/mob/living/simple_animal/say(var/message)
+ for(var/mob/M in view(src,7))
+ if(istype(M, src.type) || M.universal_speak)
+ M << say_quote(message)
+ else if(speak.len)
+ M << "[src] [pick(speak)]"
+ else
+ M << "[src] [pick("makes some strange noises.","makes some strange noises.","makes some strange noises.","makes a small commotion.","kicks up a fuss about something.")]"
+ return
+
/mob/living/simple_animal/emote(var/act,var/m_type=1,var/message = null)
switch(act)
if ("scream")
@@ -73,9 +84,9 @@
message = "[src] [message]"
if("auto")
message = "[src] [message]"
- else
+ /*else
if(!message)
- src << text("Invalid Emote: []", act)
+ src << "Invalid Emote: [act]"*/
if ((message && src.stat == 0))
if (m_type & 1)
for(var/mob/O in viewers(src, null))
@@ -175,11 +186,7 @@
/mob/living/simple_animal/movement_delay()
- var/tally = 0 //Incase I need to add stuff other than "speed" later
-
- tally = speed
-
- return tally
+ return speed
/mob/living/simple_animal/Stat()
..()
@@ -191,6 +198,7 @@
icon_state = icon_dead
stat = DEAD
density = 0
+ src << "\red You have died!"
return
/mob/living/simple_animal/ex_act(severity)
@@ -207,3 +215,6 @@
if(3.0)
health -= 30
+
+/proc/issimpleanimal(var/mob/AM)
+ return istype(AM,/mob/living/simple_animal)