diff --git a/xtrn/war/war.js b/xtrn/war/war.js
index e392cc0d60c1383f7c92fde8be9b80de50512ef9..ebf2e908b2d23f9853001a6fa9d94a1a6afbffe4 100644
--- a/xtrn/war/war.js
+++ b/xtrn/war/war.js
@@ -706,19 +706,29 @@ function analyze_stack(ms)
     }
 }
 
-function movecost(a, r, c)
+function mappos(pos)
+{
+	return map[pos.r][pos.c];
+}
+
+function mapovlpos(pos)
+{
+	return mapovl[pos.r][pos.c];
+}
+
+function movecost(a, pos)
 {
     var t, tbl, mv, city, cost, a2;
 
-    city = city_at(r, c);
+    city = city_at(pos);
     if(city == -1) {
         /* not a city */
         /* search for a TRANS_ALL unit there */
-        if(!(armies[a].r == r && armies[a].c == c)
+        if(!(armies[a].r == pos.r && armies[a].c == pos.c)
 				&& armies[a].special_mv != TRANS_ALL) {
             for(a2 = 0; a2 < armies.length; a2++) {
                 if(a != a2
-						&& armies[a2].r == r && armies[a2].c == c
+						&& armies[a2].r == pos.r && armies[a2].c == pos.c
 						&& armies[a2].nation == armies[a].nation
 						&& armies[a2].special_mv == TRANS_ALL) {
                     return 1;
@@ -727,13 +737,13 @@ function movecost(a, r, c)
 		}
 
         /* else do this: */
-		t = terrain.indexOf(map[r][c]);
+		t = terrain.indexOf(mappos(pos));
         if(t != -1) {
             tbl = armies[a].move_tbl;
             mv = move_table[tbl].cost[t];
             if(mv == 0
 					/* otherwise can't move, and */
-					&& map[r][c] != '~' 
+					&& mappos(pos) != '~' 
 					/* target space is not water, and */
 					&& map[armies[a].r][armies[a].c] == '~'
 					/* current space is water, and */
@@ -742,7 +752,7 @@ function movecost(a, r, c)
 				mv = cost * 2; /* beaching is allowed */
         }
         else {
-            if(map[r][c] == '+')
+            if(mappos(pos) == '+')
                 mv = 1;
             else
                 mv = 3;
@@ -781,7 +791,7 @@ function unit_mark(nation_mark)
 /*
  * This returns a list of armies AND updates the overlay
  */
-function get_armylist(ntn, r, c)
+function get_armylist(ntn, pos)
 {
 	var e;
 	var alist = {};
@@ -795,7 +805,7 @@ function get_armylist(ntn, r, c)
 	alist.view=[];
 	alist.enemies=[];
     for(i = 0; i < armies.length; i++) {
-        if(r == armies[i].r && c == armies[i].c) {
+        if(pos.r == armies[i].r && pos.c == armies[i].c) {
             if(armies[i].nation == ntn || ntn == -1) {
 				alist.view.push({id:i, marked: false});
             }
@@ -911,8 +921,10 @@ function showarmies(full_list, showptr)
 	return full_list.view;
 }
 
-function gmapspot(r, c, terr, mark, extra_attr)
+function gmapspot(r, c, pos, extra_attr)
 {
+	var terr = mappos(pos);
+	var mark = mapovlpos(pos);
 	var attr;
     if(mark == ' ')
         mark = terr;
@@ -946,13 +958,13 @@ function cityowner(c)
     return cities[nations[n].city].name;
 }
 
-function showcity(r, c)
+function showcity(pos)
 {
     var i;
     var buff = '';
 
     console.gotoxy(4, 19);
-    i = city_at(r, c);
+    i = city_at(pos);
     if(i != -1) {
         buff = format("City:  %s (%s)",
             cities[i].name, cityowner(i));
@@ -961,69 +973,49 @@ function showcity(r, c)
     console.print(format("%-40.40s", buff));
 }
 
-/*
- * Adjusts the passed row for wrapping.
- */
-function fixrow(r)
+var old_ul = new Position();
+function showmap(ntn, pos, force)
 {
-	return (r + map_height) % map_height;
-}
-
-/*
- * Adjusts the passed column for wrapping.
- */
-function fixcol(c)
-{
-	return (c + map_width) % map_width;
-}
-
-var old_ul_r = -1;
-var old_ul_c = -1;
-function showmap(ntn, r, c, force)
-{
-    var ul_r, ul_c, f_r, f_c;
-    var i, j, zr, zc;
-    var rem;
-
-    rem = parseInt((16 - gran) / 2);
-    f_r = r % gran;
-    f_c = c % gran;
-    ul_r = fixrow(parseInt(r / gran) * gran - rem);
-    ul_c = fixcol(parseInt(c / gran) * gran - rem);
-    if(old_ul_r != ul_r || old_ul_c != ul_c || force) {
+    var rem = parseInt((16 - gran) / 2);
+	var ul = new Position(parseInt(pos.r / gran) * gran - rem, parseInt(pos.c / gran) * gran - rem);
+	var f_r = pos.r % gran;
+	var f_c = pos.c % gran;
+	var z = new Position();
+    var i, j;
+
+    if(old_ul.r != ul.r || old_ul.c != ul.c || force) {
         for(i = 0; i < 16; i++) {
             for(j = 0; j < 16; j++) {
-                zr = fixrow(ul_r+i);
-                zc = fixcol(ul_c+j);
-                gmapspot(i, j, map[zr][zc], mapovl[zr][zc], '');
+				z.r = ul.r+i;
+				z.c = ul.c+j;
+                gmapspot(i, j, z, '');
             }
 		}
 	}
-	console.attributes='N';
-    old_ul_r = ul_r;
-    old_ul_c = ul_c;
-    if(mapovl[r][c] != ' ')
-        showcity(r, c);
+    old_ul = ul;
+    if(mapovlpos(pos) != ' ')
+        showcity(pos);
     console.gotoxy(f_c * 2 + 16, f_r + 8);
 }
 
 /*
  * Redraws the current focus point of the map
  */
-function showfocus(r, c)
+function showfocus(pos)
 {
     var f_r, f_c, rem;
 
     rem = parseInt((16 - gran) / 2);
-    f_r = (r % gran) + rem;
-    f_c = (c % gran) + rem;
-    gmapspot(f_r, f_c, map[r][c], mapovl[r][c], '');
+    f_r = (pos.r % gran) + rem;
+    f_c = (pos.c % gran) + rem;
+    gmapspot(f_r, f_c, pos, '');
     console.attributes='N';
 }
 
-function move_mode(full_list, ntn, rp, cp)
+function move_mode(full_list, ntn, pos)
 {
-    var i, j, mv, ch, city, army, t_r, t_c, a, b, ok, cnt, max, flag;
+    var i, j, mv, ch, city, army, a, b, ok, cnt, max, flag;
+	var t = new Position();
     var ac, hc, mmode;
     var mvc = new Array(TRANS_ALL+1);
     var gap, temp;
@@ -1033,11 +1025,11 @@ function move_mode(full_list, ntn, rp, cp)
 
 	if(turn_done) {
 		saystat("Turn is currently done, cannot issue orders");
-        return {r:rp,c:cp,full_list:full_list};
+        return {full_list:full_list};
 	}
     if(full_list.view.length < 1) {
         saystat("No Army to Move.");
-        return {r:rp,c:cp,full_list:full_list};
+        return {full_list:full_list};
     }
     flag = 0;
     for(i = 0; i < full_list.view.length; i++) {
@@ -1047,7 +1039,7 @@ function move_mode(full_list, ntn, rp, cp)
 				&& (armies[full_list.view[i].id].move_left > 0 || ntn == -1)) {
             if(movestack.length >= 10 && ntn >= 0) {
                 saystat("Too Many Armies for Group.");
-        		return {r:rp,c:cp,full_list:full_list};
+        		return {full_list:full_list};
             }
             movestack.push({
 				id:full_list.view[i].id,
@@ -1067,7 +1059,7 @@ function move_mode(full_list, ntn, rp, cp)
     }
     if(movestack.length < 1 && ntn > -1) {
         saystat("Armies Have No Movement Left.");
-        return {r:rp,c:cp,full_list:full_list};
+        return {full_list:full_list};
     }
 
     /* 
@@ -1092,9 +1084,9 @@ function move_mode(full_list, ntn, rp, cp)
             a = unmarked[i].id;
             if(unmarked[i].dep == a
 					&& armies[a].special_mv != TRANS_ALL
-					&& movecost(a, armies[a].r, armies[a].c) == 0) {
+					&& movecost(a, new Position(armies[a].r, armies[a].c)) == 0) {
                 saystat("Armies Would Be Stranded...  Movement Cancelled.");
-                return {r:rp,c:cp,full_list:full_list};
+                return {full_list:full_list};
             }
         }
     }
@@ -1115,57 +1107,55 @@ function move_mode(full_list, ntn, rp, cp)
     console.gotoxy(21, 22);
     console.print("7 8 9      e r t    SPACE to Stop.  ");
 	showarmies(full_list, false);
-    showmap(ntn, rp, cp, false);
+    showmap(ntn, pos, false);
     while(movestack.length > 0 && (ch = console.getkey()) != ' '
 			&& ch != 'q' && ch != '\x1b') {
-        showfocus(rp, cp);
+        showfocus(pos);
         clearstat(0);
-        t_r = rp;
-        t_c = cp;
+		t.r = pos.r;
+		t.c = pos.c;
         switch(ch) { /* directions */
         case '7' :
         case 'e' :
-            t_r--;
-            t_c--;
+            t.r--;
+            t.c--;
             break;
         case '8' :
         case 'r' :
-            t_r--;
+            t.r--;
             break;
         case '9' :
         case 't' :
-            t_r--;
-            t_c++;
+            t.r--;
+            t.c++;
             break;
         case '4' :
         case 'd' :
-            t_c--;
+            t.c--;
             break;
         case '6' :
         case 'g' :
-            t_c++;
+            t.c++;
             break;
         case '1' :
         case 'c' :
-            t_r++;
-            t_c--;
+            t.r++;
+            t.c--;
             break;
         case '2' :
         case 'v' :
-            t_r++;
+            t.r++;
             break;
         case '3' :
         case 'b' :
-            t_r++;
-            t_c++;
+            t.r++;
+            t.c++;
             break;
         case '\f' :
 			// TODO: Refresh
             break;
         }
-        t_r = fixrow(t_r);
-        t_c = fixcol(t_c);
-        if(t_r != rp || t_c != cp) {
+        if(t.r != pos.r || t.c != pos.c) {
             /* actual move code... */
             ok = 1;
 
@@ -1174,7 +1164,7 @@ function move_mode(full_list, ntn, rp, cp)
                 for(i = 0; i < movestack.length; i++) {
                     a = movestack[i].id;
                     if(movestack[i].dep == a) {
-                        mv = movecost(a, t_r, t_c);
+                        mv = movecost(a, t);
                         if(mv > armies[a].move_left
                         || mv == 0) {
                             ok = 0;
@@ -1192,9 +1182,9 @@ function move_mode(full_list, ntn, rp, cp)
                 cnt = 0;
                 for(i = 0; i < armies.length; i++)
                 if(armies[i].nation == ntn
-						&& armies[i].r == t_r && armies[i].c == t_c)
+						&& armies[i].r == t.r && armies[i].c == t.c)
                     cnt++;
-                city = city_at(t_r, t_c);
+                city = city_at(t);
                 max = 10;
                 if(city != -1
                 && cities[city].nation == ntn)
@@ -1209,7 +1199,7 @@ function move_mode(full_list, ntn, rp, cp)
             if(ok && ntn > -1) {
                 for(i = 0; i < armies.length; i++) {
                     if(armies[i].nation != ntn
-							&& armies[i].r == rp && armies[i].c == cp) {
+							&& armies[i].r == pos.r && armies[i].c == pos.c) {
                         ok = 0;
 						saystat("Can't Leave Combat.");
                         break;
@@ -1223,19 +1213,19 @@ function move_mode(full_list, ntn, rp, cp)
                     a = movestack[i].id;
                     if(ntn > -1) {
                         if(movestack[i].dep == a)
-                            mv = movecost(a, t_r, t_c);
+                            mv = movecost(a, t);
                         else
                             mv = armies[a].move_left ? 1 : 0;
                     } else
                         mv = 0;
                     movestack[i].moved += mv;
                     armies[a].move_left -= mv;
-                    armies[a].r = t_r;
-                    armies[a].c = t_c;
+                    armies[a].r = t.r;
+                    armies[a].c = t.c;
                 }
-                rp = t_r;
-                cp = t_c;
-				full_list = get_armylist(ntn, rp, cp);
+				pos.r = t.r;
+				pos.c = t.c;
+				full_list = get_armylist(ntn, pos);
 				for(i = 0; i < movestack.length; i++) {
 					for(j = 0; j < full_list.view.length; j++) {
 						if(full_list.view[j].id == movestack[i].id)
@@ -1246,33 +1236,33 @@ function move_mode(full_list, ntn, rp, cp)
             }
 
             /* redo screen. */
-            showmap(ntn, rp, cp, ok);
+            showmap(ntn, pos, ok);
         }
-        showfocus(rp, cp);
+        showfocus(pos);
     }
     if(ntn > -1 && ch != 'q' && ch != '\x1b') {
         for(i = 0; i < movestack.length; i++) {
             if(movestack[i].moved > 0 || ntn == -1) {
                 pfile.write(format("move-army %d %d %d %d %d\n",
                     movestack[i].id, movestack[i].moved,
-                    rp, cp, movestack[i].dep));
+                    pos.r, pos.c, movestack[i].dep));
             }
 		}
 	}
     clearstat(-1);
-    return {r:rp,c:cp,full_list:full_list};
+    return {full_list:full_list};
 }
 
 /*
  * Returns the first army belonging to n at r/c
  */
-function my_army_at(r, c, n)
+function my_army_at(pos, n)
 {
     var i;
 
     for(i = 0; i < armies.length; i++) {
         if(armies[i].nation == n
-				&& armies[i].r == r && armies[i].c == c)
+				&& armies[i].r == pos.r && armies[i].c == pos.c)
             return i;
 	}
     return -1;
@@ -1281,20 +1271,20 @@ function my_army_at(r, c, n)
 /*
  * Shows the information about the specified tile in the status area
  */
-function show_info(r, c)
+function show_info(pos)
 {
     var buff;
     var i, city, ac, hc;
 
     buff = '';
-    city = city_at(r, c);
+    city = city_at(pos);
     if(city != -1) {
         buff = format("City:  %s (%s)", cities[city].name,
             nationcity(cities[city].nation));
     }
     else {
-		i=terrain.indexOf(map[r][c]);
-		if(i==-1 && map[r][c]==' ')
+		i=terrain.indexOf(mappos(pos));
+		if(i==-1 && mappos(pos)==' ')
 			buff = "Ocean";
 		else
 			buff = terr_names[i];
@@ -1302,7 +1292,7 @@ function show_info(r, c)
     ac = 0;
     hc = 0;
     for(i = 0; i < armies.length; i++) {
-        if(armies[i].r == r && armies[i].c == c) {
+        if(armies[i].r == pos.r && armies[i].c == pos.c) {
             if(armies[i].hero > 0)
                 hc++;
             else
@@ -1313,14 +1303,17 @@ function show_info(r, c)
     saystat(buff);
 }
 
-function info_mode(full_list, rp, cp, n, ch)
+function info_mode(full_list, pos, n, ch)
 {
-    var done, r, c, ul_r, ul_c, f_r, f_c, t_r, t_c, a_r, a_c;
+	var p, ul, t, a;
+	var f_r, f_c;
+    var done;
     var city, army, i, focus;
     var rem;
+	var centre = new Position(pos.r, pos.c);
 
     rem = parseInt((16 - gran) / 2);
-    showfocus(rp, cp);
+    showfocus(pos);
     clearstat(-1);
     console.gotoxy(21,23);
 	console.attributes = attrs.status_area;	
@@ -1329,17 +1322,15 @@ function info_mode(full_list, rp, cp, n, ch)
     console.print("1 2 3      c v b");
     console.gotoxy(2,22);
     console.print("Info Mode:         7 8 9      e r t      ESC to Stop.  ");
-    r = a_r = rp;
-    c = a_c = cp;
-    ul_r = fixrow(parseInt(r / gran) * gran - rem);
-    ul_c = fixcol(parseInt(c / gran) * gran - rem);
-    f_r = (r % gran) + rem;
-    f_c = (c % gran) + rem;
-    t_r = fixrow(ul_r + f_r);
-    t_c = fixcol(ul_c + f_c);
+	p = new Position(pos.r, pos.c);
+	a = new Position(pos.r, pos.c);
+	ul = new Position(parseInt(pos.r / gran) * gran - rem, parseInt(pos.c / gran) * gran - rem);
+    f_r = (pos.r % gran) + rem;
+    f_c = (pos.c % gran) + rem;
+	t = new Position(ul.r + f_r, ul.c + f_c);
     done = false;
     do {
-   		gmapspot(f_r, f_c, map[t_r][t_c], mapovl[t_r][t_c], '');
+   		gmapspot(f_r, f_c, t, '');
         switch(ch) {
 		case '' :
 			break;
@@ -1389,45 +1380,44 @@ function info_mode(full_list, rp, cp, n, ch)
         }
         if(f_r < gran-1) {
 			f_r += gran;
-			ul_r = fixrow(ul_r - gran);
-			rp = fixrow(rp - gran);
+			ul.r -= gran;
+			centre.r -= gran;
 			focus = true;
 		}
         if(f_c < gran-1) {
 			f_c += gran;
-			ul_c = fixcol(ul_c - gran);
-			cp = fixcol(cp - gran);
+			ul.c -= gran;
+			centre.c -= gran;
 			focus = true;
 		}
         if(f_r > 15 - gran + 1) {
 			f_r -= gran;
-			ul_r = fixrow(ul_r + gran);
-			rp = fixrow(rp + gran);
+			ul.r += gran;
+			centre.r += gran;
 			focus = true;
 		}
         if(f_c > 15 - gran + 1) {
 			f_c -= gran;
-			ul_c = fixcol(ul_c + gran);
-			cp += gran;
-			cp = fixcol(cp);
+			ul.c += gran;
+			centre.c += gran;
 			focus = true;
 		}
-        t_r = fixrow(ul_r + f_r);
-        t_c = fixcol(ul_c + f_c);
-        city = my_city_at(t_r, t_c, n);
-        army = my_army_at(t_r, t_c, n);
+        t.r = ul.r + f_r;
+        t.c = ul.c + f_c;
+        city = my_city_at(t, n);
+        army = my_army_at(t, n);
         if(focus || army >= 0 || city >= 0) {
-			showmap(n, rp, cp, false);
+			showmap(n, centre, false);
 			if(army >= 0 || city >= 0) {
-				a_r = t_r;
-				a_c = t_c;
-				full_list = get_armylist(n, a_r, a_c);
+				pos.r = t.r;
+				pos.c = t.c;
+				full_list = get_armylist(n, pos);
 				showarmies(full_list, true);
 			}
 			focus = false;
 		}
-		show_info(t_r, t_c);
-    	gmapspot(f_r, f_c, map[t_r][t_c], mapovl[t_r][t_c], 'I');
+		show_info(t);
+    	gmapspot(f_r, f_c, t, 'I');
         console.gotoxy(f_c * 2 + 3, f_r + 2);
         if(!done) {
 			do {
@@ -1441,37 +1431,38 @@ function info_mode(full_list, rp, cp, n, ch)
 			} while(ch=='' && !done);
 		}
     } while(!done);
-   	gmapspot(f_r, f_c, map[t_r][t_c], mapovl[t_r][t_c], '');
-    return {r:a_r,c:a_c,ch:ch,full_list:full_list};
+   	gmapspot(f_r, f_c, t, '');
+    return {ch:ch,full_list:full_list};
 }
 
-function groupcmp(r1, c1, r2, c2)
+function groupcmp(pos1, pos2)
 {
     /* quadrant check */
-    if(parseInt(r1 / 16) > parseInt(r2 / 16))
+    if(parseInt(pos1.r / 16) > parseInt(pos2.r / 16))
         return 1;
-    if(parseInt(r1 / 16) < parseInt(r2 / 16))
+    if(parseInt(pos1.r / 16) < parseInt(pos2.r / 16))
         return -1;
-    if(parseInt(c1 / 16) > parseInt(c2 / 16))
+    if(parseInt(pos1.c / 16) > parseInt(pos2.c / 16))
         return 1;
-    if(parseInt(c1 / 16) < parseInt(c2 / 16))
+    if(parseInt(pos1.c / 16) < parseInt(pos2.c / 16))
         return -1;
 
     /* exact check */
-    if(r1 > r2)
+    if(pos1.r > pos2.r)
         return 1;
-    if(r1 < r2)
+    if(pos1.r < pos2.r)
         return -1;
-    if(c1 > c2)
+    if(pos1.c > pos2.c)
         return 1;
-    if(c1 < c2)
+    if(pos1.c < pos2.c)
         return -1;
     return 0;
 }
 
-function skipto(next, group, ntn, rp, cp)
+function skipto(next, group, ntn, pos)
 {
-    var i, t_r, t_c;
+	var t = new Position();
+    var i;
 	var cmp;
 
 	if(next)
@@ -1479,15 +1470,13 @@ function skipto(next, group, ntn, rp, cp)
 	else
 		cmp = function(x) { return x < 0; };
 
-    t_r = -1;
-    t_c = -1;
     if(group) {
 		for(i = 0; i < cities.length; i++) {
 			if(cities[i].nation == ntn) {
-				if(cmp(groupcmp(cities[i].r, cities[i].c, rp, cp))
-						&& (t_r == -1 || !cmp(groupcmp(cities[i].r, cities[i].c, t_r, t_c)))) {
-					t_r = cities[i].r;
-					t_c = cities[i].c;
+				if(cmp(groupcmp(new Position(cities[i].r, cities[i].c), pos))
+						&& (t.r == -1 || !cmp(groupcmp(cities[i].r, cities[i].c, t.r, t.c)))) {
+					t.r = cities[i].r;
+					t.c = cities[i].c;
 				}
 			}
 		}
@@ -1496,36 +1485,39 @@ function skipto(next, group, ntn, rp, cp)
 		if(!group && armies[i].move_left <= 0)
 			continue;
         if(armies[i].nation == ntn) {
-            if(cmp(groupcmp(armies[i].r, armies[i].c, rp, cp))
-					&& (t_r == -1 || !cmp(groupcmp(armies[i].r, armies[i].c, t_r, t_c)))) {
-                t_r = armies[i].r;
-                t_c = armies[i].c;
+            if(cmp(groupcmp(new Position(armies[i].r, armies[i].c), pos))
+					&& (t.r == -1 || !cmp(groupcmp(armies[i].r, armies[i].c, t.r, t.c)))) {
+                t.r = armies[i].r;
+                t.c = armies[i].c;
 			}
 		}
 	}
-    if(t_r != -1)
-		return {r:t_r,c:t_c,ret:true};
-    return {r:rp,c:cp,ret:false};
+    if(t.r != -1 && t.c != -1) {
+		pos.r = t.r;
+		pos.c = t.c;
+		return true;
+	}
+    return false;
 }
 
-function prevgroup(ntn, rp, cp)
+function prevgroup(ntn, pos)
 {
-	return skipto(false, true, ntn, rp, cp);
+	return skipto(false, true, ntn, pos);
 }
 
-function prevarmy(ntn, rp, cp)
+function prevarmy(ntn, pos)
 {
-	return skipto(false, false, ntn, rp, cp);
+	return skipto(false, false, ntn, pos);
 }
 
-function nextgroup(ntn, rp, cp)
+function nextgroup(ntn, pos)
 {
-	return skipto(true, true, ntn, rp, cp);
+	return skipto(true, true, ntn, pos);
 }
 
-function nextarmy(ntn, rp, cp)
+function nextarmy(ntn, pos)
 {
-	return skipto(true, false, ntn, rp, cp);
+	return skipto(true, false, ntn, pos);
 }
 
 var help_mode = 0;
@@ -1763,19 +1755,19 @@ function produce(city)
 
 var upd_pos=0;
 var upd_top=0;
-function update(full_list, ntn, or, oc)
+function update(full_list, ntn, pos)
 {
 	var fp = new File(getpath(format(TURNFL, ntn)));
 	var lines;
 	var lpos = -1;
 	var ltop = -1;
 	var i;
-	var r=or,c=oc;
+	var upos = new Position(pos.r, pos.c);
 	var ch;
 	var m;
 
 	showarmies(full_list, false);
-	showmap(ntn, r, c, true);
+	showmap(ntn, upos, true);
 	console.attributes = attrs.status_area;
 	if(fp.open('rb')) {
 		lines=fp.readAll();
@@ -1792,8 +1784,8 @@ function update(full_list, ntn, or, oc)
 						if((m = lines[upd_top+i].match(/^([0-9]+) ([0-9]+) (.*)$/))!=null) {
 							if(upd_top+i == upd_pos) {
 								console.print('=> ');
-								r=parseInt(m[1], 10);
-								c=parseInt(m[2], 10);
+								upos.r=parseInt(m[1], 10);
+								upos.c=parseInt(m[2], 10);
 							}
 							else
 								console.print('   ');
@@ -1802,7 +1794,7 @@ function update(full_list, ntn, or, oc)
 					}
 					console.cleartoeol();
 				}
-				showfocus(or, oc);
+				showfocus(pos);
 			}
 			else if(lpos != upd_pos) {
 				console.gotoxy(2, 21+(lpos-upd_top));
@@ -1810,10 +1802,10 @@ function update(full_list, ntn, or, oc)
 				console.gotoxy(2, 21+(upd_pos-upd_top));
 				console.print('=>');
 				if((m = lines[upd_pos].match(/^([0-9]+) ([0-9]+) (.*)$/))!=null) {
-					r=parseInt(m[1]);
-					c=parseInt(m[2]);
+					upos.r=parseInt(m[1]);
+					upos.c=parseInt(m[2]);
 				}
-				showfocus(or, oc);
+				showfocus(pos);
 			}
 			lpos = upd_pos;
 			ltop = upd_top;
@@ -1824,7 +1816,7 @@ function update(full_list, ntn, or, oc)
 						console.gotoxy(45, 20);
 						console.attributes = genattrs.border;
 						console.print((new Array(36)).join(ascii(196)));
-						return {r:or,c:oc,ch:'',full_list:full_list};
+						return {ch:'',full_list:full_list};
 					}
 				}
 				break;
@@ -1845,56 +1837,56 @@ function update(full_list, ntn, or, oc)
 					upd_top = upd_pos-3;
 				break;
 			case 'u':
-				if(or != r || oc != c) {
-					or = r;
-					oc = c;
-					full_list = get_armylist(ntn, r, c);
+				if(pos.r != upos.r || pos.c != upos.c) {
+					pos.r = upos.r;
+					pos.c = upos.c;
+					full_list = get_armylist(ntn, upos);
 					showarmies(full_list, false);
-					showmap(ntn, or, oc, false);
-					showfocus(or, oc);
+					showmap(ntn, pos, false);
+					showfocus(pos);
 				}
 				break;
 			default:
 				console.gotoxy(45, 20);
 				console.attributes = genattrs.border;
 				console.print((new Array(36)).join(ascii(196)));
-				return {r:or,c:oc,ch:ch,full_list:full_list};
+				return {ch:ch,full_list:full_list};
 			}
 		}
 	}
 	else
 		saystat("No updates this turn!");
-	return {r:or,c:oc,ch:'',full_list:full_list};
+	return {ch:'',full_list:full_list};
 }
 
 function mainloop(ntn)
 {
-    var ch, r, c, i, n, city, army, force, obj;
+	var pos = new Position();
+    var ch, i, n, city, army, force, obj;
     var inbuf, buff;
 	var keep_ch = false;
 	var orig_pt = console.ctrlkey_passthru;
 	var full_list;
+	var id;
 
-    r = -1;
-    c = -1;
     army = -1;
 
     /* find the player's capitol city */
     if(cities[nations[ntn].city].nation == ntn) {
         i = nations[ntn].city;
-        r = cities[i].r;
-        c = cities[i].c;
+        pos.r = cities[i].r;
+        pos.c = cities[i].c;
     }
 
     /* find the player's first city */
-    city = city_at(r, c);
+    city = city_at(pos);
     if(city != -1 && cities[city].nation != ntn)
         city = -1;
     if(city == -1) {
         for(i = 0; i < cities.length; i++) {
             if(cities[i].nation == ntn) {
-                r = cities[i].r;
-                c = cities[i].c;
+                pos.r = cities[i].r;
+                pos.c = cities[i].c;
                 break;
             }
 		}
@@ -1904,8 +1896,8 @@ function mainloop(ntn)
     if(city == -1) {
         for(i = 0; i < armies.length; i++) {
             if(armies[i].nation == ntn) {
-                r = armies[i].r;
-                c = armies[i].c;
+                pos.r = armies[i].r;
+                pos.c = armies[i].c;
                 army = i;
                 break;
             }
@@ -1921,13 +1913,11 @@ function mainloop(ntn)
 
 	/* Check for messages */
 	inbuf = format(MAILFL, ntn);
-	full_list = get_armylist(ntn, r, c);
+	full_list = get_armylist(ntn, pos);
 	showarmies(full_list, true);
-	showmap(ntn, r, c, true);
-	showfocus(r, c);
-	obj = update(full_list, ntn, r, c);
-	r = obj.r;
-	c = obj.c;
+	showmap(ntn, pos, true);
+	showfocus(pos);
+	obj = update(full_list, ntn, pos);
 	ch = obj.ch;
 	full_list = obj.full_list;
 	if(ch != '')
@@ -1939,9 +1929,9 @@ function mainloop(ntn)
     for(;;) {
 		// TODO : Should be conditional
 		showarmies(full_list, true);
-        showmap(ntn, r, c, force);
+        showmap(ntn, pos, force);
         force = false;
-        showfocus(r, c);
+        showfocus(pos);
 		if(!keep_ch) {
 			do {
 				ch = console.inkey(5000);
@@ -1980,15 +1970,13 @@ function mainloop(ntn)
 								return;
 							}
 							mainscreen();
-							full_list = get_armylist(ntn, r, c);
+							full_list = get_armylist(ntn, pos);
 							showarmies(full_list, true);
-							showmap(ntn, r, c, true);
-							showfocus(r, c);
+							showmap(ntn, pos, true);
+							showfocus(pos);
 							upd_pos=0;
 							upd_top=0;
-							obj = update(full_list, ntn, r, c);
-							r = obj.r;
-							c = obj.c;
+							obj = update(full_list, ntn, pos);
 							ch = obj.ch;
 							full_list = obj.full_list;
 						}
@@ -1997,11 +1985,11 @@ function mainloop(ntn)
 			} while(ch=='');
 		}
 		keep_ch = false;
-        showfocus(r, c);
+        showfocus(pos);
         clearstat(-1);
         switch(ch) {
         case 'p' : /* production */
-            city = city_at(r, c);
+            city = city_at(pos);
             if(city != -1 && cities[city].nation == ntn)
                 produce(city);
             else
@@ -2012,48 +2000,26 @@ function mainloop(ntn)
 			force = true;
 			break;
         case ctrl(']') : /* next army */
-			obj = nextarmy(ntn, r, c);
-			r = obj.r;
-			c = obj.c;
-            if(!obj.ret)
+			if(!nextarmy(ntn, pos))
                 saystat("No Next Army with Movement Found");
             break;
         case ']' : /* next group */
-			obj = nextgroup(ntn, r, c);
-			r = obj.r;
-			c = obj.c;
-            if(!obj.ret)
+			if(!nextgroup(ntn, pos))
                 saystat("No More Groups Remain.");
             break;
         case '}' : /* last group */
-            while((obj = nextgroup(ntn, r, c)).ret) {
-				r = obj.r;
-				c = obj.c;
-			}
-			r = obj.r;
-			c = obj.c;
+            while(nextgroup(ntn, pos));
             break;
         case ctrl('[') : /* prev army */
-			obj = prevarmy(ntn, r, c);
-			r = obj.r;
-			c = obj.c;
-            if(!obj.ret)
+			if(!prevarmy(ntn, pos))
                 saystat("No Previous Army with Movement Found");
             break;
         case '[' : /* previous group */
-			obj = prevgroup(ntn, r, c);
-			r = obj.r;
-			c = obj.c;
-            if(!obj.ret)
+			if(!prevgroup(ntn, pos))
                 saystat("No Previous Groups Remain.");
             break;
         case '{' : /* first group */
-            while((obj = prevgroup(ntn, r, c)).ret) {
-				r = obj.r;
-				c = obj.c;
-			}
-			r = obj.r;
-			c = obj.c;
+            while(prevgroup(ntn, pos));
             break;
         case 'n' : /* name hero */
 			if(turn_done) {
@@ -2098,7 +2064,7 @@ function mainloop(ntn)
             break;
         case 'I' : /* army information */
             if(full_list.view.length > 0) {
-                var id = full_list.view[full_list.pointer].id;
+                id = full_list.view[full_list.pointer].id;
                 buff = format("%s: Combat %d / Hero %d %s",
                     armyname(id), armies[id].combat, armies[id].hero,
                     ((armies[id].hero > 0 && armies[id].eparm1) ? "(Loyal)" : ""));
@@ -2117,9 +2083,7 @@ function mainloop(ntn)
                 break;
             /* fall through */
         case 'm' : /* move */
-            obj = move_mode(full_list, ntn, r, c);
-            r = obj.r;
-            c = obj.c;
+            obj = move_mode(full_list, ntn, pos);
 			full_list = obj.full_list;
             break;
         case '/' : /* unmark all */
@@ -2143,18 +2107,14 @@ function mainloop(ntn)
         case 'c' :
         case 'v' :
         case 'b' :
-            obj = info_mode(full_list, r, c, ntn, ch);
-            r = obj.r;
-            c = obj.c;
+            obj = info_mode(full_list, pos, ntn, ch);
 			ch = obj.ch;
 			full_list = obj.full_list;
 			if(ch != '')
 				keep_ch = true;
             break;
 		case 'u' :
-            obj = update(full_list, ntn, r, c);
-            r = obj.r;
-            c = obj.c;
+            obj = update(full_list, ntn, pos);
 			ch = obj.ch;
 			full_list = obj.full_list;
 			if(ch != '')
@@ -2200,6 +2160,7 @@ function mainloop(ntn)
 			force = true;
 			break;
         case '\f' :
+			mainscreen();
 			force = true;
             break;
 		case 'x' :
diff --git a/xtrn/war/warcommon.js b/xtrn/war/warcommon.js
index a21741763df2f97b4693b3e6f3c1ab41a9884917..cdade2f2193e6a139fa6b90d2493a549c191e29d 100644
--- a/xtrn/war/warcommon.js
+++ b/xtrn/war/warcommon.js
@@ -49,7 +49,7 @@ const TRANS_HERO = 1;
 const TRANS_ONE  = 2;
 const TRANS_ALL  = 3;
 const MAILFL     = "mail.%03d";
-const TMPMAILFL	 = "%04d.tmpmsg"
+const TMPMAILFL	 = "%04d.tmpmsg";
 const NEWSFL     = "news";
 const HEADERMARK = " \b";
 const MAILLOG    = "mail.log";
@@ -198,7 +198,7 @@ function event(text, r, c, ntn)
 	var fp = new File(game_dir+'/'+format(TURNFL, ntn));
 
 	if(fp.open('ab')) {
-		fp.write(r+' '+c+' '+text+'\n');
+		fp.write(pos.r+' '+pos.c+' '+text+'\n');
 		fp.close();
 	}
 }
@@ -474,21 +474,21 @@ function execpriv(line)
 	return privtable[args[0]](args.length, args);
 }
 
-function my_city_at(r, c, n)
+function my_city_at(pos, n)
 {
 	var i;
 
 	for(i = 0; i < cities.length; i++) {
 		if((n < 0 || cities[i].nation == n)
-				&& cities[i].r == r && cities[i].c == c)
+				&& cities[i].r == pos.r && cities[i].c == pos.c)
 			return i;
 	}
 	return -1;
 }
 
-function city_at(r, c)
+function city_at(pos)
 {
-	return my_city_at(r, c, -1);
+	return my_city_at(pos, -1);
 }
 
 function nationcity(n)
@@ -563,3 +563,30 @@ function hero_name(hero)
 		hname = '(Nameless Hero)';
 	return hname;
 }
+
+function Position(r, c)
+{
+	if(r==undefined)
+		this.__r = -1;
+	if(c==undefined)
+		this.__c = -1;
+	this.__r = (r + map_height) % map_height;
+	this.__c = (c + map_width) % map_width;
+
+}
+Object.defineProperty(Position.prototype, 'r', {
+	get: function() {
+		return this.__r;
+	},
+	set: function(r) {
+		this.__r = (r + map_height) % map_height;
+	}
+});
+Object.defineProperty(Position.prototype, 'c', {
+	get: function() {
+		return this.__c;
+	},
+	set: function(c) {
+		this.__c = (c + map_width) % map_width;
+	}
+});
diff --git a/xtrn/war/warupd.js b/xtrn/war/warupd.js
index 89617cf146dc361d9da2632ab382dc20511fd340..fe2194e2d7a699085302dbc4eb77526838a82801 100644
--- a/xtrn/war/warupd.js
+++ b/xtrn/war/warupd.js
@@ -303,7 +303,7 @@ function make_stack(stack, a)
 	}
 
 	/* And find the city (make sure it belongs to the armies nation) */
-	stack.city = city_at(r, c);
+	stack.city = city_at(new Position(r, c));
 	if(stack.city != -1) {
 		if(cities[stack.city].nation != n)
 			stack.city = -1;
@@ -388,7 +388,7 @@ function battle(a, b)
 	names[1] = nationcity(ntns[1]);
 	r = armies[a].r;
 	c = armies[a].c;
-	city = city_at(r, c);
+	city = city_at(new Position(r, c));
 
 	/* announce the battle */
 	buff = "Battle between "+names[0]+" and "+names[1];
@@ -548,7 +548,7 @@ function combat(n)
 	 */
 	for(i = 0; i < armies.length; i++) {
 		if(armies[i].nation == n) {
-			if((c = city_at(armies[i].r, armies[i].c)) != -1
+			if((c = city_at(new Position(armies[i].r, armies[i].c))) != -1
 					&& cities[c].nation != n) {
 				mail_line(HEADERMARK, armies[i].nation);
 				mail_line(HEADERMARK, cities[c].nation);