void HandleReport(MineActionReport report) { var living = m_world.FindObject <LivingObject>(report.LivingObjectID); if (report.Success) { switch (report.MineActionType) { case MineActionType.Mine: Events.AddGameEvent(living, "{0} mines {1} ({2})", living, report.Location, report.Direction); break; case MineActionType.Stairs: Events.AddGameEvent(living, "{0} creates stairs {1} ({2})", living, report.Location, report.Direction); break; } } else { Events.AddGameEvent(living, "{0} fails to mine {1} ({2}): {3}", living, report.Location, report.Direction, report.FailReason); } }
ActionState ProcessAction(MineAction action) { if (this.ActionTicksUsed == 1) { this.ActionTotalTicks = GetTicks(SkillID.Mining); } if (this.ActionTicksUsed < this.ActionTotalTicks) { return(ActionState.Ok); } var env = this.Environment; var p = this.Location + action.Direction; var report = new MineActionReport(this, p, action.Direction, action.MineActionType); var td = env.GetTileData(p); switch (action.MineActionType) { case MineActionType.Mine: { if (!td.IsMinable) { SendFailReport(report, "not mineable"); return(ActionState.Fail); } var ds = env.GetPossibleMiningPositioning(p, MineActionType.Mine); if (ds.Contains(action.Direction) == false) { SendFailReport(report, "cannot mine to that direction"); return(ActionState.Fail); } env.SetTileData(p, TileData.EmptyTileData); if (td.ID == TileID.NaturalWall) { MaterialInfo material = Materials.GetMaterial(td.MaterialID); ItemID itemID = ItemID.Undefined; switch (material.Category) { case MaterialCategory.Rock: itemID = ItemID.Rock; break; case MaterialCategory.Mineral: itemID = ItemID.Ore; break; case MaterialCategory.Gem: itemID = ItemID.UncutGem; break; case MaterialCategory.Soil: break; default: throw new Exception(); } if (itemID != ItemID.Undefined) { if (this.World.Random.Next(21) >= GetSkillLevel(SkillID.Mining) / 25 + 10) { var builder = new ItemObjectBuilder(itemID, material.ID); var item = builder.Create(this.World); item.MoveToMustSucceed(this.Environment, p); } } } } break; case MineActionType.Stairs: { if (!td.IsMinable) { SendFailReport(report, "not mineable"); return(ActionState.Fail); } if (!action.Direction.IsPlanarUpDown()) { SendFailReport(report, "not PlanarUpDown direction"); return(ActionState.Fail); } if (td.ID != TileID.NaturalWall) { SendFailReport(report, "not natural wall"); return(ActionState.Fail); } // We can always create stairs down, but for other dirs we need access there // XXX ??? When we cannot move in planar dirs? if (action.Direction != Direction.Down && !env.CanMoveFrom(this.Location, action.Direction)) { SendFailReport(report, "cannot reach"); return(ActionState.Fail); } td.ID = TileID.Stairs; env.SetTileData(p, td); } break; default: throw new Exception(); } SendReport(report); return(ActionState.Done); }
void HandleReport(MineActionReport report) { var living = m_world.FindObject<LivingObject>(report.LivingObjectID); if (report.Success) { switch (report.MineActionType) { case MineActionType.Mine: Events.AddGameEvent(living, "{0} mines {1} ({2})", living, report.Location, report.Direction); break; case MineActionType.Stairs: Events.AddGameEvent(living, "{0} creates stairs {1} ({2})", living, report.Location, report.Direction); break; case MineActionType.Channel: Events.AddGameEvent(living, "{0} channels {1} ({2})", living, report.Location, report.Direction); break; } } else { Events.AddGameEvent(living, "{0} fails to mine {1} ({2}): {3}", living, report.Location, report.Direction, report.FailReason); } }
ActionState ProcessAction(MineAction action) { if (this.ActionTicksUsed == 1) this.ActionTotalTicks = GetTicks(SkillID.Mining); if (this.ActionTicksUsed < this.ActionTotalTicks) return ActionState.Ok; var env = this.Environment; var p = this.Location + action.Direction; var report = new MineActionReport(this, p, action.Direction, action.MineActionType); var td = env.GetTileData(p); switch (action.MineActionType) { case MineActionType.Mine: { if (!td.IsMinable) { SendFailReport(report, "not mineable"); return ActionState.Fail; } var ds = env.GetPossibleMiningPositioning(p, MineActionType.Mine); if (ds.Contains(action.Direction) == false) { SendFailReport(report, "cannot mine to that direction"); return ActionState.Fail; } env.SetTileData(p, TileData.EmptyTileData); if (td.ID == TileID.NaturalWall) { MaterialInfo material = Materials.GetMaterial(td.MaterialID); ItemID itemID = ItemID.Undefined; switch (material.Category) { case MaterialCategory.Rock: itemID = ItemID.Rock; break; case MaterialCategory.Mineral: itemID = ItemID.Ore; break; case MaterialCategory.Gem: itemID = ItemID.UncutGem; break; case MaterialCategory.Soil: break; default: throw new Exception(); } if (itemID != ItemID.Undefined) { if (this.World.Random.Next(21) >= GetSkillLevel(SkillID.Mining) / 25 + 10) { var builder = new ItemObjectBuilder(itemID, material.ID); var item = builder.Create(this.World); item.MoveToMustSucceed(this.Environment, p); } } } } break; case MineActionType.Stairs: { if (!td.IsMinable) { SendFailReport(report, "not mineable"); return ActionState.Fail; } if (!action.Direction.IsPlanarUpDown()) { SendFailReport(report, "not PlanarUpDown direction"); return ActionState.Fail; } if (td.ID != TileID.NaturalWall) { SendFailReport(report, "not natural wall"); return ActionState.Fail; } // We can always create stairs down, but for other dirs we need access there // XXX ??? When we cannot move in planar dirs? if (action.Direction != Direction.Down && !env.CanMoveFrom(this.Location, action.Direction)) { SendFailReport(report, "cannot reach"); return ActionState.Fail; } td.ID = TileID.Stairs; env.SetTileData(p, td); } break; default: throw new Exception(); } SendReport(report); return ActionState.Done; }
ActionState ProcessAction(MineAction action) { if (this.ActionTicksUsed == 1) this.ActionTotalTicks = GetTicks(SkillID.Mining); if (this.ActionTicksUsed < this.ActionTotalTicks) return ActionState.Ok; var env = this.Environment; var p = this.Location + action.Direction; var report = new MineActionReport(this, p, action.Direction, action.MineActionType); switch (action.MineActionType) { case MineActionType.Mine: { var terrain = env.GetTerrain(p); var id = terrain.ID; if (!terrain.IsMinable) { SendFailReport(report, "not mineable"); return ActionState.Fail; } if (!action.Direction.IsPlanar() && action.Direction != Direction.Up) { SendFailReport(report, "not planar or up direction"); return ActionState.Fail; } // XXX is this necessary for planar dirs? we can always move in those dirs if (!EnvironmentHelpers.CanMoveFrom(env, this.Location, action.Direction)) { SendFailReport(report, "cannot reach"); return ActionState.Fail; } ItemObject item = null; if (id == TerrainID.NaturalWall && this.World.Random.Next(21) >= GetSkillLevel(SkillID.Mining) / 25 + 10) { ItemID itemID; MaterialInfo material; if (env.GetInteriorID(p) == InteriorID.Ore) { material = env.GetInteriorMaterial(p); } else { material = env.GetTerrainMaterial(p); } switch (material.Category) { case MaterialCategory.Rock: itemID = ItemID.Rock; break; case MaterialCategory.Mineral: itemID = ItemID.Ore; break; case MaterialCategory.Gem: itemID = ItemID.UncutGem; break; default: throw new Exception(); } var builder = new ItemObjectBuilder(itemID, material.ID); item = builder.Create(this.World); } var td = new TileData() { TerrainID = TerrainID.NaturalFloor, TerrainMaterialID = env.GetTerrainMaterialID(p), InteriorID = InteriorID.Empty, InteriorMaterialID = Dwarrowdelf.MaterialID.Undefined, Flags = TileFlags.None, WaterLevel = 0, }; env.SetTileData(p, td); if (item != null) { var ok = item.MoveTo(this.Environment, p); if (!ok) throw new Exception(); } } break; case MineActionType.Stairs: { var terrain = env.GetTerrain(p); var id = terrain.ID; if (!terrain.IsMinable) { SendFailReport(report, "not mineable"); return ActionState.Fail; } if (!action.Direction.IsPlanarUpDown()) { SendFailReport(report, "not PlanarUpDown direction"); return ActionState.Fail; } if (id != TerrainID.NaturalWall) { SendFailReport(report, "not natural wall"); return ActionState.Fail; } // We can always create stairs down, but for other dirs we need access there // XXX ??? When we cannot move in planar dirs? if (action.Direction != Direction.Down && !EnvironmentHelpers.CanMoveFrom(env, this.Location, action.Direction)) { SendFailReport(report, "cannot reach"); return ActionState.Fail; } var td2 = env.GetTileData(p + Direction.Up); if (td2.TerrainID == TerrainID.NaturalFloor) { td2.TerrainID = TerrainID.StairsDown; if (td2.InteriorID == InteriorID.Grass) { td2.InteriorID = InteriorID.Empty; td2.InteriorMaterialID = Dwarrowdelf.MaterialID.Undefined; } env.SetTileData(p + Direction.Up, td2); } var td = new TileData() { TerrainID = TerrainID.NaturalFloor, TerrainMaterialID = env.GetTerrainMaterialID(p), InteriorID = InteriorID.Stairs, InteriorMaterialID = env.GetTerrainMaterialID(p), Flags = TileFlags.None, WaterLevel = 0, }; env.SetTileData(p, td); } break; case MineActionType.Channel: { if (!action.Direction.IsPlanar()) { SendFailReport(report, "not planar direction"); return ActionState.Fail; } // XXX is this necessary for planar dirs? we can always move in those dirs if (!EnvironmentHelpers.CanMoveFrom(env, this.Location, action.Direction)) { SendFailReport(report, "cannot reach"); return ActionState.Fail; } var td = env.GetTileData(p); if (td.IsClear == false) { SendFailReport(report, "wrong type of tile"); return ActionState.Fail; } if (!env.Contains(p + Direction.Down)) { SendFailReport(report, "tile not inside map"); return ActionState.Fail; } var tdd = env.GetTileData(p + Direction.Down); bool clearDown; if (tdd.TerrainID == TerrainID.NaturalWall) { clearDown = true; } else if (tdd.InteriorID == InteriorID.Empty) { clearDown = false; } else { SendFailReport(report, "tile down not empty"); return ActionState.Fail; } td.TerrainID = TerrainID.Empty; td.TerrainMaterialID = Dwarrowdelf.MaterialID.Undefined; td.InteriorID = InteriorID.Empty; td.InteriorMaterialID = Dwarrowdelf.MaterialID.Undefined; env.SetTileData(p, td); if (clearDown) { tdd.TerrainID = TerrainID.NaturalFloor; tdd.InteriorID = InteriorID.Empty; tdd.InteriorMaterialID = Dwarrowdelf.MaterialID.Undefined; env.SetTileData(p + Direction.Down, tdd); } } break; default: throw new Exception(); } SendReport(report); return ActionState.Done; }