/// <summary> /// Fires the weapon /// </summary> public override void Fire() { var facingRightFactor = this.Mech.IsFacingRight ? 1 : -1; // Set overriding animation this.Animatable.PlayClip("fire", 1, true); this.EquippedOnArm.PlayClip(this.ArmAnimationClipName, 1, true); // Set shoot pellet count int shootCount = (int)this.PelletCount; float diff = this.PelletCount - shootCount; if (GlobalRandom.NextFloat() < diff) { shootCount++; } // Camera shake MainCamera.CurrentInstance.Shake(this.ScreenShake); // Adjust knock back var hitX = this.BaseHit.KnockBack.x * facingRightFactor; var adjustedHit = new WeaponHitStat(this.BaseHit); adjustedHit.KnockBack = new Vector2(hitX, this.BaseHit.KnockBack.y); // Apply recoil var recoilX = -this.BaseStats.Recoil * facingRightFactor; this.Mech.ApplyKnockback(new Vector2(recoilX, 0), this.BaseStats.Recoil, 0); // Fire all pellets for (int shoot = 0; shoot < shootCount; shoot++) { // Determine inaccuracy var inaccuracy = (100 - this.BaseStats.Accuracy) / 200 * GlobalRandom.NextFloat() * Mathf.PI; if (GlobalRandom.NextBool()) { inaccuracy *= -1; } var shootX = Mathf.Cos(inaccuracy) * facingRightFactor; var shootY = Mathf.Sin(inaccuracy); var rayCastHits = Physics2D.RaycastAll(this.MuzzleLocation.transform.position, new Vector2(shootX, shootY)); for (var i = 0; i < rayCastHits.Length; i++) { var curHit = rayCastHits[i]; var hittable = curHit.collider.GetComponent <IHittable>(); if (hittable != null && hittable.Faction != adjustedHit.Faction) { hittable.OnHit(adjustedHit); var newBullet = Instantiate(this.BulletLinePrefab); newBullet.OnBulletHit(this.MuzzleLocation.transform.position, curHit); break; } } } }
private static int randomCount(float randomCountFloat) { var randomCount = (int)randomCountFloat; if (GlobalRandom.NextBool(randomCountFloat - randomCount)) { randomCount++; } return(randomCount); }
public GameState(bool isFirst = false) { this.Statistics = new GameStatistics(); this.Level = new Level.Level(this, LevelGenerator.NewDefault.Silent); this.Level.GrowCrystals(); this.Player = new Wisp(this, Vector2.Zero); this.Camera = new Camera(this.Player); this.musicSettings = new MusicSettingsHud(this); this.ChasingEnemies = new HashSet <Monster>(); foreach (var tile in this.Level.Tilemap) { if (tile.Radius > 2 && tile.Info.Lightness < Settings.Game.Level.LightnessThreshold && GlobalRandom.NextBool(0.15)) { foreach (var i in Enumerable.Range(0, GlobalRandom.Next(1, 3))) { new Monster(this, this.Level.GetPosition(tile) + new Vector2(GlobalRandom.NextFloat(), GlobalRandom.NextFloat()) * 0.1f); } } } this.titleEndTime = isFirst ? 3 : 0; }
public override void Update(GameUpdateEventArgs e) { var toPlayer = this.game.Player.Position - this.position; var toPlayerDSquared = toPlayer.LengthSquared; #region check player visibility if (this.nextVisibleCheck == 0) { this.nextVisibleCheck = this.game.Time + GlobalRandom.NextFloat(Settings.Game.Enemy.MinScanInterval, Settings.Game.Enemy.MaxScanInterval); } if (this.nextVisibleCheck < this.game.Time) { this.nextVisibleCheck = 0; if (toPlayerDSquared < Settings.Game.Enemy.ViewDistanceSquared) { var result = this.game.Level.ShootRay(new Ray(this.position, toPlayer), this.Tile); this.seesPlayer = !result.Results.Hit; if (game.DrawDebug) { var lines = SpriteManager.Instance.Lines; lines.Color = result.Results.Hit ? Color.Red : Color.Green; lines.LineWidth = 0.2f; lines.DrawLine(this.position, result.GlobalPoint); } } else { this.seesPlayer = false; } } if (this.seesPlayer) { if (!this.chasing) { this.game.ChasingEnemies.Add(this); this.chasing = true; } this.lastKnownPlayerPosition = this.game.Player.Position; this.losePlayerTime = this.game.Time + 1; } if (this.chasing && this.losePlayerTime < this.game.Time) { this.game.ChasingEnemies.Remove(this); this.chasing = false; } #endregion #region chase if (this.chasing) { var toKnownPlayerPosition = this.lastKnownPlayerPosition - this.position; this.velocity += toKnownPlayerPosition.Normalized() * Settings.Game.Enemy.Acceleration * e.ElapsedTimeF; } #endregion #region monster-monster collision foreach (var monster in this.Tile.Info.Monsters) { if (monster == this) { continue; } var diff = monster.position - this.position; var dSquared = diff.LengthSquared; if (dSquared == 0) { continue; } const float radius = 1f; if (dSquared < radius * radius) { var d = (float)Math.Sqrt(dSquared); var normalDiff = diff / d; var f = radius - d; f *= f; this.velocity -= 100 * normalDiff * f * e.ElapsedTimeF; if (this.game.DrawDebug) { var lines = SpriteManager.Instance.Lines; lines.Color = Color.Red; lines.LineWidth = 0.1f; lines.DrawLine(this.position, this.position + diff / d); } } } #endregion #region fear of light foreach (var tile in this.Tile.Info.OpenSides.Enumerate() .Select(d => this.Tile.Neighbour(d)).Append(this.Tile)) { var info = tile.Info; if (info.Lightness > 0.2) { var tilePosition = this.game.Level.GetPosition(tile); var diff = tilePosition - this.position; var d = diff.Length; const float radius = Settings.Game.Level.HexagonSide * 1.1f; if (d < radius) { var normalDiff = diff / d; var f = radius - d; f *= f; this.velocity -= 100 * normalDiff * f * e.ElapsedTimeF; } } } #endregion #region bite if (this.waitingToBite) { if (this.biteNextFrame) { var toPlayerNormal = toPlayer.Normalized(); this.game.Player.Damage(Settings.Game.Enemy.HitDamage, toPlayerNormal); this.velocity *= 0.1f; this.velocity += toPlayerNormal * 5; this.particles.Explode(0.6f, toPlayerNormal.WithZ(0) * 10, 1); this.nextHitTime = this.game.Time + Settings.Game.Enemy.HitInterval; this.biteNextFrame = false; this.waitingToBite = false; } else { if (toPlayerDSquared > Settings.Game.Enemy.HitDistanceSquared) { this.waitingToBite = false; } } } if (!this.waitingToBite && this.nextHitTime <= this.game.Time && toPlayerDSquared < Settings.Game.Enemy.HitDistanceSquared) { //this.game.Player.Damage(Settings.Game.Enemy.HitDamage); //this.nextHitTime = this.game.Time + Settings.Game.Enemy.HitInterval; this.scheduleBite(); } #endregion #region blinking if (this.nextBlinkToggle < this.game.Time) { this.blinking = !this.blinking; if (this.blinking) { this.nextBlinkToggle = this.game.Time + (GlobalRandom.NextBool(0.1f) ? GlobalRandom.NextFloat(0.1f, 1f) : GlobalRandom.NextFloat(0.1f, 0.2f)); } else { this.nextBlinkToggle = this.game.Time + (GlobalRandom.NextBool(0.2f) ? GlobalRandom.NextFloat(0.2f, 0.4f) : GlobalRandom.NextFloat(1, 10)); } } #endregion if (toPlayerDSquared < Settings.Game.Enemy.ContributeToTensionDistanceSquared) { this.game.MonstersCloseToPlayer++; } base.Update(e); this.particles.Update(e); }