Registrarse

[Script] Hacks simples - Más comandos de script

Kaiser de Emperana

Called in hand
Para dejar de hacer tantos temas. Creo este donde voy a ir poniendo una serie de hacks simples. Por ahora uno sólo pero bueno

Voy a ir creando una carpeta por cada uno de los hacks en este repositorio:
https://github.com/kaisermg5/simple-gen3-hacks

Todos se van a insertar igual. Necesitan:
- devkitARM
- Armips
- Cygwin, con el paquete make
- Un editor de texto que soporte UTF-8. Pueden usar wordpad; como siempre, yo recomiendo Notepadd++.
En este tutorial explica como instalarlos.

Ponen su hack con el nombre BPRE.gba o BPEE.gba, según cual sea su base, en la carpeta del hack específico (no del repositorio).
Con el editor de texto abren el archivo main.s y cambian el offset de la línea:
Código:
insert_at equ 0x08f00000
Por el offset (+ 0x08000000) donde quieran insertar el hack.

Luego, desde cywing hacen cd al directorio del hack específico. Suponiendo el hack para asignar una flag a la mochila, sería algo como:
Código:
cd "C:/path/al/repositorio/simple-gen3-hacks/disable-bag"
Y luego ejecutan "make bpee", si su base es emerald o "make bpre", si su base es fire red.
Cuando termine la compilación. Va a aparecer su rom con el hack insertado en la carpeta "build/[CODIGO DE SU ROM]"

Yo voy a ir haciendo lo hacks para estas dos bases. Pero si alguien portea algo a ruby o alguna rom en español, avise y actualizo.


Ahora el hack los hacks:

Básicamente hacer que la mochila funcione como el menú pokemon y la pokedex. Si una flag está activada, aparece en el menú, sino no.

De paso también hice que si la flag está desactivada la mochila no se pueda usar en combate. Que vamos, si no tenés la mochila no la deberías de tener en ningún lugar.

Este hack está en la directorio "disable-bag".
Para seleccionar el número de la flag a usar tienen que editar, en el archivo "include/flags.h", la línea:
Código:
#define FLAG_SYS_BAG_GET         0x200
Cambiando 0x200 por el número de flag que prefieran. Si no lo cambian, obviamente funciona con la flag 0x200...

Luego siguen los pasos mencionados al principio.

Este es un hack que agrega unos comandos de script nuevos. Para hacer una serie de cosas de forma más sencilla. Voy a ir agregando nuevos comandos con el paso del tiempo, así que si usan este hack en su rom, recomiendo hacer un parche que lo quite justo despues de insetarlo. Así si luego quieren "actualizarlo" insertando el hack de vuelta, no están desperdiciando espacio.
Por cierto, escucho recomendaciones para comandos de script que sería útiles.

El hack en sí se inserta como lo explica al principio. Pero los más listos se habrán dado cuenta de un problema. "XSE no tiene programados estos comandos, así no los puedo usar..."

Bueno ya va siendo hora de que tiren XSE a la basura y se pasen a Red Alien, hecho por nuestro amigo @cosarara97
Red alien te permite modificar fácilmente la lista de comandos que usa. En el repositorio del hack hay un archivo llamado "ASC_commands.txt", que tiene la lista de los nuevos comandos que deben agregar a Red Alien.
Estos comandos los deben agregar en el archivo de texto "commands.txt" de la carpeta data de Red Alien.

A día de hoy, los contenidos de los dos archivos son:
Código:
    "getmondata": {"hex": 0xe3, 
                    "args": ("pokemon_num, field, lower_half_var, upper_half_var", 
                            (1, 1, 2, 2))},
    "setmondata": {"hex": 0xe4, "args": ("mode, pokemon_num, field, data", (1, 1, 1, 4))},
    "createmon": {"hex": 0xe5, 
                    "args": ("pokemon_num, species, level, fixed_IV, has_fixed_personality, " + \
                        "fixed_personality, OT_ID_type, fixed_OT_ID", (1, 2, 1, 1, 1, 4, 1, 4))},
    "bufferedmondoaction": {"hex": 0xe6, "args": ("action", (1,))},
    "varrandom": {"hex": 0xe7, "args": ("var_num", (2,))},
    "extendscripts": {"hex": 0xe8 },
    "distendscripts": {"hex": 0xe9 },
    "loadsprite": {"hex": 0xea, "args": ("index, size, image_ptr, palette_ptr, x, y, priority", 
                                            (1, 1, 4, 4, 2, 2, 1))},
    "unloadsprite": {"hex": 0xeb, "args": ("index", (1,))},

Código:
[COLOR="gray"]#!/usr/bin/env python
#This file is part of ASC.

#    ASC 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 3 of the License, or
#    (at your option) any later version.

#    ASC 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 ASC.  If not, see <http://www.gnu.org/licenses/>.

# This will be exec()ed by the python interpreter at runtime.

# Documentation for writing this table was taken from Score_Under's
# pokedef.h

# Format:
# {
#        [[["<command_name>": {["hex":"<hex value>"],
#                           ["args": ("<description>",
#                            (<arg> [[[arg], arg], ...] ))]},
#        ...], ...]}
#

