Exemple #1
0
        public FireResults Fire(string player_id, int x, int y)
        {
            Player player  = _dm.Ps.GetPlayer(convertId(player_id), true);
            Room   room    = _dm.Rs.GetRoom(player.roomid);
            Player player2 = _dm.Rs.GetPlayer2(player, room);
            string s       = player.login;
            string s1      = player2.login;

            //List<sbyte> xc = new List<sbyte>();
            //List<sbyte> yc = new List<sbyte>();
            //List<sbyte> res = new List<sbyte>();
            FireResults res = new FireResults();

            if (player2.field[y][x] == (sbyte)Field_Cell_States.empty)
            {
                res.XCoords.Add((sbyte)x);
                res.YCoords.Add((sbyte)y);
                res.FireRes.Add((sbyte)Field_Cell_States.miss);
                player2.field[y][x] = (sbyte)Field_Cell_States.miss;
                if (room.movepriority == (sbyte)Moves_States.player1)
                {
                    room.movepriority = (sbyte)Moves_States.player2;
                }
                else
                {
                    room.movepriority = (sbyte)Moves_States.player1;
                }
            }
            else
            {
                getFireResults(player2.field, player2.shipcount, x, y, res);
                room.flUpdateField = true;
            }

            //// Game_State = 0;
            //// string[] parameters = _gamesrv.Sts.UpdateInfoRoom(player, player2, room);
            ////  room.updTime = DateTime.Now;
            res.p2shipscount = player2.shipcount;
            res.movetime     = startTimer(room);
            return(res);
        }
    public void AnimateShot(FireResults fireResults)
    {
        lineRenderer.SetVertexCount(fireResults.Count * 2);
        lineWidth = 1f;
        lineRenderer.SetWidth(lineWidth, lineWidth);

        for (int i = 0; i < fireResults.Count; i++)
        {
            lineRenderer.SetPosition(i * 2, fireResults[i].Origin);
            lineRenderer.SetPosition(i * 2 + 1, fireResults[i].Ending);
        }

        StartCoroutine(AnimateLineRendererOut());
    }
    private FireResults GetNextPointRecursivly(ref FireResults currentFireResults, Vector3 origin, Vector3 heading)
    {
        if (currentFireResults.Bounces >= BounceLimit) return currentFireResults;

        RaycastHit hit;
        if (Physics.Raycast(origin, heading, out hit, 1000, 1 << 12)) // HexWall 12
        {
            HexType hexType = hit.collider.GetComponentInParent<HexTileInformation>().HexType;
            List<GameObject> hitEnemies = CalculateEnemyHits(origin, hit.point, heading);

            currentFireResults.Add(new FireSegment(origin, hit.point, hexType, hitEnemies));

            switch (hexType)
            {
                case HexType.Wall:
                    break;
                case HexType.Mirror:
                    currentFireResults = GetNextPointRecursivly(ref currentFireResults, hit.point, Vector3.Reflect(heading, hit.normal));
                    break;
            }
        }

        return currentFireResults;
    }
    /// <summary>
    /// Calculates all the fire points
    /// </summary>
    /// <returns>A list of point-heading tuples</returns>
    private FireResults CalculateFirePoints()
    {
        var firePoints = new FireResults();
        firePoints = GetNextPointRecursivly(ref firePoints, playerInformtion.FirePoints[0].transform.position, transform.forward);

        return firePoints;
    }
Exemple #5
0
        void getFireResults(sbyte[][] f, sbyte[] shipcount, int x, int y, FireResults res)
        {
            f[y][x] = (sbyte)Field_Cell_States.injured;

            Func <int, int, bool> compare = (u, v) =>
            {
                if (u < 0 || v < 0 || v >= f[x].Length || u >= f.Length)
                {
                    return(false);
                }
                return(f[u][v] == (sbyte)Field_Cell_States.ship ||
                       f[u][v] == (sbyte)Field_Cell_States.injured);
            };

            int l = x - 1, r = x + 1, t = y - 1, b = y + 1;

            while (true)
            {
                if (compare(y, l))
                {
                    l--;
                }
                else
                if (compare(y, r))
                {
                    r++;
                }
                else
                if (compare(t, x))
                {
                    t--;
                }
                else
                if (compare(b, x))
                {
                    b++;
                }
                else
                {
                    l++; r--; t++; b--;
                    break;
                }
            }

            int xk = r;
            int xn = l;

            bool flagKilled = true;

            if (xk - xn != 0)
            {
                for (int i = xn; i <= xk; i++)
                {
                    if ((sbyte)Field_Cell_States.ship == f[y][i])
                    {
                        flagKilled = false;
                    }
                }
                if (flagKilled)
                {
                    for (int j = y - 1; j <= y + 1; j++)
                    {
                        for (int i = xn - 1; i <= xk + 1; i++)
                        {
                            if (j < 0 || j >= f.Length)
                            {
                                break;
                            }
                            if (i < 0 || i >= f[y].Length)
                            {
                                continue;
                            }
                            if (i >= xn && i <= xk && j == y)
                            {
                                continue;
                            }
                            if (f[j][i] != (sbyte)Field_Cell_States.miss)
                            {
                                res.XCoords.Add((sbyte)i); res.YCoords.Add((sbyte)j); res.FireRes.Add((sbyte)Field_Cell_States.miss);
                                f[j][i] = (sbyte)Field_Cell_States.miss;
                            }
                        }
                    }
                    shipcount[xk - xn]--;
                }
                res.XCoords.Add((sbyte)x); res.YCoords.Add((sbyte)y); res.FireRes.Add((sbyte)Field_Cell_States.injured);


                return;
            }
            int yk = b;
            int yn = t;

            //vertical ships
            //  if (yk - yn != 0)
            //  {
            flagKilled = true;
            for (int i = yn; i <= yk; i++)
            {
                if ((sbyte)Field_Cell_States.ship == f[i][x])
                {
                    flagKilled = false;
                }
            }
            if (flagKilled)
            {
                for (int j = x - 1; j <= x + 1; j++)
                {
                    for (int i = yn - 1; i <= yk + 1; i++)
                    {
                        if (j < 0 || j >= f[y].Length)
                        {
                            break;
                        }
                        if (i < 0 || i >= f.Length)
                        {
                            continue;
                        }
                        if (i >= yn && i <= yk && j == x)
                        {
                            continue;
                        }
                        if (f[i][j] != (sbyte)Field_Cell_States.miss)
                        {
                            res.XCoords.Add((sbyte)j); res.YCoords.Add((sbyte)i); res.FireRes.Add((sbyte)Field_Cell_States.miss);
                            f[i][j] = (sbyte)Field_Cell_States.miss;
                        }
                    }
                }
                shipcount[yk - yn]--;
            }
            res.XCoords.Add((sbyte)x); res.YCoords.Add((sbyte)y); res.FireRes.Add((sbyte)Field_Cell_States.injured);

            //  }
        }
        public JsonResult Fire(string player_id, int x, int y)
        {
            FireResults res = _gs.Fire(player_id, x, y);

            return(Json(new { cells = res.XCoords, rows = res.YCoords, movetime = res.movetime, fireresult = res.FireRes, shipcount = res.p2shipscount }));
        }