public BattleCharacter ReturnCharacter(PlacementPosition position)
    {
        if (PlaceNotExists(position))
        {
            return(null);
        }

        return(_placements[position.Line, position.Column]);
    }
    public bool TryAddCharacter(BattleCharacter character, PlacementPosition position)
    {
        if (PlaceNotExists(position))
        {
            return(false);
        }

        _placements[position.Line, position.Column] = character;
        return(true);
    }
    public bool TrySearch(out BattleCharacter character, PlacementPosition position)
    {
        character = null;
        if (PlaceNotExists(position))
        {
            return(false);
        }

        if (_placements[position.Line, position.Column] == null)
        {
            return(false);
        }

        character = _placements[position.Line, position.Column];
        return(true);
    }
        private BattleCharacter FirstPosition(PlacementPosition characterPosition, CharacterPlacement placement)
        {
            int line = FirstFoundNotEmptyLine(characterPosition.Line, placement);

            if (line >= 0)
            {
                for (int j = 0; j < placement.LengthColumn; j++)
                {
                    if (placement.TrySearch(out BattleCharacter character, new PlacementPosition(line, j)) && character.IsAlive)
                    {
                        return(character);
                    }
                }
            }

            return(null);
        }
Example #5
0
    private int FindNearestPlane(List <GameObject> planes, Vector3 minSize, PlacementPosition surface, List <int> usedPlanes)
    {
        int planeIndex = -1;

        for (int i = 0; i < planes.Count; i++)
        {
            if (usedPlanes.Contains(i))
            {
                continue;
            }

            if (planes[i].transform.localScale.x < minSize.x || planes[i].transform.localScale.y < minSize.y)
            {
                // Plane is too small
                continue;
            }

            return(i);
        }
        return(planeIndex);
    }
Example #6
0
    // If an object has children, we place them here
    void PlaceChildren(GameObject surface, GameObject parent, SurfacePlane plane, Assessable assessable, PlacementPosition placementType)
    {
        assetCount += assessable.children.Length;

        // Set rotation to look towards room center
        Quaternion rotation = Quaternion.LookRotation(surface.transform.forward, Vector3.up);

        // Get Assessable component of child
        Assessable childAssessable = assessable.children[0].GetComponent <Assessable>();

        childAssessable.setPlane(plane);

        // Get Collider of child
        BoxCollider childCollider = assessable.children[0].GetComponent <BoxCollider>();

        if (childCollider == null)
        {
            Debug.Log("Child needs BoxCollider");
        }

        // Set initial position
        Vector3 position = surface.transform.position + ((plane.PlaneThickness + (.5f * Math.Abs(childCollider.size.z) * assessable.children[0].transform.localScale.z)) * plane.SurfaceNormal);

        if (placementType == PlacementPosition.WallFloor)
        {
            position.y = mainFloor.Plane.Bounds.Center.y + childCollider.size.y * .5f * childCollider.transform.localScale.y;
        }
        else if (placementType == PlacementPosition.MidWall)
        {
            position.y = position.y + childCollider.size.y * .5f;
        }

        Vector3 right = Vector3.Cross(surface.transform.forward, Vector3.up);

        position += (parent.transform.localScale.x * parent.GetComponent <BoxCollider>().size.x * .5f + assessable.children[0].transform.localScale.y * childCollider.size.x * .5f + .25f) * right;

        // Instantiate object
        GameObject childObject = Instantiate(assessable.children[0], position, rotation) as GameObject;

        if (CheckMenuPlace(position))
        {
            childObject.SetActive(false);
        }
        // Add object to list for later removal of scene
        instantiatedAssets.Add(childObject);

        if (assessable.children.Length > 1)
        {
            // Get Assessable component of child

            childAssessable = assessable.children[1].GetComponent <Assessable>();
            childAssessable.setPlane(plane);

            // Get Collider of child
            childCollider = assessable.children[1].GetComponent <BoxCollider>();
            if (childCollider == null)
            {
                Debug.Log("Child needs BoxCollider");
            }

            // Set initial position
            position = surface.transform.position + ((plane.PlaneThickness + (.5f * Math.Abs(childCollider.size.z) * assessable.children[1].transform.localScale.z)) * plane.SurfaceNormal);

            if (placementType == PlacementPosition.WallFloor)
            {
                position.y = mainFloor.Plane.Bounds.Center.y + childCollider.size.y * .5f * childCollider.transform.localScale.y;
            }
            else if (placementType == PlacementPosition.MidWall)
            {
                position.y = position.y + childCollider.size.y * .5f;
            }

            Vector3 left = Vector3.Cross(surface.transform.forward, -Vector3.up);
            position += (parent.transform.localScale.x * parent.GetComponent <BoxCollider>().size.x * .5f + assessable.children[1].transform.localScale.y * childCollider.size.x * .5f + .25f) * left;
            rotation  = Quaternion.LookRotation(surface.transform.forward, Vector3.up);

            // Instantiate object
            GameObject childObject2 = Instantiate(assessable.children[1], position, rotation) as GameObject;

            if (CheckMenuPlace(position))
            {
                childObject2.SetActive(false);
            }

            // Add object to list for later removal of scene
            instantiatedAssets.Add(childObject2);
        }
    }
