Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MOD: Unpacker #161

Draft
wants to merge 3 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions config/globals.csv
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
_g_BulletTypeInfos, 0x0046a6e8
_g_TextureFormatD3D8Mapping, 0x0046c220
_g_StageFiles, 0x004760e0
_g_EffectsColorWithTextureBlending, 0x00476358
_g_EffectsColorWithoutTextureBlending, 0x004763c8
_g_EffectsColor, 0x00476438
_g_ExtraLivesScores, 0x004764b0
_g_EclFiles, 0x004764c4
_g_AnmStageFiles, 0x004764e8
Expand Down Expand Up @@ -27,7 +31,9 @@ _g_EnemyManager, 0x004b79c8
_g_EnemyManagerDrawChain, 0x004b79a8
_g_RunningSpellcardInfo, 0x005a5f8c
_g_EnemyManagerCalcChain, 0x005a5fb4
_g_BulletManagerDrawChain, 0x005a5fd8
_g_BulletManager, 0x005a5ff8
_g_BulletManagerCalcChain, 0x0069bc10
_g_Gui, 0x0069bc30
_g_GameManager, 0x0069bca0
_g_GameManagerDrawChain, 0x0069d740
Expand Down
2 changes: 2 additions & 0 deletions config/implemented.csv
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ AnmManager::SetupVertexBuffer
AnmManager::SetRenderStateForVm
AnmManager::TranslateRotation
AnmManager::ExecuteAnmIdx
BulletManager::RegisterChain
BulletManager::AddedCallback
ChainElem::ChainElem
ChainElem::~ChainElem
Chain::CreateElem
Expand Down
8 changes: 4 additions & 4 deletions config/mapping.csv
Original file line number Diff line number Diff line change
Expand Up @@ -130,12 +130,12 @@ BulletManager::FUN_00414360,0x414360,0x25f,__thiscall,i32,BulletManager*,i32,i32
BulletManager::SpawnBullet,0x4145c0,0xa5,__thiscall,u32,BulletManager*,EnemyBulletShooter*
AnmVm::FUN_00414670,0x414670,0x27b,unknown,void*,EnemyLaserShooter*
BulletManager::RegisterChain,0x4148f0,0xd3,default,ZunResult,char*
BulletManager::OnUpdate,0x4149d0,0x1b10,__stdcall,u32,BulletManager*
BulletManager::OnDraw,0x416500,0x647,__stdcall,ChainCallbackResult,BulletManager*
BulletManager::OnUpdate,0x4149d0,0x1b10,default,ChainCallbackResult,BulletManager*
BulletManager::OnDraw,0x416500,0x647,default,ChainCallbackResult,BulletManager*
FUN_00416b50,0x416b50,0xea,__stdcall,void,Bullet*
FUN_00416c50,0x416c50,0xf4,__stdcall,void,Bullet*
BulletManager::AddedCallback,0x416d60,0x509,__stdcall,ZunResult,BulletManager*
BulletManager::DeletedCallback,0x417270,0x31,__stdcall,ZunResult,BulletManager*
BulletManager::AddedCallback,0x416d60,0x509,default,ZunResult,BulletManager*
BulletManager::DeletedCallback,0x417270,0x31,default,ZunResult,BulletManager*
CutBulletManagerChains,0x4172b0,0x23,unknown,u8
Gui::FUN_004172d3,0x4172d3,0x41,__thiscall,u32,Gui*
Gui::FUN_00417314,0x417314,0x18,__thiscall,void,Gui*
Expand Down
5 changes: 4 additions & 1 deletion config/stubbed.csv
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,10 @@ EnemyManager::Initialize
EnemyManager::OnUpdate
EnemyManager::OnDraw
EnemyManager::DeletedCallback
BulletManager::RegisterChain
BulletManager::DeletedCallback
BulletManager::OnUpdate
BulletManager::OnDraw
BulletManager::InitializeToZero
BulletManager::RemoveAllBullets
ItemManager::SpawnItem
Stage::RegisterChain
Expand Down
32 changes: 32 additions & 0 deletions src/AnmIdx.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
#define ANM_FILE_ASCIIS 2
#define ANM_FILE_CAPTURE 3
#define ANM_FILE_PLAYER 5
#define ANM_FILE_BULLET3 6
#define ANM_FILE_BULLET4 7
#define ANM_FILE_ENEMY 8
#define ANM_FILE_ENEMY2 9
#define ANM_FILE_EFFECTS 11
Expand All @@ -26,6 +28,8 @@
#define ANM_OFFSET_REPLAY 0x160
#define ANM_OFFSET_TITLE01S 0x17a
#define ANM_OFFSET_TITLE04S 0x195
#define ANM_OFFSET_BULLET3 0x200
#define ANM_OFFSET_BULLET4 0x29a
#define ANM_OFFSET_EFFECTS 0x2b3
#define ANM_OFFSET_PLAYER 0x400
#define ANM_OFFSET_TEXT 0x700
Expand Down Expand Up @@ -55,6 +59,34 @@
#define ANM_SCRIPT_REPLAY_START ANM_OFFSET_REPLAY
#define ANM_SCRIPT_REPLAY_END 0x179

