private static void ProcessCharacter(
            TasksBatch batch,
            string entity,
            Character character,
            CharacterChange characterChange,
            GameState gameState,
            SceneConfiguration sceneConfiguration,
            BoardPositionLookUp boardPositionLookUp,
            HashSet <string> ignoreForHubUpdate,
            bool isMonster)
        {
            var position = new Vector3Int(
                character.Position.X,
                character.Position.Y,
                0);

            if (characterChange.Died)
            {
                if (character.Position.BoardId == sceneConfiguration.BoardName)
                {
#if UNITY_EDITOR
                    Debug.Log("Character Dies");
#endif
                    ignoreForHubUpdate.Add(entity);
                    batch.Add(new DespawnTask(entity));
                    batch.Add(new EffectTask(EffectType.Death, position));
                }

                return;
            }
            else if (characterChange.Respawned)
            {
                if (character.Position.BoardId == sceneConfiguration.BoardName)
                {
                    ignoreForHubUpdate.Add(entity);

                    if (isMonster)
                    {
                        batch.Add(new SpawnMonsterTask(entity, position, character.Sprite)
                        {
                            Health     = character.CurrentHealth,
                            Level      = character.Level,
                            Experience = character.Experience
                        });
                    }
                    else
                    {
                        batch.Add(new SpawnPlayerTask(entity, position)
                        {
                            Health     = character.CurrentHealth,
                            Level      = character.Level,
                            Experience = character.Experience
                        });
                    }

                    batch.Add(new EffectTask(EffectType.Spawn, position));
                }

                return;
            }

            switch (characterChange.Decision.DecisionType)
            {
            case DecisionType.Move:
                if (character.Position.BoardId != sceneConfiguration.BoardName)
                {
                    return;
                }

                Vector3[] path = GetPath(characterChange.Path, boardPositionLookUp);
                batch.Add(new FollowPathTask(entity, path));
                break;

            case DecisionType.Portal:
                ignoreForHubUpdate.Add(entity);

                if (character.Position.BoardId != sceneConfiguration.BoardName)
                {
                    batch.Add(new DespawnTask(entity));
                }
                else
                {
                    if (isMonster)
                    {
                        batch.Add(new SpawnMonsterTask(entity, position, character.Sprite)
                        {
                            Health     = character.CurrentHealth,
                            Level      = character.Level,
                            Experience = character.Experience
                        });
                    }
                    else
                    {
                        batch.Add(new SpawnPlayerTask(entity, position)
                        {
                            Health     = character.CurrentHealth,
                            Level      = character.Level,
                            Experience = character.Experience
                        });
                    }
                }

                batch.Add(new EffectTask(EffectType.Portal, position));
                break;

            case DecisionType.Attack:
                if (character.Position.BoardId == sceneConfiguration.BoardName)
                {
                    foreach (var location in characterChange.AttackLocations)
                    {
                        var attackPosition = new Vector3Int()
                        {
                            x = location.X,
                            y = location.Y,
                            z = 0
                        };

                        batch.Add(new EffectTask(EffectType.Attack, attackPosition));
                    }
                }
                break;

            case DecisionType.Equip:
                if (character.Position.BoardId == sceneConfiguration.BoardName && !isMonster)
                {
                    ignoreForHubUpdate.Add(entity);

                    Player player = gameState.PlayerNames[entity];

                    batch.Add(new UpdateInventoryTask(entity)
                    {
                        clothes_changed  = characterChange.ClothesChanged,
                        hat_changed      = characterChange.HatChanged,
                        shoes_changed    = characterChange.ShoesChanged,
                        weapon_changed   = characterChange.WeaponChanged,
                        accesory_changed = characterChange.AccessoryChanged,

                        Top       = player.Clothes?.Sprite,
                        Bottom    = player.Shoes?.Sprite,
                        Head      = player.Hat?.Sprite,
                        Weapon    = character.Weapon?.Sprite,
                        Accessory = player.Accessory?.Sprite
                    });
                    return;
                }
                break;

            case DecisionType.None:
                break;

            default:
                Debug.LogWarningFormat("Unrecognized decision type {0}", characterChange.Decision.DecisionType);
                break;
            }
        }
Пример #2
0
	void Start()
	{
		cc = gameObject.GetComponentInParent<CharacterChange>();
	}
Пример #3
0
        /// <summary>
        /// Generate a turn for a given board
        /// </summary>
        /// <param name="boardName">the board name</param>
        /// <returns></returns>
        private VisualizerTurn GetTurn(string boardName)
        {
            // prepare data
            VisualizerTurn turn = new VisualizerTurn();

            // setup game state
            GameState gameState = new GameState();

            gameState.BoardNames[boardName] = new IO.Models.Board()
            {
                Width  = 1,
                Height = 2,
            };

            gameState.PlayerNames["player"] = new Player()
            {
                Character = new Character()
                {
                    Name          = "player",
                    CurrentHealth = 17,
                    Position      = new Position()
                    {
                        X       = 0,
                        Y       = 1,
                        BoardId = boardName
                    }
                }
            };

            GameChange gameChange = new GameChange();

            CharacterChange characterChange = new CharacterChange()
            {
                Died      = false,
                Respawned = false,
                Decision  = new CharacterDecision()
                {
                    DecisionType = DecisionType.Move
                }
            };

            characterChange.Path.Add(new Position()
            {
                X       = 0,
                Y       = 0,
                BoardId = boardName
            });

            characterChange.Path.Add(new Position()
            {
                X       = 1,
                Y       = 0,
                BoardId = boardName
            });

            gameChange.CharacterChanges["player"] = characterChange;

            turn.State  = gameState;
            turn.Change = gameChange;

            return(turn);
        }