Moved part of AnimationsAtOnceInit code from main.cpp to AnimationsAtOnceLimit.cpp.

Changed the if condition for ProcessorIdle to make sure out-of-bounds values not resulting in unexpected but valid values.
This commit is contained in:
NovaRain
2017-03-21 21:05:44 +08:00
parent b1624e5acf
commit 50c91db5ea
6 changed files with 154 additions and 161 deletions
+144 -146
View File
@@ -20,8 +20,7 @@
#include "AnimationsAtOnceLimit.h"
static bool AniLimitFixActive = false;
static int aniMax = 32;
//pointers to new animation struct arrays
static BYTE *anim_set;
@@ -143,160 +142,159 @@ static const DWORD sad_28[] = {
0x4173CE, 0x4174C1, 0x4175F1, 0x417730,
};
void AnimationsAtOnceInit(signed char aniMax) {
void AnimationsAtOnceInit() {
aniMax = GetPrivateProfileIntA("Misc", "AnimationsAtOnceLimit", 32, ini);
if (aniMax > 32 && aniMax <= 127) {
dlog("Applying AnimationsAtOnceLimit patch.", DL_INIT);
if (aniMax <= 32) return;
int i;
AniLimitFixActive = true;
//allocate memory to store larger animation struct arrays
anim_set = new BYTE[2656*(aniMax+1)];
sad = new BYTE[3240*(aniMax+1)];
int i;
//set general animation limit check (old 20) aniMax-12 -- +12 reserved for PC movement(4) + other critical animations(8)?
SafeWrite8(0x413C07, aniMax-12);
//allocate memory to store larger animation struct arrays
anim_set = new BYTE[2656*(aniMax+1)];
sad = new BYTE[3240*(aniMax+1)];
//PC movement animation limit checks (old 24) aniMax-8 -- +8 reserved for other critical animations?.
for (i = 0; i < sizeof(AnimPCMove)/4; i++) {
SafeWrite8(AnimPCMove[i], aniMax-8);
}
//set general animation limit check (old 20) aniMax-12 -- +12 reserved for PC movement(4) + other critical animations(8)?
SafeWrite8(0x413C07, aniMax-12);
//Max animation limit checks (old 32) aniMax
for (i = 0; i < sizeof(AnimMaxCheck)/4; i++) {
SafeWrite8(AnimMaxCheck[i], aniMax);
}
//PC movement animation limit checks (old 24) aniMax-8 -- +8 reserved for other critical animations?.
for (i = 0; i < sizeof(AnimPCMove)/4; i++) {
SafeWrite8(AnimPCMove[i], aniMax-8);
//Max animations checks - animation struct size * max num of animations (old 2656*32=84992)
for (i = 0; i < sizeof(AnimMaxSizeCheck)/4; i++) {
SafeWrite32(AnimMaxSizeCheck[i], 2656*aniMax);
}
//divert old animation structure list pointers to newly alocated memory
//struct array 1///////////////////
//old addr 0x54C1B4
SafeWrite32(0x413A9E, (DWORD)anim_set);
//old addr 0x54C1C0
for (i = 0; i < sizeof(fake_anim_set_C)/4; i++) {
SafeWrite32(fake_anim_set_C[i], 12+(DWORD)anim_set);
}
//old addr 0x54CC14
for (i = 0; i < sizeof(anim_set_0)/4; i++) {
SafeWrite32(anim_set_0[i], 2656+(DWORD)anim_set);
}
//old addr 0x54CC18
for (i = 0; i < sizeof(anim_set_4)/4; i++) {
SafeWrite32(anim_set_4[i], 2656+4+(DWORD)anim_set);
}
//old addr 0x54CC1C
for (i = 0; i < sizeof(anim_set_8)/4; i++) {
SafeWrite32(anim_set_8[i], 2656+8+(DWORD)anim_set);
}
//old addr 0x54CC20
for (i = 0; i < sizeof(anim_set_C)/4; i++) {
SafeWrite32(anim_set_C[i], 2656+12+(DWORD)anim_set);
}
//old addr 0x54CC24
for (i = 0; i < sizeof(anim_set_10)/4; i++) {
SafeWrite32(anim_set_10[i], 2656+16+(DWORD)anim_set);
}
//old addr 0x54CC28
for (i = 0; i < sizeof(anim_set_14)/4; i++) {
SafeWrite32(anim_set_14[i], 2656+20+(DWORD)anim_set);
}
//old addr 0x54CC38
SafeWrite32(0x413F29, 2656+36+(DWORD)anim_set);
//old addr 0x54CC3C
for (i = 0; i < sizeof(anim_set_28)/4; i++) {
SafeWrite32(anim_set_28[i], 2656+40+(DWORD)anim_set);
}
//old addr 0x54CC48
SafeWrite32(0x415C35, 2656+52+(DWORD)anim_set);
//struct array 2///////////////////
//old addr 0x530014
for (i = 0; i < sizeof(sad_0)/4; i++) {
SafeWrite32(sad_0[i], (DWORD)sad);
}
//old addr 0x530018
for (i = 0; i < sizeof(sad_4)/4; i++) {
SafeWrite32(sad_4[i], 4+(DWORD)sad);
}
//old addr 0x53001C
for (i = 0; i < sizeof(sad_8)/4; i++) {
SafeWrite32(sad_8[i], 8+(DWORD)sad);
}
//old addr 0x530020
for (i = 0; i < sizeof(sad_C)/4; i++) {
SafeWrite32(sad_C[i], 12+(DWORD)sad);
}
//old addr 0x530024
for (i = 0; i < sizeof(sad_10)/4; i++) {
SafeWrite32(sad_10[i], 16+(DWORD)sad);
}
//old addr 0x530028
for (i = 0; i < sizeof(sad_14)/4; i++) {
SafeWrite32(sad_14[i], 20+(DWORD)sad);
}
//old addr 0x53002C
for (i = 0; i < sizeof(sad_18)/4; i++) {
SafeWrite32(sad_18[i], 24+(DWORD)sad);
}
//old addr 0x530030
for (i = 0; i < sizeof(sad_1C)/4; i++) {
SafeWrite32(sad_1C[i], 28+(DWORD)sad);
}
//old addr 0x530034
for (i = 0; i < sizeof(sad_20)/4; i++) {
SafeWrite32(sad_20[i], 32+(DWORD)sad);
}
//old addr 0x530038
for (i = 0; i < sizeof(sad_24)/4; i++) {
SafeWrite32(sad_24[i], 36+(DWORD)sad);
}
//old addr 0x53003A
SafeWrite32(0x416903, 38+(DWORD)sad);
//old addr 0x53003B
for (i = 0; i < sizeof(sad_27)/4; i++) {
SafeWrite32(sad_27[i], 39+(DWORD)sad);
}
//old addr 0x53003C
for (i = 0; i < sizeof(sad_28)/4; i++) {
SafeWrite32(sad_28[i], 40+(DWORD)sad);
}
dlogr(" Done", DL_INIT);
}
//Max animation limit checks (old 32) aniMax
for (i = 0; i < sizeof(AnimMaxCheck)/4; i++) {
SafeWrite8(AnimMaxCheck[i], aniMax);
}
//Max animations checks - animation struct size * max num of animations (old 2656*32=84992)
for (i = 0; i < sizeof(AnimMaxSizeCheck)/4; i++) {
SafeWrite32(AnimMaxSizeCheck[i], 2656*aniMax);
}
//divert old animation structure list pointers to newly alocated memory
//struct array 1///////////////////
//old addr 0x54C1B4
SafeWrite32(0x413A9E, (DWORD)anim_set);
//old addr 0x54C1C0
for (i = 0; i < sizeof(fake_anim_set_C)/4; i++) {
SafeWrite32(fake_anim_set_C[i], 12+(DWORD)anim_set);
}
//old addr 0x54CC14
for (i = 0; i < sizeof(anim_set_0)/4; i++) {
SafeWrite32(anim_set_0[i], 2656+(DWORD)anim_set);
}
//old addr 0x54CC18
for (i = 0; i < sizeof(anim_set_4)/4; i++) {
SafeWrite32(anim_set_4[i], 2656+4+(DWORD)anim_set);
}
//old addr 0x54CC1C
for (i = 0; i < sizeof(anim_set_8)/4; i++) {
SafeWrite32(anim_set_8[i], 2656+8+(DWORD)anim_set);
}
//old addr 0x54CC20
for (i = 0; i < sizeof(anim_set_C)/4; i++) {
SafeWrite32(anim_set_C[i], 2656+12+(DWORD)anim_set);
}
//old addr 0x54CC24
for (i = 0; i < sizeof(anim_set_10)/4; i++) {
SafeWrite32(anim_set_10[i], 2656+16+(DWORD)anim_set);
}
//old addr 0x54CC28
for (i = 0; i < sizeof(anim_set_14)/4; i++) {
SafeWrite32(anim_set_14[i], 2656+20+(DWORD)anim_set);
}
//old addr 0x54CC38
SafeWrite32(0x413F29, 2656+36+(DWORD)anim_set);
//old addr 0x54CC3C
for (i = 0; i < sizeof(anim_set_28)/4; i++) {
SafeWrite32(anim_set_28[i], 2656+40+(DWORD)anim_set);
}
//old addr 0x54CC48
SafeWrite32(0x415C35, 2656+52+(DWORD)anim_set);
//struct array 2///////////////////
//old addr 0x530014
for (i = 0; i < sizeof(sad_0)/4; i++) {
SafeWrite32(sad_0[i], (DWORD)sad);
}
//old addr 0x530018
for (i = 0; i < sizeof(sad_4)/4; i++) {
SafeWrite32(sad_4[i], 4+(DWORD)sad);
}
//old addr 0x53001C
for (i = 0; i < sizeof(sad_8)/4; i++) {
SafeWrite32(sad_8[i], 8+(DWORD)sad);
}
//old addr 0x530020
for (i = 0; i < sizeof(sad_C)/4; i++) {
SafeWrite32(sad_C[i], 12+(DWORD)sad);
}
//old addr 0x530024
for (i = 0; i < sizeof(sad_10)/4; i++) {
SafeWrite32(sad_10[i], 16+(DWORD)sad);
}
//old addr 0x530028
for (i = 0; i < sizeof(sad_14)/4; i++) {
SafeWrite32(sad_14[i], 20+(DWORD)sad);
}
//old addr 0x53002C
for (i = 0; i < sizeof(sad_18)/4; i++) {
SafeWrite32(sad_18[i], 24+(DWORD)sad);
}
//old addr 0x530030
for (i = 0; i < sizeof(sad_1C)/4; i++) {
SafeWrite32(sad_1C[i], 28+(DWORD)sad);
}
//old addr 0x530034
for (i = 0; i < sizeof(sad_20)/4; i++) {
SafeWrite32(sad_20[i], 32+(DWORD)sad);
}
//old addr 0x530038
for (i = 0; i < sizeof(sad_24)/4; i++) {
SafeWrite32(sad_24[i], 36+(DWORD)sad);
}
//old addr 0x53003A
SafeWrite32(0x416903, 38+(DWORD)sad);
//old addr 0x53003B
for (i = 0; i < sizeof(sad_27)/4; i++) {
SafeWrite32(sad_27[i], 39+(DWORD)sad);
}
//old addr 0x53003C
for (i = 0; i < sizeof(sad_28)/4; i++) {
SafeWrite32(sad_28[i], 40+(DWORD)sad);
}
}
void AnimationsAtOnceExit() {
if (!AniLimitFixActive) return;
if (aniMax <= 32) return;
delete[] anim_set;
delete[] sad;
}
+1 -1
View File
@@ -20,7 +20,7 @@
#pragma once
void AnimationsAtOnceInit(signed char aniMax);
void AnimationsAtOnceInit();
void AnimationsAtOnceExit();
+1 -1
View File
@@ -46,7 +46,7 @@ void dlog_f(const char *fmt, int type, ...) {
va_list args;
va_start(args, type);
char buf[4096];
vsnprintf_s(buf, sizeof buf, _TRUNCATE, fmt, args);
vsnprintf_s(buf, sizeof(buf), _TRUNCATE, fmt, args);
Log << buf;
Log.flush();
va_end(args);
+6 -6
View File
@@ -244,7 +244,7 @@ public:
va_list args;
va_start(args, fmt);
char msg[1024];
vsnprintf_s(msg, sizeof msg, _TRUNCATE, fmt, args);
vsnprintf_s(msg, sizeof(msg), _TRUNCATE, fmt, args);
va_end(args);
const char* procName = FindCurrentProc(_program);
@@ -391,7 +391,7 @@ static DWORD MotionSensorMode;
static BYTE toggleHighlightsKey;
static DWORD HighlightContainers;
static DWORD Color_Containers;
static signed char idle;
static int idle;
static char HighlightFail1[128];
static char HighlightFail2[128];
@@ -1195,7 +1195,7 @@ void ScriptExtenderSetup() {
GetPrivateProfileStringA("Sfall", "HighlightFail2", "Your motion sensor is out of charge.", HighlightFail2, 128, translationIni);
idle = GetPrivateProfileIntA("Misc", "ProcessorIdle", -1, ini);
if (idle > -1) {
if (idle > -1 && idle <= 127) {
SafeWrite32(_idle_func, (DWORD)Sleep);
SafeWrite8(0x4C9F12, 0x6A); // push
SafeWrite8(0x4C9F13, idle);
@@ -1740,7 +1740,7 @@ void AfterAttackCleanup() {
}
static void RunGlobalScripts1() {
if (idle > -1) Sleep(idle);
if (idle > -1 && idle <= 127) Sleep(idle);
if (toggleHighlightsKey) {
//0x48C294 to toggle
if (KeyDown(toggleHighlightsKey)) {
@@ -1786,7 +1786,7 @@ static void RunGlobalScripts1() {
}
void RunGlobalScripts2() {
if (idle > -1) Sleep(idle);
if (idle > -1 && idle <= 127) Sleep(idle);
for (DWORD d = 0; d < globalScripts.size(); d++) {
if (!globalScripts[d].repeat || globalScripts[d].mode != 1) continue;
if (++globalScripts[d].count >= globalScripts[d].repeat) {
@@ -1796,7 +1796,7 @@ void RunGlobalScripts2() {
ResetStateAfterFrame();
}
void RunGlobalScripts3() {
if (idle > -1) Sleep(idle);
if (idle > -1 && idle <= 127) Sleep(idle);
for (DWORD d = 0; d < globalScripts.size(); d++) {
if (!globalScripts[d].repeat || (globalScripts[d].mode != 2 && globalScripts[d].mode != 3)) continue;
if (++globalScripts[d].count >= globalScripts[d].repeat) {
+1 -6
View File
@@ -1378,12 +1378,7 @@ static void DllMain2() {
dlogr("Patching out ereg call.", DL_INIT);
BlockCall(0x4425E6);
tmp = GetPrivateProfileIntA("Misc", "AnimationsAtOnceLimit", 32, ini);
if ((signed char)tmp > 32) {
dlog("Applying AnimationsAtOnceLimit patch.", DL_INIT);
AnimationsAtOnceInit((signed char)tmp);
dlogr(" Done", DL_INIT);
}
AnimationsAtOnceInit();
if (GetPrivateProfileIntA("Misc", "RemoveCriticalTimelimits", 0, ini)) {
dlog("Removing critical time limits.", DL_INIT);
+1 -1
View File
@@ -55,7 +55,7 @@ T SimplePatch(DWORD *addrs, int numAddrs, const char* iniSection, const char* in
value = minValue;
else if (value > maxValue)
value = maxValue;
_snprintf_s(msg, sizeof msg, _TRUNCATE, "Applying patch: %s = %d.", iniKey, value);
_snprintf_s(msg, sizeof(msg), _TRUNCATE, "Applying patch: %s = %d.", iniKey, value);
dlog((const char *)msg, DL_INIT);
for (int i=0; i<numAddrs; i++)
SafeWrite<T>(addrs[i], (T)value);