• Our software update is now concluded. You will need to reset your password to log in. In order to do this, you will have to click "Log in" in the top right corner and then "Forgot your password?".
  • Forum moderator applications are now open! Click here for details.
  • Welcome to PokéCommunity! Register now and join one of the best fan communities on the 'net to talk Pokémon and more! We are not affiliated with The Pokémon Company or Nintendo.

Red hack: Pokémon Tri-Color Nostalgia Series

Fotomac

Genwunner and proud of it
909
Posts
8
Years
  • Age 32
  • Seen Jan 9, 2023
No idea where the mythical Gameboy Color version you've mentioned is, since playing any of them in GBC mode instead of SGB gives black and white for everything lol.

My secret: I do all testing on the VisualBoy Advance emulator, which allows you to set different color palettes. I, for my part, set three different palettes, or one per game, to match the default colors seen on an actual GBC or GBA as closely as possible.
 

Fotomac

Genwunner and proud of it
909
Posts
8
Years
  • Age 32
  • Seen Jan 9, 2023
Understand, I don't force players to set their own colors. I simply want to make sure people get the best possible experience out of these games, and if a graphical glitch is brought to my attention, I feel it my duty to warn them about it and to fix it as soon as I can.

That said, what do all those numbers mean regarding the palettes?
 

Fotomac

Genwunner and proud of it
909
Posts
8
Years
  • Age 32
  • Seen Jan 9, 2023
Tried assembling with the newly added Green version qualifiers, but Cygwin yelled at me over an entry on the SpecialTrainerIDs list. How do I type in Lt. Surge's entry in the list?
 

Fotomac

Genwunner and proud of it
909
Posts
8
Years
  • Age 32
  • Seen Jan 9, 2023
Hoo boy! I still have a long way to go... now I gotta name the trainers.
 

Fotomac

Genwunner and proud of it
909
Posts
8
Years
  • Age 32
  • Seen Jan 9, 2023
Even worse? I got yelled at for "SetCustomName", and I can't find where it should be called from.
 

Fotomac

Genwunner and proud of it
909
Posts
8
Years
  • Age 32
  • Seen Jan 9, 2023
Anyway, I'm going to do some rematch practice with some of the Trainers on Route 3, and I'm going to set it so just walking into their line of sight won't do the trick (you have to talk to them to trigger the rematch), with some exceptions.

I'm also thinking of adding some new Pokémon (only the evolutionary cousins of existing Pokémon, of course) for various purposes.

Once I'm positive the rematch code I inject works, I'll program rematches for Brock on Mt. Moon 1F and for Misty in Celadon City (both will have expanded teams which include one Pokémon each that isn't their type specialty--a Zubat for Brock, obvioiusly, but I'm not spoiling who Misty will use as part of her rematch team).

Oh, on a side note, I'm going to need to learn how to create new or modify existing maps. Also, I'm going to need someone to do sprites.
 

Fotomac

Genwunner and proud of it
909
Posts
8
Years
  • Age 32
  • Seen Jan 9, 2023
It's been nearly a week since I released Beta 1, so I felt like now's as good a time as any to list some things that have been thus far confirmed for Beta 2.

GLITCH FIXES
- Players of Green Beta 1 have reported that the colors are out of whack. It was discovered that the first time around, not all version differences between the Red, Green, and Blue Versions had been accounted for, so for Beta 2, this has been corrected as much as possible. The SGB border for the Green Version, however, will remain out of order for the time being while I figure out how to arrange the tiles.
- Some text boxes close automatically when the dialogue is finished. This is due to them ending with "done" instead of "prompt" and being followed immediately by another action in the script.
- Special thanks to Mateo for inspiring my fix to the 5 Poké Balls event. Some rearranging had to be done in both the script and text bank for Oak's Lab, but I was able to get it to an exact reproduction of the equivalent event sequence from FR/LG.

NEW FEATURES
- Most trainers will now have individual names; however, I'm still undecided about the sprites and am waiting for a spriter to create some sprites original to this hack.
- New Blaine sprite, based on his early design, courtesy of DarioEMeloD.
- Dark and Steel types to be added, with Bite and the Magnemite evolutionary line to be altered accordingly.
- Metal Claw and Iron Tail to be added.
- 2nd Fossil to be made available following a rematch with Brock.

TRAINERS/TRAINER CLASSES I HOPE TO ADD IN THE FUTURE
- Imakuni?
- Red/Leaf
- Magical Girl
- Ballerina

LOCATIONS I HOPE TO ADD IN THE FUTURE
- Celadon Ballet Academy
- Battle Resort or any similar location

FEATURES I HOPE TO ADD IN THE FUTURE
- General rematches
- Expanded Item Bag capacity
- Eggs
- Friendship
- 3rd Starter availability
- All Eeveelutions availability
- Ability to rematch Legendaries if defeated instead of captured
- Mew Glitch homage

This list for Beta 2 and the future subject to change.
 
Last edited:

DarioEMeloD

