Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adds Antag Mastery Achievements #6476

Closed
wants to merge 16 commits into from
1 change: 1 addition & 0 deletions beestation.dme
Expand Up @@ -411,6 +411,7 @@
#include "code\datums\world_topic.dm"
#include "code\datums\achievements\_achievement_data.dm"
#include "code\datums\achievements\_awards.dm"
#include "code\datums\achievements\antagmastery.dm"
#include "code\datums\achievements\boss_achievements.dm"
#include "code\datums\achievements\boss_scores.dm"
#include "code\datums\achievements\misc_achievements.dm"
Expand Down
23 changes: 23 additions & 0 deletions code/__DEFINES/achievements.dm
Expand Up @@ -30,6 +30,29 @@
#define MEDAL_DRUNK "Little Chickadee"
#define MEDAL_CAYENNE_DISK "Very Important Piscis"


//Antag Mastery Medals
#define MASTERY_ABDUCTOR "Abductor Mastery"
#define MASTERY_BLOB "Blob Mastery"
#define MASTERY_BROTHER "Blood Brother Mastery"
#define MASTERY_CHANGELING "Changeling Mastery"
#define MASTERY_CLOCKCULT "Clock Cult Mastery"
#define MASTERY_CULT "Cult Mastery"
#define MASTERY_HERETIC "Heretic Mastery"
#define MASTERY_GUARDIAN "Guardian Mastery"
#define MASTERY_INCURSION "Incursion Mastery"
#define MASTERY_NINJA "Ninja Mastery"
#define MASTERY_NUKEOP "Nuke Op Mastery"
#define MASTERY_PIRATE "Pirate Mastery"
#define MASTERY_REVENANT "Revenant Mastery"
#define MASTERY_REVOLUTION "Revolution Mastery"
#define MASTERY_DRAGON "Space Dragon Mastery"
#define MASTERY_TRAITOR "Traitor Mastery"
#define MASTERY_LONEOP "Lone Op Mastery"
#define MASTERY_WIZARD "Wizard Mastery"
#define MASTERY_XENOMORPH "Xenomorph Mastery"
#define MASTERY_ALLANTAGS "Syndie Supreme"

//Boss medals

// Medal hub IDs for boss medals (Pre-fixes)
Expand Down
1 change: 1 addition & 0 deletions code/__HELPERS/roundend.dm
Expand Up @@ -147,6 +147,7 @@
var/client/C = GLOB.directory[ckey(A.owner.key)]
if (C)
greentexters |= C
A.check_mastery()

for (var/client/C in greentexters)
C.process_greentext()
Expand Down
4 changes: 4 additions & 0 deletions code/controllers/subsystem/achievements.dm
Expand Up @@ -10,12 +10,16 @@ SUBSYSTEM_DEF(achievements)
var/list/datum/award/score/scores = list()
///List of all awards
var/list/datum/award/awards = list()
///List of all antag mastery achievements, kept here for Syndie Supreme checking
var/list/datum/award/achievement/antagmastery/antag_mastery_list = list()

/datum/controller/subsystem/achievements/Initialize(timeofday)
if(!SSdbcore.Connect())
return ..()
achievements_enabled = TRUE

antag_mastery_list = subtypesof(/datum/award/achievement/antagmastery)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should be protected from var edits


for(var/T in subtypesof(/datum/award/achievement))
var/instance = new T
achievements[T] = instance
Expand Down
111 changes: 111 additions & 0 deletions code/datums/achievements/antagmastery.dm
@@ -0,0 +1,111 @@
/datum/award/achievement/antagmastery
category = "Antag Mastery"
reward = 400

/datum/award/achievement/antagmastery/on_unlock(mob/user)
. = ..()
for(var/achievement_type in SSachievements.antag_mastery_list)
if(!user.client?.player_details.achievements.get_achievement_status(achievement_type))
return
user.client?.give_award(/datum/award/achievement/antagmastery/super, user)

