Index: data/core/about.cfg
===================================================================
--- data/core/about.cfg	(revision 56058)
+++ data/core/about.cfg	(working copy)
@@ -68,6 +68,10 @@
         name = "David Hilton"
     [/entry]
     [entry]
+        name = "David Mikos (Coffee)"
+        comment = "Coder, animation framework improvements."
+    [/entry]
+    [entry]
         name = "Dominic Bolin (Xan)"
     [/entry]
     [entry]
Index: data/core/macros/teleport-utils.cfg
===================================================================
--- data/core/macros/teleport-utils.cfg	(revision 56058)
+++ data/core/macros/teleport-utils.cfg	(working copy)
@@ -57,19 +57,19 @@
 
             [teleport_sparkle_1_frame]
                 duration=800
-                halo=misc/blank-hex.png:1,halo/teleport-9.png,halo/teleport-8.png,halo/teleport-1.png,halo/teleport-2.png,halo/teleport-3.png,halo/teleport-4.png,halo/teleport-5.png,halo/teleport-6.png,halo/teleport-7.png,halo/teleport-8.png,halo/teleport-9.png,misc/blank-hex.png:1
+                halo=misc/blank-hex.png:1,halo/teleport-[9,8,1-9].png,misc/blank-hex.png:1
                 halo_x=-10
                 halo_y=30~-30
             [/teleport_sparkle_1_frame]
             [teleport_sparkle_2_frame]
                 duration=800
-                halo=misc/blank-hex.png:1,halo/teleport-9.png,halo/teleport-8.png,halo/teleport-1.png,halo/teleport-2.png,halo/teleport-3.png,halo/teleport-4.png,halo/teleport-5.png,halo/teleport-6.png,halo/teleport-7.png,halo/teleport-8.png,halo/teleport-9.png,misc/blank-hex.png:1
+                halo=misc/blank-hex.png:1,halo/teleport-[9,8,1-9].png,misc/blank-hex.png:1
                 halo_x=0
                 halo_y=40~-40
             [/teleport_sparkle_2_frame]
             [teleport_sparkle_3_frame]
                 duration=800
-                halo=misc/blank-hex.png:1,halo/teleport-9.png,halo/teleport-8.png,halo/teleport-1.png,halo/teleport-2.png,halo/teleport-3.png,halo/teleport-4.png,halo/teleport-5.png,halo/teleport-6.png,halo/teleport-7.png,halo/teleport-8.png,halo/teleport-9.png,misc/blank-hex.png:1
+                halo=misc/blank-hex.png:1,halo/teleport-[9,8,1-9].png,misc/blank-hex.png:1
                 halo_x=10
                 halo_y=30~-30
             [/teleport_sparkle_3_frame]
@@ -137,19 +137,19 @@
 
         	[teleport_sparkle_1_frame]
             	duration=800
-            	halo=misc/blank-hex.png:1,halo/teleport-9.png,halo/teleport-8.png,halo/teleport-1.png,halo/teleport-2.png,halo/teleport-3.png,halo/teleport-4.png,halo/teleport-5.png,halo/teleport-6.png,halo/teleport-7.png,halo/teleport-8.png,halo/teleport-9.png,misc/blank-hex.png:1
+            	halo=misc/blank-hex.png:1,halo/teleport-[9,8,1-9].png,misc/blank-hex.png:1
             	halo_x=10
             	halo_y=-30~30
         	[/teleport_sparkle_1_frame]
         	[teleport_sparkle_2_frame]
             	duration=800
-            	halo=misc/blank-hex.png:1,halo/teleport-9.png,halo/teleport-8.png,halo/teleport-1.png,halo/teleport-2.png,halo/teleport-3.png,halo/teleport-4.png,halo/teleport-5.png,halo/teleport-6.png,halo/teleport-7.png,halo/teleport-8.png,halo/teleport-9.png,misc/blank-hex.png:1
+            	halo=misc/blank-hex.png:1,halo/teleport-[9,8,1-9].png,misc/blank-hex.png:1
             	halo_x=0
             	halo_y=-40~40
         	[/teleport_sparkle_2_frame]
         	[teleport_sparkle_3_frame]
             	duration=800
-            	halo=misc/blank-hex.png:1,halo/teleport-9.png,halo/teleport-8.png,halo/teleport-1.png,halo/teleport-2.png,halo/teleport-3.png,halo/teleport-4.png,halo/teleport-5.png,halo/teleport-6.png,halo/teleport-7.png,halo/teleport-8.png,halo/teleport-9.png,misc/blank-hex.png:1
+            	halo=misc/blank-hex.png:1,halo/teleport-[9,8,1-9].png,misc/blank-hex.png:1
             	halo_x=-10
             	halo_y=-30~30
         	[/teleport_sparkle_3_frame]
Index: data/core/macros/animation-utils.cfg
===================================================================
--- data/core/macros/animation-utils.cfg	(revision 56058)
+++ data/core/macros/animation-utils.cfg	(working copy)
@@ -55,80 +55,8 @@
         [/halo_frame]
         [halo_frame]
             begin=-100
-            end=-80
-            halo="halo/misc/leadership-flare-1.png"
-            halo_x,halo_y={OFFSET_POSITION}
-        [/halo_frame]
-        [halo_frame]
-            begin=-80
-            end=-60
-            halo="halo/misc/leadership-flare-2.png"
-            halo_x,halo_y={OFFSET_POSITION}
-        [/halo_frame]
-        [halo_frame]
-            begin=-60
-            end=-40
-            halo="halo/misc/leadership-flare-3.png"
-            halo_x,halo_y={OFFSET_POSITION}
-        [/halo_frame]
-        [halo_frame]
-            begin=-40
-            end=-20
-            halo="halo/misc/leadership-flare-4.png"
-            halo_x,halo_y={OFFSET_POSITION}
-        [/halo_frame]
-        [halo_frame]
-            begin=-20
-            end=0
-            halo="halo/misc/leadership-flare-5.png"
-            halo_x,halo_y={OFFSET_POSITION}
-        [/halo_frame]
-        [halo_frame]
-            begin=0
-            end=20
-            halo="halo/misc/leadership-flare-6.png"
-            halo_x,halo_y={OFFSET_POSITION}
-        [/halo_frame]
-        [halo_frame]
-            begin=20
-            end=40
-            halo="halo/misc/leadership-flare-7.png"
-            halo_x,halo_y={OFFSET_POSITION}
-        [/halo_frame]
-        [halo_frame]
-            begin=40
-            end=60
-            halo="halo/misc/leadership-flare-8.png"
-            halo_x,halo_y={OFFSET_POSITION}
-        [/halo_frame]
-        [halo_frame]
-            begin=60
-            end=80
-            halo="halo/misc/leadership-flare-9.png"
-            halo_x,halo_y={OFFSET_POSITION}
-        [/halo_frame]
-        [halo_frame]
-            begin=80
-            end=100
-            halo="halo/misc/leadership-flare-10.png"
-            halo_x,halo_y={OFFSET_POSITION}
-        [/halo_frame]
-        [halo_frame]
-            begin=100
-            end=120
-            halo="halo/misc/leadership-flare-11.png"
-            halo_x,halo_y={OFFSET_POSITION}
-        [/halo_frame]
-        [halo_frame]
-            begin=120
-            end=140
-            halo="halo/misc/leadership-flare-12.png"
-            halo_x,halo_y={OFFSET_POSITION}
-        [/halo_frame]
-        [halo_frame]
-            begin=140
             end=160
-            halo="halo/misc/leadership-flare-13.png"
+            halo="halo/misc/leadership-flare-[1-13].png:20"
             halo_x,halo_y={OFFSET_POSITION}
         [/halo_frame]
         [halo_frame]
@@ -399,25 +327,15 @@
             range={RANGE}
         [/filter_attack]
         [frame]
-            duration=25
+            duration=50
             image={BASE_IMAGE}
-            halo=halo/elven/elven-shield-halo-20pct.png
+            halo=halo/elven/elven-shield-halo-[20,40]pct.png:25
         [/frame]
         [frame]
-            duration=25
-            image={BASE_IMAGE}
-            halo=halo/elven/elven-shield-halo-40pct.png
-        [/frame]
-        [frame]
-            duration=50
+            duration=100
             image={REACTION_IMAGE}
-            halo=halo/elven/elven-shield-halo-60pct.png
+            halo=halo/elven/elven-shield-halo-[60,80]pct.png:50
         [/frame]
-        [frame]
-            duration=50
-            image={REACTION_IMAGE}
-            halo=halo/elven/elven-shield-halo-80pct.png
-        [/frame]
         [if]
             hits=hit
             [frame]
@@ -441,20 +359,10 @@
             halo=halo/elven/elven-shield-halo-80pct.png
         [/frame]
         [frame]
-            duration=25
+            duration=75
             image={BASE_IMAGE}
-            halo=halo/elven/elven-shield-halo-60pct.png
+            halo=halo/elven/elven-shield-halo-[60,40,20]pct.png:25
         [/frame]
-        [frame]
-            duration=25
-            image={BASE_IMAGE}
-            halo=halo/elven/elven-shield-halo-40pct.png
-        [/frame]
-        [frame]
-            duration=25
-            image={BASE_IMAGE}
-            halo=halo/elven/elven-shield-halo-20pct.png
-        [/frame]
     [/defend]
 #enddef
 
@@ -611,139 +519,17 @@
         direction=n,ne,nw
 
         [missile_frame]
-            duration=30
-            halo="halo/holy/light-beam-1.png"
+            halo="halo/holy/light-beam-[1-6].png:30,halo/holy/light-beam-7.png:130,halo/holy/light-beam-[6-1].png:70"
             offset=1.0
         [/missile_frame]
-        [missile_frame]
-            duration=30
-            halo="halo/holy/light-beam-2.png"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=30
-            halo="halo/holy/light-beam-3.png"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=30
-            halo="halo/holy/light-beam-4.png"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=30
-            halo="halo/holy/light-beam-5.png"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=30
-            halo="halo/holy/light-beam-6.png"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=130
-            halo="halo/holy/light-beam-7.png"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=70
-            halo="halo/holy/light-beam-6.png"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=70
-            halo="halo/holy/light-beam-5.png"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=70
-            halo="halo/holy/light-beam-4.png"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=70
-            halo="halo/holy/light-beam-3.png"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=70
-            halo="halo/holy/light-beam-2.png"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=70
-            halo="halo/holy/light-beam-1.png"
-            offset=1.0
-        [/missile_frame]
     [/if]
     [else]
         direction=s,se,sw
 
         [missile_frame]
-            duration=30
-            halo="halo/holy/light-beam-1.png~FL(vert)"
+            halo="halo/holy/light-beam-[1-6].png~FL(vert):30,halo/holy/light-beam-7.png~FL(vert):130,halo/holy/light-beam-[6-1].png~FL(vert):70"
             offset=1.0
         [/missile_frame]
-        [missile_frame]
-            duration=30
-            halo="halo/holy/light-beam-2.png~FL(vert)"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=30
-            halo="halo/holy/light-beam-3.png~FL(vert)"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=30
-            halo="halo/holy/light-beam-4.png~FL(vert)"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=30
-            halo="halo/holy/light-beam-5.png~FL(vert)"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=30
-            halo="halo/holy/light-beam-6.png~FL(vert)"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=130
-            halo="halo/holy/light-beam-7.png~FL(vert)"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=70
-            halo="halo/holy/light-beam-6.png~FL(vert)"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=70
-            halo="halo/holy/light-beam-5.png~FL(vert)"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=70
-            halo="halo/holy/light-beam-4.png~FL(vert)"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=70
-            halo="halo/holy/light-beam-3.png~FL(vert)"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=70
-            halo="halo/holy/light-beam-2.png~FL(vert)"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=70
-            halo="halo/holy/light-beam-1.png~FL(vert)"
-            offset=1.0
-        [/missile_frame]
     [/else]
 #enddef
 
@@ -754,8 +540,7 @@
 
         [missile_frame]
             begin=-400
-            end=100
-            halo=projectiles/fire-breath-n-1.png:80,projectiles/fire-breath-n-2.png:80,projectiles/fire-breath-n-3.png:80,projectiles/fire-breath-n-4.png:80,projectiles/fire-breath-n-5.png:80
+            halo=projectiles/fire-breath-n-[1-5].png:80
             halo_x,halo_y={N_OFFSET_POSITION}
         [/missile_frame]
     [/if]
@@ -764,8 +549,7 @@
 
         [missile_frame]
             begin=-400
-            end=100
-            halo=projectiles/fire-breath-s-1.png:80,projectiles/fire-breath-s-2.png:80,projectiles/fire-breath-s-3.png:80,projectiles/fire-breath-s-4.png:80,projectiles/fire-breath-s-5.png:80
+            halo=projectiles/fire-breath-s-[1-5].png:80
             halo_x,halo_y={S_OFFSET_POSITION}
         [/missile_frame]
     [/else]
@@ -774,8 +558,7 @@
 
         [missile_frame]
             begin=-400
-            end=100
-            halo=projectiles/fire-breath-ne-1.png:80,projectiles/fire-breath-ne-2.png:80,projectiles/fire-breath-ne-3.png:80,projectiles/fire-breath-ne-4.png:80,projectiles/fire-breath-ne-5.png:80
+            halo=projectiles/fire-breath-ne-[1-5].png:80
             halo_x,halo_y={N_DIAGONAL_OFFSET_POSITION}
         [/missile_frame]
     [/else]
@@ -784,8 +567,7 @@
 
         [missile_frame]
             begin=-400
-            end=100
-            halo=projectiles/fire-breath-se-1.png:80,projectiles/fire-breath-se-2.png:80,projectiles/fire-breath-se-3.png:80,projectiles/fire-breath-se-4.png:80,projectiles/fire-breath-se-5.png:80
+            halo=projectiles/fire-breath-se-[1-5].png:80
             halo_x,halo_y={S_DIAGONAL_OFFSET_POSITION}
         [/missile_frame]
     [/else]
@@ -795,8 +577,7 @@
     # Animate a projectile for a fire-breath attack.
     [missile_frame]
         begin=-400
-        end=100
-        halo=projectiles/fire-breath-n-1.png:80,projectiles/fire-breath-n-2.png:80,projectiles/fire-breath-n-3.png:80,projectiles/fire-breath-n-4.png:80,projectiles/fire-breath-n-5.png:80
+        halo=projectiles/fire-breath-n-[1-5].png:80
         halo_x,halo_y={OFFSET_POSITION}
     [/missile_frame]
 #enddef
@@ -805,8 +586,7 @@
     # Animate a projectile for a fire-breath attack.
     [missile_frame]
         begin=-400
-        end=100
-        halo=projectiles/fire-breath-s-1.png:80,projectiles/fire-breath-s-2.png:80,projectiles/fire-breath-s-3.png:80,projectiles/fire-breath-s-4.png:80,projectiles/fire-breath-s-5.png:80
+        halo=projectiles/fire-breath-s-[1-5].png:80
         halo_x,halo_y={OFFSET_POSITION}
     [/missile_frame]
 #enddef
@@ -815,8 +595,7 @@
     # Animate a projectile for a fire-breath attack.
     [missile_frame]
         begin=-400
-        end=100
-        halo=projectiles/fire-breath-ne-1.png:80,projectiles/fire-breath-ne-2.png:80,projectiles/fire-breath-ne-3.png:80,projectiles/fire-breath-ne-4.png:80,projectiles/fire-breath-ne-5.png:80
+        halo=projectiles/fire-breath-ne-[1-5].png:80
         halo_x,halo_y={OFFSET_POSITION}
     [/missile_frame]
 #enddef
@@ -825,8 +604,7 @@
     # Animate a projectile for a fire-breath attack.
     [missile_frame]
         begin=-400
-        end=100
-        halo=projectiles/fire-breath-se-1.png:80,projectiles/fire-breath-se-2.png:80,projectiles/fire-breath-se-3.png:80,projectiles/fire-breath-se-4.png:80,projectiles/fire-breath-se-5.png:80
+        halo=projectiles/fire-breath-se-[1-5].png:80
         halo_x,halo_y={OFFSET_POSITION}
     [/missile_frame]
 #enddef
@@ -838,7 +616,7 @@
         end=-350
         image="projectiles/icemissile-n-1.png"
         image_diagonal="projectiles/icemissile-ne-1.png"
-        halo=halo/elven/ice-halo1.png:100,halo/elven/ice-halo2.png:100,halo/elven/ice-halo3.png:25
+        halo=halo/elven/ice-halo[1-3].png:[100,100,25]
         halo_x,halo_y=0,0
     [/missile_frame]
     [missile_frame]
@@ -846,7 +624,7 @@
         end=-200
         image="projectiles/icemissile-n-2.png"
         image_diagonal="projectiles/icemissile-ne-2.png"
-        halo=halo/elven/ice-halo3.png:75,halo/elven/ice-halo4.png:75
+        halo=halo/elven/ice-halo[3,4].png:75
         halo_x,halo_y=0,0
     [/missile_frame]
     [missile_frame]
@@ -854,7 +632,7 @@
         end=-50
         image="projectiles/icemissile-n-3.png"
         image_diagonal="projectiles/icemissile-ne-3.png"
-        halo=halo/elven/ice-halo5.png:100,halo/elven/ice-halo1.png:100,halo/elven/ice-halo2.png:50
+        halo=halo/elven/ice-halo[5,1,2].png:[100,100,50]
         halo_x,halo_y=0,0
     [/missile_frame]
     [missile_frame]
@@ -931,86 +709,11 @@
             offset=0.8~0.9
         [/missile_frame]
 
-        [missile_frame]
-            duration=60
-            halo="projectiles/fireball-impact-1.png"
+		[missile_frame]
+            duration=960
+            halo="projectiles/fireball-impact-[1-16].png:60"
             offset=1.0
         [/missile_frame]
-        [missile_frame]
-            duration=60
-            halo="projectiles/fireball-impact-2.png"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=60
-            halo="projectiles/fireball-impact-3.png"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=60
-            halo="projectiles/fireball-impact-4.png"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=60
-            halo="projectiles/fireball-impact-5.png"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=60
-            halo="projectiles/fireball-impact-6.png"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=60
-            halo="projectiles/fireball-impact-7.png"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=60
-            halo="projectiles/fireball-impact-8.png"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=60
-            halo="projectiles/fireball-impact-9.png"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=60
-            halo="projectiles/fireball-impact-10.png"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=60
-            halo="projectiles/fireball-impact-11.png"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=60
-            halo="projectiles/fireball-impact-12.png"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=60
-            halo="projectiles/fireball-impact-13.png"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=60
-            halo="projectiles/fireball-impact-14.png"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=60
-            halo="projectiles/fireball-impact-15.png"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=60
-            halo="projectiles/fireball-impact-16.png"
-            offset=1.0
-        [/missile_frame]
     [/if]
     [else]
         direction=s,se,sw
