예제 #1
0
        public LevelUebergang(Treffer rundenErgebnis) : this()
        {
            var gespieltesLevel = LevelSequenzierer.ErzeugeLevelBeschreibung(rundenErgebnis.GespieltesLevel);

            this.Ueberschrift.Text          = $@"{ rundenErgebnis.ObsiegenderSpieler.Name } and { rundenErgebnis.GetroffenerSpieler.Name } on a Wrath of the Mild series of missions";
            this.AktuellesLevel.Text        = $@"Level { rundenErgebnis.GespieltesLevel }: ""{ gespieltesLevel.LevelName }""";
            this.AktuellesLevelDetails.Text = $@"Being the { gespieltesLevel.LevelNummerInMission } level in the ""{ gespieltesLevel.MissionsName }"" mission";
            this.ErgebnisGewonnen.Text      = $@"{ rundenErgebnis.ObsiegenderSpieler.Name } won, { rundenErgebnis.ObsiegenderSpieler.Lebenspunkte } HP left";
            if (rundenErgebnis.Ergebnis == SchussErgebnis.SelbstErschossen)
            {
                this.ErgebnisBesiegt.Text = $"{ rundenErgebnis.GetroffenerSpieler.Name } n00bed themselves out";
            }
            else
            {
                this.ErgebnisBesiegt.Text = $"{ rundenErgebnis.GetroffenerSpieler.Name } has been pwned";
            }

            var kommendesLevel = LevelSequenzierer.ErzeugeLevelBeschreibung(rundenErgebnis.GespieltesLevel + 1);

            if (kommendesLevel == null)
            {
                this.KommendesLevel.Text        = "Be at peace";
                this.KommendesLevelDetails.Text = "Congratulations, you completed all missions";
            }
            else
            {
                this.KommendesLevel.Text        = $@"Level { rundenErgebnis.GespieltesLevel + 1 }: ""{ kommendesLevel.LevelName }""";
                this.KommendesLevelDetails.Text = $@"Being the { kommendesLevel.LevelNummerInMission } level in the ""{ kommendesLevel.MissionsName }"" mission";
            }
        }
예제 #2
0
 public UebungNocheinmal(Treffer rundenErgebnis) : this()
 {
     this.ErgebnisGewonnen.Text = $@"{ rundenErgebnis.ObsiegenderSpieler.Name } won, { rundenErgebnis.ObsiegenderSpieler.Lebenspunkte } HP left";
     if (rundenErgebnis.Ergebnis == SchussErgebnis.SelbstErschossen)
     {
         this.ErgebnisBesiegt.Text = $"{ rundenErgebnis.GetroffenerSpieler.Name } n00bed themselves out";
     }
     else
     {
         this.ErgebnisBesiegt.Text = $"{ rundenErgebnis.GetroffenerSpieler.Name } has been pwned";
     }
 }
예제 #3
0
        private bool SpielerWurdeGetroffen(Treffer schussErgebnis)
        {
            this.Audio.GeraeuschAbspielen(Geraeusche.SchussEinschlag);
            new Explosion(Color.FromArgb(new Random().Next(int.MaxValue)), 175).Noobsplosion(this, this.levelBild, this.ausgangsZustand, schussErgebnis.EinschlagsKoordinateX, schussErgebnis.EinschlagsKoordinateY);
            var getroffenerSpieler = schussErgebnis.Ergebnis == SchussErgebnis.SelbstErschossen ? this.dranSeiender : this.Gegner;

            getroffenerSpieler.Schaden(this.dranSeiender.Waffe.SchadensPunkte);
            schussErgebnis.GetroffenerSpieler = getroffenerSpieler;
            schussErgebnis.ObsiegenderSpieler = object.ReferenceEquals(getroffenerSpieler, this.dranSeiender) ? this.Gegner : this.dranSeiender;
            using (var zeichenFlaeche = Graphics.FromImage(this.levelBild))
            {
                this.herzAnzeige.Zeichnen(
                    this,
                    zeichenFlaeche,
                    object.ReferenceEquals(getroffenerSpieler, this.spielerEins) ? getroffenerSpieler : null,
                    object.ReferenceEquals(getroffenerSpieler, this.spielerZwei) ? getroffenerSpieler : null
                    );
            }

            this.Refresh();
            if (getroffenerSpieler.Tot)
            {
                using (var weiterMachen = this.TurnierModus ? (Form) new LevelUebergang(schussErgebnis) : (Form) new UebungNocheinmal(schussErgebnis))
                {
                    switch (weiterMachen.ShowDialog(this))
                    {
                    case DialogResult.OK:
                        this.spielPhase = SpielPhase.WeltErzeugen;
                        return(true);

                    case DialogResult.Retry:
                        this.spielPhase = SpielPhase.WeltErzeugen;
                        return(false);

                    case DialogResult.Abort:
                        this.spielPhase = SpielPhase.StartBildschirm;
                        return(false);
                    }
                }
            }
            else
            {
                return(true);
            }

            return(false);
        }
