ID:2671278
 
(See the best response by Kaiochao.)
Code:
mob/Teleport
verb
BloodTeleportShort()
set category = "Abilities"
set name = "Blood Teleport Short"
if(usr.Freeze)
usr<<"<FONT COLOR=yellow>Client information</FONT>: Your frozen, you can't use magic"
return
if(usr.Energy<=0)
usr<<"<FONT COLOR=yellow>Client information</FONT>: Your out of energy"
return
if(usr.MagicBound||WorldMagicBound)
usr<<"Your Magic doesn't seem to work, it's bound!"
return
if(usr.Selforb == 0)
usr.Selforb = 1
usr.density = 0

usr.Exposing_Magic()
usr.overlays = new /obj/orb/BloodTeleport1
view(7)<< "[usr] Teleports out"
usr.Energy -= 5

sleep(1)
usr.overlays = null
view(7)<< Shimmering
usr.overlays += new /obj/orb/BloodTeleport2
sleep(1)
usr.overlays = null
usr.overlays += new /obj/orb/BloodTeleport3
sleep(1)
usr.overlays = null
usr.overlays += new /obj/orb/BloodTeleport4
sleep(1)
usr.overlays = null
usr.overlays += new /obj/orb/BloodTeleport5
sleep(1)
usr.overlays = null
usr.overlays += new /obj/orb/BloodTeleport6
usr.underlays=null
usr.icon=null
sleep(1)
usr.overlays = null
usr.overlays += new /obj/orb/BloodTeleport7
sleep(1)
usr.overlays = null
usr.overlays += new /obj/orb/BloodTeleport8
sleep(1)
usr.overlays = null
usr.overlays += new /obj/orb/BloodTeleport9
sleep(1)
usr.overlays = null
usr.overlays += new /obj/orb/BloodTeleport10
sleep(1)
usr.overlays = null
usr.overlays += new /obj/orb/BloodTeleport11
sleep(1)
usr.overlays = null
usr.overlays += new /obj/orb/BloodTeleport12
sleep(1)
usr.overlays = null
usr.overlays += new /obj/orb/BloodTeleport13
sleep(1)
usr.overlays = null
usr.overlays += new /obj/orb/BloodTeleport14
usr.invisibility=100
else if(Selforb == 1)
usr.Selforb = 0
usr.density = 1
usr.invisibility = 0
view(7)<< "[usr] Teleports in"
view(7)<< Shimmering
usr.Exposing_Magic()
usr.Energy -= 5
//////////////////////////////////
usr.overlays = new /obj/orb/BloodTeleport14
sleep(1)
usr.overlays = null
view(7)<< Shimmering
usr.overlays += new /obj/orb/BloodTeleport13
sleep(1)
usr.overlays = null
usr.overlays += new /obj/orb/BloodTeleport12
sleep(1)
usr.overlays = null
usr.overlays += new /obj/orb/BloodTeleport11
sleep(1)
usr.overlays = null
usr.overlays += new /obj/orb/BloodTeleport10
sleep(1)
usr.overlays = null
usr.overlays += new /obj/orb/BloodTeleport9
sleep(1)
usr.overlays = null
usr.overlays += new /obj/orb/BloodTeleport8
sleep(1)
usr.overlays = null
usr.overlays += new /obj/orb/BloodTeleport7
sleep(1)
usr.overlays = null
usr.overlays += new /obj/orb/BloodTeleport6
usr.icon=usr.original_icon
usr.ClothingProc()
sleep(1)
usr.overlays = null
usr.overlays += new /obj/orb/BloodTeleport5
sleep(1)
usr.overlays = null
usr.overlays += new /obj/orb/BloodTeleport4
sleep(1)
usr.overlays = null
usr.overlays += new /obj/orb/BloodTeleport3
sleep(1)
usr.overlays = null
usr.overlays += new /obj/orb/BloodTeleport2
sleep(1)
usr.overlays = null
usr.overlays += new /obj/orb/BloodTeleport1
usr.overlays = null


