2025-03-19_10.57 Modelo de datos Progpoint
Partimos de la definición de (Osborn.J et al, 2023) para sistemas de combate. En el, se determina que hay sistema de combate cuando:
- Hay un espacio en el que varios agentes intercambian acciones violentas o no violentas entre ellos
- Hay una manera de determinar qué acciones posee un agente, las condiciones para su efectividad, y la cuantificación de esa efectividad
- Efectos observables de todas las acciones de combate, que son visibles para, al menos, el agente iniciador y el agente objetivo
- Circunstancias por las que los agentes entran o salen de la pelea y condiciones de final de combate.
p
De aquí podemos sacar un par de elementos primarios:
- Agente: Personajes que combaten, los enemigos, todos aquellos que combatan dentro del sistema.
- Acción: Las posibilidades que tienen los agentes de interactuar con el combate.
- Efecto: El resultado de una acción realizada por un personaje a otro personaje (o varios).
- Estadística: Valor que determina la efectividad de todas las acciones de todos los personajes, y las consecuencias de los efectos.
Ahora, cómo atamos esto a los sistemas de progresión?
Pongamos el caso de Honkai: Star Rail, que tiene un sistema de combate por turnos bastante simplificado (es un gacha, no le da la vida para más).
Cada actor (en este caso, personajes y enemigos), tienen unas estadísticas base:
HP:
DEF:
ATK:
SPD:
Max Energy:
Energy Regeneration Rate:
CRIT Rate:
CRIT DMG:
Elemental Boost:
Elemental Res
Effect Res:
Effect Hit Rate:
Break Effect:
Los personajes sacan estas estadísticas de varios sitios distintos:
De sitios permanentes:
- Nivel de personaje
- Cono de Luz
- Trazas
- Reliquias
De sitios temporales - Efectos de otros personajes
- Efectos de LC’s / Reliquias
Al lío
Creo que entonces tenemos un modelo como este
Agente
Lo definimos a partir de un mapa de nodos:
- A la izquierda, conectarás estadísticas
- Creadas previamente en la ventana de Estadísticas
- Les asignarás una Progresión específica (distintos actores pueden tener progresiones de la misma estadística) con nodos a su izquierda
Entonces la clase Agente se vería algo como esto:
class Agent:
//la id de agente. define al tipo de agente, y los efectos la usan para determinar los objetivos viables.
string agentID;
StatInstance[] stats;
// El archivo JSON que guarda el mapa de ondos de React Flow. Se modifica y guarda cada vez que React Flow cambia.
JSON nodes;
JSON edges;
void addNewStat (Stat stat){
stats.add(stat.CreateNewInstance())
}
Estadística
Esto quiero que se vea como una interfaz para una progresión. La idea es que los efectos modifican las estadísticas, y el número máximo en ese momento se saca a partir de la progresión.
La progresión es la que se encarga de darle el valor actual (máximo/total/lo que sea) y los efectos interactúan con ellos a partir de ello.
Una estadística podría no tener ninguna progresión, y ser modificada a partir de los efectos ej. Experiencia.
En código, la clase Estadística sería:
class Stat{
//determina si se puede aumentar o reducir (como la HP, por ejemplo)
bool isMutable;
//determina si se actualiza el valor mutable al modificarse el valor maximo (como subir de nivel en los FF's)
bool updateMutableOnTotalChange;
//no sé si tendremos estadísticas booleanas, pero por el momento se queda así
//el valor actual mutable de la stat
int mutableValue;
//el valor máximo de la stat, modificado por Progressions;
int maxValue;
void changeMutableValue() {
}
}
// La clase de los objetos que tendrán los Agent. Mantiene los valores de las estadísticas actuales y los valores mutables en el simulador de combate
class StatInstance{
//Si la clase es llevada por alguna progresión, estará referenciada en este array.
//Se actualiza cada vez que en el flow se conecta alguna Progresión.
Progression[] progressionReferences;
Stat stat;
//el valor actual mutable de la stat
int mutableValue;
//el valor máximo de la stat, modificado por Progressions;
int maxValue;
void updateMaxValue(){
int newMaxValue = 0;
for each (Progression p : ProgressionReferences) {
newMaxValue += p.getCalc();
}
maxValue = newMaxValue;
if (mutableValue && updateMutableOnTotalChange) mutableValue = newMaxValue;
}
}
Progresión
Le dan valor a las estadísticas por medio de una función matemática.
La función de progresión viene dada por la forma
Un ejemplo:
-
Estadística: HP
-
( ) = / sqrt( ) -
= Nivel del actor.
Efecto
Cualquier acción que realizen dos agentes y modifique el estado del combate.
Pueden:
- Añadir condiciones a un agente
- Modificar variables mutables
React Flow y el modelo de datos
Cada Agente será representado por un mapa de nodos, como el ejemplo de #Agente. De fondo, tendremos un ProjectManager y los objetos de todos los agentes, estadísticas, progresiones y efectos. React Flow se encargará de actualizar las referencias de cada objeto a medida que el usuario añada conexiones y nodos al agente. Los objetos estadísticas, progresión y efectos funcionarán con forms y editores más convencionales, y podrás editarlos dentro del flow, abriendo la pantalla correspondiente.
Para las curvas de progresión, tendremos una calculadora de funciones matemáticas, utilizando react-math-calc