Пример #1
0
	/*	public static Game newGame(int width, int height, byte percWater, byte nbrPlayer1, string playerName, byte civ, byte difficulty1, byte contSize, byte age, bool isInCenter, bool niceSite, bool tut )
		{ 
			return newGame( 
				width, height, percWater, nbrPlayer1, playerName, civ, difficulty1, contSize, age, isInCenter, niceSite, tut, 
				false, "", "", 0, Color.Empty, null 
				);
		}
		public static Game newGame( int width, int height, byte percWater, byte nbrPlayer1, string playerName, byte civ, byte difficulty1, byte contSize, byte age, bool isInCenter, bool niceSite, bool tut, bool customNation, string customNationName, string customNationDesc, byte customNationCityList, Color customNationColor, byte[] aiCivs )
		{
			Game game = new Game();

			showProgress.showProgressInd = true;
			showProgress.lblInfo = "Loading statistics and bitmaps...";
			showProgress.progressBar = 1;

			wC.show = true; 

			if ( customNation )
			{
				Stat.Civilization[] buffer = Statistics.civilizations;
				Statistics.civilizations = new Stat.Civilization[ buffer.Length + 1 ];

				for ( int i = 0; i < buffer.Length; i ++ )
					Statistics.civilizations[ i ] = buffer[ i ];
				
				Statistics.civilizations[ buffer.Length ].name = customNationName;
				Statistics.civilizations[ buffer.Length ].description = customNationDesc;
				Statistics.civilizations[ buffer.Length ].cityNames = Statistics.civilizations[ customNationCityList ].cityNames;
				Statistics.civilizations[ buffer.Length ].color = customNationColor;

				civ = (byte)buffer.Length;
			}

			Tutorial.init( tut );
			//	tutorialMode = tutorial; 
			game.difficulty = difficulty1; 
			game.savePath = ""; 

			game.curTurn = 0;

			//	cfgOut cfgO = new cfgOut(); 
			//	structures.cfgFile cfgFile = cfgO.readCfgFile(); 
			Form1.options.showBatteryStatus = cfgOut.getValues.batteryStatus; 

			Form1.options.showOnScreenDPad = cfgOut.getValues.dPad;
			Form1.options.miniMapType = 1;
			Form1.options.frontierType = 1;

			Form1.options.showGrid = cfgOut.getValues.showGrid;

			Form1.options.hideUndiscovered = true;

			//		game.playerList.Length = nbrPlayer1;


		/*	if ( !Statistics.variableInitialized )
			{
				showProgress.lblInfo = "Loading graphics...";
				Form1.InitGraphics();

				Statistics.initAllBut();
			}*

			showProgress.lblInfo = "Generating map...";
			game.width = width;
			game.height = height;
			game.grid = new structures.sGrid[ game.width, game.height ];
			
			game.caseImps = new structures.caseImprovement[ 0 ];
			
			showProgress.progressBar = 10;

			mapGenerator mapGen = new mapGenerator( game );
			if ( mapGen.generateMap( width, height, percWater, contSize, age ) )
			{
				showProgress.progressBar = 50;
				showProgress.lblInfo = "Locating continents...";

				mapGen.findContinents( width, height );
				int[] contSize1 = mapGen.getContSize();

				showProgress.progressBar = 57;
				showProgress.lblInfo = "Set specials...";
				mapGen.setSpecials();

				showProgress.progressBar = 59;
				showProgress.lblInfo = "Set resources...";
				mapGen.setResources( width * 7 * ( 100 - percWater ) / ( 40 * 100 ) );

				showProgress.progressBar = 62;
				showProgress.lblInfo = "Set rivers...";
				mapGen.setRivers( 10 * ( width / 40 ) ^ 2 * ( 100 - percWater ) / 100 );

				showProgress.progressBar = 65;
				showProgress.lblInfo = "Finished generating map"; // Map generated"; // "";

				for (int x = 0; x < game.width; x ++ )
					for (int y = 0; y < game.height; y ++ )
						game.grid[ x, y ].stack = new UnitList[ 0 ];
			
				Random R = new Random();
				game.radius.setIsNextToWater(); 

				#region generer les case cotiere possible
				Point[] possibleCases = new Point[ width * 8 * height / 10 ];
				int d = 0;

				for ( int x = 0; x < width; x ++)
					for ( int y = height / 7; y < 6 * height / 7; y ++)
					{
						if ( 
							game.grid[ x, y ].type == (byte)enums.terrainType.plain && 
							game.radius.isNextToWater( x, y ) &&
							game.grid[ x, y ].resources == 0
							)
						{
							possibleCases[ d ] = new Point( x, y );
							d ++;
						}
					}

				Point[] possibleCases1 = new Point[ d ];

				for ( int i = 0; i < possibleCases1.Length; i ++ )
				{
					possibleCases1[ i ] = possibleCases[ i ];
				}
				#endregion
			
				showProgress.progressBar = 70;
				//	showProgress.lblInfo = 

				game.playerList = new PlayerList[ nbrPlayer1 ]; // game.playerList.Length ];

				//						nbr		civ		name			food	prod	trade	Sci		happy	wealth
	//			game.enterNewPlayer(	0,		civ,	playerName,		1,		1,		1,		50,		1,		50		);

				#region players
				bool foundStart = false;
				for ( int j = 0; !foundStart; j ++ )
				{
					Point startPos = possibleCases1[ R.Next( possibleCases1.Length ) ];

					if ( 
						!isInCenter || 
						( startPos.X > game.width / 5 && startPos.X < game.width * 4 / 5 )
						)
					{
						if ( niceSite )
						{
							if ( contSize1[ game.grid[ startPos.X, startPos.Y ].continent ] > 100 )
							{
								Point[] sqr = game.radius.returnSquare( startPos.X, startPos.Y, 4 );
								int tot = 0;

								for ( int k = 0; k < sqr.Length; k ++ )
									if ( 
										game.grid[ sqr[ k ].X, sqr[ k ].Y ].continent == game.grid[ startPos.X, startPos.Y ].continent && 
										(
										game.grid[ sqr[ k ].X, sqr[ k ].Y ].type == (byte)enums.terrainType.glacier ||
										game.grid[ sqr[ k ].X, sqr[ k ].Y ].type == (byte)enums.terrainType.jungle ||
										game.grid[ sqr[ k ].X, sqr[ k ].Y ].type == (byte)enums.terrainType.mountain ||
										game.grid[ sqr[ k ].X, sqr[ k ].Y ].type == (byte)enums.terrainType.swamp ||
										game.grid[ sqr[ k ].X, sqr[ k ].Y ].type == (byte)enums.terrainType.tundra ||
										game.grid[ sqr[ k ].X, sqr[ k ].Y ].type == (byte)enums.terrainType.desert
										)
										)
									{
										if ( k > 8 )
											tot ++; 
										else
										{
											tot += 2000;
											break;
										}

									}

								if ( tot < 5 + j * 2 )
								{
					//				unitCreate( game, startPos.X, startPos.Y, 0, (byte)Form1.unitType.colon );
									foundStart = true;
								}
							}
						}
						else
						{
							if ( contSize1[ game.grid[ startPos.X, startPos.Y ].continent ] > 30 )
							{
					//			unitCreate( game, startPos.X, startPos.Y, 0, (byte)Form1.unitType.colon );
								foundStart = true;
							}
						}
					}

					if ( j > possibleCases1.Length * 2 ) // 3
						return null;
					//	MessageBox.Show( "Failed finding" );
				}
				#endregion

				showProgress.progressBar = 70 + 5;
				showProgress.lblInfo = "Player info...";

				for ( byte i = 1; i < game.playerList.Length; i ++ )
				{
					#region ai players

					int civType = 0;
					if ( aiCivs == null || aiCivs.Length == 0 ) // )
					{
						bool found = false;
						while ( !found )
						{
							civType = (byte)R.Next( Statistics.normalCivilizationNumber );
							found = true;
							for ( int k = 0; k < i; k++ )
							{
								if ( civType == game.playerList[ k ].civType )
								{
									found = false;
									break;
								}
							}
						}
					}
					else
					{
						civType = aiCivs[ i - 1 ];
					}

					Random r = new Random();
					game.enterNewPlayer( i, (byte)civType, Statistics.civilizations[ civType ].leaderNames[ r.Next( Statistics.civilizations[ civType ].leaderNames.Length ) ], 1, 1, 1, 50, 0, 50 );

					foundStart = false;
					for ( int j = 0; !foundStart; j ++ )
					{
						if ( j > 1000 )
						{
							int aiOld = game.playerList.Length - 1;
							int aiNew = i - 1;
							//			game.playerList.Length = (byte)( i );

							PlayerList[] buffer = game.playerList;
							game.playerList = new PlayerList[ game.playerList.Length + 1 ];

							for ( int k = 0; k < game.playerList.Length; k ++ )
								game.playerList[ k ] = buffer[ k ];

							MessageBox.Show(
								"Due to the specification of the terrain the number of AIs has been reduced from " + aiOld.ToString() + " to " + aiNew.ToString() + ".", 
								"Map generation exception"
								); 
 
							break; 
						}

						Point startPos = possibleCases1[ R.Next( possibleCases1.Length ) ];

						if ( game.grid[ startPos.X, startPos.Y ].stack.Length == 0 )
						{
							if ( contSize1[ game.grid[ startPos.X, startPos.Y ].continent ] > 30 )
							{
								Point[] sqr = game.radius.returnSquare( startPos.X, startPos.Y, 7 );
								bool foundUnit = false;

								for ( int k = 0; k < sqr.Length; k ++ )
									if ( game.grid[ sqr[ k ].X, sqr[ k ].Y ].stack.Length > 0 )
									{
										foundUnit = true;
										break;
									}

								if ( !foundUnit )
								{
									game.unitCreate( startPos.X, startPos.Y, i, (byte)Form1.unitType.colon );
									foundStart = true;
								}
							}
						}
					
					}
					#endregion
				
					showProgress.progressBar = 70 + 5 + i * ( 20 / game.playerList.Length );
					showProgress.lblInfo = "AI info generated";
				}

				label.initList( 0 );

				rvtbc.init(); 
				plans.init();
				Tutorial.init( tut );

				showProgress.progressBar = 95; 
				showProgress.lblInfo = "Finalizing"; 

				return game; 
			}
			else
			{
				showProgress.showProgressInd = false;
				wC.show = false;
				MessageBox.Show( "Generation failed, try more or less water." );
				return null;
			}
		}

		#region  enter new player
		
		public void enterNewPlayer( byte playerNbr, byte civType, string playerName, sbyte prefFood, sbyte prefProd, sbyte prefTrade, sbyte prefScience, sbyte prefHapiness, sbyte prefWealth )
		{
			this.playerList[ playerNbr ] = new PlayerList( playerNbr ); 
			this.playerList[ playerNbr ].lastSeen = new structures.lastSeen[ this.width, this.height ];

			this.playerList[ playerNbr ].civType = civType;
			this.playerList[ playerNbr ].playerName = playerName;
			this.playerList[ playerNbr ].money = 0;
			this.playerList[ playerNbr ].currentResearch = 0;

			this.playerList[ playerNbr ].unitList = new UnitList[ 10 ];
			this.playerList[ playerNbr ].cityList = new CityList[ 5 ];
			this.playerList[ playerNbr ].foreignRelation = new structures.sForeignRelation[ this.playerList.Length ];

			for ( int i = 0; i < this.playerList.Length; i ++ )
			{
				this.playerList[ playerNbr ].foreignRelation[ i ].quality = 100;
				this.playerList[ playerNbr ].foreignRelation[ i ].spies = new xycv_ppc.structures.sSpies[ 4 ];
				
				for ( int j = 0; j < 4; j ++ )
				{
					this.playerList[ playerNbr ].foreignRelation[ i ].spies[ j ] = new xycv_ppc.structures.sSpies();
					this.playerList[ playerNbr ].foreignRelation[ i ].spies[ j ].nbr = 0;
				}
			}
	
			this.playerList[ playerNbr ].technos = new xycv_ppc.structures.technoList[ Statistics.technologies.Length ];

			this.playerList[ playerNbr ].unitNumber = 0;
			this.playerList[ playerNbr ].cityNumber = 0;
			this.playerList[ playerNbr ].technos[ 0 ].pntDiscovered = 0;
			
			this.playerList[ playerNbr ].preferences.laborFood = prefFood;
			this.playerList[ playerNbr ].preferences.laborProd = prefProd;
			this.playerList[ playerNbr ].preferences.laborTrade = prefTrade;
			this.playerList[ playerNbr ].preferences.science = prefScience;
			this.playerList[ playerNbr ].preferences.reserve = prefWealth;
			this.playerList[ playerNbr ].discovered = new bool[ this.width, this.height ];
			this.playerList[ playerNbr ].see = new bool[ this.width, this.height ];
			//	this.playerList[ playerNbr ].unitList = new UnitList[ 50 ];
			//	this.playerList[ playerNbr ].foreignRelation = new structures.sForeignRelation[ Form1.this.playerList.Length ];
			
			this.playerList[ playerNbr ].setResourcesAccess();
			this.playerList[ playerNbr ].memory = new Memory( playerNbr, 0 );
		}

		#endregion
		
		#region unit Creation
		public void unitCreate( int x, int y, byte player, byte unitType )
		{
			if ( Statistics.units[ unitType ].speciality != enums.speciality.builder )
			{
				int mf = count.militaryFunding( player );
				int un = Form1.game.playerList[ player ].totMilitaryUnits; //count.militaryUnits( player );
				sbyte nextMFp = 0;
				bool mod = true;

		//		getPFT gp = new getPFT(); 

				if ( un == 0 ) 
				{ 
					nextMFp = (sbyte)( 3 * 100 / Form1.game.playerList[ player ].totalTrade + 1 ); 
				}
				else // game.playerList[ player ].preferences.military 
				{ 
					if ( un <= mf / 3 ) // over yellow 
						nextMFp = (sbyte)( 3 * 100 * ( un + 1 ) / Form1.game.playerList[ player ].totalTrade + 1 ); 
					else if ( un <= mf * 6 / ( 3 * 5 ) ) // over red 
						nextMFp = (sbyte)( 3 * 100 * 4 * ( un + 1 ) / ( 5 * Form1.game.playerList[ player ].totalTrade ) + 1 ); 
					else 
						mod = false;
				}

				if ( mod )
					aiPref.setMilitary( player, nextMFp );
			}

			this.playerList[ player ].unitNumber ++;

			if ( this.playerList[ player ].unitNumber >= this.playerList[ player ].unitList.Length )
			{
				UnitList[] unitListBuffer = this.playerList[ player ].unitList;
				this.playerList[ player ].unitList = new UnitList[ unitListBuffer.Length + 10 ];

				for ( int i = 0; i < unitListBuffer.Length; i ++ )
					this.playerList[ player ].unitList[ i ] = unitListBuffer[ i ];
			}

			this.playerList[ player ].unitList[ this.playerList[ player ].unitNumber ] = new UnitList( player );

			this.playerList[ player ].unitList[ this.playerList[ player ].unitNumber ].X = x;
			this.playerList[ player ].unitList[ this.playerList[ player ].unitNumber ].Y = y;
			this.playerList[ player ].unitList[ this.playerList[ player ].unitNumber ].type = unitType;
			this.playerList[ player ].unitList[ this.playerList[ player ].unitNumber ].moveLeft = (sbyte)Statistics.units[ unitType].move;
			this.playerList[ player ].unitList[ this.playerList[ player ].unitNumber ].moveLeftFraction = 0;
			this.playerList[ player ].unitList[ this.playerList[ player ].unitNumber ].state = (byte)Form1.unitState.idle;
			this.playerList[ player ].unitList[ this.playerList[ player ].unitNumber ].health = 3;
			this.playerList[ player ].unitList[ this.playerList[ player ].unitNumber ].level = 1; 

			// transport
			if ( Statistics.units[ unitType ].transport > 0 )
			{
				this.playerList[ player ].unitList[ this.playerList[ player ].unitNumber ].transport = new int[ Statistics.units[ unitType ].transport ];
				this.playerList[ player ].unitList[ this.playerList[ player ].unitNumber ].transported = 0;
			}		

			move.moveUnitToCase( x, y, player, this.playerList[ player ].unitNumber );

		//	discoverRadius( x, y, Statistics.units[ unitType ].sight, player );

			#region special resources
			if ( this.grid[ x, y ].resources > 0 && this.grid[ x, y ].resources < 100 )
			{
				if ( this.grid[  x, y ].resources == (byte)enums.speciaResources.horses )
				{
					if ( !this.playerList[ player ].technos[ (byte)Form1.technoList.horseBreed ].researched )
					{
						this.playerList[ player ].technos[ (byte)Form1.technoList.horseBreed ].researched = true;

						if ( Form1.game.curPlayerInd == player )
						{
							DrawMap();
							MessageBox.Show( "You just discovered horses.", "Rare resources" );
						}
					}
				}
				else if ( this.grid[  x, y ].resources == (byte)enums.speciaResources.elephant )
				{
					if ( !this.playerList[ player ].technos[ (byte)Form1.technoList.elephantBreed ].researched )
					{
						this.playerList[ player ].technos[ (byte)Form1.technoList.elephantBreed ].researched = true;

						if ( Form1.game.curPlayerInd == player )
						{
							DrawMap();
							MessageBox.Show( "You just discovered elephants.", "Rare resources" );
						}
					}
				}
				else if ( this.grid[  x, y ].resources == (byte)enums.speciaResources.camel )
				{
					if ( !this.playerList[ player ].technos[ (byte)Form1.technoList.camelBreed ].researched )
					{
						this.playerList[ player ].technos[ (byte)Form1.technoList.camelBreed ].researched = true;

						if ( Form1.game.curPlayerInd == player )
						{
							Form1.DrawMap();
							MessageBox.Show( "You just discovered camels.", "Rare resources" );
						}
					}
				}

				this.grid[  x, y ].resources = 0;
			}
			#endregion

		}*/
		#endregion

