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/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/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..fb385604bd3 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,13 +160,8 @@ 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)
@@ -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/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..e44d3222681 100644
--- a/code/modules/mob/simple_animal/simple_animal_misc.dm
+++ b/code/modules/mob/simple_animal/simple_animal_misc.dm
@@ -3,6 +3,7 @@
..()
verbs -= /mob/verb/observe
real_name = src.name
+ archived_speak_chance = speak_chance
/mob/living/simple_animal/Login()
if(src && src.client)
@@ -29,9 +30,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 +85,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 +187,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()
..()
@@ -207,3 +215,6 @@
if(3.0)
health -= 30
+
+/proc/issimpleanimal(var/mob/AM)
+ return istype(AM,/mob/living/simple_animal)