char singleloop(GameStruct* game) { PlayerStruct singlep; MainStruct mains; ItemStruct zombie[MAX_ZOMBIES]; ItemStruct shots[2]; init(&mains, &singlep, 1, game, zombie, shots); for(;; game->frames++) { WaitVsync(1); drawoverlay(game, &singlep); gameflags(game); playerflags(&singlep); singlep.joypad = ReadJoypad(0); if(singlep.life <= 0) { switch(gameovermenu(game, &singlep)) { case 1: return 1; case 2: return 0; default: break; } } else if(singlep.joypad&BTN_SELECT && game->flagcount >= DEBOUNCE_DELAY) { game->flagcount = 0; if(game->flags & GAMEPAUSED) game->flags &= ~GAMEPAUSED; else game->flags |= GAMEPAUSED; } if(game->flags & GAMEPAUSED) continue; rendermap(&mains, 1); screenSections[1].scrollX = mains.x.s; screenSections[1].scrollY = mains.y.s; singlemove(&singlep, &mains, shots); inputanim(&singlep); singlep.gundelay++; for(int i = 0; i < 2; i++) handleshot(&mains, game, &singlep, &shots[i], zombie); necromancer(zombie, &mains, game, &singlep, 1); if(!(singlep.flags & PLAYERHURT) || game->frames&2) { sprites[1].x = sprites[2].x = singlep.x; sprites[1].y = singlep.y; sprites[2].y = singlep.y + TILE_HEIGHT; } else { sprites[1].x = sprites[2].x = DISABLED_SPRITE; sprites[2].y = sprites[1].y = DISABLED_SPRITE; } } }
char multiloop(GameStruct* game) { PlayerStruct players[2]; MainStruct mains; ItemStruct zombie[MAX_ZOMBIES]; ItemStruct shots[2][2]; init(&mains, players, 2, game, zombie, shots); for(;;game->frames++) { WaitVsync(1); multidrawoverlay(game, players); gameflags(game); for(int p = 0; p < 2; p++) { playerflags(&players[p]); players[p].joypad = ReadJoypad(p); } if(players[0].life <= 0 && players[1].life <= 0) { switch(gameovermenu(game, &players[0])) { case 1: return 2; case 2: return 0; default: break; } } else if((players[0].joypad&BTN_SELECT || players[1].joypad&BTN_SELECT) && game->flagcount >= DEBOUNCE_DELAY) { game->flagcount = 0; if(game->flags & GAMEPAUSED) game->flags &= ~GAMEPAUSED; else game->flags |= GAMEPAUSED; } if(game->flags & GAMEPAUSED) continue; rendermap(&mains, 2); screenSections[1].scrollX = mains.x.s; screenSections[1].scrollY = mains.y.s; if(players[0].life > 0 && players[1].life > 0) multimove(players, &mains, shots); else if(players[0].life <= 0) singlemove(&(players[1]), &mains, shots[1]); else if(players[1].life <= 0) singlemove(&(players[0]), &mains, shots[0]); necromancer(zombie, &mains, game, players, 2); for(int p = 0; p < 2; p++) { inputanim(&(players[p])); players[p].gundelay++; for(int i = 0; i < 2; i++) handleshot(&mains, game, &players[p], &shots[p][i], zombie); if(!(players[p].flags & PLAYERHURT) || game->frames&2) { sprites[1 + p * 4].x = sprites[2 + p * 4].x = players[p].x; sprites[1 + p * 4].y = players[p].y; sprites[2 + p * 4].y = players[p].y + TILE_HEIGHT; } else { sprites[1 + p * 4].x = sprites[2 + p * 4].x = DISABLED_SPRITE; sprites[2 + p * 4].y = sprites[1 + p * 4].y = DISABLED_SPRITE; } } } }
void pregamemenu(void) { int count,count2; int simtimer; int simcount; int startdelay; game.exit=GAMEEXIT_NONE; startdelay=0; simtimer=SDL_GetTicks(); resetmenuitems(); joymenunum=1; while (!menuitem[0].active && !windowinfo.shutdown) { glClearColor(0.0f,0.0f,0.0f,0.0f); glClear(GL_COLOR_BUFFER_BIT); numofmenuitems=0; createmenuitem(TXT_BACK,0,0,16,1.0f,1.0f,1.0f,1.0f); setmenuitem(MO_HOTKEY,SCAN_ESC); createmenuitem(TXT_START,(320|TEXT_CENTER),320,16,1.0f,1.0f,1.0f,1.0f); setmenuitem(MO_HOTKEY,SCAN_S); checksystemmessages(); checkkeyboard(); checkmouse(); checkjoystick(); checkmenuitems(); setuptextdisplay(); glColor4f(1.0f,1.0f,1.0f,1.0f); displaybackground(540); if (game.levelnum<35) { count=(game.levelnum-1)/7+1; count2=(game.levelnum-1)%7+1; if (count==1) drawbackground(521,(320|TEXT_CENTER),48,192,192,640,480); if (count==2) drawbackground(522,(320|TEXT_CENTER),48,192,192,640,480); if (count==3) drawbackground(523,(320|TEXT_CENTER),48,192,192,640,480); if (count==4) drawbackground(524,(320|TEXT_CENTER),48,192,192,640,480); if (count==5) drawbackground(525,(320|TEXT_CENTER),48,192,192,640,480); drawtext("/i-/i",(320|TEXT_CENTER),256,16,1.0f,1.0f,1.0f,1.0f,count,count2); drawtext(TXT_LIVES" /i",(320|TEXT_CENTER),272,16,1.0f,1.0f,1.0f,1.0f,game.numoflives); drawtext(TXT_POINTS" /i",(320|TEXT_CENTER),288,16,1.0f,1.0f,1.0f,1.0f,game.totalscore); } if (game.levelnum==64) { drawbackground(526,(320|TEXT_CENTER),48,192,192,640,480); drawtext(" -1",(320|TEXT_CENTER),256,16,1.0f,1.0f,1.0f,1.0f); } if (game.levelnum==65) { drawbackground(526,(320|TEXT_CENTER),48,192,192,640,480); drawtext(" -2",(320|TEXT_CENTER),256,16,1.0f,1.0f,1.0f,1.0f); } if (game.levelnum==66) { drawbackground(526,(320|TEXT_CENTER),48,192,192,640,480); drawtext(" -3",(320|TEXT_CENTER),256,16,1.0f,1.0f,1.0f,1.0f); } if (game.levelnum==67) { drawbackground(526,(320|TEXT_CENTER),48,192,192,640,480); drawtext(TXT_ISLE_OF_THE,(320|TEXT_CENTER),256,16,1.0f,1.0f,1.0f,1.0f); drawtext(TXT_DEAD,(320|TEXT_CENTER),272,16,1.0f,1.0f,1.0f,1.0f); } if (game.levelnum==68) { drawbackground(526,(320|TEXT_CENTER),48,192,192,640,480); drawtext(TXT_SATANS_LAIR,(320|TEXT_CENTER),256,16,1.0f,1.0f,1.0f,1.0f); } drawmenuitems(); drawmousecursor(768+font.cursornum,mouse.x,mouse.y,16,1.0f,1.0f,1.0f,1.0f); SDL_GL_SwapBuffers(); if (menuitem[1].active)// || startdelay>=150) { loadstorylevel(game.levelnum); gameloop(); if (game.exit==GAMEEXIT_EXITGAME || game.exit==GAMEEXIT_DIED) if (game.levelnum<64) { if (game.numoflives<99) game.numoflives--; if (game.numoflives<0) { if (player[playernum].highscore<game.totalscore) player[playernum].highscore=game.totalscore; game.totalscore=0; game.numoflives=5; if (game.difficulty==1) { count2=(game.levelnum-1)%7+1; if (count2!=7) { count=(game.levelnum-1)/7; game.levelnum=count*7+1; } } if (game.difficulty>=2) game.levelnum=0; gameovermenu(); goto changelevelbypass; } } if (game.levelnum==34) if (game.exit==GAMEEXIT_WON || game.exit==GAMEXIT_WARPZONE) { game.score[0]=10000; if (game.levelnum==34 && game.exit==GAMEEXIT_WON) game.score[0]+=1; game.score[0]+=(object[0].hitpoints/50)*10; postgamemenu(); game.totalscore+=game.score[0]; endingmenu(); menuitem[0].active=1; game.levelnum=35; goto changelevelbypass; } if (game.exit==GAMEEXIT_WON) { //if (!game.bosslevel) if (game.levelnum!=68 || game.dialog==0) { if (game.levelnum==6) game.score[0]=1000; if (game.levelnum==13) game.score[0]=2000; if (game.levelnum==20) game.score[0]=3000; if (game.levelnum==27) game.score[0]=4000; if (game.levelnum==33) game.score[0]=5000; if (game.levelnum==34) game.score[0]=10000; if (game.levelnum==68) game.score[0]=20000; //if (game.levelnum==34 && game.exit==won) // game.score[0]+=10; game.oldschool=0; game.score[0]+=(object[0].hitpoints/50)*10; postgamemenu(); game.totalscore+=game.score[0]; if (game.exit==GAMEEXIT_EXITGAME) { game.exit=GAMEEXIT_WON; menuitem[0].active=1; } } if (game.levelnum<35) game.levelnum++; } if (game.levelnum==64) { game.levelnum=4; if (game.over==3) game.levelnum=22; if (game.over==4) game.levelnum=15; if (game.over==5) game.levelnum=8; goto changelevelbypass; } if (game.levelnum==65) { game.levelnum=9; goto changelevelbypass; } if (game.levelnum==66) { game.levelnum=26; goto changelevelbypass; } if (game.levelnum==67) { if (game.exit==GAMEEXIT_EXITGAME || game.exit==GAMEEXIT_DIED) game.levelnum=19; else game.levelnum=68; goto changelevelbypass; } if (game.levelnum==68) { game.levelnum=19; goto changelevelbypass; } if (game.exit==GAMEXIT_WARPZONE) { game.totalscore+=game.score[0]; if (game.levelnum==3) game.levelnum=64; if (game.levelnum==4) game.levelnum=24; if (game.levelnum==8) game.levelnum=65; if (game.levelnum==18) game.levelnum=67; if (game.levelnum==25) game.levelnum=66; goto changelevelbypass; } changelevelbypass:; simtimer=SDL_GetTicks(); startdelay=0; joymenunum=1; } simcount=0; while (SDL_GetTicks()-simtimer>20 && simcount<5) { simcount++; count=SDL_GetTicks()-simtimer-20; simtimer=SDL_GetTicks()-count; //startdelay++; } if (game.exit==GAMEEXIT_EXITGAME) menuitem[0].active=1; } resetmenuitems(); }