mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2026-08-26 06:39:22 +01:00
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:
@@ -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
|
||||
))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
)
|
||||
)
|
||||
Reference in New Issue
Block a user