예제 #1
0
        private void GenerateActorsAndItemsOutside()
        {
            var bound = new BoundsInt(new Vector3Int(-2, -53, 0), new Vector3Int(19, 18, 1));

            for (int i = 0; i < 10; i++)
            {
                Vector2Int randomPosition = _rng.NextPosition(bound);
                if (_gridInfoProvider.IsWalkable(randomPosition))
                {
                    var actor = _rng.Choice(new[]
                    {
                        ActorType.Rogue,
                        ActorType.BruisedRat,
                        ActorType.BruisedRat,
                        ActorType.Rat,
                        ActorType.Rat,
                        ActorType.RatChiefBetter,
                        ActorType.RatChief,
                        ActorType.Dog,
                        ActorType.RatVeteran,
                    });
                    _entitySpawner.SpawnActor(actor, randomPosition);
                }
            }
            ItemDefinition recoverTailDefinition = Resources.Load <ItemDefinition>("PotionOfRecoverTail");

            _entitySpawner.SpawnItem(recoverTailDefinition, new Vector2Int(-3, -83));
            _entitySpawner.SpawnActor(ActorType.LastMonster, new Vector2Int(-2, -83));
            _entitySpawner.SpawnActor(ActorType.Basher, new Vector2Int(11, -64));
            _entitySpawner.SpawnActor(ActorType.RatChief, new Vector2Int(3, -87));
        }
예제 #2
0
        public void HandleDeath(ActorData actorData)
        {
            ItemDefinition weaponToSpawn = actorData.WeaponWeld;

            _entityRemover.CleanSceneAndGameContextAfterDeath(actorData);
            //_entitySpawner.SpawnItem(_gameConfig.ItemConfig.Definitions.FirstOrDefault(i => i.ItemType == ItemType.PotionOfFriend), actorData.LogicalPosition);
            if (actorData.ActorType == ActorType.Basher)
            {
                _gameContext.BasherDead = true;
            }
            if (actorData.IsBoss && _gameContext.CurrentDungeonIndex == 0)
            {
                _entitySpawner.SpawnItem(_gameConfig.ItemConfig.Definitions.First(i => i.ItemType == ItemType.PotionOfBuddy), actorData.LogicalPosition);
            }
            else if (actorData.ActorType != ActorType.Buddy && actorData.ActorType != ActorType.Friend && _rng.Check(0.42f))
            {
                ItemDefinition[] itemPool = actorData.XpGiven < 15
                                        ? _gameConfig.ItemConfig.ItemPoolWeak
                                        : actorData.XpGiven < 26 ? _gameConfig.ItemConfig.ItemPoolMedium : _gameConfig.ItemConfig.ItemPoolStrong;
                ItemDefinition item = _rng.Choice(itemPool);

                _entitySpawner.SpawnItem(item, actorData.LogicalPosition);
            }

            if (!weaponToSpawn.WeaponDefinition.IsBodyPart && actorData.ActorType != ActorType.Buddy && actorData.ActorType != ActorType.Friend)
            {
                _entitySpawner.SpawnItem(weaponToSpawn, actorData.LogicalPosition);
            }

            if (actorData.ControlledByPlayer)
            {
                _uiConfig.RestartButton.gameObject.SetActive(true);
                var postMortem = "You died at level " + actorData.Level + " after surviving " + actorData.RoundsCount +
                                 " rounds. \r\nIf you have trouble playing, check out \"Combat help\" to the right. Restart?";
                _uiConfig.RestartButton.transform.GetComponentInChildren <Text>().text = postMortem;
            }
        }
