///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 }