diff --git a/code/modules/mob/living/carbon/metroid/metroid.dm b/code/modules/mob/living/carbon/metroid/metroid.dm index 59b8eb1f9a8..a74a7c6a6e2 100644 --- a/code/modules/mob/living/carbon/metroid/metroid.dm +++ b/code/modules/mob/living/carbon/metroid/metroid.dm @@ -705,6 +705,7 @@ mob/living/carbon/metroid/var/temperature_resistance = T0C+75 var/direct = get_dir(src, A) var/obj/item/weapon/dummy/D = new /obj/item/weapon/dummy( src.loc ) var/ok = 0 + if ( (direct - 1) & direct) var/turf/Step_1 var/turf/Step_2 @@ -725,47 +726,55 @@ mob/living/carbon/metroid/var/temperature_resistance = T0C+75 Step_1 = get_step(src, SOUTH) Step_2 = get_step(src, WEST) - else if(Step_1 && Step_2) var/check_1 = 0 var/check_2 = 0 + if(step_to(D, Step_1)) check_1 = 1 for(var/obj/border_obstacle in Step_1) if(border_obstacle.flags & ON_BORDER) if(!border_obstacle.CheckExit(D, A)) 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 + + if(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 - if(step_to(D, Step_2)) + if(check_1 != 1 && step_to(D, Step_2)) check_2 = 1 for(var/obj/border_obstacle in Step_2) if(border_obstacle.flags & ON_BORDER) if(!border_obstacle.CheckExit(D, A)) 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_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) ok = 1 else - if(loc == src.loc) - ok = 1 - else - ok = 1 + ok = 1 - //Now, check objects to block exit that are on the border - for(var/obj/border_obstacle in src.loc) - if(border_obstacle.flags & ON_BORDER) - if(!border_obstacle.CheckExit(D, A)) - ok = 0 + //Now, check objects to block exit that are on the border + for(var/obj/border_obstacle in src.loc) + if(border_obstacle.flags & ON_BORDER) + if(!border_obstacle.CheckExit(D, A)) + ok = 0 + break + if(ok != 0) //Next, check objects to block entry that are on the border for(var/obj/border_obstacle in get_turf(A)) if((border_obstacle.flags & ON_BORDER) && (A != border_obstacle)) @@ -774,7 +783,6 @@ mob/living/carbon/metroid/var/temperature_resistance = T0C+75 del(D) if (!( ok )) - return 0 return 1 \ No newline at end of file diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 5447f6a7046..fddea20b2f9 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -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 name = "laser" icon_state = "laser" @@ -7,46 +17,63 @@ flag = "laser" eyeblur = 4 var/frequency = 1 - var/ID = 0 - var/main = 0 fired() - main = 1 - ID = rand(0,1000) - var/first = 1 - var/obj/effect/effect/laserdealer/lasor = new /obj/effect/effect/laserdealer(null) + var/reference = "\ref[src]" //So we do not have to recalculate it a ton + var/first = 1 //So we don't make the overlay in the same tile as the firer + spawn(0) - lasor.setup(ID) - spawn(0) - while(!bumped) - step_towards(src, current) + while(!bumped) //Move until we hit something + step_towards(src, current) //Move~ + for(var/mob/living/M in loc) - Bump(M) - if((!( current ) || loc == current)) + Bump(M) //Bump anyone we touch + + 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) + if((x == 1 || x == world.maxx || y == 1 || y == world.maxy)) - del(src) + del(src) //Delete if it passes the world edge return - if(!first) - var/obj/item/projectile/beam/new_beam = new src.type(loc) - processing_objects.Remove(new_beam) - new_beam.dir = get_dir(src, current) - new_beam.ID = ID - new_beam.icon_state = icon_state + + if(!first) //Add the overlay as we pass over tiles + var/target_dir = get_dir(src, current) //So we don't call this too much + + //If the icon has not been added yet + 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 first = 0 + + cleanup(reference) return -/obj/effect/effect/laserdealer - name = "laserdealio" - - proc/setup(var/ID = 0) - sleep(5) - for(var/obj/item/projectile/beam/beam in world) - if(ID == beam.ID) - del(beam) - spawn(0) - del(src) + proc/cleanup(reference) //Waits .3 seconds then removes the overlay. + src = null + sleep(3) + var/list/turf_master = beam_master[reference] + for(var/laser_state in turf_master) + var/list/turfs = turf_master[laser_state] + for(var/turf/T in turfs) + T.overlays -= beam_master[laser_state] + return /obj/item/projectile/practice name = "laser"