EasyRPG Forums

Versión Completa: Traducción del SDK
Actualmente estas viendo una versión simplificada de nuestro contenido. Para ver la versión completa en el formato correcto, dale click aquí
Tras confirmar la interpretación que se concluye de la licencia del SDK de Sue445 se trata de dominio público y por tanto es compatible con la GPL, me he puesto manos a la obra comenzando a traducir todo los comentarios del código fuente. Aquí copio y pego los que vaya traduciendo.

index.h

Código:
/**

    @file

    @brief        SDK main include file

    @author        sue445

*/

#ifndef _INC_RPG2KDEVSDK_INDEX

#define _INC_RPG2KDEVSDK_INDEX



#include "CRpgLsd.h"

#include "CRpgLdb.h"

#include "CRpgLmu.h"

#include "CRpgImage.h"



#ifdef _MSC_VER

# ifndef _DEBUG

//#  pragma comment( linker , "/NODEFAULTLIB:libcmt.lib" )

#  pragma comment( linker , "/NODEFAULTLIB:libc.lib" )

# else

#  pragma comment( linker , "/NODEFAULTLIB:libcd.lib" )

# endif

#endif



#endif


CRpgLsd.h

Código:
/**

    @file

    @brief        Save??.lsd (LcfSaveData) class manager

    @author        sue445

*/

#ifndef _INC_CRPGLSD

#define _INC_CRPGLSD



#include "CRpgIOBase.h"



const int MAX_SAVEDATA = 15;        ///< Max number of save data





/// Save??.lsd (LcfSaveData) class manager

class CRpgLsd : public CRpgIOBase{

private:

    const char* GetHeader(){ return "LcfSaveData"; }    ///< specific file header (overrides CRpgIOBase default empty return value)



public:

    CRpgArray1        ArrayLoading;            ///< 0x64: Information on save data selection scene



public:

    CRpgLsd(){}                        ///< Constructor

    ‾CRpgLsd(){}                        ///< Destructor



    bool Init(int nSaveNum, const char* szDir="");        ///< Initialization

};



#endif


CRpgLsd.cpp

Código:
/**

    @file

    @brief        Save??.lsd (LcfSaveData) class manager

    @author        sue445

*/

#include "CRpgLsd.h"





//=============================================================================

/**

    Initialization



    @param    nSaveNum        [in] Save data number (1...15)

    @param    szDir            [in] Reading folder



    @retval                    Successfully reading save data

    @retval                    Failed reading save data

*/

//=============================================================================

bool CRpgLsd::Init(int nSaveNum, const char* szDir)

{

    int type;

    char file[256];

    smart_buffer    buf;

    string            strFile;





    // Unexpected number of save data

    if(nSaveNum<1 || nSaveNum>MAX_SAVEDATA)        return false;



    bInit = false;

    sprintf(file, "Save%02d.lsd", nSaveNum);

    if(strlen(szDir)){

        strFile += szDir;

        strFile += "¥¥";

    }

    strFile += file;



    // No save data

    if(!OpenFile(strFile.c_str()))        return false;





    // Data Reading

    while(!IsEof()){

        type = ReadBerNumber();

        buf = ReadData();



        switch(type){

        case 0x64:    // Information on save data selection scene

            ArrayLoading = CRpgUtil::GetArray1(buf);

            break;

        case 0x65:    // Flag information, etc.

            break;

        case 0x66:

            break;

        case 0x67:

            break;

        case 0x68:    // Save point

            break;

        case 0x69:

            break;

        case 0x6A:

            break;

        case 0x6B:

            break;

        case 0x6C:    // party[actor number][attribute]

            break;

        case 0x6D:    // Item information, etc.

            break;

        case 0x6E:

            break;

        case 0x6F:

            break;

        case 0x70:

            break;

        case 0x71:

            break;

        case 0x72:

            break;

        }

    }



    bInit = true;

    return true;

}


CRpgLmu.h

Código:
/**

    @file

    @brief        Map????.lmu (LcfMapUnit) class manager

    @author        sue445

*/

