From 855ac7909547ffbfde58d01508bf9f2a83cf54f0 Mon Sep 17 00:00:00 2001
From: Dominic Masters <dominic@domsplace.com>
Date: Fri, 3 Mar 2023 23:15:26 -0800
Subject: [PATCH] Fixed hard crash
---
.../components/TicTacToeGame.cpp | 238 +++++++++---------
1 file changed, 119 insertions(+), 119 deletions(-)
diff --git a/src/dawntictactoe/components/TicTacToeGame.cpp b/src/dawntictactoe/components/TicTacToeGame.cpp
index 1f4e8281..012baf79 100644
--- a/src/dawntictactoe/components/TicTacToeGame.cpp
+++ b/src/dawntictactoe/components/TicTacToeGame.cpp
@@ -1,119 +1,119 @@
-// Copyright (c) 2023 Dominic Masters
-//
-// This software is released under the MIT License.
-// https://opensource.org/licenses/MIT
-
-#include "TicTacToeGame.hpp"
-#include "game/DawnGame.hpp"
-#include "scene/components/example/ExampleSpin.hpp"
-#include "scene/components/physics/3d/CubeCollider.hpp"
-
-using namespace Dawn;
-
-TicTacToeGame::TicTacToeGame(SceneItem *item) :
- SceneItemComponent(item),
- winner(TIC_TAC_TOE_EMPTY),
- nextMove(TIC_TAC_TOE_NOUGHT),
- gameOver(false)
-{
-}
-
-void TicTacToeGame::onStart() {
- // Map tiles by tile number = tile
- auto ts = getScene()->findComponents<TicTacToeTile>();
- auto itTiles = ts.begin();
- while(itTiles != ts.end()) {
- this->tiles[(*itTiles)->tile] = *itTiles;
- ++itTiles;
- }
-
- useEffect([&]{
- if(!gameOver) return;
-
- auto board = this->getBoard();
- std::vector<uint8_t> winningCombo;
- winner = ticTacToeDetermineWinner(board, &winningCombo);
- std::cout << "Winner is " << winner << std::endl;
- }, gameOver);
-
- useEvent([&](float_t delta) {
- // Only allow player input if it's their turn.
- if(winner != TIC_TAC_TOE_EMPTY) return;
-
- Camera *camera = getScene()->findComponent<Camera>();
- if(camera == nullptr) return;
-
- TicTacToeTile *hovered = nullptr;
- bool_t isPlayerMove = nextMove == TIC_TAC_TOE_NOUGHT;
-
- // Get hovered tile (for player move only)
- if(isPlayerMove) {
- // Get mouse in screen space.
- auto mouse = getGame()->inputManager.getAxis2D(INPUT_BIND_MOUSE_X, INPUT_BIND_MOUSE_Y);
- mouse *= 2.0f;
- mouse -= glm::vec2(1, 1);
-
- struct Ray3D ray;
- ray.origin = camera->transform->getWorldPosition();
- ray.direction = camera->getRayDirectionFromScreenSpace(mouse);
-
- // Find the hovered tile (if any)
- auto results = getPhysics()->raycast3DAll(ray);
- auto itResult = results.begin();
- while(itResult != results.end()) {
- auto result = *itResult;
- auto tile = result.collider->item->getComponent<TicTacToeTile>();
- if(tile == nullptr) {
- ++itResult;
- continue;
- }
-
- hovered = tile;
- break;
- }
- }
-
- // Now update the hover state(s)
- auto itTiles = tiles.begin();
- while(itTiles != tiles.end()) {
- auto t = itTiles->second;
- if(t == hovered) {
- t->hovered = true;
- } else {
- t->hovered = false;
- }
- ++itTiles;
- }
-
- if(isPlayerMove) {
- if(getGame()->inputManager.isPressed(INPUT_BIND_MOUSE_CLICK)) {
- this->makeMove(hovered->tile, nextMove);
- }
- } else if(nextMove != TIC_TAC_TOE_NOUGHT) {
- auto board = this->getBoard();
- auto move = ticTacToeGetAiMove(board, nextMove);
- this->makeMove(move, nextMove);
- }
-
- // Did game just end?
- if(ticTacToeIsGameOver(this->getBoard())) gameOver = true;
- }, getScene()->eventSceneUpdate);
-}
-
-std::map<uint8_t, enum TicTacToeTileState> TicTacToeGame::getBoard() {
- std::map<uint8_t, enum TicTacToeTileState> tileMap;
-
- auto itTiles = tiles.begin();
- while(itTiles != tiles.end()) {
- auto t = itTiles->second;
- tileMap[t->tile] = t->tileState;
- ++itTiles;
- }
-
- return tileMap;
-}
-
-void TicTacToeGame::makeMove(uint8_t tile, enum TicTacToeTileState player) {
- this->tiles[tile]->tileState = player;
- nextMove = player == TIC_TAC_TOE_NOUGHT ? TIC_TAC_TOE_CROSS : TIC_TAC_TOE_NOUGHT;
-}
+// Copyright (c) 2023 Dominic Masters
+//
+// This software is released under the MIT License.
+// https://opensource.org/licenses/MIT
+
+#include "TicTacToeGame.hpp"
+#include "game/DawnGame.hpp"
+#include "scene/components/example/ExampleSpin.hpp"
+#include "scene/components/physics/3d/CubeCollider.hpp"
+
+using namespace Dawn;
+
+TicTacToeGame::TicTacToeGame(SceneItem *item) :
+ SceneItemComponent(item),
+ winner(TIC_TAC_TOE_EMPTY),
+ nextMove(TIC_TAC_TOE_NOUGHT),
+ gameOver(false)
+{
+}
+
+void TicTacToeGame::onStart() {
+ // Map tiles by tile number = tile
+ auto ts = getScene()->findComponents<TicTacToeTile>();
+ auto itTiles = ts.begin();
+ while(itTiles != ts.end()) {
+ this->tiles[(*itTiles)->tile] = *itTiles;
+ ++itTiles;
+ }
+
+ useEffect([&]{
+ if(!gameOver) return;
+
+ auto board = this->getBoard();
+ std::vector<uint8_t> winningCombo;
+ winner = ticTacToeDetermineWinner(board, &winningCombo);
+ std::cout << "Winner is " << winner << std::endl;
+ }, gameOver);
+
+ useEvent([&](float_t delta) {
+ // Only allow player input if it's their turn.
+ if(gameOver) return;
+
+ Camera *camera = getScene()->findComponent<Camera>();
+ if(camera == nullptr) return;
+
+ TicTacToeTile *hovered = nullptr;
+ bool_t isPlayerMove = nextMove == TIC_TAC_TOE_NOUGHT;
+
+ // Get hovered tile (for player move only)
+ if(isPlayerMove) {
+ // Get mouse in screen space.
+ auto mouse = getGame()->inputManager.getAxis2D(INPUT_BIND_MOUSE_X, INPUT_BIND_MOUSE_Y);
+ mouse *= 2.0f;
+ mouse -= glm::vec2(1, 1);
+
+ struct Ray3D ray;
+ ray.origin = camera->transform->getWorldPosition();
+ ray.direction = camera->getRayDirectionFromScreenSpace(mouse);
+
+ // Find the hovered tile (if any)
+ auto results = getPhysics()->raycast3DAll(ray);
+ auto itResult = results.begin();
+ while(itResult != results.end()) {
+ auto result = *itResult;
+ auto tile = result.collider->item->getComponent<TicTacToeTile>();
+ if(tile == nullptr) {
+ ++itResult;
+ continue;
+ }
+
+ hovered = tile;
+ break;
+ }
+ }
+
+ // Now update the hover state(s)
+ auto itTiles = tiles.begin();
+ while(itTiles != tiles.end()) {
+ auto t = itTiles->second;
+ if(t == hovered) {
+ t->hovered = true;
+ } else {
+ t->hovered = false;
+ }
+ ++itTiles;
+ }
+
+ if(isPlayerMove) {
+ if(getGame()->inputManager.isPressed(INPUT_BIND_MOUSE_CLICK)) {
+ this->makeMove(hovered->tile, nextMove);
+ }
+ } else if(nextMove != TIC_TAC_TOE_NOUGHT) {
+ auto board = this->getBoard();
+ auto move = ticTacToeGetAiMove(board, nextMove);
+ this->makeMove(move, nextMove);
+ }
+
+ // Did game just end?
+ gameOver = ticTacToeIsGameOver(this->getBoard());
+ }, getScene()->eventSceneUpdate);
+}
+
+std::map<uint8_t, enum TicTacToeTileState> TicTacToeGame::getBoard() {
+ std::map<uint8_t, enum TicTacToeTileState> tileMap;
+
+ auto itTiles = tiles.begin();
+ while(itTiles != tiles.end()) {
+ auto t = itTiles->second;
+ tileMap[t->tile] = t->tileState;
+ ++itTiles;
+ }
+
+ return tileMap;
+}
+
+void TicTacToeGame::makeMove(uint8_t tile, enum TicTacToeTileState player) {
+ this->tiles[tile]->tileState = player;
+ nextMove = player == TIC_TAC_TOE_NOUGHT ? TIC_TAC_TOE_CROSS : TIC_TAC_TOE_NOUGHT;
+}