Minor optimization to metroid/proc/get_obstacle_ok() and re-added Sky's beam optimization

This commit is contained in:
Albert Iordache
2012-07-23 18:43:43 +03:00
parent 1b55d837e1
commit 4eee0a106c
2 changed files with 84 additions and 49 deletions

View File

@@ -705,6 +705,7 @@ mob/living/carbon/metroid/var/temperature_resistance = T0C+75
var/direct = get_dir(src, A) var/direct = get_dir(src, A)
var/obj/item/weapon/dummy/D = new /obj/item/weapon/dummy( src.loc ) var/obj/item/weapon/dummy/D = new /obj/item/weapon/dummy( src.loc )
var/ok = 0 var/ok = 0
if ( (direct - 1) & direct) if ( (direct - 1) & direct)
var/turf/Step_1 var/turf/Step_1
var/turf/Step_2 var/turf/Step_2
@@ -725,47 +726,55 @@ mob/living/carbon/metroid/var/temperature_resistance = T0C+75
Step_1 = get_step(src, SOUTH) Step_1 = get_step(src, SOUTH)
Step_2 = get_step(src, WEST) Step_2 = get_step(src, WEST)
else
if(Step_1 && Step_2) if(Step_1 && Step_2)
var/check_1 = 0 var/check_1 = 0
var/check_2 = 0 var/check_2 = 0
if(step_to(D, Step_1)) if(step_to(D, Step_1))
check_1 = 1 check_1 = 1
for(var/obj/border_obstacle in Step_1) for(var/obj/border_obstacle in Step_1)
if(border_obstacle.flags & ON_BORDER) if(border_obstacle.flags & ON_BORDER)
if(!border_obstacle.CheckExit(D, A)) if(!border_obstacle.CheckExit(D, A))
check_1 = 0 check_1 = 0
for(var/obj/border_obstacle in get_turf(A)) break
if((border_obstacle.flags & ON_BORDER) && (src != border_obstacle))
if(!border_obstacle.CanPass(D, D.loc, 1, 0)) if(check_1 != 0)
check_1 = 0 for(var/obj/border_obstacle in get_turf(A))
if((border_obstacle.flags & ON_BORDER) && (src != border_obstacle))
if(!border_obstacle.CanPass(D, D.loc, 1, 0))
check_1 = 0
break
D.loc = src.loc D.loc = src.loc
if(step_to(D, Step_2)) if(check_1 != 1 && step_to(D, Step_2))
check_2 = 1 check_2 = 1
for(var/obj/border_obstacle in Step_2) for(var/obj/border_obstacle in Step_2)
if(border_obstacle.flags & ON_BORDER) if(border_obstacle.flags & ON_BORDER)
if(!border_obstacle.CheckExit(D, A)) if(!border_obstacle.CheckExit(D, A))
check_2 = 0 check_2 = 0
for(var/obj/border_obstacle in get_turf(A)) break
if((border_obstacle.flags & ON_BORDER) && (src != border_obstacle))
if(!border_obstacle.CanPass(D, D.loc, 1, 0)) if(check_2 != 0)
check_2 = 0 for(var/obj/border_obstacle in get_turf(A))
if((border_obstacle.flags & ON_BORDER) && (src != border_obstacle))
if(!border_obstacle.CanPass(D, D.loc, 1, 0))
check_2 = 0
break
if(check_1 || check_2) if(check_1 || check_2)
ok = 1 ok = 1
else else
if(loc == src.loc) ok = 1
ok = 1
else
ok = 1
//Now, check objects to block exit that are on the border //Now, check objects to block exit that are on the border
for(var/obj/border_obstacle in src.loc) for(var/obj/border_obstacle in src.loc)
if(border_obstacle.flags & ON_BORDER) if(border_obstacle.flags & ON_BORDER)
if(!border_obstacle.CheckExit(D, A)) if(!border_obstacle.CheckExit(D, A))
ok = 0 ok = 0
break
if(ok != 0)
//Next, check objects to block entry that are on the border //Next, check objects to block entry that are on the border
for(var/obj/border_obstacle in get_turf(A)) for(var/obj/border_obstacle in get_turf(A))
if((border_obstacle.flags & ON_BORDER) && (A != border_obstacle)) if((border_obstacle.flags & ON_BORDER) && (A != border_obstacle))
@@ -774,7 +783,6 @@ mob/living/carbon/metroid/var/temperature_resistance = T0C+75
del(D) del(D)
if (!( ok )) if (!( ok ))
return 0 return 0
return 1 return 1

