/*var/const/PHASER_EMP = 1 var/const/PHASER_FLASH = 2 var/const/PHASER_TOXINS = 4 var/const/PHASER_BURN = 8 var/const/PHASER_SING = 16 var/const/PHASER_CONC = 512 var/const/PHASER_ENERGY = 32 var/const/PHASER_RADIUS = 64 var/const/PHASER_HOMING = 128 var/const/PHASER_SNIPER = 256 /obj/phaser_projectile name = "Energy" desc = "Looks dangerous." density = 0 opacity = 0 anchored = 1 icon = 'icons/obj/projectiles.dmi' var/mob/origin = null var/list/impactsounds = new/list() var/power = 0 var/damage = 0 var/range = 0 var/stun = 0 var/upgrades = 0 var/turf/dest = null flags = TABLEPASS /obj/mod_spawner icon = 'icons/misc/mark.dmi' icon_state = "rup" New() var/A = pick(typesof(/obj/item/gun_ext)-/obj/item/gun_ext) new A (src.loc) qdel(src) /obj/item/gun_ext var/overlay_name = "" var/upgrade = null var/location = null name = "Phaser extension" desc = "For use with phasers" item_state = "table_parts" inhand_image_icon = 'icons/mob/inhand/hand_tools.dmi' icon = 'icons/obj/gun.dmi' var/proj_mod = null var/proj_sound = null var/proj_sound_impact = null mats = 8 /obj/item/gun_ext/sniper name = "Phaser extension (sniper)" desc = "Massively increases energy usage and damage. Also disables the radius setting." overlay_name = "ext_sniper" upgrade = PHASER_SNIPER location = "ext" icon_state = "add_sniper" proj_sound = 'sound/weapons/snipershot.ogg' /obj/item/gun_ext/battery name = "Phaser extension (battery)" desc = "Increases battery maximum but slightly reduces damage." overlay_name = "ext_battery" upgrade = PHASER_ENERGY location = "ext" icon_state = "add_battery" /obj/item/gun_ext/homing name = "Phaser extension (homing)" desc = "Decreases battery maximum and increases energy usage but gives shots a slight homing ability." overlay_name = "ext_focus" upgrade = PHASER_HOMING location = "ext" icon_state = "add_homing" /obj/item/gun_ext/thermal name = "Phaser energy-converter mod (thermal)" desc = "Decreases energy usage but causes burn damage instead of brute damage." overlay_name = "conv_thermal" upgrade = PHASER_BURN location = "conv" icon_state = "add_thermal" proj_mod = "proj_thermal" /obj/item/gun_ext/sing name = "Phaser energy-converter mod (micro-singularity)" desc = "Increases energy usage and decreases damage but pulls nearby targets in." overlay_name = "conv_sing" upgrade = PHASER_SING location = "conv" icon_state = "add_sing" proj_mod = "proj_sing" proj_sound_impact = 'sound/effects/singsuck.ogg' /obj/item/gun_ext/toxin name = "Phaser energy-converter mod (toxin)" desc = "Increases energy usage but causes toxin damage instead of brute damage and adds additional damage over time." overlay_name = "conv_tox" upgrade = PHASER_TOXINS location = "conv" icon_state = "add_tox" proj_mod = "proj_tox" /obj/item/gun_ext/flash name = "Phaser energy-converter mod (flash)" desc = "Greatly reduces damage and stun time but causes each hit to blind the target temporarily." overlay_name = "conv_flash" upgrade = PHASER_FLASH location = "conv" icon_state = "add_flash" proj_mod = "proj_flash" /obj/item/gun_ext/emp name = "Phaser energy-converter mod (EMP)" desc = "Increases damage against synthetic lifeforms but slightly increases energy usage." overlay_name = "conv_emp" upgrade = PHASER_EMP location = "conv" icon_state = "add_emp" proj_mod = "proj_emp" /obj/item/gun_ext/conc name = "Phaser energy-converter mod (concussion)" desc = "Disables stuns and reduces damage but knocks target back on hit." overlay_name = "conv_conc" upgrade = PHASER_CONC location = "conv" icon_state = "add_conc" proj_mod = "proj_conc" /obj/item/oldgun name = "gun" icon = 'icons/obj/gun.dmi' inhand_image_icon = 'icons/mob/inhand/hand_weapons.dmi' flags = FPRINT | TABLEPASS | CONDUCT | ONBELT | EXTRADELAY item_state = "gun" m_amt = 2000 throwforce = 5 w_class = 2.0 throw_speed = 4 throw_range = 10 /obj/item/oldgun/energy name = "energy" var/charges = 10.0 var/maximum_charges = 10.0 var/unscrewed = 0 mats = 15 /obj/item/oldgun/energy/phaser/secure safeties = 1 name = "locked phaser" /obj/item/oldgun/energy/phaser name = "phaser" icon_state = "phaser" desc = "Set phasers to 'Robust'" w_class = 3.0 item_state = "gun" force = 10.0 throw_speed = 2 throw_range = 10 var/obj/item/gun_ext/extension_mod = null var/obj/item/gun_ext/converter_mod = null var/list/shot_overlays = new/list() var/list/shot_firesounds = new/list() var/list/shot_impactsounds = new/list() var/upgrades = 0 charges = 125 maximum_charges = 125 var/charges_per_shot = 0 var/safeties = 0 var/prop_dmg = 0 var/prop_stun = 0 var/prop_range = 0 var/prop_maxrange = 1 var/prop_power = 10 var/prop_iconstate = "" var/prop_sound = 'sound/weapons/Taser.ogg' var/overloading = 0 verb/remove_mods() set src in usr set name = "Remove Mods" if(!src.contents.len) boutput(usr, "No mods to remove.") return boutput(usr, "You remove all mods.") for(var/obj/O in src) O.set_loc(get_turf(src)) var/obj/item/oldgun/energy/phaser/P = new/obj/item/oldgun/energy/phaser(get_turf(src)) var/energy_old = min(125,src.charges) P.safeties = src.safeties P.charges = energy_old P.update_icon() qdel(src) examine() set src in view() if(src.contents.len) boutput(usr, "Installed mods:") boutput(usr, "") for(var/obj/O in src) boutput(usr, "[O.name]") boutput(usr, "[O.desc]") boutput(usr, "") ..() New() update_settings() ..() proc/generate_overlays() src.overlays = null if(extension_mod) src.overlays += icon('icons/obj/gun.dmi',extension_mod.overlay_name) if(converter_mod) src.overlays += icon('icons/obj/gun.dmi',converter_mod.overlay_name) attackby(obj/O as obj, mob/user as mob) if (istype(O,/obj/item/gun_ext)) var/obj/item/gun_ext/G = O switch(G.location) if("ext") if(extension_mod) boutput(user, "There is already a gun extension installed.") else user.drop_item() boutput(user, "You install the gun extension.") playsound(user, "sound/items/Screwdriver2.ogg", 65, 1) G.set_loc(src) extension_mod = G generate_overlays() upgrades |= G.upgrade if(G.proj_mod) shot_overlays += G.proj_mod if(G.proj_sound) shot_firesounds += G.proj_sound if(G.proj_sound_impact) shot_impactsounds += G.proj_sound_impact update_settings() if("conv") if(converter_mod) boutput(user, "There is already an energy-converter mod installed.") else user.drop_item() boutput(user, "You install the energy-converter mod.") playsound(user, "sound/items/Screwdriver2.ogg", 65, 1) G.set_loc(src) converter_mod = G generate_overlays() upgrades |= G.upgrade if(G.proj_mod) shot_overlays += G.proj_mod if(G.proj_sound) shot_firesounds += G.proj_sound if(G.proj_sound_impact) shot_impactsounds += G.proj_sound_impact update_settings() proc/update_settings() var/dmg_mod = 0 var/stun_mod = 0 var/cost_mod = 0 if(overloading) return if(upgrades & PHASER_ENERGY) maximum_charges = 175 else if((upgrades & PHASER_RADIUS) || (upgrades & PHASER_HOMING)) maximum_charges = 100 charges = min(100,charges) else maximum_charges = 125 if(upgrades & PHASER_RADIUS) prop_maxrange = 2 else prop_maxrange = 1 switch(prop_power) if(1 to 33) prop_iconstate = "phaser_light" dmg_mod = -round(prop_power/6) stun_mod = min(round(prop_power/4),4) prop_sound = 'sound/weapons/laserlight.ogg' if(34 to 66) prop_iconstate = "phaser_med" dmg_mod = 1 stun_mod = -round(prop_power/6) prop_sound = 'sound/weapons/lasermed.ogg' if(67 to 100) prop_iconstate = "phaser_heavy" dmg_mod = max(0,round(prop_power / 10)-2) stun_mod = -prop_power prop_sound = 'sound/weapons/laserheavy.ogg' if(101 to 150) prop_iconstate = "phaser_ultra" dmg_mod = max(0,round(prop_power / 10)-2) + 10 stun_mod = -20 cost_mod = max(0,round(prop_power / 10)-2) prop_sound = 'sound/weapons/laserultra.ogg' if(upgrades & PHASER_SNIPER) prop_range = 0 prop_dmg = max(0, round(prop_power / 4)-(prop_range*5) + dmg_mod) prop_stun = max(0,round( ((prop_power/4)+stun_mod-prop_range*2)) ) if(upgrades & PHASER_SNIPER) cost_mod += 50 prop_dmg += 45 if(upgrades & PHASER_ENERGY) prop_dmg = max(0,prop_dmg-8) if(upgrades & PHASER_HOMING) cost_mod += 5 if(upgrades & PHASER_BURN) cost_mod -= 5 if(upgrades & PHASER_TOXINS) cost_mod += 8 if(upgrades & PHASER_EMP) cost_mod += 5 if(upgrades & PHASER_SING) cost_mod += 8 prop_dmg = max(0,prop_dmg-((prop_dmg/3)+3)) if(upgrades & PHASER_FLASH) prop_dmg = max(0,round(prop_dmg-(prop_dmg/2))) prop_stun = max(0, prop_stun-5) if(upgrades & PHASER_CONC) prop_stun = 0 prop_dmg = max(0,round(prop_dmg-(prop_dmg/2))) charges_per_shot = round(max( 10,(prop_power/4)+(prop_range*14) ))+cost_mod if(isrobot(loc)) charges_per_shot = charges_per_shot*10 return proc/update_icon() var/ratio = src.charges / maximum_charges ratio = round(ratio, 0.25) * 100 src.icon_state = text("phaser[]", ratio) afterattack(atom/target as mob|obj|turf|area, mob/user as mob, flag) if(overloading) return if (flag) return src.add_fingerprint(user) if(isrobot(user)) var/mob/living/silicon/robot/R = user if(R.cell.charge < charges_per_shot) boutput(user, "*Warning* Not enough power."); return else if(src.charges < charges_per_shot) boutput(user, "*click* *click*"); return if(shot_firesounds.len) for(var/S in shot_firesounds) playsound(user, S, 60, 1) else playsound(user, prop_sound, 60, 1) if(isrobot(user)) var/mob/living/silicon/robot/R = user R.cell.charge -= charges_per_shot else src.charges -= charges_per_shot update_icon() spawn(0) var/obj/phaser_projectile/O = new/obj/phaser_projectile(get_turf(src)) O.damage = prop_dmg O.range = prop_range O.stun = prop_stun O.power = prop_power O.upgrades = upgrades O.icon_state = prop_iconstate O.dest = get_turf(target) O.origin = user O.impactsounds = shot_impactsounds.Copy() spawn(15) qdel(O) if(shot_overlays.len) for(var/S in shot_overlays) O.overlays += icon("icons/obj/gun.dmi",S) while(O.loc != O.dest) var/impact = 0 var/turf/next = get_step_towards(O,O.dest) if(next.density) impact = 1 else O.set_loc(next) if(O.upgrades & PHASER_HOMING) for(var/mob/living/M in view(2,O.loc)) if(M == O.origin) continue step_towards(O,M) break for(var/mob/living/M in O.loc) if(M == O.origin || M.lying) continue impact = 1 break for(var/obj/machinery/bot/B in O.loc) impact = 1 break for(var/obj/critter/C in O.loc) impact = 1 break if(O.loc == O.dest) impact = 1 if(impact) if(O.impactsounds.len) for(var/S in O.impactsounds) playsound(user, S, 65, 1) if(O.upgrades & PHASER_SING) var/turf/myloc = O.loc for(var/mob/living/M in view(2,O.loc)) if(M == O.origin) continue spawn(0) step_towards(M,myloc) sleep(5) step_towards(M,myloc) var/obj/projectile/PBul = unpool(/obj/projectile) var/obj/projectile/PLas = unpool(/obj/projectile) PBul.proj_data = new /datum/projectile/bullet/revolver_357( ) PLas.proj_data = new /datum/projectile/laser( ) for(var/obj/machinery/bot/B in view(O.range,O.loc)) if(O.upgrades & PHASER_EMP) B.bullet_act(PBul) B.bullet_act(PLas) else B.bullet_act(PLas) if(O.upgrades & PHASER_CONC) var/dir_old = O.dir spawn(0) step(B,dir_old) sleep(3) step(B,dir_old) for(var/obj/critter/C in view(O.range,O.loc)) C.bullet_act(PLas) if(O.upgrades & PHASER_CONC) var/dir_old = O.dir spawn(0) step(C,dir_old) sleep(3) step(C,dir_old) qdel(PBul) qdel(PLas) for(var/mob/living/M in view(O.range,O.loc)) if(M == O.origin) continue user.lastattacked = M M.lastattacker = user M.lastattackertime = world.time if(!isrobot(M) || (isrobot(M)&&!(O.upgrades & PHASER_EMP))) if(O.upgrades & PHASER_BURN) M.TakeDamage("chest", 0, O.damage) else if(O.upgrades & PHASER_TOXINS) M.take_toxin_damage(O.damage) if(M.reagents) M.reagents.add_reagent("toxin",7) else random_brute_damage(M, max(0,O.damage)) M.weakened += max(0,O.stun) else if(isrobot(M) && (O.upgrades & PHASER_EMP)) random_brute_damage(M, max(0,round(O.damage*1.5))) M.weakened += max(0,O.stun) if(O.upgrades & PHASER_FLASH) M.flash(60) if(O.upgrades & PHASER_CONC) var/dir_old = O.dir spawn(0) M.weakened += 2 step(M,dir_old) sleep(3) step(M,dir_old) switch(O.power) if(1 to 33) for(var/turf/simulated/floor/T in view(O.range,O.loc)) var/obj/OV = unpool(/obj/effects/sparks) OV.set_loc(T) OV.dir = pick(alldirs) spawn(20) if (OV) pool(OV) if(34 to 66) playsound(O.loc, "sound/effects/exlow.ogg", 65, 1) for(var/turf/simulated/floor/T in view(O.range,O.loc)) var/obj/OV = new/obj/overlay(T) OV.icon = 'icons/effects/effects.dmi' OV.icon_state = "empdisable" OV.dir = pick(alldirs) spawn(3) qdel(OV) if(prob(O.power/2) || !O.range) T.burn_tile() if(67 to 100) playsound(O.loc, "sound/weapons/flashbang.ogg", 65, 1) for(var/turf/simulated/floor/T in view(O.range,O.loc)) var/obj/OV = new/obj/effects/expl_particles(T) OV.dir=get_dir(O.loc,OV) if(prob(O.power/2) || !O.range) T.break_tile() if(101 to 150) playsound(O.loc, "sound/weapons/grenade.ogg", 65, 1) for(var/turf/simulated/floor/T in view(O.range,O.loc)) var/obj/OV = new/obj/effects/expl_particles(T) OV.dir=get_dir(O.loc,OV) if(prob(85) || !O.range) T.break_tile_to_plating() qdel(O) return sleep(1) return Topic(href, href_list) if(overloading) return if(usr.stat || usr.restrained()) return if(!in_range(src, usr)) return usr.machine = src if (href_list["power"]) var/change = href_list["power"] prop_power += text2num(change) if(prop_power < 0) prop_power = 0 if(prop_power > 50 && safeties) prop_power = 50 if(prop_power > 100) prop_power = 100 update_settings() src.attack_self(usr) return else if (href_list["focus"]) var/change = href_list["focus"] prop_range += text2num(change) if(prop_range < 0) prop_range = 0 if(prop_range > prop_maxrange) prop_range = prop_maxrange update_settings() src.attack_self(usr) return else if (href_list["overload"]) boutput(usr, "Your phaser overloads."); overloading = 1 playsound(usr, "sound/weapons/phaseroverload.ogg", 65, 1) spawn(60) var/turf/curr = get_turf(src) curr.hotspot_expose(700,125) explosion(src, curr, 0, 0, 2, 4) qdel(src) src.attack_self(usr) src.add_fingerprint(usr) return attack_self(mob/user as mob) if(overloading) return usr.machine = src var/dat = "Phaser settings:

" dat += "Power:
" dat += "(--)(-) [prop_power] (+)(++)

" dat += "Radius:
" //dat += "(-) [prop_range] (+)

" dat += "Energy-cost per shot:[charges_per_shot]
" if(isrobot(user)) var/mob/living/silicon/robot/R = user dat += "Energy:[R.cell.charge]

" else dat += "Energy:[charges]/[maximum_charges]

" if(safeties) dat += "Safeties active. Phaser locked to non-lethal power levels." //dat += "Damage:[prop_dmg]
" //dat += "Stun:[prop_stun]
" user << browse(dat, "window=phaser;can_minimize=0;can_resize=0;size=180x340") onclose(user, "window=phaser") return */