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:

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:

Al lío

Creo que entonces tenemos un modelo como este

Drawing canvas

Agente

Lo definimos a partir de un mapa de nodos:

Drawing canvas

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 f(Mp), donde f es la función de progresión y Mp es el marcador de progresión, una estadística externa que determina el punto de la progresión.

Un ejemplo:

Efecto

Cualquier acción que realizen dos agentes y modifique el estado del combate.

Pueden:

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