From 3dcc4bdecd158f19a3c92f91d20fbbbab0285504 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Fri, 12 Aug 2016 22:44:11 -0400 Subject: [PATCH] Removes Mutiny --- code/__DEFINES/role_preferences.dm | 2 - code/__DEFINES/rolebans.dm | 1 - code/game/gamemodes/mutiny/auth_key.dm | 39 -- code/game/gamemodes/mutiny/directive.dm | 32 -- .../directives/alien_fraud_directive.dm | 41 -- .../bluespace_contagion_directive.dm | 58 --- .../directives/financial_crisis_directive.dm | 26 -- .../mutiny/directives/ipc_virus_directive.dm | 96 ----- .../research_to_ripleys_directive.dm | 79 ---- .../tau_ceti_needs_women_directive.dm | 108 ----- .../directives/terminations_directive.dm | 71 ---- .../mutiny/directives/test_directive.dm | 23 -- .../gamemodes/mutiny/directives/vox_heist.dm | 111 ----- .../mutiny/emergency_authentication_device.dm | 112 ------ code/game/gamemodes/mutiny/key_pinpointer.dm | 35 -- code/game/gamemodes/mutiny/mutiny.dm | 380 ------------------ code/game/gamemodes/mutiny/mutiny_admin.dm | 83 ---- code/game/gamemodes/mutiny/mutiny_fluff.dm | 197 --------- code/game/gamemodes/mutiny/mutiny_hooks.dm | 27 -- code/game/gamemodes/objective.dm | 32 -- code/modules/admin/player_panel.dm | 4 - code/modules/client/preference/preferences.dm | 1 - config/example/config.txt | 6 +- icons/mob/hud.dmi | Bin 15086 -> 13502 bytes paradise.dme | 16 - 25 files changed, 2 insertions(+), 1578 deletions(-) delete mode 100644 code/game/gamemodes/mutiny/auth_key.dm delete mode 100644 code/game/gamemodes/mutiny/directive.dm delete mode 100644 code/game/gamemodes/mutiny/directives/alien_fraud_directive.dm delete mode 100644 code/game/gamemodes/mutiny/directives/bluespace_contagion_directive.dm delete mode 100644 code/game/gamemodes/mutiny/directives/financial_crisis_directive.dm delete mode 100644 code/game/gamemodes/mutiny/directives/ipc_virus_directive.dm delete mode 100644 code/game/gamemodes/mutiny/directives/research_to_ripleys_directive.dm delete mode 100644 code/game/gamemodes/mutiny/directives/tau_ceti_needs_women_directive.dm delete mode 100644 code/game/gamemodes/mutiny/directives/terminations_directive.dm delete mode 100644 code/game/gamemodes/mutiny/directives/test_directive.dm delete mode 100644 code/game/gamemodes/mutiny/directives/vox_heist.dm delete mode 100644 code/game/gamemodes/mutiny/emergency_authentication_device.dm delete mode 100644 code/game/gamemodes/mutiny/key_pinpointer.dm delete mode 100644 code/game/gamemodes/mutiny/mutiny.dm delete mode 100644 code/game/gamemodes/mutiny/mutiny_admin.dm delete mode 100644 code/game/gamemodes/mutiny/mutiny_fluff.dm delete mode 100644 code/game/gamemodes/mutiny/mutiny_hooks.dm diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index ba8b5127e8a..1c99c8d970c 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -28,7 +28,6 @@ #define ROLE_RAIDER "vox raider" #define ROLE_TRADER "trader" #define ROLE_VAMPIRE "vampire" -#define ROLE_MUTINEER "mutineer" // Role tags for EVERYONE! #define ROLE_BORER "cortical borer" #define ROLE_DEMON "slaughter demon" @@ -62,7 +61,6 @@ var/global/list/special_roles = list( // ROLE_HOG_CULTIST = /datum/game_mode/hand_of_god, ROLE_RAIDER = /datum/game_mode/heist, ROLE_VAMPIRE = /datum/game_mode/vampire, - ROLE_MUTINEER = /datum/game_mode/mutiny, ROLE_BORER, ROLE_DEMON, ROLE_SENTIENT, diff --git a/code/__DEFINES/rolebans.dm b/code/__DEFINES/rolebans.dm index c760bbf442c..dba57111150 100644 --- a/code/__DEFINES/rolebans.dm +++ b/code/__DEFINES/rolebans.dm @@ -12,7 +12,6 @@ var/global/list/antag_roles = list( ROLE_SHADOWLING, ROLE_RAIDER, ROLE_VAMPIRE, - ROLE_MUTINEER, ROLE_BORER, ROLE_DEMON, ROLE_REVENANT, diff --git a/code/game/gamemodes/mutiny/auth_key.dm b/code/game/gamemodes/mutiny/auth_key.dm deleted file mode 100644 index e71d56beef2..00000000000 --- a/code/game/gamemodes/mutiny/auth_key.dm +++ /dev/null @@ -1,39 +0,0 @@ -/obj/item/weapon/mutiny/auth_key - name = "authentication key" - desc = "Better keep this safe." - icon = 'icons/obj/items.dmi' - icon_state = "nucleardisk" - item_state = "card-id" - w_class = 1 - - var/time_entered_space - var/obj/item/device/radio/radio - - New() - radio = new(src) - spawn(20 SECONDS) - keep_alive() - ..() - - proc/keep_alive() - var/in_space = istype(loc, /turf/space) - if(!in_space && time_entered_space) - // Recovered before the key was lost - time_entered_space = null - else if(in_space && !time_entered_space) - // The key has left the station - time_entered_space = world.time - else if(in_space && time_entered_space + (10 SECONDS) < world.time) - // Time is up - radio.autosay("This device has left the station's perimeter. Triggering emergency activation failsafe.", name) - qdel(src) - return - - spawn(10 SECONDS) - keep_alive() - -/obj/item/weapon/mutiny/auth_key/captain - name = "Captain's Authentication Key" - -/obj/item/weapon/mutiny/auth_key/secondary - name = "Emergency Secondary Authentication Key" diff --git a/code/game/gamemodes/mutiny/directive.dm b/code/game/gamemodes/mutiny/directive.dm deleted file mode 100644 index b7f153cc16a..00000000000 --- a/code/game/gamemodes/mutiny/directive.dm +++ /dev/null @@ -1,32 +0,0 @@ -datum/directive - var/datum/game_mode/mutiny/mode - var/list/special_orders - - New(var/datum/game_mode/mutiny/M) - mode = M - - proc/get_description() - return {" -

- Nanotrasen's reasons for the following directives are classified. -

- "} - - proc/meets_prerequisites() - return 0 - - proc/directives_complete() - return 1 - - proc/initialize() - return 1 - - proc/get_remaining_orders() - return "" - -/proc/get_directive(type) - var/datum/game_mode/mutiny/mode = get_mutiny_mode() - if(!mode || !mode.current_directive || !istype(mode.current_directive, text2path("/datum/directive/[type]"))) - return null - - return mode.current_directive diff --git a/code/game/gamemodes/mutiny/directives/alien_fraud_directive.dm b/code/game/gamemodes/mutiny/directives/alien_fraud_directive.dm deleted file mode 100644 index 3fa05b8fe28..00000000000 --- a/code/game/gamemodes/mutiny/directives/alien_fraud_directive.dm +++ /dev/null @@ -1,41 +0,0 @@ -datum/directive/terminations/alien_fraud - special_orders = list( - "Suspend financial accounts of all Tajaran and Unathi personnel.", - "Transfer their payrolls to the station account.", - "Terminate their employment.") - - proc/is_alien(mob/M) - var/species = M.get_species() - return species == "Tajaran" || species == "Unathi" - -datum/directive/terminations/alien_fraud/get_crew_to_terminate() - var/list/aliens[0] - for(var/mob/M in player_list) - if(M.is_ready() && is_alien(M) && M != mode.head_loyalist.current) - aliens.Add(M) - return aliens - -datum/directive/terminations/alien_fraud/get_description() - return {" -

- An extensive conspiracy network aimed at defrauding Nanotrasen of large amounts of funds has been uncovered - operating within [system_name()]. Human personnel are not suspected to be involved. Further information is classified. -

- "} - -datum/directive/terminations/alien_fraud/meets_prerequisites() - // There must be at least one Tajaran and at least one Unathi, but the total - // of the Tajarans and Unathi combined can't be more than 1/3rd of the crew. - var/tajarans = 0 - var/unathi = 0 - for(var/mob/M in player_list) - var/species = M.get_species() - if(species == "Tajaran") - tajarans++ - if(species == "Unathi") - unathi++ - - if(!tajarans || !unathi) - return 0 - - return (tajarans + unathi) <= (player_list.len / 3) diff --git a/code/game/gamemodes/mutiny/directives/bluespace_contagion_directive.dm b/code/game/gamemodes/mutiny/directives/bluespace_contagion_directive.dm deleted file mode 100644 index 753c761b93d..00000000000 --- a/code/game/gamemodes/mutiny/directives/bluespace_contagion_directive.dm +++ /dev/null @@ -1,58 +0,0 @@ -#define INFECTION_COUNT 5 - -datum/directive/bluespace_contagion - var/list/infected = list() - - proc/get_infection_candidates() - var/list/candidates[0] - for(var/mob/M in player_list) - if(M.is_ready() && !M.is_mechanical() && M != mode.head_loyalist.current) - candidates.Add(M) - return candidates - -datum/directive/bluespace_contagion/get_description() - return {" -

