diff --git a/aurora.dme b/aurora.dme index f2092f19..072ce7b4 100644 --- a/aurora.dme +++ b/aurora.dme @@ -552,6 +552,7 @@ #include "code\game\objects\items\devices\debugger.dm" #include "code\game\objects\items\devices\flash.dm" #include "code\game\objects\items\devices\flashlight.dm" +#include "code\game\objects\items\devices\laserpointer.dm" #include "code\game\objects\items\devices\lightreplacer.dm" #include "code\game\objects\items\devices\megaphone.dm" #include "code\game\objects\items\devices\modkit.dm" diff --git a/code/WorkInProgress/Cael_Aislinn/ShieldGen/circuits_and_designs.dm b/code/WorkInProgress/Cael_Aislinn/ShieldGen/circuits_and_designs.dm index b85be8f7..c387bccc 100644 --- a/code/WorkInProgress/Cael_Aislinn/ShieldGen/circuits_and_designs.dm +++ b/code/WorkInProgress/Cael_Aislinn/ShieldGen/circuits_and_designs.dm @@ -21,8 +21,8 @@ datum/design/shield_gen_ex desc = "Allows for the construction of circuit boards used to build an experimental hull shield generator." id = "shield_gen" req_tech = list("bluespace" = 4, "plasmatech" = 3) - build_type = IMPRINTER - materials = list("$glass" = 2000, "sacid" = 20, "$plasma" = 10000, "$diamond" = 5000, "$gold" = 10000) + build_type = PROTOLATHE + materials = list("$glass" = 2000, "$plasma" = 5000, "$diamond" = 5000, "$gold" = 5000) build_path = "/obj/machinery/shield_gen/external" //////////////////////////////////////// @@ -47,8 +47,8 @@ datum/design/shield_gen desc = "Allows for the construction of circuit boards used to build an experimental shield generator." id = "shield_gen" req_tech = list("bluespace" = 4, "plasmatech" = 3) - build_type = IMPRINTER - materials = list("$glass" = 2000, "sacid" = 20, "$plasma" = 10000, "$diamond" = 5000, "$gold" = 10000) + build_type = PROTOLATHE + materials = list("$glass" = 2000, "$plasma" = 5000, "$diamond" = 5000, "$gold" = 5000) build_path = "/obj/machinery/shield_gen/external" //////////////////////////////////////// @@ -73,6 +73,6 @@ datum/design/shield_cap desc = "Allows for the construction of circuit boards used to build an experimental shielding capacitor." id = "shield_cap" req_tech = list("magnets" = 3, "powerstorage" = 4) - build_type = IMPRINTER - materials = list("$glass" = 2000, "sacid" = 20, "$plasma" = 10000, "$diamond" = 5000, "$silver" = 10000) + build_type = PROTOLATHE + materials = list("$glass" = 2000, "$plasma" = 5000, "$diamond" = 5000, "$silver" = 5000) build_path = "/obj/machinery/shield_gen/external" diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index f8a13e15..687ef35b 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -366,3 +366,11 @@ datum/projectile_data var/dest_y = src_y + distance*cos(rotation); return new /datum/projectile_data(src_x, src_y, time, distance, power_x, power_y, dest_x, dest_y) + + +/proc/flick_overlay(image/I, list/show_to, duration) + for(var/client/C in show_to) + C.images += I + sleep(duration) + for(var/client/C in show_to) + C.images -= I \ No newline at end of file diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 966741aa..d5f6ed1e 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -178,6 +178,9 @@ playsound(loc, "sparks", 50, 1) visible_message("\blue The camera has been sliced apart by [] with an energy blade!") del(src) + else if(istype(W, /obj/item/device/laser_pointer)) + var/obj/item/device/laser_pointer/L = W + L.laser_act(src, user) else ..() return diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index e4957ea1..acc0a5bd 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -322,7 +322,7 @@ icon_state = "Shield_Gen" anchored = 0 density = 1 - req_access = list(access_teleporter) + req_access = list(access_research) var/active = 0 var/power = 0 var/state = 0 @@ -330,7 +330,7 @@ var/last_check = 0 var/check_delay = 10 var/recalc = 0 - var/locked = 1 + var/locked = 0 var/destroyed = 0 var/directwired = 1 // var/maxshieldload = 200 diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index e108a312..3a8d3734 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -13,6 +13,8 @@ var/times_used = 0 //Number of times it's been used. var/broken = 0 //Is the flash burnt out? var/last_used = 0 //last world.time it was used. + var/flashready = 0 //overcharge flashes + var/overcharge = 0 //overcharge check /obj/item/device/flash/proc/clown_check(var/mob/user) if(user && (CLUMSY in user.mutations) && prob(50)) @@ -51,7 +53,11 @@ switch(times_used) if(0 to 5) last_used = world.time - if(prob(times_used)) //if you use it 5 times in a minute it has a 10% chance to break! + if(overcharge == 1) + icon_state = "cellflashburnt" + broken = 1 + user << "The bulb has burnt out!" + else if(prob(times_used)) //if you use it 5 times in a minute it has a 10% chance to break! broken = 1 user << "The bulb has burnt out!" icon_state = "flashburnt" @@ -65,6 +71,13 @@ if(iscarbon(M)) var/safety = M:eyecheck() + if(overcharge == 1) + M.adjust_fire_stacks(5) + M.IgniteMob() + user.visible_message("[user]'s supercharged flash ignites [M]!") +// broken = 1 +// if(overcharge == 1) +// icon_state = "cellflashburnt" if(safety <= 0) M.Weaken(10) flick("e_flash", M.flash) @@ -90,7 +103,11 @@ flashfail = 1 else if(issilicon(M)) - M.Weaken(rand(5,10)) + M.Weaken(10) //why are robots more resistant to flashes than humans when it is their only weakness. besides ion rifles. used to be rand(5,10). changed to 10. + if(overcharge == 1) + M.adjust_fire_stacks(5) + M.IgniteMob() + user.visible_message("[user]'s supercharged flash ignites [M]!") else flashfail = 1 @@ -106,7 +123,10 @@ del(animation) if(!flashfail) - flick("flash2", src) + if(overcharge == 0) + flick("flash2", src) + else if(overcharge == 1) + flick("cellflash2", src) if(!issilicon(M)) user.visible_message("[user] blinds [M] with the flash!") @@ -134,7 +154,11 @@ //It will never break on the first use. switch(times_used) if(0 to 5) - if(prob(2*times_used)) //if you use it 5 times in a minute it has a 10% chance to break! + if(overcharge == 1) + icon_state = "cellflashburnt" + broken = 1 + user << "The bulb has burnt out!" + else if(prob(2*times_used)) //if you use it 5 times in a minute it has a 10% chance to break! broken = 1 user << "The bulb has burnt out!" icon_state = "flashburnt" @@ -144,7 +168,10 @@ user.show_message("*click* *click*", 2) return playsound(src.loc, 'sound/weapons/flash.ogg', 100, 1) - flick("flash2", src) + if(overcharge == 0) + flick("flash2", src) + else if(overcharge == 1) + flick("cellflash2", src) if(user && isrobot(user)) spawn(0) var/atom/movable/overlay/animation = new(user.loc) @@ -176,7 +203,10 @@ if(0 to 5) if(prob(2*times_used)) broken = 1 - icon_state = "flashburnt" + if(overcharge == 1) + icon_state = "cellflashburnt" + else if(overcharge == 0) + icon_state = "flashburnt" return times_used++ if(istype(loc, /mob/living/carbon)) @@ -202,11 +232,35 @@ if(!broken) broken = 1 user << "\red The bulb has burnt out!" - icon_state = "flashburnt" + if(overcharge == 0) + icon_state = "flashburnt" + else if(overcharge == 1) + icon_state = "cellflashburnt" /obj/item/device/flash/synthetic/attack_self(mob/living/carbon/user as mob, flag = 0, emp = 0) ..() if(!broken) broken = 1 user << "\red The bulb has burnt out!" - icon_state = "flashburnt" + if(overcharge == 0) + icon_state = "flashburnt" + else if(overcharge == 1) + icon_state = "cellflashburnt" + +/obj/item/device/flash/attackby(obj/item/W, mob/user) + if(istype(W,/obj/item/weapon/cell)) + if(flashready == 1 && overcharge == 0) + del(W) + overcharge = 1 + icon_state = "cellflash" + user << "\red You attach the cell to the flash." + name = "cell/flash assembly" + desc = "When blinding and being an asshole just isn't enough." + else if(overcharge == 1) + user << "\red This flash already has a cell attached!" + else if(istype(W, /obj/item/weapon/screwdriver)) + if(overcharge == 0) + user << "\red You ready the flash for modification." + flashready = 1 + else if(flashready == 1) + user << "\red This flash has already been modified!." \ No newline at end of file diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm new file mode 100644 index 00000000..4a0c3687 --- /dev/null +++ b/code/game/objects/items/devices/laserpointer.dm @@ -0,0 +1,208 @@ +/obj/item/device/laser_pointer + name = "laser pointer" + desc = "Don't shine it in your eyes!" + icon = 'icons/obj/device.dmi' + icon_state = "pointer" + item_state = "pen" + var/pointer_icon_state + flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY + slot_flags = SLOT_BELT + m_amt = 500 + g_amt = 500 + w_class = 2 //Increased to 2, because diodes are w_class 2. Conservation of matter. + origin_tech = "combat=1" + origin_tech = "magnets=2" + var/turf/pointer_loc + var/energy = 8 + var/max_energy = 8 + var/effectchance = 33 + var/recharging = 0 + var/recharge_locked = 0 + var/obj/item/weapon/stock_parts/micro_laser/diode //used for upgrading! + + +/obj/item/device/laser_pointer/red + pointer_icon_state = "red_laser" +/obj/item/device/laser_pointer/green + pointer_icon_state = "green_laser" +/obj/item/device/laser_pointer/blue + pointer_icon_state = "blue_laser" +/obj/item/device/laser_pointer/purple + pointer_icon_state = "purple_laser" + +/obj/item/device/laser_pointer/New() + ..() + diode = new(src) + if(!pointer_icon_state) + pointer_icon_state = pick("red_laser","green_laser","blue_laser","purple_laser") + +/obj/item/device/laser_pointer/upgraded/New() + ..() + diode = new /obj/item/weapon/stock_parts/micro_laser/ultra + + + +/obj/item/device/laser_pointer/attack(mob/living/M, mob/user) + laser_act(M, user) + +/obj/item/device/laser_pointer/attackby(obj/item/W, mob/user) + if(istype(W, /obj/item/weapon/stock_parts/micro_laser)) + if(!diode) + user.drop_item() + W.loc = src + diode = W + user << "You install a [diode.name] in [src]." + else + user << "[src] already has a cell." + + else if(istype(W, /obj/item/weapon/screwdriver)) + if(diode) + user << "You remove the [diode.name] from the [src]." + diode.loc = get_turf(src.loc) + diode = null + return + ..() + return + +/obj/item/device/laser_pointer/afterattack(var/atom/target, var/mob/living/user, flag, params) + if(flag) //we're placing the object on a table or in backpack + return + laser_act(target, user) + +/obj/item/device/laser_pointer/proc/laser_act(var/atom/target, var/mob/living/user) + if( !(user in (viewers(7,target))) ) + return + if (!diode) + user << "You point [src] at [target], but nothing happens!" + return + if (!user.IsAdvancedToolUser()) + user << "You don't have the dexterity to do this!" + return + + add_fingerprint(user) + + //nothing happens if the battery is drained + if(recharge_locked) + user << "You point [src] at [target], but it's still charging." + return + + var/outmsg + var/turf/targloc = get_turf(target) + + //human/alien mobs + if(iscarbon(target)) + if(user.zone_sel.selecting == "eyes") + var/mob/living/carbon/C = target + + //20% chance to actually hit the eyes + + if(prob(effectchance * diode.rating)) + msg_admin_attack(user, C, "shone in the eyes", object="laser pointer") + + + //eye target check + outmsg = "You blind [C] by shining [src] in their eyes." + var/eye_prot = C.eyecheck() + if(C.blinded || eye_prot >= 2) + eye_prot = 4 + var/severity = 3 - eye_prot + if(prob(33)) + severity += 1 + else if(prob(50)) + severity -= 1 + severity = min(max(severity, 0), 4) + var/mob/living/carbon/human/H = C + var/datum/organ/internal/eyes/E = H.internal_organs_by_name["eyes"] + + switch(severity) + if(0) + //no effect + C << "A small, bright dot appears in your vision." + if(1) + //industrial grade eye protection + E.damage += rand(0, 2) + C << "Something bright flashes in the corner of your vision!" + if(2) + //basic eye protection (sunglasses) + flick("flash", C.flash) + E.damage += rand(2, 4) + C << "Your eyes were blinded!" + if(3) + //no eye protection + if(prob(10)) + C.Weaken(1) + flick("e_flash", C.flash) + E.damage += rand(3, 5) + C << "Your eyes were blinded!" + if(4) + //the effect has been worsened by something + if(prob(5)) + C.Weaken(1) + flick("e_flash", C.flash) + E.damage += rand(5, 10) + C << "Your eyes were blinded!" + else + outmsg = "You fail to blind [C] by shining [src] at their eyes." + + //robots and AI + else if(issilicon(target)) + var/mob/living/silicon/S = target + //20% chance to actually hit the sensors + if(prob(effectchance * diode.rating)) + S.Weaken(rand(5,10)) + S << "Your sensors were overloaded by a laser!" + outmsg = "You overload [S] by shining [src] at their sensors." + + S.attack_log += text("\[[time_stamp()]\] Has had a laser pointer shone in their eyes by [user.name] ([user.ckey])") + user.attack_log += text("\[[time_stamp()]\] Shone a laser pointer in the eyes of [S.name] ([S.ckey])") + log_attack("[user.name] ([user.ckey]) Shone a laser pointer in the eyes of [S.name] ([S.ckey])") + else + outmsg = "You fail to overload [S] by shining [src] at their sensors." + + //cameras + else if(istype(target, /obj/machinery/camera)) + var/obj/machinery/camera/C = target + if(prob(effectchance * diode.rating)) + C.emp_act(1) + outmsg = "You hit the lens of [C] with [src], temporarily disabling the camera!" + + msg_admin_attack("\[[time_stamp()]\] [user.name] ([user.ckey]) EMPd a camera with a laser pointer") + user.attack_log += text("\[[time_stamp()]\] [user.name] ([user.ckey]) EMPd a camera with a laser pointer") + else + outmsg = "You missed the lens of [C] with [src]." + + //laser pointer image + icon_state = "pointer_[pointer_icon_state]" + var/list/showto = list() + for(var/mob/M in range(7,targloc)) + if(M.client) + showto.Add(M.client) + var/image/I = image('icons/obj/projectiles.dmi',targloc,pointer_icon_state,10) + I.pixel_x = target.pixel_x + rand(-5,5) + I.pixel_y = target.pixel_y + rand(-5,5) + + if(outmsg) + user << outmsg + else + user << "You point [src] at [target]." + + energy -= 1 + if(energy <= max_energy) + if(!recharging) + recharging = 1 + processing_objects.Add(src) + if(energy <= 0) + user << "You've overused the battery of [src], now it needs time to recharge!" + recharge_locked = 1 + + flick_overlay(I, showto, 10) + icon_state = "pointer" + +/obj/item/device/laser_pointer/process() + if(prob(20 - recharge_locked*5)) + energy += 1 + if(energy >= max_energy) + energy = max_energy + recharging = 0 + recharge_locked = 0 + ..() diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 6bf5fa9b..252a94aa 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -337,7 +337,7 @@ overlays -= image("icon"='icons/mob/OnFire.dmi', "icon_state"="Standing") if(on_fire) overlays += image("icon"='icons/mob/OnFire.dmi', "icon_state"="Standing") - update_icons() +// update_icons() return /mob/living/silicon/robot/fire_act() diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 9f1eba57..cba6b0f6 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -483,6 +483,7 @@ ..(Proj) updatehealth() if(prob(75) && Proj.damage > 0) spark_system.start() + update_fire() return 2 @@ -784,6 +785,7 @@ else if( !(istype(W, /obj/item/device/robotanalyzer) || istype(W, /obj/item/device/healthanalyzer)) ) spark_system.start() + update_fire() return ..() /mob/living/silicon/robot/attack_alien(mob/living/carbon/alien/humanoid/M as mob) @@ -979,6 +981,7 @@ /mob/living/silicon/robot/proc/updateicon() overlays.Cut() + update_fire() if(stat == 0) overlays += "eyes" overlays.Cut() @@ -1013,10 +1016,10 @@ else icon_state = base_icon return - +/* /mob/living/silicon/robot/proc/updatefire() return - +* //Call when target overlay should be added/removed /mob/living/silicon/robot/update_targeted() if(!targeted_by && target_locked) diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index fc89e557..23abaaef 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -122,6 +122,11 @@ var/list/beam_master = list() icon_state = "emitter" damage = 30 +/obj/item/projectile/beam/stunrevolver + name = "stun beam" + icon_state = "stun" + damage = 10 + agony = 45 /obj/item/projectile/beam/lastertag/blue name = "lasertag beam" diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index dbebe839..ae505252 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -777,6 +777,13 @@ datum reagent_state = SOLID color = "#673910" // rgb: 103, 57, 16 + reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//Splashing people with welding fuel to make them easy to ignite! + if(!istype(M, /mob/living)) + return + if(method == TOUCH) + M.adjust_fire_stacks(volume / 10) + return + reaction_turf(var/turf/T, var/volume) src = null if(volume >= 5) @@ -3068,6 +3075,13 @@ datum var/blur_start = 300 //amount absorbed after which mob starts getting blurred vision var/pass_out = 400 //amount absorbed after which mob starts passing out + reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//Splashing people with welding fuel to make them easy to ignite! + if(!istype(M, /mob/living)) + return + if(method == TOUCH) + M.adjust_fire_stacks(volume / 10) + return + on_mob_life(var/mob/living/M as mob) M:nutrition += nutriment_factor holder.remove_reagent(src.id, FOOD_METABOLISM) diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 206d0f85..74a93fc4 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -1377,6 +1377,15 @@ datum/design/nanopaste materials = list("$metal" = 7000, "$glass" = 7000) build_path = "/obj/item/stack/nanopaste" +datum/design/laserpointer + name = "laser pointer" + desc = "Don't shine it in your eyes!" + id = "laser_pointer" + req_tech = list("magnets" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 100, "$glass" = 50) + build_path = "/obj/item/device/laser_pointer" + datum/design/implant_loyal name = "loyalty implant" desc = "Makes you loyal or such." @@ -1497,7 +1506,7 @@ datum/design/nuclear_gun datum/design/stunrevolver name = "Stun Revolver" - desc = "The prize of the Head of Security." + desc = "Occasionally prize of the Head of Security, but usually of asshole scientists." id = "stunrevolver" req_tech = list("combat" = 3, "materials" = 3, "powerstorage" = 2) build_type = PROTOLATHE diff --git a/data/investigate/gravity.html b/data/investigate/gravity.html index c3b98f4e..ef0b20af 100644 --- a/data/investigate/gravity.html +++ b/data/investigate/gravity.html @@ -1,2 +1,2 @@ -14:59 [0x200777c] (92,152,1) || the gravitational generator has regained power.
-14:59 [0x200777c] (92,152,1) || the gravitational generator is now charging.
+21:21 [0x20077ce] (92,152,1) || the gravitational generator has regained power.
+21:21 [0x20077ce] (92,152,1) || the gravitational generator is now charging.
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 437dd056..f9f0aa9f 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi index 14e1f5a1..da413aa5 100644 Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