/datum/award/achievement/antagmastery/super
name = "Syndie Supreme"
desc = "Possess all other antagonist mastery achievements."
database_id = MASTERY_ALLANTAGS

/datum/award/achievement/antagmastery/abductor
name = "Area 51"
desc = "As an Abductor, double your experimentation goal."
database_id = MASTERY_ABDUCTOR

/datum/award/achievement/antagmastery/blob
name = "No Strain Train"
desc = "As a Blob, reach critical mass without changing strain."
database_id = MASTERY_BLOB

/datum/award/achievement/antagmastery/brother
name = "Brother from Another Mother"
desc = "As a Blood Brother, complete your objectives and escape with all of your teammates."
database_id = MASTERY_BROTHER

/datum/award/achievement/antagmastery/changeling
name = "Pretender to the Armchair"
desc = "As a Changeling, escape as the Captain or Acting Captain."
database_id = MASTERY_CHANGELING

/datum/award/achievement/antagmastery/clock_cult
name = "Engine of Destruction"
desc = "As a Clockwork Cultist, successfully open the Ark after elevating to Delta Alert before the one hour mark."
database_id = MASTERY_CLOCKCULT

/datum/award/achievement/antagmastery/cult
name = "Another Day, Another Eldritch God"
desc = "As a Blood Cultist, summon Nar'Sie before the one hour mark."
database_id = MASTERY_CULT

/datum/award/achievement/antagmastery/heretic
name = "Drive Thru Heresy"
desc = "As a Heretic, achieve ascension before the one hour mark."
database_id = MASTERY_HERETIC

/datum/award/achievement/antagmastery/guardian
name = "One Nice Stand"
desc = "As a Guardian, assist your master in completing their objectives."
database_id = MASTERY_GUARDIAN

/datum/award/achievement/antagmastery/incursion
name = "Mission: Impossible"
desc = "As an Incursionist, complete your objectives and escape with all of your teammates."
database_id = MASTERY_INCURSION

/datum/award/achievement/antagmastery/ninja
name = "I Call Shogun"
desc = "As a Space Ninja, complete your objectives and escape alive."
database_id = MASTERY_NINJA

/datum/award/achievement/antagmastery/nukeop
name = "Cool Guys Don't Look At Explosions"
desc = "As a Nuclear Operative, destroy the station and escape with all of your teammates."
database_id = MASTERY_NUKEOP

/datum/award/achievement/antagmastery/pirate
name = "The Best Pirate I've Ever Seen"
desc = "As a Space Pirate, steal two hundred thousand credits of loot and survive until the end of the round."
database_id = MASTERY_PIRATE

/datum/award/achievement/antagmastery/revenant
name = "DiCaprio Jr."
desc = "As a Revenant, steal one thousand essence points and survive until the end of the round."
database_id = MASTERY_REVENANT

/datum/award/achievement/antagmastery/revolution
name = "Make Love Not War"
desc = "As a Head Revolutionary, overthrow the Heads of Staff with all Head Revolutionaries and Heads of Staff alive."
database_id = MASTERY_REVOLUTION

/datum/award/achievement/antagmastery/space_dragon
name = "Breakfast of Champions"
desc = "As a Space Dragon, eat all of the Heads of Staff and survive until the end of the round."
database_id = MASTERY_DRAGON

/datum/award/achievement/antagmastery/traitor
name = "Bad Ass Syndie"
desc = "As a Traitor, accomplish your objectives without spending any Telecrystals."
database_id = MASTERY_TRAITOR

/datum/award/achievement/antagmastery/loneop
name = "Bad Ass Nukie"
desc = "As a Lone Operative, destroy the station without spending any Telecrystals."
database_id = MASTERY_LONEOP

/datum/award/achievement/antagmastery/wizard
name = "Penned and Told"
desc = "As a Wizard, complete your objectives without buying any spells."
database_id = MASTERY_WIZARD