Casual Trainer
8
Posts
12
Years
I know you were looking for a proto-Blaine sprite, I thought I'd give it a shot. I wasn't sure if you didn't want him to be too much like his anime counterpart, so I only edited his face for now.

Blaine.png
 

Fotomac

Genwunner and proud of it
909
Posts
8
Years
  • Age 32
  • Seen Jan 9, 2023
I know you were looking for a proto-Blaine sprite, I thought I'd give it a shot. I wasn't sure if you didn't want him to be too much like his anime counterpart, so I only edited his face for now.

Blaine.png

Thanks! Oh, could you do some more sprites, both for Trainers and for new Pokémon?
 

RaidenRaider

I WILL Catch'em ALL!!!!
21
Posts
8
Years
  • Age 38
  • Seen Apr 15, 2020
Weirdly. Despite the recent update to the Git source that fixes the compile error, the files won't compile for me in Cygwin.

All it gives me is :
$ make
rgbasm -h -o red/audio.o red/audio.asm
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(10) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(11) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(12) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(13) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(14) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(15) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(16) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(17) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(18) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(19) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(20) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(21) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(22) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(23) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(24) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(25) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(26) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(27) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(28) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(29) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(30) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(31) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(32) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(33) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(34) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(35) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(36) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(37) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(38) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(39) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(40) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(41) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(42) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(43) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(44) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(45) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(46) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(47) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(48) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(49) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(50) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(51) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(52) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(53) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(54) -> trainer_const(2) :
'OPP_' already defined
ERROR: red/audio.asm(2) -> audio.asm(6) -> constants.asm(12) -> constants/train er_constants.asm(55) -> trainer_const(2) :
'OPP_' already defined
: Assembly aborted in pass 1 (46 errors)!
Makefile:77: recipe for target 'red/audio.o' failed
make: *** [red/audio.o] Error 1
 

Fotomac

Genwunner and proud of it
909
Posts
8
Years
  • Age 32
  • Seen Jan 9, 2023
That's odd, it compiled perfectly on my end.
 

Fotomac

Genwunner and proud of it
909
Posts
8
Years
  • Age 32
  • Seen Jan 9, 2023
