diff --git a/code/game/gamemodes/events/ninja_equipment.dm b/code/game/gamemodes/events/ninja_equipment.dm
index 853f1509747..45bc487eefa 100644
--- a/code/game/gamemodes/events/ninja_equipment.dm
+++ b/code/game/gamemodes/events/ninja_equipment.dm
@@ -243,7 +243,7 @@ ________________________________________________________________________________
var/mob/living/silicon/ai/A = AI
var/display_to = s_control ? U : A//Who do we want to display certain messages to?
- var/dat = "
SpiderOS"
+ var/dat = "SpiderOS"
dat += "
Refresh"
if(spideros)
dat += " |
Return"
@@ -1209,7 +1209,7 @@ ________________________________________________________________________________
U.client.images += image(tempHud,target,"hudoperative")
if("Death Commando")
U.client.images += image(tempHud,target,"huddeathsquad")
- if("Space Ninja")
+ if("Ninja")
U.client.images += image(tempHud,target,"hudninja")
else//If we don't know what role they have but they have one.
U.client.images += image(tempHud,target,"hudunknown1")
diff --git a/code/game/gamemodes/events/space_ninja.dm b/code/game/gamemodes/events/space_ninja.dm
index 78bd4ccedd5..8a0cff26132 100644
--- a/code/game/gamemodes/events/space_ninja.dm
+++ b/code/game/gamemodes/events/space_ninja.dm
@@ -52,7 +52,7 @@ ________________________________________________________________________________
How to do that:
Make sure your character has a mind.
Change their assigned_role to "MODE", no quotes. Otherwise, the suit won't initialize.
- Change their special_role to "Space Ninja", no quotes. Otherwise, the character will be gibbed.
+ Change their special_role to "Ninja", no quotes. Otherwise, the character will be gibbed.
Spawn ninja gear, put it on, hit initialize. Let the suit do the rest. You are now a space ninja.
I don't recommend messing with suit variables unless you really know what you're doing.
@@ -236,8 +236,8 @@ Malf AIs/silicons aren't added. Monkeys aren't added. Messes with objective comp
if(xeno_queen_list.len&&side=="face")//If there are queen about and the probability is 50.
for(var/mob/living/carbon/alien/humanoid/queen/xeno_queen in xeno_queen_list)
var/datum/objective/assassinate/ninja_objective = new
- //We'll do some manual overrides to properly set it up.
ninja_objective.owner = ninja_mind
+ //We'll do some manual overrides to properly set it up.
ninja_objective.target = xeno_queen.mind
ninja_objective.explanation_text = "Kill \the [xeno_queen]."
ninja_mind.objectives += ninja_objective
@@ -302,6 +302,7 @@ Malf AIs/silicons aren't added. Monkeys aren't added. Messes with objective comp
hostile_targets -= current_mind//Remove them from the list.
if(2)//Steal
var/datum/objective/steal/ninja_objective = new
+ ninja_objective.owner = ninja_mind
var/target_item = pick(ninja_objective.possible_items_special)
ninja_objective.set_target(target_item)
ninja_mind.objectives += ninja_objective
@@ -337,12 +338,14 @@ Malf AIs/silicons aren't added. Monkeys aren't added. Messes with objective comp
hostile_targets -= current_mind//Remove them from the list.
if(5)//Download research
var/datum/objective/download/ninja_objective = new
+ ninja_objective.owner = ninja_mind
ninja_objective.gen_amount_goal()
ninja_mind.objectives += ninja_objective
objective_list -= 5
if(6)//Capture
var/datum/objective/capture/ninja_objective = new
+ ninja_objective.owner = ninja_mind
ninja_objective.gen_amount_goal()
ninja_mind.objectives += ninja_objective
@@ -389,17 +392,17 @@ As such, it's hard-coded for now. No reason for it not to be, really.
*/
/proc/generate_ninja_directive(side)
var/directive = "[side=="face"?"Nanotrasen":"The Syndicate"] is your employer. "//Let them know which side they're on.
- switch(rand(1,13))
+ switch(rand(1,19))
if(1)
- directive += "The Spider Clan must not be linked to this operation. Remain as hidden and covert as possible."
+ directive += "The Spider Clan must not be linked to this operation. Remain hidden and covert when possible."
if(2)
- directive += "[station_name] is financed by an enemy of the Spider Clan. Cause as much structural damage as possible."
+ directive += "[station_name] is financed by an enemy of the Spider Clan. Cause as much structural damage as desired."
if(3)
directive += "A wealthy animal rights activist has made a request we cannot refuse. Prioritize saving animal lives whenever possible."
if(4)
- directive += "The Spider Clan absolutely cannot be linked to this operation. Eliminate all witnesses using most extreme prejudice."
+ directive += "The Spider Clan absolutely cannot be linked to this operation. Eliminate witnesses at your discretion."
if(5)
- directive += "We are currently negotiating with Nanotrasen command. Prioritize saving human lives over ending them."
+ directive += "We are currently negotiating with NanoTrasen Central Command. Prioritize saving human lives over ending them."
if(6)
directive += "We are engaged in a legal dispute over [station_name]. If a laywer is present on board, force their cooperation in the matter."
if(7)
@@ -409,11 +412,24 @@ As such, it's hard-coded for now. No reason for it not to be, really.
if(9)
directive += "A free agent has proposed a lucrative business deal. Implicate Nanotrasen involvement in the operation."
if(10)
- directive += "Our reputation is on the line. Harm as few civilians or innocents as possible."
+ directive += "Our reputation is on the line. Harm as few civilians and innocents as possible."
if(11)
directive += "Our honor is on the line. Utilize only honorable tactics when dealing with opponents."
if(12)
- directive += "We are currently negotiating with a Syndicate leader. Disguise assassinations as suicide or another natural cause."
+ directive += "We are currently negotiating with a Syndicate leader. Disguise assassinations as suicide or other natural causes."
+ if(13)
+ directive += "Some disgruntled NanoTrasen employees have been supportive of our operations. Be wary of any mistreatment by command staff."
+ if(14)
+ var/xenorace = pick("Unathi","Tajaran", "Skrellian")
+ directive += "A group of [xenorace] radicals have been loyal supporters of the Spider Clan. Favor [xenorace] crew whenever possible."
+ if(15)
+ directive += "The Spider Clan has recently been accused of religious insensitivity. Attempt to speak with the Chaplain and prove these accusations false."
+ if(16)
+ directive += "The Spider Clan has been bargaining with a competing prosthetics manufacturer. Try to shine NanoTrasen prosthetics in a bad light."
+ if(17)
+ directive += "The Spider Clan has recently begun recruiting outsiders. Consider suitable candidates and assess their behavior amongst the crew."
+ if(18)
+ directive += "A cyborg liberation group has expressed interest in our serves. Prove the Spider Clan merciful towards law-bound synthetics."
else
directive += "There are no special supplemental instructions at this time."
return directive
@@ -503,10 +519,9 @@ As such, it's hard-coded for now. No reason for it not to be, really.
/mob/living/carbon/human/proc/create_mind_space_ninja()
mind_initialize()
mind.assigned_role = "MODE"
- mind.special_role = "Space Ninja"
+ mind.special_role = "Ninja"
- //Adds them to current traitor list. Which is really the extra antagonist list.
- ticker.mode.traitors |= mind
+ ticker.mode.ninjas |= mind
return 1
/mob/living/carbon/human/proc/equip_space_ninja(safety=0)//Safety in case you need to unequip stuff for existing characters.
@@ -554,7 +569,7 @@ As such, it's hard-coded for now. No reason for it not to be, really.
U:gloves.icon_state = "s-ninjan"
U:gloves.item_state = "s-ninjan"
else
- if(U.mind.special_role!="Space Ninja")
+ if(U.mind.special_role!="Ninja")
U << "\red fÄTaL ÈÈRRoR: 382200-*#00CÖDE RED\nUNAU†HORIZED USÈ DETÈC†††eD\nCoMMÈNCING SUB-R0U†IN3 13...\nTÈRMInATING U-U-USÈR..."
U.gib()
return 0
diff --git a/code/game/gamemodes/ninja/ninja.dm b/code/game/gamemodes/ninja/ninja.dm
index 70029762fc8..5ea8f2c5a05 100644
--- a/code/game/gamemodes/ninja/ninja.dm
+++ b/code/game/gamemodes/ninja/ninja.dm
@@ -1,5 +1,5 @@
/datum/game_mode/var/list/datum/mind/ninjas = list()
-
+// Keep in mind ninja-procs that aren't here will be where the event's defined
/datum/game_mode/ninja
name = "ninja"
config_tag = "ninja"
@@ -15,6 +15,7 @@
world << "The current game mode is Ninja!"
/datum/game_mode/ninja/can_start()
+ world << "CAN START CALLED"
if(!..())
return 0
var/list/datum/mind/possible_ninjas = get_players_for_role(BE_NINJA)
@@ -41,21 +42,25 @@
return 1
/datum/game_mode/ninja/pre_setup()
+ world << "PRE SETUP CALLED"
for(var/datum/mind/ninja in ninjas)
+ ninja.current << browse(null, "window=playersetup")
ninja.current = create_space_ninja(pick(ninjastart.len ? ninjastart : latejoin))
ninja.current.ckey = ninja.key
return 1
/datum/game_mode/ninja/post_setup()
+ world << "POST SETUP CALLED"
for(var/datum/mind/ninja in ninjas)
if(ninja.current && !(istype(ninja.current,/mob/living/carbon/human))) return 0
+ forge_ninja_objectives(ninja)
var/mob/living/carbon/human/N = ninja.current
N.internal = N.s_store
N.internals.icon_state = "internal1"
if(N.wear_suit && istype(N.wear_suit,/obj/item/clothing/suit/space/space_ninja))
var/obj/item/clothing/suit/space/space_ninja/S = N.wear_suit
S:randomize_param()
- S:ninitialize(0, N)
+ S:ninitialize(3, N)
spawn (rand(waittime_l, waittime_h))
send_intercept()
return ..()
@@ -74,4 +79,108 @@
return ..()
else
finished = 1
- return 1
\ No newline at end of file
+ return 1
+
+/datum/game_mode/ninja/proc/forge_ninja_objectives(var/datum/mind/ninja)
+ world << "NINJA OBJECTIVES FORGED"
+ var/objective_list[] = list(1,2,3,4,5)
+ for(var/i=rand(2,4),i>0,i--)
+ switch(pick(objective_list))
+ if(1)//Kill
+ var/datum/objective/assassinate/ninja_objective = new
+ ninja_objective.owner = ninja
+ ninja_objective.target = ninja_objective.find_target()
+ if(ninja_objective.target != "Free Objective")
+ ninja.objectives += ninja_objective
+ else
+ i++
+ objective_list -= 1 // No more than one kill objective
+ if(2)//Steal
+ var/datum/objective/steal/ninja_objective = new
+ ninja_objective.owner = ninja
+ ninja_objective.target = ninja_objective.find_target()
+ ninja.objectives += ninja_objective
+ if(3)//Protect
+ var/datum/objective/protect/ninja_objective = new
+ ninja_objective.owner = ninja
+ ninja_objective.target = ninja_objective.find_target()
+ if(ninja_objective.target != "Free Objective")
+ ninja.objectives += ninja_objective
+ else
+ i++
+ objective_list -= 3
+ if(4)//Download
+ var/datum/objective/download/ninja_objective = new
+ ninja_objective.owner = ninja
+ ninja_objective.gen_amount_goal()
+ ninja.objectives += ninja_objective
+ objective_list -= 4
+ if(5)//Harm
+ var/datum/objective/harm/ninja_objective = new
+ ninja_objective.owner = ninja
+ ninja_objective.target = ninja_objective.find_target()
+ if(ninja_objective.target != "Free Objective")
+ ninja.objectives += ninja_objective
+ else
+ i++
+ objective_list -= 5
+
+ var/datum/objective/survive/ninja_objective = new
+ ninja_objective.owner = ninja
+ ninja.objectives += ninja_objective
+
+ var/directive = generate_ninja_directive("heel")//Only hired by antags, not NT
+ ninja.current << "You are an elite mercenary assassin of the Spider Clan, [ninja.current.real_name]. You have a variety of abilities at your disposal, thanks to your nano-enhanced cyber armor.\nYour current directive is: \red [directive]\n \blue Try your best to adhere to this."
+ ninja.store_memory("Directive: \red [directive]
")
+
+ var/obj_count = 1
+ ninja.current << "\blue Your current objectives:"
+ for(var/datum/objective/objective in ninja.objectives)
+ ninja.current << "Objective #[obj_count]: [objective.explanation_text]"
+ obj_count++
+
+/datum/game_mode/proc/auto_declare_completion_ninja()
+ if(ninjas.len)
+ var/text = "The ninjas were:"
+ for(var/datum/mind/ninja in ninjas)
+ var/ninjawin = 1
+
+ text += "
[ninja.key] was [ninja.name] ("
+ if(ninja.current)
+ if(ninja.current.stat == DEAD)
+ text += "died"
+ else
+ text += "survived"
+ if(ninja.current.real_name != ninja.name)
+ text += " as [ninja.current.real_name]"
+ else
+ text += "body destroyed"
+ text += ")"
+
+ if(ninja.objectives.len)//If the ninja had no objectives, don't need to process this.
+ var/count = 1
+ for(var/datum/objective/objective in ninja.objectives)
+ if(objective.check_completion())
+ text += "
Objective #[count]: [objective.explanation_text] Success!"
+ feedback_add_details("traitor_objective","[objective.type]|SUCCESS")
+ else
+ text += "
Objective #[count]: [objective.explanation_text] Fail."
+ feedback_add_details("traitor_objective","[objective.type]|FAIL")
+ ninjawin = 0
+ count++
+
+ var/special_role_text
+ if(ninja.special_role)
+ special_role_text = lowertext(ninja.special_role)
+ else
+ special_role_text = "antagonist"
+
+ if(ninjawin)
+ text += "
The [special_role_text] was successful!"
+ feedback_add_details("traitor_success","SUCCESS")
+ else
+ text += "
The [special_role_text] has failed!"
+ feedback_add_details("traitor_success","FAIL")
+
+ world << text
+ return 1
\ No newline at end of file
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index f323e26a1c4..6963f20a903 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -569,6 +569,9 @@ datum/objective/steal
for(var/mob/living/silicon/ai/M in C)
if(istype(M, /mob/living/silicon/ai) && M.stat != 2) //See if any AI's are alive inside that card.
return 1
+ for(var/obj/item/clothing/suit/space/space_ninja/S in all_items) //Let an AI downloaded into a space ninja suit count
+ if(S.AI && S.AI.stat != 2)
+ return 1
for(var/mob/living/silicon/ai/ai in world)
if(istype(ai.loc, /turf))
var/area/check_area = get_area(ai)
diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm
index 097540fa588..cea125b7e17 100644
--- a/code/modules/admin/player_panel.dm
+++ b/code/modules/admin/player_panel.dm
@@ -469,6 +469,18 @@
dat += "| Wizard not found! |
"
dat += ""
+ if(ticker.mode.ninjas.len > 0)
+ dat += "
| Ninjas | | |
"
+ for(var/datum/mind/ninja in ticker.mode.ninjas)
+ var/mob/M = ninja.current
+ if(M)
+ dat += "| [M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""] | "
+ dat += "PM | "
+ dat += "Show Objective |
"
+ else
+ dat += "| Ninja not found! |
"
+ dat += "
"
+
if(ticker.mode.cult.len)
dat += "
| Cultists | |
"
for(var/datum/mind/N in ticker.mode.cult)
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index cbdde7cca87..f5ead1fa839 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -357,17 +357,22 @@ Traitors and the like can also be revived with the previous role mostly intact.
if(synd_spawn)
new_character.loc = get_turf(synd_spawn)
call(/datum/game_mode/proc/equip_syndicate)(new_character)
- if("Space Ninja")
- var/ninja_spawn[] = list()
- for(var/obj/effect/landmark/L in landmarks_list)
- if(L.name=="carpspawn")
- ninja_spawn += L
+ if("Ninja")
new_character.equip_space_ninja()
new_character.internal = new_character.s_store
new_character.internals.icon_state = "internal1"
- if(ninja_spawn.len)
- var/obj/effect/landmark/ninja_spawn_here = pick(ninja_spawn)
- new_character.loc = ninja_spawn_here.loc
+ if(ninjastart.len == 0)
+ new_character << "\red A proper starting location for you could not be found, please report this bug!"
+ new_character << "\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 && latejoin.len > 0)
+ new_character << "\red Still no spawneable locations could be found. Defaulting to latejoin."
+ new_character.loc = pick(latejoin)
+ else if (ninjastart.len == 0)
+ new_character << "\red Still no spawneable locations could be found. Aborting."
+
if("Death Commando")//Leaves them at late-join spawn.
new_character.equip_death_commando()
new_character.internal = new_character.s_store
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index e6a76d88e8e..8c1af417ec6 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -14,7 +14,7 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set
"pAI candidate" = 1, // -- TLE // 7
"cultist" = IS_MODE_COMPILED("cult"), // 8
"infested monkey" = IS_MODE_COMPILED("monkey"), // 9
- "space ninja" = "true", // 10
+ "ninja" = "true", // 10
)
var/const/MAX_SAVE_SLOTS = 10
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index 65e44caefe4..4c61f2e60b0 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -57,11 +57,11 @@
if(!gibbed)
emote("deathgasp") //let the world KNOW WE ARE DEAD
- //For ninjas exploding when they die./N
+ //For ninjas exploding when they die.
if( istype(wear_suit, /obj/item/clothing/suit/space/space_ninja) && wear_suit:s_initialized )
src << browse(null, "window=spideros")//Just in case.
var/location = loc
- explosion(location, 1, 2, 3, 4)
+ explosion(location, 0, 0, 3, 4)
update_canmove()
if(client) blind.layer = 0
diff --git a/config/names/ninjaname.txt b/config/names/ninjaname.txt
index b41271dbe10..24d5d6879ef 100644
--- a/config/names/ninjaname.txt
+++ b/config/names/ninjaname.txt
@@ -6,9 +6,12 @@ Scorpion
Zero
Ermac
Saibot
+Sun
+Moon
Cyrax
Raphael
Michaelangelo
+Cloud
Donatello
Leonardo
Splinter
@@ -20,7 +23,6 @@ Ryu
Hayabusa
Midnight
Seven
-McNinja
Hanzo
Blood
Iga
@@ -32,7 +34,6 @@ Baki
Ogre
Daemon
Goemon
-McAwesome
Throat
Death
Aria
diff --git a/config/names/ninjatitle.txt b/config/names/ninjatitle.txt
index 2c7f9e7f73c..966204bb4dc 100644
--- a/config/names/ninjatitle.txt
+++ b/config/names/ninjatitle.txt
@@ -24,7 +24,6 @@ Slayer
Awesome
Ender
Dr.
-Noob
Night
Crimson
Grappler
@@ -43,4 +42,5 @@ Steel
Nickel
Silver
Singing
-Snake
\ No newline at end of file
+Snake
+Acid
\ No newline at end of file