/************************************************************ * * * drawproc.c * * * * * LPGE 1997 * * * * Copyright (C) 1996 Sony Computer Entertainment Inc. * * All Rights Reserved * * * ***********************************************************/ /**************************************************************************** includes ****************************************************************************/ #include "drawproc.h" #include "tunnel.h" #include "tunnel2.h" #include "flying.h" #include "tracks.h" #include "menu.h" #include "cd_data.h" /**************************************************************************** local structures ****************************************************************************/ typedef struct { int x, y; // start point int pixelLength; int direction; // LEFT, RIGHT, ABOVE, BELOW } LineStruct; /**************************************************************************** macros ****************************************************************************/ #define ValidID(id) ( (id >= 0) && (id < NumberTunnelSections) ) // need semi-colons after them #define CLEAR_SPRITE_RGB(sprite) (sprite)->r = (sprite)->g = (sprite)->b = 128 #define CLEAR_SPRITE_SCALING(sprite) (sprite)->scalex = (sprite)->scaley = ONE #define CLEAR_SPRITE_ROTATION(sprite) (sprite)->rotate = 0 #define MAKE_32_VALUE_ADJUSTMENT(value, adjust) \ { \ (value) += (adjust); \ while ((value) < 0) \ (value) += 32; \ while ((value) >= 32) \ (value) -= 32; \ } #define FIT_INTO_32_PIXEL_SPACE(value) \ { \ while ((value) < 0) \ (value) += 32; \ while ((value) >= 32) \ (value) -= 32; \ } #define VALUE_OUT_OF_32_RANGE(value) ( ((value) < 0) || ((value) > 31)) ) /**************************************************************************** internal prototypes ****************************************************************************/ void FlipLineXYs (GsGLINE *line); void DisplaceLineIn32PixelSpace (GsGLINE *line, int direction, int distance); void ShiftAllLinesIn32PixelSpace (int direction, int distance, GsOT *ot); void DrawProc1 (GsOT *ot); void DrawProc2 (GsOT *ot); void DrawProc3 (GsOT *ot); void DrawProc4 (GsOT *ot); void DrawProc5 (GsOT *ot); void DrawProc6 (GsOT *ot); void DrawProc7 (GsOT *ot); void DrawProc8 (GsOT *ot); void DrawProc9 (GsOT *ot); void DrawProc10 (GsOT *ot); void DrawProc11 (GsOT *ot); void DrawProc12 (GsOT *ot); void DrawProc13 (GsOT *ot); void DrawProc14 (GsOT *ot); void DrawProc15 (GsOT *ot); void DrawProc16 (GsOT *ot); void DrawProc17 (GsOT *ot); void DrawProc18 (GsOT *ot); void DrawProc19 (GsOT *ot); void DrawProc20 (GsOT *ot); void DrawProc21 (GsOT *ot); void DrawProc22 (GsOT *ot); void DrawProc23 (GsOT *ot); void DrawProc24 (GsOT *ot); void DrawProc25 (GsOT *ot); void DrawProc26 (GsOT *ot); void DrawProc27 (GsOT *ot); void DrawProc28 (GsOT *ot); void DrawProc29 (GsOT *ot); void DrawProc30 (GsOT *ot); void DrawProc31 (GsOT *ot); void DrawProc32 (GsOT *ot); void DrawProc33 (GsOT *ot); void DrawProc34 (GsOT *ot); void DrawProc35 (GsOT *ot); void DrawProc36 (GsOT *ot); void DrawProc37 (GsOT *ot); void DrawProc38 (GsOT *ot); void DrawProc39 (GsOT *ot); void DrawProc40 (GsOT *ot); void DrawProc41 (GsOT *ot); void DrawProc42 (GsOT *ot); void DrawProc43 (GsOT *ot); void DrawProc44 (GsOT *ot); void DrawProc45 (GsOT *ot); void DrawProc46 (GsOT *ot); void DrawProc47 (GsOT *ot); void DrawProc48 (GsOT *ot); void DrawProc49 (GsOT *ot); void DrawProc50 (GsOT *ot); void DrawProc51 (GsOT *ot); void DrawProc52 (GsOT *ot); void DrawProc53 (GsOT *ot); void DrawProc54 (GsOT *ot); void DrawProc55 (GsOT *ot); void DrawProc56 (GsOT *ot); void DrawProc57 (GsOT *ot); void DrawProc58 (GsOT *ot); void DrawProc59 (GsOT *ot); void DrawProc60 (GsOT *ot); void DrawProc61 (GsOT *ot); void DrawProc62 (GsOT *ot); void DrawProc63 (GsOT *ot); void DrawProc64 (GsOT *ot); void DrawProc65 (GsOT *ot); void DrawProc66 (GsOT *ot); void DrawProc67 (GsOT *ot); void DrawProc68 (GsOT *ot); void DrawProc69 (GsOT *ot); void DrawProc70 (GsOT *ot); void DrawProc71 (GsOT *ot); void DrawProc72 (GsOT *ot); void DrawProc73 (GsOT *ot); void DrawProc74 (GsOT *ot); void DrawProc75 (GsOT *ot); void DrawProc76 (GsOT *ot); void DrawProc77 (GsOT *ot); void DrawProc78 (GsOT *ot); void DrawProc79 (GsOT *ot); void DrawProc80 (GsOT *ot); void DrawProc81 (GsOT *ot); void DrawProc82 (GsOT *ot); void DrawProc83 (GsOT *ot); void DrawProc84 (GsOT *ot); void DrawProc85 (GsOT *ot); void DrawProc86 (GsOT *ot); void DrawProc87 (GsOT *ot); void DrawProc88 (GsOT *ot); void DrawProc89 (GsOT *ot); void DrawProc90 (GsOT *ot); void DrawProc91 (GsOT *ot); void DrawProc92 (GsOT *ot); void DrawProc93 (GsOT *ot); void DrawProc94 (GsOT *ot); void DrawProc95 (GsOT *ot); void DrawProc96 (GsOT *ot); void DrawProc97 (GsOT *ot); void DrawProc98 (GsOT *ot); void DrawProc99 (GsOT *ot); void DrawProc100 (GsOT *ot); void DrawProc101 (GsOT *ot); void DrawProc102 (GsOT *ot); void DrawProc103 (GsOT *ot); void DrawProc104 (GsOT *ot); void DrawProc105 (GsOT *ot); void DrawProc106 (GsOT *ot); void DrawProc107 (GsOT *ot); void DrawProc108 (GsOT *ot); void DrawProc109 (GsOT *ot); void DrawProc100 (GsOT *ot); void DrawProc111 (GsOT *ot); void DrawProc112 (GsOT *ot); void DrawProc113 (GsOT *ot); void DrawProc114 (GsOT *ot); void DrawProc115 (GsOT *ot); void DrawProc116 (GsOT *ot); void DrawProc117 (GsOT *ot); void DrawProc118 (GsOT *ot); void DrawProc119 (GsOT *ot); void DrawProc120 (GsOT *ot); void DrawProc121 (GsOT *ot); void DrawProc122 (GsOT *ot); void DrawProc123 (GsOT *ot); void DrawProc124 (GsOT *ot); void DrawProc125 (GsOT *ot); void DrawProc126 (GsOT *ot); void DrawProc127 (GsOT *ot); void DrawProc128 (GsOT *ot); void DrawProc129 (GsOT *ot); void DrawProc130 (GsOT *ot); void DrawProc131 (GsOT *ot); void DrawProc132 (GsOT *ot); void DrawProc133 (GsOT *ot); void DrawProc134 (GsOT *ot); void DrawProc135 (GsOT *ot); void DrawProc136 (GsOT *ot); void DrawProc137 (GsOT *ot); void DrawProc138 (GsOT *ot); void DrawProc139 (GsOT *ot); void DrawProc140 (GsOT *ot); void DrawProc141 (GsOT *ot); void DrawProc142 (GsOT *ot); void DrawProc143 (GsOT *ot); void DrawProc144 (GsOT *ot); void DrawProc145 (GsOT *ot); void DrawProc146 (GsOT *ot); void DrawProc147 (GsOT *ot); void DrawProc148 (GsOT *ot); void DrawProc149 (GsOT *ot); void DrawProc150 (GsOT *ot); void DrawProc151 (GsOT *ot); void DrawProc152 (GsOT *ot); void DrawProc153 (GsOT *ot); void DrawProc154 (GsOT *ot); void DrawProc155 (GsOT *ot); void DrawProc156 (GsOT *ot); void DrawProc157 (GsOT *ot); void DrawProc158 (GsOT *ot); void DrawProc159 (GsOT *ot); void DrawProc160 (GsOT *ot); void DrawProc161 (GsOT *ot); void DrawProc162 (GsOT *ot); void DrawProc163 (GsOT *ot); void DrawProc164 (GsOT *ot); void DrawProc165 (GsOT *ot); void DrawProc166 (GsOT *ot); void DrawProc167 (GsOT *ot); void DrawProc168 (GsOT *ot); void DrawProc169 (GsOT *ot); void DrawProc170 (GsOT *ot); void DrawProc171 (GsOT *ot); void DrawProc172 (GsOT *ot); void DrawProc173 (GsOT *ot); void DrawProc174 (GsOT *ot); void DrawProc175 (GsOT *ot); void DrawProc176 (GsOT *ot); void DrawProc177 (GsOT *ot); void DrawProc178 (GsOT *ot); void DrawProc179 (GsOT *ot); void DrawProc180 (GsOT *ot); void DrawProc181 (GsOT *ot); void DrawProc182 (GsOT *ot); void DrawProc183 (GsOT *ot); void DrawProc184 (GsOT *ot); void DrawProc185 (GsOT *ot); void DrawProc186 (GsOT *ot); void DrawProc187 (GsOT *ot); void DrawProc188 (GsOT *ot); void DrawProc189 (GsOT *ot); void DrawProc190 (GsOT *ot); void DrawProc191 (GsOT *ot); void DrawProc192 (GsOT *ot); /**************************************************************************** globals and functions ****************************************************************************/ VOID_FROM_OT DrawProcessFunctionTable[NUMBER_DRAW_PROCESSES]; // horizontally: x+ clockwise, x- anticlockwise // vertically: y+ forward, y- backwards // misc globals int x1 = 0, y1 = 0, x2 = 0, y2 = 0, x3 = 0, y3 = 0; int x6 = 0, y6 = 0, x7 = 0, y7 = 0, x8 = 0, y8 = 0; int x9 = 0, y9 = 0, x10 = 0, y10 = 0; int x11 = 0, y11 = 0, x12 = 0, y12 = 0; int speed11x = 0, speed11y = 0, speed12x = 0, speed12y = 0; int x15 = 0, y15 = 0, speed15x = 0; int x16 = 0, y16 = 0, speed16x = 0; int x17 = 0, y17 = 0, speed17y = 0; int x18 = 0, y18 = 0, speed18y = 0; int x19 = 0, y19 = 0; int x20 = 0, y20 = 0; int x21 = 0, y21 = 0; int x22 = 0, y22 = 0; int x23, y23, r23, angle23; int x31 = 0, y31 = 0; int x32 = 0, y32 = 0; int x33 = 0, y33 = 0; int x47 = 0, y47 = 0; GsSPRITE FieryPictureSprite; GsSPRITE EnvironmentSprite; GsGLINE TheLines[64]; CVECTOR redAtFirst, greenAtFirst, blueAtFirst; // the individual drawing functions void DrawProc1 (GsOT *ot) { int time; time = frameNumber % 128; if (time == 0) x1 = 0; else { if ((frameNumber % 2) == 0) x1--; } SmoothSpectrumSprite.x = x1; SmoothSpectrumSprite.y = 0; CLEAR_SPRITE_RGB(&SmoothSpectrumSprite); CLEAR_SPRITE_ROTATION(&SmoothSpectrumSprite); CLEAR_SPRITE_SCALING(&SmoothSpectrumSprite); GsSortSprite( &SmoothSpectrumSprite, ot, 0); SmoothSpectrumSprite.x += 64; GsSortSprite( &SmoothSpectrumSprite, ot, 0); } void DrawProc2 (GsOT *ot) { int time; register GsSPRITE *sprite; time = frameNumber % 64; if (time == 0) x2 = 0; else x2--; sprite = &SimpleBlueSprite; sprite->x = x2; sprite->y = y2; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortFastSprite(sprite, ot, 0); sprite->x += 64; GsSortFastSprite(sprite, ot, 0); } void DrawProc3 (GsOT *ot) { int time; register GsSPRITE *sprite; time = frameNumber % 64; if (time == 0) y3 = 0; else y3--; sprite = &SimpleBlueSprite; sprite->x = x3; sprite->y = y3; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortFastSprite(sprite, ot, 0); sprite->y += 64; GsSortFastSprite(sprite, ot, 0); } void DrawProc4 (GsOT *ot) { int time; time = frameNumber % 128; TileFiveSprite.mx = TileFiveSprite.w / 2; TileFiveSprite.my = TileFiveSprite.h / 2; TileFiveSprite.x = 0; TileFiveSprite.y = 0; TileFiveSprite.r = 128; TileFiveSprite.g = 128; TileFiveSprite.b = 128; TileFiveSprite.scalex = ONE; TileFiveSprite.scaley = ONE; TileFiveSprite.rotate = (360 / 128) * 4096 * time; GsSortSprite( &TileFiveSprite, ot, 0); } void DrawProc5 (GsOT *ot) { int time; time = frameNumber % 128; SmoothSpectrumSprite.mx = SmoothSpectrumSprite.w / 2; SmoothSpectrumSprite.my = SmoothSpectrumSprite.h / 2; SmoothSpectrumSprite.x = 0; SmoothSpectrumSprite.y = 0; SmoothSpectrumSprite.r = 128; SmoothSpectrumSprite.g = 128; SmoothSpectrumSprite.b = 128; SmoothSpectrumSprite.scalex = ONE; SmoothSpectrumSprite.scaley = ONE; //SmoothSpectrumSprite.rotate = (360 / 128) * 4096 * time; SmoothSpectrumSprite.rotate = (360 * 4096 * time) / 128; GsSortSprite( &SmoothSpectrumSprite, ot, 0); } void DrawProc6 (GsOT *ot) { int time; time = frameNumber % 64; if (time == 0) x6 = 0; else x6--; TileFiveSprite.x = x6; TileFiveSprite.y = y6; TileFiveSprite.rotate = 0; TileFiveSprite.r = 128; TileFiveSprite.g = 128; TileFiveSprite.b = 128; TileFiveSprite.scalex = ONE; TileFiveSprite.scaley = ONE; GsSortSprite( &TileFiveSprite, ot, 0); TileFiveSprite.x += 64; GsSortSprite( &TileFiveSprite, ot, 0); } void DrawProc7 (GsOT *ot) { int time; time = frameNumber % 64; if (time == 0) y7 = 0; else y7--; x7 = 64; SmoothSpectrumSprite.x = x7; SmoothSpectrumSprite.y = y7; SmoothSpectrumSprite.mx = 0; SmoothSpectrumSprite.my = 0; SmoothSpectrumSprite.r = 128; SmoothSpectrumSprite.g = 128; SmoothSpectrumSprite.b = 128; SmoothSpectrumSprite.scalex = ONE; SmoothSpectrumSprite.scaley = ONE; SmoothSpectrumSprite.rotate = 90 * 4096; GsSortSprite( &SmoothSpectrumSprite, ot, 0); SmoothSpectrumSprite.y += 64; GsSortSprite( &SmoothSpectrumSprite, ot, 0); } void DrawProc8 (GsOT *ot) { int time; time = frameNumber % 128; if (time == 0) x8 = 0; else { if ((frameNumber % 2) == 0) x8++; } SmoothSpectrumSprite.x = x8; SmoothSpectrumSprite.y = y8; SmoothSpectrumSprite.rotate = 0; SmoothSpectrumSprite.r = 128; SmoothSpectrumSprite.g = 128; SmoothSpectrumSprite.b = 128; SmoothSpectrumSprite.scalex = ONE; SmoothSpectrumSprite.scaley = ONE; GsSortSprite( &SmoothSpectrumSprite, ot, 0); SmoothSpectrumSprite.x -= 64; GsSortSprite( &SmoothSpectrumSprite, ot, 0); } void DrawProc9 (GsOT *ot) { int time; register GsSPRITE *sprite; time = frameNumber % 64; if (time == 0) y9 = 0; else y9--; sprite = &TileFiveSprite; sprite->x = x9; sprite->y = y9; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortFastSprite(sprite, ot, 0); sprite->y += 64; GsSortFastSprite(sprite, ot, 0); } void DrawProc10 (GsOT *ot) { int time; register GsSPRITE *sprite; time = frameNumber % 64; if (time == 0) y10 = 0; else y10--; sprite = &BarRedSprite; sprite->x = x10; sprite->y = y10; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortFastSprite(sprite, ot, 0); sprite->y += 64; GsSortFastSprite(sprite, ot, 0); } void DrawProc11 (GsOT *ot) { int time; time = frameNumber % 512; if (time < 256) speed11x = ONE - ((time * 2 * ONE) / 256); else speed11x = -ONE + (((time-256) * 2 * ONE) / 256); speed11y = 0; if (time == 0) x11 = 0; else x11 += speed11x; SimpleBlueSprite.x = x11 / (2 * ONE); SimpleBlueSprite.y = y11; SimpleBlueSprite.rotate = 0; SimpleBlueSprite.r = 128; SimpleBlueSprite.g = 128; SimpleBlueSprite.b = 128; SimpleBlueSprite.scalex = ONE; SimpleBlueSprite.scaley = ONE; GsSortSprite( &SimpleBlueSprite, ot, 0); //printf("time %d speed11x %d x11 %d\n", time, speed11x, x11); //printf("x %d y %d\n", SimpleBlueSprite.x, SimpleBlueSprite.y); if (SimpleBlueSprite.x >= 0) SimpleBlueSprite.x -= 64; else SimpleBlueSprite.x += 64; GsSortSprite( &SimpleBlueSprite, ot, 0); } void DrawProc12 (GsOT *ot) { int time; time = frameNumber % 512; if (time < 256) speed12y = ONE - ((time * 2 * ONE) / 256); else speed12y = -ONE + (((time-256) * 2 * ONE) / 256); speed12x = 0; if (time == 0) y12 = 0; else y12 += speed12y; SimpleBlueSprite.x = x12; SimpleBlueSprite.y = y12 / (2 * ONE); SimpleBlueSprite.rotate = 0; SimpleBlueSprite.r = 128; SimpleBlueSprite.g = 128; SimpleBlueSprite.b = 128; SimpleBlueSprite.scalex = ONE; SimpleBlueSprite.scaley = ONE; GsSortSprite( &SimpleBlueSprite, ot, 0); //printf("time %d speed12y %d y12 %d\n", time, speed12y, y12); //printf("x %d y %d\n", SimpleBlueSprite.x, SimpleBlueSprite.y); if (SimpleBlueSprite.y >= 0) SimpleBlueSprite.y -= 64; else SimpleBlueSprite.y += 64; GsSortSprite( &SimpleBlueSprite, ot, 0); } void DrawProc13 (GsOT *ot) { int time, phase, subTime; time = frameNumber % 256; phase = (time * 2) / 256; SimpleBlueSprite.x = 0; SimpleBlueSprite.y = 0; SimpleBlueSprite.scalex = ONE; SimpleBlueSprite.scaley = ONE; SimpleBlueSprite.rotate = 0; switch(phase) { case 0: // green to blue subTime = time; SimpleBlueSprite.r = 128; SimpleBlueSprite.g = 128 - (subTime/2); SimpleBlueSprite.b = 64 + (subTime/2); break; case 1: // blue to green subTime = time - 128; SimpleBlueSprite.r = 128; SimpleBlueSprite.g = 64 + (subTime/2); SimpleBlueSprite.b = 128 - (subTime/2); break; default: assert(FALSE); } GsSortSprite( &SimpleBlueSprite, ot, 0); } void DrawProc14 (GsOT *ot) { int time; time = frameNumber % 64; CircleSprite.x = CircleSprite.w / 4;//CircleSprite.w / 2; CircleSprite.y = CircleSprite.h / 2; CircleSprite.rotate = 0; CircleSprite.r = 128; CircleSprite.g = 128; CircleSprite.b = 128; CircleSprite.mx = CircleSprite.w / 2; CircleSprite.my = CircleSprite.h / 2; CircleSprite.scalex = ONE/2 + ((((3 * ONE)/2) * time) / 64); GsSortSprite( &CircleSprite, ot, 0); } void DrawProc15 (GsOT *ot) { int time, phase; time = frameNumber % 256; phase = (time * 17) / 256; switch(phase) // speed15x swings in simple cycle { case 0: case 1: case 2: case 3: case 4: speed15x = phase; break; case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12: speed15x = 8 - phase; break; case 13: case 14: case 15: case 16: speed15x = phase - 16; break; default: assert(FALSE); } if (time == 0) x15 = 0; else x15 -= speed15x; TileFiveSprite.x = x15; TileFiveSprite.y = y15; TileFiveSprite.rotate = 0; TileFiveSprite.r = 128; TileFiveSprite.g = 128; TileFiveSprite.b = 128; TileFiveSprite.scalex = ONE; TileFiveSprite.scaley = ONE; while (TileFiveSprite.x < -63) TileFiveSprite.x += 64; while (TileFiveSprite.x > 63) TileFiveSprite.x -= 64; GsSortSprite( &TileFiveSprite, ot, 0); if (TileFiveSprite.x <= 0) TileFiveSprite.x += 64; else TileFiveSprite.x -= 64; GsSortSprite( &TileFiveSprite, ot, 0); } void DrawProc16 (GsOT *ot) { int time, phase; time = frameNumber % 256; phase = (time * 17) / 256; switch(phase) // speed16x swings in simple cycle { case 0: case 1: case 2: case 3: case 4: speed16x = phase; break; case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12: speed16x = 8 - phase; break; case 13: case 14: case 15: case 16: speed16x = phase - 16; break; default: assert(FALSE); } if (time == 0) x16 = 0; else x16 -= speed16x; SimpleBlueSprite.x = x16; SimpleBlueSprite.y = y16; SimpleBlueSprite.rotate = 0; SimpleBlueSprite.r = 128; SimpleBlueSprite.g = 128; SimpleBlueSprite.b = 128; SimpleBlueSprite.scalex = ONE; SimpleBlueSprite.scaley = ONE; while (SimpleBlueSprite.x < -63) SimpleBlueSprite.x += 64; while (SimpleBlueSprite.x > 63) SimpleBlueSprite.x -= 64; GsSortSprite( &SimpleBlueSprite, ot, 0); if (SimpleBlueSprite.x <= 0) SimpleBlueSprite.x += 64; else SimpleBlueSprite.x -= 64; GsSortSprite( &SimpleBlueSprite, ot, 0); } void DrawProc17 (GsOT *ot) { int time, phase; time = frameNumber % 256; phase = (time * 17) / 256; switch(phase) // speed17y swings in simple cycle { case 0: case 1: case 2: case 3: case 4: speed17y = phase; break; case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12: speed17y = 8 - phase; break; case 13: case 14: case 15: case 16: speed17y = phase - 16; break; default: assert(FALSE); } if (time == 0) y17 = 0; else y17 -= speed17y; TileFiveSprite.x = x17; TileFiveSprite.y = y17; TileFiveSprite.rotate = 0; TileFiveSprite.r = 128; TileFiveSprite.g = 128; TileFiveSprite.b = 128; TileFiveSprite.scalex = ONE; TileFiveSprite.scaley = ONE; while (TileFiveSprite.y < -63) TileFiveSprite.y += 64; while (TileFiveSprite.y > 63) TileFiveSprite.y -= 64; GsSortSprite( &TileFiveSprite, ot, 0); if (TileFiveSprite.y <= 0) TileFiveSprite.y += 64; else TileFiveSprite.y -= 64; GsSortSprite( &TileFiveSprite, ot, 0); } void DrawProc18 (GsOT *ot) { int time, phase; time = frameNumber % 256; phase = (time * 17) / 256; switch(phase) // speed18y swings in simple cycle { case 0: case 1: case 2: case 3: case 4: speed18y = phase; break; case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12: speed18y = 8 - phase; break; case 13: case 14: case 15: case 16: speed18y = phase - 16; break; default: assert(FALSE); } if (time == 0) y18 = 0; else y18 -= speed18y; SimpleBlueSprite.x = x18; SimpleBlueSprite.y = y18; SimpleBlueSprite.rotate = 0; SimpleBlueSprite.r = 128; SimpleBlueSprite.g = 128; SimpleBlueSprite.b = 128; SimpleBlueSprite.scalex = ONE; SimpleBlueSprite.scaley = ONE; while (SimpleBlueSprite.y < -63) SimpleBlueSprite.y += 64; while (SimpleBlueSprite.y > 63) SimpleBlueSprite.y -= 64; GsSortSprite( &SimpleBlueSprite, ot, 0); if (SimpleBlueSprite.y <= 0) SimpleBlueSprite.y += 64; else SimpleBlueSprite.y -= 64; GsSortSprite( &SimpleBlueSprite, ot, 0); } void DrawProc19 (GsOT *ot) { int time; time = frameNumber % 64; // moving Spectrum2Sprite if (time == 0) y19 = 0; else y19--; x19 = 32; Spectrum2Sprite.x = x19; Spectrum2Sprite.y = y19; Spectrum2Sprite.mx = 0; Spectrum2Sprite.my = 0; Spectrum2Sprite.r = 128; Spectrum2Sprite.g = 128; Spectrum2Sprite.b = 128; Spectrum2Sprite.scalex = ONE; Spectrum2Sprite.scaley = ONE; Spectrum2Sprite.rotate = 90 * 4096; GsSortSprite( &Spectrum2Sprite, ot, 0); Spectrum2Sprite.y += 64; GsSortSprite( &Spectrum2Sprite, ot, 0); } void DrawProc20 (GsOT *ot) { int time; // slow moving Spectrum2Sprite time = frameNumber % 128; if (time == 0) x20 = 0; else { if ((frameNumber % 2) == 0) x20--; } Spectrum2Sprite.x = x20; Spectrum2Sprite.y = y20; Spectrum2Sprite.rotate = 0; Spectrum2Sprite.r = 128; Spectrum2Sprite.g = 128; Spectrum2Sprite.b = 128; Spectrum2Sprite.scalex = ONE; Spectrum2Sprite.scaley = ONE; GsSortSprite( &Spectrum2Sprite, ot, 0); Spectrum2Sprite.x += 64; GsSortSprite( &Spectrum2Sprite, ot, 0); } void DrawProc21 (GsOT *ot) { int time; // fast moving TileFiveSprite time = frameNumber % 64; if (time == 0) x21 = 0; else x21 -= 4; TileFiveSprite.x = x21; TileFiveSprite.y = y21; TileFiveSprite.rotate = 0; TileFiveSprite.r = 128; TileFiveSprite.g = 128; TileFiveSprite.b = 128; TileFiveSprite.scalex = ONE; TileFiveSprite.scaley = ONE; while(TileFiveSprite.x < -63) TileFiveSprite.x += 64; while(TileFiveSprite.x > 63) TileFiveSprite.x -= 64; GsSortSprite( &TileFiveSprite, ot, 0); TileFiveSprite.x += 64; GsSortSprite( &TileFiveSprite, ot, 0); } void DrawProc22 (GsOT *ot) { int time; time = frameNumber % 64; if (time == 0) y22 = 0; else y22 -= 4; SimpleBlueSprite.x = x22; SimpleBlueSprite.y = y22; SimpleBlueSprite.rotate = 0; SimpleBlueSprite.r = 128; SimpleBlueSprite.g = 128; SimpleBlueSprite.b = 128; SimpleBlueSprite.scalex = ONE; SimpleBlueSprite.scaley = ONE; while(SimpleBlueSprite.y < -63) SimpleBlueSprite.y += 64; while(SimpleBlueSprite.y > 63) SimpleBlueSprite.y -= 64; GsSortSprite( &SimpleBlueSprite, ot, 0); SimpleBlueSprite.y += 64; GsSortSprite( &SimpleBlueSprite, ot, 0); } void DrawProc23 (GsOT *ot) { int time; // fire sprite circling time = frameNumber % 64; if (time == 0) angle23 = 0; else angle23 += (ONE/64); r23 = 8; // 16 FireSprite.rotate = 0; FireSprite.r = 128; FireSprite.g = 128; FireSprite.b = 128; x23 = (r23 * rcos(angle23)) >> 12; y23 = (r23 * rsin(angle23)) >> 12; FireSprite.scalex = ONE/2; FireSprite.scaley = ONE/2; FireSprite.x = 8 + x23; // 16 + x23 FireSprite.y = 8 + y23; // 16 + y23 GsSortSprite( &FireSprite, ot, 0); } void DrawProc24 (GsOT *ot) { int time; // four fire sprites circling time = frameNumber % 64; if (time == 0) angle23 = 0; else angle23 += (ONE/64); r23 = 24; FireSprite.rotate = 0; FireSprite.r = 128; FireSprite.g = 128; FireSprite.b = 128; FireSprite.scalex = ONE/4; FireSprite.scaley = ONE/4; x23 = (r23 * rcos(angle23)) >> 12; y23 = (r23 * rsin(angle23)) >> 12; FireSprite.x = 16 + x23; FireSprite.y = 16 + y23; GsSortSprite( &FireSprite, ot, 0); r23 = 16; x23 = (r23 * rcos(angle23)) >> 12; y23 = (r23 * rsin(angle23)) >> 12; FireSprite.x = 16 + x23; FireSprite.y = 16 + y23; GsSortSprite( &FireSprite, ot, 0); r23 = 8; x23 = (r23 * rcos(angle23)) >> 12; y23 = (r23 * rsin(angle23)) >> 12; FireSprite.x = 16 + x23; FireSprite.y = 16 + y23; GsSortSprite( &FireSprite, ot, 0); FireSprite.x = 16; FireSprite.y = 16; GsSortSprite( &FireSprite, ot, 0); } void DrawProc25 (GsOT *ot) { int time; // fire sprite rotating and brightness-pulsing time = frameNumber % 128; FireSprite.rotate = (360 / 128) * 4096 * time; if (time < 64) { FireSprite.r = 128 + time; // 64 + time FireSprite.g = 128 + time; FireSprite.b = 128 + time; } else { FireSprite.r = 192 - (time-64); // 64 + time FireSprite.g = 192 - (time-64); FireSprite.b = 192 - (time-64); } FireSprite.mx = FireSprite.w / 2; FireSprite.my = FireSprite.h / 2; FireSprite.scalex = ONE; FireSprite.scaley = ONE; FireSprite.x = 16; //32; FireSprite.y = 16; //32; GsSortSprite( &FireSprite, ot, 0); } GsBOXF BoxRect1; void DrawProc26 (GsOT *ot) { int time, phase, subTime; time = frameNumber % 768; phase = (time * 3) / 768; switch(phase) { case 0: subTime = time; BoxRect1.r = 256 - (subTime/2); BoxRect1.g = 128; BoxRect1.b = 128 + (subTime/2); break; case 1: subTime = time - 256; BoxRect1.r = 128; BoxRect1.g = 128 + (subTime/2); BoxRect1.b = 256 - (subTime/2); break; case 2: subTime = time - 512; BoxRect1.r = 128 + (subTime/2); BoxRect1.g = 256 - (subTime/2); BoxRect1.b = 128; break; default: assert(FALSE); } BoxRect1.attribute = 0; BoxRect1.x = BoxRect1.y = 0; BoxRect1.w = BoxRect1.h = 32; GsSortBoxFill( &BoxRect1, ot, 0); } void DrawProc27 (GsOT *ot) { // just draw the selected global sprite GlobalSpriteList[SelectedGlobalSprite]->x = 0; GlobalSpriteList[SelectedGlobalSprite]->y = 0; GlobalSpriteList[SelectedGlobalSprite]->scalex = ONE; GlobalSpriteList[SelectedGlobalSprite]->scaley = ONE; GsSortSprite(GlobalSpriteList[SelectedGlobalSprite], ot, 0); } void DrawProc28 (GsOT *ot) { // faces Number25Sprite.x = 0; Number25Sprite.y = 0; Number25Sprite.rotate = 0; Number25Sprite.r = 128; Number25Sprite.g = 128; Number25Sprite.b = 128; Number25Sprite.scalex = ONE; Number25Sprite.scaley = ONE; GsSortSprite( &Number25Sprite, ot, 0); } void DrawProc29 (GsOT *ot) { // blackwav Number26Sprite.x = 0; Number26Sprite.y = 0; Number26Sprite.rotate = 0; Number26Sprite.r = 128; Number26Sprite.g = 128; Number26Sprite.b = 128; Number26Sprite.scalex = ONE; Number26Sprite.scaley = ONE; GsSortSprite( &Number26Sprite, ot, 0); } void DrawProc30 (GsOT *ot) { // faces Number25Sprite.x = 0; Number25Sprite.y = 0; Number25Sprite.rotate = 0; Number25Sprite.r = 128; Number25Sprite.g = 128; Number25Sprite.b = 128; Number25Sprite.scalex = ONE; Number25Sprite.scaley = ONE; GsSortSprite( &Number25Sprite, ot, 0); } void DrawProc31 (GsOT *ot) { int time; // moving yellowsq time = frameNumber % 128; if (time == 0) x31 = 0; else { if ((frameNumber % 2) == 0) x31--; } Number8Sprite.x = x31; Number8Sprite.y = y31; Number8Sprite.rotate = 0; Number8Sprite.r = 128; Number8Sprite.g = 128; Number8Sprite.b = 128; Number8Sprite.scalex = ONE; Number8Sprite.scaley = ONE; GsSortSprite( &Number8Sprite, ot, 0); Number8Sprite.x += 64; GsSortSprite( &Number8Sprite, ot, 0); } void DrawProc32 (GsOT *ot) { int time; // moving pinkflam time = frameNumber % 128; if (time == 0) x32 = 0; else { if ((frameNumber % 2) == 0) x32--; } Number10Sprite.x = x32; Number10Sprite.y = y32; Number10Sprite.rotate = 0; Number10Sprite.r = 128; Number10Sprite.g = 128; Number10Sprite.b = 128; Number10Sprite.scalex = ONE; Number10Sprite.scaley = ONE; GsSortSprite( &Number10Sprite, ot, 0); Number10Sprite.x += 64; GsSortSprite( &Number10Sprite, ot, 0); } void DrawProc33 (GsOT *ot) { int time; // moving tilecube time = frameNumber % 128; if (time == 0) x33 = 0; else { if ((frameNumber % 2) == 0) x33--; } Number3Sprite.x = x33; Number3Sprite.y = y33; Number3Sprite.rotate = 0; Number3Sprite.r = 128; Number3Sprite.g = 128; Number3Sprite.b = 128; Number3Sprite.scalex = ONE; Number3Sprite.scaley = ONE; GsSortSprite( &Number3Sprite, ot, 0); Number3Sprite.x += 64; GsSortSprite( &Number3Sprite, ot, 0); } void DrawProc34 (GsOT *ot) { // just draw the selected global sprite if (frameNumber % 30 == 0) SelectedGlobalSprite = rand() % NumberGlobalSprites; GlobalSpriteList[SelectedGlobalSprite]->x = 0; GlobalSpriteList[SelectedGlobalSprite]->y = 0; GlobalSpriteList[SelectedGlobalSprite]->scalex = ONE; GlobalSpriteList[SelectedGlobalSprite]->scaley = ONE; GsSortSprite(GlobalSpriteList[SelectedGlobalSprite], ot, 0); } void DrawProc35 (GsOT *ot) { int time; LinkSpriteToImageInfo( &FieryPictureSprite, &FireBackgroundImageInfo); FieryPictureSprite.w = 32; FieryPictureSprite.h = 32; time = frameNumber % 384; if (time < 192) { FieryPictureSprite.u += 32 + time; } else { FieryPictureSprite.u += 32 + (384 - time); } GsSortSprite( &FieryPictureSprite, ot, 0); } void DrawProc36 (GsOT *ot) { int time; LinkSpriteToImageInfo( &FieryPictureSprite, &FireBackgroundImageInfo); FieryPictureSprite.w = 32; FieryPictureSprite.h = 32; time = frameNumber % 448; if (time < 224) { FieryPictureSprite.u += time; } else { FieryPictureSprite.u += (448 - time); } FieryPictureSprite.v += 120; GsSortSprite( &FieryPictureSprite, ot, 0); } void DrawProc37 (GsOT *ot) { int time; LinkSpriteToImageInfo( &FieryPictureSprite, &FireBackgroundImageInfo); FieryPictureSprite.w = 32; FieryPictureSprite.h = 32; time = frameNumber % 416; if (time < 208) { FieryPictureSprite.v += time; } else { FieryPictureSprite.v += (416 - time); } FieryPictureSprite.u += 120; GsSortSprite( &FieryPictureSprite, ot, 0); } void DrawProc38 (GsOT *ot) { int sectionID; GsIMAGE *image; // dynamically texture the ship // primitive environment map sectionID = TheViewShip->tunnelSection; image = GetTextureInfoOnTunnelSection(sectionID); LinkSpriteToImageInfo( &EnvironmentSprite, image); EnvironmentSprite.x = 0; EnvironmentSprite.y = 0; if (EnvironmentSprite.w == 32) EnvironmentSprite.w *= 2; if (EnvironmentSprite.h == 32) EnvironmentSprite.h *= 2; GsSortSprite( &EnvironmentSprite, ot, 0); } void DrawProc39 (GsOT *ot) { int i; for (i = 0; i < 32; i++) { TheLines[i].x0 = TheLines[i].x1 = i; TheLines[i].y0 = 0; TheLines[i].y1 = 31; TheLines[i].r0 = 128 - (i * 4); TheLines[i].g0 = 128; TheLines[i].b0 = 128 - (i * 4); TheLines[i].r1 = 128 - (i * 4); TheLines[i].g1 = 0; TheLines[i].b1 = i * 4; GsSortGLine( &TheLines[i], ot, 0); } } void DrawProc40 (GsOT *ot) { int i; for (i = 0; i < 32; i++) { TheLines[i].x0 = TheLines[i].y0 = 0; TheLines[i].x1 = 31; TheLines[i].y1 = i; TheLines[i].r0 = 0; TheLines[i].g0 = 128; TheLines[i].b0 = 0; TheLines[i].r1 = 128 - (i * 4); TheLines[i].g1 = 0; TheLines[i].b1 = i * 4; GsSortGLine( &TheLines[i], ot, 0); } } void DrawProc41 (GsOT *ot) { int time, phase, subTime; int i; time = frameNumber % 360; phase = time / 120; switch(phase) { case 0: subTime = time; redAtFirst.r = 128 - ((subTime * 128) / 120); redAtFirst.g = (subTime * 128) / 120; redAtFirst.b = 0; break; case 1: subTime = time - 120; redAtFirst.r = 0; redAtFirst.g = 128 - ((subTime * 128) / 120); redAtFirst.b = (subTime * 128) / 120; break; case 2: subTime = time - 240; redAtFirst.r = (subTime * 128) / 120; redAtFirst.g = 0; redAtFirst.b = 128 - ((subTime * 128) / 120); break; default: assert(FALSE); } greenAtFirst.g = redAtFirst.r; greenAtFirst.b = redAtFirst.g; greenAtFirst.r = redAtFirst.b; blueAtFirst.b = redAtFirst.r; blueAtFirst.r = redAtFirst.g; blueAtFirst.g = redAtFirst.b; for (i = 0; i < 32; i++) { int tempR, tempG, tempB; TheLines[i].x0 = TheLines[i].y0 = 0; TheLines[i].x1 = 31; TheLines[i].y1 = i; TheLines[i].r0 = redAtFirst.r; TheLines[i].g0 = redAtFirst.r; TheLines[i].b0 = redAtFirst.r; tempR = ((greenAtFirst.r * i) + ((31-i) * blueAtFirst.r)) / 32; //greenAtFirst.r * i - ((i * 4) * blueAtFirst.r); tempG = ((greenAtFirst.g * i) + ((31-i) * blueAtFirst.g)) / 32; //greenAtFirst.g + blueAtFirst.g; tempB = ((greenAtFirst.b * i) + ((31-i) * blueAtFirst.b)) / 32; //greenAtFirst.b + ((i * 4) * blueAtFirst.b); TheLines[i].r1 = tempR; TheLines[i].g1 = tempG; TheLines[i].b1 = tempB; GsSortGLine( &TheLines[i], ot, 0); } } void DrawProc42 (GsOT *ot) { TheLines[0].r0 = 255; TheLines[0].g0 = 0; TheLines[0].b0 = 0; TheLines[0].r1 = 255; TheLines[0].g1 = 0; TheLines[0].b1 = 0; TheLines[0].x0 = 0; TheLines[0].y0 = 0; TheLines[0].x1 = 31; TheLines[0].y1 = 0; GsSortGLine( &TheLines[0], ot, 0); TheLines[0].x0 = 0; TheLines[0].y0 = 1; TheLines[0].x1 = 31; TheLines[0].y1 = 1; GsSortGLine( &TheLines[0], ot, 0); TheLines[0].x0 = 0; TheLines[0].y0 = 30; TheLines[0].x1 = 31; TheLines[0].y1 = 30; GsSortGLine( &TheLines[0], ot, 0); TheLines[0].x0 = 0; TheLines[0].y0 = 31; TheLines[0].x1 = 31; TheLines[0].y1 = 31; GsSortGLine( &TheLines[0], ot, 0); TheLines[0].x0 = 0; TheLines[0].y0 = 0; TheLines[0].x1 = 0; TheLines[0].y1 = 31; GsSortGLine( &TheLines[0], ot, 0); TheLines[0].x0 = 1; TheLines[0].y0 = 0; TheLines[0].x1 = 1; TheLines[0].y1 = 31; GsSortGLine( &TheLines[0], ot, 0); TheLines[0].x0 = 30; TheLines[0].y0 = 0; TheLines[0].x1 = 30; TheLines[0].y1 = 31; GsSortGLine( &TheLines[0], ot, 0); TheLines[0].x0 = 31; TheLines[0].y0 = 0; TheLines[0].x1 = 31; TheLines[0].y1 = 31; GsSortGLine( &TheLines[0], ot, 0); } void DrawProc43 (GsOT *ot) { int time, phase, subTime; time = frameNumber % 180; phase = time / 60; switch(phase) { case 0: subTime = time; redAtFirst.r = 128 - ((subTime * 128) / 60); redAtFirst.g = (subTime * 128) / 60; redAtFirst.b = 0; break; case 1: subTime = time - 60; redAtFirst.r = 0; redAtFirst.g = 128 - ((subTime * 128) / 60); redAtFirst.b = (subTime * 128) / 60; break; case 2: subTime = time - 120; redAtFirst.r = (subTime * 128) / 60; redAtFirst.g = 0; redAtFirst.b = 128 - ((subTime * 128) / 60); break; default: assert(FALSE); } TheLines[0].r0 = redAtFirst.r; TheLines[0].g0 = redAtFirst.g; TheLines[0].b0 = redAtFirst.b; TheLines[0].r1 = redAtFirst.r; TheLines[0].g1 = redAtFirst.g; TheLines[0].b1 = redAtFirst.b; TheLines[0].x0 = 0; TheLines[0].y0 = 0; TheLines[0].x1 = 31; TheLines[0].y1 = 0; GsSortGLine( &TheLines[0], ot, 0); TheLines[0].x0 = 0; TheLines[0].y0 = 1; TheLines[0].x1 = 31; TheLines[0].y1 = 1; GsSortGLine( &TheLines[0], ot, 0); TheLines[0].x0 = 0; TheLines[0].y0 = 30; TheLines[0].x1 = 31; TheLines[0].y1 = 30; GsSortGLine( &TheLines[0], ot, 0); TheLines[0].x0 = 0; TheLines[0].y0 = 31; TheLines[0].x1 = 31; TheLines[0].y1 = 31; GsSortGLine( &TheLines[0], ot, 0); TheLines[0].x0 = 0; TheLines[0].y0 = 0; TheLines[0].x1 = 0; TheLines[0].y1 = 31; GsSortGLine( &TheLines[0], ot, 0); TheLines[0].x0 = 1; TheLines[0].y0 = 0; TheLines[0].x1 = 1; TheLines[0].y1 = 31; GsSortGLine( &TheLines[0], ot, 0); TheLines[0].x0 = 30; TheLines[0].y0 = 0; TheLines[0].x1 = 30; TheLines[0].y1 = 31; GsSortGLine( &TheLines[0], ot, 0); TheLines[0].x0 = 31; TheLines[0].y0 = 0; TheLines[0].x1 = 31; TheLines[0].y1 = 31; GsSortGLine( &TheLines[0], ot, 0); } void DrawProc44 (GsOT *ot) { int time, phase, subTime, i; time = frameNumber % 1800; phase = time / 600; switch(phase) { case 0: subTime = time; redAtFirst.r = 128 - ((subTime * 128) / 600); redAtFirst.g = (subTime * 128) / 600; redAtFirst.b = 0; break; case 1: subTime = time - 600; redAtFirst.r = 0; redAtFirst.g = 128 - ((subTime * 128) / 600); redAtFirst.b = (subTime * 128) / 600; break; case 2: subTime = time - 1200; redAtFirst.r = (subTime * 128) / 600; redAtFirst.g = 0; redAtFirst.b = 128 - ((subTime * 128) / 600); break; default: assert(FALSE); } greenAtFirst.g = redAtFirst.r; greenAtFirst.b = redAtFirst.g; greenAtFirst.r = redAtFirst.b; blueAtFirst.b = redAtFirst.r; blueAtFirst.r = redAtFirst.g; blueAtFirst.g = redAtFirst.b; for (i = 0; i < 32; i++) { int tempR, tempG, tempB; TheLines[i].x0 = TheLines[i].y0 = 0; TheLines[i].x1 = 31; TheLines[i].y1 = i; TheLines[i].r0 = redAtFirst.r * 2; TheLines[i].g0 = redAtFirst.r * 2; TheLines[i].b0 = redAtFirst.r * 2; tempR = ((greenAtFirst.r * i) + ((31-i) * blueAtFirst.r)) / 32; tempG = ((greenAtFirst.g * i) + ((31-i) * blueAtFirst.g)) / 32; tempB = ((greenAtFirst.b * i) + ((31-i) * blueAtFirst.b)) / 32; TheLines[i].r1 = tempR * 2; TheLines[i].g1 = tempG * 2; TheLines[i].b1 = tempB * 2; GsSortGLine( &TheLines[i], ot, 0); } } int CurrentOverlapSprite45 = 0, NewOverlapSprite45 = 0; void DrawProc45 (GsOT *ot) { int time; // global sprite moving // new one fades in anticlockwise time = frameNumber % 120; if (time == 0) { CurrentOverlapSprite45 = NewOverlapSprite45; for (;;) { NewOverlapSprite45 = rand() % NumberGlobalSprites; if (NewOverlapSprite45 != CurrentOverlapSprite45) break; } GlobalSpriteList[CurrentOverlapSprite45]->x = 0; GlobalSpriteList[CurrentOverlapSprite45]->y = 0; GlobalSpriteList[CurrentOverlapSprite45]->scalex = ONE; GlobalSpriteList[CurrentOverlapSprite45]->scaley = ONE; GsSortSprite(GlobalSpriteList[CurrentOverlapSprite45], ot, 1); } else { if (time < 60) { GlobalSpriteList[CurrentOverlapSprite45]->x = 0; GlobalSpriteList[CurrentOverlapSprite45]->y = 0; GlobalSpriteList[CurrentOverlapSprite45]->scalex = ONE; GlobalSpriteList[CurrentOverlapSprite45]->scaley = ONE; GlobalSpriteList[NewOverlapSprite45]->x = 60 - time; GlobalSpriteList[NewOverlapSprite45]->y = 0; GlobalSpriteList[NewOverlapSprite45]->scalex = ONE; GlobalSpriteList[NewOverlapSprite45]->scaley = ONE; GsSortSprite(GlobalSpriteList[CurrentOverlapSprite45], ot, 1); GsSortSprite(GlobalSpriteList[NewOverlapSprite45], ot, 0); } else { GlobalSpriteList[NewOverlapSprite45]->x = 0; GlobalSpriteList[NewOverlapSprite45]->y = 0; GlobalSpriteList[NewOverlapSprite45]->scalex = ONE; GlobalSpriteList[NewOverlapSprite45]->scaley = ONE; GsSortSprite(GlobalSpriteList[NewOverlapSprite45], ot, 0); } } } void DrawProc46 (GsOT *ot) { // dynamically texture the ship // primitive environment map int time; int sectionID; GsIMAGE *image; sectionID = TheViewShip->tunnelSection; image = GetTextureInfoOnTunnelSection(sectionID); LinkSpriteToImageInfo( &EnvironmentSprite, image); if (image == &Wave16TextureInfo || image == &DynamicAreaTwoTextureInfo || image == &DynamicAreaThreeTextureInfo || image == &DynamicAreaFourTextureInfo) { EnvironmentSprite.w = EnvironmentSprite.h = 32; } time = frameNumber % EnvironmentSprite.w; EnvironmentSprite.x = time; EnvironmentSprite.y = 0; GsSortSprite( &EnvironmentSprite, ot, 0); EnvironmentSprite.x = time-EnvironmentSprite.w; EnvironmentSprite.y = 0; GsSortSprite( &EnvironmentSprite, ot, 0); } void DrawProc47 (GsOT *ot) { // another ship environment-mapper, // set speed of sprite flow by speed forward of ship // primitive environment map int sectionID; GsIMAGE *image; int oneQuarterMaxSpeed, xIncrement; sectionID = TheViewShip->tunnelSection; image = GetTextureInfoOnTunnelSection(sectionID); LinkSpriteToImageInfo( &EnvironmentSprite, image); if (image == &Wave16TextureInfo || image == &DynamicAreaTwoTextureInfo || image == &DynamicAreaThreeTextureInfo || image == &DynamicAreaFourTextureInfo) { EnvironmentSprite.w = EnvironmentSprite.h = 32; } oneQuarterMaxSpeed = TheViewShip->maximumSpeed/4; if (oneQuarterMaxSpeed <= 0) return; xIncrement = TheViewShip->velocity.vz / oneQuarterMaxSpeed; x47 += xIncrement; if (x47 >= EnvironmentSprite.w) x47 = 0; EnvironmentSprite.x = x47; EnvironmentSprite.y = 0; GsSortSprite( &EnvironmentSprite, ot, 0); EnvironmentSprite.x = x47-EnvironmentSprite.w; EnvironmentSprite.y = 0; GsSortSprite( &EnvironmentSprite, ot, 0); } int CurrentOverlapSprite48 = 0, NewOverlapSprite48 = 0; void DrawProc48 (GsOT *ot) { int time; // global sprite moving // new one fades in clockwise time = frameNumber % 120; if (time == 0) { CurrentOverlapSprite48 = NewOverlapSprite48; for (;;) { NewOverlapSprite48 = rand() % NumberGlobalSprites; if (NewOverlapSprite48 != CurrentOverlapSprite48) break; } GlobalSpriteList[CurrentOverlapSprite48]->x = 0; GlobalSpriteList[CurrentOverlapSprite48]->y = 0; GlobalSpriteList[CurrentOverlapSprite48]->scalex = ONE; GlobalSpriteList[CurrentOverlapSprite48]->scaley = ONE; GsSortSprite(GlobalSpriteList[CurrentOverlapSprite48], ot, 1); } else { if (time < 60) { GlobalSpriteList[CurrentOverlapSprite48]->x = 0; GlobalSpriteList[CurrentOverlapSprite48]->y = 0; GlobalSpriteList[CurrentOverlapSprite48]->scalex = ONE; GlobalSpriteList[CurrentOverlapSprite48]->scaley = ONE; GlobalSpriteList[NewOverlapSprite48]->x = -60 + time; GlobalSpriteList[NewOverlapSprite48]->y = 0; GlobalSpriteList[NewOverlapSprite48]->scalex = ONE; GlobalSpriteList[NewOverlapSprite48]->scaley = ONE; GsSortSprite(GlobalSpriteList[CurrentOverlapSprite48], ot, 1); GsSortSprite(GlobalSpriteList[NewOverlapSprite48], ot, 0); } else { GlobalSpriteList[NewOverlapSprite48]->x = 0; GlobalSpriteList[NewOverlapSprite48]->y = 0; GlobalSpriteList[NewOverlapSprite48]->scalex = ONE; GlobalSpriteList[NewOverlapSprite48]->scaley = ONE; GsSortSprite(GlobalSpriteList[NewOverlapSprite48], ot, 0); } } } int CurrentOverlapSprite49 = 0, NewOverlapSprite49 = 0; void DrawProc49 (GsOT *ot) { int time; // global sprite moving // new one fades in (forward?) time = frameNumber % 120; if (time == 0) { CurrentOverlapSprite49 = NewOverlapSprite49; for (;;) { NewOverlapSprite49 = rand() % NumberGlobalSprites; if (NewOverlapSprite49 != CurrentOverlapSprite49) break; } GlobalSpriteList[CurrentOverlapSprite49]->x = 0; GlobalSpriteList[CurrentOverlapSprite49]->y = 0; GlobalSpriteList[CurrentOverlapSprite49]->scalex = ONE; GlobalSpriteList[CurrentOverlapSprite49]->scaley = ONE; GsSortSprite(GlobalSpriteList[CurrentOverlapSprite49], ot, 1); } else { if (time < 60) { GlobalSpriteList[CurrentOverlapSprite49]->x = 0; GlobalSpriteList[CurrentOverlapSprite49]->y = 0; GlobalSpriteList[CurrentOverlapSprite49]->scalex = ONE; GlobalSpriteList[CurrentOverlapSprite49]->scaley = ONE; GlobalSpriteList[NewOverlapSprite49]->x = 0; GlobalSpriteList[NewOverlapSprite49]->y = 60 - time; GlobalSpriteList[NewOverlapSprite49]->scalex = ONE; GlobalSpriteList[NewOverlapSprite49]->scaley = ONE; GsSortSprite(GlobalSpriteList[CurrentOverlapSprite49], ot, 1); GsSortSprite(GlobalSpriteList[NewOverlapSprite49], ot, 0); } else { GlobalSpriteList[NewOverlapSprite49]->x = 0; GlobalSpriteList[NewOverlapSprite49]->y = 0; GlobalSpriteList[NewOverlapSprite49]->scalex = ONE; GlobalSpriteList[NewOverlapSprite49]->scaley = ONE; GsSortSprite(GlobalSpriteList[NewOverlapSprite49], ot, 0); } } } int CurrentOverlapSprite50 = 0, NewOverlapSprite50 = 0; void DrawProc50 (GsOT *ot) { int time; // global sprite moving // new one fades in (backward?) time = frameNumber % 120; if (time == 0) { CurrentOverlapSprite50 = NewOverlapSprite50; for (;;) { NewOverlapSprite50 = rand() % NumberGlobalSprites; if (NewOverlapSprite50 != CurrentOverlapSprite50) break; } GlobalSpriteList[CurrentOverlapSprite50]->x = 0; GlobalSpriteList[CurrentOverlapSprite50]->y = 0; GlobalSpriteList[CurrentOverlapSprite50]->scalex = ONE; GlobalSpriteList[CurrentOverlapSprite50]->scaley = ONE; GsSortSprite(GlobalSpriteList[CurrentOverlapSprite50], ot, 1); } else { if (time < 60) { GlobalSpriteList[CurrentOverlapSprite50]->x = 0; GlobalSpriteList[CurrentOverlapSprite50]->y = 0; GlobalSpriteList[CurrentOverlapSprite50]->scalex = ONE; GlobalSpriteList[CurrentOverlapSprite50]->scaley = ONE; GlobalSpriteList[NewOverlapSprite50]->x = 0; GlobalSpriteList[NewOverlapSprite50]->y = -60 + time; GlobalSpriteList[NewOverlapSprite50]->scalex = ONE; GlobalSpriteList[NewOverlapSprite50]->scaley = ONE; GsSortSprite(GlobalSpriteList[CurrentOverlapSprite50], ot, 1); GsSortSprite(GlobalSpriteList[NewOverlapSprite50], ot, 0); } else { GlobalSpriteList[NewOverlapSprite50]->x = 0; GlobalSpriteList[NewOverlapSprite50]->y = 0; GlobalSpriteList[NewOverlapSprite50]->scalex = ONE; GlobalSpriteList[NewOverlapSprite50]->scaley = ONE; GsSortSprite(GlobalSpriteList[NewOverlapSprite50], ot, 0); } } } int CurrentOverlapSprite51 = 0, NewOverlapSprite51 = 0; int mergeDirection51 = 0; void DrawProc51 (GsOT *ot) { int time; // global sprite moving // new one fades in from random direction time = frameNumber % 120; if (time == 0) { CurrentOverlapSprite51 = NewOverlapSprite51; for (;;) { NewOverlapSprite51 = rand() % NumberGlobalSprites; if (NewOverlapSprite51 != CurrentOverlapSprite51) break; } mergeDirection51 = rand() % 4; GlobalSpriteList[CurrentOverlapSprite51]->x = 0; GlobalSpriteList[CurrentOverlapSprite51]->y = 0; GlobalSpriteList[CurrentOverlapSprite51]->scalex = ONE; GlobalSpriteList[CurrentOverlapSprite51]->scaley = ONE; GsSortSprite(GlobalSpriteList[CurrentOverlapSprite51], ot, 1); } else { if (time < 60) { GlobalSpriteList[CurrentOverlapSprite51]->x = 0; GlobalSpriteList[CurrentOverlapSprite51]->y = 0; GlobalSpriteList[CurrentOverlapSprite51]->scalex = ONE; GlobalSpriteList[CurrentOverlapSprite51]->scaley = ONE; if (mergeDirection51 < 0 || mergeDirection51 > 3) mergeDirection51 = 0; switch(mergeDirection51) { case 0: GlobalSpriteList[NewOverlapSprite51]->x = 60 - time; GlobalSpriteList[NewOverlapSprite51]->y = 0; break; case 1: GlobalSpriteList[NewOverlapSprite51]->x = -60 + time; GlobalSpriteList[NewOverlapSprite51]->y = 0; break; case 2: GlobalSpriteList[NewOverlapSprite51]->y = 60 - time; GlobalSpriteList[NewOverlapSprite51]->x = 0; break; case 3: GlobalSpriteList[NewOverlapSprite51]->y = -60 + time; GlobalSpriteList[NewOverlapSprite51]->x = 0; break; default: assert(FALSE); } GlobalSpriteList[NewOverlapSprite51]->scalex = ONE; GlobalSpriteList[NewOverlapSprite51]->scaley = ONE; GsSortSprite(GlobalSpriteList[CurrentOverlapSprite51], ot, 1); GsSortSprite(GlobalSpriteList[NewOverlapSprite51], ot, 0); } else { GlobalSpriteList[NewOverlapSprite51]->x = 0; GlobalSpriteList[NewOverlapSprite51]->y = 0; GlobalSpriteList[NewOverlapSprite51]->scalex = ONE; GlobalSpriteList[NewOverlapSprite51]->scaley = ONE; GsSortSprite(GlobalSpriteList[NewOverlapSprite51], ot, 0); } } } void DrawProc52 (GsOT *ot) { int i; // red triangular effect for (i = 0; i < 9; i++) { TheLines[0].y0 = 0; TheLines[0].y1 = 31; TheLines[0].x0 = 0; TheLines[0].x1 = ((i*4) >= 32) ? 31 : (i*4); TheLines[0].r0 = TheLines[0].r1 = 255; // 128 TheLines[0].g0 = TheLines[0].g1 = 0; TheLines[0].b0 = TheLines[0].b1 = 0; GsSortGLine( &TheLines[0], ot, 0); } } void DrawProc53 (GsOT *ot) { int i; CVECTOR colour; GetColourAtStageOfCycle (900, &colour); for (i = 0; i < 9; i++) { TheLines[0].y0 = 0; TheLines[0].y1 = 31; TheLines[0].x0 = 0; TheLines[0].x1 = ((i*4) >= 32) ? 31 : (i*4); TheLines[0].r0 = TheLines[0].r1 = colour.r * 2; // new * 2 TheLines[0].g0 = TheLines[0].g1 = colour.g * 2; TheLines[0].b0 = TheLines[0].b1 = colour.b * 2; GsSortGLine( &TheLines[0], ot, 0); } } void DrawProc54 (GsOT *ot) { CVECTOR colour; GetColourAtStageOfCycle (300, &colour); Number23Sprite.x = 0; Number23Sprite.y = 0; Number23Sprite.scalex = ONE; Number23Sprite.scaley = ONE; Number23Sprite.r = 64 + colour.r; Number23Sprite.g = 64 + colour.g; Number23Sprite.b = 64 + colour.b; GsSortSprite( &Number23Sprite, ot, 0); } void DrawProc55 (GsOT *ot) { CVECTOR colour; GetColourAtStageOfCycle (180, &colour); Number27Sprite.x = 0; Number27Sprite.y = 0; Number27Sprite.scalex = ONE; Number27Sprite.scaley = ONE; Number27Sprite.r = 64 + colour.r; Number27Sprite.g = 64 + colour.g; Number27Sprite.b = 64 + colour.b; GsSortSprite( &Number27Sprite, ot, 0); } void DrawProc56 (GsOT *ot) { CVECTOR colour; GetColourAtStageOfCycle (180, &colour); ChevronSprite.x = 0; ChevronSprite.y = 0; ChevronSprite.scalex = ONE; ChevronSprite.scaley = ONE; ChevronSprite.r = 64 + colour.r; ChevronSprite.g = 64 + colour.g; ChevronSprite.b = 64 + colour.b; GsSortSprite( &ChevronSprite, ot, 0); } void DrawProc57 (GsOT *ot) { CVECTOR colour; GetColourAtStageOfCycle (180, &colour); Number22Sprite.x = 0; Number22Sprite.y = 0; Number22Sprite.scalex = ONE; Number22Sprite.scaley = ONE; Number22Sprite.r = 128 + colour.r; // used to be 64 Number22Sprite.g = 128 + colour.g; Number22Sprite.b = 128 + colour.b; GsSortSprite( &Number22Sprite, ot, 0); } void DrawProc58 (GsOT *ot) { CVECTOR colour; GetColourAtStageOfCycle (180, &colour); Number26Sprite.x = 0; Number26Sprite.y = 0; Number26Sprite.scalex = ONE; Number26Sprite.scaley = ONE; Number26Sprite.r = 64 + colour.r; Number26Sprite.g = 64 + colour.g; Number26Sprite.b = 64 + colour.b; GsSortSprite( &Number26Sprite, ot, 0); } void DrawProc59 (GsOT *ot) { CVECTOR colour; GetColourAtStageOfCycle (180, &colour); PanelSprite.x = 0; PanelSprite.y = 0; PanelSprite.scalex = ONE; PanelSprite.scaley = ONE; PanelSprite.r = 64 + colour.r; PanelSprite.g = 64 + colour.g; PanelSprite.b = 64 + colour.b; GsSortSprite( &PanelSprite, ot, 0); } void DrawProc60 (GsOT *ot) { CVECTOR colour; GetColourAtStageOfCycle (180, &colour); Number6Sprite.x = 0; Number6Sprite.y = 0; Number6Sprite.scalex = ONE; Number6Sprite.scaley = ONE; Number6Sprite.r = 96 + (colour.r >> 1); Number6Sprite.g = 96 + (colour.g >> 1); Number6Sprite.b = 96 + (colour.b >> 1); GsSortSprite( &Number6Sprite, ot, 0); } void DrawProc61 (GsOT *ot) { CVECTOR colour; GetColourAtStageOfCycle (180, &colour); FireSprite.x = 0; FireSprite.y = 0; FireSprite.scalex = ONE; FireSprite.scaley = ONE; FireSprite.r = 96 + (colour.r >> 1); FireSprite.g = 96 + (colour.g >> 1); FireSprite.b = 96 + (colour.b >> 1); GsSortSprite( &FireSprite, ot, 0); } int CurrentOverlapSprite62 = 0, NewOverlapSprite62 = 0; int mergeDirection62 = 0; void DrawProc62 (GsOT *ot) { int time; // global sprite continually fading in // new one fades in from random direction time = frameNumber % 60; if (time == 0) { CurrentOverlapSprite62 = NewOverlapSprite62; for (;;) { NewOverlapSprite62 = rand() % NumberGlobalSprites; if (NewOverlapSprite62 != CurrentOverlapSprite62) break; } mergeDirection62 = rand() % 4; GlobalSpriteList[CurrentOverlapSprite62]->x = 0; GlobalSpriteList[CurrentOverlapSprite62]->y = 0; GlobalSpriteList[CurrentOverlapSprite62]->scalex = ONE; GlobalSpriteList[CurrentOverlapSprite62]->scaley = ONE; GsSortSprite(GlobalSpriteList[CurrentOverlapSprite62], ot, 1); } else { GlobalSpriteList[CurrentOverlapSprite62]->x = 0; GlobalSpriteList[CurrentOverlapSprite62]->y = 0; GlobalSpriteList[CurrentOverlapSprite62]->scalex = ONE; GlobalSpriteList[CurrentOverlapSprite62]->scaley = ONE; if (mergeDirection62 < 0 || mergeDirection62 > 3) mergeDirection62 = 0; switch(mergeDirection62) { case 0: GlobalSpriteList[NewOverlapSprite62]->x = 60 - time; GlobalSpriteList[NewOverlapSprite62]->y = 0; break; case 1: GlobalSpriteList[NewOverlapSprite62]->x = -60 + time; GlobalSpriteList[NewOverlapSprite62]->y = 0; break; case 2: GlobalSpriteList[NewOverlapSprite62]->y = 60 - time; GlobalSpriteList[NewOverlapSprite62]->x = 0; break; case 3: GlobalSpriteList[NewOverlapSprite62]->y = -60 + time; GlobalSpriteList[NewOverlapSprite62]->x = 0; break; default: assert(FALSE); } GlobalSpriteList[NewOverlapSprite62]->scalex = ONE; GlobalSpriteList[NewOverlapSprite62]->scaley = ONE; GsSortSprite(GlobalSpriteList[CurrentOverlapSprite62], ot, 1); GsSortSprite(GlobalSpriteList[NewOverlapSprite62], ot, 0); } } int period63, subPeriod63; CVECTOR redAtFirst63; int CurrentOverlapSprite63, NewOverlapSprite63; void DrawProc63 (GsOT *ot) { int time, phase, subTime = 0, i, indent; period63 = 384; subPeriod63 = period63 / 3; time = frameNumber % period63; phase = time / subPeriod63; switch(phase) { case 0: subTime = time; redAtFirst63.r = 128 - ((subTime * 128) / subPeriod63); redAtFirst63.g = (subTime * 128) / subPeriod63; redAtFirst63.b = 0; break; case 1: subTime = time - subPeriod63; redAtFirst63.r = 0; redAtFirst63.g = 128 - ((subTime * 128) / subPeriod63); redAtFirst63.b = (subTime * 128) / subPeriod63; break; case 2: subTime = time - (subPeriod63*2); redAtFirst63.r = (subTime * 128) / subPeriod63; redAtFirst63.g = 0; redAtFirst63.b = 128 - ((subTime * 128) / subPeriod63); break; default: assert(FALSE); } if (subTime == 0) { for (;;) { NewOverlapSprite63 = rand() % NumberGlobalSprites; if (NewOverlapSprite63 != CurrentOverlapSprite63) break; } CurrentOverlapSprite63 = NewOverlapSprite63; } GlobalSpriteList[CurrentOverlapSprite63]->x = 0; GlobalSpriteList[CurrentOverlapSprite63]->y = 0; GlobalSpriteList[CurrentOverlapSprite63]->scalex = ONE; GlobalSpriteList[CurrentOverlapSprite63]->scaley = ONE; GsSortSprite(GlobalSpriteList[CurrentOverlapSprite63], ot, 1); if (subTime < (subPeriod63/2)) { indent = subTime/2; indent = 15 - indent; } else { indent = (subPeriod63 - subTime)/2; indent = 15 - indent; } TheLines[0].r0 = TheLines[0].r1 = redAtFirst63.r; TheLines[0].g0 = TheLines[0].g1 = redAtFirst63.g; TheLines[0].b0 = TheLines[0].b1 = redAtFirst63.b; for (i = 0; i < indent; i++) { TheLines[0].x0 = i; TheLines[0].y0 = i; TheLines[0].x1 = 32 - i; TheLines[0].y1 = i; GsSortGLine( &TheLines[0], ot, 0); TheLines[0].x0 = i; TheLines[0].y0 = i; TheLines[0].x1 = i; TheLines[0].y1 = 32 - i; GsSortGLine( &TheLines[0], ot, 0); TheLines[0].x0 = 32 - i; TheLines[0].y0 = 32 - i; TheLines[0].x1 = 32 - i; TheLines[0].y1 = i; GsSortGLine( &TheLines[0], ot, 0); TheLines[0].x0 = 32 - i; TheLines[0].y0 = 32 - i; TheLines[0].x1 = i; TheLines[0].y1 = 32 - i; GsSortGLine( &TheLines[0], ot, 0); } } int period64, subPeriod64; CVECTOR redAtFirst64; int CurrentOverlapSprite64, NewOverlapSprite64; void DrawProc64 (GsOT *ot) { int time, phase, subTime = 0, i, indent; period64 = 384; subPeriod64 = period64 / 3; time = frameNumber % period64; phase = time / subPeriod64; switch(phase) { case 0: subTime = time; redAtFirst64.r = 128 - ((subTime * 128) / subPeriod64); redAtFirst64.g = (subTime * 128) / subPeriod64; redAtFirst64.b = 0; break; case 1: subTime = time - subPeriod64; redAtFirst64.r = 0; redAtFirst64.g = 128 - ((subTime * 128) / subPeriod64); redAtFirst64.b = (subTime * 128) / subPeriod64; break; case 2: subTime = time - (subPeriod64*2); redAtFirst64.r = (subTime * 128) / subPeriod64; redAtFirst64.g = 0; redAtFirst64.b = 128 - ((subTime * 128) / subPeriod64); break; default: assert(FALSE); } if (subTime == 0) { for (;;) { NewOverlapSprite64 = rand() % NumberGlobalSprites; if (NewOverlapSprite64 != CurrentOverlapSprite64) break; } CurrentOverlapSprite64 = NewOverlapSprite64; } GlobalSpriteList[CurrentOverlapSprite64]->x = 0; GlobalSpriteList[CurrentOverlapSprite64]->y = 0; GlobalSpriteList[CurrentOverlapSprite64]->scalex = ONE; GlobalSpriteList[CurrentOverlapSprite64]->scaley = ONE; GsSortSprite(GlobalSpriteList[CurrentOverlapSprite64], ot, 1); if (subTime < (subPeriod64/2)) { indent = subTime/2; indent = 15 - indent; } else { indent = (subPeriod64 - subTime)/2; indent = 15 - indent; } TheLines[0].r0 = TheLines[0].r1 = redAtFirst64.r; TheLines[0].g0 = TheLines[0].g1 = redAtFirst64.g; TheLines[0].b0 = TheLines[0].b1 = redAtFirst64.b; for (i = 0; i < indent; i++) { TheLines[0].x0 = i; TheLines[0].y0 = i; TheLines[0].x1 = 32 - i; TheLines[0].y1 = i; GsSortGLine( &TheLines[0], ot, 0); TheLines[0].x0 = i; TheLines[0].y0 = i; TheLines[0].x1 = i; TheLines[0].y1 = 32 - i; GsSortGLine( &TheLines[0], ot, 0); TheLines[0].x0 = 32 - i; TheLines[0].y0 = 32 - i; TheLines[0].x1 = 32 - i; TheLines[0].y1 = i; GsSortGLine( &TheLines[0], ot, 0); TheLines[0].x0 = 32 - i; TheLines[0].y0 = 32 - i; TheLines[0].x1 = i; TheLines[0].y1 = 32 - i; GsSortGLine( &TheLines[0], ot, 0); } } int period65, subPeriod65; CVECTOR redAtFirst65; int CurrentOverlapSprite65, NewOverlapSprite65; void DrawProc65 (GsOT *ot) { int time, phase, subTime = 0, i, indent; period65 = 384; subPeriod65 = period65 / 3; time = frameNumber % period65; phase = time / subPeriod65; switch(phase) { case 0: subTime = time; redAtFirst65.r = 128 - ((subTime * 128) / subPeriod65); redAtFirst65.g = (subTime * 128) / subPeriod65; redAtFirst65.b = 0; break; case 1: subTime = time - subPeriod65; redAtFirst65.r = 0; redAtFirst65.g = 128 - ((subTime * 128) / subPeriod65); redAtFirst65.b = (subTime * 128) / subPeriod65; break; case 2: subTime = time - (subPeriod65*2); redAtFirst65.r = (subTime * 128) / subPeriod65; redAtFirst65.g = 0; redAtFirst65.b = 128 - ((subTime * 128) / subPeriod65); break; default: assert(FALSE); } if (subTime == 0) { for (;;) { NewOverlapSprite65 = rand() % NumberGlobalSprites; if (NewOverlapSprite65 != CurrentOverlapSprite65) break; } CurrentOverlapSprite65 = NewOverlapSprite65; } GlobalSpriteList[CurrentOverlapSprite65]->x = 0; GlobalSpriteList[CurrentOverlapSprite65]->y = 0; GlobalSpriteList[CurrentOverlapSprite65]->scalex = ONE; GlobalSpriteList[CurrentOverlapSprite65]->scaley = ONE; GsSortSprite(GlobalSpriteList[CurrentOverlapSprite65], ot, 1); if (subTime < (subPeriod65/2)) { indent = subTime; indent = 31 - indent; } else { indent = subPeriod65 - subTime; indent = 31 - indent; } TheLines[0].r0 = TheLines[0].r1 = redAtFirst65.r; TheLines[0].g0 = TheLines[0].g1 = redAtFirst65.g; TheLines[0].b0 = TheLines[0].b1 = redAtFirst65.b; for (i = 0; i < indent; i++) { TheLines[0].x0 = 0; TheLines[0].y0 = i; TheLines[0].x1 = i; TheLines[0].y1 = 0; GsSortGLine( &TheLines[0], ot, 0); TheLines[0].x0 = 31; TheLines[0].y0 = i; TheLines[0].x1 = 31 - i; TheLines[0].y1 = 0; GsSortGLine( &TheLines[0], ot, 0); TheLines[0].x0 = 31 - i; TheLines[0].y0 = 31; TheLines[0].x1 = 31; TheLines[0].y1 = 31 - i; GsSortGLine( &TheLines[0], ot, 0); TheLines[0].x0 = 0; TheLines[0].y0 = 31 - i; TheLines[0].x1 = i; TheLines[0].y1 = 31; GsSortGLine( &TheLines[0], ot, 0); } } // NOTHING VISIBLE (maybe because it needs colour to begin: everything // just reflects everything else, no initial colour) void DrawProc66 (GsOT *ot) { ScreenSprite.x = 0; ScreenSprite.y = 0; ScreenSprite.scalex = ONE; ScreenSprite.scaley = ONE; ScreenSprite.r = 128; ScreenSprite.g = 128; ScreenSprite.b = 128; GsSortSprite( &ScreenSprite, ot, 0); } // NOTHING VISIBLE (maybe because it needs colour to begin: everything // just reflects everything else, no initial colour) void DrawProc67 (GsOT *ot) { int time; time = frameNumber % 64; if (time < 32) { ScreenSprite.u += time; } else { ScreenSprite.u += (64 - time); } ScreenSprite.x = 0; ScreenSprite.y = 0; ScreenSprite.scalex = ONE; ScreenSprite.scaley = ONE; ScreenSprite.r = 128; ScreenSprite.g = 128; ScreenSprite.b = 128; GsSortSprite( &ScreenSprite, ot, 0); } // this one: sprites overlap slowly, // rgb gouraud triangle occupies half of texture // recent alteration: now, sprite comes from random direction // improvement: cycle the colours round triangle corners int CurrentOverlapSprite68, NewOverlapSprite68; int mergeDirection68 = 0; void DrawProc68 (GsOT *ot) { int time, i; time = frameNumber % 120; if (time == 0) { CurrentOverlapSprite68 = NewOverlapSprite68; for (;;) { NewOverlapSprite68 = rand() % NumberGlobalSprites; if (NewOverlapSprite68 != CurrentOverlapSprite68) break; } GlobalSpriteList[CurrentOverlapSprite68]->x = 0; GlobalSpriteList[CurrentOverlapSprite68]->y = 0; GlobalSpriteList[CurrentOverlapSprite68]->scalex = ONE; GlobalSpriteList[CurrentOverlapSprite68]->scaley = ONE; GsSortSprite(GlobalSpriteList[CurrentOverlapSprite68], ot, 3); mergeDirection68 = rand() % 4; } else { if (time < 60) { GlobalSpriteList[CurrentOverlapSprite68]->x = 0; GlobalSpriteList[CurrentOverlapSprite68]->y = 0; GlobalSpriteList[CurrentOverlapSprite68]->scalex = ONE; GlobalSpriteList[CurrentOverlapSprite68]->scaley = ONE; if (mergeDirection68 < 0 || mergeDirection68 > 3) mergeDirection68 = 0; switch(mergeDirection68) { case 0: GlobalSpriteList[NewOverlapSprite68]->x = 60 - time; GlobalSpriteList[NewOverlapSprite68]->y = 0; break; case 1: GlobalSpriteList[NewOverlapSprite68]->x = -60 + time; GlobalSpriteList[NewOverlapSprite68]->y = 0; break; case 2: GlobalSpriteList[NewOverlapSprite68]->y = 60 - time; GlobalSpriteList[NewOverlapSprite68]->x = 0; break; case 3: GlobalSpriteList[NewOverlapSprite68]->y = -60 + time; GlobalSpriteList[NewOverlapSprite68]->x = 0; break; default: assert(FALSE); } GlobalSpriteList[NewOverlapSprite68]->scalex = ONE; GlobalSpriteList[NewOverlapSprite68]->scaley = ONE; GsSortSprite(GlobalSpriteList[CurrentOverlapSprite68], ot, 3); GsSortSprite(GlobalSpriteList[NewOverlapSprite68], ot, 2); } else { GlobalSpriteList[NewOverlapSprite68]->x = 0; GlobalSpriteList[NewOverlapSprite68]->y = 0; GlobalSpriteList[NewOverlapSprite68]->scalex = ONE; GlobalSpriteList[NewOverlapSprite68]->scaley = ONE; GsSortSprite(GlobalSpriteList[NewOverlapSprite68], ot, 2); } } for (i = 0; i < 32; i++) { TheLines[i].x0 = TheLines[i].y0 = 0; TheLines[i].x1 = 31; TheLines[i].y1 = i; TheLines[i].r0 = 0; TheLines[i].g0 = 128; TheLines[i].b0 = 0; TheLines[i].r1 = 128 - (i * 4); TheLines[i].g1 = 0; TheLines[i].b1 = i * 4; GsSortGLine( &TheLines[i], ot, 0); } } int points69[8] = {0,2,4,6,30,32,34,36}; int period69, subPeriod69; CVECTOR redAtFirst69; void DrawProc69 (GsOT *ot) { int lineTime, time, phase, subTime, i; int x, y; lineTime = frameNumber % 120; if (lineTime == 0) { points69[0] = 0; points69[1] = 2; points69[2] = 4; points69[3] = 6; points69[4] = 30; points69[5] = 32; points69[6] = 34; points69[7] = 36; } else { for (i = 0; i < 8; i++) { points69[i] = GetNextIndex(points69[i], ANTICLOCKWISE, 1); } } period69 = 600; subPeriod69 = period69 / 3; time = frameNumber % period69; phase = time / subPeriod69; switch(phase) { case 0: subTime = time; redAtFirst69.r = 128 - ((subTime * 128) / subPeriod69); redAtFirst69.g = (subTime * 128) / subPeriod69; redAtFirst69.b = 0; break; case 1: subTime = time - subPeriod69; redAtFirst69.r = 0; redAtFirst69.g = 128 - ((subTime * 128) / subPeriod69); redAtFirst69.b = (subTime * 128) / subPeriod69; break; case 2: subTime = time - (subPeriod69*2); redAtFirst69.r = (subTime * 128) / subPeriod69; redAtFirst69.g = 0; redAtFirst69.b = 128 - ((subTime * 128) / subPeriod69); break; default: assert(FALSE); } TheLines[0].r0 = TheLines[0].r1 = redAtFirst69.r * 2; TheLines[0].g0 = TheLines[0].g1 = redAtFirst69.g * 2; TheLines[0].b0 = TheLines[0].b1 = redAtFirst69.b * 2; for (i = 0; i < 4; i++) { GetXandYofPointIndex(points69[i], &x, &y); TheLines[0].x0 = x; TheLines[0].y0 = y; GetXandYofPointIndex(points69[i+4], &x, &y); TheLines[0].x1 = x; TheLines[0].y1 = y; GsSortGLine( &TheLines[0], ot, 1); } } int points70[12] = {0,2,4,6,8,10,30,32,34,36,38,40}; int period70, subPeriod70; CVECTOR redAtFirst70; void DrawProc70 (GsOT *ot) { int lineTime, time, phase, subTime, i; int x, y; lineTime = frameNumber % 120; if (lineTime == 0) { points70[0] = 0; points70[1] = 2; points70[2] = 4; points70[3] = 6; points70[4] = 8; points70[5] = 10; points70[6] = 30; points70[7] = 32; points70[8] = 34; points70[9] = 36; points70[10] = 38; points70[11] = 40; } else { for (i = 0; i < 12; i++) { points70[i] = GetNextIndex(points70[i], ANTICLOCKWISE, 1); } } period70 = 600; subPeriod70 = period70 / 3; time = frameNumber % period70; phase = time / subPeriod70; switch(phase) { case 0: subTime = time; redAtFirst70.r = 128 - ((subTime * 128) / subPeriod70); redAtFirst70.g = (subTime * 128) / subPeriod70; redAtFirst70.b = 0; break; case 1: subTime = time - subPeriod70; redAtFirst70.r = 0; redAtFirst70.g = 128 - ((subTime * 128) / subPeriod70); redAtFirst70.b = (subTime * 128) / subPeriod70; break; case 2: subTime = time - (subPeriod70*2); redAtFirst70.r = (subTime * 128) / subPeriod70; redAtFirst70.g = 0; redAtFirst70.b = 128 - ((subTime * 128) / subPeriod70); break; default: assert(FALSE); } TheLines[0].r0 = TheLines[0].r1 = (redAtFirst70.r * 3) / 2; TheLines[0].g0 = TheLines[0].g1 = (redAtFirst70.g * 3) / 2; TheLines[0].b0 = TheLines[0].b1 = (redAtFirst70.b * 3) / 2; for (i = 0; i < 6; i++) { GetXandYofPointIndex(points69[i], &x, &y); TheLines[0].x0 = x; TheLines[0].y0 = y; GetXandYofPointIndex(points69[i+6], &x, &y); TheLines[0].x1 = x; TheLines[0].y1 = y; GsSortGLine( &TheLines[0], ot, 1); } } int x71 = 0, y71 = 0; int direction71 = 0; void DrawProc71 (GsOT *ot) { int time; register GsSPRITE *sprite; time = frameNumber % 64; if (time == 0) { int newDirection; x71 = 0; y71 = 0; for (;;) { newDirection = rand() % 4; if (newDirection != direction71) break; } direction71 = newDirection; } else { switch(direction71) { case 0: x71--; break; case 1: x71++; break; case 2: y71--; break; case 3: y71++; break; default: assert(FALSE); } } sprite = &SimpleBlueSprite; sprite->x = x71; sprite->y = y71; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortFastSprite(sprite, ot, 0); switch(direction71) { case 0: sprite->x += 64; break; case 1: sprite->x -= 64; break; case 2: sprite->y += 64; break; case 3: sprite->y -= 64; break; default: assert(FALSE); } GsSortFastSprite(sprite, ot, 0); } int x72 = 0, y72 = 0; int direction72 = 0; void DrawProc72 (GsOT *ot) { int time; register GsSPRITE *sprite; time = frameNumber % 64; if (time == 0) { int newDirection; x72 = 0; y72 = 0; for (;;) { newDirection = rand() % 4; if (newDirection != direction72) break; } direction72 = newDirection; } else { switch(direction72) { case 0: x72--; break; case 1: x72++; break; case 2: y72--; break; case 3: y72++; break; default: assert(FALSE); } } sprite = &TileFiveSprite; sprite->x = x72; sprite->y = y72; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortFastSprite(sprite, ot, 0); switch(direction72) { case 0: sprite->x += 64; break; case 1: sprite->x -= 64; break; case 2: sprite->y += 64; break; case 3: sprite->y -= 64; break; default: assert(FALSE); } GsSortFastSprite(sprite, ot, 0); } void DrawProc73 (GsOT *ot) { int time; GsSPRITE *sprite; time = frameNumber % 128; sprite = &Spiral1Sprite; sprite->mx = sprite->w / 2; sprite->my = sprite->h / 2; sprite->x = 0; sprite->y = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; sprite->rotate = (360 / 128) * 4096 * time; GsSortSprite(sprite, ot, 0); } void DrawProc74 (GsOT *ot) { int time; GsSPRITE *sprite; time = frameNumber % 128; sprite = &Spiral2Sprite; sprite->mx = sprite->w / 2; sprite->my = sprite->h / 2; sprite->x = 0; sprite->y = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; sprite->rotate = (360 / 128) * 4096 * time; GsSortSprite(sprite, ot, 0); } void DrawProc75 (GsOT *ot) { int time; GsSPRITE *sprite; time = frameNumber % 128; sprite = &Spiral3Sprite; sprite->mx = sprite->w / 2; sprite->my = sprite->h / 2; sprite->x = 0; sprite->y = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; sprite->rotate = (360 / 128) * 4096 * time; GsSortSprite(sprite, ot, 0); } void DrawProc76 (GsOT *ot) { int time; GsSPRITE *sprite; time = frameNumber % 128; sprite = &Spiral4Sprite; sprite->mx = sprite->w / 2; sprite->my = sprite->h / 2; sprite->x = 0; sprite->y = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; sprite->rotate = (360 / 128) * 4096 * time; GsSortSprite(sprite, ot, 0); } // beginning of many draw procs created to overcome texturing troubles // just draw sprite of texture itself void DrawProc77 (GsOT *ot) { GsSPRITE *sprite; sprite = &SmoothSpectrumSprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc78 (GsOT *ot) { GsSPRITE *sprite; sprite = &SmoothRedSprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc79 (GsOT *ot) { GsSPRITE *sprite; //sprite = &Arrow1Sprite; sprite = &Arrow2Sprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc80 (GsOT *ot) { GsSPRITE *sprite; sprite = &Arrow2Sprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc81 (GsOT *ot) { GsSPRITE *sprite; sprite = &CircleSprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc82 (GsOT *ot) { GsSPRITE *sprite; sprite = &HorizontalLargeSprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc83 (GsOT *ot) { GsSPRITE *sprite; sprite = &PanelSprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc84 (GsOT *ot) { GsSPRITE *sprite; sprite = &TileFiveSprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc85 (GsOT *ot) { GsSPRITE *sprite; sprite = &FireSprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc86 (GsOT *ot) { GsSPRITE *sprite; sprite = &Spectrum2Sprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc87 (GsOT *ot) { GsSPRITE *sprite; sprite = &Spectrum3Sprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc88 (GsOT *ot) { GsSPRITE *sprite; sprite = &Number6Sprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc89 (GsOT *ot) { GsSPRITE *sprite; sprite = &Number7Sprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc90 (GsOT *ot) { GsSPRITE *sprite; sprite = &Number9Sprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc91 (GsOT *ot) { GsSPRITE *sprite; sprite = &Number11Sprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc92 (GsOT *ot) { GsSPRITE *sprite; sprite = &Number13Sprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc93 (GsOT *ot) { GsSPRITE *sprite; sprite = &Number16Sprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc94 (GsOT *ot) { GsSPRITE *sprite; sprite = &Number17Sprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc95 (GsOT *ot) { GsSPRITE *sprite; sprite = &Number31Sprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc96 (GsOT *ot) { GsSPRITE *sprite; sprite = &Number32Sprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc97 (GsOT *ot) { GsSPRITE *sprite; sprite = &Number33Sprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc98 (GsOT *ot) { GsSPRITE *sprite; sprite = &Number34Sprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc99 (GsOT *ot) { GsSPRITE *sprite; sprite = &Number35Sprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc100 (GsOT *ot) { GsSPRITE *sprite; sprite = &Number36Sprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc101 (GsOT *ot) { GsSPRITE *sprite; sprite = &Number37Sprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc102 (GsOT *ot) { GsSPRITE *sprite; sprite = &Number38Sprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc103 (GsOT *ot) { GsSPRITE *sprite; sprite = &Number39Sprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc104 (GsOT *ot) { GsSPRITE *sprite; sprite = &Number40Sprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc105 (GsOT *ot) { GsSPRITE *sprite; sprite = &Number42Sprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc106 (GsOT *ot) { GsSPRITE *sprite; sprite = &Number43Sprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc107 (GsOT *ot) { GsSPRITE *sprite; sprite = &Number45Sprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc108 (GsOT *ot) { GsSPRITE *sprite; sprite = &Number46Sprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc109 (GsOT *ot) { GsSPRITE *sprite; sprite = &Number47Sprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc110 (GsOT *ot) { GsSPRITE *sprite; sprite = &Number48Sprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc111 (GsOT *ot) { GsSPRITE *sprite; sprite = &Number49Sprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc112 (GsOT *ot) { GsSPRITE *sprite; sprite = &Number50Sprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc113 (GsOT *ot) { GsSPRITE *sprite; sprite = &Number51Sprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc114 (GsOT *ot) { GsSPRITE *sprite; sprite = &Number52Sprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc115 (GsOT *ot) { GsSPRITE *sprite; sprite = &Spiral1Sprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc116 (GsOT *ot) { GsSPRITE *sprite; sprite = &Spiral2Sprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc117 (GsOT *ot) { GsSPRITE *sprite; sprite = &Spiral3Sprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } void DrawProc118 (GsOT *ot) { GsSPRITE *sprite; sprite = &Spiral4Sprite; sprite->x = 0; sprite->y = 0; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortSprite(sprite, ot, 0); } int x119 = 0, y119 = 0; int direction119 = 0; void DrawProc119 (GsOT *ot) { int time; register GsSPRITE *sprite; time = frameNumber % 64; if (time == 0) { int newDirection; x119 = 0; y119 = 0; for (;;) { newDirection = rand() % 4; if (newDirection != direction119) break; } direction119 = newDirection; } else { switch(direction119) { case 0: x119--; break; case 1: x119++; break; case 2: y119--; break; case 3: y119++; break; default: assert(FALSE); } } sprite = &Number37Sprite; sprite->x = x119; sprite->y = y119; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortFastSprite(sprite, ot, 0); switch(direction119) { case 0: sprite->x += 64; break; case 1: sprite->x -= 64; break; case 2: sprite->y += 64; break; case 3: sprite->y -= 64; break; default: assert(FALSE); } GsSortFastSprite(sprite, ot, 0); } int x120 = 0, y120 = 0; int direction120 = 0; void DrawProc120 (GsOT *ot) { int time; register GsSPRITE *sprite; time = frameNumber % 64; if (time == 0) { int newDirection; x120 = 0; y120 = 0; for (;;) { newDirection = rand() % 4; if (newDirection != direction120) break; } direction120 = newDirection; } else { switch(direction120) { case 0: x120--; break; case 1: x120++; break; case 2: y120--; break; case 3: y120++; break; default: assert(FALSE); } } sprite = &Number38Sprite; sprite->x = x120; sprite->y = y120; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortFastSprite(sprite, ot, 0); switch(direction120) { case 0: sprite->x += 64; break; case 1: sprite->x -= 64; break; case 2: sprite->y += 64; break; case 3: sprite->y -= 64; break; default: assert(FALSE); } GsSortFastSprite(sprite, ot, 0); } int x121 = 0, y121 = 0; int direction121 = 0; void DrawProc121 (GsOT *ot) { int time; register GsSPRITE *sprite; time = frameNumber % 64; if (time == 0) { int newDirection; x121 = 0; y121 = 0; for (;;) { newDirection = rand() % 4; if (newDirection != direction121) break; } direction121 = newDirection; } else { switch(direction121) { case 0: x121--; break; case 1: x121++; break; case 2: y121--; break; case 3: y121++; break; default: assert(FALSE); } } sprite = &Number40Sprite; sprite->x = x121; sprite->y = y121; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortFastSprite(sprite, ot, 0); switch(direction121) { case 0: sprite->x += 64; break; case 1: sprite->x -= 64; break; case 2: sprite->y += 64; break; case 3: sprite->y -= 64; break; default: assert(FALSE); } GsSortFastSprite(sprite, ot, 0); } int x122 = 0, y122 = 0; int direction122 = 0; void DrawProc122 (GsOT *ot) { int time; register GsSPRITE *sprite; time = frameNumber % 64; if (time == 0) { int newDirection; x122 = 0; y122 = 0; for (;;) { newDirection = rand() % 4; if (newDirection != direction122) break; } direction122 = newDirection; } else { switch(direction122) { case 0: x122--; break; case 1: x122++; break; case 2: y122--; break; case 3: y122++; break; default: assert(FALSE); } } sprite = &Number41Sprite; sprite->x = x122; sprite->y = y122; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortFastSprite(sprite, ot, 0); switch(direction122) { case 0: sprite->x += 64; break; case 1: sprite->x -= 64; break; case 2: sprite->y += 64; break; case 3: sprite->y -= 64; break; default: assert(FALSE); } GsSortFastSprite(sprite, ot, 0); } int x123 = 0, y123 = 0; int direction123 = 0; void DrawProc123 (GsOT *ot) { int time; register GsSPRITE *sprite; time = frameNumber % 64; if (time == 0) { int newDirection; x123 = 0; y123 = 0; for (;;) { newDirection = rand() % 4; if (newDirection != direction123) break; } direction123 = newDirection; } else { switch(direction123) { case 0: x123--; break; case 1: x123++; break; case 2: y123--; break; case 3: y123++; break; default: assert(FALSE); } } sprite = &Spiral1Sprite; sprite->x = x123; sprite->y = y123; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortFastSprite(sprite, ot, 0); switch(direction123) { case 0: sprite->x += 64; break; case 1: sprite->x -= 64; break; case 2: sprite->y += 64; break; case 3: sprite->y -= 64; break; default: assert(FALSE); } GsSortFastSprite(sprite, ot, 0); } int x124 = 0, y124 = 0; int direction124 = 0; void DrawProc124 (GsOT *ot) { int time; register GsSPRITE *sprite; time = frameNumber % 64; if (time == 0) { int newDirection; x124 = 0; y124 = 0; for (;;) { newDirection = rand() % 4; if (newDirection != direction124) break; } direction124 = newDirection; } else { switch(direction124) { case 0: x124--; break; case 1: x124++; break; case 2: y124--; break; case 3: y124++; break; default: assert(FALSE); } } sprite = &Spiral2Sprite; sprite->x = x124; sprite->y = y124; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortFastSprite(sprite, ot, 0); switch(direction124) { case 0: sprite->x += 64; break; case 1: sprite->x -= 64; break; case 2: sprite->y += 64; break; case 3: sprite->y -= 64; break; default: assert(FALSE); } GsSortFastSprite(sprite, ot, 0); } int x125 = 0, y125 = 0; int direction125 = 0; void DrawProc125 (GsOT *ot) { int time; register GsSPRITE *sprite; time = frameNumber % 64; if (time == 0) { int newDirection; x125 = 0; y125 = 0; for (;;) { newDirection = rand() % 4; if (newDirection != direction125) break; } direction125 = newDirection; } else { switch(direction125) { case 0: x125--; break; case 1: x125++; break; case 2: y125--; break; case 3: y125++; break; default: assert(FALSE); } } sprite = &Spiral3Sprite; sprite->x = x125; sprite->y = y125; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortFastSprite(sprite, ot, 0); switch(direction125) { case 0: sprite->x += 64; break; case 1: sprite->x -= 64; break; case 2: sprite->y += 64; break; case 3: sprite->y -= 64; break; default: assert(FALSE); } GsSortFastSprite(sprite, ot, 0); } int x126 = 0, y126 = 0; int direction126 = 0; void DrawProc126 (GsOT *ot) { int time; register GsSPRITE *sprite; time = frameNumber % 64; if (time == 0) { int newDirection; x126 = 0; y126 = 0; for (;;) { newDirection = rand() % 4; if (newDirection != direction126) break; } direction126 = newDirection; } else { switch(direction126) { case 0: x126--; break; case 1: x126++; break; case 2: y126--; break; case 3: y126++; break; default: assert(FALSE); } } //sprite = &Spiral4Sprite; // removed sprite = &Number47Sprite; sprite->x = x126; sprite->y = y126; sprite->rotate = 0; sprite->r = 128; sprite->g = 128; sprite->b = 128; sprite->scalex = ONE; sprite->scaley = ONE; GsSortFastSprite(sprite, ot, 0); switch(direction126) { case 0: sprite->x += 64; break; case 1: sprite->x -= 64; break; case 2: sprite->y += 64; break; case 3: sprite->y -= 64; break; default: assert(FALSE); } GsSortFastSprite(sprite, ot, 0); } void DrawProc127 (GsOT *ot) { int i; GsGLINE *line; line = &TheLines[0]; for (i = 0; i < 32; i++) { line->r0 = 192; line->g0 = 0; line->b0 = 0; line->r1 = 0; line->g1 = 0; line->b1 = 192; line->x0 = i; line->x1 = i; line->y0 = 0; line->y1 = (Cd32foldBuffer[i] * CompactDiscVolumeSetting) >> 15; // >> 16 GsSortGLine(line, ot, 0); } } void DrawProc128 (GsOT *ot) { int i, angle, length; GsGLINE *line; line = &TheLines[0]; for (i = 0; i < 32; i++) { angle = (i * ONE) >> 5; line->r0 = 128; line->g0 = 128; line->b0 = 0; line->r1 = 128; line->g1 = 0; line->b1 = 0; line->x0 = 16; line->y0 = 16; length = (Cd32foldBuffer[i] * CompactDiscVolumeSetting) >> 15; // 16 line->x1 = 16 + ((length * rcos(angle)) >> 12); line->y1 = 16 + ((length * rsin(angle)) >> 12); GsSortGLine(line, ot, 0); } } int CurrentOverlapSprite129 = 0, NewOverlapSprite129 = 0; int mergeDirection129 = 0; int x129 = 0, y129 = 0; void DrawProc129 (GsOT *ot) { int i, total, move, renewFlag; total = 0; for (i = 0; i < 32; i++) total += (Cd32foldBuffer[i] * CompactDiscVolumeSetting) >> 16; if (total > 32 * 8) move = 4; else if (total > 32 * 6) move = 2; else if (total > 32 * 4) move = 1; else move = 0; // global sprite moving // new one fades in anticlockwise if (move != 0) { switch(mergeDirection129) { case 0: x129 += move; break; case 1: x129 -= move; break; case 2: y129 += move; break; case 3: y129 -= move; break; default: assert(FALSE); } } renewFlag = FALSE; switch(mergeDirection129) { case 0: if (x129 >= 64) renewFlag = TRUE; break; case 1: if (x129 <= -64) renewFlag = TRUE; break; case 2: if (y129 >= 64) renewFlag = TRUE; break; case 3: if (y129 <= -64) renewFlag = TRUE; break; default: assert(FALSE); } if (renewFlag == TRUE) { x129 = 0; y129 = 0; mergeDirection129 = rand() % 4; CurrentOverlapSprite129 = NewOverlapSprite129; for (;;) { NewOverlapSprite129 = rand() % NumberGlobalSprites; if (NewOverlapSprite129 != CurrentOverlapSprite129) break; } } GlobalSpriteList[CurrentOverlapSprite129]->x = x129; GlobalSpriteList[CurrentOverlapSprite129]->y = y129; switch(mergeDirection129) { case 0: GlobalSpriteList[NewOverlapSprite129]->x = x129 - 64; GlobalSpriteList[NewOverlapSprite129]->y = y129; break; case 1: GlobalSpriteList[NewOverlapSprite129]->x = x129 + 64; GlobalSpriteList[NewOverlapSprite129]->y = y129; break; case 2: GlobalSpriteList[NewOverlapSprite129]->x = x129; GlobalSpriteList[NewOverlapSprite129]->y = y129 - 64; break; case 3: GlobalSpriteList[NewOverlapSprite129]->x = x129; GlobalSpriteList[NewOverlapSprite129]->y = y129 + 64; break; default: assert(FALSE); } GsSortSprite(GlobalSpriteList[CurrentOverlapSprite129], ot, 1); GsSortSprite(GlobalSpriteList[NewOverlapSprite129], ot, 0); } void DrawProc130 (GsOT *ot) { int i; GsGLINE *line; CVECTOR colour; GetColourAtStageOfCycle (900, &colour); line = &TheLines[0]; for (i = 0; i < 32; i++) { line->r0 = (colour.r * 3) / 2; line->g0 = (colour.g * 3) / 2; line->b0 = (colour.b * 3) / 2; line->r1 = (colour.g * 3) / 2; line->g1 = (colour.b * 3) / 2; line->b1 = (colour.r * 3) / 2; line->x0 = i; line->x1 = i; line->y0 = 0; line->y1 = (Cd32foldBuffer[i] * CompactDiscVolumeSetting) >> 15; // >> 16 GsSortGLine(line, ot, 0); } } void DrawProc131 (GsOT *ot) { int i, angle, length; GsGLINE *line; CVECTOR colour; GetColourAtStageOfCycle (900, &colour); line = &TheLines[0]; for (i = 0; i < 32; i++) { angle = (i * ONE) >> 5; line->r0 = (colour.r * 3) / 2; line->g0 = (colour.g * 3) / 2; line->b0 = (colour.b * 3) / 2; line->r1 = (colour.g * 3) / 2; line->g1 = (colour.b * 3) / 2; line->b1 = (colour.r * 3) / 2; line->x0 = 16; line->y0 = 16; length = (Cd32foldBuffer[i] * CompactDiscVolumeSetting) >> 16; // >> 18 line->x1 = 16 + ((length * rcos(angle)) >> 12); line->y1 = 16 + ((length * rsin(angle)) >> 12); GsSortGLine(line, ot, 0); } } void DrawProc132 (GsOT *ot) { int i; GsGLINE *line; CVECTOR colour; int distance; GetColourAtStageOfCycle (900, &colour); line = &TheLines[0]; for (i = 0; i < 32; i++) { line->r0 = (colour.r * 3) / 2; line->g0 = (colour.g * 3) / 2; line->b0 = (colour.b * 3) / 2; line->r1 = (colour.g * 3) / 2; line->g1 = (colour.b * 3) / 2; line->b1 = (colour.r * 3) / 2; line->x0 = i; line->x1 = i; distance = (Cd32foldBuffer[i] * CompactDiscVolumeSetting) >> 16; line->y0 = 16 - distance; line->y1 = 16 + distance; GsSortGLine(line, ot, 0); } } void DrawProc133 (GsOT *ot) { int i; GsGLINE *line; int distance; line = &TheLines[0]; for (i = 0; i < 32; i++) { line->r0 = 192; line->g0 = 0; line->b0 = 0; line->r1 = 0; line->g1 = 0; line->b1 = 192; line->x0 = i; line->x1 = i; distance = (Cd32foldBuffer[i] * CompactDiscVolumeSetting) >> 16; line->y0 = 16 - distance; line->y1 = 16 + distance; GsSortGLine(line, ot, 0); } } void DrawProc134 (GsOT *ot) { int i; GsGLINE *line; int distance; line = &TheLines[0]; for (i = 0; i < 32; i++) { line->r0 = 192; line->g0 = 0; line->b0 = 0; line->r1 = 0; line->g1 = 0; line->b1 = 192; line->x0 = i; line->x1 = i; distance = (Cd32foldBuffer[i] * CompactDiscVolumeSetting) >> 16; line->y0 = 16 - distance; line->y1 = 16 + distance; FlipLineXYs(line); GsSortGLine(line, ot, 0); } } void DrawProc135 (GsOT *ot) { int i; GsGLINE *line; line = &TheLines[0]; for (i = 0; i < 32; i++) { line->r0 = 192; line->g0 = 0; line->b0 = 0; line->r1 = 192; line->g1 = 192; line->b1 = 0; line->x0 = i; line->x1 = i; line->y0 = 0; line->y1 = (Cd32foldBuffer[i] * CompactDiscVolumeSetting) >> 15; // >> 16 GsSortGLine(line, ot, 0); } } void DrawProc136 (GsOT *ot) { int i; GsGLINE *line; int distance; line = &TheLines[0]; for (i = 0; i < 32; i++) { line->r0 = 192; line->g0 = 0; line->b0 = 0; line->r1 = 192; line->g1 = 192; line->b1 = 0; line->x0 = i; line->x1 = i; distance = (Cd32foldBuffer[i] * CompactDiscVolumeSetting) >> 16; line->y0 = 16 - distance; line->y1 = 16 + distance; GsSortGLine(line, ot, 0); } } void DrawProc137 (GsOT *ot) { int distance; int i; GsGLINE *line; distance = (CdTotalVolume * CompactDiscVolumeSetting) >> 16; while (distance > 31 && frameNumber % 120 == 0) { printf("distance %d reduction\n", distance); } while (distance > 31) { distance >>= 1; } line = &TheLines[0]; line->attribute = 0; line->r0 = 128; line->g0 = 0; line->b0 = 0; line->r1 = 0; line->g1 = 0; line->b1 = 128; for (i = 1; i < distance; i++) { line->x0 = 16 - i; line->y0 = 16; line->x1 = 16; line->y1 = 16 - i; GsSortGLine(line, ot, 0); line->x0 = 16 - i; line->y0 = 16; line->x1 = 16; line->y1 = 16 + i; GsSortGLine(line, ot, 0); line->x0 = 16 + i; line->y0 = 16; line->x1 = 16; line->y1 = 16 - i; GsSortGLine(line, ot, 0); line->x0 = 16 + i; line->y0 = 16; line->x1 = 16; line->y1 = 16 + i; GsSortGLine(line, ot, 0); } } int CurrentOverlapSprite138 = 0, NewOverlapSprite138 = 0; int mergeDirection138 = 0; void DrawProc138 (GsOT *ot) { int time; int distance; int i; GsGLINE *line; CVECTOR colour; // global sprite moving // new one fades in from random direction time = frameNumber % 120; if (time == 0) { CurrentOverlapSprite138 = NewOverlapSprite138; for (;;) { NewOverlapSprite138 = rand() % NumberGlobalSprites; if (NewOverlapSprite138 != CurrentOverlapSprite138) break; } mergeDirection138 = rand() % 4; GlobalSpriteList[CurrentOverlapSprite138]->x = 0; GlobalSpriteList[CurrentOverlapSprite138]->y = 0; GlobalSpriteList[CurrentOverlapSprite138]->scalex = ONE; GlobalSpriteList[CurrentOverlapSprite138]->scaley = ONE; GsSortSprite(GlobalSpriteList[CurrentOverlapSprite138], ot, 2); } else { if (time < 60) { GlobalSpriteList[CurrentOverlapSprite138]->x = 0; GlobalSpriteList[CurrentOverlapSprite138]->y = 0; GlobalSpriteList[CurrentOverlapSprite138]->scalex = ONE; GlobalSpriteList[CurrentOverlapSprite138]->scaley = ONE; if (mergeDirection138 < 0 || mergeDirection138 > 3) mergeDirection138 = 0; switch(mergeDirection138) { case 0: GlobalSpriteList[NewOverlapSprite138]->x = 60 - time; GlobalSpriteList[NewOverlapSprite138]->y = 0; break; case 1: GlobalSpriteList[NewOverlapSprite138]->x = -60 + time; GlobalSpriteList[NewOverlapSprite138]->y = 0; break; case 2: GlobalSpriteList[NewOverlapSprite138]->y = 60 - time; GlobalSpriteList[NewOverlapSprite138]->x = 0; break; case 3: GlobalSpriteList[NewOverlapSprite138]->y = -60 + time; GlobalSpriteList[NewOverlapSprite138]->x = 0; break; default: assert(FALSE); } GlobalSpriteList[NewOverlapSprite138]->scalex = ONE; GlobalSpriteList[NewOverlapSprite138]->scaley = ONE; GsSortSprite(GlobalSpriteList[CurrentOverlapSprite138], ot, 3); GsSortSprite(GlobalSpriteList[NewOverlapSprite138], ot, 2); } else { GlobalSpriteList[NewOverlapSprite138]->x = 0; GlobalSpriteList[NewOverlapSprite138]->y = 0; GlobalSpriteList[NewOverlapSprite138]->scalex = ONE; GlobalSpriteList[NewOverlapSprite138]->scaley = ONE; GsSortSprite(GlobalSpriteList[NewOverlapSprite138], ot, 2); } } distance = (CdTotalVolume * CompactDiscVolumeSetting) >> 16; while (distance > 31 && frameNumber % 120 == 0) { printf("distance %d reduction\n", distance); } while (distance > 31) { distance >>= 1; } GetColourAtStageOfCycle (900, &colour); line = &TheLines[0]; line->attribute = 0; line->r0 = (colour.r * 3) / 2; line->g0 = (colour.g * 3) / 2; line->b0 = (colour.b * 3) / 2; line->r1 = (colour.g * 3) / 2; line->g1 = (colour.b * 3) / 2; line->b1 = (colour.r * 3) / 2; for (i = 1; i < distance; i++) { line->x0 = 16 - i; line->y0 = 16; line->x1 = 16; line->y1 = 16 - i; GsSortGLine(line, ot, 0); line->x0 = 16 - i; line->y0 = 16; line->x1 = 16; line->y1 = 16 + i; GsSortGLine(line, ot, 0); line->x0 = 16 + i; line->y0 = 16; line->x1 = 16; line->y1 = 16 - i; GsSortGLine(line, ot, 0); line->x0 = 16 + i; line->y0 = 16; line->x1 = 16; line->y1 = 16 + i; GsSortGLine(line, ot, 0); } } void DrawProc139 (GsOT *ot) { int distance, counter, distanceCopy; GsGLINE *line; distance = (CdTotalVolume * CompactDiscVolumeSetting) >> 15; // 0-31 line = &TheLines[0]; line->attribute = 0; line->r0 = 128; line->g0 = 0; line->b0 = 0; line->r1 = 0; line->g1 = 0; line->b1 = 128; counter = 0; distanceCopy = distance; for (;;) { line->x0 = 16 - counter; line->x1 = 16 - counter; line->y0 = 0; line->y1 = distanceCopy; GsSortGLine(line, ot, 0); counter++; if (distanceCopy < 2) break; distanceCopy >>= 1; } counter = 0; distanceCopy = distance; for (;;) { line->x0 = 16 + counter; line->x1 = 16 + counter; line->y0 = 0; line->y1 = distanceCopy; GsSortGLine(line, ot, 0); counter++; if (distanceCopy < 2) break; distanceCopy >>= 1; } } void DrawProc140 (GsOT *ot) { int i; GsGLINE *line; int distance; CVECTOR colour; GetColourAtStageOfCycle (900, &colour); line = &TheLines[0]; for (i = 0; i < 32; i++) { line->r0 = (colour.r * 3) / 2; line->g0 = (colour.g * 3) / 2; line->b0 = (colour.b * 3) / 2; line->r1 = (colour.g * 3) / 2; line->g1 = (colour.b * 3) / 2; line->b1 = (colour.r * 3) / 2; line->x0 = i; line->x1 = i; distance = (Cd32foldBuffer[i] * CompactDiscVolumeSetting) >> 16; line->y0 = 16 - distance; line->y1 = 16 + distance; FlipLineXYs(line); GsSortGLine(line, ot, 0); } } int movementDirection141 = FORWARD; int displacement141 = 0; void DrawProc141 (GsOT *ot) { int i; GsGLINE *line; int distance; int time; time = frameNumber % 240; if (time == 0) { movementDirection141 = FORWARD + (rand() % 2); displacement141 = 0; } else { displacement141++; FIT_INTO_32_PIXEL_SPACE(displacement141); assert(movementDirection141 == FORWARD || movementDirection141 == BACKWARD); } for (i = 0; i < 32; i++) { line = &TheLines[i]; line->r0 = 192; line->g0 = 0; line->b0 = 0; line->r1 = 0; line->g1 = 0; line->b1 = 192; line->x0 = i; line->x1 = i; distance = (Cd32foldBuffer[i] * CompactDiscVolumeSetting) >> 16; line->y0 = 16 - distance; line->y1 = 16 + distance; } ShiftAllLinesIn32PixelSpace(movementDirection141, displacement141, ot); } int movementDirection142 = CLOCKWISE; int displacement142 = 0; void DrawProc142 (GsOT *ot) { int i; GsGLINE *line; int distance; int time; time = frameNumber % 240; if (time == 0) { movementDirection142 = CLOCKWISE + (rand() % 2); displacement142 = 0; } else { displacement142++; FIT_INTO_32_PIXEL_SPACE(displacement142); assert(movementDirection142 == CLOCKWISE || movementDirection142 == ANTICLOCKWISE); } for (i = 0; i < 32; i++) { line = &TheLines[i]; line->r0 = 192; line->g0 = 0; line->b0 = 0; line->r1 = 192; line->g1 = 192; line->b1 = 0; line->x0 = i; line->x1 = i; distance = (Cd32foldBuffer[i] * CompactDiscVolumeSetting) >> 16; line->y0 = 16 - distance; line->y1 = 16 + distance; FlipLineXYs(line); } ShiftAllLinesIn32PixelSpace(movementDirection142, displacement142, ot); } void DrawProc143 (GsOT *ot) {} void DrawProc144 (GsOT *ot) {} void DrawProc145 (GsOT *ot) {} void DrawProc146 (GsOT *ot) {} void DrawProc147 (GsOT *ot) {} void DrawProc148 (GsOT *ot) {} void DrawProc149 (GsOT *ot) {} void DrawProc150 (GsOT *ot) {} void DrawProc151 (GsOT *ot) {} void DrawProc152 (GsOT *ot) {} void DrawProc153 (GsOT *ot) {} void DrawProc154 (GsOT *ot) {} void DrawProc155 (GsOT *ot) {} void DrawProc156 (GsOT *ot) {} void DrawProc157 (GsOT *ot) {} void DrawProc158 (GsOT *ot) {} void DrawProc159 (GsOT *ot) {} void DrawProc160 (GsOT *ot) {} void DrawProc161 (GsOT *ot) {} void DrawProc162 (GsOT *ot) {} void DrawProc163 (GsOT *ot) {} void DrawProc164 (GsOT *ot) {} void DrawProc165 (GsOT *ot) {} void DrawProc166 (GsOT *ot) {} void DrawProc167 (GsOT *ot) {} void DrawProc168 (GsOT *ot) {} void DrawProc169 (GsOT *ot) {} void DrawProc170 (GsOT *ot) {} void DrawProc171 (GsOT *ot) {} void DrawProc172 (GsOT *ot) {} void DrawProc173 (GsOT *ot) {} void DrawProc174 (GsOT *ot) {} void DrawProc175 (GsOT *ot) {} void DrawProc176 (GsOT *ot) {} void DrawProc177 (GsOT *ot) {} void DrawProc178 (GsOT *ot) {} void DrawProc179 (GsOT *ot) {} void LinkDrawingFunctionsIntoFunctionTable (void) { int i; // firstly, set them all to NULL for (i = 0; i < NUMBER_DRAW_PROCESSES; i++) { DrawProcessFunctionTable[i] = NULL; } // now add in those linked to functions DrawProcessFunctionTable[0] = DrawProc1; DrawProcessFunctionTable[1] = DrawProc2; DrawProcessFunctionTable[2] = DrawProc3; DrawProcessFunctionTable[3] = DrawProc4; DrawProcessFunctionTable[4] = DrawProc5; DrawProcessFunctionTable[5] = DrawProc6; DrawProcessFunctionTable[6] = DrawProc7; DrawProcessFunctionTable[7] = DrawProc8; DrawProcessFunctionTable[8] = DrawProc9; DrawProcessFunctionTable[9] = DrawProc10; DrawProcessFunctionTable[10] = DrawProc11; DrawProcessFunctionTable[11] = DrawProc12; DrawProcessFunctionTable[12] = DrawProc13; DrawProcessFunctionTable[13] = DrawProc14; DrawProcessFunctionTable[14] = DrawProc15; DrawProcessFunctionTable[15] = DrawProc16; DrawProcessFunctionTable[16] = DrawProc17; DrawProcessFunctionTable[17] = DrawProc18; DrawProcessFunctionTable[18] = DrawProc19; DrawProcessFunctionTable[19] = DrawProc20; DrawProcessFunctionTable[20] = DrawProc21; DrawProcessFunctionTable[21] = DrawProc22; DrawProcessFunctionTable[22] = DrawProc23; DrawProcessFunctionTable[23] = DrawProc24; DrawProcessFunctionTable[24] = DrawProc25; DrawProcessFunctionTable[25] = DrawProc26; DrawProcessFunctionTable[26] = DrawProc27; DrawProcessFunctionTable[27] = DrawProc28; DrawProcessFunctionTable[28] = DrawProc29; DrawProcessFunctionTable[29] = DrawProc30; DrawProcessFunctionTable[30] = DrawProc31; DrawProcessFunctionTable[31] = DrawProc32; DrawProcessFunctionTable[32] = DrawProc33; DrawProcessFunctionTable[33] = DrawProc34; DrawProcessFunctionTable[34] = DrawProc35; DrawProcessFunctionTable[35] = DrawProc36; DrawProcessFunctionTable[36] = DrawProc37; DrawProcessFunctionTable[37] = DrawProc38; DrawProcessFunctionTable[38] = DrawProc39; DrawProcessFunctionTable[39] = DrawProc40; DrawProcessFunctionTable[40] = DrawProc41; DrawProcessFunctionTable[41] = DrawProc42; DrawProcessFunctionTable[42] = DrawProc43; DrawProcessFunctionTable[43] = DrawProc44; DrawProcessFunctionTable[44] = DrawProc45; DrawProcessFunctionTable[45] = DrawProc46; DrawProcessFunctionTable[46] = DrawProc47; DrawProcessFunctionTable[47] = DrawProc48; DrawProcessFunctionTable[48] = DrawProc49; DrawProcessFunctionTable[49] = DrawProc50; DrawProcessFunctionTable[50] = DrawProc51; DrawProcessFunctionTable[51] = DrawProc52; DrawProcessFunctionTable[52] = DrawProc53; DrawProcessFunctionTable[53] = DrawProc54; DrawProcessFunctionTable[54] = DrawProc55; DrawProcessFunctionTable[55] = DrawProc56; DrawProcessFunctionTable[56] = DrawProc57; DrawProcessFunctionTable[57] = DrawProc58; DrawProcessFunctionTable[58] = DrawProc59; DrawProcessFunctionTable[59] = DrawProc60; DrawProcessFunctionTable[60] = DrawProc61; DrawProcessFunctionTable[61] = DrawProc62; DrawProcessFunctionTable[62] = DrawProc63; DrawProcessFunctionTable[63] = DrawProc64; DrawProcessFunctionTable[64] = DrawProc65; DrawProcessFunctionTable[65] = DrawProc66; DrawProcessFunctionTable[66] = DrawProc67; DrawProcessFunctionTable[67] = DrawProc68; DrawProcessFunctionTable[68] = DrawProc69; DrawProcessFunctionTable[69] = DrawProc70; DrawProcessFunctionTable[70] = DrawProc71; DrawProcessFunctionTable[71] = DrawProc72; DrawProcessFunctionTable[72] = DrawProc73; DrawProcessFunctionTable[73] = DrawProc74; DrawProcessFunctionTable[74] = DrawProc75; DrawProcessFunctionTable[75] = DrawProc76; DrawProcessFunctionTable[76] = DrawProc77; DrawProcessFunctionTable[77] = DrawProc78; DrawProcessFunctionTable[78] = DrawProc79; DrawProcessFunctionTable[79] = DrawProc80; DrawProcessFunctionTable[80] = DrawProc81; DrawProcessFunctionTable[81] = DrawProc82; DrawProcessFunctionTable[82] = DrawProc83; DrawProcessFunctionTable[83] = DrawProc84; DrawProcessFunctionTable[84] = DrawProc85; DrawProcessFunctionTable[85] = DrawProc86; DrawProcessFunctionTable[86] = DrawProc87; DrawProcessFunctionTable[87] = DrawProc88; DrawProcessFunctionTable[88] = DrawProc89; DrawProcessFunctionTable[89] = DrawProc90; DrawProcessFunctionTable[90] = DrawProc91; DrawProcessFunctionTable[91] = DrawProc92; DrawProcessFunctionTable[92] = DrawProc93; DrawProcessFunctionTable[93] = DrawProc94; DrawProcessFunctionTable[94] = DrawProc95; DrawProcessFunctionTable[95] = DrawProc96; DrawProcessFunctionTable[96] = DrawProc97; DrawProcessFunctionTable[97] = DrawProc98; DrawProcessFunctionTable[98] = DrawProc99; DrawProcessFunctionTable[99] = DrawProc100; DrawProcessFunctionTable[100] = DrawProc101; DrawProcessFunctionTable[101] = DrawProc102; DrawProcessFunctionTable[102] = DrawProc103; DrawProcessFunctionTable[103] = DrawProc104; DrawProcessFunctionTable[104] = DrawProc105; DrawProcessFunctionTable[105] = DrawProc106; DrawProcessFunctionTable[106] = DrawProc107; DrawProcessFunctionTable[107] = DrawProc108; DrawProcessFunctionTable[108] = DrawProc109; DrawProcessFunctionTable[109] = DrawProc110; DrawProcessFunctionTable[110] = DrawProc111; DrawProcessFunctionTable[111] = DrawProc112; DrawProcessFunctionTable[112] = DrawProc113; DrawProcessFunctionTable[113] = DrawProc114; DrawProcessFunctionTable[114] = DrawProc115; DrawProcessFunctionTable[115] = DrawProc116; DrawProcessFunctionTable[116] = DrawProc117; DrawProcessFunctionTable[117] = DrawProc118; DrawProcessFunctionTable[118] = DrawProc119; DrawProcessFunctionTable[119] = DrawProc120; DrawProcessFunctionTable[120] = DrawProc121; DrawProcessFunctionTable[121] = DrawProc122; DrawProcessFunctionTable[122] = DrawProc123; DrawProcessFunctionTable[123] = DrawProc124; DrawProcessFunctionTable[124] = DrawProc125; DrawProcessFunctionTable[125] = DrawProc126; DrawProcessFunctionTable[126] = DrawProc127; DrawProcessFunctionTable[127] = DrawProc128; DrawProcessFunctionTable[128] = DrawProc129; DrawProcessFunctionTable[129] = DrawProc130; DrawProcessFunctionTable[130] = DrawProc131; DrawProcessFunctionTable[131] = DrawProc132; DrawProcessFunctionTable[132] = DrawProc133; DrawProcessFunctionTable[133] = DrawProc134; DrawProcessFunctionTable[134] = DrawProc135; DrawProcessFunctionTable[135] = DrawProc136; DrawProcessFunctionTable[136] = DrawProc137; DrawProcessFunctionTable[137] = DrawProc138; DrawProcessFunctionTable[138] = DrawProc139; DrawProcessFunctionTable[139] = DrawProc140; DrawProcessFunctionTable[140] = DrawProc141; DrawProcessFunctionTable[141] = DrawProc142; #if 0 // not yet used DrawProcessFunctionTable[142] = DrawProc143; DrawProcessFunctionTable[143] = DrawProc144; DrawProcessFunctionTable[144] = DrawProc145; DrawProcessFunctionTable[145] = DrawProc146; DrawProcessFunctionTable[146] = DrawProc147; DrawProcessFunctionTable[147] = DrawProc148; DrawProcessFunctionTable[148] = DrawProc149; DrawProcessFunctionTable[149] = DrawProc150; DrawProcessFunctionTable[150] = DrawProc151; DrawProcessFunctionTable[151] = DrawProc152; DrawProcessFunctionTable[152] = DrawProc153; DrawProcessFunctionTable[153] = DrawProc154; DrawProcessFunctionTable[154] = DrawProc155; DrawProcessFunctionTable[155] = DrawProc156; DrawProcessFunctionTable[156] = DrawProc157; DrawProcessFunctionTable[157] = DrawProc158; DrawProcessFunctionTable[158] = DrawProc159; DrawProcessFunctionTable[159] = DrawProc160; DrawProcessFunctionTable[160] = DrawProc161; DrawProcessFunctionTable[161] = DrawProc162; DrawProcessFunctionTable[162] = DrawProc163; DrawProcessFunctionTable[163] = DrawProc164; DrawProcessFunctionTable[164] = DrawProc165; DrawProcessFunctionTable[165] = DrawProc166; DrawProcessFunctionTable[166] = DrawProc167; DrawProcessFunctionTable[167] = DrawProc168; DrawProcessFunctionTable[168] = DrawProc169; DrawProcessFunctionTable[169] = DrawProc170; #endif } GsBOXF BackgroundBoxRectangle; void DoWorkOfDrawProcess2 (int processID, GsOT *ot) { assert(processID >= 0); assert(processID < NUMBER_DRAW_PROCESSES); // assert(DrawProcessFunctionTable[processID] != NULL); if (DrawProcessFunctionTable[processID] == NULL) return; (*DrawProcessFunctionTable[processID])(ot); // always draw a near-black rectange underneath // to prevent the default non-drawing of black pixels // making some polygons entirely transparent BackgroundBoxRectangle.attribute = 0; BackgroundBoxRectangle.x = BackgroundBoxRectangle.y = 0; BackgroundBoxRectangle.w = BackgroundBoxRectangle.h = 32; BackgroundBoxRectangle.r = 0; BackgroundBoxRectangle.g = 0; BackgroundBoxRectangle.b = 8; GsSortBoxFill( &BackgroundBoxRectangle, ot, FURTHEST_BACK_SECOND_OT_VALUE); #if 0 if (DebugDynTexMarker == TRUE) { SpiralOneSprite.scalex = ONE/4; SpiralOneSprite.scaley = ONE/4; GsSortSprite( &SpiralOneSprite, ot, 0); } #endif if (DebugDynTexMarker == TRUE) { GsLINE xAxis, yAxis; xAxis.attribute = 0; xAxis.x0 = 120; xAxis.y0 = 0; xAxis.x1 = -120; xAxis.y1 = 0; xAxis.r = xAxis.g = xAxis.b = 255; yAxis.attribute = 0; yAxis.x0 = 0; yAxis.y0 = 120; yAxis.x1 = 0; yAxis.y1 = -120; yAxis.r = yAxis.g = yAxis.b = 255; GsSortLine( &xAxis, ot, 0); GsSortLine( &yAxis, ot, 0); } } // get pointer to image for given section GsIMAGE *GetTextureInfoOnTunnelSection (int sectionID) { int imageID = 0, chunkID, tunnelTwistOffset, totalNumberSections; GsIMAGE *image; int imageSystemID; //assert(ValidID(sectionID)); if (ValidID(sectionID) == 0) { return &Number10TextureInfo; } // firstly, get handles for image and offset rectangle switch(TheTunnelDescription.texturingType) { case SINGLE_TUNNEL_TEXTURE: // just grab first in list of images imageID = 0; break; case ONE_TEXTURE_PER_CHUNK: // use chunkID as textureID chunkID = WhichChunkInDescription( &TheTunnelDescription, sectionID); imageID = chunkID; break; case ONE_TEXTURE_PER_N_SECTIONS: assert(TheTunnelDescription.textureNumber != 0); // division by zero imageID = sectionID / TheTunnelDescription.textureNumber; assert(imageID >= 0); assert(imageID < TheTunnelDescription.numberImages); break; case ONE_TEXTURE_PER_N_POLYGONS: if (TheTunnelDescription.textureNumber & FULL_MAP) { tunnelTwistOffset = (TheTunnelDescription.textureNumber >> 8) * sectionID; imageID = tunnelTwistOffset; while (imageID >= TheTunnelDescription.numberImages) imageID -= TheTunnelDescription.numberImages; } else { imageID = 0; } break; case SPREAD_N_TEXTURES_EVENLY: totalNumberSections = NumberSectionsInTunnelDescription( &TheTunnelDescription); assert(totalNumberSections != 0); imageID = (TheTunnelDescription.numberImages * sectionID) / totalNumberSections; break; default: printf("BAD value is %d\n", TheTunnelDescription.texturingType); assert(FALSE); } assert(imageID >= 0); assert(imageID < TheTunnelDescription.numberImages); imageSystemID = TheTunnelDescription.listOfImageIds[imageID]; image = GetImageGivenID(imageSystemID); return image; } // whenever (frameNumber % period == 0), colour is (r128,g0,b0) void GetColourAtStageOfCycle (int period, CVECTOR *colour) { int time, phase, subPeriod, subTime = 0; assert(period > 0); subPeriod = period / 3; time = frameNumber % period; phase = time / subPeriod; switch(phase) { case 0: subTime = time; colour->r = 128 - ((subTime * 128) / subPeriod); colour->g = (subTime * 128) / subPeriod; colour->b = 0; break; case 1: subTime = time - subPeriod; colour->r = 0; colour->g = 128 - ((subTime * 128) / subPeriod); colour->b = (subTime * 128) / subPeriod; break; case 2: subTime = time - (subPeriod*2); colour->r = (subTime * 128) / subPeriod; colour->g = 0; colour->b = 128 - ((subTime * 128) / subPeriod); break; default: assert(FALSE); } } int DrawProcessUsesSoundToLight (int processID) { assert(processID >= 0); assert(processID < NUMBER_DRAW_PROCESSES); if (processID >= 126) return TRUE; else return FALSE; } void FlipLineXYs (GsGLINE *line) { int temp; assert(line != NULL); temp = line->x0; line->x0 = line->y0; line->y0 = temp; temp = line->x1; line->x1 = line->y1; line->y1 = temp; } // horizontally: x+ clockwise, x- anticlockwise // vertically: y+ forward, y- backwards void DisplaceLineIn32PixelSpace (GsGLINE *line, int direction, int distance) { assert(line != NULL); switch(direction) { case CLOCKWISE: MAKE_32_VALUE_ADJUSTMENT(line->x0, distance); MAKE_32_VALUE_ADJUSTMENT(line->x1, distance); break; case ANTICLOCKWISE: MAKE_32_VALUE_ADJUSTMENT(line->x0, -distance); MAKE_32_VALUE_ADJUSTMENT(line->x1, -distance); break; case FORWARD: MAKE_32_VALUE_ADJUSTMENT(line->y0, distance); MAKE_32_VALUE_ADJUSTMENT(line->y1, distance); break; case BACKWARD: MAKE_32_VALUE_ADJUSTMENT(line->y0, -distance); MAKE_32_VALUE_ADJUSTMENT(line->y1, -distance); break; default: assert(FALSE); } } // all the first 32 lines are moved // this function void ShiftAllLinesIn32PixelSpace (int direction, int distance, GsOT *ot) { int i, index, extraLineNeededFlag; GsGLINE *line1, *line2; assert(distance >= 0); assert(distance < 32); for (i = 0; i < 32; i++) { index = i+32; line1 = &TheLines[i]; line2 = &TheLines[index]; line2->attribute = line1->attribute; line2->r0 = line1->r0; line2->g0 = line1->g0; line2->b0 = line1->b0; line2->r1 = line1->r1; line2->g1 = line1->g1; line2->b1 = line1->b1; switch(direction) { case CLOCKWISE: line1->x0 += distance; line1->x1 += distance; if (line1->x0 < 0) extraLineNeededFlag = 1; else if (line1->x0 > 31) extraLineNeededFlag = 2; else if (line1->x1 < 0) extraLineNeededFlag = 3; else if (line1->x1 > 31) extraLineNeededFlag = 4; else extraLineNeededFlag = -1; break; case ANTICLOCKWISE: line1->x0 -= distance; line1->x1 -= distance; if (line1->x0 < 0) extraLineNeededFlag = 1; else if (line1->x0 > 31) extraLineNeededFlag = 2; else if (line1->x1 < 0) extraLineNeededFlag = 3; else if (line1->x1 > 31) extraLineNeededFlag = 4; else extraLineNeededFlag = -1; break; case FORWARD: line1->y0 += distance; line1->y1 += distance; if (line1->y0 < 0) extraLineNeededFlag = 5; else if (line1->y0 > 31) extraLineNeededFlag = 6; else if (line1->y1 < 0) extraLineNeededFlag = 7; else if (line1->y1 > 31) extraLineNeededFlag = 8; else extraLineNeededFlag = -1; break; case BACKWARD: line1->y0 -= distance; line1->y1 -= distance; if (line1->y0 < 0) extraLineNeededFlag = 5; else if (line1->y0 > 31) extraLineNeededFlag = 6; else if (line1->y1 < 0) extraLineNeededFlag = 7; else if (line1->y1 > 31) extraLineNeededFlag = 8; else extraLineNeededFlag = -1; break; default: assert(FALSE); } switch(extraLineNeededFlag) { case -1: // do nowt break; case 1: FIT_INTO_32_PIXEL_SPACE(line1->x0); line2->x0 = line1->x1; line1->x1 = 31; line2->x1 = 0; line2->y0 = line1->y0; line2->y1 = line1->y1; break; case 3: FIT_INTO_32_PIXEL_SPACE(line1->x1); line2->x0 = line1->x0; line1->x0 = 31; line2->x1 = 0; line2->y0 = line1->y0; line2->y1 = line1->y1; break; case 2: FIT_INTO_32_PIXEL_SPACE(line1->x0); line2->x0 = line1->x1; line1->x1 = 0; line2->x1 = 31; line2->y0 = line1->y0; line2->y1 = line1->y1; break; case 4: FIT_INTO_32_PIXEL_SPACE(line1->x1); line2->x0 = line1->x0; line1->x0 = 0; line2->x1 = 31; line2->y0 = line1->y0; line2->y1 = line1->y1; break; case 5: FIT_INTO_32_PIXEL_SPACE(line1->y0); line2->y0 = line1->y1; line1->y1 = 31; line2->y1 = 0; line2->x0 = line1->x0; line2->x1 = line1->x1; break; case 7: FIT_INTO_32_PIXEL_SPACE(line1->y1); line2->y0 = line1->y0; line1->y0 = 31; line2->y1 = 0; line2->x0 = line1->x0; line2->x1 = line1->x1; break; case 6: FIT_INTO_32_PIXEL_SPACE(line1->y0); line2->y0 = line1->y1; line1->y1 = 0; line2->y1 = 31; line2->x0 = line1->x0; line2->x1 = line1->x1; break; case 8: FIT_INTO_32_PIXEL_SPACE(line1->y1); line2->y0 = line1->y0; line1->y0 = 0; line2->y1 = 31; line2->x0 = line1->x0; line2->x1 = line1->x1; break; default: assert(FALSE); } } // draw if (extraLineNeededFlag == -1) { for (i = 0; i < 32; i++) { line1 = &TheLines[i]; GsSortGLine(line1, ot, 0); } } else { for (i = 0; i < 64; i++) { line1 = &TheLines[i]; GsSortGLine(line1, ot, 0); } } }