- A manufactured and near-undetectable virus is spreading on Nanotrasen stations. - The pathogen travels by bluespace after maturing for one day and meets the Sol Health Organisation standards for a class X biological threat, warranting use of lethal force to contain an outbreak. - No treatment has yet been discovered. Personnel onboard [station_name()] have been infected. Further information is classified. -

- "} - -datum/directive/bluespace_contagion/initialize() - var/list/candidates = get_infection_candidates() - var/list/infected_names = list() - for(var/i=0, i < INFECTION_COUNT, i++) - if(!candidates.len) - break - - var/mob/candidate = pick(candidates) - candidates-=candidate - infected+=candidate - infected_names+="[candidate.mind.assigned_role] [candidate.mind.name]" - - special_orders = list( - "Quarantine these personnel: [jointext(infected_names, ", ")].", - "Allow one hour for a cure to be manufactured.", - "If no cure arrives after that time, execute and burn the infected.") - -datum/directive/bluespace_contagion/meets_prerequisites() - var/list/candidates = get_infection_candidates() - return candidates.len >= 7 - -datum/directive/bluespace_contagion/directives_complete() - return infected.len == 0 - -datum/directive/bluespace_contagion/get_remaining_orders() - var/text = "" - for(var/victim in infected) - text += "
  • Kill [victim]
  • " - return text - -/hook/death/proc/infected_killed(mob/living/carbon/human/deceased, gibbed) - var/datum/directive/bluespace_contagion/D = get_directive("bluespace_contagion") - if(!D) return 1 - - if(deceased in D.infected) - D.infected-=deceased - return 1 diff --git a/code/game/gamemodes/mutiny/directives/financial_crisis_directive.dm b/code/game/gamemodes/mutiny/directives/financial_crisis_directive.dm deleted file mode 100644 index 8f5daa1cc48..00000000000 --- a/code/game/gamemodes/mutiny/directives/financial_crisis_directive.dm +++ /dev/null @@ -1,26 +0,0 @@ -datum/directive/terminations/financial_crisis - special_orders = list( - "Suspend financial accounts of all support personnel, excluding the Head of Personnel.", - "Transfer their payrolls to the station account.", - "Terminate their employment.") - -datum/directive/terminations/financial_crisis/get_crew_to_terminate() - var/list/support[0] - var/list/candidates = support_positions - "Head of Personnel" - for(var/mob/M in player_list) - if(M.is_ready() && candidates.Find(M.mind.assigned_role)) - support+=(M) - return support - -datum/directive/terminations/financial_crisis/get_description() - return {" -

    - [system_name()] system banks in financial crisis. Local emergency situation ongoing. - NT Funds redistributed in accordance with financial regulations covered by employee contracts, impact upon civilian department expected. - Further information is classified. -

    - "} - -datum/directive/terminations/financial_crisis/meets_prerequisites() - var/list/support = get_crew_to_terminate() - return support.len >= 5 diff --git a/code/game/gamemodes/mutiny/directives/ipc_virus_directive.dm b/code/game/gamemodes/mutiny/directives/ipc_virus_directive.dm deleted file mode 100644 index 5f39be3b729..00000000000 --- a/code/game/gamemodes/mutiny/directives/ipc_virus_directive.dm +++ /dev/null @@ -1,96 +0,0 @@ -datum/directive/ipc_virus - special_orders = list( - "Terminate employment of all IPC personnel.", - "Extract the Positronic Brains from IPC units.", - "Mount the Positronic Brains into Cyborgs.") - - var/list/roboticist_roles = list( - "Research Director", - "Roboticist" - ) - - var/list/brains_to_enslave = list() - var/list/cyborgs_to_make = list() - var/list/ids_to_terminate = list() - - proc/get_ipcs() - var/list/machines[0] - for(var/mob/M in player_list) - if(M.is_ready() && M.get_species() == "Machine") - machines+=(M) - return machines - - proc/get_roboticists() - var/list/roboticists[0] - for(var/mob/M in player_list) - if(M.is_ready() && roboticist_roles.Find(M.mind.assigned_role)) - roboticists+=(M) - return roboticists - -datum/directive/ipc_virus/initialize() - for(var/mob/living/carbon/human/H in get_ipcs()) - brains_to_enslave+=H.mind - cyborgs_to_make+=H.mind - ids_to_terminate+=H.wear_id - -datum/directive/ipc_virus/get_description() - return {" -

    - IPC units have been found to be infected with a violent and undesired virus in Virgus Ferrorus system. - Risk to [station_name()] IPC units has not been assessed. Further information is classified. -

    - "} - -datum/directive/ipc_virus/meets_prerequisites() - var/list/ipcs = get_ipcs() - var/list/roboticists = get_roboticists() - return ipcs.len > 2 && roboticists.len > 1 - -datum/directive/ipc_virus/directives_complete() - return brains_to_enslave.len == 0 && cyborgs_to_make.len == 0 && ids_to_terminate.len == 0 - -datum/directive/ipc_virus/get_remaining_orders() - var/text = "" - for(var/brain in brains_to_enslave) - text += "
  • Debrain [brain]
  • " - - for(var/brain in cyborgs_to_make) - text += "
  • Enslave [brain] as a Cyborg
  • " - - for(var/id in ids_to_terminate) - text += "
  • Terminate [id]
  • " - - return text - -/hook/debrain/proc/debrain_directive(var/obj/item/organ/internal/brain/B) - var/datum/directive/ipc_virus/D = get_directive("ipc_virus") - if(!D) return 1 - - if(D.brains_to_enslave.Find(B.brainmob.mind)) - D.brains_to_enslave-=B.brainmob.mind - - return 1 - -/hook/borgify/proc/borgify_directive(mob/living/silicon/robot/cyborg) - var/datum/directive/ipc_virus/D = get_directive("ipc_virus") - if(!D) return 1 - - if(D.cyborgs_to_make.Find(cyborg.mind)) - D.cyborgs_to_make-=cyborg.mind - - // In case something glitchy happened and the victim got - // borged without us tracking the brain removal, go ahead - // and update that list too. - if(D.brains_to_enslave.Find(cyborg.mind)) - D.brains_to_enslave-=cyborg.mind - - return 1 - -/hook/terminate_employee/proc/ipc_termination(obj/item/weapon/card/id) - var/datum/directive/ipc_virus/D = get_directive("ipc_virus") - if(!D) return 1 - - if(D.ids_to_terminate && D.ids_to_terminate.Find(id)) - D.ids_to_terminate-=id - - return 1 diff --git a/code/game/gamemodes/mutiny/directives/research_to_ripleys_directive.dm b/code/game/gamemodes/mutiny/directives/research_to_ripleys_directive.dm deleted file mode 100644 index 7c24b901db9..00000000000 --- a/code/game/gamemodes/mutiny/directives/research_to_ripleys_directive.dm +++ /dev/null @@ -1,79 +0,0 @@ -#define MATERIALS_REQUIRED 200 - -datum/directive/research_to_ripleys - var/list/ids_to_reassign = list() - var/materials_shipped = 0 - - proc/is_researcher(mob/M) - return M.mind.assigned_role in science_positions - "Research Director" - - proc/get_researchers() - var/list/researchers[0] - for(var/mob/M in player_list) - if(M.is_ready() && is_researcher(M)) - researchers+=(M) - return researchers - - proc/count_researchers_reassigned() - var/researchers_reassigned = 0 - for(var/obj/item/weapon/card/id in ids_to_reassign) - if(ids_to_reassign[id]) - researchers_reassigned++ - - return researchers_reassigned - -datum/directive/research_to_ripleys/get_description() - return {" -

    - The Nanotrasen [system_name()] Manufactory faces an ore deficit. Financial crisis imminent. [station_name()] has been reassigned as a mining platform. - The Research Director is to assist the Head of Personnel in coordinating assets. - Weapons department reports solid sales. Further information is classified. -

    - "} - -datum/directive/research_to_ripleys/meets_prerequisites() - var/list/researchers = get_researchers() - return researchers.len > 3 - -datum/directive/research_to_ripleys/initialize() - for(var/mob/living/carbon/human/R in get_researchers()) - ids_to_reassign[R.wear_id] = 0 - - special_orders = list( - "Reassign all research personnel, excluding the Research Director, to Shaft Miner.", - "Deliver [MATERIALS_REQUIRED] sheets of metal or minerals via the supply shuttle to CentComm.") - -datum/directive/research_to_ripleys/directives_complete() - if(materials_shipped < MATERIALS_REQUIRED) return 0 - return count_researchers_reassigned() == ids_to_reassign.len - -datum/directive/research_to_ripleys/get_remaining_orders() - var/text = "" - if(MATERIALS_REQUIRED > materials_shipped) - text += "
  • Ship [MATERIALS_REQUIRED - materials_shipped] sheets of metal or minerals.
  • " - - for(var/id in ids_to_reassign) - if(!ids_to_reassign[id]) - text += "
  • Reassign [id] to Shaft Miner
  • " - - return text - -/hook/reassign_employee/proc/research_reassignments(obj/item/weapon/card/id/id_card) - var/datum/directive/research_to_ripleys/D = get_directive("research_to_ripleys") - if(!D) return 1 - - if(D.ids_to_reassign && D.ids_to_reassign.Find(id_card)) - D.ids_to_reassign[id_card] = id_card.assignment == "Shaft Miner" ? 1 : 0 - - return 1 - -/hook/sell_crate/proc/deliver_materials(obj/structure/closet/crate/sold, area/shuttle) - var/datum/directive/research_to_ripleys/D = get_directive("research_to_ripleys") - if(!D) return 1 - - for(var/atom/A in sold) - if(istype(A, /obj/item/stack/sheet/mineral) || istype(A, /obj/item/stack/sheet/metal)) - var/obj/item/stack/S = A - D.materials_shipped += S.amount - - return 1 diff --git a/code/game/gamemodes/mutiny/directives/tau_ceti_needs_women_directive.dm b/code/game/gamemodes/mutiny/directives/tau_ceti_needs_women_directive.dm deleted file mode 100644 index 381a8085a58..00000000000 --- a/code/game/gamemodes/mutiny/directives/tau_ceti_needs_women_directive.dm +++ /dev/null @@ -1,108 +0,0 @@ -datum/directive/tau_ceti_needs_women - var/list/command_targets = list() - var/list/alien_targets = list() - - proc/get_target_gender() - if(!mode.head_loyalist) return FEMALE - return mode.head_loyalist.current.get_gender() == FEMALE ? MALE : FEMALE - - proc/is_target_gender(mob/M) - var/species = M.get_species() - return species != "Diona" && M.get_gender() == get_target_gender() - - proc/get_crew_of_target_gender() - var/list/targets[0] - for(var/mob/M in player_list) - if(M.is_ready() && is_target_gender(M) && !M.is_mechanical()) - targets+=(M) - return targets - - proc/get_target_heads() - var/list/heads[0] - for(var/mob/M in get_crew_of_target_gender()) - if(command_positions.Find(M.mind.assigned_role)) - heads+=(M) - return heads - - proc/get_target_aliens() - var/list/aliens[0] - for(var/mob/M in get_crew_of_target_gender()) - var/species = M.get_species() - if(species == "Tajaran" || species == "Unathi" || species == "Skrell") - aliens+=(M) - return aliens - - proc/count_heads_reassigned() - var/heads_reassigned = 0 - for(var/obj/item/weapon/card/id in command_targets) - if(command_targets[id]) - heads_reassigned++ - - return heads_reassigned - -datum/directive/tau_ceti_needs_women/get_description() - return {" -

    - Recent evidence suggests [get_target_gender()] aptitudes may be effected by radiation from [system_name()]. - Effects were measured under laboratory and station conditions. Humans remain more trusted than Xeno. Further information is classified. -

    - "} - -datum/directive/tau_ceti_needs_women/initialize() - for(var/mob/living/carbon/human/H in get_target_heads()) - command_targets[H.wear_id] = 0 - - for(var/mob/living/carbon/human/H in get_target_aliens()) - alien_targets+=H.wear_id - - special_orders = list( - "Remove [get_target_gender()] personnel from Command positions.", - "Terminate employment of all [get_target_gender()] Skrell, Tajara, and Unathi.") - -datum/directive/tau_ceti_needs_women/meets_prerequisites() - var/females = 0 - var/males = 0 - for(var/mob/M in player_list) - if(M.is_ready() && !M.is_mechanical() && M.get_species() != "Diona") - var/gender = M.get_gender() - if(gender == MALE) - males++ - else if(gender == FEMALE) - females++ - - return males >= 2 && females >= 2 - -datum/directive/tau_ceti_needs_women/directives_complete() - return command_targets.len == count_heads_reassigned() && alien_targets.len == 0 - -datum/directive/tau_ceti_needs_women/get_remaining_orders() - var/text = "" - for(var/head in command_targets) - if(!command_targets[head]) - text += "
  • Remove [head] from a Head Role
  • " - - for(var/id in alien_targets) - text += "
  • Terminate [id]
  • " - - return text - -/hook/reassign_employee/proc/command_reassignments(obj/item/weapon/card/id/id_card) - var/datum/directive/tau_ceti_needs_women/D = get_directive("tau_ceti_needs_women") - if(!D) return 1 - - if(D.command_targets && D.command_targets.Find(id_card)) - D.command_targets[id_card] = command_positions.Find(id_card.assignment) ? 0 : 1 - - return 1 - -/hook/terminate_employee/proc/gender_target_termination_directive(obj/item/weapon/card/id) - var/datum/directive/tau_ceti_needs_women/D = get_directive("tau_ceti_needs_women") - if(!D) return 1 - - if(D.alien_targets && D.alien_targets.Find(id)) - D.alien_targets-=id - - if(D.command_targets && D.command_targets.Find(id)) - D.command_targets[id] = 1 - - return 1 diff --git a/code/game/gamemodes/mutiny/directives/terminations_directive.dm b/code/game/gamemodes/mutiny/directives/terminations_directive.dm deleted file mode 100644 index c2b1ac633ea..00000000000 --- a/code/game/gamemodes/mutiny/directives/terminations_directive.dm +++ /dev/null @@ -1,71 +0,0 @@ -// This is a parent directive meant to be derived by directives that fit -// the "fire X type of employee" pattern of directives. Simply apply your -// flavor text and override get_crew_to_terminate in your child datum. -// See alien_fraud_directive.dm for an example. -datum/directive/terminations - var/list/accounts_to_revoke = list() - var/list/accounts_to_suspend = list() - var/list/ids_to_terminate = list() - - proc/get_crew_to_terminate() - return list() - -datum/directive/terminations/directives_complete() - for(var/account_number in accounts_to_suspend) - if(!accounts_to_suspend[account_number]) - return 0 - - for(var/account_number in accounts_to_revoke) - if(!accounts_to_revoke[account_number]) - return 0 - - return ids_to_terminate.len == 0 - -datum/directive/terminations/initialize() - for(var/mob/living/carbon/human/H in get_crew_to_terminate()) - var/datum/money_account/account = H.mind.initial_account - accounts_to_revoke["[account.account_number]"] = 0 - accounts_to_suspend["[account.account_number]"] = account.suspended - ids_to_terminate+=(H.wear_id) - -datum/directive/terminations/get_remaining_orders() - var/text = "" - for(var/account_number in accounts_to_suspend) - if(!accounts_to_suspend[account_number]) - text += "
  • Suspend Account #[account_number]
  • " - - for(var/account_number in accounts_to_revoke) - if(!accounts_to_revoke[account_number]) - text += "
  • Revoke Account #[account_number]
  • " - - for(var/id in ids_to_terminate) - text += "
  • Terminate [id]
  • " - - return text - -/hook/revoke_payroll/proc/payroll_directive(datum/money_account/account) - var/datum/directive/terminations/D = get_directive("terminations") - if(!D) return 1 - - if(D.accounts_to_revoke && D.accounts_to_revoke.Find("[account.account_number]")) - D.accounts_to_revoke["[account.account_number]"] = 1 - - return 1 - -/hook/change_account_status/proc/suspension_directive(datum/money_account/account) - var/datum/directive/terminations/D = get_directive("terminations") - if(!D) return 1 - - if(D.accounts_to_suspend && D.accounts_to_suspend.Find("[account.account_number]")) - D.accounts_to_suspend["[account.account_number]"] = account.suspended - - return 1 - -/hook/terminate_employee/proc/termination_directive(obj/item/weapon/card/id) - var/datum/directive/terminations/D = get_directive("terminations") - if(!D) return 1 - - if(D.ids_to_terminate && D.ids_to_terminate.Find(id)) - D.ids_to_terminate-=id - - return 1 diff --git a/code/game/gamemodes/mutiny/directives/test_directive.dm b/code/game/gamemodes/mutiny/directives/test_directive.dm deleted file mode 100644 index 7d2392acd64..00000000000 --- a/code/game/gamemodes/mutiny/directives/test_directive.dm +++ /dev/null @@ -1,23 +0,0 @@ -// For testing -datum/directive/terminations/test - special_orders = list( - "Suspend financial accounts of all ugly personnel.", - "Transfer their payrolls to the station account.", - "Terminate their employment.") - -datum/directive/terminations/test/get_crew_to_terminate() - var/list/uglies[0] - for(var/mob/M in player_list) - uglies+=(M) - return uglies - -datum/directive/terminations/test/get_description() - return {" -

    - Wow. Much ugly. So painful. - Many terminations. Very classified. -

    - "} - -datum/directive/terminations/test/meets_prerequisites() - return 1 diff --git a/code/game/gamemodes/mutiny/directives/vox_heist.dm b/code/game/gamemodes/mutiny/directives/vox_heist.dm deleted file mode 100644 index f652f7016d2..00000000000 --- a/code/game/gamemodes/mutiny/directives/vox_heist.dm +++ /dev/null @@ -1,111 +0,0 @@ -datum/directive/vox_heist - var/list/vox = list() - var/list/sympathizers = list() - - proc/get_vox_candidates() - var/list/candidates[0] - for(var/mob/M in player_list) - if(M.is_ready() && is_vox(M)) - candidates.Add(M) - return candidates - - proc/get_sympathizer_candidates() - var/list/candidates[0] - for(var/mob/M in player_list) - if(M.is_ready() && !is_vox(M) && !M.is_mechanical() && M.mind.assigned_role != "Captain") - candidates[M] = get_weight(M) - return candidates - - proc/is_vox(mob/M) - return M.get_species() == "Vox" - - proc/get_weight(mob/M) - // You will have a high chance of being regarded as a vox sympathizer if your - // relationship with Nanotrasen is negative. Otherwise, command and security - // staff are pretty well trusted and maltreated alien races are easy suspects. - var/relation = M.client.prefs.nanotrasen_relation - if(relation == "Opposed") - return 8 - if(relation == "Skeptical") - return 5 - if(command_positions.Find(M.mind.assigned_role)) - return 1 - var/species = M.get_species() - if(species == "Tajaran" || species == "Unathi") - return 5 - if(security_positions.Find(M.mind.assigned_role)) - return 2 - return 3 - -datum/directive/vox_heist/get_description() - return {" -

    - A vox warship has commandeered a Nanotrasen transport carrying 2,500 cubic meters of liquid plasma. - The raiders are willing to return the stolen cargo in exchange for the capture or execution of so-called "vox pariah" that are stationed aboard [station_name()]. - If the transport is not recovered, the estimated loss of profits is a threat to the solvency of the company. - Predictive analysis has identified certain members of the crew as sympathetic to the vox pariah. Detain the sympathizers to guarantee a successful exchange. - Lethal force is authorized by the High Command Department of Security. Further information is classified. -

    - "} - -datum/directive/vox_heist/initialize() - var/list/vox_candidates = get_vox_candidates() - for(var/mob/pariah in vox_candidates) - vox.Add(pariah.mind) - - special_orders = list( - "Brig or kill all Vox Pariah.") - - var/list/sympathizer_candidates = get_sympathizer_candidates() - var/list/sympathizer_names = list() - var/sympathizer_count = min(rand(2,4), sympathizer_candidates.len) - for(var/i=0, i < sympathizer_count, i++) - if(!sympathizer_candidates.len) - break - - var/mob/candidate = pickweight(sympathizer_candidates) - sympathizer_candidates.Remove(candidate) - sympathizers.Add(candidate.mind) - sympathizer_names.Add("[candidate.mind.assigned_role] [candidate.mind.name]") - - if(sympathizers.len) - special_orders.Add("Brig the following sympathizers: [jointext(sympathizer_names, ", ")]") - -datum/directive/vox_heist/meets_prerequisites() - var/list/candidates = get_vox_candidates() - return candidates.len >= 2 - -datum/directive/vox_heist/directives_complete() - if(!vox.len && !sympathizers.len) - return 1 - - for(var/datum/mind/pariah in vox) - if(!pariah.current.is_in_brig()) - return 0 - - for(var/datum/mind/sympathizer in sympathizers) - if(!sympathizer.current.is_in_brig()) - return 0 - - return 1 - -datum/directive/vox_heist/get_remaining_orders() - var/text = "" - for(var/datum/mind/pariah in vox) - if(!pariah.current.is_in_brig()) - text += "
  • Brig or Kill [pariah]
  • " - for(var/datum/mind/sympathizer in sympathizers) - if(!sympathizer.current.is_in_brig()) - text += "
  • Brig [sympathizer]
  • " - return text - -/hook/death/proc/vox_or_sympathizer_killed(mob/living/carbon/human/deceased, gibbed) - var/datum/directive/vox_heist/D = get_directive("vox_heist") - if(!D) return 1 - - var/datum/mind/M = deceased.mind - if(M in D.vox) - D.vox.Remove(M) - if(M in D.sympathizers) - D.sympathizers.Remove(M) - return 1 diff --git a/code/game/gamemodes/mutiny/emergency_authentication_device.dm b/code/game/gamemodes/mutiny/emergency_authentication_device.dm deleted file mode 100644 index 0df97401a2e..00000000000 --- a/code/game/gamemodes/mutiny/emergency_authentication_device.dm +++ /dev/null @@ -1,112 +0,0 @@ -/obj/machinery/emergency_authentication_device - var/datum/game_mode/mutiny/mode - - name = "\improper Emergency Authentication Device" - icon = 'icons/obj/stationobjs.dmi' - icon_state = "blackbox" - density = 1 - anchored = 1 - - var/captains_key - var/secondary_key - var/activated = 0 - - use_power = 0 - - New(loc, mode) - src.mode = mode - ..(loc) - - proc/check_key_existence() - if(!mode.captains_key) - captains_key = 1 - - if(!mode.secondary_key) - secondary_key = 1 - - proc/get_status() - if(activated) - return "Activated" - if(captains_key && secondary_key) - return "Both Keys Authenticated" - if(captains_key) - return "Captain's Key Authenticated" - if(secondary_key) - return "Secondary Key Authenticated" - else - return "Inactive" - - proc/launch_shuttle() - spawn(rand(5 SECONDS, 45 SECONDS)) - if(shuttle_master.requestEvac(usr, "Directive X")) - spawn(20 SECONDS) - var/text = "[station_name()], we have confirmed your completion of Directive X. An evacuation shuttle is en route to receive your crew for debriefing." - command_announcement.Announce(text, "Emergency Transmission") - -/obj/machinery/emergency_authentication_device/attack_hand(mob/user) - if(activated) - to_chat(user, "\blue \The [src] is already active!") - return - - if(!mode.current_directive.directives_complete()) - atom_say("Command aborted. Communication with CentComm is prohibited until Directive X has been completed.") - return - - check_key_existence() - if(captains_key && secondary_key) - activated = 1 - to_chat(user, "\blue You activate \the [src]!") - atom_say("Command acknowledged. Initiating quantum entanglement relay to Nanotrasen High Command.") - launch_shuttle() - return - - if(!captains_key && !secondary_key) - atom_say("Command aborted. Please present the authentication keys before proceeding.") - return - - if(!captains_key) - atom_say("Command aborted. Please present the Captain's Authentication Key.") - return - - if(!secondary_key) - atom_say("Command aborted. Please present the Emergency Secondary Authentication Key.") - return - - // Impossible! - atom_say("Command aborted. This unit is defective.") - -/obj/machinery/emergency_authentication_device/attackby(obj/item/weapon/O, mob/user, params) - if(activated) - to_chat(user, "\blue \The [src] is already active!") - return - - if(!mode.current_directive.directives_complete()) - atom_say("Command aborted. Communication with CentComm is prohibited until Directive X has been completed.") - return - - check_key_existence() - if(istype(O, /obj/item/weapon/mutiny/auth_key/captain) && !captains_key) - captains_key = O - user.drop_item() - O.loc = src - - atom_say("Key received. Thank you, Captain [mode.head_loyalist].") - spawn(5) - atom_say(secondary_key ? "Your keys have been authenticated. Communication with CentComm is now authorized." : "Please insert the Emergency Secondary Authentication Key now.") - return - - if(istype(O, /obj/item/weapon/mutiny/auth_key/secondary) && !secondary_key) - secondary_key = O - user.drop_item() - O.loc = src - - atom_say("Key received. Thank you, Secondary Authenticator [mode.head_mutineer].") - spawn(5) - atom_say(captains_key ? "Your keys have been authenticated. Communication with CentComm is now authorized." : "Please insert the Captain's Authentication Key now.") - return - ..() - -/obj/machinery/emergency_authentication_device/examine(mob/user) - to_chat(user, {"This is a specialized communications device that is able to instantly send a message to Nanotrasen High Command via quantum entanglement - with a sister device at CentComm.
    - The EAD's status is [get_status()]."}) diff --git a/code/game/gamemodes/mutiny/key_pinpointer.dm b/code/game/gamemodes/mutiny/key_pinpointer.dm deleted file mode 100644 index 0125636d769..00000000000 --- a/code/game/gamemodes/mutiny/key_pinpointer.dm +++ /dev/null @@ -1,35 +0,0 @@ -/obj/item/weapon/pinpointer/advpinpointer/auth_key - name = "\improper Authentication Key Pinpointer" - desc = "Tracks the positions of the emergency authentication keys." - var/datum/game_mode/mutiny/mutiny - - New() - mutiny = ticker.mode - ..() - -/obj/item/weapon/pinpointer/advpinpointer/auth_key/attack_self() - switch(mode) - if(0) - mode = 1 - active = 1 - target = mutiny.captains_key - point_at(target) - to_chat(usr, "\blue You calibrate \the [src] to locate the Captain's Authentication Key.") - if(1) - mode = 2 - target = mutiny.secondary_key - to_chat(usr, "\blue You calibrate \the [src] to locate the Emergency Secondary Authentication Key.") - else - mode = 0 - active = 0 - icon_state = "pinoff" - to_chat(usr, "\blue You switch \the [src] off.") - -/obj/item/weapon/pinpointer/advpinpointer/auth_key/examine(mob/user) - switch(mode) - if(1) - to_chat(user, "Is is calibrated for the Captain's Authentication Key.") - if(2) - to_chat(user, "It is calibrated for the Emergency Secondary Authentication Key.") - else - to_chat(user, "It is switched off.") diff --git a/code/game/gamemodes/mutiny/mutiny.dm b/code/game/gamemodes/mutiny/mutiny.dm deleted file mode 100644 index 21a6d8f9c41..00000000000 --- a/code/game/gamemodes/mutiny/mutiny.dm +++ /dev/null @@ -1,380 +0,0 @@ -#define MUTINY_RECRUITMENT_COOLDOWN 5 - -datum/game_mode/mutiny - var/datum/mutiny_fluff/fluff - var/datum/directive/current_directive - var/obj/item/weapon/mutiny/auth_key/captain/captains_key - var/obj/item/weapon/mutiny/auth_key/secondary/secondary_key - var/obj/machinery/emergency_authentication_device/ead - var/datum/mind/head_loyalist - var/datum/mind/head_mutineer - var/recruit_loyalist_cooldown = 0 - var/recruit_mutineer_cooldown = 0 - var/list/loyalists = list() - var/list/mutineers = list() - var/list/body_count = list() - - name = "mutiny" - config_tag = "mutiny" - required_players = 20 - ert_disabled = 1 - - New() - fluff = new(src) - - proc/reveal_directives() - spawn(rand(1 MINUTES, 3 MINUTES)) - command_announcement.Announce("Incoming emergency directive: Captain's office fax machine, [station_name()].","Emergency Transmission") - spawn(rand(3 MINUTES, 5 MINUTES)) - send_pda_message() - spawn(rand(3 MINUTES, 5 MINUTES)) - fluff.announce_directives() - spawn(rand(2 MINUTES, 3 MINUTES)) - - var/list/reasons = list( - "political instability", - "quantum fluctuations", - "hostile raiders", - "derelict station debris", - "REDACTED", - "ancient alien artillery", - "solar magnetic storms", - "sentient time-travelling killbots", - "gravitational anomalies", - "wormholes to another dimension", - "a telescience mishap", - "radiation flares", - "supermatter dust", - "leaks into a negative reality", - "antiparticle clouds", - "residual bluespace energy", - "suspected syndicate operatives", - "malfunctioning von Neumann probe swarms", - "shadowy interlopers", - "a stranded Vox arkship", - "haywire IPC constructs", - "rogue Unathi exiles", - "artifacts of eldritch horror", - "a brain slug infestation", - "killer bugs that lay eggs in the husks of the living", - "a deserted transport carrying xenomorph specimens", - "an emissary for the gestalt requesting a security detail", - "a Tajaran slave rebellion", - "radical Skrellian transevolutionaries", - "classified security operations", - "science-defying raw elemental chaos" - ) - command_announcement.Announce("The presence of [pick(reasons)] in the region is tying up all available local emergency resources; emergency response teams cannot be called at this time.","Emergency Transmission") - - // Returns an array in case we want to expand on this later. - proc/get_head_loyalist_candidates() - var/list/candidates[0] - for(var/mob/loyalist in player_list) - if(loyalist.mind && loyalist.mind.assigned_role == "Captain") - candidates+=loyalist.mind - return candidates - - proc/get_head_mutineer_candidates() - var/list/candidates[0] - for(var/mob/mutineer in player_list) - if(ROLE_MUTINEER in mutineer.client.prefs.be_special) - if(!jobban_isbanned(mutineer, "mutineer") && !jobban_isbanned(mutineer,"Syndicate")) - for(var/job in command_positions - "Captain") - if(mutineer.mind && mutineer.mind.assigned_role == job) - candidates+=mutineer.mind - return candidates - - proc/get_directive_candidates() - var/list/candidates[0] - for(var/T in subtypesof(/datum/directive)) - var/datum/directive/D = new T(src) -// to_chat(world, D.name) - if(D.meets_prerequisites()) - candidates+=D - return candidates - - proc/send_pda_message() - var/obj/item/device/pda/pda = null - for(var/obj/item/device/pda/P in head_mutineer.current) - pda = P - break - - if(!pda) - return 0 - - var/datum/data/pda/app/messenger/pdam = pda.find_program(/datum/data/pda/app/messenger) - if(pdam) - pdam.notify(fluff.get_pda_body(), 0) - return 1 - - proc/get_equipment_slots() - return list( - "left pocket" = slot_l_store, - "right pocket" = slot_r_store, - "backpack" = slot_in_backpack, - "left hand" = slot_l_hand, - "right hand" = slot_r_hand) - - proc/equip_head_loyalist() - equip_head(head_loyalist, "loyalist", /mob/living/carbon/human/proc/recruit_loyalist) - - proc/equip_head_mutineer() - equip_head(head_mutineer, "mutineer", /mob/living/carbon/human/proc/recruit_mutineer) - - proc/equip_head(datum/mind/head, faction, proc/recruitment_verb) - var/mob/living/carbon/human/H = head.current - to_chat(H, "You are the Head [capitalize(faction)]!") - head.special_role = "head_[faction]" - - var/slots = get_equipment_slots() - switch(faction) - if("loyalist") - if(captains_key) qdel(captains_key) - captains_key = new(H) - H.equip_in_one_of_slots(captains_key, slots) - if("mutineer") - if(secondary_key) qdel(secondary_key) - secondary_key = new(H) - H.equip_in_one_of_slots(secondary_key, slots) - - H.update_icons() - H.verbs += recruitment_verb - - proc/add_loyalist(datum/mind/M) - add_faction(M, "loyalist", loyalists) - - proc/add_mutineer(datum/mind/M) - add_faction(M, "mutineer", mutineers) - - proc/add_faction(datum/mind/M, faction, list/faction_list) - if(!can_be_recruited(M, faction)) - to_chat(M.current, "\red Recruitment canceled; your role has already changed.") - to_chat(head_mutineer.current, "\red Could not recruit [M]. Their role has changed.") - return - - if(M in loyalists) - loyalists-=M - - if(M in mutineers) - mutineers-=M - - M.special_role = faction - faction_list+=M - - if(faction == "mutineer") - to_chat(M.current, fluff.mutineer_tag("You have joined the mutineers!")) - to_chat(head_mutineer.current, fluff.mutineer_tag("[M] has joined the mutineers!")) - else - to_chat(M.current, fluff.loyalist_tag("You have joined the loyalists!")) - to_chat(head_loyalist.current, fluff.loyalist_tag("[M] has joined the loyalists!")) - - update_icon(M) - - proc/was_bloodbath() - var/list/remaining_loyalists = loyalists - body_count - if(!remaining_loyalists.len) - return 1 - - var/list/remaining_mutineers = mutineers - body_count - if(!remaining_mutineers.len) - return 1 - - return 0 - - proc/replace_nuke_with_ead() - for(var/obj/machinery/nuclearbomb/N in world) - ead = new(N.loc, src) - qdel(N) - - proc/unbolt_vault_door() - var/obj/machinery/door/airlock/vault = locate(/obj/machinery/door/airlock/vault) - vault.unlock(1) - - proc/make_secret_transcript() - var/obj/machinery/computer/telecomms/server/S = locate(/obj/machinery/computer/telecomms/server) - if(!S) return - - var/obj/item/weapon/paper/crumpled/bloody/transcript = new(S.loc) - transcript.name = "secret transcript" - transcript.info = fluff.secret_transcript() - - proc/can_be_recruited(datum/mind/M, role) - if(!M) return 0 - if(!M.special_role) return 1 - switch(role) - if("loyalist") - return M.special_role == "mutineer" - if("mutineer") - return M.special_role == "loyalist" - - proc/round_outcome() - to_chat(world, "

    Breaking News



    ") - if(was_bloodbath()) - to_chat(world, fluff.no_victory()) - return - - var/directives_completed = current_directive.directives_complete() - var/ead_activated = ead.activated - if(directives_completed && ead_activated) - to_chat(world, fluff.loyalist_major_victory()) - else if(directives_completed && !ead_activated) - to_chat(world, fluff.loyalist_minor_victory()) - else if(!directives_completed && ead_activated) - to_chat(world, fluff.mutineer_minor_victory()) - else if(!directives_completed && !ead_activated) - to_chat(world, fluff.mutineer_major_victory()) - - world << sound('sound/machines/twobeep.ogg') - - proc/update_all_icons() - spawn(0) - for(var/datum/mind/M in mutineers) - update_icon(M) - - for(var/datum/mind/M in loyalists) - update_icon(M) - return 1 - - proc/update_icon(datum/mind/M) - if(!M.current || !M.current.client) - return 0 - - for(var/image/I in head_loyalist.current.client.images) - if(I.loc == M.current && (I.icon_state == "loyalist" || I.icon_state == "mutineer")) - qdel(I) - - for(var/image/I in head_mutineer.current.client.images) - if(I.loc == M.current && (I.icon_state == "loyalist" || I.icon_state == "mutineer")) - qdel(I) - - if(M in loyalists) - var/I = image('icons/mob/mob.dmi', loc=M.current, icon_state = "loyalist") - head_loyalist.current.client.images += I - - if(M in mutineers) - var/I = image('icons/mob/mob.dmi', loc=M.current, icon_state = "mutineer") - head_mutineer.current.client.images += I - - return 1 - -/datum/game_mode/mutiny/announce() - fluff.announce() - -/datum/game_mode/mutiny/pre_setup() - var/list/loyalist_candidates = get_head_loyalist_candidates() - if(!loyalist_candidates || loyalist_candidates.len == 0) - to_chat(world, "\red Mutiny mode aborted: no valid candidates for head loyalist.") - return 0 - - var/list/mutineer_candidates = get_head_mutineer_candidates() - if(!mutineer_candidates || mutineer_candidates.len == 0) - to_chat(world, "\red Mutiny mode aborted: no valid candidates for head mutineer.") - return 0 - - var/list/directive_candidates = get_directive_candidates() - if(!directive_candidates || directive_candidates.len == 0) - to_chat(world, "\red Mutiny mode aborted: no valid candidates for Directive X.") - return 0 - - head_loyalist = pick(loyalist_candidates) - head_mutineer = pick(mutineer_candidates) - current_directive = pick(directive_candidates) - - return 1 - -/datum/game_mode/mutiny/post_setup() - equip_head_loyalist() - equip_head_mutineer() - - loyalists+=head_loyalist - mutineers+=head_mutineer - - replace_nuke_with_ead() - current_directive.initialize() - unbolt_vault_door() - make_secret_transcript() - - update_all_icons() - spawn(0) - reveal_directives() - ..() - -/mob/living/carbon/human/proc/recruit_loyalist() - set name = "Recruit Loyalist" - set category = "Mutiny" - - var/datum/game_mode/mutiny/mode = get_mutiny_mode() - if(!mode || src != mode.head_loyalist.current) - return - - var/list/candidates = list() - for(var/mob/living/carbon/human/P in oview(src)) - if(!stat && P.client && mode.can_be_recruited(P.mind, "loyalist")) - candidates += P - - if(!candidates.len) - to_chat(src, "\red You aren't close enough to anybody that can be recruited.") - return - - if(world.time < mode.recruit_loyalist_cooldown) - to_chat(src, "\red Wait [MUTINY_RECRUITMENT_COOLDOWN] seconds before recruiting again.") - return - - mode.recruit_loyalist_cooldown = world.time + (MUTINY_RECRUITMENT_COOLDOWN SECONDS) - - var/mob/living/carbon/human/M = input("Select a person to recruit", "Loyalist recruitment", null) as mob in candidates - - if(M) - to_chat(src, "Attempting to recruit [M]...") - log_admin("[key_name(src)] attempted to recruit [M] as a loyalist.") - message_admins("\red [key_name_admin(src)] attempted to recruit [M] as a loyalist.") - - var/choice = alert(M, "Asked by [src]: Will you help me complete Directive X?", "Loyalist recruitment", "Yes", "No") - if(choice == "Yes") - mode.add_loyalist(M.mind) - else if(choice == "No") - to_chat(M, "\red You declined to join the loyalists.") - to_chat(mode.head_loyalist.current, "[M] declined to support the loyalists.") - -/mob/living/carbon/human/proc/recruit_mutineer() - set name = "Recruit Mutineer" - set category = "Mutiny" - - var/datum/game_mode/mutiny/mode = get_mutiny_mode() - if(!mode || src != mode.head_mutineer.current) - return - - var/list/candidates = list() - for(var/mob/living/carbon/human/P in oview(src)) - if(!stat && P.client && mode.can_be_recruited(P.mind, "mutineer")) - candidates += P - - if(!candidates.len) - to_chat(src, "\red You aren't close enough to anybody that can be recruited.") - return - - if(world.time < mode.recruit_mutineer_cooldown) - to_chat(src, "\red Wait [MUTINY_RECRUITMENT_COOLDOWN] seconds before recruiting again.") - return - - mode.recruit_mutineer_cooldown = world.time + (MUTINY_RECRUITMENT_COOLDOWN SECONDS) - - var/mob/living/carbon/human/M = input("Select a person to recruit", "Mutineer recruitment", null) as mob in candidates - - if(M) - to_chat(src, "Attempting to recruit [M]...") - log_admin("[key_name(src)] attempted to recruit [M] as a mutineer.") - message_admins("\red [key_name_admin(src)] attempted to recruit [M] as a mutineer.") - - var/choice = alert(M, "Asked by [src]: Will you help me stop Directive X?", "Mutineer recruitment", "Yes", "No") - if(choice == "Yes") - mode.add_mutineer(M.mind) - else if(choice == "No") - to_chat(M, "\red You declined to join the mutineers.") - to_chat(mode.head_mutineer.current, "[M] declined to support the mutineers.") - -/proc/get_mutiny_mode() - if(!ticker || !istype(ticker.mode, /datum/game_mode/mutiny)) - return null - - return ticker.mode diff --git a/code/game/gamemodes/mutiny/mutiny_admin.dm b/code/game/gamemodes/mutiny/mutiny_admin.dm deleted file mode 100644 index e4b2cca1c63..00000000000 --- a/code/game/gamemodes/mutiny/mutiny_admin.dm +++ /dev/null @@ -1,83 +0,0 @@ -/datum/game_mode/mutiny/proc/check_antagonists_ui(datum/admins/admins) - var/turf/captains_key_loc = captains_key ? captains_key.get_loc_turf() : "Lost or Destroyed" - var/turf/secondary_key_loc = secondary_key ? secondary_key.get_loc_turf() : "Lost or Destroyed" - var/remaining_objectives = current_directive.get_remaining_orders() - var/txt = {" -
    Context:
    -

    - [current_directive.get_description()] -

    -
    Orders:
    -
      - [fluff.get_orders()] -
    -
    -
    Remaining Objectives
    -
      - [remaining_objectives ? remaining_objectives : "
    1. None
    2. "] -
    -
    -
    Authentication:
    - Captain's Key: [captains_key_loc] - Activate
    - Secondary Key: [secondary_key_loc] - Activate
    - EAD: [ead ? ead.get_status() : "Lost or Destroyed"] - Activate
    -
    - "} - - txt += "Reassign Head Loyalist
    " - if(head_loyalist) - txt += admins.check_role_table("Head Loyalist", list(head_loyalist), 0) - - var/list/loyal_crew = loyalists - head_loyalist - if(loyal_crew.len) - txt += admins.check_role_table("Loyalists", loyal_crew, 0) - - txt += "Reassign Head Mutineer
    " - if(head_mutineer) - txt += admins.check_role_table("Head Mutineer", list(head_mutineer), 0) - - var/list/mutiny_crew = mutineers - head_mutineer - if(mutiny_crew.len) - txt += admins.check_role_table("Mutineers", mutiny_crew, 0) - - if(body_count.len) - txt += admins.check_role_table("Casualties", body_count, 0) - - return txt - -/datum/game_mode/mutiny/check_antagonists_topic(href, href_list[]) - switch(href_list["choice"]) - if("activate_captains_key") - ead.captains_key = 1 - return 1 - if("activate_secondary_key") - ead.secondary_key = 1 - return 1 - if("activate_ead") - ead.activated = 1 - return 1 - if("reassign_head_loyalist") - var/mob/M = get_reassignment_candidate("Loyalist") - if(M) - head_loyalist = M.mind - equip_head_loyalist() - return 1 - if("reassign_head_mutineer") - var/mob/M = get_reassignment_candidate("Mutineer") - if(M) - head_mutineer = M.mind - equip_head_mutineer() - return 1 - else - return 0 - -/datum/game_mode/mutiny/proc/get_reassignment_candidate(faction) - var/list/targets[0] - for(var/mob/living/carbon/human/H in player_list) - if(H.is_ready() && !H.is_dead()) - targets.Add(H) - - return input("Select a player to lead the [faction] faction.", "Head [faction] reassignment", null) as mob in targets diff --git a/code/game/gamemodes/mutiny/mutiny_fluff.dm b/code/game/gamemodes/mutiny/mutiny_fluff.dm deleted file mode 100644 index 637028c3158..00000000000 --- a/code/game/gamemodes/mutiny/mutiny_fluff.dm +++ /dev/null @@ -1,197 +0,0 @@ -/datum/mutiny_fluff - var/datum/game_mode/mutiny/mode - - New(datum/game_mode/mutiny/M) - mode = M - - proc/announce_directives() - for(var/obj/machinery/photocopier/faxmachine/fax in world) - if(fax.department == "Captain's Office") - var/obj/item/weapon/paper/directive_x = new(fax.loc) - directive_x.name = "emergency action message" - directive_x.info = get_fax_body() - - proc/get_fax_body() - return {" -
    NOT A DRILL . . . EMERGENCY DIRECTIVE . . . NOT A DRILL
    -

    - TO: Captain [mode.head_loyalist], Commanding Officer, [station_name()]
    - FROM: Nanotrasen Emergency Messaging Relay
    - DATE: [time2text(world.realtime, "MM/DD")]/[game_year]
    - SUBJECT: Directive X
    -

    - - [mode.current_directive.get_description()] - -
    -
    Emergency Authentication Protocol
    -

    - A member of your Command Staff is this shift's designated Emergency Secondary Authenticator.
    - This Emergency Secondary Authenticator is uniquely aware of their role and possesses the Emergency Secondary Authentication Key.
    - As Captain, you possess the Captain's Authentication Key.
    - The Emergency Authentication Device is located in the vault of your station, and requires simultaneous activation of the Authentication Keys.
    - An Authentication Key Pinpointer can be delivered via Cargo Bay to assist recovery of the Authentication Keys should they be lost aboard the station.
    - A key's destruction or removal from the station's perimeter will automatically and irreversibly activate the Emergency Authentication Device. -

    -
    - -
    Orders
    -

    - Captain [mode.head_loyalist], you are to immediately initiate the following procedure; codenamed Directive X: -

    -
      - [get_orders()] -
    -
    - -
    Authentication
    - - Encoded Authentication String: T0JCJUwoIVFDQA==
    - Emergency Action Code: O B B _ L _ _ Q C _
    - ERROR: DECODING INCOMPLETE (40% LOSS) -
    -
    -
    - -
    NOT A DRILL . . . EMERGENCY DIRECTIVE . . . NOT A DRILL
    - "} - - proc/get_orders() - var/text = "
  • Immediate external transmission and signals silence. Evacuation and Cargo services will remain available. All ERT teams are engaged elsewhere. Do not communicate with Central Command under any circumstances.
  • " - for(var/order in mode.current_directive.special_orders) - text += "
  • [order]
  • " - - text += "
  • Upon completion of this Directive, Captain [mode.head_loyalist] and the Emergency Secondary Authenticator must utilise the Captain's Authentication Key and the Emergency Secondary Authentication Key to activate the Emergency Authentication Device.
  • " - return text - - proc/get_pda_body() - return {"← From Anonymous Channel:

    \"You must read this! Nanotrasen Chain of Command COMPROMISED. Command Encryptions BROKEN. [station_name()] Captain [mode.head_loyalist] will receive orders that must NOT BE BROUGHT TO FRUITION! - -They don't care about us they only care about WEALTH and POWER... Share this message with people you trust. - -Be safe, friend.\" (Unable to Reply)

    "} - - proc/announce() - to_chat(world, "The current game mode is - Mutiny!") - to_chat(world, {" -

    The crew will be divided by their sense of ethics when a morally turbulent emergency directive arrives with an incomplete command validation code.

    -The [loyalist_tag("Head Loyalist")] is the Captain, who carries the [loyalist_tag("Captain's Authentication Key")] at all times.
    -The [mutineer_tag("Head Mutineer")] is a random Head of Staff who carries the [mutineer_tag("Emergency Secondary Authentication Key")].

    -Both keys are required to activate the Emergency Authentication Device (EAD) in the vault, signalling to Nanotrasen that the directive is complete. -
    -

    -Loyalists - Follow the Head Loyalist in carrying out [loyalist_tag("Nanotrasen's directives")] then activate the EAD.
    -Mutineers - Prevent the completion of the [mutineer_tag("improperly validated directives")] and the activation of the EAD. -

    "}) - - proc/loyalist_tag(text) - return "[text]" - - proc/mutineer_tag(text) - return "[text]" - - proc/their(datum/mind/head) - if(head.current.gender == MALE) - return "his" - else if(head.current.gender == FEMALE) - return "her" - - return "their" - - proc/loyalist_major_victory() - return {" -Nanotrasen has praised the efforts of Captain [mode.head_loyalist] and loyal members of [their(mode.head_loyalist)] crew, who recently managed to put down a mutiny--amid a local interstellar crisis--aboard the [station_name()], a research station in [system_name()]. -The mutiny was spurred by a top secret directive sent to the station, presumably in response to the crisis within the system. -Despite the mutiny, the crew was successful in implementing the directive and activating their on-board emergency authentication device. -[mode.mutineers.len] members of the station's personnel were charged with terrorist action against the Company and, if found guilty by a Sol magistrate, will be sentenced to life incarceration. -Nanotrasen will be awarding [mode.loyalists.len] members of the crew with the [loyalist_tag("Star of Loyalty")], following their successful efforts, at a ceremony this coming Thursday. -[mode.body_count.len] are believed to have died during the coup. -

    Nanotrasen's image will forever be haunted by the fact that a mutiny took place on one of its own stations.

    - "} - - proc/loyalist_minor_victory() - return {" -Nanotrasen has praised the efforts of Captain [mode.head_loyalist] and loyal members of [their(mode.head_loyalist)] crew, who recently managed to put down a mutiny--amid a local interstellar crisis--aboard the [station_name()], a research station in [system_name()]. -The mutiny was spurred by a top secret directive sent to the station, presumably in response to the crisis within the system. -Despite the mutiny, the crew was successful in implementing the directive. Unfortunately, they failed to notify Central Command of their successes due to a breach in the chain of command. -[mode.mutineers.len] members of the station's personnel were charged with terrorist action against the Company and, if found guilty by a Sol magistrate, will be sentenced to life incarceration. -Nanotrasen will be awarding [mode.loyalists.len] members of the crew with the [loyalist_tag("Star of Loyalty")], following their mostly successful efforts, at a ceremony this coming Thursday. -[mode.body_count.len] are believed to have died during the coup. -

    Nanotrasen's image will forever be haunted by the fact that a mutiny took place on one of its own stations.

    - "} - - proc/no_victory() - return {" -Nanotrasen has been thrust into turmoil following an apparent mutiny by key personnel aboard the [station_name()], a research station in [system_name()]. -The mutiny was spurred by a top secret directive sent to the station, presumably in response to the crisis within the system. -No further information has yet emerged from the station or its crew, who are presumed to be in holding with Nanotrasen investigators. -Nanotrasen officials refuse to comment. -Sources indicate that [mode.mutineers.len] members of the station's personnel are currently under investigation for terrorist activity, and [mode.loyalists.len] crew are currently providing evidence to investigators, believed to be the 'loyal' station personnel. -[mode.body_count.len] are believed to have died during the coup. -

    Nanotrasen's image will forever be haunted by the fact that a mutiny took place on one of its own stations.

    - "} - - proc/mutineer_minor_victory() - return {" -Reports have emerged that an impromptu mutiny has taken place, amid a local interstellar crisis, aboard the [station_name()], a research station in [system_name()]. -The mutiny was spurred by a top secret directive sent to the station, presumably in response to the crisis within the system. -Information at present indicates that the top-secret directive--which has since been retracted--was invalid due to a broken authentication code. Members of the crew, including an unidentified Head of Staff, prevented the directive from being accomplished. -[mode.mutineers.len] members of the station's personnel were released from interrogations today, following a mutiny investigation. -Nanotrasen has reprimanded [mode.loyalists.len] members of the crew for failing to follow command validation procedures. -[mode.body_count.len] are believed to have died during the coup. -

    Even though the directive was not successfully implemented, Nanotrasen's image will forever be haunted by the fact that its authentication protocol was breached with such magnitude and that a mutiny was the result.

    - "} - - proc/mutineer_major_victory() - return {" -Nanotrasen has praised the efforts of [mode.head_mutineer.assigned_role] [mode.head_mutineer] and several other members of the crew, who recently seized control of a company station in [system_name()]--[station_name()]--amid a local interstellar crisis. -What appears to have been a "legitimate" mutiny was spurred by a top secret directive sent to the station, presumably in response to the crisis within the system. -It has been revealed that the directive was invalid and fraudulent. Company officials have not released a statement about the source of the directive. -Thanks to the efforts of the resistant members of the crew, the directive was not carried out. -[mode.mutineers.len] members of the station's personnel were congratulated and awarded with the [mutineer_tag("Star of Bravery")], for their efforts in preventing the illegal directive's completion. -Nanotrasen has [mode.loyalists.len] members of the crew in holding, while it investigates the circumstances that led to the acceptance and initiation of an invalid directive. -[mode.body_count.len] are believed to have died during the coup. -

    Even though the directive was not successfully implemented, Nanotrasen's image will forever be haunted by the fact that its authentication protocol was breached with such magnitude and that a mutiny was the result.

    - "} - - proc/secret_transcript() - return {" -

    Corporate Rival Threat Assessment

    -
    Gilthari Exports Incident Transcript
    -
    CONFIDENTIAL: PROPERTY OF NANOTRASEN
    -Location: Operator's Desk, D Deck, Polumetis Installation
    -Time: 16:11, May 24, 2558 (Sol Reckoning)
    -
    -
    - -
    \[Start of transcript\]
    -
    \[Sound of an internal airlock door opening\]
    -TM: Thank you for coming to see me, Director. I'm afraid this is urgent.
    -D: Mr. Mitchell, first you send cryptic messages to my office and then you request to have me come personally to this barely lit closet you call a workstation; all of this to talk about a computer glitch?
    -
    \[Sound of the internal airlock door shutting\]
    -TM: Do you remember Mallory?
    -D: Who?
    -TM: It's not who, it's what. The computer program we planted in the [system_name()] communications satellite.
    -D: What is so important about this computer program?
    -TM: We call her an eavesdropper. Captures network traffic, records it, and forwards the stream to the receiver autonomously.
    -D: Speak English goddamnit.
    -TM: Standard intelligence acquisition package, sir; we bug their satellite and listen. It's like we have their playbook and we know what their moves are going to be on the market before they make them.
    -D: So Mallory doesn't work?
    -TM: She worked, sir. We've had an ear on Nanotrasen's regional communications for weeks.
    -D: Any news about their Plasma refinement process?
    -TM: No sir. Our analysts believe they are using a separate channel for their most sensitive data.
    -D: So what's the problem?
    -TM: The intelligence hasn't been doing us any good. Anything that appears actionable, I send it to the analysts and they make a plan. Thing is, Nanotrasen always sees us coming.
    -D: Tim...
    -TM: I think they discovered the hack, sir. Case in point, Energine Consolidated Solutions. That subsidiary of ours that was awarded a lease on Nanotrasen's mining platform in Nyx? Nanotrasen acquired them a week before we made the announcement.
    -D: They know about they have a bug. They left her on and fed her the information for us to hear, those sneaks. How did they find it?
    -TM: Top secret communique came through. I'm not sure what happened. Either Mallory couldn't replicate the encryption scheme and garbled it going out or the transmission was already corrupted to begin with.
    -D: Either way the transmission caused Nanotrasen to look at the satellite. They found out about Mallory.
    -TM: Precisely sir. There's only so much I can do to cover our tracks from here.
    -D: I'm pulling the plug. We have assets in the sector that are capable of a job like this. Thank you for bringing this to my attention.
    -
    \[Computer device chirps\]
    -D: One last thing, did you happen to read anything from those secure transmissions?
    -TM: Just the subject, 'Directive X'.
    -D: Directive X... Now what do you suppose that means?
    -
    \[End of transcript\]
    - "} diff --git a/code/game/gamemodes/mutiny/mutiny_hooks.dm b/code/game/gamemodes/mutiny/mutiny_hooks.dm deleted file mode 100644 index 7e751496dd3..00000000000 --- a/code/game/gamemodes/mutiny/mutiny_hooks.dm +++ /dev/null @@ -1,27 +0,0 @@ -/hook/death/proc/track_kills(mob/living/carbon/human/deceased, gibbed) - var/datum/game_mode/mutiny/mode = get_mutiny_mode() - if(!mode) return 1 - - mode.body_count+=deceased.mind - return 1 - -/hook/clone/proc/update_icon(mob/living/carbon/human/H) - var/datum/game_mode/mutiny/mode = get_mutiny_mode() - if(!mode) return 1 - - mode.update_icon(H.mind) - return 1 - -/hook/harvest_podman/proc/update_icon(mob/living/simple_animal/diona/D) - var/datum/game_mode/mutiny/mode = get_mutiny_mode() - if(!mode) return 1 - - mode.update_icon(D.mind) - return 1 - -/hook/roundend/proc/report_mutiny_news() - var/datum/game_mode/mutiny/mode = get_mutiny_mode() - if(!mode) return 1 - - mode.round_outcome() - return 1 diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 2d3d3c93822..07836c824d7 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -91,38 +91,6 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) \ return 0 return 1 -/datum/objective/mutiny/rp -/datum/objective/mutiny/rp/find_target() - ..() - if(target && target.current) - explanation_text = "Assassinate, capture or convert [target.current.real_name], the [target.assigned_role]." - else - explanation_text = "Free Objective" - -//less violent rev objectives -/datum/objective/mutiny/rp/check_completion() - if(target && target.current) - if(target.current.stat == DEAD) - return 1 - if(!ishuman(target.current)) - return 1 - if(iscarbon(target.current)) - var/mob/living/carbon/C = target.current - if(C.handcuffed) - return 1 - - if(GAMEMODE_IS_REVOLUTION) - if(target in ticker.mode.head_revolutionaries) - return 1 - - var/turf/T = get_turf(target.current) - if(T && !is_station_level(T.z)) - return 1 - - return 0 - return 1 - - /datum/objective/maroon martyr_compatible = 1 diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 512e2393f83..4234ea2773c 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -530,10 +530,6 @@ if(ticker.mode.greyshirts.len) dat += check_role_table("Greyshirts", ticker.mode.greyshirts) - var/datum/game_mode/mutiny/mutiny = get_mutiny_mode() - if(mutiny) - dat += mutiny.check_antagonists_ui(src) - dat += "" usr << browse(dat, "window=roundstatus;size=400x500") else diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm index a78e65eec79..d8491b4a38b 100644 --- a/code/modules/client/preference/preferences.dm +++ b/code/modules/client/preference/preferences.dm @@ -23,7 +23,6 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts // ROLE_GANG = 21, ROLE_BORER = 21, ROLE_NINJA = 21, - ROLE_MUTINEER = 21, ROLE_ABDUCTOR = 30, ) diff --git a/config/example/config.txt b/config/example/config.txt index a3066e3d234..20fe44173b6 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -86,12 +86,10 @@ PROBABILITY VAMPIRE 3 PROBABILITY RAGINMAGES 0 PROBABILITY BORER 0 PROBABILITY XENOS 0 -PROBABILITY MUTINY 0 -PROBABILITY METEOR 1 +PROBABILITY METEOR 0 PROBABILITY TRAITOR 0 PROBABILITY SHADOWLING 2 -PROBABILITY NATIONS 1 -PROBABILITY RP-REVOLUTION 0 +PROBABILITY NATIONS 0 ## Hash out to disable random events during the round. ALLOW_RANDOM_EVENTS diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index 92d1ac397ef80e40257551c3dbb9d28551cfa69d..74a0ddef98bdbe232e994778e05b572320f8e434 100644 GIT binary patch literal 13502 zcmch7cU%)|w{8#+q$>(Y6@`sT@0|#U8jxy1I*3RoAiX7YwuQ2Tic+PEROwO@nxN8q zC-fE|v=B&0atHVK{mwb}o^$RW_d7Sg%*;D8@65bqt@S=@t>>kY!ChtsZUztt#0

    ZlV+j`tAikP{!vwn!go{ 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 diff --git a/paradise.dme b/paradise.dme index 5847ccb02b8..059c58a6428 100644 --- a/paradise.dme +++ b/paradise.dme @@ -437,22 +437,6 @@ #include "code\game\gamemodes\miniantags\revenant\revenant_spawn_event.dm" #include "code\game\gamemodes\miniantags\slaughter\bloodcrawl.dm" #include "code\game\gamemodes\miniantags\slaughter\slaughter.dm" -#include "code\game\gamemodes\mutiny\auth_key.dm" -#include "code\game\gamemodes\mutiny\directive.dm" -#include "code\game\gamemodes\mutiny\emergency_authentication_device.dm" -#include "code\game\gamemodes\mutiny\key_pinpointer.dm" -#include "code\game\gamemodes\mutiny\mutiny.dm" -#include "code\game\gamemodes\mutiny\mutiny_admin.dm" -#include "code\game\gamemodes\mutiny\mutiny_fluff.dm" -#include "code\game\gamemodes\mutiny\mutiny_hooks.dm" -#include "code\game\gamemodes\mutiny\directives\alien_fraud_directive.dm" -#include "code\game\gamemodes\mutiny\directives\bluespace_contagion_directive.dm" -#include "code\game\gamemodes\mutiny\directives\financial_crisis_directive.dm" -#include "code\game\gamemodes\mutiny\directives\ipc_virus_directive.dm" -#include "code\game\gamemodes\mutiny\directives\research_to_ripleys_directive.dm" -#include "code\game\gamemodes\mutiny\directives\tau_ceti_needs_women_directive.dm" -#include "code\game\gamemodes\mutiny\directives\terminations_directive.dm" -#include "code\game\gamemodes\mutiny\directives\vox_heist.dm" #include "code\game\gamemodes\nations\nations.dm" #include "code\game\gamemodes\nations\nationsdatums.dm" #include "code\game\gamemodes\nations\nationsprocs.dm"