Section 1
//Level_17 (assets_fla.Level_17)
package assets_fla {
import flash.display.*;
import flash.text.*;
public dynamic class Level_17 extends MovieClip {
public var id_text:TextField;
}
}//package assets_fla
Section 2
//Score_16 (assets_fla.Score_16)
package assets_fla {
import flash.display.*;
import flash.text.*;
public dynamic class Score_16 extends MovieClip {
public var id_text:TextField;
}
}//package assets_fla
Section 3
//DollManager (doll.DollManager)
package doll {
import flash.events.*;
import flash.display.*;
import flash.net.*;
public class DollManager extends EventDispatcher {
private var m_urlRequests:Array;
private var m_curDollLoader:Loader;
private var m_loaders:Array;
private var m_dollArray:Array;
public function DollManager(){
m_dollArray = [];
m_urlRequests = [];
m_loaders = [];
super();
}
public function load(xml:XML):void{
var elem:XML;
var url:String;
var dollelem:XML;
var id:String;
var symbol:String;
for each (elem in xml.url_resource) {
url = elem.@path;
m_urlRequests.push(new URLRequest(url));
for each (dollelem in elem.doll_symbol) {
id = dollelem.@id;
symbol = dollelem.@symbol;
m_dollArray.push({id:id, url:url, symbol:symbol, loader:null});
};
};
loadURLResource();
}
private function onComplete(event:Event):void{
var contentLoaderInfo:LoaderInfo = (event.target as LoaderInfo);
contentLoaderInfo.removeEventListener(Event.COMPLETE, onComplete);
loadURLResource();
}
public function getlistOfDollNames():Array{
var obj:Object;
var arr:Array = [];
for each (obj in m_dollArray) {
arr.push(obj.id);
};
return (arr);
}
private function loadURLResource():void{
var loader:Loader;
if (m_urlRequests.length > 0){
loader = new Loader();
m_loaders.push(loader);
m_dollArray[(m_dollArray.length - 1)]["loader"] = loader;
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
loader.load(m_urlRequests.shift());
} else {
dispatchEvent(new Event(Event.COMPLETE, false));
};
}
public function buildDoll(_name:String):MovieClip{
var myClass:Class;
var doll_object:Object;
var loader:Loader;
for each (doll_object in m_dollArray) {
if (doll_object.id == _name){
m_curDollLoader = doll_object.loader;
loader = doll_object.loader;
trace(loader.contentLoaderInfo.sameDomain);
myClass = (loader.contentLoaderInfo.applicationDomain.getDefinition(doll_object.symbol) as Class);
return (new (myClass));
};
};
return (null);
}
public function getAsset(_assetId:String):Class{
var myClass:Class;
if (m_curDollLoader){
myClass = (m_curDollLoader.contentLoaderInfo.applicationDomain.getDefinition(_assetId) as Class);
};
return (myClass);
}
public function unLoad():void{
var loader:Loader;
if (m_curDollLoader){
m_curDollLoader = null;
};
for each (loader in m_loaders) {
if (loader.contentLoaderInfo != null){
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
};
loader.unload();
};
m_dollArray = null;
m_urlRequests = null;
m_loaders = null;
}
}
}//package doll
Section 4
//DollPanel (doll.DollPanel)
package doll {
import flash.events.*;
import tetris_game.*;
import flash.display.*;
import flash.geom.*;
public class DollPanel extends Sprite implements IObserver {
private var m_panelMC:MovieClip;
private var m_dollMC:MovieClip;
private var m_curStage:int;
private var m_numStages:int;
public function DollPanel(){
super();
trace("dollPallel::constructor");
}
public function update(flags:uint):void{
if (m_dollMC == null){
return;
};
if ((Tetris.TYPE_LEVEL & flags) != 0){
if (m_curStage < (m_numStages - 1)){
dispatchEvent(new Event("reward", true));
m_dollMC.play();
m_curStage++;
} else {
m_dollMC.gotoAndPlay(("stage" + m_numStages));
dispatchEvent(new Event("gameVictory", true));
};
} else {
if ((Tetris.TYPE_GAMEOVER & flags) != 0){
m_dollMC.gotoAndStop(1);
m_curStage = 0;
dispatchEvent(new Event("gameOver", true));
};
};
}
private function centerDisplayObject(_sprite:DisplayObject, _target:DisplayObject):void{
var targetRect:Rectangle = _target.getRect(_target);
var spriteRect:Rectangle = _sprite.getRect(_target);
_sprite.x = ((_sprite.x - spriteRect.left) + (targetRect.left + ((targetRect.width - spriteRect.width) / 2)));
_sprite.y = ((_sprite.y - spriteRect.top) + (targetRect.top + ((targetRect.height - spriteRect.height) / 2)));
}
private function onAnimationEnd(event:Event):void{
event.stopImmediatePropagation();
m_dollMC.removeEventListener("animationEnd", onAnimationEnd);
dispatchEvent(new Event("nextDoll", true));
}
public function init(_dollMC:MovieClip, _panelMC:MovieClip):void{
var fl:FrameLabel;
trace("dollPallel::init");
if (((((!((m_dollMC == null))) && (!((m_dollMC == _dollMC))))) && (!((m_dollMC.parent == null))))){
m_dollMC.parent.removeChild(m_dollMC);
m_dollMC.removeEventListener("animationEnd", onAnimationEnd);
m_dollMC = null;
};
m_dollMC = _dollMC;
m_dollMC.gotoAndStop(1);
m_curStage = 0;
m_numStages = 0;
var labels:Array = m_dollMC.currentLabels;
for each (fl in labels) {
if (fl.name.search("stage") != -1){
m_numStages = (m_numStages + 1);
};
};
m_panelMC = _panelMC;
m_dollMC.addEventListener("animationEnd", onAnimationEnd, false, 0, true);
trace(m_dollMC.name, m_panelMC.name);
m_panelMC.parent.addChild(this);
m_panelMC.parent.addChild(m_dollMC);
centerDisplayObject(m_dollMC, m_panelMC);
}
}
}//package doll
Section 5
//CSliderControl (options.CSliderControl)
package options {
import flash.events.*;
import flash.display.*;
import flash.geom.*;
public class CSliderControl {
private var m_position:Number;
private var m_rect:Rectangle;
private var m_drag:Boolean;
private var m_sym:MovieClip;
private var m_callback:Function;
private var m_positionToValue:Number;
private var m_postionToFrame:Number;
private var m_value:Number;
private static const EPSILON:Number = 0.05;
public function CSliderControl(_symbol:MovieClip, _value:Number, _callback:Function){
super();
m_sym = _symbol;
m_callback = _callback;
m_postionToFrame = (Number(m_sym.totalFrames) / m_sym.width);
m_positionToValue = (1 / m_sym.width);
setValue(_value);
m_sym.parent.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown, false, 0, true);
m_sym.parent.addEventListener(MouseEvent.MOUSE_UP, onMouseUp, false, 0, true);
}
private function onMouseDown(event:MouseEvent):void{
if (isHit(event.stageX, event.stageY)){
m_drag = true;
m_position = (event.stageX - m_rect.left);
setFrame(m_position);
m_sym.parent.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove, false, 0, true);
};
}
private function onMouseUp(event:MouseEvent):void{
if (m_drag){
m_drag = false;
m_value = (Math.floor(((m_position * m_postionToFrame) + 0.5)) / m_sym.totalFrames);
if (m_value < EPSILON){
m_value = 0;
} else {
if (m_value >= (1 - EPSILON)){
m_value = 1;
};
};
m_sym.parent.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
m_callback(m_value);
};
}
public function getValue():Number{
return (m_value);
}
private function isHit(mouseX:Number, mouseY:Number):Boolean{
if (m_sym.stage != null){
m_rect = m_sym.getRect(m_sym.stage);
if ((((((((mouseX >= m_rect.left)) && ((mouseX <= m_rect.right)))) && ((mouseY >= m_rect.top)))) && ((mouseY <= m_rect.bottom)))){
return (true);
};
};
return (false);
}
private function setFrame(pos:Number):void{
m_sym.gotoAndStop((int((pos * m_postionToFrame)) + 1));
}
public function setValue(_value:Number):void{
if ((((_value > 0)) && ((_value < 1)))){
m_value = _value;
m_sym.gotoAndStop((int((_value * m_sym.totalFrames)) + 1));
};
}
private function onMouseMove(event:MouseEvent):void{
if (((m_drag) && (isHit(event.stageX, event.stageY)))){
m_position = (event.stageX - m_rect.left);
setFrame(m_position);
};
}
}
}//package options
Section 6
//ASoundComponent (sounds.ASoundComponent)
package sounds {
import flash.media.*;
import flash.errors.*;
public class ASoundComponent {
protected var m_nameID:String;
protected var m_sndTransform:SoundTransform;
protected var m_parent:ASoundComposite;
public function ASoundComponent(_name:String, _sndTrans:SoundTransform){
super();
m_nameID = _name;
m_sndTransform = _sndTrans;
}
function getComposite():ASoundComposite{
return (null);
}
public function set pan(_pan:Number):void{
m_sndTransform.pan = _pan;
update();
}
public function stop():void{
throw (new IllegalOperationError("play not supported"));
}
protected function calcSndTransform(_sndTrans:SoundTransform=null):SoundTransform{
if (_sndTrans == null){
_sndTrans = new SoundTransform();
};
if (m_parent != null){
_sndTrans = m_parent.calcSndTransform(_sndTrans);
};
_sndTrans.volume = (_sndTrans.volume * m_sndTransform.volume);
_sndTrans.pan = (_sndTrans.pan + m_sndTransform.pan);
if (_sndTrans.pan < -1){
_sndTrans.pan = -1;
};
if (_sndTrans.pan > 1){
_sndTrans.pan = 1;
};
return (_sndTrans);
}
public function update():void{
throw (new IllegalOperationError("update not supported"));
}
public function get parent():ASoundComposite{
return (m_parent);
}
public function get name():String{
return (m_nameID);
}
function removeParentRef():void{
this.m_parent = null;
stop();
}
function setParentRef(_parent:ASoundComposite):void{
this.m_parent = _parent;
update();
}
public function set volume(_vol:Number):void{
m_sndTransform.volume = _vol;
update();
}
public function get volume():Number{
return (m_sndTransform.volume);
}
public function play(_name:String=""):ASoundComponent{
throw (new IllegalOperationError("play not supported"));
}
public function get pan():Number{
return (m_sndTransform.pan);
}
public function setSoundTransform(_vol:Number, _pan:Number):void{
m_sndTransform.volume = _vol;
m_sndTransform.pan = _pan;
update();
}
}
}//package sounds
Section 7
//ASoundComposite (sounds.ASoundComposite)
package sounds {
import flash.media.*;
import flash.errors.*;
public class ASoundComposite extends ASoundComponent {
public function ASoundComposite(_name:String, _sndTrans:SoundTransform){
super(_name, _sndTrans);
}
public function removeChild(c:ASoundComponent):ASoundComponent{
throw (new IllegalOperationError("removeChild not supported"));
}
public function addChild(c:ASoundComponent):ASoundComponent{
throw (new IllegalOperationError("addChild not supported"));
}
public function getChildByName(c:String):ASoundComponent{
throw (new IllegalOperationError("removeChild not supported"));
}
}
}//package sounds
Section 8
//SoundAmbCollection (sounds.SoundAmbCollection)
package sounds {
import flash.media.*;
public class SoundAmbCollection extends SoundCollection {
public function SoundAmbCollection(_name:String, _sndTransform:SoundTransform=null){
super(_name, _sndTransform);
}
override public function play(_name:String=""):ASoundComponent{
var _sound:ASoundComponent;
for each (_sound in m_sounds) {
_sound.play("");
};
return (this);
}
}
}//package sounds
Section 9
//SoundAmbient (sounds.SoundAmbient)
package sounds {
import flash.events.*;
import flash.media.*;
import flash.utils.*;
public class SoundAmbient extends SoundFx {
protected var m_delay:int;
protected var m_timer:Timer;
protected var m_playing:Boolean;
public function SoundAmbient(_name:String, _delay:int, _sound:Sound, _sndTransform:SoundTransform=null){
super(_name, _sound, _sndTransform);
m_delay = _delay;
}
override public function play(_name:String=""):ASoundComponent{
if (m_playing){
return (null);
};
m_playing = true;
if (m_delay == 0){
m_soundChannel = m_sound.play(0, int.MAX_VALUE, calcSndTransform());
if (m_soundChannel != null){
m_soundChannel.addEventListener(Event.SOUND_COMPLETE, onSoundComplete);
};
return (this);
//unresolved jump
};
m_timer = new Timer(m_delay);
m_timer.addEventListener(TimerEvent.TIMER, onTimedPlay);
m_timer.start();
return (this);
}
private function onSoundComplete(e:Event):void{
m_soundChannel.removeEventListener(Event.SOUND_COMPLETE, onSoundComplete);
m_soundChannel = null;
if (m_delay){
m_timer.start();
};
}
private function onTimedPlay(e:Event):void{
if (m_soundChannel != null){
return;
};
m_timer.stop();
m_soundChannel = m_sound.play(0, 1, calcSndTransform());
if (m_soundChannel != null){
m_soundChannel.addEventListener(Event.SOUND_COMPLETE, onSoundComplete);
};
}
override public function stop():void{
if (m_soundChannel != null){
m_soundChannel.stop();
};
if (m_timer != null){
m_timer.stop();
m_timer.removeEventListener(TimerEvent.TIMER, onTimedPlay);
};
m_playing = false;
}
}
}//package sounds
Section 10
//SoundCollection (sounds.SoundCollection)
package sounds {
import flash.media.*;
import flash.utils.*;
import flash.errors.*;
public class SoundCollection extends ASoundComposite {
public var m_sounds:Dictionary;
protected var m_numSounds:int;
protected static const m_nullSound:ASoundComponent = new SoundNull();
public function SoundCollection(_nameID:String, _sndTransform:SoundTransform=null){
if (_sndTransform == null){
_sndTransform = new SoundTransform();
};
super(_nameID, _sndTransform);
m_sounds = new Dictionary();
}
override function getComposite():ASoundComposite{
return (this);
}
override public function stop():void{
var snd:ASoundComponent;
for each (snd in m_sounds) {
snd.stop();
};
}
override public function getChildByName(_name:String):ASoundComponent{
var arr:Array = _name.split(":", 2);
if ((((arr.length > 1)) && ((m_sounds[arr[0]] is ASoundComposite)))){
return ((m_sounds[arr[0]] as ASoundComposite).getChildByName(arr[1]));
};
if (m_sounds[_name]){
return (m_sounds[_name]);
};
return (m_nullSound);
}
override public function update():void{
var _sound:ASoundComponent;
for each (_sound in m_sounds) {
_sound.update();
};
}
public function clear():void{
var sound:ASoundComponent;
for each (sound in m_sounds) {
removeChild(sound);
};
}
private function safeRemove(c:ASoundComponent):void{
if (c.getComposite() == this){
removeChild(c);
} else {
c.removeParentRef();
m_sounds[c.name] = null;
delete m_sounds[c.name];
};
}
override public function play(_name:String=""):ASoundComponent{
var arr:Array = _name.split(":", 2);
if ((((arr.length > 1)) && ((m_sounds[arr[0]] is ASoundComposite)))){
return ((m_sounds[arr[0]] as ASoundComponent).play(arr[1]));
};
if ((((arr.length > 0)) && (!((m_sounds[arr[0]] == null))))){
return (m_sounds[arr[0]].play());
};
return (m_nullSound);
}
override public function addChild(c:ASoundComponent):ASoundComponent{
m_sounds[c.name] = c;
c.setParentRef(this);
m_numSounds++;
return (c);
}
override public function removeChild(c:ASoundComponent):ASoundComponent{
var child:ASoundComponent;
if (c == this){
for each (child in m_sounds) {
safeRemove(child);
};
m_sounds = new Dictionary();
removeParentRef();
} else {
if (m_sounds[c.name] != null){
safeRemove(c);
m_numSounds--;
} else {
throw (new IllegalOperationError("NO_CASE"));
};
};
return (c);
}
}
}//package sounds
Section 11
//SoundFx (sounds.SoundFx)
package sounds {
import flash.events.*;
import flash.media.*;
public class SoundFx extends ASoundComponent {
protected var m_soundChannel:SoundChannel;
protected var m_sound:Sound;
public function SoundFx(_name:String, _sound:Sound, _sndTransform:SoundTransform=null){
if (_sndTransform == null){
_sndTransform = new SoundTransform();
};
super(_name, _sndTransform);
m_sound = _sound;
}
private function onSoundComplete(e:Event):void{
stop();
}
override public function stop():void{
if (m_soundChannel != null){
m_soundChannel.removeEventListener(Event.SOUND_COMPLETE, onSoundComplete);
m_soundChannel.stop();
m_soundChannel = null;
};
}
override public function play(_name:String=""):ASoundComponent{
if (m_soundChannel != null){
return (this);
};
m_soundChannel = m_sound.play(0, 1, calcSndTransform());
if (m_soundChannel != null){
m_soundChannel.addEventListener(Event.SOUND_COMPLETE, onSoundComplete);
};
return (this);
}
override public function update():void{
if (m_soundChannel != null){
m_soundChannel.soundTransform = calcSndTransform();
};
}
}
}//package sounds
Section 12
//SoundNull (sounds.SoundNull)
package sounds {
import flash.media.*;
public class SoundNull extends ASoundComponent {
public function SoundNull(... _args){
super("", null);
}
override public function update():void{
}
override function getComposite():ASoundComposite{
return (super.getComposite());
}
override public function stop():void{
}
override public function set volume(value:Number):void{
}
override protected function calcSndTransform(_sndTrans:SoundTransform=null):SoundTransform{
return (_sndTrans);
}
override public function get volume():Number{
return (0);
}
override public function set pan(value:Number):void{
}
override public function get name():String{
return (super.name);
}
override public function play(_name:String=""):ASoundComponent{
return (this);
}
override public function get pan():Number{
return (0);
}
}
}//package sounds
Section 13
//SoundRndCollection (sounds.SoundRndCollection)
package sounds {
import flash.events.*;
import flash.media.*;
import flash.utils.*;
public class SoundRndCollection extends SoundCollection {
protected var m_delay:int;
protected var m_timer:Timer;
protected var m_sndList:Array;
protected var m_playing:Boolean;
public function SoundRndCollection(_nameID:String, _delay:int, _sndTransform:SoundTransform=null){
super(_nameID, _sndTransform);
m_delay = _delay;
m_sndList = new Array();
}
override public function stop():void{
super.stop();
if (m_timer != null){
m_timer.stop();
m_timer.removeEventListener(TimerEvent.TIMER, onTimedPlay);
};
m_playing = false;
}
private function onTimedPlay(e:Event):void{
var rnd:int = (Math.random() * m_numSounds);
(m_sndList[rnd] as ASoundComponent).play("");
}
override public function play(_name:String=""):ASoundComponent{
var rnd:int;
if (((m_playing) || ((m_numSounds == 0)))){
return (null);
};
m_playing = true;
if (m_delay == 0){
rnd = (Math.random() * m_numSounds);
(m_sndList[rnd] as ASoundComponent).play();
return (this);
};
m_timer = new Timer(m_delay);
m_timer.addEventListener(TimerEvent.TIMER, onTimedPlay, false, 0, true);
m_timer.start();
return (this);
}
override public function addChild(c:ASoundComponent):ASoundComponent{
m_sndList.push(c);
return (super.addChild(c));
}
}
}//package sounds
Section 14
//CGalleryState (state.CGalleryState)
package state {
import flash.events.*;
public class CGalleryState implements IState {
private var m_app:Main;
public function CGalleryState(_app:Main){
super();
m_app = _app;
}
public function OnMouseClick(event:MouseEvent):void{
var num_str:String;
var num:int;
var btn:String = event.target.name;
switch (btn){
case "btn_exit":
m_app.enterLobby();
break;
case "btn_next":
m_app.galleryNextImage();
break;
case "btn_prev":
m_app.galleryPrevImage();
break;
case "btn_back":
m_app.galleryBack();
break;
default:
if (btn.search(/image/) != -1){
num_str = btn.match(/\d+\.?\d*/)[0];
trace(num_str);
num = (int(num_str) - 1);
m_app.gallerySelectDoll(num);
};
break;
};
}
public function OnMouseUp(event:MouseEvent):void{
}
public function OnKeyDown(event:KeyboardEvent):void{
}
public function OnMouseDown(event:MouseEvent):void{
}
}
}//package state
Section 15
//CGameOverState (state.CGameOverState)
package state {
import flash.events.*;
public class CGameOverState implements IState {
private var m_app:Main;
public function CGameOverState(_app:Main){
super();
m_app = _app;
}
public function OnMouseClick(event:MouseEvent):void{
m_app.enterLobby();
}
public function OnMouseUp(event:MouseEvent):void{
}
public function OnKeyDown(event:KeyboardEvent):void{
m_app.enterLobby();
}
public function OnMouseDown(event:MouseEvent):void{
}
}
}//package state
Section 16
//CGameState (state.CGameState)
package state {
import flash.events.*;
import flash.ui.*;
public class CGameState implements IState {
private var m_app:Main;
public function CGameState(_app:Main){
super();
m_app = _app;
}
public function OnMouseClick(event:MouseEvent):void{
}
public function OnMouseUp(event:MouseEvent):void{
}
public function OnKeyDown(event:KeyboardEvent):void{
var keyCode:uint = event.keyCode;
switch (keyCode){
case Keyboard.ESCAPE:
m_app.tetris.endGame();
m_app.enterLobby();
break;
case Keyboard.LEFT:
m_app.tetris.moveBlockLeft();
break;
case Keyboard.RIGHT:
m_app.tetris.moveBlockRight();
break;
case Keyboard.UP:
m_app.tetris.rotateBlock();
break;
case Keyboard.DOWN:
m_app.tetris.moveBlockDown();
break;
case Keyboard.SPACE:
m_app.tetris.newGame();
break;
};
}
public function OnMouseDown(event:MouseEvent):void{
}
}
}//package state
Section 17
//CHelpState (state.CHelpState)
package state {
import flash.events.*;
public class CHelpState implements IState {
private var m_app:Main;
public function CHelpState(_app:Main){
super();
m_app = _app;
}
public function OnMouseClick(event:MouseEvent):void{
if (event.target.name == "btn_exit"){
m_app.enterLobby();
};
}
public function OnMouseUp(event:MouseEvent):void{
}
public function OnKeyDown(event:KeyboardEvent):void{
}
public function OnMouseDown(event:MouseEvent):void{
}
}
}//package state
Section 18
//CIntroState (state.CIntroState)
package state {
import flash.events.*;
public class CIntroState implements IState {
private var m_app:Main;
public function CIntroState(_app:Main){
super();
m_app = _app;
}
public function OnMouseClick(event:MouseEvent):void{
if (m_app.flagSkippable){
m_app.enterLobby();
};
}
public function OnMouseUp(event:MouseEvent):void{
}
public function OnKeyDown(event:KeyboardEvent):void{
if (m_app.flagSkippable){
m_app.enterLobby();
};
}
public function OnMouseDown(event:MouseEvent):void{
}
}
}//package state
Section 19
//CLobbyState (state.CLobbyState)
package state {
import flash.events.*;
public class CLobbyState implements IState {
private var m_app:Main;
public function CLobbyState(_app:Main){
super();
m_app = _app;
}
public function OnMouseClick(event:MouseEvent):void{
if (event.target.name == "btn_new"){
m_app.playGame();
} else {
if (event.target.name == "btn_options"){
m_app.enterOptions();
} else {
if (event.target.name == "btn_help"){
m_app.enterHelp();
} else {
if (event.target.name == "btn_gallery"){
m_app.enterGallery();
};
};
};
};
}
public function OnMouseUp(event:MouseEvent):void{
}
public function OnKeyDown(event:KeyboardEvent):void{
}
public function OnMouseDown(event:MouseEvent):void{
}
}
}//package state
Section 20
//COptionsState (state.COptionsState)
package state {
import flash.events.*;
public class COptionsState implements IState {
private var m_app:Main;
public function COptionsState(_app:Main){
super();
m_app = _app;
}
public function OnMouseClick(event:MouseEvent):void{
if (event.target.name == "btn_exit"){
m_app.enterLobby();
};
}
public function OnMouseUp(event:MouseEvent):void{
}
public function OnKeyDown(event:KeyboardEvent):void{
}
public function OnMouseDown(event:MouseEvent):void{
}
}
}//package state
Section 21
//Tetris (tetris_game.Tetris)
package tetris_game {
import flash.events.*;
import flash.utils.*;
public class Tetris implements ISubject {
private var m_nextBlock:int;
private var m_observers:Array;
private var m_board:Array;
private var m_level:int;
private var m_state:uint;// = 1
private var m_score:int;
private var m_block:Array;
private var m_deletedRows:Array;
private var m_difficulty:int;
private var m_curBlock:int;
private var m_dels:int;
private var m_time:Timer;
private var m_difficultyTiming:Array;
private var m_blockX:int;
private var m_blockY:int;
public static const TYPE_BOARD:uint = 1;
private static const BOARD_HEIGHT:int = 20;
public static const STATE_PAUSE:uint = 4;
public static const STATE_PLAY:uint = 2;
private static const BLOCK_SHAPES:Array = [[0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], [0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], [2, 2, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 2, 0, 0, 2, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0], [2, 2, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 2, 0, 0, 2, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0], [3, 3, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [3, 3, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [3, 3, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [3, 3, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 4, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0], [4, 0, 0, 0, 4, 4, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0], [4, 4, 4, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 4, 0, 0, 4, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0], [0, 0, 5, 0, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0], [5, 0, 0, 0, 5, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0], [5, 5, 5, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [5, 5, 0, 0, 0, 5, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0], [6, 0, 0, 0, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0], [6, 6, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0], [6, 6, 6, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 6, 0, 0, 0, 6, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0], [7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0], [7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0]];
private static const BLOCK_WIDTH:int = 4;
public static const TYPE_NEXTBLOCK:uint = 16;
public static const TYPE_LEVEL:uint = 8;
public static const TYPE_ROWDELETE:uint = 2;
public static const STATE_IDLE:uint = 1;
public static const TYPE_GAMEOVER:uint = 32;
public static const TYPE_SCORE:uint = 4;
private static const BOARD_WIDTH:int = 10;
private static const BLOCK_HEIGHT:int = 4;
public function Tetris(){
m_difficultyTiming = [750, 500, 250, 125];
super();
}
public function get level():int{
return (m_level);
}
private function GameOver():void{
var indx:int;
if (m_time){
m_time.removeEventListener(TimerEvent.TIMER, playGame);
m_time.stop();
m_time = null;
};
while (indx < m_board.length) {
m_board[indx] = 0;
indx++;
};
m_state = STATE_IDLE;
notify((TYPE_BOARD | TYPE_GAMEOVER));
}
public function moveBlockDown():void{
if (m_state != STATE_PLAY){
return;
};
while (CanPut()) {
m_blockY = (m_blockY + 1);
};
m_blockY = (m_blockY - 1);
PutBlock();
notify(TYPE_BOARD);
}
private function DeleteRow():void{
var sum:int;
var del:int;
var i:int;
var ii:int;
var jj:int;
var j:int;
m_deletedRows = [];
j = 0;
while (j < BOARD_HEIGHT) {
sum = 0;
i = 0;
while (i < BOARD_WIDTH) {
if (m_board[(i + (j * BOARD_WIDTH))] != 0){
sum = (sum + 1);
};
i++;
};
if (sum == BOARD_WIDTH){
m_deletedRows.push(j);
jj = j;
while (jj >= 1) {
ii = 0;
while (ii < BOARD_WIDTH) {
m_board[(ii + (jj * BOARD_WIDTH))] = m_board[(ii + ((jj - 1) * BOARD_WIDTH))];
ii++;
};
jj--;
};
del++;
};
j++;
};
if (m_deletedRows.length > 0){
notify(Tetris.TYPE_ROWDELETE);
GameScore(del);
generateNewBlock();
};
}
public function get deletedRows():Array{
return (m_deletedRows);
}
private function generateBlock(kind:int):Array{
var block:Array;
switch (kind){
case 0:
block = BLOCK_SHAPES[0];
break;
case 16:
block = BLOCK_SHAPES[1];
break;
case 32:
block = BLOCK_SHAPES[2];
break;
case 48:
block = BLOCK_SHAPES[3];
break;
case 1:
block = BLOCK_SHAPES[4];
break;
case 17:
block = BLOCK_SHAPES[5];
break;
case 33:
block = BLOCK_SHAPES[6];
break;
case 49:
block = BLOCK_SHAPES[7];
break;
case 2:
block = BLOCK_SHAPES[8];
break;
case 18:
block = BLOCK_SHAPES[9];
break;
case 34:
block = BLOCK_SHAPES[10];
break;
case 50:
block = BLOCK_SHAPES[11];
break;
case 3:
block = BLOCK_SHAPES[12];
break;
case 19:
block = BLOCK_SHAPES[13];
break;
case 35:
block = BLOCK_SHAPES[14];
break;
case 51:
block = BLOCK_SHAPES[15];
break;
case 4:
block = BLOCK_SHAPES[16];
break;
case 20:
block = BLOCK_SHAPES[17];
break;
case 36:
block = BLOCK_SHAPES[18];
break;
case 52:
block = BLOCK_SHAPES[19];
break;
case 5:
block = BLOCK_SHAPES[20];
break;
case 21:
block = BLOCK_SHAPES[21];
break;
case 37:
block = BLOCK_SHAPES[22];
break;
case 53:
block = BLOCK_SHAPES[23];
break;
case 6:
block = BLOCK_SHAPES[24];
break;
case 22:
block = BLOCK_SHAPES[25];
break;
case 38:
block = BLOCK_SHAPES[26];
break;
case 54:
block = BLOCK_SHAPES[27];
break;
};
return (block);
}
public function get score():int{
return (m_score);
}
public function register(observer:IObserver):void{
if (m_observers == null){
m_observers = [];
};
m_observers.push(observer);
}
public function get height():int{
return (BOARD_HEIGHT);
}
private function GameScore(del:int):void{
if (del < 1){
return;
};
m_dels = (m_dels + del);
m_score = (((m_score + (100 * del)) + ((del - 1) * 25)) + ((m_dels / 10) * 25));
var oldLvl:int = m_level;
m_level = int((m_dels / 5));
if (oldLvl == m_level){
notify(TYPE_SCORE);
} else {
notify((TYPE_SCORE | TYPE_LEVEL));
};
}
public function clearBoard():void{
var indx:int;
if (m_state != STATE_IDLE){
m_board = new Array((BOARD_WIDTH * BOARD_HEIGHT));
while (indx < m_board.length) {
m_board[indx] = 0;
indx++;
};
m_nextBlock = Math.floor((Math.random() * 7));
generateNewBlock();
m_deletedRows = [];
m_time = new Timer(m_difficultyTiming[Math.min(m_level, (m_difficultyTiming.length - 1))]);
m_time.addEventListener(TimerEvent.TIMER, playGame);
m_time.start();
notify(TYPE_BOARD);
};
}
public function newGame(lvl:int=1, dif:int=1, score:int=0):void{
var indx:int;
if (m_state != STATE_IDLE){
return;
};
m_state = STATE_PLAY;
m_board = new Array((BOARD_WIDTH * BOARD_HEIGHT));
while (indx < m_board.length) {
m_board[indx] = 0;
indx++;
};
m_score = score;
m_level = lvl;
m_difficulty = dif;
m_dels = (m_level * 5);
m_nextBlock = Math.floor((Math.random() * 7));
generateNewBlock();
m_deletedRows = [];
m_time = new Timer(m_difficultyTiming[Math.min(m_difficulty, (m_difficultyTiming.length - 1))]);
m_time.addEventListener(TimerEvent.TIMER, playGame);
m_time.start();
notify((TYPE_BOARD | TYPE_SCORE));
}
public function get difficulty():int{
return (m_difficulty);
}
public function unregister(observer:IObserver):void{
var i:int;
if (m_observers == null){
return;
};
while (i < m_observers.length) {
if (m_observers[i] == observer){
m_observers.splice(i, 1);
break;
};
i++;
};
}
public function get width():int{
return (BOARD_WIDTH);
}
public function notify(type:uint):void{
var observer:IObserver;
for each (observer in m_observers) {
observer.update(type);
};
}
public function moveBlockRight():void{
if (m_state != STATE_PLAY){
return;
};
m_blockX = (m_blockX + 1);
if (CanPut() == false){
m_blockX = (m_blockX - 1);
} else {
notify(TYPE_BOARD);
};
}
private function playGame(event:TimerEvent):void{
m_blockY++;
if (!CanPut()){
m_blockY--;
PutBlock();
generateNewBlock();
};
notify(TYPE_BOARD);
}
private function CanPut():Boolean{
var offset:int;
var i:int;
var j:int;
j = 0;
while (j < 4) {
offset = (j * BLOCK_WIDTH);
i = 0;
while (i < 4) {
if (m_block[(offset + i)] != 0){
if (((((((m_blockX + i) > (BOARD_WIDTH - 1))) || (((m_blockX + i) < 0)))) || (((m_blockY + j) > (BOARD_HEIGHT - 1))))){
return (false);
};
if (m_board[((m_blockX + i) + ((m_blockY + j) * BOARD_WIDTH))] != 0){
return (false);
};
};
i++;
};
j++;
};
return (true);
}
private function PutBlock():void{
var i:int;
var j:int;
j = 0;
while (j < 4) {
i = 0;
while (i < 4) {
if (m_block[(i + (j * BLOCK_WIDTH))] != 0){
m_board[((m_blockX + i) + ((m_blockY + j) * BOARD_WIDTH))] = m_block[(i + (j * BLOCK_WIDTH))];
};
i++;
};
j++;
};
DeleteRow();
}
public function get nextBlock():int{
return (m_nextBlock);
}
private function DrawBoard():Array{
var arr:Array;
var offsetBoard:int;
var offsetBlock:int;
var i:int;
var j:int;
var tile:int;
arr = [];
for each (tile in m_board) {
arr.push(tile);
};
j = 0;
while (j < BLOCK_HEIGHT) {
offsetBoard = ((j + m_blockY) * BOARD_WIDTH);
offsetBlock = (j * BLOCK_WIDTH);
i = 0;
while (i < BLOCK_WIDTH) {
if (m_block[(offsetBlock + i)] > 0){
arr[((offsetBoard + i) + m_blockX)] = m_block[(offsetBlock + i)];
};
i++;
};
j++;
};
return (arr);
}
public function moveBlockLeft():void{
if (m_state != STATE_PLAY){
return;
};
m_blockX = (m_blockX - 1);
if (CanPut() == false){
m_blockX = (m_blockX + 1);
} else {
notify(TYPE_BOARD);
};
}
public function get board():Array{
return (DrawBoard());
}
private function generateNewBlock():void{
m_block = this.generateBlock(m_nextBlock);
m_curBlock = m_nextBlock;
m_nextBlock = Math.floor((Math.random() * 7));
notify(TYPE_NEXTBLOCK);
m_blockX = 3;
m_blockY = 0;
if (CanPut() == false){
GameOver();
};
}
public function endGame():void{
var indx:int;
if (m_state != STATE_IDLE){
while (indx < m_board.length) {
m_board[indx] = 0;
indx++;
};
m_time.removeEventListener(TimerEvent.TIMER, playGame);
m_time.stop();
m_time = null;
m_state = STATE_IDLE;
notify(TYPE_BOARD);
};
}
public function rotateBlock():void{
if (m_state != STATE_PLAY){
return;
};
var old_block:int = m_curBlock;
m_curBlock = (m_curBlock + 16);
if (m_curBlock > 54){
m_curBlock = (m_curBlock & 15);
};
m_block = generateBlock(m_curBlock);
if (CanPut() == false){
m_curBlock = old_block;
m_block = generateBlock(m_curBlock);
} else {
notify(TYPE_BOARD);
};
}
}
}//package tetris_game
Section 22
//TetrisBoard (tetris_game.TetrisBoard)
package tetris_game {
import flash.events.*;
import flash.display.*;
import flash.geom.*;
public class TetrisBoard extends Sprite implements IObserver {
private var m_numColumns:int;
private var m_rowsToDelete:Array;
private var m_board:MovieClip;
private var m_tetris:Tetris;
private var m_numRows:int;
private var m_overlaySprites:Array;
private var m_tiles:Array;
private var m_overlay:Sprite;
public function TetrisBoard(){
super();
}
public function rowsDeleted(arr:Array):void{
var row:int;
var ypos:Number;
var col:int;
var xpos:Number;
trace(("rows deleted: " + arr));
while (arr.length > 0) {
row = arr.shift();
ypos = (m_tiles[(row * m_numColumns)] as Sprite).y;
col = 0;
while (col < m_numColumns) {
xpos = (m_tiles[((row * m_numColumns) + col)] as Sprite).x;
addSymbolToOverlay(new A_ExplodingBlock(), xpos, ypos);
col++;
};
};
}
private function createBoard():void{
var tile:MovieClip;
var xOffset:Number;
var yOffset:Number;
var xSpacing:Number;
var ySpacing:Number;
var row:int;
var col:int;
var rcBoard:Rectangle = m_board.getBounds(m_board.parent);
var rcTile:Rectangle = new A_Tile().getBounds(null);
xOffset = ((rcTile.width / 2) + rcBoard.left);
yOffset = ((rcTile.height / 2) + rcBoard.top);
xSpacing = ((rcBoard.width - rcTile.width) / m_numColumns);
ySpacing = ((rcBoard.height - rcTile.height) / m_numRows);
m_tiles = [];
row = 0;
while (row < m_numRows) {
col = 0;
while (col < m_numColumns) {
tile = new A_Tile();
tile.gotoAndStop(0);
addChild(tile);
tile.x = (xOffset + (xSpacing * col));
tile.y = (yOffset + (ySpacing * row));
m_tiles.push(tile);
col++;
};
row++;
};
m_overlay = new Sprite();
addChild(m_overlay);
m_overlaySprites = [];
}
private function overlayAddedToStage(event:Event):void{
var mc:MovieClip = (event.target as MovieClip);
mc.gotoAndPlay(2);
}
public function init(tetris:Tetris, image:MovieClip):void{
m_tetris = tetris;
tetris.register(this);
m_numColumns = tetris.width;
m_numRows = tetris.height;
m_board = image;
m_board.parent.addChild(this);
createBoard();
}
public function update(type:uint):void{
switch (type){
case Tetris.TYPE_BOARD:
boardChange(m_tetris.board);
break;
case Tetris.TYPE_ROWDELETE:
rowsDeleted(m_tetris.deletedRows);
break;
};
}
private function overlayEnterFrame(event:Event):void{
var mc:MovieClip = (event.target as MovieClip);
if (mc.currentFrame == mc.totalFrames){
mc.removeEventListener(Event.ADDED_TO_STAGE, overlayAddedToStage);
mc.removeEventListener(Event.ENTER_FRAME, overlayEnterFrame);
mc.parent.removeChild(mc);
};
}
public function boardChange(board:Array):void{
var idx:int;
if (m_tiles == null){
return;
};
idx = 0;
while (idx < m_tiles.length) {
(m_tiles[idx] as MovieClip).gotoAndStop((board[idx] + 1));
idx++;
};
}
private function addSymbolToOverlay(mc:MovieClip, xpos:Number, ypos:Number):void{
mc.addEventListener(Event.ADDED_TO_STAGE, overlayAddedToStage);
mc.addEventListener(Event.ENTER_FRAME, overlayEnterFrame);
m_overlay.addChild(mc);
mc.x = xpos;
mc.y = ypos;
}
}
}//package tetris_game
Section 23
//TetrisLevel (tetris_game.TetrisLevel)
package tetris_game {
import flash.display.*;
import flash.text.*;
public class TetrisLevel implements IObserver {
private var m_symbol:MovieClip;
private var m_tetris:Tetris;
private var m_text:TextField;
public function TetrisLevel(){
super();
}
public function init(tetris:Tetris, symbol:MovieClip):void{
var i:int;
m_tetris = tetris;
m_symbol = symbol;
m_tetris.register(this);
while (i < m_symbol.numChildren) {
if ((m_symbol.getChildAt(i) is TextField)){
m_text = (m_symbol.getChildAt(i) as TextField);
m_text.text = "1";
break;
};
i++;
};
}
public function update(type:uint):void{
if ((Tetris.TYPE_LEVEL & type) != 0){
trace(("new level " + m_tetris.level));
m_text.text = m_tetris.level.toString();
};
}
}
}//package tetris_game
Section 24
//TetrisNextBlock (tetris_game.TetrisNextBlock)
package tetris_game {
import flash.display.*;
public class TetrisNextBlock implements IObserver {
public var m_symbol:MovieClip;
public var m_tetres:Tetris;
public function TetrisNextBlock(){
super();
}
public function init(tetris:Tetris, symbol:MovieClip):void{
m_tetres = tetris;
m_symbol = symbol;
m_tetres.register(this);
m_symbol.gotoAndStop(1);
}
public function update(type:uint):void{
if ((type & Tetris.TYPE_NEXTBLOCK) > 0){
m_symbol.gotoAndStop((m_tetres.nextBlock + 1));
};
}
}
}//package tetris_game
Section 25
//TetrisReward (tetris_game.TetrisReward)
package tetris_game {
import flash.events.*;
import flash.display.*;
import flash.geom.*;
public class TetrisReward implements IObserver {
private var m_spriteArray:Array;
private var SYM_NEWLEVEL:int;// = 2
private var m_playing:Boolean;
private var SYM_GAMEOVER:int;// = 4
private var SYM_GOODJOB:int;// = 1
private var m_symbol:MovieClip;
private var m_tetris:Tetris;
private var m_symbolDB:Object;
private var m_level:int;
private var m_scene:MovieClip;
public function TetrisReward(){
super();
}
public function update(type:uint):void{
if ((type & Tetris.TYPE_GAMEOVER) != 0){
m_spriteArray.push(createSprite(SYM_GAMEOVER));
m_level = 0;
};
if ((type & Tetris.TYPE_ROWDELETE) != 0){
m_spriteArray.push(createSprite(SYM_GOODJOB));
};
if (((!(((type & Tetris.TYPE_LEVEL) == 0))) && (!((m_level == m_tetris.level))))){
m_level = m_tetris.level;
m_spriteArray.push(createSprite(SYM_NEWLEVEL));
};
if (((!(m_playing)) && ((m_spriteArray.length > 0)))){
m_scene.addChild(m_spriteArray.shift());
};
}
private function createSprite(symbol:int):MovieClip{
var sprite:MovieClip = new (m_symbolDB[symbol]);
var rect:Rectangle = sprite.getBounds(sprite);
sprite.x = (((m_scene.width - sprite.width) / 2) + (sprite.x - rect.left));
sprite.y = (((m_scene.height - sprite.height) / 2) + (sprite.y - rect.top));
sprite.addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
sprite.addEventListener(Event.ENTER_FRAME, onEnterFrame);
return (sprite);
}
private function onAddedToStage(event:Event):void{
var mc:MovieClip = (event.target as MovieClip);
mc.gotoAndPlay(2);
m_playing = true;
}
private function onEnterFrame(event:Event):void{
var parent:Sprite;
var mc:MovieClip = (event.target as MovieClip);
if (mc.currentFrame == (mc.totalFrames - 1)){
mc.removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
mc.removeEventListener(Event.ENTER_FRAME, onEnterFrame);
parent = (mc.parent as Sprite);
if (parent != null){
mc.parent.removeChild(mc);
};
if ((((m_spriteArray.length > 0)) && (!((parent == null))))){
parent.addChild(m_spriteArray.shift());
} else {
m_playing = false;
};
};
}
public function init(tetris:Tetris, scene:MovieClip):void{
m_tetris = tetris;
m_tetris.register(this);
m_level = 0;
m_scene = scene;
m_spriteArray = [];
m_symbolDB = {};
m_symbolDB[SYM_GOODJOB] = A_GoodJob;
m_symbolDB[SYM_NEWLEVEL] = A_NewLevel;
m_symbolDB[SYM_GAMEOVER] = A_GameOver;
}
}
}//package tetris_game
Section 26
//TetrisScore (tetris_game.TetrisScore)
package tetris_game {
import flash.display.*;
import flash.text.*;
public class TetrisScore implements IObserver {
private var m_symbol:MovieClip;
private var m_tetris:Tetris;
private var m_text:TextField;
public function TetrisScore(){
super();
}
public function init(teteis:Tetris, symbol:MovieClip):void{
var i:int;
m_tetris = teteis;
m_symbol = symbol;
m_tetris.register(this);
while (i < m_symbol.numChildren) {
if ((m_symbol.getChildAt(i) is TextField)){
m_text = (m_symbol.getChildAt(i) as TextField);
m_text.text = "0";
break;
};
i++;
};
}
public function update(type:uint):void{
if ((Tetris.TYPE_SCORE & type) != 0){
trace(("new score " + m_tetris.score));
m_text.text = m_tetris.score.toString();
};
}
}
}//package tetris_game
Section 27
//A_ExplodingBlock (A_ExplodingBlock)
package {
import flash.display.*;
public dynamic class A_ExplodingBlock extends MovieClip {
public function A_ExplodingBlock(){
addFrameScript(0, frame1);
}
function frame1(){
stop();
}
}
}//package
Section 28
//A_GalleryPage (A_GalleryPage)
package {
import flash.display.*;
public dynamic class A_GalleryPage extends MovieClip {
public var btn_exit:SimpleButton;
public var btn_prev:SimpleButton;
public var image_4:MovieClip;
public var image_8:MovieClip;
public var image_2:MovieClip;
public var image_5:MovieClip;
public var image_6:MovieClip;
public var image_7:MovieClip;
public var image_9:MovieClip;
public var image_3:MovieClip;
public var image_10:MovieClip;
public var image_11:MovieClip;
public var detail_sprite:MovieClip;
public var image_12:MovieClip;
public var image_1:MovieClip;
public var btn_back:SimpleButton;
public var btn_next:SimpleButton;
public function A_GalleryPage(){
addFrameScript(1, frame2, 5, frame6);
}
function frame6(){
stop();
}
function frame2(){
stop();
}
}
}//package
Section 29
//A_GameMusic (A_GameMusic)
package {
import flash.media.*;
public dynamic class A_GameMusic extends Sound {
}
}//package
Section 30
//A_GameOver (A_GameOver)
package {
import flash.display.*;
public dynamic class A_GameOver extends MovieClip {
public function A_GameOver(){
addFrameScript(0, frame1);
}
function frame1(){
stop();
}
}
}//package
Section 31
//A_GameOverPage (A_GameOverPage)
package {
import flash.display.*;
public dynamic class A_GameOverPage extends MovieClip {
public function A_GameOverPage(){
addFrameScript(2, frame3, 3, frame4);
}
function frame3(){
stop();
}
function frame4(){
stop();
}
}
}//package
Section 32
//A_GamePage (A_GamePage)
package {
import flash.display.*;
public dynamic class A_GamePage extends MovieClip {
public var id_tetrisboard:MovieClip;
public var id_nextblock:MovieClip;
public var id_score:MovieClip;
public var id_level:MovieClip;
public var id_background:MovieClip;
public var id_doll:MovieClip;
}
}//package
Section 33
//A_GoodJob (A_GoodJob)
package {
import flash.display.*;
public dynamic class A_GoodJob extends MovieClip {
public function A_GoodJob(){
addFrameScript(0, frame1, 48, frame49);
}
function frame1(){
stop();
}
function frame49(){
stop();
}
}
}//package
Section 34
//A_HelpPage (A_HelpPage)
package {
import flash.events.*;
import flash.display.*;
public dynamic class A_HelpPage extends MovieClip {
public var btn_exit:SimpleButton;
public var btn_credits:SimpleButton;
public var btn_back:SimpleButton;
public function A_HelpPage(){
addFrameScript(1, frame2, 2, frame3);
}
function frame3(){
stop();
btn_back.addEventListener(MouseEvent.CLICK, function (_arg1:Event):void{
gotoAndPlay(1);
});
}
function frame2(){
stop();
btn_credits.addEventListener(MouseEvent.CLICK, function (_arg1:Event):void{
gotoAndPlay(2);
});
}
}
}//package
Section 35
//A_IntroPage (A_IntroPage)
package {
import flash.events.*;
import flash.display.*;
public dynamic class A_IntroPage extends MovieClip {
public function A_IntroPage(){
addFrameScript(0, frame1, 130, frame131, 358, frame359);
}
function frame1(){
dispatchEvent(new Event("nonSkippable", true));
trace("dipatched nonSkippable");
}
function frame359(){
stop();
dispatchEvent(new Event("animationEnd", true, true));
}
function frame131(){
dispatchEvent(new Event("skippable", true));
trace("dipatched skippable");
}
}
}//package
Section 36
//A_LobbyPage (A_LobbyPage)
package {
import flash.display.*;
public dynamic class A_LobbyPage extends MovieClip {
public var btn_continue:SimpleButton;
public var btn_new:SimpleButton;
public var btn_help:SimpleButton;
public var btn_gallery:SimpleButton;
public var id_btnOptions:SimpleButton;
public var id_btnHelp:SimpleButton;
public var btn_options:SimpleButton;
public var id_btnPlay:SimpleButton;
public function A_LobbyPage(){
addFrameScript(23, frame24);
}
function frame24(){
stop();
}
}
}//package
Section 37
//A_MainLobbyMusic (A_MainLobbyMusic)
package {
import flash.media.*;
public dynamic class A_MainLobbyMusic extends Sound {
}
}//package
Section 38
//A_NewLevel (A_NewLevel)
package {
import flash.display.*;
public dynamic class A_NewLevel extends MovieClip {
public function A_NewLevel(){
addFrameScript(0, frame1, 47, frame48);
}
function frame1(){
stop();
}
function frame48(){
stop();
}
}
}//package
Section 39
//A_OptionsPage (A_OptionsPage)
package {
import flash.display.*;
public dynamic class A_OptionsPage extends MovieClip {
public var btn_screensizefullscreen:SimpleButton;
public var btn_exit:SimpleButton;
public var btn_screensizewindow:SimpleButton;
public var btn_soundon:SimpleButton;
public var btn_soundoff:SimpleButton;
public var btn_qualitymedium:SimpleButton;
public var btn_speednormal:SimpleButton;
public var btn_speedeasy:SimpleButton;
public var btn_speedhard:SimpleButton;
public var btn_musicoff:SimpleButton;
public var btn_qualityhigh:SimpleButton;
public var btn_qualitylow:SimpleButton;
public var btn_musicon:SimpleButton;
}
}//package
Section 40
//A_Radial (A_Radial)
package {
import flash.display.*;
public dynamic class A_Radial extends MovieClip {
}
}//package
Section 41
//A_Tile (A_Tile)
package {
import flash.display.*;
public dynamic class A_Tile extends MovieClip {
public function A_Tile(){
addFrameScript(0, frame1);
}
function frame1(){
stop();
}
}
}//package
Section 42
//IObserver (IObserver)
package {
public interface IObserver {
function update(:uint):void;
}
}//package
Section 43
//IState (IState)
package {
import flash.events.*;
public interface IState {
function OnMouseDown(:MouseEvent):void;
function OnMouseUp(:MouseEvent):void;
function OnMouseClick(:MouseEvent):void;
function OnKeyDown(:KeyboardEvent):void;
}
}//package
Section 44
//ISubject (ISubject)
package {
public interface ISubject {
function notify(:uint):void;
function register(:IObserver):void;
function unregister(:IObserver):void;
}
}//package
Section 45
//Main (Main)
package {
import flash.events.*;
import tetris_game.*;
import flash.display.*;
import flash.media.*;
import sounds.*;
import doll.*;
import options.*;
import state.*;
import flash.utils.*;
import flash.geom.*;
public class Main extends Sprite {
private var m_lobbyMusic:SoundAmbient;
private var m_gameMusic:SoundAmbient;
private var m_gameOverMC:MovieClip;
private var m_dollManager:DollManager;
private var m_galleryMC:MovieClip;
private var m_tetrisLevel:TetrisLevel;
private var m_gameMC:MovieClip;
private var m_gameSoundFx:SoundCollection;
private var galleryNumberDollsUnlocked:int;
private var m_lobbyMC:MovieClip;
private var m_currentScene:Sprite;
private var m_tetrisScore:TetrisScore;
private var m_currentState:IState;
private var m_tetris:Tetris;
private var m_soundTransform:SoundTransform;
private var m_introMC:MovieClip;
private var m_dollPanel:DollPanel;
private var m_soundVolume:Number;
private var m_detailMC:MovieClip;
private var m_tetrisReward:TetrisReward;
private var m_optionsState:IState;
private var galleryStages:Array;
private var m_soundCollection:SoundCollection;
private var galleryDolls:Array;
private var m_optionsMC:MovieClip;
private var galleryDollIcons:Array;
private var galleryCurrentDollStage:int;
private var m_lobbyState:IState;
private var m_tetrisNextBlock:TetrisNextBlock;
private var m_gameState:IState;
private var m_helpState:IState;
private var m_gameAmbients:SoundCollection;
private var m_tetrisBoard:TetrisBoard;
private var galleryCurrentDollTotalStages:Array;
private var m_introState:IState;
public var flagSkippable:Boolean;// = true
private var m_helpMC:MovieClip;
private var m_currSoundCollection:SoundCollection;
private var galleryCurrentDoll:MovieClip;
private var m_optionSound:CSliderControl;
private var m_debugAlreadyPlayed:Boolean;
private var m_musicVolume:Number;
private var galleryInDetailScreen:Boolean;
private var m_musicTransform:SoundTransform;
private var m_optionMusic:CSliderControl;
private var m_lobbySounds:SoundCollection;
private var m_gameSounds:SoundCollection;
private var m_galleryState:IState;
private var m_gameOverState:IState;
public static const STATE_GAME:String = "stateGame";
public static const STATE_GALLERY:String = "stateGallery";
public static const STATE_INTRO:String = "stateIntro";
public static const STATE_LOBBY:String = "stateLobby";
private static const s_dollXml:XML = <xml>
<url_resource path="doll_demon.swf">
<doll_symbol id="doll_demon" symbol="A_doll"/>
<symbol id="background" asset="A_background"/>
</url_resource>
</xml>
;
public static const STATE_GAMEOVER:String = "stateGameOver";
public static const STATE_HELP:String = "stateHelp";
public static const STATE_OPTIONS:String = "stateOptions";
public function Main():void{
galleryDolls = [];
galleryDollIcons = [];
super();
if (stage){
init();
} else {
addEventListener(Event.ADDED_TO_STAGE, init);
};
}
public function galleryNextImage():void{
galleryCurrentDollStage = (galleryCurrentDollStage + ((galleryCurrentDollStage)<(galleryCurrentDollTotalStages.length - 1)) ? 1 : 0);
galleryCurrentDoll.gotoAndStop((galleryCurrentDollTotalStages[galleryCurrentDollStage] as FrameLabel).frame);
}
public function enterGameOverLose():void{
changePage(m_gameOverMC);
m_gameOverMC.gotoAndStop("lose");
m_currentState = m_gameOverState;
m_currSoundCollection.clear();
}
private function init(e:Event=null):void{
var e = e;
removeEventListener(Event.ADDED_TO_STAGE, init);
m_dollManager = new DollManager();
m_dollManager.load(s_dollXml);
m_dollManager.addEventListener(Event.COMPLETE, function (e:Event):void{
playIntro();
});
m_dollPanel = new DollPanel();
m_introMC = new A_IntroPage();
m_lobbyMC = new A_LobbyPage();
m_gameMC = new A_GamePage();
m_helpMC = new A_HelpPage();
m_optionsMC = new A_OptionsPage();
m_galleryMC = centerDisplayObject(new A_GalleryPage(), m_helpMC);
m_gameOverMC = new A_GameOverPage();
m_introState = new CIntroState(this);
m_lobbyState = new CLobbyState(this);
m_gameState = new CGameState(this);
m_helpState = new CHelpState(this);
m_optionsState = new COptionsState(this);
m_galleryState = new CGalleryState(this);
m_gameOverState = new CGameOverState(this);
initTetrisGame();
m_soundVolume = 0.5;
m_soundTransform = new SoundTransform(m_soundVolume);
m_musicVolume = 0.5;
m_musicTransform = new SoundTransform(m_musicVolume);
addEventListener(MouseEvent.CLICK, OnMouseClick);
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
stage.focus = this;
addEventListener("gameOver", onGameOver);
addEventListener("gameVictory", onGameVictory);
addEventListener("nextDoll", onNextDoll);
addEventListener("reward", onDollReward);
var dummy:Sprite = new Sprite();
m_currentScene = dummy;
addChild(dummy);
m_lobbySounds = new SoundCollection("lobby");
m_lobbyMusic = new SoundAmbient("music", 0, new A_MainLobbyMusic(), m_musicTransform);
m_lobbySounds.addChild(m_lobbyMusic);
m_gameSounds = new SoundCollection("game");
m_gameMusic = new SoundAmbient("music", 0, new A_GameMusic(), null);
m_gameAmbients = new SoundAmbCollection("ambients");
m_gameSoundFx = new SoundCollection("effects");
m_gameSounds.addChild(m_gameMusic);
m_gameSounds.addChild(m_gameAmbients);
m_gameSounds.addChild(m_gameSoundFx);
m_soundCollection = new SoundCollection("root");
m_soundCollection.addChild(m_lobbySounds);
m_soundCollection.addChild(m_gameSounds);
m_currSoundCollection = new SoundCollection("dummy");
}
public function enterGameOverWin():void{
changePage(m_gameOverMC);
m_gameOverMC.gotoAndStop("win");
m_currentState = m_gameOverState;
m_currSoundCollection.stop();
changeSoundCollection("lobby");
m_currSoundCollection.play("music");
}
public function get tetris():Tetris{
return (m_tetris);
}
public function enterHelp():void{
changePage(m_helpMC);
m_currentState = m_helpState;
}
public function changeSoundCollection(_collectionName:String):void{
if (m_currSoundCollection != null){
m_currSoundCollection.stop();
};
m_currSoundCollection = (m_soundCollection.getChildByName(_collectionName) as SoundCollection);
}
public function playGame():void{
changePage(m_gameMC);
m_currentState = m_gameState;
nextDoll();
}
private function onMouseUp(event:MouseEvent):void{
m_currentState.OnMouseUp(event);
}
private function OnMouseClick(event:MouseEvent):void{
m_currentState.OnMouseClick(event);
}
private function centerDisplayObject(_sprite, _target){
var targetRect:Rectangle = _target.getRect(_target);
var spriteRect:Rectangle = _sprite.getRect(_target);
_sprite.x = ((_sprite.x - spriteRect.left) + (targetRect.left + ((targetRect.width - spriteRect.width) / 2)));
_sprite.y = ((_sprite.y - spriteRect.top) + (targetRect.top + ((targetRect.height - spriteRect.height) / 2)));
return (_sprite);
}
public function enterGallery():void{
changePage(m_galleryMC);
m_currentState = m_galleryState;
galleryInit();
}
private function changePage(scene:MovieClip):void{
removeChild(m_currentScene);
m_currentScene = scene;
stage.focus = scene;
addChild(m_currentScene);
if ((m_currentScene is MovieClip)){
(m_currentScene as MovieClip).gotoAndPlay(1);
};
}
private function onGameVictory(event:Event):void{
tetris.endGame();
m_currSoundCollection.getChildByName("effects").stop();
m_currSoundCollection.play("effects:victory");
galleryNumberDollsUnlocked++;
galleryNumberDollsUnlocked = 1;
}
public function dollDemon():void{
var bkgrn:Sprite;
m_dollPanel.init(m_dollManager.buildDoll("doll_demon"), m_gameMC["id_doll"]);
m_tetris.unregister(m_dollPanel);
m_tetris.register(m_dollPanel);
if (galleryDollIcons[0] == null){
galleryDollIcons[0] = new (m_dollManager.getAsset("A_Icon"));
galleryDolls[0] = m_dollManager.buildDoll("doll_demon");
m_gameMC["id_doll"];
};
if (((!((m_gameMC["id_background"] == null))) && (m_dollManager.getAsset("A_background")))){
bkgrn = m_gameMC["id_background"];
while (bkgrn.numChildren > 0) {
bkgrn.removeChildAt(0);
};
bkgrn.addChild(new (m_dollManager.getAsset("A_background")));
};
changeSoundCollection("game");
m_currSoundCollection.clear();
m_currSoundCollection.addChild(new SoundAmbient("music", 0, new (m_dollManager.getAsset("A_music"))));
var randomAmbients:SoundRndCollection = new SoundRndCollection("ambient", 24000);
randomAmbients.addChild(new SoundFx("1", new (m_dollManager.getAsset("A_taunt_1"))));
randomAmbients.addChild(new SoundFx("2", new (m_dollManager.getAsset("A_taunt_2"))));
randomAmbients.addChild(new SoundFx("3", new (m_dollManager.getAsset("A_taunt_3"))));
randomAmbients.addChild(new SoundFx("4", new (m_dollManager.getAsset("A_taunt_4"))));
randomAmbients.addChild(new SoundFx("5", new (m_dollManager.getAsset("A_taunt_5"))));
randomAmbients.addChild(new SoundFx("6", new (m_dollManager.getAsset("A_taunt_6"))));
randomAmbients.addChild(new SoundFx("7", new (m_dollManager.getAsset("A_taunt_7"))));
m_currSoundCollection.addChild(randomAmbients);
var effects:SoundCollection = new SoundCollection("effects");
effects.addChild(new SoundFx("victory", new (m_dollManager.getAsset("A_win"))));
effects.addChild(new SoundFx("failure", new (m_dollManager.getAsset("A_fail"))));
var rndRewards:SoundRndCollection = new SoundRndCollection("reward", 0);
rndRewards.addChild(new SoundFx("1", new (m_dollManager.getAsset("A_reward_1"))));
rndRewards.addChild(new SoundFx("2", new (m_dollManager.getAsset("A_reward_2"))));
rndRewards.addChild(new SoundFx("3", new (m_dollManager.getAsset("A_reward_3"))));
rndRewards.addChild(new SoundFx("4", new (m_dollManager.getAsset("A_reward_4"))));
rndRewards.addChild(new SoundFx("5", new (m_dollManager.getAsset("A_reward_5"))));
rndRewards.addChild(new SoundFx("6", new (m_dollManager.getAsset("A_reward_6"))));
effects.addChild(rndRewards);
m_currSoundCollection.addChild(effects);
m_currSoundCollection.play("music");
m_currSoundCollection.play("ambient");
}
public function galleryBack():void{
if (((!((galleryCurrentDoll == null))) && (!((galleryCurrentDoll.parent == null))))){
galleryCurrentDoll.parent.removeChild(galleryCurrentDoll);
galleryCurrentDoll = null;
};
m_galleryMC.gotoAndPlay("gallery_main");
galleryInit();
}
public function gallerySelectDoll(num:int):void{
m_galleryMC.gotoAndStop("gallery_detail");
galleryDetailInit(galleryDolls[num]);
}
public function galleryInit():void{
var img:MovieClip;
if (m_galleryMC.getChildByName("image_1") == null){
m_galleryMC.addEventListener(Event.ENTER_FRAME, function (event:Event):void{
if (m_galleryMC.getChildByName("image_1") != null){
event.currentTarget.removeEventListener(event.type, arguments.callee);
galleryInit();
};
});
return;
};
galleryCurrentDollTotalStages = [];
var i = 1;
while (i <= 12) {
img = (m_galleryMC.getChildByName(("image_" + i)) as MovieClip);
while ((img.getChildAt((img.numChildren - 1)) is MovieClip)) {
img.removeChildAt((img.numChildren - 1));
};
i = (i + 1);
};
var j:int;
while (j < galleryNumberDollsUnlocked) {
img = (m_galleryMC.getChildByName(("image_" + (j + 1))) as MovieClip);
img.addChild(galleryDollIcons[j]);
(galleryDollIcons[j] as MovieClip).name = ("image_" + (j + 1));
j = (j + 1);
};
}
public function get state():String{
var result:String = "";
switch (m_currentState){
case m_introState:
result = _slot1.STATE_INTRO;
break;
case m_lobbyState:
result = _slot1.STATE_LOBBY;
break;
case m_helpState:
result = _slot1.STATE_HELP;
break;
case m_optionsState:
result = _slot1.STATE_OPTIONS;
break;
case m_galleryState:
result = _slot1.STATE_GALLERY;
break;
case m_gameState:
result = _slot1.STATE_GAME;
break;
case m_gameOverState:
result = _slot1.STATE_GAMEOVER;
break;
};
return (result);
}
public function playIntro():void{
var main:Main;
main = this;
m_introMC.addEventListener("animationEnd", function (event:Event):void{
event.currentTarget.removeEventListener(event.type, arguments.callee);
if (main.state == _slot1.STATE_INTRO){
main.enterLobby();
};
});
m_introMC.addEventListener("nonSkippable", function (event:Event):void{
event.currentTarget.removeEventListener(event.type, arguments.callee);
if (main.state == _slot1.STATE_INTRO){
main.flagSkippable = false;
};
});
m_introMC.addEventListener("skippable", function (event:Event):void{
event.currentTarget.removeEventListener(event.type, arguments.callee);
main.flagSkippable = true;
});
changePage(m_introMC);
m_currentState = m_introState;
}
private function onDollReward(event:Event):void{
var effects:ASoundComponent = m_currSoundCollection.getChildByName("effects");
effects.stop();
m_currSoundCollection.play("effects:reward");
}
public function enterOptions():void{
changePage(m_optionsMC);
m_currentState = m_optionsState;
}
private function OnMouseDown(event:MouseEvent):void{
m_currentState.OnMouseDown(event);
}
public function galleryPrevImage():void{
galleryCurrentDollStage = (galleryCurrentDollStage - ((galleryCurrentDollStage)>0) ? 1 : 0);
galleryCurrentDoll.gotoAndStop((galleryCurrentDollTotalStages[galleryCurrentDollStage] as FrameLabel).frame);
}
private function onKeyDown(event:KeyboardEvent):void{
m_currentState.OnKeyDown(event);
}
private function initTetrisGame():void{
m_tetris = new Tetris();
m_tetrisBoard = new TetrisBoard();
m_tetrisBoard.init(m_tetris, m_gameMC["id_tetrisboard"]);
m_tetrisNextBlock = new TetrisNextBlock();
m_tetrisNextBlock.init(m_tetris, m_gameMC["id_nextblock"]);
m_tetrisScore = new TetrisScore();
m_tetrisScore.init(m_tetris, m_gameMC["id_score"]);
m_tetrisLevel = new TetrisLevel();
m_tetrisLevel.init(m_tetris, m_gameMC["id_level"]);
m_tetrisReward = new TetrisReward();
m_tetrisReward.init(m_tetris, m_gameMC);
}
private function onNextDoll(evt:Event):void{
this.nextDoll();
}
public function nextDoll(_lvl:int=-1):void{
if (m_debugAlreadyPlayed){
enterGameOverWin();
return;
};
m_debugAlreadyPlayed = true;
dollDemon();
m_tetris.newGame(m_tetris.level, 1, m_tetris.score);
}
private function onGameOver(evt:Event):void{
var that:Main;
var timer:Timer;
var fn:Function;
var evt = evt;
m_currSoundCollection.play("effects:failure");
that = this;
timer = new Timer(7000, 1);
fn = function (evt:TimerEvent):void{
timer.removeEventListener(TimerEvent.TIMER_COMPLETE, fn);
that.enterGameOverLose();
};
timer.addEventListener(TimerEvent.TIMER_COMPLETE, fn);
timer.start();
}
public function enterLobby():void{
m_debugAlreadyPlayed = false;
if (state == _slot1.STATE_GAME){
m_currSoundCollection.clear();
};
if ((((((state == _slot1.STATE_INTRO)) || ((state == _slot1.STATE_GAME)))) || (_slot1.STATE_GAMEOVER))){
changeSoundCollection("lobby");
m_currSoundCollection.play("music");
};
changePage(m_lobbyMC);
m_currentState = m_lobbyState;
}
public function galleryDetailInit(_doll:MovieClip):void{
var fl:FrameLabel;
var rect_spr:Sprite;
var refDoll:MovieClip;
var _doll = _doll;
if (m_galleryMC.getChildByName("detail_sprite") == null){
refDoll = _doll;
m_galleryMC.addEventListener(Event.ENTER_FRAME, function (event:Event):void{
if (m_galleryMC.getChildByName("detail_sprite") != null){
event.currentTarget.removeEventListener(event.type, arguments.callee);
galleryDetailInit(refDoll);
};
});
return;
};
if (((!((galleryCurrentDoll == null))) && (!((galleryCurrentDoll.parent == null))))){
galleryCurrentDoll.parent.removeChild(galleryCurrentDoll);
galleryCurrentDoll = null;
};
galleryCurrentDoll = _doll;
galleryCurrentDollStage = 0;
galleryCurrentDollTotalStages = [];
for each (fl in galleryCurrentDoll.currentLabels) {
if (fl.name.search("stage") != -1){
galleryCurrentDollTotalStages.push(fl);
};
};
rect_spr = (m_galleryMC.getChildByName("detail_sprite") as Sprite);
m_galleryMC.addChild(galleryCurrentDoll);
centerDisplayObject(galleryCurrentDoll, rect_spr);
galleryCurrentDoll.gotoAndPlay(galleryCurrentDollTotalStages[galleryCurrentDollStage]);
}
}
}//package