Fixing dialogues and cutscenes, minor bug fixing

This commit is contained in:
Vladislav Khorev committed 2026-06-13 15:07:09 +03:00
1 parent 2b32fce5e0
commit fff5a9d4aa
18 files changed
+4010 -2208

No files matched your search

+11 -35
View File
@@ -213,9 +213,9 @@ namespace ZL
LocationSetup uniInteriorParams;
uniInteriorParams.gameObjectsJsonPath = "resources/config2/gameobjects_uni_interior_x.json";
uniInteriorParams.npcsJsonPath = "resources/config2/npcs_uni_interior.json";
uniInteriorParams.dialoguesJsonPath = "resources/dialogue/uni_interior_dialogues_004.json";
uniInteriorParams.dialoguesJsonPath = "resources/dialogue/uni_interior_dialogues_005.json";
uniInteriorParams.navigationJsonPaths = {
"resources/navigation/uni_interior4_unlocked_n2.txt", //0
"resources/navigation/uni_interior3_n2_hall.txt",
@@ -296,6 +296,9 @@ namespace ZL
this->currentLocation = nullptr;
menuManager.showMainMenu();
};
locations["uni_interior"]->requestSetChatUnread = [this](int idx, bool unread, const std::string& msg) {
menuManager.setChatUnread(idx, unread, msg);
};
if (locations["uni_interior"]->player)
locations["uni_interior"]->player->onDeathAnimComplete = [this]() { startDarklandsTransition(); };
for (auto& npc : locations["uni_interior"]->npcs) {
@@ -335,6 +338,9 @@ namespace ZL
locations["uni_exterior"]->requestDarklandsTransition = [this]() { return startDarklandsTransition(); };
locations["uni_exterior"]->requestClosePhone = [this]() { menuManager.closePhoneEntirely(); };
locations["uni_exterior"]->requestReturnToMainMenu = [this]() { menuManager.showMainMenu(); };
locations["uni_exterior"]->requestSetChatUnread = [this](int idx, bool unread, const std::string& msg) {
menuManager.setChatUnread(idx, unread, msg);
};
if (locations["uni_exterior"]->player)
locations["uni_exterior"]->player->onDeathAnimComplete = [this]() { startDarklandsTransition(); };
@@ -379,6 +385,9 @@ namespace ZL
locations["location_dorm"]->requestDarklandsTransition = [this]() { return startDarklandsTransition(); };
locations["location_dorm"]->requestClosePhone = [this]() { menuManager.closePhoneEntirely(); };
locations["location_dorm"]->requestReturnToMainMenu = [this]() { menuManager.showMainMenu(); };
locations["location_dorm"]->requestSetChatUnread = [this](int idx, bool unread, const std::string& msg) {
menuManager.setChatUnread(idx, unread, msg);
};
if (locations["location_dorm"]->player)
locations["location_dorm"]->player->onDeathAnimComplete = [this]() { startDarklandsTransition(); };
@@ -518,39 +527,6 @@ namespace ZL
if (currentLocation) currentLocation->dialogueSystem.skipCutscene();
};
std::cout << "Load resurces step 5" << std::endl;
/*
std::cout << "Load resurces step 12" << std::endl;
// Shadow mapping shaders
#ifdef EMSCRIPTEN
renderer.shaderManager.AddShaderFromFiles("shadow_depth", "resources/shaders/shadow_depth.vertex", "resources/shaders/shadow_depth_web.fragment", CONST_ZIP_FILE);
std::cout << "Load resurces step 12x1" << std::endl;
renderer.shaderManager.AddShaderFromFiles("shadow_depth_skinning", "resources/shaders/shadow_depth_skinning.vertex", "resources/shaders/shadow_depth_web.fragment", CONST_ZIP_FILE);
std::cout << "Load resurces step 12x2" << std::endl;
renderer.shaderManager.AddShaderFromFiles("default_shadow", "resources/shaders/default_shadow.vertex", "resources/shaders/default_shadow_web.fragment", CONST_ZIP_FILE);
std::cout << "Load resurces step 12x3" << std::endl;
renderer.shaderManager.AddShaderFromFiles("skinning_shadow", "resources/shaders/skinning_shadow.vertex", "resources/shaders/default_shadow_web.fragment", CONST_ZIP_FILE);
std::cout << "Load resurces step 12x4" << std::endl;
renderer.shaderManager.AddShaderFromFiles("fog_shadow", "resources/shaders/fog_shadow.vertex", "resources/shaders/fog_shadow_web.fragment", CONST_ZIP_FILE);
std::cout << "Load resurces step 12x5" << std::endl;
renderer.shaderManager.AddShaderFromFiles("fog_skinning_shadow", "resources/shaders/fog_skinning_shadow.vertex", "resources/shaders/fog_shadow_web.fragment", CONST_ZIP_FILE);
std::cout << "Load resurces step 12x6" << std::endl;
renderer.shaderManager.AddShaderFromFiles("cutsceneFade", "resources/shaders/default.vertex", "resources/shaders/cutscene_fade_web.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("cutsceneBlack", "resources/shaders/default.vertex", "resources/shaders/cutscene_black_web.fragment", CONST_ZIP_FILE);
#else
renderer.shaderManager.AddShaderFromFiles("shadow_depth", "resources/shaders/shadow_depth.vertex", "resources/shaders/shadow_depth_desktop.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("shadow_depth_skinning", "resources/shaders/shadow_depth_skinning.vertex", "resources/shaders/shadow_depth_desktop.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("default_shadow", "resources/shaders/default_shadow.vertex", "resources/shaders/default_shadow_desktop.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("skinning_shadow", "resources/shaders/skinning_shadow.vertex", "resources/shaders/default_shadow_desktop.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("fog_shadow", "resources/shaders/fog_shadow.vertex", "resources/shaders/fog_shadow_desktop.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("fog_skinning_shadow", "resources/shaders/fog_skinning_shadow.vertex", "resources/shaders/fog_shadow_desktop.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("cutsceneFade", "resources/shaders/default.vertex", "resources/shaders/cutscene_fade_desktop.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("cutsceneBlack", "resources/shaders/default.vertex", "resources/shaders/cutscene_black_desktop.fragment", CONST_ZIP_FILE);
#endif*/
std::cout << "Load resurces step 13" << std::endl;
try {
+1 -1
View File
@@ -132,7 +132,7 @@ namespace ZL
dialogueSystem.init(renderer, CONST_ZIP_FILE);
dialogueSystem.loadDatabase(params.dialoguesJsonPath);
dialogueSystem.loadCutsceneDatabase("resources/dialogue/cutscenes004.json");
dialogueSystem.loadCutsceneDatabase("resources/dialogue/cutscenes005.json");
dialogueSystem.setQuestJournal(journal);
npcNameText = std::make_unique<TextRenderer>();
+1
View File
@@ -122,6 +122,7 @@ namespace ZL
std::function<void()> requestClosePhone;
std::function<void()> requestReturnToMainMenu;
std::function<void(int, bool, const std::string&)> requestSetChatUnread;
// Navigation editor — toggle with 'N', save with 'B', right-click to finalize polygon
EditorMode editorMode = EditorMode::None;
+39 -4
View File
@@ -53,6 +53,22 @@ namespace ZL {
return max(1, lines);
}
static std::string trimChatPreview(const std::string& msg, int maxChars = 22) {
int charCount = 0;
int bytePos = 0;
const int len = static_cast<int>(msg.size());
while (bytePos < len && charCount < maxChars) {
const unsigned char c = static_cast<unsigned char>(msg[bytePos]);
if (c < 0x80) bytePos += 1;
else if (c < 0xE0) bytePos += 2;
else if (c < 0xF0) bytePos += 3;
else bytePos += 4;
++charCount;
}
if (bytePos >= len) return msg;
return msg.substr(0, bytePos) + "...";
}
static std::string formatMoney(int amount) {
bool negative = amount < 0;
std::string digits = std::to_string(negative ? -amount : amount);
@@ -459,14 +475,23 @@ namespace ZL {
}
void MenuManager::refreshChatUnreadIndicators() {
uiManager.setNodeVisible("chat1Unread", chatUnread_[0]);
uiManager.setNodeVisible("chat2Unread", chatUnread_[1]);
uiManager.setNodeVisible("chat3Unread", chatUnread_[2]);
static const char* kUnreadNodes[3] = { "chat1Unread", "chat2Unread", "chat3Unread" };
static const char* kMsgNodes[3] = { "chat1msg", "chat2msg", "chat3msg" };
for (int i = 0; i < 3; ++i) {
uiManager.setNodeVisible(kUnreadNodes[i], chatUnread_[i]);
if (!chatPreviewMsg_[i].empty())
uiManager.setText(kMsgNodes[i], chatPreviewMsg_[i]);
}
}
void MenuManager::setChatUnread(int chatIndex, bool unread) {
void MenuManager::setChatUnread(int chatIndex, bool unread, const std::string& previewMsg) {
if (chatIndex < 0 || chatIndex > 2) return;
chatUnread_[chatIndex] = unread;
if (!previewMsg.empty()) {
chatPreviewMsg_[chatIndex] = trimChatPreview(previewMsg);
} else if (!unread && !chatHistory_[chatIndex].empty()) {
chatPreviewMsg_[chatIndex] = trimChatPreview(chatHistory_[chatIndex].back().text);
}
}
void MenuManager::spendMoney(int amount) {
@@ -575,6 +600,11 @@ namespace ZL {
}
void MenuManager::returnToPhoneChatList() {
if (activeChatIndex_ >= 0 && activeChatIndex_ <= 2
&& !chatHistory_[activeChatIndex_].empty()) {
chatPreviewMsg_[activeChatIndex_] =
trimChatPreview(chatHistory_[activeChatIndex_].back().text);
}
activeChatIndex_ = -1;
phoneChatVisibleBubbles_.clear();
uiManager.popMenu();
@@ -592,6 +622,11 @@ namespace ZL {
void MenuManager::closePhoneEntirely() {
if (activeChatIndex_ >= 0 && activeChatIndex_ <= 2
&& !chatHistory_[activeChatIndex_].empty()) {
chatPreviewMsg_[activeChatIndex_] =
trimChatPreview(chatHistory_[activeChatIndex_].back().text);
}
activeChatIndex_ = -1;
state = GameState::Gameplay;
phoneChatVisibleBubbles_.clear();
+2 -1
View File
@@ -70,7 +70,7 @@ namespace ZL {
void tutorialShowTaxiHint();
void setChatUnread(int chatIndex, bool unread);
void setChatUnread(int chatIndex, bool unread, const std::string& previewMsg = "");
void spendMoney(int amount);
int getMoney() const { return money_; }
@@ -229,6 +229,7 @@ namespace ZL {
std::vector<std::string> visibleQuestIds;
bool chatUnread_[3] = { true, true, true };
std::string chatPreviewMsg_[3]; // empty = keep JSON hardcoded text
int money_ = 5500;
// Phone chat state
+16
View File
@@ -376,6 +376,22 @@ namespace ZL {
loc->requestReturnToMainMenu();
});
// set_chat_unread(chat_index, unread [, preview_msg])
// chat_index: 0=first contact, 1=second, 2=third
// unread: true to mark as unread, false to mark as read
// preview_msg: optional string to show in the chat list preview (trimmed to 22 chars)
// When unread=false and preview_msg is omitted, preview auto-updates from chat history.
api.set_function("set_chat_unread",
[loc](int chatIndex, bool unread, sol::object previewMsg) {
if (!loc->requestSetChatUnread) {
std::cerr << "[script] set_chat_unread: callback not wired\n";
return;
}
const std::string msg = previewMsg.is<std::string>()
? previewMsg.as<std::string>() : "";
loc->requestSetChatUnread(chatIndex, unread, msg);
});
api.set_function("set_chat_callbacks",
[this_impl = impl.get()](sol::object cb0, sol::object cb1, sol::object cb2) {
if (cb0.is<sol::protected_function>()) this_impl->chatOpenCallbacks[0] = cb0.as<sol::protected_function>();