#region load game
		public static Game load( string sp )
		{
			Game game = null; // = new Game();
			FileStream file = null;
			BinaryReader binReader = null;
			bool success = false;

			try
			{	
			/*	if ( true )
				{	*/
				
					Form1.selected = new structures.sSelected();

					file = new FileStream( sp, FileMode.Open, FileAccess.Read ); 
					binReader = new BinaryReader( file ); 

					int buildingNbr,
						tempTechnoNbr,
						tutorialLength,
						nbrPlayer,
						version = binReader.ReadInt32();

					/* removed:
							 * 083
							 * 0831
							 * 0840
							 * 0842
							 * 0857
							 * 0862
							 * 0863
							 * 0864
							 * 0865
							 */

				/*	if ( got < 871 )
					{
						wC.show = false;

						MessageBox.Show( 
							String.Format( language.getAString( language.order.errorUnrecongnisedSaveVersion ), (double)got / 1000 ), 
							language.getAString( language.order.errorTitle ) 
							);
						
						return null;
					}
					else */if ( version == 871 )
					{
						#region case 0871

						Form1.sliHor = binReader.ReadInt32();
						Form1.sliVer = binReader.ReadInt32();
						int width = binReader.ReadInt32(),
							height = binReader.ReadInt32();

						game = new Game( width, height );

						game.curTurn = binReader.ReadInt32();
						Form1.options.frontierType = (Options.FrontierTypes)binReader.ReadByte(); // option
						Form1.options.miniMapType = (Options.MiniMapTypes)binReader.ReadByte(); // option
						buildingNbr = binReader.ReadInt32();
						tempTechnoNbr = binReader.ReadInt32();
						Form1.options.hideUndiscovered = binReader.ReadBoolean(); // option
						Form1.options.showGrid = binReader.ReadBoolean(); // option
						Form1.options.showOnScreenDPad = binReader.ReadBoolean(); // option
						Form1.options.showBatteryStatus = binReader.ReadBoolean(); // option
						Form1.options.showLabels = binReader.ReadBoolean(); // option
						Form1.options.showCommonSpyDialogs = binReader.ReadBoolean(); // option
						Form1.options.autosave = binReader.ReadBoolean();  // option

						// temp
						structures.sStack[][][] tempStacks = new xycv_ppc.structures.sStack[ game.width ][][];

						for ( int x = 0; x < game.width; x ++ )
							tempStacks[ x ] = new xycv_ppc.structures.sStack[ game.height ][];

						#region game.grid
						//	game.grid = new structures.sGrid[ game.width, game.height ];
						for ( int x = 0; x < game.width; x++ )
							for ( int y = 0; y < game.height; y++ )
							{
								game.grid[ x, y ].type = binReader.ReadByte();
								if ( game.grid[ x, y ].type != (byte)enums.terrainType.sea && game.grid[ x, y ].type != (byte)enums.terrainType.coast )
								{
									if ( binReader.ReadBoolean() )
										game.grid[ x, y ].city = binReader.ReadInt32();
									else
										game.grid[ x, y ].city = 0;

									game.grid[ x, y ].civicImprovement = binReader.ReadByte();
									game.grid[ x, y ].militaryImprovement = binReader.ReadByte();
									game.grid[ x, y ].roadLevel = binReader.ReadByte();
									game.grid[ x, y ].continent = binReader.ReadByte();
									if ( binReader.ReadBoolean() )
										game.grid[ x, y ].resources = binReader.ReadByte();

									game.grid[ x, y ].river = binReader.ReadBoolean(); // 863 
									if ( game.grid[ x, y ].river )
									{
										game.grid[ x, y ].riversDir = new bool[ 8 ];
										for ( int v = 0; v < game.grid[ x, y ].riversDir.Length; v++ )
											game.grid[ x, y ].riversDir[ v ] = binReader.ReadBoolean();
									}
								}

								if ( binReader.ReadBoolean() )
									game.grid[ x, y ].laborCity = binReader.ReadInt32();
								else
									game.grid[ x, y ].laborCity = 0;

								if ( binReader.ReadBoolean() )
								{
									
									tempStacks[ x ][ y ] = new xycv_ppc.structures.sStack[ binReader.ReadInt32() ];

									game.grid[ x, y ].stack = new UnitList[ tempStacks[ x ][ y ].Length ];
									game.grid[ x, y ].stackPos = binReader.ReadInt32();
								}
								else
								{
									
									tempStacks[ x ][ y ] = new xycv_ppc.structures.sStack[ 0 ];

									game.grid[ x, y ].stack = new UnitList[ 0 ];
									game.grid[ x, y ].stackPos = 0;
								}
							}
						#endregion

						#region stack
						for ( int x = 0; x < game.width; x++ )
							for ( int y = 0; y < game.height; y++ )
								for ( int i = 1; i <= game.grid[ x, y ].stack.Length; i++ )
								{
									tempStacks[ x ][ y ][ i - 1 ].owner = binReader.ReadByte();
									tempStacks[ x ][ y ][ i - 1 ].unit = binReader.ReadInt32();

									/*	game.grid[ x, y ].stack[ i - 1 ].player.player = binReader.ReadByte();
										game.grid[ x, y ].stack[ i - 1 ].unit = binReader.ReadInt32();*/
								}
						#endregion

						game.difficulty = binReader.ReadByte();
						nbrPlayer = binReader.ReadByte();
						game.playerList = new PlayerList[ nbrPlayer ]; 

						#region players # # #
						for ( int j = 0; j < nbrPlayer; j++ )
						{
							game.playerList[ j ] = new PlayerList( game, j );
							game.playerList[ j ].playerName = binReader.ReadString();
							game.playerList[ j ].civType = binReader.ReadByte();
							game.playerList[ j ].cityNumber = binReader.ReadInt32();
							game.playerList[ j ].unitNumber = binReader.ReadInt32();
							game.playerList[ j ].dead = binReader.ReadBoolean();
							if ( game.playerList[ j ].dead )
							{
								game.playerList[ j ].cityNumber = 0;
								game.playerList[ j ].unitNumber = 0;
							}

							if ( !game.playerList[ j ].dead )
							{
								game.playerList[ j ].currentResearch = binReader.ReadByte();
								game.playerList[ j ].money = binReader.ReadInt64();
								game.playerList[ j ].preferences.laborFood = binReader.ReadSByte();
								game.playerList[ j ].preferences.laborProd = binReader.ReadSByte();
								game.playerList[ j ].preferences.laborTrade = binReader.ReadSByte();
								game.playerList[ j ].preferences.science = binReader.ReadSByte();
								game.playerList[ j ].preferences.reserve = binReader.ReadSByte();
								game.playerList[ j ].preferences.buildings = binReader.ReadSByte();
								game.playerList[ j ].preferences.culture = binReader.ReadSByte();
								game.playerList[ j ].preferences.intelligence = binReader.ReadSByte();
								game.playerList[ j ].preferences.military = binReader.ReadSByte();
								game.playerList[ j ].preferences.space = binReader.ReadSByte();
								game.playerList[ j ].counterIntNbr = binReader.ReadInt32();
								game.playerList[ j ].govType = Statistics.governements[ binReader.ReadByte() ];
								game.playerList[ j ].economyType = binReader.ReadByte();
								game.playerList[ j ].posInCityFile = binReader.ReadByte();
								game.playerList[ j ].technos = new structures.technoList[ Statistics.technologies.Length ];
								game.playerList[ j ].discovered = new bool[ game.width, game.height ];
								game.playerList[ j ].see = new bool[ game.width, game.height ];
								game.playerList[ j ].unitList = new UnitList[ game.playerList[ j ].unitNumber + 10 ];
								game.playerList[ j ].cityList = new CityList[ game.playerList[ j ].cityNumber + 10 ];
								game.playerList[ j ].foreignRelation = new structures.sForeignRelation[ nbrPlayer ]; 
					
								#region foreignRelations
								for ( int i = 0; i < nbrPlayer; i++ )
								{
									game.playerList[ j ].foreignRelation[ i ].spies = new xycv_ppc.structures.sSpies[ 4 ];
									for ( int k = 0; k < 4; k++ )
										game.playerList[ j ].foreignRelation[ i ].spies[ k ] = new xycv_ppc.structures.sSpies();

									game.playerList[ j ].foreignRelation[ i ].madeContact = binReader.ReadBoolean();
									if ( game.playerList[ j ].foreignRelation[ i ].madeContact )
									{
										game.playerList[ j ].foreignRelation[ i ].quality = binReader.ReadByte();
										game.playerList[ j ].foreignRelation[ i ].politic = binReader.ReadByte();
										game.playerList[ j ].foreignRelation[ i ].embargo = binReader.ReadBoolean();
										game.playerList[ j ].foreignRelation[ i ].spies[ (byte)enums.spyType.people ].nbr = binReader.ReadInt32();
										game.playerList[ j ].foreignRelation[ i ].spies[ (byte)enums.spyType.people ].efficiency = binReader.ReadByte();
										game.playerList[ j ].foreignRelation[ i ].spies[ (byte)enums.spyType.gov ].nbr = binReader.ReadInt32();
										game.playerList[ j ].foreignRelation[ i ].spies[ (byte)enums.spyType.gov ].efficiency = binReader.ReadByte();
										game.playerList[ j ].foreignRelation[ i ].spies[ (byte)enums.spyType.military ].nbr = binReader.ReadInt32();
										game.playerList[ j ].foreignRelation[ i ].spies[ (byte)enums.spyType.military ].efficiency = binReader.ReadByte();
										game.playerList[ j ].foreignRelation[ i ].spies[ (byte)enums.spyType.science ].nbr = binReader.ReadInt32();
										game.playerList[ j ].foreignRelation[ i ].spies[ (byte)enums.spyType.science ].efficiency = binReader.ReadByte();
									}
								}
								#endregion

								#region see & discovered
								for ( int x = 0; x < game.width; x++ )
									for ( int y = 0; y < game.height; y++ )
										game.playerList[ j ].see[ x, y ] = binReader.ReadBoolean();

								for ( int x = 0; x < game.width; x++ )
									for ( int y = 0; y < game.height; y++ )
										if ( !game.playerList[ j ].see[ x, y ] )
											game.playerList[ j ].discovered[ x, y ] = binReader.ReadBoolean();
										else
											game.playerList[ j ].discovered[ x, y ] = true;
								#endregion
							
								#region last seen game.grid
							
								game.playerList[ j ].lastSeen = new structures.lastSeen[ game.width, game.height ];
								for ( int x = 0; x < game.width; x++ )
									for ( int y = 0; y < game.height; y++ )
										if ( !game.playerList[ j ].see[ x, y ] && game.playerList[ j ].discovered[ x, y ] )
										{
											if ( Statistics.terrains[ game.grid[ x, y ].type ].ew == 1 )
											{
												game.playerList[ j ].lastSeen[ x, y ].cityPop = binReader.ReadByte();
												if ( game.playerList[ j ].lastSeen[ x, y ].cityPop > 0 )
													game.playerList[ j ].lastSeen[ x, y ].city = binReader.ReadInt32();

												game.playerList[ j ].lastSeen[ x, y ].civicImp = binReader.ReadByte();
												game.playerList[ j ].lastSeen[ x, y ].militaryImp = binReader.ReadByte();
												game.playerList[ j ].lastSeen[ x, y ].road = binReader.ReadByte();
												game.playerList[ j ].lastSeen[ x, y ].territory = binReader.ReadByte();
											}
											else if ( game.grid[ x, y ].type == (byte)enums.terrainType.coast )
											{
												game.playerList[ j ].lastSeen[ x, y ].territory = binReader.ReadByte();
											}

											game.playerList[ j ].lastSeen[ x, y ].turn = binReader.ReadInt32();
										}
								#endregion

								#region techno
								for ( int i = 0; i < tempTechnoNbr; i++ )
								{
									byte num = binReader.ReadByte();

									if ( i < Statistics.technologies.Length )
										switch ( num )
										{
											case 1 :
												if ( i < game.playerList[ j ].technos.Length )
													game.playerList[ j ].technos[ i ].researched = true;

												break;

											case 2 :
												if ( i < game.playerList[ j ].technos.Length )
												{
													game.playerList[ j ].technos[ i ].researched = false;
													game.playerList[ j ].technos[ i ].pntDiscovered = binReader.ReadInt32();
												}
												else
												{
													binReader.ReadInt32();
												}

												break;

											default :
												if ( i < game.playerList[ j ].technos.Length )
													game.playerList[ j ].technos[ i ].researched = false;

												break;
										}
								}
								#endregion

								#region units
								for ( int i = 1; i <= game.playerList[ j ].unitNumber; i++ )
								{
									game.playerList[ j ].unitList[ i ] = new UnitList(  game.playerList[ j ], i );
									game.playerList[ j ].unitList[ i ].state = binReader.ReadByte();
									if ( game.playerList[ j ].unitList[ i ].state != (byte)Form1.unitState.dead )
									{
										game.playerList[ j ].unitList[ i ].type = binReader.ReadByte();
										game.playerList[ j ].unitList[ i ].health = binReader.ReadSByte();
										game.playerList[ j ].unitList[ i ].level = binReader.ReadByte();
										game.playerList[ j ].unitList[ i ].moveLeft = binReader.ReadSByte();
										game.playerList[ j ].unitList[ i ].moveLeftFraction = binReader.ReadSByte();
										game.playerList[ j ].unitList[ i ].transported = binReader.ReadInt32();
										game.playerList[ j ].unitList[ i ].X = binReader.ReadInt32();
										game.playerList[ j ].unitList[ i ].Y = binReader.ReadInt32();
										game.playerList[ j ].unitList[ i ].dest.X = binReader.ReadInt32();
										game.playerList[ j ].unitList[ i ].dest.Y = binReader.ReadInt32();
										game.playerList[ j ].unitList[ i ].transport = new int[ Statistics.units[ game.playerList[ j ].unitList[ i ].type ].transport ];
										for ( int k = 0; k < game.playerList[ j ].unitList[ i ].transported; k++ )
											game.playerList[ j ].unitList[ i ].transport[ k ] = binReader.ReadInt32();

										game.playerList[ j ].unitList[ i ].automated = binReader.ReadBoolean(); //842
									}
								}
								#endregion

								#region cities
								for ( int i = 1; i <= game.playerList[ j ].cityNumber; i++ )
								{
									game.playerList[ j ].cityList[ i ] = new CityList( game.playerList[ j ], i );
									game.playerList[ j ].cityList[ i ].state = binReader.ReadByte();
									game.playerList[ j ].cityList[ i ].name = binReader.ReadString();
									if ( game.playerList[ j ].cityList[ i ].state != (byte)enums.cityState.dead )
									{
										game.playerList[ j ].cityList[ i ].construction.points = binReader.ReadInt32();

										// 0862
										for ( int k = 0; k < 10; k++ )
										{
											int cType =  binReader.ReadInt32();
											byte type = binReader.ReadByte();

											if ( cType != -1 )
												switch ( cType )
												{
													case 0:
														game.playerList[ j ].cityList[ i ].construction.list[ k ] = Statistics.units[ type ];
														break;

													case Stat.Unit.constructionType:
														game.playerList[ j ].cityList[ i ].construction.list[ k ] = Statistics.units[ type ];
														break;
												
													case Stat.Building.constructionType:
														game.playerList[ j ].cityList[ i ].construction.list[ k ] = Statistics.buildings[ type ];
														break;
												
													case Stat.Wealth.constructionType:
														game.playerList[ j ].cityList[ i ].construction.list[ k ] = new Stat.Wealth();
														break;
												
											/*		case Stat.SmallWonder.constructionType:
														game.playerList[ j ].cityList[ i ].construction.list[ k ] = Statistics.smallWonders[ type ];
														break;
												
													case Stat.Wonder.constructionType:
														game.playerList[ j ].cityList[ i ].construction.list[ k ] = Statistics.wonders[ type ];
														break;*/

													default:
														game.playerList[ j ].cityList[ i ].construction.list[ k ] = new Stat.Wealth();
														break;
												}
										//	game.playerList[ j ].cityList[ i ].construction.list[ k ].ind = binReader.ReadInt32();
										//	game.playerList[ j ].cityList[ i ].construction.list[ k ].type = binReader.ReadByte();	
										/*	game.playerList[ j ].cityList[ i ].construction.list[ k ].ind = binReader.ReadInt32();
											game.playerList[ j ].cityList[ i ].construction.list[ k ].type = binReader.ReadByte();	*/
										}

										// end 0862
										game.playerList[ j ].cityList[ i ].foodReserve = binReader.ReadInt32();
										game.playerList[ j ].cityList[ i ].laborOnField = binReader.ReadByte();
										game.playerList[ j ].cityList[ i ].originalOwner = binReader.ReadByte();
										game.playerList[ j ].cityList[ i ].population = binReader.ReadByte();
										game.playerList[ j ].cityList[ i ].X = binReader.ReadInt32();
										game.playerList[ j ].cityList[ i ].Y = binReader.ReadInt32();
										game.playerList[ j ].cityList[ i ].laborPos = new Point[ game.playerList[ j ].cityList[ i ].laborOnField ];
										for ( int k = 0; k < game.playerList[ j ].cityList[ i ].laborOnField; k++ )
										{
											game.playerList[ j ].cityList[ i ].laborPos[ k ].X = binReader.ReadInt32();
											game.playerList[ j ].cityList[ i ].laborPos[ k ].Y = binReader.ReadInt32();
										}

										game.playerList[ j ].cityList[ i ].buildingList = new bool[ Statistics.buildings.Length ];
										for ( int k = 0; k < buildingNbr; k++ )
											if ( k < game.playerList[ j ].cityList[ i ].buildingList.Length )
												game.playerList[ j ].cityList[ i ].buildingList[ k ] = binReader.ReadBoolean();
											else
												binReader.ReadBoolean();

										bool cap = binReader.ReadBoolean();

										game.playerList[ j ].cityList[ i ].isCapitale = cap;

										game.playerList[ j ].cityList[ i ].setHasDirectAccessToRessource();
									}
								}
								#endregion

								#region memories 0840

								game.playerList[ j ].memory = new Memory( game.playerList[ j ], binReader.ReadInt32() );
								for ( int i = 0; i < game.playerList[ j ].memory.Lenght; i++ )
								{
									game.playerList[ j ].memory.list[ i ].type = binReader.ReadByte();
									game.playerList[ j ].memory.list[ i ].turn = binReader.ReadInt32();
									game.playerList[ j ].memory.list[ i ].ind = new int[ binReader.ReadInt32() ];
									for ( int k = 0; k < game.playerList[ j ].memory.list[ i ].ind.Length; k++ )
										game.playerList[ j ].memory.list[ i ].ind[ k ] = binReader.ReadInt32();
								}

								#endregion

							}
						}
						#endregion

						// temp stack
						for ( int x = 0; x < game.width; x++ )
							for ( int y = 0; y < game.height; y++ )
								for ( int i = 1; i <= game.grid[ x, y ].stack.Length; i++ )
									game.grid[ x, y ].stack[ i - 1 ] = game.playerList[ tempStacks[ x ][ y ][ i - 1 ].owner ].unitList[ tempStacks[ x ][ y ][ i - 1 ].unit ];

						#region caseImp
						game.caseImps = new structures.caseImprovement[ binReader.ReadInt32() ];
						for ( int i = 0; i < game.caseImps.Length; i++ )
						{
							game.caseImps[ i ].construction = binReader.ReadByte();
							game.caseImps[ i ].constructionPntLeft = binReader.ReadInt32();
							game.caseImps[ i ].owner = binReader.ReadByte();
							game.caseImps[ i ].pos.X = binReader.ReadInt32();
							game.caseImps[ i ].pos.Y = binReader.ReadInt32();
							game.caseImps[ i ].type = binReader.ReadByte();
							game.caseImps[ i ].units = new UnitList[ binReader.ReadInt32() ];
							for ( int j = 0; j < game.caseImps[ i ].units.Length; j++ )
							{
							/*	game.caseImps[ i ].units[ j ].owner = binReader.ReadByte();
								game.caseImps[ i ].units[ j ].unit = binReader.ReadInt32();*/

								game.caseImps[ i ].units[ j ] = game.playerList[ binReader.ReadByte() ].unitList[ binReader.ReadInt32() ];
							}
						}
						#endregion

						#region label
						label.initList( binReader.ReadInt32() );
						for ( int i = 0; i < label.list.Length; i++ )
						{
							label.list[ i ].X = binReader.ReadInt32();
							label.list[ i ].Y = binReader.ReadInt32();
							label.list[ i ].text = binReader.ReadString();
						}
						#endregion

						#region tutorial 857

						/*tutorial.init( binReader.ReadBoolean() );
								tutorialLength =  binReader.ReadInt32();

								if ( Tutorial.mode )
									for ( int i = 0; i < tutorialLength; i ++ )
										if ( i < Tutorial.alreadySeen.Length )
											tutorial.alreadySeen[ i ] =  binReader.ReadBoolean();*/

						#endregion

						#region custom nation 872
						if ( binReader.ReadBoolean() ) // game.playerList[ Form1.game.curPlayerInd ].civType == Statistics.normalCivilizationNumber )
						{
							Stat.Civilization[] buffer = Statistics.civilizations;

							Statistics.civilizations = new Stat.Civilization[ buffer.Length + 1 ];
							for ( int i = 0; i < buffer.Length; i++ )
								Statistics.civilizations[ i ] = buffer[ i ];

							Statistics.civilizations[ buffer.Length ].name = binReader.ReadString();
							Statistics.civilizations[ buffer.Length ].color = Color.FromArgb( 
								binReader.ReadByte(), 
								binReader.ReadByte(),
								binReader.ReadByte() 
								);
							Statistics.civilizations[ buffer.Length ].description = binReader.ReadString();
							Statistics.civilizations[ buffer.Length ].cityNames = Statistics.civilizations[ binReader.ReadByte() ].cityNames;
						}
						#endregion
						

						//	bool testing = binReader.ReadBoolean();
						/*	
								options.showLabels = true;
								options.showCommonSpyDialogs = true;
								*/
						Tutorial.init( false );
			
						#endregion
					}
					else if ( version == 877 )
					{
						#region case 0877

						Form1.sliHor = binReader.ReadInt32();
						Form1.sliVer = binReader.ReadInt32();
						int width = binReader.ReadInt32(),
							height = binReader.ReadInt32();

						game = new Game( width, height );

						game.curTurn = binReader.ReadInt32();
						Form1.options.frontierType = (Options.FrontierTypes)binReader.ReadByte();
						Form1.options.miniMapType = (Options.MiniMapTypes)binReader.ReadByte();
						buildingNbr = binReader.ReadInt32();
						tempTechnoNbr = binReader.ReadInt32();
						Form1.options.hideUndiscovered = binReader.ReadBoolean();
						Form1.options.showGrid = binReader.ReadBoolean();
						Form1.options.showOnScreenDPad = binReader.ReadBoolean();
						Form1.options.showBatteryStatus = binReader.ReadBoolean();
						Form1.options.showLabels = binReader.ReadBoolean();
						Form1.options.showCommonSpyDialogs = binReader.ReadBoolean();
						Form1.options.autosave = binReader.ReadBoolean(); 

						// temp
						structures.sStack[][][] tempStacks = new xycv_ppc.structures.sStack[ game.width ][][];

						for ( int x = 0; x < game.width; x ++ )
							tempStacks[ x ] = new xycv_ppc.structures.sStack[ game.height ][];
					
				/*		for ( int x = 0; x < game.width; x++ )
							for ( int y = 0; y < game.height; y++ )
								tempStacks[ x ][ y ] = new xycv_ppc.structures.sStack		*/

						// end temp

						#region game.grid
						//		game.grid = new structures.sGrid[ game.width, game.height ];
						for ( int x = 0; x < game.width; x++ )
							for ( int y = 0; y < game.height; y++ )
							{
								game.grid[ x, y ].type = binReader.ReadByte();
								if ( game.grid[ x, y ].type != (byte)enums.terrainType.sea && game.grid[ x, y ].type != (byte)enums.terrainType.coast )
								{
									if ( binReader.ReadBoolean() )
										game.grid[ x, y ].city = binReader.ReadInt32();
									else
										game.grid[ x, y ].city = 0;

									game.grid[ x, y ].civicImprovement = binReader.ReadByte();
									game.grid[ x, y ].militaryImprovement = binReader.ReadByte();
									game.grid[ x, y ].roadLevel = binReader.ReadByte();
									game.grid[ x, y ].continent = binReader.ReadByte();
									if ( binReader.ReadBoolean() )
										game.grid[ x, y ].resources = binReader.ReadByte();

									game.grid[ x, y ].river = binReader.ReadBoolean(); // 863 
									if ( game.grid[ x, y ].river )
									{
										game.grid[ x, y ].riversDir = new bool[ 8 ];
										for ( int v = 0; v < game.grid[ x, y ].riversDir.Length; v++ )
											game.grid[ x, y ].riversDir[ v ] = binReader.ReadBoolean();
									}
								}

								if ( binReader.ReadBoolean() )
									game.grid[ x, y ].laborCity = binReader.ReadInt32();
								else
									game.grid[ x, y ].laborCity = 0;

								if ( binReader.ReadBoolean() )
								{
									
									tempStacks[ x ][ y ] = new xycv_ppc.structures.sStack[ binReader.ReadInt32() ];

									game.grid[ x, y ].stack = new UnitList[ tempStacks[ x ][ y ].Length ];
									game.grid[ x, y ].stackPos = binReader.ReadInt32();
								}
								else
								{
									
									tempStacks[ x ][ y ] = new xycv_ppc.structures.sStack[ 0 ];

									game.grid[ x, y ].stack = new UnitList[ 0 ];
									game.grid[ x, y ].stackPos = 0;
								}
							}
						#endregion

						#region stack
						for ( int x = 0; x < game.width; x++ )
							for ( int y = 0; y < game.height; y++ )
								for ( int i = 1; i <= game.grid[ x, y ].stack.Length; i++ )
								{
									tempStacks[ x ][ y ][ i - 1 ].owner = binReader.ReadByte();
									tempStacks[ x ][ y ][ i - 1 ].unit = binReader.ReadInt32();

								/*	game.grid[ x, y ].stack[ i - 1 ].player.player = binReader.ReadByte();
									game.grid[ x, y ].stack[ i - 1 ].unit = binReader.ReadInt32();*/
								}

					/*	
						for ( int x = 0; x < game.width; x++ )
							for ( int y = 0; y < game.height; y++ )
								for ( int i = 1; i <= game.grid[ x, y ].stack.Length; i++ )
								{
									game.grid[ x, y ].stack[ i - 1 ].player.player = binReader.ReadByte();
									game.grid[ x, y ].stack[ i - 1 ].unit = binReader.ReadInt32();
								}
					*/
						#endregion

						game.difficulty = binReader.ReadByte();
						nbrPlayer = binReader.ReadByte();
						game.playerList = new PlayerList[ nbrPlayer ]; 

						#region players # # #
						for ( int j = 0; j < nbrPlayer; j++ )
						{
							game.playerList[ j ] = new PlayerList( game, j );
							game.playerList[ j ].playerName = binReader.ReadString();
							game.playerList[ j ].civType = binReader.ReadByte();
							game.playerList[ j ].cityNumber = binReader.ReadInt32();
							game.playerList[ j ].unitNumber = binReader.ReadInt32();
							game.playerList[ j ].dead = binReader.ReadBoolean();
							if ( game.playerList[ j ].dead )
							{
								game.playerList[ j ].cityNumber = 0;
								game.playerList[ j ].unitNumber = 0;
							}

							if ( !game.playerList[ j ].dead )
							{
								game.playerList[ j ].currentResearch = binReader.ReadByte();
								game.playerList[ j ].money = binReader.ReadInt64();
								game.playerList[ j ].preferences.laborFood = binReader.ReadSByte();
								game.playerList[ j ].preferences.laborProd = binReader.ReadSByte();
								game.playerList[ j ].preferences.laborTrade = binReader.ReadSByte();
								game.playerList[ j ].preferences.science = binReader.ReadSByte();
								game.playerList[ j ].preferences.reserve = binReader.ReadSByte();
								game.playerList[ j ].preferences.buildings = binReader.ReadSByte();
								game.playerList[ j ].preferences.culture = binReader.ReadSByte();
								game.playerList[ j ].preferences.intelligence = binReader.ReadSByte();
								game.playerList[ j ].preferences.military = binReader.ReadSByte();
								game.playerList[ j ].preferences.space = binReader.ReadSByte();
								game.playerList[ j ].counterIntNbr = binReader.ReadInt32();
								game.playerList[ j ].govType = Statistics.governements[ binReader.ReadByte() ];
								game.playerList[ j ].economyType = binReader.ReadByte();
								game.playerList[ j ].posInCityFile = binReader.ReadByte();
								game.playerList[ j ].technos = new structures.technoList[ Statistics.technologies.Length ];
								game.playerList[ j ].discovered = new bool[ game.width, game.height ];
								game.playerList[ j ].see = new bool[ game.width, game.height ];
								game.playerList[ j ].unitList = new UnitList[ game.playerList[ j ].unitNumber + 10 ];
								game.playerList[ j ].cityList = new CityList[ game.playerList[ j ].cityNumber + 10 ];
								game.playerList[ j ].foreignRelation = new structures.sForeignRelation[ nbrPlayer ]; 
					
								#region foreignRelations
								for ( int i = 0; i < nbrPlayer; i++ )
								{
									game.playerList[ j ].foreignRelation[ i ].spies = new xycv_ppc.structures.sSpies[ 4 ];
									for ( int k = 0; k < 4; k++ )
										game.playerList[ j ].foreignRelation[ i ].spies[ k ] = new xycv_ppc.structures.sSpies();

									game.playerList[ j ].foreignRelation[ i ].madeContact = binReader.ReadBoolean();
									if ( game.playerList[ j ].foreignRelation[ i ].madeContact )
									{
										game.playerList[ j ].foreignRelation[ i ].quality = binReader.ReadByte();
										game.playerList[ j ].foreignRelation[ i ].politic = binReader.ReadByte();
										game.playerList[ j ].foreignRelation[ i ].embargo = binReader.ReadBoolean();
										game.playerList[ j ].foreignRelation[ i ].spies[ (byte)enums.spyType.people ].nbr = binReader.ReadInt32();
										game.playerList[ j ].foreignRelation[ i ].spies[ (byte)enums.spyType.people ].efficiency = binReader.ReadByte();
										game.playerList[ j ].foreignRelation[ i ].spies[ (byte)enums.spyType.gov ].nbr = binReader.ReadInt32();
										game.playerList[ j ].foreignRelation[ i ].spies[ (byte)enums.spyType.gov ].efficiency = binReader.ReadByte();
										game.playerList[ j ].foreignRelation[ i ].spies[ (byte)enums.spyType.military ].nbr = binReader.ReadInt32();
										game.playerList[ j ].foreignRelation[ i ].spies[ (byte)enums.spyType.military ].efficiency = binReader.ReadByte();
										game.playerList[ j ].foreignRelation[ i ].spies[ (byte)enums.spyType.science ].nbr = binReader.ReadInt32();
										game.playerList[ j ].foreignRelation[ i ].spies[ (byte)enums.spyType.science ].efficiency = binReader.ReadByte();
									}
								}
								#endregion

								#region see & discovered
								for ( int x = 0; x < game.width; x++ )
									for ( int y = 0; y < game.height; y++ )
										game.playerList[ j ].see[ x, y ] = binReader.ReadBoolean();

								for ( int x = 0; x < game.width; x++ )
									for ( int y = 0; y < game.height; y++ )
										if ( !game.playerList[ j ].see[ x, y ] )
											game.playerList[ j ].discovered[ x, y ] = binReader.ReadBoolean();
										else
											game.playerList[ j ].discovered[ x, y ] = true;
								#endregion
							
								#region last seen game.grid
							
								game.playerList[ j ].lastSeen = new structures.lastSeen[ game.width, game.height ];
								for ( int x = 0; x < game.width; x++ )
									for ( int y = 0; y < game.height; y++ )
										if ( !game.playerList[ j ].see[ x, y ] && game.playerList[ j ].discovered[ x, y ] )
										{
											if ( Statistics.terrains[ game.grid[ x, y ].type ].ew == 1 )
											{
												game.playerList[ j ].lastSeen[ x, y ].cityPop = binReader.ReadByte();
												if ( game.playerList[ j ].lastSeen[ x, y ].cityPop > 0 )
													game.playerList[ j ].lastSeen[ x, y ].city = binReader.ReadInt32();

												game.playerList[ j ].lastSeen[ x, y ].civicImp = binReader.ReadByte();
												game.playerList[ j ].lastSeen[ x, y ].militaryImp = binReader.ReadByte();
												game.playerList[ j ].lastSeen[ x, y ].road = binReader.ReadByte();
												game.playerList[ j ].lastSeen[ x, y ].territory = binReader.ReadByte();
											}
											else if ( game.grid[ x, y ].type == (byte)enums.terrainType.coast )
											{
												game.playerList[ j ].lastSeen[ x, y ].territory = binReader.ReadByte();
											}

											game.playerList[ j ].lastSeen[ x, y ].turn = binReader.ReadInt32();
										}
								#endregion

								#region techno
								for ( int i = 0; i < tempTechnoNbr; i++ )
								{
									byte num = binReader.ReadByte();

									if ( i < Statistics.technologies.Length )
										switch ( num )
										{
											case 1 :
												if ( i < game.playerList[ j ].technos.Length )
													game.playerList[ j ].technos[ i ].researched = true;

												break;

											case 2 :
												if ( i < game.playerList[ j ].technos.Length )
												{
													game.playerList[ j ].technos[ i ].researched = false;
													game.playerList[ j ].technos[ i ].pntDiscovered = binReader.ReadInt32();
												}
												else
												{
													binReader.ReadInt32();
												}

												break;

											default :
												if ( i < game.playerList[ j ].technos.Length )
													game.playerList[ j ].technos[ i ].researched = false;

												break;
										}
								}
								#endregion

								#region units
								for ( int i = 1; i <= game.playerList[ j ].unitNumber; i++ )
								{
									game.playerList[ j ].unitList[ i ] = new UnitList( game.playerList[ j ], i );
									game.playerList[ j ].unitList[ i ].state = binReader.ReadByte();
									if ( game.playerList[ j ].unitList[ i ].state != (byte)Form1.unitState.dead )
									{
										game.playerList[ j ].unitList[ i ].type = binReader.ReadByte();
										game.playerList[ j ].unitList[ i ].health = binReader.ReadSByte();
										game.playerList[ j ].unitList[ i ].level = binReader.ReadByte();
										game.playerList[ j ].unitList[ i ].moveLeft = binReader.ReadSByte();
										game.playerList[ j ].unitList[ i ].moveLeftFraction = binReader.ReadSByte();
										game.playerList[ j ].unitList[ i ].transported = binReader.ReadInt32();
										game.playerList[ j ].unitList[ i ].X = binReader.ReadInt32();
										game.playerList[ j ].unitList[ i ].Y = binReader.ReadInt32();
										game.playerList[ j ].unitList[ i ].dest.X = binReader.ReadInt32();
										game.playerList[ j ].unitList[ i ].dest.Y = binReader.ReadInt32();
										game.playerList[ j ].unitList[ i ].transport = new int[ Statistics.units[ game.playerList[ j ].unitList[ i ].type ].transport ];
										for ( int k = 0; k < game.playerList[ j ].unitList[ i ].transported; k++ )
											game.playerList[ j ].unitList[ i ].transport[ k ] = binReader.ReadInt32();

										game.playerList[ j ].unitList[ i ].automated = binReader.ReadBoolean(); //842
									}
								}
								#endregion

								#region cities
								for ( int i = 1; i <= game.playerList[ j ].cityNumber; i++ )
								{
									game.playerList[ j ].cityList[ i ] = new CityList( game.playerList[ j ], i );
									game.playerList[ j ].cityList[ i ].state = binReader.ReadByte();
									game.playerList[ j ].cityList[ i ].name = binReader.ReadString();
									if ( game.playerList[ j ].cityList[ i ].state != (byte)enums.cityState.dead )
									{
										game.playerList[ j ].cityList[ i ].construction.points = binReader.ReadInt32();

										// 0862
										for ( int k = 0; k < 10; k++ )
										{
											int cType =  binReader.ReadInt32();
											byte type = binReader.ReadByte();

											if ( cType != -1 )
												switch ( cType )
												{
													case 0:
														game.playerList[ j ].cityList[ i ].construction.list[ k ] = Statistics.units[ type ];
														break;

													case Stat.Unit.constructionType:
														game.playerList[ j ].cityList[ i ].construction.list[ k ] = Statistics.units[ type ];
														break;
												
													case Stat.Building.constructionType:
														game.playerList[ j ].cityList[ i ].construction.list[ k ] = Statistics.buildings[ type ];
														break;
												
													case Stat.Wealth.constructionType:
														game.playerList[ j ].cityList[ i ].construction.list[ k ] = new Stat.Wealth();
														break;
												
														/*		case Stat.SmallWonder.constructionType:
																	game.playerList[ j ].cityList[ i ].construction.list[ k ] = Statistics.smallWonders[ type ];
																	break;
												
																case Stat.Wonder.constructionType:
																	game.playerList[ j ].cityList[ i ].construction.list[ k ] = Statistics.wonders[ type ];
																	break;*/

													default:
														game.playerList[ j ].cityList[ i ].construction.list[ k ] = new Stat.Wealth();
														break;
												}
										//	game.playerList[ j ].cityList[ i ].construction.list[ k ].ind = binReader.ReadInt32();
										//	game.playerList[ j ].cityList[ i ].construction.list[ k ].type = binReader.ReadByte();
										}

										// end 0862
										game.playerList[ j ].cityList[ i ].foodReserve = binReader.ReadInt32();
										game.playerList[ j ].cityList[ i ].laborOnField = binReader.ReadByte();
										game.playerList[ j ].cityList[ i ].originalOwner = binReader.ReadByte();
										game.playerList[ j ].cityList[ i ].population = binReader.ReadByte();
										game.playerList[ j ].cityList[ i ].X = binReader.ReadInt32();
										game.playerList[ j ].cityList[ i ].Y = binReader.ReadInt32();
										game.playerList[ j ].cityList[ i ].laborPos = new Point[ game.playerList[ j ].cityList[ i ].laborOnField ];
										for ( int k = 0; k < game.playerList[ j ].cityList[ i ].laborOnField; k++ )
										{
											game.playerList[ j ].cityList[ i ].laborPos[ k ].X = binReader.ReadInt32();
											game.playerList[ j ].cityList[ i ].laborPos[ k ].Y = binReader.ReadInt32();
										}

										game.playerList[ j ].cityList[ i ].buildingList = new bool[ Statistics.buildings.Length ];
										for ( int k = 0; k < buildingNbr; k++ )
											if ( k < game.playerList[ j ].cityList[ i ].buildingList.Length )
												game.playerList[ j ].cityList[ i ].buildingList[ k ] = binReader.ReadBoolean();
											else
												binReader.ReadBoolean();

										bool cap = binReader.ReadBoolean();

										game.playerList[ j ].cityList[ i ].isCapitale = cap;

										//0877
										game.playerList[ j ].cityList[ i ].nonLabor.list = new byte[ binReader.ReadInt32() ];
										for ( int k = 0; k < game.playerList[ j ].cityList[ i ].nonLabor.list.Length; k++ )
											game.playerList[ j ].cityList[ i ].nonLabor.list[ k ] = binReader.ReadByte();

										game.playerList[ j ].cityList[ i ].slaves.list = new byte[ binReader.ReadInt32() ];
										for ( int k = 0; k < game.playerList[ j ].cityList[ i ].slaves.list.Length; k++ )
											game.playerList[ j ].cityList[ i ].slaves.list[ k ] = binReader.ReadByte();
										//end of 0877

										game.playerList[ j ].cityList[ i ].setHasDirectAccessToRessource();
									}
								}
								#endregion

								#region memories 0840

								game.playerList[ j ].memory = new Memory( game.playerList[ j ], binReader.ReadInt32() );
								for ( int i = 0; i < game.playerList[ j ].memory.Lenght; i++ )
								{
									game.playerList[ j ].memory.list[ i ].type = binReader.ReadByte();
									game.playerList[ j ].memory.list[ i ].turn = binReader.ReadInt32();
									game.playerList[ j ].memory.list[ i ].ind = new int[ binReader.ReadInt32() ];
									for ( int k = 0; k < game.playerList[ j ].memory.list[ i ].ind.Length; k++ )
										game.playerList[ j ].memory.list[ i ].ind[ k ] = binReader.ReadInt32();
								}

								#endregion

								#region slaves 0878
								game.playerList[ j ].slaves.transferts = new playerSlavery.transfertList[ binReader.ReadInt32() ];
								for ( int i = 0; i < game.playerList[ j ].slaves.transferts.Length; i++ )
								{
									game.playerList[ j ].slaves.transferts[ i ].dest = binReader.ReadInt32();
									game.playerList[ j ].slaves.transferts[ i ].ori = binReader.ReadInt32();
									game.playerList[ j ].slaves.transferts[ i ].nbr = binReader.ReadInt32();
									game.playerList[ j ].slaves.transferts[ i ].eta = binReader.ReadInt32();
								}
								#endregion

							}
						}
						#endregion

						// temp stack
						for ( int x = 0; x < game.width; x++ )
							for ( int y = 0; y < game.height; y++ )
								for ( int i = 1; i <= game.grid[ x, y ].stack.Length; i++ )
									game.grid[ x, y ].stack[ i - 1 ] = game.playerList[ tempStacks[ x ][ y ][ i - 1 ].owner ].unitList[ tempStacks[ x ][ y ][ i - 1 ].unit ];

						#region caseImp
						game.caseImps = new structures.caseImprovement[ binReader.ReadInt32() ];
						for ( int i = 0; i < game.caseImps.Length; i++ )
						{
							game.caseImps[ i ].construction = binReader.ReadByte();
							game.caseImps[ i ].constructionPntLeft = binReader.ReadInt32();
							game.caseImps[ i ].owner = binReader.ReadByte();
							game.caseImps[ i ].pos.X = binReader.ReadInt32();
							game.caseImps[ i ].pos.Y = binReader.ReadInt32();
							game.caseImps[ i ].type = binReader.ReadByte();
							game.caseImps[ i ].units = new UnitList[ binReader.ReadInt32() ];
							for ( int j = 0; j < game.caseImps[ i ].units.Length; j++ )
							{
								/*	game.caseImps[ i ].units[ j ].owner = binReader.ReadByte();
									game.caseImps[ i ].units[ j ].unit = binReader.ReadInt32();*/

								game.caseImps[ i ].units[ j ] = game.playerList[ binReader.ReadByte() ].unitList[ binReader.ReadInt32() ];
							}
						}
						#endregion

						#region label
						label.initList( binReader.ReadInt32() );
						for ( int i = 0; i < label.list.Length; i++ )
						{
							label.list[ i ].X = binReader.ReadInt32();
							label.list[ i ].Y = binReader.ReadInt32();
							label.list[ i ].text = binReader.ReadString();
						}
						#endregion

						#region tutorial 857

						/*tutorial.init( binReader.ReadBoolean() );
								tutorialLength =  binReader.ReadInt32();

								if ( Tutorial.mode )
									for ( int i = 0; i < tutorialLength; i ++ )
										if ( i < Tutorial.alreadySeen.Length )
											tutorial.alreadySeen[ i ] =  binReader.ReadBoolean();*/

						#endregion

						#region custom nation 872
						if ( binReader.ReadBoolean() ) // game.playerList[ Form1.game.curPlayerInd ].civType == Statistics.normalCivilizationNumber )
						{
							Stat.Civilization[] buffer = Statistics.civilizations;

							Statistics.civilizations = new Stat.Civilization[ buffer.Length + 1 ];
							for ( int i = 0; i < buffer.Length; i++ )
								Statistics.civilizations[ i ] = buffer[ i ];

							Statistics.civilizations[ buffer.Length ].name = binReader.ReadString();
							Statistics.civilizations[ buffer.Length ].color = Color.FromArgb( binReader.ReadByte(), binReader.ReadByte(), binReader.ReadByte() );
							Statistics.civilizations[ buffer.Length ].description = binReader.ReadString();
							Statistics.civilizations[ buffer.Length ].cityNames = Statistics.civilizations[ binReader.ReadByte() ].cityNames;
						}
						#endregion
						

						//	bool testing = binReader.ReadBoolean();
						/*	
							options.showLabels = true;
							options.showCommonSpyDialogs = true;
							*/
						Tutorial.init( false );
			
						#endregion
					}
					else if ( version == 885 )
					{
						#region case 0885

						Form1.sliHor = binReader.ReadInt32();
						Form1.sliVer = binReader.ReadInt32();
						int width = binReader.ReadInt32(),
							height = binReader.ReadInt32();

						game = new Game( width, height );

						game.curTurn = binReader.ReadInt32();
						Form1.options.frontierType = (Options.FrontierTypes)binReader.ReadByte();
						Form1.options.miniMapType = (Options.MiniMapTypes)binReader.ReadByte();
						buildingNbr = binReader.ReadInt32();
						tempTechnoNbr = binReader.ReadInt32();
						Form1.options.hideUndiscovered = binReader.ReadBoolean();
						Form1.options.showGrid = binReader.ReadBoolean();
						Form1.options.showOnScreenDPad = binReader.ReadBoolean();
						Form1.options.showBatteryStatus = binReader.ReadBoolean();
						Form1.options.showLabels = binReader.ReadBoolean();
						Form1.options.showCommonSpyDialogs = binReader.ReadBoolean();
						Form1.options.autosave = binReader.ReadBoolean(); 

						// temp
						structures.sStack[][][] tempStacks = new xycv_ppc.structures.sStack[ game.width ][][];

						for ( int x = 0; x < game.width; x ++ )
							tempStacks[ x ] = new xycv_ppc.structures.sStack[ game.height ][];

						#region game.grid
						//		game.grid = new structures.sGrid[ game.width, game.height ];
						for ( int x = 0; x < game.width; x++ )
							for ( int y = 0; y < game.height; y++ )
							{
								game.grid[ x, y ].type = binReader.ReadByte();
								if ( game.grid[ x, y ].type != (byte)enums.terrainType.sea && game.grid[ x, y ].type != (byte)enums.terrainType.coast )
								{
									if ( binReader.ReadBoolean() )
										game.grid[ x, y ].city = binReader.ReadInt32();
									else
										game.grid[ x, y ].city = 0;

									game.grid[ x, y ].civicImprovement = binReader.ReadByte();
									game.grid[ x, y ].militaryImprovement = binReader.ReadByte();
									game.grid[ x, y ].roadLevel = binReader.ReadByte();
									game.grid[ x, y ].continent = binReader.ReadByte();

									if ( binReader.ReadBoolean() )
										game.grid[ x, y ].resources = binReader.ReadByte();

									game.grid[ x, y ].river = binReader.ReadBoolean(); // 863 

									if ( game.grid[ x, y ].river )
									{
										game.grid[ x, y ].riversDir = new bool[ 8 ];
										for ( int v = 0; v < game.grid[ x, y ].riversDir.Length; v++ )
											game.grid[ x, y ].riversDir[ v ] = binReader.ReadBoolean();
									}
								}

								if ( binReader.ReadBoolean() )
									game.grid[ x, y ].laborCity = binReader.ReadInt32();
								else
									game.grid[ x, y ].laborCity = 0;


								if ( binReader.ReadBoolean() )
								{
									
									tempStacks[ x ][ y ] = new xycv_ppc.structures.sStack[ binReader.ReadInt32() ];

									game.grid[ x, y ].stack = new UnitList[ tempStacks[ x ][ y ].Length ];
									game.grid[ x, y ].stackPos = binReader.ReadInt32();
								}
								else
								{
									
									tempStacks[ x ][ y ] = new xycv_ppc.structures.sStack[ 0 ];

									game.grid[ x, y ].stack = new UnitList[ 0 ];
									game.grid[ x, y ].stackPos = 0;
								}
							}
						#endregion

						#region stack
						for ( int x = 0; x < game.width; x++ )
							for ( int y = 0; y < game.height; y++ )
								for ( int i = 1; i <= game.grid[ x, y ].stack.Length; i++ )
								{
									tempStacks[ x ][ y ][ i - 1 ].owner = binReader.ReadByte();
									tempStacks[ x ][ y ][ i - 1 ].unit = binReader.ReadInt32();

									/*	game.grid[ x, y ].stack[ i - 1 ].player.player = binReader.ReadByte();
										game.grid[ x, y ].stack[ i - 1 ].unit = binReader.ReadInt32();*/
								}
						#endregion

						game.difficulty = binReader.ReadByte(); 
						nbrPlayer = binReader.ReadByte(); // binReader.ReadInt32(); 
						game.playerList = new PlayerList[ nbrPlayer ]; 

						#region players # # #
						for ( int j = 0; j < nbrPlayer; j++ )
						{
							game.playerList[ j ] = new PlayerList( game, j );
							game.playerList[ j ].playerName = binReader.ReadString();
							game.playerList[ j ].civType = binReader.ReadByte();
							game.playerList[ j ].cityNumber = binReader.ReadInt32();
							game.playerList[ j ].unitNumber = binReader.ReadInt32();
							game.playerList[ j ].dead = binReader.ReadBoolean();
							if ( game.playerList[ j ].dead )
							{
								game.playerList[ j ].cityNumber = 0;
								game.playerList[ j ].unitNumber = 0;
							}

							if ( !game.playerList[ j ].dead )
							{
								game.playerList[ j ].currentResearch = binReader.ReadByte();
								game.playerList[ j ].money = binReader.ReadInt64();
								game.playerList[ j ].preferences.laborFood = binReader.ReadSByte();
								game.playerList[ j ].preferences.laborProd = binReader.ReadSByte();
								game.playerList[ j ].preferences.laborTrade = binReader.ReadSByte();
								game.playerList[ j ].preferences.science = binReader.ReadSByte();
								game.playerList[ j ].preferences.reserve = binReader.ReadSByte();
								game.playerList[ j ].preferences.buildings = binReader.ReadSByte();
								game.playerList[ j ].preferences.culture = binReader.ReadSByte();
								game.playerList[ j ].preferences.intelligence = binReader.ReadSByte();
								game.playerList[ j ].preferences.military = binReader.ReadSByte();
								game.playerList[ j ].preferences.space = binReader.ReadSByte();
								game.playerList[ j ].counterIntNbr = binReader.ReadInt32();
								game.playerList[ j ].govType = Statistics.governements[ binReader.ReadByte() ];
								game.playerList[ j ].economyType = binReader.ReadByte();
								game.playerList[ j ].posInCityFile = binReader.ReadByte();
								game.playerList[ j ].technos = new structures.technoList[ Statistics.technologies.Length ];
								game.playerList[ j ].discovered = new bool[ game.width, game.height ];
								game.playerList[ j ].see = new bool[ game.width, game.height ];
								game.playerList[ j ].unitList = new UnitList[ game.playerList[ j ].unitNumber + 10 ];
								game.playerList[ j ].cityList = new CityList[ game.playerList[ j ].cityNumber + 10 ];
								game.playerList[ j ].foreignRelation = new structures.sForeignRelation[ nbrPlayer ]; 
					
								#region foreignRelations
								for ( int i = 0; i < nbrPlayer; i++ )
								{
									game.playerList[ j ].foreignRelation[ i ].spies = new xycv_ppc.structures.sSpies[ 4 ];
									for ( int k = 0; k < 4; k++ )
										game.playerList[ j ].foreignRelation[ i ].spies[ k ] = new xycv_ppc.structures.sSpies();

									game.playerList[ j ].foreignRelation[ i ].madeContact = binReader.ReadBoolean();
									if ( game.playerList[ j ].foreignRelation[ i ].madeContact )
									{
										game.playerList[ j ].foreignRelation[ i ].quality = binReader.ReadByte();
										game.playerList[ j ].foreignRelation[ i ].politic = binReader.ReadByte();
										game.playerList[ j ].foreignRelation[ i ].embargo = binReader.ReadBoolean();
										game.playerList[ j ].foreignRelation[ i ].spies[ (byte)enums.spyType.people ].nbr = binReader.ReadInt32();
										game.playerList[ j ].foreignRelation[ i ].spies[ (byte)enums.spyType.people ].efficiency = binReader.ReadByte();
										game.playerList[ j ].foreignRelation[ i ].spies[ (byte)enums.spyType.gov ].nbr = binReader.ReadInt32();
										game.playerList[ j ].foreignRelation[ i ].spies[ (byte)enums.spyType.gov ].efficiency = binReader.ReadByte();
										game.playerList[ j ].foreignRelation[ i ].spies[ (byte)enums.spyType.military ].nbr = binReader.ReadInt32();
										game.playerList[ j ].foreignRelation[ i ].spies[ (byte)enums.spyType.military ].efficiency = binReader.ReadByte();
										game.playerList[ j ].foreignRelation[ i ].spies[ (byte)enums.spyType.science ].nbr = binReader.ReadInt32();
										game.playerList[ j ].foreignRelation[ i ].spies[ (byte)enums.spyType.science ].efficiency = binReader.ReadByte();
									}
								}
								#endregion

								#region see & discovered
								for ( int x = 0; x < game.width; x++ )
									for ( int y = 0; y < game.height; y++ )
										game.playerList[ j ].see[ x, y ] = binReader.ReadBoolean();

								for ( int x = 0; x < game.width; x++ )
									for ( int y = 0; y < game.height; y++ )
										if ( !game.playerList[ j ].see[ x, y ] )
											game.playerList[ j ].discovered[ x, y ] = binReader.ReadBoolean();
										else
											game.playerList[ j ].discovered[ x, y ] = true;
								#endregion
							
								#region last seen game.grid
							
								game.playerList[ j ].lastSeen = new structures.lastSeen[ game.width, game.height ];
								for ( int x = 0; x < game.width; x++ )
									for ( int y = 0; y < game.height; y++ )
										if ( !game.playerList[ j ].see[ x, y ] && game.playerList[ j ].discovered[ x, y ] )
										{
											if ( Statistics.terrains[ game.grid[ x, y ].type ].ew == 1 )
											{
												game.playerList[ j ].lastSeen[ x, y ].cityPop = binReader.ReadByte();
												if ( game.playerList[ j ].lastSeen[ x, y ].cityPop > 0 )
													game.playerList[ j ].lastSeen[ x, y ].city = binReader.ReadInt32();

												game.playerList[ j ].lastSeen[ x, y ].civicImp = binReader.ReadByte();
												game.playerList[ j ].lastSeen[ x, y ].militaryImp = binReader.ReadByte();
												game.playerList[ j ].lastSeen[ x, y ].road = binReader.ReadByte();
												game.playerList[ j ].lastSeen[ x, y ].territory = binReader.ReadByte();
											}
											else if ( game.grid[ x, y ].type == (byte)enums.terrainType.coast )
											{
												game.playerList[ j ].lastSeen[ x, y ].territory = binReader.ReadByte();
											}

											game.playerList[ j ].lastSeen[ x, y ].turn = binReader.ReadInt32();
										}
								#endregion

								#region techno
								for ( int i = 0; i < tempTechnoNbr; i++ )
								{
									byte num = binReader.ReadByte();

									if ( i < Statistics.technologies.Length )
										switch ( num )
										{
											case 1 :
												if ( i < game.playerList[ j ].technos.Length )
													game.playerList[ j ].technos[ i ].researched = true;

												break;

											case 2 :
												if ( i < game.playerList[ j ].technos.Length )
												{
													game.playerList[ j ].technos[ i ].researched = false;
													game.playerList[ j ].technos[ i ].pntDiscovered = binReader.ReadInt32();
												}
												else
												{
													binReader.ReadInt32();
												}

												break;

											default :
												if ( i < game.playerList[ j ].technos.Length )
													game.playerList[ j ].technos[ i ].researched = false;

												break;
										}
								}
								#endregion

								#region units
								for ( int i = 1; i <= game.playerList[ j ].unitNumber; i++ )
								{
									game.playerList[ j ].unitList[ i ] = new UnitList( game.playerList[ j ], i );
									game.playerList[ j ].unitList[ i ].state = binReader.ReadByte();
									if ( game.playerList[ j ].unitList[ i ].state != (byte)Form1.unitState.dead )
									{
										game.playerList[ j ].unitList[ i ].type = binReader.ReadByte();
										game.playerList[ j ].unitList[ i ].health = binReader.ReadSByte();
										game.playerList[ j ].unitList[ i ].level = binReader.ReadByte();
										game.playerList[ j ].unitList[ i ].moveLeft = binReader.ReadSByte();
										game.playerList[ j ].unitList[ i ].moveLeftFraction = binReader.ReadSByte();
										game.playerList[ j ].unitList[ i ].transported = binReader.ReadInt32();
										game.playerList[ j ].unitList[ i ].X = binReader.ReadInt32();
										game.playerList[ j ].unitList[ i ].Y = binReader.ReadInt32();
										game.playerList[ j ].unitList[ i ].dest.X = binReader.ReadInt32();
										game.playerList[ j ].unitList[ i ].dest.Y = binReader.ReadInt32();
										game.playerList[ j ].unitList[ i ].transport = new int[ Statistics.units[ game.playerList[ j ].unitList[ i ].type ].transport ];
										for ( int k = 0; k < game.playerList[ j ].unitList[ i ].transported; k++ )
											game.playerList[ j ].unitList[ i ].transport[ k ] = binReader.ReadInt32();

										game.playerList[ j ].unitList[ i ].automated = binReader.ReadBoolean(); //842
									}
								}
								#endregion

								#region cities
								for ( int i = 1; i <= game.playerList[ j ].cityNumber; i++ )
								{
									game.playerList[ j ].cityList[ i ] = new CityList( game.playerList[ j ], i );
									game.playerList[ j ].cityList[ i ].state = binReader.ReadByte();
									game.playerList[ j ].cityList[ i ].name = binReader.ReadString();
									if ( game.playerList[ j ].cityList[ i ].state != (byte)enums.cityState.dead )
									{
										game.playerList[ j ].cityList[ i ].construction.points = binReader.ReadInt32();

										// 0862
										for ( int k = 0; k < 10; k++ )
										{
											int cType =  binReader.ReadInt32();
											byte type = binReader.ReadByte();

											if ( cType != -1 )
												switch ( cType )
												{
													case 0:
														game.playerList[ j ].cityList[ i ].construction.list[ k ] = Statistics.units[ type ];
														break;

													case Stat.Unit.constructionType:
														game.playerList[ j ].cityList[ i ].construction.list[ k ] = Statistics.units[ type ];
														break;
												
													case Stat.Building.constructionType:
														game.playerList[ j ].cityList[ i ].construction.list[ k ] = Statistics.buildings[ type ];
														break;
												
													case Stat.Wealth.constructionType:
														game.playerList[ j ].cityList[ i ].construction.list[ k ] = new Stat.Wealth();
														break;
												
											/*		case Stat.SmallWonder.constructionType:
														game.playerList[ j ].cityList[ i ].construction.list[ k ] = Statistics.smallWonders[ type ];
														break;
												
													case Stat.Wonder.constructionType:
														game.playerList[ j ].cityList[ i ].construction.list[ k ] = Statistics.wonders[ type ];
														break;*/

													default:
														game.playerList[ j ].cityList[ i ].construction.list[ k ] = new Stat.Wealth();
														break;
												}

									//		game.playerList[ j ].cityList[ i ].construction.list[ k ].ind = binReader.ReadInt32();
									//		game.playerList[ j ].cityList[ i ].construction.list[ k ].type = binReader.ReadByte();
										}

										// end 0862
										game.playerList[ j ].cityList[ i ].foodReserve = binReader.ReadInt32();
										game.playerList[ j ].cityList[ i ].laborOnField = binReader.ReadByte();
										game.playerList[ j ].cityList[ i ].originalOwner = binReader.ReadByte();
										game.playerList[ j ].cityList[ i ].population = binReader.ReadByte();
										game.playerList[ j ].cityList[ i ].X = binReader.ReadInt32();
										game.playerList[ j ].cityList[ i ].Y = binReader.ReadInt32();
										game.playerList[ j ].cityList[ i ].laborPos = new Point[ game.playerList[ j ].cityList[ i ].laborOnField ];
										for ( int k = 0; k < game.playerList[ j ].cityList[ i ].laborOnField; k++ )
										{
											game.playerList[ j ].cityList[ i ].laborPos[ k ].X = binReader.ReadInt32();
											game.playerList[ j ].cityList[ i ].laborPos[ k ].Y = binReader.ReadInt32();
										}

										game.playerList[ j ].cityList[ i ].buildingList = new bool[ Statistics.buildings.Length ];
										for ( int k = 0; k < buildingNbr; k++ )
											if ( k < game.playerList[ j ].cityList[ i ].buildingList.Length )
												game.playerList[ j ].cityList[ i ].buildingList[ k ] = binReader.ReadBoolean();
											else
												binReader.ReadBoolean();

										bool cap = binReader.ReadBoolean();

										game.playerList[ j ].cityList[ i ].isCapitale = cap;

										//0877
										game.playerList[ j ].cityList[ i ].nonLabor.list = new byte[ binReader.ReadInt32() ];
										for ( int k = 0; k < game.playerList[ j ].cityList[ i ].nonLabor.list.Length; k++ )
											game.playerList[ j ].cityList[ i ].nonLabor.list[ k ] = binReader.ReadByte();

										game.playerList[ j ].cityList[ i ].slaves.list = new byte[ binReader.ReadInt32() ];
										for ( int k = 0; k < game.playerList[ j ].cityList[ i ].slaves.list.Length; k++ )
											game.playerList[ j ].cityList[ i ].slaves.list[ k ] = binReader.ReadByte();
										//end of 0877

										game.playerList[ j ].cityList[ i ].setHasDirectAccessToRessource();
									}
								}
								#endregion

								#region memories 0840

								game.playerList[ j ].memory = new Memory( game.playerList[ j ], binReader.ReadInt32() );
								for ( int i = 0; i < game.playerList[ j ].memory.Lenght; i++ )
								{
									game.playerList[ j ].memory.list[ i ].type = binReader.ReadByte();
									game.playerList[ j ].memory.list[ i ].turn = binReader.ReadInt32();
									game.playerList[ j ].memory.list[ i ].ind = new int[ binReader.ReadInt32() ];
									for ( int k = 0; k < game.playerList[ j ].memory.list[ i ].ind.Length; k++ )
										game.playerList[ j ].memory.list[ i ].ind[ k ] = binReader.ReadInt32();
								}

								#endregion

								#region slaves 0878
								game.playerList[ j ].slaves.transferts = new playerSlavery.transfertList[ binReader.ReadInt32() ];
								for ( int i = 0; i < game.playerList[ j ].slaves.transferts.Length; i++ )
								{
									game.playerList[ j ].slaves.transferts[ i ].dest = binReader.ReadInt32();
									game.playerList[ j ].slaves.transferts[ i ].ori = binReader.ReadInt32();
									game.playerList[ j ].slaves.transferts[ i ].nbr = binReader.ReadInt32();
									game.playerList[ j ].slaves.transferts[ i ].eta = binReader.ReadInt32();
								}
								#endregion

							}
						}
						#endregion

						// temp stack 
						for ( int x = 0; x < game.width; x++ ) 
							for ( int y = 0; y < game.height; y++ ) 
								for ( int i = 1; i <= game.grid[ x, y ].stack.Length; i++ ) 
									game.grid[ x, y ].stack[ i - 1 ] = game.playerList[ tempStacks[ x ][ y ][ i - 1 ].owner ].unitList[ tempStacks[ x ][ y ][ i - 1 ].unit ]; 

						#region caseImp

						game.caseImps = new structures.caseImprovement[ binReader.ReadInt32() ];

						// correct bug pre 887
						bool[] invalidCaseImps = new bool[ game.caseImps.Length ];
						int totalInvalidCaseImps = 0;
						//

						for ( int i = 0; i < game.caseImps.Length; i++ )
						{
							game.caseImps[ i ].construction = binReader.ReadByte();
							game.caseImps[ i ].constructionPntLeft = binReader.ReadInt32();
							game.caseImps[ i ].owner = binReader.ReadByte();
							game.caseImps[ i ].pos.X = binReader.ReadInt32();
							game.caseImps[ i ].pos.Y = binReader.ReadInt32();
							game.caseImps[ i ].type = binReader.ReadByte();
							game.caseImps[ i ].units = new UnitList[ binReader.ReadInt32() ];

							for ( int j = 0; j < game.caseImps[ i ].units.Length; j++ )
							{
								// debuger
								byte p0 = binReader.ReadByte();
								int u0 = binReader.ReadInt32();

								if ( !game.playerList[ p0 ].dead )
									game.caseImps[ i ].units[ j ] = game.playerList[ p0 ].unitList[ u0 ];
								else
								{
									game.caseImps[ i ].units[ j ] = game.playerList[ 0 ].unitList[ 0 ];

									if ( !invalidCaseImps[ i ] )
									{
										invalidCaseImps[ i ] = true;
										totalInvalidCaseImps ++;
									}
								}

							//	normal, to be restored...
							//	game.caseImps[ i ].units[ j ] = game.playerList[ binReader.ReadByte() ].unitList[ binReader.ReadInt32() ];
							}
						}
						#endregion

						// suite debugger
							   if ( totalInvalidCaseImps > 0 )
							   {
									structures.caseImprovement[] ciBuffer = game.caseImps;
									game.caseImps = new structures.caseImprovement[ ciBuffer.Length - totalInvalidCaseImps ];

									for ( int i = 0, j = 0; i < ciBuffer.Length; i ++ )
										if ( !invalidCaseImps[ i ] )
										{
											game.caseImps[ j ] = ciBuffer[ i ];
											j ++;
										}
							   }

						#region label
						label.initList( binReader.ReadInt32() );
						for ( int i = 0; i < label.list.Length; i++ )
						{
							label.list[ i ].X = binReader.ReadInt32();
							label.list[ i ].Y = binReader.ReadInt32();
							label.list[ i ].text = binReader.ReadString();
						}
						#endregion

						#region tutorial 857 returned 885

						Tutorial.init( binReader.ReadBoolean() );
						if ( Tutorial.mode )
						{
							tutorialLength =  binReader.ReadInt32();

							for ( int i = 0; i < tutorialLength; i ++ )
								if ( i < Tutorial.alreadySeen.Length )
									Tutorial.alreadySeen[ i ] = binReader.ReadBoolean();
								else
									binReader.ReadBoolean();
						}

						#endregion

						#region custom nation 872
						if ( binReader.ReadBoolean() ) // game.playerList[ Form1.game.curPlayerInd ].civType == Statistics.normalCivilizationNumber )
						{
							Stat.Civilization[] buffer = Statistics.civilizations;

							Statistics.civilizations = new Stat.Civilization[ buffer.Length + 1 ];
							for ( int i = 0; i < buffer.Length; i++ )
								Statistics.civilizations[ i ] = buffer[ i ];

							Statistics.civilizations[ buffer.Length ].name = binReader.ReadString();
							Statistics.civilizations[ buffer.Length ].color = Color.FromArgb( binReader.ReadByte(), binReader.ReadByte(), binReader.ReadByte() );
							Statistics.civilizations[ buffer.Length ].description = binReader.ReadString();
							Statistics.civilizations[ buffer.Length ].cityNames = Statistics.civilizations[ binReader.ReadByte() ].cityNames;
						}
						#endregion

						/*
							bool testing = binReader.ReadBoolean();

							options.showLabels = true;
							options.showCommonSpyDialogs = true;
						*/
			
						#endregion
					}
					else if ( version == 887 )
					{
						#region case 0887

						FileHeader header = FileHeader.getFromStream( new FileHeader(), sp, version, binReader );

						if ( header.type == FileHeader.Type.playedGame )
						{
							game = new Game();
						}
						else  if ( header.type == FileHeader.Type.playedScenario )
						{
							game = new Scenario();

							((Scenario)game).name = header.name;
							((Scenario)game).description = header.description;
							((Scenario)game).goalType = header.goalType;
							((Scenario)game).goalInd = header.goalInd;
						}

					/*	byte gameType = binReader.ReadByte();
						if ( gameType == 1 )
						{
							game = new Scenario();
							((Scenario)game).name = binReader.ReadString();
							((Scenario)game).description = binReader.ReadString();
							((Scenario)game).goalType = (Scenario.GoalType)binReader.ReadByte();
						}
						else
						{
							game = new Game();
							binReader.ReadString();
							binReader.ReadString();
						}*/

					//	FileHeader.loadMap( null, binReader );

						#region options
						Form1.options.frontierType = (Options.FrontierTypes)binReader.ReadByte();
						Form1.options.miniMapType = (Options.MiniMapTypes)binReader.ReadByte();
						Form1.options.hideUndiscovered = binReader.ReadBoolean();
						Form1.options.showGrid = binReader.ReadBoolean();
						Form1.options.showOnScreenDPad = binReader.ReadBoolean();
						Form1.options.showBatteryStatus = binReader.ReadBoolean();
						Form1.options.showLabels = binReader.ReadBoolean();
						Form1.options.showCommonSpyDialogs = binReader.ReadBoolean();
						Form1.options.autosave = binReader.ReadBoolean(); 
						#endregion

						Form1.sliHor = binReader.ReadInt32();
						Form1.sliVer = binReader.ReadInt32();

						loadCore( game, binReader );
	
						#endregion
					}
					else
					{
						wC.show = false;

						MessageBox.Show( 
							String.Format( language.getAString( language.order.errorUnrecongnisedSaveVersion ), (double)version / 1000 ), 
							language.getAString( language.order.errorTitle ) 
							);
						
						return null;
					}

					if ( System.IO.Path.GetFileName( System.IO.Path.GetDirectoryName( sp ) ) != "auto" )
						game.savePath = sp; 
					else
						game.savePath = "";

					roads.setAll( game ); // display

					for ( int p = 0; p < game.playerList.Length; p ++ )
						if ( !game.playerList[ p ].dead )
						{
							// for pre 0877
							for ( int c = 1; c <= game.playerList[ p ].cityNumber; c++ )
								if ( !game.playerList[ p ].cityList[ c ].dead )
								{
									if ( game.playerList[ p ].cityList[ c ].population - game.playerList[ p ].cityList[ c ].laborOnField > 0 )
										game.playerList[ p ].cityList[ c ].nonLabor.add( game.playerList[ p ].cityList[ c ].population - game.playerList[ p ].cityList[ c ].laborOnField );
									else if ( game.playerList[ p ].cityList[ c ].population - game.playerList[ p ].cityList[ c ].laborOnField < 0 )
									{
										int i = 0;
									}
								}
							// end of pre 0877

							for ( int u = 1; u <= game.playerList[ p ].unitNumber; u++ )
								if ( game.playerList[ p ].unitList[ u ].state == (byte)Form1.unitState.turnCompleted )
								{
									if ( game.playerList[ p ].unitList[ u ].X == -1 )
										game.playerList[ p ].unitList[ u ].state = (byte)Form1.unitState.inTransport;
									else
										game.playerList[ p ].unitList[ u ].state = (byte)Form1.unitState.idle;
								}
						}

				
					for ( int p = 0; p < game.playerList.Length; p++ )
						if ( !game.playerList[ p ].dead )
							game.playerList[ p ].setResourcesAccess();

					game.plans.init();

					game.frontier.setFrontiers(); 

					game.radius.setIsNextToWater();
					game.rvtbc = new Rvtbc( game ); //.init(); 
					game.rvtbc.doit();
			
					if ( game.wonderList == null ) // pre 887
					{
						game.wonderList = new WonderList( Statistics.wonders.Length );
						game.wonderList.initialize();

						foreach ( PlayerList player in game.playerList )
							if ( player.smallWonderList == null ) // pre 887
							{
								player.smallWonderList = new WonderList( Statistics.smallWonders.Length );
								player.smallWonderList.initialize();
							}
					}

					/////// temp
					foreach ( PlayerList p in game.playerList )
						if ( !p.dead )
							for ( int u = 1; u <= p.unitNumber; u ++ )
								if ( 
									p.unitList[ u ].state == (byte)Form1.unitState.waitingForBoat && 
									p.unitList[ u ].X == 0 && 
									p.unitList[ u ].Y == 0 
									)
									p.unitList[ u ].state = (byte)Form1.unitState.dead;

					/*					
										for ( int x = 0; x < game.width; x++ )
											for ( int y = 0; y < game.height; y++ )
												if ( game.grid[ x, y ].militaryImprovement == (byte)enums.militaryImprovement.airport ) 
													game.grid[ x, y ].militaryImprovement = 0;
					*/

					/*
										Form1.selected.state = 0;
										Form1.selected.unit = 0;
										Form1.pictureBox3.Visible = false;
										Form1.pictureBox4.Visible = false;

										Form1.drawMiniMap(); 
										Form1.pictureBox1.Enabled = true; 
										Form1.pictureBox1.Visible = true; 
										Form1.menuItem18.Enabled = true; 

										//   platformSpec.keys.Set( this );//keyIn = new keyInPut(); 
										// timer1.Enabled = true;
										unitOrder.setOrder( Form1.game.curPlayerInd );
			
										Form1.oldSliVer = -5; 

										if ( !Form1.showNextUnitNow( 0, 0 ) ) 
											Form1.DrawMap(); 

										Form1.guiEnabled = true; 
										wC.show = false; 
					*/
			//	}

				success = true;
			}
			catch ( System.IO.FileNotFoundException )
			{
				string pr = System.IO.Path.GetDirectoryName( sp ); 
				string txt; 

				if ( pr == @"\SD Card" || pr == @"\SD Card\My Documents" ) 
					txt = " Check the SD card..."; 
				else if ( pr == @"\CF Card" || pr == @"\CF Card\My Documents" ) 
					txt = " Check the CF card..."; 
				else 
					txt = ""; 

				MessageBox.Show( "File not found." + txt + ", Sorry", "Error" ); 

				success = false;
			}
			catch ( System.Exception e )
			{
				MessageBox.Show( "Error loading from file, sorry.", e.ToString() ); 

				success = false;
			}
			finally
			{
				if ( file != null )
					file.Close(); 

				if ( binReader != null )
					binReader.Close(); 
			}

			if ( success )
				return game;
			else
				return null;
		}
Пример #2
0
		public bool saveAsScenario( string name, string description, string path, Scenario.GoalType goal, int goalInd )
		{
			bool success;
			BinaryWriter writer = null;
			FileStream file = null;

			try
			{
				file = new FileStream( path, FileMode.Create, FileAccess.Write );
				writer = new BinaryWriter( file );

				writer.Write( (int)887 ); 
				writer.Write( (byte)FileHeader.Type.scenario ); 
				writer.Write( name ); 
				writer.Write( description ); 
				writer.Write( curTurn ); 

				saveImage( writer );

				writer.Write( (byte)goal ); 
				writer.Write( goalInd ); 

				saveCore( writer );
				success = true;
			}
			catch ( Exception /*e*/ )
			{
				success = false;
			}
			finally
			{
				writer.Flush();
				writer.Close();
			}

			return success;
		}