#include #include #include "randint.h" #include #include #define HIGH_SCORES 10 #define HIGH_SCORE_FILE "highscores.txt" #define HIGH_SCORE_LEN 64 #define NAMES_FILE "monsternames.txt" #define MAX_NAMES 30 #define MAX_NAME_LEN 12 #define MAX_WEAPON_LEN 16 #define MAX_WEAPONS 17 #define WEAPONS_FILE "weapons.txt" #define MAX_ROOMS 10 #define ROOMS_FILE "rooms.txt" #define MAX_ROOM_LEN 768 #define DELIMETER '%' #define DEFAULT_BUFFER_SIZE 16 #define ROOM_ROWS 5 // prototype section int clearstdin(void); void oorzaquit(char*, int); int battle(int, int, int, int, int, int, int*s); int generateMonsterLvl(int); int generateMonsterHP(int); int generateMonsterStr(int); void logo(void); int ismonster(void); char *nameMonster(void); char *chooseWeapon(void); int run(int, int); int sleep(int); char *nameRoom(int); int roomNew(int, int); int level(int*, int*, int*, int*, int*); void boss(void); void highscore(char*, int); //end prototype section // my function oorza! int clearstdin(void) { char buff; do { buff = getchar(); } while ((buff != 0x0a) && (buff != EOF)); clearerr(stdin); } //my function - for quitting the program void oorzaquit(char *name, int level) { printf("Thank you for playing."); highscore(name,level); exit(1); } // This function makes a battle happend int battle(int playerLevel, int playerHp, int playerStr, int baddielevel, int baddiehp, int baddiestr, int *ran) { int a, b, playerRoll, baddieRoll,i,n; char choice; while (baddiehp >0 && playerHp >0 ) { //system("cls"); system("clear"); do { srand ( time(NULL) ); playerRoll = randint(playerLevel, playerStr) + 3; baddieRoll = randint(baddielevel, baddiestr); if (playerRoll > baddieRoll) { srand ( time(NULL) ); a = (abs(playerStr - baddiestr)); b = (2 * abs(playerStr - baddiestr)); if (a < 0) a = 0; if (b < 0) b = 0; printf("You lose %i life and take %i life from the monster!\n",a,b); playerHp=playerHp-a; baddiehp=baddiehp-b; printf("You: %i\t\t\t\t\tMonster: %i\n\n",playerHp,baddiehp); } // end of if else { srand ( time(NULL) ); a= ((2 * abs(playerStr - baddiestr))); b= ((abs(playerStr - baddiestr))); if (a < 0) {a = 0;} if (b < 0) {b = 0;} printf("You lose %i life and take %i life from the monster!\n",a,b); playerHp=playerHp-a; baddiehp=baddiehp-b; printf("You: %i\t\t\t\t\tMonster: %i\n\n",playerHp,baddiehp); } // end of else if (playerHp > 0 && baddiehp > 0) { do { printf("Continue fighting? (Y or N) "); //fflush(stdin); --- hmmm is it needed? clearstdin(); scanf("%c",&choice); switch ( choice) { case 'Y' : case 'y' : n = 1; break; case 'N' : case 'n' : i = randint(0,3); if (i == 0) { printf("As you turn and run, the monster chases you down and stabs you in the back. \nThanks for playing!\n"); playerHp=0; } //end of if else { *ran = 1; return playerHp; } //end of else n = 1; break; default : printf("What are you? A coward? A hero doesn't dilly-dally because he can't make \nhis mind up!\n"); break; } //end of switch } while (n != 1); //end of little do-while } // end of if else return playerHp; } while(playerHp > 0); //end of big do-while } //end of while return playerHp; } //end of battle() int generateMonsterLvl(int playerLevel) { int i = randint(playerLevel-3,playerLevel+4); if (i < 1) i = 1; return i; } int generateMonsterHP(int baddielevel) { int i = randint(baddielevel*2, baddielevel*3); return i; } int generateMonsterStr(int baddielevel) { int i = randint(baddielevel*2, baddielevel*3); return i; } void logo(void) { //system("color 4c"); // gives us some nice and scary color FILE *logo; char *log; log = malloc (75 * sizeof(char)); logo = fopen("logo.txt", "r"); while ( fgets(log, 75, logo)!= NULL) { printf("%s",log); } //end of while } int ismonster(void) { int i = randint(0,1); switch( i ) { case 0: return 0; break; case 1: return 1; break; } } char *nameMonster(void) { int b=0, c, x; char buf[MAX_NAME_LEN]; char *monstername[MAX_NAMES]; FILE *monsters; if((monsters = fopen(NAMES_FILE, "r")) == NULL) { printf("Couldn't open file %s\n", NAMES_FILE); exit(1); } // end of if while(b < MAX_NAMES && fgets(buf, MAX_NAME_LEN, monsters) != NULL) { monstername[b] = malloc(MAX_NAME_LEN); strncpy(monstername[b], strtok(buf, "\n"), MAX_NAME_LEN); b++; } // end of while c = randint(0,MAX_NAMES); //printf("Read %d names from file %s\n", b, NAMES_FILE); fclose(monsters); return monstername[c]; for(x=0; x= (bufferSize - 1)) { bufferB = bufferA; bufferSize *= 2; bufferA = memset(malloc(bufferSize * sizeof(char)),' ',1); strcpy(bufferA,bufferB); free(bufferB); } if (((character = fgetc(rooms)) != EOF) && (character != DELIMETER)) { bufferStrlen = strlen(bufferA); bufferA[bufferStrlen] = character; bufferA[bufferStrlen + 1]='\0'; } else { roomDescription[roomNumber] = malloc(sizeof(bufferA + 1) * sizeof(char)); roomDescription[roomNumber] = bufferA; bufferSize = DEFAULT_BUFFER_SIZE; bufferA = memset(malloc(bufferSize * sizeof(char)),' ',1); roomNumber++; if (roomNumber >= MAX_ROOMS) return roomDescription[i]; } } while (!ferror(rooms)); return roomDescription[i]; } int roomNew(int roomP, int change){ if (change == 1) { //NORTH if (roomP != (3*ROOM_ROWS-1) && roomP != ((3*ROOM_ROWS)+1)) { if (roomP == 1) //the only room that breaks the formula is room 1. This fixes that roomP = 3; else roomP = roomP + 3; } else printf("You can't go North from here!\n"); } if (change == 2) { //EAST if (roomP % 3 != 1) roomP = roomP + 1; else printf("You can't go East from here!\n"); } if (change == 3) { //SOUTH if (roomP != 2 && roomP != 4) roomP = roomP - 3; else printf("You can't go South from here!\n"); } if (change == 4) { //WEST if ((roomP % 3) != 2) roomP = roomP - 1; else printf("You can't go West from here!\n"); } return roomP; } int level(int *lvl, int *exp, int *hp, int *maxhp, int *str) { //life would be no fun without levels /* The way this function works is rather simple. You need 1+current level total experience to reach the next one. */ if (*exp > *lvl) { //do they have enough EXP? (*lvl)++; (*exp) = 0; // increase their level, then reset their experience //system("cls"); // clear the screen for the triumphant levelup screen system("clear"); printf("**************************CONGRATULATIONS!***********************\n"); printf("You have reached level %i! You need %i experience to level again!\n\n",*lvl,(*lvl + 1)); *maxhp = *maxhp + randint(5,20); // increase hp //next little tidbit makes it so that strength gets boosted every other level if (*lvl % 2 == 0) { *str = *str + 1; } *hp = *maxhp;// give a hard-earned health boost } else { //too bad they didn't level int i = (*lvl + 1) - (*exp); printf("You still need %i exp to level\n\n",i); } } void boss(void) { printf("The girl looks at you and starts to speak. You are terrified.\n"); printf("She says, \"congratulations, you have made it this far, I do not\n"); printf("Need to kill you. If you had found me earlier I would have.\"\n"); printf("The girl vanishes and a door to the North opens up and you walk\n"); printf("of the towerm smiling! Congratulations, you win!"); //clearstdin here? clearstdin(); //system("pause"); getchar(); exit(0); } void highscore(char *name, int level) { //bubble-sorting high-score list FILE *hs; int b=0,c,x,y; char *highscores[HIGH_SCORES+1]; char buf[HIGH_SCORE_LEN], buf2[HIGH_SCORE_LEN]; //next part reads the file for writing and fills the array from file if((hs = fopen(HIGH_SCORE_FILE, "r+")) == NULL) { printf("Couldn't open file %s\n", HIGH_SCORE_FILE); exit(1); } //end of if while(b < HIGH_SCORES && fgets(buf, HIGH_SCORE_LEN, hs) != NULL) { highscores[b] = malloc(HIGH_SCORE_LEN); strncpy(highscores[b], buf, HIGH_SCORE_LEN); b++; } fclose(hs); //next add the string to the bottom so we can bubble sort it if (level < 10) sprintf(buf, "0%d\t\t%s\n", level, name); else sprintf(buf, "%d\t\t%s\n", level, name); //printf("%s", buf); //uncomment to make sure we have buf right highscores[HIGH_SCORES] = malloc(HIGH_SCORE_LEN); strncpy(highscores[HIGH_SCORES], buf, HIGH_SCORE_LEN); // printf("%s",highscores[HIGH_SCORES]); //unedit this line for bug-checks // makes sure that we've copied into the array correctly for(x=0;x< HIGH_SCORES + 1;x++) //bubble sorts everything for(y=0;y