summaryrefslogtreecommitdiff
path: root/src/d/d_seafightgame.cpp
diff options
context:
space:
mode:
authorTakaRikka <38417346+TakaRikka@users.noreply.github.com>2023-09-16 13:46:37 -0700
committerGitHub <noreply@github.com>2023-09-16 13:46:37 -0700
commit00fe8a08736de5d226952dbc60e440f346a4cb4f (patch)
tree088735ee38e338b6fdbdf11a527d401c2654b69b /src/d/d_seafightgame.cpp
parentf00e07e4c485003848d7a771029097d69f5f3891 (diff)
d_seafightgame, m_Do_machine_exception, m_Do_reset, m_Do_DVDError OK (#41)
* m_Do_machine_exception OK * m_Do_Reset OK * m_Do_DVDError OK * some fixes for JP * JP OK again * d_seafightgame OK * cleanup m_Do_Reset a bit
Diffstat (limited to 'src/d/d_seafightgame.cpp')
-rw-r--r--src/d/d_seafightgame.cpp122
1 files changed, 111 insertions, 11 deletions
diff --git a/src/d/d_seafightgame.cpp b/src/d/d_seafightgame.cpp
index 6ce5faf5..a3127abf 100644
--- a/src/d/d_seafightgame.cpp
+++ b/src/d/d_seafightgame.cpp
@@ -3,26 +3,126 @@
// Translation Unit: d_seafightgame.cpp
//
-#include "d_seafightgame.h"
-#include "dolphin/types.h"
+#include "d/d_seafightgame.h"
+#include "SSystem/SComponent/c_math.h"
/* 800C1F90-800C20B0 .text init__20dSeaFightGame_info_cFii */
-void dSeaFightGame_info_c::init(int, int) {
- /* Nonmatching */
+int dSeaFightGame_info_c::init(int i_bulletNum, int i_scenario) {
+ for (int i = 0; i < 8; i++) {
+ for (int j = 0; j < 8; j++) {
+ mGrid[i][j] = 0;
+ }
+ }
+
+ mBulletNum = i_bulletNum;
+ mScore = 0;
+
+ switch (i_scenario) {
+ case 1:
+ mAliveShipNum = 1;
+ put_ship(0, 2);
+ break;
+ case 2:
+ mAliveShipNum = 2;
+ put_ship(0, 2);
+ put_ship(1, 3);
+ break;
+ case 3:
+ mAliveShipNum = 3;
+ put_ship(0, 2);
+ put_ship(1, 3);
+ put_ship(2, 4);
+ break;
+ }
+
+ mDeadShipNum = 0;
+ return 1;
}
/* 800C20B0-800C225C .text put_ship__20dSeaFightGame_info_cFUcUc */
-void dSeaFightGame_info_c::put_ship(unsigned char, unsigned char) {
- /* Nonmatching */
+int dSeaFightGame_info_c::put_ship(u8 i_shipNo, u8 i_shipSize) {
+ u8 y;
+ u8 x;
+ u8 direction;
+
+ do {
+ direction = (s16)cM_rndF(1000.0f) % 2;
+ y = (int)cM_rndF(8.0f);
+ x = (int)cM_rndF(8.0f);
+ } while (!checkPutShip(y, x, i_shipSize, direction));
+
+ if (direction == 0) {
+ for (int i = 0; i < i_shipSize; i++) {
+ mShips[i_shipNo].m_pos[i][0] = y;
+ mShips[i_shipNo].m_pos[i][1] = x + i;
+ mGrid[y][x + i] = i_shipNo + 102;
+ }
+
+ mShips[i_shipNo].field_0xb = y;
+ mShips[i_shipNo].field_0xc = x;
+ mShips[i_shipNo].field_0xd = 0;
+ mShips[i_shipNo].field_0xe = i_shipSize;
+ } else {
+ for (int i = 0; i < i_shipSize; i++) {
+ mShips[i_shipNo].m_pos[i][0] = y + i;
+ mShips[i_shipNo].m_pos[i][1] = x;
+ mGrid[y + i][x] = i_shipNo + 102;
+ }
+
+ mShips[i_shipNo].field_0xb = y;
+ mShips[i_shipNo].field_0xc = x;
+ mShips[i_shipNo].field_0xd = i_shipSize;
+ mShips[i_shipNo].field_0xe = 0;
+ }
+
+ mShips[i_shipNo].field_0x8 = i_shipSize;
+ mShips[i_shipNo].field_0x9 = i_shipSize;
+ return 1;
}
/* 800C225C-800C22FC .text checkPutShip__20dSeaFightGame_info_cFiiii */
-void dSeaFightGame_info_c::checkPutShip(int, int, int, int) {
- /* Nonmatching */
+bool dSeaFightGame_info_c::checkPutShip(int i_y, int i_x, int i_shipSize, int i_direction) {
+ if (i_direction == 0) {
+ for (int i = 0; i < i_shipSize; i++) {
+ if (i_y > 7 || i_x > 7 || mGrid[i_y][i_x] > 100) {
+ return false;
+ }
+ i_x++;
+ }
+ } else {
+ for (int i = 0; i < i_shipSize; i++) {
+ if (i_y > 7 || i_x > 7 || mGrid[i_y][i_x] > 100) {
+ return false;
+ }
+ i_y++;
+ }
+ }
+
+ return true;
}
/* 800C22FC-800C239C .text attack__20dSeaFightGame_info_cFUcUc */
-void dSeaFightGame_info_c::attack(unsigned char, unsigned char) {
- /* Nonmatching */
-}
+int dSeaFightGame_info_c::attack(u8 i_y, u8 i_x) {
+ int rt = -1;
+
+ u8 uvar1 = mGrid[i_y][i_x];
+ if (uvar1 == 0) {
+ mGrid[i_y][i_x] = 1;
+ } else if (uvar1 > 100) {
+ rt = uvar1 - 102;
+ mShips[rt].field_0x9--;
+ if (mShips[rt].field_0x9 == 0) {
+ mAliveShipNum--;
+ mDeadShipNum++;
+ }
+
+ mGrid[i_y][i_x] = 3;
+ } else {
+ return -2;
+ }
+
+ mBulletNum--;
+ mScore++;
+ return rt;
+}