#ifndef _INC_CRPGLMU

#define _INC_CRPGLMU



#include "CRpgIOBase.h"

#include "CRpgEvent.h"

#include "CRpgImage.h"

#include "CRpgLdb.h"





const int CHIP_SIZE = 16;    ///< Tile size



/// Map????.lmu (LcfMapUnit) class manager

class CRpgLmu : public CRpgIOBase{

private:

    const char* GetHeader(){ return "LcfMapUnit"; }    ///< specific file header (overrides CRpgIOBase default empty return value)



    int m_nChipSet;        ///< 0x01: Tileset number (initial value: 1)

    int m_nWidth;        ///< 0x02: Map width (initial value: 20)

    int m_nHeight;        ///< 0x03: Map height (initial value: 15)

    string    m_strPanorama;    ///< 0x20: Panorama file name (initial value: "")



    // Map Tileset (Respecting to internal data, it's referring by [y][x])

    smart_array< smart_array< unsigned short > >    m_saUpper;    ///< 0x47: Upper layer

    smart_array< smart_array< unsigned short > >    m_saLower;    ///< 0x47: Lower layer



    CRpgImage imgChipSet;    ///< Tileset picture

    CRpgImage imgPanorama;    ///< Panorama picture



public:

    // Each map event

    struct MAPEVENT{

        MAPEVENT(): x(0), y(0){}    ///< Default constructor



        string strName;    ///< 0x01: Name

        int  x;        ///< 0x02: X coordinate

        int  y;        ///< 0x03: Y coordinate

        int  data;    ///< 0x04: Unknown (O_O)



        /// Map event in a page unit

        struct MAPEVENT_PAGE{

            MAPEVENT_PAGE():

                nWalkPos(0), nWalkMuki(0), nWalkPattern(1), bWalkHalf(false), nStart(0){}    ///< Constructor



            struct EVENTAPPEAR{

                EVENTAPPEAR():

                    nSw1(1), nSw2(1), nVarNum(1), nVarOver(0),

                    nItem(1), nChara(1), nTimer(0){}    ///< Constructor



                /**

                    Bit 0: Switch [%04d:%s] ON (1)\n

                    Bit 1: Switch [%04d:%s] ON (2)\n

                    Bit 2: Variable [%04d:%s] above [%d]\n

                    Bit 3: Item [%04d:%s] in possession\n

                    Bit 4: Actor [%04d:%s] in party\n

                    Bit 5: Timer [%02d:%02d] below

                */

                int nFlag;    ///< 0x01: Checkbox state (6 bits flag)



                int nSw1;    ///< 0x02: Switch (1)    Initial value :1

                int nSw2;    ///< 0x03: Switch (2)    Initial value :1

                int nVarNum;    ///< 0x04: Variable number    Initial value :1

                int nVarOver;    ///< 0x05: Variable - above

                int nItem;    ///< 0x06: Item - in posession    Initial value :1

                int nChara;    ///< 0x07: Actor - in party    Initial value :1

                int nTimer;    ///< 0x08: Timer (in seconds)



            } EventAppear;        ///< 0x02: Appearance conditions



            // Actor graphic related

            string     strWalk;    ///< 0x15: File name



            /**

                Actor graphic part: 0-7 starting at upper left\n

                Tileset part: Upper layer map position\n

                *Judge whether a walk picture or the upper layer map have a file name

            */

            int nWalkPos;        ///< 0x16: Actor graphic (in upper layer map) orientation



            /**

                0:Up\n

                1:Right\n

                2:Down\n

                3:Left

            */

            int nWalkMuki;        ///< 0x17: Actor graphic walking frame



            /**

                0: Left\n

                1: Middle (initial value?)\n

                2: Right

            */

            int nWalkPattern;    ///< 0x18: Walking pattern



            bool bWalkHalf;        ///< 0x19: Transparency status



            /**

                0: On button key press\n

                1: On actor touch\n

                2: On event touch\n

                3: Automatic start\n

                4: Parallel process

            */

            int nStart;            ///< 0x21: Start conditions



//            int nEventDataSize;        ///< 0x33: Auto start

