diff --git a/xtrn/dicewarz2/ai.js b/xtrn/dicewarz2/ai.js
index e82475e9ce5b60f88d8ff7669da76e8d6a1b7ef6..a43be2b0dae424cc9bf02ab4b56a123d0da02a51 100644
--- a/xtrn/dicewarz2/ai.js
+++ b/xtrn/dicewarz2/ai.js
@@ -1,4 +1,3 @@
-load("funclib.js");
 var game_number=argv[0];
 var game_dir=argv[1];
 load(game_dir+"maps.js");
@@ -203,10 +202,23 @@ function singleAttackQuantity(tlen)
 }
 
 /* Attack functions */
-function takeTurn()
+function main()
+{
+	while(map.players[map.turn].AI && map.in_progress) {
+		takeTurn();
+		if(countActivePlayers(map)==2 && countTiles(map,map.turn)<map.tiles.length*.4) {
+			forfeit();
+		} else {
+			reinforce();
+			updateStatus(map);
+			nextTurn(map);
+		}
+		game_data.saveData(map);
+	}
+}
+function attack()
 {
 	var computer=map.players[map.turn];
-	debug("computer taking turn: " + computer.name);
 	var territories=getPlayerTiles(map,map.turn);
 	var attacks=[];
 	
@@ -256,12 +268,17 @@ function takeTurn()
 			var roll=random(6)+1;
 			d.roll(roll);
 		}
-		var data=new Data("battle");
+		var data=new Packet("battle");
 		data.a=a;
 		data.d=d;
 		stream.send(data);
 		
 		if(a.total>d.total) {
+			if(countTiles(map,defending.owner)==1) {
+				players.scoreKill(map.players[attacking.owner].name);
+				players.scoreLoss(map.players[defending.owner].name);
+				map.players[defending.owner].active=false;
+			}
 			defending.assign(attacking.owner,attacking.dice-1);
 		} 
 		attacking.dice=1;
@@ -275,15 +292,36 @@ function takeTurn()
 	computer.AI.turns++;
 	return true;
 }
+function takeTurn()
+{
+	while(map.in_progress) {
+		if(!attack()) break;
+		updateStatus(map);
+		mswait(500);
+	}
+}
+function forfeit()
+{
+	map.in_progress=false;
+	map.players[map.turn].active=false;
+	var data=new Packet("activity");
+	data.activity=("\1n\1y" + map.players[map.turn].name + " forfeits");
+	stream.send(data);
+	players.scoreLoss(map.players[map.turn].name);
+}
 function reinforce()
 {
 	var player_tiles=getPlayerTiles(map,map.turn);
 	var reinforcements=countConnected(map,player_tiles,map.turn);
 	var placed=placeReinforcements(map,player_tiles,reinforcements);
-	var reserved=placeReserves(map,reinforcements-placed.length);
-	var data=new Data("activity");
-	if(placed.length>0) {
-		data.activity=("\1n\1y" + map.players[map.turn].name + " placed " + placed.length + " dice");
+	var total=0;
+	for(var p in placed) {
+		total+=placed[p];
+	}
+	var reserved=placeReserves(map,reinforcements-total);
+	var data=new Packet("activity");
+	if(total>0) {
+		data.activity=("\1n\1y" + map.players[map.turn].name + " placed " + total + " dice");
 		stream.send(data);
 	}
 	if(reserved>0) {
@@ -292,16 +330,4 @@ function reinforce()
 	}
 }
 
-while(map.players[map.turn].AI && map.in_progress) {
-	while(1) {
-		if(!takeTurn()) {
-			updateStatus(map);
-			break;
-		}
-		updateStatus(map);
-	}
-	reinforce();
-	nextTurn(map);
-	map.attacking=map.turn;
-	game_data.saveData(map);
-}
+main();
\ No newline at end of file