#TouhouDanmakufu[Player]
#ScriptVersion[3]
#ID["DCS_MAGICTEAM"]
#Title["h薂@`["]
#Text["h薂@`["]
#ReplayName["MagicTeam"]

let testGrazeCount = 0;

// Player global and required
let playerID = GetPlayerObjectID;
let playerObj = ObjPrim_Create(OBJ_SPRITE_2D);
let teamanm = 0;
let teamanm2 = 0;
let count = -1;
let baseLaserScale = 6;
let scanScreen = [];						// array to store all enemyID.
let isFocus = false;
let isSpell = false;
let isSpellMarisa = 0;
let isSpellArisu = 1;
let breakOut = false; 

// Shot sheet
let shotMagic = "script/player/dcs_player/shot_magic.txt";

let hitboxObj = ObjPrim_Create(OBJ_SPRITE_2D);

// Libraries
#include "script/thdcs/functions/function_loaddata.txt"
#include "script/player/dcs_player/functions/player_global.txt"
#include "script/thdcs/functions/const_sound.txt"

@Initialize {
	LoadPlayerShotData(shotMagic); 
	plyHitbox(GetPlayerX,GetPlayerY);			
	SetPlayerSpeed(5,2.5);
	ObjPlayer_AddIntersectionCircleA1(playerID,0,0,2,32);
	SetPlayerClip(0+6,0+24,384-6,448-16);
	SetPlayerRebirthFrame(30);
	SetPlayerDownStateFrame(60);
	SetPlayerAutoItemCollectLine(120);
	
	// Render the player
	renderPlayer;	
	shanghai(GetPlayerX,GetPlayerY);
}

@Event {
	alternative(GetEventType)
	
	case(EV_REQUEST_SPELL) {
		let bombStock = GetPlayerSpell;
		if(GetPlayerSpell > 0) { 
			if(isFocus) { 
				SetScriptResult(true); 
				SetPlayerSpell(bombStock - 1);
				spellCard(isSpellArisu); 
			}
			else { 
				SetScriptResult(true); 
				SetPlayerSpell(bombStock - 1);
				spellCard(isSpellMarisa); 			
			}
		}
		else { 
			SetScriptResult(false); 
		}		
	}
	case(EV_GRAZE) {
	    testGrazeCount++;

		PlaySFX(SFX_GRAZE);
	}
	case(EV_HIT) {
		PlaySFX(SFX_PLDEAD00);
		playerPichuunEffect;	
	}
	case(EV_PLAYER_SHOOTDOWN) {
		pichuunHandler;
		PlaySFX(SFX_PLDEAD01);
		PlaySFX(SFX_PLDEAD01);
		DeleteShotAllEX(TYPE_SHOT,TYPE_IMMEDIATE,GetPlayerX,GetPlayerY);
	}
	case(EV_PLAYER_REBIRTH) {
		SetPlayerSpell(2);
		SetPlayerInvincibilityFrame(240);
		invincEffect(240);
		SetForbidPlayerShot(false);
		SetForbidPlayerSpell(false);
	}
}

@MainLoop {
	// scanScreen updater
	scanScreen = GetAllEnemyID;
	
	if(!isSpell && IsPermitPlayerShot) {
		// counter for shot
		if((GetVirtualKeyState(VK_SHOT) == KEY_PUSH || GetVirtualKeyState(VK_SHOT) == KEY_HOLD) && count == -1) {
				count = 0;
		}
		// Alice
		if(GetVirtualKeyState(VK_SLOWMOVE) == KEY_PUSH || GetVirtualKeyState(VK_SLOWMOVE) == KEY_HOLD) {
			if(count%5 == 0) {
				shanghaiLaser(GetPlayerX, GetPlayerY-32, 0.080);
				baseLaserScale = 14;
			}
		} 
		// Marisa
		else {
			if(count%5 == 0) {
				CreatePlayerShotA1(GetPlayerX-8, GetPlayerY-20, 20, 270, 0.25, 1, 1);
				CreatePlayerShotA1(GetPlayerX+8, GetPlayerY-20, 20, 270, 0.25, 1, 1);

				CreatePlayerShotA1(GetPlayerX-20, GetPlayerY, 20, 270, 0.5, 1, 1);
				CreatePlayerShotA1(GetPlayerX+20, GetPlayerY, 20, 270, 0.5, 1, 1);

				CreatePlayerShotA1(GetPlayerX-20, GetPlayerY+15, 20, 265, 0.25, 1, 1);
				CreatePlayerShotA1(GetPlayerX+20, GetPlayerY+15, 20, 275, 0.25, 1, 1);
				PlaySFX(SFX_PSHOT);
			}
		}      
		if(count >= 0) {
			count++;
		}
		if(count >= 10 && (GetVirtualKeyState(VK_SLOWMOVE) == KEY_PUSH || GetVirtualKeyState(VK_SLOWMOVE) == KEY_HOLD)) {
			count=-1;
		}
		if(count >= 20) {
			count=-1;
		}
	}
	yield;
}

