Arokha SA Rework (Polaris)

This commit is contained in:
Arokha Sieyes
2017-03-18 17:57:54 -04:00
committed by Leshana
parent b96ac360a4
commit 88b5756977
52 changed files with 4679 additions and 3988 deletions

View File

@@ -26,11 +26,12 @@
#define BORGXRAY 0x4
#define BORGMATERIAL 8
#define STANCE_IDLE 1
#define STANCE_ALERT 2
#define STANCE_ATTACK 3
#define STANCE_ATTACKING 4
#define STANCE_TIRED 5
#define STANCE_IDLE 1 // Looking for targets if hostile. Does idle wandering.
#define STANCE_ALERT 2 // Bears
#define STANCE_ATTACK 3 // Attempting to get into attack position
#define STANCE_ATTACKING 4 // Doing attacks
#define STANCE_TIRED 5 // Bears
#define STANCE_FOLLOW 6 // Following somone
#define LEFT 1
#define RIGHT 2

View File

@@ -39,7 +39,7 @@
/mob/living/simple_animal/hostile/vore/carp,
/mob/living/simple_animal/hostile/scarybat,
/mob/living/simple_animal/hostile/viscerator,
/mob/living/simple_animal/hostile/retaliate/malf_drone,
/mob/living/simple_animal/hostile/malf_drone,
/mob/living/simple_animal/hostile/giant_spider,
/mob/living/simple_animal/hostile/hivebot,
/mob/living/simple_animal/hostile/diyaab, //Doubt these will get used but might as well,

View File

@@ -22,7 +22,7 @@
"Chick" = /mob/living/simple_animal/chick,
"Crab" = /mob/living/simple_animal/crab,
"Parrot" = /mob/living/simple_animal/parrot,
"Goat" = /mob/living/simple_animal/hostile/retaliate/goat,
"Goat" = /mob/living/simple_animal/retaliate/goat,
"Cat" = /mob/living/simple_animal/cat,
"Kitten" = /mob/living/simple_animal/cat/kitten,
"Corgi" = /mob/living/simple_animal/corgi,

View File

@@ -37,7 +37,16 @@
/obj/machinery/door/airlock/attack_generic(var/mob/user, var/damage)
if(stat & (BROKEN|NOPOWER))
if(damage >= 10)
if(src.density)
if(src.locked || src.welded)
visible_message("<span class='danger'>\The [user] begins breaking into \the [src] internals!</span>")
if(do_after(user,10 SECONDS,src))
src.locked = 0
src.welded = 0
update_icon()
open(1)
if(prob(25))
src.shock(user, 100)
else if(src.density)
visible_message("<span class='danger'>\The [user] forces \the [src] open!</span>")
open(1)
else

View File

@@ -72,7 +72,7 @@
/obj/structure/largecrate/animal/goat
name = "goat crate"
held_type = /mob/living/simple_animal/hostile/retaliate/goat
held_type = /mob/living/simple_animal/retaliate/goat
/obj/structure/largecrate/animal/cat
name = "cat carrier"

View File

@@ -16,7 +16,7 @@
else
num = rand(2,6)
for(var/i=0, i<num, i++)
var/mob/living/simple_animal/hostile/retaliate/malf_drone/D = new(get_turf(pick(possible_spawns)))
var/mob/living/simple_animal/hostile/malf_drone/D = new(get_turf(pick(possible_spawns)))
drones_list.Add(D)
if(prob(25))
D.disabled = rand(15, 60)
@@ -42,7 +42,7 @@
/datum/event/rogue_drone/end()
var/num_recovered = 0
for(var/mob/living/simple_animal/hostile/retaliate/malf_drone/D in drones_list)
for(var/mob/living/simple_animal/hostile/malf_drone/D in drones_list)
var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread()
sparks.set_up(3, 0, D.loc)
sparks.start()

View File

@@ -184,7 +184,7 @@
display_name = "killer tomato plant"
mutants = null
can_self_harvest = 1
has_mob_product = /mob/living/simple_animal/tomato
has_mob_product = /mob/living/simple_animal/hostile/tomato
/datum/seed/tomato/killer/New()
..()

View File

@@ -32,10 +32,6 @@
if(!(language && (language.flags & INNATE))) // skip understanding checks for INNATE languages
if(!say_understands(speaker,language))
if(istype(speaker,/mob/living/simple_animal))
var/mob/living/simple_animal/S = speaker
message = pick(S.speak)
else
if(language)
message = language.scramble(message)
else

View File

@@ -350,6 +350,11 @@
for(var/obj/machinery/door/D in loc)
if(!D.density) continue
if(istype(D, /obj/machinery/door/airlock))
var/obj/machinery/door/airlock/A = D
if(!A.can_open()) return 1
if(istype(D, /obj/machinery/door/window))
if( dir & D.dir ) return !D.check_access(ID)

View File

@@ -6,19 +6,30 @@
icon_living = "alienh_running"
icon_dead = "alien_l"
icon_gib = "syndicate_gib"
faction = "xeno"
cooperative = 1
run_at_them = 0
response_help = "pokes"
response_disarm = "shoves"
response_harm = "hits"
speed = -1
meat_type = /obj/item/weapon/reagent_containers/food/snacks/xenomeat
maxHealth = 100
health = 100
speed = -1
harm_intent_damage = 5
melee_damage_lower = 25
melee_damage_upper = 25
attacktext = "slashed"
a_intent = I_HURT
attack_sound = 'sound/weapons/bladeslice.ogg'
a_intent = I_HURT
environment_smash = 2
status_flags = CANPUSH
min_oxy = 0
max_oxy = 0
min_tox = 0
@@ -27,13 +38,11 @@
max_co2 = 0
min_n2 = 0
max_n2 = 0
unsuitable_atoms_damage = 15
faction = "alien"
environment_smash = 2
status_flags = CANPUSH
minbodytemp = 0
heat_damage_per_tick = 20
unsuitable_atoms_damage = 15
meat_type = /obj/item/weapon/reagent_containers/food/snacks/xenomeat
/mob/living/simple_animal/hostile/alien/drone
name = "alien drone"
@@ -101,14 +110,20 @@
icon_living = "samak"
icon_dead = "samak_dead"
icon = 'icons/jungle.dmi'
move_to_delay = 2
faction = "samak"
maxHealth = 125
health = 125
speed = 2
move_to_delay = 2
melee_damage_lower = 5
melee_damage_upper = 15
attacktext = "mauled"
cold_damage_per_tick = 0
speak_chance = 5
speak = list("Hruuugh!","Hrunnph")
emote_see = list("paws the ground","shakes its mane","stomps")
@@ -122,14 +137,21 @@
icon_living = "diyaab"
icon_dead = "diyaab_dead"
icon = 'icons/jungle.dmi'
move_to_delay = 1
faction = "diyaab"
cooperative = 1
maxHealth = 25
health = 25
speed = 1
move_to_delay = 1
melee_damage_lower = 1
melee_damage_upper = 8
attacktext = "gouged"
cold_damage_per_tick = 0
speak_chance = 5
speak = list("Awrr?","Aowrl!","Worrl")
emote_see = list("sniffs the air cautiously","looks around")
@@ -143,14 +165,20 @@
icon_living = "shantak"
icon_dead = "shantak_dead"
icon = 'icons/jungle.dmi'
move_to_delay = 1
faction = "shantak"
maxHealth = 75
health = 75
speed = 1
move_to_delay = 1
melee_damage_lower = 3
melee_damage_upper = 12
attacktext = "gouged"
cold_damage_per_tick = 0
speak_chance = 5
speak = list("Shuhn","Shrunnph?","Shunpf")
emote_see = list("scratches the ground","shakes out it's mane","tinkles gently")
@@ -163,6 +191,8 @@
icon_dead = "yithian_dead"
icon = 'icons/jungle.dmi'
faction = "yithian"
/mob/living/simple_animal/tindalos
name = "tindalos"
desc = "It looks like a large, flightless grasshopper."
@@ -170,3 +200,5 @@
icon_living = "tindalos"
icon_dead = "tindalos_dead"
icon = 'icons/jungle.dmi'
faction = "tindalos"

View File

@@ -2,20 +2,26 @@
name = "creature"
desc = "A sanity-destroying otherthing."
icon = 'icons/mob/critter.dmi'
speak_emote = list("gibbers")
icon_state = "otherthing"
icon_living = "otherthing"
icon_dead = "otherthing-dead"
faction = "creature"
hostile = 1
retaliate = 1
maxHealth = 40
health = 40
speed = 8
harm_intent_damage = 8
melee_damage_lower = 5
melee_damage_upper = 5
attacktext = "chomped"
attack_sound = 'sound/weapons/bite.ogg'
faction = "creature"
speed = 8
speak_emote = list("gibbers")
/mob/living/simple_animal/hostile/creature/cult
faction = "cult"
@@ -39,7 +45,6 @@
..()
check_horde()
/mob/living/simple_animal/hostile/creature/strong
maxHealth = 160
health = 160
@@ -48,7 +53,6 @@
melee_damage_lower = 8
melee_damage_upper = 25
/mob/living/simple_animal/hostile/creature/strong/cult
faction = "cult"

View File

@@ -1,39 +1,32 @@
//malfunctioning combat drones
/mob/living/simple_animal/hostile/retaliate/malf_drone
/mob/living/simple_animal/hostile/malf_drone
name = "combat drone"
desc = "An automated combat drone armed with state of the art weaponry and shielding."
icon_state = "drone3"
icon_living = "drone3"
icon_dead = "drone_dead"
ranged = 1
rapid = 1
speak_chance = 5
faction = "malf_drone"
hostile = 1
retaliate = 1
turns_per_move = 3
response_help = "pokes"
response_disarm = "gently pushes aside"
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 = I_HURT
stop_automated_movement_when_pulled = 0
health = 300
maxHealth = 300
speed = 8
stop_when_pulled = 0
a_intent = I_HURT
ranged = 1
rapid = 1
projectiletype = /obj/item/projectile/beam/drone
projectilesound = 'sound/weapons/laser3.ogg'
destroy_surroundings = 0
var/datum/effect/effect/system/ion_trail_follow/ion_trail
//the drone randomly switches between these states because it's malfunctioning
var/hostile_drone = 0
//0 - retaliate, only attack enemies that attack it
//1 - hostile, attack everything that comes near
var/turf/patrol_target
var/explode_chance = 1
var/disabled = 0
var/exploding = 0
//Drones aren't affected by atmos.
min_oxy = 0
@@ -46,10 +39,19 @@
max_n2 = 0
minbodytemp = 0
var/has_loot = 1
faction = "malf_drone"
speak_chance = 5
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")
/mob/living/simple_animal/hostile/retaliate/malf_drone/New()
var/datum/effect/effect/system/ion_trail_follow/ion_trail
var/turf/patrol_target
var/explode_chance = 1
var/disabled = 0
var/exploding = 0
var/has_loot = 1
/mob/living/simple_animal/hostile/malf_drone/New()
..()
if(prob(5))
projectiletype = /obj/item/projectile/beam/pulse/drone
@@ -58,17 +60,11 @@
ion_trail.set_up(src)
ion_trail.start()
/mob/living/simple_animal/hostile/retaliate/malf_drone/Process_Spacemove(var/check_drift = 0)
/mob/living/simple_animal/malf_drone/Process_Spacemove(var/check_drift = 0)
return 1
/mob/living/simple_animal/hostile/retaliate/malf_drone/ListTargets()
if(hostile_drone)
return view(src, 10)
else
return ..()
//self repair systems have a chance to bring the drone back to life
/mob/living/simple_animal/hostile/retaliate/malf_drone/Life()
/mob/living/simple_animal/hostile/malf_drone/Life()
//emps and lots of damage can temporarily shut us down
if(disabled > 0)
@@ -99,12 +95,12 @@
//sometimes our targetting sensors malfunction, and we attack anyone nearby
if(prob(disabled ? 0 : 1))
if(hostile_drone)
if(hostile)
src.visible_message("\blue \icon[src] [src] retracts several targetting vanes, and dulls it's running lights.")
hostile_drone = 0
hostile = 0
else
src.visible_message("\red \icon[src] [src] suddenly lights up, and additional targetting vanes slide into place.")
hostile_drone = 1
hostile = 1
if(health / maxHealth > 0.9)
icon_state = "drone3"
@@ -151,18 +147,18 @@
..()
//ion rifle!
/mob/living/simple_animal/hostile/retaliate/malf_drone/emp_act(severity)
/mob/living/simple_animal/hostile/malf_drone/emp_act(severity)
health -= rand(3,15) * (severity + 1)
disabled = rand(150, 600)
hostile_drone = 0
hostile = 0
walk(src,0)
/mob/living/simple_animal/hostile/retaliate/malf_drone/death()
/mob/living/simple_animal/hostile/malf_drone/death()
..(null,"suddenly breaks apart.")
qdel(src)
/mob/living/simple_animal/hostile/retaliate/malf_drone/Destroy()
//some random debris left behind
/mob/living/simple_animal/hostile/malf_drone/Destroy()
//More advanced than the default S_A loot system, for visual effect and random tech levels.
if(has_loot)
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(3, 1, src)