#define ANM_SCRIPT_BULLET3_START ANM_OFFSET_BULLET3
#define ANM_SCRIPT_BULLET3_PELLET (ANM_SCRIPT_BULLET3_START + 0)
#define ANM_SCRIPT_BULLET3_RING_BALL (ANM_SCRIPT_BULLET3_START + 1)
#define ANM_SCRIPT_BULLET3_RICE (ANM_SCRIPT_BULLET3_START + 2)
#define ANM_SCRIPT_BULLET3_BALL (ANM_SCRIPT_BULLET3_START + 3)
#define ANM_SCRIPT_BULLET3_KUNAI (ANM_SCRIPT_BULLET3_START + 4)
#define ANM_SCRIPT_BULLET3_SHARD (ANM_SCRIPT_BULLET3_START + 5)
#define ANM_SCRIPT_BULLET3_BIG_BALL (ANM_SCRIPT_BULLET3_START + 6)
#define ANM_SCRIPT_BULLET3_FIREBALL (ANM_SCRIPT_BULLET3_START + 7)
#define ANM_SCRIPT_BULLET3_DAGGER (ANM_SCRIPT_BULLET3_START + 8)
#define ANM_SCRIPT_BULLET3_SPAWN_DONUT_SMALL (ANM_SCRIPT_BULLET3_START + 11)
#define ANM_SCRIPT_BULLET3_SPAWN_DONUT_MEDIUM (ANM_SCRIPT_BULLET3_START + 12)
#define ANM_SCRIPT_BULLET3_SPAWN_DONUT_BIG (ANM_SCRIPT_BULLET3_START + 13)
#define ANM_SCRIPT_BULLET3_SPAWN_PELLET_FAST (ANM_SCRIPT_BULLET3_START + 14)
#define ANM_SCRIPT_BULLET3_SPAWN_PELLET_NORMAL (ANM_SCRIPT_BULLET3_START + 15)
#define ANM_SCRIPT_BULLET3_SPAWN_PELLET_SLOW (ANM_SCRIPT_BULLET3_START + 16)
#define ANM_SCRIPT_BULLET3_SPAWN_BIG_BALL_FAST (ANM_SCRIPT_BULLET3_START + 17)
#define ANM_SCRIPT_BULLET3_SPAWN_BIG_BALL_NORMAL (ANM_SCRIPT_BULLET3_START + 18)
#define ANM_SCRIPT_BULLET3_SPAWN_BIG_BALL_SLOW (ANM_SCRIPT_BULLET3_START + 19)
#define ANM_SCRIPT_BULLET3_SPAWN_BIG_BALL_HUGE (ANM_SCRIPT_BULLET3_START + 20)
#define ANM_SCRIPT_BULLET3_END 0x21b

#define ANM_SCRIPT_BULLET4_START ANM_OFFSET_BULLET4
#define ANM_SCRIPT_BULLET4_BUBBLE (ANM_SCRIPT_BULLET4_START + 0)
#define ANM_SCRIPT_BULLET4_SPAWN_BUBBLE_NORMAL (ANM_SCRIPT_BULLET4_START + 1)
#define ANM_SCRIPT_BULLET4_SPAWN_BUBBLE_SLOW (ANM_SCRIPT_BULLET4_START + 2)
#define ANM_SCRIPT_BULLET4_END 0x2ae

