void CSceneMenu::init() { iRegionOption = new unsigned int[MAX_OPTIONS]; for(int i = 0; i < MAX_OPTIONS; i++) sOption[i] = new char[64]; initRenderObjects(); initSoundObjects(); // settings values calculateDifficultyPercentages(); _itoa(sGlobal->iPort, sPort, 10); // go to the main menu enterMenu(MENU_MAIN); }
void CSceneMenu::selectOption(int iOption) { switch(iCurrentMenu) { // MAIN case MENU_MAIN: switch(iOption) { // Play case 0: enterMenu(MENU_PLAY); break; // Settings case 1: enterMenu(MENU_SETTINGS); break; // Exit case 2: sceneChange(0); break; } break; // PLAY case MENU_PLAY: switch(iOption) { // Player vs CPU case 0: sGlobal->iHumanPlayers = 1; sGlobal->bMultiplayer = false; sGlobal->bKinect = false; sceneChange(SCENE_MATCH); break; // Multiplayer case 1: enterMenu(MENU_MULTIPLAYER); break; #ifdef _KINECT_ // Kinect: Player vs CPU case 2: sGlobal->iHumanPlayers = 1; sGlobal->bMultiplayer = false; sGlobal->bKinect = true; enterMenu(MENU_KINECT_INFO); break; // Kinect: Player vs Player case 3: sGlobal->iHumanPlayers = 2; sGlobal->bMultiplayer = false; sGlobal->bKinect = true; sGlobal->bSplit = true; enterMenu(MENU_KINECT_INFO); break; #endif } break; // MULTIPLAYER case MENU_MULTIPLAYER: switch(iOption) { // create game case 0: enterMenu(MENU_MULTIPLAYER_SERVER); break; // join game case 1: enterMenu(MENU_MULTIPLAYER_CLIENT); break; } break; // MULTIPLAYER - CLIENT case MENU_MULTIPLAYER_CLIENT: // join game if(iOption == 2) { sGlobal->iHumanPlayers = 1; sGlobal->bMultiplayer = true; sGlobal->bServer = false; if(sGlobal->bKinect) enterMenu(MENU_KINECT_INFO); else sceneChange(SCENE_MATCH); } break; // MULTIPLAYER - SERVER case MENU_MULTIPLAYER_SERVER: // create game if(iOption == 1) { sGlobal->iHumanPlayers = 1; sGlobal->bMultiplayer = true; sGlobal->bServer = true; if(sGlobal->bKinect) enterMenu(MENU_KINECT_INFO); else sceneChange(SCENE_MATCH); } break; // SETTINGS case MENU_SETTINGS: // AI difficulty if(iOption == 5) enterMenu(MENU_SETTINGS_DIFFICULTY); // Kinect calibration else if(iOption == 6) enterMenu(MENU_SETTINGS_KINECT); break; } }
void CSceneMenu::inputKey(char Key) { #ifdef _KINECT_ if(iCurrentMenu == MENU_KINECT_INFO) sceneChange(SCENE_MATCH); #endif switch(Key) { case KEY_ESC: switch(iCurrentMenu) { case MENU_MAIN: sceneChange(0); break; case MENU_PLAY: enterMenu(MENU_MAIN); break; case MENU_SETTINGS: enterMenu(MENU_MAIN); iSelectedOption = 1; break; case MENU_MULTIPLAYER: enterMenu(MENU_PLAY); iSelectedOption = 1; break; case MENU_MULTIPLAYER_SERVER: enterMenu(MENU_MULTIPLAYER); break; case MENU_MULTIPLAYER_CLIENT: enterMenu(MENU_MULTIPLAYER); iSelectedOption = 1; break; case MENU_SETTINGS_DIFFICULTY: enterMenu(MENU_SETTINGS); iSelectedOption = 5; break; case MENU_SETTINGS_KINECT: enterMenu(MENU_SETTINGS); iSelectedOption = 6; break; } break; case KEY_ENTER: selectOption(iSelectedOption); break; case KEY_BACKSPACE: // port if((iCurrentMenu == MENU_MULTIPLAYER_SERVER && iSelectedOption == 0) || (iCurrentMenu == MENU_MULTIPLAYER_CLIENT && iSelectedOption == 1)) { if(strlen(sPort) > 0) sPort[strlen(sPort) - 1] = '\0'; sGlobal->iPort = (strlen(sPort) > 0)? atoi(sPort): 0; refreshSettings(); } // server IP else if(iCurrentMenu == MENU_MULTIPLAYER_CLIENT && iSelectedOption == 0) { if(strlen(sGlobal->sIPServer) > 0) { sGlobal->sIPServer[strlen(sGlobal->sIPServer) - 1] = '\0'; refreshSettings(); } } break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': // port if((iCurrentMenu == MENU_MULTIPLAYER_SERVER && iSelectedOption == 0) || (iCurrentMenu == MENU_MULTIPLAYER_CLIENT && iSelectedOption == 1)) { if(strlen(sPort) < 5) { sPort[strlen(sPort) + 1] = '\0'; sPort[strlen(sPort)] = Key; sGlobal->iPort = atoi(sPort); refreshSettings(); } } // server IP else if(iCurrentMenu == MENU_MULTIPLAYER_CLIENT && iSelectedOption == 0) { if(strlen(sGlobal->sIPServer) < 15) { sGlobal->sIPServer[strlen(sGlobal->sIPServer) + 1] = '\0'; sGlobal->sIPServer[strlen(sGlobal->sIPServer)] = Key; refreshSettings(); } } break; case -66: // '.' // server IP if(iCurrentMenu == MENU_MULTIPLAYER_CLIENT && iSelectedOption == 0) { if(strlen(sGlobal->sIPServer) < 14) { sGlobal->sIPServer[strlen(sGlobal->sIPServer) + 1] = '\0'; sGlobal->sIPServer[strlen(sGlobal->sIPServer)] = '.'; refreshSettings(); } } break; case KEY_UP: iSelectedOption--; if(iSelectedOption < 0) iSelectedOption = iNumOptions - 1; break; case KEY_DOWN: iSelectedOption++; if(iSelectedOption == iNumOptions) iSelectedOption = 0; break; case KEY_LEFT: switch(iCurrentMenu) { // settings case MENU_SETTINGS: switch(iSelectedOption) { // goals to win case 0: if(sGlobal->iGameMaxGoals > 1) sGlobal->iGameMaxGoals--; break; // maximum time case 1: if(sGlobal->iGameMaxMinutes > 1) sGlobal->iGameMaxMinutes--; break; // table air case 2: sGlobal->bTableAir = !sGlobal->bTableAir; break; // automatic replay case 3: sGlobal->bAutomaticReplay = !sGlobal->bAutomaticReplay; break; // split screen case 4: sGlobal->bSplit = !sGlobal->bSplit; break; } break; // multiplayer case MENU_MULTIPLAYER: // play with kinect if(iSelectedOption == 2) sGlobal->bKinect = !sGlobal->bKinect; break; // AI difficulty settings case MENU_SETTINGS_DIFFICULTY: switch(iSelectedOption) { // speed for shooting case 0: if(iPercentShooting > 0) iPercentShooting--; break; // speed for defending case 1: if(iPercentDefending > 0) iPercentDefending--; break; // speed for clearing case 2: if(iPercentClearing > 0) iPercentClearing--; break; // attack/defense balance case 3: if(iPercentAttack > 0) iPercentAttack--; break; } calculateDifficultyValues(); break; // kinect settings case MENU_SETTINGS_KINECT: switch(iSelectedOption) { // table width case 0: if(sGlobal->fKinectWidth > (KINECT_WIDTH_MIN / 2)) sGlobal->fKinectWidth -= 5.0f; break; // minimum distance case 1: if(sGlobal->fKinectMinimumDistance > KINECT_MINDIST_MIN) sGlobal->fKinectMinimumDistance -= 10.0f; break; // maximum distance case 2: if(sGlobal->fKinectMaximumDistance > KINECT_MAXDIST_MIN) { sGlobal->fKinectMaximumDistance -= 10.0f; if(sGlobal->fKinectMaximumDistance < sGlobal->fKinectMinimumDistance) sGlobal->fKinectMinimumDistance = sGlobal->fKinectMaximumDistance; } break; // player 1 hand case 3: sGlobal->bPlayer1RightHanded = !sGlobal->bPlayer1RightHanded; break; // player 2 hand case 4: sGlobal->bPlayer2RightHanded = !sGlobal->bPlayer2RightHanded; break; } break; } refreshSettings(); break; case KEY_RIGHT: switch(iCurrentMenu) { // settings case MENU_SETTINGS: switch(iSelectedOption) { // goals to win case 0: if(sGlobal->iGameMaxGoals < GAME_MAX_GOALS) sGlobal->iGameMaxGoals++; break; // maximum time case 1: if(sGlobal->iGameMaxMinutes < GAME_MAX_MINUTES) sGlobal->iGameMaxMinutes++; break; // table air case 2: sGlobal->bTableAir = !sGlobal->bTableAir; break; // automatic replay case 3: sGlobal->bAutomaticReplay = !sGlobal->bAutomaticReplay; break; // split screen case 4: sGlobal->bSplit = !sGlobal->bSplit; break; } break; // multiplayer case MENU_MULTIPLAYER: // play with kinect if(iSelectedOption == 2) sGlobal->bKinect = !sGlobal->bKinect; break; // AI difficulty settings case MENU_SETTINGS_DIFFICULTY: switch(iSelectedOption) { // speed for shooting case 0: if(iPercentShooting < 100) iPercentShooting++; break; // speed for defending case 1: if(iPercentDefending < 100) iPercentDefending++; break; // speed for clearing case 2: if(iPercentClearing < 100) iPercentClearing++; break; // attack/defense balance case 3: if(iPercentAttack < 100) iPercentAttack++; break; } calculateDifficultyValues(); break; // kinect settings case MENU_SETTINGS_KINECT: switch(iSelectedOption) { // table width case 0: if(sGlobal->fKinectWidth < (KINECT_WIDTH_MAX / 2)) sGlobal->fKinectWidth += 5.0f; break; // minimum distance case 1: if(sGlobal->fKinectMinimumDistance < KINECT_MINDIST_MAX) { sGlobal->fKinectMinimumDistance += 10.0f; if(sGlobal->fKinectMinimumDistance > sGlobal->fKinectMaximumDistance) sGlobal->fKinectMaximumDistance = sGlobal->fKinectMinimumDistance; } break; // maximum distance case 2: if(sGlobal->fKinectMaximumDistance < KINECT_MAXDIST_MAX) sGlobal->fKinectMaximumDistance += 10.0f; break; // player 1 hand case 3: sGlobal->bPlayer1RightHanded = !sGlobal->bPlayer1RightHanded; break; // player 2 hand case 4: sGlobal->bPlayer2RightHanded = !sGlobal->bPlayer2RightHanded; break; } break; } refreshSettings(); break; } }
int main() { init(); enterMenu(0); int cloudScroll = 0; int loopSlower = 0; bool shootCoolDown = true; int reloadTimer = 0; //GAME LOOP while (true) { //INPUT if((REG_KEYINPUT & KEY_RIGHT) == 0){ tryMove(2,0,player.getWidth()-2,player.getHeight()/2,player); player.setRunning(true); player.setDir(true); } if((REG_KEYINPUT & KEY_LEFT) == 0){ tryMove(-2,0,0,player.getHeight()/2,player); player.setRunning(true); player.setDir(false); } if((REG_KEYINPUT & KEY_UP) == 0 || (REG_KEYINPUT & KEY_B) == 0){ if(player.getLanded()){ player.jump(); player.updateFrame(); } player.setJumpHeight(player.getJumpHeight()+4); } if((REG_KEYINPUT & KEY_A) == 0){ if(shootCoolDown){ if(weapon == 8){ if(player.getDir())tryMove(-2,0,0,player.getHeight()/2,player); else tryMove(2,0,player.getWidth()-2,player.getHeight()/2,player); }else if(weapon == 1){ if(player.getDir())tryMove(-1,0,0,player.getHeight()/2,player); else tryMove(1,0,player.getWidth()-2,player.getHeight()/2,player); } shoot(); shootCoolDown = false; reloadTimer = 0; } } //Player movement if(player.getJumping()){ if(!tryMove(0,-3,player.getWidth()/2,0,player)){ player.setJumping(false); } }else{ if(!tryMove(0,2,player.getWidth()/2,player.getHeight(),player)){ tryMove(0,1,player.getWidth()/2,player.getHeight(),player); player.setLanded(true); player.setJumping(false); }else{ player.setLanded(false); } } //Monster Movement for(int i = 0; i < enemies.size(); i++){ if(!enemies.at(i).isDead()){ if(enemies.at(i).getDir()){ if(!tryMove(1,0,enemies.at(i).getWidth(),(enemies.at(i).getHeight()/2)+1,enemies.at(i))){ enemies.at(i).setDir(false); } }else{ if(!tryMove(-1,0,0,(enemies.at(i).getHeight()/2)+1,enemies.at(i))){ enemies.at(i).setDir(true); } } tryMove(0,2,enemies.at(i).getWidth()/2,enemies.at(i).getHeight(),enemies.at(i)); ObjBuffer[i+3].attr0 &= ~(ATTR0_HIDE); }else{ ObjBuffer[i+3].attr0 |= ATTR0_HIDE; } } //Bullet movement for(int i = 0; i < bullets.size(); i++){ if(!bullets.at(i).isDead()){ int yMove = 0; if(rand() % 3 == 0)yMove = bullets.at(i).getLift(); if(bullets.at(i).getType() == 4){ tryMove(0,1,bullets.at(i).getWidth(),bullets.at(i).getHeight()+4,bullets.at(i)); }else if(bullets.at(i).getType() == 6){ if(player.getDir()){ ObjBuffer[i+24].attr1 &= ~(ATTR1_HFLIP); bullets.at(i).move(player.getX()+8, player.getY()); }else{ ObjBuffer[i+24].attr1 |= ATTR1_HFLIP; bullets.at(i).move(player.getX()-8, player.getY()); } if(bullets.at(i).charge()){ bullets.at(i).setDead(true); int number = 0; if(player.getDir())number = (SCREEN_WIDTH - player.getX())/8; else number = (0 + player.getX())/8; for(int i = 0; i < number; i++){ spawnBullet(7); } } }else if(bullets.at(i).getType() == 7){ if(bullets.at(i).charge())bullets.at(i).setDead(true); }else{ if(bullets.at(i).getDir()){ if(!tryMove(2,yMove,bullets.at(i).getWidth(), bullets.at(i).getHeight(), bullets.at(i))){ if(bullets.at(i).getType() == 3 && !bullets.at(i).getBounce()){ bullets.at(i).setBounce(true); bullets.at(i).setDir(false); }else{ bullets.at(i).setDead(true); if(bullets.at(i).getType() == 0 || bullets.at(i).getType() == 4){ explode(bullets.at(i).getX(), bullets.at(i).getY()); } } } }else{ if(!tryMove(-2,yMove,bullets.at(i).getWidth(), bullets.at(i).getHeight(), bullets.at(i))){ if(bullets.at(i).getType() == 3 && !bullets.at(i).getBounce()){ bullets.at(i).setBounce(true); bullets.at(i).setDir(true); }else{ bullets.at(i).setDead(true); if(bullets.at(i).getType() == 0 || bullets.at(i).getType() == 4){ explode(bullets.at(i).getX(), bullets.at(i).getY()); } } } } } ObjBuffer[i+24].attr0 &= ~(ATTR0_HIDE); }else{ ObjBuffer[i+24].attr0 |= ATTR0_HIDE; } } for(int i = 0; i < enemies.size(); i++){ if(!enemies.at(i).isDead()){ if(checkEntityCollision(player, enemies.at(i))){ player.setDead(true); } for(int k = 0; k < bullets.size(); k++){ if(!bullets.at(k).isDead()){ if(checkEntityCollision(bullets.at(k), enemies.at(i))){ enemies.at(i).hurt(bullets.at(k).getDamage()); if(bullets.at(k).getType() != 3 && bullets.at(k).getType() != 6 && bullets.at(k).getType() != 7){ bullets.at(k).setDead(true); if(bullets.at(k).getType() == 0 || bullets.at(k).getType() == 4){ explode(bullets.at(k).getX(), bullets.at(k).getY()); } } break; } } } } } if(checkEntityCollision(player, crate)){ crate.setDead(true); weapon = crate.getWeapon(); score++; } if(crate.isDead()){ switch(rand() % 7){ case 0:crate.move(80,32); break; case 1:crate.move(150,32); break; case 2:crate.move(30,64); break; case 3:crate.move(200,64); break; case 4:crate.move(115,104); break; case 5:crate.move(80,144); break; case 6:crate.move(150,144); break; } int newWep = 0; do newWep = rand() % 9; while(newWep == weapon || newWep == 6); crate.setWeapon(newWep); crate.setDead(false); } //General Slow things if(loopSlower % 7 == 0){ cloudScroll++; REG_BG3HOFS = cloudScroll; SetTile(30, 14, 19, 16+rand()%5); SetTile(30, 15, 19, 16+rand()%5); player.updateFrame(); for(int i = 0; i < enemies.size(); i++){ if(!enemies.at(i).isDead()){ enemies.at(i).updateFrame(); } } ObjBuffer[2].attr2 = ATTR2_ID8(player.getFrame()); for(int i = 0; i < enemies.size(); i++){ ObjBuffer[i+3].attr2 = ATTR2_ID8(enemies.at(i).getFrame()); } } reloadTimer++; if(weapon == 0 || weapon == 5 || weapon == 6 || weapon == 7){ if(reloadTimer >= 60){ shootCoolDown = true; } }else if(weapon == 2 || weapon == 4){ if(reloadTimer >= 45){ shootCoolDown = true; } }else if (weapon == 3){ if(reloadTimer >= 20){ shootCoolDown = true; } }else if(weapon == 1){ if(reloadTimer >= 10){ shootCoolDown = true; } }else{ if(reloadTimer >= 5){ shootCoolDown = true; } } if(reloadTimer > 1000)reloadTimer = 60; //Monster spawner if(rand()%100 == 0){ spawnMonster(); } //Player state updates if(player.getJumping())player.setState(2); else if(player.getRunning())player.setState(1); else player.setState(0); if(!player.getDir()){ ObjBuffer[0].attr1 |= ATTR1_HFLIP; ObjBuffer[2].attr1 |= ATTR1_HFLIP; }else{ ObjBuffer[0].attr1 &= ~(ATTR1_HFLIP); ObjBuffer[2].attr1 &= ~(ATTR1_HFLIP); } if(weapon == 8)ObjBuffer[0].attr0 |= ATTR0_SHAPE(1); else ObjBuffer[0].attr0 &= ~(ATTR0_SHAPE(1)); ObjBuffer[0].attr2 = ATTR2_ID8(22+weapon); for(int i = 0; i < enemies.size(); i++){ if(!enemies.at(i).isDead()){ if(!enemies.at(i).getDir())ObjBuffer[i+3].attr1 |= ATTR1_HFLIP; else ObjBuffer[i+3].attr1 &= ~(ATTR1_HFLIP); } } player.update(); if(player.isDead())enterMenu(2); //Render if(!player.getDir()){ if(weapon != 8)SetObjectX(0, player.getX()-4); else{ if(player.getX()-12 <= 0) SetObjectX(0, 0); else SetObjectX(0, player.getX()-12); } }else{ SetObjectX(0, player.getX()+4); } SetObjectY(0, player.getY()+1); SetObjectX(1, crate.getX()); SetObjectY(1, crate.getY()); SetObjectX(2, player.getX()); SetObjectY(2, player.getY()); for(int i = 0; i < enemies.size(); i++){ if(!enemies.at(i).isDead()){ SetObjectX(i+3, enemies.at(i).getX()); SetObjectY(i+3, enemies.at(i).getY()); } } for(int i = 0; i < bullets.size(); i++){ if(!bullets.at(i).isDead()){ SetObjectX(i+24, bullets.at(i).getX()); SetObjectY(i+24, bullets.at(i).getY()); } } drawText(112,10,toString(score)); WaitVSync(); UpdateObjects(); clearText(); loopSlower++; } return 0; }