View File

@@ -4,18 +4,24 @@
icon_state = "faithless"
icon_living = "faithless"
icon_dead = "faithless_dead"
speak_chance = 0
faction = "faithless"
hostile = 1
retaliate = 1
turns_per_move = 5
response_help = "passes through"
response_disarm = "shoves"
response_harm = "hits"
speed = 8
maxHealth = 50
health = 50
speed = 8
harm_intent_damage = 10
melee_damage_lower = 5
melee_damage_upper = 5
attacktext = "gripped"
attack_sound = 'sound/hallucinations/growl1.ogg'
@@ -28,19 +34,18 @@
min_n2 = 0
max_n2 = 0
minbodytemp = 0
speed = 4
faction = "faithless"
speak_chance = 0
/mob/living/simple_animal/hostile/faithless/Process_Spacemove(var/check_drift = 0)
return 1
/mob/living/simple_animal/hostile/faithless/FindTarget()
/mob/living/simple_animal/hostile/faithless/set_target()
. = ..()
if(.)
audible_emote("wails at [.]")
audible_emote("wails at [target_mob]")
/mob/living/simple_animal/hostile/faithless/AttackingTarget()
/mob/living/simple_animal/hostile/faithless/PunchTarget()
. = ..()
var/mob/living/L = .
if(istype(L))
@@ -59,9 +64,6 @@
..()
check_horde()
/mob/living/simple_animal/hostile/faithless/strong
maxHealth = 100
health = 100

View File

@@ -1,7 +1,3 @@
/obj/item/projectile/hivebotbullet
damage = 10
damage_type = BRUTE
/mob/living/simple_animal/hostile/hivebot
name = "Hivebot"
desc = "A small robot"
@@ -9,14 +5,22 @@
icon_state = "basic"
icon_living = "basic"
icon_dead = "basic"
faction = "hivebot"
hostile = 1
retaliate = 1
health = 15
maxHealth = 15
speed = 4
melee_damage_lower = 2
melee_damage_upper = 3
attacktext = "clawed"
projectilesound = 'sound/weapons/Gunshot.ogg'
projectiletype = /obj/item/projectile/hivebotbullet
faction = "hivebot"
min_oxy = 0
max_oxy = 0
min_tox = 0
@@ -26,15 +30,13 @@
min_n2 = 0
max_n2 = 0
minbodytemp = 0
speed = 4
/mob/living/simple_animal/hostile/hivebot/range
name = "Hivebot"
desc = "A smallish robot, this one is armed!"
ranged = 1
/mob/living/simple_animal/hostile/hivebot/rapid
ranged = 1
/mob/living/simple_animal/hostile/hivebot/range/rapid
rapid = 1
/mob/living/simple_animal/hostile/hivebot/strong
@@ -43,7 +45,6 @@
health = 80
ranged = 1
/mob/living/simple_animal/hostile/hivebot/death()
..()
visible_message("<b>[src]</b> blows apart!")
@@ -52,7 +53,6 @@
s.set_up(3, 1, src)
s.start()
qdel(src)
return
/mob/living/simple_animal/hostile/hivebot/tele//this still needs work
name = "Beacon"
@@ -60,11 +60,15 @@
icon = 'icons/mob/hivebot.dmi'
icon_state = "def_radar-off"
icon_living = "def_radar-off"
health = 200
maxHealth = 200
status_flags = 0
anchored = 1
wander = 0
stop_automated_movement = 1
var/bot_type = "norm"
var/bot_amt = 10
var/spawn_delay = 600
@@ -93,7 +97,7 @@
if("range")
new /mob/living/simple_animal/hostile/hivebot/range(get_turf(src))
if("rapid")
new /mob/living/simple_animal/hostile/hivebot/rapid(get_turf(src))
new /mob/living/simple_animal/hostile/hivebot/range/rapid(get_turf(src))
spawn(100)
qdel(src)
return
@@ -105,3 +109,6 @@
if(prob(2))//Might be a bit low, will mess with it likely
warpbots()
/obj/item/projectile/hivebotbullet
damage = 10
damage_type = BRUTE

View File

@@ -9,13 +9,16 @@
icon_state = "crate"
icon_living = "crate"
meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat
faction = "mimic"
maxHealth = 250
health = 250
speed = 4
move_to_delay = 8
response_help = "touches"
response_disarm = "pushes"
response_harm = "hits"
speed = 4
maxHealth = 250
health = 250
harm_intent_damage = 5
melee_damage_lower = 8
@@ -33,15 +36,14 @@
max_n2 = 0
minbodytemp = 0
faction = "mimic"
move_to_delay = 8
meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat
/mob/living/simple_animal/hostile/mimic/FindTarget()
/mob/living/simple_animal/hostile/mimic/set_target()
. = ..()
if(.)
audible_emote("growls at [.]")
/mob/living/simple_animal/hostile/mimic/death()
/mob/living/simple_animal/mimic/death()
..()
qdel(src)
@@ -49,7 +51,6 @@
// Crate Mimic
//
// Aggro when you try to open them. Will also pickup loot when spawns and drop it when dies.
/mob/living/simple_animal/hostile/mimic/crate
@@ -75,14 +76,15 @@
/mob/living/simple_animal/hostile/mimic/crate/ListTargets()
if(attempt_open)
return ..()
return view(src, 1)
else
return ..(1)
/mob/living/simple_animal/hostile/mimic/crate/FindTarget()
/mob/living/simple_animal/hostile/mimic/crate/set_target()
. = ..()
if(.)
trigger()
/mob/living/simple_animal/hostile/mimic/crate/AttackingTarget()
/mob/living/simple_animal/hostile/mimic/crate/PunchTarget()
. = ..()
if(.)
icon_state = initial(icon_state)
@@ -105,14 +107,13 @@
icon_state = initial(icon_state)
/mob/living/simple_animal/hostile/mimic/crate/death()
var/obj/structure/closet/crate/C = new(get_turf(src))
// Put loot in crate
for(var/obj/O in src)
O.loc = C
..()
/mob/living/simple_animal/hostile/mimic/crate/AttackingTarget()
/mob/living/simple_animal/hostile/mimic/crate/PunchTarget()
. =..()
var/mob/living/L = .
if(istype(L))
@@ -185,7 +186,7 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca
if(destroy_objects)
..()
/mob/living/simple_animal/hostile/mimic/copy/AttackingTarget()
/mob/living/simple_animal/hostile/mimic/copy/PunchTarget()
. =..()
if(knockdown_people)
var/mob/living/L = .

View File

@@ -6,47 +6,54 @@
icon_state = "shade"
icon_living = "shade"
icon_dead = "shade_dead"
faction = "cult"
maxHealth = 50
health = 50
universal_speak = 1
speak_emote = list("hisses")
emote_hear = list("wails","screeches")
speed = -1
response_help = "puts their hand through"
response_disarm = "flails at"
response_harm = "punches"
melee_damage_lower = 5
melee_damage_upper = 15
attacktext = "drained the life from"
minbodytemp = 0
maxbodytemp = 4000
min_oxy = 0
max_co2 = 0
max_tox = 0
speed = -1
stop_automated_movement = 1
wander = 0
status_flags = 0
faction = "cult"
status_flags = CANPUSH
speak_chance = 5
universal_speak = 1
speak_emote = list("hisses")
emote_hear = list("wails","screeches")
loot_list = list(/obj/item/weapon/ectoplasm = 100)
/mob/living/simple_animal/shade/cultify()
return
/mob/living/simple_animal/shade/Life()
..()
OnDeathInLife()
/mob/living/simple_animal/shade/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri
/mob/living/simple_animal/shade/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(istype(O, /obj/item/device/soulstone))
var/obj/item/device/soulstone/S = O;
S.transfer_soul("SHADE", src, user)
return
..()
/mob/living/simple_animal/shade/proc/OnDeathInLife()
if(stat == 2)
new /obj/item/weapon/ectoplasm (src.loc)
/mob/living/simple_animal/shade/death()
..()
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()
qdel(src)
return

View File

@@ -6,23 +6,26 @@
icon_living = "bat"
icon_dead = "bat_dead"
icon_gib = "bat_dead"
speak_chance = 0
faction = "scarybat"
maxHealth = 20
health = 20
turns_per_move = 3
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
speed = 4
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "hits the"
speed = 4
maxHealth = 20
health = 20
harm_intent_damage = 10
melee_damage_lower = 3
melee_damage_upper = 3
environment_smash = 1
attacktext = "bites"
attack_sound = 'sound/weapons/bite.ogg'
//Space carp aren't affected by atmos.
min_oxy = 0
max_oxy = 0
min_tox = 0
@@ -33,9 +36,8 @@
max_n2 = 0
minbodytemp = 0
environment_smash = 1
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
faction = "scarybat"
var/mob/living/owner
/mob/living/simple_animal/hostile/scarybat/New(loc, mob/living/L as mob)
@@ -44,19 +46,19 @@
owner = L
/mob/living/simple_animal/hostile/scarybat/Process_Spacemove(var/check_drift = 0)
return ..() //No drifting in space for space carp! //original comments do not steal
return ..()
/mob/living/simple_animal/hostile/scarybat/FindTarget()
/mob/living/simple_animal/hostile/scarybat/set_target()
. = ..()
if(.)
emote("flutters towards [.]")
/mob/living/simple_animal/hostile/scarybat/Found(var/atom/A)//This is here as a potential override to pick a specific target if available
if(istype(A) && A == owner)
return 0
return ..()
/mob/living/simple_animal/hostile/scarybat/ListTargets()
. = ..()
if(owner)
return . - owner
/mob/living/simple_animal/hostile/scarybat/AttackingTarget()
/mob/living/simple_animal/hostile/scarybat/PunchTarget()
. =..()
var/mob/living/L = .
if(istype(L))

View File

