public override void Move(int time) { //Jesli zolnierz zyje. if (IsAlive) { int tileIndex = Mathematics.PositionToIndex(xPos); if (tileIndex != startPosition) { leftBornTile = true; } if (canReEnter && //czy moze wejsc ponownie do bunkra. (tileIndex != startPosition) && //jesli bunkier nie jest rodzicem. IsBunker(tileIndex) && //jesli to jest bunkier. (time % ProbabilityCoefficient == 0)) //losowosc. { BunkerTile bunker = refToLevel.LevelTiles[tileIndex] as BunkerTile; if (bunker.IsDestroyed && bunker.CanReconstruct) { bunker.Reconstruct(); refToLevel.Controller.OnTileRestored(bunker); } if (!bunker.IsDestroyed) { //dodaje zolnierza do bunkra. bunker.AddGeneral(); //wyslam sygnal do controllera aby usunal zolnierza z widoku. refToLevel.Controller.UnregisterSoldier(this); //usuwam zolnierza z planszy. _soldierStatus = SoldierStatus.InBunker; } else { ChangeLocation(time); } } else { ChangeLocation(time); } //sprawdza czy ulynal czas bezsmiertelnosci if (!canDie) { protectedTime += time; if (protectedTime >= TimeUnit) { canDie = true; } } //sprawdza czy ponownie moze wejsc do bunkra. if (!canReEnter) { homelessCounterTime += time; if (homelessCounterTime >= GameConsts.Soldier.HomelessTime) { canReEnter = true; } } } }
/// <summary> /// Zmienia pozycje zolnierza. /// </summary> /// <param name="time">Czas od ostatniego ruchu w milisekundach.</param> public virtual void Move(int time) { //Jesli zolnierz zyje. if (IsAlive) { int tileIndex = Mathematics.PositionToIndex(xPos); bool isBunker = IsBunker(tileIndex); if (tileIndex != startPosition) { leftBornTile = true; } if (canReEnter && //czy moze wejsc ponownie do bunkra. (tileIndex != startPosition) && //jesli bunkier nie jest rodzicem. isBunker && //jesli to jest bunkier. (time % ProbabilityCoefficient == 0)) //losowosc. { BunkerTile bunker = refToLevel.LevelTiles[tileIndex] as BunkerTile; if (bunker.IsDestroyed && bunker.CanReconstruct) { bunker.Reconstruct(); refToLevel.Controller.OnTileRestored(bunker); } if (!bunker.IsDestroyed && bunker.CanAddSoldier) { //dodaje zolnierza do bunkra. bunker.AddSoldier(); //wyslam sygnal do controllera aby usunal zolnierza z widoku. refToLevel.Controller.UnregisterSoldier(this); //usuwam zolnierza z planszy. ReturnToBunker(); } else { ChangeLocation(time); } } else { // czy zolnierz moze strzelac? if (!isBunker && canDie && ShouldFire && CanFire) { if (preparingToFireTime == 0) { // zolnierz zaczyna sie przygotowywać refToLevel.Controller.OnSoldierPrepareToFire(this, firePrepareDelay); } preparingToFireTime += time; if (preparingToFireTime >= firePrepareDelay) { Random r = new Random(); // strzal preparingToFireTime = 0; PointD dir = refToLevel.UserPlane.Position - Position; dir.Normalise(); PointD moveVector = GameConsts.Rocket.BaseSpeed * RocketSpeedMultiplier * dir; dir.X *= (moveVector.X >= 0) ? 1.0f : -1.0f; float relative = dir.Angle; lastFireTick = Environment.TickCount; Rocket rocket = Weapon.RocketFire(relative, moveVector, bazookaRotationPerSecond); rocket.MaxDistanceToOwner *= RocketDistanceMultiplier * Mathematics.RangeRandom(0.8f, 1.2f); rocket.MaxHeightDistanceToOwner *= RocketDistanceMultiplier * Mathematics.RangeRandom(0.8f, 1.2f); // zmniejsz zasieg rakiet refToLevel.Controller.OnSoldierEndPrepareToFire(this); } } else if (!isBunker && canDie && CanFire) { // !ShouldFire -> samolot jest poza zasiegiem if (preparingToFireTime > 0) { // wracamy do punktu wyjscia bez strzalu preparingToFireTime = 0; refToLevel.Controller.OnSoldierEndPrepareToFire(this); } else { ChangeLocation(time); } } else { ChangeLocation(time); } } //sprawdza czy ulynal czas bezsmiertelnosci if (!canDie) { protectedTime += time; if (protectedTime >= TimeUnit) { canDie = true; } } //sprawdza czy ponownie moze wejsc do bunkra. if (!canReEnter) { homelessCounterTime += time; if (homelessCounterTime >= GameConsts.Soldier.HomelessTime) { canReEnter = true; } } } }