#define ANM_SCRIPT_EFFECTS_START ANM_OFFSET_EFFECTS
#define ANM_SCRIPT_EFFECTS_END 0x2b3

Expand Down
167 changes: 167 additions & 0 deletions src/BulletManager.cpp
Original file line number Diff line number Diff line change
@@ -1,3 +1,170 @@
#include "BulletManager.hpp"
#include "AnmManager.hpp"
#include "Chain.hpp"
#include "ChainPriorities.hpp"
#include "ItemManager.hpp"

DIFFABLE_STATIC(BulletManager, g_BulletManager);
DIFFABLE_STATIC(ChainElem, g_BulletManagerCalcChain);
DIFFABLE_STATIC(ChainElem, g_BulletManagerDrawChain);
DIFFABLE_STATIC_ARRAY_ASSIGN(u32, 28, g_EffectsColorWithTextureBlending) = {
0xff000000, 0xff303030, 0xff606060, 0xff500000, 0xff900000, 0xffff2020, 0xff400040,
0xff800080, 0xffff30ff, 0xff000050, 0xff000090, 0xff2020ff, 0xff203060, 0xff304090,
0xff3080ff, 0xff005000, 0xff009000, 0xff20ff20, 0xff206000, 0xff409010, 0xff80ff20,
0xff505000, 0xff909000, 0xffffff20, 0xff603000, 0xff904010, 0xfff08020, 0xffffffff};

DIFFABLE_STATIC_ARRAY_ASSIGN(u32, 28, g_EffectsColorWithoutTextureBlending) = {
0xfff0f0f0, 0xfff0f0f0, 0xffffffff, 0xffffe0e0, 0xffffe0e0, 0xffffe0e0, 0xffffe0ff,
0xffffe0ff, 0xffffe0ff, 0xffe0e0ff, 0xffe0e0ff, 0xffe0e0ff, 0xffe0ffff, 0xffe0ffff,
0xffe0ffff, 0xffe0ffe0, 0xffe0ffe0, 0xffe0ffe0, 0xffe0ffe0, 0xffe0ffe0, 0xffe0ffe0,
0xffffffe0, 0xffffffe0, 0xffffffe0, 0xffffe0e0, 0xffffe0e0, 0xffffe0e0, 0xffffffff};
DIFFABLE_STATIC_ASSIGN(u32 *, g_EffectsColor) = g_EffectsColorWithTextureBlending;

struct BulletTypeInfo
{
u32 bulletAnmScriptIdx;
u32 bulletSpawnEffectFastAnmScriptIdx;
u32 bulletSpawnEffectNormalAnmScriptIdx;
u32 bulletSpawnEffectSlowAnmScriptIdx;
u32 bulletSpawnEffectDonutAnmScriptIdx;
};

