Gorun Gork Project

En esta sección se atenderán las dudas relacionadas con sistemas de gestión de la calidad, procedimientos, buenas prácticas, normas y todo lo relacionado con aseguramiento de la calidad

Moderator: julianmartinez16

User avatar
Garnable
Posts: 33
Joined: Mon Jan 22, 2018 11:25 am

Re: Gorun Gork Project

Post by Garnable » Thu Mar 01, 2018 6:21 pm

Sprint Semana 6: Jueves 01/03 a Jueves 08/03
- Programar los comandos que faltan y que necesitemos [2]
- Programar el uso de los diferentes objetos [2]
- Implementar el diseño de la historia/niveles dentro del prototipo [2]
- Diseño de NPCs [5]
- Diseño de Quests [5]
Total de esfuerzo de este sprint: 16


¿Qué hemos hecho?
- Se abortó la lectura sobre el analizador sintáctico
- Se pasó la arquitectura de software de papel a un programa en pc, y se actualizó al prototipo actual.
- Se cambió el diseño del sistema de comandos a uno simplificado.
- Se implementaron los comandos Ir, Coger, Usar, Examinar e Inventario.
- Se hizo el documento de diseño de creación de personajes
- Se eligió la tipografía a usar

¿Qué vamos a hacer?
Para este lunes:
- Implementar los comandos Tirar y Decir.
- Cambiar el comportamiento de los objetos.
- Iniciar la creación de NPCs y Quests

¿Qué dificultades tuvimos?
- Tuvimos que replantearnos varias facetas del juego, ya que vamos atrasados, lo cual hizo que cambiaramos el sprint en medio de la semana.


EVIDENCIAS:

- Tipografía a usar:
Image

- Documento de Creación de Personajes: https://docs.google.com/document/d/1knZ ... 6pfdys3g7v

- Arquitectura de Software actual:
Image

- Prototipo con comandos nuevos:
Image

Ckecklists:
Diseño: https://docs.google.com/spreadsheets/d/ ... sp=sharing
Código: https://docs.google.com/spreadsheets/d/ ... sp=sharing

Se puede ver el estado del Burndown Chart en: https://docs.google.com/spreadsheets/d/ ... sp=sharing

Image
Sebastián Lagoueyte Marín
000132622
Gestión de Calidad de Software
Ingeniería en Diseño de Entretenimiento Digital

User avatar
Garnable
Posts: 33
Joined: Mon Jan 22, 2018 11:25 am

Re: Gorun Gork Project

Post by Garnable » Tue Mar 06, 2018 6:34 am

Reporte perteneciente a Lunes 05 de Marzo

¿Qué hemos hecho?
- Se hizo una plantilla de creación de personajes para guionistas
. Se hizo una guía de diseño de personajes para guionistas
- Se hizo un reporte de lecturas de diseño de misiones
- Se hizo una guía narrativa de gorun gork para guinostas
- Se adelantó el progreso del prototipo haciendo el comando "decir"
- Se cambió el layout del prototipo

¿Qué vamos a hacer?
Para este jueves:
- Programar comandos que falten para este prototipo
- Cambiar el diseño de cómo funcionan los objetos
- Terminar diseño de NPCs
- Terminar diseño de misiones
- Intentaremos agregar algo de la narrativa en el juego

¿Qué dificultades tuvimos?
- El sistema actual que permite el uso de objetos fallará si lo seguimos usando, ya que solo permite un objeto de cada tipo. Hay que re-hacer todo ese código y pensar en una nueva forma de realizarlos.


EVIDENCIAS:
Reporte de lecturas:
Image

Guía narrativa:
Image

Guía de diseño de personajes:
Image

Plantilla de diseño de personajes:
Image

Ckecklists:
Diseño: https://docs.google.com/spreadsheets/d/ ... sp=sharing
Código: https://docs.google.com/spreadsheets/d/ ... sp=sharing

Se puede ver el estado del Burndown Chart en: https://docs.google.com/spreadsheets/d/ ... sp=sharing
Image
Sebastián Lagoueyte Marín
000132622
Gestión de Calidad de Software
Ingeniería en Diseño de Entretenimiento Digital

User avatar
Garnable
Posts: 33
Joined: Mon Jan 22, 2018 11:25 am

