[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

斜面へ植林


森林を斜面にも設置できるようにしました。
方向性が間違っていないと判断されましたらCVSへのコミット許可をお願いします。


cvs diff AssemblyInfo.cs ForestBuilder.cs ForestVoxel.cs (ディレクトリ C:\Project\FreeTrain\FreeTrain\plugins\org.kohsuke.freetrain.land.forest\src 内)
Index: ForestBuilder.cs
===================================================================
RCS file: /cvsroot/freetrain/FreeTrain/plugins/org.kohsuke.freetrain.land.forest/src/ForestBuilder.cs,v
retrieving revision 1.5
diff -u -r1.5 ForestBuilder.cs
--- ForestBuilder.cs	26 Jun 2003 15:02:34 -0000	1.5
+++ ForestBuilder.cs	29 Jun 2003 05:53:20 -0000
@@ -9,6 +9,7 @@
 using freetrain.controllers;
 using freetrain.framework.graphics;
 using freetrain.framework.plugin;
+using freetrain.world.terrain;
 using freetrain.views;
 
 namespace freetrain.world.land.forest
@@ -75,11 +76,21 @@
 				for( int y=y1; y<=y2; y++ ) {
 					Location loc = new Location(x,y,z);
 
-					if( ForestVoxel.canBeBuilt(loc) ) {
+					if( ForestVoxel.canBeBuilt(loc) ) 
+					{
 						byte[] patterns = createRandomTrees();
-						if( patterns.Length!=0 )
-							new ForestVoxel( loc, this, patterns );
-					}
+						if( patterns.Length!=0 ) 
+						{
+							if( World.world[loc] is MountainVoxel ) 
+							{
+								MountainVoxel v = (MountainVoxel)World.world[loc];
+								World.world.remove(v);
+								new PlantedMtVoxel( this, patterns, loc, v );
+							}
+							else
+								new ForestVoxel( loc, this, patterns );
+						}
+					} 
 				}
 			}
 		}
Index: ForestVoxel.cs
===================================================================
RCS file: /cvsroot/freetrain/FreeTrain/plugins/org.kohsuke.freetrain.land.forest/src/ForestVoxel.cs,v
retrieving revision 1.3
diff -u -r1.3 ForestVoxel.cs
--- ForestVoxel.cs	26 Jun 2003 15:02:34 -0000	1.3
+++ ForestVoxel.cs	29 Jun 2003 05:53:20 -0000
@@ -4,6 +4,7 @@
 using freetrain.world.land;
 using freetrain.world.rail;
 using freetrain.world.structs;
+using freetrain.world.terrain;
 
 namespace freetrain.world.land.forest
 {
@@ -38,6 +39,19 @@
 			for( int i=0; i<patterns.Length; i+=3 )
 				contrib.sprites[ patterns[i+2] ].draw( surface.surface,
 					new Point( pt.X+patterns[i+0], pt.Y+patterns[i+1] ) );
+		}
+
+		public static new bool canBeBuilt(Location loc) 
+		{
+			if( World.world.getGroundLevel(loc) != loc.z ) 
+			{
+				return false;
+			}
+			else if(!World.world.isReusable(loc))
+			{
+				return (World.world[loc] is MountainVoxel );
+			}
+			else return true;
 		}
 	}
 }

---------------PlantedMtVoxel.cs---------------
namespace freetrain.world.land.forest
{
	/// <summary>
	/// PlantedMtVoxcel の概要の説明です。
	/// </summary>
	[Serializable]
	public class PlantedMtVoxel : MountainVoxel
	{
		private readonly ForestBuilder contrib;
		private readonly byte[] patterns;

		public PlantedMtVoxel( ForestBuilder contrib, byte[] patterns, Location loc, MountainVoxel mountain ) : 
			base (	loc, 
					(byte)mountain.getHeight(Direction.NORTHEAST),
					(byte)mountain.getHeight(Direction.SOUTHEAST),
					(byte)mountain.getHeight(Direction.SOUTHWEST),
					(byte)mountain.getHeight(Direction.NORTHWEST) )
		{
			this.contrib = contrib;
			this.patterns = patterns;
		}

		public override void draw( DrawContext display, Point pt, int heightCutDiff ) 
		{
			base.draw( display, pt, heightCutDiff );
			int h = getHeight(Direction.NORTHEAST)-getHeight(Direction.SOUTHWEST);
			//int w = getHeight(Direction.NORTHWEST)-getHeight(Direction.SOUTHEAST);
			if( h > 0)
			{
				for( int i=0; i<patterns.Length; i+=3 )
					contrib.sprites[ patterns[i+2] ].draw( display.surface,
						new Point( pt.X+patterns[i+0], pt.Y+patterns[i+1]*(h+4)/4-8 ) );
			}
			else
			{
				for( int i=0; i<patterns.Length; i+=3 )
					contrib.sprites[ patterns[i+2] ].draw( display.surface,
						new Point( pt.X+patterns[i+0], pt.Y+patterns[i+1]*(h+4)/4+2 ) );
			}
		}
	}
}

---------------BulldozerEx.cs---------------
namespace freetrain.world.land.forest
{
	/// <summary>
	/// Removes any land voxel in the region.
	/// </summary>
	public class BulldozerEx : Bulldozer
	{
		public BulldozerEx( XmlElement e ) : base(e) {
		}

		/// <summary>
		/// Gets the land that should be used to fill (x,y) within [x1,y1]-[x2,y2] (inclusive).
		/// </summary>
		public override void create( int x1, int y1, int x2, int y2, int z ) {
			bulldozeEx(new Location(x1,y1,z),new Location(x2,y2,z));
		}

		public static void bulldozeEx( Location loc1, Location loc2 ) {
			int z = loc1.z;
			for( int x=loc1.x; x<=loc2.x; x++ ) {
				for( int y=loc1.y; y<=loc2.y; y++ ) {
					if( World.world.isReusable(x,y,z) && World.world[x,y,z]!=null )
						World.world.remove(x,y,z);
					else if(World.world[x,y,z] is PlantedMtVoxel)
					{
						PlantedMtVoxel v = (PlantedMtVoxel)World.world[x,y,z];
						World.world.remove(v);
						new MountainVoxel(new Location(x,y,z),
							(byte)v.getHeight(Direction.NORTHEAST),
							(byte)v.getHeight(Direction.SOUTHEAST),
							(byte)v.getHeight(Direction.SOUTHWEST),
							(byte)v.getHeight(Direction.NORTHWEST));
					}
				}
			}
		}

	}
}

_______________________________________________
FreeTrain-general mailing list
FreeTrain-general@lists.sourceforge.jp
http://lists.sourceforge.jp/mailman/listinfo/freetrain-general

題名

名前

メッセージ