diff --git a/code/datums/uplink/ammunition.dm b/code/datums/uplink/ammunition.dm
index 3ed884316a..8b853aed63 100644
--- a/code/datums/uplink/ammunition.dm
+++ b/code/datums/uplink/ammunition.dm
@@ -65,6 +65,10 @@
name = "Anti-Materiel Rifle ammo box (14.5mm)"
path = /obj/item/weapon/storage/box/sniperammo
+/datum/uplink_item/item/ammo/sniperammo_highvel
+ name = "Anti-Materiel Rifle ammo box (14.5mm sabot)"
+ path = /obj/item/weapon/storage/box/sniperammo/highvel
+
/datum/uplink_item/item/ammo/c545
name = "Rifle Magazine (5.45mm)"
path = /obj/item/ammo_magazine/m545
diff --git a/code/game/objects/effects/alien/aliens.dm b/code/game/objects/effects/alien/aliens.dm
index d8b0821a4d..a8f8e6a634 100644
--- a/code/game/objects/effects/alien/aliens.dm
+++ b/code/game/objects/effects/alien/aliens.dm
@@ -160,8 +160,8 @@
#define WEED_NODE_BASE "nodebase"
/obj/effect/alien/weeds
- name = "weeds"
- desc = "Weird purple weeds."
+ name = "growth"
+ desc = "Weird organic growth."
icon_state = "weeds"
anchored = 1
@@ -185,25 +185,28 @@
/obj/effect/alien/weeds/node
icon_state = "weednode"
- name = "purple sac"
- desc = "Weird purple octopus-like thing."
+ name = "glowing growth"
+ desc = "Weird glowing organic growth."
layer = ABOVE_TURF_LAYER+0.01
light_range = NODERANGE
var/node_range = NODERANGE
var/set_color = null
-/obj/effect/alien/weeds/node/New()
- ..(src.loc, src)
+/obj/effect/alien/weeds/node/New(var/newloc, var/newcolor = "#321D37")
+ var/obj/effect/alien/weeds/existing = locate() in get_turf(newloc)
+ if(existing)
+ qdel(existing)
+
+ if(newcolor)
+ set_color = newcolor
+
+ ..(newloc, src)
/obj/effect/alien/weeds/node/Initialize()
..()
START_PROCESSING(SSobj, src)
- spawn(1 SECOND)
- if(color)
- set_color = color
-
/obj/effect/alien/weeds/node/Destroy()
STOP_PROCESSING(SSobj, src)
..()
@@ -272,12 +275,15 @@ Alien plants should do something if theres a lot of poison
qdel(src)
return
- if(!linked_node || (get_dist(linked_node, src) > linked_node.node_range) )
+ if(!linked_node)
return
if(linked_node != src)
color = linked_node.set_color
+ if(get_dist(linked_node, src) > linked_node.node_range)
+ return
+
direction_loop:
for(var/dirn in cardinal)
var/turf/T = get_step(src, dirn)
diff --git a/code/game/objects/effects/temporary_visuals/projectiles/impact.dm b/code/game/objects/effects/temporary_visuals/projectiles/impact.dm
index 872c652356..f059f37e54 100644
--- a/code/game/objects/effects/temporary_visuals/projectiles/impact.dm
+++ b/code/game/objects/effects/temporary_visuals/projectiles/impact.dm
@@ -74,7 +74,7 @@
light_power = 0.5
light_color = "#8837A3"
-/obj/effect/projectile/tungsten/impact
+/obj/effect/projectile/impact/tungsten
icon_state = "impact_mhd_laser"
light_range = 4
light_power = 3
diff --git a/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm b/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm
index 42511e6577..1c1d5bd687 100644
--- a/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm
+++ b/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm
@@ -86,7 +86,7 @@
light_power = 0.5
light_color = "#FF0D00"
-/obj/effect/projectile/tungsten/muzzle
+/obj/effect/projectile/muzzle/tungsten
icon_state = "muzzle_mhd_laser"
light_range = 4
light_power = 3
diff --git a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm
index 1c3caa08de..26ca7059cf 100644
--- a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm
+++ b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm
@@ -109,8 +109,14 @@
light_power = 0.5
light_color = "#0066FF"
-/obj/effect/projectile/tungsten/tracer
+/obj/effect/projectile/tracer/tungsten
icon_state = "mhd_laser"
light_range = 4
light_power = 3
light_color = "#3300ff"
+
+/obj/effect/projectile/tracer/cannon
+ icon_state = "cannon"
+ light_range = 1
+ light_power = 0.5
+ light_color = "#f6f2b6"
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index 8fa5938409..5246e6f3c3 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -419,7 +419,7 @@
. = ..()
if(.)
- user.visible_message("[user] cracks and shakes the glowstick.", "You crack and shake the glowstick, turning it on!")
+ user.visible_message("[user] cracks and shakes \the [name].", "You crack and shake \the [src], turning it on!")
START_PROCESSING(SSobj, src)
/obj/item/device/flashlight/glowstick/red
diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm
index ad6072dfbb..f713050f7a 100644
--- a/code/game/objects/items/weapons/storage/bags.dm
+++ b/code/game/objects/items/weapons/storage/bags.dm
@@ -142,6 +142,10 @@
if(O)
gather_all(get_turf(src), user)
+/obj/item/weapon/storage/bag/ore/proc/rangedload(atom/A, mob/user)
+ var/obj/item/weapon/ore/O = locate() in get_turf(A)
+ if(O)
+ gather_all(get_turf(A), user)
/obj/item/weapon/storage/bag/ore/examine(mob/user)
. = ..()
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index fb6ae8f86f..a1cad988d7 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -203,6 +203,11 @@
desc = "It has a picture of a gun and several warning symbols on the front.
WARNING: Live ammunition. Misuse may result in serious injury or death."
starts_with = list(/obj/item/ammo_casing/a145 = 7)
+/obj/item/weapon/storage/box/sniperammo/highvel
+ name = "box of 14.5mm sabot shells"
+ desc = "It has a picture of a gun and several warning symbols on the front.
WARNING: Live ammunition. Misuse may result in serious injury or death."
+ starts_with = list(/obj/item/ammo_casing/a145/highvel = 7)
+
/obj/item/weapon/storage/box/flashbangs
name = "box of flashbangs (WARNING)"
desc = "WARNING: These devices are extremely dangerous and can cause blindness or deafness in repeated use."
diff --git a/code/game/objects/random/guns_and_ammo.dm b/code/game/objects/random/guns_and_ammo.dm
index 62dde5a3df..a3411ef6fe 100644
--- a/code/game/objects/random/guns_and_ammo.dm
+++ b/code/game/objects/random/guns_and_ammo.dm
@@ -400,4 +400,136 @@
/obj/item/weapon/gun/projectile/shotgun/pump/combat,
/obj/item/weapon/storage/box/shotgunammo
)
- )
\ No newline at end of file
+ )
+
+// 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
+ ))
diff --git a/code/game/objects/random/misc.dm b/code/game/objects/random/misc.dm
index c8f196fef8..1e5f4345a0 100644
--- a/code/game/objects/random/misc.dm
+++ b/code/game/objects/random/misc.dm
@@ -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)
diff --git a/code/game/objects/random/mob.dm b/code/game/objects/random/mob.dm
index 966498a2bd..426f6f7986 100644
--- a/code/game/objects/random/mob.dm
+++ b/code/game/objects/random/mob.dm
@@ -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
+ )
+ )
\ No newline at end of file
diff --git a/code/game/objects/structures/crates_lockers/closets/coffin.dm b/code/game/objects/structures/crates_lockers/closets/coffin.dm
index 9257c2d3a3..7ea80de7ff 100644
--- a/code/game/objects/structures/crates_lockers/closets/coffin.dm
+++ b/code/game/objects/structures/crates_lockers/closets/coffin.dm
@@ -161,4 +161,7 @@
var/datum/gas_mixture/above_air = return_air()
grave_breath.adjust_gas(gasid, BREATH_MOLES)
grave_breath.temperature = (above_air.temperature) - 30 //Underground
- return grave_breath
\ No newline at end of file
+ return grave_breath
+
+/obj/structure/closet/grave/dirthole
+ name = "hole"
diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora/flora.dm
similarity index 92%
rename from code/game/objects/structures/flora.dm
rename to code/game/objects/structures/flora/flora.dm
index 1b5548cdb4..a0f2c8c307 100644
--- a/code/game/objects/structures/flora.dm
+++ b/code/game/objects/structures/flora/flora.dm
@@ -1,478 +1,493 @@
-
-/obj/structure/flora
- name = "flora"
- desc = "A perfectly generic plant."
-
- anchored = TRUE // Usually, plants don't move. Usually.
- plane = DECAL_PLANE
- layer = BELOW_MOB_LAYER
-
- var/randomize_size = FALSE
- var/max_x_scale = 1.25
- var/max_y_scale = 1.25
- var/min_x_scale = 0.9
- var/min_y_scale = 0.9
-
- var/harvest_tool = null // The type of item used to harvest the plant.
- var/harvest_count = 0
-
- var/randomize_harvest_count = TRUE
- var/max_harvests = 0
- var/min_harvests = -1
- var/list/harvest_loot = null // Should be an associative list for things to spawn, and their weights. An example would be a branch from a tree.
-
-/obj/structure/flora/Initialize()
- ..()
-
- if(randomize_size)
- icon_scale_x = rand(min_x_scale * 100, max_x_scale * 100) / 100
- icon_scale_y = rand(min_y_scale * 100, max_y_scale * 100) / 100
-
- if(prob(50))
- icon_scale_x *= -1
- update_transform()
-
- if(randomize_harvest_count)
- max_harvests = max(0, rand(min_harvests, max_harvests)) // Incase you want to weight it more toward 'not harvestable', set min_harvests to a negative value.
-
-/obj/structure/flora/examine(mob/user)
- . = ..()
- if(harvest_count < max_harvests)
- . += "It seems to have something hanging from it."
-
-/obj/structure/flora/attackby(var/obj/item/weapon/W, var/mob/living/user)
- if(can_harvest(W))
- var/harvest_spawn = pickweight(harvest_loot)
- var/atom/movable/AM = spawn_harvest(harvest_spawn, user)
-
- if(!AM)
- to_chat(user, "You fail to harvest anything from \the [src].")
-
- else
- to_chat(user, "You harvest \the [AM] from \the [src].")
- return
-
- ..(W, user)
-
-/obj/structure/flora/proc/can_harvest(var/obj/item/I)
- . = FALSE
- if(harvest_tool && istype(I, harvest_tool) && harvest_loot && harvest_loot.len && harvest_count < max_harvests)
- . = TRUE
- return .
-
-/obj/structure/flora/proc/spawn_harvest(var/path = null, var/mob/user = null)
- if(!ispath(path))
- return 0
- var/turf/Target = get_turf(src)
- if(user)
- Target = get_turf(user)
-
- var/atom/movable/AM = new path(Target)
-
- harvest_count++
- return AM
-
-//bushes
-/obj/structure/flora/bush
- name = "bush"
- icon = 'icons/obj/flora/snowflora.dmi'
- icon_state = "snowbush1"
-
-/obj/structure/flora/bush/New()
- ..()
- icon_state = "snowbush[rand(1, 6)]"
-
-/obj/structure/flora/pottedplant
- name = "potted plant"
- desc = "Really ties the room together."
- icon = 'icons/obj/plants.dmi'
- icon_state = "plant-26"
-
- anchored = FALSE
-
-//newbushes
-
-/obj/structure/flora/ausbushes
- name = "bush"
- icon = 'icons/obj/flora/ausflora.dmi'
- icon_state = "firstbush_1"
-
-/obj/structure/flora/ausbushes/New()
- ..()
- icon_state = "firstbush_[rand(1, 4)]"
-
-/obj/structure/flora/ausbushes/reedbush
- icon_state = "reedbush_1"
-
-/obj/structure/flora/ausbushes/reedbush/New()
- ..()
- icon_state = "reedbush_[rand(1, 4)]"
-
-/obj/structure/flora/ausbushes/leafybush
- icon_state = "leafybush_1"
-
-/obj/structure/flora/ausbushes/leafybush/New()
- ..()
- icon_state = "leafybush_[rand(1, 3)]"
-
-/obj/structure/flora/ausbushes/palebush
- icon_state = "palebush_1"
-
-/obj/structure/flora/ausbushes/palebush/New()
- ..()
- icon_state = "palebush_[rand(1, 4)]"
-
-/obj/structure/flora/ausbushes/stalkybush
- icon_state = "stalkybush_1"
-
-/obj/structure/flora/ausbushes/stalkybush/New()
- ..()
- icon_state = "stalkybush_[rand(1, 3)]"
-
-/obj/structure/flora/ausbushes/grassybush
- icon_state = "grassybush_1"
-
-/obj/structure/flora/ausbushes/grassybush/New()
- ..()
- icon_state = "grassybush_[rand(1, 4)]"
-
-/obj/structure/flora/ausbushes/fernybush
- icon_state = "fernybush_1"
-
-/obj/structure/flora/ausbushes/fernybush/New()
- ..()
- icon_state = "fernybush_[rand(1, 3)]"
-
-/obj/structure/flora/ausbushes/sunnybush
- icon_state = "sunnybush_1"
-
-/obj/structure/flora/ausbushes/sunnybush/New()
- ..()
- icon_state = "sunnybush_[rand(1, 3)]"
-
-/obj/structure/flora/ausbushes/genericbush
- icon_state = "genericbush_1"
-
-/obj/structure/flora/ausbushes/genericbush/New()
- ..()
- icon_state = "genericbush_[rand(1, 4)]"
-
-/obj/structure/flora/ausbushes/pointybush
- icon_state = "pointybush_1"
-
-/obj/structure/flora/ausbushes/pointybush/New()
- ..()
- icon_state = "pointybush_[rand(1, 4)]"
-
-/obj/structure/flora/ausbushes/lavendergrass
- icon_state = "lavendergrass_1"
-
-/obj/structure/flora/ausbushes/lavendergrass/New()
- ..()
- icon_state = "lavendergrass_[rand(1, 4)]"
-
-/obj/structure/flora/ausbushes/ywflowers
- icon_state = "ywflowers_1"
-
-/obj/structure/flora/ausbushes/ywflowers/New()
- ..()
- icon_state = "ywflowers_[rand(1, 3)]"
-
-/obj/structure/flora/ausbushes/brflowers
- icon_state = "brflowers_1"
-
-/obj/structure/flora/ausbushes/brflowers/New()
- ..()
- icon_state = "brflowers_[rand(1, 3)]"
-
-/obj/structure/flora/ausbushes/ppflowers
- icon_state = "ppflowers_1"
-
-/obj/structure/flora/ausbushes/ppflowers/New()
- ..()
- icon_state = "ppflowers_[rand(1, 3)]"
-
-/obj/structure/flora/ausbushes/sparsegrass
- icon_state = "sparsegrass_1"
-
-/obj/structure/flora/ausbushes/sparsegrass/New()
- ..()
- icon_state = "sparsegrass_[rand(1, 3)]"
-
-/obj/structure/flora/ausbushes/fullgrass
- icon_state = "fullgrass_1"
-
-/obj/structure/flora/ausbushes/fullgrass/New()
- ..()
- icon_state = "fullgrass_[rand(1, 3)]"
-
-/obj/structure/flora/skeleton
- name = "hanging skeleton model"
- icon = 'icons/obj/plants.dmi' //what an interesting plant
- icon_state = "hangskele"
- desc = "It's an anatomical model of a human skeletal system made of plaster."
-
- plane = OBJ_PLANE
-
-//potted plants credit: Flashkirby
-/obj/structure/flora/pottedplant
- name = "potted plant"
- desc = "Really brings the room together."
- icon = 'icons/obj/plants.dmi'
- icon_state = "plant-01"
-
- plane = OBJ_PLANE
- var/obj/item/stored_item
-
-/obj/structure/flora/pottedplant/examine(mob/user)
- . = ..()
- if(in_range(user, src) && stored_item)
- . += "You can see something in there..."
-
-/obj/structure/flora/pottedplant/attackby(obj/item/I, mob/user)
- if(stored_item)
- to_chat(user, "[I] won't fit in. There already appears to be something in here...")
- return
-
- if(I.w_class > ITEMSIZE_TINY)
- to_chat(user, "[I] is too big to fit inside [src].")
- return
-
- if(do_after(user, 10))
- user.drop_from_inventory(I, src)
- I.forceMove(src)
- stored_item = I
- src.visible_message("\icon[src] \icon[I] [user] places [I] into [src].")
- return
- else
- to_chat(user, "You refrain from putting things into the plant pot.")
- return
-
- ..()
-
-/obj/structure/flora/pottedplant/attack_hand(mob/user)
- if(!stored_item)
- to_chat(user, "You see nothing of interest in [src]...")
- else
- if(do_after(user, 10))
- to_chat(user, "You find \icon[stored_item] [stored_item] in [src]!")
- stored_item.forceMove(get_turf(src))
- stored_item = null
- ..()
-
-
-/obj/structure/flora/pottedplant/large
- name = "large potted plant"
- desc = "This is a large plant. Three branches support pairs of waxy leaves."
- icon_state = "plant-26"
-
-/obj/structure/flora/pottedplant/fern
- name = "potted fern"
- desc = "This is an ordinary looking fern. It looks like it could do with some water."
- icon_state = "plant-02"
-
-/obj/structure/flora/pottedplant/overgrown
- name = "overgrown potted plants"
- desc = "This is an assortment of colourful plants. Some parts are overgrown."
- icon_state = "plant-03"
-
-/obj/structure/flora/pottedplant/bamboo
- name = "potted bamboo"
- desc = "These are bamboo shoots. The tops looks like they've been cut short."
- icon_state = "plant-04"
-
-/obj/structure/flora/pottedplant/largebush
- name = "large potted bush"
- desc = "This is a large bush. The leaves stick upwards in an odd fashion."
- icon_state = "plant-05"
-
-/obj/structure/flora/pottedplant/thinbush
- name = "thin potted bush"
- desc = "This is a thin bush. It appears to be flowering."
- icon_state = "plant-06"
-
-/obj/structure/flora/pottedplant/mysterious
- name = "mysterious potted bulbs"
- desc = "This is a mysterious looking plant. Touching the bulbs cause them to shrink."
- icon_state = "plant-07"
- catalogue_data = list(/datum/category_item/catalogue/flora/eyebulbs)
-
-/obj/structure/flora/pottedplant/smalltree
- name = "small potted tree"
- desc = "This is a small tree. It is rather pleasant."
- icon_state = "plant-08"
-
-/obj/structure/flora/pottedplant/unusual
- name = "unusual potted plant"
- desc = "This is an unusual plant. It's bulbous ends emit a soft blue light."
- icon_state = "plant-09"
- light_range = 2
- light_power = 0.6
- light_color = "#33CCFF"
- catalogue_data = list(/datum/category_item/catalogue/flora/sif_tree)
-
-/obj/structure/flora/pottedplant/orientaltree
- name = "potted oriental tree"
- desc = "This is a rather oriental style tree. Its flowers are bright pink."
- icon_state = "plant-10"
-
-/obj/structure/flora/pottedplant/smallcactus
- name = "small potted cactus"
- desc = "This is a small cactus. Its needles are sharp."
- icon_state = "plant-11"
-
-/obj/structure/flora/pottedplant/tall
- name = "tall potted plant"
- desc = "This is a tall plant. Tiny pores line its surface."
- icon_state = "plant-12"
-
-/obj/structure/flora/pottedplant/sticky
- name = "sticky potted plant"
- desc = "This is an odd plant. Its sticky leaves trap insects."
- icon_state = "plant-13"
-
-/obj/structure/flora/pottedplant/smelly
- name = "smelly potted plant"
- desc = "This is some kind of tropical plant. It reeks of rotten eggs."
- icon_state = "plant-14"
-
-/obj/structure/flora/pottedplant/small
- name = "small potted plant"
- desc = "This is a pot of assorted small flora. Some look familiar."
- icon_state = "plant-15"
-
-/obj/structure/flora/pottedplant/aquatic
- name = "aquatic potted plant"
- desc = "This is apparently an aquatic plant. It's probably fake."
- icon_state = "plant-16"
-
-/obj/structure/flora/pottedplant/shoot
- name = "small potted shoot"
- desc = "This is a small shoot. It still needs time to grow."
- icon_state = "plant-17"
-
-/obj/structure/flora/pottedplant/flower
- name = "potted flower"
- desc = "This is a slim plant. Sweet smelling flowers are supported by spindly stems."
- icon_state = "plant-18"
-
-/obj/structure/flora/pottedplant/crystal
- name = "crystalline potted plant"
- desc = "These are rather cubic plants. Odd crystal formations grow on the end."
- icon_state = "plant-19"
-
-/obj/structure/flora/pottedplant/subterranean
- name = "subterranean potted plant"
- desc = "This is a subterranean plant. It's bulbous ends glow faintly."
- icon_state = "plant-20"
- light_range = 2
- light_power = 0.6
- light_color = "#FF6633"
-
-/obj/structure/flora/pottedplant/minitree
- name = "potted tree"
- desc = "This is a miniature tree. Apparently it was grown to 1/5 scale."
- icon_state = "plant-21"
-
-/obj/structure/flora/pottedplant/stoutbush
- name = "stout potted bush"
- desc = "This is a stout bush. Its leaves point up and outwards."
- icon_state = "plant-22"
-
-/obj/structure/flora/pottedplant/drooping
- name = "drooping potted plant"
- desc = "This is a small plant. The drooping leaves make it look like its wilted."
- icon_state = "plant-23"
-
-/obj/structure/flora/pottedplant/tropical
- name = "tropical potted plant"
- desc = "This is some kind of tropical plant. It hasn't begun to flower yet."
- icon_state = "plant-24"
-
-/obj/structure/flora/pottedplant/dead
- name = "dead potted plant"
- desc = "This is the dried up remains of a dead plant. Someone should replace it."
- icon_state = "plant-25"
-
-/obj/structure/flora/pottedplant/decorative
- name = "decorative potted plant"
- desc = "This is a decorative shrub. It's been trimmed into the shape of an apple."
- icon_state = "applebush"
-
-/obj/structure/flora/pottedplant/xmas
- name = "small christmas tree"
- desc = "This is a tiny well lit decorative christmas tree."
- icon_state = "plant-xmas"
-
-/obj/structure/flora/sif
- icon = 'icons/obj/flora/sifflora.dmi'
-
-/obj/structure/flora/sif/attack_hand(mob/user)
- if (user.a_intent == I_HURT)
- if(do_after(user, 5 SECONDS))
- user.visible_message("\The [user] digs up \the [src.name].", "You dig up \the [src.name].")
- qdel(src)
- else
- user.visible_message("\The [user] pokes \the [src.name].", "You poke \the [src.name].")
-
-/datum/category_item/catalogue/flora/subterranean_bulbs
- name = "Sivian Flora - Subterranean Bulbs"
- desc = "A plant which is native to Sif, it continues the trend of being a bioluminescent specimen. These plants \
- are generally suited for conditions experienced in caverns, which are generally dark and cold. It is not \
- known why this plant evolved to be bioluminescent, however this property has, unintentionally, allowed for \
- it to spread much farther than before, with the assistance of humans.\
-
\
- In Sif's early history, Sivian settlers found this plant while they were establishing mines. Their ability \
- to emit low, but consistant amounts of light made them desirable to the settlers. They would often cultivate \
- this plant inside man-made tunnels and mines to act as a backup source of light that would not need \
- electricity. This technique has saved many lost miners, and this practice continues to this day."
- value = CATALOGUER_REWARD_EASY
-
-/obj/structure/flora/sif/subterranean
- name = "subterranean plant"
- desc = "This is a subterranean plant. It's bulbous ends glow faintly."
- icon_state = "glowplant"
- light_range = 2
- light_power = 0.6
- light_color = "#FF6633"
- catalogue_data = list(/datum/category_item/catalogue/flora/subterranean_bulbs)
-
-/obj/structure/flora/sif/subterranean/Initialize()
- icon_state = "[initial(icon_state)][rand(1,2)]"
- . = ..()
-
-
-/datum/category_item/catalogue/flora/eyebulbs
- name = "Sivian Flora - Eyebulbs"
- desc = "A plant native to Sif. On the end of its stems are bulbs which visually resemble \
- eyes, which shrink when touched. One theory is that the bulbs are a result of mimicry, appearing as eyeballs to protect from predators.
\
- These plants have no known use."
- value = CATALOGUER_REWARD_EASY
-
-/obj/structure/flora/sif/eyes
- name = "mysterious bulbs"
- desc = "This is a mysterious looking plant. They kind of look like eyeballs. Creepy."
- icon_state = "eyeplant"
- catalogue_data = list(/datum/category_item/catalogue/flora/eyebulbs)
-
-/obj/structure/flora/sif/eyes/Initialize()
- icon_state = "[initial(icon_state)][rand(1,3)]"
- . = ..()
-
-/datum/category_item/catalogue/flora/mosstendrils
- name = "Sivian Flora - Moss Stalks"
- desc = "A plant native to Sif. The plant is most closely related to the common, dense moss found covering Sif's terrain. \
- It has evolved a method of camouflage utilizing white hairs on its dorsal sides to make it appear as a small mound of snow from \
- above. It has no known use, though it is a common furnishing in contemporary homes."
- value = CATALOGUER_REWARD_TRIVIAL
-
-/obj/structure/flora/sif/tendrils
- name = "stocky tendrils"
- desc = "A 'plant' made up of hardened moss. It has tiny hairs that bunch together to look like snow."
- icon_state = "grass"
- randomize_size = TRUE
- catalogue_data = list(/datum/category_item/catalogue/flora/mosstendrils)
-
-/obj/structure/flora/sif/tendrils/Initialize()
- icon_state = "[initial(icon_state)][rand(1,3)]"
- . = ..()
+
+/obj/structure/flora
+ name = "flora"
+ desc = "A perfectly generic plant."
+
+ anchored = TRUE // Usually, plants don't move. Usually.
+ plane = DECAL_PLANE
+ layer = BELOW_MOB_LAYER
+
+ var/randomize_size = FALSE
+ var/max_x_scale = 1.25
+ var/max_y_scale = 1.25
+ var/min_x_scale = 0.9
+ var/min_y_scale = 0.9
+
+ var/harvest_tool = null // The type of item used to harvest the plant.
+ var/harvest_count = 0
+
+ var/randomize_harvest_count = TRUE
+ var/max_harvests = 0
+ var/min_harvests = -1
+ var/list/harvest_loot = null // Should be an associative list for things to spawn, and their weights. An example would be a branch from a tree.
+
+/obj/structure/flora/Initialize()
+ ..()
+
+ if(randomize_size)
+ icon_scale_x = rand(min_x_scale * 100, max_x_scale * 100) / 100
+ icon_scale_y = rand(min_y_scale * 100, max_y_scale * 100) / 100
+
+ if(prob(50))
+ icon_scale_x *= -1
+ update_transform()
+
+ if(randomize_harvest_count)
+ max_harvests = max(0, rand(min_harvests, max_harvests)) // Incase you want to weight it more toward 'not harvestable', set min_harvests to a negative value.
+
+/obj/structure/flora/examine(mob/user)
+ . = ..()
+ if(harvest_count < max_harvests)
+ . += get_harvestable_desc()
+
+/obj/structure/flora/proc/get_harvestable_desc()
+ return "\The [src] seems to have something hanging from it."
+
+/obj/structure/flora/attackby(var/obj/item/weapon/W, var/mob/living/user)
+ if(can_harvest(W))
+ var/harvest_spawn = pickweight(harvest_loot)
+ var/atom/movable/AM = spawn_harvest(harvest_spawn, user)
+
+ if(!AM)
+ to_chat(user, "You fail to harvest anything from \the [src].")
+
+ else
+ to_chat(user, "You harvest \the [AM] from \the [src].")
+ return
+
+ ..(W, user)
+
+/obj/structure/flora/proc/can_harvest(var/obj/item/I)
+ . = FALSE
+ if(harvest_tool && istype(I, harvest_tool) && harvest_loot && harvest_loot.len && harvest_count < max_harvests)
+ . = TRUE
+ return .
+
+/obj/structure/flora/proc/spawn_harvest(var/path = null, var/mob/user = null)
+ if(!ispath(path))
+ return 0
+ var/turf/Target = get_turf(src)
+ if(user)
+ Target = get_turf(user)
+
+ var/atom/movable/AM = new path(Target)
+
+ harvest_count++
+ return AM
+
+//bushes
+/obj/structure/flora/bush
+ name = "bush"
+ icon = 'icons/obj/flora/snowflora.dmi'
+ icon_state = "snowbush1"
+
+/obj/structure/flora/bush/New()
+ ..()
+ icon_state = "snowbush[rand(1, 6)]"
+
+/obj/structure/flora/pottedplant
+ name = "potted plant"
+ desc = "Really ties the room together."
+ icon = 'icons/obj/plants.dmi'
+ icon_state = "plant-26"
+
+ anchored = FALSE
+
+//newbushes
+
+/obj/structure/flora/ausbushes
+ name = "bush"
+ icon = 'icons/obj/flora/ausflora.dmi'
+ icon_state = "firstbush_1"
+
+/obj/structure/flora/ausbushes/New()
+ ..()
+ icon_state = "firstbush_[rand(1, 4)]"
+
+/obj/structure/flora/ausbushes/reedbush
+ icon_state = "reedbush_1"
+
+/obj/structure/flora/ausbushes/reedbush/New()
+ ..()
+ icon_state = "reedbush_[rand(1, 4)]"
+
+/obj/structure/flora/ausbushes/leafybush
+ icon_state = "leafybush_1"
+
+/obj/structure/flora/ausbushes/leafybush/New()
+ ..()
+ icon_state = "leafybush_[rand(1, 3)]"
+
+/obj/structure/flora/ausbushes/palebush
+ icon_state = "palebush_1"
+
+/obj/structure/flora/ausbushes/palebush/New()
+ ..()
+ icon_state = "palebush_[rand(1, 4)]"
+
+/obj/structure/flora/ausbushes/stalkybush
+ icon_state = "stalkybush_1"
+
+/obj/structure/flora/ausbushes/stalkybush/New()
+ ..()
+ icon_state = "stalkybush_[rand(1, 3)]"
+
+/obj/structure/flora/ausbushes/grassybush
+ icon_state = "grassybush_1"
+
+/obj/structure/flora/ausbushes/grassybush/New()
+ ..()
+ icon_state = "grassybush_[rand(1, 4)]"
+
+/obj/structure/flora/ausbushes/fernybush
+ icon_state = "fernybush_1"
+
+/obj/structure/flora/ausbushes/fernybush/New()
+ ..()
+ icon_state = "fernybush_[rand(1, 3)]"
+
+/obj/structure/flora/ausbushes/sunnybush
+ icon_state = "sunnybush_1"
+
+/obj/structure/flora/ausbushes/sunnybush/New()
+ ..()
+ icon_state = "sunnybush_[rand(1, 3)]"
+
+/obj/structure/flora/ausbushes/genericbush
+ icon_state = "genericbush_1"
+
+/obj/structure/flora/ausbushes/genericbush/New()
+ ..()
+ icon_state = "genericbush_[rand(1, 4)]"
+
+/obj/structure/flora/ausbushes/pointybush
+ icon_state = "pointybush_1"
+
+/obj/structure/flora/ausbushes/pointybush/New()
+ ..()
+ icon_state = "pointybush_[rand(1, 4)]"
+
+/obj/structure/flora/ausbushes/lavendergrass
+ icon_state = "lavendergrass_1"
+
+/obj/structure/flora/ausbushes/lavendergrass/New()
+ ..()
+ icon_state = "lavendergrass_[rand(1, 4)]"
+
+/obj/structure/flora/ausbushes/ywflowers
+ icon_state = "ywflowers_1"
+
+/obj/structure/flora/ausbushes/ywflowers/New()
+ ..()
+ icon_state = "ywflowers_[rand(1, 3)]"
+
+/obj/structure/flora/ausbushes/brflowers
+ icon_state = "brflowers_1"
+
+/obj/structure/flora/ausbushes/brflowers/New()
+ ..()
+ icon_state = "brflowers_[rand(1, 3)]"
+
+/obj/structure/flora/ausbushes/ppflowers
+ icon_state = "ppflowers_1"
+
+/obj/structure/flora/ausbushes/ppflowers/New()
+ ..()
+ icon_state = "ppflowers_[rand(1, 3)]"
+
+/obj/structure/flora/ausbushes/sparsegrass
+ icon_state = "sparsegrass_1"
+
+/obj/structure/flora/ausbushes/sparsegrass/New()
+ ..()
+ icon_state = "sparsegrass_[rand(1, 3)]"
+
+/obj/structure/flora/ausbushes/fullgrass
+ icon_state = "fullgrass_1"
+
+/obj/structure/flora/ausbushes/fullgrass/New()
+ ..()
+ icon_state = "fullgrass_[rand(1, 3)]"
+
+/obj/structure/flora/skeleton
+ name = "hanging skeleton model"
+ icon = 'icons/obj/plants.dmi' //what an interesting plant
+ icon_state = "hangskele"
+ desc = "It's an anatomical model of a human skeletal system made of plaster."
+
+ plane = OBJ_PLANE
+
+//potted plants credit: Flashkirby
+/obj/structure/flora/pottedplant
+ name = "potted plant"
+ desc = "Really brings the room together."
+ icon = 'icons/obj/plants.dmi'
+ icon_state = "plant-01"
+
+ plane = OBJ_PLANE
+ var/obj/item/stored_item
+
+/obj/structure/flora/pottedplant/examine(mob/user)
+ . = ..()
+ if(in_range(user, src) && stored_item)
+ . += "You can see something in there..."
+
+/obj/structure/flora/pottedplant/attackby(obj/item/I, mob/user)
+ if(stored_item)
+ to_chat(user, "[I] won't fit in. There already appears to be something in here...")
+ return
+
+ if(I.w_class > ITEMSIZE_TINY)
+ to_chat(user, "[I] is too big to fit inside [src].")
+ return
+
+ if(do_after(user, 10))
+ user.drop_from_inventory(I, src)
+ I.forceMove(src)
+ stored_item = I
+ src.visible_message("[bicon(src)] [bicon(I)] [user] places [I] into [src].")
+ return
+ else
+ to_chat(user, "You refrain from putting things into the plant pot.")
+ return
+
+ ..()
+
+/obj/structure/flora/pottedplant/attack_hand(mob/user)
+ if(!stored_item)
+ to_chat(user, "You see nothing of interest in [src]...")
+ else
+ if(do_after(user, 10))
+ to_chat(user, "You find [bicon(stored_item)] [stored_item] in [src]!")
+ stored_item.forceMove(get_turf(src))
+ stored_item = null
+ ..()
+
+
+/obj/structure/flora/pottedplant/large
+ name = "large potted plant"
+ desc = "This is a large plant. Three branches support pairs of waxy leaves."
+ icon_state = "plant-26"
+
+/obj/structure/flora/pottedplant/fern
+ name = "potted fern"
+ desc = "This is an ordinary looking fern. It looks like it could do with some water."
+ icon_state = "plant-02"
+
+/obj/structure/flora/pottedplant/overgrown
+ name = "overgrown potted plants"
+ desc = "This is an assortment of colourful plants. Some parts are overgrown."
+ icon_state = "plant-03"
+
+/obj/structure/flora/pottedplant/bamboo
+ name = "potted bamboo"
+ desc = "These are bamboo shoots. The tops looks like they've been cut short."
+ icon_state = "plant-04"
+
+/obj/structure/flora/pottedplant/largebush
+ name = "large potted bush"
+ desc = "This is a large bush. The leaves stick upwards in an odd fashion."
+ icon_state = "plant-05"
+
+/obj/structure/flora/pottedplant/thinbush
+ name = "thin potted bush"
+ desc = "This is a thin bush. It appears to be flowering."
+ icon_state = "plant-06"
+
+/obj/structure/flora/pottedplant/mysterious
+ name = "mysterious potted bulbs"
+ desc = "This is a mysterious looking plant. Touching the bulbs cause them to shrink."
+ icon_state = "plant-07"
+ catalogue_data = list(/datum/category_item/catalogue/flora/eyebulbs)
+
+/obj/structure/flora/pottedplant/smalltree
+ name = "small potted tree"
+ desc = "This is a small tree. It is rather pleasant."
+ icon_state = "plant-08"
+
+/obj/structure/flora/pottedplant/unusual
+ name = "unusual potted plant"
+ desc = "This is an unusual plant. It's bulbous ends emit a soft blue light."
+ icon_state = "plant-09"
+ light_range = 2
+ light_power = 0.6
+ light_color = "#33CCFF"
+ catalogue_data = list(/datum/category_item/catalogue/flora/sif_tree)
+
+/obj/structure/flora/pottedplant/orientaltree
+ name = "potted oriental tree"
+ desc = "This is a rather oriental style tree. Its flowers are bright pink."
+ icon_state = "plant-10"
+
+/obj/structure/flora/pottedplant/smallcactus
+ name = "small potted cactus"
+ desc = "This is a small cactus. Its needles are sharp."
+ icon_state = "plant-11"
+
+/obj/structure/flora/pottedplant/tall
+ name = "tall potted plant"
+ desc = "This is a tall plant. Tiny pores line its surface."
+ icon_state = "plant-12"
+
+/obj/structure/flora/pottedplant/sticky
+ name = "sticky potted plant"
+ desc = "This is an odd plant. Its sticky leaves trap insects."
+ icon_state = "plant-13"
+
+/obj/structure/flora/pottedplant/smelly
+ name = "smelly potted plant"
+ desc = "This is some kind of tropical plant. It reeks of rotten eggs."
+ icon_state = "plant-14"
+
+/obj/structure/flora/pottedplant/small
+ name = "small potted plant"
+ desc = "This is a pot of assorted small flora. Some look familiar."
+ icon_state = "plant-15"
+
+/obj/structure/flora/pottedplant/aquatic
+ name = "aquatic potted plant"
+ desc = "This is apparently an aquatic plant. It's probably fake."
+ icon_state = "plant-16"
+
+/obj/structure/flora/pottedplant/shoot
+ name = "small potted shoot"
+ desc = "This is a small shoot. It still needs time to grow."
+ icon_state = "plant-17"
+
+/obj/structure/flora/pottedplant/flower
+ name = "potted flower"
+ desc = "This is a slim plant. Sweet smelling flowers are supported by spindly stems."
+ icon_state = "plant-18"
+
+/obj/structure/flora/pottedplant/crystal
+ name = "crystalline potted plant"
+ desc = "These are rather cubic plants. Odd crystal formations grow on the end."
+ icon_state = "plant-19"
+
+/obj/structure/flora/pottedplant/subterranean
+ name = "subterranean potted plant"
+ desc = "This is a subterranean plant. It's bulbous ends glow faintly."
+ icon_state = "plant-20"
+ light_range = 2
+ light_power = 0.6
+ light_color = "#FF6633"
+
+/obj/structure/flora/pottedplant/minitree
+ name = "potted tree"
+ desc = "This is a miniature tree. Apparently it was grown to 1/5 scale."
+ icon_state = "plant-21"
+
+/obj/structure/flora/pottedplant/stoutbush
+ name = "stout potted bush"
+ desc = "This is a stout bush. Its leaves point up and outwards."
+ icon_state = "plant-22"
+
+/obj/structure/flora/pottedplant/drooping
+ name = "drooping potted plant"
+ desc = "This is a small plant. The drooping leaves make it look like its wilted."
+ icon_state = "plant-23"
+
+/obj/structure/flora/pottedplant/tropical
+ name = "tropical potted plant"
+ desc = "This is some kind of tropical plant. It hasn't begun to flower yet."
+ icon_state = "plant-24"
+
+/obj/structure/flora/pottedplant/dead
+ name = "dead potted plant"
+ desc = "This is the dried up remains of a dead plant. Someone should replace it."
+ icon_state = "plant-25"
+
+/obj/structure/flora/pottedplant/decorative
+ name = "decorative potted plant"
+ desc = "This is a decorative shrub. It's been trimmed into the shape of an apple."
+ icon_state = "applebush"
+
+/obj/structure/flora/pottedplant/xmas
+ name = "small christmas tree"
+ desc = "This is a tiny well lit decorative christmas tree."
+ icon_state = "plant-xmas"
+
+/obj/structure/flora/sif
+ icon = 'icons/obj/flora/sifflora.dmi'
+
+/obj/structure/flora/sif/attack_hand(mob/user)
+ if (user.a_intent == I_HURT)
+ if(do_after(user, 5 SECONDS))
+ user.visible_message("\The [user] digs up \the [src.name].", "You dig up \the [src.name].")
+ qdel(src)
+ else
+ user.visible_message("\The [user] pokes \the [src.name].", "You poke \the [src.name].")
+
+/datum/category_item/catalogue/flora/subterranean_bulbs
+ name = "Sivian Flora - Subterranean Bulbs"
+ desc = "A plant which is native to Sif, it continues the trend of being a bioluminescent specimen. These plants \
+ are generally suited for conditions experienced in caverns, which are generally dark and cold. It is not \
+ known why this plant evolved to be bioluminescent, however this property has, unintentionally, allowed for \
+ it to spread much farther than before, with the assistance of humans.\
+
\
+ In Sif's early history, Sivian settlers found this plant while they were establishing mines. Their ability \
+ to emit low, but consistant amounts of light made them desirable to the settlers. They would often cultivate \
+ this plant inside man-made tunnels and mines to act as a backup source of light that would not need \
+ electricity. This technique has saved many lost miners, and this practice continues to this day."
+ value = CATALOGUER_REWARD_EASY
+
+/obj/structure/flora/sif/subterranean
+ name = "subterranean plant"
+ desc = "This is a subterranean plant. It's bulbous ends glow faintly."
+ icon_state = "glowplant"
+ light_range = 2
+ light_power = 0.6
+ light_color = "#FF6633"
+ catalogue_data = list(/datum/category_item/catalogue/flora/subterranean_bulbs)
+
+/obj/structure/flora/sif/subterranean/Initialize()
+ icon_state = "[initial(icon_state)][rand(1,2)]"
+ . = ..()
+
+
+/datum/category_item/catalogue/flora/eyebulbs
+ name = "Sivian Flora - Eyebulbs"
+ desc = "A plant native to Sif. On the end of its stems are bulbs which visually resemble \
+ eyes, which shrink when touched. One theory is that the bulbs are a result of mimicry, appearing as eyeballs to protect from predators.
\
+ These plants have no known use."
+ value = CATALOGUER_REWARD_EASY
+
+/obj/structure/flora/sif/eyes
+ name = "mysterious bulbs"
+ desc = "This is a mysterious looking plant. They kind of look like eyeballs. Creepy."
+ icon_state = "eyeplant"
+ catalogue_data = list(/datum/category_item/catalogue/flora/eyebulbs)
+
+/obj/structure/flora/sif/eyes/Initialize()
+ icon_state = "[initial(icon_state)][rand(1,3)]"
+ . = ..()
+
+/datum/category_item/catalogue/flora/mosstendrils
+ name = "Sivian Flora - Moss Stalks"
+ desc = "A plant native to Sif. The plant is most closely related to the common, dense moss found covering Sif's terrain. \
+ It has evolved a method of camouflage utilizing white hairs on its dorsal sides to make it appear as a small mound of snow from \
+ above. It has no known use, though it is a common furnishing in contemporary homes."
+ value = CATALOGUER_REWARD_TRIVIAL
+
+/obj/structure/flora/sif/tendrils
+ name = "stocky tendrils"
+ desc = "A 'plant' made up of hardened moss. It has tiny hairs that bunch together to look like snow."
+ icon_state = "grass"
+ randomize_size = TRUE
+ catalogue_data = list(/datum/category_item/catalogue/flora/mosstendrils)
+
+ harvest_tool = /obj/item/weapon/material/knife
+ max_harvests = 1
+ min_harvests = -4
+ harvest_loot = list(
+ /obj/item/seeds/wabback = 15,
+ /obj/item/seeds/blackwabback = 1,
+ /obj/item/seeds/wildwabback = 30
+ )
+
+/obj/structure/flora/sif/tendrils/Initialize()
+ icon_state = "[initial(icon_state)][rand(1,3)]"
+ . = ..()
+
+/obj/structure/flora/sif/tendrils/get_harvestable_desc()
+ return "\The [src] seems to be growing over something."
diff --git a/code/game/objects/structures/flora/grass.dm b/code/game/objects/structures/flora/grass.dm
index d5e7e965a8..92717f4beb 100644
--- a/code/game/objects/structures/flora/grass.dm
+++ b/code/game/objects/structures/flora/grass.dm
@@ -11,7 +11,6 @@
..()
icon_state = "snowgrass[rand(1, 3)]bb"
-
/obj/structure/flora/grass/green
icon_state = "snowgrass1gb"
diff --git a/code/game/objects/structures/flora/trees.dm b/code/game/objects/structures/flora/trees.dm
index c67348a94a..c4d8f58ebd 100644
--- a/code/game/objects/structures/flora/trees.dm
+++ b/code/game/objects/structures/flora/trees.dm
@@ -273,7 +273,9 @@
max_harvests = 2
min_harvests = -4
harvest_loot = list(
- /obj/item/weapon/reagent_containers/food/snacks/siffruit = 5
+ /obj/item/weapon/reagent_containers/food/snacks/siffruit = 20,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/sifpod = 5,
+ /obj/item/seeds/sifbulb = 1
)
var/light_shift = 0
diff --git a/code/game/turfs/simulated/outdoors/grass.dm b/code/game/turfs/simulated/outdoors/grass.dm
index e557fb16da..ad30c8bb88 100644
--- a/code/game/turfs/simulated/outdoors/grass.dm
+++ b/code/game/turfs/simulated/outdoors/grass.dm
@@ -12,6 +12,13 @@ var/list/grass_types = list(
)
var/grass_chance = 20
+ var/animal_chance = 1
+
+ // Weighted spawn list.
+ var/list/animal_types = list(
+ /mob/living/simple_mob/animal/passive/tindalos = 1
+ )
+
var/list/grass_types = list(
/obj/structure/flora/ausbushes/sparsegrass,
/obj/structure/flora/ausbushes/fullgrass
@@ -32,6 +39,12 @@ var/list/grass_types = list(
grass_chance = 5
var/tree_chance = 2
+ animal_chance = 0.5
+
+ animal_types = list(
+ /obj/random/mob/multiple/sifmobs = 1
+ )
+
grass_types = list(
/obj/structure/flora/sif/eyes = 1,
/obj/structure/flora/sif/tendrils = 10
@@ -53,6 +66,11 @@ var/list/grass_types = list(
if(grass_chance && prob(grass_chance) && !check_density())
var/grass_type = pickweight(grass_types)
new grass_type(src)
+
+ if(animal_chance && prob(animal_chance) && !check_density())
+ var/animal_type = pickweight(animal_types)
+ new animal_type(src)
+
. = ..()
/turf/simulated/floor/outdoors/grass/forest
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 3e11646986..628547ab45 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -96,6 +96,42 @@
. = check
break
+// For now, these two temp procs only return TRUE or FALSE if they can provide resistance to a given temperature.
+/obj/item/clothing/proc/handle_low_temperature(var/tempcheck = T20C)
+ . = FALSE
+ if(LAZYLEN(accessories))
+ for(var/obj/item/clothing/C in accessories)
+ if(C.handle_low_temperature(tempcheck))
+ . = TRUE
+
+ if(min_cold_protection_temperature && min_cold_protection_temperature <= tempcheck)
+ . = TRUE
+
+/obj/item/clothing/proc/handle_high_temperature(var/tempcheck = T20C)
+ . = FALSE
+ if(LAZYLEN(accessories))
+ for(var/obj/item/clothing/C in accessories)
+ if(C.handle_low_temperature(tempcheck))
+ . = TRUE
+
+ if(max_heat_protection_temperature && max_heat_protection_temperature >= tempcheck)
+ . = TRUE
+
+// Returns the relative flag-vars for covered protection.
+/obj/item/clothing/proc/get_cold_protection_flags()
+ . = cold_protection
+
+ if(LAZYLEN(accessories))
+ for(var/obj/item/clothing/C in accessories)
+ . |= C.get_cold_protection_flags()
+
+/obj/item/clothing/proc/get_heat_protection_flags()
+ . = heat_protection
+
+ if(LAZYLEN(accessories))
+ for(var/obj/item/clothing/C in accessories)
+ . |= C.get_heat_protection_flags()
+
/obj/item/clothing/proc/refit_for_species(var/target_species)
if(!species_restricted)
return //this item doesn't use the species_restricted system
diff --git a/code/modules/clothing/under/accessories/armor.dm b/code/modules/clothing/under/accessories/armor.dm
index b440c0b834..9ef80846ee 100644
--- a/code/modules/clothing/under/accessories/armor.dm
+++ b/code/modules/clothing/under/accessories/armor.dm
@@ -96,9 +96,16 @@
name = "mesh armor plate"
desc = "A mesh armor plate made of steel-reinforced synthetic fibers, great for dealing with small blades. Attaches to a plate carrier."
icon_state = "armor_stab"
- armor = list(melee = 25, bullet = 5, laser = 20, energy = 10, bomb = 15, bio = 0, rad = 0)
+ armor = list(melee = 30, bullet = 5, laser = 20, energy = 10, bomb = 15, bio = 0, rad = 0)
armorsoak = list(melee = 7, bullet = 5, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
+/obj/item/clothing/accessory/armor/armorplate/blast
+ name = "gel armor plate"
+ desc = "A gel armor plate made of high-grade polymers, great for dealing with localized blasts. Attaches to a plate carrier."
+ icon_state = "armor_blast"
+ armor = list(melee = 25, bullet = 25, laser = 10, energy = 0, bomb = 30, bio = 0, rad = 0)
+ armorsoak = list(melee = 5, bullet = 7, laser = 0, energy = 0, bomb = 40, bio = 0, rad = 0)
+
/obj/item/clothing/accessory/armor/armorplate/medium
name = "medium armor plate"
desc = "A plasteel-reinforced synthetic armor plate, providing good protection. Attaches to a plate carrier."
diff --git a/code/modules/clothing/under/accessories/temperature/poncho.dm b/code/modules/clothing/under/accessories/temperature/poncho.dm
new file mode 100644
index 0000000000..f1815760b8
--- /dev/null
+++ b/code/modules/clothing/under/accessories/temperature/poncho.dm
@@ -0,0 +1,68 @@
+
+/obj/item/clothing/accessory/poncho/thermal
+ name = "thermal poncho"
+ desc = "A simple, comfortable poncho with a thermal foil layer."
+ slot_flags = SLOT_OCLOTHING | SLOT_TIE
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
+
+ cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS
+ heat_protection = UPPER_TORSO|LOWER_TORSO|ARMS
+
+ slowdown = 0.2
+
+ min_cold_protection_temperature = T0C - 40
+ max_heat_protection_temperature = ARMOR_MAX_HEAT_PROTECTION_TEMPERATURE
+
+/obj/item/clothing/accessory/poncho/thermal/green
+ name = "green thermal poncho"
+ desc = "A simple, comfortable poncho with a thermal foil layer. This one is green."
+ icon_state = "greenponcho"
+ item_state = "greenponcho"
+
+/obj/item/clothing/accessory/poncho/thermal/red
+ name = "red thermal poncho"
+ desc = "A simple, comfortable poncho with a thermal foil layer. This one is red."
+ icon_state = "redponcho"
+ item_state = "redponcho"
+
+/obj/item/clothing/accessory/poncho/thermal/purple
+ name = "purple thermal poncho"
+ desc = "A simple, comfortable poncho with a thermal foil layer. This one is purple."
+ icon_state = "purpleponcho"
+ item_state = "purpleponcho"
+
+/obj/item/clothing/accessory/poncho/thermal/blue
+ name = "blue thermal poncho"
+ desc = "A simple, comfortable poncho with a thermal foil layer. This one is blue."
+ icon_state = "blueponcho"
+ item_state = "blueponcho"
+
+/obj/item/clothing/accessory/poncho/thermal/security
+ name = "security thermal poncho"
+ desc = "A simple, comfortable poncho with a thermal foil layer. This one is black and red, standard NanoTrasen Security colors."
+ icon_state = "secponcho"
+ item_state = "secponcho"
+
+/obj/item/clothing/accessory/poncho/thermal/medical
+ name = "medical thermal poncho"
+ desc = "A simple, comfortable poncho with a thermal foil layer. This one is white with green and blue tint, standard Medical colors."
+ icon_state = "medponcho"
+ item_state = "medponcho"
+
+/obj/item/clothing/accessory/poncho/thermal/engineering
+ name = "engineering thermal poncho"
+ desc = "A simple, comfortable poncho with a thermal foil layer. This one is yellow and orange, standard Engineering colors."
+ icon_state = "engiponcho"
+ item_state = "engiponcho"
+
+/obj/item/clothing/accessory/poncho/thermal/science
+ name = "science thermal poncho"
+ desc = "A simple, comfortable poncho with a thermal foil layer. This one is white with purple trim, standard NanoTrasen Science colors."
+ icon_state = "sciponcho"
+ item_state = "sciponcho"
+
+/obj/item/clothing/accessory/poncho/thermal/cargo
+ name = "cargo thermal poncho"
+ desc = "A simple, comfortable poncho with a thermal foil layer. This one is tan and grey, the colors of Cargo."
+ icon_state = "cargoponcho"
+ item_state = "cargoponcho"
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index a0e794929f..800ba8e3ec 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -938,6 +938,11 @@ Uniforms and such
name = "explorer's jumpsuit"
icon_state = "explorer"
+/obj/item/clothing/under/explorer/armored
+ desc = "A green uniform for operating in hazardous environments. This one looks like it's been modified."
+ armor = list(melee = 10, bullet = 10, laser = 10,energy = 10, bomb = 10, bio = 10, rad = 30)
+ armorsoak = list(melee = 5, bullet = 5, laser = 5,energy = 5, bomb = 5, bio = 5, rad = 0)
+
/obj/item/clothing/under/cohesion
name = "black cohesion suit"
desc = "A plain black cohesion suit intended to assist Prometheans in maintaining their form and prevent direct skin exposure."
diff --git a/code/modules/hydroponics/grown_predefined.dm b/code/modules/hydroponics/grown_predefined.dm
index e44025de7b..d8187fb24e 100644
--- a/code/modules/hydroponics/grown_predefined.dm
+++ b/code/modules/hydroponics/grown_predefined.dm
@@ -2,4 +2,7 @@
plantname = "ambrosia"
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiadeus
- plantname = "ambrosiadeus"
\ No newline at end of file
+ plantname = "ambrosiadeus"
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/sifpod
+ plantname = "sifbulb"
diff --git a/code/modules/hydroponics/seed_datums.dm b/code/modules/hydroponics/seed_datums.dm
index 4c18c2aac3..cbdeaca55c 100644
--- a/code/modules/hydroponics/seed_datums.dm
+++ b/code/modules/hydroponics/seed_datums.dm
@@ -292,6 +292,26 @@
set_trait(TRAIT_PRODUCT_COLOUR,"#FFDD00")
set_trait(TRAIT_PLANT_COLOUR,"#D6B44D")
+/datum/seed/apple/sif
+ name = "sifbulb"
+ seed_name = "sivian tree"
+ display_name = "sivian tree"
+ kitchen_tag = "apple"
+ chems = list("nutriment" = list(1,5),"sifsap" = list(10,20))
+
+/datum/seed/apple/sif/New()
+ ..()
+ set_trait(TRAIT_HARVEST_REPEAT,1)
+ set_trait(TRAIT_MATURATION,3)
+ set_trait(TRAIT_PRODUCTION,10)
+ set_trait(TRAIT_YIELD,3)
+ set_trait(TRAIT_POTENCY,12)
+ set_trait(TRAIT_PRODUCT_ICON,"alien3")
+ set_trait(TRAIT_PRODUCT_COLOUR,"#0720c3")
+ set_trait(TRAIT_PLANT_ICON,"tree5")
+ set_trait(TRAIT_FLESH_COLOUR,"#05157d")
+ set_trait(TRAIT_IDEAL_LIGHT, 1)
+
//Ambrosia/varieties.
/datum/seed/ambrosia
name = "ambrosia"
diff --git a/code/modules/hydroponics/seed_packets.dm b/code/modules/hydroponics/seed_packets.dm
index 6ca62df220..848b5a10e7 100644
--- a/code/modules/hydroponics/seed_packets.dm
+++ b/code/modules/hydroponics/seed_packets.dm
@@ -334,3 +334,6 @@ GLOBAL_LIST_BOILERPLATE(all_seed_packs, /obj/item/seeds)
/obj/item/seeds/gnomes
seed_type = "gnomes"
+
+/obj/item/seeds/sifbulb
+ seed_type = "sifbulb"
diff --git a/code/modules/materials/material_sheets.dm b/code/modules/materials/material_sheets.dm
index 67fc816298..01cfd9bc62 100644
--- a/code/modules/materials/material_sheets.dm
+++ b/code/modules/materials/material_sheets.dm
@@ -386,6 +386,9 @@
strict_color_stacking = TRUE
drop_sound = 'sound/items/drop/clothing.ogg'
+/obj/item/stack/material/cloth/diyaab
+ color = "#c6ccf0"
+
/obj/item/stack/material/resin
name = "resin"
icon_state = "sheet-resin"
diff --git a/code/modules/mining/ore_redemption_machine/survey_vendor.dm b/code/modules/mining/ore_redemption_machine/survey_vendor.dm
index ef4af012d2..5e6009c4cf 100644
--- a/code/modules/mining/ore_redemption_machine/survey_vendor.dm
+++ b/code/modules/mining/ore_redemption_machine/survey_vendor.dm
@@ -18,27 +18,28 @@
new /datum/data/mining_equipment("Laser Pointer", /obj/item/device/laser_pointer, 90),
new /datum/data/mining_equipment("Geiger Counter", /obj/item/device/geiger, 75),
new /datum/data/mining_equipment("Plush Toy", /obj/random/plushie, 30),
- new /datum/data/mining_equipment("Umbrella", /obj/item/weapon/melee/umbrella/random, 20),
- new /datum/data/mining_equipment("Extraction Equipment - Fulton Beacon", /obj/item/fulton_core, 300),
- new /datum/data/mining_equipment("Extraction Equipment - Fulton Pack", /obj/item/extraction_pack, 125),
+ new /datum/data/mining_equipment("Umbrella", /obj/item/weapon/melee/umbrella/random, 10),
+ new /datum/data/mining_equipment("Extraction Equipment - Fulton Beacon", /obj/item/fulton_core, 100),
+ new /datum/data/mining_equipment("Extraction Equipment - Fulton Pack", /obj/item/extraction_pack, 50),
new /datum/data/mining_equipment("Point Transfer Card", /obj/item/weapon/card/mining_point_card/survey, 50),
new /datum/data/mining_equipment("Fishing Net", /obj/item/weapon/material/fishing_net, 50),
- new /datum/data/mining_equipment("Titanium Fishing Rod", /obj/item/weapon/material/fishing_rod/modern, 100),
+ new /datum/data/mining_equipment("Titanium Fishing Rod", /obj/item/weapon/material/fishing_rod/modern, 50),
new /datum/data/mining_equipment("Direct Payment - 1000", /obj/item/weapon/spacecash/c1000, 500),
new /datum/data/mining_equipment("Industrial Equipment - Phoron Bore", /obj/item/weapon/gun/magnetic/matfed, 500),
- new /datum/data/mining_equipment("Survey Tools - Shovel", /obj/item/weapon/shovel, 40),
- new /datum/data/mining_equipment("Survey Tools - Mechanical Trap", /obj/item/weapon/beartrap, 50),
+ new /datum/data/mining_equipment("Survey Tools - Shovel", /obj/item/weapon/shovel, 20),
+ new /datum/data/mining_equipment("Survey Tools - Mechanical Trap", /obj/item/weapon/beartrap, 30),
new /datum/data/mining_equipment("Digital Tablet - Standard", /obj/item/modular_computer/tablet/preset/custom_loadout/standard, 100),
new /datum/data/mining_equipment("Digital Tablet - Advanced", /obj/item/modular_computer/tablet/preset/custom_loadout/advanced, 300),
- new /datum/data/mining_equipment("Injector (L) - Glucose",/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/glucose, 50),
- new /datum/data/mining_equipment("Injector (L) - Panacea",/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/purity, 50),
- new /datum/data/mining_equipment("Injector (L) - Trauma",/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/brute, 250),
- new /datum/data/mining_equipment("Nanopaste Tube", /obj/item/stack/nanopaste, 100),
- new /datum/data/mining_equipment("Defense Equipment - Phase Pistol",/obj/item/weapon/gun/energy/phasegun/pistol, 30),
- new /datum/data/mining_equipment("Defense Equipment - Smoke Bomb",/obj/item/weapon/grenade/smokebomb, 100),
- new /datum/data/mining_equipment("Defense Equipment - Razor Drone Deployer",/obj/item/weapon/grenade/spawnergrenade/manhacks/station, 200),
- new /datum/data/mining_equipment("Defense Equipment - Sentry Drone Deployer",/obj/item/weapon/grenade/spawnergrenade/ward, 300),
- new /datum/data/mining_equipment("Defense Equipment - Steel Machete", /obj/item/weapon/material/knife/machete, 75)
+ new /datum/data/mining_equipment("Injector (L) - Glucose",/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/glucose, 30),
+ new /datum/data/mining_equipment("Injector (L) - Panacea",/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/purity, 30),
+ new /datum/data/mining_equipment("Injector (L) - Trauma",/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/brute, 50),
+ new /datum/data/mining_equipment("Nanopaste Tube", /obj/item/stack/nanopaste, 50),
+ new /datum/data/mining_equipment("Defense Equipment - Phase Pistol",/obj/item/weapon/gun/energy/phasegun/pistol, 15),
+ new /datum/data/mining_equipment("Defense Equipment - Smoke Bomb",/obj/item/weapon/grenade/smokebomb, 50),
+ new /datum/data/mining_equipment("Defense Equipment - Razor Drone Deployer",/obj/item/weapon/grenade/spawnergrenade/manhacks/station, 50),
+ new /datum/data/mining_equipment("Defense Equipment - Sentry Drone Deployer",/obj/item/weapon/grenade/spawnergrenade/ward, 100),
+ new /datum/data/mining_equipment("Defense Equipment - Steel Machete", /obj/item/weapon/material/knife/machete, 50),
+ new /datum/data/mining_equipment("Survival Equipment - Insulated Poncho", /obj/random/thermalponcho, 75)
)
/obj/machinery/mineral/equipment_vendor/survey/interact(mob/user)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index e072bdb720..db67313aa0 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -151,6 +151,11 @@
if (prob(50) && !shielded)
Paralyse(10)
+ var/blastsoak = getsoak(null, "bomb")
+
+ b_loss = max(1, b_loss - blastsoak)
+ f_loss = max(1, f_loss - blastsoak)
+
var/update = 0
// focus most of the blast on one organ
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index b206cca7e7..e90148577c 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -809,8 +809,8 @@
//Handle normal clothing
for(var/obj/item/clothing/C in list(head,wear_suit,w_uniform,shoes,gloves,wear_mask))
if(C)
- if(C.max_heat_protection_temperature && C.max_heat_protection_temperature >= temperature)
- . |= C.heat_protection
+ if(C.handle_low_temperature(temperature))
+ . |= C.get_heat_protection_flags()
//See proc/get_heat_protection_flags(temperature) for the description of this proc.
/mob/living/carbon/human/proc/get_cold_protection_flags(temperature)
@@ -818,8 +818,8 @@
//Handle normal clothing
for(var/obj/item/clothing/C in list(head,wear_suit,w_uniform,shoes,gloves,wear_mask))
if(C)
- if(C.min_cold_protection_temperature && C.min_cold_protection_temperature <= temperature)
- . |= C.cold_protection
+ if(C.handle_high_temperature(temperature))
+ . |= C.get_cold_protection_flags()
/mob/living/carbon/human/get_heat_protection(temperature) //Temperature is the temperature you're being exposed to.
var/thermal_protection_flags = get_heat_protection_flags(temperature)
diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm
index 543acb842f..f9c68c331f 100644
--- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm
+++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm
@@ -121,9 +121,7 @@
if(check_alien_ability(50,1,O_RESIN))
visible_message("[src] has planted some alien weeds!")
- var/obj/O = new /obj/effect/alien/weeds/node(loc)
- if(O)
- O.color = "#321D37"
+ new /obj/effect/alien/weeds/node(get_turf(src), "#321D37")
return
/mob/living/carbon/human/proc/Spit(var/atom/A)
diff --git a/code/modules/mob/living/simple_mob/defense.dm b/code/modules/mob/living/simple_mob/defense.dm
index c09bf272cc..a8234ac970 100644
--- a/code/modules/mob/living/simple_mob/defense.dm
+++ b/code/modules/mob/living/simple_mob/defense.dm
@@ -72,6 +72,23 @@
if(istype(O, /obj/item/weapon/material/knife))
harvest(user)
+ if(user.a_intent == I_HELP && harvest_tool && istype(O, harvest_tool) && stat != DEAD)
+ if(world.time > (harvest_recent + harvest_cooldown))
+ livestock_harvest(O, user)
+ return
+ else
+ to_chat(user, "\The [src] can't be [harvest_verb] so soon.")
+ return
+
+ if(can_tame(O, user))
+ to_chat(user, "You offer \the [src] \the [O].")
+ if(tame_prob(O, user))
+ to_chat(user, "\The [src] appears to accept \the [O], seemingly calmed.")
+ do_tame(O,user)
+ else
+ fail_tame(O, user)
+ return
+
return ..()
diff --git a/code/modules/mob/living/simple_mob/harvesting.dm b/code/modules/mob/living/simple_mob/harvesting.dm
new file mode 100644
index 0000000000..74991920a8
--- /dev/null
+++ b/code/modules/mob/living/simple_mob/harvesting.dm
@@ -0,0 +1,42 @@
+
+/mob/living/simple_mob
+ // What do you hit the mob with (on help) to get something from it?
+ var/obj/harvest_tool
+ // How long do we have to wait until it's harvestable again?
+ var/harvest_cooldown = 10 MINUTES
+ // How long does it take to harvest?
+ var/harvest_delay = 30 SECONDS
+ // What world.time was the last harvest?
+ var/harvest_recent = 0
+ // How many times can we roll at max on the chance table?
+ var/harvest_per_hit = 1
+ // Verb for harvesting. "sheared" "clipped" etc.
+ var/harvest_verb = "harvested"
+ // Associative list of paths and their chances. path = straws in the lot
+ var/list/harvest_results
+
+/mob/living/simple_mob/examine(mob/user)
+ ..(user)
+ if(user && harvest_tool && (get_dist(user, src) <= 3))
+ to_chat(user, "\The [src] can be [harvest_verb] with a [initial(harvest_tool.name)] every [round(harvest_cooldown, 0.1)] minutes.")
+ var/time_to_harvest = (harvest_recent + harvest_cooldown) - world.time
+ if(time_to_harvest > 0)
+ to_chat(user, "It can be [harvest_verb] in [time_to_harvest / (1 MINUTE)] second(s).")
+ else
+ to_chat(user, "It can be [harvest_verb] now.")
+
+/mob/living/simple_mob/proc/livestock_harvest(var/obj/item/tool, var/mob/living/user)
+ if(!LAZYLEN(harvest_results)) // Might be a unique interaction of an object using the proc to do something weird, or just someone's a donk.
+ harvest_recent = world.time
+ return
+
+ if(istype(tool, harvest_tool)) // Sanity incase something incorrect is passed in.
+ harvest_recent = world.time
+
+ var/max_harvests = rand(1,harvest_per_hit)
+
+ for(var/I = 1 to max_harvests)
+ var/new_path = pickweight(harvest_results)
+ new new_path(get_turf(user))
+
+ return
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/_giant_spider.dm b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/_giant_spider.dm
index 6cd5ea9c5b..3721168ff9 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/_giant_spider.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/_giant_spider.dm
@@ -100,6 +100,12 @@
say_list_type = /datum/say_list/spider
+ tame_items = list(
+ /obj/item/weapon/reagent_containers/food/snacks/xenomeat = 10,
+ /obj/item/weapon/reagent_containers/food/snacks/meat/crab = 40,
+ /obj/item/weapon/reagent_containers/food/snacks/meat = 20
+ )
+
var/poison_type = "spidertoxin" // The reagent that gets injected when it attacks.
var/poison_chance = 10 // Chance for injection to occur.
var/poison_per_bite = 5 // Amount added per injection.
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/phorogenic.dm b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/phorogenic.dm
index 39e2edcb7d..94bb77ee71 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/phorogenic.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/phorogenic.dm
@@ -45,6 +45,11 @@
poison_per_bite = 0.5
poison_type = "phoron"
+ tame_items = list(
+ /obj/item/weapon/tank/phoron = 20,
+ /obj/item/stack/material/phoron = 30
+ )
+
var/exploded = FALSE
var/explosion_dev_range = 1
var/explosion_heavy_range = 2
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/crab.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/crab.dm
index 06d4eb4caa..87c05b317d 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/crab.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/crab.dm
@@ -47,7 +47,7 @@
/mob/living/simple_mob/animal/passive/crab/sif/Initialize()
..()
- adjust_scale(rand(5,15) / 10)
+ adjust_scale(rand(5,12) / 10)
// Meat!
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm
index 790681a3fc..198f99a3f4 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm
@@ -166,11 +166,15 @@
/mob/living/simple_mob/animal/passive/fish/icebass/update_icon()
overlays.Cut()
..()
+
if(!dorsal_image)
dorsal_image = image(icon, "[icon_state]_mask-body")
if(!belly_image)
belly_image = image(icon, "[icon_state]_mask-belly")
+ dorsal_image.icon_state = "[icon_state]_mask-body"
+ belly_image.icon_state = "[icon_state]_mask-belly"
+
dorsal_image.color = dorsal_color
belly_image.color = belly_color
@@ -237,6 +241,8 @@
if(!head_image)
head_image = image(icon, "[icon_state]_mask")
+ head_image.icon_state = "[icon_state]_mask"
+
head_image.color = head_color
overlays += head_image
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/diyaab.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/diyaab.dm
index 0845eacc71..f934ab1ec8 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/diyaab.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/diyaab.dm
@@ -40,6 +40,23 @@
say_list_type = /datum/say_list/diyaab
ai_holder_type = /datum/ai_holder/simple_mob/retaliate/cooperative
+ // What do you hit the mob with (on help) to get something from it?
+ harvest_tool = /obj/item/weapon/tool/wirecutters
+ // How long do we have to wait until it's harvestable again?
+ harvest_cooldown = 10 MINUTES
+ // How long does it take to harvest?
+ harvest_delay = 30 SECONDS
+ // What world.time was the last harvest?
+ harvest_recent = 0
+ // How many times do we roll on the chance table?
+ harvest_per_hit = 1
+ // Verb for harvesting. "sheared" "clipped" etc.
+ harvest_verb = "sheared"
+ // Associative list of paths and their chances. path = straws in the lot
+ harvest_results = list(
+ /obj/item/stack/material/cloth/diyaab = 10
+ )
+
/datum/say_list/diyaab
speak = list("Awrr?", "Aowrl!", "Worrl.")
emote_see = list("sniffs the air cautiously","looks around")
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/duck.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/duck.dm
index 0aa74f9e6b..10f7ddc2cf 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/duck.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/duck.dm
@@ -10,7 +10,7 @@
Family units have been observed to form gangs and scavenge from Sivian domeciles and \
various food transports during stressful months. \
It is advised to seal and hide any form of food near even lone individuals, as they will become \
- increasingly aggressive."
+ increasingly aggressive in order to acquire it."
value = CATALOGUER_REWARD_EASY
/mob/living/simple_mob/animal/sif/duck
@@ -38,6 +38,11 @@
attack_edge = 1 // Razor-edged wings, and 'claws' made for digging through ice.
attacktext = list("nipped", "bit", "cut", "clawed")
+ tame_items = list(
+ /obj/item/weapon/reagent_containers/food/snacks/sliceable/bread = 90,
+ /obj/item/weapon/reagent_containers/food/snacks/slice/bread = 25
+ )
+
say_list_type = /datum/say_list/duck
ai_holder_type = /datum/ai_holder/simple_mob/retaliate/cooperative
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/glitterfly.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/glitterfly.dm
index ae1abb363f..3687a67c51 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/glitterfly.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/glitterfly.dm
@@ -52,6 +52,12 @@
attacktext = list("bit", "buffeted", "slashed")
+ tame_items = list(
+ /obj/item/weapon/reagent_containers/food/snacks/grown = 90,
+ /obj/item/weapon/reagent_containers/food/snacks/meat/crab = 10,
+ /obj/item/weapon/reagent_containers/food/snacks/meat = 5
+ )
+
say_list_type = /datum/say_list/glitterfly
ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive/glitterfly
@@ -81,6 +87,17 @@
/mob/living/simple_mob/animal/sif/glitterfly/rare/Initialize()
..()
+/mob/living/simple_mob/animal/sif/glitterfly/unique_tame_check(var/obj/O, var/mob/user)
+ . = ..()
+
+ if(.)
+ if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown))
+ var/obj/item/weapon/reagent_containers/food/snacks/grown/G = O
+
+ if(G.seed && G.seed.kitchen_tag == "berries")
+ return TRUE
+ return FALSE
+
/datum/say_list/glitterfly
speak = list("Pi..","Po...", "Pa...")
emote_see = list("vibrates","flutters", "twirls")
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/kururak.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/kururak.dm
index 22c2d02082..37ac83614e 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/kururak.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/kururak.dm
@@ -28,7 +28,7 @@
icon_state = "bigcat"
icon_living = "bigcat"
icon_dead = "bigcat_dead"
- icon_rest = "bigcat_rest"
+ icon_rest = "bigcat_sleep"
icon = 'icons/mob/64x64.dmi'
default_pixel_x = -16
@@ -122,7 +122,7 @@
/mob/living/simple_mob/animal/sif/kururak/apply_melee_effects(atom/A) // Only gains instinct.
instinct += rand(1, 2)
- return
+ return ..()
/mob/living/simple_mob/animal/sif/kururak/should_special_attack(atom/A)
return has_modifier_of_type(/datum/modifier/ace)
@@ -136,6 +136,8 @@
set_AI_busy(TRUE)
rending_strike(A)
set_AI_busy(FALSE)
+ a_intent = I_HURT
+ return ..()
/mob/living/simple_mob/animal/sif/kururak/verb/do_flash()
set category = "Abilities"
@@ -329,6 +331,15 @@
else
remove_modifiers_of_type(/datum/modifier/ace)
+/mob/living/simple_mob/animal/sif/kururak/hibernate/Initialize()
+ ..()
+ lay_down()
+ instinct = 0
+
+/*
+ * Kururak AI
+ */
+
/datum/ai_holder/simple_mob/intentional/kururak
hostile = FALSE
retaliate = TRUE
@@ -359,6 +370,8 @@
else
hostile = initial(hostile)
+ return ..()
+
/datum/ai_holder/simple_mob/intentional/kururak/pre_special_attack(atom/A)
holder.a_intent = I_HURT
if(isliving(A))
@@ -378,9 +391,12 @@
else if(istype(A, /obj/mecha))
holder.a_intent = I_GRAB
+ return ..()
+
/datum/ai_holder/simple_mob/intentional/kururak/post_melee_attack()
if(holder.has_modifier_of_type(/datum/modifier/ace))
request_help()
+ return ..()
// Kururak Ace modifier, given to the one with the highest Instinct.
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/racoon.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/racoon.dm
index b2e913bfb2..31a0437769 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/racoon.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/racoon.dm
@@ -187,6 +187,7 @@
desc = "What appears to be an oversized rodent with hands. This one has a curious look in its eyes."
ai_holder_type = /datum/ai_holder/simple_mob/intentional/sakimm
randomize_size = FALSE // Most likely to have a hat.
+ melee_attack_delay = 0 // For some reason, having a delay makes item pick-up not work.
/datum/ai_holder/simple_mob/intentional/sakimm
hostile = FALSE
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/savik.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/savik.dm
index 632aa9255e..e6b19727b3 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/savik.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/savik.dm
@@ -44,6 +44,12 @@
player_msg = "You have the ability to berserk at will, which will grant strong physical bonuses for \
a short period of time, however it will tire you and you will be much weaker for awhile after it expires."
+ tame_items = list(
+ /obj/item/organ = 70,
+ /obj/item/weapon/reagent_containers/food/snacks/meat/crab = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/meat = 20
+ )
+
say_list_type = /datum/say_list/savik
ai_holder_type = /datum/ai_holder/simple_mob/savik
@@ -57,6 +63,12 @@
if(health <= (maxHealth * 0.5)) // At half health, and fighting someone currently.
berserk()
+/mob/living/simple_mob/animal/sif/savik/fail_tame(var/obj/O, var/mob/user)
+ ..()
+
+ if(prob(30)) // They don't like people messing with them and their food.
+ berserk()
+
/datum/ai_holder/simple_mob/savik
mauling = TRUE
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/shantak.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/shantak.dm
index 5a9c24a873..60a035c432 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/shantak.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/shantak.dm
@@ -93,7 +93,9 @@
rally_pack()
return ..()
-
-// These ones only retaliate. Used for a PoI.
+// These ones only retaliate. Used for PoIs.
/mob/living/simple_mob/animal/sif/shantak/retaliate
- ai_holder_type = /datum/ai_holder/simple_mob/retaliate
\ No newline at end of file
+ ai_holder_type = /datum/ai_holder/simple_mob/retaliate
+
+/mob/living/simple_mob/animal/sif/shantak/leader/autofollow/retaliate
+ ai_holder_type = /datum/ai_holder/simple_mob/retaliate
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/sif.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/sif.dm
index 8d19324cf2..dab82b850b 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/sif.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/sif.dm
@@ -2,4 +2,9 @@
/mob/living/simple_mob/animal/sif
minbodytemp = 175
cold_resist = 0.75
- heat_resist = -0.5
\ No newline at end of file
+ heat_resist = -0.5
+
+ tame_items = list(
+ /obj/item/weapon/reagent_containers/food/snacks/meat/crab = 20,
+ /obj/item/weapon/reagent_containers/food/snacks/meat = 10
+ )
diff --git a/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm b/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm
index 3973a17add..5bdddb9542 100644
--- a/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm
@@ -89,6 +89,11 @@
firing_lanes = TRUE // But not your buddies!
conserve_ammo = TRUE // And don't go wasting bullets!
+/datum/ai_holder/simple_mob/merc/ranged/sniper
+ vision_range = 14 // We're a person with a long-ranged gun.
+
+/datum/ai_holder/simple_mob/merc/ranged/sniper/max_range(atom/movable/AM)
+ return holder.ICheckRangedAttack(AM) ? 14 : 1
////////////////////////////////
// Melee
@@ -174,6 +179,27 @@
base_attack_cooldown = 5 // Two attacks a second or so.
reload_max = 20
+// Rifles
+/mob/living/simple_mob/humanoid/merc/ranged/rifle
+ icon_state = "syndicateranged_rifle"
+ icon_living = "syndicateranged_rifle"
+
+ loot_list = list(/obj/item/weapon/gun/projectile/automatic/z8 = 100)
+
+ projectilesound = 'sound/weapons/Gunshot_heavy.ogg'
+ projectiletype = /obj/item/projectile/bullet/rifle/a762
+ projectile_dispersion = 8
+ projectile_accuracy = -15
+ base_attack_cooldown = 5
+ reload_max = 30
+
+/mob/living/simple_mob/humanoid/merc/ranged/rifle/mag
+ loot_list = list(/obj/item/weapon/gun/magnetic/railgun/flechette = 100)
+ projectiletype = /obj/item/projectile/bullet/magnetic/flechette
+
+ projectilesound = 'sound/weapons/rapidslice.ogg'
+ reload_max = 10
+
// Laser Rifle
/mob/living/simple_mob/humanoid/merc/ranged/laser
icon_state = "syndicateranged_laser"
@@ -214,6 +240,89 @@
projectile_accuracy = -40
special_attack_charges = 5
+// Technician, also kind of a miniboss. Carries a dartgun and manhack launcher.
+/mob/living/simple_mob/humanoid/merc/ranged/technician
+ icon_state = "syndicateranged_technician"
+ icon_living = "syndicateranged_technician"
+ projectiletype = /obj/item/projectile/fake_syringe/poison // Toxin dart.
+ projectilesound = 'sound/weapons/Gunshot_old.ogg'
+
+ loot_list = list(/obj/item/weapon/gun/projectile/dartgun = 100,
+ /obj/item/weapon/gun/launcher/grenade = 100,
+ /obj/item/weapon/grenade/spawnergrenade/manhacks/mercenary = 50,
+ /obj/item/weapon/grenade/spawnergrenade/manhacks/mercenary = 30
+ )
+
+ reload_max = 5
+ reload_time = 1 SECOND
+
+ // Manhacks.
+ grenade_type = /obj/item/weapon/grenade/spawnergrenade/manhacks/mercenary
+
+ projectile_dispersion = 8
+ projectile_accuracy = -40
+ special_attack_charges = 5
+
+// Sniper, definitely a miniboss, based on its massive range advantage, and method of battle.
+// Creates a beam for 2 seconds, fire after another .5, then a 5 second reload.
+/mob/living/simple_mob/humanoid/merc/ranged/sniper
+ icon_state = "syndicateranged_sniper"
+ icon_living = "syndicateranged_sniper"
+ projectiletype = /obj/item/projectile/bullet/rifle/a145/highvel // Really scary bullet.
+ projectilesound = 'sound/weapons/Gunshot_cannon.ogg'
+
+ projectile_accuracy = 75
+
+ reload_max = 1
+ reload_time = 5 SECONDS
+
+ ai_holder_type = /datum/ai_holder/simple_mob/merc/ranged/sniper
+
+ ranged_attack_delay = 2.5 SECONDS
+
+ loot_list = list(/obj/item/sniper_rifle_part/barrel = 50,
+ /obj/item/sniper_rifle_part/stock = 50,
+ /obj/item/sniper_rifle_part/trigger_group = 50,
+ /obj/item/weapon/grenade/spawnergrenade/manhacks/mercenary = 90
+ )
+
+ // Babyfrags.
+ grenade_type = /obj/item/weapon/grenade/explosive/mini
+ // Babyfrags go a long way.
+ special_attack_min_range = 6
+ special_attack_max_range = 10
+
+/mob/living/simple_mob/humanoid/merc/ranged/sniper/ranged_pre_animation(atom/A)
+ Beam(get_turf(A), icon_state = "sniper_beam", time = 2 SECONDS, maxdistance = 15)
+ . = ..()
+
+/mob/living/simple_mob/humanoid/merc/ranged/sniper/shoot_target(atom/A)
+ set waitfor = FALSE
+ setClickCooldown(get_attack_speed())
+
+ face_atom(A)
+
+ var/atom/orig_targ = A
+
+ if(ranged_attack_delay)
+ A = get_turf(orig_targ)
+ ranged_pre_animation(A)
+ handle_attack_delay(A, ranged_attack_delay) // This will sleep this proc for a bit, which is why waitfor is false.
+
+ if(needs_reload)
+ if(reload_count >= reload_max)
+ try_reload()
+ return FALSE
+
+ visible_message("\The [src] fires at \the [orig_targ]!")
+ shoot(A)
+ if(casingtype)
+ new casingtype(loc)
+
+ if(ranged_attack_delay)
+ ranged_post_animation(A)
+
+ return TRUE
////////////////////////////////
// Space Mercs
@@ -274,24 +383,39 @@
// PoI Mercs
////////////////////////////////
-// None of these drop weapons, until we have a better way to balance them
+// Most likely to drop a broken weapon matching them, if it's a gun.
/mob/living/simple_mob/humanoid/merc/melee/poi
- loot_list = list()
+ loot_list = list(/obj/item/weapon/material/knife/tacknife/combatknife = 100)
/mob/living/simple_mob/humanoid/merc/melee/sword/poi
- loot_list = list()
+ loot_list = list(/obj/item/weapon/melee/energy/sword/color = 20,
+ /obj/item/weapon/shield/energy = 40
+ )
/mob/living/simple_mob/humanoid/merc/ranged/poi
- loot_list = list()
+ loot_list = list(/obj/random/projectile/scrapped_pistol = 100)
/mob/living/simple_mob/humanoid/merc/ranged/smg/poi
- loot_list = list()
+ loot_list = list(/obj/random/projectile/scrapped_smg = 100)
/mob/living/simple_mob/humanoid/merc/ranged/laser/poi
- loot_list = list()
+ loot_list = list(/obj/random/projectile/scrapped_laser = 100)
-/mob/living/simple_mob/humanoid/merc/ranged/ionrifle
- loot_list = list()
+/mob/living/simple_mob/humanoid/merc/ranged/ionrifle/poi
+ loot_list = list(/obj/random/projectile/scrapped_ionrifle = 100)
/mob/living/simple_mob/humanoid/merc/ranged/grenadier/poi
- loot_list = list()
\ No newline at end of file
+ loot_list = list(/obj/random/projectile/scrapped_shotgun = 100)
+
+/mob/living/simple_mob/humanoid/merc/ranged/rifle/poi
+ loot_list = list(/obj/random/projectile/scrapped_bulldog = 100)
+
+/mob/living/simple_mob/humanoid/merc/ranged/rifle/mag/poi
+ loot_list = list(/obj/random/projectile/scrapped_flechette = 100)
+
+/mob/living/simple_mob/humanoid/merc/ranged/technician/poi
+ loot_list = list(/obj/random/projectile/scrapped_dartgun = 100,
+ /obj/random/projectile/scrapped_grenadelauncher = 100,
+ /obj/item/weapon/grenade/spawnergrenade/manhacks/mercenary = 50,
+ /obj/item/weapon/grenade/spawnergrenade/manhacks/mercenary = 30
+ )
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/combat_drone.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/drones/combat_drone.dm
similarity index 100%
rename from code/modules/mob/living/simple_mob/subtypes/mechanical/combat_drone.dm
rename to code/modules/mob/living/simple_mob/subtypes/mechanical/drones/combat_drone.dm
diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/drones/mining_drone.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/drones/mining_drone.dm
new file mode 100644
index 0000000000..5c6660e67c
--- /dev/null
+++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/drones/mining_drone.dm
@@ -0,0 +1,126 @@
+/*
+ Mining drones have a slow-firing, armor-piercing beam that can destroy rocks.
+ They will, if "tamed", collect ore and deposit it into nearby oreboxes when adjacent.
+*/
+
+/datum/category_item/catalogue/technology/drone/mining_drone
+ name = "Drone - Mining Drone"
+ desc = "A crude modification of the commonly seen combat drone model, usually created\
+ from the salvaged husks that litter debris fields. Capable of crude problem solving,\
+ the drone's targeting system has been repurposed for locating suitable ores, though even\
+ that is only functional in certain conditions.\
+
\
+ These drones are armed with high-power mining emitters, which makes their decrepit forms\
+ just as lethal as they were in their prime. Modified thrust vectoring devices allow them\
+ to gather ore effectively without expending mechanical energy."
+ value = CATALOGUER_REWARD_MEDIUM
+
+/mob/living/simple_mob/mechanical/mining_drone
+ name = "mining drone"
+ desc = "An automated drone with a worn-out appearance, but an ominous gaze."
+ catalogue_data = list(/datum/category_item/catalogue/technology/drone/mining_drone)
+
+ icon_state = "miningdrone"
+ icon_living = "miningdrone"
+ icon_dead = "miningdrone_dead"
+ has_eye_glow = TRUE
+
+ faction = "malf_drone"
+
+ maxHealth = 50
+ health = 50
+ movement_cooldown = 5
+ hovering = TRUE
+
+ base_attack_cooldown = 5
+ projectiletype = /obj/item/projectile/energy/excavate
+ projectilesound = 'sound/weapons/pulse3.ogg'
+
+ response_help = "pokes"
+ response_disarm = "gently pushes aside"
+ response_harm = "hits"
+
+ ai_holder_type = /datum/ai_holder/simple_mob/ranged/kiting/threatening
+ say_list_type = /datum/say_list/malf_drone
+
+ tame_items = list(
+ /obj/item/weapon/ore/verdantium = 90,
+ /obj/item/weapon/ore/hydrogen = 90,
+ /obj/item/weapon/ore/osmium = 70,
+ /obj/item/weapon/ore/diamond = 70,
+ /obj/item/weapon/ore/gold = 55,
+ /obj/item/weapon/ore/silver = 55,
+ /obj/item/weapon/ore/lead = 40,
+ /obj/item/weapon/ore/marble = 30,
+ /obj/item/weapon/ore/coal = 25,
+ /obj/item/weapon/ore/iron = 25,
+ /obj/item/weapon/ore/glass = 15,
+ /obj/item/weapon/ore = 5
+ )
+
+ var/datum/effect/effect/system/ion_trail_follow/ion_trail = null
+ var/obj/item/shield_projector/shields = null
+ var/obj/item/weapon/storage/bag/ore/my_storage = null
+
+ var/last_search = 0
+ var/search_cooldown = 5 SECONDS
+
+/mob/living/simple_mob/mechanical/mining_drone/Initialize()
+ ion_trail = new
+ ion_trail.set_up(src)
+ ion_trail.start()
+
+ my_storage = new /obj/item/weapon/storage/bag/ore(src)
+ shields = new /obj/item/shield_projector/rectangle/automatic/drone(src)
+ return ..()
+
+/mob/living/simple_mob/mechanical/mining_drone/Destroy()
+ QDEL_NULL(ion_trail)
+ QDEL_NULL(shields)
+ QDEL_NULL(my_storage)
+ return ..()
+
+/mob/living/simple_mob/mechanical/mining_drone/death()
+ my_storage.forceMove(get_turf(src))
+ my_storage = null
+ ..(null,"suddenly breaks apart.")
+ qdel(src)
+
+/mob/living/simple_mob/mechanical/mining_drone/Process_Spacemove(var/check_drift = 0)
+ return TRUE
+
+/mob/living/simple_mob/mechanical/mining_drone/IIsAlly(mob/living/L)
+ . = ..()
+
+ var/mob/living/carbon/human/H = L
+ if(!istype(H))
+ return .
+
+ if(!.)
+ var/has_tool = FALSE
+ var/obj/item/I = H.get_active_hand()
+ if(istype(I,/obj/item/weapon/pickaxe))
+ has_tool = TRUE
+ return has_tool
+
+/mob/living/simple_mob/mechanical/mining_drone/handle_special()
+ if(my_storage && (get_AI_stance() in list(STANCE_APPROACH, STANCE_IDLE, STANCE_FOLLOW)) && !is_AI_busy() && isturf(loc) && (world.time > last_search + search_cooldown) && (my_storage.contents.len < my_storage.max_storage_space))
+ last_search = world.time
+
+ for(var/turf/T in view(world.view,src))
+ if(my_storage.contents.len >= my_storage.max_storage_space)
+ break
+
+ if((locate(/obj/item/weapon/ore) in T) && prob(40))
+ src.Beam(T, icon_state = "holo_beam", time = 0.5 SECONDS)
+ my_storage.rangedload(T, src)
+
+ if(my_storage.contents.len >= my_storage.max_storage_space)
+ visible_message("\The [src] emits a shrill beep, indicating its storage is full.")
+
+ var/obj/structure/ore_box/OB = locate() in view(2, src)
+
+ if(istype(OB) && my_storage && my_storage.contents.len)
+ src.Beam(OB, icon_state = "rped_upgrade", time = 1 SECONDS)
+ for(var/obj/item/I in my_storage)
+ my_storage.remove_from_storage(I, OB)
diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/durand.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/durand.dm
index 2965e06932..df0984878e 100644
--- a/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/durand.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/durand.dm
@@ -68,3 +68,11 @@
/mob/living/simple_mob/mechanical/mecha/combat/durand/defensive/Initialize()
set_defense_mode(TRUE)
return ..()
+
+/mob/living/simple_mob/mechanical/mecha/combat/durand/defensive/mercenary
+ desc = "An aging combat exosuit utilized by many corporations. It was originally developed to fight in the First Contact War.\
+ This one has been retrofitted into a turret."
+
+ projectiletype = /obj/item/projectile/beam/heavylaser/fakeemitter
+
+ pilot_type = /mob/living/simple_mob/humanoid/merc/ranged
diff --git a/code/modules/mob/living/simple_mob/taming.dm b/code/modules/mob/living/simple_mob/taming.dm
new file mode 100644
index 0000000000..e24b675c5b
--- /dev/null
+++ b/code/modules/mob/living/simple_mob/taming.dm
@@ -0,0 +1,62 @@
+
+/mob/living/simple_mob
+ // Assoc list of items that can be given to a mob to befriend it, and the percent success.
+ var/list/tame_items
+ // List of mobs who are 'friends'.
+ var/list/tamers
+
+/mob/living/simple_mob/IIsAlly(mob/living/L)
+ . = ..()
+
+ if(!. && LAZYLEN(tamers))
+ listclearnulls(tamers)
+ if(L in tamers)
+ return TRUE
+
+/mob/living/simple_mob/proc/can_tame(var/obj/O, var/mob/user)
+ if(!LAZYLEN(tame_items))
+ return FALSE
+
+ if(!user)
+ return FALSE
+
+ if(!O)
+ return FALSE
+
+ for(var/path in tame_items)
+ if(istype(O, path) && unique_tame_check(O,user))
+ return TRUE
+
+ return FALSE
+
+/mob/living/simple_mob/proc/unique_tame_check(var/obj/O, var/mob/user)
+ if(do_after(user, 0.5 SECONDS, src))
+ return TRUE
+ return FALSE
+
+/mob/living/simple_mob/proc/tame_prob(var/obj/O, var/mob/user)
+ for(var/path in tame_items)
+ if(istype(O, path))
+ if(prob(tame_items[path]))
+ return TRUE
+ return FALSE
+
+/mob/living/simple_mob/proc/do_tame(var/obj/O, var/mob/user)
+ if(!user)
+ return
+
+ if(!LAZYLEN(tamers))
+ tamers = list()
+
+ handle_tame_item(O, user)
+
+ tamers |= user
+ ai_holder.forget_everything()
+
+/mob/living/simple_mob/proc/handle_tame_item(var/obj/O, var/mob/user)
+ user.drop_from_inventory(O)
+ qdel(O)
+
+/mob/living/simple_mob/proc/fail_tame(var/obj/O, var/mob/user)
+ user.drop_from_inventory(O)
+ qdel(O)
diff --git a/code/modules/projectiles/ammunition/rounds.dm b/code/modules/projectiles/ammunition/rounds.dm
index b187f325bd..1dd8f6e149 100644
--- a/code/modules/projectiles/ammunition/rounds.dm
+++ b/code/modules/projectiles/ammunition/rounds.dm
@@ -287,6 +287,14 @@
projectile_type = /obj/item/projectile/bullet/rifle/a145
matter = list(DEFAULT_WALL_MATERIAL = 1250)
+/obj/item/ammo_casing/a145/highvel
+ desc = "A 14.5mm sabot shell."
+ projectile_type = /obj/item/projectile/bullet/rifle/a145
+
+/obj/item/ammo_casing/a145/spent/Initialize()
+ ..()
+ expend()
+
/*
* 5.45mm
*/
diff --git a/code/modules/projectiles/broken.dm b/code/modules/projectiles/broken.dm
new file mode 100644
index 0000000000..99b6ffbfd1
--- /dev/null
+++ b/code/modules/projectiles/broken.dm
@@ -0,0 +1,134 @@
+
+/obj/item/weapon/broken_gun
+ desc = "The remains of an unfortunate firearm."
+
+ var/obj/item/weapon/gun/my_guntype = null
+
+ // Materials needed for repair. Associative list, path - number of items
+ var/list/material_needs
+
+ var/do_rotation = TRUE
+
+/obj/item/weapon/broken_gun/New(var/newloc, var/path)
+ ..()
+ if(path)
+ if(!setup_gun(path))
+ qdel(src)
+ return
+ setup_repair_needs()
+
+/obj/item/weapon/broken_gun/Initialize()
+ ..()
+ spawn(30 SECONDS)
+ if(!my_guntype && !QDELETED(src))
+ qdel(src)
+
+/obj/item/weapon/broken_gun/examine(mob/user)
+ ..()
+ if(get_dist(get_turf(user),get_turf(src)) <= 1)
+ to_chat(user, "You begin inspecting \the [src].")
+
+ if(do_after(user, 5 SECONDS))
+ to_chat(user, "\The [src] can possibly be restored with:")
+ for(var/resource in material_needs)
+ if(material_needs[resource] > 0)
+ to_chat(user, "- \icon [resource] x [material_needs[resource]] [resource]")
+
+/obj/item/weapon/broken_gun/proc/setup_gun(var/obj/item/weapon/gun/path)
+ if(ispath(path))
+ name = "[pick("busted", "broken", "shattered", "scrapped")] [initial(path.name)]"
+ icon = initial(path.icon)
+ icon_state = initial(path.icon_state)
+
+ my_guntype = path
+
+ w_class = initial(path.w_class)
+
+ if(do_rotation)
+ adjust_rotation(rand() * pick(-1,1) * rand(0, 45))
+
+ return TRUE
+
+ return FALSE
+
+/obj/item/weapon/broken_gun/proc/setup_repair_needs()
+ if(!LAZYLEN(material_needs))
+ material_needs = list()
+
+ if(prob(40))
+ var/chosen_mat = pick(/obj/item/stack/material/plastic, /obj/item/stack/material/plasteel, /obj/item/stack/material/glass)
+ material_needs[chosen_mat] = rand(1, 3)
+
+ if(prob(30))
+ var/component_needed = pick(/obj/item/weapon/stock_parts/gear,/obj/item/weapon/stock_parts/spring,/obj/item/weapon/stock_parts/manipulator)
+ material_needs[component_needed] = rand(1,3)
+
+ if(ispath(my_guntype, /obj/item/weapon/gun/energy) && prob(25))
+ var/component_needed = pick(/obj/item/stack/cable_coil, /obj/item/weapon/stock_parts/scanning_module,/obj/item/weapon/stock_parts/capacitor)
+ material_needs[component_needed] = rand(1,3)
+
+ if(ispath(my_guntype, /obj/item/weapon/gun/launcher) && prob(50))
+ var/component_needed = pick(/obj/item/weapon/tape_roll, /obj/item/weapon/material/wirerod)
+ material_needs[component_needed] = 1
+
+ if(ispath(my_guntype, /obj/item/weapon/gun/magnetic) && prob(70))
+ var/component_needed = pick(/obj/item/weapon/smes_coil, /obj/item/device/assembly/prox_sensor, /obj/item/weapon/module/power_control)
+ material_needs[component_needed] = 1
+
+ material_needs[/obj/item/stack/material/steel] = rand(1,5)
+
+/obj/item/weapon/broken_gun/attackby(obj/item/W as obj, mob/user as mob)
+ if(can_repair_with(W, user))
+ if(do_after(user, (rand() * 10 SECONDS) + 5 SECONDS))
+ repair_with(W, user)
+ return
+
+ ..()
+
+/obj/item/weapon/broken_gun/proc/can_repair_with(obj/item/I, mob/user)
+ for(var/path in material_needs)
+ if(ispath(path) && istype(I, path))
+ if(material_needs[path] > 0)
+ if(istype(I, /obj/item/stack))
+ var/obj/item/stack/S = I
+ if(S.can_use(material_needs[path]))
+ return TRUE
+ else
+ to_chat(user, "You do not have enough [path] to continue repairs.")
+ else
+ return TRUE
+
+ return FALSE
+
+/obj/item/weapon/broken_gun/proc/repair_with(obj/item/I, mob/user)
+ for(var/path in material_needs)
+ if(ispath(path) && istype(I, path))
+ if(material_needs[path] > 0)
+ if(istype(I, /obj/item/stack))
+ var/obj/item/stack/S = I
+ if(S.can_use(material_needs[path]))
+ S.use(material_needs[path])
+ material_needs[path] = 0
+ to_chat(user, "You repair some damage on \the [src] with \the [S].")
+ else
+ material_needs[path] = max(0, material_needs[path] - 1)
+ user.drop_from_inventory(I)
+ to_chat(user, "You repair some damage on \the [src] with \the [I].")
+ qdel(I)
+
+ check_complete_repair(user)
+
+ return
+
+/obj/item/weapon/broken_gun/proc/check_complete_repair(mob/user)
+ var/fully_repaired = TRUE
+ for(var/resource in material_needs)
+ if(material_needs[resource] > 0)
+ fully_repaired = FALSE
+ break
+
+ if(fully_repaired)
+ my_guntype = new my_guntype(get_turf(src))
+ my_guntype.name = "[pick("salvaged", "repaired", "old")] [initial(my_guntype.name)]"
+ to_chat(user, "You finish your repairs on \the [my_guntype].")
+ qdel(src)
diff --git a/code/modules/projectiles/brokenguns/energy.dm b/code/modules/projectiles/brokenguns/energy.dm
new file mode 100644
index 0000000000..6427e89c27
--- /dev/null
+++ b/code/modules/projectiles/brokenguns/energy.dm
@@ -0,0 +1,9 @@
+
+/obj/item/weapon/broken_gun/laserrifle/New(var/newloc)
+ ..(newloc, /obj/item/weapon/gun/energy/laser/empty)
+
+/obj/item/weapon/broken_gun/laser_retro/New(var/newloc)
+ ..(newloc, /obj/item/weapon/gun/energy/retro/empty)
+
+/obj/item/weapon/broken_gun/ionrifle/New(var/newloc)
+ ..(newloc, /obj/item/weapon/gun/energy/ionrifle/empty)
diff --git a/code/modules/projectiles/brokenguns/launcher.dm b/code/modules/projectiles/brokenguns/launcher.dm
new file mode 100644
index 0000000000..a66449de78
--- /dev/null
+++ b/code/modules/projectiles/brokenguns/launcher.dm
@@ -0,0 +1,3 @@
+
+/obj/item/weapon/broken_gun/grenadelauncher/New(var/newloc)
+ ..(newloc, /obj/item/weapon/gun/launcher/grenade)
diff --git a/code/modules/projectiles/brokenguns/magnetic.dm b/code/modules/projectiles/brokenguns/magnetic.dm
new file mode 100644
index 0000000000..dd1c647fd8
--- /dev/null
+++ b/code/modules/projectiles/brokenguns/magnetic.dm
@@ -0,0 +1,3 @@
+
+/obj/item/weapon/broken_gun/flechette/New(var/newloc)
+ ..(newloc, /obj/item/weapon/gun/magnetic/railgun/flechette)
diff --git a/code/modules/projectiles/brokenguns/projectile.dm b/code/modules/projectiles/brokenguns/projectile.dm
new file mode 100644
index 0000000000..741e4bf087
--- /dev/null
+++ b/code/modules/projectiles/brokenguns/projectile.dm
@@ -0,0 +1,18 @@
+
+/obj/item/weapon/broken_gun/c20r/New(var/newloc)
+ ..(newloc, /obj/item/weapon/gun/projectile/automatic/c20r/empty)
+
+/obj/item/weapon/broken_gun/silenced45/New(var/newloc)
+ ..(newloc, /obj/item/weapon/gun/projectile/silenced/empty)
+
+/obj/item/weapon/broken_gun/pumpshotgun/New(var/newloc)
+ ..(newloc, /obj/item/weapon/gun/projectile/shotgun/pump/empty)
+
+/obj/item/weapon/broken_gun/pumpshotgun_combat/New(var/newloc)
+ ..(newloc, /obj/item/weapon/gun/projectile/shotgun/pump/combat/empty)
+
+/obj/item/weapon/broken_gun/z8/New(var/newloc)
+ ..(newloc, /obj/item/weapon/gun/projectile/automatic/z8/empty)
+
+/obj/item/weapon/broken_gun/dartgun/New(var/newloc)
+ ..(newloc, /obj/item/weapon/gun/projectile/dartgun)
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index 45c6364c1b..778b36694d 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -19,6 +19,9 @@
list(mode_name="suppressive", fire_delay=5, projectile_type=/obj/item/projectile/beam/weaklaser, charge_cost = 60),
)
+/obj/item/weapon/gun/energy/laser/empty
+ cell_type = null
+
/obj/item/weapon/gun/energy/laser/mounted
self_recharge = 1
use_external_power = 1
@@ -175,7 +178,7 @@
force = 10
w_class = ITEMSIZE_HUGE // So it can't fit in a backpack.
accuracy = -45 //shooting at the hip
- scoped_accuracy = 0
+ scoped_accuracy = 50
one_handed_penalty = 60 // The weapon itself is heavy, and the long barrel makes it hard to hold steady with just one hand.
/obj/item/weapon/gun/energy/sniperrifle/ui_action_click()
@@ -192,7 +195,8 @@
name = "antique mono-rifle"
desc = "An old laser rifle. This one can only fire once before requiring recharging."
description_fluff = "Modeled after ancient hunting rifles, this rifle was dubbed the 'Rainy Day Special' by some, due to its use as some barmens' fight-stopper of choice. One shot is all it takes, or so they say."
- icon_state = "eshotgun"
+ icon = 'icons/obj/energygun.dmi'
+ icon_state = "mono"
item_state = "shotgun"
origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 4, TECH_POWER = 3)
projectile_type = /obj/item/projectile/beam/sniper
@@ -204,6 +208,7 @@
w_class = ITEMSIZE_LARGE
accuracy = 10
scoped_accuracy = 15
+ charge_meter = FALSE
var/scope_multiplier = 1.5
/obj/item/weapon/gun/energy/monorifle/ui_action_click()
@@ -220,7 +225,7 @@
name = "combat mono-rifle"
desc = "A modernized version of the mono-rifle. This one can fire twice before requiring recharging."
description_fluff = "A modern design produced by a company once working from Saint Columbia, based on the antique mono-rifle 'Rainy Day Special' design."
- icon_state = "ecshotgun"
+ icon_state = "cmono"
item_state = "cshotgun"
charge_cost = 1000
force = 12
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index 3fe7a4f21c..f47053cba0 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -13,6 +13,9 @@
/obj/item/weapon/gun/energy/ionrifle/emp_act(severity)
..(max(severity, 4)) //so it doesn't EMP itself, I guess
+/obj/item/weapon/gun/energy/ionrifle/empty
+ cell_type = null
+
/obj/item/weapon/gun/energy/ionrifle/pistol
name = "ion pistol"
desc = "The NT Mk63 EW Pan is a man portable anti-armor weapon designed to disable mechanical threats, produced by NT. This model sacrifices capacity for portability."
diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm
index ab107fb0b5..d3903c21a8 100644
--- a/code/modules/projectiles/guns/projectile/automatic.dm
+++ b/code/modules/projectiles/guns/projectile/automatic.dm
@@ -58,6 +58,9 @@
// one_handed_penalty = 15
+/obj/item/weapon/gun/projectile/automatic/c20r/empty
+ magazine_type = null
+
/obj/item/weapon/gun/projectile/automatic/c20r/update_icon()
..()
if(ammo_magazine)
@@ -192,6 +195,9 @@
else
. += "\The [launcher] is empty."
+/obj/item/weapon/gun/projectile/automatic/z8/empty
+ magazine_type = null
+
/obj/item/weapon/gun/projectile/automatic/l6_saw
name = "light machine gun"
desc = "A rather traditionally made L6 SAW with a pleasantly lacquered wooden pistol grip. 'Aussec Armoury-2531' is engraved on the reciever. Uses 5.45mm rounds. It's also compatible with magazines from STS-35 assault rifles."
diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm
index 8426448d6c..435260b45e 100644
--- a/code/modules/projectiles/guns/projectile/pistol.dm
+++ b/code/modules/projectiles/guns/projectile/pistol.dm
@@ -125,6 +125,9 @@
allowed_magazines = list(/obj/item/ammo_magazine/m45)
projectile_type = /obj/item/projectile/bullet/pistol/medium
+/obj/item/weapon/gun/projectile/silenced/empty
+ magazine_type = null
+
/obj/item/weapon/gun/projectile/deagle
name = "desert eagle"
desc = "The perfect handgun for shooters with a need to hit targets through a wall and behind a fridge in your neighbor's house. Uses .44 rounds."
diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm
index 74896b6b6a..9862b71b06 100644
--- a/code/modules/projectiles/guns/projectile/shotgun.dm
+++ b/code/modules/projectiles/guns/projectile/shotgun.dm
@@ -54,6 +54,9 @@
else
icon_state = "[icon_state]-empty"
+/obj/item/weapon/gun/projectile/shotgun/pump/empty
+ ammo_type = null
+
/obj/item/weapon/gun/projectile/shotgun/pump/slug
ammo_type = /obj/item/ammo_casing/a12g
@@ -67,6 +70,9 @@
ammo_type = /obj/item/ammo_casing/a12g
load_method = SINGLE_CASING|SPEEDLOADER
+/obj/item/weapon/gun/projectile/shotgun/pump/combat/empty
+ ammo_type = null
+
/obj/item/weapon/gun/projectile/shotgun/doublebarrel
name = "double-barreled shotgun"
desc = "A truely classic weapon. No need to change what works. Uses 12g rounds."
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index e05739d194..d1a6f22b4d 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -216,6 +216,16 @@
armor_penetration = 80
hitscan = 1 //so the PTR isn't useless as a sniper weapon
+ icon_state = "bullet_alt"
+ tracer_type = /obj/effect/projectile/tracer/cannon
+
+/obj/item/projectile/bullet/rifle/a145/highvel
+ damage = 50
+ stun = 1
+ weaken = 0
+ penetrating = 15
+ armor_penetration = 90
+
/* Miscellaneous */
/obj/item/projectile/bullet/suffocationbullet//How does this even work?
diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm
index 533cff2e32..3d7dca8d19 100644
--- a/code/modules/projectiles/projectile/energy.dm
+++ b/code/modules/projectiles/projectile/energy.dm
@@ -101,6 +101,19 @@
combustion = FALSE
+/obj/item/projectile/energy/excavate
+ name = "kinetic blast"
+ icon_state = "kinetic_blast"
+ fire_sound = 'sound/weapons/pulse3.ogg'
+ damage_type = BRUTE
+ damage = 30
+ armor_penetration = 60
+ excavation_amount = 200
+ check_armour = "melee"
+
+ vacuum_traversal = 0
+ combustion = FALSE
+
/obj/item/projectile/energy/dart
name = "dart"
icon_state = "toxin"
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
index 2cd0519285..ac039460cb 100644
--- a/code/modules/projectiles/projectile/special.dm
+++ b/code/modules/projectiles/projectile/special.dm
@@ -277,9 +277,9 @@
light_power = 3
light_color = "#3300ff"
- muzzle_type = /obj/effect/projectile/tungsten/muzzle
- tracer_type = /obj/effect/projectile/tungsten/tracer
- impact_type = /obj/effect/projectile/tungsten/impact
+ muzzle_type = /obj/effect/projectile/muzzle/tungsten
+ tracer_type = /obj/effect/projectile/tracer/tungsten
+ impact_type = /obj/effect/projectile/impact/tungsten
/obj/item/projectile/beam/tungsten/on_hit(var/atom/target, var/blocked = 0)
if(isliving(target))
diff --git a/code/modules/xenoarcheaology/artifacts/artifact.dm b/code/modules/xenoarcheaology/artifacts/artifact.dm
index 840c2096c5..bd8fdf7513 100644
--- a/code/modules/xenoarcheaology/artifacts/artifact.dm
+++ b/code/modules/xenoarcheaology/artifacts/artifact.dm
@@ -9,19 +9,43 @@
var/datum/artifact_effect/secondary_effect
var/being_used = 0
+ var/predefined_effects = FALSE
+
+ var/predefined_primary
+ var/predefined_secondary
+
+ var/predefined_icon_num
+
+ var/predefined_triggers = FALSE
+
+ var/predefined_trig_primary
+ var/predefined_trig_secondary
+
/obj/machinery/artifact/New()
..()
- var/effecttype = pick(typesof(/datum/artifact_effect) - /datum/artifact_effect)
- my_effect = new effecttype(src)
+ if(predefined_effects && predefined_primary)
+ my_effect = new predefined_primary(src)
+
+ if(predefined_secondary)
+ secondary_effect = new predefined_secondary(src)
+ if(prob(75))
+ secondary_effect.ToggleActivate(0)
+
+ else
+ var/effecttype = pick(typesof(/datum/artifact_effect) - /datum/artifact_effect)
+ my_effect = new effecttype(src)
- if(prob(75))
- effecttype = pick(typesof(/datum/artifact_effect) - /datum/artifact_effect)
- secondary_effect = new effecttype(src)
if(prob(75))
- secondary_effect.ToggleActivate(0)
+ effecttype = pick(typesof(/datum/artifact_effect) - /datum/artifact_effect)
+ secondary_effect = new effecttype(src)
+ if(prob(75))
+ secondary_effect.ToggleActivate(0)
- icon_num = rand(0, 14)
+ if(!isnull(predefined_icon_num))
+ icon_num = predefined_icon_num
+ else
+ icon_num = rand(0, 14)
icon_state = "ano[icon_num]0"
if(icon_num == 7 || icon_num == 8)
@@ -53,6 +77,13 @@
if(prob(60))
my_effect.trigger = pick(TRIGGER_TOUCH, TRIGGER_HEAT, TRIGGER_COLD, TRIGGER_PHORON, TRIGGER_OXY, TRIGGER_CO2, TRIGGER_NITRO)
+ if(predefined_triggers)
+ if(predefined_trig_primary && my_effect)
+ my_effect.trigger = predefined_trig_primary
+
+ if(predefined_trig_secondary && secondary_effect)
+ secondary_effect.trigger = predefined_trig_secondary
+
/obj/machinery/artifact/proc/choose_effect()
var/effect_type = input(usr, "What type do you want?", "Effect Type") as null|anything in typesof(/datum/artifact_effect) - /datum/artifact_effect
if(effect_type)
diff --git a/code/modules/xenoarcheaology/artifacts/predefined/_predefined.dm b/code/modules/xenoarcheaology/artifacts/predefined/_predefined.dm
new file mode 100644
index 0000000000..edec0dd052
--- /dev/null
+++ b/code/modules/xenoarcheaology/artifacts/predefined/_predefined.dm
@@ -0,0 +1,15 @@
+/obj/machinery/artifact/predefined
+ name = "alien artifact"
+ desc = "A large alien device."
+
+ predefined_effects = TRUE
+
+ predefined_primary = null
+ predefined_secondary = null
+
+ predefined_icon_num = null
+
+ predefined_triggers = FALSE
+
+ predefined_trig_primary = null
+ predefined_trig_secondary = null
diff --git a/code/modules/xenoarcheaology/artifacts/predefined/hungry_statue.dm b/code/modules/xenoarcheaology/artifacts/predefined/hungry_statue.dm
new file mode 100644
index 0000000000..6a81c02b8b
--- /dev/null
+++ b/code/modules/xenoarcheaology/artifacts/predefined/hungry_statue.dm
@@ -0,0 +1,15 @@
+/obj/machinery/artifact/predefined/hungry_statue
+ name = "alien artifact"
+ desc = "A large alien device."
+
+ predefined_effects = TRUE
+
+ predefined_primary = /datum/artifact_effect/animate_anomaly
+ predefined_secondary = /datum/artifact_effect/vampire
+
+ predefined_icon_num = 14
+
+ predefined_triggers = TRUE
+
+ predefined_trig_primary = TRIGGER_OXY
+ predefined_trig_secondary = TRIGGER_OXY
diff --git a/html/changelogs/mechoid-newhorizon.yml b/html/changelogs/mechoid-newhorizon.yml
new file mode 100644
index 0000000000..e9740680a3
--- /dev/null
+++ b/html/changelogs/mechoid-newhorizon.yml
@@ -0,0 +1,44 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Mechoid
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "Adds more interactions with animals, like shearing and taming."
+ - rscadd: "Sif moss turfs can now spawn animal groups."
+ - rscadd: "New PoIs"
+ - rscadd: "Thermal poncho attachment, has minor slowdown, but gives thermal protection to the armor it is attached to."
+ - rscadd: "Mercenaries now drop their guns again. Most likely to be broken, however they can be repaired. Examining when adjacent will allow you to inspect the gun for what is needed."
+ - rscadd: "Mercenary Snipers now exist. They will telegraph their shots approximately 2 seconds in advance, and can fire at 14 tiles away. Will occasionally drop pieces of their PTRs that survive combat."
+ - tweak: "Clothing can now check attachments for temperature resistance."
+ - bugfix: "MHD Howitzer beam effect actually exists again.
+ - bugfix: "Xenoresin ground cover is properly colored again."
diff --git a/icons/effects/beam.dmi b/icons/effects/beam.dmi
index 6c631498f6..4115b01ef2 100644
Binary files a/icons/effects/beam.dmi and b/icons/effects/beam.dmi differ
diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi
index e956f35874..0c0dce59bc 100644
Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ
diff --git a/icons/obj/clothing/modular_armor.dmi b/icons/obj/clothing/modular_armor.dmi
index 1372ff9a5e..119f56d6b5 100644
Binary files a/icons/obj/clothing/modular_armor.dmi and b/icons/obj/clothing/modular_armor.dmi differ
diff --git a/icons/obj/energygun.dmi b/icons/obj/energygun.dmi
index 157c3c11f6..73c39449bb 100644
Binary files a/icons/obj/energygun.dmi and b/icons/obj/energygun.dmi differ
diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi
index 1b753e9c87..1a56a0be84 100644
Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ
diff --git a/icons/obj/projectiles_tracer.dmi b/icons/obj/projectiles_tracer.dmi
index 153794a929..c6bdfbece7 100644
Binary files a/icons/obj/projectiles_tracer.dmi and b/icons/obj/projectiles_tracer.dmi differ
diff --git a/icons/obj/turrets.dmi b/icons/obj/turrets.dmi
index 3495683205..32346c5a5e 100644
Binary files a/icons/obj/turrets.dmi and b/icons/obj/turrets.dmi differ
diff --git a/maps/submaps/surface_submaps/mountains/CaveTrench.dmm b/maps/submaps/surface_submaps/mountains/CaveTrench.dmm
index d1260c33e6..9a11b82682 100644
--- a/maps/submaps/surface_submaps/mountains/CaveTrench.dmm
+++ b/maps/submaps/surface_submaps/mountains/CaveTrench.dmm
@@ -4,7 +4,7 @@
"d" = (/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CaveTrench)
"e" = (/turf/simulated/floor/outdoors/rocks,/area/submap/CaveTrench)
"f" = (/turf/simulated/floor/water{outdoors = 0},/area/submap/CaveTrench)
-"g" = (/mob/living/simple_mob/mechanical/combat_drone/lesser,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CaveTrench)
+"g" = (/obj/random/mob/robotic/drone,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CaveTrench)
"h" = (/mob/living/simple_mob/animal/passive/fish/trout{faction = "malf_drone"},/turf/simulated/floor/water{outdoors = 0},/area/submap/CaveTrench)
"i" = (/obj/effect/decal/remains/human,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CaveTrench)
"j" = (/turf/simulated/wall,/area/submap/CaveTrench)
diff --git a/maps/submaps/surface_submaps/mountains/crashedcontainmentshuttle.dmm b/maps/submaps/surface_submaps/mountains/crashedcontainmentshuttle.dmm
index 9b19efeea7..adeb82580f 100644
--- a/maps/submaps/surface_submaps/mountains/crashedcontainmentshuttle.dmm
+++ b/maps/submaps/surface_submaps/mountains/crashedcontainmentshuttle.dmm
@@ -25,6 +25,7 @@
"ay" = (/obj/effect/decal/mecha_wreckage/gygax{anchored = 1},/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
"az" = (/obj/effect/gibspawner/generic,/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
"aA" = (/obj/structure/closet/medical_wall,/turf/simulated/shuttle/wall/dark,/area/submap/crashedcontainmentshuttle)
+"aB" = (/obj/machinery/artifact/predefined/hungry_statue,/obj/structure/largecrate,/turf/simulated/shuttle/floor/red,/area/submap/crashedcontainmentshuttle)
"aC" = (/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/crashedcontainmentshuttle)
"aD" = (/obj/structure/door_assembly/door_assembly_ext,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/crashedcontainmentshuttle)
"aE" = (/obj/structure/extinguisher_cabinet,/turf/simulated/shuttle/wall/dark,/area/submap/crashedcontainmentshuttle)
@@ -90,7 +91,7 @@
"bM" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/crashedcontainmentshuttle)
"bN" = (/obj/structure/toilet{dir = 8},/obj/effect/gibspawner/generic,/obj/effect/decal/remains/human,/obj/item/weapon/card/id/syndicate{age = "\\42"; blood_type = "\\O+"; desc = "A strange ID card."; dna_hash = "\[REDACTED]"; fingerprint_hash = "\\------"; name = "Aaron Presley's ID Card(Delivery Service) "; registered_name = "Aaron Presley"; sex = "\\Male"},/turf/simulated/shuttle/floor/white,/area/submap/crashedcontainmentshuttle)
"bO" = (/obj/effect/decal/cleanable/liquid_fuel,/obj/effect/decal/remains/human,/obj/item/weapon/flame/lighter/random,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/crashedcontainmentshuttle)
-
+
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -103,7 +104,7 @@ aaaYaaaRacaaadadaZapbIbybIazbbadaNacanbJaaaaaaaaaa
aaaababdbeapapapadadadbIadadauadaNaAaeaTanaaaaataa
acaaaaaaapadauadadadacacaSacanadavacbhaeaeahaaaaaa
aPadaVaRacadadadbiadacbjafafacadadadbKbpaHaraaaaaa
-aaaPadaaacaMadbkadbbacbvafbwacaLadaSbKbqaHaoapaaaa
+aaaPadaaacaMadbkadbbacbvaBbwacaLadaSbKbqaHaoapaaaa
aPbxaVaRacaWadbbadbbanblbLbzanadbbasaebraFaIaabfaa
aPaPaaaaaaaabEazadadanacacacaEadadahaebpaHaoaaaiaa
aPaPadaaaJapbIadadaPaPadadadadadadacaeaeaeahaaaaaa
@@ -118,4 +119,3 @@ aaaaaaaaaaaaadaLaaaabmbMbObmbmaaaaaaaaaaaaaaaaaaaa
aaaaadadaaaaaaacaPbCbmbmbmaaajaaaaaaaaaaaaaaaaaaaa
aaaaaaadaaaaaaaPaPaaaaaabmaaaaaaaaaaaaaaaaaaaaaaaa
"}
-
diff --git a/maps/submaps/surface_submaps/mountains/excavation1.dmm b/maps/submaps/surface_submaps/mountains/excavation1.dmm
new file mode 100644
index 0000000000..169efe4eb5
--- /dev/null
+++ b/maps/submaps/surface_submaps/mountains/excavation1.dmm
@@ -0,0 +1,51 @@
+"a" = (/turf/simulated/mineral,/area/template_noop)
+"b" = (/turf/simulated/mineral/floor/ignore_mapgen,/area/template_noop)
+"c" = (/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/Excavation)
+"d" = (/obj/structure/cliff/automatic{icon_state = "cliffbuilder"; dir = 9},/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/Excavation)
+"e" = (/obj/structure/cliff/automatic,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/Excavation)
+"f" = (/obj/structure/cliff/automatic{icon_state = "cliffbuilder"; dir = 5},/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/Excavation)
+"g" = (/obj/structure/cliff/automatic/corner{icon_state = "cliffbuilder-corner"; dir = 9},/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/Excavation)
+"h" = (/obj/random/outcrop,/turf/simulated/floor/outdoors/rocks/caves,/area/submap/Excavation)
+"i" = (/turf/simulated/floor/outdoors/rocks/caves,/area/submap/Excavation)
+"j" = (/obj/structure/cliff/automatic/corner,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/Excavation)
+"k" = (/obj/mecha/working/ripley,/turf/simulated/floor/outdoors/rocks/caves,/area/submap/Excavation)
+"l" = (/obj/structure/cliff/automatic{icon_state = "cliffbuilder"; dir = 8},/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/Excavation)
+"m" = (/obj/structure/table/sifwoodentable,/obj/item/mecha_parts/mecha_equipment/tool/drill/bore,/obj/item/weapon/ore/marble,/turf/simulated/floor/outdoors/rocks/caves,/area/submap/Excavation)
+"n" = (/obj/item/weapon/ore,/turf/simulated/floor/outdoors/rocks/caves,/area/submap/Excavation)
+"o" = (/obj/structure/table/sifwoodentable,/obj/item/mecha_parts/mecha_equipment/hardpoint_actuator,/turf/simulated/floor/outdoors/rocks/caves,/area/submap/Excavation)
+"p" = (/obj/structure/cliff/automatic{icon_state = "cliffbuilder"; dir = 4},/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/Excavation)
+"q" = (/obj/structure/table/sifwoodentable,/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster,/turf/simulated/floor/outdoors/rocks/caves,/area/submap/Excavation)
+"r" = (/obj/structure/table/sifwoodentable,/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy/rigged,/turf/simulated/floor/outdoors/rocks/caves,/area/submap/Excavation)
+"s" = (/obj/item/weapon/ore/marble,/turf/simulated/floor/outdoors/rocks/caves,/area/submap/Excavation)
+"t" = (/obj/item/weapon/ore/gold,/turf/simulated/floor/outdoors/rocks/caves,/area/submap/Excavation)
+"u" = (/obj/item/weapon/ore/diamond,/turf/simulated/floor/outdoors/rocks/caves,/area/submap/Excavation)
+"v" = (/mob/living/simple_mob/mechanical/mining_drone,/turf/simulated/floor/outdoors/rocks/caves,/area/submap/Excavation)
+"w" = (/obj/structure/table/sifwoodentable,/obj/item/weapon/pickaxe/jackhammer,/turf/simulated/floor/outdoors/rocks/caves,/area/submap/Excavation)
+"x" = (/obj/structure/table/sifwoodentable,/obj/random/projectile/scrapped_grenadelauncher,/turf/simulated/floor/outdoors/rocks/caves,/area/submap/Excavation)
+"y" = (/obj/structure/table/sifwoodentable,/obj/random/medical/pillbottle,/turf/simulated/floor/outdoors/rocks/caves,/area/submap/Excavation)
+"z" = (/obj/structure/table/sifwoodentable,/obj/item/weapon/grenade/chem_grenade/metalfoam,/obj/item/weapon/grenade/chem_grenade/metalfoam,/obj/item/weapon/grenade/chem_grenade/metalfoam,/turf/simulated/floor/outdoors/rocks/caves,/area/submap/Excavation)
+"A" = (/obj/structure/table/sifwoodentable,/obj/item/weapon/mining_scanner,/turf/simulated/floor/outdoors/rocks/caves,/area/submap/Excavation)
+"B" = (/obj/structure/table/sifwoodentable,/obj/random/cigarettes,/obj/random/tool/powermaint,/turf/simulated/floor/outdoors/rocks/caves,/area/submap/Excavation)
+"C" = (/obj/structure/cliff/automatic{icon_state = "cliffbuilder"; dir = 10},/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/Excavation)
+"D" = (/obj/structure/cliff/automatic{icon_state = "cliffbuilder"; dir = 2},/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/Excavation)
+"E" = (/obj/structure/cliff/automatic/corner{icon_state = "cliffbuilder-corner"; dir = 10},/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/Excavation)
+"F" = (/obj/structure/cliff/automatic/corner{icon_state = "cliffbuilder-corner"; dir = 6},/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/Excavation)
+"G" = (/obj/structure/cliff/automatic{icon_state = "cliffbuilder"; dir = 6},/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/Excavation)
+
+(1,1,1) = {"
+aabbbbbbbaa
+accdeeefcca
+bcdghhijfcb
+bdghikihjfb
+bliimnoiipb
+blhiqirihpb
+bliniisnhpb
+blhtiuiiipb
+bliviinvhpb
+blhwinixipb
+blhynitzhpb
+bliAiniBhpb
+bliisinihpb
+aCDEniiFDGa
+aabbbbbbbaa
+"}
diff --git a/maps/submaps/surface_submaps/mountains/mountains.dm b/maps/submaps/surface_submaps/mountains/mountains.dm
index 001103e446..8e1b7446ed 100644
--- a/maps/submaps/surface_submaps/mountains/mountains.dm
+++ b/maps/submaps/surface_submaps/mountains/mountains.dm
@@ -38,6 +38,7 @@
#include "Geyser2.dmm"
#include "Geyser3.dmm"
#include "Cliff1.dmm"
+#include "excavation1.dmm"
#endif
// The 'mountains' is the mining z-level, and has a lot of caves.
@@ -253,8 +254,8 @@
/datum/map_template/surface/mountains/deep/crashed_ufo_frigate
name = "Crashed UFO Frigate"
- desc = "A (formerly) flying saucer that is now embedded into the mountain, yet its combat protocols still seem to be running..."
- mappath = 'maps/submaps/surface_submaps/mountains/crashed_ufo.dmm'
+ desc = "A (formerly) flying saucer that is now embedded into the mountain, yet the combat protocols still seem to be running..."
+ mappath = 'maps/submaps/surface_submaps/mountains/crashed_ufo_frigate.dmm'
cost = 60
discard_prob = 50
@@ -337,4 +338,10 @@
name = "Crashed Med Shuttle"
desc = "A medical response shuttle that went missing some time ago. So this is where they went."
mappath = 'maps/submaps/surface_submaps/mountains/CrashedMedShuttle1.dmm'
- cost = 20
\ No newline at end of file
+ cost = 20
+
+/datum/map_template/surface/mountains/deep/excavation1
+ name = "Excavation Site"
+ desc = "An abandoned mining site."
+ mappath = 'maps/submaps/surface_submaps/mountains/excavation1.dmm'
+ cost = 20
diff --git a/maps/submaps/surface_submaps/mountains/mountains_areas.dm b/maps/submaps/surface_submaps/mountains/mountains_areas.dm
index 00700bd7db..a6968fac98 100644
--- a/maps/submaps/surface_submaps/mountains/mountains_areas.dm
+++ b/maps/submaps/surface_submaps/mountains/mountains_areas.dm
@@ -134,4 +134,8 @@
/area/submap/lava_trench/outpost
name = "POI - Trench Outpost"
requires_power = FALSE
- icon_state = "submap2"
\ No newline at end of file
+ icon_state = "submap2"
+
+/area/submap/Excavation
+ name = "POI - Excavation Site"
+ ambience = AMBIENCE_FOREBODING
diff --git a/maps/submaps/surface_submaps/plains/BuriedTreasure.dmm b/maps/submaps/surface_submaps/plains/BuriedTreasure.dmm
new file mode 100644
index 0000000000..0018404dca
--- /dev/null
+++ b/maps/submaps/surface_submaps/plains/BuriedTreasure.dmm
@@ -0,0 +1,10 @@
+"a" = (/turf/template_noop,/area/submap/BuriedTreasure)
+"b" = (/obj/structure/closet/grave,/obj/random/gun/random,/obj/random/contraband,/obj/random/cash,/obj/random/cigarettes,/obj/random/trash,/obj/random/junk,/obj/random/drinkbottle,/turf/template_noop,/area/submap/BuriedTreasure)
+
+(1,1,1) = {"
+aaaaa
+aaaaa
+aabaa
+aaaaa
+aaaaa
+"}
diff --git a/maps/submaps/surface_submaps/plains/BuriedTreasure2.dmm b/maps/submaps/surface_submaps/plains/BuriedTreasure2.dmm
new file mode 100644
index 0000000000..f10b287e69
--- /dev/null
+++ b/maps/submaps/surface_submaps/plains/BuriedTreasure2.dmm
@@ -0,0 +1,10 @@
+"a" = (/turf/template_noop,/area/submap/BuriedTreasure)
+"b" = (/obj/structure/closet/grave,/obj/random/contraband,/obj/random/contraband,/obj/random/cash,/obj/random/cash,/obj/random/cash,/obj/random/cash,/obj/random/drinkbottle,/obj/random/mre,/obj/random/projectile/sec,/obj/item/clothing/under/explorer/armored,/turf/template_noop,/area/submap/BuriedTreasure)
+
+(1,1,1) = {"
+aaaaa
+aaaaa
+aabaa
+aaaaa
+aaaaa
+"}
diff --git a/maps/submaps/surface_submaps/plains/BuriedTreasure3.dmm b/maps/submaps/surface_submaps/plains/BuriedTreasure3.dmm
new file mode 100644
index 0000000000..fdc989871d
--- /dev/null
+++ b/maps/submaps/surface_submaps/plains/BuriedTreasure3.dmm
@@ -0,0 +1,10 @@
+"a" = (/turf/template_noop,/area/submap/BuriedTreasure)
+"b" = (/obj/structure/closet/grave,/obj/random/energy,/obj/random/drinkbottle,/obj/random/contraband,/obj/random/ammo,/obj/random/ammo,/obj/random/mre,/obj/random/tool/power,/obj/random/unidentified_medicine/fresh_medicine,/obj/random/unidentified_medicine/combat_medicine,/obj/random/medical/pillbottle,/obj/random/soap,/turf/template_noop,/area/submap/BuriedTreasure)
+
+(1,1,1) = {"
+aaaaa
+aaaaa
+aabaa
+aaaaa
+aaaaa
+"}
diff --git a/maps/submaps/surface_submaps/plains/PlainsKururak.dmm b/maps/submaps/surface_submaps/plains/PlainsKururak.dmm
new file mode 100644
index 0000000000..f3a43e4c91
--- /dev/null
+++ b/maps/submaps/surface_submaps/plains/PlainsKururak.dmm
@@ -0,0 +1,26 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/turf/simulated/mineral/ignore_mapgen,/area/submap/PlainsKururak)
+"c" = (/obj/random/trash,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/PlainsKururak)
+"d" = (/obj/random/firstaid,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/PlainsKururak)
+"e" = (/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/PlainsKururak)
+"f" = (/obj/random/projectile/sec,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/PlainsKururak)
+"g" = (/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/PlainsKururak)
+"h" = (/mob/living/simple_mob/animal/sif/kururak,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/PlainsKururak)
+"i" = (/obj/random/outcrop,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/PlainsKururak)
+"j" = (/obj/random/contraband,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/PlainsKururak)
+"k" = (/mob/living/simple_mob/animal/sif/diyaab,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/PlainsKururak)
+"l" = (/obj/random/trash,/turf/template_noop,/area/submap/PlainsKururak)
+"m" = (/turf/template_noop,/area/submap/PlainsKururak)
+
+(1,1,1) = {"
+aaaaaaaaaa
+abbbbbbbaa
+bbbcdefbaa
+bbgeehibba
+bbieebbbba
+bbbjebklma
+abbbckkbba
+aabbbbibba
+aaaabbbbaa
+aaaaaaaaaa
+"}
diff --git a/maps/submaps/surface_submaps/plains/Thiefc.dmm b/maps/submaps/surface_submaps/plains/Thiefc.dmm
index 57a27da7c5..f8b8327363 100644
--- a/maps/submaps/surface_submaps/plains/Thiefc.dmm
+++ b/maps/submaps/surface_submaps/plains/Thiefc.dmm
@@ -13,7 +13,7 @@
"m" = (/obj/structure/table/steel,/obj/item/weapon/paper{desc = "This is some bullshit. First chance we got to knick something that looks half decent turns out to be mostly junk. And now we're getting calls that the other stash we've got has got a spider problem. Fuck this, Between the shitty weather, The pissed of bugs, And now apparently some NT goon running around in the area there's hardly enough reason to stick around. I'm telling Carl I'm out tommorow."; name = "Note"},/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Thiefc)
"n" = (/obj/vehicle/train/trolley,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Thiefc)
"o" = (/obj/structure/closet/crate,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Thiefc)
-"p" = (/obj/structure/closet/crate,/obj/item/weapon/storage/box/shotgunammo,/obj/item/weapon/storage/box/practiceshells,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Thiefc)
+"p" = (/obj/structure/closet/crate,/obj/item/weapon/storage/box/shotgunammo,/obj/item/weapon/storage/box/practiceshells,/obj/random/projectile/scrapped_gun,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Thiefc)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/maps/submaps/surface_submaps/plains/plains.dm b/maps/submaps/surface_submaps/plains/plains.dm
index 8a86961656..35239df65b 100644
--- a/maps/submaps/surface_submaps/plains/plains.dm
+++ b/maps/submaps/surface_submaps/plains/plains.dm
@@ -28,6 +28,10 @@
#include "SupplyDrop2.dmm"
#include "RationCache.dmm"
#include "Oldhouse.dmm"
+#include "PlainsKururak.dmm"
+#include "BuriedTreasure.dmm"
+#include "BuriedTreasure2.dmm"
+#include "BuriedTreasure3.dmm"
#endif
@@ -214,4 +218,31 @@
name = "Ruptured Canister"
desc = "A dumped chemical canister. Looks dangerous."
mappath = 'maps/submaps/surface_submaps/plains/chemspill1.dmm'
- cost = 10
\ No newline at end of file
+ cost = 10
+
+/datum/map_template/surface/plains/PlainsKururak
+ name = "Lone Kururak"
+ desc = "A lone Kururak's den."
+ mappath = 'maps/submaps/surface_submaps/plains/PlainsKururak.dmm'
+ cost = 10
+
+/datum/map_template/surface/plains/BuriedTreasure1
+ name = "Buried Treasure 1"
+ desc = "A hole in the ground, who knows what might be inside!"
+ mappath = 'maps/submaps/surface_submaps/plains/BuriedTreasure.dmm'
+ cost = 10
+ template_group = "Shallow Grave"
+
+/datum/map_template/surface/plains/BuriedTreasure2
+ name = "Buried Treasure 2"
+ desc = "A hole in the ground, who knows what might be inside!"
+ mappath = 'maps/submaps/surface_submaps/plains/BuriedTreasure2.dmm'
+ cost = 10
+ template_group = "Shallow Grave"
+
+/datum/map_template/surface/plains/BuriedTreasure3
+ name = "Buried Treasure 3"
+ desc = "A hole in the ground, who knows what might be inside!"
+ mappath = 'maps/submaps/surface_submaps/plains/BuriedTreasure3.dmm'
+ cost = 10
+ template_group = "Shallow Grave"
diff --git a/maps/submaps/surface_submaps/plains/plains_areas.dm b/maps/submaps/surface_submaps/plains/plains_areas.dm
index f6e6d9677c..5889576757 100644
--- a/maps/submaps/surface_submaps/plains/plains_areas.dm
+++ b/maps/submaps/surface_submaps/plains/plains_areas.dm
@@ -61,6 +61,9 @@
/area/submap/Smol3
name = "POI - Merchant's Stand"
+/area/submap/PlainsKururak
+ name = "POI - Lone Kururak"
+
/area/submap/PooledR
name = "POI - Pooled Rocks"
ambience = AMBIENCE_SIF
@@ -103,3 +106,7 @@
/area/submap/ChemSpill1
name = "POI - Ruptured Canister"
ambience = AMBIENCE_TECH_RUINS
+
+/area/submap/BuriedTreasure
+ name = "POI - Buried Treasure"
+ ambience = AMBIENCE_FOREBODING
diff --git a/maps/submaps/surface_submaps/wilderness/Blackshuttledown.dmm b/maps/submaps/surface_submaps/wilderness/Blackshuttledown.dmm
index 743dc84caa..2f60fca5d9 100644
--- a/maps/submaps/surface_submaps/wilderness/Blackshuttledown.dmm
+++ b/maps/submaps/surface_submaps/wilderness/Blackshuttledown.dmm
@@ -5,7 +5,7 @@
"ae" = (/obj/effect/decal/cleanable/blood,/turf/template_noop,/area/submap/Blackshuttledown)
"af" = (/obj/structure/flora/tree/sif,/turf/template_noop,/area/submap/Blackshuttledown)
"ag" = (/obj/structure/table/steel,/turf/template_noop,/area/submap/Blackshuttledown)
-"ah" = (/mob/living/simple_mob/humanoid/merc/ranged/smg/poi,/turf/template_noop,/area/submap/Blackshuttledown)
+"ah" = (/obj/random/mob/merc/all,/turf/template_noop,/area/submap/Blackshuttledown)
"ai" = (/turf/template_noop,/turf/simulated/shuttle/wall/dark{icon_state = "dark6"; name = "Unknown Shuttle"},/area/submap/Blackshuttledown)
"aj" = (/turf/simulated/shuttle/wall/dark{icon_state = "dark0"; name = "Unknown Shuttle"},/area/submap/Blackshuttledown)
"ak" = (/turf/template_noop,/turf/simulated/shuttle/wall/dark{icon_state = "dark10"; name = "Unknown Shuttle"},/area/submap/Blackshuttledown)
@@ -63,16 +63,16 @@
"bk" = (/obj/structure/table/steel,/obj/item/weapon/material/knife,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
"bl" = (/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
"bm" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
-"bn" = (/mob/living/simple_mob/humanoid/merc/ranged/smg/poi,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"bn" = (/obj/random/mob/merc/all,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
"bo" = (/obj/structure/table/steel,/obj/random/toolbox,/turf/simulated/floor/tiled/yellow,/area/submap/Blackshuttledown)
-"bp" = (/obj/structure/table/steel,/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/tiled/yellow,/area/submap/Blackshuttledown)
+"bp" = (/obj/structure/table/steel,/obj/machinery/light/small{dir = 4; pixel_y = 0},/obj/random/projectile/scrapped_gun,/obj/random/projectile/scrapped_gun,/turf/simulated/floor/tiled/yellow,/area/submap/Blackshuttledown)
"bq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/submap/Blackshuttledown)
"br" = (/obj/structure/table/steel,/obj/effect/floor_decal/borderfloor{dir = 8},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
"bs" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/effect/floor_decal/borderfloor{dir = 8},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
"bt" = (/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/effect/floor_decal/borderfloor{dir = 4},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
"bu" = (/obj/item/weapon/stool,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
"bv" = (/obj/structure/table/steel,/obj/random/projectile,/turf/simulated/floor/tiled/yellow,/area/submap/Blackshuttledown)
-"bw" = (/turf/simulated/floor/tiled/yellow,/area/submap/Blackshuttledown)
+"bw" = (/obj/machinery/fusion_fuel_compressor,/turf/simulated/floor/tiled/yellow,/area/submap/Blackshuttledown)
"bx" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/submap/Blackshuttledown)
"by" = (/obj/machinery/door/airlock/glass,/obj/effect/floor_decal/borderfloor{dir = 1},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
"bz" = (/obj/effect/floor_decal/corner/grey,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
@@ -86,7 +86,7 @@
"bH" = (/obj/machinery/power/apc{dir = 8; name = "BSD APC"; pixel_x = -24},/turf/simulated/floor/tiled/yellow,/area/submap/Blackshuttledown)
"bI" = (/mob/living/simple_mob/humanoid/merc/melee/sword/poi,/turf/simulated/floor/tiled/yellow,/area/submap/Blackshuttledown)
"bJ" = (/obj/machinery/computer/area_atmos,/obj/effect/floor_decal/borderfloor{dir = 10},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
-"bK" = (/mob/living/simple_mob/humanoid/merc/ranged/laser/poi,/turf/template_noop,/area/submap/Blackshuttledown)
+"bK" = (/obj/machinery/fusion_fuel_injector/mapped{icon_state = "injector0"; dir = 4},/turf/simulated/floor/tiled/yellow,/area/submap/Blackshuttledown)
"bL" = (/obj/effect/floor_decal/borderfloor{dir = 10},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
"bM" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 4},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
"bN" = (/obj/structure/table/steel,/obj/item/weapon/paper{info = "We need to take a short stop. The engine's are in need of minor repairs due to turbulence, should be a week's time. We've got reserve food supplies but pleanty of locale fauna to subsist on too if need be. PCRC is keeping most of there assets near New Reykjavik and locale authorities are more mindful then most to travel in this kind of weather. Our outfit should be at the rendezvous point in less then ten days assuming the upper ecehelon hasn't dropped ties with us yet."; name = "Operation Progress/M-53"},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
@@ -130,17 +130,17 @@ aaabababababababababababababadadabababafabababafababaeababadadabababaa
aaababafabadadadababababafababababababababababababababababadadabababaa
aaabababababadadadabacababababagagagagagagabababababacabafabadabababaa
aaababababababadadabafababababagahabababagabababababababababababababaa
-aaabababababababaiajajajakababagabababbKagabababafaiajajajajakabababaa
+aaabababababababaiajajajakababagabababahagabababafaiajajajajakabababaa
aaabababababababajajajajajajajajajababajajajajajajajajajajajalamababaa
aaababababafababajajajajajajanaoajapapajaqarasatauajajajajajalamababaa
aaabababababababavajajawaxajayazajaAaAajaBaCaDaEaEaEaFajajaGababababaa
aaabababababababaHajajaIaJajayaKaLaLaMajaBaNaNaEaOaDaPajaGabababababaa
aaabafababababaHajaQajawaRajayaSaTaTaUajaVaWaEaXaYaZbaajababababafabaa
aaabababababaHajbbbcajbdajajayazajajajajajajbeajajajajajbfabababababaa
-aaabababababajbgbhazajbiaLaLbhazajbjbkblbmblbnblajbobobpajbfababababaa
+aaabababababajbgbhazajbiaLaLbhazajbjbkblbmbnblblajbobobpajbfababababaa
aaabababababbqbrblazajbsblblblbtajblblbububublblajbvblblbwalamabababaa
-aaabababababbxbrblaKbybhblbzblblbAblblbBbCbCblblbDblblblbwalamabababaa
-aaabababababbxbrblaSbEbFblblblblbAblblbCbCbCblblbDblblblbwalamabababaa
+aaabababababbxbrblaKbybhblbzblblbAblblbBbCbCblblbDblblblbKalamabababaa
+aaabababababbxbrblaSbEbFblblblblbAblblbCbCbCblblbDblblblbKalamabababaa
aaabababababbGbrblazajbsblblblbtajblblbububublblajbHblblbIalamabababaa
aaabababababajbJbFcsajbLaTaTbFbMajbNbOblbPbnblblajbQbRbSajaGababababaa
aaabababababavajbTbUajbdajajayazajajajajajajbAajajajajajaGabababababaa
@@ -149,7 +149,7 @@ aaabafabababababavajajcbccajayaSaTaTcdajceblbYblbYajcfajbfabafabababaa
aaabababababababaHajajcgchajaycrajaAaAajbYblbYblbYajciajajbfababababaa
aaabababababababajajajajajajcjckajapapajbYclcmcncoajajajajalamabababaa
aaabababababababajajajajajajajajajababajajajajajajajajajajalamabababaa
-aaababafababababcpajajajcqababagbKabababagabababcpajajajajcqababababaa
+aaababafababababcpajajajcqababagahabababagabababcpajajajajcqababababaa
aaabababadabababababafababababagabababahagababafabafabababadadadababaa
aaababadadabacababababafabababagagagagagagababababacababadadadadababaa
aaabadadadabababababababaeababababababababababadadabababadadadadababaa
diff --git a/maps/submaps/surface_submaps/wilderness/Chapel.dmm b/maps/submaps/surface_submaps/wilderness/Chapel.dmm
index 02560d6ea8..a681497ed8 100644
--- a/maps/submaps/surface_submaps/wilderness/Chapel.dmm
+++ b/maps/submaps/surface_submaps/wilderness/Chapel.dmm
@@ -48,7 +48,7 @@
"aV" = (/obj/item/weapon/flame/candle/candelabra,/obj/structure/table/sifwoodentable,/turf/simulated/floor/wood/sif/broken,/area/submap/Chapel1)
"aW" = (/obj/structure/table/sifwoodentable,/obj/item/weapon/flame/candle/candelabra,/turf/simulated/floor/wood/sif,/area/submap/Chapel1)
"aX" = (/obj/structure/table/sifwoodentable,/obj/item/glass_jar,/turf/simulated/floor/wood/sif,/area/submap/Chapel1)
-"aY" = (/obj/structure/closet/coffin,/obj/random/maintenance/cargo,/obj/effect/decal/remains/human,/turf/simulated/floor/wood/sif,/area/submap/Chapel1)
+"aY" = (/obj/structure/closet/coffin,/obj/random/maintenance/cargo,/obj/effect/decal/remains/human,/obj/random/projectile/scrapped_gun,/turf/simulated/floor/wood/sif,/area/submap/Chapel1)
"aZ" = (/obj/structure/simple_door/sifwood,/turf/simulated/floor/wood/sif,/area/submap/Chapel1)
"ba" = (/obj/structure/bed/padded,/turf/simulated/floor/wood/sif,/area/submap/Chapel1)
"bb" = (/obj/structure/closet/coffin,/obj/random/cash,/obj/effect/decal/remains/xeno,/turf/simulated/floor/wood/sif,/area/submap/Chapel1)
diff --git a/maps/submaps/surface_submaps/wilderness/DoomP.dmm b/maps/submaps/surface_submaps/wilderness/DoomP.dmm
index 5dbf46a254..8c36970f98 100644
--- a/maps/submaps/surface_submaps/wilderness/DoomP.dmm
+++ b/maps/submaps/surface_submaps/wilderness/DoomP.dmm
@@ -16,7 +16,7 @@
"ap" = (/obj/effect/decal/remains/mouse,/obj/random/landmine,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP)
"aq" = (/obj/structure/flora/tree/sif,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP)
"ar" = (/obj/machinery/light/small,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP)
-"as" = (/obj/machinery/porta_turret/poi,/turf/simulated/floor/plating,/area/submap/DoomP)
+"as" = (/obj/machinery/porta_turret/poi{faction = "syndicate"},/turf/simulated/floor/plating,/area/submap/DoomP)
"at" = (/turf/simulated/wall/r_wall,/area/submap/DoomP)
"au" = (/obj/structure/sign/warning/secure_area,/turf/simulated/wall/r_wall,/area/submap/DoomP)
"av" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/submap/DoomP)
@@ -24,7 +24,7 @@
"ax" = (/obj/effect/floor_decal/borderfloor{dir = 9},/turf/simulated/floor/tiled,/area/submap/DoomP)
"ay" = (/obj/structure/bed/chair,/obj/effect/floor_decal/borderfloor{dir = 1},/turf/simulated/floor/tiled,/area/submap/DoomP)
"az" = (/obj/effect/floor_decal/borderfloor{dir = 1},/turf/simulated/floor/tiled,/area/submap/DoomP)
-"aA" = (/obj/effect/floor_decal/borderfloor{dir = 1},/mob/living/simple_mob/humanoid/merc/ranged/smg/poi,/turf/simulated/floor/tiled,/area/submap/DoomP)
+"aA" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/random/mob/merc/all,/turf/simulated/floor/tiled,/area/submap/DoomP)
"aB" = (/obj/machinery/light/small{dir = 1},/obj/effect/floor_decal/borderfloor{dir = 1},/turf/simulated/floor/tiled,/area/submap/DoomP)
"aC" = (/obj/machinery/vending/cigarette,/obj/effect/floor_decal/borderfloor{dir = 5},/turf/simulated/floor/tiled,/area/submap/DoomP)
"aD" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled,/area/submap/DoomP)
@@ -38,7 +38,7 @@
"aL" = (/obj/structure/lattice,/turf/simulated/floor/outdoors/rocks,/area/submap/DoomP)
"aM" = (/obj/structure/bed/chair{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 8},/turf/simulated/floor/tiled,/area/submap/DoomP)
"aN" = (/obj/structure/table/standard,/turf/simulated/floor/tiled,/area/submap/DoomP)
-"aO" = (/obj/structure/table/standard,/obj/item/pizzabox,/turf/simulated/floor/tiled,/area/submap/DoomP)
+"aO" = (/obj/structure/table/standard,/obj/random/pizzabox,/turf/simulated/floor/tiled,/area/submap/DoomP)
"aP" = (/turf/simulated/floor/tiled,/area/submap/DoomP)
"aQ" = (/obj/machinery/vending/snack,/obj/effect/floor_decal/borderfloor{dir = 4},/turf/simulated/floor/tiled,/area/submap/DoomP)
"aR" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/tiled/techfloor/grid,/area/submap/DoomP)
@@ -56,7 +56,7 @@
"bd" = (/obj/effect/floor_decal/borderfloor{dir = 10},/turf/simulated/floor/tiled,/area/submap/DoomP)
"be" = (/obj/effect/floor_decal/borderfloor,/turf/simulated/floor/tiled,/area/submap/DoomP)
"bf" = (/obj/machinery/light/small,/obj/effect/floor_decal/borderfloor,/turf/simulated/floor/tiled,/area/submap/DoomP)
-"bg" = (/obj/effect/floor_decal/borderfloor/corner{dir = 8},/mob/living/simple_mob/humanoid/merc/ranged/laser/poi,/turf/simulated/floor/tiled,/area/submap/DoomP)
+"bg" = (/obj/structure/table/standard,/obj/random/firstaid,/turf/simulated/floor/tiled,/area/submap/DoomP)
"bh" = (/obj/machinery/door/airlock/hatch,/turf/simulated/floor/tiled,/area/submap/DoomP)
"bi" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled,/area/submap/DoomP)
"bj" = (/obj/machinery/door/airlock/highsecurity,/turf/simulated/floor/tiled/techfloor,/area/submap/DoomP)
@@ -73,7 +73,7 @@
"bu" = (/obj/structure/table/standard,/obj/effect/floor_decal/corner/lime{dir = 5},/turf/simulated/floor/tiled/white,/area/submap/DoomP)
"bv" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/obj/effect/floor_decal/corner/lime{dir = 5},/turf/simulated/floor/tiled/white,/area/submap/DoomP)
"bw" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp,/obj/effect/floor_decal/corner/lime{dir = 5},/turf/simulated/floor/tiled/white,/area/submap/DoomP)
-"bx" = (/obj/structure/table/standard,/obj/structure/bedsheetbin,/obj/effect/floor_decal/corner/lime{dir = 1},/turf/simulated/floor/tiled/white,/area/submap/DoomP)
+"bx" = (/obj/effect/floor_decal/borderfloor,/obj/random/mob/merc/all,/turf/simulated/floor/tiled,/area/submap/DoomP)
"by" = (/turf/simulated/floor/tiled/white,/area/submap/DoomP)
"bz" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled/white,/area/submap/DoomP)
"bA" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled/white,/area/submap/DoomP)
@@ -88,6 +88,11 @@
"bJ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/submap/DoomP)
"bK" = (/obj/structure/lattice,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP)
"bL" = (/mob/living/simple_mob/humanoid/merc/melee/sword/poi,/turf/simulated/floor/tiled/techfloor,/area/submap/DoomP)
+"bM" = (/obj/effect/floor_decal/borderfloor/corner{dir = 8},/turf/simulated/floor/tiled,/area/submap/DoomP)
+"bN" = (/mob/living/bot/cleanbot{faction = "syndicate"; name = "Fitz"},/turf/simulated/floor/tiled,/area/submap/DoomP)
+"bO" = (/obj/structure/table/standard,/obj/structure/bedsheetbin,/obj/effect/floor_decal/corner/lime{dir = 1},/obj/random/soap,/turf/simulated/floor/tiled/white,/area/submap/DoomP)
+"bP" = (/obj/random/junk,/turf/simulated/floor/outdoors/rocks,/area/submap/DoomP)
+"bQ" = (/obj/random/junk,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -121,15 +126,15 @@ aaabababacafafafafafafafakakakakakafafafacadadasadadasadatauavavavauatadasadadas
aaabababacafafafafafafafakakakakakakafafacatatatatatatatatatatawatatatatatatatatatatatafafafafafakakakakafafafafacacabaa
aaabababacacafafafafafafakakakakakakafafacataxayaAayaBayazaCataDataEaFaFaFaGaHaIaJaKatafafafafafakakakakafafafafacacabaa
aaabababacacacafafafafakakakakakakakafasaLataMaNaOaNaNaNaPaQataPataRaSaSaSaTaUaVaWaVataXasafafafakakakafafafafafafacabaa
-aaabababababacacafafafakakakakakakakafafafataYaNaNaNaNaNaPaZatbaatatatatatatbbbcatatatafafafafafakakakafafafafafafacabaa
-aaababababababacafafafakakakakakakakakafafatbdbebebfbebebgaPbhaPaPbiaPaPaPaPaPbiaPaPatafafafafafakakakafafafafafafafacaa
+aaabababababacacafafafakakakakakakakafafafataYaNaNaNbgaNaPaZatbaatatatatatatbbbcatatatafafafafafakakakafafafafafafacabaa
+aaababababababacafafafakakakakakakakakafafatbdbebebfbebxbMaPbhaPbNbiaPaPaPaPaPbiaPaPatafafafafafakakakafafafafafafafacaa
aaabababagabababacafafakakakakakakakakasaXatbjatatatatatatatatatatatatatatbkatatatatataXasafafafakakakafafafafafafafacaa
-aaababababababacacafafafakakakakakakakakafatblbmbnbobpbqbrbsatbtbubvbwbvbxbybkbzbkbAatafafafafafakakakafafafafafafafacaa
+aaababababababacacafafafakakakakakakakakafatblbmbnbobpbqbrbsatbtbubvbwbvbObybkbzbkbAatafafafafafakakakafafafafafafafacaa
aaababababababacafafafafakakakakakakakakafatblblbBblbLbBblblatbCbDbDbDbDbDbEatbFatbGatafafafafakakakakakafafafafafafacaa
aaababababababacafafafafakakakakakakakakakatatatatatatatatatatatatbHbIbIbIbJatatatatatafafafafakakakakafafafafafafafacaa
-aaabababababacacafafafakakakakakakakakakakafafafafaLacacadadadadbKadadadadadbKacacafafafafafafakakakakafafafafafafafacaa
+aaabababababacacafafafakakakakakakakakakakafafafafaLacbPadadadadbKadadadadadbKacbPafafafafafafakakakakafafafafafafafacaa
aaabababababacafafafafakakakakakakakakakakakakafafasafacacacacacasadadadadadasacafafafafafafakakakakakafafafafafafacacaa
-aaababababacacafafafafakakakakakakakakakakakakakafafafafafafafacacadadadadadacacafafafafafakakakakakakafafafafafafacabaa
+aaababababacacafafafafakakakakakakakakakakakakakafafafafafafafacacadbQadadadacacafafafafafakakakakakakafafafafafafacabaa
aaababababacafafafafafafakakakakakakakakakakakakafafafafafafafafacacacacacacacafafafafafafafakakakakakafafafafafacacabaa
aaabababacacafafafafafafakakakakakakakakakakakakakafafafafafafafafafafafafafafafafafafafafafafakakakafafafafafafacababaa
aaabababacacafafafafafakakakakakakakakakakakakakakafafafafafafafafafafafafafafafafafafafafafafakakakafafafafafafacababaa
diff --git a/maps/submaps/surface_submaps/wilderness/Drugden.dmm b/maps/submaps/surface_submaps/wilderness/Drugden.dmm
index 1ff5bc62f0..ee32f04909 100644
--- a/maps/submaps/surface_submaps/wilderness/Drugden.dmm
+++ b/maps/submaps/surface_submaps/wilderness/Drugden.dmm
@@ -45,6 +45,8 @@
"S" = (/obj/item/weapon/material/shard,/turf/simulated/floor,/area/submap/Drugd)
"T" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp,/turf/simulated/floor/carpet,/area/submap/Drugd)
"U" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/syringe/drugs,/turf/simulated/floor/carpet,/area/submap/Drugd)
+"V" = (/obj/structure/closet/cabinet,/obj/random/projectile/scrapped_gun,/obj/random/toy,/turf/simulated/floor/carpet,/area/submap/Drugd)
+"W" = (/obj/structure/closet/cabinet,/obj/random/mre,/obj/random/medical/lite,/turf/simulated/floor/carpet,/area/submap/Drugd)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaa
@@ -64,9 +66,9 @@ abcccccccccdllldvwxydccba
acccccddddddzlgmoooAdccba
acccccdBCDEdllfdFGHIdccba
acccccdJKgLdlfMddddddccba
-abccccdNllOdhlgdqPwwdccca
+abccccdNllOdhlgdVPwwdccca
abbcccdlQllelllmoooodccca
-abbcccdRlSldllhdqTUndccca
+abbcccdRlSldllhdWTUndccca
abbcccddddddludddddddccca
abbccccccccccccccccccccba
abbbcccccccccccccccccccba
diff --git a/maps/submaps/surface_submaps/wilderness/FrostflyNest.dmm b/maps/submaps/surface_submaps/wilderness/FrostflyNest.dmm
new file mode 100644
index 0000000000..ccb107a33f
--- /dev/null
+++ b/maps/submaps/surface_submaps/wilderness/FrostflyNest.dmm
@@ -0,0 +1,25 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/turf/simulated/mineral/ignore_mapgen/sif,/area/submap/FrostflyNest)
+"c" = (/obj/structure/boulder,/turf/simulated/mineral/floor/ignore_mapgen/sif,/area/submap/FrostflyNest)
+"d" = (/turf/simulated/wall/solidrock,/area/submap/FrostflyNest)
+"e" = (/turf/simulated/mineral/floor/ignore_mapgen/sif,/area/submap/FrostflyNest)
+"f" = (/obj/structure/outcrop/diamond,/turf/simulated/mineral/floor/ignore_mapgen/sif,/area/submap/FrostflyNest)
+"g" = (/obj/random/humanoidremains,/turf/simulated/mineral/floor/ignore_mapgen/sif,/area/submap/FrostflyNest)
+"h" = (/obj/structure/prop/nest{color = "#041164"; creature_types = list(/mob/living/simple_mob/animal/sif/frostfly); name = "frostfly den"; spawn_delay = 300},/turf/simulated/mineral/floor/ignore_mapgen/sif,/area/submap/FrostflyNest)
+"i" = (/obj/random/medical/lite,/turf/simulated/mineral/floor/ignore_mapgen/sif,/area/submap/FrostflyNest)
+"j" = (/obj/random/humanoidremains,/obj/random/gun/random,/turf/simulated/mineral/floor/ignore_mapgen/sif,/area/submap/FrostflyNest)
+"k" = (/obj/random/medical/pillbottle,/turf/simulated/mineral/floor/ignore_mapgen/sif,/area/submap/FrostflyNest)
+"l" = (/obj/random/gun/random,/turf/simulated/mineral/floor/ignore_mapgen/sif,/area/submap/FrostflyNest)
+
+(1,1,1) = {"
+aabbbcbbaa
+abbddedbba
+bbddfgddbb
+bddhieiddb
+bdfjefefdb
+bdkeegeddb
+ceefefldbb
+bdddgdddba
+bbbdddbbba
+abbbbbbaaa
+"}
diff --git a/maps/submaps/surface_submaps/wilderness/Shack1.dmm b/maps/submaps/surface_submaps/wilderness/Shack1.dmm
index cc70345858..604b970b92 100644
--- a/maps/submaps/surface_submaps/wilderness/Shack1.dmm
+++ b/maps/submaps/surface_submaps/wilderness/Shack1.dmm
@@ -2,21 +2,21 @@
"b" = (/turf/simulated/wall/log_sif,/area/submap/Shack1)
"c" = (/turf/template_noop,/area/submap/Shack1)
"d" = (/turf/simulated/floor/outdoors/dirt,/area/submap/Shack1)
-"e" = (/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/holofloor/wood{ icon_state = "wood_broken1"},/area/submap/Shack1)
+"e" = (/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/holofloor/wood{icon_state = "wood_broken1"},/area/submap/Shack1)
"f" = (/obj/structure/table/wooden_reinforced,/obj/item/weapon/storage/fancy/candle_box,/obj/item/weapon/storage/box/matches,/turf/simulated/floor/wood,/area/submap/Shack1)
-"g" = (/obj/structure/closet/cabinet,/obj/item/clothing/suit/storage/apron/overalls,/obj/item/clothing/under/overalls,/turf/simulated/floor/wood,/area/submap/Shack1)
+"g" = (/obj/structure/closet/cabinet,/obj/item/clothing/suit/storage/apron/overalls,/obj/item/clothing/under/overalls,/obj/random/mre,/turf/simulated/floor/wood,/area/submap/Shack1)
"h" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/wood,/area/submap/Shack1)
"i" = (/turf/simulated/floor/wood,/area/submap/Shack1)
-"j" = (/turf/simulated/floor/holofloor/wood{ icon_state = "wood_broken0"},/area/submap/Shack1)
-"k" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/holofloor/wood{ icon_state = "wood_broken5"},/area/submap/Shack1)
+"j" = (/turf/simulated/floor/holofloor/wood{icon_state = "wood_broken0"},/area/submap/Shack1)
+"k" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/holofloor/wood{icon_state = "wood_broken5"},/area/submap/Shack1)
"l" = (/obj/structure/flora/tree/sif,/turf/template_noop,/area/submap/Shack1)
"m" = (/obj/structure/simple_door/wood,/turf/simulated/floor/wood,/area/submap/Shack1)
-"n" = (/turf/simulated/floor/holofloor/wood{ icon_state = "wood_broken3"},/area/submap/Shack1)
+"n" = (/turf/simulated/floor/holofloor/wood{icon_state = "wood_broken3"},/area/submap/Shack1)
"o" = (/obj/structure/table/bench/wooden,/turf/simulated/floor/wood,/area/submap/Shack1)
"p" = (/obj/effect/decal/cleanable/dirt,/obj/structure/table/wooden_reinforced,/obj/item/weapon/storage/toolbox,/turf/simulated/floor/wood,/area/submap/Shack1)
"q" = (/obj/effect/decal/cleanable/dirt,/obj/structure/table/wooden_reinforced,/obj/item/weapon/material/twohanded/fireaxe/scythe,/turf/simulated/floor/wood,/area/submap/Shack1)
"r" = (/obj/effect/decal/cleanable/spiderling_remains,/turf/simulated/floor/wood,/area/submap/Shack1)
-"s" = (/turf/simulated/floor/holofloor/wood{ icon_state = "wood_broken6"},/area/submap/Shack1)
+"s" = (/turf/simulated/floor/holofloor/wood{icon_state = "wood_broken6"},/area/submap/Shack1)
"t" = (/obj/effect/decal/cleanable/dirt,/obj/structure/table/wooden_reinforced,/obj/item/device/flashlight/lamp,/turf/simulated/floor/wood,/area/submap/Shack1)
"u" = (/obj/structure/flora/tree/dead,/turf/template_noop,/area/submap/Shack1)
diff --git a/maps/submaps/surface_submaps/wilderness/Shelter.dmm b/maps/submaps/surface_submaps/wilderness/Shelter.dmm
index e041c8a549..3b985d359b 100644
--- a/maps/submaps/surface_submaps/wilderness/Shelter.dmm
+++ b/maps/submaps/surface_submaps/wilderness/Shelter.dmm
@@ -9,7 +9,7 @@
"i" = (/turf/simulated/floor/outdoors/rocks/caves,/area/submap/Shelter1)
"j" = (/obj/structure/bonfire/sifwood,/turf/simulated/floor/outdoors/rocks/caves,/area/submap/Shelter1)
"k" = (/obj/random/mob/robotic,/turf/simulated/floor/outdoors/rocks/caves,/area/submap/Shelter1)
-"l" = (/obj/structure/bed/roller/adv,/obj/random/humanoidremains,/obj/random/cash,/obj/random/cigarettes,/obj/item/clothing/under/explorer,/obj/item/clothing/shoes/boots/winter/explorer,/obj/item/clothing/mask/gas/explorer,/obj/item/clothing/accessory/permit/gun/planetside,/obj/item/clothing/suit/armor/pcarrier/light/nt,/turf/simulated/floor/outdoors/rocks/caves,/area/submap/Shelter1)
+"l" = (/obj/structure/bed/roller/adv,/obj/random/humanoidremains,/obj/random/cash,/obj/random/cigarettes,/obj/item/clothing/under/explorer,/obj/item/clothing/shoes/boots/winter/explorer,/obj/item/clothing/mask/gas/explorer,/obj/item/clothing/accessory/permit/gun/planetside,/obj/item/clothing/suit/armor/pcarrier/light/nt,/obj/random/projectile/scrapped_smg,/obj/random/projectile/scrapped_pistol,/turf/simulated/floor/outdoors/rocks/caves,/area/submap/Shelter1)
"m" = (/obj/random/medical/lite,/obj/random/technology_scanner,/obj/random/toolbox,/obj/random/trash,/turf/simulated/floor/outdoors/rocks/caves,/area/submap/Shelter1)
"n" = (/obj/structure/fence/corner{icon_state = "corner"; dir = 1},/turf/simulated/floor/outdoors/snow,/area/submap/Shelter1)
"o" = (/obj/structure/fence/door/locked{icon_state = "door_closed"; dir = 1},/turf/simulated/floor/outdoors/snow,/area/submap/Shelter1)
diff --git a/maps/submaps/surface_submaps/wilderness/kururakden.dmm b/maps/submaps/surface_submaps/wilderness/kururakden.dmm
new file mode 100644
index 0000000000..630c58204d
--- /dev/null
+++ b/maps/submaps/surface_submaps/wilderness/kururakden.dmm
@@ -0,0 +1,23 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/turf/simulated/mineral/ignore_mapgen,/area/submap/KururakDen)
+"c" = (/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/KururakDen)
+"d" = (/obj/random/mob/sif/kururak,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/KururakDen)
+"e" = (/mob/living/simple_mob/animal/sif/kururak/leader,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/KururakDen)
+"f" = (/obj/random/outcrop,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/KururakDen)
+"g" = (/obj/random/junk,/obj/random/medical/pillbottle,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/KururakDen)
+"h" = (/obj/random/junk,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/KururakDen)
+"i" = (/obj/random/powercell,/obj/random/unidentified_medicine/old_medicine,/obj/random/trash,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/KururakDen)
+"j" = (/obj/random/humanoidremains,/obj/random/coin,/obj/random/contraband,/obj/random/projectile/random,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/KururakDen)
+
+(1,1,1) = {"
+aaaaaaaaaa
+aaaaabbaaa
+aaabbbbbaa
+aabbbfbbaa
+aacbgdccaa
+abhdccibaa
+abfcefbbaa
+abbdjbbaaa
+abbbbbbaaa
+aaaaaaaaaa
+"}
diff --git a/maps/submaps/surface_submaps/wilderness/wilderness.dm b/maps/submaps/surface_submaps/wilderness/wilderness.dm
index 7d084f4a85..af854a0017 100644
--- a/maps/submaps/surface_submaps/wilderness/wilderness.dm
+++ b/maps/submaps/surface_submaps/wilderness/wilderness.dm
@@ -22,6 +22,7 @@
#include "Rockybase.dmm"
#include "MHR.dmm"
#include "GovPatrol.dmm"
+#include "kururakden.dmm"
#include "DecoupledEngine.dmm"
#include "DoomP.dmm"
#include "CaveS.dmm"
@@ -202,6 +203,12 @@
mappath = 'maps/submaps/surface_submaps/wilderness/GovPatrol.dmm'
cost = 5
+/datum/map_template/surface/wilderness/normal/KururakDen
+ name = "Kururak Den"
+ desc = "The den of a Kururak pack. May contain hibernating members."
+ mappath = 'maps/submaps/surface_submaps/wilderness/kururakden.dmm'
+ cost = 5
+
/datum/map_template/surface/wilderness/normal/DecoupledEngine
name = "Decoupled Engine"
desc = "A damaged fission engine jettisoned from a starship long ago."
@@ -272,4 +279,10 @@
name = "Acrid Lake"
desc = "A pool of water contaminated with highly dangerous chemicals."
mappath = 'maps/submaps/surface_submaps/wilderness/chemspill2.dmm'
- cost = 10
\ No newline at end of file
+ cost = 10
+
+/datum/map_template/surface/wilderness/normal/FrostflyNest
+ name = "Frostfly Nest"
+ desc = "The nest of a Frostfly, or more."
+ mappath = 'maps/submaps/surface_submaps/wilderness/FrostflyNest.dmm'
+ cost = 20
diff --git a/maps/submaps/surface_submaps/wilderness/wilderness_areas.dm b/maps/submaps/surface_submaps/wilderness/wilderness_areas.dm
index 185ddd433f..4f41a473f8 100644
--- a/maps/submaps/surface_submaps/wilderness/wilderness_areas.dm
+++ b/maps/submaps/surface_submaps/wilderness/wilderness_areas.dm
@@ -95,6 +95,10 @@
name = "POI - Lost Government Patrol"
ambience = AMBIENCE_GHOSTLY
+/area/submap/KururakDen
+ name = "POI - Kururak Den"
+ ambience = AMBIENCE_SIF
+
/area/submap/DecoupledEngine
name = "POI - Decoupled Engine"
ambience = AMBIENCE_FOREBODING
@@ -138,3 +142,7 @@
/area/submap/ChemSpill2
name = "POI - Acrid Lake"
ambience = AMBIENCE_FOREBODING
+
+/area/submap/FrostflyNest
+ name = "POI - Frostfly Nest"
+ ambience = AMBIENCE_SIF
diff --git a/polaris.dme b/polaris.dme
index c06f3cfae1..0f9ddb126e 100644
--- a/polaris.dme
+++ b/polaris.dme
@@ -1168,7 +1168,6 @@
#include "code\game\objects\structures\fence.dm"
#include "code\game\objects\structures\fireaxe.dm"
#include "code\game\objects\structures\fitness.dm"
-#include "code\game\objects\structures\flora.dm"
#include "code\game\objects\structures\girders.dm"
#include "code\game\objects\structures\gravemarker.dm"
#include "code\game\objects\structures\grille.dm"
@@ -1228,6 +1227,7 @@
#include "code\game\objects\structures\crates_lockers\closets\secure\scientist.dm"
#include "code\game\objects\structures\crates_lockers\closets\secure\secure_closets.dm"
#include "code\game\objects\structures\crates_lockers\closets\secure\security.dm"
+#include "code\game\objects\structures\flora\flora.dm"
#include "code\game\objects\structures\flora\grass.dm"
#include "code\game\objects\structures\flora\trees.dm"
#include "code\game\objects\structures\ghost_pods\ghost_pods.dm"
@@ -1638,6 +1638,7 @@
#include "code\modules\clothing\under\accessories\permits.dm"
#include "code\modules\clothing\under\accessories\storage.dm"
#include "code\modules\clothing\under\accessories\torch.dm"
+#include "code\modules\clothing\under\accessories\temperature\poncho.dm"
#include "code\modules\clothing\under\jobs\civilian.dm"
#include "code\modules\clothing\under\jobs\engineering.dm"
#include "code\modules\clothing\under\jobs\medsci.dm"
@@ -2204,10 +2205,12 @@
#include "code\modules\mob\living\simple_mob\combat.dm"
#include "code\modules\mob\living\simple_mob\defense.dm"
#include "code\modules\mob\living\simple_mob\hands.dm"
+#include "code\modules\mob\living\simple_mob\harvesting.dm"
#include "code\modules\mob\living\simple_mob\life.dm"
#include "code\modules\mob\living\simple_mob\on_click.dm"
#include "code\modules\mob\living\simple_mob\simple_hud.dm"
#include "code\modules\mob\living\simple_mob\simple_mob.dm"
+#include "code\modules\mob\living\simple_mob\taming.dm"
#include "code\modules\mob\living\simple_mob\subtypes\animal\animal.dm"
#include "code\modules\mob\living\simple_mob\subtypes\animal\borer\borer.dm"
#include "code\modules\mob\living\simple_mob\subtypes\animal\borer\borer_captive.dm"
@@ -2264,10 +2267,11 @@
#include "code\modules\mob\living\simple_mob\subtypes\humanoid\russian.dm"
#include "code\modules\mob\living\simple_mob\subtypes\humanoid\mercs\mercs.dm"
#include "code\modules\mob\living\simple_mob\subtypes\illusion\illusion.dm"
-#include "code\modules\mob\living\simple_mob\subtypes\mechanical\combat_drone.dm"
#include "code\modules\mob\living\simple_mob\subtypes\mechanical\golem.dm"
#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mechanical.dm"
#include "code\modules\mob\living\simple_mob\subtypes\mechanical\viscerator.dm"
+#include "code\modules\mob\living\simple_mob\subtypes\mechanical\drones\combat_drone.dm"
+#include "code\modules\mob\living\simple_mob\subtypes\mechanical\drones\mining_drone.dm"
#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\hivebot.dm"
#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\ranged_damage.dm"
#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\support.dm"
@@ -2545,6 +2549,7 @@
#include "code\modules\power\tesla\telsa_construction.dm"
#include "code\modules\power\tesla\tesla_act.dm"
#include "code\modules\projectiles\ammunition.dm"
+#include "code\modules\projectiles\broken.dm"
#include "code\modules\projectiles\dnalocking.dm"
#include "code\modules\projectiles\gun.dm"
#include "code\modules\projectiles\projectile.dm"
@@ -2552,6 +2557,10 @@
#include "code\modules\projectiles\ammunition\magnetic.dm"
#include "code\modules\projectiles\ammunition\rounds.dm"
#include "code\modules\projectiles\ammunition\smartmag.dm"
+#include "code\modules\projectiles\brokenguns\energy.dm"
+#include "code\modules\projectiles\brokenguns\launcher.dm"
+#include "code\modules\projectiles\brokenguns\magnetic.dm"
+#include "code\modules\projectiles\brokenguns\projectile.dm"
#include "code\modules\projectiles\guns\energy.dm"
#include "code\modules\projectiles\guns\launcher.dm"
#include "code\modules\projectiles\guns\modular_guns.dm"
@@ -2847,6 +2856,8 @@
#include "code\modules\xenoarcheaology\artifacts\crystal.dm"
#include "code\modules\xenoarcheaology\artifacts\gigadrill.dm"
#include "code\modules\xenoarcheaology\artifacts\replicator.dm"
+#include "code\modules\xenoarcheaology\artifacts\predefined\_predefined.dm"
+#include "code\modules\xenoarcheaology\artifacts\predefined\hungry_statue.dm"
#include "code\modules\xenoarcheaology\effects\animate_anomaly.dm"
#include "code\modules\xenoarcheaology\effects\badfeeling.dm"
#include "code\modules\xenoarcheaology\effects\berserk.dm"