mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-07-20 19:44:46 +01:00
Merges AI Branch into Master
This commit is contained in:
@@ -99,3 +99,13 @@
|
||||
mouse_opacity = FALSE
|
||||
anchored = TRUE
|
||||
plane = ABOVE_PLANE
|
||||
|
||||
// Similar to the tesla ball but doesn't actually do anything and is purely visual.
|
||||
/obj/effect/overlay/energy_ball
|
||||
name = "energy ball"
|
||||
desc = "An energy ball."
|
||||
icon = 'icons/obj/tesla_engine/energy_ball.dmi'
|
||||
icon_state = "energy_ball"
|
||||
plane = PLANE_LIGHTING_ABOVE
|
||||
pixel_x = -32
|
||||
pixel_y = -32
|
||||
|
||||
@@ -56,13 +56,15 @@
|
||||
|
||||
/obj/effect/spider/stickyweb
|
||||
icon_state = "stickyweb1"
|
||||
New()
|
||||
if(prob(50))
|
||||
icon_state = "stickyweb2"
|
||||
|
||||
/obj/effect/spider/stickyweb/initialize()
|
||||
if(prob(50))
|
||||
icon_state = "stickyweb2"
|
||||
return ..()
|
||||
|
||||
/obj/effect/spider/stickyweb/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
||||
if(air_group || (height==0)) return 1
|
||||
if(istype(mover, /mob/living/simple_animal/hostile/giant_spider))
|
||||
if(istype(mover, /mob/living/simple_mob/animal/giant_spider))
|
||||
return 1
|
||||
else if(istype(mover, /mob/living))
|
||||
if(prob(50))
|
||||
@@ -80,10 +82,12 @@
|
||||
var/spiders_min = 6
|
||||
var/spiders_max = 24
|
||||
var/spider_type = /obj/effect/spider/spiderling
|
||||
New()
|
||||
pixel_x = rand(3,-3)
|
||||
pixel_y = rand(3,-3)
|
||||
processing_objects |= src
|
||||
|
||||
/obj/effect/spider/eggcluster/initialize()
|
||||
pixel_x = rand(3,-3)
|
||||
pixel_y = rand(3,-3)
|
||||
processing_objects |= src
|
||||
return ..()
|
||||
|
||||
/obj/effect/spider/eggcluster/New(var/location, var/atom/parent)
|
||||
get_light_and_color(parent)
|
||||
@@ -129,10 +133,10 @@
|
||||
var/amount_grown = -1
|
||||
var/obj/machinery/atmospherics/unary/vent_pump/entry_vent
|
||||
var/travelling_in_vent = 0
|
||||
var/list/grow_as = list(/mob/living/simple_animal/hostile/giant_spider, /mob/living/simple_animal/hostile/giant_spider/nurse, /mob/living/simple_animal/hostile/giant_spider/hunter)
|
||||
var/list/grow_as = list(/mob/living/simple_mob/animal/giant_spider, /mob/living/simple_mob/animal/giant_spider/nurse, /mob/living/simple_mob/animal/giant_spider/hunter)
|
||||
|
||||
/obj/effect/spider/spiderling/frost
|
||||
grow_as = list(/mob/living/simple_animal/hostile/giant_spider/frost)
|
||||
grow_as = list(/mob/living/simple_mob/animal/giant_spider/frost)
|
||||
|
||||
/obj/effect/spider/spiderling/New(var/location, var/atom/parent)
|
||||
pixel_x = rand(6,-6)
|
||||
|
||||
@@ -107,7 +107,7 @@
|
||||
return 0
|
||||
|
||||
if(!user.IsAdvancedToolUser() && isanimal(user))
|
||||
var/mob/living/simple_animal/S = user
|
||||
var/mob/living/simple_mob/S = user
|
||||
if(!S.IsHumanoidToolUser(src))
|
||||
return 0
|
||||
|
||||
|
||||
@@ -166,7 +166,7 @@
|
||||
outmsg = "<span class='info'>You missed the lens of [C] with [src].</span>"
|
||||
|
||||
//cats!
|
||||
for(var/mob/living/simple_animal/cat/C in viewers(1,targloc))
|
||||
for(var/mob/living/simple_mob/animal/passive/cat/C in viewers(1,targloc))
|
||||
if (!(C.stat || C.buckled))
|
||||
if(prob(50) && !(C.client))
|
||||
C.visible_message("<span class='warning'>[C] pounces on the light!</span>", "<span class='warning'>You pounce on the light!</span>")
|
||||
|
||||
@@ -451,15 +451,15 @@ HALOGEN COUNTER - Radcount on mobs
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 20)
|
||||
|
||||
/obj/item/device/slime_scanner/attack(mob/living/M as mob, mob/living/user as mob)
|
||||
if(!isslime(M))
|
||||
to_chat(user, "<B>This device can only scan slimes!</B>")
|
||||
if(!istype(M, /mob/living/simple_mob/slime/xenobio))
|
||||
to_chat(user, "<B>This device can only scan lab-grown slimes!</B>")
|
||||
return
|
||||
var/mob/living/simple_animal/slime/S = M
|
||||
var/mob/living/simple_mob/slime/xenobio/S = M
|
||||
user.show_message("Slime scan results:<br>[S.slime_color] [S.is_adult ? "adult" : "baby"] slime<br>Health: [S.health]<br>Mutation Probability: [S.mutation_chance]")
|
||||
|
||||
var/list/mutations = list()
|
||||
for(var/potential_color in S.slime_mutation)
|
||||
var/mob/living/simple_animal/slime/slime = potential_color
|
||||
var/mob/living/simple_mob/slime/xenobio/slime = potential_color
|
||||
mutations.Add(initial(slime.slime_color))
|
||||
user.show_message("Potental to mutate into [english_list(mutations)] colors.<br>Extract potential: [S.cores]<br>Nutrition: [S.nutrition]/[S.get_max_nutrition()]")
|
||||
|
||||
@@ -469,12 +469,14 @@ HALOGEN COUNTER - Radcount on mobs
|
||||
user.show_message("<span class='warning'>Warning: Subject is hungry.</span>")
|
||||
user.show_message("Electric change strength: [S.power_charge]")
|
||||
|
||||
if(S.resentment)
|
||||
user.show_message("<span class='warning'>Warning: Subject is harboring resentment.</span>")
|
||||
if(S.docile)
|
||||
if(S.has_AI())
|
||||
var/datum/ai_holder/simple_mob/xenobio_slime/AI = S.ai_holder
|
||||
if(AI.resentment)
|
||||
user.show_message("<span class='warning'>Warning: Subject is harboring resentment.</span>")
|
||||
if(AI.rabid)
|
||||
user.show_message("<span class='danger'>Subject is enraged and extremely dangerous!</span>")
|
||||
if(S.harmless)
|
||||
user.show_message("Subject has been pacified.")
|
||||
if(S.rabid)
|
||||
user.show_message("<span class='danger'>Subject is enraged and extremely dangerous!</span>")
|
||||
if(S.unity)
|
||||
user.show_message("Subject is friendly to other slime colors.")
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
w_class = ITEMSIZE_SMALL
|
||||
matter = list("glass" = 200)
|
||||
flags = NOBLUDGEON
|
||||
var/list/accept_mobs = list(/mob/living/simple_animal/lizard, /mob/living/simple_animal/mouse)
|
||||
var/list/accept_mobs = list(/mob/living/simple_mob/animal/passive/lizard, /mob/living/simple_mob/animal/passive/mouse)
|
||||
var/contains = 0 // 0 = nothing, 1 = money, 2 = animal, 3 = spiderling
|
||||
|
||||
/obj/item/glass_jar/New()
|
||||
|
||||
@@ -47,14 +47,3 @@
|
||||
processing_objects -= src
|
||||
return ..()
|
||||
|
||||
|
||||
//Crashed Cargo Shuttle PoI
|
||||
|
||||
/obj/structure/largecrate/animal/crashedshuttle
|
||||
name = "SCP"
|
||||
|
||||
/obj/structure/largecrate/animal/crashedshuttle/initialize()
|
||||
starts_with = list(pick(/mob/living/simple_animal/hostile/statue, /obj/item/cursed_marble, /obj/item/weapon/deadringer)) // Starts_with has to be a list
|
||||
name = pick("Spicy Crust Pizzeria", "Soap and Care Products", "Sally's Computer Parts", "Steve's Chocolate Pastries", "Smith & Christian's Plastics","Standard Containers & Packaging Co.", "Sanitary Chemical Purgation (LTD)")
|
||||
name += " delivery crate"
|
||||
return ..()
|
||||
|
||||
@@ -275,13 +275,6 @@
|
||||
add_flashes(W,user)
|
||||
else
|
||||
add_flashes(W,user)
|
||||
else if(istype(W, /obj/item/weapon/stock_parts/manipulator))
|
||||
to_chat(user, "<span class='notice'>You install some manipulators and modify the head, creating a functional spider-bot!</span>")
|
||||
new /mob/living/simple_animal/spiderbot(get_turf(loc))
|
||||
user.drop_item()
|
||||
qdel(W)
|
||||
qdel(src)
|
||||
return
|
||||
return
|
||||
|
||||
/obj/item/robot_parts/head/proc/add_flashes(obj/item/W as obj, mob/user as mob) //Made into a seperate proc to avoid copypasta
|
||||
|
||||
Executable → Regular
+1
-1
@@ -23,7 +23,7 @@ AI MODULES
|
||||
|
||||
/obj/item/weapon/aiModule/proc/install(var/atom/movable/AM, var/mob/living/user)
|
||||
if(!user.IsAdvancedToolUser() && isanimal(user))
|
||||
var/mob/living/simple_animal/S = user
|
||||
var/mob/living/simple_mob/S = user
|
||||
if(!S.IsHumanoidToolUser(src))
|
||||
return 0
|
||||
|
||||
|
||||
@@ -31,19 +31,25 @@
|
||||
|
||||
/obj/item/weapon/grenade/spawnergrenade/manhacks
|
||||
name = "manhack delivery grenade"
|
||||
spawner_type = /mob/living/simple_animal/hostile/viscerator
|
||||
spawner_type = /mob/living/simple_mob/mechanical/viscerator
|
||||
deliveryamt = 5
|
||||
origin_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 4, TECH_ILLEGAL = 4)
|
||||
|
||||
/obj/item/weapon/grenade/spawnergrenade/manhacks/mercenary
|
||||
spawner_type = /mob/living/simple_mob/mechanical/viscerator/mercenary
|
||||
|
||||
/obj/item/weapon/grenade/spawnergrenade/manhacks/raider
|
||||
spawner_type = /mob/living/simple_mob/mechanical/viscerator/raider
|
||||
|
||||
/obj/item/weapon/grenade/spawnergrenade/spesscarp
|
||||
name = "carp delivery grenade"
|
||||
spawner_type = /mob/living/simple_animal/hostile/carp
|
||||
spawner_type = /mob/living/simple_mob/animal/space/carp
|
||||
deliveryamt = 5
|
||||
origin_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 4, TECH_ILLEGAL = 4)
|
||||
|
||||
/obj/item/weapon/grenade/spawnergrenade/spider
|
||||
name = "spider delivery grenade"
|
||||
spawner_type = /mob/living/simple_animal/hostile/giant_spider/hunter
|
||||
spawner_type = /mob/living/simple_mob/animal/giant_spider/hunter
|
||||
deliveryamt = 3
|
||||
origin_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 4, TECH_ILLEGAL = 4)
|
||||
|
||||
|
||||
@@ -336,4 +336,4 @@ var/last_chew = 0
|
||||
target.m_intent = "walk"
|
||||
if(target.hud_used && user.hud_used.move_intent)
|
||||
target.hud_used.move_intent.icon_state = "walking"
|
||||
return 1
|
||||
return 1
|
||||
|
||||
@@ -79,10 +79,9 @@
|
||||
var/obj/item/weapon/grab/grab = G
|
||||
if(!ismob(grab.affecting))
|
||||
return
|
||||
for(var/mob/living/simple_animal/slime/M in range(1,grab.affecting))
|
||||
if(M.victim == grab.affecting)
|
||||
usr << "[grab.affecting.name] will not fit into the [src.name] because they have a slime latched onto their head."
|
||||
return
|
||||
if(grab.affecting.has_buckled_mobs())
|
||||
to_chat(user, span("warning", "\The [grab.affecting] has other entities attached to them. Remove them first."))
|
||||
return
|
||||
var/mob/M = grab.affecting
|
||||
if(put_mob(M))
|
||||
qdel(G)
|
||||
|
||||
@@ -233,11 +233,10 @@
|
||||
playsound(get_turf(target), 'sound/weapons/blade1.ogg', 100, 1)
|
||||
|
||||
// Make lesser robots really mad at us.
|
||||
if(istype(target, /mob/living/simple_animal))
|
||||
var/mob/living/simple_animal/SA = target
|
||||
if(SA.intelligence_level == SA_ROBOTIC)
|
||||
SA.taunt(user)
|
||||
SA.adjustFireLoss(force * 6) // 30 Burn, for 50 total.
|
||||
if(target.mob_class & MOB_CLASS_SYNTHETIC)
|
||||
if(target.has_AI())
|
||||
target.taunt(user)
|
||||
target.adjustFireLoss(force * 6) // 30 Burn, for 50 total.
|
||||
|
||||
/*
|
||||
*Energy Blade
|
||||
|
||||
@@ -292,7 +292,7 @@ var/list/tape_roll_applications = list()
|
||||
add_fingerprint(M)
|
||||
if (!allowed(M)) //only select few learn art of not crumpling the tape
|
||||
M << "<span class='warning'>You are not supposed to go past [src]...</span>"
|
||||
if(M.a_intent == I_HELP && !(istype(M, /mob/living/simple_animal)))
|
||||
if(M.a_intent == I_HELP && !(istype(M, /mob/living/simple_mob)))
|
||||
return 0
|
||||
crumple()
|
||||
return ..(mover)
|
||||
|
||||
@@ -269,9 +269,8 @@
|
||||
|
||||
/obj/item/weapon/melee/baton/shocker/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone)
|
||||
..(target, user, hit_zone)
|
||||
if(istype(target, /mob/living/simple_animal) && status)
|
||||
var/mob/living/simple_animal/SA = target
|
||||
SA.taunt(user)
|
||||
if(status && target.has_AI())
|
||||
target.taunt(user)
|
||||
|
||||
// Borg version, for the lost module.
|
||||
/obj/item/weapon/melee/baton/shocker/robot
|
||||
|
||||
@@ -122,4 +122,4 @@
|
||||
counterpart.forceMove(get_turf(src))
|
||||
src.forceMove(counterpart)
|
||||
user.put_in_active_hand(counterpart)
|
||||
to_chat(user, "<span class='notice'>You attach the bolt driver bit to [src].</span>")
|
||||
to_chat(user, "<span class='notice'>You attach the bolt driver bit to [src].</span>")
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
<<<<<<< HEAD
|
||||
=======
|
||||
|
||||
>>>>>>> 3155d58... Merge pull request #5735 from Neerti/hopefully_last_master_sync
|
||||
#define WELDER_FUEL_BURN_INTERVAL 13
|
||||
/*
|
||||
* Welding Tool
|
||||
@@ -317,7 +321,10 @@
|
||||
var/obj/item/organ/internal/eyes/E = H.internal_organs_by_name[O_EYES]
|
||||
if(!E)
|
||||
return
|
||||
<<<<<<< HEAD
|
||||
if(H.nif && H.nif.flag_check(NIF_V_UVFILTER,NIF_FLAGS_VISION)) return //VOREStation Add - NIF
|
||||
=======
|
||||
>>>>>>> 3155d58... Merge pull request #5735 from Neerti/hopefully_last_master_sync
|
||||
switch(safety)
|
||||
if(1)
|
||||
to_chat(usr, "<span class='warning'>Your eyes sting a little.</span>")
|
||||
|
||||
@@ -68,4 +68,4 @@
|
||||
counterpart.forceMove(get_turf(src))
|
||||
src.forceMove(counterpart)
|
||||
user.put_in_active_hand(counterpart)
|
||||
to_chat(user, "<span class='notice'>You attach the screw driver bit to [src].</span>")
|
||||
to_chat(user, "<span class='notice'>You attach the screw driver bit to [src].</span>")
|
||||
|
||||
@@ -18,44 +18,47 @@
|
||||
var/mob_retaliate = 0
|
||||
|
||||
/obj/random/mob/item_to_spawn()
|
||||
return pick(prob(10);/mob/living/simple_animal/lizard,
|
||||
prob(6);/mob/living/simple_animal/retaliate/diyaab,
|
||||
prob(10);/mob/living/simple_animal/cat/fluff,
|
||||
prob(6);/mob/living/simple_animal/cat/kitten,
|
||||
prob(10);/mob/living/simple_animal/corgi,
|
||||
prob(6);/mob/living/simple_animal/corgi/puppy,
|
||||
prob(10);/mob/living/simple_animal/crab,
|
||||
prob(10);/mob/living/simple_animal/chicken,
|
||||
prob(6);/mob/living/simple_animal/chick,
|
||||
prob(10);/mob/living/simple_animal/cow,
|
||||
prob(6);/mob/living/simple_animal/retaliate/goat,
|
||||
prob(10);/mob/living/simple_animal/penguin,
|
||||
prob(10);/mob/living/simple_animal/mouse,
|
||||
prob(10);/mob/living/simple_animal/yithian,
|
||||
prob(10);/mob/living/simple_animal/tindalos,
|
||||
prob(10);/mob/living/simple_animal/corgi/tamaskan,
|
||||
prob(3);/mob/living/simple_animal/parrot,
|
||||
prob(1);/mob/living/simple_animal/giant_crab)
|
||||
return pick(prob(10);/mob/living/simple_mob/animal/passive/lizard,
|
||||
prob(6);/mob/living/simple_mob/animal/sif/diyaab,
|
||||
prob(10);/mob/living/simple_mob/animal/passive/cat,
|
||||
prob(6);/mob/living/simple_mob/animal/passive/cat,
|
||||
prob(10);/mob/living/simple_mob/animal/passive/dog/corgi,
|
||||
prob(6);/mob/living/simple_mob/animal/passive/dog/corgi/puppy,
|
||||
prob(10);/mob/living/simple_mob/animal/passive/crab,
|
||||
prob(10);/mob/living/simple_mob/animal/passive/chicken,
|
||||
prob(6);/mob/living/simple_mob/animal/passive/chick,
|
||||
prob(10);/mob/living/simple_mob/animal/passive/cow,
|
||||
prob(6);/mob/living/simple_mob/animal/goat,
|
||||
prob(10);/mob/living/simple_mob/animal/passive/penguin,
|
||||
prob(10);/mob/living/simple_mob/animal/passive/mouse,
|
||||
prob(10);/mob/living/simple_mob/animal/passive/yithian,
|
||||
prob(10);/mob/living/simple_mob/animal/passive/tindalos,
|
||||
prob(10);/mob/living/simple_mob/animal/passive/dog/tamaskan,
|
||||
prob(3);/mob/living/simple_mob/animal/passive/bird/parrot,
|
||||
prob(1);/mob/living/simple_mob/animal/passive/crab)
|
||||
|
||||
/obj/random/mob/spawn_item() //These should only ever have simple mobs.
|
||||
var/build_path = item_to_spawn()
|
||||
|
||||
var/mob/living/simple_animal/M = new build_path(src.loc)
|
||||
M.ai_inactive = 1 //Don't fight eachother while we're still setting up!
|
||||
if(mob_faction)
|
||||
M.faction = mob_faction
|
||||
M.returns_home = mob_returns_home
|
||||
M.wander = mob_wander
|
||||
M.wander_distance = mob_wander_distance
|
||||
if(overwrite_hostility)
|
||||
M.hostile = mob_hostile
|
||||
M.retaliate = mob_retaliate
|
||||
M.ai_inactive = 0 //Now you can kill eachother if your faction didn't override.
|
||||
var/mob/living/simple_mob/M = new build_path(src.loc)
|
||||
if(!istype(M))
|
||||
return
|
||||
if(M.has_AI())
|
||||
var/datum/ai_holder/AI = M.ai_holder
|
||||
AI.go_sleep() //Don't fight eachother while we're still setting up!
|
||||
AI.returns_home = mob_returns_home
|
||||
AI.wander = mob_wander
|
||||
AI.max_home_distance = mob_wander_distance
|
||||
if(overwrite_hostility)
|
||||
AI.hostile = mob_hostile
|
||||
AI.retaliate = mob_retaliate
|
||||
AI.go_wake() //Now you can kill eachother if your faction didn't override.
|
||||
|
||||
if(pixel_x || pixel_y)
|
||||
M.pixel_x = pixel_x
|
||||
M.pixel_y = pixel_y
|
||||
|
||||
|
||||
/obj/random/mob/sif
|
||||
name = "Random Sif Animal"
|
||||
desc = "This is a random cold weather animal."
|
||||
@@ -65,14 +68,14 @@
|
||||
mob_wander_distance = 10
|
||||
|
||||
/obj/random/mob/sif/item_to_spawn()
|
||||
return pick(prob(30);/mob/living/simple_animal/retaliate/diyaab,
|
||||
prob(15);/mob/living/simple_animal/crab,
|
||||
prob(15);/mob/living/simple_animal/penguin,
|
||||
prob(15);/mob/living/simple_animal/mouse,
|
||||
prob(15);/mob/living/simple_animal/corgi/tamaskan,
|
||||
prob(2);/mob/living/simple_animal/hostile/giant_spider/frost,
|
||||
prob(1);/mob/living/simple_animal/hostile/goose,
|
||||
prob(20);/mob/living/simple_animal/giant_crab)
|
||||
return pick(prob(30);/mob/living/simple_mob/animal/sif/diyaab,
|
||||
prob(15);/mob/living/simple_mob/animal/passive/crab,
|
||||
prob(15);/mob/living/simple_mob/animal/passive/penguin,
|
||||
prob(15);/mob/living/simple_mob/animal/passive/mouse,
|
||||
prob(15);/mob/living/simple_mob/animal/passive/dog/tamaskan,
|
||||
prob(2);/mob/living/simple_mob/animal/giant_spider/frost,
|
||||
prob(1);/mob/living/simple_mob/animal/space/goose,
|
||||
prob(20);/mob/living/simple_mob/animal/passive/crab)
|
||||
|
||||
|
||||
/obj/random/mob/sif/peaceful
|
||||
@@ -84,12 +87,12 @@
|
||||
mob_wander_distance = 12
|
||||
|
||||
/obj/random/mob/sif/peaceful/item_to_spawn()
|
||||
return pick(prob(30);/mob/living/simple_animal/retaliate/diyaab,
|
||||
prob(15);/mob/living/simple_animal/crab,
|
||||
prob(15);/mob/living/simple_animal/penguin,
|
||||
prob(15);/mob/living/simple_animal/mouse,
|
||||
prob(15);/mob/living/simple_animal/corgi/tamaskan,
|
||||
prob(20);/mob/living/simple_animal/giant_crab)
|
||||
return pick(prob(30);/mob/living/simple_mob/animal/sif/diyaab,
|
||||
prob(15);/mob/living/simple_mob/animal/passive/crab,
|
||||
prob(15);/mob/living/simple_mob/animal/passive/penguin,
|
||||
prob(15);/mob/living/simple_mob/animal/passive/mouse,
|
||||
prob(15);/mob/living/simple_mob/animal/passive/dog/tamaskan,
|
||||
prob(20);/mob/living/simple_mob/animal/sif/hooligan_crab)
|
||||
|
||||
/obj/random/mob/sif/hostile
|
||||
name = "Random Hostile Sif Animal"
|
||||
@@ -97,9 +100,9 @@
|
||||
icon_state = "frost"
|
||||
|
||||
/obj/random/mob/sif/hostile/item_to_spawn()
|
||||
return pick(prob(22);/mob/living/simple_animal/hostile/savik,
|
||||
prob(33);/mob/living/simple_animal/hostile/giant_spider/frost,
|
||||
prob(45);/mob/living/simple_animal/hostile/shantak)
|
||||
return pick(prob(22);/mob/living/simple_mob/animal/sif/savik,
|
||||
prob(33);/mob/living/simple_mob/animal/giant_spider/frost,
|
||||
prob(45);/mob/living/simple_mob/animal/sif/shantak)
|
||||
|
||||
/obj/random/mob/spider
|
||||
name = "Random Spider" //Spiders should patrol where they spawn.
|
||||
@@ -110,9 +113,9 @@
|
||||
mob_wander_distance = 4
|
||||
|
||||
/obj/random/mob/spider/item_to_spawn()
|
||||
return pick(prob(22);/mob/living/simple_animal/hostile/giant_spider/nurse,
|
||||
prob(33);/mob/living/simple_animal/hostile/giant_spider/hunter,
|
||||
prob(45);/mob/living/simple_animal/hostile/giant_spider)
|
||||
return pick(prob(22);/mob/living/simple_mob/animal/giant_spider/nurse,
|
||||
prob(33);/mob/living/simple_mob/animal/giant_spider/hunter,
|
||||
prob(45);/mob/living/simple_mob/animal/giant_spider)
|
||||
|
||||
/obj/random/mob/spider/nurse
|
||||
name = "Random Nurse Spider"
|
||||
@@ -123,8 +126,8 @@
|
||||
mob_wander_distance = 4
|
||||
|
||||
/obj/random/mob/spider/nurse/item_to_spawn()
|
||||
return pick(prob(22);/mob/living/simple_animal/hostile/giant_spider/nurse/hat,
|
||||
prob(45);/mob/living/simple_animal/hostile/giant_spider/nurse)
|
||||
return pick(prob(22);/mob/living/simple_mob/animal/giant_spider/nurse/hat,
|
||||
prob(45);/mob/living/simple_mob/animal/giant_spider/nurse)
|
||||
|
||||
/obj/random/mob/spider/mutant
|
||||
name = "Random Mutant Spider"
|
||||
@@ -133,15 +136,15 @@
|
||||
|
||||
/obj/random/mob/spider/mutant/item_to_spawn()
|
||||
return pick(prob(5);/obj/random/mob/spider,
|
||||
prob(10);/mob/living/simple_animal/hostile/giant_spider/webslinger,
|
||||
prob(10);/mob/living/simple_animal/hostile/giant_spider/carrier,
|
||||
prob(33);/mob/living/simple_animal/hostile/giant_spider/lurker,
|
||||
prob(33);/mob/living/simple_animal/hostile/giant_spider/tunneler,
|
||||
prob(40);/mob/living/simple_animal/hostile/giant_spider/pepper,
|
||||
prob(20);/mob/living/simple_animal/hostile/giant_spider/thermic,
|
||||
prob(40);/mob/living/simple_animal/hostile/giant_spider/electric,
|
||||
prob(1);/mob/living/simple_animal/hostile/giant_spider/phorogenic,
|
||||
prob(40);/mob/living/simple_animal/hostile/giant_spider/frost)
|
||||
prob(10);/mob/living/simple_mob/animal/giant_spider/webslinger,
|
||||
prob(10);/mob/living/simple_mob/animal/giant_spider/carrier,
|
||||
prob(33);/mob/living/simple_mob/animal/giant_spider/lurker,
|
||||
prob(33);/mob/living/simple_mob/animal/giant_spider/tunneler,
|
||||
prob(40);/mob/living/simple_mob/animal/giant_spider/pepper,
|
||||
prob(20);/mob/living/simple_mob/animal/giant_spider/thermic,
|
||||
prob(40);/mob/living/simple_mob/animal/giant_spider/electric,
|
||||
prob(1);/mob/living/simple_mob/animal/giant_spider/phorogenic,
|
||||
prob(40);/mob/living/simple_mob/animal/giant_spider/frost)
|
||||
|
||||
/obj/random/mob/robotic
|
||||
name = "Random Robot Mob"
|
||||
@@ -158,17 +161,18 @@
|
||||
mob_retaliate = 1
|
||||
|
||||
/obj/random/mob/robotic/item_to_spawn() //Hivebots have a total number of 'lots' equal to the lesser drone, at 60.
|
||||
return pick(prob(60);/mob/living/simple_animal/hostile/malf_drone/lesser,
|
||||
prob(50);/mob/living/simple_animal/hostile/malf_drone,
|
||||
prob(15);/mob/living/simple_animal/hostile/mecha/malf_drone,
|
||||
prob(10);/mob/living/simple_animal/hostile/hivebot,
|
||||
prob(15);/mob/living/simple_animal/hostile/hivebot/swarm,
|
||||
prob(10);/mob/living/simple_animal/hostile/hivebot/range,
|
||||
prob(5);/mob/living/simple_animal/hostile/hivebot/range/rapid,
|
||||
prob(5);/mob/living/simple_animal/hostile/hivebot/range/ion,
|
||||
prob(5);/mob/living/simple_animal/hostile/hivebot/range/laser,
|
||||
prob(5);/mob/living/simple_animal/hostile/hivebot/range/strong,
|
||||
prob(5);/mob/living/simple_animal/hostile/hivebot/range/guard)
|
||||
return pick(prob(60);/mob/living/simple_mob/mechanical/combat_drone/lesser,
|
||||
prob(50);/mob/living/simple_mob/mechanical/combat_drone,
|
||||
prob(15);/mob/living/simple_mob/mechanical/mecha/ripley,
|
||||
prob(15);/mob/living/simple_mob/mechanical/mecha/odysseus,
|
||||
prob(10);/mob/living/simple_mob/mechanical/hivebot,
|
||||
prob(15);/mob/living/simple_mob/mechanical/hivebot/swarm,
|
||||
prob(10);/mob/living/simple_mob/mechanical/hivebot/ranged_damage,
|
||||
prob(5);/mob/living/simple_mob/mechanical/hivebot/ranged_damage/rapid,
|
||||
prob(5);/mob/living/simple_mob/mechanical/hivebot/ranged_damage/ion,
|
||||
prob(5);/mob/living/simple_mob/mechanical/hivebot/ranged_damage/laser,
|
||||
prob(5);/mob/living/simple_mob/mechanical/hivebot/ranged_damage/strong,
|
||||
prob(5);/mob/living/simple_mob/mechanical/hivebot/ranged_damage/strong/guard)
|
||||
|
||||
/obj/random/mob/robotic/hivebot
|
||||
name = "Random Hivebot"
|
||||
@@ -178,14 +182,14 @@
|
||||
mob_faction = "hivebot"
|
||||
|
||||
/obj/random/mob/robotic/hivebot/item_to_spawn()
|
||||
return pick(prob(10);/mob/living/simple_animal/hostile/hivebot,
|
||||
prob(15);/mob/living/simple_animal/hostile/hivebot/swarm,
|
||||
prob(10);/mob/living/simple_animal/hostile/hivebot/range,
|
||||
prob(5);/mob/living/simple_animal/hostile/hivebot/range/rapid,
|
||||
prob(5);/mob/living/simple_animal/hostile/hivebot/range/ion,
|
||||
prob(5);/mob/living/simple_animal/hostile/hivebot/range/laser,
|
||||
prob(5);/mob/living/simple_animal/hostile/hivebot/range/strong,
|
||||
prob(5);/mob/living/simple_animal/hostile/hivebot/range/guard)
|
||||
return pick(prob(10);/mob/living/simple_mob/mechanical/hivebot,
|
||||
prob(15);/mob/living/simple_mob/mechanical/hivebot/swarm,
|
||||
prob(10);/mob/living/simple_mob/mechanical/hivebot/ranged_damage,
|
||||
prob(5);/mob/living/simple_mob/mechanical/hivebot/ranged_damage/rapid,
|
||||
prob(5);/mob/living/simple_mob/mechanical/hivebot/ranged_damage/ion,
|
||||
prob(5);/mob/living/simple_mob/mechanical/hivebot/ranged_damage/laser,
|
||||
prob(5);/mob/living/simple_mob/mechanical/hivebot/ranged_damage/strong,
|
||||
prob(5);/mob/living/simple_mob/mechanical/hivebot/ranged_damage/strong/guard)
|
||||
|
||||
//Mice
|
||||
|
||||
@@ -195,7 +199,7 @@
|
||||
icon_state = "mouse_gray"
|
||||
|
||||
/obj/random/mob/mouse/item_to_spawn()
|
||||
return pick(prob(15);/mob/living/simple_animal/mouse/white,
|
||||
prob(30);/mob/living/simple_animal/mouse/brown,
|
||||
prob(30);/mob/living/simple_animal/mouse/gray,
|
||||
return pick(prob(15);/mob/living/simple_mob/animal/passive/mouse/white,
|
||||
prob(30);/mob/living/simple_mob/animal/passive/mouse/brown,
|
||||
prob(30);/mob/living/simple_mob/animal/passive/mouse/gray,
|
||||
prob(25);/obj/random/mouseremains) //because figuring out how to come up with it picking nothing is beyond my coding ability.
|
||||
|
||||
@@ -176,8 +176,8 @@
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/obj/structure/attack_generic(var/mob/user, var/damage, var/attack_verb, var/wallbreaker)
|
||||
if(!breakable || damage < 10 || !wallbreaker)
|
||||
/obj/structure/attack_generic(var/mob/user, var/damage, var/attack_verb)
|
||||
if(!breakable || damage < STRUCTURE_MIN_DAMAGE_THRESHOLD)
|
||||
return 0
|
||||
visible_message("<span class='danger'>[user] [attack_verb] the [src] apart!</span>")
|
||||
user.do_attack_animation(src)
|
||||
|
||||
@@ -381,8 +381,8 @@
|
||||
else
|
||||
icon_state = icon_opened
|
||||
|
||||
/obj/structure/closet/attack_generic(var/mob/user, var/damage, var/attack_message = "destroys", var/wallbreaker)
|
||||
if(damage < 10 || !wallbreaker)
|
||||
/obj/structure/closet/attack_generic(var/mob/user, var/damage, var/attack_message = "destroys")
|
||||
if(damage < STRUCTURE_MIN_DAMAGE_THRESHOLD)
|
||||
return
|
||||
user.do_attack_animation(src)
|
||||
visible_message("<span class='danger'>[user] [attack_message] the [src]!</span>")
|
||||
@@ -459,4 +459,4 @@
|
||||
if(src.loc)
|
||||
if(istype(src.loc, /obj/structure/closet))
|
||||
return (loc.return_air_for_internal_lifeform(L))
|
||||
return return_air()
|
||||
return return_air()
|
||||
|
||||
@@ -90,23 +90,23 @@
|
||||
|
||||
/obj/structure/largecrate/animal/corgi
|
||||
name = "corgi carrier"
|
||||
starts_with = list(/mob/living/simple_animal/corgi)
|
||||
starts_with = list(/mob/living/simple_mob/animal/passive/dog/corgi)
|
||||
|
||||
/obj/structure/largecrate/animal/cow
|
||||
name = "cow crate"
|
||||
starts_with = list(/mob/living/simple_animal/cow)
|
||||
starts_with = list(/mob/living/simple_mob/animal/passive/cow)
|
||||
|
||||
/obj/structure/largecrate/animal/goat
|
||||
name = "goat crate"
|
||||
starts_with = list(/mob/living/simple_animal/retaliate/goat)
|
||||
starts_with = list(/mob/living/simple_mob/animal/goat)
|
||||
|
||||
/obj/structure/largecrate/animal/cat
|
||||
name = "cat carrier"
|
||||
starts_with = list(/mob/living/simple_animal/cat)
|
||||
starts_with = list(/mob/living/simple_mob/animal/passive/cat)
|
||||
|
||||
/obj/structure/largecrate/animal/cat/bones
|
||||
starts_with = list(/mob/living/simple_animal/cat/fluff/bones)
|
||||
starts_with = list(/mob/living/simple_mob/animal/passive/cat/bones)
|
||||
|
||||
/obj/structure/largecrate/animal/chick
|
||||
name = "chicken crate"
|
||||
starts_with = list(/mob/living/simple_animal/chick = 5)
|
||||
starts_with = list(/mob/living/simple_mob/animal/passive/chick = 5)
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
/obj/structure/ghost_pod/manual/corgi/create_occupant(var/mob/M)
|
||||
lightning_strike(get_turf(src), cosmetic = TRUE)
|
||||
density = FALSE
|
||||
var/mob/living/simple_animal/corgi/R = new(get_turf(src))
|
||||
var/mob/living/simple_mob/animal/passive/dog/corgi/R = new(get_turf(src))
|
||||
if(M.mind)
|
||||
M.mind.transfer_to(R)
|
||||
to_chat(M, "<span class='notice'>You are a <b>Corgi</b>! Woof!</span>")
|
||||
@@ -47,4 +47,4 @@
|
||||
R.ghost_inhabit(M)
|
||||
visible_message("<span class='warning'>The blade shines brightly for a brief moment as [usr] pulls it out of the stone!</span>")
|
||||
log_and_message_admins("successfully acquired a cursed sword.")
|
||||
..()
|
||||
..()
|
||||
|
||||
@@ -83,8 +83,8 @@
|
||||
health = (displaced_health - round(current_damage / 4))
|
||||
cover = 25
|
||||
|
||||
/obj/structure/girder/attack_generic(var/mob/user, var/damage, var/attack_message = "smashes apart", var/wallbreaker)
|
||||
if(!damage || !wallbreaker)
|
||||
/obj/structure/girder/attack_generic(var/mob/user, var/damage, var/attack_message = "smashes apart")
|
||||
if(damage < STRUCTURE_MIN_DAMAGE_THRESHOLD)
|
||||
return 0
|
||||
user.do_attack_animation(src)
|
||||
visible_message("<span class='danger'>[user] [attack_message] the [src]!</span>")
|
||||
|
||||
@@ -126,7 +126,7 @@
|
||||
src.set_dir(turn(src.dir, 90))
|
||||
return
|
||||
else
|
||||
if(istype(usr,/mob/living/simple_animal/mouse))
|
||||
if(ismouse(usr))
|
||||
return
|
||||
if(!usr || !isturf(usr.loc))
|
||||
return
|
||||
|
||||
@@ -574,6 +574,7 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh
|
||||
icon = 'icons/mecha/mecha.dmi'
|
||||
icon_state = "engineering_pod-broken"
|
||||
density = TRUE
|
||||
anchored = FALSE // In case a dead mecha-mob dies in a bad spot.
|
||||
|
||||
chance_uncommon = 20
|
||||
chance_rare = 10
|
||||
@@ -615,7 +616,7 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh
|
||||
/obj/structure/loot_pile/mecha/ripley
|
||||
name = "ripley wreckage"
|
||||
desc = "The ruins of some unfortunate ripley. Perhaps something is salvageable."
|
||||
icon_states_to_use = list("ripley-broken", "firefighter-broken", "ripley-broken-old")
|
||||
icon_state = "ripley-broken"
|
||||
|
||||
common_loot = list(
|
||||
/obj/random/tool,
|
||||
@@ -649,6 +650,12 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy/flamer/rigged
|
||||
)
|
||||
|
||||
/obj/structure/loot_pile/mecha/ripley/firefighter
|
||||
icon_state = "firefighter-broken"
|
||||
|
||||
/obj/structure/loot_pile/mecha/ripley/random_sprite
|
||||
icon_states_to_use = list("ripley-broken", "firefighter-broken", "ripley-broken-old")
|
||||
|
||||
//Death-Ripley, same common, but more combat-exosuit-based
|
||||
/obj/structure/loot_pile/mecha/deathripley
|
||||
name = "strange ripley wreckage"
|
||||
@@ -719,6 +726,14 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh
|
||||
/obj/item/mecha_parts/mecha_equipment/shocker
|
||||
)
|
||||
|
||||
/obj/structure/loot_pile/mecha/odysseus/murdysseus
|
||||
icon_state = "murdysseus-broken"
|
||||
|
||||
/obj/structure/loot_pile/mecha/hoverpod
|
||||
name = "hoverpod wreckage"
|
||||
desc = "The ruins of some unfortunate hoverpod. Perhaps something is salvageable."
|
||||
icon_state = "engineering_pod"
|
||||
|
||||
/obj/structure/loot_pile/mecha/gygax
|
||||
name = "gygax wreckage"
|
||||
desc = "The ruins of some unfortunate gygax. Perhaps something is salvageable."
|
||||
@@ -759,6 +774,18 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy
|
||||
)
|
||||
|
||||
/obj/structure/loot_pile/mecha/gygax/dark
|
||||
icon_state = "darkgygax-broken"
|
||||
|
||||
// Todo: Better loot.
|
||||
/obj/structure/loot_pile/mecha/gygax/dark/adv
|
||||
icon_state = "darkgygax_adv-broken"
|
||||
icon_scale = 1.5
|
||||
pixel_y = 8
|
||||
|
||||
/obj/structure/loot_pile/mecha/gygax/medgax
|
||||
icon_state = "medgax-broken"
|
||||
|
||||
/obj/structure/loot_pile/mecha/durand
|
||||
name = "durand wreckage"
|
||||
desc = "The ruins of some unfortunate durand. Perhaps something is salvageable."
|
||||
@@ -799,6 +826,22 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy
|
||||
)
|
||||
|
||||
/obj/structure/loot_pile/mecha/marauder
|
||||
name = "marauder wreckage"
|
||||
desc = "The ruins of some unfortunate marauder. Perhaps something is salvagable."
|
||||
icon_state = "marauder-broken"
|
||||
// Todo: Better loot.
|
||||
|
||||
/obj/structure/loot_pile/mecha/marauder/seraph
|
||||
name = "seraph wreckage"
|
||||
desc = "The ruins of some unfortunate seraph. Perhaps something is salvagable."
|
||||
icon_state = "seraph-broken"
|
||||
|
||||
/obj/structure/loot_pile/mecha/marauder/mauler
|
||||
name = "mauler wreckage"
|
||||
desc = "The ruins of some unfortunate mauler. Perhaps something is salvagable."
|
||||
icon_state = "mauler-broken"
|
||||
|
||||
/obj/structure/loot_pile/mecha/phazon
|
||||
name = "phazon wreckage"
|
||||
desc = "The ruins of some unfortunate phazon. Perhaps something is salvageable."
|
||||
|
||||
@@ -321,7 +321,7 @@
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
|
||||
if(istype(usr,/mob/living/simple_animal/mouse))
|
||||
if(istype(usr,/mob/living/simple_mob/animal/passive/mouse))
|
||||
return
|
||||
else if(!usr || !isturf(usr.loc))
|
||||
return
|
||||
|
||||
@@ -10,8 +10,8 @@
|
||||
explosion_resistance = 5
|
||||
var/list/mobs_can_pass = list(
|
||||
/mob/living/bot,
|
||||
/mob/living/simple_animal/slime,
|
||||
/mob/living/simple_animal/mouse,
|
||||
/mob/living/simple_mob/slime/xenobio,
|
||||
/mob/living/simple_mob/animal/passive/mouse,
|
||||
/mob/living/silicon/robot/drone
|
||||
)
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
var/last_spawn
|
||||
var/spawn_delay = 150
|
||||
var/randomize_spawning = FALSE
|
||||
var/creature_types = list(/mob/living/simple_animal/retaliate/diyaab)
|
||||
var/creature_types = list(/mob/living/simple_mob/animal/sif/diyaab)
|
||||
var/list/den_mobs
|
||||
var/den_faction //The faction of any spawned creatures.
|
||||
var/max_creatures = 3 //Maximum number of living creatures this nest can have at one time.
|
||||
|
||||
@@ -206,6 +206,6 @@
|
||||
/obj/structure/simple_door/cult/TryToSwitchState(atom/user)
|
||||
if(isliving(user))
|
||||
var/mob/living/L = user
|
||||
if(!iscultist(L) && !istype(L, /mob/living/simple_animal/construct))
|
||||
if(!iscultist(L) && !istype(L, /mob/living/simple_mob/construct))
|
||||
return
|
||||
..()
|
||||
|
||||
@@ -77,7 +77,7 @@
|
||||
src.set_dir(turn(src.dir, 90))
|
||||
return
|
||||
else
|
||||
if(istype(usr,/mob/living/simple_animal/mouse))
|
||||
if(istype(usr,/mob/living/simple_mob/animal/passive/mouse))
|
||||
return
|
||||
if(!usr || !isturf(usr.loc))
|
||||
return
|
||||
|
||||
@@ -206,7 +206,7 @@
|
||||
user.setClickCooldown(user.get_attack_speed())
|
||||
if(!damage)
|
||||
return
|
||||
if(damage >= 10)
|
||||
if(damage >= STRUCTURE_MIN_DAMAGE_THRESHOLD)
|
||||
visible_message("<span class='danger'>[user] smashes into [src]!</span>")
|
||||
if(reinf)
|
||||
damage = damage / 2
|
||||
|
||||
@@ -27,16 +27,16 @@
|
||||
|
||||
cleaving = TRUE
|
||||
var/hit_mobs = 0
|
||||
for(var/mob/living/simple_animal/SA in range(get_turf(target), 1))
|
||||
if(SA.stat == DEAD) // Don't beat a dead horse.
|
||||
for(var/mob/living/simple_mob/SM in range(get_turf(target), 1))
|
||||
if(SM.stat == DEAD) // Don't beat a dead horse.
|
||||
continue
|
||||
if(SA == user) // Don't hit ourselves. Simple mobs shouldn't be able to do this but that might change later to be able to hit all mob/living-s.
|
||||
if(SM == user) // Don't hit ourselves. Simple mobs shouldn't be able to do this but that might change later to be able to hit all mob/living-s.
|
||||
continue
|
||||
if(SA == target) // We (presumably) already hit the target before cleave() was called. orange() should prevent this but just to be safe...
|
||||
if(SM == target) // We (presumably) already hit the target before cleave() was called. orange() should prevent this but just to be safe...
|
||||
continue
|
||||
if(!SA.Adjacent(user) || !SA.Adjacent(target)) // Cleaving only hits mobs near the target mob and user.
|
||||
if(!SM.Adjacent(user) || !SM.Adjacent(target)) // Cleaving only hits mobs near the target mob and user.
|
||||
continue
|
||||
if(resolve_attackby(SA, user, attack_modifier = 0.5)) // Hit them with the weapon. This won't cause recursive cleaving due to the cleaving variable being set to true.
|
||||
if(resolve_attackby(SM, user, attack_modifier = 0.5)) // Hit them with the weapon. This won't cause recursive cleaving due to the cleaving variable being set to true.
|
||||
hit_mobs++
|
||||
|
||||
cleave_visual(user, target)
|
||||
@@ -55,4 +55,4 @@
|
||||
// This is purely the visual effect of cleaving.
|
||||
/obj/item/weapon/proc/cleave_visual(var/mob/living/user, var/mob/living/target)
|
||||
var/obj/effect/temporary_effect/cleave_attack/E = new(get_turf(src))
|
||||
E.dir = get_dir(user, target)
|
||||
E.dir = get_dir(user, target)
|
||||
|
||||
Reference in New Issue
Block a user