            vector< CRpgEvent > vctEvent;    ///< 0x34: Event data block



        };    // end of struct MAPEVENT_PAGE

        smart_array< MAPEVENT_PAGE > saPage;    ///< 0x05: Map event (per event page)



    };    // end of struct MAPEVENT

    smart_array< MAPEVENT >    saMapEvent;    ///< Map event package (name, position, pages)



public:

    CRpgLmu(){}    ///< Constructor

    ‾CRpgLmu(){}    ///< Destructor



    bool Init(int nMapNum, const CRpgLdb& ldb, const char* szDir="");    ///< Initialization

    bool GetUpperChip(int x, int y, CRpgImage& img) const;            ///< Gets the upper layer map

    bool GetLowerChip(int x, int y, int anime, CRpgImage& img) const;    ///< Gets the lower layer map



    int GetChipSet()    const{ return m_nChipSet; }    ///< Gets tileset ID

    int GetWidth()        const{ return m_nWidth;   }    ///< Gets map width

    int GetHeight()        const{ return m_nHeight;  }    ///< Gets map height



private:

    void GetMapEvent(smart_buffer& bufSrc);                    ///< Gets map event

    void GetOceanType(unsigned short chip, bool bOcean[4]) const;        ///< Gets sea type by tileset ID

    void GetChipPos(int nChip, bool bUpper, int* lpX, int* lpY) const;    ///< Gets tileset position by tileset ID

};



#endif


Quería terminar para ahora el CRpgLmu.cpp, pero es bastante largo y no me dará tiempo por hoy (es el más largo de todo el SDK con diferecia, el .h es el segundo mas largo).

Iré respondiendo en este hilo las actualizaciones al respecto. Cualquier sugerencia de corrección es bienvenida.

Esta tarde 4 pequeñitos, doble post en plan respuesta super rápida que a continuación me marcho (encima voy tarde xD):

CRpgEventStream.h

Código:
/**

    @file

    @brief        The stream for reading an event from the buffer

    @author        sue445

*/

#ifndef _INC_CRPGEVENTSTREAM

#define _INC_CRPGEVENTSTREAM



#include "CRpgIOBase.h"

#include "CRpgEvent.h"





/// The stream for reading an event from the buffer

class CRpgEventStream : public CRpgIOBase{

public:

    CRpgEventStream(){}            ///< Constructor

    ‾CRpgEventStream(){}            ///< Destructor



    bool ReadEvent(CRpgEvent& event);    ///< Reads 1 event

};



#endif


CRpgEventStream.cpp

Código:
/**

    @file

    @brief        The stream for reading an event from the buffer

    @author        sue445

*/

#include "CRpgEventStream.h"





//=============================================================================

/**

    Gets 1 event from the stream



    @param    event            [out] gets the event



    @retval    true            Successfully reading event

    @retval    false            Failed reading event

*/

//=============================================================================

bool CRpgEventStream::ReadEvent(CRpgEvent& event)

{

    event.m_deqParam.clear();

    event.m_str = "";



    if(IsEof())        return false;



    // Event code

    event.m_nEventCode = ReadBerNumber();

    if(event.m_nEventCode==0)    return false;



    // Number of nests

    event.m_nNest = ReadBerNumber();



    // Text

    event.m_str = ReadString();



    // Number of parameters

    event.m_nParamMax = ReadBerNumber();

    int max = event.m_nParamMax;

    while(max-->0){

        event.m_deqParam.push_back( ReadBerNumber() );

    }



    return true;

}


CRpgLdb.h

Código:
/**

    @file

    @brief        RPG_RT.ldb (LcfDataBase) class manager

    @author        sue445

*/

#ifndef _INC_CRPGLDB

#define _INC_CRPGLDB



#include "CRpgIOBase.h"



/// RPG_RT.ldb (LcfDataBase) class manager

class CRpgLdb : public CRpgIOBase{

private:

    const char* GetHeader(){ return "LcfDataBase"; }    ///< specific file header (overrides CRpgIOBase default empty return value)



public:

    /// Tileset

    struct ChipSet{

        string strName;            ///< 0x01: Name

        string strFile;            ///< 0x02: File name

    };

    smart_array< ChipSet >    saChipSet;



public:

    CRpgLdb(){}                ///< Constructor

    ~CRpgLdb(){}                ///< Destructor



    bool Init(const char* szDir="");    ///< Initialization

};





#endif


CRpgLdb.cpp

Código:
/**

    @file

    @brief        RPG_RT.ldb (LcfDataBase) class manager

    @author        sue445

*/

#include "CRpgLdb.h"



//=============================================================================

/**

    Initialization



    @param    szDir            [in] Reading folder



    @retval                    Successfully reading database

    @retval                    Failed reading database

*/

//=============================================================================

bool CRpgLdb::Init(const char* szDir)

{

    int type, id, max;

    smart_buffer    buf;

    string            strFile;

    CRpgArray2        array2;





    bInit = false;

    if(strlen(szDir)){

        strFile += szDir;

        strFile += "¥¥";

    }

    strFile += "RPG_RT.ldb";



    // No database

    if(!OpenFile(strFile.c_str()))        return false;





    // Data reading

    while(!IsEof()){

        type = ReadBerNumber();

        buf = ReadData();



        switch(type){

        case 0x14:    // Tileset

            array2 = CRpgUtil::GetArray2(buf);

            max = array2.GetMaxRow();

            saChipSet.Resize(max+1);

            for(id = 1; id<=max; id++){

                saChipSet[id].strName = array2.GetString(id, 0x01);

                saChipSet[id].strFile = array2.GetString(id, 0x02);

            }

            break;

        }

    }



    bInit = true;

    return true;

}


¡Hasta mañana!

no te preocupes por el doble post, esto es mas importante que el doble post, si algún día lo veo innecesario ese doble post los uniré, para que no tengas que estar preocupándote de estos pequeños detalles. Ademas como este tema es algo escabroso y hay mucho texto es mejor dejarlo así sin mas, ya que a lo mejor no cabria todo en un mismo post.

Buenas noticias, ya me las comentaste ayer pero ahora puedo ver de que trataba.
Joer, no veas si es largo, estas traduciendo todo esto tu solo...?
Si solo se trata de traducir puedes enviarme los archivos por email (usa el de hotmail mejor es la misma dirección pero cambiando compañías)
Y los traduzco. Así se agilita la cosa, si es traducir y retocar yo puedo encargarme de traducir y tu de retocar, si tienes un buen traductor que te vaya bien a ti pasame la dirección así lo uso y te sera mas fácil y mas rápido, al menos te quitas algo de encima.
Suerte con el trabajo y espero poder ser de utilidad.
Gracias, pero esto es trabajo de pocos días, de hecho espero tener terminada la traducción del SDK que me interesa durante la semana que viene. No hay tanto para traducir. El nombre de las clases está en inglés, lo único para traducir son los comentarios, aquí hay una muestra de cuando iba traduciendo de arriba a abajo:



A ver si hoy o mañana publico alguno más, nos vemos!
Repito respuesta para informar que he avanzado una numerosa parte de archivos traducidos. Para coordinar mejor lo que traduzco entre casa y el trabajo he subido todo el SDK al repositorio SVN para poderlo tener más a mano y que todo el mundo disponga de los últimos comentarios traducidos al día. Está en trunk/player/rpg2kdev.
No quiero hacer presión pero.. cuando estará lista la traducción..
Es que habian dicho que para esta semana pero al entrar al repositorio resulta ser que no....

Aun cuando estoy de vaciones me tome algo de mi tiempo para ver el código del SDK y tal como decía delaPipol con estas herramientas hacer la lectura de la base de datos es relativamente simple, aunque hay algunos pequeños detalle que se necesitan conocer antes de hacer una lectura completa.

Para leer los datos es necesario conocer el código en hexadecimal de la posicion de los mismos, esto lo podemos obtener de la descripción dada por sue445 en su pagina pero no esta completa....

