domingo, 27 de febrero de 2011

Improved Battle

Improved battle es el nombre de mi script mas viejo. Proviene de mis primeros trasteos con el RGSS hara ya hace algunos años...

Empezo como una recopilacion de funciones para el combate, para añadir algunos efectos. Un tiempo despues y con la OO aprendida, lo modifique y inclui una larga serie de efectos que usaban la clausula case-when en metodos para configurar los distintos efectos de batalla... (drenar pv al atacar, % de exp extra, etc...).

Con el tiempo fui alejandome del uso de los metodos con switchs en ellos, pasandome a los hashes en modulos, sobretodo, influenciado por muchos de los scripts que circulaban por ahi.

Alomejor sera porque no soy ingles, pero tambien me parece mas legible para el no-programador la sintaxis del hash:


configuracion_arma = {
:id => 7,
:ataque_mejorado => 90,
:variable => 'valor'
}


Los hashes permiten una configuracion muy visual en mi opinion, aunque luego acceder a ellos sea mas rollazo por tener que comprovar posibles valores nulos. De hecho incluso son mas rapidos aunque eso da igual. Tambien ocupan menos espacio:


def calcular_dmg_mejorado
case @weapon_id
when 1; return 90;
end
return 0;
end


Aunque despues de una discusion con el scripter blizzard, me dio por replantearme el asunto, ya que por lo visto la gente no-programadora inglesa prefiere los metodos a los hashes.

Y ahi fue cuando se me fueron ocurriendo nuevas y mejores ideas. Andaba detras de poder modificar facilmente los hashes para que los valores se modificaran por variables de evento, pues lo necesitaba para mi juego (una arma tenia un cierto % de sacar 1 de daño, y este % variaba segun el argumento...).
¿Como podia lograr eso? Los hashes estaban ya muy cerrados en mi sistema para el ACBS, y no permiten un cambio facil de implementacion, y tampoco me parecia bien una guarrada en plan crear mi propia clase de Hash...

Ahi es cuando usar un metodo para cada efecto, calculo, opcion, brilla por completo. Puedes configurar todo, cambiar toda la implementacion a placer, añadir lo que quieras, que todo seguira funcionando. Y asi fui pensando mas y mas opciones que podria añadir al sistema....

Mas que un script lo que he desarrollado es una teoria y idea, con manual, para poderse aplicar a muchos scripts distintos, permitiendo configurar cada opcion por segun casi qualquier cosa.

He aqui un ejemplo que he creado para el tutorial de mi script. Notad que como este metodo tiene mucha complejidad, habran 3 modos distintos: novato, avanzado y experto, donde cada vez ire explicando mas y mas conceptos. Aparte de todo eso, se usaran hashes para las opciones simples, que seran llamados en los metodos, asi que ese tipo de configuracion seguira siendo valida...

La idea es explicar toda la configuracion que se haria detras de un metodo llamado s_hp_drain. Este metodo configura el % de drenado de las habilidades que usan en combate. Y en el ejemplo, la idea era mostrar un juego donde algunos de sus personajes y clases eran vampiros, que tenian este tipo de poder. Tambien muestra muchas de las ideas y opciones que añade: % de posibilidades de que todo efecto se aplique, por equipacion, personajes, clases, operaciones complejas, estados alterados, variables de eventos, etc...


------EJEMPLO PARA NOVATOS-------


-Clase Vampiro(3): Queremos que esta clase de bonus de drenacion asi que
daremos a estas habilidades un + 15% de efectividad
La clase Vampiro Lobo(7) es al contrario. Tiene un -15% de drenacion.
# Por la id de la clase
case @class_id
when 3 ; n += 15
when 3 ; n -= 15
end


-Personajes Vampiros(4,6): Estos personajes recibiran un +10%.
# Por la id del personaje
case @actor_id
when 4 ; n += 10
when 6 ; n += 10
end

-Habra algunos accesorios que jugaran con la precision de los drenados,
y un efecto basico de 50.
# Añade porcentaje base
r += 50

