[DEV] Bennu como scripting embebido (Ejemplo)

Started by SplinterGU, August 10, 2008, 12:34:22 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

SplinterGU

Es conocido por muchos que muchos juegos comerciales (a pesar de estar escritos en C o algun otro poderoso lenguaje) usan lenguajes de scripting embebidos para hacer ciertas cosas, o para tener partes de la logica fuera del codigo compilado (binario del juego), y poder de esta forma tocar y ajustar cosas de forma muy facil. Ejemplo de esto es muchos juegos de Lucas Arts y Lua... o incluso Quake y su quakec, por nombrar algunos.
Bueno, nosotros no podemos ser menos, asi que aca les voy a dejar un ejemplo de como se puede usar Bennu como lenguaje de scripting embebido en nuestros proyectos (C en este caso).

[code language="c"]
/*
*  Copyright © 2008 SplinterGU
*
*  This file is part of Bennu - Game Development
*
*  Bennu is free software; you can redistribute it and/or modify
*  it under the terms of the GNU General Public License as published by
*  the Free Software Foundation; either version 2 of the License, or
*  (at your option) any later version.
*
*  Bennu is distributed in the hope that it will be useful,
*  but WITHOUT ANY WARRANTY; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*  GNU General Public License for more details.
*
*  You should have received a copy of the GNU General Public License
*  along with this program; if not, write to the Free Software
*  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
*
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "bgdi.h"
#include "bgdrtm.h"
#include "offsets.h"

/* ---------------------------------------------------------------------- */

int main (int argc, char **argv)
{
    INSTANCE * r ;
    PROCDEF * proc;
    int ret;

    /* Initialization (modules needed before dcb_load) */
    string_init() ;
    init_c_type() ;

    /* Load dcb file */
    if (!dcb_load("sample.dcb")) {
        printf ("Error loading dcb\n") ;
        return -1;
    }

    /* Initialization (modules needed after dcb_load) */
    sysproc_init () ;

    /* ---------- Sum two Numbers ---------------------- */

    proc = procdef_get_by_name ("ADD"); // Get definition function (name must be in uppercase)
    if (!proc)
    {
        printf ("Procc 'ADD' not found\n") ;
        return -1 ;
    }
    r = instance_new (proc, 0) ; // Create Function

    PRIDWORD(r, 0) = 12 ;    // Argument 1
    PRIDWORD(r, 4) = 32 ;    // Argument 2

    ret = instance_go(r) ; // Call Function

    printf ("%d\n", ret);

    /* --------- Create file with random data ---------- */

    proc = procdef_get_by_name ("CREATE_FILE"); // Get definition function (name must be in uppercase)
    if (!proc)
    {
        printf ("Procc 'CREATE_FILE' not found\n") ;
        return -1 ;
    }
    r = instance_new (proc, 0) ; // Create Function

    PRIDWORD(r, 0) = string_new("file.dat") ; // Argument 1
    string_use(PRIDWORD(r, 0));

    ret = instance_go(r) ; // Call Function

    printf ("%d\n", ret);

    /* ------------------------------------------------- */

    do_exit(0);

    return 0;
}

/* ---------------------------------------------------------------------- */
[/code]

[code language="bennu"]
import "mod_rand";
import "mod_file";
import "mod_string";
import "mod_say";


process add(int a, int b)
begin
    say("sum>"+a+"+"+b+"="+(a+b));
    return (a+b);
end


process create_file(string f)
private
    n;
    fp;
    v1,v2;
begin

    say("create_file entry");

    fp = fopen(f, O_WRITE);
    for (n = 0; n < 10; n++)
        v1 = rand(1,100);
        v2 = rand(1,100);
        fputs(fp,"add("+v1+","+v2+")="+add(v1,v2));
    end
    fclose(fp);
    say("create_file exit");
end

begin
end
[/code]

Esto es una prueba que demuestra como puede lograrse esto actualmente, pero para la version final, se crearan "atajos" (sin quitar la actual forma de hacerlo) para simplificar un poco mas esto.

