A utility made by RHDN's own Snarfblam called DungeonMaster.
The way that he has set it up is that it will let you know which groupings of enemies can be selected for each level.
For example, I selected Ganon/Patra and then placed the Patra in the room where Auqamentus was in L1Q1. In doing so the correct tilesets and palettes are assigned. The same applies with minor enemys, including Lanmola's. Select the correct enemy set, then place them where you wish. The catch is, you can only place enemies from that sub-set group in the entire level. Any other enemy's will still appear and function, but their graphics will be glitched because only the graphics and palettes for that subset are loaded into memory. It's how the internals of LOZ1 works.
So unless you are going to get into some serious ASM coding(which has been done) to change those behaviors, those predetermined behaviors will be the limiting factor.
I used Zelda Tech for the boss changes, so maybe that's why I ended up with things borked in that regard.
Could I ask you for a favor?
Could you perhaps try to recreate the changes I did for the bosses with Dungeon Master over a clean Zelda 1 (PRG0) ROM, and make an IPS out of it with just those changes, please?
The enemy changes are as follows:
1st Quest - Level 4: Changes the Manhandla in the level to Red Lanmolas, keeps the two-headed Gleeok at the end
1st Quest - Level 7: Changes the Aquamentus for a Patra with Oval attack cycle
2nd Quest - Level 2: Changes the two-headed Gleeok to Blue Lanmolas (You can still fight a two-headed Gleeok in Level 6)
2nd Quest - Level 8: Changes the 3 Dodongos to a Patra with Circle attack cycle
Aside from that, I might need a little help with some ASM I started doing for trying to Switch items with the Select button.
I managed to get rid of the Pause when pressing Select by NOP'ing the code from 0x1EC4C-0x1EC51. That makes it so that pressing Select doesn't Pause the game. Basically, RAM address $00E0 is the one that handles whether the game is paused or not ($00 for unpaused, $01 for paused), so I simply got rid of the code that sets that byte.
I made some custom code, which I tested with an online 6502 assembler, but I can't get it to work in-game, not sure why.
Some explanation before the code:
1) RAM $0656 is the one that determines the position of the cursor on the inventory screen, or rather, what item is selected. This value goes from anything between $00 (Boomerang) up to $08 (Rod). It can still go past $08, but that will put Key items in the B button instead, like the Raft and so on, so the limit should be $08. Once it tries to reach $09, it should reset to $00.
Item values are:
$00 - Boomerang
$01 - Bombs
$02 - Arrows (Normal/Silver)
$03 - Bow
$04 - Candle (Red/Blue)
$05 - Flute
$06 - Food/Bait
$07 - Potions (Red/Blue)
$08 - Magic Rod
2) The cursor should bypass any possible position if a particular item has not been obtained.
For example, I think bombs are $01, so if the player still hasn't obtained bombs, the cursor should skip value $01, and instead go for the next possible value. This can be done by checking if the item in a certain item slot is obtained (each item has a RAM address to know if Link has obtained it) before incrementing the value at $0656.
Here are the RAM addresses for each item, to know if it has been obtained or not:
0658 Number of Bombs
0659 Arrow status $00=None, $01=Arrow, $02=Silver Arrow
065A Bow in Inventory $00=False, $01=True
065B Status of candle $00=None, $01=Blue Candle, $02=Red Candle
065C Whistle in Inventory $00=False, $01=True
065D Food in Inventory $00=False, $01=True
065E Potion in Inventory $00=None/Letter, $01=Life Potion, $02=2nd Potion
065F Magical Rod in Inventory $00=False, $01=True
3) The bow and arrows are special cases for this hack.
If you have the bow, but not the arrows, and you change the RAM address $0656 manually to value $03, then the B button item changes to the bow alone (no arrows). Same for having arrows but no bow, value $02 can select the arrows as the item, but not use them since you don't have the bow yet.
So for these two, I need to check specifically if any type of arrows ($01 - Normal, $02 - Silver) have been obtained at $0659, and if the bow has been obtained as well at $065A, to effectively make the proper check for the increment of the inventory/item select.
With those points made, here's the code I have:
org $EC3C // $1EC4C
nop // NOP the LDA $00E0 at $EC3C (A5 E0)
nop // NOP the EOR #$01 (49 01)
nop // NOP the STA $00E0 (85 E0)
org $BFC0 //$17FD0
inc $0656 // Increment value at $0656
lda.w $0656 // Load value from $0656
cmp.b #$02 // Is the item position $02?
cmp.b #$09 // If $0656 < 9, reset to $00
bcs set_selection // Carry is known to be set, so this act as a "BRA" from 65816
lda.w $065A // Does the player have the bow? (0 if no)
lda.w $0659 // Does the player have arrows? (0 if no)
Any suggestion or help would be greatly appreciated!