diff --git a/Makefile b/Makefile index c4570e4a2d..04ce6a9d1e 100644 --- a/Makefile +++ b/Makefile @@ -40,7 +40,7 @@ GCC ?= 0 # eu.v10 - builds the 1997 1.0 PAL version # eu.v11 - builds the 1997 1.1 PAL version VERSION ?= us -$(eval $(call validate-option,VERSION,us eu.v10 eu.v11)) +$(eval $(call validate-option,VERSION,us eu.v10 eu.v11 jp.v10 jp.v11)) ifeq ($(VERSION),us) DEFINES += VERSION_US=1 @@ -51,6 +51,12 @@ else ifeq ($(VERSION),eu.v10) else ifeq ($(VERSION),eu.v11) DEFINES += VERSION_EU=1 VERSION_EU_V11=1 GRUCODE ?= f3dex_old +else ifeq ($(VERSION),jp.v10) + DEFINES += VERSION_JP=1 VERSION_JP_V10=1 + GRUCODE ?= f3dex_old +else ifeq ($(VERSION),jp.v11) + DEFINES += VERSION_JP=1 VERSION_JP_V11=1 + GRUCODE ?= f3dex_old endif ifeq ($(DEBUG),1) diff --git a/asm/rom_header.s b/asm/rom_header.s index 119f217f32..33612bd6dd 100644 --- a/asm/rom_header.s +++ b/asm/rom_header.s @@ -23,12 +23,27 @@ .ifdef VERSION_EU .ascii "P" /* PAL (Europe) */ -.else +.endif + +.ifdef VERSION_JP +.ascii "J" /* NTSC-J (Japan) */ +.endif + +.ifdef VERSION_US .ascii "E" /* NTSC-U (North America) */ .endif + .ifdef VERSION_EU_V11 +.set REVISION_V11, 1 +.endif + +.ifdef VERSION_JP_V11 +.set REVISION_V11, 1 +.endif + +.ifdef REVISION_V11 .byte 0x01 /* Version */ .else .byte 0x00 /* Version */ -.endif +.endif \ No newline at end of file diff --git a/diff_settings.py b/diff_settings.py index 98e989596a..0afaa5e070 100644 --- a/diff_settings.py +++ b/diff_settings.py @@ -8,6 +8,10 @@ def add_custom_arguments(parser): help="Set version to EU 1.0.") group.add_argument('-eu11', dest='lang', action='store_const', const='eu.v11', help="Set version to EU 1.1.") + group.add_argument('-jp10', dest='lang', action='store_const', const='jp.v10', + help="Set version to JP 1.0.") + group.add_argument('-jp11', dest='lang', action='store_const', const='jp.v11', + help="Set version to JP 1.1.") def apply(config, args): lang = args.lang or 'us' diff --git a/first-diff.py b/first-diff.py index 5731a59f67..c7fd2a9dbf 100755 --- a/first-diff.py +++ b/first-diff.py @@ -34,6 +34,22 @@ const="eu.v11", dest="version", ) +versionGroup.add_argument( + "-j", + "--jp10", + help="use Japanese (1.0) version", + action="store_const", + const="jp.v10", + dest="version", +) +versionGroup.add_argument( + "-J", + "--jp11", + help="use Japanese (1.1) version", + action="store_const", + const="jp.v11", + dest="version", +) parser.add_argument( "-m", "--make", help="run make before finding difference(s)", action="store_true" ) diff --git a/include/PR/abi.h b/include/PR/abi.h index 25cbf9f1cf..2f953b73cb 100644 --- a/include/PR/abi.h +++ b/include/PR/abi.h @@ -42,7 +42,7 @@ #define A_INTERLEAVE 13 #define A_SETLOOP 15 -#if !(defined(VERSION_SH) || defined(VERSION_US) || defined(VERSION_EU)) +#if !(defined(VERSION_SH) || defined(VERSION_US) || defined(VERSION_EU) || defined(VERSION_JP)) #define A_ENVMIXER 3 #define A_LOADBUFF 4 @@ -636,7 +636,7 @@ typedef short ENVMIX_STATE[40]; _a->words.w1 = (uintptr_t) (tr); \ } -#if defined(VERSION_SH) || defined(VERSION_US) || defined(VERSION_EU) +#if defined(VERSION_SH) || defined(VERSION_US) || defined(VERSION_EU) || defined(VERSION_JP) #undef aLoadBuffer #undef aSaveBuffer #undef aMix diff --git a/mk64.jp.v10.sha1 b/mk64.jp.v10.sha1 new file mode 100644 index 0000000000..d764b5c2fe --- /dev/null +++ b/mk64.jp.v10.sha1 @@ -0,0 +1 @@ +afeeec65b9a03f0cb8ec92f9ba7a9f0122e8bd0e build/jp.v10/mk64.jp.v10.z64 diff --git a/mk64.jp.v11.sha1 b/mk64.jp.v11.sha1 new file mode 100644 index 0000000000..b6cb34776c --- /dev/null +++ b/mk64.jp.v11.sha1 @@ -0,0 +1 @@ +9f439457585146a4e1da7e1dd9104f7f94381688 build/jp.v11/mk64.jp.v11.z64 diff --git a/mk64.ld b/mk64.ld index 0fadd36cd6..f76cb99502 100644 --- a/mk64.ld +++ b/mk64.ld @@ -48,6 +48,15 @@ SECTIONS BUILD_DIR/src/main.o(.text*); BUILD_DIR/src/code_800029B0.o(.text*); BUILD_DIR/src/profiler.o(.text*); +#ifdef VERSION_JP // TODO: Arrange these in data, rodata and bss + BUILD_DIR/src/staff_ghosts.o(.text*); + BUILD_DIR/src/camera.o(.text*); + BUILD_DIR/src/cpu_vehicles_camera_path.jp.o(.text*); + BUILD_DIR/src/animation.o(.text*); + BUILD_DIR/src/render_player.o(.text*); + BUILD_DIR/src/crash_screen.o(.text*); + BUILD_DIR/src/kart_dma.o(.text*); +#else BUILD_DIR/src/crash_screen.o(.text*); BUILD_DIR/src/animation.o(.text*); BUILD_DIR/src/staff_ghosts.o(.text*); @@ -56,6 +65,7 @@ SECTIONS BUILD_DIR/src/camera.o(.text*); BUILD_DIR/src/render_player.o(.text*); BUILD_DIR/src/kart_dma.o(.text*); +#endif BUILD_DIR/src/player_controller.o(.text*); BUILD_DIR/src/spawn_players.o(.text*); BUILD_DIR/src/code_8003DC40.o(.text*); diff --git a/src/cpu_vehicles_camera_path/cpu_speed_control.inc.c b/src/cpu_vehicles_camera_path/cpu_speed_control.inc.c index 9dc128351c..2ea6b5d839 100644 --- a/src/cpu_vehicles_camera_path/cpu_speed_control.inc.c +++ b/src/cpu_vehicles_camera_path/cpu_speed_control.inc.c @@ -133,93 +133,114 @@ void regulate_cpu_speed(s32 playerId, f32 targetSpeed, Player* player) { s32 var_a1; speed = player->speed; - if (!(player->effects & 0x80) && !(player->effects & 0x40) && !(player->effects & 0x20000) && - !(player->soundEffects & 0x400000) && !(player->soundEffects & 0x01000000) && !(player->soundEffects & 2) && - !(player->soundEffects & 4)) { - if (gCurrentCourseId == COURSE_AWARD_CEREMONY) { - func_80007FA4(playerId, player, speed); - } else if ((bStopAICrossing[playerId] == true) && !(player->effects & (STAR_EFFECT | BOO_EFFECT))) { - decelerate_player(player, 10.0f); - if (player->currentSpeed == 0.0) { - player->velocity[0] = 0.0f; - player->velocity[2] = 0.0f; + + if (player->effects & 0x80 || player->effects & 0x40 || player->effects & 0x20000) { + return; + } + + if (player->soundEffects & 0x400000 || player->soundEffects & 0x01000000) { + return; + } + + if (player->soundEffects & 2 || player->soundEffects & 4) { + return; + } + + if (gCurrentCourseId == COURSE_AWARD_CEREMONY) { + func_80007FA4(playerId, player, speed); + return; + } + +#ifdef VERSION_JP + check_ai_crossing_distance(playerId); +#endif + + if ((bStopAICrossing[playerId] == true) && !(player->effects & (STAR_EFFECT | BOO_EFFECT))) { +#ifdef VERSION_JP + player->effects &= ~UNKNOWN_EFFECT_0x200000; +#endif + decelerate_player(player, 10.0f); + if (player->currentSpeed == 0.0) { + player->velocity[0] = 0.0f; + player->velocity[2] = 0.0f; + } + } else { + var_f0 = 3.3333333f; + switch (gCCSelection) { /* irregular */ + case CC_100: + case CC_EXTRA: + break; + case CC_50: + var_f0 = 2.5f; + break; + case CC_150: + var_f0 = 3.75f; + break; + } + if (speed < var_f0) { +#ifndef VERSION_JP + player->effects &= ~UNKNOWN_EFFECT_0x200000; +#endif + player_accelerate(player); + } else if (player->type & PLAYER_CINEMATIC_MODE) { + if (speed < targetSpeed) { + player->effects &= ~UNKNOWN_EFFECT_0x200000; + player_accelerate(player); + } else { + player->effects &= ~UNKNOWN_EFFECT_0x200000; + decelerate_player(player, 1.0f); + } + } else if ((D_801631E0[playerId] == true) && (D_80163330[playerId] != 1)) { + if (func_800088D8(playerId, gLapCountByPlayerId[playerId], gGPCurrentRaceRankByPlayerIdDup[playerId]) == + 1) { + player->effects |= UNKNOWN_EFFECT_0x200000; + player_accelerate(player); + } else { + player->effects &= ~UNKNOWN_EFFECT_0x200000; + decelerate_player(player, 1.0f); } } else { - var_f0 = 3.3333333f; - switch (gCCSelection) { /* irregular */ - case CC_100: - case CC_EXTRA: + var_a1 = 1; + switch (gSpeedCPUBehaviour[playerId]) { /* switch 1; irregular */ + case SPEED_cpu_BEHAVIOUR_FAST: /* switch 1 */ + player->effects &= ~UNKNOWN_EFFECT_0x200000; + player_accelerate(player); break; - case CC_50: - var_f0 = 2.5f; + case SPEED_cpu_BEHAVIOUR_MAX: /* switch 1 */ + player->effects |= UNKNOWN_EFFECT_0x200000; + player_accelerate(player); + break; + case SPEED_cpu_BEHAVIOUR_SLOW: /* switch 1 */ + if (((speed / 18.0f) * 216.0f) > 20.0f) { + targetSpeed = 1.6666666f; + } + var_a1 = 0; break; - case CC_150: - var_f0 = 3.75f; + case SPEED_cpu_BEHAVIOUR_NORMAL: /* switch 1 */ + default: /* switch 1 */ + var_a1 = 0; break; } - if (speed < var_f0) { - player->effects &= ~UNKNOWN_EFFECT_0x200000; - player_accelerate(player); - } else if (player->type & PLAYER_CINEMATIC_MODE) { + if (var_a1 != 1) { if (speed < targetSpeed) { - player->effects &= ~UNKNOWN_EFFECT_0x200000; - player_accelerate(player); - } else { - player->effects &= ~UNKNOWN_EFFECT_0x200000; - decelerate_player(player, 1.0f); - } - } else if ((D_801631E0[playerId] == true) && (D_80163330[playerId] != 1)) { - if (func_800088D8(playerId, gLapCountByPlayerId[playerId], gGPCurrentRaceRankByPlayerIdDup[playerId]) == - 1) { - player->effects |= UNKNOWN_EFFECT_0x200000; - player_accelerate(player); - } else { - player->effects &= ~UNKNOWN_EFFECT_0x200000; - decelerate_player(player, 1.0f); - } - } else { - var_a1 = 1; - switch (gSpeedCPUBehaviour[playerId]) { /* switch 1; irregular */ - case SPEED_cpu_BEHAVIOUR_FAST: /* switch 1 */ - player->effects &= ~UNKNOWN_EFFECT_0x200000; + if ((gDemoMode == 1) && (gCurrentCourseId != COURSE_AWARD_CEREMONY)) { player_accelerate(player); - break; - case SPEED_cpu_BEHAVIOUR_MAX: /* switch 1 */ + } else if (D_80163330[playerId] == 1) { + func_80007D04(playerId, player); + } else if (func_800088D8(playerId, gLapCountByPlayerId[playerId], + gGPCurrentRaceRankByPlayerIdDup[playerId]) == true) { player->effects |= UNKNOWN_EFFECT_0x200000; player_accelerate(player); - break; - case SPEED_cpu_BEHAVIOUR_SLOW: /* switch 1 */ - if (((speed / 18.0f) * 216.0f) > 20.0f) { - targetSpeed = 1.6666666f; - } - var_a1 = 0; - break; - case SPEED_cpu_BEHAVIOUR_NORMAL: /* switch 1 */ - default: /* switch 1 */ - var_a1 = 0; - break; - } - if (var_a1 != 1) { - if (speed < targetSpeed) { - if ((gDemoMode == 1) && (gCurrentCourseId != COURSE_AWARD_CEREMONY)) { - player_accelerate(player); - } else if (D_80163330[playerId] == 1) { - func_80007D04(playerId, player); - } else if (func_800088D8(playerId, gLapCountByPlayerId[playerId], - gGPCurrentRaceRankByPlayerIdDup[playerId]) == true) { - player->effects |= UNKNOWN_EFFECT_0x200000; - player_accelerate(player); - } else { - player->effects &= ~UNKNOWN_EFFECT_0x200000; - decelerate_player(player, 1.0f); - } } else { player->effects &= ~UNKNOWN_EFFECT_0x200000; - if (targetSpeed > 1.0f) { - decelerate_player(player, 2.0f); - } else { - decelerate_player(player, 5.0f); - } + decelerate_player(player, 1.0f); + } + } else { + player->effects &= ~UNKNOWN_EFFECT_0x200000; + if (targetSpeed > 1.0f) { + decelerate_player(player, 2.0f); + } else { + decelerate_player(player, 5.0f); } } } diff --git a/src/main.c b/src/main.c index 2309478997..8ff1b280fe 100644 --- a/src/main.c +++ b/src/main.c @@ -219,6 +219,8 @@ void thread1_idle(void* arg) { osCreateViManager(OS_PRIORITY_VIMGR); #ifdef VERSION_EU osViSetMode(&osViModeTable[OS_VI_PAL_LAN1]); +#elif VERSION_JP + osViSetMode(&osViModeTable[OS_VI_NTSC_LAN1]); #else // VERSION_US if (osTvType == TV_TYPE_NTSC) { osViSetMode(&osViModeTable[OS_VI_NTSC_LAN1]); diff --git a/tools/m2ctx b/tools/m2ctx index 61532070b8..ba3c72dc1b 100755 --- a/tools/m2ctx +++ b/tools/m2ctx @@ -18,6 +18,7 @@ CPP_FLAGS = [ "-D__sgi", "-DVERSION_US", "-DVERSION_EU", + "-DVERSION_JP", "-DTARGET_N64", "-D_LANGUAGE_C", "-DF3DEX_GBI",