source: 2015/27/ohjaajat/TheLegendOfGabriel/TheLegendOfGabriel/TheLegendOfGabriel/LevelCreation.cs @ 6717

Revision 6717, 11.9 KB checked in by sieerinn, 4 years ago (diff)

Pelin voi nyt teoriassa pelata alusta loppuun läpi.

Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Jypeli;
6using Jypeli.Assets;
7using Jypeli.Widgets;
8
9/*
10 *Klassisia muistutuksia
11 * 3
12 * 2    Pelaajan päällä näkyvät elementit
13 * 1    Pelaaja, kojootit
14 * 0    Lisäkoriste
15 * -1   Perustiili
16 * -2
17 */
18
19
20public partial class TheLegendOfGabriel : PhysicsGame
21{
22    /// <summary>
23    /// Luo kentän .tmx tiedostosta.
24    /// </summary>
25    void CreateLevel(string levelName)
26    {
27        bossSpawnPositions.Clear();
28
29        var level = TiledTileMap.FromLevelAsset(levelName);
30        level.SetTileMethod("base", CreateBaseTile);
31        level.SetTileMethod("foreground", CreateForegroundTile);
32        level.SetObjectMethod("exit", CreateExit);
33        level.SetTileMethod("decoration", CreateDecoration);
34        level.SetTileMethod("cover", CreateCover);
35        level.SetObjectMethod("story", CreateEncounter);
36        //level.SetObjectMethod("player", CreatePlayer);
37        level.SetObjectMethod("blockade", CreateBlock);
38        level.SetObjectMethod("coyote", CreateCoyote);
39        level.SetObjectMethod("boss", CreateBoss);
40        level.SetObjectMethod("bossspawn", CreateBossSpawn);
41        level.SetObjectMethod("itemdrop", CreateItem);
42        level.Execute();
43
44       // Level.CreateBorders(false);
45
46        Level.Background.Color = Color.Black;
47    }
48
49    private void CreateItem(Vector position, double width, double height, Angle angle, Shape shape, string name, Dictionary<string, string> properties)
50    {
51        string itemname = properties["name"];
52
53        var images = new Dictionary<string, Image>();
54        images["pistol"] = GunImage;
55        images["grenade"] = GrenadeImage;
56        images["mask"] = MaskImage;
57
58        var item = PhysicsObject.CreateStaticObject(width, height, shape);
59        item.Tag = itemname;
60        item.Image = images[itemname];
61        item.Position = position;
62        item.IgnoresCollisionResponse = true;
63        Add(item);
64    }
65
66    void CreateEncounter(Vector position, double width, double height, Angle angle, Shape shape, string name, Dictionary<string, string> properties)
67    {
68        if (storyItems.Count < 2)
69        {
70            PhysicsObject invisible = new PhysicsObject(width, height) { IsVisible = false, Tag = "storyTime", IgnoresCollisionResponse = true };
71            invisible.MakeStatic();
72            Add(invisible);
73        }
74    }
75
76    void CreateBossSpawn(Vector position, double width, double height, Angle angle, Shape shape, string name, Dictionary<string, string> properties)
77    {
78        bossSpawnPositions.Add(position);
79    }
80
81    void CreateBoss(Vector position, double width, double height, Angle angle, Shape shape, string name, Dictionary<string, string> properties)
82    {
83        MediaPlayer.Play("boss");
84        MediaPlayer.IsRepeating = true;
85
86        BossHealth = new IntMeter(10, 0, 10);
87
88        var bar = new ProgressBar(Level.Width * 0.7, TILE_SIZE * 0.5);
89        bar.Y = Screen.Top - TILE_SIZE * 0.5;
90        bar.BindTo(BossHealth);
91        Add(bar);
92
93        // Juna ilmestyy välillä satunnaiseen spawniin.
94        var bossTimer = new Timer();
95        bossTimer.Interval = 8;
96        bossTimer.Timeout += delegate
97        {
98            // Luodaan päävaunu.
99            var pos = RandomGen.SelectOne<Vector>(bossSpawnPositions);
100            var train = CreateBossTrainPart(pos.X, pos.Y, trainAnimation);
101            double newPositionX = pos.X + train.Width;
102
103            // Luodaan muut vaunut.
104            int carriages = (int)(BossHealth.Value / (double)BossHealth.MaxValue * 6);
105            for (int i = 0; i < carriages; i++)
106            {
107                var part = CreateBossTrainPart(newPositionX, pos.Y, carriageAnimation);
108                newPositionX += part.Width;
109            }
110        };
111        bossTimer.Start();
112
113        BossHealth.LowerLimit += delegate
114        {
115            EnemyDieSound.Play();
116            bossTimer.Stop();
117            Timer.SingleShot(4.0, Victory);
118
119            foreach (var part in GetObjectsWithTag("boss"))
120            {
121                part.Destroy();
122                var smoke = new GameObject(80, 160);
123                smoke.X = part.X;
124                smoke.Bottom = part.Bottom;
125                smoke.Animation = new Animation(smokeAnimation);
126                smoke.Animation.Start(1);
127                smoke.Animation.Played += () => smoke.Destroy();
128                Add(smoke);
129            }
130        };
131    }
132
133    PhysicsObject CreateBossTrainPart(double left, double y, Animation anim)
134    {
135        var part = PhysicsObject.CreateStaticObject(70, 40);
136        part.Left = left;
137        part.Y = y;
138        part.Animation = anim;
139        part.Animation.Start();
140        part.Velocity = new Vector(-80, 0);
141        part.Tag = "boss";
142        part.CollisionIgnoreGroup = 3;
143        Add(part);
144
145        // Pala on näkyvillä vain kentän sisäpuolella.
146        var appearTimer = new Timer();
147        appearTimer.Interval = 0.05;
148        appearTimer.Timeout += delegate
149        {
150            part.IsVisible = part.Left < Level.Right;
151
152            if (part.Right < Level.Left)
153            {
154                part.Destroy();
155                appearTimer.Stop();
156            }
157        };
158        appearTimer.Start();
159
160        // Palat luo vihollisia jatkuvasti.
161        var enemySpawnTimer = new Timer();
162        enemySpawnTimer.Interval = 2.0;
163        enemySpawnTimer.Timeout += delegate
164        {
165            if (part.Right < Level.Right)
166            {
167                CreateNorwegianHammerThrower(part.Position, TILE_SIZE, TILE_SIZE, Angle.Zero, Shape.Rectangle, "", null);
168            }
169        };
170        enemySpawnTimer.Start();
171
172        part.Destroyed += delegate
173        {
174            appearTimer.Stop();
175            enemySpawnTimer.Stop();
176        };
177
178        return part;
179    }
180
181    /// <summary>
182    /// Näkymättömiä esteitä.
183    /// </summary>
184    void CreateBlock(Vector position, double width, double height, Angle angle, Shape shape, string name, Dictionary<string, string> properties)
185    {
186        PhysicsObject block = PhysicsObject.CreateStaticObject(width, height);
187        block.Position = position;
188        block.IsVisible = false;
189        Add(block);
190
191    }
192
193    void CreateCoyote(Vector position, double width, double height, Angle angle, Shape shape, string name, Dictionary<string, string> properties)
194    {
195        CreateEnemy(position, width, height, DirectionalAnimations(coyoteLeft, coyoteRight, coyoteUp, coyoteDown));
196    }
197
198    void CreateNorwegianHammerThrower(Vector position, double width, double height, Angle angle, Shape shape, string name, Dictionary<string, string> properties)
199    {
200        CreateEnemy(position, width, height, DirectionalAnimations(nWalkLeft, nWalkRight, nWalkUp, nWalkDown));
201    }
202
203    void CreateEnemy(Vector position, double width, double height, Dictionary<Direction, Animation> anims)
204    {
205        var enemy = new Creature(width, height, 1);
206        enemy.MoveAnimations = anims;
207        enemy.Image = enemy.MoveAnimations[Direction.Right].CurrentFrame;
208        enemy.Position = position;
209        enemy.Tag = "enemy";
210        enemy.Brain = new FollowerBrain(player) { Speed = 50 };
211        enemy.CollisionIgnoreGroup = 3;
212        Add(enemy, 1);
213        enemies.Add(enemy);
214
215        AddCollisionHandler(enemy, "playerattack", delegate(PhysicsObject e, PhysicsObject a)
216        {
217            enemy.Health.Value--;
218        });
219       
220        enemy.Health.LowerLimit += delegate
221        {
222            enemy.Destroy();
223            RandomItemDrop(enemy.Position);
224
225            EnemyDieSound.Play();
226
227            var smoke = new GameObject(20, 40);
228            smoke.X = enemy.X;
229            smoke.Bottom = enemy.Bottom;
230            smoke.Animation = new Animation(smokeAnimation);
231            smoke.Animation.Start(1);
232            smoke.Animation.Played += () => smoke.Destroy();
233            Add(smoke);
234        };
235    }
236
237    void RandomItemDrop(Vector position)
238    {
239        var chance = RandomGen.NextDouble(0, 100);
240        if (chance < 20)
241        {
242            int itemType = RandomGen.NextInt(1, 3);
243
244            if (itemType == 1 && player.Inventory.FirstOrDefault(i => i is Grenade) == null)
245                return;
246
247            if (itemType == 2 && player.Inventory.FirstOrDefault(i => i is Pistol) == null)
248                return;
249
250            var item = PhysicsObject.CreateStaticObject(10, 10);
251            item.Position = position;
252            item.Image = itemType == 1 ? GrenadeBoxImage : AmmoBoxImage;
253            item.Tag = itemType == 1 ? "grenadebox" : "ammobox";
254            item.IgnoresCollisionResponse = true;
255            Add(item);
256        }
257    }
258
259    /// <summary>
260    /// Maassa oleva tiili.
261    /// </summary>
262    void CreateBaseTile(Vector position, double width, double height, Image image, string layerName, Dictionary<string, string> properties)
263    {
264        CreateBasicTile(position, width, height, image, -1, properties);
265    }
266
267    /// <summary>
268    /// Pohjan päällä, pelaajan alla näkyvä tiili.
269    /// </summary>
270    void CreateDecoration(Vector position, double width, double height, Image image, string layerName, Dictionary<string, string> properties)
271    {
272        CreateBasicTile(position, width, height, image, 0, properties);
273    }
274
275    /// <summary>
276    /// Pelaajan päällä näkyvä tiili.
277    /// </summary>
278    void CreateForegroundTile(Vector position, double width, double height, Image image, string layerName, Dictionary<string, string> properties)
279    {
280        CreateBasicTile(position, width, height, image, 2, properties);
281    }
282
283    void CreateCover(Vector position, double width, double height, Image image, string layername, Dictionary<string, string> properties)
284    {
285        var tile = new GameObject(width, height);
286        tile.Tag = "cover";
287        tile.Image = image;
288        tile.Position = position;
289        Add(tile, 3);
290    }
291
292    /// <summary>
293    /// Luo tavallisen tiilen.
294    /// </summary>
295    void CreateBasicTile(Vector position, double width, double height, Image image, int layer, Dictionary<string, string> properties)
296    {
297        bool oil = properties.ContainsKey("damage") && properties["damage"] == "true";
298
299        bool solidTile = properties.ContainsKey("collide") || oil;
300        var tile =  solidTile? PhysicsObject.CreateStaticObject(width, height) : new GameObject(width, height);
301        tile.Image = image;
302        tile.Position = position;
303        if (oil)
304        {
305            ((PhysicsObject) tile).CollisionIgnoreGroup = 4;
306        }
307        Add(tile, layer);
308    }
309
310    /// <summary>
311    /// Luo uloskäynnin, joka vie toiseen kenttään.
312    /// </summary>
313    void CreateExit(Vector position, double width, double height, Angle angle, Shape shape, string name, Dictionary<string, string> properties)
314    {
315        var target = properties["goto"] == "disabled" ? null : properties["goto"].Split('@'); // Jos peli kaatuu tälle riville niin joltain exitiltä puuttuu goto-property.
316        var exit = new Exit(width, height);
317        exit.Position = position;
318        if (target != null)
319        {
320            exit.TargetLevel = target[0];
321            exit.TargetExitName = target[1];
322        }
323        exit.Name = name;
324        Add(exit);
325        exits.Add(exit);
326
327        bool create = properties.ContainsKey("block");
328        if(create && !woodDestroyed)
329        {
330            PhysicsObject fence = PhysicsObject.CreateStaticObject(TILE_SIZE, TILE_SIZE);
331            fence.Image = FenceImage;
332            fence.Position = exit.Position - new Vector(0, TILE_SIZE);
333            Add(fence, 3);
334
335            AddCollisionHandler(fence, "playerattack", delegate(PhysicsObject destroyable, PhysicsObject a)
336            {
337               destroyable.Destroy();
338               woodDestroyed = true;
339            });
340       
341        }
342    }
343}
Note: See TracBrowser for help on using the repository browser.