Re: Gorun Gork Project

Post by Garnable » Thu Mar 08, 2018 6:54 pm

u]Sprint Semana 7: Jueves 08/03 a Jueves 15/03[/u]
- Agregar más habitaciones basadas en la historia [2]
- Programar la creación de personajes [3]
- Diseño del mockup de interfaces gráficas [3]
- Diseño de Módulos de Equipo [1]
- Diseño de Equipamiento [3]
Total de esfuerzo de este sprint: 12


¿Qué hemos hecho?
- Completada forma modular de crear comandos.
- Completada nueva manera de manejar los objetos, arreglando bugs encontrados con anterioridad.
- Arreglado código a partir de code review.
- Arregladas checklists después de revisión.

¿Qué vamos a hacer?
Para este lunes:
- Iniciar programación de personaje genérico.
- Ver tutoriales de TextMesh y Aventura gráfica.

¿Qué dificultades tuvimos?
- Como se cambió el sistema de objetos, varios scripts tuvieron que refactorizarse.


EVIDENCIAS:

- Nueva manera de manejar objetos:
Image

- Arreglo después de code review:
Image

Ckecklists:
Diseño: https://docs.google.com/spreadsheets/d/ ... sp=sharing
Código: https://docs.google.com/spreadsheets/d/ ... sp=sharing

Se puede ver el estado del Burndown Chart en: https://docs.google.com/spreadsheets/d/ ... sp=sharing

Image
Sebastián Lagoueyte Marín
000132622
Gestión de Calidad de Software
Ingeniería en Diseño de Entretenimiento Digital

User avatar
Garnable
Posts: 33
Joined: Mon Jan 22, 2018 11:25 am

Re: Gorun Gork Project

Post by Garnable » Mon Mar 12, 2018 9:16 pm

¿Qué hemos hecho?
- Se hizo el diseño del sistema de progresión de los personajes.
- Se creó la arquitectura de software de la creación de personajes.
- Se diseñó los modulos de equipo.
- Inicios de implementación de creación de personajes.
- Inicios de creación del mundo dentro del juego.

¿Qué vamos a hacer?
Para este jueves:
- Terminar de implementarla creación de personajes.
- Terminar de implementar el mundo de juego.
- Finalizar mockup de interfaces.

¿Qué dificultades tuvimos?
- Problemas personales el fin de semana.


EVIDENCIAS:
Modulo de equipo: Image

Arquitectura de software: Image

Progresión de personajes: Image

Ckecklists:
Diseño: https://docs.google.com/spreadsheets/d/ ... sp=sharing
Código: https://docs.google.com/spreadsheets/d/ ... sp=sharing

Se puede ver el estado del Burndown Chart en: https://docs.google.com/spreadsheets/d/ ... sp=sharing
Image
Sebastián Lagoueyte Marín
000132622
Gestión de Calidad de Software
Ingeniería en Diseño de Entretenimiento Digital

User avatar
Garnable
Posts: 33
Joined: Mon Jan 22, 2018 11:25 am

Re: Gorun Gork Project

Post by Garnable » Thu Mar 15, 2018 5:38 pm

Sprint Semana 8: Jueves 15/03 a Jueves 22/03
- Programar una forma en que las habitaciones creadas se puedan ver en un GUI [2]
- Refactorizar código para Code Review [1]
- Reestructurar diagramas para Code Review [1]
- Revisar diseño de misiones [2]
- Terminar tutorial de Juego de Texto [3]
- Terminar mockups [2]
Total de esfuerzo de este sprint: 11


¿Qué hemos hecho?
- Creada manera de crear un personaje
- Ahora al crear el personaje se le asigna un nombre, un género, y una raza.

¿Qué vamos a hacer?
Para este lunes:
- Tener una manera de visualizar las habitaciones creadas.

¿Qué dificultades tuvimos?
- Los guionistas que se supone nos ayudarán con el diseño de la historia/personajes no están respondiendo de la manera que esperabamos.


EVIDENCIAS:

- Creación de personaje:
Image

Code: Select all

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[CreateAssetMenu(menuName = "Gorun Gork/Room Responses/Character Creation")]
public class CharacterCreationResponse : RoomResponse {

    public Race[] possibleRaces;