@@ -6,20 +6,20 @@
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")
emote_see = list("stares ferociously", "stomps")
speak_chance = 1
faction = "russian"
cooperative = 1
maxHealth = 60
health = 60
turns_per_move = 5
see_in_dark = 6
meat_type = /obj/item/weapon/reagent_containers/food/snacks/bearmeat
stop_when_pulled = 0
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "pokes"
stop_automated_movement_when_pulled = 0
maxHealth = 60
health = 60
melee_damage_lower = 20
melee_damage_upper = 30
@@ -33,38 +33,27 @@
min_n2 = 0
max_n2 = 0
minbodytemp = 0
speak_chance = 1
speak = list("RAWR!","Rawr!","GRR!","Growl!")
speak_emote = list("growls", "roars")
emote_hear = list("rawrs","grumbles","grawls")
emote_see = list("stares ferociously", "stomps")
meat_type = /obj/item/weapon/reagent_containers/food/snacks/bearmeat
var/stance_step = 0
faction = "russian"
//SPACE BEARS! SQUEEEEEEEE~ OW! FUCK! IT BIT MY HAND OFF!!
/mob/living/simple_animal/hostile/bear/Hudson
name = "Hudson"
desc = ""
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "pokes"
/mob/living/simple_animal/hostile/bear/Life()
. =..()
if(!.)
return
if(loc && istype(loc,/turf/space))
icon_state = "bear"
else
icon_state = "bearfloor"
/mob/living/simple_animal/hostile/bear/handle_stance()
switch(stance)
if(STANCE_TIRED)
stop_automated_movement = 1
stance_step++
if(stance_step >= 10) //rests for 10 ticks
if(target_mob && target_mob in ListTargets(10))
stance = STANCE_ATTACK //If the mob he was chasing is still nearby, resume the attack, otherwise go idle.
handle_stance(STANCE_ATTACK) //If the mob he was chasing is still nearby, resume the attack, otherwise go idle.
else
stance = STANCE_IDLE
handle_stance(STANCE_IDLE)
if(STANCE_ALERT)
stop_automated_movement = 1
@@ -84,47 +73,38 @@
stance_step--
if(stance_step <= -20) //If we have not found a mob for 20-ish ticks, revert to idle mode
stance = STANCE_IDLE
handle_stance(STANCE_IDLE)
if(stance_step >= 7) //If we have been staring at a mob for 7 ticks,
stance = STANCE_ATTACK
handle_stance(STANCE_ATTACK)
if(STANCE_ATTACKING)
if(stance_step >= 20) //attacks for 20 ticks, then it gets tired and needs to rest
custom_emote(1, "is worn out and needs to rest." )
stance = STANCE_TIRED
handle_stance(STANCE_TIRED)
stance_step = 0
walk(src, 0) //This stops the bear's walking
return
/mob/living/simple_animal/hostile/bear/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(stance != STANCE_ATTACK && stance != STANCE_ATTACKING)
stance = STANCE_ALERT
stance_step = 6
target_mob = user
else
..()
/mob/living/simple_animal/hostile/bear/attack_hand(mob/living/carbon/human/M as mob)
if(stance != STANCE_ATTACK && stance != STANCE_ATTACKING)
stance = STANCE_ALERT
stance_step = 6
target_mob = M
/mob/living/simple_animal/hostile/bear/update_icons()
..()
if(!stat)
if(loc && istype(loc,/turf/space))
icon_state = "bear"
else
icon_state = "bearfloor"
/mob/living/simple_animal/hostile/bear/Process_Spacemove(var/check_drift = 0)
return //No drifting in space for space bears!
return
/mob/living/simple_animal/hostile/bear/FindTarget()
. = ..()
if(.)
custom_emote(1,"stares alertly at [.]")
stance = STANCE_ALERT
handle_stance(STANCE_ALERT)
/mob/living/simple_animal/hostile/bear/LoseTarget()
..(5)
/mob/living/simple_animal/hostile/bear/AttackingTarget()
/mob/living/simple_animal/hostile/bear/PunchTarget()
if(!Adjacent(target_mob))
return
custom_emote(1, pick( list("slashes at [target_mob]", "bites [target_mob]") ) )
@@ -141,32 +121,5 @@
var/mob/living/L = target_mob
L.adjustBruteLoss(damage)
return L
//else if(istype(target_mob,/obj/mecha))
//var/obj/mecha/M = target_mob
//M.attack_animal(src)
//return M
else
..()

View File

@@ -1,5 +1,3 @@
/mob/living/simple_animal/hostile/carp
name = "space carp"
desc = "A ferocious, fang-bearing creature that resembles a fish."
@@ -7,15 +5,19 @@
icon_living = "carp"
icon_dead = "carp_dead"
icon_gib = "carp_gib"
speak_chance = 0
faction = "carp"
hostile = 1
retaliate = 1
maxHealth = 25
health = 25
speed = 4
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"
speed = 4
maxHealth = 25
health = 25
harm_intent_damage = 8
melee_damage_lower = 15
@@ -34,19 +36,17 @@
max_n2 = 0
minbodytemp = 0
break_stuff_probability = 15
faction = "carp"
meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat
/mob/living/simple_animal/hostile/carp/Process_Spacemove(var/check_drift = 0)
return 1 //No drifting in space for space carp! //original comments do not steal
/mob/living/simple_animal/hostile/carp/FindTarget()
/mob/living/simple_animal/hostile/carp/set_target()
. = ..()
if(.)
custom_emote(1,"nashes at [.]")
/mob/living/simple_animal/hostile/carp/AttackingTarget()
/mob/living/simple_animal/hostile/carp/PunchTarget()
. =..()
var/mob/living/L = .
if(istype(L))

View File

@@ -6,59 +6,44 @@
item_state = "cat2"
icon_living = "cat2"
icon_dead = "cat2_dead"
hostile = 1 //To mice, anyway.
investigates = 1
specific_targets = 1 //Only targets with Found()
run_at_them = 0 //DOMESTICATED
view_range = 5
turns_per_move = 5
see_in_dark = 6
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "kicks"
min_oxy = 16 //Require atleast 16kPA oxygen
minbodytemp = 223 //Below -50 Degrees Celcius
maxbodytemp = 323 //Above 50 Degrees Celcius
holder_type = /obj/item/weapon/holder/cat
mob_size = MOB_SMALL
speak_chance = 1
speak = list("Meow!","Esp!","Purr!","HSSSSS")
speak_emote = list("purrs", "meows")
emote_hear = list("meows","mews")
emote_see = list("shakes their head", "shivers")
speak_chance = 1
turns_per_move = 5
see_in_dark = 6
say_maybe_target = list("Meow?","Mew?","Mao?")
say_got_target = list("MEOW!","HSSSS!","REEER!")
meat_amount = 1
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "kicks"
var/turns_since_scan = 0
var/mob/living/simple_animal/mouse/movement_target
var/mob/flee_target
min_oxy = 16 //Require atleast 16kPA oxygen
minbodytemp = 223 //Below -50 Degrees Celcius
maxbodytemp = 323 //Above 50 Degrees Celcius
holder_type = /obj/item/weapon/holder/cat
mob_size = MOB_SMALL
/mob/living/simple_animal/cat/Life()
//MICE!
if((src.loc) && isturf(src.loc))
if(!stat && !resting && !buckled)
for(var/mob/living/simple_animal/mouse/M in loc)
if(!M.stat)
//VOREStation Edit - For cats to eat mice.
animal_nom(M)
sleep(swallowTime)
//M.splat()
//visible_emote(pick("bites \the [M]!","toys with \the [M].","chomps on \the [M]!"))
//VOREStation Edit End.
movement_target = null
stop_automated_movement = 0
break
..()
for(var/mob/living/simple_animal/mouse/snack in oview(src,5))
if(snack.stat < DEAD && prob(15))
audible_emote(pick("hisses and spits!","mrowls fiercely!","eyes [snack] hungrily."))
break
if(!stat && !resting && !buckled)
turns_since_scan++
if (turns_since_scan > 5)
walk_to(src,0)
turns_since_scan = 0
if (flee_target) //fleeing takes precendence
handle_flee_target()
else
handle_movement_target()
. = ..()
if(!.) return
if(prob(2)) //spooky
var/mob/observer/dead/spook = locate() in range(src,5)
@@ -72,104 +57,60 @@
var/atom/A = pick(visible)
visible_emote("suddenly stops and stares at something unseen[istype(A) ? " near [A]":""].")
/mob/living/simple_animal/cat/proc/handle_movement_target()
//if our target is neither inside a turf or inside a human(???), stop
if((movement_target) && !(isturf(movement_target.loc) || ishuman(movement_target.loc) ))
movement_target = null
stop_automated_movement = 0
//if we have no target or our current one is out of sight/too far away
if( !movement_target || !(movement_target.loc in oview(src, 4)) )
movement_target = null
stop_automated_movement = 0
for(var/mob/living/simple_animal/mouse/snack in oview(src)) //search for a new target
if(isturf(snack.loc) && !snack.stat)
movement_target = snack
break
handle_flee_target()
if(movement_target)
stop_automated_movement = 1
walk_to(src,movement_target,0,3)
/mob/living/simple_animal/cat/PunchTarget()
if(istype(target_mob,/mob/living/simple_animal/mouse))
var/mob/living/simple_animal/mouse/mouse = target_mob
mouse.splat()
visible_emote(pick("bites \the [mouse]!","toys with \the [mouse].","chomps on \the [mouse]!"))
return mouse
else
..()
/mob/living/simple_animal/cat/Found(var/atom/found_atom)
if(istype(found_atom,/mob/living/simple_animal/mouse) && SA_attackable(found_atom))
return found_atom
/mob/living/simple_animal/cat/proc/handle_flee_target()
//see if we should stop fleeing
if (flee_target && !(flee_target.loc in view(src)))
if (flee_target && !(flee_target in ListTargets(view_range)))
flee_target = null
stop_automated_movement = 0
GiveUpMoving()
if (flee_target)
if (flee_target && !stat && !buckled)
if (resting)
lay_down()
if(prob(25)) say("HSSSSS")
stop_automated_movement = 1
walk_away(src, flee_target, 7, 2)
/mob/living/simple_animal/cat/proc/set_flee_target(atom/A)
if(A)
/mob/living/simple_animal/cat/react_to_attack(var/atom/A)
if(A == src) return
flee_target = A
turns_since_scan = 5
/mob/living/simple_animal/cat/attackby(var/obj/item/O, var/mob/user)
. = ..()
if(O.force)
set_flee_target(user? user : src.loc)
/mob/living/simple_animal/cat/attack_hand(mob/living/carbon/human/M as mob)
. = ..()
if(M.a_intent == I_HURT)
set_flee_target(M)
/mob/living/simple_animal/cat/ex_act()
. = ..()
set_flee_target(src.loc)
/mob/living/simple_animal/cat/bullet_act(var/obj/item/projectile/proj)
. = ..()
set_flee_target(proj.firer? proj.firer : src.loc)
/mob/living/simple_animal/cat/hitby(atom/movable/AM)
. = ..()
set_flee_target(AM.thrower? AM.thrower : src.loc)
react_to_attack(src.loc)
//Basic friend AI
/mob/living/simple_animal/cat/fluff
var/mob/living/carbon/human/friend
var/befriend_job = null
/mob/living/simple_animal/cat/fluff/handle_movement_target()
if (friend)
var/follow_dist = 4
if (friend.stat >= DEAD || friend.health <= config.health_threshold_softcrit) //danger
follow_dist = 1
else if (friend.stat || friend.health <= 50) //danger or just sleeping
follow_dist = 2
var/near_dist = max(follow_dist - 2, 1)
var/current_dist = get_dist(src, friend)
if (movement_target != friend)
if (current_dist > follow_dist && !istype(movement_target, /mob/living/simple_animal/mouse) && (friend in oview(src)))
//stop existing movement
walk_to(src,0)
turns_since_scan = 0
//walk to friend
stop_automated_movement = 1
movement_target = friend
walk_to(src, movement_target, near_dist, 4)
//already following and close enough, stop
else if (current_dist <= near_dist)
walk_to(src,0)
movement_target = null
stop_automated_movement = 0
if (prob(10))
say("Meow!")
if (!friend || movement_target != friend)
..()
/mob/living/simple_animal/cat/fluff/Life()
..()
if (stat || !friend)
return
if (get_dist(src, friend) <= 1)
. = ..()
if(!. || ai_inactive || !friend) return
var/friend_dist = get_dist(src,friend)
if (friend_dist <= 4)
if(stance == STANCE_IDLE)
if(set_follow(friend))
handle_stance(STANCE_FOLLOW)
if (friend_dist <= 1)
if (friend.stat >= DEAD || friend.health <= config.health_threshold_softcrit)
if (prob((friend.stat < DEAD)? 50 : 15))
var/verb = pick("meows", "mews", "mrowls")
@@ -194,7 +135,6 @@
var/mob/living/carbon/human/H = usr
if(istype(H) && (!befriend_job || H.job == befriend_job))
friend = usr
prey_excludes |= usr //VOREStation Add - Friends not food!
. = 1
else if(usr == friend)
. = 1 //already friends, but show success anyways
@@ -218,7 +158,7 @@
item_state = "cat"
icon_living = "cat"
icon_dead = "cat_dead"
befriend_job = "Chief Medical Officer" //VOREStation Add
befriend_job = "Chief Medical Officer"
/mob/living/simple_animal/cat/kitten
name = "kitten"

View File

