"${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
"${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})
--- /dev/null
+#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() {}
--- /dev/null
+#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
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"
prevPos = cachedPos;
cachedPos = pos;
}
+
+ if (gameover) {
+ flags.set(14);
+ }
}
void BasicRenderer::do_update() {
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);
}
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)) {
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 {
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
}
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
}
}
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;
* 11 - second ready
* 12 - ready state dirty
* 13 - screen size changed
+ * 14 - is gameover
*/
std::bitset<32> flags;
float readyTimer;
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;
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;
}
../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++
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) {
'number', 'number', 'number',
'number', 'number', 'number',
'boolean', 'boolean',
- 'number', 'number'],
+ 'number', 'number', 'boolean'],
[player1, player2,
yourPlayerId === undefined ? 'undefined' : yourPlayerId,
first_choices[0].charCodeAt(0),
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',
'number', 'number', 'number',
'number', 'number', 'number',
'boolean', 'boolean',
- 'number', 'number'],
+ 'number', 'number', 'boolean'],
[player1, player2,
yourPlayerId === undefined ? 'undefined' : yourPlayerId,
'?'.charCodeAt(0),
'?'.charCodeAt(0),
'?'.charCodeAt(0),
ready[0], ready[1],
- pos, matchup_idx]);
+ pos, matchup_idx, gameover]);
}
},
});
ready: new Array(2).fill(false),
pos: 0,
matchup_idx: 0,
+ gameover: false,
}),
actions: {
set_choices: ({first, second, third}, { game, playerId }) => {
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) {