"
- if(inventory_head)
- dat += "
Head: [inventory_head] (Remove)"
- else
- dat += "
Head: Nothing"
- if(inventory_back)
- dat += "
Back: [inventory_back] (Remove)"
- else
- dat += "
Back: Nothing"
-
- user << browse(dat, text("window=mob[];size=325x500", name))
- onclose(user, "mob[real_name]")
- return
-
-/mob/living/simple_animal/corgi/attackby(var/obj/item/O as obj, var/mob/user as mob)
- if(inventory_head && inventory_back)
- //helmet and armor = 100% protection
- if( istype(inventory_head,/obj/item/clothing/head/helmet) && istype(inventory_back,/obj/item/clothing/suit/armor) )
- if( O.force )
- usr << "\red This animal is wearing too much armor. You can't cause /him any damage."
- for (var/mob/M in viewers(src, null))
- M.show_message("\red \b [user] hits [src] with the [O], however [src] is too armored.")
- else
- usr << "\red This animal is wearing too much armor. You can't reach its skin."
- for (var/mob/M in viewers(src, null))
- M.show_message("\red [user] gently taps [src] with the [O]. ")
- if(prob(15))
- visible_emote("looks at [user] with [pick("an amused","an annoyed","a confused","a resentful", "a happy", "an excited")] expression on \his face")
- return
- ..()
-
-/mob/living/simple_animal/corgi/Topic(href, href_list)
- if(usr.stat) return
-
- //Removing from inventory
- if(href_list["remove_inv"])
- if(!Adjacent(usr) || !(ishuman(usr) || issmall(usr) || isrobot(usr) || isalienadult(usr)))
- return
- var/remove_from = href_list["remove_inv"]
- switch(remove_from)
- if("head")
- if(inventory_head)
- name = real_name
- desc = initial(desc)
- speak = list("YAP", "Woof!", "Bark!", "AUUUUUU")
- speak_emote = list("barks", "woofs")
- emote_hear = list("barks", "woofs", "yaps","pants")
- emote_see = list("shakes its head", "shivers")
- desc = "It's a corgi."
- SetLuminosity(0)
- inventory_head.loc = src.loc
- inventory_head = null
- else
- usr << "\red There is nothing to remove from its [remove_from]."
- return
- if("back")
- if(inventory_back)
- inventory_back.loc = src.loc
- inventory_back = null
- else
- usr << "\red There is nothing to remove from its [remove_from]."
- return
-
- //show_inv(usr) //Commented out because changing Ian's name and then calling up his inventory opens a new inventory...which is annoying.
-
- //Adding things to inventory
- else if(href_list["add_inv"])
- if(!Adjacent(usr) || !(ishuman(usr) || issmall(usr) || isrobot(usr) || isalienadult(usr)))
- return
- var/add_to = href_list["add_inv"]
- if(!usr.get_active_hand())
- usr << "\red You have nothing in your hand to put on its [add_to]."
- return
- switch(add_to)
- if("head")
- if(inventory_head)
- usr << "\red It's is already wearing something."
- return
- else
- place_on_head(usr.get_active_hand())
-
- var/obj/item/item_to_add = usr.get_active_hand()
- if(!item_to_add)
- return
-
- //Corgis are supposed to be simpler, so only a select few objects can actually be put
- //to be compatible with them. The objects are below.
- //Many hats added, Some will probably be removed, just want to see which ones are popular.
-
- var/list/allowed_types = list(
- /obj/item/clothing/head/helmet,
- /obj/item/clothing/glasses/sunglasses,
- /obj/item/clothing/head/caphat,
- /obj/item/clothing/head/collectable/captain,
- /obj/item/clothing/head/that,
- /obj/item/clothing/head/that,
- /obj/item/clothing/head/kitty,
- /obj/item/clothing/head/collectable/kitty,
- /obj/item/clothing/head/rabbitears,
- /obj/item/clothing/head/collectable/rabbitears,
- /obj/item/clothing/head/beret,
- /obj/item/clothing/head/collectable/beret,
- /obj/item/clothing/head/det_hat,
- /obj/item/clothing/head/nursehat,
- /obj/item/clothing/head/pirate,
- /obj/item/clothing/head/collectable/pirate,
- /obj/item/clothing/head/ushanka,
- /obj/item/clothing/head/chefhat,
- /obj/item/clothing/head/collectable/chef,
- /obj/item/clothing/head/collectable/police,
- /obj/item/clothing/head/wizard/fake,
- /obj/item/clothing/head/wizard,
- /obj/item/clothing/head/collectable/wizard,
- /obj/item/clothing/head/hardhat,
- /obj/item/clothing/head/collectable/hardhat,
- /obj/item/clothing/head/hardhat/white,
- /obj/item/weapon/bedsheet,
- /obj/item/clothing/head/helmet/space/santahat,
- /obj/item/clothing/head/collectable/paper,
- /obj/item/clothing/head/soft
- )
-
- if( ! ( item_to_add.type in allowed_types ) )
- usr << "\red It doesn't seem too keen on wearing that item."
- return
-
- usr.drop_item()
-
- place_on_head(item_to_add)
-
- if("back")
- if(inventory_back)
- usr << "\red It's already wearing something."
- return
- else
- var/obj/item/item_to_add = usr.get_active_hand()
- if(!item_to_add)
- return
-
- //Corgis are supposed to be simpler, so only a select few objects can actually be put
- //to be compatible with them. The objects are below.
-
- var/list/allowed_types = list(
- /obj/item/clothing/suit/armor/vest,
- /obj/item/device/radio
- )
-
- if( ! ( item_to_add.type in allowed_types ) )
- usr << "\red This object won't fit."
- return
-
- usr.drop_item()
- item_to_add.loc = src
- src.inventory_back = item_to_add
- regenerate_icons()
-
- //show_inv(usr) //Commented out because changing Ian's name and then calling up his inventory opens a new inventory...which is annoying.
- else
- ..()
-
-/mob/living/simple_animal/corgi/proc/place_on_head(obj/item/item_to_add)
- item_to_add.loc = src
- src.inventory_head = item_to_add
- regenerate_icons()
-
- //Various hats and items (worn on his head) change Ian's behaviour. His attributes are reset when a HAT is removed.
- switch(inventory_head && inventory_head.type)
- if(/obj/item/clothing/head/caphat, /obj/item/clothing/head/collectable/captain)
- name = "Captain [real_name]"
- desc = "Probably better than the last captain."
- if(/obj/item/clothing/head/kitty, /obj/item/clothing/head/collectable/kitty)
- name = "Runtime"
- emote_see = list("coughs up a furball", "stretches")
- emote_hear = list("purrs")
- speak = list("Purrr", "Meow!", "MAOOOOOW!", "HISSSSS", "MEEEEEEW")
- desc = "It's a cute little kitty-cat! ... wait ... what the hell?"
- if(/obj/item/clothing/head/rabbitears, /obj/item/clothing/head/collectable/rabbitears)
- name = "Hoppy"
- emote_see = list("twitches its nose", "hops around a bit")
- desc = "This is hoppy. It's a corgi-...urmm... bunny rabbit"
- if(/obj/item/clothing/head/beret, /obj/item/clothing/head/collectable/beret)
- name = "Yann"
- desc = "Mon dieu! C'est un chien!"
- speak = list("le woof!", "le bark!", "JAPPE!!")
- emote_see = list("cowers in fear", "surrenders", "plays dead","looks as though there is a wall in front of him")
- if(/obj/item/clothing/head/det_hat)
- name = "Detective [real_name]"
- desc = "[name] sees through your lies..."
- emote_see = list("investigates the area","sniffs around for clues","searches for scooby snacks")
- if(/obj/item/clothing/head/nursehat)
- name = "Nurse [real_name]"
- desc = "[name] needs 100cc of beef jerky...STAT!"
- if(/obj/item/clothing/head/pirate, /obj/item/clothing/head/collectable/pirate)
- name = "[pick("Ol'","Scurvy","Black","Rum","Gammy","Bloody","Gangrene","Death","Long-John")] [pick("kibble","leg","beard","tooth","poop-deck","Threepwood","Le Chuck","corsair","Silver","Crusoe")]"
- desc = "Yaarghh!! Thar' be a scurvy dog!"
- emote_see = list("hunts for treasure","stares coldly...","gnashes his tiny corgi teeth")
- emote_hear = list("growls ferociously", "snarls")
- speak = list("Arrrrgh!!","Grrrrrr!")
- if(/obj/item/clothing/head/ushanka)
- name = "[pick("Comrade","Commissar","Glorious Leader")] [real_name]"
- desc = "A follower of Karl Barx."
- emote_see = list("contemplates the failings of the capitalist economic model", "ponders the pros and cons of vangaurdism")
- if(/obj/item/clothing/head/collectable/police)
- name = "Officer [real_name]"
- emote_see = list("drools","looks for donuts")
- desc = "Stop right there criminal scum!"
- if(/obj/item/clothing/head/wizard/fake, /obj/item/clothing/head/wizard, /obj/item/clothing/head/collectable/wizard)
- name = "Grandwizard [real_name]"
- speak = list("YAP", "Woof!", "Bark!", "AUUUUUU", "EI NATH!")
- if(/obj/item/weapon/bedsheet)
- name = "\improper Ghost"
- speak = list("WoooOOOooo~","AUUUUUUUUUUUUUUUUUU")
- emote_see = list("stumbles around", "shivers")
- emote_hear = list("howls","groans")
- desc = "Spooky!"
- if(/obj/item/clothing/head/helmet/space/santahat)
- name = "Rudolph the Red-Nosed Corgi"
- emote_hear = list("barks christmas songs", "yaps")
- desc = "He has a very shiny nose."
- SetLuminosity(6)
- if(/obj/item/clothing/head/soft)
- name = "Corgi Tech [real_name]"
- desc = "The reason your yellow gloves have chew-marks."
-*/
-
-
//IAN! SQUEEEEEEEEE~
/mob/living/simple_animal/corgi/Ian
name = "Ian"
@@ -325,44 +90,6 @@
name = "Corgi meat"
desc = "Tastes like... well you know..."
-/mob/living/simple_animal/corgi/Ian/Bump(atom/movable/AM as mob|obj, yes)
-
- spawn( 0 )
- if ((!( yes ) || now_pushing))
- return
- now_pushing = 1
- if(ismob(AM))
- var/mob/tmob = AM
- if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations))
- if(prob(70))
- src << "\red You fail to push [tmob]'s fat ass out of the way."
- now_pushing = 0
- return
- if(!(tmob.status_flags & CANPUSH))
- now_pushing = 0
- return
-
- tmob.LAssailant = src
- now_pushing = 0
- ..()
- if (!( istype(AM, /atom/movable) ))
- return
- if (!( now_pushing ))
- now_pushing = 1
- if (!( AM.anchored ))
- var/t = get_dir(src, AM)
- if (istype(AM, /obj/structure/window))
- var/obj/structure/window/W = AM
- if(W.is_full_window())
- for(var/obj/structure/window/win in get_step(AM,t))
- now_pushing = 0
- return
- step(AM, t)
- now_pushing = null
- return
- return
-//PC stuff-Sieve
-
/mob/living/simple_animal/corgi/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri
if(istype(O, /obj/item/weapon/newspaper))
if(!stat)
diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
index ca0b4e173a9..b7e72da0c6f 100644
--- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
@@ -125,7 +125,7 @@
udder.add_reagent("milk", rand(5, 10))
/mob/living/simple_animal/cow/attack_hand(mob/living/carbon/M as mob)
- if(!stat && M.a_intent == "disarm" && icon_state != icon_dead)
+ if(!stat && M.a_intent == I_DISARM && icon_state != icon_dead)
M.visible_message("[M] tips over [src].","You tip over [src].")
Weaken(30)
icon_state = icon_dead
diff --git a/code/modules/mob/living/simple_animal/friendly/slime.dm b/code/modules/mob/living/simple_animal/friendly/slime.dm
index 9674517a4ce..dab2d2e2d90 100644
--- a/code/modules/mob/living/simple_animal/friendly/slime.dm
+++ b/code/modules/mob/living/simple_animal/friendly/slime.dm
@@ -14,43 +14,6 @@
emote_see = list("jiggles", "bounces in place")
var/colour = "grey"
-/mob/living/simple_animal/slime/Bump(atom/movable/AM as mob|obj, yes)
-
- spawn( 0 )
- if ((!( yes ) || now_pushing))
- return
- now_pushing = 1
- if(ismob(AM))
- var/mob/tmob = AM
- if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations))
- if(prob(70))
- src << "\red You fail to push [tmob]'s fat ass out of the way."
- now_pushing = 0
- return
- if(!(tmob.status_flags & CANPUSH))
- now_pushing = 0
- return
-
- tmob.LAssailant = src
- now_pushing = 0
- ..()
- if (!( istype(AM, /atom/movable) ))
- return
- if (!( now_pushing ))
- now_pushing = 1
- if (!( AM.anchored ))
- var/t = get_dir(src, AM)
- if (istype(AM, /obj/structure/window))
- var/obj/structure/window/W = AM
- if(W.is_full_window())
- for(var/obj/structure/window/win in get_step(AM,t))
- now_pushing = 0
- return
- step(AM, t)
- now_pushing = null
- return
- return
-
/mob/living/simple_animal/adultslime
name = "pet slime"
desc = "A lovable, domesticated slime."
diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm
index 447ad6b1c9c..27b43a7cc3a 100644
--- a/code/modules/mob/living/simple_animal/hostile/alien.dm
+++ b/code/modules/mob/living/simple_animal/hostile/alien.dm
@@ -17,7 +17,7 @@
melee_damage_lower = 25
melee_damage_upper = 25
attacktext = "slashed"
- a_intent = "harm"
+ a_intent = I_HURT
attack_sound = 'sound/weapons/bladeslice.ogg'
min_oxy = 0
max_oxy = 0
@@ -29,7 +29,7 @@
max_n2 = 0
unsuitable_atoms_damage = 15
faction = "alien"
- wall_smash = 1
+ environment_smash = 2
status_flags = CANPUSH
minbodytemp = 0
heat_damage_per_tick = 20
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
index cdaf72f6bd1..5a6a7e57688 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
@@ -13,7 +13,7 @@
speak = list("HONK", "Honk!", "Welcome to clown planet!")
emote_see = list("honks")
speak_chance = 1
- a_intent = "harm"
+ a_intent = I_HURT
stop_automated_movement_when_pulled = 0
maxHealth = 75
health = 75
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm
index c6d3052b5d0..872eb95b612 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm
@@ -15,7 +15,7 @@
response_harm = "hits"
speak = list("ALERT.","Hostile-ile-ile entities dee-twhoooo-wected.","Threat parameterszzzz- szzet.","Bring sub-sub-sub-systems uuuup to combat alert alpha-a-a.")
emote_see = list("beeps menacingly","whirrs threateningly","scans its immediate vicinity")
- a_intent = "harm"
+ a_intent = I_HURT
stop_automated_movement_when_pulled = 0
health = 300
maxHealth = 300
diff --git a/code/modules/mob/living/simple_animal/hostile/russian.dm b/code/modules/mob/living/simple_animal/hostile/russian.dm
index b96a615170c..84f1c6f27a8 100644
--- a/code/modules/mob/living/simple_animal/hostile/russian.dm
+++ b/code/modules/mob/living/simple_animal/hostile/russian.dm
@@ -18,7 +18,7 @@
melee_damage_lower = 15
melee_damage_upper = 15
attacktext = "punched"
- a_intent = "harm"
+ a_intent = I_HURT
var/corpse = /obj/effect/landmark/mobcorpse/russian
var/weapon1 = /obj/item/weapon/kitchenknife
min_oxy = 5
diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
index c5c87014ecf..12f175cfef7 100644
--- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
@@ -18,7 +18,7 @@
melee_damage_lower = 10
melee_damage_upper = 10
attacktext = "punched"
- a_intent = "harm"
+ a_intent = I_HURT
var/corpse = /obj/effect/landmark/mobcorpse/syndicatesoldier
var/weapon1
var/weapon2
@@ -31,7 +31,7 @@
min_n2 = 0
max_n2 = 0
unsuitable_atoms_damage = 15
- wall_smash = 1
+ environment_smash = 1
faction = "syndicate"
status_flags = CANPUSH
@@ -159,4 +159,4 @@
/mob/living/simple_animal/hostile/viscerator/death()
..(null,"is smashed into pieces!")
- del src
+ del src
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index 9090ab6fe62..5895c42d71e 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -215,7 +215,7 @@
/mob/living/simple_animal/parrot/attack_hand(mob/living/carbon/M as mob)
..()
if(client) return
- if(!stat && M.a_intent == "hurt")
+ if(!stat && M.a_intent == I_HURT)
icon_state = "parrot_fly" //It is going to be flying regardless of whether it flees or attacks
diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm
index c200ef6f703..98db91e7cc3 100644
--- a/code/modules/mob/living/simple_animal/shade.dm
+++ b/code/modules/mob/living/simple_animal/shade.dm
@@ -28,34 +28,20 @@
faction = "cult"
status_flags = CANPUSH
-
- Life()
- ..()
- if(stat == 2)
- new /obj/item/weapon/ectoplasm (src.loc)
- for(var/mob/M in viewers(src, null))
- if((M.client && !( M.blinded )))
- M.show_message("\red [src] lets out a contented sigh as their form unwinds. ")
- ghostize()
- del src
- return
-
-
- attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri
- if(istype(O, /obj/item/device/soulstone))
- O.transfer_soul("SHADE", src, user)
- else
- if(O.force)
- var/damage = O.force
- if (O.damtype == HALLOSS)
- damage = 0
- health -= damage
- for(var/mob/M in viewers(src, null))
- if ((M.client && !( M.blinded )))
- M.show_message("\red \b [src] has been attacked with the [O] by [user]. ")
- else
- usr << "\red This weapon is ineffective, it does no damage."
- for(var/mob/M in viewers(src, null))
- if ((M.client && !( M.blinded )))
- M.show_message("\red [user] gently taps [src] with the [O]. ")
+/mob/living/simple_animal/shade/Life()
+ ..()
+ if(stat == 2)
+ new /obj/item/weapon/ectoplasm (src.loc)
+ for(var/mob/M in viewers(src, null))
+ if((M.client && !( M.blinded )))
+ M.show_message("\red [src] lets out a contented sigh as their form unwinds. ")
+ ghostize()
+ del src
return
+
+
+/mob/living/simple_animal/shade/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri
+ if(istype(O, /obj/item/device/soulstone))
+ O.transfer_soul("SHADE", src, user)
+ return
+ return ..()
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 425295cd2d9..ce78d7f13f3 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -4,6 +4,12 @@
health = 20
maxHealth = 20
+ mob_bump_flag = SIMPLE_ANIMAL
+ mob_swap_flags = MONKEY|SLIME|SIMPLE_ANIMAL
+ mob_push_flags = MONKEY|SLIME|SIMPLE_ANIMAL
+
+ var/show_stat_health = 1 //does the percentage health show in the stat panel for the mob
+
var/icon_living = ""
var/icon_dead = ""
var/icon_gib = null //We only try to show a gibbing animation if this exists.
@@ -52,7 +58,12 @@
var/attacktext = "attacked"
var/attack_sound = null
var/friendly = "nuzzles"
- var/wall_smash = 0
+ var/environment_smash = 0
+ var/resistance = 0 // Damage reduction
+
+ //Null rod stuff
+ var/supernatural = 0
+ var/purge = 0
/mob/living/simple_animal/New()
..()
@@ -88,6 +99,7 @@
handle_stunned()
handle_weakened()
handle_paralysed()
+ handle_supernatural()
//Movement
if(!client && !stop_automated_movement && wander && !anchored)
@@ -186,19 +198,9 @@
adjustBruteLoss(unsuitable_atoms_damage)
return 1
-/mob/living/simple_animal/Bumped(AM as mob|obj)
- if(!AM) return
-
- if(resting || buckled)
- return
-
- if(isturf(src.loc))
- if(ismob(AM))
- var/newamloc = src.loc
- src.loc = AM:loc
- AM:loc = newamloc
- else
- ..()
+/mob/living/simple_animal/proc/handle_supernatural()
+ if(purge)
+ purge -= 1
/mob/living/simple_animal/gib()
..(icon_gib,1)
@@ -225,15 +227,15 @@
switch(M.a_intent)
- if("help")
+ if(I_HELP)
if (health > 0)
M.visible_message("\blue [M] [response_help] \the [src]")
- if("disarm")
+ if(I_DISARM)
M.visible_message("\blue [M] [response_disarm] \the [src]")
//TODO: Push the mob away or something
- if("grab")
+ if(I_GRAB)
if (M == src)
return
if (!(status_flags & CANPUSH))
@@ -249,62 +251,66 @@
M.visible_message("\red [M] has grabbed [src] passively!")
- if("hurt")
+ if(I_HURT)
adjustBruteLoss(harm_intent_damage)
M.visible_message("\red [M] [response_harm] \the [src]")
return
-/mob/living/simple_animal/attackby(var/obj/item/O, var/mob/user) //Marker -Agouri
-
+/mob/living/simple_animal/attackby(var/obj/item/O, var/mob/user)
if(istype(O, /obj/item/stack/medical))
-
- if(stat != DEAD && health < maxHealth)
- var/obj/item/stack/medical/medical_pack = O
- if(medical_pack.use(1))
- adjustBruteLoss(-medical_pack.heal_brute)
- visible_message("\The [user] applies the [medical_pack] to \the [src].")
+ user.changeNext_move(4)
+ if(stat != DEAD)
+ var/obj/item/stack/medical/MED = O
+ if(health < maxHealth)
+ if(MED.amount >= 1)
+ adjustBruteLoss(-MED.heal_brute)
+ MED.amount -= 1
+ if(MED.amount <= 0)
+ del(MED)
+ for(var/mob/M in viewers(src, null))
+ if ((M.client && !( M.blinded )))
+ M.show_message("\The [src] cannot benefit from medical items in \his current state."
- return
-
- else if(istype(O, /obj/item/weapon/kitchenknife) || istype(O, /obj/item/weapon/butch))
- var/actual_meat_amount = max(1,(meat_amount/2))
- if(meat_type && actual_meat_amount>0 && (stat == DEAD))
- for(var/i=0;i