Beispiel #1
0
        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;
        }
Beispiel #2
0
        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;
        }