@@ -1047,86 +750,11 @@
             offset=0.8~0.9
         [/missile_frame]
 
-        [missile_frame]
-            duration=60
-            halo="projectiles/fireball-impact-1.png~FL(vert)"
+		[missile_frame]
+            duration=960
+            halo="projectiles/fireball-impact-[1-16].png~FL(vert):60"
             offset=1.0
         [/missile_frame]
-        [missile_frame]
-            duration=60
-            halo="projectiles/fireball-impact-2.png~FL(vert)"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=60
-            halo="projectiles/fireball-impact-3.png~FL(vert)"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=60
-            halo="projectiles/fireball-impact-4.png~FL(vert)"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=60
-            halo="projectiles/fireball-impact-5.png~FL(vert)"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=60
-            halo="projectiles/fireball-impact-6.png~FL(vert)"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=60
-            halo="projectiles/fireball-impact-7.png~FL(vert)"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=60
-            halo="projectiles/fireball-impact-8.png~FL(vert)"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=60
-            halo="projectiles/fireball-impact-9.png~FL(vert)"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=60
-            halo="projectiles/fireball-impact-10.png~FL(vert)"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=60
-            halo="projectiles/fireball-impact-11.png~FL(vert)"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=60
-            halo="projectiles/fireball-impact-12.png~FL(vert)"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=60
-            halo="projectiles/fireball-impact-13.png~FL(vert)"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=60
-            halo="projectiles/fireball-impact-14.png~FL(vert)"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=60
-            halo="projectiles/fireball-impact-15.png~FL(vert)"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            duration=60
-            halo="projectiles/fireball-impact-16.png~FL(vert)"
-            offset=1.0
-        [/missile_frame]
     [/else]
     [else]
         direction=n,ne,nw
@@ -1135,33 +763,9 @@
         missile_offset=0.0~0.20,0.20~0.35,0.35~0.40,0.4~0.45
 
         [missile_frame]
-            duration=100
-            halo="projectiles/fireball-fail-1.png"
+            duration=700
+            halo="projectiles/fireball-fail-[1-7].png:100"
         [/missile_frame]
-        [missile_frame]
-            duration=100
-            halo="projectiles/fireball-fail-2.png"
-        [/missile_frame]
-        [missile_frame]
-            duration=100
-            halo="projectiles/fireball-fail-3.png"
-        [/missile_frame]
-        [missile_frame]
-            duration=100
-            halo="projectiles/fireball-fail-4.png"
-        [/missile_frame]
-        [missile_frame]
-            duration=100
-            halo="projectiles/fireball-fail-5.png"
-        [/missile_frame]
-        [missile_frame]
-            duration=100
-            halo="projectiles/fireball-fail-6.png"
-        [/missile_frame]
-        [missile_frame]
-            duration=100
-            halo="projectiles/fireball-fail-7.png"
-        [/missile_frame]
     [/else]
     [else]
         direction=s,se,sw
@@ -1170,66 +774,18 @@
         missile_offset=0.0~0.20,0.20~0.35,0.35~0.40,0.4~0.45
 
         [missile_frame]
-            duration=100
-            halo="projectiles/fireball-fail-1.png~FL(vert)"
+            duration=700
+            halo="projectiles/fireball-fail-[1-7].png~FL(vert):100"
         [/missile_frame]
-        [missile_frame]
-            duration=100
-            halo="projectiles/fireball-fail-2.png~FL(vert)"
-        [/missile_frame]
-        [missile_frame]
-            duration=100
-            halo="projectiles/fireball-fail-3.png~FL(vert)"
-        [/missile_frame]
-        [missile_frame]
-            duration=100
-            halo="projectiles/fireball-fail-4.png~FL(vert)"
-        [/missile_frame]
-        [missile_frame]
-            duration=100
-            halo="projectiles/fireball-fail-5.png~FL(vert)"
-        [/missile_frame]
-        [missile_frame]
-            duration=100
-            halo="projectiles/fireball-fail-6.png~FL(vert)"
-        [/missile_frame]
-        [missile_frame]
-            duration=100
-            halo="projectiles/fireball-fail-7.png~FL(vert)"
-        [/missile_frame]
     [/else]
 #enddef
 
 #define HALO_FRAME_SAURIAN
     halo_auto_vflip=false
     [halo_frame]
-        duration=60
-        halo=halo/saurian-magic-halo-1.png
+        duration=420
+        halo=halo/saurian-magic-halo-[1-7].png:60
     [/halo_frame]
-    [halo_frame]
-        duration=60
-        halo=halo/saurian-magic-halo-2.png
-    [/halo_frame]
-    [halo_frame]
-        duration=60
-        halo=halo/saurian-magic-halo-3.png
-    [/halo_frame]
-    [halo_frame]
-        duration=60
-        halo=halo/saurian-magic-halo-4.png
-    [/halo_frame]
-    [halo_frame]
-        duration=60
-        halo=halo/saurian-magic-halo-5.png
-    [/halo_frame]
-    [halo_frame]
-        duration=60
-        halo=halo/saurian-magic-halo-6.png
-    [/halo_frame]
-    [halo_frame]
-        duration=60
-        halo=halo/saurian-magic-halo-7.png
-    [/halo_frame]
 #enddef
 
 #define MISSILE_FRAME_ICE
@@ -1245,51 +801,9 @@
         [/missile_frame]
         [missile_frame]
             begin=0
-            end=50
-            halo="projectiles/whitemissile-impact-1.png"
-            offset=0.8
-        [/missile_frame]
-        [missile_frame]
-            begin=50
-            end=100
-            halo="projectiles/whitemissile-impact-2.png"
-            offset=0.92
-        [/missile_frame]
-        [missile_frame]
-            begin=100
-            end=150
-            halo="projectiles/whitemissile-impact-3.png"
-            offset=0.94
-        [/missile_frame]
-        [missile_frame]
-            begin=150
-            end=200
-            halo="projectiles/whitemissile-impact-4.png"
-            offset=0.96
-        [/missile_frame]
-        [missile_frame]
-            begin=200
-            end=250
-            halo="projectiles/whitemissile-impact-5.png"
-            offset=0.98
-        [/missile_frame]
-        [missile_frame]
-            begin=250
-            end=300
-            halo="projectiles/whitemissile-impact-6.png"
-            offset=1.0
-        [/missile_frame]
-        [missile_frame]
-            begin=300
-            end=350
-            halo="projectiles/whitemissile-impact-7.png"
-            offset=1.02
-        [/missile_frame]
-        [missile_frame]
-            begin=350
             end=400
-            halo="projectiles/whitemissile-impact-8.png"
-            offset=1.04
+            halo="projectiles/whitemissile-impact-[1-8].png:50"
+            offset=0.8,0.92,0.94,0.96,0.98,1.0,1.02,1.04
         [/missile_frame]
     [/if]
     [else]
@@ -1399,8 +913,7 @@
 
         [missile_frame]
             begin=-250
-            end=150
-            halo=halo/lightning-bolt-{DIRECTION_NUMBER}-1.png~FL(vert):100,halo/lightning-bolt-{DIRECTION_NUMBER}-2.png~FL(vert):100,halo/lightning-bolt-{DIRECTION_NUMBER}-3.png~FL(vert):100,halo/lightning-bolt-{DIRECTION_NUMBER}-4.png~FL(vert):100
+            halo=halo/lightning-bolt-{DIRECTION_NUMBER}-[1-4].png~FL(vert):100
             halo_y=-125
             offset=1.0
         [/missile_frame]
@@ -1410,8 +923,7 @@
 
         [missile_frame]
             begin=-250
-            end=150
-            halo=halo/lightning-bolt-{DIRECTION_NUMBER}-1.png:100,halo/lightning-bolt-{DIRECTION_NUMBER}-2.png:100,halo/lightning-bolt-{DIRECTION_NUMBER}-3.png:100,halo/lightning-bolt-{DIRECTION_NUMBER}-4.png:100
+            halo=halo/lightning-bolt-{DIRECTION_NUMBER}-[1-4].png:100
             halo_y=-125
             offset=1.0
         [/missile_frame]
@@ -1427,33 +939,33 @@
 
     [magic_missile_frame]
         duration=400
-        halo=halo/mage-halo1.png,halo/mage-halo2.png,halo/mage-halo3.png,halo/mage-halo4.png,halo/mage-halo5.png
+        halo=halo/mage-halo[1-5].png
         halo_x={OFFSET_X}~0
         halo_y={OFFSET_Y}~-54
         offset=0.001~-0.083,-0.083~-0.25,-0.25~-0.5
     [/magic_missile_frame]
     [magic_missile_frame]
         duration=350
-        halo=halo/mage-halo1.png,halo/mage-halo2.png,halo/mage-halo3.png,halo/mage-halo4.png,halo/mage-halo5.png,misc/blank-hex.png:1
+        halo=halo/mage-halo[1-5].png,misc/blank-hex.png:1
         halo_y=-54~-45,-45~-27,-27~0
         offset=-0.5~-0.25,-0.25~0.25,0.25~1.0
     [/magic_missile_frame]
 
     [magic_missile_trail_1_frame]
         duration=350
-        halo=misc/blank-hex.png:40,halo/mage-preparation-halo1.png,halo/mage-preparation-halo2.png,halo/mage-preparation-halo3.png,halo/mage-preparation-halo4.png,halo/mage-preparation-halo5.png,halo/mage-preparation-halo6.png,halo/mage-preparation-halo7.png,misc/blank-hex.png:1
+        halo=misc/blank-hex.png:40,halo/mage-preparation-halo[1-7].png,misc/blank-hex.png:1
         halo_y=-54:40,-54~-45,-45~-27,-27~0
         offset=0.001:40,-0.5~-0.25,-0.25~0.25,0.25~1.0
     [/magic_missile_trail_1_frame]
     [magic_missile_trail_2_frame]
         duration=350
-        halo=misc/blank-hex.png:80,halo/mage-preparation-halo1.png,halo/mage-preparation-halo2.png,halo/mage-preparation-halo3.png,halo/mage-preparation-halo4.png,halo/mage-preparation-halo5.png,halo/mage-preparation-halo6.png,halo/mage-preparation-halo7.png,misc/blank-hex.png:1
+        halo=misc/blank-hex.png:80,halo/mage-preparation-halo[1-7].png,misc/blank-hex.png:1
         halo_y=-54:80,-54~-45,-45~-27,-27~0
         offset=0.001:80,-0.5~-0.25,-0.25~0.25,0.25~1.0
     [/magic_missile_trail_2_frame]
     [magic_missile_trail_3_frame]
         duration=350
-        halo=misc/blank-hex.png:120,halo/mage-preparation-halo1.png,halo/mage-preparation-halo2.png,halo/mage-preparation-halo3.png,halo/mage-preparation-halo4.png,halo/mage-preparation-halo5.png,halo/mage-preparation-halo6.png,halo/mage-preparation-halo7.png,misc/blank-hex.png:1
+        halo=misc/blank-hex.png:120,halo/mage-preparation-halo[1-7].png,misc/blank-hex.png:1
         halo_y=-54:120,-54~-45,-45~-27,-27~0
         offset=0.001:120,-0.5~-0.25,-0.25~0.25,0.25~1.0
     [/magic_missile_trail_3_frame]
@@ -1464,7 +976,7 @@
 
     [magic_missile_flare_frame]
         duration={DURATION_TIME}
-        halo=halo/mage-preparation-halo1.png,halo/mage-preparation-halo2.png,halo/mage-preparation-halo3.png,halo/mage-preparation-halo4.png,halo/mage-preparation-halo5.png,halo/mage-preparation-halo6.png,halo/mage-preparation-halo7.png,misc/blank-hex.png:1
+        halo=halo/mage-preparation-halo[1-7].png,misc/blank-hex.png:1
         halo_x={OFFSET_X}
         halo_y={OFFSET_Y}
         offset=0
@@ -1474,41 +986,11 @@
 #define MERMAID_STAFF_FLARE OFFSET_X OFFSET_Y
     flare_start_time=-420
     [flare_frame]
-        duration=60
-        halo=halo/merfolk/staff-flare-1.png
+        duration=420
+        halo=halo/merfolk/staff-flare-[1-7].png:60
         halo_x,halo_y={OFFSET_X},{OFFSET_Y}
     [/flare_frame]
     [flare_frame]
-        duration=60
-        halo=halo/merfolk/staff-flare-2.png
-        halo_x,halo_y={OFFSET_X},{OFFSET_Y}
-    [/flare_frame]
-    [flare_frame]
-        duration=60
-        halo=halo/merfolk/staff-flare-3.png
-        halo_x,halo_y={OFFSET_X},{OFFSET_Y}
-    [/flare_frame]
-    [flare_frame]
-        duration=60
-        halo=halo/merfolk/staff-flare-4.png
-        halo_x,halo_y={OFFSET_X},{OFFSET_Y}
-    [/flare_frame]
-    [flare_frame]
-        duration=60
-        halo=halo/merfolk/staff-flare-5.png
-        halo_x,halo_y={OFFSET_X},{OFFSET_Y}
-    [/flare_frame]
-    [flare_frame]
-        duration=60
-        halo=halo/merfolk/staff-flare-6.png
-        halo_x,halo_y={OFFSET_X},{OFFSET_Y}
-    [/flare_frame]
-    [flare_frame]
-        duration=60
-        halo=halo/merfolk/staff-flare-7.png
-        halo_x,halo_y={OFFSET_X},{OFFSET_Y}
-    [/flare_frame]
-    [flare_frame]
         duration=10
     [/flare_frame]
 #enddef
@@ -1516,31 +998,11 @@
 #define MERMAID_WATER_BLAST_HALO
     water_start_time=-420
     [water_frame]
-        duration=60
-        halo=halo/merfolk/water-halo-1.png
+        duration=360
+        halo=halo/merfolk/water-halo-[1-6].png:60
     [/water_frame]
     [water_frame]
         duration=60
-        halo=halo/merfolk/water-halo-2.png
-    [/water_frame]
-    [water_frame]
-        duration=60
-        halo=halo/merfolk/water-halo-3.png
-    [/water_frame]
-    [water_frame]
-        duration=60
-        halo=halo/merfolk/water-halo-4.png
-    [/water_frame]
-    [water_frame]
-        duration=60
-        halo=halo/merfolk/water-halo-5.png
-    [/water_frame]
-    [water_frame]
-        duration=60
-        halo=halo/merfolk/water-halo-6.png
-    [/water_frame]
-    [water_frame]
-        duration=60
         halo=halo/merfolk/water-halo-7.png
     [/water_frame]
     [water_frame]
@@ -1552,21 +1014,8 @@
     missile_start_time=-250
     missile_offset=0.1
     [missile_frame]
-        duration=100
-        halo="projectiles/misfire-spark-1.png"
+        halo="projectiles/misfire-spark-[1-4].png:100"
     [/missile_frame]
-    [missile_frame]
-        duration=100
-        halo="projectiles/misfire-spark-2.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=100
-        halo="projectiles/misfire-spark-3.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=100
-        halo="projectiles/misfire-spark-4.png"
-    [/missile_frame]
 #enddef
 #define MISSILE_FRAME_MUZZLE_FLARE_HIT_NORTH START_X START_Y
     missile_start_time=-250
@@ -1574,61 +1023,8 @@
     missile_halo_x={START_X}~0
     missile_halo_y={START_Y}~0
     [missile_frame]
-        duration=100
-        halo="projectiles/muzzle-flash-n-1.png"
+        halo="projectiles/muzzle-flash-n-[1-3].png:[100,80,70],projectiles/muzzle-flash-[4-14].png:60"
     [/missile_frame]
-    [missile_frame]
-        duration=80
-        halo="projectiles/muzzle-flash-n-2.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=70
-        halo="projectiles/muzzle-flash-n-3.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-4.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-5.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-6.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-7.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-8.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-9.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-10.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-11.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-12.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-13.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-14.png"
-    [/missile_frame]
 #enddef
 #define MISSILE_FRAME_MUZZLE_FLARE_HIT_SOUTH START_X START_Y
     missile_start_time=-250
@@ -1636,61 +1032,8 @@
     missile_halo_x={START_X}~0
     missile_halo_y={START_Y}~0
     [missile_frame]
-        duration=100
-        halo="projectiles/muzzle-flash-s-1.png~FL(vertical)"
+        halo="projectiles/muzzle-flash-s-[1-3].png~FL(vertical):[100,80,70],projectiles/muzzle-flash-[4-14].png:60"
     [/missile_frame]
-    [missile_frame]
-        duration=80
-        halo="projectiles/muzzle-flash-s-2.png~FL(vertical)"
-    [/missile_frame]
-    [missile_frame]
-        duration=70
-        halo="projectiles/muzzle-flash-s-3.png~FL(vertical)"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-4.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-5.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-6.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-7.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-8.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-9.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-10.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-11.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-12.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-13.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-14.png"
-    [/missile_frame]
 #enddef
 #define MISSILE_FRAME_MUZZLE_FLARE_HIT_DIAG_NORTH START_X START_Y
     missile_start_time=-250
@@ -1698,61 +1041,8 @@
     missile_halo_x={START_X}~0
     missile_halo_y={START_Y}~0
     [missile_frame]
-        duration=100
-        halo="projectiles/muzzle-flash-ne-1.png"
+        halo="projectiles/muzzle-flash-ne-[1-3].png:[100,80,70],projectiles/muzzle-flash-[4-14].png:60"
     [/missile_frame]
-    [missile_frame]
-        duration=80
-        halo="projectiles/muzzle-flash-ne-2.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=70
-        halo="projectiles/muzzle-flash-ne-3.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-4.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-5.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-6.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-7.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-8.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-9.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-10.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-11.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-12.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-13.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-14.png"
-    [/missile_frame]
 #enddef
 #define MISSILE_FRAME_MUZZLE_FLARE_HIT_DIAG_SOUTH START_X START_Y
     missile_start_time=-250
@@ -1760,61 +1050,8 @@
     missile_halo_x={START_X}~0
     missile_halo_y={START_Y}~0
     [missile_frame]
