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

Revision 941, 60.2 KB checked in by ramipasa, 11 years ago (diff)

Lisätty pelilogiikkaa (nyt 2500 riviä koodia!) ja selkeytetty käyttöliittymää.

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        int[,] ShroudMap; // pelaajan näkymää pienentävä Shroudmap
27        int[,] UnitMap; // yksikkökartta
28
29        string Textpath;
30        string OwnershipColorPath;
31
32        int AmountofPlayers; // Ihmispelaajien määrä, tällä hetkellä peli tukee vain yhtä
33        int TurnNumber; // vuoron numero
34        int CurrProduction; // pelaajan tämänhetkinen tuotanto
35
36        // !!!!!!!!!!!!!!!!!!!!!!!!!!!
37        // Pitänee tehdä vielä yksi ALTKSUnit-namespace ALTKCoreen.
38        // Tämä sisältäisi tiedot yksiköiden omistajasta, yksikön perusyksiköstä ym. sekä myös karttakoordinaatit
39        // (karttakoordinaatit säilyttää myös UnitMap, josta on helppo tarkastaa esim. liikuttaessa yksiköitä, onko ruudussa jo esim. vihollisyksiköitä.
40
41        int SelectedUnit = -1;
42
43        bool UnitsSelected = new bool();
44
45        TextDisplay TileDisp;
46        TextDisplay UnitStatsDisp;
47        TextDisplay ProductionDisp;
48        TextDisplay BuildCityDisp;
49        TextDisplay BuildUnitsDisp;
50        TextDisplay Unit1Disp;
51        TextDisplay Unit2Disp;
52        TextDisplay Unit3Disp;
53        TextDisplay Unit4Disp;
54        TextDisplay ResearchDisp;
55        TextDisplay ResearchableTech1;
56        TextDisplay ResearchableTech2;
57        TextDisplay ResearchableTech3;
58        TextDisplay ClicktoResearch;
59
60        int kartanLeveys;
61        int kartanKorkeus;
62
63        int CurrentPlayer;
64
65        // perusmaastotyypit
66        const int Aavikko = 2, Tundra = 3, Vuoristo = 1, Lehtimetsa = 0;
67
68        // erikoismaastotyypit
69        const int Havumetsa = 2, Tyhja = 0, Kuusimetsa = 3;
70
71        // Pelissä on viisi eri tasoa, toisella perusmaasto ja toisella tarkempaa tietoa (esim. onko ruutu metsää ym.)
72        // Kolmas taso kertoo, kenen valtion hallinnassa ruutu on, neljäs on Fog of War, ja viides piirtää yksiköt.
73        GameObject[,] tile;
74        GameObject[,] DTile;
75        GameObject[,] TileOwnership;
76        GameObject[,] ShroudTile;
77        GameObject[,] UnitTile;
78        //Vector tileVector;
79
80        Vector CamSpeedEast = new Vector(20.0, .0);
81        Vector CamSpeedWest = new Vector(-20.0, .0);
82        Vector CamSpeedNorth = new Vector(.0, 20.0);
83        Vector CamSpeedSouth = new Vector(.0, -20.0);
84
85        // Käytän ennemmin enemmän muistia kuin prosessoria, joten lasken nämä jo täällä
86        int MouseScreenWidth;
87        int MouseScreenHeight;
88        int NegMouseScreenWidth;
89        int NegMouseScreenHeight;
90        # region Aloitusruutuvalikko
91        protected override void Begin()
92        {
93            //SetWindowSize(true);
94            Textpath = Application.StartupPath + "\\Content\\Textures\\";
95            OwnershipColorPath = Textpath + "Ownership\\";
96            InitRules();
97            InitStartMenu();
98            //InitControls();
99            //InitMap();
100        }
101        void InitStartMenu()
102        {
103            Level.BackgroundColor = Color.Gray;
104            Mouse.Enabled = true;
105            Mouse.IsCursorVisible = true;
106
107            InputQueryWindow input = new InputQueryWindow();
108            input.InputConfirmed += Player_SetName;
109            input.QueryText.Text = "Kirjoita valtiosi nimi:";
110            input.Size = new Vector(300.0, 100.0);
111            input.Position = new Vector(-250.0, 350.0);
112            input.InputBox.BorderColor = Color.GreenYellow;
113            ShowWindow(input);
114
115            GameObject TrainingButton = new GameObject(250, 30, Shapes.Rectangle);
116            GameObject EasyButton = new GameObject(250, 30, Shapes.Rectangle);
117            GameObject NormalButton = new GameObject(250, 30, Shapes.Rectangle);
118            GameObject HardButton = new GameObject(250, 30, Shapes.Rectangle);
119            GameObject VHardButton = new GameObject(250, 30, Shapes.Rectangle);
120            GameObject NightmareButton = new GameObject(250, 30, Shapes.Rectangle);
121            GameObject InsanityButton = new GameObject(250, 30, Shapes.Rectangle);
122
123            for (int a = 0; a <= 6; a++)
124            {
125                if (a == 0) { SetDiffButton(TrainingButton, 0); }
126                if (a == 1) { SetDiffButton(EasyButton, 1); }
127                if (a == 2) { SetDiffButton(NormalButton, 2); }
128                if (a == 3) { SetDiffButton(HardButton, 3); }
129                if (a == 4) { SetDiffButton(VHardButton, 4); }
130                if (a == 5) { SetDiffButton(NightmareButton, 5); }
131                if (a == 6) { SetDiffButton(InsanityButton, 6); }
132            }
133            Mouse.ListenOn(TrainingButton, MouseButton.Left, Jypeli.ButtonState.Down, SelectDifficulty, "", 0);
134            Mouse.ListenOn(EasyButton, MouseButton.Left, Jypeli.ButtonState.Down, SelectDifficulty, "", 1);
135            Mouse.ListenOn(NormalButton, MouseButton.Left, Jypeli.ButtonState.Down, SelectDifficulty, "", 2);
136            Mouse.ListenOn(HardButton, MouseButton.Left, Jypeli.ButtonState.Down, SelectDifficulty, "", 3);
137            Mouse.ListenOn(VHardButton, MouseButton.Left, Jypeli.ButtonState.Down, SelectDifficulty, "", 4);
138            Mouse.ListenOn(NightmareButton, MouseButton.Left, Jypeli.ButtonState.Down, SelectDifficulty, "", 5);
139            Mouse.ListenOn(InsanityButton, MouseButton.Left, Jypeli.ButtonState.Down, SelectDifficulty, "", 6);
140        }
141
142        void Player_SetName(InputQueryWindow sender, string input)
143        {
144            Rules.pCivs[0].Name = input;
145            Rules.pCivs[0].HumanPlayer = true;
146            Rules.pCivs[0].Enabled = true;
147            Rules.pCivs[0].Color = "red";
148        }
149
150        void SetDiffButton(GameObject diffbutton, int difflevel)
151        {
152            diffbutton.X = 250;
153            diffbutton.Y = ((difflevel * -50) + 300);
154            if (difflevel == 0) { diffbutton.Image = LoadImage(Textpath + "training"); }
155            else if (difflevel == 1) { diffbutton.Image = LoadImage(Textpath + "easy"); }
156            else if (difflevel == 2) { diffbutton.Image = LoadImage(Textpath + "normal"); }
157            else if (difflevel == 3) { diffbutton.Image = LoadImage(Textpath + "hard"); }
158            else if (difflevel == 4) { diffbutton.Image = LoadImage(Textpath + "vhard"); }
159            else if (difflevel == 5) { diffbutton.Image = LoadImage(Textpath + "nightmare"); }
160            else if (difflevel == 6) { diffbutton.Image = LoadImage(Textpath + "insanity"); }
161            Add(diffbutton);
162            //return diffbutton;
163        }
164
165        void SelectDifficulty(int difflevel)
166        {
167            ClearAll();
168            currDiffLevel = new int();
169            currDiffLevel = difflevel;
170            InitControls();
171            InitMap();
172            gamestarted = true;
173        }
174        # endregion
175        # region Kartan luominen
176
177        void InitMap()
178        {
179            TurnNumber = new int();
180            AmountofPlayers = new int();
181            Int32 i;
182            Int32 j;
183            string mLine;
184            TextReader bReader;
185            bReader = new StreamReader("Content\\Maps\\1\\base.txt");
186            //try
187            //{
188
189            // Yleensä kartan kaksi ensimmäistä riviä ovat kommentteja
190            bReader.ReadLine();
191            bReader.ReadLine();
192
193            kartanLeveys = Convert.ToInt32(bReader.ReadLine().Substring(9, 2));
194            kartanKorkeus = Convert.ToInt32(bReader.ReadLine().Substring(10, 2));
195
196            Int32 mapWidthJ = (kartanLeveys * 48) / 2;
197            Int32 mapHeightJ = (kartanKorkeus * 48) / 2;
198
199            bReader.ReadLine();
200            // Ladataan TerrainMapit muistiin myöhempää käyttöä varten
201
202            TerrainMap = new int[kartanKorkeus, kartanLeveys];
203            DTerrainMap = new int[kartanKorkeus, kartanLeveys];
204            OwnershipMap = new int[kartanKorkeus, kartanLeveys];
205            ShroudMap = new int[kartanKorkeus, kartanLeveys];
206            UnitMap = new int[kartanKorkeus, kartanLeveys];
207            InitTerrain(0);
208            InitTerrain(1);
209            InitTerrain(2);
210            InitTerrain(3);
211            InitTerrain(4);
212
213            tile = new GameObject[kartanKorkeus, kartanLeveys];
214            DTile = new GameObject[kartanKorkeus, kartanLeveys];
215            TileOwnership = new GameObject[kartanKorkeus, kartanLeveys];
216            ShroudTile = new GameObject[kartanKorkeus, kartanLeveys];
217            UnitTile = new GameObject[kartanKorkeus, kartanLeveys];
218            InitTerrainGraphics(0);
219            InitTerrainGraphics(1);
220            InitTerrainGraphics(2);
221            InitTerrainGraphics(3);
222            InitTerrainGraphics(4);
223
224            for (i = 0; i <= (kartanKorkeus - 1); i++)
225            {
226                for (j = 0; j <= (kartanLeveys - 1); j++)
227                {
228                    UnitMap[i, j] = -1;
229                }
230            }
231
232            // Initialisoidaan Unitmap
233
234            for (i = 0; i <= (kartanKorkeus - 1); i++)
235            {
236                for (j = 0; j <= (kartanLeveys - 1); j++)
237                {
238                    UnitTile[i, j].Shape = Shapes.Rectangle;
239                    UnitTile[i, j].X = (j * 48) - mapWidthJ;
240                    UnitTile[i, j].Y = (i * 48) - mapHeightJ;
241                    UnitTile[i, j].Image = LoadImage(OwnershipColorPath + "unitsOnTile");
242                }
243            }
244
245            // Koodi käännetty RGE:n VB.netistä
246            // Asettaa ja piirtää pohjamaaston
247
248            for (i = 0; i <= (kartanKorkeus - 1); i++)
249            {
250                mLine = bReader.ReadLine();
251                for (j = 0; j <= (kartanLeveys - 1); j++)
252                {
253                    // MessageBox.Show(mLine + " " + j + " " + i);s
254                    tile[i, j].Shape = Shapes.Rectangle;
255                    tile[i, j].X = (j * 48) - mapWidthJ;
256                    tile[i, j].Y = (i * 48) - mapHeightJ;
257                    TerrainMap[i, j] = getTerrainType(mLine.Substring(j, 1), 0, i, j);
258                    tile[i, j].Image = LoadImage(getTexture_fromTerrainType(TerrainMap[i, j], 0, i, j));
259                    Add(tile[i, j]);
260                    Mouse.ListenOn(tile[i, j], MouseButton.Left, Jypeli.ButtonState.Pressed, TileClicked, "", i, j);
261                    //Mouse.ListenMovement(tile[i, j], showTileInfo_forTileDisp, null, i, j);
262                    // MessageBox.Show(Convert.ToString(TerrainMap[i, j]));
263                }
264            }
265
266            // Luetaan karttatiedoston rivivälit
267            bReader.ReadLine();
268            bReader.ReadLine();
269
270            // Rami 16. 6. 2010: Omistuskartta pitää sittenkin säätää ennen erikoismaastoa, sillä
271            // kaupungit ja omistusrinki piirretään erikoismaaston asettamiskoodin kutsusta
272            for (i = 0; i <= (kartanKorkeus - 1); i++)
273            {
274                for (j = 0; j <= (kartanLeveys - 1); j++)
275                {
276                    // MessageBox.Show(mLine + " " + j + " " + i);
277                    OwnershipMap[i, j] = -1;
278                    TileOwnership[i, j].Shape = Shapes.Rectangle;
279                    TileOwnership[i, j].X = (j * 48) - mapWidthJ;
280                    TileOwnership[i, j].Y = (i * 48) - mapHeightJ;
281                    //TileOwnership[i, j].Image = LoadImage(Textpath + "nothing"); poistettu optimisoinnin takia
282                    //Add(TileOwnership[i, j]); eihän näitä tarvitse vielä lisätä, optimisointia
283                    //MessageBox.Show(TileOwnership[i, j].X + "x" + TileOwnership[i, j].Y + " " + DTile[i, j].X + "x" + DTile[i, j].Y + " Params: " + i + " " + j);
284                    // MessageBox.Show(Convert.ToString(TerrainMap[i, j]));
285                }
286            }
287
288            // Initialisoidaan Shroudmap
289
290            for (i = 0; i <= (kartanKorkeus - 1); i++)
291            {
292                for (j = 0; j <= (kartanLeveys - 1); j++)
293                {
294                    ShroudMap[i, j] = 1;
295                    ShroudTile[i, j].Shape = Shapes.Rectangle;
296                    ShroudTile[i, j].X = (j * 48) - mapWidthJ;
297                    ShroudTile[i, j].Y = (i * 48) - mapHeightJ;
298                    ShroudTile[i, j].Image = LoadImage(Textpath + "fogofwar");
299                }
300            }
301
302
303            // Asettaa ja piirtää erikoismaaston
304
305            for (i = 0; i <= (kartanKorkeus - 1); i++)
306            {
307                mLine = bReader.ReadLine();
308                for (j = 0; j <= (kartanLeveys - 1); j++)
309                {
310                    DTile[i, j].Shape = Shapes.Rectangle;
311                    DTile[i, j].X = (j * 48) - mapWidthJ;
312                    DTile[i, j].Y = (i * 48) - mapHeightJ;
313                    DTerrainMap[i, j] = getTerrainType(mLine.Substring(j, 1), 1, i, j);
314                    DTile[i, j].Image = LoadImage(getTexture_fromTerrainType(DTerrainMap[i, j], 1, i, j));
315                    Add(DTile[i, j]);
316                    if (getTexture_fromTerrainType(DTerrainMap[i, j], 1, i, j).Contains("city"))
317                    {
318                        DrawOwnership(i, j);
319                    }
320                }
321            }
322
323            // Piirretään ShroudTile vasta tässä, jotta se olisi DTilen päällä
324            for (i = 0; i <= (kartanKorkeus - 1); i++)
325            {
326                for (j = 0; j <= (kartanLeveys - 1); j++)
327                {
328                    if (ShroudMap[i, j] == 1)
329                    {
330                       Add(ShroudTile[i, j]);
331                    }
332                }
333            }
334
335            //catch
336            //{
337            //    MessageBox.Show("Map error!");
338            //    bReader.Close();
339            //    Exit();
340            //}
341            bReader.Close();
342            //for (int playernumber = 0; playernumber <= 30; playernumber++)
343            //{
344            //    Rules.pCivs[playernumber].Color = setAIOwnershipColor(playernumber);
345            //}
346            Level.BackgroundColor = Color.Black;
347            InitGUI();
348
349            Application.DoEvents();
350            TurnSystem_Start(0); // Antaa pelin alkaa!
351        }
352
353        private void InitTerrain(int tlayer)
354        {
355            for (int a = 0; a <= (kartanKorkeus - 1); a++)
356            {
357                for (int b = 0; b <= (kartanLeveys - 1); b++)
358                {
359                    GetTerrainLayer(tlayer)[a, b] = new int();
360                }
361            }
362        }
363
364        int[,] GetTerrainLayer(int tlayer)
365        {
366            if (tlayer == 0) { return TerrainMap; }
367            if (tlayer == 1) { return DTerrainMap; }
368            if (tlayer == 2) { return OwnershipMap; }
369            if (tlayer == 3) { return ShroudMap; }
370            if (tlayer == 4) { return UnitMap; }
371            return TerrainMap;
372        }
373
374        private void InitTerrainGraphics(int tlayer)
375        {
376            for (int a = 0; a <= (kartanKorkeus - 1); a++)
377            {
378                for (int b = 0; b <= (kartanLeveys - 1); b++)
379                {
380                    GetGraphicsLayer(tlayer)[a, b] = new PhysicsObject(48.0, 48.0);
381                }
382            }
383        }
384
385        GameObject[,] GetGraphicsLayer(int tlayer)
386        {
387            if (tlayer == 0) {return tile; }
388            if (tlayer == 1) {return DTile; }
389            if (tlayer == 2) { return TileOwnership; }
390            if (tlayer == 3) { return ShroudTile; }
391            if (tlayer == 4) { return UnitTile; }
392            return tile;
393        }
394
395        int getTerrainType(string ch, int terrainlayer, int i, int j)
396        {
397            if (terrainlayer == 0)
398            {
399                /*/ Maastotyypit
400                 * 0 = lehtimetsää
401                 * 1 = vuoristoa
402                 * 2 = aavikkoa
403                 * 3 = tundraa
404                /*/
405                if (ch == " ") { return Lehtimetsa; }
406                if (ch == "V") { return Vuoristo; }
407                if (ch == "A") { return Aavikko; }
408                if (ch == "T") { return Tundra; }
409            }
410            else if (terrainlayer == 1)
411            {
412                /*/ Erikoismaastotyypit
413                 * 0 = ei mitään
414                 * 1 = vuoristoa
415                 * 2 = metsää
416                 * 3 = kuusimetsää
417                /*/
418                if (ch == " ") { return Tyhja; }
419                if (ch == "M") { return Havumetsa; }
420                if (ch == "V") { return Vuoristo; }
421                if (ch == "K") { return Kuusimetsa; }
422                try
423                {
424                    //MessageBox.Show(TileOwnership[i, j].X + "x" + TileOwnership[i, j].Y + " " + DTile[i, j].X + "x" + DTile[i, j].Y + " Params: " + i + " " + j);
425                    int Playerstartloc;
426                    Playerstartloc = Convert.ToInt32(ch);
427                    AmountofPlayers = AmountofPlayers + 1;
428                    AddStartingCity(Playerstartloc, i, j);
429                    return (Playerstartloc + 10);
430                }
431                catch
432                {
433                }
434                return Tyhja;
435            }
436            return 0;
437        }
438
439        private void TileClicked(int i, int j)
440        {
441            //MessageBox.Show(OwnershipMap[i, j] + " " + UnitMap[i, j]);
442            if (OwnershipMap[i, j] == 0 && UnitMap[i, j] > -1)
443            {
444                UnitSelect(i, j);
445            }
446        }
447
448        private void UnitSelect(int i, int j)
449        {
450            //MessageBox.Show("UnitSelect: " + Convert.ToString(Rules.pCivs[CurrentPlayer].Units[GetUnit_FromPositionForSelection(i, j)].CurrentMovementPoints));
451            if (Rules.pCivs[CurrentPlayer].Units[GetUnit_FromPositionForSelection(i, j)].CurrentMovementPoints > 0)
452            {
453                MessageDisplay.Add("Valitsit yksikön " + Rules.pCivs[CurrentPlayer].Units[GetUnit_FromPositionForSelection(i, j)].UnitType.Name + " kohteesta " + Rules.pCivs[CurrentPlayer].Units[GetUnit_FromPositionForSelection(i, j)].PosY + "; " + Rules.pCivs[CurrentPlayer].Units[GetUnit_FromPositionForSelection(i, j)].PosX);
454                MessageDisplay.Add("Liikuta valittua yksikköä Numpadista.");
455                UnitStatsDisp.Text = "Valittu yksikkö:" + Environment.NewLine + Rules.pCivs[CurrentPlayer].Units[GetUnit_FromPositionForSelection(i, j)].UnitType.Name +
456                    Environment.NewLine + "-Voimakkuus: " + Rules.pCivs[CurrentPlayer].Units[GetUnit_FromPositionForSelection(i, j)].UnitType.Strength + Environment.NewLine +
457                    "-Liikkuvuus: " + Rules.pCivs[CurrentPlayer].Units[GetUnit_FromPositionForSelection(i, j)].UnitType.Movement + Environment.NewLine +
458                    Rules.pCivs[CurrentPlayer].Units[GetUnit_FromPositionForSelection(i, j)].UnitType.Description + Environment.NewLine + 
459                    " HP: " + Rules.pCivs[CurrentPlayer].Units[GetUnit_FromPositionForSelection(i, j)].HP * 100 + "/100";
460                SelectedUnit = GetUnit_FromPositionForSelection(i, j);
461                UnitTile[i, j].Image = LoadImage(OwnershipColorPath + "unitsOnTileSelected");
462                UnitsSelected = true;
463                //Keyboard.Enable(Key.NumPad1);
464                //Keyboard.Enable(Key.NumPad2);
465                //Keyboard.Enable(Key.NumPad3);
466                //Keyboard.Enable(Key.NumPad4);
467                //Keyboard.Enable(Key.NumPad5);
468                //Keyboard.Enable(Key.NumPad6);
469                //Keyboard.Enable(Key.NumPad7);
470                //Keyboard.Enable(Key.NumPad8);
471                //Keyboard.Enable(Key.NumPad9);
472            }
473        }
474       
475        private void DrawOwnership(int i, int j)
476        {
477            if (ShroudMap[i, j] == 0 && TileOwnership[i, j].IsAddedToGame == false)
478            {
479                TileOwnership[i, j].Image = LoadImage(OwnershipColorPath + Rules.pCivs[OwnershipMap[i, j]].Color);
480                Add(TileOwnership[i, j]);
481            }
482            //MessageBox.Show(TileOwnership[i, j].X + "x" + TileOwnership[i, j].Y + " " + DTile[i, j].X + "x" + DTile[i, j].Y + " Params: " + i + " " + j);
483        }
484
485        private void DrawUnit(int i, int j)
486        {
487            if (UnitTile[i, j].IsAddedToGame == false)
488            {
489                Add(UnitTile[i, j]);
490                //Mouse.ListenOn(UnitTile[i, j], MouseButton.Left, Jypeli.ButtonState.Pressed, UnitSelect, "Valitse yksikkö painamalla ruutua", i, j);
491            }
492        }
493
494        private void RemoveOwnership(int i, int j)
495        {
496            OwnershipMap[i, j] = -1;
497            TileOwnership[i, j].Destroy();
498        }
499
500        private void AddStartingCity(int playernumber, int i, int j)
501        {
502            //MessageBox.Show(TileOwnership[i, j].X + "x" + TileOwnership[i, j].Y + " " + DTile[i, j].X + "x" + DTile[i, j].Y + " Params: " + i + " " + j);
503            Rules.pCivs[playernumber].Production = Rules.pCivs[playernumber].Production + 10;
504            Rules.pCivs[playernumber].CityCoords[Rules.pCivs[playernumber].NumberofCities, 0] = i;
505            Rules.pCivs[playernumber].CityCoords[Rules.pCivs[playernumber].NumberofCities, 1] = j;
506            Rules.pCivs[playernumber].NumberofCities = Rules.pCivs[playernumber].NumberofCities + 1;
507            //MessageBox.Show("AddStartingCity: " + i + " " + j + " Playernumber: " + playernumber + "CityCoords: " + Rules.pCivs[playernumber].CityCoords[0, 0] + " " + Rules.pCivs[playernumber].CityCoords[0, 1]);
508            if (Rules.pCivs[playernumber].HumanPlayer == false)
509            {
510                Rules.pCivs[playernumber].Color = setAIOwnershipColor(playernumber);
511                Rules.pCivs[playernumber].Enabled = true;
512                Rules.pCivs[playernumber].Name = Rules.pCivs[playernumber].Color + " " + "Empire";
513            }
514            else
515            {
516                CheckAndRemoveShroud_FromPos(i, j);
517            }
518            OwnershipMap[i, j] = playernumber;
519            // 16. 6. 2010: Kutsutaanpa DrawOwnership sittenkin vasta kaupungin piirtämisen jälkeen (ks. InitMap ja DTilen asettaminen)
520            //DrawOwnership(i, j);
521
522            //DTile[i, j].Image = LoadImage("\\Content\\Textures\\cityancient");
523        }
524
525        // Aliohjelma yksikön luomiseen
526        private void CreateUnit(int i, int j, ALTKUnits.UnitClass unittype, int civnumber)
527        {
528            //MessageBox.Show(i + " " + j);
529            Rules.pCivs[civnumber].Units[Rules.pCivs[civnumber].NumberofUnits] = new BaseRules.Unit();
530            Rules.pCivs[civnumber].Units[Rules.pCivs[civnumber].NumberofUnits].HP = 1.00;
531            Rules.pCivs[civnumber].Units[Rules.pCivs[civnumber].NumberofUnits].PosY = i;
532            Rules.pCivs[civnumber].Units[Rules.pCivs[civnumber].NumberofUnits].PosX = j;
533            Rules.pCivs[civnumber].Units[Rules.pCivs[civnumber].NumberofUnits].UnitType = unittype;
534            Rules.pCivs[civnumber].NumberofUnits = Rules.pCivs[civnumber].NumberofUnits + 1;
535            UnitMap[i, j] = civnumber;
536
537            DrawUnit(i, j);
538
539            if (OwnershipMap[i, j] == -1)
540            {
541            }
542            else
543            {
544                OwnershipMap[i, j] = civnumber;
545                DrawOwnership(i, j);
546            }
547        }
548
549        public string GetUnits_FromPositionForView(int i, int j)
550        {
551            //MessageBox.Show("GetUnits...");
552            string units = "";
553            int civid;
554            civid = OwnershipMap[i, j];
555            //int[] UnitAmount = new int[23];
556            //MessageBox.Show("GetUnits... Stage 0.5");
557            //for (int c = 0; c <= 23; c++)
558            //{
559                //MessageBox.Show("GetUnits... Stage 0.8");
560                //UnitAmount[c] = new int();
561            //}
562            //MessageBox.Show("GetUnits... Stage 1");
563            for (int a = 0; a <= Rules.pCivs[civid].NumberofUnits - 1; a++)
564            {
565                //MessageBox.Show("GetUnits... Stage 2");
566                if (Rules.pCivs[civid].Units[a].PosY == i && Rules.pCivs[civid].Units[a].PosX == j) // && (units.Contains(Rules.pCivs[civid].Units[a].UnitType.Name)))
567                {
568                    //MessageBox.Show("ffff");
569                    // UnitAmount[Rules.pCivs[civid].Units[a].UnitType.UnitId] = UnitAmount[Rules.pCivs[civid].Units[a].UnitType.UnitId] + 1;
570                    units = units + Rules.pCivs[civid].Units[a].UnitType.Name + "(" + BaseRules.Rules.GetUnitType_FromInt(Rules.pCivs[civid].Units[a].UnitType.UnitType) + BaseRules.Rules.GetMountedStatus_FromBool(Rules.pCivs[civid].Units[a].UnitType.Mounted) + ") HP: " + Rules.pCivs[civid].Units[a].HP * 100 + ";; " + Rules.pCivs[civid].Units[a].UnitType.Strength + " : " + 
571                        Rules.pCivs[civid].Units[a].UnitType.Movement + " : " + Rules.pCivs[civid].Units[a].UnitType.Description + Environment.NewLine;
572                        //UnitAmount[Rules.pCivs[civid].Units[a].UnitType.UnitId] = Rules.pCivs[civid].Units[a].UnitType.UnitId + 1;
573                }
574            }
575            return units;
576            //}
577            //return units;
578            //MessageBox.Show(units);
579            //MessageBox.Show("GetUnits... Stage 5");
580            //for (int b = 0; b <= 23; b++)
581            //{
582            //    if (UnitAmount[b] > 0)
583            //    {
584            //        // MessageBox.Show("GetUnits... Stage 6");
585            //        if (UnitAmount[b] > 1)
586            //        {
587            //            //MessageBox.Show("GetUnits... Stage 7");
588            //            units = units + BaseRules.Rules.getUnit_FromId(UnitAmount[b]).Name + " x" + UnitAmount[b] + Environment.NewLine;
589            //            return units;
590            //        }
591            //        else if (UnitAmount[b] == 1)
592            //        {
593            //             // MessageBox.Show("GetUnits... Stage 8");
594            //            units = units + BaseRules.Rules.getUnit_FromId(UnitAmount[b]).Name + Environment.NewLine;
595            //            return units;
596            //        }
597            //    }
598            //}
599            //return units;
600            //    //MessageBox.Show("GetUnits... Stage 9");
601
602           // MessageBox.Show("GetUnits... Stage 10");
603        }
604
605        public int GetUnit_FromPositionForSelection(int i, int j)
606        {
607            int civid;
608            civid = OwnershipMap[i, j];
609            for (int a = 0; a <= Rules.pCivs[civid].NumberofUnits - 1; a++)
610            {
611                if (Rules.pCivs[civid].Units[a].PosY == i && Rules.pCivs[civid].Units[a].PosX == j)
612                {
613                    return a;
614                }
615            }
616            return -1;
617        }
618
619        public int GetUnit_FromPositionForRemoval(int i, int j, ALTKUnits.UnitClass unittype, double unitHP)
620        {
621           // MessageBox.Show("GetUnit_FromPosition: " + i + " " + j);
622            int civid;
623            civid = OwnershipMap[i, j];
624            for (int a = 0; a <= Rules.pCivs[civid].NumberofUnits - 1; a++)
625            {
626                if (Rules.pCivs[civid].Units[a].PosY == i && Rules.pCivs[civid].Units[a].PosX == j && Rules.pCivs[civid].Units[a].UnitType.Equals(unittype) && Rules.pCivs[civid].Units[a].HP == unitHP)
627                {
628                    return a;
629                }
630            }
631            return -1;
632        }
633
634        private void RemoveUnit(int i, int j, int civnumber, ALTKUnits.UnitClass unittype, double unitHP)
635        {
636            MessageBox.Show(i + " " + j + " " + civnumber);
637            int unitpos = GetUnit_FromPositionForRemoval(i, j, unittype, unitHP);
638            if (unitpos > 0 && Rules.pCivs[civnumber].NumberofUnits > 2)
639            {
640                MessageBox.Show("FirstMethod");
641                for (int a = unitpos + 1; a <= Rules.pCivs[civnumber].NumberofUnits - 1; a++)
642                {
643                    Rules.pCivs[civnumber].Units[a - 1].HP = Rules.pCivs[civnumber].Units[a].HP;
644                    Rules.pCivs[civnumber].Units[a - 1].PosY = Rules.pCivs[civnumber].Units[a].PosY;
645                    Rules.pCivs[civnumber].Units[a - 1].PosX = Rules.pCivs[civnumber].Units[a].PosX;
646                    Rules.pCivs[civnumber].Units[a - 1].UnitType = Rules.pCivs[civnumber].Units[a].UnitType;
647                }
648                Rules.pCivs[civnumber].Units[Rules.pCivs[civnumber].NumberofUnits - 1].PosX = 0;
649                Rules.pCivs[civnumber].Units[Rules.pCivs[civnumber].NumberofUnits - 1].PosY = 0;
650                Rules.pCivs[civnumber].Units[Rules.pCivs[civnumber].NumberofUnits - 1].HP = 0.0;
651                Rules.pCivs[civnumber].Units[Rules.pCivs[civnumber].NumberofUnits - 1].UnitType = null;
652            }
653            else if (unitpos == 0 && Rules.pCivs[civnumber].NumberofUnits > 1)
654            {
655                MessageBox.Show("SecondMethod");
656                for (int a = 1; a <= Rules.pCivs[civnumber].NumberofUnits - 1; a++)
657                {
658                    Rules.pCivs[civnumber].Units[a - 1].HP = Rules.pCivs[civnumber].Units[a].HP;
659                    Rules.pCivs[civnumber].Units[a - 1].PosY = Rules.pCivs[civnumber].Units[a].PosY;
660                    Rules.pCivs[civnumber].Units[a - 1].PosX = Rules.pCivs[civnumber].Units[a].PosX;
661                    Rules.pCivs[civnumber].Units[a - 1].UnitType = Rules.pCivs[civnumber].Units[a].UnitType;
662                }
663                Rules.pCivs[civnumber].Units[Rules.pCivs[civnumber].NumberofUnits - 1].PosX = 0;
664                Rules.pCivs[civnumber].Units[Rules.pCivs[civnumber].NumberofUnits - 1].PosY = 0;
665                Rules.pCivs[civnumber].Units[Rules.pCivs[civnumber].NumberofUnits - 1].HP = 0.0;
666                Rules.pCivs[civnumber].Units[Rules.pCivs[civnumber].NumberofUnits - 1].UnitType = null;
667            }
668            else if (unitpos == 0 && Rules.pCivs[civnumber].NumberofUnits == 1)
669            {
670                MessageBox.Show("ThirdMethod");
671                Rules.pCivs[civnumber].Units[Rules.pCivs[civnumber].NumberofUnits - 1].PosX = 0;
672                Rules.pCivs[civnumber].Units[Rules.pCivs[civnumber].NumberofUnits - 1].PosY = 0;
673                Rules.pCivs[civnumber].Units[Rules.pCivs[civnumber].NumberofUnits - 1].HP = 0.0;
674                Rules.pCivs[civnumber].Units[Rules.pCivs[civnumber].NumberofUnits - 1].UnitType = null;
675            }
676            Rules.pCivs[civnumber].NumberofUnits = Rules.pCivs[civnumber].NumberofUnits - 1;
677        }
678        public string setAIOwnershipColor(int playernumber)
679        {
680            int c;
681            int b;
682            bool ColorInUse = false;
683            for (b = 0; b <= 20; b++)
684            {
685                ColorInUse = false;
686                for (c = 0; c <= 30; c++)
687                {
688                    if (Rules.pCivs[c].Color == getOwnershipColor_fromInt(b))
689                    {
690                        ColorInUse = true;
691                    }
692                }
693                if (ColorInUse == false)
694                {
695                    return getOwnershipColor_fromInt(b);
696                }
697            }
698            return getOwnershipColor_fromInt(0);
699        }
700
701        public string getOwnershipColor_fromInt(Int32 color)
702        {
703            if (color == 0) { return "Aqua"; }
704            if (color == 1) { return "Beige"; }
705            if (color == 2) { return "Limegreen"; }
706            if (color == 3) { return "Orange"; }
707            if (color == 4) { return "Black"; }
708            if (color == 5) { return "Red"; }
709            if (color == 6) { return "Rustred"; }
710            if (color == 7) { return "Yellow"; }
711            if (color == 8) { return "Blue"; }
712            if (color == 9) { return "Darkblue"; }
713            if (color == 10) { return "Darkgreen"; }
714            if (color == 11) { return "Lightblue"; }
715            if (color == 12) { return "Purple"; }
716            if (color == 13) { return "Darkpurple"; }
717            if (color == 14) { return "Lightpurple"; }
718            if (color == 15) { return "Gold"; }
719            if (color == 16) { return "Silver"; }
720            if (color == 17) { return "Pink"; }
721            if (color == 18) { return "Teal"; }
722            if (color == 19) { return "Greenyellow"; }
723            if (color == 20) { return "Darkorange"; }
724            if (color == 21) { return "White"; }
725            if (color == 22) { return "Darkgray"; }
726            return "Aqua";
727        }
728
729        string getTexture_fromTerrainType(int terraintype, int terrainlayer, int i, int j)
730        {
731            if (terrainlayer == 0)
732            {
733                if (terraintype == Lehtimetsa) { return Application.StartupPath + "\\Content\\Textures\\grassland"; }
734                if (terraintype == Vuoristo) { return Application.StartupPath + "\\Content\\Textures\\mountain"; }
735                if (terraintype == Aavikko) { return Application.StartupPath + "\\Content\\Textures\\desert"; }
736                if (terraintype == Tundra) { return Application.StartupPath + "\\Content\\Textures\\tundra"; }
737            }
738            else if (terrainlayer == 1)
739            {
740                if (terraintype == Tyhja) { return Application.StartupPath + "\\Content\\Textures\\nothing"; }
741                if (terraintype == Vuoristo) { return Application.StartupPath + "\\Content\\Textures\\mountain"; }
742                if (terraintype == Havumetsa) { return Application.StartupPath + "\\Content\\Textures\\forest"; }
743                if (terraintype == Kuusimetsa)
744                {
745                    if (TerrainMap[i, j] == 3)
746                    {
747                        return Application.StartupPath + "\\Content\\Textures\\spruceforestS";
748                    }
749                    else
750                    {
751                        return Application.StartupPath + "\\Content\\Textures\\spruceforest";
752                    }
753                }
754                // Jos terraintype on 10 tai enemmän, ruudussa on pelaajan kaupunki (ks. getTerrainType)
755                if (terraintype >= 10)
756                {
757                    if (TerrainMap[i, j] == Tundra)
758                    {
759                        return Application.StartupPath + "\\Content\\Textures\\cityancientTundra";
760                        //DrawOwnership(i, j);
761                    }
762                    else
763                    {
764                        return Application.StartupPath + "\\Content\\Textures\\cityancient";
765                    }
766                }
767                return Application.StartupPath + "\\Content\\Textures\\nothing";
768            }
769            return Application.StartupPath + "\\Content\\Textures\\grassland.jpg";
770        }
771        # endregion
772
773        private void InitGUI()
774        {
775            TileDisp = new TextDisplay();
776            TileDisp.X = Screen.Left + 120;
777            TileDisp.Y = Screen.Bottom + 200;
778            TileDisp.TextColor = Color.White;
779
780            UnitStatsDisp = new TextDisplay();
781            UnitStatsDisp.X = Screen.Left + 300;
782            UnitStatsDisp.Y = Screen.Bottom + 400;
783            UnitStatsDisp.Text = "d23";
784            UnitStatsDisp.TextColor = Color.DarkRed;
785
786            ProductionDisp = new TextDisplay();
787            ProductionDisp.X = Screen.Right - 150;
788            ProductionDisp.Y = Screen.Top - 50;
789            ProductionDisp.Text = "Tuotanto: 10/120";
790            ProductionDisp.TextColor = Color.Wheat;
791
792            BuildCityDisp = new TextDisplay();
793            BuildCityDisp.X = Screen.Right - 180;
794            BuildCityDisp.Y = Screen.Top - 150;
795            BuildCityDisp.TextColor = Color.Green;
796            BuildCityDisp.Text = "Rakenna kaupunki";
797            //BuildCityDisp.ClickEventHandler bCityHandler = new ScreenObject.ClickEventHandler(BuildCityDisp);
798
799            Mouse.ListenOn(BuildCityDisp, MouseButton.Left, Jypeli.ButtonState.Pressed, BuildCityClicked, "Rakenna kaupunki");
800
801            BuildUnitsDisp = new TextDisplay();
802            BuildUnitsDisp.X = Screen.Right - 120;
803            BuildUnitsDisp.Y = Screen.Top - 200;
804            BuildUnitsDisp.TextColor = Color.Green;
805            BuildUnitsDisp.Text = "Rakenna yksiköitä";
806
807            Unit1Disp = new TextDisplay();
808            Unit1Disp.X = Screen.Right - 100;
809            Unit1Disp.Y = Screen.Top - 250;
810            Unit1Disp.TextColor = Color.DarkGreen;
811            Unit1Disp.Text = "1. puun yksikkö";
812
813            Unit2Disp = new TextDisplay();
814            Unit2Disp.X = Screen.Right - 100;
815            Unit2Disp.Y = Screen.Top - 300;
816            Unit2Disp.TextColor = Color.DarkGreen;
817            Unit2Disp.Text = "2. puun yksikkö";
818
819            Unit3Disp = new TextDisplay();
820            Unit3Disp.X = Screen.Right - 100;
821            Unit3Disp.Y = Screen.Top - 350;
822            Unit3Disp.TextColor = Color.DarkGreen;
823            Unit3Disp.Text = "3. puun yksikkö";
824
825            Unit4Disp = new TextDisplay();
826            Unit4Disp.X = Screen.Right - 100;
827            Unit4Disp.Y = Screen.Top - 400;
828            Unit4Disp.TextColor = Color.DarkGreen;
829            Unit4Disp.Text = "4. puun yksikkö";
830
831            ResearchDisp = new TextDisplay();
832            ResearchDisp.X = Screen.Right - 200;
833            ResearchDisp.Y = Screen.Top - 500;
834            ResearchDisp.TextColor = Color.Green;
835            ResearchDisp.Text = "Teknologia:" + Environment.NewLine + "Horseback Riding 199/200";
836
837            ResearchableTech1 = new TextDisplay();
838            ResearchableTech2 = new TextDisplay();
839            ResearchableTech3 = new TextDisplay();
840
841            ClicktoResearch = new TextDisplay();
842            ClicktoResearch.X = Screen.Right - 200;
843            ClicktoResearch.Y = Screen.Top - 600;
844            ClicktoResearch.TextColor = Color.Green;
845            ClicktoResearch.Text = "Kehitä teknologiaa";
846
847            MessageDisplay.TextColor = Color.Orange;
848
849            Add(TileDisp);
850            Add(UnitStatsDisp);
851            Add(ProductionDisp);
852            Add(BuildCityDisp);
853            Add(BuildUnitsDisp);
854            //Add(Unit1Disp);
855            //Add(Unit2Disp);
856            //Add(Unit3Disp);
857            //Add(Unit4Disp);
858            Add(ResearchDisp);
859            Add(ClicktoResearch);
860        }
861
862        private void BuildCityClicked()
863        {
864            Rules.pCivs[CurrentPlayer].BuiltFromCity = Rules.pCivs[CurrentPlayer].BuiltFromCity + CurrProduction;
865        }
866
867        private void InitRules()
868        {
869            // Käytetään valmiiksi tehtyjä DLL-tiedostoja
870            BaseRules.Rules.InitTechs();
871            BaseRules.Rules.InitUnits();
872            BaseRules.Rules.InitDifficulty();
873            BaseRules.Rules.InitCivs();
874            BaseRules.Rules.InitAIBehaviour();
875        }
876
877        private void RemoveShroud(int i, int j)
878        {
879            try
880            {
881                ShroudMap[i, j] = 0;
882                ShroudTile[i, j].Destroy();
883                try
884                {
885                    if (OwnershipMap[i, j] > -1)
886                    {
887                        DrawOwnership(i, j);
888                    }
889                }
890                catch
891                {
892                }
893            }
894            catch
895            {
896                MessageDisplay.Add("Shroud not removed from tile " + i + "; " + j + " because of IndexoutofRange exception.");
897            }
898        }
899
900        private void CheckAndRemoveShroud_FromPos(int i, int j)
901        {
902            RemoveShroud(i, j);
903            for (int shri = i - 2; shri <= i + 2; shri++)
904            {
905                for (int shrj = j - 2; shrj <= j + 2; shrj++)
906                {
907                    RemoveShroud(shri, shrj);
908                }
909            }
910        }
911
912        private void TurnSystem_Start(int playernumber)
913        {
914            TurnNumber = TurnNumber + 1;
915            MessageDisplay.Add("Vuorosi on alkanut!");
916            CurrentPlayer = playernumber;
917            CurrProduction = Rules.pCivs[playernumber].Production;
918            ProductionDisp.Text = "Vuoro: " + TurnNumber + Environment.NewLine +
919                "Tuotantoa vuorossa: " + Rules.pCivs[playernumber].Production + Environment.NewLine +
920                "Tuotantoa jäljellä: " + CurrProduction;
921            BuildCityDisp.Text = "Rakenna kaupunki (" + Rules.pCivs[playernumber].BuiltFromCity + " / " + Rules.pCivs[playernumber].Production + ")";
922            if (TurnNumber == 1)
923            {
924                //CreateUnit(Rules.pCivs[playernumber].CityCoords[0, 0], Rules.pCivs[playernumber].CityCoords[0, 1], Rules.Archer, playernumber);
925                //CreateUnit(Rules.pCivs[playernumber].CityCoords[0, 0], Rules.pCivs[playernumber].CityCoords[0, 1], Rules.Archer, playernumber);
926                CreateUnit(Rules.pCivs[playernumber].CityCoords[0, 0], Rules.pCivs[playernumber].CityCoords[0, 1], Rules.Deathbringer, playernumber);
927                //RemoveUnit(Rules.pCivs[playernumber].Units[0].PosY, Rules.pCivs[playernumber].Units[0].PosX, playernumber);
928            }
929            for (int a = 0; a < Rules.pCivs[playernumber].NumberofUnits; a++)
930            {
931                Rules.pCivs[playernumber].Units[a].CurrentMovementPoints = Rules.pCivs[playernumber].Units[a].UnitType.Movement;
932            }
933        }
934
935        protected override void Update(Time time)
936        {
937            base.Update(time);
938            // Mouse.PositionOnScreen voisi olla vain positiivinen, eikä ruudun pitäisi jakautua keskeltä kahtia
939            // negatiivisiin ja positiivisiin kokonaislukuihin
940
941            if (gamestarted == true)
942            {
943                for (int i = 0; i <= (kartanKorkeus - 1); i++)
944                {
945                    for (int j = 0; j <= (kartanLeveys - 1); j++)
946                    {
947                        if (Mouse.IsCursorOnGameObject(tile[i, j]))
948                        {
949                            TileDisp.Text = getTileInfo_forTileDisp(i, j);
950                            if (UnitsSelected == false)
951                            {
952                                UnitStatsDisp.Text = getUnitDisp(i, j, 0);
953                            }
954                            //Application.DoEvents();
955                        }
956                        //Mouse.ListenMovement(tile[i, j], showTileInfo_forTileDisp, null, i, j);
957                        // MessageBox.Show(Convert.ToString(TerrainMap[i, j]));
958                    }
959                }
960                //TileDisp.Text = getTileInfo_forTileDisp(Convert.ToInt32(Mouse.PositionOnWorld.X) / -48, Convert.ToInt32(Mouse.PositionOnWorld.Y) / 48);
961            if (Mouse.PositionOnScreen.X > MouseScreenWidth) { MoveCamera(0); }
962            else if (Mouse.PositionOnScreen.X < NegMouseScreenWidth) { MoveCamera(2); }
963            else if (Mouse.PositionOnScreen.Y > MouseScreenHeight) { MoveCamera(1); }
964            else if (Mouse.PositionOnScreen.Y < NegMouseScreenHeight) { MoveCamera(3); }
965            }
966        }
967
968        public string getTileInfo_forTileDisp(int i, int j)
969        {
970            // Haetaan tiedot ruudulle
971            string tileinfo;
972            int Defensebonus = new int();
973            tileinfo = " ";
974            //MessageBox.Show(i + " " + j);
975            // Maaston perustiedot
976            if (TerrainMap[i, j] == 0)
977            {
978                tileinfo = "Ruohotasankoa";
979            }
980            else if (TerrainMap[i, j] == 1)
981            {
982                tileinfo = "Vuoristoa";
983            }
984            else if (TerrainMap[i, j] == 2)
985            {
986                tileinfo = "Aavikkoa";
987                Defensebonus = Defensebonus - 25;
988            }
989            else if (TerrainMap[i, j] == 3)
990            {
991                tileinfo = "Tundraa";
992                Defensebonus = Defensebonus + 10;
993            }
994
995            // Erikoismaaston tiedot
996
997            if (DTerrainMap[i, j] == 0)
998            {
999            }
1000            else if (DTerrainMap[i, j] == 1)
1001            {
1002                tileinfo = tileinfo + Environment.NewLine + "Vuoristoa" + Environment.NewLine + "Läpipääsemätön";
1003            }
1004            else if (DTerrainMap[i, j] == 2)
1005            {
1006                tileinfo = tileinfo + Environment.NewLine + "Lehtimetsää";
1007                Defensebonus = Defensebonus + 10;
1008            }
1009            else if (DTerrainMap[i, j] == 3)
1010            {
1011                tileinfo = tileinfo + Environment.NewLine + "Kuusimetsää";
1012                Defensebonus = Defensebonus + 25;
1013            }
1014            else
1015            {
1016                // MessageBox.Show(Convert.ToString(ShroudMap[i, j]));
1017                if (ShroudMap[i, j] == 0)
1018                {
1019                    try
1020                    {
1021                        if (OwnershipMap[i, j] >= -1)
1022                        {
1023                            tileinfo = tileinfo + Environment.NewLine + "Kaupunki";
1024                        }
1025                    }
1026                    catch
1027                    {
1028                    }
1029                }
1030            }
1031
1032            if (ShroudMap[i, j] == 0)
1033            {
1034                try
1035                {
1036                    if (OwnershipMap[i, j] > -1)
1037                    {
1038                        tileinfo = tileinfo + Environment.NewLine + Rules.pCivs[OwnershipMap[i, j]].Name;
1039                    }
1040                }
1041                catch
1042                {
1043                }
1044
1045                if (Defensebonus != 0)
1046                {
1047                    return tileinfo = tileinfo + Environment.NewLine + "Puolustusbonus: " + Defensebonus + "%";
1048                }
1049                else
1050                {
1051                    return tileinfo;
1052                }
1053            }
1054            return tileinfo;
1055        }
1056
1057        public string getUnitDisp(int i, int j, int s)
1058        {
1059            string unitinfo = "";
1060            if (ShroudMap[i, j] == 0)
1061            {
1062                try
1063                {
1064                    if (OwnershipMap[i, j] > -1)
1065                    {
1066                        //MessageBox.Show("OwnershipMap passed:" + i + " " + j + " UnitMap: " + UnitMap[i, j]);
1067                        //MessageBox.Show(Convert.ToString(0 > -1));
1068                        if (UnitMap[i, j] > -1)
1069                        {
1070                            //MessageBox.Show("UnitMap passed:" + i + " " + j);
1071                            //string unitstats;
1072                            if (s == 0)
1073                            {
1074                                unitinfo = "Ruudun yksiköt: " + Environment.NewLine + GetUnits_FromPositionForView(i, j);
1075                            }
1076                            else if (s == 1)
1077                            {
1078                                unitinfo = "Valitut yksiköt: " + Environment.NewLine + GetUnits_FromPositionForView(i, j);
1079                            }
1080                        }
1081                    }
1082                }
1083                catch
1084                {
1085                }
1086            }
1087            return unitinfo;
1088        }
1089
1090        private void EndTurn()
1091        {
1092            MessageDisplay.Add("Lopetit vuorosi..");
1093            if (SelectedUnit > -1)
1094            {
1095                DeselectUnit();
1096            }
1097            TurnSystem_Start(CurrentPlayer);
1098        }
1099
1100        private void InitControls()
1101        {
1102            Keyboard.Listen(Key.Right, Jypeli.ButtonState.Down, MoveCamera, null, 0);
1103            Keyboard.Listen(Key.Left, Jypeli.ButtonState.Down, MoveCamera, null, 2);
1104            Keyboard.Listen(Key.Up, Jypeli.ButtonState.Down, MoveCamera, null, 1);
1105            Keyboard.Listen(Key.Down, Jypeli.ButtonState.Down, MoveCamera, null, 3);
1106            Keyboard.Listen(Key.Tab, Jypeli.ButtonState.Down, ActivateDebug, null, 0);
1107            Keyboard.Listen(Key.Enter, Jypeli.ButtonState.Pressed, EndTurn, null);
1108
1109            Keyboard.Listen(Key.NumPad1, Jypeli.ButtonState.Pressed, MoveUnit, "Liikuta yksikköä lounaaseen.", 1);
1110            Keyboard.Listen(Key.NumPad2, Jypeli.ButtonState.Pressed, MoveUnit, "Liikuta yksikköä etelään.", 2);
1111            Keyboard.Listen(Key.NumPad3, Jypeli.ButtonState.Pressed, MoveUnit, "Liikuta yksikköä kaakkoon.", 3);
1112            Keyboard.Listen(Key.NumPad4, Jypeli.ButtonState.Pressed, MoveUnit, "Liikuta yksikköä länteen.", 4);
1113            Keyboard.Listen(Key.NumPad5, Jypeli.ButtonState.Pressed, MoveUnit, "Hyppää yksikkö yli.", 5);
1114            Keyboard.Listen(Key.NumPad6, Jypeli.ButtonState.Pressed, MoveUnit, "Liikuta yksikköä itään.", 6);
1115            Keyboard.Listen(Key.NumPad7, Jypeli.ButtonState.Pressed, MoveUnit, "Liikuta yksikköä luoteeseen.", 7);
1116            Keyboard.Listen(Key.NumPad8, Jypeli.ButtonState.Pressed, MoveUnit, "Liikuta yksikköä pohjoiseen.", 8);
1117            Keyboard.Listen(Key.NumPad9, Jypeli.ButtonState.Pressed, MoveUnit, "Liikuta yksikköä koilliseen.", 9);
1118
1119            //Keyboard.Disable(Key.NumPad1);
1120            //Keyboard.Disable(Key.NumPad2);
1121            //Keyboard.Disable(Key.NumPad3);
1122            //Keyboard.Disable(Key.NumPad4);
1123            //Keyboard.Disable(Key.NumPad5);
1124            //Keyboard.Disable(Key.NumPad6);
1125            //Keyboard.Disable(Key.NumPad7);
1126            //Keyboard.Disable(Key.NumPad8);
1127            //Keyboard.Disable(Key.NumPad9);
1128
1129            MouseScreenWidth = new int();
1130            MouseScreenWidth = Convert.ToInt32(Peli.Screen.Width / 2) - 5;
1131            MouseScreenHeight = new int();
1132            MouseScreenHeight = Convert.ToInt32(Peli.Screen.Height / 2) - 5;
1133            NegMouseScreenWidth = new int();
1134            NegMouseScreenWidth = Convert.ToInt32(Peli.Screen.Width / -2) + 5;
1135            NegMouseScreenHeight = new int();
1136            NegMouseScreenHeight = Convert.ToInt32(Peli.Screen.Height / -2) + 20;
1137        }
1138
1139        private void MoveUnit(int direction)
1140        {
1141            if (SelectedUnit == -1)
1142            {
1143                MessageDisplay.Add("Ei ole yksikköä valittuna.");
1144            }
1145            else
1146            {
1147                if (direction == 1)
1148                {
1149                    UnitMovementMain(-1, -1);
1150                }
1151                else if (direction == 2)
1152                {
1153                    UnitMovementMain(-1, 0);
1154                }
1155                else if (direction == 3)
1156                {
1157                    UnitMovementMain(-1, 1);
1158                }
1159                else if (direction == 4)
1160                {
1161                    UnitMovementMain(0, -1);
1162                }
1163                else if (direction == 5)
1164                {
1165                    //SelectNextUnitOnTile(-1, 0);
1166                }
1167                else if (direction == 6)
1168                {
1169                    UnitMovementMain(0, 1);
1170                }
1171                else if (direction == 7)
1172                {
1173                    UnitMovementMain(1, -1);
1174                }
1175                else if (direction == 8)
1176                {
1177                    UnitMovementMain(1, 0);
1178                }
1179                else if (direction == 9)
1180                {
1181                    UnitMovementMain(1, 1);
1182                }
1183                if (Rules.pCivs[CurrentPlayer].Units[SelectedUnit].CurrentMovementPoints == 0)
1184                {
1185                    DeselectUnit();
1186                }
1187                else
1188                {
1189                    UnitTile[Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosY, Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosX].Image = LoadImage(OwnershipColorPath + "unitsOnTileSelected");
1190                }
1191            }
1192            //Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosX = Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosX - 1;
1193            //Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosY = Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosY - 1;
1194            //OwnershipMap[Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosY, Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosX] = CurrentPlayer;
1195            //DrawOwnership(Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosY, Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosX);
1196            //UnitMap[Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosY, Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosX] = CurrentPlayer;
1197            //DrawUnit(Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosY, Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosX);
1198            //CheckAndRemoveShroud_FromPos(Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosY, Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosX);
1199            //Rules.pCivs[CurrentPlayer].Units[SelectedUnit].CurrentMovementPoints = Rules.pCivs[CurrentPlayer].Units[SelectedUnit].CurrentMovementPoints - 1;
1200            //if (GetUnit_FromPositionForSelection(Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosY + 1, Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosX + 1) == -1)
1201            //{
1202            //    UnitMap[Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosY + 1, Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosX + 1] = -1;
1203            //    UnitTile[Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosY + 1, Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosX + 1].Destroy();
1204            //    if (CheckforCityinPos(Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosY + 1, Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosX + 1, CurrentPlayer) == -1)
1205            //    {
1206            //        OwnershipMap[Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosY + 1, Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosX + 1] = -1;
1207            //        TileOwnership[Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosY + 1, Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosX + 1].Destroy();
1208            //    }
1209            //}
1210        }
1211
1212        private void UnitMovementMain(int a, int b)
1213        {
1214            if (TerrainMap[Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosY + a, Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosX + b] == Vuoristo | DTerrainMap[Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosY + a, Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosX + b] == Vuoristo)
1215            {
1216                MessageDisplay.Add("Et voi liikkua vuorten läpi!");
1217            }
1218            else
1219            {
1220                Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosX = Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosX + b;
1221                Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosY = Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosY + a;
1222                // MessageBox.Show(Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosY + " " + Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosX);
1223                try
1224                {
1225                    OwnershipMap[Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosY, Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosX] = CurrentPlayer;
1226                    DrawOwnership(Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosY, Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosX);
1227                    UnitMap[Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosY, Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosX] = CurrentPlayer;
1228                    DrawUnit(Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosY, Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosX);
1229                    CheckAndRemoveShroud_FromPos(Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosY, Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosX);
1230                    Rules.pCivs[CurrentPlayer].Units[SelectedUnit].CurrentMovementPoints = Rules.pCivs[CurrentPlayer].Units[SelectedUnit].CurrentMovementPoints - 1;
1231                    //MessageBox.Show(Convert.ToString(Rules.pCivs[CurrentPlayer].Units[SelectedUnit].CurrentMovementPoints));
1232                    if (GetUnit_FromPositionForSelection(Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosY + (a * -1), Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosX + (b * -1)) == -1)
1233                    {
1234                        UnitMap[Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosY + (a * -1), Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosX + (b * -1)] = -1;
1235                        UnitTile[Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosY + (a * -1), Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosX + (b * -1)].Destroy();
1236                        if (CheckforCityinPos(Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosY + (a * -1), Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosX + (b * -1), CurrentPlayer) == -1)
1237                        {
1238                            OwnershipMap[Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosY + (a * -1), Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosX + (b * -1)] = -1;
1239                            TileOwnership[Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosY + (a * -1), Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosX + (b * -1)].Destroy();
1240                        }
1241                    }
1242                }
1243                catch
1244                {
1245                    MessageDisplay.Add("Et voi liikkua kartan ulkopuolelle!");
1246                    Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosX = Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosX - b;
1247                    Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosY = Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosY - a;
1248                }
1249            }
1250        }
1251
1252        private void DeselectUnit()
1253        {
1254                UnitTile[Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosY, Rules.pCivs[CurrentPlayer].Units[SelectedUnit].PosX].Image = LoadImage(OwnershipColorPath + "unitsOnTile");
1255                UnitsSelected = false;
1256                SelectedUnit = -1;
1257                //Keyboard.Disable(Key.NumPad1);
1258                //Keyboard.Disable(Key.NumPad2);
1259                //Keyboard.Disable(Key.NumPad3);
1260                //Keyboard.Disable(Key.NumPad4);
1261                //Keyboard.Disable(Key.NumPad5);
1262                //Keyboard.Disable(Key.NumPad6);
1263                //Keyboard.Disable(Key.NumPad7);
1264                //Keyboard.Disable(Key.NumPad8);
1265                //Keyboard.Disable(Key.NumPad9);
1266        }
1267
1268        public int CheckforCityinPos(int i, int j, int civid)
1269        {
1270            int returnvalue = new int();
1271            if (DTerrainMap[i, j] - 10 == civid)
1272            {
1273                returnvalue = civid;
1274            }
1275            else
1276            {
1277                returnvalue = -1;
1278            }
1279            return returnvalue;
1280        }
1281
1282        private void ActivateDebug(int asd)
1283        {
1284            //Add(MessageDisplay);
1285            MessageDisplay.Add("DEBUG MODE ACTIVATED");
1286            Keyboard.Listen(Key.A, Jypeli.ButtonState.Down, ShowColors, null);
1287        }
1288
1289        private void ShowColors()
1290        {
1291            for (int a = 0; a <= (AmountofPlayers - 1); a++)
1292            {
1293                MessageDisplay.Add("Pelaaja: " + a + "; " + Rules.pCivs[a].Color);
1294            }
1295        }
1296
1297        private void MoveCamera(Int32 dir)
1298        {
1299            if (gamestarted == false) { return; }
1300            if ((dir == 0)  && (Camera.Position.X < (tile[kartanKorkeus - 1, kartanLeveys - 1].X) - ((Peli.Screen.Width / 2) - 200)))
1301            {
1302                Camera.Move(CamSpeedEast);
1303            }
1304            if ((dir == 1) && (Camera.Position.Y < (tile[kartanKorkeus - 1, kartanLeveys - 1].Y) - ((Peli.Screen.Height / 2) - 12)))
1305            {
1306                Camera.Move(CamSpeedNorth);
1307            }
1308            if ((dir == 2) && (Camera.Position.X > (tile[0, 0].X) + (Peli.Screen.Width / 2)))
1309            {
1310                Camera.Move(CamSpeedWest);
1311            }
1312            if ((dir == 3) && (Camera.Position.Y > (tile[0, 0].Y) + (Peli.Screen.Height / 2)))
1313            {
1314                Camera.Move(CamSpeedSouth);
1315            }
1316        }
1317    }
1318}
Note: See TracBrowser for help on using the repository browser.