Files
Bubberstation/code/game/objects/structures/flora.dm
Koi a32700854b New Icebox Ruin - Hunters Lodge (#86927)
## About The Pull Request

Adds a new icebox ruin. Below you can see some good pictures of it.

A unique creature that can be found a "hatsune mi-go", a m1911 with a
magazine, santa outfit w/ bag, and a jukebox. this is actually something
I had planned for a torment nexus but chose to forego for an Icebox ruin
instead. The map is 35x35.


![image](https://github.com/user-attachments/assets/424f196e-0ad8-4ac1-8940-c537c7490305)


![image](https://github.com/user-attachments/assets/20efcc7a-2b9d-40c6-b666-ac4ea8d65efe)


## Why It's Good For The Game

Icebox is in need of some ruins, I was originally working on this for
something else but decided to instead add it as a ruin in icebox. I
added a subtype of the christmas tree that doesn't give presents. I felt
like icebox lacked more dangerous ruins so I sprinkled in a few enemies
and as a reward there is some notable stuff.

## Changelog
:cl:ViralMilk22

map: Additional Icebox Ruin has been added "Hunters Lodge".
/🆑
2024-11-11 00:43:39 -08:00

1129 lines
32 KiB
Plaintext

/obj/structure/flora
name = "flora"
desc = "Some sort of plant."
resistance_flags = FLAMMABLE
max_integrity = 100
anchored = TRUE
drag_slowdown = 1.3
/// If set, the flora will have this as its name after being harvested. When the flora becomes harvestable again, it reverts to its initial(name)
var/harvested_name
/// If set, the flora will have this as its description after being harvested. When the flora becomes harvestable again, it regerts to its initial(desc)
var/harvested_desc
/// A lazylist of products that could be created when harvesting this flora, syntax is (type = weight)
/// Because of how this works, it can spawn in anomalies if you want it to. Or wall girders
var/product_types
/// If the user is able to harvest this with their hands
var/harvest_with_hands = FALSE
/// The "verb" to use when the user harvests the flora
var/harvest_verb = "harvest"
/// What should be added to harvest_verb depending on the context ("user harvest(s) the tree" / "user chop(s down) the tree")
var/harvest_verb_suffix = "s"
/// If the user is allowed to uproot the flora
var/can_uproot = TRUE
var/uprooted = FALSE
var/previous_rotation = 0
/// If false, the flora won't be able to be harvested at all. If it's true, go through checks normally to determine if the flora is able to be harvested
var/harvestable = TRUE
/// The low end of how many product_type items you get
var/harvest_amount_low = 1
/// The high end of how many product_type items you get
var/harvest_amount_high = 3
//Messages to show to the user depending on how many items they get when harvesting the flora
var/harvest_message_low
var/harvest_message_med
var/harvest_message_high
/// See proc/harvest() and where this is used for an explaination on how this works
var/harvest_message_true_thresholds = FALSE
/// How long it takes to harvest the flora with the correct tool
var/harvest_time = 6 SECONDS
var/delete_on_harvest = FALSE
var/harvested = FALSE
/// Variables for determining the low/high ends of how long it takes for the flora takes to grow.
var/regrowth_time_low = 8 MINUTES
/// Stops the flora from regrowing if this is set to 0
var/regrowth_time_high = 16 MINUTES
/// Flags for the flora to determine what kind of sound to play when it gets hit
var/flora_flags = NONE
//BUBBER EDIT START - MOVED TO MODULAR
/*
/obj/structure/flora/attackby(obj/item/used_item, mob/living/user, params)
if(user.combat_mode)
return ..()
if(flags_1 & HOLOGRAM_1)
balloon_alert(user, "it goes right through!")
return ..()
if(can_uproot && used_item.tool_behaviour == TOOL_SHOVEL)
if(uprooted)
user.visible_message(span_notice("[user] starts to replant [src]..."),
span_notice("You start to replant [src]..."))
else
user.visible_message(span_notice("[user] starts to uproot [src]..."),
span_notice("You start to uproot [src]..."))
used_item.play_tool_sound(src, 50)
if(!do_after(user, harvest_time, src))
return
if(uprooted)
user.visible_message(span_notice("[user] replants [src]."),
span_notice("You replant [src]."))
replant(user)
else
user.visible_message(span_notice("[user] uproots [src]."),
span_notice("You uproot [src]."))
uproot(user)
used_item.play_tool_sound(src, 50)
return
if(!can_harvest(user, used_item))
return ..()
user.visible_message(span_notice("[user] starts to [harvest_verb] [src]..."),
span_notice("You start to [harvest_verb] [src] with [used_item]..."))
play_attack_sound(used_item.force)
if(!do_after(user, harvest_time * used_item.toolspeed, src))
return
visible_message(span_notice("[user] [harvest_verb][harvest_verb_suffix] [src]."),
ignored_mobs = list(user))
play_attack_sound(used_item.force)
if(harvest(user))
after_harvest(user)
*/
//BUBBER EDIT END
/obj/structure/flora/attack_hand(mob/user, list/modifiers)
. = ..()
if(.)
return
if(!can_harvest(user))
return
user.visible_message(span_notice("[user] starts to [harvest_verb] [src]..."),
span_notice("You start to [harvest_verb] [src]..."))
play_attack_sound()
if(!do_after(user, harvest_time, src))
return
visible_message(span_notice("[user] [harvest_verb][harvest_verb_suffix] [src]."),
ignored_mobs = list(user))
play_attack_sound()
if(harvest(user))
after_harvest(user)
/obj/structure/flora/run_atom_armor(damage_amount, damage_type, damage_flag = 0, attack_dir)
if(damage_flag == MELEE)
if(damage_type == BURN)
damage_amount *= 4
return ..()
/obj/structure/flora/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
var/use_default_sound = TRUE //Because I don't wanna do unnecessary bitflag checks in a single if statement, while also allowing for multiple sounds to be played
if(flora_flags & FLORA_HERBAL)
playsound(src, SFX_CRUNCHY_BUSH_WHACK, 50, vary = FALSE)
use_default_sound = FALSE
if(flora_flags & FLORA_WOODEN)
playsound(src, SFX_TREE_CHOP, 50, vary = FALSE)
use_default_sound = FALSE
if(flora_flags & FLORA_STONE)
playsound(src, SFX_ROCK_TAP, 50, vary = FALSE)
use_default_sound = FALSE
if(use_default_sound)
return ..()
/*
* A helper proc for getting a random amount of products, associated with the flora's product list.
* Returns: A list where each value is (product_type = amount_of_products)
*/
/obj/structure/flora/proc/get_products_list()
if(!LAZYLEN(product_types))
return list()
var/list/product_list = list()
var/harvest_amount = rand(harvest_amount_low, harvest_amount_high)
for(var/iteration in 1 to harvest_amount)
var/chosen_product = pick_weight(product_types)
if(!product_list[chosen_product])
product_list[chosen_product] = 0
product_list[chosen_product]++
return product_list
/*
* A helper proc that determines if a user can currently harvest this flora with whatever tool they're trying to use.
* Returns: TRUE if they can harvest, FALSE if not. Null if it's not harvestable at all.
*/
/obj/structure/flora/proc/can_harvest(mob/user, obj/item/harvesting_item)
if(flags_1 & HOLOGRAM_1)
return FALSE
if(harvested || !harvestable)
return null
if(harvesting_item)
//Check to see if wooden flora is being attacked by a saw item (letting the items on/off state control this is better than putting them in the list)
if((flora_flags & FLORA_WOODEN) && (harvesting_item.tool_behaviour == TOOL_SAW))
return TRUE
//Check to see if stone flora is being attacked by a mining item (same reason as above)
if((flora_flags & FLORA_STONE) && (harvesting_item.tool_behaviour == TOOL_MINING))
return TRUE
//We checked all item interactions and could not harvest, lets return
return FALSE
//If there was no harvesting item supplied, check if it is hand harvestable
if(harvest_with_hands)
return TRUE
return FALSE
/*
* This gets called after a mob tries to harvest this flora with the correct tool.
* It displays a flavor message to whoever's harvesting this flora, then creates new products depending on the flora's product list.
* Also renames the flora if harvested_name or harvested_desc is set in the variables
* Returns: FALSE if nothing was made, otherwise a list of created products
*/
/obj/structure/flora/proc/harvest(user, product_amount_multiplier = 1)
. = FALSE
if(harvested && !LAZYLEN(product_types))
return FALSE
var/list/products_to_create = get_products_list()
if(!products_to_create.len)
return FALSE
var/products_created = 0
var/turf/turf_below = get_turf(src)
//This loop creates new products on the turf of our flora, but checks if it's an item stack
//If it *is* an item stack, we don't want to go through 50 different iterations of a new object where it just gets qdeleted after the first
. = list()
for(var/product in products_to_create)
var/amount_to_create = round(products_to_create[product]*product_amount_multiplier, 1)
products_created += amount_to_create
if(ispath(product, /obj/item/stack))
var/product_left = amount_to_create
while(product_left > 0)
var/obj/item/stack/new_stack = new product(turf_below)
product_left -= new_stack.amount = min(product_left, new_stack.max_amount)
. += new_stack
else
for(var/iteration in 1 to amount_to_create)
. += new product(turf_below)
//This bit of code determines what should be shown to the user when this is harvested
var/message = harvest_message_med || harvest_message_high || harvest_message_low
if(user && message)
if(harvest_message_true_thresholds) //Old method of how the harvest messages worked. Useful depending on the context you want to implement
if(products_created == harvest_amount_low && harvest_message_low)
message = harvest_message_low
if(products_created == harvest_amount_high && harvest_message_high)
message = harvest_message_high
else //New method of determining the message to display. Separates the messages into 3 different viable "regions"
//[ ][ ][ ] the default message depends on whether or not something's nulled out
var/comparison = products_created - harvest_amount_low //avoiding unnecessary math
var/middle_value = round((harvest_amount_high - harvest_amount_low)/2) + harvest_amount_low //mathy shit, gets the middle between two values
//[***][ ][ ]
if(comparison < (middle_value - harvest_amount_low)/2 && harvest_message_low) //more mathy shit, gets the middle between middle_value and harvest_amount_low
message = harvest_message_low
//[ ][ ][***]
if(comparison > (harvest_amount_high - middle_value)/2 && harvest_message_high) //the middle between middle_value and harvest_amount_high
message = harvest_message_high
//[ ][***][ ] use the default message if none of the above applies
to_chat(user, span_notice(message))
if(harvested_name)
name = harvested_name
if(harvested_desc)
desc = harvested_desc
harvested = TRUE
if(!delete_on_harvest && regrowth_time_high > 0)
addtimer(CALLBACK(src, PROC_REF(regrow)), rand(regrowth_time_low, regrowth_time_high))
/obj/structure/flora/proc/after_harvest(user)
if(delete_on_harvest)
qdel(src)
/obj/structure/flora/proc/regrow()
name = initial(name)
desc = initial(desc)
harvested = FALSE
/*
* Called after the user uproots the flora with a shovel.
*/
/obj/structure/flora/proc/uproot(mob/living/user)
anchored = FALSE
uprooted = TRUE
var/matrix/M = matrix(transform)
previous_rotation = pick(-90, 90)
transform = M.Turn(previous_rotation)
/*
* Called after the user plants the flora back into the ground after uprooted
*/
/obj/structure/flora/proc/replant(mob/living/user)
anchored = initial(anchored)
uprooted = FALSE
var/matrix/M = matrix(transform)
transform = M.Turn(-previous_rotation)
/obj/structure/flora/atom_deconstruct(disassembled = TRUE)
if(harvested)
return ..()
harvest(product_amount_multiplier = 0.6)
/*********
* Trees *
*********/
//Can *you* speak their language?
/obj/structure/flora/tree
name = "tree"
desc = "A large tree."
density = TRUE
max_integrity = 150
pixel_x = -16
layer = FLY_LAYER
plane = ABOVE_GAME_PLANE
drag_slowdown = 1.5
product_types = list(/obj/item/grown/log/tree = 1)
harvest_amount_low = 6
harvest_amount_high = 10
harvest_message_low = "You manage to gather a few logs from the tree."
harvest_message_med = "You manage to gather some logs from the tree."
harvest_message_high = "You manage to get most of the wood from the tree."
harvest_verb = "chop"
harvest_verb_suffix = "s down"
delete_on_harvest = TRUE
flora_flags = FLORA_HERBAL | FLORA_WOODEN
/obj/structure/flora/tree/Initialize(mapload)
. = ..()
AddComponent(/datum/component/seethrough, get_seethrough_map())
///Return a see_through_map, examples in seethrough.dm
/obj/structure/flora/tree/proc/get_seethrough_map()
return SEE_THROUGH_MAP_DEFAULT
/obj/structure/flora/tree/harvest(mob/living/user, product_amount_multiplier)
. = ..()
var/turf/my_turf = get_turf(src)
playsound(my_turf, 'sound/effects/meteorimpact.ogg', 100 , FALSE, FALSE)
var/obj/structure/flora/tree/stump/new_stump = new(my_turf)
new_stump.name = "[name] stump"
/obj/structure/flora/tree/uproot(mob/living/user)
..()
playsound(get_turf(src), 'sound/effects/meteorimpact.ogg', 100 , FALSE, FALSE)
/obj/structure/flora/tree/stump
name = "stump"
desc = "This represents our promise to the crew, and the station itself, to cut down as many trees as possible." //running naked through the trees
icon = 'icons/obj/fluff/flora/pinetrees.dmi'
icon_state = "tree_stump"
density = FALSE
delete_on_harvest = TRUE
/obj/structure/flora/tree/stump/harvest(mob/living/user, product_amount_multiplier)
to_chat(user, span_notice("You manage to remove [src]."))
qdel(src)
/obj/structure/flora/tree/stump/uproot(mob/living/user)
..()
to_chat(user, span_notice("You manage to remove [src]."))
qdel(src)
/obj/structure/flora/tree/dead
icon = 'icons/obj/fluff/flora/deadtrees.dmi'
desc = "A dead tree. How it died, you know not."
icon_state = "tree_1"
harvest_amount_low = 2
harvest_amount_high = 6
flora_flags = FLORA_WOODEN
/obj/structure/flora/tree/dead/style_2
icon_state = "tree_2"
/obj/structure/flora/tree/dead/style_3
icon_state = "tree_3"
/obj/structure/flora/tree/dead/style_4
icon_state = "tree_4"
/obj/structure/flora/tree/dead/style_5
icon_state = "tree_5"
/obj/structure/flora/tree/dead/style_6
icon_state = "tree_6"
/obj/structure/flora/tree/dead/style_random/Initialize(mapload)
. = ..()
icon_state = "tree_[rand(1, 6)]"
update_appearance()
/obj/structure/flora/tree/jungle
desc = "It's seriously hampering your view of the jungle."
icon = 'icons/obj/fluff/flora/jungletrees.dmi'
icon_state = "tree1"
pixel_x = -48
pixel_y = -20
/obj/structure/flora/tree/jungle/get_seethrough_map()
return SEE_THROUGH_MAP_THREE_X_THREE
/obj/structure/flora/tree/jungle/style_2
icon_state = "tree2"
/obj/structure/flora/tree/jungle/style_3
icon_state = "tree3"
/obj/structure/flora/tree/jungle/style_4
icon_state = "tree4"
/obj/structure/flora/tree/jungle/style_5
icon_state = "tree5"
/obj/structure/flora/tree/jungle/style_6
icon_state = "tree6"
/obj/structure/flora/tree/jungle/style_random/Initialize(mapload)
. = ..()
icon_state = "tree[rand(1, 6)]"
update_appearance()
/obj/structure/flora/tree/jungle/small
pixel_y = 0
pixel_x = -32
icon = 'icons/obj/fluff/flora/jungletreesmall.dmi'
icon_state = "tree1"
/obj/structure/flora/tree/jungle/small/get_seethrough_map()
return SEE_THROUGH_MAP_THREE_X_TWO
/obj/structure/flora/tree/jungle/small/style_2
icon_state = "tree2"
/obj/structure/flora/tree/jungle/small/style_3
icon_state = "tree3"
/obj/structure/flora/tree/jungle/small/style_4
icon_state = "tree4"
/obj/structure/flora/tree/jungle/small/style_5
icon_state = "tree5"
/obj/structure/flora/tree/jungle/small/style_6
icon_state = "tree6"
/obj/structure/flora/tree/jungle/small/style_random/Initialize(mapload)
. = ..()
icon_state = "tree[rand(1, 6)]"
update_appearance()
/**************
* Pine Trees *
**************/
/obj/structure/flora/tree/pine
name = "pine tree"
desc = "A coniferous pine tree."
icon = 'icons/obj/fluff/flora/pinetrees.dmi'
icon_state = "pine_1"
/obj/structure/flora/tree/pine/get_seethrough_map()
return SEE_THROUGH_MAP_DEFAULT_TWO_TALL
/obj/structure/flora/tree/pine/style_2
icon_state = "pine_2"
/obj/structure/flora/tree/pine/style_3
icon_state = "pine_3"
/obj/structure/flora/tree/pine/style_random/Initialize(mapload)
. = ..()
icon_state = "pine_[rand(1,3)]"
update_appearance()
/obj/structure/flora/tree/pine/xmas
name = "xmas tree"
desc = "A wondrous decorated Christmas tree."
icon_state = "pine_c"
/obj/structure/flora/tree/pine/xmas/presentless
icon_state = "pinepresents"
desc = "A wondrous decorated Christmas tree. It has presents, though none of them seem to have your name on them."
/obj/structure/flora/tree/pine/xmas/presents
icon_state = "pinepresents"
desc = "A wondrous decorated Christmas tree. It has presents!"
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF //protected by the christmas spirit
var/gift_type = /obj/item/gift/anything
var/unlimited = FALSE
var/static/list/took_presents //shared between all xmas trees
/obj/structure/flora/tree/pine/xmas/presents/Initialize(mapload)
. = ..()
if(!took_presents)
took_presents = list()
/obj/structure/flora/tree/pine/xmas/presents/attack_hand(mob/living/user, list/modifiers)
. = ..()
if(.)
return
if(!user.ckey)
return
if(took_presents[user.ckey] && !unlimited)
to_chat(user, span_warning("There are no presents with your name on."))
return
to_chat(user, span_warning("After a bit of rummaging, you locate a gift with your name on it!"))
if(!unlimited)
took_presents[user.ckey] = TRUE
var/obj/item/G = new gift_type(src)
user.put_in_hands(G)
/obj/structure/flora/tree/pine/xmas/presents/unlimited
desc = "A wonderous decorated Christmas tree. It has a seemly endless supply of presents!"
unlimited = TRUE
/obj/structure/festivus
name = "festivus pole"
desc = "During last year's Feats of Strength the Research Director was able to suplex this passing immobile rod into a planter."
icon = 'icons/obj/fluff/flora/pinetrees.dmi'
icon_state = "festivus_pole"
/obj/structure/festivus/anchored
name = "suplexed rod"
desc = "A true feat of strength, almost as good as last year."
icon_state = "anchored_rod"
anchored = TRUE
/**************
* Palm Trees *
**************/
/obj/structure/flora/coconuts
gender = PLURAL
name = "coconuts"
icon = 'icons/obj/fluff/beach.dmi'
icon_state = "coconuts"
/obj/structure/flora/tree/palm
name = "palm tree"
desc = "A tree straight from the tropics."
icon = 'icons/obj/fluff/beach2.dmi'
icon_state = "palm1"
pixel_x = 0
/obj/structure/flora/tree/palm/style_2
icon_state = "palm2"
/obj/structure/flora/tree/palm/style_random/Initialize(mapload)
. = ..()
icon_state = "palm[rand(1,2)]"
update_appearance()
/*********
* Grass *
*********/
/obj/structure/flora/grass
name = "grass"
desc = "A patch of overgrown grass."
icon = 'icons/obj/fluff/flora/snowflora.dmi'
gender = PLURAL //"this is grass" not "this is a grass"
product_types = list(/obj/item/food/grown/grass = 10, /obj/item/seeds/grass = 1)
harvest_with_hands = TRUE
harvest_amount_low = 0
harvest_amount_high = 2
harvest_message_low = "You uproot the grass from the ground, just for the fun of it."
harvest_message_med = "You gather up some grass."
harvest_message_high = "You gather up a handful grass."
can_uproot = TRUE
flora_flags = FLORA_HERBAL
/obj/structure/flora/grass/brown
icon_state = "snowgrass1bb"
/obj/structure/flora/grass/brown/style_2
icon_state = "snowgrass2bb"
/obj/structure/flora/grass/brown/style_3
icon_state = "snowgrass2bb"
/obj/structure/flora/grass/brown/style_random/Initialize(mapload)
. = ..()
icon_state = "snowgrass[rand(1, 3)]bb"
update_appearance()
/obj/structure/flora/grass/green
icon_state = "snowgrass1gb"
/obj/structure/flora/grass/green/style_2
icon_state = "snowgrass2gb"
/obj/structure/flora/grass/green/style_3
icon_state = "snowgrass3gb"
/obj/structure/flora/grass/green/style_random/Initialize(mapload)
. = ..()
icon_state = "snowgrass[rand(1, 3)]gb"
update_appearance()
/obj/structure/flora/grass/both
icon_state = "snowgrassall1"
/obj/structure/flora/grass/both/style_2
icon_state = "snowgrassall2"
/obj/structure/flora/grass/both/style_3
icon_state = "snowgrassall3"
/obj/structure/flora/grass/both/style_random/Initialize(mapload)
. = ..()
icon_state = "snowgrassall[rand(1, 3)]"
update_appearance()
/obj/structure/flora/grass/jungle
name = "jungle grass"
desc = "Thick alien flora."
icon = 'icons/obj/fluff/flora/jungleflora.dmi'
icon_state = "grassa1"
/obj/structure/flora/grass/jungle/a/style_2
icon_state = "grassa2"
/obj/structure/flora/grass/jungle/a/style_3
icon_state = "grassa3"
/obj/structure/flora/grass/jungle/a/style_4
icon_state = "grassa4"
/obj/structure/flora/grass/jungle/a/style_5
icon_state = "grassa5"
/obj/structure/flora/grass/jungle/a/style_random/Initialize(mapload)
. = ..()
icon_state = "grassa[rand(1, 5)]"
update_appearance()
/obj/structure/flora/grass/jungle/b
icon_state = "grassb1"
/obj/structure/flora/grass/jungle/b/style_2
icon_state = "grassb2"
/obj/structure/flora/grass/jungle/b/style_3
icon_state = "grassb3"
/obj/structure/flora/grass/jungle/b/style_4
icon_state = "grassb4"
/obj/structure/flora/grass/jungle/b/style_5
icon_state = "grassb5"
/obj/structure/flora/grass/jungle/b/style_random/Initialize(mapload)
. = ..()
icon_state = "grassb[rand(1, 5)]"
update_appearance()
/**********
* Bushes *
**********/
/obj/structure/flora/bush
name = "bush"
desc = "Some type of shrubbery. Known for causing considerable economic stress on designers."
icon = 'icons/obj/fluff/flora/ausflora.dmi'
icon_state = "firstbush_1"
flora_flags = FLORA_HERBAL
/obj/structure/flora/bush/style_2
icon_state = "firstbush_2"
/obj/structure/flora/bush/style_3
icon_state = "firstbush_3"
/obj/structure/flora/bush/style_4
icon_state = "firstbush_4"
/obj/structure/flora/bush/style_random/Initialize(mapload)
. = ..()
icon_state = "firstbush_[rand(1, 4)]"
update_appearance()
/obj/structure/flora/bush/reed
icon_state = "reedbush_1"
/obj/structure/flora/bush/reed/style_2
icon_state = "reedbush_2"
/obj/structure/flora/bush/reed/style_3
icon_state = "reedbush_3"
/obj/structure/flora/bush/reed/style_4
icon_state = "reedbush_4"
/obj/structure/flora/bush/reed/style_random/Initialize(mapload)
. = ..()
icon_state = "reedbush_[rand(1, 4)]"
update_appearance()
/obj/structure/flora/bush/leafy
icon_state = "leafybush_1"
/obj/structure/flora/bush/leavy/style_2
icon_state = "leafybush_2"
/obj/structure/flora/bush/leavy/style_3
icon_state = "leafybush_3"
/obj/structure/flora/bush/leavy/style_random/Initialize(mapload)
. = ..()
icon_state = "leafybush_[rand(1, 3)]"
update_appearance()
/obj/structure/flora/bush/pale
icon_state = "palebush_1"
/obj/structure/flora/bush/pale/style_2
icon_state = "palebush_2"
/obj/structure/flora/bush/pale/style_3
icon_state = "palebush_3"
/obj/structure/flora/bush/pale/style_4
icon_state = "palebush_4"
/obj/structure/flora/bush/pale/style_random/Initialize(mapload)
. = ..()
icon_state = "palebush_[rand(1, 4)]"
update_appearance()
/obj/structure/flora/bush/stalky
icon_state = "stalkybush_1"
/obj/structure/flora/bush/stalky/style_2
icon_state = "stalkybush_2"
/obj/structure/flora/bush/stalky/style_3
icon_state = "stalkybush_3"
/obj/structure/flora/bush/stalky/style_random/Initialize(mapload)
. = ..()
icon_state = "stalkybush_[rand(1, 3)]"
update_appearance()
/obj/structure/flora/bush/grassy
icon_state = "grassybush_1"
/obj/structure/flora/bush/grassy/style_2
icon_state = "grassybush_2"
/obj/structure/flora/bush/grassy/style_3
icon_state = "grassybush_3"
/obj/structure/flora/bush/grassy/style_4
icon_state = "grassybush_4"
/obj/structure/flora/bush/grassy/style_random/Initialize(mapload)
. = ..()
icon_state = "grassybush_[rand(1, 4)]"
update_appearance()
/obj/structure/flora/bush/sparsegrass
icon_state = "sparsegrass_1"
/obj/structure/flora/bush/sparsegrass/style_2
icon_state = "sparsegrass_2"
/obj/structure/flora/bush/sparsegrass/style_3
icon_state = "sparsegrass_3"
/obj/structure/flora/bush/sparsegrass/style_random/Initialize(mapload)
. = ..()
icon_state = "sparsegrass_[rand(1, 3)]"
update_appearance()
/obj/structure/flora/bush/fullgrass
icon_state = "fullgrass_1"
/obj/structure/flora/bush/fullgrass/style_2
icon_state = "fullgrass_2"
/obj/structure/flora/bush/fullgrass/style_3
icon_state = "fullgrass_3"
/obj/structure/flora/bush/fullgrass/style_random/Initialize(mapload)
. = ..()
icon_state = "fullgrass_[rand(1, 3)]"
update_appearance()
/obj/structure/flora/bush/ferny
icon_state = "fernybush_1"
/obj/structure/flora/bush/ferny/style_2
icon_state = "fernybush_2"
/obj/structure/flora/bush/ferny/style_3
icon_state = "fernybush_3"
/obj/structure/flora/bush/ferny/style_random/Initialize(mapload)
. = ..()
icon_state = "fernybush_[rand(1, 3)]"
update_appearance()
/obj/structure/flora/bush/sunny
icon_state = "sunnybush_1"
/obj/structure/flora/bush/sunny/style_2
icon_state = "sunnybush_2"
/obj/structure/flora/bush/sunny/style_3
icon_state = "sunnybush_3"
/obj/structure/flora/bush/sunny/style_random/Initialize(mapload)
. = ..()
icon_state = "sunnybush_[rand(1, 3)]"
update_appearance()
/obj/structure/flora/bush/generic
icon_state = "genericbush_1"
/obj/structure/flora/bush/generic/style_2
icon_state = "genericbush_2"
/obj/structure/flora/bush/generic/style_3
icon_state = "genericbush_3"
/obj/structure/flora/bush/generic/style_4
icon_state = "genericbush_4"
/obj/structure/flora/bush/generic/style_random/Initialize(mapload)
. = ..()
icon_state = "genericbush_[rand(1, 4)]"
update_appearance()
/obj/structure/flora/bush/pointy
icon_state = "pointybush_1"
/obj/structure/flora/bush/pointy/style_2
icon_state = "pointybush_2"
/obj/structure/flora/bush/pointy/style_3
icon_state = "pointybush_3"
/obj/structure/flora/bush/pointy/style_4
icon_state = "pointybush_4"
/obj/structure/flora/bush/pointy/style_random/Initialize(mapload)
. = ..()
icon_state = "pointybush_[rand(1, 4)]"
update_appearance()
/obj/structure/flora/bush/lavendergrass
icon_state = "lavendergrass_1"
/obj/structure/flora/bush/lavendergrass/style_2
icon_state = "lavendergrass_2"
/obj/structure/flora/bush/lavendergrass/style_3
icon_state = "lavendergrass_3"
/obj/structure/flora/bush/lavendergrass/style_4
icon_state = "lavendergrass_4"
/obj/structure/flora/bush/lavendergrass/style_random/Initialize(mapload)
. = ..()
icon_state = "lavendergrass_[rand(1, 4)]"
update_appearance()
/obj/structure/flora/bush/flowers_yw
icon_state = "ywflowers_1"
/obj/structure/flora/bush/flowers_yw/style_2
icon_state = "ywflowers_2"
/obj/structure/flora/bush/flowers_yw/style_3
icon_state = "ywflowers_3"
/obj/structure/flora/bush/flowers_yw/style_random/Initialize(mapload)
. = ..()
icon_state = "ywflowers_[rand(1, 3)]"
update_appearance()
/obj/structure/flora/bush/flowers_br
icon_state = "brflowers_1"
/obj/structure/flora/bush/flowers_br/style_2
icon_state = "brflowers_2"
/obj/structure/flora/bush/flowers_br/style_3
icon_state = "brflowers_3"
/obj/structure/flora/bush/flowers_br/style_random/Initialize(mapload)
. = ..()
icon_state = "brflowers_[rand(1, 3)]"
update_appearance()
/obj/structure/flora/bush/flowers_pp
icon_state = "ppflowers_1"
/obj/structure/flora/bush/flowers_pp/style_2
icon_state = "ppflowers_2"
/obj/structure/flora/bush/flowers_pp/style_3
icon_state = "ppflowers_3"
/obj/structure/flora/bush/flowers_pp/style_random/Initialize(mapload)
. = ..()
icon_state = "ppflowers_[rand(1, 3)]"
update_appearance()
/obj/structure/flora/bush/snow
icon = 'icons/obj/fluff/flora/snowflora.dmi'
icon_state = "snowbush1"
/obj/structure/flora/bush/snow/style_2
icon_state = "snowbush2"
/obj/structure/flora/bush/snow/style_3
icon_state = "snowbush3"
/obj/structure/flora/bush/snow/style_4
icon_state = "snowbush4"
/obj/structure/flora/bush/snow/style_5
icon_state = "snowbush5"
/obj/structure/flora/bush/snow/style_6
icon_state = "snowbush6"
/obj/structure/flora/bush/snow/style_random/Initialize(mapload)
. = ..()
icon_state = "snowbush[rand(1, 6)]"
update_appearance()
/obj/structure/flora/bush/jungle
desc = "A wild plant that is found in jungles."
icon = 'icons/obj/fluff/flora/jungleflora.dmi'
icon_state = "busha1"
flora_flags = FLORA_HERBAL
/obj/structure/flora/bush/jungle/a/style_2
icon_state = "busha2"
/obj/structure/flora/bush/jungle/a/style_3
icon_state = "busha3"
/obj/structure/flora/bush/jungle/a/style_random/Initialize(mapload)
. = ..()
icon_state = "busha[rand(1, 3)]"
update_appearance()
/obj/structure/flora/bush/jungle/b
icon_state = "bushb1"
/obj/structure/flora/bush/jungle/b/style_2
icon_state = "bushb2"
/obj/structure/flora/bush/jungle/b/style_3
icon_state = "bushb3"
/obj/structure/flora/bush/jungle/b/style_random/Initialize(mapload)
. = ..()
icon_state = "bushb[rand(1, 3)]"
update_appearance()
/obj/structure/flora/bush/jungle/c
icon_state = "bushc1"
/obj/structure/flora/bush/jungle/c/style_2
icon_state = "bushc2"
/obj/structure/flora/bush/jungle/c/style_3
icon_state = "bushc3"
/obj/structure/flora/bush/jungle/c/style_random/Initialize(mapload)
. = ..()
icon_state = "bushc[rand(1, 3)]"
update_appearance()
/obj/structure/flora/bush/large
icon = 'icons/obj/fluff/flora/largejungleflora.dmi'
icon_state = "bush1"
pixel_x = -16
pixel_y = -12
layer = ABOVE_ALL_MOB_LAYER
plane = ABOVE_GAME_PLANE
/obj/structure/flora/bush/large/style_2
icon_state = "bush2"
/obj/structure/flora/bush/large/style_3
icon_state = "bush3"
/obj/structure/flora/bush/large/style_random/Initialize(mapload)
. = ..()
icon_state = "bush[rand(1, 3)]"
update_appearance()
/obj/structure/flora/lunar_plant
name = "lunar plant"
desc= "This seemingly dead plant is actually quite alive, hibernating until sensing living things."
icon_state = "lunar_plant"
icon = 'icons/obj/fluff/flora/xenoflora.dmi'
density = FALSE
light_color = COLOR_WHITE
light_range = 2
/obj/structure/flora/lunar_plant/Initialize(mapload)
. = ..()
icon_state = "lunar_plant[rand(1,3)]"
/obj/structure/flora/lunar_plant/style_1
icon_state = "lunar_plant1"
/obj/structure/flora/lunar_plant/style_2
icon_state = "lunar_plant2"
/obj/structure/flora/lunar_plant/style_3
icon_state = "lunar_plant3"
/*********
* Rocks *
*********/
// (I know these aren't plants)
/obj/structure/flora/rock
name = "large rock"
icon_state = "basalt1"
desc = "A volcanic rock. Pioneers used to ride these babies for miles."
icon = 'icons/obj/fluff/flora/rocks.dmi'
density = TRUE
resistance_flags = FIRE_PROOF
product_types = list(/obj/item/stack/ore/glass/basalt = 1)
harvest_amount_low = 10
harvest_amount_high = 20
harvest_message_med = "You finish mining the rock."
harvest_verb = "mine"
flora_flags = FLORA_STONE
can_uproot = FALSE
delete_on_harvest = TRUE
/obj/structure/flora/rock/style_2
icon_state = "basalt2"
/obj/structure/flora/rock/style_3
icon_state = "basalt3"
/obj/structure/flora/rock/style_4
icon_state = "basalt4"
/obj/structure/flora/rock/style_random/Initialize(mapload)
. = ..()
icon_state = "basalt[rand(1, 4)]"
update_appearance()
/obj/structure/flora/rock/pile
name = "rock pile"
desc = "A pile of rocks."
icon_state = "lavarocks1"
harvest_amount_low = 5
harvest_amount_high = 10
harvest_message_med = "You finish mining the pile of rocks."
density = FALSE
/obj/structure/flora/rock/pile/style_2
icon_state = "lavarocks2"
/obj/structure/flora/rock/pile/style_3
icon_state = "lavarocks3"
/obj/structure/flora/rock/pile/style_random/Initialize(mapload)
. = ..()
icon_state = "lavarocks[rand(1, 3)]"
update_appearance()
/obj/structure/flora/rock/pile/jungle
icon_state = "rock1"
icon = 'icons/obj/fluff/flora/jungleflora.dmi'
/obj/structure/flora/rock/pile/jungle/style_2
icon_state = "rock2"
/obj/structure/flora/rock/pile/jungle/style_3
icon_state = "rock3"
/obj/structure/flora/rock/pile/jungle/style_4
icon_state = "rock4"
/obj/structure/flora/rock/pile/jungle/style_5
icon_state = "rock5"
/obj/structure/flora/rock/pile/jungle/style_random/Initialize(mapload)
. = ..()
icon_state = "rock[rand(1, 5)]"
update_appearance()
/obj/structure/flora/rock/pile/jungle/large
name = "pile of large rocks"
icon_state = "rocks1"
icon = 'icons/obj/fluff/flora/largejungleflora.dmi'
pixel_x = -16
pixel_y = -16
harvest_amount_low = 9
harvest_amount_high = 13
/obj/structure/flora/rock/pile/jungle/large/style_2
icon_state = "rocks2"
/obj/structure/flora/rock/pile/jungle/large/style_3
icon_state = "rocks3"
/obj/structure/flora/rock/pile/jungle/large/style_random/Initialize(mapload)
. = ..()
icon_state = "rocks[rand(1, 3)]"
update_appearance()
//TODO: Make new sprites for these. the pallete in the icons are grey, and a white color here still makes them grey
/obj/structure/flora/rock/icy
name = "icy rock"
icon_state = "basalt1"
color = rgb(204,233,235)
/obj/structure/flora/rock/icy/style_2
icon_state = "basalt2"
/obj/structure/flora/rock/icy/style_3
icon_state = "basalt3"
/obj/structure/flora/rock/icy/style_random/Initialize(mapload)
. = ..()
icon_state = "basalt[rand(1, 3)]"
update_appearance()
/obj/structure/flora/rock/pile/icy
name = "icy rocks"
icon_state = "lavarocks1"
color = rgb(204,233,235)
/obj/structure/flora/rock/pile/icy/style_2
icon_state = "lavarocks2"
/obj/structure/flora/rock/pile/icy/style_3
icon_state = "lavarocks3"
/obj/structure/flora/rock/pile/icy/style_random/Initialize(mapload)
. = ..()
icon_state = "lavarocks[rand(1, 3)]"
update_appearance()