diff --git a/cev_eris.dme b/cev_eris.dme
index d7d0240601e..9e3195951ad 100644
--- a/cev_eris.dme
+++ b/cev_eris.dme
@@ -711,7 +711,6 @@
#include "code\game\gamemodes\events\ion_storm.dm"
#include "code\game\gamemodes\events\meteors.dm"
#include "code\game\gamemodes\events\money_lotto.dm"
-#include "code\game\gamemodes\events\nothing.dm"
#include "code\game\gamemodes\events\prison_break.dm"
#include "code\game\gamemodes\events\radiation_storm.dm"
#include "code\game\gamemodes\events\rogue_drones.dm"
diff --git a/code/__DEFINES/_planes+layers.dm b/code/__DEFINES/_planes+layers.dm
index 732a3148635..df5574f5c3e 100644
--- a/code/__DEFINES/_planes+layers.dm
+++ b/code/__DEFINES/_planes+layers.dm
@@ -144,7 +144,7 @@ What is the naming convention for planes or layers?
#define ABOVE_ALL_MOB_LAYER 4.5
#define TYPING_LAYER 4.6
-#define SPACEVINE_LAYER 4.8
+#define SPACEVINE_LAYER 4.8 //Unused. We don't have vines anymore
//#define FLY_LAYER 5 //For easy recordkeeping; this is a byond define
#define GASFIRE_LAYER 5.05
diff --git a/code/__DEFINES/storyteller_defines.dm b/code/__DEFINES/storyteller_defines.dm
index d56f1fbff13..5714d23f91b 100644
--- a/code/__DEFINES/storyteller_defines.dm
+++ b/code/__DEFINES/storyteller_defines.dm
@@ -3,13 +3,15 @@
#define EVENT_LEVEL_MODERATE "moderate"
#define EVENT_LEVEL_MAJOR "major"
#define EVENT_LEVEL_ROLESET "roleset"
+#define EVENT_LEVEL_WEATHER "weather"
#define EVENT_LEVEL_ECONOMY "economy"
//The threshold of points that we need before attempting to purchase things
-#define POOL_THRESHOLD_MUNDANE 25
-#define POOL_THRESHOLD_MODERATE 50
+#define POOL_THRESHOLD_MUNDANE 20
+#define POOL_THRESHOLD_MODERATE 45
#define POOL_THRESHOLD_MAJOR 90
+#define POOL_THRESHOLD_WEATHER 60
#define POOL_THRESHOLD_ROLESET 120
diff --git a/code/__HELPERS/_global_lists.dm b/code/__HELPERS/_global_lists.dm
index 1b23b255edd..bcbe9b09195 100644
--- a/code/__HELPERS/_global_lists.dm
+++ b/code/__HELPERS/_global_lists.dm
@@ -338,7 +338,7 @@ GLOBAL_LIST_INIT(scary_sounds, list(
GLOB.mannequins_[ckey] = new/mob/living/carbon/human/dummy/mannequin()
. = GLOB.mannequins_[ckey]
-var/global/list/severity_to_string = list("[EVENT_LEVEL_MUNDANE]" = "Mundane", "[EVENT_LEVEL_MODERATE]" = "Moderate", "[EVENT_LEVEL_MAJOR]" = "Major", "[EVENT_LEVEL_ROLESET]" = "Roleset","[EVENT_LEVEL_ECONOMY]" = "Economy")
+var/global/list/severity_to_string = list("[EVENT_LEVEL_MUNDANE]" = "Mundane", "[EVENT_LEVEL_MODERATE]" = "Moderate", "[EVENT_LEVEL_MAJOR]" = "Major", "[EVENT_LEVEL_ROLESET]" = "Roleset", "[EVENT_LEVEL_WEATHER]" = "Weather", "[EVENT_LEVEL_ECONOMY]" = "Economy")
diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm
index 82bc7c8446e..9afdaa5dd41 100644
--- a/code/controllers/configuration/configuration.dm
+++ b/code/controllers/configuration/configuration.dm
@@ -106,6 +106,7 @@
EVENT_LEVEL_MODERATE = null,
EVENT_LEVEL_MAJOR = list("lower" = 48000, "upper" = 60000),
EVENT_LEVEL_ROLESET = null,
+ EVENT_LEVEL_WEATHER = null,
EVENT_LEVEL_ECONOMY = list("lower" = 16000, "upper" = 20000),
)
// The lowest delay until next event
@@ -115,6 +116,7 @@
EVENT_LEVEL_MODERATE = 18000,
EVENT_LEVEL_MAJOR = 30000,
EVENT_LEVEL_ROLESET = null,
+ EVENT_LEVEL_WEATHER = null,
EVENT_LEVEL_ECONOMY = 18000
)
// The upper delay until next event
@@ -124,6 +126,7 @@
EVENT_LEVEL_MODERATE = 27000,
EVENT_LEVEL_MAJOR = 42000,
EVENT_LEVEL_ROLESET = null,
+ EVENT_LEVEL_WEATHER = null,
EVENT_LEVEL_ECONOMY = 18000
)
diff --git a/code/game/antagonist/station/revolutionary/excelsior.dm b/code/game/antagonist/station/revolutionary/excelsior.dm
index 525a6b6e40f..d8f28399a58 100755
--- a/code/game/antagonist/station/revolutionary/excelsior.dm
+++ b/code/game/antagonist/station/revolutionary/excelsior.dm
@@ -38,7 +38,7 @@
/datum/antagonist/excelsior/create_antagonist(datum/mind/target, datum/faction/new_faction, doequip = TRUE, announce = TRUE, update = TRUE, check = TRUE)
. = ..()
BITSET(owner.current?.hud_updateflag, EXCELSIOR_HUD)
- was_centor_spawned = FALSE //[excel_faction.dm]
+ was_centor_spawned = FALSE //When new pack of excels spawn - they must be able to create their own centor
/datum/antagonist/excelsior/remove_antagonist()
BITSET(owner.current?.hud_updateflag, EXCELSIOR_HUD)
diff --git a/code/game/gamemodes/events/apc_damage.dm b/code/game/gamemodes/events/apc_damage.dm
index 84cad35a27f..34c55764dc6 100644
--- a/code/game/gamemodes/events/apc_damage.dm
+++ b/code/game/gamemodes/events/apc_damage.dm
@@ -7,7 +7,7 @@
name = "APC damage"
event_type =/datum/event/apc_damage
- event_pools = list(EVENT_LEVEL_MUNDANE = POOL_THRESHOLD_MUNDANE)
+ event_pools = list(EVENT_LEVEL_MUNDANE = POOL_THRESHOLD_MUNDANE/2)
tags = list(TAG_DESTRUCTIVE, TAG_NEGATIVE)
//////////////////////////////////////////////////////////
diff --git a/code/game/gamemodes/events/blob.dm b/code/game/gamemodes/events/blob.dm
index 39525b1ef90..81bb8a40af6 100644
--- a/code/game/gamemodes/events/blob.dm
+++ b/code/game/gamemodes/events/blob.dm
@@ -15,7 +15,7 @@
event_type = /datum/event/blob
- event_pools = list(EVENT_LEVEL_MAJOR = POOL_THRESHOLD_MAJOR*1.35)
+ event_pools = list(EVENT_LEVEL_MAJOR = POOL_THRESHOLD_MAJOR)
tags = list(TAG_COMBAT, TAG_DESTRUCTIVE, TAG_NEGATIVE)
//============================================
@@ -33,6 +33,7 @@
if(!T)
log_and_message_admins("Blob failed to find a viable turf.")
kill()
+ storyevent.cancel(severity)
return
log_and_message_admins("Blob spawned at \the [get_area(T)]", location = T)
diff --git a/code/game/gamemodes/events/camera_damage.dm b/code/game/gamemodes/events/camera_damage.dm
index 32ea195c7a3..02992b61073 100644
--- a/code/game/gamemodes/events/camera_damage.dm
+++ b/code/game/gamemodes/events/camera_damage.dm
@@ -9,7 +9,7 @@
name = "camera damage"
event_type = /datum/event/camera_damage
- event_pools = list(EVENT_LEVEL_MUNDANE = POOL_THRESHOLD_MUNDANE)
+ event_pools = list(EVENT_LEVEL_MUNDANE = POOL_THRESHOLD_MUNDANE/4)
tags = list(TAG_TARGETED, TAG_DESTRUCTIVE, TAG_NEGATIVE)
/////////.//////////////////////////////////////
diff --git a/code/game/gamemodes/events/dust.dm b/code/game/gamemodes/events/dust.dm
index 7d72d7f505b..192f441e758 100644
--- a/code/game/gamemodes/events/dust.dm
+++ b/code/game/gamemodes/events/dust.dm
@@ -13,7 +13,7 @@ The "dust" will damage the hull of the station causin minor hull breaches.
name = "belt of space dust"
event_type =/datum/event/dust
- event_pools = list(EVENT_LEVEL_MUNDANE = POOL_THRESHOLD_MUNDANE, EVENT_LEVEL_MODERATE = POOL_THRESHOLD_MODERATE)
+ event_pools = list(EVENT_LEVEL_MUNDANE = POOL_THRESHOLD_MUNDANE, EVENT_LEVEL_MODERATE = POOL_THRESHOLD_MODERATE/3, EVENT_LEVEL_MAJOR = POOL_THRESHOLD_MAJOR/3)
tags = list(TAG_DESTRUCTIVE, TAG_NEGATIVE)
@@ -37,7 +37,7 @@ The "dust" will damage the hull of the station causin minor hull breaches.
if(EVENT_LEVEL_MUNDANE)
return "weak"
if(EVENT_LEVEL_MODERATE)
- return prob(80) ? "norm" : "strong"
+ return prob(75) ? "norm" : "strong"
if(EVENT_LEVEL_MAJOR)
return "super"
return "weak"
diff --git a/code/game/gamemodes/events/electrical_storm.dm b/code/game/gamemodes/events/electrical_storm.dm
index f2d45eddf69..0c591aacd81 100644
--- a/code/game/gamemodes/events/electrical_storm.dm
+++ b/code/game/gamemodes/events/electrical_storm.dm
@@ -4,8 +4,8 @@
event_type = /datum/event/electrical_storm
- event_pools = list(EVENT_LEVEL_MUNDANE = POOL_THRESHOLD_MUNDANE,
- EVENT_LEVEL_MODERATE = POOL_THRESHOLD_MODERATE)
+ event_pools = list(EVENT_LEVEL_MUNDANE = POOL_THRESHOLD_MUNDANE/2,
+ EVENT_LEVEL_MODERATE = POOL_THRESHOLD_MODERATE/3)
tags = list(TAG_SCARY, TAG_TARGETED, TAG_NEGATIVE)
diff --git a/code/game/gamemodes/events/gravity.dm b/code/game/gamemodes/events/gravity.dm
index 2347191f5d5..5853bbd22c1 100644
--- a/code/game/gamemodes/events/gravity.dm
+++ b/code/game/gamemodes/events/gravity.dm
@@ -8,7 +8,7 @@
name = "gravity failure"
event_type =/datum/event/gravity
- event_pools = list(EVENT_LEVEL_MUNDANE = POOL_THRESHOLD_MUNDANE*0.8)
+ event_pools = list(EVENT_LEVEL_MUNDANE = POOL_THRESHOLD_MUNDANE)
tags = list(TAG_COMMUNAL)
weight = 0.4 //This is a pain, make it less common
diff --git a/code/game/gamemodes/events/hidden_events/bluespace_crystal_infestation.dm b/code/game/gamemodes/events/hidden_events/bluespace_crystal_infestation.dm
index df3ef182fde..bee658216ea 100644
--- a/code/game/gamemodes/events/hidden_events/bluespace_crystal_infestation.dm
+++ b/code/game/gamemodes/events/hidden_events/bluespace_crystal_infestation.dm
@@ -9,11 +9,11 @@ Additionally, not harvested nest will periodically teleport items and people to
id = "bluespace_crystal_infestation"
name = "bluespace_crystal_infestation"
- weight = 1
+ weight = 0.3
event_type = /datum/event/bluespace_crystal_infestation
event_pools = list(
- EVENT_LEVEL_MODERATE = POOL_THRESHOLD_MODERATE * 1.2
+ EVENT_LEVEL_MODERATE = POOL_THRESHOLD_MODERATE * 0.5
)
tags = list(TAG_POSITIVE)
diff --git a/code/game/gamemodes/events/hidden_events/bluespace_rift.dm b/code/game/gamemodes/events/hidden_events/bluespace_rift.dm
index 2e0eb3c6426..f1f9b42e6f3 100644
--- a/code/game/gamemodes/events/hidden_events/bluespace_rift.dm
+++ b/code/game/gamemodes/events/hidden_events/bluespace_rift.dm
@@ -7,11 +7,11 @@ They are unstable and be used only few times, and after that they die out on bot
id = "bluespace_rift"
name = "bluespace_rift"
- weight = 1
+ weight = 0.3
event_type = /datum/event/bluespace_rift
event_pools = list(
- EVENT_LEVEL_MODERATE = POOL_THRESHOLD_MODERATE * 1.2
+ EVENT_LEVEL_MODERATE = POOL_THRESHOLD_MODERATE * 1
)
tags = list(TAG_POSITIVE)
@@ -23,7 +23,7 @@ They are unstable and be used only few times, and after that they die out on bot
var/rift_number
/datum/event/bluespace_rift/setup()
- pair_number = rand(1, 5)
+ pair_number = rand(3, 8)
rift_number = pair_number * 2
prepare_event_areas(rift_number)
diff --git a/code/game/gamemodes/events/hidden_events/kaiser.dm b/code/game/gamemodes/events/hidden_events/kaiser.dm
index 6fd5c1403f1..876f2e84076 100644
--- a/code/game/gamemodes/events/hidden_events/kaiser.dm
+++ b/code/game/gamemodes/events/hidden_events/kaiser.dm
@@ -13,7 +13,7 @@ It will also bring a hoard of roaches with it.
event_type = /datum/event/kaiser
event_pools = list(
- EVENT_LEVEL_MAJOR = POOL_THRESHOLD_MAJOR * 1.2)
+ EVENT_LEVEL_MAJOR = POOL_THRESHOLD_MAJOR)
tags = list(TAG_COMBAT, TAG_NEGATIVE)
/datum/event/kaiser
diff --git a/code/game/gamemodes/events/hivemind_invasion.dm b/code/game/gamemodes/events/hivemind_invasion.dm
index 97e48d14b35..4b7501fc819 100644
--- a/code/game/gamemodes/events/hivemind_invasion.dm
+++ b/code/game/gamemodes/events/hivemind_invasion.dm
@@ -11,7 +11,7 @@
req_crew = 14
event_type = /datum/event/hivemind
- event_pools = list(EVENT_LEVEL_MAJOR = POOL_THRESHOLD_MAJOR*0.9) //bit more common
+ event_pools = list(EVENT_LEVEL_MAJOR = POOL_THRESHOLD_MAJOR)
tags = list(TAG_COMMUNAL, TAG_DESTRUCTIVE, TAG_NEGATIVE, TAG_SCARY)
//============================================
@@ -31,6 +31,7 @@
if(!start_location && i == 100)
log_and_message_admins("Hivemind failed to find a viable turf.")
kill()
+ storyevent.cancel(severity)
return
if(start_location)
break
diff --git a/code/game/gamemodes/events/infestation.dm b/code/game/gamemodes/events/infestation.dm
index 2540056e84d..21091459b4c 100644
--- a/code/game/gamemodes/events/infestation.dm
+++ b/code/game/gamemodes/events/infestation.dm
@@ -8,13 +8,13 @@ It focuses on spawning large numbers of moderate-to-weak monsters, and includes
id = "infestation"
name = "infestation"
- weight = 2
+ weight = 1.5
//Since it's a large pool of content, infestation has twice the weight of other events
event_type = /datum/event/infestation
- event_pools = list(EVENT_LEVEL_MUNDANE = POOL_THRESHOLD_MUNDANE*1.2,
- EVENT_LEVEL_MODERATE = POOL_THRESHOLD_MODERATE*1.2,
- EVENT_LEVEL_MAJOR = POOL_THRESHOLD_MAJOR*1.2)
+ event_pools = list(EVENT_LEVEL_MUNDANE = POOL_THRESHOLD_MUNDANE*0.75,
+ EVENT_LEVEL_MODERATE = POOL_THRESHOLD_MODERATE*1,
+ EVENT_LEVEL_MAJOR = POOL_THRESHOLD_MAJOR*0.75)
tags = list(TAG_COMBAT, TAG_DESTRUCTIVE, TAG_NEGATIVE)
//============================================
diff --git a/code/game/gamemodes/events/ion_storm.dm b/code/game/gamemodes/events/ion_storm.dm
index 4ebd64d4e95..7989cc49bcb 100644
--- a/code/game/gamemodes/events/ion_storm.dm
+++ b/code/game/gamemodes/events/ion_storm.dm
@@ -8,7 +8,7 @@
event_type = /datum/event/ionstorm
- event_pools = list(EVENT_LEVEL_MODERATE = POOL_THRESHOLD_MODERATE)
+ event_pools = list(EVENT_LEVEL_MODERATE = POOL_THRESHOLD_MODERATE/1.5)
tags = list(TAG_SCARY, TAG_COMMUNAL)
/////////////////////
diff --git a/code/game/gamemodes/events/meteors.dm b/code/game/gamemodes/events/meteors.dm
index 1130c73f341..50d4519dec4 100644
--- a/code/game/gamemodes/events/meteors.dm
+++ b/code/game/gamemodes/events/meteors.dm
@@ -1,5 +1,5 @@
/*
- Meteors damage the station and the shields
+ Meteors damage the ship and the shields
*/
/datum/storyevent/meteor
id = "meteor"
diff --git a/code/game/gamemodes/events/nothing.dm b/code/game/gamemodes/events/nothing.dm
deleted file mode 100644
index 823fa74e94f..00000000000
--- a/code/game/gamemodes/events/nothing.dm
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- A storyevent that does nothing.
- Sometimes nothing happening is an interesting change of pace
-*/
-/datum/storyevent/nothing
- id = "nothing"
- name = "nothing"
- weight = 2
- event_type = /datum/event/nothing
- event_pools = list(EVENT_LEVEL_MUNDANE = POOL_THRESHOLD_MUNDANE,
- EVENT_LEVEL_MODERATE = POOL_THRESHOLD_MODERATE,
- EVENT_LEVEL_MAJOR = POOL_THRESHOLD_MAJOR)
-
- tags = list()
\ No newline at end of file
diff --git a/code/game/gamemodes/events/rogue_drones.dm b/code/game/gamemodes/events/rogue_drones.dm
index 3f0cc724251..673a60a488d 100644
--- a/code/game/gamemodes/events/rogue_drones.dm
+++ b/code/game/gamemodes/events/rogue_drones.dm
@@ -8,7 +8,7 @@
name = "rogue drone"
event_type =/datum/event/rogue_drone
- event_pools = list(EVENT_LEVEL_MODERATE = POOL_THRESHOLD_MODERATE)
+ event_pools = list(EVENT_LEVEL_MODERATE = POOL_THRESHOLD_MODERATE/1.5)
tags = list(TAG_COMMUNAL, TAG_COMBAT, TAG_DESTRUCTIVE, TAG_SCARY, TAG_EXTERNAL)
//////////////////////////////////////////////////////////
diff --git a/code/game/gamemodes/events/shipping_error.dm b/code/game/gamemodes/events/shipping_error.dm
index 7cb66a4beb4..cfd1ac5e562 100644
--- a/code/game/gamemodes/events/shipping_error.dm
+++ b/code/game/gamemodes/events/shipping_error.dm
@@ -7,7 +7,7 @@
name = "shipping error"
event_type = /datum/event/shipping_error
- event_pools = list(EVENT_LEVEL_MUNDANE = POOL_THRESHOLD_MUNDANE*0.3) //Low cost since its a really minor thing
+ event_pools = list(EVENT_LEVEL_MUNDANE = POOL_THRESHOLD_MUNDANE*0.25) //Low cost since its a really minor thing
tags = list(TAG_TARGETED, TAG_POSITIVE)
diff --git a/code/game/gamemodes/events/space_weather.dm b/code/game/gamemodes/events/space_weather.dm
index 5c48e2ea237..c3684958767 100644
--- a/code/game/gamemodes/events/space_weather.dm
+++ b/code/game/gamemodes/events/space_weather.dm
@@ -1,13 +1,15 @@
/datum/storyevent/bluespace_storm
id = "bluespace_storm"
name = "Bluespace storm"
- weight = 0.1
- occurrences_max = 1
+ weight = 1
event_type = /datum/event/bluespace_storm
parallel = FALSE
- event_pools = list(EVENT_LEVEL_MUNDANE = POOL_THRESHOLD_MUNDANE, EVENT_LEVEL_MODERATE = POOL_THRESHOLD_MODERATE)
+ event_pools = list(EVENT_LEVEL_WEATHER = POOL_THRESHOLD_WEATHER)
tags = list(TAG_SCARY, TAG_NEGATIVE)
+/datum/storyevent/bluespace_storm/get_special_weight() //primitive rotation system
+ return weight / 1 + occurrences
+
/datum/event/bluespace_storm
startWhen = 1
announceWhen = 5
@@ -34,13 +36,15 @@
/datum/storyevent/ion_blizzard
id = "ion_blizzard"
name = "Ion blizzard"
- weight = 0.1
- occurrences_max = 1
+ weight = 1
event_type = /datum/event/ion_blizzard
parallel = FALSE
- event_pools = list(EVENT_LEVEL_MUNDANE = POOL_THRESHOLD_MUNDANE, EVENT_LEVEL_MODERATE = POOL_THRESHOLD_MODERATE)
+ event_pools = list(EVENT_LEVEL_WEATHER = POOL_THRESHOLD_WEATHER)
tags = list(TAG_SCARY, TAG_NEGATIVE)
+/datum/storyevent/ion_blizzard/get_special_weight()
+ return weight / 1 + occurrences
+
/datum/event/ion_blizzard
startWhen = 1
announceWhen = 3
@@ -72,13 +76,15 @@
/datum/storyevent/photon_vortex
id = "photon_vortex"
name = "Photon vortex"
- weight = 0.05
- occurrences_max = 1
+ weight = 1
event_type = /datum/event/photon_vortex
parallel = FALSE
- event_pools = list(EVENT_LEVEL_MUNDANE = POOL_THRESHOLD_MUNDANE, EVENT_LEVEL_MODERATE = POOL_THRESHOLD_MODERATE)
+ event_pools = list(EVENT_LEVEL_WEATHER = POOL_THRESHOLD_WAETHER)
tags = list(TAG_SCARY, TAG_NEGATIVE)
+/datum/storyevent/photon_vortex/get_special_weight()
+ return weight / 1 + occurrences
+
/datum/event/photon_vortex
startWhen = 1
announceWhen = 2
@@ -123,13 +129,15 @@
/datum/storyevent/harmonic_feedback
id = "harmonic_feedback_surge"
name = "Harmonic feedback surge anomaly"
- weight = 0.1
- occurrences_max = 1
+ weight = 1
event_type = /datum/event/harmonic_feedback
parallel = FALSE
- event_pools = list(EVENT_LEVEL_MUNDANE = POOL_THRESHOLD_MUNDANE, EVENT_LEVEL_MODERATE = POOL_THRESHOLD_MODERATE)
+ event_pools = list(EVENT_LEVEL_WEATHER = POOL_THRESHOLD_WEATHER)
tags = list(TAG_DESTRUCTIVE, TAG_NEGATIVE)
+/datum/storyevent/harmonic_feedback/get_special_weight() //primitive rotation system
+ return weight / 1 + occurrences
+
/datum/event/harmonic_feedback
startWhen = 1
announceWhen = 3
@@ -156,13 +164,15 @@
/datum/storyevent/micro_debris
id = "micro_debris"
name = "micro debris field"
- weight = 0.1
- occurrences_max = 1
+ weight = 1
parallel = FALSE
event_type = /datum/event/micro_debris
- event_pools = list(EVENT_LEVEL_MUNDANE = POOL_THRESHOLD_MUNDANE, EVENT_LEVEL_MODERATE = POOL_THRESHOLD_MODERATE)
+ event_pools = list(EVENT_LEVEL_WEATHER = POOL_THRESHOLD_WEATHER)
tags = list(TAG_DESTRUCTIVE, TAG_NEGATIVE)
+/datum/storyevent/micro_debris/get_special_weight() //primitive rotation system
+ return weight / 1 + occurrences
+
/datum/event/micro_debris
startWhen = 1
announceWhen = 2
@@ -200,13 +210,15 @@
/datum/storyevent/graveyard
id = "graveyard"
name = "Space Graveryard"
- weight = 0.1
- occurrences_max = 1
+ weight = 1
parallel = FALSE
event_type = /datum/event/graveyard
- event_pools = list(EVENT_LEVEL_MUNDANE = POOL_THRESHOLD_MUNDANE, EVENT_LEVEL_MODERATE = POOL_THRESHOLD_MODERATE)
+ event_pools = list(EVENT_LEVEL_WEATHER = POOL_THRESHOLD_WEATHER)
tags = list(TAG_SCARY, TAG_NEGATIVE)
+/datum/storyevent/graveyard/get_special_weight() //primitive rotation system
+ return weight / 1 + occurrences
+
/datum/event/graveyard
startWhen = 1
announceWhen = 3
@@ -243,7 +255,30 @@
"Our food and water supplies are going to run out soon. We have money. Just help us, anyone, please...",
"TO ANYONE STILL LOYAL LEFT, WE MAKE OUR FINAL STAND IN THE CONTROL ROOM.",
"Weld the vents. Weld The vents! WELD THE VENTS!!",
- "Security is... All gone. With medical bay soon to follow. These abominations know nothing but hunger, consumed most of our crew, and yet they remain unsatiated... Do not try to help in any way. This station is a lost cause."
+ "Security is... All gone. With medical bay soon to follow. These abominations know nothing but hunger, consumed most of our crew, and yet they remain unsatiated... Do not try to help in any way. This station is a lost cause.",
+ "It's growing larger! Bring the flamethrowers here NOW!",
+ "Turn the power back on. We can still recover from this.",
+ "Where are you going?",
+ "Hello?",
+ "Hello? Is anyone there?",
+ "We NEED your help!",
+ "WE are DYING out here! PLEASE, HELP!",
+ "HELP ME!",
+ "IT'S CHASING ME!",
+ "RUN. NOW.",
+ "It doesn't sound like a human.",
+ "I think it heard me...",
+ "This monster can mimick our voices... With intent. It can make sentences as a normal human would. It could be anyone!",
+ "Captain Flintlock is NOT dead yet! STAND AND FIGHT!",
+ "The suspect is armed with a [pick(list("bomb detonator", "rifle", "chainsaw", "knife", "laser rifle", "sniper rifle", "banana peel", "shotgun"))]!",
+ "We had to leave those bodies... Infection is spreading. We will die, but in this case it won't reach outwards.",
+ "I've stopped working on a cure. I know it's impossible to fight this thing now. But at least that's the last thing I tried to do in my pity life...",
+ "I am surrounded by brilliant computers and equipment. Yet none of these can save us from a gang of hungry madmen breaching through lab's airlock. Ironic...",
+ "We've been mobilized to fight against unknown amount of targets. These stupid labcoats can't even define what these \"creatures\" are...",
+ "What do you mean it killed all [rand(20, 100)] crewmen?!",
+ "This thing... You won't even have time to blink, you'll be a goner.",
+ "I-it can't be that effective at killing... To think this was made by nature?! What if alien race made it..?",
+ "The testing is OUT OF CONTROL! INITIATE THE SHUTDOWN! QUARANTINE IT NO-"
)
GLOB.announcer.autosay(pick(message_list), "Emergency Broadcast")
@@ -259,13 +294,15 @@
/datum/storyevent/nebula
id = "nebula"
name = "Dark matter nebula"
- weight = 0.1
- occurrences_max = 1
+ weight = 1
parallel = FALSE
event_type = /datum/event/nebula
- event_pools = list(EVENT_LEVEL_MUNDANE = POOL_THRESHOLD_MUNDANE, EVENT_LEVEL_MODERATE = POOL_THRESHOLD_MODERATE)
+ event_pools = list(EVENT_LEVEL_WEATHER = POOL_THRESHOLD_WEATHER)
tags = list(TAG_SCARY, TAG_NEGATIVE)
+/datum/storyevent/nebula/get_special_weight()
+ return weight / 1 + occurrences
+
/datum/event/nebula
startWhen = 1
announceWhen = 3
@@ -289,13 +326,15 @@
/datum/storyevent/interphase
id = "bluespace_interphase"
name = "Bluespace Interphase"
- weight = 0.1
- occurrences_max = 1
+ weight = 0.25
parallel = FALSE
event_type = /datum/event/interphase
- event_pools = list(EVENT_LEVEL_MODERATE = POOL_THRESHOLD_MODERATE, EVENT_LEVEL_MAJOR = POOL_THRESHOLD_MAJOR)
+ event_pools = list(EVENT_LEVEL_WEATHER = POOL_THRESHOLD_WEATHER)
tags = list(TAG_SCARY, TAG_NEGATIVE)
+/datum/storyevent/interphase/get_special_weight()
+ return weight / 1 + occurrences
+
/datum/event/interphase
startWhen = 1
announceWhen = 3
diff --git a/code/game/gamemodes/events/spider_infestation.dm b/code/game/gamemodes/events/spider_infestation.dm
index 8377007e845..e6663f422fb 100644
--- a/code/game/gamemodes/events/spider_infestation.dm
+++ b/code/game/gamemodes/events/spider_infestation.dm
@@ -10,10 +10,10 @@
id = "spider_infestation"
name = "spider infestation"
- weight = 0.6
+ weight = 0.75
event_type = /datum/event/spider_infestation
- event_pools = list(EVENT_LEVEL_MODERATE = POOL_THRESHOLD_MODERATE*1.1)
+ event_pools = list(EVENT_LEVEL_MODERATE = POOL_THRESHOLD_MODERATE/1.5)
tags = list(TAG_COMBAT, TAG_NEGATIVE, TAG_SCARY, TAG_COMMUNAL)
////////////////////////////////////////////////////////////////////////////
diff --git a/code/game/gamemodes/events/supply_pod.dm b/code/game/gamemodes/events/supply_pod.dm
index 2190bbd48d3..8f53e7b2cc4 100644
--- a/code/game/gamemodes/events/supply_pod.dm
+++ b/code/game/gamemodes/events/supply_pod.dm
@@ -14,7 +14,7 @@
name = "supply pod"
weight = 0.75
event_type = /datum/event/supply_pod
- event_pools = list(EVENT_LEVEL_MAJOR = POOL_THRESHOLD_MAJOR*1.2) //Slightly higher cost than other major events
+ event_pools = list(EVENT_LEVEL_MAJOR = POOL_THRESHOLD_MAJOR*0.75)
tags = list(TAG_DESTRUCTIVE, TAG_POSITIVE, TAG_COMBAT, TAG_EXTERNAL)
diff --git a/code/game/gamemodes/roleset/faction/excelsior.dm b/code/game/gamemodes/roleset/faction/excelsior.dm
index b0cbb790082..6d52c7ae0eb 100755
--- a/code/game/gamemodes/roleset/faction/excelsior.dm
+++ b/code/game/gamemodes/roleset/faction/excelsior.dm
@@ -14,9 +14,11 @@
req_crew = 6
leaders = -1 //Every excelsior spawned directly is a leader. Non leaders are those recruited during gameplay
-/datum/storyevent/roleset/faction/excelsior/can_trigger(severity, report)
+/datum/storyevent/roleset/faction/excelsior/can_trigger(severity, report, manual)
if(excelsior_centor)
+ if (report)
+ to_chat(report, span_notice("Failure: Centor already exists"))
return FALSE
- if(!..(severity, report))
+ if(!..(severity, report, manual))
return FALSE
return TRUE
diff --git a/code/game/gamemodes/roleset/faction/roleset_faction.dm b/code/game/gamemodes/roleset/faction/roleset_faction.dm
index 38f5d910c9b..5d3cc0dd0ee 100755
--- a/code/game/gamemodes/roleset/faction/roleset_faction.dm
+++ b/code/game/gamemodes/roleset/faction/roleset_faction.dm
@@ -10,7 +10,7 @@
var/faction_type = null
//This is a copypaste of roleset/trigger_event, with some new features added
-/datum/storyevent/roleset/faction/trigger_event()
+/datum/storyevent/roleset/faction/trigger_event(severity = EVENT_LEVEL_ROLESET)
calc_target_quantity()
var/datum/antagonist/antag = GLOB.all_antag_types[role_id]
//Find the faction first, create it if it doesnt exist
diff --git a/code/game/gamemodes/roleset/roleset.dm b/code/game/gamemodes/roleset/roleset.dm
index 816bd8bab1d..1428a2eee68 100755
--- a/code/game/gamemodes/roleset/roleset.dm
+++ b/code/game/gamemodes/roleset/roleset.dm
@@ -20,7 +20,7 @@
//Whenever we ask a player to become this antag but they decline, they will be recorded here.
//They will not be asked again until a certain time has passed
var/list/request_log = list()
- var/request_timeout = 60 MINUTES
+ var/request_timeout = 15 MINUTES
var/list/opt_out_log = list() // For players who opted out of role when prompted
//Transient vars, these are specific to one triggering of the event
@@ -241,7 +241,7 @@
//We will now refund part of the cost
var/success_percent = 0
- if (success_quantity > 1)
+ if (success_quantity >= 1)
success_percent = success_quantity / target_quantity
cancel(severity, success_percent)
@@ -252,7 +252,7 @@
return FALSE
//Tests if its possible for us to trigger, by compiling candidate lists but doing nothing with them
-/datum/storyevent/roleset/can_trigger(severity = EVENT_LEVEL_ROLESET, report)
+/datum/storyevent/roleset/can_trigger(severity = EVENT_LEVEL_ROLESET, report, manual)
var/list/possible_candidates = list()
if(GLOB.outer_antag_types[role_id])
possible_candidates = ghost_candidates_list(role_id, FALSE, report) //We set act check to false so it doesn't ask ghosts
diff --git a/code/game/gamemodes/roleset/simple.dm b/code/game/gamemodes/roleset/simple.dm
index aa7cfdad40b..3ed2b97c120 100644
--- a/code/game/gamemodes/roleset/simple.dm
+++ b/code/game/gamemodes/roleset/simple.dm
@@ -62,7 +62,7 @@
//Requires at least one antag to serve as a target
//Also requires the candidate to have a cruciform, that is handled seperately in antagonist/station/inquisitor.dm
-/datum/storyevent/roleset/inquisitor/can_trigger(severity, report)
+/datum/storyevent/roleset/inquisitor/can_trigger(severity, report, manual)
var/a_count = 0
@@ -99,7 +99,7 @@
req_crew = 10
event_pools = list(EVENT_LEVEL_ROLESET = -30) //This is an antitag, it has a negative cost to allow more antags to exist
-/datum/storyevent/roleset/marshal/can_trigger(severity, report)
+/datum/storyevent/roleset/marshal/can_trigger(severity, report, manual)
var/a_count = 0
for(var/datum/antagonist/A in GLOB.current_antags)
if(!A.is_dead())
diff --git a/code/game/gamemodes/storyevent.dm b/code/game/gamemodes/storyevent.dm
index 6fca4b14ddb..6818e67cc0f 100644
--- a/code/game/gamemodes/storyevent.dm
+++ b/code/game/gamemodes/storyevent.dm
@@ -53,6 +53,7 @@
//EVENT_LEVEL_MUNDANE
//EVENT_LEVEL_MODERATE
//EVENT_LEVEL_MAJOR
+ //EVENT_LEVEL_WEATHER
//EVENT_LEVEL_ROLESET
//EVENT_LEVEL_ECONOMY (not implemented)
@@ -62,10 +63,12 @@
//Tags that describe what the event does. See __defines/storyteller.dm for a list
var/list/tags = list()
+ //var/cost what exactly that does?
+
//Check if we can trigger
-/datum/storyevent/proc/can_trigger(severity, mob/report, manual)
+/datum/storyevent/proc/can_trigger(severity, report, manual) //Put report on "world" to see full listing of storyteller actions
.=TRUE
if (!enabled)
if (report) to_chat(report, span_notice("Failure: The event is disabled"))
@@ -80,6 +83,7 @@
return FALSE
if(!manual && GLOB.storyteller.calculate_event_cost(src, severity) > GLOB.storyteller.points[severity])
+ if (report) to_chat(report, span_notice("Failure: Not enough points. [GLOB.storyteller.points[severity]]/[GLOB.storyteller.calculate_event_cost(src, severity)] (Event was: [src.name])"))
return FALSE
//IF this is a wrapper for a random event, we'll check if that event can trigger
@@ -110,7 +114,10 @@
/datum/storyevent/proc/cancel(type, completion = 0)
//This proc refunds the cost of this event
if (GLOB.storyteller)
- GLOB.storyteller.modify_points(get_cost(type)*(1 - completion), type)
+ var/refund_value = get_cost(type)*(1 - completion)
+ if(GLOB.storyteller.debug_mode)
+ message_admins("Refunding [refund_value] points to [type]")
+ GLOB.storyteller.modify_points(refund_value, type)
/datum/storyevent/proc/trigger_event(severity = EVENT_LEVEL_MUNDANE)
if (event_type)
@@ -159,4 +166,4 @@
return max(mod-(abs(val-req)**2),0)/mod
/datum/storyevent/proc/get_cost(event_type)
- return max(event_pools[event_type] * GLOB.storyteller.repetition_multiplier ** occurrences, 1)
+ return event_pools[event_type]
diff --git a/code/game/gamemodes/storyteller.dm b/code/game/gamemodes/storyteller.dm
index fc5f069bf60..d79966664fb 100644
--- a/code/game/gamemodes/storyteller.dm
+++ b/code/game/gamemodes/storyteller.dm
@@ -34,10 +34,11 @@ GLOBAL_VAR_INIT(chaos_level, 1) //Works as global multiplier for all storyteller
//Set values here for starting points
var/list/points = list(
- EVENT_LEVEL_MUNDANE = 0, //Mundane
- EVENT_LEVEL_MODERATE = 0, //Moderate
- EVENT_LEVEL_MAJOR = 0, //Major
- EVENT_LEVEL_ROLESET = 110 //Roleset
+ EVENT_LEVEL_MUNDANE = 0, //Mundane
+ EVENT_LEVEL_MODERATE = 0, //Moderate
+ EVENT_LEVEL_MAJOR = 0, //Major
+ EVENT_LEVEL_ROLESET = 110, //Roleset
+ EVENT_LEVEL_WEATHER = 30 //Space weather
)
//Lists of events. These are built dynamically at runtime
@@ -45,6 +46,7 @@ GLOBAL_VAR_INIT(chaos_level, 1) //Works as global multiplier for all storyteller
var/list/event_pool_moderate = list()
var/list/event_pool_major = list()
var/list/event_pool_roleset = list()
+ var/list/event_pool_weather = list()
//Configuration:
//Things you can set to make a new storyteller
@@ -52,14 +54,14 @@ GLOBAL_VAR_INIT(chaos_level, 1) //Works as global multiplier for all storyteller
var/gain_mult_moderate = 1
var/gain_mult_major = 1
var/gain_mult_roleset = 1
+ var/gain_mult_weather = 1
var/list/tag_weight_mults = list()
var/list/tag_cost_mults = list()
- var/variance = 0.15 //15% How much point gains are allowed to vary up or down per tick. This helps to keep event triggering times unpredictable
- var/repetition_multiplier = 1.85 //Weights of events are multiplied by this value after they happen, to reduce the chance of multiple instances in short time
+ var/variance = 15 //15% How much point gains are allowed to vary up or down per tick. This helps to keep event triggering times unpredictable
- var/event_schedule_delay = 5 MINUTES
+ var/event_schedule_delay = 3 MINUTES
//Once selected, events are not fired immediately, but are scheduled for some random time in the near future
//This mostly helps to prevent them syncing up and announcements overlapping each other
//The maximum time between scheduling and firing an event
@@ -229,30 +231,34 @@ GLOBAL_VAR_INIT(chaos_level, 1) //Works as global multiplier for all storyteller
points[a] += delta
/datum/storyteller/proc/handle_points()
- points[EVENT_LEVEL_MUNDANE] += GLOB.chaos_level * (gain_mult_mundane) * (RAND_DECIMAL(1-variance, 1+variance))
- points[EVENT_LEVEL_MODERATE] += GLOB.chaos_level * (gain_mult_moderate) * (RAND_DECIMAL(1-variance, 1+variance))
- points[EVENT_LEVEL_MAJOR] += GLOB.chaos_level * (gain_mult_major) * (RAND_DECIMAL(1-variance, 1+variance))
- points[EVENT_LEVEL_ROLESET] += GLOB.chaos_level * (gain_mult_roleset) * (RAND_DECIMAL(1-variance, 1+variance))
+ points[EVENT_LEVEL_MUNDANE] += GLOB.chaos_level * (gain_mult_mundane) * rand(100-variance, 100+variance)/100
+ points[EVENT_LEVEL_MODERATE] += GLOB.chaos_level * (gain_mult_moderate) * rand(100-variance, 100+variance)/100
+ points[EVENT_LEVEL_MAJOR] += GLOB.chaos_level * (gain_mult_major) * rand(100-variance, 100+variance)/100
+ points[EVENT_LEVEL_ROLESET] += GLOB.chaos_level * (gain_mult_roleset) * rand(100-variance, 100+variance)/100
+ points[EVENT_LEVEL_WEATHER] += GLOB.chaos_level * (gain_mult_weather) * rand(100-variance, 100+variance)/100
check_thresholds()
/datum/storyteller/proc/check_thresholds()
while (points[EVENT_LEVEL_MUNDANE] >= POOL_THRESHOLD_MUNDANE)
- if (!handle_event(EVENT_LEVEL_MUNDANE))
- //This returns false if no viable events
- break
+ while (handle_event(EVENT_LEVEL_MUNDANE))
+ continue
while (points[EVENT_LEVEL_MODERATE] >= POOL_THRESHOLD_MODERATE)
- if (!handle_event(EVENT_LEVEL_MODERATE))
- break
+ while (handle_event(EVENT_LEVEL_MODERATE))
+ continue
while (points[EVENT_LEVEL_MAJOR] >= POOL_THRESHOLD_MAJOR)
- if (!handle_event(EVENT_LEVEL_MAJOR))
- break
+ while (handle_event(EVENT_LEVEL_MAJOR))
+ continue
//No loop for roleset events to prevent possible wierdness like the same player being picked twice
if(points[EVENT_LEVEL_ROLESET] >= POOL_THRESHOLD_ROLESET)
handle_event(EVENT_LEVEL_ROLESET)
+ //No loop for weather events to prevent possible attempts of weather overlapping
+ if(points[EVENT_LEVEL_WEATHER] >= POOL_THRESHOLD_WEATHER)
+ handle_event(EVENT_LEVEL_WEATHER)
+
@@ -275,6 +281,8 @@ GLOBAL_VAR_INIT(chaos_level, 1) //Works as global multiplier for all storyteller
temp_pool = event_pool_major.Copy()
if (EVENT_LEVEL_ROLESET)
temp_pool = event_pool_roleset.Copy()
+ if (EVENT_LEVEL_WEATHER)
+ temp_pool = event_pool_weather.Copy()
if (!temp_pool || !temp_pool.len)
return FALSE
@@ -301,7 +309,11 @@ GLOBAL_VAR_INIT(chaos_level, 1) //Works as global multiplier for all storyteller
//If it is allowed to run, we'll deduct its cost from our appropriate point score, and schedule it for triggering
var/cost = calculate_event_cost(choice, event_type)
points[event_type] -= cost
+ if(GLOB.storyteller.debug_mode)
+ message_admins("Spending [cost] points!")
schedule_event(choice, event_type)
+ if(GLOB.storyteller.debug_mode)
+ message_admins("Bought [event_type] choosing [choice] for [cost] points.")
return TRUE
//When its trigger time comes, the event will once again check if it can run
@@ -313,7 +325,7 @@ GLOBAL_VAR_INIT(chaos_level, 1) //Works as global multiplier for all storyteller
The actual fire event proc is located in storyteller_meta*/
/datum/storyteller/proc/schedule_event(datum/storyevent/C, event_type)
var/delay
- if (event_type == EVENT_LEVEL_ROLESET)
+ if (event_type == EVENT_LEVEL_ROLESET || event_type == EVENT_LEVEL_WEATHER)
delay = 1 //Basically no delay on these to reduce bugginess
else
delay = rand(1, event_schedule_delay)
@@ -331,6 +343,7 @@ The actual fire event proc is located in storyteller_meta*/
event_pool_moderate.Cut()
event_pool_major.Cut()
event_pool_roleset.Cut()
+ event_pool_weather.Cut()
for (var/datum/storyevent/a in storyevents)
@@ -350,6 +363,8 @@ The actual fire event proc is located in storyteller_meta*/
event_pool_major[a] = new_weight
if (EVENT_LEVEL_ROLESET in a.event_pools)
event_pool_roleset[a] = new_weight
+ if (EVENT_LEVEL_WEATHER in a.event_pools)
+ event_pool_weather[a] = new_weight
/datum/storyteller/proc/update_event_weights()
@@ -357,6 +372,7 @@ The actual fire event proc is located in storyteller_meta*/
event_pool_moderate = update_pool_weights(event_pool_moderate)
event_pool_major = update_pool_weights(event_pool_major)
event_pool_roleset = update_pool_weights(event_pool_roleset)
+ event_pool_weather = update_pool_weights(event_pool_weather)
/datum/storyteller/proc/update_pool_weights(list/pool)
for(var/datum/storyevent/a in pool)
diff --git a/code/game/gamemodes/storyteller_helpers.dm b/code/game/gamemodes/storyteller_helpers.dm
index 7bca23acc44..97ea32bbc74 100644
--- a/code/game/gamemodes/storyteller_helpers.dm
+++ b/code/game/gamemodes/storyteller_helpers.dm
@@ -117,6 +117,8 @@
return EVENT_LEVEL_MAJOR
if (EVENT_LEVEL_MAJOR)
return EVENT_LEVEL_ROLESET
+ if (EVENT_LEVEL_ROLESET)
+ return EVENT_LEVEL_WEATHER
return input
diff --git a/code/game/gamemodes/storyteller_meta.dm b/code/game/gamemodes/storyteller_meta.dm
index ed6d61b1e51..d04298cdf75 100644
--- a/code/game/gamemodes/storyteller_meta.dm
+++ b/code/game/gamemodes/storyteller_meta.dm
@@ -24,7 +24,7 @@ var/global/list/scheduled_events = list()
//This is a global thing so that scheduled events won't get lost in a storyteller change
/proc/fire_event(datum/storyevent/C, event_type)
- if(!C.can_trigger(event_type))
+ if(!C.can_trigger(event_type, manual = TRUE)) //manual setting set ture because it's for some reason called AFTER points were spent
//Something has changed, it was valid before but not now
//This shouldnt happen often
//We will refund its cost and abort
diff --git a/code/game/gamemodes/storyteller_print.dm b/code/game/gamemodes/storyteller_print.dm
index 0927fbfc496..405a5ad9616 100644
--- a/code/game/gamemodes/storyteller_print.dm
+++ b/code/game/gamemodes/storyteller_print.dm
@@ -89,6 +89,7 @@
data += "
Moderate: [round(points[EVENT_LEVEL_MODERATE], 0.1)] / [POOL_THRESHOLD_MODERATE] \[ADD\]"
data += "
Major: [round(points[EVENT_LEVEL_MAJOR], 0.1)] / [POOL_THRESHOLD_MAJOR] \[ADD\]"
data += "
Roleset: [round(points[EVENT_LEVEL_ROLESET], 0.1)] / [POOL_THRESHOLD_ROLESET] \[ADD\]"
+ data += "
Weather: [round(points[EVENT_LEVEL_WEATHER], 0.1)] / [POOL_THRESHOLD_WEATHER] \[ADD\]"
data += ""
data += "