#define ASB3(x) ANM_SCRIPT_BULLET3_##x
#define ASB4(x) ANM_SCRIPT_BULLET4_##x
DIFFABLE_STATIC_ARRAY_ASSIGN(BulletTypeInfo, 10, g_BulletTypeInfos) = {
{ASB3(PELLET), ASB3(SPAWN_PELLET_FAST), ASB3(SPAWN_PELLET_NORMAL), ASB3(SPAWN_PELLET_SLOW),
ASB3(SPAWN_DONUT_SMALL)},
{ASB3(RING_BALL), ASB3(SPAWN_BIG_BALL_FAST), ASB3(SPAWN_BIG_BALL_NORMAL), ASB3(SPAWN_BIG_BALL_SLOW),
ASB3(SPAWN_DONUT_MEDIUM)},
{ASB3(RICE), ASB3(SPAWN_BIG_BALL_FAST), ASB3(SPAWN_BIG_BALL_NORMAL), ASB3(SPAWN_BIG_BALL_SLOW),
ASB3(SPAWN_DONUT_MEDIUM)},
{ASB3(BALL), ASB3(SPAWN_BIG_BALL_FAST), ASB3(SPAWN_BIG_BALL_NORMAL), ASB3(SPAWN_BIG_BALL_SLOW),
ASB3(SPAWN_DONUT_MEDIUM)},
{ASB3(KUNAI), ASB3(SPAWN_BIG_BALL_FAST), ASB3(SPAWN_BIG_BALL_NORMAL), ASB3(SPAWN_BIG_BALL_SLOW),
ASB3(SPAWN_DONUT_MEDIUM)},
{ASB3(SHARD), ASB3(SPAWN_BIG_BALL_FAST), ASB3(SPAWN_BIG_BALL_NORMAL), ASB3(SPAWN_BIG_BALL_SLOW),
ASB3(SPAWN_DONUT_MEDIUM)},
{ASB3(BIG_BALL), ASB3(SPAWN_BIG_BALL_HUGE), ASB3(SPAWN_BIG_BALL_HUGE), ASB3(SPAWN_BIG_BALL_HUGE),
ASB3(SPAWN_DONUT_BIG)},
{ASB3(FIREBALL), ASB3(SPAWN_BIG_BALL_HUGE), ASB3(SPAWN_BIG_BALL_HUGE), ASB3(SPAWN_BIG_BALL_HUGE),
ASB3(SPAWN_DONUT_BIG)},
{ASB3(DAGGER), ASB3(SPAWN_BIG_BALL_HUGE), ASB3(SPAWN_BIG_BALL_HUGE), ASB3(SPAWN_BIG_BALL_HUGE),
ASB3(SPAWN_DONUT_BIG)},
{ASB4(BUBBLE), ASB4(SPAWN_BUBBLE_SLOW), ASB4(SPAWN_BUBBLE_SLOW), ASB4(SPAWN_BUBBLE_SLOW),
ASB4(SPAWN_BUBBLE_NORMAL)},
};

ZunResult BulletManager::RegisterChain(char *bulletAnmPath)
{
BulletManager *mgr = &g_BulletManager;
if (((g_Supervisor.cfg.opts >> GCOS_USE_D3D_HW_TEXTURE_BLENDING) & 1) == 0)
{
g_EffectsColor = g_EffectsColorWithTextureBlending;
}
else
{
g_EffectsColor = g_EffectsColorWithoutTextureBlending;
}
mgr->InitializeToZero();
mgr->bulletAnmPath = bulletAnmPath;
g_BulletManagerCalcChain.callback = (ChainCallback)BulletManager::OnUpdate;
g_BulletManagerCalcChain.addedCallback = NULL;
g_BulletManagerCalcChain.deletedCallback = NULL;
g_BulletManagerCalcChain.addedCallback = (ChainAddedCallback)BulletManager::AddedCallback;
g_BulletManagerCalcChain.deletedCallback = (ChainDeletedCallback)BulletManager::DeletedCallback;
g_BulletManagerCalcChain.arg = mgr;
if (g_Chain.AddToCalcChain(&g_BulletManagerCalcChain, TH_CHAIN_PRIO_CALC_BULLETMANAGER) != ZUN_SUCCESS)
{
return ZUN_ERROR;
}
g_BulletManagerDrawChain.callback = (ChainCallback)BulletManager::OnDraw;
g_BulletManagerDrawChain.addedCallback = NULL;
g_BulletManagerDrawChain.deletedCallback = NULL;
g_BulletManagerDrawChain.arg = mgr;
g_Chain.AddToDrawChain(&g_BulletManagerDrawChain, TH_CHAIN_PRIO_DRAW_BULLETMANAGER);
return ZUN_SUCCESS;
}