View File

@@ -1,3 +1,13 @@
var/list/beam_master = list()
//Use: Caches beam state images and holds turfs that had these images overlaid.
//Structure:
//beam_master
// icon_states/dirs of beams
// image for that beam
// references for fired beams
// icon_states/dirs for each placed beam image
// turfs that have that icon_state/dir
/obj/item/projectile/beam /obj/item/projectile/beam
name = "laser" name = "laser"
icon_state = "laser" icon_state = "laser"
@@ -7,46 +17,63 @@
flag = "laser" flag = "laser"
eyeblur = 4 eyeblur = 4
var/frequency = 1 var/frequency = 1
var/ID = 0
var/main = 0
fired() fired()
main = 1 var/reference = "\ref[src]" //So we do not have to recalculate it a ton
ID = rand(0,1000) var/first = 1 //So we don't make the overlay in the same tile as the firer
var/first = 1
var/obj/effect/effect/laserdealer/lasor = new /obj/effect/effect/laserdealer(null)
spawn(0) spawn(0)
lasor.setup(ID) while(!bumped) //Move until we hit something
spawn(0) step_towards(src, current) //Move~
while(!bumped)
step_towards(src, current)
for(var/mob/living/M in loc) for(var/mob/living/M in loc)
Bump(M) Bump(M) //Bump anyone we touch
if((!( current ) || loc == current))
if((!( current ) || loc == current)) //If we pass our target
current = locate(min(max(x + xo, 1), world.maxx), min(max(y + yo, 1), world.maxy), z) current = locate(min(max(x + xo, 1), world.maxx), min(max(y + yo, 1), world.maxy), z)
if((x == 1 || x == world.maxx || y == 1 || y == world.maxy)) if((x == 1 || x == world.maxx || y == 1 || y == world.maxy))
del(src) del(src) //Delete if it passes the world edge
return return
if(!first)
var/obj/item/projectile/beam/new_beam = new src.type(loc) if(!first) //Add the overlay as we pass over tiles
processing_objects.Remove(new_beam) var/target_dir = get_dir(src, current) //So we don't call this too much
new_beam.dir = get_dir(src, current)
new_beam.ID = ID //If the icon has not been added yet
new_beam.icon_state = icon_state if( !("[icon_state][target_dir]" in beam_master) )
var/image/I = image(icon,icon_state,10,target_dir) //Generate it.
beam_master["[icon_state][target_dir]"] = I //And cache it!
//Finally add the overlay
loc.overlays += beam_master["[icon_state][target_dir]"]
//Add the turf to a list in the beam master so they can be cleaned up easily.
if(reference in beam_master)
var/list/turf_master = beam_master[reference]
if("[icon_state][target_dir]" in turf_master)
var/list/turfs = turf_master["[icon_state][target_dir]"]
turfs += loc
else
turf_master["[icon_state][target_dir]"] = list(loc)
else
var/list/turfs = list()
turfs["[icon_state][target_dir]"] = list(loc)
beam_master[reference] = turfs
else else
first = 0 first = 0
cleanup(reference)
return return
/obj/effect/effect/laserdealer proc/cleanup(reference) //Waits .3 seconds then removes the overlay.
name = "laserdealio" src = null
sleep(3)
proc/setup(var/ID = 0) var/list/turf_master = beam_master[reference]
sleep(5) for(var/laser_state in turf_master)
for(var/obj/item/projectile/beam/beam in world) var/list/turfs = turf_master[laser_state]
if(ID == beam.ID) for(var/turf/T in turfs)
del(beam) T.overlays -= beam_master[laser_state]
spawn(0) return
del(src)
/obj/item/projectile/practice /obj/item/projectile/practice
name = "laser" name = "laser"