-        duration=100
-        halo="projectiles/muzzle-flash-se-1.png~FL(vertical)"
+        halo="projectiles/muzzle-flash-se-[1-3].png~FL(vertical):[100,80,70],projectiles/muzzle-flash-[4-14].png:60"
     [/missile_frame]
-    [missile_frame]
-        duration=80
-        halo="projectiles/muzzle-flash-se-2.png~FL(vertical)"
-    [/missile_frame]
-    [missile_frame]
-        duration=70
-        halo="projectiles/muzzle-flash-se-3.png~FL(vertical)"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-4.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-5.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-6.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-7.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-8.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-9.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-10.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-11.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-12.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-13.png"
-    [/missile_frame]
-    [missile_frame]
-        duration=60
-        halo="projectiles/muzzle-flash-14.png"
-    [/missile_frame]
 #enddef
 
 #define MISSILE_FRAME_STONE_HIT OFFSET_X OFFSET_Y
@@ -1999,7 +1236,7 @@
         impact_burst_start_time=-160
         [impact_burst_frame]
             duration=320
-            halo=misc/blank-hex.png:1,projectiles/fire-burst-small-1.png:39,projectiles/fire-burst-small-2.png:40,projectiles/fire-burst-small-3.png:40,projectiles/fire-burst-small-4.png:40,projectiles/fire-burst-small-5.png:40,projectiles/fire-burst-small-6.png:40,projectiles/fire-burst-small-7.png:40,projectiles/fire-burst-small-8.png:39,misc/blank-hex.png:1
+            halo=misc/blank-hex.png:1,projectiles/fire-burst-small-[1-8].png:[39,40,40,40,40,40,40,39],misc/blank-hex.png:1
             offset=1.0
             layer=1
         [/impact_burst_frame]
@@ -2011,35 +1248,35 @@
         flame_trail_5_start_time=-250
         [flame_trail_1_frame]
             duration=500
-            halo=misc/blank-hex.png:1,projectiles/fire-breath-1.png:49,projectiles/fire-breath-2.png:50,projectiles/fire-breath-3.png:50,projectiles/fire-breath-4.png:50,projectiles/fire-breath-5.png:50,projectiles/fire-breath-6.png:50,projectiles/fire-breath-7.png:50,projectiles/fire-breath-8.png:50,projectiles/fire-breath-9.png:50,projectiles/fire-breath-10.png:49,misc/blank-hex.png:1
+            halo=misc/blank-hex.png:1,projectiles/fire-breath-[1-10].png:[49,50,50,50,50,50,50,50,50,49],misc/blank-hex.png:1
             halo_x={OFFSET_X}~0:300,0
             halo_y={OFFSET_Y}~0:300,0
             offset=0.0~1.0:300,1.0~1.25:200
         [/flame_trail_1_frame]
         [flame_trail_2_frame]
             duration=500
-            halo=misc/blank-hex.png:1,projectiles/fire-breath-1.png:49,projectiles/fire-breath-2.png:50,projectiles/fire-breath-3.png:50,projectiles/fire-breath-4.png:50,projectiles/fire-breath-5.png:50,projectiles/fire-breath-6.png:50,projectiles/fire-breath-7.png:50,projectiles/fire-breath-8.png:50,projectiles/fire-breath-9.png:50,projectiles/fire-breath-10.png:49,misc/blank-hex.png:1
+            halo=misc/blank-hex.png:1,projectiles/fire-breath-[1-10].png:[49,50,50,50,50,50,50,50,50,49],misc/blank-hex.png:1
             halo_x={OFFSET_X}~0:300,0
             halo_y={OFFSET_Y}~0:300,0
             offset=0.0~1.0:300,1.0~1.20:200
         [/flame_trail_2_frame]
         [flame_trail_3_frame]
             duration=500
-            halo=misc/blank-hex.png:1,projectiles/fire-breath-1.png:49,projectiles/fire-breath-2.png:50,projectiles/fire-breath-3.png:50,projectiles/fire-breath-4.png:50,projectiles/fire-breath-5.png:50,projectiles/fire-breath-6.png:50,projectiles/fire-breath-7.png:50,projectiles/fire-breath-8.png:50,projectiles/fire-breath-9.png:50,projectiles/fire-breath-10.png:49,misc/blank-hex.png:1
+            halo=misc/blank-hex.png:1,projectiles/fire-breath-[1-10].png:[49,50,50,50,50,50,50,50,50,49],misc/blank-hex.png:1
             halo_x={OFFSET_X}~0:300,0
             halo_y={OFFSET_Y}~0:300,0
             offset=0.0~1.0:300,1.0~1.15:200
         [/flame_trail_3_frame]
         [flame_trail_4_frame]
             duration=500
-            halo=misc/blank-hex.png:1,projectiles/fire-breath-1.png:49,projectiles/fire-breath-2.png:50,projectiles/fire-breath-3.png:50,projectiles/fire-breath-4.png:50,projectiles/fire-breath-5.png:50,projectiles/fire-breath-6.png:50,projectiles/fire-breath-7.png:50,projectiles/fire-breath-8.png:50,projectiles/fire-breath-9.png:50,projectiles/fire-breath-10.png:49,misc/blank-hex.png:1
+            halo=misc/blank-hex.png:1,projectiles/fire-breath-[1-10].png:[49,50,50,50,50,50,50,50,50,49],misc/blank-hex.png:1
             halo_x={OFFSET_X}~0:300,0
             halo_y={OFFSET_Y}~0:300,0
             offset=0.0~1.0:300,1.0~1.10:200
         [/flame_trail_4_frame]
         [flame_trail_5_frame]
             duration=500
-            halo=misc/blank-hex.png:1,projectiles/fire-breath-1.png:49,projectiles/fire-breath-2.png:50,projectiles/fire-breath-3.png:50,projectiles/fire-breath-4.png:50,projectiles/fire-breath-5.png:50,projectiles/fire-breath-6.png:50,projectiles/fire-breath-7.png:50,projectiles/fire-breath-8.png:50,projectiles/fire-breath-9.png:50,projectiles/fire-breath-10.png:49,misc/blank-hex.png:1
+            halo=misc/blank-hex.png:1,projectiles/fire-breath-[1-10].png:[49,50,50,50,50,50,50,50,50,49],misc/blank-hex.png:1
             halo_x={OFFSET_X}~0:300,0
             halo_y={OFFSET_Y}~0:300,0
             offset=0.0~1.0:300,1.0~1.05:200
@@ -2105,35 +1342,35 @@
         flame_trail_5_start_time=-250
         [flame_trail_1_frame]
             duration=500
-            halo=misc/blank-hex.png:1,projectiles/fire-breath-1.png:49,projectiles/fire-breath-2.png:50,projectiles/fire-breath-3.png:50,projectiles/fire-breath-4.png:50,projectiles/fire-breath-5.png:50,projectiles/fire-breath-6.png:50,projectiles/fire-breath-7.png:50,projectiles/fire-breath-8.png:50,projectiles/fire-breath-9.png:50,projectiles/fire-breath-10.png:49,misc/blank-hex.png:1
+            halo=misc/blank-hex.png:1,projectiles/fire-breath-[1-10].png:[49,50,50,50,50,50,50,50,50,49],misc/blank-hex.png:1
             halo_x={OFFSET_X}~0:300,0
             halo_y={OFFSET_Y}~0:300,0
             offset=0.0~1.0:300,1.0~1.5:200
         [/flame_trail_1_frame]
         [flame_trail_2_frame]
             duration=500
-            halo=misc/blank-hex.png:1,projectiles/fire-breath-1.png:49,projectiles/fire-breath-2.png:50,projectiles/fire-breath-3.png:50,projectiles/fire-breath-4.png:50,projectiles/fire-breath-5.png:50,projectiles/fire-breath-6.png:50,projectiles/fire-breath-7.png:50,projectiles/fire-breath-8.png:50,projectiles/fire-breath-9.png:50,projectiles/fire-breath-10.png:49,misc/blank-hex.png:1
+            halo=misc/blank-hex.png:1,projectiles/fire-breath-[1-10].png:[49,50,50,50,50,50,50,50,50,49],misc/blank-hex.png:1
             halo_x={OFFSET_X}~0:300,0
             halo_y={OFFSET_Y}~0:300,0
             offset=0.0~1.0:300,1.0~1.4:200
         [/flame_trail_2_frame]
         [flame_trail_3_frame]
             duration=500
-            halo=misc/blank-hex.png:1,projectiles/fire-breath-1.png:49,projectiles/fire-breath-2.png:50,projectiles/fire-breath-3.png:50,projectiles/fire-breath-4.png:50,projectiles/fire-breath-5.png:50,projectiles/fire-breath-6.png:50,projectiles/fire-breath-7.png:50,projectiles/fire-breath-8.png:50,projectiles/fire-breath-9.png:50,projectiles/fire-breath-10.png:49,misc/blank-hex.png:1
+            halo=misc/blank-hex.png:1,projectiles/fire-breath-[1-10].png:[49,50,50,50,50,50,50,50,50,49],misc/blank-hex.png:1
             halo_x={OFFSET_X}~0:300,0
             halo_y={OFFSET_Y}~0:300,0
             offset=0.0~1.0:300,1.0~1.3:200
         [/flame_trail_3_frame]
         [flame_trail_4_frame]
             duration=500
-            halo=misc/blank-hex.png:1,projectiles/fire-breath-1.png:49,projectiles/fire-breath-2.png:50,projectiles/fire-breath-3.png:50,projectiles/fire-breath-4.png:50,projectiles/fire-breath-5.png:50,projectiles/fire-breath-6.png:50,projectiles/fire-breath-7.png:50,projectiles/fire-breath-8.png:50,projectiles/fire-breath-9.png:50,projectiles/fire-breath-10.png:49,misc/blank-hex.png:1
+            halo=misc/blank-hex.png:1,projectiles/fire-breath-[1-10].png:[49,50,50,50,50,50,50,50,50,49],misc/blank-hex.png:1
             halo_x={OFFSET_X}~0:300,0
             halo_y={OFFSET_Y}~0:300,0
             offset=0.0~1.0:300,1.0~1.2:200
         [/flame_trail_4_frame]
         [flame_trail_5_frame]
             duration=500
-            halo=misc/blank-hex.png:1,projectiles/fire-breath-1.png:49,projectiles/fire-breath-2.png:50,projectiles/fire-breath-3.png:50,projectiles/fire-breath-4.png:50,projectiles/fire-breath-5.png:50,projectiles/fire-breath-6.png:50,projectiles/fire-breath-7.png:50,projectiles/fire-breath-8.png:50,projectiles/fire-breath-9.png:50,projectiles/fire-breath-10.png:49,misc/blank-hex.png:1
+            halo=misc/blank-hex.png:1,projectiles/fire-breath-[1-10].png:[49,50,50,50,50,50,50,50,50,49],misc/blank-hex.png:1
             halo_x={OFFSET_X}~0:300,0
             halo_y={OFFSET_Y}~0:300,0
             offset=0.0~1.0:300,1.0~1.1:200
@@ -2193,7 +1430,7 @@
         [missile_frame]
             begin=-400
             end=100
-            halo=projectiles/fire-breath-se-1.png:80,projectiles/fire-breath-se-2.png:80,projectiles/fire-breath-se-3.png:80,projectiles/fire-breath-se-4.png:80,projectiles/fire-breath-se-5.png:80
+            halo=projectiles/fire-breath-se-[1-5].png:80
             halo_x,halo_y={OFFSET_POSITION}
         [/missile_frame]
         start_time=-900
@@ -2267,7 +1504,7 @@
         [missile_frame]
             begin=-400
             end=100
-            halo=projectiles/fire-breath-ne-1.png:80,projectiles/fire-breath-ne-2.png:80,projectiles/fire-breath-ne-3.png:80,projectiles/fire-breath-ne-4.png:80,projectiles/fire-breath-ne-5.png:80
+            halo=projectiles/fire-breath-ne-[1-5].png:80
             halo_x,halo_y={OFFSET_POSITION}
         [/missile_frame]
         start_time=-900
@@ -2341,7 +1578,7 @@
         [missile_frame]
             begin=-400
             end=100
-            halo=projectiles/fire-breath-s-1.png:80,projectiles/fire-breath-s-2.png:80,projectiles/fire-breath-s-3.png:80,projectiles/fire-breath-s-4.png:80,projectiles/fire-breath-s-5.png:80
+            halo=projectiles/fire-breath-s-[1-5].png:80
             halo_x,halo_y={OFFSET_POSITION}
         [/missile_frame]
         start_time=-900
@@ -2415,7 +1652,7 @@
         [missile_frame]
             begin=-400
             end=100
-            halo=projectiles/fire-breath-n-1.png:80,projectiles/fire-breath-n-2.png:80,projectiles/fire-breath-n-3.png:80,projectiles/fire-breath-n-4.png:80,projectiles/fire-breath-n-5.png:80
+            halo=projectiles/fire-breath-n-[1-5].png:80
             halo_x,halo_y={OFFSET_POSITION}
         [/missile_frame]
         start_time=-900
Index: data/core/macros/image-utils.cfg
===================================================================
--- data/core/macros/image-utils.cfg	(revision 56058)
+++ data/core/macros/image-utils.cfg	(working copy)
@@ -207,7 +207,7 @@
             y=0
             [image]
                 layer=0
-                name="misc/fire-A01.png:140,misc/fire-A02.png:140,misc/fire-A03.png:140,misc/fire-A04.png:140,misc/fire-A05.png:140,misc/fire-A06.png:140,misc/fire-A07.png:140,misc/fire-A08.png:140"
+                name="misc/fire-A[01-08].png:140"
             [/image]
         [/tile]
     [/terrain_graphics]
@@ -226,7 +226,7 @@
                 layer=0
                 # wmlscope: start ignoring
                 # FIXME: More implicit-path breakage
-                name="../items/brazier-lit1.png:140,../items/brazier-lit2.png:140,../items/brazier-lit3.png:140,../items/brazier-lit4.png:140,../items/brazier-lit5.png:140,../items/brazier-lit6.png:140,../items/brazier-lit7.png:140,../items/brazier-lit8.png:140"
+                name="../items/brazier-lit[1-8].png:140"
                 # wmlscope: stop ignoring
             [/image]
         [/tile]
@@ -238,7 +238,7 @@
     # long, undead, or wood-elvish. Use within a [side] block; only
     # affects that side.
     # wmlscope: start ignoring
-    flag=flags/{NAME}-flag-1.png:150,flags/{NAME}-flag-2.png:150,flags/{NAME}-flag-3.png:150,flags/{NAME}-flag-4.png:150
+    flag=flags/{NAME}-flag-[1-4].png:150
     flag_icon=flags/{NAME}-flag-icon.png
     # wmlscope: stop ignoring
 #enddef
@@ -271,7 +271,7 @@
             center=92,138
             # wmlscope: start ignoring
             # FIXME: More implicit-path breakage
-            name="../scenery/mausoleum01.png:140,../scenery/mausoleum02.png:140,../scenery/mausoleum03.png:140,../scenery/mausoleum04.png:140,../scenery/mausoleum05.png:140,../scenery/mausoleum06.png:140,../scenery/mausoleum07.png:140,../scenery/mausoleum08.png:140,../scenery/mausoleum09.png:140,../scenery/mausoleum10.png:140,../scenery/mausoleum11.png:140,../scenery/mausoleum12.png:140,../scenery/mausoleum13.png:140,../scenery/mausoleum14.png:140,../scenery/mausoleum15.png:140,../scenery/mausoleum16.png:140,../scenery/mausoleum17.png:140,../scenery/mausoleum18.png:140"
+            name="../scenery/mausoleum[01-18].png:140"
             # wmlscope: stop ignoring
         [/image]
     [/terrain_graphics]
Index: data/core/units/humans/Mage_of_Light.cfg
===================================================================
--- data/core/units/humans/Mage_of_Light.cfg	(revision 56058)
+++ data/core/units/humans/Mage_of_Light.cfg	(working copy)
@@ -55,45 +55,9 @@
         [/frame]
         [frame]
             begin=-375
-            end=-300
-            image="units/human-magi/white-cleric-magic-3.png"
-            halo=halo/holy/halo6.png
-        [/frame]
-        [frame]
-            begin=-300
-            end=-225
-            image="units/human-magi/white-cleric-magic-3.png"
-            halo=halo/holy/halo1.png
-        [/frame]
-        [frame]
-            begin=-225
-            end=-150
-            image="units/human-magi/white-cleric-magic-3.png"
-            halo=halo/holy/halo2.png
-        [/frame]
-        [frame]
-            begin=-150
-            end=-75
-            image="units/human-magi/white-cleric-magic-3.png"
-            halo=halo/holy/halo3.png
-        [/frame]
-        [frame]
-            begin=-75
-            end=0
-            image="units/human-magi/white-cleric-magic-3.png"
-            halo=halo/holy/halo4.png
-        [/frame]
-        [frame]
-            begin=0
-            end=75
-            image="units/human-magi/white-cleric-magic-3.png"
-            halo=halo/holy/halo5.png
-        [/frame]
-        [frame]
-            begin=75
             end=150
             image="units/human-magi/white-cleric-magic-3.png"
-            halo=halo/holy/halo6.png
+            halo=halo/holy/halo[6,1-6].png:75
         [/frame]
         [frame]
             begin=150
Index: data/core/units/humans/Mage_White.cfg
===================================================================
--- data/core/units/humans/Mage_White.cfg	(revision 56058)
+++ data/core/units/humans/Mage_White.cfg	(working copy)
@@ -52,45 +52,9 @@
         [/frame]
         [frame]
             begin=-375
-            end=-300
-            image="units/human-magi/white-mage-magic-3.png"
-            halo=halo/holy/halo6.png
-        [/frame]
-        [frame]
-            begin=-300
-            end=-225
-            image="units/human-magi/white-mage-magic-3.png"
-            halo=halo/holy/halo1.png
-        [/frame]
-        [frame]
-            begin=-225
-            end=-150
-            image="units/human-magi/white-mage-magic-3.png"
-            halo=halo/holy/halo2.png
-        [/frame]
-        [frame]
-            begin=-150
-            end=-75
-            image="units/human-magi/white-mage-magic-3.png"
-            halo=halo/holy/halo3.png
-        [/frame]
-        [frame]
-            begin=-75
-            end=0
-            image="units/human-magi/white-mage-magic-3.png"
-            halo=halo/holy/halo4.png
-        [/frame]
-        [frame]
-            begin=0
-            end=75
-            image="units/human-magi/white-mage-magic-3.png"
-            halo=halo/holy/halo5.png
-        [/frame]
-        [frame]
-            begin=75
             end=150
             image="units/human-magi/white-mage-magic-3.png"
