]> git.seodisparate.com - RockPaperScissorsDuel/commitdiff
Begin work on 3D renderer, minor gameover fix
authorStephen Seo <seo.disparate@gmail.com>
Thu, 12 Jan 2023 03:17:41 +0000 (12:17 +0900)
committerStephen Seo <seo.disparate@gmail.com>
Thu, 12 Jan 2023 03:17:41 +0000 (12:17 +0900)
CMakeLists.txt
src/3d_renderer.cc [new file with mode: 0644]
src/3d_renderer.h [new file with mode: 0644]
src/basic_renderer.cc
src/basic_renderer.h
src/game_renderer.h
src/main.cc
wasm_build/Makefile
wasm_build/client.js
wasm_build/logic.js

index 6504af55e6daac70bc2a1e308b365fbb27c0e413..16f8644086be2b079466c557630ea78076b99f5d 100644 (file)
@@ -19,6 +19,7 @@ set(RPSDuelNative_SOURCES
     "${CMAKE_CURRENT_SOURCE_DIR}/src/basic_renderer.cc"
     "${CMAKE_CURRENT_SOURCE_DIR}/src/ems.cc"
     "${CMAKE_CURRENT_SOURCE_DIR}/src/helpers.cc"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/3d_renderer.cc"
 )
 
 set(RPSDuelNative_HEADERS
@@ -27,6 +28,7 @@ set(RPSDuelNative_HEADERS
     "${CMAKE_CURRENT_SOURCE_DIR}/src/helpers.h"
     "${CMAKE_CURRENT_SOURCE_DIR}/src/game_renderer.h"
     "${CMAKE_CURRENT_SOURCE_DIR}/src/basic_renderer.h"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/3d_renderer.h"
 )
 
 add_executable(RPSDuelNative ${RPSDuelNative_SOURCES})
diff --git a/src/3d_renderer.cc b/src/3d_renderer.cc
new file mode 100644 (file)
index 0000000..f09fcbb
--- /dev/null
@@ -0,0 +1,24 @@
+#include "3d_renderer.h"
+
+Renderer3D::Renderer3D() {}
+
+Renderer3D::~Renderer3D() {}
+
+void Renderer3D::update_state(const char *playerOne, const char *playerTwo,
+                              const char *currentPlayer, char first_first,
+                              char first_second, char first_third,
+                              char second_first, char second_second,
+                              char second_third, bool first_ready,
+                              bool second_ready, int pos, int matchup_idx,
+                              bool gameover) {}
+
+void Renderer3D::do_update() {
+  update_impl();
+  draw_impl();
+}
+
+void Renderer3D::screen_size_changed() {}
+
+void Renderer3D::update_impl() {}
+
+void Renderer3D::draw_impl() {}
diff --git a/src/3d_renderer.h b/src/3d_renderer.h
new file mode 100644 (file)
index 0000000..a6adcd2
--- /dev/null
@@ -0,0 +1,27 @@
+#ifndef ROCK_PAPER_SCISSORS_3D_RENDERER_H_
+#define ROCK_PAPER_SCISSORS_3D_RENDERER_H_
+
+#include "game_renderer.h"
+
+class Renderer3D : public GameRenderer {
+ public:
+  Renderer3D();
+  ~Renderer3D() override;
+
+  void update_state(const char *playerOne, const char *playerTwo,
+                    const char *currentPlayer, char first_first,
+                    char first_second, char first_third, char second_first,
+                    char second_second, char second_third, bool first_ready,
+                    bool second_ready, int pos, int matchup_idx,
+                    bool gameover) override;
+
+  void do_update() override;
+
+  void screen_size_changed() override;
+
+ private:
+  void update_impl();
+  void draw_impl();
+};
+
+#endif
index ed805f57ea0217d6058f78f7ccae193e086123d7..5d02b7ada84d85bc1c1afb8912f9fda28bc95513 100644 (file)
@@ -38,7 +38,8 @@ void BasicRenderer::update_state(const char *playerOne, const char *playerTwo,
                                  char first_second, char first_third,
                                  char second_first, char second_second,
                                  char second_third, bool first_ready,
-                                 bool second_ready, int pos, int matchup_idx) {
+                                 bool second_ready, int pos, int matchup_idx,
+                                 bool gameover) {
   // TODO DEBUG
   // if (std::strcmp(playerOne, currentPlayer) == 0) {
   //  std::clog << "update_state:\n"
@@ -122,6 +123,10 @@ void BasicRenderer::update_state(const char *playerOne, const char *playerTwo,
     prevPos = cachedPos;
     cachedPos = pos;
   }
+
+  if (gameover) {
+    flags.set(14);
+  }
 }
 
 void BasicRenderer::do_update() {
@@ -291,7 +296,9 @@ void BasicRenderer::update_impl() {
              GetTouchY() <= GetScreenHeight() - triple_single_width * 2) {
       if (picked[0] != 0 && picked[1] != 0 && picked[2] != 0 &&
           !flags.test(0)) {
-        call_js_set_ready();
+        if (!flags.test(14)) {
+          call_js_set_ready();
+        }
         flags.set(0);
         flags.set(3);
       }
@@ -321,7 +328,9 @@ void BasicRenderer::update_impl() {
 
   if (flags.test(0) && flags.test(3) && flags.test(10) && flags.test(11)) {
     char buf[6] = {picked[0], 0, picked[1], 0, picked[2], 0};
-    call_js_set_choices(&buf[0], &buf[2], &buf[4]);
+    if (!flags.test(14)) {
+      call_js_set_choices(&buf[0], &buf[2], &buf[4]);
+    }
     flags.reset(3);
     flags.set(4);
   } else if (flags.test(0) && !flags.test(3) && flags.test(4)) {
@@ -333,7 +342,9 @@ void BasicRenderer::update_impl() {
       resultsTimer = RESULTS_TIMER_MAX;
     } else if (flags.test(9)) {
       if (!flags.test(8)) {
-        call_js_set_ready();
+        if (!flags.test(14)) {
+          call_js_set_ready();
+        }
         flags.reset(9);
         flags.set(5);
       } else {
@@ -359,7 +370,9 @@ void BasicRenderer::update_impl() {
   if (flags.test(12) && flags.test(10) && flags.test(11) &&
       prevPos == cachedPos && is_choices_set() && is_opponent_choices_set()) {
     flags.reset(12);
-    call_js_request_update();
+    if (!flags.test(14)) {
+      call_js_request_update();
+    }
     // std::cout << "Requesting update..." << std::endl; // TODO DEBUG
   }
 
@@ -367,7 +380,9 @@ void BasicRenderer::update_impl() {
   if (requestTimer <= 0.0F) {
     requestTimer = REQUEST_TIMER_MAX;
     if (flags.test(10) && flags.test(11)) {
-      call_js_request_update();
+      if (!flags.test(14)) {
+        call_js_request_update();
+      }
       // std::cout << "Requesting update (timer)..." << std::endl; // TODO DEBUG
     }
   }
index 711674d4a9293b2b3f2e46a277a9a7ec0b9e0325..07659103e1422d86500e8c5b46cb901431c3df94 100644 (file)
@@ -21,7 +21,8 @@ class BasicRenderer : public GameRenderer {
                     const char *currentPlayer, char first_first,
                     char first_second, char first_third, char second_first,
                     char second_second, char second_third, bool first_ready,
-                    bool second_ready, int pos, int matchup_idx) override;
+                    bool second_ready, int pos, int matchup_idx,
+                    bool gameover) override;
 
   void do_update() override;
 
@@ -65,6 +66,7 @@ class BasicRenderer : public GameRenderer {
    * 11 - second ready
    * 12 - ready state dirty
    * 13 - screen size changed
+   * 14 - is gameover
    */
   std::bitset<32> flags;
   float readyTimer;
index 0d8f027a8dd07da53e2f6a6a94041cb94f32f767..1cee95ec5b701f437581ad58bf1ecb69f68e182c 100644 (file)
@@ -11,7 +11,8 @@ class GameRenderer {
                             char first_second, char first_third,
                             char second_first, char second_second,
                             char second_third, bool first_ready,
-                            bool second_ready, int pos, int matchup_idx) = 0;
+                            bool second_ready, int pos, int matchup_idx,
+                            bool gameover) = 0;
 
   virtual void do_update() = 0;
 
index 23e3c6431361bf0f4079994331a37af5c76bbd16..b8b229c9cc6db8e5a23613ff823bf2d414e29d35 100644 (file)
@@ -29,11 +29,12 @@ int EMSCRIPTEN_KEEPALIVE game_visual_update(
     const char *playerOne, const char *playerTwo, const char *currentPlayer,
     char first_first, char first_second, char first_third, char second_first,
     char second_second, char second_third, bool first_ready, bool second_ready,
-    int pos, int matchup_idx) {
+    int pos, int matchup_idx, bool gameover) {
   ((GameRenderer *)global_game_ptr)
       ->update_state(playerOne, playerTwo, currentPlayer, first_first,
                      first_second, first_third, second_first, second_second,
-                     second_third, first_ready, second_ready, pos, matchup_idx);
+                     second_third, first_ready, second_ready, pos, matchup_idx,
+                     gameover);
   return 0;
 }
 
index 47c052f0033b700da016afa3e8ec48fd7ac02e27..671262f322cc1f70c53ad61f0c13cc9ed204e438 100644 (file)
@@ -8,14 +8,16 @@ SOURCES = \
                ../src/main.cc \
                ../src/ems.cc \
                ../src/basic_renderer.cc \
-               ../src/helpers.cc
+               ../src/helpers.cc \
+               ../src/3d_renderer.cc
 
 HEADERS = \
                ../src/constants.h \
                ../src/ems.h \
                ../src/basic_renderer.h \
                ../src/helpers.h \
-               ../src/game_renderer.h
+               ../src/game_renderer.h \
+               ../src/3d_renderer.h
 
 CXX = source ${HOME}/git/emsdk/emsdk_env.sh && em++
 
index b284d61ba83c411bfb30481d2835992683ebdacb..726fa608ca054cdf05b54e2fa0eaaf25ba139899 100644 (file)
@@ -1,6 +1,6 @@
 Rune.initClient({
     visualUpdate: ({ newGame, yourPlayerId}) => {
-        const { player1, player2, first_choices, second_choices, ready, pos, matchup_idx } = newGame;
+        const { player1, player2, first_choices, second_choices, ready, pos, matchup_idx, gameover } = newGame;
 
         function is_choices_filled(choices) {
             for (let i = 0; i < 3; ++i) {
@@ -18,7 +18,7 @@ Rune.initClient({
                     'number', 'number', 'number',
                     'number', 'number', 'number',
                     'boolean', 'boolean',
-                    'number', 'number'],
+                    'number', 'number', 'boolean'],
                 [player1, player2,
                     yourPlayerId === undefined ? 'undefined' : yourPlayerId,
                     first_choices[0].charCodeAt(0),
@@ -28,7 +28,7 @@ Rune.initClient({
                     second_choices[1].charCodeAt(0),
                     second_choices[2].charCodeAt(0),
                     ready[0], ready[1],
-                    pos, matchup_idx]);
+                    pos, matchup_idx, gameover]);
         } else {
             Module.ccall('game_visual_update',
                 'number',
@@ -36,7 +36,7 @@ Rune.initClient({
                     'number', 'number', 'number',
                     'number', 'number', 'number',
                     'boolean', 'boolean',
-                    'number', 'number'],
+                    'number', 'number', 'boolean'],
                 [player1, player2,
                     yourPlayerId === undefined ? 'undefined' : yourPlayerId,
                     '?'.charCodeAt(0),
@@ -46,7 +46,7 @@ Rune.initClient({
                     '?'.charCodeAt(0),
                     '?'.charCodeAt(0),
                     ready[0], ready[1],
-                    pos, matchup_idx]);
+                    pos, matchup_idx, gameover]);
         }
     },
 });
index c2094ab85b05052a5c7e306a950b38775a5d1e51..b3ddf582ac7062b2d709d670877cf11fa8ac3bc6 100644 (file)
@@ -9,6 +9,7 @@ Rune.initLogic({
         ready: new Array(2).fill(false),
         pos: 0,
         matchup_idx: 0,
+        gameover: false,
     }),
     actions: {
         set_choices: ({first, second, third}, { game, playerId }) => {
@@ -107,9 +108,11 @@ Rune.initLogic({
                 if (game.pos <= -3) {
                     // second won
                     Rune.gameOver();
+                    game.gameover = true;
                 } else if (game.pos >= 3) {
                     // first won
                     Rune.gameOver();
+                    game.gameover = true;
                 } else {
                     // game is still going
                     for (let i = 0; i < 3; ++i) {