Explorer Expansion: New Horizons (#6960)

* Large amount of work; Animal taming, shearing. Random animal spawns on sif grass/forest turfs. New PoIs, thermal poncho.

* Combat drone DMI moved to drones folder. Mining Drone subtype added. "Tameable" with ores, will collect and store ores when not in active combat.
This commit is contained in:
Mechoid
2020-05-01 11:19:21 -07:00
committed by GitHub
parent 0813d1db6b
commit aafd4b4fa6
95 changed files with 2145 additions and 594 deletions
+133 -1
View File
@@ -400,4 +400,136 @@
/obj/item/weapon/gun/projectile/shotgun/pump/combat,
/obj/item/weapon/storage/box/shotgunammo
)
)
)
// Not strictly a gun, but is used in PoIs to spawn the dropped guns of mercs, or a busted version.
/obj/random/projectile/scrapped_gun
name = "broken gun spawner"
desc = "Spawns a random broken gun, or rarely a fully functional one."
icon = 'icons/obj/gun.dmi'
icon_state = "revolver"
/obj/random/projectile/scrapped_gun/item_to_spawn()
return pickweight(list(
/obj/random/projectile/scrapped_pistol = 10,
/obj/random/projectile/scrapped_smg = 5,
/obj/random/projectile/scrapped_laser = 5,
/obj/random/projectile/scrapped_shotgun = 3,
/obj/random/projectile/scrapped_ionrifle = 3,
/obj/random/projectile/scrapped_bulldog = 1,
/obj/random/projectile/scrapped_flechette = 1,
/obj/random/projectile/scrapped_grenadelauncher = 1,
/obj/random/projectile/scrapped_dartgun = 1
))
/obj/random/projectile/scrapped_shotgun
name = "broken shotgun spawner"
desc = "Loot for PoIs, or their mobs."
icon = 'icons/obj/gun.dmi'
icon_state = "shotgun"
/obj/random/projectile/scrapped_shotgun/item_to_spawn()
return pickweight(list(
/obj/item/weapon/broken_gun/pumpshotgun = 10,
/obj/item/weapon/broken_gun/pumpshotgun_combat = 5,
/obj/item/weapon/gun/projectile/shotgun/pump = 3,
/obj/item/weapon/gun/projectile/shotgun/pump/combat = 1
))
/obj/random/projectile/scrapped_smg
name = "broken smg spawner"
desc = "Loot for PoIs, or their mobs."
icon = 'icons/obj/gun.dmi'
icon_state = "revolver"
/obj/random/projectile/scrapped_smg/item_to_spawn()
return pickweight(list(
/obj/item/weapon/broken_gun/c20r = 10,
/obj/item/weapon/gun/projectile/automatic/c20r = 3
))
/obj/random/projectile/scrapped_pistol
name = "broken pistol spawner"
desc = "Loot for PoIs, or their mobs."
icon = 'icons/obj/gun.dmi'
icon_state = "revolver"
/obj/random/projectile/scrapped_pistol/item_to_spawn()
return pickweight(list(
/obj/item/weapon/broken_gun/silenced45 = 10,
/obj/item/weapon/gun/projectile/silenced = 3
))
/obj/random/projectile/scrapped_laser
name = "broken laser spawner"
desc = "Loot for PoIs, or their mobs."
icon = 'icons/obj/gun.dmi'
icon_state = "revolver"
/obj/random/projectile/scrapped_laser/item_to_spawn()
return pickweight(list(
/obj/item/weapon/broken_gun/laserrifle = 10,
/obj/item/weapon/broken_gun/laser_retro = 5,
/obj/item/weapon/gun/energy/laser = 3,
/obj/item/weapon/gun/energy/retro = 1
))
/obj/random/projectile/scrapped_ionrifle
name = "broken ionrifle spawner"
desc = "Loot for PoIs, or their mobs."
icon = 'icons/obj/gun.dmi'
icon_state = "revolver"
/obj/random/projectile/scrapped_ionrifle/item_to_spawn()
return pickweight(list(
/obj/item/weapon/broken_gun/ionrifle = 10,
/obj/item/weapon/gun/energy/ionrifle = 3
))
/obj/random/projectile/scrapped_bulldog
name = "broken z8 spawner"
desc = "Loot for PoIs, or their mobs."
icon = 'icons/obj/gun.dmi'
icon_state = "revolver"
/obj/random/projectile/scrapped_bulldog/item_to_spawn()
return pickweight(list(
/obj/item/weapon/broken_gun/z8 = 10,
/obj/item/weapon/gun/projectile/automatic/z8 = 3
))
/obj/random/projectile/scrapped_flechette
name = "broken flechette spawner"
desc = "Loot for PoIs, or their mobs."
icon = 'icons/obj/gun.dmi'
icon_state = "revolver"
/obj/random/projectile/scrapped_flechette/item_to_spawn()
return pickweight(list(
/obj/item/weapon/broken_gun/flechette = 10,
/obj/item/weapon/gun/magnetic/railgun/flechette = 3
))
/obj/random/projectile/scrapped_grenadelauncher
name = "broken grenadelauncher spawner"
desc = "Loot for PoIs, or their mobs."
icon = 'icons/obj/gun.dmi'
icon_state = "revolver"
/obj/random/projectile/scrapped_grenadelauncher/item_to_spawn()
return pickweight(list(
/obj/item/weapon/broken_gun/grenadelauncher = 10,
/obj/item/weapon/gun/launcher/grenade = 3
))
/obj/random/projectile/scrapped_dartgun
name = "broken dartgun spawner"
desc = "Loot for PoIs, or their mobs."
icon = 'icons/obj/gun.dmi'
icon_state = "revolver"
/obj/random/projectile/scrapped_dartgun/item_to_spawn()
return pickweight(list(
/obj/item/weapon/broken_gun/dartgun = 10,
/obj/item/weapon/gun/projectile/dartgun = 3
))
+13
View File
@@ -700,3 +700,16 @@
/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/purple,
/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/grey,
/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/brown)
/obj/random/thermalponcho
name = "random thermal poncho"
desc = "This is a thermal poncho spawn."
icon = 'icons/obj/clothing/ties.dmi'
icon_state = "classicponcho"
/obj/random/thermalponcho/item_to_spawn()
return pick(prob(5);/obj/item/clothing/accessory/poncho/thermal,
prob(3);/obj/item/clothing/accessory/poncho/thermal/red,
prob(3);/obj/item/clothing/accessory/poncho/thermal/green,
prob(3);/obj/item/clothing/accessory/poncho/thermal/purple,
prob(3);/obj/item/clothing/accessory/poncho/thermal/blue)
+155
View File
@@ -104,6 +104,15 @@
prob(33);/mob/living/simple_mob/animal/giant_spider/frost,
prob(45);/mob/living/simple_mob/animal/sif/shantak)
/obj/random/mob/sif/kururak
name = "Random Kururak"
desc = "This is a random kururak, either waking or hibernating. Will be hostile if more than one are waking."
icon_state = "frost"
/obj/random/mob/sif/kururak/item_to_spawn()
return pick(prob(1);/mob/living/simple_mob/animal/sif/kururak/hibernate,
prob(20);/mob/living/simple_mob/animal/sif/kururak)
/obj/random/mob/spider
name = "Random Spider" //Spiders should patrol where they spawn.
desc = "This is a random boring spider."
@@ -163,6 +172,7 @@
/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_mob/mechanical/combat_drone/lesser,
prob(50);/mob/living/simple_mob/mechanical/combat_drone,
prob(50);/mob/living/simple_mob/mechanical/mining_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,
@@ -174,6 +184,25 @@
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/drone
name = "Random Drone"
desc = "This is a random drone."
icon_state = "drone_dead"
overwrite_hostility = 1
mob_faction = "malf_drone"
mob_returns_home = 1
mob_wander = 1
mob_wander_distance = 5
mob_hostile = 1
mob_retaliate = 1
/obj/random/mob/robotic/drone/item_to_spawn()
return pick(prob(6);/mob/living/simple_mob/mechanical/combat_drone/lesser,
prob(1);/mob/living/simple_mob/mechanical/combat_drone,
prob(3);/mob/living/simple_mob/mechanical/mining_drone)
/obj/random/mob/robotic/hivebot
name = "Random Hivebot"
desc = "This is a random hivebot."
@@ -203,3 +232,129 @@
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.
// Mercs
/obj/random/mob/merc
name = "Random Mercenary"
desc = "This is a random PoI mercenary."
icon_state = "syndicate"
mob_faction = "syndicate"
mob_returns_home = 1
mob_wander_distance = 7 // People like to wander, and these people probably have a lot of stuff to guard.
/obj/random/mob/merc/item_to_spawn()
return pick(prob(60);/mob/living/simple_mob/humanoid/merc/melee/poi,
prob(40);/mob/living/simple_mob/humanoid/merc/melee/sword/poi,
prob(40);/mob/living/simple_mob/humanoid/merc/ranged/poi,
prob(30);/mob/living/simple_mob/humanoid/merc/ranged/smg/poi,
prob(20);/mob/living/simple_mob/humanoid/merc/ranged/laser/poi,
prob(5);/mob/living/simple_mob/humanoid/merc/ranged/ionrifle/poi,
prob(10);/mob/living/simple_mob/humanoid/merc/ranged/grenadier/poi,
prob(10);/mob/living/simple_mob/humanoid/merc/ranged/rifle/poi,
prob(15);/mob/living/simple_mob/humanoid/merc/ranged/rifle/mag/poi,
prob(10);/mob/living/simple_mob/humanoid/merc/ranged/technician/poi
)
/obj/random/mob/merc/armored
name = "Random Armored Infantry Merc"
desc = "This is a random PoI exo or robot for mercs."
icon_state = "drone3"
/obj/random/mob/merc/armored/item_to_spawn()
return pick(prob(30);/mob/living/simple_mob/mechanical/mecha/combat/gygax/dark,
prob(40);/mob/living/simple_mob/mechanical/mecha/combat/gygax/medgax,
prob(40);/mob/living/simple_mob/mechanical/mecha/combat/gygax,
prob(10);/mob/living/simple_mob/mechanical/mecha/combat/durand/defensive/mercenary,
prob(60);/mob/living/simple_mob/mechanical/mecha/hoverpod/manned,
prob(5);/mob/living/simple_mob/mechanical/mecha/combat/marauder,
prob(1);/mob/living/simple_mob/mechanical/mecha/combat/marauder/seraph,
prob(15);/mob/living/simple_mob/mechanical/mecha/odysseus/manned,
prob(15);/mob/living/simple_mob/mechanical/mecha/odysseus/murdysseus/manned,
prob(60);/mob/living/simple_mob/mechanical/mecha/ripley/manned
)
/obj/random/mob/merc/all
name = "Random Mercenary All"
desc = "A random PoI mercenary, including armored."
/obj/random/mob/merc/all/item_to_spawn()
return pick(prob(20);/obj/random/mob/merc,
prob(1);/obj/random/mob/merc/armored
)
// Multiple mobs, one spawner.
/obj/random/mob/multiple
name = "Random Multiple Mob Spawner"
desc = "A base multiple-mob spawner. Takes lists of lists."
/obj/random/mob/multiple/spawn_item()
var/list/things_to_make = item_to_spawn()
for(var/new_type in things_to_make)
var/mob/living/simple_mob/M = new new_type(src.loc)
if(!istype(M))
continue
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/multiple/sifmobs
name = "Random Sifmob Pack"
desc = "A pack of random neutral sif mobs."
/obj/random/mob/multiple/sifmobs/item_to_spawn()
return pick(
prob(60);list(
/mob/living/simple_mob/animal/sif/diyaab,
/mob/living/simple_mob/animal/sif/diyaab,
/mob/living/simple_mob/animal/sif/diyaab
),
prob(30);list(
/mob/living/simple_mob/animal/sif/shantak/retaliate,
/mob/living/simple_mob/animal/sif/shantak/retaliate,
/mob/living/simple_mob/animal/sif/shantak/retaliate,
/mob/living/simple_mob/animal/sif/shantak/leader/autofollow/retaliate
),
prob(20);list(
/mob/living/simple_mob/animal/sif/duck,
/mob/living/simple_mob/animal/sif/duck,
/mob/living/simple_mob/animal/sif/duck
),
prob(10);list(
/mob/living/simple_mob/animal/sif/kururak/leader,
/mob/living/simple_mob/animal/sif/kururak,
/mob/living/simple_mob/animal/sif/kururak
),
prob(5);list(
/mob/living/simple_mob/animal/sif/glitterfly,
/mob/living/simple_mob/animal/sif/glitterfly,
/mob/living/simple_mob/animal/sif/glitterfly,
/mob/living/simple_mob/animal/sif/glitterfly,
/mob/living/simple_mob/animal/sif/glitterfly
),
prob(1);list(
/mob/living/simple_mob/animal/goat,
/mob/living/simple_mob/animal/goat
),
prob(1);list(
/mob/living/simple_mob/animal/sif/sakimm/intelligent,
/mob/living/simple_mob/animal/sif/sakimm,
/mob/living/simple_mob/animal/sif/sakimm,
/mob/living/simple_mob/animal/sif/sakimm
)
)