diff --git a/baystation12.dme b/baystation12.dme
index f002ef969d2..e68d87a85f3 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -252,6 +252,7 @@
#include "code\game\gamemodes\malfunction\malfunction.dm"
#include "code\game\gamemodes\meteor\meteor.dm"
#include "code\game\gamemodes\meteor\meteors.dm"
+#include "code\game\gamemodes\ninja\ninja.dm"
#include "code\game\gamemodes\nuclear\nuclear.dm"
#include "code\game\gamemodes\nuclear\nuclearbomb.dm"
#include "code\game\gamemodes\nuclear\pinpointer.dm"
diff --git a/code/game/gamemodes/autotraitor/autotraitor.dm b/code/game/gamemodes/autotraitor/autotraitor.dm
index c5b159dd1a9..f5ddfdfb366 100644
--- a/code/game/gamemodes/autotraitor/autotraitor.dm
+++ b/code/game/gamemodes/autotraitor/autotraitor.dm
@@ -11,7 +11,7 @@
/datum/game_mode/traitor/autotraitor/announce()
..()
- world << "Game mode is AutoTraitor. Traitors will be added to the round automagically as needed.
Expect bugs."
+ world << "Game mode is AutoTraitor. Traitors will be added to the round automagically as needed."
/datum/game_mode/traitor/autotraitor/pre_setup()
diff --git a/code/game/gamemodes/events/space_ninja.dm b/code/game/gamemodes/events/space_ninja.dm
index 2314f382588..55012d30e25 100644
--- a/code/game/gamemodes/events/space_ninja.dm
+++ b/code/game/gamemodes/events/space_ninja.dm
@@ -211,7 +211,7 @@ Malf AIs/silicons aren't added. Monkeys aren't added. Messes with objective comp
ninja_selection_active = 0
//The ninja will be created on the right spawn point or at late join.
- var/mob/living/carbon/human/new_ninja = create_space_ninja(pick(spawn_list.len ? spawn_list : latejoin ))
+ var/mob/living/carbon/human/new_ninja = create_space_ninja(pick(ninjastart))
new_ninja.key = ninja_key
new_ninja.wear_suit:randomize_param()//Give them a random set of suit parameters.
new_ninja.internal = new_ninja.s_store //So the poor ninja has something to breath when they spawn in spess.
@@ -491,8 +491,8 @@ As such, it's hard-coded for now. No reason for it not to be, really.
//=======//NINJA CREATION PROCS//=======//
-/proc/create_space_ninja(obj/spawn_point)
- var/mob/living/carbon/human/new_ninja = new(spawn_point.loc)
+/proc/create_space_ninja(var/loc/spawnpoint)
+ var/mob/living/carbon/human/new_ninja = new(spawnpoint)
var/ninja_title = pick(ninja_titles)
var/ninja_name = pick(ninja_names)
new_ninja.gender = pick(MALE, FEMALE)
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index e1fbf5dfb4f..c0dfd4fb7c3 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -261,7 +261,7 @@ Implants;
set_security_level(SEC_LEVEL_BLUE)*/
-/datum/game_mode/proc/get_players_for_role(var/role, override_jobbans=1)
+/datum/game_mode/proc/get_players_for_role(var/role, override_jobbans=0)
var/list/players = list()
var/list/candidates = list()
var/list/drafted = list()
@@ -275,7 +275,7 @@ Implants;
if(BE_WIZARD) roletext="wizard"
if(BE_REV) roletext="revolutionary"
if(BE_CULTIST) roletext="cultist"
-
+ if(BE_NINJA) roletext="ninja"
// Ultimate randomizing code right here
for(var/mob/new_player/player in player_list)
diff --git a/code/game/gamemodes/ninja/ninja.dm b/code/game/gamemodes/ninja/ninja.dm
new file mode 100644
index 00000000000..1f5e7e5c9fa
--- /dev/null
+++ b/code/game/gamemodes/ninja/ninja.dm
@@ -0,0 +1,41 @@
+/datum/game_mode
+ var/list/datum/mind/ninjas = list()
+
+/datum/game_mode/ninja
+ name = "ninja"
+ config_tag = "ninja"
+ required_players = 2
+ required_players_secret = 10
+ required_enemies = 1
+ recommended_enemies = 1
+
+/datum/game_mode/ninja/announce()
+ world << "The current game mode is Ninja!"
+
+/datum/game_mode/ninja/can_start()
+ if(!..())
+ return 0
+ var/list/datum/mind/possible_ninjas = get_players_for_role(BE_NINJA)
+ if(possible_ninjas.len==0)
+ return 0
+ var/datum/mind/ninja = pick(possible_ninjas)
+ ninjas += ninja
+ modePlayer += ninja
+ ninja.assigned_role = "MODE" //So they aren't chosen for other jobs.
+ ninja.special_role = "Ninja"
+ ninja.original = ninja.current
+ if(ninjastart.len == 0)
+ ninja.current << "\red A proper starting location for you could not be found, please report this bug!"
+ ninja.current << "\red Attempting to place at a carpspawn."
+ for(var/obj/effect/landmark/L in landmarks_list)
+ if(L.name == "carpspawn")
+ ninjastart.Add(L)
+ if(ninjastart.len == 0)
+ ninja.current << "\red Still no spawneable locations could be found. Aborting."
+ return 0
+ return 1
+
+/datum/game_mode/ninja/pre_setup()
+ ninja.current.loc = pick(ninjastart)
+ ninja.current = create_space_ninja(pick(ninjastart))
+ return 1
\ No newline at end of file
diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm
index e1b19a287b6..ba5700b1df3 100644
--- a/code/game/gamemodes/wizard/wizard.dm
+++ b/code/game/gamemodes/wizard/wizard.dm
@@ -45,7 +45,6 @@
/datum/game_mode/wizard/pre_setup()
for(var/datum/mind/wizard in wizards)
wizard.current.loc = pick(wizardstart)
-
return 1
diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm
index b72dafb4c30..ae155f32ade 100644
--- a/code/game/objects/effects/landmarks.dm
+++ b/code/game/objects/effects/landmarks.dm
@@ -69,6 +69,10 @@
xeno_spawn += loc
del(src)
+ if("ninjastart")
+ ninjastart += loc
+ del(src)
+
landmarks_list += src
return 1
diff --git a/code/global.dm b/code/global.dm
index cd6e374a94f..d656197df85 100644
--- a/code/global.dm
+++ b/code/global.dm
@@ -133,6 +133,8 @@ var/list/tdomeadmin = list()
var/list/prisonsecuritywarp = list() //prison security goes to these
var/list/prisonwarped = list() //list of players already warped
var/list/blobstart = list()
+var/list/carpspawn = list()
+var/list/ninjastart = list()
// list/traitors = list() //traitor list
var/list/cardinal = list( NORTH, SOUTH, EAST, WEST )
var/list/alldirs = list(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST)