Compare commits

...

12 Commits

Author SHA1 Message Date
WinnerNombre
39f9bd6654
[Skylanders Imaginators] Add sigpatch pack to use modified skylanders figures (#701)
This pack basically allows you to use modded figures or use unreleased content from the game since the game originally comes with a signature patch to prevent that.

This pack was made by @WinnerNombre!
2025-04-18 20:56:15 +02:00
WinnerNombre
61d458f9bd
[Skylanders: Swap Force] Fix paths being inconsistent (#699)
Just some minor cleanup, thanks @WinnerNombre!
2025-04-17 19:21:51 +02:00
Gloomy
108a1f0335
[Splatoon] Add "Disable Autorotate" Mod (#697)
This removes the function call that rotates the camera when the player moves left or right. This makes it much easier to control your aim with both motion and mouse (via Xapfish) since you don't have to fight against the camera when you move.

Thanks for @Gloomy31 adding this pack!
2025-04-17 12:23:12 +02:00
WinnerNombre
7d54f240ec
[Skylanders: Swap Force] Add mod to allow using other skylanders portals (#698)
This new pack allows you to use portals from other game series with Skylanders: Swap Force.

Thanks for @WinnerNombre for adding this pack!
2025-04-17 12:21:56 +02:00
Intra
d0205dcb80
[XCX] Create new XCX
This update introduces enhancements to the graphical settings of Xenoblade Chronicles X by modifying the game's boot configuration file. The following adjustable parameters have been identified to produce noticeable visual differences:

* sRGB Mode Toggle: Enables or disables sRGB color mode, affecting color accuracy and vibrancy.​

* Anti-Aliasing Toggle: Turns anti-aliasing on or off, impacting the smoothness of object edges and overall image clarity.​

* Bloom Effect Toggle: Allows the activation or deactivation of the bloom effect, influencing the intensity of light glow and scene brightness.​

* Cloud Height Minimum: Adjusts the minimum altitude at which clouds appear, altering the cloud coverage and atmospheric depth.​

* Cloud Height Maximum: Sets the maximum altitude for cloud rendering, affecting the vertical span of cloud formations in the sky.
2025-04-08 13:16:39 +02:00
Intra
09207ededf
[XCX] Add various quality-of-life mods and cheats(#675)
Thanks to @intra0 for these awesome new mods!

**Quality-of-Life Improvements:**
- Start Battles with Maximum Tension Points (TP): Players now begin combat with full TP, eliminating the need to build up TP at the start of each encounter.​

- Skell TP Retention: Skells will no longer lose their accumulated TP when the player exits them, addressing a mechanic that many found frustrating.​

- Camera Settings Memory Fix: Resolves an issue where camera settings would reset upon entering areas with ceilings, ensuring a consistent viewing experience.​

**Optional Features:**

- Disable Automatic HP Regeneration: Introduces an option to turn off the automatic healing of HP, allowing for a more challenging gameplay experience.​

- Synchronized HP and TP Mode: Offers a new mode where HP and TP values are linked, introducing unique strategic considerations.​

**Additional Modifications:**

- Blade Division Change: Restores the ability to change Blade divisions, a feature previously inaccessible in offline mode.​

- Skell Flight Module Toggle: Allows players to manually enable or disable the Skell flight module, providing greater control over Skell capabilities.
2025-04-08 12:59:20 +02:00
EitchKeii
a8ab6fd326
[TPHD] Add cheat to disable mirroring in Hero Mode (#694)
When enabled, this disables the mirroring when playing the hero mode in Twilight Princess HD.

Thanks to @EitchKeii for making this pack!
2025-04-04 00:32:56 +02:00
primaviera
88a7e7b464
[Splatoon] Add "Superjump With The DPAD" mod (#693)
With this mod enabled, you can hold A and then press the DPAD to trigger a super jump instead of having to use the mouse/touchscreen to trigger it.

Thanks to @primaviera for making this mod, and the original SwapDRC developers that inspired this port!
2025-04-02 11:17:34 +02:00
Intra
01efa057a8
[XCX] [MK8] [DKC] Add credit attribution to all packs (#690) 2025-03-25 08:59:51 +01:00
SamoZ256
91d33317d2
[BOTW] Support the Metal API (#678)
Currently this graphic pack does nothing for anyone but people who use the Metal build from the https://github.com/cemu-project/Cemu/pull/1287 PR.

Thanks to @SamoZ256 for making the graphic packs work on a much faster renderer!
2025-02-25 21:46:53 +01:00
Intra
1ee177b162
[XCX] Fix error in brightness graphic pack
Some users might've lost their brightness settings while this error was active. If you've enabled the Brightness New graphic pack wondering where the old brightness pack was, its now possible to experience the regular brightness workaround.
2025-02-25 21:39:42 +01:00
Intra
b28ad54c73
[Dr. Luigi] Merge anti-aliasing settings into main graphic pack (#664)
Thanks to @intra0 for merging and upgrading these packs! You might lose your graphic pack settings for Dr. Luigi after updating to this version.
2025-02-25 21:32:26 +01:00
131 changed files with 9777 additions and 329 deletions

View File

@ -3,4 +3,5 @@ titleIds = 0005000010137F00,0005000010138300,0005000010144800
name = AA Removal
path = "Donkey Kong Country: Tropical Freeze/Enhancements/AA Removal"
description = Removes AA, no performance gain. Used for clean look or injecting external AA.
#Credits: Skalfate
version = 4

View File

@ -1,6 +0,0 @@
[Definition]
titleIds = 0005000010150300,0005000010152A00,0005000010152B00
name = Anti-Aliasing
path = "Dr. Luigi/Graphics/Anti-Aliasing (WIP)"
description = Re-enables the game's anti-aliasing and scales it up to the current resolution. Made by M&&M.
version = 4

View File

@ -0,0 +1,6 @@
[zelda-tp-disable-mirroring]
moduleMatches = 0x1A03E108, 0xA3175EEA
0x02941064 = stb r0, 0x667d(r12)
0x0294819c = li r0, 32
0x029481ac = stb r0, 0x667d(r11)

View File

@ -0,0 +1,6 @@
[Definition]
titleIds = 000500001019C800,000500001019E600,000500001019E500
name = Disable Mirroring
path = "The Legend of Zelda: Twilight Princess HD/Mods/Disable Mirroring (Hero Mode)"
description = Hero Mode will no longer be mirrored.|Made by EitchKeii.
version = 4

View File

@ -3,6 +3,7 @@ titleIds = 0005000010137F00,0005000010138300,0005000010144800
name = Resolution
path = "Donkey Kong Country: Tropical Freeze/Graphics/Resolution"
description = Changes the resolution of the game. Made by getdls and Skalfate.
#Credits: getdls, Skalfate
version = 4
[Preset]

View File

@ -1,246 +0,0 @@
#version 420
#extension GL_ARB_texture_gather : enable
#extension GL_ARB_separate_shader_objects : enable
#ifdef VULKAN
#define ATTR_LAYOUT(__vkSet, __location) layout(set = __vkSet, location = __location)
#define UNIFORM_BUFFER_LAYOUT(__glLocation, __vkSet, __vkLocation) layout(set = __vkSet, binding = __vkLocation, std140)
#define TEXTURE_LAYOUT(__glLocation, __vkSet, __vkLocation) layout(set = __vkSet, binding = __vkLocation)
#define SET_POSITION(_v) gl_Position = _v; gl_Position.z = (gl_Position.z + gl_Position.w) / 2.0
#define GET_FRAGCOORD() vec4(gl_FragCoord.xy*uf_fragCoordScale.xy,gl_FragCoord.zw)
#define gl_VertexID gl_VertexIndex
#define gl_InstanceID gl_InstanceIndex
#else
#define ATTR_LAYOUT(__vkSet, __location) layout(location = __location)
#define UNIFORM_BUFFER_LAYOUT(__glLocation, __vkSet, __vkLocation) layout(binding = __glLocation, std140)
#define TEXTURE_LAYOUT(__glLocation, __vkSet, __vkLocation) layout(binding = __glLocation)
#define SET_POSITION(_v) gl_Position = _v
#define GET_FRAGCOORD() vec4(gl_FragCoord.xy*uf_fragCoordScale,gl_FragCoord.zw)
#endif
// This shader was automatically converted to be cross-compatible with Vulkan and OpenGL.
// shader 9e9abde99f9510dc
#ifdef VULKAN
layout(set = 1, binding = 1) uniform ufBlock
{
uniform float uf_alphaTestRef;
uniform vec4 uf_fragCoordScale;
};
#else
uniform float uf_alphaTestRef;
uniform vec2 uf_fragCoordScale;
#endif
TEXTURE_LAYOUT(0, 1, 0) uniform sampler2D textureUnitPS0;
layout(location = 0) in vec4 passParameterSem129;
layout(location = 1) in vec4 passParameterSem128;
layout(location = 0) out vec4 passPixelColor0;
// uf_fragCoordScale was moved to the ufBlock
int clampFI32(int v)
{
if( v == 0x7FFFFFFF )
return floatBitsToInt(1.0);
else if( v == 0xFFFFFFFF )
return floatBitsToInt(0.0);
return floatBitsToInt(clamp(intBitsToFloat(v), 0.0, 1.0));
}
float mul_nonIEEE(float a, float b){ if( a == 0.0 || b == 0.0 ) return 0.0; return a*b; }
void main()
{
ivec4 R0i = ivec4(0);
ivec4 R1i = ivec4(0);
ivec4 R2i = ivec4(0);
ivec4 R3i = ivec4(0);
ivec4 R4i = ivec4(0);
ivec4 R5i = ivec4(0);
ivec4 R6i = ivec4(0);
ivec4 R7i = ivec4(0);
ivec4 R8i = ivec4(0);
ivec4 R122i = ivec4(0);
ivec4 R123i = ivec4(0);
ivec4 R126i = ivec4(0);
ivec4 R127i = ivec4(0);
int backupReg0i, backupReg1i, backupReg2i, backupReg3i, backupReg4i;
ivec4 PV0i = ivec4(0), PV1i = ivec4(0);
int PS0i = 0, PS1i = 0;
ivec4 tempi = ivec4(0);
float tempResultf;
int tempResulti;
ivec4 ARi = ivec4(0);
bool predResult = true;
vec3 cubeMapSTM;
int cubeMapFaceId;
//R0i = floatBitsToInt(passParameterSem129);
R1i = floatBitsToInt(passParameterSem128);
R5i.xyz = floatBitsToInt(texture(textureUnitPS0, intBitsToFloat(R1i.zw)).xyz);
R6i.xyz = floatBitsToInt(texture(textureUnitPS0, intBitsToFloat(R1i.xy)).xyz);
// 0
backupReg0i = R0i.y;
backupReg1i = R0i.x;
PV0i.x = 0;
PV0i.y = floatBitsToInt(intBitsToFloat(backupReg0i) * 1.0);
PV0i.z = 0;
R127i.w = floatBitsToInt(intBitsToFloat(backupReg1i) * 1.0);
PV0i.w = R127i.w;
R8i.w = 0x3f800000;
PS0i = R8i.w;
// 1
R2i.x = floatBitsToInt(intBitsToFloat(R1i.z) + intBitsToFloat(PV0i.w));
R2i.y = floatBitsToInt(intBitsToFloat(R1i.w) + intBitsToFloat(PV0i.x));
R3i.z = floatBitsToInt(intBitsToFloat(PV0i.z) + intBitsToFloat(R1i.z));
PV1i.w = PV0i.y;
R3i.y = floatBitsToInt(intBitsToFloat(PV0i.y) + intBitsToFloat(R1i.w));
PS1i = R3i.y;
// 2
R4i.x = floatBitsToInt(intBitsToFloat(R1i.z) + intBitsToFloat(R127i.w));
R4i.y = floatBitsToInt(intBitsToFloat(R1i.w) + intBitsToFloat(PV1i.w));
R0i.z = floatBitsToInt(intBitsToFloat(R6i.z) * intBitsToFloat(0x3de978d5));
R3i.x = floatBitsToInt(intBitsToFloat(R5i.z) * intBitsToFloat(0x3de978d5));
PS0i = R3i.x;
R2i.xyz = floatBitsToInt(texture(textureUnitPS0, intBitsToFloat(R2i.xy)).xyz);
R7i.xyz = floatBitsToInt(texture(textureUnitPS0, intBitsToFloat(R3i.zy)).xyz);
R4i.xyz = floatBitsToInt(texture(textureUnitPS0, intBitsToFloat(R4i.xy)).xyz);
// 0
tempi.x = floatBitsToInt(dot(vec4(intBitsToFloat(R5i.x),intBitsToFloat(R5i.y),intBitsToFloat(R3i.x),-0.0),vec4(intBitsToFloat(0x3e991687),intBitsToFloat(0x3f1645a2),1.0,0.0)));
PV0i.x = tempi.x;
PV0i.y = tempi.x;
PV0i.z = tempi.x;
PV0i.w = tempi.x;
R127i.z = tempi.x;
R122i.x = floatBitsToInt((intBitsToFloat(R6i.y) * intBitsToFloat(0x3f1645a2) + intBitsToFloat(R0i.z)));
PS0i = R122i.x;
// 1
tempi.x = floatBitsToInt(dot(vec4(intBitsToFloat(R2i.x),intBitsToFloat(R2i.y),intBitsToFloat(R2i.z),-0.0),vec4(intBitsToFloat(0x3e991687),intBitsToFloat(0x3f1645a2),intBitsToFloat(0x3de978d5),0.0)));
PV1i.x = tempi.x;
PV1i.y = tempi.x;
PV1i.z = tempi.x;
PV1i.w = tempi.x;
R127i.y = tempi.x;
R126i.z = floatBitsToInt((intBitsToFloat(R6i.x) * intBitsToFloat(0x3e991687) + intBitsToFloat(PS0i)));
PS1i = R126i.z;
// 2
R126i.x = floatBitsToInt(dot(vec4(intBitsToFloat(R7i.x),intBitsToFloat(R7i.y),intBitsToFloat(R7i.z),-0.0),vec4(intBitsToFloat(0x3e991687),intBitsToFloat(0x3f1645a2),intBitsToFloat(0x3de978d5),0.0)));
PV0i.x = R126i.x;
PV0i.y = R126i.x;
PV0i.z = R126i.x;
PV0i.w = R126i.x;
R127i.x = floatBitsToInt(intBitsToFloat(R127i.z) + intBitsToFloat(PV1i.x));
PS0i = R127i.x;
// 3
tempi.x = floatBitsToInt(dot(vec4(intBitsToFloat(R4i.x),intBitsToFloat(R4i.y),intBitsToFloat(R4i.z),-0.0),vec4(intBitsToFloat(0x3e991687),intBitsToFloat(0x3f1645a2),intBitsToFloat(0x3de978d5),0.0)));
PV1i.x = tempi.x;
PV1i.y = tempi.x;
PV1i.z = tempi.x;
PV1i.w = tempi.x;
R127i.w = tempi.x;
PS1i = floatBitsToInt(intBitsToFloat(PV0i.x) + intBitsToFloat(PS0i));
// 4
PV0i.x = floatBitsToInt(intBitsToFloat(R127i.y) + intBitsToFloat(PV1i.x));
PV0i.y = floatBitsToInt(intBitsToFloat(R126i.x) + intBitsToFloat(PV1i.x));
PV0i.z = floatBitsToInt(intBitsToFloat(R127i.z) + intBitsToFloat(R126i.x));
PV0i.w = floatBitsToInt(intBitsToFloat(PV1i.x) + intBitsToFloat(PS1i));
R126i.y = floatBitsToInt(min(intBitsToFloat(R127i.z), intBitsToFloat(R127i.y)));
PS0i = R126i.y;
// 5
backupReg0i = R127i.x;
backupReg1i = R127i.z;
backupReg2i = R127i.y;
R127i.x = floatBitsToInt(-(intBitsToFloat(PV0i.x)) + intBitsToFloat(PV0i.z));
PV1i.x = R127i.x;
PV1i.y = floatBitsToInt(intBitsToFloat(PV0i.w) * intBitsToFloat(0x3d000000));
R127i.z = floatBitsToInt(min(intBitsToFloat(R126i.x), intBitsToFloat(R127i.w)));
PV1i.w = floatBitsToInt(-(intBitsToFloat(PV0i.y)) + intBitsToFloat(backupReg0i));
R127i.y = floatBitsToInt(max(intBitsToFloat(backupReg1i), intBitsToFloat(backupReg2i)));
PS1i = R127i.y;
// 6
backupReg0i = R126i.x;
backupReg1i = R127i.w;
R126i.x = floatBitsToInt(-(intBitsToFloat(PV1i.w)));
PV0i.y = floatBitsToInt(max(intBitsToFloat(PV1i.x), -(intBitsToFloat(PV1i.x))));
PV0i.z = floatBitsToInt(max(-(intBitsToFloat(PV1i.w)), intBitsToFloat(PV1i.w)));
R127i.w = floatBitsToInt(max(intBitsToFloat(PV1i.y), intBitsToFloat(0x3c000000)));
PS0i = floatBitsToInt(max(intBitsToFloat(backupReg0i), intBitsToFloat(backupReg1i)));
// 7
PV1i.x = floatBitsToInt(min(intBitsToFloat(PV0i.z), intBitsToFloat(PV0i.y)));
PV1i.y = floatBitsToInt(max(intBitsToFloat(R127i.y), intBitsToFloat(PS0i)));
PV1i.w = floatBitsToInt(min(intBitsToFloat(R126i.y), intBitsToFloat(R127i.z)));
// 8
R2i.x = floatBitsToInt(max(intBitsToFloat(R126i.z), intBitsToFloat(PV1i.y)));
R2i.z = floatBitsToInt(min(intBitsToFloat(R126i.z), intBitsToFloat(PV1i.w)));
PV0i.w = floatBitsToInt(intBitsToFloat(R127i.w) + intBitsToFloat(PV1i.x));
// 9
PS1i = floatBitsToInt(1.0 / intBitsToFloat(PV0i.w));
// 10
PV0i.x = floatBitsToInt(mul_nonIEEE(intBitsToFloat(R127i.x), intBitsToFloat(PS1i)));
PV0i.y = floatBitsToInt(mul_nonIEEE(intBitsToFloat(R126i.x), intBitsToFloat(PS1i)));
// 11
PV1i.z = floatBitsToInt(max(intBitsToFloat(PV0i.x), intBitsToFloat(0xc1000000)));
PV1i.w = floatBitsToInt(max(intBitsToFloat(PV0i.y), intBitsToFloat(0xc1000000)));
// 12
PV0i.y = floatBitsToInt(min(intBitsToFloat(PV1i.w), intBitsToFloat(0x41000000)));
PV0i.w = floatBitsToInt(min(intBitsToFloat(PV1i.z), intBitsToFloat(0x41000000)));
// 13
R126i.z = floatBitsToInt(mul_nonIEEE(intBitsToFloat(R0i.x), intBitsToFloat(PV0i.y)));
PV1i.z = R126i.z;
R127i.w = floatBitsToInt(mul_nonIEEE(intBitsToFloat(R0i.y), intBitsToFloat(PV0i.w)));
PV1i.w = R127i.w;
// 14
R0i.x = floatBitsToInt((intBitsToFloat(PV1i.z) * intBitsToFloat(0x3e2aaaac) + intBitsToFloat(R1i.x)));
R0i.y = floatBitsToInt((intBitsToFloat(PV1i.w) * intBitsToFloat(0x3e2aaaac) + intBitsToFloat(R1i.y)));
R4i.z = floatBitsToInt((intBitsToFloat(PV1i.z) * intBitsToFloat(0xbe2aaaaa) + intBitsToFloat(R1i.x)));
R4i.w = floatBitsToInt((intBitsToFloat(PV1i.w) * intBitsToFloat(0xbe2aaaaa) + intBitsToFloat(R1i.y)));
R4i.x = floatBitsToInt((intBitsToFloat(PV1i.z) * 0.5 + intBitsToFloat(R1i.x)));
PS0i = R4i.x;
// 15
backupReg0i = R1i.x;
R1i.x = floatBitsToInt((-(intBitsToFloat(R126i.z)) * 0.5 + intBitsToFloat(backupReg0i)));
R4i.y = floatBitsToInt((intBitsToFloat(R127i.w) * 0.5 + intBitsToFloat(R1i.y)));
R1i.z = floatBitsToInt((-(intBitsToFloat(R127i.w)) * 0.5 + intBitsToFloat(R1i.y)));
R0i.xyz = floatBitsToInt(texture(textureUnitPS0, intBitsToFloat(R0i.xy)).xyz);
R7i.xyz = floatBitsToInt(texture(textureUnitPS0, intBitsToFloat(R4i.zw)).xyz);
R4i.xyz = floatBitsToInt(texture(textureUnitPS0, intBitsToFloat(R4i.xy)).xyz);
R1i.xyz = floatBitsToInt(texture(textureUnitPS0, intBitsToFloat(R1i.xz)).xyz);
// 0
R126i.x = floatBitsToInt(intBitsToFloat(R0i.z) + intBitsToFloat(R7i.z));
R126i.x = floatBitsToInt(intBitsToFloat(R126i.x) / 2.0);
R127i.z = floatBitsToInt(intBitsToFloat(R0i.y) + intBitsToFloat(R7i.y));
R127i.z = floatBitsToInt(intBitsToFloat(R127i.z) / 2.0);
PV0i.z = R127i.z;
R127i.w = floatBitsToInt(intBitsToFloat(R0i.x) + intBitsToFloat(R7i.x));
R127i.w = floatBitsToInt(intBitsToFloat(R127i.w) / 2.0);
PV0i.w = R127i.w;
// 1
PV1i.x = floatBitsToInt(intBitsToFloat(R4i.x) + intBitsToFloat(R1i.x));
PV1i.y = PV0i.w;
PV1i.y = floatBitsToInt(intBitsToFloat(PV1i.y) / 2.0);
R126i.z = floatBitsToInt(intBitsToFloat(R4i.z) + intBitsToFloat(R1i.z));
PV1i.w = floatBitsToInt(intBitsToFloat(R4i.y) + intBitsToFloat(R1i.y));
PS1i = PV0i.z;
PS1i = floatBitsToInt(intBitsToFloat(PS1i) / 2.0);
// 2
R127i.x = floatBitsToInt((intBitsToFloat(PV1i.x) * 0.25 + intBitsToFloat(PV1i.y)));
R127i.y = floatBitsToInt((intBitsToFloat(PV1i.w) * 0.25 + intBitsToFloat(PS1i)));
PV0i.w = R126i.x;
PV0i.w = floatBitsToInt(intBitsToFloat(PV0i.w) / 2.0);
// 3
backupReg0i = R126i.z;
R126i.z = floatBitsToInt((intBitsToFloat(backupReg0i) * 0.25 + intBitsToFloat(PV0i.w)));
PV1i.z = R126i.z;
// 4
tempi.x = floatBitsToInt(dot(vec4(intBitsToFloat(R127i.x),intBitsToFloat(R127i.y),intBitsToFloat(PV1i.z),-0.0),vec4(intBitsToFloat(0x3e991687),intBitsToFloat(0x3f1645a2),intBitsToFloat(0x3de978d5),0.0)));
PV0i.x = tempi.x;
PV0i.y = tempi.x;
PV0i.z = tempi.x;
PV0i.w = tempi.x;
// 5
PV1i.y = ((intBitsToFloat(PV0i.x) > intBitsToFloat(R2i.x))?int(0xFFFFFFFF):int(0x0));
PV1i.z = ((intBitsToFloat(R2i.z) > intBitsToFloat(PV0i.x))?int(0xFFFFFFFF):int(0x0));
// 6
R123i.x = ((PV1i.z == 0)?(PV1i.y):(int(-1)));
PV0i.x = R123i.x;
// 7
R8i.x = ((PV0i.x == 0)?(R127i.x):(R127i.w));
R8i.y = ((PV0i.x == 0)?(R127i.y):(R127i.z));
R8i.z = ((PV0i.x == 0)?(R126i.z):(R126i.x));
// export
if( ((vec4(intBitsToFloat(R8i.x), intBitsToFloat(R8i.y), intBitsToFloat(R8i.z), intBitsToFloat(R8i.w))).a > uf_alphaTestRef) == false) discard;
passPixelColor0 = vec4(intBitsToFloat(R8i.x), intBitsToFloat(R8i.y), intBitsToFloat(R8i.z), intBitsToFloat(R8i.w));
}

View File

@ -0,0 +1,609 @@
// shader 340382e6fbbb3951
#include <metal_stdlib>
using namespace metal;
#define SET_POSITION(_v) out.position = _v; out.position.z = (out.position.z + out.position.w) / 2.0
// start of shader inputs/outputs, predetermined by Cemu. Do not touch
struct SupportBuffer {
int4 remapped[11];
float2 fragCoordScale;
};
#define GET_FRAGCOORD() float4(in.position.xy * supportBuffer.fragCoordScale.xy, in.position.z, 1.0 / in.position.w)
struct FragmentIn {
float4 position [[position]];
float4 passParameterSem0 [[user(locn0)]] [[center_no_perspective]];
float4 passParameterSem1 [[user(locn1)]] [[center_no_perspective]];
};
struct FragmentOut {
float4 passPixelColor0 [[color(0)]];
};
// end of shader inputs/outputs
template<typename TextureT, typename CoordT>
float sampleCompareEmulate(TextureT tex, sampler samplr, CoordT coord, float compareValue) {
return compareValue < tex.sample(samplr, coord).x ? 1.0 : 0.0;
}
template<typename TextureT, typename CoordT>
float2 textureCalculateLod(TextureT tex, sampler samplr, CoordT coord) {
float lod = tex.calculate_unclamped_lod(samplr, coord);
return float2(floor(lod), fract(lod));
}
int clampFI32(int v)
{
if( v == 0x7FFFFFFF )
return as_type<int>(1.0);
else if( v == 0xFFFFFFFF )
return as_type<int>(0.0);
return as_type<int>(clamp(as_type<float>(v), 0.0, 1.0));
}
float mul_nonIEEE(float a, float b){ if( a == 0.0 || b == 0.0 ) return 0.0; return a*b; }
fragment FragmentOut main0(FragmentIn in [[stage_in]], float2 pointCoord [[point_coord]], bool frontFacing [[front_facing]], constant SupportBuffer& supportBuffer [[buffer(0)]], texture2d_array<float> tex0 [[texture(0)]], sampler samplr0 [[sampler(0)]], texture2d<float> tex1 [[texture(1)]], sampler samplr1 [[sampler(1)]], texture2d<float> tex2 [[texture(2)]], sampler samplr2 [[sampler(2)]]) {
FragmentOut out;
int4 R0i = int4(0);
int4 R1i = int4(0);
int4 R2i = int4(0);
int4 R3i = int4(0);
int4 R4i = int4(0);
int4 R5i = int4(0);
int4 R6i = int4(0);
int4 R7i = int4(0);
int4 R8i = int4(0);
int4 R9i = int4(0);
int4 R122i = int4(0);
int4 R123i = int4(0);
int4 R124i = int4(0);
int4 R125i = int4(0);
int4 R126i = int4(0);
int4 R127i = int4(0);
int backupReg0i, backupReg1i, backupReg2i, backupReg3i, backupReg4i;
int PV0ix = 0, PV0iy = 0, PV0iz = 0, PV0iw = 0, PV1ix = 0, PV1iy = 0, PV1iz = 0, PV1iw = 0;
int PS0i = 0, PS1i = 0;
int4 tempi = int4(0);
float tempResultf;
int tempResulti;
int4 ARi = int4(0);
bool predResult = true;
bool activeMaskStack[2];
bool activeMaskStackC[3];
activeMaskStack[0] = false;
activeMaskStackC[0] = false;
activeMaskStackC[1] = false;
activeMaskStack[0] = true;
activeMaskStackC[0] = true;
activeMaskStackC[1] = true;
R0i = as_type<int4>(in.passParameterSem0);
R1i = as_type<int4>(in.passParameterSem1);
if( activeMaskStackC[1] == true ) {
R7i.xyz = as_type<int3>(tex2.sample(samplr2, float2(as_type<float>(R0i.x),as_type<float>(R0i.y))).xyz);
R1i.w = as_type<int>(tex1.sample(samplr1, float2(as_type<float>(R0i.x),as_type<float>(R0i.y))).x);
}
if( activeMaskStackC[1] == true ) {
// 0
R127i.x = as_type<int>(as_type<float>(R7i.x) * 2.0 + -(1.0));
R127i.y = as_type<int>(as_type<float>(R7i.y) * 2.0 + -(1.0));
PV0iz = 0;
R127i.w = as_type<int>(mul_nonIEEE(-(as_type<float>(R1i.w)),as_type<float>(supportBuffer.remapped[0].x)) + -(as_type<float>(supportBuffer.remapped[1].z)));
R126i.w = int(0x3f800000);
// 1
tempi.x = as_type<int>(dot(float4(as_type<float>(R127i.x),as_type<float>(R127i.y),as_type<float>(PV0iz),as_type<float>(0x80000000)),float4(as_type<float>(R127i.x),as_type<float>(R127i.y),as_type<float>(R127i.y),0.0)));
PV1ix = tempi.x;
PV1iy = tempi.x;
PV1iz = tempi.x;
PV1iw = tempi.x;
R2i.x = as_type<int>(mul_nonIEEE(as_type<float>(R1i.x), as_type<float>(R127i.w)));
// 2
R125i.x = as_type<int>(mul_nonIEEE(as_type<float>(R1i.y), as_type<float>(R127i.w)));
PV0iy = as_type<int>(-(as_type<float>(PV1ix)) + 1.0);
R126i.z = R127i.w;
R3i.w = as_type<int>(max(as_type<float>(R127i.w), -(as_type<float>(R127i.w))));
R125i.w = int(0x3f800000);
// 3
tempi.x = as_type<int>(dot(float4(as_type<float>(R2i.x),as_type<float>(R125i.x),as_type<float>(R126i.z),as_type<float>(R126i.w)),float4(as_type<float>(supportBuffer.remapped[2].x),as_type<float>(supportBuffer.remapped[2].y),as_type<float>(supportBuffer.remapped[2].z),as_type<float>(supportBuffer.remapped[2].w))));
PV1ix = tempi.x;
PV1iy = tempi.x;
PV1iz = tempi.x;
PV1iw = tempi.x;
PS1i = as_type<int>(sqrt(as_type<float>(PV0iy)));
// 4
R126i.x = 0;
R5i.y = 0;
R127i.z = as_type<int>(-(as_type<float>(PS1i)));
R127i.w = as_type<int>(mul_nonIEEE(as_type<float>(R126i.w), as_type<float>(supportBuffer.remapped[3].w)));
R124i.w = as_type<int>(1.0 / as_type<float>(PV1ix));
// 5
tempi.x = as_type<int>(dot(float4(as_type<float>(R127i.x),as_type<float>(R127i.y),as_type<float>(R127i.z),as_type<float>(0x80000000)),float4(as_type<float>(R127i.x),as_type<float>(R127i.y),as_type<float>(R127i.z),0.0)));
PV1ix = tempi.x;
PV1iy = tempi.x;
PV1iz = tempi.x;
PV1iw = tempi.x;
R6i.z = 0;
// 6
tempi.x = as_type<int>(dot(float4(as_type<float>(R2i.x),as_type<float>(R125i.x),as_type<float>(R126i.z),as_type<float>(R127i.w)),float4(as_type<float>(supportBuffer.remapped[3].x),as_type<float>(supportBuffer.remapped[3].y),as_type<float>(supportBuffer.remapped[3].z),1.0)));
PV0ix = tempi.x;
PV0iy = tempi.x;
PV0iz = tempi.x;
PV0iw = tempi.x;
tempResultf = 1.0 / sqrt(as_type<float>(PV1ix));
PS0i = as_type<int>(tempResultf);
// 7
R1i.x = as_type<int>(mul_nonIEEE(as_type<float>(R127i.x), as_type<float>(PS0i)));
R1i.y = as_type<int>(mul_nonIEEE(as_type<float>(R127i.y), as_type<float>(PS0i)));
R3i.z = as_type<int>(mul_nonIEEE(as_type<float>(R127i.z), as_type<float>(PS0i)));
R127i.w = as_type<int>(mul_nonIEEE(as_type<float>(R126i.w), as_type<float>(supportBuffer.remapped[4].w)));
R6i.x = as_type<int>(as_type<float>(PV0ix) * as_type<float>(R124i.w));
// 8
R124i.x = as_type<int>(mul_nonIEEE(as_type<float>(R1i.x),as_type<float>(R3i.w)) + as_type<float>(R2i.x));
R127i.y = as_type<int>(mul_nonIEEE(as_type<float>(R1i.y),as_type<float>(R3i.w)) + as_type<float>(R125i.x));
R127i.z = as_type<int>(mul_nonIEEE(as_type<float>(R3i.z),as_type<float>(R3i.w)) + as_type<float>(R126i.z));
PV0iw = as_type<int>(max(as_type<float>(R1i.y), -(as_type<float>(R1i.y))));
tempResultf = max(0.0, as_type<float>(supportBuffer.remapped[5].w));
tempResultf = log2(tempResultf);
if( isinf(tempResultf) == true ) tempResultf = -3.40282347E+38F;
R4i.w = as_type<int>(tempResultf);
// 9
tempi.x = as_type<int>(dot(float4(as_type<float>(R124i.x),as_type<float>(R127i.y),as_type<float>(R127i.z),as_type<float>(R125i.w)),float4(as_type<float>(supportBuffer.remapped[2].x),as_type<float>(supportBuffer.remapped[2].y),as_type<float>(supportBuffer.remapped[2].z),as_type<float>(supportBuffer.remapped[2].w))));
PV1ix = tempi.x;
PV1iy = tempi.x;
PV1iz = tempi.x;
PV1iw = tempi.x;
R6i.y = as_type<int>(-(as_type<float>(PV0iw)) + 1.0);
// 10
tempi.x = as_type<int>(dot(float4(as_type<float>(R2i.x),as_type<float>(R125i.x),as_type<float>(R126i.z),as_type<float>(R127i.w)),float4(as_type<float>(supportBuffer.remapped[4].x),as_type<float>(supportBuffer.remapped[4].y),as_type<float>(supportBuffer.remapped[4].z),1.0)));
PV0ix = tempi.x;
PV0iy = tempi.x;
PV0iz = tempi.x;
PV0iw = tempi.x;
R1i.x = as_type<int>(1.0 / as_type<float>(PV1ix));
// 11
tempi.x = as_type<int>(dot(float4(as_type<float>(R124i.x),as_type<float>(R127i.y),as_type<float>(R127i.z),as_type<float>(R125i.w)),float4(as_type<float>(supportBuffer.remapped[3].x),as_type<float>(supportBuffer.remapped[3].y),as_type<float>(supportBuffer.remapped[3].z),as_type<float>(supportBuffer.remapped[3].w))));
PV1ix = tempi.x;
PV1iy = tempi.x;
PV1iz = tempi.x;
PV1iw = tempi.x;
R7i.y = as_type<int>(as_type<float>(PV0ix) * as_type<float>(R124i.w));
// 12
tempi.x = as_type<int>(dot(float4(as_type<float>(R124i.x),as_type<float>(R127i.y),as_type<float>(R127i.z),as_type<float>(R125i.w)),float4(as_type<float>(supportBuffer.remapped[4].x),as_type<float>(supportBuffer.remapped[4].y),as_type<float>(supportBuffer.remapped[4].z),as_type<float>(supportBuffer.remapped[4].w))));
PV0ix = tempi.x;
PV0iy = tempi.x;
PV0iz = tempi.x;
PV0iw = tempi.x;
PS0i = as_type<int>(as_type<float>(PV1ix) * as_type<float>(R1i.x));
// 13
R127i.x = as_type<int>(-(as_type<float>(R6i.x)) + as_type<float>(PS0i));
R126i.y = as_type<int>(-(as_type<float>(R6i.x)) + as_type<float>(PS0i));
PV1iz = as_type<int>(as_type<float>(PV0ix) * as_type<float>(R1i.x));
PV1iw = as_type<int>(mul_nonIEEE(as_type<float>(R125i.w), as_type<float>(supportBuffer.remapped[6].w)));
PS1i = as_type<int>(mul_nonIEEE(as_type<float>(R126i.w), as_type<float>(supportBuffer.remapped[6].w)));
// 14
R3i.x = as_type<int>(-(as_type<float>(R7i.y)) + as_type<float>(PV1iz));
PV0iy = as_type<int>(-(as_type<float>(R7i.y)) + as_type<float>(PV1iz));
R127i.z = as_type<int>(mul_nonIEEE(as_type<float>(R127i.z),as_type<float>(supportBuffer.remapped[6].z)) + as_type<float>(PV1iw));
R122i.x = as_type<int>(mul_nonIEEE(as_type<float>(R126i.z),as_type<float>(supportBuffer.remapped[6].z)) + as_type<float>(PS1i));
// 15
tempi.x = as_type<int>(dot(float4(as_type<float>(R127i.x),as_type<float>(PV0iy),as_type<float>(R126i.x),as_type<float>(0x80000000)),float4(as_type<float>(R127i.x),as_type<float>(PV0iy),as_type<float>(R126i.x),0.0)));
PV1ix = tempi.x;
PV1iy = tempi.x;
PV1iz = tempi.x;
PV1iw = tempi.x;
R127i.x = as_type<int>(mul_nonIEEE(as_type<float>(R125i.x),as_type<float>(supportBuffer.remapped[6].y)) + as_type<float>(R122i.x));
// 16
tempi.x = as_type<int>(dot(float4(as_type<float>(R124i.x),as_type<float>(R127i.y),as_type<float>(R127i.z),0.0),float4(as_type<float>(supportBuffer.remapped[6].x),as_type<float>(supportBuffer.remapped[6].y),1.0,0.0)));
PV0ix = tempi.x;
PV0iy = tempi.x;
PV0iz = tempi.x;
PV0iw = tempi.x;
PS0i = as_type<int>(sqrt(as_type<float>(PV1ix)));
// 17
R123i.z = as_type<int>(mul_nonIEEE(as_type<float>(R2i.x),as_type<float>(supportBuffer.remapped[6].x)) + as_type<float>(R127i.x));
R126i.w = as_type<int>(as_type<float>(PV0ix) * as_type<float>(R1i.x));
PS1i = as_type<int>(1.0 / as_type<float>(PS0i));
// 18
R4i.z = as_type<int>(as_type<float>(R123i.z) * as_type<float>(R124i.w));
PV0iw = as_type<int>(as_type<float>(PS1i) * as_type<float>(0x3db4b4b5));
// 19
PV1ix = as_type<int>(mul_nonIEEE(as_type<float>(PV0iw), as_type<float>(supportBuffer.remapped[5].y)));
PV1iw = as_type<int>(-(as_type<float>(R4i.z)) + as_type<float>(R126i.w));
// 20
R7i.x = as_type<int>(mul_nonIEEE(as_type<float>(R126i.y), as_type<float>(PV1ix)));
R8i.y = as_type<int>(mul_nonIEEE(as_type<float>(R3i.x), as_type<float>(PV1ix)));
R5i.z = as_type<int>(mul_nonIEEE(as_type<float>(PV1iw), as_type<float>(PV1ix)));
}
while( activeMaskStackC[1] == true )
{
if( activeMaskStackC[1] == true ) {
activeMaskStack[1] = activeMaskStack[0];
activeMaskStackC[2] = activeMaskStackC[1];
// 0
R1i.y = (($sampleCount > as_type<float>(R6i.z))?-1:0);
// 1
predResult = (R1i.y == 0);
activeMaskStack[1] = predResult;
activeMaskStackC[2] = predResult == true && activeMaskStackC[1] == true;
}
else {
activeMaskStack[1] = false;
activeMaskStackC[2] = false;
}
if( activeMaskStackC[2] == true ) {
// 0
R1i.y = R5i.y;
}
if( activeMaskStackC[2] == true ) {
break;
}
activeMaskStackC[1] = activeMaskStack[0] == true && activeMaskStackC[0] == true;
if( activeMaskStackC[1] == true ) {
activeMaskStack[1] = activeMaskStack[0];
activeMaskStackC[2] = activeMaskStackC[1];
// 0
R123i.w = as_type<int>(as_type<float>(R6i.z) * 4.0 + 0.0);
// 1
R8i.x = as_type<int>(as_type<float>(R123i.w) + 1.0);
R9i.y = as_type<int>(as_type<float>(R123i.w) + 2.0);
R8i.z = as_type<int>(as_type<float>(R123i.w) + 3.0);
R5i.w = as_type<int>(as_type<float>(R123i.w) + 4.0);
// 2
R1i.x = as_type<int>(mul_nonIEEE(as_type<float>(R7i.x),as_type<float>(R8i.x)) + as_type<float>(R6i.x));
R1i.y = as_type<int>(mul_nonIEEE(as_type<float>(R8i.y),as_type<float>(R8i.x)) + as_type<float>(R7i.y));
R1i.z = as_type<int>(mul_nonIEEE(as_type<float>(R7i.x),as_type<float>(R9i.y)) + as_type<float>(R6i.x));
R1i.w = as_type<int>(mul_nonIEEE(as_type<float>(R8i.y),as_type<float>(R9i.y)) + as_type<float>(R7i.y));
R2i.x = as_type<int>(mul_nonIEEE(as_type<float>(R7i.x),as_type<float>(R8i.z)) + as_type<float>(R6i.x));
// 3
PV1ix = as_type<int>(max(as_type<float>(R1i.y), -(1.0)));
R2i.y = as_type<int>(mul_nonIEEE(as_type<float>(R8i.y),as_type<float>(R8i.z)) + as_type<float>(R7i.y));
PV1iz = as_type<int>(max(as_type<float>(R1i.x), -(1.0)));
PV1iw = as_type<int>(max(as_type<float>(R1i.z), -(1.0)));
R127i.w = as_type<int>(max(as_type<float>(R1i.w), -(1.0)));
// 4
PV0ix = as_type<int>(min(as_type<float>(PV1iz), 1.0));
PV0iy = as_type<int>(min(as_type<float>(PV1ix), 1.0));
R2i.z = as_type<int>(mul_nonIEEE(as_type<float>(R7i.x),as_type<float>(R5i.w)) + as_type<float>(R6i.x));
R2i.w = as_type<int>(mul_nonIEEE(as_type<float>(R8i.y),as_type<float>(R5i.w)) + as_type<float>(R7i.y));
R127i.y = as_type<int>(min(as_type<float>(PV1iw), 1.0));
// 5
R127i.x = as_type<int>(max(as_type<float>(R2i.y), -(1.0)));
R126i.y = as_type<int>(as_type<float>(R1i.x) + -(as_type<float>(PV0ix)));
PV1iz = as_type<int>(max(as_type<float>(R2i.x), -(1.0)));
PV1iw = as_type<int>(min(as_type<float>(R127i.w), 1.0));
R125i.y = as_type<int>(as_type<float>(R1i.y) + -(as_type<float>(PV0iy)));
// 6
PV0ix = as_type<int>(max(as_type<float>(R2i.w), -(1.0)));
PV0iy = as_type<int>(max(as_type<float>(R2i.z), -(1.0)));
R127i.z = as_type<int>(as_type<float>(R1i.z) + -(as_type<float>(R127i.y)));
R127i.w = as_type<int>(as_type<float>(R1i.w) + -(as_type<float>(PV1iw)));
PS0i = as_type<int>(min(as_type<float>(PV1iz), 1.0));
// 7
PV1ix = as_type<int>(min(as_type<float>(R127i.x), 1.0));
R127i.y = as_type<int>(as_type<float>(R2i.x) + -(as_type<float>(PS0i)));
PV1iz = as_type<int>(min(as_type<float>(PV0iy), 1.0));
PV1iw = as_type<int>(min(as_type<float>(PV0ix), 1.0));
R3i.x = as_type<int>(mul_nonIEEE(as_type<float>(R5i.z),as_type<float>(R8i.x)) + as_type<float>(R4i.z));
// 8
PV0ix = as_type<int>(0.0);
R124i.y = as_type<int>(as_type<float>(R2i.y) + -(as_type<float>(PV1ix)));
R126i.z = as_type<int>(as_type<float>(R2i.z) + -(as_type<float>(PV1iz)));
R126i.w = as_type<int>(as_type<float>(R2i.w) + -(as_type<float>(PV1iw)));
R4i.y = as_type<int>(mul_nonIEEE(as_type<float>(R5i.z),as_type<float>(R9i.y)) + as_type<float>(R4i.z));
// 9
tempi.x = as_type<int>(dot(float4(as_type<float>(R126i.y),as_type<float>(R125i.y),as_type<float>(PV0ix),as_type<float>(0x80000000)),float4(1.0,1.0,1.0,0.0)));
PV1ix = tempi.x;
PV1iy = tempi.x;
PV1iz = tempi.x;
PV1iw = tempi.x;
R0i.z = as_type<int>(mul_nonIEEE(as_type<float>(R5i.z),as_type<float>(R8i.z)) + as_type<float>(R4i.z));
// 10
tempi.x = as_type<int>(dot(float4(as_type<float>(R127i.z),as_type<float>(R127i.w),as_type<float>(R127i.w),as_type<float>(0x80000000)),float4(1.0,1.0,0.0,0.0)));
PV0ix = tempi.x;
PV0iy = tempi.x;
PV0iz = tempi.x;
PV0iw = tempi.x;
R127i.z = ((as_type<float>(PV1ix) != 0.0)?-1:0);
// 11
tempi.x = as_type<int>(dot(float4(as_type<float>(R127i.y),as_type<float>(R124i.y),as_type<float>(R124i.y),as_type<float>(0x80000000)),float4(1.0,1.0,0.0,0.0)));
PV1ix = tempi.x;
R127i.y = tempi.x;
PV1iz = tempi.x;
PV1iw = tempi.x;
PS1i = ((as_type<float>(PV0ix) != 0.0)?-1:0);
// 12
tempi.x = as_type<int>(dot(float4(as_type<float>(R126i.z),as_type<float>(R126i.w),as_type<float>(R126i.w),as_type<float>(0x80000000)),float4(1.0,1.0,0.0,0.0)));
PV0ix = tempi.x;
PV0iy = tempi.x;
PV0iz = tempi.x;
PV0iw = tempi.x;
R127i.z = R127i.z | PS1i;
// 13
PV1iy = ((as_type<float>(R127i.y) != 0.0)?-1:0);
R126i.w = ((as_type<float>(PV0ix) != 0.0)?-1:0);
R0i.w = as_type<int>(mul_nonIEEE(as_type<float>(R5i.z),as_type<float>(R5i.w)) + as_type<float>(R4i.z));
// 14
PV0ix = PV1iy | R127i.z;
// 15
R3i.y = R126i.w | PV0ix;
// 16
predResult = (R3i.y != 0);
activeMaskStack[1] = predResult;
activeMaskStackC[2] = predResult == true && activeMaskStackC[1] == true;
}
else {
activeMaskStack[1] = false;
activeMaskStackC[2] = false;
}
if( activeMaskStackC[2] == true ) {
// 0
R1i.y = R5i.y;
}
if( activeMaskStackC[2] == true ) {
break;
}
activeMaskStackC[1] = activeMaskStack[0] == true && activeMaskStackC[0] == true;
if( activeMaskStackC[1] == true ) {
// 0
PV0ix = R1i.z;
PV0ix = as_type<int>(as_type<float>(PV0ix) / 2.0);
PV0iy = as_type<int>(-(as_type<float>(R1i.w)));
PV0iy = as_type<int>(as_type<float>(PV0iy) / 2.0);
PV0iz = R1i.x;
PV0iz = as_type<int>(as_type<float>(PV0iz) / 2.0);
PV0iw = as_type<int>(-(as_type<float>(R1i.y)));
PV0iw = as_type<int>(as_type<float>(PV0iw) / 2.0);
R127i.y = R2i.x;
R127i.y = as_type<int>(as_type<float>(R127i.y) / 2.0);
// 1
R1i.x = as_type<int>(as_type<float>(PV0iz) + 0.5);
R1i.y = as_type<int>(as_type<float>(PV0iw) + 0.5);
R1i.z = as_type<int>(as_type<float>(PV0ix) + 0.5);
R1i.w = as_type<int>(as_type<float>(PV0iy) + 0.5);
PS1i = as_type<int>(-(as_type<float>(R2i.y)));
PS1i = as_type<int>(as_type<float>(PS1i) / 2.0);
// 2
R2i.x = as_type<int>(as_type<float>(R127i.y) + 0.5);
R2i.y = as_type<int>(as_type<float>(PS1i) + 0.5);
PV0iz = as_type<int>(-(as_type<float>(R2i.w)));
PV0iz = as_type<int>(as_type<float>(PV0iz) / 2.0);
PV0iw = R2i.z;
PV0iw = as_type<int>(as_type<float>(PV0iw) / 2.0);
R4i.x = 0;
// 3
backupReg0i = R3i.x;
R3i.x = as_type<int>(as_type<float>(PV0iw) + 0.5);
R3i.y = as_type<int>(as_type<float>(PV0iz) + 0.5);
R2i.z = backupReg0i;
R2i.w = int(0x3f800000);
R5i.x = 0;
}
if( activeMaskStackC[1] == true ) {
R1i.x = as_type<int>(tex1.sample(samplr1, float2(as_type<float>(R1i.x),as_type<float>(R1i.y))).x);
R1i.y = as_type<int>(tex1.sample(samplr1, float2(as_type<float>(R1i.z),as_type<float>(R1i.w))).x);
R1i.z = as_type<int>(tex1.sample(samplr1, float2(as_type<float>(R2i.x),as_type<float>(R2i.y))).x);
R1i.w = as_type<int>(tex1.sample(samplr1, float2(as_type<float>(R3i.x),as_type<float>(R3i.y))).x);
}
if( activeMaskStackC[1] == true ) {
activeMaskStack[1] = activeMaskStack[0];
activeMaskStackC[2] = activeMaskStackC[1];
// 0
R126i.x = 0;
R125i.y = R0i.z;
R127i.z = R4i.y;
R127i.w = int(0x3f800000);
R125i.w = int(0x3f800000);
// 1
tempi.x = as_type<int>(dot(float4(as_type<float>(R4i.x),as_type<float>(R4i.x),as_type<float>(R2i.z),as_type<float>(R2i.w)),float4(as_type<float>(supportBuffer.remapped[7].x),as_type<float>(supportBuffer.remapped[7].y),as_type<float>(supportBuffer.remapped[7].z),as_type<float>(supportBuffer.remapped[7].w))));
PV1ix = tempi.x;
R127i.y = tempi.x;
PV1iz = tempi.x;
PV1iw = tempi.x;
R125i.x = 0;
// 2
tempi.x = as_type<int>(dot(float4(as_type<float>(R5i.x),as_type<float>(R5i.x),as_type<float>(R127i.z),as_type<float>(R127i.w)),float4(as_type<float>(supportBuffer.remapped[7].x),as_type<float>(supportBuffer.remapped[7].y),as_type<float>(supportBuffer.remapped[7].z),as_type<float>(supportBuffer.remapped[7].w))));
PV0ix = tempi.x;
PV0iy = tempi.x;
PV0iz = tempi.x;
R126i.w = tempi.x;
R126i.z = R0i.w;
// 3
backupReg0i = R127i.y;
PV1ix = as_type<int>(mul_nonIEEE(as_type<float>(R2i.w), as_type<float>(supportBuffer.remapped[8].w)));
R127i.y = as_type<int>(mul_nonIEEE(as_type<float>(R127i.w), as_type<float>(supportBuffer.remapped[8].w)));
R127i.w = int(0x3f800000);
R127i.x = as_type<int>(1.0 / as_type<float>(backupReg0i));
// 4
tempi.x = as_type<int>(dot(float4(as_type<float>(R4i.x),as_type<float>(R4i.x),as_type<float>(R2i.z),as_type<float>(PV1ix)),float4(as_type<float>(supportBuffer.remapped[8].x),as_type<float>(supportBuffer.remapped[8].y),as_type<float>(supportBuffer.remapped[8].z),1.0)));
PV0ix = tempi.x;
PV0iy = tempi.x;
PV0iz = tempi.x;
PV0iw = tempi.x;
R126i.y = as_type<int>(1.0 / as_type<float>(R126i.w));
// 5
tempi.x = as_type<int>(dot(float4(as_type<float>(R5i.x),as_type<float>(R5i.x),as_type<float>(R127i.z),as_type<float>(R127i.y)),float4(as_type<float>(supportBuffer.remapped[8].x),as_type<float>(supportBuffer.remapped[8].y),as_type<float>(supportBuffer.remapped[8].z),1.0)));
PV1ix = tempi.x;
PV1iy = tempi.x;
PV1iz = tempi.x;
PV1iw = tempi.x;
R127i.z = as_type<int>(as_type<float>(PV0ix) * as_type<float>(R127i.x));
// 6
tempi.x = as_type<int>(dot(float4(as_type<float>(R126i.x),as_type<float>(R126i.x),as_type<float>(R125i.y),as_type<float>(R125i.w)),float4(as_type<float>(supportBuffer.remapped[7].x),as_type<float>(supportBuffer.remapped[7].y),as_type<float>(supportBuffer.remapped[7].z),as_type<float>(supportBuffer.remapped[7].w))));
PV0ix = tempi.x;
PV0iy = tempi.x;
PV0iz = tempi.x;
PV0iw = tempi.x;
R127i.x = as_type<int>(as_type<float>(PV1ix) * as_type<float>(R126i.y));
// 7
tempi.x = as_type<int>(dot(float4(as_type<float>(R126i.x),as_type<float>(R126i.x),as_type<float>(R125i.y),as_type<float>(R125i.w)),float4(as_type<float>(supportBuffer.remapped[8].x),as_type<float>(supportBuffer.remapped[8].y),as_type<float>(supportBuffer.remapped[8].z),as_type<float>(supportBuffer.remapped[8].w))));
PV1ix = tempi.x;
PV1iy = tempi.x;
PV1iz = tempi.x;
PV1iw = tempi.x;
PS1i = as_type<int>(1.0 / as_type<float>(PV0ix));
// 8
tempi.x = as_type<int>(dot(float4(as_type<float>(R125i.x),as_type<float>(R125i.x),as_type<float>(R126i.z),as_type<float>(R127i.w)),float4(as_type<float>(supportBuffer.remapped[7].x),as_type<float>(supportBuffer.remapped[7].y),as_type<float>(supportBuffer.remapped[7].z),as_type<float>(supportBuffer.remapped[7].w))));
PV0ix = tempi.x;
PV0iy = tempi.x;
PV0iz = tempi.x;
PV0iw = tempi.x;
R125i.y = as_type<int>(as_type<float>(PV1ix) * as_type<float>(PS1i));
// 9
tempi.x = as_type<int>(dot(float4(as_type<float>(R125i.x),as_type<float>(R125i.x),as_type<float>(R126i.z),as_type<float>(R127i.w)),float4(as_type<float>(supportBuffer.remapped[8].x),as_type<float>(supportBuffer.remapped[8].y),as_type<float>(supportBuffer.remapped[8].z),as_type<float>(supportBuffer.remapped[8].w))));
PV1ix = tempi.x;
PV1iy = tempi.x;
PV1iz = tempi.x;
PV1iw = tempi.x;
PS1i = as_type<int>(1.0 / as_type<float>(PV0ix));
// 10
R123i.x = as_type<int>(mul_nonIEEE(as_type<float>(supportBuffer.remapped[0].y),-(as_type<float>(R127i.x))) + -(as_type<float>(supportBuffer.remapped[0].z)));
R123i.y = as_type<int>(mul_nonIEEE(as_type<float>(supportBuffer.remapped[0].y),-(as_type<float>(R127i.z))) + -(as_type<float>(supportBuffer.remapped[0].z)));
R123i.z = as_type<int>(mul_nonIEEE(as_type<float>(supportBuffer.remapped[0].y),-(as_type<float>(R125i.y))) + -(as_type<float>(supportBuffer.remapped[0].z)));
PV0iw = as_type<int>(as_type<float>(PV1ix) * as_type<float>(PS1i));
// 11
R1i.x = as_type<int>(as_type<float>(R1i.x) + -(as_type<float>(R123i.y)));
R1i.y = as_type<int>(as_type<float>(R1i.y) + -(as_type<float>(R123i.x)));
R0i.z = as_type<int>(as_type<float>(R1i.z) + -(as_type<float>(R123i.z)));
R123i.w = as_type<int>(mul_nonIEEE(as_type<float>(supportBuffer.remapped[0].y),-(as_type<float>(PV0iw))) + -(as_type<float>(supportBuffer.remapped[0].z)));
// 12
R2i.x = ((0.0 > as_type<float>(R1i.x))?-1:0);
R1i.z = ((0.0 > as_type<float>(R0i.z))?-1:0);
R0i.w = ((0.0 > as_type<float>(R1i.y))?-1:0);
R1i.w = as_type<int>(as_type<float>(R1i.w) + -(as_type<float>(R123i.w)));
// 13
PV1iy = R2i.x | R0i.w;
R2i.y = ((0.0 > as_type<float>(R1i.w))?-1:0);
// 14
PV0ix = R1i.z | PV1iy;
// 15
R2i.z = R2i.y | PV0ix;
// 16
predResult = (R2i.z != 0);
activeMaskStack[1] = predResult;
activeMaskStackC[2] = predResult == true && activeMaskStackC[1] == true;
}
else {
activeMaskStack[1] = false;
activeMaskStackC[2] = false;
}
if( activeMaskStackC[2] == true ) {
// 0
int offset = as_type<int>($sampleCount * 4.0);
R127i.x = ((R0i.w == 0)?(offset):(R9i.y));
R127i.y = ((R2i.x == 0)?(offset):(R8i.x));
R127i.z = ((R2i.y == 0)?(offset):(R5i.w));
R127i.w = ((R1i.z == 0)?(offset):(R8i.z));
PS0i = as_type<int>(1.0 / as_type<float>(supportBuffer.remapped[9].x));
// 1
R126i.x = as_type<int>(as_type<float>(R3i.w) * as_type<float>(PS0i));
R126i.x = clampFI32(R126i.x);
PV1iy = as_type<int>(min(as_type<float>(R127i.y), as_type<float>(R127i.x)));
R126i.z = as_type<int>(max(as_type<float>(R1i.x), -(as_type<float>(R1i.x))));
R126i.w = as_type<int>(max(as_type<float>(R1i.y), -(as_type<float>(R1i.y))));
R125i.z = as_type<int>(max(as_type<float>(R0i.z), -(as_type<float>(R0i.z))));
// 2
PV0ix = as_type<int>(min(as_type<float>(R127i.w), as_type<float>(PV1iy)));
R126i.y = as_type<int>(max(as_type<float>(R1i.w), -(as_type<float>(R1i.w))));
// 3
R5i.y = as_type<int>(min(as_type<float>(R127i.z), as_type<float>(PV0ix)));
// 4
backupReg0i = R127i.x;
backupReg1i = R127i.z;
R127i.x = ((as_type<float>(R127i.y) == as_type<float>(R5i.y))?-1:0);
R127i.y = ((as_type<float>(R127i.w) == as_type<float>(R5i.y))?-1:0);
R127i.z = ((as_type<float>(backupReg0i) == as_type<float>(R5i.y))?-1:0);
PV0iw = as_type<int>(as_type<float>(R5i.y) / ($sampleCount * 4.0)); // TODO: should $sampleCount be used here as well?
R125i.y = ((as_type<float>(backupReg1i) == as_type<float>(R5i.y))?-1:0);
// 5
PV1iy = as_type<int>(mul_nonIEEE(as_type<float>(PV0iw), as_type<float>(R6i.y)));
// 6
PV0iw = as_type<int>(mul_nonIEEE(as_type<float>(R126i.x), as_type<float>(PV1iy)));
PV0iw = clampFI32(PV0iw);
// 7
PV1iz = as_type<int>(mul_nonIEEE(as_type<float>(supportBuffer.remapped[5].z), as_type<float>(PV0iw)));
// 8
PV0ix = as_type<int>(mul_nonIEEE(as_type<float>(PV1iz), as_type<float>(R4i.w)));
// 9
PS1i = as_type<int>(exp2(as_type<float>(PV0ix)));
// 10
PV0iw = as_type<int>(mul_nonIEEE(as_type<float>(supportBuffer.remapped[5].x), as_type<float>(PS1i)));
// 11
PV1ix = ((as_type<float>(PV0iw) > as_type<float>(R126i.z))?-1:0);
PV1iy = ((as_type<float>(PV0iw) > as_type<float>(R125i.z))?-1:0);
PV1iz = ((as_type<float>(PV0iw) > as_type<float>(R126i.y))?-1:0);
PV1iw = ((as_type<float>(PV0iw) > as_type<float>(R126i.w))?-1:0);
// 12
R123i.x = ((R127i.z == 0)?(0):(PV1iw));
R127i.y = ((R127i.y == 0)?(0):(PV1iy));
R123i.z = ((R127i.x == 0)?(0):(PV1ix));
R126i.w = ((R125i.y == 0)?(0):(PV1iz));
// 13
PV1iz = R123i.z | R123i.x;
// 14
PV0ix = R127i.y | PV1iz;
// 15
R1i.y = R126i.w | PV0ix;
}
if( activeMaskStackC[2] == true ) {
break;
}
activeMaskStackC[1] = activeMaskStack[0] == true && activeMaskStackC[0] == true;
if( activeMaskStackC[1] == true ) {
// 0
R6i.z = as_type<int>(as_type<float>(R6i.z) + 1.0);
}
}
if( activeMaskStackC[1] == true ) {
// 0
R123i.x = as_type<int>(as_type<float>(R0i.x) * 2.0 + -(1.0));
R127i.y = as_type<int>(mul_nonIEEE(as_type<float>(R7i.x),as_type<float>(R5i.y)) + as_type<float>(R6i.x));
PV0iz = as_type<int>(as_type<float>(R5i.y) / ($sampleCount * 4.0));
R123i.w = as_type<int>(as_type<float>(R0i.y) * 2.0 + -(1.0));
PS0i = as_type<int>(1.0 / as_type<float>(R3i.z));
// 1
R123i.x = as_type<int>(mul_nonIEEE(-(as_type<float>(R123i.x)),as_type<float>(R123i.x)) + 1.0);
PV1iy = as_type<int>(-(as_type<float>(PV0iz)) + 1.0);
R123i.z = as_type<int>(mul_nonIEEE(-(as_type<float>(R123i.w)),as_type<float>(R123i.w)) + 1.0);
PV1iw = as_type<int>(as_type<float>(supportBuffer.remapped[9].w) * as_type<float>(PS0i));
PV1iw = clampFI32(PV1iw);
R126i.y = as_type<int>(mul_nonIEEE(as_type<float>(R8i.y),as_type<float>(R5i.y)) + as_type<float>(R7i.y));
// 2
backupReg0i = R1i.y;
PV0ix = as_type<int>(max(as_type<float>(PV1iy), as_type<float>(0x3dcccccd)));
R1i.y = as_type<int>(mul_nonIEEE(as_type<float>(R123i.z), as_type<float>(R123i.x)));
R2i.z = as_type<int>(-(as_type<float>(PV1iw)) + 1.0);
R0i.w = ((backupReg0i == 0)?(0):(int(0x3f800000)));
PS0i = R127i.y;
PS0i = as_type<int>(as_type<float>(PS0i) / 2.0);
// 3
PV1ix = as_type<int>(-(as_type<float>(R126i.y)));
PV1ix = as_type<int>(as_type<float>(PV1ix) / 2.0);
R0i.z = as_type<int>(rint(1.0));
PV1iw = as_type<int>(min(as_type<float>(PV0ix), 1.0));
R0i.x = as_type<int>(as_type<float>(PS0i) + 0.5);
// 4
R0i.y = as_type<int>(as_type<float>(PV1ix) + 0.5);
R1i.z = as_type<int>(mul_nonIEEE(as_type<float>(PV1iw), as_type<float>(PV1iw)));
}
if( activeMaskStackC[1] == true ) {
R0i.xyz = as_type<int3>(tex0.sample(samplr0, float2(as_type<float>(R0i.x), as_type<float>(R0i.y)), uint(rint(as_type<float>(R0i.z)))).xyz);
}
if( activeMaskStackC[1] == true ) {
// 0
PV0iw = as_type<int>(mul_nonIEEE(as_type<float>(R1i.z), as_type<float>(supportBuffer.remapped[10].w)));
PV0iw = clampFI32(PV0iw);
// 1
PV1iy = as_type<int>(mul_nonIEEE(as_type<float>(R7i.z), as_type<float>(PV0iw)));
// 2
PV0iw = as_type<int>(mul_nonIEEE(as_type<float>(PV1iy), as_type<float>(R1i.y)));
// 3
PV1iw = as_type<int>(mul_nonIEEE(as_type<float>(PV0iw), as_type<float>(R2i.z)));
// 4
PV0iy = as_type<int>(mul_nonIEEE(as_type<float>(PV1iw), as_type<float>(R0i.w)));
// 5
PV1ix = as_type<int>(mul_nonIEEE(as_type<float>(supportBuffer.remapped[10].x), as_type<float>(PV0iy)));
R2i.w = as_type<int>(mul_nonIEEE(as_type<float>(supportBuffer.remapped[10].y), as_type<float>(PV0iy)));
// 6
R2i.x = as_type<int>(mul_nonIEEE(as_type<float>(R0i.x), as_type<float>(PV1ix)));
R2i.y = as_type<int>(mul_nonIEEE(as_type<float>(R0i.y), as_type<float>(PV1ix)));
R2i.z = as_type<int>(mul_nonIEEE(as_type<float>(R0i.z), as_type<float>(PV1ix)));
}
// export
out.passPixelColor0 = as_type<float4>(float4(as_type<float>(R2i.x), as_type<float>(R2i.y), as_type<float>(R2i.z), as_type<float>(R2i.w)));
return out;
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,585 @@
// shader 8ff2cf86e789335f
#include <metal_stdlib>
using namespace metal;
#define SET_POSITION(_v) out.position = _v; out.position.z = (out.position.z + out.position.w) / 2.0
// start of shader inputs/outputs, predetermined by Cemu. Do not touch
struct SupportBuffer {
int4 remapped[10];
float2 fragCoordScale;
};
#define GET_FRAGCOORD() float4(in.position.xy * supportBuffer.fragCoordScale.xy, in.position.z, 1.0 / in.position.w)
struct FragmentIn {
float4 position [[position]];
float4 passParameterSem0 [[user(locn0)]];
float4 passParameterSem1 [[user(locn1)]];
float4 passParameterSem3 [[user(locn2)]];
float4 passParameterSem4 [[user(locn3)]];
float4 passParameterSem6 [[user(locn4)]];
};
struct FragmentOut {
float4 passPixelColor0 [[color(0)]];
};
// end of shader inputs/outputs
void redcCUBE(float4 src0, float4 src1, thread float3& stm, thread int& faceId)
{
// stm -> x .. s, y .. t, z .. MajorAxis*2.0
float3 inputCoord = normalize(float3(src1.y, src1.x, src0.x));
float rx = inputCoord.x;
float ry = inputCoord.y;
float rz = inputCoord.z;
if( abs(rx) > abs(ry) && abs(rx) > abs(rz) )
{
stm.z = rx*2.0;
stm.xy = float2(ry,rz);
if( rx >= 0.0 )
{
faceId = 0;
}
else
{
faceId = 1;
}
}
else if( abs(ry) > abs(rx) && abs(ry) > abs(rz) )
{
stm.z = ry*2.0;
stm.xy = float2(rx,rz);
if( ry >= 0.0 )
{
faceId = 2;
}
else
{
faceId = 3;
}
}
else //if( abs(rz) > abs(ry) && abs(rz) > abs(rx) )
{
stm.z = rz*2.0;
stm.xy = float2(rx,ry);
if( rz >= 0.0 )
{
faceId = 4;
}
else
{
faceId = 5;
}
}
}
float3 redcCUBEReverse(float2 st, int faceId)
{
st.yx = st.xy;
float3 v;
float majorAxis = 1.0;
if( faceId == 0 )
{
v.yz = (st-float2(1.5))*(majorAxis*2.0);
v.x = 1.0;
}
else if( faceId == 1 )
{
v.yz = (st-float2(1.5))*(majorAxis*2.0);
v.x = -1.0;
}
else if( faceId == 2 )
{
v.xz = (st-float2(1.5))*(majorAxis*2.0);
v.y = 1.0;
}
else if( faceId == 3 )
{
v.xz = (st-float2(1.5))*(majorAxis*2.0);
v.y = -1.0;
}
else if( faceId == 4 )
{
v.xy = (st-float2(1.5))*(majorAxis*2.0);
v.z = 1.0;
}
else
{
v.xy = (st-float2(1.5))*(majorAxis*2.0);
v.z = -1.0;
}
return v;
}
template<typename TextureT, typename CoordT>
float sampleCompareEmulate(TextureT tex, sampler samplr, CoordT coord, float compareValue) {
return compareValue < tex.sample(samplr, coord).x ? 1.0 : 0.0;
}
template<typename TextureT, typename CoordT>
float2 textureCalculateLod(TextureT tex, sampler samplr, CoordT coord) {
float lod = tex.calculate_unclamped_lod(samplr, coord);
return float2(floor(lod), fract(lod));
}
int clampFI32(int v)
{
if( v == 0x7FFFFFFF )
return as_type<int>(1.0);
else if( v == 0xFFFFFFFF )
return as_type<int>(0.0);
return as_type<int>(clamp(as_type<float>(v), 0.0, 1.0));
}
float mul_nonIEEE(float a, float b){ if( a == 0.0 || b == 0.0 ) return 0.0; return a*b; }
#define reflExtra $reflExtra
fragment FragmentOut main0(FragmentIn in [[stage_in]], float2 pointCoord [[point_coord]], bool frontFacing [[front_facing]], constant SupportBuffer& supportBuffer [[buffer(0)]], texture2d<float> tex1 [[texture(0)]], sampler samplr1 [[sampler(0)]], texture2d<float> tex2 [[texture(1)]], sampler samplr2 [[sampler(1)]], texture2d<float> tex3 [[texture(2)]], sampler samplr3 [[sampler(2)]], texture2d<float> tex5 [[texture(3)]], sampler samplr5 [[sampler(3)]], texture2d<float> tex7 [[texture(4)]], sampler samplr7 [[sampler(4)]], texture2d<float> tex8 [[texture(5)]], sampler samplr8 [[sampler(5)]], texturecube_array<float> tex9 [[texture(6)]], sampler samplr9 [[sampler(6)]], texture2d_array<float> tex11 [[texture(7)]], sampler samplr11 [[sampler(7)]], texture2d<float> tex12 [[texture(8)]], sampler samplr12 [[sampler(8)]], texture2d<float> tex14 [[texture(9)]], sampler samplr14 [[sampler(9)]]) {
FragmentOut out;
int4 R0i = int4(0);
int4 R1i = int4(0);
int4 R2i = int4(0);
int4 R3i = int4(0);
int4 R4i = int4(0);
int4 R5i = int4(0);
int4 R6i = int4(0);
int4 R7i = int4(0);
int4 R8i = int4(0);
int4 R9i = int4(0);
int4 R10i = int4(0);
int4 R11i = int4(0);
int4 R12i = int4(0);
int4 R13i = int4(0);
int4 R122i = int4(0);
int4 R123i = int4(0);
int4 R124i = int4(0);
int4 R125i = int4(0);
int4 R126i = int4(0);
int4 R127i = int4(0);
int backupReg0i, backupReg1i, backupReg2i, backupReg3i, backupReg4i;
int PV0ix = 0, PV0iy = 0, PV0iz = 0, PV0iw = 0, PV1ix = 0, PV1iy = 0, PV1iz = 0, PV1iw = 0;
int PS0i = 0, PS1i = 0;
int4 tempi = int4(0);
float tempResultf;
int tempResulti;
int4 ARi = int4(0);
bool predResult = true;
float3 cubeMapSTM;
int cubeMapFaceId;
float cubeMapArrayIndex9 = 0.0;
R0i = as_type<int4>(in.passParameterSem0);
R1i = as_type<int4>(in.passParameterSem1);
R2i = as_type<int4>(in.passParameterSem3);
R3i = as_type<int4>(in.passParameterSem4);
R4i = as_type<int4>(in.passParameterSem6);
R7i.xyzw = as_type<int4>(tex3.sample(samplr3, float2(as_type<float>(R4i.z),as_type<float>(R4i.w))).xyzw);
R2i.w = as_type<int>(tex5.sample(samplr5, float2(as_type<float>(R0i.x),as_type<float>(R0i.y))).x);
R5i.xyzw = as_type<int4>(tex7.gather(samplr7, float2(0.0001) + float2(as_type<float>(R0i.x),as_type<float>(R0i.y))).xyzw);
R6i.xyzw = as_type<int4>(tex8.gather(samplr8, float2(0.0001) + float2(as_type<float>(R0i.x),as_type<float>(R0i.y))).xyzw);
R8i.xyzw = as_type<int4>(tex1.sample(samplr1, float2(as_type<float>(R4i.z),as_type<float>(R4i.w))).xyzw);
// 0
R127i.x = as_type<int>(as_type<float>(R7i.x) * 2.0 + -(1.0));
R127i.y = as_type<int>(as_type<float>(R7i.y) * 2.0 + -(1.0));
R126i.z = as_type<int>(as_type<float>(R7i.z) * 2.0 + -(1.0));
R127i.w = as_type<int>(mul_nonIEEE(as_type<float>(R2i.w),as_type<float>(supportBuffer.remapped[0].x)) + as_type<float>(supportBuffer.remapped[1].x));
R127i.z = as_type<int>(-(as_type<float>(R2i.w)) + as_type<float>(R5i.x));
// 1
tempi.x = as_type<int>(dot(float4(as_type<float>(R127i.x),as_type<float>(R127i.y),as_type<float>(R126i.z),as_type<float>(0x80000000)),float4(as_type<float>(R127i.x),as_type<float>(R127i.y),as_type<float>(R126i.z),0.0)));
PV1ix = tempi.x;
PV1iy = tempi.x;
PV1iz = tempi.x;
PV1iw = tempi.x;
R2i.z = as_type<int>(-(as_type<float>(R127i.w)));
// 2
R12i.x = as_type<int>(mul_nonIEEE(as_type<float>(R0i.z), -(as_type<float>(R127i.w))));
R12i.y = as_type<int>(mul_nonIEEE(as_type<float>(R0i.w), -(as_type<float>(R127i.w))));
PV0iz = as_type<int>(mul_nonIEEE(as_type<float>(R127i.w), as_type<float>(supportBuffer.remapped[2].y)));
R125i.w = as_type<int>(max(as_type<float>(R127i.z), -(as_type<float>(R127i.z))));
tempResultf = 1.0 / sqrt(as_type<float>(PV1ix));
R126i.y = as_type<int>(tempResultf);
// 3
R4i.x = as_type<int>(mul_nonIEEE(as_type<float>(R127i.x), as_type<float>(R126i.y)));
R4i.y = as_type<int>(mul_nonIEEE(as_type<float>(R127i.y), as_type<float>(R126i.y)));
R127i.z = as_type<int>(-(as_type<float>(R2i.w)) + as_type<float>(R5i.y));
R126i.w = as_type<int>(-(as_type<float>(R2i.w)) + as_type<float>(R5i.z));
R127i.w = as_type<int>(1.0 / as_type<float>(PV0iz));
R127i.w = as_type<int>(as_type<float>(R127i.w) * 2.0);
// 4
tempi.x = as_type<int>(dot(float4(as_type<float>(R12i.x),as_type<float>(R12i.y),as_type<float>(R2i.z),as_type<float>(0x80000000)),float4(as_type<float>(R12i.x),as_type<float>(R12i.y),as_type<float>(R2i.z),0.0)));
PV0ix = tempi.x;
PV0iy = tempi.x;
PV0iz = tempi.x;
PV0iw = tempi.x;
R9i.x = as_type<int>(mul_nonIEEE(as_type<float>(R2i.x),as_type<float>(R4i.x)) + as_type<float>(R0i.x));
// 5
backupReg0i = R127i.z;
R126i.x = as_type<int>(-(as_type<float>(R2i.w)) + as_type<float>(R5i.w));
R9i.y = as_type<int>(mul_nonIEEE(as_type<float>(R2i.y),as_type<float>(R4i.y)) + as_type<float>(R0i.y));
R127i.z = as_type<int>(mul_nonIEEE(as_type<float>(supportBuffer.remapped[0].x), as_type<float>(R127i.w)));
R127i.w = as_type<int>(max(as_type<float>(backupReg0i), -(as_type<float>(backupReg0i))));
PS1i = as_type<int>(sqrt(as_type<float>(PV0ix)));
// 6
R127i.x = as_type<int>(dot(float4(as_type<float>(R7i.x),as_type<float>(R7i.y),as_type<float>(R7i.z),as_type<float>(0x80000000)),float4(as_type<float>(0x3eaaaaab),as_type<float>(0x3eaaaaab),as_type<float>(0x3eaaaaab),0.0)));
PV0iy = R127i.x;
PV0iz = R127i.x;
PV0iw = R127i.x;
PS0i = as_type<int>(1.0 / as_type<float>(PS1i));
// 7
R2i.x = as_type<int>(mul_nonIEEE(as_type<float>(R12i.x), as_type<float>(PS0i)));
R13i.y = as_type<int>(mul_nonIEEE(as_type<float>(R12i.y), as_type<float>(PS0i)));
R9i.z = as_type<int>(mul_nonIEEE(as_type<float>(R2i.z), as_type<float>(PS0i)));
PV1iw = as_type<int>(-(as_type<float>(R127i.x)) + as_type<float>(R6i.x));
R125i.x = as_type<int>(-(as_type<float>(R127i.x)) + as_type<float>(R6i.y));
// 8
backupReg0i = R127i.x;
R127i.x = as_type<int>(max(as_type<float>(R126i.w), -(as_type<float>(R126i.w))));
PV0iy = as_type<int>(-(as_type<float>(backupReg0i)) + as_type<float>(R6i.w));
R125i.z = as_type<int>(max(as_type<float>(R126i.x), -(as_type<float>(R126i.x))));
PV0iw = as_type<int>(-(as_type<float>(backupReg0i)) + as_type<float>(R6i.z));
PS0i = as_type<int>(max(as_type<float>(PV1iw), -(as_type<float>(PV1iw))));
PS0i = as_type<int>(as_type<float>(PS0i) * 4.0);
// 9
backupReg0i = R126i.z;
PV1ix = as_type<int>(max(as_type<float>(R125i.x), -(as_type<float>(R125i.x))));
PV1ix = as_type<int>(as_type<float>(PV1ix) * 4.0);
PV1iy = as_type<int>(max(as_type<float>(PV0iy), -(as_type<float>(PV0iy))));
PV1iy = as_type<int>(as_type<float>(PV1iy) * 4.0);
R126i.z = as_type<int>(mul_nonIEEE(as_type<float>(R127i.z),as_type<float>(R125i.w)) + as_type<float>(PS0i));
PV1iw = as_type<int>(max(as_type<float>(PV0iw), -(as_type<float>(PV0iw))));
PV1iw = as_type<int>(as_type<float>(PV1iw) * 4.0);
R5i.z = as_type<int>(mul_nonIEEE(as_type<float>(backupReg0i), as_type<float>(R126i.y)));
// 10
backupReg0i = R127i.z;
R123i.x = as_type<int>(mul_nonIEEE(as_type<float>(backupReg0i),as_type<float>(R127i.w)) + as_type<float>(PV1ix));
R123i.y = as_type<int>(mul_nonIEEE(as_type<float>(backupReg0i),as_type<float>(R125i.z)) + as_type<float>(PV1iy));
R127i.z = as_type<int>(fract(as_type<float>(R3i.x)));
R123i.w = as_type<int>(mul_nonIEEE(as_type<float>(backupReg0i),as_type<float>(R127i.x)) + as_type<float>(PV1iw));
R125i.x = as_type<int>(fract(as_type<float>(R3i.y)));
// 11
R127i.x = as_type<int>(as_type<float>(R126i.z) + -(as_type<float>(R123i.w)));
R126i.y = R4i.x;
R126i.y = as_type<int>(as_type<float>(R126i.y) * 2.0);
R126i.z = as_type<int>(-(as_type<float>(R123i.x)) + as_type<float>(R123i.y));
R127i.w = R4i.y;
R127i.w = as_type<int>(as_type<float>(R127i.w) * 2.0);
R125i.w = R5i.z;
R125i.w = as_type<int>(as_type<float>(R125i.w) * 2.0);
// 12
tempi.x = as_type<int>(dot(float4(as_type<float>(R4i.x),as_type<float>(R4i.y),as_type<float>(R5i.z),as_type<float>(0x80000000)),float4(as_type<float>(R2i.x),as_type<float>(R13i.y),as_type<float>(R9i.z),0.0)));
PV0ix = tempi.x;
R127i.y = tempi.x;
PV0iz = tempi.x;
PV0iw = tempi.x;
PS0i = as_type<int>(as_type<float>(R126i.z) + as_type<float>(R127i.x));
// 13
backupReg0i = R127i.x;
R127i.x = as_type<int>(mul_nonIEEE(-(as_type<float>(PV0ix)),as_type<float>(R126i.y)) + as_type<float>(R2i.x));
PV1iy = as_type<int>(as_type<float>(R126i.z) + -(as_type<float>(backupReg0i)));
R126i.z = as_type<int>(mul_nonIEEE(-(as_type<float>(PV0ix)),as_type<float>(R127i.w)) + as_type<float>(R13i.y));
PV1iw = as_type<int>(as_type<float>(PS0i) + as_type<float>(R127i.z));
PV1iw = clampFI32(PV1iw);
R125i.z = as_type<int>(mul_nonIEEE(-(as_type<float>(PV0ix)),as_type<float>(R125i.w)) + as_type<float>(R9i.z));
// 14
R6i.x = as_type<int>(mul_nonIEEE(as_type<float>(R1i.x),as_type<float>(R9i.x)) + as_type<float>(R1i.z));
PV0iy = as_type<int>(as_type<float>(PV1iy) + as_type<float>(R125i.x));
PV0iy = clampFI32(PV0iy);
R11i.z = as_type<int>(rint(0.0));
PV0iw = as_type<int>(-(as_type<float>(R127i.z)) + as_type<float>(PV1iw));
R10i.w = as_type<int>(-(as_type<float>(R7i.w)) * 3.0 + 3.0);
// 15
R11i.x = as_type<int>(mul_nonIEEE(as_type<float>(R3i.z),as_type<float>(PV0iw)) + as_type<float>(R0i.x));
R5i.y = as_type<int>(mul_nonIEEE(as_type<float>(R1i.y),as_type<float>(R9i.y)) + as_type<float>(R1i.w));
R1i.z = as_type<int>(as_type<float>(R2i.x) + as_type<float>(supportBuffer.remapped[3].x));
PV1iw = as_type<int>(-(as_type<float>(R125i.x)) + as_type<float>(PV0iy));
R1i.y = as_type<int>(as_type<float>(R13i.y) + as_type<float>(supportBuffer.remapped[3].y));
// 16
R125i.x = as_type<int>(max(-(as_type<float>(R127i.y)), 0.0));
R11i.y = as_type<int>(mul_nonIEEE(as_type<float>(R3i.w),as_type<float>(PV1iw)) + as_type<float>(R0i.y));
R6i.z = as_type<int>(as_type<float>(R9i.z) + as_type<float>(supportBuffer.remapped[3].z));
R127i.w = as_type<int>(as_type<float>(R8i.w) * 255.0);
R6i.y = as_type<int>(-(as_type<float>(R7i.w)) + 1.0);
// 17
tempi.x = as_type<int>(dot(float4(as_type<float>(supportBuffer.remapped[4].x),as_type<float>(supportBuffer.remapped[4].y),as_type<float>(supportBuffer.remapped[4].z),as_type<float>(0x80000000)),float4(as_type<float>(R127i.x),as_type<float>(R126i.z),as_type<float>(R125i.z),0.0)));
PV1ix = tempi.x;
PV1iy = tempi.x;
PV1iz = tempi.x;
PV1iw = tempi.x;
R1i.w = 0;
// 18
R124i.x = as_type<int>(dot(float4(as_type<float>(supportBuffer.remapped[5].x),as_type<float>(supportBuffer.remapped[5].y),as_type<float>(supportBuffer.remapped[5].z),as_type<float>(0x80000000)),float4(as_type<float>(R127i.x),as_type<float>(R126i.z),as_type<float>(R125i.z),0.0)));
PV0iy = R124i.x;
PV0iz = R124i.x;
PV0iw = R124i.x;
R124i.z = as_type<int>(-(as_type<float>(PV1ix)));
// 19
tempi.x = as_type<int>(dot(float4(as_type<float>(supportBuffer.remapped[6].x),as_type<float>(supportBuffer.remapped[6].y),as_type<float>(supportBuffer.remapped[6].z),as_type<float>(0x80000000)),float4(as_type<float>(R127i.x),as_type<float>(R126i.z),as_type<float>(R125i.z),0.0)));
PV1ix = tempi.x;
R124i.y = tempi.x;
PV1iz = tempi.x;
PV1iw = tempi.x;
R4i.z = int(as_type<float>(R127i.w));
// 20
redcCUBE(float4(as_type<float>(R124i.z),as_type<float>(R124i.z),as_type<float>(R124i.x),as_type<float>(PV1ix)),float4(as_type<float>(PV1ix),as_type<float>(R124i.x),as_type<float>(R124i.z),as_type<float>(R124i.z)),cubeMapSTM,cubeMapFaceId);
R0i.x = as_type<int>(cubeMapSTM.x);
R0i.y = as_type<int>(cubeMapSTM.y);
R0i.z = as_type<int>(cubeMapSTM.z);
R0i.w = cubeMapFaceId;
R2i.y = as_type<int>(min(as_type<float>(R125i.x), 1.0));
// 21
R3i.x = 0;
R3i.y = as_type<int>(as_type<float>(R7i.w) * 255.0);
R10i.z = R0i.w;
R3i.w = as_type<int>(mul_nonIEEE(-(as_type<float>(R7i.w)),as_type<float>(R6i.y)) + as_type<float>(R6i.y));
R3i.z = as_type<int>(1.0 / abs(as_type<float>(R0i.z)));
// 0
R125i.x = as_type<int>(mul_nonIEEE(as_type<float>(supportBuffer.remapped[3].x), as_type<float>(supportBuffer.remapped[7].w)));
R123i.y = as_type<int>(mul_nonIEEE(as_type<float>(R0i.y),as_type<float>(R3i.z)) + 1.5);
R124i.z = R4i.z & int(0xfc);
R123i.w = as_type<int>(mul_nonIEEE(as_type<float>(R0i.x),as_type<float>(R3i.z)) + 1.5);
R127i.y = as_type<int>(mul_nonIEEE(as_type<float>(supportBuffer.remapped[3].y), as_type<float>(supportBuffer.remapped[7].w)));
// 1
R10i.x = R123i.y;
R10i.y = R123i.w;
R125i.z = as_type<int>(mul_nonIEEE(as_type<float>(supportBuffer.remapped[3].z), as_type<float>(supportBuffer.remapped[7].w)));
R127i.w = as_type<int>(as_type<float>(R3i.w) + as_type<float>(0x3c23d70a));
R127i.w = clampFI32(R127i.w);
R126i.z = as_type<int>(-(as_type<float>(R2i.y)) + 1.0);
// 2
tempi.x = as_type<int>(dot(float4(as_type<float>(R1i.z),as_type<float>(R1i.y),as_type<float>(R6i.z),as_type<float>(0x80000000)),float4(as_type<float>(R1i.z),as_type<float>(R1i.y),as_type<float>(R6i.z),0.0)));
PV0ix = tempi.x;
PV0iy = tempi.x;
PV0iz = tempi.x;
PV0iw = tempi.x;
R124i.y = int(as_type<float>(R3i.y));
// 3
tempi.x = as_type<int>(dot(float4(as_type<float>(R4i.x),as_type<float>(R4i.y),as_type<float>(R5i.z),as_type<float>(R5i.z)),float4(-(as_type<float>(R125i.x)),-(as_type<float>(R127i.y)),-(as_type<float>(R125i.z)),-(as_type<float>(R3i.x)))));
PV1ix = tempi.x;
PV1iy = tempi.x;
PV1iz = tempi.x;
R126i.w = tempi.x;
tempResultf = 1.0 / sqrt(as_type<float>(PV0ix));
PS1i = as_type<int>(tempResultf);
// 4
backupReg0i = R124i.z;
PV0ix = as_type<int>(mul_nonIEEE(as_type<float>(R1i.z), as_type<float>(PS1i)));
PV0iy = as_type<int>(mul_nonIEEE(as_type<float>(R1i.y), as_type<float>(PS1i)));
R124i.z = as_type<int>(mul_nonIEEE(as_type<float>(R127i.w), as_type<float>(R127i.w)));
PV0iw = as_type<int>(mul_nonIEEE(as_type<float>(R6i.z), as_type<float>(PS1i)));
R127i.x = as_type<int>(float(backupReg0i));
// 5
backupReg0i = R126i.z;
R124i.x = as_type<int>(mul_nonIEEE(as_type<float>(PV0ix), as_type<float>(supportBuffer.remapped[7].w)));
R126i.y = as_type<int>(mul_nonIEEE(as_type<float>(PV0iy), as_type<float>(supportBuffer.remapped[7].w)));
R126i.z = as_type<int>(mul_nonIEEE(as_type<float>(PV0iw), as_type<float>(supportBuffer.remapped[7].w)));
R127i.w = as_type<int>(as_type<float>(R6i.y) * 0.5 + 0.5);
R125i.y = as_type<int>(mul_nonIEEE(-(as_type<float>(R2i.y)),as_type<float>(backupReg0i)) + as_type<float>(backupReg0i));
// 6
tempi.x = as_type<int>(dot(float4(as_type<float>(R4i.x),as_type<float>(R4i.y),as_type<float>(R5i.z),as_type<float>(R5i.z)),float4(-(as_type<float>(R124i.x)),-(as_type<float>(R126i.y)),-(as_type<float>(R126i.z)),-(as_type<float>(R1i.w)))));
tempi.x = clampFI32(tempi.x);
PV0ix = tempi.x;
PV0iy = tempi.x;
PV0iz = tempi.x;
PV0iw = tempi.x;
R126i.x = R124i.y & int(1);
// 7
tempi.x = as_type<int>(dot(float4(-(as_type<float>(R125i.x)),-(as_type<float>(R127i.y)),-(as_type<float>(R125i.z)),as_type<float>(0x80000000)),float4(-(as_type<float>(R124i.x)),-(as_type<float>(R126i.y)),-(as_type<float>(R126i.z)),0.0)));
tempi.x = clampFI32(tempi.x);
PV1ix = tempi.x;
PV1iy = tempi.x;
PV1iz = tempi.x;
R125i.w = tempi.x;
PS1i = as_type<int>(mul_nonIEEE(as_type<float>(PV0ix), as_type<float>(PV0ix)));
// 8
R125i.x = as_type<int>(mul_nonIEEE(as_type<float>(R127i.w), as_type<float>(R127i.w)));
R125i.x = as_type<int>(as_type<float>(R125i.x) / 2.0);
R127i.y = as_type<int>(mul_nonIEEE(as_type<float>(R124i.z),as_type<float>(PS1i)) + -(as_type<float>(PS1i)));
PV0iz = as_type<int>(-(as_type<float>(PV1ix)) + 1.0);
R3i.w = as_type<int>(as_type<float>(R127i.x) * as_type<float>(0x3b820821));
R122i.x = as_type<int>(mul_nonIEEE(-(as_type<float>(R2i.y)),as_type<float>(R125i.y)) + as_type<float>(R125i.y));
// 9
backupReg0i = R125i.y;
R127i.x = R126i.w;
R127i.x = as_type<int>(as_type<float>(R127i.x) * 2.0);
R125i.y = as_type<int>(mul_nonIEEE(-(as_type<float>(R125i.w)),as_type<float>(PV0iz)) + as_type<float>(PV0iz));
R126i.z = as_type<int>(-(as_type<float>(R7i.w)) * 3.0 + 4.0);
R127i.w = as_type<int>(mul_nonIEEE(as_type<float>(backupReg0i), as_type<float>(R122i.x)));
R7i.y = as_type<int>(as_type<float>(R3i.w) * 0.25 + 0.25);
// 10
R3i.x = R126i.w;
R3i.x = clampFI32(R3i.x);
R126i.y = ((R126i.x == 0)?(0):(int(0x3f800000)));
PV0iz = as_type<int>(as_type<float>(R127i.y) + 1.0);
R123i.w = as_type<int>(mul_nonIEEE(as_type<float>(R2i.y),-(as_type<float>(R125i.x))) + as_type<float>(R2i.y));
R125i.z = as_type<int>(-(as_type<float>(R3i.w)) * as_type<float>(0x3d23d70a) + as_type<float>(0x3d23d70a));
// 11
backupReg0i = R126i.z;
R123i.x = as_type<int>(mul_nonIEEE(-(as_type<float>(R125i.w)),as_type<float>(R125i.y)) + as_type<float>(R125i.y));
R127i.y = as_type<int>(mul_nonIEEE(as_type<float>(R127i.y),as_type<float>(PV0iz)) + as_type<float>(PV0iz));
R126i.z = as_type<int>(as_type<float>(R125i.x) + as_type<float>(R123i.w));
PV1iw = as_type<int>(mul_nonIEEE(as_type<float>(R126i.w), as_type<float>(R127i.x)));
PS1i = as_type<int>(1.0 / as_type<float>(backupReg0i));
// 12
R124i.x = as_type<int>(mul_nonIEEE(as_type<float>(R127i.w), as_type<float>(PS1i)));
R123i.y = as_type<int>(mul_nonIEEE(as_type<float>(R3i.x),-(as_type<float>(R125i.x))) + as_type<float>(R3i.x));
R6i.z = as_type<int>(mul_nonIEEE(as_type<float>(R126i.y), as_type<float>(PV1iw)));
R126i.w = as_type<int>(mul_nonIEEE(as_type<float>(R125i.y), as_type<float>(R123i.x)));
R127i.x = as_type<int>(mul_nonIEEE(as_type<float>(R8i.y),as_type<float>(R3i.w)) + as_type<float>(R125i.z));
// 13
backupReg0i = R125i.x;
backupReg1i = R123i.y;
R125i.x = as_type<int>(mul_nonIEEE(as_type<float>(supportBuffer.remapped[7].w), as_type<float>(supportBuffer.remapped[7].w)));
R123i.y = as_type<int>(mul_nonIEEE(as_type<float>(R8i.x),as_type<float>(R3i.w)) + as_type<float>(R125i.z));
R127i.z = as_type<int>(as_type<float>(backupReg0i) + as_type<float>(backupReg1i));
R127i.w = as_type<int>(mul_nonIEEE(as_type<float>(R8i.z),as_type<float>(R3i.w)) + as_type<float>(R125i.z));
R125i.z = as_type<int>(1.0 / as_type<float>(R127i.y));
// 14
backupReg0i = R126i.z;
R126i.x = as_type<int>(mul_nonIEEE(as_type<float>(R123i.y),-(as_type<float>(R124i.x))) + as_type<float>(R123i.y));
R127i.y = as_type<int>(mul_nonIEEE(as_type<float>(R127i.w),-(as_type<float>(R126i.w))) + as_type<float>(R127i.w));
R126i.z = as_type<int>(mul_nonIEEE(as_type<float>(R127i.x),-(as_type<float>(R126i.w))) + as_type<float>(R127i.x));
R123i.w = as_type<int>(mul_nonIEEE(as_type<float>(R123i.y),-(as_type<float>(R126i.w))) + as_type<float>(R123i.y));
R7i.x = as_type<int>(1.0 / as_type<float>(backupReg0i));
// 15
backupReg0i = R127i.z;
R123i.x = as_type<int>(mul_nonIEEE(as_type<float>(R127i.x),-(as_type<float>(R124i.x))) + as_type<float>(R127i.x));
R125i.y = as_type<int>(mul_nonIEEE(as_type<float>(R124i.z), as_type<float>(R125i.z)));
R127i.z = as_type<int>(as_type<float>(R126i.w) + as_type<float>(R123i.w));
R127i.w = as_type<int>(mul_nonIEEE(as_type<float>(R127i.w),-(as_type<float>(R124i.x))) + as_type<float>(R127i.w));
R126i.y = as_type<int>(1.0 / as_type<float>(backupReg0i));
// 16
backupReg0i = R126i.x;
R126i.x = as_type<int>(as_type<float>(R126i.w) + as_type<float>(R127i.y));
R2i.y = as_type<int>(as_type<float>(R124i.x) + as_type<float>(backupReg0i));
R7i.z = as_type<int>(mul_nonIEEE(as_type<float>(R125i.x), as_type<float>(R125i.x)));
R126i.w = as_type<int>(as_type<float>(R126i.w) + as_type<float>(R126i.z));
R6i.y = as_type<int>(as_type<float>(R124i.x) + as_type<float>(R123i.x));
// 17
backupReg0i = R7i.x;
R7i.x = as_type<int>(as_type<float>(R124i.x) + as_type<float>(R127i.w));
R3i.y = as_type<int>(mul_nonIEEE(as_type<float>(R126i.y), as_type<float>(R125i.y)));
R3i.z = as_type<int>(as_type<float>(R8i.x) * as_type<float>(0x3f895ef0) + as_type<float>(0xba0a8ec8));
R3i.z = clampFI32(R3i.z);
PV1iw = as_type<int>(0.25 * as_type<float>(backupReg0i));
R0i.w = as_type<int>(as_type<float>(R8i.y) * as_type<float>(0x3f895ef0) + as_type<float>(0xba0a8ec8));
R0i.w = clampFI32(R0i.w);
// 18
PV0ix = as_type<int>(mul_nonIEEE(as_type<float>(R126i.x), as_type<float>(PV1iw)));
PV0iy = as_type<int>(mul_nonIEEE(as_type<float>(R126i.w), as_type<float>(PV1iw)));
PV0iz = as_type<int>(mul_nonIEEE(as_type<float>(R127i.z), as_type<float>(PV1iw)));
R6i.w = as_type<int>(as_type<float>(R8i.z) * as_type<float>(0x3f895ef0) + as_type<float>(0xba0a8ec8));
R6i.w = clampFI32(R6i.w);
PS0i = R4i.z & int(1);
// 19
R8i.y = as_type<int>(mul_nonIEEE(as_type<float>(supportBuffer.remapped[8].z), as_type<float>(PV0ix)));
R5i.z = as_type<int>(mul_nonIEEE(as_type<float>(supportBuffer.remapped[8].y), as_type<float>(PV0iy)));
R7i.w = as_type<int>(mul_nonIEEE(as_type<float>(supportBuffer.remapped[8].x), as_type<float>(PV0iz)));
R8i.z = as_type<int>(float(PS0i));
// 20
R4i.x = R11i.x;
R4i.y = R11i.y;
R4i.z = as_type<int>(rint(1.0));
R8i.w = as_type<int>(tex5.sample(samplr5, float2(as_type<float>(R9i.x),as_type<float>(R9i.y))).x);
R13i.xzw = as_type<int3>(tex12.sample(samplr12, float2(as_type<float>(R11i.x),as_type<float>(R11i.y))).xzw);
R0i.xyz = as_type<int3>(tex11.sample(samplr11, float2(as_type<float>(R11i.x), as_type<float>(R11i.y)), uint(rint(as_type<float>(R11i.z)))).xyz);
R1i.xyzw = as_type<int4>(tex2.sample(samplr2, float2(as_type<float>(R11i.x),as_type<float>(R11i.y)), level(0.0)).xyzw);
R4i.xyz = as_type<int3>(tex11.sample(samplr11, float2(as_type<float>(R4i.x), as_type<float>(R4i.y)), uint(rint(as_type<float>(R4i.z)))).xyz);
#if (reflExtra == 0) // Normal Reflections
R10i.xyz = as_type<int3>(tex9.sample(samplr9, redcCUBEReverse(as_type<float2>(R10i.xy),R10i.z), uint(cubeMapArrayIndex9), level(as_type<float>(R10i.w))).xyz);
#elif (reflExtra == 1) // Enhanced Reflections
R10i.xyz = as_type<int3>(tex9.sample(samplr9, redcCUBEReverse(as_type<float2>(R10i.xy),R10i.z), uint(cubeMapArrayIndex9), level(0.0)).xyz);
#endif
R11i.xyz = as_type<int3>(tex14.sample(samplr14, float2(as_type<float>(R11i.x),as_type<float>(R11i.y))).xyz);
// 0
R123i.x = as_type<int>(as_type<float>(R13i.w) * 0.5 + 0.5);
R123i.y = as_type<int>(mul_nonIEEE(as_type<float>(R13i.w),-(as_type<float>(R7i.y))) + as_type<float>(R13i.w));
R123i.z = as_type<int>(mul_nonIEEE(as_type<float>(supportBuffer.remapped[0].x),as_type<float>(R8i.w)) + as_type<float>(supportBuffer.remapped[1].x));
R126i.w = as_type<int>(mul_nonIEEE(as_type<float>(R13i.x), as_type<float>(R3i.x)));
R127i.w = as_type<int>(mul_nonIEEE(as_type<float>(R1i.z),as_type<float>(R7i.x)) + as_type<float>(R4i.z));
// 1
PV1ix = as_type<int>(-(as_type<float>(R123i.z)));
PV1iy = as_type<int>(as_type<float>(R3i.x) + as_type<float>(R123i.x));
PV1iy = clampFI32(PV1iy);
PV1iz = as_type<int>(mul_nonIEEE(-(as_type<float>(R123i.z)), as_type<float>(R5i.y)));
PV1iw = as_type<int>(mul_nonIEEE(-(as_type<float>(R123i.z)), as_type<float>(R6i.x)));
PS1i = as_type<int>(as_type<float>(R7i.y) + as_type<float>(R123i.y));
// 2
R126i.x = as_type<int>(-(as_type<float>(R12i.x)) + as_type<float>(PV1iw));
R126i.y = as_type<int>(-(as_type<float>(R12i.y)) + as_type<float>(PV1iz));
PV0iz = as_type<int>(-(as_type<float>(R2i.z)) + as_type<float>(PV1ix));
R8i.w = as_type<int>(mul_nonIEEE(as_type<float>(R126i.w), as_type<float>(PV1iy)));
R125i.y = as_type<int>(mul_nonIEEE(as_type<float>(PS1i),-(as_type<float>(R1i.w))) + as_type<float>(PS1i));
// 3
tempi.x = as_type<int>(dot(float4(as_type<float>(R2i.x),as_type<float>(R13i.y),as_type<float>(R9i.z),as_type<float>(0x80000000)),float4(as_type<float>(R126i.x),as_type<float>(R126i.y),as_type<float>(PV0iz),0.0)));
PV1ix = tempi.x;
R127i.y = tempi.x;
PV1iz = tempi.x;
PV1iw = tempi.x;
PS1i = as_type<int>(mul_nonIEEE(as_type<float>(supportBuffer.remapped[9].x), as_type<float>(R126i.w)));
// 4
backupReg0i = R126i.y;
R123i.x = as_type<int>(mul_nonIEEE(-(as_type<float>(R2i.x)),as_type<float>(PV1ix)) + as_type<float>(R126i.x));
R126i.y = as_type<int>(mul_nonIEEE(as_type<float>(PS1i), as_type<float>(R7i.z)));
R127i.z = as_type<int>(mul_nonIEEE(as_type<float>(R13i.z), as_type<float>(R13i.z)));
R126i.w = as_type<int>(mul_nonIEEE(-(as_type<float>(R13i.y)),as_type<float>(PV1ix)) + as_type<float>(backupReg0i));
// 5
PV1ix = as_type<int>(mul_nonIEEE(as_type<float>(R125i.y), as_type<float>(R2i.y)));
R123i.y = as_type<int>(mul_nonIEEE(as_type<float>(R1i.x),as_type<float>(R2i.y)) + as_type<float>(R4i.x));
PV1iz = as_type<int>(mul_nonIEEE(as_type<float>(R123i.x), as_type<float>(R123i.x)));
R125i.w = as_type<int>(mul_nonIEEE(as_type<float>(R125i.y), as_type<float>(R6i.y)));
PS1i = as_type<int>(mul_nonIEEE(as_type<float>(R125i.y), as_type<float>(R7i.x)));
// 6
backupReg0i = R123i.y;
backupReg1i = R127i.z;
R123i.x = as_type<int>(mul_nonIEEE(as_type<float>(R1i.y),as_type<float>(R6i.y)) + as_type<float>(R4i.y));
R123i.y = as_type<int>(mul_nonIEEE(as_type<float>(R126i.w),as_type<float>(R126i.w)) + as_type<float>(PV1iz));
R127i.z = as_type<int>(mul_nonIEEE(as_type<float>(R10i.x),as_type<float>(PV1ix)) + as_type<float>(backupReg0i));
R127i.w = as_type<int>(mul_nonIEEE(as_type<float>(R10i.z),as_type<float>(PS1i)) + as_type<float>(R127i.w));
R4i.w = as_type<int>(mul_nonIEEE(as_type<float>(R8i.z), as_type<float>(backupReg1i)));
// 7
backupReg0i = R123i.y;
R123i.y = as_type<int>(mul_nonIEEE(as_type<float>(R10i.y),as_type<float>(R125i.w)) + as_type<float>(R123i.x));
PV1iw = as_type<int>(mul_nonIEEE(as_type<float>(R126i.y), as_type<float>(R3i.y)));
tempResultf = 1.0 / sqrt(as_type<float>(backupReg0i));
PS1i = as_type<int>(tempResultf);
// 8
R1i.x = as_type<int>(mul_nonIEEE(as_type<float>(R7i.w),as_type<float>(PV1iw)) + as_type<float>(R127i.z));
R8i.y = as_type<int>(mul_nonIEEE(as_type<float>(R8i.y),as_type<float>(PV1iw)) + as_type<float>(R127i.w));
R5i.z = as_type<int>(mul_nonIEEE(as_type<float>(R5i.z),as_type<float>(PV1iw)) + as_type<float>(R123i.y));
PV0iw = as_type<int>(mul_nonIEEE(as_type<float>(R127i.y), as_type<float>(PS1i)));
// 9
PV1iz = as_type<int>(mul_nonIEEE(as_type<float>(supportBuffer.remapped[2].z), as_type<float>(PV0iw)));
// 10
PV0iy = as_type<int>(as_type<float>(PV1iz) * as_type<float>(0x3ced9168));
PV0iy = clampFI32(PV0iy);
// 11
R123i.y = as_type<int>(mul_nonIEEE(as_type<float>(PV0iy),as_type<float>(R6i.z)) + 1.0);
// 12
R10i.x = as_type<int>(mul_nonIEEE(-(as_type<float>(R3i.w)),as_type<float>(R123i.y)) + as_type<float>(R123i.y));
// 0
R123i.x = as_type<int>(mul_nonIEEE(as_type<float>(supportBuffer.remapped[8].x),as_type<float>(R8i.w)) + as_type<float>(R0i.x));
R123i.z = as_type<int>(mul_nonIEEE(as_type<float>(supportBuffer.remapped[8].z),as_type<float>(R8i.w)) + as_type<float>(R0i.z));
R123i.w = as_type<int>(mul_nonIEEE(as_type<float>(supportBuffer.remapped[8].y),as_type<float>(R8i.w)) + as_type<float>(R0i.y));
// 1
PV1iy = as_type<int>(mul_nonIEEE(as_type<float>(R123i.z), as_type<float>(R10i.x)));
PV1iz = as_type<int>(mul_nonIEEE(as_type<float>(R123i.w), as_type<float>(R10i.x)));
PV1iw = as_type<int>(mul_nonIEEE(as_type<float>(R123i.x), as_type<float>(R10i.x)));
// 2
PV0ix = as_type<int>(mul_nonIEEE(as_type<float>(PV1iz), as_type<float>(R0i.w)));
PV0iy = as_type<int>(mul_nonIEEE(as_type<float>(PV1iw), as_type<float>(R3i.z)));
PV0iw = as_type<int>(mul_nonIEEE(as_type<float>(PV1iy), as_type<float>(R6i.w)));
// 3
R123i.x = as_type<int>(as_type<float>(PV0iw) * as_type<float>(0x3f6e896b) + as_type<float>(0x3a011b1e));
R123i.y = as_type<int>(as_type<float>(PV0ix) * as_type<float>(0x3f6e896b) + as_type<float>(0x3a011b1e));
R123i.z = as_type<int>(as_type<float>(PV0iy) * as_type<float>(0x3f6e896b) + as_type<float>(0x3a011b1e));
// 4
PV0iy = as_type<int>(as_type<float>(R8i.y) + as_type<float>(R123i.x));
PV0iz = as_type<int>(as_type<float>(R5i.z) + as_type<float>(R123i.y));
PV0iw = as_type<int>(as_type<float>(R1i.x) + as_type<float>(R123i.z));
// 5
R4i.x = as_type<int>(mul_nonIEEE(as_type<float>(R13i.z),as_type<float>(PV0iw)) + as_type<float>(R11i.x));
R4i.y = as_type<int>(mul_nonIEEE(as_type<float>(R13i.z),as_type<float>(PV0iz)) + as_type<float>(R11i.y));
R4i.z = as_type<int>(mul_nonIEEE(as_type<float>(R13i.z),as_type<float>(PV0iy)) + as_type<float>(R11i.z));
// export
out.passPixelColor0 = as_type<float4>(float4(as_type<float>(R4i.x), as_type<float>(R4i.y), as_type<float>(R4i.z), as_type<float>(R4i.w)));
return out;
}

View File

@ -0,0 +1,69 @@
// shader cb0e6e8cbec4502a
#include <metal_stdlib>
using namespace metal;
#define SET_POSITION(_v) out.position = _v; out.position.z = (out.position.z + out.position.w) / 2.0
// start of shader inputs/outputs, predetermined by Cemu. Do not touch
struct SupportBuffer {
float2 fragCoordScale;
};
#define GET_FRAGCOORD() float4(in.position.xy * supportBuffer.fragCoordScale.xy, in.position.z, 1.0 / in.position.w)
struct FragmentIn {
float4 position [[position]];
float4 passParameterSem3 [[user(locn0)]];
};
struct FragmentOut {
float4 passPixelColor0 [[color(0)]];
};
// end of shader inputs/outputs
template<typename TextureT, typename CoordT>
float sampleCompareEmulate(TextureT tex, sampler samplr, CoordT coord, float compareValue) {
return compareValue < tex.sample(samplr, coord).x ? 1.0 : 0.0;
}
template<typename TextureT, typename CoordT>
float2 textureCalculateLod(TextureT tex, sampler samplr, CoordT coord) {
float lod = tex.calculate_unclamped_lod(samplr, coord);
return float2(floor(lod), fract(lod));
}
int clampFI32(int v)
{
if( v == 0x7FFFFFFF )
return as_type<int>(1.0);
else if( v == 0xFFFFFFFF )
return as_type<int>(0.0);
return as_type<int>(clamp(as_type<float>(v), 0.0, 1.0));
}
float mul_nonIEEE(float a, float b){ if( a == 0.0 || b == 0.0 ) return 0.0; return a*b; }
#define disableDOF $disableDOF
#if (disableDOF == 0) // Keep DOF Enabled
fragment FragmentOut main0(FragmentIn in [[stage_in]], float2 pointCoord [[point_coord]], bool frontFacing [[front_facing]], constant SupportBuffer& supportBuffer [[buffer(0)]], texture2d<float> tex0 [[texture(0)]], sampler samplr0 [[sampler(0)]]) {
int radius = int(rint(2.0 / supportBuffer.fragCoordScale.y));
float2 resolution = float2(tex0.get_width(), tex0.get_height());
float2 center = (in.passParameterSem3.xy + in.passParameterSem3.zw) / 2.0;
float3 result = float3(0.0);
float count = 0.0;
for (int x = 1 - radius; x <= radius - 1; x += 2) {
for (int y = 1 - radius; y <= radius - 1; y += 2) {
if (length(float2(x, y)) <= radius) {
result += tex0.sample(samplr0, center + float2(x, y) / resolution).xyz;
count += 1.0;
}
}
}
return {float4(result / count, 1.0)};
}
#elif (disableDOF == 1) // Disable DOF
fragment FragmentOut main0(FragmentIn in [[stage_in]], float2 pointCoord [[point_coord]], bool frontFacing [[front_facing]], constant SupportBuffer& supportBuffer [[buffer(0)]], texture2d<float> tex0 [[texture(0)]], sampler samplr0 [[sampler(0)]]) {
return {tex0.sample(samplr0, in.passParameterSem3)};
}
#endif

View File

@ -29,6 +29,10 @@ uniform vec4 uf_fragCoordScale;
uniform float uf_alphaTestRef;
uniform vec2 uf_fragCoordScale;
#endif
#define AAENABLE $AAEnable
TEXTURE_LAYOUT(0, 1, 0) uniform sampler2D textureUnitPS0;
layout(location = 0) in vec4 passParameterSem129;
layout(location = 1) in vec4 passParameterSem128;
@ -68,22 +72,34 @@ ivec4 ARi = ivec4(0);
bool predResult = true;
vec3 cubeMapSTM;
int cubeMapFaceId;
R0i = floatBitsToInt(passParameterSem129);
#if (AAENABLE == 1)
R0i = floatBitsToInt(passParameterSem129);
#endif
R1i = floatBitsToInt(passParameterSem128);
R5i.xyz = floatBitsToInt(texture(textureUnitPS0, intBitsToFloat(R1i.zw)).xyz);
R6i.xyz = floatBitsToInt(texture(textureUnitPS0, intBitsToFloat(R1i.xy)).xyz);
ivec2 resolution = textureSize(textureUnitPS0,0);
float iresX = float(resolution.x)/float(1280);
float iresY = float(resolution.y)/float(720);
#if (AAENABLE == 1)
ivec2 resolution = textureSize(textureUnitPS0,0);
float iresX = float(resolution.x)/float(1280);
float iresY = float(resolution.y)/float(720);
#endif
// 0
backupReg0i = R0i.y;
backupReg1i = R0i.x;
PV0i.x = 0;
PV0i.y = floatBitsToInt(intBitsToFloat(backupReg0i) / iresY);
#if (AAENABLE == 1)
PV0i.y = floatBitsToInt(intBitsToFloat(backupReg0i) / iresY);
#else
PV0i.y = floatBitsToInt(intBitsToFloat(backupReg0i) * 1.0);
#endif
PV0i.z = 0;
R127i.w = floatBitsToInt(intBitsToFloat(backupReg1i) / iresX);
#if (AAENABLE == 1)
R127i.w = floatBitsToInt(intBitsToFloat(backupReg1i) / iresX);
#else
R127i.w = floatBitsToInt(intBitsToFloat(backupReg1i) * 1.0);
#endif
PV0i.w = R127i.w;
R8i.w = 0x3f800000;
PS0i = R8i.w;

View File

@ -1,83 +1,90 @@
[Definition]
titleIds = 0005000010150300,0005000010152A00,0005000010152B00
name = Resolution
path = "Dr. Luigi/Graphics/Resolution"
description = Changes the resolution of the game. Anti-aliasing is disabled by default. Made by M&&M.
version = 4
name = Graphics Settings
path = "Dr. Luigi/Graphics"
description = Changes the resolution of the game and Enable/Disable the game's Anti-Aliasing.|Made by M&&M.
#Credits: M&&M
version = 6
[Preset]
name = 1280x720 (Default)
[Default]
$width = 1280
$height = 720
$gameWidth = 1280
$gameHeight = 720
$AAEnable:int = 1
# Performance
[Preset]
category = Resolution
name = 640x360
$width = 640
$height = 360
$gameWidth = 1280
$gameHeight = 720
[Preset]
category = Resolution
name = 960x540
$width = 960
$height = 540
$gameWidth = 1280
$gameHeight = 720
[Preset]
category = Resolution
name = 1280x720 (Default)
default = 1
# Common HD Resolutions
[Preset]
category = Resolution
name = 1600x900
$width = 1600
$height = 900
$gameWidth = 1280
$gameHeight = 720
[Preset]
category = Resolution
name = 1920x1080
$width = 1920
$height = 1080
$gameWidth = 1280
$gameHeight = 720
[Preset]
category = Resolution
name = 2560x1440
$width = 2560
$height = 1440
$gameWidth = 1280
$gameHeight = 720
[Preset]
category = Resolution
name = 3200x1800
$width = 3200
$height = 1800
$gameWidth = 1280
$gameHeight = 720
[Preset]
category = Resolution
name = 3840x2160
$width = 3840
$height = 2160
$gameWidth = 1280
$gameHeight = 720
[Preset]
category = Resolution
name = 5120x2880
$width = 5120
$height = 2880
$gameWidth = 1280
$gameHeight = 720
[Preset]
category = Resolution
name = 7680x4320
$width = 7680
$height = 4320
$gameWidth = 1280
$gameHeight = 720
[Preset]
category = Anti-Aliasing
name = Enable
$AAEnable:int = 1
[Preset]
category = Anti-Aliasing
name = Disable
$AAEnable:int = 0
[TextureRedefine]
width = 1280

View File

@ -3,6 +3,7 @@ titleIds = 000500001010ec00,000500001010ed00,000500001010eb00
name = Contrasty
path = "Mario Kart 8/Enhancements/Contrasty"
description = This pack tweaks the colors and contrast to whatever preset you set it as.|You can also make your own preset by editing the Default preset in the Contrasty folder from the game's graphic packs.|Made by getdls.
#Credits: getdls
version = 6
[Default]

View File

@ -3,6 +3,7 @@ titleIds = 000500001010ec00,000500001010ed00,000500001010eb00
name = Debanding
path = "Mario Kart 8/Enhancements/Debanding"
description = Adds a debanding post processing shader to the game.|This pack can only be used with OpenGL.|Made by getdls.
#Credits: getdls
version = 6
rendererFilter = opengl

View File

@ -3,6 +3,7 @@ titleIds = 000500001010ec00,000500001010ed00,000500001010eb00
name = Remove MKTV Watermark
path = "Mario Kart 8/Enhancements/Remove MKTV Watermark"
description = Removes the MKTV watermark in the replays or highlight reel.|Made by Crementif.
#Credits: Crementif
version = 6
[TextureRedefine]

View File

@ -3,6 +3,7 @@ titleIds = 000500001010ec00,000500001010ed00,000500001010eb00
name = Graphic Options
path = "Mario Kart 8/Graphics"
description = Allows you to change the game's TV resolution, gamepad resolution, shadow quality, anti-aliasing, bloom intensity, motion blur quality, level of detail and anisotropic filtering quality.|Made by Crementif, theboy181 and M&&M.
#Credits: Crementif, theboy181, M&&M
version = 6
[Default]

View File

@ -3,4 +3,5 @@ titleIds = 000500001010ec00,000500001010ed00,000500001010eb00
name = 60FPS for 3/4 Player Splitscreen
path = "Mario Kart 8/Mods/60FPS Splitscreen"
description = Forces the game to run at 60FPS instead of 30FPS in 3/4 player splitscreen.|In those splitscreen modes, it normally alternates which screen is being updated each frame. This mod forces it to draw all the screens every frame instead.|Made by theboy181 and Xalphenos.
#Credits: theboy181, Xalphenos
version = 6

View File

@ -3,4 +3,5 @@ titleIds = 000500001010ec00,000500001010ed00,000500001010eb00
name = Remove All HUD Elements
path = "Mario Kart 8/Mods/No HUD (breaks menus)"
description = Disables any HUD while racing.|Breaks many of the menu's so don't use this if you just want to play the game.||Made by Crementif.
#Credits: Crementif
version = 6

View File

@ -3,6 +3,7 @@ titleIds = 000500001010ec00,000500001010ed00,000500001010eb00
name = Multiplayer network port
path = "Mario Kart 8/Workarounds/Multiplayer network port"
description = Forces peer-to-peer multiplayer to use a certain network port number, so that you can port forward it in your router.||This might help with connecting to online services, or with some 118-XXXX errors.
#Credits: ashquarky
version = 6
[Default]

View File

@ -0,0 +1,17 @@
[SI_sigpatch_V16]
moduleMatches = 0x39E9EBC6 ; 1.1.0
0x02512D44 = li r3, 0
0x02512D48 = blr
[SI_sigpatch_V1]
moduleMatches = 0xC683642E ; 1.0.0
0x025121E8 = li r3, 0
0x025121EC = blr
[SI_sigpatch_demo]
moduleMatches = 0xAF023381 ; Demo
0x025101C4 = li r3, 0
0x025101C8 = blr

View File

@ -0,0 +1,6 @@
[Definition]
titleIds = 00050000101F4D00,00050000101FB100,0005000010205E00
name = Signature Patch
path = "Skylanders Imaginators/Mods/Signature Patch"
description = This patch removes the check for a factory's signature on dumps of characters released for Skylanders Imaginators, allowing for unique UIDs and unreleased characters to be generated.||Made by Winner Nombre with help from MusicDisc, MoltenLavaCore, and NefariousTechSupport.
version = 7

View File

@ -0,0 +1,9 @@
[SSF_RemovePortalCheck_V16]
moduleMatches = 0xa0b35374 ; v16
0x024B0A28 = li r3, 0x203
[SSF_RemovePortalCheck_V0]
moduleMatches = 0xb1f102ec ; v0
0x024B09A0 = li r3, 0x203

View File

@ -0,0 +1,6 @@
[Definition]
titleIds = 0005000010139200,0005000010140400
name = Allow Portals From Other Skylanders Games
path = "Skylanders Swap Force/Mods/Allow Portals From Other Skylanders Games"
description = Allows any (non-Xbox!) Portal of Power to be used.||Made by Winner Nombre.
version = 7

View File

@ -0,0 +1,151 @@
[dpad-jump_v288]
moduleMatches = 0x659C782E
Lp_Utl_getCurSceneId = 0x028C67EC
.origin = codecave
state:
.char 0
screen_x:
.short 1080 ; LEFT
.short 1080 ; UP
.short 1080 ; RIGHT
.short 1170 ; DOWN
screen_y:
.short 130 ; LEFT
.short 290 ; UP
.short 450 ; RIGHT
.short 625 ; DOWN
perform:
mflr r0 ; Push LR and important registers to the stack
stwu r1, -0x10(r1)
stw r31, 0xC(r1)
stw r30, 0x8(r1)
stw r29, 0x4(r1)
stw r0, 0x14(r1)
mr r31, r4
lis r30, state@hi
ori r30, r30, state@l
lbz r30, 0x0(r30)
bl import.vpad.VPADGetTPCalibratedPoint
mr r29, r3
bl Lp_Utl_getCurSceneId ; Check if this is being called during a match
cmpwi r3, 7
beq perform_touch
cmpwi r3, 12 ; Or Recon
bne perform_exit ; If not, then exit
perform_touch:
cmpwi r30, 0
beq perform_exit ; Exit if state is 0 (no DPAD pressed)
subi r30, r30, 1 ; state should be the array index + 1 (since 0 is reserved for no DPAD pressed)
mulli r30, r30, 2 ; Multiply by 2 for the screen arrays (.short)
lis r3, screen_x@hi
ori r3, r3, screen_x@l
lhzx r3, r3, r30
lis r4, screen_y@hi
ori r4, r4, screen_y@l
lhzx r4, r4, r30
; Perform a fake touch on the gamepad
sth r3, 0x0(r31) ; VPADTouchData.x
sth r4, 0x2(r31) ; VPADTouchData.y
li r3, 1
li r4, 0
sth r3, 0x4(r31) ; VPADTouchData.touched
sth r4, 0x6(r31) ; VPADTouchData.validity
perform_exit:
mr r3, r29 ; Return result from VPADGetTPCalibratedPoint
lwz r0, 0x14(r1) ; Restore registers from stack
mtlr r0
lwz r31, 0xC(r1)
lwz r30, 0x8(r1)
lwz r29, 0x4(r1)
addi r1, r1, 0x10
blr
check_input:
mflr r0 ; Push LR and important registers to the stack
stwu r1, -0x10(r1)
stw r31, 0xC(r1)
stw r30, 0x8(r1)
stw r0, 0x14(r1)
mr r31, r4
bl import.vpad.VPADRead
mr r30, r3
lwz r3, 0x0(r31) ; VPADStatus.hold
lis r4, 0x0000
ori r4, r4, 0x8000 ; VPAD_BUTTON_A
li r5, 0 ; Set to 0 to avoid removing input (happens at set_state)
and r6, r3, r4
cmpw r6, r4
bne check_input_reset
li r4, 0x0800 ; VPAD_BUTTON_LEFT
and r5, r3, r4
cmpwi r5, 0
li r4, 1
bne check_input_set_state
li r4, 0x0200 ; VPAD_BUTTON_UP
and r5, r3, r4
cmpwi r5, 0
li r4, 2
bne check_input_set_state
li r4, 0x0400 ; VPAD_BUTTON_RIGHT
and r5, r3, r4
cmpwi r5, 0
li r4, 3
bne check_input_set_state
li r4, 0x0100 ; VPAD_BUTTON_DOWN
and r5, r3, r4
cmpwi r5, 0
beq check_input_reset
li r4, 4
check_input_set_state:
bl Lp_Utl_getCurSceneId ; Check if this is being called during a match
cmpwi r3, 7
beq _check_input_set_state
cmpwi r3, 12 ; Or Recon
bne check_input_exit ; If not, then exit
_check_input_set_state:
lwz r3, 0x0(r31)
sub r5, r3, r5 ; Disable DPAD input to avoid sending unnecessary signals (very hacky, doesn't work too well)
stw r5, 0x0(r31)
lis r3, state@hi
ori r3, r3, state@l
stb r4, 0x0(r3)
check_input_exit:
mr r3, r30 ; Return result from VPADRead
lwz r0, 0x14(r1) ; Restore registers from stack
mtlr r0
lwz r31, 0xC(r1)
lwz r30, 0x8(r1)
addi r1, r1, 0x10
blr
check_input_reset:
li r4, 0
b check_input_set_state
0x28D0F30 = bl check_input ; VPADRead
0x286FD38 = bl perform ; VPADGetTPCalibratedPoint

View File

@ -0,0 +1,6 @@
[Definition]
titleIds = 0005000010176900,0005000010176A00,0005000010162B00
name = DPADJump
path = "Splatoon/Mods/Superjump With The DPAD"
description = Hold A + D-Pad in any direction to super jump to a teammate or the spawn point during a match or Recon, similar to SwapDRC patches.|Made by primaviera.
version = 7

View File

@ -0,0 +1,4 @@
[begone_autorotate]
moduleMatches = 0xF7A78809, 0x659c782e
0x02664f20 = nop

View File

@ -0,0 +1,6 @@
[Definition]
titleIds = 0005000010176900,0005000010176A00,0005000010162B00
name = Disable Autorotate
path = "Splatoon/Mods/Disable Autorotate"
description = Prevents the camera from automatically rotating when the player moves left or right.
version = 7

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = Anti-Aliasing Pack
path = "Xenoblade Chronicles X/Enhancements/Anti-Aliasing"
description = Allows you to modify the game's existing anti-aliasing solution or replace it with the universally supported Nvidia FXAA solution. This changes how the games gets rid of jagged edges to make sharp edges look better.||Made by SkalFate, modified by Intra.
#Credits: SkalFate, Intra
version = 6
[Default]
@ -276,5 +277,3 @@ $FXAADISCARD:int = 0
# Pure red and blue or combination of only R and B, will get no AA.
# 1 = On.
# 0 = Off.
# Credits: Made by SkalFate, updated by Intra

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = Contrasty
path = "Xenoblade Chronicles X/Enhancements/Contrasty"
description = This pack tweaks the colours and contrast to whatever preset you set it as. You can also make your own preset by editing the Default preset in the Contrasty folder from the game's graphic packs.|Not compatible with the Anti-Aliasing mod.|Made by getdls.
#Credits: getdls
version = 5
[Default]

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = Fancy GFX
path = "Xenoblade Chronicles X/Enhancements/Fancy FX"
description = Pretty blur, de-band sky, re-align cinematic etc, maintained on Nvidia. Made by getdls.
#Credits: getdls
version = 4
#Disabled, causes gfx errors on 1.15.x Enable if fixed.

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = Negative texture LOD bias
path = "Xenoblade Chronicles X/Enhancements/Negative Texture LOD"
description = Texture LOD override, possible shimmer but sharper textures.
#Credits: Crementif
version = 4
[Preset]

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = Anisotropic Filtering
path = "Xenoblade Chronicles X/Enhancements/Anisotropic Filtering"
description = Enables anisotropic filtering for ground, wall and vegetation textures to make them appear clearer when viewed from an angle.|Has a minimal performance impact.
#Credits: Crementif
version = 7
[Default]

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = Graphics
path = "Xenoblade Chronicles X/Graphics"
description = Changes the resolution of the game and the quality of the other elements.|Made by getdls and Lemon King.
#Credits: getdls, Lemon King
version = 6
[Default]

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = FPS++ For Xenoblade Chronicles X
path = "Xenoblade Chronicles X/Mods/FPS++ For XCX"
description = Allows you to change the FPS and the speed that most things run at.|Some bugs might still occur if you run games at 60FPS.|Only supports the latest update!
#Credits: Crementif, M&&M, lasyan3
version = 6
[Default]

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "Ground damage multiplicator"
path = "Xenoblade Chronicles X/Mods/Battle/Ground damage multiplicator"
description = Increase the damage done by your team. Doesn't affect the damage numbers that are shown.|Can also make the game more challenging by dividing damage.
#Credits: lasyan3, lashoun, Crementif, Intra
version = 7
[Default]

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "Enemy Statistics modificator"
path = "Xenoblade Chronicles X/Mods/Battle/Enemy Statistics modificator"
description = Apply a percent modificator on enemies stats (HP, Melee Attack, Melee Accuracy, Ranged Attack, Ranged Accuracy, Potential and Evasion).|You can consult the new values in the Bestiary menu.
#Credits: lasyan3
version = 6
[Default]

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "Enemy de-aggro range reducer"
path = "Xenoblade Chronicles X/Mods/Battle/Enemy de-aggro"
description = Decrease or increase the distance needed to run to lose aggro from enemies.
#Credits: lasyan3
version = 6
[Default]

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "Overdrive unlocked pre-Chapter 5"
path = "Xenoblade Chronicles X/Mods/Battle/Overdrive unlocked"
description = Unleash the power of Overdrive before Chapter 5 or relock it after Chapter 5.
#Credits: lasyan3
version = 6
[Default]

View File

@ -3,4 +3,5 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "Soul Challenges - Skell auto restore"
path = "Xenoblade Chronicles X/Mods/Battle/Soul Challenges - Skell auto restore"
description = When your Skell is destroyed and the insurance is still valid, the Skell is automatically restored (use fast travel or die to get it back).
#Credits: lasyan3
version = 6

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "Soul Challenges - QTE Auto"
path = "Xenoblade Chronicles X/Mods/Battle/Soul Challenges - QTE Auto"
description = QTE during battles are automatically done (force result).|Does not work on skell destroyed soul voice.
#Credits: lasyan3
version = 6
[Default]

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "Soul Challenges - QTE Speed"
path = "Xenoblade Chronicles X/Mods/Battle/Soul Challenges - QTE Speed"
description = Speed of QTE does not increase or decrease during battles.
#Credits: lasyan3
version = 6
[Default]

View File

@ -0,0 +1,16 @@
[XCX_SkellFlight_v101E_v102U]
moduleMatches = 0xF882D5CF, 0x30B6E091, 0x218F6E07 ; 1.0.1E, 1.0.2U, 1.0.0E
; GetSkyUnit__Q2_3cfs19CfCompoPropertyDollCFv
0x025CE8DC = li r3, $mod
[XCX_SkellFlight_v102J]
moduleMatches = 0x7672271D ; 1.0.2J
0x025CDEB8 = li r3, $mod
[XCX_SkellFlight_v100U]
moduleMatches = 0xAB97DE6B, 0x676EB33E ; 1.0.1U, 1.0.0U
0x025CE86C = li r3, $mod
[XCX_SkellFlight_v100J]
moduleMatches = 0x785CA8A9 ; 1.0.0J
0x025CD3DC = li r3, $mod

View File

@ -0,0 +1,17 @@
[Definition]
titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "Enable/Disable Skell Flight"
path = "Xenoblade Chronicles X/Mods/Battle/Skell Flight Unlocked"
description = Fly with your Skell before A Girl's Wings, or Disable the flight module after A Girl's Wings.
#Credits: Intra
version = 6
[Default]
$mod = 1
[Preset]
name = Force Enable
[Preset]
name = Force Disable
$mod = 0

View File

@ -0,0 +1,15 @@
[XCX_InfiniteFuel_v101E_v102U]
moduleMatches = 0xF882D5CF, 0x30B6E091, 0x218F6E07 ; 1.0.1E, 1.0.2U, 1.0.0E
0x025CE7C8 = lfs f1, 0x3184(r3)
[XCX_InfiniteFuel_v102J]
moduleMatches = 0x7672271D ; 1.0.2J
0x025CDDA4 = lfs f1, 0x3184(r3)
[XCX_InfiniteFuel_v100U]
moduleMatches = 0xAB97DE6B, 0x676EB33E ; 1.0.1U, 1.0.0U
0x025CE758 = lfs f1, 0x3184(r3)
[XCX_InfiniteFuel_v100J]
moduleMatches = 0x785CA8A9 ; 1.0.0J
0x025CD2C8 = lfs f1, 0x3184(r3)

View File

@ -0,0 +1,7 @@
[Definition]
titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "Infinite Fuel"
path = "Xenoblade Chronicles X/Mods/Battle/Infinite Fuel"
description = Makes your skell fuel always be at its max.
#Credits: Intra
version = 6

View File

@ -0,0 +1,110 @@
[XCX_BootWithTP_Data]
moduleMatches = 0xF882D5CF, 0x30B6E091, 0x7672271D, 0x218F6E07, 0xAB97DE6B, 0x676EB33E, 0x785CA8A9 ; 1.0.1E, 1.0.2U, 1.0.2J, 1.0.0E, 1.0.1U, 1.0.0U, 1.0.0J
.origin = codecave
;adress offsets for all the various stats a character has
currentHP = 0x84
currentTP = 0x94
maxHP = 0x88
maxTP = 0x98
meleeAttack = 0x9C
rangedAttack = 0xA0
potential = 0xA4
defence = 0xA8
meleeAccuracy = 0xAC
rangedAccuracy = 0xB0
evasion = 0xB4
physicalRes = 0xBC
beamRes = 0xC0
etherRes = 0xC4
thermalRes = 0xC8
electricRes = 0xCC
gravityRes = 0xD0
;array of flags that check if applied max tp on boot to a specific character/skell
BoolBootWithTP:
.byte $QoL-1, $QoL-1, $QoL-1, $QoL-1, $QoLSkell-1, $QoLSkell-1, $QoLSkell-1, $QoLSkell-1
;keeps track if entered a function from ground or skell so that code that only applies to one can be conditionally executed
BoolIsInnerOrDoll:
.uint 0
;prevents a bug of delayed character getting max tp after boot
;if a character position is not in your party at boot and then you add a character to that position
;its flag was never set and so that character then gets the mod applied to them way later than expected.
;with this fix it is still possible to trigure it by starting with exactly 1 character in your party and then recruiting a character within 1 skip travel
;the bug can also happen by seeing a loading screen over 2 billion times to loop to negative (end even then won't apply to positions that its already applies before)
;that is such specific circumstances with such a minor bug that I don't care to fix it further
;the proper way to fix this would be to find a section of code that runs after ground boot and skell boot, does not need skell boot to happen to run, and does not get called in any other section of the game.
;then uses that spot set the flags above and nothing else. currently not worth it for such a minor bug
NumOfTimesLoadingScreenRan:
.uint 0
;array of cheat settings for ground
InnerCheatSettingsArray:
.short $TPCheat, $HPCheat, $noHPcheatnodieifdamagelt, $TPupdatecheatdieat0TP, $TPupdatecheatnegative, $HPupdatecheatnegative
;array of cheat settings for skell
DollCheatSettingsArray:
.short $TPCheatSkell, $HPCheatSkell, $noHPcheatnodieifdamageltSkell, $TPupdatecheatdieat0TPSkell, $TPupdatecheatnegativeSkell, $HPupdatecheatnegativeSkell
;array of syncronous settings for ground
InnerSyncSettingsArray:
.byte $HPboundtoTP, $HPboundtoTPNegative, $TPboundtoHP, $TPboundtoHPNegative
;array of syncronous settings for skell
DollSyncSettingsArray:
.byte $HPboundtoTPSkell, $HPboundtoTPNegativeSkell, $TPboundtoHPSkell, $TPboundtoHPNegativeSkell
;array of after battle heal settings for ground
InnerSlipHealSettingsArray:
.byte $afterbattleheal, $afterbattlerestoretp, $skiptravelheal
;array of after battle heal settings for ground
DollSlipHealSettingsArray:
.byte $afterbattleheal, $afterbattlerestoretp, $skiptravelhealSkell
;storage space for current hp for each character
StoreCurrentHP:
.uint 0, 0, 0, 0
;storage space for current hp for each skell
StoreCurrentHPDoll:
.uint 0, 0, 0, 0
;array of pointers to the storage space for characters stats
;below that, the stprage space for each characters stats
StoreCharacterStatsPointers:
.uint StoreCharacter0Stats, StoreCharacter1Stats, StoreCharacter2Stats, StoreCharacter3Stats
StoreCharacter0Stats:
.uint 0, 0, 0, 0, 0, 0, 0, 0
StoreCharacter1Stats:
.uint 0, 0, 0, 0, 0, 0, 0, 0
StoreCharacter2Stats:
.uint 0, 0, 0, 0, 0, 0, 0, 0
StoreCharacter3Stats:
.uint 0, 0, 0, 0, 0, 0, 0, 0
;array of pointers to the storage space for skells stats
;below that, the stprage space for each skells stats
StoreCharacterStatsDollPointers:
.uint StoreCharacter0StatsDoll, StoreCharacter1StatsDoll, StoreCharacter2StatsDoll, StoreCharacter3StatsDoll
StoreCharacter0StatsDoll:
.uint 0, 0, 0, 0, 0, 0, 0, 0
StoreCharacter1StatsDoll:
.uint 0, 0, 0, 0, 0, 0, 0, 0
StoreCharacter2StatsDoll:
.uint 0, 0, 0, 0, 0, 0, 0, 0
StoreCharacter3StatsDoll:
.uint 0, 0, 0, 0, 0, 0, 0, 0
;array of offsets for each of the stats. used to lower code duplication
PointerStatsOffsets:
.short maxHP, meleeAttack, rangedAttack, potential, defence, meleeAccuracy, rangedAccuracy, evasion
;multiple function pointers arrays used to make the checksetting function usable for all setting types from all sections:
FunctionPointerArrayCheatBoot:
.uint NoTensionCheat, InfiniteTensionCheat, TensionEqualsHealthCheat, HPTPMod_blr, NoHealthCheat, InfiniteHealthCheat, HealthEqualsTensionCheat, HPTPMod_blr
FunctionPointerArrayCheatTP:
.uint NoTensionCheat, InfiniteTensionCheat, TensionEqualsHealthCheat, TensionUpdatesFromHealthCheatTP, NoHealthCheat, InfiniteHealthCheat, HealthEqualsTensionCheatTP, HealthUpdatesFromTensionCheatTP
FunctionPointerArrayCheatHP:
.uint NoTensionCheat, InfiniteTensionCheat, TensionEqualsHealthCheat, TensionUpdatesFromHealthCheatHP, NoHealthCheatHP, InfiniteHealthCheat, HealthEqualsTensionCheat, HealthUpdatesFromTensionCheatHP
FunctionPointerArraySync:
.uint addTPHPSynchronous, addTPHPAsynchronous, addTPHPDecreaseOnly, addTPHPIncreaseOnly
;lookup table for all the settings above if applying to ground characters
LookupTableforInner:
.uint InnerCheatSettingsArray, InnerSyncSettingsArray, InnerSlipHealSettingsArray, BoolBootWithTP, StoreCurrentHP, StoreCharacterStatsPointers
;lookup table for all the settings above if applying to skells
LookupTableforDoll:
.uint DollCheatSettingsArray, DollSyncSettingsArray, DollSlipHealSettingsArray, BoolBootWithTP+4, StoreCurrentHPDoll, StoreCharacterStatsDollPointers
;only piece of data used in the tphp_features file
;is used to tell the update hp function of the mod if the current heal is an out of battle heal
CurrentSlipHealPosition:
.uint 0

View File

@ -0,0 +1,71 @@
[XCX_BootWithTP_Features]
moduleMatches = 0xF882D5CF, 0x30B6E091, 0x7672271D, 0x218F6E07, 0xAB97DE6B, 0x676EB33E, 0x785CA8A9 ; 1.0.1E, 1.0.2U, 1.0.2J, 1.0.0E, 1.0.1U, 1.0.0U, 1.0.0J
.origin = codecave
;currently missing features:
;a way to ignore max hp / max tp
;a way to fix your character health being shown on screen after battle if continously below its max
;a way to detect if the slip heal function is currently appling to a human or skell
;This function is the exact same as 0x021D50F4 = nop
;the extra code is needed to make the cheat only apply when the apropriate option is selected in the rules.txt
;prevents skells from losing 50 GP/sec while out of them
StopSkellLosingGP:
li r4, $disableSkellLosingGP
cmpwi r4, 0
beq _StopSkellLosingGPExit
mflr r4
addi r4, r4, 8
mtlr r4
blr
_StopSkellLosingGPExit:
lwz r3, 0x24(r30)
blr
;no healing is the exact same as 0x021764F4 = blr
;prevents RegistDamage::HealHide::DamageSystem::HandleKey from ever being called
;the extra code is needed to make the dont update TP option work
;stops out of battle heals, and can also stop TP udating from out of battle heals in the sync settings
DontUpdateHP:
li r11, $afterbattleheal
cmpwi r11, 0
bne _DontUpdateHPExit
mtlr r0
blr
_DontUpdateHPExit:
li r11, $afterbattlerestoretp
cmpwi r11, 0
bne _SkipDontUpdateTPslip
lis r9, CurrentSlipHealPosition@ha
lwz r11, CurrentSlipHealPosition@l(r9)
addi r11, r11, 1
cmpwi r11, 8
blt+ _CheckIFCountTooHigh
li r11, 0
_CheckIFCountTooHigh:
stw r11, CurrentSlipHealPosition@l(r9)
_SkipDontUpdateTPslip:
or r11, r1, r1
blr
[XCX_BootWithTP_Features_v101E_v102U]
moduleMatches = 0xF882D5CF, 0x30B6E091, 0x218F6E07 ; 1.0.1E, 1.0.2U, 1.0.0E
;prevents skells from losing 50 GP/sec while out of them
0x021D50EC = bla StopSkellLosingGP
;stops out of battle heals
0x021764F8 = bla DontUpdateHP
[XCX_BootWithTP_Features_v102J]
moduleMatches = 0x7672271D ; 1.0.2J
0x021D4BB8 = bla StopSkellLosingGP
0x02175FC4 = bla DontUpdateHP
[XCX_BootWithTP_Features_v100U]
moduleMatches = 0xAB97DE6B, 0x676EB33E ; 1.0.1U, 1.0.0U
0x021D50EC = bla StopSkellLosingGP
0x021764F8 = bla DontUpdateHP
[XCX_BootWithTP_Features_v100J]
moduleMatches = 0x785CA8A9 ; 1.0.0J
0x021D4934 = bla StopSkellLosingGP
0x02175D40 = bla DontUpdateHP

View File

@ -0,0 +1,642 @@
[XCX_BootWithTP_Sync]
moduleMatches = 0xF882D5CF, 0x30B6E091, 0x7672271D, 0x218F6E07, 0xAB97DE6B, 0x676EB33E, 0x785CA8A9 ; 1.0.1E, 1.0.2U, 1.0.2J, 1.0.0E, 1.0.1U, 1.0.0U, 1.0.0J
.origin = codecave
;currently missing features:
;being able to negatively correlate hp by its self or tp by its self
;finishing the currently unfinished tp only updates from hp (or vice versa)
;make hp gained from reving party members apply to sync settings
;inspired from a glitch that happened with "Weird: tp equal hp" in a in-dev version of the mod:
;setting your tp to only equal the last ammount of hp gained, with it reseting to 0 when taking damage (also a seperate option to make using tp also set it to 0)
;setting your hp to the last ammount of tp gained, but still allowing you to take damage from enemies
;list of know bugs:
;the current hp is bound the position in the character list
;so with the no heal on skip travel if you swap party members, the new party member will have the current hp of the party member who used to be in that slot (minor bug)
;if a characters base stats were to update without calling the boot section of the mod it would break the don't heal when skip traveling setting
;I do not think this bug is possible to happen but listing it hear incase it does (currently not a bug but has potential to be a major bug)
;when a party member is revived, their HP is updated from a seperate section of code
;so their TP won't match in the sync settings until the next update to hp or tp (minor bug)
;the one described in detail in tphp_data, that the NumOfTimesLoadingScreenRan variable mostly fixes (minor bug)
;weird: tp equals hp, will have a visual glitch when hitting max tp. this happens because the tp update section is called before the game updates tp (major bug for the setting) (but setting is really low priority)
;various other bugs related to weird: tp/hp equals hp/tp (major bug for the setting) (but setting is really low priority)
;storage space to conditionally back up registers r3-r31
RegistersBackUpTPHP:
.uint 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31
;storeage space to back up link register
LinkRegisterBackUpTPHP:
.uint 0
CountRegisterBackupTPHP:
.uint 0
;function that allows us to conditionally branch link return
HPTPMod_blr:
blr
;function that has different entance points if your on ground or in a skell
;loads data from the tphp_data file that the mod needs to work
GetModDataInnerHPTP:
lis r31, RegistersBackUpTPHP@ha
stmw r14, RegistersBackUpTPHP@l(r31)
li r23, 0
lis r31, BoolIsInnerOrDoll@ha
stw r23, BoolIsInnerOrDoll@l(r31)
lis r31, LookupTableforInner@ha
addi r31, r31, LookupTableforInner@l-4
b GetModDataHPTP
GetModDataDollHPTP:
lis r31, RegistersBackUpTPHP@ha
stmw r14, RegistersBackUpTPHP@l(r31)
li r23, 1
lis r31, BoolIsInnerOrDoll@ha
stw r23, BoolIsInnerOrDoll@l(r31)
lis r31, LookupTableforDoll@hi
addi r31, r31, LookupTableforDoll@l-4
GetModDataHPTP:
lwzu r23, 4(r31) ; CheatSettingsArray
lwzu r24, 4(r31) ; SyncSettingsArray
lwzu r25, 4(r31) ; SlipHealSettingsArray
lwzu r27, 4(r31) ; BoolBootWithTP
lwzu r28, 4(r31) ; StoreCurrentHP
lwzu r29, 4(r31) ; StoreCharacterStatsPointers
blr
;function with multiple entrance points depeding of if applying a TP cheat, HP cheat, binding TP, or binding HP
;does some setup work at the entrance then if a cheat/setting is enabled, branches to the appropriate function from the function lookup table in tphp_data
CheckSyncSettingHP:
li r3, 0
mflr r0
bl HPStopSlipHealTP
mtlr r0
lbzu r31, 2(r24) ; $TPboundtoHP
li r19, currentHP
li r18, currentTP
b _LoadSyncFunctionPointers
CheckSyncSettingTP:
lwz r3, currentHP(r10)
cmpwi r3, 0
ble HPTPMod_blr
li r3, 0
lbz r31, 0(r24) ; $HPboundtoTP
addi r23, r23, 2
li r19, currentTP
li r18, currentHP
_LoadSyncFunctionPointers:
lis r30, FunctionPointerArraySync@hi
ori r30, r30, FunctionPointerArraySync@l
b CheckSettingsTPHP
CheckHealthCheat:
li r3, 4*4
lhz r31, 1*2(r23) ; $CheatHP
b CheckSettingsTPHP
CheckTensionCheat:
li r3, 0
lhz r31, 0*2(r23) ; $CheatTP
CheckSettingsTPHP:
cmpwi r31, 1
beq BranchToFoundCheat
addi r3, r3, 4
cmpwi r31, 2
beq BranchToFoundCheat
addi r3, r3, 4
cmpwi r31, 3
beq BranchToFoundCheat
addi r3, r3, 4
cmpwi r31, 4
beq BranchToFoundCheat
blr
BranchToFoundCheat:
lwzx r3, r30, r3
mtctr r3
bctr
;list of simple functions that get called from HP cheat and TP cheat settings.
NoTensionCheat:
li r31, 0
stw r31, currentTP(r10)
blr
TensionEqualsHealthCheat:
lwz r31, currentHP(r10)
stw r31, currentTP(r10)
blr
InfiniteTensionCheat:
lwz r31, maxTP(r10)
stw r31, currentTP(r10)
blr
NoHealthCheat:
li r31, 2
stw r31, currentHP(r10)
blr
HealthEqualsTensionCheat:
lwz r31, currentTP(r10)
stw r31, currentHP(r10)
blr
InfiniteHealthCheat:
lwz r31, maxHP(r10)
stw r31, currentHP(r10)
blr
;some of the functions above need to be a little bit different if calling them when HP updates or TP updates
HealthEqualsTensionCheatTP:
lwz r31, currentTP(r10)
add r31, r31, r21
stw r31, currentHP(r10)
blr
NoHealthCheatHP:
li r31, 2
stw r31, currentHP(r10)
lhz r12, 2*2(r23)
cmpw r21, r12
bge HPTPMod_blr
li r31, 0
stw r31, currentHP(r10)
blr
;unfinished and currently have their settings commented out in rules.txt
TensionUpdatesFromHealthCheatTP:
lhz r3, 1*2(r23) ; $HPCheat
cmpwi r31, 3
blr; _addTPtoHPEXit
HealthUpdatesFromTensionCheatTP:
lwz r31, 0x84(r10)
add r31, r31, r21
stw r31, 0x84(r10)
blr; _addTPtoHPEXit
TensionUpdatesFromHealthCheatHP:
blr; _addHPtoTPAsynchronous
HealthUpdatesFromTensionCheatHP:
lwz r12, 0x84(r10)
add r12, r12, r21
stw r12, 0x84(r10)
blr
;the function that synchronously binds HP & TP. is shared with HP updating and TP updating, but Boot has its own sperate sync function
addTPHPSynchronous:
addi r18, r18, 4
lwz r31, maxTP(r10)
lwz r12, maxHP(r10)
cmpw r12, r31
bgt _MaxTPSmallerintp
b _MaxHPSmallerintp
_MaxTPSmallerintp:
lwz r12, maxTP(r10)
_MaxHPSmallerintp:
lwzx r31, r10, r19
add r31, r31, r21
mflr r0
bl addTPHPComparetoMax
mtlr r0
lwzx r12, r10, r18
stwx r12, r10, r19
blr
;function that asynchronously binds HP & TP. has multiple entrance points if inclease only or decrease only are applied.
;shade with HP updating and TP updating. boot never calls async
addTPHPIncreaseOnly:
cmpwi r21, 0
blt HPTPMod_blr
b addTPHPAsynchronous
addTPHPDecreaseOnly:
cmpwi r21, 0
bgt HPTPMod_blr
addTPHPAsynchronous:
lhz r31, 0(r23) ; $CheatHP
cmpwi r31, 0
bne HPTPMod_blr
lbz r31, 1(r24) ; $HPboundtoTPNegative
cmpwi r31, 0
bne _addTPHPAsynchronousNegative
lwzx r31, r10, r18
add r31, r31, r21
addi r18, r18, 4
lwzx r12, r10, r18
b addTPHPComparetoMax
_addTPHPAsynchronousNegative:
lwzx r31, r10, r18
sub r31, r31, r21
addi r18, r18, 4
lwzx r12, r10, r18
b addTPHPComparetoMax
;function that gets called after async & sync settings. prevents us from having more HP/TP than out maximum
;CheckifTPNegative only gets called when HP updates. prevents negative TP as negative TP is glitchy.
;handling negative HP is not only unesisary but undesired as that is how the game checks for death
addTPHPComparetoMax:
addi r18, r18, -4
cmpw r12, r31
blt _hitMaximumHPTP
stwx r31, r10, r18
blr
_hitMaximumHPTP:
stwx r12, r10, r18
blr
CheckifTPNegative:
lbz r30, 0(r24) ; $TPboundtoHP
cmpwi r30, 0
beq HPTPMod_blr
cmpwi r31, 0
blt _hitMinimumTP
;stw r31, currentTP(r10)
blr
_hitMinimumTP:
li r12, 0
stw r12, currentTP(r10)
blr
;function that only gets called during the "boot" section of the mod.
;actually gets called every loading screen, every time a party member is added or removed, everytime your gear updates, etc.
;this backs up all of the characters permanent stats so that the hp update and tp update section of the mods can identify which character is being modified and update the apropriate hp backup int tphp_data
;boot is able to identify the characters because r26 broadcast which character is currently being modified
backUpCharacterStats:
li r31, 8
mtctr r31
mulli r31, r26, 4
lwzx r29, r29, r31
addi r29, r29, -4
lis r3, PointerStatsOffsets@ha
addi r3, r3, PointerStatsOffsets@l-2
_forloopbackUpCharacterStats:
lhzu r30, 2(r3)
lwzx r31, r10, r30
stwu r31, 4(r29)
bdnz _forloopbackUpCharacterStats
blr
;function only gets called during hp update and tp update
;it loops and checks for which character is currently being modified and updates their dedicated hp storage
;the hp storage is used for the "dont heal when skip traveling option"
;identifying a character by all their stats is pretty innefficient but couldn't find a better solution and this works
checkWhichCharacter:
addic. r20, r20, -1
blt DidNotFindCharacter
li r31, 8
mtctr r31
lis r3, PointerStatsOffsets@ha
addi r3, r3, PointerStatsOffsets@l-2
addi r26, r26, 4
lwzx r31, r29, r26
addi r31, r31, -4
_forloopCompareCharacterStats:
lhzu r30, 2(r3)
lwzx r22, r10, r30
lwzu r19, 4(r31)
cmpw r19, r22
bne checkWhichCharacter
bdnz _forloopCompareCharacterStats
lwz r22, 0x84(r10)
blr
;prep for the checkWhichCharacter function and exception exit if didn't find character
DidNotFindCharacter:
mtlr r0
blr
StoreCharacterHealth:
mflr r0
li r20, 4
li r26, -4
bl checkWhichCharacter
stwx r22, r28, r26
mtlr r0
blr
;####################################################################################################################
;####################################################################################################################
;####################################################################################################################
;only gets called in boot section.
;checks if to max tp every loading screen, if not checks if to max tp on boot
;there is a sequence of 1 byte flags for each character and their skell in hptp_data
;checks if the flag for the current character is set and if so does not apply the mod
;if the flag is not set this means that the function was never run before, which the first time it runs is when booting the game
;so max our tp and then set the flag so the mod doesn't max tp again
CheckifToMaxTP_Boot:
add r31, r27, r26
cmpwi r3, 0
bne _applymaxTP
cmpwi r30, 4
bgt HPTPMod_blr
lbz r3, 0(r31)
cmpwi r3, 0
bne HPTPMod_blr
_applymaxTP:
lwz r3, maxTP(r10)
stw r3, currentTP(r10)
li r3, 1
stb r3, 0(r31)
blr
;checks if the "no skip travel after heal setting is set.
;if so replaces our HP with the stored HP from the StoreCharacterHealth functions
;mod can easily identify which character to apply to by the value in r26
CheckNoHealAfterSkipTravel:
lbz r3, 2(r25) ; $skiptravelheal
cmpwi r3, 0
bne HPTPMod_blr
mulli r31, r26, 4
add r28, r28, r31
lwz r31, 0(r28)
cmpwi r31, 0
ble HPTPMod_blr
stw r31, currentHP(r10)
lbz r3, 0(r24) ; $synchronous
cmpwi r3, 1
beq _NoHealAfterSkipTravelWithSync
blr
_NoHealAfterSkipTravelWithSync:
mflr r30
addi r30, r30, 4
mtlr r30
stw r31, currentTP(r10)
blr
;specialized sync function for the boot section of the mod
CheckBootSynchronous:
lbz r3, 0(r24) ; $synchronous
cmpwi r3, 1
bne HPTPMod_blr
lwz r3, maxTP(r10)
lwz r31, maxHP(r10)
cmpw r31, r3
bgt _MaxTPSmallerbootsync
b _MaxHPSmallerbootsync
_MaxTPSmallerbootsync:
lwz r31, maxTP(r10)
_MaxHPSmallerbootsync:
stw r31, currentTP(r10)
stw r31, currentHP(r10)
blr
;free registers = r3 r23-r31 r0
;r26 = current character (0-3)
;r10 = pointer to character battle data
;main function of the boot section. multiple entrance depeding for ground characters and skells
;does entrance set up, calls the necissary functions, and the fixes everything at exit
BootWithTPInner:
mflr r0
;lis r31, LinkRegisterBackUpTPHP@ha
;stw r0, LinkRegisterBackUpTPHP@l(r31)
bl GetModDataInnerHPTP
lis r31, NumOfTimesLoadingScreenRan@ha
lwz r30, NumOfTimesLoadingScreenRan@l(r31)
addi r30, r30, 1
stw r30, NumOfTimesLoadingScreenRan@l(r31)
li r3, $everyloadingscreen
b BootWithTP
BootWithTPDoll:
mflr r0
;lis r31, LinkRegisterBackUpTPHP@ha
;stw r0, LinkRegisterBackUpTPHP@l(r31)
bl GetModDataDollHPTP
lis r31, NumOfTimesLoadingScreenRan@ha
lwz r30, NumOfTimesLoadingScreenRan@l(r31)
li r3, $everyloadingscreenSkell
BootWithTP:
bl CheckifToMaxTP_Boot
mfctr r31
lis r30, CountRegisterBackupTPHP@ha
stw r31, CountRegisterBackupTPHP@l(r30)
lis r30, FunctionPointerArrayCheatBoot@hi
ori r30, r30, FunctionPointerArrayCheatBoot@l
bl CheckTensionCheat
bl CheckHealthCheat
bl CheckNoHealAfterSkipTravel
bl CheckBootSynchronous
bl backUpCharacterStats
BootWithTPExit:
;lis r31, RegistersBackUpTPHP@ha
;lmw r14, RegistersBackUpTPHP@l(r31)
;lis r31, LinkRegisterBackUpTPHP@ha
;lwz r0, LinkRegisterBackUpTPHP@l(r31)
mtlr r0
lis r31, CountRegisterBackupTPHP@ha
lwz r30, CountRegisterBackupTPHP@l(r31)
mtctr r30
li r3, 1
blr
;####################################################################################################################
;####################################################################################################################
;####################################################################################################################
;this function only needs to exist because tp update is called before tp is applied
;and hp update is called after hp is applied
CheckifSyncNegTP:
lbz r31, 0(r24)
cmpwi r31, 1
bne HPTPMod_blr
lbz r31, 1(r24)
cmpwi r31, 0
beq HPTPMod_blr
neg r21, r21
blr
;this function only needs to exist because tp update is called before tp is applied
;prevents the game from updating TP because we just updated it ourselves
FixGameChangingTPWeChanged:
li r21, 0
blr
CheckifModifiedTP:
lhz r31, -2(r23) ; $CheatTP
cmpwi r31, 0
bne FixGameChangingTPWeChanged
lbz r31, 0(r24) ; $sync
cmpwi r31, 1
beq FixGameChangingTPWeChanged
blr
;is called before the game adds your TP
;free registers = r5, r31, r12, r0
;character battle data = the pointer that is pointed to by (r4 + 0x1d0)+0x1a0
;we then move that pointer into r10 so we can share code with boot & hp
;r27 holds the amount of TP that will be added, mod moves it into r21 to share code with hp
;main function of the tp update section. multiple entrance depeding for ground characters and skells
;does entrance set up, calls the necissary functions, and the fixes everything at exit
addTPtoHPInner:
lwz r5, 0(r4)
mflr r0
lis r31, LinkRegisterBackUpTPHP@ha
stw r0, LinkRegisterBackUpTPHP@l(r31)
or r12, r27, r27
bl GetModDataInnerHPTP
b addTPtoHP
addTPtoHPDoll:
lwz r5, 0(r6)
mflr r0
lis r31, LinkRegisterBackUpTPHP@ha
stw r0, LinkRegisterBackUpTPHP@l(r31)
or r12, r27, r27
bl GetModDataDollHPTP
addTPtoHP:
or r21, r12, r12
lis r30, FunctionPointerArrayCheatTP@hi
ori r30, r30, FunctionPointerArrayCheatTP@l
lwz r5, 0x1d0(r5)
addi r10, r5, 0x1a0
bl CheckTensionCheat
bl CheckHealthCheat
bl CheckifSyncNegTP
bl CheckSyncSettingTP
bl CheckifModifiedTP
bl StoreCharacterHealth
_addTPtoHPExit:
lis r31, LinkRegisterBackUpTPHP@ha
lwz r0, LinkRegisterBackUpTPHP@l(r31)
mtlr r0
or r0, r21, r21
lis r31, RegistersBackUpTPHP@ha
lmw r14, RegistersBackUpTPHP@l(r31)
or r27, r0, r0
lis r31, BoolIsInnerOrDoll@ha
lwz r31, BoolIsInnerOrDoll@l(r31)
cmpwi r31, 0
bne _addTPtoHPDollExit
_addTPtoHPInnerExit:
lwz r5, 0(r4)
blr
_addTPtoHPDollExit:
lwz r5, 0(r6)
blr
;####################################################################################################################
;####################################################################################################################
;####################################################################################################################
;this function checks the CurrentSlipHealPosition variable found in tphp_data
;it uses this variable to detect if the heal is currently an out of battle heal
;if so & if the users has set the mod to not update tp ot of battle
;then this prevents tp from updating from out of battle heals and only out of battle heals
HPStopSlipHealTP:
lbz r31, 0(r24) ; $TPboundtoHP
cmpwi r31, 1
beq HPTPMod_blr
lis r31, CurrentSlipHealPosition@ha
lwz r31, CurrentSlipHealPosition@l(r31)
cmpwi r31, 0
ble+ HPTPMod_blr
addi r12, r31, -1
lis r31, CurrentSlipHealPosition@ha
stw r12, CurrentSlipHealPosition@l(r31)
cmpwi r12, 0
mtlr r0
bgt+ HPTPMod_blr
li r12, 0
stw r12, CurrentSlipHealPosition@l(r31)
blr
;this function only needs to exist because hp update is called after hp is applied
;and tp update is called before tp is applied
CheckifSyncHP:
lbz r31, 2(r24)
cmpwi r31, 1
bne HPTPMod_blr
neg r21, r21
lbz r31, 3(r24)
cmpwi r31, 0
bne HPTPMod_blr
li r21, 0
blr
;free registers = r12, r31, r0
;r21 = amount of damage that was taken from HP (we neg r21 to share code with tp)
;r10 = pointer to character battle data
;main function of the hpupdate section. multiple entrance depeding for ground characters and skells
;does entrance set up, calls the necissary functions, and the fixes everything at exit
addHPtoTPInner:
mflr r0
lis r31, LinkRegisterBackUpTPHP@ha
stw r0, LinkRegisterBackUpTPHP@l(r31)
bl GetModDataInnerHPTP
b addHPtoTP
addHPtoTPDoll:
mflr r0
lis r31, LinkRegisterBackUpTPHP@ha
stw r0, LinkRegisterBackUpTPHP@l(r31)
bl GetModDataDollHPTP
addHPtoTP:
neg r21, r21
lis r30, FunctionPointerArrayCheatHP@hi
ori r30, r30, FunctionPointerArrayCheatHP@l
bl CheckHealthCheat
bl CheckTensionCheat
bl CheckifSyncHP
bl CheckSyncSettingHP
bl CheckifTPNegative
bl StoreCharacterHealth
addHPtoTPExit:
lis r31, LinkRegisterBackUpTPHP@ha
lwz r0, LinkRegisterBackUpTPHP@l(r31)
lis r31, RegistersBackUpTPHP@ha
lmw r14, RegistersBackUpTPHP@l(r31)
mtlr r0
lwz r12, 0x10(r30)
blr
;btw thank you for looking at my mod!
;as a little treat I discoved a fun game breaking cheat
;its not worth making a gfx for because all it does is remove the battle system from the game
;so like actually just breaks the game and makes it not work
;but still kinda funny for a few minutes
;you cannot target enemies, enemies cannot target you, and enemies cannot move, only play their idle animation
;0x022B7484 = nop ; 1.0.1E, 1.0.2U, 1.0.0E
;0x022B6E94 = nop ; 1.0.2J
;0x022B7414 = nop ; 1.0.1U, 1.0.0U
;0x022B6D20 = nop ; 1.0.0J
[XCX_BootWithTP_Sync_v101E_v102U]
moduleMatches = 0xF882D5CF, 0x30B6E091, 0x218F6E07 ; 1.0.1E, 1.0.2U, 1.0.0E
;calls the boot section of the mod for ground characters
0x02367C1C = bla BootWithTPInner
;calls the boot section of the mod for Skells
0x02367E20 = bla BootWithTPDoll
;calls the tp section of the mod for ground characters
0x0212D620 = bla addTPtoHPInner
;calls the tp section of the mod for Skells
0x025E5A9C = bla addHPtoTPInner
;calls the hp section of the mod for ground characters
0x0212D6EC = bla addTPtoHPDoll
;calls the hp section of the mod for Skells
0x025CE770 = bla addHPtoTPDoll
[XCX_BootWithTP_Sync_v102J]
moduleMatches = 0x7672271D ; 1.0.2J
0x02367450 = bla BootWithTPInner
0x02367654 = bla BootWithTPDoll
0x0212D0EC = bla addTPtoHPInner
0x025E5078 = bla addHPtoTPInner
0x0212D1B8 = bla addTPtoHPDoll
0x025CDD4C = bla addHPtoTPDoll
[XCX_BootWithTP_Sync_v100U]
moduleMatches = 0xAB97DE6B, 0x676EB33E ; 1.0.1U, 1.0.0U
0x02367BAC = bla BootWithTPInner
0x02367DB0 = bla BootWithTPDoll
0x0212D620 = bla addTPtoHPInner
0x025E5A2C = bla addHPtoTPInner
0x0212D6EC = bla addTPtoHPDoll
0x025CE700 = bla addHPtoTPDoll
[XCX_BootWithTP_Sync_v100J]
moduleMatches = 0x785CA8A9 ; 1.0.0J
0x023672DC = bla BootWithTPInner
0x023674E0 = bla BootWithTPDoll
0x0212CE68 = bla addTPtoHPInner
0x025E459C = bla addHPtoTPInner
0x0212CF34 = bla addTPtoHPDoll
0x025CD270 = bla addHPtoTPDoll

View File

@ -0,0 +1,608 @@
[Definition]
titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = TP and HP functionality
path = "Xenoblade Chronicles X/Mods/Battle/TP QoL & Changes"
description = This mod by default only applies 2 Quality of Life changes. It sets your Tension points to their max once at boot, and prevents your Skell GP from draining while your outside it.||On top of the QoL changes, this mod also features very extensive ways to customize the way your HP and TP are handled by the game that veteran players may enjoy.
#Credits: Intra
version = 7
[Default]
$QoL = 1
$QoLSkell = 1
$everyloadingscreen = 0
$everyloadingscreenSkell = 0
$disableSkellLosingGP = 1
$customSync = 0
$customCheat = 0
$TPCheat = 0
$TPCheatSkell = 0
$HPCheat = 0
$HPCheatSkell = 0
$noHPcheatnodieifdamagelt = 0
$TPupdatecheatdieat0TP = 0
$TPupdatecheatnegative = 0
$HPupdatecheatnegative = 0
$noHPcheatnodieifdamageltSkell = 0
$TPupdatecheatdieat0TPSkell = 0
$TPupdatecheatnegativeSkell = 0
$HPupdatecheatnegativeSkell = 0
$afterbattleheal = 1
$skiptravelheal = 1
$skiptravelhealSkell = 1
$afterbattlerestoretp = 1
$HPboundtoTP = 0
$HPboundtoTPNegative = 0
$TPboundtoHP = 0
$TPboundtoHPNegative = 0
$HPboundtoTPSkell = 0
$HPboundtoTPNegativeSkell = 0
$TPboundtoHPSkell = 0
$TPboundtoHPNegativeSkell = 0
[Preset]
category = Quality of Life TP on Boot
name = "Off"
$QoL = 0
$QoLSkell = 0
[Preset]
category = Quality of Life TP on Boot
name = "Max TP on boot"
default = 1
[Preset]
category = Quality of Life TP on Boot
name = "Max TP Every time you skip travel or die"
$everyloadingscreen = 1
$everyloadingscreenSkell = 1
[Preset]
category = Quality of Life Skell GP
name = "Unchanged"
condition = ($HPboundtoTPSkell==0)+($HPboundtoTPSkell==4) == 1
$disableSkellLosingGP = 0
[Preset]
category = Quality of Life Skell GP
name = "Disable your Skell loosing GP when your not in it"
default = 1
[Preset]
category = Cheat
name = "Off "
[Preset]
category = Cheat
name = "CHALLENGE: No TP"
$TPCheat = 1
$TPCheatSkell = 1
[Preset]
category = Cheat
name = "CHALLENGE: Die in 1 Hit"
$HPCheat = 1
$HPCheatSkell = 1
[Preset]
category = Cheat
name = "CHEAT: Infinite TP"
$TPCheat = 2
$TPCheatSkell = 2
[Preset]
category = Cheat
name = "CHEAT: Infinite HP"
$HPCheat = 2
$HPCheatSkell = 2
[Preset]
category = Cheat
name = "CHEAT: Infinite HP & TP"
$TPCheat = 2
$HPCheat = 2
$TPCheatSkell = 2
$HPCheatSkell = 2
[Preset]
category = Cheat
name = "Custom (Remember to set the custom options to off when unselecting)"
$customCheat = 1
[Preset]
category = Ground: Cheat TP
condition = $customCheat == 1
name = "Off "
[Preset]
category = Ground: Cheat TP
condition = $customCheat == 1
name = "CHALLENGE: No TP "
$TPCheat = 1
#[Preset]
#category = Ground: Cheat TP
#condition = $customCheat == 1
#name = "WEIRD: Only TP Updates From Damage (Unfinished) "
#$TPCheat = 4
[Preset]
category = Ground: Cheat TP
condition = $customCheat == 1
name = "WEIRD: TP always equals HP "
$TPCheat = 3
[Preset]
category = Ground: Cheat TP
condition = $customCheat == 1
name = "CHEAT: Infinite TP "
$TPCheat = 2
[Preset]
category = Ground: Cheat HP
condition = $customCheat == 1
name = "Off "
[Preset]
category = Ground: Cheat HP
condition = $customCheat == 1
name = "CHALLENGE: Die in 1 Hit "
$HPCheat = 1
#[Preset]
#category = Ground: Cheat HP
#condition = $customCheat == 1
#name = "WEIRD: Only HP Updates From Using TP (Unfinished) "
#$HPCheat = 4
[Preset]
category = Ground: Cheat HP
condition = $customCheat == 1
name = "WEIRD: HP always equals TP "
$HPCheat = 3
[Preset]
category = Ground: Cheat HP
condition = $customCheat == 1
name = "CHEAT: Infinite HP "
$HPCheat = 2
[Preset]
category = Skell: Cheat TP
condition = $customCheat == 1
name = "Off "
[Preset]
category = Skell: Cheat TP
condition = $customCheat == 1
name = "CHALLENGE: No TP "
$TPCheatSkell = 1
#[Preset]
#category = Skell: Cheat TP
#condition = $customCheat == 1
#name = "WEIRD: Only TP Updates From Damage (Unfinished) "
#$TPCheatSkell = 4
[Preset]
category = Skell: Cheat TP
condition = $customCheat == 1
name = "WEIRD: TP always equals HP "
$TPCheatSkell = 3
[Preset]
category = Skell: Cheat TP
condition = $customCheat == 1
name = "CHEAT: Infinite TP "
$TPCheatSkell = 2
[Preset]
category = Skell: Cheat HP
condition = $customCheat == 1
name = "Off "
[Preset]
category = Skell: Cheat HP
condition = $customCheat == 1
name = "CHALLENGE: Die in 1 Hit "
$HPCheatSkell = 1
#[Preset]
#category = Skell: Cheat HP
#condition = $customCheat == 1
#name = "WEIRD: Only HP Updates From Using TP (Unfinished) "
#$HPCheatSkell = 4
[Preset]
category = Skell: Cheat HP
condition = $customCheat == 1
name = "WEIRD: HP always equals TP "
$HPCheatSkell = 3
[Preset]
category = Skell: Cheat HP
condition = $customCheat == 1
name = "CHEAT: Infinite HP "
$HPCheatSkell = 2
[Preset]
category = Modify Die in 1 Hit Cheat
condition = ($customCheat==1)*(($HPCheat==1)+($HPCheatSkell==1)) != 0
name = "Unchanged "
[Preset]
category = Modify Die in 1 Hit Cheat
condition = ($customCheat==1)*(($HPCheat==1)+($HPCheatSkell==1)) != 0
name = "Die in 1 Hit Unless Only Taking 1 Damage"
$noHPcheatnodieifdamagelt = 1
$noHPcheatnodieifdamageltSkell = 1
[Preset]
category = Modify Die in 1 Hit Cheat
condition = ($customCheat==1)*(($HPCheat==1)+($HPCheatSkell==1)) != 0
name = "Die in 1 Hit Unless Taking 100 or less Damage"
$noHPcheatnodieifdamagelt = 100
$noHPcheatnodieifdamageltSkell = 100
[Preset]
category = Modify Die in 1 Hit Cheat
condition = ($customCheat==1)*(($HPCheat==1)+($HPCheatSkell==1)) != 0
name = "Die in 1 Hit Unless Taking 1000 or less Damage"
$noHPcheatnodieifdamagelt = 1000
$noHPcheatnodieifdamageltSkell = 1000
[Preset]
category = Modify Only TP Updates From Damage Cheat
condition = ($customCheat==1)*(($TPCheat==3)+($TPCheatSkell==3)) != 0
name = "Unchanged "
[Preset]
category = Modify Only TP Updates From Damage Cheat
condition = ($customCheat==1)*(($TPCheat==3)+($TPCheatSkell==3)) != 0
name = "Negative Correlation"
$TPupdatecheatnegative = 1
[Preset]
category = Modify Only TP Updates From Damage Cheat
condition = ($customCheat==1)*(($TPCheat==3)+($TPCheatSkell==3)) != 0
name = "Die if your TP hits 0"
$TPupdatecheatdieat0TP = 1
[Preset]
category = Modify Only TP Updates From Damage Cheat
condition = ($customCheat==1)*(($TPCheat==3)+($TPCheatSkell==3)) != 0
name = "Die if your TP hits 0 AND Negative Correlation"
$TPupdatecheatdieat0TP = 1
$TPupdatecheatnegative = 1
$TPupdatecheatdieat0TPSkell = 1
$TPupdatecheatnegativeSkell = 1
[Preset]
category = Modify Only HP Updates From Using TP Cheat
condition = ($customCheat==1)*(($HPCheat==3)+($HPCheatSkell==3)) != 0
name = "Unchanged "
[Preset]
category = Modify Only HP Updates From Using TP Cheat
condition = ($customCheat==1)*(($HPCheat==3)+($HPCheatSkell==3)) != 0
name = "Negative Correlation "
$HPupdatecheatnegative = 1
$HPupdatecheatnegativeSkell = 1
[Preset]
category = Change Gameplay: Auto Healing
name = "Unchanged "
[Preset]
category = Change Gameplay: Auto Healing
name = "Disable healing after battle"
$afterbattleheal = 0
[Preset]
category = Change Gameplay: Auto Healing
condition = ($TPboundtoHP==2)+($TPboundtoHP==4)+($TPboundtoHPSkell==2)+($TPboundtoHPSkell==4) != 0
name = "Disable restoring TP after battle"
$afterbattlerestoretp = 0
[Preset]
category = Change Gameplay: Auto Healing
condition = ($TPboundtoHP==2)+($TPboundtoHP==4)+($TPboundtoHPSkell==2)+($TPboundtoHPSkell==4) == 0
name = "Disable healing after battle AND from skip traveling"
$afterbattleheal = 0
$skiptravelheal = 0
$skiptravelhealSkell = 0
[Preset]
category = Change Gameplay: Auto Healing
condition = ($TPboundtoHP==2)+($TPboundtoHP==4)+($TPboundtoHPSkell==2)+($TPboundtoHPSkell==4) != 0
name = "Disable healing/TP restore after battle AND healing from skip traveling"
$afterbattleheal = 0
$afterbattlerestoretp = 0
$skiptravelheal = 0
$skiptravelhealSkell = 0
[Preset]
category = Change Gameplay: Bind HP and TP
name = "Off "
[Preset]
category = Change Gameplay: Bind HP and TP
name = "HP & TP are bound Asynchronously"
$HPboundtoTP = 2
$TPboundtoHP = 2
$HPboundtoTPSkell = 2
$TPboundtoHPSkell = 2
[Preset]
category = Change Gameplay: Bind HP and TP
condition = (($TPCheat==0)*($HPCheat==0))*(($TPCheatSkell==0)*($HPCheatSkell==0)) != 0
name = "HP & TP are bound Synchronously (always the same)"
$HPboundtoTP = 1
$TPboundtoHP = 1
$HPboundtoTPSkell = 1
$TPboundtoHPSkell = 1
[Preset]
category = Change Gameplay: Bind HP and TP
name = "HP & TP are bound Asynchronously (Negative Correlation)"
$HPboundtoTP = 2
$TPboundtoHP = 2
$HPboundtoTPSkell = 2
$TPboundtoHPSkell = 2
$HPboundtoTPNegative = 1
$TPboundtoHPNegative = 1
$HPboundtoTPNegativeSkell = 1
$TPboundtoHPNegativeSkell = 1
[Preset]
category = Change Gameplay: Bind HP and TP
name = "Only binds if losing HP or TP"
$HPboundtoTP = 3
$TPboundtoHP = 3
$HPboundtoTPSkell = 3
$TPboundtoHPSkell = 3
#[Preset]
#category = Change Gameplay: Bind HP and TP
#name = "Only binds if losing HP or TP (Negative Correlation)"
#$HPboundtoTP = 3
#$TPboundtoHP = 3
#$HPboundtoTPSkell = 3
#$TPboundtoHPSkell = 3
#$HPboundtoTPNegative = 1
#$TPboundtoHPNegative = 1
#$HPboundtoTPNegativeSkell = 1
#$TPboundtoHPNegativeSkell = 1
[Preset]
category = Change Gameplay: Bind HP and TP
name = "Only binds if gaining HP or TP"
$HPboundtoTP = 4
$TPboundtoHP = 4
$HPboundtoTPSkell = 4
$TPboundtoHPSkell = 4
#[Preset]
#category = Change Gameplay: Bind HP and TP
#name = "Only binds if gaining HP or TP (Negative Correlation)"
#$HPboundtoTP = 4
#$TPboundtoHP = 4
#$HPboundtoTPSkell = 4
#$TPboundtoHPSkell = 4
#$HPboundtoTPNegative = 1
#$TPboundtoHPNegative = 1
#$HPboundtoTPNegativeSkell = 1
#$TPboundtoHPNegativeSkell = 1
[Preset]
category = Change Gameplay: Bind HP and TP
name = "Custom (Remember to set the custom options to off when unselecting) "
$customSync = 1
[Preset]
category = Ground: Bind HP to TP
condition = $customSync == 1
name = "Off "
[Preset]
category = Ground: Bind HP to TP
condition = $customSync == 1
name = "Asynchronously"
$HPboundtoTP = 2
[Preset]
category = Ground: Bind HP to TP
condition = $customSync == 1
name = "Decreasing Only"
$HPboundtoTP = 3
[Preset]
category = Ground: Bind HP to TP
condition = $customSync == 1
name = "Increasing Only"
$HPboundtoTP = 4
[Preset]
category = Ground: Bind HP to TP
condition = $customSync == 1
name = "Asynchronously (Negative Correlation)"
$HPboundtoTP = 2
$HPboundtoTPNegative = 1
[Preset]
category = Ground: Bind HP to TP
condition = $customSync == 1
name = "Decreasing Only (Negative Correlation)"
$HPboundtoTP = 3
$HPboundtoTPNegative = 1
[Preset]
category = Ground: Bind HP to TP
condition = $customSync == 1
name = "Increasing Only (Negative Correlation)"
$HPboundtoTP = 4
$HPboundtoTPNegative = 1
[Preset]
category = Ground: Bind HP to TP
condition = ($customSync == 1) * (($TPCheat==0)*($HPCheat==0)) == 1
name = "Bind HP AND TP Synchronously"
$TPboundtoHP = 1
$HPboundtoTP = 1
[Preset]
category = Ground: Bind HP to TP
condition = ($customSync == 1) * (($TPCheat==0)*($HPCheat==0)) == 1
name = "Bind HP AND TP Synchronously (Negative Correlation)"
$TPboundtoHP = 1
$HPboundtoTP = 1
$HPboundtoTPNegative = 1
$TPboundtoHPNegative = 1
[Preset]
category = Ground: Bind TP to HP
condition = ($customSync==1)*($HPboundtoTP!=1) == 1
name = "Off "
[Preset]
category = Ground: Bind TP to HP
condition = ($customSync==1)*($HPboundtoTP!=1) == 1
name = "Asynchronously "
$TPboundtoHP = 2
[Preset]
category = Ground: Bind TP to HP
condition = ($customSync==1)*($HPboundtoTP!=1) == 1
name = "Decreasing Only "
$TPboundtoHP = 3
[Preset]
category = Ground: Bind TP to HP
condition = ($customSync==1)*($HPboundtoTP!=1) == 1
name = "Increasing Only "
$TPboundtoHP = 4
[Preset]
category = Ground: Bind TP to HP
condition = ($customSync==1)*($HPboundtoTP!=1) == 1
name = "Asynchronously (Negative Correlation) "
$TPboundtoHP = 2
$TPboundtoHPNegative = 1
[Preset]
category = Ground: Bind TP to HP
condition = ($customSync==1)*($HPboundtoTP!=1) == 1
name = "Decreasing Only (Negative Correlation) "
$TPboundtoHP = 3
$TPboundtoHPNegative = 1
[Preset]
category = Ground: Bind TP to HP
condition = ($customSync==1)*($HPboundtoTP!=1) == 1
name = "Increasing Only (Negative Correlation) "
$TPboundtoHP = 4
$TPboundtoHPNegative = 1
[Preset]
category = Skell: Bind HP to TP
condition = $customSync == 1
name = "Off "
[Preset]
category = Skell: Bind HP to TP
condition = $customSync == 1
name = "Asynchronously "
$HPboundtoTPSkell = 2
[Preset]
category = Skell: Bind HP to TP
condition = $customSync == 1
name = "Decreasing Only "
$HPboundtoTPSkell = 3
[Preset]
category = Skell: Bind HP to TP
condition = $customSync == 1
name = "Increasing Only "
$HPboundtoTPSkell = 4
[Preset]
category = Skell: Bind HP to TP
condition = $customSync == 1
name = "Asynchronously (Negative Correlation) "
$HPboundtoTPSkell = 2
$HPboundtoTPNegativeSkell = 1
[Preset]
category = Skell: Bind HP to TP
condition = $customSync == 1
name = "Decreasing Only (Negative Correlation) "
$HPboundtoTPSkell = 3
$HPboundtoTPNegativeSkell = 1
[Preset]
category = Skell: Bind HP to TP
condition = $customSync == 1
name = "Increasing Only (Negative Correlation) "
$HPboundtoTPSkell = 4
$HPboundtoTPNegativeSkell = 1
[Preset]
category = Skell: Bind HP to TP
condition = ($customSync == 1) * (($TPCheatSkell==0)*($HPCheatSkell==0)) == 1
name = "Bind HP AND TP Synchronously "
$TPboundtoHPSkell = 1
$HPboundtoTPSkell = 1
[Preset]
category = Skell: Bind HP to TP
condition = ($customSync == 1) * (($TPCheatSkell==0)*($HPCheatSkell==0)) == 1
name = "Bind HP AND TP Synchronously (Negative Correlation) "
$TPboundtoHPSkell = 1
$HPboundtoTPSkell = 1
$HPboundtoTPNegativeSkell = 1
$TPboundtoHPNegativeSkell = 1
[Preset]
category = Skell: Bind TP to HP
condition = ($customSync==1)*($HPboundtoTPSkell!=1) == 1
name = "Off "
[Preset]
category = Skell: Bind TP to HP
condition = ($customSync==1)*($HPboundtoTPSkell!=1) == 1
name = "Asynchronously "
$TPboundtoHPSkell = 2
[Preset]
category = Skell: Bind TP to HP
condition = ($customSync==1)*($HPboundtoTPSkell!=1) == 1
name = "Decreasing Only "
$TPboundtoHPSkell = 3
[Preset]
category = Skell: Bind TP to HP
condition = ($customSync==1)*($HPboundtoTPSkell!=1) == 1
name = "Increasing Only "
$TPboundtoHPSkell = 4
[Preset]
category = Skell: Bind TP to HP
condition = ($customSync==1)*($HPboundtoTPSkell!=1) == 1
name = "Asynchronously (Negative Correlation) "
$TPboundtoHPSkell = 2
$TPboundtoHPNegativeSkell = 1
[Preset]
category = Skell: Bind TP to HP
condition = ($customSync==1)*($HPboundtoTPSkell!=1) == 1
name = "Decreasing Only (Negative Correlation) "
$TPboundtoHPSkell = 3
$TPboundtoHPNegativeSkell = 1
[Preset]
category = Skell: Bind TP to HP
condition = ($customSync==1)*($HPboundtoTPSkell!=1) == 1
name = "Increasing Only (Negative Correlation) "
$TPboundtoHPSkell = 4
$TPboundtoHPNegativeSkell = 1

View File

@ -0,0 +1,38 @@
[XCX_OFFLINE_DivisionF]
moduleMatches = 0xF882D5CF, 0x30B6E091, 0x7672271D, 0x218F6E07, 0xAB97DE6B, 0x676EB33E, 0x785CA8A9 ; 1.0.1E, 1.0.2U, 1.0.2J, 1.0.0E, 1.0.1U, 1.0.0U, 1.0.0J
.origin = codecave
_forceChangeDivision:
li r3, $division
stw r3, 0xc4(r12)
blr
[XCX_OFFLINE_DivisionF_v101E]
moduleMatches = 0xF882D5CF, 0x218F6E07 ; 1.0.1E, 1.0.0E
0x0288D39C = ba _forceChangeDivision
0x0288D3B8 = ba _forceChangeDivision
;0x02AC623C = li r3, 0 ; offline__Q2_4menu19CTerminalMenu_UnionFv ;makes the division option show up on the blade terminal but just softlocks if selecting currently
[XCX_OFFLINE_DivisionF_v102U]
moduleMatches = 0x30B6E091 ; 1.0.2U
0x0288D39C = ba _forceChangeDivision
0x0288D3B8 = ba _forceChangeDivision
;0x02AC622C = li r3, 0 ; offline__Q2_4menu19CTerminalMenu_UnionFv
[XCX_OFFLINE_DivisionF_v102J]
moduleMatches = 0x7672271D ; 1.0.2J
0x0288A2FC = ba _forceChangeDivision
0x0288A318 = ba _forceChangeDivision
;0x02AC28FC = li r3, 0
[XCX_OFFLINE_DivisionF_v100U]
moduleMatches = 0xAB97DE6B, 0x676EB33E ; 1.0.1U, 1.0.0U
0x0288D320 = ba _forceChangeDivision
0x0288D33C = ba _forceChangeDivision
;0x02AC61B0 = li r3, 0
[XCX_OFFLINE_DivisionF_v100J]
moduleMatches = 0x785CA8A9 ; 1.0.0J
0x02888F24 = ba _forceChangeDivision
0x02888F40 = ba _forceChangeDivision
;0x02AC0B14 = li r3, 0

View File

@ -0,0 +1,55 @@
[Definition]
titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "Offline Change Division"
path = "Xenoblade Chronicles X/Mods/BLADE/Offline Change Division"
description = Simple mod to force change your BLADE Division.|It is normally only possible to change it online.
#Credits: Intra
version = 6
[Default]
$division = 1
[Preset]
category = Division
name = Pathfinders
$division = 1
[Preset]
category = Division
name = Interceptors
$division = 2
[Preset]
category = Division
name = Harriers
$division = 3
[Preset]
category = Division
name = Reclaimers
$division = 4
[Preset]
category = Division
name = Curators
$division = 5
[Preset]
category = Division
name = Prospecters
$division = 6
[Preset]
category = Division
name = Outfitters
$division = 7
[Preset]
category = Division
name = Mediators
$division = 8
[Preset]
category = Division
name = Have No Division (Glitch)
$division = 0

View File

@ -3,4 +3,5 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "DLC Quests unlocked"
path = "Xenoblade Chronicles X/Mods/BLADE/DLC Quests unlocked"
description = DLC Support quests are unlocked and accessible right after you are a BLADE member.
#Credits: lasyan3
version = 6

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = Field Skill Level
path = "Xenoblade Chronicles X/Mods/BLADE/Field Skill Level"
description = "You can change your Mechanical, Archaeological and Biological field skill level."
#Credits: Intra
version = 7
[Default]

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "Gain Reward Tickets from Time Attack or DLC missions"
path = "Xenoblade Chronicles X/Mods/BLADE/Gain Reward Tickets from Time Attack or DLC missions"
description = Adds Exchange Tickets in reward of completing Blade missions.|This mod will not work if More Reward Tickets is enabled.
#Credits: lasyan3
version = 6
[Default]

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "Offline Global Nemesis missions"
path = "Xenoblade Chronicles X/Mods/BLADE/Offline Global Nemesis missions"
description = Global Nemesis (both Telethia Plume and Yggralith Zero) are available in the BLADE console.
#Credits: lasyan3
version = 6
[Default]

View File

@ -0,0 +1,46 @@
[XCX_InfiniteTickets]
moduleMatches = 0xF882D5CF, 0x30B6E091, 0x7672271D, 0x218F6E07, 0xAB97DE6B, 0x676EB33E, 0x785CA8A9 ; 1.0.1E, 1.0.2U, 1.0.2J, 1.0.0E, 1.0.1U, 1.0.0U, 1.0.0J
.origin = codecave
ticketammount = $ticketammount
miraniumammount = $miraniumammount
moneyammount = $moneyammount
InfiniteTickets:
lis r3, ticketammount@hi
ori r3, r3, ticketammount@l
blr
InfiniteMiranium:
lis r3, miraniumammount@hi
ori r3, r3, miraniumammount@l
blr
InfiniteMoney:
lis r3, moneyammount@hi
ori r3, r3, moneyammount@l
blr
[XCX_InfiniteTickets_v101E_v102U]
moduleMatches = 0xF882D5CF, 0x30B6E091, 0x218F6E07 ; 1.0.1E, 1.0.2U, 1.0.0E
0x027F6B50 = ba InfiniteMoney
0x027F6CA8 = ba InfiniteTickets
0x027F6D44 = ba InfiniteMiranium
[XCX_InfiniteTickets_v102J]
moduleMatches = 0x7672271D ; 1.0.2J
0x027F46F4 = ba InfiniteMoney
0x027F484C = ba InfiniteTickets
0x027F48E8 = ba InfinitMiranium
[XCX_InfiniteTickets_v100U]
moduleMatches = 0xAB97DE6B, 0x676EB33E ; 1.0.1U, 1.0.0U
0x027F6AD4 = ba InfiniteMoney
0x027F6C2C = ba InfiniteTickets
0x027F6CC8 = ba InfiniteMiranium
[XCX_InfiniteTickets_v100J]
moduleMatches = 0x785CA8A9 ; 1.0.0J
0x027F36C8 = ba InfiniteMoney
0x027F3820 = ba InfiniteTickets
0x027F38BC = ba InfiniteMiranium

View File

@ -0,0 +1,80 @@
[Definition]
titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "Infinite Tickets and Miranium and Money"
path = "Xenoblade Chronicles X/Mods/BLADE/Infinite Tickets\Miranium\Money"
description = Force the game to read you having a certain amount of tickets, miranium, and money.
#Credits: Intra
version = 6
[Default]
$ticketammount = 9999
$miraniumammount = 999999
$moneyammount = 99999999
[Preset]
category = Tickets
name = 0
$ticketammount = 0
[Preset]
category = Tickets
name = 1,000
$ticketammount = 1000
[Preset]
category = Tickets
name = 9,999
default = 1
$ticketammount = 9999
[Preset]
category = Tickets
name = 99,999
$ticketammount = 99999
[Preset]
category = Miranium
name = 0
$miraniumammount = 0
[Preset]
category = Miranium
name = 10,000
$miraniumammount = 10000
[Preset]
category = Miranium
name = 99,999
default = 1
$miraniumammount = 99999
[Preset]
category = Miranium
name = 999,999
$miraniumammount = 999999
[Preset]
category = Money
name = 0
$moneyammount = 0
[Preset]
category = Money
name = 10,000
$moneyammount = 10000
[Preset]
category = Money
name = 1,000,000
$moneyammount = 1000000
[Preset]
category = Money
name = 99,999,999
default = 1
$moneyammount = 99999999
[Preset]
category = Money
name = 999,999,999
$moneyammount = 99999999

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "Lv60 Skells unlocked"
path = "Xenoblade Chronicles X/Mods/BLADE/Lv60 Skells unlocked"
description = Lv60 Skells and equipment are unlocked and accessible right after you are a BLADE member.
#Credits: lasyan3
version = 6
[Default]

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = Set BLADE Medal Count
path = "Xenoblade Chronicles X/Mods/BLADE/BLADE Medals"
description = Set the number of BLADE Medals you currently have. (must complete a nemesis mission for the new value to save)
#Credits: Intra
version = 6
[Default]

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "More Reward Tickets"
path = "Xenoblade Chronicles X/Mods/BLADE/More Reward Tickets"
description = Increase the Tickets gained with Squad tasks and missions.|Uncapped presets ignore max tickets.
#Credits: lasyan3, Crementif
version = 6
[Default]

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "Squad tasks and missions are available offline"
path = "Xenoblade Chronicles X/Mods/BLADE/Offline Squad tasks and missions"
description = Squad tasks and missions are available offline. Presets allow to select a Squad Mission, or you can use [Social > Squad Select] menu for random selection.||Recommended to be combined with More Reward Tickets (x3).||"Enable Online Mode" setting must be OFF for the mod to work!!
#Credits: lasyan3
version = 6
[Default]

View File

@ -0,0 +1,64 @@
[XCX_class]
moduleMatches = 0xF882D5CF, 0x30B6E091, 0x7672271D, 0x218F6E07, 0xAB97DE6B, 0x676EB33E, 0x785CA8A9 ; 1.0.1E, 1.0.2U, 1.0.2J, 1.0.0E, 1.0.1U, 1.0.0U, 1.0.0J
.origin = codecave
_classMemorJP100:
;reads from the static address that stores the address for the start of character info memory section
lis r11, 0x103a
lwz r11, -0x489c (r11)
b _charClassCheat
_classMemorUS100:
;reads from the static address that stores the address for the start of character info memory section
lis r11, 0x103a
lwz r11, -0x3e78 (r11)
b _charClassCheat
_classMemorJP102:
;reads from the static address that stores the address for the start of character info memory section
lis r11, 0x103a
lwz r11, -0x42b0 (r11)
b _charClassCheat
_classMemorEU101US102:
;reads from the static address that stores the address for the start of character info memory section
lis r11, 0x103a
lwz r11, -0x3d78 (r11)
_charClassCheat:
; Character class
li r9, $class
stb r9, $memoffset (r11)
; Character class rank
li r9, $rank
stb r9, $memoffset+2 (r11)
; Character class exp
li r9, $exp
sth r9, $memoffset+4 (r11)
;its seems that after a class hits its max rank,
;the rank counter continues to go up, the game just never shows you.
;I almost looped the full range, my rank exp on drifter is 0xeff9 out of 0xffff
;I think character exp works the same way
;sadly these mods destroy that value, even if we dont change the exp, just changing the rank/level does
;but the only way to even see them is to open up a hex editor
;fixes the line we over wrote
lis r11, 0x103a
blr
[XCX_Class_v101E_v102U]
moduleMatches = 0xF882D5CF, 0x30B6E091, 0x218F6E07 ; 1.0.1E, 1.0.2U, 1.0.0E
; Our code applies when the reqMenuCreateParty function is used
0x023429FC = bla _classMemorEU101US102
[XCX_Class_v102J]
moduleMatches = 0x7672271D ; 1.0.2J
0x02342230 = bla _classMemorJP102
[XCX_Class_v100U]
moduleMatches = 0xAB97DE6B, 0x676EB33E ; 1.0.1U, 1.0.0U
0x0234298C = bla _classMemorUS100
[XCX_Class_v100J]
moduleMatches = 0x785CA8A9 ; 1.0.0J
0x023420BC = bla _classMemorJP100

View File

@ -0,0 +1,378 @@
[Definition]
titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = Character Class
path = "Xenoblade Chronicles X/Mods/Character/Character Class"
description = "You can change the Class and Rank of any character.||***Activate by pressing START(+), then Party->Active Members->Confirm Changes."
#Credits: Intra
version = 7
[Default]
$memoffset = 0x1D0
$class = 1
$rank = 1
$exp = 0
$characterID = 1
$classtype = 0
[Preset]
category = "Character"
name = "Playable Avatar"
[Preset]
category = "Character"
name = "Nagi"
$characterID = 2
$memoffset = (($characterID-1)*0x57C)+0x1D0
[Preset]
category = "Character"
name = "L"
$characterID = 3
$memoffset = (($characterID-1)*0x57C)+0x1D0
[Preset]
category = "Character"
name = "Lao"
$characterID = 4
$memoffset = (($characterID-1)*0x57C)+0x1D0
[Preset]
category = "Character"
name = "H.B."
$characterID = 5
$memoffset = (($characterID-1)*0x57C)+0x1D0
[Preset]
category = "Character"
name = "Gwin"
$characterID = 6
$memoffset = (($characterID-1)*0x57C)+0x1D0
[Preset]
category = "Character"
name = "Frye"
$characterID = 7
$memoffset = (($characterID-1)*0x57C)+0x1D0
[Preset]
category = "Character"
name = "Doug"
$characterID = 8
$memoffset = (($characterID-1)*0x57C)+0x1D0
[Preset]
category = "Character"
name = "Yelv"
$characterID = 9
$memoffset = (($characterID-1)*0x57C)+0x1D0
[Preset]
category = "Character"
name = "Boze"
$characterID = 10
$memoffset = (($characterID-1)*0x57C)+0x1D0
[Preset]
category = "Character"
name = "Phog"
$characterID = 11
$memoffset = (($characterID-1)*0x57C)+0x1D0
[Preset]
category = "Character"
name = "Elma"
$characterID = 12
$memoffset = (($characterID-1)*0x57C)+0x1D0
[Preset]
category = "Character"
name = "Lin"
$characterID = 13
$memoffset = (($characterID-1)*0x57C)+0x1D0
[Preset]
category = "Character"
name = "Celica"
$characterID = 14
$memoffset = (($characterID-1)*0x57C)+0x1D0
[Preset]
category = "Character"
name = "Irina"
$characterID = 15
$memoffset = (($characterID-1)*0x57C)+0x1D0
[Preset]
category = "Character"
name = "Murderess"
$characterID = 16
$memoffset = (($characterID-1)*0x57C)+0x1D0
[Preset]
category = "Character"
name = "Alexa"
$characterID = 17
$memoffset = (($characterID-1)*0x57C)+0x1D0
[Preset]
category = "Character"
name = "Hope"
$characterID = 18
$memoffset = (($characterID-1)*0x57C)+0x1D0
[Preset]
category = "Character"
name = "Mia"
$characterID = 19
$memoffset = (($characterID-1)*0x57C)+0x1D0
[Preset]
category = "Class Type"
name = Playable Avatar Classes
$classtype = 0
[Preset]
category = "Class Type"
name = Playable Character Classes
$classtype = 1
[Preset]
category = "Class"
name = Drifter
condition = $classtype == 0
$class = 1
[Preset]
category = "Class"
name = Striker
condition = $classtype == 0
$class = 2
[Preset]
category = "Class"
name = Commando
condition = $classtype == 0
$class = 7
[Preset]
category = "Class"
name = Enforcer
condition = $classtype == 0
$class = 12
[Preset]
category = "Class"
name = Samurai Gunner
condition = $classtype == 0
$class = 3
[Preset]
category = "Class"
name = Duelist
condition = $classtype == 0
$class = 4
[Preset]
category = "Class"
name = Shield Trooper
condition = $classtype == 0
$class = 5
[Preset]
category = "Class"
name = Bastion Warrior
condition = $classtype == 0
$class = 6
[Preset]
category = "Class"
name = Winged Viper
condition = $classtype == 0
$class = 8
[Preset]
category = "Class"
name = Full Metal Jaguar
condition = $classtype == 0
$class = 9
[Preset]
category = "Class"
name = Partisan Eagle
condition = $classtype == 0
$class = 10
[Preset]
category = "Class"
name = Astral Crusader
condition = $classtype == 0
$class = 11
[Preset]
category = "Class"
name = Psycorruptor
condition = $classtype == 0
$class = 13
[Preset]
category = "Class"
name = Mastermind
condition = $classtype == 0
$class = 14
[Preset]
category = "Class"
name = Blast Fencer
condition = $classtype == 0
$class = 15
[Preset]
category = "Class"
name = Galactic Knight
condition = $classtype == 0
$class = 16
[Preset]
category = "Class"
name = Duelist+ (Nagi)
condition = $classtype == 1
$class = 17
[Preset]
category = "Class"
name = Shield Trooper (L)
condition = $classtype == 1
$class = 18
[Preset]
category = "Class"
name = Partisan Eagle (Lao)
condition = $classtype == 1
$class = 19
[Preset]
category = "Class"
name = Shield Trooper+ (H.B.)
condition = $classtype == 1
$class = 20
[Preset]
category = "Class"
name = Samurai Gunner (Gwin)
condition = $classtype == 1
$class = 21
[Preset]
category = "Class"
name = Samurai Gunner+ (Frye)
condition = $classtype == 1
$class = 22
[Preset]
category = "Class"
name = Blast Fencer+ (Doug)
condition = $classtype == 1
$class = 23
[Preset]
category = "Class"
name = Blast Fencer+ (Yelv)
condition = $classtype == 1
$class = 24
[Preset]
category = "Class"
name = Partisan Eagle (Boze)
condition = $classtype == 1
$class = 25
[Preset]
category = "Class"
name = Winged Viper (Phog)
condition = $classtype == 1
$class = 26
[Preset]
category = "Class"
name = Full Metal Jaguar (Elma)
condition = $classtype == 1
$class = 27
[Preset]
category = "Class"
name = Shield Trooper (Lin)
condition = $classtype == 1
$class = 28
[Preset]
category = "Class"
name = Psycorruptor+ (Celica)
condition = $classtype == 1
$class = 29
[Preset]
category = "Class"
name = Psycorruptor+ (Irina)
condition = $classtype == 1
$class = 30
[Preset]
category = "Class"
name = Winged Viper+ (Murderess)
condition = $classtype == 1
$class = 31
[Preset]
category = "Class"
name = Partisan Eagle+ (Alexa)
condition = $classtype == 1
$class = 32
[Preset]
category = "Class"
name = Psycorruptor+ (Hope)
condition = $classtype == 1
$class = 33
[Preset]
category = "Class"
name = Psycorruptor (Mia)
condition = $classtype == 1
$class = 34
#[Preset]
#category = "Class"
#name = Invalid Class (will crash the game)
#$class = 0 #or anything above 34
#[Preset]
#category = "Rank"
#name = 0 (does nothing interesting)
#$rank = 0
[Preset]
category = "Rank"
name = 1
$rank = 1
[Preset]
category = "Rank"
name = 5 (Will not unlock anything)
$rank = 5
[Preset]
category = "Rank"
name = 10 (Will not unlock anything)
$rank = 10
[Preset]
category = "Rank"
name = 15 (Will not unlock anything)
condition = $class > 16
$rank = 15
[Preset]
category = "Rank"
name = 20 (Will not unlock anything)
condition = $class > 16
$rank = 20

View File

@ -0,0 +1,29 @@
[XCX_EquipAnyWeapon_v101E]
moduleMatches = 0xF882D5CF, 0x218F6E07 ; 1.0.1E, 1.0.0E
; WHO : checkEquipConditionInner__Q2_4menu13MenuEquipUtilSFRCQ2_2fw7SPcDataiT2bPi
; WHAT : forces the equipment check to always return true. (can equip any level of gear, and can equip any weapon) (does not affect skells)
0x02CC4428 = li r3, 1
; WHO : _checkWeapon__Q2_4Arts14CArtsControlPcFi
; WHAT : Allows any weapon to use any art. 99% of the time this crashes the game, but could be useful for a "have 2 melee/ranged weapons equiped mod"
;0x0269DCA8 = blr
[XCX_EquipAnyWeapon_v102U]
moduleMatches = 0x30B6E091 ; 1.0.2U
0x02CC43C8 = li r3, 1
;0x0269DCA8 = blr
[XCX_EquipAnyWeapon_v102J]
moduleMatches = 0x7672271D ; 1.0.2J
0x02CBF920 = li r3, 1
;0x0269D284 = blr
[XCX_EquipAnyWeapon_v100U]
moduleMatches = 0xAB97DE6B, 0x676EB33E ; 1.0.1U, 1.0.0U
0x02CC4250 = li r3, 1
;0x0269DC38 = blr
[XCX_EquipAnyWeapon_v100J]
moduleMatches = 0x785CA8A9 ; 1.0.0J
0x02CBB62C = li r3, 1
;0x0269C7A8 = blr

View File

@ -0,0 +1,7 @@
[Definition]
titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "Equip Any Weapon - Use any level of gear at any time"
path = "Xenoblade Chronicles X/Mods/Character/Equip Any Weapon"
description = Allows any character to equip any weapon and also removes the level check on gear so you can equip it even if under leveled. (Does not affect skells).
#Credits: Intra
version = 6

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = Character Level
path = "Xenoblade Chronicles X/Mods/Character/Character Level"
description = "You can change the level of any character.||***Activate by pressing START(+), then Party->Active Members->Confirm Changes."
#Credits: Intra
version = 7
[Default]

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = Change Character Name
path = "Xenoblade Chronicles X/Mods/Character/Change Name"
description = Change the names of the playable characters, even if they're locked or not in your party.|The (JP) names do not work properly on NA and EU versions of the game.||***Activate by pressing START(+), then Party->Active Members->Confirm Changes.||To create your own name(s) look at the rules.txt in the downloadedGraphicsPack/XenobladeX/Mods/CharacterName folder.
#Credits: Intra
version = 7

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = Character Size and Invisible Chest
path = "Xenoblade Chronicles X/Mods/Character/Character Size"
description = "You can change the height of any character and also make the chest of some characters not render.||Recommended to be combined with the 'No Fading When Close-up' mod (in Graphics).||***Activate by pressing START(+), then Party->Active Members->Confirm Changes."
#Credits: Intra
version = 7
[Default]

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = Unlock Character Arts
path = "Xenoblade Chronicles X/Mods/Character/Unlock Arts"
description = "Allows you to unlock all arts or specific arts. Using the "Force Arts" option allows party members to have arts they normally shouldn't have, and also allows having 2+ of the same art to be equiped.||***Activate "Unlock Arts" by pressing START(+), then Party->Arts->any character.|***Activate "Force Arts" by Party->active members->confirm changes."
#Credits: Intra
version = 7
[Default]
@ -90,140 +91,140 @@ $mclass = 0
$mmission = 0
[Preset]
category = "Character:"
category = "Character"
name = "Playable Avatar"
[Preset]
category = "Character:"
category = "Character"
name = "Nagi"
$characterID = 2
$memoffset = (($characterID-1)*0x57C)+0x422
[Preset]
category = "Character:"
category = "Character"
name = "L"
$characterID = 3
$memoffset = (($characterID-1)*0x57C)+0x422
[Preset]
category = "Character:"
category = "Character"
name = "Lao"
$characterID = 4
$memoffset = (($characterID-1)*0x57C)+0x422
[Preset]
category = "Character:"
category = "Character"
name = "H.B."
$characterID = 5
$memoffset = (($characterID-1)*0x57C)+0x422
[Preset]
category = "Character:"
category = "Character"
name = "Gwin"
$characterID = 6
$memoffset = (($characterID-1)*0x57C)+0x422
[Preset]
category = "Character:"
category = "Character"
name = "Frye"
$characterID = 7
$memoffset = (($characterID-1)*0x57C)+0x422
[Preset]
category = "Character:"
category = "Character"
name = "Doug"
$characterID = 8
$memoffset = (($characterID-1)*0x57C)+0x422
[Preset]
category = "Character:"
category = "Character"
name = "Yelv"
$characterID = 9
$memoffset = (($characterID-1)*0x57C)+0x422
[Preset]
category = "Character:"
category = "Character"
name = "Boze"
$characterID = 10
$memoffset = (($characterID-1)*0x57C)+0x422
[Preset]
category = "Character:"
category = "Character"
name = "Phog"
$characterID = 11
$memoffset = (($characterID-1)*0x57C)+0x422
[Preset]
category = "Character:"
category = "Character"
name = "Elma"
$characterID = 12
$memoffset = (($characterID-1)*0x57C)+0x422
[Preset]
category = "Character:"
category = "Character"
name = "Lin"
$characterID = 13
$memoffset = (($characterID-1)*0x57C)+0x422
[Preset]
category = "Character:"
category = "Character"
name = "Celica"
$characterID = 14
$memoffset = (($characterID-1)*0x57C)+0x422
[Preset]
category = "Character:"
category = "Character"
name = "Irina"
$characterID = 15
$memoffset = (($characterID-1)*0x57C)+0x422
[Preset]
category = "Character:"
category = "Character"
name = "Murderess"
$characterID = 16
$memoffset = (($characterID-1)*0x57C)+0x422
[Preset]
category = "Character:"
category = "Character"
name = "Alexa"
$characterID = 17
$memoffset = (($characterID-1)*0x57C)+0x422
[Preset]
category = "Character:"
category = "Character"
name = "Hope"
$characterID = 18
$memoffset = (($characterID-1)*0x57C)+0x422
[Preset]
category = "Character:"
category = "Character"
name = "Mia"
$characterID = 19
$memoffset = (($characterID-1)*0x57C)+0x422
#[Preset]
#category = "Combine with other mods?"
#name = "No"
#condition = ($characterID != 1)
#
#[Preset]
#category = "Combine with other mods?"
#name = "Combine with Force Weapons mod"
#condition = ($characterID != 1)
#$combweapmod = 1
#
#[Preset]
#category = "Combine with other mods?"
#name = "Combine with Change Class mod"
#condition = ($characterID != 1)
#$combclassmod = 1
#
#[Preset]
#category = "Combine with other mods?"
#name = "Combine with both Change Class and Force Weapons"
#condition = ($characterID != 1)
#$combweapmod = 1
#$combclassmod = 1
[Preset]
category = "Combine with other mods?"
name = "No"
condition = ($characterID != 1)
[Preset]
category = "Combine with other mods?"
name = "Combine with Equip Any Weapon Mod"
condition = ($characterID != 1)
$combweapmod = 1
[Preset]
category = "Combine with other mods?"
name = "Combine with Change Class Mod"
condition = ($characterID != 1)
$combclassmod = 1
[Preset]
category = "Combine with other mods?"
name = "Combine with both Change Class and Equip Any Weapon Mods"
condition = ($characterID != 1)
$combweapmod = 1
$combclassmod = 1

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "Catch range mod"
path = "Xenoblade Chronicles X/Mods/Collectibles/Catch range mod"
description = Increase the distance from which collectibles are grabbed.
#Credits: lasyan3
version = 6
[Default]

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "Ignore 100th"
path = "Xenoblade Chronicles X/Mods/Collectibles/Ignore 100th"
description = Ignore items past 99|Do not collect if you have 99 of the item, and don't sell it.||Collect items past 99|Collect even if you have 99 of the item, does not give any extra items.
#Credits: lasyan3
version = 6
[Default]

View File

@ -3,4 +3,5 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "Armors can have 3 augment slots"
path = "Xenoblade Chronicles X/Mods/Equipment/Armors can have 3 augment slots"
description = Using L's shop, you can have 3 augment slots on your EQUIPPED armors (ground and skell).
#Credits: lasyan3
version = 6

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "Unlimited augment upgrades"
path = "Xenoblade Chronicles X/Mods/Equipment/Unlimited augment upgrades"
description = You can upgrade infinitely all the augments inside a piece of equipment.
#Credits: lasyan3
version = 6
[Default]

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "Unlock all augments"
path = "Xenoblade Chronicles X/Mods/Equipment/Unlock all augments"
description = All the augments are already known at the shop, and with the CHEAT preset they cost nothing.
#Credits: lasyan3
version = 6
[Default]

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "Battle Points X"
path = "Xenoblade Chronicles X/Mods/Experience/Battle Points"
description = Change the amount of Battle points gained when a new level (or class level) is reached, when completing missions or exploring.
#Credits: lasyan3
version = 6
[Default]

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "BLADE Points X"
path = "Xenoblade Chronicles X/Mods/Experience/BLADE Points"
description = Change the amount of BLADE points gained in various situations.
#Credits: lasyan3
version = 6
[Default]

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "Class Exp Points X"
path = "Xenoblade Chronicles X/Mods/Experience/Class Exp Points"
description = Change the amount of Class Exp points gained in battle, missions, quests and exploration.
#Credits: lasyan3
version = 6
[Default]

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "Friends Points X"
path = "Xenoblade Chronicles X/Mods/Experience/Friends Points"
description = More Friends points gained when activating a Soul Voice Link during battle.
#Credits: lasyan3
version = 6
[Default]

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "Lv Exp Points"
path = "Xenoblade Chronicles X/Mods/Experience/Lv Exp Points"
description = Change the amount of Level Exp points gained in battle, missions, quests and exploration.|Ignores the 9999 exp cap.
#Credits: lasyan3
version = 6
[Default]

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = Field of View
path = "Xenoblade Chronicles X/Mods/Field of View"
description = Changes the field of view (FOV). Fixes edge framing for 21:9 cinematics and other FOV tweaks.
#Credits: getdls
version = 6
[Default]

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "FrontierNav - Miranium frequency mod"
path = "Xenoblade Chronicles X/Mods/FrontierNav/Miranium frequency mod"
description = Affect the frequency of the FrontierNav income for the Miranium (Vanilla is every 30 minutes).
#Credits: lasyan3
version = 6
[Default]

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "FrontierNav - Miranium quantity mod"
path = "Xenoblade Chronicles X/Mods/FrontierNav/Miranium quantity mod"
description = Affect the quantity of the FrontierNav income for the Miranium.
#Credits: lasyan3
version = 6
[Default]

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "FrontierNav - Money frequency mod"
path = "Xenoblade Chronicles X/Mods/FrontierNav/Money frequency mod"
description = Affect the frequency of the FrontierNav income for the Money (Vanilla is 15 minutes).
#Credits: lasyan3
version = 6
[Default]

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "FrontierNav - Money quantity mod"
path = "Xenoblade Chronicles X/Mods/FrontierNav/Money quantity mod"
description = Affect the quantity of the FrontierNav income for the Money.
#Credits: lasyan3
version = 6
[Default]

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "FrontierNav - Resources frequency mod"
path = "Xenoblade Chronicles X/Mods/FrontierNav/Resources frequency mod"
description = Affect the frequency of the FrontierNav income for the resources (Vanilla is every 5 minutes).
#Credits: lasyan3
version = 6
[Default]

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "FrontierNav - Resources quantity mod"
path = "Xenoblade Chronicles X/Mods/FrontierNav/Resources quantity mod"
description = Affect the quantity of the FrontierNav income for the resources.
#Credits: lasyan3
version = 6
[Default]

View File

@ -3,6 +3,7 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "Camera distance mod"
path = "Xenoblade Chronicles X/Mods/Graphics/Camera distance mod"
description = Affect the default distance of the camera (Vanilla zoom is 0).|Does not affect max zoom possible.
#Credits: lasyan3
version = 6
[Default]

View File

@ -0,0 +1,12 @@
[XCX_FixCameraBug_v101E_v102U_v100U]
moduleMatches = 0xF882D5CF, 0x30B6E091, 0x218F6E07, 0xAB97DE6B, 0x676EB33E ; 1.0.1E, 1.0.2U, 1.0.0E, 1.0.1U, 1.0.0U
;Prevents checkRoom__Q2_3Cam8CRootCamFPQ2_3cfs5CfObj from ever being called
0x0222EE70 = blr
[XCX_FixCameraBug_v102J]
moduleMatches = 0x7672271D ; 1.0.2J
0x0222E93C = blr
[XCX_FixCameraBug_v100J]
moduleMatches = 0x785CA8A9 ; 1.0.0J
0x0222E6B8 = blr

View File

@ -0,0 +1,7 @@
[Definition]
titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = Fix Under Ceiling Camera Bug
path = "Xenoblade Chronicles X/Mods/Graphics/Fix Camera Bug"
description = Fixes the really annoying camera bug where if your character ever goes under a ceiling, the game forgets all your settings and reverts to default.
#Credits: Intra
version = 6

View File

@ -3,4 +3,5 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "Freecam"
path = "Xenoblade Chronicles X/Mods/Graphics/Freecam"
description = Look around the world with the developer freecam.|The game functions like normal when you're in this mode. Area renders around camera, so going too far will make your character have no ground and die.||Mod made by blingbloing.|||Hold 'R' button to move camera up|Hold 'L' button to move camera down|Hold 'X' button to keep camera in place|Hold 'Y' button to speed up camera|Tip: Press and hold the R stick button to speed up even more
#Credits: blingbloing
version = 6

View File

@ -0,0 +1,280 @@
[XCX_libini]
moduleMatches = 0xF882D5CF, 0x30B6E091, 0x7672271D, 0x218F6E07, 0xAB97DE6B, 0x676EB33E, 0x785CA8A9 ; 1.0.1E, 1.0.2U, 1.0.2J, 1.0.0E, 1.0.1U, 1.0.0U, 1.0.0J
.origin = codecave
;allocates memory to back up and restore registers r0-r31
ini_register_backup:
.uint 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31
;allocates memory to back up and restore the link register (LR)
ini_linkregister_backup:
.uint 0
;over writes original ini file with 0's
DeleteINI:
addi r30, r22, -4
li r28, 0
_whileLoopDeleteINI:
stwu r28, 4(r30)
lbz r24, 4(r30)
cmpwi r24, 0
bne+ _whileLoopDeleteINI
blr
;passes PrintOnOff into the PrintSettings function wraper
PrintOnOffSettingsINImod:
lis r27, PrintOnOffINImod@hi
ori r27, r27, PrintOnOffINImod@l
b PrintSettingsINImod
;passes PrintStringValue into the PrintSettings function wraper
PrintStringValueSettingsINImod:
lis r27, PrintStringValueINImod@hi
ori r27, r27, PrintStringValueINImod@l
b PrintSettingsINImod
;passes Callsprintf directly into the PrintSettings function wraper
PrintFloatSettingsINImod:
lis r27, CallsprintfINImod@hi
ori r27, r27, CallsprintfINImod@l
b PrintSettingsINImod
;passes PrintAMVP into the PrintSettings function wraper
PrintAMVPSettingsINImod:
lis r27, PrintAMVPINImod@hi
ori r27, r27, PrintAMVPINImod@l
b PrintSettingsINImod
;takes in a pointer to a string(r22), and prints it
PrintSettingNameINImod:
lwzu r29, 4(r22)
addi r29, r29, -1
_whileloopPrintSettingNameINImod:
lbzu r26, 1(r29)
stbu r26, 1(r30)
cmpwi r26, 0
bne+ _whileloopPrintSettingNameINImod
blr
;prints new line character
PrintNewLineINImod:
li r26, 0x0D0A
sth r26, 0(r30)
addi r30, r30, 1
blr
;function wraper that takes in r20 and a function pointer(r27)
;loops the function by the ammount in r20
PrintSettingsINImod:
mflr r31
_forloopPrintSettingsINImod:
bl PrintSettingNameINImod
mtctr r27
bctrl
bl PrintNewLineINImod
addic. r20, r20, -1
bgt+ _forloopPrintSettingsINImod
mtlr r31
blr
;checks if the floating point precision is less than 0 or greater than 9
;if so set precision to 1 to prevent the game from crashing
CheckifPrecisionIsValidINImod:
cmpwi r26, 0x30+0
bge+ _ifPrecisionLessThan0INImod
li r26, 0x30+1
_ifPrecisionLessThan0INImod:
cmpwi r26, 0x30+9
ble+ _ifPrecisionGreaterThan9INImod
li r26, 0x30+1
_ifPrecisionGreaterThan9INImod:
blr
;calls the C function sprintf()
;takes in a pointer to a formating string by r4
;takes in an address to print to by r3
;takes in a float to print by f1
;outputs the last address printed to in r11
CallsprintfINImod:
mflr r29
lfsu f1, 4(r24)
lis r4, str_floating_precision_INImod@hi
ori r4, r4, str_floating_precision_INImod@l
lbzu r26, 1(r21)
addi r26, r26, 0x30
bl CheckifPrecisionIsValidINImod
stb r26, 2(r4)
or r3, r30, r30
CREQV 4*cr1+eq, 4*cr1+eq, 4*cr1+eq ;required for some reason
mtctr r25
bctrl ;bl sprintf
or r30, r11, r11
mtlr r29
blr
;takes in r23 and prints either on or off
PrintOnOffINImod:
lwzu r26, 4(r23)
stw r26, 0(r30)
_whileloopPrintOnOffINImod:
lbzu r26, 1(r30)
cmpwi r26, 0
bne+ _whileloopPrintOnOffINImod
blr
;takes in a string pointer(r18), and hijacks PrintSettingName to print it
PrintStringValueINImod:
mflr r28
addi r30, r30, -1
or r19, r22, r22
or r22, r18, r18
bl PrintSettingNameINImod
or r18, r22, r22
or r22, r19, r19
mtlr r28
blr
;takes in a floating point(r24), and its precision(r21)
;calls sprintf() 3 times to print 3 floats sperated by a comma
PrintAMVPINImod:
mflr r28
lis r19, 0x202C
ori r19, r19, 0x2000
bl CallsprintfINImod
stw r19, 0(r30)
addi r30, r30, 3
addi r21, r21, -1
bl CallsprintfINImod
stw r19, 0(r30)
addi r30, r30, 3
addi r21, r21, -1
bl CallsprintfINImod
mtlr r28
blr
; r22 == 0x23f09100
; registers that do not need to be restored:
; r25 r24 r28 r10
EditINIforinimod:
;back up registers r0-r31
lis r10, ini_register_backup@ha
stmw r0, ini_register_backup@l(r10)
;back up link register
mflr r25
lis r10, ini_linkregister_backup@ha
stw r25, ini_linkregister_backup@l(r10)
;load the function pointer for the C function sprintf() into r25
lis r25, sprintfFunctionPointer@hi
ori r25, r25, sprintfFunctionPointer@l
;deletes the lib.ini file in ram so we can over write it with our own
bl DeleteINI
;r30 will track current position in file
addi r30, r22, -1
;r22 will keep track of the current setting
lis r22, lookuptable_settingname_INImod@ha
addi r22, r22, lookuptable_settingname_INImod@l-4
;r23 will keep track of on/off settings
lis r23, lookuptable_onoff_INImod@ha
addi r23, r23, lookuptable_onoff_INImod@l-4
;r24 will keep track of floating point numbers
lis r24, lookuptable_float_INImod@ha
addi r24, r24, lookuptable_float_INImod@l-4
;r21 will keep track of floating point precision
lis r21, lookuptable_float_precision_INImod@ha
addi r21, r21, lookuptable_float_precision_INImod@l-1
;r18 will keep track of string values (only used for luttex1 & cube)
lis r18, lookuptable_stringvalue_INImod@ha
addi r18, r18, lookuptable_stringvalue_INImod@l-4
;the r20 is how many times the loop executes, aka number of settings to print
;print all the on off settings at the begining of the file
li r20, 9
bl PrintOnOffSettingsINImod
;print luttex1 and cube setting
li r20, 2
bl PrintStringValueSettingsINImod
;print float settings until hitting an on/off setting
li r20, 41
bl PrintFloatSettingsINImod
;print red auto on/off setting
li r20, 1
bl PrintOnOffSettingsINImod
;print float settings until hitting an on/off setting
li r20, 14
bl PrintFloatSettingsINImod
;print blur on/off setting
li r20, 1
bl PrintOnOffSettingsINImod
;print float settings until hitting an on/off setting
li r20, 3
bl PrintFloatSettingsINImod
;print shadow half on/off setting
li r20, 1
bl PrintOnOffSettingsINImod
;print float settings until hitting an on/off setting
li r20, 3
bl PrintFloatSettingsINImod
;print sRGBmode on/off setting
li r20, 1
bl PrintOnOffSettingsINImod
;print float settings until hitting avmp settings
li r20, 11
bl PrintFloatSettingsINImod
;print avmp settings
li r20, 16
bl PrintAMVPSettingsINImod
;print last 2 float settings settings
li r20, 2
bl PrintFloatSettingsINImod
ExitEditINImod:
;restore registers r0-r31 & LR
lis r10, ini_linkregister_backup@ha
lwz r25, ini_linkregister_backup@l(r10)
mtlr r25
lis r10, ini_register_backup@ha
lmw r0, ini_register_backup@l(r10)
;restores line we over wrote and returns to the game
;lwz r22, 0xa0(r31)
addi r25,r1,0x38
blr
[XCX_libini_V101E]
moduleMatches = 0xF882D5CF, 0x218F6E07 ; 1.0.1E, 1.0.0E
;pointer for the C function sprintf()
sprintfFunctionPointer = 0x03B18118
;patches the address with a branch link to the mod
0x02FF94C8 = bla EditINIforinimod
[XCX_libini_V102U]
moduleMatches = 0x30B6E091 ; 1.0.2U
sprintfFunctionPointer = 0x03B18098
0x02FF9468 = bla EditINIforinimod
[XCX_libini_V102J]
moduleMatches = 0x7672271D ; 1.0.2J
sprintfFunctionPointer = 0x03B134B0
0x02FF4990 = bla EditINIforinimod
[XCX_libini_V100U]
moduleMatches = 0xAB97DE6B, 0x676EB33E ; 1.0.1U, 1.0.0U
sprintfFunctionPointer = 0x03B17F18
0x02FF92F0 = bla EditINIforinimod
[XCX_libini_V100J]
moduleMatches = 0x785CA8A9 ; 1.0.0J
sprintfFunctionPointer = 0x03B0DEB0
0x02FEF588 = bla EditINIforinimod

View File

@ -0,0 +1,271 @@
[XCX_libini_Data]
moduleMatches = 0xF882D5CF, 0x30B6E091, 0x7672271D, 0x218F6E07, 0xAB97DE6B, 0x676EB33E, 0x785CA8A9 ; 1.0.1E, 1.0.2U, 1.0.2J, 1.0.0E, 1.0.1U, 1.0.0U, 1.0.0J
.origin = codecave
;This file allocates all the data from the rules.txt into ram
;this file also creates lookup tables to make the data easier to use
;the ini.asm file then contains code that will use this data
;string values for luttex1 and cube setting
value_luttex1:
.uint $luttex1_s1, $luttex1_s2, 0 ;if a larger string is needed, add $luttex1_s3, $luttex1_s4, etc. to before the 0
value_cube:
.uint $cube_s1, 0 ;if a larger string is needed, add $cube_s2, $cube_s3, etc. to before the 0
;list of strings that are in the lib.ini file
;this mod will be reprinting them
str_tonemap:
.string "tonemap="
str_ssao:
.string "ssao="
str_bloom:
.string "bloom="
str_godray:
.string "godray="
str_AntiAliasing:
.string "AntiAliasing="
str_ColReduction:
.string "ColReduction="
str_dof:
.string "dof="
str_lensFlare:
.string "lensFlare="
str_lut:
.string "lut="
str_luttex1:
.string "luttex1="
str_cube:
.string "cube="
str_tonemax:
.string "tonemax="
str_tonemin:
.string "tonemin="
str_tonemul:
.string "tonemul="
str_toneLastmul:
.string "toneLastmul="
str_toneBlmmax:
.string "toneBlmmax="
str_toneBlmmin:
.string "toneBlmmin="
str_toneBlmmul:
.string "toneBlmmul="
str_toneBlmLastmul:
.string "toneBlmLastmul="
str_godray_inival:
.string "godray_inival="
str_godray_decay:
.string "godray_decay="
str_godray_scale:
.string "godray_scale="
str_blm_border_sub:
.string "blm_border_sub="
str_blm_border_mul:
.string "blm_border_mul="
str_blm_border_sub2:
.string "blm_border_sub2="
str_blm_border_mul2:
.string "blm_border_mul2="
str_blm_border_max:
.string "blm_border_max="
str_blm_tex_mul:
.string "blm_tex_mul="
str_blm_blurscale1:
.string "blm_blurscale1="
str_blm_blurscale2:
.string "blm_blurscale2="
str_blm_blurscale3:
.string "blm_blurscale3="
str_blm_blurRange1:
.string "blm_blurRange1="
str_blm_blurRange2:
.string "blm_blurRange2="
str_blm_blurRange3:
.string "blm_blurRange3="
str_blm_scale1:
.string "blm_scale1="
str_blm_scale2:
.string "blm_scale2="
str_blm_scale3:
.string "blm_scale3="
str_lens_max:
.string "lens_max="
str_lens_rot:
.string "lens_rot="
str_lens_sub:
.string "lens_sub="
str_lens_mul:
.string "lens_mul="
str_lens_weight:
.string "lens_weight="
str_lens_decay:
.string "lens_decay="
str_lens_str:
.string "lens_str="
str_lens_paMax:
.string "lens_paMax="
str_lens_UVDecay:
.string "lens_UVDecay="
str_AA_Sharpness:
.string "AA_Sharpness="
str_AA_Range:
.string "AA_Range="
str_AA_Threshold:
.string "AA_Threshold="
str_AA_ThresholdMin:
.string "AA_ThresholdMin="
str_red_sclX:
.string "red_sclX="
str_red_sclY:
.string "red_sclY="
str_red_Auto:
.string "red_Auto="
str_red_AtMaxX:
.string "red_AtMaxX="
str_red_AtMaxY:
.string "red_AtMaxY="
str_red_AtMinX:
.string "red_AtMinX="
str_red_AtMinY:
.string "red_AtMinY="
str_red_AtRate:
.string "red_AtRate="
str_ao_Lengs:
.string "ao_Lengs="
str_ao_LengsRatio:
.string "ao_LengsRatio="
str_ao_range:
.string "ao_range="
str_ao_rangeRatio:
.string "ao_rangeRatio="
str_ao_sub:
.string "ao_sub="
str_ao_subRatio:
.string "ao_subRatio="
str_ao_Mul:
.string "ao_Mul="
str_ao_blurRange:
.string "ao_blurRange="
str_ao_blurScale:
.string "ao_blurScale="
str_blur:
.string "blur="
str_blurStr:
.string "blurStr="
str_blurSub:
.string "blurSub="
str_shadowStr:
.string "shadowStr="
str_shadowHalf:
.string "shadowHalf="
str_simShwStr:
.string "simShwStr="
str_simShwIn:
.string "simShwIn="
str_simShwMin:
.string "simShwMin="
str_sRGBMode:
.string "sRGBMode="
str_gamma:
.string "gamma="
str_ao_av_CenterWeight:
.string "ao_av_CenterWeight="
str_ao_av_MaxDistance:
.string "ao_av_MaxDistance="
str_ao_av_MaxRadius:
.string "ao_av_MaxRadius="
str_ao_av_FadeOutStart:
.string "ao_av_FadeOutStart="
str_ao_av_FadeOutDistance:
.string "ao_av_FadeOutDistance="
str_ao_av_BlurFallOff:
.string "ao_av_BlurFallOff="
str_ao_av_BlurScale:
.string "ao_av_BlurScale="
str_ao_av_Shwstr:
.string "ao_av_Shwstr="
str_cam_near:
.string "cam_near="
str_cam_far:
.string "cam_far="
str_avmp01:
.string "avmp01 = "
str_avmp02:
.string "avmp02 = "
str_avmp03:
.string "avmp03 = "
str_avmp04:
.string "avmp04 = "
str_avmp05:
.string "avmp05 = "
str_avmp06:
.string "avmp06 = "
str_avmp07:
.string "avmp07 = "
str_avmp08:
.string "avmp08 = "
str_avmp09:
.string "avmp09 = "
str_avmp10:
.string "avmp10 = "
str_avmp11:
.string "avmp11 = "
str_avmp12:
.string "avmp12 = "
str_avmp13:
.string "avmp13 = "
str_avmp14:
.string "avmp14 = "
str_avmp15:
.string "avmp15 = "
str_avmp16:
.string "avmp16 = "
str_cloud_h_min:
.string "cloud_h_min="
str_cloud_h_max:
.string "cloud_h_max="
;array of pointers to the list of strings above
;will be used to print the associated strings into memory
lookuptable_settingname_INImod:
.uint str_tonemap, str_ssao, str_bloom, str_godray, str_AntiAliasing, str_ColReduction, str_dof, str_lensFlare, str_lut, str_luttex1, str_cube, str_tonemax, str_tonemin, str_tonemul, str_toneLastmul, str_toneBlmmax, str_toneBlmmin, str_toneBlmmul, str_toneBlmLastmul, str_godray_inival, str_godray_decay, str_godray_scale, str_blm_border_sub, str_blm_border_mul, str_blm_border_sub2, str_blm_border_mul2, str_blm_border_max, str_blm_tex_mul, str_blm_blurscale1, str_blm_blurscale2, str_blm_blurscale3, str_blm_blurRange1, str_blm_blurRange2, str_blm_blurRange3, str_blm_scale1, str_blm_scale2, str_blm_scale3, str_lens_max, str_lens_rot, str_lens_sub, str_lens_mul, str_lens_weight, str_lens_decay, str_lens_str, str_lens_paMax, str_lens_UVDecay, str_AA_Sharpness, str_AA_Range, str_AA_Threshold, str_AA_ThresholdMin, str_red_sclX, str_red_sclY, str_red_Auto, str_red_AtMaxX, str_red_AtMaxY, str_red_AtMinX, str_red_AtMinY, str_red_AtRate, str_ao_Lengs, str_ao_LengsRatio, str_ao_range, str_ao_rangeRatio, str_ao_sub, str_ao_subRatio, str_ao_Mul, str_ao_blurRange, str_ao_blurScale, str_blur, str_blurStr, str_blurSub, str_shadowStr, str_shadowHalf, str_simShwStr, str_simShwIn, str_simShwMin, str_sRGBMode, str_gamma, str_ao_av_CenterWeight, str_ao_av_MaxDistance, str_ao_av_MaxRadius, str_ao_av_FadeOutStart, str_ao_av_FadeOutDistance, str_ao_av_BlurFallOff, str_ao_av_BlurScale, str_ao_av_Shwstr, str_cam_near, str_cam_far, str_avmp01, str_avmp02, str_avmp03, str_avmp04, str_avmp05, str_avmp06, str_avmp07, str_avmp08, str_avmp09, str_avmp10, str_avmp11, str_avmp12, str_avmp13, str_avmp14, str_avmp15, str_avmp16, str_cloud_h_min, str_cloud_h_max
;array of short strings that either contain "on" or "off"
;will be used to print the associated setting
lookuptable_onoff_INImod:
.uint $tonemap, $ssao, $bloom, $godray, $AntiAliasing, $ColReduction, $dof, $lensFlare, $lut, $red_Auto, $blur, $shadowHalf, $sRGBMode
;array of string pointers used to print the luttex1 and cube setting values
lookuptable_stringvalue_INImod:
.uint value_luttex1, value_cube
;array of floats used to print the float for the associated string
lookuptable_float_INImod:
.float $tonemax, $tonemin, $tonemul, $toneLastmul, $toneBlmmax, $toneBlmmin, $toneBlmmul, $toneBlmLastmul, $godray_inival, $godray_decay, $godray_scale, $blm_border_sub, $blm_border_mul, $blm_border_sub2, $blm_border_mul2, $blm_border_max, $blm_tex_mul, $blm_blurscale1, $blm_blurscale2, $blm_blurscale3, $blm_blurRange1, $blm_blurRange2, $blm_blurRange3, $blm_scale1, $blm_scale2, $blm_scale3, $lens_max, $lens_rot, $lens_sub, $lens_mul, $lens_weight, $lens_decay, $lens_str, $lens_paMax, $lens_UVDecay, $AA_Sharpness, $AA_Range, $AA_Threshold, $AA_ThresholdMin, $red_sclX, $red_sclY, $red_AtMaxX, $red_AtMaxY, $red_AtMinX, $red_AtMinY, $red_AtRate, $ao_Lengs, $ao_LengsRatio, $ao_range, $ao_rangeRatio, $ao_sub, $ao_subRatio, $ao_Mul, $ao_blurRange, $ao_blurScale, $blurStr, $blurSub, $shadowStr, $simShwStr, $simShwIn, $simShwMin, $gamma, $ao_av_CenterWeight, $ao_av_MaxDistance, $ao_av_MaxRadius, $ao_av_FadeOutStart, $ao_av_FadeOutDistance, $ao_av_BlurFallOff, $ao_av_BlurScale, $ao_av_Shwstr, $cam_near, $cam_far, $avmp0101, $avmp0102, $avmp0103, $avmp0201, $avmp0202, $avmp0203, $avmp0301, $avmp0302, $avmp0303, $avmp0401, $avmp0402, $avmp0403, $avmp0501, $avmp0502, $avmp0503, $avmp0601, $avmp0602, $avmp0603, $avmp0701, $avmp0702, $avmp0703, $avmp0801, $avmp0802, $avmp0803, $avmp0901, $avmp0902, $avmp0903, $avmp1001, $avmp1002, $avmp1003, $avmp1101, $avmp1102, $avmp1103, $avmp1201, $avmp1202, $avmp1203, $avmp1301, $avmp1302, $avmp1303, $avmp1401, $avmp1402, $avmp1403, $avmp1501, $avmp1502, $avmp1503, $avmp1601, $avmp1602, $avmp1603, $cloud_h_min, $cloud_h_max
;array of intigers used to set the number of decimal places printed for the associated float
lookuptable_float_precision_INImod:
.byte $tonemax_DecimalPlaces, $tonemin_DecimalPlaces, $tonemul_DecimalPlaces, $toneLastmul_DecimalPlaces, $toneBlmmax_DecimalPlaces, $toneBlmmin_DecimalPlaces, $toneBlmmul_DecimalPlaces, $toneBlmLastmul_DecimalPlaces, $godray_inival_DecimalPlaces, $godray_decay_DecimalPlaces, $godray_scale_DecimalPlaces, $blm_border_sub_DecimalPlaces, $blm_border_mul_DecimalPlaces, $blm_border_sub2_DecimalPlaces, $blm_border_mul2_DecimalPlaces, $blm_border_max_DecimalPlaces, $blm_tex_mul_DecimalPlaces, $blm_blurscale1_DecimalPlaces, $blm_blurscale2_DecimalPlaces, $blm_blurscale3_DecimalPlaces, $blm_blurRange1_DecimalPlaces, $blm_blurRange2_DecimalPlaces, $blm_blurRange3_DecimalPlaces, $blm_scale1_DecimalPlaces, $blm_scale2_DecimalPlaces, $blm_scale3_DecimalPlaces, $lens_max_DecimalPlaces, $lens_rot_DecimalPlaces, $lens_sub_DecimalPlaces, $lens_mul_DecimalPlaces, $lens_weight_DecimalPlaces, $lens_decay_DecimalPlaces, $lens_str_DecimalPlaces, $lens_paMax_DecimalPlaces, $lens_UVDecay_DecimalPlaces, $AA_Sharpness_DecimalPlaces, $AA_Range_DecimalPlaces, $AA_Threshold_DecimalPlaces, $AA_ThresholdMin_DecimalPlaces, $red_sclX_DecimalPlaces, $red_sclY_DecimalPlaces, $red_AtMaxX_DecimalPlaces, $red_AtMaxY_DecimalPlaces, $red_AtMinX_DecimalPlaces, $red_AtMinY_DecimalPlaces, $red_AtRate_DecimalPlaces, $ao_Lengs_DecimalPlaces, $ao_LengsRatio_DecimalPlaces, $ao_range_DecimalPlaces, $ao_rangeRatio_DecimalPlaces, $ao_sub_DecimalPlaces, $ao_subRatio_DecimalPlaces, $ao_Mul_DecimalPlaces, $ao_blurRange_DecimalPlaces, $ao_blurScale_DecimalPlaces, $blurStr_DecimalPlaces, $blurSub_DecimalPlaces, $shadowStr_DecimalPlaces, $simShwStr_DecimalPlaces, $simShwIn_DecimalPlaces, $simShwMin_DecimalPlaces, $gamma_DecimalPlaces, $ao_av_CenterWeight_DecimalPlaces, $ao_av_MaxDistance_DecimalPlaces, $ao_av_MaxRadius_DecimalPlaces, $ao_av_FadeOutStart_DecimalPlaces, $ao_av_FadeOutDistance_DecimalPlaces, $ao_av_BlurFallOff_DecimalPlaces, $ao_av_BlurScale_DecimalPlaces, $ao_av_Shwstr_DecimalPlaces, $cam_near_DecimalPlaces, $cam_far_DecimalPlaces, $avmp01_DecimalPlaces, $avmp02_DecimalPlaces, $avmp03_DecimalPlaces, $avmp04_DecimalPlaces, $avmp05_DecimalPlaces, $avmp06_DecimalPlaces, $avmp07_DecimalPlaces, $avmp08_DecimalPlaces, $avmp09_DecimalPlaces, $avmp10_DecimalPlaces, $avmp11_DecimalPlaces, $avmp12_DecimalPlaces, $avmp13_DecimalPlaces, $avmp14_DecimalPlaces, $avmp15_DecimalPlaces, $avmp16_DecimalPlaces, $cloud_h_min_DecimalPlaces, $cloud_h_max_DecimalPlaces
;format string that the C function sprintf() needs
;the * will be replaced with a number that sets the number of decimal places
str_floating_precision_INImod:
.string "%.*f"

View File

@ -0,0 +1,151 @@
------
### XCX lib.ini MOD
------
### What is this for?
This mod finds the ram copy of the lib.ini file thats located in monolib.cpk. It then will edit any and all options that the user wishes to edit. The mod is ran after the lib.ini is loaded into memory but before the game reads it.
The lib.ini file contains various settings mostly related to graphical settings such as AntiAliasing and the current RGB mode.
The lib.ini file is read once at boot and never again so you will need to restart the game to see changes.
Some proven to work settings are Bloom, AntiAliasing, sRGBMode, cloud_h_max, cloud_h_min, etc.
Some settings however are proven to not work.
Below is what an unmodified lib.ini file looks like:
------
```
tonemap=on
ssao=on
bloom=on
godray=on
AntiAliasing=on
ColReduction=off
dof=off
lensFlare=on
lut=on
luttex1=lutba
cube=cube
tonemax=2.5
tonemin=1.0
tonemul=1.0
toneLastmul=1.00
toneBlmmax=1.3
toneBlmmin=1.0
toneBlmmul=1.0
toneBlmLastmul=0.8
godray_inival=0.95
godray_decay=0.99
godray_scale=1.235
blm_border_sub=0.20
blm_border_mul=0.45
blm_border_sub2=3.0
blm_border_mul2=1.5
blm_border_max=3.5
blm_tex_mul=3.0
blm_blurscale1=1.0
blm_blurscale2=0.7
blm_blurscale3=1.5
blm_blurRange1=0.9
blm_blurRange2=0.8
blm_blurRange3=0.8
blm_scale1=0.2
blm_scale2=0.1
blm_scale3=0.1
lens_max=1
lens_rot=0
lens_sub=1.5
lens_mul=3.5
lens_weight=0.1
lens_decay=1.0
lens_str=1.5
lens_paMax=4.0
lens_UVDecay=0.290
AA_Sharpness=8.0
AA_Range=0.5
AA_Threshold=0.17
AA_ThresholdMin=0.05
red_sclX=0.96
red_sclY=1.0
red_Auto=on
red_AtMaxX=0.96
red_AtMaxY=1.0
red_AtMinX=0.6
red_AtMinY=0.86
red_AtRate=100.0
ao_Lengs=0.1
ao_LengsRatio=1.98
ao_range=5.7
ao_rangeRatio=1.000
ao_sub=0.02
ao_subRatio=0.150
ao_Mul=2.0
ao_blurRange=0.720
ao_blurScale=0.75
blur=off
blurStr=0.2
blurSub=0.05
shadowStr=1.0
shadowHalf=off
simShwStr=1.6
simShwIn=0.7
simShwMin=0.15
sRGBMode=on
gamma=6
ao_av_CenterWeight=1.090
ao_av_MaxDistance=0.15
ao_av_MaxRadius=0.2
ao_av_FadeOutStart=70000.0
ao_av_FadeOutDistance=10000.0
ao_av_BlurFallOff=0.050
ao_av_BlurScale=1.6
ao_av_Shwstr=0.5
cam_near=0.1
cam_far=80000.0
avmp01 = 0.5 , 0.5 , 0.5
avmp02 = 0.5 , 0.5 , 0.5
avmp03 = 0.5 , 0.5 , 0.5
avmp04 = 0.5 , 0.5 , 0.5
avmp05 = 0.5 , 0.5 , 0.5
avmp06 = 0.5 , 0.5 , 0.5
avmp07 = 0.5 , 0.5 , 0.5
avmp08 = 0.5 , 0.5 , 0.5
avmp09 = 0.5 , 0.5 , 0.5
avmp10 = 0.5 , 0.5 , 0.5
avmp11 = 0.5 , 0.5 , 0.5
avmp12 = 0.5 , 0.5 , 0.5
avmp13 = 0.5 , 0.5 , 0.5
avmp14 = 0.5 , 0.5 , 0.5
avmp15 = 0.5 , 0.5 , 0.5
avmp16 = 0.5 , 0.5 , 0.5
cloud_h_min=1000.0
cloud_h_max=1100.0
```
------
#Have fun playing with all the settings!

File diff suppressed because it is too large Load Diff

View File

@ -3,4 +3,5 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "No Fading When Close-up"
path = "Xenoblade Chronicles X/Mods/Graphics/No Fading When Close-up"
description = Makes it so that character and skell models don't fade out when the camera gets too close.
#Credits: blingbloing
version = 6

View File

@ -3,4 +3,5 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "Remove Overdrive Blur"
path = "Xenoblade Chronicles X/Mods/Graphics/Remove Overdrive Blur"
description = Removes the blur that happens around the screen when you are in Overdrive.
#Credits: blingbloing
version = 6

View File

@ -3,5 +3,6 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = Hide Offline Label
path = "Xenoblade Chronicles X/Mods/Hide Offline Label"
description = Removes offline blinking tag. Does not change the actual online state.
#Credits: getdls
version = 6
default = 1

View File

@ -3,5 +3,6 @@ titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "Change time from eManual"
path = "Xenoblade Chronicles X/Mods/HUD/Change time from eManual"
description = Allow to change time from the eManual entry of the main menu.|Fixes the soft lock that happens when selecting eManual on Cemu.
#Credits: lasyan3
version = 6
default = 1

View File

@ -0,0 +1,32 @@
[XCX_RemoveBattleUI_Arts_v101E]
moduleMatches = 0xF882D5CF, 0x218F6E07 ; 1.0.1E, 1.0.0E
;remove arts pallet
0x02a8ace4 = nop ;draw__Q2_4menu15MenuArtsPaletteFv
;fixes camera bug when skip traveling
0x02769448 = blr ;move__Q2_2ev12CCamPlayableFf
;???
;0x02c6b248 = nop ;close arts pallet
[XCX_RemoveBattleUI_Arts_v102U]
moduleMatches = 0x30B6E091 ; 1.0.2U
0x02a8acd4 = nop ;draw__Q2_4menu15MenuArtsPaletteFv
0x02769448 = blr ;move__Q2_2ev12CCamPlayableFf
;0x02c6b1e8 = nop ;close arts pallet
[XCX_RemoveBattleUI_Arts_v102J]
moduleMatches = 0x7672271D ; 1.0.2J
0x02a8724c = nop ;draw__Q2_4menu15MenuArtsPaletteFv
0x02767bc0 = blr ;move__Q2_2ev12CCamPlayableFf
;0x02c6675c = nop ;close arts pallet
[XCX_RemoveBattleUI_Arts_v100U]
moduleMatches = 0xAB97DE6B, 0x676EB33E ; 1.0.1U, 1.0.0U
0x02a8ac58 = nop ;draw__Q2_4menu15MenuArtsPaletteFv
0x027693e8 = blr ;move__Q2_2ev12CCamPlayableFf
;0x02c6b070 = nop ;close arts pallet
[XCX_RemoveBattleUI_Arts_v100J]
moduleMatches = 0x785CA8A9 ; 1.0.0J
0x02a855a0 = nop ;draw__Q2_4menu15MenuArtsPaletteFv
0x02766c50 = blr ;move__Q2_2ev12CCamPlayableFf
;0x02c62c48 = nop ;close arts pallet

View File

@ -0,0 +1,7 @@
[Definition]
titleIds = 0005000010116100,00050000101C4C00,00050000101C4D00
name = "Remove Battle UI Arts"
path = "Xenoblade Chronicles X/Mods/HUD/Remove Battle UI/Remove Arts pallet UI"
description = Removes arts from the mid battle UI.|Breaks camera during cutscenes.
#Credits: Blingblong
version = 6

Some files were not shown because too many files have changed in this diff Show More