home *** CD-ROM | disk | FTP | other *** search
- package core
- {
- import core.events.CoreEvent;
- import core.objects.BaseObjectDef;
- import core.objects.BonusBall;
- import core.objects.BonusDef;
- import core.objects.Circle;
- import core.objects.CircleBig;
- import core.objects.CircleBigDef;
- import core.objects.CircleDef;
- import core.objects.Meteor;
- import core.objects.MeteorDef;
- import core.objects.Rect;
- import core.objects.RectDef;
- import core.objects.StarDef;
- import flash.events.EventDispatcher;
-
- public class Level extends EventDispatcher
- {
-
-
- private var engine:CoreEngine;
-
- public var num:uint;
-
- public var meteors:uint;
-
- public var endTime:int;
-
- private var defs:Array;
-
- private var badBonuses:Array;
-
- public var balls:uint;
-
- public var startTime:int;
-
- private var goodBonuses:Array;
-
- private var currentTime:int;
-
- public var rects:uint;
-
- private var boss:Boss;
-
- public function Level()
- {
- super();
- init();
- }
-
- private function updateHandler(e:CoreEvent) : void
- {
- currentTime = e.data as int;
- checkDefs();
- }
-
- public function createBonusBallDef(bonusName:String, time:int) : BonusDef
- {
- var r:Number = 30;
- var dx:Number = 100;
- var x:Number = 320 - dx + Math.random() * dx * 2;
- var bonusDef:BonusDef = new BonusDef(x,-r,currentTime + time,r,bonusName);
- defs.push(bonusDef);
- return bonusDef;
- }
-
- public function createBigCircleDef(time:int) : CircleBigDef
- {
- var r:Number = (40 + Math.random() * 30) / 2;
- var dx:Number = 200;
- var x:Number = 320 - dx + Math.random() * dx * 2;
- var circleBigDef:CircleBigDef = new CircleBigDef(x,-r,currentTime + time,r);
- defs.push(circleBigDef);
- return circleBigDef;
- }
-
- public function createMeteorDef(time:int) : void
- {
- var r:Number = 20;
- var dx:Number = 200;
- var x:Number = 320 - dx + Math.random() * dx * 2;
- var norm:Number = (x - 100) / 400;
- var impulseX:Number = 50 * (Math.random() - norm);
- var meteorDef:MeteorDef = new MeteorDef(x,-r,currentTime + time,r,impulseX,60);
- defs.push(meteorDef);
- }
-
- private function getGoodBonusName() : String
- {
- var index:uint = Math.floor(Math.random() * goodBonuses.length);
- var bonusName:String = String(goodBonuses[index]);
- goodBonuses.splice(index,1);
- if(goodBonuses.length == 0)
- {
- initGoodBonuses();
- }
- return bonusName;
- }
-
- public function createRectDef(time:int) : RectDef
- {
- var width:Number = 20 + Math.random() * 50;
- var height:Number = 20 + Math.random() * 50;
- var rotation:Number = Math.round(Math.random() * 180);
- var dx:Number = 200;
- var x:Number = 320 - dx + Math.random() * dx * 2;
- var y:Number = -Math.sqrt(width * width + height * height);
- var rectDef:RectDef = new RectDef(x,y,currentTime + time,width,height,rotation);
- defs.push(rectDef);
- return rectDef;
- }
-
- private function initGoodBonuses() : void
- {
- goodBonuses = [BonusBall.POWERUP,BonusBall.PUSH_FIELD,BonusBall.ATTACH,BonusBall.ELASTIC];
- }
-
- private function init() : void
- {
- engine = CoreEngine.getInstance();
- engine.dispatcher.addEventListener(CoreEvent.UPDATE,updateHandler);
- num = 0;
- endTime = 0;
- defs = [];
- balls = 5;
- rects = 0;
- meteors = 0;
- initGoodBonuses();
- initBadBonuses();
- boss = new Boss(this);
- }
-
- private function checkDefs() : void
- {
- var def:BaseObjectDef = null;
- var createDef:BaseObjectDef = null;
- var circle:Circle = null;
- var rect:Rect = null;
- var meteor:Meteor = null;
- var circleBig:CircleBig = null;
- var defsToCreate:Array = [];
- for(var i:uint = 0; i < defs.length; i++)
- {
- def = defs[i];
- if(currentTime >= def.bornTime)
- {
- defsToCreate.push(def);
- }
- }
- while(defsToCreate.length > 0)
- {
- createDef = defsToCreate[0];
- if(createDef is BonusDef)
- {
- engine.bonusesManager.createBonusBall(createDef as BonusDef);
- }
- else if(createDef is CircleDef)
- {
- circle = new Circle(createDef as CircleDef);
- }
- else if(createDef is RectDef)
- {
- rect = new Rect(createDef as RectDef);
- }
- else if(createDef is MeteorDef)
- {
- meteor = new Meteor(createDef as MeteorDef);
- }
- else if(createDef is CircleBigDef)
- {
- circleBig = new CircleBig(createDef as CircleBigDef);
- }
- else if(createDef is StarDef)
- {
- engine.bonusesManager.createStar(createDef as StarDef);
- }
- defs.splice(defs.indexOf(createDef),1);
- defsToCreate.splice(0,1);
- }
- }
-
- public function createStarDef(time:int) : StarDef
- {
- var dx:Number = 200;
- var x:Number = 320 - dx + Math.random() * dx * 2;
- var minY:Number = 50;
- var maxY:Number = 300;
- var y:Number = minY + Math.random() * (maxY - minY);
- var r:Number = Math.round((2 - y / maxY) * 20);
- var starDef:StarDef = new StarDef(x,y,currentTime + time,r);
- defs.push(starDef);
- return starDef;
- }
-
- private function initBadBonuses() : void
- {
- badBonuses = [BonusBall.FREEZE,BonusBall.INVERSE];
- }
-
- public function createCircleDef(time:int) : CircleDef
- {
- var r:Number = (40 + Math.random() * 30) / 2;
- var dx:Number = 200;
- var x:Number = 320 - dx + Math.random() * dx * 2;
- var circleDef:CircleDef = new CircleDef(x,-r,currentTime + time,r);
- defs.push(circleDef);
- return circleDef;
- }
-
- public function next() : void
- {
- var i:uint = 0;
- var rand:uint = 0;
- var dt:Number = NaN;
- var goodBonusesNum:uint = 0;
- var badBonusesNum:uint = 0;
- startTime = currentTime;
- var levelTime:int = 40 * 12;
- if(num < 3)
- {
- rand = 0;
- }
- else
- {
- rand = Math.floor(Math.random() * 3);
- }
- switch(rand)
- {
- case 0:
- ++balls;
- break;
- case 1:
- ++rects;
- break;
- case 2:
- ++meteors;
- }
- dt = levelTime / (balls + 1);
- for(i = 1; i <= balls; i++)
- {
- createCircleDef(i * dt);
- }
- dt = levelTime / (rects + 1);
- for(i = 1; i <= rects; i++)
- {
- createRectDef(i * dt);
- }
- dt = levelTime / (meteors + 1);
- for(i = 1; i <= meteors; i++)
- {
- createMeteorDef(i * dt);
- }
- if(num < 2)
- {
- goodBonusesNum = 1;
- }
- else
- {
- goodBonusesNum = 2;
- }
- for(i = 1; i <= goodBonusesNum; i++)
- {
- dt = Math.random() * levelTime;
- createBonusBallDef(getGoodBonusName(),i * dt);
- }
- if(num < 2)
- {
- badBonusesNum = 0;
- }
- else
- {
- badBonusesNum = 1;
- }
- for(i = 1; i <= badBonusesNum; i++)
- {
- dt = Math.random() * levelTime;
- createBonusBallDef(getBadBonusName(),dt);
- }
- var stars:int = 10 - engine.bonusesManager.starsNum;
- if(stars > 0)
- {
- for(i = 0; i < stars; i++)
- {
- dt = Math.random() * levelTime;
- createStarDef(dt);
- }
- }
- var bossTime:int = 0;
- if(num > 0 && (num + 1) % 3 == 0)
- {
- bossTime = boss.setBoss(levelTime);
- }
- endTime = currentTime + levelTime + bossTime;
- ++num;
- }
-
- private function getBadBonusName() : String
- {
- var index:uint = Math.floor(Math.random() * badBonuses.length);
- var bonusName:String = String(badBonuses[index]);
- badBonuses.splice(index,1);
- if(badBonuses.length == 0)
- {
- initBadBonuses();
- }
- return bonusName;
- }
- }
- }
-
- import core.Level;
- import core.objects.BonusBall;
- import core.objects.BonusDef;
- import core.objects.CircleBigDef;
- import core.objects.CircleDef;
- import core.objects.RectDef;
-
- class Boss
- {
-
- private static var CIRCLE_BIG:String = "CircleBig";
-
- private static var FILL_RECTS:String = "FillRects";
-
- private static var FILL_CIRCLES:String = "FillCircles";
-
- private static var FILL_FREEZE:String = "FillFreeze";
-
-
- private var level:Level;
-
- private var bossLevel:uint;
-
- private var types:Array;
-
- private var bossTime:int;
-
- private var counter:uint;
-
- public function Boss(level:Level)
- {
- super();
- this.level = level;
- init();
- }
-
- private function fillCircles(startTime:int) : void
- {
- var circles:uint = 0;
- var i:uint = 0;
- var dt:Number = NaN;
- var def:CircleDef = null;
- bossTime = 40 * 4;
- switch(bossLevel)
- {
- case 0:
- circles = 7;
- break;
- case 1:
- circles = 12;
- break;
- case 2:
- circles = 17;
- }
- dt = bossTime / (circles + 1);
- var baseX:Number = Math.random() < 0.5 ? 320 + 190 : 320 - 190;
- for(i = 1; i <= circles; i++)
- {
- def = level.createCircleDef(startTime + i * dt);
- def.x = baseX - 30 + Math.random() * 60;
- }
- }
-
- private function fillFreeze(startTime:int) : void
- {
- var freezes:uint = 0;
- var i:uint = 0;
- var dt:Number = NaN;
- var def:BonusDef = null;
- bossTime = 40 * 2;
- switch(bossLevel)
- {
- case 0:
- freezes = 3;
- break;
- case 1:
- freezes = 4;
- break;
- case 2:
- freezes = 5;
- }
- dt = bossTime / (freezes + 1);
- var dx:Number = 380 / (freezes + 1);
- for(i = 1; i <= freezes; i++)
- {
- def = level.createBonusBallDef(BonusBall.FREEZE,startTime + i * dt);
- def.x = 130 + i * dx;
- }
- }
-
- private function initTypes() : void
- {
- types = [FILL_CIRCLES,FILL_RECTS,CIRCLE_BIG,FILL_FREEZE];
- }
-
- private function fillRects(startTime:int) : void
- {
- var rects:uint = 0;
- var i:uint = 0;
- var dt:Number = NaN;
- var def:RectDef = null;
- bossTime = 40 * 4;
- switch(bossLevel)
- {
- case 0:
- rects = 7;
- break;
- case 1:
- rects = 12;
- break;
- case 2:
- rects = 17;
- }
- dt = bossTime / (rects + 1);
- var baseX:Number = Math.random() < 0.5 ? 320 + 190 : 320 - 190;
- for(i = 1; i <= rects; i++)
- {
- def = level.createRectDef(startTime + i * dt);
- def.x = baseX - 30 + Math.random() * 60;
- }
- }
-
- public function setBoss(startTime:int) : int
- {
- var type:String = String(getType());
- switch(type)
- {
- case FILL_CIRCLES:
- fillCircles(startTime);
- break;
- case FILL_RECTS:
- fillRects(startTime);
- break;
- case CIRCLE_BIG:
- circleBig(startTime);
- break;
- case FILL_FREEZE:
- fillFreeze(startTime);
- }
- ++counter;
- if(counter == 4)
- {
- ++bossLevel;
- counter = 0;
- }
- return bossTime;
- }
-
- private function init() : void
- {
- bossTime = 0;
- initTypes();
- counter = 0;
- }
-
- private function getType() : String
- {
- var index:uint = Math.floor(Math.random() * types.length);
- var type:String = String(types[index]);
- types.splice(index,1);
- if(types.length == 0)
- {
- initTypes();
- }
- return type;
- }
-
- private function circleBig(startTime:int) : void
- {
- bossTime = 40 * 3;
- var dt:Number = bossTime / 2;
- var baseX:Number = Math.random() < 0.5 ? 320 + 190 : 320 - 190;
- var def:CircleBigDef = level.createBigCircleDef(startTime + dt);
- def.x = baseX - 30 + Math.random() * 60;
- switch(bossLevel)
- {
- case 0:
- def.r = 60;
- break;
- case 1:
- def.r = 90;
- break;
- case 2:
- def.r = 120;
- }
- def.r = 50;
- def.y = -def.r;
- }
- }
-