diff --git a/code/datums/achievements/achievements.dm b/code/datums/achievements/achievements.dm
index e7caa961f043..074b916aa8ce 100644
--- a/code/datums/achievements/achievements.dm
+++ b/code/datums/achievements/achievements.dm
@@ -5,7 +5,7 @@
var/hidden = FALSE // Whether or not this achievement's description is hidden untill you accomplish this (doesn't apply to the online viewer)
/datum/achievement/bubblegum
- name = "Kick Ass and Chew Bubblegum."
+ name = "Kick Ass and Chew Bubblegum"
desc = "Kill Bubblegum, the king of slaughter demons." //Should be improved(?)
id = 1
@@ -40,3 +40,56 @@
desc = "Kill yourself using the nuclear authentication disk"
id = 7
hidden = TRUE
+
+/datum/achievement/badass
+ name = "Badass Syndie"
+ desc = "As a traitor, complete your objectives without buying any items"
+ id = 8
+
+/datum/achievement/jones
+ name = "Lead Lined"
+ desc = "Survive an explosion while inside of a freezer"
+ id = 9
+ hidden = TRUE
+
+/datum/achievement/wizwin
+ name = "Scholars of the Arcane"
+ desc = "As a wizard, complete your objectives"
+ id = 10
+
+/datum/achievement/cpr
+ name = "Breath of Life"
+ desc = "Perform CPR on someone..."
+ id = 11
+
+/datum/achievement/anticpr
+ name = "Breath of Death"
+ desc = "... with incompatible lungs"
+ id = 12
+ hidden = TRUE
+
+/datum/achievement/changelingwin
+ name = "The Thing"
+ desc = "As a changeling, complete your objectives"
+ id = 13
+
+/datum/achievement/slingascend
+ name = "The Dark Shadow"
+ desc = "As a shadowling, ascend successfully"
+ id = 14
+
+/datum/achievement/death
+ name = "Flatlined"
+ desc = "You died"
+ id = 15
+
+/datum/achievement/cremated
+ name = "Back to Carbon"
+ desc = "Get cremated"
+ id = 16
+
+/datum/achievement/cremated_alive
+ name = "Burn in Hell"
+ desc = "Get cremated... alive"
+ id = 17
+ hidden = TRUE
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm
index e33d231db5eb..8e70649f534e 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm
@@ -23,6 +23,9 @@
/obj/structure/closet/secure_closet/freezer/ex_act()
if(!jones)
jones = TRUE
+ for(var/mob/I in contents)
+ if(I.client && I.stat != DEAD)
+ SSachievements.unlock_achievement(/datum/achievement/jones, I.client)
else
..()
diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm
index e50fa5f82d2d..b96a443887ef 100644
--- a/code/game/objects/structures/morgue.dm
+++ b/code/game/objects/structures/morgue.dm
@@ -261,8 +261,14 @@ GLOBAL_LIST_EMPTY(crematoriums)
update_icon()
for(var/mob/living/M in conts)
- if (M.stat != DEAD)
+ if(M.stat != DEAD)
M.emote("scream")
+ if(M.client)
+ if(M.stat != DEAD)
+ SSachievements.unlock_achievement(/datum/achievement/cremated_alive, M.client) //they are in body and alive, give achievement
+ SSachievements.unlock_achievement(/datum/achievement/cremated, M.client) //they are in body, but dead, they can have one achievement
+ else if(M.oobe_client) //they might be ghosted if they are dead, we'll allow it.
+ SSachievements.unlock_achievement(/datum/achievement/cremated, M.oobe_client) //no burning alive achievement if you are ghosted though
if(user)
log_combat(user, M, "cremated")
else
diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm
index 69cb5e125a31..6dee8174de05 100644
--- a/code/modules/antagonists/changeling/changeling.dm
+++ b/code/modules/antagonists/changeling/changeling.dm
@@ -568,6 +568,7 @@
if(changelingwin)
parts += "The changeling was successful!"
+ SSachievements.unlock_achievement(/datum/achievement/changelingwin, owner.current.client) //changeling wins, give achivement
else
parts += "The changeling has failed."
diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm
index 2de67e6bfca9..91be0d5526da 100644
--- a/code/modules/antagonists/traitor/datum_traitor.dm
+++ b/code/modules/antagonists/traitor/datum_traitor.dm
@@ -398,6 +398,7 @@
if(TC_uses==0 && traitorwin)
var/static/icon/badass = icon('icons/badass.dmi', "badass")
uplink_text += "[icon2html(badass, world)]"
+ SSachievements.unlock_achievement(/datum/achievement/badass, owner.current.client)
result += uplink_text
result += objectives_text
diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm
index cdf68addf530..6effc95ebc15 100644
--- a/code/modules/antagonists/wizard/wizard.dm
+++ b/code/modules/antagonists/wizard/wizard.dm
@@ -304,6 +304,7 @@
if(wizardwin)
parts += "The wizard was successful!"
+ SSachievements.unlock_achievement(/datum/achievement/wizwin, owner.current.client) //wizard wins, give achievement
else
parts += "The wizard has failed!"
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index 3f2a47b7b821..607f176ec01e 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -47,6 +47,9 @@
var/datum/antagonist/hivemind/hive = mind.has_antag_datum(/datum/antagonist/hivemind)
hive.destroy_hive()
+ if(client)
+ SSachievements.unlock_achievement(/datum/achievement/death, client)
+
/mob/living/carbon/human/proc/makeSkeleton()
ADD_TRAIT(src, TRAIT_DISFIGURED, TRAIT_GENERIC)
set_species(/datum/species/skeleton)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index b20e1fa135f0..02a5e7338a0e 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -643,15 +643,18 @@
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "perform_cpr", /datum/mood_event/perform_cpr)
C.cpr_time = world.time
log_combat(src, C, "CPRed")
+ SSachievements.unlock_achievement(/datum/achievement/cpr, client)
// yogs start - can't CPR people with ash walker lungs whithout having them yourself
if(they_breathe && they_ashlung && !we_ashlung)
C.adjustOxyLoss(anticpr)
C.updatehealth()
to_chat(C, "You feel a breath of fresh air enter your lungs... you feel worse...")
+ SSachievements.unlock_achievement(/datum/achievement/anticpr, client) //you can get both achievements at the same time I guess
else if(they_breathe && they_lung && we_ashlung)
C.adjustOxyLoss(anticpr)
C.updatehealth()
to_chat(C, "You feel a breath of fresh air enter your lungs... you feel worse...")
+ SSachievements.unlock_achievement(/datum/achievement/anticpr, client)
//yogs end
else if(they_breathe && they_lung)
var/suff = min(C.getOxyLoss(), 7)
diff --git a/yogstation/code/modules/antagonists/shadowling/special_shadowling_abilities.dm b/yogstation/code/modules/antagonists/shadowling/special_shadowling_abilities.dm
index 8b3fcd1d7c0d..0fcbb44f378f 100644
--- a/yogstation/code/modules/antagonists/shadowling/special_shadowling_abilities.dm
+++ b/yogstation/code/modules/antagonists/shadowling/special_shadowling_abilities.dm
@@ -164,6 +164,7 @@
SEND_SOUND(M, sound('sound/hallucinations/veryfar_noise.ogg'))
for(var/obj/machinery/power/apc/A in GLOB.apcs_list)
A.overload_lighting()
+ SSachievements.unlock_achievement(/datum/achievement/slingascend, H.client)
var/mob/A = new /mob/living/simple_animal/ascendant_shadowling(H.loc)
for(var/X in H.mind.spell_list)
var/obj/effect/proc_holder/spell/S = X