Example #7
0
    private void PlaceWallFloorObjects(List <GameObject> spaceObjects, List <GameObject> surfaces, PlacementPosition placementType)
    {
        #region Placement Technique Utilizing Spatial Mapping

        List <int> UsedPlanes = new List <int>();
        // Sort the planes by distance to user.
        surfaces.Sort((lhs, rhs) =>
        {
            Vector3 headPosition   = Camera.main.transform.position;
            Collider rightCollider = rhs.GetComponent <Collider>();
            Collider leftCollider  = lhs.GetComponent <Collider>();

            // Order planes by distance to user
            Vector3 rightSpot = rightCollider.ClosestPointOnBounds(headPosition);
            Vector3 leftSpot  = leftCollider.ClosestPointOnBounds(headPosition);

            return(Vector3.Distance(leftSpot, headPosition).CompareTo(Vector3.Distance(rightSpot, headPosition)));
        });

        foreach (GameObject item in spaceObjects)
        {
            assetCount++;

            int index = -1;

            BoxCollider collider = item.GetComponent <BoxCollider>();

            if (collider == null)
            {
                Debug.Log("Object needs BoxCollider");
            }

            index = FindNearestPlane(surfaces, item.transform.localScale, placementType, UsedPlanes);

            UsedPlanes.Add(index);

            Quaternion rotation = Quaternion.identity;
            Vector3    position;

            // If there is somewhere to put the object
            if (index >= 0)
            {
                GameObject   surface = surfaces[index];
                SurfacePlane plane   = surface.GetComponent <SurfacePlane>();

                // Generate postion by taking middle point of plane and then offseting by the width of the asset
                position = surface.transform.position + ((plane.PlaneThickness + (.5f * Math.Abs(collider.size.z) * item.transform.localScale.z)) * plane.SurfaceNormal);

                if (placementType == PlacementPosition.WallFloor)
                {
                    position.y = mainFloor.Plane.Bounds.Center.y + collider.size.y * .5f * item.transform.localScale.y;
                }

                if (placementType == PlacementPosition.HighWall || placementType == PlacementPosition.MidWall || placementType == PlacementPosition.Ceiling)
                {
                    // Vertical objects should face out from the wall.
                    position.y = position.y + collider.size.y * .5f;
                    rotation   = Quaternion.LookRotation(surface.transform.forward, Vector3.up);
                }
                else
                {
                    rotation = Quaternion.LookRotation(surface.transform.forward, Vector3.up);
                }


                //Vector3 finalPosition = AdjustPositionWithSpatialMap(position, placementType);
                GameObject spaceObject = Instantiate(item, position, rotation) as GameObject;

                // Add object to list for later removal of scene
                instantiatedAssets.Add(spaceObject);

                Assessable assessable = spaceObject.GetComponent <Assessable>();
                assessable.setPlane(plane);
                if (CheckMenuPlace(position))
                {
                    spaceObject.SetActive(false);
                }
                // CHeck to see if object has children to place
                if (assessable.children.Length > 0)
                {
                    PlaceChildren(surface, item, plane, assessable, placementType);
                }
            }
        }

        #endregion

        #region Spatial Understanding API Technique

        /*
         * List<LevelSolver.PlacementQuery> placementQuery = new List<LevelSolver.PlacementQuery>();
         *
         * foreach (GameObject obj in spaceObjects)
         * {
         *  BoxCollider collider = obj.GetComponent<BoxCollider>();
         *
         *  //Debug.Log("x: " + (Math.Abs(collider.size.x) * obj.transform.localScale.x));
         *  //Debug.Log("y: " + (Math.Abs(collider.size.y) * obj.transform.localScale.y));
         *  //Debug.Log("z: " + (Math.Abs(collider.size.z) * obj.transform.localScale.z));
         *
         *  placementQuery.Add(levelSolver.Query_OnWall(((Math.Abs(collider.size.x) * obj.transform.localScale.x)) / 2.0f, ((Math.Abs(collider.size.y) * obj.transform.localScale.y)) / 2.0f, ((Math.Abs(collider.size.z) * obj.transform.localScale.z)) / 2.0f, 0.0f, Math.Abs(collider.size.y) * obj.transform.localScale.y + .5f));
         * }
         * LevelSolver.Instance.PlaceObjectAsync("OnWall", placementQuery);
         *
         * int returnedVal;
         *
         *      do
         *      {
         *          returnedVal = levelSolver.ProcessPlacementResults();
         *      }
         *      while (returnedVal == -1);
         *
         *      if(returnedVal == -2)
         *      {
         *          Debug.Log("Mapp is too small");
         *      }
         *      else
         *      {
         *
         *  for (int i = 0; i < levelSolver.placementResults.Count; i++)
         *  {*/
        //Debug.Log(levelSolver.placementResults[i].Result.Position.x + " " + levelSolver.placementResults[i].Result.Position.y + " " + levelSolver.placementResults[i].Result.Position.z);

        /*
         * float mindiff = 100.0f;
         *
         * GameObject minplane = new GameObject();
         * foreach (GameObject s in surfaces)
         * {
         *  float diff = Math.Abs((s.transform.position.x - levelSolver.result.Position.x) + (s.transform.position.z - levelSolver.result.Position.z));
         *  Debug.Log("diff " + diff);
         *  if (diff < mindiff)
         *  {
         *      diff = mindiff;
         *      minplane = s;
         *  }
         * }
         * Vector3 querypos = levelSolver.result.
         * querypos = levelSolver.result.Position;// + ((.5f * Math.Abs(collider.size.z) * obj.transform.localScale.z)) * -minplane.GetComponent<SurfacePlane>().SurfaceNormal;
         * querypos.y = mainFloor.Plane.Bounds.Center.y + collider.size.y * .5f * obj.transform.localScale.y;
         *
         * GameObject spaceObject = Instantiate(obj, querypos, Quaternion.LookRotation(-levelSolver.result.Forward, Vector3.up)) as GameObject;
         * spaceObject.SetActive(true);
         * }
         */

        //  }
        // }
        #endregion
    }
 public BattleCharacterPlacement(BattleCharacter character, PlacementPosition position)
 {
     _character = character;
     _position  = position;
 }
 public PlacementNode(TextureAtlasNode sourceNode)
 {
     SourceNode = sourceNode;
     Score = new PlacementScore();
     Placement = new PlacementPosition(0, 0, false, 0, 0);
 }
