예제 #1
0
파일: ovr032.cs 프로젝트: gowantervo/coab
        /* sub_7354A */
        /// <summary>
        /// Returns if playerB can see playerA
        /// </summary>
        internal static bool CanSeeCombatant(int direction, Point playerA, Point playerB)
        {
            if (playerA.MapInBounds() == false || playerB.MapInBounds() == false)
            {
                return false;
            }

            if (direction == 0xff || direction == 8)
            {
                return true;
            }

            int facingX = playerB.x + gbl.MapDirectionXDelta[direction];
            int facingY = playerB.y + gbl.MapDirectionYDelta[direction];

            if (playerB == playerA ||
                (facingX == playerA.x && facingY == playerA.y))
            {
                return true;
            }

            bool canSee;

            switch (direction)
            {
                case 0:
                    canSee = ((playerA.x >= facingX && playerA.y <= ((facingX - playerA.x) + facingY)) ||
                        (playerA.x <= facingX && playerA.y <= ((playerA.x - facingX) + facingY)));
                    break;

                case 1:
                    canSee = ((playerA.x >= facingX && playerA.y <= ((facingX - playerA.x) + facingY)) ||
                        (playerA.x >= ((facingX - facingY) + playerA.y) && playerA.y <= facingY));
                    break;

                case 2:
                    canSee = ((playerA.x >= (facingX + facingY - playerA.y) && playerA.y <= facingY) ||
                        (playerA.x >= (facingX + playerA.y - facingY) && playerA.y >= facingY));
                    break;

                case 3:
                    canSee = ((playerA.x >= ((facingX + playerA.y) - facingY) && playerA.y >= facingY) ||
                        (playerA.x >= facingX && playerA.y >= ((playerA.x - facingX) + facingY)));
                    break;

                case 4:
                    canSee = ((playerA.x >= facingX && playerA.y >= ((playerA.x - facingX) + facingY)) ||
                        (playerA.x <= facingX && playerA.y >= ((facingX - playerA.x) + facingY)));
                    break;

                case 5:
                    canSee = ((playerA.x <= facingX && playerA.y >= ((facingX - playerA.x) + facingY)) ||
                        (playerA.x <= ((facingX + facingY) - playerA.y) && playerA.y >= facingY));
                    break;

                case 6:
                    canSee = ((playerA.x <= ((facingX + facingY) - playerA.y) && playerA.y >= facingY) ||
                        (playerA.x <= ((facingX + playerA.y) - facingY) && playerA.y <= facingY));
                    break;

                case 7:
                    canSee = ((playerA.x <= ((facingX + playerA.y) - facingY) && playerA.y <= facingY) ||
                        (playerA.x <= facingX && playerA.y <= ((playerA.x - facingX) + facingY)));
                    break;

                case 8:
                    canSee = true;
                    break;

                default:
                    throw new System.ApplicationException("Switch value unexpected");
            }

            return canSee;
        }