diff --git a/code/datums/spells/lichdom.dm b/code/datums/spells/lichdom.dm
new file mode 100644
index 00000000000..a6ace565803
--- /dev/null
+++ b/code/datums/spells/lichdom.dm
@@ -0,0 +1,108 @@
+/obj/effect/proc_holder/spell/targeted/lichdom
+ name = "Bind Soul"
+ desc = "A dark necromantic pact that can forever bind your soul to an item of your choosing. So long as both your body and the item remain intact you can revive from death, though the time between reincarnations grows steadily with use."
+ school = "necromancy"
+ charge_max = 10
+ clothes_req = 0
+ centcom_cancast = 0
+ invocation = "NECREM IMORTIUM!"
+ invocation_type = "shout"
+ range = -1
+ level_max = 0 //cannot be improved
+ cooldown_min = 10
+ include_user = 1
+
+ var/obj/marked_item
+ var/mob/living/current_body
+
+ action_icon_state = "skeleton"
+
+/obj/effect/proc_holder/spell/targeted/lichdom/New()
+ if(ticker.mode.round_ends_with_antag_death)
+ ticker.mode.round_ends_with_antag_death = 0
+
+ ..()
+/obj/effect/proc_holder/spell/targeted/lichdom/cast(list/targets)
+ for(var/mob/user in targets)
+ var/list/hand_items = list()
+ if(iscarbon(user))
+ hand_items = list(user.get_active_hand(),user.get_inactive_hand())
+
+ if(marked_item && !stat_allowed) //sanity, shouldn't happen without badminry
+ marked_item = null
+ return
+
+ if(stat_allowed) //Death is not my end!
+ if(user.stat == CONSCIOUS && iscarbon(user))
+ user << "You aren't dead enough to revive!" //Usually a good problem to have
+ charge_counter = charge_max
+ return
+
+ if(!marked_item.loc) //Wait nevermind
+ user << "Your phylactery is gone!"
+ return
+
+ if(isobserver(user))
+ var/mob/dead/observer/O = user
+ O.reenter_corpse()
+
+ var/mob/living/carbon/human/lich = new /mob/living/carbon/human(get_turf(marked_item))
+
+ lich.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(lich), slot_shoes)
+ lich.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(lich), slot_w_uniform)
+ lich.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(lich), slot_wear_suit)
+ lich.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/black(lich), slot_head)
+
+ lich.real_name = user.mind.name
+ user.mind.transfer_to(lich)
+ hardset_dna(lich,null,null,lich.real_name,null,/datum/species/skeleton)
+ lich << "Your bones clatter and shutter as they're pulled back into this world!"
+ charge_max += 600
+ var/mob/old_body = current_body
+ current_body = lich
+ lich.Weaken(10)
+
+ if(old_body && old_body.loc)
+ if(iscarbon(old_body))
+ var/mob/living/carbon/C = old_body
+ for(var/obj/item/W in C)
+ C.unEquip(W)
+ var/wheres_wizdo = dir2text(get_dir(get_turf(old_body), get_turf(marked_item)))
+ if(wheres_wizdo)
+ old_body.visible_message("Suddenly [old_body.name]'s corpse falls to pieces! You see a strange energy rise from the remains, and speed off towards the [wheres_wizdo]!")
+ old_body.dust()
+
+ if(!marked_item) //linking item to the spell
+ message = ""
+ for(var/obj/item in hand_items)
+ if(ABSTRACT in item.flags || NODROP in item.flags)
+ continue
+ marked_item = item
+ user << "You begin to focus your very being into the [item.name]..."
+ break
+
+ if(!marked_item)
+ user << "You must hold an item you wish to make your phylactery..."
+
+ spawn(50)
+ if(marked_item.loc != user) //I changed my mind I don't want to put my soul in a cheeseburger!
+ user << "Your soul snaps back to your body as you drop the [marked_item.name]!"
+ marked_item = null
+ return
+ name = "RISE!"
+ desc = "Rise from the dead! You will reform at the location of your phylactery and your old body will crumble away."
+ charge_max = 1800 //3 minute cooldown, if you rise in sight of someone and killed again, you're probably screwed.
+ charge_counter = 1800
+ stat_allowed = 1
+ marked_item.name = "Ensouled [marked_item.name]"
+ marked_item.desc = "A terrible aura surrounds this item, its very existence is offensive to life itself..."
+ marked_item.color = "#003300"
+ user << "With a hideous feeling of emptiness you watch in horrified fascination as skin sloughs off bone! Blood boils, nerves disintegrate, eyes boil in their sockets! As your organs crumble to dust in your fleshless chest you come to terms with your choice. You're a lich!"
+ hardset_dna(user, null, null, null, null, /datum/species/skeleton)
+ current_body = user.mind.current
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ H.unEquip(H.wear_suit)
+ H.unEquip(H.head)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(H), slot_wear_suit)
+ H.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/black(H), slot_head)
\ No newline at end of file
diff --git a/code/datums/spells/summonitem.dm b/code/datums/spells/summonitem.dm
index e74ce4a92c6..7b29e448844 100644
--- a/code/datums/spells/summonitem.dm
+++ b/code/datums/spells/summonitem.dm
@@ -7,7 +7,7 @@
invocation = "GAR YOK"
invocation_type = "whisper"
range = -1
- level_max = 1 //cannot be improved
+ level_max = 0 //cannot be improved
cooldown_min = 100
include_user = 1
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 4bfeecb2247..eddb0216d76 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -188,7 +188,7 @@
return 0
- if(living_antag_player && living_antag_player.mind && living_antag_player.stat != DEAD && !isnewplayer(living_antag_player) &&!isbrain(living_antag_player))
+ if(living_antag_player && living_antag_player.mind && isliving(living_antag_player) && living_antag_player.stat != DEAD && !isnewplayer(living_antag_player) &&!isbrain(living_antag_player))
return 0 //A resource saver: once we find someone who has to die for all antags to be dead, we can just keep checking them, cycling over everyone only when we lose our mark.
for(var/mob/Player in living_mob_list)
diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm
index 8a58076e663..da2e49f4af7 100644
--- a/code/game/gamemodes/wizard/spellbook.dm
+++ b/code/game/gamemodes/wizard/spellbook.dm
@@ -182,6 +182,11 @@
log_name = "IS"
category = "Utility Spells"
+/datum/spellbook_entry/lichdom
+ name = "Bind Soul"
+ spell_type = /obj/effect/proc_holder/spell/targeted/lichdom
+ log_name = "LD"
+
/datum/spellbook_entry/lightningbolt
name = "Lightning Bolt"
spell_type = /obj/effect/proc_holder/spell/targeted/lightning
diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm
index 6eb5f7b9317..ffe58681ab0 100644
--- a/code/game/objects/structures/mirror.dm
+++ b/code/game/objects/structures/mirror.dm
@@ -106,7 +106,20 @@
name = "magic mirror"
desc = "Turn and face the strange... face."
icon_state = "magic_mirror"
+ var/list/races_blacklist = list("skeleton")
+ var/list/choosable_races = list()
+/obj/structure/mirror/magic/New()
+ if(!choosable_races.len)
+ for(var/datum/species/S in typesof(/datum/species) - /datum/species)
+ if(!(S.id in races_blacklist))
+ choosable_races += S
+ ..()
+
+/obj/structure/mirror/magic/badmin/New()
+ for(var/datum/species/S in typesof(/datum/species) - /datum/species)
+ choosable_races += S
+ ..()
/obj/structure/mirror/magic/attack_hand(mob/user as mob)
if(!ishuman(user))
@@ -130,7 +143,7 @@
if("race")
var/newrace
- var/racechoice = input(H, "What are we again?", "Race change") as null|anything in species_list
+ var/racechoice = input(H, "What are we again?", "Race change") as null|anything in choosable_races
newrace = species_list[racechoice]
if(!newrace || !H.dna)
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 311a87950bd..14d8693c3e5 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -307,7 +307,7 @@
if(ratio)
config.midround_antag_life_check = ratio/100
- message_admins("[key_name_admin(usr)] edited the midround antagonist living crew ratio to [ratio * 100]% alive.")
+ message_admins("[key_name_admin(usr)] edited the midround antagonist living crew ratio to [ratio]% alive.")
check_antagonists()
else if(href_list["toggle_noncontinuous_behavior"])
diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm
index 2aecf9f789b..dd22a1e9f5c 100644
--- a/code/modules/clothing/suits/wiz_robe.dm
+++ b/code/modules/clothing/suits/wiz_robe.dm
@@ -19,6 +19,11 @@
desc = "Strange-looking yellow hat-wear that most certainly belongs to a powerful magic user."
icon_state = "yellowwizard"
+/obj/item/clothing/head/wizard/black
+ name = "black wizard hat"
+ desc = "Strange-looking black hat-wear that most certainly belongs to a real skeleton. Spooky."
+ icon_state = "blackwizard"
+
/obj/item/clothing/head/wizard/fake
name = "wizard hat"
desc = "It has WIZZARD written across it in sequins. Comes with a cool beard."
@@ -72,6 +77,12 @@
icon_state = "yellowwizard"
item_state = "yellowwizrobe"
+/obj/item/clothing/suit/wizrobe/black
+ name = "black wizard robe"
+ desc = "An unnerving black gem-lined robe that reeks of death and decay."
+ icon_state = "blackwizard"
+ item_state = "blackwizrobe"
+
/obj/item/clothing/suit/wizrobe/marisa
name = "witch robe"
desc = "Magic is all about the spell power, ZE!"
diff --git a/html/changelogs/Incoming5643-lich.yml b/html/changelogs/Incoming5643-lich.yml
new file mode 100644
index 00000000000..c0a78592a73
--- /dev/null
+++ b/html/changelogs/Incoming5643-lich.yml
@@ -0,0 +1,10 @@
+author: Incoming5643
+
+delete-after: True
+
+changes:
+ - rscadd: "Growing tired of reports of slain members, the Wizard Federation has cautiously sactioned the dark path of lichdom. Beware of the powerful lich who hides his phylactery well, for he is immortal!"
+
+ - rscadd: "The trick to defeating liches is to destroy either their body or their phylactery item before they can ressurect to it. The more a lich is slain the longer it will take him to make use of his phylactery and the more likely the crew is to catch him during a vunerable moment."
+
+ - rscremove: "Due to the addition of proper liching, skeletons as a choosable race from magic mirrors has been discontinued. My apologies to the powergamers. A special admin version of the mirror that allows for skeletons has also been added to the code."
\ No newline at end of file
diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi
index bc98f542874..4ced7caebed 100644
Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index 522826b5530..934435bd835 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index dd1f96dcbfe..6572955ff2b 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index f4d22e41ee2..59ac6436d18 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index b56aa44170d..deca94b24fa 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index c6e84e72c5e..e448e1b78bd 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -227,6 +227,7 @@
#include "code\datums\spells\genetic.dm"
#include "code\datums\spells\inflict_handler.dm"
#include "code\datums\spells\knock.dm"
+#include "code\datums\spells\lichdom.dm"
#include "code\datums\spells\lightning.dm"
#include "code\datums\spells\mime.dm"
#include "code\datums\spells\mind_transfer.dm"