Batch #4132 by youko: 0 byte-identical, 13 confirmed by peer review. - fn_10070 RouletteMgr::RouletteMgr: logic confirmed by peer review - fn_10072 RouletteMgr::AddItem: logic confirmed by peer review - fn_10074 RouletteMgr::Create: logic confirmed by peer review - fn_10075 RouletteMgr::Destroy: logic confirmed by peer review - fn_10076 RouletteMgr::Draw: logic confirmed by peer review - fn_10078 RouletteMgr::SetAdditionItem: logic confirmed by peer review - fn_10079 RouletteMgr::StartSpin: logic confirmed by peer review - fn_10080 RouletteMgr::SetQuad: logic confirmed by peer review - fn_10081 RouletteMgr::SetResult: logic confirmed by peer review - fn_10084 UIRoulletteWnd::`scalar deleting destructor': logic confirmed by peer review - fn_10094 UIRoulletteWnd::CoinType: logic confirmed by peer review - fn_10099 CCharacterRender::CCharacterRender: logic confirmed by peer review - fn_10101 CCharacterRender::`scalar deleting destructor': logic confirmed by peer review Peer-reviewed-by: ragnarok-clanker, Yommy, superintelligence, willerthal, OvoKore, Gravity Accepted without human review: peers confirmed the logic ("same" ahead by at least 3, with 70% of the votes).
198 lines
5 KiB
C++
198 lines
5 KiB
C++
#include "Contents/RouletteMgr.h"
|
|
#include "Render/Renderer.h"
|
|
#include "Render/TextureQuad.h"
|
|
#include "Render/Textures/TextureCache.h"
|
|
#include "UI/Window/UIRoulletteWnd.h"
|
|
#include "UI/Window/UIWindowMgr.h"
|
|
|
|
#include <cstring>
|
|
#include <new>
|
|
#include <utility>
|
|
#include <windows.h>
|
|
#include <timeapi.h>
|
|
|
|
// GLOBAL: gl_24688
|
|
RouletteMgr* g_rouletteMgr = nullptr;
|
|
|
|
// OFFSET: 0x0080A310
|
|
// FUNCTION: fn_10070
|
|
RouletteMgr::RouletteMgr() {
|
|
this->m_valid = 0;
|
|
std::memset(&this->m_quads.current, 0, sizeof(this->m_quads.current));
|
|
std::memset(&this->m_quads.start, 0, sizeof(this->m_quads.start));
|
|
std::memset(&this->m_quads.target, 0, sizeof(this->m_quads.target));
|
|
this->unknown_0004 = 0;
|
|
this->m_frame = 0;
|
|
this->m_cycle = 0;
|
|
this->m_spinning = 0;
|
|
this->m_stage = 0;
|
|
this->unknown_0018 = 0;
|
|
this->m_lastTick = 0;
|
|
this->m_interval = 0;
|
|
this->m_index = 0;
|
|
this->m_additionItemId = 0;
|
|
this->m_goldPoint = 0;
|
|
this->m_silverPoint = 0;
|
|
this->m_bronzePoint = 0;
|
|
this->m_resultShown = 0;
|
|
this->m_bonus = 0;
|
|
this->m_resultItem.Reset();
|
|
this->m_additionItem.Reset();
|
|
this->m_valid = 1;
|
|
}
|
|
|
|
// OFFSET: 0x0080A980
|
|
// FUNCTION: fn_10072
|
|
void RouletteMgr::AddItem(RouletteSlot slot) {
|
|
ITEM_INFO item;
|
|
item.SetItemId(slot.itemId);
|
|
item.quantity = slot.count;
|
|
item.identified = 1;
|
|
this->m_items.insert(std::make_pair(slot, item));
|
|
}
|
|
|
|
// OFFSET: 0x0080ABA0
|
|
// FUNCTION: fn_10073
|
|
void RouletteMgr::Reset() {
|
|
std::memset(&this->m_quads, 0, sizeof(this->m_quads));
|
|
this->m_frame = 0;
|
|
this->m_cycle = 0;
|
|
this->m_stage = 0;
|
|
this->unknown_0018 = 0;
|
|
this->m_lastTick = 0;
|
|
this->m_interval = 0;
|
|
this->m_spinning = 0;
|
|
}
|
|
|
|
// OFFSET: 0x0080ABF0
|
|
// FUNCTION: fn_10074
|
|
bool RouletteMgr::Create() {
|
|
if (g_rouletteMgr == nullptr) {
|
|
g_rouletteMgr = new (std::nothrow) RouletteMgr;
|
|
if (g_rouletteMgr != nullptr) {
|
|
if (g_rouletteMgr->m_valid != 0) {
|
|
return true;
|
|
}
|
|
|
|
delete g_rouletteMgr;
|
|
g_rouletteMgr = nullptr;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
// OFFSET: 0x0080ACA0
|
|
// FUNCTION: fn_10075
|
|
void RouletteMgr::Destroy() {
|
|
if (g_rouletteMgr != nullptr) {
|
|
delete g_rouletteMgr;
|
|
g_rouletteMgr = nullptr;
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x0080ACC0
|
|
// FUNCTION: fn_10076
|
|
void RouletteMgr::Draw() {
|
|
RenderCommand* command = g_renderer->commands.Acquire();
|
|
command->texture = g_texMgr.Default();
|
|
command->vertices = this->m_quads.current.vertices;
|
|
command->vertexCount = 6;
|
|
g_renderer->queues.Submit(command, 0x201, g_renderer->fog.supported != 0, g_depthStart, g_depthEnd);
|
|
|
|
this->Update();
|
|
}
|
|
|
|
// OFFSET: 0x0080ADC0
|
|
|
|
// OFFSET: 0x0080B1D0
|
|
// FUNCTION: fn_10078
|
|
void RouletteMgr::SetAdditionItem(int itemId) {
|
|
if (itemId == -1) {
|
|
this->m_additionItem.Reset();
|
|
return;
|
|
}
|
|
|
|
this->m_additionItemId = itemId;
|
|
for (auto it = this->m_items.begin(); it != this->m_items.end(); ++it) {
|
|
if (itemId == it->first.itemId) {
|
|
this->m_additionItem = it->second;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x0080B270
|
|
// FUNCTION: fn_10079
|
|
void RouletteMgr::StartSpin(int x, int y, int originX, int originY) {
|
|
this->SetQuad(x, y, originX, originY);
|
|
for (int i = 0; i < 6; ++i) {
|
|
this->m_quads.start.vertices[i] = this->m_quads.current.vertices[i];
|
|
}
|
|
|
|
const float distance = (8 - this->m_stage) * 36.0f;
|
|
for (int i = 0; i < 6; ++i) {
|
|
this->m_quads.target.vertices[i] = this->m_quads.current.vertices[i];
|
|
this->m_quads.target.vertices[i].x = this->m_quads.current.vertices[i].x - distance;
|
|
}
|
|
|
|
this->m_lastTick = timeGetTime();
|
|
this->m_interval = 35;
|
|
this->m_frame = 0;
|
|
this->m_cycle = 0;
|
|
this->m_spinning = 1;
|
|
this->m_resultShown = 0;
|
|
|
|
g_windowMgr.unknown_0464->m_enabled = 0;
|
|
if (g_windowMgr.unknown_0464) {
|
|
g_windowMgr.unknown_0464->SendMsg(nullptr, 60, 0, 0, 0, 0);
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x0080B490
|
|
// FUNCTION: fn_10080
|
|
void RouletteMgr::SetQuad(int x, int y, int originX, int originY) {
|
|
if (g_renderer->viewport.width == 800 && g_renderer->viewport.height == 600) {
|
|
y += 3;
|
|
originY += 3;
|
|
}
|
|
|
|
const float left = x - 18.0f + originX;
|
|
const float right = x + 18.0f + originX;
|
|
const float top = y - 18.0f + originY + 17.0f;
|
|
const float bottom = y + 18.0f + originY + 17.0f;
|
|
|
|
RenderVertex* vertices = this->m_quads.current.vertices;
|
|
vertices[0].x = left;
|
|
vertices[0].y = bottom;
|
|
vertices[1].x = right;
|
|
vertices[1].y = bottom;
|
|
vertices[2].x = right;
|
|
vertices[2].y = top;
|
|
vertices[3] = vertices[0];
|
|
vertices[4] = vertices[2];
|
|
vertices[5].x = left;
|
|
vertices[5].y = top;
|
|
|
|
for (int i = 0; i < 6; ++i) {
|
|
vertices[i].z = 0.000001f;
|
|
vertices[i].rhw = 0.999999f;
|
|
vertices[i].u = 0.0f;
|
|
vertices[i].v = 0.0f;
|
|
vertices[i].diffuse = 0x44FFFFFF;
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x0080B680
|
|
// FUNCTION: fn_10081
|
|
void RouletteMgr::SetResult(unsigned short index, unsigned char shown, unsigned char bonus) {
|
|
this->m_index = index;
|
|
this->m_resultShown = shown;
|
|
this->m_bonus = bonus;
|
|
|
|
for (auto it = this->m_items.begin(); it != this->m_items.end(); ++it) {
|
|
if (this->m_stage == it->first.row && this->m_index == it->first.column) {
|
|
this->m_resultItem = it->second;
|
|
}
|
|
}
|
|
}
|