@@ -6,19 +6,25 @@
icon_state = "corgi"
icon_living = "corgi"
icon_dead = "corgi_dead"
run_at_them = 0
turns_per_move = 10
response_help = "pets"
response_disarm = "bops"
response_harm = "kicks"
see_in_dark = 5
mob_size = 8
speak_chance = 1
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")
speak_chance = 1
turns_per_move = 10
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/corgi
meat_amount = 3
response_help = "pets"
response_disarm = "bops"
response_harm = "kicks"
see_in_dark = 5
mob_size = 8
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/corgi
var/obj/item/inventory_head
var/obj/item/inventory_back
@@ -38,6 +44,8 @@
/mob/living/simple_animal/corgi/Ian/Life()
..()
//Not replacing with SA FollowTarget mechanics because Ian behaves... very... specifically.
//Feeding, chasing food, FOOOOODDDD
if(!stat && !resting && !buckled)
turns_since_scan++
@@ -205,6 +213,8 @@
icon_living = "tamaskan"
icon_dead = "tamaskan_dead"
retaliate = 1 //Tamaskans are bigass dogs, okay?
/mob/living/simple_animal/corgi/tamaskan/spice
name = "Spice"
real_name = "Spice" //Intended to hold the name without altering it.

View File

@@ -5,31 +5,35 @@
icon_state = "crab"
icon_living = "crab"
icon_dead = "crab_dead"
mob_size = MOB_SMALL
speak_emote = list("clicks")
emote_hear = list("clicks")
emote_see = list("clacks")
speak_chance = 1
wander = 0
stop_automated_movement = 1
turns_per_move = 5
mob_size = MOB_SMALL
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "stomps"
stop_automated_movement = 1
friendly = "pinches"
mob_size = 5
speak_chance = 1
speak_emote = list("clicks")
emote_hear = list("clicks")
emote_see = list("clacks")
var/obj/item/inventory_head
var/obj/item/inventory_mask
/mob/living/simple_animal/crab/Life()
..()
//CRAB movement
//CRAB movement, I'm not porting this up to SA because... "sideways-only movement" var nothanks
if(!ckey && !stat)
if(isturf(src.loc) && !resting && !buckled) //This is so it only moves if it's not inside a closet, gentics machine, etc.
turns_since_move++
if(turns_since_move >= turns_per_move)
lifes_since_move++
if(lifes_since_move >= turns_per_move)
Move(get_step(src,pick(4,8)))
turns_since_move = 0
lifes_since_move = 0
regenerate_icons()
//COFFEE! SQUEEEEEEEEE!

View File

@@ -1,46 +1,44 @@
//goat
/mob/living/simple_animal/hostile/retaliate/goat
/mob/living/simple_animal/retaliate/goat
name = "goat"
desc = "Not known for their pleasant disposition."
icon_state = "goat"
icon_living = "goat"
icon_dead = "goat_dead"
faction = "goat"
health = 40
turns_per_move = 5
see_in_dark = 6
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "kicks"
melee_damage_lower = 1
melee_damage_upper = 5
attacktext = "kicked"
speak_chance = 1
speak = list("EHEHEHEHEH","eh?")
speak_emote = list("brays")
emote_hear = list("brays")
emote_see = list("shakes its head", "stamps a foot", "glares around")
speak_chance = 1
turns_per_move = 5
see_in_dark = 6
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
meat_amount = 4
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "kicks"
faction = "goat"
attacktext = "kicked"
health = 40
melee_damage_lower = 1
melee_damage_upper = 5
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
var/datum/reagents/udder = null
/mob/living/simple_animal/hostile/retaliate/goat/New()
/mob/living/simple_animal/retaliate/goat/New()
udder = new(50)
udder.my_atom = src
..()
/mob/living/simple_animal/hostile/retaliate/goat/Life()
/mob/living/simple_animal/retaliate/goat/Life()
. = ..()
if(.)
//chance to go crazy and start wacking stuff
if(!enemies.len && prob(1))
Retaliate()
if(enemies.len && prob(10))
enemies = list()
LoseTarget()
src.visible_message("\blue [src] calms down.")
if(stat == CONSCIOUS)
if(udder && prob(5))
udder.add_reagent("milk", rand(5, 10))
@@ -60,18 +58,18 @@
var/step = get_step_to(src, food, 0)
Move(step)
/mob/living/simple_animal/hostile/retaliate/goat/Retaliate()
..()
if(stat == CONSCIOUS)
/mob/living/simple_animal/retaliate/goat/react_to_attack()
. = ..()
if(.)
visible_message("<span class='warning'>[src] gets an evil-looking gleam in their eye.</span>")
/mob/living/simple_animal/hostile/retaliate/goat/Move()
/mob/living/simple_animal/retaliate/goat/Move()
..()
if(!stat)
for(var/obj/effect/plant/SV in loc)
SV.die_off(1)
/mob/living/simple_animal/hostile/retaliate/goat/attackby(var/obj/item/O as obj, var/mob/user as mob)
/mob/living/simple_animal/retaliate/goat/attackby(var/obj/item/O as obj, var/mob/user as mob)
var/obj/item/weapon/reagent_containers/glass/G = O
if(stat == CONSCIOUS && istype(G) && G.is_open_container())
user.visible_message("<span class='notice'>[user] milks [src] using \the [O].</span>")
@@ -90,20 +88,25 @@
icon_living = "cow"
icon_dead = "cow_dead"
icon_gib = "cow_gib"
speak = list("moo?","moo","MOOOOOO")
speak_emote = list("moos","moos hauntingly")
emote_hear = list("brays")
emote_see = list("shakes its head")
speak_chance = 1
health = 50
turns_per_move = 5
see_in_dark = 6
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
meat_amount = 6
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "kicks"
attacktext = "kicked"
health = 50
speak_chance = 1
speak = list("moo?","moo","MOOOOOO")
speak_emote = list("moos","moos hauntingly")
emote_hear = list("brays")
emote_see = list("shakes its head")
meat_amount = 6
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
var/datum/reagents/udder = null
/mob/living/simple_animal/cow/New()
@@ -152,22 +155,28 @@
icon_living = "chick"
icon_dead = "chick_dead"
icon_gib = "chick_gib"
speak = list("Cherp.","Cherp?","Chirrup.","Cheep!")
speak_emote = list("cheeps")
emote_hear = list("cheeps")
emote_see = list("pecks at the ground","flaps its tiny wings")
speak_chance = 2
health = 1
turns_per_move = 2
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
meat_amount = 1
pass_flags = PASSTABLE | PASSGRILLE
mob_size = MOB_MINISCULE
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "kicks"
attacktext = "kicked"
health = 1
speak_chance = 2
speak = list("Cherp.","Cherp?","Chirrup.","Cheep!")
speak_emote = list("cheeps")
emote_hear = list("cheeps")
emote_see = list("pecks at the ground","flaps its tiny wings")
meat_amount = 1
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
var/amount_grown = 0
pass_flags = PASSTABLE | PASSGRILLE
mob_size = MOB_MINISCULE
/mob/living/simple_animal/chick/New()
..()
@@ -193,23 +202,28 @@ var/global/chicken_count = 0
icon_state = "chicken"
icon_living = "chicken"
icon_dead = "chicken_dead"
speak = list("Cluck!","BWAAAAARK BWAK BWAK BWAK!","Bwaak bwak.")
speak_emote = list("clucks","croons")
emote_hear = list("clucks")
emote_see = list("pecks at the ground","flaps its wings viciously")
speak_chance = 2
health = 10
turns_per_move = 3
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
meat_amount = 2
pass_flags = PASSTABLE
mob_size = MOB_SMALL
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "kicks"
attacktext = "kicked"
health = 10
speak_chance = 2
speak = list("Cluck!","BWAAAAARK BWAK BWAK BWAK!","Bwaak bwak.")
speak_emote = list("clucks","croons")
emote_hear = list("clucks")
emote_see = list("pecks at the ground","flaps its wings viciously")
meat_amount = 2
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
var/eggsleft = 0
var/body_color
pass_flags = PASSTABLE
mob_size = MOB_SMALL
/mob/living/simple_animal/chicken/New()
..()

View File

@@ -0,0 +1,239 @@
#define SPINNING_WEB 1
#define LAYING_EGGS 2
#define MOVING_TO_TARGET 3
#define SPINNING_COCOON 4
//basic spider mob, these generally guard nests
/mob/living/simple_animal/hostile/giant_spider
name = "giant spider"
desc = "Furry and black, it makes you shudder to look at it. This one has deep red eyes."
icon_state = "guard"
icon_living = "guard"
icon_dead = "guard_dead"
faction = "spiders"
maxHealth = 200
health = 200
pass_flags = PASSTABLE
move_to_delay = 6
speed = 3
stop_when_pulled = 0
turns_per_move = 5
see_in_dark = 10
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "punches"
melee_damage_lower = 15
melee_damage_upper = 20
heat_damage_per_tick = 20
cold_damage_per_tick = 20
speak_chance = 5
speak_emote = list("chitters")
emote_hear = list("chitters")
meat_type = /obj/item/weapon/reagent_containers/food/snacks/xenomeat
var/busy = 0
var/poison_per_bite = 5
var/poison_chance = 10
var/poison_type = "spidertoxin"
//nursemaids - these create webs and eggs
/mob/living/simple_animal/hostile/giant_spider/nurse
desc = "Furry and black, it makes you shudder to look at it. This one has brilliant green eyes."
icon_state = "nurse"
icon_living = "nurse"
icon_dead = "nurse_dead"
maxHealth = 40
health = 40
melee_damage_lower = 5
melee_damage_upper = 10
poison_per_bite = 7
poison_type = "stoxin"
var/fed = 0
var/atom/cocoon_target
//hunters have the most poison and move the fastest, so they can find prey
/mob/living/simple_animal/hostile/giant_spider/hunter
desc = "Furry and black, it makes you shudder to look at it. This one has sparkling purple eyes."
icon_state = "hunter"
icon_living = "hunter"
icon_dead = "hunter_dead"
maxHealth = 120
health = 120
move_to_delay = 4
melee_damage_lower = 10
melee_damage_upper = 20
poison_per_bite = 5
/mob/living/simple_animal/hostile/giant_spider/New(var/location, var/atom/parent)
get_light_and_color(parent)
..()
/mob/living/simple_animal/hostile/giant_spider/PunchTarget()
. = ..()
if(isliving(.))
var/mob/living/L = .
if(L.reagents)
L.reagents.add_reagent(poison_type, poison_per_bite)
if(prob(poison_chance))
L << "<span class='warning'>You feel a tiny prick.</span>"
L.reagents.add_reagent(poison_type, poison_per_bite)
/mob/living/simple_animal/hostile/giant_spider/nurse/PunchTarget()
. = ..()
if(ishuman(.))
var/mob/living/carbon/human/H = .
if(prob(5))
var/obj/item/organ/external/O = pick(H.organs)
if(!(O.robotic >= ORGAN_ROBOT))
var/eggcount
for(var/obj/I in O.implants)
if(istype(I, /obj/effect/spider/eggcluster))
eggcount ++
if(!eggcount)
var/eggs = PoolOrNew(/obj/effect/spider/eggcluster/small, list(O, src))
O.implants += eggs
H << "<span class='warning'>The [src] injects something into your [O.name]!</span>"
/mob/living/simple_animal/hostile/giant_spider/handle_stance()
. = ..()
if(ai_inactive) return
switch(stance)
if(STANCE_IDLE)
//1% chance to skitter madly away
if(!busy && prob(1))
/*var/list/move_targets = list()
for(var/turf/T in orange(20, src))
move_targets.Add(T)*/
stop_automated_movement = 1
walk_to(src, pick(orange(20, src)), 1, move_to_delay)
spawn(5 SECONDS)
stop_automated_movement = 0
walk(src,0)
/mob/living/simple_animal/hostile/giant_spider/nurse/proc/GiveUp(var/C)
spawn(10 SECONDS)
if(busy == MOVING_TO_TARGET)
if(cocoon_target == C && get_dist(src,cocoon_target) > 1)
cocoon_target = null
busy = 0
stop_automated_movement = 0
/mob/living/simple_animal/hostile/giant_spider/nurse/Life()
. = ..()
if(!. || ai_inactive) return
if(stance == STANCE_IDLE)
var/list/can_see = view(src, 10)
//30% chance to stop wandering and do something
if(!busy && prob(30))
//first, check for potential food nearby to cocoon
for(var/mob/living/C in can_see)
if(C.stat)
cocoon_target = C
busy = MOVING_TO_TARGET
walk_to(src, C, 1, move_to_delay)
//give up if we can't reach them after 10 seconds
GiveUp(C)
return
//second, spin a sticky spiderweb on this tile
var/obj/effect/spider/stickyweb/W = locate() in get_turf(src)
if(!W)
busy = SPINNING_WEB
src.visible_message("<span class='notice'>\The [src] begins to secrete a sticky substance.</span>")
stop_automated_movement = 1
spawn(40)
if(busy == SPINNING_WEB)
new /obj/effect/spider/stickyweb(src.loc)
busy = 0
stop_automated_movement = 0
else
//third, lay an egg cluster there
var/obj/effect/spider/eggcluster/E = locate() in get_turf(src)
if(!E && fed > 0)
busy = LAYING_EGGS
src.visible_message("<span class='notice'>\The [src] begins to lay a cluster of eggs.</span>")
stop_automated_movement = 1
spawn(50)
if(busy == LAYING_EGGS)
E = locate() in get_turf(src)
if(!E)
PoolOrNew(/obj/effect/spider/eggcluster, list(loc, src))
fed--
busy = 0
stop_automated_movement = 0
else
//fourthly, cocoon any nearby items so those pesky pinkskins can't use them
for(var/obj/O in can_see)
if(O.anchored)
continue
if(istype(O, /obj/item) || istype(O, /obj/structure) || istype(O, /obj/machinery))
cocoon_target = O
busy = MOVING_TO_TARGET
stop_automated_movement = 1
walk_to(src, O, 1, move_to_delay)
//give up if we can't reach them after 10 seconds
GiveUp(O)
else if(busy == MOVING_TO_TARGET && cocoon_target)
if(get_dist(src, cocoon_target) <= 1)
busy = SPINNING_COCOON
src.visible_message("<span class='notice'>\The [src] begins to secrete a sticky substance around \the [cocoon_target].</span>")
stop_automated_movement = 1
walk(src,0)
spawn(50)
if(busy == SPINNING_COCOON)
if(cocoon_target && istype(cocoon_target.loc, /turf) && get_dist(src,cocoon_target) <= 1)
var/obj/effect/spider/cocoon/C = new(cocoon_target.loc)
var/large_cocoon = 0
C.pixel_x = cocoon_target.pixel_x
C.pixel_y = cocoon_target.pixel_y
for(var/mob/living/M in C.loc)
if(istype(M, /mob/living/simple_animal/hostile/giant_spider))
continue
large_cocoon = 1
fed++
src.visible_message("<span class='warning'>\The [src] sticks a proboscis into \the [cocoon_target] and sucks a viscous substance out.</span>")
M.loc = C
C.pixel_x = M.pixel_x
C.pixel_y = M.pixel_y
break
for(var/obj/item/I in C.loc)
I.loc = C
for(var/obj/structure/S in C.loc)
if(!S.anchored)
S.loc = C
large_cocoon = 1
for(var/obj/machinery/M in C.loc)
if(!M.anchored)
M.loc = C
large_cocoon = 1
if(large_cocoon)
C.icon_state = pick("cocoon_large1","cocoon_large2","cocoon_large3")
busy = 0
stop_automated_movement = 0
else
busy = 0
stop_automated_movement = 0
#undef SPINNING_WEB
#undef LAYING_EGGS
#undef MOVING_TO_TARGET
#undef SPINNING_COCOON

