mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-12 03:02:54 +00:00
Minor optimization to metroid/proc/get_obstacle_ok() and re-added Sky's beam optimization
This commit is contained in:
@@ -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
|
||||||
@@ -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"
|
||||||
|
|||||||
Reference in New Issue
Block a user