From 46a450069eafccf337e1823172c44eb714101a07 Mon Sep 17 00:00:00 2001 From: Cael_Aislinn Date: Sat, 4 Aug 2012 15:47:56 +1000 Subject: [PATCH] - simple_animals can't open doors by default - alien larvae, mice can hide under mobs - roaches, mice can hide under various objects - various tweaks, including flavour and existing mechanics - fix for ghosts not being able to spawn as mice - added move delay of half a second to simple_animals (about the same as human walkspeed?) - simple_animals, when talking, can only understand each other (and mobs with universal_speak) Signed-off-by: Cael_Aislinn --- code/defines/mob/living/carbon/alien_larva.dm | 1 + code/game/machinery/doors/door.dm | 7 ++++ code/modules/critters/critters.dm | 2 +- code/modules/mob/dead/observer/observer.dm | 32 +++++++++++++------ code/modules/mob/simple_animal/mouse.dm | 14 +++++--- .../mob/simple_animal/simple_animal.dm | 4 ++- .../mob/simple_animal/simple_animal_life.dm | 2 +- .../mob/simple_animal/simple_animal_misc.dm | 27 +++++++++++----- 8 files changed, 64 insertions(+), 25 deletions(-) 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)