Index: src/serialization/string_utils.cpp
===================================================================
--- src/serialization/string_utils.cpp	(revision 56188)
+++ src/serialization/string_utils.cpp	(working copy)
@@ -165,26 +165,38 @@
 
 	while (true) {
 		if(i2 == val.end() || (!in_parenthesis && *i2 == separator)) {
+			//push back square contents
 			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));
+					size_t found_tilde = (*itor).find_first_of('~');
+					if (found_tilde == std::string::npos) {
+						size_t found_asterisk = (*itor).find_first_of('*');
+						if (found_asterisk == std::string::npos) {
+							std::string tmp = (*itor);
+							square_expansion.push_back(strip(tmp));
+						}
+						else { //'*' multiple expansion
+							std::string s_begin = (*itor).substr(0,found_asterisk);
+							s_begin = strip(s_begin);
+							std::string s_end = (*itor).substr(found_asterisk+1);
+							s_end = strip(s_end);
+							for (int ast=atoi(s_end.c_str()); ast>0; --ast)
+								square_expansion.push_back(s_begin);
+						}
 					}
 					else { //expand number range
-						std::string s_begin = (*itor).substr(0,found);
+						std::string s_begin = (*itor).substr(0,found_tilde);
 						s_begin = strip(s_begin);
 						int begin = atoi(s_begin.c_str());
 						size_t padding = 0;
 						while (padding<s_begin.size() && s_begin[padding]=='0') {
 							padding++;
 						}
-						std::string s_end = (*itor).substr(found+1);
+						std::string s_end = (*itor).substr(found_tilde+1);
 						s_end = strip(s_end);
 						int end = atoi(s_end.c_str());
 						if (padding==0) {
@@ -209,6 +221,8 @@
 				}
 				size_square_exp = square_expansion.size();
 			}
+			
+			//combine square contents and rest of string for comma zone block
 			size_t j = 0;
 			size_t j_max = 0;
 			if (square_left.size() != 0)
Index: data/core/macros/animation-utils.cfg
===================================================================
--- data/core/macros/animation-utils.cfg	(revision 56188)
+++ data/core/macros/animation-utils.cfg	(working copy)
@@ -519,7 +519,7 @@
         direction=n,ne,nw
 
         [missile_frame]
-            halo="halo/holy/light-beam-[1~6].png:30,halo/holy/light-beam-7.png:130,halo/holy/light-beam-[6~1].png:70"
+            halo="halo/holy/light-beam-[1~7].png:[30*6,130],halo/holy/light-beam-[6~1].png:70"
             offset=1.0
         [/missile_frame]
     [/if]
@@ -527,7 +527,7 @@
         direction=s,se,sw
 
         [missile_frame]
-            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"
+            halo="halo/holy/light-beam-[1~7].png~FL(vert):[30*6,130],halo/holy/light-beam-[6~1].png~FL(vert):70"
             offset=1.0
         [/missile_frame]
     [/else]
@@ -986,7 +986,6 @@
 #define MERMAID_STAFF_FLARE OFFSET_X OFFSET_Y
     flare_start_time=-420
     [flare_frame]
-        duration=420
         halo=halo/merfolk/staff-flare-[1~7].png:60
         halo_x,halo_y={OFFSET_X},{OFFSET_Y}
     [/flare_frame]
@@ -998,14 +997,9 @@
 #define MERMAID_WATER_BLAST_HALO
     water_start_time=-420
     [water_frame]
-        duration=360
-        halo=halo/merfolk/water-halo-[1~6].png:60
+        halo=halo/merfolk/water-halo-[1~7].png:60
     [/water_frame]
     [water_frame]
-        duration=60
-        halo=halo/merfolk/water-halo-7.png
-    [/water_frame]
-    [water_frame]
         duration=10
     [/water_frame]
 #enddef
@@ -1236,7 +1230,7 @@
         impact_burst_start_time=-160
         [impact_burst_frame]
             duration=320
-            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
+            halo=misc/blank-hex.png:1,projectiles/fire-burst-small-[1~8].png:[39,40*6,39],misc/blank-hex.png:1
             offset=1.0
             layer=1
         [/impact_burst_frame]
@@ -1248,35 +1242,35 @@
         flame_trail_5_start_time=-250
         [flame_trail_1_frame]
             duration=500
-            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=misc/blank-hex.png:1,projectiles/fire-breath-[1~10].png:[49,50*8,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~10].png:[49,50,50,50,50,50,50,50,50,49],misc/blank-hex.png:1
+            halo=misc/blank-hex.png:1,projectiles/fire-breath-[1~10].png:[49,50*8,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~10].png:[49,50,50,50,50,50,50,50,50,49],misc/blank-hex.png:1
+            halo=misc/blank-hex.png:1,projectiles/fire-breath-[1~10].png:[49,50*8,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~10].png:[49,50,50,50,50,50,50,50,50,49],misc/blank-hex.png:1
+            halo=misc/blank-hex.png:1,projectiles/fire-breath-[1~10].png:[49,50*8,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~10].png:[49,50,50,50,50,50,50,50,50,49],misc/blank-hex.png:1
+            halo=misc/blank-hex.png:1,projectiles/fire-breath-[1~10].png:[49,50*8,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
@@ -1342,35 +1336,35 @@
         flame_trail_5_start_time=-250
         [flame_trail_1_frame]
             duration=500
-            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=misc/blank-hex.png:1,projectiles/fire-breath-[1~10].png:[49,50*8,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~10].png:[49,50,50,50,50,50,50,50,50,49],misc/blank-hex.png:1
+            halo=misc/blank-hex.png:1,projectiles/fire-breath-[1~10].png:[49,50*8,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~10].png:[49,50,50,50,50,50,50,50,50,49],misc/blank-hex.png:1
+            halo=misc/blank-hex.png:1,projectiles/fire-breath-[1~10].png:[49,50*8,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~10].png:[49,50,50,50,50,50,50,50,50,49],misc/blank-hex.png:1
+            halo=misc/blank-hex.png:1,projectiles/fire-breath-[1~10].png:[49,50*8,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~10].png:[49,50,50,50,50,50,50,50,50,49],misc/blank-hex.png:1
+            halo=misc/blank-hex.png:1,projectiles/fire-breath-[1~10].png:[49,50*8,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