//----------------------------------------------------------------------------------------------------------------------------------------
// Render the player
task renderPlayer {

	ObjRender_SetPosition(playerObj,GetPlayerX,GetPlayerY,0);
	ObjPrim_SetTexture(playerObj,teamtex); 
	Obj_SetRenderPriorityI(playerObj,31);
	ObjRender_SetBlendType(playerObj,BLEND_ALPHA);
	ObjRender_SetAngleXYZ(playerObj,0,0,0);
	ObjRender_SetScaleXYZ(playerObj,1,1,0);
	ObjRender_SetAlpha(playerObj,255);
	ObjSprite2D_SetSourceRect(playerObj,0,0,32,48);
	ObjSprite2D_SetDestCenter(playerObj);	
	
	while(!Obj_IsDeleted(playerObj)) {
		ObjRender_SetPosition(playerObj,GetPlayerX,GetPlayerY,0);
		
		if(GetVirtualKeyState(VK_SLOWMOVE) == KEY_PUSH || GetVirtualKeyState(VK_SLOWMOVE) == KEY_HOLD) { 
			if(!isSpell) { isFocus = true; } 
			 
		} 
		if(GetVirtualKeyState(VK_SLOWMOVE) == KEY_PULL ) { 
			if(!isSpell) { isFocus = false;  } 
		} 
		
		if(GetVirtualKeyState(VK_LEFT) == KEY_HOLD) { ObjRender_SetAngleY(playerObj,0); }
		if(GetVirtualKeyState(VK_RIGHT) == KEY_HOLD) { ObjRender_SetAngleY(playerObj,180); }
		if(!isFocus) {  ObjRender_SetAngleY(playerObj,0); }
		
		// Regular mode (main)
		if(!isFocus) {
			// Left side animation
			if(GetVirtualKeyState(VK_LEFT) == KEY_PUSH || GetVirtualKeyState(VK_LEFT) == KEY_HOLD) { 
				ObjRender_SetAngleY(playerObj,0);
				ObjSprite2D_SetSourceRect(playerObj,0,48,32,96);
			}
			// Right side animation
			else if(GetVirtualKeyState(VK_RIGHT) == KEY_PUSH || GetVirtualKeyState(VK_RIGHT) == KEY_HOLD) {
				ObjRender_SetAngleY(playerObj,180);
				ObjSprite2D_SetSourceRect(playerObj,0,48,32,96);
			} 
			// Idle animation
			else { 
				ObjSprite2D_SetSourceRect(playerObj,0,0,32,48); 
			}
			ObjRender_SetAlpha(hitboxObj,0);
		}
		
		// Focus mode (partner switch)
		if(isFocus) { 
			// Left side animation
			if(GetVirtualKeyState(VK_LEFT) == KEY_PUSH || GetVirtualKeyState(VK_LEFT) == KEY_HOLD) { 
				ObjRender_SetAngleY(playerObj,180);
				ObjSprite2D_SetSourceRect(playerObj,128,48,160,96);
			}
			// Right side animation
			else if(GetVirtualKeyState(VK_RIGHT) == KEY_PUSH || GetVirtualKeyState(VK_RIGHT) == KEY_HOLD) {
				ObjRender_SetAngleY(playerObj,0);
				ObjSprite2D_SetSourceRect(playerObj,128,48,160,96); 
			}
			// Idle animation
			else { 
				ObjSprite2D_SetSourceRect(playerObj,128,0,160,48);
			}
			ObjRender_SetAlpha(hitboxObj,255);
		}
		yield;
	}
} 

