private void atacarTanqueNetwork(GameAttackMessage attackMessage) { bool morreu = false; Tank tanqueAtacado = GetTankFromIDAndTeam(attackMessage.IDAtacado, true); Tank tanqueAtacante = GetTankFromIDAndTeam(attackMessage.IDAtacante, false); //retirar a vida ao tanque atacado if (attackMessage.dano > 0) { tanqueAtacado.vida -= attackMessage.dano; } if (tanqueAtacado.vida <= 0) { tanqueAtacado.activo = false; if (tanqueAtacado.equipa == Team.Alliance) { tanqueAtacado.textura = tanqueAtacado.alliance_destruido; } else { tanqueAtacado.textura = tanqueAtacado.coalition_destuido; } morreu = true; } //calcular o tamanho e tempo da explosao de acordo com o dano retirado float tempo_explosao; float escala_explosao; if (!morreu) { tempo_explosao = 100 * (attackMessage.dano - 25) / (100f - 25f); escala_explosao = 3 * (attackMessage.dano - 0.3f) / (100 - 0.3f); } else { tempo_explosao = 80; escala_explosao = 3f; } explode = new Animacao(); explode.Initialize(explosao, attackMessage.posicao, 134, 134, 12, tempo_explosao, Color.White, escala_explosao, false, 0f); lista_animacoes.Add(explode); //fogacho no tanque que dispara //NÃO CONSIGO POR O FOGACHO NA PONTINHA DO TANQUE POR CAUSA DAS ROTAÇÕES! ver isto melhor /* float posicao_x_fogacho = (tanque_seleccionado.posicao.X + (tanque_seleccionado.textura.Width / 4)); float posicao_y_fogacho = (tanque_seleccionado.posicao.Y); Vector2 posicao_fogacho = new Vector2(posicao_x_fogacho, posicao_y_fogacho); fogacho = new Animacao(); fogacho.Initialize(explosao, posicao_fogacho, 134, 134, 12, 25, Color.White, 0.2f, false,0f); lista_animacoes.Add(fogacho); */ //encontrar o terreno que cai na posicao da explosao e alterar-lhe o contador de explosoes for (int i = 0; i < altura_grelha; i++) { for (int j = 0; j < n_tanques + 1; j++) { Terreno terreno = grelha[i, j]; Rectangle rect_terreno = new Rectangle((int)terreno.posicao.X, (int)terreno.posicao.Y, terreno.largura / 2, terreno.altura / 2); Rectangle rect_explosao = new Rectangle((int)attackMessage.posicao.X, (int)attackMessage.posicao.Y, 1, 1); if (rect_explosao.Intersects(rect_terreno)) { if (!morreu) { terreno.explosoes++; } else { terreno.explosoes = 6; terreno.textura = textura_cratera_1; } break; } } } damageBox.activo = true; //mostrar a damageBox float damageBox_x, damageBox_y; damageBox_x = tanqueAtacado.posicao.X - 21; damageBox_y = (tanqueAtacado.posicao.Y + (tanqueAtacado.textura.Height / 2)) - DamageBox.altura; Vector2 posicao_damageBox = new Vector2(damageBox_x, damageBox_y); damageBox.Initializing(posicao_damageBox, tanqueAtacante.power, attackMessage.dano, morreu, tanqueAtacado, tanqueAtacante, false); //verificar o double shot if (tanqueAtacante.double_shot) { tanqueAtacante.double_shot = false; } else { //não pode disparar durante 5 turnos! tanqueAtacante.turnos_espera_disparar = nTurnosCoolDown; } tanqueAtacante.pode_mover = false; tanqueAtacante.cor = Color.Red; //se tem mega-power, repor o power if (tanqueAtacante.mega_power) { tanqueAtacante.power = tanqueAtacante.power_anterior; tanqueAtacante.mega_power = false; } tanqueAtacante.angulo_destino = attackMessage.rotacao; tanqueAtacante.seleccionado = false; tanqueAtacante = null; terreno_pode_mover.Clear(); tanqueAtacante = null; }
private void atacarTanque(Tank tanque) { bool morreu = false; //calcular dano que vamos retirar ao tanque atacado float distancia = Vector2.Distance(new Vector2(tanque_seleccionado.posicao.X+(tanque_seleccionado.textura.Width/4), tanque_seleccionado.posicao.Y + (tanque_seleccionado.textura.Height / 4)), new Vector2(tanque.posicao.X + (tanque.textura.Width / 4), tanque.posicao.Y + (tanque.textura.Height / 4))); int firepower = tanque_seleccionado.power; //normalizar a distancia para dar valores entre 0 e 100 distancia = 100 * (distancia - 66) / (1418 - 66); //lidar com o powe-up SNIPER if (tanque_seleccionado.sniper) { distancia = 0; tanque_seleccionado.sniper = false; } //power aleatorio int power = gerador_numeros.Next(firepower - 50); //MEGA-POWER if (tanque_seleccionado.mega_power) { power = 80 + power; } else { power = 50 + power; } //subtrair ao firepower a distancia int dano = power - (int)distancia*2; //retirar a vida ao tanque atacado if (dano > 0) { tanque.vida -= dano; } else { dano=0; }; if (tanque.vida <= 0) { tanque.activo = false; if (tanque.equipa == Team.Alliance) { tanque.textura = tanque.alliance_destruido; } else { tanque.textura = tanque.coalition_destuido; } morreu = true; } //calcular os desvios da explosao de acordo com a sorte que teve no tiro int max_desvio; if (firepower - dano <= 0) { max_desvio = 1; } else { max_desvio = firepower - dano; } int desvio_x = gerador_numeros.Next(max_desvio); //normalizar desvio desvio_x = 50*(desvio_x - 1) / (100 - 1); int sinal_x = gerador_numeros.Next(2); if (sinal_x == 0) { sinal_x = -1; } else { sinal_x = 1; } int dano_maximo; if (firepower - dano <= 0) { dano_maximo = 199; } else { dano_maximo = firepower - dano; } int desvio_y = gerador_numeros.Next(dano_maximo); //normalizar desvio desvio_y = 50 * (desvio_y - 1) / (100 - 1); int sinal_y = gerador_numeros.Next(2); if (sinal_y == 0) { sinal_y = -1; } else { sinal_y = 1; } //calcular o tamanho e tempo da explosao de acordo com o dano retirado float tempo_explosao; float escala_explosao; if (!morreu) { tempo_explosao = 100 * (dano - 25) / (100f - 25f); escala_explosao = 3 * (dano - 0.3f) / (100 - 0.3f); } else { tempo_explosao = 80; escala_explosao = 3f; } float posicao_x = (tanque.posicao.X + (tanque.textura.Width / 4))+(sinal_x * desvio_x); float posicao_y = (tanque.posicao.Y + (tanque.textura.Height / 4))+(sinal_y * desvio_y); Vector2 posicao = new Vector2(posicao_x, posicao_y); explode = new Animacao(); explode.Initialize(explosao, posicao , 134, 134, 12, tempo_explosao, Color.White, escala_explosao, false,0f); lista_animacoes.Add(explode); //fogacho no tanque que dispara //NÃO CONSIGO POR O FOGACHO NA PONTINHA DO TANQUE POR CAUSA DAS ROTAÇÕES! ver isto melhor /* float posicao_x_fogacho = (tanque_seleccionado.posicao.X + (tanque_seleccionado.textura.Width / 4)); float posicao_y_fogacho = (tanque_seleccionado.posicao.Y); Vector2 posicao_fogacho = new Vector2(posicao_x_fogacho, posicao_y_fogacho); fogacho = new Animacao(); fogacho.Initialize(explosao, posicao_fogacho, 134, 134, 12, 25, Color.White, 0.2f, false,0f); lista_animacoes.Add(fogacho); */ //encontrar o terreno que cai na posicao da explosao e alterar-lhe o contador de explosoes for (int i = 0; i < altura_grelha; i++) { for (int j = 0; j < n_tanques + 1; j++) { Terreno terreno = grelha[i, j]; Rectangle rect_terreno = new Rectangle((int)terreno.posicao.X, (int)terreno.posicao.Y, terreno.largura / 2, terreno.altura / 2); Rectangle rect_explosao = new Rectangle((int)posicao_x,(int)posicao_y,1,1); if (rect_explosao.Intersects(rect_terreno)) { if (!morreu) { terreno.explosoes++; } else { terreno.explosoes = 6; terreno.textura = textura_cratera_1; } break; } } } damageBox.activo = true; //mostrar a damageBox float damageBox_x, damageBox_y; damageBox_x = tanque.posicao.X-21; damageBox_y = (tanque.posicao.Y + (tanque.textura.Height/2))-DamageBox.altura; Vector2 posicao_damageBox = new Vector2(damageBox_x, damageBox_y); damageBox.Initializing(posicao_damageBox, tanque_seleccionado.power, dano, morreu, tanque, tanque_seleccionado, true); //verificar o double shot if (tanque_seleccionado.double_shot) { tanque_seleccionado.double_shot = false; } else { //não pode disparar durante 5 turnos! tanque_seleccionado.turnos_espera_disparar = nTurnosCoolDown; } tanque_seleccionado.pode_mover = false; tanque_seleccionado.cor = Color.Red; //se tem mega-power, repor o power if (tanque_seleccionado.mega_power) { tanque_seleccionado.power = tanque_seleccionado.power_anterior; tanque_seleccionado.mega_power = false; } tanque_seleccionado.seleccionado = false; terreno_pode_mover.Clear(); terreno_seleccionado = null; //Enviar ataque para o servidor SendMessageToServer(new GameAttackMessage(MessageType.Attack, tanque_seleccionado.ID, tanque.ID, posicao, dano, tanque_seleccionado.angulo_actual)); tanque_seleccionado = null; }