-            halo=halo/holy/halo6.png
+            halo=halo/holy/halo[6,1-6].png:75
         [/frame]
         [frame]
             begin=150
Index: data/core/units/humans/Mage_Silver.cfg
===================================================================
--- data/core/units/humans/Mage_Silver.cfg	(revision 56058)
+++ data/core/units/humans/Mage_Silver.cfg	(working copy)
@@ -161,19 +161,19 @@
 
         [teleport_sparkle_1_frame]
             duration=800
-            halo=misc/blank-hex.png:1,halo/teleport-9.png,halo/teleport-8.png,halo/teleport-1.png,halo/teleport-2.png,halo/teleport-3.png,halo/teleport-4.png,halo/teleport-5.png,halo/teleport-6.png,halo/teleport-7.png,halo/teleport-8.png,halo/teleport-9.png,misc/blank-hex.png:1
+            halo=misc/blank-hex.png:1,halo/teleport-[9,8,1-9].png,misc/blank-hex.png:1
             halo_x=-10
             halo_y=30~-30
         [/teleport_sparkle_1_frame]
         [teleport_sparkle_2_frame]
             duration=800
-            halo=misc/blank-hex.png:1,halo/teleport-9.png,halo/teleport-8.png,halo/teleport-1.png,halo/teleport-2.png,halo/teleport-3.png,halo/teleport-4.png,halo/teleport-5.png,halo/teleport-6.png,halo/teleport-7.png,halo/teleport-8.png,halo/teleport-9.png,misc/blank-hex.png:1
+            halo=misc/blank-hex.png:1,halo/teleport-[9,8,1-9].png,misc/blank-hex.png:1
             halo_x=0
             halo_y=40~-40
         [/teleport_sparkle_2_frame]
         [teleport_sparkle_3_frame]
             duration=800
-            halo=misc/blank-hex.png:1,halo/teleport-9.png,halo/teleport-8.png,halo/teleport-1.png,halo/teleport-2.png,halo/teleport-3.png,halo/teleport-4.png,halo/teleport-5.png,halo/teleport-6.png,halo/teleport-7.png,halo/teleport-8.png,halo/teleport-9.png,misc/blank-hex.png:1
+            halo=misc/blank-hex.png:1,halo/teleport-[9,8,1-9].png,misc/blank-hex.png:1
             halo_x=10
             halo_y=30~-30
         [/teleport_sparkle_3_frame]
@@ -226,19 +226,19 @@
 
         [teleport_sparkle_1_frame]
             duration=800
-            halo=misc/blank-hex.png:1,halo/teleport-9.png,halo/teleport-8.png,halo/teleport-1.png,halo/teleport-2.png,halo/teleport-3.png,halo/teleport-4.png,halo/teleport-5.png,halo/teleport-6.png,halo/teleport-7.png,halo/teleport-8.png,halo/teleport-9.png,misc/blank-hex.png:1
+            halo=misc/blank-hex.png:1,halo/teleport-[9,8,1-9].png,misc/blank-hex.png:1
             halo_x=10
             halo_y=-30~30
         [/teleport_sparkle_1_frame]
         [teleport_sparkle_2_frame]
             duration=800
-            halo=misc/blank-hex.png:1,halo/teleport-9.png,halo/teleport-8.png,halo/teleport-1.png,halo/teleport-2.png,halo/teleport-3.png,halo/teleport-4.png,halo/teleport-5.png,halo/teleport-6.png,halo/teleport-7.png,halo/teleport-8.png,halo/teleport-9.png,misc/blank-hex.png:1
+            halo=misc/blank-hex.png:1,halo/teleport-[9,8,1-9].png,misc/blank-hex.png:1
             halo_x=0
             halo_y=-40~40
         [/teleport_sparkle_2_frame]
         [teleport_sparkle_3_frame]
             duration=800
-            halo=misc/blank-hex.png:1,halo/teleport-9.png,halo/teleport-8.png,halo/teleport-1.png,halo/teleport-2.png,halo/teleport-3.png,halo/teleport-4.png,halo/teleport-5.png,halo/teleport-6.png,halo/teleport-7.png,halo/teleport-8.png,halo/teleport-9.png,misc/blank-hex.png:1
+            halo=misc/blank-hex.png:1,halo/teleport-[9,8,1-9].png,misc/blank-hex.png:1
             halo_x=-10
             halo_y=-30~30
         [/teleport_sparkle_3_frame]
Index: data/core/units/undead/Necro_Lich.cfg
===================================================================
--- data/core/units/undead/Necro_Lich.cfg	(revision 56058)
+++ data/core/units/undead/Necro_Lich.cfg	(working copy)
@@ -227,21 +227,9 @@
         [/frame]
         [frame]
             begin=0
-            end=75
-            image="units/undead-necromancers/lich-magic-3.png"
-            halo=halo/undead/black-magic-3.png
-        [/frame]
-        [frame]
-            begin=75
-            end=150
-            image="units/undead-necromancers/lich-magic-3.png"
-            halo=halo/undead/black-magic-4.png
-        [/frame]
-        [frame]
-            begin=150
             end=200
             image="units/undead-necromancers/lich-magic-3.png"
-            halo=halo/undead/black-magic-5.png
+            halo=halo/undead/black-magic-[3-5].png:[75,75,50]
         [/frame]
         [frame]
             begin=200
@@ -307,22 +295,9 @@
         [/else]
         [frame]
             begin=0
-            end=75
-            image="units/undead-necromancers/lich-magic-3.png"
-            halo=halo/undead/black-magic-3.png
-        [/frame]
-        [frame]
-            begin=75
-            end=150
-            image="units/undead-necromancers/lich-magic-3.png"
-            halo=halo/undead/black-magic-4.png
-        [/frame]
-
-        [frame]
-            begin=150
             end=200
             image="units/undead-necromancers/lich-magic-3.png"
-            halo=halo/undead/black-magic-5.png
+            halo=halo/undead/black-magic-[3-5].png:[75,75,50]
         [/frame]
         [frame]
             begin=200
Index: data/core/units/undead/Necro_Dark_Adept.cfg
===================================================================
--- data/core/units/undead/Necro_Dark_Adept.cfg	(revision 56058)
+++ data/core/units/undead/Necro_Dark_Adept.cfg	(working copy)
@@ -136,37 +136,9 @@
         [/frame]
         [frame]
             begin=-300
-            end=-250
-            image="units/undead-necromancers/adept-magic-3.png"
-            halo=halo/undead/dark-magic-1.png
-            halo_x,halo_y=0,-12
-        [/frame]
-        [frame]
-            begin=-250
-            end=-200
-            image="units/undead-necromancers/adept-magic-3.png"
-            halo=halo/undead/dark-magic-2.png
-            halo_x,halo_y=0,-12
-        [/frame]
-        [frame]
-            begin=-200
-            end=-150
-            image="units/undead-necromancers/adept-magic-3.png"
-            halo=halo/undead/dark-magic-3.png
-            halo_x,halo_y=0,-12
-        [/frame]
-        [frame]
-            begin=-150
-            end=-100
-            image="units/undead-necromancers/adept-magic-3.png"
-            halo=halo/undead/dark-magic-4.png
-            halo_x,halo_y=0,-12
-        [/frame]
-        [frame]
-            begin=-100
             end=-50
             image="units/undead-necromancers/adept-magic-3.png"
-            halo=halo/undead/dark-magic-5.png
+            halo=halo/undead/dark-magic-[1-5].png:50
             halo_x,halo_y=0,-12
         [/frame]
         [if]
@@ -233,37 +205,9 @@
         [/frame]
         [frame]
             begin=-300
-            end=-250
-            image="units/undead-necromancers/adept-magic-3.png"
-            halo=halo/undead/dark-magic-1.png
-            halo_x,halo_y=0,-12
-        [/frame]
-        [frame]
-            begin=-250
-            end=-200
-            image="units/undead-necromancers/adept-magic-3.png"
-            halo=halo/undead/dark-magic-2.png
-            halo_x,halo_y=0,-12
-        [/frame]
-        [frame]
-            begin=-200
-            end=-150
-            image="units/undead-necromancers/adept-magic-3.png"
-            halo=halo/undead/dark-magic-3.png
-            halo_x,halo_y=0,-12
-        [/frame]
-        [frame]
-            begin=-150
-            end=-100
-            image="units/undead-necromancers/adept-magic-3.png"
-            halo=halo/undead/dark-magic-4.png
-            halo_x,halo_y=0,-12
-        [/frame]
-        [frame]
-            begin=-100
             end=-50
             image="units/undead-necromancers/adept-magic-3.png"
-            halo=halo/undead/dark-magic-5.png
+            halo=halo/undead/dark-magic-[1-5].png:50
             halo_x,halo_y=0,-12
         [/frame]
         [frame]
@@ -333,18 +277,6 @@
                 image="units/undead-necromancers/adept+female-magic-3.png"
             [/frame]
             [frame]
-                image="units/undead-necromancers/adept+female-magic-3.png"
-            [/frame]
-            [frame]
-                image="units/undead-necromancers/adept+female-magic-3.png"
-            [/frame]
-            [frame]
-                image="units/undead-necromancers/adept+female-magic-3.png"
-            [/frame]
-            [frame]
-                image="units/undead-necromancers/adept+female-magic-3.png"
-            [/frame]
-            [frame]
                 image="units/undead-necromancers/adept+female-magic-2.png"
             [/frame]
             [frame]
@@ -373,18 +305,6 @@
             [frame]
                 image="units/undead-necromancers/adept+female-magic-3.png"
             [/frame]
-            [frame]
-                image="units/undead-necromancers/adept+female-magic-3.png"
-            [/frame]
-            [frame]
-                image="units/undead-necromancers/adept+female-magic-3.png"
-            [/frame]
-            [frame]
-                image="units/undead-necromancers/adept+female-magic-3.png"
-            [/frame]
-            [frame]
-                image="units/undead-necromancers/adept+female-magic-3.png"
-            [/frame]
             [if]
                 [frame]
                     image="units/undead-necromancers/adept+female-magic-3.png"
Index: data/core/units/undead/Necromancer.cfg
===================================================================
--- data/core/units/undead/Necromancer.cfg	(revision 56058)
+++ data/core/units/undead/Necromancer.cfg	(working copy)
@@ -99,21 +99,9 @@
         [/frame]
         [frame]
             begin=0
-            end=75
-            image="units/undead-necromancers/necromancer-magic-3.png"
-            halo=halo/undead/black-magic-3.png
-        [/frame]
-        [frame]
-            begin=75
-            end=150
-            image="units/undead-necromancers/necromancer-magic-3.png"
-            halo=halo/undead/black-magic-4.png
-        [/frame]
-        [frame]
-            begin=150
             end=200
             image="units/undead-necromancers/necromancer-magic-3.png"
-            halo=halo/undead/black-magic-5.png
+            halo=halo/undead/black-magic-[3,4,5].png:[75,75,50]
         [/frame]
         [frame]
             begin=200
@@ -179,22 +167,9 @@
         [/else]
         [frame]
             begin=0
-            end=75
-            image="units/undead-necromancers/necromancer-magic-3.png"
-            halo=halo/undead/black-magic-3.png
-        [/frame]
-        [frame]
-            begin=75
-            end=150
-            image="units/undead-necromancers/necromancer-magic-3.png"
-            halo=halo/undead/black-magic-4.png
-        [/frame]
-
-        [frame]
-            begin=150
             end=200
             image="units/undead-necromancers/necromancer-magic-3.png"
-            halo=halo/undead/black-magic-5.png
+            halo=halo/undead/black-magic-[3-5].png:[75,75,50]
         [/frame]
         [frame]
             begin=200
@@ -289,12 +264,6 @@
                 image="units/undead-necromancers/necromancer+female-magic-3.png"
             [/frame]
             [frame]
-                image="units/undead-necromancers/necromancer+female-magic-3.png"
-            [/frame]
-            [frame]
-                image="units/undead-necromancers/necromancer+female-magic-3.png"
-            [/frame]
-            [frame]
                 begin=200
                 end=250
                 image="units/undead-necromancers/necromancer+female-magic-2.png"
@@ -337,12 +306,6 @@
                 image="units/undead-necromancers/necromancer+female-magic-3.png"
             [/frame]
             [frame]
-                image="units/undead-necromancers/necromancer+female-magic-3.png"
-            [/frame]
-            [frame]
-                image="units/undead-necromancers/necromancer+female-magic-3.png"
-            [/frame]
-            [frame]
                 begin=200
                 end=250
                 image="units/undead-necromancers/necromancer+female-magic-2.png"
Index: data/core/units/undead/Necro_Dark_Sorcerer.cfg
===================================================================
--- data/core/units/undead/Necro_Dark_Sorcerer.cfg	(revision 56058)
+++ data/core/units/undead/Necro_Dark_Sorcerer.cfg	(working copy)
@@ -62,22 +62,9 @@
         [/frame]
         [frame]
             begin=0
-            end=75
-            image="units/undead-necromancers/dark-sorcerer-magic-3.png"
-            halo=halo/undead/black-magic-3.png
-        [/frame]
-        [frame]
-            begin=75
-            end=150
-            image="units/undead-necromancers/dark-sorcerer-magic-3.png"
-            halo=halo/undead/black-magic-4.png
-        [/frame]
-
-        [frame]
-            begin=150
             end=200
             image="units/undead-necromancers/dark-sorcerer-magic-3.png"
-            halo=halo/undead/black-magic-5.png
+            halo=halo/undead/black-magic-[3-5].png:[75,75,50]
         [/frame]
         [frame]
             begin=200
@@ -176,22 +163,9 @@
         [/else]
         [frame]
             begin=0
-            end=75
-            image="units/undead-necromancers/dark-sorcerer-magic-3.png"
-            halo=halo/undead/black-magic-3.png
-        [/frame]
-        [frame]
-            begin=75
-            end=150
-            image="units/undead-necromancers/dark-sorcerer-magic-3.png"
-            halo=halo/undead/black-magic-4.png
-        [/frame]
-
-        [frame]
-            begin=150
             end=200
             image="units/undead-necromancers/dark-sorcerer-magic-3.png"
-            halo=halo/undead/black-magic-5.png
+            halo=halo/undead/black-magic-[3-5].png:[75,75,50]
         [/frame]
         [frame]
             begin=200
@@ -289,12 +263,6 @@
                 image="units/undead-necromancers/dark-sorcerer+female-magic-3.png"
             [/frame]
             [frame]
-                image="units/undead-necromancers/dark-sorcerer+female-magic-3.png"
-            [/frame]
-            [frame]
-                image="units/undead-necromancers/dark-sorcerer+female-magic-3.png"
-            [/frame]
-            [frame]
                 begin=200
                 end=250
                 image="units/undead-necromancers/dark-sorcerer+female-magic-2.png"
@@ -338,12 +306,6 @@
                 image="units/undead-necromancers/dark-sorcerer+female-magic-3.png"
             [/frame]
             [frame]
-                image="units/undead-necromancers/dark-sorcerer+female-magic-3.png"
-            [/frame]
-            [frame]
-                image="units/undead-necromancers/dark-sorcerer+female-magic-3.png"
-            [/frame]
-            [frame]
                 begin=200
                 end=250
                 image="units/undead-necromancers/dark-sorcerer+female-magic-2.png"
Index: data/core/units/elves/Shaman.cfg
===================================================================
--- data/core/units/elves/Shaman.cfg	(revision 56058)
+++ data/core/units/elves/Shaman.cfg	(working copy)
@@ -121,37 +121,16 @@
         [/missile_frame]
         [frame]
             begin=-450
-            end=-375
-            image="units/elves-wood/shaman.png"
-            halo=halo/elven/nature-halo1.png
-            halo_x,halo_y=0,-12
-        [/frame]
-        [frame]
-            begin=-375
-            end=-300
-            image="units/elves-wood/shaman.png"
-            halo=halo/elven/nature-halo2.png
-            halo_x,halo_y=0,-12
-        [/frame]
-        [frame]
-            begin=-300
             end=-225
             image="units/elves-wood/shaman.png"
-            halo=halo/elven/nature-halo3.png
+            halo=halo/elven/nature-halo[1-3].png:75
             halo_x,halo_y=0,-12
         [/frame]
         [frame]
             begin=-225
-            end=-150
-            image="units/elves-wood/shaman-attack2.png"
-            halo=halo/elven/nature-halo4.png
-            halo_x,halo_y=0,-12
-        [/frame]
-        [frame]
-            begin=-150
             end=-75
             image="units/elves-wood/shaman-attack2.png"
-            halo=halo/elven/nature-halo5.png
+            halo=halo/elven/nature-halo[4,5].png:75
             halo_x,halo_y=0,-12
         [/frame]
         {SOUND:SLOW}
@@ -164,17 +143,10 @@
             halo_x,halo_y=0,-12
         [/frame]
         [frame]
-            begin=-0
-            end=50
-            image="units/elves-wood/shaman.png"
-            halo=halo/elven/nature-halo7.png
-            halo_x,halo_y=0,-12
-        [/frame]
-        [frame]
-            begin=50
+            begin=0
             end=100
             image="units/elves-wood/shaman.png"
-            halo=halo/elven/nature-halo8.png
+            halo=halo/elven/nature-halo[7,8].png:50
             halo_x,halo_y=0,-12
         [/frame]
         [frame]
Index: data/core/units/elves/Lord.cfg
===================================================================
--- data/core/units/elves/Lord.cfg	(revision 56058)
+++ data/core/units/elves/Lord.cfg	(working copy)
@@ -81,37 +81,9 @@
         [/frame]
         [frame]
             begin=-300
-            end=-225
-            image="units/elves-wood/lord-magic-1.png"
-            halo=halo/elven/faerie-fire-halo3.png
-            halo_x,halo_y=-19,-13
-        [/frame]
-        [frame]
-            begin=-225
-            end=-150
-            image="units/elves-wood/lord-magic-1.png"
-            halo=halo/elven/faerie-fire-halo4.png
-            halo_x,halo_y=-19,-13
-        [/frame]
-        [frame]
-            begin=-150
-            end=-75
-            image="units/elves-wood/lord-magic-1.png"
-            halo=halo/elven/faerie-fire-halo5.png
-            halo_x,halo_y=-19,-13
-        [/frame]
-        [frame]
-            begin=-75
-            end=0
-            image="units/elves-wood/lord-magic-1.png"
-            halo=halo/elven/faerie-fire-halo6.png
-            halo_x,halo_y=-19,-13
-        [/frame]
-        [frame]
-            begin=-0
             end=75
             image="units/elves-wood/lord-magic-1.png"