View File

@@ -1,5 +1,3 @@
/mob/living/simple_animal/hostile/goose
name = "space goose"
desc = "That's no duck. That's a space goose. You have a bad feeling about this."
@@ -7,15 +5,18 @@
icon_living = "goose"
icon_dead = "goose_dead"
icon_gib = "generic_gib"
speak_chance = 0
faction = "geese"
maxHealth = 15
health = 15
speed = 4
turns_per_move = 5
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "hits the"
speed = 4
maxHealth = 15 //nothing an unarmed crewmember shouldn't be able to stomp into the dirt, if they're alone.
health = 15
harm_intent_damage = 5
melee_damage_lower = 5 //they're meant to be annoying, not threatening.
@@ -23,12 +24,25 @@
attacktext = "pecked"
attack_sound = 'sound/weapons/bite.ogg'
break_stuff_probability = 5
//SPACE geese 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
minbodytemp = 0
faction = "geese"
speak_chance = 0
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
/mob/living/simple_animal/hostile/goose/FindTarget()
/mob/living/simple_animal/hostile/goose/set_target()
. = ..()
if(.)
custom_emote(1,"flaps and honks at [.]!")
/mob/living/simple_animal/hostile/goose/Process_Spacemove(var/check_drift = 0)
return

View File

@@ -5,13 +5,18 @@
icon_state = "lizard"
icon_living = "lizard"
icon_dead = "lizard-dead"
speak_emote = list("hisses")
health = 5
maxHealth = 5
attacktext = "bitten"
melee_damage_lower = 1
melee_damage_upper = 2
mob_size = MOB_MINISCULE
response_help = "pets"
response_disarm = "shoos"
response_harm = "stomps on"
mob_size = MOB_MINISCULE
attacktext = "bitten"
melee_damage_lower = 1
melee_damage_upper = 2
speak_chance = 1
speak_emote = list("hisses")

View File

@@ -6,37 +6,45 @@
item_state = "mouse_gray"
icon_living = "mouse_gray"
icon_dead = "mouse_gray_dead"
maxHealth = 5
health = 5
turns_per_move = 5
see_in_dark = 6
universal_understand = 1
mob_size = MOB_MINISCULE
pass_flags = PASSTABLE
can_pull_size = ITEMSIZE_TINY
can_pull_mobs = MOB_PULL_NONE
layer = MOB_LAYER
density = 0
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "stamps on"
min_oxy = 16 //Require atleast 16kPA oxygen
minbodytemp = 223 //Below -50 Degrees Celcius
maxbodytemp = 323 //Above 50 Degrees Celcius
speak_chance = 1
speak = list("Squeek!","SQUEEK!","Squeek?")
speak_emote = list("squeeks","squeeks","squiks")
emote_hear = list("squeeks","squeaks","squiks")
emote_see = list("runs in a circle", "shakes", "scritches at something")
pass_flags = PASSTABLE
speak_chance = 1
turns_per_move = 5
see_in_dark = 6
maxHealth = 5
health = 5
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "stamps on"
density = 0
var/body_color //brown, gray and white, leave blank for random
layer = MOB_LAYER
min_oxy = 16 //Require atleast 16kPA oxygen
minbodytemp = 223 //Below -50 Degrees Celcius
maxbodytemp = 323 //Above 50 Degrees Celcius
universal_speak = 0
universal_understand = 1
holder_type = /obj/item/weapon/holder/mouse
mob_size = MOB_MINISCULE
can_pull_size = ITEMSIZE_TINY
can_pull_mobs = MOB_PULL_NONE
holder_type = /obj/item/weapon/holder/mouse
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
var/body_color //brown, gray and white, leave blank for random
/mob/living/simple_animal/mouse/Life()
..()
if(!stat && prob(speak_chance))
. = ..()
if(!. || ai_inactive) return
if(prob(speak_chance))
for(var/mob/M in view())
M << 'sound/effects/mousesqueek.ogg'
@@ -46,6 +54,7 @@
wander = 0
speak_chance = 0
//snuffles
else if(stat == UNCONSCIOUS)
if(ckey || prob(1))
stat = CONSCIOUS
@@ -54,10 +63,6 @@
else if(prob(5))
audible_emote("snuffles.")
/mob/living/simple_animal/mouse/lay_down() //Simply turns sprite into sleeping and back upon using "Rest".
..()
icon_state = resting ? "mouse_[body_color]_sleep" : "mouse_[body_color]"
/mob/living/simple_animal/mouse/New()
..()
@@ -74,6 +79,7 @@
item_state = "mouse_[body_color]"
icon_living = "mouse_[body_color]"
icon_dead = "mouse_[body_color]_dead"
icon_rest = "mouse_[body_color]_sleep"
desc = "It's a small [body_color] rodent, often seen hiding in maintenance areas and making a nuisance of itself."
/mob/living/simple_animal/mouse/proc/splat()

View File

@@ -12,6 +12,9 @@
* Defines
*/
//Parrot is too snowflake for me to rewrite right now, someone should make it use the new
//simple_animal movement stuff. -Aro
//Only a maximum of one action and one intent should be active at any given time.
//Actions
#define PARROT_PERCH 1 //Sitting/sleeping, not moving
@@ -32,24 +35,25 @@
icon_state = "parrot_fly"
icon_living = "parrot_fly"
icon_dead = "parrot_dead"
turns_per_move = 5
pass_flags = PASSTABLE
mob_size = MOB_SMALL
speak = list("Hi","Hello!","Cracker?","BAWWWWK george mellons griffing me")
speak_emote = list("squawks","says","yells")
emote_hear = list("squawks","bawks")
emote_see = list("flutters its wings")
speak_chance = 1//1% (1 in 100) chance every tick; So about once per 150 seconds, assuming an average tick is 1.5s
turns_per_move = 5
meat_type = /obj/item/weapon/reagent_containers/food/snacks/cracker/
response_help = "pets"
response_disarm = "gently moves aside"
response_harm = "swats"
stop_automated_movement = 1
universal_speak = 1
speak_chance = 2
speak = list("Hi","Hello!","Cracker?","BAWWWWK george mellons griffing me")
speak_emote = list("squawks","says","yells")
emote_hear = list("squawks","bawks")
emote_see = list("flutters its wings")
meat_type = /obj/item/weapon/reagent_containers/food/snacks/cracker
var/parrot_state = PARROT_WANDER //Hunt for a perch when created
var/parrot_sleep_max = 25 //The time the parrot sits while perched before looking around. Mosly a way to avoid the parrot's AI in life() being run every single tick.
var/parrot_sleep_dur = 25 //Same as above, this is the var that physically counts down

View File

@@ -5,15 +5,21 @@
icon_living = "penguin"
icon_dead = "penguin_dead"
icon_gib = "generic_gib"
speak_chance = 0
turns_per_move = 5
maxHealth = 20
health = 20
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
turns_per_move = 5
response_help = "pets"
response_disarm = "pushes aside"
response_harm = "hits"
harm_intent_damage = 5
melee_damage_upper = 15
melee_damage_lower = 10
melee_damage_upper = 15
attacktext = "pecked"
speak_chance = 0
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat

View File

@@ -1,11 +1,35 @@
/mob/living/simple_animal/spiderbot
name = "spider-bot"
desc = "A skittering robotic friend!"
icon = 'icons/mob/robots.dmi'
icon_state = "spiderbot-chassis"
icon_living = "spiderbot-chassis"
icon_dead = "spiderbot-smashed"
health = 10
maxHealth = 10
wander = 0
speed = -1 //Spiderbots gotta go fast.
pass_flags = PASSTABLE
mob_size = MOB_SMALL
response_help = "pets"
response_disarm = "shoos"
response_harm = "stomps on"
melee_damage_lower = 1
melee_damage_upper = 3
attacktext = "shocked"
min_oxy = 0
max_tox = 0
max_co2 = 0
minbodytemp = 0
maxbodytemp = 500
mob_size = MOB_SMALL
speak_chance = 1
speak_emote = list("beeps","clicks","chirps")
var/obj/item/device/radio/borg/radio = null
var/mob/living/silicon/ai/connected_ai = null
@@ -15,31 +39,8 @@
var/list/req_access = list(access_robotics) //Access needed to pop out the brain.
var/positronic
name = "spider-bot"
desc = "A skittering robotic friend!"
icon = 'icons/mob/robots.dmi'
icon_state = "spiderbot-chassis"
icon_living = "spiderbot-chassis"
icon_dead = "spiderbot-smashed"
wander = 0
health = 10
maxHealth = 10
attacktext = "shocked"
melee_damage_lower = 1
melee_damage_upper = 3
response_help = "pets"
response_disarm = "shoos"
response_harm = "stomps on"
var/emagged = 0
var/obj/item/held_item = null //Storage for single item they can hold.
speed = -1 //Spiderbots gotta go fast.
pass_flags = PASSTABLE
speak_emote = list("beeps","clicks","chirps")
/mob/living/simple_animal/spiderbot/New()
..()

