From e8592a80976919681d92a0d6ff89bae6d5fb992f Mon Sep 17 00:00:00 2001
From: David Vazgenovich Shakaryan <dvshakaryan@gmail.com>
Date: Fri, 22 Apr 2022 15:17:01 -0700
Subject: handle web remaining state from c code

---
 web/dartboat_wasm.c    | 49 +++++++++++++++++++++++++++++++++++++++++++------
 web/static/dartboat.js | 29 ++++++++---------------------
 2 files changed, 51 insertions(+), 27 deletions(-)

(limited to 'web')

diff --git a/web/dartboat_wasm.c b/web/dartboat_wasm.c
index e00c330..e8cde21 100644
--- a/web/dartboat_wasm.c
+++ b/web/dartboat_wasm.c
@@ -125,6 +125,38 @@ EMSCRIPTEN_KEEPALIVE void draw_match() {
 	}
 }
 
+char *str_for_rem_state(int rem) {
+	char *buf = malloc(10);
+
+	if (rem < 0 || rem == 1)
+		strcpy(buf, "BUST");
+	else
+		sprintf(buf, "%d", rem);
+
+	return buf;
+}
+
+EMSCRIPTEN_KEEPALIVE void update_user_rem(int rem) {
+	char *str = str_for_rem_state(rem);
+	EM_ASM({updateUserStateRem($0)}, str);
+	free(str);
+
+	get_suggested(rem, 1);
+}
+
+EMSCRIPTEN_KEEPALIVE void update_user_rem_from_pts(int pts) {
+	update_user_rem(state->l1->rem - pts);
+}
+
+EMSCRIPTEN_KEEPALIVE void update_boat_rem(int rem) {
+	char *str = str_for_rem_state(rem);
+	EM_ASM({updateBoatStateRem($0)}, str);
+	free(str);
+
+	get_suggested(rem, 2);
+}
+
+
 EMSCRIPTEN_KEEPALIVE void boat_visit() {
 	if (state->l1->rem <= 0 || state->l2->rem <= 0)
 		return;
@@ -143,7 +175,7 @@ EMSCRIPTEN_KEEPALIVE void boat_visit() {
 		avg = ((double)l->start / (((l->n_visits - 1) * 3) + v->n_darts)) * 3;
 
 	if (!delay_ms) {
-		EM_ASM({updateBoatStateRem($0)}, l->rem);
+		update_boat_rem(l->rem);
 		EM_ASM({updateBoatAvg($0)}, avg);
 		EM_ASM({clearMatchLog()});
 		draw_match();
@@ -196,7 +228,7 @@ EMSCRIPTEN_KEEPALIVE bool user_visit(int points) {
 	v->points = points;
 	l->rem -= points;
 	v->rem = l->rem;
-	EM_ASM({updateUserRem($0)}, l->rem);
+	update_user_rem(l->rem);
 
 	if (v->rem > 0)
 		EM_ASM({updateUserAvg($0)}, (double)(l->start-l->rem)/l->n_visits);
@@ -212,19 +244,24 @@ EMSCRIPTEN_KEEPALIVE bool user_visit(int points) {
 	return true;
 }
 
+// FIXME neg
+EMSCRIPTEN_KEEPALIVE bool user_visit_to_rem(int rem) {
+	user_visit(state->l1->rem - rem);
+}
+
 EMSCRIPTEN_KEEPALIVE void draw_boat_throwing(int pts, char *str) {
 	char buf[10];
 	sprintf(buf, "%d", pts);
 
 	int rem = state->l2->n_visits > 1 ? state->l2->visits[state->l2->n_visits-2].rem : state->l2->start;
 
-	EM_ASM({updateBoatStateRem($0)}, rem - pts);
+	update_boat_rem(rem - pts);
 	EM_ASM({setPromptText($0)}, buf);
 	EM_ASM({promptSugg($0)}, str);
 }
 
 EMSCRIPTEN_KEEPALIVE void end_boat_throwing(int rem, int avg) {
-	EM_ASM({updateBoatStateRem($0)}, rem);
+	update_boat_rem(rem);
 	EM_ASM({updateBoatAvg($0)}, avg);
 	EM_ASM({setPromptText($0)}, "");
 	EM_ASM(clearMatchLog());
@@ -280,8 +317,8 @@ EMSCRIPTEN_KEEPALIVE void start_match() {
 
 	EM_ASM({updateUserName($0)}, state->l1->name);
 	EM_ASM({updateBoatName($0)}, state->l2->name);
-	EM_ASM({updateUserRem($0)}, state->l1->rem);
-	EM_ASM({updateBoatStateRem($0)}, state->l2->rem);
+	update_user_rem(state->l1->rem);
+	update_boat_rem(state->l2->rem);
 
 	EM_ASM(clearMatchLog());
 	set_user_active();
diff --git a/web/static/dartboat.js b/web/static/dartboat.js
index 292c50d..2a26a0c 100644
--- a/web/static/dartboat.js
+++ b/web/static/dartboat.js
@@ -45,9 +45,9 @@ let prompt_handlers = {
 		},
 
 		submit_rem() {
-			let pts = _promptGetAndClear();
-			if (pts)
-				Module.ccall('user_visit', 'number', ['number'], [user_rem - pts]);
+			let rem = _promptGetAndClear();
+			if (rem)
+				Module.ccall('user_visit_to_rem', 'number', ['number'], [rem]);
 		}
 	},
 	num_darts: {
@@ -127,22 +127,12 @@ function clearOi() {
 	}
 }
 
-let user_rem;
-function updateUserRem(rem) {
-	user_rem = rem;
-	updateUserStateRem(rem);
+function updateUserStateRem(ptr) {
+	document.getElementById('p1-rem').textContent = UTF8ToString(ptr);
 }
 
-function updateUserStateRem(rem) {
-	let elem = document.getElementById('p1-rem');
-	elem.textContent = rem < 0 || rem == 1 ? 'BUST' : rem;
-	Module.ccall('get_suggested', null, ['number', 'number'], [rem, 1]);
-}
-
-function updateBoatStateRem(rem) {
-	let elem = document.getElementById('p2-rem');
-	elem.textContent = rem < 0 || rem == 1 ? 'BUST' : rem;
-	Module.ccall('get_suggested', null, ['number', 'number'], [rem, 2]);
+function updateBoatStateRem(ptr) {
+	document.getElementById('p2-rem').textContent = UTF8ToString(ptr);
 }
 
 function updateUserName(p) {
@@ -182,10 +172,7 @@ function promptSugg(p) {
 }
 
 function promptUpdateRem() {
-	let elem = document.getElementById('p1-rem');
-	let pts = _promptGet();
-
-	updateUserStateRem(pts ? user_rem - pts : user_rem);
+	Module.ccall('update_user_rem_from_pts', null, ['number'], [_promptGet()]);
 }
 
 function setUserActive() {
-- 
cgit v1.2.3-70-g09d2