# Por la id del accesorio
case @armor4_id
when 13 ; r += 25
when 28 ; r += 45
end


-Habra diversas armas que lo mejoraran.
# Por la id de la arma
case @weapon_id
when 1 ; n += 25
when 4 ; n += 5
when 6 ; n += 3
when 14 ; n += 10
end

Asi tras esto quedara como:


def s_spdrain

n = 0; r = 0

# CALCULAR DRENAJE DE PH TOTAL

# Por la id del personaje
case @actor_id
when 4 ; n += 10
when 6 ; n += 10
end

# Por la id de la clase
case @class_id
when 3 ; n += 15
when 3 ; n -= 15
end


# Por la id de la arma
case @weapon_id
when 1 ; n += 25
when 4 ; n += 5
when 6 ; n += 3
when 14 ; n += 10
end


# POSIBILIDADES DE QUE SE APLIQUE EL DRENADO DE PH

# Añade porcentaje base
r += 50

# Por la id del accesorio
case @armor4_id
when 13 ; r += 25
when 28 ; r += 45
end

return r.to_i > rand 100 ? n.to_i : nil

#return n.to_i, r.to_i

end


------EJEMPLO PARA AVANZADOS-------

Añadiremos al diseño anterior lo siguiente:

-Clase Vampiro Lobo(7): Esta es al contrario. Tiene un -15% de drenacion.

-Personajes Vampiros(4,6): Ademas se añadira a cada uno de ellos el valor de una
variable de evento individual. Asi, dependiendo de la hora del dia, esta variable
ira augmentando, haciendo mas o menos efecto.

-Bendicion antidrenaje: Esta estara presente en algunos lugares y mermara
las habilidades de estos. Con esto en mente, se incluira una variable de
evento que reducira el drenaje de forma global.

-Estados alterados: Habra uno provampiros y otro que le mermara. El provampiro
doblara el drenaje a la mitad y el otro lo dividira por la mitad.

-Tambien usaremos un accesorio especial que reducira el drenaje a 10 sea cual
sea el calculo general.

-Finalmente existira un Yelmo maldito para los vampiros que reducira el %
de drenaje al 15%.


Asi al final habra quedado como:


def s_spdrain

n = 0; r = 0

# CALCULAR DRENAJE DE PH TOTAL

# Por la id del personaje
case @actor_id
when 4 ; n += 10 + $game_variables[2]
when 6 ; n += 10 + $game_variables[3]
end

# Por la id de la clase
case @class_id
when 3 ; n += 15
when 3 ; n -= 15
end

# Por la id del accesorio
case @armor4_id
when 15 ; return 10
end


# Por la id de la arma
case @weapon_id
when 1 ; n += 25
when 4 ; n += 5
when 6 ; n += 3
when 14 ; n += 10
end


# Por la variable de eventos X
n += $game_variables[1]

# Por los estados alterados del personje
n *= 1.5 if @states.include? 1
n *= 0.5 if @states.include? 1

# Por la id del yelmo
case @armor2_id
when 7 ; n *= 0.15
end


# POSIBILIDADES DE QUE SE APLIQUE EL DRENADO DE PH

# Añade porcentaje base
r += 50

# Por la id del accesorio
case @armor4_id
when 13 ; r += 25
when 28 ; r += 45
end

return r.to_i > rand 100 ? n.to_i : nil

#return n.to_i, r.to_i

end


------EJEMPLO PARA EXPERTOS-------

Cambiaremos la formula aleatoria para que sea en base 50.
return r.to_i > rand 50 ? n.to_i : nil

Añadiremos una arma para la cual su % de drenaje dependera del nivel del personaje.
La formula sera 5 * nivel del heroe/10:
# Por la id de la arma
case @weapon_id
when 17; n += 5 * @level/10
end

Añadiremos una arma para la cual su % de drenaje dependera de un numero aleatorio
entre el 0 y el 100.

