diff --git a/code/__DEFINES/wall_dents.dm b/code/__DEFINES/wall_dents.dm
index 1e4f813849e..555f98671c0 100644
--- a/code/__DEFINES/wall_dents.dm
+++ b/code/__DEFINES/wall_dents.dm
@@ -1,2 +1,3 @@
#define WALL_DENT_HIT 1
#define WALL_DENT_SHOT 2
+#define MAX_DENT_DECALS 15
diff --git a/code/datums/station_traits/negative_traits.dm b/code/datums/station_traits/negative_traits.dm
index e623c9b1870..f73bd480f84 100644
--- a/code/datums/station_traits/negative_traits.dm
+++ b/code/datums/station_traits/negative_traits.dm
@@ -17,6 +17,30 @@
/datum/station_trait/distant_supply_lines/on_round_start()
SSeconomy.pack_price_modifier *= 1.2
+///A negative trait that stops mail from arriving (or the inverse if on holiday). It also enables a specific shuttle loan situation.
+/datum/station_trait/mail_blocked
+ name = "Postal workers strike"
+ trait_type = STATION_TRAIT_NEGATIVE
+ weight = 2
+ show_in_report = TRUE
+ report_message = "Due to an ongoing strike announced by the postal workers union, mail won't be delivered this shift."
+
+/datum/station_trait/mail_blocked/on_round_start()
+ //This is either a holiday or sunday... well then, let's flip the situation.
+ if(SSeconomy.mail_blocked)
+ name = "Postal system overtime"
+ report_message = "Despite being a day off, the postal system is working overtime today. Mail will be delivered this shift."
+ else
+ var/datum/round_event_control/shuttle_loan/our_event = locate() in SSevents.control
+ our_event.unavailable_situations -= /datum/shuttle_loan_situation/mail_strike
+ SSeconomy.mail_blocked = !SSeconomy.mail_blocked
+
+/datum/station_trait/mail_blocked/hangover/revert()
+ var/datum/round_event_control/shuttle_loan/our_event = locate() in SSevents.control
+ our_event.unavailable_situations |= /datum/shuttle_loan_situation/mail_strike
+ SSeconomy.mail_blocked = !SSeconomy.mail_blocked
+ return ..()
+
///A negative trait that reduces the amount of products available from vending machines throughout the station.
/datum/station_trait/vending_shortage
name = "Vending products shortage"
diff --git a/code/game/objects/effects/spawners/random/contraband.dm b/code/game/objects/effects/spawners/random/contraband.dm
index f5bf0f452a3..ca5acbdbe67 100644
--- a/code/game/objects/effects/spawners/random/contraband.dm
+++ b/code/game/objects/effects/spawners/random/contraband.dm
@@ -141,3 +141,59 @@
/obj/item/restraints/legcuffs/beartrap/prearmed = 5, //not really a landmine, but still a good threat
/obj/effect/mine/shrapnel = 5,
)
+
+/obj/effect/spawner/random/contraband/grenades
+ name = "grenades spawner"
+ loot = list(
+ /obj/item/grenade/chem_grenade/metalfoam,
+ /obj/item/grenade/chem_grenade/cleaner,
+ /obj/effect/spawner/random/entertainment/colorful_grenades,
+ /obj/item/grenade/smokebomb,
+ /obj/item/grenade/chem_grenade/antiweed,
+ /obj/item/grenade/spawnergrenade/syndiesoap,
+ /obj/effect/spawner/random/contraband/grenades/dangerous,
+ )
+
+/obj/effect/spawner/random/contraband/grenades/dangerous
+ name = "dangerous grenades spawner"
+ loot = list(
+ /obj/item/grenade/flashbang = 3,
+ /obj/item/grenade/chem_grenade/teargas = 2,
+ /obj/item/grenade/iedcasing/spawned = 2,
+ /obj/item/grenade/empgrenade = 2,
+ /obj/item/grenade/antigravity = 2,
+ /obj/effect/spawner/random/contraband/grenades/cluster = 1,
+ /obj/effect/spawner/random/contraband/grenades/lethal = 1,
+ )
+
+/obj/effect/spawner/random/contraband/grenades/cluster
+ name = "clusterbusters spawner"
+ loot = list(
+ /obj/item/grenade/clusterbuster/smoke = 4,
+ /obj/item/grenade/clusterbuster/metalfoam = 4,
+ /obj/item/grenade/clusterbuster/cleaner = 4,
+ /obj/item/grenade/clusterbuster = 3,
+ /obj/item/grenade/clusterbuster/teargas = 3,
+ /obj/item/grenade/clusterbuster/antiweed = 3,
+ /obj/item/grenade/clusterbuster/soap = 2,
+ /obj/item/grenade/clusterbuster/emp = 1,
+ /obj/item/grenade/clusterbuster/spawner_spesscarp = 1,
+ /obj/item/grenade/clusterbuster/facid = 1,
+ /obj/item/grenade/clusterbuster/inferno = 1,
+ /obj/item/grenade/clusterbuster/clf3 = 1,
+ )
+
+/obj/effect/spawner/random/contraband/grenades/lethal
+ name = "lethal grenades spawner"
+ loot = list(
+ /obj/item/grenade/chem_grenade/incendiary = 3,
+ /obj/item/grenade/chem_grenade/facid = 3,
+ /obj/item/grenade/chem_grenade/ez_clean = 3,
+ /obj/item/grenade/chem_grenade/clf3 = 2,
+ /obj/item/grenade/gluon = 2,
+ /obj/item/grenade/chem_grenade/holy = 2,
+ /obj/item/grenade/spawnergrenade/spesscarp = 1,
+ /obj/item/grenade/spawnergrenade/cat = 1,
+ /obj/item/grenade/frag = 1,
+ /obj/item/grenade/chem_grenade/bioterrorfoam = 1,
+ )
diff --git a/code/game/objects/effects/spawners/random/entertainment.dm b/code/game/objects/effects/spawners/random/entertainment.dm
index 1c635f07a5a..0a61cd1ab1f 100644
--- a/code/game/objects/effects/spawners/random/entertainment.dm
+++ b/code/game/objects/effects/spawners/random/entertainment.dm
@@ -281,3 +281,12 @@
/obj/item/toy/plush/ratplush = 2,
/obj/item/toy/plush/narplush = 2,
)
+
+/obj/effect/spawner/random/entertainment/colorful_grenades
+ name = "colorful/glitter grenades spawner"
+ loot = list(
+ /obj/item/grenade/chem_grenade/glitter/pink,
+ /obj/item/grenade/chem_grenade/glitter/blue,
+ /obj/item/grenade/chem_grenade/glitter/white,
+ /obj/item/grenade/chem_grenade/colorful
+ )
diff --git a/code/game/objects/effects/spawners/random/food_or_drink.dm b/code/game/objects/effects/spawners/random/food_or_drink.dm
index b2639b2df68..192914b6e3d 100644
--- a/code/game/objects/effects/spawners/random/food_or_drink.dm
+++ b/code/game/objects/effects/spawners/random/food_or_drink.dm
@@ -323,3 +323,17 @@
/obj/item/food/donut/jelly/slimejelly/matcha = 2,
/obj/item/food/donut/jelly/slimejelly/trumpet = 2,
)
+
+/obj/effect/spawner/random/food_or_drink/any_snack_or_beverage
+ name = "any snack or beverage spawner"
+ icon_state = "slime_jelly_donut"
+ loot = list(
+ /obj/effect/spawner/random/food_or_drink/snack = 6,
+ /obj/effect/spawner/random/food_or_drink/refreshing_beverage = 6,
+ /obj/effect/spawner/random/food_or_drink/donuts = 5,
+ /obj/effect/spawner/random/food_or_drink/donkpockets_single = 5,
+ /obj/effect/spawner/random/food_or_drink/booze = 4,
+ /obj/effect/spawner/random/food_or_drink/snack/lizard = 4,
+ /obj/effect/spawner/random/food_or_drink/jelly_donuts = 3,
+ /obj/effect/spawner/random/food_or_drink/slime_jelly_donuts = 1,
+ )
diff --git a/code/game/objects/items/mail.dm b/code/game/objects/items/mail.dm
index d058f96a40c..50b81ab6bc3 100644
--- a/code/game/objects/items/mail.dm
+++ b/code/game/objects/items/mail.dm
@@ -154,14 +154,18 @@
/obj/item/mail/examine_more(mob/user)
. = ..()
- var/list/msg = list(span_notice("You notice the postmarking on the front of the mail..."))
+ if(!postmarked)
+ . += span_info("This mail has no postmarking of any sort...")
+ else
+ . += span_notice("You notice the postmarking on the front of the mail...")
var/datum/mind/recipient = recipient_ref.resolve()
if(recipient)
- msg += "\t[span_info("Certified NT mail for [recipient].")]"
+ . += span_info("[postmarked ? "Certified NT" : "Uncertfieid"] mail for [recipient].")
+ else if(postmarked)
+ . += span_info("Certified mail for [GLOB.station_name].")
else
- msg += "\t[span_info("Certified mail for [GLOB.station_name].")]"
- msg += "\t[span_info("Distribute by hand or via destination tagger using the certified NT disposal system.")]"
- return msg
+ . += span_info("This is a dead letter mail with no recipient.")
+ . += span_info("Distribute by hand or via destination tagger using the certified NT disposal system.")
/// Accepts a mind to initialize goodies for a piece of mail.
/obj/item/mail/proc/initialize_for_recipient(datum/mind/recipient)
@@ -251,6 +255,8 @@
lid_x = -26
lid_y = 2
paint_jobs = null
+ ///if it'll show the nt mark on the crate
+ var/postmarked = TRUE
/obj/structure/closet/crate/mail/update_icon_state()
. = ..()
@@ -261,6 +267,11 @@
else
icon_state = "[base_icon_state]sealed"
+/obj/structure/closet/crate/mail/update_overlays()
+ . = ..()
+ if(postmarked)
+ . += "mail_nt"
+
/// Fills this mail crate with N pieces of mail, where N is the lower of the amount var passed, and the maximum capacity of this crate. If N is larger than the number of alive human players, the excess will be junkmail.
/obj/structure/closet/crate/mail/proc/populate(amount)
var/mail_count = min(amount, storage_capacity)
@@ -306,6 +317,19 @@
. = ..()
populate(INFINITY)
+///Used in the mail strike shuttle loan event
+/obj/structure/closet/crate/mail/full/mail_strike
+ desc = "A post crate from somewhere else. It has no NT logo on it."
+ postmarked = FALSE
+
+/obj/structure/closet/crate/mail/full/mail_strike/populate(amount)
+ var/strike_mail_to_spawn = rand(1, storage_capacity-1)
+ for(var/i in 1 to strike_mail_to_spawn)
+ if(prob(95))
+ new /obj/item/mail/mail_strike(src)
+ else
+ new /obj/item/mail/traitor/mail_strike(src)
+ return ..(storage_capacity - strike_mail_to_spawn)
/// Opened mail crate
/obj/structure/closet/crate/mail/preopen
@@ -383,7 +407,8 @@
playsound(loc, 'sound/items/poster_ripped.ogg', vol = 50, vary = TRUE)
for(var/obj/item/stuff as anything in contents) // Mail and envelope actually can have more than 1 item.
if(user.put_in_hands(stuff) && armed)
- log_bomber(user, "opened armed mail made by [made_by_cached_name] ([made_by_cached_ckey]), activating", stuff)
+ var/whomst = made_by_cached_name ? "[made_by_cached_name] ([made_by_cached_ckey])" : "no one in particular"
+ log_bomber(user, "opened armed mail made by [whomst], activating", stuff)
INVOKE_ASYNC(stuff, TYPE_PROC_REF(/obj/item, attack_self), user)
qdel(src)
return TRUE
@@ -414,6 +439,55 @@
after_unwrap(user)
return TRUE
+///Generic mail used in the mail strike shuttle loan event
+/obj/item/mail/mail_strike
+ name = "dead mail"
+ desc = "An unmarked parcel of unknown origins, effectively undeliverable."
+ postmarked = FALSE
+ generic_goodies = list(
+ /obj/effect/spawner/random/entertainment/money_medium = 2,
+ /obj/effect/spawner/random/contraband = 2,
+ /obj/effect/spawner/random/entertainment/money_large = 1,
+ /obj/effect/spawner/random/entertainment/coin = 1,
+ /obj/effect/spawner/random/food_or_drink/any_snack_or_beverage = 1,
+ /obj/effect/spawner/random/entertainment/drugs = 1,
+ /obj/effect/spawner/random/contraband/grenades = 1,
+ )
+
+/obj/item/mail/mail_strike/Initialize(mapload)
+ if(prob(35))
+ stamped = FALSE
+ if(prob(35))
+ name = "dead envelope"
+ icon_state = "mail_large"
+ goodie_count = 2
+ stamp_max = 2
+ stamp_offset_y = 5
+ . = ..()
+ color = pick(COLOR_SILVER, COLOR_DARK, COLOR_DRIED_TAN, COLOR_ORANGE_BROWN, COLOR_BROWN, COLOR_SYNDIE_RED)
+ for(var/goodie in 1 to goodie_count)
+ var/target_good = pick_weight(generic_goodies)
+ new target_good(src)
+
+///Also found in the mail strike shuttle loan. It contains a random grenade that'll be triggered when unwrapped
+/obj/item/mail/traitor/mail_strike
+ name = "dead mail"
+ desc = "An unmarked parcel of unknown origins, effectively undeliverable."
+ postmarked = FALSE
+
+/obj/item/mail/traitor/mail_strike/Initialize(mapload)
+ if(prob(35))
+ stamped = FALSE
+ if(prob(35))
+ name = "dead envelope"
+ icon_state = "mail_large"
+ goodie_count = 2
+ stamp_max = 2
+ stamp_offset_y = 5
+ . = ..()
+ color = pick(COLOR_SILVER, COLOR_DARK, COLOR_DRIED_TAN, COLOR_ORANGE_BROWN, COLOR_BROWN, COLOR_SYNDIE_RED)
+ new /obj/effect/spawner/random/contraband/grenades/dangerous(src)
+
/obj/item/storage/mail_counterfeit_device
name = "GLA-2 mail counterfeit device"
desc = "Device that actually able to counterfeit NT's mail. This device also able to place a trap inside of mail for malicious actions. Trap will \"activate\" any item inside of mail. Also it might be used for contraband purposes. Integrated micro-computer will give you great configuration optionality for your needs."
diff --git a/code/game/turfs/closed/walls.dm b/code/game/turfs/closed/walls.dm
index f8d411acee4..2cc6d32bc03 100644
--- a/code/game/turfs/closed/walls.dm
+++ b/code/game/turfs/closed/walls.dm
@@ -1,4 +1,3 @@
-#define MAX_DENT_DECALS 15
#define LEANING_OFFSET 11
/turf/closed/wall
@@ -387,5 +386,4 @@
. = ..()
SEND_SIGNAL(gone, COMSIG_LIVING_WALL_EXITED, src)
-#undef MAX_DENT_DECALS
#undef LEANING_OFFSET
diff --git a/code/modules/events/shuttle_loan/shuttle_loan_datum.dm b/code/modules/events/shuttle_loan/shuttle_loan_datum.dm
index 6c325e43da3..706274dfd85 100644
--- a/code/modules/events/shuttle_loan/shuttle_loan_datum.dm
+++ b/code/modules/events/shuttle_loan/shuttle_loan_datum.dm
@@ -7,7 +7,7 @@
/// What the shuttle says about it.
var/shuttle_transit_text = "Unset transit text"
/// Supply points earned for taking the deal.
- var/bonus_points = 10000
+ var/bonus_points = CARGO_CRATE_VALUE * 50
/// Response for taking the deal.
var/thanks_msg = "The cargo shuttle should return in five minutes. Have some supply points for your trouble."
/// Small description of the loan for easier log reading.
@@ -21,7 +21,7 @@
bonus_points *= 1.15
/// Spawns paths added to `spawn_list`, and passes empty shuttle turfs so you can spawn more complicated things like dead bodies.
-/datum/shuttle_loan_situation/proc/spawn_items(list/spawn_list, list/empty_shuttle_turfs)
+/datum/shuttle_loan_situation/proc/spawn_items(list/spawn_list, list/empty_shuttle_turfs, list/blocked_shutte_turfs)
SHOULD_CALL_PARENT(FALSE)
CRASH("Unimplemented get_spawned_items() on [src.type].")
@@ -31,7 +31,7 @@
shuttle_transit_text = "Virus samples incoming."
logging_desc = "Virus shuttle"
-/datum/shuttle_loan_situation/antidote/spawn_items(list/spawn_list, list/empty_shuttle_turfs)
+/datum/shuttle_loan_situation/antidote/spawn_items(list/spawn_list, list/empty_shuttle_turfs, list/blocked_shutte_turfs)
var/obj/effect/mob_spawn/corpse/human/assistant/infected_assistant = pick(list(
/obj/effect/mob_spawn/corpse/human/assistant/beesease_infection,
/obj/effect/mob_spawn/corpse/human/assistant/brainrot_infection,
@@ -58,7 +58,7 @@
bonus_points = 0
logging_desc = "Resupply packages"
-/datum/shuttle_loan_situation/department_resupply/spawn_items(list/spawn_list, list/empty_shuttle_turfs)
+/datum/shuttle_loan_situation/department_resupply/spawn_items(list/spawn_list, list/empty_shuttle_turfs, list/blocked_shutte_turfs)
var/list/crate_types = list(
/datum/supply_pack/emergency/equipment,
/datum/supply_pack/security/supplies,
@@ -84,7 +84,7 @@
shuttle_transit_text = "Syndicate hijack team incoming."
logging_desc = "Syndicate boarding party"
-/datum/shuttle_loan_situation/syndiehijacking/spawn_items(list/spawn_list, list/empty_shuttle_turfs)
+/datum/shuttle_loan_situation/syndiehijacking/spawn_items(list/spawn_list, list/empty_shuttle_turfs, list/blocked_shutte_turfs)
var/datum/supply_pack/pack = SSshuttle.supply_packs[/datum/supply_pack/imports/specialops]
pack.generate(pick_n_take(empty_shuttle_turfs))
@@ -99,10 +99,10 @@
sender = "CentCom Janitorial Division"
announcement_text = "One of our freighters carrying a bee shipment has been attacked by eco-terrorists. Can you clean up the mess for us?"
shuttle_transit_text = "Biohazard cleanup incoming."
- bonus_points = 20000 //Toxin bees can be unbeelievably lethal
+ bonus_points = CARGO_CRATE_VALUE * 100 //Toxin bees can be unbeelievably lethal
logging_desc = "Shuttle full of bees"
-/datum/shuttle_loan_situation/lots_of_bees/spawn_items(list/spawn_list, list/empty_shuttle_turfs)
+/datum/shuttle_loan_situation/lots_of_bees/spawn_items(list/spawn_list, list/empty_shuttle_turfs, list/blocked_shutte_turfs)
var/datum/supply_pack/pack = SSshuttle.supply_packs[/datum/supply_pack/organic/hydroponics/beekeeping_fullkit]
pack.generate(pick_n_take(empty_shuttle_turfs))
@@ -135,10 +135,10 @@
announcement_text = "We have discovered an active Syndicate bomb near our VIP shuttle's fuel lines. If you feel up to the task, we will pay you for defusing it."
shuttle_transit_text = "Live explosive ordnance incoming. Exercise extreme caution."
thanks_msg = "Live explosive ordnance incoming via supply shuttle. Evacuating cargo bay is recommended."
- bonus_points = 45000 //If you mess up, people die and the shuttle gets turned into swiss cheese
+ bonus_points = CARGO_CRATE_VALUE * 225 //If you mess up, people die and the shuttle gets turned into swiss cheese
logging_desc = "Shuttle with a ticking bomb"
-/datum/shuttle_loan_situation/jc_a_bomb/spawn_items(list/spawn_list, list/empty_shuttle_turfs)
+/datum/shuttle_loan_situation/jc_a_bomb/spawn_items(list/spawn_list, list/empty_shuttle_turfs, list/blocked_shutte_turfs)
spawn_list.Add(/obj/machinery/syndicatebomb/shuttle_loan)
if(prob(95))
spawn_list.Add(/obj/item/paper/fluff/cargo/bomb)
@@ -153,7 +153,7 @@
bonus_points = 0 //Payout is made when the stamped papers are returned
logging_desc = "Paperwork shipment"
-/datum/shuttle_loan_situation/papers_please/spawn_items(list/spawn_list, list/empty_shuttle_turfs)
+/datum/shuttle_loan_situation/papers_please/spawn_items(list/spawn_list, list/empty_shuttle_turfs, list/blocked_shutte_turfs)
spawn_list += subtypesof(/obj/item/paperwork) - typesof(/obj/item/paperwork/photocopy) - typesof(/obj/item/paperwork/ancient)
/datum/shuttle_loan_situation/pizza_delivery
@@ -164,8 +164,8 @@
bonus_points = 0
logging_desc = "Pizza delivery"
-/datum/shuttle_loan_situation/pizza_delivery/spawn_items(list/spawn_list, list/empty_shuttle_turfs)
- var/naughtypizza = list(/obj/item/pizzabox/bomb /*/obj/item/pizzabox/margherita/robo*/) // SKYRAT EDIT: oh look another blacklist, for pizza nonetheless! removes borg pizza
+/datum/shuttle_loan_situation/pizza_delivery/spawn_items(list/spawn_list, list/empty_shuttle_turfs, list/blocked_shutte_turfs)
+ var/naughtypizza = list(/obj/item/pizzabox/bomb, /obj/item/pizzabox/margherita/robo) //oh look another blacklist, for pizza nonetheless!
var/nicepizza = list(/obj/item/pizzabox/margherita, /obj/item/pizzabox/meat, /obj/item/pizzabox/vegetable, /obj/item/pizzabox/mushroom)
for(var/i in 1 to 6)
spawn_list.Add(pick(prob(5) ? naughtypizza : nicepizza))
@@ -176,7 +176,7 @@
shuttle_transit_text = "Partying Russians incoming."
logging_desc = "Russian party squad"
-/datum/shuttle_loan_situation/russian_party/spawn_items(list/spawn_list, list/empty_shuttle_turfs)
+/datum/shuttle_loan_situation/russian_party/spawn_items(list/spawn_list, list/empty_shuttle_turfs, list/blocked_shutte_turfs)
var/datum/supply_pack/pack = SSshuttle.supply_packs[/datum/supply_pack/service/party]
pack.generate(pick_n_take(empty_shuttle_turfs))
@@ -194,7 +194,7 @@
shuttle_transit_text = "Spider Clan gift incoming."
logging_desc = "Shuttle full of spiders"
-/datum/shuttle_loan_situation/spider_gift/spawn_items(list/spawn_list, list/empty_shuttle_turfs)
+/datum/shuttle_loan_situation/spider_gift/spawn_items(list/spawn_list, list/empty_shuttle_turfs, list/blocked_shutte_turfs)
var/datum/supply_pack/pack = SSshuttle.supply_packs[/datum/supply_pack/imports/specialops]
pack.generate(pick_n_take(empty_shuttle_turfs))
@@ -213,3 +213,82 @@
for(var/i in 1 to 5)
var/turf/web_turf = pick_n_take(empty_shuttle_turfs)
new /obj/structure/spider/stickyweb(web_turf)
+
+#define DENT_WALL "dent"
+#define CHANGE_WALL "change"
+#define DISMANTLE_WALL "dismantle"
+
+#define BREAK_TILE "break"
+#define PLATING_TILE "plating"
+#define RUST_TILE "rust"
+
+/**
+ * A special shuttle loan situation enabled by the 'mail blocked' station trait.
+ * It sends back a lot of mail to the station, at the cost of wrecking the cargo shuttle a little.
+ */
+/datum/shuttle_loan_situation/mail_strike
+ sender = "Spinward Mail Workers Union"
+ announcement_text = "The Mail Workers Union wants to borrow your cargo shuttle to employ \"advanced union strike tactics\" with. Payment is strictly in mails."
+ bonus_points = 0
+ thanks_msg = "The cargo shuttle should return in five minutes."
+ shuttle_transit_text = "Nothing stops the mail."
+ logging_desc = "Shuttle full of shady mail"
+
+/datum/shuttle_loan_situation/mail_strike/spawn_items(list/spawn_list, list/empty_shuttle_turfs, list/blocked_shutte_turfs)
+ for(var/i in 1 to rand(7, 12))
+ var/turf/closed/wall/wall = pick_n_take(blocked_shutte_turfs)
+ if(!istype(wall))
+ continue
+ var/static/list/wall_bad_stuff = list(DENT_WALL = 85, CHANGE_WALL = 13, DISMANTLE_WALL = 2)
+ var/static/list/possible_new_walls = list(
+ /turf/closed/wall/mineral/sandstone,
+ /turf/closed/wall/mineral/wood,
+ /turf/closed/wall/mineral/iron,
+ /turf/closed/wall/metal_foam_base,
+ /turf/closed/wall/r_wall,
+ )
+ var/damage_done = pick_weight(wall_bad_stuff)
+ switch(damage_done)
+ if(DENT_WALL)
+ for(var/dent in 1 to rand(1, MAX_DENT_DECALS))
+ wall.add_dent(prob(90) ? WALL_DENT_SHOT : WALL_DENT_HIT)
+ if(CHANGE_WALL)
+ wall.ChangeTurf(pick(possible_new_walls - wall.type))
+ if(prob(25))
+ for(var/dent in 1 to rand(1, MAX_DENT_DECALS))
+ wall.add_dent(prob(90) ? WALL_DENT_SHOT : WALL_DENT_HIT)
+ if(DISMANTLE_WALL)
+ wall.dismantle_wall()
+
+ for(var/i in 1 to rand(7, 12))
+ var/turf/open/floor/floor = pick_n_take(empty_shuttle_turfs)
+ if(!istype(floor))
+ continue
+ var/static/list/floor_bad_stuff = list(BREAK_TILE = 65, PLATING_TILE = 25, RUST_TILE = 10)
+ var/damage_done = pick_weight(floor_bad_stuff)
+ switch(damage_done)
+ if(BREAK_TILE)
+ if(prob(50))
+ floor.break_tile()
+ else
+ floor.burn_tile()
+ if(PLATING_TILE)
+ if(prob(25))
+ floor.remove_tile()
+ else
+ floor.make_plating()
+ if(RUST_TILE)
+ floor.ChangeTurf(/turf/open/floor/plating/rust)
+ if(prob(25))
+ spawn_list += pick(/obj/effect/gibspawner/robot, /obj/effect/gibspawner/human)
+
+ for(var/i in 1 to rand(4, 7))
+ spawn_list += /obj/structure/closet/crate/mail/full/mail_strike
+
+#undef BREAK_TILE
+#undef PLATING_TILE
+#undef RUST_TILE
+
+#undef DENT_WALL
+#undef CHANGE_WALL
+#undef DISMANTLE_WALL
diff --git a/code/modules/events/shuttle_loan/shuttle_loan_event.dm b/code/modules/events/shuttle_loan/shuttle_loan_event.dm
index 6eeddea0214..99e70e39495 100644
--- a/code/modules/events/shuttle_loan/shuttle_loan_event.dm
+++ b/code/modules/events/shuttle_loan/shuttle_loan_event.dm
@@ -8,7 +8,8 @@
description = "If cargo accepts the offer, fills the shuttle with loot and/or enemies."
///The types of loan events already run (and to be excluded if the event triggers).
admin_setup = list(/datum/event_admin_setup/listed_options/shuttle_loan)
- var/list/run_situations = list()
+ ///A list of normally unavailable (or already run) situations datums
+ var/list/unavailable_situations = list(/datum/shuttle_loan_situation/mail_strike)
/datum/round_event_control/shuttle_loan/can_spawn_event(players_amt, allow_magic = FALSE)
. = ..()
@@ -28,14 +29,14 @@
var/datum/round_event_control/shuttle_loan/loan_control = control
//by this point if situation is admin picked, it is a type, not an instance.
if(!situation)
- var/list/valid_situations = subtypesof(/datum/shuttle_loan_situation) - loan_control.run_situations
+ var/list/valid_situations = subtypesof(/datum/shuttle_loan_situation) - loan_control.unavailable_situations
if(!valid_situations.len)
//If we somehow run out of loans (fking campbell), they all become available again
- loan_control.run_situations.Cut()
+ loan_control.unavailable_situations.Cut()
valid_situations = subtypesof(/datum/shuttle_loan_situation)
situation = pick(valid_situations)
- loan_control.run_situations.Add(situation)
+ loan_control.unavailable_situations.Add(situation)
situation = new situation()
/datum/round_event/shuttle_loan/announce(fake)
@@ -76,10 +77,12 @@
//get empty turfs
var/list/empty_shuttle_turfs = list()
+ var/list/blocked_shutte_turfs = list()
var/list/area/shuttle/shuttle_areas = SSshuttle.supply.shuttle_areas
for(var/area/shuttle/shuttle_area as anything in shuttle_areas)
for(var/turf/open/floor/shuttle_turf in shuttle_area)
if(shuttle_turf.is_blocked_turf())
+ blocked_shutte_turfs += shuttle_turf
continue
empty_shuttle_turfs += shuttle_turf
if(!empty_shuttle_turfs.len)
@@ -87,7 +90,7 @@
//let the situation spawn its items
var/list/spawn_list = list()
- situation.spawn_items(spawn_list, empty_shuttle_turfs)
+ situation.spawn_items(spawn_list, empty_shuttle_turfs, blocked_shutte_turfs)
var/false_positive = 0
while(spawn_list.len && empty_shuttle_turfs.len)
@@ -103,7 +106,7 @@
/datum/event_admin_setup/listed_options/shuttle_loan/get_list()
var/datum/round_event_control/shuttle_loan/loan_event = event_control
- var/list/valid_situations = subtypesof(/datum/shuttle_loan_situation) - loan_event.run_situations
+ var/list/valid_situations = subtypesof(/datum/shuttle_loan_situation) - loan_event.unavailable_situations
return valid_situations
/datum/event_admin_setup/listed_options/shuttle_loan/apply_to_event(datum/round_event/shuttle_loan/event)
diff --git a/icons/obj/storage/crates.dmi b/icons/obj/storage/crates.dmi
index 274af66c820..9bc8f4d2c27 100644
Binary files a/icons/obj/storage/crates.dmi and b/icons/obj/storage/crates.dmi differ