diff --git a/code/game/objects/random/mob.dm b/code/game/objects/random/mob.dm
index d0cee5dff00..be1222aabef 100644
--- a/code/game/objects/random/mob.dm
+++ b/code/game/objects/random/mob.dm
@@ -240,6 +240,7 @@
/obj/random/mob/mouse/item_to_spawn()
return pick(prob(15);/mob/living/simple_mob/animal/passive/mouse/white,
+ prob(15);/mob/living/simple_mob/animal/passive/mouse/black,
prob(30);/mob/living/simple_mob/animal/passive/mouse/brown,
prob(30);/mob/living/simple_mob/animal/passive/mouse/gray,
prob(30);/mob/living/simple_mob/animal/passive/mouse/rat)
diff --git a/code/modules/gamemaster/event2/events/everyone/infestation.dm b/code/modules/gamemaster/event2/events/everyone/infestation.dm
index f51456f3628..512679d2fc5 100644
--- a/code/modules/gamemaster/event2/events/everyone/infestation.dm
+++ b/code/modules/gamemaster/event2/events/everyone/infestation.dm
@@ -31,6 +31,7 @@
things_to_spawn = list(
/mob/living/simple_mob/animal/passive/mouse/gray,
/mob/living/simple_mob/animal/passive/mouse/brown,
+ /mob/living/simple_mob/animal/passive/mouse/black,
/mob/living/simple_mob/animal/passive/mouse/white,
/mob/living/simple_mob/animal/passive/mouse/rat
)
diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm
index e4f5eb1d085..28cd67588bf 100644
--- a/code/modules/mob/holder.dm
+++ b/code/modules/mob/holder.dm
@@ -91,7 +91,7 @@ var/list/holder_mob_icon_cache = list()
else if(istype(loc, /obj/item/clothing/accessory/holster))
var/obj/item/clothing/accessory/holster/holster = loc
if(holster.holstered == src)
- holster.clear_holster()
+ holster.clear_holster()
to_chat(held, "You extricate yourself from [holster].")
forceMove(get_turf(src))
else if(isitem(loc))
@@ -120,11 +120,30 @@ var/list/holder_mob_icon_cache = list()
item_state = held.icon_state
/obj/item/weapon/holder/mouse
+ name = "mouse"
+ desc = "It's a small rodent."
+ item_state = "mouse_gray"
+ slot_flags = SLOT_EARS | SLOT_HEAD | SLOT_ID
+ origin_tech = list(TECH_BIO = 2)
w_class = ITEMSIZE_TINY
-/obj/item/weapon/holder/pai/Initialize(mapload, mob/held)
- . = ..()
- item_state = held.icon_state
+/obj/item/weapon/holder/mouse/white
+ item_state = "mouse_white"
+
+/obj/item/weapon/holder/mouse/gray
+ item_state = "mouse_gray"
+
+/obj/item/weapon/holder/mouse/brown
+ item_state = "mouse_brown"
+
+/obj/item/weapon/holder/mouse/black
+ item_state = "mouse_black"
+
+/obj/item/weapon/holder/mouse/operative
+ item_state = "mouse_operative"
+
+/obj/item/weapon/holder/mouse/rat
+ item_state = "mouse_rat"
/obj/item/weapon/holder/possum
origin_tech = list(TECH_BIO = 2)
@@ -259,8 +278,6 @@ var/list/holder_mob_icon_cache = list()
/mob/living/MouseDrop(var/atom/over_object)
var/mob/living/carbon/human/H = over_object
if(holder_type && issmall(src) && istype(H) && !H.lying && Adjacent(H) && (src.a_intent == I_HELP && H.a_intent == I_HELP)) //VOREStation Edit
- if(istype(src, /mob/living/simple_mob/animal/passive/mouse)) //vorestation edit
- return ..() //vorestation edit
if(!issmall(H) || !istype(src, /mob/living/carbon/human))
get_scooped(H, (usr == src))
return
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm
index 65cbb5d7a95..6dfcd7ae6fe 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm
@@ -7,6 +7,7 @@
item_state = "mouse_gray"
icon_living = "mouse_gray"
icon_dead = "mouse_gray_dead"
+ icon_rest = "mouse_gray_sleep"
kitchen_tag = "rodent"
maxHealth = 5
@@ -59,6 +60,17 @@
icon_rest = "mouse_[body_color]_sleep"
if (body_color != "rat")
desc = "A small [body_color] rodent, often seen hiding in maintenance areas and making a nuisance of itself."
+ holder_type = /obj/item/weapon/holder/mouse/rat
+ if (body_color == "operative")
+ holder_type = /obj/item/weapon/holder/mouse/operative
+ if (body_color == "brown")
+ holder_type = /obj/item/weapon/holder/mouse/brown
+ if (body_color == "gray")
+ holder_type = /obj/item/weapon/holder/mouse/gray
+ if (body_color == "white")
+ holder_type = /obj/item/weapon/holder/mouse/white
+ if (body_color == "black")
+ holder_type = /obj/item/weapon/holder/mouse/black
/mob/living/simple_mob/animal/passive/mouse/Crossed(atom/movable/AM as mob|obj)
if(AM.is_incorporeal())
@@ -96,25 +108,20 @@
/mob/living/simple_mob/animal/passive/mouse/white
body_color = "white"
icon_state = "mouse_white"
+ icon_rest = "mouse_white_sleep"
+ holder_type = /obj/item/weapon/holder/mouse/white
/mob/living/simple_mob/animal/passive/mouse/gray
body_color = "gray"
icon_state = "mouse_gray"
+ icon_rest = "mouse_gray_sleep"
+ holder_type = /obj/item/weapon/holder/mouse/gray
/mob/living/simple_mob/animal/passive/mouse/brown
body_color = "brown"
icon_state = "mouse_brown"
-
-/mob/living/simple_mob/animal/passive/mouse/rat
- name = "rat"
- tt_desc = "E Rattus rattus"
- desc = "A large rodent, often seen hiding in maintenance areas and making a nuisance of itself."
- body_color = "rat"
- icon_state = "mouse_rat"
- maxHealth = 20
- health = 20
-
- ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive
+ icon_rest = "mouse_brown_sleep"
+ holder_type = /obj/item/weapon/holder/mouse/brown
//TOM IS ALIVE! SQUEEEEEEEE~K :)
/mob/living/simple_mob/animal/passive/mouse/brown/Tom
@@ -126,9 +133,60 @@
// Change my name back, don't want to be named Tom (666)
name = initial(name)
+/mob/living/simple_mob/animal/passive/mouse/black
+ body_color = "black"
+ icon_state = "mouse_black"
+ icon_rest = "mouse_black_sleep"
+ holder_type = /obj/item/weapon/holder/mouse/black
+
+/mob/living/simple_mob/animal/passive/mouse/rat
+ name = "rat"
+ tt_desc = "E Rattus rattus"
+ desc = "A large rodent, often seen hiding in maintenance areas and making a nuisance of itself."
+ body_color = "rat"
+ icon_state = "mouse_rat"
+ icon_rest = "mouse_rat_sleep"
+ holder_type = /obj/item/weapon/holder/mouse/rat
+ maxHealth = 20
+ health = 20
+
+ ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive
+
+/mob/living/simple_mob/animal/passive/mouse/operative
+ name = "mouse operative"
+ desc = "A cute mouse fitted with a custom blood red suit. Sneaky."
+ body_color = "operative"
+ icon_state = "mouse_operative"
+ icon_rest = "mouse_operative_sleep"
+ holder_type = /obj/item/weapon/holder/mouse/operative
+ maxHealth = 35
+
+ //It's wearing a void suit, it don't care about atmos
+ health = 35
+ min_oxy = 0
+ max_oxy = 0
+ min_tox = 0
+ max_tox = 0
+ min_co2 = 0
+ max_co2 = 0
+ min_n2 = 0
+ max_n2 = 0
+ maxbodytemp = 700
+
+ ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive
+
+//The names Cheese... Agent Cheese
+/mob/living/simple_mob/animal/passive/mouse/operative/agent_cheese
+ name = "Agent Cheese"
+ desc = "I like my cheese Swiss... not American."
+
+/mob/living/simple_mob/animal/passive/mouse/operative/agent_cheese/New()
+ ..()
+ // Change my name back, don't want to be named agent_cheese (666)
+ name = initial(name)
// Mouse noises
/datum/say_list/mouse
speak = list("Squeek!","SQUEEK!","Squeek?")
emote_hear = list("squeeks","squeaks","squiks")
- emote_see = list("runs in a circle", "shakes", "scritches at something")
+ emote_see = list("runs in a circle", "shakes", "scritches at something")
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse_vr.dm
index b942f69d0f3..97da0b49ade 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse_vr.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse_vr.dm
@@ -12,41 +12,45 @@
movement_cooldown = 5
universal_understand = 1
-/mob/living/simple_mob/animal/passive/mouse/attack_hand(mob/living/L)
- if(L.a_intent == I_HELP && !istype(loc, /obj/item/weapon/holder)) //if lime intent and not in a holder already
- if(!src.attempt_to_scoop(L)) //the superior way to handle scooping, checks size
- ..() //mouse too big to grab? pet the large mouse instead
- else
- ..()
-
-//No longer in use, as mice create a holder/micro object instead
/obj/item/weapon/holder/mouse/attack_self(var/mob/U)
for(var/mob/living/simple_mob/M in src.contents)
if((I_HELP) && U.checkClickCooldown()) //a little snowflakey, but makes it use the same cooldown as interacting with non-inventory objects
U.setClickCooldown(U.get_attack_speed()) //if there's a cleaner way in baycode, I'll change this
U.visible_message("[U] [M.response_help] \the [M].")
+//Jank grabber that uses the 'attack_hand' insead of 'MouseDrop'
+/mob/living/simple_mob/animal/passive/mouse/attack_hand(var/atom/over_object)
+ var/mob/living/carbon/human/H = over_object
+ if(holder_type && issmall(src) && istype(H) && !H.lying && Adjacent(H) && (src.a_intent == I_HELP && H.a_intent == I_HELP))
+ if(!issmall(H) || !istype(src, /mob/living/carbon/human))
+ get_scooped(H, (usr == src))
+ return
+ return ..()
-/mob/living/simple_mob/animal/passive/mouse/MouseDrop(var/obj/O) //this proc would be very easy to apply to all mobs, holders generate dynamically
- if(!(usr == src || O))
- return ..()
- if(istype(O, /mob/living) && O.Adjacent(src)) //controls scooping by mobs
- var/mob/living/L = O
- if(!src.attempt_to_scoop(L, (src == usr)))
- return //this way it doesnt default to the generic animal pickup which isnt size restricted
- if(istype(O, /obj/item/weapon/storage) && O.Adjacent(src)) //controls diving into storage
- var/obj/item/weapon/storage/S = O
- var/obj/item/weapon/holder/H = new holder_type(get_turf(src),src) //this works weird, but it creates an empty holder, to see if that holder can fit
- if(S.can_be_inserted(H) && (src.size_multiplier <= 0.75))
- visible_message("\The [src] squeezes into \the [S].")
- H.forceMove(S)
- return 1
- else
- qdel(H) //this deletes the empty holder if it doesnt work
- to_chat(usr,"You can't fit inside \the [S]!")
- return 0
+/mob/living/proc/mouse_scooped(var/mob/living/carbon/grabber, var/self_grab)
+
+ if(!holder_type || buckled || pinned.len)
+ return
+
+ if(self_grab)
+ if(src.incapacitated()) return
else
- ..()
+ if(grabber.incapacitated()) return
+
+ var/obj/item/weapon/holder/H = new holder_type(get_turf(src), src)
+ grabber.put_in_hands(H)
+
+ if(self_grab)
+ to_chat(grabber, "\The [src] clambers onto you!")
+ to_chat(src, "You climb up onto \the [grabber]!")
+ grabber.equip_to_slot_if_possible(H, slot_back, 0, 1)
+ else
+ to_chat(grabber, "You scoop up \the [src]!")
+ to_chat(src, "\The [grabber] scoops you up!")
+
+ add_attack_logs(grabber, H.held_mob, "Scooped up", FALSE) // Not important enough to notify admins, but still helpful.
+ return H
+
/mob/living/simple_mob/animal/passive/mouse/white/apple
name = "Apple"
desc = "Dainty, well groomed and cared for, her eyes glitter with untold knowledge..."
@@ -56,4 +60,12 @@
..()
// Change my name back, don't want to be named Apple (666)
name = initial(name)
- desc = initial(desc)
\ No newline at end of file
+ desc = initial(desc)
+
+/obj/item/weapon/holder/mouse/attack_self(mob/living/carbon/user)
+ user.setClickCooldown(user.get_attack_speed())
+ for(var/L in contents)
+ if(isanimal(L))
+ var/mob/living/simple_mob/S = L
+ user.visible_message("[user] [S.response_help] \the [S].")
+
diff --git a/icons/inventory/ears/mob.dmi b/icons/inventory/ears/mob.dmi
index 174ed17469e..95ec0e9c8a9 100644
Binary files a/icons/inventory/ears/mob.dmi and b/icons/inventory/ears/mob.dmi differ
diff --git a/icons/inventory/head/mob.dmi b/icons/inventory/head/mob.dmi
index 356aab58f57..c555efe874c 100644
Binary files a/icons/inventory/head/mob.dmi and b/icons/inventory/head/mob.dmi differ
diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi
index fd99eed3f02..def737dcc36 100644
Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ
diff --git a/icons/mob/items/lefthand_holder.dmi b/icons/mob/items/lefthand_holder.dmi
index 0c5e48a55e8..aa7e7807cca 100644
Binary files a/icons/mob/items/lefthand_holder.dmi and b/icons/mob/items/lefthand_holder.dmi differ
diff --git a/icons/mob/items/righthand_holder.dmi b/icons/mob/items/righthand_holder.dmi
index 432a86f0d52..bad25f481b9 100644
Binary files a/icons/mob/items/righthand_holder.dmi and b/icons/mob/items/righthand_holder.dmi differ