    [TextArea] [SerializeField] private string selectRaceText;
    [TextArea] [SerializeField] private string selectGenderText;
    [TextArea] [SerializeField] private string selectNameText;
    [TextArea] [SerializeField] private string endCreationText;

    private GameController gameController;

    private bool raceSelected = false;
    private bool genderSelected = false;
    private bool nameGiven = false;
    private bool isAskingForConfirmation = false;

    private int tempRaceCode = -1;
    private string tempInput = "";

    public override void TriggerResponse(GameController controller)
    {
        raceSelected = false;
        genderSelected = false;
        nameGiven = false;
        isAskingForConfirmation = false;

        base.TriggerResponse(controller);
        gameController = controller;
        gameController.LogStringAfterRoom(selectRaceText);
    }

    public void AcceptInput(string[] input)
    {
        if (!raceSelected)
        {
            if (!isAskingForConfirmation)
            {
                if (input[0] == "preguntar")
                {
                    gameController.LogStringWithReturn(AskForRaceDescription(input[1]));
                }
                if (input.Length > 1)
                {
                    if (input[1] == "preguntar" && input[0] != "preguntar")
                    {
                        gameController.LogStringWithReturn(AskForRaceDescription(input[0]));
                    }
                }
                else
                {
                    InputPlayerRace(input[0]);
                }
            }
            else
            {
                if (AskForConfirmation(input[0]))
                {
                    Race newRace = possibleRaces[tempRaceCode];
                    gameController.playerManager.SelectRace(newRace);
                    gameController.LogStringWithReturn("Ahora eres un " + newRace.keyword);

                    raceSelected = true;

                    gameController.LogStringWithReturn(selectGenderText);
                }
                else
                {
                    gameController.LogStringWithReturn("Trata de volver a indicar la raza que deseas ser:");
                }
            }
        }
        else if (!genderSelected)
        {
            if (!isAskingForConfirmation)
            {
                InputPlayerGender(input[0]);
            }
            else
            {
                if (AskForConfirmation(input[0]))
                {
                    gameController.playerManager.gender = tempInput;
                    gameController.LogStringWithReturn("Renaceras como " + tempInput);

                    genderSelected = true;

                    gameController.LogStringWithReturn(selectNameText);
                }
                else
                {
                    gameController.LogStringWithReturn("Trata de volver a indicar el género que deseas ser:");
                }
            }
        }
        else if (!nameGiven)
        {
            if (!isAskingForConfirmation)
            {
                InputPlayerName(input[0]);
            }
            else
            {
                if (AskForConfirmation(input[0]))
                {
                    gameController.playerManager.playerName = tempInput;
                    gameController.LogStringWithReturn("Tu nombre es " + tempInput);

                    nameGiven = true;

                    gameController.LogStringWithReturn(endCreationText);
                }
                else
                {
                    gameController.LogStringWithReturn("Trata de volver a indicar el nombre que deseas tener:");
                }
            }
        }
        else
        {
            EndResponse();
        }

    }



    private void InputPlayerRace(string raceName)
    {
        for (int i = 0; i < possibleRaces.Length; i++)
        {
            if (raceName == possibleRaces[i].keyword)
            {
                tempInput = raceName;
                tempRaceCode = i;
                gameController.LogStringWithReturn("¿Estás seguro de querer ser un " + raceName + "?");
                isAskingForConfirmation = true;
                return;
            }
        }

        gameController.LogStringWithReturn("La raza " + raceName 
            + " no está disponible en el sistema. Por favor, elige una de las razas disponibles");
    }

    private string AskForRaceDescription(string raceName)
    {
        for (int i = 0; i < possibleRaces.Length; i++)
        {
            if (raceName == possibleRaces[i].keyword)
            {
                return possibleRaces[i].raceDescription;
            }
        }

        return "La raza " + raceName + " no está disponible en el sistema. " +
            "Por favor, pregunta por una de las razas disponibles";

    }


    private void InputPlayerGender(string playerGender)
    {
        if (playerGender == "macho" || playerGender == "m")
        {
            isAskingForConfirmation = true;
            tempInput = "macho";
            gameController.LogStringWithReturn("Has elegido renacer como macho. ¿Estás seguro?");
            return;
        }
        if (playerGender == "hembra" || playerGender == "h")
        {
            isAskingForConfirmation = true;
            tempInput = "hembra";
            gameController.LogStringWithReturn("Has elegido renacer como hembra. ¿Estás seguro?");
            return;
        }

        gameController.LogStringWithReturn("No se ha detectado el género " + playerGender + ". " +
            "En el sistema existen Macho(m) y Hembra(h).");

    }

    private void InputPlayerName(string playerName)
    {
        tempInput = playerName;
        gameController.LogStringWithReturn("Tu nombre a partir de ahora será \"" 
            + playerName
            + "\". ¿Quieres vivir con este nombre el resto de tu existencia?"
            );
        isAskingForConfirmation = true;
    }



    private bool AskForConfirmation(string playerResponse)
    {
        if (playerResponse == "si" || playerResponse == "s")
        {
            isAskingForConfirmation = false;
            return true;
        }
        else if (playerResponse == "no" || playerResponse == "n")
        {
            isAskingForConfirmation = false;
            return false;
        }
        else
        {
            isAskingForConfirmation = false;
            gameController.LogStringWithReturn("No se ha detectado respuesta SI/NO. Reiniciando.");
            return false;
        }
    }

    private void EndResponse()
    {
        GameState.Instance.ChangeCurrentState(GameState.GameStates.exploration);
        gameController.playerRoomNavigation.AttemptToChangeRooms(
            gameController.playerRoomNavigation.currentRoom.exits[0].myKeyword);
    }
}
Ckecklists:
Diseño: https://docs.google.com/spreadsheets/d/ ... sp=sharing
Código: https://docs.google.com/spreadsheets/d/ ... sp=sharing

Se puede ver el estado del Burndown Chart en: https://docs.google.com/spreadsheets/d/ ... sp=sharing
Image
Sebastián Lagoueyte Marín
000132622
Gestión de Calidad de Software
Ingeniería en Diseño de Entretenimiento Digital

User avatar
Garnable
Posts: 33
Joined: Mon Jan 22, 2018 11:25 am

Re: Gorun Gork Project

Post by Garnable » Mon Mar 19, 2018 8:28 pm

¿Qué hemos hecho?
- Se creó sistema para ver habitaciones

¿Qué vamos a hacer?
Para este jueves:
- Refactorizar código para code review.
- Reestructurar diagramas para code review.
- Revisar diseño de misiones
- Terminar tutorial de Juego de Texto
- Terminar mockups

¿Qué dificultades tuvimos?
- El sistema para ver habitaciones tomó más tiempo del esperado.
- [02 de Abril] Se tuvo un error al realizar el sprint de este dia y por error se cambió el post de este día. Ya debería estar similar a cómo estaba antes.


EVIDENCIAS:

Habitaciones visibles:
Image


Ckecklists:
Diseño: https://docs.google.com/spreadsheets/d/ ... sp=sharing
Código: https://docs.google.com/spreadsheets/d/ ... sp=sharing

Se puede ver el estado del Burndown Chart en: https://docs.google.com/spreadsheets/d/ ... sp=sharing
Image
Last edited by Garnable on Mon Apr 02, 2018 9:19 pm, edited 2 times in total.
Sebastián Lagoueyte Marín
000132622
Gestión de Calidad de Software
Ingeniería en Diseño de Entretenimiento Digital

User avatar
Garnable
Posts: 33
Joined: Mon Jan 22, 2018 11:25 am

Re: Gorun Gork Project

Post by Garnable » Thu Mar 22, 2018 10:21 am

Sprint Semana 9: Jueves 22/03 a Jueves 29/03
- Implementar Combate [8]
- Revisar diseño de misiones [2]
- Terminar tutorial de Juego de Texto [3]
- Terminar mockups [2]
Total de esfuerzo de este sprint: 15


¿Qué hemos hecho?
- Se arregló el código para que cumpliera completamente con los parámetros de los checklists revisados.
- Se arreglaron y crearon diagramas para que cumplieran completamente con los parámetros de los checklists revisados.
- Se arregló uno que otro bug pequeño.

¿Qué vamos a hacer?
Para este lunes:
- Se espera implementar el combate de forma visual, es decir, que se pueda "entrar" en combate.