Uh-oh. Looks like I encountered a bug at the start. Even if I select the female player character, the male player character's backsprite is used instead. And I'm pretty sure everything I was told to put in each file in Mateo's "Adding Gender Selection" tutorial on Skeetendo was still in the right place at the time of last compile. Did I move something I shouldn't have in main.asm? (On a side note, also note that both Oak's and Blue's sprites are facing upward as you're about to select your first Pokémon.)

ETA: Worse, with Metal Claw and Iron Tail in there, Bank $E is too big for any compile to be successful with data/moves.asm in there.
 
Last edited:

RaidenRaider

I WILL Catch'em ALL!!!!
21
Posts
8
Years
  • Age 38
  • Seen Apr 15, 2020
ETA: Worse, with Metal Claw and Iron Tail in there, Bank $E is too big for any compile to be successful with data/moves.asm in there.

I had a problem with Bank $E as well. While I was compiling my own hack. What kind of error are you getting?

Mine was in engine/battle/e.asm at line 714, which had INCLUDE "engine/battle/read_trainer.asm". What I did, with help from Mateo, was copy that INCLUDE line and comment it out in engine/battle/e.asm, and then paste it into main.asm in Bank 3A. Then the ROM compiled. Whatever you do though, don't remove INCLUDE "engine/battle/e.asm" from Bank $E.
 

Fotomac

Genwunner and proud of it
909
Posts
8
Years
  • Age 32
  • Seen Jan 9, 2023
I had a problem with Bank $E as well. While I was compiling my own hack. What kind of error are you getting?

Mine was in engine/battle/e.asm at line 714, which had INCLUDE "engine/battle/read_trainer.asm". What I did, with help from Mateo, was copy that INCLUDE line and comment it out in engine/battle/e.asm, and then paste it into main.asm in Bank 3A. Then the ROM compiled. Whatever you do though, don't remove INCLUDE "engine/battle/e.asm" from Bank $E.

What I did was move the Trading Animation Graphics to Bank $10, and also "data/base_stats.asm" to the same bank, editing a portion of "engine/evos_moves.asm" to reflect the move, and that freed up enough space to permit compiling.

Oh, and I fixed both glitches I mentioned earlier by injecting some code into "engine/overworld/movement.asm" (I knew immediately what to do while looking through the commits to Mateo's Red++ Github rep for a solution) and by filling in some blanks in "data/trainer_parties.asm" (I discovered a lead while testing out the newly-compiled Red when Blue summoned a Lv. 34 Koffing instead of his Lv. 5 starter).
 
Last edited:

Fotomac

Genwunner and proud of it
909
Posts
8
Years
  • Age 32
  • Seen Jan 9, 2023
Beta 2 is now available. There were a couple of glitches I caught, but I don't really have time to fix them right now, so they'll be fixed for Beta 2.1.

And new Pokémon and Imakuni? will be available for Beta 3 for sure.
 

RaidenRaider

I WILL Catch'em ALL!!!!
21
Posts
8
Years
  • Age 38
  • Seen Apr 15, 2020
I was wondering for your assembly of the Pokemon Green rom in the Github source, how did you get the assembler to build it separately with the "green version" titlescreen and the selection of green Pokemon to scroll below it, so that it is distinct from the Red and Blue versions?
 

Fotomac

Genwunner and proud of it
909
Posts
8
Years
  • Age 32
  • Seen Jan 9, 2023
I simply added identifiers for the Green version where necessary and edited the makefile to call for Cygwin to produce a Green Version ROM along with those for the Red and Blue Versions.
 

Fotomac

Genwunner and proud of it
909
Posts
8
Years
  • Age 32
  • Seen Jan 9, 2023
By the next Beta, expect some translation corrections, and I'm going to try to add at least one new Pokémon: Togepi. I may add more, of course (including Bellossom, Politoed, Steelix, Kingdra, Scizor, Heracross, Togetic, Pikablu, Raiblu, Snubbull, Granbull, Phanpy, and Donphan). But, of course, I'm going to need some backsprites based on existing Japanese Red and Green-style devamped sprites (and I'm sure I can find Japanese Blue and International Red and Blue-style devamped sprites for some of these mentioned, including Togepi, and I also intend to create one such sprite, but I may need someone such as DarioEMeloD to create such sprites for others).
 

Fotomac

Genwunner and proud of it
909
Posts
8
Years
  • Age 32
  • Seen Jan 9, 2023
Posting in here again because I'm looking for a solution I've thus far been unable to find on Skeetendo.

Namely, how do I do the "Enemy ODDISH used POISONPOWDER! It doesn't affect IVYSAUR!" effect properly? This is the code I'm concerned about:

PoisonEffect: ; 3f24f (f:724f)
ld hl, wEnemyMonStatus
ld de, wPlayerMoveEffect
ld a, [H_WHOSETURN]
and a
jr z, .poisonEffect
ld hl, wBattleMonStatus
ld de, wEnemyMoveEffect
.poisonEffect
call CheckTargetSubstitute
jr nz, .noEffect ; can't posion a substitute target
ld a, [hli]
ld b, a
and a
jr nz, .noEffect ; miss if target is already statused
ld a, [hli]
cp POISON ; can't posion a poison-type target
jr z, .versusPoison
ld a, [hld]
cp POISON ; can't posion a poison-type target
jr z, .noEffect
ld a, [de]
cp POISON_SIDE_EFFECT1
ld b, $34 ; ~20% chance of poisoning
jr z, .sideEffectTest
cp POISON_SIDE_EFFECT2
ld b, $67 ; ~40% chance of poisoning
jr z, .sideEffectTest
push hl
push de
call MoveHitTest ; apply accuracy tests
pop de
pop hl
ld a, [wMoveMissed]
and a
jr nz, .didntAffect
jr .inflictPoison
.sideEffectTest
call BattleRandom
cp b ; was side effect successful?
ret nc
.inflictPoison
dec hl
set 3, [hl] ; mon is now poisoned
push de
dec de
ld a, [H_WHOSETURN]
and a
ld b, ANIM_C7
ld hl, wPlayerBattleStatus3
ld a, [de]
ld de, wPlayerToxicCounter
jr nz, .ok
ld b, ANIM_A9
ld hl, wEnemyBattleStatus3
ld de, wEnemyToxcCounter
.ok
cp TOXIC
jr nz, .normalPoison ; done if move is not Toxic
set BadlyPoisoned, [hl] ; else set Toxic battstatus
xor a
ld [de], a
ld hl, BadlyPoisonedText
jr .asm_3f2c0
.normalPoison
ld hl, PoisonedText
.asm_3f2c0
pop de
ld a, [de]
cp POISON_EFFECT
jr z, .asm_3f2cd
ld a, b
call PlayBattleAnimation2
jp PrintText
.asm_3f2cd
call PlayCurrentMoveAnimation2
jp PrintText
.noEffect
ld a, [de]
cp POISON_EFFECT
ret nz
.didntAffect
ld c, 50
call DelayFrames
jp PrintDidntAffectText
.versusPoison
ld c, 50
call DelayFrames
jp PrintDoesntAffectText

I know what .versusPoison is intended to do; now I gotta know where to put it so that the "doesn't affect" message doesn't appear immediately after a Poison-type attack is used against a primary nor secondary Poison-type Pokémon (the way the code's presently arranged, the "doesn't affect" message plays following a damaging attack connecting against the former, but not the latter).

Oh, another issue I almost forgot about. I'm also finally getting around to making a full-color version of my hack, but before I can compile, I must move something from "home.asm", or else Cygwin will continue to yell at me. Unfortunately, I'm not really sure which bit of code can be safely moved from "home.asm".
 
Last edited:
Back
Top