protected override void OnNextMove() { base.OnNextMove(); Vector2 dir = CurrentDirection; if (dir.Length() < 0.1f) { dir = Vector2.Zero; } else { // choose one direction randomly, if diagonals would be required if (dir.X != 0f && dir.Y != 0f) { float r = RandomMath.RandomUnit(); if (r > 0.5f) { dir.X = 0f; } else { dir.Y = 0f; } } dir.Normalize(); } TargetMove = dir; }
public void LeadAttack() { if (SimTime < 280 && SimTime > 21.6) { ShowAttackDirectionString(); } if (SimTime > 45 && RandomMath.RandomUnit() < 0.4) { Level.Current.Sound.PlayAttackSignal(); } foreach (Knight c in Knights) { c.Attacking.TriggerAttack(); } }
protected override void OnNextMove() { base.OnNextMove(); // compute direction towards chase-target Vector2 dif = ChaseTarget.Position - ParentThing.Target; // choose one direction randomly, if diagonals would be required if (dif.X != 0f && dif.Y != 0f) { float r = RandomMath.RandomUnit(); if (r > 0.5f) { dif.X = 0f; } else { dif.Y = 0f; } } dif.Normalize(); TargetMove = dif; }
protected override void OnNextMove() { base.OnNextMove(); Vector2 dir = CurrentDirection; if (dir.Length() < 0.1f) { dir = Vector2.Zero; } else { // choose one direction randomly, if diagonals would be required if (dir.X != 0f && dir.Y != 0f) { float r = RandomMath.RandomUnit(); if (r > 0.5f) { dir.X = 0f; } else { dir.Y = 0f; } } dir.Normalize(); } TargetMove = dir; // direction changing if (timeSinceLastChange >= dirChangeTime) { timeSinceLastChange = 0f; dirChangeTime = RandomMath.RandomBetween(MinDirectionChangeTime, MaxDirectionChangeTime); CurrentDirection = RandomMath.RandomDirection(); } }
protected override void OnNextMove() { base.OnNextMove(); // check for enemy facing List <Thing> facing = ParentThing.DetectCollisions(ParentThing.FacingDirection); WasCombat = IsCombat; IsCombat = false; float randomVal = RandomMath.RandomUnit(); foreach (Thing t in facing) { if (t.GetType() == EnemyType && t.Health > 0 && !t.IsStealthy) { IsCombat = true; IsTargetMoveDefined = true; TargetMove = Vector2.Zero; if (!WasCombat || randomVal < 0.08f) { var damage = RandomMath.RandomBetween(MinDamage, MaxDamage); HurtBehavior.Apply(t, damage, MaxDamage); t.Health -= damage; } break; // only attack one thing at a time } } if (IsCombat) { if (!WasCombat || randomVal < 0.08f) { var dist = (ParentThing.Position - Level.Current.hero.Position).Length(); Level.Current.Sound.PlayRandomCombatSound(0.2f, 0.3f, dist); } } }
protected override void OnUpdate(ref TTengine.Core.UpdateParams p) { base.OnUpdate(ref p); // check for trigger key to see whether still used if (!IsTriggered) { StopUsing(); } // if used, spray pixel paint if (IsUsed) { Vector2 usePos = ParentThing.Position; Color bgCol = bg.SamplePixel(usePos); if (bgCol.Equals(bg.ForegroundColor)) { Color paintColor = new Color(RandomMath.RandomUnit(), RandomMath.RandomUnit(), RandomMath.RandomUnit()); bg.SetPixel(usePos, paintColor); UsesLeft--; } } }
protected override void OnNextMove() { base.OnNextMove(); // compute direction towards chase-target Vector2 dif = ChaseTarget.Position - ParentThing.Target; if (Avoidance) { dif = -dif; } if (dif.Length() == 0f) { return; } Vector2 difX = new Vector2(dif.X, 0f); Vector2 difY = new Vector2(0f, dif.Y); if (difX.Length() > 0f) { difX.Normalize(); } if (difY.Length() > 0f) { difY.Normalize(); } // whats-free bool isBlockedX = (difX.X != 0f) && ParentThing.ChecksCollisions && ParentThing.CollidesWithBackground(difX); bool isBlockedY = (difY.Y != 0f) && ParentThing.ChecksCollisions && ParentThing.CollidesWithBackground(difY); bool isFullyBlocked = (isBlockedX && (dif.Y == 0f)) || (isBlockedY && (dif.X == 0f)) || (isBlockedX && isBlockedY); bool isDiagonal = (dif.X != 0f) && (dif.Y != 0f); // choose one direction 1) based on whats free, then 2) semi-randomly, if diagonals would be required isPauseChase = false; if (isFullyBlocked) { dif = new Vector2(difY.Y, difX.X); // try a swap to get around obstacle } else if (isBlockedX) // choose Y move if x is blocked { dif = difY; } else if (isBlockedY) // choose X move if y is blocked { dif = difX; } else if (isDiagonal) // choose random x/y if a diagonal move would be required { float r = RandomMath.RandomUnit(); float thres = 0.5f; if (r > thres) { dif = difX; } else { dif = difY; } } else { dif.Normalize(); } TargetMove = dif; }