-            halo=halo/elven/faerie-fire-halo7.png
+            halo=halo/elven/faerie-fire-halo[3-7].png:75
             halo_x,halo_y=-19,-13
         [/frame]
     [/attack_anim]
@@ -140,37 +112,9 @@
         [/frame]
         [frame]
             begin=-300
-            end=-225
-            image="units/elves-wood/lord-magic-1.png"
-            halo=halo/elven/faerie-fire-halo3.png
-            halo_x,halo_y=-19,-13
-        [/frame]
-        [frame]
-            begin=-225
-            end=-150
-            image="units/elves-wood/lord-magic-1.png"
-            halo=halo/elven/faerie-fire-halo4.png
-            halo_x,halo_y=-19,-13
-        [/frame]
-        [frame]
-            begin=-150
-            end=-75
-            image="units/elves-wood/lord-magic-1.png"
-            halo=halo/elven/faerie-fire-halo5.png
-            halo_x,halo_y=-19,-13
-        [/frame]
-        [frame]
-            begin=-75
-            end=0
-            image="units/elves-wood/lord-magic-1.png"
-            halo=halo/elven/faerie-fire-halo6.png
-            halo_x,halo_y=-19,-13
-        [/frame]
-        [frame]
-            begin=-0
             end=75
             image="units/elves-wood/lord-magic-1.png"
-            halo=halo/elven/faerie-fire-halo7.png
+            halo=halo/elven/faerie-fire-halo[3-7].png:75
             halo_x,halo_y=-19,-13
         [/frame]
     [/attack_anim]
Index: data/core/units/elves/High_Lord.cfg
===================================================================
--- data/core/units/elves/High_Lord.cfg	(revision 56058)
+++ data/core/units/elves/High_Lord.cfg	(working copy)
@@ -114,37 +114,9 @@
         [/frame]
         [frame]
             begin=-300
-            end=-225
-            image="units/elves-wood/high-lord-magic-1.png"
-            halo=halo/elven/faerie-fire-halo3.png
-            halo_x,halo_y=-19,-14
-        [/frame]
-        [frame]
-            begin=-225
-            end=-150
-            image="units/elves-wood/high-lord-magic-1.png"
-            halo=halo/elven/faerie-fire-halo4.png
-            halo_x,halo_y=-19,-14
-        [/frame]
-        [frame]
-            begin=-150
-            end=-75
-            image="units/elves-wood/high-lord-magic-1.png"
-            halo=halo/elven/faerie-fire-halo5.png
-            halo_x,halo_y=-19,-14
-        [/frame]
-        [frame]
-            begin=-75
-            end=0
-            image="units/elves-wood/high-lord-magic-1.png"
-            halo=halo/elven/faerie-fire-halo6.png
-            halo_x,halo_y=-19,-14
-        [/frame]
-        [frame]
-            begin=-0
             end=75
             image="units/elves-wood/high-lord-magic-1.png"
-            halo=halo/elven/faerie-fire-halo7.png
+            halo=halo/elven/faerie-fire-halo[3-7].png:75
             halo_x,halo_y=-19,-14
         [/frame]
     [/attack_anim]
@@ -173,37 +145,9 @@
         [/frame]
         [frame]
             begin=-300
-            end=-225
-            image="units/elves-wood/high-lord-magic-1.png"
-            halo=halo/elven/faerie-fire-halo3.png
-            halo_x,halo_y=-19,-14
-        [/frame]
-        [frame]
-            begin=-225
-            end=-150
-            image="units/elves-wood/high-lord-magic-1.png"
-            halo=halo/elven/faerie-fire-halo4.png
-            halo_x,halo_y=-19,-14
-        [/frame]
-        [frame]
-            begin=-150
-            end=-75
-            image="units/elves-wood/high-lord-magic-1.png"
-            halo=halo/elven/faerie-fire-halo5.png
-            halo_x,halo_y=-19,-14
-        [/frame]
-        [frame]
-            begin=-75
-            end=0
-            image="units/elves-wood/high-lord-magic-1.png"
-            halo=halo/elven/faerie-fire-halo6.png
-            halo_x,halo_y=-19,-14
-        [/frame]
-        [frame]
-            begin=-0
             end=75
             image="units/elves-wood/high-lord-magic-1.png"
-            halo=halo/elven/faerie-fire-halo7.png
+            halo=halo/elven/faerie-fire-halo[3-7].png:75
             halo_x,halo_y=-19,-14
         [/frame]
     [/attack_anim]
Index: data/core/units/trolls/Troll_Shaman.cfg
===================================================================
--- data/core/units/trolls/Troll_Shaman.cfg	(revision 56058)
+++ data/core/units/trolls/Troll_Shaman.cfg	(working copy)
@@ -85,31 +85,31 @@
 
             [flame_burst_1_frame]
                 duration=400
-                halo=misc/blank-hex.png:1,halo/flame-burst-1.png~FL(vert):50,halo/flame-burst-2.png~FL(vert):50,halo/flame-burst-3.png~FL(vert):50,halo/flame-burst-4.png~FL(vert):50,halo/flame-burst-5.png~FL(vert):50,halo/flame-burst-6.png~FL(vert):50,halo/flame-burst-7.png~FL(vert):50,halo/flame-burst-8.png~FL(vert):48,misc/blank-hex.png:1
+                halo=misc/blank-hex.png:1,halo/flame-burst-[1-8].png~FL(vert):[50,50,50,50,50,50,50,48],misc/blank-hex.png:1
                 halo_x,halo_y=-22,0
                 offset=1.0
             [/flame_burst_1_frame]
             [flame_burst_2_frame]
                 duration=400
-                halo=misc/blank-hex.png:1,halo/flame-burst-1.png~FL(vert):50,halo/flame-burst-2.png~FL(vert):50,halo/flame-burst-3.png~FL(vert):50,halo/flame-burst-4.png~FL(vert):50,halo/flame-burst-5.png~FL(vert):50,halo/flame-burst-6.png~FL(vert):50,halo/flame-burst-7.png~FL(vert):50,halo/flame-burst-8.png~FL(vert):48,misc/blank-hex.png:1
+                halo=misc/blank-hex.png:1,halo/flame-burst-[1-8].png~FL(vert):[50,50,50,50,50,50,50,48],misc/blank-hex.png:1
                 halo_x,halo_y=-14,9
                 offset=1.0
             [/flame_burst_2_frame]
             [flame_burst_3_frame]
                 duration=400
-                halo=misc/blank-hex.png:1,halo/flame-burst-1.png~FL(vert):50,halo/flame-burst-2.png~FL(vert):50,halo/flame-burst-3.png~FL(vert):50,halo/flame-burst-4.png~FL(vert):50,halo/flame-burst-5.png~FL(vert):50,halo/flame-burst-6.png~FL(vert):50,halo/flame-burst-7.png~FL(vert):50,halo/flame-burst-8.png~FL(vert):48,misc/blank-hex.png:1
+                halo=misc/blank-hex.png:1,halo/flame-burst-[1-8].png~FL(vert):[50,50,50,50,50,50,50,48],misc/blank-hex.png:1
                 halo_x,halo_y=0,12
                 offset=1.0
             [/flame_burst_3_frame]
             [flame_burst_4_frame]
                 duration=400
-                halo=misc/blank-hex.png:1,halo/flame-burst-1.png~FL(vert):50,halo/flame-burst-2.png~FL(vert):50,halo/flame-burst-3.png~FL(vert):50,halo/flame-burst-4.png~FL(vert):50,halo/flame-burst-5.png~FL(vert):50,halo/flame-burst-6.png~FL(vert):50,halo/flame-burst-7.png~FL(vert):50,halo/flame-burst-8.png~FL(vert):48,misc/blank-hex.png:1
+                halo=misc/blank-hex.png:1,halo/flame-burst-[1-8].png~FL(vert):[50,50,50,50,50,50,50,48],misc/blank-hex.png:1
                 halo_x,halo_y=14,9
                 offset=1.0
             [/flame_burst_4_frame]
             [flame_burst_5_frame]
                 duration=400
-                halo=misc/blank-hex.png:1,halo/flame-burst-1.png~FL(vert):50,halo/flame-burst-2.png~FL(vert):50,halo/flame-burst-3.png~FL(vert):50,halo/flame-burst-4.png~FL(vert):50,halo/flame-burst-5.png~FL(vert):50,halo/flame-burst-6.png~FL(vert):50,halo/flame-burst-7.png~FL(vert):50,halo/flame-burst-8.png~FL(vert):48,misc/blank-hex.png:1
+                halo=misc/blank-hex.png:1,halo/flame-burst-[1-8].png~FL(vert):[50,50,50,50,50,50,50,48],misc/blank-hex.png:1
                 halo_x,halo_y=22,0
                 offset=1.0
             [/flame_burst_5_frame]
@@ -119,31 +119,31 @@
 
             [flame_burst_1_frame]
                 duration=400
-                halo=misc/blank-hex.png:1,halo/flame-burst-1.png:50,halo/flame-burst-2.png:50,halo/flame-burst-3.png:50,halo/flame-burst-4.png:50,halo/flame-burst-5.png:50,halo/flame-burst-6.png:50,halo/flame-burst-7.png:50,halo/flame-burst-8.png:48,misc/blank-hex.png:1
+                halo=misc/blank-hex.png:1,halo/flame-burst-[1-8].png:[50,50,50,50,50,50,50,48],misc/blank-hex.png:1
                 halo_x,halo_y=-22,0
                 offset=1.0
             [/flame_burst_1_frame]
             [flame_burst_2_frame]
                 duration=400
-                halo=misc/blank-hex.png:1,halo/flame-burst-1.png:50,halo/flame-burst-2.png:50,halo/flame-burst-3.png:50,halo/flame-burst-4.png:50,halo/flame-burst-5.png:50,halo/flame-burst-6.png:50,halo/flame-burst-7.png:50,halo/flame-burst-8.png:48,misc/blank-hex.png:1
+                halo=misc/blank-hex.png:1,halo/flame-burst-[1-8].png:[50,50,50,50,50,50,50,48],misc/blank-hex.png:1
                 halo_x,halo_y=-14,9
                 offset=1.0
             [/flame_burst_2_frame]
             [flame_burst_3_frame]
                 duration=400
-                halo=misc/blank-hex.png:1,halo/flame-burst-1.png:50,halo/flame-burst-2.png:50,halo/flame-burst-3.png:50,halo/flame-burst-4.png:50,halo/flame-burst-5.png:50,halo/flame-burst-6.png:50,halo/flame-burst-7.png:50,halo/flame-burst-8.png:48,misc/blank-hex.png:1
+                halo=misc/blank-hex.png:1,halo/flame-burst-[1-8].png:[50,50,50,50,50,50,50,48],misc/blank-hex.png:1
                 halo_x,halo_y=0,12
                 offset=1.0
             [/flame_burst_3_frame]
             [flame_burst_4_frame]
                 duration=400
-                halo=misc/blank-hex.png:1,halo/flame-burst-1.png:50,halo/flame-burst-2.png:50,halo/flame-burst-3.png:50,halo/flame-burst-4.png:50,halo/flame-burst-5.png:50,halo/flame-burst-6.png:50,halo/flame-burst-7.png:50,halo/flame-burst-8.png:48,misc/blank-hex.png:1
+                halo=misc/blank-hex.png:1,halo/flame-burst-[1-8].png:[50,50,50,50,50,50,50,48],misc/blank-hex.png:1
                 halo_x,halo_y=14,9
                 offset=1.0
             [/flame_burst_4_frame]
             [flame_burst_5_frame]
                 duration=400
-                halo=misc/blank-hex.png:1,halo/flame-burst-1.png:50,halo/flame-burst-2.png:50,halo/flame-burst-3.png:50,halo/flame-burst-4.png:50,halo/flame-burst-5.png:50,halo/flame-burst-6.png:50,halo/flame-burst-7.png:50,halo/flame-burst-8.png:48,misc/blank-hex.png:1
+                halo=misc/blank-hex.png:1,halo/flame-burst-[1-8].png:[50,50,50,50,50,50,50,48],misc/blank-hex.png:1
                 halo_x,halo_y=22,0
                 offset=1.0
             [/flame_burst_5_frame]
Index: data/core/units/merfolk/Diviner.cfg
===================================================================
--- data/core/units/merfolk/Diviner.cfg	(revision 56058)
+++ data/core/units/merfolk/Diviner.cfg	(working copy)
@@ -43,56 +43,17 @@
     [healing_anim]
         start_time=-525
         [frame]
-            duration=75
+            duration=150
             image="units/merfolk/diviner.png" ### magic-1
         [/frame]
         [frame]
-            duration=75
-            image="units/merfolk/diviner.png" ### magic-2
-        [/frame]
-        [frame]
-            duration=75
             image="units/merfolk/diviner.png" ### magic-3
-            halo=halo/holy/halo6.png
+            halo=halo/holy/halo[6,1-6].png:75
         [/frame]
         [frame]
-            duration=75
-            image="units/merfolk/diviner.png" ### magic-3
-            halo=halo/holy/halo1.png
-        [/frame]
-        [frame]
-            duration=75
-            image="units/merfolk/diviner.png" ### magic-3
-            halo=halo/holy/halo2.png
-        [/frame]
-        [frame]
-            duration=75
-            image="units/merfolk/diviner.png" ### magic-3
-            halo=halo/holy/halo3.png
-        [/frame]
-        [frame]
-            duration=75
-            image="units/merfolk/diviner.png" ### magic-3
-            halo=halo/holy/halo4.png
-        [/frame]
-        [frame]
-            duration=75
-            image="units/merfolk/diviner.png" ### magic-3
-            halo=halo/holy/halo5.png
-        [/frame]
-        [frame]
-            duration=75
-            image="units/merfolk/diviner.png" ### magic-3
-            halo=halo/holy/halo6.png
-        [/frame]
-        [frame]
-            duration=75
+            duration=150
             image="units/merfolk/diviner.png" ### magic-2
         [/frame]
-        [frame]
-            duration=75
-            image="units/merfolk/diviner.png" ### magic-1
-        [/frame]
     [/healing_anim]
     [attack]
         name=staff
Index: data/core/units/merfolk/Priestess.cfg
===================================================================
--- data/core/units/merfolk/Priestess.cfg	(revision 56058)
+++ data/core/units/merfolk/Priestess.cfg	(working copy)
@@ -40,56 +40,17 @@
     [healing_anim]
         start_time=-525
         [frame]
-            duration=75
+            duration=150
             image="units/merfolk/priestess.png" ### magic-1
         [/frame]
         [frame]
-            duration=75
-            image="units/merfolk/priestess.png" ### magic-2
-        [/frame]
-        [frame]
-            duration=75
             image="units/merfolk/priestess.png" ### magic-3
-            halo=halo/holy/halo6.png
+            halo=halo/holy/halo[6,1-6].png:75
         [/frame]
         [frame]
-            duration=75
-            image="units/merfolk/priestess.png" ### magic-3
-            halo=halo/holy/halo1.png
-        [/frame]
-        [frame]
-            duration=75
-            image="units/merfolk/priestess.png" ### magic-3
-            halo=halo/holy/halo2.png
-        [/frame]
-        [frame]
-            duration=75
-            image="units/merfolk/priestess.png" ### magic-3
-            halo=halo/holy/halo3.png
-        [/frame]
-        [frame]
-            duration=75
-            image="units/merfolk/priestess.png" ### magic-3
-            halo=halo/holy/halo4.png
-        [/frame]
-        [frame]
-            duration=75
-            image="units/merfolk/priestess.png" ### magic-3
-            halo=halo/holy/halo5.png
-        [/frame]
-        [frame]
-            duration=75
-            image="units/merfolk/priestess.png" ### magic-3
-            halo=halo/holy/halo6.png
-        [/frame]
-        [frame]
-            duration=75
+            duration=150
             image="units/merfolk/priestess.png" ### magic-2
         [/frame]
-        [frame]
-            duration=75
-            image="units/merfolk/priestess.png" ### magic-1
-        [/frame]
     [/healing_anim]
     [attack]
         name=staff
Index: data/core/terrain-graphics/builder.cfg
===================================================================
--- data/core/terrain-graphics/builder.cfg	(revision 56058)
+++ data/core/terrain-graphics/builder.cfg	(working copy)
@@ -3,72 +3,35 @@
 #define IMAGE_SINGLE IMAGESTEM POSTFIX
 {IMAGESTEM}{POSTFIX}.png#enddef
 
