int CheckPath (const char *path) { int pos[2]={0,0}; int i=0, num; char c[2]="0\0"; while (i<strlen(path)) { c[0] = path[i]; if (!IsANumber(c[0])) { i++; continue; } num = atoi(c); if (num == 1 || num == 4 || num == 7) pos[0]--; if (num == 3 || num == 6 || num == 9) pos[0]++; if (num == 1 || num == 2 || num == 3) pos[1]--; if (num == 7 || num == 8 || num == 9) pos[1]++; if (pos[0] < 0 || pos[0] > 4 || pos[1] < 0 || pos[1] > 4) return MINE; // went out of bounds, invalid. if (grid[pos[0]][pos[1]] == FINISH) return FINISH; if (grid[pos[0]][pos[1]] == MINE) return MINE; i++; } return MINE; }
void ViewerRenderer::SetCamera(float* cameraPosition, float* cameraTarget, float* cameraUp) { Normalize( cameraUp ); bool good_numbers = true; for ( int i = 0; i < 3 && good_numbers; i++ ) { if ( ! IsANumber( cameraPosition[ i ] ) || ! IsFinite( cameraPosition[ i ] ) ) good_numbers = false; if ( ! IsANumber( cameraTarget[ i ] ) || ! IsFinite( cameraTarget[ i ] ) ) good_numbers = false; if ( ! IsANumber( cameraUp[ i ] ) || ! IsFinite( cameraUp[ i ] ) ) good_numbers = false; } if ( ! good_numbers ) return; float viewVector[ 3 ]; Normalize( Subtract( cameraTarget, cameraPosition, viewVector ) ); if ( Length( viewVector ) < 0.0001 ) return; // Can't have cameraPosition == cameraTarget float dot = DotProduct( viewVector, cameraUp ); if ( dot < -0.999f || 0.999f < dot ) return; // Can't have view vector parallel to up vector if ( dot < -.1 || 1 < dot ) { // Change the up vector to form a 90 degree angle with the view vector... float cameraRight[ 3 ]; CrossProduct( viewVector, cameraUp, cameraRight ); CrossProduct( cameraRight, viewVector, cameraUp ); dot = DotProduct( viewVector, cameraUp ); if ( dot < -0.999f || 0.999f < dot ) return; // Can't have view vector parallel to up vector } for (int i = 0; i < 3; i++) { _cameraPosition[i] = cameraPosition[i]; _cameraTarget[i] = cameraTarget[i]; _cameraUp[i] = cameraUp[i]; } }
int main (int args, char *argc[]) { FILE *f; char buf[64]; char temp[64]; char path[64]; int add; long oldscore; unsigned int oldtime; unsigned int start = time(NULL); unsigned int spent; srand(time(NULL)); printf("\n"); printf("*********************************************************\n"); printf("Welcome to TAWS (Text Adventure Without Swords) volume 2!\n"); printf("*********************************************************\n"); printf("\n"); ConstructGrid(); DisplayGrid(); timestart = time(NULL); while (1) { printf("\n"); printf("Enter command here: "); scanf("%s", buf); if (!strcmp(buf, "show")) DisplayGrid(); else if (buf[0] == '5' || !strcmp(buf, "new")) { ConstructGrid(); DisplayGrid(); timestart = time(NULL); } else if (!strcmp(buf, "score")) printf("Score: %li\n", score); else if (!strcmp(buf, "help")) { printf("The object of TAWS v2 is to enter a sequence\n"); printf("of numbers (on the numpad) that matches a path to\n"); printf("the finish (F) from the start (S). Avoid mines (*).\n"); printf("For example, 8 moves up, 9 moves up and right, and 2 moves down.\n"); printf("-- Commands --\n"); printf("#####: Type a series of numbers and hit enter to enter a path.\n"); printf("'score': Show your current score.\n"); printf("'new' or '5': Generate a new board.\n"); printf("'show': Display current board.\n"); printf("'help': Show this help.\n"); printf("'highscore': See a saved highscore.\n"); printf("'exit': Exit the game, but why would you want that?\n"); printf("-- Tips --\n"); printf("The shorter your path and faster you do it, the more points you get!\n"); } else if (!strcmp(buf, "TAWS")) { printf("TAWS is most commonly known as Text Adventure Without Swords.\n"); printf("However, it has other meanings as well, including:\n"); printf("Timed Avoidance Withstanding Simulation\n"); printf("Torrential Admission of Watery Soup\n"); printf("Timetable Antithesis Waking Somebody\n"); printf("Top Ankle Wise Surrender\n"); printf("... or just TAWS.\n"); } else if (!strcmp(buf, "highscore")) { printf("Please enter a name: "); scanf("%s", temp); sprintf(path, "%s.sav", temp); f = fopen(path, "rb"); if (f) { fread(&oldscore, sizeof(long), 1, f); fread(&oldtime, sizeof(unsigned int), 1, f); fclose(f); printf("Old score for %s: %li in %u seconds.\n", temp, oldscore, oldtime); } else printf("Failed to open save file %s.\n", path); } else if (!strcmp(buf, "quit") || !strcmp(buf, "exit")) break; else if (IsANumber(buf[0])) { int result = CheckPath(buf); if(result == FINISH) { float timediff = (float)(time(NULL)-timestart); if (timediff > 0) add = 50-(strlen(buf)-4)*4 + (int)(50.0f*(float)strlen(buf)/(float)(time(NULL)-timestart)); else add = 50-(strlen(buf)-4)*4 + (int)(50.0f*(float)strlen(buf)); printf("Score: %li+%i=%li\n", score, add, score+add); score += add; } else { printf("You didn't make it to the finish!\n"); printf("Score: %li-250=%li\n", score, score-250); score -= 250; } ConstructGrid(); DisplayGrid(); timestart = time(NULL); } else printf("Come on, type something real (try 'help').\n"); } spent = time(NULL)-start; printf("You got %li points in %u minutes and %u seconds. Good job!\n", score, (spent/60), (spent%60)); printf("Please enter your name: "); scanf("%s", buf); sprintf(temp, "%s.sav", buf); f = fopen(temp, "rb"); if (f) { fread(&oldscore, sizeof(long), 1, f); fread(&oldtime, sizeof(unsigned int), 1, f); fclose(f); } else { oldscore = 0; oldtime = 0; } if (score > oldscore) { f = fopen(temp, "wb"); if (f) { printf("New personal highscore: %li in %u seconds!\n", score, spent); fwrite(&score, sizeof(long), 1, f); fwrite(&spent, sizeof(unsigned int), 1, f); } } if (oldscore > 0) printf("Old personal highscore: %li in %u seconds.\n", oldscore, oldtime); printf("Well wasn't that fun? See you next time!\n\n"); return 0; }