Stealth and Steel: The Space Ninja (#31497)

* Space Ninja Antag Datum

* Small fixes

* Ninja outfit, ekatana, actions

* Ninja scanner and spans

* Ninja uplink implant

* Ninja bombs

* Ninja bomb flare grants

* Ninja modsuit, objective payouts

* Fixes objectives

* Ninja stealth fix, modsuit sprites and final implementations

* Lints

* Ninja scanner sprites

* Ninja Suit and Energy Shuriken Sprites

* Fixes config, Adjusts stim ability, adds shuriken printer and e-shurikens, uplink stuff

* Fixes a duplicate icon

* Attack chain

* Energy katana item sprite

* Ninja net gun

* Brazil

* Spawning ninjas, ninja on traitor panel, ninja spawn sound

* Linter

* Objective stuff

* Fixes n grey suits

* Objectives

* Trim intro sound

* Event, spawn point

* Ninja Outfits, Vox Check, Bug Fixes, Mirror at ninja spawn

* Address code review

* Oops

* Uncomments an important thingy

* Update: Gave space ninjas access to maints and an agent ID card. Updated net description.

* Update scanner examine

* Removes excess file

* Makes ninja scanner fit in belts and ninja suits. Gives them NV goggles

* Fixes modsuit sprite issue

* Energy shuriken fixes

* Scanner fix

* Printer fix

* Fixes some runtimes

* Fixes capture teleport

* Clothes rename

* Buffs energy katana, adds soft no-drop to ekatana, buffs ninja modsuit, fixes equip bug

* Adds research levels to ninja gear

* Fixes ninja capture issue

* Remaps ninja dojo

* Better cuff removal

* Forgor

* Fixes action availability

* Updates walls at dojo

* Improves ninja modsuit

* Windoors can now be opened with the katana

* Adds advanced pinpointer to ninja uplink

* Fixed energy nets sticking

* Fixes slime people ninjas

* Adds reroll to ninja capture if target is DNR. Prevents off Z-level targets

* Oop

* Adds reactor sabotage objective.

* Fixes ninja cuffs

* Removes Carp scroll from uplink. Adds Krav Implant to uplink
This commit is contained in:
PollardTheDragon
2026-03-25 23:11:10 +00:00
committed by GitHub
parent 3e8f140498
commit 394c3b0108
120 changed files with 2616 additions and 1184 deletions
@@ -0,0 +1,95 @@
RESTRICT_TYPE(/datum/antagonist/space_ninja)
// Spider Clan Space Ninja
/datum/antagonist/space_ninja
name = "Space Ninja"
roundend_category = "ninjas"
job_rank = ROLE_NINJA
special_role = SPECIAL_ROLE_NINJA
antag_hud_name = "hud_ninja"
antag_hud_type = ANTAG_HUD_NINJA
clown_gain_text = "Your spider clan training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself."
clown_removal_text = "You lose your spider clan training and return to your own clumsy, clownish self."
wiki_page_name = "Space Ninja"
var/give_uplink = TRUE
blurb_r = 200
blurb_a = 0.75
boss_title = "Spider Clan Daimyo"
/// Number of missions needed to complete
var/mission_goal = 4
/datum/antagonist/space_ninja/on_gain()
..()
mission_goal = 4 + (length(GLOB.crew_list) / 10)
SEND_SOUND(owner.current, sound('sound/ambience/antag/ninjaalert.ogg'))
/datum/antagonist/space_ninja/give_objectives()
forge_objectives()
/datum/antagonist/space_ninja/exfiltrate(mob/living/carbon/human/extractor, obj/item/radio/radio)
extractor.equipOutfit(/datum/outfit/admin/ghostbar_antag/space_ninja)
radio.autosay("<b>--ZZZT!- Domo Ar!g@to, [extractor.real_name]. Your training paid -^%&!-ZZT!-</b>", "Spider Clan HQ", "Security")
SSblackbox.record_feedback("tally", "successful_extraction", 1, "Space Ninja")
/datum/antagonist/space_ninja/finalize_antag()
. = ..()
equip_ninja()
/datum/antagonist/space_ninja/add_owner_to_gamemode()
SSticker.mode.ninjas |= owner
/datum/antagonist/space_ninja/remove_owner_from_gamemode()
SSticker.mode.ninjas -= owner
/datum/antagonist/space_ninja/proc/equip_ninja()
if(!ishuman(owner.current))
return
var/mob/living/carbon/human/new_ninja = owner.current
new_ninja.delete_equipment()
if(isvox(new_ninja))
new_ninja.equipOutfit(/datum/outfit/space_ninja/vox)
else
new_ninja.equipOutfit(/datum/outfit/space_ninja)
/datum/antagonist/space_ninja/proc/forge_objectives()
var/list/moderate_objectives = list(
/datum/objective/ninja/capture = 8,
/datum/objective/ninja/kill = 8,
/datum/objective/ninja/hack_rnd = 5,
/datum/objective/ninja/bomb_department/emp = 3,
/datum/objective/ninja/bomb_department/spiders = 3,
)
var/list/all_ninja_objectives = list(
/datum/objective/ninja/capture = 8,
/datum/objective/ninja/kill = 8,
/datum/objective/ninja/hack_rnd = 4,
/datum/objective/ninja/bomb_department = 3,
/datum/objective/ninja/bomb_department/emp = 3,
/datum/objective/ninja/bomb_department/spiders = 3,
/datum/objective/ninja/steal_supermatter = 3,
/datum/objective/ninja/insert_spider_rod = 3,
/datum/objective/ninja/interrogate_ai = 3,
)
for(var/i in 1 to mission_goal)
if(i <= mission_goal / 2) // This ensures some easier objectives are rolled to allow ninjas to work up to harder ones.
forge_objective(moderate_objectives)
continue
forge_objective(all_ninja_objectives)
add_antag_objective(/datum/objective/ninja_exfiltrate)
/datum/antagonist/space_ninja/proc/forge_objective(list/objective_list)
var/datum/objective/ninja/new_objective = pickweight(objective_list)
var/datum/objective/ninja/obj_item = new new_objective() // Needed to do to check validity and reroll
if(!obj_item.check_objective_conditions())
forge_objective(objective_list)
qdel(obj_item)
return
qdel(obj_item)
if(new_objective.onlyone)
var/list/current_objectives = get_antag_objectives()
for(var/datum/objective/ninja/c_objective in current_objectives)
if(istype(c_objective, new_objective))
forge_objective(objective_list)
return
add_antag_objective(new_objective)