source: 2014/30/MitjaK/Attack to Agora/Attack to Agora/Attack to Agora/Attack to Agora/Attack_to_Agora_mitja.cs @ 6472

Revision 6472, 12.2 KB checked in by anlakane, 4 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8using Microsoft.Xna.Framework.Content;
9
10/// <summary>
11/// "Mitjan" (miskan) koodit tänne
12/// </summary>
13public partial class Attack_to_Agora : PhysicsGame
14{
15    Image jouniBoss = LoadImage("jouniboss1");
16    Image jouniHealthbarEmpty = LoadImage("jouniheathbarempty");
17    Image jouniHealthbarFull = LoadImage("jouniheathbarfull");
18    Animation jounibossArrive;
19
20    Image anttijussiboss = LoadImage("anttijussiboss");
21    Image anttijussibossFlipped;
22    Image ajHBarEmpty = LoadImage("ajheathbarempty");
23    Image ajHBarFull = LoadImage("ajheathbarfull");
24    Animation tuliAnimaatio;
25    Animation tuliAnimaatioFlipped;
26    bool tekeekoTulidamagea = false;
27    const double TULEN_DMG = 0.1;
28    const double TULEN_ETAISYYS = 200.0;
29    const double AJ_NOPEUS = 100.0;
30    bool ajGoingRight = true;
31    bool pelaajaAskenOikealla = false;
32
33    Elava currentBoss;
34    AssaultRifle currentBossWeapon;
35    ProgressBar bossHealthBar;
36    const double JOUNI_DMG = 12.5;
37
38    bool paaseekoSeuraavaanKenttaan = true;
39
40    Animation asemiesLiikkuu;
41
42    // Attribuutit
43    void LuoAmpuvaVihollinen(Vector paikka, double leveys, double korkeus)
44    {
45        Elava vihollinen = new Elava(200, 200, 100);
46        vihollinen.Animation = asemiesLiikkuu;
47        vihollinen.Animation.Start();
48       
49        vihollinen.Position = paikka;
50        vihollinen.Tag = "vihollinen";
51        GameObject varjo = Varjo(vihollinen);
52
53        vihollinen.Kuoli += delegate {
54            VihollinenKuoli(vihollinen);
55            varjo.Destroy();
56        };
57
58        if (taistelija == null || taistelija.IsAddedToGame == false)
59            Timer.SingleShot(1.0 / 60.0, delegate { LuoAmpumisAivot(vihollinen); });
60        else LuoAmpumisAivot(vihollinen);
61
62        Add(vihollinen);
63
64    }
65
66    void LuoTormaavaVihollinen(Vector paikka, double leveys, double korkeus)
67    {
68        Elava Tormaavavihollinen = new Elava(200, 200, 200);
69        Tormaavavihollinen.Image = tormaavavihollinen;
70        Tormaavavihollinen.Tag = "vihollinen";
71        Tormaavavihollinen.Position = paikka;
72        GameObject varjo = Varjo(Tormaavavihollinen);
73
74        Tormaavavihollinen.Kuoli += delegate {
75            VihollinenKuoli(Tormaavavihollinen);
76            varjo.Destroy();
77        };
78
79        if (taistelija == null || taistelija.IsAddedToGame == false)
80            Timer.SingleShot(1.0 / 60.0, delegate { LuoHyokkaysAivot(Tormaavavihollinen); });
81        else LuoHyokkaysAivot(Tormaavavihollinen);
82
83
84        Add(Tormaavavihollinen);
85    }
86
87    void LuoAmpumisAivot(Elava vihollinen)
88    {
89        FollowerBrain seuraajanAivot = new FollowerBrain(taistelija);
90        seuraajanAivot.Speed = 250;
91        seuraajanAivot.Active = true;
92        seuraajanAivot.DistanceClose = vihollinen.Width / 2 + taistelija.Width / 2 + 25;
93        seuraajanAivot.TargetClose += delegate { taistelija.Damagea(VIHOLLISEN_TORMAYSDMG); };
94
95        vihollinen.Brain = seuraajanAivot;
96    }
97
98    void LuoHyokkaysAivot(Elava vihollinen)
99    {
100        FollowerBrain seuraajanAivot = new FollowerBrain(taistelija);
101        seuraajanAivot.Speed = 250;
102
103        seuraajanAivot.Active = true;
104        seuraajanAivot.DistanceClose = vihollinen.Width / 2 + taistelija.Width / 2 + 25;
105        seuraajanAivot.TargetClose += delegate { taistelija.Damagea(VIHOLLISEN_TORMAYSDMG); };
106
107        vihollinen.Brain = seuraajanAivot;
108    }
109
110
111    /// <summary>
112    /// Vihollinen kuoli, 'nuff said.
113    /// </summary>
114    /// <param name="vihollinen"></param>
115    void VihollinenKuoli(Elava vihollinen)
116    {
117        vihollinen.Destroy();
118    }
119
120    void LuoJouniBoss(Vector luomisPaikka, double pysahtymisX)
121    {
122        controlsActive = false;
123
124        Elava jouni = new Elava(jouniBoss, 10000); // 10000
125        jouni.Kuoli += JouniDefeated;
126        jouni.Position = luomisPaikka;
127        // jouni.Shape = Shape.FromImage(jouniBoss);
128        jouni.Tag = "jouni";
129        jouni.CollisionIgnoreGroup = 1;
130        jouni.IgnoresGravity = true;
131        jouni.IgnoresCollisionResponse = true;
132        Add(jouni);
133
134        GameObject varjo = Varjo(jouni);
135        jouni.Kuoli += delegate { varjo.Destroy(); };
136
137        currentBoss = jouni;
138        paaseekoSeuraavaanKenttaan = false;
139
140        bossHealthBar = new ProgressBar(jouniHealthbarEmpty.Width / 2, jouniHealthbarEmpty.Height / 2);
141        bossHealthBar.Position = new Vector(Screen.Right - bossHealthBar.Width / 2, Screen.Top - bossHealthBar.Height / 2);
142        bossHealthBar.BindTo(jouni.Elamat);
143        bossHealthBar.Image = jouniHealthbarEmpty;
144        bossHealthBar.BarImage = jouniHealthbarFull;
145        Add(bossHealthBar);
146
147        jouni.NeedsUpdateCall = true;
148        jouni.IsUpdated = true;
149        jouni.Updated += delegate(PhysicsObject j)
150        {
151            Elava jP = j as Elava;
152
153            if (jP.X > pysahtymisX)
154            {
155                ActivateJouni(jP);
156                jouni.IsUpdated = false;
157                jouni.NeedsUpdateCall = false;
158            }
159            else jP.Velocity = new Vector(100.0, 0.0);
160        };
161    }
162
163    void ActivateJouni(Elava jouni)
164    {
165        controlsActive = true;
166
167        jouni.Animation = jounibossArrive;
168        jouni.Animation.Start(1);
169        jouni.Animation.FPS = 0.5;
170        jouni.Animation.StopOnLastFrame = true;
171
172        jouni.MakeStatic();
173        jouni.Stop();
174        jouni.IgnoresCollisionResponse = false;
175
176        AssaultRifle jouninAse = new AssaultRifle(20, 10);
177        jouninAse.IsVisible = false;
178        jouninAse.InfiniteAmmo = true;
179        jouninAse.Power.Value = 200.0;
180        jouninAse.Power.DefaultValue = 200.0;
181        jouninAse.Tag = "jouninase";
182        Add(jouninAse);
183        jouninAse.Position = jouni.Position + new Vector(jouni.Width / 3, -25);
184        currentBossWeapon = jouninAse;
185
186        Timer ampumisAjastin = new Timer();
187        ampumisAjastin.Interval = 0.75;
188        ampumisAjastin.Timeout += delegate
189        {
190            if (jouninAse == null)
191                return;
192            jouninAse.AbsoluteAngle = (taistelija.Position - jouninAse.AbsolutePosition).Angle;
193
194            PhysicsObject ammus = jouninAse.Shoot();
195
196            if (ammus == null)
197                return;
198
199            ammus.IgnoresGravity = true;
200            ammus.IsVisible = false;
201            ammus.IsUpdated = true;
202            ammus.NeedsUpdateCall = true;
203            ammus.Updated += delegate(PhysicsObject a) { DrawTracers(a, Color.Red, 0.3, 2); };
204
205            AddCollisionHandler(ammus, delegate (PhysicsObject a, PhysicsObject p) {
206                if ((string)p.Tag == "jouni" || (string)p.Tag == "trigger") return;
207
208                a.Destroy();
209
210                // p.IsVisible = true; // collisionboxit näkyviin?
211                Elava e = p as Elava;
212
213                if (e == null) return;
214                e.Damagea(JOUNI_DMG);
215            });
216        };
217
218        ampumisAjastin.Start();
219
220        jouni.Kuoli += ampumisAjastin.Stop;
221    }
222
223    void JouniDefeated()
224    {
225        currentBoss.Destroy();
226        currentBoss = null;
227        jounihaviaa.Play();
228        if (currentBossWeapon != null)
229            currentBossWeapon.Destroy();
230        currentBossWeapon = null;
231
232        bossHealthBar.Destroy();
233
234        Timer.SingleShot(jounihaviaa.Duration.Seconds, delegate 
235        {
236            voititjounin.Play();
237            Timer.SingleShot(voititjounin.Duration.Seconds, delegate
238            {
239                paaseekoSeuraavaanKenttaan = true;
240            });
241        });
242    }
243
244    void LuoAnttiJussi(Vector paikka)
245    {
246
247        anttijussibossFlipped = Image.Mirror(anttijussiboss);
248
249        Elava anttiJussi = new Elava(anttijussiboss, 10000); //hp 10000?
250        anttiJussi.Kuoli += AJDefeated;
251        anttiJussi.Size *= 0.2;
252        anttiJussi.Position = paikka;
253        anttiJussi.Tag = "anttijussi";
254        Add(anttiJussi);
255
256        currentBoss = anttiJussi;
257
258        bossHealthBar = new ProgressBar(ajHBarEmpty.Width / 2, ajHBarEmpty.Height / 2);
259        bossHealthBar.Position = new Vector(Screen.Right - bossHealthBar.Width / 2 - 10, Screen.Top - bossHealthBar.Height / 2 - 10);
260        bossHealthBar.BindTo(anttiJussi.Elamat);
261        bossHealthBar.Image = ajHBarEmpty;
262        bossHealthBar.BarImage = ajHBarFull;
263        Add(bossHealthBar);
264
265        GameObject varjo = Varjo(anttiJussi);
266        anttiJussi.Kuoli += delegate { varjo.Destroy(); };
267
268
269        GameObject tuli = new GameObject(170, 70);
270        tuli.Tag = "tuli";
271        tuli.Color = Color.Transparent;
272        tuli.Size *= 3;
273        Add(tuli, 2);
274
275        Timer fireT = new Timer();
276        fireT.Interval = 1.0 / 60.0;
277        fireT.Timeout += delegate
278        {
279            if (ajGoingRight)
280            {
281                tuli.Left = anttiJussi.Right;
282                tuli.Y = anttiJussi.Y + 80;
283            }
284            else
285            {
286                tuli.Right = anttiJussi.Left;
287                tuli.Y = anttiJussi.Y + 80;
288            }
289        };
290        fireT.Start();
291
292        anttiJussi.Kuoli += delegate {
293            tuli.Destroy();
294            fireT.Stop(); 
295        };
296        bool doOnce = false;
297        anttiJussi.Collided += delegate 
298        {
299            if (doOnce) return;
300
301            AktivoiAJ(tuli);
302        };
303    }
304
305    void AktivoiAJ(GameObject tuli)
306    {
307        controlsActive = true;
308        tuli.Animation = tuliAnimaatio;
309        tuli.Animation.Start();
310        tekeekoTulidamagea = true;
311
312
313        currentBoss.IsUpdated = true;
314        currentBoss.NeedsUpdateCall = true;
315        currentBoss.Updated += delegate(PhysicsObject b) 
316        {
317            if (tekeekoTulidamagea)
318            {
319                double distance;
320                if (ajGoingRight)
321                    distance = Vector.Distance(new Vector(tuli.Left, tuli.Y), taistelija.Position);
322                else 
323                    distance = Vector.Distance(new Vector(tuli.Right, tuli.Y), taistelija.Position);
324
325                if (distance < TULEN_ETAISYYS)
326                {
327                    taistelija.Damagea(TULEN_DMG);
328                }
329            }
330            if (currentBoss != null)
331            {
332                if (taistelija.X < currentBoss.X)
333                {
334                    currentBoss.Velocity = new Vector(-AJ_NOPEUS, currentBoss.Velocity.Y);
335                    ajGoingRight = false;
336                }
337                else
338                {
339                    currentBoss.Velocity = new Vector(AJ_NOPEUS, currentBoss.Velocity.Y);
340                    ajGoingRight = true;
341                }
342            }
343
344            if (ajGoingRight && !pelaajaAskenOikealla)
345            {
346                currentBoss.Image = anttijussiboss;
347                tuli.Animation = tuliAnimaatio;
348                tuli.Animation.Start();
349                pelaajaAskenOikealla = true;
350            }
351            if (!ajGoingRight && pelaajaAskenOikealla)
352            {
353                currentBoss.Image = anttijussibossFlipped;
354                tuli.Animation = tuliAnimaatioFlipped;
355                tuli.Animation.Start();
356                pelaajaAskenOikealla = false;
357            }
358        };
359    }
360
361    void AJDefeated()
362    {
363        currentBoss.IsUpdated = false;
364        currentBoss.NeedsUpdateCall = false;
365
366        currentBoss.CanRotate = true;
367        currentBoss.IgnoresCollisionResponse = true;
368        currentBoss.AngularVelocity = 40.0;
369
370        jounihaviaa.Play();
371
372        PhysicsObject bBorder = Level.CreateBottomBorder();
373        bBorder.Tag = "bBorder";
374
375        AddCollisionHandler<PhysicsObject, PhysicsObject>(currentBoss, "bBorder", delegate {
376            Explosion rajahdys = new Explosion(1000);
377            rajahdys.Speed = 500.0;
378            rajahdys.Image = LoadImage("ydinpommi");
379            rajahdys.X = currentBoss.X;
380            rajahdys.Y = Camera.ScreenToWorld(new Vector(0.0, Screen.Bottom)).Y;
381            Add(rajahdys);
382            currentBoss.Destroy();
383
384            currentBoss = null;
385
386            PimennaRuutua(0.02, VoititPelin);
387        });
388    }
389
390    // Aliohjelmat
391}
Note: See TracBrowser for help on using the repository browser.