// The actual laser for Alice's shot
task shanghai(x,y) {
	let obj = ObjPrim_Create(OBJ_SPRITE_2D);
	let obj2 = ObjPrim_Create(OBJ_SPRITE_2D);
	let obj3 = ObjPrim_Create(OBJ_SPRITE_2D);
	let spinny = 0;
	let rocky = 0;
	let rockyf = 0;
	
	ObjPrim_SetTexture(obj,teamtex);
	ObjRender_SetBlendType(obj,BLEND_ALPHA);
	Obj_SetRenderPriorityI(obj,40);
	ObjRender_SetPosition(obj,x,y,0);
	ObjRender_SetScaleXYZ(obj,0.8,0.8,0);
	ObjSprite2D_SetSourceRect(obj,128,154,160,184);
	ObjSprite2D_SetDestCenter(obj);

	ObjPrim_SetTexture(obj2,teamtex);
	ObjRender_SetBlendType(obj2,BLEND_ADD_ARGB);
	Obj_SetRenderPriorityI(obj2,41);
	ObjRender_SetPosition(obj2,x,y,0);
	ObjRender_SetScaleXYZ(obj2,0.5,0.5,0);
	ObjSprite2D_SetSourceRect(obj2,204,171,243,211);
	ObjSprite2D_SetDestCenter(obj2);	
	ObjRender_SetColor(obj2,255,128,32);
	
	ObjPrim_SetTexture(obj3,teamtex);
	ObjRender_SetBlendType(obj3,BLEND_ADD_ARGB);
	Obj_SetRenderPriorityI(obj3,40);
	ObjRender_SetPosition(obj3,x,y,0);
	ObjRender_SetScaleXYZ(obj3,0.5,0.5,0);
	ObjSprite2D_SetSourceRect(obj3,204,171,243,211);
	ObjSprite2D_SetDestCenter(obj3);	
	ObjRender_SetColor(obj3,255,255,255);
	
	while(! Obj_IsDeleted(obj)) {
		spinny+=20;
		ObjRender_SetAngleZ(obj3,spinny);
		ObjRender_SetAngleZ(obj,rocky);
		rocky = cos(rockyf)*8;
		
		ObjRender_SetPosition(obj,GetPlayerX,GetPlayerY-32,0);
		ObjRender_SetPosition(obj2,GetPlayerX,GetPlayerY-48,0);
		ObjRender_SetPosition(obj3,GetPlayerX,GetPlayerY-48,0);
		
		if(isFocus) { 
			ObjRender_SetAlpha(obj,255); 
			if(!isSpell && (GetVirtualKeyState(VK_SHOT) == KEY_PUSH || GetVirtualKeyState(VK_SHOT) == KEY_HOLD)) { 
				ObjRender_SetAlpha(obj2,255); 
				ObjRender_SetAlpha(obj3,255); 
				rockyf+= 0; rocky = 0;
			}
			else { 
				ObjRender_SetAlpha(obj2,0); 
				ObjRender_SetAlpha(obj3,0); 
				rockyf+=4;
			}
		}
		else { ObjRender_SetAlpha(obj,0); ObjRender_SetAlpha(obj2,0); ObjRender_SetAlpha(obj3,0); }
		yield;
	}
}

// Dummy task to handle the damage for Alice' shot
task shanghaiLaser(x,y,dmg) { 

	let obj = ObjShot_Create(OBJ_STRAIGHT_LASER);
	ObjShot_Regist(obj);

	ObjMove_SetPosition(obj,x,y);
	ObjShot_SetSourceBlendType(obj,BLEND_ADD_ARGB);
	ObjShot_SetGraphic(obj,1);
	ObjStLaser_SetSource(obj,true);
	Obj_SetRenderPriorityI(obj,30);
	ObjLaser_SetLength(obj,1024);
	ObjLaser_SetInvalidLength(obj,0,0);
	ObjLaser_SetRenderWidth(obj,baseLaserScale);
	ObjStLaser_SetAngle(obj,270);
	ObjShot_SetDelay(obj,0);
	ObjShot_SetDamage(obj,dmg);
	ObjShot_SetPenetration(obj,1);
	ObjShot_SetIntersectionLine(obj,GetPlayerX,GetPlayerY-32,GetPlayerX,GetPlayerY-1024,baseLaserScale);
	ObjShot_SetDeleteFrame(obj,0);
	ObjRender_SetAlpha(obj,0);

	shanghaiLaserEff(x,y);

	while(!Obj_IsDeleted(obj)) {
		ObjShot_SetIntersectionLine(obj,x,y-32,x,y-1024,baseLaserScale);
		ObjLaser_SetRenderWidth(obj,baseLaserScale);
		ObjRender_SetAlpha(obj,0);
		yield;
	}
}

