mirror of
https://github.com/cemu-project/cemu_graphic_packs.git
synced 2024-11-29 12:54:15 +01:00
[BotW] Add Xbox Button Layout pack, fix grass on UW res, day time pack!
* Can now use the Xbox Button Layout graphic pack to swap the ABXY buttons around to follow the standard Xbox Controller layout. Will still have to download file mods for PS4/PS5 controllers. * Fully fix grass on ultrawide resolutions, since distant grass was apparently also bugged! * Rewrite the time mod to work much better since previously it could sometimes be kinda buggy. You can now also force a time of day.
This commit is contained in:
parent
84fb724c9e
commit
57300c7aa2
@ -30,6 +30,9 @@ moduleMatches = 0x6267BFD0
|
|||||||
0x035b0a30 = lis r5, grassCulling@ha
|
0x035b0a30 = lis r5, grassCulling@ha
|
||||||
0x035b0a38 = lfs f11, grassCulling@l(r5)
|
0x035b0a38 = lfs f11, grassCulling@l(r5)
|
||||||
|
|
||||||
|
; 2nd Type Of Grass Culling (calculated every frame)
|
||||||
|
; Still kinda unsure how this should be calculated but it works
|
||||||
|
0x1047BFB8 = .float (($ultrawideHUDMode != 0)*(120*0.5) + (($ultrawideHUDMode == 0)*(120)))
|
||||||
|
|
||||||
|
|
||||||
[BotW_AspectRatio_V176V192]
|
[BotW_AspectRatio_V176V192]
|
||||||
|
@ -56,7 +56,11 @@ li r10, $ultrawideHUDMode
|
|||||||
cmpwi r10, 0
|
cmpwi r10, 0
|
||||||
beq exitScale
|
beq exitScale
|
||||||
|
|
||||||
; Log currently loaded pane to register
|
; Log currently loaded pane to register if logging is enabled
|
||||||
|
li r10, $enableUltrawideDebugLogging
|
||||||
|
cmpwi r10, 2
|
||||||
|
blt skipPaneLogging
|
||||||
|
|
||||||
mr r10, r3
|
mr r10, r3
|
||||||
mr r11, r4
|
mr r11, r4
|
||||||
mr r12, r5
|
mr r12, r5
|
||||||
@ -71,6 +75,8 @@ mr r3, r10
|
|||||||
mr r4, r11
|
mr r4, r11
|
||||||
mr r5, r12
|
mr r5, r12
|
||||||
|
|
||||||
|
skipPaneLogging:
|
||||||
|
|
||||||
; ------------------------------------------------------------------------------------------
|
; ------------------------------------------------------------------------------------------
|
||||||
; Store whether there's a subpanel name
|
; Store whether there's a subpanel name
|
||||||
|
|
||||||
@ -2816,7 +2822,7 @@ blr
|
|||||||
; ------------------------------------------------------------------------------------------
|
; ------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
_createNewScreenHook:
|
_createNewScreenHook:
|
||||||
; Copy
|
; Copy screen name to buffer
|
||||||
lis r11, copyScreenStringLen@ha
|
lis r11, copyScreenStringLen@ha
|
||||||
lwz r11, copyScreenStringLen@l(r11)
|
lwz r11, copyScreenStringLen@l(r11)
|
||||||
lis r12, copyScreenString@ha
|
lis r12, copyScreenString@ha
|
||||||
@ -2842,6 +2848,10 @@ addi r11, r11, -1
|
|||||||
cmpwi r11, -1
|
cmpwi r11, -1
|
||||||
bne eraseSubPanelLoop
|
bne eraseSubPanelLoop
|
||||||
|
|
||||||
|
li r10, $enableUltrawideDebugLogging
|
||||||
|
cmpwi r10, 1
|
||||||
|
blt skipLayoutFileLogging
|
||||||
|
|
||||||
crxor 4*cr1+eq, 4*cr1+eq, 4*cr1+eq
|
crxor 4*cr1+eq, 4*cr1+eq, 4*cr1+eq
|
||||||
lis r3, newLineFormatScreen@ha
|
lis r3, newLineFormatScreen@ha
|
||||||
addi r3, r3, newLineFormatScreen@l
|
addi r3, r3, newLineFormatScreen@l
|
||||||
@ -2854,6 +2864,8 @@ bl import.coreinit.OSReport
|
|||||||
mtlr r10
|
mtlr r10
|
||||||
mr r3, r11
|
mr r3, r11
|
||||||
|
|
||||||
|
skipLayoutFileLogging:
|
||||||
|
|
||||||
lwz r11, 0xC(r30)
|
lwz r11, 0xC(r30)
|
||||||
blr
|
blr
|
||||||
|
|
||||||
|
@ -25,6 +25,8 @@ $shadowNearbyEnd = 1.0
|
|||||||
$shadowFarStart = 1.0
|
$shadowFarStart = 1.0
|
||||||
$shadowFarEnd = 1.0
|
$shadowFarEnd = 1.0
|
||||||
|
|
||||||
|
# Should be set to 1 or 2 (changes verbosity of loggin) when trying to log the layout of panes while they're getting loaded for debugging purposes
|
||||||
|
$enableUltrawideDebugLogging:int = 0
|
||||||
|
|
||||||
# Aspect Ratio
|
# Aspect Ratio
|
||||||
|
|
||||||
|
@ -0,0 +1,199 @@
|
|||||||
|
[BotW_XboxImageReplacement_V208]
|
||||||
|
moduleMatches = 0x6267BFD0
|
||||||
|
|
||||||
|
.origin = codecave
|
||||||
|
|
||||||
|
str_Nt_KeyTexA_00_d:
|
||||||
|
.string "Nt_KeyTexA_00^d.bflim"
|
||||||
|
str_Nt_KeyTexB_00_d:
|
||||||
|
.string "Nt_KeyTexB_00^d.bflim"
|
||||||
|
str_Nt_KeyTexX_00_d:
|
||||||
|
.string "Nt_KeyTexX_00^d.bflim"
|
||||||
|
str_Nt_KeyTexY_00_d:
|
||||||
|
.string "Nt_KeyTexY_00^d.bflim"
|
||||||
|
|
||||||
|
loadLineFormat:
|
||||||
|
.string " -> Loaded .bflym: %s - Replaced with: %s %c"
|
||||||
|
loadLineReplacement:
|
||||||
|
.string "None"
|
||||||
|
loadLineCharacter:
|
||||||
|
.int 10
|
||||||
|
.align 4
|
||||||
|
|
||||||
|
|
||||||
|
; compares the string from r4 and r5
|
||||||
|
; r4 is untouched, so use that to do multiple comparisons
|
||||||
|
; other registers used: r0, r11, r3, r31
|
||||||
|
tempR4:
|
||||||
|
.int 0
|
||||||
|
tempR5:
|
||||||
|
.int 0
|
||||||
|
tempR6:
|
||||||
|
.int 0
|
||||||
|
tempR7:
|
||||||
|
.int 0
|
||||||
|
tempR0:
|
||||||
|
.int 0
|
||||||
|
tempR11:
|
||||||
|
.int 0
|
||||||
|
tempR3:
|
||||||
|
.int 0
|
||||||
|
tempR13:
|
||||||
|
.int 0
|
||||||
|
tempR31:
|
||||||
|
.int 0
|
||||||
|
|
||||||
|
; Unused registers: r12, r0, r31, r10, r6
|
||||||
|
_replaceButtonPrompts:
|
||||||
|
; Check if image filename isn't 0
|
||||||
|
cmpwi r5, 0
|
||||||
|
beqlr
|
||||||
|
|
||||||
|
mflr r13
|
||||||
|
|
||||||
|
; Backup registers
|
||||||
|
lis r12, tempR3@ha
|
||||||
|
stw r3, tempR3@l(r12)
|
||||||
|
lis r12, tempR4@ha
|
||||||
|
stw r4, tempR4@l(r12)
|
||||||
|
lis r12, tempR5@ha
|
||||||
|
stw r5, tempR5@l(r12)
|
||||||
|
lis r12, tempR6@ha
|
||||||
|
stw r6, tempR6@l(r12)
|
||||||
|
lis r12, tempR7@ha
|
||||||
|
stw r7, tempR7@l(r12)
|
||||||
|
lis r12, tempR0@ha
|
||||||
|
stw r0, tempR0@l(r12)
|
||||||
|
lis r12, tempR11@ha
|
||||||
|
stw r11, tempR11@l(r12)
|
||||||
|
lis r12, tempR13@ha
|
||||||
|
stw r13, tempR13@l(r12)
|
||||||
|
lis r12, tempR31@ha
|
||||||
|
stw r31, tempR31@l(r12)
|
||||||
|
|
||||||
|
; Check for buttons from e.g. DoCommand layout (used when holding something, climbing, jumping off a cliff etc)
|
||||||
|
lis r4, str_Nt_KeyTexA_00_d@ha
|
||||||
|
addi r4, r4, str_Nt_KeyTexA_00_d@l
|
||||||
|
bla _compareString
|
||||||
|
beq replaceWithBButton
|
||||||
|
lis r4, str_Nt_KeyTexB_00_d@ha
|
||||||
|
addi r4, r4, str_Nt_KeyTexB_00_d@l
|
||||||
|
bla _compareString
|
||||||
|
beq replaceWithAButton
|
||||||
|
lis r4, str_Nt_KeyTexX_00_d@ha
|
||||||
|
addi r4, r4, str_Nt_KeyTexX_00_d@l
|
||||||
|
bla _compareString
|
||||||
|
beq replaceWithYButton
|
||||||
|
lis r4, str_Nt_KeyTexY_00_d@ha
|
||||||
|
addi r4, r4, str_Nt_KeyTexY_00_d@l
|
||||||
|
bla _compareString
|
||||||
|
beq replaceWithXButton
|
||||||
|
|
||||||
|
li r3, $enableDebugLogging
|
||||||
|
cmpwi r3, 1
|
||||||
|
bne skipImageLogging
|
||||||
|
|
||||||
|
; Log the image that's trying to get loaded, r5 already contains the image name
|
||||||
|
crxor 4*cr1+eq, 4*cr1+eq, 4*cr1+eq
|
||||||
|
lis r3, loadLineFormat@ha
|
||||||
|
addi r3, r3, loadLineFormat@l
|
||||||
|
mr r4, r5
|
||||||
|
lis r5, loadLineReplacement@ha
|
||||||
|
addi r5, r5, loadLineReplacement@l
|
||||||
|
lis r6, loadLineCharacter@ha
|
||||||
|
lwz r6, loadLineCharacter@l(r6)
|
||||||
|
bl import.coreinit.OSReport
|
||||||
|
|
||||||
|
skipImageLogging:
|
||||||
|
|
||||||
|
; If no matches, exit the hook
|
||||||
|
lis r12, tempR5@ha
|
||||||
|
lwz r5, tempR5@l(r12)
|
||||||
|
b exitHook
|
||||||
|
|
||||||
|
replaceWithAButton:
|
||||||
|
lis r6, str_Nt_KeyTexA_00_d@ha
|
||||||
|
addi r6, r6, str_Nt_KeyTexA_00_d@l
|
||||||
|
b logReplacement
|
||||||
|
|
||||||
|
replaceWithBButton:
|
||||||
|
lis r6, str_Nt_KeyTexB_00_d@ha
|
||||||
|
addi r6, r6, str_Nt_KeyTexB_00_d@l
|
||||||
|
b logReplacement
|
||||||
|
|
||||||
|
replaceWithXButton:
|
||||||
|
lis r6, str_Nt_KeyTexX_00_d@ha
|
||||||
|
addi r6, r6, str_Nt_KeyTexX_00_d@l
|
||||||
|
b logReplacement
|
||||||
|
|
||||||
|
replaceWithYButton:
|
||||||
|
lis r6, str_Nt_KeyTexY_00_d@ha
|
||||||
|
addi r6, r6, str_Nt_KeyTexY_00_d@l
|
||||||
|
b logReplacement
|
||||||
|
|
||||||
|
|
||||||
|
logReplacement:
|
||||||
|
; Log the image that's trying to get loaded, r5 already contains the image name
|
||||||
|
crxor 4*cr1+eq, 4*cr1+eq, 4*cr1+eq
|
||||||
|
lis r3, loadLineFormat@ha
|
||||||
|
addi r3, r3, loadLineFormat@l
|
||||||
|
mr r4, r5
|
||||||
|
mr r5, r6
|
||||||
|
lis r6, loadLineCharacter@ha
|
||||||
|
lwz r6, loadLineCharacter@l(r6)
|
||||||
|
bl import.coreinit.OSReport
|
||||||
|
b exitHook
|
||||||
|
|
||||||
|
exitHook:
|
||||||
|
lis r12, tempR3@ha
|
||||||
|
lwz r3, tempR3@l(r12)
|
||||||
|
lis r12, tempR4@ha
|
||||||
|
lwz r4, tempR4@l(r12)
|
||||||
|
lis r12, tempR6@ha
|
||||||
|
lwz r6, tempR6@l(r12)
|
||||||
|
lis r12, tempR7@ha
|
||||||
|
lwz r7, tempR7@l(r12)
|
||||||
|
lis r12, tempR0@ha
|
||||||
|
lwz r0, tempR0@l(r12)
|
||||||
|
lis r12, tempR11@ha
|
||||||
|
lwz r11, tempR11@l(r12)
|
||||||
|
lis r12, tempR13@ha
|
||||||
|
lwz r13, tempR13@l(r12)
|
||||||
|
lis r12, tempR31@ha
|
||||||
|
lwz r31, tempR31@l(r12)
|
||||||
|
|
||||||
|
mtlr r13
|
||||||
|
lwz r12, 0(r3)
|
||||||
|
blr
|
||||||
|
|
||||||
|
0x03C48B68 = bla _replaceButtonPrompts
|
||||||
|
|
||||||
|
; compares the string from r4 and r5
|
||||||
|
; r4 is untouched, so use that to do multiple comparisons
|
||||||
|
; other registers used: r0, r11, r3, r31
|
||||||
|
_compareString:
|
||||||
|
mr r31, r5
|
||||||
|
|
||||||
|
startLoop:
|
||||||
|
lbz r0, 0(r31)
|
||||||
|
lbz r3, 0(r4)
|
||||||
|
|
||||||
|
cmpwi r0, 0
|
||||||
|
bne checkForMatch
|
||||||
|
cmpwi r3, 0
|
||||||
|
bne checkForMatch
|
||||||
|
li r4, 1
|
||||||
|
cmpwi r4, 1
|
||||||
|
blr
|
||||||
|
|
||||||
|
checkForMatch:
|
||||||
|
cmpw r0, r3
|
||||||
|
bne noMatch
|
||||||
|
addi r31, r31, 1
|
||||||
|
addi r4, r4, 1
|
||||||
|
b startLoop
|
||||||
|
|
||||||
|
noMatch:
|
||||||
|
li r4, 0
|
||||||
|
cmpwi r4, 1
|
||||||
|
blr
|
@ -0,0 +1,261 @@
|
|||||||
|
[BotW_XboxTextReplacement_V208]
|
||||||
|
moduleMatches = 0x6267BFD0
|
||||||
|
|
||||||
|
.origin = codecave
|
||||||
|
|
||||||
|
textReplacementFormat:
|
||||||
|
.string " -> Button %s: Changed text to %.10s = hex: 0x%2X%c"
|
||||||
|
textReplacementCharacter:
|
||||||
|
.int 10
|
||||||
|
.align 4
|
||||||
|
|
||||||
|
wcharToCharBuffer:
|
||||||
|
.string " "
|
||||||
|
|
||||||
|
.align 4
|
||||||
|
str_WideA:
|
||||||
|
.byte 0x00
|
||||||
|
.byte 0x41
|
||||||
|
.byte 0x00
|
||||||
|
.byte 0x00
|
||||||
|
str_WideB:
|
||||||
|
.byte 0x00
|
||||||
|
.byte 0x42
|
||||||
|
.byte 0x00
|
||||||
|
.byte 0x00
|
||||||
|
str_WideX:
|
||||||
|
.byte 0x00
|
||||||
|
.byte 0x58
|
||||||
|
.byte 0x00
|
||||||
|
.byte 0x00
|
||||||
|
str_WideY:
|
||||||
|
.byte 0x00
|
||||||
|
.byte 0x59
|
||||||
|
.byte 0x00
|
||||||
|
.byte 0x00
|
||||||
|
.align 4
|
||||||
|
|
||||||
|
str2_WideA:
|
||||||
|
.byte 0xE0
|
||||||
|
.byte 0x40
|
||||||
|
.byte 0x00
|
||||||
|
.byte 0x00
|
||||||
|
str2_WideB:
|
||||||
|
.byte 0xE0
|
||||||
|
.byte 0x41
|
||||||
|
.byte 0x00
|
||||||
|
.byte 0x00
|
||||||
|
str2_WideX:
|
||||||
|
.byte 0xE0
|
||||||
|
.byte 0x42
|
||||||
|
.byte 0x00
|
||||||
|
.byte 0x00
|
||||||
|
str2_WideY:
|
||||||
|
.byte 0xE0
|
||||||
|
.byte 0x43
|
||||||
|
.byte 0x00
|
||||||
|
.byte 0x00
|
||||||
|
str2_WideDefault:
|
||||||
|
.byte 0xE0
|
||||||
|
.byte 0x43
|
||||||
|
.byte 0x00
|
||||||
|
.byte 0x00
|
||||||
|
.align 4
|
||||||
|
|
||||||
|
; free registers r9, r3, r31, r5, r0
|
||||||
|
; r4 holds text
|
||||||
|
; r29 + 0x80 is start of the name of the text pane
|
||||||
|
patchText:
|
||||||
|
|
||||||
|
mr r31, r6
|
||||||
|
mr r12, r4
|
||||||
|
mflr r9
|
||||||
|
|
||||||
|
li r3, $enableDebugLogging
|
||||||
|
cmpwi r3, 1
|
||||||
|
bne skipTextLogging
|
||||||
|
|
||||||
|
; Make temporary conversion of wide char to char
|
||||||
|
lis r3, wcharToCharBuffer@ha
|
||||||
|
addi r3, r3, wcharToCharBuffer@l
|
||||||
|
|
||||||
|
li r5, 1
|
||||||
|
li r6, 0
|
||||||
|
wcharToCharLoop:
|
||||||
|
lbzx r0, r4, r5
|
||||||
|
stbx r0, r3, r6
|
||||||
|
addi r5, r5, 2
|
||||||
|
addi r6, r6, 1
|
||||||
|
cmpwi r6, 10 ; only copy 10 characters
|
||||||
|
bne wcharToCharLoop
|
||||||
|
|
||||||
|
lis r5, wcharToCharBuffer@ha
|
||||||
|
addi r5, r5, wcharToCharBuffer@l
|
||||||
|
|
||||||
|
; Log the text that's being loaded
|
||||||
|
mr r0, r7
|
||||||
|
crxor 4*cr1+eq, 4*cr1+eq, 4*cr1+eq
|
||||||
|
lis r3, textReplacementFormat@ha
|
||||||
|
addi r3, r3, textReplacementFormat@l
|
||||||
|
addi r4, r29, 0x80
|
||||||
|
lwz r6, 0(r12)
|
||||||
|
lis r7, textReplacementCharacter@ha
|
||||||
|
lwz r7, textReplacementCharacter@l(r7)
|
||||||
|
bl import.coreinit.OSReport
|
||||||
|
mr r7, r0
|
||||||
|
|
||||||
|
|
||||||
|
skipTextLogging:
|
||||||
|
; Check for DoCommand button (button prompts start with T_[X]_00)
|
||||||
|
addi r3, r29, 0x80
|
||||||
|
|
||||||
|
lbz r5, 0(r3)
|
||||||
|
cmpwi r5, 0x54 ; T
|
||||||
|
bne nextButton
|
||||||
|
lbz r5, 1(r3)
|
||||||
|
cmpwi r5, 0x5F ; _
|
||||||
|
bne nextButton
|
||||||
|
|
||||||
|
; Check _00 part
|
||||||
|
lbz r5, 3(r3)
|
||||||
|
cmpwi r5, 0x5F ; _
|
||||||
|
bne nextButton
|
||||||
|
lbz r5, 4(r3)
|
||||||
|
cmpwi r5, 0x30 ; 0
|
||||||
|
bne nextButton
|
||||||
|
lbz r5, 5(r3)
|
||||||
|
cmpwi r5, 0x30 ; 0
|
||||||
|
bne nextButton
|
||||||
|
|
||||||
|
; Check which button it is
|
||||||
|
lbz r5, 2(r3)
|
||||||
|
cmpwi r5, 0x41 ; A
|
||||||
|
beq replaceButtonB
|
||||||
|
lbz r5, 2(r3)
|
||||||
|
cmpwi r5, 0x42 ; B
|
||||||
|
beq replaceButtonA
|
||||||
|
lbz r5, 2(r3)
|
||||||
|
cmpwi r5, 0x58 ; X
|
||||||
|
beq replaceButtonY
|
||||||
|
lbz r5, 2(r3)
|
||||||
|
cmpwi r5, 0x59 ; Y
|
||||||
|
beq replaceButtonX
|
||||||
|
|
||||||
|
nextButton:
|
||||||
|
; Check guide buttons in most of the other screens
|
||||||
|
addi r3, r29, 0x80
|
||||||
|
|
||||||
|
lbz r5, 0(r3)
|
||||||
|
cmpwi r5, 0x54 ; T
|
||||||
|
bne exitTextPatch
|
||||||
|
lbz r5, 1(r3)
|
||||||
|
cmpwi r5, 0x5F ; _
|
||||||
|
bne exitTextPatch
|
||||||
|
lbz r5, 2(r3)
|
||||||
|
cmpwi r5, 0x49 ; I
|
||||||
|
bne exitTextPatch
|
||||||
|
lbz r5, 3(r3)
|
||||||
|
cmpwi r5, 0x63 ; c
|
||||||
|
bne exitTextPatch
|
||||||
|
lbz r5, 4(r3)
|
||||||
|
cmpwi r5, 0x6F ; o
|
||||||
|
bne exitTextPatch
|
||||||
|
lbz r5, 5(r3)
|
||||||
|
cmpwi r5, 0x6E ; n
|
||||||
|
bne exitTextPatch
|
||||||
|
lbz r5, 6(r3)
|
||||||
|
cmpwi r5, 0x5F ; _
|
||||||
|
bne exitTextPatch
|
||||||
|
# lbz r5, 7(r3)
|
||||||
|
# cmpwi r5, 0x30 ; 0
|
||||||
|
# bne exitTextPatch
|
||||||
|
|
||||||
|
b replaceAllButtons
|
||||||
|
|
||||||
|
# lbz r5, 8(r3)
|
||||||
|
# cmpwi r5, 0x30 ; 0
|
||||||
|
# beq replaceAllButtons
|
||||||
|
# lbz r5, 8(r3)
|
||||||
|
# cmpwi r5, 0x31 ; 1
|
||||||
|
# beq replaceAllButtons
|
||||||
|
# lbz r5, 8(r3)
|
||||||
|
# cmpwi r5, 0x32 ; 2
|
||||||
|
# beq replaceAllButtons
|
||||||
|
# lbz r5, 8(r3)
|
||||||
|
# cmpwi r5, 0x33 ; 3
|
||||||
|
# beq replaceAllButtons
|
||||||
|
|
||||||
|
b exitTextPatch
|
||||||
|
|
||||||
|
; Load the current text and see what button it is
|
||||||
|
replaceAllButtons:
|
||||||
|
mr r4, r12
|
||||||
|
|
||||||
|
lbz r5, 1(r4)
|
||||||
|
cmpwi r5, 0x40 ; A
|
||||||
|
beq replaceWideButtonB
|
||||||
|
|
||||||
|
lbz r5, 1(r4)
|
||||||
|
cmpwi r5, 0x41 ; B
|
||||||
|
beq replaceWideButtonA
|
||||||
|
|
||||||
|
lbz r5, 1(r4)
|
||||||
|
cmpwi r5, 0x42 ; X
|
||||||
|
beq replaceWideButtonY
|
||||||
|
|
||||||
|
lbz r5, 1(r4)
|
||||||
|
cmpwi r5, 0x43 ; Y
|
||||||
|
beq replaceWideButtonX
|
||||||
|
|
||||||
|
; If none matched, just go to exit
|
||||||
|
b exitTextPatch
|
||||||
|
|
||||||
|
replaceButtonA:
|
||||||
|
lis r12, str_WideA@ha
|
||||||
|
addi r12, r12, str_WideA@l
|
||||||
|
b exitTextPatch
|
||||||
|
|
||||||
|
replaceButtonB:
|
||||||
|
lis r12, str_WideB@ha
|
||||||
|
addi r12, r12, str_WideB@l
|
||||||
|
b exitTextPatch
|
||||||
|
|
||||||
|
replaceButtonX:
|
||||||
|
lis r12, str_WideX@ha
|
||||||
|
addi r12, r12, str_WideX@l
|
||||||
|
b exitTextPatch
|
||||||
|
|
||||||
|
replaceButtonY:
|
||||||
|
lis r12, str_WideY@ha
|
||||||
|
addi r12, r12, str_WideY@l
|
||||||
|
b exitTextPatch
|
||||||
|
|
||||||
|
replaceWideButtonA:
|
||||||
|
lis r12, str2_WideA@ha
|
||||||
|
addi r12, r12, str2_WideA@l
|
||||||
|
b exitTextPatch
|
||||||
|
|
||||||
|
replaceWideButtonB:
|
||||||
|
lis r12, str2_WideB@ha
|
||||||
|
addi r12, r12, str2_WideB@l
|
||||||
|
b exitTextPatch
|
||||||
|
|
||||||
|
replaceWideButtonX:
|
||||||
|
lis r12, str2_WideX@ha
|
||||||
|
addi r12, r12, str2_WideX@l
|
||||||
|
b exitTextPatch
|
||||||
|
|
||||||
|
replaceWideButtonY:
|
||||||
|
lis r12, str2_WideY@ha
|
||||||
|
addi r12, r12, str2_WideY@l
|
||||||
|
b exitTextPatch
|
||||||
|
|
||||||
|
exitTextPatch:
|
||||||
|
mr r4, r12
|
||||||
|
mr r6, r31
|
||||||
|
mtlr r9
|
||||||
|
|
||||||
|
subf r31, r30, r3
|
||||||
|
blr
|
||||||
|
|
||||||
|
0x03C4BA40 = bla patchText
|
9
src/BreathOfTheWild/Mods/ControllerLayout/rules.txt
Normal file
9
src/BreathOfTheWild/Mods/ControllerLayout/rules.txt
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
[Definition]
|
||||||
|
titleIds = 00050000101C9300,00050000101C9400,00050000101C9500
|
||||||
|
name = Xbox Controller Button Layout
|
||||||
|
path = "The Legend of Zelda: Breath of the Wild/Mods/Xbox Controller Button Layout"
|
||||||
|
description = Swaps the ABXY buttons from the Nintendo layout to the standard PC/Xbox layout.|You can find mods for PS4/PS5 controllers on GameBanana.
|
||||||
|
version = 6
|
||||||
|
|
||||||
|
[Default]
|
||||||
|
$enableDebugLogging:int = 0
|
@ -1,4 +0,0 @@
|
|||||||
[BotW_DayLength_V208]
|
|
||||||
moduleMatches = 0x6267BFD0
|
|
||||||
|
|
||||||
0x10301844 = .float (1/(120*$timeScale))
|
|
76
src/BreathOfTheWild/Mods/DayLength/patch_DayTime.asm
Normal file
76
src/BreathOfTheWild/Mods/DayLength/patch_DayTime.asm
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
[BotW_DayTime_V208]
|
||||||
|
moduleMatches = 0x6267BFD0
|
||||||
|
|
||||||
|
.origin = codecave
|
||||||
|
|
||||||
|
|
||||||
|
const_timeMultiplier:
|
||||||
|
.float $timeMultiplier
|
||||||
|
|
||||||
|
const_cloudMultiplier:
|
||||||
|
.float $cloudMultiplier
|
||||||
|
|
||||||
|
|
||||||
|
; Normal Time Mode - Time
|
||||||
|
multiplyTimeStep:
|
||||||
|
lfs f7, 0xA4(r30) ; original instruction to load timestep
|
||||||
|
lis r9, const_timeMultiplier@ha
|
||||||
|
lfs f8, const_timeMultiplier@l(r9)
|
||||||
|
fmuls f7, f7, f8
|
||||||
|
lwz r9, 0(r6) ; repeat prior instruction for free r9 register
|
||||||
|
blr
|
||||||
|
|
||||||
|
0x0365FF78 = bla multiplyTimeStep
|
||||||
|
|
||||||
|
; Normal Time Mode - Clouds
|
||||||
|
multiplyCloudStep:
|
||||||
|
lis r4, const_cloudMultiplier@ha
|
||||||
|
lfs f11, const_cloudMultiplier@l(r4)
|
||||||
|
fmuls f6, f6, f11
|
||||||
|
stfs f6, 0xB0(r30)
|
||||||
|
blr
|
||||||
|
|
||||||
|
0x03660018 = bla multiplyCloudStep
|
||||||
|
|
||||||
|
; OnlyUpdateTimeOfDay Mode - Time & Clouds
|
||||||
|
|
||||||
|
multiplyOnlyTimeStep:
|
||||||
|
lfs f9, 0xA4(r30)
|
||||||
|
lis r4, const_timeMultiplier@ha
|
||||||
|
lfs f6, const_timeMultiplier@l(r4)
|
||||||
|
fmuls f9, f9, f6
|
||||||
|
blr
|
||||||
|
|
||||||
|
0x03660154 = bla multiplyOnlyTimeStep
|
||||||
|
|
||||||
|
|
||||||
|
; Change mode to one of the forced ones when forced time is enabled
|
||||||
|
calcForceTime:
|
||||||
|
li r12, $timeCycleMode
|
||||||
|
cmpwi r12, 1
|
||||||
|
beq noForcedTime
|
||||||
|
|
||||||
|
li r12, $dayTimeEnum
|
||||||
|
cmpwi r0, 0
|
||||||
|
blr
|
||||||
|
noForcedTime:
|
||||||
|
lbz r12, 0x129(r30)
|
||||||
|
cmpwi r0, 0
|
||||||
|
blr
|
||||||
|
|
||||||
|
0x0365FB18 = bla calcForceTime
|
||||||
|
|
||||||
|
calcForceTime2:
|
||||||
|
li r12, $timeCycleMode
|
||||||
|
cmpwi r12, 1
|
||||||
|
beq noForcedTime1
|
||||||
|
|
||||||
|
li r12, $dayTimeEnum ; Load forced time
|
||||||
|
cmpwi r0, 0
|
||||||
|
blr
|
||||||
|
noForcedTime1:
|
||||||
|
lbz r12, 0x129(r30) ; Normal load instruction
|
||||||
|
cmpwi r0, 0
|
||||||
|
blr
|
||||||
|
|
||||||
|
0x0365FE0C = bla calcForceTime2
|
@ -1,80 +1,270 @@
|
|||||||
[Definition]
|
[Definition]
|
||||||
titleIds = 00050000101C9300,00050000101C9400,00050000101C9500
|
titleIds = 00050000101C9300,00050000101C9400,00050000101C9500
|
||||||
name = Day Length
|
name = Day Time
|
||||||
path = "The Legend of Zelda: Breath of the Wild/Mods/Day Length"
|
path = "The Legend of Zelda: Breath of the Wild/Mods/Day Time"
|
||||||
description = Changes the amount of real time that an in-game day takes.|Blood moons might not appear when you change the day length.||Made by chrispurnell.
|
description = Allows you to set a fixed time or change the length of the day-night cycle.|This could alter blood moon frequency or other time-related mechanics.||Made by chrispurnell.
|
||||||
version = 6
|
version = 6
|
||||||
|
|
||||||
[Default]
|
[Default]
|
||||||
$timeScale = 1
|
$timeCycleMode:int = 0
|
||||||
|
$timeMultiplier = 1.0
|
||||||
|
$cloudMultiplier = 1.0
|
||||||
|
$dayTimeEnum:int = 0
|
||||||
|
|
||||||
|
|
||||||
|
[Preset]
|
||||||
|
name = Enabled (Default)
|
||||||
|
category = Day/Night Cycle
|
||||||
|
default = 1
|
||||||
|
$timeCycleMode:int = 1
|
||||||
|
|
||||||
|
[Preset]
|
||||||
|
name = Disabled (Fixed Time Of Day)
|
||||||
|
category = Day/Night Cycle
|
||||||
|
$timeCycleMode:int = 0
|
||||||
|
|
||||||
|
|
||||||
[Preset]
|
[Preset]
|
||||||
name = 15 seconds
|
name = 15 seconds
|
||||||
category = Day Length
|
category = Day Length
|
||||||
$timeScale = 0.025
|
condition = ($timeCycleMode == 1)
|
||||||
|
$timeMultiplier = 96
|
||||||
|
$cloudMultiplier = 96
|
||||||
|
|
||||||
[Preset]
|
[Preset]
|
||||||
name = 30 seconds
|
name = 30 seconds
|
||||||
category = Day Length
|
category = Day Length
|
||||||
$timeScale = 0.05
|
condition = ($timeCycleMode == 1)
|
||||||
|
$timeMultiplier = 48
|
||||||
|
$cloudMultiplier = 48
|
||||||
|
|
||||||
[Preset]
|
[Preset]
|
||||||
name = 1 minutes
|
name = 1 minutes
|
||||||
category = Day Length
|
category = Day Length
|
||||||
$timeScale = 0.1
|
condition = ($timeCycleMode == 1)
|
||||||
|
$timeMultiplier = 24
|
||||||
|
$cloudMultiplier = 24
|
||||||
|
|
||||||
[Preset]
|
[Preset]
|
||||||
name = 6 minutes
|
name = 6 minutes
|
||||||
category = Day Length
|
category = Day Length
|
||||||
$timeScale = 0.25
|
condition = ($timeCycleMode == 1)
|
||||||
|
$timeMultiplier = 4
|
||||||
|
$cloudMultiplier = 4
|
||||||
|
|
||||||
[Preset]
|
[Preset]
|
||||||
name = 12 minutes
|
name = 12 minutes
|
||||||
category = Day Length
|
category = Day Length
|
||||||
$timeScale = 0.5
|
condition = ($timeCycleMode == 1)
|
||||||
|
$timeMultiplier = 2
|
||||||
|
$cloudMultiplier = 2
|
||||||
|
|
||||||
[Preset]
|
[Preset]
|
||||||
name = 24 minutes (Default)
|
name = 24 minutes (Default)
|
||||||
category = Day Length
|
category = Day Length
|
||||||
|
condition = ($timeCycleMode == 1)
|
||||||
default = 1
|
default = 1
|
||||||
|
$timeMultiplier = 1.0
|
||||||
|
$cloudMultiplier = 1.0
|
||||||
|
|
||||||
|
[Preset]
|
||||||
|
name = 36 minutes
|
||||||
|
category = Day Length
|
||||||
|
condition = ($timeCycleMode == 1)
|
||||||
|
$timeMultiplier = 0.75
|
||||||
|
$cloudMultiplier = 0.75
|
||||||
|
|
||||||
[Preset]
|
[Preset]
|
||||||
name = 48 minutes
|
name = 48 minutes
|
||||||
category = Day Length
|
category = Day Length
|
||||||
$timeScale = 2
|
condition = ($timeCycleMode == 1)
|
||||||
|
$timeMultiplier = 0.5
|
||||||
|
$cloudMultiplier = 0.5
|
||||||
|
|
||||||
[Preset]
|
[Preset]
|
||||||
name = 72 minutes
|
name = 72 minutes
|
||||||
category = Day Length
|
category = Day Length
|
||||||
$timeScale = 3
|
condition = ($timeCycleMode == 1)
|
||||||
|
$timeMultiplier = (1/3)
|
||||||
|
$cloudMultiplier = (1/3)
|
||||||
|
|
||||||
[Preset]
|
[Preset]
|
||||||
name = 96 minutes
|
name = 96 minutes
|
||||||
category = Day Length
|
category = Day Length
|
||||||
$timeScale = 4
|
condition = ($timeCycleMode == 1)
|
||||||
|
$timeMultiplier = 0.25
|
||||||
|
$cloudMultiplier = 0.25
|
||||||
|
|
||||||
[Preset]
|
[Preset]
|
||||||
name = 2 hours
|
name = 2 hours
|
||||||
category = Day Length
|
category = Day Length
|
||||||
$timeScale = 5
|
condition = ($timeCycleMode == 1)
|
||||||
|
$timeMultiplier = 0.2
|
||||||
|
$cloudMultiplier = 0.2
|
||||||
|
|
||||||
[Preset]
|
[Preset]
|
||||||
name = 4 hours
|
name = 4 hours
|
||||||
category = Day Length
|
category = Day Length
|
||||||
$timeScale = 10
|
condition = ($timeCycleMode == 1)
|
||||||
|
$timeMultiplier = 0.1
|
||||||
|
$cloudMultiplier = 0.1
|
||||||
|
|
||||||
[Preset]
|
[Preset]
|
||||||
name = 12 hours
|
name = 12 hours
|
||||||
category = Day Length
|
category = Day Length
|
||||||
$timeScale = 30
|
condition = ($timeCycleMode == 1)
|
||||||
|
$timeMultiplier = (1/3)/10
|
||||||
|
$cloudMultiplier = (1/3)/10
|
||||||
|
|
||||||
[Preset]
|
[Preset]
|
||||||
name = 24 hours
|
name = 24 hours
|
||||||
category = Day Length
|
category = Day Length
|
||||||
$timeScale = 60
|
condition = ($timeCycleMode == 1)
|
||||||
|
$timeMultiplier = (1/6)/10
|
||||||
|
$cloudMultiplier = (1/6)/10
|
||||||
|
|
||||||
|
|
||||||
[Preset]
|
[Preset]
|
||||||
name = Freeze time
|
name = 00:00
|
||||||
category = Day Length
|
category = Fixed Time Of Day
|
||||||
$timeScale = 9999
|
condition = ($timeCycleMode == 0)
|
||||||
|
$dayTimeEnum = 0x2A
|
||||||
|
|
||||||
|
[Preset]
|
||||||
|
name = 01:00
|
||||||
|
category = Fixed Time Of Day
|
||||||
|
condition = ($timeCycleMode == 0)
|
||||||
|
$dayTimeEnum = 0xA
|
||||||
|
|
||||||
|
[Preset]
|
||||||
|
name = 02:00
|
||||||
|
category = Fixed Time Of Day
|
||||||
|
condition = ($timeCycleMode == 0)
|
||||||
|
$dayTimeEnum = 0xB
|
||||||
|
|
||||||
|
[Preset]
|
||||||
|
name = 03:00
|
||||||
|
category = Fixed Time Of Day
|
||||||
|
condition = ($timeCycleMode == 0)
|
||||||
|
$dayTimeEnum = 0xC
|
||||||
|
|
||||||
|
[Preset]
|
||||||
|
name = 04:00
|
||||||
|
category = Fixed Time Of Day
|
||||||
|
condition = ($timeCycleMode == 0)
|
||||||
|
$dayTimeEnum = 0xD
|
||||||
|
|
||||||
|
[Preset]
|
||||||
|
name = 05:00
|
||||||
|
category = Fixed Time Of Day
|
||||||
|
condition = ($timeCycleMode == 0)
|
||||||
|
$dayTimeEnum = 0xE
|
||||||
|
|
||||||
|
[Preset]
|
||||||
|
name = 06:00
|
||||||
|
category = Fixed Time Of Day
|
||||||
|
condition = ($timeCycleMode == 0)
|
||||||
|
$dayTimeEnum = 0xF
|
||||||
|
|
||||||
|
[Preset]
|
||||||
|
name = 07:00
|
||||||
|
category = Fixed Time Of Day
|
||||||
|
condition = ($timeCycleMode == 0)
|
||||||
|
$dayTimeEnum = 0x10
|
||||||
|
|
||||||
|
[Preset]
|
||||||
|
name = 08:00
|
||||||
|
category = Fixed Time Of Day
|
||||||
|
condition = ($timeCycleMode == 0)
|
||||||
|
$dayTimeEnum = 0x11
|
||||||
|
|
||||||
|
[Preset]
|
||||||
|
name = 09:00
|
||||||
|
category = Fixed Time Of Day
|
||||||
|
condition = ($timeCycleMode == 0)
|
||||||
|
$dayTimeEnum = 0x12
|
||||||
|
|
||||||
|
[Preset]
|
||||||
|
name = 10:00
|
||||||
|
category = Fixed Time Of Day
|
||||||
|
condition = ($timeCycleMode == 0)
|
||||||
|
$dayTimeEnum = 0x13
|
||||||
|
|
||||||
|
[Preset]
|
||||||
|
name = 11:00
|
||||||
|
category = Fixed Time Of Day
|
||||||
|
condition = ($timeCycleMode == 0)
|
||||||
|
$dayTimeEnum = 0x14
|
||||||
|
|
||||||
|
[Preset]
|
||||||
|
name = 12:00
|
||||||
|
category = Fixed Time Of Day
|
||||||
|
condition = ($timeCycleMode == 0)
|
||||||
|
default = 1
|
||||||
|
$dayTimeEnum = 0x15
|
||||||
|
|
||||||
|
[Preset]
|
||||||
|
name = 13:00
|
||||||
|
category = Fixed Time Of Day
|
||||||
|
condition = ($timeCycleMode == 0)
|
||||||
|
$dayTimeEnum = 0x16
|
||||||
|
|
||||||
|
[Preset]
|
||||||
|
name = 14:00
|
||||||
|
category = Fixed Time Of Day
|
||||||
|
condition = ($timeCycleMode == 0)
|
||||||
|
$dayTimeEnum = 0x17
|
||||||
|
|
||||||
|
[Preset]
|
||||||
|
name = 15:00
|
||||||
|
category = Fixed Time Of Day
|
||||||
|
condition = ($timeCycleMode == 0)
|
||||||
|
$dayTimeEnum = 0x18
|
||||||
|
|
||||||
|
[Preset]
|
||||||
|
name = 16:00
|
||||||
|
category = Fixed Time Of Day
|
||||||
|
condition = ($timeCycleMode == 0)
|
||||||
|
$dayTimeEnum = 0x19
|
||||||
|
|
||||||
|
[Preset]
|
||||||
|
name = 17:00
|
||||||
|
category = Fixed Time Of Day
|
||||||
|
condition = ($timeCycleMode == 0)
|
||||||
|
$dayTimeEnum = 0x1A
|
||||||
|
|
||||||
|
[Preset]
|
||||||
|
name = 18:00
|
||||||
|
category = Fixed Time Of Day
|
||||||
|
condition = ($timeCycleMode == 0)
|
||||||
|
$dayTimeEnum = 0x1B
|
||||||
|
|
||||||
|
[Preset]
|
||||||
|
name = 19:00
|
||||||
|
category = Fixed Time Of Day
|
||||||
|
condition = ($timeCycleMode == 0)
|
||||||
|
$dayTimeEnum = 0x1C
|
||||||
|
|
||||||
|
[Preset]
|
||||||
|
name = 20:00
|
||||||
|
category = Fixed Time Of Day
|
||||||
|
condition = ($timeCycleMode == 0)
|
||||||
|
$dayTimeEnum = 0x1D
|
||||||
|
|
||||||
|
[Preset]
|
||||||
|
name = 21:00
|
||||||
|
category = Fixed Time Of Day
|
||||||
|
condition = ($timeCycleMode == 0)
|
||||||
|
$dayTimeEnum = 0x1E
|
||||||
|
|
||||||
|
[Preset]
|
||||||
|
name = 22:00
|
||||||
|
category = Fixed Time Of Day
|
||||||
|
condition = ($timeCycleMode == 0)
|
||||||
|
$dayTimeEnum = 0x1F
|
||||||
|
|
||||||
|
[Preset]
|
||||||
|
name = 23:00
|
||||||
|
category = Fixed Time Of Day
|
||||||
|
condition = ($timeCycleMode == 0)
|
||||||
|
$dayTimeEnum = 0x20
|
@ -2,7 +2,7 @@
|
|||||||
titleIds = 00050000101C9300,00050000101C9400,00050000101C9500
|
titleIds = 00050000101C9300,00050000101C9400,00050000101C9500
|
||||||
name = Weather
|
name = Weather
|
||||||
path = "The Legend of Zelda: Breath of the Wild/Mods/Weather"
|
path = "The Legend of Zelda: Breath of the Wild/Mods/Weather"
|
||||||
description = Allows you to change the weather, to an individual level.|Won't change weather in areas that have a certain type forced.||Made by dragbe.
|
description = Allows you to change the weather forecast to an individual level.|Won't change weather in areas that have a certain type forced.||Made by dragbe.
|
||||||
version = 6
|
version = 6
|
||||||
|
|
||||||
# Weather names from https://github.com/zeldaret/botw
|
# Weather names from https://github.com/zeldaret/botw
|
||||||
|
Loading…
Reference in New Issue
Block a user