diff --git a/Modifications/BreathOfTheWid_static_30FPS_mod/readme.txt b/Modifications/BreathOfTheWid_static_30FPS_mod/readme.txt deleted file mode 100644 index c6c9d413..00000000 --- a/Modifications/BreathOfTheWid_static_30FPS_mod/readme.txt +++ /dev/null @@ -1,15 +0,0 @@ -This is based on an extreme simplification of the fps++ mod by Xalphenos; it -drops dynamic FPS to get back stability. The Rajkosto "best fence" method is -also included for performance and stability. It improves over the previous -static fps mod because it allows ANY value as a static fps target and it -also includes the stamina fix. - -To use it simply grab one of the uploaded versions or edit one with these -changes: a) rules.txt frequency and name b) divide 30 by the target FPS c) use -the result of that calculation and the target fps in patches.txt. - -Disclaimer: this is different from the static FPS mod ported recently. The main -advantage of this one is that it allows ANY static FPS instead of only 60, 30, -20.. and it also includes the stamina fix. - - epigramx diff --git a/Modifications/BreathOfTheWid_static_30FPS_mod/rules.txt b/Modifications/BreathOfTheWid_static_30FPS_mod/rules.txt deleted file mode 100644 index 04e6b4f8..00000000 --- a/Modifications/BreathOfTheWid_static_30FPS_mod/rules.txt +++ /dev/null @@ -1,7 +0,0 @@ -[Definition] -titleIds = 00050000101C9300,00050000101C9400,00050000101C9500 -name = "The Legend of Zelda: Breath of the Wild - static 30FPS mod" -version = 2 - -[Control] -vsyncFrequency = 30 diff --git a/Modifications/BreathOfTheWid_static_45FPS_mod/patches.txt b/Modifications/BreathOfTheWid_static_45FPS_mod/patches.txt deleted file mode 100644 index 03d71f16..00000000 --- a/Modifications/BreathOfTheWid_static_45FPS_mod/patches.txt +++ /dev/null @@ -1,108 +0,0 @@ -[BotwFPSV208] #i.e. v1.5.0 -moduleMatches = 0x6267BFD0 - -#Cave -codeCaveSize = 0x1C -_multiplier = 0x0 # edit the next line to change the multiplier -0x00000000 = .float 0.66667 # = 30FPS / TARGET FPS, e.g. 30FPS / 18FPS = 1.66667 -_targetfps = 0x18 # edit the next line to change the target fps -0x18 = .float 45 - -#"Best fence" by Rajkosto -_fenceNeg1 = 0x00000004 -0x00000004 = add r6, r12, r0 #orig instruction we are replacing -0x00000008 = cmpwi r6, 500 #check if less than 500 (full sync on those first frames to prevent milk water) -0x0000000C = blt .+0x08 #skip subtract if less than -0x00000010 = subi r6, r6, 1 #do the subtract -0x00000014 = blr #return - -#Extreme simplification of FPS++ by Xalphenos -#codeChanges -0x031FA97C = nop -0x03793328 = nop -0x03793334 = nop -0x03793378 = lis r29, _multiplier@ha -0x03793380 = lfs f0, _multiplier@L(r29) -0x0379338C = nop -0x03415C1C = lis r12, _multiplier@ha -0x03415C24 = lfs f0, _multiplier@l(r12) -0x03415C2C = nop -0x02D90D2C = lis r10, _targetfps@ha -0x02D90D30 = lfs f11, _targetfps@l(r10) -0x02D90D88 = lis r10, _targetfps@ha -0x02D90D8C = lfs f11, _targetfps@l(r10) - -#Break all forms of frame limiting -0x031FAAFC = bla _fenceNeg1 #Best fence (make sure GPU is never more than 1 frame ahead) -#0x031FAAE8 = li r0, 1 #Better fence (make sure GPU is never more than 1 second? ahead) -#0x031FAB00 = nop #skip fence (no waiting on GPU) -0x031FACD0 = nop #disable vsync -0x031FACF4 = nop #disable vsync loop - -#Additional vsync dropping -0x0309D030 = nop #disable vsync -0x0309D054 = nop #disable vsync loop - -#For testing, the original static mod lines (commented out by default): -#0x031FB0C0 = li r0, 1 -#0x031FB104 = li r0, 1 - -#Cheats -#0x02D90CC0 = fmr f29, f1 #inf stamina -#0x02D452A4 = nop #inf hearts -#0x02EB6758 = nop #inf arrows - -[BotwFPSv176V192] #i.e. v1.4.0 and v1.4.1 -moduleMatches = 0xFD091F9F,0xD472D8A5 - -#Cave -codeCaveSize = 0x1C -_multiplier = 0x0 # edit the next line to change the multiplier -0x00000000 = .float 0.66667 # = 30FPS / TARGET FPS, e.g. 30FPS / 18FPS = 1.66667 -_targetfps = 0x18 # edit the next line to change the target fps -0x18 = .float 45 - -#"Best fence" by Rajkosto -_fenceNeg1 = 0x00000004 -0x00000004 = add r6, r12, r0 #orig instruction we are replacing -0x00000008 = cmpwi r6, 500 #check if less than 500 (full sync on those first frames to prevent milk water) -0x0000000C = blt .+0x08 #skip subtract if less than -0x00000010 = subi r6, r6, 1 #do the subtract -0x00000014 = blr #return - -#Extreme simplification of FPS++ by Xalphenos -#codeChanges -0x031F9E80 = nop -0x03792620 = nop -0x0379262C = nop -0x03792670 = lis r29, _multiplier@ha -0x03792678 = lfs f0, _multiplier@L(r29) -0x03792684 = nop -0x03414EF8 = lis r12, _multiplier@ha -0x03414F00 = lfs f0, _multiplier@l(r12) -0x03414F08 = nop -0x02D90790 = lis r10, _targetfps@ha -0x02D90794 = lfs f11, _targetfps@l(r10) -0x02D907EC = lis r10, _targetfps@ha -0x02D907F0 = lfs f11, _targetfps@l(r10) - -#Break all forms of frame limiting -0x031FA000 = bla _fenceNeg1 #Best fence (make sure GPU is never more than 1 frame ahead) -#0x031F9FEC = li r0, 1 #Better fence (make sure GPU is never more than 1 second? ahead) -#0x031FA004 = nop #skip fence (no waiting on GPU) -0x031FA1D4 = nop #disable vsync -0x031FA1F8 = nop #disable vsync loop - -#Additional vsync dropping -0x0309C9A4 = nop #disable vsync -0x0309C9C8 = nop #disable vsync loop - -#For testing, the original static mod lines (commented out by default): -#0x031FA5C4 = li r0, 1 -#0x031FA608 = li r0, 1 - -#Cheats -#0x02D90724 = fmr f29, f1 #inf stamina -#0x02D44D44 = nop #inf hearts -#0x02EB61BC = nop #inf arrows - diff --git a/Modifications/BreathOfTheWid_static_45FPS_mod/readme.txt b/Modifications/BreathOfTheWid_static_45FPS_mod/readme.txt deleted file mode 100644 index c6c9d413..00000000 --- a/Modifications/BreathOfTheWid_static_45FPS_mod/readme.txt +++ /dev/null @@ -1,15 +0,0 @@ -This is based on an extreme simplification of the fps++ mod by Xalphenos; it -drops dynamic FPS to get back stability. The Rajkosto "best fence" method is -also included for performance and stability. It improves over the previous -static fps mod because it allows ANY value as a static fps target and it -also includes the stamina fix. - -To use it simply grab one of the uploaded versions or edit one with these -changes: a) rules.txt frequency and name b) divide 30 by the target FPS c) use -the result of that calculation and the target fps in patches.txt. - -Disclaimer: this is different from the static FPS mod ported recently. The main -advantage of this one is that it allows ANY static FPS instead of only 60, 30, -20.. and it also includes the stamina fix. - - epigramx diff --git a/Modifications/BreathOfTheWid_static_45FPS_mod/rules.txt b/Modifications/BreathOfTheWid_static_45FPS_mod/rules.txt deleted file mode 100644 index 2ff1fcfa..00000000 --- a/Modifications/BreathOfTheWid_static_45FPS_mod/rules.txt +++ /dev/null @@ -1,7 +0,0 @@ -[Definition] -titleIds = 00050000101C9300,00050000101C9400,00050000101C9500 -name = "The Legend of Zelda: Breath of the Wild - static 45FPS mod" -version = 2 - -[Control] -vsyncFrequency = 45 diff --git a/Modifications/BreathOfTheWid_static_60FPS_mod/patches.txt b/Modifications/BreathOfTheWid_static_60FPS_mod/patches.txt deleted file mode 100644 index fffed5d6..00000000 --- a/Modifications/BreathOfTheWid_static_60FPS_mod/patches.txt +++ /dev/null @@ -1,108 +0,0 @@ -[BotwFPSV208] #i.e. v1.5.0 -moduleMatches = 0x6267BFD0 - -#Cave -codeCaveSize = 0x1C -_multiplier = 0x0 # edit the next line to change the multiplier -0x00000000 = .float 0.5 # = 30FPS / TARGET FPS, e.g. 30FPS / 18FPS = 1.66667 -_targetfps = 0x18 # edit the next line to change the target fps -0x18 = .float 60 - -#"Best fence" by Rajkosto -_fenceNeg1 = 0x00000004 -0x00000004 = add r6, r12, r0 #orig instruction we are replacing -0x00000008 = cmpwi r6, 500 #check if less than 500 (full sync on those first frames to prevent milk water) -0x0000000C = blt .+0x08 #skip subtract if less than -0x00000010 = subi r6, r6, 1 #do the subtract -0x00000014 = blr #return - -#Extreme simplification of FPS++ by Xalphenos -#codeChanges -0x031FA97C = nop -0x03793328 = nop -0x03793334 = nop -0x03793378 = lis r29, _multiplier@ha -0x03793380 = lfs f0, _multiplier@L(r29) -0x0379338C = nop -0x03415C1C = lis r12, _multiplier@ha -0x03415C24 = lfs f0, _multiplier@l(r12) -0x03415C2C = nop -0x02D90D2C = lis r10, _targetfps@ha -0x02D90D30 = lfs f11, _targetfps@l(r10) -0x02D90D88 = lis r10, _targetfps@ha -0x02D90D8C = lfs f11, _targetfps@l(r10) - -#Break all forms of frame limiting -0x031FAAFC = bla _fenceNeg1 #Best fence (make sure GPU is never more than 1 frame ahead) -#0x031FAAE8 = li r0, 1 #Better fence (make sure GPU is never more than 1 second? ahead) -#0x031FAB00 = nop #skip fence (no waiting on GPU) -0x031FACD0 = nop #disable vsync -0x031FACF4 = nop #disable vsync loop - -#Additional vsync dropping -0x0309D030 = nop #disable vsync -0x0309D054 = nop #disable vsync loop - -#For testing, the original static mod lines (commented out by default): -#0x031FB0C0 = li r0, 1 -#0x031FB104 = li r0, 1 - -#Cheats -#0x02D90CC0 = fmr f29, f1 #inf stamina -#0x02D452A4 = nop #inf hearts -#0x02EB6758 = nop #inf arrows - -[BotwFPSv176V192] #i.e. v1.4.0 and v1.4.1 -moduleMatches = 0xFD091F9F,0xD472D8A5 - -#Cave -codeCaveSize = 0x1C -_multiplier = 0x0 # edit the next line to change the multiplier -0x00000000 = .float 0.5 # = 30FPS / TARGET FPS, e.g. 30FPS / 18FPS = 1.66667 -_targetfps = 0x18 # edit the next line to change the target fps -0x18 = .float 60 - -#"Best fence" by Rajkosto -_fenceNeg1 = 0x00000004 -0x00000004 = add r6, r12, r0 #orig instruction we are replacing -0x00000008 = cmpwi r6, 500 #check if less than 500 (full sync on those first frames to prevent milk water) -0x0000000C = blt .+0x08 #skip subtract if less than -0x00000010 = subi r6, r6, 1 #do the subtract -0x00000014 = blr #return - -#Extreme simplification of FPS++ by Xalphenos -#codeChanges -0x031F9E80 = nop -0x03792620 = nop -0x0379262C = nop -0x03792670 = lis r29, _multiplier@ha -0x03792678 = lfs f0, _multiplier@L(r29) -0x03792684 = nop -0x03414EF8 = lis r12, _multiplier@ha -0x03414F00 = lfs f0, _multiplier@l(r12) -0x03414F08 = nop -0x02D90790 = lis r10, _targetfps@ha -0x02D90794 = lfs f11, _targetfps@l(r10) -0x02D907EC = lis r10, _targetfps@ha -0x02D907F0 = lfs f11, _targetfps@l(r10) - -#Break all forms of frame limiting -0x031FA000 = bla _fenceNeg1 #Best fence (make sure GPU is never more than 1 frame ahead) -#0x031F9FEC = li r0, 1 #Better fence (make sure GPU is never more than 1 second? ahead) -#0x031FA004 = nop #skip fence (no waiting on GPU) -0x031FA1D4 = nop #disable vsync -0x031FA1F8 = nop #disable vsync loop - -#Additional vsync dropping -0x0309C9A4 = nop #disable vsync -0x0309C9C8 = nop #disable vsync loop - -#For testing, the original static mod lines (commented out by default): -#0x031FA5C4 = li r0, 1 -#0x031FA608 = li r0, 1 - -#Cheats -#0x02D90724 = fmr f29, f1 #inf stamina -#0x02D44D44 = nop #inf hearts -#0x02EB61BC = nop #inf arrows - diff --git a/Modifications/BreathOfTheWid_static_60FPS_mod/readme.txt b/Modifications/BreathOfTheWid_static_60FPS_mod/readme.txt deleted file mode 100644 index c6c9d413..00000000 --- a/Modifications/BreathOfTheWid_static_60FPS_mod/readme.txt +++ /dev/null @@ -1,15 +0,0 @@ -This is based on an extreme simplification of the fps++ mod by Xalphenos; it -drops dynamic FPS to get back stability. The Rajkosto "best fence" method is -also included for performance and stability. It improves over the previous -static fps mod because it allows ANY value as a static fps target and it -also includes the stamina fix. - -To use it simply grab one of the uploaded versions or edit one with these -changes: a) rules.txt frequency and name b) divide 30 by the target FPS c) use -the result of that calculation and the target fps in patches.txt. - -Disclaimer: this is different from the static FPS mod ported recently. The main -advantage of this one is that it allows ANY static FPS instead of only 60, 30, -20.. and it also includes the stamina fix. - - epigramx diff --git a/Modifications/BreathOfTheWid_static_60FPS_mod/rules.txt b/Modifications/BreathOfTheWid_static_60FPS_mod/rules.txt deleted file mode 100644 index 1b35986c..00000000 --- a/Modifications/BreathOfTheWid_static_60FPS_mod/rules.txt +++ /dev/null @@ -1,7 +0,0 @@ -[Definition] -titleIds = 00050000101C9300,00050000101C9400,00050000101C9500 -name = "The Legend of Zelda: Breath of the Wild - static 60FPS mod" -version = 2 - -[Control] -vsyncFrequency = 60 diff --git a/Modifications/BreathOfTheWid_static_30FPS_mod/patches.txt b/Source/BreathOfTheWild_StaticFPS/patches.txt similarity index 80% rename from Modifications/BreathOfTheWid_static_30FPS_mod/patches.txt rename to Source/BreathOfTheWild_StaticFPS/patches.txt index 33a97627..8812ba2a 100644 --- a/Modifications/BreathOfTheWid_static_30FPS_mod/patches.txt +++ b/Source/BreathOfTheWild_StaticFPS/patches.txt @@ -1,12 +1,17 @@ + [BotwFPSV208] #i.e. v1.5.0 moduleMatches = 0x6267BFD0 #Cave codeCaveSize = 0x1C -_multiplier = 0x0 # edit the next line to change the multiplier -0x00000000 = .float 1.00 # = 30FPS / TARGET FPS, e.g. 30FPS / 18FPS = 1.66667 + +_divisor = 0x0 # edit the next line to change the divisor +0x00000000 = .float # = 30FPS / TARGET FPS, e.g. 30FPS / 18FPS = 1.66667 _targetfps = 0x18 # edit the next line to change the target fps -0x18 = .float 30 +0x18 = .float #"Best fence" by Rajkosto _fenceNeg1 = 0x00000004 @@ -21,11 +26,11 @@ _fenceNeg1 = 0x00000004 0x031FA97C = nop 0x03793328 = nop 0x03793334 = nop -0x03793378 = lis r29, _multiplier@ha -0x03793380 = lfs f0, _multiplier@L(r29) +0x03793378 = lis r29, _divisor@ha +0x03793380 = lfs f0, _divisor@L(r29) 0x0379338C = nop -0x03415C1C = lis r12, _multiplier@ha -0x03415C24 = lfs f0, _multiplier@l(r12) +0x03415C1C = lis r12, _divisor@ha +0x03415C24 = lfs f0, _divisor@l(r12) 0x03415C2C = nop 0x02D90D2C = lis r10, _targetfps@ha 0x02D90D30 = lfs f11, _targetfps@l(r10) @@ -57,10 +62,11 @@ moduleMatches = 0xFD091F9F,0xD472D8A5 #Cave codeCaveSize = 0x1C -_multiplier = 0x0 # edit the next line to change the multiplier -0x00000000 = .float 1.00 # = 30FPS / TARGET FPS, e.g. 30FPS / 18FPS = 1.66667 + +_divisor = 0x0 # edit the next line to change the divisor +0x00000000 = .float # = 30FPS / TARGET FPS, e.g. 30FPS / 18FPS = 1.66667 _targetfps = 0x18 # edit the next line to change the target fps -0x18 = .float 30 +0x18 = .float #"Best fence" by Rajkosto _fenceNeg1 = 0x00000004 @@ -75,11 +81,11 @@ _fenceNeg1 = 0x00000004 0x031F9E80 = nop 0x03792620 = nop 0x0379262C = nop -0x03792670 = lis r29, _multiplier@ha -0x03792678 = lfs f0, _multiplier@L(r29) +0x03792670 = lis r29, _divisor@ha +0x03792678 = lfs f0, _divisor@L(r29) 0x03792684 = nop -0x03414EF8 = lis r12, _multiplier@ha -0x03414F00 = lfs f0, _multiplier@l(r12) +0x03414EF8 = lis r12, _divisor@ha +0x03414F00 = lfs f0, _divisor@l(r12) 0x03414F08 = nop 0x02D90790 = lis r10, _targetfps@ha 0x02D90794 = lfs f11, _targetfps@l(r10) diff --git a/Source/BreathOfTheWild_StaticFPS/readme.txt b/Source/BreathOfTheWild_StaticFPS/readme.txt new file mode 100644 index 00000000..89877ab5 --- /dev/null +++ b/Source/BreathOfTheWild_StaticFPS/readme.txt @@ -0,0 +1,18 @@ +This is based on an extreme simplification of the fps++ mod by Xalphenos; it +drops dynamic FPS to prevent graphics judder. The Rajkosto "best fence" method +is also included for performance and stability. Judder was easily noticeable +when Link paraglides; the caveat is that the user must pick a target FPS that +they can maintain. + +It improves over previous static mods in that it allows ANY value as a +static fps target and it includes the stamina fix. + +To use it simply grab one of the provided versions or edit one with these +changes: a) rules.txt frequency and name b) divide 30 by the target FPS c) use +the result of that calculation and the target fps in patches.txt. + +This readme was derived from a static FPS mod. Additional FPS targets +and discussion are at https://forum.cemu.info/showthread.php/421. If you do +know how to use build.sh at Slashie's repo, it supports arbitrary targets. + + epigramx diff --git a/Source/BreathOfTheWild_StaticFPS/rules.txt b/Source/BreathOfTheWild_StaticFPS/rules.txt new file mode 100644 index 00000000..e36a17a8 --- /dev/null +++ b/Source/BreathOfTheWild_StaticFPS/rules.txt @@ -0,0 +1,7 @@ +[Definition] +titleIds = 00050000101C9300,00050000101C9400,00050000101C9500 +name = "The Legend of Zelda: Breath of the Wild - static FPS mod" +version = 2 + +[Control] +vsyncFrequency = diff --git a/build.sh b/build.sh index d2ecb062..7c70f9cc 100644 --- a/build.sh +++ b/build.sh @@ -108,6 +108,23 @@ std_respack () { done } +mod_onearg () { + params=( "$@" ) + subparams=( "${params[@]:1}" ) + mod_folder="${params[0]}" + + echo -e "${GREEN}[Building] ${BCYAN}$mod_folder ${NC}with arguments: ${subparams[@]}" + for arrg in "${subparams[@]}" + do + inFolder="Source/$mod_folder" + + outFolder="Modifications/${mod_folder}_${arrg}" + + #echo "${arrg} inFolder: $inFolder outFolder: $outFolder" + build_dir "$inFolder" "$outFolder" "$arrg" + done +} + res16by9=( "360p" "480p" "540p" "720p" "900p" "1080p" "1440p" "1800p" "2160p" "2880p" "4320p" "5760p" ) res21by9=( "540p219" "720p219" "900p219" "1080p219" "1440p219" "1800p219" "2160p219" "2880p219" "4320p219" "5760p219" ) res48by9=( "360p489" "480p489" "540p489" "720p489" "900p489" "1080p489" "1440p489" "1800p489" "2160p489" "2880p489" "4320p489" "5760p489" ) @@ -196,4 +213,7 @@ std_respack "WipeoutCreate" "${res16by9[@]/$just720p}" std_respack "Wonderful101" "${res16by9[@]/$just720p}" std_respack "WoollyWorld" "${res16by9[@]/$just720p}" "${res21by9[@]}" "${res48by9[@]}" std_respack "XenobladeX" "${res16by9[@]/$just720p}" "${res21by9[@]}" "${res48by9[@]}" + +mod_onearg "BreathOfTheWild_StaticFPS" 30 45 60 + echo -e "${NC}"