Ámbito de actuación de los comandos




Introducción:


Jugador disparando en el juego Secta
en modo individual
En el modo de juego individual los comandos que uses en los ficheros de comandos .INI influyen sobre el único jugador de la partida y también sobre el único nivel o escenario donde transcurre el juego. Es decir, que si usamos el comando 'ACCI TEXT No has recogido la llave dorada' evidentemente ese mensaje aparecerá en la pantalla del único jugador de la partida. O si usamos el comando 'ACCI SPECIF_POSICION SpecificActor2 ABS 200 255 -100' pues lo que lograremos es que el modelo 3D de la entidad SpecificActor2 se posicione en las coordenadas (X:200 Y:255 Z:-100) del nivel donde se encuentra el jugador.


Dos jugadores en el juego
Online Ritual en modo online
multijugador
Pues bien, en el modo de juego online multijugador, como es obvio, es un juego con múltiples jugadores en múltiples escenarios. Si, efectivamente son escenarios idénticos para que todos los jugadores vean lo mismo y el juego funcione perfectamente sincronizado, sin embargo, como podrás comprobar, en el modo de juego online no sólo podremos influir independientemente sobre cada jugador, sino que también lo podremos hacer de forma individual en cada uno de los escenarios de cada uno de los jugadores de la partida. Por supuesto también podremos influir de manera global sobre todos los jugadores y todos los escenarios, todo dependerá del efecto que busquemos en cada momento.


Por ejemplo, podremos hacer que ese comando TEXT actúe sobre un jugador, sobre varios o sobre todos. Y lo mismo con el comando SPECIF_POSICION anterior. El grupo de jugadores sobre los que actúa un comando lo llamaremos 'Ámbito de actuación', que se refiere a una selección de jugadores que nosotros podremos configurar según las necesidades de nuestro juego.

Ese ámbito lo podremos alterar a voluntad mediante comandos durante el procesamiento de los mismos, por lo que no se tratará de algo estático predefinido, sino que podrá ser algo dinámico que usaremos en nuestros ficheros de comandos dependiendo de las condiciones que nosotros establezcamos.



Jugador causante del evento:

Todos los comandos tienen un ámbito de actuación por defecto, por lo que si no especificamos nuestro propio ámbito de actuación el comando actuará bajo su propio ámbito. No todos los comandos tienen el mismo ámbito por defecto y no todos los comandos permiten el cambio de ese ámbito. Todo esto se indica en el manual en la sección correspondiente de cada comando.



Jugadora abriendo una puerta. Es la
causante del evento Abrir puerta
Hay comandos que actúan sólo sobre el jugador que ha activado un evento, es decir, el jugador que toca algo, recoge algo, alcanza algo o alguien con su disparo, abre una puerta, etc.. aquí se relacionan todos los eventos disponibles. Otros comandos actúan por defecto sobre todos los jugadores y otros sólo actúan sobre el jugador Servidor.


El jugador que activa un evento que lanza un fichero de comandos .INI lo llamaremos 'Jugador causante del evento'. Todos los comandos que indiquen que su actuación por defecto es 'Sólo actúa sobre el jugador causante del evento' significa que ese comando sólo afectará al jugador que ha activado el evento en cuestión. Ese es el ámbito de actuación por defecto de ese comando, sobre un solo jugador (el jugador que activó el evento). Este ámbito es el más común en los comandos y si quieres que funcione de esa manera no hace falta que cambies su ámbito de actuación.


Por ejemplo, supongamos que tienes un fichero de comandos .INI asociado al parámetro CommandsFile de una entidad Door. En el interior de ese fichero usamos el comando 'ACCI TEXT No puedes abrir la puerta' de la misma manera que lo usaríamos en el modo de juego individual. ¿ Qué tendríamos que hacer para que funcionase en el modo de juego online ? ... nada. El mensaje de la imposibilidad de abrir la puerta sólo aparecerá en la pantalla del jugador que intenta abrir la puerta.

Pero qué pasa si además quieres indicar a todos los jugadores de la partida que un jugador está intentando abrir esa puerta. Pues el anterior 'ACCI TEXT' lo dejamos como está, ese comando ya nos interesa que funcione con su ámbito de actuación por defecto, pero añadiremos un nuevo 'ACCI TEXT' pero con su ámbito cambiado para que otro mensaje aparezca en las pantallas de todos los jugadores.



Cambiando el ámbito de actuación:

Para cambiar el ámbito de actuación de los comandos debemos usar el comando 'ESTABLECER_VALOR_SISTEMA destinatarios_comandos'. Este comando nos permite indicar en el parámetro valor una serie de cláusulas que harán variar el ámbito de actuación de todos los comandos que sigan a continuación y hasta que indiquemos el comando 'ACCI ESTABLECER_VALOR_SISTEMA destinatarios_comandos auto'.

Para el caso del ejemplo anterior usaríamos lo siguiente:

Como ves, el primer ACCI TEXT está fuera del cambio del ámbito de actuación y el segundo ACCI TEXT está encerrado entre las cláusulas TODO y auto al usar el comando ESTABLECER_VALOR_SISTEMA de esta manera. Puedes encerrar todos los comandos que quieras para cambiar múltiples comandos de ámbito al mismo tiempo o puedes crear diferentes cambios de ámbitos de actuación dentro de un mismo fichero .INI encerrando los comandos que te interesa cambiar y dejando fuera los que te interese que funcionen con su ámbito por defecto.

No te preocupes si incluyes comandos que no soportan el cambio de ámbito dentro de algún cambio de ámbito con múltiples comandos, unos con soporte de cambio o otros sin soporte, los comandos que no soporten el cambio actuarán con su ámbito por defecto.



Otro ejemplo de cambio de ámbito de actuación para los comandos SPECIF_POSICION y VIS1

Si ya tienes experiencia con el lenguaje de comandos de Entidad 3D, llegado a este punto, ya te estarás dando cuenta de la potencia que implica este modo de funcionamiento para juegos online. Piensa que el cambio de ámbito de actuación soporta un jugador concreto, varios, todos, todos menos el causante del evento, todos los del equipo del jugador causante del evento, sólo un personaje en concreto, dos personajes, etc.. las combinaciones pueden ser tan complejas como lo exija tu juego.


La posibilidad de incluir y excluir jugadores en los ámbitos de actuación de grupos de comandos te permite controlar cómo quieres que funcione tu juego online, qué cosas afectan a todos los jugadores y cuando, qué cosas afectan sólo al jugador que realiza la acción, etc.. de ti depende usar esta potencia de forma ingeniosa y precisa para ofrecer a los jugadores una experiencia online gratificante.


De todas formas ya verás que la mayoría de los comandos que uses en modo online no requerirán ningún cambio de ámbito ya que el que tienen por defecto te servirá en la mayor parte de los casos.



Símbolos de ámbito de actuación:

A continuación se muestran los significados de los símbolos que indican el modo de funcionamiento de los comandos en el modo de juego online y que encontrarás en el manual de referencia en cada uno de los apartados donde se explica el funcionamiento de cada comando:


Indica que el comando sólo actuará sobre el jugador causante del evento.
Son comandos como TEXT, PINV, QINV, DSAL, QSAL, etc..



Indica que el comando actuará sobre todos los jugadores de la partida incluyendo el jugador causante del evento.
Son comandos como FX_EXPLOSION, SON1, ONLINE_FIN_PARTIDA, etc..



Indica que el comando, si bien no afecta directamente al jugador causante del evento, si que será éste el único que percibirá la actuación del comando. Son algunos comandos que actúan sobre el escenario como NIE1, TEXTURA_ANIMADA_PRC, TEA1, VIS1, etc..

Indica que el comando, si bien no afecta directamente a ningún jugador, la actuación del comando la percibirán todos los jugadores de la partida. Son algunos comandos que actúan sobre el escenario como PLATAFORMA_ANIM, BLOQUE_POSICION, COR1, LUZ1, etc..

Indica que el comando, si bien no afecta directamente al jugador Servidor, si que actuará únicamente en la computadora que hace de Servidor en la partida online. Normalmente son comandos relacionados con la gestión de variables o condiciones como PONE, PONA, OPE+, IF COND, DAME_POSICION_SPECIF, etc..

Indica que el comando permite el cambio de ámbito usando el comando 'ESTABLECER_VALOR_SISTEMA destinatarios_comandos'.
Son comandos como por ejemplo: TEXT, SONIDO_FX, POSICION_JUGADOR o NIE1.


Indica que el comando no permite el cambio de ámbito. Siempre actuará con su ámbito por defecto.
Normalmente son comandos que podrían llevar a confusión si se pudiera cambiar su ámbito, por ejemplo: QINVUSO, PONE, INPU o TEM1.