-#define ANIMATION_01_INTERNAL IMAGESTEM POSTFIX DURATION
-{IMAGESTEM}-A01{POSTFIX}:{DURATION} #enddef
-#define ANIMATION_02_INTERNAL IMAGESTEM POSTFIX DURATION
-{ANIMATION_01_INTERNAL {IMAGESTEM} {POSTFIX} {DURATION}},{IMAGESTEM}-A02{POSTFIX}:{DURATION}#enddef
-#define ANIMATION_03_INTERNAL IMAGESTEM POSTFIX DURATION
-{ANIMATION_02_INTERNAL {IMAGESTEM} {POSTFIX} {DURATION}},{IMAGESTEM}-A03{POSTFIX}:{DURATION}#enddef
-#define ANIMATION_04_INTERNAL IMAGESTEM POSTFIX DURATION
-{ANIMATION_03_INTERNAL {IMAGESTEM} {POSTFIX} {DURATION}},{IMAGESTEM}-A04{POSTFIX}:{DURATION}#enddef
-#define ANIMATION_05_INTERNAL IMAGESTEM POSTFIX DURATION
-{ANIMATION_04_INTERNAL {IMAGESTEM} {POSTFIX} {DURATION}},{IMAGESTEM}-A05{POSTFIX}:{DURATION}#enddef
-#define ANIMATION_06_INTERNAL IMAGESTEM POSTFIX DURATION
-{ANIMATION_05_INTERNAL {IMAGESTEM} {POSTFIX} {DURATION}},{IMAGESTEM}-A06{POSTFIX}:{DURATION}#enddef
-#define ANIMATION_07_INTERNAL IMAGESTEM POSTFIX DURATION
-{ANIMATION_06_INTERNAL {IMAGESTEM} {POSTFIX} {DURATION}},{IMAGESTEM}-A07{POSTFIX}:{DURATION}#enddef
-#define ANIMATION_08_INTERNAL IMAGESTEM POSTFIX DURATION
-{ANIMATION_07_INTERNAL {IMAGESTEM} {POSTFIX} {DURATION}},{IMAGESTEM}-A08{POSTFIX}:{DURATION}#enddef
-#define ANIMATION_09_INTERNAL IMAGESTEM POSTFIX DURATION
-{ANIMATION_08_INTERNAL {IMAGESTEM} {POSTFIX} {DURATION}},{IMAGESTEM}-A09{POSTFIX}:{DURATION}#enddef
-#define ANIMATION_10_INTERNAL IMAGESTEM POSTFIX DURATION
-{ANIMATION_09_INTERNAL {IMAGESTEM} {POSTFIX} {DURATION}},{IMAGESTEM}-A10{POSTFIX}:{DURATION}#enddef
-#define ANIMATION_11_INTERNAL IMAGESTEM POSTFIX DURATION
-{ANIMATION_10_INTERNAL {IMAGESTEM} {POSTFIX} {DURATION}},{IMAGESTEM}-A11{POSTFIX}:{DURATION}#enddef
-#define ANIMATION_12_INTERNAL IMAGESTEM POSTFIX DURATION
-{ANIMATION_11_INTERNAL {IMAGESTEM} {POSTFIX} {DURATION}},{IMAGESTEM}-A12{POSTFIX}:{DURATION}#enddef
-#define ANIMATION_13_INTERNAL IMAGESTEM POSTFIX DURATION
-{ANIMATION_12_INTERNAL {IMAGESTEM} {POSTFIX} {DURATION}},{IMAGESTEM}-A13{POSTFIX}:{DURATION}#enddef
-#define ANIMATION_14_INTERNAL IMAGESTEM POSTFIX DURATION
-{ANIMATION_13_INTERNAL {IMAGESTEM} {POSTFIX} {DURATION}},{IMAGESTEM}-A14{POSTFIX}:{DURATION}#enddef
-#define ANIMATION_15_INTERNAL IMAGESTEM POSTFIX DURATION
-{ANIMATION_14_INTERNAL {IMAGESTEM} {POSTFIX} {DURATION}},{IMAGESTEM}-A15{POSTFIX}:{DURATION}#enddef
-#define ANIMATION_16_INTERNAL IMAGESTEM POSTFIX DURATION
-{ANIMATION_15_INTERNAL {IMAGESTEM} {POSTFIX} {DURATION}},{IMAGESTEM}-A16{POSTFIX}:{DURATION}#enddef
-#define ANIMATION_17_INTERNAL IMAGESTEM POSTFIX DURATION
-{ANIMATION_16_INTERNAL {IMAGESTEM} {POSTFIX} {DURATION}},{IMAGESTEM}-A17{POSTFIX}:{DURATION}#enddef
-#define ANIMATION_18_INTERNAL IMAGESTEM POSTFIX DURATION
-{ANIMATION_17_INTERNAL {IMAGESTEM} {POSTFIX} {DURATION}},{IMAGESTEM}-A18{POSTFIX}:{DURATION}#enddef
-
 #define ANIMATION_01 IMAGESTEM POSTFIX
-{ANIMATION_01_INTERNAL {IMAGESTEM} {POSTFIX}.png 100}#enddef
+{IMAGESTEM}-A01{POSTFIX}.png:100#enddef
 
 #define ANIMATION_03 IMAGESTEM POSTFIX
-{ANIMATION_03_INTERNAL {IMAGESTEM} {POSTFIX}.png 200}#enddef
+{IMAGESTEM}-A[01-03]{POSTFIX}.png:200#enddef
 
 #define ANIMATION_04 IMAGESTEM POSTFIX
-{ANIMATION_04_INTERNAL {IMAGESTEM} {POSTFIX}.png 100}#enddef
+{IMAGESTEM}-A[01-04]{POSTFIX}.png:100#enddef
 
 #define ANIMATION_08 IMAGESTEM POSTFIX
-{ANIMATION_08_INTERNAL {IMAGESTEM} {POSTFIX}.png 200}#enddef
+{IMAGESTEM}-A[01-08]{POSTFIX}.png:200#enddef
 
 #define ANIMATION_10 IMAGESTEM POSTFIX
-{ANIMATION_10_INTERNAL {IMAGESTEM} {POSTFIX}.png 100}#enddef
+{IMAGESTEM}-A[01-10]{POSTFIX}.png:100#enddef
 
 #define ANIMATION_15 IMAGESTEM POSTFIX
-{ANIMATION_15_INTERNAL {IMAGESTEM} {POSTFIX}.png 110}#enddef
+{IMAGESTEM}-A[01-15]{POSTFIX}.png:110#enddef
 
 #define ANIMATION_15_SLOW IMAGESTEM POSTFIX
-{ANIMATION_15_INTERNAL {IMAGESTEM} {POSTFIX}.png 150}#enddef
+{IMAGESTEM}-A[01-15]{POSTFIX}.png:150#enddef
 
 #define ANIMATION_04_140 IMAGESTEM POSTFIX
-{ANIMATION_04_INTERNAL {IMAGESTEM} {POSTFIX}.png 140}#enddef
+{IMAGESTEM}-A[01-04]{POSTFIX}.png:140#enddef
 
 #define ANIMATION_18_70 IMAGESTEM POSTFIX
-{ANIMATION_18_INTERNAL {IMAGESTEM} {POSTFIX}.png 130}#enddef
+{IMAGESTEM}-A[01-18]{POSTFIX}.png:130#enddef
 
 #define ANIMATION_06_150 IMAGESTEM POSTFIX
-{ANIMATION_06_INTERNAL {IMAGESTEM} {POSTFIX}.png 300}#enddef
+{IMAGESTEM}-A[01-06]{POSTFIX}.png:300#enddef
 
 #define BUILD_IMAGE BUILDER IMAGESTEM POSTFIX
 {{BUILDER} {IMAGESTEM} {POSTFIX}}#enddef
Index: data/core/terrain-graphics/internal-generic.cfg
===================================================================
--- data/core/terrain-graphics/internal-generic.cfg	(revision 56058)
+++ data/core/terrain-graphics/internal-generic.cfg	(working copy)
@@ -341,7 +341,7 @@
             # we put [image] in [tile] for performance reason
             # this assumes that the image fit into the hex
             [image]
-                name={IMAGESTEM}-A01.png{IPF}:{TIME},{IMAGESTEM}-A02.png{IPF}:{TIME},{IMAGESTEM}-A03.png{IPF}:{TIME},{IMAGESTEM}-A04.png{IPF}:{TIME},{IMAGESTEM}-A05.png{IPF}:{TIME},{IMAGESTEM}-A06.png{IPF}:{TIME},{IMAGESTEM}-A07.png{IPF}:{TIME},{IMAGESTEM}-A08.png{IPF}:{TIME},{IMAGESTEM}-A09.png{IPF}:{TIME},{IMAGESTEM}-A10.png{IPF}:{TIME},{IMAGESTEM}-A11.png{IPF}:{TIME},{IMAGESTEM}-A12.png{IPF}:{TIME},{IMAGESTEM}-A13.png{IPF}:{TIME},{IMAGESTEM}-A14.png{IPF}:{TIME},{IMAGESTEM}-A15.png{IPF}:{TIME}
+                name={IMAGESTEM}-A[01-15].png{IPF}:{TIME}
                 layer=-1000
             [/image]
         [/tile]
@@ -364,7 +364,7 @@
             # we put [image] in [tile] for performance reason
             # this assumes that the image fit into the hex
             [image]
-                name={IMAGESTEM}-A01-@R0.png{IPF}:{TIME},{IMAGESTEM}-A02-@R0.png{IPF}:{TIME},{IMAGESTEM}-A03-@R0.png{IPF}:{TIME},{IMAGESTEM}-A04-@R0.png{IPF}:{TIME},{IMAGESTEM}-A05-@R0.png{IPF}:{TIME},{IMAGESTEM}-A06-@R0.png{IPF}:{TIME},{IMAGESTEM}-A07-@R0.png{IPF}:{TIME},{IMAGESTEM}-A08-@R0.png{IPF}:{TIME},{IMAGESTEM}-A09-@R0.png{IPF}:{TIME},{IMAGESTEM}-A10-@R0.png{IPF}:{TIME},{IMAGESTEM}-A11-@R0.png{IPF}:{TIME},{IMAGESTEM}-A12-@R0.png{IPF}:{TIME},{IMAGESTEM}-A13-@R0.png{IPF}:{TIME},{IMAGESTEM}-A14-@R0.png{IPF}:{TIME},{IMAGESTEM}-A15-@R0.png{IPF}:{TIME}
+                name={IMAGESTEM}-A[01-15]-@R0.png{IPF}:{TIME}
                 layer={LAYER}
             [/image]
         [/tile]
Index: data/core/terrain-graphics/new-macros.cfg
===================================================================
--- data/core/terrain-graphics/new-macros.cfg	(revision 56058)
+++ data/core/terrain-graphics/new-macros.cfg	(working copy)
@@ -860,7 +860,7 @@
         [/tile]
 
         [image]
-            name={IMAGESTEM}01.png:{TIME},{IMAGESTEM}02.png:{TIME},{IMAGESTEM}03.png:{TIME}
+            name={IMAGESTEM}[01-03].png:{TIME}
             layer=0
             base=90,144
             center=90,144
@@ -884,7 +884,7 @@
         [/tile]
 
         [image]
-            name={IMAGESTEM}01.png:{TIME},{IMAGESTEM}02.png:{TIME},{IMAGESTEM}03.png:{TIME},{IMAGESTEM}04.png:{TIME}
+            name={IMAGESTEM}[01-04].png:{TIME}
             layer=0
             base=90,144
             center=90,144
Index: data/game_config.cfg
===================================================================
--- data/game_config.cfg	(revision 56058)
+++ data/game_config.cfg	(working copy)
@@ -56,7 +56,7 @@
         ally_orb="misc/orb-ally.png"
         energy="misc/bar-energy.png"
 
-        flag="flags/flag-1.png:150,flags/flag-2.png:150,flags/flag-3.png:150,flags/flag-4.png:150"
+        flag="flags/flag-[1-4].png:150"
         flag_icon="flags/flag-icon.png"
 
         terrain_mask="terrain/alphamask.png"
Index: data/multiplayer/scenarios/2p_Aethermaw.cfg
===================================================================
--- data/multiplayer/scenarios/2p_Aethermaw.cfg	(revision 56058)
+++ data/multiplayer/scenarios/2p_Aethermaw.cfg	(working copy)
@@ -44,7 +44,7 @@
         [/item]
         [item]
             x,y=25,21
-            halo="units/human-magi/great-mage+female.png~RC(magenta>black)~FL():444,units/human-magi/great-mage+female-attack-magic-1.png~RC(magenta>black)~FL():444,units/human-magi/great-mage+female-attack-magic-2.png~RC(magenta>black)~FL():444,units/human-magi/great-mage+female-attack-magic-1.png~RC(magenta>black)~FL():444"
+            halo="units/human-magi/great-mage+female.png~RC(magenta>black)~FL():444,units/human-magi/great-mage+female-attack-magic-[1,2,1].png~RC(magenta>black)~FL():444"
         [/item]
 
 #define PLACE_HALO IMAGE X Y
Index: data/campaigns/The_South_Guard/utils/sg_utils.cfg
===================================================================
--- data/campaigns/The_South_Guard/utils/sg_utils.cfg	(revision 56058)
+++ data/campaigns/The_South_Guard/utils/sg_utils.cfg	(working copy)
@@ -5,6 +5,6 @@
 # and the generous advice of the collected fora.
 
 #define CUSTOM_SG_FLAG
-    flag=flag/SG-flag-1.png:150,flag/SG-flag-2.png:150,flag/SG-flag-3.png:150,flag/SG-flag-4.png:150
+    flag=flag/SG-flag-[1-4].png:150
     flag_icon=flag/SG-flag-icon.png
 #enddef
Index: data/campaigns/The_South_Guard/units/Eyestalk.cfg
===================================================================
--- data/campaigns/The_South_Guard/units/Eyestalk.cfg	(revision 56058)
+++ data/campaigns/The_South_Guard/units/Eyestalk.cfg	(working copy)
@@ -100,7 +100,7 @@
         [missile_frame]
             begin=0
             end=300
-            halo="halo/elven/ice-halo1.png:50,halo/elven/ice-halo2.png:50,halo/elven/ice-halo3.png:50,halo/elven/ice-halo4.png:50,halo/elven/ice-halo5.png:50,halo/elven/ice-halo6.png:50"
+            halo="halo/elven/ice-halo[1-6].png:50"
             offset=1.0~0.0:300
         [/missile_frame]
         [frame]
Index: data/campaigns/Descent_Into_Darkness/units/dark-mage.cfg
===================================================================
--- data/campaigns/Descent_Into_Darkness/units/dark-mage.cfg	(revision 56058)
+++ data/campaigns/Descent_Into_Darkness/units/dark-mage.cfg	(working copy)
@@ -103,22 +103,9 @@
         [/else]
         [frame]
             begin=0
-            end=75
-            image="units/dark-mage-magic-3.png"
-            halo=halo/undead/black-magic-3.png
-        [/frame]
-        [frame]
-            begin=75
-            end=150
-            image="units/dark-mage-magic-3.png"
-            halo=halo/undead/black-magic-4.png
-        [/frame]
-
-        [frame]
-            begin=150
             end=200
             image="units/dark-mage-magic-3.png"
-            halo=halo/undead/black-magic-5.png
+            halo=halo/undead/black-magic-[3-5].png:[75,75,50]
         [/frame]
         [frame]
             begin=200
@@ -198,21 +185,9 @@
         [/frame]
         [frame]
             begin=0
-            end=75
-            image="units/dark-mage-magic-3.png"
-            halo=halo/undead/black-magic-3.png
-        [/frame]
-        [frame]
-            begin=75
-            end=150
-            image="units/dark-mage-magic-3.png"
-            halo=halo/undead/black-magic-4.png
-        [/frame]
-        [frame]
-            begin=150
             end=200
             image="units/dark-mage-magic-3.png"
-            halo=halo/undead/black-magic-5.png
+            halo=halo/undead/black-magic-[3-5].png:[75,75,50]
         [/frame]
         [frame]
             begin=200
Index: data/campaigns/Son_Of_The_Black_Eye/utils/utils.cfg
===================================================================
--- data/campaigns/Son_Of_The_Black_Eye/utils/utils.cfg	(revision 56058)
+++ data/campaigns/Son_Of_The_Black_Eye/utils/utils.cfg	(working copy)
@@ -52,7 +52,7 @@
 #enddef
 
 #define BLACK_FLAG
-    flag=flags/black-flag-1.png:100,flags/black-flag-2.png:300,flags/black-flag-1.png:100,flags/black-flag-3.png:300
+    flag=flags/black-flag-[1,2,1,3].png:[100,300,100,300]
     flag_icon=flags/black-flag-icon.png
 #enddef
 
Index: data/campaigns/Son_Of_The_Black_Eye/units/Old_Orcish_Shaman.cfg
===================================================================
--- data/campaigns/Son_Of_The_Black_Eye/units/Old_Orcish_Shaman.cfg	(revision 56058)
+++ data/campaigns/Son_Of_The_Black_Eye/units/Old_Orcish_Shaman.cfg	(working copy)
@@ -49,7 +49,7 @@
         [missile_frame]
             begin=-200
             end=200
-            halo="halo/elven/druid-healing8.png:50,halo/elven/druid-healing7.png:50,halo/elven/druid-healing6.png:50,halo/elven/druid-healing5.png:50,halo/elven/druid-healing4.png:50,halo/elven/druid-healing3.png:50,halo/elven/druid-healing2.png:50,halo/elven/druid-healing1.png:50"
+            halo="halo/elven/druid-healing[8-1].png:50"
             offset=1.0~0.0
         [/missile_frame]
         [frame]
Index: data/campaigns/Son_Of_The_Black_Eye/units/Orcish_Shaman.cfg
===================================================================
--- data/campaigns/Son_Of_The_Black_Eye/units/Orcish_Shaman.cfg	(revision 56058)
+++ data/campaigns/Son_Of_The_Black_Eye/units/Orcish_Shaman.cfg	(working copy)
@@ -49,7 +49,7 @@
         [missile_frame]
             begin=-200
             end=200
-            halo="halo/elven/druid-healing8.png:50,halo/elven/druid-healing7.png:50,halo/elven/druid-healing6.png:50,halo/elven/druid-healing5.png:50,halo/elven/druid-healing4.png:50,halo/elven/druid-healing3.png:50,halo/elven/druid-healing2.png:50,halo/elven/druid-healing1.png:50"
+            halo="halo/elven/druid-healing[8-1].png:50"
             offset=1.0~0.0
         [/missile_frame]
         [frame]
Index: data/campaigns/Son_Of_The_Black_Eye/units/Novice_Orcish_Shaman.cfg
===================================================================
--- data/campaigns/Son_Of_The_Black_Eye/units/Novice_Orcish_Shaman.cfg	(revision 56058)
+++ data/campaigns/Son_Of_The_Black_Eye/units/Novice_Orcish_Shaman.cfg	(working copy)
@@ -49,7 +49,7 @@
         [missile_frame]
             begin=-200
             end=200
-            halo="halo/elven/druid-healing8.png:50,halo/elven/druid-healing7.png:50,halo/elven/druid-healing6.png:50,halo/elven/druid-healing5.png:50,halo/elven/druid-healing4.png:50,halo/elven/druid-healing3.png:50,halo/elven/druid-healing2.png:50,halo/elven/druid-healing1.png:50"
+            halo="halo/elven/druid-healing[8-1].png:50"
             offset=1.0~0.0
         [/missile_frame]
         [frame]
Index: data/campaigns/Son_Of_The_Black_Eye/scenarios/10_Saving_Inarix.cfg
===================================================================
--- data/campaigns/Son_Of_The_Black_Eye/scenarios/10_Saving_Inarix.cfg	(revision 56058)
+++ data/campaigns/Son_Of_The_Black_Eye/scenarios/10_Saving_Inarix.cfg	(working copy)
@@ -276,7 +276,7 @@
 
         [item]
             x,y=21,13
