diff --git a/configure.py b/configure.py index 98c41667a..aee2cec33 100755 --- a/configure.py +++ b/configure.py @@ -386,7 +386,7 @@ config.libs = [ Object(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "m_Do/m_Do_machine.cpp"), Object(Matching, "m_Do/m_Do_mtx.cpp"), Object(NonMatching, "m_Do/m_Do_ext.cpp"), - Object(NonMatching, "m_Do/m_Do_lib.cpp"), + Object(Matching, "m_Do/m_Do_lib.cpp"), Object(Matching, "m_Do/m_Do_hostIO.cpp"), Object(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "m_Do/m_Do_Reset.cpp"), Object(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "m_Do/m_Do_dvd_thread.cpp"), diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index a4a53d5b6..62dff93ef 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -4029,14 +4029,6 @@ inline dCcS* dComIfG_Ccsp() { return &g_dComIfG_gameInfo.play.mCcS; } -// This should be dComIfG_Ccsp()->SetMass everywhere, but for some reason that combination of two -// inlines consistently breaks the match on retail. But for the demo, using the proper inlines is required to match. -#if VERSION == VERSION_DEMO -#define dComIfG_Ccsp_SetMass dComIfG_Ccsp()->SetMass -#else -#define dComIfG_Ccsp_SetMass dComIfG_Ccsp()->mMass_Mng.Set -#endif - inline void dComIfG_setTimerMode(int ms) { g_dComIfG_gameInfo.play.setTimerMode(ms); } inline int dComIfG_getTimerMode() { return g_dComIfG_gameInfo.play.getTimerMode(); } diff --git a/include/dolphin/gx/GXEnum.h b/include/dolphin/gx/GXEnum.h index 7430e3974..7952768bc 100644 --- a/include/dolphin/gx/GXEnum.h +++ b/include/dolphin/gx/GXEnum.h @@ -20,15 +20,14 @@ typedef enum _GXCullMode { /* 0x3 */ GX_CULL_ALL, } GXCullMode; -typedef enum _GXBoolVal { - /* 0x0 */ GX_FALSE, - /* 0x1 */ GX_TRUE, - /* 0x0 */ GX_DISABLE = 0, - /* 0x1 */ GX_ENABLE, -} GXBoolVal; - typedef u8 GXBool; +#define GX_FALSE ((GXBool)0) +#define GX_TRUE ((GXBool)1) + +#define GX_ENABLE ((GXBool)1) +#define GX_DISABLE ((GXBool)0) + typedef enum _GXTexMapID { /* 0x000 */ GX_TEXMAP0, /* 0x001 */ GX_TEXMAP1, diff --git a/include/m_Do/m_Do_lib.h b/include/m_Do/m_Do_lib.h index 121b1ebd4..8036f4174 100644 --- a/include/m_Do/m_Do_lib.h +++ b/include/m_Do/m_Do_lib.h @@ -42,7 +42,7 @@ struct mDoLib_clipper { }; void mDoLib_project(Vec* src, Vec* dst); -u8 mDoLib_setResTimgObj(ResTIMG* res, GXTexObj* o_texObj, u32 tlut_name, GXTlutObj* o_tlutObj); +u32 mDoLib_setResTimgObj(ResTIMG* res, GXTexObj* o_texObj, u32 tlut_name, GXTlutObj* o_tlutObj); void mDoLib_pos2camera(Vec* src, Vec* dst); u32 mDoLib_cnvind32(u32 r3); u16 mDoLib_cnvind16(u16 r3); diff --git a/src/d/actor/d_a_arrow.cpp b/src/d/actor/d_a_arrow.cpp index 6d1568014..51a75bd78 100644 --- a/src/d/actor/d_a_arrow.cpp +++ b/src/d/actor/d_a_arrow.cpp @@ -298,7 +298,7 @@ void daArrow_c::arrowShooting() { mAtCps.CalcAtVec(); dComIfG_Ccsp()->Set(&mAtCps); - dComIfG_Ccsp_SetMass(&mAtCps, 1); + dComIfG_Ccsp()->SetMass(&mAtCps, 1); clrAtHitNormal(); setAtHitPosBuff(&end); @@ -872,7 +872,7 @@ BOOL daArrow_c::procMove() { mAtCps.CalcAtVec(); dComIfG_Ccsp()->Set(&mAtCps); - dComIfG_Ccsp_SetMass(&mAtCps, 1); + dComIfG_Ccsp()->SetMass(&mAtCps, 1); } return TRUE; diff --git a/src/d/actor/d_a_bk.cpp b/src/d/actor/d_a_bk.cpp index ecdfaf8bf..0bb7ba106 100644 --- a/src/d/actor/d_a_bk.cpp +++ b/src/d/actor/d_a_bk.cpp @@ -2131,7 +2131,7 @@ static fopAc_ac_c* yari_hit_check(bk_class* i_this) { i_this->m1040.MoveCAt(i_this->m11A8); dComIfG_Ccsp()->Set(&i_this->m1040); if (i_this->m02D5 != 0) { - dComIfG_Ccsp_SetMass(&i_this->m1040, 3); + dComIfG_Ccsp()->SetMass(&i_this->m1040, 3); } if (i_this->m1040.ChkAtHit()) { i_this->m0B78 = 5; @@ -3329,7 +3329,7 @@ static void Bk_move(bk_class* i_this) { i_this->m1040.OffAtVsPlayerBit(); i_this->m1040.SetAtSpl(dCcG_At_Spl_UNK1); dComIfG_Ccsp()->Set(&i_this->m1040); - dComIfG_Ccsp_SetMass(&i_this->m1040, 3); + dComIfG_Ccsp()->SetMass(&i_this->m1040, 3); if (i_this->m1040.ChkAtHit() && actor->speed.y < -50.0f) { actor->speed.y = 0.0f; @@ -4415,7 +4415,7 @@ static BOOL daBk_Execute(bk_class* i_this) { MtxPosition(&sp58, &sp4C); i_this->m0B88.SetC(sp4C); dComIfG_Ccsp()->Set(&i_this->m0B88); - dComIfG_Ccsp_SetMass(&i_this->m0B88, 3); + dComIfG_Ccsp()->SetMass(&i_this->m0B88, 3); cXyz sp40 = i_this->m116C; cXyz sp34 = i_this->current.pos; diff --git a/src/d/actor/d_a_boko.cpp b/src/d/actor/d_a_boko.cpp index a62cb668f..146473cc2 100644 --- a/src/d/actor/d_a_boko.cpp +++ b/src/d/actor/d_a_boko.cpp @@ -784,9 +784,9 @@ BOOL daBoko_c::execute() { mSph.SetC(m2D0); dComIfG_Ccsp()->Set(&mSph); if (getNowMode() == Mode_PLAYER_CARRY_e) { - dComIfG_Ccsp_SetMass(&mSph, 1); + dComIfG_Ccsp()->SetMass(&mSph, 1); } else { - dComIfG_Ccsp_SetMass(&mSph, 4); + dComIfG_Ccsp()->SetMass(&mSph, 4); } } diff --git a/src/d/actor/d_a_bomb2.cpp b/src/d/actor/d_a_bomb2.cpp index 9917fbd33..c5003dfc2 100644 --- a/src/d/actor/d_a_bomb2.cpp +++ b/src/d/actor/d_a_bomb2.cpp @@ -476,7 +476,7 @@ namespace daBomb2 { mSph.SetR(radius); mSph.SetC(pos); dComIfG_Ccsp()->Set(&mSph); - dComIfG_Ccsp_SetMass(&mSph, 3); + dComIfG_Ccsp()->SetMass(&mSph, 3); } } diff --git a/src/d/actor/d_a_bomb3.inc b/src/d/actor/d_a_bomb3.inc index 555ed3e3b..7aaacb71b 100644 --- a/src/d/actor/d_a_bomb3.inc +++ b/src/d/actor/d_a_bomb3.inc @@ -707,7 +707,7 @@ void daBomb_c::makeWaterEffect() { mSph.SetC(current.pos); if(mMassCounter != g_Counter.mCounter0) { dComIfG_Ccsp()->Set(&mSph); - dComIfG_Ccsp_SetMass(&mSph, 3); + dComIfG_Ccsp()->SetMass(&mSph, 3); mMassCounter = g_Counter.mCounter0; field_0x782 = 1; } @@ -867,7 +867,7 @@ BOOL daBomb_c::procExplode_init() { mSph.SetC(current.pos); if(mMassCounter != g_Counter.mCounter0) { dComIfG_Ccsp()->Set(&mSph); - dComIfG_Ccsp_SetMass(&mSph, 3); + dComIfG_Ccsp()->SetMass(&mSph, 3); field_0x782 = 1; mMassCounter = g_Counter.mCounter0; } @@ -933,7 +933,7 @@ bool daBomb_c::procExplode() { mSph.SetC(current.pos); if(mMassCounter != g_Counter.mCounter0) { dComIfG_Ccsp()->Set(&mSph); - dComIfG_Ccsp_SetMass(&mSph, 3); + dComIfG_Ccsp()->SetMass(&mSph, 3); mMassCounter = g_Counter.mCounter0; field_0x782 = 1; } @@ -1126,7 +1126,7 @@ BOOL daBomb_c::execute() { mSph.SetR(scale.x * 30.0f); if(mMassCounter != g_Counter.mCounter0) { dComIfG_Ccsp()->Set(&mSph); - dComIfG_Ccsp_SetMass(&mSph, 3); + dComIfG_Ccsp()->SetMass(&mSph, 3); mMassCounter = g_Counter.mCounter0; } } diff --git a/src/d/actor/d_a_hookshot.cpp b/src/d/actor/d_a_hookshot.cpp index 9015644e0..e9933e99b 100644 --- a/src/d/actor/d_a_hookshot.cpp +++ b/src/d/actor/d_a_hookshot.cpp @@ -195,7 +195,7 @@ BOOL daHookshot_c::procWait() { mSightCps.SetR(5.0f); mSightCps.CalcAtVec(); dComIfG_Ccsp()->Set(&mSightCps); - dComIfG_Ccsp_SetMass(&mSightCps, 1); + dComIfG_Ccsp()->SetMass(&mSightCps, 1); m2A3 = false; mCurrProcFunc = &daHookshot_c::procShot; @@ -311,7 +311,7 @@ BOOL daHookshot_c::procShot() { mSightCps.SetR(5.0f); mSightCps.CalcAtVec(); dComIfG_Ccsp()->Set(&mSightCps); - dComIfG_Ccsp_SetMass(&mSightCps, 1); + dComIfG_Ccsp()->SetMass(&mSightCps, 1); current.pos = sp8C; } diff --git a/src/d/actor/d_a_player_main.cpp b/src/d/actor/d_a_player_main.cpp index f58170a6f..2bc5ac8d5 100644 --- a/src/d/actor/d_a_player_main.cpp +++ b/src/d/actor/d_a_player_main.cpp @@ -9844,7 +9844,7 @@ void daPy_lk_c::setCollision() { mCyl.OnTgSetBit(); } dComIfG_Ccsp()->Set(&mCyl); - dComIfG_Ccsp_SetMass(&mCyl, 1); + dComIfG_Ccsp()->SetMass(&mCyl, 1); mWindCyl.SetC(spD0); mWindCyl.SetH(mCyl.GetH()); mWindCyl.SetR(mCyl.GetR()); @@ -10098,12 +10098,12 @@ void daPy_lk_c::setCollision() { } } dComIfG_Ccsp()->Set(&mAtCyl); - dComIfG_Ccsp_SetMass(&mAtCyl, 1); + dComIfG_Ccsp()->SetMass(&mAtCyl, 1); int i; dCcD_Cps* pdVar21 = &mAtCps[0]; for (i = 0; i < 3; i++, pdVar21++) { dComIfG_Ccsp()->Set(pdVar21); - dComIfG_Ccsp_SetMass(pdVar21, 1); + dComIfG_Ccsp()->SetMass(pdVar21, 1); } } else { if (mSwBlur.field_0x014 < 10) { @@ -10224,7 +10224,7 @@ void daPy_lk_c::setCollision() { mFanWindCps.SetAtVec(spC4); mFanWindCps.SetR(in_f31); dComIfG_Ccsp()->Set(&mFanWindCps); - dComIfG_Ccsp_SetMass(&mFanWindCps, 1); + dComIfG_Ccsp()->SetMass(&mFanWindCps, 1); } else { mFanWindCps.ResetAtHit(); } @@ -10240,7 +10240,7 @@ void daPy_lk_c::setCollision() { mFanWindSph.SetC(current.pos); } dComIfG_Ccsp()->Set(&mFanWindSph); - dComIfG_Ccsp_SetMass(&mFanWindSph, 1); + dComIfG_Ccsp()->SetMass(&mFanWindSph, 1); m353A--; } else { mFanWindSph.ResetAtHit(); @@ -10259,7 +10259,7 @@ void daPy_lk_c::setCollision() { mFanLightCps.SetAtVec(local_118); mFanLightCps.OnAtSetBit(); dComIfG_Ccsp()->Set(&mFanLightCps); - dComIfG_Ccsp_SetMass(&mFanLightCps, 1); + dComIfG_Ccsp()->SetMass(&mFanLightCps, 1); } else { mFanLightCps.ResetAtHit(); mFanLightCps.OffAtSetBit(); diff --git a/src/d/actor/d_a_stone.cpp b/src/d/actor/d_a_stone.cpp index 9b53fca71..469ea9a9d 100644 --- a/src/d/actor/d_a_stone.cpp +++ b/src/d/actor/d_a_stone.cpp @@ -937,7 +937,7 @@ bool Act_c::_execute() { mCyl.MoveCAtTg(current.pos); dComIfG_Ccsp()->Set(&mCyl); if (m674 == 2 || m674 == 3 || m67B != 0) { - dComIfG_Ccsp_SetMass(&mCyl, 3); + dComIfG_Ccsp()->SetMass(&mCyl, 3); } attention_info.position.x = current.pos.x; attention_info.position.y = current.pos.y + data().m08; diff --git a/src/d/actor/d_a_stone2.cpp b/src/d/actor/d_a_stone2.cpp index 16b56efa7..be22b3efd 100644 --- a/src/d/actor/d_a_stone2.cpp +++ b/src/d/actor/d_a_stone2.cpp @@ -726,7 +726,7 @@ BOOL Act_c::Execute(Mtx** outMtx) { mCyl.MoveCAtTg(current.pos); dComIfG_Ccsp()->Set(&mCyl); if (m648 == 2) { - dComIfG_Ccsp_SetMass(&mCyl, 3); + dComIfG_Ccsp()->SetMass(&mCyl, 3); } } diff --git a/src/d/actor/d_a_tsubo.cpp b/src/d/actor/d_a_tsubo.cpp index 8ff651c18..71144c0ab 100644 --- a/src/d/actor/d_a_tsubo.cpp +++ b/src/d/actor/d_a_tsubo.cpp @@ -3554,7 +3554,7 @@ bool Act_c::_execute() { } if (m678 == 5 || m678 == 6 || m678 == 3 || m683 != 0) { - dComIfG_Ccsp_SetMass(&mCyl, 3); + dComIfG_Ccsp()->SetMass(&mCyl, 3); } attention_info.position.x = current.pos.x; diff --git a/src/d/d_camera.cpp b/src/d/d_camera.cpp index ca1e2a0eb..af3ee32cf 100644 --- a/src/d/d_camera.cpp +++ b/src/d/d_camera.cpp @@ -1905,8 +1905,7 @@ bool dCamera_c::lineBGCheckBoth(cXyz* i_start, cXyz* i_end, dBgS_LinChk* i_linCh u32 dCamera_c::lineCollisionCheckBush(cXyz* i_start, cXyz* i_end) { u32 ret = 0; - // Fakematch - u32 result = g_dComIfG_gameInfo.play.mCcS.GetMassResultCam(); + u32 result = dComIfG_Ccsp()->GetMassResultCam(); if (result & 2) { ret |= 1; } @@ -1919,8 +1918,7 @@ u32 dCamera_c::lineCollisionCheckBush(cXyz* i_start, cXyz* i_end) { cM3dGCps cps; cps.Set(*i_start, *i_end, 30.0f); - // Fakematch - g_dComIfG_gameInfo.play.mCcS.SetMassCam(cps); + dComIfG_Ccsp()->SetMassCam(cps); return ret; } diff --git a/src/d/d_s_play.cpp b/src/d/d_s_play.cpp index 97cb76d05..c21a4ee90 100644 --- a/src/d/d_s_play.cpp +++ b/src/d/d_s_play.cpp @@ -346,9 +346,7 @@ static BOOL dScnPly_Draw(dScnPly_ply_c* i_this) { if (dComIfGp_getGrass() != NULL || dComIfGp_getTree() != NULL || dComIfGp_getWood() != NULL || dComIfGp_getFlower() != NULL || dKyr_poison_live_check()) { - // using the inline breaks the match - // dComIfG_Ccsp()->PrepareMass(); - g_dComIfG_gameInfo.play.mCcS.PrepareMass(); + dComIfG_Ccsp()->PrepareMass(); } dComIfGp_executeGrass(); diff --git a/src/m_Do/m_Do_lib.cpp b/src/m_Do/m_Do_lib.cpp index dab103028..d1cb15e53 100644 --- a/src/m_Do/m_Do_lib.cpp +++ b/src/m_Do/m_Do_lib.cpp @@ -12,17 +12,15 @@ #include "dolphin/gx/GX.h" /* 80017530-800176BC .text mDoLib_setResTimgObj__FP7ResTIMGP9_GXTexObjUlP10_GXTlutObj */ -u8 mDoLib_setResTimgObj(ResTIMG* i_img, GXTexObj* r4, u32 i_tlut_name, GXTlutObj * o_tlutObj) { - /* Nonmatching - regalloc */ - GXTexObj* o_texObj = (GXTexObj*)r4; // fixes regalloc for r31, but the other 3 are incorrect in a different way +u32 mDoLib_setResTimgObj(ResTIMG* i_img, GXTexObj* o_texObj, u32 i_tlut_name, GXTlutObj * o_tlutObj) { if (i_img->indexTexture) { - JUT_ASSERT(0x2b, o_tlutObj != NULL); - GXInitTlutObj(o_tlutObj, ((char*)i_img) + i_img->paletteOffset, (GXTlutFmt)i_img->colorFormat, i_img->numColors); + JUT_ASSERT(43, o_tlutObj != NULL); + GXInitTlutObj(o_tlutObj, ((char*)i_img) + i_img->paletteOffset, (GXTlutFmt)i_img->colorFormat, (u16)i_img->numColors); GXInitTexObjCI(o_texObj, ((char*)i_img) + i_img->imageOffset, i_img->width, i_img->height, (GXCITexFmt)i_img->format, - (GXTexWrapMode)i_img->wrapS, (GXTexWrapMode)i_img->wrapT, (GXBool)(i_img->mipmapCount > 1), i_tlut_name); + (GXTexWrapMode)i_img->wrapS, (GXTexWrapMode)i_img->wrapT, i_img->mipmapCount > 1 ? GX_TRUE : GX_FALSE, i_tlut_name); } else { GXInitTexObj(o_texObj, ((char*)i_img) + i_img->imageOffset, i_img->width, i_img->height, (GXTexFmt)i_img->format, - (GXTexWrapMode)i_img->wrapS, (GXTexWrapMode)i_img->wrapT, (GXBool)(i_img->mipmapCount > 1)); + (GXTexWrapMode)i_img->wrapS, (GXTexWrapMode)i_img->wrapT, i_img->mipmapCount > 1 ? GX_TRUE : GX_FALSE); } GXInitTexObjLOD(o_texObj, (GXTexFilter)i_img->minFilter, (GXTexFilter)i_img->magFilter, diff --git a/tools/converters/binary_funcs.py b/tools/converters/binary_funcs.py new file mode 100644 index 000000000..fb5f9943e --- /dev/null +++ b/tools/converters/binary_funcs.py @@ -0,0 +1,61 @@ +import os +import struct +from typing import BinaryIO + +def skip_bytes(binary_file:BinaryIO, byte_count:int) -> None: + binary_file.seek(byte_count, os.SEEK_CUR) + +def read_s8(binary_file: BinaryIO)-> int: + chunk = binary_file.read(1) + if len(chunk) < 1: + raise EOFError() + return struct.unpack(">b", chunk)[0] + +def read_s16(binary_file: BinaryIO) -> int: + chunk = binary_file.read(2) + if len(chunk) < 2: + raise EOFError() + return struct.unpack(">h", chunk)[0] + +def read_s32(binary_file: BinaryIO) -> int: + chunk = binary_file.read(4) + if len(chunk) < 4: + raise EOFError() + return struct.unpack(">i", chunk)[0] + +def read_u8(binary_file: BinaryIO) -> int: + chunk = binary_file.read(1) + if len(chunk) < 1: + raise EOFError() + return struct.unpack(">B", chunk)[0] + +def read_u16(binary_file: BinaryIO) -> int: + chunk = binary_file.read(2) + if len(chunk) < 2: + raise EOFError() + return struct.unpack(">H", chunk)[0] + +def read_u32(binary_file: BinaryIO) -> int: + chunk = binary_file.read(4) + if len(chunk) < 4: + raise EOFError() + return struct.unpack(">I", chunk)[0] + +def read_f32(binary_file: BinaryIO) -> int: + chunk = binary_file.read(4) + if len(chunk) < 4: + raise EOFError() + return struct.unpack(">f", chunk)[0] + +def read_bytes_until_null(binary_file: BinaryIO) -> bytes: + begin = binary_file.tell() + while True: + b = binary_file.read(1) + if len(b) == 0: + raise EOFError() + if b[0] == 0: + break + + str_length = binary_file.tell() - begin - 1 + binary_file.seek(begin) + return binary_file.read(str_length) diff --git a/tools/converters/matDL_dis.py b/tools/converters/matDL_dis.py index 56ed3f3f4..2b9fb460c 100755 --- a/tools/converters/matDL_dis.py +++ b/tools/converters/matDL_dis.py @@ -4,6 +4,7 @@ from argparse import ArgumentParser import struct import os from enum import Enum +from binary_funcs import read_u16, read_u8 class GXBPRegs(Enum): @@ -311,27 +312,14 @@ class GXCPRegs(Enum): GX_CP_REG_ARRAYSTRIDE = 0xB0 -def read_u8(binary_file): - chunk = binary_file.read(1) - if len(chunk) < 1: - return None - return struct.unpack(">B", chunk)[0] - -def read_u16(binary_file): - chunk = binary_file.read(2) - if len(chunk) < 1: - return None - return struct.unpack(">H", chunk)[0] - - def convert_binary_to_matDL_c_source(src_path, dest_path, symbol_name, scope): # Load data macro_name = os.path.splitext(os.path.basename(src_path))[0] with open(src_path, "rb") as binary_file, open(dest_path, "w") as c_file: c_file.write("#ifndef LOAD_BP_REG\n") - c_file.write("#define U32_AS_U8(v) ((u8)((v) >> 24)), ((u8)((v) >> 16)), ((u8)((v) >> 8)), ((u8)((v) >> 0))\n") - c_file.write("#define U24_AS_U8(v) ((u8)((v) >> 16)), ((u8)((v) >> 8)), ((u8)((v) >> 0))\n") - c_file.write("#define U16_AS_U8(v) ((u8)((v) >> 8)), ((u8)((v) >> 0))\n") + c_file.write("#define U32_AS_U8(v) (((v) >> 24) & 0xFF), (((v) >> 16) & 0xFF), (((v) >> 8) & 0xFF), (((v) >> 0) & 0xFF)\n") + c_file.write("#define U24_AS_U8(v) (((v) >> 16) & 0xFF), (((v) >> 8) & 0xFF), (((v) >> 0) & 0xFF)\n") + c_file.write("#define U16_AS_U8(v) (((v) >> 8) & 0xFF), (((v) >> 0) & 0xFF)\n") c_file.write("#define IMAGE_ADDR(addr) (u32)(addr) >> 5\n") c_file.write("#define LOAD_BP_REG(reg, value) GX_CMD_LOAD_BP_REG, reg, U24_AS_U8(value)\n") c_file.write("#define LOAD_XF_REG(reg, num_args, ...) GX_CMD_LOAD_XF_REG, U16_AS_U8(num_args-1), U16_AS_U8(reg), __VA_ARGS__\n") @@ -351,8 +339,9 @@ def convert_binary_to_matDL_c_source(src_path, dest_path, symbol_name, scope): write_macro_line(f"{var_def_prefix}u8 {symbol_name}[] ALIGN_DECL(32) = {{") while True: - command_type = read_u8(binary_file) - if command_type is None: + try: + command_type = read_u8(binary_file) + except EOFError: break line_elements = []