/* comefrom: CityEvaluation */ DoProblems(void) { register short x, z; short ThisProb, Max; for (z = 0; z < PROBNUM; z++) ProblemTable[z] = 0; ProblemTable[0] = CrimeAverage; /* Crime */ ProblemTable[1] = PolluteAverage; /* Pollution */ ProblemTable[2] = LVAverage * .7; /* Housing */ ProblemTable[3] = CityTax * 10; /* Taxes */ ProblemTable[4] = AverageTrf(); /* Traffic */ ProblemTable[5] = GetUnemployment(); /* Unemployment */ ProblemTable[6] = GetFire(); /* Fire */ VoteProblems(); for (z = 0; z < PROBNUM; z++) ProblemTaken[z] = 0; for (z = 0; z < 4; z++) { Max = 0; for (x = 0; x < 7; x++) { if ((ProblemVotes[x] > Max) && (!ProblemTaken[x])) { ThisProb = x; Max = ProblemVotes[x]; } } if (Max) { ProblemTaken[ThisProb] = 1; ProblemOrder[z] = ThisProb; } else { ProblemOrder[z] = 7; ProblemTable[7] = 0; } } }
/* comefrom: CityEvaluation */ GetScore(void) { register x, z; short OldCityScore; float SM, TM; OldCityScore = CityScore; x = 0; for (z = 0; z < 7; z++) x += ProblemTable[z]; /* add 7 probs */ x = x / 3; /* 7 + 2 average */ if (x > 256) x = 256; z = (256 - x) * 4; if (z > 1000) z = 1000; if (z < 0 ) z = 0; if (ResCap) z = z * .85; if (ComCap) z = z * .85; if (IndCap) z = z * .85; if (RoadEffect < 32) z = z - (32 - RoadEffect); if (PoliceEffect < 1000) z = z * (.9 + (PoliceEffect / 10000.1)); if (FireEffect < 1000) z = z * (.9 + (FireEffect / 10000.1)); if (RValve < -1000) z = z * .85; if (CValve < -1000) z = z * .85; if (IValve < -1000) z = z * .85; SM = 1.0; if ((CityPop == 0) || (deltaCityPop == 0)) SM = 1.0; else if (deltaCityPop == CityPop) SM = 1.0; else if (deltaCityPop > 0) SM = ((float)deltaCityPop/CityPop) + 1.0; else if (deltaCityPop < 0) SM = .95 + ((float) deltaCityPop/(CityPop - deltaCityPop)); z = z * SM; z = z - GetFire(); /* dec score for fires */ z = z - (CityTax); TM = unPwrdZCnt + PwrdZCnt; /* dec score for unpowered zones */ if (TM) SM = PwrdZCnt / TM; else SM = 1.0; z = z * SM; if (z > 1000) z = 1000; if (z < 0 ) z = 0; CityScore = (CityScore + z) / 2; deltaCityScore = CityScore - OldCityScore; }
CFire * CFireManagerSA::GetFire ( CFireSAInterface * fire ) { DEBUG_TRACE("CFire * CFireManagerSA::GetFire ( CFireSAInterface * fire )"); DWORD dwID = ((DWORD)fire - CLASS_CFireManager + 4) / sizeof(CFireSAInterface); return GetFire ( dwID ); }
/********************************************************** * DEBRIS GAME * DESCRIPTION: This is a game where you need to shoot blocks **********************************************************/ void Debris(void) { char xMoveStart = 1; char fireIndex = 0; char moveYStart = 0; char yPosStart = 1; char index = 0; char index2 = 0; char jetHitCheck = 1; char lastCheck = 0; char numShots = 0; char yStart = 1; unsigned int ballSpeed = DEBRIS_DEBRISMOVERATE; unsigned int health = 47; unsigned int ballsDestroyed = 0; unsigned int highScore = EEProm_Read_16(debrisHighScore_Addr); struct Solid balls[DEBRIS_MAXDEBRIS]; struct Fire ammo[DEBRIS_MAXPROJECTILES]; struct Jet jet; if (health == 0) { health = 47; } //Assign pointers to allocated objects for (index = 0; index < DEBRIS_MAXDEBRIS; index++) { balls[index].enabled = 0; //Balls start disabled } LcdClear(); //Initialize game objects constructJet(&jet, 15, 2); //Initialize balls reset(&balls[0], 80, 4, 1, 1, 1); reset(&balls[1], 60, 0, 3, 2, 1); reset(&balls[2], 70, 3, 1, 1, 1); reset(&balls[3], 60, 2, 3, 2, 1); reset(&balls[4], 80, 1, 1, 1, 1); display_jet(&jet, 0); DisplayHealth(health, 0); //Start Timers StartTimer(0, DEBRIS_USERMOVERATE_MS); //Move player timer StartTimer(1, DEBRIS_RATEOFFIRE_MS); //Fire timer StartTimer(2, DEBRIS_PROJECTILESPEED_MS); //Fire move timer StartTimer(3, ballSpeed); //Move balls //Enter game loop for (;;) { //Check user move button if (CheckTimer(0)) { if (GetEnterButton()) //User wants to pause the game { if (Pause(showJetScore, ballsDestroyed, health, highScore) == 1) { return; } display_jet(&jet, 0); DisplayHealth(health, 0); } else if (GetLeft()) //Left button is being pressed { jet_moveLeft(&jet, 0); } else if (GetRight()) { jet_moveRight(&jet, 0); } if (GetUp()) { jet_moveUp(&jet); } else if (GetDown()) { jet_moveDown(&jet); } StartTimer(0, DEBRIS_USERMOVERATE_MS); //Reset this timer } //Check fire buttons if (CheckTimer(1)) //Now we can fire { if (GetFire()) //User took the chance to fire { if (fireIndex == DEBRIS_MAXPROJECTILES){fireIndex = 0;} numShots++; startFire(&ammo[fireIndex], &jet, 0); StartTimer(1, DEBRIS_RATEOFFIRE_MS); //Restart the fire timer. fireIndex++; SendData(SOUND_FIRE_PROJECTILE); //Fire sound } else if (GetSecFire()) //Shockwave cannon { if (fireIndex == DEBRIS_MAXPROJECTILES){fireIndex = 0;} startFire(&ammo[fireIndex], &jet, 2); StartTimer(1, DEBRIS_RATEOFFIRE_MS + 300); //Restart the fire timer. numShots++; fireIndex++; SendData(SOUND_FIRE_PROJECTILE); //Fire sound } else if (GetRightFire()) //Fire Reverse { if (fireIndex == DEBRIS_MAXPROJECTILES){fireIndex = 0;} startFire(&ammo[fireIndex], &jet, 1); StartTimer(1, DEBRIS_RATEOFFIRE_MS); //Restart the fire timer. numShots++; fireIndex++; SendData(SOUND_FIRE_PROJECTILE); //Fire sound } else if (GetRightSecFire()) //Reverse Shockwave cannon { if (fireIndex == DEBRIS_MAXPROJECTILES){fireIndex = 0;} startFire(&ammo[fireIndex], &jet, 3); StartTimer(1, DEBRIS_RATEOFFIRE_MS + 300); numShots++; fireIndex++; SendData(SOUND_FIRE_PROJECTILE); //Fire sound } } //Moves the weapons fire if (CheckTimer(2)) { //Check each ammo value to see if it hit a ball for (index = 0; index < DEBRIS_MAXPROJECTILES; index++) { if (ammo[index].enabled == 1) //This gives the game a performance boost but can cause inconsistant ball speeds { if (autoMove(&ammo[index]) == 1) { } if (lastCheck == 0) { lastCheck = 1; //Check each bullet to see if it hit a ball for (index2 = 0; index2 < DEBRIS_MAXDEBRIS; index2++) { //If a ball is hit, reset it so it starts over again. if (fire_checkHit(&ammo[index], &balls[index2]) == 1)//ammo[index].fireOutput == 1) { SendData(SOUND_BLOCK_DESTROYED); //Block hit sound balls[index2].enabled = 0; displaySolid(&balls[index2], 1); if (ammo[index].weapon != 2 && ammo[index].weapon != 3) { ammo[index].enabled = 0; displayFire(&ammo[index], 1); } //Ball speed increases every time 3 balls are dispatched if (ballsDestroyed % 3 == 0 && ballSpeed > 15) { ballSpeed--; } changeBallStart(&balls[index2], &moveYStart, &yPosStart, &xMoveStart, &yStart); ballsDestroyed++; if (ballsDestroyed > highScore) { highScore = ballsDestroyed; EEProm_Write_16(debrisHighScore_Addr, highScore); } } } } else { lastCheck = 0; } } } StartTimer(2, DEBRIS_PROJECTILESPEED_MS); } //Move the balls if (CheckTimer(3)) { for (index = 0; index < DEBRIS_MAXDEBRIS; index++) { if (balls[index].enabled == 1) //Gives a small performance boost at the cost of ball speed consistancy { autoMoveSolid(&balls[index]); if (jetHitCheck == 0) { //Ball hits the jet jetHitCheck = 1; if (jet_checkHit(&jet, &balls[index]) != 0x00) { SendData(SOUND_BLOCK_DESTROYED); //Block hit sound balls[index].enabled = 0; displaySolid(&balls[index], 1); display_jet(&jet, 0); health--; DisplayHealth(health, 0); //Jet was destroyed if (health == 0) { display_jet(&jet, 1); constructJet(&jet, 15, 2); health = 47; ballsDestroyed = 0; display_jet(&jet, 0); } changeBallStart(&balls[index], &moveYStart, &yPosStart, &xMoveStart, &yStart); } } else { jetHitCheck = 0; } } } StartTimer(3, ballSpeed); } } }