public Comando(string accao, Cliente ligacao, RoomDesc sala, string idMapa) { _accao = accao; _ligacao = ligacao; _sala = sala; _idMapa = idMapa; }
private static int FindRoom(RoomDesc room, int[,] map, Direction dir) { if (map[room.Line,room.Column] != room.Num) { throw new Exception("Inconsistent map."); } int l, c, lmax = map.GetLength(0) - 1, cmax = map.GetLength(1) - 1; switch(dir) { case Direction.North: l = room.Line - 1; while (l >= 0 && map[l,room.Column] == -1) { l--; } if (l != room.Line -1 && l >= 0 && map[l,room.Column] > 0) { return map[l,room.Column]; } break; case Direction.South: l = room.Line + 1; while (l <= lmax && map[l,room.Column] == -1) { l++; } if (l != room.Line + 1 && l <= lmax && map[l,room.Column] > 0) { return map[l,room.Column]; } break; case Direction.East: c = room.Column + 1; while (c <= cmax && map[room.Line,c] == -1) { c++; } if (c != room.Column + 1 && c <= cmax && map[room.Line,c] > 0) { return map[room.Line,c]; } break; case Direction.West: c = room.Column - 1; while (c >= 0 && map[room.Line,c] == -1) { c--; } if (c != room.Column - 1 && c >= 0 && map[room.Line,c] > 0) { return map[room.Line,c]; } break; } return -1; }
/// <summary> /// Dada uma sala e uma direccao, indica qual o numero da proxima sala /// </summary> /// <param name="accao">Direccao a tomar</param> /// <param name="Sala">Sala Actual</param> /// <returns>Numero da proxima sala</returns> public static int IndicaSalaDestino(string accao, RoomDesc Sala) { if (accao.Equals(MapDesc.NORTE)) { return Sala.North; } if (accao.Equals(MapDesc.SUL)) { return Sala.South; } if (accao.Equals(MapDesc.ESTE)) { return Sala.East; } if (accao.Equals(MapDesc.OESTE)) { return Sala.West; } return -1; }
public static MensagemServidor UpdateEstadoGlobalSistema(string idCliente, string idJogo, string idOrigem, string destino, RoomDesc novaSala, int pontuacaoAntiga, int pontuacaoNova, bool jogoTerminou, string resultadoAccaoCliente, string guid) { MensagemServidor mensagem = new MensagemServidor(idCliente, idOrigem, destino, Mensagem.UPDATEESTADOGLOBAL); mensagem._novaSala = novaSala; mensagem._idJogo = idJogo; mensagem._pontuacaoAntiga = pontuacaoAntiga; mensagem._pontuacaoNova = pontuacaoNova; mensagem._jogoTerminou = jogoTerminou; mensagem._resultadoAccaoCliente = resultadoAccaoCliente; mensagem._idUnico = guid; return mensagem; }
public void ActualizaSala(RoomDesc sala) { _mapa[sala.Num - 1] = sala; return; }
/// <summary> /// Acende os botoes adequados conforme o que se puder fazer e diz se os existe aroma a veneno /// ou se existe um cofre sem tesouro la dentro /// </summary> /// <param name="salaActual">A sala em que o jogador se encontra</param> private void AcertaBotoesDireccoesAdequadas(RoomDesc salaActual) { //Norte if (_salaActual.North == -1) { _btNorte.Enabled = false; } else { _btNorte.Enabled = true; } //Este if (_salaActual.East == -1) { _btEste.Enabled = false; } else { _btEste.Enabled = true; } //Sul if (_salaActual.South == -1) { _btSul.Enabled = false; } else { _btSul.Enabled = true; } //Oeste if (_salaActual.West == -1) { _btOeste.Enabled = false; } else { _btOeste.Enabled = true; } char tipoSala = _salaActual.RoomType; //Sala com cofre if (tipoSala.Equals(MapDesc.SALAVAZIA) || tipoSala.Equals(MapDesc.SALAAROMAVENENO) || tipoSala.Equals(MapDesc.COFREVAZIO)) { _btAbre.Enabled = false; } else { _btAbre.Enabled = true; } //So para DEBUG (sugerido pelo professor) if (tipoSala.Equals(MapDesc.SALAAROMAVENENO)) { MMGCliente.EscreveLog(Configuration.TEXTO_SALA_ONDE_EXISTIU_VENENO, _salaActual.Num); } if (tipoSala.Equals(MapDesc.COFREVAZIO)) { MMGCliente.EscreveLog(Configuration.TEXTO_COFRE_VAZIO, _salaActual.Num); } }
public static void TrataRespostaMovimento(RoomDesc novaSala, int numGasRedor, int pontuacao) { ActualizaSalaActual(novaSala); if (_salaActual.CofreAberto == true) { MMGCliente.EscreveLog(Configuration.TEXTO_COFRE_ABERTO, novaSala.Num); } MMGCliente.form.AcertaBotoesDireccoesAdequadas(_salaActual); form._btMudarServidor.Enabled = true; form._tbSalasGas.Text = "" + numGasRedor; }
void TrataBotoesMovimento(string movimento) { if (_modoOffline == true) { if (movimento.Equals(MapDesc.ABRIR)) { _lstCofresAbertosOffline.Add(_salaActual.Num); _btAbre.Enabled = false; return; } int salaDestino = Comando.IndicaSalaDestino(movimento, _salaActual); _salaActual = _mapaOffline.GetSala(salaDestino); AcertaBotoesDireccoesAdequadas(_salaActual); _tbNumeroSala.Text = "" + _salaActual.Num; _tbSalasGas.Enabled = false; if (_lstCofresAbertosOffline.Contains(_salaActual.Num)) { EscreveLog("Ja tentou abrir o cofre desta sala em modo offline. Só 1vez permitida", _salaActual.Num); _btAbre.Enabled = false; } } else { DisableBotoesForm(); } }
public static void ActualizaSalaActual(RoomDesc sala) { _salaActual = sala; form._tbNumeroSala.Text = "" + sala.Num; }
public static MensagemCliente RespostaMovimentoJogador(string idCliente, RoomDesc novaSala, int NumSalasAdjComGas, int pontuacaoNova) { MensagemCliente mensagem = new MensagemCliente(idCliente, Mensagem.RESPOSTAMOVIMENTO, idCliente); mensagem._nick = idCliente; mensagem._novaSala = novaSala; mensagem._numSalasAdjComGas = NumSalasAdjComGas; mensagem._pontuacaoNova = pontuacaoNova; return mensagem; }
public static void RealizaUpdateDoEstado(string idJogo, RoomDesc sala, string idCliente, int pontuacaoAntiga, int pontuacaoNova, bool jogoTerminou, string resultadoAccaoCliente) { Configuration.Debug("Vou fazer update da sala:" + sala.Num + " do jogo:" + idJogo + " devido ao jogador:" + idCliente, Configuration.PRI_MIN); //Significa que o estado do sistema global mudou. Preciso de actualizar a sala Jogo jogo = Jogo.GetJogo(idJogo, ServerMain._lstJogos); if (jogo == null) { Configuration.Debug("Descartei msg referente a 1jogo que eu ainda nem sei que foi criado.", Configuration.PRI_MAX); return; } if (LigacaoCliente.ClienteExiste(idCliente, ServerMain._lstLigacoesAJogadores) == false) { Configuration.Debug("Esta mensagem é devido a um cliente que eu ainda nem conheco mas nao há problema.", Configuration.PRI_MAX); } //Preciso de actualizar a sala jogo.Mapa.ActualizaSala(sala); //E pontuacao do cliente jogo.ActualizaPontuacao(idCliente, pontuacaoNova); //E se o jogo acabou ou nao jogo.Terminou = jogoTerminou; //Se este update corresponde a um pedido de um cliente meu entao vou avisa-lo if (LigacaoCliente.EMeuCliente(idCliente, ServerMain._lstLigacoesAJogadores) == true) { MensagemCliente mensagem; if (jogoTerminou == false) { mensagem = MensagemCliente.RespondeAbertura(idCliente, pontuacaoAntiga, pontuacaoNova, resultadoAccaoCliente); } else { ArrayList top10 = jogo.ElaboraListaTop10(); mensagem = MensagemCliente.RespondeJogoFim(idCliente, pontuacaoNova, top10); } ComunicacaoServidor.MeteMensagemParaEnviar(mensagem); } return; }