PDA

Voir la version complète : [NDS][Aide] LUA sur Nds


BennyRebirth
24/03/2006, 17h50
Salut a tous ! ;)
Comme je le disai dans le topic avec mon prob de pointeur, jvé essayer d'intégrer Lua sur Nds avec GBAFS ( n'y arrivant pas avec PAFS ^^ lol )
Thoduv ma filé un petit lien bien sympa sur l'ancien forum : http://www.playeradvance.org/old/index.php?showtopic=10748

J'ai donc essayer de reprendre le code et de le compiler avec la dernière version de Lua ( 5.1 ) ainsi qu'avec PALib.

Voila se que sa donne :)

// Includes
#include <PA9.h> // Include for PA_Lib
#include "luasrc\all.c"

static int script_texte( lua_State *L );
static const char * recupere_fichier( lua_State *L, void *data, size_t *size );
static const char * charge_script( lua_State *L, char * nomfichier );

// le nombre de fichiers present dans la ROM
unsigned long nombrefichiers;
// le nom du dernier fichier pointé
char nomfichier[24];
// la taille du dernier fichier pointé
unsigned long taillefichier;
// pointeur sur le systeme de fichier
const GBFS_FILE * systemefichier = NULL;
// pointeur sur le debut du fichier courant
const char * fichiercourant;



// Function: main()
int main(int argc, char ** argv)
{
PA_Init(); // Initializes PA_Lib
PA_InitVBL(); // Initializes a standard VBL

PA_InitText(1,2); // Use background number 2



// creer un nouveau etat lua
lua_State *L = lua_open();

// enregistre une fonction a destination de lua
lua_register(L,"texte",script_texte);

// pointe sur la TOC
systemefichier = find_first_gbfs_file(find_first_gbfs_file);
// pour le fun, je ne m'en sert pas dans ce tutoriel
nombrefichiers = gbfs_count_objs(systemefichier);

// charge et execute un script LUA
charge_script( L, "test.lua" );

// ferme l'etat
void lua_close( lua_State *L );

// Infinite loop to keep the program running
while (1)
{
PA_WaitForVBL();
}

return 0;
} // End of main()

static int script_texte( lua_State *L )
{

// recupere le nombre de parametre dans la pile
unsigned short n = lua_gettop(L);

// scanne tout les paramatres
unsigned short i;
for( i=1; i<=n; i++ )
{

// si le parametre est une chaine de caracteres
if( lua_isstring(L,i) )
PA_OutputText(1,1,1,"%s", lua_tostring(L,i) );

// si le parametre est nul
else if( lua_isnil(L,i) )
PA_OutputText(1,1,1,"nul");

// si le parametre est un boolean
else if( lua_isboolean(L,i) )
PA_OutputText(1,1,1, lua_toboolean(L,i) ? "true" : "false" );
}

return 0;

}

/* recupere_fichier {{{
*
* fonction callback pour lua_load()
*
* @param lua_State *L un état lua (toujour a null)
* @param void *data les donnees envoyees
* @param size_t *size la taille des donnees
*/
static const char * recupere_fichier( lua_State *L,
void *data,
size_t *size )
{
// permet de verifier si le fichier a déjà été envoyés
static const char * fichierprecedent = NULL;
// si le script a déjà été envoyé
if( fichierprecedent == fichiercourant )
{
// renvoie null
*size = 0;
return NULL;
}
// sinon
else
{
// renvoie un pointeur sur le script
*size = taillefichier;
// envoie le fichier en une seule partie
fichierprecedent = fichiercourant;
// j'aurai pu mettre ici : return data;
return fichiercourant;
}
}
// recupere_fichier */

/* charge_script {{{
*
* charge un script LUA et l'execute
*
* @param lua_State *L un état LUA
* @param char * nomfichier le nom du fichier a charger
*/
static const char * charge_script( lua_State *L, char * nomfichier )
{
// pointe sur le fichier
fichiercourant = gbfs_get_obj( systemefichier, nomfichier, &taillefichier );
// appel la fonction de chargement des script LUA
if( lua_load( L, recupere_fichier, (void*) fichiercourant, nomfichier )
// et dans la foulé, execute la fonction
|| lua_pcall( L, 0, 0, 0 ) )
// gestion des erreurs
PA_OutputText(1,1,1,"%s",lua_tostring(L,-1));
// ca, c'est pour la suite
return fichiercourant;
}
// charge_script

/* END OF FILE */

Mais bien évidament ( pas de chance pour moi ^^ ) sa marche pas ! ;)
J'optiens 2 ptis warning a la ligne : "lua_State *L = lua_open();"
warning: implicit declaration of function 'luaL_newstate'
warning: initialization makes pointerfrom integer without a cast

et puis sa :
In function 'charge_script':warning: passing argument 3 of 'gbfs_get_obj' from incompatible pointer type
arm-elf-g++ -g -mthumb-interwork -mno-fpu -L/c/devkitPro/PAlib/lib -specs=ds_arm
9.specs main.o -Lc:/devkitPro/PAlib//lib -lpa9 -L/c/devkitPro/libnds/lib -lnds9
-o build.elf
main.o: In function `main':
undefined reference to `luaL_newstate'

:( je capte pas dutout pourquoi cette ligne pose problème, je connaissai Lua que de nom ce matin lol donc je m'y met seulement, j'espère que quelqu'un pourra m'aider , en tout cas merci d'avance ^^

PS: Jpeu mettre les sources en "rar" avec le makefile et tout sa si certain veulent faire des essais , mais j'utilise simplement le template de l'avant dernière version de PALib (pas la beta)

birslip
24/03/2006, 18h14
Je pense que tu inclus tous les fichiers .c dans all.c ?

Je te conseil plutot d'ajouter le dossier luasrc à la compilation, dans le makefile tu ajoutes à la ligne avec "source": "source/luasrc"
Après dans ton fichier main.c tu auras simplement à inclure lua.h et ça reglera pas mal de problème ;)

BennyRebirth
24/03/2006, 20h44
http://membres.lycos.fr/bennyrebirth/LUANDS.rar

C'est encore pire malheuresement ^^

Si quelqu'un a une idée, ou une correction a apporter parce que la je calle.... :hum:

birslip
24/03/2006, 21h03
Je me suis mal exprimé (un peu à l'arrache sans précision ^^)
Voilà, tout compile, en fait je voulais te dire d'ajouter le dossier luasrc à la compilation. Tu peux télécharger le truc qui compile bien ici (http://birslip.pizz.biz/temp/lua___benny.rar)! ^^

Nesgba
24/03/2006, 22h17
inclure un .c dans un autre .c aurai du te mettre un peu la puce a l'oreille benny ;)

quand tu inclue un fichier imagine que le preprocesseur remplace ta commande par le fichier entier et tu comprend tout de suite d'ou peut venir l'erreur.

bonne continuation pour ton rpg, j'ai hate de tester ;)