///Player Sprites v1.1 for RPG.zh 0.97.6

//This .zlib creates a weapon sprite, using lweapon Player, that is always above Link, and acts as a stand-in for his sprite. 
//The reason for using a sprite, is that it is animated.

import "std.zh"
int PlayerSprites[3074] = {88}; //Why 3074? It's a merged array. See constants at 136 to 143.

const int OLD_LINK_TILE = 1;
const int ZQ_LAST_TILE = 65519;
const int ZQ_BLANK_TILE = 65518;

const int TILES_BACKUP = 62560;
const int TILES_BLANK = 65000;

const int BASE_TILE = 35620;
const int TILE_LENGTH = 260; //EACH TILE PAGE CONTAINS 259 TILES.

const int ZQ_SPRITE_BLANK = 255;

//Conditional Constants
const int COND_DALEK = 4;
const int SPRITE_DALEK_SAUCER = 0;

//bool IsInvisible;
//bool TilesCopiedInvis;
//bool TilesCopiedVis = true;

//int LastLinkX; //These are no longer needed.
//int LastLinkY;
//bool LinkMoved;


//int PlayerFrameDelay; //These need to be in an array, to match the size of PlayerSprites (512)
//int PlayerFrame;

//int IsInvisible[512]; //Array to hold if Link should be invisible, per DMAP.
//int SpriteAnimFrameDelay[512];
//int SpriteAnimFrames[512];



//Sets the starting frame.
void SetPlayerSpriteFrames(int dmap, int frames){
	PlayerSprites[dmap+EW_PLAYER_SPRITE_ANIM] = frames;
}

int GetPlayerSpriteFrames(int dmap){
	return PlayerSprites[dmap+EW_PLAYER_SPRITE_ANIM];
}

void IncreasePSF(int dmap){
	PlayerSprites[dmap+EW_PLAYER_SPRITE_ANIM]++;
}

void SetPlayerSpriteAnimDelay(int dmap, int delay){
	PlayerSprites[dmap+EW_PLAYER_SPRITE_ANIM_DELAY] = delay;
}

int GetPlayerSpriteAnimDelay(int dmap){
	return PlayerSprites[dmap+EW_PLAYER_SPRITE_ANIM_DELAY];
}

void SetPlayerSpriteAnimDelayDuration(int dmap, int dur){
	PlayerSprites[dmap+EW_PLAYER_TIME_OF_DELAY] = dur;
}

int GetPlayerSpriteAnimDelayDuration(int dmap){
	return PlayerSprites[dmap+EW_PLAYER_TIME_OF_DELAY];
}

//Sets the number of frames.
void SetPlayerSpriteNumberOfFrames(int dmap, int frames){
	PlayerSprites[dmap+EW_PLAYER_NUMBER_OF_FRAMES] = frames;
}

int GetPlayerSpriteNumberOfFrames(int dmap){
	return PlayerSprites[dmap+EW_PLAYER_NUMBER_OF_FRAMES];
}
	
	

void IncreasePSAD(int dmap){
	PlayerSprites[dmap+EW_PLAYER_SPRITE_ANIM_DELAY]++;
}

void SetIsInvisible(int dmap, bool setting){
	int set;
	if ( setting ) set = 1;
	PlayerSprites[dmap+EW_PLAYER_INVISIBLE] = set;
}

void SetIsInvisible(int dmap, int value){
	PlayerSprites[dmap+EW_PLAYER_INVISIBLE] = value;
}

bool GetIsInvisible(int dmap){
	bool set = PlayerSprites[dmap+EW_PLAYER_INVISIBLE];
	if ( set ) return true;
	else return false;
}

//Call in ~Init to set up sprites for each DMAP.
void SetPlayerSpriteOptions(int dmap, int sprite, bool invis, int frames, int delay, int numFrames, int framesDur){
	SetPlayerSprite(dmap,sprite);
	SetIsInvisible(dmap,invis);
	SetPlayerSpriteFrames(dmap,frames);
	SetPlayerSpriteAnimDelay(dmap,delay);
	SetPlayerSpriteNumberOfFrames(dmap,numFrames);
	SetPlayerSpriteAnimDelayDuration(dmap,framesDur);
}

