Fixing dialogues and cutscenes, minor bug fixing
This commit is contained in:
1 parent
2b32fce5e0
commit
fff5a9d4aa
18 files changed
+4010
-2208
No files matched your search
+11
-35
@@ -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
@@ -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>();
|
||||
|
||||
@@ -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
@@ -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
@@ -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
|
||||
|
||||
@@ -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>();
|
||||
|
||||
Reference in new issue
Block a user