# Por la id de la arma
case @weapon_id
when 19; n += rand(100)
end


Añadiremos una armadura la cual reducira el numero de drenaje basada en la cantidad
de ajos (objeto de id 56) que tengamos. La formula sera: se restara ajos * 3
# Por la id de la armadura
case @armor3_id
when 56 ; n -= 3 * $game_party.item_number(56)
end



Finalmente voy a añadir una lista de todas las opciones de este tipo:

Novato:
-Armas
-Armaduras
-Personajes
-Clases
-Grupo enemigo actual (para algunos efectos)
-Todos los efectos son aplicables tambien para los enemigos
-Suma y resta
-Modificaciones base
-Puede poner un % de que el efecto se aplique
-Por la id de la habilidad usada

Avanzado:
-Variables de evento
-Stados alterados
-El uso del orden en las opciones, multiplicar, dividir y %.
-Posibilidad de usar variables de evento para cada personaje o arma, por ejemplo.

Experto:
-Interruptores
-Usar numeros aleatorios y modificar la formula de % aleatoria
-Usar maximos y minimos
-Otras funciones extra
-Condicionales
-Soporte para crear formulas mas complejas.
-Habilidades obtenidas del personaje
-Cantidad de: Oro, pasos, contador de guardados, objetos, armas, armaduras , segundos, minutos, horas.
-Modificar las formulas de juego.
-Contador de tiempo, id del mapa, posiciones de eventos.
- str, dex, agi, int, hp, sp, maxhp, maxsp, evs, pdef, mdef, atk, crit, y si usan defender de los personajes.
-Y los niveles y experiencia.
-Testear con p

Conclusion

La idea de esto es que se pueda usar o configurar casi qualquier cosa. Aun sigo detras de algunos efectos extra, aparte de que existiran sets de opciones para cada posible script (por ejemplo, un sistema de habilidades unico, se podrian escribir funciones para poder usar las caracterisiticas y configuraciones de este nuevo sistema en los efectos de todos).

La idea seria aplicarlo a todo. Sacar scripts que por ejemplo, dejen configurar asi el valor de todos los atributos de personajes y enemigos a placer, modificar los mios existentes, etc.

En el script del improved battle, existen mas de 20 efectos de combate sobre los que aplicar todo esto.

¿Para cuando?
Este script va para muuy largo. De hecho aun no hay version en español, y el manual en ingles llega a las 20 paginas. Aunque pensad la cantidad de opciones que hay alli... se explican muchas cosas del rgss.

La primera version que vera la luz sera para el prototipo de la historia devorada. Aunque solo habre creado lo que necesito, claro.

domingo, 20 de febrero de 2011

Prototipo de la 'Historia Devorada' en marcha

La idea es crear un prototipo del juego para que la gente lo pruebe y opine, y asi poder mejorarlo antes de hacer algo mas pesado. La mayoria de las cosas que se veran se podran cambiar.

Usare mi script de betatester diary, las opiniones de la gente y un test de preguntas que ayudaran aun mas.

El prototipo del juego no sera ni demo, ni alpha... ni beta. Estoy pensando si crear un trozo de historia alternativa para provar el juego en si... o sino, sera el principio con un añadido para provar otras ideas.

Obviamente a nivel de interfaz, graficos, etc, el juego sera bastante mejorable. Y deberia durar como mucho, muchisimo 1h.

Fecha: Sin decidir aun. No deberia tardar demasiado, en todo caso.
Que estara: El sistema de afinidades, el improved battle con lo justo para sacarlo, y el resto de mis scripts compatibilizados entre ellos.
Que no estara: El sistema de saltar escenas, dificultades, manual, guia, interfaz mejorada, sistema de mercaderes, algunos otros scritps... Notad que el ACBS tiene un par de bugs toca huevos que si no se han solucionado por aquel entonces, es lo que habra, xD. Por mi parte intentare eliminar todos los bugs posibles para que se pueda jugar con tranquilidad.