public Hero(int id, double x, double y, CodeStorage codeInventory, EquipmentStorage equipmentInventory) : base(x: x, y: y) { HasCodeChanged = false; HasGearChanged = false; Algorithm = new BehaviourAlgorithm(this); Id = id; CodeInventory = codeInventory; EquipmentInventory = equipmentInventory; Points = 0; baseSpeed = Design.HeroSpeed; baseDamage = Damage; baseHp = Hp; ShootRateLimiter = new RateLimiter(Design.FireCooldown); controls = new Controls(ConsoleKey.Spacebar, ConsoleKey.W, ConsoleKey.S, ConsoleKey.A, ConsoleKey.D); syntheticControls = new Controls(ConsoleKey.Spacebar, ConsoleKey.W, ConsoleKey.S, ConsoleKey.A, ConsoleKey.D); CalculateStatsFromGear(); // Configure a Timer for use heartbeatTimer = new Timer { Interval = 2000 }; heartbeatTimer.Elapsed += new ElapsedEventHandler(CheckAliveness); heartbeatTimer.Enabled = true; IsAlive = true; TimeOfLastHeartbeat = DateTime.Now; }
public async Task InsertRaceConditionTestAsync() { var h = new Hero(0, 0, 0, null, null); var algorithm = new BehaviourAlgorithm(h); const int count = 100; var tasks = new Task[count]; for (var i = 0; i < tasks.Length; i++) { tasks[i] = Task.Run(() => algorithm.Insert(new ShootElement())); } await Task.WhenAll(tasks); Assert.AreEqual(count, algorithm.CodeElements.Count); }
public async Task RemoveRaceConditionTestAsync() { var h = new Hero(0, 0, 0, null, null); const int count = 100; var algorithm = new BehaviourAlgorithm(h); for (var i = 0; i < count; i++) { algorithm.Insert(new ShootElement()); } var tasks = new Task[count]; for (var i = 0; i < tasks.Length; i++) { var element = new ShootElement(); tasks[i] = Task.Run(() => algorithm.RemoveAt(0)); } await Task.WhenAll(tasks); CollectionAssert.IsEmpty(algorithm.CodeElements); }
/// <summary> /// TODO this should be changed when multiplayer happens, because each hero /// will have a different algorithm. Only send to one Id (client) /// </summary> /// <param name="hub"></param> /// <param name="alg"></param> /// <returns></returns> public static async Task SendCodeUpdate(this IHubContext <GameHub> hub, BehaviourAlgorithm alg, int id) => await hub.Clients.All.SendAsync("UpdateCodeBlocks", alg, id);
/// <summary> /// Deserializes JSON string to BehaviourAlgorithm. /// </summary> /// <param name="json"></param> /// <returns>Deserialized BehaviourAlgorithm object.</returns> public static BehaviourAlgorithm ToBehaviourAlgorithm(string json, Hero hero) { var jsonVal = JArray.Parse(json) as JArray; dynamic elements = jsonVal; var algorithm = new BehaviourAlgorithm(hero); foreach (var element in elements) { algorithm.Insert(DeserializeCodeElementInternal(element)); } return(algorithm); BaseCodeElement DeserializeCodeElementInternal(dynamic element) { BaseCodeElement ret; switch ((string)element["type"]) { case "ShootElement": ret = new ShootElement(new RateLimiter(Design.ShootElementCooldown)); break; case "IdleElement": ret = new IdleElement(); break; case "CodeBlockElement": var children = new List <BaseCodeElement>(); foreach (var child in element.elements) { children.Add(DeserializeCodeElementInternal(child)); } ret = new CodeBlockElement(children); break; case "BranchingElement": var thenBlock = new List <BaseCodeElement>(); var elseBlock = new List <BaseCodeElement>(); try { foreach (var child in [email protected]) { thenBlock.Add(DeserializeCodeElementInternal(child)); } } catch (RuntimeBinderException) { } try { foreach (var child in [email protected]) { elseBlock.Add(DeserializeCodeElementInternal(child)); } } catch (RuntimeBinderException) { } ret = new BranchingElement( DeserializeConditionElementInternal(element["cond"]), new CodeBlockElement(thenBlock), new CodeBlockElement(elseBlock) ); break; case "TargetElement": ret = new TargetElement(); break; case "MoveAwayFromElement": ret = new MoveAwayFromElement(); break; default: ret = null; break; } if (element["isActive"] is JValue jv) { bool.TryParse(jv.Value.ToString(), out bool b); ret.IsActive = b; } return(ret); } BaseConditionElement DeserializeConditionElementInternal(dynamic element) { if (element is null) { return(null); } switch ((string)element["type"]) { case "IsEnemyNearCondition": return(new IsEnemyNearCondition()); default: return(null); } } }