/// <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> /// Coloca uma entidade na posição definida. /// </summary> /// <param name="coordenadas">Posição no ambiente.</param> /// <param name="entidade">Entidade que será colocada.</param> public static void SetEntidade(Coordenadas coordenadas, Entidade entidade) { Entidade pos = _ambiente[coordenadas.Y, coordenadas.X]; if (pos != null) { _entidades.Remove(pos); _agentes.Remove(pos as Agente); _lixeiras.Remove(pos as Lixeira); _lixos.Remove(pos as Lixo); } _ambiente[coordenadas.Y, coordenadas.X] = entidade; if (entidade != null) { entidade.Coordenadas.X = coordenadas.X; entidade.Coordenadas.Y = coordenadas.Y; if (entidade is Agente) { _agentes.Add(entidade as Agente); } else if (entidade is Lixeira) { _lixeiras.Add(entidade as Lixeira); } else if (entidade is Lixo) { _lixos.Add(entidade as Lixo); } _entidades.Add(entidade); } AmbienteChange?.Invoke(entidade, coordenadas); }
/// <summary> /// Força a entidade a atualizar a tela. /// </summary> /// <param name="entidade">Entidade que irá atualizar.</param> public static void AtualizaEntidade(Entidade entidade) { AmbienteChange?.Invoke(entidade, entidade.Coordenadas); }