PD: Para el que no le quedo claro, esto sirve para desde un programa escrito en C (por ejemplo) cargar un dcb y llamar a funciones (escritas en lenguaje Bennu) conteniadas dentro de el. Si lo pensamos un poco, el mismo ejemplo, sirve para llamar desde una DLL Bennu a funciones de un dcb (a modo de callbacks). ;)

Link para descarga del ejemplo http://rapidshare.com/files/136430226/embebed.zip.html
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

animanegra

Oye muy muy guapa la idea :D me gusta mucho. Muy muy util para generar los programas en c y las interfaces en fenix por ejemplo. :D (Aunque ya se podian hacer mediante librerias en el sentido inverso, pero de esta forma parece que se hace de forma mucho mas sencilla ¿no?)
Creando un editor de interfaces grafico ,que no deberia ser demasiado complicado, que genere un dcb con funciones de las pantallas podria ser la excusa para que mucha gente usase bennu embebido en c para hacer las interfaces de sus programas. :D
"PoCoYo es dios!!"

SplinterGU

Si, la cantidad de aplicaciones para esto es grande... en los juegos el uso mas habitual es el de aquellas partes del juego donde uno quiere poder tener flexibilidad de cambios y donde lo pueda tocar (modificar o crear) personas que no necesariamente sean programadores expertos o incluso gente que no tenga el codigo del ejecutable en C (inclusive que no disponga de todo el entorno que la generacion de este requiera)... usos habituales son por ejemplo para, IA de los enemigos, trajectoria de una bala, comportamiento de un arma, chequeo de condiciones para determinar cambios de niveles o escenarios, incremento de decremento de vida o de puntaje, hacer un calculo cualquiera, etc...
Esto se podria comparar a un "Visual Basic for Application" (VBA) embebido en, por ejemplo, un excel. Bennu seria el VBA, y C (o el programa creado en C) el excel.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

blostec


Realmente es increíble el trabajo que estas haciendo con Bennu. Esto abre un mundo de posibilidades para usarlo.  :)

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

TYCO

No soy capaz de ver el potencial real de esto, pero si parece ser un gran avance, gracias y no se los demas pero Bennu cada dia es mas potente. :-)
Programador, Escritor/Guionista y Deportista.

Todo Modo Gráfico tiene por detrás una Línea de Comandos.

SnowCraft Remake (100%)
Rally Mortal (87%)

DCelso

Sí, pienso lo mismo que todos. Por ahora cada vez es más potente (y menos GPL :D)
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

kim-elet-o

Tyco la potencia se ve, cuando se tiene que teclear el codigo de 500 enemigos diferentes dentro de un juego, y entonces te das cuenta que porciones de codigo de un enemigo son identicas a las del otro enemigo, al final acabas agrupando esos trozos de codigo en pseudo-instrucciones, y creando un intreprete para ejecutar la logica de esas instrucciones, con lo cual con pocos bytes, puedes describir comportamientos complejos y diferentes, y lo mas importante, te olvidas de teclear programas kilometricos de 100.000 lineas, no se si se ha entendido.  ;D ;D  Es una tecnica que actualmente estoy usando en mi proyecto.   8) 8)

|/
|\im-elet-o el yayo programador.

animanegra

iepa, no entiendo lo de menos GPL. Pero si bennu es libre ¿no? El fuente ha comentado splinter que se va a liberar. ¿Porque comentas que cada vez es menos gpl?
"PoCoYo es dios!!"

SplinterGU

Quote from: animanegra on August 11, 2008, 09:19:16 AM
iepa, no entiendo lo de menos GPL. Pero si bennu es libre ¿no? El fuente ha comentado splinter que se va a liberar. ¿Porque comentas que cada vez es menos gpl?

Todo bien, entiendo que es un chiste...

Para ver las ventajas de esto voy a sugerir unos links muy interesante al respecto, que creo no deben ser ignorados por todo programador de videojuegos, incluso por aquellos que no programen en C.

http://www.fuzzygamedev.com/2007/11/18/introduccion-a-la-integracion-de-scripts-en-un-motor-de-juegos/

