diff --git a/cutsceneEditor/src/constants/images.ts b/cutsceneEditor/src/constants/images.ts index 60a4e27..62b85fd 100644 --- a/cutsceneEditor/src/constants/images.ts +++ b/cutsceneEditor/src/constants/images.ts @@ -1,12 +1,11 @@ export const AVAILABLE_IMAGES: string[] = [ - 'resources/w/cutscenes/cutscene1/cutscene1_wall_x.png', - 'resources/w/cutscenes/cutscene1/cutscene1_aida1_x.png', - 'resources/w/cutscenes/cutscene1/cutscene1_aida2_x.png', - 'resources/w/cutscenes/cutscene1/cutscene1_aida3_x.png', - 'resources/w/cutscenes/cutscene1/cutscene1_heads_x.png', - 'resources/w/cutscenes/cutscene2/scr1.png', - 'resources/w/cutscenes/cutscene2/scr2.png', - 'resources/w/cutscenes/cutscene2/scr3.png', - 'resources/w/cutscenes/cutscene2/scr4.png', + 'resources/w/cutscenes/cutscene2/cs2_background.png', + 'resources/w/cutscenes/cutscene2/cs2_books.png', + 'resources/w/cutscenes/cutscene2/cs2_chair.png', + 'resources/w/cutscenes/cutscene2/cs2_gg001.png', + 'resources/w/cutscenes/cutscene2/cs2_gg002.png', + 'resources/w/cutscenes/cutscene2/cs2_gg003.png', + 'resources/w/cutscenes/cutscene2/cs2_gg004.png', + 'resources/w/cutscenes/cutscene2/cs2_foreground.png', 'resources/black.png', ]; diff --git a/resources/dialogue/cutscenes005.json b/resources/dialogue/cutscenes005.json index b8fed99..d0f0d17 100644 --- a/resources/dialogue/cutscenes005.json +++ b/resources/dialogue/cutscenes005.json @@ -414,19 +414,19 @@ { "id": "computer_cutscene001", "skippable": true, - "durationMs": 9000, + "durationMs": 12000, "fadeOutMs": 500, "fadeInMs": 500, "endFadeOutMs": 0, "endFadeInMs": 500, - "onFadeInCallback": "on_sleep_cutscene", + "onFadeInCallback": "", "imageSegments": [ { "path": "resources/black.png", "width": 1280, "height": 720, "startMs": 0, - "endMs": 9000, + "endMs": 13000, "fadeInMs": 0, "fadeOutMs": 0, "easing": "Linear", @@ -442,82 +442,162 @@ } }, { - "path": "resources/w/cutscenes/cutscene2/scr1.png", + "path": "resources/w/cutscenes/cutscene2/cs2_background.png", "width": 1280, "height": 720, "startMs": 0, - "endMs": 2510, - "fadeInMs": 500, - "fadeOutMs": 0, + "endMs": 11984, + "fadeInMs": 0, + "fadeOutMs": 1000, "easing": "Linear", "from": { "centerX": 0.5, - "centerY": 0.55, + "centerY": 0.5, "scale": 1 }, "to": { "centerX": 0.5, - "centerY": 0.55, + "centerY": 0.5, + "scale": 1 + } + }, + { + "path": "resources/w/cutscenes/cutscene2/cs2_books.png", + "width": 1280, + "height": 720, + "startMs": 0, + "endMs": 11550, + "fadeInMs": 0, + "fadeOutMs": 1000, + "easing": "Linear", + "from": { + "centerX": 0.46, + "centerY": 0.5, + "scale": 1.1 + }, + "to": { + "centerX": 0.58, + "centerY": 0.5, + "scale": 1.2 + } + }, + { + "path": "resources/w/cutscenes/cutscene2/cs2_chair.png", + "width": 1280, + "height": 720, + "startMs": 17, + "endMs": 10767, + "fadeInMs": 0, + "fadeOutMs": 300, + "easing": "Linear", + "from": { + "centerX": 0.47, + "centerY": 0.5, + "scale": 1.1 + }, + "to": { + "centerX": 0.57, + "centerY": 0.5, + "scale": 1.3 + } + }, + { + "path": "resources/w/cutscenes/cutscene2/cs2_gg001.png", + "width": 1280, + "height": 720, + "startMs": 0, + "endMs": 3083, + "fadeInMs": 0, + "fadeOutMs": 1000, + "easing": "Linear", + "from": { + "centerX": 0.47, + "centerY": 0.5, + "scale": 1.1 + }, + "to": { + "centerX": 0.5, + "centerY": 0.5, + "scale": 1.15 + } + }, + { + "path": "resources/w/cutscenes/cutscene2/cs2_gg002.png", + "width": 1280, + "height": 720, + "startMs": 1850, + "endMs": 4883, + "fadeInMs": 1000, + "fadeOutMs": 1000, + "easing": "Linear", + "from": { + "centerX": 0.5, + "centerY": 0.5, + "scale": 1.15 + }, + "to": { + "centerX": 0.53, + "centerY": 0.5, + "scale": 1.2 + } + }, + { + "path": "resources/w/cutscenes/cutscene2/cs2_gg003.png", + "width": 1280, + "height": 720, + "startMs": 3950, + "endMs": 7083, + "fadeInMs": 1000, + "fadeOutMs": 1000, + "easing": "Linear", + "from": { + "centerX": 0.49, + "centerY": 0.5, + "scale": 1.05 + }, + "to": { + "centerX": 0.55, + "centerY": 0.5, "scale": 1.1 } }, { - "path": "resources/w/cutscenes/cutscene2/scr2.png", + "path": "resources/w/cutscenes/cutscene2/cs2_gg004.png", "width": 1280, "height": 720, - "startMs": 956, - "endMs": 3522, - "fadeInMs": 1500, - "fadeOutMs": 500, + "startMs": 6050, + "endMs": 10100, + "fadeInMs": 1000, + "fadeOutMs": 1000, "easing": "Linear", "from": { - "centerX": 0.5, - "centerY": 0.6, - "scale": 1.3 + "centerX": 0.47, + "centerY": 0.5, + "scale": 1.1 }, "to": { - "centerX": 0.5, - "centerY": 0.6, - "scale": 1.5 + "centerX": 0.53, + "centerY": 0.5, + "scale": 1.2 } }, { - "path": "resources/w/cutscenes/cutscene2/scr4.png", + "path": "resources/w/cutscenes/cutscene2/cs2_foreground.png", "width": 1280, "height": 720, - "startMs": 4849, - "endMs": 6964, + "startMs": 0, + "endMs": 10100, "fadeInMs": 0, - "fadeOutMs": 500, + "fadeOutMs": 3000, "easing": "Linear", "from": { "centerX": 0.5, - "centerY": 0.35, + "centerY": 0.5, "scale": 1 }, "to": { "centerX": 0.5, - "centerY": 0.35, - "scale": 1 - } - }, - { - "path": "resources/w/cutscenes/cutscene2/scr3.png", - "width": 1280, - "height": 720, - "startMs": 3594, - "endMs": 6478, - "fadeInMs": 500, - "fadeOutMs": 1500, - "easing": "Linear", - "from": { - "centerX": 0.5, - "centerY": 0.6, - "scale": 1 - }, - "to": { - "centerX": 0.5, - "centerY": 0.6, + "centerY": 0.5, "scale": 1 } } @@ -525,21 +605,21 @@ "lines": [ { "speaker": "", - "text": "Я начал делать презентацию по книге.", + "text": "Я сел за компьютер и начал писать эссе по книге", "durationMs": 3000, "waitForConfirm": false, "luaCallback": "" }, { "speaker": "", - "text": "Книга была такая скучная что я уснул.", - "durationMs": 3000, + "text": "Книга была очень скучной. Как будто кто-то наложил на книгу чары сна.", + "durationMs": 4000, "waitForConfirm": false, "luaCallback": "" }, { "speaker": "", - "text": "И я проснулся уже ночью...", + "text": "Неудивительно что я стал понемногу засыпать...", "durationMs": 3000, "waitForConfirm": false, "luaCallback": "" diff --git a/resources/w/cutscenes/cutscene2/cs2_background.png b/resources/w/cutscenes/cutscene2/cs2_background.png new file mode 100644 index 0000000..c7ee0e9 --- /dev/null +++ b/resources/w/cutscenes/cutscene2/cs2_background.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:163df56f56d8a664d6a35097aecda8f235669c796bf0052a4ad4f883fc7733d3 +size 248782 diff --git a/resources/w/cutscenes/cutscene2/cs2_books.png b/resources/w/cutscenes/cutscene2/cs2_books.png new file mode 100644 index 0000000..8caf298 --- /dev/null +++ b/resources/w/cutscenes/cutscene2/cs2_books.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e04d18c5b560d8ef1cf93d29406789448b02cc207abf339b7f209065b368eec2 +size 703707 diff --git a/resources/w/cutscenes/cutscene2/cs2_chair.png b/resources/w/cutscenes/cutscene2/cs2_chair.png new file mode 100644 index 0000000..c6f03a9 --- /dev/null +++ b/resources/w/cutscenes/cutscene2/cs2_chair.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:650b98d0db6ee481052057e813502aee93fe3d1f7b43b1c80746e4acce9b5486 +size 114205 diff --git a/resources/w/cutscenes/cutscene2/cs2_foreground.png b/resources/w/cutscenes/cutscene2/cs2_foreground.png new file mode 100644 index 0000000..e3d3a0b --- /dev/null +++ b/resources/w/cutscenes/cutscene2/cs2_foreground.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e55b90d1a51c9948714e2d25afcaa840ca807f7068cd1d375a61d03ed16b9f4a +size 412061 diff --git a/resources/w/cutscenes/cutscene2/cs2_gg001.png b/resources/w/cutscenes/cutscene2/cs2_gg001.png new file mode 100644 index 0000000..1bb5a8e --- /dev/null +++ b/resources/w/cutscenes/cutscene2/cs2_gg001.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b11e17bd6674d3121cfdd6f6da1573f69dfd1af649d9df3c24793710374c58c7 +size 452463 diff --git a/resources/w/cutscenes/cutscene2/cs2_gg002.png b/resources/w/cutscenes/cutscene2/cs2_gg002.png new file mode 100644 index 0000000..bcfa832 --- /dev/null +++ b/resources/w/cutscenes/cutscene2/cs2_gg002.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:47e67c70c4931bf108d7308364a1ff975e5b6127d74f58b9ab3455d3b0c07ed0 +size 451811 diff --git a/resources/w/cutscenes/cutscene2/cs2_gg003.png b/resources/w/cutscenes/cutscene2/cs2_gg003.png new file mode 100644 index 0000000..656fc73 --- /dev/null +++ b/resources/w/cutscenes/cutscene2/cs2_gg003.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:824a6ef3d15dcce7d7f846837399b866f5b42f876f24af76ddd5066b0d7ed4a2 +size 432272 diff --git a/resources/w/cutscenes/cutscene2/cs2_gg004.png b/resources/w/cutscenes/cutscene2/cs2_gg004.png new file mode 100644 index 0000000..87a0b5f --- /dev/null +++ b/resources/w/cutscenes/cutscene2/cs2_gg004.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:17bf25870761d364b6cae6e80e545d94cb12cb2de980075c08ffd922409f2b0b +size 237463 diff --git a/resources/w/cutscenes/cutscene2/scr1.png b/resources/w/cutscenes/cutscene2/scr1.png deleted file mode 100644 index 00cb709..0000000 --- a/resources/w/cutscenes/cutscene2/scr1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6516e33b563f3ea0149a46fd76c9cef35031cb1efad738579bfb810bf8fb45bb -size 856497 diff --git a/resources/w/cutscenes/cutscene2/scr2.png b/resources/w/cutscenes/cutscene2/scr2.png deleted file mode 100644 index 0f7a798..0000000 --- a/resources/w/cutscenes/cutscene2/scr2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6593670001b5eef629acebd90dbf08b9b3e1b4c5bcd03df893bfd9529dad5efb -size 856703 diff --git a/resources/w/cutscenes/cutscene2/scr3.png b/resources/w/cutscenes/cutscene2/scr3.png deleted file mode 100644 index 5062dd8..0000000 --- a/resources/w/cutscenes/cutscene2/scr3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:27883838ec5d9a7adc40a484cc80f6aa4bb81de1631a3f1e9dd7986e74d49166 -size 842904 diff --git a/resources/w/cutscenes/cutscene2/scr4.png b/resources/w/cutscenes/cutscene2/scr4.png deleted file mode 100644 index 3524be7..0000000 --- a/resources/w/cutscenes/cutscene2/scr4.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:24f6d785879f93ed2e9ddef21dfbe27a0dcef564e9d7aadb7e4d31ec81226431 -size 824230 diff --git a/src/Game.cpp b/src/Game.cpp index d446d49..057a10b 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -1004,9 +1004,10 @@ namespace ZL case SDLK_f: currentLocation->dialogueSystem.startDialogue("phone_night_aiperi001"); + break; case SDLK_e: - //currentLocation->dialogueSystem.startCutscene("lection_cutscene001"); //.startDialogue("test_cutscene_pan_dialogue"); + currentLocation->dialogueSystem.startCutscene("computer_cutscene001"); //.startDialogue("test_cutscene_pan_dialogue"); break; diff --git a/src/Location.cpp b/src/Location.cpp index c5eb749..688e4bc 100644 --- a/src/Location.cpp +++ b/src/Location.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include "GameConstants.h" #include "Character.h" #include "external/nlohmann/json.hpp" @@ -1325,6 +1326,23 @@ namespace ZL static constexpr int64_t kReplanCooldownMs = 500; static constexpr float kStuckMovementThreshold = 0.02f; static constexpr int kStuckFrameThreshold = 4; + static constexpr float kStuckPauseMin = 0.5f; + static constexpr float kStuckPauseMax = 1.0f; + + const float deltaS = static_cast(deltaMs) / 1000.f; + + // Tick down pause timers; replan NPCs when their pause expires. + for (auto it = stuckPauseRemainingS.begin(); it != stuckPauseRemainingS.end();) { + it->second -= deltaS; + if (it->second <= 0.f) { + if (!it->first->isPlayer) { + it->first->forceReplan(); + } + it = stuckPauseRemainingS.erase(it); + } else { + ++it; + } + } for (auto it = replanCooldownRemainingMs.begin(); it != replanCooldownRemainingMs.end();) { it->second -= deltaMs; @@ -1362,8 +1380,16 @@ namespace ZL if (c->isMoving()) { if (moved < kStuckMovementThreshold) { if (++stuckFrameCounts[c] >= kStuckFrameThreshold) { - c->forceReplan(); + c->stopInPlace(); stuckFrameCounts[c] = 0; + if (stuckPauseRemainingS.find(c) == stuckPauseRemainingS.end()) { + if (!c->isPlayer) { + static std::mt19937 rng(std::random_device{}()); + std::uniform_real_distribution pauseDist(kStuckPauseMin, kStuckPauseMax); + stuckPauseRemainingS[c] = pauseDist(rng); + } + // Player just stops; replan is not scheduled. + } } } else { stuckFrameCounts[c] = 0; diff --git a/src/Location.h b/src/Location.h index d9b4cc4..65c048a 100644 --- a/src/Location.h +++ b/src/Location.h @@ -183,6 +183,7 @@ namespace ZL std::unordered_map lastCharacterPositions; std::unordered_map replanCooldownRemainingMs; std::unordered_map stuckFrameCounts; + std::unordered_map stuckPauseRemainingS; static constexpr float NPC_BUMP_CALLBACK_COOLDOWN = 5.0f; std::unordered_map npcBumpedByPlayerCooldown;