# Commands
({
    "nop0": {"hex": 0x00},
    "nop1": {"hex": 0x01},
    "end": {"hex": 0x02},
    "return": {"hex": 0x03},
    "call": {"hex": 0x04, "args": ("adress", (4,)),
             "offset": [(0, "script")]},
    "jump": {"hex": 0x05, "args": ("adress", (4,)),
             "offset": [(0, "script")]},
    "jumpif": {"hex": 0x06, "args": ("ops, adress", (1, 4)),
               "offset": [(1, "script")]},
    "callif": {"hex": 0x07, "args": ("ops, adress", (1, 4)),
               "offset": [(1, "script")]},
    "jumpstd": {"hex": 0x08, "args": ("type", (1,))},
    "callstd": {"hex": 0x09, "args": ("type", (1,))},
    "jumpstdif": {"hex": 0x0A, "args": ("ops, type", (1, 1))},
    "callstdif": {"hex": 0x0B, "args": ("ops, type", (1, 1))},
    "jumpram": {"hex": 0x0C},
    "killscript": {"hex": 0x0E},
    "setbyte": {"hex": 0x0D, "args": ("byte", (1,))},
    "loadpointer": {"hex": 0x0F, "args": ("offset", (4,), b"\x00"),
                    "offset": [(0, "text")]},
    "setbyte2": {"hex": 0x10, "args": ("bank, byte", (1, 1))},
    "writebytetooffset": {"hex": 0x11, "args": ("byte, adress", (1, 4))},
    "loadbytefrompointer": {"hex": 0x12, "args": ("byte, adress", (1, 4))},
    "setfarbyte": {"hex": 0x13, "args": ("byte, adress", (1, 4))},
    "copyscriptbanks": {"hex": 0x14, "args": ("bank, bank", (1, 1))},
    "copybyte": {"hex": 0x15, "args": ("adress, adress", (4, 4))},
    "setvar": {"hex": 0x16, "args": ("var, value", (2, 2))},
    "addvar": {"hex": 0x17, "args": ("var, value", (2, 2))},
    "subtractvar": {"hex": 0x18, "args": ("var, value", (2, 2))},
    "copyvar": {"hex": 0x19, "args": ("var, var", (2, 2))},
    "copyvarifnotzero": {"hex": 0x1A, "args": ("var, var", (2, 2))},
    "comparebanks": {"hex": 0x1B, "args": ("bank, bank", (1, 1))},
    "comparevartobyte": {"hex": 0x1C, "args": ("var, byte", (2, 1))},
    "comparevartofarbyte": {"hex": 0x1D, "args": ("var, adress", (2, 4))},
    "comparefarbytetovar": {"hex": 0x1E, "args": ("adress, var", (4, 2))},
    "comparefarbytetobyte": {"hex": 0x1F, "args": ("adress, byte", (4, 1))},
    "comparefarbytetofarbyte": {"hex": 0x20, "args": ("adress, address",
                                                      (4, 4))},
    "compare": {"hex": 0x21, "args": ("var, val", (2, 2))},
    "comparevars": {"hex": 0x22, "args": ("var, val", (2, 2))},
    "callasm": {"hex": 0x23, "args": ("address", (4,))},
    "callasm2": {"hex": 0x24, "args": ("address", (4,))},
    "special": {"hex": 0x25, "args": ("type", (2,))},
    "special2": {"hex": 0x26, "args": ("var, type", (2, 2))},
    "waitspecial": {"hex": 0x27},
    "pause": {"hex": 0x28, "args": ("time", (2,))},
    "setflag": {"hex": 0x29, "args": ("flag", (2,))},
    "clearflag": {"hex": 0x2A, "args": ("flag", (2,))},
    "checkflag": {"hex": 0x2B, "args": ("flag", (2,))},
    # 2 unknown commands TODO: Ask what's in XSE
    "resetvars": {"hex": 0x2E},
    "sound": {"hex": 0x2F, "args": ("id", (2,))},
    "cry": {"hex": 0x30, "args": ("bank, poke", (1, 2))},
    "fanfare": {"hex": 0x31, "args": ("sound", (2,))},
    "waitfanfare": {"hex": 0x32},
    "playsound": {"hex": 0x33, "args": ("sound, effect", (2, 1))},
    "playsong": {"hex": 0x34, "args": ("song", (2,))},
    "fadedefault": {"hex": 0x35},
    "fadesong": {"hex": 0x36, "args": ("song", (2,))},
    "fadeout": {"hex": 0x37, "args": ("???", (1,))},
    "fadein": {"hex": 0x38, "args": ("???", (1,))},
    "warp": {"hex": 0x39, "args": ("bank, map, warp", (1, 1, 1))},
                            # TODO: FR
                            #supports additional x(2), y(2)
                            # (the same with all types of warps)
    "warpmutted": {"hex": 0x3A, "args": ("bank, map, warp", (1, 1, 1))},
    "warpwalking": {"hex": 0x3B, "args": ("bank, map, warp", (1, 1, 1))},
    "falldownhole": {"hex": 0x3C, "args": ("bank, map, warp", (1, 1, 1))},
    "warpteleport": {"hex": 0x3D, "args": ("bank, map, warp", (1, 1, 1))},
    "warp3": {"hex": 0x3E, "args": ("bank, map, warp", (1, 1, 1))},
    "warpelevator": {"hex": 0x3F, "args": ("bank, map, warp", (1, 1, 1))},
    "warp4": {"hex": 0x40, "args": ("bank, map, warp", (1, 1, 1))},
    "warp5": {"hex": 0x41, "args": ("bank, map, warp", (1, 1, 1))},
    "getplayerxy": {"hex": 0x42, "args": ("var, var", (2, 2))},
    "countpokemon": {"hex": 0x43},
    "additem": {"hex": 0x44, "args": ("item, num", (2, 2))},
    "removeitem": {"hex": 0x44, "args": ("item, num", (2, 2))},
    "checkitemspaceinbag": {"hex": 0x46, "args": ("item?, ???", (2, 2))},
    "checkitem": {"hex": 0x47, "args": ("item, num", (2, 2))},
    "checkitemtype": {"hex": 0x48, "args": ("item", (2,))},
    "giveitemtopc": {"hex": 0x49, "args": ("item, num", (2, 2))},
    "checkiteminpc": {"hex": 0x4A, "args": ("item, num", (2, 2))},
    "addfurniture": {"hex": 0x4B, "args": ("type", (2,))},
    "takefurniture": {"hex": 0x4C, "args": ("type", (2,))},
    "checkifroomforfurniture": {"hex": 0x4D, "args": ("type", (2,))},
    "checkfurniture": {"hex": 0x4E, "args": ("type", (2,))},
    "applymovement": {"hex": 0x4F, "args": ("minisprite, offset", (2, 4)),
                      "offset": [(1, "movs")]},
    # FIXME
    "applymovementfinishat": {"hex": 0x50, "args": ("minisprite, offset, x, y",
                                                    (2, 4, 1, 1)),
                              "offset": [(1, "movs")]},
    "pauseevent": {"hex": 0x51, "args": ("minisprite", (2,))},
    # ?
    "disappear": {"hex": 0x53, "args": ("minisprite", (2,))},
    "disappearat": {"hex": 0x54, "args": ("minisprite, x, y", (2, 1, 1))},
    "reappear": {"hex": 0x55, "args": ("minisprite", (2,))},
    "reappearat": {"hex": 0x56, "args": ("minisprite, x, y", (2, 1, 1))},
    "movesprite": {"hex": 0x57, "args": ("id, x, y", (2, 2, 2))},
    "farreappear": {"hex": 0x58, "args": ("minisprite, bank, map", (2, 1, 1))},
    "fardisappear": {"hex": 0x59, "args": ("minisprite, bank, map", (2, 1, 1))},
    "faceplayer": {"hex": 0x5A},
    "spriteface": {"hex": 0x5B, "args": ("sprite, face", (2, 1))},
    "trainerbattle": {"hex": 0x5C, "args": ("variable args", ()),
                      "vargs": (lambda args:
                                ((1, 2, 2, 4) +
                                 ((4,) if args[0] != 3 else ()) +
                                 ((4,) if args[0] in (1, 2, 4, 6, 7, 8) else ()) +
                                 ((4,) if args[0] in (6, 8) else ()))),
                      "vptr": (lambda args:
                               [(3, "text")] + ([(4, "text")] if args[0] != 3 else []))},
    #"trainerbattle": {"hex": 0x5C, "args": ("kind, num, ?, startmsg, defeatmsg",
    #                                        (1, 2, 2, 4, 4)),
    #                  "offset": [(3, "text"), (4, "text")]},
    "lasttrainerbattle": {"hex": 0x5D},
    "endtrainerbattle": {"hex": 0x5E},
    "endtrainerbattle2": {"hex": 0x5F}, # TODO: Ask ASM guru difference
    "checktrainerflag": {"hex": 0x60, "args": ("flag", (2,))},
    "cleartrainerflag": {"hex": 0x61, "args": ("flag", (2,))},
    "settrainerflag": {"hex": 0x62, "args": ("flag", (2,))},
    # TODO: Ask ASM guru difference:
    "movesprite2": {"hex": 0x63, "args": ("id, x, y", (2, 2, 2))},
    "moveoffscreen": {"hex": 0x64, "args": ("sprite", (2,))},
    "spritebehave": {"hex": 0x65, "args": ("sprite, type", (2, 1))},
    "showmsg": {"hex": 0x66},
    "message": {"hex": 0x67, "args": ("addr", (4,))},
    "closemsg": {"hex": 0x68},
    "lock": {"hex": 0x69},
    "lockall": {"hex": 0x6A},
    "release": {"hex": 0x6B},
    "releaseall": {"hex": 0x6C},
    "waitbutton": {"hex": 0x6D},
    "showyesno": {"hex": 0x6E, "args": ("x, y", (1, 1))},
    "multichoice": {"hex": 0x6F, "args": ("x, y, list, able to cancel",
                                          (1, 1, 1, 1))},
    "multichoice2": {"hex": 0x70, "args": ("x, y, list, defchoice",
                                          (1, 1, 1, 1))},
    "multichoice3": {"hex": 0x71, "args": ("x, y, list, per row, "
                                           "able to cancel",
                                          (1, 1, 1, 1))},
    "showbox": {"hex": 0x72, "args": ("x, y, w, h",
                                          (1, 1, 1, 1))},
    "hidebox": {"hex": 0x73, "args": ("x, y, w, h",
                                          (1, 1, 1, 1))},
    "clearbox": {"hex": 0x74, "args": ("x, y, w, h",
                                          (1, 1, 1, 1))},
    "showpokepic": {"hex": 0x75, "args": ("var, x, y", (2, 1, 1))},
    "hidepokepic": {"hex": 0x76},
    "picture": {"hex": 0x77, "args": ("num", (1,))},
    "braille": {"hex": 0x78, "args": ("addr", (4,))},
    "addpokemon": {"hex": 0x79, "args": ("poke, lvl, item, ??, ??, ??",
                                         (2, 1, 2, 1, 4, 4))},
    "giveegg": {"hex": 0x7a, "args": ("poke", (2,))},
    "setpokemonpp": {"hex": 0x7b, "args": ("pkmslot, atkslot, pp",
                                           (1, 1, 2))},
    "checkattack": {"hex": 0x7c, "args": ("attk", (2,))},
    "storepokemon": {"hex": 0x7d, "args": ("txt_var, poke", (1, 2))},
    "storefirstpokemon": {"hex": 0x7e, "args": ("txt_var", (1,))},
    "storepartypokemon": {"hex": 0x7f, "args": ("txt_var, pos", (1, 2))},
    "storeitem": {"hex": 0x80, "args": ("txt_var, itm", (1, 2))},
    "storefurniture": {"hex": 0x81, "args": ("txt_var, itm", (1, 2))},
    "storeattack": {"hex": 0x82, "args": ("txt_var, atk", (1, 2))},
    "storevar": {"hex": 0x83, "args": ("txt_var, var", (1, 2))},
    "storecomp": {"hex": 0x84, "args": ("txt_var, comp", (1, 2))},
    "storetext": {"hex": 0x85, "args": ("txt_var, txt", (1, 4))},
    "pokemart": {"hex": 0x86, "args": ("mart", (4,))},
    "pokemart2": {"hex": 0x87, "args": ("ptr", (4,))},
    "fakejumpstd": {"hex": 0x88, "args": ("type", (1,))}, # FR
    "pokemart3": {"hex": 0x88, "args": ("ptr", (4,))}, # RB
    "fakecallstd": {"hex": 0x89, "args": ("type", (1,))}, # FR
    "slotmachine": {"hex": 0x89, "args": ("??", (2,))}, # RB
    #"8a": {"hex": 0x8a, "args": ("?,?,t", (1, 1, 1))},
    "choosecontestpokemon": {"hex": 0x8b},
    "startcontest": {"hex": 0x8c},
    "startwireless": {"hex": 0x8e}, # emerald only
    "random": {"hex": 0x8F, "args": ("max?", (2,))},
    "givemoney": {"hex": 0x90, "args": ("amt, ???", (4, 1))},
    "paymoney": {"hex": 0x91, "args": ("amt, ???", (4, 1))},
    "checkmoney": {"hex": 0x92, "args": ("amt, ???", (4, 1))},
    "showmoney": {"hex": 0x93, "args": ("x, y, ???", (1,1,1))},
    "hidemoney": {"hex": 0x94, "args": ("x, y", (1, 1))},
    "updatemoney": {"hex": 0x95, "args": ("?, ?, ?", (1, 1, 1))},
    # 0x96
    "fadescreen": {"hex": 0x97, "args": ("blank", (1,))},
    "fadescreendelay": {"hex": 0x98, "args": ("blank, delay", (1, 1))},
    "darkenroom": {"hex": 0x99, "args": ("size", (2,))},
    "lightroom": {"hex": 0x9a, "args": ("size", (1,))},
    "msgbox2": {"hex": 0x9b, "args": ("ptr", (4,))},
    "doanimation": {"hex": 0x9c, "args": ("?", (2,))},
    "setanimation": {"hex": 0x9d, "args": ("?, ?", (1, 2))},
    "checkanimation": {"hex": 0x9e, "args": ("?", (2,))},
    "sethealingplace": {"hex": 0x9f, "args": ("place", (2,))},
    "checkgender": {"hex": 0xa0},
    "cryfr": {"hex": 0xa1, "args": ("?, )", (2, 1))},
    "setmaptile": {"hex": 0xa2, "args": ("x, y, tile, attr", (2, 2, 2, 2))},
    "resetweather": {"hex": 0xa3},
    "setweather": {"hex": 0xa4, "args": ("weather", (1,))},
    "doweather": {"hex": 0xa5},
    "a6": {"hex": 0xa6, "args": ("?", (1,))},
    "setmapfooter": {"hex": 0xa7, "args": ("?", (2,))},
    "increasespritelevel": {"hex": 0xa8, "args": ("id, bank, map, ?",
                                                  (2, 1, 1, 1))},
    "resetspritelevel": {"hex": 0xa9, "args": ("id, bank, map", (2, 1, 1))},
    "createtempsprite": {"hex": 0xaa, "args":
                      ("spr, id, x, y, behave, dir",
                       (1, 1, 2, 2, 1, 1))},
    "tempspriteface": {"hex": 0xab, "args": ("id, dir", (1, 1))},
    "setdooropened": {"hex": 0xac, "args": ("?, ?", (2, 2))},
    "setdoorclosed": {"hex": 0xad, "args": ("?, ?", (2, 2))},
    "doorchange": {"hex": 0xae},
    "setdooropenedstatic": {"hex": 0xaf, "args": ("?, ?", (2, 2))},
    "setdoorclosedstatic": {"hex": 0xb0, "args": ("?, ?", (2, 2))},
    #"b1": {"hex": 0xb1, "args": ("?, ?", (1, 1, 2, 2))},
    #"b2": {"hex": 0xb2, "args": ("?,?, ")},
    "coincasetovar": {"hex": 0xb3, "args": ("var", (2,))},
    "givetocoincase": {"hex": 0xb4, "args": ("coins", (2,))},
    "takefromcoincase": {"hex": 0xb5, "args": ("coins", (2,))},
    "battle": {"hex": 0xb6, "args": ("poke, lvl, item", (2, 1, 2))},
    "lastbattle": {"hex": 0xb7},
    "showcoins": {"hex": 0xc0, "args": ("x, y", (1, 1))},
    "hidecoins": {"hex": 0xc1, "args": ("x, y", (1, 1))},
    "updatecoins": {"hex": 0xc2, "args": ("x, y", (1, 1))},
    "c3": {"hex": 0xc3, "args": ("??", (1,))},
    "warp6": {"hex": 0xc4, "args": ("bnk, map, ext, x, y",
                                    (1, 1, 1, 2, 2))},
    "waitcry": {"hex": 0xc5},
    #"storeboxname": {"hex": 0xc6, "args": ("\v\hxx(1) boxno(2)")},
    "storeboxname": {"hex": 0xc6, "args": ("buf, boxno", (1, 2))},
    "textcolor": {"hex": 0xc7, "args": ("colour", (1,))},
    "msgboxsign": {"hex": 0xca},
    "msgboxnormal": {"hex": 0xcb},
    "comparehiddenvar": {"hex": 0xcc, "args": ("var, val", (1, 2))},
    "setobedience": {"hex": 0xcd, "args": ("id", (2,))},
    "checkobedience": {"hex": 0xce, "args": ("id", (2,))},
    "executeram": {"hex": 0xcf},
    "setworldmapflag": {"hex": 0xd0, "args": ("flag", (2,))},
    "warpteleport2": {"hex": 0xd1,
            "args": ("bnk, map, ext, x, y", (1, 1, 1, 2, 2))},
    "setcatchlocation": {"hex": 0xd2, "args": ("id, loc", (2, 1))},
    #"d3": {"hex": 0xd3, "args": ("braille", (4,))},
    "storeitems": {"hex": 0xd4, "args": ("?, id, amt", (1, 2, 2))},
    #"fb": {"hex": 0xfb, "args": ("addr", (4))},
    #"fe": {"hex": 0xfe, "args": ("?", (1,))},[/COLOR]

[B][COLOR="Red"]    },[/COLOR][/B]

[COLOR="Gray"]# Aliases
# format:    Alias:normal_name
{"waitmovement": "pauseevent",
 "givepokemon": "addpokemon",
 "giveitem": "additem",
 "wildbattle": "battle",
 "goto": "jump",
 "closeonkeypress": "closemsg",
 "msgbox": "loadpointer",
 "loadptr": "loadpointer",
 "hidesprite": "disappear",
 "showsprite": "reappear",
 "nop": "nop0",
 "subvar": "subtractvar",
 "waitstate": "waitspecial"},
# ends
["end", "jump", "return"]
)[/COLOR]
Los archivos puede que cambien con el tiempo, y yo no voy a actualizar este mensaje cada vez que pase. Pero el procedimiento es el mismo.

