From 21a1c0bc830abc2515e9bf19884251d502f0e4d5 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Sat, 6 Dec 2014 02:33:31 -0500 Subject: [PATCH] Stunning Changes --- code/datums/supplypacks.dm | 11 + code/game/gamemodes/gameticker.dm | 5 + code/game/mecha/equipment/weapons/weapons.dm | 2 +- code/game/objects/items/devices/flash.dm | 299 +++++++----------- .../objects/items/weapons/alien_specific.dm | 2 +- code/game/objects/items/weapons/stunbaton.dm | 218 +++++-------- code/game/sound.dm | 4 + code/modules/client/preferences.dm | 8 + code/modules/client/preferences_toggles.dm | 15 + code/modules/mob/living/carbon/carbon.dm | 2 - code/modules/mob/living/carbon/human/emote.dm | 72 ++--- code/modules/mob/living/living_defense.dm | 5 +- code/modules/mob/living/say.dm | 12 +- .../mob/living/silicon/robot/robot_modules.dm | 30 +- code/modules/mob/new_player/login.dm | 1 + code/modules/projectiles/guns/energy/pulse.dm | 2 +- .../projectiles/guns/energy/special.dm | 10 + code/modules/projectiles/guns/energy/stun.dm | 16 +- code/modules/projectiles/projectile/energy.dm | 22 +- code/modules/research/designs.dm | 2 +- code/setup.dm | 2 +- icons/obj/gun.dmi | Bin 57540 -> 58019 bytes 22 files changed, 327 insertions(+), 413 deletions(-) diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index e94f02efcf9..a20997140f0 100755 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -667,6 +667,17 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee access = access_security group = "Security" +/datum/supply_packs/disabler + name = "Disabler Crate" + contains = list(/obj/item/weapon/gun/energy/disabler, + /obj/item/weapon/gun/energy/disabler, + /obj/item/weapon/gun/energy/disabler) + cost = 10 + containertype = /obj/structure/closet/crate/secure/weapon + containername = "disabler crate" + access = access_security + group = "Security" + /datum/supply_packs/eweapons name = "Experimental weapons crate" contains = list(/obj/item/weapon/flamethrower/full, diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index 799f7f7da90..627d24d9355 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -16,6 +16,7 @@ var/global/datum/controller/gameticker/ticker var/event_time = null var/event = 0 + var/login_music // music played in pregame lobby var/list/datum/mind/minds = list()//The people in the game. Used for objective tracking. @@ -38,6 +39,10 @@ var/global/datum/controller/gameticker/ticker var/initialtpass = 0 //holder for inital autotransfer vote timer /datum/controller/gameticker/proc/pregame() + login_music = pick(\ + 'sound/music/space.ogg',\ + 'sound/music/Title1.ogg',\ + 'sound/music/Title2.ogg',) do pregame_timeleft = 180 world << "Welcome to the pre-game lobby!" diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index f63b3fd114b..a2a5e5228c2 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -109,7 +109,7 @@ icon_state = "mecha_taser" energy_drain = 20 equip_cooldown = 8 - projectile = /obj/item/projectile/energy/electrode/revolver + projectile = /obj/item/projectile/energy/electrode fire_sound = 'sound/weapons/Taser.ogg' size = 1 diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index ec5506e125b..224de285a1c 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -1,227 +1,148 @@ /obj/item/device/flash name = "flash" - desc = "Used for blinding and being an asshole." + desc = "A powerful and versatile flashbulb device, with applications ranging from disorienting attackers to acting as visual receptors in robot production." icon_state = "flash" item_state = "flashbang" //looks exactly like a flash (and nothing like a flashbang) - throwforce = 5 - w_class = 1.0 - throw_speed = 4 - throw_range = 10 - flags = FPRINT | TABLEPASS| CONDUCT + throwforce = 0 + w_class = 1 + throw_speed = 3 + throw_range = 7 + flags = FPRINT | TABLEPASS | CONDUCT origin_tech = "magnets=2;combat=1" 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. -/obj/item/device/flash/proc/clown_check(var/mob/user) + +/obj/item/device/flash/proc/clown_check(mob/user) if(user && (M_CLUMSY in user.mutations) && prob(50)) - user << "\red \The [src] slips out of your hand." - user.drop_item() + flash_carbon(user, user, 15, 0) + user.visible_message("[user] blinds [user] with the flash!") return 0 return 1 -/obj/item/device/flash/proc/flash_recharge() - //capacitor recharges over time - for(var/i=0, i<3, i++) - if(last_used+600 > world.time) - break - last_used += 600 - times_used -= 2 + +/obj/item/device/flash/proc/burn_out() //Made so you can override it if you want to have an invincible flash from R&D or something. + broken = 1 + icon_state = "[initial(icon_state)]burnt" + visible_message("The [src.name] burns out!") + + +/obj/item/device/flash/proc/flash_recharge(var/mob/user) + if(prob(times_used * 2)) //if you use it 5 times in a minute it has a 10% chance to break! + burn_out() + return 0 + + var/deciseconds_passed = world.time - last_used + for(var/seconds = deciseconds_passed/10, seconds>=10, seconds-=10) //get 1 charge every 10 seconds + times_used-- + last_used = world.time - times_used = max(0,round(times_used)) //sanity + times_used = max(0, times_used) //sanity -/obj/item/device/flash/attack(mob/living/M as mob, mob/user as mob) - if(!user || !M) return //sanity +/obj/item/device/flash/proc/try_use_flash(var/mob/user) + flash_recharge(user) - 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(M.ckey) - msg_admin_attack("[user.name] ([user.ckey]) Used the [src.name] to flash [M.name] ([M.ckey]) (JMP)") - - if(!iscarbon(user)) - M.LAssailant = null - else - M.LAssailant = user - - if(!clown_check(user)) return if(broken) - user << "\The [src] is broken." - return + return 0 - flash_recharge() - - //spamming the flash before it's fully charged (60seconds) increases the chance of it breaking - //It will never break on the first use. - 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! - broken = 1 - user << "The bulb has burnt out!" - icon_state = "flashburnt" - return - times_used++ - else //can only use it 5 times a minute - user << "*click* *click*" - return playsound(src.loc, 'sound/weapons/flash.ogg', 100, 1) - var/flashfail = 0 + flick("[initial(icon_state)]2", src) + times_used++ + + if(user && !clown_check(user)) + return 0 + + return 1 + + +/obj/item/device/flash/proc/flash_carbon(var/mob/living/carbon/M, var/mob/user = null, var/power = 5, convert = 1) + add_logs(M, user, "flashed", object="the flash") + var/safety = M:eyecheck() + if(safety <= 0) + M.confused += power + flick("e_flash", M.flash) + if(user && convert) + terrible_conversion_proc(M, user) + M.Stun(1) + +/obj/item/device/flash/attack(mob/living/M, mob/user) + if(!try_use_flash(user)) + return 0 if(iscarbon(M)) - var/safety = M:eyecheck() - if(safety <= 0) - M.Weaken(5) - flick("e_flash", M.flash) - - if(ishuman(M) && ishuman(user) && M.stat!=DEAD) - if(user.mind && user.mind in ticker.mode.head_revolutionaries) - var/revsafe = 0 - for(var/obj/item/weapon/implant/loyalty/L in M) - if(L && L.implanted) - revsafe = 1 - break - M.mind_initialize() //give them a mind datum if they don't have one. - if(M.mind.has_been_rev) - revsafe = 2 - if(!revsafe) - M.mind.has_been_rev = 1 - ticker.mode.add_revolutionary(M.mind) - else if(revsafe == 1) - user << "Something seems to be blocking the flash!" - else - user << "This mind seems resistant to the flash!" - user << "This mind is so vacant that it is not susceptible to influence!" - else - flashfail = 1 + flash_carbon(M, user, 5, 1) + user.visible_message("[user] blinds [M] with the flash!") + return 1 else if(issilicon(M)) M.Weaken(rand(5,10)) - else - flashfail = 1 + add_logs(M, user, "flashed", object="[src.name]") + user.visible_message("[user] overloads [M]'s sensors with the flash!") + return 1 - if(isrobot(user)) - spawn(0) - var/atom/movable/overlay/animation = new(user.loc) - animation.layer = user.layer + 1 - animation.icon_state = "blank" - animation.icon = 'icons/mob/mob.dmi' - animation.master = user - flick("blspell", animation) - sleep(5) - del(animation) - - if(!flashfail) - flick("flash2", src) - if(!issilicon(M)) - - user.visible_message("[user] blinds [M] with the flash!") - else - - user.visible_message("[user] overloads [M]'s sensors with the flash!") - else - - user.visible_message("[user] fails to blind [M] with the flash!") - - return + user.visible_message("[user] fails to blind [M] with the flash!") - - -/obj/item/device/flash/attack_self(mob/living/carbon/user as mob, flag = 0, emp = 0) - if(!user || !clown_check(user)) return - if(broken) - user.show_message("The [src.name] is broken", 2) - return - - flash_recharge() - - //spamming the flash before it's fully charged (60seconds) increases the chance of it breaking - //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! - broken = 1 - user << "The bulb has burnt out!" - icon_state = "flashburnt" - return - times_used++ - else //can only use it 5 times a minute - user.show_message("*click* *click*", 2) - return - playsound(src.loc, 'sound/weapons/flash.ogg', 100, 1) - flick("flash2", src) - if(user && isrobot(user)) - spawn(0) - var/atom/movable/overlay/animation = new(user.loc) - animation.layer = user.layer + 1 - animation.icon_state = "blank" - animation.icon = 'icons/mob/mob.dmi' - animation.master = user - flick("blspell", animation) - sleep(5) - del(animation) - +/obj/item/device/flash/attack_self(mob/living/carbon/user, flag = 0, emp = 0) + if(!try_use_flash(user)) + return 0 for(var/mob/living/carbon/M in oviewers(3, null)) - 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.alpha < 255) - var/oldalpha = M.alpha - if(prob(80)) - M.alpha = 255 - M.visible_message("[M] suddenly becomes fully visible!",\ - "You see a bright flash of light and are suddenly fully visible again.") - spawn(50) - M.alpha = oldalpha - var/safety = M:eyecheck() - if(!safety) - if(!M.blinded) - flick("flash", M.flash) + flash_carbon(M, user, 3, 0) - return /obj/item/device/flash/emp_act(severity) - if(broken) return - flash_recharge() - switch(times_used) - if(0 to 5) - if(prob(2*times_used)) - broken = 1 - icon_state = "flashburnt" - return - times_used++ - if(istype(loc, /mob/living/carbon)) - var/mob/living/carbon/M = loc - var/safety = M.eyecheck() - if(safety <= 0) - M.Weaken(5) - flick("e_flash", M.flash) - for(var/mob/O in viewers(M, null)) - O.show_message("[M] is blinded by the flash!") + if(!try_use_flash()) + return 0 + for(var/mob/living/carbon/M in viewers(3, null)) + flash_carbon(M, null, 10, 0) + burn_out() ..() -/obj/item/device/flash/synthetic - name = "synthetic flash" - desc = "When a problem arises, SCIENCE is the solution." - icon_state = "sflash" - origin_tech = "magnets=2;combat=1" - var/construction_cost = list("metal"=750,"glass"=750) - var/construction_time=100 -/obj/item/device/flash/synthetic/attack(mob/living/M as mob, mob/user as mob) - ..() - if(!broken) - broken = 1 - user << "\red The bulb has burnt out!" - icon_state = "flashburnt" +/obj/item/device/flash/proc/terrible_conversion_proc(var/mob/M, var/mob/user) + if(ishuman(M) && ishuman(user) && M.stat != DEAD) + if(user.mind && ((user.mind in ticker.mode.head_revolutionaries))) + if(M.client) + if(M.stat == CONSCIOUS) + M.mind_initialize() //give them a mind datum if they don't have one. + var/resisted + if(!isloyal(M)) + if(user.mind in ticker.mode.head_revolutionaries) + if(!ticker.mode.add_revolutionary(M.mind)) + resisted = 1 + else + resisted = 1 -/obj/item/device/flash/synthetic/attack_self(mob/living/carbon/user as mob, flag = 0, emp = 0) + if(resisted) + user << "This mind seems resistant to the flash!" + else + user << "They must be conscious before you can convert them!" + else + user << "This mind is so vacant that it is not susceptible to influence!" + + +/obj/item/device/flash/cyborg + origin_tech = null + +/obj/item/device/flash/cyborg/attack(mob/living/M, mob/user) ..() - if(!broken) - broken = 1 - user << "\red The bulb has burnt out!" - icon_state = "flashburnt" + cyborg_flash_animation(user) + +/obj/item/device/flash/cyborg/attack_self(mob/user) + ..() + cyborg_flash_animation(user) + +/obj/item/device/flash/cyborg/proc/cyborg_flash_animation(var/mob/living/user) + var/atom/movable/overlay/animation = new(user.loc) + animation.layer = user.layer + 1 + animation.icon_state = "blank" + animation.icon = 'icons/mob/mob.dmi' + animation.master = user + flick("blspell", animation) + sleep(5) + del(animation) + +/obj/item/device/flash/synthetic //just a regular flash now \ No newline at end of file diff --git a/code/game/objects/items/weapons/alien_specific.dm b/code/game/objects/items/weapons/alien_specific.dm index 7026cf6f74a..ba914f4f8ce 100644 --- a/code/game/objects/items/weapons/alien_specific.dm +++ b/code/game/objects/items/weapons/alien_specific.dm @@ -56,7 +56,7 @@ //SKREEEEEEEEEEEE tool -/obj/item/device/flash/alien +/obj/item/device/flash/cyborg/alien name = "eye flash" desc = "Useful for taking pictures, making friends and flash-frying chips." icon = 'icons/mob/alien.dmi' diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index fb273ff1ed2..d7e501ea6e1 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -3,29 +3,24 @@ desc = "A stun baton for incapacitating people with." icon_state = "stunbaton" item_state = "baton" - flags = FPRINT | TABLEPASS slot_flags = SLOT_BELT + flags = FPRINT | TABLEPASS force = 10 throwforce = 7 w_class = 3 origin_tech = "combat=2" attack_verb = list("beaten") - var/stunforce = 0 - var/agonyforce = 60 - var/status = 0 //whether the thing is on or not + var/stunforce = 7 + var/status = 0 var/obj/item/weapon/cell/high/bcell = null - var/mob/foundmob = "" //Used in throwing proc. - var/hitcost = 1500 //oh god why do power cells carry so much charge? We probably need to make a distinction between "industrial" sized power cells for APCs and power cells for everything else. - var/allowharm = 1 // Allow or disallow harming with the stunbaton + var/hitcost = 1500 /obj/item/weapon/melee/baton/suicide_act(mob/user) user.visible_message("[user] is putting the live [name] in \his mouth! It looks like \he's trying to commit suicide.") return (FIRELOSS) - -/obj/item/weapon/melee/baton/loaded/New() //this one starts with a cell pre-installed. +/obj/item/weapon/melee/baton/New() ..() - bcell = new/obj/item/weapon/cell/high(src) update_icon() return @@ -33,25 +28,22 @@ bcell = locate(/obj/item/weapon/cell) in contents update_icon() +/obj/item/weapon/melee/baton/loaded/New() //this one starts with a cell pre-installed. + ..() + bcell = new(src) + update_icon() + return + /obj/item/weapon/melee/baton/proc/deductcharge(var/chrgdeductamt) if(bcell) - if(bcell.rigged) - bcell.explode()//exploding baton of justice + if(bcell.charge < (hitcost+chrgdeductamt)) // If after the deduction the baton doesn't have enough charge for a stun hit it turns off. + status = 0 update_icon() - return + playsound(loc, "sparks", 75, 1, -1) + if(bcell.use(chrgdeductamt)) + return 1 else - bcell.charge -= max(chrgdeductamt,0) - if(bcell.charge < hitcost) - status = 0 - update_icon() - -/obj/item/weapon/melee/baton/examine() - set src in view(1) - ..() - if(bcell) - usr <<"The baton is [round(bcell.percent())]% charged." - if(!bcell) - usr <<"The baton does not have a power source installed." + return 0 /obj/item/weapon/melee/baton/update_icon() if(status) @@ -61,16 +53,27 @@ else icon_state = "[initial(icon_state)]" +/obj/item/weapon/melee/baton/examine(mob/user) + ..() + if(bcell) + user <<"The baton is [round(bcell.percent())]% charged." + if(!bcell) + user <<"The baton does not have a power source installed." + /obj/item/weapon/melee/baton/attackby(obj/item/weapon/W, mob/user) if(istype(W, /obj/item/weapon/cell)) - if(!bcell) + var/obj/item/weapon/cell/C = W + if(bcell) + user << "[src] already has a cell." + else + if(C.maxcharge < hitcost) + user << "[src] requires a higher capacity cell." + return user.drop_item() W.loc = src bcell = W user << "You install a cell in [src]." update_icon() - else - user << "[src] already has a cell." else if(istype(W, /obj/item/weapon/screwdriver)) if(bcell) @@ -85,143 +88,88 @@ return /obj/item/weapon/melee/baton/attack_self(mob/user) - if(status && (M_CLUMSY in user.mutations) && prob(50)) - user << "\red You grab the [src] on the wrong side." - user.Weaken(stunforce*3) - deductcharge(hitcost) - return - if(bcell && bcell.charge) - if(bcell.charge < hitcost) - status = 0 - user << "[src] is out of charge." - else - status = !status - user << "[src] is now [status ? "on" : "off"]." - playsound(loc, "sparks", 75, 1, -1) - update_icon() + if(bcell && bcell.charge > hitcost) + status = !status + user << "[src] is now [status ? "on" : "off"]." + playsound(loc, "sparks", 75, 1, -1) else status = 0 if(!bcell) user << "[src] does not have a power source!" else user << "[src] is out of charge." + update_icon() add_fingerprint(user) -/obj/item/weapon/melee/baton/attack(mob/M, mob/user) +/obj/item/weapon/melee/baton/attack(mob/M, mob/living/user) if(status && (M_CLUMSY in user.mutations) && prob(50)) - user << "span class='danger'>You accidentally hit yourself with the [src]!" - user.Weaken(30) + user.visible_message("[user] accidentally hits themself with [src]!", \ + "You accidentally hit yourself with [src]!") + user.Weaken(stunforce*3) deductcharge(hitcost) return if(isrobot(M)) ..() return + if(!isliving(M)) + return - var/agony = agonyforce - var/stun = stunforce var/mob/living/L = M - var/target_zone = check_zone(user.zone_sel.selecting) - if(user.a_intent == "harm" && allowharm == 1) - if (!..()) //item/attack() does it's own messaging and logs - return 0 // item/attack() will return 1 if they hit, 0 if they missed. - agony *= 0.5 //whacking someone causes a much poorer contact than prodding them. - stun *= 0.5 - //we can't really extract the actual hit zone from ..(), unfortunately. Just act like they attacked the area they intended to. - else - //copied from human_defense.dm - human defence code should really be refactored some time. - if (ishuman(L)) - user.lastattacked = L //are these used at all, if we have logs? - L.lastattacker = user - - if (user != L) // Attacking yourself can't miss - target_zone = get_zone_with_miss_chance(user.zone_sel.selecting, L) - - if(!target_zone) - L.visible_message("\red [user] misses [L] with \the [src]!") - return 0 - - var/mob/living/carbon/human/H = L - var/datum/organ/external/affecting = H.get_organ(target_zone) - if (affecting) - if(!status) - L.visible_message("[L] has been prodded in the [affecting.display_name] with [src] by [user]. Luckily it was off.") - return 1 - else - H.visible_message("[L] has been prodded in the [affecting.display_name] with [src] by [user]!") + if(user.a_intent != "harm") + if(status) + baton_stun(L, user) else - if(!status) - L.visible_message("[L] has been prodded with [src] by [user]. Luckily it was off.") - return 1 - else - L.visible_message("[L] has been prodded with [src] by [user]!") + L.visible_message("[L] has been prodded with [src] by [user]. Luckily it was off.", \ + "You've been prodded with [src] by [user]. Luckily it was off") + return + else + ..() + if(status) + baton_stun(L, user) - //stun effects - L.stun_effect_act(stun, agony, target_zone, src) +/obj/item/weapon/melee/baton/proc/baton_stun(mob/living/L, mob/user) + user.lastattacked = L + L.lastattacker = user + + L.Stun(stunforce) + L.Weaken(stunforce) + L.apply_effect(STUTTER, stunforce) + + L.visible_message("[L] has been stunned with [src] by [user]!", \ + "You've been stunned with [src] by [user]!") playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) - msg_admin_attack("[key_name(user)] stunned [key_name(L)] with the [src].") - deductcharge(hitcost) + if(isrobot(loc)) + var/mob/living/silicon/robot/R = loc + if(R && R.cell) + R.cell.use(hitcost) + else + deductcharge(hitcost) if(ishuman(L)) var/mob/living/carbon/human/H = L H.forcesay(hit_appends) - return 1 - - -/obj/item/weapon/melee/baton/throw_impact(atom/hit_atom) - . = ..() - if (prob(50)) - if(istype(hit_atom, /mob/living)) - var/mob/living/carbon/human/H = hit_atom - if(status) - //stun effects - if (stunforce) - H.Stun(stunforce) - H.Weaken(stunforce) - H.apply_effect(STUTTER, stunforce) - - if (agonyforce) - //Siemens coefficient? - //TODO: Merge this with taser effects - H.apply_effect(agonyforce,AGONY,0) - H.apply_effect(STUTTER, agonyforce/10) - H.apply_effect(EYE_BLUR, agonyforce/10) - H.flash_pain() - - deductcharge(hitcost) - - if(bcell.charge < hitcost) - status = 0 - update_icon() - - - for(var/mob/M in player_list) if(M.key == src.fingerprintslast) - foundmob = M - break - - H.visible_message("[src], thrown by [foundmob.name], strikes [H] and stuns them!") - - H.attack_log += "\[[time_stamp()]\] Stunned by thrown [src.name] last touched by ([src.fingerprintslast])" - log_attack("Flying [src.name], last touched by ([src.fingerprintslast]) stunned [H.name] ([H.ckey])" ) - - if(!iscarbon(foundmob)) - H.LAssailant = null - else - H.LAssailant = foundmob + add_logs(L, user, "stunned", object="stunbaton") /obj/item/weapon/melee/baton/emp_act(severity) if(bcell) - bcell.emp_act(severity) //let's not duplicate code everywhere if we don't have to please. + deductcharge(1000 / severity) + if(bcell.reliability != 100 && prob(50/severity)) + bcell.reliability -= 10 / severity ..() //secborg stun baton module /obj/item/weapon/melee/baton/robot hitcost = 500 +/obj/item/weapon/melee/baton/robot/New() + ..() + return + /obj/item/weapon/melee/baton/robot/attack_self(mob/user) //try to find our power cell var/mob/living/silicon/robot/R = loc @@ -246,16 +194,6 @@ item_state = "prod" force = 3 throwforce = 5 - stunforce = 0 - agonyforce = 42 //less than a stunbaton and uses way more charge. + stunforce = 5 hitcost = 3750 - attack_verb = list("poked") - slot_flags = null - -/obj/item/weapon/melee/baton/cattleprod/update_icon() - if(status) - icon_state = "stunprod_active" - else if(!bcell) - icon_state = "stunprod_nocell" - else - icon_state = "stunprod" + slot_flags = null \ No newline at end of file diff --git a/code/game/sound.dm b/code/game/sound.dm index 925dbb0fad2..8f76396ed4c 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -93,6 +93,10 @@ var/const/FALLOFF_SOUNDS = 0.5 S.environment = 2 src << S +/client/proc/playtitlemusic() + if(!ticker || !ticker.login_music) return + if(prefs.sound & SOUND_LOBBY) + src << sound(ticker.login_music, repeat = 0, wait = 0, volume = 85, channel = 1) // MAD JAMS /proc/get_rand_frequency() return rand(32000, 55000) //Frequency stuff only works with 45kbps oggs. diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index acd0a4585a4..e832922a0ef 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -310,6 +310,7 @@ datum/preferences dat += "-Color: [UI_style_color]
__

" dat += "-Alpha(transparence): [UI_style_alpha]
" dat += "Play admin midis: [(sound & SOUND_MIDI) ? "Yes" : "No"]
" + dat += "Play lobby music: [(sound & SOUND_LOBBY) ? "Yes" : "No"]
" dat += "Randomized Character Slot: [randomslot ? "Yes" : "No"]
" dat += "Ghost ears: [(toggles & CHAT_GHOSTEARS) ? "Nearest Creatures" : "All Speech"]
" dat += "Ghost sight: [(toggles & CHAT_GHOSTSIGHT) ? "Nearest Creatures" : "All Emotes"]
" @@ -1291,6 +1292,13 @@ datum/preferences if("hear_midis") sound ^= SOUND_MIDI + if("lobby_music") + sound ^= SOUND_LOBBY + if(sound & SOUND_LOBBY) + user << sound(ticker.login_music, repeat = 0, wait = 0, volume = 85, channel = 1) + else + user << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) + if("ghost_ears") toggles ^= CHAT_GHOSTEARS diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm index a9b9d9aad9c..196674eefde 100644 --- a/code/modules/client/preferences_toggles.dm +++ b/code/modules/client/preferences_toggles.dm @@ -59,6 +59,21 @@ src << "You will [(prefs.toggles & CHAT_PRAYER) ? "now" : "no longer"] see prayerchat." feedback_add_details("admin_verb","TP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/client/verb/toggletitlemusic() + set name = "Hear/Silence LobbyMusic" + set category = "Preferences" + set desc = "Toggles hearing the GameLobby music" + prefs.sound ^= SOUND_LOBBY + prefs.save_preferences(src) + if(prefs.sound & SOUND_LOBBY) + src << "You will now hear music in the game lobby." + if(istype(mob, /mob/new_player)) + playtitlemusic() + else + src << "You will no longer hear music in the game lobby." + if(istype(mob, /mob/new_player)) + src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) // stop the jamsz + feedback_add_details("admin_verb","TLobby") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/togglemidis() set name = "Hear/Silence Midis" diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 882d972ddd7..7d307c92aac 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -219,8 +219,6 @@ "\blue [M] gives [src] a [pick("hug","warm embrace")].", \ "\blue You hug [src].", \ ) - if(prob(10)) - src.emote("fart") /mob/living/carbon/proc/eyecheck() diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index a59a0c8d636..28afe49ab45 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -635,8 +635,11 @@ // Needed for M_TOXIC_FART if("fart") if(world.time-lastFart >= 600) - playsound(src.loc, 'sound/effects/fart.ogg', 50, 1, -3) //Admins voted no to fun - message = "[src] [pick("passes wind","farts")]." +// playsound(src.loc, 'sound/effects/fart.ogg', 50, 1, -3) //Admins still vote no to fun + if(M_TOXIC_FARTS in mutations) + message = "[src] unleashes a [pick("horrible","terrible","foul","disgusting","awful")] fart." + else + message = "[src] [pick("passes wind","farts")]." m_type = 2 var/turf/location = get_turf(src) @@ -644,38 +647,31 @@ if(M_SUPER_FART in mutations) aoe_range+=3 //Was 5 - // If we're wearing a suit, don't blast or gas those around us. + /* // If we're wearing a suit, don't blast or gas those around us. var/wearing_suit=0 var/wearing_mask=0 if(wear_suit && wear_suit.body_parts_covered & LOWER_TORSO) wearing_suit=1 if (internal != null && wear_mask && (wear_mask.flags & MASKINTERNALS)) - wearing_mask=1 + wearing_mask=1 */ // Process toxic farts first. if(M_TOXIC_FARTS in mutations) - if(wearing_suit) - if(!wearing_mask) - src << "\red You gas yourself!" - reagents.add_reagent("space_drugs", rand(10,20)) - else - // Was /turf/, now /mob/ - - for(var/mob/M in range(location,aoe_range)) - if (M.internal != null && M.wear_mask && (M.wear_mask.flags & MASKINTERNALS)) - continue - if(!airborne_can_reach(location,M,aoe_range)) - continue - // Now, we don't have this: - //new /obj/effects/fart_cloud(T,L) - // But: - // <[REDACTED]> so, what it does is...imagine a 3x3 grid with the person in the center. When someone uses the emote *fart (it's not a spell style ability and has no cooldown), then anyone in the 8 tiles AROUND the person who uses it - // <[REDACTED]> gets between 1 and 10 units of jenkem added to them...we obviously don't have Jenkem, but Space Drugs do literally the same exact thing as Jenkem - // <[REDACTED]> the user, of course, isn't impacted because it's not an actual smoke cloud - // So, let's give 'em space drugs. - if (M == src) - continue - M.reagents.add_reagent("space_drugs",rand(1,10)) + for(var/mob/M in range(location,aoe_range)) + if (M.internal != null && M.wear_mask && (M.wear_mask.flags & MASKINTERNALS)) + continue + if(!airborne_can_reach(location,M,aoe_range)) + continue + // Now, we don't have this: + //new /obj/effects/fart_cloud(T,L) + // But: + // <[REDACTED]> so, what it does is...imagine a 3x3 grid with the person in the center. When someone uses the emote *fart (it's not a spell style ability and has no cooldown), then anyone in the 8 tiles AROUND the person who uses it + // <[REDACTED]> gets between 1 and 10 units of jenkem added to them...we obviously don't have Jenkem, but Space Drugs do literally the same exact thing as Jenkem + // <[REDACTED]> the user, of course, isn't impacted because it's not an actual smoke cloud + // So, let's give 'em space drugs. + if (M == src) + continue + M.reagents.add_reagent("space_drugs",rand(1,10)) /* var/datum/effect/effect/system/smoke_spread/chem/fart/S = new /datum/effect/effect/system/smoke_spread/chem/fart S.attach(location) @@ -686,23 +682,21 @@ S.start() */ if(M_SUPER_FART in mutations) - playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3) visible_message("\red [name] hunches down and grits their teeth!") if(do_after(usr,30)) visible_message("\red [name] unleashes a [pick("tremendous","gigantic","colossal")] fart!","You hear a [pick("tremendous","gigantic","colossal")] fart.") //playsound(L.loc, 'superfart.ogg', 50, 0) - if(!wearing_suit) - for(var/mob/living/V in range(location,aoe_range)) - shake_camera(V,10,5) - if (V == src) - continue - if(!airborne_can_reach(get_turf(src), get_turf(V))) - continue - V << "\red You are sent flying!" - V.Weaken(5) // why the hell was this set to 12 christ - step_away(V,location,15) - step_away(V,location,15) - step_away(V,location,15) + for(var/mob/living/V in range(location,aoe_range)) + shake_camera(V,10,5) + if (V == src) + continue + if(!airborne_can_reach(get_turf(src), get_turf(V))) + continue + V << "\red You are sent flying!" + V.Weaken(5) // why the hell was this set to 12 christ + step_away(V,location,15) + step_away(V,location,15) + step_away(V,location,15) else usr << "\red You were interrupted and couldn't fart! Rude!" lastFart=world.time diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 113f00e1fb9..73c5f3b1857 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -64,12 +64,13 @@ src <<"\red You have been hit by [P]!" del P return -*/ + if(istype(P, /obj/item/projectile/energy/electrode) || istype(P, /obj/item/projectile/bullet/stunshot)) stun_effect_act(0, P.agony, def_zone, P) src <<"\red You have been hit by [P]!" del P return +*/ //Armor var/absorb = run_armor_check(def_zone, P.flag) @@ -81,7 +82,7 @@ if(!P.nodamage) apply_damage(P.damage, P.damage_type, def_zone, absorb, 0, P, sharp=proj_sharp, edge=proj_edge) - + P.on_hit(src, absorb, def_zone) if(istype(P, /obj/item/projectile/beam/lightning)) if(P.damage >= 200) diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index ecdfd40b84c..64f5c33dbc6 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -10,11 +10,11 @@ var/list/department_radio_keys = list( ":s" = "Security", "#s" = "Security", ".s" = "Security", ":w" = "whisper", "#w" = "whisper", ".w" = "whisper", ":b" = "binary", "#b" = "binary", ".b" = "binary", - ":d" = "drone", "#d" = "drone", ".d" = "drone", + ":d" = "drone", "#d" = "drone", ".d" = "drone", ":a" = "alientalk", "#a" = "alientalk", ".a" = "alientalk", ":t" = "Syndicate", "#t" = "Syndicate", ".t" = "Syndicate", ":u" = "Supply", "#u" = "Supply", ".u" = "Supply", - ":z" = "Service", "#z" = "Service", ".z" = "Service", + ":z" = "Service", "#z" = "Service", ".z" = "Service", ":g" = "changeling", "#g" = "changeling", ".g" = "changeling", @@ -28,14 +28,14 @@ var/list/department_radio_keys = list( ":E" = "Engineering", "#E" = "Engineering", ".E" = "Engineering", ":S" = "Security", "#S" = "Security", ".S" = "Security", ":W" = "whisper", "#W" = "whisper", ".W" = "whisper", - ":D" = "drone", "#D" = "drone", ".D" = "drone", + ":D" = "drone", "#D" = "drone", ".D" = "drone", ":B" = "binary", "#B" = "binary", ".B" = "binary", ":A" = "alientalk", "#A" = "alientalk", ".A" = "alientalk", ":T" = "Syndicate", "#T" = "Syndicate", ".T" = "Syndicate", ":U" = "Supply", "#U" = "Supply", ".U" = "Supply", ":Z" = "Service", "#Z" = "Service", ".Z" = "Service", ":G" = "changeling", "#G" = "changeling", ".G" = "changeling" - + /* //kinda localization -- rastaf0 //same keys as above, but on russian keyboard layout. This file uses cp1251 as encoding. ":ê" = "right hand", "#ê" = "right hand", ".ê" = "right hand", @@ -185,8 +185,8 @@ var/list/department_radio_keys = list( if (!(istype(src,/mob/living/carbon/human) && !isAI(src) && !isrobot(src) || istype(src,/mob/living/carbon/monkey) || istype(src, /mob/living/simple_animal/parrot) || isrobot(src) && (message_mode=="department") || isAI(src) && (message_mode=="department") || (message_mode in radiochannels))) message_mode = null //only humans can use headsets - if(src.stunned > 2 || (traumatic_shock > 61 && prob(50))) - message_mode = null //Stunned people shouldn't be able to physically turn on their radio/hold down the button to speak into it + if(traumatic_shock > 61 && prob(50)) + message_mode = null //people in shock will have a high chance of not being able to speak on radio; needed since people don't instantly pass out at 100 damage. message = capitalize(message) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 38fd15f0cd3..7f97febc907 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -24,7 +24,7 @@ New() src.modules += new /obj/item/device/flashlight(src) - src.modules += new /obj/item/device/flash(src) + src.modules += new /obj/item/device/flash/cyborg(src) src.emag = new /obj/item/toy/sword(src) src.emag.name = "Placeholder Emag Item" // src.jetpack = new /obj/item/toy/sword(src) @@ -62,7 +62,7 @@ New() src.modules += new /obj/item/device/flashlight(src) - src.modules += new /obj/item/device/flash(src) + src.modules += new /obj/item/device/flash/cyborg(src) src.modules += new /obj/item/weapon/melee/baton/loaded(src) src.modules += new /obj/item/weapon/extinguisher(src) src.modules += new /obj/item/weapon/wrench(src) @@ -80,7 +80,7 @@ New() src.modules += new /obj/item/device/flashlight(src) - src.modules += new /obj/item/device/flash(src) + src.modules += new /obj/item/device/flash/cyborg(src) src.modules += new /obj/item/device/healthanalyzer(src) src.modules += new /obj/item/weapon/reagent_containers/borghypo/surgeon(src) src.modules += new /obj/item/weapon/scalpel(src) @@ -119,7 +119,7 @@ New() src.modules += new /obj/item/device/flashlight(src) - src.modules += new /obj/item/device/flash(src) + src.modules += new /obj/item/device/flash/cyborg(src) src.modules += new /obj/item/device/healthanalyzer(src) src.modules += new /obj/item/device/reagent_scanner/adv(src) src.modules += new /obj/item/roller_holder(src) @@ -164,7 +164,7 @@ New() src.modules += new /obj/item/device/flashlight(src) - src.modules += new /obj/item/device/flash(src) + src.modules += new /obj/item/device/flash/cyborg(src) src.modules += new /obj/item/borg/sight/meson(src) src.modules += new /obj/item/weapon/extinguisher(src) src.modules += new /obj/item/weapon/rcd/borg(src) @@ -187,7 +187,7 @@ New() src.modules += new /obj/item/device/flashlight(src) - src.modules += new /obj/item/device/flash(src) + src.modules += new /obj/item/device/flash/cyborg(src) src.modules += new /obj/item/borg/sight/meson(src) src.modules += new /obj/item/weapon/extinguisher(src) src.modules += new /obj/item/weapon/weldingtool/largetank(src) @@ -228,7 +228,7 @@ New() src.modules += new /obj/item/device/flashlight/seclite(src) - src.modules += new /obj/item/device/flash(src) + src.modules += new /obj/item/device/flash/cyborg(src) src.modules += new /obj/item/weapon/handcuffs/cyborg(src) src.modules += new /obj/item/weapon/melee/baton/robot(src) src.modules += new /obj/item/weapon/gun/energy/taser/cyborg(src) @@ -244,7 +244,7 @@ New() src.modules += new /obj/item/device/flashlight(src) - src.modules += new /obj/item/device/flash(src) + src.modules += new /obj/item/device/flash/cyborg(src) src.modules += new /obj/item/weapon/soap/nanotrasen(src) src.modules += new /obj/item/weapon/storage/bag/trash(src) src.modules += new /obj/item/weapon/mop(src) @@ -264,7 +264,7 @@ New() src.modules += new /obj/item/device/flashlight(src) - src.modules += new /obj/item/device/flash(src) + src.modules += new /obj/item/device/flash/cyborg(src) src.modules += new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src) src.modules += new /obj/item/weapon/reagent_containers/food/condiment/enzyme(src) @@ -291,7 +291,7 @@ New() src.modules += new /obj/item/device/flashlight(src) - src.modules += new /obj/item/device/flash(src) + src.modules += new /obj/item/device/flash/cyborg(src) src.modules += new /obj/item/weapon/pen/robopen(src) src.modules += new /obj/item/weapon/form_printer(src) src.modules += new /obj/item/device/taperecorder(src) @@ -312,7 +312,7 @@ New() src.modules += new /obj/item/device/flashlight(src) - src.modules += new /obj/item/device/flash(src) + src.modules += new /obj/item/device/flash/cyborg(src) src.modules += new /obj/item/borg/sight/meson(src) src.modules += new /obj/item/weapon/wrench(src) src.modules += new /obj/item/weapon/screwdriver(src) @@ -326,7 +326,7 @@ name = "NT advanced combat module" /obj/item/weapon/robot_module/deathsquad/New() - src.modules += new /obj/item/device/flash(src) + src.modules += new /obj/item/device/flash/cyborg(src) src.modules += new /obj/item/device/flashlight(src) src.modules += new /obj/item/borg/sight/thermal(src) src.modules += new /obj/item/weapon/melee/energy/sword/cyborg(src) @@ -340,7 +340,7 @@ name = "syndicate robot module" /obj/item/weapon/robot_module/syndicate/New() - src.modules += new /obj/item/device/flash(src) + src.modules += new /obj/item/device/flash/cyborg(src) src.modules += new /obj/item/device/flashlight(src) src.modules += new /obj/item/weapon/melee/energy/sword/cyborg(src) src.modules += new /obj/item/weapon/gun/energy/crossbow/cyborg(src) @@ -356,7 +356,7 @@ New() src.modules += new /obj/item/device/flashlight(src) - src.modules += new /obj/item/device/flash(src) + src.modules += new /obj/item/device/flash/cyborg(src) src.modules += new /obj/item/borg/sight/thermal(src) src.modules += new /obj/item/weapon/gun/energy/laser/cyborg(src) src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src) @@ -371,7 +371,7 @@ New() src.modules += new /obj/item/weapon/melee/energy/alien/claws(src) - src.modules += new /obj/item/device/flash/alien(src) + src.modules += new /obj/item/device/flash/cyborg/alien(src) src.modules += new /obj/item/borg/sight/thermal/alien(src) var/obj/item/weapon/reagent_containers/spray/alien/stun/S = new /obj/item/weapon/reagent_containers/spray/alien/stun(src) S.reagents.add_reagent("stoxin",250) //nerfed to sleeptoxin to make it less instant drop. diff --git a/code/modules/mob/new_player/login.dm b/code/modules/mob/new_player/login.dm index 6c4230439ea..a32e373fccd 100644 --- a/code/modules/mob/new_player/login.dm +++ b/code/modules/mob/new_player/login.dm @@ -33,3 +33,4 @@ spawn(40) if(client) handle_privacy_poll() + client.playtitlemusic() diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm index a7f59cbecdf..e11a604b45e 100644 --- a/code/modules/projectiles/guns/energy/pulse.dm +++ b/code/modules/projectiles/guns/energy/pulse.dm @@ -19,7 +19,7 @@ charge_cost = 100 fire_sound = 'sound/weapons/Taser.ogg' user << "\red [src.name] is now set to stun." - projectile_type = "/obj/item/projectile/energy/electrode/revolver" + projectile_type = "/obj/item/projectile/energy/electrode" if(0) mode = 1 charge_cost = 100 diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 06ae671bd87..6826924c6e5 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -232,3 +232,13 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. power_supply.give(5000) playsound(src.loc, 'sound/weapons/shotgunpump.ogg', 60, 1) return + + +/obj/item/weapon/gun/energy/disabler + name = "disabler" + desc = "A self-defense weapon that exhausts organic targets, weakening them until they collapse." + icon_state = "disabler" + item_state = null + projectile_type = "/obj/item/projectile/energy/disabler" + cell_type = "/obj/item/weapon/cell" + charge_cost = 500 \ No newline at end of file diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index 487ba361f9d..41e3764fdfe 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -6,7 +6,7 @@ item_state = null //so the human update icon uses the icon_state instead. fire_sound = 'sound/weapons/Taser.ogg' projectile_type = "/obj/item/projectile/energy/electrode" - cell_type = "/obj/item/weapon/cell" + cell_type = "/obj/item/weapon/cell/crap" /obj/item/weapon/gun/energy/taser/cyborg name = "taser gun" @@ -29,7 +29,7 @@ /obj/item/weapon/gun/energy/taser/cyborg/process() //Every [recharge_time] ticks, recharge a shot for the cyborg return 1 - + /obj/item/weapon/gun/energy/taser/cyborg/process_chambered() if(in_chamber) return 1 @@ -46,9 +46,9 @@ name = "stun revolver" desc = "A high-tech revolver that fires stun cartridges. The stun cartridges can be recharged using a conventional energy weapon recharger." icon_state = "stunrevolver" - fire_sound = 'sound/weapons/Taser.ogg' + fire_sound = "sound/weapons/gunshot.ogg" origin_tech = "combat=3;materials=3;powerstorage=2" - projectile_type = "/obj/item/projectile/energy/electrode/revolver" + projectile_type = "/obj/item/projectile/energy/electrode" cell_type = "/obj/item/weapon/cell" @@ -77,10 +77,10 @@ /obj/item/weapon/gun/energy/crossbow/process() charge_tick++ - if(charge_tick < 4) + if(charge_tick < 4) return 0 charge_tick = 0 - if(!power_supply) + if(!power_supply) return 0 power_supply.give(1000) return 1 @@ -92,8 +92,8 @@ desc = "An energy-based crossbow that draws power from the cyborg's internal energy cell directly." /obj/item/weapon/gun/energy/crossbow/cyborg/process() - return 1 - + return 1 + /obj/item/weapon/gun/energy/crossbow/cyborg/process_chambered() if(in_chamber) return 1 diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index 15e8b3af1fa..c5be6dcd6fa 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -10,13 +10,9 @@ name = "electrode" icon_state = "spark" nodamage = 1 - /* - stun = 10 - weaken = 10 - stutter = 10 - */ - agony = 40 - damage_type = HALLOSS + stun = 5 + weaken = 5 + stutter = 5 hitsound = 'sound/weapons/tase.ogg' //Damage will be handled on the MOB side, to prevent window shattering. @@ -74,3 +70,15 @@ damage = 20 damage_type = TOX irradiate = 20 + +/obj/item/projectile/energy/disabler + name = "disabler beam" + icon_state = "omnilaser" + damage = 34 + damage_type = HALLOSS + var/range = 8 + +/obj/item/projectile/energy/disabler/Range() + range-- + if(range <= 0) + del(src) \ No newline at end of file diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 85ad55e083c..d9a69f652bd 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -1602,7 +1602,7 @@ datum/design/mmi_radio category = "Misc" datum/design/synthetic_flash - name = "Synthetic Flash" + name = "Flash" desc = "When a problem arises, SCIENCE is the solution." id = "sflash" req_tech = list("magnets" = 3, "combat" = 2) diff --git a/code/setup.dm b/code/setup.dm index 8073c8c7648..227480126f7 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -698,7 +698,7 @@ var/list/TAGGERLOCATIONS = list("Disposals", #define SOUND_ADMINHELP 1 #define SOUND_MIDI 2 #define SOUND_AMBIENCE 4 -#define SOUND_LOBBY 8 //Removed, can be replaced with any other sound bitflag as needed. +#define SOUND_LOBBY 8 #define SOUND_STREAMING 16 #define SOUND_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|SOUND_STREAMING) diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi index 758e6dc1877fae6ccaa7eea68ebb96b242bb713f..f206f2c013c7a70a85ee3f644d543b8980026a39 100644 GIT binary patch delta 19806 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 Kv}!!-m-aszyTi)> delta 19312 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 z z+pVr|^7ytyd zlU+P;E&tNIaNHy8TY3kp<0=npZzJ;G&xsrvKm(hv#~CGTaWS8y$pi{uSkbr-HFIzz z{wdd|j10t?S6f(v2FKoz+?V(W6Q4V+Z9$nCWkkK|;AQKRLAtHGZ#ZEVar;$XP?=-g zD#pyp8g|L@^)rsnNS^SJeV56|ybDYi@c)YmOOd#9O(#1}&Voev7ETb{!_Uk-mv)-E zlPvp|c)G@!&BJD7aL^B0JpnXBLvrc!ASR%}?i$oq?|3@eF?f7>G1T9m_%Ie!K@}pE z!^SlW_m|&h>dtParKUhPTFe7bJttcUqccI@gVfvqWp)G=Pujivm=Zy?tml22+~Zj^ zccRG#B8rqbOB{XTuq)#udu|N)(p`GK+=@(+?$A&RC05{XhO2nP5ewe)=&lNdIB5Ha z8TvAd>0KPWMd1?$+?l0o10l#$=r7D zShm)ZDX2=FU&(y$kQ4f34C<1xr0G9>N(_V`o$vg2P0dm%_9#<<3>s28O3nK6z6}s> zb2<9wSsHTEu628>DIgG}VJlzx(@7L-BN{? ztC`kg_T|{bEbi;;$Kv8W0dcjGafLb2#cwn<3(F%>L=#+T^$00?HW#A&hpr}bNV{9h zkqqc=7(W&Ob>Vx)$jZk9Gxq*FF}R99LQM1`=6^0mA9Hz$u`sIh&&rE~1HnVj1|i$A zW%c%j3FEGg>C6)eap?0(>pLU>tLXFJd_TKeOdrOuj7Zo?m1lOy6 zS@e0{Jrlc|Zrj_FH~K!OC2*1(!I)(L zM8_SGxEv6auRqg=^t!k0PGw0!$IT#P4b8UD*Grdyfr*KmqUhkC>FFv9%kB}{^U3Gb z5My7RW()x7Sy}gKJs{09ceOnHg21dt>Zq#vMaO<`V|`vr7A(lkn)b@Ggh-w?U^8J^ z^2|g>O&yxh3z0SCPK&L9!pq+ez$M_7HWV;cZ98<+*>u4Y^1Geej*qm70cOylL=XD3 zS7XDe064@<_xpPjcyQ2)XC;>fUw$W2jOGK|Y#n{#=rrtOjDoy;d*}KOeYldwc`@`6 z=M(SbN=X2K*51e}E{f+oNxCr|CyaM9DcMNKolJi?(f zJol93RNVoREJDV`pFe%l?w*H9!t^RcTGcA8MT3?oGS&TVzMLWa(fGy|{_OP)Z+x+! zpkVMNE@@hpxHw?@z34~Na|h)c|EGm34TmG$!exoHHJVsrZ3Gh;TO#&^YbUm3XckwkR$Mew+UjJfIDC!uwao;zZVCA6i5NX9PqJ(k#sj-96NSLW8QsvqA|-*--( zbKdiwbLxB66qR(GPHi5_W*C&zE~`DUne~%*iE`6~K8MMkp!af#S)tdAW`7}-1Fmi)M$%dl9inOm~z|6c$g zfC+2()Y79Dqn^$uIEz$^bEKURWAV;BB@7%Gctk-0VwzRgt8zB37Hw)y;7Vx9 z-Bv+s&dM$vS+_@}PdKx!K*d3^2N{>b<#yW!-5xj8k;2(a;f+3!^R_F-%ArwU=^&x{ z_$HQKO@dOxx%U71)>YDqm;gA^3m=?ilA>!R55K+4=*}Re8-+2>rAug{A(!py=50Bd z*Fh1k@^0oyzB4pA`D9}wB6*6=#_?SUEQ83eFH@fWCO!j~=1?dLuKMG(QHAZ%`^^ZY zlfE&+s7K#alGtd1ASmp4h_dgbfm%w979 zU--vDt~f6*IR>j$I#xGLTSo22#H}jdk53GAY}Nw;0wV6`$RK+kO=P4LfXF3}h!+&& zaWE!yqn1;p$Upnjbt_;$)85U!J;P-GJl?W{faGl{FrE=ZXmbS}bVf;YbH6~QAp3-3 z&9x1HMS~V+Z`~K@?LcLvjjf#s#ggvC1+}Kh2|@vHN=`#9jc+9=9n1*X7G=D#3M0dA zZ)|t{gC*p~G4pGO@ACfCBm8X~tM z-LJx)&0aG4&?1pM5<)0;W+B}a1O^H=yJ|Lm>J_1w@bS&OZoiI>B3?cnZ2jVQIX~dV zAhIS0&iDO&;P)5GHT3YH;j1S0dtsN4z24p2`Xa$;EOrrIUFC-CyEV(sQeX`aPr8zgj!s_rby$IJ`h zKkeyB3H)e0Hh_qcd7&;&n`N)0!bPg!7X@g6!-c3R?Z>vOM{b63l>S2r*(LF_SFLcD zZpR_)eVCafXzC#?jHMM%js1NlPcwizI~vxFZoP|8xbB!@ov*~%%fGw^4d;IN{Pmg`dn^k{K2y>u8SRsKErF*zG!KriNXV}!$_~H zQ1v;Vk^~`BOFw0xBK7FXv)R|wVLSwV+09e+0d!bL0jJhO#fXE7TO296?aijKZoo*xy|m0;O@-y3q$V)$Tyuv{~v1=ojb`e?M20qfW!E~x7Ij+(oJxss6Vu|$xR)I^xQtu1d*P!I$y zbY&+v(#?Z|FOH6l^^T6F4i4gVbaYJVecmgBMekFvN?JZG7>KC{rUi?OK9u%2>s+}q zJ>W(V%TIsFhysi@8@1-3p9N=0F;Hc9!5^L4~z z`sMQz*^VWBOB*v6?(R|z#|JAUs{aYU{Wn)WiaW2YTn3OB zu!dUhSIN&b`~rQgn)^r9lHPy>0K+e#@e9qW0_wCk>EUPu5j5u;<_a{gR6W_yA#)AepYPIa*M6&Q-Iwy>op( zX9Ot>VOZPk6wTT3ntOo!-$#es$(DfRPpt5W#5FN|^PhM6L(8{Uo`8zSB54_|wDcrh z^W?vjnQ7!<-^nisl)|UKO2HVsp*S1s?(W2PwPW=A>F|^*b