Este artículo va de segregacionismo en función al nivel, un concepto que se diría que me gusta mucho marear por aquí. La verdad es que no es cierto, no me gusta en absoluto escribir de conceptos matemáticos y lógicos en artículos de blog porque me requieren una cantidad de espacio que no es bueno ocupar. Es un tema que de hecho he tocado mejor en conferencias, pero en fin, alguna vez tenía que hacerlo.
Hay que decir que aunque este es un tema muy presente en mi pensamiento (supongo que se notará en el artículo que he pensado en ello) en esta ocasión ha venido despertado por un comentario de un contertulio rolero en la red social de moda. No contesté ahí porque no me parecía que fuera el lugar adecuado, y porque tengo malas experiencias últimamente en hilos ajenos donde terceras personas me buscan las cosquillas.
El comentario en cuestión venía a decir que todos los juegos en los que hay sensación de progreso se crea esa situación en la que hay que los enemigos tienen que elegirse adecuadamente para el nivel del personaje. Una observación que entiendo y comparto en parte. Es uno de los motivos por los que me pareció que era oportuno crear un sistema que no tuviera esa característica, sino que planteara un sistema de progreso sensible (muy sensible) pero en la que un enemigo fuese siempre un enemigo y tuviese siempre esa personalidad, y no fuese el “dragón con el que peleábamos hace tres niveles, y que ahora no sería necesario ni hacer el combate".
Es evidente que muchos juegos tienen aceptan la segregación en función al nivel. Es tan sencillo como mirar esas aventuras que desde la portada ya rezan “una aventura para X personajes de nivel Y a Y+2”.
Creo que no es una buena forma de hacer las cosas. Me parece que dibuja un mundo en el que la lógica no se impone, pues las razas u organizaciones lógicamente más fuertes están esperando “en otro lugar” a que los personajes estén en el nivel adecuado y vayan a enfrentarse con ellos. Esto dispara un tipo de lógica que tiene una dinámica muy aventurera, pero que para otros paradigmas puede fallar.
Recuerdo que un conocido mío lo decía de otra forma: “subes de nivel, cambia el skin de los enemigos, pero es todo el rato el mismo reto. Todo el rato el mismo juego.”
Curiosamente existe la sensación de que si no existe esta demarcación de aventuras por niveles, y este segregacionismo, entonces es que el juego no tiene un progreso ludista. Y lo cierto es que prácticamente con todo lo que he probado he coincidido con esta apreciación, y es uno de los motivos por los que defiendo que teníamos que crear un sistema nuevo que introduce algo que no había antes.
La cuestión principal era que teníamos que dibujar un mundo orgánizo en el que las sociedades y entes tuvieran unas relaciones razonables basadas en su poder, y que este no se desequilibrara rápidamente porque un individuo u colectivo tuviera “dos niveles más”, pero que aún así tuviera una resoluciones de conflicto muy ludista.
Esta necesidad nos viene de que las campañas originales de Espada Negra eran de hecho competitivas, y al menos dos grupos dirimían sus diferencias mediante el sistema de juego. También se producía mucho que aparecían nuevos jugadores que se unían a uno u otro grupo, y si se hubiera adaptado su nivel, entonces hubiera sido absolutamente injusto para el otro bando. Y por esto la dinámica de segregacionismo en función al nivel ya de por sí fracasaba.
Yo creo que hay otro entorno en el que tampoco es óptimo, y es en este concepto sandbox que tanto da que hablar hoy en día. La segregación en función al nivel tiende a hacer que la exploración tenga que adecuarse en función al nivel, y por lo tanto o se adapta como ocurre en los videojuegos, o la exploración se vuelve un poco indiferente. Es decir, no valoraremos nuestra capacidad de afrontar un reto, sino si es el reto que tenemos que afrontar dado nuestro nivel, o si tenemos más bien que regresar pasado mañana.
En el caso de los juegos en los que el progreso es tipo D&D hablamos de un progreso ni siquiera lineal, sino más bien exponencial. Según jugadores expertos a los que he consultado, el poder de un personaje se dobla aproximadamente cada dos niveles. Esto significaría, por ejemplo, que un personaje de nivel 20 podría vencer a unos 1024 personajes de nivel 1, una situación que es el segregacionismo más claro.
Pero como ya dije que este artículo iba a ser largo… vamos hacer algunas pruebas de verdad. Me voy a “inventar” un juego en el que se produce una tirada de impacto a la que se opone una dificultad que depende del oponente. Si se impacta, le va a causar un daño contra sus puntos de vida. Las variables quedarán distribuidas de la siguiente forma:
Impacto: 1D20 + Nivel. En este caso el dado “explota”, es decir, si saca 20 vuelve a tirar otro dado y lo suma.
Esquiva: 10 + Nivel
Daño: 1D10 + Nivel
Vida: 10 x Nivel
Iniciativa: 1D10 + Nivel
Además, en los niveles 6, 11 y 16 el personaje obtendrá un ataque adicional.
Todo tiene un aspecto bastante lineal, ¿no?
Pues vamos a programar un poco. En este caso la clase de personaje queda como sigue. En php, uno de los lenguajes más ineficientes para estas cosas.
class personaje
{
var $nivel;
var $bando;
var $danos;
function personaje($nivel,$bando)
{
$this->nivel=$nivel;
$this->danos=0;
$this->bando=$bando;
}
function nataques()
{
return 1+(($this->nivel-1)-($this->nivel-1)%5)/5;
}
function vida()
{
return 10*$this->nivel;
}
function EstarVivo()
{
if($this->danos>=$this->vida())
{
return false;
}
return true;
}
function impacto()
{
$m=Rand(1,20);
$ad=$m;
while($m==20)
{
$m=Rand(1,20);
$ad+=$m;
}
return $this->nivel+$ad;
}
function dano()
{
return $this->nivel+Rand(1,10);
}
function esquiva()
{
return $this->nivel+10;
}
function iniciativa()
{
return $this->nivel+Rand(1,20);
}
}
|
Y ahora vamos a simular peleas de cualquier número de personajes de los niveles que nos parezca. Tampoco es muy complejo:
class pelea
{
var $personajes;
var $bandos;
var $narrar;
function pelea()
{
$this->personajes=Array();
$this->bandos=Array();
$this->narrar=false;
}
function AddBando($id)
{
$this->bandos=Array();
}
function AddPersonaje($bando,$nivel)
{
$pers=new personaje($nivel,$bando);
$this->bandos=$pers;
$this->personajes=$pers;
}
function NumeroBandosVivos()
{
$total=0;
foreach($this->bandos as $idb=>$bando)
{
if($this->BandoVivo($idb))
{
$total++;
}
}
return $total;
}
function PrimerBandoVivo()
{
foreach($this->bandos as $idb=>$bando)
{
if($this->BandoVivo($idb))
{
return $idb;
}
}
}
function CandidatoAtacado($personaje)
{
foreach($this->bandos as $idb=>$bando)
{
if($idb!=$personaje->bando)
{
for($n=0;$bando!=null;$n++)
{
if($bando->EstarVivo())
{
return $bando;
}
}
}
}
return null;
}
function Narrar($msg)
{
if($this->narrar)
{
echo"<br>$msg";
}
}
function Pelear()
{
$this->Narrar("Comienza el combate");
for($turno=0;$this->NumeroBandosVivos()>1;$turno++)
{
$this->Narrar("<br><b>Da comienzo el turno ".($turno+1)."</b>");
$iniciativas=Array();
for($n=0;$this->personajes!=null;$n++)
{
$iniciativas=$this->personajes->iniciativa();
}
arsort($iniciativas);
foreach($iniciativas as $id=>$inic)
{
$pers=$this->personajes;
if($pers->EstarVivo())
{
$this->Narrar("<span style=&039;color:orange&039;>Tiene el turno el personaje de nivel ".($pers->nivel)." del bando ".$pers->bando." con iniciativa $inic</span>");
$nat=$pers->nataques();
for($m=0;$m<$nat;$m++)
{
$candi=$this->CandidatoAtacado($pers);
if($candi!=null)
{
$this->Narrar("Ataca a personaje de nivel ".($candi->nivel)." del bando ".$candi->bando);
$this->Ataque($pers,$candi);
}
}
}
}
}
}
function BandoVivo($bando)
{
for($n=0;$this->bandos!=null;$n++)
{
if($this->bandos->EstarVivo())
{
return true;
}
}
return false;
}
function Ataque($ofensor,$defensor)
{
$imp=$ofensor->impacto();
$def=$defensor->esquiva();
if($imp>=$def)
{
$dano=$ofensor->dano();
$defensor->danos+=$dano;
$this->Narrar("Obtiene impacto $imp, que es mayor que la esquiva $def. <br/><span style=&039;color:blue&039;>Causa $dano puntos</span>.");
if($defensor->EstarVivo())
{
$this->Narrar("<span style=&039;color:green&039;>Le quedan ".($defensor->vida()-$defensor->danos)." puntos de vida</span>");
}
else
{
$this->Narrar("<span style=&039;color:red&039;>Muere</span>");
}
}
else
{
$this->Narrar("Obtiene impacto $imp, que no es mayor que la esquiva $def.");
}
}
}
|
Ahora podemos ejecutar una pelea. Por ejemplo voy a pelear a un personaje de nivel seis contra tres personajes de nivel dos.
Comienza el combate
Da comienzo el turno 1
Tiene el turno el personaje de nivel 6 del bando personajes con iniciativa 23
Ataca a personaje de nivel 2 del bando masillas
Obtiene impacto 31, que es mayor que la esquiva 12.
Causa 14 puntos.
Le quedan 6 puntos de vida
Ataca a personaje de nivel 2 del bando masillas
Obtiene impacto 14, que es mayor que la esquiva 12.
Causa 15 puntos.
Muere
Tiene el turno el personaje de nivel 2 del bando masillas con iniciativa 19
Ataca a personaje de nivel 6 del bando personajes
Obtiene impacto 15, que no es mayor que la esquiva 16.
Tiene el turno el personaje de nivel 2 del bando masillas con iniciativa 12
Ataca a personaje de nivel 6 del bando personajes
Obtiene impacto 4, que no es mayor que la esquiva 16.
Da comienzo el turno 2
Tiene el turno el personaje de nivel 2 del bando masillas con iniciativa 21
Ataca a personaje de nivel 6 del bando personajes
Obtiene impacto 11, que no es mayor que la esquiva 16.
Tiene el turno el personaje de nivel 2 del bando masillas con iniciativa 14
Ataca a personaje de nivel 6 del bando personajes
Obtiene impacto 12, que no es mayor que la esquiva 16.
Tiene el turno el personaje de nivel 6 del bando personajes con iniciativa 10
Ataca a personaje de nivel 2 del bando masillas
Obtiene impacto 13, que es mayor que la esquiva 12.
Causa 13 puntos.
Le quedan 7 puntos de vida
Ataca a personaje de nivel 2 del bando masillas
Obtiene impacto 12, que es mayor que la esquiva 12.
Causa 7 puntos.
Muere
Da comienzo el turno 3
Tiene el turno el personaje de nivel 6 del bando personajes con iniciativa 21
Ataca a personaje de nivel 2 del bando masillas
Obtiene impacto 10, que no es mayor que la esquiva 12.
Ataca a personaje de nivel 2 del bando masillas
Obtiene impacto 9, que no es mayor que la esquiva 12.
Tiene el turno el personaje de nivel 2 del bando masillas con iniciativa 10
Ataca a personaje de nivel 6 del bando personajes
Obtiene impacto 13, que no es mayor que la esquiva 16.
Da comienzo el turno 4
Tiene el turno el personaje de nivel 6 del bando personajes con iniciativa 18
Ataca a personaje de nivel 2 del bando masillas
Obtiene impacto 13, que es mayor que la esquiva 12.
Causa 7 puntos.
Le quedan 13 puntos de vida
Ataca a personaje de nivel 2 del bando masillas
Obtiene impacto 14, que es mayor que la esquiva 12.
Causa 13 puntos.
Muere
personajes ganó 1
|
Bueno, podemos ver que ha ganado el personaje de nivel seis, pero esto es solo un ejemplo. Tendríamos que repetir el experimento un número elevado de veces para salir convencidos de que tenemos cierta verdad. Por ejemplo:
set_time_limit(0);
$res=array();
$nivelpers=6;
$numeromas=3;
$nivelmas=2;
for($n=0;$n<100;$n++)
{
$pelea=new pelea();
$pelea->AddBando(&039;personajes&039;);
$pelea->AddBando(&039;masillas&039;);
$pelea->AddPersonaje(&039;personajes&039;,$nivelpers);
for($m=0;$m<$numeromas;$m++)
{
$pelea->AddPersonaje(&039;masillas&039;,$nivelmas);
}
$pelea->narrar=true;
$pelea->Pelear();
$bando=$pelea->PrimerBandoVivo();
$res++;
}
foreach($res as $key=>$value)
{
echo"<br>$key ganó $value";
}
|
Nos arroja como resultado, lo siguiente:
personajes ganó 998
masillas ganó 2
|
O sea, que de tras pelear mil veces, el personaje de nivel seis ganó 998 peleas a los tres personajes de nivel dos. Se puede decir que debe sentirse seguro.
Ahora podría cabernos la pregunta de con cuantos personajes de nivel dos está equlibrado el de nivel seis. Dejaré ese ejercicio para los lectores, si bien yo he hecho otro, y es buscar el equilibrio entre personajes de Nivel N y M masillas de nivel 1. Y el resultado me ha llevado un rato, pero es interesante.
El personaje de nivel 5 estaba equilibrado con 5 masillas de nivel 1.
El personaje de nivel 10 estaba equilibrado con 26 masillas de nivel 1.
El personaje de nivel 15 estaba equilibrado con 58 masillas de nivel 1.
El personaje de nivel 20 estaba equilibrado con 93 masillas de nivel 1.
El personaje de nivel 25 estaba equilibrado con 150 masillas de nivel 1.
El personaje de nivel 30 estaba equilibrado con 350 masillas de nivel 1.
Y como curiosidad, el personaje de nivel 20 estaba equilibrado con 15 ¿masillas? de nivel 10.
Y aquí tenemos como una inocente situación en la que el progreso parecía lineal encapsula en realidad una situación de progreso realmente exponencial. Ahí queda el programa para que quien quiera explore más allá, que yo sigo por otros derroteros. Pero antes de meterme en ellos quiero mencionar que aquí no había dotes, ni hechizos, ni objetos.
Retomando unas cuantas páginas atrás, la intención es que dado un sistema de juego, el progreso sea sensible pero que no se de esta situación de segregación. Dos condiciones que son algo complejas.
La primera, la condición de progreso suficiente, es la que tiende a sobreexplotarse. Está claro que podemos hacer crecer todas las variables del personaje, pero ya se ha visto que esto puede conducirnos a una situación de segregación. Entonces, ¿qué se puede hacer?
Mi punto de vista es que el progreso es suficiente si dado un personaje de nivel N, este tiene clara desventaja contra el mismo personaje en nivel N+1. El problema, claro, es que si el sistema es muy aleatorio, como el caso del ejemplo, entonces no es tan fácil que haya ventaja significativa.
La segunda condición, la de no segregación es simple en concepto. Yo creo que la linealidad ya sería un objetivo bastante aceptable; es decir, que un personaje de nivel N esté en desventaja contra N personajes de nivel 1.
Desde mi punto de vista esto se puede conseguir buscando, por ejemplo, un progreso logarítmico. Este es el modelo que se aplica, por ejemplo, en OCIN, y que nos garantiza que un usuario que pase su vida publicando noticia nunca votará más que quince.
Pero, ¿cómo lograr un progreso logarítmico? Bueno, supongo que los lectores que hayan llegado a este punto estarán de acuerdo en que ya es bastante largo. Yo supongo que en este punto habrá dos actitudes:
Actitud uno:
“Todo esto me parece muy bien, pero a mí me parece que el progreso exponencial es guay”. Este tipo de manifestación no necesita una respuesta de cómo conseguir un progreso logarítmico.
Actitud dos:
“Pues sí, esto es sumamente interesante”. En este caso escríbase un comentario, que ya responderé por privado, o si hay muchas solicitudes, con un artículo que probablemente sea más largo que este.
Actitud tres:
"Pues sí que has perdido el tiempo para decir obviedades. Todo esto ya lo sabía, y tengo una solución elegante". Qué bueno.
Entradas similares: