b0`8  p{.text .rdata.data@ @.sdata .sbss(.bssX|Control player and perform ramp 'physics' void controlSkater(int cpu, u_int cpuctrl, int cpad, SkateBoard *skater) { u_int pad; long direction = 0; long x; long vx, vy, falla; long valid_a1, valid_a2; // valid landing angles long ad1, ad2, ad3, ad4; // angle diff. - between take off and landing u_long fall; short z; skater[0].analogView.vx = 0; skater[0].analogView.vy = 0; // If under CPU control, take controls from 'cpuctrl' if (cpu) pad = cpuctrl; else { // otherwise, read the control pad pad = readPad(cpad); if (controllerType(cpad) == CON_ANALOGJOY) { skater[0].analogView.vx = (short) 128-(readPadByte(cpad, 5) & 0xfc); skater[0].analogView.vy = (short) 128-(readPadByte(cpad, 4) & 0xfc); skater[0].analogView.vx = (skater[0].analogView.vx<<3); skater[0].analogView.vy = (skater[0].analogView.vy<<3); } } //////////////////////////////////////////////////////// // Totally helpless if fallen over if (skater->fallenOver) pad = 0; //////////////////////////////////////////////////////// // If skater is falling off the ramp - let 'em die cool! if (skater->fallenOffRamp) { if (pad & PADRdown) skater->skaterAnimFrame = 3; else if (pad & PADRright) skater->skaterAnimFrame = 4; else skater->skaterAnimFrame = 0; } else { //////////////////////////////////////////////////////// // Grab! if (pad & PADRdown) { skater->skaterAnimFrame = 1; skater->grabTime++; skater->numGrabs |= 0x1; } else if (pad & PADRright) { skater->skaterAnimFrame = 3; skater->grabTime++; skater->numGrabs |= 0x2; } else if (pad & PADRleft) { skater->skaterAnimFrame = 4; skater->grabTime++; skater->numGrabs |= 0x4; } else { skater->skaterAnimFrame = 0; } } //////////////////////////////////////////////////////// // work out our direction direction = skater->speed * rcos(skater->angle.vy); //////////////////////////////////////////////////////// // Kick for initial speed // Must be on ramp and standing still if (!skater->offRamp && pad & PADR2 && skater->speed==0) { skater->speed = 120; } //////////////////////////////////////////////////////// // Spin the skater around if (skater->skaterAngle.vy!=0 && skater->skaterAngle.vy!=2048) { skater->skaterAngle.vy = (skater->skaterAngle.vy-128) & 4095; } if (pad & PADR1 && (skater->skaterAngle.vy==0 || skater->skaterAngle.vy==2048)) { skater->skaterAngle.vy = (skater->skaterAngle.vy-128) & 4095; } //////////////////////////////////////////////////////// // Build up turning speed // (Cannot turn while building up some spin speed!) // The faster you're going, the faster you can turn if (!skater->offRamp) { // Left/right Spin if (pad & PADL1) { if (skater->rotSpeed < abs(skater->speed)/2) skater->rotSpeed += 1; } else { skater->rotSpeed = 3<<4; } } //////////////////////////////////////////////////////// // Turn // If player's on the ramp, can only turn // if not holding L1 #define LEAN_SPEED 2 if (!skater->fallenOver && !(!skater->offRamp && (pad & PADL1))) { // calculate max lean angle - smaller as skater increases speed x = abs(skater->speed); if ( (x > TOP_SPEED/2) || (skater->position.vx>0 && skater->angle.vy>1024 && skater->angle.vy<3072) || (skater->position.vx<-RAMP_FLAT && (skater->angle.vy>3072 || skater->angle.vy<1024)) ) { x = 100 + (TOP_SPEED - x)/3; } else { x = 200 + (TOP_SPEED - x)/2; } // lean left/right if (pad & PADLleft) { skater->angle.vy = (skater->angle.vy-(4096/360)*(skater->rotSpeed/20)) ('_< !$¯$ $$(<Ԅ$$@$1# $<# Ԅ$d# £0×B@§2×BB§ $D§ $F§H&$ ! C0d8,T£&$ $C0d8,U£r# ! ¯ Ï b0@r# ! ¯ Ï b0@5)(; S ! O ¯! @!b< c$!b¯! @!b< }c$!b¯! @@#b ! #D@<`ل$!d ! @! !(Ə ! !(Ə $$C(`<B$C$! @#b§J$@§$B§<BD§F1$G£$L£$M£$N£@×BP§B×BR§$T§$V§X<`¯d$f§z$h§$j§<Bl§]$n£!$o£$t£$u£$v£h×Bx§j×Bz§ $|§ $~§$C4$o£@$`¯! &$ C0d8,,£&$ $C0d8,-£r# ! ¯ Ï b0@r# ! ¯ Ï b0@,  (; S ! O ¯! @!b< c$!b¯! @!b< }c$!b¯! @@#b ! #D@<`ل$!d ! @! !(Ə ! !(Ə $$C(` <B$C$! @#bfallenOver) pad = 0; //////////////////////////////////////////////////////// // If skater is falling off the ramp - let 'em die cool! if (skater->fallenOffRamp) { if (pad & PADRdown) skater->skaterAnimFrame = 3; else if (pad & PADRright) skater->skaterAnimFrame = 4; else skater->skaterAnimFrame = 0; } else { //////////////////////////////////////////////////////// // Grab! if (pad & PADRdown) { skater->skaterAnimFrame = 1; skater->grabTime++; skater->numGrabs |= 0x1; } else if (pad & PADRright) { skater->skaterAnimFrame = 3; skater->grabTime++; skater->numGrabs |= 0x2; } else if (pad & PADRleft) { skater->skaterAnimFrame = 4; skater->grabTime++; skater->numGrabs |= 0x4; } else { skater->skaterAnimFrame = 0; } } //////////////////////////////////////////////////////// // work out our direction direction = skater->speed * rcos(skater->angle.vy); //////////////////////////////////////////////////////// // Kick for initial speed // Must be on ramp and standing still if (!skater->offRamp && pad & PADR2 && skater->speed==0) { skater->speed = 120; } //////////////////////////////////////////////////////// // Spin the skater around if (skater->skaterAngle.vy!=0 && skater->skaterAngle.vy!=2048) { skater->skaterAngle.vy = (skater->skaterAngle.vy-128) & 4095; } if (pad & PADR1 && (skater->skaterAngle.vy==0 || skater->skaterAngle.vy==2048)) { skater->skaterAngle.vy = (skater->skaterAngle.vy-128) & 4095; } //////////////////////////////////////////////////////// // Build up turning speed // (Cannot turn while building up some spin speed!) // The faster you're going, the faster you can turn if (!skater->offRamp) { // Left/right Spin if (pad & PADL1) { if (skater->rotSpeed < abs(skater->speed)/2) skater->rotSpeed += 1; } else { skater->rotSpeed = 3<<4; } } //////////////////////////////////////////////////////// // Turn // If player's on the ramp, can only turn // if not holding L1 #define LEAN_SPEED 2 if (!skater->fallenOver && !(!skater->offRamp && (pad & PADL1))) { // calculate max lean angle - smaller as skater increases speed x = abs(skater->speed); if ( (x > TOP_SPEED/2) || (skater->position.vx>0 && skater->angle.vy>1024 && skater->angle.vy<3072) || (skater->position.vx<-RAMP_FLAT && (skater->angle.vy>3072 || skater->angle.vy<1024)) ) { x = 100 + (TOP_SPEED - x)/3; } else { x = 200 + (TOP_SPEED - x)/2; } // lean left/right if (pad & PADLleft) { skater->angle.vy = (skater->angle.vy-(4096/360)*(skater->rotSpeed/20)) & 4095; skater->totalSpin -= skater->rotSpeed>>4; if (!skater->offRamp) skater->skaterAngle.vx -= LEAN_SPEED; } else if (pad & PADLright) { skater->angle.vy = (skater->angle.vy+(4096/360)*(skater->rotSpeed/20)) & 4095; skater->totalSpin += skater->rotSpeed>>4; if (!skater->offRamp) skater->skaterAngle.vx += LEAN_SPEED; } else { // return to upright stance (no lean) if (skater->skaterAngle.vx>0) skater->skaterAngle.vx- By Doug Day PAUSED Replace controller to continue p dEv91<m(PF2Assertion failure! CountNumberOfObjectsInTmdFile(tmdAddress) >= whichObjectInTmdFileAt line %d of file '%s'. Buttons=%d, X = %d ; Y = %d Press [F10][F4] for dsave, to get screen picture Dsave[0]: filename %08x %x Press [F10][F4] for dsave. P ` p j{Bc,0Ev5E7E@E :v : < $ c 0 0(5SFU,5S(<Zx &,29?EKRX^ekqw~!'-4:@FMSY_flrx!'-4:@FMSY_elrx~ %+28>DJPV]ciou{ &,28>DKQW]ciou{ #)/4:@FLRX^djpv|%+17<BHNTY_ekpv| !&,27=BHNSY^djouz $*/4:?EJOUZ_ejouz     " ' , 1 7 < A F K P U Z _ e j o t y ~      " & + 0 5 : ? D H M R W \ ` e j o s x }       $ ( - 1 6 : > C G L P U Y ^ b f k o t x |       " & * . 2 6 : > B F J N R V Z ^ b f j n r v z ~        # ' * . 2 5 9 < @ C G J N Q U X \ _ b f i m p t w z ~   "%(+.147:<?BEHKMPSVY[^adfiloqtwy|  !#%')+-/13579;=?ACEFHJLNPQSUWYZ\^`aceghjlmoqrtvwyz|} !$&)+.0358:=?BEGJLOQTVY[^`cehjloqtvy{~    "$&(*,.02468:<>@BDFHJLNPRTVXZ[]_aceghjlnprsuwy{|~ܹܹȖx2 @tmd.c0%d:%d H} } } //////////////////////////////////////////////////////// // Limit skater to a 'sensible' top speed if (skater->speed>TOP_SPEED) skater->speed = TOP_SPEED; if (skater->speed<-TOP_SPEED) skater->speed = -TOP_SPEED; //////////////////////////////////////////////////////// // If in mid-air - skater must not be able to do wierd stuff! // (i.e. cannot change direction!) if (skater->fallenOffRamp || skater->offRamp) { skater->position.vz += skater->fallZSpeed; if (skater->fallYAngle > 1024 && skater->fallYAngle < 3072) { skater->position.vy -= (skater->speed * skater->fallZAngleSin) / 4096; } else { skater->position.vy += (skater->speed * skater->fallZAngleSin) / 4096; } } else if (skater->fallenOver) { // Skater has fallen over - no grip, so slide down ramp skater->position.vx += (skater->speed * rcos(skater->angle.vy)) / 4096; if (skater->angle.vy > 1024 && skater->angle.vy < 3072) { skater->position.vy -= (skater->speed * rsin(skater->angle.vz)) / 4096; } else { skater->position.vy += (skater->speed * rsin(skater->angle.vz)) / 4096; } skater->position.vz += (skater->speed/2 * skater->fallZAngleSin) / 4096; } else { // On ramp - so move normally skater->position.vx += (skater->speed * rcos(skater->angle.vy)) / 4096; if (skater->angle.vy > 1024 && skater->angle.vy < 3072) { skater->position.vy -= (skater->speed * rsin(skater->angle.vz)) / 4096; } else { skater->position.vy += (skater->speed * rsin(skater->angle.vz)) / 4096; } skater->position.vz += (skater->speed * -rsin(skater->angle.vy)) / 4096; } //////////////////////////////////////////////////////// // Confine the skater to the outer edge of the ramp if (skater->position.vx > RAMP_TRANS) { skater->position.vx = RAMP_TRANS-1; } if (skater->position.vx < -RAMP_TRANS-RAMP_FLAT) { skater->position.vx = -RAMP_TRANS-RAMP_FLAT+1; } //////////////////////////////////////////////////////// // Has skater landed after falling off the side? if (skater->fallenOffRamp) { if (skater->position.vy > FLOOR) { resetSkater(skater); skater->position.vx = -RAMP_FLAT/2; skater->position.vy = RAMP_TRANS; skater->position.vz = RAMP_WIDTH/3 + (RAMP_WIDTH*cpad)/3; } } ///////////////////////////////////////////////////////// // Has skater landed after a jump? if (skater->offRamp && skater->position.vy > 0) { skater->offRamp = 0; skater->fall = 0; // make player fall if landing angle is too great fall = -1; vy = skater->angle.vy; falla = skater->fallYAngle; // From take off angle - calculate what angles are safe to land on if (falla < 1024) { // Quadrant A valid_a1 = abs(2048 - vy); valid_a2 = abs(4096 - vy); } else if (falla < 2048) { // Quadrant B valid_a1 = abs(2048 - vy); valid_a2 = abs(4096 - vy); } else if (falla < 3072) { // Quadrant C valid_a1 = abs(4096 - vy); valid_a2 = abs(6144 - vy); } else { // Quadrant D valid_a1 = abs(4096 - vy); valid_a2 = abs(6144 - vy); } valid_a1 &= 4095; valid_a2 &= 4095; ad1 = abs(falla - valid_a1) & 4095; ad2 = abs(falla - valid_a2) & 4095; if (ad1<300 || ad1>4096-300 || ad2<300 || ad2>4096-300) { fall = 0; } if ( fall ) { x = skater->angle.vy & 4095; skater->fallenOver = -1; if (skater->position.vx > 0) { skater->fallZAngleSin = rsin(4096 - precalcAngle[skater->position.vx]); } else { skater->fallZAngleSin = rsin(precalcAngle[abs(skater->position.vx + RAMP_FLAT)]); } skater->fallZSpeed = (skater->speed * -rsin(skater->angle.vy)) / 4096; if (x<2048) { skater->skaterAngle.vx = 1024; } else { skater->skaterAngle.vx = -1024; } if (skater->position.vx p C`0=dH\JP @  BBBC$C$-C-6C6?C?HCHQCQZC HUAhFP&7A.F9$%AH;AV$QAi<Apz|A,cAAtA3AA UA AAA`A 0A(F0TAlbAFA A؃AF<A@ |AA5A0(p-A@FQAR(A`AgAn`|A@A3A  A0;A`Ax/A F0xF0>A`A4F0@A>AAFoAA (.A+L?A6\ A>AJ|RARA\9FkAz`3A@AAPL6AA1A1AFhA0RF0=AA A A T6A" hA- A6 9AA SFPO 8/Ac |F0h -Ap y LA pA ,A LA hFP A A @cA A 87A  F 0A  БF `;A F& A4 `; C P4AK TAX >Ab \fAp 8Fz A dMA <A A d7A A &A L<A A A F < A ȍF0 T>A `*A @A XA 8A( A0 A; 8dAN `.Z Ah TAm KAu .| <A A A A @=A ܄F A `cA A L&A A LA A &Fp |)A- (&A6 AC FQ hAW Fi / p Fz A <Fp A Fp -A hA DA UA A A A lFP A H}A A aA A( |F4 HFP= XAC 3O W -A_ /Ak ?Aq A{ (FP A Fp A xA lA ]A UA 4 A  cA A1AA$0A4=A=LEFF 5S8Fa }h/Ar?AyAF.AFp\=A$RAX/A5A3AAAAMAF A<A#A6(F0?tAGFQ|AV`AhAn@Aw<A @FA(A `F AF/ALAAtbA F0<=A>A'$ A,A:cA