diff --git a/code/defines/obj/hydro.dm b/code/defines/obj/hydro.dm
index bb53686d280..eb881a4fd28 100644
--- a/code/defines/obj/hydro.dm
+++ b/code/defines/obj/hydro.dm
@@ -1459,7 +1459,7 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/killertomato/attack_self(mob/user as mob)
if(istype(user.loc,/turf/space))
return
- new /obj/effect/critter/killertomato(user.loc)
+ new /mob/living/simple_animal/tomato(user.loc)
del(src)
user << "You plant the killer-tomato."
@@ -1654,7 +1654,7 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/walkingmushroom/attack_self(mob/user as mob)
if(istype(user.loc,/turf/space))
return
- new /obj/effect/critter/walkingmushroom(user.loc)
+ new /mob/living/simple_animal/mushroom(user.loc)
del(src)
user << "You plant the walking mushroom."
diff --git a/code/game/asteroid/artifacts.dm b/code/game/asteroid/artifacts.dm
index 7f4fa0ff004..26284b8bb7c 100644
--- a/code/game/asteroid/artifacts.dm
+++ b/code/game/asteroid/artifacts.dm
@@ -5,7 +5,7 @@ var/global/list/space_surprises = list( /obj/item/clothing/mask/facehugger/angr
/obj/item/weapon/pickaxe/silver =4,
/obj/item/weapon/pickaxe/drill =4,
/obj/item/weapon/pickaxe/jackhammer =4,
- /obj/effect/critter/spesscarp/elite =3,
+ /mob/living/simple_animal/carp =3,
/obj/item/weapon/pickaxe/diamond =3,
/obj/item/weapon/pickaxe/diamonddrill =3,
/obj/item/weapon/pickaxe/gold =3,
diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm
index 6a513ed43c0..56f0b772175 100644
--- a/code/game/gamemodes/events.dm
+++ b/code/game/gamemodes/events.dm
@@ -348,10 +348,7 @@
/proc/carp_migration() // -- Darem
for(var/obj/effect/landmark/C in world)
if(C.name == "carpspawn")
- if(prob(99))
- new /obj/effect/critter/spesscarp(C.loc)
- else
- new /obj/effect/critter/spesscarp/elite(C.loc)
+ new /mob/living/simple_animal/carp(C.loc)
//sleep(100)
spawn(rand(300, 600)) //Delayed announcements to keep the crew on their toes.
command_alert("Unknown biological entities have been detected near [station_name()], please stand-by.", "Lifesign Alert")
diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm
index 6e324961f92..affbcb3fbf6 100644
--- a/code/game/machinery/computer/HolodeckControl.dm
+++ b/code/game/machinery/computer/HolodeckControl.dm
@@ -293,7 +293,7 @@
for(var/obj/effect/decal/cleanable/blood/B in linkedholodeck)
del(B)
- for(var/obj/effect/critter/spesscarp/C in linkedholodeck)
+ for(var/mob/living/simple_animal/carp/C in linkedholodeck)
del(C)
holographic_items = A.copy_contents_to(linkedholodeck , 1)
@@ -314,10 +314,7 @@
T.temperature = 5000
T.hotspot_expose(50000,50000,1)
if(L.name=="Holocarp Spawn")
- if(prob(90))
- new /obj/effect/critter/spesscarp(L.loc)
- else
- new /obj/effect/critter/spesscarp/elite(L.loc)
+ new /mob/living/simple_animal/carp(L.loc)
/obj/machinery/computer/HolodeckControl/proc/emergencyShutdown()
diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm
index 79d65dc5cb0..3d5b23a989a 100644
--- a/code/game/machinery/teleporter.dm
+++ b/code/game/machinery/teleporter.dm
@@ -7,7 +7,7 @@
var/id = null
/obj/machinery/computer/teleporter/New()
- src.id = text("[]", rand(1000, 9999))
+ src.id = "[rand(1000, 9999)]"
..()
return
@@ -22,21 +22,22 @@
//Quickfix for hiding nuke disks and people getting to centcomm until I can get the attack_hand() stuff to incorperate this.
for(var/obj/O in user.get_contents())
if(istype(O, /obj/item/weapon/disk/nuclear) || istype(O, /obj/item/device/radio/beacon) || istype(O, /obj/item/weapon/storage/backpack/holding))
- user << "\red Something you are carrying seems to be unable to pass through the portal. Better drop it if you want to go through."
+ user << "Something you are carrying seems to be unable to pass through the portal. Better drop it if you want to go through."
return
var/obj/S = null
for(var/obj/effect/landmark/sloc in world)
if (sloc.name != M.data)
continue
- if (locate(/mob) in sloc.loc)
+ if (locate(/mob/living) in sloc.loc)
continue
S = sloc
break
- if (!S)
+ if(!S)
S = locate("landmark*[M.data]") // use old stype
- if (istype(S, /obj/effect/landmark/) && istype(S.loc, /turf))
- usr.loc = S.loc
+ if(istype(S, /obj/effect/landmark/) && istype(S.loc, /turf))
+ user.loc = S.loc
+ user.drop_item()
del(I)
return
else
@@ -46,12 +47,6 @@
/obj/machinery/computer/teleporter/attack_paw()
src.attack_hand()
-/obj/machinery/computer/teleporter/security/attackby(obj/item/weapon/W)
- src.attack_hand()
-
-/obj/machinery/computer/teleporter/security/attack_paw()
- src.attack_hand()
-
/obj/machinery/teleport/station/attack_ai()
src.attack_hand()
diff --git a/code/game/objects/grenades/spawnergrenade.dm b/code/game/objects/grenades/spawnergrenade.dm
index 249b6a6f3cc..739b6562e53 100644
--- a/code/game/objects/grenades/spawnergrenade.dm
+++ b/code/game/objects/grenades/spawnergrenade.dm
@@ -47,12 +47,6 @@
/obj/item/weapon/grenade/spawnergrenade/spesscarp
name = "carp delivery grenade"
- spawner_type = /obj/effect/critter/spesscarp
+ spawner_type = /mob/living/simple_animal/carp
deliveryamt = 5
- origin_tech = "materials=3;magnets=4;syndicate=4"
-
-/obj/item/weapon/grenade/spawnergrenade/elitespesscarp
- name = "elite carp delivery grenade"
- spawner_type = /obj/effect/critter/spesscarp/elite
- deliveryamt = 2
- origin_tech = "materials=3;magnets=4;syndicate=4"
+ origin_tech = "materials=3;magnets=4;syndicate=4"
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/grenades.dm b/code/game/objects/items/weapons/grenades.dm
index 29280cdc3db..41c5ad27755 100644
--- a/code/game/objects/items/weapons/grenades.dm
+++ b/code/game/objects/items/weapons/grenades.dm
@@ -502,15 +502,6 @@ CRITTER GRENADE
/obj/item/weapon/spawnergrenade/spesscarp
name = "carp delivery grenade"
- spawner_type = /obj/effect/critter/spesscarp
+ spawner_type = /mob/living/simple_animal/carp
deliveryamt = 5
- origin_tech = "materials=3;magnets=4;syndicate=4"
-
-/obj/item/weapon/spawnergrenade/elitespesscarp
- name = "elite carp delivery grenade"
- spawner_type = /obj/effect/critter/spesscarp/elite
- deliveryamt = 2
- origin_tech = "materials=3;magnets=4;syndicate=4"
-
-
-
+ origin_tech = "materials=3;magnets=4;syndicate=4"
\ No newline at end of file
diff --git a/code/game/objects/storage/storage.dm b/code/game/objects/storage/storage.dm
index da4ee2a8839..ac539a5ab1c 100644
--- a/code/game/objects/storage/storage.dm
+++ b/code/game/objects/storage/storage.dm
@@ -184,7 +184,7 @@
user << "\blue You put the [W] into [src]."
else if (M in range(1)) //If someone is standing close enough, they can tell what it is...
M.show_message(text("\blue [user] puts [W] into [src]."))
- else if (W.w_class >= 3.0) //Otherwise they can only see large or normal items from a distance...
+ else if (W && W.w_class >= 3.0) //Otherwise they can only see large or normal items from a distance...
M.show_message(text("\blue [user] puts [W] into [src]."))
return
diff --git a/code/modules/chemical/Chemistry-Tools.dm b/code/modules/chemical/Chemistry-Tools.dm
index 91a1ed27eaf..63cc30de497 100644
--- a/code/modules/chemical/Chemistry-Tools.dm
+++ b/code/modules/chemical/Chemistry-Tools.dm
@@ -457,11 +457,12 @@
for(var/mob/living/carbon/M in D.loc)
if(!istype(M,/mob/living/carbon)) continue
if(M == user) continue
- //Syring gune attack logging by Yvarov
+ //Syringe gun attack logging by Yvarov
var/R
- for(var/datum/reagent/A in D.reagents.reagent_list)
- R += A.id + " ("
- R += num2text(A.volume) + "),"
+ if(D.reagents)
+ for(var/datum/reagent/A in D.reagents.reagent_list)
+ R += A.id + " ("
+ R += num2text(A.volume) + "),"
if (istype(M, /mob))
M.attack_log += "\[[time_stamp()]\] [user]/[user.ckey] shot [M]/[M.ckey] with a syringegun ([R])"
user.attack_log += "\[[time_stamp()]\] [user]/[user.ckey] shot [M]/[M.ckey] with a syringegun ([R])"
@@ -469,10 +470,11 @@
else
M.attack_log += "\[[time_stamp()]\] UNKNOWN SUBJECT (No longer exists) shot [M]/[M.ckey] with a syringegun ([R])"
log_attack("UNKNOWN shot [M] ([M.ckey]) with a syringegun ([R])")
- D.reagents.trans_to(M, 15)
+ if(D.reagents)
+ D.reagents.trans_to(M, 15)
M.take_organ_damage(5)
for(var/mob/O in viewers(world.view, D))
- O.show_message(text("\red [] is hit by the syringe!", M.name), 1)
+ O.show_message("\red [M.name] is hit by the syringe!", 1)
del(D)
if(D)
diff --git a/code/modules/critters/critters.dm b/code/modules/critters/critters.dm
index 6c389d36259..d3538151b85 100644
--- a/code/modules/critters/critters.dm
+++ b/code/modules/critters/critters.dm
@@ -40,41 +40,6 @@
..()
del(src)
-
-/obj/effect/critter/killertomato
- name = "killer tomato"
- desc = "Oh shit, you're really fucked now."
- icon_state = "killertomato"
- health = 15
- max_health = 15
- aggressive = 1
- defensive = 0
- wanderer = 1
- atkcarbon = 1
- atksilicon = 1
- firevuln = 2
- brutevuln = 2
-
-
- Harvest(var/obj/item/weapon/W, var/mob/living/user)
- if(..())
- var/success = 0
- if(istype(W, /obj/item/weapon/butch))
- new /obj/item/weapon/reagent_containers/food/snacks/tomatomeat(src)
- success = 1
- if(istype(W, /obj/item/weapon/kitchenknife))
- new /obj/item/weapon/reagent_containers/food/snacks/tomatomeat(src)
- new /obj/item/weapon/reagent_containers/food/snacks/tomatomeat(src)
- success = 1
- if(success)
- for(var/mob/O in viewers(src, null))
- O.show_message("\red [user.name] cuts apart the [src.name]!", 1)
- del(src)
- return 1
- return 0
-
-
-
/obj/effect/critter/spore
name = "plasma spore"
desc = "A barely intelligent colony of organisms. Very volatile."
@@ -147,105 +112,6 @@
-/obj/effect/critter/spesscarp
- name = "Spess Carp"
- desc = "A ferocious, fang-bearing creature that resembles a fish."
- icon_state = "spesscarp"
- health = 25
- max_health = 25
- aggressive = 1
- defensive = 1
- wanderer = 1
- atkcarbon = 1
- atksilicon = 1
- atkcritter = 1
- atkmech = 1
- firevuln = 2
- brutevuln = 1
- melee_damage_lower = 5
- melee_damage_upper = 15
- angertext = "lunges"
- attacktext = "bites"
- attack_sound = 'bite.ogg'
- attack_speed = 10
- var/stunchance = 10 // chance to tackle things down
-
-
-
- Harvest(var/obj/item/weapon/W, var/mob/living/user)
- if(..())
- var/success = 0
- if(istype(W, /obj/item/weapon/butch))
- new/obj/item/weapon/reagent_containers/food/snacks/carpmeat(src.loc)
- new/obj/item/weapon/reagent_containers/food/snacks/carpmeat(src.loc)
- success = 1
- if(istype(W, /obj/item/weapon/kitchenknife))
- new/obj/item/weapon/reagent_containers/food/snacks/carpmeat(src.loc)
- success = 1
- if(success)
- for(var/mob/O in viewers(src, null))
- O.show_message("\red [user.name] cuts apart the [src.name]!", 1)
- del(src)
- return 1
- return 0
-
- AfterAttack(var/mob/living/target)
- if(prob(stunchance))
- if(target.weakened <= 0)
- target.Weaken(rand(10, 15))
- for(var/mob/O in viewers(src, null))
- O.show_message("\red [src] knocks down [target]!", 1)
- playsound(loc, 'pierce.ogg', 25, 1, -1)
-
-
-
-/obj/effect/critter/spesscarp/elite
- desc = "Oh shit, you're really fucked now. It has an evil gleam in its eye."
- health = 50
- max_health = 50
- melee_damage_lower = 20
- melee_damage_upper = 35
- stunchance = 15
- attack_speed = 7
-// opensdoors = 1 would give all access dono if want
-
-
-
-/obj/effect/critter/walkingmushroom
- name = "Walking Mushroom"
- desc = "A...huge...mushroom...with legs!?"
- icon_state = "walkingmushroom"
- health = 15
- max_health = 15
- aggressive = 0
- defensive = 0
- wanderer = 1
- atkcarbon = 0
- atksilicon = 0
- firevuln = 2
- brutevuln = 1
- wanderspeed = 1
-
-
- Harvest(var/obj/item/weapon/W, var/mob/living/user)
- if(..())
- var/success = 0
- if(istype(W, /obj/item/weapon/butch))
- new /obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice(src.loc)
- new /obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice(src.loc)
- success = 1
- if(istype(W, /obj/item/weapon/kitchenknife))
- new /obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice(src.loc)
- success = 1
- if(success)
- for(var/mob/O in viewers(src, null))
- O.show_message("\red [user.name] cuts apart the [src.name]!", 1)
- del(src)
- return 1
- return 0
-
-
-
/obj/effect/critter/lizard
name = "Lizard"
desc = "A cute tiny lizard."
diff --git a/code/modules/mob/living/simple_animal/bear.dm b/code/modules/mob/living/simple_animal/bear.dm
index d9c3494d4c9..6b0fb8363e2 100644
--- a/code/modules/mob/living/simple_animal/bear.dm
+++ b/code/modules/mob/living/simple_animal/bear.dm
@@ -2,16 +2,16 @@
#define BEAR_STANCE_ALERT 2
#define BEAR_STANCE_ATTACK 3
#define BEAR_STANCE_ATTACKING 4
-#define BEAR_STANCE_TIRED 4
+#define BEAR_STANCE_TIRED 5
//Space bears!
/mob/living/simple_animal/bear
name = "space bear"
desc = "RawrRawr!!"
- icon = 'icons/mob/mob.dmi'
- icon_state = "bearspace"
- icon_living = "bearspace"
- icon_dead = "bear_d"
+ icon_state = "bear"
+ icon_living = "bear"
+ icon_dead = "bear_dead"
+ icon_gib = "bear_gib"
speak = list("RAWR!","Rawr!","GRR!","Growl!")
speak_emote = list("growls", "roars")
emote_hear = list("rawrs","grumbles","grawls")
@@ -25,6 +25,7 @@
response_harm = "pokes the"
stop_automated_movement_when_pulled = 0
+ maxHealth = 60
health = 60
//Space bears aren't affected by atmos.
@@ -53,8 +54,8 @@
..()
if(!stat)
- if( loc && istype(loc,/turf/space) )
- icon_state = "bearspace"
+ if(loc && istype(loc,/turf/space))
+ icon_state = "bear"
else
icon_state = "bearfloor"
@@ -111,12 +112,12 @@
stance = BEAR_STANCE_ALERT
stance_step = 5 //Make it very alert, so it quickly attacks again if a mob returns
return
- if( !(target_mob in viewers(7,src)) )
+ if(!(target_mob in viewers(7,src)))
stance = BEAR_STANCE_ALERT
stance_step = 5 //Make it very alert, so it quickly attacks again if a mob returns
target_mob = null
return
- if( get_dist(src, target_mob) <= 1 ) //Attacking
+ if(get_dist(src, target_mob) <= 1) //Attacking
emote( pick( list("slashes at [target_mob]", "bites [target_mob]") ) )
var/damage = rand(20,30)
@@ -130,7 +131,7 @@
var/mob/living/L = target_mob
L.adjustBruteLoss(damage)
- if( stance_step >= 20 ) //attacks for 20 ticks, then it gets tired and needs to rest
+ if(stance_step >= 20) //attacks for 20 ticks, then it gets tired and needs to rest
emote( "is worn out and needs to rest" )
stance = BEAR_STANCE_TIRED
stance_step = 0
@@ -160,5 +161,5 @@
target_mob = M
..()
-/mob/living/simple_animal/bear/Process_Spacemove(var/check_drift = 0)
+/mob/living/simple_animal/carp/Process_Spacemove(var/check_drift = 0)
return //No drifting in space for space bears!
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/carp.dm b/code/modules/mob/living/simple_animal/carp.dm
new file mode 100644
index 00000000000..993c173f6fe
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/carp.dm
@@ -0,0 +1,93 @@
+#define CARP_STANCE_IDLE 1
+#define CARP_STANCE_ATTACK 2
+#define CARP_STANCE_ATTACKING 3
+
+/mob/living/simple_animal/carp
+ name = "space carp"
+ desc = "A ferocious, fang-bearing creature that resembles a fish."
+ icon_state = "carp"
+ icon_living = "carp"
+ icon_dead = "carp_dead"
+ icon_gib = "carp_gib"
+ speak_chance = 0
+ turns_per_move = 5
+ meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat
+ response_help = "pets the"
+ response_disarm = "gently pushes aside the"
+ response_harm = "hits the"
+
+ stop_automated_movement_when_pulled = 0
+ maxHealth = 25
+ health = 25
+
+ harm_intent_damage = 8
+ melee_damage_lower = 5
+ melee_damage_upper = 15
+ attacktext = "bites"
+ attack_sound = 'bite.ogg'
+
+ //Space carp aren't affected by atmos.
+ min_oxy = 0
+ max_oxy = 0
+ min_tox = 0
+ max_tox = 0
+ min_co2 = 0
+ max_co2 = 0
+ min_n2 = 0
+ max_n2 = 0
+
+ var/stance = CARP_STANCE_IDLE //Used to determine behavior
+ var/stance_step = 0 //Used to delay checks depending on what stance the bear is in
+ var/mob/living/target_mob //Once the bear enters attack stance, it will try to chase this mob. This it to prevent it changing it's mind between multiple mobs.
+
+/mob/living/simple_animal/carp/Life()
+ ..()
+
+ if(!stat)
+ switch(stance)
+ if(CARP_STANCE_IDLE)
+ stop_automated_movement = 0
+ stance_step++
+ if(stance_step > 5)
+ stance_step = 0
+ for( var/mob/living/L in viewers(7,src) )
+ if(iscarp(L)) continue
+ if(!L.stat)
+ emote("gnashes at [L]")
+ stance = CARP_STANCE_ATTACK
+ target_mob = L
+ break
+
+ if(CARP_STANCE_ATTACK) //This one should only be active for one tick
+ stop_automated_movement = 1
+ if(!target_mob || target_mob.stat)
+ stance = CARP_STANCE_IDLE
+ stance_step = 5 //Make it very alert, so it quickly attacks again if a mob returns
+ if(target_mob in viewers(7,src))
+ walk_to(src, target_mob, 1, 3)
+ stance = CARP_STANCE_ATTACKING
+ stance_step = 0
+
+ if(CARP_STANCE_ATTACKING)
+ stop_automated_movement = 1
+ stance_step++
+ if(!target_mob || target_mob.stat)
+ stance = CARP_STANCE_IDLE
+ stance_step = 3 //Make it very alert, so it quickly attacks again if a mob returns
+ target_mob = null
+ return
+ if(!(target_mob in viewers(7,src)))
+ stance = CARP_STANCE_IDLE
+ stance_step = 1
+ target_mob = null
+ return
+ if(get_dist(src, target_mob) <= 1) //Attacking
+ if(isliving(target_mob))
+ var/mob/living/L = target_mob
+ L.attack_animal(src)
+ if(prob(10))
+ L.Weaken(5)
+ L.visible_message("\the [src] knocks down \the [L]!")
+
+/mob/living/simple_animal/carp/Process_Spacemove(var/check_drift = 0)
+ return //No drifting in space for space carp! //original comments do not steal
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/cat.dm b/code/modules/mob/living/simple_animal/cat.dm
index ccb4459f4d9..db4d6f96f78 100644
--- a/code/modules/mob/living/simple_animal/cat.dm
+++ b/code/modules/mob/living/simple_animal/cat.dm
@@ -2,7 +2,6 @@
/mob/living/simple_animal/cat
name = "cat"
desc = "Kitty!!"
- icon = 'icons/mob/mob.dmi'
icon_state = "cat"
icon_living = "cat"
icon_dead = "cat_dead"
@@ -35,7 +34,7 @@
for(var/mob/living/simple_animal/mouse/M in view(1,src))
if(!M.stat)
M.splat()
- emote("SPLATS \the [M]")
+ emote("splats \the [M]")
movement_target = null
stop_automated_movement = 0
break
diff --git a/code/modules/mob/living/simple_animal/corgi.dm b/code/modules/mob/living/simple_animal/corgi.dm
index c1e949c8cd6..0c4173301a5 100644
--- a/code/modules/mob/living/simple_animal/corgi.dm
+++ b/code/modules/mob/living/simple_animal/corgi.dm
@@ -3,7 +3,6 @@
name = "\improper corgi"
real_name = "corgi"
desc = "It's a corgi."
- icon = 'icons/mob/mob.dmi'
icon_state = "corgi"
icon_living = "corgi"
icon_dead = "corgi_dead"
diff --git a/code/modules/mob/living/simple_animal/crab.dm b/code/modules/mob/living/simple_animal/crab.dm
index 5fb148df7cd..caba557fd71 100644
--- a/code/modules/mob/living/simple_animal/crab.dm
+++ b/code/modules/mob/living/simple_animal/crab.dm
@@ -1,9 +1,7 @@
//Look Sir, free crabs!
/mob/living/simple_animal/crab
name = "crab"
- real_name = "crab"
desc = "Free crabs!"
- icon = 'icons/mob/mob.dmi'
icon_state = "crab"
icon_living = "crab"
icon_dead = "crab_dead"
diff --git a/code/modules/mob/living/simple_animal/life.dm b/code/modules/mob/living/simple_animal/life.dm
index 2fd5572e188..6a02b9e0031 100644
--- a/code/modules/mob/living/simple_animal/life.dm
+++ b/code/modules/mob/living/simple_animal/life.dm
@@ -1,12 +1,14 @@
/mob/living/simple_animal
name = "animal"
+ icon = 'icons/mob/animal.dmi'
var/icon_living = ""
var/icon_dead = ""
+ var/icon_gib = null //We only try to show a gibbing animation if this exists.
maxHealth = 20
var/list/speak = list()
var/list/speak_emote = list()// Emotes while speaking IE: Ian [emote], [text] -- Ian barks, "WOOF!". Spoken text is generated from the speak variable.
var/speak_chance = 0
- var/list/emote_hear = list() //EHearable emotes
+ var/list/emote_hear = list() //Hearable emotes
var/list/emote_see = list() //Unlike speak_emote, the list of things in this variable only show by themselves with no spoken text. IE: Ian barks, Ian yaps
health = 20
var/turns_per_move = 1
@@ -232,6 +234,8 @@
..()
/mob/living/simple_animal/gib()
+ if(icon_gib)
+ flick(icon_gib, src)
if(meat_amount && meat_type)
for(var/i = 0; i < meat_amount; i++)
new meat_type(src.loc)
@@ -272,13 +276,13 @@
switch(M.a_intent)
- if ("help")
+ if("help")
if (health > 0)
for(var/mob/O in viewers(src, null))
if ((O.client && !( O.blinded )))
O.show_message("\blue [M] [response_help] [src]")
- if ("grab")
+ if("grab")
if (M == src)
return
if (nopush)
@@ -297,13 +301,13 @@
if ((O.client && !( O.blinded )))
O.show_message(text("\red [] has grabbed [] passively!", M, src), 1)
- if ("hurt")
+ if("hurt")
health -= harm_intent_damage
for(var/mob/O in viewers(src, null))
if ((O.client && !( O.blinded )))
O.show_message("\red [M] [response_harm] [src]")
- if ("disarm")
+ if("disarm")
for(var/mob/O in viewers(src, null))
if ((O.client && !( O.blinded )))
O.show_message("\blue [M] [response_disarm] [src]")
@@ -325,6 +329,13 @@
M.show_message("\blue [user] applies the [MED] on [src]")
else
user << "\blue this [src] is dead, medical items won't bring it back to life."
+ if(meat_type && (stat == DEAD)) //if the animal has a meat, and if it is dead.
+ if(istype(O, /obj/item/weapon/kitchenknife) || istype(O, /obj/item/weapon/butch))
+ new meat_type (get_turf(src))
+ if(prob(95))
+ del(src)
+ return
+ gib()
else
if(O.force)
health -= O.force
diff --git a/code/modules/mob/living/simple_animal/mouse.dm b/code/modules/mob/living/simple_animal/mouse.dm
index 96d0876d637..5cc26f8d754 100644
--- a/code/modules/mob/living/simple_animal/mouse.dm
+++ b/code/modules/mob/living/simple_animal/mouse.dm
@@ -1,8 +1,6 @@
-//Mouse
/mob/living/simple_animal/mouse
name = "mouse"
desc = "It's a nasty, ugly, evil, disease-ridden rodent."
- icon = 'icons/mob/mob.dmi'
icon_state = "mouse_gray"
icon_living = "mouse_gray"
icon_dead = "mouse_gray_dead"
diff --git a/code/modules/mob/living/simple_animal/mushroom.dm b/code/modules/mob/living/simple_animal/mushroom.dm
new file mode 100644
index 00000000000..7db01ad6f9e
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/mushroom.dm
@@ -0,0 +1,14 @@
+/mob/living/simple_animal/mushroom
+ name = "walking mushroom"
+ desc = "It's a massive mushroom... with legs?"
+ icon_state = "mushroom"
+ icon_living = "mushroom"
+ icon_dead = "mushroom_dead"
+ speak_chance = 0
+ turns_per_move = 1
+ health = 5
+ meat_type = /obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice
+ response_help = "pets the"
+ response_disarm = "gently pushes aside the"
+ response_harm = "whacks the"
+ harm_intent_damage = 5
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/tomato.dm b/code/modules/mob/living/simple_animal/tomato.dm
new file mode 100644
index 00000000000..a22dc47fabe
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/tomato.dm
@@ -0,0 +1,16 @@
+/mob/living/simple_animal/tomato
+ name = "tomato"
+ desc = "It's a horrifyingly enormous beef tomato, and it's packing extra beef!"
+ icon_state = "tomato"
+ icon_living = "tomato"
+ icon_dead = "tomato_dead"
+ speak_chance = 0
+ turns_per_move = 5
+ health = 15
+ meat_type = /obj/item/weapon/reagent_containers/food/snacks/tomatomeat
+ response_help = "prods the"
+ response_disarm = "pushes aside the"
+ response_harm = "smacks the"
+ harm_intent_damage = 5
+
+/mob/living/simple_animal/tomato
\ No newline at end of file
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 20cbc191e20..eeb3e68c38d 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -70,6 +70,11 @@
return 1
return 0
+/proc/iscarp(A)
+ if(istype(A, /mob/living/simple_animal/carp))
+ return 1
+ return 0
+
/proc/isAI(A)
if(istype(A, /mob/living/silicon/ai))
return 1
diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi
new file mode 100644
index 00000000000..b713ca36de2
Binary files /dev/null and b/icons/mob/animal.dmi differ
diff --git a/icons/mob/critter.dmi b/icons/mob/critter.dmi
index 67b8bac8a10..d0f3f886f45 100644
Binary files a/icons/mob/critter.dmi and b/icons/mob/critter.dmi differ
diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi
index 56bbd9e7d6b..01bb11f9839 100644
Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ
diff --git a/icons/obj/machines/gateway.dmi b/icons/obj/machines/gateway.dmi
index 06bf9f8f715..36887c2be0e 100644
Binary files a/icons/obj/machines/gateway.dmi and b/icons/obj/machines/gateway.dmi differ
diff --git a/icons/turf/areas.dmi b/icons/turf/areas.dmi
index e81baf2d28b..10492408de1 100644
Binary files a/icons/turf/areas.dmi and b/icons/turf/areas.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 756773258cb..05ceaea53b6 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -5,205 +5,6 @@
// END_INTERNALS
// BEGIN_FILE_DIR
#define FILE_DIR .
-#define FILE_DIR "code"
-#define FILE_DIR "code/ATMOSPHERICS"
-#define FILE_DIR "code/ATMOSPHERICS/components"
-#define FILE_DIR "code/ATMOSPHERICS/components/binary_devices"
-#define FILE_DIR "code/ATMOSPHERICS/components/trinary_devices"
-#define FILE_DIR "code/ATMOSPHERICS/components/unary"
-#define FILE_DIR "code/datums"
-#define FILE_DIR "code/datums/diseases"
-#define FILE_DIR "code/datums/helper_datums"
-#define FILE_DIR "code/datums/spells"
-#define FILE_DIR "code/defines"
-#define FILE_DIR "code/defines/area"
-#define FILE_DIR "code/defines/mob"
-#define FILE_DIR "code/defines/mob/dead"
-#define FILE_DIR "code/defines/mob/living"
-#define FILE_DIR "code/defines/mob/living/carbon"
-#define FILE_DIR "code/defines/mob/living/silicon"
-#define FILE_DIR "code/defines/obj"
-#define FILE_DIR "code/defines/procs"
-#define FILE_DIR "code/defines/tanning"
-#define FILE_DIR "code/FEA"
-#define FILE_DIR "code/game"
-#define FILE_DIR "code/game/area"
-#define FILE_DIR "code/game/asteroid"
-#define FILE_DIR "code/game/gamemodes"
-#define FILE_DIR "code/game/gamemodes/blob"
-#define FILE_DIR "code/game/gamemodes/blob/blobs"
-#define FILE_DIR "code/game/gamemodes/changeling"
-#define FILE_DIR "code/game/gamemodes/cult"
-#define FILE_DIR "code/game/gamemodes/events"
-#define FILE_DIR "code/game/gamemodes/events/holidays"
-#define FILE_DIR "code/game/gamemodes/extended"
-#define FILE_DIR "code/game/gamemodes/malfunction"
-#define FILE_DIR "code/game/gamemodes/meteor"
-#define FILE_DIR "code/game/gamemodes/nuclear"
-#define FILE_DIR "code/game/gamemodes/revolution"
-#define FILE_DIR "code/game/gamemodes/sandbox"
-#define FILE_DIR "code/game/gamemodes/traitor"
-#define FILE_DIR "code/game/gamemodes/wizard"
-#define FILE_DIR "code/game/jobs"
-#define FILE_DIR "code/game/jobs/job"
-#define FILE_DIR "code/game/machinery"
-#define FILE_DIR "code/game/machinery/atmoalter"
-#define FILE_DIR "code/game/machinery/bots"
-#define FILE_DIR "code/game/machinery/computer"
-#define FILE_DIR "code/game/machinery/doors"
-#define FILE_DIR "code/game/machinery/embedded_controller"
-#define FILE_DIR "code/game/machinery/kitchen"
-#define FILE_DIR "code/game/machinery/pipe"
-#define FILE_DIR "code/game/machinery/telecomms"
-#define FILE_DIR "code/game/magic"
-#define FILE_DIR "code/game/magic/cultist"
-#define FILE_DIR "code/game/mecha"
-#define FILE_DIR "code/game/mecha/combat"
-#define FILE_DIR "code/game/mecha/equipment"
-#define FILE_DIR "code/game/mecha/equipment/tools"
-#define FILE_DIR "code/game/mecha/equipment/weapons"
-#define FILE_DIR "code/game/mecha/medical"
-#define FILE_DIR "code/game/mecha/working"
-#define FILE_DIR "code/game/objects"
-#define FILE_DIR "code/game/objects/alien"
-#define FILE_DIR "code/game/objects/closets"
-#define FILE_DIR "code/game/objects/closets/secure"
-#define FILE_DIR "code/game/objects/devices"
-#define FILE_DIR "code/game/objects/devices/PDA"
-#define FILE_DIR "code/game/objects/grenades"
-#define FILE_DIR "code/game/objects/items"
-#define FILE_DIR "code/game/objects/items/weapons"
-#define FILE_DIR "code/game/objects/items/weapons/implants"
-#define FILE_DIR "code/game/objects/radio"
-#define FILE_DIR "code/game/objects/secstorage"
-#define FILE_DIR "code/game/objects/stacks"
-#define FILE_DIR "code/game/objects/storage"
-#define FILE_DIR "code/game/objects/tanks"
-#define FILE_DIR "code/game/vehicles"
-#define FILE_DIR "code/game/vehicles/airtight"
-#define FILE_DIR "code/game/verbs"
-#define FILE_DIR "code/js"
-#define FILE_DIR "code/modules"
-#define FILE_DIR "code/modules/admin"
-#define FILE_DIR "code/modules/admin/DB ban"
-#define FILE_DIR "code/modules/admin/verbs"
-#define FILE_DIR "code/modules/assembly"
-#define FILE_DIR "code/modules/chemical"
-#define FILE_DIR "code/modules/client"
-#define FILE_DIR "code/modules/clothing"
-#define FILE_DIR "code/modules/clothing/glasses"
-#define FILE_DIR "code/modules/clothing/gloves"
-#define FILE_DIR "code/modules/clothing/head"
-#define FILE_DIR "code/modules/clothing/masks"
-#define FILE_DIR "code/modules/clothing/shoes"
-#define FILE_DIR "code/modules/clothing/spacesuits"
-#define FILE_DIR "code/modules/clothing/suits"
-#define FILE_DIR "code/modules/clothing/under"
-#define FILE_DIR "code/modules/clothing/uniforms"
-#define FILE_DIR "code/modules/critters"
-#define FILE_DIR "code/modules/critters/hivebots"
-#define FILE_DIR "code/modules/detectivework"
-#define FILE_DIR "code/modules/flufftext"
-#define FILE_DIR "code/modules/food"
-#define FILE_DIR "code/modules/maps"
-#define FILE_DIR "code/modules/mining"
-#define FILE_DIR "code/modules/mob"
-#define FILE_DIR "code/modules/mob/dead"
-#define FILE_DIR "code/modules/mob/dead/observer"
-#define FILE_DIR "code/modules/mob/living"
-#define FILE_DIR "code/modules/mob/living/blob"
-#define FILE_DIR "code/modules/mob/living/carbon"
-#define FILE_DIR "code/modules/mob/living/carbon/alien"
-#define FILE_DIR "code/modules/mob/living/carbon/alien/humanoid"
-#define FILE_DIR "code/modules/mob/living/carbon/alien/humanoid/caste"
-#define FILE_DIR "code/modules/mob/living/carbon/alien/larva"
-#define FILE_DIR "code/modules/mob/living/carbon/brain"
-#define FILE_DIR "code/modules/mob/living/carbon/human"
-#define FILE_DIR "code/modules/mob/living/carbon/metroid"
-#define FILE_DIR "code/modules/mob/living/carbon/monkey"
-#define FILE_DIR "code/modules/mob/living/silicon"
-#define FILE_DIR "code/modules/mob/living/silicon/ai"
-#define FILE_DIR "code/modules/mob/living/silicon/decoy"
-#define FILE_DIR "code/modules/mob/living/silicon/pai"
-#define FILE_DIR "code/modules/mob/living/silicon/robot"
-#define FILE_DIR "code/modules/mob/living/simple_animal"
-#define FILE_DIR "code/modules/mob/new_player"
-#define FILE_DIR "code/modules/mob/organ"
-#define FILE_DIR "code/modules/paperwork"
-#define FILE_DIR "code/modules/power"
-#define FILE_DIR "code/modules/power/antimatter"
-#define FILE_DIR "code/modules/power/singularity"
-#define FILE_DIR "code/modules/power/singularity/particle_accelerator"
-#define FILE_DIR "code/modules/projectiles"
-#define FILE_DIR "code/modules/projectiles/ammunition"
-#define FILE_DIR "code/modules/projectiles/guns"
-#define FILE_DIR "code/modules/projectiles/guns/energy"
-#define FILE_DIR "code/modules/projectiles/guns/projectile"
-#define FILE_DIR "code/modules/projectiles/projectile"
-#define FILE_DIR "code/modules/recycling"
-#define FILE_DIR "code/modules/research"
-#define FILE_DIR "code/modules/scripting"
-#define FILE_DIR "code/modules/scripting/AST"
-#define FILE_DIR "code/modules/scripting/AST/Operators"
-#define FILE_DIR "code/modules/scripting/Implementations"
-#define FILE_DIR "code/modules/scripting/Interpreter"
-#define FILE_DIR "code/modules/scripting/Parser"
-#define FILE_DIR "code/modules/scripting/Scanner"
-#define FILE_DIR "code/modules/security levels"
-#define FILE_DIR "code/unused"
-#define FILE_DIR "code/unused/beast"
-#define FILE_DIR "code/unused/computer2"
-#define FILE_DIR "code/unused/disease2"
-#define FILE_DIR "code/unused/gamemodes"
-#define FILE_DIR "code/unused/hivebot"
-#define FILE_DIR "code/unused/mining"
-#define FILE_DIR "code/unused/optics"
-#define FILE_DIR "code/unused/pda2"
-#define FILE_DIR "code/unused/powerarmor"
-#define FILE_DIR "code/unused/spacecraft"
-#define FILE_DIR "code/WorkInProgress"
-#define FILE_DIR "code/WorkInProgress/carn"
-#define FILE_DIR "code/WorkInProgress/mapload"
-#define FILE_DIR "code/WorkInProgress/organs"
-#define FILE_DIR "code/WorkInProgress/virus2"
-#define FILE_DIR "html"
-#define FILE_DIR "icons"
-#define FILE_DIR "icons/48x48"
-#define FILE_DIR "icons/effects"
-#define FILE_DIR "icons/mecha"
-#define FILE_DIR "icons/misc"
-#define FILE_DIR "icons/mob"
-#define FILE_DIR "icons/obj"
-#define FILE_DIR "icons/obj/assemblies"
-#define FILE_DIR "icons/obj/atmospherics"
-#define FILE_DIR "icons/obj/clothing"
-#define FILE_DIR "icons/obj/doors"
-#define FILE_DIR "icons/obj/machines"
-#define FILE_DIR "icons/obj/pipes"
-#define FILE_DIR "icons/pda_icons"
-#define FILE_DIR "icons/spideros_icons"
-#define FILE_DIR "icons/Testing"
-#define FILE_DIR "icons/turf"
-#define FILE_DIR "icons/unused"
-#define FILE_DIR "icons/vehicles"
-#define FILE_DIR "icons/vending_icons"
-#define FILE_DIR "interface"
-#define FILE_DIR "maps"
-#define FILE_DIR "maps/RandomZLevels"
-#define FILE_DIR "sound"
-#define FILE_DIR "sound/AI"
-#define FILE_DIR "sound/ambience"
-#define FILE_DIR "sound/effects"
-#define FILE_DIR "sound/hallucinations"
-#define FILE_DIR "sound/items"
-#define FILE_DIR "sound/machines"
-#define FILE_DIR "sound/mecha"
-#define FILE_DIR "sound/misc"
-#define FILE_DIR "sound/piano"
-#define FILE_DIR "sound/voice"
-#define FILE_DIR "sound/weapons"
-#define FILE_DIR "tools"
-#define FILE_DIR "tools/Redirector"
// END_FILE_DIR
// BEGIN_PREFERENCES
@@ -1050,14 +851,17 @@
#include "code\modules\mob\living\silicon\robot\wires.dm"
#include "code\modules\mob\living\simple_animal\bear.dm"
#include "code\modules\mob\living\simple_animal\behemoth.dm"
+#include "code\modules\mob\living\simple_animal\carp.dm"
#include "code\modules\mob\living\simple_animal\cat.dm"
#include "code\modules\mob\living\simple_animal\constructs.dm"
#include "code\modules\mob\living\simple_animal\corgi.dm"
#include "code\modules\mob\living\simple_animal\crab.dm"
#include "code\modules\mob\living\simple_animal\life.dm"
#include "code\modules\mob\living\simple_animal\mouse.dm"
+#include "code\modules\mob\living\simple_animal\mushroom.dm"
#include "code\modules\mob\living\simple_animal\parrot.dm"
#include "code\modules\mob\living\simple_animal\shade.dm"
+#include "code\modules\mob\living\simple_animal\tomato.dm"
#include "code\modules\mob\living\simple_animal\update_icons.dm"
#include "code\modules\mob\living\simple_animal\worm.dm"
#include "code\modules\mob\new_player\hud.dm"