/* *createLane function * *p : a pointer to an array of strings represinting a lane * *this function will take an array of strings represinting a lane *and return a struct lane */ struct lane *createLane(char **p) { struct lane *l; char *temp; char **params; int now; int n = 0; int i; int numOfCkPts; int numOfSps; int numOfEts; l = malloc(sizeof(struct lane)); assert( l != 0); now = numberOfWords(p[n]); assert(now == 2); params = divideLine(p[n], now, MAX_STRING_LENGTH); assert(params != 0); l -> lane_id = createId(params[1]); freeCharArray(params, now); n++; now = numberOfWords(p[n]); assert(now == 2); params = divideLine(p[n], now, MAX_STRING_LENGTH); assert(params != 0); l -> number_of_waypoints = atoi(params[1]); freeCharArray(params, now); n++; temp = "lane_width"; now = numberOfWords(p[n]); params = divideLine(p[n], now, MAX_STRING_LENGTH); assert(params != 0); if(compTwoStrings(params[0], temp)){ assert(now == 2); l -> lane_width = atoi(params[1]); n++; } else l -> lane_width = -1; freeCharArray(params, now); temp = "left_boundary"; now = numberOfWords(p[n]); params = divideLine(p[n], now, MAX_STRING_LENGTH); assert(params != 0); if(compTwoStrings(params[0], temp)){ assert(now == 2); l -> left_boundary = malloc(MAX_STRING_LENGTH * sizeof(char)); stringCopy(params[1],l -> left_boundary); n++; } else l -> left_boundary = 0; freeCharArray(params, now); temp = "right_boundary"; now = numberOfWords(p[n]); params = divideLine(p[n], now, MAX_STRING_LENGTH); assert(params != 0); if(compTwoStrings(params[0], temp)){ assert(now == 2); l -> right_boundary = malloc(MAX_STRING_LENGTH * sizeof(char)); stringCopy(params[1],l -> right_boundary); n++; } else l -> right_boundary = 0; freeCharArray(params, now); numOfCkPts = 0; temp = "checkpoint"; now = numberOfWords(p[n]); params = divideLine(p[n], now, MAX_STRING_LENGTH); assert(params != 0); while(compTwoStrings(params[0], temp)){ assert(now == 3); freeCharArray(params, now); numOfCkPts++; now = numberOfWords(p[n + numOfCkPts]); params = divideLine(p[n + numOfCkPts], now, MAX_STRING_LENGTH); assert(params != 0); } freeCharArray(params, now); l -> number_of_checkpoints = numOfCkPts; if(numOfCkPts > 0) l -> checkpoints_list = malloc(numOfCkPts * sizeof(struct checkpoint)); else l -> checkpoints_list = 0; for(i = 0; i < numOfCkPts; i++){ l -> checkpoints_list[i] = createCheckpoint(p[n]); n++; } numOfSps = 0; temp = "stop"; now = numberOfWords(p[n]); params = divideLine(p[n], now, MAX_STRING_LENGTH); assert(params != 0); while(compTwoStrings(params[0], temp)){ assert(now == 2); freeCharArray(params, now); numOfSps++; now = numberOfWords(p[n + numOfSps]); params = divideLine(p[n + numOfSps], now, MAX_STRING_LENGTH); assert(params != 0); } freeCharArray(params, now); l -> number_of_stops = numOfSps; if(numOfSps > 0) l -> stops_list = malloc(numOfSps * sizeof(struct stop)); else l -> stops_list = 0; for(i = 0; i < numOfSps; i++){ l -> stops_list[i] = createStop(p[n]); n++; } numOfEts = 0; temp = "exit"; now = numberOfWords(p[n]); params = divideLine(p[n], now, MAX_STRING_LENGTH); assert(params != 0); while(compTwoStrings(params[0], temp)){ assert(now == 3); freeCharArray(params, now); numOfEts++; now = numberOfWords(p[n + numOfEts]); params = divideLine(p[n + numOfEts], now, MAX_STRING_LENGTH); assert(params != 0); } freeCharArray(params, now); l -> number_of_exits = numOfEts; if(numOfEts > 0) l -> exits_list = malloc(numOfEts * sizeof(struct stop)); else l -> exits_list = 0; for(i = 0; i < numOfEts; i++){ l -> exits_list[i] = createExit(p[n]); n++; } l -> waypoints_list = malloc( (l -> number_of_waypoints) * sizeof(struct waypoint)); assert((l -> waypoints_list) != 0); for(i = 0; i < l -> number_of_waypoints; i++){ l -> waypoints_list[i] = createWaypoint(p[n]); n++; } return l; }
/* *createPerimeter function * *p : a pointer to an array of strings represinting a perimeter * *this function will take an array of strings represinting a perimeter *and return a struct perimeter */ struct perimeter *createPerimeter(char **p) { struct perimeter *p_s; char *temp; char **params; int now; int n = 0; int i; int numOfEts; p_s = malloc(sizeof(struct perimeter)); assert(p_s != 0); now = numberOfWords(p[n]); assert(now == 2); params = divideLine(p[n], now, MAX_STRING_LENGTH); assert(params != 0); p_s -> perimeter_id = createId(params[1]); freeCharArray(params, now); n++; now = numberOfWords(p[n]); assert(now == 2); params = divideLine(p[n], now, MAX_STRING_LENGTH); assert(params != 0); p_s -> number_of_perimeterpoints = atoi(params[1]); freeCharArray(params, now); n++; numOfEts = 0; temp = "exit"; now = numberOfWords(p[n]); params = divideLine(p[n], now, MAX_STRING_LENGTH); assert(params != 0); while(compTwoStrings(params[0], temp)){ assert(now == 3); freeCharArray(params, now); numOfEts++; now = numberOfWords(p[n + numOfEts]); params = divideLine(p[n + numOfEts], now, MAX_STRING_LENGTH); assert(params != 0); } freeCharArray(params, now); p_s -> number_of_exits = numOfEts; if(numOfEts > 0) p_s -> exits_list = malloc(numOfEts * sizeof(struct stop)); else p_s -> exits_list = 0; for(i = 0; i < numOfEts; i++){ p_s -> exits_list[i] = createExit(p[n]); n++; } p_s -> perimeterpoints_list = malloc( (p_s -> number_of_perimeterpoints) * sizeof(struct perimeterpoint)); assert((p_s -> perimeterpoints_list) != 0); for(i = 0; i < p_s -> number_of_perimeterpoints; i++){ p_s -> perimeterpoints_list[i] = createPerimeterpoint(p[n]); n++; } return p_s; }
void Room::generateRooms(){ lvl++; int roomNum = 10 + lvl; // Limit to 40 rooms if(roomNum > 40) roomNum = 40; int x = 0, y = 0; std::string tileMap = ""; tileMap += "XXXXXXXXXXXX\n"; tileMap += "X X\n"; tileMap += "X X\n"; tileMap += "X X\n"; tileMap += "X X\n"; tileMap += "X X\n"; tileMap += "X X\n"; tileMap += "X X\n"; tileMap += "XXXXXXXXXXXX"; for(int i = 0; i < roomNum; i++){ std::string roomMap = tileMap; // Create first exit if(i == 0){ doors.push(SOUTH); roomMap[109] = ' '; roomMap[110] = ' '; } else{ createEntrance(roomMap); // Don't create exit in last room if(i != roomNum - 1) createExit(roomMap); } createCornerBlocks(roomMap); if(i != roomNum - 1) createCenterBlocks(roomMap); // Add room pieces according to room map for(int j = 0; j < roomMap.size(); j++){ if(roomMap[j] == 'X') addBlock(x, y); else if(roomMap[j] == '\n'){ y += 64; x -= 64*13; } // Add stairs in last room else if(j == 58 && i == roomNum - 1) stairs.push_back(Stairs(x, y)); else{ int randPiece = rand() % 100; if(randPiece == 0) addEnemy(x, y); else if(randPiece == 1) addItem(x, y); } x +=64; } // Move x and y coordinates to next position for new room if(doors.front() == SOUTH){ x -= 64*12; y += 64; } else if(doors.front() == EAST){ y -= 64*8; } else if(doors.front() == WEST){ x -= 64*12*2; y -= 64*8; } } }