From 938b18ad40553ad5fd7fd838042ad947be86c0ec Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Thu, 12 Jan 2023 12:17:41 +0900 Subject: [PATCH] Begin work on 3D renderer, minor gameover fix --- CMakeLists.txt | 2 ++ src/3d_renderer.cc | 24 ++++++++++++++++++++++++ src/3d_renderer.h | 27 +++++++++++++++++++++++++++ src/basic_renderer.cc | 27 +++++++++++++++++++++------ src/basic_renderer.h | 4 +++- src/game_renderer.h | 3 ++- src/main.cc | 5 +++-- wasm_build/Makefile | 6 ++++-- wasm_build/client.js | 10 +++++----- wasm_build/logic.js | 3 +++ 10 files changed, 94 insertions(+), 17 deletions(-) create mode 100644 src/3d_renderer.cc create mode 100644 src/3d_renderer.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 6504af5..16f8644 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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 index 0000000..f09fcbb --- /dev/null +++ b/src/3d_renderer.cc @@ -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 index 0000000..a6adcd2 --- /dev/null +++ b/src/3d_renderer.h @@ -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 diff --git a/src/basic_renderer.cc b/src/basic_renderer.cc index ed805f5..5d02b7a 100644 --- a/src/basic_renderer.cc +++ b/src/basic_renderer.cc @@ -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 } } diff --git a/src/basic_renderer.h b/src/basic_renderer.h index 711674d..0765910 100644 --- a/src/basic_renderer.h +++ b/src/basic_renderer.h @@ -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; diff --git a/src/game_renderer.h b/src/game_renderer.h index 0d8f027..1cee95e 100644 --- a/src/game_renderer.h +++ b/src/game_renderer.h @@ -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; diff --git a/src/main.cc b/src/main.cc index 23e3c64..b8b229c 100644 --- a/src/main.cc +++ b/src/main.cc @@ -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; } diff --git a/wasm_build/Makefile b/wasm_build/Makefile index 47c052f..671262f 100644 --- a/wasm_build/Makefile +++ b/wasm_build/Makefile @@ -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++ diff --git a/wasm_build/client.js b/wasm_build/client.js index b284d61..726fa60 100644 --- a/wasm_build/client.js +++ b/wasm_build/client.js @@ -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]); } }, }); diff --git a/wasm_build/logic.js b/wasm_build/logic.js index c2094ab..b3ddf58 100644 --- a/wasm_build/logic.js +++ b/wasm_build/logic.js @@ -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) { -- 2.49.0