예제 #3
0
        public override IEnumerable <IActionEffect> Execute()
        {
            if (_fromInventory)
            {
                _uiConfig.ItemHolder.RemoveItem(_uiConfig.ItemHolder.SelectedItemIndex);
            }
            else
            {
                ItemData itemAtFeet = _entityDetector.DetectItems(ActorData.LogicalPosition).First(i => i.ItemType == _item.ItemType);
                _entityRemover.RemoveItem(itemAtFeet);
            }

            bool isAllowed = !
                             (_gameContext.BasherSteps == 1 &&
                              new[]
            {
                ItemType.PotionOfBuddy, ItemType.PotionOfFriend, ItemType.PotionOfHealing,
                ItemType.PotionOfLight, ItemType.Food
            }
                              .Contains(_item.ItemType)
                             );

            if (_item.ItemType == ItemType.PotionOfRecoverTail)
            {
                _textEffectPresenter.ShowTextEffect(ActorData.LogicalPosition, "Squeak! At last!", Color.yellow);
            }
            else
            {
                _textEffectPresenter.ShowTextEffect(ActorData.LogicalPosition, isAllowed ? "Ha!" : "Oh, it doesn't work!", Color.yellow);
            }

            if (_item.ItemType == ItemType.Weapon)
            {
                ItemDefinition previousWeapon = ActorData.WeaponWeld;
                if (_fromInventory)
                {
                    _uiConfig.ItemHolder.AddItem(previousWeapon);
                }
                else
                {
                    if (previousWeapon.Name == "Key")
                    {
                        _entitySpawner.SpawnItem(previousWeapon, ActorData.LogicalPosition);
                    }
                    else
                    {
                        _entitySpawner.SpawnWeapon(previousWeapon.WeaponDefinition, ActorData.LogicalPosition, previousWeapon);
                    }
                }
                Image currentWeaponSprite = _uiConfig.CurrentWeaponHolder.gameObject.transform.Find("Image")
                                            .gameObject.GetComponent <Image>();
                _uiConfig.TooltipCurrentWeaponPresenter.GetComponent <CurrentWeaponTooltip>().LabelWearingUpper.gameObject.SetActive(true);
                _uiConfig.TooltipCurrentWeaponPresenter.Present(_item, true);
                _uiConfig.TooltipPresenter.gameObject.SetActive(false);
                currentWeaponSprite.sprite = _item.Sprite;
                currentWeaponSprite.color  = Color.white;

                ActorData.WeaponWeld = _item;
                Action effectAction = () => ((ActorBehaviour)ActorData.Entity).WeaponAnimator.Awake();
                var    effect       = new LambdaEffect(effectAction);
                yield return(effect);
            }
            else if (_item.ItemType == ItemType.PotionOfRecoverTail)
            {
                Sprite withTailSprite = Resources.Load <Sprite>("Sprites/Characters/player_with_tail");
                ActorData.Entity.SpriteRenderer.sprite = withTailSprite;
                ActorData.HasTail = true;
            }
            else if (isAllowed)
            {
                if (_item.ItemType == ItemType.Food)
                {
                    ActorData.Health += (int)(ActorData.MaxHealth * 0.3f);
                    if (ActorData.Health > ActorData.MaxHealth)
                    {
                        ActorData.Health = ActorData.MaxHealth;
                    }
                }
                else if (_item.ItemType == ItemType.PotionOfHealing)
                {
                    ActorData.Health += (int)(ActorData.MaxHealth * 0.7f);
                    if (ActorData.Health > ActorData.MaxHealth)
                    {
                        ActorData.Health = ActorData.MaxHealth;
                    }
                }
                else if (_item.ItemType == ItemType.PotionOfBuddy)
                {
                    _entitySpawner.SpawnActor(ActorType.Buddy, ActorData.LogicalPosition);
                }
                else if (_item.ItemType == ItemType.PotionOfFriend)
                {
                    _entitySpawner.SpawnActor(ActorType.Friend, ActorData.LogicalPosition);
                }
                else if (_item.ItemType == ItemType.PotionOfLight)
                {
                    IEnumerable <ActorData> actorsAround = _entityDetector.DetectActors(ActorData.LogicalPosition, 4).Where(a => a != ActorData);
                    foreach (var actorData in actorsAround)
                    {
                        actorData.Energy -= (2 + _rng.NextFloat() * 2f);
                        actorData.Swords -= 1;
                        if (actorData.Swords < 0)
                        {
                            actorData.Swords = 0;
                        }
                        string text = "";
                        if (actorData.ActorType != ActorType.Dog)
                        {
                            text = _rng.Choice(new[] { "My eyes!", "I can't see!", "Oh!", "Squeak!" });
                        }
                        else
                        {
                            text = "Squeak!";
                        }
                        _textEffectPresenter.ShowTextEffect(actorData.LogicalPosition, text);
                    }
                }
            }
        }
예제 #4
0
 public override IEnumerable <IActionEffect> Execute()
 {
     _uiConfig.ItemHolder.RemoveItem(_uiConfig.ItemHolder.SelectedItemIndex);
     _entitySpawner.SpawnItem(_item, ActorData.LogicalPosition);
     yield break;
 }