Section 1
//ColorStat (com.biox.cubewars.core.ColorStat)
package com.biox.cubewars.core {
public class ColorStat {
public var color:int;
public var count:int;
public function ColorStat(color:uint, count:uint){
super();
this.color = color;
this.count = count;
}
}
}//package com.biox.cubewars.core
Section 2
//Cube (com.biox.cubewars.core.Cube)
package com.biox.cubewars.core {
import flash.events.*;
import flash.display.*;
import flash.media.*;
public class Cube extends Sprite {
private var CubeSound:Class;
public var posX:uint;
public var posY:uint;
public var G:uint;
public var F:uint;
public var H:uint;
public var parrent:Cube;
private var selected:Boolean;
private var cb:ColorBox;
public var player:String;
public var isBase:Boolean;// = false
public var color:uint;
public var visited:Boolean;
private var potectialMoves:Array;// = null
public var bonusType:String;
private var field:Field;
public function Cube(field:Field, posX:uint, posY:uint, color:uint, player:String){
CubeSound = Cube_CubeSound;
cb = new ColorBox();
super();
this.x = (field.x + (posX * field.cellWidth));
this.y = (field.y + (posY * field.cellHeight));
this.field = field;
this.posX = posX;
this.posY = posY;
this.color = color;
this.player = player;
this.addEventListener(MouseEvent.MOUSE_OVER, mouseOverHandler);
this.addEventListener(MouseEvent.MOUSE_OUT, mouseOutHandler);
this.addEventListener(MouseEvent.CLICK, mouseDownHandler);
if (player != "EMPTY"){
draw();
addChild(cb);
};
}
public function draw():void{
if (player == "NONE"){
cb.color = color;
} else {
if (player == "BONUS"){
cb.color = (field.numberOfColors * 4);
} else {
if (player == field.player.id){
cb.color = (isBase) ? (color + (field.numberOfColors * 3)) : (color + field.numberOfColors);
} else {
if (player == field.cpu.id){
cb.color = (isBase) ? (color + (field.numberOfColors * 3)) : (color + (field.numberOfColors * 2));
};
};
};
};
cb.x = this.x;
cb.y = this.y;
}
private function isAllowedToPress():Boolean{
if ((((color == field.cpu.color)) || ((color == field.player.color)))){
return (false);
};
if ((((((((((posY > 0)) && ((field.getCube(posX, (posY - 1)).player == field.player.id)))) || ((((posX > 0)) && ((field.getCube((posX - 1), posY).player == field.player.id)))))) || ((((posY < (field.countY - 1))) && ((field.getCube(posX, (posY + 1)).player == field.player.id)))))) || ((((posX < (field.countX - 1))) && ((field.getCube((posX + 1), posY).player == field.player.id)))))){
return (true);
};
return (false);
}
public function unselect():void{
cb.unselect();
}
private function mouseDownHandler(event:MouseEvent):void{
var i:uint;
if (isAllowedToPress()){
(new CubeSound() as Sound).play();
if (potectialMoves == null){
potectialMoves = field.potectialMoves("PLAYER", color);
};
trace(("Size of unselect: " + potectialMoves.length));
i = 0;
while (i < potectialMoves.length) {
(potectialMoves[i] as Cube).unselect();
i++;
};
potectialMoves = null;
field.captureTheField(field.player.id, color);
field.startCpuDecision();
field.draw();
};
}
private function mouseOutHandler(event:MouseEvent):void{
var i:uint;
this.blendMode = BlendMode.NORMAL;
if (isAllowedToPress()){
if (potectialMoves == null){
potectialMoves = field.potectialMoves("PLAYER", color);
};
trace(("Size of unselect: " + potectialMoves.length));
i = 0;
while (i < potectialMoves.length) {
(potectialMoves[i] as Cube).unselect();
i++;
};
potectialMoves = null;
};
}
private function mouseOverHandler(event:MouseEvent):void{
var i:uint;
if (isAllowedToPress()){
if (potectialMoves == null){
potectialMoves = field.potectialMoves("PLAYER", color);
} else {
return;
};
trace(("Size of select: " + potectialMoves.length));
i = 0;
while (i < potectialMoves.length) {
(potectialMoves[i] as Cube).select();
i++;
};
};
}
public function select():void{
cb.select();
}
}
}//package com.biox.cubewars.core
Section 3
//Cube_CubeSound (com.biox.cubewars.core.Cube_CubeSound)
package com.biox.cubewars.core {
import mx.core.*;
public class Cube_CubeSound extends SoundAsset {
}
}//package com.biox.cubewars.core
Section 4
//Field (com.biox.cubewars.core.Field)
package com.biox.cubewars.core {
import flash.events.*;
import flash.display.*;
import com.biox.cubewars.game.*;
import flash.text.*;
import flash.utils.*;
public class Field extends Sprite {
public var cellWidth:uint;// = 0
public var level:Level;
public var numberOfColors:int;
private var stage1Moves:Array;// = null
public var isBonusProcessing:Boolean;// = false
public var scores:uint;
public var catchedBonus:Array;
public var cpu:Player;
public var cellHeight:uint;// = 0
public var countY:uint;// = 0
public var totalCount:uint;// = 0
private var progress:ProgressLine;// = null
public var countX:uint;// = 0
private var stage1Color:int;
private var lockedId:String;
public var cubes:Array;// = null
public var player:Player;
public var playerMoves:Array;
private var icon:Icon;// = null
public var cpuMoves:Array;
public function Field(level:Level){
var j:uint;
catchedBonus = new Array();
playerMoves = new Array();
cpuMoves = new Array();
super();
this.level = level;
this.countX = 30;
this.countY = 20;
this.cellWidth = 10;
this.cellHeight = 10;
this.player = level.getPlayer();
this.cpu = level.getCPU();
this.numberOfColors = 6;
level.generateField(this);
generateBonuses();
fixBaseAround();
totalCount = 0;
var i:uint;
while (i < countX) {
j = 0;
while (j < countY) {
if ((cubes[i][j] as Cube).player != "EMPTY"){
totalCount++;
};
j++;
};
i++;
};
captureTheField(player.id, player.color);
captureTheField(cpu.id, cpu.color);
progress = new ProgressLine(this);
progress.x = (this.x + 100);
progress.y = (this.y + 410);
addChild(progress);
checkGameFinish();
icon = new Icon();
icon.x = this.x;
icon.y = this.y;
icon.addEventListener("replayGame", replayGame);
icon.addEventListener("submitScores", submitScores);
this.draw();
}
private function replayGame(event:Event):void{
trace("1. replay");
dispatchEvent(new Event("replayGame"));
}
private function sortByCount(a:ColorStat, b:ColorStat):Number{
if (a.count > b.count){
return (1);
};
if (a.count < b.count){
return (-1);
};
return (0);
}
public function randomColor():uint{
return (randRange(0, (numberOfColors - 1)));
}
private function pushNotVisited(id:String, captureColor:int, notVisited:Array, cube:Cube):void{
if ((((((cube.player == id)) || ((cube.player == "BONUS")))) || ((((cube.player == "NONE")) && ((cube.color == captureColor)))))){
if ((cube.visited == false)){
notVisited.push(cube);
};
};
}
private function lockedPlayer(locked:String):void{
lockedId = locked;
if (icon == null){
icon = new Icon();
icon.addEventListener("replayGame", replayGame);
icon.addEventListener("submitScores", submitScores);
};
if (cpu.id == locked){
icon.icon(2);
} else {
if (player.id == locked){
icon.icon(3);
};
};
addChild(icon);
var timer:Timer = new Timer(2000, 1);
timer.addEventListener(TimerEvent.TIMER, lockedStage1);
timer.start();
}
public function randRange(min:Number, max:Number):Number{
return (Math.round(((Math.random() * ((max - min) + 1)) + (min - 0.5))));
}
private function victory():void{
icon.icon(4);
calcScores();
trace(("Scores: " + scores));
var playerFormat:TextFormat = new TextFormat();
var scoresPlayer:TextField = new TextField();
playerFormat.align = "left";
playerFormat.bold = true;
scoresPlayer.defaultTextFormat = playerFormat;
scoresPlayer.selectable = false;
scoresPlayer.x = 270;
scoresPlayer.y = 200;
scoresPlayer.width = 140;
scoresPlayer.height = 20;
scoresPlayer.textColor = 0xFFFFFF;
scoresPlayer.text = ("YOUR SCORES: " + scores);
icon.addChild(scoresPlayer);
}
private function processCatchedBonuses(id:String):void{
var cube:Cube;
isBonusProcessing = true;
while (catchedBonus.length > 0) {
cube = catchedBonus.pop();
switch (cube.bonusType){
case "RNDCOLOR":
bonusRandomColor(id, cube);
break;
};
};
isBonusProcessing = false;
}
private function lockedStage1(event:TimerEvent):void{
var playerPercents:Number = ((player.captured / totalCount) * 100);
var cpuPercents:Number = ((cpu.captured / totalCount) * 100);
if (player.id == lockedId){
if (playerPercents < 50){
defeat();
} else {
victory();
};
} else {
if (cpu.id == lockedId){
if (cpuPercents < 50){
victory();
} else {
defeat();
};
};
};
trace(("player.captured=" + player.captured));
trace(("cpu.captured=" + cpu.captured));
trace(("player.%=" + playerPercents));
trace(("cpu.%=" + cpuPercents));
}
private function calculateH(a:Cube, b:Cube):uint{
return ((Math.abs((a.posX - b.posX)) + Math.abs((a.posY - b.posY))));
}
public function availableMoves(id:String):Array{
var baseX:uint;
var baseY:uint;
var enemyColor:uint;
var j:uint;
var temp:Cube;
var notVisited:Array = new Array();
var available:Array = new Array();
var cube:Cube;
var i:uint;
while (i < countX) {
j = 0;
while (j < countY) {
cube = cubes[i][j];
cube.visited = false;
j++;
};
i++;
};
if (id == player.id){
baseX = player.baseX;
baseY = player.baseY;
enemyColor = cpu.color;
} else {
if (id == cpu.id){
baseX = cpu.baseX;
baseY = cpu.baseY;
enemyColor = player.color;
};
};
notVisited.push(cubes[baseX][baseY]);
while (notVisited.length > 0) {
cube = notVisited.pop();
cube.visited = true;
if (cube.player != id){
available.push(cube);
} else {
temp = null;
if (cube.posY > 0){
temp = cubes[cube.posX][(cube.posY - 1)];
if ((((((((notVisited.indexOf(temp) == -1)) && ((temp.visited == false)))) && (!((temp.color == enemyColor))))) && (!((temp.player == "EMPTY"))))){
notVisited.push(temp);
};
};
if (cube.posX > 0){
temp = cubes[(cube.posX - 1)][cube.posY];
if ((((((((notVisited.indexOf(temp) == -1)) && ((temp.visited == false)))) && (!((temp.color == enemyColor))))) && (!((temp.player == "EMPTY"))))){
notVisited.push(temp);
};
};
if (cube.posY < (countY - 1)){
temp = cubes[cube.posX][(cube.posY + 1)];
if ((((((((notVisited.indexOf(temp) == -1)) && ((temp.visited == false)))) && (!((temp.color == enemyColor))))) && (!((temp.player == "EMPTY"))))){
notVisited.push(temp);
};
};
if (cube.posX < (countX - 1)){
temp = cubes[(cube.posX + 1)][cube.posY];
if ((((((((notVisited.indexOf(temp) == -1)) && ((temp.visited == false)))) && (!((temp.color == enemyColor))))) && (!((temp.player == "EMPTY"))))){
notVisited.push(temp);
};
};
};
};
return (available);
}
private function calculateColorStatistics():Array{
var i:uint;
var current:Cube;
var posX:uint;
var posY:uint;
var cube:Cube;
var calc:Array = new Array();
var opened:Array = new Array();
var closed:Array = new Array();
var startCube:Cube = cubes[cpu.baseX][cpu.baseY];
opened.push(startCube);
while (opened.length > 0) {
current = opened.pop();
posX = current.posX;
posY = current.posY;
closed.push(current);
if (posY > 0){
processNeighForStat(calc, opened, closed, cubes[posX][(posY - 1)]);
};
if (posX > 0){
processNeighForStat(calc, opened, closed, cubes[(posX - 1)][posY]);
};
if (posY < (countY - 1)){
processNeighForStat(calc, opened, closed, cubes[posX][(posY + 1)]);
};
if (posX < (countX - 1)){
processNeighForStat(calc, opened, closed, cubes[(posX + 1)][posY]);
};
};
var counters:Array = new Array();
i = 0;
while (i < numberOfColors) {
counters.push(0);
i++;
};
i = 0;
while (i < calc.length) {
cube = calc[i];
var _local11 = counters;
var _local12 = cube.color;
var _local13 = (_local11[_local12] + 1);
_local11[_local12] = _local13;
i++;
};
return (counters);
}
private function fixSingleBase(base:Cube):void{
var cube:Cube;
var color:uint;
if (base.posY > 0){
cube = cubes[base.posX][(base.posY - 1)];
color = cube.color;
while ((((color == player.color)) || ((color == cpu.color)))) {
color = randomColor();
};
cube.color = color;
cube.draw();
};
if (base.posX > 0){
cube = cubes[(base.posX - 1)][base.posY];
color = cube.color;
while ((((color == player.color)) || ((color == cpu.color)))) {
color = randomColor();
};
cube.color = color;
cube.draw();
};
if (base.posY < (countY - 1)){
cube = cubes[base.posX][(base.posY + 1)];
color = cube.color;
while ((((color == player.color)) || ((color == cpu.color)))) {
color = randomColor();
};
cube.color = color;
cube.draw();
};
if (base.posX < (countX - 1)){
cube = cubes[(base.posX + 1)][base.posY];
color = cube.color;
while ((((color == player.color)) || ((color == cpu.color)))) {
color = randomColor();
};
cube.color = color;
cube.draw();
};
}
public function getCube(x:uint, y:uint):Cube{
return (cubes[x][y]);
}
private function equal(base:Cube, current:Cube, color:uint):Boolean{
return ((((base == current)) && ((color == base.color))));
}
private function traceColor(color:uint):String{
switch (color){
case 0:
return ("Green");
case 1:
return ("Yellow");
case 2:
return ("Orange");
case 3:
return ("Blue");
case 4:
return ("Magenta");
case 5:
return ("Red");
default:
return ("undefined");
};
}
private function defeat():void{
icon.icon(5);
}
private function cpuStage1(event:TimerEvent):void{
stage1Color = makeCpuDecision();
stage1Moves = potectialMoves(cpu.id, stage1Color);
var i:uint;
while (i < stage1Moves.length) {
(stage1Moves[i] as Cube).select();
i++;
};
var timer:Timer = new Timer(250, 1);
timer.addEventListener(TimerEvent.TIMER, cpuStage2);
timer.start();
}
private function cpuStage2(event:TimerEvent):void{
var i:uint;
while (i < stage1Moves.length) {
(stage1Moves[i] as Cube).unselect();
i++;
};
if (stage1Color != -1){
captureTheField(cpu.id, stage1Color);
};
removeChild(icon);
checkGameFinish();
}
private function defineColorUsingAStar(base:Cube, target:Cube):int{
var current:Cube;
var posX:uint;
var posY:uint;
var neighbour:Cube;
var check:Cube;
var preLastColor:int;
var lastColor:uint;
var opened:Array = new Array();
var closed:Array = new Array();
if (target.player != "NONE"){
return (-1);
};
base.parrent = null;
base.F = 0;
base.G = 0;
base.H = 0;
opened.push(base);
while ((((opened.length > 0)) && ((opened.indexOf(target) == -1)))) {
opened.sort(sortByF, Array.DESCENDING);
current = opened.pop();
posX = current.posX;
posY = current.posY;
closed.push(current);
if (current.player == "EMPTY"){
} else {
neighbour = null;
if (posY > 0){
processNeighbour(opened, closed, current, cubes[posX][(posY - 1)], target);
};
if (posX > 0){
processNeighbour(opened, closed, current, cubes[(posX - 1)][posY], target);
};
if (posY < (countY - 1)){
processNeighbour(opened, closed, current, cubes[posX][(posY + 1)], target);
};
if (posX < (countX - 1)){
processNeighbour(opened, closed, current, cubes[(posX + 1)][posY], target);
};
};
};
if (opened.indexOf(target) != -1){
check = target;
preLastColor = -1;
lastColor = target.color;
while (check != null) {
if (check.parrent != null){
if (lastColor != check.parrent.color){
preLastColor = lastColor;
lastColor = check.parrent.color;
};
};
check = check.parrent;
};
return (preLastColor);
};
return (-1);
}
private function bonusRandomColor(id:String, cube:Cube):void{
var rndColor:uint;
do {
rndColor = randomColor();
} while ((((rndColor == cpu.color)) || ((rndColor == player.color))));
cube.bonusType = null;
captureTheField(id, rndColor);
}
public function draw():void{
progress.draw();
}
public function checkGameFinish():void{
playerMoves = availableMoves(player.id);
cpuMoves = availableMoves(cpu.id);
trace(("availableMoves-player=" + playerMoves.length));
trace(("availableMoves-cpu=" + cpuMoves.length));
if ((((playerMoves.length == 0)) && (!((cpuMoves.length == 0))))){
lockedPlayer(player.id);
};
if (((!((playerMoves.length == 0))) && ((cpuMoves.length == 0)))){
lockedPlayer(cpu.id);
};
if ((((playerMoves.length == 0)) && ((cpuMoves.length == 0)))){
finishTheGame();
};
}
public function generateBonuses():void{
var x:int;
var y:int;
var cube:Cube;
var estimated:uint = 5;
while (estimated > 0) {
x = randRange((player.baseX + 1), (cpu.baseX - 1));
y = randRange((player.baseY - 1), (cpu.baseY + 1));
cube = (cubes[x][y] as Cube);
if (cube.player != "EMPTY"){
cube.player = "BONUS";
cube.bonusType = "RNDCOLOR";
cube.color = 9999;
cube.draw();
estimated--;
};
};
}
public function makeCpuDecision():int{
var idx:uint;
trace("--");
var capturedColor:int = defineAStar();
var counters:Array = calculateColorStatistics();
counters[player.color] = -1;
var colorsStat:Array = new Array();
var i:uint;
while (i < numberOfColors) {
colorsStat.push(new ColorStat(i, counters[i]));
i++;
};
colorsStat.sort(sortByCount, Array.DESCENDING);
i = 0;
while (i < colorsStat.length) {
trace(((traceColor((colorsStat[i] as ColorStat).color) + ": ") + (colorsStat[i] as ColorStat).count));
i++;
};
trace(("== A*: " + traceColor(capturedColor)));
trace(("== Statistics: " + traceColor((colorsStat[0] as ColorStat).color)));
if ((((((capturedColor == -1)) && (((colorsStat[0] as ColorStat).count > 0)))) || ((capturedColor == player.color)))){
capturedColor = (colorsStat[0] as ColorStat).color;
} else {
idx = 0;
i = 0;
while (i < colorsStat.length) {
if ((colorsStat[i] as ColorStat).color == capturedColor){
idx = i;
};
i++;
};
};
trace(("== Final: " + traceColor(capturedColor)));
return (capturedColor);
}
private function defineAStar():int{
var temp:Cube;
var base:Cube = cubes[cpu.baseX][cpu.baseY];
var target:Cube = level.getPrimaryTarget(this);
var result = -1;
var alter:Array = level.getAlterTarget(this);
result = defineColorUsingAStar(base, target);
if (result == -1){
trace("BASE to TARGET is not found, trying ALTER");
if (target.player != "NONE"){
while (alter.length > 0) {
temp = alter[randRange(0, (alter.length - 1))];
result = defineColorUsingAStar(base, temp);
if (result != -1){
trace("BASE to ALTER is found");
break;
} else {
alter.splice(alter.indexOf(temp), 1);
};
};
};
};
return (result);
}
private function submitScores(event:Event):void{
trace("1. submit");
dispatchEvent(new Event("submitScores"));
}
public function startCpuDecision():void{
icon.icon(1);
addChild(icon);
var timer:Timer = new Timer(250, 1);
timer.addEventListener(TimerEvent.TIMER, cpuStage1);
timer.start();
}
private function calcScores():void{
scores = (((player.captured / totalCount) * 2000) * (1 + (0.2 * (level.getDifficult() - 1))));
}
private function sortByF(a:Cube, b:Cube):Number{
if (a.F > b.F){
return (1);
};
if (a.F < b.F){
return (-1);
};
return (0);
}
private function processNeighbour(opened:Array, closed:Array, current:Cube, neighbour:Cube, targetCube:Cube):void{
var addG:int;
if (closed.indexOf(neighbour) != -1){
return;
};
if (opened.indexOf(neighbour) == -1){
opened.push(neighbour);
neighbour.parrent = current;
neighbour.H = calculateH(neighbour, targetCube);
neighbour.G = ((((current.color == neighbour.color)) || ((neighbour.player == "BONUS")))) ? 10 : 20;
neighbour.F = (neighbour.G + neighbour.H);
} else {
addG = ((((current.color == neighbour.color)) || ((neighbour.player == "BONUS")))) ? 10 : 20;
if ((neighbour.G + addG) < current.G){
neighbour.parrent = current;
neighbour.G = (neighbour.G + addG);
neighbour.F = (neighbour.G + neighbour.H);
};
};
}
public function captureTheField(id:String, captureColor:int):void{
var baseX:uint;
var baseY:uint;
var j:uint;
var temp:Cube;
var notVisited:Array = new Array();
var cube:Cube;
var i:uint;
while (i < countX) {
j = 0;
while (j < countY) {
cube = cubes[i][j];
cube.visited = false;
j++;
};
i++;
};
if (id == player.id){
baseX = player.baseX;
baseY = player.baseY;
player.captured = 0;
player.color = captureColor;
} else {
if (id == cpu.id){
baseX = cpu.baseX;
baseY = cpu.baseY;
cpu.captured = 0;
cpu.color = captureColor;
};
};
notVisited.push(cubes[baseX][baseY]);
while (notVisited.length > 0) {
cube = notVisited.pop();
if (cube.player == "BONUS"){
catchedBonus.push(cube);
};
cube.player = id;
cube.color = captureColor;
cube.visited = true;
cube.draw();
temp = null;
if (cube.posY > 0){
temp = cubes[cube.posX][(cube.posY - 1)];
pushNotVisited(id, captureColor, notVisited, temp);
};
if (cube.posX > 0){
temp = cubes[(cube.posX - 1)][cube.posY];
pushNotVisited(id, captureColor, notVisited, temp);
};
if (cube.posY < (countY - 1)){
temp = cubes[cube.posX][(cube.posY + 1)];
pushNotVisited(id, captureColor, notVisited, temp);
};
if (cube.posX < (countX - 1)){
temp = cubes[(cube.posX + 1)][cube.posY];
pushNotVisited(id, captureColor, notVisited, temp);
};
};
i = 0;
while (i < countX) {
j = 0;
while (j < countY) {
if ((((id == player.id)) && (((cubes[i][j] as Cube).player == player.id)))){
player.captured++;
} else {
if ((((id == cpu.id)) && (((cubes[i][j] as Cube).player == cpu.id)))){
cpu.captured++;
};
};
j++;
};
i++;
};
if (!isBonusProcessing){
processCatchedBonuses(id);
};
}
private function finishTheGame():void{
var message:String;
var isVictory:Boolean;
trace(("player.captured=" + player.captured));
trace(("cpu.captured=" + cpu.captured));
if (player.captured > cpu.captured){
victory();
} else {
if (player.captured <= cpu.captured){
defeat();
};
};
addChild(icon);
}
private function processNeighForStat(calc:Array, opened:Array, closed:Array, neighbour:Cube):void{
if (neighbour.player == cpu.id){
if (closed.indexOf(neighbour) == -1){
opened.push(neighbour);
} else {
return;
};
} else {
if (neighbour.player == "NONE"){
if (calc.indexOf(neighbour) == -1){
calc.push(neighbour);
};
} else {
return;
};
};
}
private function fixBaseAround():void{
fixSingleBase(cubes[player.baseX][player.baseY]);
fixSingleBase(cubes[cpu.baseX][cpu.baseY]);
}
public function potectialMoves(id:String, color:int):Array{
var j:uint;
var temp:Cube;
var notVisited:Array = new Array();
var potential:Array = new Array();
var cube:Cube;
var i:uint;
while (i < countX) {
j = 0;
while (j < countY) {
cube = cubes[i][j];
cube.visited = false;
j++;
};
i++;
};
if (id == player.id){
notVisited.push(cubes[player.baseX][player.baseY]);
} else {
if (id == cpu.id){
notVisited.push(cubes[cpu.baseX][cpu.baseY]);
};
};
while (notVisited.length > 0) {
cube = notVisited.pop();
cube.visited = true;
if (cube.color == color){
potential.push(cube);
};
temp = null;
if (cube.posY > 0){
temp = cubes[cube.posX][(cube.posY - 1)];
if ((((((((notVisited.indexOf(temp) == -1)) && ((temp.visited == false)))) && ((((temp.color == color)) || ((temp.player == id)))))) && (!((temp.player == "EMPTY"))))){
notVisited.push(temp);
};
};
if (cube.posX > 0){
temp = cubes[(cube.posX - 1)][cube.posY];
if ((((((((notVisited.indexOf(temp) == -1)) && ((temp.visited == false)))) && ((((temp.color == color)) || ((temp.player == id)))))) && (!((temp.player == "EMPTY"))))){
notVisited.push(temp);
};
};
if (cube.posY < (countY - 1)){
temp = cubes[cube.posX][(cube.posY + 1)];
if ((((((((notVisited.indexOf(temp) == -1)) && ((temp.visited == false)))) && ((((temp.color == color)) || ((temp.player == id)))))) && (!((temp.player == "EMPTY"))))){
notVisited.push(temp);
};
};
if (cube.posX < (countX - 1)){
temp = cubes[(cube.posX + 1)][cube.posY];
if ((((((((notVisited.indexOf(temp) == -1)) && ((temp.visited == false)))) && ((((temp.color == color)) || ((temp.player == id)))))) && (!((temp.player == "EMPTY"))))){
notVisited.push(temp);
};
};
};
return (potential);
}
private function close(closed:Array, cube:Cube):void{
closed.push(cube);
}
}
}//package com.biox.cubewars.core
Section 5
//Icon (com.biox.cubewars.core.Icon)
package com.biox.cubewars.core {
import flash.events.*;
import flash.display.*;
public class Icon extends Sprite {
private var icons:Icons;
public function Icon(){
icons = new Icons();
super();
icons.addEventListener("replayGame", function ():void{
trace("0. replay");
dispatchEvent(new Event("replayGame"));
});
icons.addEventListener("submitScores", function ():void{
trace("0. submit");
dispatchEvent(new Event("submitScores"));
});
addChild(icons);
}
public function icon(value:uint):void{
icons.gotoAndStop(value);
}
}
}//package com.biox.cubewars.core
Section 6
//Player (com.biox.cubewars.core.Player)
package com.biox.cubewars.core {
public class Player {
public var color:uint;
public var captured:uint;// = 0
public var baseX:uint;
public var baseY:uint;
public var id:String;
public function Player(id:String, color:uint, baseX:uint, baseY:uint){
super();
this.id = id;
this.color = color;
this.baseX = baseX;
this.baseY = baseY;
}
}
}//package com.biox.cubewars.core
Section 7
//ProgressLine (com.biox.cubewars.core.ProgressLine)
package com.biox.cubewars.core {
import flash.display.*;
import flash.text.*;
public class ProgressLine extends Sprite {
private var scoresPlayer:TextField;// = null
private var line:Array;// = null
private var scoresCPU:TextField;
private var field:Field;// = null
public function ProgressLine(field:Field){
scoresCPU = new TextField();
super();
this.field = field;
this.init();
this.draw();
}
private function init():void{
var progress:Progress;
line = new Array();
var i:uint;
while (i < 20) {
progress = new Progress();
progress.frameNum = 0;
progress.x = ((this.x + 105) + (10 * i));
progress.y = (this.y + 10);
line.push(progress);
addChild(progress);
i++;
};
var player:Progress = new Progress();
player.frameNum = 3;
player.x = (this.x + 85);
player.y = (this.y + 10);
addChild(player);
var cpu:Progress = new Progress();
cpu.x = (this.x + 315);
cpu.y = (this.y + 10);
cpu.frameNum = 4;
addChild(cpu);
scoresPlayer = new TextField();
var playerFormat:TextFormat = new TextFormat();
playerFormat.align = "right";
playerFormat.bold = true;
scoresPlayer.defaultTextFormat = playerFormat;
scoresPlayer.selectable = false;
scoresPlayer.x = this.x;
scoresPlayer.y = this.y;
scoresPlayer.width = 75;
scoresPlayer.height = 20;
scoresPlayer.textColor = 16742263;
var cpuFormat:TextFormat = new TextFormat();
cpuFormat.align = "left";
cpuFormat.bold = true;
scoresCPU.defaultTextFormat = cpuFormat;
scoresCPU.selectable = false;
scoresCPU.x = (this.x + 330);
scoresCPU.y = this.y;
scoresCPU.width = 80;
scoresCPU.height = 20;
scoresCPU.textColor = 10932731;
addChild(scoresPlayer);
addChild(scoresCPU);
}
public function draw():void{
var playerPercents:Number = ((field.player.captured / field.totalCount) * 100);
var cpuPercents:Number = ((field.cpu.captured / field.totalCount) * 100);
var playerElements:uint = Math.round((playerPercents / 5));
var cpuElements:uint = Math.round((cpuPercents / 5));
var i:uint;
while (i < 20) {
if (i < playerElements){
(line[i] as Progress).frameNum = 1;
} else {
if (i < (20 - cpuElements)){
(line[i] as Progress).frameNum = 0;
} else {
(line[i] as Progress).frameNum = 2;
};
};
i++;
};
scoresPlayer.text = (Math.round(playerPercents) + "%");
scoresCPU.text = (Math.round(cpuPercents) + "%");
}
}
}//package com.biox.cubewars.core
Section 8
//Game (com.biox.cubewars.game.Game)
package com.biox.cubewars.game {
import flash.events.*;
import flash.display.*;
import com.biox.cubewars.core.*;
public class Game extends Sprite {
private var field:Field;// = null
private var level:Level;
public function Game(lev:uint, difficult:uint){
super();
trace(((("New game: level=" + lev) + ", difficult=") + difficult));
switch (lev){
case 1:
level = new Level1(difficult);
break;
case 2:
level = new Level2(difficult);
break;
case 3:
level = new Level3(difficult);
break;
case 4:
level = new Level4(difficult);
break;
case 5:
level = new Level5(difficult);
break;
};
}
public function start():void{
field = new Field(level);
field.x = 20;
field.y = 40;
field.addEventListener("replayGame", function ():void{
trace("2. replay");
dispatchEvent(new Event("replayGame"));
});
field.addEventListener("submitScores", function ():void{
trace("2. submit");
dispatchEvent(new Event("submitScores"));
});
addChild(field);
}
public function finish():void{
}
public function getScores():uint{
return (field.scores);
}
public function getLevel():Level{
return (level);
}
}
}//package com.biox.cubewars.game
Section 9
//Level (com.biox.cubewars.game.Level)
package com.biox.cubewars.game {
import com.biox.cubewars.core.*;
public interface Level {
function getAlterTarget(com.biox.cubewars.game:Level/com.biox.cubewars.game:Level:getCPU:Field):Array;
function getCPU():Player;
function generateField(com.biox.cubewars.game:Level/com.biox.cubewars.game:Level:getPlayer:Field):void;
function getPlayer():Player;
function getDifficult():uint;
function getPrimaryTarget(Player:Field):Cube;
}
}//package com.biox.cubewars.game
Section 10
//Level1 (com.biox.cubewars.game.Level1)
package com.biox.cubewars.game {
import com.biox.cubewars.core.*;
public class Level1 implements Level {
private var difficult:uint;
public function Level1(difficult:uint){
super();
this.difficult = difficult;
}
public function getDifficult():uint{
return (difficult);
}
public function generateField(field:Field):void{
var row:Array;
var j:uint;
var cube:Cube;
field.cubes = new Array();
var i:uint;
while (i < field.countX) {
row = new Array();
j = 0;
while (j < field.countY) {
cube = null;
if ((((i == field.player.baseX)) && ((j == field.player.baseY)))){
cube = new Cube(field, i, j, field.player.color, field.player.id);
cube.isBase = true;
} else {
if ((((i == field.cpu.baseX)) && ((j == field.cpu.baseY)))){
cube = new Cube(field, i, j, field.cpu.color, field.cpu.id);
cube.isBase = true;
} else {
cube = new Cube(field, i, j, field.randomColor(), "NONE");
};
};
row.push(cube);
field.addChild(cube);
j++;
};
field.cubes.push(row);
i++;
};
}
public function getAlterTarget(field:Field):Array{
var alter:Array = new Array();
alter.push(field.cubes[0][9]);
alter.push(field.cubes[15][19]);
return (alter);
}
public function getCPU():Player{
var player:Player;
switch (difficult){
case 1:
player = new Player("CPU", 3, 29, 0);
break;
case 2:
player = new Player("CPU", 3, 28, 1);
break;
case 3:
player = new Player("CPU", 3, 27, 2);
break;
case 4:
player = new Player("CPU", 3, 25, 4);
break;
};
return (player);
}
public function getPlayer():Player{
return (new Player("PLAYER", 5, 0, 19));
}
public function getPrimaryTarget(field:Field):Cube{
return (field.cubes[15][11]);
}
}
}//package com.biox.cubewars.game
Section 11
//Level2 (com.biox.cubewars.game.Level2)
package com.biox.cubewars.game {
import com.biox.cubewars.core.*;
public class Level2 implements Level {
private var difficult:uint;
public function Level2(difficult:uint){
super();
this.difficult = difficult;
}
public function getDifficult():uint{
return (difficult);
}
public function generateField(field:Field):void{
var row:Array;
var j:uint;
var cube:Cube;
field.cubes = new Array();
var i:uint;
while (i < field.countX) {
row = new Array();
j = 0;
while (j < field.countY) {
cube = null;
if ((((i == field.player.baseX)) && ((j == field.player.baseY)))){
cube = new Cube(field, i, j, field.player.color, field.player.id);
cube.isBase = true;
} else {
if ((((i == field.cpu.baseX)) && ((j == field.cpu.baseY)))){
cube = new Cube(field, i, j, field.cpu.color, field.cpu.id);
cube.isBase = true;
} else {
if ((((((((i >= 13)) && ((i <= 16)))) && ((j >= 0)))) && ((j <= 5)))){
cube = new Cube(field, i, j, 0, "EMPTY");
} else {
if ((((((((i >= 13)) && ((i <= 16)))) && ((j >= 14)))) && ((j <= 19)))){
cube = new Cube(field, i, j, 0, "EMPTY");
} else {
cube = new Cube(field, i, j, field.randomColor(), "NONE");
};
};
};
};
row.push(cube);
field.addChild(cube);
j++;
};
field.cubes.push(row);
i++;
};
trace();
}
public function getAlterTarget(field:Field):Array{
var alter:Array = new Array();
alter.push(field.cubes[0][9]);
alter.push(field.cubes[12][19]);
return (alter);
}
public function getCPU():Player{
var player:Player;
switch (difficult){
case 1:
player = new Player("CPU", 3, 29, 0);
break;
case 2:
player = new Player("CPU", 3, 28, 1);
break;
case 3:
player = new Player("CPU", 3, 27, 2);
break;
case 4:
player = new Player("CPU", 3, 25, 4);
break;
};
return (player);
}
public function getPlayer():Player{
return (new Player("PLAYER", 5, 0, 19));
}
public function getPrimaryTarget(field:Field):Cube{
return (field.cubes[15][11]);
}
}
}//package com.biox.cubewars.game
Section 12
//Level3 (com.biox.cubewars.game.Level3)
package com.biox.cubewars.game {
import com.biox.cubewars.core.*;
public class Level3 implements Level {
private var difficult:uint;
public function Level3(difficult:uint){
super();
this.difficult = difficult;
}
public function getDifficult():uint{
return (difficult);
}
public function generateField(field:Field):void{
var row:Array;
var j:uint;
var cube:Cube;
field.cubes = new Array();
var i:uint;
while (i < field.countX) {
row = new Array();
j = 0;
while (j < field.countY) {
cube = null;
if ((((i == field.player.baseX)) && ((j == field.player.baseY)))){
cube = new Cube(field, i, j, field.player.color, field.player.id);
cube.isBase = true;
} else {
if ((((i == field.cpu.baseX)) && ((j == field.cpu.baseY)))){
cube = new Cube(field, i, j, field.cpu.color, field.cpu.id);
cube.isBase = true;
} else {
if ((((i == 12)) && ((j >= 2)))){
cube = new Cube(field, i, j, 0, "EMPTY");
} else {
if ((((i == 17)) && ((j <= 17)))){
cube = new Cube(field, i, j, 0, "EMPTY");
} else {
cube = new Cube(field, i, j, field.randomColor(), "NONE");
};
};
};
};
row.push(cube);
field.addChild(cube);
j++;
};
field.cubes.push(row);
i++;
};
}
public function getAlterTarget(field:Field):Array{
var alter:Array = new Array();
alter.push(field.cubes[0][9]);
alter.push(field.cubes[15][19]);
return (alter);
}
public function getCPU():Player{
var player:Player;
switch (difficult){
case 1:
player = new Player("CPU", 3, 29, 0);
break;
case 2:
player = new Player("CPU", 3, 28, 1);
break;
case 3:
player = new Player("CPU", 3, 27, 2);
break;
case 4:
player = new Player("CPU", 3, 25, 4);
break;
};
return (player);
}
public function getPlayer():Player{
return (new Player("PLAYER", 5, 0, 19));
}
public function getPrimaryTarget(field:Field):Cube{
return (field.cubes[17][19]);
}
}
}//package com.biox.cubewars.game
Section 13
//Level4 (com.biox.cubewars.game.Level4)
package com.biox.cubewars.game {
import com.biox.cubewars.core.*;
public class Level4 implements Level {
private var difficult:uint;
public function Level4(difficult:uint){
super();
this.difficult = difficult;
}
public function getDifficult():uint{
return (difficult);
}
public function generateField(field:Field):void{
var row:Array;
var j:uint;
var cube:Cube;
field.cubes = new Array();
var i:uint;
while (i < field.countX) {
row = new Array();
j = 0;
while (j < field.countY) {
cube = null;
if ((((i == field.player.baseX)) && ((j == field.player.baseY)))){
cube = new Cube(field, i, j, field.player.color, field.player.id);
cube.isBase = true;
} else {
if ((((i == field.cpu.baseX)) && ((j == field.cpu.baseY)))){
cube = new Cube(field, i, j, field.cpu.color, field.cpu.id);
cube.isBase = true;
} else {
if ((((((((i >= 8)) && ((i <= 10)))) && ((j >= 2)))) && ((j <= 4)))){
cube = new Cube(field, i, j, 0, "EMPTY");
} else {
if ((((((((i >= 19)) && ((i <= 21)))) && ((j >= 2)))) && ((j <= 4)))){
cube = new Cube(field, i, j, 0, "EMPTY");
} else {
if ((((((((i >= 14)) && ((i <= 15)))) && ((j >= 5)))) && ((j <= 9)))){
cube = new Cube(field, i, j, 0, "EMPTY");
} else {
if ((((((((i >= 13)) && ((i <= 16)))) && ((j >= 14)))) && ((j <= 15)))){
cube = new Cube(field, i, j, 0, "EMPTY");
} else {
if ((((i == 10)) && ((j == 12)))){
cube = new Cube(field, i, j, 0, "EMPTY");
} else {
if ((((i == 11)) && ((j == 13)))){
cube = new Cube(field, i, j, 0, "EMPTY");
} else {
if ((((i == 12)) && ((j == 14)))){
cube = new Cube(field, i, j, 0, "EMPTY");
} else {
if ((((i == 17)) && ((j == 14)))){
cube = new Cube(field, i, j, 0, "EMPTY");
} else {
if ((((i == 18)) && ((j == 13)))){
cube = new Cube(field, i, j, 0, "EMPTY");
} else {
if ((((i == 19)) && ((j == 12)))){
cube = new Cube(field, i, j, 0, "EMPTY");
} else {
cube = new Cube(field, i, j, field.randomColor(), "NONE");
};
};
};
};
};
};
};
};
};
};
};
};
row.push(cube);
field.addChild(cube);
j++;
};
field.cubes.push(row);
i++;
};
}
public function getAlterTarget(field:Field):Array{
var alter:Array = new Array();
alter.push(field.cubes[14][9]);
return (alter);
}
public function getCPU():Player{
var player:Player;
switch (difficult){
case 1:
player = new Player("CPU", 3, 29, 0);
break;
case 2:
player = new Player("CPU", 3, 28, 1);
break;
case 3:
player = new Player("CPU", 3, 27, 2);
break;
case 4:
player = new Player("CPU", 3, 25, 4);
break;
};
return (player);
}
public function getPlayer():Player{
return (new Player("PLAYER", 5, 0, 19));
}
public function getPrimaryTarget(field:Field):Cube{
return (field.cubes[15][11]);
}
}
}//package com.biox.cubewars.game
Section 14
//Level5 (com.biox.cubewars.game.Level5)
package com.biox.cubewars.game {
import com.biox.cubewars.core.*;
public class Level5 implements Level {
private var difficult:uint;
public function Level5(difficult:uint){
super();
this.difficult = difficult;
}
public function getDifficult():uint{
return (difficult);
}
public function generateField(field:Field):void{
var row:Array;
var j:uint;
var cube:Cube;
field.cubes = new Array();
var i:uint;
while (i < field.countX) {
row = new Array();
j = 0;
while (j < field.countY) {
cube = null;
if ((((i == field.player.baseX)) && ((j == field.player.baseY)))){
cube = new Cube(field, i, j, field.player.color, field.player.id);
cube.isBase = true;
} else {
if ((((i == field.cpu.baseX)) && ((j == field.cpu.baseY)))){
cube = new Cube(field, i, j, field.cpu.color, field.cpu.id);
cube.isBase = true;
} else {
if ((((((i >= 6)) && ((i <= 23)))) && ((j == 5)))){
cube = new Cube(field, i, j, 0, "EMPTY");
} else {
if ((((((i >= 6)) && ((i <= 23)))) && ((j == 14)))){
cube = new Cube(field, i, j, 0, "EMPTY");
} else {
cube = new Cube(field, i, j, field.randomColor(), "NONE");
};
};
};
};
row.push(cube);
field.addChild(cube);
j++;
};
field.cubes.push(row);
i++;
};
}
public function getAlterTarget(field:Field):Array{
var alter:Array = new Array();
alter.push(field.cubes[0][9]);
return (alter);
}
public function getCPU():Player{
var player:Player;
switch (difficult){
case 1:
player = new Player("CPU", 3, 29, 0);
break;
case 2:
player = new Player("CPU", 3, 28, 1);
break;
case 3:
player = new Player("CPU", 3, 27, 2);
break;
case 4:
player = new Player("CPU", 3, 25, 4);
break;
};
return (player);
}
public function getPlayer():Player{
return (new Player("PLAYER", 5, 0, 19));
}
public function getPrimaryTarget(field:Field):Cube{
return (field.cubes[15][11]);
}
}
}//package com.biox.cubewars.game
Section 15
//ButtonDifficulty_5 (Menu_fla.ButtonDifficulty_5)
package Menu_fla {
import flash.events.*;
import flash.display.*;
import flash.text.*;
public dynamic class ButtonDifficulty_5 extends MovieClip {
public var butRight:SimpleButton;
public var butCenter:SimpleButton;
public var butLeft:SimpleButton;
public var difficulty:uint;
public var textDifficulty:TextField;
public function ButtonDifficulty_5(){
addFrameScript(0, frame1);
}
public function incDifficulty():void{
if (difficulty == 4){
difficulty = 1;
} else {
difficulty++;
};
updateDifficulty(difficulty);
}
public function decDifficulty():void{
if (difficulty == 1){
difficulty = 4;
} else {
difficulty--;
};
updateDifficulty(difficulty);
}
public function updateDifficulty(_arg1:uint):void{
difficulty = _arg1;
switch (_arg1){
case 1:
textDifficulty.text = "EASY";
break;
case 2:
textDifficulty.text = "NORMAL";
break;
case 3:
textDifficulty.text = "HARD";
break;
case 4:
textDifficulty.text = "UNREAL";
break;
};
}
public function butCenterMouseOver(_arg1:MouseEvent):void{
textDifficulty.textColor = 6750054;
}
function frame1(){
difficulty = 2;
butCenter.addEventListener(MouseEvent.MOUSE_OVER, butCenterMouseOver);
butCenter.addEventListener(MouseEvent.MOUSE_OUT, butCenterMouseOut);
butLeft.addEventListener(MouseEvent.CLICK, function (){
decDifficulty();
});
butCenter.addEventListener(MouseEvent.CLICK, function (){
incDifficulty();
});
butRight.addEventListener(MouseEvent.CLICK, function (){
incDifficulty();
});
}
public function getDifficulty():uint{
return (difficulty);
}
public function butCenterMouseOut(_arg1:MouseEvent):void{
textDifficulty.textColor = 16777113;
}
}
}//package Menu_fla
Section 16
//MochiAd (mochi.as3.MochiAd)
package mochi.as3 {
import flash.events.*;
import flash.display.*;
import flash.utils.*;
import flash.net.*;
import flash.system.*;
public class MochiAd {
public function MochiAd(){
super();
}
public static function getVersion():String{
return (MochiServices.getVersion());
}
public static function showClickAwayAd(options:Object):void{
var clip:Object;
var mc:MovieClip;
var chk:MovieClip;
var options = options;
var DEFAULTS:Object = {ad_timeout:2000, regpt:"o", method:"showClickAwayAd", res:"300x250", no_bg:true, ad_started:function ():void{
}, ad_finished:function ():void{
}, ad_loaded:function (width:Number, height:Number):void{
}, ad_failed:function ():void{
trace("[MochiAd] Couldn't load an ad, make sure your game's local security sandbox is configured for Access Network Only and that you are not using ad blocking software");
}, ad_skipped:function ():void{
}};
options = MochiAd._parseOptions(options, DEFAULTS);
clip = options.clip;
var ad_timeout:Number = options.ad_timeout;
delete options.ad_timeout;
if (!MochiAd.load(options)){
options.ad_failed();
options.ad_finished();
return;
};
options.ad_started();
mc = clip._mochiad;
mc["onUnload"] = function ():void{
MochiAd._cleanup(mc);
options.ad_finished();
};
var wh:Array = MochiAd._getRes(options, clip);
var w:Number = wh[0];
var h:Number = wh[1];
mc.x = (w * 0.5);
mc.y = (h * 0.5);
chk = createEmptyMovieClip(mc, "_mochiad_wait", 3);
chk.ad_timeout = ad_timeout;
chk.started = getTimer();
chk.showing = false;
mc.unloadAd = function ():void{
MochiAd.unload(clip);
};
mc.adLoaded = options.ad_loaded;
mc.adSkipped = options.ad_skipped;
mc.rpc = function (callbackID:Number, arg:Object):void{
MochiAd.rpc(clip, callbackID, arg);
};
var sendHostProgress:Boolean;
mc.regContLC = function (lc_name:String):void{
mc._containerLCName = lc_name;
};
chk["onEnterFrame"] = function ():void{
var total:Number;
if (!this.parent){
delete this.onEnterFrame;
return;
};
var ad_clip:Object = this.parent._mochiad_ctr;
var elapsed:Number = (getTimer() - this.started);
var finished:Boolean;
if (!chk.showing){
total = this.parent._mochiad_ctr.contentLoaderInfo.bytesTotal;
if (total > 0){
chk.showing = true;
finished = true;
chk.started = getTimer();
} else {
if (elapsed > chk.ad_timeout){
options.ad_failed();
finished = true;
};
};
};
if (this.root == null){
finished = true;
};
if (finished){
delete this.onEnterFrame;
};
};
doOnEnterFrame(chk);
}
public static function _isNetworkAvailable():Boolean{
return (!((Security.sandboxType == "localWithFile")));
}
public static function _allowDomains(server:String):String{
var hostname:String = server.split("/")[2].split(":")[0];
if (Security.sandboxType == "application"){
return (hostname);
};
Security.allowDomain("*");
Security.allowDomain(hostname);
Security.allowInsecureDomain("*");
Security.allowInsecureDomain(hostname);
return (hostname);
}
public static function unload(clip:Object):Boolean{
if (((clip.clip) && (clip.clip._mochiad))){
clip = clip.clip;
};
if (clip.origFrameRate != undefined){
clip.stage.frameRate = clip.origFrameRate;
};
if (!clip._mochiad){
return (false);
};
if (clip._mochiad._containerLCName != undefined){
clip._mochiad.lc.send(clip._mochiad._containerLCName, "notify", {id:"unload"});
};
if (clip._mochiad.onUnload){
clip._mochiad.onUnload();
};
delete clip._mochiad_loaded;
delete clip._mochiad;
return (true);
}
public static function showInterLevelAd(options:Object):void{
var clip:Object;
var mc:MovieClip;
var chk:MovieClip;
var options = options;
var DEFAULTS:Object = {ad_timeout:2000, fadeout_time:250, regpt:"o", method:"showTimedAd", ad_started:function ():void{
if ((this.clip is MovieClip)){
this.clip.stop();
} else {
throw (new Error("MochiAd.showInterLevelAd requires a clip that is a MovieClip or is an instance of a class that extends MovieClip. If your clip is a Sprite, then you must provide custom ad_started and ad_finished handlers."));
};
}, ad_finished:function ():void{
if ((this.clip is MovieClip)){
this.clip.play();
} else {
throw (new Error("MochiAd.showInterLevelAd requires a clip that is a MovieClip or is an instance of a class that extends MovieClip. If your clip is a Sprite, then you must provide custom ad_started and ad_finished handlers."));
};
}, ad_loaded:function (width:Number, height:Number):void{
}, ad_failed:function ():void{
trace("[MochiAd] Couldn't load an ad, make sure your game's local security sandbox is configured for Access Network Only and that you are not using ad blocking software");
}, ad_skipped:function ():void{
}};
options = MochiAd._parseOptions(options, DEFAULTS);
clip = options.clip;
var ad_msec:Number = 11000;
var ad_timeout:Number = options.ad_timeout;
delete options.ad_timeout;
var fadeout_time:Number = options.fadeout_time;
delete options.fadeout_time;
if (!MochiAd.load(options)){
options.ad_failed();
options.ad_finished();
return;
};
options.ad_started();
mc = clip._mochiad;
mc["onUnload"] = function ():void{
MochiAd._cleanup(mc);
options.ad_finished();
};
var wh:Array = MochiAd._getRes(options, clip);
var w:Number = wh[0];
var h:Number = wh[1];
mc.x = (w * 0.5);
mc.y = (h * 0.5);
chk = createEmptyMovieClip(mc, "_mochiad_wait", 3);
chk.ad_msec = ad_msec;
chk.ad_timeout = ad_timeout;
chk.started = getTimer();
chk.showing = false;
chk.fadeout_time = fadeout_time;
chk.fadeFunction = function ():void{
if (!this.parent){
delete this.onEnterFrame;
delete this.fadeFunction;
return;
};
var p:Number = (100 * (1 - ((getTimer() - this.fadeout_start) / this.fadeout_time)));
if (p > 0){
this.parent.alpha = (p * 0.01);
} else {
MochiAd.unload(clip);
delete this["onEnterFrame"];
};
};
mc.unloadAd = function ():void{
MochiAd.unload(clip);
};
mc.adLoaded = options.ad_loaded;
mc.adSkipped = options.ad_skipped;
mc.adjustProgress = function (msec:Number):void{
var _chk:Object = mc._mochiad_wait;
_chk.server_control = true;
_chk.showing = true;
_chk.started = getTimer();
_chk.ad_msec = (msec - 250);
};
mc.rpc = function (callbackID:Number, arg:Object):void{
MochiAd.rpc(clip, callbackID, arg);
};
chk["onEnterFrame"] = function ():void{
var total:Number;
if (!this.parent){
delete this.onEnterFrame;
delete this.fadeFunction;
return;
};
var ad_clip:Object = this.parent._mochiad_ctr;
var elapsed:Number = (getTimer() - this.started);
var finished:Boolean;
if (!chk.showing){
total = this.parent._mochiad_ctr.contentLoaderInfo.bytesTotal;
if (total > 0){
chk.showing = true;
chk.started = getTimer();
MochiAd.adShowing(clip);
} else {
if (elapsed > chk.ad_timeout){
options.ad_failed();
finished = true;
};
};
};
if (elapsed > chk.ad_msec){
finished = true;
};
if (finished){
if (this.server_control){
delete this.onEnterFrame;
} else {
this.fadeout_start = getTimer();
this.onEnterFrame = this.fadeFunction;
};
};
};
doOnEnterFrame(chk);
}
public static function _parseOptions(options:Object, defaults:Object):Object{
var k:String;
var pairs:Array;
var i:Number;
var kv:Array;
var optcopy:Object = {};
for (k in defaults) {
optcopy[k] = defaults[k];
};
if (options){
for (k in options) {
optcopy[k] = options[k];
};
};
if (optcopy.clip == undefined){
throw (new Error("MochiAd is missing the 'clip' parameter. This should be a MovieClip, Sprite or an instance of a class that extends MovieClip or Sprite."));
};
options = optcopy.clip.loaderInfo.parameters.mochiad_options;
if (options){
pairs = options.split("&");
i = 0;
while (i < pairs.length) {
kv = pairs[i].split("=");
optcopy[unescape(kv[0])] = unescape(kv[1]);
i++;
};
};
if (optcopy.id == "test"){
trace("[MochiAd] WARNING: Using the MochiAds test identifier, make sure to use the code from your dashboard, not this example!");
};
return (optcopy);
}
public static function _cleanup(mc:Object):void{
var k:String;
var lc:LocalConnection;
var f:Function;
var mc = mc;
if (("lc" in mc)){
lc = mc.lc;
f = function ():void{
lc.client = null;
lc.close();
//unresolved jump
var _slot1 = e;
};
setTimeout(f, 0);
};
var idx:Number = DisplayObjectContainer(mc).numChildren;
while (idx > 0) {
idx = (idx - 1);
DisplayObjectContainer(mc).removeChildAt(idx);
};
for (k in mc) {
delete mc[k];
};
}
public static function load(options:Object):MovieClip{
var clip:Object;
var k:String;
var server:String;
var hostname:String;
var lc:LocalConnection;
var name:String;
var loader:Loader;
var g:Function;
var req:URLRequest;
var v:Object;
var options = options;
var DEFAULTS:Object = {server:"http://x.mochiads.com/srv/1/", method:"load", depth:10333, id:"_UNKNOWN_"};
options = MochiAd._parseOptions(options, DEFAULTS);
options.swfv = 9;
options.mav = MochiAd.getVersion();
clip = options.clip;
if (!(clip is DisplayObject)){
trace("Warning: Object passed as container clip not a descendant of the DisplayObject type");
return (null);
};
if (MovieClip(clip).stage == null){
trace("Warning: Container clip for ad is not attached to the stage");
return (null);
};
if (!MochiAd._isNetworkAvailable()){
return (null);
};
if (clip._mochiad_loaded){
return (null);
};
//unresolved jump
var _slot1 = e;
throw (new Error("MochiAd requires a clip that is an instance of a dynamic class. If your class extends Sprite or MovieClip, you must make it dynamic."));
var depth:Number = options.depth;
delete options.depth;
var mc:MovieClip = createEmptyMovieClip(clip, "_mochiad", depth);
var wh:Array = MochiAd._getRes(options, clip);
options.res = ((wh[0] + "x") + wh[1]);
options.server = (options.server + options.id);
delete options.id;
clip._mochiad_loaded = true;
if (clip.loaderInfo.loaderURL.indexOf("http") == 0){
options.as3_swf = clip.loaderInfo.loaderURL;
} else {
trace("[MochiAd] NOTE: Security Sandbox Violation errors below are normal");
};
var lv:URLVariables = new URLVariables();
for (k in options) {
v = options[k];
if (!(v is Function)){
lv[k] = v;
};
};
server = lv.server;
delete lv.server;
hostname = _allowDomains(server);
lc = new LocalConnection();
lc.client = mc;
name = ["", Math.floor(new Date().getTime()), Math.floor((Math.random() * 999999))].join("_");
lc.allowDomain("*", "localhost");
lc.allowInsecureDomain("*", "localhost");
lc.connect(name);
mc.lc = lc;
mc.lcName = name;
lv.lc = name;
lv.st = getTimer();
loader = new Loader();
g = function (ev:Object):void{
ev.target.removeEventListener(ev.type, arguments.callee);
MochiAd.unload(clip);
};
loader.contentLoaderInfo.addEventListener(Event.UNLOAD, g);
req = new URLRequest(((server + ".swf?cacheBust=") + new Date().getTime()));
req.contentType = "application/x-www-form-urlencoded";
req.method = URLRequestMethod.POST;
req.data = lv;
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, function (io:IOErrorEvent):void{
trace("[MochiAds] Blocked URL");
});
if (!options.skip){
loader.load(req);
};
mc.addChild(loader);
mc._mochiad_ctr = loader;
return (mc);
}
public static function runMethod(base:Object, methodName:String, argsArray:Array):Object{
var nameArray:Array = methodName.split(".");
var i:Number = 0;
while (i < (nameArray.length - 1)) {
if ((((base[nameArray[i]] == undefined)) || ((base[nameArray[i]] == null)))){
return (undefined);
};
base = base[nameArray[i]];
i++;
};
if (typeof(base[nameArray[i]]) == "function"){
return (base[nameArray[i]].apply(base, argsArray));
};
return (undefined);
}
public static function createEmptyMovieClip(parent:Object, name:String, depth:Number):MovieClip{
var mc:MovieClip = new MovieClip();
if (((false) && (depth))){
parent.addChildAt(mc, depth);
} else {
parent.addChild(mc);
};
parent[name] = mc;
mc["_name"] = name;
return (mc);
}
public static function _getRes(options:Object, clip:Object):Array{
var xy:Array;
var b:Object = clip.getBounds(clip.root);
var w:Number = 0;
var h:Number = 0;
if (typeof(options.res) != "undefined"){
xy = options.res.split("x");
w = parseFloat(xy[0]);
h = parseFloat(xy[1]);
} else {
w = (b.xMax - b.xMin);
h = (b.yMax - b.yMin);
};
if ((((w == 0)) || ((h == 0)))){
w = clip.stage.stageWidth;
h = clip.stage.stageHeight;
};
return ([w, h]);
}
public static function adShowing(mc:Object):void{
mc.origFrameRate = mc.stage.frameRate;
mc.stage.frameRate = 30;
}
public static function getValue(base:Object, objectName:String):Object{
var nameArray:Array = objectName.split(".");
var i:Number = 0;
while (i < (nameArray.length - 1)) {
if ((((base[nameArray[i]] == undefined)) || ((base[nameArray[i]] == null)))){
return (undefined);
};
base = base[nameArray[i]];
i++;
};
return (base[nameArray[i]]);
}
public static function rpc(clip:Object, callbackID:Number, arg:Object):void{
var _local4:Object;
var _local5:Object;
switch (arg.id){
case "setValue":
MochiAd.setValue(clip, arg.objectName, arg.value);
break;
case "getValue":
_local4 = MochiAd.getValue(clip, arg.objectName);
clip._mochiad.lc.send(clip._mochiad._containerLCName, "rpcResult", callbackID, _local4);
break;
case "runMethod":
_local5 = MochiAd.runMethod(clip, arg.method, arg.args);
clip._mochiad.lc.send(clip._mochiad._containerLCName, "rpcResult", callbackID, _local5);
break;
default:
trace(("[mochiads rpc] unknown rpc id: " + arg.id));
};
}
public static function setValue(base:Object, objectName:String, value:Object):void{
var nameArray:Array = objectName.split(".");
var i:Number = 0;
while (i < (nameArray.length - 1)) {
if ((((base[nameArray[i]] == undefined)) || ((base[nameArray[i]] == null)))){
return;
};
base = base[nameArray[i]];
i++;
};
base[nameArray[i]] = value;
}
public static function showPreGameAd(options:Object):void{
var clip:Object;
var mc:MovieClip;
var chk:MovieClip;
var complete:Boolean;
var unloaded:Boolean;
var sendHostProgress:Boolean;
var fn:Function;
var r:MovieClip;
var options = options;
var DEFAULTS:Object = {ad_timeout:3000, fadeout_time:250, regpt:"o", method:"showPreloaderAd", color:0xFF8A00, background:16777161, outline:13994812, no_progress_bar:false, ad_started:function ():void{
if ((this.clip is MovieClip)){
this.clip.stop();
} else {
throw (new Error("MochiAd.showPreGameAd requires a clip that is a MovieClip or is an instance of a class that extends MovieClip. If your clip is a Sprite, then you must provide custom ad_started and ad_finished handlers."));
};
}, ad_finished:function ():void{
if ((this.clip is MovieClip)){
this.clip.play();
} else {
throw (new Error("MochiAd.showPreGameAd requires a clip that is a MovieClip or is an instance of a class that extends MovieClip. If your clip is a Sprite, then you must provide custom ad_started and ad_finished handlers."));
};
}, ad_loaded:function (width:Number, height:Number):void{
}, ad_failed:function ():void{
trace("[MochiAd] Couldn't load an ad, make sure your game's local security sandbox is configured for Access Network Only and that you are not using ad blocking software");
}, ad_skipped:function ():void{
}, ad_progress:function (percent:Number):void{
}, progress_override:function (_clip:Object):Number{
return (NaN);
}, bar_offset:0};
options = MochiAd._parseOptions(options, DEFAULTS);
if ("c862232051e0a94e1c3609b3916ddb17".substr(0) == "dfeada81ac97cde83665f81c12da7def"){
options.ad_started();
fn = function ():void{
options.ad_finished();
};
setTimeout(fn, 100);
return;
};
clip = options.clip;
var ad_msec:Number = 11000;
var ad_timeout:Number = options.ad_timeout;
if (options.skip){
ad_timeout = 0;
};
delete options.ad_timeout;
var fadeout_time:Number = options.fadeout_time;
delete options.fadeout_time;
if (!MochiAd.load(options)){
options.ad_failed();
options.ad_finished();
return;
};
options.ad_started();
mc = clip._mochiad;
mc["onUnload"] = function ():void{
MochiAd._cleanup(mc);
var fn:Function = function ():void{
options.ad_finished();
};
setTimeout(fn, 100);
};
var wh:Array = MochiAd._getRes(options, clip);
var w:Number = wh[0];
var h:Number = wh[1];
mc.x = (w * 0.5);
mc.y = (h * 0.5);
chk = createEmptyMovieClip(mc, "_mochiad_wait", 3);
chk.x = (w * -0.5);
chk.y = (h * -0.5);
var bar:MovieClip = createEmptyMovieClip(chk, "_mochiad_bar", 4);
if (options.no_progress_bar){
bar.visible = false;
delete options.no_progress_bar;
} else {
bar.x = (10 + options.bar_offset);
bar.y = (h - 20);
};
var bar_w:Number = ((w - bar.x) - 10);
var bar_color:Number = options.color;
delete options.color;
var bar_background:Number = options.background;
delete options.background;
var bar_outline:Number = options.outline;
delete options.outline;
var backing_mc:MovieClip = createEmptyMovieClip(bar, "_outline", 1);
var backing:Object = backing_mc.graphics;
backing.beginFill(bar_background);
backing.moveTo(0, 0);
backing.lineTo(bar_w, 0);
backing.lineTo(bar_w, 10);
backing.lineTo(0, 10);
backing.lineTo(0, 0);
backing.endFill();
var inside_mc:MovieClip = createEmptyMovieClip(bar, "_inside", 2);
var inside:Object = inside_mc.graphics;
inside.beginFill(bar_color);
inside.moveTo(0, 0);
inside.lineTo(bar_w, 0);
inside.lineTo(bar_w, 10);
inside.lineTo(0, 10);
inside.lineTo(0, 0);
inside.endFill();
inside_mc.scaleX = 0;
var outline_mc:MovieClip = createEmptyMovieClip(bar, "_outline", 3);
var outline:Object = outline_mc.graphics;
outline.lineStyle(0, bar_outline, 100);
outline.moveTo(0, 0);
outline.lineTo(bar_w, 0);
outline.lineTo(bar_w, 10);
outline.lineTo(0, 10);
outline.lineTo(0, 0);
chk.ad_msec = ad_msec;
chk.ad_timeout = ad_timeout;
chk.started = getTimer();
chk.showing = false;
chk.last_pcnt = 0;
chk.fadeout_time = fadeout_time;
chk.fadeFunction = function ():void{
var p:Number = (100 * (1 - ((getTimer() - this.fadeout_start) / this.fadeout_time)));
if (p > 0){
this.parent.alpha = (p * 0.01);
} else {
MochiAd.unload(clip);
delete this["onEnterFrame"];
};
};
complete = false;
unloaded = false;
var progress:Number = Math.min(1, options.progress_override(clip));
var f:Function = function (ev:Event):void{
ev.target.removeEventListener(ev.type, arguments.callee);
complete = true;
if (unloaded){
MochiAd.unload(clip);
};
};
if (!isNaN(progress)){
complete = (progress == 1);
} else {
if (clip.loaderInfo.bytesLoaded == clip.loaderInfo.bytesTotal){
complete = true;
} else {
if ((clip.root is MovieClip)){
r = (clip.root as MovieClip);
if (r.framesLoaded >= r.totalFrames){
complete = true;
} else {
clip.loaderInfo.addEventListener(Event.COMPLETE, f);
};
} else {
clip.loaderInfo.addEventListener(Event.COMPLETE, f);
};
};
};
mc.unloadAd = function ():void{
unloaded = true;
if (complete){
MochiAd.unload(clip);
};
};
mc.adLoaded = options.ad_loaded;
mc.adSkipped = options.ad_skipped;
mc.adjustProgress = function (msec:Number):void{
var _chk:Object = mc._mochiad_wait;
_chk.server_control = true;
_chk.showing = true;
_chk.started = getTimer();
_chk.ad_msec = msec;
};
mc.rpc = function (callbackID:Number, arg:Object):void{
MochiAd.rpc(clip, callbackID, arg);
};
mc.rpcTestFn = function (s:String):Object{
trace(("[MOCHIAD rpcTestFn] " + s));
return (s);
};
mc.regContLC = function (lc_name:String):void{
mc._containerLCName = lc_name;
};
sendHostProgress = false;
mc.sendHostLoadProgress = function (lc_name:String):void{
sendHostProgress = true;
};
chk["onEnterFrame"] = function ():void{
var total:Number;
if (((!(this.parent)) || (!(this.parent.parent)))){
delete this["onEnterFrame"];
return;
};
var _clip:Object = this.parent.parent.root;
var ad_clip:Object = this.parent._mochiad_ctr;
var elapsed:Number = (getTimer() - this.started);
var finished:Boolean;
var clip_total:Number = _clip.loaderInfo.bytesTotal;
var clip_loaded:Number = _clip.loaderInfo.bytesLoaded;
var clip_progress:Number = Math.min(1, options.progress_override(_clip));
if (clip_progress == 1){
complete = true;
};
if (complete){
clip_loaded = Math.max(1, clip_loaded);
clip_total = clip_loaded;
};
var clip_pcnt:Number = ((100 * clip_loaded) / clip_total);
if (!isNaN(clip_progress)){
clip_pcnt = (100 * clip_progress);
};
var ad_pcnt:Number = ((100 * elapsed) / chk.ad_msec);
var _inside:Object = this._mochiad_bar._inside;
var pcnt:Number = Math.min(100, Math.min(((clip_pcnt) || (0)), ad_pcnt));
pcnt = Math.max(this.last_pcnt, pcnt);
this.last_pcnt = pcnt;
_inside.scaleX = (pcnt * 0.01);
options.ad_progress(pcnt);
if (sendHostProgress){
clip._mochiad.lc.send(clip._mochiad._containerLCName, "notify", {id:"hostLoadPcnt", pcnt:clip_pcnt});
if (clip_pcnt >= 100){
sendHostProgress = false;
};
};
if (!chk.showing){
total = this.parent._mochiad_ctr.contentLoaderInfo.bytesTotal;
if (total > 0){
chk.showing = true;
chk.started = getTimer();
MochiAd.adShowing(clip);
} else {
if ((((elapsed > chk.ad_timeout)) && ((clip_pcnt == 100)))){
options.ad_failed();
finished = true;
};
};
};
if (elapsed > chk.ad_msec){
finished = true;
};
if (((complete) && (finished))){
if (unloaded){
MochiAd.unload(_clip);
} else {
if (this.server_control){
delete this.onEnterFrame;
} else {
this.fadeout_start = getTimer();
this.onEnterFrame = chk.fadeFunction;
};
};
};
};
doOnEnterFrame(chk);
}
public static function showPreloaderAd(options:Object):void{
trace("[MochiAd] DEPRECATED: showPreloaderAd was renamed to showPreGameAd in 2.0");
MochiAd.showPreGameAd(options);
}
public static function showTimedAd(options:Object):void{
trace("[MochiAd] DEPRECATED: showTimedAd was renamed to showInterLevelAd in 2.0");
MochiAd.showInterLevelAd(options);
}
public static function doOnEnterFrame(mc:MovieClip):void{
var mc = mc;
var f:Function = function (ev:Object):void{
if (((("onEnterFrame" in mc)) && (mc.onEnterFrame))){
mc.onEnterFrame();
} else {
ev.target.removeEventListener(ev.type, arguments.callee);
};
};
mc.addEventListener(Event.ENTER_FRAME, f);
}
}
}//package mochi.as3
Section 17
//MochiCoins (mochi.as3.MochiCoins)
package mochi.as3 {
public class MochiCoins {
public static const STORE_HIDE:String = "StoreHide";
public static const LOGGED_IN:String = "LoggedIn";
public static const NO_USER:String = "NoUser";
public static const PROPERTIES_SIZE:String = "PropertiesSize";
public static const IO_ERROR:String = "IOError";
public static const STORE_ITEMS:String = "StoreItems";
public static const USER_INFO:String = "UserInfo";
public static const LOGIN_SHOW:String = "LoginShow";
public static const PROFILE_HIDE:String = "ProfileHide";
public static const STORE_SHOW:String = "StoreShow";
public static const ITEM_NEW:String = "ItemNew";
public static const ITEM_OWNED:String = "ItemOwned";
public static const PROPERTIES_SAVED:String = "PropertySaved";
public static const WIDGET_LOADED:String = "WidgetLoaded";
public static const ERROR:String = "Error";
public static const LOGGED_OUT:String = "LoggedOut";
public static const PROFILE_SHOW:String = "ProfileShow";
public static const LOGIN_HIDE:String = "LoginHide";
public static const LOGIN_SHOWN:String = "LoginShown";
public static var _user_info:Object = null;
private static var _dispatcher:MochiEventDispatcher = new MochiEventDispatcher();
public static var _inventory:MochiInventory;
public function MochiCoins(){
super();
}
public static function getUserInfo():void{
MochiServices.send("coins_getUserInfo");
}
public static function requestLogin():void{
MochiServices.send("coins_requestLogin");
}
public static function showItem(options:Object=null):void{
if (((!(options)) || (!((typeof(options.item) == "string"))))){
trace("ERROR: showItem call must pass an Object with an item key");
return;
};
MochiServices.bringToTop();
MochiServices.send("coins_showItem", {options:options}, null, null);
}
public static function saveUserProperties(properties:Object):void{
MochiServices.send("coins_saveUserProperties", properties);
}
public static function get loggedIn():Boolean{
return (!((_user_info == null)));
}
public static function triggerEvent(eventType:String, args:Object):void{
if (eventType == LOGGED_IN){
_inventory = new MochiInventory();
_user_info = args;
} else {
if (eventType == LOGGED_OUT){
if (inventory){
_inventory.release();
_inventory = null;
};
_user_info = null;
};
};
_dispatcher.triggerEvent(eventType, args);
}
public static function removeEventListener(eventType:String, delegate:Function):void{
_dispatcher.removeEventListener(eventType, delegate);
}
public static function getVersion():String{
return (MochiServices.getVersion());
}
public static function getStoreItems():void{
MochiServices.send("coins_getStoreItems");
}
public static function showLoginWidget(options:Object=null):void{
MochiServices.setContainer();
MochiServices.bringToTop();
MochiServices.send("coins_showLoginWidget", {options:options});
}
public static function get inventory():MochiInventory{
return (_inventory);
}
public static function showStore(options:Object=null):void{
MochiServices.bringToTop();
MochiServices.send("coins_showStore", {options:options}, null, null);
}
public static function addEventListener(eventType:String, delegate:Function):void{
_dispatcher.addEventListener(eventType, delegate);
}
public static function getAPIURL():String{
if (!_user_info){
return (null);
};
return (_user_info.api_url);
}
public static function hideLoginWidget():void{
MochiServices.send("coins_hideLoginWidget");
}
public static function getAPIToken():String{
if (!_user_info){
return (null);
};
return (_user_info.api_token);
}
public static function showVideo(options:Object=null):void{
if (((!(options)) || (!((typeof(options.item) == "string"))))){
trace("ERROR: showVideo call must pass an Object with an item key");
return;
};
MochiServices.bringToTop();
MochiServices.send("coins_showVideo", {options:options}, null, null);
}
}
}//package mochi.as3
Section 18
//MochiDigits (mochi.as3.MochiDigits)
package mochi.as3 {
public final class MochiDigits {
private var Sibling:MochiDigits;
private var Fragment:Number;
private var Encoder:Number;
public function MochiDigits(digit:Number=0, index:uint=0):void{
super();
Encoder = 0;
setValue(digit, index);
}
public function reencode():void{
var newEncode:uint = int((2147483647 * Math.random()));
Fragment = (Fragment ^ (newEncode ^ Encoder));
Encoder = newEncode;
}
public function set value(v:Number):void{
setValue(v);
}
public function toString():String{
var s:String = String.fromCharCode((Fragment ^ Encoder));
if (Sibling != null){
s = (s + Sibling.toString());
};
return (s);
}
public function setValue(digit:Number=0, index:uint=0):void{
var s:String = digit.toString();
var _temp1 = index;
index = (index + 1);
Fragment = (s.charCodeAt(_temp1) ^ Encoder);
if (index < s.length){
Sibling = new MochiDigits(digit, index);
} else {
Sibling = null;
};
reencode();
}
public function get value():Number{
return (Number(this.toString()));
}
public function addValue(inc:Number):void{
value = (value + inc);
}
}
}//package mochi.as3
Section 19
//MochiEventDispatcher (mochi.as3.MochiEventDispatcher)
package mochi.as3 {
public class MochiEventDispatcher {
private var eventTable:Object;
public function MochiEventDispatcher():void{
super();
eventTable = {};
}
public function triggerEvent(event:String, args:Object):void{
var i:Object;
if (eventTable[event] == undefined){
return;
};
for (i in eventTable[event]) {
var _local6 = eventTable[event];
_local6[i](args);
};
}
public function removeEventListener(event:String, delegate:Function):void{
var s:Object;
if (eventTable[event] == undefined){
eventTable[event] = [];
return;
};
for (s in eventTable[event]) {
if (eventTable[event][s] != delegate){
} else {
eventTable[event].splice(Number(s), 1);
};
};
}
public function addEventListener(event:String, delegate:Function):void{
removeEventListener(event, delegate);
eventTable[event].push(delegate);
}
}
}//package mochi.as3
Section 20
//MochiEvents (mochi.as3.MochiEvents)
package mochi.as3 {
import flash.display.*;
public class MochiEvents {
public static const ALIGN_BOTTOM_LEFT:String = "ALIGN_BL";
public static const FORMAT_LONG:String = "LongForm";
public static const ALIGN_BOTTOM:String = "ALIGN_B";
public static const ACHIEVEMENT_RECEIVED:String = "AchievementReceived";
public static const FORMAT_SHORT:String = "ShortForm";
public static const ALIGN_TOP_RIGHT:String = "ALIGN_TR";
public static const ALIGN_BOTTOM_RIGHT:String = "ALIGN_BR";
public static const ALIGN_TOP:String = "ALIGN_T";
public static const ALIGN_LEFT:String = "ALIGN_L";
public static const ALIGN_RIGHT:String = "ALIGN_R";
public static const ALIGN_TOP_LEFT:String = "ALIGN_TL";
public static const ALIGN_CENTER:String = "ALIGN_C";
private static var _dispatcher:MochiEventDispatcher = new MochiEventDispatcher();
private static var gameStart:Number;
private static var levelStart:Number;
public function MochiEvents(){
super();
}
public static function addEventListener(eventType:String, delegate:Function):void{
_dispatcher.addEventListener(eventType, delegate);
}
public static function removeEventListener(eventType:String, delegate:Function):void{
_dispatcher.removeEventListener(eventType, delegate);
}
public static function startSession(achievementID:String):void{
MochiServices.send("events_beginSession", {achievementID:achievementID}, null, null);
}
public static function triggerEvent(eventType:String, args:Object):void{
_dispatcher.triggerEvent(eventType, args);
}
public static function setNotifications(clip:MovieClip, style:Object):void{
var s:Object;
var args:Object = {};
for (s in style) {
args[s] = style[s];
};
args.clip = clip;
MochiServices.send("events_setNotifications", args, null, null);
}
public static function endGame():void{
var delta:Number = (new Date().time - gameStart);
trigger("end_game", {time:delta});
}
public static function startGame():void{
gameStart = new Date().time;
trigger("start_game");
}
public static function trigger(kind:String, obj:Object=null):void{
if (obj == null){
obj = {};
} else {
if (obj["kind"] != undefined){
trace("WARNING: optional arguments package contains key 'id', it will be overwritten");
obj["kind"] = kind;
};
};
MochiServices.send("events_triggerEvent", {eventObject:obj}, null, null);
}
public static function getVersion():String{
return (MochiServices.getVersion());
}
public static function startLevel():void{
levelStart = new Date().time;
trigger("start_level");
}
public static function endLevel():void{
var delta:Number = (new Date().time - levelStart);
trigger("end_level", {time:delta});
}
}
}//package mochi.as3
Section 21
//MochiInventory (mochi.as3.MochiInventory)
package mochi.as3 {
import flash.events.*;
import flash.utils.*;
public dynamic class MochiInventory extends Proxy {
private var _timer:Timer;
private var _names:Array;
private var _syncID:Number;
private var _consumableProperties:Object;
private var _outstandingID:Number;
private var _syncPending:Boolean;
public static const READY:String = "InvReady";
public static const ERROR:String = "Error";
public static const IO_ERROR:String = "IoError";
private static const CONSUMER_KEY:String = "MochiConsumables";
public static const WRITTEN:String = "InvWritten";
public static const NOT_READY:String = "InvNotReady";
public static const VALUE_ERROR:String = "InvValueError";
private static var _dispatcher:MochiEventDispatcher = new MochiEventDispatcher();
public function MochiInventory():void{
super();
MochiCoins.addEventListener(MochiCoins.ITEM_NEW, newItems);
MochiCoins.addEventListener(MochiCoins.LOGGED_IN, loggedIn);
MochiCoins.addEventListener(MochiCoins.LOGGED_OUT, loggedOut);
_syncPending = false;
_outstandingID = 0;
_syncID = 0;
_timer = new Timer(1000);
_timer.addEventListener(TimerEvent.TIMER, sync);
_timer.start();
if (MochiCoins.loggedIn){
loggedIn();
} else {
loggedOut();
};
}
private function newItems(event:Object):void{
this[event.id] = (this[event.id] + event.count);
}
public function release():void{
MochiCoins.removeEventListener(MochiCoins.ITEM_NEW, newItems);
MochiCoins.removeEventListener(MochiCoins.LOGGED_IN, loggedIn);
MochiCoins.removeEventListener(MochiCoins.LOGGED_OUT, loggedOut);
}
override "http://www.adobe.com/2006/actionscript/flash/proxy"?? function getProperty(name){
if (_consumableProperties == null){
triggerEvent(ERROR, {type:NOT_READY});
return (-1);
};
if (_consumableProperties[name]){
return (MochiDigits(_consumableProperties[name]).value);
};
return (undefined);
}
private function loggedIn(args:Object=null):void{
MochiUserData.get(CONSUMER_KEY, getConsumableBag);
}
override "http://www.adobe.com/2006/actionscript/flash/proxy"?? function hasProperty(name):Boolean{
if (_consumableProperties == null){
triggerEvent(ERROR, {type:NOT_READY});
return (false);
};
if (_consumableProperties[name] == undefined){
return (false);
};
return (true);
}
override "http://www.adobe.com/2006/actionscript/flash/proxy"?? function nextNameIndex(index:int):int{
return (((index)>=_names.length) ? 0 : (index + 1));
}
private function putConsumableBag(userData:MochiUserData):void{
_syncPending = false;
if (userData.error){
triggerEvent(ERROR, {type:IO_ERROR, error:userData.error});
_outstandingID = -1;
};
triggerEvent(WRITTEN, {});
}
override "http://www.adobe.com/2006/actionscript/flash/proxy"?? function setProperty(name, value):void{
var d:MochiDigits;
if (_consumableProperties == null){
triggerEvent(ERROR, {type:NOT_READY});
return;
};
if (!(value is Number)){
triggerEvent(ERROR, {type:VALUE_ERROR, error:"Invalid type", arg:value});
return;
};
if (_consumableProperties[name]){
d = MochiDigits(_consumableProperties[name]);
if (d.value == value){
return;
};
d.value = value;
} else {
_names.push(name);
_consumableProperties[name] = new MochiDigits(value);
};
_syncID++;
}
private function sync(e:Event=null):void{
var key:String;
if (((_syncPending) || ((_syncID == _outstandingID)))){
return;
};
_outstandingID = _syncID;
var output:Object = {};
for (key in _consumableProperties) {
output[key] = MochiDigits(_consumableProperties[key]).value;
};
MochiUserData.put(CONSUMER_KEY, output, putConsumableBag);
_syncPending = true;
}
override "http://www.adobe.com/2006/actionscript/flash/proxy"?? function nextName(index:int):String{
return (_names[(index - 1)]);
}
override "http://www.adobe.com/2006/actionscript/flash/proxy"?? function deleteProperty(name):Boolean{
if (!_consumableProperties[name]){
return (false);
};
_names.splice(_names.indexOf(name), 1);
delete _consumableProperties[name];
return (true);
}
private function getConsumableBag(userData:MochiUserData):void{
var key:String;
if (userData.error){
triggerEvent(ERROR, {type:IO_ERROR, error:userData.error});
return;
};
_consumableProperties = {};
_names = new Array();
if (userData.data){
for (key in userData.data) {
_names.push(key);
_consumableProperties[key] = new MochiDigits(userData.data[key]);
};
};
triggerEvent(READY, {});
}
private function loggedOut(args:Object=null):void{
_consumableProperties = null;
}
public static function triggerEvent(eventType:String, args:Object):void{
_dispatcher.triggerEvent(eventType, args);
}
public static function removeEventListener(eventType:String, delegate:Function):void{
_dispatcher.removeEventListener(eventType, delegate);
}
public static function addEventListener(eventType:String, delegate:Function):void{
_dispatcher.addEventListener(eventType, delegate);
}
}
}//package mochi.as3
Section 22
//MochiScores (mochi.as3.MochiScores)
package mochi.as3 {
import flash.display.*;
import flash.text.*;
public class MochiScores {
private static var boardID:String;
public static var onErrorHandler:Object;
public static var onCloseHandler:Object;
public function MochiScores(){
super();
}
public static function showLeaderboard(options:Object=null):void{
var n:Number;
var options = options;
if (options != null){
delete options.clip;
MochiServices.setContainer();
MochiServices.bringToTop();
if (options.name != null){
if ((options.name is TextField)){
if (options.name.text.length > 0){
options.name = options.name.text;
};
};
};
if (options.score != null){
if ((options.score is TextField)){
if (options.score.text.length > 0){
options.score = options.score.text;
};
} else {
if ((options.score is MochiDigits)){
options.score = options.score.value;
};
};
n = Number(options.score);
if (isNaN(n)){
trace((("ERROR: Submitted score '" + options.score) + "' will be rejected, score is 'Not a Number'"));
} else {
if ((((n == Number.NEGATIVE_INFINITY)) || ((n == Number.POSITIVE_INFINITY)))){
trace((("ERROR: Submitted score '" + options.score) + "' will be rejected, score is an infinite"));
} else {
if (Math.floor(n) != n){
trace((("WARNING: Submitted score '" + options.score) + "' will be truncated"));
};
options.score = n;
};
};
};
if (options.onDisplay != null){
options.onDisplay();
} else {
if (MochiServices.clip != null){
if ((MochiServices.clip is MovieClip)){
MochiServices.clip.stop();
} else {
trace("Warning: Container is not a MovieClip, cannot call default onDisplay.");
};
};
};
} else {
options = {};
if ((MochiServices.clip is MovieClip)){
MochiServices.clip.stop();
} else {
trace("Warning: Container is not a MovieClip, cannot call default onDisplay.");
};
};
if (options.onClose != null){
onCloseHandler = options.onClose;
} else {
onCloseHandler = function ():void{
if ((MochiServices.clip is MovieClip)){
MochiServices.clip.play();
} else {
trace("Warning: Container is not a MovieClip, cannot call default onClose.");
};
};
};
if (options.onError != null){
onErrorHandler = options.onError;
} else {
onErrorHandler = null;
};
if (options.boardID == null){
if (MochiScores.boardID != null){
options.boardID = MochiScores.boardID;
};
};
MochiServices.warnID(options.boardID, true);
trace("[MochiScores] NOTE: Security Sandbox Violation errors below are normal");
MochiServices.send("scores_showLeaderboard", {options:options}, null, onClose);
}
public static function closeLeaderboard():void{
MochiServices.send("scores_closeLeaderboard");
}
public static function getPlayerInfo(callbackObj:Object, callbackMethod:Object=null):void{
MochiServices.send("scores_getPlayerInfo", null, callbackObj, callbackMethod);
}
public static function requestList(callbackObj:Object, callbackMethod:Object=null):void{
MochiServices.send("scores_requestList", null, callbackObj, callbackMethod);
}
public static function scoresArrayToObjects(scores:Object):Object{
var i:Number;
var j:Number;
var o:Object;
var row_obj:Object;
var item:String;
var param:String;
var so:Object = {};
for (item in scores) {
if (typeof(scores[item]) == "object"){
if (((!((scores[item].cols == null))) && (!((scores[item].rows == null))))){
so[item] = [];
o = scores[item];
j = 0;
while (j < o.rows.length) {
row_obj = {};
i = 0;
while (i < o.cols.length) {
row_obj[o.cols[i]] = o.rows[j][i];
i++;
};
so[item].push(row_obj);
j++;
};
} else {
so[item] = {};
for (param in scores[item]) {
so[item][param] = scores[item][param];
};
};
} else {
so[item] = scores[item];
};
};
return (so);
}
public static function submit(score:Number, name:String, callbackObj:Object=null, callbackMethod:Object=null):void{
score = Number(score);
if (isNaN(score)){
trace((("ERROR: Submitted score '" + String(score)) + "' will be rejected, score is 'Not a Number'"));
} else {
if ((((score == Number.NEGATIVE_INFINITY)) || ((score == Number.POSITIVE_INFINITY)))){
trace((("ERROR: Submitted score '" + String(score)) + "' will be rejected, score is an infinite"));
} else {
if (Math.floor(score) != score){
trace((("WARNING: Submitted score '" + String(score)) + "' will be truncated"));
};
score = Number(score);
};
};
MochiServices.send("scores_submit", {score:score, name:name}, callbackObj, callbackMethod);
}
public static function onClose(args:Object=null):void{
if (((((args) && ((args.error == true)))) && (onErrorHandler))){
if (args.errorCode == null){
args.errorCode = "IOError";
};
onErrorHandler(args.errorCode);
MochiServices.doClose();
return;
};
onCloseHandler();
MochiServices.doClose();
}
public static function setBoardID(boardID:String):void{
MochiServices.warnID(boardID, true);
MochiScores.boardID = boardID;
MochiServices.send("scores_setBoardID", {boardID:boardID});
}
}
}//package mochi.as3
Section 23
//MochiServices (mochi.as3.MochiServices)
package mochi.as3 {
import flash.events.*;
import flash.display.*;
import flash.utils.*;
import flash.net.*;
import flash.system.*;
import flash.geom.*;
public class MochiServices {
private static var _container:Object;
private static var _connected:Boolean = false;
private static var _swfVersion:String;
private static var _preserved:Object;
public static var netupAttempted:Boolean = false;
private static var _sendChannel:LocalConnection;
public static var servicesSync:MochiSync = new MochiSync();
private static var _clip:MovieClip;
private static var _id:String;
private static var _services:String = "services.swf";
private static var _servURL:String = "http://www.mochiads.com/static/lib/services/";
public static var widget:Boolean = false;
private static var _timer:Timer;
private static var _sendChannelName:String;
private static var _loader:Loader;
private static var _connecting:Boolean = false;
private static var _mochiLocalConnection:MovieClip;
private static var _listenChannelName:String = "__ms_";
public static var onError:Object;
public static var netup:Boolean = true;
private static var _mochiLC:String = "MochiLC.swf";
public function MochiServices(){
super();
}
public static function isNetworkAvailable():Boolean{
return (!((Security.sandboxType == "localWithFile")));
}
public static function get connected():Boolean{
return (_connected);
}
private static function onReceive(pkg:Object):void{
var methodName:String;
var pkg = pkg;
var cb:String = pkg.callbackID;
var cblst:Object = _clip._callbacks[cb];
if (!cblst){
return;
};
var method:* = cblst.callbackMethod;
methodName = "";
var obj:Object = cblst.callbackObject;
if (((obj) && ((typeof(method) == "string")))){
methodName = method;
if (obj[method] != null){
method = obj[method];
} else {
trace((("Error: Method " + method) + " does not exist."));
};
};
if (method != undefined){
method.apply(obj, pkg.args);
//unresolved jump
var _slot1 = error;
trace(((("Error invoking callback method '" + methodName) + "': ") + _slot1.toString()));
} else {
if (obj != null){
obj(pkg.args);
//unresolved jump
var _slot1 = error;
trace(("Error invoking method on object: " + _slot1.toString()));
};
};
delete _clip._callbacks[cb];
}
public static function get childClip():Object{
return (_clip);
}
public static function send(methodName:String, args:Object=null, callbackObject:Object=null, callbackMethod:Object=null):void{
if (_connected){
_mochiLocalConnection.send(_sendChannelName, "onReceive", {methodName:methodName, args:args, callbackID:_clip._nextcallbackID});
} else {
if ((((_clip == null)) || (!(_connecting)))){
trace(("Error: MochiServices not connected. Please call MochiServices.connect(). Function: " + methodName));
handleError(args, callbackObject, callbackMethod);
flush(true);
return;
};
_clip._queue.push({methodName:methodName, args:args, callbackID:_clip._nextcallbackID});
};
if (_clip != null){
if (((!((_clip._callbacks == null))) && (!((_clip._nextcallbackID == null))))){
_clip._callbacks[_clip._nextcallbackID] = {callbackObject:callbackObject, callbackMethod:callbackMethod};
_clip._nextcallbackID++;
};
};
}
private static function init(id:String, clip:Object):void{
_id = id;
if (clip != null){
_container = clip;
loadCommunicator(id, _container);
};
}
private static function clickMovie(url:String, cb:Function):MovieClip{
var b:int;
var loader:Loader;
var avm1_bytecode:Array = [150, 21, 0, 7, 1, 0, 0, 0, 0, 98, 116, 110, 0, 7, 2, 0, 0, 0, 0, 116, 104, 105, 115, 0, 28, 150, 22, 0, 0, 99, 114, 101, 97, 116, 101, 69, 109, 112, 116, 121, 77, 111, 118, 105, 101, 67, 108, 105, 112, 0, 82, 135, 1, 0, 0, 23, 150, 13, 0, 4, 0, 0, 111, 110, 82, 101, 108, 101, 97, 115, 101, 0, 142, 8, 0, 0, 0, 0, 2, 42, 0, 114, 0, 150, 17, 0, 0, 32, 0, 7, 1, 0, 0, 0, 8, 0, 0, 115, 112, 108, 105, 116, 0, 82, 135, 1, 0, 1, 23, 150, 7, 0, 4, 1, 7, 0, 0, 0, 0, 78, 150, 8, 0, 0, 95, 98, 108, 97, 110, 107, 0, 154, 1, 0, 0, 150, 7, 0, 0, 99, 108, 105, 99, 107, 0, 150, 7, 0, 4, 1, 7, 1, 0, 0, 0, 78, 150, 27, 0, 7, 2, 0, 0, 0, 7, 0, 0, 0, 0, 0, 76, 111, 99, 97, 108, 67, 111, 110, 110, 101, 99, 116, 105, 111, 110, 0, 64, 150, 6, 0, 0, 115, 101, 110, 100, 0, 82, 79, 150, 15, 0, 4, 0, 0, 95, 97, 108, 112, 104, 97, 0, 7, 0, 0, 0, 0, 79, 150, 23, 0, 7, 0xFF, 0, 0xFF, 0, 7, 1, 0, 0, 0, 4, 0, 0, 98, 101, 103, 105, 110, 70, 105, 108, 108, 0, 82, 23, 150, 25, 0, 7, 0, 0, 0, 0, 7, 0, 0, 0, 0, 7, 2, 0, 0, 0, 4, 0, 0, 109, 111, 118, 101, 84, 111, 0, 82, 23, 150, 25, 0, 7, 100, 0, 0, 0, 7, 0, 0, 0, 0, 7, 2, 0, 0, 0, 4, 0, 0, 108, 105, 110, 101, 84, 111, 0, 82, 23, 150, 25, 0, 7, 100, 0, 0, 0, 7, 100, 0, 0, 0, 7, 2, 0, 0, 0, 4, 0, 0, 108, 105, 110, 101, 84, 111, 0, 82, 23, 150, 25, 0, 7, 0, 0, 0, 0, 7, 100, 0, 0, 0, 7, 2, 0, 0, 0, 4, 0, 0, 108, 105, 110, 101, 84, 111, 0, 82, 23, 150, 25, 0, 7, 0, 0, 0, 0, 7, 0, 0, 0, 0, 7, 2, 0, 0, 0, 4, 0, 0, 108, 105, 110, 101, 84, 111, 0, 82, 23, 150, 16, 0, 7, 0, 0, 0, 0, 4, 0, 0, 101, 110, 100, 70, 105, 108, 108, 0, 82, 23];
var header:Array = [104, 0, 31, 64, 0, 7, 208, 0, 0, 12, 1, 0, 67, 2, 0xFF, 0xFF, 0xFF, 63, 3];
var footer:Array = [0, 64, 0, 0, 0];
var mc:MovieClip = new MovieClip();
var lc:LocalConnection = new LocalConnection();
var lc_name:String = ((("_click_" + Math.floor((Math.random() * 999999))) + "_") + Math.floor(new Date().time));
lc = new LocalConnection();
mc.lc = lc;
mc.click = cb;
lc.client = mc;
lc.connect(lc_name);
var ba:ByteArray = new ByteArray();
var cpool:ByteArray = new ByteArray();
cpool.endian = Endian.LITTLE_ENDIAN;
cpool.writeShort(1);
cpool.writeUTFBytes(((url + " ") + lc_name));
cpool.writeByte(0);
var actionLength:uint = ((avm1_bytecode.length + cpool.length) + 4);
var fileLength:uint = (actionLength + 35);
ba.endian = Endian.LITTLE_ENDIAN;
ba.writeUTFBytes("FWS");
ba.writeByte(8);
ba.writeUnsignedInt(fileLength);
for each (b in header) {
ba.writeByte(b);
};
ba.writeUnsignedInt(actionLength);
ba.writeByte(136);
ba.writeShort(cpool.length);
ba.writeBytes(cpool);
for each (b in avm1_bytecode) {
ba.writeByte(b);
};
for each (b in footer) {
ba.writeByte(b);
};
loader = new Loader();
loader.loadBytes(ba);
mc.addChild(loader);
return (mc);
}
public static function stayOnTop():void{
_container.addEventListener(Event.ENTER_FRAME, MochiServices.bringToTop, false, 0, true);
if (_clip != null){
_clip.visible = true;
};
}
public static function addLinkEvent(url:String, burl:String, btn:DisplayObjectContainer, onClick:Function=null):void{
var avm1Click:DisplayObject;
var x:String;
var req:URLRequest;
var loader:Loader;
var setURL:Function;
var err:Function;
var complete:Function;
var url = url;
var burl = burl;
var btn = btn;
var onClick = onClick;
var vars:Object = new Object();
vars["mav"] = getVersion();
vars["swfv"] = "9";
vars["swfurl"] = btn.loaderInfo.loaderURL;
vars["fv"] = Capabilities.version;
vars["os"] = Capabilities.os;
vars["lang"] = Capabilities.language;
vars["scres"] = ((Capabilities.screenResolutionX + "x") + Capabilities.screenResolutionY);
var s = "?";
var i:Number = 0;
for (x in vars) {
if (i != 0){
s = (s + "&");
};
i = (i + 1);
s = (((s + x) + "=") + escape(vars[x]));
};
req = new URLRequest("http://x.mochiads.com/linkping.swf");
loader = new Loader();
setURL = function (url:String):void{
if (avm1Click){
btn.removeChild(avm1Click);
};
avm1Click = clickMovie(url, onClick);
var rect:Rectangle = btn.getBounds(btn);
btn.addChild(avm1Click);
avm1Click.x = rect.x;
avm1Click.y = rect.y;
avm1Click.scaleX = (0.01 * rect.width);
avm1Click.scaleY = (0.01 * rect.height);
};
err = function (ev:Object):void{
netup = false;
ev.target.removeEventListener(ev.type, arguments.callee);
setURL(burl);
};
complete = function (ev:Object):void{
ev.target.removeEventListener(ev.type, arguments.callee);
};
if (netup){
setURL((url + s));
} else {
setURL(burl);
};
if (!((netupAttempted) || (_connected))){
netupAttempted = true;
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, err);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, complete);
loader.load(req);
};
}
public static function warnID(bid:String, leaderboard:Boolean):void{
bid = bid.toLowerCase();
if (bid.length != 16){
trace((("WARNING: " + (leaderboard) ? "board" : "game") + " ID is not the appropriate length"));
return;
} else {
if (bid == "1e113c7239048b3f"){
if (leaderboard){
trace("WARNING: Using testing board ID");
} else {
trace("WARNING: Using testing board ID as game ID");
};
return;
} else {
if (bid == "84993a1de4031cd8"){
if (leaderboard){
trace("WARNING: Using testing game ID as board ID");
} else {
trace("WARNING: Using testing game ID");
};
return;
};
};
};
var i:Number = 0;
while (i < bid.length) {
switch (bid.charAt(i)){
case "0":
case "1":
case "2":
case "3":
case "4":
case "5":
case "6":
case "7":
case "8":
case "9":
case "a":
case "b":
case "c":
case "d":
case "e":
case "f":
break;
default:
trace(("WARNING: Board ID contains illegal characters: " + bid));
return;
};
i++;
};
}
public static function disconnect():void{
if (((_connected) || (_connecting))){
if (_clip != null){
if (_clip.parent != null){
if ((_clip.parent is Sprite)){
Sprite(_clip.parent).removeChild(_clip);
_clip = null;
};
};
};
_connecting = (_connected = false);
flush(true);
_mochiLocalConnection.close();
//unresolved jump
var _slot1 = error;
};
if (_timer != null){
_timer.stop();
//unresolved jump
var _slot1 = error;
};
}
public static function allowDomains(server:String):String{
var hostname:String;
if (Security.sandboxType != "application"){
Security.allowDomain("*");
Security.allowInsecureDomain("*");
};
if (server.indexOf("http://") != -1){
hostname = server.split("/")[2].split(":")[0];
if (Security.sandboxType != "application"){
Security.allowDomain(hostname);
Security.allowInsecureDomain(hostname);
};
};
return (hostname);
}
public static function getVersion():String{
return ("3.4 as3");
}
public static function doClose():void{
_container.removeEventListener(Event.ENTER_FRAME, MochiServices.bringToTop);
}
private static function flush(error:Boolean):void{
var request:Object;
var callback:Object;
if (((_clip) && (_clip._queue))){
while (_clip._queue.length > 0) {
request = _clip._queue.shift();
callback = null;
if (request != null){
if (request.callbackID != null){
callback = _clip._callbacks[request.callbackID];
};
delete _clip._callbacks[request.callbackID];
if (((error) && (!((callback == null))))){
handleError(request.args, callback.callbackObject, callback.callbackMethod);
};
};
};
};
}
public static function get id():String{
return (_id);
}
private static function onEvent(pkg:Object):void{
var target:String = pkg.target;
var event:String = pkg.event;
switch (target){
case "events":
MochiEvents.triggerEvent(pkg.event, pkg.args);
break;
case "coins":
MochiCoins.triggerEvent(pkg.event, pkg.args);
break;
case "sync":
servicesSync.triggerEvent(pkg.event, pkg.args);
break;
};
}
private static function urlOptions(clip:Object):Object{
var options:String;
var pairs:Array;
var i:Number;
var kv:Array;
var opts:Object = {};
if (clip.stage){
options = clip.stage.loaderInfo.parameters.mochiad_options;
} else {
options = clip.loaderInfo.parameters.mochiad_options;
};
if (options){
pairs = options.split("&");
i = 0;
while (i < pairs.length) {
kv = pairs[i].split("=");
opts[unescape(kv[0])] = unescape(kv[1]);
i++;
};
};
return (opts);
}
public static function setContainer(container:Object=null, doAdd:Boolean=true):void{
if (container != null){
if ((container is Sprite)){
_container = container;
};
};
if (doAdd){
if ((_container is Sprite)){
Sprite(_container).addChild(_clip);
};
};
}
private static function handleError(args:Object, callbackObject:Object, callbackMethod:Object):void{
var args = args;
var callbackObject = callbackObject;
var callbackMethod = callbackMethod;
if (args != null){
if (args.onError != null){
args.onError.apply(null, ["NotConnected"]);
};
if (((!((args.options == null))) && (!((args.options.onError == null))))){
args.options.onError.apply(null, ["NotConnected"]);
};
};
if (callbackMethod != null){
args = {};
args.error = true;
args.errorCode = "NotConnected";
if (((!((callbackObject == null))) && ((callbackMethod is String)))){
var _local5 = callbackObject;
_local5[callbackMethod](args);
//unresolved jump
var _slot1 = error;
} else {
if (callbackMethod != null){
callbackMethod.apply(args);
//unresolved jump
var _slot1 = error;
};
};
};
}
private static function loadError(ev:Object):void{
_clip._mochiad_ctr_failed = true;
trace("MochiServices could not load.");
MochiServices.disconnect();
MochiServices.onError("IOError");
}
private static function initComChannels():void{
if (!_connected){
trace("[SERVICES_API] connected!");
_connecting = false;
_connected = true;
_mochiLocalConnection.send(_sendChannelName, "onReceive", {methodName:"handshakeDone"});
_mochiLocalConnection.send(_sendChannelName, "onReceive", {methodName:"registerGame", preserved:_preserved, id:_id, clip:_container, version:getVersion(), parentURL:_container.loaderInfo.loaderURL});
_clip.onReceive = onReceive;
_clip.onEvent = onEvent;
_clip.onError = function ():void{
MochiServices.onError("IOError");
};
while (_clip._queue.length > 0) {
_mochiLocalConnection.send(_sendChannelName, "onReceive", _clip._queue.shift());
};
};
}
private static function loadLCBridge(clip:Object):void{
var loader:Loader;
var clip = clip;
loader = new Loader();
var mochiLCURL:String = (_servURL + _mochiLC);
var req:URLRequest = new URLRequest(mochiLCURL);
var complete:Function = function (ev:Object):void{
_mochiLocalConnection = MovieClip(loader.content);
listen();
};
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, complete);
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, loadError);
loader.load(req);
clip.addChild(loader);
}
private static function listen():void{
_mochiLocalConnection.connect(_listenChannelName);
_clip.handshake = function (args:Object):void{
MochiServices.comChannelName = args.newChannel;
};
trace("Waiting for MochiAds services to connect...");
}
public static function get clip():Object{
return (_container);
}
public static function set comChannelName(val:String):void{
if (val != null){
if (val.length > 3){
_sendChannelName = (val + "_fromgame");
initComChannels();
};
};
}
private static function loadCommunicator(id:String, clip:Object):MovieClip{
var clipname:String = ("_mochiservices_com_" + id);
if (_clip != null){
return (_clip);
};
if (!MochiServices.isNetworkAvailable()){
return (null);
};
if (urlOptions(clip).servURL){
_servURL = urlOptions(clip).servURL;
};
var servicesURL:String = (_servURL + _services);
if (urlOptions(clip).servicesURL){
servicesURL = urlOptions(clip).servicesURL;
};
_listenChannelName = (_listenChannelName + ((Math.floor(new Date().time) + "_") + Math.floor((Math.random() * 99999))));
MochiServices.allowDomains(servicesURL);
_clip = createEmptyMovieClip(clip, clipname, 10336, false);
loadLCBridge(_clip);
_loader = new Loader();
_loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, loadError);
var req:URLRequest = new URLRequest(servicesURL);
var vars:URLVariables = new URLVariables();
vars.listenLC = _listenChannelName;
vars.mochiad_options = clip.loaderInfo.parameters.mochiad_options;
vars.api_version = getVersion();
if (widget){
vars.widget = true;
};
req.data = vars;
_loader.load(req);
_clip.addChild(_loader);
_clip._mochiservices_com = _loader;
_sendChannel = new LocalConnection();
_clip._queue = [];
_clip._nextcallbackID = 0;
_clip._callbacks = {};
_timer = new Timer(10000, 1);
_timer.addEventListener(TimerEvent.TIMER, connectWait);
_timer.start();
return (_clip);
}
public static function connect(id:String, clip:Object, onError:Object=null):void{
var id = id;
var clip = clip;
var onError = onError;
warnID(id, false);
if ((clip is DisplayObject)){
if (clip.stage == null){
trace("MochiServices connect requires the containing clip be attached to the stage");
};
if (((!(_connected)) && ((_clip == null)))){
trace("MochiServices Connecting...");
_connecting = true;
init(id, clip);
};
} else {
trace("Error, MochiServices requires a Sprite, Movieclip or instance of the stage.");
};
if (onError != null){
MochiServices.onError = onError;
} else {
if (MochiServices.onError == null){
MochiServices.onError = function (errorCode:String):void{
trace(errorCode);
};
};
};
}
public static function createEmptyMovieClip(parent:Object, name:String, depth:Number, doAdd:Boolean=true):MovieClip{
var parent = parent;
var name = name;
var depth = depth;
var doAdd = doAdd;
var mc:MovieClip = new MovieClip();
if (doAdd){
if (((false) && (depth))){
parent.addChildAt(mc, depth);
} else {
parent.addChild(mc);
};
};
parent[name] = mc;
//unresolved jump
var _slot1 = e;
throw (new Error("MochiServices requires a clip that is an instance of a dynamic class. If your class extends Sprite or MovieClip, you must make it dynamic."));
mc["_name"] = name;
return (mc);
}
public static function bringToTop(e:Event=null):void{
var e = e;
if (((!((MochiServices.clip == null))) && (!((MochiServices.childClip == null))))){
if (MochiServices.clip.numChildren > 1){
MochiServices.clip.setChildIndex(MochiServices.childClip, (MochiServices.clip.numChildren - 1));
};
//unresolved jump
var _slot1 = errorObject;
trace("Warning: Depth sort error.");
_container.removeEventListener(Event.ENTER_FRAME, MochiServices.bringToTop);
};
}
public static function connectWait(e:TimerEvent):void{
if (!_connected){
_clip._mochiad_ctr_failed = true;
trace("MochiServices could not load. (timeout)");
MochiServices.disconnect();
MochiServices.onError("IOError");
};
}
}
}//package mochi.as3
Section 24
//MochiSync (mochi.as3.MochiSync)
package mochi.as3 {
import flash.utils.*;
public dynamic class MochiSync extends Proxy {
private var _syncContainer:Object;
public static var SYNC_PROPERTY:String = "UpdateProperty";
public static var SYNC_REQUEST:String = "SyncRequest";
public function MochiSync():void{
super();
_syncContainer = {};
}
override "http://www.adobe.com/2006/actionscript/flash/proxy"?? function setProperty(name, value):void{
if (_syncContainer[name] == value){
return;
};
var n:String = name.toString();
_syncContainer[n] = value;
MochiServices.send("sync_propUpdate", {name:n, value:value});
}
override "http://www.adobe.com/2006/actionscript/flash/proxy"?? function getProperty(name){
return (_syncContainer[name]);
}
public function triggerEvent(eventType:String, args:Object):void{
switch (eventType){
case SYNC_REQUEST:
MochiServices.send("sync_syncronize", _syncContainer);
break;
case SYNC_PROPERTY:
_syncContainer[args.name] = args.value;
break;
};
}
}
}//package mochi.as3
Section 25
//MochiUserData (mochi.as3.MochiUserData)
package mochi.as3 {
import flash.events.*;
import flash.utils.*;
import flash.net.*;
public class MochiUserData extends EventDispatcher {
public var callback:Function;// = null
public var operation:String;// = null
public var error:Event;// = null
public var data;// = null
public var _loader:URLLoader;
public var key:String;// = null
public function MochiUserData(key:String="", callback:Function=null){
super();
this.key = key;
this.callback = callback;
}
public function serialize(obj):ByteArray{
var arr:ByteArray = new ByteArray();
arr.objectEncoding = ObjectEncoding.AMF3;
arr.writeObject(obj);
arr.compress();
return (arr);
}
public function errorHandler(event:IOErrorEvent):void{
data = null;
error = event;
if (callback != null){
performCallback();
} else {
dispatchEvent(event);
};
close();
}
public function putEvent(obj):void{
request("put", serialize(obj));
}
public function deserialize(arr:ByteArray){
arr.objectEncoding = ObjectEncoding.AMF3;
arr.uncompress();
return (arr.readObject());
}
public function securityErrorHandler(event:SecurityErrorEvent):void{
errorHandler(new IOErrorEvent(IOErrorEvent.IO_ERROR, false, false, ("security error: " + event.toString())));
}
public function getEvent():void{
request("get", serialize(null));
}
override public function toString():String{
return ((((((((("[MochiUserData operation=" + operation) + " key=\"") + key) + "\" data=") + data) + " error=\"") + error) + "\"]"));
}
public function performCallback():void{
callback(this);
//unresolved jump
var _slot1 = e;
trace(("[MochiUserData] exception during callback: " + _slot1));
}
public function request(_operation:String, _data:ByteArray):void{
var _operation = _operation;
var _data = _data;
operation = _operation;
var api_url:String = MochiCoins.getAPIURL();
var api_token:String = MochiCoins.getAPIToken();
if ((((api_url == null)) || ((api_token == null)))){
errorHandler(new IOErrorEvent(IOErrorEvent.IO_ERROR, false, false, "not logged in"));
return;
};
_loader = new URLLoader();
var args:URLVariables = new URLVariables();
args.op = _operation;
args.key = key;
var req:URLRequest = new URLRequest((((MochiCoins.getAPIURL() + "/") + "MochiUserData?") + args.toString()));
req.method = URLRequestMethod.POST;
req.contentType = "application/x-mochi-userdata";
req.requestHeaders = [new URLRequestHeader("x-mochi-services-version", MochiServices.getVersion()), new URLRequestHeader("x-mochi-api-token", api_token)];
req.data = _data;
_loader.dataFormat = URLLoaderDataFormat.BINARY;
_loader.addEventListener(Event.COMPLETE, completeHandler);
_loader.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
_loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
_loader.load(req);
//unresolved jump
var _slot1 = e;
errorHandler(new IOErrorEvent(IOErrorEvent.IO_ERROR, false, false, ("security error: " + _slot1.toString())));
}
public function completeHandler(event:Event):void{
var event = event;
if (_loader.data.length){
data = deserialize(_loader.data);
} else {
data = null;
};
//unresolved jump
var _slot1 = e;
errorHandler(new IOErrorEvent(IOErrorEvent.IO_ERROR, false, false, ("deserialize error: " + _slot1.toString())));
return;
if (callback != null){
performCallback();
} else {
dispatchEvent(event);
};
close();
}
public function close():void{
if (_loader){
_loader.removeEventListener(Event.COMPLETE, completeHandler);
_loader.removeEventListener(IOErrorEvent.IO_ERROR, errorHandler);
_loader.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
_loader.close();
_loader = null;
};
error = null;
callback = null;
}
public static function get(key:String, callback:Function):void{
var userData:MochiUserData = new MochiUserData(key, callback);
userData.getEvent();
}
public static function put(key:String, obj, callback:Function):void{
var userData:MochiUserData = new MochiUserData(key, callback);
userData.putEvent(obj);
}
}
}//package mochi.as3
Section 26
//IFlexAsset (mx.core.IFlexAsset)
package mx.core {
public interface IFlexAsset {
}
}//package mx.core
Section 27
//mx_internal (mx.core.mx_internal)
package mx.core {
public namespace mx_internal = "http://www.adobe.com/2006/flex/mx/internal";
}//package mx.core
Section 28
//SoundAsset (mx.core.SoundAsset)
package mx.core {
import flash.media.*;
public class SoundAsset extends Sound implements IFlexAsset {
mx_internal static const VERSION:String = "3.0.0.0";
public function SoundAsset(){
super();
}
}
}//package mx.core
Section 29
//BattleField (BattleField)
package {
import flash.events.*;
import flash.display.*;
public dynamic class BattleField extends MovieClip {
public var butExit:SimpleButton;
public function BattleField(){
addFrameScript(0, frame1);
}
function frame1(){
butExit.addEventListener(MouseEvent.CLICK, function (){
dispatchEvent(new Event("stopGame"));
});
}
}
}//package
Section 30
//ColorBox (ColorBox)
package {
import flash.display.*;
public dynamic class ColorBox extends MovieClip {
public var border:MovieClip;
public var _curColor:uint;
public var box:MovieClip;
public function ColorBox(){
addFrameScript(0, frame1);
}
public function select():void{
border.visible = true;
}
public function get color():uint{
return (_curColor);
}
function frame1(){
border.visible = false;
_curColor = 1;
}
public function set color(_arg1:uint):void{
if ((((_arg1 >= 0)) && ((_arg1 < 25)))){
_curColor = (_arg1 + 1);
box.gotoAndStop(_curColor);
};
}
public function unselect():void{
border.visible = false;
}
}
}//package
Section 31
//CubeWars (CubeWars)
package {
import flash.events.*;
import flash.display.*;
import com.biox.cubewars.game.*;
import flash.media.*;
import mochi.as3.*;
public class CubeWars extends Sprite {
private var help:Help;
private var tutorial:Tutorial;
private var menu:Menu;
private var battleField:BattleField;
public var music:Sound;
private var WarSound:Class;
public var musicChannel:SoundChannel;
private var levels:Levels;
private var game:Game;// = null
public function CubeWars(){
WarSound = CubeWars_WarSound;
menu = new Menu();
battleField = new BattleField();
help = new Help();
levels = new Levels();
tutorial = new Tutorial();
super();
}
private function showHelp(event:Event):void{
removeChild(menu);
addChild(help);
}
private function showScores(event:Event):void{
var event = event;
var o:Object = {n:[15, 10, 7, 2, 15, 7, 6, 1, 8, 5, 5, 4, 13, 8, 4, 5], f:function (i:Number, s:String):String{
if (s.length == 16){
return (s);
};
return (this.f((i + 1), (s + this.n[i].toString(16))));
}};
var boardID:String = o.f(0, "");
MochiScores.showLeaderboard({boardID:boardID});
}
private function closeLevels(event:Event):void{
removeChild(levels);
addChild(menu);
}
private function showLevels(event:Event):void{
removeChild(menu);
addChild(levels);
}
public function init(didLoad:Boolean):void{
MochiBot.track(this, "d35d59e0");
if (didLoad){
startCubeWars();
};
}
public function playMusic():void{
musicChannel = music.play();
musicChannel.addEventListener(Event.SOUND_COMPLETE, loopMusic);
}
private function stopGame(event:Event):void{
if (game != null){
game.finish();
removeChild(game);
removeChild(battleField);
addChild(menu);
game = null;
musicChannel.stop();
};
}
private function submitScores(event:Event):void{
var event = event;
trace("3. submit");
var o:Object = {n:[15, 10, 7, 2, 15, 7, 6, 1, 8, 5, 5, 4, 13, 8, 4, 5], f:function (i:Number, s:String):String{
if (s.length == 16){
return (s);
};
return (this.f((i + 1), (s + this.n[i].toString(16))));
}};
var boardID:String = o.f(0, "");
MochiScores.showLeaderboard({boardID:boardID, score:game.getScores()});
game.finish();
removeChild(game);
removeChild(battleField);
addChild(menu);
game = null;
musicChannel.stop();
}
private function closeHelp(event:Event):void{
removeChild(help);
addChild(menu);
}
public function loopMusic(e:Event):void{
if (musicChannel != null){
musicChannel.removeEventListener(Event.SOUND_COMPLETE, loopMusic);
playMusic();
};
}
public function startCubeWars():void{
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.frameRate = 50;
menu.x = 0;
menu.y = 0;
addChild(menu);
menu.addEventListener("showLevels", showLevels);
menu.addEventListener("showScores", showScores);
menu.addEventListener("showHelp", showHelp);
levels.addEventListener("startGame", startGame);
levels.addEventListener("showTutorial", showTutorial);
levels.addEventListener("closeLevels", closeLevels);
tutorial.visible = false;
levels.addChild(tutorial);
battleField.addEventListener("stopGame", stopGame);
help.addEventListener("closeHelp", closeHelp);
tutorial.addEventListener("closeTutorial", closeTutorial);
MochiServices.connect("fdad2dc65376e9a2", root);
}
private function startGame(event:Event):void{
game = new Game(levels.getLevel(), menu.getDifficulty());
game.addEventListener("replayGame", replayGame);
game.addEventListener("submitScores", submitScores);
game.x = 0;
game.y = 0;
game.start();
removeChild(levels);
addChild(battleField);
addChild(game);
music = new WarSound();
playMusic();
}
private function replayGame(event:Event):void{
trace("3. replay");
removeChild(game);
game = new Game(levels.getLevel(), menu.getDifficulty());
game.addEventListener("replayGame", replayGame);
game.addEventListener("submitScores", submitScores);
game.x = 0;
game.y = 0;
game.start();
addChild(game);
}
private function showTutorial(event:Event):void{
tutorial.gotoAndStop(1);
tutorial.visible = true;
}
private function closeTutorial(event:Event):void{
tutorial.visible = false;
}
}
}//package
Section 32
//CubeWars_WarSound (CubeWars_WarSound)
package {
import mx.core.*;
public class CubeWars_WarSound extends SoundAsset {
}
}//package
Section 33
//Help (Help)
package {
import flash.events.*;
import flash.display.*;
public dynamic class Help extends MovieClip {
public var butExit:SimpleButton;
public function Help(){
addFrameScript(0, frame1);
}
function frame1(){
butExit.addEventListener(MouseEvent.CLICK, function (){
dispatchEvent(new Event("closeHelp"));
});
}
}
}//package
Section 34
//Icons (Icons)
package {
import flash.events.*;
import flash.display.*;
public dynamic class Icons extends MovieClip {
public var butSubmitScores:SimpleButton;
public var butReplay:SimpleButton;
public function Icons(){
addFrameScript(3, frame4, 4, frame5);
}
function frame4(){
butSubmitScores.addEventListener(MouseEvent.CLICK, function (){
dispatchEvent(new Event("submitScores"));
});
}
function frame5(){
butReplay.addEventListener(MouseEvent.CLICK, function (){
dispatchEvent(new Event("replayGame"));
});
}
}
}//package
Section 35
//Levels (Levels)
package {
import flash.events.*;
import flash.display.*;
public dynamic class Levels extends MovieClip {
public var butLevelTutorial:SimpleButton;
public var butLevel1:SimpleButton;
public var butLevel3:SimpleButton;
public var butLevel5:SimpleButton;
public var butLevel2:SimpleButton;
public var butLevel4:SimpleButton;
public var butExit:SimpleButton;
public var level:uint;
public function Levels(){
addFrameScript(0, frame1);
}
function frame1(){
level = 1;
butExit.addEventListener(MouseEvent.CLICK, function (){
dispatchEvent(new Event("closeLevels"));
});
butLevelTutorial.addEventListener(MouseEvent.CLICK, function (){
dispatchEvent(new Event("showTutorial"));
});
butLevel1.addEventListener(MouseEvent.CLICK, function (){
level = 1;
dispatchEvent(new Event("startGame"));
});
butLevel2.addEventListener(MouseEvent.CLICK, function (){
level = 2;
dispatchEvent(new Event("startGame"));
});
butLevel3.addEventListener(MouseEvent.CLICK, function (){
level = 3;
dispatchEvent(new Event("startGame"));
});
butLevel4.addEventListener(MouseEvent.CLICK, function (){
level = 4;
dispatchEvent(new Event("startGame"));
});
butLevel5.addEventListener(MouseEvent.CLICK, function (){
level = 5;
dispatchEvent(new Event("startGame"));
});
}
public function getLevel():uint{
return (level);
}
}
}//package
Section 36
//Menu (Menu)
package {
import flash.events.*;
import flash.display.*;
import flash.media.*;
import flash.text.*;
import flash.system.*;
import flash.net.*;
import adobe.utils.*;
import flash.accessibility.*;
import flash.errors.*;
import flash.external.*;
import flash.filters.*;
import flash.geom.*;
import flash.printing.*;
import flash.ui.*;
import flash.utils.*;
import flash.xml.*;
public dynamic class Menu extends MovieClip {
public var buttonScores:SimpleButton;
public var butDifficulty:MovieClip;
public var butHelp:SimpleButton;
public var butPlay:SimpleButton;
public function Menu(){
addFrameScript(0, frame1);
}
function frame1(){
butPlay.addEventListener(MouseEvent.CLICK, function (){
dispatchEvent(new Event("showLevels"));
});
butHelp.addEventListener(MouseEvent.CLICK, function (){
dispatchEvent(new Event("showHelp"));
});
buttonScores.addEventListener(MouseEvent.CLICK, function (){
dispatchEvent(new Event("showScores"));
});
}
public function setDifficulty(_arg1:uint):void{
butDifficulty.updateDifficulty(_arg1);
}
public function getDifficulty():uint{
return (butDifficulty.getDifficulty());
}
public function getLevel():uint{
return (1);
}
}
}//package
Section 37
//MochiBot (MochiBot)
package {
import flash.display.*;
import flash.system.*;
import flash.net.*;
public dynamic class MochiBot extends Sprite {
public function MochiBot(){
super();
}
public static function track(parent:Sprite, tag:String):MochiBot{
if (Security.sandboxType == "localWithFile"){
return (null);
};
var self:MochiBot = new (MochiBot);
parent.addChild(self);
Security.allowDomain("*");
Security.allowInsecureDomain("*");
var server:String = "http://core.mochibot.com/my/core.swf";
var lv:URLVariables = new URLVariables();
lv["sb"] = Security.sandboxType;
lv["v"] = Capabilities.version;
lv["swfid"] = tag;
lv["mv"] = "8";
lv["fv"] = "9";
var url:String = self.root.loaderInfo.loaderURL;
if (url.indexOf("http") == 0){
lv["url"] = url;
} else {
lv["url"] = "local";
};
var req:URLRequest = new URLRequest(server);
req.contentType = "application/x-www-form-urlencoded";
req.method = URLRequestMethod.POST;
req.data = lv;
var loader:Loader = new Loader();
self.addChild(loader);
loader.load(req);
return (self);
}
}
}//package
Section 38
//Preloader (Preloader)
package {
import flash.events.*;
import flash.display.*;
import mochi.as3.*;
import flash.utils.*;
public dynamic class Preloader extends MovieClip {
private var did_load:Boolean;
public static var GAME_OPTIONS:Object = {id:"fdad2dc65376e9a2", res:"640x480", background:16769736, color:16301692, outline:15942661, no_bg:true};
public static var MAIN_CLASS:String = "CubeWars";
public function Preloader(){
super();
showMA();
}
private function showMA():void{
var k:String;
var f:Function = function (ev:IOErrorEvent):void{
};
loaderInfo.addEventListener(IOErrorEvent.IO_ERROR, f);
var opts:Object = {};
for (k in GAME_OPTIONS) {
opts[k] = GAME_OPTIONS[k];
};
opts.ad_started = function ():void{
did_load = true;
};
opts.ad_finished = function ():void{
gotoNextFrame();
};
opts.clip = this;
MochiAd.showPreGameAd(opts);
MochiServices.connect(GAME_OPTIONS.id, this);
}
private function gotoNextFrame(e:Event=null):void{
var mainClass:Class = Class(getDefinitionByName(MAIN_CLASS));
var app:Object = new (mainClass);
addChild((app as DisplayObject));
if (app.init){
app.init(true);
};
}
}
}//package
Section 39
//Progress (Progress)
package {
import flash.display.*;
public dynamic class Progress extends MovieClip {
public var progr:MovieClip;
public var _curFrame:uint;
public function Progress(){
addFrameScript(0, frame1);
}
function frame1(){
_curFrame = 1;
}
public function set frameNum(_arg1:uint):void{
if ((((_arg1 >= 0)) && ((_arg1 < 5)))){
_curFrame = (_arg1 + 1);
progr.gotoAndStop(_curFrame);
};
}
public function get frameNum():uint{
return (_curFrame);
}
}
}//package
Section 40
//Tutorial (Tutorial)
package {
import flash.events.*;
import flash.display.*;
public dynamic class Tutorial extends MovieClip {
public var butNext:SimpleButton;
public var butExit:SimpleButton;
public var butPrev:SimpleButton;
public function Tutorial(){
addFrameScript(0, frame1, 1, frame2, 2, frame3, 3, frame4, 4, frame5, 5, frame6, 6, frame7, 7, frame8);
}
function frame3(){
butPrev.addEventListener(MouseEvent.CLICK, function (){
gotoAndStop(2);
});
butNext.addEventListener(MouseEvent.CLICK, function (){
gotoAndStop(4);
});
butExit.addEventListener(MouseEvent.CLICK, function (){
dispatchEvent(new Event("closeTutorial"));
});
}
function frame6(){
butPrev.addEventListener(MouseEvent.CLICK, function (){
gotoAndStop(5);
});
butNext.addEventListener(MouseEvent.CLICK, function (){
gotoAndStop(7);
});
butExit.addEventListener(MouseEvent.CLICK, function (){
dispatchEvent(new Event("closeTutorial"));
});
}
function frame7(){
butPrev.addEventListener(MouseEvent.CLICK, function (){
gotoAndStop(6);
});
butNext.addEventListener(MouseEvent.CLICK, function (){
gotoAndStop(8);
});
butExit.addEventListener(MouseEvent.CLICK, function (){
dispatchEvent(new Event("closeTutorial"));
});
}
function frame1(){
gotoAndStop(1);
butNext.addEventListener(MouseEvent.CLICK, function (){
gotoAndStop(2);
});
butExit.addEventListener(MouseEvent.CLICK, function (){
dispatchEvent(new Event("closeTutorial"));
});
}
function frame4(){
butPrev.addEventListener(MouseEvent.CLICK, function (){
gotoAndStop(3);
});
butNext.addEventListener(MouseEvent.CLICK, function (){
gotoAndStop(5);
});
butExit.addEventListener(MouseEvent.CLICK, function (){
dispatchEvent(new Event("closeTutorial"));
});
}
function frame5(){
butPrev.addEventListener(MouseEvent.CLICK, function (){
gotoAndStop(4);
});
butNext.addEventListener(MouseEvent.CLICK, function (){
gotoAndStop(6);
});
butExit.addEventListener(MouseEvent.CLICK, function (){
dispatchEvent(new Event("closeTutorial"));
});
}
function frame8(){
butPrev.addEventListener(MouseEvent.CLICK, function (){
gotoAndStop(7);
});
butNext.addEventListener(MouseEvent.CLICK, function (){
dispatchEvent(new Event("closeTutorial"));
});
butExit.addEventListener(MouseEvent.CLICK, function (){
dispatchEvent(new Event("closeTutorial"));
});
}
function frame2(){
butPrev.addEventListener(MouseEvent.CLICK, function (){
gotoAndStop(1);
});
butNext.addEventListener(MouseEvent.CLICK, function (){
gotoAndStop(3);
});
butExit.addEventListener(MouseEvent.CLICK, function (){
dispatchEvent(new Event("closeTutorial"));
});
}
}
}//package