diff --git a/code/defines/obj/clothing/mask.dm b/code/defines/obj/clothing/mask.dm index 4cdfab72dfc..50996932256 100644 --- a/code/defines/obj/clothing/mask.dm +++ b/code/defines/obj/clothing/mask.dm @@ -37,10 +37,11 @@ /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. Can disguise your voice." + 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" - vchange = 1 + var/mode = 1// 1=Night Vision |2=Thermal |3=Meson + vchange = 0 /obj/item/clothing/mask/gas/voice name = "gas mask" diff --git a/code/defines/obj/clothing/suit.dm b/code/defines/obj/clothing/suit.dm index 4fd18d12cfb..76d76c03581 100644 --- a/code/defines/obj/clothing/suit.dm +++ b/code/defines/obj/clothing/suit.dm @@ -347,6 +347,8 @@ allowed = list(/obj/item/weapon/gun,/obj/item/weapon/ammo,/obj/item/weapon/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/tank/emergency_oxygen) slowdown = 0 radiation_protection = 0.75 + var/active = 0 + var/energy = 100 /obj/item/clothing/suit/space/pirate name = "pirate coat" diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index fc20e18a10b..2f2eaa41659 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -68,8 +68,12 @@ for (var/mob/O in viewers(src, null)) if (get_dist(src, O) > src.range) continue - if ((istype(O, /mob/living/carbon/human) && (istype(O:glasses, /obj/item/clothing/glasses/sunglasses)))) - continue + if (istype(O, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = O + if (istype(H.glasses, /obj/item/clothing/glasses/sunglasses)) continue + if (istype(H.head, /obj/item/clothing/head/helmet/welding)) + if(!H.head:up) continue + if (istype(H.wear_mask, /obj/item/clothing/mask/gas/space_ninja)) continue if (istype(O, /mob/living/carbon/alien))//So aliens don't get flashed (they have no external eyes)/N continue diff --git a/code/game/objects/devices/flash.dm b/code/game/objects/devices/flash.dm index 181f1d3c454..ae1dfb1a6c4 100644 --- a/code/game/objects/devices/flash.dm +++ b/code/game/objects/devices/flash.dm @@ -13,9 +13,11 @@ if (istype(H.head, /obj/item/clothing/head/helmet/welding)) if(!H.head:up) safety = 1 + if (istype(H.wear_mask, /obj/item/clothing/mask/gas/space_ninja)) + safety = 1 if (istype(M, /mob/living/carbon/alien))//So aliens don't get flashed (they have no external eyes)/N safety = 1 - if(isrobot(user)) + if (isrobot(user)) spawn(0) var/atom/movable/overlay/animation = new(user.loc) animation.layer = user.layer + 1 diff --git a/code/game/objects/items/clothing.dm b/code/game/objects/items/clothing.dm index 98d02ce367c..60b922dd446 100644 --- a/code/game/objects/items/clothing.dm +++ b/code/game/objects/items/clothing.dm @@ -8,7 +8,8 @@ SWAT SUIT CHAMELEON JUMPSUIT DEATH COMMANDO GAS MASK THERMAL GLASSES - +NINJA SUIT +NINJA MASK */ @@ -290,4 +291,101 @@ THERMAL GLASSES M.disabilities |= 1 spawn(100) M.disabilities &= ~1 - ..() \ No newline at end of file + ..() + +//SPESS NINJA STUFF +/obj/item/clothing/suit/space/space_ninja/verb/toggle() + set name = "Toggle Stealth" + set desc = "Toggles the internal CLOAK-tech on or off." + set category = "Object" + + if(src.active) + spawn(0) + var/atom/movable/overlay/animation = new(usr.loc) + animation.icon = 'mob.dmi' + animation.icon_state = "blank" + animation.layer = usr.layer + 1 + animation.master = usr + flick("uncloak", animation) + sleep(15) + del(animation) + src.active=0 + usr << "\blue You are now visible." + for(var/mob/O in oviewers(usr, null)) + O << "[usr.name] appears from thin air!" + + else + spawn(0) + var/atom/movable/overlay/animation = new(usr.loc) + animation.icon = 'mob.dmi' + animation.icon_state = "blank" + animation.layer = usr.layer + 1 + animation.master = usr + flick("cloak", animation) + sleep(15) + del(animation) + src.active=1 + usr << "\blue You are now invisible to normal detection." + for(var/mob/O in oviewers(usr, null)) + O << "[usr.name] vanishes into thin air!" + +//So apparently, examine won't show up as a verb when +//viewing an object equipped on the hud +//and that object having other verbs? +//Doesn't really make any sense +/obj/item/clothing/suit/space/space_ninja/examine() + ..() + if(src.active) + usr << "The CLOAK-tech device is active." + else + usr << "The CLOAK-tech device is offline." + + +/obj/item/clothing/mask/gas/space_ninja/verb/togglev() + set name = "Toggle Voice" + set desc = "Toggles the voice synthesizer on or off." + set category = "Object" + if(src.vchange==0) + src.vchange=1 + usr << "You enable the voice voice synthesizer." + else + src.vchange=0 + usr << "You disable the voice synthesizer." + +/obj/item/clothing/mask/gas/space_ninja/verb/switchm() + set name = "Switch Mode" + set desc = "Switches between Night Vision, Meson, or Thermal vision modes." + set category = "Object" + //Have to reset these manually since life.dm is retarded like that. Go figure. + switch(src.mode) + if(1) + src.mode=2 + usr.see_in_dark = 2 + usr << "Switching mode to Thermal Scanner." + if(2) + src.mode=3 + usr.see_invisible = 0 + usr.sight &= ~SEE_MOBS + usr << "Switching mode to Meson Scanner." + if(3) + src.mode=1 + usr.sight &= ~SEE_TURFS + usr << "Switching mode to Night Vision." + +/obj/item/clothing/mask/gas/space_ninja/examine() + ..() + var/mode = "Night Vision" + var/voice = "inactive" + switch(src.mode) + if(1) + mode = "Night Vision" + if(2) + mode = "Thermal Scanner" + if(3) + mode = "Meson Scanner" + if(src.vchange==0) + voice = "inactive" + else + voice = "active" + usr << "[mode] is active." + usr << "Voice mimicking algorithm is [voice]." \ No newline at end of file diff --git a/code/game/objects/items/weapons/guns_ammo.dm b/code/game/objects/items/weapons/guns_ammo.dm index 1cba26e8e7f..d592756120c 100644 --- a/code/game/objects/items/weapons/guns_ammo.dm +++ b/code/game/objects/items/weapons/guns_ammo.dm @@ -510,7 +510,6 @@ obj/item/weapon/gun/revolver/attackby(obj/item/weapon/ammo/a357/A as obj, mob/us /obj/item/weapon/gun/detectiverevolver/attack(mob/M as mob, mob/user as mob) src.add_fingerprint(user) - var/mob/living/carbon/human/H = M var/detective = (istype(user:w_uniform, /obj/item/clothing/under/det) && istype(user:head, /obj/item/clothing/head/det_hat) && istype(user:wear_suit, /obj/item/clothing/suit/det_suit)) // ******* Check diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm index 758c378ab7c..6ff7bc1a8b1 100644 --- a/code/game/objects/items/weapons/kitchen.dm +++ b/code/game/objects/items/weapons/kitchen.dm @@ -141,10 +141,10 @@ KNIFE M.weakened += 1 M.bruteloss += 2 if(prob(50)) - playsound(M, 'trayhit1.wav', 50, 1) + //playsound(M, 'trayhit1.wav', 50, 1) return else - playsound(M, 'trayhit2.wav', 50, 1) //sound playin' + //playsound(M, 'trayhit2.wav', 50, 1) //sound playin' return //it always returns, but I feel like adding an extra return just for safety's sakes. EDIT; Oh well I won't :3 @@ -155,12 +155,12 @@ KNIFE else M.bruteloss +=5 if(prob(50)) - playsound(M, 'trayhit1.wav', 50, 1) + //playsound(M, 'trayhit1.wav', 50, 1) for(var/mob/O in viewers(M, null)) O.show_message(text("\red [] slams [] with the tray!", user, M), 1) return else - playsound(M, 'trayhit2.wav', 50, 1) //we applied the damage, we played the sound, we showed the appropriate messages. Time to return and stop the proc + //playsound(M, 'trayhit2.wav', 50, 1) //we applied the damage, we played the sound, we showed the appropriate messages. Time to return and stop the proc for(var/mob/O in viewers(M, null)) O.show_message(text("\red [] slams [] with the tray!", user, M), 1) return @@ -171,11 +171,11 @@ KNIFE if(istype(M, /mob/living/carbon/human) && ((H.head && H.head.flags & HEADCOVERSEYES) || (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || (H.glasses && H.glasses.flags & GLASSESCOVERSEYES))) M << "\red You get slammed in the face with the tray, against your mask!" if(prob(50)) - playsound(M, 'trayhit1.wav', 50, 1) + //playsound(M, 'trayhit1.wav', 50, 1) for(var/mob/O in viewers(M, null)) O.show_message(text("\red [] slams [] with the tray!", user, M), 1) else - playsound(M, 'trayhit2.wav', 50, 1) //sound playin' + //playsound(M, 'trayhit2.wav', 50, 1) //sound playin' for(var/mob/O in viewers(M, null)) O.show_message(text("\red [] slams [] with the tray!", user, M), 1) if(prob(10)) @@ -189,11 +189,11 @@ KNIFE else //No eye or head protection, tough luck! M << "\red You get slammed in the face with the tray!" if(prob(50)) - playsound(M, 'trayhit1.wav', 50, 1) + // playsound(M, 'trayhit1.wav', 50, 1) for(var/mob/O in viewers(M, null)) O.show_message(text("\red [] slams [] in the face with the tray!", user, M), 1) else - playsound(M, 'trayhit2.wav', 50, 1) //sound playin' again + //playsound(M, 'trayhit2.wav', 50, 1) //sound playin' again for(var/mob/O in viewers(M, null)) O.show_message(text("\red [] slams [] in the face with the tray!", user, M), 1) if(prob(30)) diff --git a/code/modules/admin/verbs/striketeam.dm b/code/modules/admin/verbs/striketeam.dm index b2dc2c4b699..6f3770952f9 100644 --- a/code/modules/admin/verbs/striketeam.dm +++ b/code/modules/admin/verbs/striketeam.dm @@ -216,7 +216,7 @@ Useful for copy pasta since I'm lazy.*/ new_ninja.equip_if_possible(new /obj/item/clothing/gloves/space_ninja(new_ninja), new_ninja.slot_gloves) new_ninja.equip_if_possible(new /obj/item/clothing/head/helmet/space/space_ninja(new_ninja), new_ninja.slot_head) new_ninja.equip_if_possible(new /obj/item/clothing/mask/gas/space_ninja(new_ninja), new_ninja.slot_wear_mask) -// new_ninja.equip_if_possible(new /obj/item/clothing/glasses/thermal(new_ninja), new_ninja.slot_glasses) //These look ugly without the mask. And you will be able to take off the mask. +// new_ninja.equip_if_possible(new /obj/item/clothing/glasses/thermal(new_ninja), new_ninja.slot_glasses) //No longer necessary. new_ninja.equip_if_possible(new /obj/item/device/flashlight(new_ninja), new_ninja.slot_belt) new_ninja.equip_if_possible(new /obj/item/weapon/plastique(new_ninja), new_ninja.slot_r_store) new_ninja.equip_if_possible(new /obj/item/weapon/plastique(new_ninja), new_ninja.slot_l_store) @@ -255,12 +255,14 @@ Useful for copy pasta since I'm lazy.*/ new_ninja << "\blue \nYou are an elite mercenary assassin of the Spider Clan. The dreaded \red SPACE NINJA!\blue You have a variety of abilities at your disposal, thanks to your nano-enhanced cyber armor. Remember your training! \nYour current mission is: \red [input]" - new_ninja.verbs += /mob/proc/phaseshift - new_ninja.verbs += /mob/proc/phasejaunt - new_ninja.verbs += /mob/proc/smokebomb - new_ninja.mind.special_verbs += /mob/proc/phaseshift - new_ninja.mind.special_verbs += /mob/proc/phasejaunt - new_ninja.mind.special_verbs += /mob/proc/smokebomb + new_ninja.verbs += /mob/proc/ninjashift + new_ninja.verbs += /mob/proc/ninjajaunt + new_ninja.verbs += /mob/proc/ninjasmoke + new_ninja.verbs += /mob/proc/ninjapulse + new_ninja.mind.special_verbs += /mob/proc/ninjashift + new_ninja.mind.special_verbs += /mob/proc/ninjajaunt + new_ninja.mind.special_verbs += /mob/proc/ninjasmoke + new_ninja.mind.special_verbs += /mob/proc/ninjapulse message_admins("\blue [admin_name] has spawned [new_ninja.key] as a Space Ninja. Hide yo children!", 1) log_admin("[admin_name] used Spawn Space Ninja.") @@ -269,7 +271,8 @@ Useful for copy pasta since I'm lazy.*/ //Smoke //Summons smoke in radius of user. -/mob/proc/smokebomb() +//Not sure why this would be useful (it's not) but whatever. Ninjas need their smoke bombs. +/mob/proc/ninjasmoke() set name = "Smoke Bomb" set desc = "Blind your enemies momentarily with a well-placed smoke bomb." set category = "Ninja" @@ -283,12 +286,12 @@ Useful for copy pasta since I'm lazy.*/ var/datum/effects/system/bad_smoke_spread/smoke = new /datum/effects/system/bad_smoke_spread() smoke.set_up(10, 0, src.loc) smoke.start() - //subtract cost + //subtract cost(LOW) //9-10 Tile Teleport //Click to to teleport 9-10 tiles in direction facing. -/mob/proc/phasejaunt() +/mob/proc/ninjajaunt() set name = "Phase Jaunt" set desc = "Utilizes the internal VOID-shift device to rapidly transit in direction facing." set category = "Ninja" @@ -365,11 +368,16 @@ Useful for copy pasta since I'm lazy.*/ flick("phasein", animation) sleep(15) del(animation) - //subtract cost + + spawn(0) //Any living mobs in teleport area are gibbed. + for(var/mob/living/M in picked) + if(M==src) continue + M.gib() + //subtract cost(MED) //Right Click Teleport //Right click to teleport somewhere, almost exactly like admin jump to turf. -/mob/proc/phaseshift(var/turf/T in oview()) +/mob/proc/ninjashift(var/turf/T in oview()) set name = "Phase Shift" set desc = "Utilizes the internal VOID-shift device to rapidly transit to a destination in view." set category = "Ninja" @@ -406,16 +414,31 @@ Useful for copy pasta since I'm lazy.*/ flick("phasein", animation) sleep(15) del(animation) - //subtract cost -/* + spawn(0) //Any living mobs in teleport area are gibbed. + for(var/mob/living/M in T) + if(M==src) continue + M.gib() + //subtract cost(HIGH) + //EMP Pulse //Disables nearby tech equipment. -name = "" -tab = "ninja" -desc = "" -cost = 0 +/mob/proc/ninjapulse() + set name = "EM Burst" + set desc = "Disable any nearby technology with a electro-magnetic pulse." + set category = "Ninja" + if(src.stat) + src << "\red You must be conscious to do this." + return + //add energy cost check + //add warning message for low energy + + empulse(src, 4, 6) //Procs sure are nice. Slihgtly weaker than wizard's disable tch. + + //subtract cost(HIGH) + +/* //Summon Energy Blade //Summons a blade of energy in active hand. name = "" @@ -423,21 +446,7 @@ tab = "ninja" desc = "" cost = 0 -//Toggle vision -//Toggles between heat, meson, and night vision. Will be a function of the mask. -switch() - if(1) - src.sight |= SEE_TURFS - src.blahblah.mode=2 - if(2) - src.see_in_dark = 5 - src.blahblah.mode=3 - if(3) - src.sight |= SEE_MOBS - src.blahblah.mode=1 - -//Toggle Stealth -Will be a function of the suit, much like a regular cloak. +//Make untrackable by AI. */ diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 224ecb0edf9..0599da7da9c 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1337,6 +1337,11 @@ shielded = 2 break + for (var/obj/item/clothing/suit/space/space_ninja/S in src) + if (S.active) + shielded = 2 + break + if (shielded == 2) src.invisibility = 2 else @@ -2696,7 +2701,7 @@ var/obj/item/clothing/gloves/G = src.gloves siemens_coeff = G.siemens_coefficient return ..(shock_damage,source,siemens_coeff) - + /mob/living/carbon/human/heal_organ_damage(var/brute, var/burn) ..() src.UpdateDamageIcon() diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index e930a1d27bc..f83b2b24771 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -110,7 +110,7 @@ ::::::::::::::::::::::::"~-,_::::::::::::::"~-,_:::"-,/|/\::::::::::: \::: \"-/|::| :::::::::::::::::::::::::::::::"~-,__:::::::::::',"-,:::"_|/\:|\: : : : \::\":/|\| ::::::::::::::::::::::::::::::::::::::::"~-,_:::::\:::\:::"~/_:|:|\: : : '-,\::"::,'\ -:::::::::::::::::::::::::::::::::::::::::::::::"-,_:'-,::\:::::::"-,|:||\,-, : '-,\:::|-'-„ +:::::::::::::::::::::::::::::::::::::::::::::::"-,_:'-,::\:::::::"-,|:||\,-, : '-,\:::|-'- :::::::::::::::::::::::::::::::::::::::::::::::::: ::,-,'"-:"~,:::::"/_/::|-/\--';;\:::/: ||\-, :::::::::::::::::::::::::::::::::::::::::::::::::: :/...'-,::::::"~„::::"-,/_:|:/\:/|/|/|_/:| :::::::::::::::::::::::::::::::::::::::::::::::::: |......"-,::::::::"~-:::::""~~~"¯:::| @@ -723,9 +723,24 @@ src.see_in_dark = 8 if(!src.druggy) src.see_invisible = 2 + + else if (istype(src.wear_mask, /obj/item/clothing/mask/gas/space_ninja)) + switch(src.wear_mask:mode) + if(1) + src.see_in_dark = 5 + if(!src.druggy) + src.see_invisible = 0 + if(2) + src.sight |= SEE_MOBS + if(!src.druggy) + src.see_invisible = 2 + if(3) + src.sight |= SEE_TURFS + if(!src.druggy) + src.see_invisible = 0 + else if (istype(src.glasses, /obj/item/clothing/glasses/meson)) src.sight |= SEE_TURFS - src.see_in_dark = 3 if(!src.druggy) src.see_invisible = 0 else if (istype(src.glasses, /obj/item/clothing/glasses/night)) @@ -734,9 +749,9 @@ src.see_invisible = 0 else if (istype(src.glasses, /obj/item/clothing/glasses/thermal)) src.sight |= SEE_MOBS - src.see_in_dark = 4 if(!src.druggy) src.see_invisible = 2 + else if (src.stat != 2) src.sight &= ~SEE_TURFS src.sight &= ~SEE_MOBS @@ -756,10 +771,9 @@ if(!seer) src.see_invisible = 0 - if (istype(src.glasses, /obj/item/clothing/glasses/sunglasses)) + else if (istype(src.glasses, /obj/item/clothing/glasses/sunglasses)) src.see_in_dark = 1 - - if (istype(src.head, /obj/item/clothing/head/helmet/welding)) + else if (istype(src.head, /obj/item/clothing/head/helmet/welding)) if(!src.head:up && tinted_weldhelh) src.see_in_dark = 1 diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi index 11b5585cac4..23ea4516e01 100644 Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