Registrarse

[pokeruby - pokeemerald] Cambiar minisprites de forma dinámica

InmortalKaktus

Ludiloco
¡¡Heyy!!

Hoy os traigo algo que me ha tomado un par de días averiguar, pero que por fin, es funcional (aviso que esto sólo servirá para importar el bloque de caminar y correr, las animaciones como surfear, pescar, o ir en bici, no se cambian, aunque se podría hacer, probablemente actualice con el script completo)

Como bien habéis leído vamos a cambiar minisprites de forma dinámica desde un script, ¿y cómo lo haremos? muy sencillo, lo primero será aprender a crear crear comandos, para ello, podéis ver este tutorial que he escrito para crear nuevos comandos de scripting

Una vez sabemos cómo hacer esto, sólo necesitamos añadir los respectivos comandos, que si os ha dado por copiar y pegar los del tuto anterior, ya lo tenéis casi hecho.

Vamos pa' allá

script_cmd_table.inc añadiendo:

Código:
	.4byte ScrCmd_changeMini              @ 0xC6
event.inc añadiendo:

Código:
	@ Changes the player minisprite.
	.macro changeMini minivalue
	.byte 0xc6
	.2byte \minivalue
	.endm
y scrcmd.c, también añadiendo:

Código:
void ScrCmd_changeMini(struct ScriptContext *ctx)
{
	u16 miniValue = VarGet(ScriptReadHalfword(ctx));
	
	struct EventObject *eventObj = &gEventObjects[gPlayerAvatar.eventObjectId];
	
	sub_805B980(eventObj, miniValue);
    EventObjectTurn(eventObj, eventObj->movementDirection);
    SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_ON_FOOT);
	gSaveBlock2.playerMini = miniValue;
}

Ahora que tenemos el comando creado...

para guardar el mini que estamos usando, esto será tan sencillo como ir a "include/global.h" y al final de todos los parámetros de "struct SaveBlock2", añadir:

Código:
	u16 playerMini;
Código:
struct SaveBlock2 /* 0x02024EA4 */
{
    /*0x00*/ u8 playerName[8];
    /*0x08*/ u8 playerGender; // MALE, FEMALE
    /*0x09*/ u8 specialSaveWarp;
    /*0x0A*/ u8 playerTrainerId[4];
    /*0x0E*/ u16 playTimeHours;
    /*0x10*/ u8 playTimeMinutes;
    /*0x11*/ u8 playTimeSeconds;
    /*0x12*/ u8 playTimeVBlanks;
    /*0x13*/ u8 optionsButtonMode;         // OPTIONS_BUTTON_MODE_[NORMAL/LR/L_EQUALS_A]
    /*0x14*/ u16 optionsTextSpeed:3;       // OPTIONS_TEXT_SPEED_[SLOW/MID/FAST]
             u16 optionsWindowFrameType:5; // Specifies one of the 20 decorative borders for text boxes
             u16 optionsSound:1;           // OPTIONS_SOUND_[MONO/STEREO]
             u16 optionsBattleStyle:1;     // OPTIONS_BATTLE_STYLE_[SHIFT/SET]
             u16 optionsBattleSceneOff:1;  // whether battle animations are disabled
             u16 regionMapZoom:1;          // whether the map is zoomed in
    /*0x18*/ struct Pokedex pokedex;
    /*0x90*/ u8 filler_90[0x8];
    /*0x98*/ struct Time localTimeOffset;
    /*0xA0*/ struct Time lastBerryTreeUpdate;
    /*0xA8*/ struct BattleTowerData battleTower;
	u16 playerMini;
};

Y listo. Ahora sólo tendremos que ir a cualquier script, y escribir:

Código:
changeMini numeroDeMini
Para saber el número del mini que tenéis que usar, podéis recurrir a esta lista:

BRENDAN_NORMAL: 0
BRENDAN_MACH_BIKE: 1
BRENDAN_SURFING: 2
BRENDAN_FIELD_MOVE: 3
QUINTY_PLUMP: 4
LITTLE_BOY_1: 5
LITTLE_GIRL_1: 6
BOY_1: 7
GIRL_1: 8
BOY_2: 9
GIRL_2: 10
LITTLE_BOY_2: 11
LITTLE_GIRL_2: 12
BOY_3: 13
GIRL_3: 14
BOY_4: 15
WOMAN_1: 16
FAT_MAN: 17
WOMAN_2: 18
MAN_1: 19
WOMAN_3: 20
OLD_MAN_1: 21
OLD_WOMAN_1: 22
MAN_2: 23
WOMAN_4: 24
MAN_3: 25
WOMAN_5: 26
COOK: 27
WOMAN_6: 28
OLD_MAN_2: 29
OLD_WOMAN_2: 30
CAMPER: 31
PICNICKER: 32
MAN_4: 33
WOMAN_7: 34
YOUNGSTER: 35
BUG_CATCHER: 36
PSYCHIC_M: 37
SCHOOL_KID_M: 38
MANIAC: 39
HEX_MANIAC: 40
WOMAN_8: 41
SWIMMER_M: 42
SWIMMER_F: 43
BLACK_BELT: 44
BEAUTY: 45
SCIENTIST_1: 46
LASS: 47
GENTLEMAN: 48
SAILOR: 49
FISHERMAN: 50
RUNNING_TRIATHLETE_M: 51
RUNNING_TRIATHLETE_F: 52
TUBER_F: 53
TUBER_M: 54
HIKER: 55
CYCLING_TRIATHLETE_M: 56
CYCLING_TRIATHLETE_F: 57
NURSE: 58
ITEM_BALL: 59
BERRY_TREE: 60
BERRY_TREE_EARLY_STAGES: 61
BERRY_TREE_LATE_STAGES: 62
BRENDAN_ACRO_BIKE: 63
PROF_BIRCH: 64
MAN_5: 65
MAN_6: 66
REPORTER_M: 67
REPORTER_F: 68
BARD: 69
HIPSTER: 70
TRADER: 71
STORYTELLER: 72
GIDDY: 73
UNUSED_MAUVILLE_OLD_MAN_1: 74
UNUSED_MAUVILLE_OLD_MAN_2: 75
UNUSED_NATU_DOLL: 76
UNUSED_MAGNEMITE_DOLL: 77
UNUSED_SQUIRTLE_DOLL: 78
UNUSED_WOOPER_DOLL: 79
UNUSED_PIKACHU_DOLL: 80
UNUSED_PORYGON2_DOLL: 81
CUTTABLE_TREE: 82
MART_EMPLOYEE: 83
ROOFTOP_SALE_WOMAN: 84
TEALA: 85
BREAKABLE_ROCK: 86
PUSHABLE_BOULDER: 87
MR_BRINEYS_BOAT: 88
MAY_NORMAL: 89
MAY_MACH_BIKE: 90
MAY_ACRO_BIKE: 91
MAY_SURFING: 92
MAY_FIELD_MOVE: 93
TRUCK: 94
MACHOKE_CARRYING_BOX: 95
MACHOKE_FACING_AWAY: 96
BIRCHS_BAG: 97
POOCHYENA: 98
ARTIST: 99
RIVAL_BRENDAN_NORMAL: 100
RIVAL_BRENDAN_MACH_BIKE: 101
RIVAL_BRENDAN_ACRO_BIKE: 102
RIVAL_BRENDAN_SURFING: 103
RIVAL_BRENDAN_FIELD_MOVE: 104
RIVAL_MAY_NORMAL: 105
RIVAL_MAY_MACH_BIKE: 106
RIVAL_MAY_ACRO_BIKE: 107
RIVAL_MAY_SURFING: 108
RIVAL_MAY_FIELD_MOVE: 109
CAMERAMAN: 110
BRENDAN_UNDERWATER: 111
MAY_UNDERWATER: 112
MOVING_BOX: 113
CABLE_CAR: 114
SCIENTIST_2: 115
MAN_7: 116
AQUA_MEMBER_M: 117
AQUA_MEMBER_F: 118
MAGMA_MEMBER_M: 119
MAGMA_MEMBER_F: 120
SIDNEY: 121
PHOEBE: 122
GLACIA: 123
DRAKE: 124
ROXANNE: 125
BRAWLY: 126
WATTSON: 127
FLANNERY: 128
NORMAN: 129
WINONA: 130
LIZA: 131
TATE: 132
WALLACE: 133
STEVEN: 134
WALLY: 135
LITTLE_BOY_3: 136
BRENDAN_FISHING: 137
MAY_FISHING: 138
HOT_SPRINGS_OLD_WOMAN: 139
SS_TIDAL: 140
SUBMARINE_SHADOW: 141
PICHU_DOLL: 142
PIKACHU_DOLL: 143
MARILL_DOLL: 144
TOGEPI_DOLL: 145
CYNDAQUIL_DOLL: 146
CHIKORITA_DOLL: 147
TOTODILE_DOLL: 148
JIGGLYPUFF_DOLL: 149
MEOWTH_DOLL: 150
CLEFAIRY_DOLL: 151
DITTO_DOLL: 152
SMOOCHUM_DOLL: 153
TREECKO_DOLL: 154
TORCHIC_DOLL: 155
MUDKIP_DOLL: 156
DUSKULL_DOLL: 157
WYNAUT_DOLL: 158
BALTOY_DOLL: 159
KECLEON_DOLL: 160
AZURILL_DOLL: 161
SKITTY_DOLL: 162
SWABLU_DOLL: 163
GULPIN_DOLL: 164
LOTAD_DOLL: 165
SEEDOT_DOLL: 166
PIKA_CUSHION: 167
ROUND_CUSHION: 168
KISS_CUSHION: 169
ZIGZAG_CUSHION: 170
SPIN_CUSHION: 171
DIAMOND_CUSHION: 172
BALL_CUSHION: 173
GRASS_CUSHION: 174
FIRE_CUSHION: 175
WATER_CUSHION: 176
BIG_SNORLAX_DOLL: 177
BIG_RHYDON_DOLL: 178
BIG_LAPRAS_DOLL: 179
BIG_VENUSAUR_DOLL: 180
BIG_CHARIZARD_DOLL: 181
BIG_BLASTOISE_DOLL: 182
BIG_WAILMER_DOLL: 183
BIG_REGIROCK_DOLL: 184
BIG_REGICE_DOLL: 185
BIG_REGISTEEL_DOLL: 186
LATIAS: 187
LATIOS: 188
BOY_5: 189
CONTEST_JUDGE: 190
BRENDAN_WATERING: 191
MAY_WATERING: 192
BRENDAN_DECORATING: 193
MAY_DECORATING: 194
ARCHIE: 195
MAXIE: 196
KYOGRE_1: 197
GROUDON_1: 198
FOSSIL: 199
REGIROCK: 200
REGICE: 201
REGISTEEL: 202
SKITTY: 203
KECLEON_1: 204
KYOGRE_2: 205
GROUDON_2: 206
RAYQUAZA: 207
ZIGZAGOON: 208
PIKACHU: 209
AZUMARILL: 210
WINGULL: 211
KECLEON_2: 212
TUBER_M_SWIMMING: 213
AZURILL: 214
MOM: 215
LINK_BRENDAN: 216
LINK_MAY: 217

