You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

680 lines
26 KiB
C#

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<Hafen> aktiveHäfen = new List<Hafen>();
List<MeeresKnotenpunkt> aktiveKnoten = new List<MeeresKnotenpunkt>();
List<SeeStraße> aktiveSeeStraßen = new List<SeeStraße>();
//Schlange aller gewählten Meeresknote => Das ist die Routenauswahl
Queue<MeeresKnotenpunkt> SeeRoute = new Queue<MeeresKnotenpunkt>();
//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;
}
}
}