Working on scripts
This commit is contained in:
1 parent
c086fe1ef0
commit
4044acefb2
35 files changed
+107190
-185
No files matched your search
@@ -432,6 +432,17 @@ void Character::update(int64_t deltaMs) {
|
||||
if (currentState == AnimationState::ACTION_TO_DEATH)
|
||||
{
|
||||
currentState = AnimationState::DEATH_IDLE;
|
||||
if (onDeathAnimComplete) {
|
||||
auto cb = std::move(onDeathAnimComplete);
|
||||
onDeathAnimComplete = nullptr;
|
||||
cb();
|
||||
//TODO: need to add some delay here
|
||||
currentState = AnimationState::STAND;
|
||||
resetAnim = true;
|
||||
showWeapon = false;
|
||||
battle_state = 0;
|
||||
attack = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -146,6 +146,9 @@ public:
|
||||
float slowMoActiveTime = 6.0f;
|
||||
float getSpeedMultiplier(float transitionProgress) const;
|
||||
|
||||
// Called once when the death animation finishes and the character enters DEATH_IDLE.
|
||||
std::function<void()> onDeathAnimComplete;
|
||||
|
||||
private:
|
||||
|
||||
std::map<AnimationState, BoneAnimationDataNew> animations;
|
||||
|
||||
+136
-16
@@ -147,6 +147,18 @@ namespace ZL
|
||||
renderer.shaderManager.AddShaderFromFiles("darklands_fog", "resources/shaders/darklands_fog.vertex", "resources/shaders/darklands_fog_web.fragment", CONST_ZIP_FILE);
|
||||
renderer.shaderManager.AddShaderFromFiles("darklands_fog_skinning", "resources/shaders/darklands_fog_skinning.vertex", "resources/shaders/darklands_fog_web.fragment", CONST_ZIP_FILE);
|
||||
renderer.shaderManager.AddShaderFromFiles("darklands_flash", "resources/shaders/default.vertex", "resources/shaders/darklands_flash_web.fragment", CONST_ZIP_FILE);
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
|
||||
#else
|
||||
renderer.shaderManager.AddShaderFromFiles("env_sky", "resources/shaders/env_sky.vertex", "resources/shaders/env_sky_desktop.fragment", CONST_ZIP_FILE);
|
||||
@@ -161,6 +173,15 @@ namespace ZL
|
||||
renderer.shaderManager.AddShaderFromFiles("darklands_fog", "resources/shaders/darklands_fog.vertex", "resources/shaders/darklands_fog_desktop.fragment", CONST_ZIP_FILE);
|
||||
renderer.shaderManager.AddShaderFromFiles("darklands_fog_skinning", "resources/shaders/darklands_fog_skinning.vertex", "resources/shaders/darklands_fog_desktop.fragment", CONST_ZIP_FILE);
|
||||
renderer.shaderManager.AddShaderFromFiles("darklands_flash", "resources/shaders/default.vertex", "resources/shaders/darklands_flash_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);
|
||||
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);
|
||||
|
||||
#endif
|
||||
|
||||
std::cout << "Load resurces step 4" << std::endl;
|
||||
@@ -201,19 +222,29 @@ namespace ZL
|
||||
|
||||
locations["uni_interior"] = std::make_shared<Location>(renderer, inventory);
|
||||
locations["uni_interior"]->setup(uniInteriorParams);
|
||||
locations["uni_interior"]->scriptEngine.setGlobalStore(&globalInts);
|
||||
locations["uni_interior"]->requestDarklandsTransition = [this]() { return startDarklandsTransition(); };
|
||||
if (locations["uni_interior"]->player)
|
||||
locations["uni_interior"]->player->onDeathAnimComplete = [this]() { startDarklandsTransition(); };
|
||||
|
||||
LocationSetup uniExteriorParams = uniInteriorParams;
|
||||
uniExteriorParams.gameObjectsJsonPath = "resources/config2/gameobjects2.json";
|
||||
uniExteriorParams.interactiveObjectsJsonPath = "";
|
||||
uniExteriorParams.gameObjectsJsonPath = "resources/config2/gameobjects_uni_exterior.json";
|
||||
uniExteriorParams.interactiveObjectsJsonPath = "resources/config2/interactive_objects_uni_exterior.json";
|
||||
//uniExteriorParams.navigationJsonPaths = {"resources/config2/navigation2.json"};
|
||||
uniExteriorParams.navigationJsonPaths = { "resources/w/nav_uni_exterior.txt" };
|
||||
uniExteriorParams.teleportsJsonPath = "resources/config2/teleports2.json";
|
||||
uniExteriorParams.triggerZonesJsonPath = "resources/config2/trigger_zones2.json";
|
||||
uniExteriorParams.scriptPath = "resources/start2.lua";
|
||||
uniExteriorParams.teleportsJsonPath = "resources/config2/teleports_uni_exterior.json";
|
||||
uniExteriorParams.triggerZonesJsonPath = "resources/config2/trigger_zones_uni_exterior.json";
|
||||
uniExteriorParams.scriptPath = "resources/start_uni_exterior.lua";
|
||||
uniExteriorParams.playerPosition = Eigen::Vector3f(5, 0, -18.4);
|
||||
uniExteriorParams.npcsJsonPath = "resources/config2/npcs2.json";
|
||||
uniExteriorParams.npcsJsonPath = "resources/config2/npcs_uni_exterior.json";
|
||||
uniExteriorParams.dialoguesJsonPath = "resources/dialogue/uni_exterior_dialogues.json";
|
||||
|
||||
locations["uni_exterior"] = std::make_shared<Location>(renderer, inventory);
|
||||
locations["uni_exterior"]->setup(uniExteriorParams);
|
||||
locations["uni_exterior"]->scriptEngine.setGlobalStore(&globalInts);
|
||||
locations["uni_exterior"]->requestDarklandsTransition = [this]() { return startDarklandsTransition(); };
|
||||
if (locations["uni_exterior"]->player)
|
||||
locations["uni_exterior"]->player->onDeathAnimComplete = [this]() { startDarklandsTransition(); };
|
||||
|
||||
LocationSetup params_dorm;
|
||||
params_dorm.gameObjectsJsonPath = "resources/config2/gameobjects_dorm.json";
|
||||
@@ -230,6 +261,10 @@ namespace ZL
|
||||
|
||||
locations["location_dorm"] = std::make_shared<Location>(renderer, inventory);
|
||||
locations["location_dorm"]->setup(params_dorm);
|
||||
locations["location_dorm"]->scriptEngine.setGlobalStore(&globalInts);
|
||||
locations["location_dorm"]->requestDarklandsTransition = [this]() { return startDarklandsTransition(); };
|
||||
if (locations["location_dorm"]->player)
|
||||
locations["location_dorm"]->player->onDeathAnimComplete = [this]() { startDarklandsTransition(); };
|
||||
|
||||
// Teleport callbacks: destination name and position come from the teleport zone data.
|
||||
auto teleportCallback = [this](const std::string& destName, const Eigen::Vector3f& destPos, float destRotY) {
|
||||
@@ -239,6 +274,8 @@ namespace ZL
|
||||
std::cerr << "[TELEPORT] Unknown destination location: " << destName << std::endl;
|
||||
return;
|
||||
}
|
||||
if (currentLocation)
|
||||
currentLocation->scriptEngine.callLocationExitCallback();
|
||||
currentLocation = it->second;
|
||||
if (currentLocation->player) {
|
||||
currentLocation->player->position = destPos;
|
||||
@@ -247,7 +284,7 @@ namespace ZL
|
||||
currentLocation->player->targetFacingAngle = destRotY;
|
||||
}
|
||||
currentLocation->cameraAzimuth = destRotY;
|
||||
|
||||
currentLocation->scriptEngine.callLocationEnterCallback();
|
||||
};
|
||||
|
||||
locations["uni_exterior"]->onTeleport = teleportCallback;
|
||||
@@ -255,9 +292,10 @@ namespace ZL
|
||||
locations["location_dorm"]->onTeleport = teleportCallback;
|
||||
|
||||
currentLocation = locations["location_dorm"];
|
||||
currentLocation->scriptEngine.callLocationEnterCallback();
|
||||
|
||||
std::cout << "Load resurces step 5" << std::endl;
|
||||
|
||||
/*
|
||||
std::cout << "Load resurces step 12" << std::endl;
|
||||
|
||||
// Shadow mapping shaders
|
||||
@@ -287,7 +325,7 @@ namespace ZL
|
||||
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
|
||||
#endif*/
|
||||
|
||||
std::cout << "Load resurces step 13" << std::endl;
|
||||
|
||||
@@ -349,7 +387,10 @@ namespace ZL
|
||||
{
|
||||
if (currentLocation)
|
||||
{
|
||||
if (currentLocation->isDarklands) {
|
||||
// Sync global darklands flag so Location's raycast and draw functions see it.
|
||||
currentLocation->isDarklands = isDarklands;
|
||||
|
||||
if (isDarklands) {
|
||||
currentLocation->drawGameDarklands();
|
||||
CheckGlError(__FILE__, __LINE__);
|
||||
}
|
||||
@@ -370,6 +411,7 @@ namespace ZL
|
||||
// ??? Main menu???
|
||||
}
|
||||
drawUI();
|
||||
drawDarklandsFlash();
|
||||
}
|
||||
CheckGlError(__FILE__, __LINE__);
|
||||
}
|
||||
@@ -429,6 +471,8 @@ namespace ZL
|
||||
|
||||
lastTickCount = newTickCount;
|
||||
|
||||
updateDarklandsFlash(delta);
|
||||
|
||||
if (currentLocation)
|
||||
{
|
||||
currentLocation->update(delta);
|
||||
@@ -543,8 +587,7 @@ namespace ZL
|
||||
if (event.type == SDL_KEYDOWN && event.key.repeat == 0) {
|
||||
switch (event.key.keysym.sym) {
|
||||
case SDLK_0:
|
||||
if (currentLocation)
|
||||
currentLocation->startDarklandsTransition();
|
||||
startDarklandsTransition();
|
||||
break;
|
||||
case SDLK_1:
|
||||
//if (audioPlayer) audioPlayer->playSoundAsync("audio/background.wav");
|
||||
@@ -577,15 +620,15 @@ namespace ZL
|
||||
case SDLK_o:
|
||||
//y = y + 0.002;
|
||||
//currentLocation->player->hp = 200;
|
||||
currentLocation->npcs[0]->walkSpeed += 0.01f;
|
||||
std::cout << "Walk speed: " << currentLocation->npcs[0]->walkSpeed << std::endl;
|
||||
//currentLocation->npcs[0]->walkSpeed += 0.01f;
|
||||
//std::cout << "Walk speed: " << currentLocation->npcs[0]->walkSpeed << std::endl;
|
||||
break;
|
||||
|
||||
case SDLK_k:
|
||||
//y = y - 0.002;
|
||||
std::cout << "Player pos: " << currentLocation->player->position.transpose() << std::endl;
|
||||
currentLocation->npcs[0]->walkSpeed -= 0.01f;
|
||||
std::cout << "Walk speed: " << currentLocation->npcs[0]->walkSpeed << std::endl;
|
||||
//currentLocation->npcs[0]->walkSpeed -= 0.01f;
|
||||
//std::cout << "Walk speed: " << currentLocation->npcs[0]->walkSpeed << std::endl;
|
||||
break;
|
||||
|
||||
case SDLK_p:
|
||||
@@ -865,4 +908,81 @@ namespace ZL
|
||||
}
|
||||
}
|
||||
|
||||
bool Game::startDarklandsTransition()
|
||||
{
|
||||
if (darklandsFlashActive) return false;
|
||||
darklandsFlashActive = true;
|
||||
darklandsFlashFadingIn = true;
|
||||
darklandsFlashAlpha = 0.0f;
|
||||
return true;
|
||||
}
|
||||
|
||||
void Game::updateDarklandsFlash(int64_t deltaMs)
|
||||
{
|
||||
if (!darklandsFlashActive) return;
|
||||
static constexpr float kFadeDurationMs = 500.0f;
|
||||
const float step = static_cast<float>(deltaMs) / kFadeDurationMs;
|
||||
|
||||
if (darklandsFlashFadingIn) {
|
||||
darklandsFlashAlpha = min(darklandsFlashAlpha + step, 1.0f);
|
||||
if (darklandsFlashAlpha >= 1.0f) {
|
||||
isDarklands = !isDarklands;
|
||||
if (currentLocation) {
|
||||
if (isDarklands)
|
||||
currentLocation->scriptEngine.callDarklandsEnterCallback();
|
||||
else
|
||||
currentLocation->scriptEngine.callDarklandsExitCallback();
|
||||
}
|
||||
darklandsFlashFadingIn = false;
|
||||
}
|
||||
} else {
|
||||
darklandsFlashAlpha = max(darklandsFlashAlpha - step, 0.0f);
|
||||
if (darklandsFlashAlpha <= 0.0f) {
|
||||
darklandsFlashAlpha = 0.0f;
|
||||
darklandsFlashActive = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Game::drawDarklandsFlash()
|
||||
{
|
||||
if (darklandsFlashAlpha <= 0.001f) return;
|
||||
|
||||
const float W = static_cast<float>(Environment::projectionWidth);
|
||||
const float H = static_cast<float>(Environment::projectionHeight);
|
||||
|
||||
if (darklandsFlashQuadW != W || darklandsFlashQuadH != H) {
|
||||
darklandsFlashQuadW = W;
|
||||
darklandsFlashQuadH = H;
|
||||
VertexDataStruct data;
|
||||
data.PositionData = {
|
||||
{0.f, 0.f, 0.f}, {0.f, H, 0.f}, {W, H, 0.f},
|
||||
{W, H, 0.f}, {W, 0.f, 0.f}, {0.f, 0.f, 0.f}
|
||||
};
|
||||
data.TexCoordData = {
|
||||
{0.f, 0.f}, {0.f, 1.f}, {1.f, 1.f},
|
||||
{1.f, 1.f}, {1.f, 0.f}, {0.f, 0.f}
|
||||
};
|
||||
darklandsFlashQuad.data = std::move(data);
|
||||
darklandsFlashQuad.RefreshVBO();
|
||||
}
|
||||
|
||||
glEnable(GL_BLEND);
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
|
||||
renderer.shaderManager.PushShader("darklands_flash");
|
||||
renderer.PushProjectionMatrix(0.0f, W, 0.0f, H, -10.0f, 10.0f);
|
||||
renderer.PushMatrix();
|
||||
renderer.LoadIdentity();
|
||||
|
||||
renderer.RenderUniform1f("uAlpha", darklandsFlashAlpha);
|
||||
renderer.DrawVertexRenderStruct(darklandsFlashQuad);
|
||||
|
||||
renderer.PopMatrix();
|
||||
renderer.PopProjectionMatrix();
|
||||
renderer.shaderManager.PopShader();
|
||||
|
||||
glDisable(GL_BLEND);
|
||||
}
|
||||
|
||||
} // namespace ZL
|
||||
+18
@@ -47,9 +47,16 @@ namespace ZL {
|
||||
|
||||
bool navigationEditorMode = false;
|
||||
|
||||
// Global darklands state — persists across location transitions.
|
||||
bool isDarklands = false;
|
||||
// Returns false if a transition is already in progress.
|
||||
bool startDarklandsTransition();
|
||||
|
||||
Inventory inventory;
|
||||
InteractiveObject* pickedUpObject = nullptr;
|
||||
|
||||
std::unordered_map<std::string, int> globalInts;
|
||||
|
||||
MenuManager menuManager;
|
||||
|
||||
void activateSlowMoEffect();
|
||||
@@ -105,6 +112,17 @@ namespace ZL {
|
||||
static void onResourcesZipError(const char* filename);
|
||||
#endif
|
||||
|
||||
// White-flash transition state
|
||||
float darklandsFlashAlpha = 0.0f;
|
||||
bool darklandsFlashActive = false;
|
||||
bool darklandsFlashFadingIn = true;
|
||||
VertexRenderStruct darklandsFlashQuad;
|
||||
float darklandsFlashQuadW = -1.0f;
|
||||
float darklandsFlashQuadH = -1.0f;
|
||||
|
||||
void updateDarklandsFlash(int64_t deltaMs);
|
||||
void drawDarklandsFlash();
|
||||
|
||||
int64_t newTickCount;
|
||||
int64_t lastTickCount;
|
||||
|
||||
|
||||
@@ -270,77 +270,6 @@ namespace ZL
|
||||
}
|
||||
}
|
||||
|
||||
bool Location::startDarklandsTransition()
|
||||
{
|
||||
if (darklandsFlashActive) return false;
|
||||
darklandsFlashActive = true;
|
||||
darklandsFlashFadingIn = true;
|
||||
darklandsFlashAlpha = 0.0f;
|
||||
return true;
|
||||
}
|
||||
|
||||
void Location::updateDarklandsFlash(int64_t deltaMs)
|
||||
{
|
||||
if (!darklandsFlashActive) return;
|
||||
static constexpr float kFadeDurationMs = 500.0f;
|
||||
const float step = static_cast<float>(deltaMs) / kFadeDurationMs;
|
||||
|
||||
if (darklandsFlashFadingIn) {
|
||||
darklandsFlashAlpha = min(darklandsFlashAlpha + step, 1.0f);
|
||||
if (darklandsFlashAlpha >= 1.0f) {
|
||||
isDarklands = !isDarklands;
|
||||
darklandsFlashFadingIn = false;
|
||||
}
|
||||
} else {
|
||||
darklandsFlashAlpha = max(darklandsFlashAlpha - step, 0.0f);
|
||||
if (darklandsFlashAlpha <= 0.0f) {
|
||||
darklandsFlashAlpha = 0.0f;
|
||||
darklandsFlashActive = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Location::drawDarklandsFlash()
|
||||
{
|
||||
if (darklandsFlashAlpha <= 0.001f) return;
|
||||
|
||||
const float W = static_cast<float>(Environment::projectionWidth);
|
||||
const float H = static_cast<float>(Environment::projectionHeight);
|
||||
|
||||
if (darklandsFlashQuadW != W || darklandsFlashQuadH != H) {
|
||||
darklandsFlashQuadW = W;
|
||||
darklandsFlashQuadH = H;
|
||||
VertexDataStruct data;
|
||||
data.PositionData = {
|
||||
{0.f, 0.f, 0.f}, {0.f, H, 0.f}, {W, H, 0.f},
|
||||
{W, H, 0.f}, {W, 0.f, 0.f}, {0.f, 0.f, 0.f}
|
||||
};
|
||||
data.TexCoordData = {
|
||||
{0.f, 0.f}, {0.f, 1.f}, {1.f, 1.f},
|
||||
{1.f, 1.f}, {1.f, 0.f}, {0.f, 0.f}
|
||||
};
|
||||
darklandsFlashQuad.data = std::move(data);
|
||||
darklandsFlashQuad.RefreshVBO();
|
||||
}
|
||||
|
||||
glEnable(GL_BLEND);
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
|
||||
renderer.shaderManager.PushShader("darklands_flash");
|
||||
renderer.PushProjectionMatrix(0.0f, W, 0.0f, H, -10.0f, 10.0f);
|
||||
renderer.PushMatrix();
|
||||
renderer.LoadIdentity();
|
||||
|
||||
renderer.RenderUniform1f("uAlpha", darklandsFlashAlpha);
|
||||
renderer.DrawVertexRenderStruct(darklandsFlashQuad);
|
||||
|
||||
renderer.PopMatrix();
|
||||
renderer.PopProjectionMatrix();
|
||||
renderer.shaderManager.PopShader();
|
||||
|
||||
glDisable(GL_BLEND);
|
||||
}
|
||||
|
||||
void Location::setupNavigation(const std::vector<std::string>& paths)
|
||||
{
|
||||
navigationMapPaths = paths;
|
||||
@@ -777,7 +706,6 @@ namespace ZL
|
||||
if (npc) npc->drawHealthBar(renderer, currentView, proj);
|
||||
}
|
||||
}
|
||||
drawDarklandsFlash();
|
||||
}
|
||||
|
||||
void Location::drawShadowDepthPass()
|
||||
@@ -977,7 +905,6 @@ namespace ZL
|
||||
if (npc) npc->drawHealthBar(renderer, cameraViewMatrix, proj);
|
||||
}
|
||||
}
|
||||
drawDarklandsFlash();
|
||||
}
|
||||
|
||||
void Location::drawGameDarklands()
|
||||
@@ -1047,7 +974,6 @@ namespace ZL
|
||||
if (npc) npc->drawHealthBar(renderer, currentView, proj);
|
||||
}
|
||||
}
|
||||
drawDarklandsFlash();
|
||||
}
|
||||
|
||||
bool Location::setNavigationAreaAvailable(const std::string& areaName, bool available)
|
||||
@@ -1208,8 +1134,6 @@ namespace ZL
|
||||
|
||||
void Location::update(int64_t delta)
|
||||
{
|
||||
updateDarklandsFlash(delta);
|
||||
|
||||
for (auto& intObj : interactiveObjects) {
|
||||
intObj.update(delta);
|
||||
}
|
||||
|
||||
+5
-13
@@ -83,10 +83,13 @@ namespace ZL
|
||||
|
||||
std::vector<TriggerZone> triggerZones;
|
||||
|
||||
// Set by Game and kept in sync across location transitions.
|
||||
// Read by draw functions and raycast — do not write from Location code.
|
||||
bool isDarklands = false;
|
||||
|
||||
// Returns false if a transition is already in progress (guards against double-press).
|
||||
bool startDarklandsTransition();
|
||||
// Set by Game after setup(). Lua and onDeathAnimComplete call this to
|
||||
// request the transition without coupling Location to Game directly.
|
||||
std::function<bool()> requestDarklandsTransition;
|
||||
|
||||
// Navigation editor — toggle with 'N', save with 'B', right-click to finalize polygon
|
||||
bool navigationEditorMode = false;
|
||||
@@ -143,17 +146,6 @@ namespace ZL
|
||||
Inventory& inventory;
|
||||
|
||||
private:
|
||||
// White-flash transition state for darklands toggle
|
||||
float darklandsFlashAlpha = 0.0f;
|
||||
bool darklandsFlashActive = false;
|
||||
bool darklandsFlashFadingIn = true;
|
||||
VertexRenderStruct darklandsFlashQuad;
|
||||
float darklandsFlashQuadW = -1.0f;
|
||||
float darklandsFlashQuadH = -1.0f;
|
||||
|
||||
void updateDarklandsFlash(int64_t deltaMs);
|
||||
void drawDarklandsFlash();
|
||||
|
||||
void resolveCharacterCollisions();
|
||||
void updateDynamicReplans(int64_t deltaMs);
|
||||
void loadTeleportZones(const std::string& jsonPath, const char* zipFile);
|
||||
|
||||
@@ -16,6 +16,11 @@ namespace ZL {
|
||||
std::unordered_map<std::string, sol::protected_function> triggerEnterCallbacks;
|
||||
std::unordered_map<std::string, sol::protected_function> triggerExitCallbacks;
|
||||
std::unordered_map<std::string, sol::protected_function> cutsceneCompleteCallbacks;
|
||||
std::unordered_map<std::string, int>* globalInts = nullptr;
|
||||
sol::protected_function locationEnterCallback;
|
||||
sol::protected_function locationExitCallback;
|
||||
sol::protected_function darklandsEnterCallback;
|
||||
sol::protected_function darklandsExitCallback;
|
||||
};
|
||||
|
||||
ScriptEngine::ScriptEngine() = default;
|
||||
@@ -163,6 +168,63 @@ namespace ZL {
|
||||
this_impl->triggerExitCallbacks[zoneId] = onExit.as<sol::protected_function>();
|
||||
});
|
||||
|
||||
// start_darklands_transition()
|
||||
// Triggers the white-flash transition to toggle darklands mode.
|
||||
// Does nothing if a transition is already in progress.
|
||||
api.set_function("start_darklands_transition",
|
||||
[game]() {
|
||||
if (game->requestDarklandsTransition)
|
||||
game->requestDarklandsTransition();
|
||||
});
|
||||
|
||||
// set_location_callbacks(on_enter, on_exit)
|
||||
// on_enter() called once when the player arrives at this location.
|
||||
// on_exit() called once just before the player leaves this location.
|
||||
api.set_function("set_location_callbacks",
|
||||
[this_impl = impl.get()](sol::object onEnter, sol::object onExit) {
|
||||
if (onEnter.is<sol::protected_function>())
|
||||
this_impl->locationEnterCallback = onEnter.as<sol::protected_function>();
|
||||
if (onExit.is<sol::protected_function>())
|
||||
this_impl->locationExitCallback = onExit.as<sol::protected_function>();
|
||||
});
|
||||
|
||||
// is_darklands() → bool
|
||||
api.set_function("is_darklands",
|
||||
[game]() { return game->isDarklands; });
|
||||
|
||||
// set_player_hp(value) — sets the player's current HP directly.
|
||||
api.set_function("set_player_hp",
|
||||
[game](float value) {
|
||||
if (game->player)
|
||||
game->player->hp = value;
|
||||
});
|
||||
|
||||
// Global integer store — shared across all location scripts.
|
||||
// setIntValue(key, value) / getIntValue(key) → int (0 if not set)
|
||||
api.set_function("setIntValue",
|
||||
[this_impl = impl.get()](const std::string& key, int value) {
|
||||
if (this_impl->globalInts)
|
||||
(*this_impl->globalInts)[key] = value;
|
||||
});
|
||||
api.set_function("getIntValue",
|
||||
[this_impl = impl.get()](const std::string& key) -> int {
|
||||
if (!this_impl->globalInts) return 0;
|
||||
auto it = this_impl->globalInts->find(key);
|
||||
return it != this_impl->globalInts->end() ? it->second : 0;
|
||||
});
|
||||
|
||||
// set_darklands_callbacks(on_enter, on_exit)
|
||||
// on_enter() called when the player switches into Darklands mode.
|
||||
// on_exit() called when the player switches back to normal mode.
|
||||
// Pass nil to omit either callback.
|
||||
api.set_function("set_darklands_callbacks",
|
||||
[this_impl = impl.get()](sol::object onEnter, sol::object onExit) {
|
||||
if (onEnter.is<sol::protected_function>())
|
||||
this_impl->darklandsEnterCallback = onEnter.as<sol::protected_function>();
|
||||
if (onExit.is<sol::protected_function>())
|
||||
this_impl->darklandsExitCallback = onExit.as<sol::protected_function>();
|
||||
});
|
||||
|
||||
api.set_function("set_trigger_zone_enabled",
|
||||
[game](int index, bool value) {
|
||||
auto& triggerZones = game->triggerZones;
|
||||
@@ -405,6 +467,46 @@ namespace ZL {
|
||||
}
|
||||
}
|
||||
|
||||
void ScriptEngine::setGlobalStore(std::unordered_map<std::string, int>* store) {
|
||||
if (impl) impl->globalInts = store;
|
||||
}
|
||||
|
||||
void ScriptEngine::callLocationEnterCallback() {
|
||||
if (!impl || !impl->locationEnterCallback.valid()) return;
|
||||
auto result = impl->locationEnterCallback();
|
||||
if (!result.valid()) {
|
||||
sol::error err = result;
|
||||
std::cerr << "[SCRIPT] location enter callback error: " << err.what() << "\n";
|
||||
}
|
||||
}
|
||||
|
||||
void ScriptEngine::callLocationExitCallback() {
|
||||
if (!impl || !impl->locationExitCallback.valid()) return;
|
||||
auto result = impl->locationExitCallback();
|
||||
if (!result.valid()) {
|
||||
sol::error err = result;
|
||||
std::cerr << "[SCRIPT] location exit callback error: " << err.what() << "\n";
|
||||
}
|
||||
}
|
||||
|
||||
void ScriptEngine::callDarklandsEnterCallback() {
|
||||
if (!impl || !impl->darklandsEnterCallback.valid()) return;
|
||||
auto result = impl->darklandsEnterCallback();
|
||||
if (!result.valid()) {
|
||||
sol::error err = result;
|
||||
std::cerr << "[SCRIPT] darklands enter callback error: " << err.what() << "\n";
|
||||
}
|
||||
}
|
||||
|
||||
void ScriptEngine::callDarklandsExitCallback() {
|
||||
if (!impl || !impl->darklandsExitCallback.valid()) return;
|
||||
auto result = impl->darklandsExitCallback();
|
||||
if (!result.valid()) {
|
||||
sol::error err = result;
|
||||
std::cerr << "[SCRIPT] darklands exit callback error: " << err.what() << "\n";
|
||||
}
|
||||
}
|
||||
|
||||
void ScriptEngine::callCutsceneCompleteCallback(const std::string& cutsceneId) {
|
||||
if (!impl) return;
|
||||
auto it = impl->cutsceneCompleteCallbacks.find(cutsceneId);
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#pragma once
|
||||
#include <string>
|
||||
#include <memory>
|
||||
#include <unordered_map>
|
||||
|
||||
namespace ZL {
|
||||
|
||||
@@ -27,6 +28,14 @@ public:
|
||||
void callTriggerEnterCallback(const std::string& zoneId);
|
||||
void callTriggerExitCallback(const std::string& zoneId);
|
||||
|
||||
void setGlobalStore(std::unordered_map<std::string, int>* store);
|
||||
|
||||
void callLocationEnterCallback();
|
||||
void callLocationExitCallback();
|
||||
|
||||
void callDarklandsEnterCallback();
|
||||
void callDarklandsExitCallback();
|
||||
|
||||
void callCutsceneCompleteCallback(const std::string& cutsceneId);
|
||||
|
||||
private:
|
||||
|
||||
@@ -180,6 +180,7 @@ namespace ZL {
|
||||
}
|
||||
|
||||
if (shaderResourceMap.find(shaderName) == shaderResourceMap.end()) {
|
||||
std::cout << "Shader does not exist: " << shaderName << std::endl;
|
||||
throw std::runtime_error("Shader does not exist!");
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user