Ficheros de comandos en modo online:

Como ya te habrás imaginado, la implementación de la lógica de un videojuego en modo online multijugador es ligeramente más complicada que en el modo individual, por eso no es recomendable que comiences a desarrollar un juego multijugador online sin antes haberte familiarizado con el funcionamiento de los comandos y variables de Entidad 3D en el modo de juego individual.


Tampoco es que el modo online sea mucho más difícil que el modo individual, de hecho los comandos usados son los mismos en ambos modos, salvo algunos pocos no soportados en el modo online. En el modo individual estos comandos nunca es necesario indicar hacia qué jugadores van destinados ni debemos comprobar si tal o cual jugador ha realizado tal tarea y otro jugador no.



Un fichero de comandos .INI editado
en el entorno Notepad++
De todas formas todo depende del juego que quieras realizar. Si quieres que los personajes tengan características diferentes y unos puedan hacer ciertas tareas y otros no, o unos influyan sobre otros personajes según los objetos o hechizos que tengan, vas a necesitar exprimirte la mandarina para que todo funcione como quieres. El sistema ya tiene un comportamiento automático por defecto muy preciso y adecuado para la mayoría de las acciones que realizan los comandos pero para individualizar comportamientos no podemos pretender que el sistema nos lea el pensamiento y actúe automáticamente como nosotros queremos, para eso deberemos indicárselo con precisión usando los eventos adecuados, los comandos adecuados bajo los ámbitos de actuación requeridos y controlándolo todo con variables y condiciones para no perder el control de lo que está pasando en nuestro juego y para que los jugadores tengan la mejor sensación de inmersión en un escenario común que comparten con otros jugadores.



Red de juego con el jugador Servidor y
7 jugadores Clientes
Lo primero que debemos tener en cuenta es que todos los ficheros de comandos .INI se procesan ÚNICAMENTE en la computadora del jugador que hace de Servidor. Si, así es, debe ser así para que todo esté precisamente centralizado en el Servidor, para eso es un Servidor :). De hecho los jugadores Clientes podrían eliminar todos los ficheros de comandos .INI del juego y ya verías que el juego seguiría funcionando perfectamente mientras esos ficheros existan, al menos, en la computadora del jugador Servidor.

Esto también evita que los jugadores Clientes puedan manipular los ficheros de comandos para hacer trampas.


El hecho de que se procesen todos los ficheros de comandos en el Servidor, no quiere decir que todo lo que se procese vaya destinado precisamente al jugador Servidor. Eso dependerá del ámbito de actuación de cada comando. Por ejemplo, debes entender que si se procesa el comando ACCI DSAL 12 (que aumenta la salud del jugador) será porque estará dentro de un fichero de comandos .INI que has indicado en algún parámetro de alguna entidad y eso se procesará porque se ha producido uno de los múltiples eventos de los que dispone Entidad 3D. ¿ Y quién ha causado el evento ? ... Un jugador, aunque también podría ser un Bot. Pero para el ejemplo supongamos que es un jugador de los cuatro que por ejemplo están en la partida. El sistema ya sabe quien ha activado el evento y por lo tanto será a ese jugador y no a otro al que le aumente 12 puntos el nivel de salud, aunque el comando se esté procesando en la computadora del jugador Servidor.



Variables generales y variables de cada jugador:

Es importante entender que todas las variables también están almacenadas ÚNICAMENTE en el Servidor, por lo que olvídate si estás pensando en cómo controlas condiciones con variables en los jugadores Clientes, nada de eso, todo se procesa en el lado del Servidor y es ahí donde se decide (según condiciones con variables) si el comando sólo afecta a un jugador, a varios, a todos .... o a nadie en concreto ya que puede ser una simple carga de una variable. Por ejemplo, el comando 'ACCI PONE ZETA=923' no afecta a nadie, simplemente es una variable general que queda almacenada en el Servidor para su uso normal como en el modo de juego individual.

Pero ¿ cómo hacemos para crear variables que sean propiedad de cada jugador pero pudiéndolas controlar desde el Servidor ?.


Jugador pisando, con su pie izquierdo,
una entidad Command (en azul)
Puede que quieras controlar si un jugador ha realizado una tarea concreta o ha pasado por un lugar o ha tocado algo y no quieres estar haciendo continuamente ocho comandos 'IF COND' interrogando alguna variable del sistema que te informa del número de jugador que activa un evento y almacenar datos en ocho variables en función del resultado de evaluar esas ocho condiciones.

