Protolasers (WIP/unobtainable), beginnings of accuracy rework.

My first project!  Done by myself!  Yesss.

okay, sounds helped.  but it was mostly me.
This commit is contained in:
Duck-
2014-08-31 00:20:25 -04:00
parent 83a06403dc
commit e026c65a6f
13 changed files with 438 additions and 10 deletions
@@ -1321,6 +1321,10 @@
var/obj/item/weapon/gun/energy/rifle/sniperrifle/s = locate() in src
if(s.zoom)
s.zoom()
if(locate(/obj/item/weapon/gun/energy/laser/modular, contents))
var/obj/item/weapon/gun/energy/laser/modular/s = locate() in src
if(s.zoom)
s.zoom()
else
sight &= ~(SEE_TURFS|SEE_MOBS|SEE_OBJS)
@@ -1019,7 +1019,7 @@
/*
/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)
+5
View File
@@ -192,6 +192,11 @@
var/obj/item/weapon/gun/energy/rifle/sniperrifle/s = locate() in mob
if(s.zoom)
s.zoom()
if(locate(/obj/item/weapon/gun/energy/laser/modular, mob.contents)) // If mob moves while zoomed in with modular rifle, unzoom them.
var/obj/item/weapon/gun/energy/laser/modular/s = locate() in mob
if(s.zoom)
s.zoom()
if(Process_Grab()) return
+3
View File
@@ -44,6 +44,9 @@
var/force_unwielded = 0 //Force modification, because striking someone with a rifle held in two hands -hurts-
var/force_wielded = 0
var/accuracy = -30 //goes into projectile.dm to provide individual offsets for each gun. negative to increase base accuracy
var/rangedrop = 5 //how much accuracy the average gun loses for every tile
proc/can_wield() //Override in order to make a weapon two handed, remember to add toggle_wield(mob/user as mob) in the weapon somewhere
return 0 //Override /Fire(..) to force the weapon to be two handed
@@ -21,7 +21,7 @@
isHandgun()
return 1
obj/item/weapon/gun/energy/laser/retro
/obj/item/weapon/gun/energy/laser/retro
name ="retro laser"
icon_state = "retro"
desc = "An older model of the basic lasergun, no longer used by Nanotrasen's security or military forces. Nevertheless, it is still quite deadly and easy to maintain, making it a favorite amongst pirates and other outlaws."
@@ -0,0 +1,374 @@
/obj/item/weapon/gun/energy/laser/modular/
name = "basic protolaser"
desc = "A basic, modular laser rifle."
icon_state = "laser"
item_state = "laser"
fire_sound = 'sound/weapons/Laser.ogg'
slot_flags = SLOT_BACK
w_class = 4
m_amt = 2000
origin_tech = "combat=3;magnets=2"
projectile_type = "/obj/item/projectile/beam/reallyweak"
fire_delay = 16
cell_type = "/obj/item/weapon/cell"
var/canzoom = 0
var/zoom = 0
var/open = 0
var/upgradepointtotal = 16 //KNOWN BUG: Crashes if you try to VV it with a lot of stuff inside. By a lot, I mean 'everything.' At least in all my tests.
var/upgradepoints = 0
//Changeable part mods//
var/obj/item/weapon/stock_parts/micro_laser/lasertype
var/obj/item/weapon/stock_parts/manipulator/delaymod
var/obj/item/weapon/stock_parts/scanning_module/targetmod
var/obj/item/weapon/stock_parts/console_screen/screen
var/obj/item/weapon/stock_parts/capacitor/powermod
// var/obj/item/weapon/stock_parts/matter_bin/heatsink //i have no idea what this is for yet so.
var/hasscreen = 0 // for scoping.
/obj/item/weapon/gun/energy/laser/modular/pistol // small modular laser pistol.
name = "basic protopistol"
desc = "A basic, modular laser pistol."
w_class = 2
upgradepointtotal = 10
/obj/item/weapon/gun/energy/laser/modular/pistol/advanced //better version of the pistol
name = "advanced protopistol"
desc = "A protopistol with an improved frame, capable of holding more upgrades."
w_class = 2
upgradepointtotal = 16
/obj/item/weapon/gun/energy/laser/modular/advanced //better version of the rifle.
name = "advanced protolaser"
desc = "A protolaser with an improved frame, capable of holding more upgrades."
upgradepointtotal = 22
/obj/item/weapon/gun/energy/laser/modular/advanced/bluespace //for admins. maybe r&d with cell nerf if feeling generous
name = "bluespace protolaser"
desc = "A highly-advanced laser, capable of holding all your upgrades. Powered by bluespace."
upgradepointtotal = 35 //enough for everything
cell_type = "/obj/item/weapon/cell/infinite"
/obj/item/weapon/gun/energy/laser/modular/pistol/bluespace //for admins
name = "bluespace protopistol"
desc = "A highly-advanced pistol, capable of holding all your upgrades. Powered by bluespace."
w_class = 2
upgradepointtotal = 35 //enough for all of the things
cell_type = "/obj/item/weapon/cell/infinite"
/obj/item/weapon/gun/energy/laser/modular/attackby(obj/item/W, mob/user) //the modding stuffs
if (istype(W, /obj/item/weapon/screwdriver))
if(open == 1)
user << "<span class='notice'>You secure the parts and close the [src].</span>"
open = 0
checkparts() //applies the upgrades.
else if(open == 0)
user << "<span class='notice'>You open the gun and remove the parts from [src].</span>"
open = 1
upgradepoints = 0 //you open the gun and everything falls out. reset this stuff here.
hasscreen = 0
canzoom = 0
/*
Have it reset all the gun's stats here. Do it after the gun has stats. Gun does not have stats yet
*/
if(lasertype) //if lasertype exists ie is not null
lasertype.loc = get_turf(src.loc)
lasertype = null // drop to floor and set to null
if(delaymod)
delaymod.loc = get_turf(src.loc)
delaymod = null
if(targetmod)
targetmod.loc = get_turf(src.loc)
targetmod = null
if(powermod)
powermod.loc = get_turf(src.loc)
powermod = null
if(screen)
screen.loc = get_turf(src.loc)
screen = null
/* if(heatsink)
heatsink.loc = get_turf(src.loc)
heatsink = null */
/* if(cell_type)
cell_type.loc = get_turf(src.loc)
cell_type = null
*/
checkparts() //resets all values since everything popped out.
if (open == 1)
if (istype(W, /obj/item/weapon/stock_parts/micro_laser))
if (!lasertype)
lasertype = W
if(lasertype.rating == 1)
if(assignpoints(3, user))
user.drop_item()
W.loc = src
user << "<span class='notice'>You install a [lasertype.name] in [src].</span>"
else
lasertype = null
return
else if(lasertype.rating == 2)
if(assignpoints(5, user))
user.drop_item()
W.loc = src
user << "<span class='notice'>You install a [lasertype.name] in [src].</span>"
else
lasertype = null
return
else if(lasertype.rating == 3)
if(assignpoints(8, user))
user.drop_item()
W.loc = src
user << "<span class='notice'>You install a [lasertype.name] in [src].</span>"
else
lasertype = null
return
else if (lasertype)
user << "<span class='notice'>There's already a laser inside!</span>"
else if (istype(W, /obj/item/weapon/stock_parts/manipulator))
if (!delaymod)
delaymod = W
user.drop_item()
W.loc = src
user << "<span class='notice'>You install a [delaymod.name] in [src].</span>"
if(delaymod.rating == 1)
if(assignpoints(2, user))
user.drop_item()
W.loc = src
user << "<span class='notice'>You install a [delaymod.name] in [src].</span>"
else
delaymod = null
return
else if(delaymod.rating == 2)
if(assignpoints(6, user))
user.drop_item()
W.loc = src
user << "<span class='notice'>You install a [delaymod.name] in [src].</span>"
else
delaymod = null
return
else if(delaymod.rating == 3)
if(assignpoints(12, user))
user.drop_item()
W.loc = src
user << "<span class='notice'>You install a [delaymod.name] in [src].</span>"
else
delaymod = null
return
else if (delaymod)
user << "<span class='notice'>There's already a manipulator inside!</span>"
else if (istype(W, /obj/item/weapon/stock_parts/scanning_module))
if (!targetmod)
targetmod = W
if(targetmod.rating == 1)
if(assignpoints(2, user))
user.drop_item()
W.loc = src
user << "<span class='notice'>You install a [targetmod.name] in [src].</span>"
else
targetmod = null
return
else if(targetmod.rating == 2)
if(assignpoints(4, user))
user.drop_item()
W.loc = src
user << "<span class='notice'>You install a [targetmod.name] in [src].</span>"
else
targetmod = null
return
else if(targetmod.rating == 3)
if(assignpoints(6, user))
user.drop_item()
W.loc = src
user << "<span class='notice'>You install a [targetmod.name] in [src].</span>"
else
targetmod = null
return
else if (targetmod)
user << "<span class='notice'>There's already a scanning module inside!</span>"
else if (istype(W, /obj/item/weapon/stock_parts/console_screen))
if (!screen)
screen = W
if(assignpoints(3, user))
user.drop_item()
W.loc = src
hasscreen = 1
user << "<span class='notice'>You install a screen in [src].</span>"
else
screen = null
return
else if (screen)
user << "<span class='notice'>There's already a screen inside!</span>"
else if (istype(W, /obj/item/weapon/stock_parts/capacitor))
if (!powermod)
powermod = W
if(powermod.rating == 1)
if(assignpoints(1, user))
user.drop_item()
W.loc = src
user << "<span class='notice'>You install a [powermod.name] in [src].</span>"
else
powermod = null
return
else if(powermod.rating == 2)
if(assignpoints(3, user))
user.drop_item()
W.loc = src
user << "<span class='notice'>You install a [powermod.name] in [src].</span>"
else
powermod = null
return
else if(powermod.rating == 3)
if(assignpoints(6, user))
user.drop_item()
W.loc = src
user << "<span class='notice'>You install a [powermod.name] in [src].</span>"
else
powermod = null
return
else if (powermod)
user << "<span class='notice'>There's already a capacitor inside!</span>"
/* else if (istype(W, /obj/item/weapon/stock_parts/matter_bin))
if (!heatsink)
user.drop_item()
W.loc = src
heatsink = W
user << "<span class='notice'>You install a [heatsink.name] in [src].</span>"
if(heatsink.rating == 1)
upgradepoints += 2
else if(heatsink.rating == 2)
upgradepoints += 5
else if(heatsink.rating == 3)
upgradepoints += 10
else if (heatsink)
user << "<span class='notice'>There's already a heatsink inside!</span>"
*/
/obj/item/weapon/gun/energy/laser/modular/proc/checkparts() //updates parts and values
if(!lasertype)
projectile_type = "/obj/item/projectile/beam/reallyweak"
charge_cost = 150
else if(lasertype.rating == 1)
projectile_type = "/obj/item/projectile/beam/green" // preferably a green laser. expecting standard 40 damage.
charge_cost = 200
else if(lasertype.rating == 2)
projectile_type = "/obj/item/projectile/beam/blue" //powerful. eight shots with highest-end power equipment.
charge_cost = 500
else if(lasertype.rating == 3)
projectile_type = "/obj/item/projectile/beam/violet" //extremely high-powered. you get four shots -with- top-tier powermods. less without.
charge_cost = 1000
if(!delaymod)
fire_delay = 16
else if(delaymod.rating == 1)
fire_delay = 8
else if(delaymod.rating == 2)
fire_delay = 4
else if(delaymod.rating == 3)
fire_delay = 2
if(!targetmod) // TBD after projectile accuracy. extreme placeholder values.
// miss_modifier = 0
canzoom = 0
else if(targetmod.rating == 1)
// miss_modifier = -30
canzoom = 0
else if(targetmod.rating == 2)
// miss_modifier = -60
canzoom = 1 //advanced and up scanning modules let you zoom in.
else if(targetmod.rating == 3)
// miss_modifier = -90
canzoom = 1
if(!powermod)
charge_cost = 1.5*charge_cost
else if(powermod.rating == 1)
charge_cost = charge_cost
else if(powermod.rating == 2)
charge_cost = charge_cost/2
else if(powermod.rating == 3)
charge_cost = charge_cost/4
/* if(!heatsink)
else if(heatsink.rating == 1)
else if(heatsink.rating == 2)
else if(heatsink.rating == 3)*/
/obj/item/weapon/gun/energy/laser/modular/proc/assignpoints(var/newpoints, var/mob/user as mob)
if((upgradepointtotal) >= (upgradepoints + newpoints))
upgradepoints += newpoints
user << "<span class='notice'>You have used [upgradepoints]/[upgradepointtotal] upgrade points. This upgrade costs [newpoints] points.</span>"
return 1
else
user << "<span class='notice'>The frame cannot handle this many upgrades!</span>"
user << "<span class='notice'>You have used [upgradepoints]/[upgradepointtotal] upgrade points. This upgrade costs [newpoints] points.</span>"
return 0
/obj/item/weapon/gun/energy/laser/modular/Fire(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, params, reflex = 0)
if(open == 1)
user << "<span class='notice'>Secure the gun with a screwdriver first!</span>"
return
..()
/obj/item/weapon/gun/energy/laser/modular/dropped(mob/user)
user.client.view = world.view
/obj/item/weapon/gun/energy/laser/modular/verb/zoom()
set category = "Object"
set name = "Use Scan-Screen"
set popup_menu = 0
if(usr.stat || !(istype(usr,/mob/living/carbon/human)))
usr << "You are unable to focus on the screen."
return
if(!zoom && global_hud.darkMask[1] in usr.client.screen)
usr << "Your welding equipment makes it hard to see the screen."
return
if(!zoom && usr.get_active_hand() != src)
usr << "You are too distracted to watch the screen, perhaps if it was in your active hand this might work better"
return
if((hasscreen == 0) || (canzoom == 0))
usr << "This gun lacks the parts for components for zooming."
return
if(usr.client.view == world.view)
if(!usr.hud_used.hud_shown)
usr.button_pressed_F12(1) // If the user has already limited their HUD this avoids them having a HUD when they zoom in
usr.button_pressed_F12(1)
usr.client.view = 12
zoom = 1
else
usr.client.view = world.view
if(!usr.hud_used.hud_shown)
usr.button_pressed_F12(1)
zoom = 0
usr << "<font color='[zoom?"blue":"red"]'>Zoom mode [zoom?"en":"dis"]abled.</font>"
return
+1 -1
View File
@@ -93,7 +93,7 @@
var/obj/item/weapon/gun/daddy = shot_from //Kinda balanced by fact you need like 2 seconds to aim
if (daddy.target && original in daddy.target) //As opposed to no-delay pew pew
miss_modifier += -30
def_zone = get_zone_with_miss_chance(def_zone, M, miss_modifier + 5*distance)
def_zone = get_zone_with_miss_chance(def_zone, M, miss_modifier + 10*distance) // add +daddy.missmod vars to gun and this. snowflake accuracy
if(!def_zone)
visible_message("\blue \The [src] misses [M] narrowly!")
+39 -1
View File
@@ -188,4 +188,42 @@ var/list/beam_master = list()
damage = 30
damage_type = BURN
flag = "laser"
eyeblur = 4
eyeblur = 4
//modular laser projectiles
/obj/item/projectile/beam/reallyweak
name = "unfocused laser"
icon_state = "laser"
damage = 20
/obj/item/projectile/beam/green
name = "green laser"
icon_state = "lasergreen"
damage = 40
agony = 25 //these extra values and below are all timed so they knock you out only on the killing/critting blow. more for coolness than effect.
/obj/item/projectile/beam/blue
name = "blue laser"
icon_state = "laserblue"
damage = 60
irradiate = 40
agony = 40
/obj/item/projectile/beam/violet
name = "violet laser"
icon_state = "laserviolet"
damage = 80
irradiate = 50
agony = 50
/obj/item/projectile/beam/violet/on_hit(var/atom/target, var/blocked = 0)
if(istype(target, /mob/living/carbon))
var/mob/living/carbon/M = target
M.adjust_fire_stacks(1)
M.IgniteMob()
else if(istype(target, /mob/living/silicon/robot))
var/mob/living/silicon/robot/M = target
M.adjust_fire_stacks(1)
M.IgniteMob()
@@ -43,7 +43,10 @@
var/mob/living/carbon/M = target
M.adjust_fire_stacks(1)
M.IgniteMob()
else if(istype(target, /mob/living/silicon/robot))
var/mob/living/silicon/robot/M = target
M.adjust_fire_stacks(1)
M.IgniteMob()
/obj/item/projectile/bullet/incendiary/shell
name = "incendiary shell"
damage_type = BURN