G*S: Variables del juego

5 noviembre, 2010

Como vengo diciendo desde hace rato ya, cuando GameTalk inicia sesión en GameSocial, recibe de este último todas las variables que deberá analizar. En esta entrega explicaré como GameServer indicia los Formatos de Entrada a GameTallk.

¿Qué son estos Formatos de Entrada? Indicia la forma en que GameTalk debe interpretar cada nueva línea de log que haga el servidor del juego. Por cada evento del juego, el servidor agrega una nueva línea a su log, o muestra una nueva en la pantalla. Estos textos son los que GameTalk debe analizar.

Tras haber inciado sesión e identificado el juego, GameServer lee un archivo de configuración llamado operators.cfg, el cual está almacenado en el servidor de la red. Cargada ya, se le envía las variable a GameTalk sobre como debe leer las entradas de consola del juego.

El modelo del archivo es el siguiente.

# operators.cfg
#
# por nicolunacba 2010
#
# Operators file determines which sentences
# will be parsed, and what function it has
# on the player status.
#
# $K: Killer name
# $V: Victim name
#
# FORMAT:
#
# String	Effect
#
# Effect list:
# KILL_1 $K $V: Player $K kills $V with main attack
# KILL_2 $K $V: Player $K kills $V with second attack
# KILL_3 $K $V: Player $K kills $V with third attack
# KILL_4 $K $V: Player $K kills $V with fourth attack
# KILL_5 $K $V: Player $K kills $V with fifth attack
# KILL_6 $K $V: Player $K kills $V with sixth attack
# KILL_5 $K $V: Player $K kills $V with fifth attack
# KILL_7 $K $V: Player $K kills $V with eigth attack
# KILL_8 $K $V: Player $K kills $V with ninth attack
# KILL_9 $K $V: Player $K kills $V with tenth attack

# (i.e. Tremulous watch awards.list)

# TEAM_KILL $K $V: Player $V kills teammate $V

# DEATH_MAP $V: Player $V is killed by world

# DEATH_SELF $V: Player $V kills itself

# DEATH_STRUCT $V: Player $V is killed by structure

 
Ejemplo de Tremulous:

"$V was bitten by $K"	KILL_1 $K $V
"$V was squished"	DEATH_MAP $V

Estas configuraciones se envían de forma sencilla:

gsSay
{
        ...
        operators
        {
                # Strings y vars son el orden que
                # pueden tener los strings y las
                # variables $V y $K
                KILL_1 = STRINGS_Y_VARS
                KILL_2 = STRINGS_Y_VARS
                KILL_3 = STRINGS_Y_VARS
                KILL_4 = STRINGS_Y_VARS
                KILL_5 = STRINGS_Y_VARS
                KILL_6 = STRINGS_Y_VARS

KILL_7 = STRINGS_Y_VARS

                KILL_8 = STRINGS_Y_VARS
                KILL_9 = STRINGS_Y_VARS

TEAM_KILL = STRINGS_Y_VARS

DEATH_MAP = STRINGS_Y_VARS

DEATH_SELF = STRINGS_Y_VARS

DEATH_STRUCT = STRINGS_Y_VARS
}

...

}
Y como siempre que ya saben como agregarlos de manera más sencilla, haciendo

gsSay :: operators :: OPERADOR = STRING

o también

gsSay::operators {
               OPERADOR = STRING
}

Para terminar con la lista de variables, se envía por último los datos de otro archivo llamado awards.list que contiene la lista de medallas y los métodos para obtenerlas.

Nota: Este archivo puede sufrir cambios futuros, se encuentra en forma de BETA tanto los operadores como su semántica.

El archivo tiene una forma parecida a esta.

# awards.list
# Awards and Prizes for game - Logros y medallas del juego
#
# por nicolunacba 2010
#
# Format:
#
# NUMBER_ID   NAME   CONDITION_TYPE   CONDITION_EXPL   CONDITION_QUANT   TIMER
#
# Note: -1 = FALSE
# CONDITION QUANT: Quantify a number. This has to be an INTEGER
# TIMER: INTEGER S|M|H (Seconds|Minutes|Hours)
#
# Examples:
#
# 14	Asesino peligroso	NUMBER_KILL	-1		75	-1
# 35	Venganza instantanea	KILL_PLAYER	LAST_KILLER	1	60 s
# 99	Traidor			TEAM_KILL	-1		10	-1
# 88	Psicopata		TEAM_KILL	LAST_KILLER	1	60 s
# 55	El mundo te odia	DEATH		MAP		20	-1
# 44	Mega Constructor	BUILD		STRUCT		50	-1
# 22	Camper misterioso	NUMBER_KILL	ATTACK_3	20	-1
#
# CONDITION_TYPE List:
#
# NUMBER_KILL: number of killings of a player
# KILL_PLAYER: murder of a specific player
# TEAM_KILL: kill a team mate
# SUICIDE: number of suicides
# BUILD: build a structure
#
# Expand!
#
# CONDITION_EXPL explanation of the condition:
# LAST_KILLER: Name of the last killer
# MAP: Effect by map
# STRUCT: Effect by struct
# ATTACK_1: Primary attack (i.e. in Tremulous: bite and human weapon, except Mass Driver)
# ATTACK_2: Secondary attack (i.e. in Tremulous: granger attack or blaster)
# ATTACK_3: Tertiary attack (i.e. in Tremulous: Pounce or Mass Driver)
# ATTACK_4: Quaternary attack (i.e. in Tremulous: Tyrant rush)
# ATTACK_5: Fifth order attack (i.e. in Tremulous: Dragoon Snipe)
# ATTACK_6: Sixth order attack (i.e. in Tremulous: Granger Snipe)
#
# And Expand too!
#