/datum/award/achievement/antagmastery/xeno
name = "Outbreak Prime"
desc = "As a Xenomorph, arrive at CentCom on an escape shuttle that contains no living non-xenomorphs."
database_id = MASTERY_XENOMORPH

3 changes: 3 additions & 0 deletions code/modules/antagonists/_common/antag_datum.dm
Expand Up @@ -264,6 +264,9 @@ GLOBAL_LIST(admin_antag_list)
var/datum/objective/hijack/H = locate() in objectives
return H?.hijack_speed_override || hijack_speed

/datum/antagonist/proc/check_mastery() //Will only fire if they greentext
return

//This one is created by admin tools for custom objectives
/datum/antagonist/custom
antagpanel_category = "Custom"
Expand Down
8 changes: 8 additions & 0 deletions code/modules/antagonists/abductor/abductor.dm
Expand Up @@ -134,6 +134,14 @@
else
H.equipOutfit(/datum/outfit/abductor/scientist)

/datum/antagonist/abductor/check_mastery()
if(!istype(team, /datum/team/abductor_team))
return
var/datum/team/abductor_team/T = team
for(var/obj/machinery/abductor/experiment/E in GLOB.machines)
if(E.team_number == T.team_number && E.points > 12)
owner.current.client?.give_award(/datum/award/achievement/antagmastery/abductor, owner.current)

/datum/team/abductor_team
member_name = "abductor"
var/team_number
Expand Down
7 changes: 7 additions & 0 deletions code/modules/antagonists/blob/blob.dm
Expand Up @@ -46,6 +46,13 @@
pop_action = new
pop_action.Grant(owner.current)

/datum/antagonist/blob/check_mastery()
if(isovermind(owner.current))
var/mob/camera/blob/overmind = owner.current
if(!overmind.has_rerolled)
owner.current.client?.give_award(/datum/award/achievement/antagmastery/blob, owner.current)


/datum/objective/blob_takeover
explanation_text = "Reach critical mass!"

Expand Down
2 changes: 2 additions & 0 deletions code/modules/antagonists/blob/overmind.dm
Expand Up @@ -42,6 +42,7 @@ GLOBAL_LIST_EMPTY(blob_nodes)
var/announcement_size = 75
var/announcement_time
var/has_announced = FALSE
var/has_rerolled = FALSE

/// The list of strains the blob can reroll for.
var/list/strain_choices
Expand Down Expand Up @@ -128,6 +129,7 @@ GLOBAL_LIST_EMPTY(blob_nodes)
if(!has_announced && (world.time >= announcement_time || blobs_legit.len >= announcement_size))
priority_announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", ANNOUNCER_OUTBREAK5)
has_announced = TRUE

/mob/camera/blob/proc/victory()
sound_to_playing_players('sound/machines/alarm.ogg')
sleep(100)
Expand Down
1 change: 1 addition & 0 deletions code/modules/antagonists/blob/powers.dm
Expand Up @@ -384,6 +384,7 @@
var/datum/blobstrain/other_strain = _other_strain
if (initial(other_strain.name) == strain_result)
set_strain(other_strain)
has_rerolled = TRUE

if (free_strain_rerolls)
free_strain_rerolls -= 1
Expand Down
6 changes: 6 additions & 0 deletions code/modules/antagonists/brother/brother.dm
Expand Up @@ -96,6 +96,12 @@
message_admins("[key_name_admin(admin)] made [key_name_admin(new_owner)] and [key_name_admin(bro)] into blood brothers.")
log_admin("[key_name(admin)] made [key_name(new_owner)] and [key_name(bro)] into blood brothers.")

/datum/antagonist/brother/check_mastery()
for(var/datum/mind/M in team.members)
if(M.current.stat == DEAD || !is_station_level(M.current.z))
return
owner.current.client?.give_award(/datum/award/achievement/antagmastery/brother, owner.current)

/datum/team/brother_team
name = "brotherhood"
member_name = "blood brother"
Expand Down
7 changes: 7 additions & 0 deletions code/modules/antagonists/changeling/changeling.dm
Expand Up @@ -582,3 +582,10 @@

