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

Revision 869, 15.1 KB checked in by ramipasa, 10 years ago (diff)

Päivitetty ALTKCore.dll:ää (vaikeustasot ja tekoälyn käyttäytyminen) ja BaseRules?.dll:ää, pelissä voi nyt valita vaikeustasot (kuvat ovat väliaikaisia) ja kartan. Muitakin, pienempiä muutoksia.

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