#TouhouDanmakufu[Stage]
#Title[Another World's Chaos]
#Text[(3-stage demo)
code, music, effects, backgrounds:
 Azure Lazuline
concepts, character art, writing:
 Raibys]
#Image[]
#BGM[]
#Player[.\..\player\awcplayer.txt, FREE]
#ScriptVersion[2]

script_stage_main{
 #include_function ".\..\ShotSheet\shot_replace.dnh"
 #include_function ".\..\s1\__data_stage1.txt"
 #include_function ".\..\s2\__data_stage2.txt"
 #include_function ".\..\s3\__data_stage3.txt"
 #include_function ".\..\lw\__data_stageEX1.txt"
 #include_function ".\..\text.txt"
 #include_function ".\..\__data_general.txt"
 #include_function ".\..\backgrounds.txt"

 let v=0;
 let overlaya=245;
 let overlayc=0;
 let stage=0;
 let stagetaskrun=0;
 let diff=0;
 let GameMode=0;
 let totallives=0;

 let SkipMenuEntirely=0;

 let shortcut=3;
 let shortdiff=0;	//0 = normal

 let StageClear=0;
 let ClearedGame=0;
 let fullgame=0;

 let imgLoading=GPSD~"img\loading.png";
 let imgLoading2=GPSD~"img\loading2.png";
 let imgBorder=GPSD~"img\frame.png";

 let CommonDataDelete=["SPELLS_CAPTURED_STAGE","SPELLS_CAPTURED","SPELLS_TIMEOUTED_STAGE","SPELLS_TIMEOUTED","FadeBurst","SpellPractice","MaxPoint","AutoCollectItems","AutoCollectSouls","SpellBG","SpellBGOpacity","ScreenShakeY","ScreenShakeX","TimeSpeed","SpellCapEffect","Dialogue","NoEndingFunction","SpellPractice","subtractmisses","SetRaibysForm","FakeSouls","TimeFrozen","SetTimeFrozen","ExplosionX","ExplosionY"];

 let MenuSounds=["select","ok","ok2","cancel"];
 let GameSounds=[	"bomb","break","bubble","cancel","change","charge","charge2","charge3","crash","enemyexplode","exattack","explode","explode2","extend","guitar","guitar2","item","laser0","laser1","laser2",
			"laser3","laser4","laser5","light1","light2","lightning","nuke4","ok","select","shot0","shot1","shot2","shot3","shot4","slash","smallnuke","soul1","soul2","soul3","soul4"
			"timeout1","timeout2"];
 let soundtypeloaded=0;

  @Initialize{
	if(IsReplay==true){
		LoadCommonData;
		let optionsave=[GetOption(2),GetOption(4),GetOption(5),GetOption(6)];
		LoadCommonDataFromReplayFile;
		let optionsold=GetCommonData("OptionsMenu");
		optionsold[2]=optionsave[0]; optionsold[4]=optionsave[1]; optionsold[5]=optionsave[2]; optionsold[6]=optionsave[3];
		SetCommonData("OptionsMenu",optionsold);
	}
	else{LoadCommonData;SetCommonData("Random2",GetCommonDataDefault("Random",0));SetCommonData("Random",rand(0,999));SaveCommonDataInReplayFile;}
	playtime=GetCommonDataDefault("AWCPlaytime",playtime);
	v=0;
	loop(length(CommonDataDelete)){
		DeleteCommonData(CommonDataDelete[v]);
		v++;
	}
	DeleteSE("se\seEnemyExplode01.wav");
	DeleteCounterData;
	InitRandTable;
	v=0;
	ExpertEx(false,0,108); //debug, continues, lives
	SetClearFrameEffectEnable(false);
	SetRateScoreSystemEnable(false);
	LoadGraphic(stgwhite);
	LoadGraphic(imgLifebar);
	LoadGraphic(imgText);
	LoadGraphic(imgEffects);
	LoadGraphic(imgEnemy);
	LoadGraphic(ScoreBG1);
	LoadGraphic(ScoreBG2);
	LoadGraphic(LeafSmall3);
	LoadGraphic(imgLoading);
	LoadGraphic(imgLoading2);
	LoadGraphic(imgBorder);
	LoadGraphic(imgItems);
	LoadGraphic(imgFiller);
	LoadGraphic(GPSD~"img\spellcircle.png");
	LoadGraphic(GPSD~"img\white.png");
	LoadGraphic(GPSD~"img\spellnamebg.png");
	if(GetOption(5)==2){
		LoadGraphic(imgSoundThing);
	}
	SetCommonData("Skippable",0);
	SkipMenuCheck;
  }


task SkipMenuCheck{
	SetCommonData("InAWCMenu",1);
	if(GetCommonDataDefault("Stagenum",-2)==-1){	//tutorial
		LoadSounds(1);
		if(!IsAWCPlayer){
			DeleteCommonData("Stagenum");
			SaveCommonData;
			Retry;
		}
		DeleteCommonData("InAWCMenu");
		LoadDialoguePics([GetPlayerStrL,"meteo"]);
		InitBorder(false);
		SetDefaultStatusVisible(false);
		yield;
		menuanimate=2;
//		StageTask(41,0,0);
		PlayTutorial(GetCommonData("Tutorialnum"));
		//if(GetKeyState(VK_SKIP)==KEY_FREE){loop{yield;}}
		loop(60){yield;}
		DeleteCommonData("Stagenum");
		if(IsReplay==false){SaveCommonData;}
	}else if(GetCommonDataDefault("Stagenum",-2)>=0){	//stage practice or full game
		LoadSounds(1);
		DeleteCommonData("InAWCMenu");
		stage=GetCommonData("Stagenum");
		InitBorder(true);
		yield;
		menuanimate=2;
		stage=GetCommonData("Stagenum");
		StageTask(0,0,0);
		SetAllowedContinueCount(3);
		if(stage==8){
			SetAllowedContinueCount(0);
			ExtendPlayer(103-GetPlayerLife);
		}else{
			ExtendPlayer((GetOption(0)+101)-GetPlayerLife);
			if(IsInfiniteLives>0){
				ExtendPlayer(10000-GetPlayerLife);
			}
		}
		diff=GetCommonDataDefault("Diff",0);
		if(stage==0){fullgame=1;stage+=1;}
		let delay=0;
		let loops=0;
		if(IsAWCPlayer&&GetPlayer<6){
			if(ExPlayer&&GetPlayer<=1){
				LoadDialoguePics([GetPlayerStrL~"2"]);
			}else{
				LoadDialoguePics([GetPlayerStrL]);
			}
		}
		loop(fullgame*2+1){
			StageClear=0;

			fixedscroll=0;
			if(loops==0){
				InitStage(stage,delay,-1);
			}
			alternative(stage)
				case(1){stage1;}
				case(2){stage2(fullgame);}
				case(3){stage3(fullgame);}
				case(10,11,12){ExtraBoss(stage-10);}
			SetCommonData("BGInit",0);
//			FadeWhite(255,0,240);
			ForbidShot2(false);
			Wait(2);
//			if(SkipMenuEntirely==1&&GetKeyState(VK_SKIP)==KEY_FREE){
//				loop{yield;}
//			}
			if(loops==0){
				SetCommonData("Stagenum2",GetCommonData("Stagenum"));
			}else{
				SetCommonData("Stagenum2",GetCommonData("Stagenum2")+1);
			}
			if(!SkipMenuEntirely||GetKeyState(VK_SKIP)!=KEY_FREE){
				DeleteCommonData("Stagenum");
			}
			if(IsReplay==false){SaveCommonData;}
			while(StageClear==0&&ClearedGame==0){yield;}
			delay=2;
			loops=1;
			alternative(stage)
				case(1){S1final(fullgame);}
				case(2){S2final(fullgame);}
				case(3){S3final;}
				case(10){S10final;}
				case(11){S11final;}
				case(12){S12final;}
			if(fullgame==0){DeleteImages(stage);}
			if(ClearedGame==1){Clear;yield;}
			if(ClearedGame==2){FadeWhite(0,255,20);Wait(22);Retry;yield;}
			stage++;
		}
		if(IsAWCPlayer&&GetPlayer<6){
			if(ExPlayer&&GetPlayer<=1){
				DeleteDialoguePics([GetPlayerStrL~"2"]);
			}else{
				DeleteDialoguePics([GetPlayerStrL]);
			}
		}
		FadeWhite(0,255,20);Wait(22);Retry;yield;
	}
	else if(GetCommonDataDefault("Spellnum",-1)>=0){
		LoadSounds(1);
		yield;
		DeleteCommonData("InAWCMenu");
		setextralives=true;
		InitBorder(false);
		menuanimate=2;
		menuitem=GetCommonData("Spellnum");
		stage=spelln[menuitem*6+1];
		let stagesave=stage;
		SetCommonData("SpellPractice",1);
		InitStage(stage,0,spelln[menuitem*6+2]);
		StageTask(41,0,0);
		Wait(6);
		SetCommonData("Stagenum2",GetCommonData("Stagenum"));
		DeleteCommonData("Stagenum");
		if(IsReplay==false){SaveCommonData;}
		while(ClearedGame==0){
			yield;
		}
		FadeWhite(0,255,20);Wait(22);
		alternative(stagesave)
			case(1){S1final(0);}
			case(2){S2final(0);}
			case(3){S3final;}
			case(10){S10final;}
			case(10){S11final;}
			case(12){S12final;}

		if(ClearedGame==1){Clear;yield;}
		if(ClearedGame==2){Retry;yield;}
	}
	else if(GetCommonDataDefault("Spellexitnum",-1)>=0){
		LoadSounds(0);
		SetCommonData("SpellPracticeSelection",GetCommonData("Spellexitnum"));
		DeleteCommonData("Spellexitnum");
		SaveCommonData;
		StageTask(40,40,1);
		mainmenuselection=3;
	}else{
		LoadSounds(0);
		StageTask(1,60,1);
	}
}
task WaitClear{
	WaitForZeroEnemy;Clear;
}

  function MenuTreeMain{
	fullgame=0;
	MainMenu;
	yield;
	GameMode=menuitem;
	return (menuitem+1)*10;
  }
  function MenuTreeStage{
	DeleteCommonData("NoSpawnPoints");
	StageSelect;
	let ret=31;
	if(menucancel==1){
		ret=1;
	}
	return ret;
  }
  function MenuTreeExtra{
	DeleteCommonData("NoSpawnPoints");
	SetCommonData("Diff",3);
	stage=8;
	let ret=100;
	if(menucancel==1){
		ret=1;
	}
	return ret;
  }
  function MenuTreeStart{
	let ret=11;
//	if(GetKeyState(VK_SLOWMOVE)!=KEY_FREE){
//		yield;
//		DeleteCommonData("NoSpawnPoints");
//		stage=shortcut;
//		diff=shortdiff;
//		SetCommonData("Diff",shortdiff);
//		diffselect=1;
//		ret=100;
//	}else{
		yield;
		DeleteCommonData("NoSpawnPoints");
		stage=0;
		diffselect=1;
		fullgame=1;
//	}
	if(menucancel==1){
		ret=1;
	}
	return ret;
  }
  function MenuTreeSpell{
	let ret=1;
	CreateMenu(numspells,1,0);
	SpellPractice;
	yield;
	while(diffselect==0){yield;}
	stage=spelln[menuitem*6+1];
	ret=41;
	if(menucancel==1){
		ret=1;
	}
	DeleteCommonData("Stagenum");
	if(ret==41&&IsAWCPlayer){
		let spellnum=menuitem;
		ret=PlayerSelect(UnlockedCharacters,false);
		if(ret==1){ret=41;}
		if(ret==0){
			loop(5){yield;}
			ret=40;
			InMenu=0;
			MenuItemDelay(spellnum,1);
		}
	}
	return ret;
  }
  function MenuTreeSpellSpawn{
	SpellSpawn(menuitem);
	GameMode=3;
	ForbidShot2(false);
	ForbidBomb(true);
	SetCommonData("NoSpawnPoints",1);
	loop{yield;}
  }
  function MenuTreeTutorial{
	DeleteCommonData("NoSpawnPoints");
	Tutorial;
	SetCommonData("Tutorialnum",menuitem);
	if(menucancel==1){
		return 1;
	}else{
		Wait(15);
		FadeWhite(0,255,40);
		Wait(45);
		SetCommonData("Stagenum",-1);
		if(IsReplay==false){SaveCommonData;}
		Retry;
		Wait(600);
		return 1;
	}
  }
  function MenuTreeDifficulty{	//for stage practice
	diff=DifficultySelect(DifficultySeenArray(stage-1));
	SetCommonData("Diff",diff);
	let ret=100;
	if(menucancel==1){
		ret=30;
	}
	return ret;
  }
  let setextralives=false;
  function MenuTreeDifficulty2{	//for full game
	diff=DifficultySelect([true,true,true,false]);
	SetCommonData("Diff",diff);
	let ret=100;
	if(menucancel==1){
		ret=1;
	}
	return ret;
  }
  function MenuTreeResults{
	ResultsScreen;
	return 1;
  }
  function MenuTreeMusicRoom{
	MusicRoom;
	return 1;
  }
  function MenuTreeOptions{
	Options;
	yield;
	while(diffselect==0){yield;}
	return 1;
  }

  let laststart=0;
  function MenuTree(start){
	while(start>0){
		if(start!=100){
			laststart=start;
		}
		alternative(start)
			case(1){start=MenuTreeMain;}
			case(10){start=MenuTreeStart;}
			case(11){start=MenuTreeDifficulty2;}
			case(20){start=MenuTreeTutorial;}
			case(90){start=MenuTreeExtra;}
			case(30){start=MenuTreeStage;}
			case(31){start=MenuTreeDifficulty;}
			case(40){start=MenuTreeSpell;}
			case(41){start=MenuTreeSpellSpawn;}
			case(50){start=MenuTreeResults;}
			case(60){start=MenuTreeMusicRoom;}
			case(70){start=MenuTreeOptions;}
			case(80){Clear;break;}
			case(100){start=StartGame;}
	}
  }
  function StartGame{
	let ret=0;
	if(IsAWCPlayer){
		ret=PlayerSelect(AllowedCharacterArray(stage-1,diff),true);
		if(ret==0){
			return laststart;
		}
	}else{
		SSE("ok");
		SE("ok2");
	}
	SetCommonData("Stagenum",stage);
	FadeOutMusic(titlemusic,30);
	Wait(30);
	FadeWhite(0,255,45);
	Wait(50);
	if(IsReplay==false){SaveCommonData;}
	Retry;
	Wait(600);
  }
  
  task StageTask(startmenu,delay,menubg){
	yield;
	loop(delay-1){
		yield;
	}
	MenuTree(startmenu);
  }
  function InitStage(stage,delay,substage){
	ClearByteCodeCash;
	DeleteCommonData("SPELLS_CAPTURED_STAGE");
	DeleteCommonData("SPELLS_TIMEOUTED_STAGE");
	SetCommonData("Loading",1);

	if(substage>=0){
		if(stage==1){
			S1Alt(substage);
		}
		if(stage==3){
			S3Alt(substage);
		}
	}
	ClearBossList;
	alternative(stage)
		case(1){S1init(delay);}
		case(2){S2init(delay);}
		case(3){S3init(delay);}
		case(10){S10init(delay);}
		case(11){S11init(delay);}
		case(12){S12init(delay);}

	LoadImages(stage,delay);
	DeleteCommonData("Loading");
  }

 @MainLoop{
	if(diffselect==1){
		if(GameMode>=3){
			SetAllowedContinueCount(3);
			ExtendPlayer(107-GetPlayerLife);
		}
		diffselect=0;
	}

	StageFunctions;
	if(!timefrozen&&GetCommonDataDefault("InAWCMenu",0)==0){
		if(BGOpacity<1&&drawbackground){
			alternative(stage)
				case(0){TutorialBGLogic;}
				case(1){S1BGLogic;}
				case(2){S2BGLogic;}
				case(3){S3BGLogic;}
				case(10){S10BGLogic;}
				case(11){S11BGLogic;}
				case(12){S12BGLogic;}
		}
		drawbackground=true;
		RunBGLogic;
	}
	if(GetPlayerY<60){SetPlayerY(60);}
	yield;
}

  @BackGround{
	if(stagetaskrun==0){
		if(GetCommonDataDefault("Spellnum",-1)<0&&GetCommonDataDefault("Stagenum",-2)==-2){
			LoadMenus;
			InitObjects;
			MenuBG;
		}else{
			FadeWhite(255,0,90);
		}
		stagetaskrun++;
	}
	if(GetOption(5)==0&&GetCommonDataDefault("InAWCMenu",0)==0&&GetCommonDataDefault("Loading",0)==0&&StageClear==0){
		if(BGOpacity<1&&drawbackground){
			alternative(stage)
				case(0){TutorialBG;}
				case(1){S1BG;}
				case(2){S2BG;}
				case(3){S3BG;}
				case(10){S10BG;}
				case(11){S11BG;}
				case(12){S12BG;}
		}
		RunBGs;
	}
  }

  @Finalize{
	DeleteSounds;
	DeleteAllImages;
	DeleteGraphic(stgwhite);
	DeleteGraphic(imgLifebar);
	DeleteGraphic(imgText);
	DeleteGraphic(imgEffects);
	DeleteGraphic(imgEnemy);
	DeleteGraphic(ScoreBG1);
	DeleteGraphic(ScoreBG2);
	DeleteGraphic(LeafSmall3);
	DeleteGraphic(imgLoading);
	DeleteGraphic(imgLoading2);
	DeleteGraphic(imgBorder);
	DeleteGraphic(imgItems);
	DeleteGraphic(imgFiller);
	DeleteGraphic(imgSelector);
	DeleteGraphic(imgSoundThing);
	DeleteGraphic(GPSD~"img\spellcircle.png");
	DeleteGraphic(GPSD~"img\white.png");
	DeleteGraphic(GPSD~"img\gameover.png");
	DeleteGraphic("statusbar");
	if(difftexture!=""){
		DeleteGraphic(difftexture);
	}
  }

}