source: 2014/26/NikoK/WarTrain/WarTrain/WarTrain/WarTrain/WarTrain.cs @ 5160

Revision 5160, 19.5 KB checked in by nivikinn, 9 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8
9/*
10Ase1    Vihreä      1.00x   ->    1.00 x 20hp / 1s    ->    20.00hp / 1s    (10.00hp / osuma)
11Ase1    Keltainen   1.25x   ->    1.25 x 20hp / 1s    ->    25.00hp / 1s    (12.50hp / osuma)
12Ase1    Punainen    1.50x   ->    1.50 x 20hp / 1s    ->    30.00hp / 1s    (15.00hp / osuma)
13
14Ase2    Vihreä      1.00x   ->    1.00 x 25hp / 1s    ->    25.00hp / 1s    (25.00hp / osuma)
15Ase2    Keltainen   1.25x   ->    1.25 x 25hp / 1s    ->    31.25hp / 1s    (31.25hp / osuma)
16Ase2    Punainen    1.50x   ->    1.50 x 25hp / 1s    ->    37.50hp / 1s    (37.50hp / osuma)
17
18Ase3    Vihreä      1.00x   ->    1.00 x 30hp / 1s    ->    30.00hp / 1s    (60.00hp / osuma)
19Ase3    Keltainen   1.25x   ->    1.25 x 30hp / 1s    ->    37.50hp / 1s    (75.00hp / osuma)
20Ase3    Punainen    1.50x   ->    1.50 x 30hp / 1s    ->    45.00hp / 1s    (90.00hp / osuma)
21
22 *
23
24Sotilas Vihreä      0.50x   ->    0.50 x 20hp / 1s    ->    10.00hp / 1s    (5.00hp / osuma)
25Sotilas Keltainen   0.75x   ->    0.75 x 20hp / 1s    ->    15.00hp / 1s    (7.50hp / osuma)
26Sotilas Punainen    1.00x   ->    1.00 x 20hp / 1s    ->    20.00hp / 1s    (10.0hp / osuma)
27                                             
28Tankki  Vihreä      0.50x   ->    0.50 x 25hp / 1s    ->    12.50hp / 1s    (12.50hp / osuma)
29Tankki  Keltainen   0.75x   ->    0.75 x 25hp / 1s    ->    18.75hp / 1s    (18.75hp / osuma)
30Tankki  Punainen    1.00x   ->    1.00 x 25hp / 1s    ->    25.00hp / 1s    (25.00hp / osuma)
31                                             
32Tykki   Vihreä      0.50x   ->    0.50 x 30hp / 1s    ->    15.0hp / 1s     (30.00hp / osuma)
33Tykki   Keltainen   0.75x   ->    0.75 x 30hp / 1s    ->    22.5hp / 1s     (45.00hp / osuma)
34Tykki   Punainen    1.00x   ->    1.00 x 30hp / 1s    ->    30.0hp / 1s     (60.00hp / osuma)
35*/
36
37public class WarTrain : PhysicsGame
38{
39
40    SoundEffect Pam1 = LoadSoundEffect("Pam1");
41    SoundEffect Pam2 = LoadSoundEffect("Pam2");
42    SoundEffect Pam3 = LoadSoundEffect("Pam3");
43    SoundEffect JunaTuhoutuuAani = LoadSoundEffect("JunaveturiTuhoutuu");
44    SoundEffect VaunuTuhoutuuAani = LoadSoundEffect("JunavaunuTuhoutuu");
45    Image alueKuva = LoadImage("Alue");
46    Image raideKuva = LoadImage("Junarata");
47    Image sotilasKuva = LoadImage("Sotilas");
48    Image sotilasKuollutKuva = LoadImage("SotilasK");
49    Image sotilasKuvaKeltainen;
50    Image sotilasKuvaVihrea;
51    Image sotilasKuvaPunainen;
52    Image tankkiKuva = LoadImage("Tankki");
53    Image tankkiKuollutKuva = LoadImage("TankkiK");
54    Image tankkiKuvaKeltainen;
55    Image tankkiKuvaVihrea;
56    Image tankkiKuvaPunainen;
57    Image tykkiKuva = LoadImage("Tykki");
58    Image tykkiKuollutKuva = LoadImage("TykkiK");
59    Image tykkiKuvaKeltainen;
60    Image tykkiKuvaVihrea;
61    Image tykkiKuvaPunainen;
62    Image panosKuva1 = LoadImage("Panos1");
63    Image panosKuva2 = LoadImage("Panos2");
64    Image panosKuva3 = LoadImage("Panos3");
65    Image aseKuva1 = LoadImage("Ase1");
66    Image aseKuva2 = LoadImage("Ase2");
67    Image aseKuva3 = LoadImage("Ase3");
68
69    Image[] taustakuvaKuvat = new Image[2];
70    GameObject[] taustakuvat = new GameObject[2];
71    Image[] junarataKuvat = new Image[2];
72    GameObject[] kiskot = new GameObject[2];
73    int ylempiTaustakuva = 1;
74
75    public static WarTrain Peli;
76
77    Juna juna;
78    Timer vihollisAjastin;
79
80    IntMeter aikaPelinAlusta = new IntMeter(0);
81    Timer peliAikaAjastin;
82    int moneskoAlue = 1;
83    int VihollisiaAlueella = 5;
84
85    EasyHighScore TopLista = new EasyHighScore();
86
87    public IntMeter Pistelaskuri;
88
89    public override void Begin()
90    {
91        Peli = this;
92        SetWindowSize(680, 760);
93        LuoValikko();
94    }
95
96    void LuoTopLista()
97    {
98        TopLista.Show();
99        Keyboard.Listen(Key.Escape, ButtonState.Pressed, LuoValikko, null).InContext(TopLista.HighScoreWindow);
100    }
101
102    void LuoValikko()
103    {
104        ClearAll();
105
106        MediaPlayer.Play("Musa");
107        MediaPlayer.IsRepeating = true;
108        MediaPlayer.Volume = 0.5;
109
110        Mouse.IsCursorVisible = false;
111        MultiSelectWindow Valikko = new MultiSelectWindow("EpicWarTrain", "Uusi peli", "Parhaat tulokset", "Lopeta peli");
112        Level.Background.CreateGradient(Color.DarkGray, Color.DarkJungleGreen);
113        Valikko.SetButtonColor(Color.DarkJungleGreen);
114        Valikko.SetButtonTextColor(Color.White);
115        Valikko.SelectionColor = Color.JungleGreen;
116        Valikko.ItemSelected += PainettiinValikonNappia;
117        Valikko.DefaultCancel = 3;
118        Add(Valikko);
119    }
120
121    void PainettiinValikonNappia(int NappiValinta)
122    {
123        switch (NappiValinta)
124        {
125            case 0:
126                LuoKentta("ykkonen");
127                break;
128            case 1:
129                LuoTopLista();
130                break;
131            case 2:
132                Exit();
133                break;
134        }
135    }
136
137    void LuoPisteLaskuri()
138    {
139        Pistelaskuri = new IntMeter(0);
140        Label PisteNaytto = new Label();
141        PisteNaytto.X = taustakuvat[0].Right - PisteNaytto.Width - 10;
142        PisteNaytto.Title = "Pisteet";
143        PisteNaytto.Y = taustakuvat[0].Top - 50;
144        PisteNaytto.Color = Color.Transparent;
145        PisteNaytto.BindTo(Pistelaskuri);
146        Add(PisteNaytto);
147    }
148
149    void LuoHPMittari(DoubleMeter meter, Vector paikka, string title)
150    {
151        Label elamaNaytto = new Label(meter);
152        elamaNaytto.DecimalPlaces = 0;
153        elamaNaytto.Title = title;
154        elamaNaytto.Position = new Vector(taustakuvat[0].Right - elamaNaytto.Width / 2 - 37, paikka.Y);
155        elamaNaytto.Color = Color.Transparent;
156        Add(elamaNaytto);
157    }
158
159    void LuoKentta(string kentta)
160    {
161        ClearAll();
162        Spawnaus.MapLength = 100;
163        Spawnaus.Initialize();
164        MediaPlayer.Play("Musa2");
165        MediaPlayer.Volume = 0.1;
166        Level.Background.CreateGradient(Color.DarkGray, Color.DarkJungleGreen);
167
168        for (int i = 0; i < taustakuvaKuvat.Length; i++)
169        {
170            taustakuvaKuvat[i] = alueKuva;
171            taustakuvat[i] = new GameObject(taustakuvaKuvat[i]);
172            taustakuvat[i].Size = new Vector(Screen.Width + 25, Screen.Height + 25);
173            Add(taustakuvat[i], -3);
174
175            junarataKuvat[i] = raideKuva;
176            kiskot[i] = new GameObject(junarataKuvat[i]);
177            kiskot[i].Size = new Vector(kiskot[i].Width * 2, Screen.Height + 25);
178            Add(kiskot[i], -2);
179        }
180
181        taustakuvat[0].Position = Vector.Zero;
182        taustakuvat[1].Position = taustakuvat[0].Position + new Vector(0.0, taustakuvat[0].Height);
183
184        kiskot[0].Position = Vector.Zero;
185        kiskot[1].Position = kiskot[0].Position + new Vector(0.0, kiskot[0].Height);
186
187        sotilasKuvaPunainen = VaihdaVari(sotilasKuva, Color.Gold, Color.DarkRed);
188        sotilasKuvaKeltainen = sotilasKuva;
189        sotilasKuvaVihrea = VaihdaVari(sotilasKuva, Color.Gold, Color.ForestGreen);
190        tankkiKuvaPunainen = VaihdaVari(tankkiKuva, Color.Gold, Color.DarkRed);
191        tankkiKuvaKeltainen = tankkiKuva;
192        tankkiKuvaVihrea = VaihdaVari(tankkiKuva, Color.Gold, Color.ForestGreen);
193        tykkiKuvaPunainen = VaihdaVari(tykkiKuva, Color.Gold, Color.DarkRed);
194        tykkiKuvaKeltainen = tykkiKuva;
195        tykkiKuvaVihrea = VaihdaVari(tykkiKuva, Color.Gold, Color.ForestGreen);
196
197        //Layers[-3].RelativeTransition = new Vector(0.5, 0.5);
198        LuoJuna();
199        Camera.Follow(juna.Veturi);
200        Camera.FollowOffset = new Vector(0.0, Screen.Top - juna.Veturi.Height);
201
202        for (int i = 0; i < 1; i++)
203        {
204            Vaunu v = new Vaunu(LoadImage("Junavaunu"), 500);
205            juna.LisaaVaunu(v);
206        }
207        Ase kk = new Ase(aseKuva1.Width, aseKuva1.Height, 12.50);
208        kk.FireRate = 4;
209        kk.InfiniteAmmo = true;
210        kk.Image = aseKuva1;
211        kk.Size *= 2;
212        kk.AmmuksenKuva = panosKuva1;
213        kk.AttackSound = Pam1;
214        juna.Vaunut[0].LisaaAse(kk, new Vector(0.0, juna.Vaunut[0].Height / 3));
215
216        Ase pieniTykki = new Ase(aseKuva2.Width, aseKuva2.Height, 31.25);
217        pieniTykki.FireRate = 2;
218        pieniTykki.InfiniteAmmo = true;
219        pieniTykki.Image = aseKuva2;
220        pieniTykki.Size *= 2;
221        pieniTykki.AmmuksenKuva = panosKuva2;
222        pieniTykki.AttackSound = Pam2;
223        juna.Vaunut[0].LisaaAse(pieniTykki, new Vector(0.0, kk.Position.Y - juna.Vaunut[0].Height / 3));
224
225        Ase isoTykki = new Ase(aseKuva3.Width, aseKuva3.Height, 75.00);
226        isoTykki.FireRate = 1;
227        isoTykki.InfiniteAmmo = true;
228        isoTykki.Image = aseKuva3;
229        isoTykki.Size *= 2;
230        isoTykki.AmmuksenKuva = panosKuva3;
231        isoTykki.AttackSound = Pam3;
232        juna.Vaunut[0].LisaaAse(isoTykki, new Vector(0.0, pieniTykki.Position.Y - juna.Vaunut[0].Height / 3));
233
234        AsetaOhjaimet();
235
236        peliAikaAjastin = new Timer();
237        peliAikaAjastin.Interval = 1.0;
238        peliAikaAjastin.Timeout += delegate { aikaPelinAlusta.Value++; };
239        peliAikaAjastin.Start();
240        SmoothTextures = false;
241        LuoPisteLaskuri();
242
243        Vector ylimmanMittarinPaikka = new Vector(0.0, taustakuvat[0].Top - 100);
244        LuoHPMittari(juna.Veturi.Elamat, ylimmanMittarinPaikka, "Veturi");
245
246        for (int i = 0; i < juna.Vaunut.Count; i++)
247        {
248            ylimmanMittarinPaikka += new Vector(0.0, -50.0);
249            LuoHPMittari(juna.Vaunut[i].Elamat, ylimmanMittarinPaikka, "Vaunu");
250        }
251    }
252
253    protected override void Update(Time time)
254    {
255        if (taustakuvat == null || taustakuvat[0] == null)
256        {
257            base.Update(time);
258            return;
259        }
260
261        if (taustakuvat[ylempiTaustakuva].Position.Y <= Camera.ScreenToWorld(Screen.Center).Y)
262        {
263            int toinenTaustakuva;
264            if (ylempiTaustakuva == 0)
265                toinenTaustakuva = 1;
266            else toinenTaustakuva = 0;
267            taustakuvat[toinenTaustakuva].Position = new Vector(0.0, taustakuvat[ylempiTaustakuva].Position.Y + taustakuvat[ylempiTaustakuva].Height);
268            kiskot[toinenTaustakuva].Position = new Vector(0.0, kiskot[ylempiTaustakuva].Position.Y + kiskot[ylempiTaustakuva].Height);
269            moneskoAlue++;
270            SpawnaaVihollisia(taustakuvat[toinenTaustakuva].Position);
271            ylempiTaustakuva = toinenTaustakuva;
272        }
273
274        base.Update(time);
275    }
276
277    public void PeliPaattyi()
278    {
279        TopLista.EnterAndShow(Pistelaskuri.Value);
280        TopLista.EnterText = "Kirjoita nimesi:";
281        TopLista.HighScoreWindow.OKButton.Clicked += LuoValikko;
282        Keyboard.Listen(Key.Escape, ButtonState.Pressed, LuoValikko, null).InContext(TopLista.HighScoreWindow);
283    }
284   
285
286    void SpawnaaVihollisia(Vector keskipiste)
287    {
288        EnemyLevel soldierLevel = Spawnaus.GetEnemyLevelAt(moneskoAlue, EnemyType.Soldier);
289        EnemyLevel tankLevel = Spawnaus.GetEnemyLevelAt(moneskoAlue, EnemyType.Tank);
290        EnemyLevel cannonLevel = Spawnaus.GetEnemyLevelAt(moneskoAlue, EnemyType.Cannon);
291        Dictionary<EnemyType, int> spawnProbabilities = Spawnaus.GetProbabilities(moneskoAlue);
292        int soldierProbs;
293        spawnProbabilities.TryGetValue(EnemyType.Soldier, out soldierProbs);
294        int tankProbs;
295        spawnProbabilities.TryGetValue(EnemyType.Tank, out tankProbs);
296        int cannonProbs;
297        spawnProbabilities.TryGetValue(EnemyType.Cannon, out cannonProbs);
298
299
300        for (int i = 0; i < VihollisiaAlueella; i++)
301        {
302            int vihuTyyppi = RandomGen.NextIntWithProbabilities((double)soldierProbs / 100.0, (double)tankProbs / 100.0, (double)cannonProbs / 100.0); // 0 sotilas, 1 tankki, 2 tykki
303
304            Vector paikka = RandomGen.NextVector(Screen.Left + 70, Camera.ScreenToWorld(new Vector(0.0, Screen.Top)).Y, Screen.Right - 70, Camera.ScreenToWorld(new Vector(0.0, Screen.Top)).Y + Screen.Height);
305
306            switch (vihuTyyppi)
307            {
308                case 0:
309                    LuoVihollinen(EnemyType.Soldier, soldierLevel, paikka);
310                    break;
311                case 1:
312                    LuoVihollinen(EnemyType.Tank, tankLevel, paikka);
313                    break;
314                case 2:
315                    LuoVihollinen(EnemyType.Cannon, cannonLevel, paikka);
316                    break;
317                default:
318                    // mitään ei voi spawnata
319                    break;
320            }
321        }
322    }
323
324    void LuoVihollinen(EnemyType type, EnemyLevel level, Vector paikka)
325    {
326        switch (type)
327        {
328            case EnemyType.Soldier:
329                LuoSotilas(level, paikka);
330                break;
331            case EnemyType.Tank:
332                LuoTankki(level, paikka);
333                break;
334            case EnemyType.Cannon:
335                LuoTykki(level, paikka);
336                break;
337            default:
338                break;
339        }
340    }
341
342    void LuoSotilas(EnemyLevel level, Vector paikka)
343    {
344        switch (level)
345        {
346            case EnemyLevel.Green:
347                Vihollinen vihrea = new Vihollinen(16, 16, 10.0, 5.00, 0.5);
348                vihrea.Image = sotilasKuvaVihrea;
349                vihrea.Position = paikka;
350                vihrea.Ase.AmmuksenKuva = panosKuva1;
351                vihrea.Ase.AttackSound = Pam1;
352                vihrea.TuhoutumisEfektiKuva = sotilasKuollutKuva;
353                Add(vihrea);
354                break;
355            case EnemyLevel.Yellow:
356                Vihollinen keltainen = new Vihollinen(16, 16, 12.5, 7.50, 0.5);
357                keltainen.Image = sotilasKuvaKeltainen;
358                keltainen.Position = paikka;
359                keltainen.Ase.AmmuksenKuva = panosKuva1;
360                keltainen.Ase.AttackSound = Pam1;
361                keltainen.TuhoutumisEfektiKuva = sotilasKuollutKuva;
362                Add(keltainen);
363                break;
364            case EnemyLevel.Red:
365                Vihollinen punainen = new Vihollinen(16, 16, 15.0, 10.00, 0.5);
366                punainen.Image = sotilasKuvaPunainen;
367                punainen.Position = paikka;
368                punainen.Ase.AmmuksenKuva = panosKuva1;
369                punainen.Ase.AttackSound = Pam1;
370                punainen.TuhoutumisEfektiKuva = sotilasKuollutKuva;
371                Add(punainen);
372                break;
373            default:
374                break;
375        }
376    }
377
378    void LuoTankki(EnemyLevel level, Vector paikka)
379    {
380        switch (level)
381        {
382            case EnemyLevel.Green:
383                Vihollinen vihrea = new Vihollinen(48, 32, 25.0, 12.5, 1.0);
384                vihrea.Image = tankkiKuvaVihrea;
385                vihrea.Position = paikka;
386                vihrea.Ase.AmmuksenKuva = panosKuva2;
387                vihrea.Ase.AttackSound = Pam2;
388                vihrea.TuhoutumisEfektiKuva = tankkiKuollutKuva;
389                Add(vihrea);
390                break;
391            case EnemyLevel.Yellow:
392                Vihollinen keltainen = new Vihollinen(48, 32, 31.25, 18.75, 1.0);
393                keltainen.Image = tankkiKuvaKeltainen;
394                keltainen.Position = paikka;
395                keltainen.Ase.AmmuksenKuva = panosKuva2;
396                keltainen.Ase.AttackSound = Pam2;
397                keltainen.TuhoutumisEfektiKuva = tankkiKuollutKuva;
398                Add(keltainen);
399                break;
400            case EnemyLevel.Red:
401                Vihollinen punainen = new Vihollinen(48, 32, 37.5, 25, 1.0);
402                punainen.Image = tankkiKuvaPunainen;
403                punainen.Position = paikka;
404                punainen.Ase.AmmuksenKuva = panosKuva2;
405                punainen.Ase.AttackSound = Pam2;
406                punainen.TuhoutumisEfektiKuva = tankkiKuollutKuva;
407                Add(punainen);
408                break;
409            default:
410                break;
411        }
412
413    }
414
415    void LuoTykki(EnemyLevel level, Vector paikka)
416    {
417        switch (level)
418        {
419            case EnemyLevel.Green:
420                Vihollinen vihrea = new Vihollinen(48, 32, 60.0, 30.0, 2.0);
421                vihrea.Image = tykkiKuvaVihrea;
422                vihrea.Position = paikka;
423                vihrea.Ase.AmmuksenKuva = panosKuva3;
424                vihrea.Ase.AttackSound = Pam3;
425                vihrea.TuhoutumisEfektiKuva = tykkiKuollutKuva;
426                Add(vihrea);
427                break;
428            case EnemyLevel.Yellow:
429                Vihollinen keltainen = new Vihollinen(48, 32, 75.0, 45.0, 2.0);
430                keltainen.Image = tykkiKuvaKeltainen;
431                keltainen.Position = paikka;
432                keltainen.Ase.AmmuksenKuva = panosKuva3;
433                keltainen.Ase.AttackSound = Pam3;
434                keltainen.TuhoutumisEfektiKuva = tykkiKuollutKuva;
435                Add(keltainen);
436                break;
437            case EnemyLevel.Red:
438                Vihollinen punainen = new Vihollinen(48, 32, 90.0, 60.0, 2.0);
439                punainen.Image = tykkiKuvaPunainen;
440                punainen.Position = paikka;
441                punainen.Ase.AmmuksenKuva = panosKuva3;
442                punainen.Ase.AttackSound = Pam3;
443                punainen.TuhoutumisEfektiKuva = tykkiKuollutKuva;
444                Add(punainen);
445                break;
446            default:
447                break;
448        }
449    }
450
451    Image VaihdaVari(Image kuva, Color vaihdettava, Color miksiVaihdetaan)
452    {
453        Image k = kuva.Clone();
454        k.ReplaceColor(vaihdettava, miksiVaihdetaan);
455        return k;
456    }
457
458    void LuoJuna()
459    {
460        juna = new Juna(500, LoadImage("Junaveturi"));
461    }
462
463    void JunaTuhoutui()
464    {
465        juna.Veturi.Elamat.Value = 0;
466        JunaTuhoutuuAani.Play();
467        VaunuTuhoutuuAani.Play();
468        TopLista.Show();
469    }
470
471
472    void AsetaOhjaimet()
473    {
474        Keyboard.Listen(Key.W, ButtonState.Down, juna.Liiku, null, 5000.0);
475        Keyboard.Listen(Key.S, ButtonState.Down, juna.Liiku, null, -10000.0);
476        Keyboard.Listen(Key.Up, ButtonState.Down, juna.Liiku, null, 5000.0);
477        Keyboard.Listen(Key.Down, ButtonState.Down, juna.Liiku, null, -10000.0);
478        Keyboard.Listen(Key.R, ButtonState.Pressed, delegate { MessageDisplay.Add(Mouse.PositionOnWorld.ToString()); }, null);
479        Keyboard.Listen(Key.Escape, ButtonState.Pressed, LuoValikko, null);
480        Keyboard.Listen(Key.K, ButtonState.Pressed, JunaTuhoutui, null);
481        Mouse.Listen(MouseButton.Left, ButtonState.Down, Ammu, null);
482        Keyboard.Listen(Key.F1, ButtonState.Pressed, delegate { EnabloiAse(0); }, null);
483        Keyboard.Listen(Key.F2, ButtonState.Pressed, delegate { EnabloiAse(1); }, null);
484        Keyboard.Listen(Key.F3, ButtonState.Pressed, delegate { EnabloiAse(2); }, null);
485        Keyboard.Listen(Key.L, ButtonState.Pressed, delegate {
486            for (int i = 0; i < juna.Vaunut.Count; i++)
487                juna.Vaunut[i].Elamat.Value += 1000;
488            juna.Veturi.Elamat.Value += 1000;
489        }, null);
490    }
491
492    void Ammu()
493    {
494        for (int i = 0; i < juna.Vaunut.Count; i++)
495        {
496            juna.Vaunut[i].Ammu();
497        }
498    }
499
500    void EnabloiAse(int ase)
501    {
502        for (int i = 0; i < juna.Vaunut.Count; i++)
503        {
504            if (ase < 0 || ase > juna.Vaunut[i].Aseet.Count) continue;
505
506            juna.Vaunut[i].Aseet[ase].IsEnabled = !juna.Vaunut[i].Aseet[ase].IsEnabled;
507        }
508    }
509}
Note: See TracBrowser for help on using the repository browser.