global script Init{
	void run(){
		Link->Invisible = true;
		SetPlayerSpriteOptions(0,88,true,0,0,6,10);
	}
}

void PlayerTilesCopied(int setting){
	PlayerSprites[SPRITES_COPIED] = setting;
}

int PlayerTilesCopied(){
	return PlayerSprites[SPRITES_COPIED];
}

void PlayerTilesRestored(int setting){
	PlayerSprites[SPRITES_RESTORED] = setting;
}

int PlayerTilesRestored(){
	return PlayerSprites[SPRITES_RESTORED];
}
	
//condense these all into one array, and then use these constants:

const int EW_PLAYER_SPRITE = 0;
const int EW_PLAYER_INVISIBLE = 512;
const int EW_PLAYER_SPRITE_ANIM = 1024;
const int EW_PLAYER_SPRITE_ANIM_DELAY = 1536;
const int EW_PLAYER_NUMBER_OF_FRAMES = 2048;
const int EW_PLAYER_TIME_OF_DELAY = 2560;
const int SPRITES_COPIED = 3072;
const int SPRITES_RESTORED = 3073;

const int INVIS_NOT_COPIED = 1;
const int INVIS_COPIED = 2;
const int VIS_NOT_COPIED = 3;
const int VIS_COPIED = 0;



global script active{
	void run(){
		SetPlayerSpriteOptions(0,88,true,0,0,6,10);
		Link->Invisible = true;
		int SpriteLink[512]={88}; //Populate with the sprite for Link, based on the DMAP.
		int LinkTile;
		int curDMAP;
		while ( true ) {
			//Trace(Link->Tile);
			if ( Game->GetCurDMap() != curDMAP ) curDMAP = Game->GetCurDMap();
			if ( Link->PressEx1 ) {
				if ( !GetIsInvisible( Game->GetCurDMap() ) ) {
					SetIsInvisible(Game->GetCurDMap(),true);
				}
				else SetIsInvisible(Game->GetCurDMap(),false);
			}
			
			//if ( Link->X == LastLinkX && Link->Y == LastLinkY ) LinkMoved = false;
			//if ( Link->X != LastLinkX || Link->Y != LastLinkY ) {
			//	LastLinkY = Link->Y;
			//	LastLinkX = Link->X;
			//	LinkMoved = true;
			//}
			//PlayerFrameDelay++;
			PlayerSprites[curDMAP+EW_PLAYER_SPRITE_ANIM_DELAY]++;
			
			if ( PlayerSprites[curDMAP+EW_PLAYER_SPRITE_ANIM_DELAY] >= PlayerSprites[curDMAP+EW_PLAYER_TIME_OF_DELAY] ) {
				PlayerSprites[curDMAP+EW_PLAYER_SPRITE_ANIM]++;
				PlayerSprites[curDMAP+EW_PLAYER_SPRITE_ANIM_DELAY] = 0;
				
			}
			if ( PlayerSprites[curDMAP+EW_PLAYER_SPRITE_ANIM] >= PlayerSprites[curDMAP+EW_PLAYER_NUMBER_OF_FRAMES] ) PlayerSprites[curDMAP+EW_PLAYER_SPRITE_ANIM] = 0;
			
			
			if ( GetIsInvisible( Game->GetCurDMap() ) && !PlayerTilesCopied() ) {
				for ( int q = 0; q < TILE_LENGTH; q++ ) {
					CopyTile(BASE_TILE+q, TILES_BACKUP+q);
					CopyTile(TILES_BLANK+q, BASE_TILE+q);
				}
				PlayerTilesCopied(1);
				PlayerTilesRestored(0);
			}
			
			if ( !GetIsInvisible(Game->GetCurDMap() ) && !PlayerTilesRestored() ) {
				for ( int q = 0; q < TILE_LENGTH; q++ ) {
					CopyTile(TILES_BACKUP+q, BASE_TILE+q); 
				}
				PlayerTilesCopied(0);
				PlayerTilesRestored(1);
			}
			
			
			LinkTile = Link->Tile;
			//if ( IsInvisible && !TilesCopiedInvis && TilesCopiedVis ) {
			//	TilesCopiedVis = false;
			//	TilesCopiedInvis = true;
			//	for ( int q = 0; q < TILE_LENGTH; q++ ) {
			//		CopyTile(BASE_TILE+q, TILES_BACKUP+q);
			//		CopyTile(TILES_BLANK+q, BASE_TILE+q);
			//	}
			//	
			//}
			//if ( !IsInvisible && TilesCopiedInvis && !TilesCopiedVis ) {
			//	TilesCopiedInvis = false;
			//	TilesCopiedVis = true;
			//	
			//	int S_Rest[]="Restoring Tiles";
			//	TraceS(S_Rest);
			//	for ( int q = 0; q < TILE_LENGTH; q++ ) {
			//		CopyTile(TILES_BACKUP+q, BASE_TILE+q); 
			//		//CopyTile(TILES_BLANK+q, TILES_BACKUP+q);
			//	}
				
				
			//}
			
			//if ( Link->Tile != ZQ_BLANK_TILE ) {
			//	CopyTile(LinkTile,ZQ_LAST_TILE);
			//	CopyTile(ZQ_BLANK_TILE,LinkTile);
			//}
			eweapon PlayerSprite = Screen->CreateEWeapon(EW_SCRIPT10);
			PlayerSprite->X = Link->X;
			PlayerSprite->Y = Link->Y;
			PlayerSprite->CollDetection = false;
			PlayerSprite->Dir = Link->Dir;
			PlayerSprite->Flip = Link->Flip;
			PlayerSprite->Frame = PlayerSprites[curDMAP+EW_PLAYER_SPRITE_ANIM];
			
			int player_sprite;
			if ( PlayerSprites[curDMAP] == 0 ) player_sprite = ZQ_SPRITE_BLANK;
			else player_sprite = PlayerSprites[curDMAP];
			PlayerSprite->UseSprite(player_sprite);
			Waitdraw();
			//if ( LinkMoved) 
			PlayerSprite->DeadState = WDS_DEAD;
			//PlayerSprite(PlayerSprite,SpriteLink);
			Waitframe();
		}
	}
	void PlayerSprite(int SpriteLink, int sprite){
		SpriteLink[0] = sprite;
	}
	
}