/datum/antagonist/changeling/xenobio/antag_listing_name()
return ..() + "(Xenobio)"

/datum/antagonist/changeling/check_mastery()
if(owner.current && ishuman(owner.current))
var/mob/living/carbon/human/C = owner.current
var/obj/item/card/id/id_card = C.get_idcard()
if(ACCESS_CAPTAIN in id_card.access)
C.client?.give_award(/datum/award/achievement/antagmastery/changeling, C)
2 changes: 2 additions & 0 deletions code/modules/antagonists/clock_cult/clockwork_massive.dm
Expand Up @@ -194,6 +194,8 @@ GLOBAL_LIST_INIT(clockwork_portals, list())
resistance_flags |= INDESTRUCTIBLE
for(var/mob/living/M in GLOB.all_servants_of_ratvar)
M.status_flags |= GODMODE
if(world.time <= 30 MINUTES)
M.client?.give_award(/datum/award/achievement/antagmastery/clock_cult, M)
sound_to_playing_players(volume = 100, channel = CHANNEL_JUSTICAR_ARK, S = sound('sound/effects/ratvar_rises.ogg')) //End the sounds
GLOB.ratvar_risen = TRUE
var/original_matrix = matrix()
Expand Down
4 changes: 4 additions & 0 deletions code/modules/antagonists/cult/runes.dm
Expand Up @@ -508,6 +508,10 @@ structure_check() searches for nearby cultist structures required for the invoca
gateway.open_gateway()
else
new /obj/eldritch/narsie(T) //Causes Nar'Sie to spawn even if the rune has been removed
if(world.time <= 30 MINUTES)
var/datum/antagonist/cult/C = user.mind.has_antag_datum(/datum/antagonist/cult)
for(var/mob/M in C.cult_team.members)
M.client?.give_award(/datum/award/achievement/antagmastery/cult, M)

/obj/effect/rune/narsie/attackby(obj/I, mob/user, params) //Since the narsie rune takes a long time to make, add logging to removal.
if((istype(I, /obj/item/melee/cultblade/dagger) && iscultist(user)))
Expand Down
2 changes: 2 additions & 0 deletions code/modules/antagonists/eldritch_cult/knowledge/ash_lore.dm
Expand Up @@ -123,6 +123,8 @@
user.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/fire_cascade/big)
user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/fire_sworn)
var/mob/living/carbon/human/H = user
if(world.time <= 1 HOURS)
H.client?.give_award(/datum/award/achievement/antagmastery/heretic, H)
H.physiology.brute_mod *= 0.5
H.physiology.burn_mod *= 0.5
for(var/X in trait_list)
Expand Down
Expand Up @@ -213,6 +213,8 @@
if(!ishuman(user))
return
var/mob/living/carbon/human/H = user
if(world.time <= 1 HOURS)
H.client?.give_award(/datum/award/achievement/antagmastery/heretic, H)
H.physiology.brute_mod *= 0.5
H.physiology.burn_mod *= 0.5
var/datum/antagonist/heretic/heretic = user.mind.has_antag_datum(/datum/antagonist/heretic)
Expand Down
2 changes: 2 additions & 0 deletions code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm
Expand Up @@ -119,6 +119,8 @@
for(var/X in trait_list)
ADD_TRAIT(user,X,MAGIC_TRAIT)
priority_announce("$^@&#*$^@(#&$(@&#^$&#^@# Fear the decay, for the Rustbringer, [user.real_name] has ascended! None shall escape the corrosion! $^@&#*$^@(#&$(@&#^$&#^@#","#$^@&#*$^@(#&$(@&#^$&#^@#", ANNOUNCER_SPANOMALIES)
if(world.time <= 1 HOURS)
H.client?.give_award(/datum/award/achievement/antagmastery/heretic, H)
new /datum/rust_spread(loc)
return ..()

