protected override void UpdateWeapon(GameTime gameTime) { switch (_hookState) { case (HookState.Idle): { if (_firing) { _hookState = HookState.Fired; _hookPosition = _owner.Position; _hookAngle = XnaHelper.RadiansFromVector(_fireDirection); _hookVelocity = _fireDirection * HOOK_SPEED; } break; } case (HookState.Fired): { if (!(_firing) && Vector2.Distance(_hookPosition, _owner.Position) < MAX_RANGE) { _hookPosition += _hookVelocity; _hookHitRect.X = (int)_hookPosition.X; _hookHitRect.Y = (int)_hookPosition.Y; } else { _hookState = HookState.Retracting; } break; } case (HookState.Retracting): { _hookPosition -= HOOK_SPEED * Vector2.Normalize(_hookPosition - _owner.Center); if (XnaHelper.PointInRect(_hookPosition, _owner.HitRect)) { _hookState = HookState.Idle; } break; } case (HookState.Attached): { _hookPosition = _hookedUnit.Center; Vector2 pullForce = HOOK_FORCE * XnaHelper.DirectionBetween(_owner.Position, _hookedUnit.Position); _owner.ApplyForce(pullForce); _hookedUnit.ApplyForce(Vector2.Negate(pullForce)); if (_firing) { _hookState = HookState.Idle; } break; } } }
/// <summary> /// Check if target unit is in range. If so, apply force and damage /// </summary> /// <param name="effectPos">origin of effect</param> /// <param name="target">target unit</param> public void TryApply(Vector2 effectPos, PhysicalUnit target, TimeSpan time) { if (utility.XnaHelper.RectangleIntersectsCircle(target.HitRect, effectPos, _radius)) { tempVec.X = target.Position.X - effectPos.X; tempVec.Y = target.Position.Y - effectPos.Y; Vector2.Normalize(tempVec); float factor = Duration == TimeSpan.Zero ? 1 : (float)time.TotalSeconds / (float)Duration.TotalSeconds; target.ApplyForce(_force * factor * tempVec); target.ApplyDamage((_damage * factor)); target.ApplyStatus(_statEffects); } }