public static Structure Build (ROM program)
	{
		int length = 0;
		int width;
		int height;
		int span;
		int index = 0;
		//int signs = 0;
		Schematic.Structure file = new Schematic.Structure ();
		
		ErrorLog.debug("Building schematic structure.");
		
		height = program.block.length;
		if (height != 0)
		{
			width = program.block[0].length;
			if (width != 0)
				length = program.block[0][0].length;  //Indexed YZX.
			else
				length = 0;  //Cannot be measured.  Also irrelevant as there's 0 volume.
		}
		else
			width = 0;  //Cannot be measured.  Also irrelevant as there's 0 volume.
		
		ErrorLog.debug("The schematic represents a field "+height+":"+width+":"+length);
		
		span = length * width * height;  //Total number of blocks involved.
		//Assign assorted file data:
		file.ID = new byte [span]; //ID array fits IDs of all blocks.
		file.block_data = new byte [span];  //One ID and one block data for each block.
		file.length = (short)length;
		file.width = (short) width;
		file.height = (short) height;
		file.materials = "Alpha";  //All schematics post-classic use "Alpha" materials.
		
		ErrorLog.debug("Contains " + span + " blocks.");
		
		//Assigning ID and block data.
		for (int Y = 0; Y < height; Y++)
		{
			for (int Z = 0; Z < width; Z++)
			{
				for (int X = 0; X < length; X++)
				{
					try
					{
						if (program.block[Y][Z][X] != null)
						{
							file.ID[index] = program.block[Y][Z][X].getID();  //Assign block ID to ID array.
							file.block_data [index] = program.block[Y][Z][X].getData();//Assign block data to data array.
							
							ErrorLog.debug("Block " + Y+" "+Z+" "+X+" is "+program.block[Y][Z][X].getID());
						}
						else  //No block present.
						{
							file.ID[index] = 0;
							file.block_data[index] = 0;
							
							ErrorLog.debug("Block unitialized at " +Y+":"+Z+":"+X);
						}
					}
					catch (NoSuchMethodError e)  //Block was not assigned.
					{
						file.ID[index] = 0;  //Default Air;  Air has value 0;
						file.block_data[index] = 0;  //These assignments are unnecessary...
						//But compared to the speed penalty of catching an error it should be inconsequential.
						ErrorLog.debug("Block " +Y+":"+Z+":"+X+ " defaulted to air.");
					}
					
					index++;  //Increment off index after index has been assigned.
				}
			}
		}
		
		file.text = new Sign[0];  //Signs are currently ignored.
		
		return file;
	}