Ignoren todos los contenidos pintados en gris. Lo importante es la llave pintada en rojo.
Ustedes debe agregar los contenidos del archivo "ASC_commands.txt" justo encima de esa llave (que es la que cierra el primer par de llaves del archivo de texto).

Código:
#!/usr/bin/env python
#This file is part of ASC.

#    ASC 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 3 of the License, or
#    (at your option) any later version.

#    ASC 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 ASC.  If not, see <http://www.gnu.org/licenses/>.

# This will be exec()ed by the python interpreter at runtime.

# Documentation for writing this table was taken from Score_Under's
# pokedef.h

# Format:
# {
#        [[["<command_name>": {["hex":"<hex value>"],
#                           ["args": ("<description>",
#                            (<arg> [[[arg], arg], ...] ))]},
#        ...], ...]}
#

# Commands
({
    "nop0": {"hex": 0x00},
    "nop1": {"hex": 0x01},
    "end": {"hex": 0x02},
    "return": {"hex": 0x03},
    "call": {"hex": 0x04, "args": ("adress", (4,)),
             "offset": [(0, "script")]},
    "jump": {"hex": 0x05, "args": ("adress", (4,)),
             "offset": [(0, "script")]},
    "jumpif": {"hex": 0x06, "args": ("ops, adress", (1, 4)),
               "offset": [(1, "script")]},
    "callif": {"hex": 0x07, "args": ("ops, adress", (1, 4)),
               "offset": [(1, "script")]},
    "jumpstd": {"hex": 0x08, "args": ("type", (1,))},
    "callstd": {"hex": 0x09, "args": ("type", (1,))},
    "jumpstdif": {"hex": 0x0A, "args": ("ops, type", (1, 1))},
    "callstdif": {"hex": 0x0B, "args": ("ops, type", (1, 1))},
    "jumpram": {"hex": 0x0C},
    "killscript": {"hex": 0x0E},
    "setbyte": {"hex": 0x0D, "args": ("byte", (1,))},
    "loadpointer": {"hex": 0x0F, "args": ("offset", (4,), b"\x00"),
                    "offset": [(0, "text")]},
    "setbyte2": {"hex": 0x10, "args": ("bank, byte", (1, 1))},
    "writebytetooffset": {"hex": 0x11, "args": ("byte, adress", (1, 4))},
    "loadbytefrompointer": {"hex": 0x12, "args": ("byte, adress", (1, 4))},
    "setfarbyte": {"hex": 0x13, "args": ("byte, adress", (1, 4))},
    "copyscriptbanks": {"hex": 0x14, "args": ("bank, bank", (1, 1))},
    "copybyte": {"hex": 0x15, "args": ("adress, adress", (4, 4))},
    "setvar": {"hex": 0x16, "args": ("var, value", (2, 2))},
    "addvar": {"hex": 0x17, "args": ("var, value", (2, 2))},
    "subtractvar": {"hex": 0x18, "args": ("var, value", (2, 2))},
    "copyvar": {"hex": 0x19, "args": ("var, var", (2, 2))},
    "copyvarifnotzero": {"hex": 0x1A, "args": ("var, var", (2, 2))},
    "comparebuffers": {"hex": 0x1B, "args": ("buffer, buffer", (2, 2))},
    "comparevartobyte": {"hex": 0x1C, "args": ("var, byte", (2, 1))},
    "comparevartofarbyte": {"hex": 0x1D, "args": ("var, adress", (2, 4))},
    "comparefarbytetovar": {"hex": 0x1E, "args": ("adress, var", (4, 2))},
    "comparefarbytetobyte": {"hex": 0x1F, "args": ("adress, byte", (4, 1))},
    "comparefarbytetofarbyte": {"hex": 0x20, "args": ("adress, address",
                                                      (4, 4))},
    "compare": {"hex": 0x21, "args": ("var, val", (2, 2))},
    "comparevars": {"hex": 0x22, "args": ("var, val", (2, 2))},
    "callasm": {"hex": 0x23, "args": ("address", (4,))},
    "callasm2": {"hex": 0x24, "args": ("address", (4,))},
    "special": {"hex": 0x25, "args": ("type", (2,))},
    "special2": {"hex": 0x26, "args": ("var, type", (2, 2))},
    "waitspecial": {"hex": 0x27},
    "pause": {"hex": 0x28, "args": ("time", (2,))},
    "setflag": {"hex": 0x29, "args": ("flag", (2,))},
    "clearflag": {"hex": 0x2A, "args": ("flag", (2,))},
    "checkflag": {"hex": 0x2B, "args": ("flag", (2,))},
    # 2 unknown commands TODO: Ask what's in XSE
    "resetvars": {"hex": 0x2E},
    "sound": {"hex": 0x2F, "args": ("id", (2,))},
    "cry": {"hex": 0x30, "args": ("bank, poke", (1, 2))},
    "fanfare": {"hex": 0x31, "args": ("sound", (2,))},
    "waitfanfare": {"hex": 0x32},
    "playsound": {"hex": 0x33, "args": ("sound, effect", (2, 1))},
    "playsong": {"hex": 0x34, "args": ("song", (2,))},
    "fadedefault": {"hex": 0x35},
    "fadesong": {"hex": 0x36, "args": ("song", (2,))},
    "fadeout": {"hex": 0x37, "args": ("???", (1,))},
    "fadein": {"hex": 0x38, "args": ("???", (1,))},
    "warp": {"hex": 0x39, "args": ("bank, map, warp", (1, 1, 1))},
                            # TODO: FR
                            #supports additional x(2), y(2)
                            # (the same with all types of warps)
    "warpmutted": {"hex": 0x3A, "args": ("bank, map, warp", (1, 1, 1))},
    "warpwalking": {"hex": 0x3B, "args": ("bank, map, warp", (1, 1, 1))},
    "falldownhole": {"hex": 0x3C, "args": ("bank, map, warp", (1, 1, 1))},
    "warpteleport": {"hex": 0x3D, "args": ("bank, map, warp", (1, 1, 1))},
    "warp3": {"hex": 0x3E, "args": ("bank, map, warp", (1, 1, 1))},
    "warpelevator": {"hex": 0x3F, "args": ("bank, map, warp", (1, 1, 1))},
    "warp4": {"hex": 0x40, "args": ("bank, map, warp", (1, 1, 1))},
    "warp5": {"hex": 0x41, "args": ("bank, map, warp", (1, 1, 1))},
    "getplayerxy": {"hex": 0x42, "args": ("var, var", (2, 2))},
    "countpokemon": {"hex": 0x43},
    "additem": {"hex": 0x44, "args": ("item, num", (2, 2))},
    "removeitem": {"hex": 0x44, "args": ("item, num", (2, 2))},
    "checkitemspaceinbag": {"hex": 0x46, "args": ("item?, ???", (2, 2))},
    "checkitem": {"hex": 0x47, "args": ("item, num", (2, 2))},
    "checkitemtype": {"hex": 0x48, "args": ("item", (2,))},
    "giveitemtopc": {"hex": 0x49, "args": ("item, num", (2, 2))},
    "checkiteminpc": {"hex": 0x4A, "args": ("item, num", (2, 2))},
    "addfurniture": {"hex": 0x4B, "args": ("type", (2,))},
    "takefurniture": {"hex": 0x4C, "args": ("type", (2,))},
    "checkifroomforfurniture": {"hex": 0x4D, "args": ("type", (2,))},
    "checkfurniture": {"hex": 0x4E, "args": ("type", (2,))},
    "applymovement": {"hex": 0x4F, "args": ("minisprite, offset", (2, 4)),
                      "offset": [(1, "movs")]},
    "applymovementfinishat": {"hex": 0x50, "args": ("minisprite, offset"
                                                    "x, y",
                                                    (2, 4, 1, 1)),
                              "offset": [(1, "movs")]},
    "pauseevent": {"hex": 0x51, "args": ("minisprite", (2,))},
    # ?
    "disappear": {"hex": 0x53, "args": ("minisprite", (2,))},
    "disappearat": {"hex": 0x54, "args": ("minisprite, x, y", (2, 1, 1))},
    "reappear": {"hex": 0x55, "args": ("minisprite", (2,))},
    "reappearat": {"hex": 0x56, "args": ("minisprite, x, y", (2, 1, 1))},
    "movesprite": {"hex": 0x57, "args": ("id, x, y", (2, 2, 2))},
    "farreappear": {"hex": 0x58, "args": ("minisprite, bank, map", (2, 1, 1))},
    "fardisappear": {"hex": 0x59, "args": ("minisprite, bank, map", (2, 1, 1))},
    "faceplayer": {"hex": 0x5A},
    "spriteface": {"hex": 0x5B, "args": ("sprite, face", (2, 1))},
    "trainerbattle": {"hex": 0x5C, "args": ("kind, num, ?, startmsg, defeatmsg",
                                            (1, 2, 2, 4, 4)),
                      "offset": [(3, "text"), (4, "text")]},
    "lasttrainerbattle": {"hex": 0x5D},
    "endtrainerbattle": {"hex": 0x5E},
    "endtrainerbattle2": {"hex": 0x5F}, # TODO: Ask ASM guru difference
    "checktrainerflag": {"hex": 0x60, "args": ("flag", (2,))},
    "cleartrainerflag": {"hex": 0x61, "args": ("flag", (2,))},
    "settrainerflag": {"hex": 0x62, "args": ("flag", (2,))},
    # TODO: Ask ASM guru difference:
    "movesprite2": {"hex": 0x63, "args": ("id, x, y", (2, 2, 2))},
    "moveoffscreen": {"hex": 0x64, "args": ("sprite", (2,))},
    "spritebehave": {"hex": 0x65, "args": ("sprite, type", (2, 1))},
    "showmsg": {"hex": 0x66},
    "message": {"hex": 0x67, "args": ("addr", (4,))},
    "closemsg": {"hex": 0x68},
    "lock": {"hex": 0x69},
    "lockall": {"hex": 0x6A},
    "release": {"hex": 0x6B},
    "releaseall": {"hex": 0x6C},
    "waitbutton": {"hex": 0x6D},
    "showyesno": {"hex": 0x6E, "args": ("x, y", (1, 1))},
    "multichoice": {"hex": 0x6F, "args": ("x, y, list, able to cancel",
                                          (1, 1, 1, 1))},
    "multichoice2": {"hex": 0x70, "args": ("x, y, list, defchoice",
                                          (1, 1, 1, 1))},
    "multichoice3": {"hex": 0x71, "args": ("x, y, list, per row, "
                                           "able to cancel",
                                          (1, 1, 1, 1))},
    "showbox": {"hex": 0x72, "args": ("x, y, w, h",
                                          (1, 1, 1, 1))},
    "hidebox": {"hex": 0x73, "args": ("x, y, w, h",
                                          (1, 1, 1, 1))},
    "clearbox": {"hex": 0x74, "args": ("x, y, w, h",
                                          (1, 1, 1, 1))},
    "showpokepic": {"hex": 0x75, "args": ("var, x, y", (2, 1, 1))},
    "hidepokepic": {"hex": 0x76},
    "picture": {"hex": 0x77, "args": ("num", (1,))},
    "braille": {"hex": 0x78, "args": ("addr", (4,))},
    "addpokemon": {"hex": 0x79, "args": ("poke, lvl, item, ??, ??, ??",
                                         (2, 1, 2, 1, 4, 4))},
    "giveegg": {"hex": 0x7a, "args": ("poke", (2,))},
    "setpokemonpp": {"hex": 0x7b, "args": ("pkmslot, atkslot, pp",
                                           (1, 1, 2))},
    "checkattack": {"hex": 0x7c, "args": ("attk", (2,))},
    "storepokemon": {"hex": 0x7d, "args": ("txt_var, poke", (1, 2))},
    "storefirstpokemon": {"hex": 0x7e, "args": ("txt_var", (1,))},
    "storepartypokemon": {"hex": 0x7f, "args": ("txt_var, pos", (1, 2))},
    "storeitem": {"hex": 0x80, "args": ("txt_var, itm", (1, 2))},
    "storefurniture": {"hex": 0x81, "args": ("txt_var, itm", (1, 2))},
    "storeattack": {"hex": 0x82, "args": ("txt_var, atk", (1, 2))},
    "storevar": {"hex": 0x83, "args": ("txt_var, var", (1, 2))},
    "storecomp": {"hex": 0x84, "args": ("txt_var, comp", (1, 2))},
    "storetext": {"hex": 0x85, "args": ("txt_var, txt", (1, 4))},
    "pokemart": {"hex": 0x86, "args": ("mart", (4,))},
    "pokemart2": {"hex": 0x87, "args": ("ptr", (4,))},
    "fakejumpstd": {"hex": 0x88, "args": ("type", (1,))}, # FR
    "pokemart3": {"hex": 0x88, "args": ("ptr", (4,))}, # RB
    "fakecallstd": {"hex": 0x89, "args": ("type", (1,))}, # FR
    "slotmachine": {"hex": 0x89, "args": ("??", (2,))}, # RB
    #"8a": {"hex": 0x8a, "args": ("?,?,t", (1, 1, 1))},
    "choosecontestpokemon": {"hex": 0x8b},
    "startcontest": {"hex": 0x8c},
    "startwireless": {"hex": 0x8e}, # emerald only
    "random": {"hex": 0x8F, "args": ("max?", (2,))},
    "givemoney": {"hex": 0x90, "args": ("amt, ???", (4, 1))},
    "paymoney": {"hex": 0x91, "args": ("amt, ???", (4, 1))},
    "checkmoney": {"hex": 0x92, "args": ("amt, ???", (4, 1))},
    "showmoney": {"hex": 0x93, "args": ("x, y, ???", (1,1,1))},
    "hidemoney": {"hex": 0x94, "args": ("x, y", (1, 1))},
    "updatemoney": {"hex": 0x95, "args": ("?, ?, ?", (1, 1, 1))},
    # 0x96
    "fadescreen": {"hex": 0x97, "args": ("blank", (1,))},
    "fadescreendelay": {"hex": 0x98, "args": ("blank, delay", (1, 1))},
    "darkenroom": {"hex": 0x99, "args": ("size", (2,))},
    "lightroom": {"hex": 0x9a, "args": ("size", (1,))},
    "msgbox2": {"hex": 0x9b, "args": ("ptr", (4,))},
    "doanimation": {"hex": 0x9c, "args": ("?", (2,))},
    "setanimation": {"hex": 0x9d, "args": ("?, ?", (1, 2))},
    "checkanimation": {"hex": 0x9e, "args": ("?", (2,))},
    "sethealingplace": {"hex": 0x9f, "args": ("place", (2,))},
    "checkgender": {"hex": 0xa0},
    "cryfr": {"hex": 0xa1, "args": ("?, )", (2, 1))},
    "setmaptile": {"hex": 0xa2, "args": ("x, y, tile, attr", (2, 2, 2, 2))},
    "resetweather": {"hex": 0xa3},
    "setweather": {"hex": 0xa4, "args": ("weather", (1,))},
    "doweather": {"hex": 0xa5},
    "a6": {"hex": 0xa6, "args": ("?", (1,))},
    "setmapfooter": {"hex": 0xa7, "args": ("?", (2,))},
    "increasespritelevel": {"hex": 0xa8, "args": ("id, bank, map, ?",
                                                  (2, 1, 1, 1))},
    "resetspritelevel": {"hex": 0xa9, "args": ("id, bank, map", (2, 1, 1))},
    "createtempsprite": {"hex": 0xaa, "args":
                      ("spr, id, x, y, behave, dir",
                       (1, 1, 2, 2, 1, 1))},
    "tempspriteface": {"hex": 0xab, "args": ("id, dir", (1, 1))},
    "setdooropened": {"hex": 0xac, "args": ("?, ?", (2, 2))},
    "setdoorclosed": {"hex": 0xad, "args": ("?, ?", (2, 2))},
    "doorchange": {"hex": 0xae},
    "setdooropenedstatic": {"hex": 0xaf, "args": ("?, ?", (2, 2))},
    "setdoorclosedstatic": {"hex": 0xb0, "args": ("?, ?", (2, 2))},
    #"b1": {"hex": 0xb1, "args": ("?, ?", (1, 1, 2, 2))},
    #"b2": {"hex": 0xb2, "args": ("?,?, ")},
    "coincasetovar": {"hex": 0xb3, "args": ("var", (2,))},
    "givetocoincase": {"hex": 0xb4, "args": ("coins", (2,))},
    "takefromcoincase": {"hex": 0xb5, "args": ("coins", (2,))},
    "battle": {"hex": 0xb6, "args": ("poke, lvl, item", (2, 1, 2))},
    "lastbattle": {"hex": 0xb7},
    "showcoins": {"hex": 0xc0, "args": ("x, y", (1, 1))},
    "hidecoins": {"hex": 0xc1, "args": ("x, y", (1, 1))},
    "updatecoins": {"hex": 0xc2, "args": ("x, y", (1, 1))},
    "c3": {"hex": 0xc3, "args": ("??", (1,))},
    "warp6": {"hex": 0xc4, "args": ("bnk, map, ext, x, y",
                                    (1, 1, 1, 2, 2))},
    "waitcry": {"hex": 0xc5},
    #"storeboxname": {"hex": 0xc6, "args": ("\v\hxx(1) boxno(2)")},
    "storeboxname": {"hex": 0xc6, "args": ("buf, boxno", (1, 2))},
    "textcolor": {"hex": 0xc7, "args": ("colour", (1,))},
    "msgboxsign": {"hex": 0xca},
    "msgboxnormal": {"hex": 0xcb},
    "comparehiddenvar": {"hex": 0xcc, "args": ("var, val", (1, 2))},
    "setobedience": {"hex": 0xcd, "args": ("id", (2,))},
    "checkobedience": {"hex": 0xce, "args": ("id", (2,))},
    "executeram": {"hex": 0xcf},
    "setworldmapflag": {"hex": 0xd0, "args": ("flag", (2,))},
    "warpteleport2": {"hex": 0xd1,
            "args": ("bnk, map, ext, x, y", (1, 1, 1, 2, 2))},
    "setcatchlocation": {"hex": 0xd2, "args": ("id, loc", (2, 1))},
    #"d3": {"hex": 0xd3, "args": ("braille", (4,))},
    "storeitems": {"hex": 0xd4, "args": ("?, id, amt", (1, 2, 2))},
    #"fb": {"hex": 0xfb, "args": ("addr", (4))},
    #"fe": {"hex": 0xfe, "args": ("?", (1,))},


    "getmondata": {"hex": 0xe3, 
                    "args": ("pokemon_num, field, lower_half_var, upper_half_var", 
                            (1, 1, 2, 2))},
    "setmondata": {"hex": 0xe4, "args": ("mode, pokemon_num, field, data", (1, 1, 1, 4))},
    "createmon": {"hex": 0xe5, 
                    "args": ("pokemon_num, species, level, fixed_IV, has_fixed_personality, " + \
                        "fixed_personality, OT_ID_type, fixed_OT_ID", (1, 2, 1, 1, 1, 4, 1, 4))},
    "bufferedmondoaction": {"hex": 0xe6, "args": ("action", (1,))},
    "varrandom": {"hex": 0xe7, "args": ("var_num", (2,))},
    "extendscripts": {"hex": 0xe8 },
    "distendscripts": {"hex": 0xe9 },
    "loadsprite": {"hex": 0xea, "args": ("index, size, image_ptr, palette_ptr, x, y, priority", 
                                            (1, 1, 4, 4, 2, 2, 1))},
    "unloadsprite": {"hex": 0xeb, "args": ("index", (1,))},

    },

# Aliases
# format:    Alias:normal_name
{"waitmovement": "pauseevent",
 "givepokemon": "addpokemon",
 "giveitem": "additem",
 "wildbattle": "battle",
 "goto": "jump",
 "closeonkeypress": "closemsg",
 "msgbox": "loadpointer",
 "loadptr": "loadpointer",
 "hidesprite": "disappear",
 "showsprite": "reappear",
 "nop": "nop0",
 "subvar": "subtractvar",
 "waitstate": "waitspecial"},
# ends
["end", "jump", "return"]
)