Para hacer eso efectivamente vamos a necesitar esa variable del sistema que nos indicará qué número de jugador es el causante de cualquiera de los eventos online. Esa variable se llama EVENTO_NUM_JUGADOR_ONLINE y la usaremos para crear una variable diferente para cada jugador (hasta 8 si hay 8 jugadores).

Si, efectivamente habrá una variable diferente por cada jugador pero en el Servidor no vamos a necesitar ocho comandos PONE ni ocho 'IF COND' para evaluar cada una de las variables sino que también volveremos a usar esa misma variable en un solo 'IF COND'.


Supongamos que tenemos una entidad Command en el suelo (o piso) para que procese un fichero de comandos (llamémosle PISA.INI) cada vez que un jugador pisa la zona de influencia de esa entidad. Lo que queremos hacer es anotar de manera individual cada jugador que pisa esa zona para procesar en otro fichero de comandos (llamémosle QUIENPISA.INI asociado a una entidad CommandModel) para controlar quién ha pisado ese punto y quién no para entregarle el objeto (11) con 5 monedas de oro a cada uno de los jugadores que haya pisado la zona.


El fichero PISA.INI contendría esta única línea:

El fichero QUIENPISA.INI sería algo así:


... ¿ y si tenemos en nuestro juego diferentes personajes que no todos pueden hacer lo mismo ? Tenemos un mago, un elfo y un enano, y queremos que en cierto punto del juego sólo el mago pueda adquirir un hechizo y aunque el resto de jugadores lo intenten conseguir en el mismo punto, el sistema no se lo permita:

Pues eso aún es más sencillo de hacer. Para ello disponemos de la variable del sistema EVENTO_NUM_PERSONAJE_ONLINE.


Supongamos que el mago es el personaje número 3, el elfo el personaje número 4 y el enano el personaje número 7.

El fichero .INI del evento donde queremos controlar la entrega del hechizo (objeto número 14), contendría algo así:


Jugadora número 1
con el personaje 14
En el modo de juego online es muy importante apoyarte en las variables del sistema para poder diferenciar qué jugadores están intentando algo para saber cómo debe reaccionar tu juego en cada momento.


Como ves, no es lo mismo el número de jugador que el número de personaje. El primero es un número que depende del orden de entrada en la partida online y puede ser de 1 a 8, pero es muy útil como identificador de un jugador (independiente de su número de personaje) para diversos procesos que queramos controlar. Fíjate que en el ejemplo del fichero PISA.INI ni siquiera nos interesa saber el número de cada uno de los jugadores, sólo lo usamos internamente para que el Servidor genere las variables necesarias de forma diferenciada para cada jugador.

Otra cosa es el número de personaje (de 1 a 15) que son los personajes que controla cada jugador y que el propio jugador ha seleccionado al iniciar la partida.



Programando Scripts:


Programando
Tengo que reconocer que el lema de Entidad 3D no es del todo cierto. Eso de ... 'Crea tus propios juegos 3D sin programar' no se ajusta mucho a la realidad en el caso que quieras realizar un videojuego con unos mecanismos muy elaborados, y más si el juego es online. Al final deberás pensar cómo programar secuencias de comandos con condiciones y variables usando el lenguaje de comandos de Entidad 3D para que todo funcione como exige el guión y el funcionamiento de tu videojuego.

Pero no te confundas, a diferencia de lenguajes como el C/C++, el lenguaje de comandos de Entidad 3D no es un lenguaje para programadores, es un lenguaje para personas que no son programadoras de computadoras y quieren dotar a sus juegos de una lógica similar a la usada por esos lenguajes para programadores, pero con instrucciones mucho más simples y sin tener que saber qué es un array de punteros, un bucle anidado o una función recursiva.


Yo soy programador de C/C++ (Entidad 3D está escrito en ese lenguaje) y creo que es el mejor lenguaje de programación para aplicaciones de alto rendimiento. Con el entorno y las librerías adecuadas te permite hacer absolutamente de todo. Pero debemos entender que este lenguaje no está pensado para todo el mundo y muy poca gente dispone del tiempo necesario para dominar este lenguaje para conseguir el nivel requerido para crear un videojuego en 3D mínimamente decente.



