/*******************************************************************************/ /* The Legend of Zelda: Link's Awakening */ /* By: Jason Ho */ /* */ /* This header contains data pertaining to objects in the game. Objects */ /* include such things as hearts, crystals, bombs, arrows, swords, shields, */ /* etc. Objects also include such animations like the sword swing, explosions, */ /* dissolving leaves, etc. Anything that is not a terrain or mob is probably */ /* an object. */ /*******************************************************************************/ #define PLUS_KEY _rowread(~((short)(1<<1)))&(1<<1) #define MINUS_KEY _rowread(~((short)(1<<1)))&(1<<2) /*---------------------------------------------------------------------------*/ /* Aliases */ /*---------------------------------------------------------------------------*/ enum {OBJECT_NUMBER, OBJECT_X, OBJECT_Y, OBJECT_FRAME}; //Used in object_list //Shadows found under mobs when jumping #define SHADOW1 0 //Link's sword, representing 7 swing directions #define SWORD1 1 #define SWORD2 2 #define SWORD3 3 #define SWORD4 4 #define SWORD5 5 #define SWORD6 6 #define SWORD7 7 //Displayed when Link chops a bush #define LEAF1 8 #define LEAF2 9 #define LEAF3 10 #define LEAF4 11 //Displayed when enemies get killed #define EXPLODE1 12 #define EXPLODE2 13 #define EXPLODE3 14 //After chopping bushes or enemies you can get hearts and crystals #define HEART1 15 #define CRYSTAL1 16 #define CRYSTAL2 17 /*---------------------------------------------------------------------------*/ /* Function Prototypes */ /*---------------------------------------------------------------------------*/ void AnimateObject(void); short AddObject(short, short, short); void DeleteObject(short); /*---------------------------------------------------------------------------*/ /* Pictures */ /*---------------------------------------------------------------------------*/ static unsigned short object_pic_light[19][16] = { {0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07E0,0x0FF0,0x0FF0,0x07E0}, //Shadow1 {0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0xFFFC,0xC802,0xC802,0xFFFC,0x3800,0x0000}, //Sword1 {0x0000,0xFC00,0x0700,0xF1B0,0x1C48,0x0788,0x0110,0x0228,0x046C,0x08A4,0x5136,0xF212,0xDC1A,0xC80A,0xFC0A,0x780A}, //Sword2 {0x0000,0x0180,0x0240,0x0240,0x0240,0x0240,0x0240,0x0240,0x0240,0x0240,0x0240,0x07E0,0x0660,0x0660,0x03C0,0x03C0}, //Sword3 {0x0000,0x003F,0x00E0,0x0D8F,0x1238,0x11E0,0x0880,0x1440,0x3620,0x2510,0x6C8A,0x484F,0x583B,0x5013,0x503F,0x501E}, //Sword4 {0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x001C,0x3FFF,0x4013,0x4013,0x3FFF,0x001C,0x0000}, //Sword5 {0x501E,0x503F,0x5013,0x583B,0x484F,0x6C8A,0x2510,0x3620,0x1440,0x0880,0x11E0,0x1238,0x0D8F,0x00E0,0x003F,0x0000}, //Sword6 {0x001E,0x001E,0x0033,0x0033,0x003F,0x0012,0x0012,0x0012,0x0012,0x0012,0x0012,0x0012,0x0012,0x0012,0x000C,0x0000}, //Sword7 {0x0000,0x0000,0x0000,0x0000,0x0000,0x01F0,0x03F0,0x07E0,0x07C0,0x07C0,0x0F80,0x0000,0x0000,0x0000,0x0000,0x0000}, //Leaf1 {0x0000,0x0000,0x0000,0x0000,0x0000,0x0F80,0x07C0,0x07C0,0x07E0,0x03F0,0x01F0,0x0000,0x0000,0x0000,0x0000,0x0000}, //Leaf2 //10 pic mark {0x0000,0x0000,0x0000,0x0000,0x0000,0x01F0,0x03E0,0x03E0,0x07E0,0x0FC0,0x0F80,0x0000,0x0000,0x0000,0x0000,0x0000}, //Leaf3 {0x0000,0x0000,0x0000,0x0000,0x0000,0x0F80,0x0FC0,0x07E0,0x03E0,0x03E0,0x01F0,0x0000,0x0000,0x0000,0x0000,0x0000}, //Leaf4 {0x03C0,0x07E0,0x0C38,0x1BD8,0x1BD8,0x7C3E,0xC813,0x9819,0x9C39,0xDC3B,0x7FFE,0x3FFC,0x1FF8,0x1FF8,0x0FF0,0x03C0}, //Explode1 {0x0000,0x0000,0x300C,0x2814,0x1668,0x0BD0,0x0C30,0x0420,0x0420,0x0C30,0x0BD0,0x1668,0x2814,0x300C,0x0000,0x0000}, //Explode2 {0xC003,0xA005,0x500A,0x381C,0x1818,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1818,0x381C,0x500A,0xA005,0xC003}, //Explode3 {0x0000,0x0000,0x0000,0x0000,0x0000,0x06C0,0x0FE0,0x0D60,0x0C60,0x06C0,0x0380,0x0100,0x0000,0x0000,0x0000,0x0000}, //Heart1 {0x0000,0x0100,0x0380,0x07C0,0x0FE0,0x0FE0,0x0FE0,0x0FE0,0x0FE0,0x0FE0,0x0FE0,0x0FE0,0x07C0,0x0380,0x0100,0x0000}, //Crystal1 {0x0000,0x0100,0x0280,0x0440,0x0c60,0x0aa0,0x0920,0x0920,0x0920,0x0920,0x0aa0,0x0c60,0x0440,0x0280,0x0100,0x0000}, //Crystal2 }; static unsigned short object_pic_dark[19][16] = { {0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07E0,0x0FF0,0x0FF0,0x07E0}, //Shadow1 {0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0xCFFC,0x8802,0x8802,0xCFFC,0x3800,0x0000}, //Sword1 {0x0000,0xFC00,0x0300,0xE0B0,0x1848,0x0688,0x0110,0x0228,0x0444,0x08A4,0x5122,0xA212,0x9412,0x880A,0xC40A,0x780A}, //Sword2 {0x0000,0x0180,0x0240,0x0240,0x0240,0x0240,0x0240,0x0240,0x0240,0x0240,0x0240,0x07E0,0x0420,0x0420,0x0240,0x03C0}, //Sword3 {0x0000,0x003F,0x00C0,0x0D07,0x1218,0x1160,0x0880,0x1440,0x2220,0x2510,0x448A,0x4845,0x4829,0x5011,0x5023,0x501E}, //Sword4 {0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x001C,0x3FF3,0x4011,0x4011,0x3FF3,0x001C,0x0000}, //Sword5 {0x501E,0x5023,0x5011,0x4829,0x4845,0x448A,0x2510,0x2220,0x1440,0x0880,0x1160,0x1218,0x0D07,0x00C0,0x003F,0x0000}, //Sword6 {0x001E,0x0012,0x0021,0x0021,0x003F,0x0012,0x0012,0x0012,0x0012,0x0012,0x0012,0x0012,0x0012,0x0012,0x000C,0x0000}, //Sword7 {0x0000,0x0000,0x0000,0x0000,0x0000,0x01F0,0x0210,0x04A0,0x0540,0x0640,0x0F80,0x0000,0x0000,0x0000,0x0000,0x0000}, //Leaf1 {0x0000,0x0000,0x0000,0x0000,0x0000,0x0F80,0x0640,0x0540,0x04A0,0x0210,0x01F0,0x0000,0x0000,0x0000,0x0000,0x0000}, //Leaf2 //10 pic mark {0x0000,0x0000,0x0000,0x0000,0x0000,0x01F0,0x0260,0x02A0,0x0520,0x0840,0x0F80,0x0000,0x0000,0x0000,0x0000,0x0000}, //Leaf3 {0x0000,0x0000,0x0000,0x0000,0x0000,0x0F80,0x0840,0x0520,0x02A0,0x0260,0x01F0,0x0000,0x0000,0x0000,0x0000,0x0000}, //Leaf4 {0x03C0,0x0420,0x0818,0x1008,0x1008,0x6006,0x8001,0x8001,0x8001,0x8811,0x4812,0x342C,0x13C8,0x1818,0x0C30,0x03C0}, //Explode1 {0x0000,0x0000,0x300C,0x2814,0x1668,0x0990,0x0810,0x0420,0x0420,0x0810,0x0990,0x1668,0x2814,0x300C,0x0000,0x0000}, //Explode2 {0xC003,0xA005,0x500A,0x2814,0x1818,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1818,0x2814,0x500A,0xA005,0xC003}, //Explode3 {0x0000,0x0000,0x0000,0x0000,0x0000,0x06C0,0x0920,0x0AA0,0x0BA0,0x0540,0x0280,0x0100,0x0000,0x0000,0x0000,0x0000}, //Heart1 {0x0000,0x0100,0x0280,0x0440,0x0C60,0x0AA0,0x0920,0x0920,0x0920,0x0920,0x0AA0,0x0C60,0x0440,0x0280,0x0100,0x0000}, //Crystal1 {0x0000,0x0100,0x0380,0x07c0,0x0fe0,0x0fe0,0x0fe0,0x0fe0,0x0fe0,0x0fe0,0x0fe0,0x0fe0,0x07c0,0x0380,0x0100,0x0000}, //Crystal2 }; static unsigned short object_pic_mask[19][16] = { {~0x0000,~0x0000,~0x0000,~0x0000,~0x0000,~0x0000,~0x0000,~0x0000,~0x0000,~0x0000,~0x0000,~0x0000,~0x07E0,~0x0FF0,~0x0FF0,~0x07E0}, //Shadow1 {~0x0000,~0x0000,~0x0000,~0x0000,~0x0000,~0x0000,~0x0000,~0x0000,~0x0000,~0x3800,~0xFFFC,~0xFFFE,~0xFFFE,~0xFFFC,~0x3800,~0x0000}, //Sword1 {~0x0000,~0xFC00,~0xFF00,~0xFFB0,~0x1FF8,~0x07F8,~0x01F0,~0x03F8,~0x07FC,~0x0FBC,~0x5F3E,~0xFE1E,~0xFC1E,~0xF80E,~0xFC0E,~0x780E}, //Sword2 {~0x0000,~0x0180,~0x03C0,~0x03C0,~0x03C0,~0x03C0,~0x03C0,~0x03C0,~0x03C0,~0x03C0,~0x03C0,~0x07E0,~0x07E0,~0x07E0,~0x03C0,~0x03C0}, //Sword3 {~0x0000,~0x003F,~0x00FF,~0x0DFF,~0x1FF8,~0x1FE0,~0x0F80,~0x1FC0,~0x3FE0,~0x3DF0,~0x7CFA,~0x787F,~0x783F,~0x701F,~0x703F,~0x701E}, //Sword4 {~0x0000,~0x0000,~0x0000,~0x0000,~0x0000,~0x0000,~0x0000,~0x0000,~0x0000,~0x001C,~0x3FFF,~0x7FFF,~0x7FFF,~0x3FFF,~0x001C,~0x0000}, //Sword5 {~0x701E,~0x703F,~0x701F,~0x783F,~0x787F,~0x7CFA,~0x3DF0,~0x3FE0,~0x1FC0,~0x0F80,~0x1FE0,~0x1FF8,~0x0DFF,~0x00FF,~0x003F,~0x0000}, //Sword6 {~0x001E,~0x001E,~0x003F,~0x003F,~0x003F,~0x001E,~0x001E,~0x001E,~0x001E,~0x001E,~0x001E,~0x001E,~0x001E,~0x001E,~0x000C,~0x0000}, //Sword7 {~0x0000,~0x0000,~0x0000,~0x0000,~0x0000,~0x01F0,~0x03F0,~0x07E0,~0x07C0,~0x07C0,~0x0F80,~0x0000,~0x0000,~0x0000,~0x0000,~0x0000}, //Leaf1 {~0x0000,~0x0000,~0x0000,~0x0000,~0x0000,~0x0F80,~0x07C0,~0x07C0,~0x07E0,~0x03F0,~0x01F0,~0x0000,~0x0000,~0x0000,~0x0000,~0x0000}, //Leaf2 //10 pic mark {~0x0000,~0x0000,~0x0000,~0x0000,~0x0000,~0x01F0,~0x03E0,~0x03E0,~0x07E0,~0x0FC0,~0x0F80,~0x0000,~0x0000,~0x0000,~0x0000,~0x0000}, //Leaf3 {~0x0000,~0x0000,~0x0000,~0x0000,~0x0000,~0x0F80,~0x0FC0,~0x07E0,~0x03E0,~0x03E0,~0x01F0,~0x0000,~0x0000,~0x0000,~0x0000,~0x0000}, //Leaf4 {~0x03C0,~0x07E0,~0x0FF8,~0x1FF8,~0x1FF8,~0x7FFE,~0xFFFF,~0xFFFF,~0xFFFF,~0xFFFF,~0x7FFE,~0x3FFC,~0x1FF8,~0x1FF8,~0x0FF0,~0x03C0}, //Explode1 {~0x0000,~0x0000,~0x300C,~0x381C,~0x1E78,~0x0FF0,~0x0FF0,~0x07E0,~0x07E0,~0x0FF0,~0x0FF0,~0x1E78,~0x381C,~0x300C,~0x0000,~0x0000}, //Explode2 {~0xC003,~0xE007,~0x700E,~0x381C,~0x1818,~0x0000,~0x0000,~0x0000,~0x0000,~0x0000,~0x0000,~0x1818,~0x381C,~0x700E,~0xE007,~0xC003}, //Explode3 {~0x0000,~0x0000,~0x0000,~0x0000,~0x0000,~0x06C0,~0x0FE0,~0x0FE0,~0x0FE0,~0x07C0,~0x0380,~0x0100,~0x0000,~0x0000,~0x0000,~0x0000}, //Heart1 {~0x0000,~0x0100,~0x0380,~0x07C0,~0x0FE0,~0x0FE0,~0x0FE0,~0x0FE0,~0x0FE0,~0x0FE0,~0x0FE0,~0x0FE0,~0x07C0,~0x0380,~0x0100,~0x0000}, //Crystal1 {~0x0000,~0x0100,~0x0380,~0x07c0,~0x0fe0,~0x0fe0,~0x0fe0,~0x0fe0,~0x0fe0,~0x0fe0,~0x0fe0,~0x0fe0,~0x07c0,~0x0380,~0x0100,~0x0000}, //Crystal2 }; /*---------------------------------------------------------------------------*/ /* Functions */ /*---------------------------------------------------------------------------*/ /*===========================================================================*/ /* This function handles whatever an object needs to do: functionality, */ /* animation, etc. */ /*===========================================================================*/ void AnimateObject(void) { int list_num = 0; int count1 = 0; //Used for temporary storage. NOT TO BE USED BETWEEN FRAMES! //------------------------------------------------- // Stops checking for objects if the number is -1 //------------------------------------------------- while (object_list[list_num][OBJECT_NUMBER] >= 0) { switch (object_list[list_num][OBJECT_NUMBER]) { //---------------------------------------------------------------------------- // Crystals and Hearts essentially do the same thing, with minor differences //---------------------------------------------------------------------------- case CRYSTAL1: case CRYSTAL2: case HEART1: count1 = 0; switch (object_list[list_num][OBJECT_FRAME]) { //-------------------------------------------------------------- // These frames show the Heart bouncing (when it first appears //-------------------------------------------------------------- case 0: object_list[list_num][OBJECT_Y] -= 4; DrawImage(OBJECT, SHADOW1, object_list[list_num][OBJECT_X], object_list[list_num][OBJECT_Y], A_NORMAL); break; case 2: object_list[list_num][OBJECT_Y] += 4; break; case 4: object_list[list_num][OBJECT_Y] -= 2; DrawImage(OBJECT, SHADOW1, object_list[list_num][OBJECT_X], object_list[list_num][OBJECT_Y], A_NORMAL); break; case 6: object_list[list_num][OBJECT_Y] += 2; break; case 8: object_list[list_num][OBJECT_Y] -= 1; DrawImage(OBJECT, SHADOW1, object_list[list_num][OBJECT_X], object_list[list_num][OBJECT_Y], A_NORMAL); break; case 10: object_list[list_num][OBJECT_Y] += 1; break; //---------------------------------------------------------------------------- // After a certain amount of time, the heart starts flashing, and disappears. // count1 stores when to draw picture or not (to create flashing) //---------------------------------------------------------------------------- case 120 ... 145: if (object_list[list_num][OBJECT_FRAME] % 2) count1 = 1; else count1 = 0; break; } //---------------------------------------------- // Draws the picture (either heart or crystal) //---------------------------------------------- if (!count1) { switch (object_list[list_num][OBJECT_NUMBER]) { case HEART1: DrawImage(OBJECT, HEART1, object_list[list_num][OBJECT_X], object_list[list_num][OBJECT_Y], A_NORMAL); break; case CRYSTAL1: DrawImage(OBJECT, CRYSTAL1, object_list[list_num][OBJECT_X], object_list[list_num][OBJECT_Y], A_NORMAL); break; case CRYSTAL2: DrawImage(OBJECT, CRYSTAL2, object_list[list_num][OBJECT_X], object_list[list_num][OBJECT_Y], A_NORMAL); break; } } //---------------------------------------------------------------- // Checks if player gets a heart or crystal (the frame > 6 is so // the player doesnt get the heart/crystal before he can see it //---------------------------------------------------------------- if (object_list[list_num][OBJECT_FRAME] > 6) { switch (object_list[list_num][OBJECT_NUMBER]) { case HEART1: if (CheckAreaCollision(link_x, link_y, 16, 16, object_list[list_num][OBJECT_X]+4, object_list[list_num][OBJECT_Y]+5,6,6)) DeleteObject(list_num); break; case CRYSTAL1: if (CheckAreaCollision(link_x, link_y, 16, 16, object_list[list_num][OBJECT_X]+4, object_list[list_num][OBJECT_Y]+1,6,13)) DeleteObject(list_num); break; case CRYSTAL2: if (CheckAreaCollision(link_x, link_y, 16, 16, object_list[list_num][OBJECT_X]+4, object_list[list_num][OBJECT_Y]+1,6,13)) DeleteObject(list_num); break; } } //------------------------------------------------------- // Disappears if the player didnt get the heart in time //------------------------------------------------------- if (object_list[list_num][OBJECT_FRAME] == 146) DeleteObject(list_num); //------------------------------------ // Increase the objects frame number //------------------------------------ object_list[list_num][OBJECT_FRAME]++; break; //----------------------------- // Displayed when a mob dies. //----------------------------- case EXPLODE1: switch (object_list[list_num][OBJECT_FRAME]) { case 0 ... 1: DrawImage(OBJECT, EXPLODE1, object_list[list_num][OBJECT_X]+4, object_list[list_num][OBJECT_Y]+4, A_REVERSE); DrawImage(OBJECT, EXPLODE1, object_list[list_num][OBJECT_X]-4, object_list[list_num][OBJECT_Y]-4, A_REVERSE); object_list[list_num][OBJECT_FRAME]++; break; case 2 ... 3: DrawImage(OBJECT, EXPLODE1, object_list[list_num][OBJECT_X]+4, object_list[list_num][OBJECT_Y]+4, A_NORMAL); DrawImage(OBJECT, EXPLODE1, object_list[list_num][OBJECT_X]-4, object_list[list_num][OBJECT_Y]-4, A_NORMAL); object_list[list_num][OBJECT_FRAME]++; break; case 4 ... 5: DrawImage(OBJECT, EXPLODE2, object_list[list_num][OBJECT_X]-4, object_list[list_num][OBJECT_Y]+4, A_REVERSE); DrawImage(OBJECT, EXPLODE2, object_list[list_num][OBJECT_X]+4, object_list[list_num][OBJECT_Y]-4, A_REVERSE); object_list[list_num][OBJECT_FRAME]++; break; case 6 ... 7: DrawImage(OBJECT, EXPLODE2, object_list[list_num][OBJECT_X]-4, object_list[list_num][OBJECT_Y]+4, A_NORMAL); DrawImage(OBJECT, EXPLODE2, object_list[list_num][OBJECT_X]+4, object_list[list_num][OBJECT_Y]-4, A_NORMAL); object_list[list_num][OBJECT_FRAME]++; break; case 8 ... 9: DrawImage(OBJECT, EXPLODE2, object_list[list_num][OBJECT_X], object_list[list_num][OBJECT_Y], A_NORMAL); object_list[list_num][OBJECT_FRAME]++; break; case 10 ... 11: DrawImage(OBJECT, EXPLODE3, object_list[list_num][OBJECT_X], object_list[list_num][OBJECT_Y], A_NORMAL); object_list[list_num][OBJECT_FRAME]++; break; default: //----------------------------------------------------------------- // Random chance of leaving a heart or crystal when the mob dies. //----------------------------------------------------------------- if (!random(8)) { switch (random(3)) { case 0: AddObject(HEART1, object_list[list_num][OBJECT_X], object_list[list_num][OBJECT_Y]); break; case 1: AddObject(CRYSTAL1, object_list[list_num][OBJECT_X], object_list[list_num][OBJECT_Y]); break; case 2: AddObject(CRYSTAL2, object_list[list_num][OBJECT_X], object_list[list_num][OBJECT_Y]); break; } } //---------------------------------------- // Delete the explosion when it is over. //---------------------------------------- DeleteObject(list_num); } break; //------------------------------------------- // Animated when Link chops a bush or grass //------------------------------------------- case LEAF1: switch (object_list[list_num][OBJECT_FRAME]) { case 0: DrawImage(OBJECT, LEAF3, object_list[list_num][OBJECT_X]-4, object_list[list_num][OBJECT_Y]+0, A_NORMAL); DrawImage(OBJECT, LEAF1, object_list[list_num][OBJECT_X]+4, object_list[list_num][OBJECT_Y]+1, A_NORMAL); DrawImage(OBJECT, LEAF3, object_list[list_num][OBJECT_X]+6, object_list[list_num][OBJECT_Y]+3, A_NORMAL); DrawImage(OBJECT, LEAF2, object_list[list_num][OBJECT_X]+10, object_list[list_num][OBJECT_Y]-1, A_NORMAL); object_list[list_num][OBJECT_FRAME]++; break; case 1: DrawImage(OBJECT, LEAF2, object_list[list_num][OBJECT_X]+1, object_list[list_num][OBJECT_Y]-6, A_NORMAL); DrawImage(OBJECT, LEAF2, object_list[list_num][OBJECT_X]+5, object_list[list_num][OBJECT_Y]+0, A_NORMAL); DrawImage(OBJECT, LEAF1, object_list[list_num][OBJECT_X]+1, object_list[list_num][OBJECT_Y]+9, A_NORMAL); DrawImage(OBJECT, LEAF2, object_list[list_num][OBJECT_X]+7, object_list[list_num][OBJECT_Y]+9, A_NORMAL); object_list[list_num][OBJECT_FRAME]++; break; case 2: DrawImage(OBJECT, LEAF2, object_list[list_num][OBJECT_X]+1, object_list[list_num][OBJECT_Y]-6, A_NORMAL); DrawImage(OBJECT, LEAF1, object_list[list_num][OBJECT_X]-1, object_list[list_num][OBJECT_Y]-1, A_NORMAL); DrawImage(OBJECT, LEAF2, object_list[list_num][OBJECT_X]+9, object_list[list_num][OBJECT_Y]+5, A_NORMAL); DrawImage(OBJECT, LEAF2, object_list[list_num][OBJECT_X]+10, object_list[list_num][OBJECT_Y]+11, A_NORMAL); object_list[list_num][OBJECT_FRAME]++; break; case 3: DrawImage(OBJECT, LEAF3, object_list[list_num][OBJECT_X]+1, object_list[list_num][OBJECT_Y]-8, A_NORMAL); DrawImage(OBJECT, LEAF4, object_list[list_num][OBJECT_X]-4, object_list[list_num][OBJECT_Y]+8, A_NORMAL); DrawImage(OBJECT, LEAF2, object_list[list_num][OBJECT_X]+11, object_list[list_num][OBJECT_Y]+4, A_NORMAL); DrawImage(OBJECT, LEAF3, object_list[list_num][OBJECT_X]+12, object_list[list_num][OBJECT_Y]+11, A_NORMAL); object_list[list_num][OBJECT_FRAME]++; break; case 4: DrawImage(OBJECT, LEAF3, object_list[list_num][OBJECT_X]-1, object_list[list_num][OBJECT_Y]-10, A_NORMAL); DrawImage(OBJECT, LEAF4, object_list[list_num][OBJECT_X]-6, object_list[list_num][OBJECT_Y]+6, A_NORMAL); DrawImage(OBJECT, LEAF3, object_list[list_num][OBJECT_X]+13, object_list[list_num][OBJECT_Y]+3, A_NORMAL); DrawImage(OBJECT, LEAF3, object_list[list_num][OBJECT_X]+12, object_list[list_num][OBJECT_Y]+12, A_NORMAL); object_list[list_num][OBJECT_FRAME]++; break; default: DeleteObject(list_num); } break; } //-------------------------- // Moves on to next object //-------------------------- list_num++; } } //------------------------------------------------------------------- // Adds an object to object_list. Once it has found a spot // for the object, it returns the number of the object in the list. //------------------------------------------------------------------- short AddObject(short object_number, short object_x, short object_y) { short list_num = 0; while (object_list[list_num][OBJECT_NUMBER] >= 0) list_num++; object_list[list_num][OBJECT_NUMBER] = object_number; object_list[list_num][OBJECT_X] = object_x; object_list[list_num][OBJECT_Y] = object_y; object_list[list_num][OBJECT_FRAME] = 0; return list_num; } //------------------------------------------------------------------- // Deletes an object from object_list by shifting all objects above // it down. This way adding and deleting objects will never leave // "holes" in object_list. //------------------------------------------------------------------- void DeleteObject(short list_num) { int count1; while (list_num+1 < 50) { //Shifts all objects down. for (count1=0;count1<4;count1++) object_list[list_num][count1] = object_list[list_num+1][count1]; list_num++; } //Makes the last object in the list -1 object_list[list_num][OBJECT_NUMBER] = -1; }