View File

@@ -1,18 +1,25 @@
/mob/living/simple_animal/tomato
/mob/living/simple_animal/hostile/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
faction = "plants"
maxHealth = 15
health = 15
meat_type = /obj/item/weapon/reagent_containers/food/snacks/tomatomeat
hostile = 1
turns_per_move = 5
response_help = "prods"
response_disarm = "pushes aside"
response_harm = "smacks"
harm_intent_damage = 5
melee_damage_upper = 15
melee_damage_lower = 10
attacktext = "mauled"
meat_type = /obj/item/weapon/reagent_containers/food/snacks/tomatomeat

View File

@@ -6,17 +6,17 @@
icon_living = "pine_1"
icon_dead = "pine_1"
icon_gib = "pine_1"
speak_chance = 0
faction = "carp" //Trees can be carp friends?
maxHealth = 250
health = 250
speed = -1
turns_per_move = 5
meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat
response_help = "brushes"
response_disarm = "pushes"
response_harm = "hits"
speed = -1
maxHealth = 250
health = 250
pixel_x = -16
harm_intent_damage = 5
melee_damage_lower = 8
@@ -24,7 +24,6 @@
attacktext = "bitten"
attack_sound = 'sound/weapons/bite.ogg'
//Space carp aren't affected by atmos.
min_oxy = 0
max_oxy = 0
min_tox = 0
@@ -35,14 +34,16 @@
max_n2 = 0
minbodytemp = 0
faction = "carp"
meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat
pixel_x = -16
/mob/living/simple_animal/hostile/tree/FindTarget()
. = ..()
if(.)
audible_emote("growls at [.]")
/mob/living/simple_animal/hostile/tree/AttackingTarget()
/mob/living/simple_animal/hostile/tree/PunchTarget()
. =..()
var/mob/living/L = .
if(istype(L))

View File

@@ -5,10 +5,17 @@
icon_state = "spaceworm"
icon_living = "spaceworm"
icon_dead = "spacewormdead"
status_flags = 0
speak_emote = list("transmits") //not supposed to be used under AI control
emote_hear = list("transmits") //I'm just adding it so it doesn't runtime if controlled by player who speaks
maxHealth = 30
health = 30
speed = -1
status_flags = 0
universal_speak = 1
stop_automated_movement = 1
wander = 0
animate_movement = SYNC_STEPS
response_help = "touches"
response_disarm = "flails at"
@@ -16,25 +23,16 @@
harm_intent_damage = 2
maxHealth = 30
health = 30
universal_speak =1
stop_automated_movement = 1
animate_movement = SYNC_STEPS
minbodytemp = 0
maxbodytemp = 350
min_oxy = 0
max_co2 = 0
max_tox = 0
a_intent = I_HURT //so they don't get pushed around
environment_smash = 2
speed = -1
speak_emote = list("transmits") //not supposed to be used under AI control
emote_hear = list("transmits") //I'm just adding it so it doesn't runtime if controlled by player who speaks
var/mob/living/simple_animal/space_worm/previous //next/previous segments, correspondingly
var/mob/living/simple_animal/space_worm/next //head is the nextest segment

View File

@@ -1,46 +0,0 @@
/mob/living/simple_animal/fluffy
name = "Fluffy"
desc = "It's a pink Diyaab! It seems to be very tame and quiet."
icon = 'icons/mob/animal_vr.dmi'
icon_state = "fluffy"
icon_living = "fluffy"
icon_dead = "fluffy_dead"
icon_rest = "fluffy_sleep"
speak = list("Squee","Arf arf","Awoo","Squeak")
speak_emote = list("squeaks", "barks")
emote_hear = list("howls","squeals")
emote_see = list("puffs its fur out", "shakes its fur", "stares directly at you")
speak_chance = 1
turns_per_move = 10
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
meat_amount = 1
response_help = "scritches"
response_disarm = "bops"
response_harm = "kicks"
see_in_dark = 5
mob_size = MOB_TINY
min_oxy = 16 //Require atleast 16kPA oxygen
minbodytemp = 223 //Below -50 Degrees Celcius
maxbodytemp = 323 //Above 50 Degrees Celcius
/mob/living/simple_animal/fluffy/Life()
..()
if(!ckey && stat == CONSCIOUS && prob(0.5))
stat = UNCONSCIOUS
icon_state = "fluffy_sleep"
wander = 0
speak_chance = 0
//snuffles
else if(stat == UNCONSCIOUS)
if(ckey || prob(1))
stat = CONSCIOUS
icon_state = "fluffy"
wander = 1
else if(prob(5))
audible_emote("snuffles.")
/mob/living/simple_animal/fluffy/lay_down()
..()
if(icon_rest)
icon_state = resting ? icon_rest : icon_living

View File

@@ -1,59 +0,0 @@
/mob/living/simple_animal/slime
name = "pet slime"
desc = "A lovable, domesticated slime."
icon = 'icons/mob/slimes.dmi'
icon_state = "grey baby slime"
icon_living = "grey baby slime"
icon_dead = "grey baby slime dead"
speak_emote = list("chirps")
health = 100
maxHealth = 100
response_help = "pets"
response_disarm = "shoos"
response_harm = "stomps on"
emote_see = list("jiggles", "bounces in place")
var/colour = "grey"
/mob/living/simple_animal/slime/science
name = "Kendrick"
colour = "rainbow"
icon_state = "rainbow baby slime"
icon_living = "rainbow baby slime"
icon_dead = "rainbow baby slime dead"
/mob/living/simple_animal/slime/science/initialize()
..()
overlays.Cut()
overlays += "aslime-:33"
/mob/living/simple_animal/adultslime
name = "pet slime"
desc = "A lovable, domesticated slime."
icon = 'icons/mob/slimes.dmi'
health = 200
maxHealth = 200
icon_state = "grey adult slime"
icon_living = "grey adult slime"
icon_dead = "grey baby slime dead"
response_help = "pets"
response_disarm = "shoos"
response_harm = "stomps on"
emote_see = list("jiggles", "bounces in place")
var/colour = "grey"
/mob/living/simple_animal/adultslime/New()
..()
overlays += "aslime-:33"
/mob/living/simple_animal/adultslime/death()
var/mob/living/simple_animal/slime/S1 = new /mob/living/simple_animal/slime (src.loc)
S1.icon_state = "[src.colour] baby slime"
S1.icon_living = "[src.colour] baby slime"
S1.icon_dead = "[src.colour] baby slime dead"
S1.colour = "[src.colour]"
var/mob/living/simple_animal/slime/S2 = new /mob/living/simple_animal/slime (src.loc)
S2.icon_state = "[src.colour] baby slime"
S2.icon_living = "[src.colour] baby slime"
S2.icon_dead = "[src.colour] baby slime dead"
S2.colour = "[src.colour]"
qdel(src)

View File

@@ -1,223 +0,0 @@
#define SPINNING_WEB 1
#define LAYING_EGGS 2
#define MOVING_TO_TARGET 3
#define SPINNING_COCOON 4
//basic spider mob, these generally guard nests
/mob/living/simple_animal/hostile/giant_spider
name = "giant spider"
desc = "Furry and black, it makes you shudder to look at it. This one has deep red eyes."
icon_state = "guard"
icon_living = "guard"
icon_dead = "guard_dead"
speak_emote = list("chitters")
emote_hear = list("chitters")
speak_chance = 5
turns_per_move = 5
see_in_dark = 10
meat_type = /obj/item/weapon/reagent_containers/food/snacks/xenomeat
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "punches"
stop_automated_movement_when_pulled = 0
maxHealth = 200
health = 200
melee_damage_lower = 15
melee_damage_upper = 20
heat_damage_per_tick = 20
cold_damage_per_tick = 20
var/poison_per_bite = 5
var/poison_chance = 10
var/poison_type = "spidertoxin"
faction = "spiders"
var/busy = 0
pass_flags = PASSTABLE
move_to_delay = 6
speed = 3
//nursemaids - these create webs and eggs
/mob/living/simple_animal/hostile/giant_spider/nurse
desc = "Furry and black, it makes you shudder to look at it. This one has brilliant green eyes."
icon_state = "nurse"
icon_living = "nurse"
icon_dead = "nurse_dead"
maxHealth = 40
health = 40
melee_damage_lower = 5
melee_damage_upper = 10
poison_per_bite = 7
var/atom/cocoon_target
poison_type = "stoxin"
var/fed = 0
//hunters have the most poison and move the fastest, so they can find prey
/mob/living/simple_animal/hostile/giant_spider/hunter
desc = "Furry and black, it makes you shudder to look at it. This one has sparkling purple eyes."
icon_state = "hunter"
icon_living = "hunter"
icon_dead = "hunter_dead"
maxHealth = 120
health = 120
melee_damage_lower = 10
melee_damage_upper = 20
poison_per_bite = 5
move_to_delay = 4
/mob/living/simple_animal/hostile/giant_spider/New(var/location, var/atom/parent)
get_light_and_color(parent)
..()
/mob/living/simple_animal/hostile/giant_spider/AttackingTarget()
. = ..()
if(isliving(.))
var/mob/living/L = .
if(L.reagents)
L.reagents.add_reagent(poison_type, poison_per_bite)
if(prob(poison_chance))
L << "<span class='warning'>You feel a tiny prick.</span>"
L.reagents.add_reagent(poison_type, poison_per_bite)
/mob/living/simple_animal/hostile/giant_spider/nurse/AttackingTarget()
. = ..()
if(ishuman(.))
var/mob/living/carbon/human/H = .
if(prob(5))
var/obj/item/organ/external/O = pick(H.organs)
if(!(O.robotic >= ORGAN_ROBOT))
var/eggcount
for(var/obj/I in O.implants)
if(istype(I, /obj/effect/spider/eggcluster))
eggcount ++
if(!eggcount)
var/eggs = PoolOrNew(/obj/effect/spider/eggcluster/small, list(O, src))
O.implants += eggs
H << "<span class='warning'>The [src] injects something into your [O.name]!</span>"
/mob/living/simple_animal/hostile/giant_spider/Life()
..()
if(!stat)
if(stance == STANCE_IDLE)
//1% chance to skitter madly away
if(!busy && prob(1))
/*var/list/move_targets = list()
for(var/turf/T in orange(20, src))
move_targets.Add(T)*/
stop_automated_movement = 1
walk_to(src, pick(orange(20, src)), 1, move_to_delay)
spawn(50)
stop_automated_movement = 0
walk(src,0)
/mob/living/simple_animal/hostile/giant_spider/nurse/proc/GiveUp(var/C)
spawn(100)
if(busy == MOVING_TO_TARGET)
if(cocoon_target == C && get_dist(src,cocoon_target) > 1)
cocoon_target = null
busy = 0
stop_automated_movement = 0
/mob/living/simple_animal/hostile/giant_spider/nurse/Life()
..()
if(!stat)
if(stance == STANCE_IDLE)
var/list/can_see = view(src, 10)
//30% chance to stop wandering and do something
if(!busy && prob(30))
//first, check for potential food nearby to cocoon
for(var/mob/living/C in can_see)
if(C.stat)
cocoon_target = C
busy = MOVING_TO_TARGET
walk_to(src, C, 1, move_to_delay)
//give up if we can't reach them after 10 seconds
GiveUp(C)
return
//second, spin a sticky spiderweb on this tile
var/obj/effect/spider/stickyweb/W = locate() in get_turf(src)
if(!W)
busy = SPINNING_WEB
src.visible_message("<span class='notice'>\The [src] begins to secrete a sticky substance.</span>")
stop_automated_movement = 1
spawn(40)
if(busy == SPINNING_WEB)
new /obj/effect/spider/stickyweb(src.loc)
busy = 0
stop_automated_movement = 0
else
//third, lay an egg cluster there
var/obj/effect/spider/eggcluster/E = locate() in get_turf(src)
if(!E && fed > 0)
busy = LAYING_EGGS
src.visible_message("<span class='notice'>\The [src] begins to lay a cluster of eggs.</span>")
stop_automated_movement = 1
spawn(50)
if(busy == LAYING_EGGS)
E = locate() in get_turf(src)
if(!E)
PoolOrNew(/obj/effect/spider/eggcluster, list(loc, src))
fed--
busy = 0
stop_automated_movement = 0
else
//fourthly, cocoon any nearby items so those pesky pinkskins can't use them
for(var/obj/O in can_see)
if(O.anchored)
continue
if(istype(O, /obj/item) || istype(O, /obj/structure) || istype(O, /obj/machinery))
cocoon_target = O
busy = MOVING_TO_TARGET
stop_automated_movement = 1
walk_to(src, O, 1, move_to_delay)
//give up if we can't reach them after 10 seconds
GiveUp(O)
else if(busy == MOVING_TO_TARGET && cocoon_target)
if(get_dist(src, cocoon_target) <= 1)
busy = SPINNING_COCOON
src.visible_message("<span class='notice'>\The [src] begins to secrete a sticky substance around \the [cocoon_target].</span>")
stop_automated_movement = 1
walk(src,0)
spawn(50)
if(busy == SPINNING_COCOON)
if(cocoon_target && istype(cocoon_target.loc, /turf) && get_dist(src,cocoon_target) <= 1)
var/obj/effect/spider/cocoon/C = new(cocoon_target.loc)
var/large_cocoon = 0
C.pixel_x = cocoon_target.pixel_x
C.pixel_y = cocoon_target.pixel_y
for(var/mob/living/M in C.loc)
if(istype(M, /mob/living/simple_animal/hostile/giant_spider))
continue
large_cocoon = 1
fed++
src.visible_message("<span class='warning'>\The [src] sticks a proboscis into \the [cocoon_target] and sucks a viscous substance out.</span>")
M.loc = C
C.pixel_x = M.pixel_x
C.pixel_y = M.pixel_y
break
for(var/obj/item/I in C.loc)
I.loc = C
for(var/obj/structure/S in C.loc)
if(!S.anchored)
S.loc = C
large_cocoon = 1
for(var/obj/machinery/M in C.loc)
if(!M.anchored)
M.loc = C
large_cocoon = 1
if(large_cocoon)
C.icon_state = pick("cocoon_large1","cocoon_large2","cocoon_large3")
busy = 0
stop_automated_movement = 0
else
busy = 0
stop_automated_movement = 0
#undef SPINNING_WEB
#undef LAYING_EGGS
#undef MOVING_TO_TARGET
#undef SPINNING_COCOON

View File

@@ -1,8 +0,0 @@
/mob/living/simple_animal/hostile
faction = "hostile"
break_stuff_probability = 10
stop_automated_movement_when_pulled = 0
destroy_surroundings = 1
a_intent = I_HURT
hostile = 1

View File

@@ -1,49 +0,0 @@
/mob/living/simple_animal/hostile/retaliate
var/list/enemies = list()
/mob/living/simple_animal/hostile/retaliate/Found(var/atom/A)
if(isliving(A))
var/mob/living/L = A
if(!L.stat)
stance = STANCE_ATTACK
return L
else
enemies -= L
else if(istype(A, /obj/mecha))
var/obj/mecha/M = A
if(M.occupant)
stance = STANCE_ATTACK
return A
/mob/living/simple_animal/hostile/retaliate/ListTargets()
if(!enemies.len)
return list()
var/list/see = ..()
see &= enemies // Remove all entries that aren't in enemies
return see
/mob/living/simple_animal/hostile/retaliate/proc/Retaliate()
..()
var/list/around = view(src, 7)
for(var/atom/movable/A in around)
if(A == src)
continue
if(isliving(A))
var/mob/living/M = A
if(!attack_same && M.faction != faction)
enemies |= M
else if(istype(A, /obj/mecha))
var/obj/mecha/M = A
if(M.occupant)
enemies |= M
enemies |= M.occupant
for(var/mob/living/simple_animal/hostile/retaliate/H in around)
if(!attack_same && !H.attack_same && H.faction == faction)
H.enemies |= enemies
return 0
/mob/living/simple_animal/hostile/retaliate/adjustBruteLoss(var/damage)
..(damage)
Retaliate()

View File

@@ -1,23 +1,27 @@
/mob/living/simple_animal/hostile/retaliate/clown
/mob/living/simple_animal/hostile/clown
name = "clown"
desc = "A denizen of clown planet"
icon_state = "clown"
icon_living = "clown"
icon_dead = "clown_dead"
icon_gib = "clown_gib"
speak_chance = 0
turns_per_move = 5
response_help = "pokes"
response_disarm = "gently pushes aside"
response_harm = "hits"
speak = list("HONK", "Honk!", "Welcome to clown planet!")
emote_see = list("honks")
speak_chance = 1
a_intent = I_HURT
stop_automated_movement_when_pulled = 0
faction = "clown"
maxHealth = 75
health = 75
speed = -1
move_to_delay = 2
run_at_them = 0
cooperative = 1
turns_per_move = 5
stop_when_pulled = 0
response_help = "pokes"
response_disarm = "gently pushes aside"
response_harm = "hits"
harm_intent_damage = 8
melee_damage_lower = 10
melee_damage_upper = 10
@@ -37,3 +41,7 @@
heat_damage_per_tick = 15 //amount of damage applied if animal's body temperature is higher than maxbodytemp
cold_damage_per_tick = 10 //same as heat_damage_per_tick, only if the bodytemperature it's lower than minbodytemp
unsuitable_atoms_damage = 10
speak_chance = 1
speak = list("HONK", "Honk!", "Welcome to clown planet!")
emote_see = list("honks")

View File

@@ -5,16 +5,23 @@
icon_state = "crab"
icon_living = "crab"
icon_dead = "crab_dead"
speak_emote = list("clicks")
emote_hear = list("clicks")
emote_see = list("clacks")
wander = 0
stop_automated_movement = 1
universal_speak = 1
speak_chance = 1
turns_per_move = 5
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "punches"
speak_chance = 1
speak_emote = list("clicks")
emote_hear = list("clicks")
emote_see = list("clacks")
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
var/list/insults = list(
"Man you suck",
"You look like the most retarded douche around",
@@ -32,22 +39,15 @@
"Say \"what\" again. Say \"what\" again. I dare you. I double-dare you, motherfucker. Say \"what\" one more goddamn time.",
"Ezekiel 25:17 ,The path of the righteous man is beset on all sides by the iniquities of the selfish and the tyranny of evil men. Blessed is he who in the name of charity and good will shepherds the weak through the valley of darkness, for he is truly his brother's keeper and the finder of lost children. And I will strike down upon thee with great vengeance and furious anger those who attempt to poison and destroy my brothers. And you will know my name is the Lord... when I lay my vengeance upon thee.",
"Did you notice a sign out in front of my house that said \"Dead Nigger Storage\"?")
stop_automated_movement = 1
/mob/living/simple_animal/head/Life()
if(stat == DEAD)
if(health > 0)
icon_state = icon_living
stat = CONSCIOUS
density = 1
return
else if(health < 1)
Die()
else if(health > maxHealth)
health = maxHealth
. = ..()
if(!. || ai_inactive) return
for(var/mob/A in viewers(world.view,src))
if(A.ckey)
say_something(A)
/mob/living/simple_animal/head/proc/say_something(mob/A)
if(prob(85))
return

View File

@@ -6,25 +6,34 @@
icon_state = "kobold_idle"
icon_living = "kobold_idle"
icon_dead = "kobold_dead"
//speak = list("You no take candle!","Ooh, pretty shiny.","Me take?","Where gold here...","Me likey.")
speak_emote = list("mutters","hisses","grumbles")
emote_hear = list("mutters under it's breath.","grumbles.", "yips!")
emote_see = list("looks around suspiciously.", "scratches it's arm.","putters around a bit.")
speak_chance = 15
run_at_them = 0
cooperative = 1
turns_per_move = 5
see_in_dark = 6
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/monkey
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "kicks"
minbodytemp = 250
min_oxy = 16 //Require atleast 16kPA oxygen
minbodytemp = 223 //Below -50 Degrees Celcius
maxbodytemp = 323 //Above 50 Degrees Celcius
speak_chance = 5
speak = list("You no take candle!","Ooh, pretty shiny.","Me take?","Where gold here...","Me likey.")
speak_emote = list("mutters","hisses","grumbles")
emote_hear = list("mutters under it's breath.","grumbles.", "yips!")
emote_see = list("looks around suspiciously.", "scratches it's arm.","putters around a bit.")
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/monkey
/mob/living/simple_animal/kobold/Life()
..()
if(prob(15) && turns_since_move && !stat)
. = ..()
if(!.) return
if(prob(5))
flick("kobold_act",src)
/mob/living/simple_animal/kobold/Move(var/dir)

View File

@@ -0,0 +1,94 @@
/mob/living/simple_animal/hostile/mecha
name = "syndicate gygax"
desc = "Well that's forboding."
icon = 'icons/mecha/mecha.dmi'
icon_state = "darkgygax"
icon_living = "darkgygax"
icon_dead = "darkgygax-broken"
faction = "syndicate"
maxHealth = 300
health = 300
speed = 7
move_to_delay = 8
run_at_them = 0
cooperative = 1
investigates = 1
firing_lines = 1
turns_per_move = 5
stop_when_pulled = 0
response_help = "taps on"
response_disarm = "knocks on"
response_harm = "uselessly hits"
harm_intent_damage = 0
melee_damage_lower = 35
melee_damage_upper = 35
attacktext = "slashed"
attack_sound = 'sound/weapons/bladeslice.ogg'
min_oxy = 0
max_oxy = 0
min_tox = 0
max_tox = 0
min_co2 = 0
max_co2 = 0
min_n2 = 0
max_n2 = 0
unsuitable_atoms_damage = 0
ranged = 1
rapid = 1
projectiletype = /obj/item/projectile/beam
projectilesound = 'sound/weapons/laser.ogg'
speak_chance = 1
speak = list("Know what we need? More meatshields.",
"Glad I finally got a mech.",
"I'll stomp those NanoTrasen dogs into paste.",
"Glad I didn't become a line chef.",
"This anti-fog visor is nice...",
"Did I refill the air tank?")
emote_hear = list("humms ominously","whirrs softly","grinds a gear")
emote_see = list("looks around the area","turns from side to side")
say_understood = list()
say_cannot = list()
say_maybe_target = list("Just my sensors?","Detecting something?","Is that...?","What was that?")
say_got_target = list("ENGAGING!!!","CONTACT!!!","TARGET SPOTTED!","FOUND ONE!")
reactions = list()
var/datum/effect/effect/system/spark_spread/sparks
var/wreckage = /obj/effect/decal/mecha_wreckage/gygax/dark
/mob/living/simple_animal/hostile/mecha/New()
..()
sparks = new (src)
sparks.set_up(3, 1, src)
/mob/living/simple_animal/hostile/mecha/Destroy()
qdel(sparks)
..()
/mob/living/simple_animal/hostile/mecha/Life()
. = ..()
if(!.) return
if((health < maxHealth*0.3) && prob(10))
sparks.start()
/mob/living/simple_animal/hostile/mecha/bullet_act()
..()
sparks.start()
/mob/living/simple_animal/hostile/mecha/death()
..(0,"is explodes!")
sparks.start()
explosion(get_turf(src), 0, 0, 1, 3)
qdel(src)
new /obj/effect/decal/mecha_wreckage/gygax/dark(get_turf(src))
/mob/living/simple_animal/hostile/mecha/Move()
..()
playsound(src,'sound/mecha/mechstep.ogg',40,1)

View File

