
var PCDSLStageClass = function(stgInfo, tbl)
{
	//args:[tbl, mainCharacter]
	PCDSLStageClass.base.apply(this, []);

	//initalize process
	if(stgInfo.width)	this.scrollMaxX = (stgInfo.width - 640 >= 0 ? stgInfo.width - 640 : 0);
	if(stgInfo.background){
		var back = document.createElement('img');
		back.src = "images/" + stgInfo.background;
		this.background = back;
	}
	if(stgInfo.BGM){
		this.BGM = stgInfo.BGM;
	}
	if(stgInfo.waterLevel){
		this.waterLevel = stgInfo.waterLevel;
	}
	if(stgInfo.spawnLocation instanceof Array){
		this.spawnLocation = stgInfo.spawnLocation;
	} else{
		this.spawnLocation = [33, 33];
	}
	if(stgInfo.mainProperty){
		this.mainProperty = stgInfo.mainProperty;
	} else{
		this.mainProperty = null;
	}
	
	var lx, ly, x, y;
	for(y = 0, ly = tbl.length; y < ly; y++)
	{
		for(x = 0, lx = tbl[y].length; x < lx; x++)
		{
			var item = tbl[y][x];
			var obj;
			
			if(item != null && item.base)
			{
				var adjust = new Point2D(0, 0)
				var sync = false;
				
				if(item.args){
					//itemが {base: ... , args : ...}の形式
					//必須プロパティ
					if(item.args instanceof Array)
					{
						//基本的に配列のみを受け入れる。
						obj = new (item.base)(this, item.args);
					} else{
						//配列に入れてあげる
						obj = new (item.base)(this, [item.args]);
					}
				} else{
					//引数指定なし:stageインスタンスのみを引数につける
					obj = new item(this);
				}
				//以下は任意プロパティ
				if(item.prop)
				{
					/// {prop: { propName: "value" }の形でプロパティが指定されている
					for(var propName in item.prop)
					{
						//オブジェクトにプロパティを設定
						obj[propName] = item.prop[propName];
					}
				}
				if(item.adjust)
				{
					// adjust : [xOffset, yOffset]の形で位置の微調整がなされている
					adjust = new Point2D(item.adjust[0], item.adjust[1]);
				}
				if(item.extid)
				{
					//ステージ内でグローバルかつ単一なオブジェクトのID
					obj.extObjectId = item.extid;
				}
				if(item.sync)
				{
					//ネットワーク更新をするかどうか
					sync = item.sync;
				}
				
				//配置
				obj.origin = new Point2D(x * 32 + adjust.x, y * 32 + adjust.y);
				this.addStageObject(obj, sync);
			}
		}
	}
}.extend(HorizonalScrollStageClass, {
	runStage: function(){
		if(this.manager.userManager.characterBaseClass){
			//キャラクターが設定されていたらそれをメインとして使う
			
			this.userControlledCharacter = new this.manager.userManager.characterBaseClass(this, null);
			if(this.mainProperty){
				for(var propName in this.mainProperty){
					//メインキャラにプロパティを設定
					this.userControlledCharacter[propName] = this.mainProperty[propName];
				}
			}
			this.userControlledCharacter.origin.x = this.spawnLocation[0];
			this.userControlledCharacter.origin.y = this.spawnLocation[1];
		}
		HorizonalScrollStageClass.prototype.runStage.apply(this, []);
		this.manager.setBackgroundMusic(this.BGM);
		this.manager.addWidget(new UserStateWidgetClass(this.manager));
		this.manager.addWidget(new PickedItemWidgetClass(this.manager));
		this.manager.addWidget(new BreadItemWidgetClass(this.manager));
		this.manager.addWidget(new TimerWidgetClass(this.manager));
	}
});