G*S: Inicio de sesión

5 noviembre, 2010

Hola a todos quienes estén siguiendo este proyecto. Este es un post breve, donde mi intención es dejar por escrito el protocolo de inicio de sesión con GameSocial.

Como se ha dicho, al momento de ejecutarse GameTalk, buscará comunicarse con GameSocial. Le enviará entonces un documento en formato .gsc (Game Social Comunication) donde enviará los datos del servidor del juego. El archivo llevará el nombre de login.gsc .

gtSay::login {
        userID = ID_DEL_USUARIO
        userPASS = PASSWORD_EN_MD5
        gameID = ID_DEL_JUEGO
}

o simplemente enviar:

gtSay::login::userID = ID_DEL_USUARIO
gtSay::login::userPASS = PASSWORD_EN_MD5
gtSay::login::gameID = ID_DEL_JUEGO

De ser correcto los datos, GameSocial responderá con un OK y una llave única temporal, para que todos los métodos POST sean verificados con la clave.

gsSay::login {
        success
        postKey = KEY_MD5
}

Seguido de esto, se le envía las variables junto a las opciones del Notifier. De eso nos ocuparemos en una próxima entrega.

Si van a la sección proyectos de mi blog, verán que figura un proyecto llamado Game*Social, una red social dedicada a jugadores.

Pero ¿qué es exactamente Game*Social? Explicaré eso ahora mismo.

Game*Social es una red social similar a la de PlayStation Network o Xbox Live. Se basa en el juego que los usuarios vayan desempeñado en los servidores preparados para esto.

Un sitio web principal será la red social propiamente dicha, con cuentas de usuarios, perfiles, muros, álbumes, etc., pero no es esto lo que nos centraremos en esta ocasión ya que estos son solo implementaciones de una red social común.

El objetivo principal es que los usuarios, sea cual sea el servidor donde jueguen, lleven sus estadísticas y ganen trofeos o medallas por hazañas realizadas. Niveles y puntos de experiencias serán dados con los criterios definidos en cada juego o servidor.

En la entrada de hoy, explicaré el funcionamiento de uno de los programas principales: GameTalk.

Notas:

A partir de ahora Game*Social se nombrará simplemente GameSocial (sin el *) debido a que hablamos de piezas de software.

Dado que soy administrador de Tremulous Argentina, comunidad de jugadores de Tremulous, y mi objetivo es que este sea el primer servidor en utilizarlo, todos los ejemplos estarán orientados a este juego en el modo que se ha hecho en nuestro servidor.

En donde está instalado el servidor del juego, se instalará otro programa llamado GameTalk, el cual funcionará en paralelo. Este lee las salidas de la consola del servidor y trabaja en conjunto con Game*Social para enviar las estadísticas del juego.

GameTalk iniciará sesión en GameSocial, enviando en primer instancia la ID del juego que se analizará. GameSocial responderá con las variables que deberá llevar a cuenta, los formatos de entrada a parsear y las salidas que deberá tener. Terminado esto, GameTalk leerá la lista de jugadores conectados y verificará con GameSocial los que pertenezcan a la red. GameSocial responde con las ID correspondientes al GameTalk para así controlar el juego de estos.

Nota: El protocolo es cerrado, por lo que se centrará solamente en las operaciones propias entre el juego y el servidor, no entre partes de la red en sí.

Veamos los métodos de esta operación. La respuesta de Game*Social tiene esta forma:

gsSay {
    ...
}

A su vez, las salidas de GameTalk son:

gtSay {
     ...
}

GameTalk maneja un administrador títere dentro del juego para enviar las notificaciones de las maneras especificadas por GameSocial sobre los logros realizados por los jugadores. Se le envía un script de la siguiente forma:

gtNotify {
    name = NOMBRE_DEL_NOTIFICADOR
    say = COMANDO_PARA_HABLAR
    status = UBICACION_DEL_NOTIFICADOR # ubicacion dentro del juego
    colors = { (color, string_del_color) } # usado para darle color a las notificaciones
}

o simplemente

gtNotify::name = NOMBRE_DEL_NOTIFICADOR
gtNotify::say = COMANDO_PARA_HABLAR $SAY # donde $SAY es el texto a decir
gtNotify::status = UBICACION_DEL_NOTIFICADOR
gtNotify::colors = { (color, string_del_color) } #usado para darle 
                                                  color a las notificaciones

si se define todas las macros en el mismo script y agilizar la escritura o lectura.

Ejemplo en Tremulous Argentina:

gtNotify::name = “Game*Social-Notifier”
gtNotify::say = “\!cp “$SAY
gtNotify::status = “!specme ; !invisible”
gtNotify::colors = { (red, “^1”), (green, “^2”), (yellow, “^3”), 
                    (blue, “^4”), (cyan, “^5”), (purple, “^6”), 
                    (white, “^7”), (brown, “^8”), (black, “^9”) }

En próximas entregas hablaré mas del funcionamiento del GameTalk y otro programa importante que corre en conjunto con GameTalk y el servidor del juego, llamado PlayerUpdater. Este recibirá los logros de los jugadores y enviará a GameSocial los nuevos premios otorgados.