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:
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:
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.
Ahorael hack los hacks:
Eso sería todo.
Saludos.
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
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"
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
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:
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.
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
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.
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.
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:
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).
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.
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]
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
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)
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.
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.
tipT_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 tipT_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.
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:
Escucho recomendaciones para acciones.
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]
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]
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:
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.
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 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]"
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.
tipT_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 tipT_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]
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
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]
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.
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)
Borra una imagen cargada con loadsprite
índice: el número con el que cargaste la imagen.
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)
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]
í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]
índice: el número con el que cargaste la imagen.
Código:
loadmonsprite [índice] [tipo_sprite] [especie] [x] [y] [prioridad]
í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
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.
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.
Realiza una acción con una ventana.
índice: número con el que se creó la ventana.
acción: número de acción
Código:
createwindow [índice] [tile_x] [tile_y] [ancho] [alto]
í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]
í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]
í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: