initial base for local items, need to finish

This commit is contained in:
Silvris
2024-03-21 00:33:44 -05:00
parent 401aeaeea4
commit 1693213835
6 changed files with 70 additions and 9 deletions

View File

@@ -420,7 +420,7 @@ def rgb888_to_bgr555(red, green, blue) -> bytes:
return struct.pack("H", outcol)
def get_palette_bytes(palette, target, offset, factor):
def get_palette_bytes(palette, target, offset, factor) -> bytes:
output_data = bytearray()
for color in target:
hexcol = palette[color]
@@ -431,4 +431,4 @@ def get_palette_bytes(palette, target, offset, factor):
col = tuple(int(int(factor*x) + offset) for x in col)
byte_data = rgb888_to_bgr555(col[0], col[1], col[2])
output_data.extend(bytearray(byte_data))
return output_data
return bytes(output_data)

View File

@@ -387,9 +387,6 @@ def patch_rom(world: "KDL3World", patch: KDL3ProcedurePatch):
patch.write_file("kdl3_basepatch.bsdiff4",
get_data(__name__, os.path.join("data", "kdl3_basepatch.bsdiff4")))
tiles = get_data(__name__, os.path.join("data", "APPauseIcons.dat"))
patch.write_token(APTokenTypes.WRITE, 0x3F000, tiles)
# Write open world patch
if world.options.open_world:
patch.write_token(APTokenTypes.WRITE, 0x143C7, bytes([0xAD, 0xC1, 0x5A, 0xCD, 0xC1, 0x5A, ]))
@@ -449,7 +446,7 @@ def patch_rom(world: "KDL3World", patch: KDL3ProcedurePatch):
patch.write_token(APTokenTypes.WRITE, 0x4A38D, world.random.choice(music_choices).to_bytes(1, "little"))
for room in rooms:
room.patch(patch)
room.patch(patch, bool(world.options.consumables.value), True)
if world.options.virtual_console in [1, 3]:
# Flash Reduction

View File

@@ -2,6 +2,7 @@ import struct
import typing
from BaseClasses import Region, ItemClassification
from worlds.Files import APTokenTypes
from .ClientAddrs import consumable_addrs, star_addrs
if typing.TYPE_CHECKING:
from .Rom import KDL3ProcedurePatch
@@ -43,14 +44,39 @@ class KDL3Room(Region):
self.consumables = consumables
self.consumable_pointer = consumable_pointer
def patch(self, patch: "KDL3ProcedurePatch"):
def patch(self, patch: "KDL3ProcedurePatch", consumables: bool, local_items: bool):
patch.write_token(APTokenTypes.WRITE, self.pointer + 2, self.music.to_bytes(1, "little"))
animals = [x.item.name for x in self.locations if "Animal" in x.name]
if len(animals) > 0:
for current_animal, address in zip(animals, self.animal_pointers):
patch.write_token(APTokenTypes.WRITE, self.pointer + address + 7,
animal_map[current_animal].to_bytes(1, "little"))
if self.multiworld.worlds[self.player].options.consumables:
if local_items:
for location in self.locations:
if not location.address or location.item.player != self.player:
continue
item = location.item.code
item_idx = item & 0x00000F
location_idx = location.address & 0xFFFF
if location_idx & 0xF00 in (0x300, 0x400, 0x500, 0x600):
# consumable or star, need remapped
location_base = location_idx & 0xF00
if location_base == 0x300:
# consumable
location_idx = consumable_addrs[location_idx & 0xFF] | 0x1000
else:
# star
location_idx = star_addrs[location.address] | 0x2000
if item & 0x000070 == 0:
patch.write_token(APTokenTypes.WRITE, 0x4B000 + location_idx, bytes([item_idx | 0x10]))
elif item & 0x000010 > 0:
patch.write_token(APTokenTypes.WRITE, 0x4B000 + location_idx, bytes([item_idx | 0x20]))
elif item & 0x000020 > 0:
patch.write_token(APTokenTypes.WRITE, 0x4B000 + location_idx, bytes([item_idx | 0x40]))
elif item & 0x000040 > 0:
patch.write_token(APTokenTypes.WRITE, 0x4B000 + location_idx, bytes([item_idx | 0x80]))
if consumables:
load_len = len(self.entity_load)
for consumable in self.consumables:
location = next(x for x in self.locations if x.name == consumable["name"])

View File

@@ -519,8 +519,16 @@ ConsumableSet:
BRA .LoopHead ; return to loop head
.ApplyCheck:
LDA $A000, X ; consumables index
PHA
ORA #$0001
STA $A000, X
PLA
AND #$00FF
BNE .Return
TXA
ORA #$1000
JSL ApplyLocalCheck
.Return:
PLY
PLX
PLA
@@ -1183,8 +1191,15 @@ StarsSet:
BRA .2LoopHead
.2LoopEnd:
LDA $B000, X
PHA
ORA #$0001
STA $B000, X
PLA
AND #$00FF
BNE .Return
TXA
ORA #$2000
JSL ApplyLocalCheck
.Return:
PLY
PLX
@@ -1199,6 +1214,26 @@ StarsSet:
STA $39D7
BRA .Return
org $07A680
ApplyLocalCheck:
; args: A-address of check following $08B000
TAX
LDA $08B000, X
AND #$00FF
TAY
LDX #$0000
.Loop:
LDA $C000, X
BEQ .Apply
INX
INX
CPX #$0010
BCC .Loop
BRA .Return ; this is dangerous, could lose a check here
.Apply:
STY $C000, X
.Return:
RTL
org $07C000
db "KDL3_BASEPATCH_ARCHI"
@@ -1234,4 +1269,7 @@ org $07E040
db $3A, $01
db $3B, $05
db $3C, $05
db $3D, $05
db $3D, $05
org $07F000
incbin "APPauseIcons.bin"