예제 #4
0
        private Treffer Schiessen(SchussEingabe schussEingabe)
        {
            double x, y;

            /* schiessen wir nach rechts (spieler 1) oder nach links (spieler 2)? */
            var schussRichtung = object.ReferenceEquals(this.dranSeiender, this.spielerEins) ? 1 : -1;
            var v                 = (float)schussEingabe.SchussKraft;
            var vSkaliert         = 1.0f / (v * 0.5f);
            var mathWinkel        = Math.PI * (float)(180 - schussEingabe.SchussWinkel) / 180f;
            var muendungVerlassen = false;
            var behandeltePixel   = new List <long>();
            var ausgangsPunktx    = this.dranSeiender.X;
            var ausgangsPunkty    = this.dranSeiender.Y;
            var schussErgebnis    = new Treffer
            {
                GespieltesLevel = this.aktuelleLevelNummer,
                Ergebnis        = SchussErgebnis.NixGetroffen
            };

            /* von hier nach dort x laufen lassen */
            for (
                var t = 0.0f;
                ;
                t += vSkaliert
                )
            {
                /* formel für die schuss-parabel mit schwerkraft
                 *
                 *  x = v * cos(winkel) * t;
                 *  y = v * sin(winkel) * t - 0.5g * t²;
                 *
                 *  x --> t² und y --> t³ macht eine coole, brauchbare,
                 *  akzelerierende hyperbolische flugbahn!
                 *
                 */
                switch (schussEingabe.Trajektorie)
                {
                case TrajektorienArt.SinusDaempfer:
                    var powPow = Math.Pow(t, t);
                    x = v * -t;
                    y = v * Math.Sin(powPow) / Math.Pow(2, (powPow - Math.PI / 2.0));
                    break;

                case TrajektorienArt.Kubisch:
                    var tQuadrat = t * t;
                    x = v * Math.Cos(mathWinkel) * tQuadrat;
                    y = v * Math.Sin(mathWinkel) * t - Main.schwerkraftFaktor * tQuadrat * t;
                    break;

                default:
                    /* standard: resultierender vektor aus schwerkraftrichtung und mündungsrichtung, parabolisch */
                    x = v * Math.Cos(mathWinkel) * t;
                    y = v * Math.Sin(mathWinkel) * t - Main.schwerkraftFaktor * t * t;
                    break;
                }

                /* schuss zeichnen */
                var pixelX = ausgangsPunktx - (int)x * schussRichtung;
                var pixelY = ausgangsPunkty - (int)y;
                if (pixelY > 0 && pixelY < this.levelBild.Height && pixelX > 0 && pixelX < this.levelBild.Width)
                {
                    var pixelFach = ((long)pixelY << 32) + (long)pixelX;
                    if (!behandeltePixel.Contains(pixelFach))
                    {
                        var hitColor = this.levelBild.GetPixel(pixelX, pixelY).ToArgb();
                        if (muendungVerlassen == false)
                        {
                            if (hitColor != ((SolidBrush)this.dranSeiender.Farbe).Color.ToArgb())
                            {
                                this.Audio.GeraeuschAbspielen(Geraeusche.SchussStart);
                                muendungVerlassen = true;
                            }
                        }
                        else
                        {
                            if (hitColor == ((SolidBrush)this.Gegner.Farbe).Color.ToArgb())
                            {
                                return(schussErgebnis.Setzen(pixelX, pixelY, SchussErgebnis.GegnerGekillt));
                            }
                            else if (hitColor != Farbverwaltung.HimmelsfarbeAlsInt)
                            {
                                if (hitColor == ((SolidBrush)this.dranSeiender.Farbe).Color.ToArgb())
                                {
                                    return(schussErgebnis.Setzen(pixelX, pixelY, SchussErgebnis.SelbstErschossen));
                                }
                                else
                                {
                                    return(schussErgebnis.Setzen(pixelX, pixelY, SchussErgebnis.BergGetroffen));
                                }
                            }

                            this.levelBild.SetPixel(pixelX, pixelY, ((SolidBrush)this.dranSeiender.Farbe).Color);
                            behandeltePixel.Add(pixelFach);
                        }
                    }
                }

                Application.DoEvents();
                this.Refresh();

                /* schuss ist links, rechts, oder unten rausgeflogen */
                if (pixelY > this.levelBild.Height || pixelX < 0 || pixelX > this.levelBild.Width)
                {
                    break;
                }
            }

            return(schussErgebnis);
        }