-            halo=projectiles/fire-burst-small-1.png:50,projectiles/fire-burst-small-2.png:50,projectiles/fire-burst-small-3.png:50,projectiles/fire-burst-small-4.png:50,projectiles/fire-burst-small-5.png:50,projectiles/fire-burst-small-6.png:50,projectiles/fire-burst-small-7.png:50,projectiles/fire-burst-small-8.png:50,misc/blank-hex.png:1000000
+            halo=projectiles/fire-burst-small-[1-8].png:50,misc/blank-hex.png:1000000
         [/item]
 
         [kill]
@@ -292,7 +292,7 @@
 
             [item]
                 x,y=$exploding_hexes[$i].x,$exploding_hexes[$i].y
-                halo=projectiles/fire-burst-small-1.png:50,projectiles/fire-burst-small-2.png:50,projectiles/fire-burst-small-3.png:50,projectiles/fire-burst-small-4.png:50,projectiles/fire-burst-small-5.png:50,projectiles/fire-burst-small-6.png:50,projectiles/fire-burst-small-7.png:50,projectiles/fire-burst-small-8.png:50,misc/blank-hex.png:1000000
+                halo=projectiles/fire-burst-small-[1-8].png:50,misc/blank-hex.png:1000000
             [/item]
 
             [kill]
Index: data/campaigns/Delfadors_Memoirs/units/Wose_Shaman.cfg
===================================================================
--- data/campaigns/Delfadors_Memoirs/units/Wose_Shaman.cfg	(revision 56058)
+++ data/campaigns/Delfadors_Memoirs/units/Wose_Shaman.cfg	(working copy)
@@ -10,43 +10,8 @@
         [frame]
             duration=150
             image="units/wose-shaman.png"
-            halo="halo/wose-stationary-halo1.png"
+            halo="halo/wose-stationary-halo[1-8].png:150"
         [/frame]
-        [frame]
-            duration=150
-            image="units/wose-shaman.png"
-            halo="halo/wose-stationary-halo2.png"
-        [/frame]
-        [frame]
-            duration=150
-            image="units/wose-shaman.png"
-            halo="halo/wose-stationary-halo3.png"
-        [/frame]
-        [frame]
-            duration=150
-            image="units/wose-shaman.png"
-            halo="halo/wose-stationary-halo4.png"
-        [/frame]
-        [frame]
-            duration=150
-            image="units/wose-shaman.png"
-            halo="halo/wose-stationary-halo5.png"
-        [/frame]
-        [frame]
-            duration=150
-            image="units/wose-shaman.png"
-            halo="halo/wose-stationary-halo6.png"
-        [/frame]
-        [frame]
-            duration=150
-            image="units/wose-shaman.png"
-            halo="halo/wose-stationary-halo7.png"
-        [/frame]
-        [frame]
-            duration=150
-            image="units/wose-shaman.png"
-            halo="halo/wose-stationary-halo8.png"
-        [/frame]
     [/standing_anim]
     {DEFENSE_ANIM units/wose-shaman.png units/wose-shaman.png {SOUND_LIST:HUMAN_OLD_HIT}}
     die_sound=wose-die.ogg
Index: data/campaigns/Eastern_Invasion/utils/animations.cfg
===================================================================
--- data/campaigns/Eastern_Invasion/utils/animations.cfg	(revision 56058)
+++ data/campaigns/Eastern_Invasion/utils/animations.cfg	(working copy)
@@ -8,19 +8,19 @@
 
     [teleport_sparkle_1_frame]
         duration=800
-        halo=misc/blank-hex.png:1,halo/teleport-9.png,halo/teleport-8.png,halo/teleport-1.png,halo/teleport-2.png,halo/teleport-8.png,halo/teleport-9.png,misc/blank-hex.png:400
+        halo=misc/blank-hex.png:1,halo/teleport-[9,8,1,2,8,9].png,misc/blank-hex.png:400
         halo_x=-10
         halo_y=30~-30
     [/teleport_sparkle_1_frame]
     [teleport_sparkle_2_frame]
         duration=800
-        halo=misc/blank-hex.png:1,halo/teleport-9.png,halo/teleport-8.png,halo/teleport-1.png,halo/teleport-8.png,halo/teleport-9.png,misc/blank-hex.png:500
+        halo=misc/blank-hex.png:1,halo/teleport-[9,8,1,8,9].png,misc/blank-hex.png:500
         halo_x=0
         halo_y=40~-40
     [/teleport_sparkle_2_frame]
     [teleport_sparkle_3_frame]
         duration=800
-        halo=misc/blank-hex.png:1,halo/teleport-9.png,halo/teleport-8.png,halo/teleport-9.png,misc/blank-hex.png:600
+        halo=misc/blank-hex.png:1,halo/teleport-[9,8,9].png,misc/blank-hex.png:600
         halo_x=10
         halo_y=30~-30
     [/teleport_sparkle_3_frame]
@@ -154,22 +154,12 @@
                     halo=halo/holy/halo1.png
                 [/frame]
                 [frame]
-                    duration=75
+                    duration=200
                     image="units/human-magi/white-mage-magic-3.png"
-                    halo=halo/holy/halo3.png
+                    halo=halo/holy/halo[3,5,6].png:[75,75,50]
                 [/frame]
                 [frame]
-                    duration=75
-                    image="units/human-magi/white-mage-magic-3.png"
-                    halo=halo/holy/halo5.png
-                [/frame]
-                [frame]
                     duration=50
-                    image="units/human-magi/white-mage-magic-3.png"
-                    halo=halo/holy/halo6.png
-                [/frame]
-                [frame]
-                    duration=50
                     image="units/human-magi/white-mage-magic-2.png"
                 [/frame]
                 [frame]
@@ -206,22 +196,12 @@
                     halo=halo/holy/halo1.png
                 [/frame]
                 [frame]
-                    duration=75
+                    duration=200
                     image="units/human-magi/white-cleric-magic-3.png"
-                    halo=halo/holy/halo3.png
+                    halo=halo/holy/halo[3,5,6].png:[75,75,50]
                 [/frame]
                 [frame]
-                    duration=75
-                    image="units/human-magi/white-cleric-magic-3.png"
-                    halo=halo/holy/halo5.png
-                [/frame]
-                [frame]
                     duration=50
-                    image="units/human-magi/white-cleric-magic-3.png"
-                    halo=halo/holy/halo6.png
-                [/frame]
-                [frame]
-                    duration=50
                     image="units/human-magi/white-cleric-magic-2.png"
                 [/frame]
                 [frame]
@@ -267,42 +247,11 @@
                     image="units/human-magi/white-mage-magic-2.png"
                 [/frame]
                 [frame]
-                    duration=125
                     image="units/human-magi/white-mage-magic-3.png"
-                    halo=halo/holy/halo6.png
+                    halo=halo/holy/halo[6,1-6].png:125
                 [/frame]
                 [frame]
                     duration=125
-                    image="units/human-magi/white-mage-magic-3.png"
-                    halo=halo/holy/halo1.png
-                [/frame]
-                [frame]
-                    duration=125
-                    image="units/human-magi/white-mage-magic-3.png"
-                    halo=halo/holy/halo2.png
-                [/frame]
-                [frame]
-                    duration=125
-                    image="units/human-magi/white-mage-magic-3.png"
-                    halo=halo/holy/halo3.png
-                [/frame]
-                [frame]
-                    duration=125
-                    image="units/human-magi/white-mage-magic-3.png"
-                    halo=halo/holy/halo4.png
-                [/frame]
-                [frame]
-                    duration=125
-                    image="units/human-magi/white-mage-magic-3.png"
-                    halo=halo/holy/halo5.png
-                [/frame]
-                [frame]
-                    duration=125
-                    image="units/human-magi/white-mage-magic-3.png"
-                    halo=halo/holy/halo6.png
-                [/frame]
-                [frame]
-                    duration=125
                     image="units/human-magi/white-mage-magic-2.png"
                 [/frame]
                 [frame]
@@ -331,42 +280,11 @@
                     image="units/human-magi/white-cleric-magic-2.png"
                 [/frame]
                 [frame]
-                    duration=125
                     image="units/human-magi/white-cleric-magic-3.png"
-                    halo=halo/holy/halo6.png
+                    halo=halo/holy/halo[6,1-6].png:125
                 [/frame]
                 [frame]
                     duration=125
-                    image="units/human-magi/white-cleric-magic-3.png"
-                    halo=halo/holy/halo1.png
-                [/frame]
-                [frame]
-                    duration=125
-                    image="units/human-magi/white-cleric-magic-3.png"
-                    halo=halo/holy/halo2.png
-                [/frame]
-                [frame]
-                    duration=125
-                    image="units/human-magi/white-cleric-magic-3.png"
-                    halo=halo/holy/halo3.png
-                [/frame]
-                [frame]
-                    duration=125
-                    image="units/human-magi/white-cleric-magic-3.png"
-                    halo=halo/holy/halo4.png
-                [/frame]
-                [frame]
-                    duration=125
-                    image="units/human-magi/white-cleric-magic-3.png"
-                    halo=halo/holy/halo5.png
-                [/frame]
-                [frame]
-                    duration=125
-                    image="units/human-magi/white-cleric-magic-3.png"
-                    halo=halo/holy/halo6.png
-                [/frame]
-                [frame]
-                    duration=125
                     image="units/human-magi/white-cleric-magic-2.png"
                 [/frame]
                 [frame]
Index: data/campaigns/Eastern_Invasion/units/Lich_Lord.cfg
===================================================================
--- data/campaigns/Eastern_Invasion/units/Lich_Lord.cfg	(revision 56058)
+++ data/campaigns/Eastern_Invasion/units/Lich_Lord.cfg	(working copy)
@@ -64,113 +64,15 @@
             direction=n,ne,nw
 
             [missile_frame]
-                duration=30
-                halo="halo/holy/light-beam-1.png"
+                halo="halo/holy/light-beam-[1-7,6-1].png:[30,30,30,30,30,30,130,70,70,70,70,70,70]"
             [/missile_frame]
-            [missile_frame]
-                duration=30
-                halo="halo/holy/light-beam-2.png"
-            [/missile_frame]
-            [missile_frame]
-                duration=30
-                halo="halo/holy/light-beam-3.png"
-            [/missile_frame]
-            [missile_frame]
-                duration=30
-                halo="halo/holy/light-beam-4.png"
-            [/missile_frame]
-            [missile_frame]
-                duration=30
-                halo="halo/holy/light-beam-5.png"
-            [/missile_frame]
-            [missile_frame]
-                duration=30
-                halo="halo/holy/light-beam-6.png"
-            [/missile_frame]
-            [missile_frame]
-                duration=130
-                halo="halo/holy/light-beam-7.png"
-            [/missile_frame]
-            [missile_frame]
-                duration=70
-                halo="halo/holy/light-beam-6.png"
-            [/missile_frame]
-            [missile_frame]
-                duration=70
-                halo="halo/holy/light-beam-5.png"
-            [/missile_frame]
-            [missile_frame]
-                duration=70
-                halo="halo/holy/light-beam-4.png"
-            [/missile_frame]
-            [missile_frame]
-                duration=70
-                halo="halo/holy/light-beam-3.png"
-            [/missile_frame]
-            [missile_frame]
-                duration=70
-                halo="halo/holy/light-beam-2.png"
-            [/missile_frame]
-            [missile_frame]
-                duration=70
-                halo="halo/holy/light-beam-1.png"
-            [/missile_frame]
         [/if]
         [else]
             direction=s,se,sw
 
             [missile_frame]
-                duration=30
-                halo="halo/holy/light-beam-1.png~FL(vert)"
+                halo="halo/holy/light-beam-[1-7,6-1].png~FL(vert):[30,30,30,30,30,30,130,70,70,70,70,70,70]"
             [/missile_frame]
-            [missile_frame]
-                duration=30
-                halo="halo/holy/light-beam-2.png~FL(vert)"
-            [/missile_frame]
-            [missile_frame]
-                duration=30
-                halo="halo/holy/light-beam-3.png~FL(vert)"
-            [/missile_frame]
-            [missile_frame]
-                duration=30
-                halo="halo/holy/light-beam-4.png~FL(vert)"
-            [/missile_frame]
-            [missile_frame]
-                duration=30
-                halo="halo/holy/light-beam-5.png~FL(vert)"
-            [/missile_frame]
-            [missile_frame]
-                duration=30
-                halo="halo/holy/light-beam-6.png~FL(vert)"
-            [/missile_frame]
-            [missile_frame]
-                duration=130
-                halo="halo/holy/light-beam-7.png~FL(vert)"
-            [/missile_frame]
-            [missile_frame]
-                duration=70
-                halo="halo/holy/light-beam-6.png~FL(vert)"
-            [/missile_frame]
-            [missile_frame]
-                duration=70
-                halo="halo/holy/light-beam-5.png~FL(vert)"
-            [/missile_frame]
-            [missile_frame]
-                duration=70
-                halo="halo/holy/light-beam-4.png~FL(vert)"
-            [/missile_frame]
-            [missile_frame]
-                duration=70
-                halo="halo/holy/light-beam-3.png~FL(vert)"
-            [/missile_frame]
-            [missile_frame]
-                duration=70
-                halo="halo/holy/light-beam-2.png~FL(vert)"
-            [/missile_frame]
-            [missile_frame]
-                duration=70
-                halo="halo/holy/light-beam-1.png~FL(vert)"
-            [/missile_frame]
         [/else]
 
         [frame]
Index: data/campaigns/Heir_To_The_Throne/scenarios/09_The_Valley_of_Death.cfg
===================================================================
--- data/campaigns/Heir_To_The_Throne/scenarios/09_The_Valley_of_Death.cfg	(revision 56058)
+++ data/campaigns/Heir_To_The_Throne/scenarios/09_The_Valley_of_Death.cfg	(working copy)
@@ -80,7 +80,7 @@
         canrecruit=yes
         team_name=undead
         user_team_name=_"Undead"
-        #flag=flags/undead-flag-1.png,flags/undead-flag-2.png,flags/undead-flag-3.png,flags/undead-flag-4.png
+        #flag=flags/undead-flag-[1-4].png
 
         {VOD_AI_PARMS}
         {GOLD 200 320 440}
Index: data/campaigns/Heir_To_The_Throne/units/Dark_Queen.cfg
===================================================================
--- data/campaigns/Heir_To_The_Throne/units/Dark_Queen.cfg	(revision 56058)
+++ data/campaigns/Heir_To_The_Throne/units/Dark_Queen.cfg	(working copy)
@@ -69,44 +69,9 @@
         [/else]
         [frame]
             begin=-375
-            end=-300
-            image="units/human-queen.png"
-            halo=halo/elven/faerie-fire-halo2.png
-            halo_x,halo_y=0,-35
-        [/frame]
-        [frame]
-            begin=-300
-            end=-225
-            image="units/human-queen.png"
-            halo=halo/elven/faerie-fire-halo3.png
-            halo_x,halo_y=0,-35
-        [/frame]
-        [frame]
-            begin=-225
-            end=-150
-            image="units/human-queen.png"
-            halo=halo/elven/faerie-fire-halo4.png
-            halo_x,halo_y=0,-35
-        [/frame]
-        [frame]
-            begin=-150
-            end=-75
-            image="units/human-queen.png"
-            halo=halo/elven/faerie-fire-halo5.png
-            halo_x,halo_y=0,-35
-        [/frame]
-        [frame]
-            begin=-75
-            end=0
-            image="units/human-queen.png"
-            halo=halo/elven/faerie-fire-halo6.png
-            halo_x,halo_y=0,-35
-        [/frame]
-        [frame]
-            begin=-0
             end=75
             image="units/human-queen.png"
-            halo=halo/elven/faerie-fire-halo7.png
+            halo=halo/elven/faerie-fire-halo[2-7].png:75
             halo_x,halo_y=0,-35
         [/frame]
     [/attack_anim]
Index: data/campaigns/Under_the_Burning_Suns/units/monsters/Alien_Body2.cfg
===================================================================
--- data/campaigns/Under_the_Burning_Suns/units/monsters/Alien_Body2.cfg	(revision 56058)
+++ data/campaigns/Under_the_Burning_Suns/units/monsters/Alien_Body2.cfg	(working copy)
@@ -147,32 +147,32 @@
 
     [flame_burst_1_frame]
         duration=800
-        halo=misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1,halo/flame-burst-1.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-2.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-3.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-4.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-5.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-6.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-7.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-8.png~{OVERLAY_IMAGE_AFFIX}:50,misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1
+        halo=misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1,halo/flame-burst-[1-8].png~{OVERLAY_IMAGE_AFFIX}:50,misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1
         halo_x,halo_y=-9,17
     [/flame_burst_1_frame]
     [flame_burst_2_frame]
         duration=800
-        halo=misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1,halo/flame-burst-1.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-2.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-3.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-4.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-5.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-6.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-7.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-8.png~{OVERLAY_IMAGE_AFFIX}:50,misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1
+        halo=misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1,halo/flame-burst-[1-8].png~{OVERLAY_IMAGE_AFFIX}:50,misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1
         halo_x,halo_y=18,0
     [/flame_burst_2_frame]
     [flame_burst_3_frame]
         duration=800
-        halo=misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1,halo/flame-burst-1.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-2.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-3.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-4.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-5.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-6.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-7.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-8.png~{OVERLAY_IMAGE_AFFIX}:50,misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1
+        halo=misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1,halo/flame-burst-[1-8].png~{OVERLAY_IMAGE_AFFIX}:50,misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1
         halo_x,halo_y=-9,-18
     [/flame_burst_3_frame]
     [flame_burst_4_frame]
         duration=800
-        halo=misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1,halo/flame-burst-1.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-2.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-3.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-4.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-5.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-6.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-7.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-8.png~{OVERLAY_IMAGE_AFFIX}:50,misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1
+        halo=misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1,halo/flame-burst-[1-8].png~{OVERLAY_IMAGE_AFFIX}:50,misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1
         halo_x,halo_y=9,17
     [/flame_burst_4_frame]
     [flame_burst_5_frame]
         duration=800
