platform.c| platform.chdB@LLLPTEXTCWIEb|#include #include #include #include "platform.h" #include "player.h" #include "global.h" #include "addrs.h" #include "assert.h" static u_char FindAdjPLat(u_char* scrbase, u_char x, u_char y); extern u_char screen; static u_char platforms[nomaps][5]; // 0,1 - Tail position // 2,3 - Head position // 4 - Moving? void RestartPlatforms() { u_char startposs[8][6] = { {70,12,8,6,8,1}, {71,7,9,14,9,1}, {72,4,2,9,2,1}, {73,7,3,12,3,1}, {87,11,7,16,7,1}, {93,6,3,10,3,1}, {94,16,5,16,7,1}, {104,9,12,3,12,1}}; int i,i2; u_char mapno; // Wipe all platform data for (i=0;i>16, ply>>16)) { *(scrbase+platforms[screen][3]*20+platforms[screen][2]) = 69; } else { // Remove tail square *(scrbase+platforms[screen][1]*20+platforms[screen][0]) = 69; // Calculate position of next tail square dirn = FindAdjPLat(scrbase, platforms[screen][0], platforms[screen][1]); switch (dirn) { case 0: platforms[screen][1]--; break; case 1: platforms[screen][0]++; break; case 2: platforms[screen][1]++; break; case 3: platforms[screen][0]--; break; } // Find what direction head of platform is moving in and // continue to move in that direction if there is a trail. dirn = FindAdjPLat(scrbase, platforms[screen][2], platforms[screen][3]); switch (dirn) { case 2: if (*(scrbase+(platforms[screen][3]-1)*20+platforms[screen][2])==69) { platforms[screen][3]--; moved = 1; } break; case 0: if (*(scrbase+(platforms[screen][3]+1)*20+platforms[screen][2])==69) { platforms[screen][3]++; moved = 1; } break; case 1: if (*(scrbase+platforms[screen][3]*20+(platforms[screen][2]-1))==69) { platforms[screen][2]--; moved = 1; } break; case 3: if (*(scrbase+platforms[screen][3]*20+(platforms[screen][2]+1))==69) { platforms[screen][2]++; moved = 1; } break; } if (!moved) { // If head can't keep moving in same direction then // find an adjoining trail tile and follow that. if (*(scrbase+(platforms[screen][3]-1)*20+platforms[screen][2])==69) platforms[screen][3]--; else if (*(scrbase+(platforms[screen][3]+1)*20+platforms[screen][2])==69) platforms[screen][3]++; else if (*(scrbase+platforms[screen][3]*20+(platforms[screen][2]-1))==69) platforms[screen][2]--; else if (*(scrbase+platforms[screen][3]*20+(platforms[screen][2]+1))==69) platforms[screen][2]++; } } } } } void AddPlatform(u_char scr, u_char x1, u_char y1, u_char x2, u_char y2) { platforms[scr][0] = x1; platforms[scr][1] = y1; platforms[scr][2] = x2; platforms[scr][3] = y2; platforms[scr][4] = 1; } static u_char FindAdjPLat(u_char* scrbase, u_char x, u_char y) { // Returns what direction a bit of platform is from given coords. u_char up, right, down, left; // Get tile from each compass direction. up = *(scrbase+((y-1)*20)+x); right = *(scrbase+(y*20)+(x+1)); down = *(scrbase+((y+1)*20)+x); left = *(scrbase+(y*20)+(x-1)); if (up>49 && up<53) return 0; if (right>49 && right<53) return 1; if (down>49 && down<53) return 2; if (left>49 && left<53) return 3; }ZZR platform.cItemsix.harozentallerTEXTCWIE|bH Monaco0*0* v v UZZRtX3RMPSRMWBB*LR