¿Qué dificultades tuvimos?
- Juan José????


EVIDENCIAS:

-Diagrama de casos de uso nuevo:
Image

-El código corregido puede verse en nuestro repositorio. Lo más notable son las descripciones de las clases:
https://github.com/Garnll/GorunGorkText ... ts/Scripts

Ckecklists:
Diseño: https://docs.google.com/spreadsheets/d/ ... sp=sharing
Código: https://docs.google.com/spreadsheets/d/ ... sp=sharing

Se puede ver el estado del Burndown Chart en: https://docs.google.com/spreadsheets/d/ ... sp=sharing
Image
Sebastián Lagoueyte Marín
000132622
Gestión de Calidad de Software
Ingeniería en Diseño de Entretenimiento Digital

User avatar
Garnable
Posts: 33
Joined: Mon Jan 22, 2018 11:25 am

Re: Gorun Gork Project

Post by Garnable » Thu Mar 29, 2018 9:03 pm

Sprint Semana 10: Jueves 29/03 a Jueves 05/04
- Implementar Habilidades [3]
- Implementar Estados de Personajes [2]
- Iniciar implementación de IA [2]
- Revisar diseño de misiones [2]
- Terminar mockups [2]
Total de esfuerzo de este sprint: 11


¿Qué hemos hecho?
- Se implementó una funcionalidad extra a las salidas.
- Se le implementó una funcionalidad que faltaba a los objetos de las habitaciones.
- Se implementó visualmente el combate.
- Se implementaron varias funciones esenciales del combate, incluyendo entrada y salida de este.

¿Qué vamos a hacer?
Para este lunes:
- Se espera tener habilidades implementadas.
- Se espera tener una IA mediocre funcionando.

¿Qué dificultades tuvimos?
- 2 días que el programador se tomó de vacaciones?


EVIDENCIAS:

- Combate:
Image

Ckecklists:
Diseño: https://docs.google.com/spreadsheets/d/ ... sp=sharing
Código: https://docs.google.com/spreadsheets/d/ ... sp=sharing

Se puede ver el estado del Burndown Chart en: https://docs.google.com/spreadsheets/d/ ... sp=sharing
Image
Sebastián Lagoueyte Marín
000132622
Gestión de Calidad de Software
Ingeniería en Diseño de Entretenimiento Digital

User avatar
Garnable
Posts: 33
Joined: Mon Jan 22, 2018 11:25 am

Re: Gorun Gork Project

Post by Garnable » Mon Apr 02, 2018 9:06 pm

¿Qué hemos hecho?
- Se implementó el sistema de Estados del Personaje, con casis todos los estados diseñados funcionando.
- Se implementó el sistema de Habilidades, con casis todas las habilidades funcionando como están planteadas en el diseño.
- Se implementó un sistema de IA para los combates, que puede ser modificada según la necesidad.

¿Qué vamos a hacer?
Para este jueves:
- Hacer que aparezcan máximo 4 enemigos por habitación.
- Visualizar minimapa.
- Añadir habitaciones para poder probar el juego como tal.
- Revisar diseño de misiones.
- Terminar mockups.

¿Qué dificultades tuvimos?
- Ninguna que atrasara el proceso.


EVIDENCIAS:

Estados de Batalla y Habilidades:
Image

IA:

Code: Select all

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// La IA de todo EnemyNPC. Requiere estar en un prefab.
/// </summary>
public class EnemyNPCAI : MonoBehaviour {

    public enum EnemyMode
    {
        Defensive,
        Aggresive,
        Balanced,
        Afraid
    }

    public enum EnemyStates
    {
        Wait,
        Attack,
        Reposition,
        UseHighHability,
        UseMidHability,
        UseLowerHability,
        Escape
    }

    [HideInInspector] public EnemyNPC myNPC;
    [HideInInspector] public PlayerManager player;

    public EnemyMode defaultMode;
    [Space(10)]
    [Range(10, 100)] public float lifeThreshold1 = 50;
    [Range(0, 90)] public float lifeThreshold2 = 25;
    [Range(0, 30)] public float lifeThreshold3 = 0;
    [Space(5)]
    [Range(0.01f, 5)] public float timeBetweenIterations = 0.5f;
    [Space(5)]
    [Range(10, 100)] public float turnThreshold1 = 100;
    [Range(0, 90)] public float turnThreshold2 = 50;
    [Range(0, 30)] public float turnThreshold3 = 0;
    [Space(5)]
    [Range(0, 1)] public float chanceOfChangingMode = 0.3f;

