You are not logged in.
I've been adding extra forms of specific pokemon to my Crystal project. I've been able to make pokemon use alternate palettes based on their "unown form" (wUnownLetter). However I'd like to implement a better method of doing alternate forms. I want to create a new stat that is set when the pokemon is generated, and can then be used to determine which sprite and palette it uses whenever displayed.
For example I'd like to have two forms of Shellos, and have the "form" stat be set to 1 when spawned on one map, and 0 when spawned on another. Whenever Shellos is sent into battle or viewed in the party the game simply loads the "form" variable and displays the proper palette and sprite based on whether its a 1 or a 0.
I don't know how to add this stat. Attempting to add it to macros/wram.asm breaks the game so I don't know what to do. I assume I'm just missing something important in how the game deals with these things.
I've made progress. Here's what I did. In macros/wram.asm I added \1Form:: db here:
\1Stats:: ; big endian
\1Form:: db ;New Line
I also did the same beneath "battle_struct:"
then I updated pokemon_data_constants.asm like this:
; party_struct members (see macros/wram.asm)
MON_SPECIES EQUS "(wPartyMon1Species - wPartyMon1)"
MON_ITEM EQUS "(wPartyMon1Item - wPartyMon1)"
MON_MOVES EQUS "(wPartyMon1Moves - wPartyMon1)"
MON_ID EQUS "(wPartyMon1ID - wPartyMon1)"
MON_EXP EQUS "(wPartyMon1Exp - wPartyMon1)"
MON_STAT_EXP EQUS "(wPartyMon1StatExp - wPartyMon1)"
MON_HP_EXP EQUS "(wPartyMon1HPExp - wPartyMon1)"
MON_ATK_EXP EQUS "(wPartyMon1AtkExp - wPartyMon1)"
MON_DEF_EXP EQUS "(wPartyMon1DefExp - wPartyMon1)"
MON_SPD_EXP EQUS "(wPartyMon1SpdExp - wPartyMon1)"
MON_SPC_EXP EQUS "(wPartyMon1SpcExp - wPartyMon1)"
MON_DVS EQUS "(wPartyMon1DVs - wPartyMon1)"
MON_PP EQUS "(wPartyMon1PP - wPartyMon1)"
MON_HAPPINESS EQUS "(wPartyMon1Happiness - wPartyMon1)"
MON_PKRUS EQUS "(wPartyMon1PokerusStatus - wPartyMon1)"
MON_CAUGHTDATA EQUS "(wPartyMon1CaughtData - wPartyMon1)"
MON_CAUGHTLEVEL EQUS "(wPartyMon1CaughtLevel - wPartyMon1)"
MON_CAUGHTTIME EQUS "(wPartyMon1CaughtTime - wPartyMon1)"
MON_CAUGHTGENDER EQUS "(wPartyMon1CaughtGender - wPartyMon1)"
MON_CAUGHTLOCATION EQUS "(wPartyMon1CaughtLocation - wPartyMon1)"
MON_LEVEL EQUS "(wPartyMon1Level - wPartyMon1)"
MON_STATUS EQUS "(wPartyMon1Status - wPartyMon1)"
MON_HP EQUS "(wPartyMon1HP - wPartyMon1)"
MON_MAXHP EQUS "(wPartyMon1MaxHP - wPartyMon1)"
MON_ATK EQUS "(wPartyMon1Attack - wPartyMon1)"
MON_DEF EQUS "(wPartyMon1Defense - wPartyMon1)"
MON_SPD EQUS "(wPartyMon1Speed - wPartyMon1)"
MON_SAT EQUS "(wPartyMon1SpclAtk - wPartyMon1)"
MON_SDF EQUS "(wPartyMon1SpclDef - wPartyMon1)"
MON_FORM EQUS "(wPartyMon1Form - wPartymon1)" ;New Line
BOXMON_STRUCT_LENGTH EQUS "(wPartyMon1End - wPartyMon1)"
PARTYMON_STRUCT_LENGTH EQUS "(wPartyMon1StatsEnd - wPartyMon1)"
REDMON_STRUCT_LENGTH EQU 44
When I run the game, the battle system goes haywire, for whatever reason the Hitpoints bar and levels go wild! I got the battle sytem to work though by editing battle_constants.asm:
; stat constants
; indexes for:
; - wPlayerStats and wEnemyStats (see wram.asm)
; - party_struct and battle_struct members (see macros/wram.asm)
const STAT_FORM ;New Line
NUM_STATS EQU const_value
STAT_SPC EQU STAT_SATK
The battle system works fine again but now the question is, how do I read and write to and from "\1form"? I feel like if I knew that I can do anything with regard to alternate forms, assuming what I did is correct.
Last edited by BellsproutIsCool (2019-08-11 05:31:04)