diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 9a7702eda5e..e520e8f1204 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -74,7 +74,7 @@ datum/mind var/list/L = current.get_contents() var/obj/item/device/flash/flash = locate() in L if (flash) - if (flash.status) + if(!flash.broken) text += "|take." else text += "|take|repair." @@ -485,7 +485,7 @@ datum/mind if (!flash) usr << "\red Repairing flash failed!" else - flash.status = 1 + flash.broken = 0 if("reequip") var/list/L = current.get_contents() diff --git a/code/defines/obj.dm b/code/defines/obj.dm index b623cee8450..ca7e3df9f44 100644 --- a/code/defines/obj.dm +++ b/code/defines/obj.dm @@ -317,21 +317,6 @@ /obj/item/device icon = 'device.dmi' -/obj/item/device/flash - name = "flash" - desc = "Used for blinding and being an asshole." - icon_state = "flash" - var/l_time = 1.0 - var/shots = 5.0 - throwforce = 5 - w_class = 1.0 - throw_speed = 4 - throw_range = 10 - flags = FPRINT | TABLEPASS| CONDUCT - item_state = "electronic" - var/status = 1 - origin_tech = "magnets=2;combat=1" - /obj/item/device/flashlight name = "flashlight" desc = "A hand-held emergency light." diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index e9dd58894a2..b4ddfac1450 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -1512,23 +1512,6 @@ Total SMES charging rate should not exceed total power generation rate, or an ov var/old_lay = null m_amt = 40 -/obj/item/weapon/wirecutters - name = "wirecutters" - desc = "This cuts wires." - icon = 'items.dmi' - icon_state = "cutters" - flags = FPRINT | TABLEPASS| CONDUCT - force = 6.0 - throw_speed = 2 - throw_range = 9 - w_class = 2.0 - m_amt = 80 - origin_tech = "materials=1;engineering=1" - - New() - if(prob(50)) - icon_state = "cutters-y" - /obj/item/weapon/wrapping_paper name = "wrapping paper" desc = "You can use this to wrap items in." @@ -1536,18 +1519,6 @@ Total SMES charging rate should not exceed total power generation rate, or an ov icon_state = "wrap_paper" var/amount = 20.0 -/obj/item/weapon/wrench - name = "wrench" - desc = "A wrench with common uses. Can be found in your hand." - icon = 'items.dmi' - icon_state = "wrench" - flags = FPRINT | TABLEPASS| CONDUCT - force = 5.0 - throwforce = 7.0 - w_class = 2.0 - m_amt = 150 - origin_tech = "materials=1;engineering=1" - /obj/item/weapon/cell name = "power cell" desc = "A rechargable electrochemical power cell." diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index af251c03c4a..07bfd4bb4fd 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -87,8 +87,8 @@ O:amount += 1 // Security if(istype(O,/obj/item/device/flash)) - if(O:shots < 5) - O:shots += 1 + if(O:broken) + O:broken = 0 if(istype(O,/obj/item/weapon/gun/energy/taser/cyborg)) if(O:power_supply.charge < O:power_supply.maxcharge) O:power_supply.give(100) diff --git a/code/game/objects/devices/flash.dm b/code/game/objects/devices/flash.dm index 4f546fc8d38..125052a7156 100644 --- a/code/game/objects/devices/flash.dm +++ b/code/game/objects/devices/flash.dm @@ -1,26 +1,57 @@ +/obj/item/device/flash + name = "flash" + desc = "Used for blinding and being an asshole." + icon_state = "flash" + throwforce = 5 + w_class = 1.0 + throw_speed = 4 + throw_range = 10 + flags = FPRINT | TABLEPASS| CONDUCT + item_state = "electronic" + origin_tech = "magnets=2;combat=1" -/obj/item/device/flash/attack(mob/living/carbon/M as mob, mob/user as mob) - if ((usr.mutations & CLOWN) && prob(50)) - usr << "\red The Flash slips out of your hand." - usr.drop_item() - return - if (src.shots > 0) + var + shots_left = 5 + max_shots = 5 + broken = 0 + + proc + clown_check(var/mob/user) + recharge() + + + + + attack(mob/living/M as mob, mob/user as mob) M.attack_log += text("\[[time_stamp()]\] Has been flashed (attempt) with [src.name] by [user.name] ([user.ckey])") user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to flash [M.name] ([M.ckey])") + if(!clown_check(user)) return + if(broken) + user.show_message("\red The [src.name] is broken", 2) + return - var/safety = null - if (istype(M, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - if (istype(H.glasses, /obj/item/clothing/glasses/sunglasses)) - safety = 1 - 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/voice)) - 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(shots_left <= 0) + user.show_message("\red *click* *click*", 2) + return + + playsound(src.loc, 'flash.ogg', 100, 1) + shots_left-- + var/flashfail = 0 + + if(iscarbon(M)) + var/safety = M:eyecheck() + if(!safety) + if(M.weakened <= 10) + M.weakened = 10 + flick("e_flash", M.flash) + + if(ishuman(M))//&& (rerevcheckvargoeshere)) //Rev check + if(user.mind in ticker.mode.head_revolutionaries) + ticker.mode.add_revolutionary(M.mind) + else + flashfail = 1 + + else if(isrobot(user)) spawn(0) var/atom/movable/overlay/animation = new(user.loc) animation.layer = user.layer + 1 @@ -30,96 +61,89 @@ flick("blspell", animation) sleep(5) del(animation) - if (!( safety )) - if (M.client)//Probably here to prevent forced conversion of dced players. /N - if (status == 0) - user << "\red The bulb has been burnt out!" - return - if (!( safety ) && status == 1) - playsound(src.loc, 'flash.ogg', 100, 1) - if(!(M.mutations & HULK)) M.weakened = 10 - if (prob(10)) - status = 0 - user << "\red The bulb has burnt out!" - return - if ((M.eye_stat > 15 && prob(M.eye_stat + 50))) - flick("e_flash", M.flash) - M.eye_stat += rand(1, 2) - else - flick("flash", M.flash) - M.eye_stat += rand(0, 2) - if (M.eye_stat >= 20) - M << "\red You eyes start to burn badly!" - M.disabilities |= 1 - if (prob(M.eye_stat - 20 + 1)) - M << "\red You go blind!" - M.sdisabilities |= 1 - if(/*ticker.mode.name == "revolution" && */ istype(M, /mob/living/carbon)) - if(user.mind in ticker.mode.head_revolutionaries) - ticker.mode.add_revolutionary(M.mind) - for(var/mob/O in viewers(user, null)) - if(status == 1) - O.show_message(text("\red [] blinds [] with the flash!", user, M)) + + if(!flashfail) + for(var/mob/O in viewers(user, null)) + O.show_message(text("\red [] blinds [] with the flash!", user, M)) else for(var/mob/O in viewers(user, null)) - if(status == 1) - O.show_message(text("\blue [] fails to blind [] with the flash!", user, M)) - src.attack_self(user, 1) - return + O.show_message(text("\blue [] fails to blind [] with the flash!", user, M)) -/obj/item/device/flash/attack_self(mob/living/carbon/user as mob, flag = 0, emp = 0) - if (emp) - else if ((usr.mutations & CLOWN) && prob(50)) - usr << "\red The Flash slips out of your hand." - usr.drop_item() - return - else if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") - usr << "\red You don't have the dexterity to do this!" - return - if ( world.time > (src.l_time + 600)) - src.shots = 5 - if (src.shots < 1) - user.show_message("\red *click* *click*", 2) + + if (prob(2)) + broken = 1 + user << "\red The bulb has burnt out!" + + spawn(60) + recharge() + return - src.l_time = world.time - add_fingerprint(user) - src.shots-- - playsound(src.loc, 'flash.ogg', 100, 1) - flick("flash2", src) - if(isrobot(user)) - spawn(0) - var/atom/movable/overlay/animation = new(user.loc) - animation.layer = user.layer + 1 - animation.icon_state = "blank" - animation.icon = 'mob.dmi' - animation.master = user - flick("blspell", animation) - sleep(5) - del(animation) - if (!( flag )) + + attack_self(mob/living/carbon/user as mob, flag = 0, emp = 0) + if(!clown_check(user) && !emp) return + if(broken) + user.show_message("\red The [src.name] is broken", 2) + return + + if(shots_left <= 0) + user.show_message("\red *click* *click*", 2) + return + + playsound(src.loc, 'flash.ogg', 100, 1) + shots_left-- + + flick("flash2", src) + if(isrobot(user)) + spawn(0) + var/atom/movable/overlay/animation = new(user.loc) + animation.layer = user.layer + 1 + animation.icon_state = "blank" + animation.icon = 'mob.dmi' + animation.master = user + flick("blspell", animation) + sleep(5) + del(animation) + for(var/mob/living/carbon/M in oviewers(3, null)) - if (prob(50)) + if(prob(50)) if (locate(/obj/item/weapon/cloaking_device, M)) for(var/obj/item/weapon/cloaking_device/S in M) S.active = 0 S.icon_state = "shield0" - if (M.client) - var/safety = null - if (istype(M, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - if (istype(H.glasses, /obj/item/clothing/glasses/sunglasses)) - safety = 1 - if (istype(H.head, /obj/item/clothing/head/helmet/welding)) - if(!H.head:up) - safety = 1 - if (istype(M, /mob/living/carbon/alien))//So aliens don't see those annoying flash screens. - safety = 1 - if (!( safety )) - flick("flash", M.flash) + var/safety = M:eyecheck() + if(!safety) + flick("flash", M.flash) -/obj/item/device/flash/emp_act(severity) - src.attack_self(null,1,1) - ..() + if (prob(2)) + broken = 1 + user << "\red The bulb has burnt out!" + + spawn(60) + recharge() + + return + + + emp_act(severity) + src.attack_self(null,1,1) + ..() + + + clown_check(var/mob/user) + if((user.mutations & CLOWN) && prob(50)) + user << "\red The Flash slips out of your hand." + user.drop_item() + return 0 + return 1 + + + recharge() + if(max_shots > shots_left) + shots_left++ + if(max_shots > shots_left) + spawn(60)//more or less 10 seconds + recharge() + return \ No newline at end of file diff --git a/code/game/objects/items/item.dm b/code/game/objects/items/item.dm index 424a3d9f893..637cc6a93b3 100644 --- a/code/game/objects/items/item.dm +++ b/code/game/objects/items/item.dm @@ -483,6 +483,9 @@ user << "\red You cannot locate any eyes on this creature!" return + user.attack_log += "\[[time_stamp()]\] Attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])" + M.attack_log += "\[[time_stamp()]\] Attacked by [user.name] ([user.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])" + src.add_fingerprint(user) //if((user.mutations & CLOWN) && prob(50)) // M = user diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm index 6bb17c869f7..ef13557e0c6 100644 --- a/code/game/objects/items/weapons/surgery_tools.dm +++ b/code/game/objects/items/weapons/surgery_tools.dm @@ -540,6 +540,9 @@ CIRCULAR SAW "\red You sever your brain's connection to the spine with [src]!" \ ) + user.attack_log += "\[[time_stamp()]\] Debrained [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])" + M.attack_log += "\[[time_stamp()]\] Debrained by [user.name] ([user.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])" + var/obj/item/brain/B = new(M.loc) B.transfer_identity(M) diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index f7e1d86fbe8..9ee52ccd51a 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -8,12 +8,24 @@ WELDINGTOOOL // WRENCH -/obj/item/weapon/wrench/New() - if (prob(75)) - src.pixel_x = rand(0, 16) - return +/obj/item/weapon/wrench + name = "wrench" + desc = "A wrench with common uses. Can be found in your hand." + icon = 'items.dmi' + icon_state = "wrench" + flags = FPRINT | TABLEPASS| CONDUCT + force = 5.0 + throwforce = 7.0 + w_class = 2.0 + m_amt = 150 + origin_tech = "materials=1;engineering=1" + New() + if (prob(75)) + src.pixel_x = rand(0, 16) + return + // SCREWDRIVER @@ -24,9 +36,7 @@ WELDINGTOOOL return /obj/item/weapon/screwdriver/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) - if(!istype(M)) - return ..() - + if(!istype(M)) return ..() if(user.zone_sel.selecting != "eyes" && user.zone_sel.selecting != "head") return ..() if((user.mutations & CLOWN) && prob(50)) @@ -35,7 +45,6 @@ WELDINGTOOOL - // WELDING TOOL /obj/item/weapon/weldingtool name = "Welding Tool" @@ -54,6 +63,12 @@ WELDINGTOOOL welding = 0 status = 1 max_fuel = 20 + proc + get_fuel() + remove_fuel(var/amount = 1, var/mob/M = null) + check_status() + toggle(var/message = 0) + eyecheck(mob/user as mob) New() @@ -131,7 +146,6 @@ WELDINGTOOOL location.hotspot_expose(700, 5) - afterattack(obj/O as obj, mob/user as mob) if (istype(O, /obj/reagent_dispensers/fueltank) && get_dist(src,O) <= 1 && !src.welding) O.reagents.trans_to(src, max_fuel) @@ -159,114 +173,96 @@ WELDINGTOOOL return - proc - - ///GET prop for fuel - get_fuel() - return reagents.get_reagent_amount("fuel") + get_fuel() + return reagents.get_reagent_amount("fuel") ///SET prop for fuel ///Will also turn it off if it is out of fuel ///The mob argument is not needed but if included will call eyecheck() on it if the welder is on. - remove_fuel(var/amount = 1, var/mob/M = null) - if(!welding || !check_status()) - return 0 - if(get_fuel() >= amount) - reagents.remove_reagent("fuel", amount) - check_status() - if(M) - eyecheck(M)//TODO:eyecheck should really be in mob not here - return 1 - else - if(M) - M << "\blue You need more welding fuel to complete this task." - return 0 + remove_fuel(var/amount = 1, var/mob/M = null) + if(!welding || !check_status()) + return 0 + if(get_fuel() >= amount) + reagents.remove_reagent("fuel", amount) + check_status() + if(M) + eyecheck(M)//TODO:eyecheck should really be in mob not here + return 1 + else + if(M) + M << "\blue You need more welding fuel to complete this task." + return 0 ///Quick check to see if we even have any fuel and should shut off ///This could use a better name - check_status() - if((get_fuel() <= 0) && welding) - toggle(1) - return 0 - return 1 + check_status() + if((get_fuel() <= 0) && welding) + toggle(1) + return 0 + return 1 //toggles the welder off and on - toggle(var/message = 0) - if(!status) return - src.welding = !( src.welding ) - if (src.welding) - if (remove_fuel(1)) - usr << "\blue You switch the [src] on." - src.force = 15 - src.damtype = "fire" - src.icon_state = "welder1" - processing_items.Add(src) - else - usr << "\blue Need more fuel!" - src.welding = 0 - return + toggle(var/message = 0) + if(!status) return + src.welding = !( src.welding ) + if (src.welding) + if (remove_fuel(1)) + usr << "\blue You switch the [src] on." + src.force = 15 + src.damtype = "fire" + src.icon_state = "welder1" + processing_items.Add(src) else - if(!message) - usr << "\blue You switch the [src] off." - else - usr << "\blue The [src] shuts off!" - src.force = 3 - src.damtype = "brute" - src.icon_state = "welder" + usr << "\blue Need more fuel!" src.welding = 0 + return + else + if(!message) + usr << "\blue You switch the [src] off." + else + usr << "\blue The [src] shuts off!" + src.force = 3 + src.damtype = "brute" + src.icon_state = "welder" + src.welding = 0 - eyecheck(mob/user as mob)//TODO:Move this over to /mob/ where it should be - //check eye protection - if(!ishuman(user) && !ismonkey(user)) - return 1 - var/safety = 0 - if (istype(user, /mob/living/carbon/human)) - if (istype(user:head, /obj/item/clothing/head/helmet/welding)) - if (!user:head:up) - safety = 2 - else if (istype(user:head, /obj/item/clothing/head/helmet/space)) - safety = 2 - else if (istype(user:glasses, /obj/item/clothing/glasses/sunglasses)) - safety = 1 - - else if (istype(user:glasses, /obj/item/clothing/glasses/thermal)) - safety = -1 - else - safety = 0 - switch(safety) - if(1) - usr << "\red Your eyes sting a little." - user.eye_stat += rand(1, 2) - if(user.eye_stat > 12) - user.eye_blurry += rand(3,6) - if(0) - usr << "\red Your eyes burn." - user.eye_stat += rand(2, 4) - if(user.eye_stat > 10) - user.eye_blurry += rand(4,10) - if(-1) - usr << "\red Your thermals intensify the welder's glow. Your eyes itch and burn severely." - user.eye_blurry += rand(12,20) - user.eye_stat += rand(12, 16) - if(user.eye_stat > 10 && safety < 2) - user << "\red Your eyes are really starting to hurt. This can't be good for you!" - if (prob(user.eye_stat - 25 + 1)) - user << "\red You go blind!" - user.sdisabilities |= 1 - else if (prob(user.eye_stat - 15 + 1)) - user << "\red You go blind!" - user.eye_blind = 5 - user.eye_blurry = 5 - user.disabilities |= 1 - spawn(100) - user.disabilities &= ~1 - return - + eyecheck(mob/user as mob) + //check eye protection + if(!iscarbon(user)) return 1 + var/safety = user:eyecheck() + switch(safety) + if(1) + usr << "\red Your eyes sting a little." + user.eye_stat += rand(1, 2) + if(user.eye_stat > 12) + user.eye_blurry += rand(3,6) + if(0) + usr << "\red Your eyes burn." + user.eye_stat += rand(2, 4) + if(user.eye_stat > 10) + user.eye_blurry += rand(4,10) + if(-1) + usr << "\red Your thermals intensify the welder's glow. Your eyes itch and burn severely." + user.eye_blurry += rand(12,20) + user.eye_stat += rand(12, 16) + if(user.eye_stat > 10 && safety < 2) + user << "\red Your eyes are really starting to hurt. This can't be good for you!" + if (prob(user.eye_stat - 25 + 1)) + user << "\red You go blind!" + user.sdisabilities |= 1 + else if (prob(user.eye_stat - 15 + 1)) + user << "\red You go blind!" + user.eye_blind = 5 + user.eye_blurry = 5 + user.disabilities |= 1 + spawn(100) + user.disabilities &= ~1 + return /obj/item/weapon/weldingtool/largetank @@ -290,3 +286,22 @@ WELDINGTOOOL w_class = 3.0 m_amt = 70 g_amt = 120 + + + +/obj/item/weapon/wirecutters + name = "wirecutters" + desc = "This cuts wires." + icon = 'items.dmi' + icon_state = "cutters" + flags = FPRINT | TABLEPASS| CONDUCT + force = 6.0 + throw_speed = 2 + throw_range = 9 + w_class = 2.0 + m_amt = 80 + origin_tech = "materials=1;engineering=1" + + New() + if(prob(50)) + icon_state = "cutters-y" \ No newline at end of file diff --git a/code/game/objects/storage/backpack.dm b/code/game/objects/storage/backpack.dm index e9cf153e182..34732b8e16a 100644 --- a/code/game/objects/storage/backpack.dm +++ b/code/game/objects/storage/backpack.dm @@ -51,6 +51,8 @@ user << "\red The Bluespace interfaces of the two devices catastrophically malfunction!" del(W) new /obj/machinery/singularity (get_turf(src)) + message_admins("[key_name_admin(user)] detonated a bag of holding") + log_game("[key_name(user)] detonated a bag of holding") del(src) return ..() diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index 278f0b5150e..b01409f5abb 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -5,6 +5,7 @@ These are general powers. Specific powers are stored under the appropriate alien /*Alien spit now works like a taser shot. It won't home in on the target but will act the same once it does hit. Doesn't work on other aliens/AI.*/ + /mob/living/carbon/alien/proc/powerc(X, Y)//Y is optional, checks for weed planting. X can be null. if(stat) src << "\green You must be conscious to do this." diff --git a/code/modules/mob/living/carbon/alien/say.dm b/code/modules/mob/living/carbon/alien/say.dm index 63cad044428..277c0d2a017 100644 --- a/code/modules/mob/living/carbon/alien/say.dm +++ b/code/modules/mob/living/carbon/alien/say.dm @@ -1,3 +1,6 @@ +/mob/living/carbon/alien/eyecheck() + return 2 + /mob/living/carbon/alien/say_understands(var/other) if (istype(other, /mob/living/carbon/alien)) return 1 diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index f8d7e1f1d96..c82d4221ee7 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -173,3 +173,6 @@ "\blue [M] shakes [src] trying to wake [t_him] up!", \ "\blue You shake [src] trying to wake [t_him] up!", \ ) + +/mob/living/carbon/proc/eyecheck() + return 0 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index dab6ce3e50e..cfac036c29c 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -3023,4 +3023,22 @@ It can still be worn/put on as normal. O.process() return ..() - return \ No newline at end of file + return + + +///eyecheck() +///Returns a number between -1 to 2 +/mob/living/carbon/human/eyecheck() + if(istype(src.head, /obj/item/clothing/head/helmet/welding)) + if(!src.head:up) + return (2) + if(istype(src.head, /obj/item/clothing/head/helmet/space)) + return (2) + if(istype(src.glasses, /obj/item/clothing/glasses/sunglasses)) + return (1) + if(istype(src.glasses, /obj/item/clothing/glasses/thermal)) + return (-1) + if(src.sdisabilities & 1)//Blindness Check + return (2) + return (0) +