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 19:11:10 -04:00
committed by GitHub
parent 3e8f140498
commit 394c3b0108
120 changed files with 2616 additions and 1184 deletions
@@ -105,6 +105,9 @@
else if(!rad_component)
start_rads()
/obj/item/nuclear_rod/proc/do_special_effect()
return
/obj/item/nuclear_rod/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change)
. = ..()
check_rad_shield()
@@ -164,6 +167,17 @@
craftable = TRUE
materials = list(MAT_METAL = 2000, MAT_URANIUM = 1000)
/obj/item/nuclear_rod/fuel/uranium_238/spiders
name = "spider-clan uranium 238 fuel rod"
desc = "A small fuel rod for most NGCR reactors. This one was green webs coating its surface, with tiny spiders skittering along them."
w_class = WEIGHT_CLASS_NORMAL
craftable = FALSE
adjacent_requirements = list()
/obj/item/nuclear_rod/fuel/uranium_238/spiders/do_special_effect()
if(prob(5))
new /mob/living/basic/spiderling(get_turf(src))
/obj/item/nuclear_rod/fuel/weak_thorium
name = "weak thorium fuel rod"
desc = "A specialized fuel rod refined from uranium 238. This rod will last longer than normal, and won't generate as much heat."
@@ -605,6 +605,7 @@
final_heat += heat_total
final_power += power_total
chamber.held_rod.durability -= durability_loss
chamber.held_rod.do_special_effect()
if(final_heat)
average_heatgen = final_heat / active_chambers
@@ -245,6 +245,9 @@
/// How long has it been since we processed the crystal?
var/tick_counter = 0
/// Are we being stolen?
var/being_stolen = FALSE
/obj/machinery/atmospherics/supermatter_crystal/Initialize(mapload)
. = ..()
@@ -697,12 +700,31 @@
countdown()
return 1
/obj/machinery/atmospherics/supermatter_crystal/update_overlays()
. = ..()
overlays.Cut()
if(being_stolen)
. += "causality_field"
color = COLOR_GREEN
else
color = COLOR_WHITE
/obj/machinery/atmospherics/supermatter_crystal/bullet_act(obj/projectile/proj)
var/turf/L = loc
if(!istype(L))
return FALSE
if(!istype(proj, /obj/projectile/beam/emitter/hitscan) && power_changes)
investigate_log("has been hit by [proj] fired by [key_name(proj.firer)]", INVESTIGATE_SUPERMATTER)
if(istype(proj, /obj/projectile/energy/net))
var/mob/living/carbon/user = proj.firer
var/list/obj_list = user.mind.get_all_objectives()
for(var/datum/objective/ninja/ninja_obj in obj_list)
if(ninja_obj.completed)
continue
if(!istype(ninja_obj, /datum/objective/ninja/steal_supermatter))
continue
begin_theft()
return FALSE
if(proj.flag != BULLET)
if(power_changes) //This needs to be here I swear
power += proj.damage * bullet_energy
@@ -712,6 +734,32 @@
damage += proj.damage * bullet_energy
return FALSE
/obj/machinery/atmospherics/supermatter_crystal/proc/begin_theft(mob/living/carbon/thief)
if(being_stolen)
return
message_admins("Ninja [thief] is beginning to steal the Supermatter Crystal.")
addtimer(src, CALLBACK(PROC_REF(complete_theft), thief), 3 MINUTES)
being_stolen = TRUE
update_icon()
/obj/machinery/atmospherics/supermatter_crystal/proc/complete_theft(mob/living/carbon/thief)
if(!being_stolen)
return
if(!thief.mind)
return
var/list/obj_list = thief.mind.get_all_objectives()
if(!length(obj_list))
return
for(var/datum/objective/ninja/ninja_obj in obj_list)
if(ninja_obj.completed)
continue
if(!istype(ninja_obj, /datum/objective/ninja/steal_supermatter))
continue
ninja_obj.complete_objective()
break
message_admins("Ninja [thief] has stolen the Supermatter Crystal.")
qdel(src)
/obj/machinery/atmospherics/supermatter_crystal/singularity_act()
var/gain = 100
investigate_log("Supermatter shard consumed by singularity.", INVESTIGATE_SINGULO)
@@ -796,6 +844,15 @@
/obj/machinery/atmospherics/supermatter_crystal/item_interaction(mob/living/user, obj/item/used, list/modifiers)
if(!istype(used) || (used.flags & ABSTRACT) || !istype(user))
return ITEM_INTERACT_COMPLETE
if(being_stolen)
to_chat(user, SPAN_WARNING("You begin to very carefully unfasten the net tangled around [src]!"))
if(!do_after_once(user, 5 SECONDS, TRUE, src))
return ITEM_INTERACT_COMPLETE
being_stolen = FALSE
update_icon()
return ITEM_INTERACT_COMPLETE
if(moveable && default_unfasten_wrench(user, used, time = 20))
return ITEM_INTERACT_COMPLETE