ZunResult BulletManager::AddedCallback(BulletManager *mgr)
{
u32 idx;

if ((ZunBool)(g_Supervisor.curState != SUPERVISOR_STATE_GAMEMANAGER_REINIT))
{
if (g_AnmManager->LoadAnm(ANM_FILE_BULLET3, "data/etama3.anm", ANM_OFFSET_BULLET3) != ZUN_SUCCESS)
{
return ZUN_ERROR;
}
if (g_AnmManager->LoadAnm(ANM_FILE_BULLET4, "data/etama4.anm", ANM_OFFSET_BULLET4) != ZUN_SUCCESS)
{
return ZUN_ERROR;
}
}
for (idx = 0; idx < 10; idx++)
{
g_AnmManager->SetAndExecuteScriptIdx(&mgr->bulletTypeTemplates[idx].spriteBullet,
g_BulletTypeInfos[idx].bulletAnmScriptIdx);
g_AnmManager->SetAndExecuteScriptIdx(&mgr->bulletTypeTemplates[idx].spriteSpawnEffectFast,
g_BulletTypeInfos[idx].bulletSpawnEffectFastAnmScriptIdx);
g_AnmManager->SetAndExecuteScriptIdx(&mgr->bulletTypeTemplates[idx].spriteSpawnEffectNormal,
g_BulletTypeInfos[idx].bulletSpawnEffectNormalAnmScriptIdx);
g_AnmManager->SetAndExecuteScriptIdx(&mgr->bulletTypeTemplates[idx].spriteSpawnEffectSlow,
g_BulletTypeInfos[idx].bulletSpawnEffectSlowAnmScriptIdx);
g_AnmManager->SetAndExecuteScriptIdx(&mgr->bulletTypeTemplates[idx].spriteSpawnEffectDonut,
g_BulletTypeInfos[idx].bulletSpawnEffectDonutAnmScriptIdx);
mgr->bulletTypeTemplates[idx].spriteBullet.baseSpriteIndex =
mgr->bulletTypeTemplates[idx].spriteBullet.activeSpriteIndex;
mgr->bulletTypeTemplates[idx].bulletHeight = mgr->bulletTypeTemplates[idx].spriteBullet.sprite->heightPx;
if (mgr->bulletTypeTemplates[idx].spriteBullet.sprite->heightPx <= 8.0f)
{
mgr->bulletTypeTemplates[idx].grazeSize.x = 4.0f;
mgr->bulletTypeTemplates[idx].grazeSize.y = 4.0f;
}
else if (mgr->bulletTypeTemplates[idx].spriteBullet.sprite->heightPx <= 16.0f)
{
switch (g_BulletTypeInfos[idx].bulletAnmScriptIdx)
{
case ANM_SCRIPT_BULLET3_RICE:
mgr->bulletTypeTemplates[idx].grazeSize.x = 4.0f;
mgr->bulletTypeTemplates[idx].grazeSize.y = 4.0f;
break;
case ANM_SCRIPT_BULLET3_KUNAI:
mgr->bulletTypeTemplates[idx].grazeSize.x = 5.0f;
mgr->bulletTypeTemplates[idx].grazeSize.y = 5.0f;
break;
case ANM_SCRIPT_BULLET3_SHARD:
mgr->bulletTypeTemplates[idx].grazeSize.x = 4.0f;
mgr->bulletTypeTemplates[idx].grazeSize.y = 4.0f;
break;
default:
mgr->bulletTypeTemplates[idx].grazeSize.x = 6.0f;
mgr->bulletTypeTemplates[idx].grazeSize.y = 6.0f;
break;
}
}
else if (mgr->bulletTypeTemplates[idx].spriteBullet.sprite->heightPx <= 32.0f)
{
switch (g_BulletTypeInfos[idx].bulletAnmScriptIdx)
{
case ANM_SCRIPT_BULLET3_FIREBALL:
mgr->bulletTypeTemplates[idx].grazeSize.x = 11.0f;
mgr->bulletTypeTemplates[idx].grazeSize.y = 11.0f;
break;
case ANM_SCRIPT_BULLET3_DAGGER:
mgr->bulletTypeTemplates[idx].grazeSize.x = 9.0f;
mgr->bulletTypeTemplates[idx].grazeSize.y = 9.0f;
break;
default:
mgr->bulletTypeTemplates[idx].grazeSize.x = 16.0f;
mgr->bulletTypeTemplates[idx].grazeSize.y = 16.0f;
}
}
else
{
mgr->bulletTypeTemplates[idx].grazeSize.x = 32.0f;
mgr->bulletTypeTemplates[idx].grazeSize.y = 32.0f;
}
}
memset(&g_ItemManager, 0, sizeof(ItemManager));
return ZUN_SUCCESS;
}
82 changes: 81 additions & 1 deletion src/BulletManager.hpp
Original file line number Diff line number Diff line change
@@ -1,15 +1,95 @@
#pragma once

