fun
@@ -1,51 +0,0 @@
|
||||
/datum/action/item_action/initialize_ninja_suit
|
||||
name = "Toggle ninja suit"
|
||||
|
||||
/datum/action/item_action/ninjasmoke
|
||||
name = "Smoke Bomb"
|
||||
desc = "Blind your enemies momentarily with a well-placed smoke bomb."
|
||||
button_icon_state = "smoke"
|
||||
icon_icon = 'icons/mob/actions/actions_spells.dmi'
|
||||
|
||||
/datum/action/item_action/ninjaboost
|
||||
name = "Adrenaline Boost"
|
||||
desc = "Inject a secret chemical that will counteract all movement-impairing effect."
|
||||
button_icon_state = "repulse"
|
||||
icon_icon = 'icons/mob/actions/actions_spells.dmi'
|
||||
required_mobility_flags = NONE
|
||||
|
||||
/datum/action/item_action/ninjapulse
|
||||
name = "EM Burst (25E)"
|
||||
desc = "Disable any nearby technology with an electro-magnetic pulse."
|
||||
button_icon_state = "emp"
|
||||
icon_icon = 'icons/mob/actions/actions_spells.dmi'
|
||||
|
||||
/datum/action/item_action/ninjastar
|
||||
name = "Create Throwing Stars (1E)"
|
||||
desc = "Creates some throwing stars"
|
||||
button_icon_state = "throwingstar"
|
||||
icon_icon = 'icons/obj/items_and_weapons.dmi'
|
||||
|
||||
/datum/action/item_action/ninjanet
|
||||
name = "Energy Net (20E)"
|
||||
desc = "Captures a fallen opponent in a net of energy. Will teleport them to a holding facility after 30 seconds."
|
||||
button_icon_state = "energynet"
|
||||
icon_icon = 'icons/effects/effects.dmi'
|
||||
|
||||
/datum/action/item_action/ninja_sword_recall
|
||||
name = "Recall Energy Katana (Variable Cost)"
|
||||
desc = "Teleports the Energy Katana linked to this suit to its wearer, cost based on distance."
|
||||
button_icon_state = "energy_katana"
|
||||
icon_icon = 'icons/obj/items_and_weapons.dmi'
|
||||
|
||||
/datum/action/item_action/ninja_stealth
|
||||
name = "Toggle Stealth"
|
||||
desc = "Toggles stealth mode on and off."
|
||||
button_icon_state = "ninja_cloak"
|
||||
icon_icon = 'icons/mob/actions/actions_minor_antag.dmi'
|
||||
|
||||
/datum/action/item_action/toggle_glove
|
||||
name = "Toggle interaction"
|
||||
desc = "Switch between normal interaction and drain mode."
|
||||
button_icon_state = "s-ninjan"
|
||||
icon_icon = 'icons/obj/clothing/gloves.dmi'
|
||||
@@ -417,7 +417,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
desc = "A misnomer of sorts, this is effectively a blunt katana made from steelwood, a dense organic wood derived from steelcaps. Why steelwood? Druids can use it. Duh."
|
||||
icon_state = "bokken_steel"
|
||||
item_state = "bokken_steel"
|
||||
force = 12
|
||||
force = 12
|
||||
stamina_damage_increment = 3
|
||||
|
||||
/obj/item/melee/bokken/waki
|
||||
@@ -427,7 +427,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
item_state = "wakibokken"
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
force = 6
|
||||
force = 6
|
||||
stamina_damage_increment = 4
|
||||
block_parry_data = /datum/block_parry_data/bokken/waki
|
||||
default_parry_data = /datum/block_parry_data/bokken/waki
|
||||
@@ -442,7 +442,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
parry_time_perfect_leeway = 1
|
||||
parry_imperfect_falloff_percent = 7.5
|
||||
parry_efficiency_to_counterattack = 120
|
||||
parry_efficiency_considered_successful = 65
|
||||
parry_efficiency_considered_successful = 65
|
||||
parry_efficiency_perfect = 120
|
||||
parry_efficiency_perfect_override = list(
|
||||
TEXT_ATTACK_TYPE_PROJECTILE = 30,
|
||||
@@ -455,10 +455,10 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
/datum/block_parry_data/bokken/waki/quick_parry //For the parry spammer in you
|
||||
parry_stamina_cost = 2 // Slam that parry button
|
||||
parry_time_active = 2.5
|
||||
parry_time_perfect = 1
|
||||
parry_time_perfect = 1
|
||||
parry_time_perfect_leeway = 1
|
||||
parry_failed_stagger_duration = 1 SECONDS
|
||||
parry_failed_clickcd_duration = 1 SECONDS
|
||||
parry_failed_clickcd_duration = 1 SECONDS
|
||||
|
||||
/datum/block_parry_data/bokken/waki/quick_parry/proj
|
||||
parry_efficiency_perfect_override = list()
|
||||
@@ -468,7 +468,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
desc = "A misnomer of sorts, this is effectively a blunt wakizashi made from steelwood, a dense organic wood derived from steelcaps. Why steelwood? Druids can use it. Duh."
|
||||
icon_state = "wakibokken_steel"
|
||||
item_state = "wakibokken_steel"
|
||||
force = 8
|
||||
force = 8
|
||||
stamina_damage_increment = 2
|
||||
|
||||
/obj/item/melee/bokken/debug
|
||||
@@ -612,7 +612,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
name = "shock throwing star"
|
||||
desc = "An aerodynamic disc designed to cause excruciating pain when stuck inside fleeing targets, hopefully without causing fatal harm."
|
||||
throwforce = 5
|
||||
embedding = list("pain_chance" = 5, "embed_chance" = 100, "fall_chance" = 0, "jostle_chance" = 10, "pain_stam_pct" = 0.8, "jostle_pain_mult" = 3)
|
||||
embedding = list("pain_chance" = 5, "embed_chance" = 100, "fall_chance" = 0, "jostle_chance" = 10, "pain_stam_pct" = 20, "jostle_pain_mult" = 3)
|
||||
|
||||
/obj/item/throwing_star/toy
|
||||
name = "toy throwing star"
|
||||
|
||||
@@ -12,6 +12,9 @@
|
||||
///Whether or not this ninja receives the standard equipment
|
||||
var/give_equipment = TRUE
|
||||
|
||||
/proc/is_ninja(mob/living/M)
|
||||
return M && M.mind && M.mind.has_antag_datum(/datum/antagonist/ninja)
|
||||
|
||||
/datum/antagonist/ninja/apply_innate_effects(mob/living/mob_override)
|
||||
var/mob/living/ninja = mob_override || owner.current
|
||||
add_antag_hud(antag_hud_type, antag_hud_name, ninja)
|
||||
@@ -82,7 +85,7 @@
|
||||
var/datum/objective/plant_explosive/bombobjective = new /datum/objective/plant_explosive()
|
||||
for(var/sanity in 1 to 100) // 100 checks at most.
|
||||
var/area/selected_area = pick(GLOB.sortedAreas)
|
||||
if(!is_station_level(selected_area.z) || !(selected_area.area_flags & VALID_TERRITORY))
|
||||
if(!is_station_level(selected_area.z) || !selected_area.valid_territory)
|
||||
continue
|
||||
bombobjective.detonation_location = selected_area
|
||||
break
|
||||
@@ -125,4 +128,4 @@
|
||||
new_owner.special_role = ROLE_NINJA
|
||||
new_owner.add_antag_datum(src)
|
||||
message_admins("[key_name_admin(admin)] has ninja'ed [key_name_admin(new_owner)].")
|
||||
log_admin("[key_name(admin)] has ninja'ed [key_name(new_owner)].")
|
||||
log_admin("[key_name(admin)] has ninja'ed [key_name(new_owner)].")
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
//selecting a candidate player
|
||||
var/list/candidates = get_candidates(ROLE_NINJA, null, ROLE_NINJA)
|
||||
if(!candidates.len)
|
||||
if(!candidates.len)
|
||||
return NOT_ENOUGH_PLAYERS
|
||||
|
||||
var/mob/dead/selected_candidate = pick(candidates)
|
||||
|
||||
@@ -119,5 +119,5 @@
|
||||
/datum/action/innate/dash/ninja
|
||||
current_charges = 3
|
||||
max_charges = 3
|
||||
charge_rate = 200
|
||||
charge_rate = 100
|
||||
recharge_sound = null
|
||||
|
||||
@@ -1,18 +1,20 @@
|
||||
/**
|
||||
* # Spider Charge
|
||||
*
|
||||
* A unique version of c4 possessed only by the space ninja. Has a stronger blast radius.
|
||||
* Can only be detonated by space ninjas with the bombing objective. Can only be set up where the objective says it can.
|
||||
* When it primes, the space ninja responsible will have their objective set to complete.
|
||||
*
|
||||
*/
|
||||
/obj/item/grenade/plastic/ninja
|
||||
* # Spider Charge
|
||||
*
|
||||
* A unique version of c4 possessed only by the space ninja. Has a stronger blast radius.
|
||||
* Can only be detonated by space ninjas with the bombing objective. Can only be set up where the objective says it can.
|
||||
* When it primes, the space ninja responsible will have their objective set to complete.
|
||||
*
|
||||
*/
|
||||
/obj/item/grenade/plastic/c4/ninja
|
||||
name = "spider charge"
|
||||
desc = "A modified C-4 charge supplied to you by the Spider Clan. Its explosive power has been juiced up, but only works in one specific area."
|
||||
boom_sizes = list(4, 8, 12)
|
||||
icon_state = "plasticspider0"
|
||||
item_state = "plasticspider"
|
||||
boom_sizes = list(2, 4, 6)
|
||||
var/mob/detonator = null
|
||||
|
||||
/obj/item/grenade/c4/ninja/afterattack(atom/movable/AM, mob/user, flag)
|
||||
/obj/item/grenade/plastic/c4/ninja/afterattack(atom/movable/AM, mob/user, flag)
|
||||
var/datum/antagonist/ninja/ninja_antag = user.mind.has_antag_datum(/datum/antagonist/ninja)
|
||||
if(!ninja_antag)
|
||||
to_chat(user, "<span class='notice'>While it appears normal, you can't seem to detonate the charge.</span>")
|
||||
@@ -27,7 +29,7 @@
|
||||
detonator = user
|
||||
return ..()
|
||||
|
||||
/obj/item/grenade/c4/ninja/prime(mob/living/lanced_by)
|
||||
/obj/item/grenade/plastic/c4/ninja/prime(mob/living/lanced_by)
|
||||
. = ..()
|
||||
//Since we already did the checks in afterattack, the denonator must be a ninja with the bomb objective.
|
||||
if(!detonator)
|
||||
|
||||
@@ -8,10 +8,9 @@
|
||||
ears = /obj/item/radio/headset
|
||||
shoes = /obj/item/clothing/shoes/space_ninja
|
||||
gloves = /obj/item/clothing/gloves/space_ninja
|
||||
back = /obj/item/tank/jetpack/carbondioxide
|
||||
l_pocket = /obj/item/grenade/plastic/ninja
|
||||
r_pocket = /obj/item/tank/internals/emergency_oxygen
|
||||
internals_slot = SLOT_R_STORE
|
||||
l_pocket = /obj/item/grenade/plastic/c4/ninja
|
||||
suit_store = /obj/item/tank/internals/oxygen
|
||||
internals_slot = ITEM_SLOT_SUITSTORE
|
||||
belt = /obj/item/energy_katana
|
||||
implants = list(/obj/item/implant/explosive)
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
desc = "These nano-enhanced gloves insulate from electricity and provide fire resistance."
|
||||
name = "ninja gloves"
|
||||
icon_state = "black"
|
||||
item_state = "s-ninjan"
|
||||
item_state = "ninja_new"
|
||||
siemens_coefficient = 0
|
||||
cold_protection = HANDS
|
||||
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
|
||||
|
||||
@@ -9,8 +9,8 @@
|
||||
/obj/item/clothing/head/helmet/space/space_ninja
|
||||
desc = "What may appear to be a simple black garment is in fact a highly sophisticated nano-weave helmet. Standard issue ninja gear."
|
||||
name = "ninja hood"
|
||||
icon_state = "s-ninja"
|
||||
item_state = "s-ninja_mask"
|
||||
icon_state = "ninja_newcowl"
|
||||
item_state = "ninja_newcowl"
|
||||
armor = list(MELEE = 40, BULLET = 30, LASER = 20,ENERGY = 15, BOMB = 30, BIO = 30, RAD = 25, FIRE = 100, ACID = 100)
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
blockTracking = TRUE//Roughly the only unique thing about this helmet.
|
||||
|
||||
@@ -9,8 +9,8 @@
|
||||
/obj/item/clothing/mask/gas/space_ninja
|
||||
name = "ninja mask"
|
||||
desc = "A close-fitting mask that acts both as an air filter and a post-modern fashion statement."
|
||||
icon_state = "s-ninja"
|
||||
item_state = "s-ninja_mask"
|
||||
icon_state = "ninja_new"
|
||||
item_state = "ninja_new"
|
||||
strip_delay = 120
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
modifies_speech = TRUE
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
/**
|
||||
* Atom level proc for space ninja's glove interactions.
|
||||
*
|
||||
* Proc which only occurs when space ninja uses his gloves on an atom.
|
||||
* Does nothing by default, but effects will vary.
|
||||
* Arguments:
|
||||
* * ninja_suit - The offending space ninja's suit.
|
||||
* * ninja - The human mob wearing the suit.
|
||||
* * ninja_gloves - The offending space ninja's gloves.
|
||||
*/
|
||||
* Atom level proc for space ninja's glove interactions.
|
||||
*
|
||||
* Proc which only occurs when space ninja uses his gloves on an atom.
|
||||
* Does nothing by default, but effects will vary.
|
||||
* Arguments:
|
||||
* * ninja_suit - The offending space ninja's suit.
|
||||
* * ninja - The human mob wearing the suit.
|
||||
* * ninja_gloves - The offending space ninja's gloves.
|
||||
*/
|
||||
/atom/proc/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/ninja_suit, mob/living/carbon/human/ninja, obj/item/clothing/gloves/space_ninja/ninja_gloves)
|
||||
return INVALID_DRAIN
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
var/drain = 0 //Drain amount from batteries
|
||||
var/drain_total = 0
|
||||
|
||||
if(cell?.charge)
|
||||
if(cell && cell.charge)
|
||||
var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread()
|
||||
spark_system.set_up(5, 0, loc)
|
||||
|
||||
@@ -36,16 +36,16 @@
|
||||
|
||||
if (do_after(ninja ,10, target = src))
|
||||
spark_system.start()
|
||||
playsound(loc, "sparks", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
|
||||
cell.use(drain)
|
||||
ninja_suit.cell.give(drain)
|
||||
playsound(loc, "sparks", 50, 1)
|
||||
cell.charge -= drain
|
||||
ninja_suit.cell.charge += drain
|
||||
drain_total += drain
|
||||
else
|
||||
break
|
||||
|
||||
if(!(obj_flags & EMAGGED))
|
||||
flick("apc-spark", ninja_gloves)
|
||||
playsound(loc, "sparks", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
|
||||
playsound(loc, "sparks", 50, 1)
|
||||
obj_flags |= EMAGGED
|
||||
locked = FALSE
|
||||
update_icon()
|
||||
@@ -57,8 +57,8 @@
|
||||
if(!ninja_suit || !ninja || !ninja_gloves)
|
||||
return INVALID_DRAIN
|
||||
|
||||
var/maxcapacity = FALSE //Safety check for batteries
|
||||
var/drain = 0 //Drain amount from batteries
|
||||
var/maxcapacity = 0 //Safety check for batteries
|
||||
var/drain = FALSE //Drain amount from batteries
|
||||
var/drain_total = 0
|
||||
|
||||
if(charge)
|
||||
@@ -77,9 +77,9 @@
|
||||
|
||||
if (do_after(ninja,10, target = src))
|
||||
spark_system.start()
|
||||
playsound(loc, "sparks", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
|
||||
playsound(loc, "sparks", 50, 1)
|
||||
charge -= drain
|
||||
ninja_suit.cell.give(drain)
|
||||
ninja_suit.cell.charge += drain
|
||||
drain_total += drain
|
||||
|
||||
else
|
||||
@@ -95,12 +95,12 @@
|
||||
var/drain_total = 0
|
||||
|
||||
if(charge)
|
||||
if(ninja_gloves.candrain && do_after(ninja, 30, target = src))
|
||||
if(ninja_gloves.candrain && do_after(ninja,30, target = src))
|
||||
drain_total = charge
|
||||
if(ninja_suit.cell.charge + charge > ninja_suit.cell.maxcharge)
|
||||
ninja_suit.cell.charge = ninja_suit.cell.maxcharge
|
||||
else
|
||||
ninja_suit.cell.give(charge)
|
||||
ninja_suit.cell.charge += charge
|
||||
charge = 0
|
||||
corrupt()
|
||||
update_icon()
|
||||
@@ -120,11 +120,11 @@
|
||||
if(stored_research)
|
||||
to_chat(ninja, "<span class='notice'>Copying files...</span>")
|
||||
if(do_after(ninja, ninja_suit.s_delay, target = src) && ninja_gloves.candrain && src)
|
||||
stored_research.copy_research_to(ninja_suit.stored_research)
|
||||
stored_research.copy_research_to( ninja_suit.stored_research)
|
||||
to_chat(ninja, "<span class='notice'>Data analyzed. Process finished.</span>")
|
||||
|
||||
//RD SERVER//
|
||||
/obj/machinery/rnd/server/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/ninja_suit, mob/living/carbon/human/ninja, obj/item/clothing/gloves/space_ninja/ninja_gloves)
|
||||
//obj/machinery/rnd/server/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/ninja_suit, mob/living/carbon/human/ninja, obj/item/clothing/gloves/space_ninja/ninja_gloves)
|
||||
if(!ninja_suit || !ninja || !ninja_gloves)
|
||||
return INVALID_DRAIN
|
||||
|
||||
@@ -143,6 +143,7 @@
|
||||
/obj/machinery/computer/secure_data/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/ninja_suit, mob/living/carbon/human/ninja, obj/item/clothing/gloves/space_ninja/ninja_gloves)
|
||||
if(!ninja_suit || !ninja || !ninja_gloves)
|
||||
return INVALID_DRAIN
|
||||
to_chat(ninja, "<span class='notice'>Hacking \the [src]...</span>")
|
||||
AI_notify_hack()
|
||||
if(do_after(ninja, 200))
|
||||
for(var/datum/data/record/rec in sortRecord(GLOB.data_core.general, sortBy, order))
|
||||
@@ -154,6 +155,7 @@
|
||||
var/datum/objective/security_scramble/objective = locate() in ninja_antag.objectives
|
||||
if(objective)
|
||||
objective.completed = TRUE
|
||||
to_chat(ninja, "<span class='notice'>Security record corruption malware uploaded. Process finished; objective completed.</span>")
|
||||
|
||||
//COMMUNICATIONS CONSOLE//
|
||||
/obj/machinery/computer/communications/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/ninja_suit, mob/living/carbon/human/ninja, obj/item/clothing/gloves/space_ninja/ninja_gloves)
|
||||
@@ -161,6 +163,7 @@
|
||||
return INVALID_DRAIN
|
||||
if(ninja_gloves.communication_console_hack_success)
|
||||
return
|
||||
to_chat(ninja, "<span class='notice'>Hacking \the [src]...</span>")
|
||||
AI_notify_hack()
|
||||
if(do_after(ninja, 300))
|
||||
var/announcement_pick = rand(0, 1)
|
||||
@@ -180,6 +183,7 @@
|
||||
var/datum/objective/terror_message/objective = locate() in ninja_antag.objectives
|
||||
if(objective)
|
||||
objective.completed = TRUE
|
||||
to_chat(ninja, "<span class='notice'>Signal decryption malware uploaded. Process finished; objective completed.</span>")
|
||||
|
||||
//AIRLOCK//
|
||||
/obj/machinery/door/airlock/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/ninja_suit, mob/living/carbon/human/ninja, obj/item/clothing/gloves/space_ninja/ninja_gloves)
|
||||
@@ -195,6 +199,7 @@
|
||||
var/datum/objective/door_jack/objective = locate() in ninja_antag.objectives
|
||||
if(objective && objective.doors_required <= ninja_gloves.door_hack_counter)
|
||||
objective.completed = TRUE
|
||||
to_chat(ninja, "<span class='notice'>Malware uploaded to airlock access subroutines. Forcing open.</span>")
|
||||
|
||||
//WIRE//
|
||||
/obj/structure/cable/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/ninja_suit, mob/living/carbon/human/ninja, obj/item/clothing/gloves/space_ninja/ninja_gloves)
|
||||
@@ -210,7 +215,7 @@
|
||||
while(ninja_gloves.candrain && !maxcapacity && src)
|
||||
drain = (round((rand(ninja_gloves.mindrain, ninja_gloves.maxdrain))/2))
|
||||
var/drained = 0
|
||||
if(wire_powernet && do_after(ninja ,10, target = src))
|
||||
if(wire_powernet && do_after(ninja,10, target = src))
|
||||
drained = min(drain, delayed_surplus())
|
||||
add_delayedload(drained)
|
||||
if(drained < drain)//if no power on net, drain apcs
|
||||
@@ -223,9 +228,9 @@
|
||||
else
|
||||
break
|
||||
|
||||
ninja_suit.cell.give(drain)
|
||||
ninja_suit.cell.charge += drained
|
||||
if(ninja_suit.cell.charge > ninja_suit.cell.maxcharge)
|
||||
drain_total += (drained-(ninja_suit.cell.charge - ninja_suit.cell.maxcharge))
|
||||
. += (drained-(ninja_suit.cell.charge - ninja_suit.cell.maxcharge))
|
||||
ninja_suit.cell.charge = ninja_suit.cell.maxcharge
|
||||
maxcapacity = TRUE
|
||||
else
|
||||
@@ -235,7 +240,7 @@
|
||||
return drain_total
|
||||
|
||||
//MECH//
|
||||
/obj/vehicle/sealed/mecha/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/ninja_suit, mob/living/carbon/human/ninja, obj/item/clothing/gloves/space_ninja/ninja_gloves)
|
||||
/obj/mecha/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/ninja_suit, mob/living/carbon/human/ninja, obj/item/clothing/gloves/space_ninja/ninja_gloves)
|
||||
if(!ninja_suit || !ninja || !ninja_gloves)
|
||||
return INVALID_DRAIN
|
||||
|
||||
@@ -243,7 +248,7 @@
|
||||
var/drain = 0 //Drain amount
|
||||
var/drain_total = 0
|
||||
|
||||
to_chat(occupants, "[icon2html(src, occupants)]<span class='danger'>Warning: Unauthorized access through sub-route 4, block H, detected.</span>")
|
||||
occupant_message("<span class='danger'>Warning: Unauthorized access through sub-route 4, block H, detected.</span>")
|
||||
if(get_charge())
|
||||
while(ninja_gloves.candrain && cell.charge > 0 && !maxcapacity)
|
||||
drain = rand(ninja_gloves.mindrain, ninja_gloves.maxdrain)
|
||||
@@ -254,7 +259,7 @@
|
||||
maxcapacity = TRUE
|
||||
if (do_after(ninja, 10, target = src))
|
||||
spark_system.start()
|
||||
playsound(loc, "sparks", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
|
||||
playsound(loc, "sparks", 50, 1)
|
||||
cell.use(drain)
|
||||
ninja_suit.cell.give(drain)
|
||||
drain_total += drain
|
||||
@@ -272,13 +277,13 @@
|
||||
if (do_after(ninja, 60, target = src))
|
||||
spark_system.start()
|
||||
playsound(loc, "sparks", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
|
||||
to_chat(src, "<span class='danger'>UPLOAD COMPLETE. NEW CYBORG MODEL DETECTED. INSTALLING...</span>")
|
||||
to_chat(src, "<span class='danger'>UPLOAD COMPLETE. NEW CYBORG MODULE DETECTED. INSTALLING...</span>")
|
||||
faction = list(ROLE_NINJA)
|
||||
bubble_icon = "syndibot"
|
||||
UnlinkSelf()
|
||||
ionpulse = TRUE
|
||||
laws = new /datum/ai_laws/ninja_override()
|
||||
model.transform_to(pick(/obj/item/robot_model/syndicate, /obj/item/robot_model/syndicate_medical, /obj/item/robot_model/saboteur))
|
||||
module.transform_to(pick(/obj/item/robot_module/syndicate, /obj/item/robot_module/syndicate_medical, /obj/item/robot_module/saboteur))
|
||||
|
||||
var/datum/antagonist/ninja/ninja_antag = ninja.mind.has_antag_datum(/datum/antagonist/ninja)
|
||||
if(!ninja_antag)
|
||||
@@ -286,3 +291,34 @@
|
||||
var/datum/objective/cyborg_hijack/objective = locate() in ninja_antag.objectives
|
||||
if(objective)
|
||||
objective.completed = TRUE
|
||||
|
||||
//CARBON MOBS//
|
||||
/mob/living/carbon/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/ninja_suit, mob/living/carbon/human/ninja, obj/item/clothing/gloves/space_ninja/ninja_gloves)
|
||||
if(!ninja_suit || !ninja || !ninja_gloves)
|
||||
return INVALID_DRAIN
|
||||
|
||||
. = DRAIN_MOB_SHOCK_FAILED
|
||||
|
||||
//Default cell = 10,000 charge, 10,000/1000 = 10 uses without charging/upgrading
|
||||
if(ninja_suit.cell?.charge && ninja_suit.cell.use(1000))
|
||||
. = DRAIN_MOB_SHOCK
|
||||
//Got that electric touch
|
||||
var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread()
|
||||
spark_system.set_up(5, 0, loc)
|
||||
playsound(src, "sparks", 50, 1)
|
||||
visible_message("<span class='danger'>[ninja] electrocutes [src] with [ninja.p_their()] touch!</span>", "<span class='userdanger'>[ninja] electrocutes you with [ninja.p_their()] touch!</span>")
|
||||
electrocute_act(15, ninja, flags = SHOCK_NOSTUN)
|
||||
|
||||
DefaultCombatKnockdown(ninja_gloves.stunforce, override_hardstun = 0)
|
||||
apply_effect(EFFECT_STUTTER, ninja_gloves.stunforce)
|
||||
SEND_SIGNAL(src, COMSIG_LIVING_MINOR_SHOCK)
|
||||
|
||||
lastattacker = ninja.real_name
|
||||
lastattackerckey = ninja.ckey
|
||||
log_combat(ninja, 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)
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "energynet"
|
||||
|
||||
|
||||
density = TRUE//Can't pass through.
|
||||
opacity = FALSE //Can see through.
|
||||
mouse_opacity = MOUSE_OPACITY_ICON//So you can hit it with stuff.
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
check_flags = NONE
|
||||
name = "Adrenaline Boost"
|
||||
desc = "Inject a secret chemical that will counteract all movement-impairing effect."
|
||||
button_icon_state = "repulse"
|
||||
icon_icon = 'icons/mob/actions/actions_spells.dmi'
|
||||
button_icon_state = "adrenal"
|
||||
icon_icon = 'icons/obj/implants.dmi'
|
||||
|
||||
/**
|
||||
* Proc called to activate space ninja's adrenaline.
|
||||
@@ -41,5 +41,5 @@
|
||||
*/
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/ninjaboost_after()
|
||||
var/mob/living/carbon/human/ninja = affecting
|
||||
ninja.reagents.add_reagent(/datum/reagent/uranium/radium, a_transfer * 0.25)
|
||||
ninja.reagents.add_reagent(/datum/reagent/radium, a_transfer * 0.25)
|
||||
to_chat(ninja, "<span class='danger'>You are beginning to feel the after-effect of the injection.</span>")
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/datum/action/item_action/toggle_glove
|
||||
name = "Toggle interaction"
|
||||
desc = "Switch between normal interaction and drain mode."
|
||||
button_icon_state = "s-ninjan"
|
||||
button_icon_state = "ninja_new"
|
||||
icon_icon = 'icons/obj/clothing/gloves.dmi'
|
||||
|
||||
/**
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
desc = "Gives a detailed readout about your current status."
|
||||
button_icon_state = "health"
|
||||
icon_icon = 'icons/obj/device.dmi'
|
||||
var/action_background_icon_state = "bg_default_on"
|
||||
|
||||
/**
|
||||
* Proc called to put a status readout to the ninja in chat.
|
||||
@@ -17,7 +18,6 @@
|
||||
var/mob/living/carbon/human/ninja = affecting
|
||||
var/list/info_list = list()
|
||||
info_list += "<span class='info'>SpiderOS Status: [s_initialized ? "Initialized" : "Disabled"]</span>\n"
|
||||
info_list += "<span class='info'>Current Time: [station_time_timestamp()]</span>\n"
|
||||
//Ninja status
|
||||
info_list += "<span class='info'>Fingerprints: [md5(ninja.dna.uni_identity)]</span>\n"
|
||||
info_list += "<span class='info'>Unique Identity: [ninja.dna.unique_enzymes]</span>\n"
|
||||
|
||||
@@ -11,8 +11,8 @@
|
||||
/obj/item/clothing/suit/space/space_ninja
|
||||
name = "ninja suit"
|
||||
desc = "A unique, vacuum-proof suit of nano-enhanced armor designed specifically for Spider Clan assassins."
|
||||
icon_state = "s-ninja"
|
||||
item_state = "s-ninja_suit"
|
||||
icon_state = "ninja_new"
|
||||
item_state = "ninja_new"
|
||||
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals, /obj/item/stock_parts/cell)
|
||||
slowdown = 1
|
||||
resistance_flags = LAVA_PROOF | ACID_PROOF
|
||||
@@ -81,11 +81,6 @@
|
||||
cell.name = "black power cell"
|
||||
cell.icon_state = "bscell"
|
||||
|
||||
//Simply deletes all the attachments and self, killing all related procs.
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/terminate()
|
||||
qdel(n_hood)
|
||||
qdel(n_gloves)
|
||||
qdel(n_shoes)
|
||||
/obj/item/clothing/suit/space/space_ninja/ui_action_click(mob/user, action)
|
||||
if(IS_NINJA_SUIT_INITIALIZATION(action))
|
||||
toggle_on_off()
|
||||
@@ -93,7 +88,7 @@
|
||||
if(!s_initialized)
|
||||
to_chat(user, "<span class='warning'><b>ERROR</b>: suit offline. Please activate suit.</span>")
|
||||
return FALSE
|
||||
if(s_coold != 0)
|
||||
if(s_coold > 0)
|
||||
to_chat(user, "<span class='warning'><b>ERROR</b>: suit is on cooldown.</span>")
|
||||
return FALSE
|
||||
if(IS_NINJA_SUIT_STATUS(action))
|
||||
@@ -119,36 +114,12 @@
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/item/clothing/suit/space/space_ninja/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
|
||||
/obj/item/clothing/suit/space/space_ninja/run_block(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = ATTACK_TYPE_MELEE)
|
||||
. = ..()
|
||||
if(stealth)
|
||||
cancel_stealth()
|
||||
s_coold = 5
|
||||
|
||||
/**
|
||||
* Proc for changing the suit's appearance upon locking.
|
||||
*
|
||||
* Proc for when space ninja's suit locks. If the user selects Original, gives it glowing lights, along with having an alternate sprite for female body types.
|
||||
* Yes, we do have nipLEDs, how could you tell?
|
||||
* If the user selects New Age, it applies new sprites to all the gear.
|
||||
* Arguments:
|
||||
* * ninja - The person wearing the suit.
|
||||
*/
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/lockIcons(mob/living/carbon/human/ninja)
|
||||
var/design_choice = alert(ninja, "Please choose your desired suit design.",,"Original","New Age")
|
||||
switch(design_choice)
|
||||
if("Original")
|
||||
icon_state = ninja.body_type == "female" ? "s-ninjanf" : "s-ninjan"
|
||||
ninja.gloves.icon_state = "s-ninjan"
|
||||
ninja.gloves.inhand_icon_state = "s-ninjan"
|
||||
if("New Age")
|
||||
icon_state ="ninja_new"
|
||||
n_hood.icon_state = "ninja_newcowl"
|
||||
n_gloves.icon_state = "ninja_new"
|
||||
if(n_mask)
|
||||
n_mask.icon_state = "ninja_new"
|
||||
|
||||
|
||||
/**
|
||||
* Proc called to lock the important gear pieces onto space ninja's body.
|
||||
*
|
||||
@@ -226,7 +197,7 @@
|
||||
* Can be called to entire rid of the suit pieces and the suit itself.
|
||||
*/
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/terminate()
|
||||
QDEL_NULL(n_hood)
|
||||
QDEL_NULL(n_gloves)
|
||||
QDEL_NULL(n_shoes)
|
||||
QDEL_NULL(src)
|
||||
qdel(n_hood)
|
||||
qdel(n_gloves)
|
||||
qdel(n_shoes)
|
||||
qdel(src)
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
if(ninja!=affecting)//Safety, in case you try doing this without wearing the suit/being the person with the suit.
|
||||
return ..()
|
||||
|
||||
if(istype(I, /obj/item/reagent_containers/glass) && I.reagents.has_reagent(/datum/reagent/uranium/radium, a_transfer) && a_boost != TRUE)//If it's a glass beaker, and what we're transferring is radium.
|
||||
I.reagents.remove_reagent(/datum/reagent/uranium/radium, a_transfer)
|
||||
if(istype(I, /obj/item/reagent_containers/glass) && I.reagents.has_reagent(/datum/reagent/radium, a_transfer) && a_boost != TRUE)//If it's a glass beaker, and what we're transferring is radium.
|
||||
I.reagents.remove_reagent(/datum/reagent/radium, a_transfer)
|
||||
a_boost = TRUE;
|
||||
to_chat(ninja, "<span class='notice'>The suit's adrenaline boost is now reloaded.</span>")
|
||||
return
|
||||
@@ -39,6 +39,6 @@
|
||||
else
|
||||
to_chat(ninja, "<span class='userdanger'>ERROR</span>: Procedure interrupted. Process terminated.")
|
||||
else
|
||||
to_chat(U, "<span class='notice'>No research information detected.</span>")
|
||||
to_chat(ninja, "<span class='notice'>No research information detected.</span>")
|
||||
return
|
||||
return ..()
|
||||
|
||||
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 228 KiB After Width: | Height: | Size: 227 KiB |
|
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 50 KiB |
|
Before Width: | Height: | Size: 444 KiB After Width: | Height: | Size: 460 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 110 KiB After Width: | Height: | Size: 110 KiB |
|
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 160 KiB After Width: | Height: | Size: 164 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 125 KiB After Width: | Height: | Size: 125 KiB |
@@ -430,7 +430,6 @@
|
||||
#include "code\datums\weakrefs.dm"
|
||||
#include "code\datums\world_topic.dm"
|
||||
#include "code\datums\actions\beam_rifle.dm"
|
||||
#include "code\datums\actions\ninja.dm"
|
||||
#include "code\datums\brain_damage\brain_trauma.dm"
|
||||
#include "code\datums\brain_damage\hypnosis.dm"
|
||||
#include "code\datums\brain_damage\imaginary_friend.dm"
|
||||
|
||||