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 += "
" @@ -131,12 +132,12 @@ //This complex block will print out all the events with various info var/severity = EVENT_LEVEL_MUNDANE - for(var/list/L in list(event_pool_mundane, event_pool_moderate, event_pool_major, event_pool_roleset)) + for(var/list/L in list(event_pool_mundane, event_pool_moderate, event_pool_major, event_pool_roleset, event_pool_weather)) data += "|[severity_to_string[severity]] events:" data += "|Points: [points[severity]]" data += "