link a la pagina de sue

En este link estan las direcciones a los datos de la base de datos pero hacen falta los contenidos de los siguientes:

0 x15 Glossary
0x16 System

Hay otros detalles además que estan incompletos, otros datos el traductor no los lee tendremos que traducirlos de otra forma ....

Otro detalle es que el compilar el código de sue puede dar problemas (cof cof desde que olvido incluir una de sus librerías cof), hay partes del código que tal vez necesitamos y otras más que fallaran porque el compilador de visual c++ 6 es menos delicado en cuanto a referencias a memoria que los que están basados en linux.

En fin pongo un link al código de sue compilado con dev c++ (tiene unas pequeñas modificaciones para que pueda compilar y solo haga lo que nos interesa la lectura de la base de datos).



codigofuente (incluye exe)

El código ya lee mas cosas de las base de datos pero hace falta muchas mas por leer y (se necesita la librería zlib para compilarlo).

Pd. no estoy de regreso, regreso en diciembre solo pensé que esto les podría servir.
En el SDK, especialmente el CRPGLdb no está completo y hay que rellenar todos los códigos hex como bien dices (se hizo la estructura y se introdujeron los datos básicos para una pequeña demo). Aparte del SDK de Sue445, en el wiki de easyrpg hay otros recursos enlazados, como una hoja de excel rellenada por WhoopA con más códigos, y otro enlace con un documento sencillo creado para el proyecto RM Collegial, si necesitas códigos concretos que no se encuentren en ellos habrá que examinar a mano el ldb.

Hay un truquito: se puede crear un archivo LDB vacío, que ocupará un mínimo de 3 kb (en vez de los 120 kb rellenados que trae el LDB predeterminado). A partir de ahí no existirán varios códigos, así que rellenar datos en el ldb y luego analizándolo con un editor hexadecimal se podría ir tirando.

Para generar este LDB vacío (recomiendo generarla RPG Maker 2000 al tener una bdd más simple) se borra el ldb y al abrir el proyecto y al darle a F8 luego se da a aceptar y creará una genérica. Si no es así, crear un archivo ldb de 0 bytes y repetir la operación.

Estuve liado con otra web y no adelanté más trabajo en el SDK y en la traducción del wiki, así que le daré preferencia esta semana.

Para cualquier aspecto de traducción que necesites dime la lista, algunas estan en romaji, como KOMONIBENTO que son Common Events, luego hay otros traductores, como el de http://tool.nifty.com/globalgate y herramientas como el kanjidict de biskwit o el wwwjdic. Si vas a trabajar preferentemente en la base de datos traduciré primero toda esta parte y recopilaré todo lo que haya.

P.D.: Datos en la documentación de WhoopA, como dije en el wiki, entre sue445 y WhoopA se complementan entre ellos bastantes datos que faltan en común. Por ejemplo sue445 no ha documentado bien el archivo LMT que define el árbol de mapas pero he podido rellenar la documentación en el wiki de easyrpg gracias a WhoopA. Aquí tienes los datos del bloque Glossary y del bloque System, según el documento de Excel de WhoopA:

Código:
String data        
0x01        Enemy encounter
0x02        Headstart attack
0x03        Escape success
0x04        Escape failure
0x05        Battle victory
0x06        Battle defeat
0x07        Experience received
0x08        Money recieved A
0x09        Money recieved B
0x0A        Item recieved
0x0B        Attack message
0x0C        Ally critical hit
0x0D        Enemy critical hit
0x0E        Defend message
0x0F        Watch message
0x10        Gathering energy
0x11        Sacrificial attack
0x12        Enemy escape
0x13        Enemy transform
0x14        Enemy damaged
0x15        Enemy undamaged
0x16        Ally damaged
0x17        Ally undamaged
0x18        Skill failure A
0x19        Skill failure B
0x1A        Skill failure C
0x1B        Attack dodged
0x1C        Item use
0x1D        Stat recovery
0x1E        Stat increase
0x1F        Stat decrease
0x20        Ally lost via absorb
0x21        Enemy lost via absorb
0x22        Resistance increase
0x23        Resistance decrease
0x24        Level up message
0x25        Skill learned
0x29        Shop greeting A
0x2A        Shop regreeting A
0x2B        Buy message A
0x2C        Sell message A
0x2D        Leave message A
0x2E        Buying message A
0x2F        Quantity to buy A
0x30        Purchase end A
0x31        Selling message A
0x32        Quantity to sell A
0x33        Selling end A
0x36        Shop greeting A
0x37        Shop regreeting A
0x38        Buy message A
0x39        Sell message A
0x3A        Leave message A
0x3B        Buying message A
0x3C        Quantity to buy A
0x3D        Purchase end A
0x3E        Selling message A
0x3F        Quantity to sell A
0x40        Selling end A
0x43        Shop greeting A
0x44        Shop regreeting A
0x45        Buy message A
0x46        Sell message A
0x47        Leave message A
0x48        Buying message A
0x49        Quantity to buy A
0x4A        Purchase end A
0x4B        Selling message A
0x4C        Quantity to sell A
0x4D        Selling end A
0x50        Inn A Greeting A
0x51        Inn A Greeting B
0x52        Inn A Greeting C
0x53        Inn A Accept
0x54        Inn A Cancel
0x55        Inn B Greeting A
0x56        Inn B Greeting B
0x57        Inn B Greeting C
0x58        Inn B Accept
0x59        Inn B Cancel
0x5C        Loose items
0x5D        Equipped items
0x5F        Monetary Unit
0x65        Combat: Command
0x66        Combat: Auto
0x67        Combat: Run
0x68        Command: Attack
0x69        Command: Defend
0x6A        Command: Item
0x6B        Command: Skill
0x6C        Menu: Equipment
0x6E        Menu: Save
0x70        Menu: Quit
0x72        New Game
0x73        Load Game
0x75        Exit to Windows
0x7B        Level
0x7C        Health
0x7D        Mana
0x7E        "Normal" status
0x7F        Experience (short)
0x80        Level (short)
0x81        Health (short)
0x82        Mana (short)
0x83        Mana cost
0x84        Attack
0x8        Defense
0x86        Mind
0x87        Agility
0x88        Weapon
0x89        Shield
0x8A        Armor
0x8B        Helmet
0x8C        Accessory
0x92        Save game message
0x93        Load game message
0x94        Exit game message
0x97        File name
0x98        General Yes
0x99        General No
        
System block data        
0x0B        Skiff graphic
0x0C        Boat graphic
0x0D        Airship graphic
0x0E        Skiff index
0x0F        Boat index
0x10        Airship index
0x11        Title graphic
0x12        Game Over graphic
0x13        System graphic
0x15        Heroes in starting (default 1)
0x16        Starting party
0x1F    G    Title music
0x20    G    Battle music
0x21    G    Battle end music
0x22    G    Inn music
0x23    G    Skiff music
0x24    G    Boat music
0x25    G    Airship music
0x26    G    Game Over music
0x29    G    Cursor SFX
0x2A    G    Accept SFX
0x2B    G    Cancel SFX
0x2C    G    Illegal SFX
0x2D    G    Battle SFX
0x2E    G    Escape SFX
0x2F    G    Enemy attack SFX
0x30    G    Enemy damaged SFX
0x31    G    Ally damaged SFX
0x32    G    Evasion SFX
0x33    G    Enemy dead SFX
0x34    G    Item use SFX
0x3D        Map exit transition
0x3E        Map enter transition
0x3F        Battle start fadeout
0x40        Battle start fadein
0x41        Battle end fadeout
0x42        Battle end fadein
0x47        
0x48        
0x51        Selected condition
0x52        Selected hero
0x54        Battle test BG
0x55    M    Battle test data
0x5B        
Battle test sub-block        
0x02        Level
0x0B        Weapin
0x0C        Shield
0x0D        Armor
0x0E        Helmet
0x0F        Accessory
(Los ultimos datos ya no parecen parte de la pestaña system de la bdd).
(los datos del battle test son aquellos que al ejecutar el juego en modo prueba de los combates se almacenan para testarla. en vez de pasarse como parámetro al rpg_rt se almacenan al final del fichero ldb de forma permanente hasta el próximo test, que serán sustituídos por otros, y así. En la documentación del wiki de easyrpg acerca de rpg_rt se puede ver el mecanismo de lanzamiento de los battletest)
(el opcode 0x5B es siempre el numero de veces guardado, usado para la version demo de rpg maker, aumentará 1 por cada vez que se dé a aceptar a la bdd, que es cuando se guarda (el guardado de la bdd es 100% independiente de la del resto del editor de rpg maker). Verás que el 0x5B también se usa en los archivos lmu y que si haces test del ldb y haces un diff binario verás como ese 0x5B funciona así, aunque no lo hayan documentado ellos en el caso del ldb. Al ejecutar el battle test se hace un guardado del ldb pero no es permanente, porque el que prevalecerá es cuando se le de a aceptar, a no ser que se cuelgue el programa entero, donde al darle a aceptar se vuelve a guardar lo que había en memoria, aunque incluyendo los nuevos cambios en el bloque 0x55 del battle test. )


