diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 7532d18d06..f6b1def645 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -542,6 +542,7 @@ GLOBAL_LIST_EMPTY(possible_items_special)
return checking.researched_nodes.len >= target_amount
/datum/objective/capture
+ var/captured_amount = 0
/datum/objective/capture/proc/gen_amount_goal()
target_amount = rand(5,10)
@@ -549,8 +550,7 @@ GLOBAL_LIST_EMPTY(possible_items_special)
return target_amount
/datum/objective/capture/check_completion()//Basically runs through all the mobs in the area to determine how much they are worth.
- var/captured_amount = 0
- var/area/centcom/holding/A = GLOB.areas_by_type[/area/centcom/holding]
+ /*var/area/centcom/holding/A = GLOB.areas_by_type[/area/centcom/holding]
for(var/mob/living/carbon/human/M in A)//Humans.
if(M.stat == DEAD)//Dead folks are worth less.
captured_amount+=0.5
@@ -573,7 +573,7 @@ GLOBAL_LIST_EMPTY(possible_items_special)
if(M.stat == DEAD)
captured_amount+=1
continue
- captured_amount+=2
+ captured_amount+=2*/ //Removed in favour of adding points on capture, in energy_net_nets.dm
return captured_amount >= target_amount
diff --git a/code/modules/ninja/suit/gloves.dm b/code/modules/ninja/suit/gloves.dm
index 4308120c4f..a01b354ca1 100644
--- a/code/modules/ninja/suit/gloves.dm
+++ b/code/modules/ninja/suit/gloves.dm
@@ -37,6 +37,8 @@
var/mindrain = 200
var/maxdrain = 400
+ var/stunforce = 140 //Same as stunbaton, adjustable.
+
/obj/item/clothing/gloves/space_ninja/Touch(atom/A,proximity)
if(!candrain || draining)
diff --git a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
index 270e1f106f..c98a0440e3 100644
--- a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
@@ -14,7 +14,7 @@ It is possible to destroy the net by the occupant or someone else.
mouse_opacity = MOUSE_OPACITY_ICON//So you can hit it with stuff.
anchored = TRUE//Can't drag/grab the net.
layer = ABOVE_ALL_MOB_LAYER
- max_integrity = 25 //How much health it has.
+ max_integrity = 50 //How much health it has.
can_buckle = 1
buckle_lying = 0
buckle_prevents_pull = TRUE
@@ -59,6 +59,41 @@ It is possible to destroy the net by the occupant or someone else.
continue
H.dropItemToGround(W)
+ var/datum/antagonist/antag_datum
+ for(var/datum/antagonist/ninja/AD in GLOB.antagonists) //Because only ninjas get capture objectives; They're not doable without the suit.
+ if(AD.owner == master)
+ antag_datum = AD
+ break
+
+ for(var/datum/objective/capture/capture in antag_datum)
+ if(istype(affecting, /mob/living/carbon/human)) //Humans.
+ if(affecting.stat == DEAD)//Dead folks are worth less.
+ capture.captured_amount+=0.5
+ continue
+ capture.captured_amount+=1
+ if(istype(affecting, /mob/living/carbon/monkey)) //Monkeys are almost worthless, you failure.
+ capture.captured_amount+=0.1
+ if(istype(affecting, /mob/living/carbon/alien/larva)) //Larva are important for research.
+ if(affecting.stat == DEAD)
+ capture.captured_amount+=0.5
+ continue
+ capture.captured_amount+=1
+ if(istype(affecting, /mob/living/carbon/alien/humanoid)) //Aliens are worth twice as much as humans.
+ if(istype(affecting, /mob/living/carbon/alien/humanoid/royal/queen)) //Queens are worth three times as much as humans.
+ if(affecting.stat == DEAD)
+ capture.captured_amount+=1.5
+ else
+ capture.captured_amount+=3
+ continue
+ if(affecting.stat == DEAD)
+ capture.captured_amount+=1
+ continue
+ capture.captured_amount+=2
+
+
+ affecting.revive(1, 1) //Basically a revive and full heal, including limbs/organs
+ //In case people who have been captured dead want to hang out at the holding area
+
playsound(affecting, 'sound/effects/sparks4.ogg', 50, 1)
new /obj/effect/temp_visual/dir_setting/ninja/phase/out(affecting.drop_location(), affecting.dir)
@@ -73,8 +108,9 @@ It is possible to destroy the net by the occupant or someone else.
playsound(affecting, 'sound/effects/sparks2.ogg', 50, 1)
new /obj/effect/temp_visual/dir_setting/ninja/phase(affecting.drop_location(), affecting.dir)
-/obj/structure/energy_net/attack_paw(mob/user)
- return attack_hand()
+/obj/attack_alien(mob/living/carbon/alien/humanoid/user)
+ if(attack_generic(user, 15, BRUTE, "melee", 0)) //Aliens normally deal 60 damage to structures. They'd one-shot nets without this.
+ playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1)
/obj/structure/energy_net/user_buckle_mob(mob/living/M, mob/living/user)
return//We only want our target to be buckled
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm
index 8c8f92e522..41f7b8af83 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm
@@ -2,21 +2,34 @@
//Allows the ninja to kidnap people
/obj/item/clothing/suit/space/space_ninja/proc/ninjanet()
var/mob/living/carbon/human/H = affecting
- var/mob/living/carbon/C = input("Select who to capture:","Capture who?",null) as null|mob in oview(H)
+ var/mob/living/carbon/C
+
+ //If there's only one valid target, let's actually try to capture it, rather than forcing
+ //the user to fiddle with the dialog displaying a list of one
+ //Also, let's make this smarter and not list mobs you can't currently net.
+ var/Candidates[]
+ for(var/mob/mob in oview(H))
+ if(!mob.client)//Monkeys without a client can still step_to() and bypass the net. Also, netting inactive people is lame.
+ //to_chat(H, "[C.p_they(TRUE)] will bring no honor to your Clan!")
+ continue
+ if(locate(/obj/structure/energy_net) in get_turf(mob))//Check if they are already being affected by an energy net.
+ //to_chat(H, "[C.p_they(TRUE)] are already trapped inside an energy net!")
+ continue
+ for(var/turf/T in getline(get_turf(H), get_turf(mob)))
+ if(T.density)//Don't want them shooting nets through walls. It's kind of cheesy.
+ //to_chat(H, "You may not use an energy net through solid obstacles!")
+ continue
+ Candidates+=mob
+
+ if(Candidates.len == 1)
+ C = Candidates[1]
+ else
+ C = input("Select who to capture:","Capture who?",null) as null|mob in Candidates
+
if(QDELETED(C)||!(C in oview(H)))
return 0
- if(!C.client)//Monkeys without a client can still step_to() and bypass the net. Also, netting inactive people is lame.
- to_chat(H, "[C.p_they(TRUE)] will bring no honor to your Clan!")
- return
- if(locate(/obj/structure/energy_net) in get_turf(C))//Check if they are already being affected by an energy net.
- to_chat(H, "[C.p_they(TRUE)] are already trapped inside an energy net!")
- return
- for(var/turf/T in getline(get_turf(H), get_turf(C)))
- if(T.density)//Don't want them shooting nets through walls. It's kind of cheesy.
- to_chat(H, "You may not use an energy net through solid obstacles!")
- return
if(!ninjacost(200,N_STEALTH_CANCEL))
H.Beam(C,"n_beam",time=15)
H.say("Get over here!", forced = "ninja net")
diff --git a/code/modules/ninja/suit/ninjaDrainAct.dm b/code/modules/ninja/suit/ninjaDrainAct.dm
index 861ffb9446..10fce3d74e 100644
--- a/code/modules/ninja/suit/ninjaDrainAct.dm
+++ b/code/modules/ninja/suit/ninjaDrainAct.dm
@@ -261,4 +261,19 @@ They *could* go in their appropriate files, but this is supposed to be modular
spark_system.set_up(5, 0, loc)
playsound(src, "sparks", 50, 1)
visible_message("[H] electrocutes [src] with [H.p_their()] touch!", "[H] electrocutes you with [H.p_their()] touch!")
- electrocute_act(25, H)
+ electrocute_act(15, H)
+
+ Knockdown(G.stunforce)
+ adjustStaminaLoss(G.stunforce*0.1, affected_zone = (istype(H) ? H.zone_selected : BODY_ZONE_CHEST))
+ apply_effect(EFFECT_STUTTER, G.stunforce)
+ SEND_SIGNAL(src, COMSIG_LIVING_MINOR_SHOCK)
+
+ lastattacker = H.real_name
+ lastattackerckey = H.ckey
+ log_combat(H, src, "stunned")
+
+ playsound(loc, 'sound/weapons/egloves.ogg', 50, 1, -1)
+
+ if(ishuman(src))
+ var/mob/living/carbon/human/Hsrc = src
+ Hsrc.forcesay(GLOB.hit_appends)