#include "AnmVm.hpp"
#include "ZunBool.hpp"
#include "ZunResult.hpp"
#include "diffbuild.hpp"
#include "inttypes.hpp"

struct BulletTypeSprites
{
AnmVm spriteBullet;
AnmVm spriteSpawnEffectFast;
AnmVm spriteSpawnEffectNormal;
AnmVm spriteSpawnEffectSlow;
AnmVm spriteSpawnEffectDonut;

D3DXVECTOR3 grazeSize;
u8 unk_55c;
u8 bulletHeight;
};
C_ASSERT(sizeof(BulletTypeSprites) == 0x560);

struct Bullet
{
BulletTypeSprites sprites;
D3DXVECTOR3 pos;
D3DXVECTOR3 velocity;
D3DXVECTOR3 ex4Acceleration;
f32 speed;
f32 ex5Float0;
f32 dirChangeSpeed;
f32 angle;
f32 ex5Float1;
f32 dirChangeRotation;
ZunTimer timer;
i32 ex5Int0;
i32 dirChangeInterval;
i32 dirChangeNumTimes;
i32 dirChangeMaxTimes;
u16 exFlags;
u16 color;
u16 unk_5bc;
u16 state;
u16 unk_5c0;
u8 unk_5c2;
u8 unk_5c3;
};
C_ASSERT(sizeof(Bullet) == 0x5c4);

struct Laser
{
AnmVm vm0;
AnmVm vm1;
D3DXVECTOR3 pos;
f32 angle;
f32 startOffset;
f32 endOffset;
f32 startLength;
f32 width;
f32 speed;
i32 startTime;
i32 grazeDelay;
i32 duration;
i32 endTime;
i32 grazeInterval;
i32 inUse;
ZunTimer timer;
i16 flags;
i16 color;
u8 state;
};
C_ASSERT(sizeof(Laser) == 0x270);

struct BulletManager
{
static ZunResult RegisterChain(char *bulletAnmFile);
static ZunResult RegisterChain(char *bulletAnmPath);
static ZunResult AddedCallback(BulletManager *mgr);
static ZunResult DeletedCallback(BulletManager *mgr);
static ChainCallbackResult OnUpdate(BulletManager *mgr);
static ChainCallbackResult OnDraw(BulletManager *mgr);

void RemoveAllBullets(ZunBool turnIntoItem);
void InitializeToZero();

BulletTypeSprites bulletTypeTemplates[16];
Bullet bullets[640];
Laser lasers[64];
i32 nextBulletIndex;
i32 bulletCount;
ZunTimer time;
char *bulletAnmPath;
};
C_ASSERT(sizeof(BulletManager) == 0xf5c18);

DIFFABLE_EXTERN(BulletManager, g_BulletManager);
2 changes: 2 additions & 0 deletions src/ChainPriorities.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#define TH_CHAIN_PRIO_CALC_PLAYER 7
#define TH_CHAIN_PRIO_CALC_ENEMYMANAGER 9
#define TH_CHAIN_PRIO_CALC_EFFECTMANAGER 10
#define TH_CHAIN_PRIO_CALC_BULLETMANAGER 11

#define TH_CHAIN_PRIO_DRAW_MAINMENU 0
#define TH_CHAIN_PRIO_DRAW_GAMEMANAGER 2
Expand All @@ -17,6 +18,7 @@
#define TH_CHAIN_PRIO_DRAW_ENEMYMANAGER 6
#define TH_CHAIN_PRIO_DRAW_HIGH_PRIO_PLAYER 7
#define TH_CHAIN_PRIO_DRAW_EFFECTMANAGER 8
#define TH_CHAIN_PRIO_DRAW_BULLETMANAGER 9
#define TH_CHAIN_PRIO_DRAW_ASCIIMANAGER_POPUPS 10
#define TH_CHAIN_PRIO_DRAW_SUPERVISOR 14
#define TH_CHAIN_PRIO_DRAW_ASCIIMANAGER_MENUS 15
Loading
Loading