Puesto que la documentación está desordenada entre varios autores, también tratare de recopilarla toda en el mismo lugar, es decir, en nuestro wiki.

Se me olvidaba, subí al trunk todos estos archivos y más, y tienes razón, no están todavía todos traducidos (hay algunas frases que las dejo sin traducir en algunos por su dificultad e inverosimilitud tras pasarla por el traductor, pero aquí los iré subiendo, por si a alguien más les hacen falta los recuerdo:

http://easyrpg.svn.sourceforge.net/viewvc/easyrpg/trunk/player/rpg2kdev/

De todas formas muchos datos ya los tiene WhoopA, lo que es molestia es mirar el wiki de sue445, porque no están ni mucho menos todos los hexcodes que hay en el Wiki introducidos dentro del SDK.

Me extraña que dependa de zlib, tal vez lo use en las clases de imagen, especialmente para xyz (y quizás png, porque la suelib trae su propio tratamiento de imagen), pero supongo que fue un remedio rápido para que compilara.

Saludos y gracias por el código! Será útil para escribir un CRPGlmt (y lo probaré de cargarlo en un wxTreeCtrl cuando pruebe el editor, que emplea wxWidgets).

Me he estado informando sobre los formatos e incluso trabajando el la lectura de los mismos con el SDK y ya puedo leer casi todo menos Lmt porque tiene una estructura especial.

Vean esto:



Es la imagen desde un editor hexadesimal del RPG_RT.ldb la base de datos del rpgmaker 2000/2003.No esta encriptado, incluso algunos datos se pueden leer a simple vista.

Primero tenemos obviamente la cabecera del archivo pero después sucede algo interesante, si se observan con atención los números de la derecha y los números de la izquierda , hay un patrón. El patrón es el siguiente ID de fila, ID de columna, Tamaño y el dato en cuestion. En los casos de cadenas podemos leerlos con facilidad, noten como el 04 corresponde a alex una cadena de 4 charas de longitud. Al dato siguiente Soldado lo antecede un 02 07, 7 es el tamaño de charas en soldado y 2 es su id.
Seguramente asi es como sue445 y WhoopA obtuvieron las direcciones y la documentación.

Pues bien en el código del sdk la funcion que se encarga de darte el tamaño de los datos, la fila y columna se llama ReadBerNumber() y permite el desplasamiento atravez de los archivos. Pero esta no funciona para el Lmt porque su estructura es un poco diferente.

Aquí el ejemplo,


Nota como los datos de 00 01 0A corresponden igual al numero de fila columna y tamaño de la string, pero estan precedidos por un 03 que representa le numero de elementos del arbol y este esta justo después de la cabecera.

En otras palabras no contamos con datos como el tamaño del array que si esta incluido para otros casos, tenemos filas y colmunas pero no tipos como en los otros casos, por lo que no es posible leerlo de la misma forma.

Yo los datos que me interesan leer son .....

RPG_RT.ldb
Map0XXX.lmu
RPG_RT.lmt
SaveXX.lsd

De lo de los códigos hexadecimales ya no me parecen tan útiles aunque cualquier otra información me seria de utilidad.

P1: sigo de vacaciones, ya que si no lo estuviera ya hubiese terminado esto=P.
Ese 0x03 corresponde con un array global que contiene dentro todo o prácticamente todo el archivo. Todo lo que pude traducir acerca del LMT está aquí:

http://easyrpg.rpgmaker.es/wiki/doku.php...ormats:lmt

Según la documentación, y según las pruebas que he hecho, ese númerosí que parece el valor de array, indicando el número de filas. Si es 1 es que tiene ya raíz, si es 2 es que tiene 1 mapa (raíz más 1 rama), si es 3 es que tiene 2 mapas (raíz más 2 mapas...)

Por tanto el comportamiento sí que es válido para una estructura de datos típica del formato de array de fila y columna típico de rpg maker: valor 1: raíz, obligada, id 0000, nombre del juego (cadena que se encuentra en la raíz), si tiene valor 2 es que tiene aparte de la raíz id 0000 un mapa, id 0001, nombre del mapa (y así sucesivamente)

Aunque el nombre del juego esté en el .ini, el editor tiene en cuenta también el dato del lmt, que está el título duplicado, aunque tiene prioridad el del .ini si éste existe, a la hora de editar o ejecutar el juego.

Con el LSD pasaría algo similar, explicado aquí:

http://easyrpg.rpgmaker.es/wiki/doku.php...ormats:lsd

Byes!

Cita:
Ese 0x03 corresponde con un array global que contiene dentro todo o prácticamente todo el archivo. Todo lo que pude traducir acerca del LMT está aquí:


Esto no nos sirve de mucho ya que no tenemos el tamaño del buffer a leer, pongo el ejemplo del CRpgLdb que también tiene un array bidimensional

Código:
while(!IsEof()){

        type = ReadBerNumber();
        buf = ReadData();

        switch(type){
        case 0x14:    // Tileset
            array2 = CRpgUtil::GetArray2(buf);
            max = array2.GetMaxRow();
            saChipSet.Resize(max+1);
            for(id = 1; id<=max; id++){
                saChipSet[id].strName = array2.GetString(id, 0x01);
                saChipSet[id].strFile = array2.GetString(id, 0x02);
            }
            break;

        }


La función ReadBerNumber() nos indica el tipo de bloque que más tarde identificamos en en el switch pero ReadData() se encarga del llenado del búfer e internamente tiene otro ReadBerNumber que le indica el numero de elementos a leer para llenar el buffer, en otras palabras el buffer contiene toda la información del tipo que mas tarde es trasladada al array bidimensional y de hay casteada y pasada a la estructura.

Esto no funciona en el LMT porque justo después de el 0x03 tenemos la información directa de los datos (fila, columna, tamaño de dato, dato), en otras palabras no tenemos información para llenar el bufer del tipo.
Podríamos no usar un buffer pero esto seria algo inestable para LMT grandes.

Lo mejor seria creo yo, sacar de alguna forma cuanto espacio ocupa los bloques de cada mapa y el bloque del titulo.

Haber como lo resuelvo.....

Ya tengo la solucion pero esta un poco brute-force, ya puedo leer todos los datos pero para hacerlo necesito creo u nbufer de tamaño mayor al necesario , y luego reposiciono el iterador, el ultimo dato es esta en la fila 33 con eso calculo su tamaño, cada bloque es dinamico y tiene su propio tamaño. =P

Luego lo posteo todos los archivos cuando esten completos.

Gracias por la ayuda

Pd: seria bueno que definiéramos de una buena vez nuestros propios formatos para la la base de datos, los mapas, el arbol de mapas y los saves, no podremos usar por siempre los del rm2k porque supongo tiene copy-right o no? además seria mucho cool solo hacer trasformaciones de los formatos del maker a nuestros formatos que manejar los mismos.

Páginas: 1 2
URLs de Referencia