Expand Down
10 changes: 10 additions & 0 deletions code/modules/antagonists/guardian/guardian.dm
Expand Up @@ -26,3 +26,13 @@
/datum/antagonist/guardian/antag_panel_data()
var/mob/living/simple_animal/hostile/guardian/G = owner.current
return "<B>Summoner: [G.summoner.name]/([ckey(G.summoner.key)])</B>"

/datum/antagonist/guardian/check_mastery()
var/datum/antagonist/A = summoner.has_antag_datum(/datum/antagonist, TRUE)
if(length(A?.objectives))
for(var/datum/objective/O in A.objectives)
if(!O.check_completion())
return
else
return
owner.current.client?.give_award(/datum/award/achievement/antagmastery/guardian, owner.current)
6 changes: 6 additions & 0 deletions code/modules/antagonists/incursion/incursion.dm
Expand Up @@ -106,6 +106,12 @@
var/obj/item/implant/radio/syndicate/selfdestruct/syndio = new
syndio.implant(owner.current)

/datum/antagonist/incursion/check_mastery()
for(var/datum/mind/M in team.members)
if(M.current.stat == DEAD || !is_centcom_level(M.current.z))
return
owner.current.client?.give_award(/datum/award/achievement/antagmastery/incursion, owner.current)
Comment on lines +109 to +113
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Doesn't seem like too much a challenge, but I guess it works


/datum/team/incursion
name = "syndicate incursion force"
member_name = "incursion member"
Expand Down
5 changes: 5 additions & 0 deletions code/modules/antagonists/ninja/ninja.dm
Expand Up @@ -168,3 +168,8 @@
var/datum/atom_hud/antag/ninjahud = GLOB.huds[ANTAG_HUD_NINJA]
ninjahud.leave_hud(ninja)
set_antag_hud(ninja, null)

/datum/antagonist/ninja/check_mastery()
if(!is_centcom_level(owner.current.z))
return
owner.current.client.give_award(/datum/award/achievement/antagmastery/ninja, owner.current)
15 changes: 15 additions & 0 deletions code/modules/antagonists/nukeop/nukeop.dm
Expand Up @@ -233,11 +233,22 @@

return capitalize(newname)

/datum/antagonist/nukeop/check_mastery()
for(var/datum/mind/M in nuke_team.members)
if(M.current.stat == DEAD || is_station_level(M.current.z))
return
owner.current.client?.give_award(/datum/award/achievement/antagmastery/nukeop, owner.current)

/datum/antagonist/nukeop/lone
name = "Lone Operative"
always_new_team = TRUE
send_to_spawnpoint = FALSE //Handled by event
nukeop_outfit = /datum/outfit/syndicate/full
var/init_time

/datum/antagonist/nukeop/lone/New()
. = ..()
init_time = world.time

/datum/antagonist/nukeop/lone/assign_nuke()
if(nuke_team && !nuke_team.tracked_nuke)
Expand All @@ -253,6 +264,10 @@
stack_trace("Station self-destruct not found during lone op team creation.")
nuke_team.memorized_code = null

/datum/antagonist/nukeop/lone/check_mastery()
if(world.time - init_time < 15 MINUTES)
owner.current.client?.give_award(/datum/award/achievement/antagmastery/loneop, owner.current)

/datum/antagonist/nukeop/reinforcement
send_to_spawnpoint = FALSE
nukeop_outfit = /datum/outfit/syndicate/no_crystals
Expand Down
6 changes: 6 additions & 0 deletions code/modules/antagonists/pirate/pirate.dm
Expand Up @@ -37,6 +37,12 @@
objectives |= crew.objectives
. = ..()

/datum/antagonist/pirate/check_mastery()
for(var/obj/machinery/computer/piratepad_control/P in GLOB.machines)
if(P.points >= 200000 && owner.current.stat != DEAD)
owner.current.client?.give_award(/datum/award/achievement/antagmastery/pirate, owner.current)
return

/datum/team/pirate
name = "Pirate crew"

Expand Down