private EquipmentUseResult PerformScannerUsage(ScannerEquipmentItem equipTemplate, ActiveEquipment activeEquipmentInstance, MappedBot owningBot) { ScanEquipmentUseResult result = new ScanEquipmentUseResult(); if (!owningBot.ConsumeCharge(equipTemplate.ChargeConsumed)) { result.State = UsageEndState.Fail_NoCharge; return(result); } Point mapOffset = owningBot.Position; foreach (var vSrc in equipTemplate.GetAllScanPoints()) { Point v = new Point(vSrc.X + mapOffset.X, vSrc.Y + mapOffset.Y); ScanTileResult str = ScanTileResult.Unscanned; MapTile mt = MapTile.DefaultGround; if (activeWorld.IsValidSpace(v)) { var tileOccupant = GetTileOccupantByLocation(v); if (tileOccupant != null) { if (tileOccupant.EngineId == owningBot.EngineId) { str = ScanTileResult.You; } else { int ctk = CreateTemporaryScanKey(owningBot.EngineId, tileOccupant.EngineId); result.AddPointOfInterest(v, ctk); str = tileOccupant.IsAlive() ? ScanTileResult.Bot : ScanTileResult.Wreckage; } } else { mt = activeWorld.Map.GetTileAtPosition(v); } } else { mt = MapTile.BoundaryWall1; } if (str == ScanTileResult.Unscanned) { // If there was not an active occupant, then look to the map. switch (mt) { case MapTile.BoundaryWall1: str = ScanTileResult.SolidWall; break; case MapTile.DefaultGround: str = ScanTileResult.Unoccupied; break; default: throw new BdBaseException("DEFAULT - invalid tile mapping - " + mt.ToString()); } } result.SetDimensions(equipTemplate.MinimumXScanned, equipTemplate.MinimumYScanned, equipTemplate.TotalWidthScanned, equipTemplate.TotalHeightScanned); result.SetScanResultAtPosition(vSrc, str); } return(result); }
private EquipmentUseResult PerformFireWeapon(OffensiveWeaponEquipmentItem owi, ActiveEquipment activeEquipmentInstance, MappedBot attacker, EquipmentUseRequestContext ctxt) { EquipmentUseResult result = new EquipmentUseResult(); if (activeEquipmentInstance.CooldownTicksRemaining > 0) { result.State = UsageEndState.Fail_CooldownActive; return(result); } MappedBot victim = ConvertTemporaryScanKeyToBot(attacker.EngineId, ctxt.IParam); if (victim == null) { result.State = UsageEndState.Fail_InvalidTarget; b.Warning.Log("The bot tried to target an invalid key. This shouldnt happen"); return(result); } b.Assert.True(attacker.EngineId != victim.EngineId, "You cant shoot at yourself."); activeEquipmentInstance.RoundsRemaining -= 1; if (activeEquipmentInstance.RoundsRemaining <= 0) { result.State = UsageEndState.Fail_NoAmmo; return(result); } if (!attacker.ConsumeCharge(owi.BaseChargeCost)) { result.State = UsageEndState.Fail_NoCharge; return(result); } CombatAttack ca = new CombatAttack(); ca.Attacker = attacker; ca.Victim = victim; ca.Weapon = owi; ca.WeaponInstance = activeEquipmentInstance; CombatResult cr = combatCore.ResolveAttack(ca); UICombatContext context = new UICombatContext(); context.AggressorId = attacker.EngineId; context.VictimId = victim.EngineId; context.WeaponTypeId = owi.UniqueId; context.DidHit = cr.DidHit; context.Damage = cr.TotalDamage; hub.Launch <Message_Ui>(new Message_Ui(MainMessageKind.UIMessage, KnownSubkinds.WeaponFire) { RequestContext = context }); if (cr.DidHit) { ApplyWeaponfireHit(victim, cr); } result.State = UsageEndState.Success; return(result); }