void T_Gate (objtype *ob) { id0_int_t spot; objtype *check; id0_unsigned_t temp; if (CheckHandAttack (ob) && !playstate) { // // warp // temp = bufferofs; bufferofs = 0; VW_Bar (26,4,232,9,STATUSCOLOR); // clear text description bufferofs = temp; IN_ClearKeysDown (); if (ob->temp1) { // // teleport inside level // for (check=player->next;check;check=check->next) if (check->obclass==gateobj && check->temp1==ob->temp1 && check != ob) { player->x = check->x; player->y = check->y; Thrust (player->angle,TILEGLOBAL/2); // move forwards Thrust (player->angle,TILEGLOBAL/2); // move forwards Thrust (player->angle,TILEGLOBAL/2); // move forwards fizzlein=true; } } else { // // teleport out of level // playstate = ex_warped; spot = *(mapsegs[0]+farmapylookup[ob->tiley]+ob->tilex)-NAMESTART; if (spot<1) gamestate.mapon++; else gamestate.mapon=spot-1; SD_PlaySound(WARPUPSND); } } }
void ControlMovement (objtype *ob) { int32_t oldx,oldy; int angle; int angleunits; thrustspeed = 0; oldx = player->x; oldy = player->y; if(buttonstate[bt_strafeleft]) { angle = ob->angle + ANGLES/4; if(angle >= ANGLES) angle -= ANGLES; if(buttonstate[bt_run]) Thrust(angle, RUNMOVE * MOVESCALE * tics); else Thrust(angle, BASEMOVE * MOVESCALE * tics); } if(buttonstate[bt_straferight]) { angle = ob->angle - ANGLES/4; if(angle < 0) angle += ANGLES; if(buttonstate[bt_run]) Thrust(angle, RUNMOVE * MOVESCALE * tics ); else Thrust(angle, BASEMOVE * MOVESCALE * tics); } // // side to side move // if (buttonstate[bt_strafe]) { // // strafing // // if (controlx > 0) { angle = ob->angle - ANGLES/4; if (angle < 0) angle += ANGLES; Thrust (angle,controlx*MOVESCALE); // move to left } else if (controlx < 0) { angle = ob->angle + ANGLES/4; if (angle >= ANGLES) angle -= ANGLES; Thrust (angle,-controlx*MOVESCALE); // move to right } } else { // // not strafing // anglefrac += controlx; angleunits = anglefrac/ANGLESCALE; anglefrac -= angleunits*ANGLESCALE; ob->angle -= angleunits; if (ob->angle >= ANGLES) ob->angle -= ANGLES; if (ob->angle < 0) ob->angle += ANGLES; } // // forward/backwards move // if (controly < 0) { Thrust (ob->angle,-controly*MOVESCALE); // move forwards } else if (controly > 0) { angle = ob->angle + ANGLES/2; if (angle >= ANGLES) angle -= ANGLES; Thrust (angle,controly*BACKMOVESCALE); // move backwards } if (gamestate.victoryflag) // watching the BJ actor return; }
/* =================== = = GameLoop = =================== This function controls the flow between states of the game. It loads previous saved games, setup levels states, controls the flow between levels, including when player loses or when completes the game, and checks if the result of the current game is a highscore. The "real" game loop (player actions in like moving, killing, etc.) is in the PlayLoop function. */ void GameLoop (void) { int i,xl,yl,xh,yh; char num[20]; boolean died; #ifdef MYPROFILE /* clock_t type variables may register times, start and and times could be used to measure the speed of the graphics system. Speed is measured in fps- frames per second. */ clock_t start,end; #endif restartgame: ClearMemory (); SETFONTCOLOR(0,15); DrawPlayScreen (); died = false; restart: do { if (!loadedgame) gamestate.score = gamestate.oldscore; DrawScore(); startgame = false; if (loadedgame) loadedgame = false; else SetupGameLevel (); #ifdef SPEAR if (gamestate.mapon == 20) // give them the key allways { gamestate.keys |= 1; DrawKeys (); } #endif ingame = true; StartMusic (); PM_CheckMainMem (); if (!died) PreloadGraphics (); else died = false; fizzlein = true; DrawLevel (); startplayloop: PlayLoop (); #ifdef SPEAR if (spearflag) { SD_StopSound(); SD_PlaySound(GETSPEARSND); if (DigiMode != sds_Off) { long lasttimecount = TimeCount; while(TimeCount < lasttimecount+150) //while(DigiPlaying!=false) SD_Poll(); } else SD_WaitSoundDone(); ClearMemory (); gamestate.oldscore = gamestate.score; gamestate.mapon = 20; SetupGameLevel (); StartMusic (); PM_CheckMainMem (); player->x = spearx; player->y = speary; player->angle = spearangle; spearflag = false; Thrust (0,0); goto startplayloop; } #endif StopMusic (); ingame = false; if (demorecord && playstate != ex_warped) FinishDemoRecord (); if (startgame || loadedgame) goto restartgame; switch (playstate) { case ex_completed: case ex_secretlevel: gamestate.keys = 0; DrawKeys (); VW_FadeOut (); ClearMemory (); LevelCompleted (); // do the intermission #ifdef SPEARDEMO if (gamestate.mapon == 1) { died = true; // don't "get psyched!" VW_FadeOut (); ClearMemory (); CheckHighScore (gamestate.score,gamestate.mapon+1); #pragma warn -sus #ifndef JAPAN _fstrcpy(MainMenu[viewscores].string,STR_VS); #endif MainMenu[viewscores].routine = CP_ViewScores; #pragma warn +sus return; } #endif #ifdef JAPDEMO if (gamestate.mapon == 3) { died = true; // don't "get psyched!" VW_FadeOut (); ClearMemory (); CheckHighScore (gamestate.score,gamestate.mapon+1); #pragma warn -sus #ifndef JAPAN _fstrcpy(MainMenu[viewscores].string,STR_VS); #endif MainMenu[viewscores].routine = CP_ViewScores; #pragma warn +sus return; } #endif gamestate.oldscore = gamestate.score; #ifndef SPEAR // // COMING BACK FROM SECRET LEVEL // if (gamestate.mapon == 9) gamestate.mapon = ElevatorBackTo[gamestate.episode]; // back from secret else // // GOING TO SECRET LEVEL // if (playstate == ex_secretlevel) gamestate.mapon = 9; #else #define FROMSECRET1 3 #define FROMSECRET2 11 // // GOING TO SECRET LEVEL // if (playstate == ex_secretlevel) switch(gamestate.mapon) { case FROMSECRET1: gamestate.mapon = 18; break; case FROMSECRET2: gamestate.mapon = 19; break; } else // // COMING BACK FROM SECRET LEVEL // if (gamestate.mapon == 18 || gamestate.mapon == 19) switch(gamestate.mapon) { case 18: gamestate.mapon = FROMSECRET1+1; break; case 19: gamestate.mapon = FROMSECRET2+1; break; } #endif else // // GOING TO NEXT LEVEL // gamestate.mapon++; break; case ex_died: Died (); died = true; // don't "get psyched!" if (gamestate.lives > -1) break; // more lives left VW_FadeOut (); ClearMemory (); CheckHighScore (gamestate.score,gamestate.mapon+1); #pragma warn -sus #ifndef JAPAN _fstrcpy(MainMenu[viewscores].string,STR_VS); #endif MainMenu[viewscores].routine = CP_ViewScores; #pragma warn +sus return; case ex_victorious: #ifndef SPEAR VW_FadeOut (); #else VL_FadeOut (0,255,0,17,17,300); #endif ClearMemory (); Victory (); ClearMemory (); CheckHighScore (gamestate.score,gamestate.mapon+1); #pragma warn -sus #ifndef JAPAN _fstrcpy(MainMenu[viewscores].string,STR_VS); #endif MainMenu[viewscores].routine = CP_ViewScores; #pragma warn +sus return; default: ClearMemory (); break; } } while (1); }
boolean LoadTheGame(FILE *file,int x,int y) { int32_t oldchecksum; objtype nullobj; statobj_t nullstat; int actnum=0, i, j; int32_t checksum = 0; DiskFlopAnim(x,y); fread (&gamestate,sizeof(gamestate),1,file); checksum = DoChecksum((byte *)&gamestate,sizeof(gamestate),checksum); DiskFlopAnim(x,y); fread (&LevelRatios[0],sizeof(LRstruct)*LRpack,1,file); checksum = DoChecksum((byte *)&LevelRatios[0],sizeof(LRstruct)*LRpack,checksum); DiskFlopAnim(x,y); SetupGameLevel (); DiskFlopAnim(x,y); fread (tilemap,sizeof(tilemap),1,file); checksum = DoChecksum((byte *)tilemap,sizeof(tilemap),checksum); DiskFlopAnim(x,y); for(i=0; i<MAPSIZE; i++) { for(j=0; j<MAPSIZE; j++) { fread (&actnum,sizeof(word),1,file); checksum = DoChecksum((byte *) &actnum,sizeof(word),checksum); if(actnum&0x8000) actorat[i][j]=objlist+(actnum&0x7fff); else actorat[i][j]=(objtype *)(uintptr_t) actnum; } } fread (areaconnect,sizeof(areaconnect),1,file); fread (areabyplayer,sizeof(areabyplayer),1,file); InitActorList (); DiskFlopAnim(x,y); fread (player,sizeof(*player),1,file); player->state=(statetype *) ((uintptr_t)player->state+(uintptr_t)&s_player); /* Load all actors ? */ while (1) { DiskFlopAnim(x,y); fread (&nullobj,sizeof(nullobj),1,file); if (nullobj.active == ac_badobject) break; GetNewActor (); nullobj.state=(statetype *) ((uintptr_t)nullobj.state+(uintptr_t)&s_grdstand); /* don't copy over the links */ memcpy (newobj,&nullobj,sizeof(nullobj)-8); } DiskFlopAnim(x,y); word laststatobjnum; fread (&laststatobjnum,sizeof(laststatobjnum),1,file); laststatobj=statobjlist+laststatobjnum; checksum = DoChecksum((byte *)&laststatobjnum,sizeof(laststatobjnum),checksum); DiskFlopAnim(x,y); for(i=0; i<MAXSTATS; i++) { fread(&nullstat,sizeof(nullstat),1,file); checksum = DoChecksum((byte *)&nullstat,sizeof(nullstat),checksum); nullstat.visspot=(byte *) ((uintptr_t)nullstat.visspot+(uintptr_t)spotvis); memcpy(statobjlist+i,&nullstat,sizeof(nullstat)); } DiskFlopAnim(x,y); fread (doorposition,sizeof(doorposition),1,file); checksum = DoChecksum((byte *)doorposition,sizeof(doorposition),checksum); DiskFlopAnim(x,y); fread (doorobjlist,sizeof(doorobjlist),1,file); checksum = DoChecksum((byte *)doorobjlist,sizeof(doorobjlist),checksum); DiskFlopAnim(x,y); fread (&pwallstate,sizeof(pwallstate),1,file); checksum = DoChecksum((byte *)&pwallstate,sizeof(pwallstate),checksum); fread (&pwalltile,sizeof(pwalltile),1,file); checksum = DoChecksum((byte *)&pwalltile,sizeof(pwalltile),checksum); fread (&pwallx,sizeof(pwallx),1,file); checksum = DoChecksum((byte *)&pwallx,sizeof(pwallx),checksum); fread (&pwally,sizeof(pwally),1,file); checksum = DoChecksum((byte *)&pwally,sizeof(pwally),checksum); fread (&pwalldir,sizeof(pwalldir),1,file); checksum = DoChecksum((byte *)&pwalldir,sizeof(pwalldir),checksum); fread (&pwallpos,sizeof(pwallpos),1,file); checksum = DoChecksum((byte *)&pwallpos,sizeof(pwallpos),checksum); /* assign valid floorcodes under moved pushwalls */ if (gamestate.secretcount) { word *map, *obj; word tile, sprite; map = mapsegs[0]; obj = mapsegs[1]; for (y=0; y<mapheight; y++) for (x=0; x<mapwidth; x++) { tile = *map++; sprite = *obj++; if (sprite == PUSHABLETILE && !tilemap[x][y] && (tile < AREATILE || tile >= (AREATILE+NUMMAPS))) { if (*map >= AREATILE) tile = *map; if (*(map-1-mapwidth) >= AREATILE) tile = *(map-1-mapwidth); if (*(map-1+mapwidth) >= AREATILE) tile = *(map-1+mapwidth); if ( *(map-2) >= AREATILE) tile = *(map-2); *(map-1) = tile; *(obj-1) = 0; } } } /* set player->areanumber to the floortile you're standing on */ Thrust(0,0); fread (&oldchecksum,sizeof(oldchecksum),1,file); fread (&lastgamemusicoffset,sizeof(lastgamemusicoffset),1,file); if(lastgamemusicoffset<0) lastgamemusicoffset=0; if (oldchecksum != checksum) { Message(STR_SAVECHT1"\n" STR_SAVECHT2"\n" STR_SAVECHT3"\n" STR_SAVECHT4); IN_ClearKeysDown(); IN_Ack(); gamestate.oldscore = gamestate.score = 0; gamestate.lives = 1; gamestate.weapon = gamestate.chosenweapon = gamestate.bestweapon = wp_pistol; gamestate.ammo = 8; } return true; }
void ControlMovement (objtype *ob) { long oldx,oldy; int angle,maxxmove; int angleunits; long speed; thrustspeed = 0; oldx = player->x; oldy = player->y; // // side to side move // if (buttonstate[bt_strafe]) { // // strafing // // if (controlx > 0) { angle = ob->angle - ANGLES/4; if (angle < 0) angle += ANGLES; Thrust (angle,controlx*MOVESCALE); // move to left } else if (controlx < 0) { angle = ob->angle + ANGLES/4; if (angle >= ANGLES) angle -= ANGLES; Thrust (angle,-controlx*MOVESCALE); // move to right } } else { // // not strafing // anglefrac += controlx; angleunits = anglefrac/ANGLESCALE; anglefrac -= angleunits*ANGLESCALE; ob->angle -= angleunits; if (ob->angle >= ANGLES) ob->angle -= ANGLES; if (ob->angle < 0) ob->angle += ANGLES; } // // forward/backwards move // if (controly < 0) { Thrust (ob->angle,-controly*MOVESCALE); // move forwards } else if (controly > 0) { angle = ob->angle + ANGLES/2; if (angle >= ANGLES) angle -= ANGLES; Thrust (angle,controly*BACKMOVESCALE); // move backwards } if (gamestate.victoryflag) // watching the BJ actor return; // // calculate total move // playerxmove = player->x - oldx; playerymove = player->y - oldy; }
void ControlMovement (AActor *ob) { if(playstate == ex_died) return; int32_t oldx,oldy; angle_t angle; int strafe = controlstrafe; thrustspeed = 0; oldx = players[0].mo->x; oldy = players[0].mo->y; // // side to side move // if (buttonstate[bt_strafe]) { // // strafing // // strafe += controlx; } else { if(players[0].ReadyWeapon && players[0].ReadyWeapon->fovscale > 0) controlx = xs_ToInt(controlx*players[0].ReadyWeapon->fovscale); // // not strafing // ob->angle -= controlx*(ANGLE_1/ANGLESCALE); } if(strafe) { // Cap the speed if (strafe > 100) strafe = 100; else if (strafe < -100) strafe = -100; strafe = FixedMul(players[0].mo->speed<<7, FixedMul(strafe, players[0].mo->sidemove[abs(strafe) >= RUNMOVE])); if (strafe > 0) { angle = ob->angle - ANGLE_90; Thrust (angle,strafe*MOVESCALE); // move to left } else if (strafe < 0) { angle = ob->angle + ANGLE_90; Thrust (angle,-strafe*MOVESCALE); // move to right } } // // forward/backwards move // if (controly < 0) { if(controly < -100) controly = -100; controly = FixedMul(players[0].mo->speed<<7, FixedMul(controly, players[0].mo->forwardmove[controly <= -RUNMOVE])); Thrust (ob->angle,-controly*MOVESCALE); // move forwards } else if (controly > 0) { if(controly > 100) controly = 100; controly = FixedMul(players[0].mo->speed<<7, FixedMul(controly, players[0].mo->forwardmove[controly >= RUNMOVE])); angle = ob->angle + ANGLE_180; Thrust (angle,controly*MOVESCALE*2/3); // move backwards } if (gamestate.victoryflag) // watching the BJ actor return; }
void Shipia::Update(bool& didRotate, bool& didTranslate) { shipForce = vmath::vec3(0.0f, 0.0f, 0.0f); didRotate = false; didTranslate = false; float thrustVolume = 40; if (sf::Keyboard::isKeyPressed(KeyBindingConfig::ThrustForwardsKey)) { soundManager->PlaySound(SoundManager::THRUST, sf::Vector3f(0, -3, -5), sf::Vector3f(8, 0, thrustVolume)); Thrust(true); didTranslate = true; } if (sf::Keyboard::isKeyPressed(KeyBindingConfig::ThrustReverseKey)) { soundManager->PlaySound(SoundManager::THRUST, sf::Vector3f(0, 3, 5), sf::Vector3f(8, 0, thrustVolume)); Thrust(false); didTranslate = true; } if (sf::Keyboard::isKeyPressed(KeyBindingConfig::ThrustLeftKey)) { // Thrust left and play a right thrust sound. soundManager->PlaySound(SoundManager::THRUST, sf::Vector3f(-5, 0, 0), sf::Vector3f(8, 0, thrustVolume)); SideThrust(true); didTranslate = true; } if (sf::Keyboard::isKeyPressed(KeyBindingConfig::ThrustRightKey)) { // Thrust right, sound on left soundManager->PlaySound(SoundManager::THRUST, sf::Vector3f(5, 0, 0), sf::Vector3f(8, 0, thrustVolume)); SideThrust(false); didTranslate = true; } if (sf::Keyboard::isKeyPressed(KeyBindingConfig::ThrustUpKey)) { // Thrust up, sound below. soundManager->PlaySound(SoundManager::THRUST, sf::Vector3f(0, -5, 0), sf::Vector3f(8, 0, thrustVolume)); VerticalThrust(true); didTranslate = true; } if (sf::Keyboard::isKeyPressed(KeyBindingConfig::ThrustDownKey)) { // Thrust down, sound above. soundManager->PlaySound(SoundManager::THRUST, sf::Vector3f(0, 5, 0), sf::Vector3f(8, 0, thrustVolume)); VerticalThrust(false); didTranslate = true; } if (sf::Keyboard::isKeyPressed(KeyBindingConfig::RotateLeftKey)) { RotateHorizontal(true); didRotate = true; } if (sf::Keyboard::isKeyPressed(KeyBindingConfig::RotateRightKey)) { RotateHorizontal(false); didRotate = true; } if (sf::Keyboard::isKeyPressed(KeyBindingConfig::RotateUpKey)) { RotateVertical(true); didRotate = true; } if (sf::Keyboard::isKeyPressed(KeyBindingConfig::RotateDownKey)) { RotateVertical(false); didRotate = true; } if (sf::Keyboard::isKeyPressed(KeyBindingConfig::RotateCWKey)) { BarrelRoll(true); didRotate = true; } if (sf::Keyboard::isKeyPressed(KeyBindingConfig::RotateCCWKey)) { BarrelRoll(false); didRotate = true; } // If we manually rotated, play the rotation sound if (didRotate) { soundManager->PlaySound(SoundManager::ROTATE, sf::Vector3f(0, 0, 0), sf::Vector3f(8, 0, 20)); } // Toggles on/off the rotational dampener if (sf::Keyboard::isKeyPressed(KeyBindingConfig::ToggleRotationDampeningKey) && !rotDampToggled) { soundManager->PlaySound(SoundManager::BUTTON_TOGGLE, sf::Vector3f(0, 0, 0), sf::Vector3f(5, 0, 100)); rotationalDampener = !rotationalDampener; rotDampToggled = true; } else if (!sf::Keyboard::isKeyPressed(KeyBindingConfig::ToggleRotationDampeningKey)) { rotDampToggled = false; } // Toggles on/off the translational dampener if (sf::Keyboard::isKeyPressed(KeyBindingConfig::ToggleTranslationDampeningKey) && !tranDampToggled) { soundManager->PlaySound(SoundManager::BUTTON_TOGGLE, sf::Vector3f(0, 0, 0), sf::Vector3f(5, 0, 100)); translationalDampener = !translationalDampener; tranDampToggled = true; } else if (!sf::Keyboard::isKeyPressed(KeyBindingConfig::ToggleTranslationDampeningKey)) { tranDampToggled = false; } }