示例#1
0
        //todo need refactor big time
        private void Update()
        {
            if (_isPlayerTurn)
            {
                if (!_isTileSelected)
                {
                    if (MouseHitUi())
                    {
                        ClearHighlights();
                        return;
                    }

                    HighlightTileUnderMouse();
                }

                if (Input.GetMouseButtonDown(0))
                {
                    if (!_isTileSelected)
                    {
                        //check if ability is selected and if a valid target is clicked then use ability if true

                        if (_isAbilitySelected)
                        {
                            //todo need method for this block - Get <T> from mouse position - entity, tile, floor whatever

                            var mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);

                            var mouseCoord = new Coord((int)mousePosition.x, (int)mousePosition.y);

                            var entity = (Entity)_map.Entities.GetItems(mouseCoord).FirstOrDefault();

                            if (entity != null && _selectedAbility.TargetValid(entity) && _selectedAbility.TargetInRange(entity))
                            {
                                _selectedAbility.Use(entity);

                                _selectedAbility = null;

                                _isAbilitySelected = false;

                                ClearHighlights();

                                GameManager.Instance.SetCursorToNormal();

                                _eventMediator.Broadcast(GlobalHelper.RefreshCombatUi, this, _combatManager.ActiveEntity);
                            }
                        }
                        else
                        {
                            //todo only allow for tiles within entity movement range

                            //todo need to block when interacting with ui

                            if (MouseHitUi())
                            {
                                ClearHighlights();
                                return;
                            }

                            HighlightPathToMouse();
                        }
                    }
                    else
                    {
                        //check if same tile clicked then move there if true

                        var mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);

                        var mouseCoord = new Coord((int)mousePosition.x, (int)mousePosition.y);

                        if (_map.OutOfBounds(mouseCoord))
                        {
                            return;
                        }

                        var targetTile = _map.GetTerrain <Floor>(mouseCoord);

                        if (targetTile == null || !targetTile.IsWalkable)
                        {
                            return;
                        }

                        if (ReferenceEquals(_selectedTile, targetTile))
                        {
                            var activeEntity = _combatManager.ActiveEntity;

                            if (_apMovementCost > activeEntity.Stats.CurrentActionPoints)
                            {
                                return;
                            }

                            activeEntity.MoveTo(targetTile, _apMovementCost, true, _highlightedTiles);

                            _eventMediator.Broadcast(GlobalHelper.RefreshCombatUi, this, activeEntity);
                        }

                        _isTileSelected = false;

                        _eventMediator.Broadcast(GlobalHelper.TileDeselected, this);
                    }
                }
                else if (Input.GetMouseButtonDown(1))
                {
                    _isTileSelected    = false;
                    _isAbilitySelected = false;

                    _eventMediator.Broadcast(GlobalHelper.TileDeselected, this);

                    GameManager.Instance.SetCursorToNormal();
                }
                else if (Input.GetKeyDown(KeyCode.Escape))
                {
                    //todo clear if anything selected
                    //todo show menu if nothing selected

                    _isTileSelected    = false;
                    _isAbilitySelected = false;

                    _eventMediator.Broadcast(GlobalHelper.TileDeselected, this);

                    GameManager.Instance.SetCursorToNormal();
                }
            }
        }
示例#2
0
        public void Build(CombatMap map)
        {
            GlobalHelper.DestroyAllChildren(gameObject);
            GlobalHelper.DestroyAllChildren(EntityHolder.gameObject);

            for (var currentColumn = 0; currentColumn < map.Width; currentColumn++)
            {
                for (var currentRow = 0; currentRow < map.Height; currentRow++)
                {
                    var coord = new Coord(currentColumn, currentRow);

                    var tile = map.GetTerrain <Tile>(coord);

                    var tileInstance = Instantiate(TerrainSlotPrefab, new Vector2(currentColumn, currentRow), Quaternion.identity);

                    tileInstance.GetComponent <SpriteRenderer>().sprite = tile.Texture;

                    tile.SetSpriteInstance(tileInstance);

                    tileInstance.AddComponent <OnMouseOverTile>();

                    tileInstance.GetComponent <OnMouseOverTile>().Tile = tile;

                    tileInstance.transform.SetParent(transform);

                    tileInstance.GetComponent <TerrainSlotUi>().SetTile(tile);

                    var entity = map.GetEntity <Entity>(coord);

                    if (entity != null)
                    {
                        var entityInstance = Instantiate(entity.CombatSpritePrefab, new Vector2(currentColumn, currentRow), Quaternion.identity);

                        entityInstance.transform.SetParent(EntityHolder);

                        entity.SetSpriteInstance(entityInstance);

                        if (!entity.IsPlayer())
                        {
                            entityInstance.AddComponent <AiController>();
                            entityInstance.GetComponent <AiController>().SetSelf(entity);

                            var spriteRenderer = entityInstance.GetComponent <SpriteRenderer>();

                            if (spriteRenderer == null)
                            {
                                spriteRenderer = entityInstance.GetComponentInChildren <SpriteRenderer>();
                            }

                            spriteRenderer.flipX = true;

                            var position = entityInstance.transform.position;

                            position = new Vector3(position.x + 1,
                                                   position.y, position.z);

                            entityInstance.transform.position = position;

                            var sRenderer = entityInstance.GetComponent <Renderer>();

                            if (sRenderer == null)
                            {
                                sRenderer = entityInstance.GetComponentInChildren <Renderer>();
                            }

                            var palette = FindObjectOfType <Palette>();

                            var mat = sRenderer.material;

                            mat.SetColor("_OutlineColor", palette.BrightRed);
                            mat.SetFloat("_OutlineWidth", 0.0009f);
                            mat.SetFloat("_OutlineAlpha", 1.0f);
                        }

                        entityInstance.AddComponent <EntityAudio>();

                        var entityAudio = entityInstance.GetComponent <EntityAudio>();

                        entityAudio.AttackSound = entity.AttackSound;
                        entityAudio.HurtSound   = entity.HurtSound;
                        entityAudio.DeathSound  = entity.DieSound;

                        var spriteStore = FindObjectOfType <SpriteStore>();

                        var colorSwapper = entityInstance.GetComponentsInChildren <ColorSwapper>();

                        spriteStore.SetColorSwaps(colorSwapper, entity);

                        var animationHelper = entityInstance.GetComponent <CombatAnimationHelper>();

                        if (animationHelper != null)
                        {
                            animationHelper.Parent = entity;
                        }

                        tileInstance.GetComponent <TerrainSlotUi>().SetEntity(entity);
                    }
                }
            }
        }