using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Otter; using _1869_Remake; using _1869_Remake.Entities; namespace _1869_Remake.Scenes { public class worldMap : Scene { // Imageobjekte mit der Weltkarte Bildschirmen public Image Frame = new Image(Assets.MAINSCREEN_FRAME); public Image Welt; public Image FadeInBlackScreen = new Image(Assets.BLACKSCREEN); public Image FadeOutBlackScreen = new Image(Assets.BLACKSCREEN); //Background Animation AnimatingEntity BackgroundMeer = new AnimatingEntity(0, 0); //FadeOutVariablen (Parameter sind für externe FadeOutTrigger private bool FadeOut; private string FadeOutZiel; private string FadeOutZiel_Param1; // Icons unten rechts im Bild public Image Coin = new Image(Assets.ICON_COIN); public Image Coin_clicked = new Image(Assets.ICON_COIN_CLICKED); public Image Anker = new Image(Assets.ICON_ANKER); public Image Anker_clicked = new Image(Assets.ICON_ANKER_CLICKED); public Image Buch = new Image(Assets.ICON_BUCH); public Image Buch_clicked = new Image(Assets.ICON_BUCH_CLICKED); public Image GeldSack = new Image(Assets.ICON_GELDSACK); public Image GeldSack_clicked = new Image(Assets.ICON_GELDSACK_CLICKED); public Image SchiffsController = new Image(Assets.SCHIFFSCONTROLLER); public Text SpielerLabel; //AnzeigeTimer aktuell nur für warten vor dem 1. Firmenanzeigen (später direkt nach tween aber definiert durch nächsten aktions knoten[Zeitweel]) public const float TIMER_GRENZE = 90f; public float szenenTimer = 0f; //Indikator für reload der Icons public bool miniIconsGesetzt = false; //Zeitrad ZeitRad EventRad; //Alle aktuell im Screen angezeigten Elemente List aktiveHäfen = new List(); List aktiveKnoten = new List(); List aktiveSeeStraßen = new List(); //Schlange aller gewählten Meeresknote => Das ist die Routenauswahl Queue SeeRoute = new Queue(); //Um zu verhindern dass mehrere Subelemente aktiv sind public bool SubElementAktiv = false; public worldMap() { Globals.aktuelleSzene = "Main"; //Initialisieren des Hauptbildschirms und einblenden switch (Globals.weltKarte) { case "EUROPA": Welt = new Image(Assets.WELT_EUROPA); break; case "AMERIKA": break; case "AFRIKA": break; case "ASIEN": break; } //Meereshintergrund Add(BackgroundMeer); Welt.CenterOrigin(); Welt.X = Globals.Remake.HalfWidth; Welt.Y = Globals.Remake.HalfHeight; AddGraphic(Welt); Frame.CenterOrigin(); Frame.X = Globals.Remake.HalfWidth; Frame.Y = Globals.Remake.HalfHeight; AddGraphic(Frame); //Icons vorbereiten //Position ausgelotet -> nicht Relativ == Keine Änderung der Auflösung Möglich(Falls doch gewünscht muss umgedacht/umgebaut werden) // -> nochmal durchtesten //Münze = Bank/Kredite Coin.CenterOrigin(); Coin_clicked.CenterOrigin(); Coin.X = 450; Coin.Y = 442; Coin_clicked.X = 450; Coin_clicked.Y = 442; //alpha des Clicked Icons auf 0 setzen und bei Click einblenden (auf 1 setzen) Coin_clicked.Alpha = 0f; AddGraphic(Coin); AddGraphic(Coin_clicked); //Anker = Rekordzeiten Anker.CenterOrigin(); Anker_clicked.CenterOrigin(); Anker.X = 504; Anker.Y = 442; Anker_clicked.X = 504; Anker_clicked.Y = 442; Anker_clicked.Alpha = 0f; AddGraphic(Anker); AddGraphic(Anker_clicked); //Geldsack = statistiken GeldSack.CenterOrigin(); GeldSack_clicked.CenterOrigin(); GeldSack.X = 558; GeldSack.Y = 442; GeldSack_clicked.X = 558; GeldSack_clicked.Y = 442; GeldSack_clicked.Alpha = 0f; AddGraphic(GeldSack); AddGraphic(GeldSack_clicked); //Buch = Einstellungen/Optionen/SAVE-LOAD Buch.CenterOrigin(); Buch_clicked.CenterOrigin(); Buch.X = 612; Buch.Y = 442; Buch_clicked.X = 612; Buch_clicked.Y = 442; Buch_clicked.Alpha = 0f; AddGraphic(Buch); AddGraphic(Buch_clicked); //Schiffscontroller SchiffsController.CenterOrigin(); SchiffsController.X = 125; SchiffsController.Y = 275; AddGraphic(SchiffsController); //Vorbereiten des Blackscreens FadeInBlackScreen.CenterOrigin(); FadeInBlackScreen.X = Globals.Remake.HalfWidth; FadeInBlackScreen.Y = Globals.Remake.HalfHeight; FadeInBlackScreen.Alpha = 1f; FadeOutBlackScreen.CenterOrigin(); FadeOutBlackScreen.X = Globals.Remake.HalfWidth; FadeOutBlackScreen.Y = Globals.Remake.HalfHeight; FadeOutBlackScreen.Alpha = 0f; //ZeitRad Hinzufügen EventRad = new ZeitRad(true); //Draw.Rectangle(EventRad.startPosX, EventRad.startPosY, 100, 50); // Nur nächstes Event Vorladen wenn letzte Szene ConfigSzene war (Startsequenz des Spiels) if (Globals.LetzteSzene == "Config") { EventRad.nächstesDatumLaden(); } //Anzeige des Zeitrads aktivieren EventRad.anzeigeEvent(); this.Add(EventRad); //Text in der Kopfzeile zu aktuellem Spieler -> Später ergänzt durch breites Holzbrett das schnell durchs bild fliegt, kurz anhält //name Lesbar ist und wieder weg fliegt kombiniert mit wasser splash effekt zur Hintergrund überblendung //+ eben label in der kopfzeile (Damit immer klar deutlich ist wer dran ist + hot seat funktion ohne dass der Gegner sehen //kann was man getan hat und wo man gerade war) SpielerLabel = new Text(Globals.AktuellerSpieler.FIRMENNAME, Assets.FONT_AMIGA4EVER2, 18); SpielerLabel.CenterOrigin(); //Weil diese Farbe nur für dieses Label genutzt wird wird sie nich globalisiert! SpielerLabel.Color = new Color("333333"); SpielerLabel.ShadowColor = new Color("e2e2e2"); SpielerLabel.ShadowX = 2; SpielerLabel.ShadowY = 2; SpielerLabel.X = 325; SpielerLabel.Y = 12; //SpielerLabel.Alpha = 0f; AddGraphic(SpielerLabel); //Laden der Clickboxen der Städte zum aktuellen Weltbereich LadeStädte(); LadeMeeresKnoten(); LadeSeeStraßen(); //Icons laden setzeMiniIcons(); Tween(FadeInBlackScreen, new { Alpha = 0f }, 100f, 0f).Ease(Ease.BackInOut); AddGraphics(FadeInBlackScreen); } public override void Render() { base.Render(); //Reguläre Render Reihenfolge ist Scene>>Entities ... Background ist ein Entity aber einige Grafiken in der Scene müssen danach gerendert werden Draw.Graphic(Welt); Draw.Graphic(Frame); Draw.Graphic(SpielerLabel); Draw.Graphic(Coin); Draw.Graphic(Coin_clicked); Draw.Graphic(Anker); Draw.Graphic(Anker_clicked); Draw.Graphic(Buch); Draw.Graphic(Buch_clicked); Draw.Graphic(GeldSack); Draw.Graphic(SchiffsController); ZeichneStädte(); Draw.Graphic(GeldSack_clicked); Draw.Graphic(FadeInBlackScreen); Draw.Graphic(FadeOutBlackScreen); } public override void Update() { base.Update(); szenenTimer++; if (!miniIconsGesetzt) { setzeMiniIcons(); miniIconsGesetzt = true; } if (FadeOut) { if (FadeOutBlackScreen.Alpha >= 0.999f) { Globals.LetzteSzene = "Main"; miniIconsGesetzt = false; //Entitäten sind noch der Scene zugeschrieben. Wenn Szene wechselt, wird diese weggeworfen aber die Entitäten bleiben "zugeschrieben" -> erneutes zuweisen zu einer Szene klappt nicht mehr this.RemoveAll(); Scene ZielSzene = null; switch (FadeOutZiel) { case "Handel": ZielSzene = new HandelScene(FadeOutZiel_Param1); break; case "Optionen": ZielSzene = new OptionenScene(); break; case "Bank": ZielSzene = new BankScene(); break; case "Hall of Fame": ZielSzene = new HallOfFameScene(); break; case "Werft": ZielSzene = new WerftScene(FadeOutZiel_Param1); break; case "Filiale": //Anpassen// ZielSzene = new StatistikScene(); break; case "Bar": //Anpassen// ZielSzene = new BarScene(FadeOutZiel_Param1); break; case "Statistiken": ZielSzene = new StatistikScene(); break; } if (ZielSzene != null) { FadeOut = false; this.RemoveAll(); Globals.Remake.SwitchScene(ZielSzene); } else Console.WriteLine("Fehler bei Szenenwechsel in WorldMap!"); } } else { //bei jedem Tick überprüfen ob einer der Häfen einen FadeOut erwartet for (int i = 0; i < aktiveHäfen.Count(); i++) { string TempZiel; string TempParam; aktiveHäfen[i].prüfeExternerFadeOut(out TempZiel, out TempParam); // Möglichkeit für jeden potentiellen Screen gesonderte Logik für den Übergang in die neue Szene zu füllen switch (TempZiel) { case "Error": // Mögliches Fehlerhandling; Aktuell keine Handlung wenn kein Fadeout gesetzt wurde break; case "Handel": setzeFadeOut(TempZiel); FadeOutZiel_Param1 = TempParam; //wenn FadeOut initiiert -> Lösche FadeOut Marker im Hafen aktiveHäfen[i].resetFadeOut(); break; case "Werft": setzeFadeOut(TempZiel); FadeOutZiel_Param1 = TempParam; //wenn FadeOut initiiert -> Lösche FadeOut Marker im Hafen aktiveHäfen[i].resetFadeOut(); break; case "Bar": setzeFadeOut(TempZiel); FadeOutZiel_Param1 = TempParam; //wenn FadeOut initiiert -> Lösche FadeOut Marker im Hafen aktiveHäfen[i].resetFadeOut(); break; case "Filiale": setzeFadeOut(TempZiel); FadeOutZiel_Param1 = TempParam; //wenn FadeOut initiiert -> Lösche FadeOut Marker im Hafen aktiveHäfen[i].resetFadeOut(); break; } } //Click Logging für Städte Hitboxen if (Globals.PlayerSession.Controller.Button("MausLinks").Released) { Console.Clear(); Console.WriteLine("Maus X: " + this.MouseX.ToString() + " Maus Y: " + this.MouseY.ToString()); } if (Globals.PlayerSession.Controller.Button("Z").Released ) { Console.Clear(); EventRad.zeigeNächstesEventVomTyp("REISE-START"); EventRad.zeigeNächstesEventVomTyp("REISE-ANKUNFT"); } //Wenn timer abgelaufen wird Label Angezeigt -> später gegen aktuellen Spieler austauschen(bestimmt durch ZeitQueue) if (szenenTimer >= TIMER_GRENZE) { //SpielerLabel.Alpha = 1f; } //Click auf das Zeitrad verursacht anzeige des nächsten Datums if (EventRad.wurdeZeiRadGeklicked()) { //Wenn auf Zeitrad geClicked kann der aktuelle Spieler gewechselt haben //deshalb neu überprüfen, ob Fähnchen oder Schiffsicon an den Häfen gesetzt werden muss foreach (Hafen h in aktiveHäfen) { h.aktiviereFähnchen(Globals.AktuellerSpieler); //Das gleiche für Schiffe h.aktiviereSchiffsIcon(Globals.AktuellerSpieler); } //Anzeige des Zeitrads aktivieren EventRad.anzeigeEvent(); this.RemoveGraphic(SpielerLabel); SpielerLabel = new Text(Globals.AktuellerSpieler.FIRMENNAME, Assets.FONT_AMIGA4EVER2, 18); SpielerLabel.CenterOrigin(); //Weil diese Farbe nur für dieses Label genutzt wird wird sie nich globalisiert! SpielerLabel.Color = new Color("333333"); SpielerLabel.ShadowColor = new Color("e2e2e2"); SpielerLabel.ShadowX = 2; SpielerLabel.ShadowY = 2; SpielerLabel.X = 325; SpielerLabel.Y = 12; //SpielerLabel.Alpha = 0f; setzeMiniIcons(); AddGraphic(SpielerLabel); } //Click Logik für Schiffscontroller if (Util.InRect(this.MouseX, this.MouseY, SchiffsController.X - SchiffsController.HalfWidth, SchiffsController.Y - SchiffsController.HalfHeight, 150, 200) && !Globals.DisplaySubElementAktiv) { if (Globals.PlayerSession.Controller.Button("MausLinks").Down) { } else { } if (Globals.PlayerSession.Controller.Button("MausLinks").Released) { //Test Reiselogik Console.WriteLine("Controller Links Geclicked"); //Testen warum bei Schiffserstellung der Spieler nicht wind vom neuen Schiff erhält und wenn schiffe registriert werden hier weiter testen!!! WeltEvent SchiffsReise = new WeltEvent(Globals.AktuellesDatum, "REISE-START", Globals.AktuellerSpieler, null, Globals.AktuellerSpieler.SCHIFFE[0], Globals.AlleHäfen[Globals.AktuellerSpieler.SCHIFFE[0].angedocktAnHafen]); WeltEvent SchiffsReise2 = new WeltEvent(Globals.AktuellesDatum.AddDays(3), "REISE-ANKUNFT", Globals.AktuellerSpieler, null, Globals.AktuellerSpieler.SCHIFFE[0], Globals.AlleHäfen["HAMBURG"]); Globals.EventAktion(SchiffsReise,"EINFÜGEN"); Globals.EventAktion(SchiffsReise2, "EINFÜGEN"); } if (Globals.PlayerSession.Controller.Button("MausRechts").Released) { Console.WriteLine("Controller Rechts Geclicked"); Console.Clear(); EventRad.zeigeNächstenEventTag(); } } else { } //Hovereffecte bei Icons //Münze if (Util.InRect(this.MouseX, this.MouseY, Coin.X - Coin.HalfWidth, Coin.Y - Coin.HalfWidth, 44, 55) && !Globals.DisplaySubElementAktiv) { if (Globals.PlayerSession.Controller.Button("MausLinks").Down) { Coin_clicked.Alpha = 1f; } else { Coin_clicked.Alpha = 0f; } if (Globals.PlayerSession.Controller.Button("MausLinks").Released) { //FadeOut zu Bank setzeFadeOut("Bank"); } } else { Coin_clicked.Alpha = 0f; } //Anker if (Util.InRect(this.MouseX, this.MouseY, Anker.X - Anker.HalfWidth, Anker.Y - Anker.HalfWidth, 44, 55) && !Globals.DisplaySubElementAktiv) { if (Globals.PlayerSession.Controller.Button("MausLinks").Down) { Anker_clicked.Alpha = 1f; } else { Anker_clicked.Alpha = 0f; } if (Globals.PlayerSession.Controller.Button("MausLinks").Released) { //FadeOut zu Hall Of Fame setzeFadeOut("Hall of Fame"); } } else { Anker_clicked.Alpha = 0f; } //GeldSack if (Util.InRect(this.MouseX, this.MouseY, GeldSack.X - GeldSack.HalfWidth, GeldSack.Y - GeldSack.HalfWidth, 44, 55) && !Globals.DisplaySubElementAktiv) { if (Globals.PlayerSession.Controller.Button("MausLinks").Down) { GeldSack_clicked.Alpha = 1f; } else { GeldSack_clicked.Alpha = 0f; } if (Globals.PlayerSession.Controller.Button("MausLinks").Released) { //FadeOut zu Statistik Screen setzeFadeOut("Statistiken"); } } else { GeldSack_clicked.Alpha = 0f; } //Buch if (Util.InRect(this.MouseX, this.MouseY, Buch.X - Buch.HalfWidth, Buch.Y - Buch.HalfWidth, 44, 55) && !Globals.DisplaySubElementAktiv) { if (Globals.PlayerSession.Controller.Button("MausLinks").Down) { Buch_clicked.Alpha = 1f; } else { Buch_clicked.Alpha = 0f; } if (Globals.PlayerSession.Controller.Button("MausLinks").Released) { //FadeOut zu Optionsscreen setzeFadeOut("Optionen"); } } else { Buch_clicked.Alpha = 0f; } } } public void LadeStädte() { //Es sind immer die gleichen festen Städte zu laden switch (Globals.weltKarte) { case "EUROPA": importHafen("ODESSA"); importHafen("TRIEST"); importHafen("BARCELONA"); importHafen("LISSABON"); importHafen("LE HAVRE"); importHafen("AMSTERDAM"); importHafen("HAMBURG"); importHafen("LONDON"); importHafen("LIVERPOOL"); importHafen("TUNIS"); importHafen("PORT SAID"); break; case "AMERIKA": break; case "ASIEN": break; case "AFRIKA": break; } //Wenn Häfen geladen sind einmal alle Icons richtig setzen setzeMiniIcons(); miniIconsGesetzt = true; } public void ZeichneStädte() { switch (Globals.weltKarte) { case "EUROPA": Draw.Entity(Globals.AlleHäfen["ODESSA"]); Draw.Entity(Globals.AlleHäfen["TRIEST"]); Draw.Entity(Globals.AlleHäfen["BARCELONA"]); Draw.Entity(Globals.AlleHäfen["LISSABON"]); Draw.Entity(Globals.AlleHäfen["LE HAVRE"]); Draw.Entity(Globals.AlleHäfen["AMSTERDAM"]); Draw.Entity(Globals.AlleHäfen["HAMBURG"]); Draw.Entity(Globals.AlleHäfen["LONDON"]); Draw.Entity(Globals.AlleHäfen["LIVERPOOL"]); Draw.Entity(Globals.AlleHäfen["TUNIS"]); Draw.Entity(Globals.AlleHäfen["PORT SAID"]); break; case "AMERIKA": break; case "ASIEN": break; case "AFRIKA": break; } //Wenn Häfen geladen sind einmal alle Icons richtig setzen setzeMiniIcons(); miniIconsGesetzt = true; } public void LadeMeeresKnoten() { //Es sind immer die gleichen festen MeeeresKnoten zu laden switch (Globals.weltKarte) { case "EUROPA": importMeeresKnoten("Test GB", 50, 50); importMeeresKnoten("Test Spanien", 150, 150); break; case "AMERIKA": break; case "ASIEN": break; case "AFRIKA": break; } //Wenn Häfen geladen sind einmal alle Icons richtig setzen setzeMiniIcons(); miniIconsGesetzt = true; } public void LadeSeeStraßen() { //Es sind immer die gleichen festen MeeeresKnoten zu laden switch (Globals.weltKarte) { case "EUROPA": importSeeStraße("GB - Spanien"); importSeeStraße("Spanien - GB"); break; case "AMERIKA": break; case "ASIEN": break; case "AFRIKA": break; } //Wenn Häfen geladen sind einmal alle Icons richtig setzen setzeMiniIcons(); miniIconsGesetzt = true; } private void importHafen(string Name) { Add(Globals.AlleHäfen[Name]); aktiveHäfen.Add(Globals.AlleHäfen[Name]); } private void importMeeresKnoten(string Name, int xPos, int yPos) { Globals.AlleMeeresKnoten[Name].setzeNeueScreenPos(xPos, yPos); Add(Globals.AlleMeeresKnoten[Name]); aktiveKnoten.Add(Globals.AlleMeeresKnoten[Name]); } private void importSeeStraße(string Name) { Add(Globals.AlleSeeStraßen[Name]); aktiveSeeStraßen.Add(Globals.AlleSeeStraßen[Name]); } private void setzeMiniIcons() { foreach (Hafen h in aktiveHäfen) { h.aktiviereFähnchen(Globals.AktuellerSpieler); h.aktiviereSchiffsIcon(Globals.AktuellerSpieler); } } public void setzeFadeOut(string Ziel) { //FadeOut AddGraphic(FadeOutBlackScreen); Tween(FadeOutBlackScreen, new { Alpha = 1f }, 100f, 0f).Ease(Ease.BackInOut); EventRad.setzeFadeOut(); FadeOut = true; FadeOutZiel = Ziel; } } }