void SetPlayerSprite(int dmap, int sprite){
	PlayerSprites[dmap] = sprite;
}

item script PlayerSprites{ 
	void run(int SpriteLink){
		//PlayerSprites[0]=Rand(1,50);
		//if ( !IsInvisible ) {
		//	IsInvisible = true;
		//}
		//else IsInvisible = false;
		
	}
}


//Link->Invisible = true; //Set Link to be invisible.



//This cannot be imported. The functions must be made local (in scope) to the global active script, for the pointers to work. 
void PlayerSprite(int condition){ //Condition should be tied to one index of GameDynamics, and called as:
	// PlayerSprite(Val(PLAYER_SPRITE));
	if ( Player->Collision ) {
		Player->Collision = false; //Turn collision off go
	}
	if ( Player->X != Link->X ){ //Mirror Link's position, and direction.
		Player->X = Link->X;
	}
	if ( Player->X != Link->Y ){
		Player->X = Link->Y;
	}
	if ( Player->X != Link->Z ){
		Player->X = Link->Z;
	}
	if ( Player->X != Link->Dir ){
		Player->X = Link->Dir;
	}
	if ( Player->X != Link->Flip ){
		Player->X = Link->Flip;
	}
	if ( ! UseSprite( Val(PLAYER_SPRITE) ) ){
		Player->UseSprite(Val(PLAYER_SPRITE));
	}
}	

void ChangePlayerSprite(int sprite){
	Val(PLAYER_SPRITE,sprite);
}

void SetSpriteCondition(int condition){
	if ( COND_DALEK ) {
		ChangePlayerSprite(SPRITE_DALEK_SAUCER);
	}
	//else if 
}