From 357dba8f2c6ffba2423fe19b2e9bc6e318616557 Mon Sep 17 00:00:00 2001 From: korenkonder Date: Mon, 17 Jul 2023 08:22:42 +0300 Subject: [PATCH] DwConsole --- src/KKdLib/str_utils.cpp | 88 ++++---- src/KKdLib/str_utils.hpp | 45 ++-- src/ReDIVA/classes/information.cpp | 23 +++ src/ReDIVA/dw_console.cpp | 275 +++++++++++++++++++++++++ src/ReDIVA/dw_console.hpp | 39 ++++ src/ReDIVA/game_state.cpp | 4 + src/ReDIVA/pv_game/pv_game_pv_data.cpp | 55 ++++- src/ReDIVA/render.cpp | 9 +- src/ReDIVA/shared.cpp | 2 +- 9 files changed, 467 insertions(+), 73 deletions(-) create mode 100644 src/ReDIVA/dw_console.cpp create mode 100644 src/ReDIVA/dw_console.hpp diff --git a/src/KKdLib/str_utils.cpp b/src/KKdLib/str_utils.cpp index a3e74416..6b6f110f 100644 --- a/src/KKdLib/str_utils.cpp +++ b/src/KKdLib/str_utils.cpp @@ -41,65 +41,69 @@ bool str_utils_check_ends_with(const wchar_t* str, const wchar_t* mask) { return false; } -const char* str_utils_get_next_int32_t(const char* str, int32_t& value, char separator) { +const char* str_utils_get_next_int32_t(const char* str, int32_t& value, const char split) { std::string s; - str = str_utils_get_next_string(str, s, separator); + str = str_utils_get_next_string(str, s, split); sscanf_s(s.c_str(), "%d", &value); return str; } -const wchar_t* str_utils_get_next_int32_t(const wchar_t* str, int32_t& value, wchar_t separator) { +const wchar_t* str_utils_get_next_int32_t(const wchar_t* str, int32_t& value, const wchar_t split) { std::wstring s; - str = str_utils_get_next_string(str, s, separator); + str = str_utils_get_next_string(str, s, split); swscanf_s(s.c_str(), L"%d", &value); return str; } -const char* str_utils_get_next_float_t(const char* str, float_t& value, char separator) { +const char* str_utils_get_next_float_t(const char* str, float_t& value, const char split) { std::string s; - str = str_utils_get_next_string(str, s, separator); + str = str_utils_get_next_string(str, s, split); sscanf_s(s.c_str(), "%f", &value); return str; } -const wchar_t* str_utils_get_next_float_t(const wchar_t* str, float_t& value, wchar_t separator) { +const wchar_t* str_utils_get_next_float_t(const wchar_t* str, float_t& value, const wchar_t split) { std::wstring s; - str = str_utils_get_next_string(str, s, separator); + str = str_utils_get_next_string(str, s, split); swscanf_s(s.c_str(), L"%f", &value); return str; } -const char* str_utils_get_next_string(const char* str, std::string& value, char separator) { +const char* str_utils_get_next_string(const char* str, std::string& value, const char split) { + value.clear(); + if (!str) return 0; - value = {}; - while (*str) { - char c = *str++; - if (c == separator) - break; - - value += c; + const char* t = strchr(str, split); + if (!t) { + value.assign(str); + return 0; } - return *str ? str : 0; + + value.assign(str, t - str); + t++; + return *t ? t : 0; } -const wchar_t* str_utils_get_next_string(const wchar_t* str, std::wstring& value, wchar_t separator) { +const wchar_t* str_utils_get_next_string(const wchar_t* str, std::wstring& value, const wchar_t split) { + value.clear(); + if (!str) return 0; - value = {}; - while (*str) { - wchar_t c = *str++; - if (c == separator) - break; - - value += c; + const wchar_t* t = wcschr(str, split); + if (!t) { + value.assign(str); + return 0; } - return str; + + value.assign(str, t - str); + t++; + return *t ? t : 0; } -char* str_utils_split_get_right(const char* str, char split) { +char* str_utils_split_get_right(const char* str, const char split) { if (!str) return 0; @@ -115,7 +119,7 @@ char* str_utils_split_get_right(const char* str, char split) { return p; } -wchar_t* str_utils_split_get_right(const wchar_t* str, wchar_t split) { +wchar_t* str_utils_split_get_right(const wchar_t* str, const wchar_t split) { if (!str) return 0; @@ -131,7 +135,7 @@ wchar_t* str_utils_split_get_right(const wchar_t* str, wchar_t split) { return p; } -char* str_utils_split_get_left(const char* str, char split) { +char* str_utils_split_get_left(const char* str, const char split) { if (!str) return 0; @@ -144,7 +148,7 @@ char* str_utils_split_get_left(const char* str, char split) { return p; } -wchar_t* str_utils_split_get_left(const wchar_t* str, wchar_t split) { +wchar_t* str_utils_split_get_left(const wchar_t* str, const wchar_t split) { if (!str) return 0; @@ -157,7 +161,7 @@ wchar_t* str_utils_split_get_left(const wchar_t* str, wchar_t split) { return p; } -char* str_utils_split_get_right_include(const char* str, char split) { +char* str_utils_split_get_right_include(const char* str, const char split) { if (!str) return 0; @@ -172,7 +176,7 @@ char* str_utils_split_get_right_include(const char* str, char split) { return p; } -wchar_t* str_utils_split_get_right_include(const wchar_t* str, wchar_t split) { +wchar_t* str_utils_split_get_right_include(const wchar_t* str, const wchar_t split) { if (!str) return 0; @@ -187,7 +191,7 @@ wchar_t* str_utils_split_get_right_include(const wchar_t* str, wchar_t split) { return p; } -char* str_utils_split_get_left_include(const char* str, char split) { +char* str_utils_split_get_left_include(const char* str, const char split) { if (!str) return 0; @@ -201,7 +205,7 @@ char* str_utils_split_get_left_include(const char* str, char split) { return p; } -wchar_t* str_utils_split_get_left_include(const wchar_t* str, wchar_t split) { +wchar_t* str_utils_split_get_left_include(const wchar_t* str, const wchar_t split) { if (!str) return 0; @@ -215,7 +219,7 @@ wchar_t* str_utils_split_get_left_include(const wchar_t* str, wchar_t split) { return p; } -char* str_utils_split_right_get_right(const char* str, char split) { +char* str_utils_split_right_get_right(const char* str, const char split) { if (!str) return 0; @@ -231,7 +235,7 @@ char* str_utils_split_right_get_right(const char* str, char split) { return p; } -wchar_t* str_utils_split_right_get_right(const wchar_t* str, wchar_t split) { +wchar_t* str_utils_split_right_get_right(const wchar_t* str, const wchar_t split) { if (!str) return 0; @@ -247,7 +251,7 @@ wchar_t* str_utils_split_right_get_right(const wchar_t* str, wchar_t split) { return p; } -char* str_utils_split_right_get_left(const char* str, char split) { +char* str_utils_split_right_get_left(const char* str, const char split) { if (!str) return 0; @@ -260,7 +264,7 @@ char* str_utils_split_right_get_left(const char* str, char split) { return p; } -wchar_t* str_utils_split_right_get_left(const wchar_t* str, wchar_t split) { +wchar_t* str_utils_split_right_get_left(const wchar_t* str, const wchar_t split) { if (!str) return 0; @@ -273,7 +277,7 @@ wchar_t* str_utils_split_right_get_left(const wchar_t* str, wchar_t split) { return p; } -char* str_utils_split_right_get_right_include(const char* str, char split) { +char* str_utils_split_right_get_right_include(const char* str, const char split) { if (!str) return 0; @@ -288,7 +292,7 @@ char* str_utils_split_right_get_right_include(const char* str, char split) { return p; } -wchar_t* str_utils_split_right_get_right_include(const wchar_t* str, wchar_t split) { +wchar_t* str_utils_split_right_get_right_include(const wchar_t* str, const wchar_t split) { if (!str) return 0; @@ -303,7 +307,7 @@ wchar_t* str_utils_split_right_get_right_include(const wchar_t* str, wchar_t spl return p; } -char* str_utils_split_right_get_left_include(const char* str, char split) { +char* str_utils_split_right_get_left_include(const char* str, const char split) { if (!str) return 0; @@ -318,7 +322,7 @@ char* str_utils_split_right_get_left_include(const char* str, char split) { return p; } -wchar_t* str_utils_split_right_get_left_include(const wchar_t* str, wchar_t split) { +wchar_t* str_utils_split_right_get_left_include(const wchar_t* str, const wchar_t split) { if (!str) return 0; diff --git a/src/KKdLib/str_utils.hpp b/src/KKdLib/str_utils.hpp index 798c01e8..16ce8b04 100644 --- a/src/KKdLib/str_utils.hpp +++ b/src/KKdLib/str_utils.hpp @@ -6,6 +6,7 @@ #pragma once #include +#include #include "default.hpp" inline int32_t str_utils_compare(const char* str0, const char* str1) { @@ -18,28 +19,28 @@ inline int32_t str_utils_compare(const wchar_t* str0, const wchar_t* str1) { extern bool str_utils_check_ends_with(const char* str, const char* mask); extern bool str_utils_check_ends_with(const wchar_t* str, const wchar_t* mask); -extern const char* str_utils_get_next_int32_t(const char* str, int32_t& value, char separator); -extern const wchar_t* str_utils_get_next_int32_t(const wchar_t* str, int32_t& value, wchar_t separator); -extern const char* str_utils_get_next_float_t(const char* str, float_t& value, char separator); -extern const wchar_t* str_utils_get_next_float_t(const wchar_t* str, float_t& value, wchar_t separator); -extern const char* str_utils_get_next_string(const char* str, std::string& value, char separator); -extern const wchar_t* str_utils_get_next_string(const wchar_t* str, std::wstring& value, wchar_t separator); -extern char* str_utils_split_get_right(const char* str, char split); -extern wchar_t* str_utils_split_get_right(const wchar_t* str, wchar_t split); -extern char* str_utils_split_get_left(const char* str, char split); -extern wchar_t* str_utils_split_get_left(const wchar_t* str, wchar_t split); -extern char* str_utils_split_get_right_include(const char* str, char split); -extern wchar_t* str_utils_split_get_right_include(const wchar_t* str, wchar_t split); -extern char* str_utils_split_get_left_include(const char* str, char split); -extern wchar_t* str_utils_split_get_left_include(const wchar_t* str, wchar_t split); -extern char* str_utils_split_right_get_right(const char* str, char split); -extern wchar_t* str_utils_split_right_get_right(const wchar_t* str, wchar_t split); -extern char* str_utils_split_right_get_left(const char* str, char split); -extern wchar_t* str_utils_split_right_get_left(const wchar_t* str, wchar_t split); -extern char* str_utils_split_right_get_right_include(const char* str, char split); -extern wchar_t* str_utils_split_right_get_right_include(const wchar_t* str, wchar_t split); -extern char* str_utils_split_right_get_left_include(const char* str, char split); -extern wchar_t* str_utils_split_right_get_left_include(const wchar_t* str, wchar_t split); +extern const char* str_utils_get_next_int32_t(const char* str, int32_t& value, const char split); +extern const wchar_t* str_utils_get_next_int32_t(const wchar_t* str, int32_t& value, const wchar_t split); +extern const char* str_utils_get_next_float_t(const char* str, float_t& value, const char split); +extern const wchar_t* str_utils_get_next_float_t(const wchar_t* str, float_t& value, const wchar_t split); +extern const char* str_utils_get_next_string(const char* str, std::string& value, const char split); +extern const wchar_t* str_utils_get_next_string(const wchar_t* str, std::wstring& value, const wchar_t split); +extern char* str_utils_split_get_right(const char* str, const char split); +extern wchar_t* str_utils_split_get_right(const wchar_t* str, const wchar_t split); +extern char* str_utils_split_get_left(const char* str, const char split); +extern wchar_t* str_utils_split_get_left(const wchar_t* str, const wchar_t split); +extern char* str_utils_split_get_right_include(const char* str, const char split); +extern wchar_t* str_utils_split_get_right_include(const wchar_t* str, const wchar_t split); +extern char* str_utils_split_get_left_include(const char* str, const char split); +extern wchar_t* str_utils_split_get_left_include(const wchar_t* str, const wchar_t split); +extern char* str_utils_split_right_get_right(const char* str, const char split); +extern wchar_t* str_utils_split_right_get_right(const wchar_t* str, const wchar_t split); +extern char* str_utils_split_right_get_left(const char* str, const char split); +extern wchar_t* str_utils_split_right_get_left(const wchar_t* str, const wchar_t split); +extern char* str_utils_split_right_get_right_include(const char* str, const char split); +extern wchar_t* str_utils_split_right_get_right_include(const wchar_t* str, const wchar_t split); +extern char* str_utils_split_right_get_left_include(const char* str, const char split); +extern wchar_t* str_utils_split_right_get_left_include(const wchar_t* str, const wchar_t split); extern char* str_utils_get_extension(const char* str); extern wchar_t* str_utils_get_extension(const wchar_t* str); extern char* str_utils_get_without_extension(const char* str); diff --git a/src/ReDIVA/classes/information.cpp b/src/ReDIVA/classes/information.cpp index f6491ef5..dd5c2456 100644 --- a/src/ReDIVA/classes/information.cpp +++ b/src/ReDIVA/classes/information.cpp @@ -4,10 +4,33 @@ */ #include "information.hpp" +#include "../dw_console.hpp" #include "information/frame_speed.hpp" #include "information/task.hpp" classes_data information_classes[] = { + { + "Console##Information", + CLASSES_IN_CONTEXT_MENU, + (bool(*)(class_data*, render_context*))dw_console_init, + CLASSES_DATA_NO_FUNC, + CLASSES_DATA_NO_FUNC, + CLASSES_DATA_NO_FUNC, + CLASSES_DATA_NO_FUNC, + CLASSES_DATA_NO_FUNC, + CLASSES_DATA_NO_FUNC, + CLASSES_DATA_NO_FUNC, + CLASSES_DATA_NO_FUNC, + CLASSES_DATA_NO_FUNC, + { + {}, + (class_flags)(CLASS_DISPOSED | CLASS_HIDDEN), + false, + CLASS_DATA_NO_DATA, + }, + 0, + 0, + }, { "FrameSpeed##Information", CLASSES_IN_CONTEXT_MENU, diff --git a/src/ReDIVA/dw_console.cpp b/src/ReDIVA/dw_console.cpp new file mode 100644 index 00000000..78bb5f4c --- /dev/null +++ b/src/ReDIVA/dw_console.cpp @@ -0,0 +1,275 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#include "dw_console.hpp" +#include "../KKdLib/str_utils.hpp" +#include "dw.hpp" + +struct c_buff_data { + char* buf; + char* buf_end; + char* position; + + void init(char* data, size_t size, size_t position); + void move(int32_t size); + void printf(const char* fmt, ...); + void vprintf(const char* fmt, va_list args); +}; + +struct c_buff { + char buf[4096]; + c_buff_data data; + + void init(); + void free(); +}; + +class DwConsole : public dw::Shell { +public: + dw_console_index index; + dw::ListBox* list_box; + dw::List* list; + + DwConsole(); + virtual ~DwConsole() override; + + virtual void Draw() override; + + virtual void Hide() override; + + void CtrlList(); + + static void ListBoxCallback(dw::Widget* data); +}; + +static const char* dw_console_index_names[] = { + "SYSTEM", + "MATCHING", + "PV SCRIPT", + "GAME", + "GAME_SUB COMMAND", + "", + "", + "", + "", + "", + "MODE_CTRL", + "MODE_MEMORY", + "EVENT_MEMORY", + "TEMP_MEMORY", + "AUTH_BILLING", + "BOOKKEEP", + "AIME", + "", + "", + "", +}; + +c_buff dw_console_c_buff_array[DW_CONSOLE_MAX]; + +DwConsole* dw_console; + +static const char* dw_console_index_get_name(dw_console_index index); +static const char* dw_console_c_buff_array_get_buf(int32_t index); + +void dw_console_init() { + if (!dw_console) { + dw_console = new DwConsole(); + dw_console->sub_1402F38B0(); + } + else + dw_console->Disp(); +} + +void dw_console_printf(dw_console_index index, const char* fmt, ...) { + va_list args; + va_start(args, fmt); + dw_console_vprintf(index, fmt, args); + va_end(args); +} + +void dw_console_vprintf(dw_console_index index, const char* fmt, va_list args) { + /*if (!main_thread_id_check()) + return;*/ + + c_buff* str_buf = &dw_console_c_buff_array[index]; + + char buf[0x100]; + int32_t len = vsprintf_s(buf, sizeof(buf), fmt, args); + if (&str_buf->data.position[len] >= str_buf->data.buf_end) + str_buf->data.move(len + 1); + str_buf->data.vprintf(fmt, args); +} + +void dw_console_c_buff_array_init() { + for (c_buff& i : dw_console_c_buff_array) + i.init(); +} + +void dw_console_c_buff_array_free() { + for (c_buff& i : dw_console_c_buff_array) + i.free(); +} + +DwConsole::DwConsole() : index() { + SetText("Console"); + + rect.pos = { 512.0f, 64.0f }; + SetSize({ 400.0f, 600.0f }); + + list_box = new dw::ListBox(this, (dw::Flags)(dw::FLAG_800 | dw::VERTICAL | dw::MULTISELECT)); + + for (int32_t i = 0; i < DW_CONSOLE_MAX; i++) { + char buf[0x04]; + sprintf_s(buf, sizeof(buf), "%02u:", i); + + std::string item(buf); + item.append(dw_console_index_get_name((dw_console_index)i)); + list_box->AddItem(item); + } + + list_box->SetItemIndex(index); + list_box->SetMaxItems(5); + list_box->callback_data.v64 = this; + list_box->AddSelectionListener(new dw::SelectionListenerOnHook(DwConsole::ListBoxCallback)); + + list = new dw::List(this, (dw::Flags)(dw::FLAG_800 | dw::VERTICAL | dw::MULTISELECT)); + + CtrlList(); + + UpdateLayout(); + + rect.pos = { 512.0f, 64.0f }; + SetSize({ 400.0f, 600.0f }); +} + +DwConsole::~DwConsole() { + +} + +void DwConsole::Draw() { + CtrlList(); + + dw::Shell::Draw(); +} + +void DwConsole::Hide() { + SetDisp(false); +} + +void DwConsole::ListBoxCallback(dw::Widget* data) { + dw::ListBox* list_box = dynamic_cast(data); + if (list_box) + ((DwConsole*)(list_box->callback_data.v64))->index + = (dw_console_index)list_box->list->selected_item; +} + +void DwConsole::CtrlList() { + size_t hovered_item = list->hovered_item; + size_t selected_item = list->selected_item; + + list->ClearItems(); + + const char* str = dw_console_c_buff_array_get_buf(index); + if (str) { + while (str) { + std::string s; + str = str_utils_get_next_string(str, s, '\n'); + list->AddItem(s); + } + } + + list->hovered_item = hovered_item; + list->ResetSetSelectedItem(selected_item); + + int32_t v9 = (int32_t)(rect.size.y / list->GetFontGlyphHeight()) - 3; + v9 = max_def(v9, 1); + + list->SetMaxItems(v9); + + while (list->items.size() < v9) + list->AddItem(""); + + dw::ScrollBar* v_bar = list->v_bar; + if (v_bar) { + bool equal = *(uint32_t*)&v_bar->value == *(uint32_t*)&v_bar->max; + + float_t v15 = (float_t)(int64_t)list->GetMaxItemsVisible(); + if (v15 < 0.0f) + v15 += (float_t)UINT64_MAX; + float_t v16 = list->GetFontGlyphHeight() * v15; + + float_t v20 = (float_t)(int64_t)list->items.size(); + if (v20 < 0.0f) + v20 += (float_t)UINT64_MAX; + float_t v21 = list->GetFontGlyphHeight() * v20; + + float_t v22 = v21 - v16; + if (v22 >= 0.0f) { + v_bar->SetMin(0.0f); + v_bar->SetMax(v22); + v_bar->sub_1402F9670(v16 / v21 * v22); + } + else { + v22 = 0.0f; + v_bar->SetMin(0.0f); + v_bar->SetMax(0.0f); + v_bar->sub_1402F9670(v21); + } + + if (equal) + v_bar->SetValue(v22); + } +} + +void c_buff_data::init(char* data, size_t size, size_t position) { + buf = data; + buf_end = &data[size]; + this->position = &data[position]; +} + +void c_buff_data::move(int32_t size) { + char* v4 = this->position; + char* v5 = &buf[size]; + + while (v5 < v4 && *v5++ != '\n'); + + if (v5 >= v4 && v5 != v4) + v5 = position; + + memmove(buf, v5, v4 - v5); + + this->position -= v5 - buf; +} + +void c_buff_data::printf(const char* fmt, ...) { + va_list args; + va_start(args, fmt); + vprintf(fmt, args); + va_end(args); +} + +void c_buff_data::vprintf(const char* fmt, va_list args) { + char* pos = &position[vsprintf_s(position, buf_end - position, fmt, args)]; + position = min_def(pos, buf_end); +} + +void c_buff::init() { + data.init(buf, sizeof(buf), 0); +} + +void c_buff::free() { + +} + +static const char* dw_console_index_get_name(dw_console_index index) { + if (index >= 0 && index < DW_CONSOLE_MAX) + return dw_console_index_names[index]; + return 0; +} + +static const char* dw_console_c_buff_array_get_buf(int32_t index) { + return dw_console_c_buff_array[index].data.buf; +} diff --git a/src/ReDIVA/dw_console.hpp b/src/ReDIVA/dw_console.hpp new file mode 100644 index 00000000..30a91ad7 --- /dev/null +++ b/src/ReDIVA/dw_console.hpp @@ -0,0 +1,39 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#pragma once + +#include "../KKdLib/default.hpp" + +enum dw_console_index { + DW_CONSOLE_SYSTEM, + DW_CONSOLE_MATCHING, + DW_CONSOLE_PV_SCRIPT, + DW_CONSOLE_GAME, + DW_CONSOLE_GAME_SUB_COMMAND, + DW_CONSOLE_5, + DW_CONSOLE_6, + DW_CONSOLE_7, + DW_CONSOLE_8, + DW_CONSOLE_9, + DW_CONSOLE_MODE_CTRL, + DW_CONSOLE_MODE_MEMORY, + DW_CONSOLE_EVENT_MEMORY, + DW_CONSOLE_TEMP_MEMORY, + DW_CONSOLE_AUTH_BILLING, + DW_CONSOLE_BOOKKEEP, + DW_CONSOLE_AIME, + DW_CONSOLE_17, + DW_CONSOLE_18, + DW_CONSOLE_19, + DW_CONSOLE_MAX, +}; + +extern void dw_console_init(); +extern void dw_console_printf(dw_console_index index, const char* fmt, ...); +extern void dw_console_vprintf(dw_console_index index, const char* fmt, va_list args); + +extern void dw_console_c_buff_array_init(); +extern void dw_console_c_buff_array_free(); diff --git a/src/ReDIVA/game_state.cpp b/src/ReDIVA/game_state.cpp index 64bd2309..ec426027 100644 --- a/src/ReDIVA/game_state.cpp +++ b/src/ReDIVA/game_state.cpp @@ -20,6 +20,7 @@ #include "pv_game/pv_game.hpp" #include "data_edit.hpp" #include "data_initialize.hpp" +#include "dw_console.hpp" #include "system_startup.hpp" #include "x_pv_game.hpp" @@ -1821,6 +1822,9 @@ static void game_state_set_state(GameStateEnum state, SubGameStateEnum sub_state game_state->call_count = 0; game_state->advertise_state = 0; + dw_console_printf(DW_CONSOLE_MODE_CTRL, "[%s]->[%s]\n", + game_state_names[game_state_prev], game_state_names[state]); + GameStateData* game_state_data = game_state_data_array_get(game_state->game_state); if (game_state_data) { game_state->game_state_next = game_state_data->next_game_state; diff --git a/src/ReDIVA/pv_game/pv_game_pv_data.cpp b/src/ReDIVA/pv_game/pv_game_pv_data.cpp index 2c34890c..0388eb04 100644 --- a/src/ReDIVA/pv_game/pv_game_pv_data.cpp +++ b/src/ReDIVA/pv_game/pv_game_pv_data.cpp @@ -7,6 +7,7 @@ #include "../../CRE/rob/motion.hpp" #include "../../CRE/pv_expression.hpp" #include "../../CRE/pv_param.hpp" +#include "../dw_console.hpp" #include "pv_game.hpp" #include "pv_game_camera.hpp" #include "pv_game_music.hpp" @@ -74,6 +75,9 @@ extern render_context* rctx_ptr; extern bool light_chara_ambient; extern vec4 npr_cloth_spec_color; +static void print_dsc_command(dsc& dsc, dsc_data* dsc_data_ptr, int64_t time); +static void print_dsc_command(dsc& dsc, dsc_data* dsc_data_ptr, int64_t* time); + pv_play_data_set_motion::pv_play_data_set_motion() : frame_speed(), motion_id(), frame(), blend_duration(), blend(), disable_eye_motion(), dsc_frame() { blend_type = MOTION_BLEND_CROSS; @@ -364,8 +368,8 @@ int64_t pv_game_pv_data::ctrl(float_t delta_time, int64_t curr_time, bool a4) { bool music_play = false; bool next = dsc_ctrl(delta_time, this->curr_time, &dsc_time_offset, &music_play, a4, false); - //if (prev_dsc_data_ptr != dsc_data_ptr) - // print_dsc_command(&dsc_buffer[dsc_buffer_counter], dsc_time); + if (prev_dsc_data_ptr != dsc_data_ptr) + print_dsc_command(dsc, prev_dsc_data_ptr, dsc_time); prev_dsc_data_ptr = dsc_data_ptr; if (music_play) { @@ -629,7 +633,8 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, set_motion_max_frame(chara_id, motion_index, motion ? motion->time : 0); } else { - set_motion->clear(); + playdata->set_motion.clear(); + playdata->set_motion.push_back(v518); rob_chr->set_motion_step(frame_speed); } } break; @@ -1043,12 +1048,18 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, float_t blend_duration = playdata->motion_data.mot_smooth_len / this->anim_frame_speed; MotionBlendType blend_type = MOTION_BLEND_CROSS; - if (_blend_type == 2) - blend_type = MOTION_BLEND_FREEZE; - else if (_blend_type != 1) { + switch (_blend_type) { + case 0: + default: if (func == DSC_FT_EDIT_MOTION_LOOP) blend_type = MOTION_BLEND_FREEZE; blend_duration = 0.0f; + break; + case 1: + break; + case 2: + blend_type = MOTION_BLEND_FREEZE; + break; } bool blend = !(dsc_time / 10000) || (int32_t)(value * 1000.0); @@ -2596,3 +2607,35 @@ void pv_game_pv_data::set_motion_max_frame(int32_t chara_id, int32_t motion_inde break; } } + +static void print_dsc_command(dsc& dsc, dsc_data* dsc_data_ptr, int64_t time) { + print_dsc_command(dsc, dsc_data_ptr, &time); +} + +static void print_dsc_command(dsc& dsc, dsc_data* dsc_data_ptr, int64_t* time) { + if (dsc_data_ptr->func < 0 || dsc_data_ptr->func >= DSC_FT_MAX) { + dw_console_printf(DW_CONSOLE_PV_SCRIPT, "UNKNOWN command(%d)\n", dsc_data_ptr->func); + return; + } + + if (time) + if (dsc_data_ptr->func == DSC_FT_TIME) + return; + else + dw_console_printf(DW_CONSOLE_PV_SCRIPT, "%.3f:", (float_t)*time * 0.00001f); + + dsc_get_func_length get_func_length = dsc.get_dsc_get_func_length(); + + dw_console_printf(DW_CONSOLE_PV_SCRIPT, "%s(", dsc_data_ptr->name); + + uint32_t* data = dsc.get_func_data(dsc_data_ptr); + + int32_t length = get_func_length(dsc_data_ptr->func); + for (int32_t i = 0; i < length; i++) + if (i) + dw_console_printf(DW_CONSOLE_PV_SCRIPT, ", %d", ((int32_t*)data)[i]); + else + dw_console_printf(DW_CONSOLE_PV_SCRIPT, "%d", ((int32_t*)data)[i]); + + dw_console_printf(DW_CONSOLE_PV_SCRIPT, ")\n"); +} diff --git a/src/ReDIVA/render.cpp b/src/ReDIVA/render.cpp index 19f8530f..e060829f 100644 --- a/src/ReDIVA/render.cpp +++ b/src/ReDIVA/render.cpp @@ -55,6 +55,7 @@ #include "data_test/selector.hpp" #include "data_test/stage_test.hpp" #include "pv_game/pv_game.hpp" +#include "dw_console.hpp" #include "game_state.hpp" #include "font_info.hpp" #include "imgui_helper.hpp" @@ -557,17 +558,19 @@ static render_context* render_context_load() { mothead_storage_init(); skin_param_data_init(); - game_state_init(); - skin_param_data_load(); input_state_init(); fontmap_data_init(); font_info_default_init(); + dw_console_c_buff_array_init(); sound_init(); wave_audio_storage_init(); ogg_file_handler_storage_init(); ogg_playback_data_init(); + + game_state_init(); + object_storage_init(aft_obj_db); stage_param_data_storage_init(); pv_expression_file_storage_init(); @@ -1229,10 +1232,12 @@ static void render_context_dispose(render_context* rctx) { pv_expression_file_storage_free(); stage_param_data_storage_free(); object_storage_free(); + ogg_playback_data_free(); ogg_file_handler_storage_free(); wave_audio_storage_free(); sound_free(); + dw_console_c_buff_array_free(); font_info_default_free(); fontmap_data_free(); input_state_free(); diff --git a/src/ReDIVA/shared.cpp b/src/ReDIVA/shared.cpp index 998ba57f..12f56808 100644 --- a/src/ReDIVA/shared.cpp +++ b/src/ReDIVA/shared.cpp @@ -74,7 +74,7 @@ classes_data classes[] = { CLASS_DATA_NO_DATA, }, information_classes, - 2, + 3, }, #if defined(ReDIVA_DEV) {