En cualquier caso, si habéis editado o añadido alguno, simplemente podéis mirar el número correspondiente en "include/constants/event_objects.h" y los encontraréis algo así como:

Código:
#define EVENT_OBJ_GFX_BRENDAN_NORMAL 0
Si por ejemplo quiero que mi mini sea el del youngster, en un script, escribiría:

Código:
changeMini 35
Y voilà, mini cambiao'

Cualquier cosa, decidme por aquí, y trataré de ayudar. No lo he testeado lo suficiente, pero por el momento, no parece dar ningún problema.
 

kakarotto

Baneado
pero que puto jefe eresssssssss!!!! Muchas gracias por esto tio. De verdad te lo has currado. Vamos a seguir investigando cosas tan molonas como estas!
 

Diego Mertens

Dartrix Joven
Esta función ha cambiado de nombre en las versiones más recientes...
sub_805B980(eventObj, miniValue);
¿Cómo se llama ahora?
EDIT: ARREGLADO, se llama: "EventObjectSetGraphicsId"
Pero tengo otro problema, al actualizarse el mapa, el efecto desaparece... Y eso es aburrido XD
Además, ¿cómo puedo cambiar también cuando corre? Es que lo que hace es "levitar rápido" XD
 
Última edición:

Diego Mertens

Dartrix Joven
Otro error he descubierto... El mini no sólo se cambia al refrescar la pantalla (entrar y salir del menú Pokémon, por ejemplo, si no que también se cambia directamente al mini número 0, es decir, el de Brendan, pero conservando la paleta del mini anterior, lo que causaría problemas con paletas con colores muy diferentes a los que estaba usando antes...
 
Arriba