@@ -4,15 +4,25 @@
icon_state = "piratemelee"
icon_living = "piratemelee"
icon_dead = "piratemelee_dead"
speak_chance = 0
faction = "pirate"
maxHealth = 100
health = 100
speed = 4
run_at_them = 0
cooperative = 1
investigates = 1
firing_lines = 1
returns_home = 1
reacts = 1
turns_per_move = 5
stop_when_pulled = 0
response_help = "pushes"
response_disarm = "shoves"
response_harm = "hits"
speed = 4
stop_automated_movement_when_pulled = 0
maxHealth = 100
health = 100
harm_intent_damage = 5
melee_damage_lower = 30
@@ -29,28 +39,28 @@
min_n2 = 0
max_n2 = 0
unsuitable_atoms_damage = 15
var/corpse = /obj/effect/landmark/mobcorpse/pirate
var/weapon1 = /obj/item/weapon/melee/energy/sword/pirate
faction = "pirate"
loot_list = list(/obj/item/weapon/melee/energy/sword/pirate = 100)
var/corpse = /obj/effect/landmark/mobcorpse/pirate
/mob/living/simple_animal/hostile/pirate/ranged
name = "Pirate Gunner"
icon_state = "pirateranged"
icon_living = "pirateranged"
icon_dead = "piratemelee_dead"
projectilesound = 'sound/weapons/laser.ogg'
ranged = 1
projectiletype = /obj/item/projectile/beam
corpse = /obj/effect/landmark/mobcorpse/pirate/ranged
weapon1 = /obj/item/weapon/gun/energy/laser
projectilesound = 'sound/weapons/laser.ogg'
loot_list = list(/obj/item/weapon/gun/energy/laser = 100)
corpse = /obj/effect/landmark/mobcorpse/pirate/ranged
/mob/living/simple_animal/hostile/pirate/death()
..()
if(corpse)
new corpse (src.loc)
if(weapon1)
new weapon1 (src.loc)
qdel(src)
return

View File

@@ -5,22 +5,32 @@
icon_living = "russianmelee"
icon_dead = "russianmelee_dead"
icon_gib = "syndicate_gib"
speak_chance = 0
faction = "russian"
maxHealth = 100
health = 100
speed = 4
run_at_them = 0
cooperative = 1
investigates = 1
firing_lines = 1
returns_home = 1
reacts = 1
turns_per_move = 5
stop_when_pulled = 0
status_flags = CANPUSH
response_help = "pokes"
response_disarm = "shoves"
response_harm = "hits"
speed = 4
stop_automated_movement_when_pulled = 0
maxHealth = 100
health = 100
harm_intent_damage = 5
melee_damage_lower = 15
melee_damage_upper = 15
attacktext = "punched"
a_intent = I_HURT
var/corpse = /obj/effect/landmark/mobcorpse/russian
var/weapon1 = /obj/item/weapon/material/knife
min_oxy = 5
max_oxy = 0
min_tox = 0
@@ -30,26 +40,27 @@
min_n2 = 0
max_n2 = 0
unsuitable_atoms_damage = 15
faction = "russian"
status_flags = CANPUSH
loot_list = list(/obj/item/weapon/material/knife = 100)
var/corpse = /obj/effect/landmark/mobcorpse/russian
/mob/living/simple_animal/hostile/russian/ranged
icon_state = "russianranged"
icon_living = "russianranged"
corpse = /obj/effect/landmark/mobcorpse/russian/ranged
weapon1 = /obj/item/weapon/gun/projectile/revolver/mateba
ranged = 1
projectiletype = /obj/item/projectile/bullet
projectilesound = 'sound/weapons/Gunshot.ogg'
casingtype = /obj/item/ammo_casing/spent
projectilesound = 'sound/weapons/Gunshot.ogg'
loot_list = list(/obj/item/weapon/gun/projectile/revolver/mateba = 100)
corpse = /obj/effect/landmark/mobcorpse/russian/ranged
/mob/living/simple_animal/hostile/russian/death()
..()
if(corpse)
new corpse (src.loc)
if(weapon1)
new weapon1 (src.loc)
qdel(src)
return

View File

@@ -1,27 +1,37 @@
/mob/living/simple_animal/hostile/syndicate
name = "\improper Syndicate operative"
name = "syndicate operative"
desc = "Death to the Company."
icon_state = "syndicate"
icon_living = "syndicate"
icon_dead = "syndicate_dead"
icon_gib = "syndicate_gib"
speak_chance = 0
faction = "syndicate"
maxHealth = 100
health = 100
speed = 4
run_at_them = 0
cooperative = 1
investigates = 1
firing_lines = 1
returns_home = 1
reacts = 1
turns_per_move = 5
stop_when_pulled = 0
status_flags = CANPUSH
response_help = "pokes"
response_disarm = "shoves"
response_harm = "hits"
speed = 4
stop_automated_movement_when_pulled = 0
maxHealth = 100
health = 100
harm_intent_damage = 5
melee_damage_lower = 10
melee_damage_upper = 10
melee_damage_upper = 15
environment_smash = 1
attacktext = "punched"
a_intent = I_HURT
var/corpse = /obj/effect/landmark/mobcorpse/syndicatesoldier
var/weapon1
var/weapon2
min_oxy = 5
max_oxy = 0
min_tox = 0
@@ -31,59 +41,75 @@
min_n2 = 0
max_n2 = 0
unsuitable_atoms_damage = 15
environment_smash = 1
faction = "syndicate"
status_flags = CANPUSH
speak_chance = 1
speak = list("Fuckin' NT, man.",
"When are we gonna get out of this chicken-shit outfit?",
"Wish I had better equipment...",
"I knew I should have been a line chef...",
"Fuckin' helmet keeps fogging up.",
"Anyone else smell that?")
emote_hear = list("sniffs","coughs","taps his foot")
emote_see = list("looks around","checks his equipment")
say_understood = list()
say_cannot = list()
say_maybe_target = list("What's that?","Is someone there?","Is that...?","Hmm?")
say_got_target = list("ENGAGING!!!","CONTACT!!!","TARGET SPOTTED!","FOUND ONE!")
reactions = list("Hey guys, you ready?" = "Fuck yeah!")
var/corpse = /obj/effect/landmark/mobcorpse/syndicatesoldier
/mob/living/simple_animal/hostile/syndicate/death()
..()
if(corpse)
new corpse (src.loc)
if(weapon1)
new weapon1 (src.loc)
if(weapon2)
new weapon2 (src.loc)
qdel(src)
return
///////////////Sword and shield////////////
/mob/living/simple_animal/hostile/syndicate/melee
melee_damage_lower = 20
melee_damage_upper = 25
icon_state = "syndicatemelee"
icon_living = "syndicatemelee"
weapon1 = /obj/item/weapon/melee/energy/sword/red
weapon2 = /obj/item/weapon/shield/energy
melee_damage_lower = 20
melee_damage_upper = 25
attacktext = "slashed"
status_flags = 0
loot_list = list(/obj/item/weapon/melee/energy/sword/red = 100, /obj/item/weapon/shield/energy = 100)
/mob/living/simple_animal/hostile/syndicate/melee/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(O.force)
if(prob(80))
var/damage = O.force
if (O.damtype == HALLOSS)
damage = 0
health -= damage
visible_message("\red \b [src] has been attacked with the [O] by [user]. ")
if(prob(20))
visible_message("<span class='danger'>\The [src] blocks \the [O] with its shield!</span>")
if(user)
react_to_attack(user)
return
else
visible_message("\red \b [src] blocks the [O] with its shield! ")
//user.do_attack_animation(src)
..()
else
usr << "\red This weapon is ineffective, it does no damage."
visible_message("\red [user] gently taps [src] with the [O]. ")
usr << "<span class='warning'>This weapon is ineffective, it does no damage.</span>"
visible_message("<span class='warning'>\The [user] gently taps [src] with \the [O].</span>")
/mob/living/simple_animal/hostile/syndicate/melee/bullet_act(var/obj/item/projectile/Proj)
if(!Proj) return
if(prob(65))
src.health -= Proj.damage
else
if(prob(35))
visible_message("\red <B>[src] blocks [Proj] with its shield!</B>")
return 0
if(Proj.firer)
react_to_attack(Proj.firer)
return
else
..()
/mob/living/simple_animal/hostile/syndicate/melee/space
name = "syndicate commando"
icon_state = "syndicatemeleespace"
icon_living = "syndicatemeleespace"
speed = 0
min_oxy = 0
max_oxy = 0
min_tox = 0
@@ -93,30 +119,31 @@
min_n2 = 0
max_n2 = 0
minbodytemp = 0
icon_state = "syndicatemeleespace"
icon_living = "syndicatemeleespace"
name = "Syndicate Commando"
corpse = /obj/effect/landmark/mobcorpse/syndicatecommando
speed = 0
/mob/living/simple_animal/hostile/syndicate/melee/space/Process_Spacemove(var/check_drift = 0)
return
/mob/living/simple_animal/hostile/syndicate/ranged
ranged = 1
rapid = 1
icon_state = "syndicateranged"
icon_living = "syndicateranged"
ranged = 1
rapid = 1
projectiletype = /obj/item/projectile/bullet/pistol/medium
casingtype = /obj/item/ammo_casing/spent
projectilesound = 'sound/weapons/Gunshot_light.ogg'
projectiletype = /obj/item/projectile/bullet/pistol/medium
weapon1 = /obj/item/weapon/gun/projectile/automatic/c20r
loot_list = list(/obj/item/weapon/gun/projectile/automatic/c20r = 100)
/mob/living/simple_animal/hostile/syndicate/ranged/space
name = "syndicate sommando"
icon_state = "syndicaterangedpsace"
icon_living = "syndicaterangedpsace"
name = "Syndicate Commando"
speed = 0
min_oxy = 0
max_oxy = 0
min_tox = 0
@@ -126,28 +153,30 @@
min_n2 = 0
max_n2 = 0
minbodytemp = 0
corpse = /obj/effect/landmark/mobcorpse/syndicatecommando
speed = 0
/mob/living/simple_animal/hostile/syndicate/ranged/space/Process_Spacemove(var/check_drift = 0)
return
/mob/living/simple_animal/hostile/viscerator
name = "viscerator"
desc = "A small, twin-bladed machine capable of inflicting very deadly lacerations."
icon = 'icons/mob/critter.dmi'
icon_state = "viscerator_attack"
icon_living = "viscerator_attack"
pass_flags = PASSTABLE
health = 15
faction = "syndicate"
maxHealth = 15
health = 15
pass_flags = PASSTABLE
melee_damage_lower = 15
melee_damage_upper = 15
attacktext = "cut"
attack_sound = 'sound/weapons/bladeslice.ogg'
faction = "syndicate"
attacktext = "cut"
min_oxy = 0
max_oxy = 0
min_tox = 0

File diff suppressed because it is too large Load Diff

View File

@@ -707,11 +707,12 @@
/mob/proc/facedir(var/ndir)
if(!canface() || client.moving || world.time < client.move_delay)
if(!canface() || (client && (client.moving || (world.time < client.move_delay))))
return 0
set_dir(ndir)
if(buckled && buckled.buckle_movable)
buckled.set_dir(ndir)
if(client)
client.move_delay += movement_delay()
return 1

View File

@@ -535,7 +535,7 @@ proc/is_blind(A)
if(. == SAFE_PERP)
return SAFE_PERP
if(!istype(src, /mob/living/simple_animal/hostile/retaliate/goat))
if(!istype(src, /mob/living/simple_animal/retaliate/goat))
threatcount += 4
return threatcount

View File

@@ -304,7 +304,7 @@
return 1
if(ispath(MP, /mob/living/simple_animal/shade))
return 1
if(ispath(MP, /mob/living/simple_animal/tomato))
if(ispath(MP, /mob/living/simple_animal/hostile/tomato))
return 1
if(ispath(MP, /mob/living/simple_animal/mouse))
return 1 //It is impossible to pull up the player panel for mice (Fixed! - Nodrak)

View File

@@ -36,7 +36,7 @@
/obj/machinery/disease2/incubator,
/obj/machinery/disposal,
/mob/living/simple_animal/cow,
/mob/living/simple_animal/hostile/retaliate/goat,
/mob/living/simple_animal/retaliate/goat,
/obj/machinery/computer/centrifuge,
/obj/machinery/sleeper,
/obj/machinery/smartfridge/,

View File

@@ -39,7 +39,7 @@
/mob/living/simple_animal/slime,
/mob/living/simple_animal/crab,
/mob/living/simple_animal/mouse,
/mob/living/simple_animal/hostile/retaliate/goat)
/mob/living/simple_animal/retaliate/goat)
//todo: how the hell is the asteroid permanently powered?
/obj/machinery/auto_cloner/process()