-        halo=misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1,halo/flame-burst-1.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-2.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-3.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-4.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-5.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-6.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-7.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-8.png~{OVERLAY_IMAGE_AFFIX}:50,misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1
+        halo=misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1,halo/flame-burst-[1-8].png~{OVERLAY_IMAGE_AFFIX}:50,misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1
         halo_x,halo_y=8,-18
     [/flame_burst_5_frame]
     [flame_burst_6_frame]
         duration=800
-        halo=misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1,halo/flame-burst-1.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-2.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-3.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-4.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-5.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-6.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-7.png~{OVERLAY_IMAGE_AFFIX}:50,halo/flame-burst-8.png~{OVERLAY_IMAGE_AFFIX}:50,misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1
+        halo=misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1,halo/flame-burst-[1-8].png~{OVERLAY_IMAGE_AFFIX}:50,misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1
         halo_x,halo_y=-18,0
     [/flame_burst_6_frame]
 
@@ -185,32 +185,32 @@
 
     [explosion_1_frame]
         duration=800
-        halo="misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1,projectiles/fireball-impact-1.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-1.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-2.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-3.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-4.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-5.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-6.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-7.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-8.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-9.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-10.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-11.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-12.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-13.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-14.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-15.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-16.png~{OVERLAY_IMAGE_AFFIX},misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1"
+        halo="misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1,projectiles/fireball-impact-[1,1-16].png~{OVERLAY_IMAGE_AFFIX},misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1"
         halo_x,halo_y=-9,17
     [/explosion_1_frame]
     [explosion_2_frame]
         duration=800
-        halo="misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1,projectiles/fireball-impact-1.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-1.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-2.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-3.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-4.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-5.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-6.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-7.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-8.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-9.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-10.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-11.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-12.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-13.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-14.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-15.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-16.png~{OVERLAY_IMAGE_AFFIX},misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1"
+        halo="misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1,projectiles/fireball-impact-[1,1-16].png~{OVERLAY_IMAGE_AFFIX},misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1"
         halo_x,halo_y=18,0
     [/explosion_2_frame]
     [explosion_3_frame]
         duration=800
-        halo="misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1,projectiles/fireball-impact-1.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-1.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-2.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-3.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-4.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-5.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-6.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-7.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-8.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-9.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-10.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-11.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-12.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-13.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-14.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-15.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-16.png~{OVERLAY_IMAGE_AFFIX},misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1"
+        halo="misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1,projectiles/fireball-impact-[1,1-16].png~{OVERLAY_IMAGE_AFFIX},misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1"
         halo_x,halo_y=-9,-18
     [/explosion_3_frame]
     [explosion_4_frame]
         duration=800
-        halo="misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1,projectiles/fireball-impact-1.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-1.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-2.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-3.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-4.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-5.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-6.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-7.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-8.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-9.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-10.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-11.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-12.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-13.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-14.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-15.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-16.png~{OVERLAY_IMAGE_AFFIX},misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1"
+        halo="misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1,projectiles/fireball-impact-[1,1-16].png~{OVERLAY_IMAGE_AFFIX},misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1"
         halo_x,halo_y=9,17
     [/explosion_4_frame]
     [explosion_5_frame]
         duration=800
-        halo="misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1,projectiles/fireball-impact-1.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-1.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-2.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-3.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-4.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-5.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-6.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-7.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-8.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-9.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-10.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-11.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-12.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-13.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-14.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-15.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-16.png~{OVERLAY_IMAGE_AFFIX},misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1"
+        halo="misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1,projectiles/fireball-impact-[1,1-16].png~{OVERLAY_IMAGE_AFFIX},misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1"
         halo_x,halo_y=8,-18
     [/explosion_5_frame]
     [explosion_6_frame]
         duration=800
-        halo="misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1,projectiles/fireball-impact-1.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-1.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-2.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-3.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-4.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-5.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-6.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-7.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-8.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-9.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-10.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-11.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-12.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-13.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-14.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-15.png~{OVERLAY_IMAGE_AFFIX},projectiles/fireball-impact-16.png~{OVERLAY_IMAGE_AFFIX},misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1"
+        halo="misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1,projectiles/fireball-impact-[1,1-16].png~{OVERLAY_IMAGE_AFFIX},misc/blank-hex.png~{OVERLAY_IMAGE_AFFIX}:1"
         halo_x,halo_y=-18,0
     [/explosion_6_frame]
 
Index: data/campaigns/Under_the_Burning_Suns/units/monsters/Dust_Devil.cfg
===================================================================
--- data/campaigns/Under_the_Burning_Suns/units/monsters/Dust_Devil.cfg	(revision 56058)
+++ data/campaigns/Under_the_Burning_Suns/units/monsters/Dust_Devil.cfg	(working copy)
@@ -129,7 +129,7 @@
                 offset=1.0
                 begin=-200
                 end=120
-                halo="projectiles/sand-storm-1.png:40,projectiles/sand-storm-2.png:40,projectiles/sand-storm-3.png:40,projectiles/sand-storm-4.png:40,projectiles/sand-storm-5.png:40,projectiles/sand-storm-6.png:40,projectiles/sand-storm-7.png:40,projectiles/sand-storm-8.png:40"
+                halo="projectiles/sand-storm-[1-8].png:40"
             [/missile_frame]
         [/if]
         [else]
@@ -138,7 +138,7 @@
                 offset=1.0
                 begin=-200
                 end=120
-                halo="projectiles/sand-storm-1.png~FL(vert):40,projectiles/sand-storm-2.png~FL(vert):40,projectiles/sand-storm-3.png~FL(vert):40,projectiles/sand-storm-4.png~FL(vert):40,projectiles/sand-storm-5.png~FL(vert):40,projectiles/sand-storm-6.png~FL(vert):40,projectiles/sand-storm-7.png~FL(vert):40,projectiles/sand-storm-8.png~FL(vert):40"
+                halo="projectiles/sand-storm-[1-8].png~FL(vert):40"
             [/missile_frame]
         [/else]
         [if]
Index: data/campaigns/Liberty/units/Rogue_Mage.cfg
===================================================================
--- data/campaigns/Liberty/units/Rogue_Mage.cfg	(revision 56058)
+++ data/campaigns/Liberty/units/Rogue_Mage.cfg	(working copy)
@@ -47,7 +47,7 @@
         [missile_frame]
             begin=-200
             end=0
-            halo=halo/mage-halo1.png,halo/mage-halo2.png,halo/mage-halo3.png,halo/mage-halo4.png,halo/mage-halo5.png
+            halo=halo/mage-halo[1-5].png
             halo_x,halo_y=10,-14
         [/missile_frame]
         [frame]
Index: data/campaigns/Liberty/units/Shadow_Mage.cfg
===================================================================
--- data/campaigns/Liberty/units/Shadow_Mage.cfg	(revision 56058)
+++ data/campaigns/Liberty/units/Shadow_Mage.cfg	(working copy)
@@ -60,7 +60,7 @@
             begin=-500
             end=50
             image="units/human-outlaws/shadow-mage.png"
-            halo=halo/shadow-mage-halo1.png,halo/shadow-mage-halo2.png,halo/shadow-mage-halo3.png,halo/shadow-mage-halo4.png,halo/shadow-mage-halo5.png,halo/shadow-mage-halo6.png,halo/shadow-mage-halo7.png,halo/shadow-mage-halo8.png,halo/shadow-mage-halo9.png,halo/shadow-mage-halo10.png
+            halo=halo/shadow-mage-halo[1-10].png
             halo_x,halo_y=12,-5
             sound=magicmissile.wav
         [/frame]
Index: src/display.cpp
===================================================================
--- src/display.cpp	(revision 56058)
+++ src/display.cpp	(working copy)
@@ -206,7 +206,7 @@
 		// Must recolor flag image
 		animated<image::locator> temp_anim;
 
-		std::vector<std::string> items = utils::split(flag);
+		std::vector<std::string> items = utils::square_parenthetical_split(flag);
 		std::vector<std::string>::const_iterator itor = items.begin();
 		for(; itor != items.end(); ++itor) {
 			const std::vector<std::string>& items = utils::split(*itor, ':');
Index: src/halo.cpp
===================================================================
--- src/halo.cpp	(revision 56058)
+++ src/halo.cpp	(working copy)
@@ -278,7 +278,7 @@
 {
 	const int id = halo_id++;
 	animated<image::locator>::anim_description image_vector;
-	std::vector<std::string> items = utils::parenthetical_split(image, ',');
+	std::vector<std::string> items = utils::square_parenthetical_split(image, ',');
 	std::vector<std::string>::const_iterator itor = items.begin();
 	for(; itor != items.end(); ++itor) {
 		const std::vector<std::string>& items = utils::split(*itor, ':');
Index: src/serialization/string_utils.hpp
===================================================================
--- src/serialization/string_utils.hpp	(revision 56058)
+++ src/serialization/string_utils.hpp	(working copy)
@@ -80,6 +80,29 @@
 	std::string const &right=")",int flags = REMOVE_EMPTY | STRIP_SPACES);
 
 /**
+ * Similar to parenthetical_split, but also expands embedded square brackets.
+ * Separator must be specified and number of entries in each square bracket
+ * must match in each section.
+ * Leading zeros are preserved if specified between sqaure brackets.
+ * 
+ * This is useful to expand animation WML code.
+ * Examples:
+ * square_parenthetical_split("a[1-3](1,[5,6,7]),b[8,9]",",") should return
+ * "a1(1,5)","a2(1,6)","a3(1,7)","b8","b9"
+ * square_parenthetical_split("abc[07-10]") should return
+ * "abc07,abc08,abc09,abc10"
+ * square_parenthetical_split("a[1,2]b[3-4]:c[5,6]") should return
+ * "a1b3:c5,a2b4:c6"
+ * square_parenthetical_split("abc[3,1].png") should return
+ * "abc3.png,abc2.png,abc1.png"
+ * square_parenthetical_split("abc[de,xyz]") should return
+ * "abcde,abcxyz"
+ */
+std::vector< std::string > square_parenthetical_split(std::string const &val,
+	const char separator = ',' , std::string const &left="([",
+	std::string const &right=")]",int flags = REMOVE_EMPTY | STRIP_SPACES);
+
+/**
  * Generates a new string joining container items in a list.
  *
  * @param v A container with elements.
Index: src/serialization/string_utils.cpp
===================================================================
--- src/serialization/string_utils.cpp	(revision 56058)
+++ src/serialization/string_utils.cpp	(working copy)
@@ -27,6 +27,7 @@
 #include "serialization/string_utils.hpp"
 #include "util.hpp"
 #include <boost/array.hpp>
+#include <boost/lexical_cast.hpp>
 
 static lg::log_domain log_engine("engine");
 #define ERR_GENERAL LOG_STREAM(err, lg::general)
@@ -114,6 +115,152 @@
 	return res;
 }
 
+std::vector< std::string > square_parenthetical_split(std::string const &val,
+		const char separator, std::string const &left,
+		std::string const &right,int flags)
+{
+	std::vector< std::string > res;
+	std::vector<char> part;
+	bool in_parenthesis = false;
+	std::vector<std::string::const_iterator> square_left;
+	std::vector<std::string::const_iterator> square_right;
+	std::vector< std::string > square_expansion;
+
+	
+	std::string::const_iterator i1 = val.begin();
+	std::string::const_iterator i2 = val.begin();
+	std::string::const_iterator j1 = val.begin();
+
+	if (i1 == val.end()) return res;
+	
+	std::string lp=left;
+	std::string rp=right;
+
+	if (!separator) {
+		ERR_GENERAL << "Separator must be specified for square bracket split funtion.\n";
+		return res;
+	}
+
+	if(left.size()!=right.size()){
+		ERR_GENERAL << "Left and Right Parenthesis lists not same length\n";
+		return res;
+	}
+
+	while (true) {
+		if(i2 == val.end() || (!in_parenthesis && *i2 == separator)) {
+			size_t size_square_exp = 0;
+			for (size_t i=0; i < square_left.size(); i++) {
+				std::string tmp_val(square_left[i]+1,square_right[i]);
+				std::vector< std::string > tmp = split(tmp_val);
+				std::vector<std::string>::const_iterator itor = tmp.begin();
+				for(; itor != tmp.end(); ++itor) {
+					size_t found = (*itor).find_first_of('-');
+					if (found == std::string::npos) {
+						std::string tmp = (*itor);
+						square_expansion.push_back(strip(tmp));
+					}
+					else { //expand number range
+						std::string s_begin = (*itor).substr(0,found);
+						s_begin = strip(s_begin);
+						int begin = atoi(s_begin.c_str());
+						int padding = 0;
+						while (padding<s_begin.size() && s_begin[padding]=='0') {
+							padding++;
+						}
+						std::string s_end = (*itor).substr(found+1);
+						s_end = strip(s_end);
+						int end = atoi(s_end.c_str());
+						if (padding==0) {
+							while (padding<s_end.size() && s_end[padding]=='0') {
+								padding++;
+							}
+						}
+						int increment = (end >= begin ? 1 : -1);
+						end+=increment; //include end in expansion
+						for (int k=begin; k!=end; k+=increment) {
+							std::string pb = boost::lexical_cast<std::string>(k);
+							for (int p=pb.size(); p<=padding; p++)
+								pb = std::string("0") + pb;
+							square_expansion.push_back(pb);
+						}
+					}
+				}
+				if (i*square_expansion.size() != (i+1)*size_square_exp ) {
+					std::string tmp(i1, i2);
+					ERR_GENERAL << "Square bracket lengths do not match up: "+tmp+"\n";
+					return res;
+				}
+				size_square_exp = square_expansion.size();
+			}
+			size_t j = 0;
+			size_t j_max = 0;
+			if (square_left.size() != 0)
+				j_max = square_expansion.size() / square_left.size();
+			do {
+				j1 = i1;
+				std::string new_val;
+				for (size_t i=0; i < square_left.size(); i++) {
+					std::string tmp_val(j1, square_left[i]);
+					new_val.append(tmp_val);
+					size_t k = j+i*j_max;
+					if (k < square_expansion.size())
+						new_val.append(square_expansion[k]);
+					j1 = square_right[i]+1;
+				}
+				std::string tmp_val(j1, i2);
+				new_val.append(tmp_val);
+				if (flags & STRIP_SPACES)
+					strip(new_val);
+				if (!(flags & REMOVE_EMPTY) || !new_val.empty())
+					res.push_back(new_val);
+				j++;
+			} while (j<j_max);
+			
+			if (i2 == val.end()) //escape loop
+				break;
+			++i2;
+			if (flags & STRIP_SPACES) { //strip leading spaces
+				while (i2 != val.end() && *i2 == ' ')
+					++i2;
+			}
+			i1=i2;
+			square_left.clear();
+			square_right.clear();
+			square_expansion.clear();
+			continue;
+		}
+		if(!part.empty() && *i2 == part.back()) {
+			part.pop_back();
+			if (*i2 == ']') square_right.push_back(i2);
+			if (part.empty())
+				in_parenthesis = false;
+			++i2;
+			continue;
+		}
+		bool found=false;
+		for(size_t i=0; i < lp.size(); i++) {
+			if (*i2 == lp[i]){
+				if (*i2 == '[')
+					square_left.push_back(i2);
+				++i2;
+				part.push_back(rp[i]);
+				found=true;
+				break;
+			}
+		}
+		if(!found){
+			++i2;
+		} else
+			in_parenthesis = true;
+	}
+
+	if(!part.empty()){
+			ERR_GENERAL << "Mismatched parenthesis:\n"<<val<<"\n";;
+	}
+
+	return res;
+}
+
 std::vector< std::string > parenthetical_split(std::string const &val,
 		const char separator, std::string const &left,
 		std::string const &right,int flags)
Index: src/builder.cpp
===================================================================
--- src/builder.cpp	(revision 56058)
+++ src/builder.cpp	(working copy)
@@ -359,7 +359,7 @@
 				BOOST_FOREACH(const std::string& var, var_strings)
 				{
 					/** @todo improve this, 99% of terrains are not animated. */
-					std::vector<std::string> frames = utils::parenthetical_split(var,',');
+					std::vector<std::string> frames = utils::square_parenthetical_split(var,',');
 					animated<image::locator> res;
 
 					BOOST_FOREACH(const std::string& frame, frames)
Index: src/unit_frame.cpp
===================================================================
--- src/unit_frame.cpp	(revision 56058)
+++ src/unit_frame.cpp	(working copy)
@@ -27,7 +27,7 @@
 	data_(),
 	input_(data)
 {
-		const std::vector<std::string> first_pass = utils::split(data);
+		const std::vector<std::string> first_pass = utils::square_parenthetical_split(data);
 		const int time_chunk = std::max<int>(duration / (first_pass.size()?first_pass.size():1),1);
 
 		std::vector<std::string>::const_iterator tmp;
@@ -248,6 +248,9 @@
 
 	if (const config::attribute_value *v = cfg.get(frame_string + "duration")) {
 		duration(*v);
+	} else if (!cfg.get(frame_string + "end")) {
+		duration((progressive_string(halo_,1)).duration());
+		
 	} else {
 		duration(cfg[frame_string + "end"].to_int() - cfg[frame_string + "begin"].to_int());
 	}
@@ -461,7 +464,6 @@
 		, const std::string& layer
 		, const std::string& modifiers)
 {
-
 	if(!highlight.empty()) {
 		highlight_ratio_ = progressive_double(highlight,duration);
 	} else if(duration != duration_){
@@ -604,6 +606,7 @@
 				orientation = halo::NORMAL;
 				break;
 		}
+		
 		if(direction != map_location::SOUTH_WEST && direction != map_location::NORTH_WEST) {
 			*halo_id = halo::add(static_cast<int>(x+current_data.halo_x* game_display::get_singleton()->get_zoom_factor()),
 					static_cast<int>(y+current_data.halo_y* game_display::get_singleton()->get_zoom_factor()),
Index: changelog
===================================================================
--- changelog	(revision 56058)
+++ changelog	(working copy)
@@ -60,6 +60,9 @@
      [effect]apply_to=type or [effect]apply_to=variation.
    * Fixed bug #20401: [remove_unit_overlay] did not work when the image used an
      image path function that took multiple parameters.
+   * Added support for square bracket expansion of 'halo' tags. E.g.
+     halo="pic[1-2,5]:[10,20,30]" expands to halo="pic1:10,pic2:20,pic5:30"
+   * Changed default unit halos and macros to use new square bracket expansion
  * Miscellaneous and bug fixes:
    * The undo stack is preserved across a save-reload.
    * Removed several unused private member variables.