    protected bool isActive = false;
    protected EnemyMode currentMode;
    protected EnemyStates currentState;

    protected List<bool> habilitiesReady = new List<bool>();

    protected float playerHealthPercent;
    protected float playerTurnPercent;
    protected float npcHealthPercent;
    protected float npcTurnPercent;


    public void StartAI()
    {

        isActive = true;
        currentMode = defaultMode;

        StopCoroutine(WaitBetweenIterations(timeBetweenIterations));
        StartCoroutine(WaitBetweenIterations(timeBetweenIterations));
    }

    public void StopAI()
    {
        isActive = false;
        currentMode = defaultMode;
        StopCoroutine(WaitBetweenIterations(timeBetweenIterations));
    }

    public IEnumerator WaitBetweenIterations(float howMuchTime)
    {
        while (isActive)
        {
            yield return new WaitForSecondsRealtime(howMuchTime);
            AnalizeSituation();
        }
    }

    public void AnalizeSituation()
    {
        if (myNPC.currentTurn < myNPC.myTemplate.MaxTurn)
        {
            currentState = EnemyStates.Wait;
            return;
        }

        CheckHabilities();

        playerHealthPercent = (player.currentHealth / player.MaxHealth) * 100;
        playerTurnPercent = (player.currentTurn / player.MaxTurn) * 100;

        npcHealthPercent = (myNPC.currentHealth / myNPC.myTemplate.MaxHealth) * 100;
        npcTurnPercent = (myNPC.currentTurn / myNPC.myTemplate.MaxTurn) * 100;


        float r = Random.Range(0f, 1f);

        if (r <= chanceOfChangingMode && currentMode == defaultMode)
        {
            switch (currentMode)
            {
                case EnemyMode.Aggresive:
                    if (npcHealthPercent < lifeThreshold3)
                    {
                        currentMode = EnemyMode.Afraid;
                    }
                    else if (npcHealthPercent < lifeThreshold2)
                    {
                        currentMode = EnemyMode.Defensive;
                    }
                    else if (npcHealthPercent < lifeThreshold1)
                    {
                        currentMode = EnemyMode.Balanced;
                    }
                    break;


                case EnemyMode.Defensive:
                    if (npcHealthPercent < lifeThreshold3)
                    {
                        currentMode = EnemyMode.Aggresive;
                    }
                    else if (npcHealthPercent < lifeThreshold2)
                    {
                        currentMode = EnemyMode.Balanced;
                    }
                    else if (npcHealthPercent < lifeThreshold1)
                    {
                        currentMode = EnemyMode.Afraid;
                    }

                    break;


                case EnemyMode.Balanced:
                    if (playerTurnPercent > turnThreshold1)
                    {
                        currentMode = EnemyMode.Defensive;
                    }
                    else if (playerTurnPercent > turnThreshold2)
                    {
                        currentMode = EnemyMode.Aggresive;
                    }
                    else if (npcHealthPercent < lifeThreshold2)
                    {
                        currentMode = EnemyMode.Afraid;
                    }
                    break;


                case EnemyMode.Afraid:
                    if (playerHealthPercent < lifeThreshold3)
                    {
                        currentMode = EnemyMode.Aggresive;
                    }
                    else if (playerHealthPercent < lifeThreshold2)
                    {
                        currentMode = EnemyMode.Balanced;
                    }
                    else if (playerHealthPercent < lifeThreshold1)
                    {
                        currentMode = EnemyMode.Defensive;
                    }
                    break;
            }
        }
        else
        {
            currentMode = defaultMode;
        }

        switch (currentMode)
        {
            case EnemyMode.Aggresive:
                if (npcHealthPercent < lifeThreshold3)
                {
                    currentState = EnemyStates.Reposition;
                }
                else if (playerHealthPercent < lifeThreshold3)
                {
                    if (habilitiesReady.Count > 2)
                    {
                        currentState = EnemyStates.UseHighHability;
                    }
                    else
                    {
                        currentState = EnemyStates.Attack;
                    }
                }
                else
                {
                    currentState = EnemyStates.Attack;
                }
                break;


            case EnemyMode.Defensive:
                if (playerTurnPercent < turnThreshold3)
                {
                    currentState = EnemyStates.Attack;
                }
                else if (playerTurnPercent < turnThreshold2 || npcHealthPercent > lifeThreshold2)
                {
                    if (habilitiesReady.Count > 0)
                    {
                        currentState = EnemyStates.UseLowerHability;
                    }
                    else
                    {
                        currentState = EnemyStates.Attack;
                    }
                }
                else
                {
                    currentState = EnemyStates.Reposition;
                }
                break;


            case EnemyMode.Balanced:
                if (npcHealthPercent > playerHealthPercent)
                {
                    if (habilitiesReady.Count > 1)
                    {
                        currentState = EnemyStates.UseMidHability;
                    }
                    else
                    {
                        currentState = EnemyStates.Attack;
                    }
                }
                if (playerHealthPercent < lifeThreshold1 || playerTurnPercent < turnThreshold2)
                {
                    currentState = EnemyStates.Attack;
                }
                else if (npcHealthPercent < lifeThreshold3)
                {
                    currentState = EnemyStates.Escape;
                }
                else if (npcHealthPercent < lifeThreshold2 || playerTurnPercent > turnThreshold1)
                {
                    currentState = EnemyStates.Reposition;
                }
                else
                {
                    int r2 = Random.Range(1, 4);
                    if (r2 == 1)
                    {
                        currentState = EnemyStates.Attack;
                    }
                    else if (r2 == 2)
                    {
                        currentState = EnemyStates.Reposition;
                    }
                    else
                    {
                        if (habilitiesReady.Count > 0)
                        {
                            currentState = EnemyStates.UseLowerHability;
                        }
                        else
                        {
                            currentState = EnemyStates.Attack;
                        }
                    }
                }
 
                break;


            case EnemyMode.Afraid:
                if (playerTurnPercent < turnThreshold3 && npcHealthPercent > playerHealthPercent)
                {
                    int r1 = Random.Range(1, 4);
                    if (r1 == 1)
                    {
                        currentState = EnemyStates.Attack;
                    }
                    else
                    {
                        if (habilitiesReady.Count > 0)
                        {
                            currentState = EnemyStates.UseLowerHability;
                        }
                        else
                        {
                            currentState = EnemyStates.Attack;
                        }
                    }
                }
                else if (myNPC.myTemplate.EscapeProbability(myNPC, player) > 0)
                {
                    currentState = EnemyStates.Escape;
                }
                else
                {
                    currentState = EnemyStates.Reposition;
                }
                break;
        }

        RealizeAction();
    }