Problem description:
Hey guys! So I don't know much about overlays, was hoping there was an better way to add my overlay icons that will give me the same results but less lines. If you have any ideas or even just a webpage on overlays i'd appreciate it! Thanks :).
Best response
Explain what effect you're trying to achieve, because it's very likely that overlays is not what you should be using to do it.

One thing you should know about overlays is that you should rarely add something to overlays without removing that same exact thing from it later. This means you don't have to totally clear overlays all the time, which interferes with everything else that might be using overlays. When code affects other code indirectly in unexpected ways, that code breaks.
// don't do this
usr.overlays += new/obj/orb/BloodTeleport1
sleep(1)
usr.overlays = null

// do this instead
var/obj/orb/BloodTeleport1/effect = new
usr.overlays += effect
sleep(1)
usr.overlays -= effect

If you're clearing overlays because you want to remove clothing, you don't want to clear overlays, you just want to remove clothing, which could be its own proc that only affects the clothing overlays. That's a separate matter.

Whenever you have repetitive code with minimal differences, you can always use a for() loop instead. In this case, you have a sequence of types to loop over and show with 0.1 second in between. Might as well make the lists global so they're not recreated every time this verb is called.
var/global/list/First = newlist(
/obj/orb/BloodTeleport1,
/obj/orb/BloodTeleport2,
/obj/orb/BloodTeleport3,
/obj/orb/BloodTeleport4,
/obj/orb/BloodTeleport5,
/obj/orb/BloodTeleport6)

var/global/list/Second = newlist(
/obj/orb/BloodTeleport7,
/obj/orb/BloodTeleport8,
/obj/orb/BloodTeleport9,
/obj/orb/BloodTeleport10,
/obj/orb/BloodTeleport11,
/obj/orb/BloodTeleport12,
/obj/orb/BloodTeleport13,
/obj/orb/BloodTeleport14)

for(var/effect in First)
usr.overlays += effect
sleep(1)
usr.overlays -= effect

usr.underlays = null
usr.icon = null

for(var/effect in Second)
usr.overlays += effect
sleep(1)
usr.overlays -= effect

usr.invisibility = 100

It's still pretty ugly, but I'd have to see what the differences are between the types to simplify it any more. If the types only have a different icon_state, and the icon states are numbers (like "1", "2", etc.), then you don't need the lists or multiple objects at all:
var/obj/orb/BloodTeleport/effect = new

for(var/frame in 1 to 6)
effect.icon_state = "[frame]"
usr.overlays += effect
sleep(1)
usr.overlays -= effect

usr.underlays = null
usr.icon = null

for(var/frame in 7 to 14)
effect.icon_state = "[frame]"
usr.overlays += effect
sleep(1)
usr.overlays -= effect

usr.invisibility = 100

Of course, you can also iterate with a decreasing value for the deactivation effect:
for(var/frame in 14 to 6 step -1)
// same as above

Even better than overlays, you can use vis_contents, so you won't have to repeat the addition/removal of the object at all:
var/obj/orb/BloodTeleport/effect = new
usr.vis_contents += effect

for(var/frame in 1 to 6)
effect.icon_state = "[frame]"
sleep(1)

usr.underlays = null
usr.icon = null

for(var/frame in 7 to 14)
effect.icon_state = "[frame]"
sleep(1)

usr.vis_contents -= effect
usr.invisibility = 100

If you want, you can even put the animation frames into actual animated icon states and use flick(), which even gets rid of the loops.
var/obj/orb/BloodTeleport/effect = new
usr.vis_contents += effect
flick("1-6", effect)
sleep(6)
usr.underlays = null
usr.icon = null
flick("7-14", effect)
sleep(7)
usr.vis_contents -= effect
usr.invisibility = 100

Even better than all of the above would be if you could create your effect using animate() or particle effects.
I actually love your examples and I think im going to research them more especially the newlist() thing but a friend did end up helping me. I combined all the icons into one icon in the .dmi and I'm just using flick() now. Thank you for your help you guys really do so much! <3