Scripts visuales con cajas
Pero esto de programar en algún sistema de Scripts te lo encontrarás en todas la herramientas y motores 3D que sirven para crear videojuegos. Aunque todas estas herramientas disponen de la posibilidad de realizar juegos sin programar ni una sola línea de código (también Entidad 3D) cuando llega la hora de personalizar tu juego, no hablo de texturas ni personajes 3D, sino de mecanismos muy concretos y con condiciones muy elaboradas con muchos factores que evaluar, siempre tendrás que echar mano del sistema de Scripts de la herramienta. Si, algunas herramientas disponen de un sistema visual de cajas que interconectas con cables para que las salidas de unas cajas entren en las entradas de otras, pero francamente, para muchas personas ese sistema es más confuso que un lenguaje de Script modular y bien estructurado.



El juego de ejemplo 'Online Ritual':

La presente distribución de Entidad 3D incluye un videojuego de ejemplo que usa el modo online multijugador con comandos. También se incluye un manual del juego para que puedas conocer algunas características y mecanismos del juego.



Captura de pantalla del juego de ejemplo Online Ritual

El juego no es una demo ni un pequeño ejemplo del funcionamiento de Entidad 3D usando el modo de juego online con comandos. Es un juego completo para jugar con tus amigos y para que te sirva de referencia para crear tus propios juegos online ya que jugando podrás experimentar cómo responde el juego a ciertos eventos y también podrás ver cómo se han realizado esos mecanismos examinando los ficheros de comandos del juego.



Ficheros de comandos del juego
de ejemplo Online Ritual
Los ficheros de comandos de este juego los podrás encontrar en la carpeta 'comandos' de Entidad 3D, son todos los ficheros .INI que comienzan con 'onrit_'. Abre estos ficheros (a ser posible con Notepad++) para ver los comandos que usa el juego, con sus condiciones, sus variables y sobre todo los cambios de ámbito de actuación de comandos que se realizan en eventos concretos del juego.


Estos ficheros hacen un uso avanzado de los comandos de Entidad 3D y a primera vista te puede parecer confuso y difícil de entender, pero te aconsejo que te lo tomes con calma y vayas examinando estos ficheros al mismo tiempo que consultas el propio manual de Entidad 3D cuando no entiendas un comando o una variable del sistema.


Todos los ficheros de comandos del juego Online Ritual incluyen muchos comentarios sobre qué es lo que hace cada línea de comandos y también se explica qué evento lanza cada fichero de comandos y las tareas principales que cubre cada fichero.


No juzgues todo el potencial online de Entidad 3D sólo por lo que veas o dejes de ver en el juego Online Ritual, ese juego sólo usa una mínima parte de todas las características del modo de juego online multijugador usando comandos.


En Entidad 3D no existe una opción o botón para seleccionar el tipo de juego que quieres realizar. Si, está muy preparado para juegos tipo FPS de disparos, pero de ti depende qué tipo de juego quieres desarrollar usando diferentes tipos de cámaras (primera persona, tercera persona, superior, lateral, isométrica o fija), escenarios (cuevas, castillos, campos, estaciones, laberintos..), objetos (hechizos, anillos, flores, antídotos..), armas (o sin armas), objetivos, efectos animados, personajes, Bots, etc... Todas las herramientas para crear eso están ahí disponibles para hacer realidad el tipo de juego que tienes en mente. No sólo de juegos tipo FPS vive el ser humano.



Consejos finales:

Conclusión:

Pues hasta aquí la mayoría de información relacionada con el nuevo sistema de creación de videojuegos online usando comandos que se ha implementado a partir de la versión 5.0 de Entidad 3D.



No intentes entenderlo todo en una tarde, tómate tu tiempo experimentando poco a poco con cada comando o grupos de comandos cambiándoles el ámbito de actuación para que veas cómo funciona el nuevo sistema. Usa las nuevas variables del sistema (sobre todo las de uso exclusivo para el modo de juego online), están ahí para asistirte en numerosos eventos para que al consultarlas sepas qué ha pasado y tú decidas, mediante condiciones y comandos, qué debes hacer en cada evento que se produce para que tu videojuego haga lo que tiene que hacer y los jugadores se lleven una buena impresión de tu juego.


Sobre todo tres cosas: Imagina, experimenta y persevera. Piensa que ni siquiera yo, como creador del sistema, conozco los límites reales de Entidad 3D ni he podido exprimir al máximo todo su potencial. En tus manos está la posibilidad de hacerlo.


Anímate a crear y compartir tus propios mundos online.