Пример #1
0
    /// <summary>
    /// Interpret and execute command
    /// </summary>
    public string HandleCommand(string input)
    {
        JsonEnemyCommandStructure command = JsonConvert.DeserializeObject <JsonEnemyCommandStructure>(input);

        Enemy enemy = PersonController.instance.GetEnemyById(command.EnemyID);

        if (enemy == null)
        {
            return("Failed: No such enemy");
        }
        EnemyAIComponent aIComponent = enemy.GetComponent <EnemyAIComponent>();

        switch (command.Method)
        {
        case "GetEnvironmentData":
            return(aIComponent.GetEnvironmentData());

        case "SetDestination":
            JsonFloatPositionStructure structure = command.Destination;
            Vector2 destination = new Vector2(structure.x, structure.y);
            aIComponent.SetDestination(destination, (float)command.Velocity);
            break;

        case "SetRotation":
            aIComponent.SetRotation((float)command.Rotation);
            break;

        case "Interact":
            aIComponent.Interact(command.InteractableID);
            break;

        case "FireWeapon":
            aIComponent.FireWeapon();
            break;

        case "DropWeapon":
            aIComponent.DropWeapon();
            break;

        case "CloseCombatAttack":
            aIComponent.CloseCombatAttack();
            break;

        case "StopOverride":
            aIComponent.StopOverride();
            break;

        default:
            return("Failed: No such command");
        }

        return(null);
    }
    /// <summary>
    /// Serialize the given level and levelElements into a json file.
    /// Therefore, the JSON framework Json.NET (https://www.newtonsoft.com/json) will be used.
    /// </summary>
    /// <param name="level"></param>
    /// <param name="levelElements"></param>
    /// <param name="levelItems"></param>
    /// <param name="enemyData"></param>
    public void SerializeLevel(string pathToSave, Level level, IList <ILevelElement> levelElements, IList <Item> levelItems, IList <Enemy> enemies)
    {
        ////////////////////////////////////////////////////////////////////////
        //////////////////////////// Level Elements ////////////////////////////
        ////////////////////////////////////////////////////////////////////////

        IList <ILevelElement> relevantLevelElements = new List <ILevelElement>();

        // Filter only the LevelElements that are necessary for serialization.
        // Remove all floor elements because they will not be serialized (and lead to an error if they get casted to LevelElement).
        foreach (ILevelElement levelElement in levelElements)
        {
            if (levelElement is Wall || levelElement is Door || levelElement is EndZone)
            {
                relevantLevelElements.Add(levelElement);
            }
        }


        // Count how many elements of each type are in the given list.
        int numberWallElements = 0;
        int numberDoorElements = 0;
        int numberEndZones     = 0;

        foreach (ILevelElement levelElement in relevantLevelElements)
        {
            if (levelElement is Wall)
            {
                numberWallElements++;
            }
            else if (levelElement is Door)
            {
                numberDoorElements++;
            }
            else if (levelElement is EndZone)
            {
                numberEndZones++;
            }
        }

        // In case the serialize method is called at the start of the level and before the player can be spawned, use the spawn position as the players actual position.
        JsonFloatPositionStructure spawnPosition;

        if (Player.instance is null)
        {
            spawnPosition = new JsonFloatPositionStructure(level.getSpawnPosition().x, level.getSpawnPosition().y);
        }
        else
        {
            float playerPosX = (float)Math.Round(Player.instance.transform.position.x, 2);
            float playerPosY = (float)Math.Round(Player.instance.transform.position.y, 2);
            spawnPosition = new JsonFloatPositionStructure(playerPosX, playerPosY);
        }

        JsonLevelStructure levelNode = new JsonLevelStructure {
            Size = new JsonIntPositionStructure(level.GetLevelSize().x, level.GetLevelSize().y)
        };

        JsonPlayerStructure playerNode = new JsonPlayerStructure {
            SpawnPosition = spawnPosition
        };

        JsonLevelElementStructure levelElementsNode = new JsonLevelElementStructure {
            Walls    = new JsonWallStructure[numberWallElements],
            Doors    = new JsonDoorStructure[numberDoorElements],
            EndZones = new JsonEndZoneStructure[numberEndZones]
        };

        // Loop through the levelElements and add them to the corresponding array.
        int wallArrayCounter    = 0;
        int doorArrayCounter    = 0;
        int endZoneArrayCounter = 0;

        foreach (LevelElement levelElement in relevantLevelElements)
        {
            // Wall
            if (levelElement is Wall)
            {
                JsonWallStructure tmpWallStructure = new JsonWallStructure {
                    Position = new JsonIntPositionStructure(levelElement.getActualPosition().x, levelElement.getActualPosition().y)
                };
                levelElementsNode.Walls[wallArrayCounter] = tmpWallStructure;
                wallArrayCounter++;

                // Door
            }
            else if (levelElement is Door)
            {
                // We have to use a string here, because the serialization framework converts the enum entries to integer numbers otherwise.
                // A door can only have two states: horizontal or vertical.
                string doorRotation;
                if (levelElement.transform.localEulerAngles.z == 90.0F)
                {
                    doorRotation = "HORIZONTAL";
                }
                else
                {
                    doorRotation = "VERTICAL";
                }

                JsonDoorStructure tmpDoorStructure = new JsonDoorStructure {
                    Position = new JsonIntPositionStructure(levelElement.Pos.x, levelElement.Pos.y),
                    Rotation = doorRotation
                };
                levelElementsNode.Doors[doorArrayCounter] = tmpDoorStructure;
                doorArrayCounter++;

                // EndZone
            }
            else if (levelElement is EndZone)
            {
                JsonEndZoneStructure endZone = new JsonEndZoneStructure {
                    Position = new JsonIntPositionStructure(levelElement.getActualPosition().x - 1, levelElement.getActualPosition().y - 1)
                };
                levelElementsNode.EndZones[endZoneArrayCounter] = endZone;
                endZoneArrayCounter++;
            }
        }


        ////////////////////////////////////////////////////////////////////////
        //////////////////////////// Level Items ///////////////////////////////
        ////////////////////////////////////////////////////////////////////////

        // Filter weapons.
        IList <Weapon> weapons = new List <Weapon>();

        foreach (Item item in levelItems)
        {
            if (item is Weapon)
            {
                weapons.Add((Weapon)item);
            }
        }


        IList <Weapon> weaponsToSerialize = new List <Weapon>();

        for (int i = 0; i < weapons.Count; i++)
        {
            Weapon weapon = weapons[i];

            if (weapon != null)
            {
                string weaponType = getWeaponTypeByObject(weapon);
                weaponsToSerialize.Add(weapon);
            }
        }

        if (Player.instance.Weapon != null)
        {
            string weaponType = getWeaponTypeByObject(Player.instance.Weapon);
            playerNode.WeaponType = weaponType;
            playerNode.Amount     = Player.instance.Weapon.GetAmmo();
        }

        // Create new node for level items.
        JsonLevelItemStructure levelItemsNode = new JsonLevelItemStructure {
            Weapons = new JsonWeaponStructure[weaponsToSerialize.Count]
        };

        for (int i = 0; i < weaponsToSerialize.Count; ++i)
        {
            Weapon weapon     = weaponsToSerialize[i];
            string weaponType = getWeaponTypeByObject(weapon);

            JsonWeaponStructure jsonWeaponStructure = new JsonWeaponStructure {
                Position = new JsonFloatPositionStructure(weapon.getActualPosition().x, weapon.getActualPosition().y),
                Rotation = weapon.transform.rotation.x,
                Type     = weaponType,
                Ammount  = weapon.GetAmmo()
            };

            levelItemsNode.Weapons[i] = jsonWeaponStructure;
        }

        ////////////////////////////////////////////////////////////////////////
        //////////////////////////// Enemies ///////////////////////////////////
        ////////////////////////////////////////////////////////////////////////

        JsonEnemyStructure[] enemyDataArr = new JsonEnemyStructure[enemies.Count];

        for (int i = 0; i < enemies.Count; ++i)
        {
            Enemy tmpEnemy = enemies[i];

            // Create a list of JsonFloatPositionStructure for the patrol points.
            int patrolPointCounter = 0;
            JsonFloatPositionStructure[] patrolPoints = new JsonFloatPositionStructure[tmpEnemy.PatrolPoints.Count];
            foreach (Vector2 patrolPoint in tmpEnemy.PatrolPoints)
            {
                JsonFloatPositionStructure jsonPatrolPoint = new JsonFloatPositionStructure(patrolPoint.x, patrolPoint.y);
                patrolPoints[patrolPointCounter] = jsonPatrolPoint;
                patrolPointCounter++;
            }
            ;


            string weaponType = null;
            int    amount     = 0;
            if (tmpEnemy.Weapon != null)
            {
                weaponType = getWeaponTypeByObject(tmpEnemy.Weapon);
                amount     = tmpEnemy.Weapon.GetAmmo();
            }

            JsonEnemyStructure enemyNode = new JsonEnemyStructure {
                Position     = new JsonFloatPositionStructure((float)Math.Round(tmpEnemy.getActualPosition().x, 2), (float)Math.Round(tmpEnemy.getActualPosition().y, 2)),
                Type         = tmpEnemy.Type.ToString(),
                PatrolPoints = patrolPoints,
                WeaponType   = weaponType,
                Amount       = amount
            };

            enemyDataArr[i] = enemyNode;
        }



        levelNode.LevelElements = levelElementsNode;
        levelNode.LevelItems    = levelItemsNode;
        levelNode.Enemies       = enemyDataArr;
        levelNode.Player        = playerNode;

        string jsonString = JsonConvert.SerializeObject(levelNode);

        System.IO.File.WriteAllText(pathToSave, jsonString);
    }