Con eso Red Alien, va a reconocer los nuevos comandos.

Y repito. A día de hoy, esta lista funciona perfectamente. Pero con el tiempo se va a quedar obsoleta, así que deben realizar el procedimiento ustedes mismos.

Estos son comandos que permiten realizar acciones con los pokemon.

No se que le pasa al formato de esta cosa
Código:
HARDY		 0
LONELY		 1
BRAVE		 2
ADAMANT		 3
NAUGHTY		 4
BOLD		 5
DOCILE		 6
RELAXED		 7
IMPISH		 8
LAX			 9
TIMID		10
HASTY		11
SERIOUS		12
JOLLY		13
NAIVE		14
MODEST		15
MILD		16
QUIET		17
BASHFUL		18
RASH		19
CALM		20
GENTLE		21
SASSY		22
CAREFUL		23
QUIRKY		24

Código:
NATURE				255
OT_ID				 1
NICKNAME			 2
LANGUAGE			 3
SANITY_BIT1			 4
SANITY_BIT2			 5
SANITY_BIT3			 6
OT_NAME				 7
MARKINGS			 8
CHECKSUM			 9
MON_DATA_10			10
SPECIES				11
HELD_ITEM			12
MOVE1				13
MOVE2				14
MOVE3				15
MOVE4				16
PP1					17
PP2					18
PP3					19
PP4					20
PP_BONUSES			21
COOL				22
BEAUTY				23
CUTE				24
EXP					25
HP_EV				26
ATK_EV				27
DEF_EV				28
SPD_EV				29
SPATK_EV			30
SPDEF_EV			31
FRIENDSHIP			32
SMART				33
POKERUS				34
MET_LOCATION		35
MET_LEVEL			36
MET_GAME			37
POKEBALL			38
HP_IV				39
ATK_IV				40
DEF_IV				41
SPD_IV				42
SPATK_IV			43
SPDEF_IV			44
IS_EGG				45
ALT_ABILITY			46
TOUGH				47
SHEEN				48
OT_GENDER			49
COOL_RIBBON			50
BEAUTY_RIBBON		51
CUTE_RIBBON			52
SMART_RIBBON		53
TOUGH_RIBBON		54
STATUS				55
LEVEL				56
HP					57
MAX_HP				58
ATK					59
DEF					60
SPD					61
SPATK				62
SPDEF				63
MAIL				64
SPECIES2			65
IVS					66
CHAMPION_RIBBON		67
WINNING_RIBBON		68
VICTORY_RIBBON		69
ARTIST_RIBBON		70
EFFORT_RIBBON		71
GIFT_RIBBON_1		72
GIFT_RIBBON_2		73
GIFT_RIBBON_3		74
GIFT_RIBBON_4		75
GIFT_RIBBON_5		76
GIFT_RIBBON_6		77
GIFT_RIBBON_7		78
FATEFUL_ENCOUNTER	79
OBEDIENCE			80
KNOWN_MOVES			81
RIBBON_COUNT		82
RIBBONS				83
ATK2				84
DEF2				85
SPD2				86
SPATK2				87
SPDEF2				88

