using System; using System.Collections.Generic; using System.Text; using FRB; using FRB.Gui; using FRB.Text; using FRB.Audio; using Microsoft.DirectX.DirectInput; namespace GameName.Screens { class WorldMap : Screen { #region variable and sprite declarations #region sprite declarations Sprite backgroundSprite; Sprite warpbackgroundSprite; Sprite playerSprite; Sprite mainpanelSprite; Sprite radarSprite; Sprite dustSprite; Sprite warpmeterSprite; Sprite warpparticleSprite; Sprite viewrodlSprite; Sprite viewrodrSprite; Sprite viewscreenButtonSprite; Sprite viewscreenButtonBounds; Sprite viewscreenButtonLight; Sprite zoominButtonSprite; Sprite zoominButtonBounds; Sprite zoomoutButtonSprite; Sprite zoomoutButtonBounds; Sprite viewscreenSprite; Sprite minimapSprite; Sprite planetButton1; Sprite planetButton2; Sprite planetButton3; Sprite planetButton4; Sprite planetmarkerSprite; Sprite trackerSprite; Sprite planet1Sprite; Sprite planet1Moon1Sprite; Sprite planet1Moon2Sprite; #endregion #region text object declarations Text debugText1; #endregion #region variable declarations bool sublightOnly = false; bool autoPilot = false; bool stopped = false; bool trackerZoomin = true; bool zoomin = true; bool viewbuttonsloaded = false; bool lowering = false; bool raised = false; bool warping = false; bool borderCollisionX = false; bool borderCollisionY = false; int targetPlanet; int currentPlanet; int spawnCoord; int spawnCount = 0; int warpCount = 0; long startTime = TimeManager.currentTick; long turnTime = TimeManager.currentTick; float sizeCoefficient = 0.0175f; float trackerCoordX = -0.0f; float trackerCoordY = -0.0f; float trackerDistance; float spawnCoordX; float spawnCoordY; float spawnTimer; float turnTimer = 0; float warpTimer; float velocityAngle; float angleToRotate; float angleDifference; float secondsToTake; double playerXdiff; double playerYdiff; double planet1Xdiff; double planet1Ydiff; double planet1Moon1Xdiff; double planet1Moon1Ydiff; double planet1Moon2Xdiff; double planet1Moon2Ydiff; double planet1Angle; double planet1Moon1Angle; double planet1Moon2Angle; double playerXmov; double playerYmov; double playerNavAngle; double speed; #endregion #endregion public WorldMap(FrbEngineReferences frbEngineReferences) : base("", "", frbEngineReferences) { #region load and place all sprites and objects warpbackgroundSprite = sprMan.AddUnorderedSprite("warpbackground.bmp"); sprMan.RemoveSprite(warpbackgroundSprite); viewscreenSprite = sprMan.AddSprite("viewscreen.png"); sprMan.RemoveSprite(viewscreenSprite); viewscreenSprite = sprMan.AddSprite("systemviewscreen.png"); sprMan.RemoveSprite(viewscreenSprite); backgroundSprite = sprMan.AddUnorderedSprite("background.bmp"); backgroundSprite.sclX = backgroundSprite.texture.sizeX * 0.0162f; backgroundSprite.sclY = backgroundSprite.texture.sizeY * 0.0162f; AssignTextureToScreen(backgroundSprite.texture); mainpanelSprite = sprMan.AddOverlaySprite("mainpanel.png"); mainpanelSprite.sclX = mainpanelSprite.texture.sizeX * 0.016175f; mainpanelSprite.sclY = mainpanelSprite.texture.sizeY * 0.016175f; mainpanelSprite.x -= 0.025f; mainpanelSprite.y = -12.4f; AssignTextureToScreen(mainpanelSprite.texture); minimapSprite = sprMan.AddOverlaySprite("minimapzoomin.png"); minimapSprite.sclX = minimapSprite.texture.sizeX * 0.0158f; minimapSprite.sclY = minimapSprite.texture.sizeY * 0.0162f; minimapSprite.x = -16.725f; minimapSprite.y = -13.075f; AssignTextureToScreen(minimapSprite.texture); trackerSprite = sprMan.AddOverlaySprite("default.bmp"); trackerSprite.sclX = trackerSprite.texture.sizeX * (sizeCoefficient * 2); trackerSprite.sclY = trackerSprite.texture.sizeX * (sizeCoefficient * 2); trackerSprite.relX = trackerCoordX; trackerSprite.relY = trackerCoordY; trackerSprite.AttachTo(minimapSprite, true); AssignTextureToScreen(trackerSprite.texture); viewscreenButtonLight = sprMan.AddOverlaySprite("default.bmp"); viewscreenButtonLight.sclX = 0.15f; viewscreenButtonLight.sclY = 0.15f; viewscreenButtonLight.x = -13.725f; viewscreenButtonLight.y = -10.1f; viewscreenButtonLight.colorOperation = Microsoft.DirectX.Direct3D.TextureOperation.SelectArg2; viewscreenButtonLight.tintRed = 255; AssignTextureToScreen(viewscreenButtonLight.texture); viewscreenButtonSprite = sprMan.AddOverlaySprite("viewscreenbutton.png"); viewscreenButtonSprite.sclX = 2.05f; viewscreenButtonSprite.sclY = 2.05f; viewscreenButtonSprite.x = -15.025f; viewscreenButtonSprite.y = -9.875f; AssignTextureToScreen(viewscreenButtonSprite.texture); viewscreenButtonBounds = sprMan.AddOverlaySprite("default.bmp"); viewscreenButtonBounds.sclX = 1.555f; viewscreenButtonBounds.sclY = 0.435f; viewscreenButtonBounds.x = -15.025f; viewscreenButtonBounds.y = -9.875f; viewscreenButtonBounds.fade = 255; AssignTextureToScreen(viewscreenButtonBounds.texture); zoominButtonSprite = sprMan.AddOverlaySprite("zoominbutton.png"); zoominButtonSprite.sclY = 1.025f; zoominButtonSprite.x = -19.29f; zoominButtonSprite.y = -9.865f; AssignTextureToScreen(zoominButtonSprite.texture); zoominButtonBounds = sprMan.AddOverlaySprite("default.bmp"); zoominButtonBounds.sclX = 0.7f; zoominButtonBounds.sclY = 0.435f; zoominButtonBounds.x = -19.29f; zoominButtonBounds.y = -9.865f; zoominButtonBounds.fade = 255; AssignTextureToScreen(zoominButtonBounds.texture); zoomoutButtonSprite = sprMan.AddOverlaySprite("zoomoutbutton.png"); zoomoutButtonSprite.sclY = 1.025f; zoomoutButtonSprite.x = -17.6f; zoomoutButtonSprite.y = -9.865f; AssignTextureToScreen(zoomoutButtonSprite.texture); zoomoutButtonBounds = sprMan.AddOverlaySprite("default.bmp"); zoomoutButtonBounds.sclX = 0.7f; zoomoutButtonBounds.sclY = 0.435f; zoomoutButtonBounds.x = -17.6f; zoomoutButtonBounds.y = -9.865f; zoomoutButtonBounds.fade = 255; AssignTextureToScreen(zoomoutButtonBounds.texture); radarSprite = sprMan.AddOverlaySprite("radar.png"); radarSprite.sclX = radarSprite.texture.sizeX * 0.016175f; radarSprite.sclY = radarSprite.texture.sizeY * 0.016175f; radarSprite.x = 16.75f; radarSprite.y = -13.2f; radarSprite.fade = 75; radarSprite.rotZVelocity = -3; AssignTextureToScreen(radarSprite.texture); playerSprite = sprMan.AddSprite("ship.png"); playerSprite.sclX = playerSprite.texture.sizeX * sizeCoefficient; playerSprite.sclY = playerSprite.texture.sizeY * sizeCoefficient; playerSprite.y = 4.25f; AssignTextureToScreen(playerSprite.texture); viewrodlSprite = sprMan.AddSprite("viewrod.png"); viewrodlSprite.sclX = viewrodlSprite.texture.sizeX * sizeCoefficient; viewrodlSprite.sclY = viewrodlSprite.texture.sizeY * sizeCoefficient; viewrodlSprite.x = -20; viewrodlSprite.y = -27f; AssignTextureToScreen(viewrodlSprite.texture); viewrodrSprite = sprMan.AddSprite("viewrod2.png"); viewrodrSprite.sclX = viewrodrSprite.texture.sizeX * sizeCoefficient; viewrodrSprite.sclY = viewrodrSprite.texture.sizeY * sizeCoefficient; viewrodrSprite.x = 20; viewrodrSprite.y = -27; viewrodrSprite.AttachTo(viewrodlSprite, true); AssignTextureToScreen(viewrodrSprite.texture); warpmeterSprite = sprMan.AddSprite("default.bmp"); warpmeterSprite.sclX *= 0.5f; warpmeterSprite.sclY *= 3; warpmeterSprite.x = -12.375f; warpmeterSprite.y = -18.75f; AssignTextureToScreen(warpmeterSprite.texture); debugText1 = textMan.AddText(playerSprite.rotZ.ToString()); for (int i = 0; i < 150; i++) { spawnCoordX = (float)random.Next( -200, 200 )/10; spawnCoordY = (float)random.Next( -180, 180 )/10; spawnCount += 1; dustSprite = sprMan.AddParticle("dust.bmp"); dustSprite.sclX = dustSprite.texture.sizeX * sizeCoefficient; dustSprite.sclY = dustSprite.texture.sizeY * sizeCoefficient; dustSprite.x = spawnCoordX; dustSprite.y = spawnCoordY; AssignTextureToScreen(dustSprite.texture); dustSprite.rotZ = (float)random.Next( -200, 200 )/10; dustSprite.customFunctions += new customFunction(ParticleControl); } #endregion } public override void Activity() { base.Activity(); #region player movement controls // combines the x and y vectors to determine current ship speed speed = Math.Abs(playerXmov) + Math.Abs(playerYmov); if (warping == false) { // ship turning commands, if autopilot is activated turn automatically if (autoPilot == false) { if(inpMan.KeyDown(Key.Left) || inpMan.KeyDown(Key.A)) playerSprite.rotZVelocity = 5; else if(inpMan.KeyDown(Key.Right) || inpMan.KeyDown(Key.D)) playerSprite.rotZVelocity = -5; else playerSprite.rotZVelocity = 0; } else { // if autopilot is on and movement buttons are pressed, turn off // autopilot and give control back to the player if(inpMan.KeyDown(Key.Left) || inpMan.KeyDown(Key.A)) { playerSprite.ClearInstructions(); autoPilot = false; stopped = false; turnTimer = 0; } else if(inpMan.KeyDown(Key.Right) || inpMan.KeyDown(Key.D)) { playerSprite.ClearInstructions(); autoPilot = false; stopped = false; turnTimer = 0; } } // math functions to calculate ship speed if (inpMan.KeyDown(Key.Up) || inpMan.KeyDown(Key.W)) { playerSprite.ClearInstructions(); autoPilot = false; stopped = false; turnTimer = 0; if (speed < 12) { // increments the x and y vectors based on ships current angle playerXmov += (float)0.08f*(Math.Cos(playerSprite.rotZ)); playerYmov += (float)0.08f*(Math.Sin(playerSprite.rotZ)); } else { // keeps speed under 12 so direction doesn't become locked playerXmov *= 0.995; playerYmov *= 0.995; } } else if (inpMan.KeyDown(Key.Down) || inpMan.KeyDown(Key.S)) { playerSprite.ClearInstructions(); autoPilot = false; stopped = false; turnTimer = 0; if (speed < 12) { // increments the x and y vectors based on ships current angle playerXmov -= (float)0.04f*(Math.Cos(playerSprite.rotZ)); playerYmov -= (float)0.04f*(Math.Sin(playerSprite.rotZ)); } else { // keeps speed under 12 so direction doesn't become locked playerXmov *= 0.995; playerYmov *= 0.995; } } } // space brakes! if (inpMan.KeyDown(Key.Space)) { playerSprite.ClearInstructions(); autoPilot = false; stopped = false; turnTimer = 0; // decrement speed by 2% every frame playerXmov *= 0.98; playerYmov *= 0.98; if (speed < 0.2) { // come to full stop playerXmov = 0; playerYmov = 0; } } #endregion #region warp travel controls #region player control from sublight to warp functions // gathers angle data on current vectors to later determine if ship is // facing direction of motion(within 10% tolerance) velocityAngle = (float)Math.Atan2( playerYmov, playerXmov); angleDifference = FRB.CommonFunctions.AngleToAngle(velocityAngle, playerSprite.rotZ); // checks speed and current ship angle and lights up the warp light to // indicate warp is possible if conditions are met if (speed > 10 && Math.Abs(angleDifference) < 2*Math.PI*.025f) { warpmeterSprite.fade = 50; } else { warpmeterSprite.fade = 0; } // if warp conditions are met from above, then also check to see if Z is // being held and the warp meter will start charging if (inpMan.KeyDown(Key.Z) && speed > 11.5 && Math.Abs(angleDifference) < 2*Math.PI*.025f) { playerSprite.ClearInstructions(); autoPilot = false; stopped = false; turnTimer = 0; if (warpmeterSprite.y < -13.5) { warpmeterSprite.y += 5 * TimeManager.secondDifference; } // warp meter is full and warp is engaged, change backround and begin loading particles if (warpmeterSprite.y > -13.5 && warping == false) { // if within a planetary system return to the worldmap view if (sublightOnly == true) { sprMan.RemoveSprite(minimapSprite); sprMan.RemoveSprite(trackerSprite); sprMan.RemoveSprite(planet1Sprite); sprMan.RemoveSprite(planet1Moon1Sprite); sprMan.RemoveSprite(planet1Moon2Sprite); if (trackerZoomin == true) { minimapSprite = sprMan.AddOverlaySprite("minimapzoomin.png"); AssignTextureToScreen(minimapSprite.texture); } else { minimapSprite = sprMan.AddOverlaySprite("minimapzoomout.png"); AssignTextureToScreen(minimapSprite.texture); } minimapSprite.sclX = minimapSprite.texture.sizeX * 0.0158f; minimapSprite.sclY = minimapSprite.texture.sizeY * 0.0162f; minimapSprite.x = -16.725f; minimapSprite.y = -13.075f; trackerSprite = sprMan.AddOverlaySprite("default.bmp"); AssignTextureToScreen(trackerSprite.texture); trackerSprite.sclX = trackerSprite.texture.sizeX * (sizeCoefficient * 2); trackerSprite.sclY = trackerSprite.texture.sizeX * (sizeCoefficient * 2); trackerSprite.AttachTo(minimapSprite, true); switch (currentPlanet) { case 1: targetPlanet = 0; currentPlanet = 0; trackerCoordX = -1.9125f; trackerCoordY = 1.55f; break; case 2: targetPlanet = 0; currentPlanet = 0; trackerCoordX = 1.315f; trackerCoordY = -0.25f; break; case 3: targetPlanet = 0; currentPlanet = 0; trackerCoordX = -1.9125f; trackerCoordY = 1.55f; break; case 4: targetPlanet = 0; currentPlanet = 0; trackerCoordX = 1.315f; trackerCoordY = -0.25f; break; default: break; } if (viewrodlSprite.y == -2.25) { lowering = true; viewscreenButtonLight.colorOperation = Microsoft.DirectX.Direct3D.TextureOperation.SelectArg2; viewscreenButtonLight.tintGreen = 0; viewscreenButtonLight.tintRed = 255; } sublightOnly = false; } warping = true; warpCount = 0; warpTimer = TimeManager.currentTick; warpbackgroundSprite = sprMan.AddUnorderedSprite("warpbackground.bmp"); AssignTextureToScreen(warpbackgroundSprite.texture); warpbackgroundSprite.sclX = warpbackgroundSprite.texture.sizeX * 0.0162f; warpbackgroundSprite.sclY = warpbackgroundSprite.texture.sizeY * 0.0162f; // loads 50 warp particles to random positions for (int h = 0; h < 50; h++) { spawnCoordX = (float)random.Next( -200, 200 )/10; spawnCoordY = (float)random.Next( -180, 180 )/10; warpCount += 1; warpparticleSprite = sprMan.AddParticle("warpparticle.png"); warpparticleSprite.sclX = warpparticleSprite.texture.sizeX * sizeCoefficient; warpparticleSprite.sclY = warpparticleSprite.texture.sizeY * sizeCoefficient; warpparticleSprite.x = spawnCoordX; warpparticleSprite.y = spawnCoordY; AssignTextureToScreen(warpparticleSprite.texture); warpparticleSprite.rotZ = playerSprite.rotZ; warpparticleSprite.customFunctions += new customFunction(WarpParticleControl); } } } // depletes warp meter when exiting warp, or if Z is released prematurely else if (warping == false && stopped == false) { warpmeterSprite.y -= 5 * TimeManager.secondDifference; if (warpmeterSprite.y < -18.75) { warpmeterSprite.y = -18.75f; } } #endregion #region warp effects if (warping == true) { // moves tracker icon on the minimap if (trackerZoomin == true && zoomin == true) { trackerCoordX += (float)playerXmov/1000; trackerCoordY += (float)playerYmov/1000; } else { trackerCoordX += ((float)playerXmov/1000)*0.1262f; trackerCoordY += ((float)playerYmov/1000)*0.1262f; } // spawn warp particles if there are less than 300 on screen if (warpCount < 300) { // randomly selects numbers 1-4 to determine what side particle will spawn on spawnCoord = (int)Math.Ceiling((float)random.Next( 1, 5 )); switch (spawnCoord) { case 1: // left side spawnCoordX = -22; spawnCoordY = (float)random.Next( -180, 180 )/10; break; case 2: // right side spawnCoordX = 22; spawnCoordY = (float)random.Next( -180, 180 )/10; break; case 3: // top spawnCoordX = (float)random.Next( -200, 200 )/10; spawnCoordY = 18; break; case 4: // bottom spawnCoordX = (float)random.Next( -200, 200 )/10; spawnCoordY = -18; break; } spawnTimer = 0.1f/(float)speed; // loads a particle and assigns it to the WarpParticleControl function if (TimeManager.SecondsSince(startTime) >= spawnTimer) { warpCount++; startTime = TimeManager.currentTick; warpparticleSprite = sprMan.AddParticle("warpparticle.png"); warpparticleSprite.sclX = warpparticleSprite.texture.sizeX * sizeCoefficient; warpparticleSprite.sclY = warpparticleSprite.texture.sizeY * sizeCoefficient; warpparticleSprite.x = spawnCoordX; warpparticleSprite.y = spawnCoordY; AssignTextureToScreen(warpparticleSprite.texture); warpparticleSprite.rotZ = playerSprite.rotZ; warpparticleSprite.customFunctions += new customFunction(WarpParticleControl); } } // drop out of warp if Z is pressed at least 2 seconds after warp was engaged if (inpMan.KeyDown(Key.Z) && TimeManager.SecondsSince((long)warpTimer) > 0.5) { playerSprite.ClearInstructions(); autoPilot = false; stopped = false; sprMan.RemoveSprite(warpbackgroundSprite); warping = false; turnTimer = 0; playerXmov *= 0.25f; playerYmov *= 0.25f; // reloads 150 default dust particles for (int i = 0; i < 150; i++) { spawnCoordX = (float)random.Next( -200, 200 )/10; spawnCoordY = (float)random.Next( -180, 180 )/10; spawnCount += 1; dustSprite = sprMan.AddParticle("dust.bmp"); dustSprite.sclX = dustSprite.texture.sizeX * sizeCoefficient; dustSprite.sclY = dustSprite.texture.sizeY * sizeCoefficient; dustSprite.x = spawnCoordX; dustSprite.y = spawnCoordY; AssignTextureToScreen(dustSprite.texture); dustSprite.rotZ = (float)random.Next( -200, 200 )/10; dustSprite.customFunctions += new customFunction(ParticleControl); } } } #endregion #endregion #region dust spawning functions if (speed > 0 && spawnCount < 300 && warping == false) { // generate a random number to indicate what side particle will spawn spawnCoord = (int)Math.Ceiling((float)random.Next( 1, 5 )); switch (spawnCoord) { case 1: // left side spawnCoordX = -22; spawnCoordY = (float)random.Next( -180, 180 )/10; break; case 2: // right side spawnCoordX = 22; spawnCoordY = (float)random.Next( -180, 180 )/10; break; case 3: // top spawnCoordX = (float)random.Next( -200, 200 )/10; spawnCoordY = 18; break; case 4: // bottom spawnCoordX = (float)random.Next( -200, 200 )/10; spawnCoordY = -18; break; } // spawns particles at a rate based on current ship speed spawnTimer = 0.1f/(float)speed; if (TimeManager.SecondsSince(startTime) >= spawnTimer) { spawnCount++; startTime = TimeManager.currentTick; dustSprite = sprMan.AddParticle("dust.bmp"); dustSprite.sclX = dustSprite.texture.sizeX * sizeCoefficient; dustSprite.sclY = dustSprite.texture.sizeY * sizeCoefficient; dustSprite.x = spawnCoordX; dustSprite.y = spawnCoordY; AssignTextureToScreen(dustSprite.texture); dustSprite.rotZ = (float)random.Next( -200, 200 )/10; dustSprite.customFunctions += new customFunction(ParticleControl); } } #endregion #region viewscreen opening and manipulation // if "V" is pressed and the viewscreen is closed, start raising viewrods upward if (inpMan.KeyDown(Key.V) && raised == false && viewrodlSprite.y == -27) { viewscreenButtonLight.colorOperation = Microsoft.DirectX.Direct3D.TextureOperation.SelectArg2; viewscreenButtonLight.tintRed = 0; viewscreenButtonLight.tintGreen = 255; viewrodlSprite.yVelocity = 90; } // if "V" is pressed and the viewscreen is open, start closing the viewscreen if (inpMan.KeyDown(Key.V) && raised == true && viewrodlSprite.y == -2.25) { lowering = true; viewscreenButtonLight.colorOperation = Microsoft.DirectX.Direct3D.TextureOperation.SelectArg2; viewscreenButtonLight.tintGreen = 0; viewscreenButtonLight.tintRed = 255; } // performs same function as pressing "V", only by clicking on the viewscreen button instead if(cursor.primaryDown) { if (cursor.IsOn(viewscreenButtonBounds) && raised == false && viewrodlSprite.y == -27) { viewscreenButtonLight.colorOperation = Microsoft.DirectX.Direct3D.TextureOperation.SelectArg2; viewscreenButtonLight.tintRed = 0; viewscreenButtonLight.tintGreen = 255; viewrodlSprite.yVelocity = 90; } if (cursor.IsOn(viewscreenButtonBounds) && raised == true && viewrodlSprite.y == -2.25) { lowering = true; viewscreenButtonLight.colorOperation = Microsoft.DirectX.Direct3D.TextureOperation.SelectArg2; viewscreenButtonLight.tintGreen = 0; viewscreenButtonLight.tintRed = 255; } } // stops viewrods from moving upward, and attached the viewscreen which begins to open if (viewrodlSprite.y > -2.25) { viewrodlSprite.yVelocity = 0; viewrodlSprite.y = -2.25f; if (sublightOnly == false) { viewscreenSprite = sprMan.AddOverlaySprite("viewscreen.png"); AssignTextureToScreen(viewscreenSprite.texture); } else { viewscreenSprite = sprMan.AddOverlaySprite("systemviewscreen.png"); AssignTextureToScreen(viewscreenSprite.texture); } viewscreenSprite.fade = 50; viewscreenSprite.y = 4.25f; viewscreenSprite.sclX *= 0.1f; viewscreenSprite.sclY *= 0.1f; viewscreenSprite.customFunctions += new customFunction(ViewscreenControl); } // stops the viewrods once they've finished lowering if (viewrodlSprite.y < -27) { viewrodlSprite.yVelocity = 0; viewrodlSprite.y = -27; } #endregion #region minimap controls and navigation of ship #region zoomin and zoomout button controls // zoom in the minimap when the = key is pressed if (inpMan.KeyDown(Key.Equals) && zoomin == false && sublightOnly == false) { sprMan.RemoveSprite(minimapSprite); minimapSprite = sprMan.AddOverlaySprite("minimapzoomin.png"); minimapSprite.sclX = minimapSprite.texture.sizeX * 0.0158f; minimapSprite.sclY = minimapSprite.texture.sizeY * 0.0162f; minimapSprite.x = -16.725f; minimapSprite.y = -13.075f; AssignTextureToScreen(minimapSprite.texture); // remove the tracker if the ship is not within the new view, or add it if it is if (trackerZoomin == false) sprMan.RemoveSprite(trackerSprite); else { trackerSprite = sprMan.AddOverlaySprite("default.bmp"); trackerSprite.sclX = trackerSprite.texture.sizeX * (sizeCoefficient * 2); trackerSprite.sclY = trackerSprite.texture.sizeX * (sizeCoefficient * 2); trackerSprite.relX = trackerCoordX; trackerSprite.relY = trackerCoordY; AssignTextureToScreen(trackerSprite.texture); trackerSprite.AttachTo(minimapSprite, true); } zoomin = true; // attach the planet marker sprite if it should be showing now switch(targetPlanet) { case 1: PlanetMarkerSpawn(-1.9125f, 1.55f, 0.365f); break; case 2: PlanetMarkerSpawn(1.315f, -0.25f, 0.6f); break; default: break; } } // zoom out the minimap when the - key is pressed if (inpMan.KeyDown(Key.Minus) && zoomin == true && sublightOnly == false) { sprMan.RemoveSprite(minimapSprite); minimapSprite = sprMan.AddOverlaySprite("minimapzoomout.png"); minimapSprite.sclX = minimapSprite.texture.sizeX * 0.0158f; minimapSprite.sclY = minimapSprite.texture.sizeY * 0.0162f; AssignTextureToScreen(minimapSprite.texture); minimapSprite.x = -16.725f; minimapSprite.y = -13.075f; // remove the tracker if the ship is not within the new view, or add it if it is if (trackerZoomin == true) { trackerCoordX *= 0.1262f; trackerCoordY *= 0.1262f; sprMan.RemoveSprite(trackerSprite); trackerSprite = sprMan.AddOverlaySprite("default.bmp"); trackerSprite.sclX = trackerSprite.texture.sizeX * (sizeCoefficient * 2); trackerSprite.sclY = trackerSprite.texture.sizeX * (sizeCoefficient * 2); trackerSprite.x = trackerCoordX; trackerSprite.y = trackerCoordY; AssignTextureToScreen(trackerSprite.texture); trackerSprite.AttachTo(minimapSprite, true); } else { trackerSprite = sprMan.AddOverlaySprite("default.bmp"); trackerSprite.sclX = trackerSprite.texture.sizeX * (sizeCoefficient * 2); trackerSprite.sclY = trackerSprite.texture.sizeX * (sizeCoefficient * 2); trackerSprite.relX = trackerCoordX; trackerSprite.relY = trackerCoordY; AssignTextureToScreen(trackerSprite.texture); trackerSprite.AttachTo(minimapSprite, true); } zoomin = false; // attach the planet marker sprite if it should be showing now switch(targetPlanet) { case 3: PlanetMarkerSpawn(-1.9125f, 1.55f, 0.365f); break; case 4: PlanetMarkerSpawn(1.315f, -0.25f, 0.6f); break; default: break; } } // zoom in the minimap when the zoom in button is clicked if(cursor.primaryDown) { if (cursor.IsOn(zoominButtonBounds) && zoomin == false && sublightOnly == false) { sprMan.RemoveSprite(minimapSprite); minimapSprite = sprMan.AddOverlaySprite("minimapzoomin.png"); minimapSprite.sclX = minimapSprite.texture.sizeX * 0.0158f; minimapSprite.sclY = minimapSprite.texture.sizeY * 0.0162f; AssignTextureToScreen(minimapSprite.texture); minimapSprite.x = -16.725f; minimapSprite.y = -13.075f; // remove the tracker if the ship is not within the new view, or add it if it is if (trackerZoomin == false) sprMan.RemoveSprite(trackerSprite); else { trackerSprite = sprMan.AddOverlaySprite("default.bmp"); trackerSprite.sclX = trackerSprite.texture.sizeX * (sizeCoefficient * 2); trackerSprite.sclY = trackerSprite.texture.sizeX * (sizeCoefficient * 2); trackerSprite.relX = trackerCoordX; trackerSprite.relY = trackerCoordY; AssignTextureToScreen(trackerSprite.texture); trackerSprite.AttachTo(minimapSprite, true); } zoomin = true; // attach the planet marker sprite if it should be showing now switch(targetPlanet) { case 1: PlanetMarkerSpawn(-1.9125f, 1.55f, 0.365f); break; case 2: PlanetMarkerSpawn(1.315f, -0.25f, 0.6f); break; default: break; } } // zoom out the minimap when the zoom out button is clicked if (cursor.IsOn(zoomoutButtonBounds) && zoomin == true && sublightOnly == false) { sprMan.RemoveSprite(minimapSprite); minimapSprite = sprMan.AddOverlaySprite("minimapzoomout.png"); minimapSprite.sclX = minimapSprite.texture.sizeX * 0.0158f; minimapSprite.sclY = minimapSprite.texture.sizeY * 0.0162f; AssignTextureToScreen(minimapSprite.texture); minimapSprite.x = -16.725f; minimapSprite.y = -13.075f; // remove the tracker if the ship is not within the new view, or add it if it is if (trackerZoomin == true) sprMan.RemoveSprite(trackerSprite); else { trackerSprite = sprMan.AddOverlaySprite("default.bmp"); trackerSprite.sclX = trackerSprite.texture.sizeX * (sizeCoefficient * 2); trackerSprite.sclY = trackerSprite.texture.sizeX * (sizeCoefficient * 2); trackerSprite.relX = trackerCoordX; trackerSprite.relY = trackerCoordY; AssignTextureToScreen(trackerSprite.texture); trackerSprite.AttachTo(minimapSprite, true); } zoomin = false; // attach the planet marker sprite if it should be showing now switch(targetPlanet) { case 3: PlanetMarkerSpawn(-1.9125f, 1.55f, 0.365f); break; case 4: PlanetMarkerSpawn(1.315f, -0.25f, 0.6f); break; default: break; } } } // update the trackers position when the two trackerCoord values start changing trackerSprite.relX = trackerCoordX; trackerSprite.relY = trackerCoordY; #endregion #region navigation functions for tracking beacon #region map is zoomed in and ship is within inner system if (zoomin == true && trackerZoomin == true && sublightOnly == false) { if (trackerCoordX > 3.25) { trackerCoordX = (trackerCoordX * 0.1262f); trackerCoordY = (trackerCoordY * 0.1262f); sprMan.RemoveSprite(minimapSprite); minimapSprite = sprMan.AddOverlaySprite("minimapzoomout.png"); minimapSprite.sclX = minimapSprite.texture.sizeX * 0.0158f; minimapSprite.sclY = minimapSprite.texture.sizeY * 0.0162f; minimapSprite.x = -16.725f; minimapSprite.y = -13.075f; AssignTextureToScreen(minimapSprite.texture); sprMan.RemoveSprite(trackerSprite); trackerSprite = sprMan.AddOverlaySprite("default.bmp"); trackerSprite.sclX = trackerSprite.texture.sizeX * (sizeCoefficient * 2); trackerSprite.sclY = trackerSprite.texture.sizeX * (sizeCoefficient * 2); trackerSprite.x = trackerCoordX; trackerSprite.y = trackerCoordY; AssignTextureToScreen(trackerSprite.texture); trackerSprite.AttachTo(minimapSprite, true); zoomin = false; trackerZoomin = false; // attach the planet marker sprite if it should be showing now switch(targetPlanet) { case 3: PlanetMarkerSpawn(-1.9125f, 1.55f, 0.365f); break; case 4: PlanetMarkerSpawn(1.315f, -0.25f, 0.6f); break; default: break; } } if (trackerCoordX < -3.25) { trackerCoordX = (trackerCoordX * 0.1262f); trackerCoordY = (trackerCoordY * 0.1262f); sprMan.RemoveSprite(minimapSprite); minimapSprite = sprMan.AddOverlaySprite("minimapzoomout.png"); minimapSprite.sclX = minimapSprite.texture.sizeX * 0.0158f; minimapSprite.sclY = minimapSprite.texture.sizeY * 0.0162f; minimapSprite.x = -16.725f; minimapSprite.y = -13.075f; AssignTextureToScreen(minimapSprite.texture); sprMan.RemoveSprite(trackerSprite); trackerSprite = sprMan.AddOverlaySprite("default.bmp"); trackerSprite.sclX = trackerSprite.texture.sizeX * (sizeCoefficient * 2); trackerSprite.sclY = trackerSprite.texture.sizeX * (sizeCoefficient * 2); trackerSprite.x = trackerCoordX; trackerSprite.y = trackerCoordY; AssignTextureToScreen(trackerSprite.texture); trackerSprite.AttachTo(minimapSprite, true); zoomin = false; trackerZoomin = false; // attach the planet marker sprite if it should be showing now switch(targetPlanet) { case 3: PlanetMarkerSpawn(-1.9125f, 1.55f, 0.365f); break; case 4: PlanetMarkerSpawn(1.315f, -0.25f, 0.6f); break; default: break; } } if (trackerCoordY > 2.508) { trackerCoordX = (trackerCoordX * 0.1262f); trackerCoordY = (trackerCoordY * 0.1262f); sprMan.RemoveSprite(minimapSprite); minimapSprite = sprMan.AddOverlaySprite("minimapzoomout.png"); minimapSprite.sclX = minimapSprite.texture.sizeX * 0.0158f; minimapSprite.sclY = minimapSprite.texture.sizeY * 0.0162f; minimapSprite.x = -16.725f; minimapSprite.y = -13.075f; AssignTextureToScreen(minimapSprite.texture); sprMan.RemoveSprite(trackerSprite); trackerSprite = sprMan.AddOverlaySprite("default.bmp"); trackerSprite.sclX = trackerSprite.texture.sizeX * (sizeCoefficient * 2); trackerSprite.sclY = trackerSprite.texture.sizeX * (sizeCoefficient * 2); trackerSprite.x = trackerCoordX; trackerSprite.y = trackerCoordY; AssignTextureToScreen(trackerSprite.texture); trackerSprite.AttachTo(minimapSprite, true); zoomin = false; trackerZoomin = false; // attach the planet marker sprite if it should be showing now switch(targetPlanet) { case 3: PlanetMarkerSpawn(-1.9125f, 1.55f, 0.365f); break; case 4: PlanetMarkerSpawn(1.315f, -0.25f, 0.6f); break; default: break; } } if (trackerCoordY < -2.508) { trackerCoordX = (trackerCoordX * 0.1262f); trackerCoordY = (trackerCoordY * 0.1262f); sprMan.RemoveSprite(minimapSprite); minimapSprite = sprMan.AddOverlaySprite("minimapzoomout.png"); minimapSprite.sclX = minimapSprite.texture.sizeX * 0.0158f; minimapSprite.sclY = minimapSprite.texture.sizeY * 0.0162f; minimapSprite.x = -16.725f; minimapSprite.y = -13.075f; AssignTextureToScreen(minimapSprite.texture); sprMan.RemoveSprite(trackerSprite); trackerSprite = sprMan.AddOverlaySprite("default.bmp"); trackerSprite.sclX = trackerSprite.texture.sizeX * (sizeCoefficient * 2); trackerSprite.sclY = trackerSprite.texture.sizeX * (sizeCoefficient * 2); trackerSprite.x = trackerCoordX; trackerSprite.y = trackerCoordY; AssignTextureToScreen(trackerSprite.texture); trackerSprite.AttachTo(minimapSprite, true); zoomin = false; trackerZoomin = false; // attach the planet marker sprite if it should be showing now switch(targetPlanet) { case 3: PlanetMarkerSpawn(-1.9125f, 1.55f, 0.365f); break; case 4: PlanetMarkerSpawn(1.315f, -0.25f, 0.6f); break; default: break; } } } #endregion #region map is zoomed out and ship is within inner system if (zoomin == false && trackerZoomin == true && sublightOnly == false) { if (trackerCoordX > 0.41015) { sprMan.RemoveSprite(trackerSprite); trackerSprite = sprMan.AddOverlaySprite("default.bmp"); trackerSprite.sclX = trackerSprite.texture.sizeX * (sizeCoefficient * 2); trackerSprite.sclY = trackerSprite.texture.sizeX * (sizeCoefficient * 2); trackerSprite.x = trackerCoordX; trackerSprite.y = trackerCoordY; AssignTextureToScreen(trackerSprite.texture); trackerSprite.AttachTo(minimapSprite, true); trackerZoomin = false; } if (trackerCoordX < -0.41015) { sprMan.RemoveSprite(trackerSprite); trackerSprite = sprMan.AddOverlaySprite("default.bmp"); trackerSprite.sclX = trackerSprite.texture.sizeX * (sizeCoefficient * 2); trackerSprite.sclY = trackerSprite.texture.sizeX * (sizeCoefficient * 2); trackerSprite.x = trackerCoordX; trackerSprite.y = trackerCoordY; AssignTextureToScreen(trackerSprite.texture); trackerSprite.AttachTo(minimapSprite, true); trackerZoomin = false; } if (trackerCoordY > 0.316572) { sprMan.RemoveSprite(trackerSprite); trackerSprite = sprMan.AddOverlaySprite("default.bmp"); trackerSprite.sclX = trackerSprite.texture.sizeX * (sizeCoefficient * 2); trackerSprite.sclY = trackerSprite.texture.sizeX * (sizeCoefficient * 2); trackerSprite.x = trackerCoordX; trackerSprite.y = trackerCoordY; AssignTextureToScreen(trackerSprite.texture); trackerSprite.AttachTo(minimapSprite, true); trackerZoomin = false; } if (trackerCoordY < -0.316572) { sprMan.RemoveSprite(trackerSprite); trackerSprite = sprMan.AddOverlaySprite("default.bmp"); trackerSprite.sclX = trackerSprite.texture.sizeX * (sizeCoefficient * 2); trackerSprite.sclY = trackerSprite.texture.sizeX * (sizeCoefficient * 2); trackerSprite.x = trackerCoordX; trackerSprite.y = trackerCoordY; AssignTextureToScreen(trackerSprite.texture); trackerSprite.AttachTo(minimapSprite, true); trackerZoomin = false; } } #endregion #region map is zoomed in and ship is within outer system if (zoomin == true && trackerZoomin == false && sublightOnly == false) { if (trackerCoordX > 3.25) trackerCoordX = 3.25f; if (trackerCoordX < -3.25) trackerCoordX = -3.25f; if (trackerCoordY > 2.508) trackerCoordY = 2.508f; if (trackerCoordY < -2.65) trackerCoordY = -2.65f; if (trackerCoordX > -0.41015 && trackerCoordX < 0.41015 && trackerCoordY < 0.316572 && trackerCoordY > -0.316572) { trackerCoordX = (trackerCoordX / 0.1262f); trackerCoordY = (trackerCoordY / 0.1262f); trackerSprite = sprMan.AddOverlaySprite("default.bmp"); trackerSprite.sclX = trackerSprite.texture.sizeX * (sizeCoefficient * 2); trackerSprite.sclY = trackerSprite.texture.sizeX * (sizeCoefficient * 2); trackerSprite.x = trackerCoordX; trackerSprite.y = trackerCoordY; AssignTextureToScreen(trackerSprite.texture); trackerSprite.AttachTo(minimapSprite, true); trackerZoomin = true; } } #endregion #region map is zoomed out and ship is within outer system if (zoomin == false && trackerZoomin == false && sublightOnly == false) { if (trackerCoordX > 3.25) trackerCoordX = 3.25f; if (trackerCoordX < -3.25) trackerCoordX = -3.25f; if (trackerCoordY > 2.508) trackerCoordY = 2.508f; if (trackerCoordY < -2.65) trackerCoordY = -2.65f; if (trackerCoordX > -0.41015 && trackerCoordX < 0.41015 && trackerCoordY < 0.316572 && trackerCoordY > -0.316572) { trackerCoordX = (trackerCoordX / 0.1262f); trackerCoordY = (trackerCoordY / 0.1262f); sprMan.RemoveSprite(minimapSprite); minimapSprite = sprMan.AddOverlaySprite("minimapzoomin.png"); minimapSprite.sclX = minimapSprite.texture.sizeX * 0.0158f; minimapSprite.sclY = minimapSprite.texture.sizeY * 0.0162f; minimapSprite.x = -16.725f; minimapSprite.y = -13.075f; AssignTextureToScreen(minimapSprite.texture); sprMan.RemoveSprite(trackerSprite); trackerSprite = sprMan.AddOverlaySprite("default.bmp"); trackerSprite.sclX = trackerSprite.texture.sizeX * (sizeCoefficient * 2); trackerSprite.sclY = trackerSprite.texture.sizeX * (sizeCoefficient * 2); trackerSprite.x = trackerCoordX; trackerSprite.y = trackerCoordY; AssignTextureToScreen(trackerSprite.texture); trackerSprite.AttachTo(minimapSprite, true); zoomin = true; trackerZoomin = true; // attach the planet marker sprite if it should be showing now switch(targetPlanet) { case 1: PlanetMarkerSpawn(-1.9125f, 1.55f, 0.365f); break; case 2: PlanetMarkerSpawn(1.315f, -0.25f, 0.6f); break; default: break; } } } #endregion #endregion #region functions for entering system map and movement within #region calculates distances between the tracker and selected object // calculates the distance between the tracker and the selected // destination if (sublightOnly == false && trackerZoomin == true) { switch (targetPlanet) { case 1: trackerDistance = (Math.Abs(trackerCoordX + 1.9125f) + Math.Abs(trackerCoordY - 1.55f)); break; case 2: trackerDistance = (Math.Abs(trackerCoordX - 1.315f) + Math.Abs(trackerCoordY + 0.25f)); break; default: break; } } if (sublightOnly == false && trackerZoomin == false) { switch (targetPlanet) { case 3: trackerDistance = (Math.Abs(trackerCoordX + 1.9125f) + Math.Abs(trackerCoordY - 1.55f)); break; case 4: trackerDistance = (Math.Abs(trackerCoordX - 1.315f) + Math.Abs(trackerCoordY + 0.25f)); break; default: break; } } #endregion #region enter the system map and load all objects within // detection of planet collision and prompt to enter planetary system map if (trackerDistance < 0.25 && targetPlanet > 0 && sublightOnly == false) { if (trackerZoomin == true && targetPlanet < 3 || trackerZoomin == false && targetPlanet > 2) { // when the tracker is close enough to a planet, run the functions // for dropping out of warp, as well as load the new map plus any // planets moons that are now within view sublightOnly = true; warping = false; autoPilot = false; stopped = false; turnTimer = 0; sprMan.RemoveSprite(warpbackgroundSprite); sprMan.RemoveSprite(minimapSprite); sprMan.RemoveSprite(trackerSprite); sprMan.RemoveSprite(planetmarkerSprite); minimapSprite = sprMan.AddOverlaySprite("systemmap.png"); minimapSprite.sclX = minimapSprite.texture.sizeX * 0.0158f; minimapSprite.sclY = minimapSprite.texture.sizeY * 0.0162f; minimapSprite.x = -16.725f; minimapSprite.y = -13.075f; AssignTextureToScreen(minimapSprite.texture); trackerSprite = sprMan.AddOverlaySprite("default.bmp"); trackerSprite.sclX = trackerSprite.texture.sizeX * (sizeCoefficient * 2); trackerSprite.sclY = trackerSprite.texture.sizeX * (sizeCoefficient * 2); trackerSprite.AttachTo(minimapSprite, true); AssignTextureToScreen(trackerSprite.texture); switch(targetPlanet) { case 1: trackerCoordX = (trackerCoordX + 1.9125f) * 10; trackerCoordY = (trackerCoordY - 1.55f) * 10; break; case 2: trackerCoordX = (trackerCoordX - 1.315f) * 10; trackerCoordY = (trackerCoordY + 0.25f) * 10; break; case 3: trackerCoordX = (trackerCoordX + 1.9125f) * 10; trackerCoordY = (trackerCoordY - 1.55f) * 10; break; case 4: trackerCoordX = (trackerCoordX - 1.315f) * 10; trackerCoordY = (trackerCoordY + 0.25f) * 10; break; default: break; } planet1Sprite = sprMan.AddSprite("defaultcircle.png"); planet1Sprite.sclX *= 4.0f; planet1Sprite.sclY *= 4.0f; planet1Sprite.x = (trackerCoordX * -25.1f) + 1.255f; planet1Sprite.y = (trackerCoordY * -25.1f) + 3.245f; planet1Sprite.colorOperation = Microsoft.DirectX.Direct3D.TextureOperation.SelectArg2; planet1Sprite.tintGreen = 0; planet1Sprite.tintRed = 255; AssignTextureToScreen(planet1Sprite.texture); planet1Moon1Sprite = sprMan.AddSprite("defaultcircle.png"); planet1Moon1Sprite.sclX *= 1.745f; planet1Moon1Sprite.sclY *= 1.745f; planet1Moon1Sprite.x = (trackerCoordX * -25.1f) - 42.25f; planet1Moon1Sprite.y = (trackerCoordY * -25.1f) - 1.8f; planet1Moon1Sprite.colorOperation = Microsoft.DirectX.Direct3D.TextureOperation.SelectArg2; planet1Moon1Sprite.tintGreen = 0; planet1Moon1Sprite.tintRed = 255; AssignTextureToScreen(planet1Moon1Sprite.texture); planet1Moon2Sprite = sprMan.AddSprite("defaultcircle.png"); planet1Moon2Sprite.sclX *= 1.745f; planet1Moon2Sprite.sclY *= 1.745f; planet1Moon2Sprite.x = (trackerCoordX * -25.1f) + 21.0f; planet1Moon2Sprite.y = (trackerCoordY * -25.1f) + 29.5f; planet1Moon2Sprite.colorOperation = Microsoft.DirectX.Direct3D.TextureOperation.SelectArg2; planet1Moon2Sprite.tintGreen = 0; planet1Moon2Sprite.tintRed = 255; AssignTextureToScreen(planet1Moon2Sprite.texture); playerNavAngle = playerSprite.rotZ; sprMan.RemoveSprite(playerSprite); playerSprite = sprMan.AddSprite("ship.png"); playerSprite.sclX = playerSprite.texture.sizeX * sizeCoefficient; playerSprite.sclY = playerSprite.texture.sizeY * sizeCoefficient; playerSprite.y = 4.25f; playerSprite.rotZ = (float)playerNavAngle; AssignTextureToScreen(playerSprite.texture); playerXmov = 0.0f; playerYmov = 0.0f; currentPlanet = targetPlanet; targetPlanet = 0; // reloads 150 default dust particles for (int i = 0; i < 150; i++) { spawnCoordX = (float)random.Next( -200, 200 )/10; spawnCoordY = (float)random.Next( -180, 180 )/10; spawnCount += 1; dustSprite = sprMan.AddParticle("dust.bmp"); dustSprite.sclX = dustSprite.texture.sizeX * sizeCoefficient; dustSprite.sclY = dustSprite.texture.sizeY * sizeCoefficient; dustSprite.x = spawnCoordX; dustSprite.y = spawnCoordY; AssignTextureToScreen(dustSprite.texture); dustSprite.rotZ = (float)random.Next( -200, 200 )/10; dustSprite.customFunctions += new customFunction(ParticleControl); } // closes the viewscreen map if it's already open if (viewrodlSprite.y == -2.25) { lowering = true; viewscreenButtonLight.colorOperation = Microsoft.DirectX.Direct3D.TextureOperation.SelectArg2; viewscreenButtonLight.tintGreen = 0; viewscreenButtonLight.tintRed = 255; } } } #endregion #region manage movement and collisions of all objects // if in a planetary map instead of the system map, regular movement // causes the minimap tracker and the planets/moons to move if (sublightOnly == true) { trackerCoordX += (float)playerXmov/50 * TimeManager.secondDifference; trackerCoordY += (float)playerYmov/50 * TimeManager.secondDifference; if (borderCollisionX == false) { planet1Sprite.x -= (float)playerXmov/2 * TimeManager.secondDifference; planet1Moon1Sprite.x -= (float)playerXmov/2 * TimeManager.secondDifference; planet1Moon2Sprite.x -= (float)playerXmov/2 * TimeManager.secondDifference; } if (borderCollisionY == false) { planet1Sprite.y -= (float)playerYmov/2 * TimeManager.secondDifference; planet1Moon1Sprite.y -= (float)playerYmov/2 * TimeManager.secondDifference; planet1Moon2Sprite.y -= (float)playerYmov/2 * TimeManager.secondDifference; } // simulates gravity from the planet and moons and pulls the player // towards them if (speed < 12 && inpMan.KeyDown(Key.Space) == false) { planet1Xdiff = planet1Sprite.x - playerSprite.x; planet1Ydiff = planet1Sprite.y - playerSprite.y; planet1Angle = Math.Atan2(planet1Ydiff, planet1Xdiff); playerXmov += (0.1 / Math.Abs(playerSprite.x - planet1Sprite.x))*(Math.Cos(planet1Angle)); playerYmov += (0.1 / Math.Abs(playerSprite.y - planet1Sprite.y))*(Math.Sin(planet1Angle)); planet1Moon1Xdiff = planet1Sprite.x - playerSprite.x; planet1Moon1Ydiff = planet1Sprite.y - playerSprite.y; planet1Moon1Angle = Math.Atan2(planet1Moon1Ydiff, planet1Moon1Xdiff); playerXmov += (0.05 / Math.Abs(playerSprite.x - planet1Sprite.x))*(Math.Cos(planet1Moon1Angle)); playerYmov += (0.05 / Math.Abs(playerSprite.y - planet1Sprite.y))*(Math.Sin(planet1Moon1Angle)); planet1Moon2Xdiff = planet1Sprite.x - playerSprite.x; planet1Moon2Ydiff = planet1Sprite.y - playerSprite.y; planet1Moon2Angle = Math.Atan2(planet1Moon2Ydiff, planet1Moon2Xdiff); playerXmov += (0.05 / Math.Abs(playerSprite.x - planet1Sprite.x))*(Math.Cos(planet1Moon2Angle)); playerYmov += (0.05 / Math.Abs(playerSprite.y - planet1Sprite.y))*(Math.Sin(planet1Moon2Angle)); } else { // keeps speed under 12 so direction doesn't become locked playerXmov *= 0.995; playerYmov *= 0.995; } // detects if ship itself collides with a planet or moon and reverse // the ships direction if (Collisions.circleCollision(planet1Sprite, playerSprite)) { if (targetPlanet == 1) { IsActivityFinished = true; NextScreen = "GameName.Screens.PlanetScreen"; } } else if (Collisions.circleCollision(planet1Moon1Sprite, playerSprite)) { if (targetPlanet == 2) { IsActivityFinished = true; NextScreen = "GameName.Screens.PlanetScreen"; } } else if (Collisions.circleCollision(planet1Moon2Sprite, playerSprite)) { if (targetPlanet == 3) { IsActivityFinished = true; NextScreen = "GameName.Screens.PlanetScreen"; } } // keeps tracker within the minimap borders, and keeps the planets // from moving any further if the tracker moves against these borders if (trackerCoordX > 3.25) { trackerCoordX = 3.25f; borderCollisionX = true; } else if (trackerCoordX < -3.25) { trackerCoordX = -3.25f; borderCollisionX = true; } else { borderCollisionX = false; } if (trackerCoordY > 2.508) { trackerCoordY = 2.508f; borderCollisionY = true; } else if (trackerCoordY < -2.65) { trackerCoordY = -2.65f; borderCollisionY = true; } else { borderCollisionY = false; } } #endregion #endregion #endregion #region autopilot functions #region autopilot activation and rotation if (inpMan.KeyDown(Key.Q) && warping == false && sublightOnly == false) { turnTimer = 0; autoPilot = true; } // stops the ship first before performing any turning if (autoPilot == true && stopped == false) { playerXmov *= 0.98; playerYmov *= 0.98; if (speed < 0.2) { // come to full stop playerXmov = 0; playerYmov = 0; stopped = true; } } // automates all movement from here on out, unless player wrests control with // the use of any movement control if (trackerZoomin == true && stopped == true && sublightOnly == false) { // determines which planet is selected and point the ship towards it switch (targetPlanet) { case 1: playerXdiff = -1.9125f - trackerCoordX; playerYdiff = 1.55f - trackerCoordY; playerNavAngle = Math.Atan2(playerYdiff, playerXdiff); angleToRotate = CommonFunctions.AngleToAngle(playerSprite.rotZ, (float)playerNavAngle); secondsToTake = Math.Abs(angleToRotate / 5.0f); if (turnTimer == 0) { turnTimer = secondsToTake; turnTime = TimeManager.currentTick; } FRB.Instructions.InstructionManager.RotateSpriteToAccurate ( playerSprite, 0, 0, (float)playerNavAngle, secondsToTake); break; case 2: playerXdiff = 1.315f - trackerCoordX; playerYdiff = -0.25f - trackerCoordY; playerNavAngle = Math.Atan2(playerYdiff, playerXdiff); angleToRotate = CommonFunctions.AngleToAngle(playerSprite.rotZ, (float)playerNavAngle); secondsToTake = Math.Abs(angleToRotate / 5.0f); if (turnTimer == 0) { turnTimer = secondsToTake; turnTime = TimeManager.currentTick; } FRB.Instructions.InstructionManager.RotateSpriteToAccurate ( playerSprite, 0, 0, (float)playerNavAngle, secondsToTake); break; case 3: playerXdiff = (-1.9125f / 0.1262f) - trackerCoordX; playerYdiff = (1.55f / 0.1262f) - trackerCoordY; playerNavAngle = Math.Atan2(playerYdiff, playerXdiff); angleToRotate = CommonFunctions.AngleToAngle(playerSprite.rotZ, (float)playerNavAngle); secondsToTake = Math.Abs(angleToRotate / 5.0f); if (turnTimer == 0) { turnTimer = secondsToTake; turnTime = TimeManager.currentTick; } FRB.Instructions.InstructionManager.RotateSpriteToAccurate ( playerSprite, 0, 0, (float)playerNavAngle, secondsToTake); break; case 4: playerXdiff = (1.315f / 0.1262f) - trackerCoordX; playerYdiff = (-0.25f / 0.1262f) - trackerCoordY; playerNavAngle = Math.Atan2(playerYdiff, playerXdiff); angleToRotate = CommonFunctions.AngleToAngle(playerSprite.rotZ, (float)playerNavAngle); secondsToTake = Math.Abs(angleToRotate / 5.0f); if (turnTimer == 0) { turnTimer = secondsToTake; turnTime = TimeManager.currentTick; } FRB.Instructions.InstructionManager.RotateSpriteToAccurate ( playerSprite, 0, 0, (float)playerNavAngle, secondsToTake); break; default: break; } } if (trackerZoomin == false && stopped == true && sublightOnly == false) { switch (targetPlanet) { case 1: playerXdiff = (-1.9125f * 0.1262f) - trackerCoordX; playerYdiff = (1.55f * 0.1262f) - trackerCoordY; playerNavAngle = Math.Atan2(playerYdiff, playerXdiff); angleToRotate = CommonFunctions.AngleToAngle(playerSprite.rotZ, (float)playerNavAngle); secondsToTake = Math.Abs(angleToRotate / 5.0f); if (turnTimer == 0) { turnTimer = secondsToTake; turnTime = TimeManager.currentTick; } FRB.Instructions.InstructionManager.RotateSpriteToAccurate ( playerSprite, 0, 0, (float)playerNavAngle, secondsToTake); break; case 2: playerXdiff = (1.315f * 0.1262f) - trackerCoordX; playerYdiff = (-0.25f * 0.1262f) - trackerCoordY; playerNavAngle = Math.Atan2(playerYdiff, playerXdiff); angleToRotate = CommonFunctions.AngleToAngle(playerSprite.rotZ, (float)playerNavAngle); secondsToTake = Math.Abs(angleToRotate / 5.0f); if (turnTimer == 0) { turnTimer = secondsToTake; turnTime = TimeManager.currentTick; } FRB.Instructions.InstructionManager.RotateSpriteToAccurate ( playerSprite, 0, 0, (float)playerNavAngle, secondsToTake); break; case 3: playerXdiff = -1.9125f - trackerCoordX; playerYdiff = 1.55f - trackerCoordY; playerNavAngle = Math.Atan2(playerYdiff, playerXdiff); angleToRotate = CommonFunctions.AngleToAngle(playerSprite.rotZ, (float)playerNavAngle); secondsToTake = Math.Abs(angleToRotate / 5.0f); if (turnTimer == 0) { turnTimer = secondsToTake; turnTime = TimeManager.currentTick; } FRB.Instructions.InstructionManager.RotateSpriteToAccurate ( playerSprite, 0, 0, (float)playerNavAngle, secondsToTake); break; case 4: playerXdiff = 1.315f - trackerCoordX; playerYdiff = -0.25f - trackerCoordY; playerNavAngle = Math.Atan2(playerYdiff, playerXdiff); angleToRotate = CommonFunctions.AngleToAngle(playerSprite.rotZ, (float)playerNavAngle); secondsToTake = Math.Abs(angleToRotate / 5.0f); if (turnTimer == 0) { turnTimer = secondsToTake; turnTime = TimeManager.currentTick; } FRB.Instructions.InstructionManager.RotateSpriteToAccurate ( playerSprite, 0, 0, (float)playerNavAngle, secondsToTake); break; default: break; } } #endregion #region auto movement of ship and warping functions if (autoPilot == true && stopped == true && targetPlanet > 0) { // autopilot warping uses the same functions as normal movement and warping if (warping == false && TimeManager.SecondsSince(turnTime) >= turnTimer) { if (speed < 12) { // increments the x and y vectors based on ships current angle playerXmov += (float)0.08f*(Math.Cos(playerSprite.rotZ)); playerYmov += (float)0.08f*(Math.Sin(playerSprite.rotZ)); } else { // keeps speed under 12 so direction doesn't become locked playerXmov *= 0.995; playerYmov *= 0.995; } } // warp meter is full and warp is engaged, change backround and begin loading particles if (warpmeterSprite.y > -13.5 && warping == false && sublightOnly == false) { autoPilot = false; stopped = false; warping = true; warpCount = 0; warpTimer = TimeManager.currentTick; warpbackgroundSprite = sprMan.AddUnorderedSprite("warpbackground.bmp"); warpbackgroundSprite.sclX = warpbackgroundSprite.texture.sizeX * 0.0162f; warpbackgroundSprite.sclY = warpbackgroundSprite.texture.sizeY * 0.0162f; // loads 50 warp particles to random positions for (int h = 0; h < 50; h++) { spawnCoordX = (float)random.Next( -200, 200 )/10; spawnCoordY = (float)random.Next( -180, 180 )/10; warpCount += 1; warpparticleSprite = sprMan.AddParticle("warpparticle.png"); warpparticleSprite.sclX = warpparticleSprite.texture.sizeX * sizeCoefficient; warpparticleSprite.sclY = warpparticleSprite.texture.sizeY * sizeCoefficient; warpparticleSprite.x = spawnCoordX; warpparticleSprite.y = spawnCoordY; warpparticleSprite.rotZ = playerSprite.rotZ; warpparticleSprite.customFunctions += new customFunction(WarpParticleControl); } } if (speed > 11.5 && Math.Abs(angleDifference) < 2*Math.PI*.025f && sublightOnly == false) { if (warpmeterSprite.y < -13.5) { warpmeterSprite.y += 5 * TimeManager.secondDifference; } } } #endregion #endregion textMan.RemoveText(debugText1); debugText1 = textMan.AddText(playerXmov.ToString()); } public override void Destroy() { base.Destroy(); } // controls all dust particles for movement and destruction public void ParticleControl(Sprite sprite, SpriteManager sprMan) { // move dust based on the current values for the ships speed sprite.x -= ((float)playerXmov * ((sprite.rotZ/10)+1)) * TimeManager.secondDifference; sprite.y -= ((float)playerYmov * ((sprite.rotZ/10)+1)) * TimeManager.secondDifference; // removes dust particles if they touch a screen border, or if warp is active if(sprite.x > 22) { sprMan.RemoveSprite(sprite); spawnCount--; } if(sprite.x < -22) { sprMan.RemoveSprite(sprite); spawnCount--; } if(sprite.y > 18) { sprMan.RemoveSprite(sprite); spawnCount--; } if(sprite.y < -18) { sprMan.RemoveSprite(sprite); spawnCount--; } if (warping == true) { sprMan.RemoveSprite(sprite); spawnCount = 0; } } // controls all warp particles for movement and destruction public void WarpParticleControl(Sprite sprite, SpriteManager sprMan) { // moves particles based on a set speed, usually ship speed when entering // warp sprite.x -= ((float)playerXmov * 6) * TimeManager.secondDifference; sprite.y -= ((float)playerYmov * 6) * TimeManager.secondDifference; // removes warp particles if they touch a screen border, or if warp is // deactivated if(sprite.x > 22) { sprMan.RemoveSprite(sprite); warpCount--; } if(sprite.x < -22) { sprMan.RemoveSprite(sprite); warpCount--; } if(sprite.y > 18) { sprMan.RemoveSprite(sprite); warpCount--; } if(sprite.y < -18) { sprMan.RemoveSprite(sprite); warpCount--; } if (warping == false) { sprMan.RemoveSprite(sprite); warpCount = 0; } } // controls the viewscreen once opened public void ViewscreenControl(Sprite sprite, SpriteManager sprMan) { #region cause viewscreen to open up at moment of creation // once rods are raised the viewscreen is attached and this function starts // to run, first it stretches it out along the X axis, and then the Y, once // done "raised" is set to true and the next steps are executed if (raised == false) { if (sprite.sclX < 36) sprite.sclX += 150 * TimeManager.secondDifference; else sprite.sclX = 36; if (sprite.sclX == 36 && sprite.sclY < 36) sprite.sclY += 150 * TimeManager.secondDifference; else if (sprite.sclY > 36) { sprite.sclY = 36; raised = true; } } #endregion #region load all of the invisible clickable buttons onto the viewscreen // buttons for the system map view if (viewbuttonsloaded == false && raised == true && sublightOnly == false) { planetButton1 = sprMan.AddOverlaySprite("defaultcircle.png"); planetButton1.sclX = 2.05f; planetButton1.sclY = 2.05f; planetButton1.x = -13.9f; planetButton1.y = 9.65f; planetButton1.fade = 255; AssignTextureToScreen(planetButton1.texture); planetButton2 = sprMan.AddOverlaySprite("defaultcircle.png"); planetButton2.sclX = 2.45f; planetButton2.sclY = 2.45f; planetButton2.x = -4.55f; planetButton2.y = 1.225f; planetButton2.fade = 255; AssignTextureToScreen(planetButton2.texture); planetButton3 = sprMan.AddOverlaySprite("defaultcircle.png"); planetButton3.sclX = 1.95f; planetButton3.sclY = 1.95f; planetButton3.x = 5.75f; planetButton3.y = 9.75f; planetButton3.fade = 255; AssignTextureToScreen(planetButton3.texture); planetButton4 = sprMan.AddOverlaySprite("defaultcircle.png"); planetButton4.sclX = 1.45f; planetButton4.sclY = 1.45f; planetButton4.x = 12.1f; planetButton4.y = 0.425f; planetButton4.fade = 255; AssignTextureToScreen(planetButton4.texture); viewbuttonsloaded = true; } // buttons for the planetary map view if (viewbuttonsloaded == false && raised == true && sublightOnly == true) { planetButton1 = sprMan.AddOverlaySprite("defaultcircle.png"); planetButton1.sclX = 2.75f; planetButton1.sclY = 2.75f; planetButton1.x = 1.25f; planetButton1.y = 4.0f; planetButton1.fade = 255; AssignTextureToScreen(planetButton1.texture); planetButton2 = sprMan.AddOverlaySprite("defaultcircle.png"); planetButton2.sclX = 1.2f; planetButton2.sclY = 1.2f; planetButton2.x = -9.3f; planetButton2.y = 2.0f; planetButton2.fade = 255; AssignTextureToScreen(planetButton2.texture); planetButton3 = sprMan.AddOverlaySprite("defaultcircle.png"); planetButton3.sclX = 1.0f; planetButton3.sclY = 1.0f; planetButton3.x = 5.8f; planetButton3.y = 9.0f; planetButton3.fade = 255; AssignTextureToScreen(planetButton3.texture); viewbuttonsloaded = true; } #endregion #region functions for clicking planet buttons and setting destinations // once buttons are loaded clicking them stops autopilot if it's active, // and sets the target planet, marking it on the minimap(located in the // minimap region) if (viewbuttonsloaded == true && sublightOnly == false) { if (inpMan.KeyDown(Key.D1)) { targetPlanet = 1; playerSprite.ClearInstructions(); autoPilot = false; stopped = false; turnTimer = 0; sprMan.RemoveSprite(planetmarkerSprite); if (zoomin == true) { PlanetMarkerSpawn( -1.9125f, 1.55f, 0.365f); } } if (inpMan.KeyDown(Key.D2)) { targetPlanet = 2; playerSprite.ClearInstructions(); autoPilot = false; stopped = false; turnTimer = 0; sprMan.RemoveSprite(planetmarkerSprite); if (zoomin == true) { PlanetMarkerSpawn( 1.315f, -0.25f, 0.6f); } } if (inpMan.KeyDown(Key.D3)) { targetPlanet = 3; playerSprite.ClearInstructions(); autoPilot = false; stopped = false; turnTimer = 0; sprMan.RemoveSprite(planetmarkerSprite); if (zoomin == false) { PlanetMarkerSpawn( -1.9125f, 1.55f, 0.365f); } } if (inpMan.KeyDown(Key.D4)) { targetPlanet = 4; playerSprite.ClearInstructions(); autoPilot = false; stopped = false; turnTimer = 0; sprMan.RemoveSprite(planetmarkerSprite); if (zoomin == false) { PlanetMarkerSpawn( 1.315f, -0.25f, 0.6f); } } if(cursor.primaryDown) { if (cursor.IsOn(planetButton1)) { targetPlanet = 1; playerSprite.ClearInstructions(); autoPilot = false; stopped = false; turnTimer = 0; sprMan.RemoveSprite(planetmarkerSprite); if (zoomin == true) { PlanetMarkerSpawn( -1.9125f, 1.55f, 0.365f); } } if (cursor.IsOn(planetButton2)) { targetPlanet = 2; playerSprite.ClearInstructions(); autoPilot = false; stopped = false; turnTimer = 0; sprMan.RemoveSprite(planetmarkerSprite); if (zoomin == true) { PlanetMarkerSpawn( 1.315f, -0.25f, 0.6f); } } if (cursor.IsOn(planetButton3)) { targetPlanet = 3; playerSprite.ClearInstructions(); autoPilot = false; stopped = false; turnTimer = 0; sprMan.RemoveSprite(planetmarkerSprite); if (zoomin == false) { PlanetMarkerSpawn( -1.9125f, 1.55f, 0.365f); } } if (cursor.IsOn(planetButton4)) { targetPlanet = 4; playerSprite.ClearInstructions(); autoPilot = false; stopped = false; turnTimer = 0; sprMan.RemoveSprite(planetmarkerSprite); if (zoomin == false) { PlanetMarkerSpawn( 1.315f, -0.25f, 0.6f); } } } } // does the same as the above only in the planetary system map screen if (viewbuttonsloaded == true && sublightOnly == true) { if (inpMan.KeyDown(Key.D1)) { playerSprite.ClearInstructions(); autoPilot = false; stopped = false; turnTimer = 0; targetPlanet = 1; PlanetMarkerSpawn( 0.05f, -0.05f, 0.605f); } if (inpMan.KeyDown(Key.D2)) { playerSprite.ClearInstructions(); autoPilot = false; stopped = false; turnTimer = 0; targetPlanet = 2; PlanetMarkerSpawn( -1.685f, -0.252f, 0.2f); } if (inpMan.KeyDown(Key.D3)) { playerSprite.ClearInstructions(); autoPilot = false; stopped = false; turnTimer = 0; targetPlanet = 3; PlanetMarkerSpawn( 0.85f, 1.01f, 0.2f); } if(cursor.primaryDown) { if (cursor.IsOn(planetButton1)) { playerSprite.ClearInstructions(); autoPilot = false; stopped = false; turnTimer = 0; targetPlanet = 1; PlanetMarkerSpawn( 0.05f, -0.05f, 0.605f); } if (cursor.IsOn(planetButton2)) { playerSprite.ClearInstructions(); autoPilot = false; stopped = false; turnTimer = 0; targetPlanet = 2; PlanetMarkerSpawn( -1.685f, -0.252f, 0.2f); } if (cursor.IsOn(planetButton3)) { playerSprite.ClearInstructions(); autoPilot = false; stopped = false; turnTimer = 0; targetPlanet = 3; PlanetMarkerSpawn( 0.85f, 1.01f, 0.2f); } } } #endregion #region functions for removing everything and closing the viewscreen when prompted if (lowering == true) { sprMan.RemoveSprite(planetButton1); sprMan.RemoveSprite(planetButton2); sprMan.RemoveSprite(planetButton3); sprMan.RemoveSprite(planetButton4); if (viewscreenSprite.sclY > 0.1) viewscreenSprite.sclY -= 150 * TimeManager.secondDifference; else viewscreenSprite.sclY = 0.09f; if (viewscreenSprite.sclY < 0.1 && viewscreenSprite.sclX > 0.1) viewscreenSprite.sclX -= 150 * TimeManager.secondDifference; else if (viewscreenSprite.sclX < 0.1) { viewscreenSprite.sclX = 0.1f; raised = false; lowering = false; viewbuttonsloaded = false; viewrodlSprite.yVelocity = -90; sprMan.RemoveSprite(sprite); } } #endregion } // respawns the planet market sprite during minimap transitions public void PlanetMarkerSpawn(float x, float y, float scl) { sprMan.RemoveSprite(planetmarkerSprite); planetmarkerSprite = sprMan.AddOverlaySprite("defaultcircle.png"); planetmarkerSprite.sclX = scl; planetmarkerSprite.sclY = scl; planetmarkerSprite.AttachTo(minimapSprite, true); AssignTextureToScreen(planetmarkerSprite.texture); planetmarkerSprite.relX = x; planetmarkerSprite.relY = y; planetmarkerSprite.fade = 50; } } }