//Config constants
//None
const int LINK_NONE_FRAMES = 1;
const int LINK_NONE_SPEED = 30;
const int LINK_NONE_TILE = 34601;
const int LINK_NONE_DIR = 4;
const int LINK_NONE_SEP = 1;
//Walking
const int LINK_WALKING_FRAMES = 2;
const int LINK_WALKING_SPEED = 30;
const int LINK_WALKING_TILE = 34601;
const int LINK_WALKING_DIR = 4;
const int LINK_WALKING_SEP = 0;
//Attacking
const int LINK_ATTACKING_FRAMES = 2;
const int LINK_ATTACKING_SPEED = 30;
const int LINK_ATTACKING_TILE = 34612;
const int LINK_ATTACKING_DIR = 4;
const int LINK_ATTACKING_SEP = 0;
//Frozen
const int LINK_FROZEN_FRAMES = -1;
const int LINK_FROZEN_SPEED = 30;
const int LINK_FROZEN_TILE = -1;
const int LINK_FROZEN_DIR = -1;
const int LINK_FROZEN_SEP = -1;
//Hold land 1
const int LINK_HOLD1LAND_FRAMES = 1;
const int LINK_HOLD1LAND_SPEED = 30;
const int LINK_HOLD1LAND_TILE = 34993;
const int LINK_HOLD1LAND_DIR = 1;
const int LINK_HOLD1LAND_SEP = 0;
//Hold land 2
const int LINK_HOLD2LAND_FRAMES = 1;
const int LINK_HOLD2LAND_SPEED = 30;
const int LINK_HOLD2LAND_TILE = 34994;
const int LINK_HOLD2LAND_DIR = 1;
const int LINK_HOLD2LAND_SEP = 0;
//Rafting
const int LINK_RAFTING_FRAMES = 1;
const int LINK_RAFTING_SPEED = 30;
const int LINK_RAFTING_TILE = 34601;
const int LINK_RAFTING_DIR = 4;
const int LINK_RAFTING_SEP = 1;
//Got hurt land
const int LINK_GOTHURTLAND_FRAMES = -1;
const int LINK_GOTHURTLAND_SPEED = 30;
const int LINK_GOTHURTLAND_TILE = -1;
const int LINK_GOTHURTLAND_DIR = -1;
const int LINK_GOTHURTLAND_SEP = -1;
//Inwind
const int LINK_INWIND_FRAMES = 8;
const int LINK_INWIND_SPEED = 30;
const int LINK_INWIND_TILE = 34821;
const int LINK_INWIND_DIR = 1;
const int LINK_INWIND_SEP = 0;
//Scrolling
const int LINK_SCROLLING_FRAMES = 2;
const int LINK_SCROLLING_SPEED = 30;
const int LINK_SCROLLING_TILE = 34601;
const int LINK_SCROLLING_DIR = 4;
const int LINK_SCROLLING_SEP = 0;
//Winning
const int LINK_WINNING_FRAMES = 1;
const int LINK_WINNING_SPEED = 30;
const int LINK_WINNING_TILE = 34994;
const int LINK_WINNING_DIR = 4;
const int LINK_WINNING_SEP = 0;
//Swimming
const int LINK_SWIMMING_FRAMES = 2;
const int LINK_SWIMMING_SPEED = 30;
const int LINK_SWIMMING_TILE = 34701;
const int LINK_SWIMMING_DIR = 4;
const int LINK_SWIMMING_SEP = 0;
//Hopping
const int LINK_HOPPING_FRAMES = 2;
const int LINK_HOPPING_SPEED = 30;
const int LINK_HOPPING_TILE = 34601;
const int LINK_HOPPING_DIR = 4;
const int LINK_HOPPING_SEP = 0;
//Got hurt water
const int LINK_GOTHURTWATER_FRAMES = -1;
const int LINK_GOTHURTWATER_SPEED = 30;
const int LINK_GOTHURTWATER_TILE = -1;
const int LINK_GOTHURTWATER_DIR = -1;
const int LINK_GOTHURTWATER_SEP = -1;
//Hold water 1
const int LINK_HOLD1WATER_FRAMES = 1;
const int LINK_HOLD1WATER_SPEED = 30;
const int LINK_HOLD1WATER_TILE = 34728;
const int LINK_HOLD1WATER_DIR = 1;
const int LINK_HOLD1WATER_SEP = 0;
//Hold water 2
const int LINK_HOLD2WATER_FRAMES = 1;
const int LINK_HOLD2WATER_SPEED = 30;
const int LINK_HOLD2WATER_TILE = 34729;
const int LINK_HOLD2WATER_DIR = 1;
const int LINK_HOLD2WATER_SEP = 0;
//Casting
const int LINK_CASTING_FRAMES = 1;
const int LINK_CASTING_SPEED = 30;
const int LINK_CASTING_TILE = 34992;
const int LINK_CASTING_DIR = 1;
const int LINK_CASTING_SEP = 0;
//Cave walk up
const int LINK_CAVEWALKUP_FRAMES = 2;
const int LINK_CAVEWALKUP_SPEED = 30;
const int LINK_CAVEWALKUP_TILE = 34601;
const int LINK_CAVEWALKUP_DIR = 4;
const int LINK_CAVEWALKUP_SEP = 0;
//Cave walk down
const int LINK_CAVEWALKDOWN_FRAMES = 2;
const int LINK_CAVEWALKDOWN_SPEED = 30;
const int LINK_CAVEWALKDOWN_TILE = 34601;
const int LINK_CAVEWALKDOWN_DIR = 4;
const int LINK_CAVEWALKDOWN_SEP = 0;
//Dying
const int LINK_DYING_FRAMES = 4;
const int LINK_DYING_SPEED = 30;
const int LINK_DYING_TILE = 34601;
const int LINK_DYING_DIR = 1;
const int LINK_DYING_SEP = 1;
//Drowning
const int LINK_DROWNING_FRAMES = 2;
const int LINK_DROWNING_SPEED = 30;
const int LINK_DROWNING_TILE = 34726;
const int LINK_DROWNING_DIR = 1;
const int LINK_DROWNING_SEP = 0;
//Charging
const int LINK_CHARGING_FRAMES = 2;
const int LINK_CHARGING_SPEED = 30;
const int LINK_CHARGING_TILE = 34601;
const int LINK_CHARGING_DIR = 4;
const int LINK_CHARGING_SEP = 0;
//Spinning
const int LINK_SPINNING_FRAMES = 2;
const int LINK_SPINNING_SPEED = 30;
const int LINK_SPINNING_TILE = 34612;
const int LINK_SPINNING_DIR = 4;
const int LINK_SPINNING_SEP = 0;
//Diving
const int LINK_DIVING_FRAMES = 2;
const int LINK_DIVING_SPEED = 30;
const int LINK_DIVING_TILE = 34726;
const int LINK_DIVING_DIR = 1;
const int LINK_DIVING_SEP = 0;
int nonePreserveActions[25] = { LA_NONE };
int walkingPreserveActions[25] = { LA_WALKING, LA_SCROLLING, LA_HOPPING, LA_CAVEWALKUP, LA_CAVEWALKDOWN, LA_CHARGING };
int attackingPreserveActions[25] = { LA_ATTACKING };
int frozenPreserveActions[25] = { LA_NONE, LA_WALKING, LA_ATTACKING, LA_FROZEN, LA_HOLD1LAND, LA_HOLD2LAND, LA_RAFTING, LA_GOTHURTLAND, LA_INWIND, LA_SCROLLING, LA_WINNING, LA_SWIMMING, LA_HOPPING, LA_GOTHURTWATER, LA_HOLD1WATER, LA_HOLD2WATER, LA_CASTING, LA_CAVEWALKUP, LA_CAVEWALKDOWN, LA_DYING, LA_DROWNING, LA_CHARGING, LA_SPINNING, LA_DIVING };
int hold1LandPreserveActions[25] = { LA_HOLD1LAND };
int hold2LandPreserveActions[25] = { LA_HOLD2LAND };
int raftingPreserveActions[25] = { LA_RAFTING };
int gotHurtLandPreserveActions[25] = { LA_NONE, LA_WALKING, LA_ATTACKING, LA_FROZEN, LA_HOLD1LAND, LA_HOLD2LAND, LA_RAFTING, LA_GOTHURTLAND, LA_INWIND, LA_SCROLLING, LA_WINNING, LA_SWIMMING, LA_HOPPING, LA_GOTHURTWATER, LA_HOLD1WATER, LA_HOLD2WATER, LA_CASTING, LA_CAVEWALKUP, LA_CAVEWALKDOWN, LA_DYING, LA_DROWNING, LA_CHARGING, LA_SPINNING, LA_DIVING };
int inWindPreserveActions[25] = { LA_WALKING, LA_SCROLLING, LA_HOPPING, LA_CAVEWALKUP, LA_CAVEWALKDOWN, LA_CHARGING };
int scrollingPreserveActions[25] = { LA_WALKING, LA_SCROLLING, LA_HOPPING, LA_CAVEWALKUP, LA_CAVEWALKDOWN, LA_CHARGING };
int winningPreserveActions[25] = { LA_WINNING };
int swimmingPreserveActions[25] = { LA_SWIMMING };
int hoppingPreserveActions[25] = { LA_WALKING, LA_SCROLLING, LA_HOPPING, LA_CAVEWALKUP, LA_CAVEWALKDOWN, LA_CHARGING };
int gotHurtWaterPreserveActions[25] = { LA_NONE, LA_WALKING, LA_ATTACKING, LA_FROZEN, LA_HOLD1LAND, LA_HOLD2LAND, LA_RAFTING, LA_GOTHURTLAND, LA_INWIND, LA_SCROLLING, LA_WINNING, LA_SWIMMING, LA_HOPPING, LA_GOTHURTWATER, LA_HOLD1WATER, LA_HOLD2WATER, LA_CASTING, LA_CAVEWALKUP, LA_CAVEWALKDOWN, LA_DYING, LA_DROWNING, LA_CHARGING, LA_SPINNING, LA_DIVING };
int hold1WaterPreserveActions[25] = { LA_HOLD1WATER };
int hold2WaterPreserveActions[25] = { LA_HOLD2WATER };
int castingPreserveActions[25] = { LA_CASTING };
int caveWalkUpPreserveActions[25] = { LA_WALKING, LA_SCROLLING, LA_HOPPING, LA_CAVEWALKUP, LA_CAVEWALKDOWN, LA_CHARGING };
int caveWalkDownPreserveActions[25] = { LA_WALKING, LA_SCROLLING, LA_HOPPING, LA_CAVEWALKUP, LA_CAVEWALKDOWN, LA_CHARGING };
int dyingPreserveActions[25] = { LA_DYING };
int drowningPreserveActions[25] = { LA_DROWNING };
int chargingPreserveActions[25] = { LA_CHARGING };
int spinningPreserveActions[25] = { LA_SPINNING };
int divingPreserveActions[25] = { LA_DIVING };
int linkTileCount = 2;
int linkTileIndex = LINK_WALKING_TILE;
int linkTileFrame = 0;
int linkTileSpace = 0;
int linkTileDirect = 4;
int linkTileCSet = 6;
int linkTileFlash = 0;
int linkLastAction = LA_NONE;
bool invisible = false;
bool reset;
void DrawLink(int x, int y, int dir, int layer)
{
int frame;
//Set link visible
//if (Link->Invisible && invisible)
//{
// invisible = false;
// Link->Invisible = false;
//}
//Check if action has changed
if (Link->Action != linkLastAction);
{
reset = true;
}
//if (!Link->Invisible && !invisible)
//{
Link->Invisible = true;
invisible = true;
if (Link->Action == LA_NONE)
SetState(LINK_NONE_TILE, LINK_NONE_FRAMES, LINK_NONE_SEP, LINK_NONE_DIR, LINK_NONE_SPEED, nonePreserveActions, reset);
if (Link->Action == LA_WALKING)
SetState(LINK_WALKING_TILE, LINK_WALKING_FRAMES, LINK_WALKING_SEP, LINK_WALKING_DIR, LINK_WALKING_SPEED, walkingPreserveActions, reset);
if (Link->Action == LA_ATTACKING)
SetState(LINK_ATTACKING_TILE, LINK_ATTACKING_FRAMES, LINK_ATTACKING_SEP, LINK_ATTACKING_DIR, LINK_ATTACKING_SPEED, attackingPreserveActions, reset);
if (Link->Action == LA_FROZEN)
SetState(LINK_FROZEN_TILE, LINK_FROZEN_FRAMES, LINK_FROZEN_SEP, LINK_FROZEN_DIR, LINK_FROZEN_SPEED, frozenPreserveActions, reset);
if (Link->Action == LA_HOLD1LAND)
SetState(LINK_HOLD1LAND_TILE, LINK_HOLD1LAND_FRAMES, LINK_HOLD1LAND_SEP, LINK_HOLD1LAND_DIR, LINK_HOLD1LAND_SPEED, hold1LandPreserveActions, reset);
if (Link->Action == LA_HOLD2LAND)
SetState(LINK_HOLD2LAND_TILE, LINK_HOLD2LAND_FRAMES, LINK_HOLD2LAND_SEP, LINK_HOLD2LAND_DIR, LINK_HOLD2LAND_SPEED, hold2LandPreserveActions, reset);
if (Link->Action == LA_RAFTING)
SetState(LINK_RAFTING_TILE, LINK_RAFTING_FRAMES, LINK_RAFTING_SEP, LINK_RAFTING_DIR, LINK_RAFTING_SPEED, raftingPreserveActions, reset);
if (Link->Action == LA_GOTHURTLAND)
SetState(LINK_GOTHURTLAND_TILE, LINK_GOTHURTLAND_FRAMES, LINK_GOTHURTLAND_SEP, LINK_GOTHURTLAND_DIR, LINK_GOTHURTLAND_SPEED, gotHurtLandPreserveActions, reset);
if (Link->Action == LA_INWIND)
SetState(LINK_INWIND_TILE, LINK_INWIND_FRAMES, LINK_INWIND_SEP, LINK_INWIND_DIR, LINK_INWIND_SPEED, inWindPreserveActions, reset);
if (Link->Action == LA_SCROLLING)
SetState(LINK_SCROLLING_TILE, LINK_SCROLLING_FRAMES, LINK_SCROLLING_SEP, LINK_SCROLLING_DIR, LINK_SCROLLING_SPEED, scrollingPreserveActions, reset);
if (Link->Action == LA_WINNING)
SetState(LINK_WINNING_TILE, LINK_WINNING_FRAMES, LINK_WINNING_SEP, LINK_WINNING_DIR, LINK_WINNING_SPEED, winningPreserveActions, reset);
if (Link->Action == LA_SWIMMING)
SetState(LINK_SWIMMING_TILE, LINK_SWIMMING_FRAMES, LINK_SWIMMING_SEP, LINK_SWIMMING_DIR, LINK_SWIMMING_SPEED, swimmingPreserveActions, reset);
if (Link->Action == LA_HOPPING)
SetState(LINK_HOPPING_TILE, LINK_HOPPING_FRAMES, LINK_HOPPING_SEP, LINK_HOPPING_DIR, LINK_HOPPING_SPEED, hoppingPreserveActions, reset);
if (Link->Action == LA_GOTHURTWATER)
SetState(LINK_GOTHURTWATER_TILE, LINK_GOTHURTWATER_FRAMES, LINK_GOTHURTWATER_SEP, LINK_GOTHURTWATER_DIR, LINK_GOTHURTWATER_SPEED, gotHurtWaterPreserveActions, reset);
if (Link->Action == LA_HOLD1WATER)
SetState(LINK_HOLD1WATER_TILE, LINK_HOLD1WATER_FRAMES, LINK_HOLD1WATER_SEP, LINK_HOLD1WATER_DIR, LINK_HOLD1WATER_SPEED, hold1WaterPreserveActions, reset);
if (Link->Action == LA_HOLD2WATER)
SetState(LINK_HOLD2WATER_TILE, LINK_HOLD2WATER_FRAMES, LINK_HOLD2WATER_SEP, LINK_HOLD2WATER_DIR, LINK_HOLD2WATER_SPEED, hold2WaterPreserveActions, reset);
if (Link->Action == LA_CASTING)
SetState(LINK_CASTING_TILE, LINK_CASTING_FRAMES, LINK_CASTING_SEP, LINK_CASTING_DIR, LINK_CASTING_SPEED, castingPreserveActions, reset);
if (Link->Action == LA_CAVEWALKUP)
SetState(LINK_CAVEWALKUP_TILE, LINK_CAVEWALKUP_FRAMES, LINK_CAVEWALKUP_SEP, LINK_CAVEWALKUP_DIR, LINK_CAVEWALKUP_SPEED, caveWalkUpPreserveActions, reset);
if (Link->Action == LA_CAVEWALKDOWN)
SetState(LINK_CAVEWALKDOWN_TILE, LINK_CAVEWALKDOWN_FRAMES, LINK_CAVEWALKDOWN_SEP, LINK_CAVEWALKDOWN_DIR, LINK_CAVEWALKDOWN_SPEED, caveWalkDownPreserveActions, reset);
if (Link->Action == LA_DYING)
SetState(LINK_DYING_TILE, LINK_DYING_FRAMES, LINK_DYING_SEP, LINK_DYING_DIR, LINK_DYING_SPEED, dyingPreserveActions, reset);
if (Link->Action == LA_DROWNING)
SetState(LINK_DROWNING_TILE, LINK_DROWNING_FRAMES, LINK_DROWNING_SEP, LINK_DROWNING_DIR, LINK_DROWNING_SPEED, drowningPreserveActions, reset);
if (Link->Action == LA_CHARGING)
SetState(LINK_CHARGING_TILE, LINK_CHARGING_FRAMES, LINK_CHARGING_SEP, LINK_CHARGING_DIR, LINK_CHARGING_SPEED, chargingPreserveActions, reset);
if (Link->Action == LA_SPINNING)
SetState(LINK_SPINNING_TILE, LINK_SPINNING_FRAMES, LINK_SPINNING_SEP, LINK_SPINNING_DIR, LINK_SPINNING_SPEED, spinningPreserveActions, reset);
if (Link->Action == LA_DIVING)
SetState(LINK_DIVING_TILE, LINK_DIVING_FRAMES, LINK_DIVING_SEP, LINK_DIVING_DIR, LINK_DIVING_SPEED, divingPreserveActions, reset);
//Set invisible flag to true
//invisible = false;
//Set this frames action and set reset to false
linkLastAction = Link->Action;
reset = false;
///Loop frame and flash
linkTileFrame = linkTileFrame % linkTileCount;
linkTileFlash = linkTileFlash % 2;
dir = (dir % linkTileDirect) * (linkTileCount + 1);
frame = linkTileFrame * (linkTileCount + linkTileSpace + 1);
//Draw link
int tile = linkTileIndex + dir + Floor(frame);
Screen->FastTile(3, x, y, tile, 26*Floor(linkTileFlash), 128);
Screen->DrawInteger(5, 0, 0, FONT_Z1, 1, -1, 16, 16, linkTileFrame, 1, 128);
//}
}
void SetState(int frameindex, int framenumber, int frameseperator, int framedirection, int framespeed, int preservearray, bool reset)
{
bool perserve = true;
if (reset)
for(int i=0; i<25; i++)
if (Link->Action != preservearray[i])
{
perserve = false;
}
if (perserve)
{
linkTileFrame += framespeed / 60;
//linkTileFlash++;
}
else
{
linkTileFrame = 0;
//linkTileFlash = 0;
}
if (framenumber > -1) linkTileCount = framenumber;
else linkTileCount = linkTileCount;
if (frameindex > -1) linkTileIndex = frameindex;
else linkTileIndex = linkTileIndex;
if (frameseperator > -1) linkTileSpace = frameseperator;
else linkTileSpace = linkTileSpace;
if (framedirection > -1) linkTileDirect = framedirection;
else linkTileDirect = linkTileDirect;
}