Código:
getmondata [pokemon_num] [campo] [var1] [var2]
Almacena el valor de una cualidad de un pokemon en dos variables.
pokemon_num: el numero de pokemon a consultar. Si el número es menor a 6 se usa como indice para el equipo de jugardor; sino para el del rival (siendo 6 su primer pokemon).
campo: ID del campo a consultar.
var1: variable donde se guardarán los primeros 2 bytes del campo consultado.
var2: varible donde se guardarán los segundos 2 bytes del resultado (si no se quiere poner 0)

Código:
setmondata [modo] [pokemon_num] [campo] [datos]
Cambia el valor de una cualidad de un pokemon en dos variables.
modo: la forma en que debe ser tratado el campo datos.
pokemon_num: el numero de pokemon a consultar. Si el número es menor a 6 se usa como indice para el equipo de jugardor; sino para el del rival (siendo 6 su primer pokemon).
campo: ID del campo a consultar.
Si el modo es 0: los datos son tratados como un número. El campo del pokemon tendrá el valor de ese número.

Si el modo es 1:el campo será tratado como un grupo de hasta dos variables. Supongamos que tenemos las siguientes variables con los siguientes valores:
Código:
VAR_8000 = 0x1234
VAR_4056 = 0xFFEE
Si el campo datos es igual a 0x40568000 (las dos variables): el valor que se le asignará a pokemon es, 0xFFEE1234.
Si el campo datos es igual a 0x4056: el valor asignado será 0xFFEE.
Si el campo datos es igual a 0x8000: el valor asignado será 0x1234.

Si el modo es 2: los datos son leidos como un puntero a los datos reales.

Código:
createmon [pokemon_num] [especie] [nivel] [IVs] [tipo_personalidad] [personalidad] [tipo_OT_ID] [OT_ID]"
Almacena el valor de una cualidad de un pokemon en dos variables.
pokemon_num: el numero de pokemon a consultar. Si el número es menor a 6 se usa como indice para el equipo de jugardor; sino para el del rival (siendo 6 su primer pokemon).
especie: especie del pokemon. Puede ser una variable.
nivel: nivel del pokemon.
IVs: ivs del pokemon, si es mayor que 31, los genera aleatoriamente.
tipo_personalidad: si es 0, genera un numer aleatorio, sino usa el valor provisto.
personalidad: valor de personalidad del pokemon, si tipo_personalidad es 0 este campo es ignorado.
tipo_OT_ID: si es 0, usa el id del jugador. Si es 1 lee el campo provisto. Si es 2 genera un número aleatorio, forzando que el pokemon NO sea shiny.
OT_ID: id del dueño del pokemon. Si tipo_OT_ID no es 1, este campo es ignorado.

Este comando debería ser usado en la mayoría de los casos con el número de pokemon 6. Si no sabés que número usar, es probablemente este.

Código:
bufferedmondoaction [acción]
Realiza una acción con el primer pokemon del rival (el número 6 de los otros comandos).
acción: número de acción a realizar.

Acciones disponibles de momento:
Código:
0  Dar el pokemon al jugador.
1  Intercambiar el pokemon por el pokemon del jugador cuya posición está guardada en la variable 0x8004
Escucho recomendaciones para acciones.

Código:
#dynamic 0x800000
#define OT_NAME 7
#define NICKNAME 2

#org @main
lock
setvar 0x8004 0 'Cambiar pokemon por el primer pokemon del jugador
loadpointer @msg1
callstd 0x6
createmon 0x6 0x9 0x5 32 0x0 0x0 0x1 0x123456 
'Crea un Blastoise nivel 5 con IV's aleatorios e ID de entrenador 0x123456 

setmondata 0x2 0x6 OT_NAME   [MENTION=38541]Trainer[/MENTION]
'Cambia el nombre del entrenador original por Juan

setmondata 0x2 0x6 NICKNAME   [MENTION=40100]nic[/MENTION]kname
'Cambia el mote del Blastoise a Pepe