http://www-128.ibm.com/developerworks/linux/library/l-lua.html?ca=dgr-lnxwTryLua

http://neuromancer.inf.um.es/blog/?p=296

http://www.lordzealon.com/2008/02/20/programando-con-lua-ese-gran-desconocido-pcl-i/ (aca pueden conocer algunos juegos y productos mas que usan scripting embebido)

Seguramente si buscan en google "uso de scripting en juegos" o alguna cadena de este estilo encontraran mucha informacion importante al respecto.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

#10
Otro uso de scripting embebido... en este caso usando JavaScript (como scripting) dentro de Mozilla Firefox... http://es.wikipedia.org/wiki/Greasemonkey


De hecho Bennu/Fenix son un lenguaje de scripting embebido... como es esto? bien, en realidad la aplicacion o motor del juego en C es el bgdi/fxi y el lenguaje de scripting es donde habitualmente escribimos nuestra logica de juego, pero hasta ahora nunca se hablo ni se dio la posibilidad de integrarlo a otras aplicaciones/motores que no sean bgdi/fxi... este ejemplo, junto a la forma actual de presentacion de Bennu, demuestra como es posible llevar a cabo esto en cualquier otro proyecto...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

animanegra

Estaria muy guapo el tema de tener la posibilidad de que fuese lenguaje de scripting tipo php o bash. Usea que el interprete pudiera leer tambien  fuentes e interpretarlos directamente (Y a lo que me contesto, tambien seria guapo que los dias tuviesen 48 horas ^^). Sin mas, ya sabeis que el lenguaje de scripting abre posibilidades de generacion de codigo on the fly de manera muy sencilla.
"PoCoYo es dios!!"

DCelso

"menos gpl?"
Pues sí, tiene razón splinterGU, era un chiste.
Enfatizaba que desde la version 0.92 no existe código fuente disponible (por tanto no es "opensource" aún), y podría haber código malintencinado en los binarios.

No pongo en tela de juico a SplinterGU pero es lo que se dice de los programas sin acceso al código.

Cuando uno compila desde el código, sabe que si algo hay raro en el ejecutable lo encontrará en el código fuente, pero cuando a uno le dan el ejecutable pues nada a confiar toca (hombre podría hacerse ingeniería inversa, pero ya es meterse en camisa de once baras) :D.

Nada que está wapo el scripting, al final todo se reduce a lo mismo, damos siempre la vuelta a la tortilla, es lo que se hacía en basic en los tiempos del cpc. Se programaba el codigo fuente bas y el sistema operativo se encargaba de interpretarlo directamente era totalmente "on the fly" la programación :D. Luego empezaron las técnicas de ofuscación para evitar que se entendiera el código y lo modificasen, luego se empezaron a crear los compiladores evitando ver el código fuente, luego se crearon los scripting para programar directamente en la shell de unix, luego se traspoló a los juegos con div y derivados  en los que programas en un pseudo lenguaje inventado y luego un programa se encarga de traducirlo a la máquina física (en nuestro caso fxi, bgdi) luego se creó el concepto de máquina virtual que creas el fuente, obtienes un byte code para una máquina inexistente físicamente y luego una implementación de esa máquina traduce el bytecode a la máquina real (lo que es jre o framework.net)

Todos son el mismo perro pero con distinto collar.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

animanegra

Joder, pero el tema de compilar hace que todo vaya mas rapido, no por tema de ofuscar el fuente. :D El codigo en scripting al final se usa para lo que se usa porque al final quedan programas mas lenticos :D
"PoCoYo es dios!!"

SplinterGU

Piensen que si juegos y programas mounstruosos como World Of Warcraf, Warhammer Online, Adobe PhotoShop Lightroom, y muchos otros mas, usan scripting en partes de su codigo, tan malo no debe ser...
Tambien piensen que actualmente cada vez que programamos un juego en Fenix/Bennu (y otros tantos lenguajes similares) absolutamente toda la logica es scripting...

Download Lastest BennuGD Release: http://www.bennugd.org/node/2