    public void RealizeAction()
    {
        switch (currentState)
        {
            case EnemyStates.Attack:
                myNPC.AttackInCombat(player);
                break;

            case EnemyStates.Reposition:
                myNPC.RepositionInCombat();
                break;

            case EnemyStates.Escape:
                myNPC.TryToEscape(player);
                break;

            case EnemyStates.UseLowerHability:
                if (habilitiesReady[0])
                {
                    //myNPC.myTemplate.habilities[0].ImplementHability(myNPC, player);
                }
                else
                {
                    myNPC.AttackInCombat(player);
                }
                break;

            case EnemyStates.UseMidHability:
                if (habilitiesReady[1])
                {
                    //myNPC.myTemplate.habilities[1].ImplementHability(myNPC, player);
                }
                else
                {
                    myNPC.AttackInCombat(player);
                }
                break;

            case EnemyStates.UseHighHability:
                if (habilitiesReady[2])
                {
                    //myNPC.myTemplate.habilities[2].ImplementHability(myNPC, player);
                }
                else
                {
                    myNPC.AttackInCombat(player);
                }
                break;
        }
    }

    public void CheckHabilities()
    {
        habilitiesReady.Clear();
        for (int i = 0; i < myNPC.myTemplate.habilities.Length; i++)
        {
            habilitiesReady.Add(myNPC.myTemplate.habilities[i].isAvailable);
        }
    }
}