bufferedmondoaction 0x1
'Intercambia el pokemon

loadpointer @msg2
callstd 0x6
release
end

#org @msg1
= ¡Cambiemos! $$

#org @msg2
= Yo no te obligué a nada...$$

#org   [MENTION=38541]Trainer[/MENTION]
= Juan$$

#org   [MENTION=40100]nic[/MENTION]kname
= Pete$$

Código:
#dynamic 0x800000
#define FRIENDSHIP 32

#org @main
lock
getmondata 0x0 FRIENDSHIP 0x8000 0x0
storevar 0x0 0x8000
loadpointer @msg
callstd 0x6
release
end


#org @msg
= Su felicidad es: \v\h02$$

Código:
varrandom [var]
No se quien era el que posteó que necesitaba esto hace un tiempo. ¡Pero acá lo tenés! (?
Lee el valor almacenado en la variable provista y lo remplaza con un númeo aleatorio cuayo valor máximo posible es el valor que estaba guardado anteriormente.

var: número de variable.

Estos comandos, no son difíciles de usar pero requieren que sigan un par de limitaciones.

extendscripts: Este es un comando que no recibe ningún parámetro, es como un lock. Todos los comandos de esta sección necesitan que este comando se haya ejecutado antes. Una vez usado este comando NO SE DEBE ejecutar el comando "loadpointer 0x3", eso es bastante sencillo, porque estoy seguro que la mayoría nunca lo uso siquiera. La otra regla es que este comando NO DEBE ser ejecutado una segunda vez, si el comando "distendscripts" no fue ejecutado anteriormente.

distendscripts: este comando tampoco recibe ningún parámetro. Este comando, NO DEBE ser ejecutado si no se ejecutó anteriormente "extendscripts". Este comando DEBE ser ejecutado cuando ya no necesiten más de los comandos de esta sección.

Estos comandos deberían ser usados similarmente a lock y release. Uno al principio y otro al final del script. Los únicos que deberían de poder usarlos de otra forma son los que entiendan la siguiente oración: "extendscripts hace malloc a una estructura, y distendscript la libera con free".
Si no sabés lo que eso significa, deberías usarlos tal y como dije. Que parecerá que no pasa nada malo, pero si pasa.

Código:
loadsprite [índice] [tamaño] [puntero_sprite] [puntero_paleta] [x] [y] [prioridad]
Muestra un sprite. Es como un pokepic, básicamente.
índice: el número con el que te referirás a la imagen. Debe ser de entre 0 y 15
tamaño: un numero de 0 a 3, segun si el sprite es de tamaño 8x8, 16x16, 32x32, 64x64, respectivamente.
puntero_sprite: puntero a la imagen del sprite. La imagen DEBE estar comprimida.
puntero_paleta: puntero a la paleta del sprite. La paleta NO DEBE estar comprimida.
x: posición x donde se mostrará el sprite.
y: posición y donde se mostrará el sprite
prioridad: la altura del sprite con respecto del resto de los gráficos. Un número de 0 a 3 donde 0 es lo más alto (por encima de todo)

Código:
unloadsprite [índice]
Borra una imagen cargada con loadsprite
índice: el número con el que cargaste la imagen.

Código:
loadmonsprite [índice] [tipo_sprite] [especie] [x] [y] [prioridad]
Muestra un sprite de un pokemon. Pokepic causaba problemas con el comando de la ventanas, así que este es un sustituto.
índice: el número con el que te referirás a la imagen. Debe ser de entre 0 y 15
tipo_sprite: ver abajo.
especie: especie del pokemon a mostrar.
x: posición x donde se mostrará el sprite.
y: posición y donde se mostrará el sprite
prioridad: la altura del sprite con respecto del resto de los gráficos. Un número de 0 a 3 donde 0 es lo más alto (por encima de todo)

Tipos de sprite dijo:
0: frontsprite
*Todo por ahora, luego seuro agreg los backs, shinys e íconos.*


Ejemplo
Código:
createwindow [índice] [tile_x] [tile_y] [ancho] [alto]
Crea una ventana en la que podmos escribir texto.

índice: el número con el identificarás a la ventana. (del 0 al 7)
tile_x: coordenada x de la ventana, valuada en tiles (bloques de 8x8).
tile_y: coordenada y de la ventana, valuada en tiles.
ancho: ancho de la ventana, en tiles.
alto: alto de la ventana, en tiles.

Código:
printextonwindow [índice] [puntero_texto] [x] [y]
Imprime un texto en la ventana indicada. NO hace visible la ventana, para eso usar "windowdoaction".

índice: número con el que se creó la ventana.
puntero_texto: puntero al texto a imprimir.
x: coordenada x donde se imprimirá el texto, en tiles y tomando como base la esquina superior izquierda de la ventana
y: coordenada y donde se imprimirá el texto, en tiles y tomando como base la esquina superior izquierda de la ventana.

Código:
windowdoaction [índice] [acción]
Realiza una acción con una ventana.

índice: número con el que se creó la ventana.
acción: número de acción
Acciones dijo:
0: eliminar la ventana
1: actualizar/mostrar la ventana.
2: borrar los contenidos de la ventana sin eliminar la ventana en si. Básicamente la oculta.

Eso sería todo.

Saludos.
 
Última edición:

Kaiser de Emperana

Called in hand
Acualizo con algo un poco más útil. Un hack con nuevos comandos de script y como usarlos. Hay una nueva sección en el post principal.

Creé comandos para modificación de pokemon y consulta de pokemon.
Pueden hacer pokemon perfectos.
Pueden hacer pokemon con motes o entrenadores originales predefinidos. Vieron cuando un personaje te regala un pokemon que tuvo por mucho tiempo, pero vos mirás sus detalles y dice "Entrenador original: [PLAYER]", y uno se queda, como: "Se ve que mucho no te querías esta cosa...". Bueno, ya no más.
Pueden hacer eventos que dependan, por ejemplo, del valor de ingenio del pokemon.
O lo que se les ocurra.

Ahora se pueden intercambiar pokemon de forma más dinámica.


Y tambien creé un comando para mostrar imágenes do forma más sencilla.

Si a alguien se le ocurre algún comando que sería útil, que lo postee. Capaz que lo haga.

Pero bueno, miren el post principal.
Saludos

EDIT: Ah y si a alguien le queda aluna duda de como usar un comando. Pregunte.
 

Kaiser de Emperana

Called in hand
Primero que nada. Si alguien usó los comandos de pokemon y actualiza a esta versión, se van a rompre, tuve que cambiar algo. Sorry no volverá a pasar.

Agregué unos comandos para mostrar ventanas. Y tambien un comando sustituto a pokepic, porque las ventanas no se llevaban muy bien con este. En el post principal explica como usar los comandos, sección de comandos complejos, subsecciones de imágenes y ventanas.

Ahora se pueden hacer cosas como esta:





Es algo así como la versión bootleg de la pantalla para ver los IVs de jiangzhengwenjz.

Código:
#define NICK_WIND 0x1
#define STATS_WIND 0x0
#define HP_IV 39
#define ATK_IV 40
#define DEF_IV 41
#define SPD_IV 42
#define SPATK_IV 43
#define SPDEF_IV 44
#define NICKNAME 2
#define SPECIES 11

#dynamic 0x800000
#org @main
lock
extendscripts
createwindow STATS_WIND 0x2 0x4 0xc 0xc
createwindow NICK_WIND 0x10 0x3 0xa 0x2

// Imprimir stats
getmondata 0x0 HP_IV 0x8000 0x0
storevar 0x0 0x8000
printextonwindow STATS_WIND @hp 0x0 0x0
getmondata 0x0 ATK_IV 0x8000 0x0
storevar 0x0 0x8000
printextonwindow STATS_WIND @atk 0x0 0x2
getmondata 0x0 DEF_IV 0x8000 0x0
storevar 0x0 0x8000
printextonwindow STATS_WIND @def 0x0 0x4
getmondata 0x0 SPATK_IV 0x8000 0x0
storevar 0x0 0x8000
printextonwindow STATS_WIND @spatk 0x0 0x6
getmondata 0x0 SPDEF_IV 0x8000 0x0
storevar 0x0 0x8000
printextonwindow STATS_WIND @spdef 0x0 0x8
getmondata 0x0 SPD_IV 0x8000 0x0
storevar 0x0 0x8000
printextonwindow STATS_WIND @speed 0x0 0xa

// Guardar el nick en el buffer 0
getmondata 0x0 NICKNAME 0x0 0x0
// imprimir el buffer 0
printextonwindow NICK_WIND @thebuffer 0x0 0x0

// Mostrar todo
windowdoaction STATS_WIND 0x1
windowdoaction NICK_WIND 0x1
getmondata 0x0 SPECIES 0x8000 0x0
loadmonsprite 0x0 0x0 0x8000 0xc0 0x60 0x0

// Borrar las ventanas
waitbutton
windowdoaction 0x0 0x0
windowdoaction NICK_WIND 0x0
distendscripts
release
end

#org @thebuffer
= \c\h01\h08\v\h02$$

#org @hp
= \c\h01\h06PS: \c\h01\h02\v\h02$$

#org @atk
= \c\h01\h06Ataque: \c\h01\h02\v\h02$$

#org @def
= \c\h01\h06Defensa: \c\h01\h02\v\h02$$

#org @spatk
= \c\h01\h06Ataque Esp.: \c\h01\h02\v\h02$$

#org @spdef
= \c\h01\h06Defensa Esp.: \c\h01\h02\v\h02$$

#org @speed
= \c\h01\h06Velocidad: \c\h01\h02\v\h02$$

Por si alguien no sabe.
Código:
#define ALGO 1564
Hace que escribir "ALGO" sea lo mismo que escribir 1564.

Los "\c\h01\h0X" son para los colores de los textos. Y "\v\h02" hace referencia al buffer 0.


Saludos
 

Ancer

Usuario de oro
Respuesta: Re: Hacks simples - Más comandos de script

Acualizo con algo un poco más útil. Un hack con nuevos comandos de script y como usarlos. Hay una nueva sección en el post principal.

Creé comandos para modificación de pokemon y consulta de pokemon.
Pueden hacer pokemon perfectos.
Pueden hacer pokemon con motes o entrenadores originales predefinidos. Vieron cuando un personaje te regala un pokemon que tuvo por mucho tiempo, pero vos mirás sus detalles y dice "Entrenador original: [PLAYER]", y uno se queda, como: "Se ve que mucho no te querías esta cosa...". Bueno, ya no más.
Pueden hacer eventos que dependan, por ejemplo, del valor de ingenio del pokemon.
O lo que se les ocurra.

Ahora se pueden intercambiar pokemon de forma más dinámica.


Y tambien creé un comando para mostrar imágenes do forma más sencilla.

Si a alguien se le ocurre algún comando que sería útil, que lo postee. Capaz que lo haga.

Pero bueno, miren el post principal.
Saludos

EDIT: Ah y si a alguien le queda aluna duda de como usar un comando. Pregunte.
Buenas ya descargue red alice pero no se como abrirlo instale python 3.6.4 pero no si es que hay que hacer algo diferente
 

Kaiser de Emperana

Called in hand
Re: Respuesta: Re: Hacks simples - Más comandos de script

Buenas ya descargue red alice pero no se como abrirlo instale python 3.6.4 pero no si es que hay que hacer algo diferente
Para ejecutarlo con python vas a necesitar los paquetes PyQt5, sip y python-qscintilla, que los podes instalar vía "pip install ..." con la línea de comandos (pip está en la carpeta de instalación de python). Después se ejecuta con "python asc-qt".

Si no querés ejecutarlo con python podés descargar el exe que subió cosarara a su web.

Después nomás tenés que editar el archivo de texto como explico en el post principal.
 

Ancer

Usuario de oro
Para ejecutarlo con python vas a necesitar los paquetes PyQt5, sip y python-qscintilla, que los podes instalar vía "pip install ..." con la línea de comandos (pip está en la carpeta de instalación de python). Después se ejecuta con "python asc-qt".

Si no querés ejecutarlo con python podés descargar el exe que subió cosarara a su web.

Después nomás tenés que editar el archivo de texto como explico en el post principal.
gracias lo intentare
pero te soy sincero ¿:.no entendí :p
listo ya me funciono gracias y disculpa las molestias

Para ejecutarlo con python vas a necesitar los paquetes PyQt5, sip y python-qscintilla, que los podes instalar vía "pip install ..." con la línea de comandos (pip está en la carpeta de instalación de python). Después se ejecuta con "python asc-qt".

Si no querés ejecutarlo con python podés descargar el exe que subió cosarara a su web.

Después nomás tenés que editar el archivo de texto como explico en el post principal.
hola tengo duda de como utilizarlo
lo e intentado lo de que sume uno a una variante pero cada ves que lo hago la variante se vuelve 0 y al sumarlo se pone en 1
a lo que me refiere es que tengo 16 ivs y al usarlo se vuelve 1 y si lo uso de nuevo 2 ,3 etc
cuando la idea es que es que de 17,18,19
y disculpa la inconveniencia

#include "stdlib/std.rbh"
#include "stdlib/stdpoke.rbh"
#include "stdlib/stditems.rbh"
#include "stdlib/stdattacks.rbh"
#include "stdlib/stdmoves.rbh"

#dynamic 0x800000
#define HP_IV 39

#org @main
lock
special 0XA2
waitstate
getmondata 0x8004 HP_IV 0x8000 0x0
compare 0x8000 0x1F
if 0x1 call @main2
compare 0x8000 0x31
if 0x0 call @main3
end

#org @main2
msgbox @nada 0x6
release
end

#org @main3
addvar 0x8000 0x1
setmondata 0x1 0x8004 HP_IV 0x8000
releaseall
end

#org @nada
= sin efecto

perdón no se como volverlo una ventana:p
 
Última edición por un moderador:

Kaiser de Emperana

Called in hand
@Ancer, probé tu script y me anduvo perfecto. Le corregí un par de errores (como el releaseall en lugar de release, el use de call en lugar de goto y le saque una parte innecesaria. Pero ninguno de los cambios afecta la lógica del funcionamiento del script.
Tu script quedo tal que así:
Código:
#include "stdlib/std.rbh"
#include "stdlib/stdpoke.rbh"
#include "stdlib/stditems.rbh"
#include "stdlib/stdattacks.rbh"
#include "stdlib/stdmoves.rbh"

#dynamic 0xfe0000
#define HP_IV 39

#org @main
lock
special 0xA2
waitstate
getmondata 0x8004 HP_IV 0x8000 0x0
compare 0x8000 0x1F
if 0x1 goto :main2

addvar 0x8000 0x1
setmondata 0x1 0x8004 HP_IV 0x8000
release
end

:main2
msgbox @nada 0x6
release
end


#org @nada
= sin efecto$
(Para poner la "ventana" tenés que usar las etiquetas code, el botón de # a la hora de escribir un mensaje.)

Si no te funciona debés estar corroborando los IVS de forma incorrecta.
 
¡Hola!
Estoy tratando de poner este hack en una rom expandida en el offset 10a6100, pero está dando error. ¿Alguien me puede ayudar?

Gracias!
 
Respuesta: Re: Hacks simples - Más comandos de script

Tendrías que poner 0x90a6100 en lugar de 0x10a6100. Los offsets siempre son +0x8000000, que es la forma en que la gba direcciona la rom.
Lo logré. Pero el script esta dando error cuando intento compilar con el red alien. ¿Necesito hacer alguna otra configuración? Gracias!
 
Re: Respuesta: Re: Hacks simples - Más comandos de script

Ninguna. Tiene que ser problema del script. Habría que ver cual es el error.
¡Ahora lo conseguí! He colocado el script en un offset libre cerca del offset 800000.
Pero cuando intento poner en el offset 10a6100 (o 90a6100) él simprelmente dice "error" y no compila. Creo que el problema está en cómo estoy poniendo el offset.
 

Ryurs

Usuario de oro
Buenas, espero que alguien me pueda ayudar con esto. Intenté contactar con el autor de este post hace ya más de 1 mes y no obtuve respuesta, así que a ver si encuentro con alguien que entienda de esto.

Por alguna razón a la hora de compilarlo con el Cygwin64 me da un error y no es capaz de terminar de "fabricar" la carpeta "build". Os paso un informe de lo que me tira el Cygwin64:
Código:
$ make bpre
mkdir -p build/BPRE/src
arm-none-eabi-cpp -I ../common/pokeemerald_include -I ../common/agbcc_include -I ../common/include -I include src/script_context_extension.c -D BPRE | arm-none-eabi-gcc -mthumb -mno-thumb-interwork -mcpu=arm7tdmi -mtune=arm7tdmi -march=armv4t -mlong-calls -fno-builtin -Wall -Wno-discarded-array-qualifiers -Wno-int-conversion -O -finline  -o build/BPRE/src/script_context_extension.c.o -c -xc -
mkdir -p build/BPRE/src
arm-none-eabi-cpp -I ../common/pokeemerald_include -I ../common/agbcc_include -I ../common/include -I include src/scriptcmds.c -D BPRE | arm-none-eabi-gcc -mthumb -mno-thumb-interwork -mcpu=arm7tdmi -mtune=arm7tdmi -march=armv4t -mlong-calls -fno-builtin -Wall -Wno-discarded-array-qualifiers -Wno-int-conversion -O -finline  -o build/BPRE/src/scriptcmds.c.o -c -xc -
mkdir -p build/BPRE/src
arm-none-eabi-cpp -I ../common/pokeemerald_include -I ../common/agbcc_include -I ../common/include -I include src/sprite_scripts.c -D BPRE | arm-none-eabi-gcc -mthumb -mno-thumb-interwork -mcpu=arm7tdmi -mtune=arm7tdmi -march=armv4t -mlong-calls -fno-builtin -Wall -Wno-discarded-array-qualifiers -Wno-int-conversion -O -finline  -o build/BPRE/src/sprite_scripts.c.o -c -xc -
mkdir -p build/BPRE/src
arm-none-eabi-cpp -I ../common/pokeemerald_include -I ../common/agbcc_include -I ../common/include -I include src/window_scripts.c -D BPRE | arm-none-eabi-gcc -mthumb -mno-thumb-interwork -mcpu=arm7tdmi -mtune=arm7tdmi -march=armv4t -mlong-calls -fno-builtin -Wall -Wno-discarded-array-qualifiers -Wno-int-conversion -O -finline  -o build/BPRE/src/window_scripts.c.o -c -xc -
mkdir -p build/BPRE/src
arm-none-eabi-cpp -I ../common/pokeemerald_include -I ../common/agbcc_include -I ../common/include -I include src/new_script_table.s -D BPRE | arm-none-eabi-as -mthumb -o build/BPRE/src/new_script_table.s.o
arm-none-eabi-ld -r -T ../common/linker.ld  -T ../common/BPRE.ld -T ../common/BPRE_wram.ld -T ../common/BPRE_local.ld -o build/BPRE/linked.o build/BPRE/src/script_context_extension.c.o build/BPRE/src/scriptcmds.c.o build/BPRE/src/sprite_scripts.c.o build/BPRE/src/window_scripts.c.o build/BPRE/src/new_script_table.s.o ../common/BPRE.ld ../common/BPRE_wram.ld ../common/BPRE_local.ld
C:\devkitPro\devkitARM\bin\arm-none-eabi-ld.exe: error: linker script file '../c
ommon/BPRE.ld' appears multiple times
make: *** [Makefile:92: build/BPRE/linked.o] Error 1

Más concretamente parece que el error viene de lo último:
Código:
C:\devkitPro\devkitARM\bin\arm-none-eabi-ld.exe: error: linker script file '../c
ommon/BPRE.ld' appears multiple times
make: *** [Makefile:92: build/BPRE/linked.o] Error 1

Por poneros un poquito en contexto:
- Las herramientas están bien instaladas (ya he inyectado con éxito otras cosas en C con estas herramientas, aunque son de repositorios de pokecommunity).
- La rom que estoy utilizando es fire red en inglés.
- El offset que pongo en el archivo main.s para que me inserte el hack es el 0x08800000.

Tengo de verdad mucho interés en poder insertar esto, agradezco todo de antemano.

Seguramente no obtenga una respuesta de esto, pero no pierdo nada por intentarlo.

Saludos.
 

Eaas

Profesional de WaH
Buenas, espero que alguien me pueda ayudar con esto. Intenté contactar con el autor de este post hace ya más de 1 mes y no obtuve respuesta, así que a ver si encuentro con alguien que entienda de esto.

Por alguna razón a la hora de compilarlo con el Cygwin64 me da un error y no es capaz de terminar de "fabricar" la carpeta "build". Os paso un informe de lo que me tira el Cygwin64:
Código:
$ make bpre
mkdir -p build/BPRE/src
arm-none-eabi-cpp -I ../common/pokeemerald_include -I ../common/agbcc_include -I ../common/include -I include src/script_context_extension.c -D BPRE | arm-none-eabi-gcc -mthumb -mno-thumb-interwork -mcpu=arm7tdmi -mtune=arm7tdmi -march=armv4t -mlong-calls -fno-builtin -Wall -Wno-discarded-array-qualifiers -Wno-int-conversion -O -finline  -o build/BPRE/src/script_context_extension.c.o -c -xc -
mkdir -p build/BPRE/src
arm-none-eabi-cpp -I ../common/pokeemerald_include -I ../common/agbcc_include -I ../common/include -I include src/scriptcmds.c -D BPRE | arm-none-eabi-gcc -mthumb -mno-thumb-interwork -mcpu=arm7tdmi -mtune=arm7tdmi -march=armv4t -mlong-calls -fno-builtin -Wall -Wno-discarded-array-qualifiers -Wno-int-conversion -O -finline  -o build/BPRE/src/scriptcmds.c.o -c -xc -
mkdir -p build/BPRE/src
arm-none-eabi-cpp -I ../common/pokeemerald_include -I ../common/agbcc_include -I ../common/include -I include src/sprite_scripts.c -D BPRE | arm-none-eabi-gcc -mthumb -mno-thumb-interwork -mcpu=arm7tdmi -mtune=arm7tdmi -march=armv4t -mlong-calls -fno-builtin -Wall -Wno-discarded-array-qualifiers -Wno-int-conversion -O -finline  -o build/BPRE/src/sprite_scripts.c.o -c -xc -
mkdir -p build/BPRE/src
arm-none-eabi-cpp -I ../common/pokeemerald_include -I ../common/agbcc_include -I ../common/include -I include src/window_scripts.c -D BPRE | arm-none-eabi-gcc -mthumb -mno-thumb-interwork -mcpu=arm7tdmi -mtune=arm7tdmi -march=armv4t -mlong-calls -fno-builtin -Wall -Wno-discarded-array-qualifiers -Wno-int-conversion -O -finline  -o build/BPRE/src/window_scripts.c.o -c -xc -
mkdir -p build/BPRE/src
arm-none-eabi-cpp -I ../common/pokeemerald_include -I ../common/agbcc_include -I ../common/include -I include src/new_script_table.s -D BPRE | arm-none-eabi-as -mthumb -o build/BPRE/src/new_script_table.s.o
arm-none-eabi-ld -r -T ../common/linker.ld  -T ../common/BPRE.ld -T ../common/BPRE_wram.ld -T ../common/BPRE_local.ld -o build/BPRE/linked.o build/BPRE/src/script_context_extension.c.o build/BPRE/src/scriptcmds.c.o build/BPRE/src/sprite_scripts.c.o build/BPRE/src/window_scripts.c.o build/BPRE/src/new_script_table.s.o ../common/BPRE.ld ../common/BPRE_wram.ld ../common/BPRE_local.ld
C:\devkitPro\devkitARM\bin\arm-none-eabi-ld.exe: error: linker script file '../c
ommon/BPRE.ld' appears multiple times
make: *** [Makefile:92: build/BPRE/linked.o] Error 1

Más concretamente parece que el error viene de lo último:
Código:
C:\devkitPro\devkitARM\bin\arm-none-eabi-ld.exe: error: linker script file '../c
ommon/BPRE.ld' appears multiple times
make: *** [Makefile:92: build/BPRE/linked.o] Error 1

Por poneros un poquito en contexto:
- Las herramientas están bien instaladas (ya he inyectado con éxito otras cosas en C con estas herramientas, aunque son de repositorios de pokecommunity).
- La rom que estoy utilizando es fire red en inglés.
- El offset que pongo en el archivo main.s para que me inserte el hack es el 0x08800000.

Tengo de verdad mucho interés en poder insertar esto, agradezco todo de antemano.

Seguramente no obtenga una respuesta de esto, pero no pierdo nada por intentarlo.

Saludos.
Te has puesto a leer el error?
Yo veo tres líneas que dicen POKEEMERALD.
POKEEMRALD es como se denomina la Rom decompilada de emerald.
 

Lunos

Enfrentando a La Organización
Miembro insignia
Te has puesto a leer el error?
Yo veo tres líneas que dicen POKEEMERALD.
POKEEMRALD es como se denomina la Rom decompilada de emerald.
No, Pokeemerald es como se llama el proyecto de decompilación de Pokémon Emerald.
Las ROMs generadas con ellos son ROMs sin más, como cualquier otra ROM.

Y sí, este proyecto utiliza archivos header propios de Pokeemerald.

EDIT:
Buenas, espero que alguien me pueda ayudar con esto. Intenté contactar con el autor de este post hace ya más de 1 mes y no obtuve respuesta, así que a ver si encuentro con alguien que entienda de esto.

Por alguna razón a la hora de compilarlo con el Cygwin64 me da un error y no es capaz de terminar de "fabricar" la carpeta "build". Os paso un informe de lo que me tira el Cygwin64:
Código:
$ make bpre
mkdir -p build/BPRE/src
arm-none-eabi-cpp -I ../common/pokeemerald_include -I ../common/agbcc_include -I ../common/include -I include src/script_context_extension.c -D BPRE | arm-none-eabi-gcc -mthumb -mno-thumb-interwork -mcpu=arm7tdmi -mtune=arm7tdmi -march=armv4t -mlong-calls -fno-builtin -Wall -Wno-discarded-array-qualifiers -Wno-int-conversion -O -finline  -o build/BPRE/src/script_context_extension.c.o -c -xc -
mkdir -p build/BPRE/src
arm-none-eabi-cpp -I ../common/pokeemerald_include -I ../common/agbcc_include -I ../common/include -I include src/scriptcmds.c -D BPRE | arm-none-eabi-gcc -mthumb -mno-thumb-interwork -mcpu=arm7tdmi -mtune=arm7tdmi -march=armv4t -mlong-calls -fno-builtin -Wall -Wno-discarded-array-qualifiers -Wno-int-conversion -O -finline  -o build/BPRE/src/scriptcmds.c.o -c -xc -
mkdir -p build/BPRE/src
arm-none-eabi-cpp -I ../common/pokeemerald_include -I ../common/agbcc_include -I ../common/include -I include src/sprite_scripts.c -D BPRE | arm-none-eabi-gcc -mthumb -mno-thumb-interwork -mcpu=arm7tdmi -mtune=arm7tdmi -march=armv4t -mlong-calls -fno-builtin -Wall -Wno-discarded-array-qualifiers -Wno-int-conversion -O -finline  -o build/BPRE/src/sprite_scripts.c.o -c -xc -
mkdir -p build/BPRE/src
arm-none-eabi-cpp -I ../common/pokeemerald_include -I ../common/agbcc_include -I ../common/include -I include src/window_scripts.c -D BPRE | arm-none-eabi-gcc -mthumb -mno-thumb-interwork -mcpu=arm7tdmi -mtune=arm7tdmi -march=armv4t -mlong-calls -fno-builtin -Wall -Wno-discarded-array-qualifiers -Wno-int-conversion -O -finline  -o build/BPRE/src/window_scripts.c.o -c -xc -
mkdir -p build/BPRE/src
arm-none-eabi-cpp -I ../common/pokeemerald_include -I ../common/agbcc_include -I ../common/include -I include src/new_script_table.s -D BPRE | arm-none-eabi-as -mthumb -o build/BPRE/src/new_script_table.s.o
arm-none-eabi-ld -r -T ../common/linker.ld  -T ../common/BPRE.ld -T ../common/BPRE_wram.ld -T ../common/BPRE_local.ld -o build/BPRE/linked.o build/BPRE/src/script_context_extension.c.o build/BPRE/src/scriptcmds.c.o build/BPRE/src/sprite_scripts.c.o build/BPRE/src/window_scripts.c.o build/BPRE/src/new_script_table.s.o ../common/BPRE.ld ../common/BPRE_wram.ld ../common/BPRE_local.ld
C:\devkitPro\devkitARM\bin\arm-none-eabi-ld.exe: error: linker script file '../c
ommon/BPRE.ld' appears multiple times
make: *** [Makefile:92: build/BPRE/linked.o] Error 1

Más concretamente parece que el error viene de lo último:
Código:
C:\devkitPro\devkitARM\bin\arm-none-eabi-ld.exe: error: linker script file '../c
ommon/BPRE.ld' appears multiple times
make: *** [Makefile:92: build/BPRE/linked.o] Error 1

Por poneros un poquito en contexto:
- Las herramientas están bien instaladas (ya he inyectado con éxito otras cosas en C con estas herramientas, aunque son de repositorios de pokecommunity).
- La rom que estoy utilizando es fire red en inglés.
- El offset que pongo en el archivo main.s para que me inserte el hack es el 0x08800000.

Tengo de verdad mucho interés en poder insertar esto, agradezco todo de antemano.

Seguramente no obtenga una respuesta de esto, pero no pierdo nada por intentarlo.

Saludos.
Pingeando a @Kaiser de Emperana, por las dudas.

Yo no veo nada que me llame la atención. Sin embargo, probé el asunto para evitar hacer OffTopic puro y duro, y me crucé con el mismo error.
Quizá esta inyección se rompió con alguna actualización que se le habra hecho a devkitARM durante los 2 años desde que Kaiser lo escribió o algo así.
 

Adjuntos

Última edición:

Ryurs

Usuario de oro
Quizá esta inyección se rompió con alguna actualización que se le habra hecho a devkitARM durante los 2 años desde que Kaiser lo escribió o algo así.
Efectivamente, yo también pensé en eso, que la parte de devkitARM actual no funciona para este repositorio semiantiguo (más concretamente por la línea de error que tira el cygwin64, que sea problema del devkitARM). Quizás con una versión vieja funcione.

De todas formas gracias por la respuesta.
 
Arriba