// The actual laser for Alice's shot
task shanghaiLaserEff(x,y) {
	let obj = ObjPrim_Create(OBJ_SPRITE_2D);
	let obj2 = ObjPrim_Create(OBJ_SPRITE_2D);

	let glide = 0;
	let alphret = 254;
	let c = 0;
	let laserW = baseLaserScale/2;
	
	ObjPrim_SetTexture(obj,teamtex);
	ObjRender_SetBlendType(obj,BLEND_ALPHA);
	Obj_SetRenderPriorityI(obj,29);
	ObjRender_SetPosition(obj,x,y-270,0);
	ObjRender_SetScaleXYZ(obj,1,0.5,0);
	ObjSprite2D_SetSourceRect(obj,0,250,512,268);
	ObjSprite2D_SetDestCenter(obj);
	
	ObjPrim_SetTexture(obj2,sukimalaserglow);
	ObjRender_SetBlendType(obj2,BLEND_ADD_ARGB);
	Obj_SetRenderPriorityI(obj2,29);
	ObjRender_SetPosition(obj2,x,y-270,0);
	ObjRender_SetScaleXYZ(obj2,0.5,1,0);
	ObjSprite2D_SetSourceRect(obj2,0,0,64,512);
	ObjSprite2D_SetDestCenter(obj2);
	
	// Set the angle depending on the previous
	ObjRender_SetAngleZ(obj,270);
	colorMixer(obj2,255,255,0,0); 
	
	while(! Obj_IsDeleted(obj)) {
		c++;
		glide+=4;
		ObjRender_SetScaleXYZ(obj,1,0.5+(baseLaserScale/25),0);
		ObjRender_SetScaleXYZ(obj2,0.5+(baseLaserScale/25),1,0);
		
		ObjSprite2D_SetSourceRect(obj,0-glide,250,512-glide,268);
		ObjRender_SetAlpha(obj,alphret/3); ObjRender_SetAlpha(obj2,alphret/8);
		alphret-=8;
		if(alphret <= 0) { Obj_Delete(obj); Obj_Delete(obj2); break; } 

		yield;
	}
	Obj_Delete(obj); Obj_Delete(obj2);	
}

// Task to summon the spell card + deal damage. Type determines which char uses.
task spellCard(type) { 
	let colSet = [[255, 16, 16],[16,255,16],[16,16,255],[16,255,255],[255,16,255],[255,255,16],[255,128,16]]; // red, green, blue, cyan, purple, yellow, orange
	let colKies = 0;
	let dir = 0;	
	
	SetForbidPlayerShot(true);
	SetForbidPlayerSpell(true);	
	PlaySFX(SFX_CAT00);

	playerFunkyCircle;
	playerFunkyCircle2;
	
	// Marisa's bomb handling
	if(type == isSpellMarisa) { 
		magicCircleMagic(GetPlayerX,GetPlayerY);
		SetPlayerInvincibilityFrame(300);
		SetPlayerSpeed(1,1);
		isSpell = true;
		quakeCam2DPlay(4,240);
		quakeCam3DPlay(1,240);
	
		// sfx randomizer
		let randomsfx = rand_int(0,2);
		if(randomsfx == 0) { }
		if(randomsfx == 1) { }	
		PlaySFX(SFX_NEP00);
		PlaySFX(SFX_BZZ);
		wait(30);
		ascent(i in 0..100) {
			PlaySFX(SFX_GUN00);
			dir = rand(230,310);
			colKies = rand_int(0,7); 
			scatterMasterSparkLaser(GetPlayerX,GetPlayerY,dir,255,255,255);
			ascent(p in 0..1) { playerGlitterEffect(GetPlayerX,GetPlayerY,rand(1,3),rand_int(0,359),2,255,colSet[colKies][0],colSet[colKies][1],colSet[colKies][2]); }
			wait(2);
		}
		playerBreakEffect;	
		isSpell = false;
		breakOut = true;	
		wait(1);
		SetPlayerSpeed(5,2.5);
	}

	// Arisu's bomb handling
	if(type == isSpellArisu) { 
		magicCircleMagic(GetPlayerX,GetPlayerY);
		SetPlayerInvincibilityFrame(360);
		SetPlayerSpeed(2,2);
		isSpell = true;
		let randomsfx = rand_int(0,2);
		if(randomsfx == 0) { }
		if(randomsfx == 1) { }		
		let placement = 270;
		ascent(i in 0..5) { 
			dancingShangaiDoll(GetPlayerX+1*cos(placement),GetPlayerY+1*sin(placement),placement,1); 
			placement+=360/5; 
			wait(5); 
		}
		wait(80);
		dance = 1;
		adjustBGMVol(GetAreaCommonData("sound","song",0), 70);
		PlaySFX(SFX_FEVER00);
		wait(240);
		playerBreakEffect;		
		breakOut = true;	
		wait(1);
		dance = 0;
		isSpell = false;
		let systemBGMVolumeLevel = GetAreaCommonData("system", "bgmvol", 100);
		adjustBGMVol(GetAreaCommonData("sound","song",0), systemBGMVolumeLevel);
		SaveCommonDataAreaA1("sound");	
		SetPlayerSpeed(5,2.5);
		if(GetVirtualKeyState(VK_SLOWMOVE) != KEY_HOLD) { isFocus = false; } 		
	}
	Obj_Delete(GetSpellManageObject);
	SetForbidPlayerShot(false);
	SetForbidPlayerSpell(false);
	breakOut = false;	
}


