示例#1
0
        /// <summary>
        /// Move uma entidade para outro ponto qualquer. Se Já houver uma entidade, as duas se transformam em uma entidade múltipla que contém as duas.
        /// Se houver só um item nessa lista depois de mover, esse item se toma o lugar da entidade múltipla.
        /// </summary>
        /// <param name="destino">Posição de destino no ambiente.</param>
        /// <param name="entidade">Entidade que será movida.</param>
        public static void MoveEntidade(Coordenadas destino, Entidade entidade)
        {
            Entidade orig = _ambiente[entidade.Coordenadas.Y, entidade.Coordenadas.X];

            if (orig is Multiplo)
            {
                (orig as Multiplo).Entidades.Remove(entidade);

                if ((orig as Multiplo).Entidades.Count == 1)
                {
                    _ambiente[entidade.Coordenadas.Y, entidade.Coordenadas.X] = (orig as Multiplo).Entidades[0];
                }
                else if ((orig as Multiplo).Entidades.Count == 0)
                {
                    _ambiente[entidade.Coordenadas.Y, entidade.Coordenadas.X] = null;
                }
            }
            else
            {
                _ambiente[entidade.Coordenadas.Y, entidade.Coordenadas.X] = null;
            }

            AmbienteChange?.Invoke(_ambiente[entidade.Coordenadas.Y, entidade.Coordenadas.X], new Coordenadas {
                X = entidade.Coordenadas.X, Y = entidade.Coordenadas.Y
            });

            entidade.Coordenadas = destino;

            Entidade dest = _ambiente[destino.Y, destino.X];

            if (dest != null)
            {
                Multiplo multiplo;

                if (dest is Multiplo)
                {
                    multiplo = dest as Multiplo;
                    multiplo.Entidades.Add(entidade);
                }
                else
                {
                    multiplo = new Multiplo(destino);
                    multiplo.Entidades.Add(_ambiente[destino.Y, destino.X]);
                    multiplo.Entidades.Add(entidade);
                }

                _ambiente[destino.Y, destino.X] = multiplo;
            }
            else
            {
                _ambiente[destino.Y, destino.X] = entidade;
            }

            AmbienteChange?.Invoke(_ambiente[destino.Y, destino.X], destino);
        }
示例#2
0
        /// <summary>
        /// Pega lixo em determinada coordenada.
        /// </summary>
        /// <param name="coordenadas">Coordenadas de onde o lixo está.</param>
        /// <returns>Se conseguiu pegar o lixo ou não.</returns>
        public bool PegaLixo(Coordenadas coordenadas)
        {
            Entidade entidade = Ambiente.GetEntidade(coordenadas);
            Lixo     lixo     = null;

            if (entidade is Multiplo)
            {
                lixo = (entidade as Multiplo).Entidades.Find(e => e is Lixo) as Lixo;
            }
            else if (entidade is Lixo)
            {
                lixo = entidade as Lixo;
            }

            if (lixo != null && (lixo.Tipo == TipoLixo.ORGANICO && !SacoLixoOrganicoEstaCheio() || lixo.Tipo == TipoLixo.SECO && !SacoLixoSecoEstaCheio()))
            {
                bool sucesso = VaiAte(coordenadas);

                Multiplo multiplo = Ambiente.GetEntidade(this.Coordenadas) as Multiplo;

                if (multiplo != null && sucesso)
                {
                    sucesso = false;

                    lixo = multiplo.Entidades.Find(e => e is Lixo) as Lixo;

                    if (lixo.Tipo == TipoLixo.ORGANICO && !SacoLixoOrganicoEstaCheio())
                    {
                        this.SacoLixoOrganico.Add(lixo);
                        multiplo.Entidades.Remove(lixo);
                        sucesso = true;
                    }
                    else if (lixo.Tipo == TipoLixo.SECO && !SacoLixoSecoEstaCheio())
                    {
                        this.SacoLixoSeco.Add(lixo);
                        multiplo.Entidades.Remove(lixo);
                        sucesso = true;
                    }

                    if (multiplo.Entidades.Count <= 1)
                    {
                        Ambiente.AtualizaEntidade(this);
                    }
                    else
                    {
                        Ambiente.AtualizaEntidade(multiplo);
                    }
                }

                return(sucesso);
            }

            return(false);
        }