/// <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); }
/// <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); }