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"