diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm
index a49b96574a..e9a2f0b221 100644
--- a/code/__HELPERS/roundend.dm
+++ b/code/__HELPERS/roundend.dm
@@ -341,6 +341,7 @@
shit += "
Drugs Snorted: [snort]"
shit += "
Beards Shaved: [beardshavers]"
shit += "
Pleasures: [cums]"
+ shit += "
Round Aspect: [round_aspect.name]"
// if(cuckers.len)
// shit += "
Adulterers: "
// for(var/x in cuckers.len)
diff --git a/code/controllers/subsystem/rogue/treasury.dm b/code/controllers/subsystem/rogue/treasury.dm
index 6745229a35..662591d085 100644
--- a/code/controllers/subsystem/rogue/treasury.dm
+++ b/code/controllers/subsystem/rogue/treasury.dm
@@ -44,7 +44,12 @@ SUBSYSTEM_DEF(treasury)
/datum/controller/subsystem/treasury/Initialize()
//Randomizes the roundstart amount of money and the queens tax.
- treasury_value = rand(800,1500)
+ if(aspect_chosen(/datum/round_aspect/fulltreasury))
+ treasury_value = 2500
+ else if(aspect_chosen(/datum/round_aspect/emptytreasury))
+ treasury_value = 100
+ else
+ treasury_value = rand(800,1500)
queens_tax = pick(0.09, 0.15, 0.21, 0.30)
//For the merchants import and export.
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index 364c34aaef..8877087d45 100644
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -19,6 +19,8 @@ SUBSYSTEM_DEF(ticker)
var/hide_mode = 0
var/datum/game_mode/mode = null
+ var/datum/round_aspect/round_aspect = null
+ var/forcing_aspect = FALSE
var/login_music //music played in pregame lobby
var/round_end_sound //music/jingle played when the world reboots
@@ -327,6 +329,16 @@ SUBSYSTEM_DEF(ticker)
var/isroguefight = FALSE
var/isrogueworld = FALSE
+/datum/controller/subsystem/ticker/proc/pickaspect()
+ if(!forcing_aspect)
+ var/list/possibilities = list()
+ for(var/thing in subtypesof(/datum/round_aspect))//Populate possible aspects list.
+ var/datum/round_aspect/A = thing
+ possibilities += A
+ var/chosen = pick(possibilities)
+ round_aspect = new chosen
+ round_aspect.apply()
+
/datum/controller/subsystem/ticker/proc/setup()
message_admins("Starting game...")
var/init_start = world.timeofday
@@ -471,9 +483,20 @@ SUBSYSTEM_DEF(ticker)
// SSshuttle.emergency.setTimer(ROUNDTIMERBOAT)
SSdbcore.SetRoundStart()
+#ifndef TESTING
+ pickaspect()
+#endif
message_admins("Welcome to [station_name()], enjoy your stay!")
+ spawn(10)
+ if(round_aspect.sekrit)
+ to_chat(world, "This round's aspect is: Nothing!")
+ to_chat(world, "Normality above all.")
+ else
+ to_chat(world, "This round's aspect is: [round_aspect.name]")
+ to_chat(world, "[round_aspect.description]")
+
for(var/client/C in GLOB.clients)
if(C.mob == SSticker.rulermob)
C.mob.playsound_local(C.mob, 'sound/misc/royal_roundstart.ogg', 100, FALSE)
diff --git a/code/datums/round_aspects.dm b/code/datums/round_aspects.dm
new file mode 100644
index 0000000000..67b52b6c94
--- /dev/null
+++ b/code/datums/round_aspects.dm
@@ -0,0 +1,75 @@
+/datum/round_aspect
+ var/name = "Round Aspect"
+ var/description = "Uh oh."
+ var/sekrit = FALSE // dictates whether the aspect should be revealed on round start. if FALSE it will be only revealed after the round has ended
+
+ // Yup, that's all they are. They're basically just hollow shells and don't do much by themselves.
+
+/datum/round_aspect/proc/apply() // Instant thing that happens when it's chosen. Used for aspects that change one single var
+ return
+
+/proc/aspect_chosen(datum/round_aspect/aspect) // use to check if an aspects chosen
+ if(istype(SSticker.round_aspect, aspect))
+ return TRUE
+
+/datum/round_aspect/normal
+ name = "Nothing!"
+ description = "Normality above all."
+
+/datum/round_aspect/strongbums // these arent bums. these are fraggers.
+ name = "Strong Beggars"
+ description = "Life on the streets requires a lot of physical work, y'know."
+
+/datum/round_aspect/kingforareason
+ name = "King for a Reason"
+ description = "The previous ruler's reign was cut unfortunately short after his throat was ripped out. Praise be the new King!"
+
+/datum/round_aspect/somethinginthewater
+ name = "Something in the Water"
+ description = "You feel just a little bit dumber."
+
+/datum/round_aspect/merchanthoarder
+ name = "Greedy Bastard"
+ description = "The merchant is just a little bit more greedy than usual."
+
+/datum/round_aspect/favorsintherightplaces
+ name = "Favors in the Right Places"
+ description = "The merchant knows how to exploit people, the balloon is faster."
+
+/datum/round_aspect/sexless
+ name = "Sexless"
+ description = "Everyone in the town is a virgin due to a rumor of a 'Lover's Plague', strange."
+
+/datum/round_aspect/fulltreasury
+ name = "Full Treasury"
+ description = "The previous ruler was a great leader."
+
+/datum/round_aspect/emptytreasury
+ name = "Empty Treasury"
+ description = "The previous ruler was a dick."
+
+/datum/round_aspect/faulty
+ name = "Faulty Machines"
+ description = "SCOMs may need some maintenance from time to time so they don't scramble their messages, maybe a good slap will do the trick."
+
+/datum/round_aspect/drugparty
+ name = "Town Party"
+ description = "Ugh... what happened last night?"
+
+/datum/round_aspect/drunkparty
+ name = "Town Party"
+ description = "Ugh... what happened last night?"
+
+/datum/round_aspect/drunkgarrison
+ name = "Delayed Inspection"
+ description = "The Garrison is overdue on an inspection, hopefully they aren't too rowdy."
+
+/*
+/datum/round_aspect/beggarking
+ name = "Peasantry Revolutionized"
+ description = "Well, the peasants revolted; and they won. Is this what you wanted? He looks like a fucking clown."
+*/
+
+/datum/round_aspect/crippledbeggars
+ name = "Crippled Beggars"
+ description = "Due to a previous Lord's decree all beggars got their legs broken, that was a long time ago, and they were training their arms. Better get a bow."
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 87ea141b8f..c199b8c72c 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -35,6 +35,7 @@ GLOBAL_PROTECT(admin_verbs_admin)
return list(
/client/proc/adjusttriumph,
/client/proc/end_party, /*destroys our own admin datum so we can play as a regular player*/
+ /client/proc/forceaspect,
/client/proc/cmd_admin_say, /*admin-only ooc chat*/
/client/proc/hide_verbs, /*hides all our adminverbs*/
/client/proc/hide_most_verbs, /*hides all our hideable adminverbs*/
@@ -767,6 +768,22 @@ GLOBAL_PROTECT(admin_verbs_hideable)
log_admin("[key_name(usr)] has [AI_Interact ? "activated" : "deactivated"] Admin AI Interact")
message_admins("[key_name_admin(usr)] has [AI_Interact ? "activated" : "deactivated"] their AI interaction")
+/client/proc/forceaspect()
+ set category = "GameMaster"
+ set name = "Force Aspect"
+ if(!holder)
+ return
+
+ var/list/possibilities = list()
+ for(var/thing in subtypesof(/datum/round_aspect))//Populate possible aspects list.
+ var/datum/round_aspect/A = thing
+ possibilities += A
+ var/chosen = input(usr, "Choose", "STONEMONGERS") as null|anything in possibilities
+ if(chosen)
+ SSticker.round_aspect = new chosen
+ SSticker.forcing_aspect = TRUE
+ SSticker.round_aspect.apply()
+
/client/proc/end_party()
set category = "GameMaster"
set name = "EndPlaytest"
diff --git a/code/modules/jobs/job_types/roguetown/garrison/garrisonguard.dm b/code/modules/jobs/job_types/roguetown/garrison/garrisonguard.dm
index c733c2c56b..0df2b5f2fc 100644
--- a/code/modules/jobs/job_types/roguetown/garrison/garrisonguard.dm
+++ b/code/modules/jobs/job_types/roguetown/garrison/garrisonguard.dm
@@ -50,6 +50,11 @@
shoes = /obj/item/clothing/shoes/roguetown/boots
belt = /obj/item/storage/belt/rogue/leather
+/datum/outfit/job/roguetown/guardsman/pre_equip(mob/living/carbon/human/H, visualsOnly)
+ . = ..()
+ if(aspect_chosen(/datum/round_aspect/drunkgarrison))
+ H.reagents.add_reagent(/datum/reagent/consumable/ethanol/beer, 72) // 3 goblets worth
+
/* ! ! ! Class Selection Section Below ! ! !
Design philosphy:
- Footman, specializes in using axes/maces and shields. - Medium armor
diff --git a/code/modules/jobs/job_types/roguetown/nobility/lord.dm b/code/modules/jobs/job_types/roguetown/nobility/lord.dm
index d36fe14545..8307ea003f 100644
--- a/code/modules/jobs/job_types/roguetown/nobility/lord.dm
+++ b/code/modules/jobs/job_types/roguetown/nobility/lord.dm
@@ -66,6 +66,9 @@
H.change_stat("speed", 1)
H.change_stat("perception", 2)
H.change_stat("fortune", 5)
+ if(aspect_chosen(/datum/round_aspect/kingforareason))
+ H.change_stat("strength", 5)
+ H.change_stat("intelligence", -5)
if(H.gender == MALE)
pants = /obj/item/clothing/under/roguetown/tights/black
shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt/black
diff --git a/code/modules/jobs/job_types/roguetown/nobility/merchant.dm b/code/modules/jobs/job_types/roguetown/nobility/merchant.dm
index 1df2652a05..605c0cb954 100644
--- a/code/modules/jobs/job_types/roguetown/nobility/merchant.dm
+++ b/code/modules/jobs/job_types/roguetown/nobility/merchant.dm
@@ -26,6 +26,11 @@
min_pq = 0
selection_color = "#61679d"
+/datum/job/roguetown/merchant/after_spawn(mob/living/H, mob/M, latejoin)
+ if(aspect_chosen(/datum/round_aspect/merchanthoarder))
+ give_bank_account = 250
+ . = ..()
+
/datum/outfit/job/roguetown/merchant/pre_equip(mob/living/carbon/human/H)
..()
diff --git a/code/modules/jobs/job_types/roguetown/peasants/beggar.dm b/code/modules/jobs/job_types/roguetown/peasants/beggar.dm
index ccc9209f7b..705a4a1f3d 100644
--- a/code/modules/jobs/job_types/roguetown/peasants/beggar.dm
+++ b/code/modules/jobs/job_types/roguetown/peasants/beggar.dm
@@ -70,6 +70,13 @@
H.change_stat("intelligence", -3)
H.change_stat("constitution", -2)
H.change_stat("endurance", -2)
+ if(aspect_chosen(/datum/round_aspect/strongbums))
+ H.change_stat("strength", 5)
+ H.change_stat("intelligence", -2)
+ if(aspect_chosen(/datum/round_aspect/crippledbeggars))
+ var/datum/brain_trauma/severe/paralysis/paraplegic/T = new()
+ H.change_stat("strength", 6)
+ H.gain_trauma(T, TRAUMA_RESILIENCE_ABSOLUTE)
/datum/outfit/job/roguetown/vagrant
name = "Beggar"
diff --git a/code/modules/jobs/job_types/roguetown/roguetown.dm b/code/modules/jobs/job_types/roguetown/roguetown.dm
index 9fcd63a63a..f4467ec4a8 100644
--- a/code/modules/jobs/job_types/roguetown/roguetown.dm
+++ b/code/modules/jobs/job_types/roguetown/roguetown.dm
@@ -79,6 +79,12 @@
if(check_crownlist(H.ckey))
H.mind.special_items["Champion Circlet"] = /obj/item/clothing/head/roguetown/crown/sparrowcrown
give_special_items(H)
+ if(aspect_chosen(/datum/round_aspect/somethinginthewater))
+ H.change_stat("intelligence", -1)
+ if(aspect_chosen(/datum/round_aspect/drugparty))
+ H.reagents.add_reagent(pick(/datum/reagent/ozium, /datum/reagent/moondust, /datum/reagent/druqks), 15)
+ if(aspect_chosen(/datum/round_aspect/drunkparty))
+ H.reagents.add_reagent(/datum/reagent/consumable/ethanol/beer, 72) // 3 goblets worth
for(var/list_key in SStriumphs.post_equip_calls)
var/datum/triumph_buy/thing = SStriumphs.post_equip_calls[list_key]
thing.on_activate(H)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index df50dedccd..de5c61a24e 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -60,6 +60,8 @@
#ifdef MATURESERVER
sexcon = new /datum/sex_controller(src)
#endif
+ if(aspect_chosen(/datum/round_aspect/sexless))
+ virginity = TRUE
verbs += /mob/living/proc/mob_sleep
verbs += /mob/living/proc/lay_down
diff --git a/code/modules/roguetown/roguemachine/merchant.dm b/code/modules/roguetown/roguemachine/merchant.dm
index 90c5df762d..287f455a06 100644
--- a/code/modules/roguetown/roguemachine/merchant.dm
+++ b/code/modules/roguetown/roguemachine/merchant.dm
@@ -65,7 +65,10 @@
if(!anchored)
return TRUE
if(world.time > next_airlift)
- next_airlift = world.time + rand(2 MINUTES, 3 MINUTES)
+ if(aspect_chosen(/datum/round_aspect/favorsintherightplaces))
+ next_airlift = world.time + 1 MINUTES
+ else
+ next_airlift = world.time + rand(2 MINUTES, 3 MINUTES)
#ifdef TESTSERVER
next_airlift = world.time + 5 SECONDS
#endif
diff --git a/code/modules/roguetown/roguemachine/scomm.dm b/code/modules/roguetown/roguemachine/scomm.dm
index 8db4dc3db2..73574e4859 100644
--- a/code/modules/roguetown/roguemachine/scomm.dm
+++ b/code/modules/roguetown/roguemachine/scomm.dm
@@ -14,6 +14,7 @@
var/listening = TRUE
var/speaking = TRUE
var/dictating = FALSE
+ var/fucked = FALSE
/obj/structure/roguemachine/scomm/r
pixel_y = 0
@@ -46,6 +47,11 @@
if(.)
return
user.changeNext_move(CLICK_CD_MELEE)
+ if(user.used_intent.type == INTENT_HARM)
+ playsound(loc, 'sound/combat/hits/punch/punch (1).ogg', 100, FALSE, -1)
+ fucked = FALSE
+ update_icon()
+ return
playsound(loc, 'sound/misc/beep.ogg', 100, FALSE, -1)
listening = !listening
speaking = !speaking
@@ -94,6 +100,8 @@
icon_state = "scomm1"
else
icon_state = "scomm0"
+ if(fucked)
+ icon_state = "scomm-fucked"
/obj/structure/roguemachine/scomm/Destroy()
SSroguemachine.scomm_machines -= src
@@ -128,6 +136,11 @@
if(lowertext(raw_message) == "say laws")
dictate_laws()
return
+ if(aspect_chosen(/datum/round_aspect/faulty))
+ if(prob(22))
+ fucked = TRUE
+ if(fucked)
+ raw_message = stars(raw_message)
for(var/obj/structure/roguemachine/scomm/S in SSroguemachine.scomm_machines)
S.repeat_message(raw_message, src, usedcolor, message_language)
for(var/obj/item/scomstone/S in SSroguemachine.scomm_machines)
diff --git a/icons/roguetown/misc/machines.dmi b/icons/roguetown/misc/machines.dmi
index c87f1b0dbc..f2b2df1afd 100644
Binary files a/icons/roguetown/misc/machines.dmi and b/icons/roguetown/misc/machines.dmi differ
diff --git a/stonekeep.dme b/stonekeep.dme
index b93db4d9ad..ce508f8cca 100644
--- a/stonekeep.dme
+++ b/stonekeep.dme
@@ -406,6 +406,7 @@
#include "code\datums\progressbar.dm"
#include "code\datums\radiation_wave.dm"
#include "code\datums\recipe.dm"
+#include "code\datums\round_aspects.dm"
#include "code\datums\ruins.dm"
#include "code\datums\saymode.dm"
#include "code\datums\shuttles.dm"