source: 2010/24/ramipasa/ALTKTileEngine/Peli.cs @ 878

Revision 878, 17.0 KB checked in by ramipasa, 11 years ago (diff)
Line 
1using System;                        // Tämän tarpeellisuus pitäisi olla itsestäänselvyys
2using Jypeli;                        // Jypeli
3using Jypeli.ScreenObjects;          // Jypeli.ScreenObjects
4using Jypeli.Assets;                 // Jypeli.Assets
5using System.Collections.Generic;    // Jypelin tutoriaali
6using System.IO;                     // Streamreader vaatii tämän
7using System.Windows.Forms;          // jotta voin näyttää msgboxeja
8using ALTKTechs;                     // Avaruuslaatikon moottorikomponentit
9using ALTKUnits;
10using ALTKCiv;
11using ALTKPromotions;
12using ALTKDiff;
13using ALTKAIBehaviour;
14using BaseRules;                     // Avaruuslaatikon sääntötiedosto, helpottaa modien tekemistä
15
16namespace ALTKTileEngine
17{
18    public class Peli : Game
19    {
20        bool gamestarted = false;
21        int currDiffLevel; // jotta tätä voidaan käyttää missä tahansa
22
23        int[,] TerrainMap; // perusmaastokartta
24        int[,] DTerrainMap; // erikoismaastokartta
25        int[,] OwnershipMap; // ruudukon omistuskartta (kenen pelaajan hallinnassa on mikäkin ruutu)
26
27        string Textpath;
28
29        // !!!!!!!!!!!!!!!!!!!!!!!!!!!
30        // Pitänee tehdä vielä yksi ALTKSUnit-namespace ALTKCoreen.
31        // Tämä sisältäisi tiedot yksiköiden omistajasta, yksikön perusyksiköstä ym. sekä myös karttakoordinaatit
32        // (karttakoordinaatit säilyttää myös UnitMap, josta on helppo tarkastaa esim. liikuttaessa yksiköitä, onko ruudussa jo esim. vihollisyksiköitä.
33       
34        int kartanLeveys;
35        int kartanKorkeus;
36
37        // perusmaastotyypit
38        const int Aavikko = 2, Tundra = 3, Vuoristo = 1, Lehtimetsa = 0;
39
40        // erikoismaastotyypit
41        const int Havumetsa = 2, Tyhja = 0, Kuusimetsa = 3;
42
43        // Pelissä on kaksi eri tasoa, toisella perusmaasto ja toisella tarkempaa tietoa (esim. onko ruutu metsää ym.)
44        GameObject[,] tile;
45        GameObject[,] DTile;
46        //Vector tileVector;
47
48        Vector CamSpeedEast = new Vector(20.0, .0);
49        Vector CamSpeedWest = new Vector(-20.0, .0);
50        Vector CamSpeedNorth = new Vector(.0, 20.0);
51        Vector CamSpeedSouth = new Vector(.0, -20.0);
52
53        // Käytän ennemmin enemmän muistia kuin prosessoria, joten lasken nämä jo täällä
54        int MouseScreenWidth;
55        int MouseScreenHeight;
56        int NegMouseScreenWidth;
57        int NegMouseScreenHeight;
58        protected override void Begin()
59        {
60            Textpath = Application.StartupPath + "\\Content\\Textures\\";
61            InitRules();
62            InitStartMenu();
63            //InitControls();
64            //InitMap();
65        }
66        void InitStartMenu()
67        {
68            Mouse.Enabled = true;
69            Mouse.IsCursorVisible = true;
70
71            GameObject TrainingButton = new GameObject(250, 30, Shapes.Rectangle);
72            GameObject EasyButton = new GameObject(250, 30, Shapes.Rectangle);
73            GameObject NormalButton = new GameObject(250, 30, Shapes.Rectangle);
74            GameObject HardButton = new GameObject(250, 30, Shapes.Rectangle);
75            GameObject VHardButton = new GameObject(250, 30, Shapes.Rectangle);
76            GameObject NightmareButton = new GameObject(250, 30, Shapes.Rectangle);
77            GameObject InsanityButton = new GameObject(250, 30, Shapes.Rectangle);
78            for (int a = 1; a <= 7; a++)
79            {
80                if (a == 1) { SetDiffButton(TrainingButton, 1); }
81                if (a == 2) { SetDiffButton(EasyButton, 2); }
82                if (a == 3) { SetDiffButton(NormalButton, 3); }
83                if (a == 4) { SetDiffButton(HardButton, 4); }
84                if (a == 5) { SetDiffButton(VHardButton, 5); }
85                if (a == 6) { SetDiffButton(NightmareButton, 6); }
86                if (a == 7) { SetDiffButton(InsanityButton, 7); }
87            }
88            Mouse.ListenOn(TrainingButton, MouseButton.Left, Jypeli.ButtonState.Down, SelectDifficulty, "", 1);
89            Mouse.ListenOn(EasyButton, MouseButton.Left, Jypeli.ButtonState.Down, SelectDifficulty, "", 2);
90            Mouse.ListenOn(NormalButton, MouseButton.Left, Jypeli.ButtonState.Down, SelectDifficulty, "", 3);
91            Mouse.ListenOn(HardButton, MouseButton.Left, Jypeli.ButtonState.Down, SelectDifficulty, "", 4);
92            Mouse.ListenOn(VHardButton, MouseButton.Left, Jypeli.ButtonState.Down, SelectDifficulty, "", 5);
93            Mouse.ListenOn(NightmareButton, MouseButton.Left, Jypeli.ButtonState.Down, SelectDifficulty, "", 6);
94            Mouse.ListenOn(InsanityButton, MouseButton.Left, Jypeli.ButtonState.Down, SelectDifficulty, "", 7);
95        }
96
97        void SetDiffButton(GameObject diffbutton, int difflevel)
98        {
99            diffbutton.X = -250;
100            diffbutton.Y = ((difflevel * -50) + 400);
101            if (difflevel == 1) { diffbutton.Image = LoadImage(Textpath + "training"); }
102            else if (difflevel == 2) { diffbutton.Image = LoadImage(Textpath + "easy"); }
103            else if (difflevel == 3) { diffbutton.Image = LoadImage(Textpath + "normal"); }
104            else if (difflevel == 4) { diffbutton.Image = LoadImage(Textpath + "hard"); }
105            else if (difflevel == 5) { diffbutton.Image = LoadImage(Textpath + "vhard"); }
106            else if (difflevel == 6) { diffbutton.Image = LoadImage(Textpath + "nightmare"); }
107            else if (difflevel == 7) { diffbutton.Image = LoadImage(Textpath + "insanity"); }
108            Add(diffbutton);
109            //return diffbutton;
110        }
111
112        void SelectDifficulty(int difflevel)
113        {
114            //ClearAll();
115            currDiffLevel = new int();
116            currDiffLevel = difflevel;
117            InitControls();
118            InitMap();
119            gamestarted = true;
120        }
121       
122        # region Kartan luominen
123
124        void InitMap()
125        {
126            //tileVector = new Vector();
127            Int32 num;
128            Int32 i;
129            Int32 j;
130            string mLine;
131            //string chars;
132            num = RandomGen.NextInt(1, 6);
133            //chars = " VAT";
134            TextReader bReader;
135            bReader = new StreamReader("Content\\Maps\\1\\base.txt");
136            //try
137            //{
138
139            // Yleensä kartan kaksi ensimmäistä riviä ovat kommentteja
140            bReader.ReadLine();
141            bReader.ReadLine();
142
143            kartanLeveys = Convert.ToInt32(bReader.ReadLine().Substring(9, 2));
144            kartanKorkeus = Convert.ToInt32(bReader.ReadLine().Substring(10, 2));
145
146            Int32 mapWidthJ = (kartanLeveys * 48) / 2;
147            Int32 mapHeightJ = (kartanKorkeus * 48) / 2;
148
149            bReader.ReadLine();
150            // Ladataan TerrainMapit muistiin myöhempää käyttöä varten
151
152            TerrainMap = new int[kartanKorkeus, kartanLeveys];
153            DTerrainMap = new int[kartanKorkeus, kartanLeveys];
154            OwnershipMap = new int[kartanKorkeus, kartanLeveys];
155            InitTerrain(0);
156            InitTerrain(1);
157            InitTerrain(2);
158
159            tile = new PhysicsObject[kartanKorkeus, kartanLeveys];
160            DTile = new PhysicsObject[kartanKorkeus, kartanLeveys];
161            InitTerrainGraphics(0);
162            InitTerrainGraphics(1);
163
164            // Koodi käännetty RGE:n VB.netistä
165            // Asettaa ja piirtää pohjamaaston
166
167            for (i = 0; i <= (kartanKorkeus - 1); i++)
168            {
169                mLine = bReader.ReadLine();
170                for (j = 0; j <= (kartanLeveys - 1); j++)
171                {
172                    // MessageBox.Show(mLine + " " + j + " " + i);
173                    TerrainMap[i, j] = getTerrainType(mLine.Substring(j, 1), 0, i, j);
174                    tile[i, j].Shape = Shapes.Rectangle;
175                    tile[i, j].X = (j * 48) - mapWidthJ;
176                    tile[i, j].Y = (i * 48) - mapHeightJ;
177                    tile[i, j].Image = LoadImage(getTexture_fromTerrainType(TerrainMap[i, j], 0, i, j));
178                    Add(tile[i, j]);
179                    // MessageBox.Show(Convert.ToString(TerrainMap[i, j]));
180                }
181            }
182
183            // Luetaan karttatiedoston rivivälit
184            bReader.ReadLine();
185            bReader.ReadLine();
186
187            // Asettaa ja piirtää erikoismaaston
188
189            for (i = 0; i <= (kartanKorkeus - 1); i++)
190            {
191                mLine = bReader.ReadLine();
192                for (j = 0; j <= (kartanLeveys - 1); j++)
193                {
194                    // MessageBox.Show(mLine + " " + j + " " + i);
195                    DTerrainMap[i, j] = getTerrainType(mLine.Substring(j, 1), 1, i, j);
196                    DTile[i, j].Shape = Shapes.Rectangle;
197                    DTile[i, j].X = (j * 48) - mapWidthJ;
198                    DTile[i, j].Y = (i * 48) - mapHeightJ;
199                    DTile[i, j].Image = LoadImage(getTexture_fromTerrainType(DTerrainMap[i, j], 1, i, j));
200                    Add(DTile[i, j]);
201                    // MessageBox.Show(Convert.ToString(TerrainMap[i, j]));
202                }
203            }
204            //catch
205            //{
206            //    MessageBox.Show("Map error!");
207            //    bReader.Close();
208            //    Exit();
209            //}
210            bReader.Close();
211            Level.BackgroundColor = Color.Black;
212        }
213
214        private void InitTerrain(int tlayer)
215        {
216            for (int a = 0; a <= (kartanKorkeus - 1); a++)
217            {
218                for (int b = 0; b <= (kartanLeveys - 1); b++)
219                {
220                    GetTerrainLayer(tlayer)[a, b] = new int();
221                }
222            }
223        }
224
225        int[,] GetTerrainLayer(int tlayer)
226        {
227            if (tlayer == 0) { return TerrainMap; }
228            if (tlayer == 1) { return DTerrainMap; }
229            if (tlayer == 2) { return OwnershipMap; }
230            return TerrainMap;
231        }
232
233        private void InitTerrainGraphics(int tlayer)
234        {
235            for (int a = 0; a <= (kartanKorkeus - 1); a++)
236            {
237                for (int b = 0; b <= (kartanLeveys - 1); b++)
238                {
239                    GetGraphicsLayer(tlayer)[a, b] = new PhysicsObject(48.0, 48.0);
240                }
241            }
242        }
243
244        GameObject[,] GetGraphicsLayer(int tlayer)
245        {
246            if (tlayer == 0) {return tile; }
247            if (tlayer == 1) {return DTile; }
248            return tile;
249        }
250
251        int getTerrainType(string ch, int terrainlayer, int i, int j)
252        {
253            if (terrainlayer == 0)
254            {
255                /*/ Maastotyypit
256                 * 0 = lehtimetsää
257                 * 1 = vuoristoa
258                 * 2 = aavikkoa
259                 * 3 = tundraa
260                /*/
261                if (ch == " ") { return Lehtimetsa; }
262                if (ch == "V") { return Vuoristo; }
263                if (ch == "A") { return Aavikko; }
264                if (ch == "T") { return Tundra; }
265            }
266            else if (terrainlayer == 1)
267            {
268                /*/ Erikoismaastotyypit
269                 * 0 = ei mitään
270                 * 1 = vuoristoa
271                 * 2 = metsää
272                /*/
273                if (ch == " ") { return Tyhja; }
274                if (ch == "M") { return Havumetsa; }
275                if (ch == "V") { return Vuoristo; }
276                if (ch == "K") { return Kuusimetsa; }
277                try
278                {
279                    int Playerstartloc;
280                    Playerstartloc = Convert.ToInt32(ch);
281                    AddStartingCity(Playerstartloc, i, j);
282                    return (Playerstartloc + 10);
283                }
284                catch
285                {
286                }
287                return Tyhja;
288            }
289            return 0;
290        }
291
292        private void AddStartingCity(int playernumber, int i, int j)
293        {
294            Rules.pCivs[playernumber].Enabled = true;
295            Rules.pCivs[playernumber].Production = Rules.pCivs[playernumber].Production + 10;
296            Rules.pCivs[playernumber].NumberofCities = Rules.pCivs[playernumber].NumberofCities + 1;
297            Rules.pCivs[playernumber].CityCoords[Rules.pCivs[playernumber].NumberofCities, 0] = i;
298            Rules.pCivs[playernumber].CityCoords[Rules.pCivs[playernumber].NumberofCities, 1] = j;
299            //DTile[i, j].Image.Name = "\\Content\\Textures\\cityancient";
300        }
301
302        string getTexture_fromTerrainType(int terraintype, int terrainlayer, int i, int j)
303        {
304            if (terrainlayer == 0)
305            {
306                if (terraintype == Lehtimetsa) { return Application.StartupPath + "\\Content\\Textures\\grassland"; }
307                if (terraintype == Vuoristo) { return Application.StartupPath + "\\Content\\Textures\\mountain"; }
308                if (terraintype == Aavikko) { return Application.StartupPath + "\\Content\\Textures\\desert"; }
309                if (terraintype == Tundra) { return Application.StartupPath + "\\Content\\Textures\\tundra"; }
310            }
311            else if (terrainlayer == 1)
312            {
313                if (terraintype == Tyhja) { return Application.StartupPath + "\\Content\\Textures\\nothing"; }
314                if (terraintype == Vuoristo) { return Application.StartupPath + "\\Content\\Textures\\mountain"; }
315                if (terraintype == Havumetsa) { return Application.StartupPath + "\\Content\\Textures\\forest"; }
316                if (terraintype == Kuusimetsa) { return Application.StartupPath + "\\Content\\Textures\\spruceforest"; }
317                // Jos terraintype on 10 tai enemmän, ruudussa on pelaajan kaupunki (ks. getTerrainType)
318                if (terraintype >= 10)
319                {
320                    if (TerrainMap[i, j] == Tundra)
321                    {
322                        return Application.StartupPath + "\\Content\\Textures\\cityancientTundra";
323                    }
324                    else
325                    {
326                        return Application.StartupPath + "\\Content\\Textures\\cityancient";
327                    }
328                }
329                return Application.StartupPath + "\\Content\\Textures\\nothing";
330            }
331            return Application.StartupPath + "\\Content\\Textures\\grassland.jpg";
332        }
333        # endregion
334
335        private void InitRules()
336        {
337            // Käytetään valmiiksi tehtyjä DLL-tiedostoja
338            BaseRules.Rules.InitTechs();
339            BaseRules.Rules.InitUnits();
340            BaseRules.Rules.InitCivs();
341        }
342
343        protected override void Update(Time time)
344        {
345            base.Update(time);
346            // Mouse.PositionOnScreen voisi olla vain positiivinen, eikä ruudun pitäisi jakautua keskeltä kahtia
347            // negatiivisiin ja positiivisiin kokonaislukuihin
348            if (Mouse.PositionOnScreen.X > MouseScreenWidth) { MoveCamera(0); }
349            else if (Mouse.PositionOnScreen.X < NegMouseScreenWidth) { MoveCamera(2); }
350            else if (Mouse.PositionOnScreen.Y > MouseScreenHeight) { MoveCamera(1); }
351            else if (Mouse.PositionOnScreen.Y < NegMouseScreenHeight) { MoveCamera(3); }
352        }
353
354        private void InitControls()
355        {
356            Keyboard.Listen(Key.Right, Jypeli.ButtonState.Down, MoveCamera, null, 0);
357            Keyboard.Listen(Key.Left, Jypeli.ButtonState.Down, MoveCamera, null, 2);
358            Keyboard.Listen(Key.Up, Jypeli.ButtonState.Down, MoveCamera, null, 1);
359            Keyboard.Listen(Key.Down, Jypeli.ButtonState.Down, MoveCamera, null, 3);
360
361            MouseScreenWidth = new int();
362            MouseScreenWidth = Convert.ToInt32(Peli.Screen.Width / 2) - 5;
363            MouseScreenHeight = new int();
364            MouseScreenHeight = Convert.ToInt32(Peli.Screen.Height / 2) - 5;
365            NegMouseScreenWidth = new int();
366            NegMouseScreenWidth = Convert.ToInt32(Peli.Screen.Width / -2) + 5;
367            NegMouseScreenHeight = new int();
368            NegMouseScreenHeight = Convert.ToInt32(Peli.Screen.Height / -2) + 20;
369        }
370
371        private void Mouse_Move()
372        {
373            // MessageBox.Show(Mouse.PositionOnScreen.X);
374        }
375
376        private void MoveCamera(Int32 dir)
377        {
378            if (gamestarted == false) { return; }
379            if ((dir == 0) && (Camera.Position.X < (tile[kartanKorkeus - 1, kartanLeveys - 1].X) - (Peli.Screen.Width / 2)))
380            {
381                Camera.Move(CamSpeedEast);
382            }
383            if ((dir == 1) && (Camera.Position.Y < (tile[kartanKorkeus - 1, kartanLeveys - 1].Y) - ((Peli.Screen.Height / 2) - 12)))
384            {
385                Camera.Move(CamSpeedNorth);
386            }
387            if ((dir == 2) && (Camera.Position.X > (tile[0, 0].X) + (Peli.Screen.Width / 2)))
388            {
389                Camera.Move(CamSpeedWest);
390            }
391            if ((dir == 3) && (Camera.Position.Y > (tile[0, 0].Y) + (Peli.Screen.Height / 2)))
392            {
393                Camera.Move(CamSpeedSouth);
394            }
395        }
396    }
397}
Note: See TracBrowser for help on using the repository browser.