mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-10 02:09:41 +00:00
Conflicts: code/_helpers/names.dm code/game/jobs/job/silicon.dm code/game/objects/items.dm code/modules/mining/abandonedcrates.dm code/modules/mob/living/carbon/brain/life.dm code/modules/mob/living/carbon/human/life.dm code/modules/mob/living/simple_animal/friendly/spiderbot.dm code/modules/nano/modules/alarm_monitor.dm code/setup.dm
216 lines
6.9 KiB
Plaintext
216 lines
6.9 KiB
Plaintext
|
|
#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
|
|
meat_type = /obj/item/weapon/reagent_containers/food/snacks/xenomeat
|
|
response_help = "pets"
|
|
response_disarm = "gently pushes aside"
|
|
response_harm = "pokes"
|
|
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_type = "toxin"
|
|
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 = 10
|
|
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()
|
|
var/target = ..()
|
|
if(isliving(target))
|
|
var/mob/living/L = target
|
|
if(L.reagents)
|
|
L.reagents.add_reagent("toxin", poison_per_bite)
|
|
if(prob(poison_per_bite))
|
|
L << "\red You feel a tiny prick."
|
|
L.reagents.add_reagent(poison_type, 5)
|
|
|
|
/mob/living/simple_animal/hostile/giant_spider/nurse/AttackingTarget()
|
|
var/target = ..()
|
|
if(ishuman(target))
|
|
var/mob/living/carbon/human/H = target
|
|
if(prob(poison_per_bite))
|
|
var/obj/item/organ/external/O = pick(H.organs)
|
|
if(!(O.status & ORGAN_ROBOT))
|
|
var/eggs = PoolOrNew(/obj/effect/spider/eggcluster/, list(O, src))
|
|
O.implants += eggs
|
|
|
|
/mob/living/simple_animal/hostile/giant_spider/Life()
|
|
..()
|
|
if(!stat)
|
|
if(stance == HOSTILE_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 == HOSTILE_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
|