Example #10
0
    private void Start()
    {
        _battleTeams    = (new SaveBattleSystem()).BattleTeams;
        _characterViews = new Dictionary <BattleCharacter, FightCharacterView>();
        List <BattleCharacterPlacement>   teamA      = new List <BattleCharacterPlacement>();
        List <BattleCharacterPlacement>   teamB      = new List <BattleCharacterPlacement>();
        List <BattleCharacter>            queue      = new List <BattleCharacter>();
        Dictionary <BattleCharacter, int> queueTeamA = new Dictionary <BattleCharacter, int>();
        Dictionary <BattleCharacter, int> queueTeamB = new Dictionary <BattleCharacter, int>();

        foreach (var member in _battleTeams.FightTeamA.Characters)
        {
            DatabaseCharacter databaseCharacter = _database.GetDatabaseCharacter(member.Id);
            BattleCharacter   character         = new BattleCharacter(databaseCharacter.BattleCharacter, databaseCharacter.Characteristics, null);
            PlacementPosition position          = new PlacementPosition(member.LinePosition, member.ColumnPosition);

            teamA.Add(new BattleCharacterPlacement(character, position));
            queueTeamA.Add(character, member.PlaceInQueue);
        }

        foreach (var member in _battleTeams.FightTeamB.Characters)
        {
            DatabaseCharacter databaseCharacter = _database.GetDatabaseCharacter(member.Id);
            BattleCharacter   character         = new BattleCharacter(databaseCharacter.BattleCharacter, databaseCharacter.Characteristics, null);
            PlacementPosition position          = new PlacementPosition(member.LinePosition, member.ColumnPosition);

            teamB.Add(new BattleCharacterPlacement(character, position));
            queueTeamB.Add(character, member.PlaceInQueue);
        }

        _battlePlacement = new BattlePlacement(teamA, teamB);

        foreach (var member in _battlePlacement.Search.AllTeam())
        {
            member.SetBattlePlacement(_battlePlacement);
        }

        foreach (var member in teamA)
        {
            FightSpawnPoint    spawnPoint     = _teamASpownPoints[member.Position.Line].points[member.Position.Column];
            FightCharacterView fightCharacter = Instantiate(_prefabCharacter, spawnPoint.transform);
            _characterViews.Add(member.Character, fightCharacter);
        }

        foreach (var member in teamB)
        {
            FightSpawnPoint    spawnPoint     = _teamBSpownPoints[member.Position.Line].points[member.Position.Column];
            FightCharacterView fightCharacter = Instantiate(_prefabCharacter, spawnPoint.transform);
            _characterViews.Add(member.Character, fightCharacter);
        }

        for (int i = 0; queueTeamA.Count > 0 || queueTeamB.Count > 0; i++)
        {
            if (i % 2 == 0)
            {
                if (queueTeamA.Count > 0)
                {
                    BattleCharacter battleCharacter = null;
                    int             j = int.MaxValue;

                    foreach (var key in queueTeamA.Keys)
                    {
                        if (queueTeamA[key] < j)
                        {
                            battleCharacter = key;
                            j = queueTeamA[key];
                        }
                    }

                    if (battleCharacter != null)
                    {
                        queue.Add(battleCharacter);
                        queueTeamA.Remove(battleCharacter);
                    }
                }
            }
            else
            {
                if (queueTeamB.Count > 0)
                {
                    BattleCharacter battleCharacter = null;
                    int             j = int.MaxValue;

                    foreach (var key in queueTeamB.Keys)
                    {
                        if (queueTeamB[key] < j)
                        {
                            battleCharacter = key;
                            j = queueTeamB[key];
                        }
                    }

                    if (battleCharacter != null)
                    {
                        queue.Add(battleCharacter);
                        queueTeamB.Remove(battleCharacter);
                    }
                }
            }
        }

        _timer          = 0;
        _fightControler = GetComponent <FightControler>();

        _allAction = _fightControler.Fight(_battlePlacement, queue);

        for (_countAction = 0; _countAction < _allAction.Count; _countAction++)
        {
            if (_allAction[_countAction].Act == CharacterActionEvent.Action.System)
            {
                if (_allAction[_countAction].ActSystem.SystemEnum == CharacterActionEvent.ActionSystem.StartFight)
                {
                    return;
                }
            }

            ActionHandler(_allAction[_countAction]);
        }
    }
 private bool PlaceNotExists(PlacementPosition position)
 {
     return(LengthLine < position.Line || LengthColumn < position.Column);
 }
 public CharacterPlacement(PlacementPosition maxPosition)
 {
     _placements = new BattleCharacter[maxPosition.Line, maxPosition.Column];
 }