Ckecklists:
Diseño: https://docs.google.com/spreadsheets/d/ ... sp=sharing
Código: https://docs.google.com/spreadsheets/d/ ... sp=sharing

Se puede ver el estado del Burndown Chart en: https://docs.google.com/spreadsheets/d/ ... sp=sharing
Image
Sebastián Lagoueyte Marín
000132622
Gestión de Calidad de Software
Ingeniería en Diseño de Entretenimiento Digital

User avatar
Garnable
Posts: 33
Joined: Mon Jan 22, 2018 11:25 am

Re: Gorun Gork Project

Post by Garnable » Thu Apr 05, 2018 9:51 pm

Sprint Semana 11: Jueves 05/04 a Jueves 12/04
- Diseñar objetos dentro de la narrativa [3]
- Programar objetos consumibles [2]
- Diseñar interacción entre el mundo y el jugador [3]
- Programar interacción entre el mundo y el jugador [3]
Total de esfuerzo de este sprint: 11


¿Qué hemos hecho?
- Se han hechos tests del juego en varios aspectos (combate, objetos y narrativa)
- Se han arreglado bugs varios
- Se han complementado tareas ya existentes, como objetos, habitaciones, enemigos


¿Qué vamos a hacer?
Para este lunes:
- Se tendrá el minimapa creado
- Se incluirá más contenido de la historia dentro del juego
- Creación de objetos consumibles


¿Qué dificultades tuvimos?
- Problemas personales durante un par de dias
- No se avanzó en el "Sprint", porque las tareas que se tuvieron que hacer no estaban contempladas dentro del Stack de la semana.

EVIDENCIAS:

Objetos:

Code: Select all

using Sirenix.OdinInspector;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// Contiene las keywords de cada objeto que se le agregue desde el inspector.
/// Si no se le agrega desde alli, el objeto no existe.
/// </summary>
[ExecuteInEditMode]
public class ItemKeywordHandler : SerializedMonoBehaviour {

    public List<InteractableObject> interactableObjects = new List<InteractableObject>();

    public Dictionary<string, List<InteractableObject>> itemKeywordDictionary = 
        new Dictionary<string, List<InteractableObject>>();

    /// <summary>
    /// Recibe un sustantivo, y detecta si este corresponde a un keyword de objeto.
    /// Si asi es, envía la lista de los objetos con esa misma keyword.
    /// </summary>
    /// <param name="noun"></param>
    /// <returns></returns>
    public InteractableObject[] GetObjectWithNoun(string noun)
    {
        if (itemKeywordDictionary.ContainsKey(noun))
        {
            return itemKeywordDictionary[noun].ToArray();
        }

        return null;
    }

    private void Awake()
    {
        GetObjectsFromList();
    }

    public void GetObjectsFromList()
    {
        for (int i = 0; i < interactableObjects.Count; i++)
        {
            for (int f = 0; f < interactableObjects[i].nouns.Length; f++)
            {
                if (itemKeywordDictionary.ContainsKey(interactableObjects[i].nouns[f]))
                {
                    bool existsInDictionary = false;
                    for (int g = 0; g < itemKeywordDictionary[interactableObjects[i].nouns[f]].Count; g++)
                    {
                        if (itemKeywordDictionary[interactableObjects[i].nouns[f]][g] == interactableObjects[i])
                        {
                            existsInDictionary = true;
                            break;
                        }
                    }
                    if (!existsInDictionary)
                    {
                        itemKeywordDictionary[interactableObjects[i].nouns[f]].Add(interactableObjects[i]);
                    }
                }
                else
                {
                    itemKeywordDictionary.Add((interactableObjects[i].nouns[f]), 
                        new List<InteractableObject> { interactableObjects[i] });
                }
            }
        }
    }

}

Ckecklists:
Diseño: https://docs.google.com/spreadsheets/d/ ... sp=sharing
Código: https://docs.google.com/spreadsheets/d/ ... sp=sharing

Se puede ver el estado del Burndown Chart en: https://docs.google.com/spreadsheets/d/ ... sp=sharing
Image
Last edited by Garnable on Thu Apr 12, 2018 8:44 pm, edited 2 times in total.
Sebastián Lagoueyte Marín
000132622
Gestión de Calidad de Software
Ingeniería en Diseño de Entretenimiento Digital

Post Reply